JavaRush /Java Blog /Random-ID /Bot Telegram - pengingat melalui webHook di Java atau kat...
Vladimir Popov
Level 41

Bot Telegram - pengingat melalui webHook di Java atau katakan tidak pada kalender Google! Bagian 1

Dipublikasikan di grup Random-ID
Nama saya Vladimir. Saya berumur 43 tahun. Dan jika Anda, pembaca, berusia di atas 40 tahun, maka ya, setelah usia 40 tahun Anda bisa menjadi seorang programmer jika Anda menyukainya. Pekerjaan saya tidak ada hubungannya sama sekali dengan pemrograman, saya seorang manajer proyek di bidang otomasi dan sebagainya. Tapi saya berencana untuk mengubah pekerjaan saya. Oh, tren baru ini... ubah bidang aktivitas Anda setiap 5-7 tahun. Jadi : Proyeknya ternyata cukup besar, sehingga beberapa poin harus dihilangkan atau dibicarakan secara singkat, dengan harapan pembaca mengetahui cara menggunakan Google. Internet penuh dengan publikasi bot telegram yang bekerja berdasarkan prinsip Long polling. Dan sangat sedikit yang bekerja dengan prinsip Webhook. Apa itu? Polling panjang - ini berarti aplikasi Anda sendiri akan melakukan polling ke server telegram untuk pesan pada frekuensi tertentu, secara perlahan. Webhook - berarti server telegram akan langsung mengarahkan pesan ke server yang Anda tentukan. Dalam kasus kami, berkat layanan Heroku. Tentu saja, Anda dapat membaca lebih lanjut tentang semua ini dan tentang bot secara umum di situs web Telegram - https://tlgrm.ru/docs/bots/api Antarmuka bot terlihat seperti ini: Bot Telegram - pengingat melalui webHook di Java atau katakan tidak pada kalender Google!  - 1 Saya menganggap aplikasi ini justru sebagai pelatihan proyek karena saat menulis saya belajar lebih banyak informasi dari bot ini daripada saat pelatihan. Apakah Anda ingin belajar memprogram? Mulai menulis kode!!! Tetapi! Tidak akan ada petunjuk rinci tentang cara mengunggah aplikasi ke github atau cara membuat database. Ada banyak hal seperti ini di Internet dan dijelaskan dengan sangat rinci; selain itu, bacaannya akan sangat panjang. Aplikasi akan bekerja sebagai berikut: Masukkan deskripsi acara, masukkan tanggal dan waktu acara, pilih frekuensi (Anda dapat melakukannya sekali, Anda dapat memiliki pengingat setiap hari pada waktu tertentu, Anda dapat memilikinya sekali sebulan pada waktu tertentu, atau setahun sekali). Variasi notifikasi bisa ditambahkan tanpa henti, saya punya banyak ide. Selanjutnya, data yang dimasukkan disimpan ke dalam database (juga diterapkan secara gratis di Heroku, 10.000 baris gratis) Kemudian, di awal hari pada pukul 0:00 waktu server, Spring mengambil dari database semua peristiwa berdasarkan kriteria yang harus diaktifkan pada hari itu dan mengirimkannya untuk dieksekusi pada waktu yang ditentukan. PERHATIAN!!! BAGIAN DARI PROGRAM INI ADALAH EKSPERIMENTAL! ADA IMPLEMENTASI YANG LEBIH SEDERHANA DAN BENAR! INI DILAKUKAN SECARA KHUSUS UNTUK MELIHAT CARA KERJA KELAS WAKTU! Anda dapat menyentuh bot yang berfungsi dengan tangan Anda sendiri dengan mengetik @calendar_event_bot di keranjang, tapi jangan mengandalkannya, karena saya masih mengolok-oloknya. kode - https://github.com/papoff8295/webHookBotForHabr Pada dasarnya, untuk meluncurkan milik Anda sendiri, Anda perlu melakukan langkah-langkah berikut: • Daftar ke @Botfather , tidak sulit, dapatkan token dan nama • Fork proyek di github • Daftar di Heroku, buat aplikasi (kami akan membahasnya langkah demi langkah), terapkan dari repositori Anda. • Buat database di Heroku • Ganti kolom terkait di repositori dengan milik Anda sendiri (token, nama tabel dalam entitas, webHookPath, nama pengguna, kata sandi, dan jalur ke database, semuanya akan diurai) • Jadikan Heroku berfungsi 24/ 7 menggunakan https:/ /uptimerobot.com/ Struktur akhir proyek adalah sebagai berikut: Bot Telegram - pengingat melalui webHook di Java atau katakan tidak pada kalender Google!  - 2 Mari kita mulai dengan membuat proyek di https://start.spring.io Pilih dependensi yang kita perlukan seperti yang ditunjukkan pada gambar: Bot Telegram - pengingat melalui webHook di Java atau katakan tidak pada kalender Google!  - 3Pilih dependensi kita sendiri nama untuk proyek dan klik Hasilkan . Selanjutnya Anda akan diminta untuk menyimpan proyek ke disk Anda. Yang tersisa hanyalah membuka file pom.xm l dari lingkungan pengembangan Anda. Ada proyek yang sudah selesai di depan Anda. Sekarang kita hanya perlu menambahkan perpustakaan utama kita. Saya menggunakan perpustakaan dari https://github.com/rubenlagus/TelegramBots Secara umum, Anda bisa bingung dan melakukannya tanpa itu. Lagi pula, inti dari pekerjaan ini adalah menggabungkan URL seperti ini: https://api.telegram.org/bot1866835969:AAE6gJG6ptUyqhV2XX0MxyUak4QbAGGnz10/setWebhook?url=https://e9c658b548aa.ngrok.io Mari kita lihat sedikit : https://api.telegram.org – server telegram. bot1866835969:AAE6gJG6ptUyqhV2XX0MxyUak4QbAGGnz10/ - setelah kata bot adalah token rahasia yang Anda terima saat mendaftarkan bot. setWebhook?url=https://e9c658b548aa.ngrok.io – nama metode dan parameternya. Dalam hal ini, kami menginstal server webhook Anda, semua pesan akan dikirim ke sana. Secara umum, saya memutuskan bahwa proyek ini tidak terlalu kecil untuk dipublikasikan, tetapi dengan implementasi manual secara umum proyek tersebut tidak dapat dibaca. Jadi, tampilan akhir file pomnya adalah :
<!--?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>
Semuanya siap untuk menulis bot kami. Mari buat kelas TelegramBot . Saya tidak akan menulis nama foldernya, Anda dapat melihatnya pada struktur proyek 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 ini memperluas SpringWebhookBot dari perpustakaan telegram kami, dan kami hanya perlu mengimplementasikan satu metode, onWebhookUpdateReceived . Ia menerima JSON yang diurai sebagai objek Pembaruan dan mengembalikan apa yang ingin “didengar” oleh server telegram dari kami. Di sini kami memiliki anotasi dari perpustakaan Lombok . Lombok – membuat hidup seorang programmer lebih mudah!! Ya, itu. kita tidak perlu mendefinisikan ulang getter dan setter, Lombok melakukan ini untuk kita, dan kita juga tidak perlu menulis pengenal tingkat akses. Tidak ada gunanya lagi menulis bahwa ini dilakukan dengan anotasi @Getter, @Setter, @FieldDefaults. Bidang botPath berarti alamat webhook kita, yang akan kita terima di Heroku nanti. Bidang botUsername berarti nama bot kita, yang akan kita terima saat mendaftarkan bot kita di Telegram. Bidang botToken adalah token kami, yang akan kami terima saat mendaftarkan bot kami di Telegram. Bidang telegramFacade adalah kelas kita di mana pemrosesan pesan akan berlangsung, kita akan kembali ke sana nanti, biarlah berwarna merah untuk saat ini. Sekarang saatnya kita menghubungi @Botfather dan mendapatkan botToken dan botUsername yang diidam-idamkan. Bot Telegram - pengingat melalui webHook di Java atau katakan tidak pada kalender Google!  - 4Tulis saja padanya di telegram dan dia akan menceritakan semuanya padamu. Kita tuliskan datanya ke application.properties kita, pada akhirnya akan terlihat 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 dikonfigurasi untuk bekerja dengan database lokal; nanti kami akan melakukan perubahan yang diperlukan. Ganti botToken dan nama pengguna dengan milik Anda sendiri. Tidak baik menggunakan data dari application.properties langsung di aplikasi. Mari kita buat kelas bean atau wrapper dari 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 menginisialisasi baris yang sesuai dari file application.properties, yang diketahui Spring secara default. Dan anotasi @Component membuat Bean untuk kita saat aplikasi dimulai. Sekarang mari kita lihat file 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;
    }
}
Tidak ada keajaiban di sini; saat startup, Spring membuat objek SetWebhook dan TelegramBot untuk kita. Sekarang mari kita buat titik masuk untuk pesan kita:
@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();
    }
}
Server Telegram mengirimkan pesan dalam format JSON ke alamat webhook terdaftar menggunakan metode POST, pengontrol kami menerimanya dan mengirimkannya ke perpustakaan telegram dalam bentuk objek Pembaruan. Saya melakukan metode get begitu saja) Sekarang kita hanya perlu menerapkan beberapa logika untuk memproses pesan dan tanggapan di kelas TelegramFacade , saya akan memberikan kode singkatnya sehingga Anda dapat meluncurkan aplikasi dan kemudian melanjutkan sendiri atau beralih ke penerapan di Heroku, maka itu akan menjadi versi lengkap:
@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;
    }

}
Metode ini akan merespons Hello world! Untuk meluncurkan aplikasi kita, kita hanya perlu memastikan bahwa kita dapat menguji aplikasi kita langsung dari IDEA. Untuk melakukan ini, kita perlu mengunduh utilitas ngrok. https://ngrok.com/download Utilitas ini adalah baris perintah yang memberi kita alamat sementara selama 2 jam dan mengalihkan semua pesan ke port yang ditentukan di server lokal. Kami meluncurkan dan menulis ngrok http 5000 di baris (atau Anda dapat menentukan port Anda): Bot Telegram - pengingat melalui webHook di Java atau katakan tidak pada kalender Google!  - 5Kami mendapatkan hasilnya: Bot Telegram - pengingat melalui webHook di Java atau katakan tidak pada kalender Google!  - 6https://23b1a54ccbbd.ngrok.io - ini adalah alamat webhook kami. Seperti yang mungkin Anda perhatikan di file properti yang kami tulis server.port=5000 saat memulai server Tomcat, itu akan menempati port 5000, pastikan bidang ini sama. Juga, jangan lupa bahwa alamatnya diberikan selama dua jam. Pada baris perintah, ini dipantau oleh bidang Sesi Kedaluwarsa. Ketika waktu habis, Anda perlu mendapatkan alamatnya lagi dan menjalani prosedur pendaftarannya di telegram. Sekarang kita ambil baris https://api.telegram.org/bot1866835969:AAE6gJG6ptUyqhV2XX0MxyUak4QbAGGnz10/setWebhook?url=https://e9c658b548aa.ngrok.io Dan dengan gerakan tangan yang cekatan kita ganti tokennya dengan milik kita, urlnya dengan milik kita, paste baris yang dihasilkan ke browser dan klik enter. Anda akan mendapatkan hasil sebagai berikut: Bot Telegram - pengingat melalui webHook di Java atau katakan tidak pada kalender Google!  - 7Selesai, sekarang Anda dapat menjalankan aplikasi: Bot Telegram - pengingat melalui webHook di Java atau katakan tidak pada kalender Google!  - 8Periksa apakah kelas Anda dengan metode main seperti ini:
@SpringBootApplication
public class TelegramBotApplication {

   public static void main(String[] args) {
      SpringApplication.run(TelegramBotApplication.class, args);
   }
}
Jika Anda melakukan semuanya dengan benar, sekarang bot Anda akan merespons pesan apa pun dengan frasa “ Halo dunia” . Lalu kamu bisa menempuh jalanmu sendiri. Jika Anda bersama saya dan tertarik untuk menjalani semua langkahnya, mari mulai menulis entitas untuk database dan membuat database itu sendiri. Mari kita mulai dengan database: Seperti yang sudah saya katakan, saya berasumsi Anda sudah memiliki keterampilan minimal dalam bekerja dengan database, dan Anda telah menginstal database postgreSQL lokal , jika belum, ikuti jalur ini. https://www.postgresql.org/download/ Di file application.properties, ganti login database dan kata sandi dengan milik Anda sendiri. Di IDEA ada tab database di sebelah kanan, di dalamnya Anda perlu mengklik +/Data source/PostgreSQL . Hasilnya, ketika Anda mengklik Uji Koneksi, Anda akan mendapatkan hasil yang memuaskan: Bot Telegram - pengingat melalui webHook di Java atau katakan tidak pada kalender Google!  - 9Sekarang Anda dapat membuat database dengan tabel langsung dari lingkungan pengembangan, atau Anda dapat menggunakan antarmuka web pgadmin , yang terletak di menu mulai. Kami membutuhkan 3 tabel:
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 sarankan membuat skrip ini secara terpisah, kita memerlukannya untuk membuat database di Heroku, agar tidak menulisnya dua kali. Mari kita berjalan sedikit. Saya akan segera mengatakan bahwa kita hanya memerlukan tabel event_cash untuk bekerja dengan Heroku karena spesifiknya dan keinginan saya yang tak terpuaskan untuk bekerja dengan kelas Time ; itu tidak akan berguna dalam versi lokal. Pada tabel pengguna kita akan mencatat id akun pengguna telegram, namanya yang mungkin tidak ada, zona waktu pengguna akan dihitung kebenaran pengiriman notifikasi, serta status on/off pengiriman notifikasi. Kami akan mencatat id pengguna, waktu notifikasi, deskripsi di tabel user_events , secara otomatis menghasilkan id untuk acara tersebut, dan mengatur frekuensi notifikasi. Tabel event_cash akan mencatat notifikasi sebelum dikirim dan, jika terkirim, menghapusnya dari tabel. Tabel sudah siap, sekarang mari tambahkan entitas.
@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 membahas poin utamanya sedikit. @Entity – menandai kelas untuk dada jpa kita bahwa kelas ini adalah entitas untuk database, mis. saat mengambil data dari database, data tersebut akan disajikan kepada kita dalam bentuk objek Event, User, dan EventCashEntity. @Table – kami menyebutkan nama tabel kami di database. Untuk memastikan bahwa nama tabel tidak digarisbawahi dengan warna merah, kita perlu menyetujui IDEA dengan opsi koreksi kesalahan yang diusulkan dan klik Tetapkan sumber data. Dan pilih basis kami di sana. @id dan @GeneratedValue - digunakan oleh Spring untuk membuat database jika belum ada. @Kolom digunakan untuk menunjukkan nama bidang dalam tabel jika tidak cocok, tetapi aturan kode yang baik menyarankan Anda selalu menulis ini. Sikap OneToMany - Saya sarankan meluangkan waktu dan mencari tahu apa yang ada di sini https://en.wikibooks.org/wiki/Java_Persistence Saya tidak bisa menjelaskannya lebih jelas, percayalah. Izinkan saya mengatakan bahwa dalam hal ini anotasi @OneToMany mengatakan bahwa satu pengguna dapat memiliki banyak acara, dan acara tersebut akan diberikan kepada kami dalam bentuk daftar. Sekarang kita perlu mengambil data dari tabel. Di perpustakaan SRING DATA JPA semuanya sudah ditulis untuk kita, kita hanya perlu membuat antarmuka untuk setiap tabel dan memperluasnya 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,>
Logika utama untuk bekerja dengan database ditransfer ke layanan, yang disebut Data Access Object (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 hal ini, kami tidak melakukan pemrosesan data apa pun, kami hanya mengambil data dari tabel. Kami semua siap memberikan kode lengkap kelas T telegramFacade dan mulai menganalisis logikanya.
@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 kita lihat bidang apa saja yang dibutuhkan
final MessageHandler messageHandler;
    final CallbackQueryHandler callbackQueryHandler;
    final BotStateCash botStateCash;
Jika kita semua membuat kode dalam satu kelas, maka kita akan berakhir dengan alas kaki ke bulan; oleh karena itu, kita menetapkan logika untuk bekerja dengan pesan teks ke kelas MessageHandler , dan logika untuk bekerja dengan pesan callbackquery ke kelas CallbackQueryHandler . Saatnya mencari tahu apa itu allbackquery dan jenis menu apa yang ada. Untuk melakukan ini, saya akan memberikan gambaran lain tentang antarmuka bot: Bot Telegram - pengingat melalui webHook di Java atau katakan tidak pada kalender Google!  - 10Ada dua jenis menu. Yang dilampirkan di bagian bawah jendela adalah menu utama, dan yang ditetapkan untuk pesan, misalnya, tombol hapus, edit, ubah sabuk. Saat Anda mengklik tombol menu utama, pesan dengan nama yang sama akan terkirim, misalnya saat Anda mengklik “Pengingat Saya” , teks “Pengingat Saya” akan terkirim begitu saja . Dan saat memasang keyboard callbackquery, nilai tertentu ditetapkan untuk setiap tombol dan nilainya akan dikirim tanpa menampilkannya di layar. Selanjutnya kita memiliki bidang BotStateCash . Ini adalah kelas yang dibuat khusus yang akan memantau keadaan bot, dan perhatian, ini adalah elemen yang kompleks, Anda perlu berusaha keras. Jumlah karakter telah terlampaui, yang tidak ditulis di mana pun)). Jadi, inilah tautan ke bagian kedua
Komentar
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION