UNPKG

koishi-plugin-dailynews

Version:

定时发送每日新闻的 Koishi 插件,使用 60s API 获取新闻内容

152 lines (147 loc) 5.58 kB
var __defProp = Object.defineProperty; var __getOwnPropDesc = Object.getOwnPropertyDescriptor; var __getOwnPropNames = Object.getOwnPropertyNames; var __hasOwnProp = Object.prototype.hasOwnProperty; var __name = (target, value) => __defProp(target, "name", { value, configurable: true }); var __export = (target, all) => { for (var name2 in all) __defProp(target, name2, { get: all[name2], enumerable: true }); }; var __copyProps = (to, from, except, desc) => { if (from && typeof from === "object" || typeof from === "function") { for (let key of __getOwnPropNames(from)) if (!__hasOwnProp.call(to, key) && key !== except) __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable }); } return to; }; var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod); // src/index.ts var src_exports = {}; __export(src_exports, { Config: () => Config, apply: () => apply, inject: () => inject, name: () => name }); module.exports = __toCommonJS(src_exports); var import_koishi3 = require("koishi"); // src/assetsUtil.ts var import_koishi = require("koishi"); var DEFAULT_NEWS_API_URL = "https://60api.09cdn.xyz/v2/60s"; var currentConfig; var httpClient; var logger; function initializeAssets(ctx, config) { currentConfig = config; httpClient = ctx.http; logger = ctx.logger("dailynewsUtil"); logger.level = currentConfig.debugModel ? import_koishi.Logger.DEBUG : import_koishi.Logger.INFO; } __name(initializeAssets, "initializeAssets"); async function fetchNewsImageUrl() { const url = currentConfig?.apiUrl || DEFAULT_NEWS_API_URL; try { const response = await httpClient.get(url, { responseType: "json" }); logger.debug("fetchNewsImageUrl response:", response); const data = response && (response.data || response); if (!data) return ""; const payload = data.data || data; if (!payload) return ""; const imageUrl = payload.image; return typeof imageUrl === "string" ? imageUrl : ""; } catch (error) { logger.error(error); return ""; } } __name(fetchNewsImageUrl, "fetchNewsImageUrl"); // src/config.ts var import_koishi2 = require("koishi"); var name = "dailynews"; var inject = { required: ["cron", "database"], optional: [] }; var Config = import_koishi2.Schema.intersect([ import_koishi2.Schema.object({ apiUrl: import_koishi2.Schema.string().default("https://60s.viki.moe/v2/60s").description("60s API 地址,参考: https://docs.60s-api.viki.moe/") }).description("API接口"), import_koishi2.Schema.object({ min: import_koishi2.Schema.number().default(50).max(59).min(-1).description("每小时的第几分钟(0-59)"), hour: import_koishi2.Schema.number().default(7).max(23).min(-1).description("每天的第几小时(0-23)"), dayOfMonth: import_koishi2.Schema.number().default(-1).max(31).min(-1).description("每个月的第几天(0-31)"), weekDay: import_koishi2.Schema.number().default(-1).max(7).min(-1).description("周几(1-7)") }).description("定时设置"), import_koishi2.Schema.object({ broad: import_koishi2.Schema.boolean().default(true).description("在所有群聊广播,关闭后可指定群配置") }).description("广播设置"), import_koishi2.Schema.union([ import_koishi2.Schema.object({ broad: import_koishi2.Schema.const(false).required(), broadArray: import_koishi2.Schema.array( import_koishi2.Schema.object({ adapter: import_koishi2.Schema.string().default("onebot").description("适配器名"), botId: import_koishi2.Schema.string().default("552487878").description("机器人账号"), groupId: import_koishi2.Schema.string().default("1145141919").description("群组号") }) ).role("table") }), import_koishi2.Schema.object({}) ]), import_koishi2.Schema.object({ debugModel: import_koishi2.Schema.boolean().default(false).description("开启后会输出详细日志") }).description("调试模式") ]); // src/index.ts function apply(ctx, config) { initializeAssets(ctx, config); const cronExpression = `${formatCronField(config.min)} ${formatCronField( config.hour )} ${formatCronField(config.dayOfMonth)} * ${formatCronField( config.weekDay )}`; ctx.command("dailynews", "手动触发 dailynews 发送资讯").action(buildImageMessage); try { ctx.cron(cronExpression, async () => { ctx.emit("dailynews/trigger"); }); } catch (error) { ctx.logger.error(error); } ctx.on("dailynews/trigger", handleMorningEvent); async function buildImageMessage() { const imageUrl = await fetchNewsImageUrl(); if (!imageUrl) return; return (0, import_koishi3.h)("img", { src: imageUrl }); } __name(buildImageMessage, "buildImageMessage"); async function handleMorningEvent() { const message = await buildImageMessage(); if (!message) return; if (config.broad) { await ctx.broadcast(message); } else { for (const target of config.broadArray || []) { ctx.bots[`${target.adapter}:${target.botId}`].sendMessage( `${target.groupId}`, message ); ctx.sleep(2e3); } } } __name(handleMorningEvent, "handleMorningEvent"); } __name(apply, "apply"); function formatCronField(value) { return value === -1 ? "*" : (value ?? -1).toString(); } __name(formatCronField, "formatCronField"); // Annotate the CommonJS export names for ESM import in node: 0 && (module.exports = { Config, apply, inject, name });