diff --git a/src/main/java/net/lamgc/cgj/bot/CQPluginMain.java b/src/main/java/net/lamgc/cgj/bot/CQPluginMain.java index 287aee6..c15905e 100644 --- a/src/main/java/net/lamgc/cgj/bot/CQPluginMain.java +++ b/src/main/java/net/lamgc/cgj/bot/CQPluginMain.java @@ -16,6 +16,8 @@ import org.springframework.stereotype.Component; public class CQPluginMain extends CQPlugin implements EventHandler { public CQPluginMain() { + // TODO(LamGC, 2020.04.21): SpringCQ无法适配MessageSenderBuilder + BotEventHandler.preLoad(); LoggerFactory.getLogger(this.toString()) .info("BotEventHandler.COMMAND_PREFIX = {}", BotEventHandler.COMMAND_PREFIX); } diff --git a/src/main/java/net/lamgc/cgj/bot/MiraiMain.java b/src/main/java/net/lamgc/cgj/bot/MiraiMain.java index 2dfd83b..9b4b7a2 100644 --- a/src/main/java/net/lamgc/cgj/bot/MiraiMain.java +++ b/src/main/java/net/lamgc/cgj/bot/MiraiMain.java @@ -2,6 +2,8 @@ package net.lamgc.cgj.bot; import net.lamgc.cgj.bot.event.BotEventHandler; import net.lamgc.cgj.bot.event.MiraiMessageEvent; +import net.lamgc.cgj.bot.message.MessageSenderBuilder; +import net.lamgc.cgj.bot.message.MiraiMessageSenderFactory; import net.mamoe.mirai.Bot; import net.mamoe.mirai.japt.Events; import net.mamoe.mirai.message.FriendMessage; @@ -44,6 +46,8 @@ public class MiraiMain implements Closeable { Events.subscribeAlways(GroupMessage.class, (msg) -> BotEventHandler.executor.executor(new MiraiMessageEvent(msg))); Events.subscribeAlways(FriendMessage.class, (msg) -> BotEventHandler.executor.executor(new MiraiMessageEvent(msg))); bot.login(); + MessageSenderBuilder.setCurrentMessageSenderFactory(new MiraiMessageSenderFactory(bot)); + BotEventHandler.preLoad(); bot.join(); } diff --git a/src/main/java/net/lamgc/cgj/bot/message/MessageSenderBuilder.java b/src/main/java/net/lamgc/cgj/bot/message/MessageSenderBuilder.java new file mode 100644 index 0000000..33cb78b --- /dev/null +++ b/src/main/java/net/lamgc/cgj/bot/message/MessageSenderBuilder.java @@ -0,0 +1,43 @@ +package net.lamgc.cgj.bot.message; + +import java.util.concurrent.atomic.AtomicReference; + +/** + * 消息发送器构造 + */ +public final class MessageSenderBuilder { + + private final static AtomicReference currentFactory = new AtomicReference<>(); + + private MessageSenderBuilder() {} + + /** + * 获取消息发送器 + * @param source 消息源类型 + * @param id 消息源Id + * @return 返回新建的发送器 + */ + public static MessageSender getMessageSender(MessageSource source, long id) { + MessageSenderFactory messageSenderFactory = currentFactory.get(); + if(messageSenderFactory == null) { + throw new IllegalStateException("The factory is not ready"); + } + try { + return messageSenderFactory.createMessageSender(source, id); + } catch (Exception e) { + throw new IllegalStateException(e); + } + } + + /** + * 设置消息发送器工厂 + * @param factory 工厂对象 + */ + public static void setCurrentMessageSenderFactory(MessageSenderFactory factory) { + if(currentFactory.get() != null) { + throw new IllegalStateException("Factory already exists"); + } + currentFactory.set(factory); + } + +} diff --git a/src/main/java/net/lamgc/cgj/bot/message/MessageSenderFactory.java b/src/main/java/net/lamgc/cgj/bot/message/MessageSenderFactory.java new file mode 100644 index 0000000..9c6e9e4 --- /dev/null +++ b/src/main/java/net/lamgc/cgj/bot/message/MessageSenderFactory.java @@ -0,0 +1,13 @@ +package net.lamgc.cgj.bot.message; + +public interface MessageSenderFactory { + + /** + * 通过Id创建发送器 + * @param source 消息源 + * @param id 消息源id + * @return 如果成功返回MessageSender + */ + MessageSender createMessageSender(MessageSource source, long id) throws Exception; + +} diff --git a/src/main/java/net/lamgc/cgj/bot/message/MiraiMessageSenderFactory.java b/src/main/java/net/lamgc/cgj/bot/message/MiraiMessageSenderFactory.java new file mode 100644 index 0000000..2bccf5d --- /dev/null +++ b/src/main/java/net/lamgc/cgj/bot/message/MiraiMessageSenderFactory.java @@ -0,0 +1,25 @@ +package net.lamgc.cgj.bot.message; + +import net.mamoe.mirai.Bot; + +public class MiraiMessageSenderFactory implements MessageSenderFactory { + + private final Bot bot; + + public MiraiMessageSenderFactory(Bot bot) { + this.bot = bot; + } + + @Override + public MessageSender createMessageSender(MessageSource source, long id) throws Exception { + switch(source) { + case Group: + case Discuss: + return new MiraiMessageSender(bot.getGroup(id), source); + case Private: + return new MiraiMessageSender(bot.getFriend(id), source); + default: + throw new NoSuchFieldException(source.toString()); + } + } +} diff --git a/src/main/java/net/lamgc/cgj/bot/message/SpringCQMessageSenderFactory.java b/src/main/java/net/lamgc/cgj/bot/message/SpringCQMessageSenderFactory.java new file mode 100644 index 0000000..a9ca6ef --- /dev/null +++ b/src/main/java/net/lamgc/cgj/bot/message/SpringCQMessageSenderFactory.java @@ -0,0 +1,17 @@ +package net.lamgc.cgj.bot.message; + +import net.lz1998.cq.robot.CoolQ; + +public class SpringCQMessageSenderFactory implements MessageSenderFactory { + + private final CoolQ coolQ; + + public SpringCQMessageSenderFactory(CoolQ coolQ) { + this.coolQ = coolQ; + } + + @Override + public MessageSender createMessageSender(MessageSource source, long id) { + return new SpringCQMessageSender(coolQ, source, id); + } +}