@zhin.js/plugin-rss 1.0.0 → 1.1.0

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 (52) hide show
  1. package/README.md +1 -1
  2. package/agent/tools/rss_list_subscriptions.ts +38 -0
  3. package/agent/tools/rss_preview_feed.ts +22 -0
  4. package/commands/rss-add/[url].js +59 -0
  5. package/commands/rss-add/[url].ts +61 -0
  6. package/commands/rss-check/[[url]].js +42 -0
  7. package/commands/rss-check/[[url]].ts +41 -0
  8. package/commands/rss-list.js +28 -0
  9. package/commands/rss-list.ts +31 -0
  10. package/commands/rss-preview/[url].js +22 -0
  11. package/commands/rss-preview/[url].ts +19 -0
  12. package/commands/rss-remove/[url].js +34 -0
  13. package/commands/rss-remove/[url].ts +36 -0
  14. package/lib/channel.d.ts +16 -0
  15. package/lib/channel.d.ts.map +1 -0
  16. package/lib/channel.js +42 -0
  17. package/lib/channel.js.map +1 -0
  18. package/lib/db-store.d.ts +16 -0
  19. package/lib/db-store.d.ts.map +1 -0
  20. package/lib/db-store.js +40 -0
  21. package/lib/db-store.js.map +1 -0
  22. package/lib/feed.d.ts +29 -0
  23. package/lib/feed.d.ts.map +1 -0
  24. package/lib/feed.js +89 -0
  25. package/lib/feed.js.map +1 -0
  26. package/lib/index.d.ts +6 -1
  27. package/lib/index.d.ts.map +1 -1
  28. package/lib/index.js +4 -492
  29. package/lib/index.js.map +1 -1
  30. package/lib/memory-store.d.ts +30 -0
  31. package/lib/memory-store.d.ts.map +1 -0
  32. package/lib/memory-store.js +61 -0
  33. package/lib/memory-store.js.map +1 -0
  34. package/lib/poll.d.ts +37 -0
  35. package/lib/poll.d.ts.map +1 -0
  36. package/lib/poll.js +154 -0
  37. package/lib/poll.js.map +1 -0
  38. package/lib/rss-agent-deps.d.ts +15 -0
  39. package/lib/rss-agent-deps.d.ts.map +1 -0
  40. package/lib/rss-agent-deps.js +10 -0
  41. package/lib/rss-agent-deps.js.map +1 -0
  42. package/package.json +46 -13
  43. package/plugin.js +93 -0
  44. package/schema.json +30 -0
  45. package/src/channel.ts +69 -0
  46. package/src/db-store.ts +59 -0
  47. package/src/feed.ts +106 -0
  48. package/src/index.ts +20 -556
  49. package/src/memory-store.ts +88 -0
  50. package/src/poll.ts +171 -0
  51. package/src/rss-agent-deps.ts +15 -0
  52. /package/{skills/rss/SKILL.md → agent/skills/rss.md} +0 -0
package/lib/feed.js ADDED
@@ -0,0 +1,89 @@
1
+ /**
2
+ * RSS feed fetch/preview helpers (no Plugin host).
3
+ */
4
+ import Parser from 'rss-parser';
5
+ export const DEFAULT_RSS_CONFIG = {
6
+ pollCron: '0 */5 * * * *',
7
+ maxPerGroup: 30,
8
+ maxItems: 5,
9
+ timeout: 15_000,
10
+ };
11
+ export function resolveRssConfig(raw) {
12
+ return { ...DEFAULT_RSS_CONFIG, ...raw };
13
+ }
14
+ /**
15
+ * 剔除 HTML 标签与 ` ` 实体并折叠空白。
16
+ * 线性单遍扫描实现(手写状态机),语义等价于原先的
17
+ * `/<[^>]*>/g` → `/&nbsp;/g` → `/\s+/g` 三步 replace,但避免:
18
+ * - js/polynomial-redos:大量 `<` 无闭合时正则逐位重扫的二次方回溯;
19
+ * - js/incomplete-multi-character-sanitization:多趟 replace 的残留问题。
20
+ */
21
+ export function stripHtml(html) {
22
+ let out = '';
23
+ let pendingSpace = false;
24
+ let mayHaveTagEnd = html.includes('>');
25
+ let i = 0;
26
+ while (i < html.length) {
27
+ const ch = html[i];
28
+ if (ch === '<' && mayHaveTagEnd) {
29
+ const end = html.indexOf('>', i + 1);
30
+ if (end >= 0) {
31
+ i = end + 1;
32
+ continue;
33
+ }
34
+ // 后续不再有 `>`:剩余的 `<` 都是字面字符,不再重复扫描。
35
+ mayHaveTagEnd = false;
36
+ }
37
+ if (ch === '&' && html.startsWith('&nbsp;', i)) {
38
+ pendingSpace = true;
39
+ i += '&nbsp;'.length;
40
+ continue;
41
+ }
42
+ if (/\s/u.test(ch)) {
43
+ pendingSpace = true;
44
+ i += 1;
45
+ continue;
46
+ }
47
+ if (pendingSpace && out.length > 0)
48
+ out += ' ';
49
+ pendingSpace = false;
50
+ out += ch;
51
+ i += 1;
52
+ }
53
+ return out;
54
+ }
55
+ export async function fetchFeed(url, timeout = DEFAULT_RSS_CONFIG.timeout) {
56
+ const parser = new Parser({
57
+ timeout,
58
+ headers: {
59
+ 'User-Agent': 'ZhinBot-RSS/1.0',
60
+ Accept: 'application/rss+xml, application/atom+xml, application/xml, text/xml',
61
+ },
62
+ });
63
+ const feed = await parser.parseURL(url);
64
+ const items = (feed.items || []).slice(0, 20).map((item) => ({
65
+ title: (item.title || '').trim(),
66
+ link: (item.link || '').trim(),
67
+ date: item.isoDate || item.pubDate || '',
68
+ summary: stripHtml(item.contentSnippet || item.content || '').slice(0, 200),
69
+ guid: item.guid || item.link || item.title || '',
70
+ }));
71
+ return { title: (feed.title || url).trim(), items };
72
+ }
73
+ export function formatFeedPreview(title, items) {
74
+ if (items.length === 0)
75
+ return `${title}: 暂无内容`;
76
+ const lines = [`${title} (共 ${items.length} 条)`];
77
+ for (const item of items.slice(0, 5)) {
78
+ lines.push('');
79
+ lines.push(`${item.title}`);
80
+ if (item.date)
81
+ lines.push(` ${new Date(item.date).toLocaleString('zh-CN')}`);
82
+ if (item.link)
83
+ lines.push(` ${item.link}`);
84
+ }
85
+ if (items.length > 5)
86
+ lines.push(`\n...还有 ${items.length - 5} 条`);
87
+ return lines.join('\n');
88
+ }
89
+ //# sourceMappingURL=feed.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"feed.js","sourceRoot":"","sources":["../src/feed.ts"],"names":[],"mappings":"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"}
package/lib/index.d.ts CHANGED
@@ -1,2 +1,7 @@
1
- export {};
1
+ export { DEFAULT_RSS_CONFIG, fetchFeed, formatFeedPreview, resolveRssConfig, stripHtml, } from './feed.js';
2
+ export type { FeedItem, RssConfig } from './feed.js';
3
+ export { getRssDb, getRssSeen, getRssSubs, provideRssDb, setRssDb, ensureRssMemoryDb, resetRssDb, } from './db-store.js';
4
+ export { extractChannelInfo, SMOKE_CHANNEL } from './channel.js';
5
+ export { checkSubscriptions, pollAllFeeds, formatNewItems, setRssOutboundPush } from './poll.js';
6
+ export type { RssOutboundPush, CheckResult } from './poll.js';
2
7
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":""}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,kBAAkB,EAClB,SAAS,EACT,iBAAiB,EACjB,gBAAgB,EAChB,SAAS,GACV,MAAM,WAAW,CAAC;AACnB,YAAY,EAAE,QAAQ,EAAE,SAAS,EAAE,MAAM,WAAW,CAAC;AACrD,OAAO,EACL,QAAQ,EACR,UAAU,EACV,UAAU,EACV,YAAY,EACZ,QAAQ,EACR,iBAAiB,EACjB,UAAU,GACX,MAAM,eAAe,CAAC;AACvB,OAAO,EAAE,kBAAkB,EAAE,aAAa,EAAE,MAAM,cAAc,CAAC;AACjE,OAAO,EAAE,kBAAkB,EAAE,YAAY,EAAE,cAAc,EAAE,kBAAkB,EAAE,MAAM,WAAW,CAAC;AACjG,YAAY,EAAE,eAAe,EAAE,WAAW,EAAE,MAAM,WAAW,CAAC"}
package/lib/index.js CHANGED
@@ -1,493 +1,5 @@
1
- /**
2
- * @zhin.js/plugin-rss
3
- *
4
- * RSS/Atom 订阅推送插件
5
- *
6
- * 功能:
7
- * - 订阅任意 RSS/Atom feed
8
- * - 基于 Cron 的定时轮询(默认每 5 分钟)
9
- * - 新条目自动推送到订阅的群聊/私聊
10
- * - 支持多群订阅同一 feed(去重共享)
11
- * - 订阅管理(增删查)
12
- * - 手动检查更新
13
- * - 数据库持久化
14
- * - AI 工具集成
15
- *
16
- * 命令:
17
- * rss-add <url> 订阅 RSS 源
18
- * rss-remove <url> 取消订阅
19
- * rss-list 查看当前订阅列表
20
- * rss-check [url] 手动检查更新
21
- * rss-preview <url> 预览 feed 最新内容(不订阅)
22
- *
23
- * 配置(zhin.config.yml):
24
- * ```yaml
25
- * plugins:
26
- * - "@zhin.js/plugin-rss"
27
- * rss:
28
- * pollCron: "0/5 * * * *"
29
- * maxPerGroup: 30
30
- * maxItems: 5
31
- * timeout: 15000
32
- * ```
33
- */
34
- import { formatCompact, Cron, MessageCommand, Schema, usePlugin, ZhinTool } from 'zhin.js';
35
- import Parser from "rss-parser";
36
- const plugin = usePlugin();
37
- const { logger, root, addCommand, addCron, useContext, onDispose, declareConfig } = plugin;
38
- // ─── 配置 ─────────────────────────────────────────────────────────────────────
39
- const config = declareConfig("rss", Schema.object({
40
- pollCron: Schema.string().default("*/5 * * * *").description("轮询频率 (Cron 表达式)"),
41
- maxPerGroup: Schema.number().default(30).min(1).max(200).description("每会话最大订阅数"),
42
- maxItems: Schema.number().default(5).min(1).max(20).description("单次推送最多条数"),
43
- timeout: Schema.number().default(15_000).min(1000).max(60000).description("拉取超时 (ms)"),
44
- }));
45
- // ─── Feed 解析器 ──────────────────────────────────────────────────────────────
46
- const parser = new Parser({
47
- timeout: config.timeout,
48
- headers: {
49
- "User-Agent": "ZhinBot-RSS/1.0",
50
- Accept: "application/rss+xml, application/atom+xml, application/xml, text/xml",
51
- },
52
- });
53
- async function fetchFeed(url) {
54
- const feed = await parser.parseURL(url);
55
- const items = (feed.items || []).slice(0, 20).map((item) => ({
56
- title: (item.title || "").trim(),
57
- link: (item.link || "").trim(),
58
- date: item.isoDate || item.pubDate || "",
59
- summary: stripHtml(item.contentSnippet || item.content || "").slice(0, 200),
60
- guid: item.guid || item.link || item.title || "",
61
- }));
62
- return { title: (feed.title || url).trim(), items };
63
- }
64
- function stripHtml(html) {
65
- return html.replace(/<[^>]*>/g, "").replace(/&nbsp;/g, " ").replace(/\s+/g, " ").trim();
66
- }
67
- // ─── 数据库 ───────────────────────────────────────────────────────────────────
68
- let _db = null;
69
- function getSubs() {
70
- if (!_db) {
71
- const database = root.inject("database");
72
- if (database)
73
- _db = database;
74
- }
75
- return _db?.models?.get("rss_subscriptions") ?? null;
76
- }
77
- function getSeen() {
78
- return _db?.models?.get("rss_seen_items") ?? null;
79
- }
80
- useContext("database", (db) => {
81
- _db = db;
82
- db.define("rss_subscriptions", {
83
- url: { type: "text", nullable: false },
84
- feed_title: { type: "text", default: "" },
85
- adapter_name: { type: "text", default: "" },
86
- bot_id: { type: "text", default: "" },
87
- channel_type: { type: "text", default: "group" },
88
- channel_id: { type: "text", default: "" },
89
- creator_id: { type: "text", default: "" },
90
- creator_name: { type: "text", default: "" },
91
- created_at: { type: "text", default: "" },
92
- });
93
- db.define("rss_seen_items", {
94
- feed_url: { type: "text", nullable: false },
95
- item_guid: { type: "text", nullable: false },
96
- item_title: { type: "text", default: "" },
97
- seen_at: { type: "text", default: "" },
98
- });
99
- logger.info(formatCompact({ op: "model" }));
100
- });
101
- function ts() {
102
- return new Date().toISOString();
103
- }
104
- // ─── 辅助:消息上下文提取 ─────────────────────────────────────────────────────
105
- function extractChannelInfo(message) {
106
- const channelType = message.$channel?.type || (message.type === "group" ? "group" : "private");
107
- const channelId = String(message.$channel?.id || message.$group?.id || message.$target?.id || message.$sender?.id || "");
108
- return {
109
- adapterName: String(message.$adapter || ""),
110
- botId: String(message.$bot || ""),
111
- channelType,
112
- channelId,
113
- };
114
- }
115
- // ─── 推送引擎 ─────────────────────────────────────────────────────────────────
116
- async function pushToChannel(adapterName, botId, channelType, channelId, content) {
117
- try {
118
- const adapter = root.inject(adapterName);
119
- if (!adapter)
120
- return false;
121
- await adapter.sendMessage({
122
- context: adapterName,
123
- bot: botId,
124
- type: channelType,
125
- id: channelId,
126
- content,
127
- });
128
- return true;
129
- }
130
- catch (e) {
131
- logger.warn(formatCompact({
132
- op: "push",
133
- ok: false,
134
- adapter: adapterName,
135
- bot: botId,
136
- channel: `${channelType}:${channelId}`,
137
- error: e.message,
138
- }));
139
- return false;
140
- }
141
- }
142
- function formatItems(feedTitle, items) {
143
- const lines = [`${feedTitle} 有 ${items.length} 条新内容:`];
144
- for (const item of items.slice(0, config.maxItems)) {
145
- lines.push("");
146
- lines.push(`${item.title}`);
147
- if (item.summary)
148
- lines.push(item.summary);
149
- if (item.link)
150
- lines.push(item.link);
151
- }
152
- if (items.length > config.maxItems) {
153
- lines.push(`\n...还有 ${items.length - config.maxItems} 条,请查看源站`);
154
- }
155
- return lines.join("\n");
156
- }
157
- // ─── 轮询逻辑 ─────────────────────────────────────────────────────────────────
158
- let polling = false;
159
- async function pollAllFeeds() {
160
- const Subs = getSubs();
161
- const Seen = getSeen();
162
- if (!Subs || !Seen)
163
- return;
164
- if (polling)
165
- return;
166
- polling = true;
167
- try {
168
- const allSubs = await Subs.select();
169
- if (allSubs.length === 0)
170
- return;
171
- const urlSet = new Set(allSubs.map((s) => s.url));
172
- for (const url of urlSet) {
173
- try {
174
- const { title, items } = await fetchFeed(url);
175
- if (items.length === 0)
176
- continue;
177
- const seenRows = await Seen.select().where({ feed_url: url });
178
- const seenGuids = new Set(seenRows.map((r) => r.item_guid));
179
- const newItems = items.filter((item) => !seenGuids.has(item.guid));
180
- if (newItems.length === 0)
181
- continue;
182
- for (const item of newItems) {
183
- await Seen.insert({
184
- feed_url: url,
185
- item_guid: item.guid,
186
- item_title: item.title,
187
- seen_at: ts(),
188
- });
189
- }
190
- const message = formatItems(title, newItems);
191
- const subscribers = allSubs.filter((s) => s.url === url);
192
- for (const sub of subscribers) {
193
- await pushToChannel(sub.adapter_name, sub.bot_id, sub.channel_type, sub.channel_id, message);
194
- }
195
- // 更新 feed 标题
196
- if (title) {
197
- for (const sub of subscribers) {
198
- if (sub.feed_title !== title) {
199
- await Subs.update({ feed_title: title }).where({ id: sub.id });
200
- }
201
- }
202
- }
203
- }
204
- catch (e) {
205
- logger.debug(`轮询 ${url} 失败: ${e.message}`);
206
- }
207
- }
208
- }
209
- catch (e) {
210
- logger.warn(formatCompact({ op: "poll", ok: false, error: e.message }));
211
- }
212
- finally {
213
- polling = false;
214
- }
215
- }
216
- // 定期清理过老的 seen 记录(保留最近 7 天)
217
- async function cleanOldSeen() {
218
- const Seen = getSeen();
219
- if (!Seen)
220
- return;
221
- try {
222
- const cutoff = new Date();
223
- cutoff.setDate(cutoff.getDate() - 7);
224
- const cutoffStr = cutoff.toISOString();
225
- const all = await Seen.select();
226
- const expired = all.filter((r) => r.seen_at && r.seen_at < cutoffStr);
227
- for (const row of expired) {
228
- await Seen.delete().where({ id: row.id });
229
- }
230
- }
231
- catch {
232
- // 清理失败不影响主流程
233
- }
234
- }
235
- // ─── Cron 定时任务 ────────────────────────────────────────────────────────────
236
- addCron(new Cron(config.pollCron, pollAllFeeds));
237
- addCron(new Cron("0 4 * * *", cleanOldSeen));
238
- // ─── 命令:rss-add ───────────────────────────────────────────────────────────
239
- addCommand(new MessageCommand("rss-add <url:text>")
240
- .desc("订阅 RSS", "订阅一个 RSS/Atom 源,新内容将自动推送到当前会话")
241
- .usage("rss-add <Feed URL>")
242
- .examples("rss-add https://sspai.com/feed", "rss-add https://rsshub.app/bilibili/user/dynamic/1")
243
- .action(async (message, result) => {
244
- const Subs = getSubs();
245
- if (!Subs)
246
- return "RSS 数据库尚未就绪,请稍后重试";
247
- const url = result.params.url?.trim();
248
- if (!url)
249
- return "请提供 RSS 源地址,格式:rss-add <URL>";
250
- if (!/^https?:\/\//i.test(url))
251
- return "请提供有效的 HTTP/HTTPS 地址";
252
- const { adapterName, botId, channelType, channelId } = extractChannelInfo(message);
253
- if (!channelId)
254
- return "无法确定当前会话,请在群聊或私聊中使用";
255
- // 检查是否已订阅
256
- const existing = await Subs.select().where({
257
- url,
258
- adapter_name: adapterName,
259
- channel_type: channelType,
260
- channel_id: channelId,
261
- });
262
- if (existing.length > 0)
263
- return "当前会话已订阅该源,无需重复添加";
264
- // 检查数量限制
265
- const currentSubs = await Subs.select().where({
266
- adapter_name: adapterName,
267
- channel_type: channelType,
268
- channel_id: channelId,
269
- });
270
- if (currentSubs.length >= config.maxPerGroup) {
271
- return `当前会话订阅数已达上限 (${config.maxPerGroup}),请先取消一些`;
272
- }
273
- // 验证 feed 可达
274
- let feedTitle = "";
275
- try {
276
- const { title } = await fetchFeed(url);
277
- feedTitle = title;
278
- }
279
- catch (e) {
280
- return `无法解析该地址: ${e.message}\n请确认是有效的 RSS/Atom 源`;
281
- }
282
- await Subs.insert({
283
- url,
284
- feed_title: feedTitle,
285
- adapter_name: adapterName,
286
- bot_id: botId,
287
- channel_type: channelType,
288
- channel_id: channelId,
289
- creator_id: String(message.$sender?.id || ""),
290
- creator_name: String(message.$sender?.name || ""),
291
- created_at: ts(),
292
- });
293
- // 标记现有条目为已读,避免订阅后立即推送历史
294
- try {
295
- const Seen = getSeen();
296
- if (Seen) {
297
- const { items } = await fetchFeed(url);
298
- for (const item of items) {
299
- const dup = await Seen.select().where({ feed_url: url, item_guid: item.guid });
300
- if (dup.length === 0) {
301
- await Seen.insert({ feed_url: url, item_guid: item.guid, item_title: item.title, seen_at: ts() });
302
- }
303
- }
304
- }
305
- }
306
- catch {
307
- // 标记失败不影响订阅
308
- }
309
- return `订阅成功!\n源: ${feedTitle || url}\n新内容将自动推送到当前会话`;
310
- }));
311
- // ─── 命令:rss-remove ────────────────────────────────────────────────────────
312
- addCommand(new MessageCommand("rss-remove <url:text>")
313
- .desc("取消订阅", "取消一个 RSS 订阅")
314
- .usage("rss-remove <Feed URL>")
315
- .examples("rss-remove https://sspai.com/feed")
316
- .action(async (message, result) => {
317
- const Subs = getSubs();
318
- if (!Subs)
319
- return "RSS 数据库尚未就绪";
320
- const url = result.params.url?.trim();
321
- if (!url)
322
- return "请提供要取消的 RSS 源地址";
323
- const { adapterName, channelType, channelId } = extractChannelInfo(message);
324
- const rows = await Subs.select().where({
325
- url,
326
- adapter_name: adapterName,
327
- channel_type: channelType,
328
- channel_id: channelId,
329
- });
330
- if (rows.length === 0)
331
- return "未找到该订阅";
332
- await Subs.delete().where({ id: rows[0].id });
333
- return `已取消订阅: ${rows[0].feed_title || url}`;
334
- }));
335
- // ─── 命令:rss-list ──────────────────────────────────────────────────────────
336
- addCommand(new MessageCommand("rss-list")
337
- .desc("订阅列表", "查看当前会话的所有 RSS 订阅")
338
- .action(async (message) => {
339
- const Subs = getSubs();
340
- if (!Subs)
341
- return "RSS 数据库尚未就绪";
342
- const { adapterName, channelType, channelId } = extractChannelInfo(message);
343
- const rows = await Subs.select().where({
344
- adapter_name: adapterName,
345
- channel_type: channelType,
346
- channel_id: channelId,
347
- });
348
- if (rows.length === 0)
349
- return "当前会话没有订阅任何 RSS 源\n使用 rss-add <URL> 添加订阅";
350
- const lines = rows.map((r, i) => {
351
- const title = r.feed_title || "(未知标题)";
352
- return `${i + 1}. ${title}\n ${r.url}`;
353
- });
354
- return `当前订阅 (${rows.length}/${config.maxPerGroup}):\n${lines.join("\n")}`;
355
- }));
356
- // ─── 命令:rss-check ─────────────────────────────────────────────────────────
357
- addCommand(new MessageCommand("rss-check [url:text]")
358
- .desc("检查更新", "手动触发检查 RSS 更新,可指定某个源")
359
- .usage("rss-check [URL]")
360
- .action(async (message, result) => {
361
- const Subs = getSubs();
362
- const Seen = getSeen();
363
- if (!Subs || !Seen)
364
- return "RSS 数据库尚未就绪";
365
- const targetUrl = result.params.url?.trim();
366
- const { adapterName, channelType, channelId } = extractChannelInfo(message);
367
- let subs;
368
- if (targetUrl) {
369
- subs = await Subs.select().where({
370
- url: targetUrl,
371
- adapter_name: adapterName,
372
- channel_type: channelType,
373
- channel_id: channelId,
374
- });
375
- if (subs.length === 0)
376
- return "当前会话未订阅该源";
377
- }
378
- else {
379
- subs = await Subs.select().where({
380
- adapter_name: adapterName,
381
- channel_type: channelType,
382
- channel_id: channelId,
383
- });
384
- if (subs.length === 0)
385
- return "当前会话没有任何订阅";
386
- }
387
- const urlSet = new Set(subs.map((s) => s.url));
388
- let totalNew = 0;
389
- for (const url of urlSet) {
390
- try {
391
- const { title, items } = await fetchFeed(url);
392
- const seenRows = await Seen.select().where({ feed_url: url });
393
- const seenGuids = new Set(seenRows.map((r) => r.item_guid));
394
- const newItems = items.filter((item) => !seenGuids.has(item.guid));
395
- if (newItems.length > 0) {
396
- for (const item of newItems) {
397
- await Seen.insert({ feed_url: url, item_guid: item.guid, item_title: item.title, seen_at: ts() });
398
- }
399
- totalNew += newItems.length;
400
- const msg = formatItems(title, newItems);
401
- await pushToChannel(adapterName, subs[0].bot_id, channelType, channelId, msg);
402
- }
403
- }
404
- catch (e) {
405
- await message.$reply(`检查 ${url} 失败: ${e.message}`);
406
- }
407
- }
408
- if (totalNew === 0)
409
- return `已检查 ${urlSet.size} 个源,没有新内容`;
410
- return "";
411
- }));
412
- // ─── 命令:rss-preview ───────────────────────────────────────────────────────
413
- addCommand(new MessageCommand("rss-preview <url:text>")
414
- .desc("预览 RSS", "预览一个 RSS 源的最新内容(不订阅)")
415
- .usage("rss-preview <URL>")
416
- .examples("rss-preview https://sspai.com/feed")
417
- .action(async (_message, result) => {
418
- const url = result.params.url?.trim();
419
- if (!url)
420
- return "请提供 RSS 源地址";
421
- if (!/^https?:\/\//i.test(url))
422
- return "请提供有效的 HTTP/HTTPS 地址";
423
- try {
424
- const { title, items } = await fetchFeed(url);
425
- if (items.length === 0)
426
- return `${title}: 暂无内容`;
427
- const lines = [`${title} (共 ${items.length} 条)`];
428
- for (const item of items.slice(0, 5)) {
429
- lines.push("");
430
- lines.push(`${item.title}`);
431
- if (item.date)
432
- lines.push(` ${new Date(item.date).toLocaleString("zh-CN")}`);
433
- if (item.link)
434
- lines.push(` ${item.link}`);
435
- }
436
- if (items.length > 5)
437
- lines.push(`\n...还有 ${items.length - 5} 条`);
438
- return lines.join("\n");
439
- }
440
- catch (e) {
441
- return `解析失败: ${e.message}\n请确认是有效的 RSS/Atom 地址`;
442
- }
443
- }));
444
- // ─── AI 工具 ─────────────────────────────────────────────────────────────────
445
- plugin.addTool(new ZhinTool("rss_list_subscriptions")
446
- .desc("查询当前所有 RSS 订阅")
447
- .execute(async () => {
448
- const Subs = getSubs();
449
- if (!Subs)
450
- return "RSS 数据库尚未就绪";
451
- const all = await Subs.select();
452
- if (all.length === 0)
453
- return "暂无任何 RSS 订阅";
454
- const grouped = new Map();
455
- for (const sub of all) {
456
- const key = `${sub.channel_type}:${sub.channel_id}`;
457
- const list = grouped.get(key) || [];
458
- list.push(sub);
459
- grouped.set(key, list);
460
- }
461
- const lines = [];
462
- for (const [channel, subs] of grouped) {
463
- lines.push(`[${channel}]`);
464
- for (const s of subs) {
465
- lines.push(` - ${s.feed_title || s.url}`);
466
- }
467
- }
468
- return `RSS 订阅总览 (${all.length} 条):\n${lines.join("\n")}`;
469
- })
470
- .toTool());
471
- plugin.addTool(new ZhinTool("rss_preview_feed")
472
- .desc("预览一个 RSS 源的最新内容")
473
- .param("url", { type: "string", description: "RSS/Atom 源地址" })
474
- .execute(async (args) => {
475
- const url = args.url;
476
- if (!url)
477
- return "请提供 RSS 源 URL";
478
- try {
479
- const { title, items } = await fetchFeed(url);
480
- if (items.length === 0)
481
- return `${title}: 无内容`;
482
- return items
483
- .slice(0, 5)
484
- .map((item, i) => `${i + 1}. ${item.title}\n ${item.link}`)
485
- .join("\n");
486
- }
487
- catch (e) {
488
- return `解析失败: ${e.message}`;
489
- }
490
- })
491
- .toTool());
492
- logger.info(formatCompact({ op: "load", poll: config.pollCron, max_per_group: config.maxPerGroup }));
1
+ export { DEFAULT_RSS_CONFIG, fetchFeed, formatFeedPreview, resolveRssConfig, stripHtml, } from './feed.js';
2
+ export { getRssDb, getRssSeen, getRssSubs, provideRssDb, setRssDb, ensureRssMemoryDb, resetRssDb, } from './db-store.js';
3
+ export { extractChannelInfo, SMOKE_CHANNEL } from './channel.js';
4
+ export { checkSubscriptions, pollAllFeeds, formatNewItems, setRssOutboundPush } from './poll.js';
493
5
  //# sourceMappingURL=index.js.map
package/lib/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,kBAAkB,EAClB,SAAS,EACT,iBAAiB,EACjB,gBAAgB,EAChB,SAAS,GACV,MAAM,WAAW,CAAC;AAEnB,OAAO,EACL,QAAQ,EACR,UAAU,EACV,UAAU,EACV,YAAY,EACZ,QAAQ,EACR,iBAAiB,EACjB,UAAU,GACX,MAAM,eAAe,CAAC;AACvB,OAAO,EAAE,kBAAkB,EAAE,aAAa,EAAE,MAAM,cAAc,CAAC;AACjE,OAAO,EAAE,kBAAkB,EAAE,YAAY,EAAE,cAAc,EAAE,kBAAkB,EAAE,MAAM,WAAW,CAAC"}