@@ -11,17 +11,11 @@ package net.mamoe.mirai.mock
11
11
12
12
import me.him188.kotlin.jvm.blocking.bridge.JvmBlockingBridge
13
13
import net.mamoe.mirai.Bot
14
- import net.mamoe.mirai.contact.Friend
15
- import net.mamoe.mirai.contact.Group
16
- import net.mamoe.mirai.contact.MemberPermission
17
- import net.mamoe.mirai.contact.User
14
+ import net.mamoe.mirai.contact.*
18
15
import net.mamoe.mirai.event.broadcast
19
16
import net.mamoe.mirai.event.events.*
20
17
import net.mamoe.mirai.message.MessageReceipt
21
- import net.mamoe.mirai.message.data.MessageChain
22
- import net.mamoe.mirai.message.data.MessageSource
23
- import net.mamoe.mirai.message.data.OnlineMessageSource
24
- import net.mamoe.mirai.message.data.source
18
+ import net.mamoe.mirai.message.data.*
25
19
import net.mamoe.mirai.mock.contact.MockFriend
26
20
import net.mamoe.mirai.mock.contact.MockNormalMember
27
21
import net.mamoe.mirai.mock.contact.MockStranger
@@ -125,42 +119,99 @@ public object MockActions {
125
119
*/
126
120
@JvmStatic
127
121
public suspend fun fireMessageRecalled (source : MessageSource , operator : User ? = null) {
128
- if (source is OnlineMessageSource ) {
129
- val from = source.sender
130
- when (val target = source.target) {
131
- is Group -> {
132
- from.bot.mock().msgDatabase.removeMessageInfo(source)
133
- MessageRecallEvent .GroupRecall (
134
- source.bot,
135
- from.id,
136
- source.ids,
137
- source.internalIds,
138
- source.time,
139
- operator ?.cast(),
140
- target,
141
- when (from) {
142
- is Bot -> target.botAsMember
143
- else -> from.cast()
144
- }
145
- ).broadcast()
146
- return
122
+ fun notSupported (): Nothing = error(" Unsupported message source kind: ${source.kind} : ${source.javaClass} " )
123
+
124
+ val bot: MockBot = when {
125
+ source is OnlineMessageSource -> source.bot.mock()
126
+ operator != null -> operator .bot.mock()
127
+ else -> source.botOrNull?.mock() ? : error(" Cannot find bot from source or operator" )
128
+ }
129
+
130
+ val sourceKind = source.kind
131
+
132
+ fun target (): ContactOrBot = when {
133
+ source is OnlineMessageSource -> source.target
134
+ source.targetId == bot.id -> bot
135
+
136
+ sourceKind == MessageSourceKind .FRIEND -> bot.getFriendOrFail(source.targetId)
137
+ sourceKind == MessageSourceKind .STRANGER -> bot.getStrangerOrFail(source.targetId)
138
+ sourceKind == MessageSourceKind .TEMP -> error(" Cannot detect message target from TEMP source kind" )
139
+ sourceKind == MessageSourceKind .GROUP -> bot.getGroupOrFail(source.targetId)
140
+
141
+ else -> notSupported()
142
+ }
143
+
144
+ fun sender (): ContactOrBot = when {
145
+ source is OnlineMessageSource -> source.sender
146
+ source.fromId == bot.id -> bot
147
+
148
+
149
+ sourceKind == MessageSourceKind .FRIEND -> bot.getFriendOrFail(source.fromId)
150
+ sourceKind == MessageSourceKind .STRANGER -> bot.getStrangerOrFail(source.fromId)
151
+ sourceKind == MessageSourceKind .TEMP -> error(" Cannot detect message sender from TEMP source kind" )
152
+ sourceKind == MessageSourceKind .GROUP -> throw AssertionError (" Message from group" )
153
+
154
+ else -> notSupported()
155
+ }
156
+
157
+ fun subject (): Contact = when {
158
+ source is OnlineMessageSource -> source.subject
159
+
160
+ source.fromId == bot.id -> target() as Contact
161
+ sourceKind == MessageSourceKind .GROUP -> target() as Contact
162
+
163
+ else -> sender() as Contact
164
+ }
165
+
166
+
167
+ when (sourceKind) {
168
+ MessageSourceKind .GROUP -> {
169
+ val sender = sender()
170
+ val group = subject() as Group
171
+
172
+ val operator0 = when {
173
+ operator == = bot -> null
174
+ operator == = group.botAsMember -> null
175
+
176
+ operator == null -> sender.cast()
177
+ operator is Member -> operator
178
+
179
+ else -> error(" Provided operator $operator (${operator .javaClass} ) not a member" )
147
180
}
148
181
149
- is Friend -> {
150
- from.bot.mock().msgDatabase.removeMessageInfo(source)
151
- MessageRecallEvent .FriendRecall (
152
- source.bot,
153
- source.ids,
154
- source.internalIds,
155
- source.time,
156
- from.id,
157
- from.cast()
158
- ).broadcast()
159
- return
182
+ bot.msgDatabase.removeMessageInfo(source)
183
+ MessageRecallEvent .GroupRecall (
184
+ bot, sender.id, source.ids, source.internalIds, source.time,
185
+ operator0,
186
+ group,
187
+ when (sender) {
188
+ is Bot -> group.botAsMember
189
+ else -> sender.cast()
190
+ }
191
+ ).broadcast()
192
+ }
193
+ MessageSourceKind .FRIEND -> {
194
+ val subject = subject() as Friend
195
+
196
+ bot.msgDatabase.removeMessageInfo(source)
197
+ if (source.fromId == bot.id) {
198
+ return // no event
160
199
}
200
+
201
+ MessageRecallEvent .FriendRecall (bot, source.ids, source.internalIds, source.time, subject.id, subject)
202
+ .broadcast()
161
203
}
204
+ MessageSourceKind .TEMP -> {
205
+ bot.mock().msgDatabase.removeMessageInfo(source)
206
+ // TODO: event not available
207
+ }
208
+ MessageSourceKind .STRANGER -> {
209
+ bot.mock().msgDatabase.removeMessageInfo(source)
210
+ // TODO: event not available
211
+ }
212
+
213
+ else -> notSupported()
162
214
}
163
- error(" Unsupported message source type: ${source.javaClass} " )
164
215
}
165
216
166
217
/* *
0 commit comments