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

Боти Telegram - ёдраскунӣ тавассути webHook дар Java ё ба тақвими Google не бигӯед! Қисми 1

Дар гурӯҳ нашр шудааст
Номи ман Владимир. Ман 43-солаам. Ва агар шумо, хонанда, аз 40 гузаштаед, пас бале, пас аз 40, шумо метавонед барномасоз шавед, агар ба шумо маъқул бошад. Кори ман умуман ба барномасозӣ рабте надорад, ман менеҷери лоиҳа дар соҳаи автоматизатсия ва ҳама чизҳои дигар ҳастам. Аммо ман ният дорам, ки касбамро иваз кунам. Оҳ, ин тамоюлҳои нав... ҳар 5-7 сол майдони фаъолиятатонро иваз мекунанд. Ҳамин тавр : Лоиҳа хеле калон шуд, аз ин рӯ баъзе нуктаҳоро бояд сарфи назар кард ё ба таври мухтасар дар бораи он сӯҳбат кунем, ба умеди он ки хонанда чӣ гуна Google-ро медонад. Интернет пур аз нашрияҳои ботҳои телеграмма аст, ки аз рӯи принсипи овоздиҳии Long кор мекунанд. Ва хеле кам ҳастанд, ки аз рӯи принсипи Webhook кор мекунанд. Ин чист? Пурсишҳои тӯлонӣ - ин маънои онро дорад, ки худи барномаи шумо serverи телеграммаро барои паёмҳо бо басомади муайян оҳиста пурсиш мекунад. Webhook - маънои онро дорад, ки serverи телеграм паёмҳоро фавран ба serverе, ки шумо нишон додаед, равона мекунад. Дар мавриди мо, бо эҳтироми хидмати Ҳероку. Шумо албатта метавонед дар бораи ҳамаи ин ва умуман бот дар вебсайти Telegram маълумоти бештар гиред - https://tlgrm.ru/docs/bots/api Интерфейси бот чунин менамояд: Боти Telegram - ёдраскунӣ тавассути webHook дар Java ё ба тақвими Google не бигӯед!  - 1 Ман ин барномаро маҳз ҳамчун омӯзиш мешуморам лоиҳа аз он сабаб, ки ҳангоми навиштан ман аз ин бот нисбат ба омӯзиш маълумоти бештар гирифтам. Оё шумо мехоҳед барномасозӣ омӯзед? Навиштани codeро оғоз кунед!!! Аммо! Дар бораи чӣ гуна бор кардани барнома ба github ё чӣ гуна сохтани пойгоҳи додаҳо дастурҳои муфассал вуҷуд надоранд. Ин дар Интернет фаровон аст ва он ба таври муфассал тавсиф шудааст; Илова бар ин, он хондани хеле тӯлонӣ хоҳад буд. Барнома ба таври зерин кор хоҳад кард: Тавсифи рӯйдодро ворид кунед, сана ва вақти рӯйдодро ворид кунед, басомадро интихоб кунед (шумо метавонед онро як маротиба иҷро кунед, шумо метавонед ҳар рӯз дар вақти муайян ёдрас кунед, шумо метавонед онро як маротиба дошта бошед. моҳ дар вақти муайян ё як маротиба дар як сол). Вариантҳои огоҳиномаҳоро беохир илова кардан мумкин аст; Ман ғояҳои зиёде дорам. Баъдан, маълумоти воридшуда дар базаи маълумот захира карда мешавад (инчунин дар Heroku ройгон ҷойгир карда мешавад, 10,000 сатр ройгон аст) Сипас, як маротиба дар оғози рӯз дар соати 0:00 вақти server, Spring тамоми рӯйдодҳоро дар асоси меъёрҳо аз пойгоҳи додаҳо бармегардонад. ки бояд дар он руз оташ занад ва дар вацти муайян онхоро ба катл фиристад. ДИККАТ!!! ИН КИСМИ ПРОГРАММА ТАЧРИБАИ АСТ! ЯК АМАЛ АСТ, КИ ОДДАТАР ВА ДУСТИ АСТ! ИН КОР МАХСУС БАРОИ ДИДАНИ КИ ЧИ ГУНА КОР НАМУДАНИ СИНФИ ВАХТ КОР КАРДА ШУД! Шумо метавонед боти корӣ бо дастони худ дар ароба навиштан @calendar_event_bot ламс кунед, аммо ба он ҳисоб накунед, зеро ман то ҳол онро масхара мекунам. code - https://github.com/papoff8295/webHookBotForHabr Асосан, барои оғози кори худ шумо бояд қадамҳои зеринро иҷро кунед: • Дар @BotFather сабти ном кунед , ин мушкил нест, нишона ва ном гиред • Лоиҳаро дар github форк кунед • Регистратсия дар Хероку, барнома эҷод кунед (мо онро зина ба зина мегузарем), аз анбори худ ҷойгир кунед. • Дар Ҳероку пойгоҳи додаҳо эҷод кунед • Майдонҳои мувофиқро дар анбор бо майдони худ иваз кунед (нишона, номи ҷадвалҳо дар an objectҳо, webHookPath, номи корбар, парол ва роҳ ба пойгоҳи додаҳо, ин ҳама таҳлил карда мешавад) • Ҳерокуро 24/24 кор кунед. 7 бо истифода аз https:/ /uptimerobot.com/ Сохтори ниҳоии лоиҳа чунин аст: Боти Telegram - ёдраскунӣ тавассути webHook дар Java ё ба тақвими Google не бигӯед!  - 2 Биёед аз сохтани лоиҳа дар https://start.spring.io оғоз кунем , вобастагиҳоеро, ки ба мо лозим аст, тавре ки дар расм нишон дода шудааст, интихоб кунед: Telegram bot — напоминалка через webHook на Java or скажи нет Google-календарю! - 3Худи моро интихоб кунед. номи лоиҳаро пахш кунед ва Эҷод кардан -ро клик кунед . Баъд аз шумо хоҳиш карда мешавад, ки лоиҳаро дар диски худ захира кунед. Танҳо кушодани файли pom.xm l аз муҳити таҳияи шумо боқӣ мемонад. Дар назди шумо як лоиҳаи анҷомёфта истодааст. Ҳоло ба мо лозим аст, ки китобхонаи асосии худро илова кунем. Ман китобхонаро аз https://github.com/rubenlagus/TelegramBots истифода кардам Умуман, шумо метавонед ошуфта шавед ва бе он кор кунед. Баъд аз ҳама, тамоми нуқтаи кор ин пайваст кардани URL-и зерин аст: https://api.telegram.org/bot1866835969:AAE6gJG6ptUyqhV2XX0MxyUak4QbAGGnz10/setWebhook?url=https://e9c658b548a it a little look.' : https://api.telegram.org – serverи телеграмма. bot1866835969:AAE6gJG6ptUyqhV2XX0MxyUak4QbAGGnz10/ - пас аз калимаи бот аломати махфӣ аст, ки ҳангоми сабти бот шумо онро мегиред. setWebhook?url=https://e9c658b548aa.ngrok.io – номи усул ва параметрҳои он. Дар ин ҳолат, мо serverи webhook-и шуморо насб мекунем, ҳама паёмҳо ба он фиристода мешаванд. Умуман, ман қарор додам, ки лоиҳа барои нашр хеле хурд нест, аммо бо татбиқи дастӣ он умуман хондан ғайриимкон хоҳад буд. Ҳамин тавр, намуди ниҳоии файли pom ин аст:
<!--?xml version="1.0" encoding="UTF-8"?-->
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemalocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
   <modelversion>4.0.0</modelversion>
   <parent>
      <groupid>org.springframework.boot</groupid>
      <artifactid>spring-boot-starter-parent</artifactid>
      <version>2.5.0</version>
      <relativepath> <!-- lookup parent from repository -->
   </relativepath></parent>
   <groupid>ru.popov</groupid>
   <artifactid>telegrambot</artifactid>
   <version>0.0.1-SNAPSHOT</version>
   <name>telegrambot</name>
   <description>Demo project for Spring Boot</description>
   <properties>
      <java.version>1.8</java.version>
   </properties>
   <dependencies>
      <dependency>
         <groupid>org.springframework.boot</groupid>
         <artifactid>spring-boot-starter-web</artifactid>
      </dependency>

      <dependency>
         <groupid>org.springframework.boot</groupid>
         <artifactid>spring-boot-starter-data-jpa</artifactid>
      </dependency>

      <dependency>
         <groupid>org.springframework.boot</groupid>
         <artifactid>spring-boot-starter-test</artifactid>
         <scope>test</scope>
      </dependency>

      <!-- https://mvnrepository.com/artifact/org.telegram/telegrambots-spring-boot-starter -->
      <dependency>
         <groupid>org.telegram</groupid>
         <artifactid>telegrambots-spring-boot-starter</artifactid>
         <version>5.2.0</version>
      </dependency>

      <dependency>
         <groupid>org.projectlombok</groupid>
         <artifactid>lombok</artifactid>
         <version>1.18.16</version>
      </dependency>

      <dependency>
         <groupid>org.postgresql</groupid>
         <artifactid>postgresql</artifactid>
         <scope>runtime</scope>
      </dependency>

   </dependencies>

   <build>
      <plugins>
         <plugin>
            <groupid>org.springframework.boot</groupid>
            <artifactid>spring-boot-maven-plugin</artifactid>
         </plugin>
      </plugins>
   </build>

</project>
Ҳама чиз барои навиштани боти мо омода аст. Биёед синфи TelegramBot-ро эҷод кунем . Ман номҳои ҷузвдонҳоро наменависам, шумо метавонед онҳоро дар сохтори лоиҳаи боло бубинед.
@Getter
@Setter
@FieldDefaults(level = AccessLevel.PRIVATE)
public class TelegramBot extends SpringWebhookBot {
    String botPath;
    String botUsername;
    String botToken;

    private TelegramFacade telegramFacade;

    public TelegramBot(TelegramFacade telegramFacade, DefaultBotOptions options, SetWebhook setWebhook) {
        super(options, setWebhook);
        this.telegramFacade = telegramFacade;
    }
    public TelegramBot(TelegramFacade telegramFacade, SetWebhook setWebhook) {
        super(setWebhook);
        this.telegramFacade = telegramFacade;
    }

    @Override
    public BotApiMethod<!--?--> onWebhookUpdateReceived(Update update) {
        return telegramFacade.handleUpdate(update);
    }
}
Синф SpringWebhookBot-ро аз китобхонаи телеграммаи мо васеъ мекунад ва мо бояд танҳо як усулро татбиқ кунем, onWebhookUpdateReceived . Он JSON-и таҳлилшударо ҳамчун an objectи Навсозӣ қабул мекунад ва он чизеро, ки serverи телеграмма аз мо "шунидан" мехоҳад, бармегардонад. Дар ин ҷо мо шарҳҳо аз китобхонаи Ломбок дорем . Ломбок - осон кардани ҳаёти барномасоз!! Хуб, ин аст. ба мо лозим нест, ки қабулкунандаҳо ва танзимкунандагонро аз нав муайян кунем, Lombok ин корро барои мо мекунад ва ба мо инчунин лозим нест, ки идентификатори сатҳи дастрасӣ нависем. Дигар навиштан лозим нест, ки ин бо эзоҳҳои @Getter, @Setter, @FieldDefaults анҷом дода мешавад Майдони botPath маънои суроғаи вебхуки моро дорад, ки мо онро дертар дар Ҳероку мегирем. Майдони botUsername маънои номи боти моро дорад, ки мо онро ҳангоми сабти номи боти худ дар Telegram мегирем. Майдони botToken нишонаи мост, ки мо онро ҳангоми сабти номи боти худ дар Telegram мегирем. Майдони telegramFacade синфи мост, ки коркарди паёмҳо сурат мегирад, мо каме дертар ба он бармегардем, бигзор он ҳоло сурх бошад. Ҳоло вақти он расидааст, ки мо бо @BotFather тамос гирем ва ботТокен ва номи botUsername ба даст орем. Telegram bot — напоминалка через webHook на Java or скажи нет Google-календарю! - 4Фақат дар телеграмма ба ӯ нависед ва ӯ ҳама чизро ба шумо нақл мекунад. Мо маълумотро ба application.properties худ менависем, дар ниҳоят он чунин хоҳад буд:
server#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/d2um126le5notq?ssl=true&sslmode=require&sslfactory=org.postgresql.ssl.NonValidatingFactory
#spring.datasource.username=ulmbeywyhvsxa
#spring.datasource.password=4c7646c69dbbgeacb98fa96e8daa6d9b1bl4894e67f3f3ddd6a27fe7b0537fd
Ин конфигуратсия барои кор бо пойгоҳи додаҳои маҳаллӣ танзим шудааст; баъдтар мо тағироти заруриро ворид хоҳем кард. botToken ва номи корбарро бо номи худ иваз кунед . Бевосита дар барнома истифода бурдани маълумот аз application.properties хуб нест. Биёед аз ин маълумот як лубиё ё синфи печанда эҷод кунем.
@Component
@Getter
@FieldDefaults(level = AccessLevel.PRIVATE)

