添加封装的 command 对象,使 bot 忽略非自己为对象的命令,解锁 bot_username 限制,添加参数化 username 限制

This commit is contained in:
A.C.Sukazyo Eyre 2021-12-07 21:44:47 +08:00
parent 360a9d3504
commit b32b465a12
Signed by: Eyre_S
GPG Key ID: EFB47D98FE082FAD
6 changed files with 105 additions and 36 deletions

View File

@ -7,7 +7,7 @@ plugins {
}
group 'cc.sukazyo'
version '0.3.4.3'
version '0.3.4.4'
project.ext.archiveBaseName = 'Coeur_Morny_Cono'
project.ext.artifactId = 'morny-coeur'
mainClassName = 'cc.sukazyo.cono.morny.MornyCoeur'

View File

@ -4,6 +4,6 @@ package cc.sukazyo.cono.morny;
* the final field that will be updated by gradle automatically.
*/
public class GradleProjectConfigures {
public static final String VERSION = "0.3.4.3";
public static final long COMPILE_TIMESTAMP = 1638871718439L;
public static final String VERSION = "0.3.4.4";
public static final long COMPILE_TIMESTAMP = 1638884621273L;
}

View File

@ -30,7 +30,7 @@ public class MornyCoeur {
* <br>
* 出于技术限制这个字段目前是写死的
*/
public static final String USERNAME = "morny_cono_annie_bot";
public static String username;
/**
* 程序入口<br>
@ -77,6 +77,10 @@ public class MornyCoeur {
configureSafeExit();
logger.info("args key:\n " + args[0]);
if (args.length > 2) {
username = args[2];
logger.info("login as:\n " + args[2]);
}
try { account = login(args[0]); }
catch (Exception e) { logger.error("Cannot login to bot/api. :\n " + e.getMessage()); System.exit(-1); }
@ -111,7 +115,7 @@ public class MornyCoeur {
* <br>
* 会反复尝试三次进行登录如果登录失败则会直接抛出 RuntimeException 结束处理
* 会通过 GetMe 动作验证是否连接上了 telegram api 服务器
* 同时也要求登录获得的 username {@link #USERNAME} 声明值相等
* 同时也要求登录获得的 username {@link #username} 声明值相等
*
* @param key bot api-token
* @return 成功登录后的 {@link TelegramBot} 对象
@ -124,8 +128,9 @@ public class MornyCoeur {
if (i != 1) logger.info("retrying...");
try {
final String username = account.execute(new GetMe()).user().username();
if (!USERNAME.equals(username))
throw new RuntimeException("Required the bot @"+USERNAME + " but @"+username + " logged in!");
if (username != null && !MornyCoeur.username.equals(username))
throw new RuntimeException("Required the bot @" + MornyCoeur.username + " but @" + username + " logged in!");
else MornyCoeur.username = username;
logger.info("Succeed login to @" + username);
return account;
} catch (Exception e) {

View File

@ -0,0 +1,61 @@
package cc.sukazyo.cono.morny.bot.api;
import cc.sukazyo.cono.morny.util.StringUtils;
import javax.annotation.Nonnull;
import javax.annotation.Nullable;
import java.util.Arrays;
public class InputCommand {
private final String target;
private final String command;
private final String[] args;
private InputCommand (@Nullable String target, @Nonnull String command, @Nonnull String[] args) {
this.target = target;
this.command = command;
this.args = args;
}
public InputCommand (@Nonnull String[] inputArray) {
this(parseInputArray(inputArray));
}
public InputCommand (@Nonnull String input) {
this(StringUtils.formatCommand(input));
}
public InputCommand (@Nonnull InputCommand source) {
this(source.target, source.command, source.args);
}
public static InputCommand parseInputArray (@Nonnull String[] inputArray) {
final String[] cx = inputArray[0].split("@", 2);
final String[] args = new String[inputArray.length-1];
System.arraycopy(inputArray, 1, args, 0, inputArray.length - 1);
return new InputCommand(cx.length == 1 ? null : cx[1], cx[0], args);
}
public String getTarget () {
return target;
}
public String getCommand () {
return command;
}
public String[] getArgs () {
return args;
}
public boolean hasArgs () {
return args.length != 0;
}
@Override
public String toString() {
return String.format("{{%s}@{%s}#{%s}}", command, target, Arrays.toString(args));
}
}

View File

@ -5,8 +5,8 @@ import cc.sukazyo.cono.morny.MornyCoeur;
import cc.sukazyo.cono.morny.MornySystem;
import cc.sukazyo.cono.morny.MornyTrusted;
import cc.sukazyo.cono.morny.bot.api.EventListener;
import cc.sukazyo.cono.morny.bot.api.InputCommand;
import cc.sukazyo.cono.morny.bot.event.on_commands.GetUsernameAndId;
import cc.sukazyo.cono.morny.util.StringUtils;
import com.pengrad.telegrambot.model.Update;
import com.pengrad.telegrambot.model.request.ParseMode;
import com.pengrad.telegrambot.request.SendMessage;
@ -32,37 +32,33 @@ public class OnCommandExecute extends EventListener {
@Override
public boolean onMessage (@Nonnull Update event) {
if (event.message().text() == null) {
return false;
return false; // 检测到无消息文本忽略掉命令处理
}
final String[] command = StringUtils.formatCommand(event.message().text());
if (command.length == 0) return false;
switch (command[0]) {
final InputCommand command = new InputCommand(event.message().text());
if (command.getTarget() != null && !MornyCoeur.username.equals(command.getTarget())) {
return true; // 检测到命令并非针对 morny退出整个事件处理链
}
switch (command.getCommand()) {
case "/user":
case "/user@" + MornyCoeur.USERNAME:
GetUsernameAndId.exec(command, event);
GetUsernameAndId.exec(command.getArgs(), event);
break;
case "/o":
case "/o@" + MornyCoeur.USERNAME:
onCommandOnExec(event);
break;
case "/hi":
case "/hi@" + MornyCoeur.USERNAME:
case "/hello":
case "/hello@" + MornyCoeur.USERNAME:
onCommandHelloExec(event);
break;
case "/exit":
case "/exit@" + MornyCoeur.USERNAME:
onCommandExitExec(event);
break;
case "/version":
case "/version@" + MornyCoeur.USERNAME:
onCommandVersionExec(event);
break;
default:
return false;
return false; // 无法解析的命令转交事件链后代处理
}
return true;
return true; // 命令执行成功标记事件为已处理退出事件链
}
private void onCommandOnExec (@Nonnull Update event) {

View File

@ -12,9 +12,9 @@ import javax.annotation.Nonnull;
public class GetUsernameAndId {
public static void exec (@Nonnull String[] command, @Nonnull Update event) {
public static void exec (@Nonnull String[] args, @Nonnull Update event) {
if (command.length > 2) { MornyCoeur.getAccount().execute(new SendMessage(
if (args.length > 1) { MornyCoeur.getAccount().execute(new SendMessage(
event.message().chat().id(),
"[Unavailable] Too much arguments."
).replyToMessageId(event.message().messageId())); return; }
@ -24,9 +24,9 @@ public class GetUsernameAndId {
if ( event.message().replyToMessage()!= null) {
userId = event.message().replyToMessage().from().id();
}
if (command.length > 1) {
if (args.length > 0) {
try {
userId = Long.parseLong(command[1]);
userId = Long.parseLong(args[0]);
} catch (NumberFormatException e) {
MornyCoeur.getAccount().execute(new SendMessage(
event.message().chat().id(),
@ -60,18 +60,21 @@ public class GetUsernameAndId {
final StringBuilder userInformation = new StringBuilder();
userInformation.append(String.format(
"userid :\n" +
"- <code>%d</code>\n" +
"username :\n" +
"- <code>%s</code>",
"""
userid :
- <code>%d</code>
username :
- <code>%s</code>""",
userId, user.username()
));
if (user.firstName() == null) {
userInformation.append("\nfirstname : <u>null</u>");
} else {
userInformation.append(String.format(
"\nfirstname :\n" +
"- <code>%s</code>",
"""
firstname :
- <code>%s</code>""",
user.firstName()
));
}
@ -79,15 +82,19 @@ public class GetUsernameAndId {
userInformation.append("\nlastname : <u>null</u>");
} else {
userInformation.append(String.format(
"\nlastname :\n" +
"- <code>%s</code>",
"""
lastname :
- <code>%s</code>""",
user.lastName()
));
}
if (user.languageCode() != null) {
userInformation.append(String.format(
"\nlanguage-code :\n" +
"- <code>%s</code>",
"""
language-code :
- <code>%s</code>""",
user.languageCode()
));
}