UNPKG

koishi-plugin-yuque

Version:

用于Koishi的语雀消息通知插件

161 lines (151 loc) 5.83 kB
'use strict'; Object.defineProperty(exports, '__esModule', { value: true }); var koishi = require('koishi'); var express = require('express'); var axios = require('axios'); function _interopDefaultLegacy (e) { return e && typeof e === 'object' && 'default' in e ? e : { 'default': e }; } var express__default = /*#__PURE__*/_interopDefaultLegacy(express); var axios__default = /*#__PURE__*/_interopDefaultLegacy(axios); var Type; (function (Type) { Type["UPDATE_DOC"] = "\u6587\u6863\u66F4\u65B0"; Type["CREATE_DOC"] = "\u6587\u6863\u53D1\u5E03"; Type["DELETE_DOC"] = "\u6587\u6863\u5220\u9664"; Type["CREATE_COMMENT"] = "\u65B0\u589E\u8BC4\u8BBA"; Type["UPDATE_COMMENT"] = "\u66F4\u65B0\u8BC4\u8BBA"; Type["NEW_REVIEW"] = "\u65B0\u5EFA\u8BC4\u5BA1"; Type["COMPLETE_REVIEW"] = "\u5B8C\u6210\u8BC4\u5BA1"; Type["CANCEL_REVIEW"] = "\u53D6\u6D88\u8BC4\u5BA1"; })(Type || (Type = {})); async function getUserName(id) { const res = await axios__default["default"].get(`https://www.yuque.com/api/v2/users/${id}`, { headers: { 'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/100.0.4896.75 Safari/537.36', 'X-Auth-Token': 'ssHgJoZIlE770Eilv7kvf5DO6pxbUHWdBbrk98PZ', } }); return res.data.data.name; } async function expr(ctx, log, conf) { const app = express__default["default"](); app.use(express__default["default"].json()); app.use(express__default["default"].urlencoded({ extended: true })); app.post('/', async (req, res) => { const dbList = await ctx.database.get('channel', { yuque: 1 }); const clist = []; for (const chn of dbList) { const channel = `${chn.platform}:${chn.id}`; clist.push(channel); } clist.push(...conf.list); const set = new Set(clist); const list = Array.from(set); const title = req.body.data.title; const book = req.body.data.book.name; let user; if (req.body.data.user.type === 'Group') { user = await getUserName(req.body.data.user_id); } else { user = req.body.data.user.name; } const path = req.body.data.path; const typeRaw = req.body.data.action_type; let type; switch (typeRaw) { case 'update': { type = Type.UPDATE_DOC; break; } case 'publish': { type = Type.CREATE_DOC; break; } case 'delete': { type = Type.DELETE_DOC; break; } case 'comment_create': { type = Type.CREATE_COMMENT; break; } case 'comment_update': { type = Type.UPDATE_COMMENT; break; } case 'new_review': { type = Type.NEW_REVIEW; break; } case 'complete_review': { type = Type.COMPLETE_REVIEW; break; } case 'cancel_review': { type = Type.CANCEL_REVIEW; break; } } const txt = `【${type}】《${title}》\n\n知识库:${book}\n操作人:${user}\n地址:https://www.yuque.com/${path}\n——————————`; await ctx.broadcast(list, txt); res.end('<h1>Copy That</h1>'); }); app.listen(conf.port, () => { log.info(`Start Listening on port ${conf.port}`); }); } async function cmd(ctx, log, conf) { const cmd = ctx.command('yuquepush', '语雀推送相关功能', { authority: 3 }); cmd.alias('yqps'); cmd.subcommand('.is', '查看该频道是否为语雀推送频道', { authority: 3 }) .action(async ({ session }) => { const rn = await ctx.database.getChannel(session.platform, session.channelId); if (rn.yuque == 1 || conf.list.includes(`${session.platform}:${session.channelId}`)) return '本频道是语雀推送频道'; return '本频道不是语雀推送频道'; }); cmd.subcommand('.add', '添加语雀推送频道', { authority: 3 }) .action(async ({ session }) => { try { await ctx.database.upsert('channel', [ { platform: session.platform, id: session.channelId, yuque: 1 } ]); return '设置成功!'; } catch (e) { log.error(e); return '出现错误!详情请查看日志'; } }); cmd.subcommand('.del', '删除语雀推送频道', { authority: 3 }) .action(async ({ session }) => { try { await ctx.database.upsert('channel', [ { platform: session.platform, id: session.channelId, yuque: 0 } ]); return '设置成功!'; } catch (e) { log.error(e); return '出现错误!详情请查看日志'; } }); } const using = ['database']; const name = 'yuque'; const Config = koishi.Schema.object({ port: koishi.Schema.number().default(10080).description('WebHook监听端口'), list: koishi.Schema.array(koishi.Schema.string()).description('配置转发的频道列表'), }); async function apply(ctx, conf = { port: 10080, list: [] }) { ctx.model.extend('channel', { yuque: 'integer', }); const log = ctx.logger('yuque'); await expr(ctx, log, conf); await cmd(ctx, log, conf); } exports.Config = Config; exports.apply = apply; exports.name = name; exports.using = using;