public class TelegramBotConfig {
    @Value("${telegrambot.webHookPath}")
    String webHookPath;
    @Value("${telegrambot.userName}")
    String userName;
    @Value("${telegrambot.botToken}")
    String botToken;
Дар ин ҷо тавзеҳи @Value сатрҳои мувофиқро аз файли application.properties оғоз мекунад, ки Spring дар бораи он ба таври нобаёнӣ медонад. Ва шарҳи @Component ҳангоми оғози барнома барои мо Bean эҷод мекунад. Акнун биёед файли конфигуратсияи Springро бубинем:
@Configuration
public class AppConfig {
    private final TelegramBotConfig botConfig;

    public AppConfig(TelegramBotConfig botConfig) {
        this.botConfig = botConfig;
    }

    @Bean
    public SetWebhook setWebhookInstance() {
        return SetWebhook.builder().url(botConfig.getWebHookPath()).build();
    }

    @Bean
    public TelegramBot springWebhookBot(SetWebhook setWebhook, TelegramFacade telegramFacade) {
        TelegramBot bot = new TelegramBot(telegramFacade, setWebhook);
        bot.setBotToken(botConfig.getBotToken());
        bot.setBotUsername(botConfig.getUserName());
        bot.setBotPath(botConfig.getWebHookPath());

        return bot;
    }
}
Дар ин ҷо ҷодуе нест; ҳангоми оғозёбӣ Spring барои мо an objectҳои SetWebhook ва TelegramBot эҷод мекунад. Биёед ҳоло барои паёмҳои худ нуқтаҳои вуруд эҷод кунем:
@RestController
public class WebhookController {

    private final TelegramBot telegramBot;

    public WebhookController(TelegramBot telegramBot) {
        this.telegramBot = telegramBot;
    }

// point for message
    @PostMapping("/")
    public BotApiMethod<!--?--> onUpdateReceived(@RequestBody Update update) {
        return telegramBot.onWebhookUpdateReceived(update);
    }

    @GetMapping
    public ResponseEntity get() {
        return ResponseEntity.ok().build();
    }
}
Сервери Telegram паёмҳоро дар формати JSON ба суроғаи вебхук ба қайд гирифташуда бо истифода аз усули POST мефиристад, контролери мо онҳоро қабул мекунад ва ба китобхонаи телеграмма дар шакли an objectи Навсозӣ интиқол медиҳад. Ман усули гирифтанро ҳамин тавр кардам) Ҳоло ба мо лозим аст, ки мантиқи коркарди паёмҳо ва посухҳоро дар синфи TelegramFacade татбиқ кунем , ман рамзи кӯтоҳи онро медиҳам, то шумо барномаро оғоз кунед ва пас роҳи худатонро равед ё ба ҷойгиркунӣ гузаред. дар Heroku, он гоҳ он versionи пурра хоҳад буд:
@Component
@FieldDefaults(level = AccessLevel.PRIVATE)
public class TelegramFacade {

    public BotApiMethod<!--?--> handleUpdate(Update update) {

        if (update.hasCallbackQuery()) {
            CallbackQuery callbackQuery = update.getCallbackQuery();
            return null;
        } else {

            Message message = update.getMessage();
            SendMessage sendMessage = new SendMessage();
            sendMessage.setChatId(String.valueOf(message.getChatId()));
            if (message.hasText()) {
                sendMessage.setText("Hello world");
                return sendMessage;
            }
        }
        return null;
    }

}
Ин усул ба ҳама ҷаҳони Салом ҷавоб хоҳад дод! Барои оғоз кардани замимаи мо, мо танҳо бояд боварӣ ҳосил кунем, ки мо метавонем барномаи худро мустақиман аз IDEA санҷем. Барои ин, мо бояд утorтаи ngrok -ро зеркашӣ кунем. https://ngrok.com/download Ин утorта сатри фармонест, ки ба мо суроғаи муваққатӣ барои 2 соат медиҳад ва ҳама паёмҳоро ба бандари муайяншудаи serverи маҳаллӣ равона мекунад. Мо дар сатр ngrok http 5000-ро оғоз мекунем ва менависем (ё шумо метавонед бандари худро муайян кунед): Telegram bot — напоминалка через webHook на Java or скажи нет Google-календарю! - 5Мо натиҷа мегирем: Telegram bot — напоминалка через webHook на Java or скажи нет Google-календарю! - 6https://23b1a54ccbbd.ngrok.io - ин суроғаи вебхуки мост. Тавре ки шумо шояд дар файли хосиятҳое, ки мо ҳангоми оғоз кардани serverи tomcat навиштаем server.port=5000 пай бурдаед, он бандари 5000-ро ишғол мекунад, боварӣ ҳосил кунед, ки ин майдонҳо якхелаанд. Инчунин, фаромӯш накунед, ки address барои ду соат дода мешавад. Дар сатри фармон ин аз ҷониби майдони ба охир расидани сессия назорат карда мешавад. Вақте ки вақт тамом мешавад, ба шумо лозим меояд, ки дубора суроғаро гиред ва тартиби сабти онро дар телеграмма гузаред. Ҳоло мо сатрро мегирем https://api.telegram.org/bot1866835969:AAE6gJG6ptUyqhV2XX0MxyUak4QbAGGnz10/setWebhook?url=https://e9c658b548aa.ngrok.io Ва бо ҳаракатҳои дастони худамонро бо ҳаракатҳои моҳир иваз мекунем. сатри натиҷа ба браузер ва тугмаи дохил кунед. Шумо бояд натиҷаи зеринро ба даст оред: Telegram bot — напоминалка через webHook на Java or скажи нет Google-календарю! - 7Ин аст, акнун шумо метавонед барномаро иҷро кунед: Telegram bot — напоминалка через webHook на Java or скажи нет Google-календарю! - 8Санҷед, ки синфи шумо бо усули асосӣ чунин буд:
@SpringBootApplication
public class TelegramBotApplication {

   public static void main(String[] args) {
      SpringApplication.run(TelegramBotApplication.class, args);
   }
}
Агар шумо ҳама чизро дуруст иҷро карда бошед, ҳоло боти шумо ба ҳама паём бо ибораи " Салом ҷаҳон" ҷавоб медиҳад . Он гоҳ шумо метавонед бо роҳи худ равед. Агар шумо бо ман бошед ва шумо мехоҳед, ки ҳамаи қадамҳоро иҷро кунед, пас биёед ба навиштани an objectҳо барои пойгоҳи додаҳо шурӯъ кунем ва худи махзани маълумотро эҷод кунем. Биёед аз пойгоҳи додаҳо оғоз кунем: Тавре ки ман аллакай гуфта будам, ман фикр мекунам, ки шумо аллакай малакаҳои ҳадди аққал дар кор бо пойгоҳи додаҳо доред ва шумо пойгоҳи додаҳои маҳаллии postgreSQL насб кардаед , агар не, ин роҳро пайравӣ кунед. https://www.postgresql.org/download/ Дар файли application.properties, воридшавӣ ва пароли махзани маълумотро бо худатон иваз кунед. Дар IDEA дар тарафи рост ҷадвали пойгоҳи додаҳо мавҷуд аст, ки дар он шумо бояд +/Data source/PostgreSQL -ро клик кунед . Дар натиҷа, вақте ки шумо тугмаи Пайвасти санҷиширо пахш мекунед , шумо бояд натиҷаи қаноатбахш ба даст оред: Telegram bot — напоминалка через webHook на Java or скажи нет Google-календарю! - 9Акнун шумо метавонед пойгоҳи додаҳоро бо ҷадвалҳо мустақиман аз муҳити рушд эҷод кунед ё шумо метавонед интерфейси pgadmin- ро, ки дар менюи оғоз ҷойгир аст, истифода баред. Ба мо 3 ҷадвал лозим аст:
CREATE TABLE users
(
    id               INTEGER PRIMARY KEY UNIQUE NOT NULL,
    name             VARCHAR,
    time_zone        INTEGER DEFAULT 0,
    on_off           BOOLEAN DEFAULT true
);

CREATE TABLE user_events
(
    user_id INTEGER ,
    time timestamp ,
    description varchar ,
    event_id serial,
    event_freq varchar default 'TIME',
    FOREIGN KEY (user_id) REFERENCES users (id) ON DELETE CASCADE
);

CREATE TABLE event_cash
(
    time timestamp ,
    description varchar ,
    user_id INTEGER ,
    id serial
);
Ман тавсия медиҳам, ки ин скриптро алоҳида эҷод кунед; мо ба он ниёз дорем, ки дар Ҳероку пойгоҳи додаҳо эҷод кунем, то онро ду бор нанависем. Биёед каме роҳ равем. Ман дарҳол мегӯям, ки ба мо танҳо ҷадвали event_cash лозим аст , то бо Ҳероку кор кунем, бинобар хусусиятҳои он ва хоҳиши беандозаи ман барои кор бо синфи Time ; он дар versionи маҳаллӣ муфид нахоҳад буд. Дар ҷадвали корбарон мо идентификатсияи ҳисоби корбари телеграмм, номи ӯро, ки шояд вуҷуд надошта бошад, сабт хоҳем кард, минтақаи вақти корбар барои фиристодани дурусти огоҳиномаҳо, инчунин ҳолати фаъол/хомушкунии ирсоли огоҳиномаҳо ҳисоб карда мешавад. Мо ID корбар, вақти огоҳинома, тавсифро дар ҷадвали user_events сабт мекунем , ба таври худкор ID барои ҳодиса тавлид мекунем ва басомади огоҳиҳоро муқаррар мекунем. Ҷадвали event_cash огоҳиномаро пеш аз фиристодан сабт мекунад ва агар фиристода шавад, онро аз ҷадвал хориҷ мекунад. Ҷадвалҳо омодаанд, биёед an objectҳоро илова кунем.
@Entity
@Table(name = "user_events")
@Getter
@Setter
public class Event {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    @Column( name = "event_id", columnDefinition = "serial")
    private int eventId;

    @Column(name = "time")
    @NotNull(message = "Need date!")
    private Date date;

    @Column(name = "description")
    @Size(min = 4, max = 200, message = "Description must be between 0 and 200 chars!")
    private String description;

    @Column(name = "event_freq", columnDefinition = "TIME")
    @Enumerated(EnumType.STRING)
    private EventFreq freq;

    @ManyToOne(fetch=FetchType.EAGER)
    @JoinColumn(name="user_id")
    @OnDelete(action = OnDeleteAction.CASCADE)
    private User user;

    public Event() {
    }

    public Event(int eventId,
                 @NotNull(message = "Need date!") Date date,
                 @Size(min = 4, max = 200, message = "Description must be between 0 and 200 chars!")
                         String description,
                 EventFreq freq, User user) {
        this.eventId = eventId;
        this.date = date;
        this.description = description;
        this.freq = freq;
        this.user = user;
    }
}
@Entity
@Table(name = "users")
@Getter
@Setter
public class User {

    @Id
    @Column(name = "id")
    private long id;

    @Column(name = "name")
    private String name;

    @Column(name = "time_zone", columnDefinition = "default 0")
    //sets the broadcast time of events for your time zone
    private int timeZone;

    @OneToMany(mappedBy="user")
    private List<event> events;

    @Column(name = "on_off")
    // on/off send event
    private boolean on;

    public User() {
    }
}

</event>
@Entity
@Table(name = "event_cash")
@Getter
@Setter
//serves to save unhandled events after rebooting heroku
public class EventCashEntity {

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    @Column( name = "id", columnDefinition = "serial")
    private long id;

    @Column(name = "time")
    private Date date;

    @Column(name = "description")
    private String description;

    @Column(name = "user_id")
    private long userId;

    public EventCashEntity() {
    }

    public static EventCashEntity eventTo(Date date, String description, long userId) {
        EventCashEntity eventCashEntity = new EventCashEntity();
        eventCashEntity.setDate(date);
        eventCashEntity.setDescription(description);
        eventCashEntity.setUserId(userId);
        return eventCashEntity;
    }
}
Биёед нуктаҳои асосиро каме баррасӣ кунем. @Entity - синфро барои dada jpa-и мо қайд мекунад, ки ин синф як an object барои пойгоҳи додаҳо мебошад, яъне. ҳангоми дарёфти маълумот аз пойгоҳи додаҳо, он ба мо дар шакли an objectи Event, User ва EventCashEntity пешниҳод карда мешавад. @Table - мо номи ҷадвали худро дар пойгоҳи додаҳо мегӯем. Барои боварӣ ҳосил кардани он, ки номи ҷадвал бо ранги сурх хат кашида нашудааст, мо бояд дар IDEA бо варианти пешниҳодшудаи ислоҳи хато розӣ шавем ва клик кунед Таъин кардани манбаъҳои маълумот. Ва дар он ҷо пойгоҳи моро интихоб кунед. @id ва @GeneratedValue - аз ҷониби Spring барои сохтани пойгоҳи додаҳо истифода мешавад, агар он аллакай вуҷуд надошта бошад. @Column барои нишон додани номи майдонҳо дар ҷадвал истифода мешавад, агар онҳо мувофиқат накунанд, аммо қоидаҳои codeи хуб тавсия медиҳанд, ки шумо ҳамеша инро нависед. Муносибати OneToMany - Ман тавсия медиҳам, ки вақт сарф кунед ва фаҳмед, ки он дар ин ҷо чӣ аст https://en.wikibooks.org/wiki/Java_Persistence Ман инро равшантар шарҳ дода наметавонам, танҳо ба ман бовар кунед. Танҳо бигӯям, ки дар ин ҳолат шарҳи @OneToMany мегӯяд, ки як корбар метавонад рӯйдодҳои зиёде дошта бошад ва онҳо дар шакли рӯйхат ба мо пешниҳод карда мешаванд. Акнун мо бояд маълумотро аз ҷадвалҳо гирем. Дар китобхонаи SRING DATA JPA ҳама чиз аллакай барои мо навишта шудааст, мо танҳо бояд барои ҳар як ҷадвал интерфейс эҷод кунем ва онро аз JpaRepository васеъ кунем.
public interface EventRepository extends JpaRepository<event, long=""> {
    Event findByEventId(long id);
}
public interface UserRepository extends JpaRepository<user, long=""> {

    User findById(long id);
}
public interface EventCashRepository extends JpaRepository<eventcashentity, long=""> {
    EventCashEntity findById(long id);
}

</eventcashentity,></user,></event,>
Мантиқи асосии кор бо пойгоҳи додаҳо ба хидмате интиқол дода мешавад, ки ба ном Объекти дастрасии додаҳо (DAO) аст:
@Service
public class UserDAO {

    private final UserRepository userRepository;

    @Autowired
    public UserDAO(UserRepository userRepository) {
        this.userRepository = userRepository;
    }

    public User findByUserId(long id) {
        return userRepository.findById(id);
    }

    public List<user> findAllUsers() {
        return userRepository.findAll();
    }

    public void removeUser(User user) {
        userRepository.delete(user);
    }


    public void save(User user) {
        userRepository.save(user);
    }

    public boolean isExist(long id) {
        User user = findByUserId(id);
        return user != null;
    }
}
@Service
public class EventDAO {

    private final UserRepository userRepository;
    private final EventRepository eventRepository;

    @Autowired
    public EventDAO(UserRepository userRepository, EventRepository eventRepository) {
        this.userRepository = userRepository;
        this.eventRepository = eventRepository;
    }

    public List<event> findByUserId(long userId) {
        User user = userRepository.findById(userId);
        return user.getEvents();
    }
    public List<event> findAllEvent() {
       return eventRepository.findAll();
    }

    public Event findByEventId(long eventId) {
        return eventRepository.findByEventId(eventId);
    }

    public void remove(Event event) {
        eventRepository.delete(event);
    }

    public void save(Event event) {
        eventRepository.save(event);
    }
}

</event></event></user>
@Service
//handles events not dispatched after reboot heroku
public class EventCashDAO {

    private EventCashRepository eventCashRepository;

    @Autowired
    public void setEventCashRepository(EventCashRepository eventCashRepository) {
        this.eventCashRepository = eventCashRepository;
    }

    public List<eventcashentity> findAllEventCash() {
        return eventCashRepository.findAll();
    }

    public void save(EventCashEntity eventCashEntity) {
        eventCashRepository.save(eventCashEntity);
    }

    public void delete(long id) {
        eventCashRepository.deleteById(id);
    }
}

