koishi-plugin-yuque
Version:
用于Koishi的语雀消息通知插件
161 lines (151 loc) • 5.83 kB
JavaScript
;
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;