From 2b83e6a4e4c27be5b5776903b713896d26ad1969 Mon Sep 17 00:00:00 2001 From: Victor Date: Mon, 22 Mar 2021 14:55:20 +0200 Subject: [PATCH] Add more commands --- .../java/com/example/bot/TestBotHandler.java | 25 ++++-- .../example/bot/commands/English2Kana.java | 81 +++++++++++++++++++ .../bot/commands/YouTubeThumbnail.java | 32 ++++++++ 3 files changed, 130 insertions(+), 8 deletions(-) create mode 100644 src/main/java/com/example/bot/commands/English2Kana.java create mode 100644 src/main/java/com/example/bot/commands/YouTubeThumbnail.java diff --git a/src/main/java/com/example/bot/TestBotHandler.java b/src/main/java/com/example/bot/TestBotHandler.java index 1086759..f55be6b 100644 --- a/src/main/java/com/example/bot/TestBotHandler.java +++ b/src/main/java/com/example/bot/TestBotHandler.java @@ -1,13 +1,13 @@ package com.example.bot; import com.annimon.tgbotsmodule.BotHandler; -import com.annimon.tgbotsmodule.api.methods.Methods; import com.annimon.tgbotsmodule.commands.CommandRegistry; import com.annimon.tgbotsmodule.commands.SimpleCommand; import com.annimon.tgbotsmodule.commands.authority.For; import com.annimon.tgbotsmodule.commands.authority.SimpleAuthority; import com.annimon.tgbotsmodule.services.YamlConfigLoaderService; -import java.util.Locale; +import com.example.bot.commands.English2Kana; +import com.example.bot.commands.YouTubeThumbnail; import org.jetbrains.annotations.NotNull; import org.telegram.telegrambots.meta.api.methods.BotApiMethod; import org.telegram.telegrambots.meta.api.objects.Update; @@ -24,9 +24,17 @@ public TestBotHandler() { final var authority = new SimpleAuthority(this, botConfig.getAdminId()); commands = new CommandRegistry<>(this, authority); commands.register(new SimpleCommand("/start", ctx -> { - ctx.reply("Hi, " + ctx.user().getFirstName()) + ctx.reply("Hi, " + ctx.user().getFirstName() + "\n" + + "This bot is an example for tgbots-module library.\n" + + "https://github.com/aNNiMON/tgbots-module/\n\n" + + "Available commands:\n" + + " - /kana word — convert English word to Katakana\n" + + "\nAlso, you can send me a link to YouTube video and I'll send you a video thumbnail as a photo.") + .disableWebPagePreview() .callAsync(ctx.sender); })); + commands.register(new YouTubeThumbnail()); + commands.register(new English2Kana()); } @Override @@ -35,11 +43,12 @@ protected BotApiMethod onUpdate(@NotNull Update update) { return null; } - final var msg = update.getMessage(); - if (msg != null && msg.hasText()) { - Methods.sendMessage(msg.getChatId(), msg.getText().toUpperCase(Locale.ROOT)) - .callAsync(this); - } + // Process other messages + //final var msg = update.getMessage(); + //if (msg != null && msg.hasText()) { + // Methods.sendMessage(msg.getChatId(), msg.getText().toUpperCase(Locale.ROOT)) + // .callAsync(this); + //} return null; } diff --git a/src/main/java/com/example/bot/commands/English2Kana.java b/src/main/java/com/example/bot/commands/English2Kana.java new file mode 100644 index 0000000..d481d1b --- /dev/null +++ b/src/main/java/com/example/bot/commands/English2Kana.java @@ -0,0 +1,81 @@ +package com.example.bot.commands; + +import com.annimon.tgbotsmodule.commands.RegexCommand; +import com.annimon.tgbotsmodule.commands.authority.For; +import com.annimon.tgbotsmodule.commands.context.RegexMessageContext; +import com.fasterxml.jackson.annotation.JsonIgnoreProperties; +import com.fasterxml.jackson.databind.ObjectMapper; +import java.io.IOException; +import java.net.URLEncoder; +import java.nio.charset.StandardCharsets; +import java.util.EnumSet; +import java.util.List; +import java.util.regex.Pattern; +import java.util.stream.Collectors; +import okhttp3.Call; +import okhttp3.Callback; +import okhttp3.OkHttpClient; +import okhttp3.Request; +import okhttp3.Response; +import org.jetbrains.annotations.NotNull; + +public class English2Kana implements RegexCommand { + + private final OkHttpClient client = new OkHttpClient(); + private final ObjectMapper mapper = new ObjectMapper(); + + @Override + public Pattern pattern() { + return Pattern.compile("/kana ([a-zA-Z']{1,30})"); + } + + @SuppressWarnings("unchecked") + @Override + public EnumSet authority() { + return For.all(); + } + + @Override + public void accept(@NotNull RegexMessageContext ctx) { + final var word = URLEncoder.encode(ctx.group(1), StandardCharsets.UTF_8); + final var request = new Request.Builder() + .header("User-Agent", "Mozilla/5.0 (X11; Linux x86_64; rv:86.0) Gecko/20100101 Firefox/86.0") + .url("https://www.sljfaq.org/cgi/e2k.cgi?o=json&lang=en&word=" + word) + .build(); + client.newCall(request) + .enqueue(new Callback() { + @Override + public void onFailure(@NotNull Call call, @NotNull IOException e) { + ctx.replyToMessage("Unable to precess this query").callAsync(ctx.sender); + } + + @Override + public void onResponse(@NotNull Call call, @NotNull Response response) throws IOException { + try (final var body = response.body()) { + if (body == null) return; + var kanaResp = mapper.readValue(body.string(), Kana.class); + + var text = kanaResp.words.stream() + .map(word -> word.j_pron_spell) + .collect(Collectors.joining("・")); + if (kanaResp.romaji2kana != null) { + text += "\nThis looks like it might be romanized Japanese:\n" + kanaResp.romaji2kana; + } + ctx.replyToMessage(text).callAsync(ctx.sender); + } + } + }); + } + + @JsonIgnoreProperties(ignoreUnknown = true) + public static class Kana { + public List words; + public String romaji2kana; + } + + @JsonIgnoreProperties(ignoreUnknown = true) + public static class Word { + public String type; + public String j_pron_spell; + } +} diff --git a/src/main/java/com/example/bot/commands/YouTubeThumbnail.java b/src/main/java/com/example/bot/commands/YouTubeThumbnail.java new file mode 100644 index 0000000..e5d841e --- /dev/null +++ b/src/main/java/com/example/bot/commands/YouTubeThumbnail.java @@ -0,0 +1,32 @@ +package com.example.bot.commands; + +import com.annimon.tgbotsmodule.commands.RegexCommand; +import com.annimon.tgbotsmodule.commands.authority.For; +import com.annimon.tgbotsmodule.commands.context.RegexMessageContext; +import java.util.EnumSet; +import java.util.regex.Pattern; +import org.jetbrains.annotations.NotNull; +import org.telegram.telegrambots.meta.api.objects.InputFile; + +public class YouTubeThumbnail implements RegexCommand { + + @Override + public Pattern pattern() { + return Pattern.compile("https?://(?:www\\.)?youtu(?:\\.be/|be.com/watch\\?v=)([^#&?\\s]+)"); + } + + @SuppressWarnings("unchecked") + @Override + public EnumSet authority() { + return For.all(); + } + + @Override + public void accept(@NotNull RegexMessageContext ctx) { + var url = "https://img.youtube.com/vi/" + ctx.group(1) + "/hqdefault.jpg"; + ctx.replyWithPhoto() + .setFile(new InputFile(url)) + .setCaption(url) + .callAsync(ctx.sender); + } +}