JavaRush /Blog Java /Random-MS /Bot Telegram - peringatan melalui webHook di Java atau ka...

Bot Telegram - peringatan melalui webHook di Java atau katakan tidak kepada kalendar Google! Bahagian 1

Diterbitkan dalam kumpulan
Nama saya Vladimir. Saya berumur 43 tahun. Dan jika anda, pembaca, berumur lebih dari 40, maka ya, selepas 40 anda boleh menjadi seorang pengaturcara jika anda suka. Kerja saya langsung tiada kaitan dengan pengaturcaraan, saya seorang pengurus projek dalam bidang automasi dan semua itu. Tetapi saya merancang untuk menukar pekerjaan saya. Oh, trend baharu ini... tukar bidang aktiviti anda setiap 5-7 tahun. Jadi : Projek itu ternyata agak besar, jadi beberapa perkara perlu ditinggalkan atau dibincangkan secara ringkas, dengan harapan pembaca tahu cara Google. Internet penuh dengan penerbitan bot telegram yang bekerja pada prinsip tinjauan panjang. Dan terdapat sangat sedikit yang bekerja pada prinsip Webhook. Apa ini? Tinjauan panjang - ini bermakna aplikasi anda sendiri akan meninjau pelayan telegram untuk mesej pada frekuensi tertentu, perlahan-lahan. Webhook - bermakna pelayan telegram akan mengubah hala mesej dengan serta-merta ke pelayan yang anda tentukan. Dalam kes kami, ihsan perkhidmatan Heroku. Anda boleh, tentu saja, membaca lebih lanjut mengenai semua ini dan tentang bot secara umum di laman web Telegram - https://tlgrm.ru/docs/bots/api Antara muka bot kelihatan seperti ini: Bot Telegram - peringatan melalui webHook di Java atau katakan tidak kepada kalendar Google!  - 1 Saya menganggap aplikasi ini tepat sebagai latihan projek atas sebab semasa menulis saya belajar lebih banyak maklumat daripada bot ini daripada semasa latihan. Adakah anda ingin belajar berprogram? Mula menulis kod!!! Tetapi! Tidak akan ada arahan terperinci tentang cara memuat naik aplikasi ke github atau cara membuat pangkalan data. Terdapat banyak perkara ini di Internet dan ia diterangkan dengan terperinci; selain itu, ia akan menjadi bacaan yang sangat panjang. Aplikasi akan berfungsi seperti berikut: Masukkan penerangan acara, masukkan tarikh dan masa acara, pilih kekerapan (anda boleh melakukannya sekali, anda boleh mempunyai peringatan setiap hari pada masa tertentu, anda boleh melakukannya sekali sebulan pada masa tertentu, atau sekali setahun). Variasi pemberitahuan boleh ditambah tanpa henti; Saya mempunyai banyak idea. Seterusnya, data yang dimasukkan disimpan ke dalam pangkalan data (juga digunakan secara percuma pada Heroku, 10,000 baris adalah percuma) Kemudian, sekali pada awal hari pada 0:00 waktu pelayan, Spring mengambil daripada pangkalan data semua acara berdasarkan kriteria yang sepatutnya menembak pada hari itu dan menghantar mereka untuk dilaksanakan pada masa yang ditetapkan. PERHATIAN!!! BAHAGIAN PROGRAM INI ADALAH EKSPERIMEN! ADA PELAKSANAAN YANG LEBIH MUDAH DAN BENAR! INI DIBUAT KHUSUS UNTUK MELIHAT BAGAIMANA KELAS MASA BERFUNGSI! Anda boleh menyentuh bot yang berfungsi dengan tangan anda sendiri dengan menaip @calendar_event_bot dalam troli, tetapi jangan bergantung padanya, kerana saya masih mengejeknya. kod - https://github.com/papoff8295/webHookBotForHabr Pada asasnya, untuk melancarkan anda sendiri, anda perlu mengambil langkah berikut: • Daftar dengan @BotFather , tidak sukar, dapatkan token dan nama • Fork projek di github • Daftar pada Heroku, buat aplikasi (kami akan melaluinya langkah demi langkah), gunakan dari repositori anda. • Buat pangkalan data pada Heroku • Gantikan medan yang sepadan dalam repositori dengan anda sendiri (token, nama jadual dalam entiti, webHookPath, nama pengguna, kata laluan dan laluan ke pangkalan data, ini semua akan dihuraikan) • Jadikan Heroku berfungsi 24/ 7 menggunakan https:/ /uptimerobot.com/ Struktur akhir projek adalah seperti berikut: Bot Telegram - peringatan melalui webHook di Java atau katakan tidak kepada kalendar Google!  - 2 Mari kita mulakan dengan mencipta projek dalam https://start.spring.io Pilih dependensi yang kita perlukan seperti yang ditunjukkan dalam rajah: Bot Telegram - peringatan melalui webHook di Java atau katakan tidak kepada kalendar Google!  - 3Pilih sendiri nama untuk projek dan klik Jana . Kemudian anda akan digesa untuk menyimpan projek ke cakera anda. Apa yang tinggal ialah membuka fail pom.xm l dari persekitaran pembangunan anda. Terdapat projek siap di hadapan anda. Sekarang kita hanya perlu menambah perpustakaan utama kita. Saya menggunakan perpustakaan dari https://github.com/rubenlagus/TelegramBots Secara umum, anda boleh keliru dan melakukannya tanpanya. Lagipun, tujuan keseluruhan kerja adalah untuk menggabungkan URL seperti ini: https://api.telegram.org/bot1866835969:AAE6gJG6ptUyqhV2XX0MxyUak4QbAGGnz10/setWebhook?url=https://e9c658b548aa.s look at it a little. : https://api.telegram.org – pelayan telegram. bot1866835969:AAE6gJG6ptUyqhV2XX0MxyUak4QbAGGnz10/ - selepas perkataan bot ialah token rahsia yang anda terima semasa mendaftar bot. setWebhook?url=https://e9c658b548aa.ngrok.io – nama kaedah dan parameternya. Dalam kes ini, kami memasang pelayan webhook anda, semua mesej akan dihantar kepadanya. Secara umum, saya memutuskan bahawa projek itu tidak terlalu kecil untuk diterbitkan, tetapi dengan pelaksanaan manual ia tidak boleh dibaca secara amnya. Jadi, rupa akhir fail pom ialah:
<!--?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>
Segala-galanya bersedia untuk menulis bot kami. Mari buat kelas TelegramBot . Saya tidak akan menulis nama folder, anda boleh melihatnya dalam struktur projek di atas.
@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);
    }
}
Kelas memanjangkan SpringWebhookBot daripada perpustakaan telegram kami dan kami hanya perlu melaksanakan satu kaedah, onWebhookUpdateReceived . Ia menerima JSON yang dihuraikan sebagai objek Kemas kini dan mengembalikan perkara yang ingin "didengar" oleh pelayan telegram daripada kami. Di sini kami mempunyai anotasi daripada perpustakaan Lombok . Lombok – menjadikan kehidupan seorang pengaturcara lebih mudah!! Nah, begitulah. kami tidak perlu mentakrifkan semula getter dan setter, Lombok melakukan ini untuk kami, dan kami juga tidak perlu menulis pengecam tahap akses. Ia tidak lagi berbaloi untuk menulis bahawa ini dilakukan oleh anotasi @Getter, @Setter, @FieldDefaults Medan botPath bermaksud alamat webhook kami, yang akan kami terima pada Heroku kemudian. Medan botUsername bermaksud nama bot kami, yang akan kami terima apabila mendaftar bot kami di Telegram. Medan botToken ialah token kami, yang akan kami terima apabila mendaftar bot kami di Telegram. Medan telegramFacade adalah kelas kami di mana pemprosesan mesej akan berlaku, kami akan kembali kepadanya sedikit kemudian, biarkan ia menjadi merah buat masa ini. Kini tiba masanya untuk kami menghubungi @BotFather dan mendapatkan botToken dan botUsername yang diidamkan. Bot Telegram - peringatan melalui webHook di Java atau katakan tidak kepada kalendar Google!  - 4Tulis sahaja kepadanya di telegram dan dia akan memberitahu anda segala-galanya. Kami menulis data ke application.properties kami, pada akhirnya ia akan kelihatan seperti ini:
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
Konfigurasi ini dikonfigurasikan untuk berfungsi dengan pangkalan data tempatan; kemudian kami akan membuat perubahan yang diperlukan. Gantikan botToken dan nama pengguna dengan anda sendiri. Tidak baik menggunakan data daripada application.properties terus dalam aplikasi. Mari buat kelas kacang atau pembungkus daripada data ini.
@Component
@Getter
@FieldDefaults(level = AccessLevel.PRIVATE)

public class TelegramBotConfig {
    @Value("${telegrambot.webHookPath}")
    String webHookPath;
    @Value("${telegrambot.userName}")
    String userName;
    @Value("${telegrambot.botToken}")
    String botToken;
Di sini anotasi @Value memulakan baris yang sepadan daripada fail application.properties, yang Spring tahu secara lalai. Dan anotasi @Component mencipta Bean untuk kami apabila aplikasi bermula. Sekarang mari kita beralih ke fail konfigurasi 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;
    }
}
Tiada keajaiban di sini; pada permulaan, Spring mencipta objek SetWebhook dan TelegramBot untuk kami. Sekarang mari kita buat titik masuk untuk mesej kami:
@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();
    }
}
Pelayan Telegram menghantar mesej dalam format JSON ke alamat webhook berdaftar menggunakan kaedah POST, pengawal kami menerimanya dan menghantarnya ke perpustakaan telegram dalam bentuk objek Kemas kini. Saya melakukan kaedah get begitu sahaja) Sekarang kita hanya perlu melaksanakan beberapa logik untuk memproses mesej dan respons dalam kelas TelegramFacade , saya akan memberikan kod ringkasnya supaya anda boleh melancarkan aplikasi dan kemudian pergi dengan cara anda sendiri atau beralih untuk menggunakan pada Heroku, maka ia akan menjadi versi penuh:
@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;
    }

}
Kaedah ini akan bertindak balas kepada mana-mana Hello world! Untuk melancarkan aplikasi kami, kami hanya perlu memastikan bahawa kami boleh menguji aplikasi kami terus daripada IDEA. Untuk melakukan ini, kita perlu memuat turun utiliti ngrok. https://ngrok.com/download Utiliti ini ialah baris arahan yang memberi kami alamat sementara selama 2 jam dan mengubah hala semua mesej ke port tertentu pelayan tempatan. Kami melancarkan dan menulis ngrok http 5000 dalam baris (atau anda boleh menentukan port anda): Bot Telegram - peringatan melalui webHook di Java atau katakan tidak kepada kalendar Google!  - 5Kami mendapat hasilnya: Bot Telegram - peringatan melalui webHook di Java atau katakan tidak kepada kalendar Google!  - 6https://23b1a54ccbbd.ngrok.io - ini alamat webhook kami. Seperti yang anda perhatikan dalam fail sifat yang kami tulis server.port=5000 semasa memulakan pelayan tomcat, ia akan menduduki port 5000, pastikan medan ini adalah sama. Juga, jangan lupa bahawa alamat diberikan selama dua jam. Pada baris arahan, ini dipantau oleh medan Sesi Tamat Tempoh. Apabila masa tamat, anda perlu mendapatkan alamat sekali lagi dan melalui prosedur mendaftarkannya di telegram. Sekarang kami mengambil talian https://api.telegram.org/bot1866835969:AAE6gJG6ptUyqhV2XX0MxyUak4QbAGGnz10/setWebhook?url=https://e9c658b548aa.ngrok.io Dan dengan pergerakan tangan yang cekap, kami menggantikan token dengan milik kami, tampal token kami dengan milik kami. baris yang terhasil ke dalam pelayar dan klik enter. Anda sepatutnya mendapat hasil berikut: Bot Telegram - peringatan melalui webHook di Java atau katakan tidak kepada kalendar Google!  - 7Itu sahaja, kini anda boleh menjalankan aplikasi: Bot Telegram - peringatan melalui webHook di Java atau katakan tidak kepada kalendar Google!  - 8Semak bahawa kelas anda dengan kaedah utama adalah seperti ini:
@SpringBootApplication
public class TelegramBotApplication {