</eventcashentity>
Дар ин ҳолат, мо коркарди маълумот надорем, мо танҳо маълумотро аз ҷадвалҳо мегирем. Мо ҳама омодаем, ки рамзи пурраи синфи T elegramFacade- ро пешниҳод кунем ва ба таҳлor мантиқ шурӯъ кунем.
@Component
@FieldDefaults(level = AccessLevel.PRIVATE)
public class TelegramFacade {

    final MessageHandler messageHandler;
    final CallbackQueryHandler callbackQueryHandler;
    final BotStateCash botStateCash;

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


    public TelegramFacade(MessageHandler messageHandler, CallbackQueryHandler callbackQueryHandler, BotStateCash botStateCash) {
        this.messageHandler = messageHandler;
        this.callbackQueryHandler = callbackQueryHandler;
        this.botStateCash = botStateCash;
    }

    public BotApiMethod<!--?--> handleUpdate(Update update) {

        if (update.hasCallbackQuery()) {
            CallbackQuery callbackQuery = update.getCallbackQuery();
            return callbackQueryHandler.processCallbackQuery(callbackQuery);
        } else {

            Message message = update.getMessage();
            if (message != null && message.hasText()) {
                return handleInputMessage(message);
            }
        }
        return null;
    }

    private BotApiMethod<!--?--> handleInputMessage(Message message) {
        BotState botState;
        String inputMsg = message.getText();
        //we process messages of the main menu and any other messages
        //set state
        switch (inputMsg) {
            case "/start":
                botState = BotState.START;
                break;
            case "Мои напоминания":
                botState = BotState.MYEVENTS;
                break;
            case "Создать напоминание":
                botState = BotState.CREATE;
                break;
            case "Отключить напоминания":
            case "Включить напоминания":
                botState = BotState.ONEVENT;
                break;
            case "All users":
                if (message.getFrom().getId() == adminId)
                botState = BotState.ALLUSERS;
                else botState = BotState.START;
                break;
            case "All events":
                if (message.getFrom().getId() == adminId)
                botState = BotState.ALLEVENTS;
                else botState = BotState.START;
                break;
            default:
                botState = botStateCash.getBotStateMap().get(message.getFrom().getId()) == null?
                        BotState.START: botStateCash.getBotStateMap().get(message.getFrom().getId());
        }
        //we pass the corresponding state to the handler
        //the corresponding method will be called
        return messageHandler.handle(message, botState);

    }
}
Биёед бубинем, ки барои кадом майдонҳо лозиманд
final MessageHandler messageHandler;
    final CallbackQueryHandler callbackQueryHandler;
    final BotStateCash botStateCash;
Агар ҳамаи мо дар як синф рамзгузорӣ кунем, пас мо бо пойпӯши пой ба моҳ мерасем; аз ин рӯ, мо мантиқи кор бо паёмҳои матниро ба синфи MessageHandler ва мантиқи кор бо паёмҳои бозпас даъватро ба синфи CallbackQueryHandler таъин мекунем . Вақти он расидааст, ки фаҳмед, ки allbackquery чист ва кадом намуди менюҳо мавҷуданд. Барои ин ман ба шумо тасвири дигари интерфейси ботро медиҳам: Telegram bot — напоминалка через webHook на Java or скажи нет Google-календарю! - 10Ду намуди менюҳо мавҷуданд. Онҳое, ки дар поёни тиреза замима шудаанд - менюи асосӣ ва онҳое, ки ба паём таъин шудаанд, масалан, тугмаҳои нест кардан, таҳрир кардан, тағир додани камар. Вақте ки шумо тугмаи менюи асосиро пахш мекунед, паёми ҳамон ном фиристода мешавад, масалан, вақте ки шумо "Ёддоштҳои ман" -ро пахш мекунед, матни "Ёддоштҳои ман" танҳо фиристода мешавад . Ва хангоми насби клавиатураи занги такрорӣ барои ҳар як тугма арзиши мушаххас муқаррар карда мешавад ва арзиши он бидуни намоиши он дар экран фиристода мешавад. Минбаъд мо майдони BotStateCash дорем . Ин як синфи махсус офарида шудааст, ки ҳолати бот назорат хоҳад кард, ва диққати, ин як унсури мураккаб аст, шумо бояд ба шиддат. Шумораи аломатҳо зиёд шуд, ки дар омади гап, дар ҳеҷ куҷо навишта нашудааст)). Пас, ин ҷо пайванд ба қисми дуюм аст
Шарҳҳо
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION