[Change] 调整包路径;

[Change] 修改 CQPluginMain 功能, 将命令处理的具体细节迁移;
This commit is contained in:
LamGC 2020-04-11 12:18:43 +08:00
parent a0efc3c0af
commit 7d843c3f77
4 changed files with 54 additions and 178 deletions

View File

@ -1,171 +0,0 @@
package net.lamgc.cgj;
import com.google.common.base.Strings;
import net.lamgc.cgj.util.DateParser;
import net.lamgc.cgj.util.PagesQualityParser;
import net.lamgc.utils.base.runner.ArgumentsRunner;
import net.lamgc.utils.base.runner.ArgumentsRunnerConfig;
import net.lamgc.utils.base.runner.exception.DeveloperRunnerException;
import net.lamgc.utils.base.runner.exception.NoSuchCommandException;
import net.lamgc.utils.base.runner.exception.ParameterNoFoundException;
import net.lz1998.cq.event.message.CQDiscussMessageEvent;
import net.lz1998.cq.event.message.CQGroupMessageEvent;
import net.lz1998.cq.event.message.CQMessageEvent;
import net.lz1998.cq.event.message.CQPrivateMessageEvent;
import net.lz1998.cq.robot.CQPlugin;
import net.lz1998.cq.robot.CoolQ;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.stereotype.Component;
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Objects;
import java.util.Properties;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
@Component
public class CQPluginMain extends CQPlugin {
private final static String COMMAND_PREFIX = ".cgj";
private final Logger log = LoggerFactory.getLogger("CQPluginMain@" + Integer.toHexString(this.hashCode()));
private final ArgumentsRunnerConfig runnerConfig = new ArgumentsRunnerConfig();
private final ArgumentsRunner adminRunner;
private final ArgumentsRunner processRunner;
public final static Properties globalProp = new Properties();
public CQPluginMain() {
runnerConfig.setUseDefaultValueInsteadOfException(true);
runnerConfig.setCommandIgnoreCase(true);
runnerConfig.addStringParameterParser(new DateParser(new SimpleDateFormat("yyyy-MM-dd")));
runnerConfig.addStringParameterParser(new PagesQualityParser());
processRunner = new ArgumentsRunner(CQProcess.class, runnerConfig);
adminRunner = new ArgumentsRunner(CQBotAdminProcess.class, runnerConfig);
File globalPropFile = new File("./global.properties");
if(globalPropFile.exists() && globalPropFile.isFile()) {
log.info("正在加载全局配置文件...");
try {
globalProp.load(new FileInputStream(globalPropFile));
log.info("全局配置文件加载完成.");
} catch (IOException e) {
log.error("加载全局配置文件时发生异常", e);
}
} else {
log.info("未找到全局配置文件,跳过加载.");
}
}
@Override
public int onPrivateMessage(CoolQ cq, CQPrivateMessageEvent event) {
//log.info("私聊消息到达: 发送者[{}], 消息内容: {}", event.getSender().getUserId(), event.getMessage());
return processMessage(cq, event);
}
@Override
public int onGroupMessage(CoolQ cq, CQGroupMessageEvent event) {
//log.info("群消息到达: 群[{}], 发送者[{}], 消息内容: {}", event.getGroupId(), event.getSender().getUserId(), event.getMessage());
return processMessage(cq, event);
}
@Override
public int onDiscussMessage(CoolQ cq, CQDiscussMessageEvent event) {
//log.info("讨论组消息到达: 群[{}], 发送者[{}], 消息内容: {}", event.getDiscussId(), event.getSender().getUserId(), event.getMessage());
return processMessage(cq, event);
}
public int processMessage(CoolQ cq, CQMessageEvent event) {
String msg = event.getMessage();
if(!msg.startsWith(COMMAND_PREFIX)) {
return MESSAGE_IGNORE;
}
Pattern pattern = Pattern.compile("/\\s*(\".+?\"|[^:\\s])+((\\s*:\\s*(\".+?\"|[^\\s])+)|)|(\".+?\"|[^\"\\s])+");
Matcher matcher = pattern.matcher(Strings.nullToEmpty(msg));
ArrayList<String> argsList = new ArrayList<>();
while (matcher.find()) {
String arg = matcher.group();
int startIndex = 0;
int endIndex = arg.length();
if(arg.startsWith("\"")) {
while(arg.indexOf("\"", startIndex) == startIndex) {
startIndex++;
}
}
if(arg.endsWith("\"")) {
while(arg.charAt(endIndex - 1) == '\"') {
endIndex--;
}
}
argsList.add(arg.substring(startIndex, endIndex));
}
String[] args = new String[argsList.size()];
argsList.toArray(args);
log.debug("传入参数: {}", Arrays.toString(args));
log.warn("正在处理命令...");
long time = System.currentTimeMillis();
Object result;
try {
if(msg.toLowerCase().startsWith(COMMAND_PREFIX + "admin")) {
if(!String.valueOf(event.getUserId()).equals(globalProp.getProperty("admin.adminId"))) {
sendMessage(cq, event, "你没有执行该命令的权限!", false);
return MESSAGE_BLOCK;
} else {
result = adminRunner.run(new CQBotAdminProcess(), args.length <= 1 ? new String[0] : Arrays.copyOfRange(args, 1, args.length));
}
} else {
result = processRunner.run(args.length <= 1 ? new String[0] : Arrays.copyOfRange(args, 1, args.length));
}
} catch(NoSuchCommandException e) {
result = "没有这个命令!请使用“.cgj”查看帮助说明";
} catch(ParameterNoFoundException e) {
result = "命令缺少参数: " + e.getParameterName();
} catch(DeveloperRunnerException e) {
log.error("执行命令时发生异常", e);
result = "命令执行时发生错误,无法完成!";
}
log.warn("命令处理完成(耗时: {}ms)", System.currentTimeMillis() - time);
if(Objects.requireNonNull(result) instanceof String) {
try {
sendMessage(cq, event, (String) result, false);
} catch (Throwable e) {
log.error("发送消息时发生异常", e);
}
}
return MESSAGE_BLOCK;
}
private final static Logger msgLog = LoggerFactory.getLogger("SendMsg");
/**
* 发送消息
* @param cq CoolQ对象
* @param event 消息事件对象
* @param message 消息内容
* @param auto_escape 消息内容是否作为纯文本发送即不解析 CQ 只在 message 字段是字符串时有效.
*/
public static void sendMessage(CoolQ cq, CQMessageEvent event, String message, boolean auto_escape) {
msgLog.debug("发送消息:{}", message);
if(event instanceof CQPrivateMessageEvent) {
CQPrivateMessageEvent _event = (CQPrivateMessageEvent) event;
cq.sendPrivateMsg(_event.getSender().getUserId(), message, auto_escape);
} else if(event instanceof CQGroupMessageEvent) {
CQGroupMessageEvent _event = (CQGroupMessageEvent) event;
cq.sendGroupMsg(_event.getGroupId(), message, auto_escape);
} else if(event instanceof CQDiscussMessageEvent) {
CQDiscussMessageEvent _event = (CQDiscussMessageEvent) event;
cq.sendGroupMsg(_event.getDiscussId(), message, auto_escape).getData().getMessageId();
}
}
}

View File

@ -1,4 +1,4 @@
package net.lamgc.cgj;
package net.lamgc.cgj.bot;
import com.google.common.util.concurrent.ThreadFactoryBuilder;
import net.lz1998.cq.CQGlobal;
@ -22,8 +22,6 @@ public class CQConfig {
.setNameFormat("Plugin-ProcessThread-%d")
.build()
);
CQProcess.initialize();
}
}

View File

@ -0,0 +1,49 @@
package net.lamgc.cgj.bot;
import net.lamgc.cgj.bot.event.BotEventHandler;
import net.lamgc.cgj.bot.event.SpringCQMessageEvent;
import net.lamgc.utils.event.EventHandler;
import net.lz1998.cq.event.message.CQDiscussMessageEvent;
import net.lz1998.cq.event.message.CQGroupMessageEvent;
import net.lz1998.cq.event.message.CQMessageEvent;
import net.lz1998.cq.event.message.CQPrivateMessageEvent;
import net.lz1998.cq.robot.CQPlugin;
import net.lz1998.cq.robot.CoolQ;
import org.slf4j.LoggerFactory;
import org.springframework.stereotype.Component;
@Component
public class CQPluginMain extends CQPlugin implements EventHandler {
public CQPluginMain() {
LoggerFactory.getLogger(this.toString())
.info("BotEventHandler.COMMAND_PREFIX = {}", BotEventHandler.COMMAND_PREFIX);
}
@Override
public int onPrivateMessage(CoolQ cq, CQPrivateMessageEvent event) {
//log.info("私聊消息到达: 发送者[{}], 消息内容: {}", event.getSender().getUserId(), event.getMessage());
return processMessage(cq, event);
}
@Override
public int onGroupMessage(CoolQ cq, CQGroupMessageEvent event) {
//log.info("群消息到达: 群[{}], 发送者[{}], 消息内容: {}", event.getGroupId(), event.getSender().getUserId(), event.getMessage());
return processMessage(cq, event);
}
@Override
public int onDiscussMessage(CoolQ cq, CQDiscussMessageEvent event) {
//log.info("讨论组消息到达: 群[{}], 发送者[{}], 消息内容: {}", event.getDiscussId(), event.getSender().getUserId(), event.getMessage());
return processMessage(cq, event);
}
public int processMessage(CoolQ cq, CQMessageEvent event) {
if(!BotEventHandler.match(event.getMessage())) {
return MESSAGE_IGNORE;
}
BotEventHandler.executor.executor(new SpringCQMessageEvent(cq, event));
return MESSAGE_BLOCK;
}
}

View File

@ -1,4 +1,4 @@
package net.lamgc.cgj;
package net.lamgc.cgj.bot;
import net.lamgc.cgj.pixiv.PixivURL;
import org.slf4j.Logger;
@ -14,7 +14,7 @@ import java.util.TimerTask;
public class RankingUpdateTimer {
private final Timer timer = new Timer("PixivRankingUpdate@" + Integer.toHexString(this.hashCode()), true);
private final Logger log = LoggerFactory.getLogger("RankingUpdateTimer@" + Integer.toHexString(this.hashCode()));
private final Logger log = LoggerFactory.getLogger(this.toString());
/**
* 启动定时任务.
@ -33,7 +33,7 @@ public class RankingUpdateTimer {
cal.set(Calendar.SECOND, 0);
cal.set(Calendar.MILLISECOND, 0);
log.info("已设置排行榜定时更新, 首次运行时间: {}", cal.getTime());
log.warn("已设置排行榜定时更新, 首次运行时间: {}", cal.getTime());
timer.schedule(new TimerTask() {
@Override
public void run() {
@ -65,7 +65,7 @@ public class RankingUpdateTimer {
}
log.info("当前排行榜类型: {}.{}, 正在更新...", rankingMode.name(), contentType.name());
try {
CQProcess.getRankingInfoByCache(contentType, rankingMode, calendar.getTime(), 1, 0, true);
BotCommandProcess.getRankingInfoByCache(contentType, rankingMode, calendar.getTime(), 1, 0, true);
log.info("排行榜 {}.{} 更新完成.", rankingMode.name(), contentType.name());
} catch (IOException e) {
log.error("排行榜 {}.{} 更新时发生异常", rankingMode.name(), contentType.name());