Fix isByBot

This commit is contained in:
Him188 2020-02-28 21:38:23 +08:00
parent 469181e249
commit 58e4c156e8
2 changed files with 25 additions and 18 deletions

View File

@ -200,8 +200,9 @@ interface GroupSettingChangeEvent<T> : GroupEvent, BotPassiveEvent, BroadcastCon
data class GroupNameChangeEvent( data class GroupNameChangeEvent(
override val origin: String, override val origin: String,
override val new: String, override val new: String,
override val group: Group override val group: Group,
) : GroupSettingChangeEvent<String>, Packet // 无法获取操作人 val isByBot: Boolean // 无法获取操作人
) : GroupSettingChangeEvent<String>, Packet
/** /**
* 入群公告改变. 此事件广播前修改就已经完成. * 入群公告改变. 此事件广播前修改就已经完成.
@ -251,8 +252,9 @@ data class GroupAllowAnonymousChatEvent(
data class GroupAllowConfessTalkEvent( data class GroupAllowConfessTalkEvent(
override val origin: Boolean, override val origin: Boolean,
override val new: Boolean, override val new: Boolean,
override val group: Group override val group: Group,
) : GroupSettingChangeEvent<Boolean>, Packet // 无法获取操作人 val isByBot: Boolean // 无法获取操作人
) : GroupSettingChangeEvent<Boolean>, Packet
/** /**
* "允许群员邀请好友加群" 功能状态改变. 此事件广播前修改就已经完成. * "允许群员邀请好友加群" 功能状态改变. 此事件广播前修改就已经完成.

View File

@ -13,7 +13,7 @@ package net.mamoe.mirai.utils
import net.mamoe.mirai.utils.io.toUHexString import net.mamoe.mirai.utils.io.toUHexString
import kotlin.reflect.KClass import kotlin.reflect.KClass
import kotlin.reflect.KProperty0 import kotlin.reflect.KProperty1
private val indent: String = " ".repeat(4) private val indent: String = " ".repeat(4)
@ -125,22 +125,25 @@ fun Any?._miraiContentToString(prefix: String = ""): String = when (this) {
} }
} }
internal expect fun KProperty1<*, *>.getValueAgainstPermission(receiver: Any): Any?
@MiraiDebugAPI @MiraiDebugAPI
private fun Any.contentToStringReflectively(prefix: String, filter: ((name: String, value: Any?) -> Boolean)? = null): String { private fun Any.contentToStringReflectively(prefix: String, filter: ((name: String, value: Any?) -> Boolean)? = null): String {
val newPrefix = "$prefix " val newPrefix = "$prefix "
return (this::class.simpleName ?: "<UnnamedClass>") + "#" + this::class.hashCode() + " {\n" + return (this::class.simpleName ?: "<UnnamedClass>") + "#" + this::class.hashCode() + " {\n" +
this.allMembersFromSuperClassesMatching { it.simpleName?.startsWith("net.mamoe.mirai") == true } this.allMembersFromSuperClassesMatching { it.qualifiedName?.startsWith("net.mamoe.mirai") == true }
.distinctBy { it.name } .distinctBy { it.name }
.filterNot { it.name.contains("$") || it.name == "Companion" || it.isConst || it.name == "serialVersionUID" } .filterNot { it.name.contains("$") || it.name == "Companion" || it.isConst || it.name == "serialVersionUID" }
.mapNotNull { .mapNotNull {
val value = it.get() val value = it.getValueAgainstPermission(this)
if (filter != null) { if (filter != null) {
kotlin.runCatching {
if (!filter(it.name, value)) if (!filter(it.name, value))
return@mapNotNull it.name to value return@mapNotNull it.name to value
else {
return@mapNotNull null
} }
} }
null it.name to value
} }
.joinToStringPrefixed( .joinToStringPrefixed(
prefix = newPrefix prefix = newPrefix
@ -152,16 +155,18 @@ private fun Any.contentToStringReflectively(prefix: String, filter: ((name: Stri
} + "\n$prefix}" } + "\n$prefix}"
} }
private fun Any.thisClassAndSuperclassSequence(): Sequence<KClass<out Any>> { private fun KClass<out Any>.thisClassAndSuperclassSequence(): Sequence<KClass<out Any>> {
return sequenceOf(this::class) + return sequenceOf(this) +
this::class.supertypes.asSequence() this.supertypes.asSequence()
.mapNotNull { type -> type.classifier?.takeIf { it is KClass<*> } as? KClass<out Any> } .mapNotNull { type -> type.classifier?.takeIf { it is KClass<*> }?.takeIf { it != Any::class } as? KClass<out Any> }.flatMap { it.thisClassAndSuperclassSequence() }
} }
private fun Any.allMembersFromSuperClassesMatching(classFilter: (KClass<out Any>) -> Boolean): Sequence<KProperty0<*>> { @Suppress("UNCHECKED_CAST")
return this.thisClassAndSuperclassSequence() private fun Any.allMembersFromSuperClassesMatching(classFilter: (KClass<out Any>) -> Boolean): Sequence<KProperty1<Any, *>> {
return this::class.thisClassAndSuperclassSequence()
.filter { classFilter(it) } .filter { classFilter(it) }
.map { it.members } .map { it.members }
.flatMap { it.asSequence() } .flatMap { it.asSequence() }
.mapNotNull { it as? KProperty0<*> } .filterIsInstance<KProperty1<*, *>>()
.mapNotNull { it as KProperty1<Any, *> }
} }