Skip to content

Commit 5f82922

Browse files
committed
[qqrobot] version:2.10.3_0_0
1. 添加并完成新功能 “二维码解析/生成” 2. 发送图片后使用ExternalResource.close()关闭资源,防止内存泄露; 3. weather命令添加无选项时的情况:无选项options但带参数arg1,则读取arg1作为-a选项的参数
1 parent 7e3e643 commit 5f82922

File tree

10 files changed

+373
-7
lines changed

10 files changed

+373
-7
lines changed

qqrobot/pom.xml

Lines changed: 14 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,7 @@
1010
</parent>
1111
<groupId>cn.ultronxr</groupId>
1212
<artifactId>qqrobot</artifactId>
13-
<version>2.10.2_8_1</version>
13+
<version>2.10.3_0_0</version>
1414
<name>qqrobot</name>
1515
<description>A QQ Robot based on Mirai framework.</description>
1616

@@ -47,6 +47,7 @@
4747
<quartz.version>2.3.2</quartz.version>
4848
<jsoup.version>1.14.2</jsoup.version>
4949
<xk-time.version>3.1.0</xk-time.version>
50+
<zxing.version>3.4.1</zxing.version>
5051
</properties>
5152

5253
<dependencies>
@@ -301,6 +302,18 @@
301302
<version>${xk-time.version}</version>
302303
</dependency>
303304

305+
<!-- 二维码 -->
306+
<dependency>
307+
<groupId>com.google.zxing</groupId>
308+
<artifactId>core</artifactId>
309+
<version>${zxing.version}</version>
310+
</dependency>
311+
<dependency>
312+
<groupId>com.google.zxing</groupId>
313+
<artifactId>javase</artifactId>
314+
<version>${zxing.version}</version>
315+
</dependency>
316+
304317

305318
</dependencies>
306319

qqrobot/src/main/java/cn/ultronxr/qqrobot/QqrobotApplication.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -19,8 +19,8 @@ public class QqrobotApplication {
1919

2020
public static void main(String[] args) {
2121
SpringApplication.run(QqrobotApplication.class, args);
22-
//BotEntity.BOT_ENTITY.login();
23-
//BotEntity.BOT_ENTITY.join();
22+
BotEntity.BOT_ENTITY.login();
23+
BotEntity.BOT_ENTITY.join();
2424
}
2525

2626
}