   public static void main(String[] args) {
      SpringApplication.run(TelegramBotApplication.class, args);
   }
}
Jika anda melakukan semuanya dengan betul, kini bot anda akan membalas sebarang mesej dengan frasa “ Hello world” . Kemudian anda boleh pergi dengan cara anda sendiri. Jika anda bersama saya dan anda berminat untuk melalui semua langkah, maka mari mula menulis entiti untuk pangkalan data dan mencipta pangkalan data itu sendiri. Mari kita mulakan dengan pangkalan data: Seperti yang telah saya katakan, saya menganggap bahawa anda sudah mempunyai kemahiran minimum dalam bekerja dengan pangkalan data, dan anda mempunyai pangkalan data postgreSQL tempatan yang dipasang , jika tidak, ikuti laluan ini. https://www.postgresql.org/download/ Dalam fail application.properties, gantikan log masuk pangkalan data dan kata laluan anda sendiri. Dalam IDEA terdapat tab pangkalan data di sebelah kanan, di dalamnya anda perlu mengklik pada +/Sumber data/PostgreSQL . Akibatnya, apabila anda mengklik pada Sambungan Ujian, anda sepatutnya mendapat hasil yang memuaskan: Bot Telegram - peringatan melalui webHook di Java atau katakan tidak kepada kalendar Google!  - 9Kini anda boleh mencipta pangkalan data dengan jadual terus dari persekitaran pembangunan, atau anda boleh menggunakan antara muka web pgadmin , yang terletak dalam menu mula. Kami memerlukan 3 jadual:
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
);
Saya mengesyorkan mencipta skrip ini secara berasingan; kami memerlukannya untuk mencipta pangkalan data pada Heroku, supaya tidak menulisnya dua kali. Jom jalan sikit. Saya akan katakan dengan segera bahawa kami hanya memerlukan jadual event_cash untuk berfungsi dengan Heroku kerana spesifikasinya dan keinginan saya yang tidak pernah puas untuk bekerja dengan kelas Masa ; ia tidak akan berguna dalam versi tempatan. Dalam jadual pengguna kami akan merekodkan id akaun pengguna telegram, namanya, yang mungkin tidak wujud, zon waktu pengguna akan dikira untuk penghantaran pemberitahuan yang betul, serta status hidup /mati penghantaran pemberitahuan. Kami akan merekodkan id pengguna , masa pemberitahuan, perihalan dalam jadual user_events , menjana id untuk acara secara automatik dan menetapkan kekerapan pemberitahuan. Jadual event_cash akan merekodkan pemberitahuan sebelum ia dihantar dan, jika dihantar, keluarkannya daripada jadual. Jadual sudah sedia, mari kita tambah entiti.
@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;
    }
}
Mari kita bincangkan sedikit perkara utama. @Entity – menandakan kelas untuk dada jpa kami bahawa kelas ini ialah entiti untuk pangkalan data, i.e. apabila mendapatkan semula data daripada pangkalan data, ia akan dibentangkan kepada kami dalam bentuk objek Event, User dan EventCashEntity. @Jadual – kami menyebut nama jadual kami dalam pangkalan data. Untuk memastikan nama jadual tidak digariskan dengan warna merah, kami perlu bersetuju dengan IDEA dengan pilihan pembetulan ralat yang dicadangkan dan klik Berikan sumber data. Dan pilih pangkalan kami di sana. @id dan @GeneratedValue - digunakan oleh Spring untuk mencipta pangkalan data jika ia belum wujud. @Column digunakan untuk menunjukkan nama medan dalam jadual jika ia tidak sepadan, tetapi peraturan kod yang baik mengesyorkan anda sentiasa menulis ini. Sikap OneToMany - Saya syorkan untuk meluangkan masa dan memikirkan apa yang ada di sini https://en.wikibooks.org/wiki/Java_Persistence Saya tidak dapat menerangkannya dengan lebih jelas, percayalah. Biar saya katakan dalam kes ini anotasi @OneToMany mengatakan bahawa seorang pengguna boleh mempunyai banyak acara, dan ia akan diberikan kepada kami dalam bentuk senarai. Sekarang kita perlu mendapatkan data daripada jadual. Dalam perpustakaan SRING DATA JPA semuanya telah ditulis untuk kami, kami hanya perlu mencipta antara muka untuk setiap jadual dan memanjangkannya dari 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,>
Logik utama untuk bekerja dengan pangkalan data dipindahkan ke perkhidmatan, yang dipanggil Objek Akses Data (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>
Dalam kes ini, kami tidak mempunyai sebarang pemprosesan data, kami hanya mengambil data daripada jadual. Kami semua bersedia untuk menyediakan kod lengkap kelas T elegramFacade dan mula menganalisis logik.
@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);

    }
}
Mari lihat bidang apa yang diperlukan
final MessageHandler messageHandler;
    final CallbackQueryHandler callbackQueryHandler;
    final BotStateCash botStateCash;
Jika kita semua kod dalam satu kelas, maka kita akan berakhir dengan alas kaki ke bulan; oleh itu, kita menetapkan logik untuk bekerja dengan mesej teks kepada kelas MessageHandler dan logik untuk bekerja dengan mesej panggilan balik kepada kelas CallbackQueryHandler . Sudah tiba masanya untuk mengetahui apa itu allbackquery dan jenis menu yang ada. Untuk melakukan ini, saya akan memberikan anda satu lagi gambar antara muka bot: Telegram bot — напоминалка через webHook на Java or скажи нет Google-календарю! - 10Terdapat dua jenis menu. Mereka yang dilampirkan ke bahagian bawah tetingkap - menu utama, dan mereka yang diberikan kepada mesej, sebagai contoh, padam, edit, tukar butang tali pinggang. Apabila anda mengklik pada butang menu utama, mesej dengan nama yang sama dihantar, sebagai contoh, apabila anda mengklik "Peringatan Saya" , teks "Peringatan Saya" hanya akan dihantar . Dan apabila memasang papan kekunci pertanyaan balik, nilai tertentu ditetapkan untuk setiap butang dan nilainya akan dihantar tanpa memaparkannya pada skrin. Seterusnya kita mempunyai medan BotStateCash . Ini adalah kelas yang dicipta khas yang akan memantau keadaan bot, dan perhatian, ini adalah elemen yang kompleks, anda perlu ketegangan. Bilangan aksara telah melebihi, yang, dengan cara itu, tidak ditulis di mana-mana)). Jadi inilah pautan ke bahagian dua
Komen
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION