JavaRush /جاوا بلاگ /Random-SD /ٽيليگرام بوٽ - جاوا ۾ webHook ذريعي ياد ڏياريندڙ يا گوگل ...

ٽيليگرام بوٽ - جاوا ۾ webHook ذريعي ياد ڏياريندڙ يا گوگل ڪئلينڊر کي نه چئو! حصو 2

گروپ ۾ شايع ٿيل
پروجيڪٽ جو ٻيو حصو - هتي پهرين جي لنڪ آهي: ۽ پوءِ بوٽ اسٽيٽ ڪلاس : اسان جي بوٽن کي سمجهڻ لاءِ ته ڪنهن خاص وقت تي ان مان ڪهڙي توقع ڪئي وڃي ٿي، مثال طور، هڪ ياد ڏياريندڙ کي حذف ڪرڻ، اسان کي گهرجي ڪنهن به طرح اسان جي بوٽ کي خبر ڏيو ته نمبر داخل ڪيا ويا آهن ۽ هاڻي موڪليا ويا آهن فهرست مان هڪ ياد ڏياريندڙ ID جي طور تي علاج ڪيو وڃي ۽ هٽايو وڃي. تنهن ڪري، "ڊيليٽ" بٽڻ تي ڪلڪ ڪرڻ کان پوء ، بوٽ BotState.ENTERNUMBEREVENT رياست ۾ وڃي ٿو ، هي هڪ خاص طور تي ٺهيل اينم ڪلاس آهي بوٽ رياستن سان.
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,>
هڪ باقاعده نقشو هڪ صارف جي ID ۽ ان جي حيثيت سان. int adminId فيلڊ مون لاءِ آهي) اڳتي هلي، هينڊل اپ ڊيٽ ميٿڊ جو منطق چيڪ ڪندو ته هي ڪهڙي قسم جو پيغام آهي؟ ڪال بيڪڪيري يا صرف ٽيڪسٽ؟ جيڪڏهن اهو باقاعده ٽيڪسٽ آهي، ته پوءِ اسان 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()); - سرور جو وقت مقرر ڪريو. اسان اڄ تائين ياد ڏياريندڙن جي هڪ فهرست حاصل ڪندا آهيون، اسٽريمز ۽ ليمبڊا جي جادوءَ ذريعي. اسان حاصل ڪيل فهرست مان وڃون ٿا، صحيح موڪلڻ جو وقت سيٽ ڪريو ڪئلينڊر يوزر ٽائم ۽... اھو اھو آھي جتي مون ڊاج ڪرڻ جو فيصلو ڪيو ۽ وقت ۾ دير ٿيڻ واري عمل کي شروع ڪيو. جاوا ۾ ٽائيم ڪلاس هن لاء ذميوار آهي . نئون ٽائمر(). شيڊول(نئون 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 تي مشتمل آهي... هي هڪ تصديق جي رقم آهي، اهو صرف اڪائونٽ ۾ هجڻ جي ضرورت آهي. ڪو به پوشيده چارج نه آهي جيستائين توهان پنهنجو پاڻ کي ٽريف تبديل نه ڪندا. مفت منصوبي تي، هڪ وڌيڪ ننڍڙو مسئلو آهي، اچو ته ان کي سڏين نمبر 1a.. اهي مسلسل سرور کي ريبوٽ ڪندا آهن، يا صرف ايپليڪيشن کي ٻيهر شروع ڪرڻ لاء هڪ حڪم موڪليندا آهن، عام طور تي اهو هر روز ريبوٽ ٿئي ٿو ماسڪو وقت جي اڌ رات تي، ۽ ڪڏهن ڪڏهن. ٻين وقتن تي. ان کان پوء، ميموري ۾ اسان جا سڀئي عمل ختم ٿي ويا آهن. هن مسئلي کي حل ڪرڻ لاء، مون وٽ آيو 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 - اهو هر ايپليڪيشن جي شروعات کان پوءِ هلندو آهي. اهو ڊيٽابيس مان سڀني غير پروسيس ٿيل واقعن کي کڻندو آهي ۽ انهن کي ميموري ڏانهن موٽائي ٿو. هتي توهان لاء هڪ گندو Heroku آهي!
@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>
اسان جي ايپليڪيشن تيار آهي، ۽ اهو وقت آهي اسان لاءِ هيروڪو ايڊريس حاصل ڪرڻ لاءِ ايپليڪيشن ۽ ڊيٽابيس لاءِ. توهان جي درخواست کي Github تي شايع ڪيو وڃي !!! Heroku.com ڏانھن وڃو نئون ايپ ٺاھيو تي ڪلڪ ڪريو ، پنھنجي ايپليڪيشن جو نالو داخل ڪريو، يورپ چونڊيو، ايپ ٺاھيو . اهو آهي، ايپليڪيشن لاء جڳهه تيار آهي. جيڪڏهن توهان اوپن ايپ تي ڪلڪ ڪريو ٿا، برائوزر توهان کي توهان جي ايپليڪيشن جي ايڊريس ڏانهن ريڊائريڪٽ ڪندو، هي توهان جي ويب هِڪ ايڊريس آهي - https://your_name.herokuapp.com/ ان کي ٽيليگرام ۾ رجسٽر ڪريو، ۽ ايپليڪيشن.propertie ۾ سيٽنگون تبديل ڪريو ٽيليگرام بوٽ. webHookPath=https://telegrambotsimpl.herokuapp.com/ to your server.port=5000 حذف ڪري سگھجي ٿو يا تبصرو ڪري سگھجي ٿو. هاڻي اچو ته ڊيٽابيس کي ڳنڍيون. Heroku تي وسيلن جي ٽئب ڏانھن وڃو ، ڪلڪ ڪريو: Heroku Postgresٽيليگرام بوٽ - جاوا ۾ webHook ذريعي ياد ڏياريندڙ يا گوگل ڪئلينڊر کي نه چئو!  حصو 2:- 1 ڳوليو اتي ، ڪلڪ ڪريو انسٽال ڪريو : توھان کي توھان جي ڊيٽابيس اڪائونٽ صفحي ڏانھن ريڊائريڪٽ ڪيو ويندو. ان کي ڳولھيو اتي سيٽنگون/ توھان جي ڊيٽابيس مان سڀ ضروري ڊيٽا ھوندو. Application.properties ۾ هاڻي هر شيءِ هن طرح هجڻ گهرجي: ٽيليگرام بوٽ - جاوا ۾ webHook ذريعي ياد ڏياريندڙ يا گوگل ڪئلينڊر کي نه چئو!  حصو 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=orgtoryac. postgresql.ssl .NonValidatingFactory کي اڪائونٽ مان لاڳاپيل ڊيٽا (ميزبان، ڊيٽابيس) سان بولڊ ۾ تبديل ڪرڻ جي ضرورت آهي. يوزرنيم، پاسورڊ فيلڊز جو اندازو لڳائڻ ڏکيو ناهي. هاڻي اسان کي ڊيٽابيس ۾ ٽيبل ٺاهڻ جي ضرورت آهي، مون اهو IDEA کان ڪيو. ڊيٽابيس ٺاهڻ لاءِ اسان جي اسڪرپٽ ڪارآمد ثابت ٿيندي. اسان ڊيٽابيس کي شامل ڪيو جيئن مٿي لکيل آهي: اسان اڪائونٽ مان ٽيليگرام بوٽ - جاوا ۾ webHook ذريعي ياد ڏياريندڙ يا گوگل ڪئلينڊر کي نه چئو!  حصو 2:- 3 ميزبان ، يوزر، پاسورڊ، ڊيٽابيس فيلڊ وٺون ٿا. يو آر ايل فيلڊ اسان جي spring.datasource.url فيلڊ آهي سوال جي نشان تائين. اسان وڃون ٿا ڳوڙھي ٽيب ، اھو ھن طرح ھجڻ گھرجي: ٽيليگرام بوٽ - جاوا ۾ webHook ذريعي ياد ڏياريندڙ يا گوگل ڪئلينڊر کي نه چئو!  حصو 2:- 4 جيڪڏھن توھان سڀ ڪجھ صحيح ڪيو، پوء ٽيسٽ تي ڪلڪ ڪرڻ کان پوء، ھڪڙو سائي نشان ھجي. OK تي ڪلڪ ڪريو. اسان جي ڊيٽابيس تي ساڄي ڪلڪ ڪريو ۽ منتخب ڪريو Jump to query console . اتي اسان جي اسڪرپٽ کي نقل ڪريو ۽ execute تي ڪلڪ ڪريو . ڊيٽابيس ٺاهڻ گهرجي. 10,000 لائنون توهان لاءِ مفت ۾ موجود آهن! هر شي تيار ڪرڻ لاء تيار آهي. Deploy سيڪشن ۾ Heroku تي اسان جي ايپليڪيشن تي وڃو. منتخب ڪريو Github سيڪشن اتي: ٽيليگرام بوٽ - جاوا ۾ webHook ذريعي ياد ڏياريندڙ يا گوگل ڪئلينڊر کي نه چئو!  حصو 2:- 5 پنھنجي مخزن کي Heroku سان ڳنڍيو. ھاڻي توھان جون شاخون نظر اينديون. پنهنجي تازي تبديلين کي .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 - ٽائيم ڪلاس ۽ TimerTask 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