koishi-plugin-dailynews
Version:
定时发送每日新闻的 Koishi 插件,使用 60s API 获取新闻内容
152 lines (147 loc) • 5.58 kB
JavaScript
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
});