UNPKG

koishi-plugin-bilibili-notify-advanced-subscription

Version:

Bilibili-Notify 高级订阅配置插件

154 lines (153 loc) 9.77 kB
import { MASTER_FEATURES, PUSH_FEATURES } from "@bilibili-notify/push"; import { Schema } from "koishi"; //#region src/core.ts const BilibiliNotifyAdvancedSubConfig = Schema.object({ subs: Schema.dict(Schema.object({ uid: Schema.string().required().description("要订阅的UP主的UID"), roomId: Schema.string().default("").description("直播间号,留空则自动查询"), dynamic: Schema.boolean().default(true).description("是否订阅动态通知(总开关)"), dynamicAtAll: Schema.boolean().default(false).description("是否在动态通知中@所有人(总开关)"), live: Schema.boolean().default(true).description("是否订阅直播开播通知(总开关)"), liveAtAll: Schema.boolean().default(true).description("是否在开播通知中@所有人(总开关)"), liveEnd: Schema.boolean().default(true).description("是否订阅直播下播通知(总开关)"), liveGuardBuy: Schema.boolean().default(false).description("是否订阅上舰通知(总开关)"), superchat: Schema.boolean().default(false).description("是否订阅SC通知(总开关)"), wordcloud: Schema.boolean().default(true).description("是否订阅弹幕词云(总开关)"), liveSummary: Schema.boolean().default(true).description("是否订阅直播总结(总开关)"), target: Schema.array(Schema.object({ platform: Schema.string().required().description("消息推送平台(如 onebot、qq、discord)"), channelArr: Schema.array(Schema.object({ channelId: Schema.string().required().description("频道或群组号"), dynamic: Schema.boolean().default(true).description("动态通知"), dynamicAtAll: Schema.boolean().default(false).description("动态@所有人"), live: Schema.boolean().default(true).description("直播通知"), liveAtAll: Schema.boolean().default(true).description("开播@所有人"), liveEnd: Schema.boolean().default(true).description("下播通知"), liveGuardBuy: Schema.boolean().default(false).description("上舰通知"), superchat: Schema.boolean().default(false).description("SC通知"), wordcloud: Schema.boolean().default(true).description("弹幕词云"), liveSummary: Schema.boolean().default(true).description("直播总结"), specialDanmaku: Schema.boolean().default(true).description("特别关注弹幕"), specialUserEnterTheRoom: Schema.boolean().default(true).description("特别关注进入直播间") })).role("table").required().description("推送目标配置") })).description("推送平台和频道/群组列表"), customLiveSummary: Schema.intersect([Schema.object({ enable: Schema.boolean().default(false).description("是否启用自定义直播总结") }), Schema.union([Schema.object({ enable: Schema.const(true).required(), liveSummary: Schema.array(String).default([ "🔍【弹幕情报站】本场直播数据如下:", "🧍‍♂️ 总共 -dmc 位-mdn上线", "💬 共计 -dca 条弹幕飞驰而过", "📊 热词云图已生成,快来看看你有没有上榜!", "👑 本场顶级输出选手:", "🥇 -un1 - 弹幕输出 -dc1 条", "🥈 -un2 - 弹幕 -dc2 条,萌力惊人", "🥉 -un3 - -dc3 条精准狙击", "🎖️ 特别嘉奖:-un4 & -un5", "你们的弹幕,我们都记录在案!🕵️‍♀️" ]).role("table").description("直播总结模板,支持变量:-dmc(弹幕发言人数)、-mdn(勋章名)、-dca(弹幕总数)、-un1~5(弹幕排行用户)、-dc1~5(弹幕排行数量)") }), Schema.object({})])]), customLiveMsg: Schema.intersect([Schema.object({ enable: Schema.boolean().default(false).description("是否启用自定义直播消息") }), Schema.union([Schema.object({ enable: Schema.const(true).required(), customLiveStart: Schema.string().description("开播消息模板,支持变量:-name(UP主名字)、-follower(粉丝数)、-link(直播间链接)"), customLive: Schema.string().description("直播中消息模板,支持变量:-name(UP主名字)、-time(开播时长)、-watched(观看人数)、-link(直播间链接)"), customLiveEnd: Schema.string().description("下播消息模板,支持变量:-name(UP主名字)、-follower_change(粉丝变化)、-time(开播时长)") }), Schema.object({})])]), customCardStyle: Schema.intersect([Schema.object({ enable: Schema.boolean().default(false).description("是否启用自定义卡片样式") }), Schema.union([Schema.object({ enable: Schema.const(true).required(), cardColorStart: Schema.string().pattern(/^#([A-Fa-f0-9]{6}|[A-Fa-f0-9]{3})$/).description("卡片渐变起始颜色(16进制)"), cardColorEnd: Schema.string().pattern(/^#([A-Fa-f0-9]{6}|[A-Fa-f0-9]{3})$/).description("卡片渐变结束颜色(16进制)"), cardBasePlateColor: Schema.string().pattern(/^#([A-Fa-f0-9]{6}|[A-Fa-f0-9]{3})$/).description("底板颜色(16进制)"), cardBasePlateBorder: Schema.string().pattern(/\d*\.?\d+(?:px|em|rem|%|vh|vw|vmin|vmax)/).description("底板边框宽度(需带单位)") }), Schema.object({})])]), customGuardBuy: Schema.intersect([Schema.object({ enable: Schema.boolean().default(false).description("是否启用自定义上舰消息") }), Schema.union([Schema.object({ enable: Schema.const(true).required(), guardBuyMsg: Schema.string().default("【-mname的直播间】-uname加入了大航海(-guard)").description("上舰消息模板,支持变量:-uname(用户昵称)、-mname(主播名字)、-guard(舰长类别)"), captainImgUrl: Schema.string().default("https://s1.hdslb.com/bfs/static/blive/live-pay-mono/relation/relation/assets/captain-Bjw5Byb5.png").description("舰长图片链接"), supervisorImgUrl: Schema.string().default("https://s1.hdslb.com/bfs/static/blive/live-pay-mono/relation/relation/assets/supervisor-u43ElIjU.png").description("提督图片链接"), governorImgUrl: Schema.string().default("https://s1.hdslb.com/bfs/static/blive/live-pay-mono/relation/relation/assets/governor-DpDXKEdA.png").description("总督图片链接") }), Schema.object({})])]), customSpecialDanmakuUsers: Schema.intersect([Schema.object({ enable: Schema.boolean().default(false).description("是否启用特别关注弹幕用户监测") }), Schema.union([Schema.object({ enable: Schema.const(true).required(), specialDanmakuUsers: Schema.array(String).role("table").description("特别关注弹幕用户列表(请填写UID),每个UID单独一行"), msgTemplate: Schema.string().default("【-mastername的直播间】⭐ 特别关注弹幕 -uname: -msg").description("特别关注弹幕消息模板,支持变量:-mastername(主播名字)、-uname(用户昵称)、-msg(弹幕内容)") }), Schema.object({})])]), customSpecialUsersEnterTheRoom: Schema.intersect([Schema.object({ enable: Schema.boolean().default(false).description("是否启用特别关注用户进入直播间监测") }), Schema.union([Schema.object({ enable: Schema.const(true).required(), specialUsersEnterTheRoom: Schema.array(String).role("table").description("特别关注进入直播间用户列表(请填写UID),每个UID单独一行"), msgTemplate: Schema.string().default("【-mastername的直播间】🌟 特别关注用户 -uname 进入了直播间").description("特别关注进入直播间消息模板,支持变量:-mastername(主播名字)、-uname(用户昵称)") }), Schema.object({})])]) }).collapse()) }); function pickRawMasters(raw) { const out = {}; for (const key of MASTER_FEATURES) out[key] = raw[key] !== false; return out; } function configToSubItem(name, raw) { const target = {}; for (const entry of raw.target ?? []) { const { platform, channelArr } = entry; if (!channelArr?.length) continue; for (const ch of channelArr) { const item = { platform, channelId: ch.channelId }; for (const key of PUSH_FEATURES) { if (!ch[key]) continue; if (!target[key]) target[key] = []; target[key]?.push(item); } } } for (const key of MASTER_FEATURES) if (raw[key] === false) delete target[key]; const customLiveSummary = { enable: !!raw.customLiveSummary?.enable, liveSummary: (raw.customLiveSummary?.liveSummary ?? []).join("\n") }; return { uid: raw.uid, uname: name, roomId: raw.roomId ?? "", ...pickRawMasters(raw), target, customCardStyle: raw.customCardStyle ?? { enable: false }, customLiveMsg: raw.customLiveMsg ?? { enable: false }, customGuardBuy: raw.customGuardBuy ?? { enable: false }, customLiveSummary, customSpecialDanmakuUsers: raw.customSpecialDanmakuUsers?.enable ? { enable: true, specialDanmakuUsers: raw.customSpecialDanmakuUsers.specialDanmakuUsers, msgTemplate: raw.customSpecialDanmakuUsers.msgTemplate ?? "" } : { enable: false, msgTemplate: "" }, customSpecialUsersEnterTheRoom: raw.customSpecialUsersEnterTheRoom?.enable ? { enable: true, specialUsersEnterTheRoom: raw.customSpecialUsersEnterTheRoom.specialUsersEnterTheRoom, msgTemplate: raw.customSpecialUsersEnterTheRoom.msgTemplate ?? "" } : { enable: false, msgTemplate: "" } }; } function applyAdvancedSub(ctx, config) { const buildSubs = () => { const subs = {}; for (const [name, raw] of Object.entries(config.subs)) subs[raw.uid] = configToSubItem(name, raw); return subs; }; ctx.emit("bilibili-notify/advanced-sub", buildSubs()); ctx.on("bilibili-notify/ready-to-receive", () => { ctx.emit("bilibili-notify/advanced-sub", buildSubs()); }); } //#endregion //#region src/index.ts const name = "bilibili-notify-advanced-subscription"; const Config = BilibiliNotifyAdvancedSubConfig; function apply(ctx, config) { applyAdvancedSub(ctx, config); } //#endregion export { Config, apply, name };