JavaRush /جاوا بلاگ /Random-UR /ٹیلیگرام بوٹ بطور پہلے پروجیکٹ اور ذاتی تجربے کی بنیاد پر...
Pavel Mironov (Miroha)
سطح
Москва

ٹیلیگرام بوٹ بطور پہلے پروجیکٹ اور ذاتی تجربے کی بنیاد پر پیشہ ورانہ ترقی کے لیے اس کی اہمیت

گروپ میں شائع ہوا۔
سب کو سلام! کچھ اپنے بارے میں بتائیں. میری عمر 24 سال ہے، پچھلے سال ایک ٹیکنیکل یونیورسٹی سے فارغ التحصیل ہوا ہوں اور مجھے ابھی تک کام کا کوئی تجربہ نہیں ہے۔ آگے دیکھتے ہوئے، میں یہ کہنا چاہتا ہوں کہ ابتدائی طور پر، طے شدہ منصوبے میں (2019 کے موسم خزاں میں تیار کیا گیا تھا)، میں نے مارچ-اپریل 2020 میں کام پر جانے کا ارادہ کیا تھا، لیکن بدقسمتی سے، قرنطینہ نے مداخلت کی، اس لیے میں نے سب کچھ وسط تک ملتوی کر دیا۔ -موسم گرما اور مستقبل میں مجھے اپنی کامیابی کی کہانی لکھنے کی امید ہے۔ ٹیلیگرام بوٹ بطور پہلے پروجیکٹ اور ذاتی تجربے کی بنیاد پر پیشہ ورانہ ترقی کے لیے اس کی اہمیت - 1میں کبھی بھی پروگرامنگ کی طرف راغب نہیں ہوا۔ یونیورسٹی میں انہوں نے کافی پروگرامنگ سکھائی، لیکن یہ دستکاری تب مجھے دلچسپی نہیں دے سکی۔ طریقہ کار کی زبانیں (C)، OOP (جاوا) میں ایک سال کا کورس، ڈیٹا بیس، یہاں تک کہ اسمبلر اور C++ بھی تھے۔ لیکن سچ پوچھیں تو، میں عام طور پر مطالعے سے لاتعلق تھا، کیونکہ پڑھائے جانے والے زیادہ تر مضامین میرے لیے بیکار لگتے تھے، جو صرف رپورٹنگ کے مقاصد کے لیے موزوں تھے (اصولی طور پر، ایسا ہی ہے)۔ یونیورسٹی سے فارغ التحصیل ہونے کے بعد، مجھے ایک فیصلہ کرنا پڑا: میں نے کچھ مہارتیں حاصل نہیں کیں، لیکن مجھے کام کرنے کی ضرورت ہے۔ مجھے خود تعلیم کے بارے میں سوچنا پڑا (اوہ، میں نے پہلے ہی کم از کم 2 پورے سال چھوڑ دیا ہے) اور یہ انتخاب فطری طور پر جاوا پر پڑا، کیونکہ یونیورسٹی کے ایک OOP کورس میں لڑکوں میں سے ایک نے جاوارش کورس کی سفارش کی تھی۔ اور وہ، جیسا کہ آپ جانتے ہیں، خاص طور پر جاوا زبان کے لیے وقف ہے۔ مجھے کورس کی پیشکش میں دلچسپی تھی۔ ہاں، مجھے اس وقت پروگرامنگ پسند نہیں تھی، کیونکہ جب مجھے کوئی مشکل پیش آتی تھی تو میں نے فوراً ترک کر دیا تھا، اور پروگرامنگ میں کافی سے زیادہ مشکلات ہیں۔ لیکن ایک ہی وقت میں، میں نے محسوس کیا کہ میں کوڈ لکھنا چاہتا ہوں، لہذا آخر میں میں نے پروگرامنگ میں جانے کا فیصلہ کیا۔ میں آپ کو جاوارش کے ساتھ اپنے تجربے کے بارے میں مختصراً بتاؤں گا۔ میں نے اگست 2019 میں آغاز کیا، فوری طور پر ایک ماہ کے لیے سبسکرپشن خریدا، لیکن سطح 7 پر مجھے احساس ہوا کہ کام مشکل تھے۔ میں نے کورس کو ایک طرف رکھا اور شیلڈ کو اٹھایا۔ تو متوازی طور پر میں نے 3 ماہ کا کورس مکمل کیا۔ میں 20 کی سطح پر پہنچ گیا (یہ میرا دوسرا اکاؤنٹ ہے)، Schildt کو تقریباً مکمل طور پر پڑھا، پھر یہاں کے کاموں سے تھک گیا، جس میں میں نے اپنے لیے عملی فوائد دیکھنا چھوڑ دیا۔ میں کوڈ وارز، لیٹ کوڈ پر گیا، اور ویڈیو کورسز دیکھنا شروع کر دیا۔ ویسے، میں 3 ماہ میں "اوہ نہیں، ایک صف کیا ہے؟ اس کے ساتھ کیسے کام کرنا ہے اور یہ اتنا خوفناک کیوں ہے" سے چلا گیا؟ جمع کرنے کی کلاسوں کے سورس کوڈ (ArrayList، HashMap، وغیرہ) کے تفصیلی مطالعہ کے لیے۔ ذاتی تجربے کی بنیاد پر، میں شروع کرنے والوں کو بتاؤں گا: یہاں سب سے اہم چیز اس احساس پر قابو پانا ہے جو آپ کو کچھ سمجھ نہیں آتا اور کچھ حل نہیں کر پاتے۔ جب یہ پیدا ہوتا ہے، آپ صرف سب کچھ چھوڑ دینا چاہتے ہیں اور ایسا لگتا ہے کہ آپ اس معاملے کے لئے بہت بیوقوف ہیں. اگر آپ اپنے اندر ایسے لمحات پر قابو پا لیں اور ذہنی طور پر آرام کریں تو کامیابی ضرور ملے گی۔ میرے خیال میں بہت سے لوگ اس کا مقابلہ نہیں کر سکتے، اس لیے وہ اس طرح کی کوششوں کو جلد ترک کر دیتے ہیں۔ نتیجے کے طور پر، دسمبر 2019 میں میں نے اپنے پروجیکٹ کے بارے میں سوچنا شروع کیا۔ میں نے ٹیلیگرام بوٹ کا انتخاب کرنے کا فیصلہ کیا، لیکن کوئی اندازہ نہیں تھا۔ اسی وقت، ایک دوست کو ٹیلیگرام میں اپنے گروپ کے لیے فعالیت کی ضرورت تھی، جسے وہ خودکار کرنا چاہیں گے۔ وہ صرف اس بات سے واقف تھا کہ میں گہرائی سے پروگرامنگ کا مطالعہ کر رہا ہوں اور اس نے مجھے ایک پروجیکٹ کی پیشکش کی۔ میرے لیے، تجربے اور مستقبل کے تجربے کے لیے، اس کے لیے، گروپ کی ترقی کے لیے۔ یہاں تک کہ میں اپنے آپ کو اس کے خیال کا حوالہ دینے کی اجازت دوں گا: "Недавно софтину хотел у программиста заказать, которая загружала бы в выбранное Облако файлы по прямым linkм. Это интересно, так How аналогов нет. И просто очень удобно. Суть: копируешь ссылку, вставляешь в окно и выбираешь нужное Облако (GDrive, Mail, Яндекс Диск и т.п), в своё время софт всё делает на стороне serverа и юзеру ничего не нужно загружать на свою машину (особенно круто, когда у тебя сборка на SSD-накопителях). Думали сделать в web-интерфейсе, чтобы можно было запускать How с телефонов, так и с десктопа... Можно в принципе через приложение реализовать, а не через web-интерфейс. Тебе такое по силам?"میں نے کام کرنا شروع کر دیا، لیکن آخر میں، چند دنوں کے بعد، میں نے محسوس کیا کہ ہمارے لیے کچھ بھی کام نہیں کرے گا، جس کی بڑی وجہ علم کی کمی ہے۔ ایک API نہیں ہے۔ GDrive کے ذریعے کچھ جمع کرنے کی کوشش کی گئی تھی، لیکن عمل درآمد لنگڑا تھا، نیز یہ کلاؤڈ سروس "کسٹمر" کے مطابق نہیں تھی۔ .ru، جس کا کوئی حل نہیں ملا۔ کسی نہ کسی طرح یہ سب مہنگا نکلا، ڈیٹا بیس کو جوڑنا، سٹوریج کے لیے سرور استعمال کرنا وغیرہ ضروری تھا۔ ویسے، اسے اب بھی اس ویب ایپلیکیشن کی ضرورت ہے۔ ہمارے لیے کام نہیں کرتے، میں نے ایک انفارمیشن بوٹ بنانے کا فیصلہ کیا۔ اسے گوگل پلے سٹور سے گیم کے لنکس وصول کرنا، لنک کو پارس کرنا اور موصول ہونے والی معلومات کو لائبریری میں محفوظ کرنا، اور پھر اسے json فائل میں لکھنا چاہیے۔ اس طرح، ہر درخواست کے ساتھ، صارفین کی کوششوں کی بدولت لائبریری میں توسیع ہو سکتی ہے۔مستقبل میں آپ گوگل پلے پر جا کر گیم کے بارے میں معلومات آسان شکل میں حاصل نہیں کر سکتے۔ آپ صرف کمانڈ لکھیں /libraryHere_game_name اور اپنی ضرورت کی ہر چیز حاصل کریں۔ لیکن کئی مشکلات ہیں جن کے بارے میں میں آپ کو بعد میں بتاؤں گا۔ پہلے میں نے آہستہ آہستہ ترقی کی، کیونکہ میں نے ایک ہی وقت میں دو ایس کیو ایل کورسز کرنا شروع کر دیے۔ میں صرف یہ نہیں سمجھ سکا کہ بوٹ نے بالکل کیسے کام کیا اور درخواستوں پر کارروائی کیسے کی جائے۔ میری ملاقات ایک دوست سے ہوئی جو اس منصوبے پر کام کرنے میں بھی دلچسپی رکھتا تھا۔ بوٹ کا پہلا ورژن تقریباً ایک ماہ میں تیار ہو گیا تھا، لیکن ایک دوست کے ساتھ (میری طرف سے) اختلاف پیدا ہو گیا۔ میں نے بوٹ کا وہ حصہ لیا جو پارس کرنے کا ذمہ دار ہے، اور اس نے براہ راست بوٹ کی درخواستوں اور ان کی پروسیسنگ پر کام کیا۔ کسی وجہ سے، اس نے بوٹ کو پیچیدہ کرنا شروع کیا، کسی قسم کی اجازت متعارف کروائی، ایڈمنز ایجاد کیں، غیر ضروری فعالیت شامل کیں، اس کے علاوہ مجھے اس کا کوڈنگ اسٹائل واقعی پسند نہیں آیا۔ میری رائے میں، معلوماتی بوٹ میں یہ ضروری نہیں تھا۔ لہذا میں نے فیصلہ کیا کہ میں شروع سے ہی ایک بوٹ لکھوں گا جس کی مجھے ضرورت ہے۔ اب میں آپ کو بتاؤں گا کہ بوٹ اصل میں کیا کرتا ہے (پروجیکٹ کوڈ کی مثال استعمال کرتے ہوئے)۔ میں مضمون کے آخر میں پروجیکٹ کا مکمل کوڈ منسلک کروں گا اور بدقسمتی سے میں اس پر مکمل تبصرہ نہیں کر سکوں گا۔ بوٹ کو بھیجے گئے صارف کا کوئی بھی پیغام اپ ڈیٹ کلاس کا ایک مقصد ہے۔ اس میں بہت ساری معلومات (میسج آئی ڈی، چیٹ آئی ڈی، یونیک یوزر آئی ڈی، وغیرہ) شامل ہیں۔ اپ ڈیٹ کی کئی قسمیں ہیں: یہ ٹیکسٹ میسج ہو سکتا ہے، یہ ٹیلیگرام کی بورڈ (کال بیک)، تصویر، آڈیو وغیرہ کا جواب ہو سکتا ہے۔ صارف کو بہت زیادہ گڑبڑ سے روکنے کے لیے، میں کی بورڈ سے صرف ٹیکسٹ درخواستوں اور کال بیکس پر کارروائی کرتا ہوں۔ اگر صارف تصویر بھیجتا ہے تو بوٹ اسے مطلع کرے گا کہ وہ اس کے ساتھ کچھ کرنے کا ارادہ نہیں رکھتا۔ مین بوٹ کلاس میں، onUpdateReceived طریقہ میں، بوٹ کو ایک اپ ڈیٹ ملتا ہے۔
@Override
    public void onUpdateReceived(Update update) {
        UpdatesReceiver.handleUpdates(update);
    }
