JavaRush /Блоги Java /Random-TG /Боти Telegram - ёдраскунӣ тавассути webHook дар Java ё ба...
Vladimir Popov
Сатҳи

Боти Telegram - ёдраскунӣ тавассути webHook дар Java ё ба тақвими Google не бигӯед! Қисми 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,>
Харитаи муқаррарӣ бо ID-и корбар ва ҳолати он. Майдони 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,>
Хуб, ин аст. вақте ки мо як ҳодиса эҷод мекунем, дар кэш an objectи нави Ҳодиса сохта мешавад -eventCash.saveEventCash(userId, Event new()); Сипас мо тавсифи ҳодисаро ворид мекунем ва онро ба кэш илова мекунем:
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 шабеҳ аст , танҳо мо дар он ҷо паёмҳои бозпас зангро коркард мекунем. Таҳлor пурраи мантиқи кор бо рӯйдодҳо бемаънӣ аст - EventHandler , аллакай ҳарфҳои зиёде мавҷуданд, ки аз номҳои усулҳо ва шарҳҳо дар code маълум аст. Ва ман маънои пурра дар матн гузоштани онро намебинам, зиёда аз 300 сатр вуҷуд дорад. Ин аст пайванд ба синф дар Github . Ин ба синфи MenuService дахл дорад , ки дар он мо менюҳои худро эҷод мекунем. Шумо метавонед дар бораи онҳо муфассал дар вебсайти истеҳсолкунандаи китобхонаи телеграмм - https://github.com/rubenlagus/TelegramBots/blob/master/TelegramBots.wiki/FAQ.md ё дар китоби маълумотномаи Telegram - 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(Санаи нав()); - вақти serverро таъин кунед. Мо рӯйхати ёдраскуниҳои имрӯзаро тавассути ҷодуи ҷараёнҳо ва ламбда мегирем. Мо аз рӯйхати қабулшуда мегузарем, вақти дурусти фиристодани calendarUserTime-ро муқаррар мекунем ва... Дар ин ҷо ман тасмим гирифтам, ки равандҳои дар вақташ таъхиршударо саркашӣ кунам. Синфи Time дар java барои ин масъул аст . нав Таймер ().ҷадвали (нав 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 дақиқа аз пойгоҳи додаҳо гузаред ва паём фиристед, аммо ман ҳама чизро дар ин бора навишта будам)) Дар ин ҷо мо ба бадбахтии Ҳероку No 1 низ дучор мешавем. Дар нақшаи ройгон ба шумо тақрибан 550 дино дода мешавад, ки ин ба соатҳои кори аризаи шумо дар як моҳ монанд аст. Ин барои як моҳи пурраи корбарии барнома кофӣ нест, аммо агар шумо кортро пайваст кунед, ба шумо 450 динои дигар дода мешавад, ки барои чашмони шумо басанда аст. Агар шумо дар бораи корт хавотир бошед, шумо метавонед корти холиро пайваст кунед, аммо боварӣ ҳосил кунед, ки он $ 0,6 дорад... Ин маблағи тасдиқкунанда аст, он танҳо бояд дар суратҳисоб бошад. Агар шумо тарифро худатон тағир надиҳед, ҳеҷ гуна пардохтҳои пинҳонӣ вуҷуд надоранд. Дар нақшаи ройгон боз як мушкor хурде ҳаст, биёед онро № 1а бигӯем.. Онҳо пайваста serverҳоро бозоғоз мекунанд ё танҳо фармон мефиристанд, ки барномаро бозоғоз кунанд, умуман он ҳар рӯз дар ҷое дар нимашаби вақти Маскав бозоғоз мешавад ва баъзан. дар вактхои дигар. Аз ин ҳама равандҳои мо дар хотира нест карда мешаванд. Барои ҳалли ин мушкилот, ман бо ҷадвали 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>
Аризаи мо омода аст ва вақти он расидааст, ки суроғаи Ҳерокуро барои барнома ва базаи маълумот гирем. Аризаи шумо бояд дар Github нашр шавад!!! Ба Heroku.com равед Эҷоди барномаи нав ро клик кунед , номи барномаи худро ворид кунед, Аврупоро интихоб кунед, барнома эҷод кунед . Хамин аст, чои ариза тайёр аст. Агар шумо тугмаи кушодаи Барномаро пахш кунед, браузер шуморо ба суроғаи замимаатон равона мекунад, ин суроғаи вебхуки шумост - https://your_name.herokuapp.com/ Онро дар telegram сабти ном кунед ва дар танзимоти application.propertie телеграмботро тағир диҳед . webHookPath=https: //telegrambotsimpl.herokuapp.com/ ба server.port=5000-и шумо метавонад нест карда шавад ё шарҳ дода шавад. Акнун биёед базаи маълумотро пайваст кунем. Ба ҷадвали захираҳо дар Heroku равед , клик кунед: Ҳероку Postgres-роБоти Telegram - ёдраскунӣ тавассути webHook дар Java ё ба тақвими Google не бигӯед!  Қисми 2: - 1 дар он ҷо пайдо кунед , насб кунед : Шумо ба саҳифаи ҳисоби пойгоҳи додаи худ равона карда мешавед. Онро дар он ҷо дар Танзимот пайдо кунед/ Ҳама маълумоти зарурӣ аз пойгоҳи додаи шумо мавҷуданд. Дар application.properties ҳама чиз акнун бояд чунин бошад: Боти Telegram - ёдраскунӣ тавассути webHook дар Java ё ба тақвими Google не бигӯед!  Қисми 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&sslf. postgresql.ssl .NonValidatingFactory бояд бо ҳарфи ғафс бо маълумоти мувофиқ аз ҳисоби ҳисоб иваз карда шавад (Хост, Пойгоҳи додаҳо) Номи корбар, майдонҳои паролро тахмин кардан душвор нест. Ҳоло мо бояд дар базаи маълумот ҷадвалҳо созем, ман инро аз IDEA кардам. Скрипти мо барои эҷоди пойгоҳи додаҳо муфид хоҳад буд. Мо базаро тавре илова мекунем, ки дар боло навишта шудааст: Мо аз ҳисоб майдони Боти Telegram - ёдраскунӣ тавассути webHook дар Java ё ба тақвими Google не бигӯед!  Қисми 2: - 3 Хост , Корбар, Рамз, Пойгоҳи додаҳоро мегирем. Майдони URl майдони spring.datasource.url мо то аломати савол аст. Мо ба ҷадвали Advanced меравем , он бояд чунин бошад: Боти Telegram - ёдраскунӣ тавассути webHook дар Java ё ба тақвими Google не бигӯед!  Қисми 2: - 4 Агар шумо ҳама чизро дуруст карда бошед, пас пас аз пахш кардани санҷиш, аломати сабз пайдо мешавад. OK-ро пахш кунед. Дар пойгоҳи додаи мо бо тугмаи рост клик кунед ва Ҷаҳиш ба консоли дархост -ро интихоб кунед . Скрипти моро дар он ҷо нусхабардорӣ кунед ва иҷро карданро клик кунед . Махзани маълумот бояд таъсис дода шавад. 10,000 хатҳо барои шумо ройгон дастрасанд! Ҳама чиз барои ҷойгиркунӣ омода аст. Ба барномаи мо дар Heroku дар бахши Ҷойгиркунӣ равед. Дар он ҷо бахши Github-ро интихоб кунед: Боти Telegram - ёдраскунӣ тавассути webHook дар Java ё ба тақвими Google не бигӯед!  Қисми 2: - 5 Анбори худро ба Heroku пайваст кунед. Акнун шохаҳои шумо намоён хоҳанд шуд. Фаромӯш накунед, ки тағироти охирини худро ба .properties пахш кунед. Дар зер фorалеро, ки зеркашӣ карда мешавад, интихоб кунед ва Фorалро ҷойгир кунед -ро клик кунед . Агар ҳама чиз дуруст анҷом дода шавад, шумо огоҳ мешавед, ки барнома бомуваффақият ҷойгир карда шудааст. Фаромӯш накунед, ки фаъол кардани ҷойгиркунии худкор аз .. Барои он ки барномаи шумо ба таври худкор оғоз шавад. Дар омади гап, вақте ки шумо тағиротро ба GitHub пахш мекунед, Heroku барномаро ба таври худкор бозоғоз мекунад. Дар ин бора эҳтиёт бошед, барои таҳқир риштаи алоҳида эҷод кунед ва риштаи асосиро танҳо барои барномаи корӣ истифода баред. Акнун арзон №2! Ин камбудии маъруфи нақшаи ройгон барои Ҳероку мебошад. Агар ягон паёми воридотӣ мавҷуд набошад, барнома ба ҳолати интизорӣ мегузарад ва пас аз гирифтани паём барои оғоз кардани он вақти хеле тӯлонӣ лозим аст, ки ин хуш нест. Барои ин як роҳи ҳалли оддӣ вуҷуд дорад - https://uptimerobot.com/ Ва не, гаҷетҳои пинги Google кӯмак намекунанд, ман ҳатто намедонам, ки ин маълумот аз куҷо пайдо шудааст, ман ин саволро дар Google ҷустуҷӯ кардам ва тақрибан 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 - чӣ гуна бояд codeро дар Github ҷойгир кард https://github.com/rubenlagus/TelegramBots - китобхонаи телеграмма ва бисёр маълумоти муфид дар бораи он.
Шарҳҳо
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION