diff --git a/README.md b/README.md index 4c493e3..37407ef 100644 --- a/README.md +++ b/README.md @@ -10,6 +10,7 @@ ## 特性 **无论多少订阅均可在最低 10s 内检测所有动态** 使用 [skiko](https://github.com/JetBrains/skiko) 绘图 +番剧订阅 动态过滤 扫码登录 可配置性高 @@ -50,13 +51,15 @@ Vtuber 字幕组及粉丝群如需要使用可通过群联系我, 使用我搭 如果你对这张图有什么建议也可以反馈 帮助 -| 订阅相关 | 描述 | -|-------------------------------------|---------------------| -| `/bili ` | 获取上面的帮助图片 | -| `/bili ` | 扫码登录 (需在配置文件中配置管理员) | -| `/bili [目标]` | 为目标 [目标] 添加一个订阅 | -| `/bili [目标]` | 为目标 [目标] 删除一个订阅 | -| `/bili [目标]` | 将目标 [目标] 的全部订阅删除 | +### 基础指令 + +| 订阅相关 | 描述 | +|------------------------------------|--------------------------------------------------------------------------------| +| `/bili ` | 获取上面的帮助图片 | +| `/bili ` | 扫码登录 (需在配置文件中配置管理员) | +| `/bili [目标]` | 为目标 [目标] 添加一个订阅 (id 可以为 用户ID 也可以为 番剧ID ) 番剧ID格式: `ss11111` `md22222` `ep33333` | +| `/bili [目标]` | 为目标 [目标] 删除一个订阅 (id 可以为 用户ID 也可以为 番剧ID ) 删除用户同时支持用户名删除 | +| `/bili [目标]` | 将目标 [目标] 的全部订阅删除 | | 订阅列表 | 描述 | |--------------------------------------------|-------------------------| @@ -79,13 +82,13 @@ Vtuber 字幕组及粉丝群如需要使用可通过群联系我, 使用我搭 | `/bili <动态ID>` | 通过ID搜索一个动态 | | `/bili [数量]` | 获取用户最新动态 (支持用户名本地模糊搜索) | -| [分组指令](#分组指令) (v3.0.3) | -|------------------------| +| [分组指令](#分组指令) | +|-----------------| | [动态过滤指令](#动态过滤指令) | |--------------------| -**指令中的 `目标` 可以是 好友/群/分组 (v3.0.3)** +**指令中的 `目标` 可以是 好友 / 群 / 分组** 推荐使用 `config` 指令配置 模板 过滤器 @@ -104,18 +107,6 @@ Vtuber 字幕组及粉丝群如需要使用可通过群联系我, 使用我搭 /bili t d ForwardMsg #为当前群/好友动态推送模板设置为ForwardMsg ``` -### 分组指令 (v3.0.3) -| 分组指令 | 描述 | -|-------------------------------------------------------|----------------------------------------| -| `/bili <分组名>` | 创建一个分组 (分组名不能全为数字) | -| `/bili [分组名]` | 查询分组列表 | -| `/bili <分组名>` | 删除分组 (删除分组会同时删除分组所有数据) | -| `/bili <分组名> <群/Q号列表>` | 向分组内添加用户 (支持批量添加,中间用逗号隔开) | -| `/bili <分组名> <群/Q号列表>` | 删除分组内用户 (支持批量删除,中间用逗号隔开) | -| `/bili <分组名> ` | 设置分组管理员 (管理员只能是好友,不能是群。支持批量删除,中间用逗号隔开) | -| `/bili <分组名> ` | 删除分组管理员 (支持批量删除,中间用逗号隔开) | - - ### 动态过滤指令 推荐使用 `/bili config` 交互式配置 @@ -130,13 +121,13 @@ Vtuber 字幕组及粉丝群如需要使用可通过群联系我, 使用我搭 过滤器模式黑名单模式 -| 指令 | 描述 | -|-----------------------------------------------------------|-----------------------------------------------------------------------------| -| `/bili <类型> [uid] [目标]` | 为目标 [目标] 添加 uid 的动态类型过滤器 | -| `/bili <正则表达式> [uid] [目标]` | 为目标 [目标] 添加 uid 的动态正则过滤器 | +| 指令 | 描述 | +|-------------------------------------------------------------|-----------------------------------------------------------------------------| +| `/bili <类型> [uid] [目标]` | 为目标 [目标] 添加 uid 的动态类型过滤器 | +| `/bili <正则表达式> [uid] [目标]` | 为目标 [目标] 添加 uid 的动态正则过滤器 | | `/bili <过滤器类型> <过滤器模式> [uid] [目标]` | 切换过滤器模式
过滤器类型: `t`(类型过滤器) `r`(正则过滤器)
过滤器模式: `w`(白名单模式) `b`(黑名单模式) | -| `/bili [uid] [目标]` | 列出 uid 的过滤器列表 | -| `/bili [uid] [目标]` | 删除 uid 中 index 的过滤器 | +| `/bili [uid] [目标]` | 列出 uid 的过滤器列表 | +| `/bili [uid] [目标]` | 删除 uid 中 index 的过滤器 | ``` # 栗子 @@ -166,6 +157,19 @@ Vtuber 字幕组及粉丝群如需要使用可通过群联系我, 使用我搭 # 不填默认也为 0 ``` +### 分组指令 +| 分组指令 | 描述 | +|-------------------------------------------------------|----------------------------------------| +| `/bili <分组名>` | 创建一个分组 (分组名不能全为数字) | +| `/bili [分组名]` | 查询分组列表 | +| `/bili <分组名>` | 删除分组 (删除分组会同时删除分组所有数据) | +| `/bili <分组名> <群/Q号列表>` | 向分组内添加用户 (支持批量添加,中间用逗号隔开) | +| `/bili <分组名> <群/Q号列表>` | 删除分组内用户 (支持批量删除,中间用逗号隔开) | +| `/bili <分组名> ` | 设置分组管理员 (管理员只能是好友,不能是群。支持批量删除,中间用逗号隔开) | +| `/bili <分组名> ` | 删除分组管理员 (支持批量删除,中间用逗号隔开) | + +前面的 [基础指令](#基础指令) 与 [动态过滤指令](#动态过滤指令) 中的 `目标` 可以是 好友 / 群 / 分组 + ## 权限 插件命令依赖 [chat-command](https://github.com/project-mirai/chat-command) 来正确处理聊天环境下的命令,请确保有此插件,否则插件可能无法正常工作 diff --git a/build.gradle.kts b/build.gradle.kts index 4d68107..0d2ab80 100644 --- a/build.gradle.kts +++ b/build.gradle.kts @@ -8,7 +8,7 @@ plugins { } group = "top.colter" -version = "3.0.4" +version = "3.1.0" repositories { mavenLocal() @@ -43,7 +43,7 @@ dependencies { } implementation("com.google.zxing:javase:3.5.0") - compileOnly("xyz.cssxsh.mirai:mirai-skia-plugin:1.1.7") + compileOnly("xyz.cssxsh.mirai:mirai-skia-plugin:1.1.8") testImplementation(kotlin("test", "1.7.0")) testImplementation("org.jetbrains.skiko:skiko-awt-runtime-windows-x64:0.7.27") diff --git a/docs/img/help.png b/docs/img/help.png index 48f025a..a71d684 100644 Binary files a/docs/img/help.png and b/docs/img/help.png differ diff --git a/src/main/kotlin/top/colter/mirai/plugin/bilibili/BiliBiliDynamic.kt b/src/main/kotlin/top/colter/mirai/plugin/bilibili/BiliBiliDynamic.kt index 61b5373..700ad5a 100644 --- a/src/main/kotlin/top/colter/mirai/plugin/bilibili/BiliBiliDynamic.kt +++ b/src/main/kotlin/top/colter/mirai/plugin/bilibili/BiliBiliDynamic.kt @@ -24,7 +24,7 @@ object BiliBiliDynamic : KotlinPlugin( JvmPluginDescription( id = "top.colter.bilibili-dynamic-mirai-plugin", name = "BiliBili Dynamic", - version = "3.0.4", + version = "3.1.0", ) { author("Colter") dependsOn("xyz.cssxsh.mirai.plugin.mirai-skia-plugin", ">= 1.1.0") diff --git a/src/main/kotlin/top/colter/mirai/plugin/bilibili/command/DynamicCommand.kt b/src/main/kotlin/top/colter/mirai/plugin/bilibili/command/DynamicCommand.kt index 9ea6346..9299204 100644 --- a/src/main/kotlin/top/colter/mirai/plugin/bilibili/command/DynamicCommand.kt +++ b/src/main/kotlin/top/colter/mirai/plugin/bilibili/command/DynamicCommand.kt @@ -53,23 +53,23 @@ object DynamicCommand : CompositeCommand( if (checkPerm(target)) { if (pgcRegex.matches(id)) { sendMessage(PgcService.followPgc(id, target.subject)) - }else { - try { - DynamicService.addSubscribe(id.toLong(), target.subject).let { - sendMessage(it) - actionNotify(this.subject?.id, name, target.name, "订阅", it) - } - } catch (e: NumberFormatException) { - sendMessage("ID错误 [$id]") + }else try { + DynamicService.addSubscribe(id.toLong(), target.subject).let { + sendMessage(it) + actionNotify(this.subject?.id, name, target.name, "订阅", it) } + } catch (e: NumberFormatException) { + sendMessage("ID错误 [$id]") } } } @SubCommand("del", "删除") - suspend fun CommandSender.del(user: String, target: GroupOrContact = GroupOrContact(Contact())) { + suspend fun CommandSender.del(id: String, target: GroupOrContact = GroupOrContact(Contact())) { if (checkPerm(target)) { - matchUser(user) { + if (pgcRegex.matches(id)) { + sendMessage(PgcService.delPgc(id, target.subject)) + }else matchUser(id) { DynamicService.removeSubscribe(it, target.subject) }?.let { sendMessage(it) diff --git a/src/main/kotlin/top/colter/mirai/plugin/bilibili/service/DynamicService.kt b/src/main/kotlin/top/colter/mirai/plugin/bilibili/service/DynamicService.kt index 1432688..4dd80d9 100644 --- a/src/main/kotlin/top/colter/mirai/plugin/bilibili/service/DynamicService.kt +++ b/src/main/kotlin/top/colter/mirai/plugin/bilibili/service/DynamicService.kt @@ -123,7 +123,7 @@ object DynamicService { appendLine("番剧: ") val cc = bangumi.count { (ssid, sub) -> if (subject in sub.contacts) { - appendLine("${sub.title}@$ssid") + appendLine("${sub.title}@ss$ssid") true }else false } diff --git a/src/main/kotlin/top/colter/mirai/plugin/bilibili/service/PgcService.kt b/src/main/kotlin/top/colter/mirai/plugin/bilibili/service/PgcService.kt index 2675553..c9cf642 100644 --- a/src/main/kotlin/top/colter/mirai/plugin/bilibili/service/PgcService.kt +++ b/src/main/kotlin/top/colter/mirai/plugin/bilibili/service/PgcService.kt @@ -25,7 +25,6 @@ object PgcService { } suspend fun followPgcBySsid(ssid: Long, subject: String): String { - //return client.followPgc(ssid)?.toast!! client.followPgc(ssid) ?: return "追番失败" bangumi.getOrPut(ssid) { val season = client.pgcSeasonInfo(ssid) ?: return "获取番剧信息失败, 如果是港澳台番剧请用 media id (md11111) 订阅" @@ -59,6 +58,34 @@ object PgcService { } } + fun delPgc(id: String, subject: String): String { + val regex = pgcRegex.find(id) ?: return "ID 格式错误 例(ss11111, md22222)" + + val type = regex.destructured.component1() + val id = regex.destructured.component2().toLong() + + return when (type) { + "ss" -> { + val pgc = bangumi[id] ?: return "没有这个番剧哦" + if (pgc.contacts.remove(subject)) { + if (pgc.contacts.isEmpty()) bangumi.remove(id) + "删除成功" + } else "没有订阅这个番剧哦" + } + "md" -> { + val pgc = bangumi.filter { it.value.mediaId == id }.values + if (pgc.isEmpty()) return "没有这个番剧哦" + val contacts = pgc.first().contacts + if (contacts.remove(subject)) { + if (contacts.isEmpty()) bangumi.remove(pgc.first().seasonId) + "删除成功" + } else "没有订阅这个番剧哦" + } + "ep" -> "无法通过ep进行删除,请使用 ss 或 md" + else -> "额(⊙﹏⊙)" + } + } + fun type(type: Int) = when (type) { 1 -> "番剧" 2 -> "电影" diff --git a/src/main/kotlin/top/colter/mirai/plugin/bilibili/utils/translate/TransApi.kt b/src/main/kotlin/top/colter/mirai/plugin/bilibili/utils/translate/TransApi.kt index 60d6bbe..5fa718c 100644 --- a/src/main/kotlin/top/colter/mirai/plugin/bilibili/utils/translate/TransApi.kt +++ b/src/main/kotlin/top/colter/mirai/plugin/bilibili/utils/translate/TransApi.kt @@ -62,7 +62,7 @@ fun trans(text: String): String? { } } } catch (e: Exception) { - BiliBiliDynamic.logger.error("Baidu translation failure! 百度翻译失败!") + BiliBiliDynamic.logger.error("Baidu translation failure! 百度翻译失败! $e") } } else { return null diff --git a/src/main/resources/image/HELP.png b/src/main/resources/image/HELP.png index 48f025a..a71d684 100644 Binary files a/src/main/resources/image/HELP.png and b/src/main/resources/image/HELP.png differ