جسے میں ہینڈلر کو دیتا ہوں (اپنی اپڈیٹس ریسیور کلاس):
public static void handleUpdates(Update update) {
        ...
        if (update.hasMessage() && update.getMessage().hasText()){
            log.info("[Update (id {}) типа \"Текстовое сообщение\"]", update.getUpdateId());
            new TextMessageHandler(update, replyGenerator).handleTextMessage();
        }
        else if (update.hasCallbackQuery()) {
            //логгирование
            new CallbackQueryHandler(update, replyGenerator).handleCallBackQuery();
        }
        else {
           //логгирование
            replyGenerator.sendTextMessage(update.getMessage().getChatId(), "Я могу принимать только текстовые messages!");
        }
    }
UpdatesReceiver ایک مرکزی ہینڈلر ہے جو، اپ ڈیٹ کی قسم پر منحصر ہے، کنٹرول کو دوسرے خصوصی ہینڈلر کو منتقل کرتا ہے: TextMessageHandler یا CallbackQueryHandler، جس کے کنسٹرکٹرز کو میں سلسلہ کے نیچے اپ ڈیٹ کرتا ہوں۔ بوٹ کے ساتھ کام کرتے وقت اپ ڈیٹ سب سے اہم چیز ہے اور اسے ضائع نہیں کیا جا سکتا، کیونکہ اپ ڈیٹ میں محفوظ معلومات کی مدد سے ہم یہ معلوم کرتے ہیں کہ کس صارف کو اور کس چیٹ کو جواب بھیجا جانا چاہیے۔ صارف کے جوابات پیدا کرنے کے لیے، میں نے ایک الگ کلاس لکھی۔ یہ باقاعدہ ٹیکسٹ میسج، ان لائن کی بورڈ کے ساتھ پیغام، تصویر کے ساتھ پیغام اور جوابی کی بورڈ کے ساتھ پیغام بھیج سکتا ہے۔ ایک ان لائن کی بورڈ اس طرح نظر آتا ہے: ٹیلیگرام بوٹ بطور پہلے پروجیکٹ اور ذاتی تجربے کی بنیاد پر پیشہ ورانہ ترقی کے لیے اس کی اہمیت - 1یہ ان بٹنوں کی وضاحت کرتا ہے جن پر کلک کرنے سے، صارف سرور کو کال بیک بھیجتا ہے، جس پر تقریباً اسی طرح عمل کیا جا سکتا ہے جیسے کہ عام پیغامات۔ اسے "برقرار رکھنے" کے لیے آپ کو اپنے ہینڈلر کی ضرورت ہے۔ ہم ہر بٹن کے لیے ایک ایکشن سیٹ کرتے ہیں، جسے پھر اپ ڈیٹ آبجیکٹ پر لکھا جاتا ہے۔ وہ. "لاگت" بٹن کے لیے ہم کال بیک کے لیے تفصیل "/قیمت" سیٹ کرتے ہیں، جسے ہم بعد میں اپ ڈیٹ سے حاصل کر سکتے ہیں۔ اگلا، ایک الگ کلاس میں، میں پہلے ہی اس کال بیک پر کارروائی کر سکتا ہوں:
public void handleCallBackQuery() {
  String call_data = update.getCallbackQuery().getData();
  long message_id = update.getCallbackQuery().getMessage().getMessageId();
  long chat_id = update.getCallbackQuery().getMessage().getChatId();
    switch (call_date){
      case "/price" :
        //тут что-то сделать
        break;
...
جوابی کی بورڈ اس طرح لگتا ہے: ٹیلیگرام بوٹ بطور پہلے پروجیکٹ اور ذاتی تجربے کی بنیاد پر پیشہ ورانہ ترقی کے لیے اس کی اہمیت - 2اور جوہر میں، یہ صارف کی ٹائپنگ کی جگہ لے لیتا ہے۔ "لائبریری" بٹن پر کلک کرنے سے بوٹ کو فوری طور پر "لائبریری" کا پیغام بھیج دیا جائے گا۔ ہر قسم کے کی بورڈ کے لیے، میں نے بلڈر پیٹرن کو نافذ کرتے ہوئے اپنی کلاس لکھی: inline اور جواب ۔ نتیجے کے طور پر، آپ اپنی ضروریات کے مطابق مطلوبہ کی بورڈ کو بنیادی طور پر "ڈرا" کر سکتے ہیں۔ یہ بہت آسان ہے، کیونکہ کی بورڈ مختلف ہو سکتے ہیں، لیکن اصول ایک ہی رہتا ہے۔ ان لائن کی بورڈ کے ساتھ پیغام بھیجنے کا ایک بدیہی طریقہ یہ ہے:
public synchronized void sendInlineKeyboardMessage(long chat_id, String gameTitle) {
        SendMessage keyboard = InlineKeyboardMarkupBuilder.create(chat_id)
                .setText("Вы может узнать следующую информацию об игре " + gameTitle)
                .row()
                .button("Стоимость " + "\uD83D\uDCB0", "/price " + gameTitle)
                .button("Обновлено " + "\uD83D\uDDD3", "/updated " + gameTitle)
                .button("Версия " + "\uD83D\uDEE0", "/version " + gameTitle)
                .endRow()
                .row()
                .button("Требования " + "\uD83D\uDCF5", "/requirements " + gameTitle)
                .button("Покупки " + "\uD83D\uDED2", "/iap " + gameTitle)
                .button("Размер " + "\uD83D\uDD0E", "/size " + gameTitle)
                .endRow()
                .row()
                .button("Получить всю информацию об игре" + "\uD83D\uDD79", "/all " + gameTitle)
                .endRow()
                .row()
                .button("Скрыть клавиатуру", "close")
                .endRow()
                .build();
        try {
            execute(keyboard);
        } catch (TelegramApiException e) {
            log.error("[Не удалось отправить сообщение с -inline- клавиатурой]: {}", e.getMessage());
        }
    }
بوٹ کو سخت فعالیت دینے کے لیے، سلیش کریکٹر کا استعمال کرتے ہوئے خصوصی کمانڈز ایجاد کی گئیں: /library، /help، /game، وغیرہ۔ بصورت دیگر، ہمیں کسی بھی ردی کی ٹوکری پر کارروائی کرنی پڑے گی جسے صارف لکھ سکتا ہے۔ دراصل، یہی ہے جس کے لیے MessageHandler لکھا گیا تھا:
if (message.equals(ChatCommands.START.getDescription())) {
     replyGenerator.sendTextMessage(chat_id, new StartMessageHandler().reply());
     replyGenerator.sendReplyKeyboardMessage(chat_id);
}
else if (message.equals(ChatCommands.HELP.getDescription())
             || message.equalsIgnoreCase("Помощь")) {
      replyGenerator.sendTextMessage(chat_id, new HelpMessageHandler().reply());
}
 ...
اس طرح، اس بات پر منحصر ہے کہ آپ بوٹ کو کیا کمانڈ بھیجتے ہیں، اس کام میں ایک خاص ہینڈلر شامل کیا جائے گا۔ آئیے مزید آگے بڑھتے ہیں اور تجزیہ کار اور لائبریری کے کام کو دیکھتے ہیں۔ اگر آپ بوٹ کو گوگل پلے اسٹور میں کسی گیم کا لنک بھیجتے ہیں تو ایک خصوصی ہینڈلر خود بخود کام کرے گا ۔ جواب میں، صارف کو گیم کے بارے میں درج ذیل شکل میں معلومات موصول ہوں گی: ٹیلیگرام بوٹ بطور پہلے پروجیکٹ اور ذاتی تجربے کی بنیاد پر پیشہ ورانہ ترقی کے لیے اس کی اہمیت - 3ساتھ ہی، ایک طریقہ بھی کہا جائے گا جو گیم کو بوٹ کی لائبریری میں شامل کرنے کی کوشش کرے گا (پہلے مقامی نقشے پر، پھر -> json فائل )۔ اگر گیم پہلے سے ہی لائبریری میں ہے، تو پھر ایک چیک کیا جائے گا (جیسا کہ ایک باقاعدہ ہیش میپ میں ہے)، اور اگر فیلڈ ڈیٹا (مثال کے طور پر، ورژن نمبر بدل گیا ہے)، تو لائبریری میں موجود گیم کو اوور رائٹ کر دیا جائے گا۔ اگر کوئی تبدیلیاں نہیں پائی جاتی ہیں، تو کوئی اندراج نہیں کیا جائے گا۔ اگر لائبریری میں بالکل بھی کوئی گیم نہیں تھی، تو اسے پہلے مقامی نقشے پر لکھا جاتا ہے (ایک چیز جیسے tyk )، اور پھر json فائل میں لکھا جاتا ہے، کیونکہ اگر سرور پر ایپلیکیشن غیر متوقع طور پر بند ہو جاتی ہے، تو ڈیٹا کھو گیا، لیکن اسے ہمیشہ فائل کا استعمال کرتے ہوئے پڑھا جا سکتا ہے۔ دراصل، جب پروگرام شروع ہوتا ہے، لائبریری ہمیشہ پہلی بار کسی سٹیٹک بلاک سے فائل سے لوڈ ہوتی ہے۔
static {
        TypeFactory typeFactory = mapper.getTypeFactory();
        MapType mapType = typeFactory.constructMapType(ConcurrentSkipListMap.class, String.class, GooglePlayGame.class);

        try {
            Path path = Paths.get(LIBRARY_PATH);
            if (!Files.exists(path)) {
                Files.createDirectories(path.getParent());
                Files.createFile(path);
                log.info("[Файл библиотеки создан]");
            }
            else {
                ConcurrentMap<string, googleplaygame=""> temporary = mapper.readValue(new File(LIBRARY_PATH), mapType);
                games.putAll(temporary);
                log.info("[Количество игр в загруженной библиотеке] = " + games.size());
            }
        }
        catch (IOException e) {
            log.error("[Ошибка при чтении/записи file] {}", e.getMessage());
        }
    }
یہاں آپ کو اضافی طور پر فائل سے ڈیٹا کو ایک عارضی نقشے میں پڑھنا پڑتا ہے، جسے پھر ایک مکمل نقشے میں "کاپی" کر دیا جاتا ہے تاکہ فائل میں گیم کی تلاش کے دوران کیس کی حساسیت کو برقرار رکھا جا سکے (tITan QuEST لکھ کر، بوٹ پھر بھی تلاش کرے گا۔ لائبریری میں کھیل ٹائٹن کویسٹ)۔ دوسرا حل تلاش کرنا ممکن نہیں تھا، یہ جیکسن کا استعمال کرتے ہوئے ڈی سیریلائزیشن کی خصوصیات ہیں۔ لہذا، لنک کی ہر درخواست کے ساتھ، اگر ممکن ہو تو گیم کو لائبریری میں شامل کیا جاتا ہے، اور اس طرح لائبریری پھیل جاتی ہے۔ کسی مخصوص گیم کے بارے میں مزید معلومات /libraryGame_Name کمانڈ کا استعمال کرکے حاصل کی جاسکتی ہیں ۔ آپ ایک مخصوص پیرامیٹر (مثال کے طور پر موجودہ ورژن) اور تمام پیرامیٹرز کو ایک ساتھ تلاش کر سکتے ہیں۔ یہ ان لائن کی بورڈ کا استعمال کرتے ہوئے لاگو کیا جاتا ہے، جس پر پہلے بات کی گئی تھی۔ کام کے دوران، میں نے مسائل کو حل کرتے ہوئے یہاں حاصل کی گئی مہارتوں کو بھی بروئے کار لایا۔ مثال کے طور پر، لائبریری میں واقع بے ترتیب گیمز کے ناموں کی فہرست (آپشن /library کمانڈ کا استعمال کرتے ہوئے دستیاب ہے):
private String getRandomTitles(){
        if (LibraryService.getLibrary().size() < 10){
            return String.join("\n", LibraryService.getLibrary().keySet());
        }
        List<string> keys = new ArrayList<>(LibraryService.getLibrary().keySet());
        Collections.shuffle(keys);
        List<string> randomKeys = keys.subList(0, 10);
        return String.join("\n", randomKeys);
    }
بوٹ پروسیس کیسے لنک کرتا ہے؟ یہ انہیں چیک کرتا ہے کہ آیا وہ گوگل پلے (میزبان، پروٹوکول، پورٹ) سے تعلق رکھتے ہیں:
private static class GooglePlayCorrectURL {

        private static final String VALID_HOST = "play.google.com";

        private static final String VALID_PROTOCOL = "https";

        private static final int VALID_PORT = -1;

        private static boolean isLinkValid(URI link) {
            return (isHostExist(link) && isProtocolExist(link) && link.getPort() == VALID_PORT);
        }

        private static boolean isProtocolExist(URI link) {
            if (link.getScheme() != null) {
                return link.getScheme().equals(VALID_PROTOCOL);
            }
            else {
                return false;
            }
        }

        private static boolean isHostExist(URI link) {
            if (link.getHost() != null) {
                return link.getHost().equals(VALID_HOST);
            }
            else {
                return false;
            }
        }
اگر سب کچھ ترتیب میں ہے، تو بوٹ Jsoup لائبریری کا استعمال کرتے ہوئے ایک لنک کے ذریعے جڑتا ہے، جو آپ کو صفحہ کا HTML کوڈ حاصل کرنے کی اجازت دیتا ہے، جو مزید تجزیہ اور تجزیہ سے مشروط ہے۔ آپ کسی غلط یا نقصان دہ لنک سے بوٹ کو بیوقوف نہیں بنا سکیں گے۔
if (GooglePlayCorrectURL.isLinkValid(link)){
     if (!link.getPath().contains("apps")){
         throw new InvalidGooglePlayLinkException("К сожалению, бот работает исключительно с играми. Введите другую ссылку.");
     }
     URL = forceToRusLocalization(URL);
     document = Jsoup.connect(URL).get();
 }
     else {
         throw new NotGooglePlayLinkException();
      }
...
یہاں ہمیں علاقائی ترتیبات کے ساتھ ایک مسئلہ حل کرنا تھا۔ بوٹ یورپ میں واقع سرور سے گوگل پلے اسٹور سے جڑتا ہے، اس لیے گوگل پلے اسٹور میں صفحہ مناسب زبان میں کھلتا ہے۔ مجھے ایک بیساکھی لکھنی پڑی جو صفحہ کے روسی ورژن پر زبردستی "ری ڈائریکٹ" کرتی ہے (اس منصوبے کا مقصد ہمارے سامعین کے لیے تھا)۔ ایسا کرنے کے لیے، لنک کے آخر میں آپ کو گوگل پلے سرور پر GET کی درخواست میں hl: &hl=ru پیرامیٹر کو احتیاط سے شامل کرنے کی ضرورت ہے ۔
private String forceToRusLocalization(String URL) {
        if (URL.endsWith("&hl=ru")){
            return URL;
        }
        else {
            if (URL.contains("&hl=")){
                URL = URL.replace(
                        URL.substring(URL.length()-"&hl=ru".length()), "&hl=ru");
            }
            else {
                URL += "&hl=ru";
            }
        }
        return URL;
    }
کامیاب کنکشن کے بعد، ہمیں ایک HTML دستاویز موصول ہوتی ہے جو تجزیہ اور تجزیہ کے لیے تیار ہوتی ہے، لیکن یہ اس مضمون کے دائرہ کار سے باہر ہے۔ پارسر کوڈ یہاں ہے ۔ تجزیہ کار خود ضروری معلومات حاصل کرتا ہے اور گیم کے ساتھ ایک آبجیکٹ بناتا ہے، جسے بعد میں ضرورت پڑنے پر لائبریری میں شامل کر دیا جاتا ہے۔ <h2>خلاصہ کرنے کے لیے</h2>بوٹ کئی کمانڈز کو سپورٹ کرتا ہے جن میں مخصوص فعالیت ہوتی ہے۔ یہ صارف سے پیغامات وصول کرتا ہے اور انہیں اس کے حکموں سے ملاتا ہے۔ اگر یہ لنک ہے یا /گیم + لنک کمانڈ، تو یہ اس لنک کو چیک کرتا ہے کہ آیا یہ گوگل پلے سے تعلق رکھتا ہے۔ اگر لنک درست ہے، تو یہ Jsoup کے ذریعے جڑتا ہے اور HTML دستاویز وصول کرتا ہے۔ اس دستاویز کا تجزیہ تحریری تجزیہ کار کی بنیاد پر کیا گیا ہے۔ گیم کے بارے میں ضروری معلومات کو دستاویز سے نکالا جاتا ہے، اور پھر گیم والی چیز اس ڈیٹا سے بھر جاتی ہے۔ اس کے بعد، گیم کے ساتھ آبجیکٹ کو مقامی اسٹوریج میں رکھا جاتا ہے (اگر گیم ابھی موجود نہیں ہے) اور ڈیٹا کے نقصان سے بچنے کے لیے فوری طور پر ایک فائل پر لکھا جاتا ہے۔ لائبریری میں ریکارڈ کردہ گیم (گیم کا نام نقشے کی کلید ہے، گیم کے ساتھ آبجیکٹ نقشہ کی قدر ہے) کمانڈ /library Game_name کا استعمال کرتے ہوئے حاصل کیا جا سکتا ہے۔ اگر مخصوص گیم بوٹ کی لائبریری میں پائی جاتی ہے، تو صارف کو ایک ان لائن کی بورڈ واپس کر دیا جائے گا، جس سے وہ گیم کے بارے میں معلومات حاصل کر سکتا ہے۔ اگر گیم نہیں ملتی ہے، تو آپ کو یا تو یقینی بنانا ہوگا کہ نام کی ہجے درست ہے (اسے گوگل پلے اسٹور میں گیم کے نام سے مکمل طور پر مماثل ہونا چاہیے، سوائے کیس کے)، یا بوٹ بھیج کر گیم کو لائبریری میں شامل کریں۔ گیم کا لنک۔ میں نے بوٹ کو ہیروکو پر تعینات کیا اور ان لوگوں کے لیے جو مستقبل میں اپنا بوٹ لکھنے اور اسے ہیروکو پر مفت میں میزبانی کرنے کا ارادہ رکھتے ہیں، میں آپ کو درپیش مشکلات کو حل کرنے کے لیے چند تجاویز پیش کروں گا (چونکہ میں نے خود ان کا سامنا کیا ہے)۔ بدقسمتی سے، ہیروکو کی نوعیت کی وجہ سے، بوٹ لائبریری ہر 24 گھنٹے میں ایک بار مسلسل "ری سیٹ" ہوتی ہے۔ میرا منصوبہ ہیروکو سرورز پر فائلوں کو ذخیرہ کرنے کی حمایت نہیں کرتا ہے، لہذا یہ صرف گیتھب سے میری گیم فائل کو کھینچتا ہے۔ اس کے کئی حل تھے: ڈیٹا بیس کا استعمال کریں، یا کوئی اور سرور تلاش کریں جو اس فائل کو گیم کے ساتھ اسٹور کرے۔ میں نے ابھی کچھ نہ کرنے کا فیصلہ کیا، کیونکہ بنیادی طور پر بوٹ اتنا مفید نہیں ہے۔ مجھے ایک مکمل تجربہ حاصل کرنے کے بجائے اس کی ضرورت تھی، جو بنیادی طور پر میں نے حاصل کیا۔ لہذا، ہیروکو کے لیے سفارشات:
  1. اگر آپ روس میں رہتے ہیں تو آپ کو VPN کا استعمال کرتے ہوئے ہیروکو پر رجسٹر ہونا پڑے گا۔

  2. پروجیکٹ کی جڑ میں آپ کو بغیر کسی توسیع کے فائل ڈالنے کی ضرورت ہے جسے Procfile کہتے ہیں۔ اس کا مواد اس طرح ہونا چاہئے: https://github.com/miroha/Telegram-Bot/blob/master/Procfile

  3. pom.xml میں، مثال کے مطابق درج ذیل لائنیں شامل کریں ، جہاں mainClass ٹیگ میں کلاس کے راستے کی نشاندہی کرتا ہے جس میں بنیادی طریقہ ہے: bot.BotApplication (اگر BotApplication کلاس بوٹ فولڈر میں ہے)۔

  4. ایم وی این پیکیج کمانڈز وغیرہ کا استعمال کرتے ہوئے کوئی پروجیکٹ نہ بنائیں، ہیروکو آپ کے لیے سب کچھ جمع کردے گا۔

  5. اس منصوبے میں ایک gitignore شامل کرنے کا مشورہ دیا جاتا ہے، مثال کے طور پر:

    # Log file
    *.log
    
    # Compiled resources
    target
    
    # Tests
    test
    
    # IDEA files
    .idea
    *.iml
  6. دراصل پروجیکٹ کو گیتھب پر اپ لوڈ کریں، اور پھر ریپوزٹری کو ہیروکو سے جوڑیں (یا دوسرے طریقے استعمال کریں، ان میں سے 3 ہیں، اگر میں غلط نہیں ہوں)۔

  7. اگر ڈاؤن لوڈ کامیاب رہا ("تعمیر کامیاب")، تو یقینی بنائیں کہ کنفیگر ڈائنوس پر جائیں:

    ٹیلیگرام بوٹ بطور پہلے پروجیکٹ اور ذاتی تجربے کی بنیاد پر پیشہ ورانہ ترقی کے لیے اس کی اہمیت - 4

    اور سلائیڈر کو سوئچ کریں، اور پھر اس بات کو یقینی بنائیں کہ یہ آن پوزیشن میں ہے (اس حقیقت کی وجہ سے کہ میں نے ایسا نہیں کیا، میرا بوٹ کام نہیں کیا اور میں نے کچھ دنوں تک اپنے دماغ کو ریک کیا اور بہت سی غیر ضروری حرکتیں کیں )۔

  8. گیتھب پر بوٹ ٹوکن چھپائیں۔ ایسا کرنے کے لیے، آپ کو ماحولیاتی متغیر سے ٹوکن حاصل کرنے کی ضرورت ہے:

    public class Bot extends TelegramLongPollingBot {
    
        private static final String BOT_TOKEN = System.getenv("TOKEN");
    
        @Override
        public String getBotToken() {
            return BOT_TOKEN;
        }
    ...
    }

    اور پھر بوٹ کو تعینات کرنے کے بعد، اس متغیر کو ہیروکو ڈیش بورڈ میں سیٹنگز ٹیب میں سیٹ کریں (ٹوکن کے دائیں جانب ایک VALUE فیلڈ ہوگی، وہاں اپنے بوٹ کا ٹوکن کاپی کریں):

    ٹیلیگرام بوٹ بطور پہلے پروجیکٹ اور ذاتی تجربے کی بنیاد پر پیشہ ورانہ ترقی کے لیے اس کی اہمیت - 5
مجموعی طور پر، میرے اپنے پروجیکٹ پر کام کرنے کے 2 ماہ میں:
  • جاوا میں لکھا ہوا مکمل طور پر کام کرنے والا پروجیکٹ موصول ہوا؛
  • تھرڈ پارٹی API (ٹیلیگرام بوٹ API) کے ساتھ کام کرنا سیکھا؛
  • عملی طور پر، میں نے سیریلائزیشن کی گہرائی تک رسائی حاصل کی، JSON اور Jackson لائبریری کے ساتھ بہت کام کیا (شروع میں میں نے GSON استعمال کیا، لیکن اس میں مسائل تھے)؛
  • فائلوں کے ساتھ کام کرتے وقت اپنی صلاحیتوں کو مضبوط کیا، جاوا این آئی او سے واقف ہوا؛
  • میں نے کنفیگریشن .xml فائلوں کے ساتھ کام کرنا سیکھا اور خود کو لاگنگ کرنے کا عادی بنایا۔
  • ترقیاتی ماحول (IDEA) میں بہتر مہارت؛
  • git کے ساتھ کام کرنا سیکھا اور gitignore کی قدر سیکھی۔
  • ویب پیج پارسنگ (Jsoup لائبریری) میں مہارت حاصل کی؛
  • کئی ڈیزائن پیٹرن سیکھے اور استعمال کیے؛
  • کوڈ (ری فیکٹرنگ) کو بہتر بنانے کا احساس اور خواہش پیدا کی؛
  • میں نے آن لائن حل تلاش کرنا سیکھا اور ایسے سوالات پوچھنے میں شرم محسوس نہ کرنا جن کا مجھے جواب نہیں مل سکا۔
ٹیلیگرام بوٹ بطور پہلے پروجیکٹ اور ذاتی تجربے کی بنیاد پر پیشہ ورانہ ترقی کے لیے اس کی اہمیت - 7میں نہیں جانتا کہ بوٹ کتنا مفید یا بیکار نکلا، یا کوڈ کتنا خوبصورت/بدصورت تھا، لیکن مجھے جو تجربہ ملا وہ یقیناً قابل قدر تھا۔ میں نے اپنے پروجیکٹ کے لیے ذمہ داری کا احساس محسوس کیا۔ ہر وقت اور پھر میں اسے بہتر کرنا چاہتا ہوں، کچھ نیا شامل کرنا چاہتا ہوں۔ جب میں اسے چلانے کے قابل تھا اور دیکھتا ہوں کہ سب کچھ میری مرضی کے مطابق کام کرتا ہے، یہ ایک حقیقی سنسنی تھی۔ کیا یہ بنیادی بات نہیں ہے؟ آپ جو کچھ کرتے ہیں اس سے لطف اٹھائیں اور آخری چاکلیٹ بار کی طرح کوڈ کی ہر ورکنگ لائن سے لطف اٹھائیں۔ لہذا، اگر آپ پروگرامنگ میں مہارت حاصل کر رہے ہیں، تو میرا آپ کو مشورہ: 40 کے درجے تک یہاں نہ ٹھہریں، بلکہ جلد از جلد اپنا پروجیکٹ شروع کریں۔ اگر کوئی دلچسپی رکھتا ہے تو، پروجیکٹ کا سورس کوڈ یہاں ہے (بہار کے لیے دوبارہ لکھا گیا): https://github.com/miroha/GooglePlayGames-TelegramBot پچھلے دو مہینوں سے میں مشکل سے نئے مواد کا مطالعہ کر رہا ہوں، کیونکہ یہ مجھے لگتا ہے کہ میں آخری حد تک پہنچ گیا ہوں۔ کام کے بغیر، میں اب یہ نہیں دیکھ سکتا کہ کہاں ترقی کرنی ہے، سوائے اسپرنگ فریم ورک کو سکھانے کے، جو میں اگلے مہینے میں کرنے کا ارادہ رکھتا ہوں۔ اور پھر میں اس فریم ورک کا استعمال کرتے ہوئے بوٹ کو "دوبارہ لکھنے" کی کوشش کروں گا۔ کسی بھی سوال کا جواب دینے کے لیے تیار ہیں۔ :) ہرکسی کی قسمت اچھی ہو! 07/07/2020 سے اپ ڈیٹ خالص جاوا میں بوٹ کے ساتھ ذخیرہ گم ہو گیا تھا (میں نے اسے حذف کر دیا، ایک کاپی دوسری مقامی مشین پر رہ گئی)، لیکن میں نے اسپرنگ بوٹ کے لیے دوبارہ لکھا ہوا بوٹ ڈاؤن لوڈ کیا: https://github.com/miroha /GooglePlayGames-TelegramBot
تبصرے
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION