JavaRush /Blog Jawa /Random-JV /Telegram bot - pangeling liwat webHook ing Jawa utawa ngo...

Telegram bot - pangeling liwat webHook ing Jawa utawa ngomong ora menyang tanggalan Google! Bagean 1

Diterbitake ing grup
Jenengku Vladimir. Aku 43 taun. Lan yen sampeyan, maca, luwih saka 40, banjur ya, sawise 40 sampeyan bisa dadi programmer yen seneng. Karyaku ora ana hubungane karo pemrograman, aku dadi manajer proyek ing bidang otomasi lan liya-liyane. Nanging aku arep ngganti pendhudhukanku. Oh, tren anyar iki ... ngganti lapangan kegiatan saben 5-7 taun. Dadi : Proyek kasebut dadi cukup gedhe, mula sawetara poin kudu diilangi utawa diomongake kanthi ringkes, kanthi pangarep-arep supaya sing maca ngerti carane Google. Internet kebak publikasi bot telegram sing nggarap prinsip polling Long. Lan ana sawetara banget sing nggarap prinsip Webhook. Opo iki? Polling dawa - iki tegese aplikasi sampeyan dhewe bakal polling server telegram kanggo pesen kanthi frekuensi tartamtu, alon-alon. Webhook - tegese server telegram bakal langsung ngarahake pesen menyang server sing sampeyan nemtokake. Ing kasus kita, duweni layanan Heroku. Sampeyan bisa, mesthi, maca liyane babagan kabeh iki lan bab bot ing umum ing situs web Telegram - https://tlgrm.ru/docs/bots/api Antarmuka bot katon kaya iki: Telegram bot - pangeling liwat webHook ing Jawa utawa ngomong ora menyang tanggalan Google!  - 1 Aku nganggep aplikasi iki persis minangka latihan project kanggo alesan sing nalika nulis aku sinau informasi luwih saka bot iki saka nalika latihan. Apa sampeyan pengin sinau program? Mulai nulis kode!!! Nanging! Ora bakal ana instruksi rinci babagan cara ngunggah aplikasi menyang github utawa carane nggawe database. Ana akeh iki ing Internet lan diterangake kanthi rinci; Kajaba iku, bakal diwaca sing dawa banget. Aplikasi bakal kaya ing ngisor iki: Ketik katrangan acara kasebut, ketik tanggal lan wektu acara, pilih frekuensi (sampeyan bisa nindakake sepisan, sampeyan bisa duwe pangeling saben dina ing wektu tartamtu, sampeyan bisa nindakake sepisan. sasi ing wektu tartamtu, utawa sapisan taun). Variasi kabar bisa ditambah tanpa wates; Aku duwe akeh ide. Sabanjure, data sing dilebokake disimpen ing basis data (uga disebarake kanthi gratis ing Heroku, 10.000 baris gratis) Banjur, sapisan ing awal dina ing 0:00 wektu server, Spring njupuk saka database kabeh acara adhedhasar kritéria sing kudu murub ing dina iku lan dikirim kanggo eksekusi ing wektu tartamtu. PERHATIAN!!! BAGIAN PROGRAM IKI EKSPERIMENTAL! ANA IMPLEMENTASI SING LUWIH SIMPLE LAN BENER! IKI DILAKUKAN KHUSUS KANGGO NDELENG CARA KELAS WAKTU! Sampeyan bisa ndemek bot sing digunakake nganggo tangan sampeyan kanthi ngetik @calendar_event_bot ing kranjang, nanging aja ngetung, amarga aku isih ngece. kode - https://github.com/papoff8295/webHookBotForHabr Sejatine, kanggo miwiti dhewe sampeyan kudu njupuk langkah ing ngisor iki: • Register karo @BotFather , iku ora angel, njaluk token lan jeneng • Fork project ing github • Register ing Heroku, nggawe aplikasi (kita bakal ngliwati langkah demi langkah), nyebarake saka gudang sampeyan. • Nggawe database ing Heroku • Ganti kolom sing cocog ing gudang karo dhewe (token, jeneng tabel ing entitas, webHookPath, jeneng pangguna, sandi lan path kanggo database, iki kabeh bakal diurai) • Nggawe Heroku bisa 24 / 7 nggunakake https:/ /uptimerobot.com/ Struktur pungkasan proyek kaya ing ngisor iki: Telegram bot - pangeling liwat webHook ing Jawa utawa ngomong ora menyang tanggalan Google!  - 2 Ayo miwiti nggawe proyek ing https://start.spring.io Pilih dependensi sing kita butuhake kaya sing ditampilake ing gambar: Telegram bot - pangeling liwat webHook ing Jawa utawa ngomong ora menyang tanggalan Google!  - 3Pilih dhewe jeneng kanggo proyek banjur klik Generate . Sabanjure sampeyan bakal dijaluk nyimpen proyek kasebut menyang disk. Kabeh sing isih ana yaiku mbukak file pom.xm l saka lingkungan pangembangan sampeyan. Ana proyek rampung ing ngarep sampeyan. Saiki kita mung kudu nambah perpustakaan utama kita. Aku nggunakake perpustakaan saka https://github.com/rubenlagus/TelegramBots Umumé, sampeyan bisa bingung lan nindakake tanpa. Sawise kabeh, kabeh titik kerja yaiku nggabungake URL kaya iki: https://api.telegram.org/bot1866835969:AAE6gJG6ptUyqhV2XX0MxyUak4QbAGGnz10/setWebhook?url=https://e9c658b548aa.s look at it a little' : https://api.telegram.org – server telegram. bot1866835969:AAE6gJG6ptUyqhV2XX0MxyUak4QbAGGnz10/ - sawise tembung bot minangka tandha rahasia sing ditampa nalika ndhaptar bot. setWebhook?url=https://e9c658b548aa.ngrok.io – jeneng cara lan paramèter. Ing kasus iki, kita nginstal server webhook, kabeh pesen bakal dikirim menyang. Umumé, aku mutusake manawa proyek kasebut ora cilik banget kanggo publikasi, nanging kanthi implementasi manual, umume ora bisa diwaca. Dadi, tampilan pungkasan file pom yaiku:
<!--?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>
Kabeh wis siyap kanggo nulis bot kita. Ayo nggawe kelas TelegramBot . Aku ora bakal nulis jeneng folder, sampeyan bisa ndeleng ing struktur project ndhuwur.
@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 ngluwihi SpringWebhookBot saka perpustakaan telegram kita, lan kita mung kudu ngleksanakake siji cara, onWebhookUpdateReceived . Iku nampa JSON parsed minangka obyek Update lan ngasilake apa server telegram pengin "krungu" saka kita. Ing kene ana anotasi saka perpustakaan Lombok . Lombok – nggawe urip programmer luwih gampang!! Inggih, punika. kita ora perlu redefine getter lan setter, Lombok nindakake iki kanggo kita, lan kita uga ora perlu kanggo nulis pengenal tingkat akses. Ora perlu ditulis maneh yen iki ditindakake kanthi anotasi @Getter, @Setter, @FieldDefaults Bidang botPath tegese alamat webhook kita, sing bakal ditampa ing Heroku mengko. Kolom botUsername tegese jeneng bot kita, sing bakal ditampa nalika ndhaptar bot ing Telegram. Kolom botToken minangka token kita, sing bakal ditampa nalika ndhaptar bot ing Telegram. Bidang telegramFacade minangka kelas kita ing ngendi pangolahan pesen bakal ditindakake, kita bakal bali maneh mengko, saiki dadi abang. Saiki wektune kanggo ngubungi @BotFather lan entuk botToken lan botUsername sing dikarepake. Telegram bot - pangeling liwat webHook ing Jawa utawa ngomong ora menyang tanggalan Google!  - 4Cukup nulis kanggo dheweke ing telegram lan dheweke bakal ngandhani kabeh. Kita nulis data menyang application.properties, ing pungkasan bakal katon kaya iki:
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 iki dikonfigurasi kanggo nggarap database lokal; mengko kita bakal nggawe owah-owahan sing perlu. Ganti botToken lan jeneng panganggo sampeyan dhewe. Iku ora apik kanggo nggunakake data saka application.properties langsung ing aplikasi. Ayo nggawe kelas kacang utawa bungkus saka data iki.
@Component
@Getter
@FieldDefaults(level = AccessLevel.PRIVATE)

public class TelegramBotConfig {
    @Value("${telegrambot.webHookPath}")
    String webHookPath;
    @Value("${telegrambot.userName}")
    String userName;
    @Value("${telegrambot.botToken}")
    String botToken;
Ing kene @Value anotasi initializes baris sing cocog saka file application.properties, kang Spring ngerti bab standar. Lan anotasi @Component nggawe Bean kanggo kita nalika aplikasi diwiwiti. Ayo saiki ndeleng 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;
    }
}
Ora ana sihir ing kene; nalika wiwitan, Spring nggawe obyek SetWebhook lan TelegramBot kanggo kita. Ayo saiki nggawe titik entri kanggo pesen 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 ngirim pesen ing format JSON menyang alamat webhook sing kadhaptar kanthi nggunakake metode POST, pengontrol kita nampa lan ngirim menyang perpustakaan telegram ing wangun obyek Update. Aku nindakake cara njaluk kaya ngono) Saiki kita mung kudu ngetrapake sawetara logika kanggo ngolah pesen lan tanggapan ing kelas TelegramFacade , aku bakal menehi kode cekak supaya sampeyan bisa miwiti aplikasi kasebut lan banjur pindhah menyang cara sampeyan dhewe utawa ngalih kanggo nyebarake. ing Heroku, banjur bakal dadi 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;
    }

}
Cara iki bakal nanggapi sembarang Hello donya! Kanggo miwiti aplikasi kita, kita mung kudu mesthekake yen kita bisa nyoba aplikasi kita langsung saka IDEA. Kanggo nindakake iki, kita kudu ngundhuh utilitas ngrok. https://ngrok.com/download Utilitas iki minangka baris perintah sing menehi alamat sementara sajrone 2 jam lan ngarahake kabeh pesen menyang port server lokal sing ditemtokake. Kita miwiti lan nulis ngrok http 5000 ing baris (utawa sampeyan bisa nemtokake port sampeyan): Telegram bot - pangeling liwat webHook ing Jawa utawa ngomong ora menyang tanggalan Google!  - 5Kita entuk asil: Telegram bot - pangeling liwat webHook ing Jawa utawa ngomong ora menyang tanggalan Google!  - 6https://23b1a54ccbbd.ngrok.io - iki alamat webhook kita. Nalika sampeyan bisa uga wis ngeweruhi ing file sifat kita wrote server.port=5000 nalika miwiti server Tomcat, bakal Occupy port 5000, priksa manawa kothak iki padha. Uga, aja lali yen alamat kasebut diwenehi rong jam. Ing baris printah, iki dipantau dening lapangan Session Expires. Nalika wektu entek, sampeyan kudu njaluk alamat maneh lan pindhah liwat prosedur ndhaptar ing telegram. Saiki kita njupuk baris https://api.telegram.org/bot1866835969:AAE6gJG6ptUyqhV2XX0MxyUak4QbAGGnz10/setWebhook?url=https://e9c658b548aa.ngrok.io Lan kanthi gerakan tangan cekatan kita ngganti token karo kita, paste token kita. baris asil menyang browser lan klik enter. Sampeyan kudu entuk asil ing ngisor iki: Telegram bot - pangeling liwat webHook ing Jawa utawa ngomong ora menyang tanggalan Google!  - 7Ya, saiki sampeyan bisa mbukak aplikasi: Telegram bot - pangeling liwat webHook ing Jawa utawa ngomong ora menyang tanggalan Google!  - 8Priksa manawa kelas sampeyan kanthi metode utama kaya iki:
@SpringBootApplication
public class TelegramBotApplication {

   public static void main(String[] args) {
      SpringApplication.run(TelegramBotApplication.class, args);
   }
}
Yen sampeyan nindakake kabeh kanthi bener, saiki bot sampeyan bakal nanggapi pesen apa wae kanthi tembung " Hello world " . Banjur sampeyan bisa mlaku dhewe. Yen sampeyan karo kula lan kasengsem ing arep liwat kabeh langkah, banjur ayo kang miwiti nulis entitas kanggo database lan nggawe database dhewe. Ayo dadi miwiti karo database: Nalika aku wis ngandika, Aku nganggep sing wis minimal skills ing karya karo database, lan sampeyan duwe database postgreSQL lokal diinstal , yen ora, tindakake path iki. https://www.postgresql.org/download/ Ing file application.properties, ganti login database lan sandhi sampeyan dhewe. Ing IDEA ana tab database ing sisih tengen, sampeyan kudu ngeklik +/Sumber data/PostgreSQL . Akibaté, nalika sampeyan ngeklik Test Sambungan sampeyan kudu entuk asil sing marem: Telegram bot - pangeling liwat webHook ing Jawa utawa ngomong ora menyang tanggalan Google!  - 9Saiki sampeyan bisa nggawe database karo tabel langsung saka lingkungan pangembangan, utawa sampeyan bisa nggunakake antarmuka web pgadmin , sing dumunung ing menu wiwitan. Kita butuh 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
);
Aku nyaranake nggawe script iki kanthi kapisah; kita kudu nggawe database ing Heroku, supaya ora nulis kaping pindho. Ayo mlaku sethithik. Aku bakal langsung ngomong yen kita mung butuh meja event_cash kanggo nggarap Heroku amarga spesifik lan kepinginanku sing ora bisa digarap karo kelas Wektu ; ora bakal migunani ing versi lokal. Ing tabel pangguna , kita bakal ngrekam id akun pangguna telegram, jenenge, sing bisa uga ora ana, zona wektu pangguna bakal diwilang kanggo ngirim kabar sing bener, uga status on / off kanggo ngirim kabar. Kita bakal ngrekam id pangguna, wektu kabar, deskripsi ing tabel user_events , kanthi otomatis nggawe id kanggo acara kasebut, lan nyetel frekuensi kabar. Tabel event_cash bakal ngrekam kabar sadurunge dikirim lan, yen dikirim, mbusak saka meja. Tabel wis siyap, ayo saiki nambah 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;
    }
}
Ayo dadi pindhah liwat TCTerms utama sethitik. @Entity - menehi tandha kelas kanggo dada jpa kita yen kelas iki minangka entitas kanggo database, yaiku. nalika njupuk data saka database, bakal diwenehi kanggo kita ing wangun Event, Panganggo lan EventCashEntity obyek. @Tabel - kita ngomong jeneng tabel ing database. Kanggo mesthekake yen jeneng tabel ora digarisi abang, kita kudu setuju karo IDEA karo pilihan koreksi kesalahan sing diusulake lan klik Nemtokake sumber data. Lan pilih basis kita ana. @id lan @GeneratedValue - digunakake dening Spring kanggo nggawe database yen durung ana. @Column digunakake kanggo nunjukaké jeneng kolom ing meja yen padha ora cocog, nanging aturan kode apik menehi saran sing tansah nulis iki. Sikap OneToMany - Aku nyaranake mbuwang wektu lan ngerteni apa sing ana ing kene https://en.wikibooks.org/wiki/Java_Persistence Aku ora bisa nerangake kanthi luwih jelas, percaya wae. Ayo kula ujar manawa ing kasus iki anotasi @OneToMany ujar manawa pangguna siji bisa duwe akeh acara, lan bakal diwenehake menyang kita ing wangun dhaptar. Saiki kita kudu njupuk data saka tabel. Ing perpustakaan SRING DATA JPA kabeh wis ditulis kanggo kita, kita mung kudu nggawe antarmuka kanggo saben meja lan ngluwihi saka 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 kanggo nggarap database ditransfer menyang layanan, sing 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>
Ing kasus iki, kita ora duwe pangolahan data, kita mung njupuk data saka tabel. Kita kabeh siyap nyedhiyakake kode lengkap kelas T elegramFacade lan wiwit nganalisa logika.
@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);

    }
}
Ayo goleki lapangan apa sing dibutuhake
final MessageHandler messageHandler;
    final CallbackQueryHandler callbackQueryHandler;
    final BotStateCash botStateCash;
Yen kita kabeh kode ing siji kelas, banjur kita bakal mungkasi munggah karo footcloth kanggo rembulan; Mulane, kita nemtokake logika kanggo nggarap pesen teks kanggo kelas MessageHandler , lan logika kanggo nggarap pesen callbackquery kanggo CallbackQueryHandler kelas . Iku wektu kanggo mangerteni apa allbackquery lan apa jinis menu ana. Kanggo nindakake iki, aku bakal menehi gambar liyane saka antarmuka bot: Telegram bot - pangeling liwat webHook ing Jawa utawa ngomong ora menyang tanggalan Google!  - 10Ana rong jinis menu. Sing ditempelake ing ngisor jendhela - menu utama, lan sing diutus kanggo pesen, contone, mbusak, ngowahi, ngganti tombol sabuk. Yen sampeyan ngeklik tombol menu utama, pesen kanthi jeneng sing padha bakal dikirim, contone, nalika sampeyan ngeklik "Pelingku" , teks "Pengelingku" mung bakal dikirim . Lan nalika nginstal keyboard callbackquery, nilai tartamtu disetel kanggo saben tombol lan nilai kasebut bakal dikirim tanpa ditampilake ing layar. Sabanjure kita duwe lapangan BotStateCash . Iki kelas digawe khusus sing bakal ngawasi negara bot, lan manungsa waé, iki unsur Komplek, sampeyan kudu ketegangan. Jumlah karakter wis ngluwihi, sing, kanthi cara, ora ditulis ing ngendi wae)). Dadi iki link kanggo bagean loro
Komentar
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION