diff --git a/mirai-core-qqandroid/src/commonMain/kotlin/net/mamoe/mirai/qqandroid/ContactImpl.kt b/mirai-core-qqandroid/src/commonMain/kotlin/net/mamoe/mirai/qqandroid/ContactImpl.kt index 1a5ffbf37..08eefee5c 100644 --- a/mirai-core-qqandroid/src/commonMain/kotlin/net/mamoe/mirai/qqandroid/ContactImpl.kt +++ b/mirai-core-qqandroid/src/commonMain/kotlin/net/mamoe/mirai/qqandroid/ContactImpl.kt @@ -162,7 +162,7 @@ internal class MemberImpl( var _specialTitle: String, group: GroupImpl, override val coroutineContext: CoroutineContext, - override val permission: MemberPermission + override var permission: MemberPermission ) : ContactImpl(), Member, QQ by qq { override val group: GroupImpl by group.unsafeWeakRef() val qq: QQImpl by qq.unsafeWeakRef() @@ -182,7 +182,7 @@ internal class MemberImpl( newValue ).sendWithoutExpect() } - MemberCardChangeEvent.ByBot(oldValue, newValue, this@MemberImpl).broadcast() + MemberCardChangeEvent(oldValue, newValue, this@MemberImpl, null).broadcast() } } } @@ -190,7 +190,7 @@ internal class MemberImpl( override var specialTitle: String get() = _specialTitle set(newValue) { - group.checkBotPermissionOperator() + group.checkBotPermission(MemberPermission.OWNER) if (_specialTitle != newValue) { val oldValue = _specialTitle _specialTitle = newValue @@ -223,7 +223,7 @@ internal class MemberImpl( ).sendAndExpect() } - MemberMuteEvent.ByBot(this@MemberImpl, durationSeconds).broadcast() + MemberMuteEvent(this@MemberImpl, durationSeconds, null).broadcast() return true } @@ -241,7 +241,7 @@ internal class MemberImpl( ).sendAndExpect() } - MemberUnmuteEvent.ByBot(this@MemberImpl).broadcast() + MemberUnmuteEvent(this@MemberImpl, null).broadcast() return true } @@ -256,7 +256,7 @@ internal class MemberImpl( member = this@MemberImpl, message = message ).sendAndExpect().success.also { - MemberLeaveEvent.Kick.ByBot(this@MemberImpl).broadcast() + MemberLeaveEvent.Kick(this@MemberImpl, null).broadcast() } } } @@ -304,7 +304,7 @@ internal class GroupImpl( newName = newValue ).sendWithoutExpect() } - GroupNameChangeEvent.ByBot(oldValue, newValue, this@GroupImpl).broadcast() + GroupNameChangeEvent(oldValue, newValue, this@GroupImpl, null).broadcast() } } } @@ -324,7 +324,7 @@ internal class GroupImpl( newMemo = newValue ).sendWithoutExpect() } - GroupEntranceAnnouncementChangeEvent.ByBot(oldValue, newValue, this@GroupImpl).broadcast() + GroupEntranceAnnouncementChangeEvent(oldValue, newValue, this@GroupImpl, null).broadcast() } } } @@ -345,7 +345,7 @@ internal class GroupImpl( switch = newValue ).sendWithoutExpect() } - GroupAllowMemberInviteEvent.ByBot(oldValue, newValue, this@GroupImpl).broadcast() + GroupAllowMemberInviteEvent(oldValue, newValue, this@GroupImpl, null).broadcast() } } } @@ -377,7 +377,7 @@ internal class GroupImpl( switch = newValue ).sendWithoutExpect() } - GroupAllowConfessTalkEvent.ByBot(oldValue, newValue, this@GroupImpl).broadcast() + GroupAllowConfessTalkEvent(oldValue, newValue, this@GroupImpl, null).broadcast() } } } @@ -398,7 +398,7 @@ internal class GroupImpl( switch = newValue ).sendWithoutExpect() } - GroupMuteAllEvent.ByBot(oldValue, newValue, this@GroupImpl).broadcast() + GroupMuteAllEvent(oldValue, newValue, this@GroupImpl, null).broadcast() } } } diff --git a/mirai-core-qqandroid/src/commonMain/kotlin/net/mamoe/mirai/qqandroid/network/QQAndroidBotNetworkHandler.kt b/mirai-core-qqandroid/src/commonMain/kotlin/net/mamoe/mirai/qqandroid/network/QQAndroidBotNetworkHandler.kt index 6b4b55a91..44d84610d 100644 --- a/mirai-core-qqandroid/src/commonMain/kotlin/net/mamoe/mirai/qqandroid/network/QQAndroidBotNetworkHandler.kt +++ b/mirai-core-qqandroid/src/commonMain/kotlin/net/mamoe/mirai/qqandroid/network/QQAndroidBotNetworkHandler.kt @@ -24,7 +24,7 @@ import net.mamoe.mirai.contact.MemberPermission import net.mamoe.mirai.data.MultiPacket import net.mamoe.mirai.data.Packet import net.mamoe.mirai.event.* -import net.mamoe.mirai.event.events.BotForceOfflineEvent +import net.mamoe.mirai.event.events.BotOfflineEvent import net.mamoe.mirai.network.BotNetworkHandler import net.mamoe.mirai.qqandroid.GroupImpl import net.mamoe.mirai.qqandroid.MemberImpl @@ -119,7 +119,7 @@ internal class QQAndroidBotNetworkHandler(bot: QQAndroidBot) : BotNetworkHandler @UseExperimental(MiraiExperimentalAPI::class, ExperimentalTime::class) override suspend fun init(): Unit = coroutineScope { - this@QQAndroidBotNetworkHandler.subscribeAlways { + this@QQAndroidBotNetworkHandler.subscribeAlways { if (this@QQAndroidBotNetworkHandler.bot == this.bot) { this.bot.logger.error("被挤下线") close() diff --git a/mirai-core-qqandroid/src/commonMain/kotlin/net/mamoe/mirai/qqandroid/network/protocol/packet/chat/receive/OnlinePush.kt b/mirai-core-qqandroid/src/commonMain/kotlin/net/mamoe/mirai/qqandroid/network/protocol/packet/chat/receive/OnlinePush.kt index 3c6538a1c..0ff8aeb3e 100644 --- a/mirai-core-qqandroid/src/commonMain/kotlin/net/mamoe/mirai/qqandroid/network/protocol/packet/chat/receive/OnlinePush.kt +++ b/mirai-core-qqandroid/src/commonMain/kotlin/net/mamoe/mirai/qqandroid/network/protocol/packet/chat/receive/OnlinePush.kt @@ -18,7 +18,9 @@ import net.mamoe.mirai.contact.MemberPermission import net.mamoe.mirai.data.NoPacket import net.mamoe.mirai.data.Packet import net.mamoe.mirai.event.broadcast +import net.mamoe.mirai.event.events.* import net.mamoe.mirai.message.GroupMessage +import net.mamoe.mirai.qqandroid.MemberImpl import net.mamoe.mirai.qqandroid.QQAndroidBot import net.mamoe.mirai.qqandroid.io.serialization.decodeUniPacket import net.mamoe.mirai.qqandroid.io.serialization.loadAs @@ -103,26 +105,33 @@ internal class OnlinePush { this.discardExact(5) val var4 = readByte().toInt() var var5 = 0L - val var7 = readUInt().toLong() + val target = readUInt().toLong() if (var4 != 0 && var4 != 1) { var5 = readUInt().toLong() } if (var5 == 0L && this.remaining == 1L) {//管理员变更 val groupUin = content.fromUin - val target = var7 - if (this.readByte().toInt() == 1) { - println("群uin" + groupUin + "新增管理员" + target) + + val member = bot.getGroupByUin(groupUin)[target] as MemberImpl + val old = member.permission + return if (this.readByte().toInt() == 1) { + member.permission = MemberPermission.ADMINISTRATOR + MemberPermissionChangeEvent(member, old, MemberPermission.ADMINISTRATOR) } else { - println("群uin" + groupUin + "减少管理员" + target) + member.permission = MemberPermission.MEMBER + MemberPermissionChangeEvent(member, old, MemberPermission.ADMINISTRATOR) } } } 34 -> { - var groupUinOrCode = readUInt().toLong() + readUInt().toLong() // uin or code ? if (readByte().toInt() == 1) { val target = readUInt().toLong() val groupUin = content.fromUin - println("群uin" + groupUin + "t掉了" + target) + + val member = bot.getGroupByUin(groupUin)[target] as MemberImpl + + return MemberLeaveEvent.Kick(member, TODO("踢出时获取管理员")) } } @@ -144,79 +153,86 @@ internal class OnlinePush { override suspend fun ByteReadPacket.decode(bot: QQAndroidBot, sequenceId: Int): Packet { val reqPushMsg = decodeUniPacket(OnlinePushPack.SvcReqPushMsg.serializer(), "req") reqPushMsg.vMsgInfos.forEach { msgInfo: MsgInfo -> - var debug = "" msgInfo.vMsg!!.read { - if (msgInfo.shMsgType.toInt() == 732) { - val groupCode = this.readUInt().toLong() - debug = "群 $groupCode " - when (val internalType = this.readShort().toInt()) { - 3073 -> { - val operatorUin = this.readUInt().toLong() - debug += " 管理员 $operatorUin" - val operationTime = this.readUInt().toLong() - debug += " 禁言 " - this.discardExact(2) - val target = this.readUInt().toLong() - val time = this.readUInt().toLong() - if (target == 0L) { - debug += "全群" - } else { - debug += target - } + when { + msgInfo.shMsgType.toInt() == 732 -> { + val group = bot.getGroup(this.readUInt().toLong()) - if (time == 0L) { - debug += " 解除 " - } else { - debug += " " + time + "s" - } - } - 3585 -> { - val operatorUin = this.readUInt().toLong() - debug += " 管理员 $operatorUin" - debug += " 匿名聊天 " - if (this.readInt() == 0) { - debug += " 开启 " - } else { - debug += " 关闭 " - } - } - 4096 -> { - val dataBytes = this.readBytes(26) - val message = this.readString(this.readByte().toInt()) - if (dataBytes[0].toInt() != 59) { - println("更改群名为$message") - } else { - println(message + ":" + dataBytes.toUHexString()) - debug += message - when (message) { - "管理员已关闭群聊坦白说" -> { + when (val internalType = this.readShort().toInt()) { + 3073 -> { // mute + val operator = group[this.readUInt().toLong()] + this.readUInt().toLong() // time + this.discardExact(2) + val target = this.readUInt().toLong() + val time = this.readInt() + return if (target == 0L) { + if (time == 0) { + GroupMuteAllEvent(origin = true, new = false, operator = operator, group = group) + } else { + GroupMuteAllEvent(origin = false, new = true, operator = operator, group = group) } - "管理员已开启群聊坦白说" -> { - - } - else -> { - println("Unknown server messages $message") + } else { + val member = group[target] + if (time == 0) { + MemberUnmuteEvent(operator = operator, member = member) + } else { + MemberMuteEvent(operator = operator, member = member, durationSeconds = time) } } } - } - 4352 -> { - println(msgInfo.contentToString()) - println(msgInfo.vMsg.toUHexString()) - } - else -> { - println("unknown group internal type $internalType , data: " + this.readBytes().toUHexString() + " ") + 3585 -> { // 匿名 + val operator = group[this.readUInt().toLong()] + return GroupAllowAnonymousChatEvent( + origin = group.anonymousChat, + new = this.readInt() == 0, + operator = operator, + group = group + ) + } + 4096 -> { + val dataBytes = this.readBytes(26) + val message = this.readString(this.readByte().toInt()) + + TODO("读取操作人") + + /* + return if (dataBytes[0].toInt() != 59) { + GroupNameChangeEvent(origin = group.name, new = ) + } else { + println(message + ":" + dataBytes.toUHexString()) + when (message) { + "管理员已关闭群聊坦白说" -> { + GroupAllowConfessTalkEvent(group.confessTalk, false, ope) + } + "管理员已开启群聊坦白说" -> { + + } + else -> { + println("Unknown server messages $message") + } + } + } + */ + } + 4352 -> { + println(msgInfo.contentToString()) + println(msgInfo.vMsg.toUHexString()) + } + else -> { + println("unknown group internal type $internalType , data: " + this.readBytes().toUHexString() + " ") + } } } - } else if (msgInfo.shMsgType.toInt() == 528) { - val content = msgInfo.vMsg.loadAs(OnlinePushPack.MsgType0x210.serializer()) - println(content.contentToString()) - } else { - println("unknown shtype ${msgInfo.shMsgType.toInt()}") + msgInfo.shMsgType.toInt() == 528 -> { + val content = msgInfo.vMsg.loadAs(OnlinePushPack.MsgType0x210.serializer()) + println(content.contentToString()) + } + else -> { + println("unknown shtype ${msgInfo.shMsgType.toInt()}") + } } } - println(debug) } return NoPacket diff --git a/mirai-core/src/commonMain/kotlin/net.mamoe.mirai/contact/Member.kt b/mirai-core/src/commonMain/kotlin/net.mamoe.mirai/contact/Member.kt index 686217407..acd50e64b 100644 --- a/mirai-core/src/commonMain/kotlin/net.mamoe.mirai/contact/Member.kt +++ b/mirai-core/src/commonMain/kotlin/net.mamoe.mirai/contact/Member.kt @@ -12,10 +12,7 @@ package net.mamoe.mirai.contact import net.mamoe.mirai.Bot -import net.mamoe.mirai.event.events.MemberCardChangeEvent -import net.mamoe.mirai.event.events.MemberLeaveEvent -import net.mamoe.mirai.event.events.MemberMuteEvent -import net.mamoe.mirai.event.events.MemberSpecialTitleChangeEvent +import net.mamoe.mirai.event.events.* import net.mamoe.mirai.utils.WeakRefProperty import kotlin.time.Duration import kotlin.time.ExperimentalTime @@ -64,13 +61,15 @@ interface Member : QQ, Contact { * @see Int.minutesToSeconds * @see Int.hoursToSeconds * @see Int.daysToSeconds + * + * @see MemberMuteEvent 成员被禁言事件 */ suspend fun mute(durationSeconds: Int): Boolean /** * 解除禁言. 机器人无权限时返回 `false`. * - * @see MemberMuteEvent 成员被禁言事件. + * @see MemberUnmuteEvent 成员被取消禁言事件. */ suspend fun unmute(): Boolean diff --git a/mirai-core/src/commonMain/kotlin/net.mamoe.mirai/event/events/BotEvents.kt b/mirai-core/src/commonMain/kotlin/net.mamoe.mirai/event/events/BotEvents.kt index 7bb935655..5ba1caeaf 100644 --- a/mirai-core/src/commonMain/kotlin/net.mamoe.mirai/event/events/BotEvents.kt +++ b/mirai-core/src/commonMain/kotlin/net.mamoe.mirai/event/events/BotEvents.kt @@ -135,135 +135,81 @@ interface GroupSettingChangeEvent : GroupEvent, BotPassiveEvent { /** * 群名改变. 此事件广播前修改就已经完成. */ -sealed class GroupNameChangeEvent : GroupSettingChangeEvent, BotPassiveEvent { - +data class GroupNameChangeEvent( + override val origin: String, + override val new: String, + override val group: Group, /** - * 由管理员操作 + * 操作人. 为 null 时则是机器人操作 */ - data class ByOperator( - override val origin: String, - override val new: String, - val operator: Member - ) : GroupNameChangeEvent() { - override val group: Group - get() = operator.group - } - - /** - * 由机器人操作 - */ - data class ByBot( - override val origin: String, - override val new: String, - override val group: Group - ) : GroupNameChangeEvent() -} - + val operator: Member? +) : GroupSettingChangeEvent, Packet /** * 入群公告改变. 此事件广播前修改就已经完成. */ -sealed class GroupEntranceAnnouncementChangeEvent : GroupSettingChangeEvent, BotPassiveEvent { - +data class GroupEntranceAnnouncementChangeEvent( + override val origin: String, + override val new: String, + override val group: Group, /** - * 由管理员操作 + * 操作人. 为 null 时则是机器人操作 */ - data class ByOperator( - override val origin: String, - override val new: String, - val operator: Member - ) : GroupEntranceAnnouncementChangeEvent() { - override val group: Group - get() = operator.group - } + val operator: Member? +) : GroupSettingChangeEvent, Packet - /** - * 由机器人操作 - */ - data class ByBot( - override val origin: String, - override val new: String, - override val group: Group - ) : GroupEntranceAnnouncementChangeEvent() -} /** * 群 "全员禁言" 功能状态改变. 此事件广播前修改就已经完成. */ -sealed class GroupMuteAllEvent : GroupSettingChangeEvent, BotPassiveEvent { +data class GroupMuteAllEvent( + override val origin: Boolean, + override val new: Boolean, + override val group: Group, /** - * 由管理员操作 + * 操作人. 为 null 时则是机器人操作 */ - data class ByOperator( - override val origin: Boolean, - override val new: Boolean, - val operator: Member - ) : GroupMuteAllEvent() { - override val group: Group - get() = operator.group - } + val operator: Member? +) : GroupSettingChangeEvent, Packet +/** + * 群 "匿名聊天" 功能状态改变. 此事件广播前修改就已经完成. + */ +data class GroupAllowAnonymousChatEvent( + override val origin: Boolean, + override val new: Boolean, + override val group: Group, /** - * 由机器人操作 + * 操作人. 为 null 时则是机器人操作 */ - data class ByBot( - override val origin: Boolean, - override val new: Boolean, - override val group: Group - ) : GroupMuteAllEvent() -} + val operator: Member? +) : GroupSettingChangeEvent, Packet /** * 群 "坦白说" 功能状态改变. 此事件广播前修改就已经完成. */ -sealed class GroupAllowConfessTalkEvent : GroupSettingChangeEvent, BotPassiveEvent { +data class GroupAllowConfessTalkEvent( + override val origin: Boolean, + override val new: Boolean, + override val group: Group, /** - * 由管理员操作 + * 操作人. 为 null 时则是机器人操作 */ - data class ByOperator( - override val origin: Boolean, - override val new: Boolean, - val operator: Member - ) : GroupAllowConfessTalkEvent() { - override val group: Group - get() = operator.group - } - - /** - * 由机器人操作 - */ - data class ByBot( - override val origin: Boolean, - override val new: Boolean, - override val group: Group - ) : GroupAllowConfessTalkEvent() -} + val operator: Member? +) : GroupSettingChangeEvent, Packet /** * 群 "允许群员邀请好友加群" 功能状态改变. 此事件广播前修改就已经完成. */ -sealed class GroupAllowMemberInviteEvent : GroupSettingChangeEvent, BotPassiveEvent { +data class GroupAllowMemberInviteEvent( + override val origin: Boolean, + override val new: Boolean, + override val group: Group, /** - * 由管理员操作 + * 操作人. 为 null 时则是机器人操作 */ - data class ByOperator( - override val origin: Boolean, - override val new: Boolean, - val operator: Member - ) : GroupAllowMemberInviteEvent() { - override val group: Group - get() = operator.group - } - - /** - * 由机器人操作 - */ - data class ByBot( - override val origin: Boolean, - override val new: Boolean, - override val group: Group - ) : GroupAllowMemberInviteEvent() -} + val operator: Member? +) : GroupSettingChangeEvent, Packet // endregion @@ -284,22 +230,13 @@ sealed class MemberLeaveEvent : GroupMemberEvent { /** * 成员被踢出群. 成员不可能是机器人自己. */ - sealed class Kick : MemberLeaveEvent() { + data class Kick( + override val member: Member, /** - * 被管理员踢出 + * 操作人. 为 null 则是机器人操作 */ - data class ByOperator( - override val member: Member, - val operator: Member - ) : Kick(), BotPassiveEvent - - /** - * 被机器人踢出 - */ - data class ByBot( - override val member: Member - ) : Kick(), BotActiveEvent - } + val operator: Member? + ) : MemberLeaveEvent(), Packet /** * 成员主动离开 @@ -314,47 +251,24 @@ sealed class MemberLeaveEvent : GroupMemberEvent { /** * 群名片改动. 此事件广播前修改就已经完成. */ -sealed class MemberCardChangeEvent : GroupMemberEvent { +data class MemberCardChangeEvent( /** * 修改前 */ - abstract val origin: String + val origin: String, /** * 修改后 */ - abstract val new: String + val new: String, - abstract override val member: Member + override val member: Member, /** - * 由管理员修改 + * 操作人. 为 null 时则是机器人操作. 可能与 [member] 引用相同, 此时为群员自己修改. */ - data class ByOperator( - override val origin: String, - override val new: String, - override val member: Member, - val operator: Member - ) : MemberCardChangeEvent(), BotPassiveEvent - - /** - * 由 [Bot] 修改. 由 [Member.nameCard] - */ - data class ByBot( - override val origin: String, - override val new: String, - override val member: Member - ) : MemberCardChangeEvent(), BotActiveEvent - - /** - * 该成员自己修改 - */ - data class BySelf( - override val origin: String, - override val new: String, - override val member: Member - ) : MemberCardChangeEvent(), BotPassiveEvent -} + val operator: Member? +) : GroupMemberEvent /** * 群头衔改动. 一定为群主操作 @@ -385,7 +299,7 @@ data class MemberPermissionChangeEvent( override val member: Member, val origin: MemberPermission, val new: MemberPermission -) : GroupMemberEvent, BotPassiveEvent +) : GroupMemberEvent, BotPassiveEvent, Packet // endregion @@ -395,50 +309,25 @@ data class MemberPermissionChangeEvent( /** * 群成员被禁言事件. 操作人和被禁言的成员都不可能是机器人本人 */ -sealed class MemberMuteEvent : GroupMemberEvent { - abstract override val member: Member - - abstract val durationSeconds: Int - +data class MemberMuteEvent( + override val member: Member, + val durationSeconds: Int, /** - * 管理员禁言成员 + * 操作人. 为 null 则为机器人操作 */ - data class ByOperator( - override val member: Member, - override val durationSeconds: Int, - val operator: Member - ) : MemberMuteEvent(), BotPassiveEvent - - /** - * 机器人禁言成员. 通过 [Member.mute] 触发 - */ - data class ByBot( - override val member: Member, - override var durationSeconds: Int - ) : MemberMuteEvent(), BotActiveEvent -} + val operator: Member? +) : GroupMemberEvent, Packet /** * 群成员被取消禁言事件. 操作人和被禁言的成员都不可能是机器人本人 */ -sealed class MemberUnmuteEvent : GroupMemberEvent, BotPassiveEvent { - abstract override val member: Member - +data class MemberUnmuteEvent( + override val member: Member, /** - * 管理员禁言成员 + * 操作人. 为 null 则为机器人操作 */ - data class ByOperator( - override val member: Member, - val operator: Member - ) : MemberUnmuteEvent(), BotPassiveEvent - - /** - * 机器人禁言成员. 通过 [Member.unmute] 触发 - */ - data class ByBot( - override val member: Member - ) : MemberUnmuteEvent(), BotActiveEvent -} + val operator: Member? +) : GroupMemberEvent, Packet // endregion