koishi-plugin-ll-schedule 1.6.0 → 1.6.2
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.
- package/index.js +67 -23
- package/package.json +3 -1
package/index.js
CHANGED
|
@@ -23,7 +23,12 @@ exports.usage = `定时提醒:每个任务一个大文本框(schedule)。每
|
|
|
23
23
|
星期:周一/周六/每天/工作日/周末/1,3,5 时间:12:20, 18:20, 21:20(可多个)
|
|
24
24
|
内容支持 Markdown 卡片、模板变量 {date} {time} {week} {task}
|
|
25
25
|
|
|
26
|
-
|
|
26
|
+
群命令:
|
|
27
|
+
订阅 → 列出可以订阅的推送
|
|
28
|
+
订阅 任务名 → 本群订阅
|
|
29
|
+
取消订阅 → 列出本群已订阅的推送
|
|
30
|
+
取消订阅 任务名 → 本群取消订阅
|
|
31
|
+
订阅列表 / schedule.list / schedule.groups / schedule.test 任务名 / schedule.testcur 任务名(只发当前群) / 我的ID
|
|
27
32
|
管理员:schedule.unsuball 任务名(取消该任务全部群订阅并通知各群;填 all 清空全部)
|
|
28
33
|
|
|
29
34
|
推送接口:POST /ll-schedule/push {"secret":"密钥","task":"任务名","place1":"xxx","delay":0}
|
|
@@ -145,6 +150,25 @@ function parseScheduleRows(task) {
|
|
|
145
150
|
return []
|
|
146
151
|
}
|
|
147
152
|
|
|
153
|
+
// 汇总时间段的中文概览(用于订阅清单显示)
|
|
154
|
+
function summarizeRows(rows) {
|
|
155
|
+
if (!rows || !rows.length) return '不定时推送(有新内容时通知)'
|
|
156
|
+
const daily = rows.every(r => {
|
|
157
|
+
const w = String(r.wd || '').trim()
|
|
158
|
+
return !w || w === '每天' || w === '每日' || w === '天天'
|
|
159
|
+
})
|
|
160
|
+
if (daily) {
|
|
161
|
+
const times = []
|
|
162
|
+
for (const r of rows) {
|
|
163
|
+
for (const t of parseTimes(r.time)) if (!times.includes(t)) times.push(t)
|
|
164
|
+
}
|
|
165
|
+
return `每天 ${times.join(', ')}`
|
|
166
|
+
}
|
|
167
|
+
if (rows.length <= 3) return rows.map(r => `${r.wd || '每天'} ${r.time}`).join(' / ')
|
|
168
|
+
const head = rows.slice(0, 2).map(r => `${r.wd || '每天'} ${r.time}`).join(' / ')
|
|
169
|
+
return `${rows.length} 个时间段(${head} 等)`
|
|
170
|
+
}
|
|
171
|
+
|
|
148
172
|
// 计算"现在这一刻该发什么":返回 [{ name, key, text, markdown, image }]
|
|
149
173
|
function computeFires(tasks, date, hm) {
|
|
150
174
|
const day = todayDay(date)
|
|
@@ -218,7 +242,7 @@ function buildTextFromMd(md) {
|
|
|
218
242
|
.trim()
|
|
219
243
|
}
|
|
220
244
|
|
|
221
|
-
exports._test = { parseTimes, todayDay, parseDays, dayMatches, parseScheduleBlocks, parseScheduleRows, computeFires, renderText, renderPushTemplate, buildMd, buildTextFromMd }
|
|
245
|
+
exports._test = { parseTimes, todayDay, parseDays, dayMatches, parseScheduleBlocks, parseScheduleRows, summarizeRows, computeFires, renderText, renderPushTemplate, buildMd, buildTextFromMd }
|
|
222
246
|
|
|
223
247
|
// ===== 配置 Schema =====
|
|
224
248
|
|
|
@@ -741,24 +765,44 @@ function apply(ctx, config) {
|
|
|
741
765
|
(config.subscribeAdminBypass ? ',或为本群群主/群管理' : '')
|
|
742
766
|
}
|
|
743
767
|
|
|
744
|
-
|
|
768
|
+
// 列出所有可订阅的任务(含时间概览 + 本群是否已订阅)
|
|
769
|
+
function listSubscribable(session) {
|
|
745
770
|
const tasks = config.tasks || {}
|
|
746
|
-
if (taskName) {
|
|
747
|
-
if (!tasks[taskName]) return { name: null, hint: `未找到任务 "${taskName}",可用"订阅列表"或 schedule.list 查看任务名` }
|
|
748
|
-
return { name: taskName, hint: null }
|
|
749
|
-
}
|
|
750
771
|
const names = Object.keys(tasks).filter(k => tasks[k] && tasks[k].enabled !== false)
|
|
751
|
-
if (names.length
|
|
752
|
-
|
|
753
|
-
|
|
772
|
+
if (!names.length) return '暂无任何可订阅的推送(请在插件设置页的 tasks 里添加任务)'
|
|
773
|
+
const key = (session.bot && session.guildId) ? `${session.bot.sid}:${session.guildId}` : null
|
|
774
|
+
const lines = ['📋 可以订阅的推送:', '']
|
|
775
|
+
names.forEach((n, i) => {
|
|
776
|
+
const rows = parseScheduleRows(tasks[n])
|
|
777
|
+
const subbed = (key && subs.get(n) && subs.get(n).has(key)) ? ' ✅本群已订阅' : ''
|
|
778
|
+
lines.push(`${i + 1}. ${n} —— ${summarizeRows(rows)}${subbed}`)
|
|
779
|
+
})
|
|
780
|
+
lines.push('', `发送「订阅 任务名」即可订阅,例如:订阅 ${names[0]}`)
|
|
781
|
+
return lines.join('\n')
|
|
782
|
+
}
|
|
783
|
+
|
|
784
|
+
// 列出本群已订阅的任务
|
|
785
|
+
function listMySubs(session) {
|
|
786
|
+
const key = `${session.bot.sid}:${session.guildId}`
|
|
787
|
+
const mine = []
|
|
788
|
+
for (const [tn, m] of subs) {
|
|
789
|
+
if (m.has(key)) mine.push(tn)
|
|
790
|
+
}
|
|
791
|
+
if (!mine.length) return '本群还没有订阅任何推送\n发送「订阅」可查看有哪些可以订阅'
|
|
792
|
+
return '📋 本群已订阅:\n' + mine.map((n, i) => `${i + 1}. ${n}`).join('\n') +
|
|
793
|
+
'\n\n发送「取消订阅 任务名」可取消'
|
|
754
794
|
}
|
|
755
795
|
|
|
756
796
|
async function subscribeCurrentGroup(session, taskName) {
|
|
757
|
-
logger.info(`[schedule] 命令被调用: 订阅 taskName=${taskName || '(
|
|
797
|
+
logger.info(`[schedule] 命令被调用: 订阅 taskName=${taskName || '(列表)'}`)
|
|
758
798
|
if (!session.guildId || !session.bot) return '❌ 订阅只能在群聊里使用'
|
|
759
|
-
|
|
760
|
-
if (!
|
|
761
|
-
const
|
|
799
|
+
// 不带任务名 → 直接列出可以订阅什么
|
|
800
|
+
if (!taskName) return listSubscribable(session)
|
|
801
|
+
const tasks = config.tasks || {}
|
|
802
|
+
if (!tasks[taskName]) return `未找到任务 "${taskName}"\n发送「订阅」可查看可以订阅的列表`
|
|
803
|
+
if (tasks[taskName].enabled === false) return `任务 "${taskName}" 已停用,暂时不能订阅`
|
|
804
|
+
const name = taskName
|
|
805
|
+
const task = tasks[name]
|
|
762
806
|
const key = `${session.bot.sid}:${session.guildId}`
|
|
763
807
|
const taskSubs = getTaskSubs(name)
|
|
764
808
|
if (taskSubs.has(key)) return `ℹ️ 本群已在任务 "${name}" 的推送列表里`
|
|
@@ -767,21 +811,21 @@ function apply(ctx, config) {
|
|
|
767
811
|
persistSub(name, entry)
|
|
768
812
|
logger.info(`[schedule] 群 ${session.guildId} 已订阅任务 "${name}"`)
|
|
769
813
|
const rows = parseScheduleRows(task)
|
|
770
|
-
return `✅
|
|
814
|
+
return `✅ 本群已订阅「${name}」\n时间:${summarizeRows(rows)}`
|
|
771
815
|
}
|
|
772
816
|
|
|
773
817
|
async function unsubscribeCurrentGroup(session, taskName) {
|
|
774
|
-
logger.info(`[schedule] 命令被调用: 取消订阅 taskName=${taskName || '(
|
|
818
|
+
logger.info(`[schedule] 命令被调用: 取消订阅 taskName=${taskName || '(列表)'}`)
|
|
775
819
|
if (!session.guildId || !session.bot) return '❌ 取消订阅只能在群聊里使用'
|
|
776
|
-
|
|
777
|
-
if (!
|
|
778
|
-
const taskSubs = subs.get(
|
|
820
|
+
// 不带任务名 → 列出本群订阅了哪些
|
|
821
|
+
if (!taskName) return listMySubs(session)
|
|
822
|
+
const taskSubs = subs.get(taskName)
|
|
779
823
|
const key = `${session.bot.sid}:${session.guildId}`
|
|
780
|
-
if (!taskSubs || !taskSubs.has(key)) return `ℹ️
|
|
824
|
+
if (!taskSubs || !taskSubs.has(key)) return `ℹ️ 本群没有订阅「${taskName}」\n发送「取消订阅」可查看本群已订阅的推送`
|
|
781
825
|
taskSubs.delete(key)
|
|
782
|
-
removeSub(
|
|
783
|
-
logger.info(`[schedule] 群 ${session.guildId} 已取消订阅任务 "${
|
|
784
|
-
return `✅
|
|
826
|
+
removeSub(taskName, session.bot.sid, session.guildId)
|
|
827
|
+
logger.info(`[schedule] 群 ${session.guildId} 已取消订阅任务 "${taskName}"`)
|
|
828
|
+
return `✅ 本群已取消订阅「${taskName}」`
|
|
785
829
|
}
|
|
786
830
|
|
|
787
831
|
ctx.command('订阅 [taskName:text]', '让当前群订阅指定任务的推送')
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "koishi-plugin-ll-schedule",
|
|
3
|
-
"version": "1.6.
|
|
3
|
+
"version": "1.6.2",
|
|
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": [
|
|
@@ -28,3 +28,5 @@
|
|
|
28
28
|
|
|
29
29
|
|
|
30
30
|
|
|
31
|
+
|
|
32
|
+
|