qqrobot/src/main/java/cn/ultronxr/qqrobot/config/BotMenuConfig.java

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -64,6 +64,9 @@ public class BotMenuConfig {
6464
@Autowired
6565
private MsgClearHandler msgClearHandler;
6666

67+
@Autowired
68+
private MsgQRCodeHandler msgQRCodeHandler;
69+
6770

6871
/**
6972
* 初始化BOT命令菜单BotMenu
Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,27 @@
1+
package cn.ultronxr.qqrobot.eventHandler;
2+
3+
import cn.ultronxr.qqrobot.bean.BotCmd;
4+
import net.mamoe.mirai.event.events.GroupMessageEvent;
5+
import org.apache.commons.cli.CommandLine;
6+
7+
/**
8+
* @author Ultronxr
9+
* @date 2022/02/17 17:56
10+
*
11+
* 消息事件 - 二维码Handler
12+
*/
13+
public interface MsgQRCodeHandler {
14+
15+
/**
16+
* 套用BotCmd/BotMenu框架
17+
* 群聊中的 二维码 命令处理器
18+
*
19+
* @param botCmd 匹配成功的命令BotCmd对象
20+
* @param cmdLine 解析完成的CommandLine对象
21+
* @param groupMsgEvent 群消息事件
22+
* @param msgPlain 纯消息主体文本内容(MiraiUtils自定义消息类型三)
23+
* {@link cn.ultronxr.qqrobot.util.MiraiUtils#getMsgPlain(net.mamoe.mirai.event.events.MessageEvent)}
24+
*/
25+
void groupQRCodeHandler(BotCmd botCmd, CommandLine cmdLine, GroupMessageEvent groupMsgEvent, String msgPlain);
26+
27+
}

qqrobot/src/main/java/cn/ultronxr/qqrobot/eventHandler/eventHandlerImpl/GroupInfoHandlerImpl.java

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -56,8 +56,10 @@ private void defaultMemberJoinAction(MemberJoinEvent memberJoinEvent, Long newMe
5656
Image image = null;
5757
try {
5858
InputStream inputStream = this.getClass().getResourceAsStream(GROUP_NEW_MEMBER_JOIN_JPG_FILEPATH);
59-
image = memberJoinEvent.getGroup().uploadImage(ExternalResource.create(inputStream));
59+
ExternalResource externalResource = ExternalResource.create(inputStream);
60+
image = memberJoinEvent.getGroup().uploadImage(externalResource);
6061
inputStream.close();
62+
externalResource.close();
6163
} catch (IOException ex) {
6264
ex.printStackTrace();
6365
log.warn("[function] 新成员入群提示图片获取失败!");

qqrobot/src/main/java/cn/ultronxr/qqrobot/eventHandler/eventHandlerImpl/MsgImgHandlerImpl.java

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -57,9 +57,11 @@ public void groupImgPornHubIconHandler(BotCmd botCmd, CommandLine cmdLine, Group
5757

5858
try {
5959
InputStream inputStream = imgService.createPornHubIconImgInputStream(prefix, suffix);
60-
Image image = groupMsgEvent.getSubject().uploadImage(ExternalResource.create(inputStream));
60+
ExternalResource externalResource = ExternalResource.create(inputStream);
61+
Image image = groupMsgEvent.getSubject().uploadImage(externalResource);
6162
inputStream.close();
6263
groupMsgEvent.getSubject().sendMessage(image);
64+
externalResource.close();
6365
log.info("[Msg-Send] 发送PornHub图标样式图片:prefix suffix - {} {}", prefix, suffix);
6466
} catch (IOException ex) {
6567
ex.printStackTrace();
Lines changed: 130 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,130 @@
1+
package cn.ultronxr.qqrobot.eventHandler.eventHandlerImpl;
2+
3+
import cn.ultronxr.qqrobot.bean.BotCmd;
4+
import cn.ultronxr.qqrobot.eventHandler.MsgQRCodeHandler;
5+
import cn.ultronxr.qqrobot.util.CommonCliUtils;
6+
import cn.ultronxr.qqrobot.util.QRCodeUtils;
7+
import com.google.zxing.NotFoundException;
8+
import com.google.zxing.WriterException;
9+
import lombok.extern.slf4j.Slf4j;
10+
import net.mamoe.mirai.event.events.GroupMessageEvent;
11+
import net.mamoe.mirai.message.data.Image;
12+
import net.mamoe.mirai.message.data.Message;
13+
import net.mamoe.mirai.message.data.MessageChain;
14+
import net.mamoe.mirai.message.data.MessageChainBuilder;
15+
import net.mamoe.mirai.utils.ExternalResource;
16+
import org.apache.commons.cli.CommandLine;
17+
import org.springframework.stereotype.Component;
18+
19+
import javax.imageio.ImageIO;
20+
import java.awt.image.BufferedImage;
21+
import java.io.ByteArrayInputStream;
22+
import java.io.IOException;
23+
import java.net.URL;
24+
25+
/**
26+
* @author Ultronxr
27+
* @date 2022/02/17 17:57
28+
*/
29+
@Component
30+
@Slf4j
31+
public class MsgQRCodeHandlerImpl implements MsgQRCodeHandler {
32+
33+
34+
@Override
35+
public void groupQRCodeHandler(BotCmd botCmd, CommandLine cmdLine, GroupMessageEvent groupMsgEvent, String msgPlain) {
36+
if(cmdLine.hasOption("help")) {
37+
// 优先判断 --help 选项
38+
CommonCliUtils.defaultOptionHelper(groupMsgEvent, botCmd);
39+
return;
40+
}
41+
42+
String msgRes = "";
43+
String content = null;
44+
// 无任何选项时
45+
if(cmdLine.getOptions().length == 0 && cmdLine.getArgList().size() > 1) {
46+
// 如果无选项但带了arg1参数,如 ">qr 待转换成二维码的文本内容"
47+
content = cmdLine.getArgList().get(1);
48+
} else if(cmdLine.hasOption("e")) {
49+
content = cmdLine.getOptionValue("e");
50+
} else if(cmdLine.hasOption("d")) {
51+
msgRes = handleDecode(groupMsgEvent);
52+
} else {
53+
CommonCliUtils.defaultOptionExceptionHandler(groupMsgEvent);
54+
return;
55+
}
56+
57+
MessageChainBuilder msgChainBuilder = new MessageChainBuilder();
58+
if(content != null) {
59+
Image image = handleEncode(content, groupMsgEvent);
60+
if(null != image){
61+
msgChainBuilder.append(image);
62+
}
63+
}
64+
65+
msgChainBuilder.append(msgRes);
66+
MessageChain msgChain = msgChainBuilder.build();
67+
68+
groupMsgEvent.getSubject().sendMessage(msgChain);
69+
log.info("[Msg-Send] {}", msgChain.contentToString());
70+
}
71+
72+
/**
73+
* 生成二维码图片并发送
74+
*/
75+
private Image handleEncode(String content, GroupMessageEvent groupMsgEvent) {
76+
Image image = null;
77+
// 默认二维码图片大小200px*200px
78+
int size = 200;
79+
if(content.length() > 90) {
80+
size = 600;
81+
} else if(content.length() > 45) {
82+
size = 400;
83+
}
84+
try {
85+
ByteArrayInputStream inputStream = new ByteArrayInputStream(
86+
QRCodeUtils.encoderToStream(content, "png", size, size).toByteArray());
87+
ExternalResource externalResource = ExternalResource.create(inputStream);
88+
image = groupMsgEvent.getGroup().uploadImage(externalResource);
89+
inputStream.close();
90+
externalResource.close();
91+
} catch (IOException | WriterException ex) {
92+
ex.printStackTrace();
93+
log.error("[function] 二维码图片操作失败!");
94+
}
95+
return image;
96+
}
97+
98+
/**
99+
* 解析二维码图片,并发送解析结果
100+
*/
101+
private String handleDecode(GroupMessageEvent groupMsgEvent) {
102+
String res = "";
103+
MessageChain msgChain = groupMsgEvent.getMessage();
104+
for(Message msg : msgChain) {
105+
if(msg instanceof Image) {
106+
Image img = Image.fromId(((Image) msg).getImageId());
107+
String url = Image.queryUrl(img);
108+
log.info("[function] 解析二维码图片:图片ID - {} ; 图片URL - {}", img.getImageId(), url);
109+
try {
110+
BufferedImage bufferedImage = ImageIO.read(new URL(url));
111+
res = QRCodeUtils.decoderByBufferedImage(bufferedImage);
112+
break;
113+
} catch (IOException ex) {
114+
ex.printStackTrace();
115+
res = "解析二维码图片时IO出错!";
116+
log.error("[function] {}", res);
117+
} catch (NotFoundException ex) {
118+
ex.printStackTrace();
119+
res = "图像中未发现/无法解析二维码!";
120+
log.warn("[function] {}", res);
121+
}
122+
}
123+
}
124+
if(res.length() == 0) {
125+
res = "请在同一条消息内发送指令和二维码图片。";
126+
}
127+
return res;
128+
}
129+
130+
}

qqrobot/src/main/java/cn/ultronxr/qqrobot/eventHandler/eventHandlerImpl/MsgWeatherHandlerImpl.java

Lines changed: 8 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -34,9 +34,15 @@ public void groupWeatherHandler(BotCmd botCmd, CommandLine cmdLine, GroupMessage
3434
}
3535

3636
String area = null;
37+
// 无任何选项时
3738
if(cmdLine.getOptions().length == 0) {
38-
// 无任何选项时,地区默认设置为杭州
39-
area = "杭州";
39+
if(cmdLine.getArgList().size() > 1) {
40+
// 如果无选项但带了arg1参数,如 ">weather 萧山区"
41+
area = cmdLine.getArgList().get(1);
42+
} else {
43+
// 无选项且无参数,地区默认设置为杭州
44+
area = "杭州";
45+
}
4046
} else if(cmdLine.hasOption("a")) {
4147
// 有 -a 选项时,获取地区名称
4248
area = cmdLine.getOptionValue("a");

0 commit comments

Comments
 (0)