koishi-plugin-ll-schedule 1.4.0 → 1.4.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (2) hide show
  1. package/index.js +11 -172
  2. package/package.json +2 -1
package/index.js CHANGED
@@ -11,103 +11,19 @@ const { Schema, h } = require('koishi')
11
11
 
12
12
  exports.name = 'll-schedule'
13
13
 
14
- exports.usage = `定时提醒插件:到时间自动向订阅了该任务的群发送提醒。每个任务就是一个**大文本框(日程)**,整张日程直接写进去,换行正常。
14
+ exports.usage = `定时提醒:每个任务一个大文本框(schedule)。每段 = 一行"星期 时间",下面几行是内容。
15
15
 
16
- ## 快速上手
17
-
18
- 1. 添加任务(键=任务名),在任务的 \`schedule\` 大文本框里直接写日程(格式见下)
19
- 2. 在任意群 @机器人 发:\`订阅 任务名\` → 该群加入此任务订阅列表
20
- 3. 到点自动发送
21
-
22
- ## 日程怎么写
23
-
24
- 每个时间段 = 一行 **\`星期 时间\`** 开头,下面几行是该时间的内容(可多行 markdown,保留换行)。写到下一个 \`星期 时间\` 行,自动切到下一个时间段。不同时间段之间可空一行,更清晰。
25
-
26
- - **星期**:\`周一\` \`周六\`...、\`每天\`、\`工作日\`(周一到周五)、\`周末\`(周六日)、\`1,3,5\`;留空 = 每天
27
- - **时间**:\`HH:MM\`,可多个逗号分隔 \`12:20, 18:20, 21:20\`
28
- - **内容**:到点发送的话,支持 Markdown 和模板变量 \`{date}\` \`{time}\` \`{week}\` \`{task}\`
29
-
30
- ## 示例:任务「世界BOSS」——直接把下面整段复制到文本框
31
-
32
- \`\`\`
16
+ 例:
33
17
  周一 21:00
34
- # 🐦 马上到世界BOSS啦
35
-
36
- > 地点:仙幻岛 → 白青山脉
37
-
38
- 世界BOSS刷新!
39
-
40
- 周二 21:00
41
- # 🐦 马上到世界BOSS啦
42
-
43
- > 地点:仙幻岛 → 大漠
44
-
45
- 世界BOSS刷新!
46
-
47
- 周三 21:00
48
- > 地点:仙幻岛 → 御龙林
49
-
50
- 世界BOSS刷新!
51
-
52
- 周四 21:00
53
- > 地点:仙幻岛 → 水月平原
54
-
55
- 世界BOSS刷新!
56
-
57
- 周五 21:00
58
- > 地点:白青山脉 → 大漠
59
-
60
- 世界BOSS刷新!
61
-
62
- 周六 15:00
63
- > 地点:仙幻岛 → 白青山脉
64
-
65
- 世界BOSS刷新!
66
-
67
- 周六 21:00
68
- > 地点:仙幻岛 → 御龙林
69
-
70
- 世界BOSS刷新!
71
-
72
- 周日 15:00
73
- > 地点:仙幻岛 → 大漠
74
-
75
- 世界BOSS刷新!
76
-
77
- 周日 21:00
78
- > 地点:仙幻岛 → 水月平原
18
+ # 世界BOSS马上刷新啦!
19
+ > 地点1:仙幻岛
20
+ > 地点2:白青山脉
21
+ 游戏下方有遁地按钮可以直达~
79
22
 
80
- 世界BOSS刷新!
81
- \`\`\`
23
+ 星期:周一/周六/每天/工作日/周末/1,3,5 时间:12:20, 18:20, 21:20(可多个)
24
+ 内容支持 Markdown 卡片、模板变量 {date} {time} {week} {task}
82
25
 
83
- ## 示例:任务「轻功」——每天三个时间点发同一句
84
-
85
- \`\`\`
86
- 每天 12:20, 18:20, 21:20
87
- ⏰ 轻功时间到了!
88
- \`\`\`
89
-
90
- ## Markdown 卡片(官方QQ机器人)
91
-
92
- 任务勾选 \`markdown\` 后,会用 QQ 官方 Markdown 卡片发送(仅官机生效,失败自动回退纯文本;其他平台始终纯文本)。内容里可用标题/加粗/引用/链接/图片(图片直接写在内容里,如 \`![配图](https://...)\`),模板变量自动替换。
93
-
94
- ## 其他配置
95
-
96
- - \`groups\`:手动指定目标群(推荐留空,用群内"订阅"命令自动添加)
97
- - \`enabled\`:是否启用该任务
98
-
99
- ## 群内命令
100
-
101
- - \`订阅 [任务名]\`:当前群订阅指定任务
102
- - \`取消订阅 [任务名]\`:当前群取消订阅
103
- - \`订阅列表\`:查看所有任务的订阅群
104
- - \`schedule.list\`:查看任务列表(含每段时间段)
105
- - \`schedule.test <任务名>\`:立即测试发送
106
- - \`lls.*\`:以上命令的备用入口
107
-
108
- ## 官机(官方QQ机器人)说明
109
-
110
- 官方平台没有群号只有 openid——用群内"订阅"命令即可,插件自动记录当前群 openid。手动填 \`groups\` 时用 \`schedule.groups\` 查看已知群 openid。官机主动发群消息有平台频率限制,且机器人需在群里。
26
+ 群命令:订阅 任务名 / 取消订阅 任务名 / 订阅列表 / schedule.list / schedule.groups / schedule.test 任务名 / 我的ID
111
27
  `
112
28
 
113
29
  // ===== 纯函数(可单测) =====
@@ -726,7 +642,7 @@ function apply(ctx, config) {
726
642
  function resolveSubscribeTaskName(taskName) {
727
643
  const tasks = config.tasks || {}
728
644
  if (taskName) {
729
- if (!tasks[taskName]) return { name: null, hint: `未找到任务 "${taskName}",可用"订阅列表"或 lls.list 查看任务名` }
645
+ if (!tasks[taskName]) return { name: null, hint: `未找到任务 "${taskName}",可用"订阅列表"或 schedule.list 查看任务名` }
730
646
  return { name: taskName, hint: null }
731
647
  }
732
648
  const names = Object.keys(tasks).filter(k => tasks[k] && tasks[k].enabled !== false)
@@ -772,24 +688,12 @@ function apply(ctx, config) {
772
688
  return await subscribeCurrentGroup(session, taskName)
773
689
  })
774
690
 
775
- ctx.command('lls.sub [taskName:text]', '订阅推送(备用入口)')
776
- .action(async ({ session }, taskName) => {
777
- if (!(await checkSubscribePerm(session))) return permDeniedHint()
778
- return await subscribeCurrentGroup(session, taskName)
779
- })
780
-
781
691
  ctx.command('取消订阅 [taskName:text]', '让当前群取消订阅指定任务的推送')
782
692
  .action(async ({ session }, taskName) => {
783
693
  if (!(await checkSubscribePerm(session))) return permDeniedHint()
784
694
  return await unsubscribeCurrentGroup(session, taskName)
785
695
  })
786
696
 
787
- ctx.command('lls.unsub [taskName:text]', '取消订阅(备用入口)')
788
- .action(async ({ session }, taskName) => {
789
- if (!(await checkSubscribePerm(session))) return permDeniedHint()
790
- return await unsubscribeCurrentGroup(session, taskName)
791
- })
792
-
793
697
  ctx.command('订阅列表', '查看所有任务的订阅群')
794
698
  .action(async () => {
795
699
  logger.info('[schedule] 命令被调用: 订阅列表')
@@ -807,23 +711,6 @@ function apply(ctx, config) {
807
711
  return '📋 订阅列表:\n' + lines.join('\n')
808
712
  })
809
713
 
810
- ctx.command('lls.sublist', '查看订阅列表(备用入口)')
811
- .action(async () => {
812
- logger.info('[schedule] 命令被调用: lls.sublist')
813
- if (!subs.size) return '暂无任何群订阅。群内发"订阅 任务名"即可订阅'
814
- const lines = []
815
- for (const [taskName, taskSubs] of subs) {
816
- const entries = [...taskSubs.values()]
817
- lines.push(`【${taskName}】${entries.length} 个群`)
818
- for (const s of entries) {
819
- const bot = ctx.bots.find(b => b.sid === s.botSid)
820
- const name = bot ? await resolveGroupName(bot, s.guildId) : ''
821
- lines.push(` · ${name || '未知群名'} (${s.guildId})`)
822
- }
823
- }
824
- return '📋 订阅列表:\n' + lines.join('\n')
825
- })
826
-
827
714
  ctx.command('我的ID', '查看自己的账号信息(openid/群ID/角色)')
828
715
  .action(({ session }) => {
829
716
  logger.info('[schedule] 命令被调用: 我的ID')
@@ -836,56 +723,8 @@ function apply(ctx, config) {
836
723
  return lines.join('\n')
837
724
  })
838
725
 
839
- ctx.command('lls.me', '查看自己的账号信息(备用入口)')
840
- .action(({ session }) => {
841
- logger.info('[schedule] 命令被调用: lls.me')
842
- const role = session.author?.roles?.[0]?.id || session.event?.member?.roles?.[0]?.id
843
- const roleName = role === 'owner' ? '群主' : role === 'admin' ? '群管理' : role === 'member' ? '普通成员' : (role || '未知')
844
- const lines = ['👤 我的账号信息:', `平台:${session.platform}`, `用户ID:${session.userId}`]
845
- if (session.guildId) lines.push(`当前群ID:${session.guildId}`)
846
- if (session.guildId) lines.push(`本群角色:${roleName}`)
847
- if (session.channelId && session.channelId !== session.guildId) lines.push(`频道ID:${session.channelId}`)
848
- return lines.join('\n')
849
- })
850
-
851
- ctx.command('lls', 'll-schedule 管理(备用入口)')
852
- .action(() => {
853
- logger.info('[schedule] 命令被调用: lls')
854
- return `⚙️ 备用入口:lls.list / lls.groups / lls.test <任务名> / lls.sub / lls.unsub / lls.sublist`
855
- })
856
-
857
- ctx.command('lls.list', '查看定时任务(备用入口)')
858
- .action(() => {
859
- logger.info('[schedule] 命令被调用: lls.list')
860
- return formatTaskList()
861
- })
862
-
863
- ctx.command('lls.groups', '查看机器人已知的群(备用入口,官机显示 openid)')
864
- .action(async () => {
865
- logger.info('[schedule] 命令被调用: lls.groups')
866
- return await listKnownGroups()
867
- })
868
-
869
- ctx.command('lls.test <name>', '立即测试发送指定任务(备用入口)')
870
- .action(async ({ session }, name) => {
871
- logger.info(`[schedule] 命令被调用: lls.test name=${name}`)
872
- const tasks = config.tasks || {}
873
- const task = tasks[name]
874
- if (!task) return `未找到任务 "${name}",可用 lls.list 查看任务名`
875
- const testTask = { ...task }
876
- if (!testTask.groups || !testTask.groups.length) {
877
- testTask.groups = session.guildId ? [String(session.guildId)] : []
878
- }
879
- const rows = parseScheduleRows(task)
880
- const day = todayDay()
881
- const hit = rows.find(r => dayMatches(parseDays(r.wd), day))
882
- const sendText = hit ? (hit.text || '') : (rows.length ? (rows[0].text || '') : '')
883
- await sendTask(name, testTask, { text: sendText, markdown: task.markdown, onlyBotSid: session.bot?.sid })
884
- return `✅ 已发送任务 "${name}"`
885
- })
886
-
887
726
  logger.info('[schedule] 命令已注册: schedule / schedule.list / schedule.groups / schedule.test / ' +
888
- `"订阅" / "取消订阅" / 订阅列表 / lls.*`)
727
+ `"订阅" / "取消订阅" / 订阅列表 / 我的ID`)
889
728
 
890
729
  Promise.all([loadKnownGroups(), loadSubs()]).then(() => checkAndSend())
891
730
  }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "koishi-plugin-ll-schedule",
3
- "version": "1.4.0",
3
+ "version": "1.4.1",
4
4
  "description": "Scheduled message sender with weekly slots (per-day time & content), QQ official markdown card support",
5
5
  "main": "index.js",
6
6
  "files": [
@@ -23,3 +23,4 @@
23
23
 
24
24
 
25
25
 
26
+