JavaRush /جاوا بلاگ /Random-SD /ٽيليگرام بوٽ - جاوا ۾ webHook ذريعي ياد ڏياريندڙ يا گوگل ...

ٽيليگرام بوٽ - جاوا ۾ webHook ذريعي ياد ڏياريندڙ يا گوگل ڪئلينڊر کي نه چئو! حصو 1

گروپ ۾ شايع ٿيل
منهنجو نالو ولاديمير آهي. مان 43 سالن جو آهيان. ۽ جيڪڏهن توهان، پڙهندڙ، 40 کان مٿي آهيو، ته ها، 40 کان پوء توهان هڪ پروگرامر بڻجي سگهو ٿا جيڪڏهن توهان چاهيو ٿا. منهنجي ڪم جو پروگرامنگ سان ڪو به تعلق ناهي، مان آٽوميشن جي شعبي ۾ پروجيڪٽ مئنيجر آهيان ۽ اهو سڀ ڪجهه. پر مان پنهنجي پيشي کي تبديل ڪرڻ جي منصوبابندي ڪري رهيو آهيان. او، اهي نوان رجحان... هر 5-7 سالن ۾ پنهنجي سرگرميءَ جو ميدان تبديل ڪريو. سو : پروجيڪٽ ڪافي وڏو ثابت ٿيو، ان ڪري ڪجهه نقطن کي ڇڏڻو پوندو يا مختصر طور تي ڳالهائڻو پوندو، اميد ته پڙهندڙ کي ڄاڻ هجي ته گوگل ڪيئن. انٽرنيٽ ڊگهي پولنگ جي اصول تي ڪم ڪندڙ ٽيليگرام بوٽن جي اشاعتن سان ڀريل آهي. ۽ تمام ٿورا آھن جيڪي ڪم ڪن ٿا Webhook اصول تي. هي ڇا آهي؟ ڊگھي پولنگ - ان جو مطلب آھي توھان جي ايپليڪيشن پاڻ ئي پيغامن لاءِ ٽيليگرام سرور کي ھڪ خاص تعدد تي پول ڪندي، سست. Webhook - مطلب ته ٽيليگرام سرور فوري طور تي پيغام موڪليندو سرور ڏانهن جيڪو توهان بيان ڪيو آهي. اسان جي حالت ۾، هيروڪو سروس جي درٻار. توهان، يقينا، هن سڀني بابت وڌيڪ پڙهي سگهو ٿا ۽ عام طور تي ٽيليگرام جي ويب سائيٽ تي بوٽ بابت - https://tlgrm.ru/docs/bots/api bot انٽرفيس هن طرح نظر اچي ٿو: ٽيليگرام بوٽ - جاوا ۾ webHook ذريعي ياد ڏياريندڙ يا گوگل ڪئلينڊر کي نه چئو!  - 1 مان هن ايپليڪيشن کي خاص طور تي تربيت وانگر سمجهان ٿو پروجيڪٽ جو سبب اهو آهي ته لکڻ دوران مون هن بوٽ کان وڌيڪ معلومات سکي جڏهن ٽريننگ کان. ڇا توھان پروگرام ڪرڻ سکڻ چاھيو ٿا؟ ڪوڊ لکڻ شروع ڪريو !!! پر! هتي تفصيلي هدايتون نه هونديون ته ايپليڪيشن کي گٿب تي ڪيئن اپلوڊ ڪجي يا ڊيٽابيس ڪيئن ٺاهيو وڃي. انٽرنيٽ تي اهو ڪافي آهي ۽ ان کي وڏي تفصيل سان بيان ڪيو ويو آهي؛ ان کان علاوه، اهو هڪ تمام ڊگهو پڙهي سگهندو. اپليڪيشن هن ريت ڪم ڪندي: واقعي جي تفصيل داخل ڪريو، واقعي جي تاريخ ۽ وقت داخل ڪريو، تعدد چونڊيو (توهان اهو هڪ ڀيرو ڪري سگهو ٿا، توهان هر روز هڪ مخصوص وقت تي ياد ڏياري سگهو ٿا، توهان هڪ ڀيرو حاصل ڪري سگهو ٿا. هڪ خاص وقت تي هڪ مهينو، يا سال ۾ هڪ ڀيرو). نوٽيفڪيشن جي تبديلين کي اڻڄاتل شامل ڪري سگھجي ٿو؛ مون وٽ ڪيترائي خيال آھن. اڳيون، داخل ڪيل ڊيٽا ڊيٽابيس ۾ محفوظ ڪئي وئي آهي (هيروڪو تي پڻ مفت ۾ مقرر ڪئي وئي آهي، 10,000 قطارون مفت آهن) پوء، هڪ ڀيرو ڏينهن جي شروعات ۾ 0:00 سرور جي وقت تي، بهار ڊيٽابيس مان حاصل ڪري ٿو سڀني واقعن کي معيار جي بنياد تي. جنهن کي ان ڏينهن فائر ڪرڻ گهرجي ۽ انهن کي مقرر وقت تي عمل ڪرڻ لاءِ موڪلي ٿو. ڌيان!!! پروگرام جو هي حصو تجرباتي آهي! اتي ھڪڙو عمل آھي جيڪو وڌيڪ سادو ۽ سچو آھي! اهو خاص طور تي ڏسڻ لاءِ ڪيو ويو ته ٽائيم ڪلاس ڪيئن ڪم ڪري ٿو! توهان ڪارٽ ۾ @calendar_event_bot ٽائپ ڪري پنهنجي هٿن سان ڪم ڪندڙ بوٽ کي ڇڪي سگهو ٿا، پر ان تي اعتبار نه ڪريو، ڇو ته مان اڃا تائين ان جو مذاق اڏائي رهيو آهيان. ڪوڊ - https://github.com/papoff8295/webHookBotForHabr بنيادي طور تي، پنهنجو پاڻ کي لانچ ڪرڻ لاءِ توهان کي هيٺيان قدم کڻڻ گهرجن: • @BotFather سان رجسٽر ٿيو ، اهو ڏکيو ناهي، هڪ ٽوڪن ۽ نالو حاصل ڪريو • منصوبي کي github تي فورڪ ڪريو • رجسٽر هيروڪو تي, هڪ ايپليڪيشن ٺاهيو (اسان ان جي ذريعي قدم سان قدم کڻنداسين)، توهان جي مخزن مان ترتيب ڏيو. • هيروڪو تي هڪ ڊيٽابيس ٺاهيو • ريپوزٽري ۾ لاڳاپيل فيلڊز کي پنهنجي پاڻ سان مٽايو (ٽوڪن، ادارن ۾ ٽيبل جو نالو، ويب هِڪ پيٿ، يوزر جو نالو، پاسورڊ ۽ ڊيٽابيس جو رستو، هي سڀ پارس ڪيو ويندو) • هيروڪو ڪم 24/ ٺاهيو 7 https:///uptimerobot.com/ استعمال ڪندي پروجيڪٽ جو آخري ڍانچو هن ​​ريت آهي: اچو ته https://start.spring.ioٽيليگرام بوٽ - جاوا ۾ webHook ذريعي ياد ڏياريندڙ يا گوگل ڪئلينڊر کي نه چئو!  - 2 ۾ پروجيڪٽ ٺاهي شروعات ڪريون جن کي اسان جي ضرورت آهي انهن انحصارن کي چونڊيو جيئن شڪل ۾ ڏيکاريل آهي: اسان جو پنهنجو چونڊيو پروجيڪٽ جو نالو ۽ ڪلڪ ڪريو ٺاھيو . اڳيون توهان کي پروجيڪٽ کي پنهنجي ڊسڪ ۾ محفوظ ڪرڻ لاءِ چيو ويندو. باقي اهو آهي ته توهان جي ترقي واري ماحول مان pom.xm l فائل کوليو . توهان جي سامهون هڪ مڪمل منصوبو آهي. هاڻي اسان کي صرف اسان جي مکيه لائبريري شامل ڪرڻ جي ضرورت آهي. مون لائبريري استعمال ڪئي https://github.com/rubenlagus/TelegramBots عام طور تي، توهان پريشان ٿي سگهو ٿا ۽ ان کان سواء ڪري سگهو ٿا. آخرڪار، ڪم جو سڄو نقطو هن طرح هڪ URL کي گڏ ڪرڻ آهي: https://api.telegram.org/bot1866835969:AAE6gJG6ptUyqhV2XX0MxyUak4QbAGGnz10/setWebhook?url=https://e9c658b.k548 تي ٿورو نظر ڏيو. : https://api.telegram.org - ٽيليگرام سرور. bot1866835969:AAE6gJG6ptUyqhV2XX0MxyUak4QbAGGnz10/ - لفظ bot کان پوءِ هڪ ڳجهو ٽوڪن آهي جيڪو توهان وصول ڪندا آهيو جڏهن هڪ bot رجسٽر ٿيو. setWebhook?url=https://e9c658b548aa.ngrok.io – طريقي جو نالو ۽ ان جا پيرا ميٽر. انهي حالت ۾، اسان توهان جي ويب هک سرور کي نصب ڪيو، سڀئي پيغام ان ڏانهن موڪليا ويندا. عام طور تي، مون فيصلو ڪيو ته اهو منصوبو اشاعت لاء تمام ننڍڙو نه هو، پر دستي عمل سان اهو عام طور تي اڻ پڙهيل هوندو. تنهن ڪري، پوم فائل جو آخري نظر آهي: ٽيليگرام بوٽ - جاوا ۾ webHook ذريعي ياد ڏياريندڙ يا گوگل ڪئلينڊر کي نه چئو!  - 3
<!--?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 . اهو قبول ڪري ٿو pars JSON هڪ اپڊيٽ اعتراض طور ۽ واپس ڪري ٿو جيڪو ٽيليگرام سرور اسان کان ”ٻڌڻ“ چاهي ٿو. هتي اسان وٽ Lombok لائبريري مان تشريحون آهن . Lombok - هڪ پروگرامر جي زندگي آسان بڻائي!! خير، اهو آهي. اسان کي حاصل ڪندڙن ۽ سيٽرن کي نئين سر وضاحت ڪرڻ جي ضرورت ناهي، Lombok اسان لاءِ اهو ڪري ٿو، ۽ اسان کي رسائي جي سطح جي سڃاڻپ ڪندڙ لکڻ جي به ضرورت ناهي. اهو هاڻي لکڻ جي لائق ناهي ته هي اينوٽيشنز ذريعي ڪيو ويو آهي @Getter، @Setter، @FieldDefaults The botPath فيلڊ جو مطلب آهي اسان جي ويب هِڪ ايڊريس، جيڪو اسان بعد ۾ Heroku تي وصول ڪنداسين. botUsername فيلڊ جو مطلب آهي اسان جي بوٽ جو نالو، جيڪو اسان وصول ڪنداسين جڏهن اسان جي بوٽ کي ٽيليگرام ۾ رجسٽر ڪرڻ. botToken فيلڊ اسان جو ٽوڪن آهي، جيڪو اسان وصول ڪنداسين جڏهن اسان جي بوٽ کي ٽيليگرام ۾ رجسٽر ڪرڻ. TelegramFacade فيلڊ اسان جي ڪلاس آهي جتي پيغام جي پروسيسنگ ٿيندي، اسان ان تي ٿوري دير کان پوء واپس ڪنداسين، ان کي هاڻي لاء ڳاڙهو ڪيو وڃي. ھاڻي اھو وقت آھي اسان لاءِ @BotFather سان رابطو ڪرڻ ۽ حاصل ڪريو botToken ۽ botUsername. ٽيليگرام بوٽ - جاوا ۾ webHook ذريعي ياد ڏياريندڙ يا گوگل ڪئلينڊر کي نه چئو!  - 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 فائل مان لاڳاپيل لائينن کي شروع ڪري ٿي، جنهن کي اسپرنگ ڊفالٽ طور ڄاڻي ٿو. ۽ @Component تشريح اسان لاءِ هڪ بين ٺاهي ٿي جڏهن اپليڪيشن شروع ٿئي ٿي. اچو ته هاڻي بهار جي ترتيب واري فائل کي ڏسو:
@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;
    }
}
هتي ڪو به جادو ناهي؛ شروعات ۾، بهار اسان لاءِ سيٽ ويب هوڪ ۽ ٽيليگرام بوٽ شيون ٺاهي ٿي. اچو ته ھاڻي پنھنجي پيغامن لاءِ داخلا پوائنٽون ٺاھيون:
@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();
    }
}
ٽيليگرام سرور JSON فارميٽ ۾ نياپا موڪلي ٿو رجسٽرڊ ويب هِڪ ايڊريس تي POST طريقو استعمال ڪندي، اسان جو ڪنٽرولر انهن کي وصول ڪري ٿو ۽ انهن کي ٽيليگرام لائبريري ڏانهن منتقل ڪري ٿو تازه ڪاري اعتراض جي صورت ۾. مون حاصل ڪرڻ جو طريقو اهو ئي ڪيو هو) هاڻي اسان کي ٽيليگرام فيڪڊ ڪلاس ۾ پيغامن ۽ جوابن جي پروسيسنگ لاءِ ڪجهه منطق لاڳو ڪرڻ جي ضرورت آهي، مان ان جو مختصر ڪوڊ ڏيندس ته جيئن توهان اپليڪيشن لانچ ڪري سگهو ۽ پوءِ پنهنجي طريقي سان وڃو يا ڊيپلائي ڪرڻ لاءِ سوئچ ڪريو هيروڪو تي، پوء اهو مڪمل نسخو هوندو:
@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 کان جانچ ڪري سگهون ٿا. هن کي ڪرڻ لاءِ اسان کي ngrok يوٽيلٽي کي ڊائون لوڊ ڪرڻو پوندو. https://ngrok.com/download هي يوٽيلٽي هڪ ڪمانڊ لائن آهي جيڪا اسان کي 2 ڪلاڪن لاءِ عارضي پتو ڏئي ٿي ۽ سڀني پيغامن کي مقامي سرور جي مخصوص بندرگاهه ڏانهن موڪلي ٿي. اسان شروع ڪريون ٿا ngrok http 5000 لائن ۾ (يا توهان پنهنجو پورٽ بيان ڪري سگهو ٿا): ٽيليگرام بوٽ - جاوا ۾ webHook ذريعي ياد ڏياريندڙ يا گوگل ڪئلينڊر کي نه چئو!  - 5اسان نتيجو حاصل ڪيو: ٽيليگرام بوٽ - جاوا ۾ webHook ذريعي ياد ڏياريندڙ يا گوگل ڪئلينڊر کي نه چئو!  - 6https://23b1a54ccbbd.ngrok.io - هي آهي اسان جي ويب هِڪ ايڊريس. جيئن توهان ڏٺو هوندو پراپرٽي فائل ۾ اسان لکيو آهي server.port=5000 جڏهن tomcat سرور شروع ڪيو، اهو بندرگاهه 5000 تي قبضو ڪندو، پڪ ڪريو ته اهي شعبا ساڳيا آهن. اهو به نه وساريو ته پتو ٻن ڪلاڪن لاء ڏنو ويو آهي. ڪمانڊ لائن تي، هي سيشن ختم ٿيڻ واري فيلڊ جي نگراني ڪئي وئي آهي. جڏهن وقت ختم ٿي ويندو، توهان کي ٻيهر پتو حاصل ڪرڻو پوندو ۽ ٽيليگرام تي ان کي رجسٽر ڪرڻ جي طريقيڪار ذريعي وڃڻو پوندو. ھاڻي اسان لائين وٺون ٿا https://api.telegram.org/bot1866835969:AAE6gJG6ptUyqhV2XX0MxyUak4QbAGGnz10/setWebhook?url=https://e9c658b548aa.ngrok.io ۽ اسان پنھنجي ماضي جي ھٿن جي تحريڪن کي تبديل ڪريون ٿا. نتيجو واري لائن برائوزر ۾ داخل ڪريو ۽ ڪلڪ ڪريو داخل ڪريو. توھان کي ھيٺ ڏنل نتيجو حاصل ڪرڻ گھرجي: ٽيليگرام بوٽ - جاوا ۾ webHook ذريعي ياد ڏياريندڙ يا گوگل ڪئلينڊر کي نه چئو!  - 7اھو آھي، ھاڻي توھان ايپليڪيشن کي هلائي سگھو ٿا: ٽيليگرام بوٽ - جاوا ۾ webHook ذريعي ياد ڏياريندڙ يا گوگل ڪئلينڊر کي نه چئو!  - 8چيڪ ڪريو ته توھان جو ڪلاس بنيادي طريقي سان ھن طرح ھو:
@SpringBootApplication
public class TelegramBotApplication {

   public static void main(String[] args) {
      SpringApplication.run(TelegramBotApplication.class, args);
   }
}
جيڪڏهن توهان سڀ ڪجهه صحيح ڪيو، هاڻي توهان جو بوٽ ڪنهن به پيغام جو جواب ڏيندو جملي سان " هيلو ورلڊ" . پوء توهان پنهنجي طريقي سان وڃي سگهو ٿا. جيڪڏهن توهان مون سان گڏ آهيو ۽ توهان سڀني مرحلن مان گذرڻ ۾ دلچسپي رکو ٿا، ته پوءِ اچو ته ڊيٽابيس لاءِ ادارا لکڻ شروع ڪريون ۽ ڊيٽابيس پاڻ ٺاهيون. اچو ته ڊيٽابيس سان شروع ڪريون: جيئن مون اڳ ۾ ئي چيو آهي، مان سمجهان ٿو ته توهان وٽ اڳ ۾ ئي ڊيٽابيس سان ڪم ڪرڻ ۾ گهٽ ۾ گهٽ صلاحيتون آهن، ۽ توهان وٽ مقامي پوسٽ گري ايس ايس ايل ڊيٽابيس انسٽال ٿيل آهي ، جيڪڏهن نه، هن رستي تي عمل ڪريو. https://www.postgresql.org/download/ application.properties فائل ۾، ڊيٽابيس لاگ ان ۽ پاسورڊ کي پنهنجو پاڻ سان مٽايو. IDEA ۾ ساڄي پاسي هڪ ڊيٽابيس ٽيب آهي، ان ۾ توهان کي ڪلڪ ڪرڻ جي ضرورت آهي +/Data source/PostgreSQL . نتيجي طور، جڏھن توھان ڪلڪ ڪندا آھيو ٽيسٽ ڪنيڪشن توھان کي ھڪ اطمينان بخش نتيجو حاصل ڪرڻ گھرجي: ٽيليگرام بوٽ - جاوا ۾ webHook ذريعي ياد ڏياريندڙ يا گوگل ڪئلينڊر کي نه چئو!  - 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 ٽيبل جي ضرورت آهي ان جي خاصيتن جي ڪري ۽ منهنجي ٽائيم ڪلاس سان ڪم ڪرڻ جي ناقابل خواهش خواهش ؛ اهو مقامي ورزن ۾ ڪارائتو نه ٿيندو. صارفين جي ٽيبل ۾ اسان ٽيليگرام استعمال ڪندڙ جي اڪائونٽ جي سڃاڻپ رڪارڊ ڪنداسين ، سندس نالو، جيڪو شايد موجود نه هجي، صارف جي ٽائم زون کي نوٽيفڪيشن جي صحيح موڪلڻ لاءِ حساب ڪيو ويندو، انهي سان گڏ نوٽيفڪيشن موڪلڻ جي آن / آف اسٽيٽس . اسان رڪارڊ ڪنداسين يوزر آئي ڊي ، نوٽيفڪيشن جو وقت، تفصيل user_events جدول ۾ ، خودڪار طور تي واقعي لاءِ هڪ id ٺاهي ، ۽ اطلاعن جي تعدد کي مقرر ڪنداسين. Event_cash ٽيبل نوٽيفڪيشن کي رڪارڊ ڪندو ان کان اڳ موڪليو ويو ۽، جيڪڏھن موڪليو ويو، ان کي ٽيبل تان هٽائي ڇڏيو. ٽيبل تيار آهن، اچو ته هاڻي ادارن کي شامل ڪريو.
@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 لاءِ ڪلاس کي نشانو بڻائي ٿو ته هي ڪلاس ڊيٽابيس لاءِ هڪ ادارو آهي، يعني. جڏهن ڊيٽابيس مان ڊيٽا حاصل ڪري رهيا آهيو، اهو اسان کي هڪ واقعا، صارف ۽ EventCashEntity اعتراض جي صورت ۾ پيش ڪيو ويندو. @ ٽيبل - اسان چئون ٿا ته ڊيٽابيس ۾ اسان جي ٽيبل کي ڇا سڏيو ويندو آهي. انهي ڳالهه کي يقيني بڻائڻ لاءِ ته ٽيبل جو نالو ڳاڙهي ۾ هيٺ نه ڪيو ويو آهي، اسان کي IDEA ۾ تجويز ڪيل غلطي جي اصلاح جي اختيار سان متفق ٿيڻو پوندو ۽ ڪلڪ ڪريو ڊيٽا ذريعن کي تفويض ڪريو. ۽ اتي اسان جو بنياد چونڊيو. @id ۽ @GeneratedValue - بهار طرفان استعمال ٿيل ڊيٽابيس ٺاهڻ لاءِ جيڪڏهن اهو اڳ ۾ ئي موجود ناهي. @Column جدول ۾ موجود فيلڊن جا نالا ظاهر ڪرڻ لاءِ استعمال ڪيو ويندو آهي جيڪڏهن اهي هڪجهڙائي نه رکن، پر سٺي ڪوڊ جا قاعدا سفارش ڪن ٿا ته توهان هميشه هي لکو. 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 ڪلاس جو مڪمل ڪوڊ مهيا ڪرڻ ۽ منطق جو تجزيو ڪرڻ لاءِ.
@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 طبقي کي . اهو وقت معلوم ڪرڻ جو آهي ته آل بيڪڪيري ڇا آهي ۽ ڪهڙي قسم جا مينيو موجود آهن. هن کي ڪرڻ لاءِ، مان توهان کي ڏيندس بوٽ جي انٽرفيس جي هڪ ٻي تصوير: ٽيليگرام بوٽ - جاوا ۾ webHook ذريعي ياد ڏياريندڙ يا گوگل ڪئلينڊر کي نه چئو!  - 10مينيو جا ٻه قسم آهن. اهي جيڪي ونڊو جي تري ۾ ڳنڍيل آهن - مکيه مينيو، ۽ اهي جيڪي پيغام کي تفويض ڪيا ويا آهن، مثال طور، حذف ڪريو، تبديل ڪريو، تبديل ڪريو بيلٽ بٽڻ. جڏهن توهان مين مينيو بٽڻ تي ڪلڪ ڪندا آهيو، ساڳئي نالي جو هڪ پيغام موڪليو ويندو آهي، مثال طور، جڏهن توهان ڪلڪ ڪريو "منهنجا ياد ڏياريندڙ" ، ٽيڪسٽ "منهنجا ياد ڏياريندڙ" صرف موڪلي ويندي . ۽ جڏهن ڪال بيڪڪيري ڪيبورڊ انسٽال ڪيو وڃي ته هر بٽڻ لاءِ هڪ مخصوص قيمت مقرر ڪئي ويندي آهي ۽ ان جي قيمت ان کي اسڪرين تي ڏيکاري بغير موڪلي ويندي. اڳيان اسان وٽ آهي BotStateCash فيلڊ . هي هڪ خاص ٺهيل طبقو آهي جيڪو بوٽ جي حالت جي نگراني ڪندو، ۽ ڌيان، اهو هڪ پيچيده عنصر آهي، توهان کي دٻاء ڏيڻ جي ضرورت آهي. اکرن جو تعداد وڌي ويو، جيڪو، رستي ۾، ڪٿي به نه لکيو ويو آهي)). سو هتي ٻئي حصي جي لنڪ آهي
تبصرا
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION