From 7c2f51e849d86e2da6d0c1d1e2a7ef5f13b0f2bc Mon Sep 17 00:00:00 2001 From: dongRogen <3601778801@qq.com> Date: Thu, 28 Jul 2022 10:11:10 +0800 Subject: [PATCH] =?UTF-8?q?=E6=94=B9=E8=BF=9B=E8=AE=A2=E9=98=85=E5=B7=A5?= =?UTF-8?q?=E5=85=B7=20-=20=E8=AE=A2=E9=98=85=E8=A1=A8=E6=94=AF=E6=8C=81?= =?UTF-8?q?=E7=BE=A4=E5=86=85=E6=88=90=E5=91=98=20-=20=E8=B0=83=E6=95=B4?= =?UTF-8?q?=E8=AF=BB=E5=86=99=E5=87=BD=E6=95=B0=20=E8=B0=83=E5=BA=A6?= =?UTF-8?q?=E5=99=A8=E3=80=81=E8=AE=A2=E9=98=85=E9=9B=86=E6=B7=BB=E5=8A=A0?= =?UTF-8?q?=E8=8E=B7=E5=8F=96bot=E7=9A=84=E5=87=BD=E6=95=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../top/jie65535/jcf/ScheduleHandler.kt | 7 +- .../top/jie65535/jcf/util/SubscriptionSet.kt | 137 +++++++----------- 2 files changed, 60 insertions(+), 84 deletions(-) diff --git a/src/main/kotlin/top/jie65535/jcf/ScheduleHandler.kt b/src/main/kotlin/top/jie65535/jcf/ScheduleHandler.kt index 76c13d8..82e25e5 100644 --- a/src/main/kotlin/top/jie65535/jcf/ScheduleHandler.kt +++ b/src/main/kotlin/top/jie65535/jcf/ScheduleHandler.kt @@ -148,7 +148,7 @@ class ScheduleHandler( // TODO 异步、限时 for ((id, task) in this) { if (pause) { - logger?.info("调度器[$name]执行在任务中暂停") + logger?.info("调度器[$name]在执行任务中暂停") break } else task(id) @@ -208,6 +208,11 @@ class ScheduleHandler( // region -- 参数 + /** + * 获取所属bot + */ + fun bot(): Bot = bot + /** * 检查 id 是否已添加 */ diff --git a/src/main/kotlin/top/jie65535/jcf/util/SubscriptionSet.kt b/src/main/kotlin/top/jie65535/jcf/util/SubscriptionSet.kt index f426c6b..9ef5b42 100644 --- a/src/main/kotlin/top/jie65535/jcf/util/SubscriptionSet.kt +++ b/src/main/kotlin/top/jie65535/jcf/util/SubscriptionSet.kt @@ -4,6 +4,11 @@ import net.mamoe.mirai.Bot import net.mamoe.mirai.utils.MiraiLogger import java.util.* +/** + * 用户个人订阅的 group + */ +private const val SINGLE: Long = 0 + /** * 订阅集 * @@ -22,9 +27,9 @@ class SubscriptionSet( /** * 订阅表 - * { mod : group/qq } + * { mod : { group : qq } } */ - private val receiverMap = mutableMapOf>() + private val receiverMap = mutableMapOf>>() /** * 订阅表线程锁 @@ -39,101 +44,75 @@ class SubscriptionSet( // region -- 参数 /** - * mod被订阅的qq/群数量 + * 获取所属bot + */ + fun bot(): Bot = bot + + /** + * mod被订阅的个人+群数量 */ infix fun countSub(mod: Int): Int = receiverLock.withLock { - get(mod)?.size ?: 0 + get(mod)?.let { + val single = it[SINGLE]?.size ?: 0 + size - 1 + single + } ?: 0 } /** * 清空订阅 */ fun clear() = receiverLock.withLock { - clear() + receiverMap.clear() } - /** - * 记录订阅 - * - * [id] 规则: - * 等于 0 无效; - * 大于 0 为qq; - * 小于 0 为群号; - * - * @param mod 模组id - * @param id qq/群号(不等于0) - */ - private fun sub(mod: Int, id: Long) { - if (id == 0L) return - receiverLock.withLock { - val set = get(mod) ?: mutableSetOf() - put(mod, set) - set += id - logger?.apply { - val type = if (id < 0) "group" else "qq" - info("添加订阅{$mod:${type}_$id},mod总订阅量:${set.size}--订阅集[$name]") - } - } - } - - /** - * 记录订阅 - * - * @param mod 模组id - * @param qq q号(大于0) - */ - fun subQQ(mod: Int, qq: Long) = sub(mod, qq) - /** * 记录订阅 * * @param mod 模组id + * @param qq q号(大于0) * @param group 群号(大于0) */ - fun subGroup(mod: Int, group: Long) = sub(mod, 0 - group) + fun sub(mod: Int, qq: Long, group: Long = SINGLE) = receiverLock.withLock { + get(mod)?.let { + val qs = it[group] ?: mutableSetOf() + it[group] = qs + if (qs.add(qq)) { + logger?.info("新增订阅{$mod:{$group:$qq}}--订阅集[$name]") + } + } + } /** * 取消订阅 * - * [id] 规则: - * 等于 0 无效; - * 大于 0 为qq; - * 小于 0 为群号; - * - * @param mod 模组id - * @param id qq/群号(不等于0) + * @param mod 模组id + * @param qq q号(大于0) + * @param group 群号(大于0) */ - private fun unSub(mod: Int, id: Long) { - if (id == 0L) return - receiverLock.withLock { - get(mod)?.let { - it -= id - logger?.apply { - val type = if (id < 0) "group" else "qq" - info("移除订阅{$mod:${type}_$id},mod总订阅量:${it.size}--订阅集[$name]") + fun unsub(mod: Int, qq: Long, group: Long = SINGLE) = receiverLock.withLock { + get(mod)?.let { + it[group]?.let { qs -> + if (qs.remove(qq)) { + logger?.info("取消订阅{$mod:{$group:$qq}}--订阅集[$name]") } } } } /** - * 撤销用户订阅 - * - * @param mod 模组id - * @param qq q号(大于0) - */ - fun unSubQQ(mod: Int, qq: Long) = unSub(mod, qq) - - /** - * 撤销群订阅 + * 移除群订阅 * * @param mod 模组id * @param group 群号(大于0) */ - fun unsubGroup(mod: Int, group: Long) = unSub(mod, 0 - group) + fun unsubGroup(mod: Int, group: Long) = receiverLock.withLock { + get(mod)?.remove(group)?.let { + logger?.info("移除群订阅{$mod:$group}--订阅集[$name]") + } + } /** - * 撤销mod订阅 + * 移除mod * * @param mod 模组id */ @@ -145,9 +124,7 @@ class SubscriptionSet( } /** - * 撤销mod订阅 - * - * @param mod 模组id + * [rmMod] */ operator fun minusAssign(mod: Int) = rmMod(mod) @@ -156,32 +133,26 @@ class SubscriptionSet( // region -- 消费 /** - * 遍历订阅 + * 遍历个人订阅 * * @param mod 模组id * @param action qq号消费操作 */ - fun eachQQ(mod: Int, action: (Long) -> Unit) = receiverLock.withLock { - get(mod)?.let { - for (qq in it) { - if (qq <= 0) continue - action(qq) - } - } + fun eachSingle(mod: Int, action: (qq: Long) -> Unit) = receiverLock.withLock { + get(mod)?.get(SINGLE)?.forEach { action(it) } } /** - * 遍历订阅 + * 遍历群订阅 * * @param mod 模组id - * @param action 群号消费操作 + * @param action 消费操作 */ - fun eachGroup(mod: Int, action: (Long) -> Unit) = receiverLock.withLock { - get(mod)?.let { - for (group in it) { - if (group >= 0) continue - action(0 - group) - } + fun eachGroup(mod: Int, action: (group: Long, member: List) -> Unit) = receiverLock.withLock { + get(mod)?.filter { + it.key != SINGLE + }?.forEach { (g, m) -> + action(g, m.toList()) } }