From b3cc35b4c22032bc3132b7af843b7fac8d9e39c6 Mon Sep 17 00:00:00 2001 From: tiennm99 Date: Thu, 30 Oct 2025 21:38:39 +0700 Subject: [PATCH] Integrate Telegram bot with command support Replaces the previous TelegramBots dependency with the new telegrambots-client, extensions, and longpolling modules. Adds StoreScrapeBot with command handling, including a stub AddGroupCommand, and updates Main to start the bot. Config is extended to support bot credentials and admin IDs, and CouchbaseUtil is simplified to remove example code. --- build.gradle.kts | 5 ++- .../java/com/miti99/storescraperbot/Main.java | 22 +++++++------ .../bot/ScoreScrapeBotTelegramClient.java | 12 +++++++ .../bot/ScoreScrapeBotUsernameSupplier.java | 14 ++++++++ .../storescraperbot/bot/StoreScrapeBot.java | 32 ++++++++++++++++++ .../bot/command/AddGroupCommand.java | 23 +++++++++++++ .../miti99/storescraperbot/config/Config.java | 20 +++++++++++ .../storescraperbot/util/CouchbaseUtil.java | 33 ++----------------- 8 files changed, 119 insertions(+), 42 deletions(-) create mode 100644 src/main/java/com/miti99/storescraperbot/bot/ScoreScrapeBotTelegramClient.java create mode 100644 src/main/java/com/miti99/storescraperbot/bot/ScoreScrapeBotUsernameSupplier.java create mode 100644 src/main/java/com/miti99/storescraperbot/bot/StoreScrapeBot.java create mode 100644 src/main/java/com/miti99/storescraperbot/bot/command/AddGroupCommand.java diff --git a/build.gradle.kts b/build.gradle.kts index d2fac22..55da747 100644 --- a/build.gradle.kts +++ b/build.gradle.kts @@ -24,7 +24,10 @@ dependencies { implementation("org.apache.logging.log4j:log4j-1.2-api:2.24.3") implementation("org.apache.logging.log4j:log4j-core:2.24.3") implementation("org.apache.logging.log4j:log4j-slf4j2-impl:2.24.3") - implementation("org.telegram:telegrambots-abilities:8.0.0") + // implementation("org.telegram:telegrambots-abilities:8.0.0") + implementation("org.telegram:telegrambots-client:8.0.0") + implementation("org.telegram:telegrambots-extensions:8.0.0") + implementation("org.telegram:telegrambots-longpolling:8.0.0") testAnnotationProcessor("org.projectlombok:lombok:1.18.36") testImplementation(platform("org.junit:junit-bom:5.11.4")) diff --git a/src/main/java/com/miti99/storescraperbot/Main.java b/src/main/java/com/miti99/storescraperbot/Main.java index 7139c2b..882ac9b 100644 --- a/src/main/java/com/miti99/storescraperbot/Main.java +++ b/src/main/java/com/miti99/storescraperbot/Main.java @@ -1,18 +1,20 @@ package com.miti99.storescraperbot; -// TIP To Run code, press or -// click the icon in the gutter. +import com.miti99.storescraperbot.bot.StoreScrapeBot; +import com.miti99.storescraperbot.config.Config; +import lombok.extern.log4j.Log4j2; +import org.telegram.telegrambots.longpolling.TelegramBotsLongPollingApplication; + +@Log4j2 public class Main { public static void main(String[] args) { - // TIP Press with your caret at the highlighted text - // to see how IntelliJ IDEA suggests fixing it. - System.out.printf("Hello and welcome!"); - - for (int i = 1; i <= 5; i++) { - // TIP Press to start debugging your code. We have set one breakpoint - // for you, but you can always add more by pressing . - System.out.println("i = " + i); + try (var botsApplication = new TelegramBotsLongPollingApplication()) { + botsApplication.registerBot(Config.TELEGRAM_BOT_TOKEN, StoreScrapeBot.INSTANCE); + log.info("StoreScrapeBot successfully started!"); + Thread.currentThread().join(); + } catch (Exception e) { + log.error("Error while running bot", e); } } } diff --git a/src/main/java/com/miti99/storescraperbot/bot/ScoreScrapeBotTelegramClient.java b/src/main/java/com/miti99/storescraperbot/bot/ScoreScrapeBotTelegramClient.java new file mode 100644 index 0000000..2e8373c --- /dev/null +++ b/src/main/java/com/miti99/storescraperbot/bot/ScoreScrapeBotTelegramClient.java @@ -0,0 +1,12 @@ +package com.miti99.storescraperbot.bot; + +import com.miti99.storescraperbot.config.Config; +import org.telegram.telegrambots.client.okhttp.OkHttpTelegramClient; + +public class ScoreScrapeBotTelegramClient extends OkHttpTelegramClient { + public static final ScoreScrapeBotTelegramClient INSTANCE = new ScoreScrapeBotTelegramClient(); + + public ScoreScrapeBotTelegramClient() { + super(Config.TELEGRAM_BOT_TOKEN); + } +} diff --git a/src/main/java/com/miti99/storescraperbot/bot/ScoreScrapeBotUsernameSupplier.java b/src/main/java/com/miti99/storescraperbot/bot/ScoreScrapeBotUsernameSupplier.java new file mode 100644 index 0000000..9f5eac6 --- /dev/null +++ b/src/main/java/com/miti99/storescraperbot/bot/ScoreScrapeBotUsernameSupplier.java @@ -0,0 +1,14 @@ +package com.miti99.storescraperbot.bot; + +import com.miti99.storescraperbot.config.Config; +import java.util.function.Supplier; + +public class ScoreScrapeBotUsernameSupplier implements Supplier { + public static final ScoreScrapeBotUsernameSupplier INSTANCE = + new ScoreScrapeBotUsernameSupplier(); + + @Override + public String get() { + return Config.TELEGRAM_BOT_USERNAME; + } +} diff --git a/src/main/java/com/miti99/storescraperbot/bot/StoreScrapeBot.java b/src/main/java/com/miti99/storescraperbot/bot/StoreScrapeBot.java new file mode 100644 index 0000000..dbf035a --- /dev/null +++ b/src/main/java/com/miti99/storescraperbot/bot/StoreScrapeBot.java @@ -0,0 +1,32 @@ +package com.miti99.storescraperbot.bot; + +import com.miti99.storescraperbot.bot.command.AddGroupCommand; +import lombok.extern.log4j.Log4j2; +import org.telegram.telegrambots.extensions.bots.commandbot.CommandLongPollingTelegramBot; +import org.telegram.telegrambots.meta.api.methods.send.SendMessage; +import org.telegram.telegrambots.meta.api.objects.Update; +import org.telegram.telegrambots.meta.exceptions.TelegramApiException; + +@Log4j2 +public class StoreScrapeBot extends CommandLongPollingTelegramBot { + public static final StoreScrapeBot INSTANCE = new StoreScrapeBot(); + + StoreScrapeBot() { + super(ScoreScrapeBotTelegramClient.INSTANCE, true, ScoreScrapeBotUsernameSupplier.INSTANCE); + register(AddGroupCommand.INSTANCE); + } + + @Override + public void processNonCommandUpdate(Update update) { + try { + var sendMessage = + SendMessage.builder() + .chatId(update.getMessage().getChatId()) + .text("Invalid command") + .build(); + telegramClient.execute(sendMessage); + } catch (TelegramApiException e) { + log.error("processNonCommandUpdate error", e); + } + } +} diff --git a/src/main/java/com/miti99/storescraperbot/bot/command/AddGroupCommand.java b/src/main/java/com/miti99/storescraperbot/bot/command/AddGroupCommand.java new file mode 100644 index 0000000..05a6254 --- /dev/null +++ b/src/main/java/com/miti99/storescraperbot/bot/command/AddGroupCommand.java @@ -0,0 +1,23 @@ +package com.miti99.storescraperbot.bot.command; + +import com.miti99.storescraperbot.config.Config; +import org.telegram.telegrambots.extensions.bots.commandbot.commands.BotCommand; +import org.telegram.telegrambots.meta.api.objects.User; +import org.telegram.telegrambots.meta.api.objects.chat.Chat; +import org.telegram.telegrambots.meta.generics.TelegramClient; + +public class AddGroupCommand extends BotCommand { + public static final AddGroupCommand INSTANCE = new AddGroupCommand(); + + AddGroupCommand() { + super("addgroup", "Thêm group vào list group cho phép sử dụng bot"); + } + + @Override + public void execute(TelegramClient telegramClient, User user, Chat chat, String[] arguments) { + if (!Config.ADMIN_IDS.contains(user.getId()) ) { + return; + } + // TODO + } +} diff --git a/src/main/java/com/miti99/storescraperbot/config/Config.java b/src/main/java/com/miti99/storescraperbot/config/Config.java index f4ba15b..3fe44aa 100644 --- a/src/main/java/com/miti99/storescraperbot/config/Config.java +++ b/src/main/java/com/miti99/storescraperbot/config/Config.java @@ -1,6 +1,11 @@ package com.miti99.storescraperbot.config; import com.miti99.storescraperbot.type.Env; +import java.util.Arrays; +import java.util.Collections; +import java.util.Optional; +import java.util.Set; +import java.util.stream.Collectors; public class Config { public static final Env ENV = Env.valueOf(System.getenv("ENV")); @@ -10,4 +15,19 @@ public class Config { public static final String COUCHBASE_USERNAME = System.getenv("COUCHBASE_USERNAME"); public static final String COUCHBASE_PASSWORD = System.getenv("COUCHBASE_PASSWORD"); public static final String COUCHBASE_BUCKET_NAME = System.getenv("COUCHBASE_BUCKET_NAME"); + + public static final String TELEGRAM_BOT_TOKEN = System.getenv("TELEGRAM_BOT_TOKEN"); + public static final String TELEGRAM_BOT_USERNAME = System.getenv("TELEGRAM_BOT_USERNAME"); + + public static final Long CREATOR_ID = Long.parseLong(System.getenv("CREATOR_ID")); + public static final Set ADMIN_IDS = + Optional.ofNullable(System.getenv("ADMIN_IDS")) + .map( + v -> + Arrays.stream(v.split(",")) + .map(String::trim) + .filter(s -> !s.isEmpty()) + .map(Long::parseLong) + .collect(Collectors.toSet())) + .orElse(Collections.emptySet()); } diff --git a/src/main/java/com/miti99/storescraperbot/util/CouchbaseUtil.java b/src/main/java/com/miti99/storescraperbot/util/CouchbaseUtil.java index c6f1fc5..bc1f4f7 100644 --- a/src/main/java/com/miti99/storescraperbot/util/CouchbaseUtil.java +++ b/src/main/java/com/miti99/storescraperbot/util/CouchbaseUtil.java @@ -8,49 +8,20 @@ import static com.miti99.storescraperbot.config.Config.COUCHBASE_USERNAME; import com.couchbase.client.java.Bucket; import com.couchbase.client.java.Cluster; import com.couchbase.client.java.ClusterOptions; -import com.couchbase.client.java.Collection; -import com.couchbase.client.java.Scope; -import com.couchbase.client.java.json.JsonObject; -import com.couchbase.client.java.kv.GetResult; -import com.couchbase.client.java.kv.MutationResult; -import com.couchbase.client.java.query.QueryResult; import java.time.Duration; public class CouchbaseUtil { public static final Cluster CLUSTER; public static final Bucket BUCKET; + static { CLUSTER = Cluster.connect( COUCHBASE_CONNECTION_STRING, ClusterOptions.clusterOptions(COUCHBASE_USERNAME, COUCHBASE_PASSWORD) - .environment( - env -> { - // Customize client settings by calling methods on the "env" variable. - })); + .environment(env -> {})); - // get a bucket reference BUCKET = CLUSTER.bucket(COUCHBASE_BUCKET_NAME); BUCKET.waitUntilReady(Duration.ofSeconds(10)); - - // get a user-defined collection reference - Scope scope = BUCKET.scope("tenant_agent_00"); - Collection collection = scope.collection("users"); - - // Upsert Document - MutationResult upsertResult = - collection.upsert("my-document", JsonObject.create().put("name", "mike")); - - // Get Document - GetResult getResult = collection.get("my-document"); - String name = getResult.contentAsObject().getString("name"); - System.out.println(name); // name == "mike" - - // Call the query() method on the scope object and store the result. - Scope inventoryScope = BUCKET.scope("inventory"); - QueryResult result = inventoryScope.query("SELECT * FROM airline WHERE id = 10;"); - - // Return the result rows with the rowsAsObject() method and print to the terminal. - System.out.println(result.rowsAsObject()); } }