JavaRush /جاوا بلاگ /Random-UR /ٹیلیگرام بوٹ - جاوا میں ویب ہُک کے ذریعے یاد دہانی یا گوگ...

ٹیلیگرام بوٹ - جاوا میں ویب ہُک کے ذریعے یاد دہانی یا گوگل کیلنڈر کو نہ کہیں! حصہ 2

گروپ میں شائع ہوا۔
پروجیکٹ کا دوسرا حصہ - یہاں پہلے کا ایک لنک ہے: اور اسی طرح BotState کلاس : ہمارے بوٹ کو یہ سمجھنے کے لیے کہ وقت کے ایک خاص موڑ پر اس سے کیا توقع کی جاتی ہے، مثال کے طور پر، ایک یاد دہانی کو حذف کرنا، ہمیں کسی نہ کسی طرح ہمارے بوٹ کو بتائیں کہ نمبرز درج کیے گئے ہیں اور اب بھیجے گئے ہیں فہرست سے ایک یاد دہانی ID کے طور پر سمجھا جانا چاہئے اور اسے ہٹا دیا جانا چاہئے۔ لہذا، "ڈیلیٹ" بٹن پر کلک کرنے کے بعد ، بوٹ BotState.ENTERNUMBEREVENT حالت میں چلا جاتا ہے ، یہ بوٹ اسٹیٹس کے ساتھ خاص طور پر تخلیق کردہ Enum کلاس ہے۔
public enum BotState {
    ENTERDESCRIPTION,//the bot will wait for the description to be entered.
    START,
    MYEVENTS, //the bot show to user list events.
    ENTERNUMBEREVENT,//the bot will wait for the number of event to be entered.
    ENTERDATE, //the bot will wait for the date to be entered
    CREATE, //the bot run created event
    ENTERNUMBERFOREDIT, //the bot will wait for the number of event to be entered
    EDITDATE, //the bot will wait for the date to be entered
    EDITDESCRIPTION,//the bot will wait for the description to be entered
    EDITFREQ,//the bot will wait callbackquery
    ALLUSERS, // show all users
    ALLEVENTS, //show all events
    ENTERNUMBERUSER,//the bot will wait for the number of user to be entered.
    ENTERTIME,//the bot will wait for the hour to be entered.
    ONEVENT // state toggle
}
اور اب ہم سے نمبر درج کرنے کی توقع کی جاتی ہے - " فہرست سے یاد دہانی کا نمبر درج کریں ۔" جس میں داخل ہونے کے بعد وہ پروسیسنگ کے لیے مطلوبہ طریقہ پر جائیں گے۔ ہمارا اسٹیٹ سوئچ یہ ہے:
public class BotStateCash {
    private final Map<long, botstate=""> botStateMap = new HashMap<>();

    public void saveBotState(long userId, BotState botState) {
        botStateMap.put(userId, botState);
    }
}

</long,>
صارف کی شناخت اور اس کی حیثیت کے ساتھ ایک باقاعدہ نقشہ۔ int adminId فیلڈ میرے لیے ہے) اگلا، handleUpdate طریقہ کار کی منطق چیک کرے گی کہ یہ کس قسم کا پیغام ہے؟ کال بیک کیوری یا صرف ٹیکسٹ؟ اگر یہ ریگولر ٹیکسٹ ہے، تو ہم handleInputMessage طریقہ پر جاتے ہیں، جہاں ہم مین مینو کے بٹنوں کو پروسیس کرتے ہیں، اور اگر ان پر کلک کیا جاتا ہے، تو ہم مطلوبہ حالت سیٹ کرتے ہیں، لیکن اگر ان پر کلک نہیں کیا گیا اور یہ غیر مانوس ٹیکسٹ ہے، تو ہم ریاست کو کیشے سے سیٹ کریں، اگر یہ وہاں نہیں ہے، تو ہم ابتدائی حالت سیٹ کرتے ہیں۔ اس کے بعد متن ہینڈل کے طریقہ کار کو اس ریاست کے ساتھ پروسیسنگ میں لے جاتا ہے جس کی ہمیں ضرورت ہے۔ اب ہم MessageHandler کلاس کی منطق پیش کرتے ہیں ، جو بوٹ کی حالت کے لحاظ سے پیغامات پر کارروائی کے لیے ذمہ دار ہے:
public class MessageHandler {

    private final UserDAO userDAO;
    private final MenuService menuService;
    private final EventHandler eventHandler;
    private final BotStateCash botStateCash;
    private final EventCash eventCash;

    public MessageHandler(UserDAO userDAO, MenuService menuService, EventHandler eventHandler, BotStateCash botStateCash, EventCash eventCash) {
        this.userDAO = userDAO;
        this.menuService = menuService;
        this.eventHandler = eventHandler;
        this.botStateCash = botStateCash;
        this.eventCash = eventCash;
    }

    public BotApiMethod<!--?--> handle(Message message, BotState botState) {
        long userId = message.getFrom().getId();
        long chatId = message.getChatId();
        SendMessage sendMessage = new SendMessage();
        sendMessage.setChatId(String.valueOf(chatId));
        //if new user
        if (!userDAO.isExist(userId)) {
            return eventHandler.saveNewUser(message, userId, sendMessage);
        }
        //save state in to cache
        botStateCash.saveBotState(userId, botState);
        //if state =...
        switch (botState.name()) {
            case ("START"):
                return menuService.getMainMenuMessage(message.getChatId(),
                        "Воспользуйтесь главным меню", userId);
            case ("ENTERTIME"):
                //set time zone user. for correct sent event
                return eventHandler.enterLocalTimeUser(message);
            case ("MYEVENTS"):
                //list events of user
                return eventHandler.myEventHandler(userId);
            case ("ENTERNUMBEREVENT"):
                //remove event
                return eventHandler.removeEventHandler(message, userId);
            case ("ENTERDESCRIPTION"):
                //enter description for create event
                return eventHandler.enterDescriptionHandler(message, userId);
            case ("ENTERDATE"):
                //enter date for create event
                return eventHandler.enterDateHandler(message, userId);
            case ("CREATE"):
                //start create event, set state to next step
                botStateCash.saveBotState(userId, BotState.ENTERDESCRIPTION);
                //set new event to cache
                eventCash.saveEventCash(userId, new Event());
                sendMessage.setText("Введите описание события");
                return sendMessage;
            case ("ENTERNUMBERFOREDIT"):
                //show to user selected event
                return eventHandler.editHandler(message, userId);
            case ("EDITDESCRIPTION"):
                //save new description in database
                return eventHandler.editDescription(message);
            case ("EDITDATE"):
                //save new date in database
                return eventHandler.editDate(message);
            case ("ALLEVENTS"):
                //only admin
                return eventHandler.allEvents(userId);
            case ("ALLUSERS"):
                //only admin
                return eventHandler.allUsers(userId);
            case ("ONEVENT"):
                // on/off notification
                return eventHandler.onEvent(message);
            case ("ENTERNUMBERUSER"):
                //only admin
                return eventHandler.removeUserHandler(message, userId);
            default:
                throw new IllegalStateException("Unexpected value: " + botState);
        }
    }
}
ہینڈل کے طریقہ کار میں، ہم موصول ہونے والے پیغام کی حیثیت کو چیک کرتے ہیں اور اسے ایونٹ ہینڈلر - EventHandler کلاس کو بھیجتے ہیں۔ یہاں ہمارے پاس دو نئی کلاسیں ہیں، MenuService اور EventCash ۔ MenuService - یہاں ہم اپنے تمام مینیو بناتے ہیں۔ EventCash - BotStateCash کی طرح ، یہ ان پٹ کے بعد ہمارے ایونٹ کے کچھ حصوں کو محفوظ کرے گا اور جب ان پٹ مکمل ہوجائے گا، ہم ڈیٹا بیس میں ایونٹ کو محفوظ کریں گے۔
@Service
@Setter
@Getter
// used to save entered event data per session
public class EventCash {

    private final Map<long, event=""> eventMap = new HashMap<>();

    public void saveEventCash(long userId, Event event) {
        eventMap.put(userId, event);
    }
}
</long,>
ٹھیک ہے، یہ ہے. جب ہم کوئی ایونٹ بناتے ہیں تو کیش میں ایک نیا ایونٹ آبجیکٹ بنتا ہے -eventCash.saveEventCash(userId, new Event())؛ پھر ہم ایونٹ کی تفصیل درج کرتے ہیں اور اسے کیشے میں شامل کرتے ہیں:
Event event = eventCash.getEventMap().get(userId);
event.setDescription(description);
//save to cache
eventCash.saveEventCash(userId, event);
پھر نمبر درج کریں:
Event event = eventCash.getEventMap().get(userId);
event.setDate(date);
//save data to cache
eventCash.saveEventCash(userId, event);
CallbackQueryHandler کلاس MessageHandler سے ملتی جلتی ہے ، صرف ہم وہاں کال بیک کیوری پیغامات پر کارروائی کرتے ہیں۔ واقعات کے ساتھ کام کرنے کی منطق کا مکمل تجزیہ کرنا کوئی معنی نہیں رکھتا - EventHandler ، پہلے ہی بہت زیادہ حروف موجود ہیں، یہ کوڈ میں طریقوں اور تبصروں کے ناموں سے واضح ہے۔ اور مجھے متن میں اسے مکمل طور پر ڈالنے کا نقطہ نظر نہیں آتا، 300 سے زیادہ لائنیں ہیں۔ Github پر کلاس کا لنک یہ ہے ۔ یہی بات MenuService کلاس کے لیے بھی ہے ، جہاں ہم اپنے مینیو بناتے ہیں۔ آپ ان کے بارے میں ٹیلیگرام لائبریری بنانے والے کی ویب سائٹ پر تفصیل سے پڑھ سکتے ہیں - https://github.com/rubenlagus/TelegramBots/blob/master/TelegramBots.wiki/FAQ.md یا ٹیلیگرام کی حوالہ کتاب میں - https:// tlgrm.ru/docs/bots/api اب ہمارے پاس سب سے مزیدار حصہ رہ گیا ہے۔ EventService پیغامات کو سنبھالنے کے لیے یہ کلاس ہے :
@EnableScheduling
@Service
public class EventService {
    private final EventDAO eventDAO;
    private final EventCashDAO eventCashDAO;

    @Autowired
    public EventService(EventDAO eventDAO, EventCashDAO eventCashDAO) {
        this.eventDAO = eventDAO;
        this.eventCashDAO = eventCashDAO;
    }

    //start service in 0:00 every day
    @Scheduled(cron = "0 0 0 * * *")
    // @Scheduled(fixedRateString = "${eventservice.period}")
    private void eventService() {
        Calendar calendar = Calendar.getInstance();
        calendar.setTime(new Date());
        int day = calendar.get(Calendar.DAY_OF_MONTH);
        int month = calendar.get(Calendar.MONTH);
        int year = calendar.get(Calendar.YEAR);

        //get event list is now date
        List<event> list = eventDAO.findAllEvent().stream().filter(event -> {
            if (event.getUser().isOn()) {
                EventFreq eventFreq = event.getFreq();

                //set user event time
                Calendar calendarUserTime = getDateUserTimeZone(event);

                int day1 = calendarUserTime.get(Calendar.DAY_OF_MONTH);
                int month1 = calendarUserTime.get(Calendar.MONTH);
                int year1 = calendarUserTime.get(Calendar.YEAR);
                switch (eventFreq.name()) {
                    case "TIME": //if one time - remove event
                        if (day == day1 && month == month1 && year == year1) {
                            eventDAO.remove(event);
                            return true;
                        }
                    case "EVERYDAY":
                        return true;
                    case "MONTH":
                        if (day == day1) return true;
                    case "YEAR":
                        if (day == day1 && month == month1) return true;
                    default: return false;
                }
            } else return false;
        }).collect(Collectors.toList());

        for (Event event : list) {
            //set user event time
            Calendar calendarUserTime = getDateUserTimeZone(event);
            int hour1 = calendarUserTime.get(Calendar.HOUR_OF_DAY);
            calendarUserTime.set(year, month, day, hour1, 0, 0);

            String description = event.getDescription();
            String userId = String.valueOf(event.getUser().getId());

            //save the event to the database in case the server reboots.
            EventCashEntity eventCashEntity = EventCashEntity.eventTo(calendarUserTime.getTime(), event.getDescription(), event.getUser().getId());
            eventCashDAO.save(eventCashEntity);

            //create a thread for the upcoming event with the launch at a specific time
            SendEvent sendEvent = new SendEvent();
            sendEvent.setSendMessage(new SendMessage(userId, description));
            sendEvent.setEventCashId(eventCashEntity.getId());

            new Timer().schedule(new SimpleTask(sendEvent), calendarUserTime.getTime());
        }
    }

    private Calendar getDateUserTimeZone(Event event) {
        Calendar calendarUserTime = Calendar.getInstance();
        calendarUserTime.setTime(event.getDate());
        int timeZone = event.getUser().getTimeZone();

        //set correct event time with user timezone
        calendarUserTime.add(Calendar.HOUR_OF_DAY, -timeZone);
        return calendarUserTime;
    }
}

</event>
@EnableScheduling - موسم بہار میں طے شدہ کام کو فعال کریں۔ @Scheduled(cron = "0 0 0 * * *") - ہم روزانہ 0:00 پر چلنے کے لیے طریقہ ترتیب دیتے ہیں calendar.setTime(new Date()); - سرور کا وقت مقرر کریں۔ ہمیں اسٹریمز اور لیمبڈا کے جادو کے ذریعے آج کے لیے یاد دہانیوں کی فہرست ملتی ہے۔ ہم موصول ہونے والی فہرست سے گزرتے ہیں، بھیجنے کا صحیح وقت مقرر کرتے ہیں کیلنڈر یوزر ٹائم اور... یہیں سے میں نے فیصلہ کیا کہ وقت میں تاخیر سے ہونے والے عمل کو چکما دیں اور شروع کریں۔ جاوا میں ٹائم کلاس اس کے لیے ذمہ دار ہے ۔ new Timer().schedule(new SimpleTask(sendEvent), calendarUserTime.getTime()); اس کے لیے ہمیں ایک تھریڈ بنانا ہوگا:
public class SendEvent extends Thread {


    private long eventCashId;
    private SendMessage sendMessage;

    public SendEvent() {
    }

    @SneakyThrows
    @Override
    public void run() {
        TelegramBot telegramBot = ApplicationContextProvider.getApplicationContext().getBean(TelegramBot.class);
        EventCashDAO eventCashDAO = ApplicationContextProvider.getApplicationContext().getBean(EventCashDAO.class);
        telegramBot.execute(sendMessage);
        //if event it worked, need to remove it from the database of unresolved events
        eventCashDAO.delete(eventCashId);
    }
}
اور TimerTask کا نفاذ
public class SimpleTask extends TimerTask {
    private final SendEvent sendEvent;

    public SimpleTask(SendEvent sendEvent) {
        this.sendEvent = sendEvent;
    }

    @Override
    public void run() {
        sendEvent.start();
    }
}
ہاں، میں بخوبی سمجھتا ہوں کہ آپ ہر 20 منٹ میں ڈیٹابیس سے گزر سکتے ہیں اور پیغامات بھیج سکتے ہیں، لیکن میں نے اس کے بارے میں سب کچھ شروع میں ہی لکھا ہے)) یہاں ہمیں ہیروکو نمبر 1 کی مصیبت کا بھی سامنا ہے۔ مفت پلان پر، آپ کو تقریباً 550 ڈائنو دیا جاتا ہے، جو کہ آپ کی درخواست کے ہر ماہ آپریشن کے اوقات کی طرح ہے۔ یہ درخواست کے پورے مہینے کے آپریشن کے لیے کافی نہیں ہے، لیکن اگر آپ کارڈ کو لنک کرتے ہیں، تو آپ کو مزید 450 ڈائنو دیا جاتا ہے، جو آپ کی آنکھوں کے لیے کافی ہے۔ اگر آپ کارڈ کے بارے میں پریشان ہیں، تو آپ ایک خالی کارڈ کو لنک کر سکتے ہیں، لیکن یقینی بنائیں کہ اس میں $0.6 ہے... یہ ایک تصدیقی رقم ہے، اسے صرف اکاؤنٹ میں ہونا ضروری ہے۔ کوئی پوشیدہ چارجز نہیں ہیں جب تک کہ آپ خود ٹیرف کو تبدیل نہیں کرتے ہیں۔ مفت پلان پر، ایک اور چھوٹا مسئلہ ہے، آئیے اسے نمبر 1 اے کہتے ہیں۔ وہ مسلسل سرورز کو ریبوٹ کرتے ہیں، یا ایپلیکیشن کو دوبارہ شروع کرنے کے لیے صرف ایک کمانڈ بھیجتے ہیں، عام طور پر یہ ہر روز ماسکو کے وقت آدھی رات کو کہیں نہ کہیں ریبوٹ ہوتا ہے، اور بعض اوقات دوسرے اوقات میں. اس سے، میموری میں ہمارے تمام عمل کو خارج کر دیا جاتا ہے. اس مسئلے کو حل کرنے کے لیے، میں EventCash ٹیبل لے کر آیا ہوں۔ بھیجنے سے پہلے، واقعات کو الگ ٹیبل میں محفوظ کیا جاتا ہے:
EventCashEntity eventCashEntity = EventCashEntity.eventTo(calendarUserTime.getTime(), event.getDescription(), event.getUser().getId());
eventCashDAO.save(eventCashEntity);
اور بھیجنے کے بعد، درج ذیل کو حذف کر دیا جاتا ہے:
@Override
public void run() {
    TelegramBot telegramBot = ApplicationContextProvider.getApplicationContext().getBean(TelegramBot.class);
    EventCashDAO eventCashDAO = ApplicationContextProvider.getApplicationContext().getBean(EventCashDAO.class);
    telegramBot.execute(sendMessage);
    //if event it worked, need to remove it from the database of unresolved events
    eventCashDAO.delete(eventCashId);
}
ApplicationContextProvider پرواز پر سیاق و سباق حاصل کرنے کے لیے ایک خاص کلاس ہے:
@Component
//wrapper to receive Beans
public class ApplicationContextProvider implements ApplicationContextAware {

    private static ApplicationContext context;

    public static ApplicationContext getApplicationContext() {
        return context;
    }

    @Override
    public void setApplicationContext(ApplicationContext ac)
            throws BeansException {
        context = ac;
    }
}
غیر پروسیس شدہ واقعات کو چیک کرنے کے لیے، میں نے ایک خاص سروس بنائی جس میں @PostConstruct کا ایک طریقہ ہے - یہ ہر ایپلیکیشن شروع ہونے کے بعد چلتا ہے۔ یہ ڈیٹا بیس سے تمام غیر عمل شدہ واقعات کو اٹھاتا ہے اور انہیں میموری میں واپس کرتا ہے۔ یہ رہا آپ کے لیے ایک گندا ہیروکو!
@Component
public class SendEventFromCache {

    private final EventCashDAO eventCashDAO;
    private final TelegramBot telegramBot;

    @Value("${telegrambot.adminId}")
    private int admin_id;

    @Autowired
    public SendEventFromCache(EventCashDAO eventCashDAO, TelegramBot telegramBot) {
        this.eventCashDAO = eventCashDAO;
        this.telegramBot = telegramBot;
    }

    @PostConstruct
    @SneakyThrows
    //after every restart app  - check unspent events
    private void afterStart() {
        List<eventcashentity> list = eventCashDAO.findAllEventCash();

        SendMessage sendMessage = new SendMessage();
        sendMessage.setChatId(String.valueOf(admin_id));
        sendMessage.setText("Произошла перезагрузка!");
        telegramBot.execute(sendMessage);

        if (!list.isEmpty()) {
            for (EventCashEntity eventCashEntity : list) {
                Calendar calendar = Calendar.getInstance();
                calendar.setTime(eventCashEntity.getDate());
                SendEvent sendEvent = new SendEvent();
                sendEvent.setSendMessage(new SendMessage(String.valueOf(eventCashEntity.getUserId()), eventCashEntity.getDescription()));
                sendEvent.setEventCashId(eventCashEntity.getId());
                new Timer().schedule(new SimpleTask(sendEvent), calendar.getTime());
            }
        }
    }
}
</eventcashentity>
ہماری درخواست تیار ہے، اور اب وقت آگیا ہے کہ ہم درخواست اور ڈیٹا بیس کے لیے ہیروکو ایڈریس حاصل کریں۔ آپ کی درخواست گیتھب پر شائع ہونی چاہیے!!! Heroku.com پر جائیں نئی ​​ایپ بنائیں پر کلک کریں ، اپنی درخواست کا نام درج کریں، یورپ کو منتخب کریں، ایپ بنائیں ۔ بس، درخواست کے لیے جگہ تیار ہے۔ اگر آپ اوپن ایپ پر کلک کرتے ہیں، تو براؤزر آپ کو آپ کی ایپلیکیشن کے ایڈریس پر بھیج دے گا، یہ آپ کا ویب ہک ایڈریس ہے - https://your_name.herokuapp.com/ اسے ٹیلی گرام میں رجسٹر کریں، اور ایپلی کیشن. پراپرٹی کی سیٹنگز میں ٹیلیگرام بوٹ کو تبدیل کریں ۔ webHookPath=https://telegrambotsimpl.herokuapp.com/ to your server.port=5000 کو حذف یا تبصرہ کیا جا سکتا ہے۔ اب ڈیٹا بیس کو جوڑتے ہیں۔ ہیروکو پر وسائل کے ٹیب پر جائیں ، کلک کریں: وہاں ہیروکو پوسٹگریسٹیلیگرام بوٹ - جاوا میں ویب ہُک کے ذریعے یاد دہانی یا گوگل کیلنڈر کو نہ کہیں!  حصہ 2:- 1 تلاش کریں ، انسٹال پر کلک کریں : آپ کو اپنے ڈیٹا بیس اکاؤنٹ کے صفحہ پر بھیج دیا جائے گا۔ اسے وہاں ترتیبات میں تلاش کریں/ آپ کے ڈیٹا بیس سے تمام ضروری ڈیٹا موجود ہوگا۔ application.properties میں اب سب کچھ اس طرح ہونا چاہئے: ٹیلیگرام بوٹ - جاوا میں ویب ہُک کے ذریعے یاد دہانی یا گوگل کیلنڈر کو نہ کہیں!  حصہ 2:- 2
#server.port=5000

