From 5830327dad206809f034830d2aa56a21d0f98995 Mon Sep 17 00:00:00 2001 From: LamGC Date: Thu, 7 May 2020 19:46:54 +0800 Subject: [PATCH] =?UTF-8?q?[Add]=20BotEventHandler=20=E5=A2=9E=E5=8A=A0?= =?UTF-8?q?=E7=A6=81=E8=A8=80=E8=AE=B0=E5=BD=95,=20=E9=98=B2=E6=AD=A2?= =?UTF-8?q?=E5=BA=94=E7=94=A8=E5=9B=A0=E8=BF=87=E5=A4=9A=E7=9A=84=E5=9C=A8?= =?UTF-8?q?=E7=A6=81=E8=A8=80=E7=8A=B6=E6=80=81=E5=8F=8D=E9=A6=88=E5=AF=BC?= =?UTF-8?q?=E8=87=B4=E8=A2=AB=E5=B0=81=E5=8F=B7;=20[Update]=20MiraiMain=20?= =?UTF-8?q?=E9=80=82=E9=85=8D=E7=A6=81=E8=A8=80=E8=AE=B0=E5=BD=95=E5=8A=9F?= =?UTF-8?q?=E8=83=BD;?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../lamgc/cgj/bot/event/BotEventHandler.java | 45 ++++++++++++++++++- .../cgj/bot/framework/mirai/MiraiMain.java | 26 ++++++++++- 2 files changed, 68 insertions(+), 3 deletions(-) diff --git a/src/main/java/net/lamgc/cgj/bot/event/BotEventHandler.java b/src/main/java/net/lamgc/cgj/bot/event/BotEventHandler.java index 7c16c9b..24fa75f 100644 --- a/src/main/java/net/lamgc/cgj/bot/event/BotEventHandler.java +++ b/src/main/java/net/lamgc/cgj/bot/event/BotEventHandler.java @@ -41,6 +41,8 @@ public class BotEventHandler implements EventHandler { private final static Logger log = LoggerFactory.getLogger(BotEventHandler.class.getName()); + private final static Map muteStateMap = new Hashtable<>(); + /** * 所有缓存共用的JedisPool */ @@ -158,6 +160,9 @@ public class BotEventHandler implements EventHandler { log.debug(event.toString()); if(!match(msg)) { return; + } else if(isMute(event.getFromGroup())) { + log.debug("机器人已被禁言, 忽略请求."); + return; } Pattern pattern = Pattern.compile("/\\s*(\".+?\"|[^:\\s])+((\\s*:\\s*(\".+?\"|[^\\s])+)|)|(\".+?\"|[^\"\\s])+"); @@ -219,12 +224,14 @@ public class BotEventHandler implements EventHandler { } } long processTime = System.currentTimeMillis() - time; - if(Objects.requireNonNull(result) instanceof String) { + if(Objects.requireNonNull(result) instanceof String && !isMute(event.getFromGroup())) { try { event.sendMessage((String) result); } catch (Exception e) { log.error("发送消息时发生异常", e); } + } else if(isMute(event.getFromGroup())) { + log.warn("命令反馈时机器人已被禁言, 跳过反馈."); } long totalTime = System.currentTimeMillis() - time; log.info("命令反馈完成.(事件耗时: {}ms, P: {}%({}ms), R: {}%({}ms))", totalTime, @@ -241,4 +248,40 @@ public class BotEventHandler implements EventHandler { return message.startsWith(COMMAND_PREFIX) || message.startsWith(ADMIN_COMMAND_PREFIX); } + private static boolean isMute(long groupId) { + Boolean mute = isMute(groupId, false); + return mute != null && mute; + } + + /** + * 查询某群是否被禁言. + * @param groupId 群组Id + * @param rawValue 是否返回原始值(当没有该群状态, 且本参数为true时, 将返回null) + * @return 返回状态值, 如无该群禁言记录且rawValue = true, 则返回null + */ + public static Boolean isMute(long groupId, boolean rawValue) { + if(groupId <= 0) { + return false; + } + AtomicBoolean state = muteStateMap.get(groupId); + if(state == null && rawValue) { + return null; + } + return state != null && state.get(); + } + + /** + * 设置机器人禁言状态. + *

设置该项可防止因机器人在禁言期间反馈请求导致被封号.

+ * @param mute 如果被禁言, 传入true + */ + public static void setMuteState(long groupId, boolean mute) { + if(!muteStateMap.containsKey(groupId)) { + muteStateMap.put(groupId, new AtomicBoolean(mute)); + } else { + muteStateMap.get(groupId).set(mute); + } + log.warn("群组 {} 机器人禁言状态已变更: {}", groupId, mute ? "已禁言" : "已解除"); + } + } diff --git a/src/main/java/net/lamgc/cgj/bot/framework/mirai/MiraiMain.java b/src/main/java/net/lamgc/cgj/bot/framework/mirai/MiraiMain.java index 7250058..97e14fe 100644 --- a/src/main/java/net/lamgc/cgj/bot/framework/mirai/MiraiMain.java +++ b/src/main/java/net/lamgc/cgj/bot/framework/mirai/MiraiMain.java @@ -6,7 +6,10 @@ import net.lamgc.cgj.bot.message.MessageSenderBuilder; import net.lamgc.cgj.bot.framework.mirai.message.MiraiMessageSenderFactory; import net.mamoe.mirai.Bot; import net.mamoe.mirai.BotFactoryJvm; +import net.mamoe.mirai.event.events.BotMuteEvent; +import net.mamoe.mirai.event.events.BotUnmuteEvent; import net.mamoe.mirai.japt.Events; +import net.mamoe.mirai.message.ContactMessage; import net.mamoe.mirai.message.FriendMessage; import net.mamoe.mirai.message.GroupMessage; import net.mamoe.mirai.utils.BotConfiguration; @@ -43,14 +46,33 @@ public class MiraiMain implements Closeable { } bot = BotFactoryJvm.newBot(Long.parseLong(botProperties.getProperty("bot.qq", "0")), Base64.decodeBase64(botProperties.getProperty("bot.password", "")), new BotConfiguration()); - Events.subscribeAlways(GroupMessage.class, (msg) -> BotEventHandler.executeMessageEvent(new MiraiMessageEvent(msg))); - Events.subscribeAlways(FriendMessage.class, (msg) -> BotEventHandler.executeMessageEvent(new MiraiMessageEvent(msg))); + Events.subscribeAlways(GroupMessage.class, this::executeMessageEvent); + Events.subscribeAlways(FriendMessage.class, this::executeMessageEvent); + Events.subscribeAlways(BotMuteEvent.class, + event -> BotEventHandler.setMuteState(event.getGroup().getId(), true)); + Events.subscribeAlways(BotUnmuteEvent.class, + event -> BotEventHandler.setMuteState(event.getGroup().getId(), false)); bot.login(); MessageSenderBuilder.setCurrentMessageSenderFactory(new MiraiMessageSenderFactory(bot)); BotEventHandler.preLoad(); bot.join(); } + /** + * 处理消息事件 + * @param message 消息事件对象 + */ + private void executeMessageEvent(ContactMessage message) { + if(message instanceof GroupMessage) { + GroupMessage groupMessage = (GroupMessage) message; + if(BotEventHandler.isMute(groupMessage.getGroup().getId(), true) == null) { + BotEventHandler.setMuteState(groupMessage.getGroup().getId(), + ((GroupMessage) message).getGroup().getBotMuteRemaining() != 0); + } + } + BotEventHandler.executeMessageEvent(new MiraiMessageEvent(message)); + } + public void close() { log.warn("正在关闭机器人..."); bot.close(null);