Add member.muteTimeRemaining

This commit is contained in:
Him188 2020-02-20 22:36:19 +08:00
parent 2eee24c7d3
commit 086f04e1f5
5 changed files with 71 additions and 20 deletions

View File

@ -180,6 +180,15 @@ internal class MemberImpl(
internal var _nameCard: String = memberInfo.nameCard
internal var _specialTitle: String = memberInfo.specialTitle
var _muteTimestamp: Int = memberInfo.muteTimestamp
override val muteTimeRemaining: Int =
if (_muteTimestamp == 0 || _muteTimestamp == 0xFFFFFFFF.toInt()) {
0
} else {
_muteTimestamp - currentTimeSeconds.toInt() - bot.client.timeDifference.toInt()
}
override var nameCard: String
get() = _nameCard
set(newValue) {
@ -215,7 +224,7 @@ internal class MemberImpl(
newValue
).sendWithoutExpect()
}
MemberSpecialTitleChangeEvent(oldValue, newValue, this@MemberImpl).broadcast()
MemberSpecialTitleChangeEvent(oldValue, newValue, this@MemberImpl, null).broadcast()
}
}
}
@ -293,6 +302,7 @@ internal class MemberInfoImpl(
else -> MemberPermission.MEMBER
}
override val specialTitle: String get() = jceInfo.sSpecialTitle ?: ""
override val muteTimestamp: Int get() = jceInfo.dwShutupTimestap?.toInt() ?: 0
}
/**
@ -315,13 +325,13 @@ internal class GroupImpl(
@UseExperimental(MiraiExperimentalAPI::class)
override lateinit var botPermission: MemberPermission
var _botMuteRemaining: Int = groupInfo.botMuteRemaining
var _botMuteTimestamp: Int = groupInfo.botMuteRemaining
override val botMuteRemaining: Int =
if (_botMuteRemaining == 0 || _botMuteRemaining == 0xFFFFFFFF.toInt()) {
if (_botMuteTimestamp == 0 || _botMuteTimestamp == 0xFFFFFFFF.toInt()) {
0
} else {
_botMuteRemaining - currentTimeSeconds.toInt() - bot.client.timeDifference.toInt()
_botMuteTimestamp - currentTimeSeconds.toInt() - bot.client.timeDifference.toInt()
}
override val members: ContactList<Member> = ContactList(members.mapNotNull {

View File

@ -181,12 +181,12 @@ internal class OnlinePush {
}
} else {
if (target == bot.uin) {
if (group._botMuteRemaining != time) {
if (group._botMuteTimestamp != time) {
if (time == 0) {
group._botMuteRemaining = 0
group._botMuteTimestamp = 0
return@mapNotNull BotUnmuteEvent(operator) as Packet
} else {
group._botMuteRemaining = time
group._botMuteTimestamp = time
return@mapNotNull BotMuteEvent(durationSeconds = time, operator = operator) as Packet
}
} else {
@ -194,11 +194,17 @@ internal class OnlinePush {
}
} else {
val member = group[target]
// TODO: 2020/2/20 检查是否重复
return@mapNotNull if (time == 0) {
MemberUnmuteEvent(operator = operator, member = member)
member as MemberImpl
if (member._muteTimestamp != time) {
if (time == 0) {
member._muteTimestamp = 0
return@mapNotNull MemberUnmuteEvent(member, operator) as Packet
} else {
member._muteTimestamp = time
return@mapNotNull MemberMuteEvent(member, time, operator) as Packet
}
} else {
MemberMuteEvent(operator = operator, member = member, durationSeconds = time) as Packet
return@mapNotNull null
}
}
}
@ -261,7 +267,6 @@ internal class OnlinePush {
return@mapNotNull null
}
}
return@mapNotNull null
}
msgInfo.shMsgType.toInt() == 528 -> {
bot.network.logger.debug { "unknown shtype ${msgInfo.shMsgType.toInt()}" }
@ -274,7 +279,6 @@ internal class OnlinePush {
return@mapNotNull null
}
}
return@mapNotNull null
}
}
return MultiPacket(packets)

View File

@ -1,7 +1,7 @@
/*
* Copyright 2020 Mamoe Technologies and contributors.
*
* 此源代码的使用受 GNU AFFERO GENERAL PUBLIC LICENSE version 3 许可证的约束, 在以下链接找到该许可证.
* 此源代码的使用受 GNU AFFERO GENERAL PUBLIC LICENSE version 3 许可证的约束, 在以下链接找到该许可证.
* Use of this source code is governed by the GNU AGPLv3 license that can be found through the following link.
*
* https://github.com/mamoe/mirai/blob/master/LICENSE
@ -29,33 +29,50 @@ interface Member : QQ, Contact {
/**
* 成员的权限, 动态更新.
*
* @see MemberPermissionChangeEvent 权限变更事件. 由群主或机器人的操作触发.
*/
val permission: MemberPermission
/**
* 群名片. 可能为空. 修改时将会触发事件
* 群名片. 可能为空.
*
* 管理员和群主都可修改任何人包括群主的群名片.
*
* 在修改时将会异步上传至服务器.
*
* @see [nameCardOrNick] 获取非空群名片或昵称
*
* @see MemberCardChangeEvent 群名片被管理员, 自己或 [Bot] 改动事件
* @see MemberCardChangeEvent 群名片被管理员, 自己或 [Bot] 改动事件. 修改时也会触发此事件.
* @throws PermissionDeniedException 无权限修改时
*/
var nameCard: String
/**
* 群头衔
* 群头衔.
*
* 仅群主可以修改群头衔.
*
* 在修改时将会异步上传至服务器.
*
* @see MemberSpecialTitleChangeEvent 群名片被管理员, 自己或 [Bot] 改动事件
* @see MemberSpecialTitleChangeEvent 群名片被管理员, 自己或 [Bot] 改动事件. 修改时也会触发此事件.
* @throws PermissionDeniedException 无权限修改时
*/
var specialTitle: String
/**
* 禁言
* 被禁言剩余时长. 单位为秒.
*
* @see isMuted 判断改成员是否处于禁言状态
* @see mute 设置禁言
* @see unmute 取消禁言
*/
val muteTimeRemaining: Int
/**
* 禁言.
*
* 管理员可禁言成员, 群主可禁言管理员和群员.
*
* @param durationSeconds 持续时间. 精确到秒. 范围区间表示为 `(0s, 30days]`. 超过范围则会抛出异常.
* @return 机器人无权限时返回 `false`
@ -72,6 +89,8 @@ interface Member : QQ, Contact {
/**
* 解除禁言.
*
* 管理员可解除成员的禁言, 群主可解除管理员和群员的禁言.
*
* @see MemberUnmuteEvent 成员被取消禁言事件.
* @throws PermissionDeniedException 无权限修改时
*/
@ -80,6 +99,8 @@ interface Member : QQ, Contact {
/**
* 踢出该成员.
*
* 管理员可踢出成员, 群主可踢出管理员和群员.
*
* @see MemberLeaveEvent.Kick 成员被踢出事件.
* @throws PermissionDeniedException 无权限修改时
*/
@ -98,6 +119,13 @@ interface Member : QQ, Contact {
*/
val Member.nameCardOrNick: String get() = this.nameCard.takeIf { it.isNotEmpty() } ?: this.nick
/**
* 判断改成员是否处于禁言状态.
*/
fun Member.isMuted(): Boolean {
return muteTimeRemaining != 0 && muteTimeRemaining != 0xFFFFFFFF.toInt()
}
@ExperimentalTime
suspend inline fun Member.mute(duration: Duration) {
require(duration.inDays <= 30) { "duration must be at most 1 month" }

View File

@ -17,4 +17,6 @@ interface MemberInfo : FriendInfo {
val permission: MemberPermission
val specialTitle: String
val muteTimestamp: Int
}

View File

@ -333,7 +333,14 @@ data class MemberSpecialTitleChangeEvent(
*/
val new: String,
override val member: Member
override val member: Member,
/**
* 操作人.
* 不为 null 时一定为群主. 可能与 [member] 引用相同, 此时为群员自己修改.
* null 时则是机器人操作.
*/
val operator: Member?
) : GroupMemberEvent
// endregion