telegrambot.userName=@calendar_event_bot
telegrambot.botToken=1731265488:AAFDjUSk3vu5SFfgdfh556gOOFmuml7SqEjwrmnEF5Ak
telegrambot.webHookPath=https://telegrambotsimpl.herokuapp.com/
#telegrambot.webHookPath=https://f5d6beeb7b93.ngrok.io


telegrambot.adminId=39376213

eventservice.period =600000

#spring.datasource.driver-class-name=org.postgresql.Driver
#spring.datasource.url=jdbc:postgresql://localhost:5432/telegramUsers
#spring.datasource.username=postgres
#spring.datasource.password=password

spring.datasource.url=jdbc:postgresql:ec2-54-247-158-179.eu-west-1.compute.amazonaws.com:5432/d2um26le5notq?ssl=true&sslmode=require&sslfactory=org.postgresql.ssl.NonValidatingFactory
spring.datasource.username=ulmbeymwyvsxa
spring.datasource.password=4c7646c69dbgeacbk98fa96e8daa6d9b1bl4894e67f3f3ddd6a27fe7b0537fd
اپنے اکاؤنٹ سے ڈیٹا کو اپنے اکاؤنٹ سے بدلیں: فیلڈ میں jdbc:postgresql:ec2-54-247-158-179.eu-west-1.compute.amazonaws.com:5432/d2um26le5notq?ssl=true&sslmode=require=require=orglfactory. postgresql.ssl .NonValidatingFactory کو اکاؤنٹ سے متعلقہ ڈیٹا (میزبان، ڈیٹا بیس) کے ساتھ بولڈ میں تبدیل کرنے کی ضرورت ہے۔ یوزر نیم، پاس ورڈ فیلڈز کا اندازہ لگانا مشکل نہیں ہے۔ اب ہمیں ڈیٹا بیس میں ٹیبل بنانے کی ضرورت ہے، میں نے یہ IDEA سے کیا۔ ہمارا اسکرپٹ ڈیٹا بیس بنانے کے لیے کارآمد ہوگا۔ ہم ڈیٹا بیس کو شامل کرتے ہیں جیسا کہ اوپر لکھا گیا تھا: ہم اکاؤنٹ سے ٹیلیگرام بوٹ - جاوا میں ویب ہُک کے ذریعے یاد دہانی یا گوگل کیلنڈر کو نہ کہیں!  حصہ 2:- 3 میزبان ، صارف، پاس ورڈ، ڈیٹا بیس فیلڈ لیتے ہیں۔ یو آر ایل فیلڈ ہماری spring.datasource.url فیلڈ ہے جو سوالیہ نشان تک ہے۔ ہم ایڈوانسڈ ٹیب پر جاتے ہیں ، یہ اس طرح ہونا چاہئے: ٹیلیگرام بوٹ - جاوا میں ویب ہُک کے ذریعے یاد دہانی یا گوگل کیلنڈر کو نہ کہیں!  حصہ 2:- 4 اگر آپ نے سب کچھ صحیح طریقے سے کیا، تو ٹیسٹ پر کلک کرنے کے بعد، ایک سبز چیک مارک ہوگا۔ ٹھیک ہے پر کلک کریں۔ ہمارے ڈیٹا بیس پر دائیں کلک کریں اور جمپ ٹو استفسار کنسول کو منتخب کریں ۔ وہاں ہماری اسکرپٹ کاپی کریں اور execute پر کلک کریں ۔ ڈیٹا بیس بنایا جائے۔ 10,000 لائنیں آپ کو مفت میں دستیاب ہیں! تعیناتی کے لیے سب کچھ تیار ہے۔ تعیناتی سیکشن میں ہیروکو پر ہماری درخواست پر جائیں۔ وہاں گیتھب سیکشن کو منتخب کریں: ٹیلیگرام بوٹ - جاوا میں ویب ہُک کے ذریعے یاد دہانی یا گوگل کیلنڈر کو نہ کہیں!  حصہ 2:- 5 اپنے ذخیرہ کو ہیروکو سے جوڑیں۔ اب آپ کی شاخیں نظر آئیں گی۔ اپنی تازہ ترین تبدیلیوں کو .properties میں آگے بڑھانا نہ بھولیں۔ نیچے، وہ برانچ منتخب کریں جو ڈاؤن لوڈ کی جائے گی اور ڈیپلو برانچ پر کلک کریں ۔ اگر سب کچھ صحیح طریقے سے کیا گیا ہے، تو آپ کو مطلع کیا جائے گا کہ ایپلیکیشن کامیابی کے ساتھ تعینات کر دی گئی ہے۔ .. سے خودکار تعیناتیوں کو فعال کرنا نہ بھولیں تاکہ آپ کی درخواست خود بخود شروع ہوجائے۔ ویسے، جب آپ GitHub میں تبدیلیوں کو آگے بڑھاتے ہیں، Heroku خود بخود ایپلیکیشن کو دوبارہ شروع کر دے گا۔ اس کے بارے میں محتاط رہیں، غنڈہ گردی کے لیے ایک الگ تھریڈ بنائیں، اور مرکزی کو صرف کام کرنے والی ایپلی کیشن کے لیے استعمال کریں۔ اب سستی #2! یہ ہیروکو کے مفت پلان کا معروف نقصان ہے۔ اگر کوئی آنے والے پیغامات نہیں ہیں تو، ایپلی کیشن اسٹینڈ بائی موڈ میں چلی جاتی ہے، اور پیغام موصول ہونے کے بعد اسے شروع ہونے میں کافی وقت لگے گا، جو کہ خوشگوار نہیں ہے۔ اس کا ایک آسان حل ہے - https://uptimerobot.com/ اور نہیں، گوگل پنگ گیجٹس مدد نہیں کریں گے، مجھے یہ بھی نہیں معلوم کہ یہ معلومات کہاں سے آئی ہیں، میں نے اس سوال کو گوگل کیا، اور اب تقریباً 10 سالوں سے یہ موضوع یقینی طور پر کام نہیں کر رہا ہے، اگر یہ بالکل کام کرتا ہے۔ یہ ایپلیکیشن آپ کے مقرر کردہ وقت کے لیے آپ کے بتائے ہوئے پتے پر HEAD کی درخواستیں بھیجے گی اور، اگر یہ جواب نہیں دیتی ہے، تو ای میل کے ذریعے پیغام بھیجیں۔ آپ کے لیے اس کا پتہ لگانا مشکل نہیں ہوگا، الجھن میں پڑنے کے لیے کافی بٹن نہیں ہیں)) مبارک ہو!! اگر میں کچھ نہیں بھولا ہوں اور آپ توجہ دے رہے تھے، تو آپ کی اپنی درخواست ہے جو مفت میں کام کرتی ہے اور کبھی کریش نہیں ہوتی۔ غنڈہ گردی اور تجربات کا موقع آپ کے سامنے کھلتا ہے۔ کسی بھی صورت میں، میں سوالات کا جواب دینے اور کسی بھی تنقید کو قبول کرنے کے لیے تیار ہوں! کوڈ: https://github.com/papoff8295/webHookBotForHabr استعمال شدہ مواد: https://tlgrm.ru/docs/bots/api - بوٹس کے بارے میں۔ https://en.wikibooks.org/wiki/Java_Persistence - ڈیٹا بیس میں تعلقات کے بارے میں۔ https://stackoverflow.com/questions/11432498/how-to-call-a-thread-to-run-on-specific-time-in-java - ٹائم کلاس اور ٹائمر ٹاسک https://www.youtube.com/ watch?v=CUDgSbaYGx4 - Github پر کوڈ کیسے پوسٹ کریں https://github.com/rubenlagus/TelegramBots - ٹیلیگرام لائبریری اور اس کے بارے میں بہت ساری مفید معلومات۔
تبصرے
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION