完善订阅工具

- 添加线程锁
This commit is contained in:
dongRogen 2022-07-27 11:20:03 +08:00
parent 0bd4a3e222
commit 54f551c472

View File

@ -14,11 +14,25 @@ class SubscriptionSet(
private val logger: MiraiLogger? private val logger: MiraiLogger?
) { ) {
/** /**
* 订阅表
* { mod : group/qq } * { mod : group/qq }
* TODO 线程锁
*/ */
private val receiverMap = mutableMapOf<Int, MutableSet<Long>>() private val receiverMap = mutableMapOf<Int, MutableSet<Long>>()
/**
* 订阅表线程锁
*/
private val receiverLock = LockUtil(receiverMap)
// region -- 参数
/**
* 清空订阅
*/
fun clear() = receiverLock.withLock {
clear()
}
/** /**
* 记录订阅 * 记录订阅
* *
@ -28,21 +42,23 @@ class SubscriptionSet(
* 小于 0 为群号 * 小于 0 为群号
* *
* @param mod 模组id * @param mod 模组id
* @param id qq/群号大于等于0 * @param id qq/群号等于0
*/ */
operator fun set(mod: Int, id: Long) { operator fun set(mod: Int, id: Long) {
if (id == 0L) return if (id == 0L) return
val set = receiverMap[mod] ?: mutableSetOf() receiverLock.withLock {
receiverMap[mod] = set val set = get(mod) ?: mutableSetOf()
put(mod, set)
set += id set += id
logger?.info("")// TODO 日志 logger?.info("")// TODO 日志
} }
}
/** /**
* 记录订阅 * 记录订阅
* *
* @param mod 模组id * @param mod 模组id
* @param qq q号大于等于0 * @param qq q号大于0
*/ */
fun subQQ(mod: Int, qq: Long) = set(mod, qq) fun subQQ(mod: Int, qq: Long) = set(mod, qq)
@ -50,7 +66,7 @@ class SubscriptionSet(
* 记录订阅 * 记录订阅
* *
* @param mod 模组id * @param mod 模组id
* @param group 群号大于等于0 * @param group 群号大于0
*/ */
fun subGroup(mod: Int, group: Long) = set(mod, 0 - group) fun subGroup(mod: Int, group: Long) = set(mod, 0 - group)
@ -63,21 +79,23 @@ class SubscriptionSet(
* 小于 0 为群号 * 小于 0 为群号
* *
* @param mod 模组id * @param mod 模组id
* @param id qq/群号 * @param id qq/群号不等于0
*/ */
fun unSub(mod: Int, id: Long) { fun unSub(mod: Int, id: Long) {
if (id == 0L) return if (id == 0L) return
receiverMap[mod]?.let { receiverLock.withLock {
get(mod)?.let {
it -= id it -= id
logger?.info("")// TODO 日志 logger?.info("")// TODO 日志
} }
} }
}
/** /**
* 撤销用户订阅 * 撤销用户订阅
* *
* @param mod 模组id * @param mod 模组id
* @param qq qq于等于0 * @param qq q于0
*/ */
fun unSubQQ(mod: Int, qq: Long) = unSub(mod, qq) fun unSubQQ(mod: Int, qq: Long) = unSub(mod, qq)
@ -85,7 +103,7 @@ class SubscriptionSet(
* 撤销群订阅 * 撤销群订阅
* *
* @param mod 模组id * @param mod 模组id
* @param group 群号 * @param group 群号大于0
*/ */
fun unsubGroup(mod: Int, group: Long) = unSub(mod, 0 - group) fun unsubGroup(mod: Int, group: Long) = unSub(mod, 0 - group)
@ -96,12 +114,18 @@ class SubscriptionSet(
* *
* @param mod 模组id * @param mod 模组id
*/ */
operator fun minusAssign(mod: Int) = operator fun minusAssign(mod: Int) = receiverLock.withLock {
if (mod < 0) { if (mod < 0) {
receiverMap.clear() clear()
} else { } else {
receiverMap -= mod remove(mod)
} }
Unit// return value
}
// endregion
// region -- 消费
/** /**
* 遍历订阅 * 遍历订阅
@ -109,13 +133,14 @@ class SubscriptionSet(
* @param mod 模组id * @param mod 模组id
* @param action qq号消费操作 * @param action qq号消费操作
*/ */
fun eachQQ(mod: Int, action: (Long) -> Unit) = fun eachQQ(mod: Int, action: (Long) -> Unit) = receiverLock.withLock {
receiverMap[mod]?.let { get(mod)?.let {
for (qq in it) { for (qq in it) {
if (qq <= 0) continue if (qq <= 0) continue
action(qq) action(qq)
} }
} }
}
/** /**
* 遍历订阅 * 遍历订阅
@ -123,11 +148,14 @@ class SubscriptionSet(
* @param mod 模组id * @param mod 模组id
* @param action 群号消费操作 * @param action 群号消费操作
*/ */
fun eachGroup(mod: Int, action: (Long) -> Unit) = fun eachGroup(mod: Int, action: (Long) -> Unit) = receiverLock.withLock {
receiverMap[mod]?.let { get(mod)?.let {
for (group in it) { for (group in it) {
if (group >= 0) continue if (group >= 0) continue
action(0 - group) action(0 - group)
} }
} }
} }
// endregion
}