2
2
3
3
import com .ashin .config .KeywordConfig ;
4
4
import com .ashin .config .QqConfig ;
5
+ import com .ashin .constant .ChatType ;
5
6
import com .ashin .entity .bo .ChatBO ;
6
- import com .ashin .exception . ChatException ;
7
+ import com .ashin .entity . dto . ChatResultDTO ;
7
8
import com .ashin .service .InteractService ;
8
9
import com .ashin .util .BotUtil ;
9
- import com .ashin .util .ImageUtil ;
10
10
import lombok .extern .slf4j .Slf4j ;
11
11
import net .mamoe .mirai .contact .Contact ;
12
- import net .mamoe .mirai .contact .MessageTooLargeException ;
12
+ import net .mamoe .mirai .contact .Friend ;
13
+ import net .mamoe .mirai .contact .Group ;
13
14
import net .mamoe .mirai .event .EventHandler ;
14
15
import net .mamoe .mirai .event .ListenerHost ;
15
16
import net .mamoe .mirai .event .events .*;
16
17
import net .mamoe .mirai .message .data .*;
18
+ import net .mamoe .mirai .utils .ExternalResource ;
17
19
import org .jetbrains .annotations .NotNull ;
18
- import org . springframework . stereotype . Component ;
19
- import javax . annotation . Resource ;
20
- import java .io .File ;
20
+
21
+ import java . io . IOException ;
22
+ import java .io .InputStream ;
21
23
22
24
/**
23
25
* QQ消息处理程序
24
26
*
25
27
* @author ashinnotfound
26
28
* @date 2023/2/1
27
29
*/
28
- @ Component
29
30
@ Slf4j
30
31
public class QqMessageHandler implements ListenerHost {
31
- @ Resource
32
- private InteractService interactService ;
33
- @ Resource
34
- private QqConfig qqConfig ;
35
- @ Resource
36
- private KeywordConfig keywordConfig ;
37
- @ Resource
38
- private BotUtil botUtil ;
32
+ private final InteractService interactService ;
33
+ private final QqConfig qqConfig ;
34
+ private final KeywordConfig keywordConfig ;
35
+ private final BotUtil botUtil ;
36
+
37
+ public QqMessageHandler (InteractService interactService , QqConfig qqConfig , KeywordConfig keywordConfig , BotUtil botUtil ) {
38
+ this .interactService = interactService ;
39
+ this .qqConfig = qqConfig ;
40
+ this .keywordConfig = keywordConfig ;
41
+ this .botUtil = botUtil ;
42
+ }
39
43
40
44
/**
41
45
* 好友消息事件
42
46
*
43
47
* @param event 事件
44
48
*/
45
49
@ EventHandler
46
- public void onFriendMessageEvent (FriendMessageEvent event ){
50
+ public void onFriendMessageEvent (FriendMessageEvent event ) {
47
51
ChatBO chatBO = new ChatBO ();
48
52
chatBO .setSessionId (String .valueOf (event .getSubject ().getId ()));
49
53
String prompt = event .getMessage ().contentToString ().trim ();
@@ -56,7 +60,7 @@ public void onFriendMessageEvent(FriendMessageEvent event){
56
60
* @param event 事件
57
61
*/
58
62
@ EventHandler
59
- public void onGroupMessageEvent (GroupMessageEvent event ){
63
+ public void onGroupMessageEvent (GroupMessageEvent event ) {
60
64
ChatBO chatBO = new ChatBO ();
61
65
chatBO .setSessionId (String .valueOf (event .getSubject ().getId ()));
62
66
if (event .getMessage ().contains (new At (event .getBot ().getId ()))) {
@@ -66,37 +70,80 @@ public void onGroupMessageEvent(GroupMessageEvent event){
66
70
response (event , chatBO , prompt );
67
71
}
68
72
}
73
+
69
74
private void response (@ NotNull MessageEvent event , ChatBO chatBO , String prompt ) {
70
75
if (keywordConfig .getReset ().equals (prompt )) {
71
76
//检测到重置会话指令
72
77
botUtil .resetPrompt (chatBO .getSessionId ());
73
78
event .getSubject ().sendMessage ("重置会话成功" );
74
79
} else {
75
- String response ;
76
- try {
80
+ if (prompt .startsWith (keywordConfig .getImage ())) {
81
+ chatBO .setPrompt (prompt .replaceFirst (keywordConfig .getImage () + " " , "" ));
82
+ chatBO .setChatType (ChatType .IMAGE );
83
+ } else if (prompt .startsWith (keywordConfig .getAudio ())) {
84
+ chatBO .setPrompt (prompt .replaceFirst (keywordConfig .getAudio () + " " , "" ));
85
+ chatBO .setChatType (ChatType .AUDIO );
86
+ } else {
77
87
chatBO .setPrompt (prompt );
78
- chatBO .setAiDraw (prompt .startsWith (keywordConfig .getDraw ()));
79
- response = interactService .chat (chatBO );
80
- }catch (ChatException e ){
81
- response = e .getMessage ();
88
+ chatBO .setChatType (ChatType .TEXT );
82
89
}
83
- try {
84
- if (chatBO .isAiDraw () && !qqConfig .getReturnDrawByURL ()){
85
- File file = ImageUtil .download (response );
86
- Contact .sendImage (event .getSubject (), file );
87
- if (!file .delete ()){
88
- log .warn ("图片({})删除失败, 请注意存储空间" , file .getAbsolutePath ());
90
+ ChatResultDTO response = interactService .chat (chatBO );
91
+ switch (chatBO .getChatType ()) {
92
+ case TEXT :
93
+ event .getSubject ().sendMessage (
94
+ new MessageChainBuilder ()
95
+ .append (new QuoteReply (event .getMessage ()))
96
+ .append (response .getStringResult ())
97
+ .build ()
98
+ );
99
+ break ;
100
+ case IMAGE :
101
+ if (response .getInputStreamResult () == null ) {
102
+ event .getSubject ().sendMessage (
103
+ new MessageChainBuilder ()
104
+ .append (new QuoteReply (event .getMessage ()))
105
+ .append ("ai画图失败, 以下图片url: " ).append (response .getStringResult ())
106
+ .build ()
107
+ );
108
+ }
109
+ try (InputStream inputStream = response .getInputStreamResult ()) {
110
+ event .getSubject ().sendMessage (
111
+ new MessageChainBuilder ()
112
+ .append (new QuoteReply (event .getMessage ()))
113
+ .append (Contact .uploadImage (event .getSubject (), inputStream ))
114
+ .build ()
115
+ );
116
+ } catch (IOException e ) {
117
+ event .getSubject ().sendMessage (
118
+ new MessageChainBuilder ()
119
+ .append (new QuoteReply (event .getMessage ()))
120
+ .append ("ai画图失败, 以下图片url: " ).append (response .getStringResult ())
121
+ .build ()
122
+ );
123
+ }
124
+ break ;
125
+ case AUDIO :
126
+ if (response .getBytesResult () == null ) {
127
+ event .getSubject ().sendMessage ("语音回复失败, 以下为文本回复: " + response .getStringResult ());
128
+ }
129
+ OfflineAudio audio = null ;
130
+ byte [] audioBytes = response .getBytesResult ();
131
+ try (ExternalResource externalResource = ExternalResource .create (audioBytes )) {
132
+ if (event .getSubject () instanceof Group ) {
133
+ Group group = (Group ) event .getSubject ();
134
+ audio = group .uploadAudio (externalResource );
135
+ } else if (event .getSubject () instanceof Friend ) {
136
+ Friend user = (Friend ) event .getSubject ();
137
+ audio = user .uploadAudio (externalResource );
138
+ }
139
+ if (audio != null ) {
140
+ event .getSubject ().sendMessage (audio );
141
+ } else {
142
+ event .getSubject ().sendMessage ("语音回复失败, 以下为文本回复: " + response .getStringResult ());
143
+ }
144
+ } catch (IOException e ) {
145
+ event .getSubject ().sendMessage ("语音回复失败, 以下为文本回复: " + response .getStringResult ());
89
146
}
90
- }else {
91
- MessageChain messages = new MessageChainBuilder ()
92
- .append (new QuoteReply (event .getMessage ()))
93
- .append (response )
94
- .build ();
95
- event .getSubject ().sendMessage (messages );
96
- }
97
- }catch (MessageTooLargeException e ){
98
- //信息太大,无法引用,采用直接回复
99
- event .getSubject ().sendMessage (response );
100
147
}
101
148
}
102
149
}
@@ -107,8 +154,8 @@ private void response(@NotNull MessageEvent event, ChatBO chatBO, String prompt)
107
154
* @param event 事件
108
155
*/
109
156
@ EventHandler
110
- public void onNewFriendRequestEvent (NewFriendRequestEvent event ){
111
- if (qqConfig .getAcceptNewFriend ()){
157
+ public void onNewFriendRequestEvent (NewFriendRequestEvent event ) {
158
+ if (qqConfig .getAcceptNewFriend ()) {
112
159
event .accept ();
113
160
}
114
161
}
@@ -119,8 +166,8 @@ public void onNewFriendRequestEvent(NewFriendRequestEvent event){
119
166
* @param event 事件
120
167
*/
121
168
@ EventHandler
122
- public void onNewGroupRequestEvent (BotInvitedJoinGroupRequestEvent event ){
123
- if (qqConfig .getAcceptNewGroup ()){
169
+ public void onNewGroupRequestEvent (BotInvitedJoinGroupRequestEvent event ) {
170
+ if (qqConfig .getAcceptNewGroup ()) {
124
171
event .accept ();
125
172
}
126
173
}
0 commit comments