Add event broadcast

This commit is contained in:
Him188 2020-02-11 22:06:03 +08:00
parent dfa3af5643
commit 5bd96876d9
5 changed files with 171 additions and 267 deletions

View File

@ -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<TroopManagement.Mute.Response>()
}
MemberMuteEvent.ByBot(this@MemberImpl, durationSeconds).broadcast()
MemberMuteEvent(this@MemberImpl, durationSeconds, null).broadcast()
return true
}
@ -241,7 +241,7 @@ internal class MemberImpl(
).sendAndExpect<TroopManagement.Mute.Response>()
}
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<TroopManagement.Kick.Response>().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()
}
}
}

View File

@ -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<BotForceOfflineEvent> {
this@QQAndroidBotNetworkHandler.subscribeAlways<BotOfflineEvent> {
if (this@QQAndroidBotNetworkHandler.bot == this.bot) {
this.bot.logger.error("被挤下线")
close()

View File

@ -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

View File

@ -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

View File

@ -135,135 +135,81 @@ interface GroupSettingChangeEvent<T> : GroupEvent, BotPassiveEvent {
/**
* 群名改变. 此事件广播前修改就已经完成.
*/
sealed class GroupNameChangeEvent : GroupSettingChangeEvent<String>, 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<String>, Packet
/**
* 入群公告改变. 此事件广播前修改就已经完成.
*/
sealed class GroupEntranceAnnouncementChangeEvent : GroupSettingChangeEvent<String>, 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<String>, Packet
/**
* 由机器人操作
*/
data class ByBot(
override val origin: String,
override val new: String,
override val group: Group
) : GroupEntranceAnnouncementChangeEvent()
}
/**
* "全员禁言" 功能状态改变. 此事件广播前修改就已经完成.
*/
sealed class GroupMuteAllEvent : GroupSettingChangeEvent<Boolean>, 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<Boolean>, 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<Boolean>, Packet
/**
* "坦白说" 功能状态改变. 此事件广播前修改就已经完成.
*/
sealed class GroupAllowConfessTalkEvent : GroupSettingChangeEvent<Boolean>, 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<Boolean>, Packet
/**
* "允许群员邀请好友加群" 功能状态改变. 此事件广播前修改就已经完成.
*/
sealed class GroupAllowMemberInviteEvent : GroupSettingChangeEvent<Boolean>, 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<Boolean>, 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