From 324bf5b286ff67668cdd63ff596b0531ee6ae93d Mon Sep 17 00:00:00 2001 From: yeyang <746659424@qq.com> Date: Sat, 28 Jan 2023 20:01:18 +0800 Subject: [PATCH] =?UTF-8?q?eslint=E4=BB=A3=E7=A0=81=E9=A3=8E=E6=A0=BC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- apps/admin.js | 82 +- apps/assistant.js | 522 ++++++------ apps/fun.js | 345 ++++---- apps/gp_admin.js | 1399 ++++++++++++++++--------------- apps/groupverify.js | 238 +++--- apps/handle.js | 759 +++++++++-------- apps/help.js | 23 +- apps/nga.js | 37 +- apps/notice_friend.js | 194 +++-- apps/notice_group.js | 433 +++++----- apps/notice_message.js | 305 ++++--- apps/notice_request.js | 130 ++- apps/pixiv.js | 363 ++++---- apps/search.js | 75 +- apps/set.js | 585 +++++++------ apps/setu.js | 70 +- apps/state.js | 97 ++- apps/update.js | 248 +++--- components/Config.js | 81 +- components/Data.js | 36 +- components/Version.js | 27 +- components/index.js | 8 +- config/system/gpadmin_system.js | 308 +++---- config/system/help_system.js | 308 +++---- model/CPU.js | 177 ++-- model/CronValidate.js | 789 +++++++++-------- model/GroupAdmin.js | 429 +++++----- model/Interface.js | 285 ++++--- model/Pixiv.js | 785 +++++++++-------- model/QQInterface.js | 672 +++++++-------- model/common.js | 515 ++++++------ model/index.js | 46 +- model/puppeteer.js | 263 +++--- model/setu.js | 481 +++++------ 34 files changed, 5511 insertions(+), 5604 deletions(-) diff --git a/apps/admin.js b/apps/admin.js index c9bddde..3993749 100644 --- a/apps/admin.js +++ b/apps/admin.js @@ -3,46 +3,50 @@ import { update } from '../../other/update.js' import { Version, Plugin_Name } from '../components/index.js' import { puppeteer } from '../model/index.js' export class admin extends plugin { - constructor() { - super({ - name: "椰奶版本信息", - event: "message", - priority: 400, - rule: [ - { - reg: '^#?椰奶(插件)?版本$', - fnc: 'plugin_version', - }, - { - reg: '^#?椰奶(插件)?更新日志$', - fnc: 'update_log', - }, - ], - }); - this.key = "yenai:restart"; - } - - async plugin_version() { - return versionInfo(this.e); - } - - async update_log() { - let Update_Plugin = new update(); - Update_Plugin.e = this.e; - Update_Plugin.reply = this.reply; - - if (Update_Plugin.getPlugin(Plugin_Name)) { - this.e.reply(await Update_Plugin.getLog(Plugin_Name)); + constructor () { + super({ + name: '椰奶版本信息', + event: 'message', + priority: 400, + rule: [ + { + reg: '^#?椰奶(插件)?版本$', + fnc: 'plugin_version' + }, + { + reg: '^#?椰奶(插件)?更新日志$', + fnc: 'update_log' } - return true; + ] + }) + this.key = 'yenai:restart' + } + + async plugin_version () { + return versionInfo(this.e) + } + + async update_log () { + // eslint-disable-next-line new-cap + let Update_Plugin = new update() + Update_Plugin.e = this.e + Update_Plugin.reply = this.reply + + if (Update_Plugin.getPlugin(Plugin_Name)) { + this.e.reply(await Update_Plugin.getLog(Plugin_Name)) } + return true + } } - -async function versionInfo(e) { - return await puppeteer.render('help/version-info', { - currentVersion: Version.ver, - changelogs: Version.logs, - elem: 'cryo' - }, { e, scale: 2 }) -} \ No newline at end of file +async function versionInfo (e) { + return await puppeteer.render( + 'help/version-info', + { + currentVersion: Version.ver, + changelogs: Version.logs, + elem: 'cryo' + }, + { e, scale: 2 } + ) +} diff --git a/apps/assistant.js b/apps/assistant.js index 758de96..9e38e9f 100644 --- a/apps/assistant.js +++ b/apps/assistant.js @@ -1,23 +1,23 @@ -import plugin from '../../../lib/plugins/plugin.js'; -import { segment } from "oicq"; -import { common, QQInterface } from '../model/index.js'; +import plugin from '../../../lib/plugins/plugin.js' +import { segment } from 'oicq' +import { common, QQInterface } from '../model/index.js' import lodash from 'lodash' import moment from 'moment' -/**API请求错误文案 */ -const API_ERROR = "❎ 出错辣,请稍后重试" +/** API请求错误文案 */ +const API_ERROR = '❎ 出错辣,请稍后重试' -//命令正则 -let FriendsReg = new RegExp("#发好友\\s?(\\d+)\\s?(.*)") -let GroupmsgReg = new RegExp("#发群聊\\s?(\\d+)\\s?(.*)") -let GrouplistmsgReg = new RegExp("#发群列表\\s?(\\d+(,\\d+){0,})\\s?(.*)") -let friend_typeReg = new RegExp('^#更改好友申请方式([0123])((.*)\\s(.*))?$') +// 命令正则 +let FriendsReg = /^#发好友\s?(\d+)\s?(.*)$/ +let GroupMsgReg = /^#发群聊\s?(\d+)\s?(.*)$/ +let GroupListMsgReg = /^#发群列表\s?(\d+(,\d+){0,})\s?(.*)$/ +let friendTypeReg = /^#更改好友申请方式([0123])((.*)\s(.*))?$/ -//全局变量 -let Qzonedetermine = false; -let groupPhotoid = ''; -export class example extends plugin { - constructor() { +// 全局变量 +let Qzonedetermine = false +let groupPhotoid = '' +export class Assistant extends plugin { + constructor () { super({ name: '椰奶小助手', event: 'message', @@ -44,17 +44,17 @@ export class example extends plugin { permission: 'master' }, { - reg: FriendsReg,//发好友 + reg: FriendsReg, // 发好友 fnc: 'Friends', permission: 'master' }, { - reg: GroupmsgReg,//发群聊 + reg: GroupMsgReg, // 发群聊 fnc: 'Groupmsg', permission: 'master' }, { - reg: GrouplistmsgReg,//发群列表 + reg: GroupListMsgReg, // 发群列表 fnc: 'Grouplistmsg', permission: 'master' }, @@ -108,11 +108,11 @@ export class example extends plugin { }, { reg: '^#改群头像.*$', - fnc: 'GroupPhoto', + fnc: 'GroupPhoto' }, { reg: '^#改群昵称.*$', - fnc: 'Groupname', + fnc: 'Groupname' }, { reg: '^#获取(群|好友)列表$', @@ -134,240 +134,237 @@ export class example extends plugin { permission: 'master' }, { - reg: friend_typeReg,//更改好友申请方式 + reg: friendTypeReg, // 更改好友申请方式 fnc: 'friend_type', permission: 'master' - }, + } ] }) - } - /**改头像*/ - async Photo(e) { + + /** 改头像 */ + async Photo (e) { if (!e.img) { this.setContext('Photos') - e.reply("✅ 请发送图片"); - return; + e.reply('✅ 请发送图片') + return } await Bot.setAvatar(e.img[0]) - .then(() => { e.reply("✅ 头像修改成功") }) + .then(() => { e.reply('✅ 头像修改成功') }) .catch((err) => { - e.reply("❎ 头像修改失败"); - console.log(err); + e.reply('❎ 头像修改失败') + console.log(err) }) - } - async Photos() { + + async Photos () { let img = this.e.img if (/取消/.test(this.e.msg)) { this.finish('Photos') await this.reply('✅ 已取消') - return; + return } if (!img) { this.setContext('Photos') await this.reply('❎ 请发送图片或取消') - return; + return } await Bot.setAvatar(img[0]) - .then(() => this.e.reply("✅ 头像修改成功")) + .then(() => this.e.reply('✅ 头像修改成功')) .catch((err) => { - this.e.reply("❎ 头像修改失败"); + this.e.reply('❎ 头像修改失败') console.log(err) }) this.finish('Photos') } - /** 改昵称*/ - async Myname(e) { - let name = e.msg.replace(/#|改昵称/g, "").trim() + /** 改昵称 */ + async Myname (e) { + let name = e.msg.replace(/#|改昵称/g, '').trim() await Bot.setNickname(name) - .then(() => e.reply("✅ 昵称修改成功")) + .then(() => e.reply('✅ 昵称修改成功')) .catch((err) => { - e.reply("❎ 昵称修改失败"); - console.log(err); + e.reply('❎ 昵称修改失败') + console.log(err) }) } /** 改群名片 */ - async MyGroupname(e) { - let group = ''; - let card = ''; + async MyGroupname (e) { + let group = '' + let card = '' if (e.isPrivate) { - let msg = e.msg.split(" ") + let msg = e.msg.split(' ') - group = msg[1].match(/[1-9]\d*/g); + group = msg[1].match(/[1-9]\d*/g) - card = msg.slice(2).join(" "); + card = msg.slice(2).join(' ') - if (!group) return e.reply("❎ 群号不能为空"); - - if (!Bot.gl.get(Number(msg[1]))) return e.reply("❎ 群聊列表查无此群"); + if (!group) return e.reply('❎ 群号不能为空') + if (!Bot.gl.get(Number(msg[1]))) return e.reply('❎ 群聊列表查无此群') } else { - group = e.group_id; - card = e.msg.replace(/#|改群名片/g, "").trim() + group = e.group_id + card = e.msg.replace(/#|改群名片/g, '').trim() } - if (!card) return e.reply("❎ 名片不能为空"); + if (!card) return e.reply('❎ 名片不能为空') Bot.pickGroup(group).setCard(Bot.uin, card) - .then(() => e.reply("✅ 群名片修改成功")) + .then(() => e.reply('✅ 群名片修改成功')) .catch(err => { - e.reply("✅ 群名片修改失败") - console.log(err); + e.reply('✅ 群名片修改失败') + console.log(err) }) } - /**改群头像 */ - async GroupPhoto(e) { + /** 改群头像 */ + async GroupPhoto (e) { if (e.isPrivate) { - if (!e.isMaster) return logger.mark(`${e.logFnc}不为主人`); - groupPhotoid = e.msg.replace(/#|改群头像/g, "").trim() + if (!e.isMaster) return logger.mark(`${e.logFnc}不为主人`) + groupPhotoid = e.msg.replace(/#|改群头像/g, '').trim() - if (!groupPhotoid) return e.reply("❎ 群号不能为空"); + if (!groupPhotoid) return e.reply('❎ 群号不能为空') - if (!(/^\d+$/.test(groupPhotoid))) return e.reply("❎ 您的群号不合法"); + if (!(/^\d+$/.test(groupPhotoid))) return e.reply('❎ 您的群号不合法') - if (!Bot.gl.get(Number(groupPhotoid))) return e.reply("❎ 群聊列表查无此群"); + if (!Bot.gl.get(Number(groupPhotoid))) return e.reply('❎ 群聊列表查无此群') } else { if (!e.member.is_admin && !e.member.is_owner && !e.isMaster) return logger.mark(`${e.logFnc}该群员权限不足`) groupPhotoid = e.group_id } - groupPhotoid = Number(groupPhotoid); + groupPhotoid = Number(groupPhotoid) if (Bot.pickGroup(groupPhotoid).is_admin || Bot.pickGroup(groupPhotoid).is_owner) { if (!e.img) { this.setContext('picture') - e.reply("✅ 请发送图片"); - return; + e.reply('✅ 请发送图片') + return } Bot.pickGroup(groupPhotoid).setAvatar(e.img[0]) - .then(() => e.reply("✅ 群头像修改成功")) + .then(() => e.reply('✅ 群头像修改成功')) .catch((err) => { - e.reply("✅ 群头像修改失败") - console.log(err); + e.reply('✅ 群头像修改失败') + console.log(err) }) } else { - return e.reply("❎ 没有管理员人家做不到啦~>_<"); + return e.reply('❎ 没有管理员人家做不到啦~>_<') } } - picture() { + picture () { let img = this.e.img if (/取消/.test(this.e.msg)) { this.finish('picture') this.e.reply('✅ 已取消') - return; + return } if (!img) { this.setContext('picture') this.e.reply('❎ 请发送图片或取消') - return; + return } Bot.pickGroup(groupPhotoid).setAvatar(this.e.img[0]) - .then(() => this.e.reply("✅ 群头像修改成功")) + .then(() => this.e.reply('✅ 群头像修改成功')) .catch((err) => { - this.e.reply("✅ 群头像修改失败") - console.log(err); + this.e.reply('✅ 群头像修改失败') + console.log(err) }) this.finish('picture') } - /**改群昵称 */ - async Groupname(e) { - let group = ''; - let card = ''; + /** 改群昵称 */ + async Groupname (e) { + let group = '' + let card = '' if (e.isPrivate) { - if (!e.isMaster) return; + if (!e.isMaster) return - let msg = e.msg.split(" ") - group = msg[1].match(/[1-9]\d*/g); - card = msg.slice(2).join(" "); + let msg = e.msg.split(' ') + group = msg[1].match(/[1-9]\d*/g) + card = msg.slice(2).join(' ') - if (!group) return e.reply("❎ 群号不能为空"); - if (!Bot.gl.get(Number(msg[1]))) return e.reply("❎ 群聊列表查无此群"); + if (!group) return e.reply('❎ 群号不能为空') + if (!Bot.gl.get(Number(msg[1]))) return e.reply('❎ 群聊列表查无此群') } else { if (!e.member.is_admin && !e.member.is_owner && !e.isMaster) return logger.mark(`${e.logFnc}该群员权限不足`) group = e.group_id - card = e.msg.replace(/#|改群昵称/g, "").trim() + card = e.msg.replace(/#|改群昵称/g, '').trim() } - if (!card) return e.reply("❎ 昵称不能为空"); + if (!card) return e.reply('❎ 昵称不能为空') - group = Number(group); + group = Number(group) if (Bot.pickGroup(group).is_admin || Bot.pickGroup(group).is_owner) { Bot.pickGroup(group).setName(card) - .then(() => e.reply("✅ 群昵称修改成功")) + .then(() => e.reply('✅ 群昵称修改成功')) .catch(err => { - e.reply("✅ 群昵称修改失败") - console.log(err); + e.reply('✅ 群昵称修改失败') + console.log(err) }) } else { - return e.reply("❎ 没有管理员人家做不到啦~>_<"); + return e.reply('❎ 没有管理员人家做不到啦~>_<') } } - /** 改签名*/ - async Sign(e) { - - let signs = e.msg.replace(/#|改签名/g, "").trim() + /** 改签名 */ + async Sign (e) { + let signs = e.msg.replace(/#|改签名/g, '').trim() await Bot.setSignature(signs) - .then(() => e.reply("✅ 签名修改成功")) + .then(() => e.reply('✅ 签名修改成功')) .catch((err) => { - e.reply("❎ 签名修改失败"); + e.reply('❎ 签名修改失败') console.log(err) }) } - /** 改状态*/ - async State(e) { - let signs = e.msg.replace(/#|改状态/g, "").trim() + /** 改状态 */ + async State (e) { + let signs = e.msg.replace(/#|改状态/g, '').trim() - if (!signs) return e.reply("❎ 状态不为空,可选值:我在线上,离开,隐身,忙碌,Q我吧,请勿打扰"); + if (!signs) return e.reply('❎ 状态不为空,可选值:我在线上,离开,隐身,忙碌,Q我吧,请勿打扰') - let status = common.status, statusMirr = lodash.invert(status) - if (!(signs in statusMirr)) return e.reply("❎ 可选值:我在线上,离开,隐身,忙碌,Q我吧,请勿打扰") + let status = common.status; let statusMirr = lodash.invert(status) + if (!(signs in statusMirr)) return e.reply('❎ 可选值:我在线上,离开,隐身,忙碌,Q我吧,请勿打扰') await Bot.setOnlineStatus(statusMirr[signs]) .then(() => e.reply(`✅ 现在的在线状态为【${status[Bot.status]}】`)) .catch(err => { - e.reply("❎ 在线状态修改失败"); - console.log(err); + e.reply('❎ 在线状态修改失败') + console.log(err) }) - return true; + return true } - /** 发好友*/ - async Friends(e) { + /** 发好友 */ + async Friends (e) { let regRet = FriendsReg.exec(e.msg) let qq = regRet[1] e.message[0].text = regRet[2] - if (!/^\d+$/.test(qq)) return e.reply("❎ QQ号不正确,人家做不到的啦>_<~"); + if (!/^\d+$/.test(qq)) return e.reply('❎ QQ号不正确,人家做不到的啦>_<~') - if (!Bot.fl.get(Number(qq))) return e.reply("❎ 好友列表查无此人"); + if (!Bot.fl.get(Number(qq))) return e.reply('❎ 好友列表查无此人') if (!e.message[0].text) e.message.shift() - if (e.message.length === 0) return e.reply("❎ 消息不能为空"); + if (e.message.length === 0) return e.reply('❎ 消息不能为空') await Bot.pickFriend(qq).sendMsg(e.message) - .then(() => e.reply("✅ 私聊消息已送达")) + .then(() => e.reply('✅ 私聊消息已送达')) .catch(err => e.reply(`❎ 发送失败\n错误信息为:${err.message}`)) - } - /** 发群聊*/ - async Groupmsg(e) { - let regRet = GroupmsgReg.exec(e.msg) + /** 发群聊 */ + async Groupmsg (e) { + let regRet = GroupMsgReg.exec(e.msg) let gpid = regRet[1] @@ -375,136 +372,133 @@ export class example extends plugin { if (!e.message[0].text) e.message.shift() - if (e.message.length === 0) return e.reply("❎ 消息不能为空"); + if (e.message.length === 0) return e.reply('❎ 消息不能为空') - if (!/^\d+$/.test(gpid)) return e.reply("❎ 您输入的群号不合法"); + if (!/^\d+$/.test(gpid)) return e.reply('❎ 您输入的群号不合法') - if (!Bot.gl.get(Number(gpid))) return e.reply("❎ 群聊列表查无此群"); + if (!Bot.gl.get(Number(gpid))) return e.reply('❎ 群聊列表查无此群') await Bot.pickGroup(gpid).sendMsg(e.message) - .then(() => e.reply("✅ 群聊消息已送达")) + .then(() => e.reply('✅ 群聊消息已送达')) .catch((err) => e.reply(`❎ 发送失败\n错误信息为:${err.message}`)) } - //发送群列表 - async Grouplistmsg(e) { - //获取参数 - let regRet = GrouplistmsgReg.exec(e.msg) + // 发送群列表 + async Grouplistmsg (e) { + // 获取参数 + let regRet = GroupListMsgReg.exec(e.msg) let gpid = regRet[1] e.message[0].text = regRet[3] if (!e.message[0].text) e.message.shift() - if (e.message.length === 0) return e.reply("❎ 消息不能为空"); + if (e.message.length === 0) return e.reply('❎ 消息不能为空') - let groupidList = []; - let sendList = []; + let groupidList = [] + let sendList = [] - //获取群列表 - let listMap = Array.from(Bot.gl.values()); + // 获取群列表 + let listMap = Array.from(Bot.gl.values()) listMap.forEach((item) => { - groupidList.push(item.group_id); + groupidList.push(item.group_id) }) - let groupids = gpid.split(","); + let groupids = gpid.split(',') - if (!groupids.every(item => item <= groupidList.length)) return e.reply("❎ 序号超过合法值!!!") + if (!groupids.every(item => item <= groupidList.length)) return e.reply('❎ 序号超过合法值!!!') groupids.forEach((item) => { - sendList.push(groupidList[Number(item) - 1]); + sendList.push(groupidList[Number(item) - 1]) }) - - if (sendList.length > 3) return e.reply("❎ 不能同时发太多群聊,号寄概率增加!!!") + if (sendList.length > 3) return e.reply('❎ 不能同时发太多群聊,号寄概率增加!!!') if (sendList.length === 1) { await Bot.pickGroup(sendList[0]).sendMsg(e.message) - .then(() => e.reply("✅ " + sendList[0] + " 群聊消息已送达")) + .then(() => e.reply('✅ ' + sendList[0] + ' 群聊消息已送达')) .catch((err) => e.reply(`❎ ${sendList[0]} 发送失败\n错误信息为:${err.message}`)) } else { - e.reply("发送多个群聊,将每5秒发送一条消息!") + e.reply('发送多个群聊,将每5秒发送一条消息!') for (let i of sendList) { await Bot.pickGroup(i).sendMsg(e.message) - .then(() => e.reply("✅ " + i + " 群聊消息已送达")) + .then(() => e.reply('✅ ' + i + ' 群聊消息已送达')) .catch((err) => e.reply(`❎ ${i} 发送失败\n错误信息为:${err.message}`)) await common.sleep(5000) } } - return false; - + return false } + /** 退群 */ + async Quit (e) { + let quits = e.msg.replace(/#|退群/g, '').trim() - /**退群 */ - async Quit(e) { - let quits = e.msg.replace(/#|退群/g, "").trim() + if (!quits) return e.reply('❎ 群号不能为空') - if (!quits) return e.reply("❎ 群号不能为空"); + if (!/^\d+$/.test(quits)) return e.reply('❎ 群号不合法') - if (!/^\d+$/.test(quits)) return e.reply("❎ 群号不合法"); - - if (!Bot.gl.get(Number(quits))) return e.reply("❎ 群聊列表查无此群") + if (!Bot.gl.get(Number(quits))) return e.reply('❎ 群聊列表查无此群') await Bot.pickGroup(quits).quit() - .then(() => e.reply(`✅ 已退出群聊`)) + .then(() => e.reply('✅ 已退出群聊')) .catch((err) => { - e.reply("❎ 退出失败"); + e.reply('❎ 退出失败') console.log(err) }) } - /**删好友 */ - async Deletes(e) { - let quits = e.msg.replace(/#|删好友/g, "").trim() + /** 删好友 */ + async Deletes (e) { + let quits = e.msg.replace(/#|删好友/g, '').trim() if (e.message[1]) { quits = e.message[1].qq } else { quits = quits.match(/[1-9]\d*/g) } - if (!quits) return e.reply("❎ 请输入正确的QQ号") + if (!quits) return e.reply('❎ 请输入正确的QQ号') - if (!Bot.fl.get(Number(quits))) return e.reply("❎ 好友列表查无此人"); + if (!Bot.fl.get(Number(quits))) return e.reply('❎ 好友列表查无此人') await Bot.pickFriend(quits).delete() - .then(() => e.reply(`✅ 已删除好友`)) + .then(() => e.reply('✅ 已删除好友')) .catch((err) => { - e.reply("❎ 删除失败"); - console.log(err); + e.reply('❎ 删除失败') + console.log(err) }) } - /**改性别 */ - async Sex(e) { - let sex = e.msg.replace(/#|改性别/g, "").trim(); + /** 改性别 */ + async Sex (e) { + let sex = e.msg.replace(/#|改性别/g, '').trim() - if (!sex) return e.reply("❎ 性别不能为空 可选值:男,女,无\n(改为无,为无性别)"); + if (!sex) return e.reply('❎ 性别不能为空 可选值:男,女,无\n(改为无,为无性别)') let res = { - "无": 0, - "男": 1, - "女": 2, + 无: 0, + 男: 1, + 女: 2 } - if (!(sex in res)) return e.reply("❎ 可选值:男,女,无(改为无,为无性别)"); + if (!(sex in res)) return e.reply('❎ 可选值:男,女,无(改为无,为无性别)') await Bot.setGender(res[sex]) - .then(() => e.reply(`✅ 已修改性别`)) + .then(() => e.reply('✅ 已修改性别')) .catch((err) => { - e.reply("❎ 修改失败"); - console.log(err); + e.reply('❎ 修改失败') + console.log(err) }) } - /**取直链 */ - async Pictures(e) { + /** 取直链 */ + async Pictures (e) { let img = [] if (e.source) { - let source; + let source if (e.isGroup) { - source = (await e.group.getChatHistory(e.source.seq, 1)).pop(); + source = (await e.group.getChatHistory(e.source.seq, 1)).pop() } else { - source = (await e.friend.getChatHistory(e.source.time, 1)).pop(); + source = (await e.friend.getChatHistory(e.source.time, 1)).pop() } for (let i of source.message) { if (i.type == 'image') { @@ -518,52 +512,53 @@ export class example extends plugin { if (lodash.isEmpty(img)) { this.setContext('imgs') await this.reply('✅ 请发送图片') - return; + return } await e.reply(`✅ 检测到${img.length}张图片`) if (img.length >= 2) { - //大于两张图片以转发消息发送 + // 大于两张图片以转发消息发送 let msg = [] for (let i of img) { - msg.push([segment.image(i), "直链:", i]) + msg.push([segment.image(i), '直链:', i]) } common.getforwardMsg(e, msg) } else { - await e.reply([segment.image(img[0]), "直链:", img[0]]) + await e.reply([segment.image(img[0]), '直链:', img[0]]) } - return true; + return true } - async imgs() { + + async imgs () { let img = this.e.img - if (this.e.msg === "取消") { + if (this.e.msg === '取消') { this.finish('imgs') await this.reply('✅ 已取消') - return; + return } if (!img) { this.setContext('imgs') await this.reply('❎ 请发送图片或取消') - return; + return } await this.e.reply(img[0]) this.finish('imgs') } /** 取Face表情 */ - async Face(e) { - let face = []; + async Face (e) { + let face = [] for (let m of e.message) { - if (m.type === "face") { - let s = false; + if (m.type === 'face') { + let s = false for (let i of face) { if (i.id === m.id) s = true } if (!s) face.push(m) } } - if (face.length === 0) return e.reply("❎ 表情参数不可为空", true); + if (face.length === 0) return e.reply('❎ 表情参数不可为空', true) let res = face.map(function (item) { return [ - `表情:`, + '表情:', item, `\nid:${item.id}`, `\n描述:${item.text}` @@ -577,25 +572,25 @@ export class example extends plugin { } } - /**QQ空间 说说列表*/ - async Qzonelist(e) { - let page = e.msg.replace(/#|获?取说说列表/g, "").trim() + /** QQ空间 说说列表 */ + async Qzonelist (e) { + let page = e.msg.replace(/#|获?取说说列表/g, '').trim() if (!page) { page = 0 } else { page = page - 1 } - //获取说说列表 + // 获取说说列表 let list = await QQInterface.getQzone(page * 5, 5) if (!list) return e.reply(API_ERROR) - if (list.total == 0) return e.reply(`✅ 说说列表为空`) + if (list.total == 0) return e.reply('✅ 说说列表为空') let msg = [ - "✅ 获取成功,说说列表如下:\n", + '✅ 获取成功,说说列表如下:\n', ...list.msglist.map((item, index) => - `${page * 5 + index + 1}.${lodash.truncate(item.content, { "length": 15 })}\n- [${item.secret ? "私密" : "公开"}] | ${moment(item.created_time * 1000).format("MM/DD HH:mm")} | ${item.commentlist?.length || 0}条评论\n` + `${page * 5 + index + 1}.${lodash.truncate(item.content, { length: 15 })}\n- [${item.secret ? '私密' : '公开'}] | ${moment(item.created_time * 1000).format('MM/DD HH:mm')} | ${item.commentlist?.length || 0}条评论\n` ), `页数:[${page + 1}/${Math.ceil(list.total / 5)}]` ] @@ -603,57 +598,57 @@ export class example extends plugin { } /** 删除说说 */ - async Qzonedel(e) { + async Qzonedel (e) { let pos = e.msg.match(/\d+/) - //获取说说列表 + // 获取说说列表 let list = await QQInterface.getQzone(pos - 1, 1) if (!list) return e.reply(API_ERROR) - if (!list.msglist) return e.reply(`❎ 未获取到该说说`) + if (!list.msglist) return e.reply('❎ 未获取到该说说') - //要删除的说说 + // 要删除的说说 let domain = list.msglist[0] - //请求接口 + // 请求接口 let result = await QQInterface.delQzone(domain.tid, domain.t1_source) if (!result) return e.reply(API_ERROR) - //debug + // debug logger.debug(e.logFnc, result) - if (result.subcode != 0) e.reply(`❎ 未知错误` + JSON.parse(result)) - //发送结果 - e.reply(`✅ 删除说说成功:\n ${pos}.${lodash.truncate(domain.content, { "length": 15 })} \n - [${domain.secret ? "私密" : "公开"}] | ${moment(domain.created_time * 1000).format("MM/DD HH:mm")} | ${domain.commentlist?.length || 0} 条评论`) - + if (result.subcode != 0) e.reply('❎ 未知错误' + JSON.parse(result)) + // 发送结果 + e.reply(`✅ 删除说说成功:\n ${pos}.${lodash.truncate(domain.content, { length: 15 })} \n - [${domain.secret ? '私密' : '公开'}] | ${moment(domain.created_time * 1000).format('MM/DD HH:mm')} | ${domain.commentlist?.length || 0} 条评论`) } /** 发说说 */ - async Qzonesay(e) { - let con = e.msg.replace(/#|发说说/g, "").trim() + async Qzonesay (e) { + let con = e.msg.replace(/#|发说说/g, '').trim() let result = await QQInterface.setQzone(con, e.img) if (!result) return e.reply(API_ERROR) if (result.code != 0) return e.reply(`❎ 说说发表失败\n${JSON.stringify(result)}`) - let msg = [`✅ 说说发表成功,内容:\n`, lodash.truncate(result.content, { "length": 15 })] + let msg = ['✅ 说说发表成功,内容:\n', lodash.truncate(result.content, { length: 15 })] if (result.pic) { msg.push(segment.image(result.pic[0].url1)) } - msg.push(`\n- [${result.secret ? "私密" : "公开"}] | ${moment(result.t1_ntime * 1000).format("MM/DD HH:mm")}`) + msg.push(`\n- [${result.secret ? '私密' : '公开'}] | ${moment(result.t1_ntime * 1000).format('MM/DD HH:mm')}`) e.reply(msg) } - /** 清空说说和留言*/ - async QzoneEmpty(e) { + /** 清空说说和留言 */ + async QzoneEmpty (e) { if (/清空说说/.test(e.msg)) { this.setContext('QzonedelAll') - e.reply("✳️ 即将删除全部说说请发送:\n" + "------确认清空或取消------"); - Qzonedetermine = true; + e.reply('✳️ 即将删除全部说说请发送:\n' + '------确认清空或取消------') + Qzonedetermine = true } else if (/清空留言/.test(e.msg)) { this.setContext('QzonedelAll') - e.reply("✳️ 即将删除全部留言请发送:\n" + "------确认清空或取消------"); - Qzonedetermine = false; + e.reply('✳️ 即将删除全部留言请发送:\n' + '------确认清空或取消------') + Qzonedetermine = false } } - async QzonedelAll() { + + async QzonedelAll () { let msg = this.e.msg if (/#?确认清空/.test(msg)) { this.finish('QzonedelAll') @@ -665,116 +660,113 @@ export class example extends plugin { } this.e.reply(result) - return true; - + return true } else if (/#?取消/.test(msg)) { this.finish('QzonedelAll') - this.e.reply("✅ 已取消") - return false; + this.e.reply('✅ 已取消') + return false } else { this.setContext('QzonedelAll') - this.e.reply("❎ 请输入:确认清空或取消") - return false; + this.e.reply('❎ 请输入:确认清空或取消') + return false } } - //获取群|好友列表 - async Grouplist(e) { - let msg = []; + // 获取群|好友列表 + async Grouplist (e) { + let msg = [] if (/群列表/.test(e.msg)) { - //获取群列表并转换为数组 + // 获取群列表并转换为数组 let listMap = Array.from(Bot.gl.values()) msg = [ `群列表如下,共${listMap.length}个群`, - listMap.map((item, index) => `${index + 1}、${item.group_name}(${item.group_id})`).join("\n"), - "可使用 #退群123456789 来退出某群", - `可使用 #发群列表 <序号> <消息> 来快速发送消息,多个群聊请用 "," 分隔 不能大于3 容易寄` + listMap.map((item, index) => `${index + 1}、${item.group_name}(${item.group_id})`).join('\n'), + '可使用 #退群123456789 来退出某群', + '可使用 #发群列表 <序号> <消息> 来快速发送消息,多个群聊请用 "," 分隔 不能大于3 容易寄' ] } else { - //获取好友列表并转换为数组 + // 获取好友列表并转换为数组 let listMap = Array.from(Bot.fl.values()) msg = [ `好友列表如下,共${listMap.length}个好友`, - listMap.map((item, index) => `${index + 1}、${item.nickname}(${item.user_id})`).join("\n"), - "可使用 #删好友123456789 来删除某人" + listMap.map((item, index) => `${index + 1}、${item.nickname}(${item.user_id})`).join('\n'), + '可使用 #删好友123456789 来删除某人' ] } common.getforwardMsg(e, msg) - } - //引用撤回 - async recallMsgown(e) { + // 引用撤回 + async recallMsgown (e) { if (!e.source) return - let source; + let source if (e.isGroup) { - source = (await e.group.getChatHistory(e.source.seq, 1)).pop(); + source = (await e.group.getChatHistory(e.source.seq, 1)).pop() } else { - source = (await e.friend.getChatHistory(e.source.time, 1)).pop(); + source = (await e.friend.getChatHistory(e.source.time, 1)).pop() } let target = e.isGroup ? e.group : e.friend if (source.sender.user_id != Bot.uin) { if (e.isGroup) { - //群聊判断权限 + // 群聊判断权限 if (!e.isMaster && !e.member.is_owner && !e.member.is_admin) { return logger.warn(`${e.logFnc}该群员权限不足`) } } else { - //私聊判断是否为Bot消息 + // 私聊判断是否为Bot消息 return logger.warn(`${e.logFnc}引用不是Bot消息`) } } logger.info(`${e.logFnc}执行撤回`) - //撤回消息 - await target.recallMsg(source.message_id); + // 撤回消息 + await target.recallMsg(source.message_id) - await common.sleep(300); + await common.sleep(300) let recallcheck = await Bot.getMsg(source.message_id) if (recallcheck && recallcheck.message_id == source.message_id) { - let msg; + let msg if (e.isGroup) { if (!e.group.is_admin && !e.group.is_owner) { - msg = "人家连管理员都木有,怎么撤回两分钟前的消息或别人的消息辣o(´^`)o" + msg = '人家连管理员都木有,怎么撤回两分钟前的消息或别人的消息辣o(´^`)o' } else { - msg = "干不赢这个淫的辣(`Δ´)ゞ" + msg = '干不赢这个淫的辣(`Δ´)ゞ' } } else { - msg = "过了两分钟,吃不掉辣(o`ε´o)" + msg = '过了两分钟,吃不掉辣(o`ε´o)' } - return e.reply(msg, true, { recallMsg: 5 }); + return e.reply(msg, true, { recallMsg: 5 }) } - if (e.isGroup) await e.recall(); + if (e.isGroup) await e.recall() } - //开关好友添加 - async friend_switch(e) { + // 开关好友添加 + async friend_switch (e) { let res = await QQInterface.addFriendSwitch(/开启/.test(e.msg) ? 1 : 2) if (!res) return e.reply(API_ERROR) e.reply(res.ActionStatus) } - //好友申请方式 - async friend_type(e) { - let regRet = friend_typeReg.exec(e.msg) - if (regRet[1] == 0) return e.reply("1为允许所有人,2为需要验证,3为问答正确问答(需填问题和答案,格式为:#更改好友申请方式3 问题 答案)") - //单独处理 - if ((!regRet[3] || !regRet[4]) && regRet[1] == 3) return e.reply("❎ 请正确输入问题和答案!") + // 好友申请方式 + async friend_type (e) { + let regRet = friendTypeReg.exec(e.msg) + if (regRet[1] == 0) return e.reply('1为允许所有人,2为需要验证,3为问答正确问答(需填问题和答案,格式为:#更改好友申请方式3 问题 答案)') + // 单独处理 + if ((!regRet[3] || !regRet[4]) && regRet[1] == 3) return e.reply('❎ 请正确输入问题和答案!') let res = await QQInterface.setFriendType(regRet[1], regRet[3], regRet[4]) if (!res) return e.reply(API_ERROR) - if (res.ec != 0) return e.reply("❎ 修改失败\n" + JSON.stringify(res)) + if (res.ec != 0) return e.reply('❎ 修改失败\n' + JSON.stringify(res)) e.reply(res.msg) } - /**开关戳一戳 */ - async cyc(e) { + /** 开关戳一戳 */ + async cyc (e) { let result = await QQInterface.setcyc(/开启/.test(e.msg) ? 0 : 1) if (!result) return e.reply(API_ERROR) - if (result.ret != 0) return e.reply("❎ 未知错误\n" + JSON.stringify(result)) + if (result.ret != 0) return e.reply('❎ 未知错误\n' + JSON.stringify(result)) e.reply(`✅ 已${/开启/.test(e.msg) ? '开启' : '关闭'}戳一戳功能`) } - } diff --git a/apps/fun.js b/apps/fun.js index 9bf4bbe..ba11fd9 100644 --- a/apps/fun.js +++ b/apps/fun.js @@ -1,38 +1,38 @@ import plugin from '../../../lib/plugins/plugin.js' import fetch from 'node-fetch' -import { segment } from "oicq" +import { segment } from 'oicq' import lodash from 'lodash' import { Config } from '../components/index.js' import { common, uploadRecord, QQInterface, Interface } from '../model/index.js' const heisitype = { - "白丝": { type: "baisi", page: 17 }, - "黑丝": { type: "heisi", page: 43 }, - "巨乳": { type: "juru", page: 8 }, - "jk": { type: "jk", page: 6 }, - "网红": { type: "mcn", page: 36 }, - "美足": { type: "meizu", page: 9 } + 白丝: { type: 'baisi', page: 17 }, + 黑丝: { type: 'heisi', page: 43 }, + 巨乳: { type: 'juru', page: 8 }, + jk: { type: 'jk', page: 6 }, + 网红: { type: 'mcn', page: 36 }, + 美足: { type: 'meizu', page: 9 } } -/**API请求错误文案 */ -const API_ERROR = "❎ 出错辣,请稍后重试" -/**未启用文案 */ -const SWITCH_ERROR = "主人没有开放这个功能哦(*/ω\*)" -/**开始执行文案 */ -const START_Execution = "椰奶产出中......" +/** API请求错误文案 */ +const API_ERROR = '❎ 出错辣,请稍后重试' +/** 未启用文案 */ +const SWITCH_ERROR = '主人没有开放这个功能哦(*/ω\*)' +/** 开始执行文案 */ +const START_EXECUTION = '椰奶产出中......' -const picapis = Config.getConfig("picApi") -/**解析匹配模式 */ +const picapis = Config.getConfig('picApi') +/** 解析匹配模式 */ let picApiKeys = [] lodash.forIn(picapis, (values, key) => { let mode = values.mode !== undefined ? values.mode : picapis.mode - key = key.split("|").map(item => mode ? "^" + item + "$" : item).join("|") + key = key.split('|').map(item => mode ? '^' + item + '$' : item).join('|') picApiKeys.push(key) }) -const apiReg = new RegExp(`(${picApiKeys.join("|")}|^jktj$|^接口统计$)`) +const apiReg = new RegExp(`(${picApiKeys.join('|')}|^jktj$|^接口统计$)`) export class example extends plugin { - constructor() { + constructor () { super({ name: '椰奶娱乐', event: 'message', @@ -55,7 +55,7 @@ export class example extends plugin { fnc: 'zan' }, { - reg: 'github.com\/[a-zA-Z0-9-]{1,39}\/[a-zA-Z0-9_-]{1,100}', + reg: 'github.com/[a-zA-Z0-9-]{1,39}/[a-zA-Z0-9_-]{1,100}', fnc: 'GH' }, { @@ -63,7 +63,7 @@ export class example extends plugin { fnc: 'coser' }, { - reg: `#?来点(${Object.keys(heisitype).join("|")})$`, + reg: `#?来点(${Object.keys(heisitype).join('|')})$`, fnc: 'heisiwu' }, { @@ -85,144 +85,144 @@ export class example extends plugin { { reg: '^#?acg.*$', fnc: 'acg' - }, - - + } ] }) } - /**随机唱鸭 */ - async Sing(e) { - let data = await Interface.randomSinging(); + /** 随机唱鸭 */ + async Sing (e) { + let data = await Interface.randomSinging() if (data.error) return e.reply(data.error) await e.reply(await uploadRecord(data.audioUrl, 0, false)) await e.reply(data.lyrics) } - /**支付宝语音 */ - async ZFB(e) { - let amount = parseFloat(e.msg.replace(/#|支付宝到账|元|圆/g, "").trim()) - if (!/^\d+(\.\d{1,2})?$/.test(amount)) return e.reply("你觉得这河里吗!!", true); + /** 支付宝语音 */ + async ZFB (e) { + let amount = parseFloat(e.msg.replace(/#|支付宝到账|元|圆/g, '').trim()) - if (!(0.01 <= amount && amount <= 999999999999.99)) { - return e.reply("数字大小超出限制,支持范围为0.01~999999999999.99") + if (!/^\d+(\.\d{1,2})?$/.test(amount)) return e.reply('你觉得这河里吗!!', true) + + if (!(amount >= 0.01 && amount <= 999999999999.99)) { + return e.reply('数字大小超出限制,支持范围为0.01~999999999999.99') } - e.reply([segment.record(`https://mm.cqu.cc/share/zhifubaodaozhang/mp3/${amount}.mp3`)]); + e.reply([segment.record(`https://mm.cqu.cc/share/zhifubaodaozhang/mp3/${amount}.mp3`)]) } - /**有道翻译 */ - async youdao(e) { + /** 有道翻译 */ + async youdao (e) { let msg = e.msg.match(/#(([\u4e00-\u9fa5]{2,6})-)?([\u4e00-\u9fa5]{2,6})?翻译(.*)/) - if (!msg) return; + if (!msg) return if (e.source) { - let source; + let source if (e.isGroup) { - source = (await e.group.getChatHistory(e.source.seq, 1)).pop(); + source = (await e.group.getChatHistory(e.source.seq, 1)).pop() } else { - source = (await e.friend.getChatHistory(e.source.time, 1)).pop(); + source = (await e.friend.getChatHistory(e.source.time, 1)).pop() } - msg[4] = source.message.filter(item => item.type == 'text').map(item => item.text).join(""); + msg[4] = source.message.filter(item => item.type == 'text').map(item => item.text).join('') } - let results = await Interface.youdao(msg[4], msg[3], msg[2]); + let results = await Interface.youdao(msg[4], msg[3], msg[2]) return e.reply(results, true) } - /**点赞 */ - async zan(e) { - if (Bot.config.platform == 3) return e.reply("❎ 手表协议暂不支持点赞请更换协议后重试") - /**判断是否为好友 */ + /** 点赞 */ + async zan (e) { + if (Bot.config.platform == 3) return e.reply('❎ 手表协议暂不支持点赞请更换协议后重试') + /** 判断是否为好友 */ let isFriend = await Bot.fl.get(e.user_id) let likeByStrangers = Config.Notice.Strangers_love - if (!isFriend && !likeByStrangers) return e.reply("不加好友不点🙄", true) - /** 点赞成功回复的图片*/ + if (!isFriend && !likeByStrangers) return e.reply('不加好友不点🙄', true) + /** 点赞成功回复的图片 */ let imgs = [ - "https://xiaobai.klizi.cn/API/ce/zan.php?qq=", + 'https://xiaobai.klizi.cn/API/ce/zan.php?qq=', // "https://xiaobai.klizi.cn/API/ce/xin.php?qq=", - "http://ovooa.com/API/zan/api.php?QQ=", - "http://api.caonm.net/api/bix/b.php?qq=", - "http://api.caonm.net/api/kan/kan_3.php?qq=" + 'http://ovooa.com/API/zan/api.php?QQ=', + 'http://api.caonm.net/api/bix/b.php?qq=', + 'http://api.caonm.net/api/kan/kan_3.php?qq=' ] /** 一个随机数 */ let random = Math.floor(Math.random() * (imgs.length - 0)) - let success_img = segment.image(imgs[random] + e.user_id) + let successImg = segment.image(imgs[random] + e.user_id) /** 点赞失败的图片 */ - let failds_img = segment.image(`https://xiaobai.klizi.cn/API/ce/paa.php?qq=${e.user_id}`) + let faildsImg = segment.image(`https://xiaobai.klizi.cn/API/ce/paa.php?qq=${e.user_id}`) - /** 执行点赞*/ - let n = 0; + /** 执行点赞 */ + let n = 0 let failsmsg = '今天已经点过了,还搁这讨赞呢!!!' while (true) { - //好友点赞 + // 好友点赞 if (!likeByStrangers || isFriend) { let res = await Bot.sendLike(e.user_id, 10) logger.debug(`${e.logFnc}好友点赞`, res) if (res) { - n += 10; - } else break; + n += 10 + } else break } else { - //陌生人点赞 + // 陌生人点赞 let res = await QQInterface.thumbUp(e.user_id, 10) logger.debug(`${e.logFnc}陌生人点赞`, res) if (res.code != 0) { if (res.code == 1) { - failsmsg = "点赞失败,请检查是否开启陌生人点赞或添加好友" + failsmsg = '点赞失败,请检查是否开启陌生人点赞或添加好友' } else { failsmsg = res.msg } - break; + break } else { - n += 10; + n += 10 } } } - /**回复的消息 */ - let success_result = ["\n", `给你点了${n}下哦,记得回我~${isFriend ? "" : "(如点赞失败请添加好友)"}`, success_img] - let failds_result = ["\n", failsmsg, failds_img] + /** 回复的消息 */ + let successResult = ['\n', `给你点了${n}下哦,记得回我~${isFriend ? '' : '(如点赞失败请添加好友)'}`, successImg] + let faildsResult = ['\n', failsmsg, faildsImg] - /**判断点赞是否成功*/ - let msg = n > 0 ? success_result : failds_result - /**回复 */ + /** 判断点赞是否成功 */ + let msg = n > 0 ? successResult : faildsResult + /** 回复 */ await e.reply(msg, false, { at: true }) return true } - //github - async GH(e) { - const api = "https://opengraph.githubassets.com"; + // github + async GH (e) { + const api = 'https://opengraph.githubassets.com' let reg = /github.com\/[a-zA-Z0-9-]{1,39}\/[a-zA-Z0-9_-]{1,100}/ - const isMatched = e.msg.match(reg); + const isMatched = e.msg.match(reg) - const id = "Yenai"; + const id = 'Yenai' if (isMatched) { - const res = isMatched[0].split("/"); - const [user, repo] = [res[1], res[2].split("#")[0]]; - e.reply(segment.image(`${api}/${id}/${user}/${repo}`)); + const res = isMatched[0].split('/') + const [user, repo] = [res[1], res[2].split('#')[0]] + e.reply(segment.image(`${api}/${id}/${user}/${repo}`)) } - return true; + return true } - //coser - async coser(e) { + + // coser + async coser (e) { let { sese, sesepro } = Config.getGroup(e.group_id) if (!sese && !sesepro && !e.isMaster) return e.reply(SWITCH_ERROR) - e.reply(START_Execution) + e.reply(START_EXECUTION) - const api = "http://ovooa.com/API/cosplay/api.php" + const api = 'http://ovooa.com/API/cosplay/api.php' let res = await fetch(api).then((res) => res.json()).catch((err) => console.error(err)) if (!res) return e.reply(API_ERROR) res = res.data - let item = 1; + let item = 1 let msg = [res.Title] for (let i of res.data) { msg.push(segment.image(i)) @@ -235,98 +235,100 @@ export class example extends plugin { common.getRecallsendMsg(e, msg) return true } - //cos/acg搜索 - async acg(e) { + + // cos/acg搜索 + async acg (e) { let { sese, sesepro } = Config.getGroup(e.group_id) if (!sese && !sesepro && !e.isMaster) return e.reply(SWITCH_ERROR) - e.reply(START_Execution) + e.reply(START_EXECUTION) - - let keywords = e.msg.replace(/#|acg/g, "").trim() - let domain = "https://www.pandadiu.com" + let keywords = e.msg.replace(/#|acg/g, '').trim() + let domain = 'https://www.pandadiu.com' let url = '' if (keywords) { url = `${domain}/index.php?m=search&c=index&a=init&typeid=1&siteid=1&q=${keywords}` } else { url = `${domain}/list-31-${lodash.random(1, 177)}.html` } - //搜索页面 - let search = await fetch(url).then(res => res.text()).catch(err => console.error(err)); + // 搜索页面 + let search = await fetch(url).then(res => res.text()).catch(err => console.error(err)) let searchlist = search.match(//g) ?.map(item => item.match(/ res.text()).catch(err => console.error(err)); - //处理图片 + let imghtml = await fetch(imgurl).then(res => res.text()).catch(err => console.error(err)) + // 处理图片 let imglist = imghtml.match(//g) - ?.map(item => (!/www.pandadiu.com/.test(item) ? domain : "") + (item.match(/ (!/www.pandadiu.com/.test(item) ? domain : '') + (item.match(/ segment.image(item)) || false if (!imglist) return e.reply(API_ERROR) common.getRecallsendMsg(e, imglist) } - //黑丝 - async heisiwu(e) { + // 黑丝 + async heisiwu (e) { if (!Config.getGroup(e.group_id).sesepro && !e.isMaster) return e.reply(SWITCH_ERROR) - e.reply(START_Execution) - //获取类型 + e.reply(START_EXECUTION) + // 获取类型 let { type, page } = heisitype[e.msg.match(/#?来点(.*)/)[1]] - //请求主页面 + // 请求主页面 let url = `http://hs.heisiwu.com/${type}/page/${lodash.random(1, page)}` - console.log(url); + console.log(url) let homePage = await fetch(url).then(res => res.text()).catch(err => console.error(err)) if (!homePage) return e.reply(API_ERROR) - //解析html - let childPageUrlList = homePage.match(/ res.text()).catch(err => console.error(err)) if (!childPage) return e.reply(API_ERROR) - //获取html列表 - let imghtml = childPage.match(/ { item = segment.image(item.match(/src="(.*)/)[1]) item.headers = { - 'Referer': 'http://hs.heisiwu.com', + Referer: 'http://hs.heisiwu.com', 'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/108.0.0.0 Safari/537.36 Edg/108.0.1462.46' } return item }) - //发送消息 + // 发送消息 common.getRecallsendMsg(e, lodash.take(imglist, 20)) } - //萌堆 - async mengdui(e) { + + // 萌堆 + async mengdui (e) { if (!Config.getGroup(e.group_id).sesepro && !e.isMaster) return e.reply(SWITCH_ERROR) let domain = 'https://a6z9.com' - //开始执行 - e.reply(START_Execution) + // 开始执行 + e.reply(START_EXECUTION) let url = '' + let appoint = '' if (/#?来点神秘图s/.test(e.msg)) { let keywords = e.msg.match(/#?来点神秘图s(.*)/)[1] let mengduipage = JSON.parse(await redis.get('yenai:mengduipage')) || {} let randomPage = lodash.random(1, mengduipage[keywords] || 1) let searchurl = `${domain}/search.php?mdact=community&q=${keywords}&page=${randomPage}` - let search = await fetch(searchurl).then(res => res.text()); + let search = await fetch(searchurl).then(res => res.text()) let searchList = lodash.uniq(search.match(/https?:\/\/.*?\.com\/post\/\d+.html/g)) if (lodash.isEmpty(searchList)) { let ERROR = search.match(/抱歉,未找到(.*)相关内容,建议简化一下搜索的关键词|搜索频率太快,请等一等再尝试!/) - return ERROR ? e.reply(ERROR[0]?.replace(/<.*?>/g, "") || "未找到相关内容") : e.reply("未找到相关内容") + return ERROR ? e.reply(ERROR[0]?.replace(/<.*?>/g, '') || '未找到相关内容') : e.reply('未找到相关内容') } - //保存该关键词的最大页数 + // 保存该关键词的最大页数 let searchpage = Math.max(...search.match(/(\d+)<\/a>/g)?.map(item => item.match(/(\d+)<\/a>/)[2])) || 1 mengduipage[keywords] = searchpage await redis.set('yenai:mengduipage', JSON.stringify(mengduipage)) url = lodash.sample(searchList) } else { - let appoint = e.msg.match(/\d+/g) - let random; + appoint = e.msg.match(/\d+/g) + let random if (!appoint) { random = lodash.random(1, 11687) while (lodash.inRange(random, 7886, 10136)) { @@ -338,17 +340,17 @@ export class example extends plugin { url = `${domain}/post/${random}.html` } - let res = await fetch(url).then(res => res.text()).catch(err => console.error(err)); + let res = await fetch(url).then(res => res.text()).catch(err => console.error(err)) let div = res.match(/
[\s\S]+?<\/div>/) let title = res.match(/(.*?) segment.image(item)), 30) @@ -356,13 +358,13 @@ export class example extends plugin { common.getRecallsendMsg(e, msg) } - //铃声多多 - async lingsheng(e) { - let msg = e.msg.replace(/#|铃声搜索/g, "") + // 铃声多多 + async lingsheng (e) { + let msg = e.msg.replace(/#|铃声搜索/g, '') let api = `https://xiaobai.klizi.cn/API/music/lingsheng.php?msg=${msg}&n=1` let res = await fetch(api).then(res => res.json()).catch(err => console.log(err)) if (!res) return e.reply(API_ERROR) - if (res.title == null && res.author == null) return e.reply("❎ 没有找到相关的歌曲哦~", true) + if (res.title == null && res.author == null) return e.reply('❎ 没有找到相关的歌曲哦~', true) await e.reply([ `标题:${res.title}\n`, @@ -370,47 +372,48 @@ export class example extends plugin { ]) await e.reply(await uploadRecord(res.aac, 0, false)) } - /**半次元话题 */ - async bcy_topic(e) { + + /** 半次元话题 */ + async bcy_topic (e) { let api = 'https://xiaobai.klizi.cn/API/other/bcy_topic.php' let res = await fetch(api).then(res => res.json()).catch(err => console.log(err)) if (!res) return e.reply(API_ERROR) - if (res.code != 200) return e.reply("❎ 出错辣" + JSON.stringify(res)) - if (lodash.isEmpty(res.data)) return e.reply(`请求错误!无数据,请稍后再试`) - let msg = []; + if (res.code != 200) return e.reply('❎ 出错辣' + JSON.stringify(res)) + if (lodash.isEmpty(res.data)) return e.reply('请求错误!无数据,请稍后再试') + let msg = [] for (let i of res.data) { if (!i.title || lodash.isEmpty(i.image)) continue - msg.push(i.title); + msg.push(i.title) msg.push(i.image.map(item => segment.image(item))) } if (lodash.isEmpty(msg)) return this.bcy_topic(e) common.getforwardMsg(e, msg) } - //api大集合 - async picture(e) { + // api大集合 + async picture (e) { let { sese, sesepro } = Config.getGroup(e.group_id) - if (!sese && !sesepro && !e.isMaster) return false; - let key = `yenai:apiAggregate:CD` - if (await redis.get(key)) return false; + if (!sese && !sesepro && !e.isMaster) return false + let key = 'yenai:apiAggregate:CD' + if (await redis.get(key)) return false if (/jktj|接口统计/.test(e.msg)) { let msg = ['现接口数量如下'] for (let i in picapis) { - if (i == 'mode') continue; + if (i == 'mode') continue let urls = picapis[i].url || picapis[i] msg.push(`\n♡ ${i} => ${Array.isArray(urls) ? urls.length : 1}`) } return e.reply(msg) } - //解析消息中的类型 + // 解析消息中的类型 let regRet = apiReg.exec(e.msg) - if (regRet[1] == 'mode') return false; + if (regRet[1] == 'mode') return false let picObj = picapis[lodash.sample(Object.keys(picapis).filter(item => new RegExp(item).test(regRet[1])))] if (Array.isArray(picObj)) picObj = lodash.sample(picObj) let urlReg = /^https?:\/\/(([a-zA-Z0-9_-])+(\.)?)*(:\d+)?(\/((\.)?(\?)?=?&?[a-zA-Z0-9_-](\?)?)*)*$/i if (!picObj.url && !urlReg.test(encodeURI(picObj)) && !Array.isArray(picObj)) { - return logger.error(`${e.logFnc}未找到url`); + return logger.error(`${e.logFnc}未找到url`) } if (picObj.type !== 'image' && picObj.type !== 'text' && picObj.type !== 'json' && picObj.type) { @@ -418,7 +421,7 @@ export class example extends plugin { } let url = encodeURI(picObj.url || picObj) - //数组随机取或指定 + // 数组随机取或指定 if (Array.isArray(url)) { // url = (regRet[2] ? picObj[regRet[2] - 1] : lodash.sample(url)) || lodash.sample(url) url = lodash.sample(url) @@ -435,58 +438,6 @@ export class example extends plugin { logger.debug(`${e.logFnc}使用接口:${url}`) common.recallsendMsg(e, segment.image(url)) - redis.set(key, "cd", { EX: 2 }) + redis.set(key, 'cd', { EX: 2 }) } } -// let apis = { -// "bs": [ -// "http://api.starrobotwl.com/api/baisi.php", -// "http://api.caonm.net/api/bhs/b.php" -// ], -// "hs": [ -// "http://api.caonm.net/api/bhs/h.php", -// "http://api.starrobotwl.com/api/heisi.php" -// ], -// "jk": [ -// "http://api.starrobotwl.com/api/jk.php", -// "http://www.ggapi.cn/api/jkzf" -// ], -// "bm": [ -// "http://iw233.cn/api.php?sort=yin" -// ], -// "sy": [ -// "https://iw233.cn/api.php?sort=cat" -// ], -// "mt": [ -// "https://api.sdgou.cc/api/meitui/", -// "https://ovooa.com/API/meizi/api.php?type=image", -// ], -// "ks": [ -// "http://api.wqwlkj.cn/wqwlapi/ks_xjj.php?type=image" -// ], -// "fj": [ -// "http://api.starrobotwl.com/api/fuji.php" -// ], -// "ecy": [ -// "https://iw233.cn/api.php?sort=top", -// "https://iw233.cn/api.php?sort=mp", -// "http://api.wqwlkj.cn/wqwlapi/ks_2cy.php?type=image" -// ], -// "cos": [ -// "http://api.starrobotwl.com/api/yscos.php" -// ], -// "hso": [ -// "http://www.ggapi.cn/api/girls", -// ], -// "xjj": [ -// "https://api.btstu.cn/sjbz/api.php", -// "https://ovooa.com/API/meinv/api.php?type=image", -// "http://api.sakura.gold/ksxjjtp" -// ], -// "mjx": [ -// "https://api.sdgou.cc/api/tao/", -// "https://api.vvhan.com/api/tao", -// "https://api.dzzui.com/api/imgtaobao" -// ], -// } -// let apirag = new RegExp(`^#?(${Object.keys(apis).join("|")}|jktj)(\\d+)?$`) \ No newline at end of file diff --git a/apps/gp_admin.js b/apps/gp_admin.js index 3158f9f..038f48b 100644 --- a/apps/gp_admin.js +++ b/apps/gp_admin.js @@ -5,771 +5,776 @@ import { Config } from '../components/index.js' import { GroupAdmin as ga, common, QQInterface, puppeteer, CronValidate, YamlReader } from '../model/index.js' import moment from 'moment' - -//API请求错误文案 -const API_ERROR = "❎ 出错辣,请稍后重试" -//无管理文案 -const ROLE_ERROR = "做不到,怎么想我都做不到吧ヽ(≧Д≦)ノ" -//权限不足文案 -const Permission_ERROR = "❎ 该命令仅限管理员可用" -//正则 -const Numreg = "[一壹二两三四五六七八九十百千万亿\\d]+" -const TimeUnitReg = Object.keys(common.Time_unit).join("|") +// API请求错误文案 +const API_ERROR = '❎ 出错辣,请稍后重试' +// 无管理文案 +const ROLE_ERROR = '做不到,怎么想我都做不到吧ヽ(≧Д≦)ノ' +// 权限不足文案 +const PERMISSION_ERROR = '❎ 该命令仅限管理员可用' +// 正则 +const Numreg = '[一壹二两三四五六七八九十百千万亿\\d]+' +const TimeUnitReg = Object.keys(common.Time_unit).join('|') const noactivereg = new RegExp(`^#(查看|清理|确认清理|获取)(${Numreg})个?(${TimeUnitReg})没发言的人(第(${Numreg})页)?$`) -const Autisticreg = new RegExp(`^#?我要(自闭|禅定)(${Numreg})?个?(${TimeUnitReg})?$`, "i") -//获取定时任务 -const redisTask = await ga.getRedisMuteTask() || false; +const Autisticreg = new RegExp(`^#?我要(自闭|禅定)(${Numreg})?个?(${TimeUnitReg})?$`, 'i') +// 获取定时任务 +const redisTask = await ga.getRedisMuteTask() || false export class Basics extends plugin { - constructor() { - super({ - name: '椰奶基础群管', - event: 'message.group', - priority: 500, - rule: [ - { - reg: '^#禁言.*$', - fnc: 'Taboo', - }, - { - reg: '^#解禁(\\d+)?$', - fnc: 'Relieve', - }, - { - reg: '^#全体(禁言|解禁)$', - fnc: 'TabooAll', - }, - { - reg: '^#踢(\\d+)?$', - fnc: 'Kick', - }, - { - reg: '^#(设置|取消)管理(\\d+)?$', - fnc: 'SetAdmin', - }, - { - reg: '^#(允许|禁止|开启|关闭)匿名$', - fnc: 'AllowAnony', - }, - { - reg: '^#发群公告.*$', - fnc: 'AddAnnounce', - }, - { - reg: '^#删群公告(\\d+)$', - fnc: 'DelAnnounce', - }, - { - reg: '^#查群公告$', - fnc: 'GetAnnounce', - }, - { - reg: '^#修改头衔.*$', - fnc: 'adminsetTitle', - }, - { - reg: '^#申请头衔.*$', - fnc: 'SetGroupSpecialTitle' - }, - { - reg: '^#(查)?(幸运)?字符(列表)?$', - fnc: 'qun_luckylist' - }, - { - reg: '^#抽(幸运)?字符$', - fnc: 'qun_lucky' - }, - { - reg: '^#替换(幸运)?字符(\\d+)$', - fnc: 'qun_luckyuse', - }, - { - reg: '^#(开启|关闭)(幸运)?字符$', - fnc: 'qun_luckyset', - }, - { - reg: '^#(获取|查看)?禁言列表$', - fnc: 'Mutelist', - }, - { - reg: '^#解除全部禁言$', - fnc: 'relieveAllMute', - }, - { - reg: `^#(查看|(确认)?清理)从未发言过?的人(第(${Numreg})页)?$`, - fnc: 'neverspeak', - }, - { - reg: `^#(查看|获取)?(不活跃|潜水)排行榜(${Numreg})?$`, - fnc: 'RankingList' - }, - { - reg: `^#(查看|获取)?最近的?入群(情况|记录)(${Numreg})?$`, - fnc: 'RankingList' - }, - { - reg: noactivereg,//清理多久没发言的人 - fnc: 'noactive', - }, - { - reg: `^#发通知.*$`, - fnc: 'Send_notice', - }, - { - reg: `^#(设置)?定时(禁言|解禁)(.*)$|^#定时禁言任务$|^#取消定时(禁言|解禁)$`, - fnc: 'timeMute', - }, - { - reg: `^#(查看|获取)?群?发言(榜单|排行)((7|七)天)?`, - fnc: 'SpeakRank' - }, - { - reg: "^#?(谁|哪个吊毛|哪个屌毛|哪个叼毛)是龙王$", - fnc: 'dragonKing' - }, - { - reg: '^#群星级$', - fnc: 'Group_xj' - }, - { - reg: '^#群数据((7|七)天)?$', - fnc: 'groupData' - }, - { - reg: '^#今日打卡$', - fnc: 'DaySigned' - }, - { - reg: Autisticreg,//我要自闭 - fnc: 'Autistic' - }, - { - reg: '^#((今|昨|前|明|后)天|\\d{4}-\\d{1,2}-\\d{1,2})谁生日$', - fnc: 'groupBirthday' - }, - { - reg: '^#?(开启|关闭)加群通知$', - fnc: 'handleGroupAdd' - } - ] - }) - this.task = redisTask - } - - /**禁言 */ - async Taboo(e) { - //判断权限 - if (!e.member.is_admin && !e.member.is_owner && !e.isMaster) return e.reply(Permission_ERROR) - //判断是否有管理 - if (!e.group.is_admin && !e.group.is_owner) return e.reply(ROLE_ERROR, true); - - let qq = e.message.find(item => item.type == 'at')?.qq - let TabooTime = 5; - let Company = 300; - //判断有无@ - if (!qq) { - let regRet = e.msg.match(new RegExp(`#禁言\\s?(\\d+)\\s(${Numreg})?(${TimeUnitReg})?`)); - if (!regRet) return e.reply("❎ 请检查指令格式是否正确"); - //处理消息 - if (!regRet[1]) return e.reply("❎ 未取得QQ号请检查指令格式"); - qq = regRet[1] - // 获取数字 - TabooTime = common.translateChinaNum(regRet[2] || 5) - //获取单位 - Company = common.Time_unit[lodash.toUpper(regRet[3]) || "分"] - - } else { - TabooTime = common.translateChinaNum(e.msg.match(new RegExp(Numreg)) || 5) - Company = common.Time_unit[lodash.toUpper(e.msg.match(new RegExp(TimeUnitReg))) || "分"] + constructor () { + super({ + name: '椰奶基础群管', + event: 'message.group', + priority: 500, + rule: [ + { + reg: '^#禁言.*$', + fnc: 'Taboo' + }, + { + reg: '^#解禁(\\d+)?$', + fnc: 'Relieve' + }, + { + reg: '^#全体(禁言|解禁)$', + fnc: 'TabooAll' + }, + { + reg: '^#踢(\\d+)?$', + fnc: 'Kick' + }, + { + reg: '^#(设置|取消)管理(\\d+)?$', + fnc: 'SetAdmin' + }, + { + reg: '^#(允许|禁止|开启|关闭)匿名$', + fnc: 'AllowAnony' + }, + { + reg: '^#发群公告.*$', + fnc: 'AddAnnounce' + }, + { + reg: '^#删群公告(\\d+)$', + fnc: 'DelAnnounce' + }, + { + reg: '^#查群公告$', + fnc: 'GetAnnounce' + }, + { + reg: '^#修改头衔.*$', + fnc: 'adminsetTitle' + }, + { + reg: '^#申请头衔.*$', + fnc: 'SetGroupSpecialTitle' + }, + { + reg: '^#(查)?(幸运)?字符(列表)?$', + fnc: 'qun_luckylist' + }, + { + reg: '^#抽(幸运)?字符$', + fnc: 'qun_lucky' + }, + { + reg: '^#替换(幸运)?字符(\\d+)$', + fnc: 'qun_luckyuse' + }, + { + reg: '^#(开启|关闭)(幸运)?字符$', + fnc: 'qun_luckyset' + }, + { + reg: '^#(获取|查看)?禁言列表$', + fnc: 'Mutelist' + }, + { + reg: '^#解除全部禁言$', + fnc: 'relieveAllMute' + }, + { + reg: `^#(查看|(确认)?清理)从未发言过?的人(第(${Numreg})页)?$`, + fnc: 'neverspeak' + }, + { + reg: `^#(查看|获取)?(不活跃|潜水)排行榜(${Numreg})?$`, + fnc: 'RankingList' + }, + { + reg: `^#(查看|获取)?最近的?入群(情况|记录)(${Numreg})?$`, + fnc: 'RankingList' + }, + { + reg: noactivereg, // 清理多久没发言的人 + fnc: 'noactive' + }, + { + reg: '^#发通知.*$', + fnc: 'Send_notice' + }, + { + reg: '^#(设置)?定时(禁言|解禁)(.*)$|^#定时禁言任务$|^#取消定时(禁言|解禁)$', + fnc: 'timeMute' + }, + { + reg: '^#(查看|获取)?群?发言(榜单|排行)((7|七)天)?', + fnc: 'SpeakRank' + }, + { + reg: '^#?(谁|哪个吊毛|哪个屌毛|哪个叼毛)是龙王$', + fnc: 'dragonKing' + }, + { + reg: '^#群星级$', + fnc: 'Group_xj' + }, + { + reg: '^#群数据((7|七)天)?$', + fnc: 'groupData' + }, + { + reg: '^#今日打卡$', + fnc: 'DaySigned' + }, + { + reg: Autisticreg, // 我要自闭 + fnc: 'Autistic' + }, + { + reg: '^#((今|昨|前|明|后)天|\\d{4}-\\d{1,2}-\\d{1,2})谁生日$', + fnc: 'groupBirthday' + }, + { + reg: '^#?(开启|关闭)加群通知$', + fnc: 'handleGroupAdd' } - if (!(/\d{5,}/.test(qq))) return e.reply("❎ 请输入正确的QQ号"); - //判断是否为主人 - if (Config.masterQQ?.includes(Number(qq))) { - e.reply("居然调戏主人!!!哼,坏蛋(ノ`⊿´)ノ"); - return e.group.muteMember(e.user_id, 300); - } - let Memberinfo = e.group.pickMember(Number(qq)).info - //判断是否有这个人 - if (!Memberinfo) return e.reply("❎ 这个群没有这个人哦~", true) - //特殊处理 - if (Memberinfo.role === 'owner') { - e.reply("调戏群主拖出去枪毙5分钟(。>︿<)_θ", true) - return e.group.muteMember(e.user_id, 300); - } - if (Memberinfo.role === 'admin') { - if (!e.group.is_owner) return e.reply("人家又不是群主这种事做不到的辣!", true) - if (!e.isMaster && !e.member.is_owner) return e.reply("这个淫系管理员辣,只有主淫和群主才可以干ta", true) - } - console.log(qq, TabooTime * Company); - await e.group.muteMember(qq, TabooTime * Company); - e.reply(`已把「${Memberinfo.card || Memberinfo.nickname}」扔进了小黑屋( ・_・)ノ⌒●~*`, true); - return true; + ] + }) + this.task = redisTask + } + + /** 禁言 */ + async Taboo (e) { + // 判断权限 + if (!e.member.is_admin && !e.member.is_owner && !e.isMaster) return e.reply(PERMISSION_ERROR) + // 判断是否有管理 + if (!e.group.is_admin && !e.group.is_owner) return e.reply(ROLE_ERROR, true) + + let qq = e.message.find(item => item.type == 'at')?.qq + let TabooTime = 5 + let Company = 300 + // 判断有无@ + if (!qq) { + let regRet = e.msg.match(new RegExp(`#禁言\\s?(\\d+)\\s(${Numreg})?(${TimeUnitReg})?`)) + if (!regRet) return e.reply('❎ 请检查指令格式是否正确') + // 处理消息 + if (!regRet[1]) return e.reply('❎ 未取得QQ号请检查指令格式') + qq = regRet[1] + // 获取数字 + TabooTime = common.translateChinaNum(regRet[2] || 5) + // 获取单位 + Company = common.Time_unit[lodash.toUpper(regRet[3]) || '分'] + } else { + TabooTime = common.translateChinaNum(e.msg.match(new RegExp(Numreg)) || 5) + Company = common.Time_unit[lodash.toUpper(e.msg.match(new RegExp(TimeUnitReg))) || '分'] } - /**解禁 */ - async Relieve(e) { - //判断权限 - if (!e.member.is_admin && !e.member.is_owner && !e.isMaster) return e.reply(Permission_ERROR) - //判断是否有管理 - if (!e.group.is_admin && !e.group.is_owner) return e.reply(ROLE_ERROR, true); - - let qq = e.message.find(item => item.type == "at")?.qq - if (!qq) qq = e.msg.replace(/#|解禁/g, "").trim(); - - if (!qq || !(/\d{5,}/.test(qq))) return e.reply("❎ 请输入正确的QQ号"); - - let Member = e.group.pickMember(Number(qq)) - //判断是否有这个人 - if (!Member.info) return e.reply("❎ 这个群没有这个人哦~"); - - await e.group.muteMember(qq, 0) - e.reply(`已把「${Member.card || Member.nickname}」从小黑屋揪了出来(。>∀<。)`, true); + if (!(/\d{5,}/.test(qq))) return e.reply('❎ 请输入正确的QQ号') + // 判断是否为主人 + if (Config.masterQQ?.includes(Number(qq))) { + e.reply('居然调戏主人!!!哼,坏蛋(ノ`⊿´)ノ') + return e.group.muteMember(e.user_id, 300) } - /**全体禁言 */ - async TabooAll(e) { - //判断权限 - if (!e.member.is_admin && !e.member.is_owner && !e.isMaster) return e.reply(Permission_ERROR) - //判断是否有管理 - if (!e.group.is_admin && !e.group.is_owner) return e.reply(ROLE_ERROR, true); - - let type = /全体禁言/.test(e.msg) - let res = await e.group.muteAll(type) - if (!res) return e.reply("❎ 未知错误", true) - type ? e.reply("全都不准说话了哦~") : e.reply("好耶!!可以说话啦~") + let Memberinfo = e.group.pickMember(Number(qq)).info + // 判断是否有这个人 + if (!Memberinfo) return e.reply('❎ 这个群没有这个人哦~', true) + // 特殊处理 + if (Memberinfo.role === 'owner') { + e.reply('调戏群主拖出去枪毙5分钟(。>︿<)_θ', true) + return e.group.muteMember(e.user_id, 300) } - //踢群员 - async Kick(e) { - //判断权限 - if (!e.member.is_admin && !e.member.is_owner && !e.isMaster) return e.reply(Permission_ERROR) - // 判断是否有管理 - if (!e.group.is_admin && !e.group.is_owner) return e.reply(ROLE_ERROR, true); - - let qq = e.message.find(item => item.type == "at")?.qq - if (!qq) qq = e.msg.replace(/#|踢/g, "").trim() - - if (!qq || !(/\d{5,}/.test(qq))) return e.reply("❎ 请输入正确的QQ号"); - //判断是否为主人 - if (Config.masterQQ?.includes(Number(qq))) { - return e.reply("居然调戏主人!!!哼,坏蛋(ノ`⊿´)ノ"); - } - let Memberinfo = e.group.pickMember(Number(qq)).info - //判断是否有这个人 - if (!Memberinfo) return e.reply("❎ 这个群没有这个人哦~", true) - if (Memberinfo.role === 'owner') return e.reply("调戏群主拖出去枪毙5分钟(。>︿<)_θ", true) - if (Memberinfo.role === 'admin') { - if (!e.group.is_owner) return e.reply("人家又不是群主这种事做不到的辣!", true) - if (!e.isMaster && !e.member.is_owner) return e.reply("这个淫系管理员辣,只有主淫和群主才可以干ta", true) - } - let res = await e.group.kickMember(Number(qq)) - res ? e.reply("已把这个坏淫踢掉惹!!!", true) : e.reply("额...踢出失败哩,可能这个淫比较腻害>_<", true) + if (Memberinfo.role === 'admin') { + if (!e.group.is_owner) return e.reply('人家又不是群主这种事做不到的辣!', true) + if (!e.isMaster && !e.member.is_owner) return e.reply('这个淫系管理员辣,只有主淫和群主才可以干ta', true) } + console.log(qq, TabooTime * Company) + await e.group.muteMember(qq, TabooTime * Company) + e.reply(`已把「${Memberinfo.card || Memberinfo.nickname}」扔进了小黑屋( ・_・)ノ⌒●~*`, true) + return true + } - //我要自闭 - async Autistic(e) { - //判断是否有管理 - if (!e.group.is_admin && !e.group.is_owner) return + /** 解禁 */ + async Relieve (e) { + // 判断权限 + if (!e.member.is_admin && !e.member.is_owner && !e.isMaster) return e.reply(PERMISSION_ERROR) + // 判断是否有管理 + if (!e.group.is_admin && !e.group.is_owner) return e.reply(ROLE_ERROR, true) - if (e.isMaster) return e.reply("别自闭啦~~", true) - if (e.member.is_admin && !e.group.is_owner) return e.reply("别自闭啦~~", true) - //解析正则 - let regRet = Autisticreg.exec(e.msg) - // 获取数字 - let TabooTime = common.translateChinaNum(regRet[2] || 5) + let qq = e.message.find(item => item.type == 'at')?.qq + if (!qq) qq = e.msg.replace(/#|解禁/g, '').trim() - let Company = common.Time_unit[lodash.toUpper(regRet[3]) || "分"] + if (!qq || !(/\d{5,}/.test(qq))) return e.reply('❎ 请输入正确的QQ号') - await e.group.muteMember(e.user_id, TabooTime * Company); - e.reply(`那我就不手下留情了~`, true); + let Member = e.group.pickMember(Number(qq)) + // 判断是否有这个人 + if (!Member.info) return e.reply('❎ 这个群没有这个人哦~') + + await e.group.muteMember(qq, 0) + e.reply(`已把「${Member.card || Member.nickname}」从小黑屋揪了出来(。>∀<。)`, true) + } + + /** 全体禁言 */ + async TabooAll (e) { + // 判断权限 + if (!e.member.is_admin && !e.member.is_owner && !e.isMaster) return e.reply(PERMISSION_ERROR) + // 判断是否有管理 + if (!e.group.is_admin && !e.group.is_owner) return e.reply(ROLE_ERROR, true) + + let type = /全体禁言/.test(e.msg) + let res = await e.group.muteAll(type) + if (!res) return e.reply('❎ 未知错误', true) + type ? e.reply('全都不准说话了哦~') : e.reply('好耶!!可以说话啦~') + } + + // 踢群员 + async Kick (e) { + // 判断权限 + if (!e.member.is_admin && !e.member.is_owner && !e.isMaster) return e.reply(PERMISSION_ERROR) + // 判断是否有管理 + if (!e.group.is_admin && !e.group.is_owner) return e.reply(ROLE_ERROR, true) + + let qq = e.message.find(item => item.type == 'at')?.qq + if (!qq) qq = e.msg.replace(/#|踢/g, '').trim() + + if (!qq || !(/\d{5,}/.test(qq))) return e.reply('❎ 请输入正确的QQ号') + // 判断是否为主人 + if (Config.masterQQ?.includes(Number(qq))) { + return e.reply('居然调戏主人!!!哼,坏蛋(ノ`⊿´)ノ') } - - //设置管理 - async SetAdmin(e) { - //判断权限 - if (!e.isMaster) return e.reply(Permission_ERROR) - if (!e.group.is_owner) return e.reply(ROLE_ERROR, true) - - let qq = e.message.find(item => item.type == "at")?.qq - let type = /设置管理/.test(e.msg) - if (!qq) qq = e.msg.replace(/#|(设置|取消)管理/g, "").trim(); - - if (!qq || !(/\d{5,}/.test(qq))) return e.reply("❎ 请输入正确的QQ号"); - let Member = e.group.pickMember(Number(qq)) - //判断是否有这个人 - if (!Member.info) return e.reply("❎ 这个群没有这个人哦~"); - - let res = await e.group.setAdmin(qq, type) - let name = Member.card || Member.nickname - if (!res) return e.reply(`❎ 未知错误`) - type ? e.reply(`已经把「${name}」设置为管理啦!!`) : e.reply(`「${name}」的管理已经被我吃掉啦~`) + let Memberinfo = e.group.pickMember(Number(qq)).info + // 判断是否有这个人 + if (!Memberinfo) return e.reply('❎ 这个群没有这个人哦~', true) + if (Memberinfo.role === 'owner') return e.reply('调戏群主拖出去枪毙5分钟(。>︿<)_θ', true) + if (Memberinfo.role === 'admin') { + if (!e.group.is_owner) return e.reply('人家又不是群主这种事做不到的辣!', true) + if (!e.isMaster && !e.member.is_owner) return e.reply('这个淫系管理员辣,只有主淫和群主才可以干ta', true) } + let res = await e.group.kickMember(Number(qq)) + res ? e.reply('已把这个坏淫踢掉惹!!!', true) : e.reply('额...踢出失败哩,可能这个淫比较腻害>_<', true) + } - //匿名 - async AllowAnony(e) { - //判断权限 - if (!e.member.is_admin && !e.member.is_owner && !e.isMaster) return e.reply(Permission_ERROR) - //判断是否有管理 - if (!e.group.is_admin && !e.group.is_owner) return e.reply(ROLE_ERROR, true); + // 我要自闭 + async Autistic (e) { + // 判断是否有管理 + if (!e.group.is_admin && !e.group.is_owner) return - let type = /(允许|开启)匿名/.test(e.msg) - let res = await e.group.allowAnony(type) - if (!res) return e.reply("❎ 未知错误", true) - type ? e.reply("已把匿名开启了哦,可以藏起来了~") : e.reply("已关闭匿名,小贼们不准藏了~") + if (e.isMaster) return e.reply('别自闭啦~~', true) + if (e.member.is_admin && !e.group.is_owner) return e.reply('别自闭啦~~', true) + // 解析正则 + let regRet = Autisticreg.exec(e.msg) + // 获取数字 + let TabooTime = common.translateChinaNum(regRet[2] || 5) + + let Company = common.Time_unit[lodash.toUpper(regRet[3]) || '分'] + + await e.group.muteMember(e.user_id, TabooTime * Company) + e.reply('那我就不手下留情了~', true) + } + + // 设置管理 + async SetAdmin (e) { + // 判断权限 + if (!e.isMaster) return e.reply(PERMISSION_ERROR) + if (!e.group.is_owner) return e.reply(ROLE_ERROR, true) + + let qq = e.message.find(item => item.type == 'at')?.qq + let type = /设置管理/.test(e.msg) + if (!qq) qq = e.msg.replace(/#|(设置|取消)管理/g, '').trim() + + if (!qq || !(/\d{5,}/.test(qq))) return e.reply('❎ 请输入正确的QQ号') + let Member = e.group.pickMember(Number(qq)) + // 判断是否有这个人 + if (!Member.info) return e.reply('❎ 这个群没有这个人哦~') + + let res = await e.group.setAdmin(qq, type) + let name = Member.card || Member.nickname + if (!res) return e.reply('❎ 未知错误') + type ? e.reply(`已经把「${name}」设置为管理啦!!`) : e.reply(`「${name}」的管理已经被我吃掉啦~`) + } + + // 匿名 + async AllowAnony (e) { + // 判断权限 + if (!e.member.is_admin && !e.member.is_owner && !e.isMaster) return e.reply(PERMISSION_ERROR) + // 判断是否有管理 + if (!e.group.is_admin && !e.group.is_owner) return e.reply(ROLE_ERROR, true) + + let type = /(允许|开启)匿名/.test(e.msg) + let res = await e.group.allowAnony(type) + if (!res) return e.reply('❎ 未知错误', true) + type ? e.reply('已把匿名开启了哦,可以藏起来了~') : e.reply('已关闭匿名,小贼们不准藏了~') + } + + // 发群公告 + async AddAnnounce (e) { + // 判断权限 + if (!e.member.is_admin && !e.member.is_owner && !e.isMaster) return e.reply(PERMISSION_ERROR) + // 判断是否有管理 + if (!e.group.is_admin && !e.group.is_owner) { + return e.reply(ROLE_ERROR, true) } + // 获取发送的内容 + let msg = e.msg.replace(/#|发群公告/g, '').trim() + if (!msg) return e.reply('❎ 公告不能为空') - //发群公告 - async AddAnnounce(e) { - //判断权限 - if (!e.member.is_admin && !e.member.is_owner && !e.isMaster) return e.reply(Permission_ERROR) - //判断是否有管理 - if (!e.group.is_admin && !e.group.is_owner) { - return e.reply(ROLE_ERROR, true); - } - //获取发送的内容 - let msg = e.msg.replace(/#|发群公告/g, "").trim() - if (!msg) return e.reply("❎ 公告不能为空"); + let result = await QQInterface.setAnnounce(e.group_id, msg) - let result = await QQInterface.setAnnounce(e.group_id, msg) - - if (!result) return e.reply(API_ERROR); - if (result.ec != 0) { - e.reply("❎ 发送失败\n" + JSON.stringify(result, null, '\t')) - } + if (!result) return e.reply(API_ERROR) + if (result.ec != 0) { + e.reply('❎ 发送失败\n' + JSON.stringify(result, null, '\t')) } - //查群公告 - async GetAnnounce(e) { - let res = await QQInterface.getAnnouncelist(e.group_id) - if (!res) return e.reply(API_ERROR); - return e.reply(res) + } + + // 查群公告 + async GetAnnounce (e) { + let res = await QQInterface.getAnnouncelist(e.group_id) + if (!res) return e.reply(API_ERROR) + return e.reply(res) + } + + // 删群公告 + async DelAnnounce (e) { + // 判断权限 + if (!e.member.is_admin && !e.member.is_owner && !e.isMaster) return e.reply(PERMISSION_ERROR) + // 判断是否有管理 + if (!e.group.is_admin && !e.group.is_owner) { + return e.reply(ROLE_ERROR, true) } - //删群公告 - async DelAnnounce(e) { - //判断权限 - if (!e.member.is_admin && !e.member.is_owner && !e.isMaster) return e.reply(Permission_ERROR) - //判断是否有管理 - if (!e.group.is_admin && !e.group.is_owner) { - return e.reply(ROLE_ERROR, true); - } - let msg = e.msg.replace(/#|删群公告/, "").trim() - if (!msg) return e.reply(`❎ 序号不可为空`) + let msg = e.msg.replace(/#|删群公告/, '').trim() + if (!msg) return e.reply('❎ 序号不可为空') - let result = await QQInterface.delAnnounce(e.group_id, msg) - if (!result) return e.reply(API_ERROR); - - if (result.ec == 0) { - e.reply(`✅ 已删除「${result.text}」`) - } else { - e.reply("❎ 删除失败\n" + JSON.stringify(result, null, '\t')) - } + let result = await QQInterface.delAnnounce(e.group_id, msg) + if (!result) return e.reply(API_ERROR) + if (result.ec == 0) { + e.reply(`✅ 已删除「${result.text}」`) + } else { + e.reply('❎ 删除失败\n' + JSON.stringify(result, null, '\t')) } + } - //修改头衔 - async adminsetTitle(e) { - if (!e.isMaster) return e.reply(Permission_ERROR) + // 修改头衔 + async adminsetTitle (e) { + if (!e.isMaster) return e.reply(PERMISSION_ERROR) - if (e.message.length < 2) return + if (e.message.length < 2) return - if (e.message[1].type != 'at') return + if (e.message[1].type != 'at') return - if (!e.group.is_owner) return e.reply(ROLE_ERROR, true) + if (!e.group.is_owner) return e.reply(ROLE_ERROR, true) - let res = await e.group.setTitle(e.message[1].qq, e.message[2].text) - if (res) { - e.reply(`已经把这个小可爱的头衔设置为「${e.message[2].text}」辣`) - } else { - e.reply(`额...没给上不知道发生了神魔`) - } + let res = await e.group.setTitle(e.message[1].qq, e.message[2].text) + if (res) { + e.reply(`已经把这个小可爱的头衔设置为「${e.message[2].text}」辣`) + } else { + e.reply('额...没给上不知道发生了神魔') } + } - //申请头衔 - async SetGroupSpecialTitle(e) { - let msgs = [ - "换上辣(´•ω•̥`)", - "嗯!不戳的头衔哦٩(๑•ㅂ•)۶", - "给你换上了哦(*^ワ^*)", - "又要换了吗,真是喜新厌旧呢( •̥́ ˍ •̀ू )", - "啾咪٩(๑•̀ω•́๑)۶", - "弃旧恋新了么笨蛋( 。ớ ₃ờ)ھ" - ] - if (!e.group.is_owner) return false; + // 申请头衔 + async SetGroupSpecialTitle (e) { + let msgs = [ + '换上辣(´•ω•̥`)', + '嗯!不戳的头衔哦٩(๑•ㅂ•)۶', + '给你换上了哦(*^ワ^*)', + '又要换了吗,真是喜新厌旧呢( •̥́ ˍ •̀ू )', + '啾咪٩(๑•̀ω•́๑)۶', + '弃旧恋新了么笨蛋( 。ớ ₃ờ)ھ' + ] + if (!e.group.is_owner) return false - let Title = e.msg.replace(/#|申请头衔/g, "") - //屏蔽词处理 - if (!e.isMaster) { - let data = Config.NoTitle - if (data.Match_pattern) { - let reg = new RegExp(lodash.compact(data.Shielding_words).join("|")) - if (reg.test(Title)) return e.reply("这里面有不好的词汇哦~", true) - } else { - if (data.Shielding_words.includes(Title)) return e.reply("这是有不好的词汇哦~", true) - } - } - let res = await e.group.setTitle(e.user_id, Title) - if (!res) return e.reply('❎ 未知错误', true) - - if (!Title) return e.reply(`什么"(º Д º*)!没有头衔,哼把你的头衔吃掉!!!`, true) - - e.reply(lodash.sample(msgs), true) + let Title = e.msg.replace(/#|申请头衔/g, '') + // 屏蔽词处理 + if (!e.isMaster) { + let data = Config.NoTitle + if (data.Match_pattern) { + let reg = new RegExp(lodash.compact(data.Shielding_words).join('|')) + if (reg.test(Title)) return e.reply('这里面有不好的词汇哦~', true) + } else { + if (data.Shielding_words.includes(Title)) return e.reply('这是有不好的词汇哦~', true) + } } + let res = await e.group.setTitle(e.user_id, Title) + if (!res) return e.reply('❎ 未知错误', true) - //字符列表 - async qun_luckylist(e) { - let data = await QQInterface.luckylist(e.group_id) - if (!data) return e.reply(API_ERROR) - if (data.retcode != 0) return e.reply('❎ 获取数据失败\n' + JSON.stringify(data)) + if (!Title) return e.reply('什么"(º Д º*)!没有头衔,哼把你的头衔吃掉!!!', true) - let msg = data.data.word_list.map((item, index) => { - let { wording, word_id, word_desc } = item.word_info - return `${index + 1}:${wording}-${word_id}\n寓意:${word_desc}` - }).join("\n"); - e.reply(msg) + e.reply(lodash.sample(msgs), true) + } + + // 字符列表 + async qun_luckylist (e) { + let data = await QQInterface.luckylist(e.group_id) + if (!data) return e.reply(API_ERROR) + if (data.retcode != 0) return e.reply('❎ 获取数据失败\n' + JSON.stringify(data)) + + let msg = data.data.word_list.map((item, index) => { + let { wording, word_id, word_desc } = item.word_info + return `${index + 1}:${wording}-${word_id}\n寓意:${word_desc}` + }).join('\n') + e.reply(msg) + } + + // 抽幸运字符 + async qun_lucky (e) { + let res = await QQInterface.drawLucky(e.group_id) + + if (!res) return e.reply(API_ERROR) + if (res.retcode == 11004) return e.reply('今天已经抽过辣,明天再来抽取吧') + if (res.retcode != 0) return e.reply('❎ 错误\n' + JSON.stringify(res.data)) + + if (res.data.word_info) { + let { wording, word_desc } = res.data.word_info.word_info + e.reply(`恭喜您抽中了${wording}\n寓意为:${word_desc}`) + } else { + e.reply('恭喜您抽了中了个寂寞') } - //抽幸运字符 - async qun_lucky(e) { - let res = await QQInterface.drawLucky(e.group_id); + } - if (!res) return e.reply(API_ERROR) - if (res.retcode == 11004) return e.reply("今天已经抽过辣,明天再来抽取吧"); - if (res.retcode != 0) return e.reply('❎ 错误\n' + JSON.stringify(data)) - - if (res.data.word_info) { - let { wording, word_desc } = res.data.word_info.word_info - e.reply(`恭喜您抽中了${wording}\n寓意为:${word_desc}`) - } else { - e.reply("恭喜您抽了中了个寂寞") - } + // 替换幸运字符 + async qun_luckyuse (e) { + if (!e.member.is_admin && !e.member.is_owner && !e.isMaster) return e.reply(PERMISSION_ERROR) + // 判断是否有管理 + if (!e.group.is_admin && !e.group.is_owner) { + return e.reply(ROLE_ERROR, true) } - //替换幸运字符 - async qun_luckyuse(e) { - if (!e.member.is_admin && !e.member.is_owner && !e.isMaster) return e.reply(Permission_ERROR) - //判断是否有管理 - if (!e.group.is_admin && !e.group.is_owner) { - return e.reply(ROLE_ERROR, true); - } - let id = e.msg.replace(/#|替换(幸运)?字符/g, ""); - let res = await QQInterface.equipLucky(e.group_id, id) + let id = e.msg.replace(/#|替换(幸运)?字符/g, '') + let res = await QQInterface.equipLucky(e.group_id, id) - if (!res) return e.reply(API_ERROR) - if (res.retcode != 0) return e.reply('❎替换失败\n' + JSON.stringify(res)); - e.reply('✅ OK') - } + if (!res) return e.reply(API_ERROR) + if (res.retcode != 0) return e.reply('❎替换失败\n' + JSON.stringify(res)) + e.reply('✅ OK') + } - //开启或关闭群字符 - async qun_luckyset(e) { - if (!e.member.is_admin && !e.member.is_owner && !e.isMaster) return e.reply(Permission_ERROR) + // 开启或关闭群字符 + async qun_luckyset (e) { + if (!e.member.is_admin && !e.member.is_owner && !e.isMaster) return e.reply(PERMISSION_ERROR) - let res = await QQInterface.swichLucky(e.group_id, /开启/.test(e.msg)) - if (!res) return e.reply(API_ERROR) + let res = await QQInterface.swichLucky(e.group_id, /开启/.test(e.msg)) + if (!res) return e.reply(API_ERROR) - if (res.retcode == 11111) return e.reply("❎ 重复开启或关闭") - if (res.retcode != 0) return e.reply('❎ 错误\n' + JSON.stringify(res)); - e.reply('✅ OK') - } + if (res.retcode == 11111) return e.reply('❎ 重复开启或关闭') + if (res.retcode != 0) return e.reply('❎ 错误\n' + JSON.stringify(res)) + e.reply('✅ OK') + } - //获取禁言列表 - async Mutelist(e) { - let mutelist = await ga.getMuteList(e.group_id) - if (!mutelist) return e.reply("还没有人被禁言欸(O∆O)") - let msg = []; - for (let i of mutelist) { - let Member = e.group.pickMember(i) - let { info } = Member - msg.push([ - segment.image(`https://q1.qlogo.cn/g?b=qq&s=100&nk=${info.user_id}`), + // 获取禁言列表 + async Mutelist (e) { + let mutelist = await ga.getMuteList(e.group_id) + if (!mutelist) return e.reply('还没有人被禁言欸(O∆O)') + let msg = [] + for (let i of mutelist) { + let Member = e.group.pickMember(i) + let { info } = Member + msg.push([ + segment.image(`https://q1.qlogo.cn/g?b=qq&s=100&nk=${info.user_id}`), `\n昵称:${info.card || info.nickname}\n`, `QQ:${info.user_id}\n`, `群身份:${common.ROLE_MAP[info.role]}\n`, `禁言剩余时间:${common.getsecondformat(Member.mute_left)}` - ]) - } - common.getforwardMsg(e, msg) + ]) + } + common.getforwardMsg(e, msg) + } + + // 解除全部禁言 + async relieveAllMute (e) { + if (!e.member.is_admin && !e.member.is_owner && !e.isMaster) return e.reply(PERMISSION_ERROR) + // 判断是否有管理 + if (!e.group.is_admin && !e.group.is_owner) return e.reply(ROLE_ERROR, true) + let res = await ga.releaseAllMute(e.group_id) + e.reply(res ? '已经把全部的禁言解除辣╮( •́ω•̀ )╭' : '都没有人被禁言我怎么解的辣\(`Δ’)/') + } + + // 查看和清理多久没发言的人 + async noactive (e) { + if (!e.member.is_admin && !e.member.is_owner && !e.isMaster) return e.reply(PERMISSION_ERROR) + let Reg = noactivereg.exec(e.msg) + Reg[2] = common.translateChinaNum(Reg[2] || 1) + // 确认清理直接执行 + if (Reg[1] == '确认清理') { + if (!e.group.is_admin && !e.group.is_owner) return e.reply(ROLE_ERROR, true) + let msg = ga.clearNoactive(e.group_id, Reg[2], Reg[3]) + return common.getforwardMsg(e, msg) + } + // 查看和清理都会发送列表 + let page = common.translateChinaNum(Reg[5] || 1) + let msg = await ga.getNoactiveInfo(e.group_id, Reg[2], Reg[3], page) + if (msg?.error) return e.reply(msg.error) + // 清理 + if (Reg[1] == '清理') { + if (!e.group.is_admin && !e.group.is_owner) return e.reply(ROLE_ERROR, true) + let list = await ga.noactiveList(e.group_id, Reg[2], Reg[3]) + e.reply(`本此共需清理「${list.length}」人,防止误触发\n请发送:#确认清理${Reg[2]}${Reg[3]}没发言的人`) + } + common.getforwardMsg(e, msg) + } + + // 查看和清理从未发言的人 + async neverspeak (e) { + if (!e.member.is_admin && !e.member.is_owner && !e.isMaster) return e.reply(PERMISSION_ERROR) + let list = await ga.getNeverSpeak(e.group_id) + if (!list) return e.reply('咋群全是好淫哦~全都发过言辣٩(๑•̀ω•́๑)۶') + // 确认清理直接执行 + if (/^#?确认清理/.test(e.msg)) { + if (!e.group.is_admin && !e.group.is_owner) return e.reply(ROLE_ERROR, true) + e.reply('我要开始清理了哦,这可能需要一点时间٩(๑•ㅂ•)۶') + let msg = await ga.BatchKickMember(e.group_id, list.map(item => item.user_id)) + return common.getforwardMsg(e, msg) + } + // 清理 + if (/^#?清理/.test(e.msg)) { + if (!e.group.is_admin && !e.group.is_owner) { + return e.reply(ROLE_ERROR, true) + } + e.reply(`本此共需清理「${list.length}」人,防止误触发\n请发送:#确认清理从未发言的人`) + } + // 发送列表 + let page = e.msg.match(new RegExp(Numreg)) + page = page ? common.translateChinaNum(page[0]) : 1 + let listInfo = await ga.getNeverSpeakInfo(e.group_id, page) + if (listInfo.error) return e.reply(listInfo.error) + common.getforwardMsg(e, listInfo) + } + + // 查看不活跃排行榜和入群记录 + async RankingList (e) { + let num = e.msg.match(new RegExp(Numreg)) + num = num ? common.translateChinaNum(num[0]) : 10 + let msg = '' + if (/(不活跃|潜水)/.test(e.msg)) { + msg = await ga.InactiveRanking(e.group_id, num) + } else { + msg = await ga.getRecentlyJoined(e.group_id, num) + } + common.getforwardMsg(e, msg) + } + + // 发送通知 + async Send_notice (e) { + if (!e.member.is_admin && !e.member.is_owner && !e.isMaster) return e.reply(PERMISSION_ERROR) + if (!e.group.is_admin && !e.group.is_owner) return e.reply(ROLE_ERROR, true) + + e.message[0].text = e.message[0].text.replace('#发通知', '').trim() + if (!e.message[0].text) e.message.shift() + if (lodash.isEmpty(e.message)) return e.reply('❎ 通知不能为空') + e.message.unshift(segment.at('all')) + e.reply(e.message) + } + + // 设置定时群禁言 + async timeMute (e) { + if (!e.member.is_admin && !e.member.is_owner && !e.isMaster) return e.reply(PERMISSION_ERROR) + let type = /禁言/.test(e.msg) + if (/任务/.test(e.msg)) { + let task = ga.getMuteTask() + if (!task.length) return e.reply('目前还没有定时禁言任务') + return common.getforwardMsg(e, task) + } + if (/取消/.test(e.msg)) { + ga.delMuteTask(e.group_id, type) + return e.reply(`已取消本群定时${type ? '禁言' : '解禁'}`) + } + if (!e.group.is_admin && !e.group.is_owner) return e.reply(ROLE_ERROR, true) + + let RegRet = e.msg.match(/定时(禁言|解禁)((\d{1,2})(:|:)(\d{1,2})|.*)/) + if (!RegRet || !RegRet[2]) return e.reply(`格式不对\n示范:#定时${type ? '禁言' : '解禁'}00:00 或 #定时${type ? '禁言' : '解禁'} + cron表达式`) + let cron = '' + if (RegRet[3] && RegRet[5]) { + cron = `0 ${RegRet[5]} ${RegRet[3]} * * ?` + } else { + cron = RegRet[2] + // 校验cron表达式 + let Validate = CronValidate(cron.trim()) + if (Validate !== true) return e.reply(Validate) } - //解除全部禁言 - async relieveAllMute(e) { - if (!e.member.is_admin && !e.member.is_owner && !e.isMaster) return e.reply(Permission_ERROR) - //判断是否有管理 - if (!e.group.is_admin && !e.group.is_owner) return e.reply(ROLE_ERROR, true); - let res = await ga.releaseAllMute(e.group_id) - e.reply(res ? "已经把全部的禁言解除辣╮( •́ω•̀ )╭" : "都没有人被禁言我怎么解的辣\(`Δ’)/") - } + let res = await ga.setMuteTask(e.group_id, cron, type) - //查看和清理多久没发言的人 - async noactive(e) { - if (!e.member.is_admin && !e.member.is_owner && !e.isMaster) return e.reply(Permission_ERROR) - let Reg = noactivereg.exec(e.msg) - Reg[2] = common.translateChinaNum(Reg[2] || 1) - //确认清理直接执行 - if (Reg[1] == "确认清理") { - if (!e.group.is_admin && !e.group.is_owner) return e.reply(ROLE_ERROR, true); - let msg = ga.clearNoactive(e.group_id, Reg[2], Reg[3]) - return common.getforwardMsg(e, msg) - } - //查看和清理都会发送列表 - let page = common.translateChinaNum(Reg[5] || 1) - let msg = await ga.getNoactiveInfo(e.group_id, Reg[2], Reg[3], page) - if (msg?.error) return e.reply(msg.error) - //清理 - if (Reg[1] == "清理") { - if (!e.group.is_admin && !e.group.is_owner) return e.reply(ROLE_ERROR, true); - let list = await ga.noactiveList(e.group_id, Reg[2], Reg[3]) - e.reply(`本此共需清理「${list.length}」人,防止误触发\n请发送:#确认清理${Reg[2]}${Reg[3]}没发言的人`) - } - common.getforwardMsg(e, msg) - } + res + ? e.reply('✅设置定时禁言成功,可发【#定时禁言任务】查看') + : e.reply(`❎ 该群定时${type ? '禁言' : '解禁'}已存在不可重复设置`) + } - //查看和清理从未发言的人 - async neverspeak(e) { - if (!e.member.is_admin && !e.member.is_owner && !e.isMaster) return e.reply(Permission_ERROR) - let list = await ga.getNeverSpeak(e.group_id) - if (!list) return e.reply(`咋群全是好淫哦~全都发过言辣٩(๑•̀ω•́๑)۶`) - //确认清理直接执行 - if (/^#?确认清理/.test(e.msg)) { - if (!e.group.is_admin && !e.group.is_owner) return e.reply(ROLE_ERROR, true); - e.reply("我要开始清理了哦,这可能需要一点时间٩(๑•ㅂ•)۶") - let msg = await ga.BatchKickMember(e.group_id, list.map(item => item.user_id)) - return common.getforwardMsg(e, msg) - } - //清理 - if (/^#?清理/.test(e.msg)) { - if (!e.group.is_admin && !e.group.is_owner) { - return e.reply(ROLE_ERROR, true); - } - e.reply(`本此共需清理「${list.length}」人,防止误触发\n请发送:#确认清理从未发言的人`) - } - //发送列表 - let page = e.msg.match(new RegExp(Numreg)) - page = page ? common.translateChinaNum(page[0]) : 1 - let listInfo = await ga.getNeverSpeakInfo(e.group_id, page) - if (listInfo.error) return e.reply(listInfo.error); - common.getforwardMsg(e, listInfo) - } - - //查看不活跃排行榜和入群记录 - async RankingList(e) { - let num = e.msg.match(new RegExp(Numreg)) - num = num ? common.translateChinaNum(num[0]) : 10 - let msg = ''; - if (/(不活跃|潜水)/.test(e.msg)) { - msg = await ga.InactiveRanking(e.group_id, num) - } else { - msg = await ga.getRecentlyJoined(e.group_id, num) - } - common.getforwardMsg(e, msg) - } - //发送通知 - async Send_notice(e) { - if (!e.member.is_admin && !e.member.is_owner && !e.isMaster) return e.reply(Permission_ERROR) - if (!e.group.is_admin && !e.group.is_owner) return e.reply(ROLE_ERROR, true); - - e.message[0].text = e.message[0].text.replace("#发通知", "").trim() - if (!e.message[0].text) e.message.shift() - if (lodash.isEmpty(e.message)) return e.reply("❎ 通知不能为空") - e.message.unshift(segment.at("all")) - e.reply(e.message) - } - - - //设置定时群禁言 - async timeMute(e) { - if (!e.member.is_admin && !e.member.is_owner && !e.isMaster) return e.reply(Permission_ERROR) - let type = /禁言/.test(e.msg) - if (/任务/.test(e.msg)) { - let task = ga.getMuteTask() - if (!task.length) return e.reply('目前还没有定时禁言任务') - return common.getforwardMsg(e, task) - } - if (/取消/.test(e.msg)) { - ga.delMuteTask(e.group_id, type) - return e.reply(`已取消本群定时${type ? "禁言" : "解禁"}`) - } - if (!e.group.is_admin && !e.group.is_owner) return e.reply(ROLE_ERROR, true); - - let RegRet = e.msg.match(/定时(禁言|解禁)((\d{1,2})(:|:)(\d{1,2})|.*)/) - if (!RegRet || !RegRet[2]) return e.reply(`格式不对\n示范:#定时${type ? "禁言" : "解禁"}00:00 或 #定时${type ? "禁言" : "解禁"} + cron表达式`) - let cron = '' - if (RegRet[3] && RegRet[5]) { - cron = `0 ${RegRet[5]} ${RegRet[3]} * * ?` - } else { - cron = RegRet[2] - //校验cron表达式 - let Validate = CronValidate(cron.trim()) - if (Validate !== true) return e.reply(Validate) - } - - let res = await ga.setMuteTask(e.group_id, cron, type) - - res ? - e.reply(`✅设置定时禁言成功,可发【#定时禁言任务】查看`) : - e.reply(`❎ 该群定时${type ? "禁言" : "解禁"}已存在不可重复设置`) - - } - - //谁是龙王 - async dragonKing(e) { - //浏览器截图 - let screenshot = await puppeteer.Webpage({ - url: `https://qun.qq.com/interactive/honorlist?gc=${e.group_id}&type=1&_wv=3&_wwv=129`, - headers: { "Cookie": Bot.cookies['qun.qq.com'] }, - font: true - }) - if (screenshot) return e.reply(screenshot) - //数据版 - let res = await QQInterface.dragon(e.group_id) - if (!res) return e.reply(API_ERROR) - e.reply([ + // 谁是龙王 + async dragonKing (e) { + // 浏览器截图 + let screenshot = await puppeteer.Webpage({ + url: `https://qun.qq.com/interactive/honorlist?gc=${e.group_id}&type=1&_wv=3&_wwv=129`, + headers: { Cookie: Bot.cookies['qun.qq.com'] }, + font: true + }) + if (screenshot) return e.reply(screenshot) + // 数据版 + let res = await QQInterface.dragon(e.group_id) + if (!res) return e.reply(API_ERROR) + e.reply([ `本群龙王:${res.nick}`, segment.image(`https://q1.qlogo.cn/g?b=qq&s=100&nk=${res.uin}`), - `蝉联天数:${res.avatar_size}`, - ]); - } + `蝉联天数:${res.avatar_size}` + ]) + } - /**群星级 */ - async Group_xj(e) { - let screenshot = await puppeteer.Webpage({ - url: `https://qqweb.qq.com/m/business/qunlevel/index.html?gc=${e.group_id}&from=0&_wv=1027`, - cookie: common.getck('qqweb.qq.com', true), - emulate: "QQTheme", - font: true, - }) - if (screenshot) return e.reply(screenshot) - //出错后发送数据 - let result = await QQInterface.getCreditLevelInfo(e.group_id) - if (!result) return e.reply(API_ERROR) - if (result.ec != 0) return e.reply("❎ 查询错误\n" + JSON.stringify(result)) - let { uiGroupLevel, group_name, group_uin } = result.info - let str = "⭐" - str = str.repeat(uiGroupLevel) - e.reply([ + /** 群星级 */ + async Group_xj (e) { + let screenshot = await puppeteer.Webpage({ + url: `https://qqweb.qq.com/m/business/qunlevel/index.html?gc=${e.group_id}&from=0&_wv=1027`, + cookie: common.getck('qqweb.qq.com', true), + emulate: 'QQTheme', + font: true + }) + if (screenshot) return e.reply(screenshot) + // 出错后发送数据 + let result = await QQInterface.getCreditLevelInfo(e.group_id) + if (!result) return e.reply(API_ERROR) + if (result.ec != 0) return e.reply('❎ 查询错误\n' + JSON.stringify(result)) + let { uiGroupLevel, group_name, group_uin } = result.info + let str = '⭐' + str = str.repeat(uiGroupLevel) + e.reply([ `群名:${group_name}\n`, `群号:${group_uin}\n`, `群星级:${str}` - ]) - } + ]) + } - //群发言榜单 - async SpeakRank(e) { - if (!e.group.is_admin && !e.group.is_owner) return e.reply(ROLE_ERROR, true); + // 群发言榜单 + async SpeakRank (e) { + if (!e.group.is_admin && !e.group.is_owner) return e.reply(ROLE_ERROR, true) - //图片截图 - let screenshot = await puppeteer.Webpage({ - url: `https://qun.qq.com/m/qun/activedata/speaking.html?gc=${e.group_id}&time=${/(7|七)天/.test(e.msg) ? 1 : 0}`, - headers: { "Cookie": Bot.cookies['qun.qq.com'] }, - font: true - }) - if (screenshot) return e.reply(screenshot) - //出错后发送文字数据 - let res = await QQInterface.SpeakRank(e.group_id, /(7|七)天/.test(e.msg)) - if (!res) return e.reply(API_ERROR) - if (res.retcode != 0) return e.reply("❎ 未知错误\n" + JSON.stringify(res)) - let msg = lodash.take(res.data.speakRank.map((item, index) => + // 图片截图 + let screenshot = await puppeteer.Webpage({ + url: `https://qun.qq.com/m/qun/activedata/speaking.html?gc=${e.group_id}&time=${/(7|七)天/.test(e.msg) ? 1 : 0}`, + headers: { Cookie: Bot.cookies['qun.qq.com'] }, + font: true + }) + if (screenshot) return e.reply(screenshot) + // 出错后发送文字数据 + let res = await QQInterface.SpeakRank(e.group_id, /(7|七)天/.test(e.msg)) + if (!res) return e.reply(API_ERROR) + if (res.retcode != 0) return e.reply('❎ 未知错误\n' + JSON.stringify(res)) + let msg = lodash.take(res.data.speakRank.map((item, index) => `${index + 1}:${item.nickname}-${item.uin}\n连续活跃${item.active}天:发言${item.msgCount}次` - ), 10).join("\n"); - e.reply(msg) + ), 10).join('\n') + e.reply(msg) + } + + // 今日打卡 + async DaySigned (e) { + // 浏览器截图 + let screenshot = await puppeteer.Webpage({ + url: `https://qun.qq.com/v2/signin/list?gc=${e.group_id}`, + emulate: 'iPhone 6', + cookie: common.getck('qun.qq.com', true), + font: true + }) + if (screenshot) return e.reply(screenshot) + // 出错后使用接口 + let res = await QQInterface.signInToday(e.group_id) + if (!res) return e.reply(API_ERROR) + if (res.retCode != 0) return e.reply('❎ 未知错误\n' + JSON.stringify(res)) + + let list = res.response.page[0] + if (list.total == 0) return e.reply('今天还没有人打卡哦( ̄▽ ̄)"') + // 发送消息 + let msg = list.infos.map((item, index) => `${index + 1}:${item.uidGroupNick}-${item.uid}\n打卡时间:${moment(item.signedTimeStamp * 1000).format('YYYY-MM-DD HH:mm:ss')}`).join('\n') + e.reply(msg) + } + + // 查看某天谁生日 + async groupBirthday (e) { + let date = e.msg.match(/^#?(今天|昨天|明天|后天|\d{4}-\d{1,2}-\d{1,2})谁生日$/)[1] + if (date == '昨天') { + date = moment().subtract(1, 'days').format('YYYY-MM-DD') + } else if (date == '前天') { + date = moment().subtract(2, 'days').format('YYYY-MM-DD') + } else if (date == '明天') { + date = moment().add(1, 'days').format('YYYY-MM-DD') + } else if (date == '后天') { + date = moment().add(2, 'days').format('YYYY-MM-DD') + } else if (date == '今天') { + date = moment().format('YYYY-MM-DD') } + e.reply( + await puppeteer.Webpage({ + url: `https://qun.qq.com/qqweb/m/qun/calendar/detail.html?_wv=1031&_bid=2340&src=3&gc=${e.group_id}&type=2&date=${date}`, + cookie: common.getck('qun.qq.com', true), + emulate: 'iPhone 6', + font: true + }) + ) + } - //今日打卡 - async DaySigned(e) { - //浏览器截图 - let screenshot = await puppeteer.Webpage({ - url: `https://qun.qq.com/v2/signin/list?gc=${e.group_id}`, - emulate: "iPhone 6", - cookie: common.getck('qun.qq.com', true), - font: true - }) - if (screenshot) return e.reply(screenshot) - //出错后使用接口 - let res = await QQInterface.signInToday(e.group_id) - if (!res) return e.reply(API_ERROR) - if (res.retCode != 0) return e.reply("❎ 未知错误\n" + JSON.stringify(res)); + // 群数据 + async groupData (e) { + if (!e.group.is_admin && !e.group.is_owner) return e.reply(ROLE_ERROR, true) - let list = res.response.page[0] - if (list.total == 0) return e.reply("今天还没有人打卡哦( ̄▽ ̄)\"") - //发送消息 - let msg = list.infos.map((item, index) => `${index + 1}:${item.uidGroupNick}-${item.uid}\n打卡时间:${moment(item.signedTimeStamp * 1000).format("YYYY-MM-DD HH:mm:ss")}`).join("\n"); - e.reply(msg) - } - - //查看某天谁生日 - async groupBirthday(e) { - let date = e.msg.match(/^#?(今天|昨天|明天|后天|\d{4}-\d{1,2}-\d{1,2})谁生日$/)[1] - if (date == '昨天') { - date = moment().subtract(1, 'days').format("YYYY-MM-DD"); - } else if (date == '前天') { - date = moment().subtract(2, 'days').format("YYYY-MM-DD"); - } else if (date == '明天') { - date = moment().add(1, 'days').format("YYYY-MM-DD"); - } else if (date == '后天') { - date = moment().add(2, 'days').format("YYYY-MM-DD"); - } else if (date == '今天') { - date = moment().format("YYYY-MM-DD"); - } - e.reply( - await puppeteer.Webpage({ - url: `https://qun.qq.com/qqweb/m/qun/calendar/detail.html?_wv=1031&_bid=2340&src=3&gc=${e.group_id}&type=2&date=${date}`, - cookie: common.getck('qun.qq.com', true), - emulate: "iPhone 6", - font: true - }) - ) - } - - //群数据 - async groupData(e) { - if (!e.group.is_admin && !e.group.is_owner) return e.reply(ROLE_ERROR, true); - - //浏览器截图 - let screenshot = await puppeteer.Webpage({ - url: `https://qun.qq.com/m/qun/activedata/active.html?_wv=3&_wwv=128&gc=${e.group_id}&src=2`, - cookie: common.getck('qun.qq.com', true), - click: /(7|七)天/.test(e.msg) ? [ - { - selector: "#app > div.tabbar > div.tabbar__time > div.tabbar__time__date", - time: 500, - }, - { - selector: "#app > div.tabbar > div.tabbar__date-selector > div > div:nth-child(3)", - time: 1000, - } - ] : false, - font: true - }) - if (screenshot) return e.reply(screenshot) - //数据 - let res = await QQInterface.groupData(e.group_id, /(7|七)天/.test(e.msg)) - if (!res) return e.reply(API_ERROR) - if (res.retcode != 0) return e.reply(res.msg || JSON.stringify(res)) - let { groupInfo, activeData, msgInfo, joinData, exitData, applyData } = res.data - e.reply( - [ - `${groupInfo.groupName}(${groupInfo.groupCode})${/(7|七)天/.test(e.msg) ? "七天" : "昨天"}的群数据\n`, - `------------消息条数---------\n`, + // 浏览器截图 + let screenshot = await puppeteer.Webpage({ + url: `https://qun.qq.com/m/qun/activedata/active.html?_wv=3&_wwv=128&gc=${e.group_id}&src=2`, + cookie: common.getck('qun.qq.com', true), + click: /(7|七)天/.test(e.msg) + ? [ + { + selector: '#app > div.tabbar > div.tabbar__time > div.tabbar__time__date', + time: 500 + }, + { + selector: '#app > div.tabbar > div.tabbar__date-selector > div > div:nth-child(3)', + time: 1000 + } + ] + : false, + font: true + }) + if (screenshot) return e.reply(screenshot) + // 数据 + let res = await QQInterface.groupData(e.group_id, /(7|七)天/.test(e.msg)) + if (!res) return e.reply(API_ERROR) + if (res.retcode != 0) return e.reply(res.msg || JSON.stringify(res)) + let { groupInfo, activeData, msgInfo, joinData, exitData, applyData } = res.data + e.reply( + [ + `${groupInfo.groupName}(${groupInfo.groupCode})${/(7|七)天/.test(e.msg) ? '七天' : '昨天'}的群数据\n`, + '------------消息条数---------\n', `消息条数:${msgInfo.total}\n`, - `------------活跃人数---------\n`, + '------------活跃人数---------\n', `活跃人数:${activeData.activeData}\n`, `总人数:${activeData.groupMember}\n`, `活跃比例:${activeData.ratio}%\n`, - `-----------加退群人数--------\n`, + '-----------加退群人数--------\n', `申请人数:${joinData.total}\n`, `入群人数:${applyData.total}\n`, - `退群人数:${exitData.total}\n`, - ] - ) - } + `退群人数:${exitData.total}\n` + ] + ) + } - async handleGroupAdd(e) { - if (!e.member.is_admin && !e.member.is_owner && !e.isMaster) return e.reply(Permission_ERROR) - if (!e.group.is_admin && !e.group.is_owner) return e.reply(ROLE_ERROR, true); - let path = `./plugins/yenai-plugin/config/config/groupAdd.yaml` - let yaml = new YamlReader(path) - let type = /开启/.test(e.msg) - let key = Config.groupAdd.openGroup.indexOf(e.group_id) - console.log(key != -1 && type); - if (key != -1 && type) return e.reply("❎ 本群加群申请通知已处于开启状态") - if (key == -1 && !type) return e.reply("❎ 本群暂未开启加群申请通知") - if (type) { - yaml.addIn('openGroup', e.group_id) - } else { - yaml.delete(`openGroup.${key}`) - } - e.reply(`✅ 已${type ? "开启" : "关闭"}「${e.group_id}」的加群申请通知`) + async handleGroupAdd (e) { + if (!e.member.is_admin && !e.member.is_owner && !e.isMaster) return e.reply(PERMISSION_ERROR) + if (!e.group.is_admin && !e.group.is_owner) return e.reply(ROLE_ERROR, true) + let path = './plugins/yenai-plugin/config/config/groupAdd.yaml' + let yaml = new YamlReader(path) + let type = /开启/.test(e.msg) + let key = Config.groupAdd.openGroup.indexOf(e.group_id) + console.log(key != -1 && type) + if (key != -1 && type) return e.reply('❎ 本群加群申请通知已处于开启状态') + if (key == -1 && !type) return e.reply('❎ 本群暂未开启加群申请通知') + if (type) { + yaml.addIn('openGroup', e.group_id) + } else { + yaml.delete(`openGroup.${key}`) } + e.reply(`✅ 已${type ? '开启' : '关闭'}「${e.group_id}」的加群申请通知`) + } } diff --git a/apps/groupverify.js b/apps/groupverify.js index 53ad5a9..7013c28 100644 --- a/apps/groupverify.js +++ b/apps/groupverify.js @@ -1,12 +1,12 @@ import plugin from '../../../lib/plugins/plugin.js' -import { segment } from "oicq"; -import { Config } from "../components/index.js" +import { segment } from 'oicq' +import { Config } from '../components/index.js' import { YamlReader, common, GroupAdmin as ga } from '../model/index.js' -//全局 -let temp = {}; -const ops = ["+", "-"]; +// 全局 +let temp = {} +const ops = ['+', '-'] export class NEWCMD extends plugin { - constructor() { + constructor () { super({ name: '椰奶入群验证', dsc: '重新验证和绕过验证', @@ -14,11 +14,11 @@ export class NEWCMD extends plugin { priority: 5, rule: [ { - reg: '^#重新验证(\d+|从未发言的人)?$', + reg: '^#重新验证(\\d+|从未发言的人)?$', fnc: 'cmdReverify' }, { - reg: '^#绕过验证(\d+)?$', + reg: '^#绕过验证(\\d+)?$', fnc: 'cmdPass' }, { @@ -35,122 +35,120 @@ export class NEWCMD extends plugin { } ] }) - this.verifypath = `./plugins/yenai-plugin/config/config/groupverify.yaml`; + this.verifypath = './plugins/yenai-plugin/config/config/groupverify.yaml' } - //重新验证 - async cmdReverify(e) { + + // 重新验证 + async cmdReverify (e) { if (e?.group?.mute_left > 0) return let verifycfg = Config.verifycfg - if (!e.group.is_admin && !e.group.is_owner) return e.reply("做不到,怎么想我都做不到吧ヽ(≧Д≦)ノ", true); + if (!e.group.is_admin && !e.group.is_owner) return e.reply('做不到,怎么想我都做不到吧ヽ(≧Д≦)ノ', true) - if (!verifycfg.openGroup.includes(e.group_id)) return e.reply("当前群未开启验证哦~", true); + if (!verifycfg.openGroup.includes(e.group_id)) return e.reply('当前群未开启验证哦~', true) - if (!e.isMaster && !e.member.is_owner && !e.member.is_admin) return e.reply("❎ 该命令仅限管理员可用", true); + if (!e.isMaster && !e.member.is_owner && !e.member.is_admin) return e.reply('❎ 该命令仅限管理员可用', true) - let qq = e.message.find(item => item.type == "at")?.qq - if (!qq) qq = e.msg.replace(/#|重新验证/g, "").trim(); + let qq = e.message.find(item => item.type == 'at')?.qq + if (!qq) qq = e.msg.replace(/#|重新验证/g, '').trim() - if (qq == "从未发言的人") return this.cmdReverifyNeverSpeak(e) + if (qq == '从未发言的人') return this.cmdReverifyNeverSpeak(e) - if (!(/\d{5,}/.test(qq))) return e.reply("❎ 请输入正确的QQ号"); - qq = Number(qq); + if (!(/\d{5,}/.test(qq))) return e.reply('❎ 请输入正确的QQ号') + qq = Number(qq) if (qq == Bot.uin) return - if (Config.masterQQ.includes(qq)) return e.reply("❎ 该命令对机器人管理员无效"); + if (Config.masterQQ.includes(qq)) return e.reply('❎ 该命令对机器人管理员无效') - if (temp[qq + e.group_id]) return e.reply("❎ 目标群成员处于验证状态"); + if (temp[qq + e.group_id]) return e.reply('❎ 目标群成员处于验证状态') await verify(qq, e.group_id, e) } - //绕过验证 - async cmdPass(e) { + + // 绕过验证 + async cmdPass (e) { let verifycfg = Config.verifycfg - if (!e.group.is_admin && !e.group.is_owner) return e.reply("做不到,怎么想我都做不到吧ヽ(≧Д≦)ノ", true); + if (!e.group.is_admin && !e.group.is_owner) return e.reply('做不到,怎么想我都做不到吧ヽ(≧Д≦)ノ', true) - if (!verifycfg.openGroup.includes(e.group_id)) return e.reply("当前群未开启验证哦~", true); + if (!verifycfg.openGroup.includes(e.group_id)) return e.reply('当前群未开启验证哦~', true) - if (!e.isMaster && !e.member.is_owner && !e.member.is_admin) return e.reply("❎ 该命令仅限管理员可用", true); + if (!e.isMaster && !e.member.is_owner && !e.member.is_admin) return e.reply('❎ 该命令仅限管理员可用', true) - let qq = e.message.find(item => item.type == "at")?.qq - if (!qq) qq = e.msg.replace(/#|绕过验证/g, "").trim(); + let qq = e.message.find(item => item.type == 'at')?.qq + if (!qq) qq = e.msg.replace(/#|绕过验证/g, '').trim() - if (!(/\d{5,}/.test(qq))) return e.reply("❎ 请输入正确的QQ号"); + if (!(/\d{5,}/.test(qq))) return e.reply('❎ 请输入正确的QQ号') if (qq == Bot.uin) return - qq = Number(qq); - if (!temp[qq + e.group_id]) return e.reply("❎ 目标群成员当前无需验证"); + qq = Number(qq) + if (!temp[qq + e.group_id]) return e.reply('❎ 目标群成员当前无需验证') - clearTimeout(temp[qq + e.group_id].kickTimer); + clearTimeout(temp[qq + e.group_id].kickTimer) - clearTimeout(temp[qq + e.group_id].remindTimer); + clearTimeout(temp[qq + e.group_id].remindTimer) - delete temp[qq + e.group_id]; + delete temp[qq + e.group_id] - return await e.reply(verifycfg.SuccessMsgs[e.group_id] || verifycfg.SuccessMsgs[0] || "✅ 验证成功,欢迎入群"); + return await e.reply(verifycfg.SuccessMsgs[e.group_id] || verifycfg.SuccessMsgs[0] || '✅ 验证成功,欢迎入群') } - async cmdReverifyNeverSpeak(e) { + async cmdReverifyNeverSpeak (e) { let list = await ga.getNeverSpeak(e.group_id) - if (!list) return e.reply("咋群全是好淫哦~全都发过言辣٩(๑•̀ω•́๑)۶") + if (!list) return e.reply('咋群全是好淫哦~全都发过言辣٩(๑•̀ω•́๑)۶') for (let item of list) { await verify(item.user_id, e.group_id, e) await common.sleep(2000) } } - //开启验证 - async handelverify(e) { - if (!e.isMaster && !e.member.is_owner && !e.member.is_admin) return e.reply("❎ 该命令仅限管理员可用", true); - if (!e.group.is_admin && !e.group.is_owner) return e.reply("做不到,怎么想我都做不到吧ヽ(≧Д≦)ノ", true); + // 开启验证 + async handelverify (e) { + if (!e.isMaster && !e.member.is_owner && !e.member.is_admin) return e.reply('❎ 该命令仅限管理员可用', true) + if (!e.group.is_admin && !e.group.is_owner) return e.reply('做不到,怎么想我都做不到吧ヽ(≧Д≦)ノ', true) let verifycfg = Config.verifycfg let type = /开启/.test(e.msg) let key = verifycfg.openGroup.indexOf(e.group_id) - if (key != -1 && type) return e.reply("❎ 本群验证已处于开启状态") - if (key == -1 && !type) return e.reply("❎ 本群暂未开启验证") + if (key != -1 && type) return e.reply('❎ 本群验证已处于开启状态') + if (key == -1 && !type) return e.reply('❎ 本群暂未开启验证') let yaml = new YamlReader(this.verifypath) if (type) { yaml.addIn('openGroup', e.group_id) } else { - yaml.delete(`openGroup.${key}`) } - e.reply(`✅ 已${type ? "开启" : "关闭"}本群验证`) + e.reply(`✅ 已${type ? '开启' : '关闭'}本群验证`) } - //切换验证模式 - async setmode(e) { - if (!e.isMaster) return e.reply("❎ 该命令仅限主人可用", true); + // 切换验证模式 + async setmode (e) { + if (!e.isMaster) return e.reply('❎ 该命令仅限主人可用', true) let verifycfg = Config.verifycfg - let value = verifycfg.mode == "模糊" ? "精确" : "模糊" - new YamlReader(this.verifypath).set(`mode`, value) + let value = verifycfg.mode == '模糊' ? '精确' : '模糊' + new YamlReader(this.verifypath).set('mode', value) e.reply(`✅ 已切换验证模式为${value}验证`) } - //设置验证超时时间 - async setovertime(e) { - if (!e.isMaster) return e.reply("❎ 该命令仅限主人可用", true); + + // 设置验证超时时间 + async setovertime (e) { + if (!e.isMaster) return e.reply('❎ 该命令仅限主人可用', true) let overtime = e.msg.match(/\d+/g) - new YamlReader(this.verifypath).set("time", Number(overtime)) + new YamlReader(this.verifypath).set('time', Number(overtime)) e.reply(`✅ 已将验证超时时间设置为${overtime}秒`) if (overtime < 60) { - e.reply(`建议至少一分钟(60秒)哦ε(*´・ω・)з`) + e.reply('建议至少一分钟(60秒)哦ε(*´・ω・)з') } } } - - - - -//进群监听 -Bot.on("notice.group.increase", async (e) => { +// 进群监听 +Bot.on('notice.group.increase', async (e) => { let verifycfg = Config.verifycfg - if (!verifycfg.openGroup.includes(e.group_id)) return; + if (!verifycfg.openGroup.includes(e.group_id)) return - if (!e.group.is_admin && !e.group.is_owner) return; + if (!e.group.is_admin && !e.group.is_owner) return if (e.user_id == Bot.uin) return @@ -161,116 +159,112 @@ Bot.on("notice.group.increase", async (e) => { await verify(e.user_id, e.group_id, e) }) -//答案监听 +// 答案监听 Bot.on('message.group', async (e) => { let verifycfg = Config.verifycfg - if (!verifycfg.openGroup.includes(e.group_id)) return; + if (!verifycfg.openGroup.includes(e.group_id)) return - if (!e.group.is_admin && !e.group.is_owner) return; + if (!e.group.is_admin && !e.group.is_owner) return - if (!temp[e.user_id + e.group_id]) return; + if (!temp[e.user_id + e.group_id]) return - const { verifyCode, kickTimer, remindTimer } = temp[e.user_id + e.group_id]; + const { verifyCode, kickTimer, remindTimer } = temp[e.user_id + e.group_id] - const { nums, operator } = temp[e.user_id + e.group_id]; + const { nums, operator } = temp[e.user_id + e.group_id] - const isAccurateModeOK = verifycfg.mode === "精确" && e.raw_message == verifyCode; + const isAccurateModeOK = verifycfg.mode === '精确' && e.raw_message == verifyCode - const isVagueModeOK = verifycfg.mode === "模糊" && e.raw_message.includes(verifyCode); + const isVagueModeOK = verifycfg.mode === '模糊' && e.raw_message.includes(verifyCode) - const isOK = isAccurateModeOK || isVagueModeOK; + const isOK = isAccurateModeOK || isVagueModeOK if (isOK) { - delete temp[e.user_id + e.group_id]; - clearTimeout(kickTimer); - clearTimeout(remindTimer); - return await e.reply(verifycfg.SuccessMsgs[e.group_id] || verifycfg.SuccessMsgs[0] || "✅ 验证成功,欢迎入群"); + delete temp[e.user_id + e.group_id] + clearTimeout(kickTimer) + clearTimeout(remindTimer) + return await e.reply(verifycfg.SuccessMsgs[e.group_id] || verifycfg.SuccessMsgs[0] || '✅ 验证成功,欢迎入群') } else { - temp[e.user_id + e.group_id].remainTimes -= 1; + temp[e.user_id + e.group_id].remainTimes -= 1 - const { remainTimes } = temp[e.user_id + e.group_id]; + const { remainTimes } = temp[e.user_id + e.group_id] if (remainTimes > 0) { - await e.recall(); + await e.recall() - const msg = `❎ 验证失败,你还有「${remainTimes}」次机会,请发送「${nums[0]} ${operator} ${nums[1]}」的运算结果`; - return await e.reply([segment.at(e.user_id), msg]); + const msg = `❎ 验证失败,你还有「${remainTimes}」次机会,请发送「${nums[0]} ${operator} ${nums[1]}」的运算结果` + return await e.reply([segment.at(e.user_id), msg]) } - clearTimeout(kickTimer); - clearTimeout(remindTimer); - await e.reply([segment.at(e.user_id), `验证失败,请重新申请`]); - delete temp[e.user_id + e.group_id]; + clearTimeout(kickTimer) + clearTimeout(remindTimer) + await e.reply([segment.at(e.user_id), '验证失败,请重新申请']) + delete temp[e.user_id + e.group_id] return await e.group.kickMember(e.user_id) } }) -//主动退群 +// 主动退群 Bot.on('notice.group.decrease', async (e) => { - if (!e.group.is_admin && !e.group.is_owner) return; + if (!e.group.is_admin && !e.group.is_owner) return - if (!temp[e.user_id + e.group_id]) return; + if (!temp[e.user_id + e.group_id]) return - clearTimeout(temp[e.user_id + e.group_id].kickTimer); + clearTimeout(temp[e.user_id + e.group_id].kickTimer) - clearTimeout(temp[e.user_id + e.group_id].remindTimer); + clearTimeout(temp[e.user_id + e.group_id].remindTimer) - delete temp[e.user_id + e.group_id]; + delete temp[e.user_id + e.group_id] - return e.reply(`「${e.user_id}」主动退群,验证流程结束`); + return e.reply(`「${e.user_id}」主动退群,验证流程结束`) }) -//发送验证信息 -async function verify(user_id, group_id, e) { - if (!e.group.is_admin && !e.group.is_owner) return; - user_id = Number(user_id); - group_id = Number(group_id); +// 发送验证信息 +async function verify (user_id, group_id, e) { + if (!e.group.is_admin && !e.group.is_owner) return + user_id = Number(user_id) + group_id = Number(group_id) logger.mark(`[椰奶进群验证]进行${user_id}的验证`) let verifycfg = Config.verifycfg let { range } = verifycfg - const remainTimes = verifycfg.times; + const remainTimes = verifycfg.times const operator = ops[getRndInteger(0, 1)] let [m, n] = [getRndInteger(range.min, range.max), getRndInteger(range.min, range.max)] while (m == n) { - n = Math.floor(Math.random() * (range.max - range.min + 1)) + range.min; + n = Math.floor(Math.random() * (range.max - range.min + 1)) + range.min } - [m, n] = [m >= n ? m : n, m >= n ? n : m]; + [m, n] = [m >= n ? m : n, m >= n ? n : m] - const verifyCode = String(operator === "-" ? m - n : m + n); + const verifyCode = String(operator === '-' ? m - n : m + n) logger.mark(`[验证]答案:${verifyCode}`) const kickTimer = setTimeout(async () => { - e.reply([segment.at(user_id), " 验证超时,移出群聊,请重新申请"]); + e.reply([segment.at(user_id), ' 验证超时,移出群聊,请重新申请']) - delete temp[user_id + group_id]; + delete temp[user_id + group_id] - clearTimeout(kickTimer); + clearTimeout(kickTimer) return await e.group.kickMember(user_id) + }, verifycfg.time * 1000) - }, verifycfg.time * 1000); - - const shouldRemind = verifycfg.remindAtLastMinute && verifycfg.time >= 120; + const shouldRemind = verifycfg.remindAtLastMinute && verifycfg.time >= 120 const remindTimer = setTimeout(async () => { - if (shouldRemind && temp[user_id + group_id].remindTimer) { + const msg = ` 验证仅剩最后一分钟,请发送「${m}${operator}${n}」的运算结果,否则将会被移出群聊` - const msg = ` 验证仅剩最后一分钟,请发送「${m}${operator}${n}」的运算结果,否则将会被移出群聊`; - - await e.reply([segment.at(user_id), msg]); + await e.reply([segment.at(user_id), msg]) } - clearTimeout(remindTimer); + clearTimeout(remindTimer) + }, Math.abs(verifycfg.time * 1000 - 60000)) - }, Math.abs(verifycfg.time * 1000 - 60000)); + const msg = ` 欢迎,请在「${verifycfg.time}」秒内发送「${m}${operator}${n}」的运算结果,否则将会被移出群聊` - const msg = ` 欢迎,请在「${verifycfg.time}」秒内发送「${m}${operator}${n}」的运算结果,否则将会被移出群聊`; - - await common.sleep(600); - //消息发送成功才写入 + await common.sleep(600) + // 消息发送成功才写入 if (await e.reply([segment.at(user_id), msg])) { temp[user_id + group_id] = { remainTimes, @@ -279,10 +273,10 @@ async function verify(user_id, group_id, e) { verifyCode, kickTimer, remindTimer - }; + } } } -//随机数 -function getRndInteger(min, max) { - return Math.floor(Math.random() * (max - min + 1)) + min; -} \ No newline at end of file +// 随机数 +function getRndInteger (min, max) { + return Math.floor(Math.random() * (max - min + 1)) + min +} diff --git a/apps/handle.js b/apps/handle.js index abd0898..0cd9a3f 100644 --- a/apps/handle.js +++ b/apps/handle.js @@ -1,432 +1,431 @@ import plugin from '../../../lib/plugins/plugin.js' import lodash from 'lodash' import { segment } from 'oicq' -import { common } from '../model/index.js'; -import moment from 'moment'; +import { common } from '../model/index.js' +import moment from 'moment' const ROLE_MAP = { - "admin": '群管理', - "owner": '群主', - "member": '群员' + admin: '群管理', + owner: '群主', + member: '群员' } export class anotice extends plugin { - constructor() { - super({ - name: '椰奶申请处理', - event: 'message', - priority: 500, - rule: [ - { - reg: '^#?(同意|拒绝)$', - fnc: 'Handle', - }, - { - reg: '^#?回复.*$', - fnc: 'Replys', - event: 'message.private', - }, - { - reg: '^#?(同意|拒绝|查看)(全部)?好友申请(\\d+)?$', - fnc: 'PrivateAdd', - }, - { - reg: '^#?(加为|添加)好友$', - fnc: 'addFriend', - event: 'message.private', - }, - { - reg: '^#?(同意|拒绝|查看)(全部)?(加|入)?群申请(\\d+)?$', - fnc: 'GroupAdd', - event: 'message.group', - }, - { - reg: '^#?(同意|拒绝|查看)(全部)?群邀请(\\d+)?$', - fnc: 'GroupInvite', - }, - { - reg: '^#?查看全部请求$', - fnc: 'SystemMsgAll', - } - ] - }) - } + constructor () { + super({ + name: '椰奶申请处理', + event: 'message', + priority: 500, + rule: [ + { + reg: '^#?(同意|拒绝)$', + fnc: 'Handle' + }, + { + reg: '^#?回复.*$', + fnc: 'Replys', + event: 'message.private' + }, + { + reg: '^#?(同意|拒绝|查看)(全部)?好友申请(\\d+)?$', + fnc: 'PrivateAdd' + }, + { + reg: '^#?(加为|添加)好友$', + fnc: 'addFriend', + event: 'message.private' + }, + { + reg: '^#?(同意|拒绝|查看)(全部)?(加|入)?群申请(\\d+)?$', + fnc: 'GroupAdd', + event: 'message.group' + }, + { + reg: '^#?(同意|拒绝|查看)(全部)?群邀请(\\d+)?$', + fnc: 'GroupInvite' + }, + { + reg: '^#?查看全部请求$', + fnc: 'SystemMsgAll' + } + ] + }) + } - /**同意拒绝好友申请 */ - async PrivateAdd(e) { - if (!e.isMaster) return false; - let yes = /同意/.test(e.msg) ? true : false + /** 同意拒绝好友申请 */ + async PrivateAdd (e) { + if (!e.isMaster) return false + let yes = !!/同意/.test(e.msg) - let FriendAdd = (await Bot.getSystemMsg()) - .filter(item => item.request_type == "friend" && item.sub_type == "add") + let FriendAdd = (await Bot.getSystemMsg()) + .filter(item => item.request_type == 'friend' && item.sub_type == 'add') - if (lodash.isEmpty(FriendAdd)) return e.reply("暂无好友申请(。-ω-)zzz", true) + if (lodash.isEmpty(FriendAdd)) return e.reply('暂无好友申请(。-ω-)zzz', true) - if (/查看好友申请/.test(e.msg)) { - FriendAdd = FriendAdd.map((item) => { - return [ - segment.image(`https://q1.qlogo.cn/g?b=qq&s=100&nk=${item.user_id}`), + if (/查看好友申请/.test(e.msg)) { + FriendAdd = FriendAdd.map((item) => { + return [ + segment.image(`https://q1.qlogo.cn/g?b=qq&s=100&nk=${item.user_id}`), `\n申请人QQ:${item.user_id}\n`, `申请人昵称:${item.nickname}\n`, `申请来源:${item.source || '未知'}\n`, - `申请时间:${moment(item.time * 1000).format(`YYYY-MM-DD HH:mm:ss`)}\n`, + `申请时间:${moment(item.time * 1000).format('YYYY-MM-DD HH:mm:ss')}\n`, `附加信息:${item.comment || '无附加信息'}` - ] - }) - let msg = [ + ] + }) + let msg = [ `现有未处理的好友申请如下,共${FriendAdd.length}条`, - `可用"#同意好友申请"或"#拒绝好友申请"进行处理`, + '可用"#同意好友申请"或"#拒绝好友申请"进行处理', ...FriendAdd - ]; - return common.getforwardMsg(e, msg) - } else if (/全部/.test(e.msg)) { - //同意全部好友申请 - await e.reply("好哒,我开始处理辣٩(๑•ㅂ•)۶") - let success = [], fail = [] - for (let i of FriendAdd) { - logger.mark(`${e.logFnc}${yes ? '同意' : '拒绝'}${i.user_id}的好友申请`) - let res = await i.approve(yes) - if (res) { - success.push(`${success.length + 1}、${i.user_id}`) - } else { - fail.push(`${fail.length + 1}、${i.user_id}`) - } - await common.sleep(2000) - } - let msg = [ + ] + return common.getforwardMsg(e, msg) + } else if (/全部/.test(e.msg)) { + // 同意全部好友申请 + await e.reply('好哒,我开始处理辣٩(๑•ㅂ•)۶') + let success = []; let fail = [] + for (let i of FriendAdd) { + logger.mark(`${e.logFnc}${yes ? '同意' : '拒绝'}${i.user_id}的好友申请`) + let res = await i.approve(yes) + if (res) { + success.push(`${success.length + 1}、${i.user_id}`) + } else { + fail.push(`${fail.length + 1}、${i.user_id}`) + } + await common.sleep(2000) + } + let msg = [ `本次共${yes ? '同意' : '拒绝'}${FriendAdd.length}条好友申请\n成功:${success.length}\n失败:${fail.length}` - ] - if (!lodash.isEmpty(success)) msg.push([`以下为成功的名单:\n`, success.join("\n")]) - if (!lodash.isEmpty(fail)) msg.push([`以下为失败的名单:\n`, fail.join("\n")]) + ] + if (!lodash.isEmpty(success)) msg.push(['以下为成功的名单:\n', success.join('\n')]) + if (!lodash.isEmpty(fail)) msg.push(['以下为失败的名单:\n', fail.join('\n')]) - return common.getforwardMsg(e, msg) - } else { - //处理单个好友申请 - let qq = e.msg.replace(/#|(同意|拒绝)好友申请/g, '').trim() - if (!qq) return e.reply('❎ 请输入正确的QQ') + return common.getforwardMsg(e, msg) + } else { + // 处理单个好友申请 + let qq = e.msg.replace(/#|(同意|拒绝)好友申请/g, '').trim() + if (!qq) return e.reply('❎ 请输入正确的QQ') - let member = FriendAdd.find(item => item.user_id == qq) - if (lodash.isEmpty(member)) return e.reply('❎ 没有找到这个人的好友申请') + let member = FriendAdd.find(item => item.user_id == qq) + if (lodash.isEmpty(member)) return e.reply('❎ 没有找到这个人的好友申请') - let result = member.approve(yes) - if (result) { - e.reply(`✅ 已${yes ? '同意' : '拒绝'}${member.nickname}(${qq})的好友申请`) - } else { - e.reply("❎ 未知错误") - } - - } + let result = member.approve(yes) + if (result) { + e.reply(`✅ 已${yes ? '同意' : '拒绝'}${member.nickname}(${qq})的好友申请`) + } else { + e.reply('❎ 未知错误') + } } - /** 引用同意好友申请和群邀请 */ - async Handle(e) { - if (!e.source) return false; - let yes = /同意/.test(e.msg) ? true : false - let source; - if (e.isGroup) { - source = (await e.group.getChatHistory(e.source.seq, 1)).pop(); + } + + /** 引用同意好友申请和群邀请 */ + async Handle (e) { + if (!e.source) return false + let yes = !!/同意/.test(e.msg) + let source + if (e.isGroup) { + source = (await e.group.getChatHistory(e.source.seq, 1)).pop() + } else { + source = (await e.friend.getChatHistory(e.source.time, 1)).pop() + } + if (!source) return e.reply('❎ 获取消息失败') + let sourceMsg = source.raw_message?.split('\n') + + if (e.isGroup) { + if (!e.isMaster && !e.member.is_owner && !e.member.is_admin) { + return e.reply('❎ 该命令仅限管理员可用', true) + } + if (e.source.user_id != Bot.uin) return false + if (/入群申请/.test(sourceMsg[0])) return false + if (!e.member.is_admin && !e.member.is_owner && !e.isMaster) return e.reply('你是坏人!') + + let source = (await e.group.getChatHistory(e.source.seq, 1)).pop() + let yes = /同意/.test(e.msg) + logger.mark(`${e.logFnc}${yes ? '同意' : '拒绝'}加群通知`) + let userId = await redis.get(`yenai:groupAdd:${source.message_id}`) + if (!userId) userId = sourceMsg[1].match(/\d+/)[0] + let member = (await Bot.getSystemMsg()) + .find(item => item.request_type == 'group' && item.sub_type == 'add' && item.group_id == e.group_id && item.user_id == userId) + + if (lodash.isEmpty(member)) return e.reply('呜呜呜,没找到这个淫的加群申请(つд⊂)') + + if (/风险/.test(member.tips)) return e.reply('该账号为风险账号请手动处理哦ಠ~ಠ') + + if (await member.approve(yes)) { + e.reply(`已${yes ? '同意' : '拒绝'}${member.nickname}(${member.user_id})的加群申请辣٩(๑^o^๑)۶`) + } else { + e.reply('呜呜呜,处理失败辣(இωஇ)') + } + return true + } else { + if (!e.isMaster) return false + if (/添加好友申请/.test(sourceMsg[0])) { + let qq = sourceMsg[1].match(/[1-9]\d*/g) + if (Bot.fl.get(Number(qq))) return e.reply('❎ 已经同意过该申请了哦~') + + logger.mark(`${e.logFnc}${yes ? '同意' : '拒绝'}好友申请`) + + await Bot.pickFriend(qq) + .setFriendReq('', yes) + .then(() => e.reply(`✅ 已${yes ? '同意' : '拒绝'}${qq}的好友申请`)) + .catch(() => e.reply('❎ 请检查是否已同意该申请')) + } else if (/邀请机器人进群/.test(sourceMsg[0])) { + let groupid = sourceMsg[1].match(/[1-9]\d*/g) + if (Bot.fl.get(Number(groupid))) { return e.reply('❎ 已经同意过该申请了哦~') } + + let qq = sourceMsg[3].match(/[1-9]\d*/g) + let seq = sourceMsg[6].match(/[1-9]\d*/g) + + logger.mark(`${e.logFnc}${yes ? '同意' : '拒绝'}群邀请`) + + Bot.pickUser(qq) + .setGroupInvite(groupid, seq, yes) + .then(() => e.reply(`✅ 已${yes ? '同意' : '拒绝'}${qq}的群邀请`)) + .catch(() => e.reply('❎ 请检查是否已同意该邀请')) + } else if (/加群申请/.test(sourceMsg[0])) { + let groupId = sourceMsg[1].match(/\d+/g) + let qq = sourceMsg[3].match(/\d+/g) + + let member = (await Bot.getSystemMsg()).find(item => item.sub_type == 'add' && item.group_id == groupId && item.user_id == qq) + if (lodash.isEmpty(member)) return e.reply('没有找到这个人的加群申请哦') + + let result = member.approve(yes) + if (result) { + e.reply(`已${yes ? '同意' : '拒绝'}${member.nickname}(${qq})的加群申请`) } else { - source = (await e.friend.getChatHistory(e.source.time, 1)).pop(); + e.reply('失败了,可能为风险账号请手动处理') } - if (!source) return e.reply("❎ 获取消息失败") - let source_msg = source.raw_message?.split('\n') + } else { + return false + } + } + } - if (e.isGroup) { - if (!e.isMaster && !e.member.is_owner && !e.member.is_admin) { - return e.reply("❎ 该命令仅限管理员可用", true); - } - if (e.source.user_id != Bot.uin) return false - if (/入群申请/.test(source_msg[0])) return false - if (!e.member.is_admin && !e.member.is_owner && !e.isMaster) return e.reply('你是坏人!') + // 回复好友消息 + async Replys (e) { + if (!e.isMaster) return false + let qq = '' + let group = '' + let msgs = e.message[0].text.split(' ') + if (e.source) { + let source = (await e.friend.getChatHistory(e.source.time, 1)).pop() + let res + try { + res = source.raw_message.split('\n') + } catch { + return e.reply('❎ 消息可能已过期') + } + if (/好友消息/.test(res[0]) && /好友QQ/.test(res[1])) { + qq = res[1].match(/[1-9]\d*/g) + } else if (/群临时消息/.test(res[0])) { + qq = res[2].match(/[1-9]\d*/g) + group = res[1].match(/[1-9]\d*/g) + } else { + return e.reply('❎ 请检查是否引用正确') + } + e.message[0].text = e.message[0].text.replace(/#|回复/g, '').trim() + } else { + if (msgs.length == 1 && !/\d/.test(msgs[0])) { + return e.reply('❎ QQ号不能为空') + } else if (/\d/.test(msgs[0])) { + qq = msgs[0].match(/[1-9]\d*/g) + e.message[0].text = msgs.slice(1).join(' ') + } else { + qq = msgs[1] + e.message[0].text = msgs.slice(2).join(' ') + } + } + if (!e.message[0].text) e.message.shift() - let source = (await e.group.getChatHistory(e.source.seq, 1)).pop() - let yes = /同意/.test(e.msg) - logger.mark(`${e.logFnc}${yes ? '同意' : '拒绝'}加群通知`) - let user_id = await redis.get(`yenai:groupAdd:${source.message_id}`) - if (!user_id) user_id = source_msg[1].match(/\d+/)[0] - let member = (await Bot.getSystemMsg()) - .find(item => item.request_type == "group" && item.sub_type == "add" && item.group_id == e.group_id && item.user_id == user_id) - - if (lodash.isEmpty(member)) return e.reply("呜呜呜,没找到这个淫的加群申请(つд⊂)") - - if (/风险/.test(member.tips)) return e.reply(`该账号为风险账号请手动处理哦ಠ~ಠ`) - - if (await member.approve(yes)) { - e.reply(`已${yes ? '同意' : '拒绝'}${member.nickname}(${member.user_id})的加群申请辣٩(๑^o^๑)۶`) - } else { - e.reply(`呜呜呜,处理失败辣(இωஇ)`) - } - return true - - } else { - if (!e.isMaster) return false; - if (/添加好友申请/.test(source_msg[0])) { - let qq = source_msg[1].match(/[1-9]\d*/g) - if (Bot.fl.get(Number(qq))) return e.reply('❎ 已经同意过该申请了哦~') - - logger.mark(`${e.logFnc}${yes ? '同意' : '拒绝'}好友申请`) - - await Bot.pickFriend(qq) - .setFriendReq('', yes) - .then(() => e.reply(`✅ 已${yes ? '同意' : '拒绝'}${qq}的好友申请`)) - .catch(() => e.reply('❎ 请检查是否已同意该申请')) - } else if (/邀请机器人进群/.test(source_msg[0])) { - let groupid = source_msg[1].match(/[1-9]\d*/g) - if (Bot.fl.get(Number(groupid))) { return e.reply('❎ 已经同意过该申请了哦~') } - - let qq = source_msg[3].match(/[1-9]\d*/g) - let seq = source_msg[6].match(/[1-9]\d*/g) - - logger.mark(`${e.logFnc}${yes ? '同意' : '拒绝'}群邀请`) - - Bot.pickUser(qq) - .setGroupInvite(groupid, seq, yes) - .then(() => e.reply(`✅ 已${yes ? '同意' : '拒绝'}${qq}的群邀请`)) - .catch(() => e.reply('❎ 请检查是否已同意该邀请')) - } else if (/加群申请/.test(source_msg[0])) { - let group_id = source_msg[1].match(/\d+/g) - let qq = source_msg[3].match(/\d+/g) - - let member = (await Bot.getSystemMsg()).find(item => item.sub_type == "add" && item.group_id == group_id && item.user_id == qq) - if (lodash.isEmpty(member)) return e.reply("没有找到这个人的加群申请哦") - - let result = member.approve(yes) - if (result) { - e.reply(`已${yes ? '同意' : '拒绝'}${member.nickname}(${qq})的加群申请`) - } else { - e.reply("失败了,可能为风险账号请手动处理") - } - } else { - return false; - } - } + if (e.message.length === 0) return e.reply('❎ 消息不能为空') + if (group) { + logger.mark(`${e.logFnc}回复临时消息`) + return Bot.sendTempMsg(group, qq, e.message) + .then(() => { e.reply('✅ 已把消息发给它了哦~') }) + .catch((err) => e.reply(`❎ 发送失败\n错误信息为:${err.message}`)) } - // 回复好友消息 - async Replys(e) { - if (!e.isMaster) return false; - let qq = ''; - let group = ''; - let msgs = e.message[0].text.split(' ') - if (e.source) { - let source = (await e.friend.getChatHistory(e.source.time, 1)).pop(); - let res; - try { - res = source.raw_message.split('\n') - } catch { - return e.reply('❎ 消息可能已过期') - } - if (/好友消息/.test(res[0]) && /好友QQ/.test(res[1])) { - qq = res[1].match(/[1-9]\d*/g) - } else if (/群临时消息/.test(res[0])) { - qq = res[2].match(/[1-9]\d*/g) - group = res[1].match(/[1-9]\d*/g) - } else { - return e.reply('❎ 请检查是否引用正确') - } - e.message[0].text = e.message[0].text.replace(/#|回复/g, '').trim() - } else { + if (!/^\d+$/.test(qq)) return e.reply('❎ QQ号不正确,人家做不到的啦>_<~') - if (msgs.length == 1 && !/\d/.test(msgs[0])) { - return e.reply('❎ QQ号不能为空') - } else if (/\d/.test(msgs[0])) { - qq = msgs[0].match(/[1-9]\d*/g) - e.message[0].text = msgs.slice(1).join(' ') - } else { - qq = msgs[1] - e.message[0].text = msgs.slice(2).join(' ') - } - } - if (!e.message[0].text) e.message.shift() + if (!Bot.fl.get(Number(qq))) return e.reply('❎ 好友列表查无此人') - if (e.message.length === 0) return e.reply('❎ 消息不能为空') - if (group) { - logger.mark(`${e.logFnc}回复临时消息`) - return Bot.sendTempMsg(group, qq, e.message) - .then(() => { e.reply('✅ 已把消息发给它了哦~') }) - .catch((err) => e.reply(`❎ 发送失败\n错误信息为:${err.message}`)) - } + logger.mark(`${e.logFnc}回复好友消息`) - if (!/^\d+$/.test(qq)) return e.reply('❎ QQ号不正确,人家做不到的啦>_<~') + Bot.pickFriend(qq) + .sendMsg(e.message) + .then(() => { e.reply('✅ 已把消息发给它了哦~') }) + .catch((err) => e.reply(`❎ 发送失败\n错误信息为:${err.message}`)) + } - if (!Bot.fl.get(Number(qq))) return e.reply('❎ 好友列表查无此人') + // 加群员为好友 + async addFriend (e) { + if (!e.isMaster) return false + if (!e.source) return false + let source = (await e.friend.getChatHistory(e.source.time, 1)).pop() + let msg = source.raw_message.split('\n') + if (!/临时消息/.test(msg[0]) || !/来源群号/.test(msg[1]) || !/发送人QQ/.test(msg[2])) return false + let group = msg[1].match(/\d+/g) + let qq = msg[2].match(/\d+/g) + if (Bot.fl.get(Number(qq))) return e.reply('❎ 已经有这个人的好友了哦~') + if (!Bot.gl.get(Number(group))) { return e.reply('❎ 群聊列表查无此群') } + logger.mark(`${e.logFnc}主动添加好友`) + Bot.addFriend(group, qq) + .then(() => e.reply(`✅ 已向${qq}发送了好友请求`)) + .catch(() => e.reply('❎ 发送请求失败')) + } - logger.mark(`${e.logFnc}回复好友消息`) - - Bot.pickFriend(qq) - .sendMsg(e.message) - .then(() => { e.reply('✅ 已把消息发给它了哦~') }) - .catch((err) => e.reply(`❎ 发送失败\n错误信息为:${err.message}`)) - } - - //加群员为好友 - async addFriend(e) { - if (!e.isMaster) return false; - if (!e.source) return false; - let source = (await e.friend.getChatHistory(e.source.time, 1)).pop() - let msg = source.raw_message.split('\n') - if (!/临时消息/.test(msg[0]) || !/来源群号/.test(msg[1]) || !/发送人QQ/.test(msg[2])) return false; - let group = msg[1].match(/\d+/g) - let qq = msg[2].match(/\d+/g) - if (Bot.fl.get(Number(qq))) return e.reply('❎ 已经有这个人的好友了哦~') - if (!Bot.gl.get(Number(group))) { return e.reply('❎ 群聊列表查无此群') } - logger.mark(`${e.logFnc}主动添加好友`) - Bot.addFriend(group, qq) - .then(() => e.reply(`✅ 已向${qq}发送了好友请求`)) - .catch(() => e.reply("❎ 发送请求失败")) - } - - //入群请求 - async GroupAdd(e) { - let SystemMsg = (await Bot.getSystemMsg()) - .filter(item => item.request_type == "group" && item.sub_type == "add" && item.group_id == e.group_id) - if (lodash.isEmpty(SystemMsg)) return e.reply("暂无加群申请(。-ω-)zzz", true) - //查看 - if (/查看/.test(e.msg)) { - SystemMsg = SystemMsg.map(item => { - return [ - segment.image(`https://q1.qlogo.cn/g?b=qq&s=100&nk=${item.user_id}`), + // 入群请求 + async GroupAdd (e) { + let SystemMsg = (await Bot.getSystemMsg()) + .filter(item => item.request_type == 'group' && item.sub_type == 'add' && item.group_id == e.group_id) + if (lodash.isEmpty(SystemMsg)) return e.reply('暂无加群申请(。-ω-)zzz', true) + // 查看 + if (/查看/.test(e.msg)) { + SystemMsg = SystemMsg.map(item => { + return [ + segment.image(`https://q1.qlogo.cn/g?b=qq&s=100&nk=${item.user_id}`), `\nQQ:${item.user_id}\n`, `昵称:${item.nickname}\n`, - item.tips ? `Tips:${item.tips}\n` : "", + item.tips ? `Tips:${item.tips}\n` : '', `${item.comment}` - ] - }) - let msg = [ + ] + }) + let msg = [ `现有未处理的加群申请如下,总共${SystemMsg.length}条`, - `可使用 "#(同意|拒绝)加群申请xxx"\n或 "#(同意|拒绝)全部加群申请"`, + '可使用 "#(同意|拒绝)加群申请xxx"\n或 "#(同意|拒绝)全部加群申请"', ...SystemMsg - ] - return common.getforwardMsg(e, msg) - } - if (!e.isMaster && !e.member.is_owner && !e.member.is_admin) { - return e.reply("❎ 该命令仅限管理员可用", true); - } - let yes = /同意/.test(e.msg) - - if (/全部/.test(e.msg)) { - e.reply("好哒,我开始处理辣٩(๑•ㅂ•)۶") - let success = [], fail = [], risk = [] - for (let i of SystemMsg) { - if (await i.approve(yes)) { - success.push(`${success.length + 1}、${i.user_id}`) - } else { - if (/风险/.test(i.tips)) { - risk.push(`${risk.length + 1}、${i.user_id}`) - } else { - fail.push(`${fail.length + 1}、${i.user_id}`) - } - } - await common.sleep(1000) - } - let msg = [ - `本次共处理${SystemMsg.length}条群申请\n成功:${success.length}\n失败:${fail.length}\n风险:${risk.length}` - ] - if (!lodash.isEmpty(success)) msg.push([`以下为成功的名单:\n`, success.join("\n")]) - if (!lodash.isEmpty(fail)) msg.push([`以下为失败的名单:\n`, fail.join("\n")]) - if (!lodash.isEmpty(risk)) msg.push([`以下为风险账号名单:\n`, risk.join("\n")]) - common.getforwardMsg(e, msg) - } else { - let qq = e.msg.replace(/#(同意|拒绝)(加|入)群申请/g, "").trim() - - if (!qq) return e.reply("QQ号呢,QQ号呢d(ŐдŐ๑)", true) - - let member = SystemMsg.find(item => item.user_id == qq) - - if (lodash.isEmpty(member)) return e.reply("呜呜呜,没找到这个淫的加群申请(つд⊂)") - - if (/风险/.test(member.tips)) return e.reply(`该账号为风险账号请手动处理哦ಠ~ಠ`) - - if (await member.approve(yes)) { - e.reply(`已${yes ? '同意' : '拒绝'}${member.nickname}(${member.user_id})的加群申请辣٩(๑^o^๑)۶`) - } else { - e.reply(`呜呜呜,处理失败辣(இωஇ)`) - } - } + ] + return common.getforwardMsg(e, msg) } - //群邀请列表 - async GroupInvite(e) { - if (!e.isMaster) return false; - let SystemMsg = (await Bot.getSystemMsg()).filter(item => item.request_type == "group" && item.sub_type == "invite") - if (lodash.isEmpty(SystemMsg)) return e.reply("暂无群邀请哦(。-ω-)zzz", true) - let yes = /同意/.test(e.msg) - //查看 - if (/查看/.test(e.msg)) { - SystemMsg = SystemMsg.map(item => { - return [ - segment.image(`https://p.qlogo.cn/gh/${item.group_id}/${item.group_id}/100`), + if (!e.isMaster && !e.member.is_owner && !e.member.is_admin) { + return e.reply('❎ 该命令仅限管理员可用', true) + } + let yes = /同意/.test(e.msg) + + if (/全部/.test(e.msg)) { + e.reply('好哒,我开始处理辣٩(๑•ㅂ•)۶') + let success = []; let fail = []; let risk = [] + for (let i of SystemMsg) { + if (await i.approve(yes)) { + success.push(`${success.length + 1}、${i.user_id}`) + } else { + if (/风险/.test(i.tips)) { + risk.push(`${risk.length + 1}、${i.user_id}`) + } else { + fail.push(`${fail.length + 1}、${i.user_id}`) + } + } + await common.sleep(1000) + } + let msg = [ + `本次共处理${SystemMsg.length}条群申请\n成功:${success.length}\n失败:${fail.length}\n风险:${risk.length}` + ] + if (!lodash.isEmpty(success)) msg.push(['以下为成功的名单:\n', success.join('\n')]) + if (!lodash.isEmpty(fail)) msg.push(['以下为失败的名单:\n', fail.join('\n')]) + if (!lodash.isEmpty(risk)) msg.push(['以下为风险账号名单:\n', risk.join('\n')]) + common.getforwardMsg(e, msg) + } else { + let qq = e.msg.replace(/#(同意|拒绝)(加|入)群申请/g, '').trim() + + if (!qq) return e.reply('QQ号呢,QQ号呢d(ŐдŐ๑)', true) + + let member = SystemMsg.find(item => item.user_id == qq) + + if (lodash.isEmpty(member)) return e.reply('呜呜呜,没找到这个淫的加群申请(つд⊂)') + + if (/风险/.test(member.tips)) return e.reply('该账号为风险账号请手动处理哦ಠ~ಠ') + + if (await member.approve(yes)) { + e.reply(`已${yes ? '同意' : '拒绝'}${member.nickname}(${member.user_id})的加群申请辣٩(๑^o^๑)۶`) + } else { + e.reply('呜呜呜,处理失败辣(இωஇ)') + } + } + } + + // 群邀请列表 + async GroupInvite (e) { + if (!e.isMaster) return false + let SystemMsg = (await Bot.getSystemMsg()).filter(item => item.request_type == 'group' && item.sub_type == 'invite') + if (lodash.isEmpty(SystemMsg)) return e.reply('暂无群邀请哦(。-ω-)zzz', true) + let yes = /同意/.test(e.msg) + // 查看 + if (/查看/.test(e.msg)) { + SystemMsg = SystemMsg.map(item => { + return [ + segment.image(`https://p.qlogo.cn/gh/${item.group_id}/${item.group_id}/100`), `\n邀请群号:${item.group_id}\n`, `邀请群名:${item.group_name}\n`, `邀请人QQ:${item.user_id}\n`, `邀请人昵称:${item.nickname}\n`, `邀请人身份:${ROLE_MAP[item.role]}` - ] - }) - let msg = [ + ] + }) + let msg = [ `现有未处理的群邀请如下,总共${SystemMsg.length}条`, - `可使用 "#(同意|拒绝)群邀请xxx"\n或 "#(同意|拒绝)全部群邀请"`, + '可使用 "#(同意|拒绝)群邀请xxx"\n或 "#(同意|拒绝)全部群邀请"', ...SystemMsg - ] - return common.getforwardMsg(e, msg) - } else if (/全部/.test(e.msg)) { - e.reply("好哒,我开始处理辣٩(๑•ㅂ•)۶") - let success = [], fail = [] - for (let i of SystemMsg) { - if (await i.approve(yes)) { - success.push(`${success.length + 1}、${i.user_id}`) - } else { - fail.push(`${fail.length + 1}、${i.user_id}`) - } - await common.sleep(1000) - } - let msg = [`本次共处理${SystemMsg.length}条群邀请\n成功:${success.length}\n失败:${fail.length}`] - if (!lodash.isEmpty(success)) msg.push([`以下为成功的名单:\n`, success.join("\n")]) - if (!lodash.isEmpty(fail)) msg.push([`以下为失败的名单:\n`, fail.join("\n")]) - common.getforwardMsg(e, msg) + ] + return common.getforwardMsg(e, msg) + } else if (/全部/.test(e.msg)) { + e.reply('好哒,我开始处理辣٩(๑•ㅂ•)۶') + let success = []; let fail = [] + for (let i of SystemMsg) { + if (await i.approve(yes)) { + success.push(`${success.length + 1}、${i.user_id}`) } else { - let groupid = e.msg.replace(/#(同意|拒绝)群邀请/g, "").trim() - - if (!groupid) return e.reply("群号呢,群号呢d(ŐдŐ๑)", true) - - let Invite = SystemMsg.find(item => item.group_id == groupid) - - if (lodash.isEmpty(Invite)) return e.reply("欸,你似不似傻哪有这个群邀请(O∆O)") - - if (await Invite.approve(yes)) { - e.reply(`已${yes ? '同意' : '拒绝'}${Invite.group_id}这个群邀请辣٩(๑^o^๑)۶`) - } else { - e.reply(`呜呜呜,处理失败辣(இωஇ)`) - } + fail.push(`${fail.length + 1}、${i.user_id}`) } + await common.sleep(1000) + } + let msg = [`本次共处理${SystemMsg.length}条群邀请\n成功:${success.length}\n失败:${fail.length}`] + if (!lodash.isEmpty(success)) msg.push(['以下为成功的名单:\n', success.join('\n')]) + if (!lodash.isEmpty(fail)) msg.push(['以下为失败的名单:\n', fail.join('\n')]) + common.getforwardMsg(e, msg) + } else { + let groupid = e.msg.replace(/#(同意|拒绝)群邀请/g, '').trim() + + if (!groupid) return e.reply('群号呢,群号呢d(ŐдŐ๑)', true) + + let Invite = SystemMsg.find(item => item.group_id == groupid) + + if (lodash.isEmpty(Invite)) return e.reply('欸,你似不似傻哪有这个群邀请(O∆O)') + + if (await Invite.approve(yes)) { + e.reply(`已${yes ? '同意' : '拒绝'}${Invite.group_id}这个群邀请辣٩(๑^o^๑)۶`) + } else { + e.reply('呜呜呜,处理失败辣(இωஇ)') + } } - //全部请求 - async SystemMsgAll(e) { - if (!e.isMaster) return false; - let SystemMsg = await Bot.getSystemMsg() - let FriendAdd = [], onewayFriend = [], GroupAdd = [], GroupInvite = [] - for (let i of SystemMsg) { - if (i.request_type == "friend") { - if (i.sub_type == 'add') { - FriendAdd.push(i) - } else { - onewayFriend.push(i) - } - } else { - if (i.sub_type == "add") { - GroupAdd.push(i) - } else { - GroupInvite.push(i) - } - } + } + + // 全部请求 + async SystemMsgAll (e) { + if (!e.isMaster) return false + let SystemMsg = await Bot.getSystemMsg() + let FriendAdd = []; let onewayFriend = []; let GroupAdd = []; let GroupInvite = [] + for (let i of SystemMsg) { + if (i.request_type == 'friend') { + if (i.sub_type == 'add') { + FriendAdd.push(i) + } else { + onewayFriend.push(i) } - let msg = [] - if (!lodash.isEmpty(FriendAdd)) msg.push(`好友申请:${FriendAdd.length}条\n可使用"#查看好友申请" 查看详情`) - if (!lodash.isEmpty(GroupInvite)) msg.push(`群邀请:${GroupInvite.length}条\n可使用"#查看群邀请" 查看详情`) - if (!lodash.isEmpty(onewayFriend)) msg.push(`单向好友:${onewayFriend.length}条`) - if (e.isGroup) { - GroupAdd = GroupAdd.filter(item => item.group_id == e.group.id) - if (!lodash.isEmpty(GroupAdd)) msg.push(`当前群申请:${GroupAdd.length}条`) + } else { + if (i.sub_type == 'add') { + GroupAdd.push(i) + } else { + GroupInvite.push(i) } - if (lodash.isEmpty(msg)) return e.reply("好耶!!一条请求都没有哦o( ❛ᴗ❛ )o", true) - msg.unshift("以下为暂未处理的请求") - common.getforwardMsg(e, msg) + } } + let msg = [] + if (!lodash.isEmpty(FriendAdd)) msg.push(`好友申请:${FriendAdd.length}条\n可使用"#查看好友申请" 查看详情`) + if (!lodash.isEmpty(GroupInvite)) msg.push(`群邀请:${GroupInvite.length}条\n可使用"#查看群邀请" 查看详情`) + if (!lodash.isEmpty(onewayFriend)) msg.push(`单向好友:${onewayFriend.length}条`) + if (e.isGroup) { + GroupAdd = GroupAdd.filter(item => item.group_id == e.group.id) + if (!lodash.isEmpty(GroupAdd)) msg.push(`当前群申请:${GroupAdd.length}条`) + } + if (lodash.isEmpty(msg)) return e.reply('好耶!!一条请求都没有哦o( ❛ᴗ❛ )o', true) + msg.unshift('以下为暂未处理的请求') + common.getforwardMsg(e, msg) + } } - diff --git a/apps/help.js b/apps/help.js index 8641d1d..cbdb945 100644 --- a/apps/help.js +++ b/apps/help.js @@ -4,7 +4,7 @@ import lodash from 'lodash' import { Data } from '../components/index.js' import { puppeteer } from '../model/index.js' export class yenai_help extends plugin { - constructor() { + constructor () { super({ name: '椰奶帮助', event: 'message', @@ -15,16 +15,15 @@ export class yenai_help extends plugin { fnc: 'message' } ] - }); + }) } - async message() { - return await help(this.e); + async message () { + return await help(this.e) } - } -async function help(e) { +async function help (e) { let custom = {} let help = {} let { diyCfg, sysCfg } = await Data.importCfg('help') @@ -59,7 +58,7 @@ async function help(e) { helpGroup.push(group) }) let bg = await rodom() - let colCount = 3; + let colCount = 3 return await puppeteer.render('help/index', { helpCfg: helpConfig, helpGroup, @@ -73,11 +72,11 @@ async function help(e) { } const rodom = async function () { - var image = fs.readdirSync(`./plugins/yenai-plugin/resources/help/imgs/`); - var list_img = []; + let image = fs.readdirSync('./plugins/yenai-plugin/resources/help/imgs/') + let list_img = [] for (let val of image) { list_img.push(val) } - var imgs = list_img.length == 1 ? list_img[0] : list_img[lodash.random(0, list_img.length - 1)]; - return imgs; -} \ No newline at end of file + let imgs = list_img.length == 1 ? list_img[0] : list_img[lodash.random(0, list_img.length - 1)] + return imgs +} diff --git a/apps/nga.js b/apps/nga.js index 82d93b4..9dae645 100644 --- a/apps/nga.js +++ b/apps/nga.js @@ -5,9 +5,9 @@ import fs from 'node:fs' import common from '../../../lib/common/common.js' import { Data } from '../components/index.js' -const _path = "./plugins/yenai-plugin" +const _path = './plugins/yenai-plugin' export class NGA extends plugin { - constructor() { + constructor () { super({ name: '椰奶NGA', dsc: '收益曲线', @@ -22,25 +22,26 @@ export class NGA extends plugin { }) this.incomeCurvePath = `${_path}/resources/curveimg` this.referencePanelPath = `${_path}/resources/ReferencPanel` - this.incomeCurveObj = Data.readJSON("config/incomeCurve/incomeCurve.json") - } - //初始化 - async init() { - Data.createDir("resources/curveimg") - Data.createDir("resources/ReferencPanel") + this.incomeCurveObj = Data.readJSON('config/incomeCurve/incomeCurve.json') } - async NGA() { + // 初始化 + async init () { + Data.createDir('resources/curveimg') + Data.createDir('resources/ReferencPanel') + } + + async NGA () { let role = {} if (/#?(收益曲线|参考面板)帮助/.test(this.e.msg)) { - role.name = "帮助" + role.name = '帮助' } else { role = gsCfg.getRole(this.e.msg, '收益曲线|参考面板') } if (!role) return logger.error(`${this.e.logFnc}指令可能错误`, role) - let type = /收益曲线/.test(this.e.msg) ? "收益曲线" : "参考面板" + let type = /收益曲线/.test(this.e.msg) ? '收益曲线' : '参考面板' /** 主角特殊处理 */ if (['10000005', '10000007', '20000000'].includes(String(role.roleId))) { if (!['风主', '岩主', '雷主', '草主'].includes(role.alias)) { @@ -53,12 +54,12 @@ export class NGA extends plugin { let imgPath let url if (type == '收益曲线') { - //收益曲线 - if (!this.incomeCurveObj[role.name]) return this.e.reply("暂时无该角色收益曲线~>_<") + // 收益曲线 + if (!this.incomeCurveObj[role.name]) return this.e.reply('暂时无该角色收益曲线~>_<') url = this.incomeCurveObj[role.name] imgPath = `${this.incomeCurvePath}/${role.name}.png` } else { - //参考面板 + // 参考面板 imgPath = `${this.referencePanelPath}/${role.name}.png` url = `http://www.liaobiao.top/Referenc/${role.name}.png` } @@ -67,13 +68,13 @@ export class NGA extends plugin { } if (fs.existsSync(imgPath)) { - await this.e.reply(segment.image(imgPath)); - return true; + await this.e.reply(segment.image(imgPath)) + return true } } - //下载图片 - async getImg(name, Path) { + // 下载图片 + async getImg (name, Path) { logger.mark(`${this.e.logFnc} 下载${name}素材图`) if (!await common.downFile(name, Path)) { diff --git a/apps/notice_friend.js b/apps/notice_friend.js index acd9db8..34664dd 100644 --- a/apps/notice_friend.js +++ b/apps/notice_friend.js @@ -3,119 +3,117 @@ import { segment } from 'oicq' import { common } from '../model/index.js' import { Config } from '../components/index.js' - /** 好友通知 */ export class Friends extends plugin { - constructor() { - super({ - name: '椰奶好友通知', - event: 'notice.friend', - priority: 5000 - }) - } + constructor () { + super({ + name: '椰奶好友通知', + event: 'notice.friend', + priority: 5000 + }) + } - async accept(e) { - let msg - let forwardMsg - switch (e.sub_type) { - case 'increase': { - if (!Config.Notice.friendNumberChange) return false; - logger.mark("[椰奶]新增好友") - msg = [ - segment.image(`https://q1.qlogo.cn/g?b=qq&s=100&nk=${e.user_id}`), - '[通知 - 新增好友]\n', + async accept (e) { + let msg + let forwardMsg + switch (e.sub_type) { + case 'increase': { + if (!Config.Notice.friendNumberChange) return false + logger.mark('[椰奶]新增好友') + msg = [ + segment.image(`https://q1.qlogo.cn/g?b=qq&s=100&nk=${e.user_id}`), + '[通知 - 新增好友]\n', `好友QQ:${e.user_id}\n`, `好友昵称:${e.nickname}` - ] - break - } - case 'decrease': { - if (!Config.Notice.friendNumberChange) return false; - logger.mark("[椰奶]好友减少") - msg = [ - segment.image(`https://q1.qlogo.cn/g?b=qq&s=100&nk=${e.user_id}`), - '[通知 - 好友减少]\n', + ] + break + } + case 'decrease': { + if (!Config.Notice.friendNumberChange) return false + logger.mark('[椰奶]好友减少') + msg = [ + segment.image(`https://q1.qlogo.cn/g?b=qq&s=100&nk=${e.user_id}`), + '[通知 - 好友减少]\n', `好友QQ:${e.user_id}\n`, `好友昵称:${e.nickname}` - ] - break - } - case 'recall': { - if (!Config.Notice.PrivateRecall) return false; + ] + break + } + case 'recall': { + if (!Config.Notice.PrivateRecall) return false - if (e.user_id == Bot.uin) return false; + if (e.user_id == Bot.uin) return false - if (Config.masterQQ.includes(e.user_id)) return false - logger.mark("[椰奶]好友撤回") - // 读取 - let res = JSON.parse( - await redis.get(`notice:messagePrivate:${e.message_id}`) - ) - // 无数据 return - if (!res) return false - // 撤回为闪照处理 - if (res[0].type === 'flash') { - let url = res[0].url - res = ['[闪照]\n', '撤回闪照:', segment.image(url)] - } else if (res[0].type === 'record') { - // 语音 - forwardMsg = segment.record(res[0].url) - res = '[语音]' - } else if (res[0].type === 'video') { - // 视频 - forwardMsg = segment.video(res[0].file) - res = '[视频]' - } else if (res[0].type === 'xml') { - // 合并消息 - forwardMsg = res - res = '[合并消息]' - } - // 消息 - msg = [ - segment.image(`https://q1.qlogo.cn/g?b=qq&s=100&nk=${e.user_id}`), - '[消息 - 好友撤回消息]\n', + if (Config.masterQQ.includes(e.user_id)) return false + logger.mark('[椰奶]好友撤回') + // 读取 + let res = JSON.parse( + await redis.get(`notice:messagePrivate:${e.message_id}`) + ) + // 无数据 return + if (!res) return false + // 撤回为闪照处理 + if (res[0].type === 'flash') { + let url = res[0].url + res = ['[闪照]\n', '撤回闪照:', segment.image(url)] + } else if (res[0].type === 'record') { + // 语音 + forwardMsg = segment.record(res[0].url) + res = '[语音]' + } else if (res[0].type === 'video') { + // 视频 + forwardMsg = segment.video(res[0].file) + res = '[视频]' + } else if (res[0].type === 'xml') { + // 合并消息 + forwardMsg = res + res = '[合并消息]' + } + // 消息 + msg = [ + segment.image(`https://q1.qlogo.cn/g?b=qq&s=100&nk=${e.user_id}`), + '[消息 - 好友撤回消息]\n', `好友QQ:${e.user_id}\n`, `撤回时间:${formatDate(e.time)}\n`, '撤回消息:', ...res - ] - break - } - case 'poke': { - if (!Config.Notice.privateMessage) return false - logger.mark("[椰奶]好友戳一戳") - msg = [ - segment.image(`https://q1.qlogo.cn/g?b=qq&s=100&nk=${e.user_id}`), - '[消息 - 戳一戳]\n', + ] + break + } + case 'poke': { + if (!Config.Notice.privateMessage) return false + logger.mark('[椰奶]好友戳一戳') + msg = [ + segment.image(`https://q1.qlogo.cn/g?b=qq&s=100&nk=${e.user_id}`), + '[消息 - 戳一戳]\n', `来源QQ:${e.user_id}` - ] - break - } - default: - return false; - } - await common.sendMasterMsg(msg) - if (forwardMsg) await common.sendMasterMsg(forwardMsg) + ] + break + } + default: + return false } + await common.sendMasterMsg(msg) + if (forwardMsg) await common.sendMasterMsg(forwardMsg) + } } - /** 时间转换 */ -function formatDate(time) { - let now = new Date(parseFloat(time) * 1000) - // 月 - let month = now.getMonth() + 1 - // 日 - let date = now.getDate() - // 补0 - if (month >= 1 && month <= 9) month = '0' + month - if (date >= 0 && date <= 9) date = '0' + date - // 时 - let hour = now.getHours() - // 分 - let minute = now.getMinutes() - // 补0 - if (hour >= 1 && hour <= 9) hour = '0' + hour - if (minute >= 0 && minute <= 9) minute = '0' + minute - return `${month}-${date} ${hour}:${minute} ` -} \ No newline at end of file +function formatDate (time) { + let now = new Date(parseFloat(time) * 1000) + // 月 + let month = now.getMonth() + 1 + // 日 + let date = now.getDate() + // 补0 + if (month >= 1 && month <= 9) month = '0' + month + if (date >= 0 && date <= 9) date = '0' + date + // 时 + let hour = now.getHours() + // 分 + let minute = now.getMinutes() + // 补0 + if (hour >= 1 && hour <= 9) hour = '0' + hour + if (minute >= 0 && minute <= 9) minute = '0' + minute + return `${month}-${date} ${hour}:${minute} ` +} diff --git a/apps/notice_group.js b/apps/notice_group.js index 2daea4e..8cb520d 100644 --- a/apps/notice_group.js +++ b/apps/notice_group.js @@ -4,292 +4,271 @@ import { common } from '../model/index.js' import { Config } from '../components/index.js' import moment from 'moment' - /** 群通知 */ export class newgroups extends plugin { - constructor() { - super({ - name: '椰奶群通知', - event: 'notice.group', - priority: 2000, - }) - } + constructor () { + super({ + name: '椰奶群通知', + event: 'notice.group', + priority: 2000 + }) + } - async accept(e) { - let msg - let forwardMsg - switch (e.sub_type) { - case 'increase': { - if (e.user_id === Bot.uin) { - if (!Config.getGroup(e.group_id).groupNumberChange) return false; + async accept (e) { + let msg + let forwardMsg + switch (e.sub_type) { + case 'increase': { + if (e.user_id === Bot.uin) { + if (!Config.getGroup(e.group_id).groupNumberChange) return false - logger.mark("[椰奶]新增群聊") + logger.mark('[椰奶]新增群聊') - msg = [ - segment.image( + msg = [ + segment.image(`https://p.qlogo.cn/gh/${e.group_id}/${e.group_id}/100`), + '[通知 - 新增群聊]\n', + `新增群号:${e.group_id}` + ] + } else { + if (!Config.getGroup(e.group_id).groupMemberNumberChange) return false + + logger.mark('[椰奶]新增群员') + + msg = [ + segment.image(`https://p.qlogo.cn/gh/${e.group_id}/${e.group_id}/100`), + '[通知 - 新增群员]\n', + `群号:${e.group_id}\n`, + `新成员QQ:${e.user_id}\n`, + `新成员昵称:${e.nickname}` + ] + } + break + } + case 'decrease': { + if (e.dismiss) { + if (!Config.getGroup(e.group_id).groupNumberChange) return false + + logger.mark('[椰奶]群聊被解散') + + msg = [ + segment.image( `https://p.qlogo.cn/gh/${e.group_id}/${e.group_id}/100` - ), - '[通知 - 新增群聊]\n', - `新增群号:${e.group_id}` - ] - } else { - if (!Config.getGroup(e.group_id).groupMemberNumberChange) return false; - - logger.mark("[椰奶]新增群员") - - msg = [ - segment.image( - `https://p.qlogo.cn/gh/${e.group_id}/${e.group_id}/100` - ), - '[通知 - 新增群员]\n', - `群号:${e.group_id}\n`, - `新成员QQ:${e.user_id}\n`, - `新成员昵称:${e.nickname}` - ] - } - break - } - case 'decrease': { - if (e.dismiss) { - if (!Config.getGroup(e.group_id).groupNumberChange) return false; - - logger.mark("[椰奶]群聊被解散") - - msg = [ - segment.image( - `https://p.qlogo.cn/gh/${e.group_id}/${e.group_id}/100` - ), - '[通知 - 群聊被解散]\n', + ), + '[通知 - 群聊被解散]\n', `操作人QQ:${e.operator_id}\n`, `解散群号:${e.group_id}` - ] - } else if (e.user_id === Bot.uin && e.operator_id !== Bot.uin) { - if (!Config.getGroup(e.group_id).groupNumberChange) return false; + ] + } else if (e.user_id === Bot.uin && e.operator_id !== Bot.uin) { + if (!Config.getGroup(e.group_id).groupNumberChange) return false - logger.mark("[椰奶]机器人被踢") + logger.mark('[椰奶]机器人被踢') - msg = [ - segment.image( + msg = [ + segment.image( `https://p.qlogo.cn/gh/${e.group_id}/${e.group_id}/100` - ), - '[通知 - 机器人被踢]\n', + ), + '[通知 - 机器人被踢]\n', `操作人QQ:${e.operator_id}\n`, `被踢群号:${e.group_id}` - ] - } else if (e.user_id === Bot.uin && e.operator_id === Bot.uin) { - if (!Config.getGroup(e.group_id).groupNumberChange) return false; + ] + } else if (e.user_id === Bot.uin && e.operator_id === Bot.uin) { + if (!Config.getGroup(e.group_id).groupNumberChange) return false - logger.mark("[椰奶]机器人退群") + logger.mark('[椰奶]机器人退群') - msg = [ - segment.image( + msg = [ + segment.image( `https://p.qlogo.cn/gh/${e.group_id}/${e.group_id}/100` - ), - '[通知 - 机器人退群]\n', + ), + '[通知 - 机器人退群]\n', `退出群号:${e.group_id}` - ] - } else if (e.operator_id === e.user_id) { - if (!Config.getGroup(e.group_id).groupMemberNumberChange) return false; + ] + } else if (e.operator_id === e.user_id) { + if (!Config.getGroup(e.group_id).groupMemberNumberChange) return false - logger.mark("[椰奶]群员退群") + logger.mark('[椰奶]群员退群') - msg = [ - segment.image( + msg = [ + segment.image( `https://p.qlogo.cn/gh/${e.group_id}/${e.group_id}/100` - ), - '[通知 - 群员退群]\n', + ), + '[通知 - 群员退群]\n', `退群人QQ:${e.user_id}\n`, - `退群人昵称:${e.member === null || e.member === void 0 - ? void 0 - : e.member.nickname - }\n`, - `退群人群名片:${e.member === null || e.member === void 0 ? void 0 : e.member.card - }\n`, + `退群人昵称:${e.member.nickname}\n`, + `退群人群名片:${e.member.card}\n`, `退出群号:${e.group_id}` - ] - } else if (e.operator_id !== e.user_id) { - if (!Config.getGroup(e.group_id).groupMemberNumberChange) return false; + ] + } else if (e.operator_id !== e.user_id) { + if (!Config.getGroup(e.group_id).groupMemberNumberChange) return false - logger.mark("[椰奶]群员被踢") + logger.mark('[椰奶]群员被踢') - msg = [ - segment.image( + msg = [ + segment.image( `https://p.qlogo.cn/gh/${e.group_id}/${e.group_id}/100` - ), - '[通知 - 群员被踢]\n', + ), + '[通知 - 群员被踢]\n', `操作人QQ:${e.operator_id}\n`, `被踢人QQ:${e.user_id}\n`, - `被踢人昵称:${e.member === null || e.member === void 0 - ? void 0 - : e.member.nickname - }\n`, - `被踢人群名片:${e.member === null || e.member === void 0 ? void 0 : e.member.card - }\n`, + `被踢人昵称:${e.member.nickname}\n`, + `被踢人群名片:${e.member.card}\n`, `被踢群号:${e.group_id}` - ] - } - break - } - // 群管理变动 - case 'admin': { - if (!Config.getGroup(e.group_id).groupAdminChange) return false; + ] + } + break + } + // 群管理变动 + case 'admin': { + if (!Config.getGroup(e.group_id).groupAdminChange) return false - e.set ? logger.mark("[椰奶]机器人被设置管理") : logger.mark("[椰奶]机器人被取消管理") - if (e.user_id === Bot.uin) { - - msg = [ - segment.image( + e.set ? logger.mark('[椰奶]机器人被设置管理') : logger.mark('[椰奶]机器人被取消管理') + if (e.user_id === Bot.uin) { + msg = [ + segment.image( `https://p.qlogo.cn/gh/${e.group_id}/${e.group_id}/100` - ), - e.set - ? '[通知 - 机器人被设置管理]:\n' - : '[通知 - 机器人被取消管理]:\n', + ), + e.set + ? '[通知 - 机器人被设置管理]:\n' + : '[通知 - 机器人被取消管理]:\n', `被操作群号:${e.group_id}` - ] + ] + } else { + e.set ? logger.mark('[椰奶]新增群管理员') : logger.mark('[椰奶]取消群管理员') - } else { - - e.set ? logger.mark("[椰奶]新增群管理员") : logger.mark("[椰奶]取消群管理员") - - msg = [ - segment.image( + msg = [ + segment.image( `https://p.qlogo.cn/gh/${e.group_id}/${e.group_id}/100` - ), - e.set ? '[通知 - 新增群管理员]:\n' : '[通知 - 取消群管理员]:\n', + ), + e.set ? '[通知 - 新增群管理员]:\n' : '[通知 - 取消群管理员]:\n', `被操作QQ:${e.user_id}\n`, `被操作群号:${e.group_id}` - ] - } - break - } - // 禁言 (这里仅处理机器人被禁言) - case 'ban': { - let Forbiddentime = common.getsecondformat(e.duration) + ] + } + break + } + // 禁言 (这里仅处理机器人被禁言) + case 'ban': { + let Forbiddentime = common.getsecondformat(e.duration) - if (!Config.getGroup(e.group_id).botBeenBanned) return false; + if (!Config.getGroup(e.group_id).botBeenBanned) return false - if (e.user_id != Bot.uin) return false; + if (e.user_id != Bot.uin) return false - if (e.duration == 0) { - logger.mark("[椰奶]机器人被解除禁言") - msg = [ - segment.image( + if (e.duration == 0) { + logger.mark('[椰奶]机器人被解除禁言') + msg = [ + segment.image( `https://p.qlogo.cn/gh/${e.group_id}/${e.group_id}/100` - ), - '[通知 - 机器人被解除禁言]\n', + ), + '[通知 - 机器人被解除禁言]\n', `处理人QQ:${e.operator_id}\n`, `处理群号:${e.group_id}` - ] - } else if (e.user_id === Bot.uin) { + ] + } else if (e.user_id === Bot.uin) { + logger.mark('[椰奶]机器人被禁言') - logger.mark("[椰奶]机器人被禁言") - - msg = [ - segment.image( + msg = [ + segment.image( `https://p.qlogo.cn/gh/${e.group_id}/${e.group_id}/100` - ), - '[通知 - 机器人被禁言]\n', + ), + '[通知 - 机器人被禁言]\n', `禁言人QQ:${e.operator_id}\n`, `禁言群号:${e.group_id}\n`, `禁言时长:${Forbiddentime}` - ] - } - break - } - // 群转让 - case 'transfer': { - if (!Config.getGroup(e.group_id).groupNumberChange) return false; + ] + } + break + } + // 群转让 + case 'transfer': { + if (!Config.getGroup(e.group_id).groupNumberChange) return false - logger.mark("[椰奶]群聊转让") + logger.mark('[椰奶]群聊转让') - msg = [ - segment.image( + msg = [ + segment.image( `https://p.qlogo.cn/gh/${e.group_id}/${e.group_id}/100` - ), - '[通知 - 群聊转让]\n', + ), + '[通知 - 群聊转让]\n', `转让群号:${e.group_id}\n`, `旧群主:${e.operator_id}\n`, `新群主:${e.user_id}` - ] - break + ] + break + } + // 群撤回 + case 'recall': { + // 开启或关闭 + if (!Config.getGroup(e.group_id).groupRecall) return false + // 是否为机器人撤回 + if (e.user_id == Bot.uin) return false + // 是否为主人撤回 + if (Config.masterQQ.includes(e.user_id)) return false + // 读取 + let res = JSON.parse( + await redis.get(`notice:messageGroup:${e.message_id}`) + ) + // 无数据 return出去 + if (!res) return false + // 不同消息处理 + let special = '' + if (res[0].type === 'flash') { + // 闪照处理 + forwardMsg = await e.group.makeForwardMsg([ + { + message: segment.image(res[0].url), + nickname: e.group.pickMember(e.user_id).card, + user_id: e.user_id } - // 群撤回 - case 'recall': { - // 开启或关闭 - if (!Config.getGroup(e.group_id).groupRecall) return false; - // 是否为机器人撤回 - if (e.user_id == Bot.uin) return false; - // 是否为主人撤回 - if (Config.masterQQ.includes(e.user_id)) return false; - // 读取 - let res = JSON.parse( - await redis.get(`notice:messageGroup:${e.message_id}`) - ) - // 无数据 return出去 - if (!res) return false; - // 不同消息处理 - let special = '' - if (res[0].type === 'flash') { - // 闪照处理 - forwardMsg = await e.group.makeForwardMsg([ - { - message: segment.image(res[0].url), - nickname: e.group.pickMember(e.user_id).card, - user_id: e.user_id - } - ]) - special = '[闪照]' - } else if (res[0].type === 'record') { - // 语音 - forwardMsg = segment.record(res[0].url) - special = '[语音]' - } else if (res[0].type === 'video') { - // 视频 - forwardMsg = segment.video(res[0].file) - special = '[视频]' - } else if (res[0].type === 'xml') { - // 合并消息 - forwardMsg = res - special = '[合并消息]' - } else { - // 正常处理 - forwardMsg = await Bot.pickFriend(Config.masterQQ[0]).makeForwardMsg([ - { - message: res, - nickname: e.group.pickMember(e.user_id).card, - user_id: e.user_id - } - ]) - } - // 判断是否管理撤回 - let isManage = '' - if (e.operator_id != e.user_id) { - isManage = `撤回管理:${e.group.pickMember(e.operator_id).card}(${e.operator_id + ]) + special = '[闪照]' + } else if (res[0].type === 'record') { + // 语音 + forwardMsg = segment.record(res[0].url) + special = '[语音]' + } else if (res[0].type === 'video') { + // 视频 + forwardMsg = segment.video(res[0].file) + special = '[视频]' + } else if (res[0].type === 'xml') { + // 合并消息 + forwardMsg = res + special = '[合并消息]' + } else { + // 正常处理 + forwardMsg = await Bot.pickFriend(Config.masterQQ[0]).makeForwardMsg([ + { + message: res, + nickname: e.group.pickMember(e.user_id).card, + user_id: e.user_id + } + ]) + } + // 判断是否管理撤回 + let isManage = '' + if (e.operator_id != e.user_id) { + isManage = `撤回管理:${e.group.pickMember(e.operator_id).card}(${e.operator_id })\n` - } - isManage ? logger.mark("[椰奶]群聊管理撤回") : logger.mark("[椰奶]群聊撤回") - // 发送的消息 - msg = [ - segment.image( - `https://p.qlogo.cn/gh/${e.group_id}/${e.group_id}/100` - ), - `[通知 - 群聊${isManage ? '管理' : ''}撤回]\n`, + } + isManage ? logger.mark('[椰奶]群聊管理撤回') : logger.mark('[椰奶]群聊撤回') + // 发送的消息 + msg = [ + segment.image(`https://p.qlogo.cn/gh/${e.group_id}/${e.group_id}/100`), + `[通知 - 群聊${isManage ? '管理' : ''}撤回]\n`, `撤回群名:${e.group_name}\n`, `撤回群号:${e.group_id}\n`, isManage, `${isManage ? '被撤回人' : '撤回人员'}:${e.group.pickMember(e.user_id).card }(${e.user_id})\n`, - `撤回时间:${moment(e.time * 1000).format("MM-DD HH:mm:ss")}`, + `撤回时间:${moment(e.time * 1000).format('MM-DD HH:mm:ss')}`, special ? `\n特殊消息:${special}` : '' - ] - break - } - default: - return false; - } - await common.sendMasterMsg(msg) - if (forwardMsg) await common.sendMasterMsg(forwardMsg) + ] + break + } + default: + return false } + await common.sendMasterMsg(msg) + if (forwardMsg) await common.sendMasterMsg(forwardMsg) + } } - - diff --git a/apps/notice_message.js b/apps/notice_message.js index d5c3a20..a0f98ea 100644 --- a/apps/notice_message.js +++ b/apps/notice_message.js @@ -4,211 +4,206 @@ import { common } from '../model/index.js' import { Config } from '../components/index.js' export class anotice extends plugin { - constructor() { - super({ - name: '椰奶消息通知', - event: 'message', - priority: 2000, - }) - } + constructor () { + super({ + name: '椰奶消息通知', + event: 'message', + priority: 2000 + }) + } } -Bot.on("message", async (e) => { - - // 判断是否为机器人消息 - if (e.user_id == Bot.uin) return false; - // 判断是否主人消息 - if (Config.masterQQ.includes(e.user_id)) return false; - //删除缓存时间 - let deltime = Config.Notice.deltime - // 判断群聊还是私聊 - if (e.isGroup) { - // 关闭撤回停止存储 - if (Config.getGroup(e.group_id).groupRecall) { - // 写入 - await redis.set( +Bot.on('message', async (e) => { + // 判断是否为机器人消息 + if (e.user_id == Bot.uin) return false + // 判断是否主人消息 + if (Config.masterQQ.includes(e.user_id)) return false + // 删除缓存时间 + let deltime = Config.Notice.deltime + // 判断群聊还是私聊 + if (e.isGroup) { + // 关闭撤回停止存储 + if (Config.getGroup(e.group_id).groupRecall) { + // 写入 + await redis.set( `notice:messageGroup:${e.message_id}`, JSON.stringify(e.message), { EX: deltime } - ) - } - - } else if (e.isPrivate) { - // 关闭撤回停止存储 - if (Config.Notice.PrivateRecall) { - // 写入 - await redis.set( + ) + } + } else if (e.isPrivate) { + // 关闭撤回停止存储 + if (Config.Notice.PrivateRecall) { + // 写入 + await redis.set( `notice:messagePrivate:${e.message_id}`, JSON.stringify(e.message), { EX: deltime } - ) - } - + ) } + } - // 消息通知 - let msg = '' - let forwardMsg - if ( - e.message[0].type == 'flash' && + // 消息通知 + let msg = '' + let forwardMsg + if ( + e.message[0].type == 'flash' && e.message_type === 'group' - ) { - if (!Config.getGroup(e.group_id).flashPhoto) return false; - logger.mark("[椰奶]群聊闪照") - msg = [ - segment.image(`https://p.qlogo.cn/gh/${e.group_id}/${e.group_id}/100`), - '[消息 - 闪照消息]\n', + ) { + if (!Config.getGroup(e.group_id).flashPhoto) return false + logger.mark('[椰奶]群聊闪照') + msg = [ + segment.image(`https://p.qlogo.cn/gh/${e.group_id}/${e.group_id}/100`), + '[消息 - 闪照消息]\n', `发送人QQ:${e.user_id}\n`, `发送人昵称:${e.sender.nickname}\n`, `来源群号:${e.group_id}\n`, `来源群名:${e.group_name}\n`, `闪照链接:${e.message[0].url}` - ] - } else if ( - e.message[0].type == 'flash' && + ] + } else if ( + e.message[0].type == 'flash' && e.message_type === 'discuss' && Config.Notice.flashPhoto - ) { - logger.mark("[椰奶]讨论组闪照") - msg = [ - segment.image(`https://q1.qlogo.cn/g?b=qq&s=100&nk=${e.user_id}`), - '[消息 - 闪照消息]\n', + ) { + logger.mark('[椰奶]讨论组闪照') + msg = [ + segment.image(`https://q1.qlogo.cn/g?b=qq&s=100&nk=${e.user_id}`), + '[消息 - 闪照消息]\n', `发送人QQ:${e.user_id}\n`, `发送人昵称:${e.sender.nickname}\n`, `讨论组号:${e.discuss_id}\n`, `讨论组名:${e.discuss_name}\n`, `闪照链接:${e.message[0].url}` - ] - } else if ( - e.message[0].type == 'flash' && + ] + } else if ( + e.message[0].type == 'flash' && e.message_type === 'private' && Config.Notice.flashPhoto - ) { - logger.mark("[椰奶]好友闪照") - msg = [ - segment.image(`https://q1.qlogo.cn/g?b=qq&s=100&nk=${e.user_id}`), - '[消息 - 闪照消息]\n', + ) { + logger.mark('[椰奶]好友闪照') + msg = [ + segment.image(`https://q1.qlogo.cn/g?b=qq&s=100&nk=${e.user_id}`), + '[消息 - 闪照消息]\n', `发送人QQ:${e.user_id}\n`, `发送人昵称:${e.sender.nickname}\n`, `闪照链接:${e.message[0].url}` - ] - } else if (e.message_type === 'private' && e.sub_type === 'friend') { - if (!Config.Notice.privateMessage) return false; + ] + } else if (e.message_type === 'private' && e.sub_type === 'friend') { + if (!Config.Notice.privateMessage) return false - let res = e.message - // 特殊消息处理 - let arr = getSpecial(e.message) - if (arr) { - forwardMsg = arr.msg - res = arr.type - } - logger.mark("[椰奶]好友消息") - msg = [ - segment.image(`https://q1.qlogo.cn/g?b=qq&s=100&nk=${e.user_id}`), - '[消息 - 好友消息]\n', + let res = e.message + // 特殊消息处理 + let arr = getSpecial(e.message) + if (arr) { + forwardMsg = arr.msg + res = arr.type + } + logger.mark('[椰奶]好友消息') + msg = [ + segment.image(`https://q1.qlogo.cn/g?b=qq&s=100&nk=${e.user_id}`), + '[消息 - 好友消息]\n', `好友QQ:${e.user_id}\n`, `好友昵称:${e.sender.nickname}\n`, '消息内容:', ...res - ] - // 添加提示消息 - let key = `tz:privateMessage:${e.user_id}` - if (!(await redis.get(key))) { - await redis.set(key, '1', { EX: 600 }) - msg.push( - '\n-------------\n', - '引用该消息:回复 <内容>\n', + ] + // 添加提示消息 + let key = `tz:privateMessage:${e.user_id}` + if (!(await redis.get(key))) { + await redis.set(key, '1', { EX: 600 }) + msg.push( + '\n-------------\n', + '引用该消息:回复 <内容>\n', `或发送:回复 ${e.user_id} <内容>` - ) - } - } else if (e.message_type === 'private' && e.sub_type === 'group') { - if (!Config.getGroup(e.group_id).grouptemporaryMessage) return false; - // 特殊消息处理 - let res = e.message - let arr = getSpecial(e.message) - if (arr) { - forwardMsg = arr.msg - res = arr.type - } - logger.mark("[椰奶]群临时消息") - // 发送的消息 - msg = [ - segment.image(`https://q1.qlogo.cn/g?b=qq&s=100&nk=${e.user_id}`), - '[消息 - 群临时消息]\n', + ) + } + } else if (e.message_type === 'private' && e.sub_type === 'group') { + if (!Config.getGroup(e.group_id).grouptemporaryMessage) return false + // 特殊消息处理 + let res = e.message + let arr = getSpecial(e.message) + if (arr) { + forwardMsg = arr.msg + res = arr.type + } + logger.mark('[椰奶]群临时消息') + // 发送的消息 + msg = [ + segment.image(`https://q1.qlogo.cn/g?b=qq&s=100&nk=${e.user_id}`), + '[消息 - 群临时消息]\n', `来源群号:${e.sender.group_id}\n`, `发送人QQ:${e.user_id}\n`, '消息内容:', ...res - ] - // 添加提示消息 - let key = `tz:tempprivateMessage:${e.user_id}` - if (!(await redis.get(key))) { - await redis.set(key, '1', { EX: 600 }) - msg.push( - '\n-------------\n', - '可回复 "加为好友" 添加好友\n或 "回复 <消息>"', - ) - } - } else if (e.message_type === 'group') { - if (!Config.getGroup(e.group_id).groupMessage) return false; - // 特殊消息处理 - let res = e.message - let arr = getSpecial(e.message) - if (arr) { - forwardMsg = arr.msg - res = arr.type - } - logger.mark("[椰奶]群聊消息") - msg = [ - segment.image(`https://p.qlogo.cn/gh/${e.group_id}/${e.group_id}/100`), - '[消息 - 群聊消息]\n', + ] + // 添加提示消息 + let key = `tz:tempprivateMessage:${e.user_id}` + if (!(await redis.get(key))) { + await redis.set(key, '1', { EX: 600 }) + msg.push( + '\n-------------\n', + '可回复 "加为好友" 添加好友\n或 "回复 <消息>"' + ) + } + } else if (e.message_type === 'group') { + if (!Config.getGroup(e.group_id).groupMessage) return false + // 特殊消息处理 + let res = e.message + let arr = getSpecial(e.message) + if (arr) { + forwardMsg = arr.msg + res = arr.type + } + logger.mark('[椰奶]群聊消息') + msg = [ + segment.image(`https://p.qlogo.cn/gh/${e.group_id}/${e.group_id}/100`), + '[消息 - 群聊消息]\n', `来源群号:${e.group_id}\n`, `来源群名:${e.group_name}\n`, `发送人QQ:${e.user_id}\n`, `发送人昵称:${e.sender.nickname}\n`, '消息内容:', ...res - ] - } else if (e.message_type === 'discuss') { - if (!Config.getGroup(e.group_id).groupMessage) return false; - logger.mark("[椰奶]讨论组消息") - msg = [ - segment.image(`https://q1.qlogo.cn/g?b=qq&s=100&nk=${e.user_id}`), - '[消息 - 群聊消息]\n', + ] + } else if (e.message_type === 'discuss') { + if (!Config.getGroup(e.group_id).groupMessage) return false + logger.mark('[椰奶]讨论组消息') + msg = [ + segment.image(`https://q1.qlogo.cn/g?b=qq&s=100&nk=${e.user_id}`), + '[消息 - 群聊消息]\n', `来源讨论组号:${e.discuss_id}\n`, `来源讨论组名:${e.discuss_name}\n`, `发送人QQ:${e.user_id}\n`, `发送人昵称:${e.sender.nickname}\n`, `消息内容:${e.raw_message}` - ] - } - // 发送消息 - await common.sendMasterMsg(msg) - if (forwardMsg) await common.sendMasterMsg(forwardMsg) - + ] + } + // 发送消息 + await common.sendMasterMsg(msg) + if (forwardMsg) await common.sendMasterMsg(forwardMsg) }) // 特殊消息处理 -function getSpecial(msg) { - let res = msg - if (res[0].type === 'record') { - // 语音 - return { - msg: segment.record(res[0].url), - type: '[语音]' - } - } else if (res[0].type === 'video') { - // 视频 - return { - msg: segment.video(res[0].file), - type: '[视频]' - } - } else if (res[0].type === 'xml') { - // 合并消息 - return { - msg: res, - type: '[合并消息]' - } - } else return false +function getSpecial (msg) { + let res = msg + if (res[0].type === 'record') { + // 语音 + return { + msg: segment.record(res[0].url), + type: '[语音]' + } + } else if (res[0].type === 'video') { + // 视频 + return { + msg: segment.video(res[0].file), + type: '[视频]' + } + } else if (res[0].type === 'xml') { + // 合并消息 + return { + msg: res, + type: '[合并消息]' + } + } else return false } - diff --git a/apps/notice_request.js b/apps/notice_request.js index 92724d8..8fec812 100644 --- a/apps/notice_request.js +++ b/apps/notice_request.js @@ -4,95 +4,93 @@ import cfg from '../../../lib/config/config.js' import { common } from '../model/index.js' import { Config } from '../components/index.js' const ROLE_MAP = { - admin: '群管理', - owner: '群主', - member: '群员' + admin: '群管理', + owner: '群主', + member: '群员' } /** 群邀请 */ export class invitation extends plugin { - constructor() { - super({ - name: '椰奶请求通知', - event: 'request', - priority: 2000, - }) - } - async accept(e) { - let msg = '' - switch (e.request_type) { - case 'group': - switch (e.sub_type) { - case 'invite': - if (!Config.Notice.groupInviteRequest) return false; - if (cfg.masterQQ.includes(e.user_id)) return false; - logger.mark("[椰奶]邀请机器人进群") - msg = [ - segment.image(`https://p.qlogo.cn/gh/${e.group_id}/${e.group_id}/0`), - '[通知 - 邀请机器人进群]\n', + constructor () { + super({ + name: '椰奶请求通知', + event: 'request', + priority: 2000 + }) + } + + async accept (e) { + let msg = '' + switch (e.request_type) { + case 'group': + switch (e.sub_type) { + case 'invite': + if (!Config.Notice.groupInviteRequest) return false + if (cfg.masterQQ.includes(e.user_id)) return false + logger.mark('[椰奶]邀请机器人进群') + msg = [ + segment.image(`https://p.qlogo.cn/gh/${e.group_id}/${e.group_id}/0`), + '[通知 - 邀请机器人进群]\n', `目标群号:${e.group_id}\n`, `目标群名:${e.group_name}\n`, `邀请人QQ:${e.user_id}\n`, `邀请人昵称:${e.nickname}\n`, `邀请人群身份:${ROLE_MAP[e.role]}\n`, `邀请码:${e.seq}\n` - ] - if (cfg.other.autoQuit <= 0) { - msg.push('----------------\n可引用该消息回复"同意"或"拒绝"') - } else { - msg.push('已自动处理该邀请') - } - break; - case 'add': - if (Config.groupAdd.openGroup.includes(e.group_id)) { - let msg = [`${Config.groupAdd.msg}\n`, - segment.image(`https://q1.qlogo.cn/g?b=qq&s=100&nk=${e.user_id}`), + ] + if (cfg.other.autoQuit <= 0) { + msg.push('----------------\n可引用该消息回复"同意"或"拒绝"') + } else { + msg.push('已自动处理该邀请') + } + break + case 'add': + if (Config.groupAdd.openGroup.includes(e.group_id)) { + let msg = [`${Config.groupAdd.msg}\n`, + segment.image(`https://q1.qlogo.cn/g?b=qq&s=100&nk=${e.user_id}`), `QQ号:${e.user_id}\n`, `昵称:${e.nickname}\n`, `${e.comment}` - ] - if (e.inviter_id !== undefined) { msg.push(`邀请人:${e.inviter_id}`) } - let sendmsg = await Bot.pickGroup(e.group_id).sendMsg(msg) - await redis.set(`yenai:groupAdd:${sendmsg.message_id}`, e.user_id, { EX: 3600 }) - } - if (!Config.getGroup(e.group_id).addGroupApplication) return false; - logger.mark("[椰奶]加群申请") - msg = [ - segment.image(`https://p.qlogo.cn/gh/${e.group_id}/${e.group_id}/0`), - '[通知 - 加群申请]\n', + ] + if (e.inviter_id !== undefined) { msg.push(`邀请人:${e.inviter_id}`) } + let sendmsg = await Bot.pickGroup(e.group_id).sendMsg(msg) + await redis.set(`yenai:groupAdd:${sendmsg.message_id}`, e.user_id, { EX: 3600 }) + } + if (!Config.getGroup(e.group_id).addGroupApplication) return false + logger.mark('[椰奶]加群申请') + msg = [ + segment.image(`https://p.qlogo.cn/gh/${e.group_id}/${e.group_id}/0`), + '[通知 - 加群申请]\n', `群号:${e.group_id}\n`, `群名:${e.group_name}\n`, `QQ:${e.user_id}\n`, `昵称:${e.nickname}`, - e.tips ? `\nTip:${e.tips}` : "", + e.tips ? `\nTip:${e.tips}` : '', `\n${e.comment}` - ] - break; - } - break; - case 'friend': - if (!Config.Notice.friendRequest) return false; - logger.mark("[椰奶]好友申请") - msg = [ - segment.image(`https://q1.qlogo.cn/g?b=qq&s=100&nk=${e.user_id}`), - '[通知 - 添加好友申请]\n', + ] + break + } + break + case 'friend': + if (!Config.Notice.friendRequest) return false + logger.mark('[椰奶]好友申请') + msg = [ + segment.image(`https://q1.qlogo.cn/g?b=qq&s=100&nk=${e.user_id}`), + '[通知 - 添加好友申请]\n', `申请人QQ:${e.user_id}\n`, `申请人昵称:${e.nickname}\n`, `申请来源:${e.source || '未知'}\n`, `附加信息:${e.comment || '无附加信息'}\n` - ] - if (cfg.other.autoFriend == 1) { - msg.push('已自动同意该好友申请') - } else { - msg.push( + ] + if (cfg.other.autoFriend == 1) { + msg.push('已自动同意该好友申请') + } else { + msg.push( `-------------\n可回复:#同意好友申请${e.user_id} \n或引用该消息回复"同意"或"拒绝"` - ) - } - break; + ) } - await common.sendMasterMsg(msg) + break } + await common.sendMasterMsg(msg) + } } -Bot.on("request.group.add", async (e) => { - -}) \ No newline at end of file diff --git a/apps/pixiv.js b/apps/pixiv.js index 12bc55e..25addb4 100644 --- a/apps/pixiv.js +++ b/apps/pixiv.js @@ -1,218 +1,219 @@ import plugin from '../../../lib/plugins/plugin.js' -import moment from 'moment'; import { Config } from '../components/index.js' import { Pixiv, common, setu } from '../model/index.js' -//文案 -const SWITCH_ERROR = "主人没有开放这个功能哦(*/ω\*)" -//汉字数字匹配正则 -let numReg = "[一壹二两三四五六七八九十百千万亿\\d]+" -//正则 -let rankingrReg = new RegExp(`^#?看看((\\d{4}-\\d{1,2}-\\d{1,2})的)?(${Object.keys(Pixiv.RankReg).join("|")})(r18)?榜\\s?(第(${numReg})页)?$`, "i") -let tagReg = new RegExp('^#?tag(pro)?搜图(.*)$', "i") -let pidReg = new RegExp('^#?pid搜图\\s?(\\d+)$', "i") -let uidReg = new RegExp('^#?uid搜图(.*)$', "i") +// 文案 +const SWITCH_ERROR = '主人没有开放这个功能哦(*/ω\*)' +// 汉字数字匹配正则 +let numReg = '[一壹二两三四五六七八九十百千万亿\\d]+' +// 正则 +let rankingrReg = new RegExp(`^#?看看((\\d{4}-\\d{1,2}-\\d{1,2})的)?(${Object.keys(Pixiv.RankReg).join('|')})(r18)?榜\\s?(第(${numReg})页)?$`, 'i') +let tagReg = /^#?tag(pro)?搜图(.*)$/i +let pidReg = /^#?pid搜图\s?(\d+)$/i +let uidReg = /^#?uid搜图(.*)$/i let randomImgReg = new RegExp(`^#?来(${numReg})?张(好(康|看)(的|哒)|hkd|涩图)$|#有内鬼$`) -let relatedReg = new RegExp(`^#?看?看?相关作品(\\d+)$`); + export class example extends plugin { - constructor() { - super({ - name: '椰奶pixiv', - event: 'message', - priority: 500, - rule: [ - { - reg: pidReg, - fnc: 'saucenaoPid' - }, - { - reg: rankingrReg, - fnc: 'pixivRanking' - }, - { - reg: tagReg, - fnc: 'saucenaoTags' - }, - { - reg: '^#?(查看|获取)?热门(t|T)(a|A)(g|G)$', - fnc: 'trendTags' - }, - { - reg: uidReg, - fnc: 'saucenaoUid' - }, - { - reg: randomImgReg, - fnc: 'randomImg' - }, - { - reg: relatedReg, - fnc: 'relatedWorks' - }, - { - reg: '^#?(P|p)ximg(pro)?$', - fnc: 'pximg' - }, - ] - }) - } - - //pid搜图 - async saucenaoPid(e) { - let { sese, sesepro } = Config.getGroup(e.group_id) - if (!sese && !sesepro && !e.isMaster) return e.reply(SWITCH_ERROR) - - await e.reply("你先别急,正在给你搜了(。-ω-)zzz") - - let regRet = pidReg.exec(e.msg) - - let res = await Pixiv.Worker(regRet[1], !e.isMaster && !setu.getR18(e.group_id)) - - if (res?.error) return e.reply(res.error); - - let { msg, img } = res - - await e.reply(msg) - - img.length == 1 ? common.recallsendMsg(e, img) : common.getRecallsendMsg(e, img, false) - } - - //p站排行榜 - async pixivRanking(e) { - let regRet = rankingrReg.exec(e.msg) - let { sese, sesepro } = Config.getGroup(e.group_id) - if ((!sese && !sesepro || regRet[4] && !setu.getR18(e.group_id)) && !e.isMaster) return e.reply(SWITCH_ERROR) - - - await e.reply("你先别急,马上去给你找哦ε(*´・ω・)з") - - let page = common.translateChinaNum(regRet[6] || 1) - let res = await Pixiv.Rank(page, regRet[2], regRet[3], regRet[4]) - - if (res?.error) return e.reply(res.error) - - common.getRecallsendMsg(e, res) - - return true; - } - - /**关键词搜图 */ - async saucenaoTags(e) { - let regRet = tagReg.exec(e.msg) - - let { sese, sesepro } = Config.getGroup(e.group_id) - if ((!sese && !sesepro || !sesepro && regRet[1]) && !e.isMaster) { - return e.reply("主人没有开放这个功能哦(*/ω\*)") + constructor () { + super({ + name: '椰奶pixiv', + event: 'message', + priority: 500, + rule: [ + { + reg: pidReg, + fnc: 'saucenaoPid' + }, + { + reg: rankingrReg, + fnc: 'pixivRanking' + }, + { + reg: tagReg, + fnc: 'saucenaoTags' + }, + { + reg: '^#?(查看|获取)?热门(t|T)(a|A)(g|G)$', + fnc: 'trendTags' + }, + { + reg: uidReg, + fnc: 'saucenaoUid' + }, + { + reg: randomImgReg, + fnc: 'randomImg' + }, + { + reg: '^#?看?看?相关作品(\\d+)$', + fnc: 'relatedWorks' + }, + { + reg: '^#?(P|p)ximg(pro)?$', + fnc: 'pximg' } + ] + }) + } - await e.reply("你先别急,正在给你搜了(。-ω-)zzz") + // pid搜图 + async saucenaoPid (e) { + let { sese, sesepro } = Config.getGroup(e.group_id) + if (!sese && !sesepro && !e.isMaster) return e.reply(SWITCH_ERROR) - let tag = regRet[2] + await e.reply('你先别急,正在给你搜了(。-ω-)zzz') - let pagereg = new RegExp(`第(${numReg})页`) + let regRet = pidReg.exec(e.msg) - let page = pagereg.exec(e.msg) + let res = await Pixiv.Worker(regRet[1], !e.isMaster && !setu.getR18(e.group_id)) - if (page) { - tag = tag.replace(page[0], "") - page = common.translateChinaNum(page[1]) - } else { - page = "1" - } - let res = null; - if (regRet[1]) { - res = await Pixiv.searchTagspro(tag, page, !setu.getR18(e.group_id)) - } else { - res = await Pixiv.searchTags(tag, page) - } - if (res?.error) return e.reply(res.error) - common.getRecallsendMsg(e, res) + if (res?.error) return e.reply(res.error) - return true; - } - /**获取热门tag */ - async trendTags(e) { - let { sese, sesepro } = Config.getGroup(e.group_id) - if (!sese && !sesepro && !e.isMaster) return e.reply(SWITCH_ERROR) - await e.reply("你先别急,马上去给你找哦ε(*´・ω・)з") + let { msg, img } = res - let res = await Pixiv.gettrend_tags() + await e.reply(msg) - if (res?.error) return e.reply(res.error) + img.length == 1 ? common.recallsendMsg(e, img) : common.getRecallsendMsg(e, img, false) + } - common.getRecallsendMsg(e, res) + // p站排行榜 + async pixivRanking (e) { + let regRet = rankingrReg.exec(e.msg) + let { sese, sesepro } = Config.getGroup(e.group_id) + if (((!sese && !sesepro) || (regRet[4] && !setu.getR18(e.group_id))) && !e.isMaster) { + return e.reply(SWITCH_ERROR) } - /**以uid搜图**/ - async saucenaoUid(e) { - let { sese, sesepro } = Config.getGroup(e.group_id) - if (!sese && !sesepro && !e.isMaster) return e.reply(SWITCH_ERROR) - await e.reply("你先别急,正在给你搜了(。-ω-)zzz") + await e.reply('你先别急,马上去给你找哦ε(*´・ω・)з') - let regRet = uidReg.exec(e.msg) + let page = common.translateChinaNum(regRet[6] || 1) + let res = await Pixiv.Rank(page, regRet[2], regRet[3], regRet[4]) - let key = regRet[1] + if (res?.error) return e.reply(res.error) - let pagereg = new RegExp(`第(${numReg})页`) + common.getRecallsendMsg(e, res) - let page = pagereg.exec(e.msg) + return true + } - if (page) { - key = key.replace(page[0], "") - page = page[1] - } else { - page = "1" - } - page = common.translateChinaNum(page) + /** 关键词搜图 */ + async saucenaoTags (e) { + let regRet = tagReg.exec(e.msg) - let res = await Pixiv.public(key, page, !setu.getR18(e.group_id)) - - if (res?.error) return e.reply(res.error) - - common.getRecallsendMsg(e, res) + let { sese, sesepro } = Config.getGroup(e.group_id) + if (((!sese && !sesepro) || (!sesepro && regRet[1])) && !e.isMaster) { + return e.reply('主人没有开放这个功能哦(*/ω\*)') } - //随机原创插画 - async randomImg(e) { - let { sese, sesepro } = Config.getGroup(e.group_id) - if (!sese && !sesepro && !e.isMaster) return e.reply(SWITCH_ERROR) - await e.reply("你先别急,马上去给你找哦ε(*´・ω・)з") + await e.reply('你先别急,正在给你搜了(。-ω-)zzz') - let regRet = randomImgReg.exec(e.msg) + let tag = regRet[2] - let num = regRet[1] || 1 - if (num > 50) { - e.reply("你要的太多辣,奴家只给你一张辣(•́へ•́ ╬)") - num = 1 - } - num = common.translateChinaNum(num) - let res = await Pixiv.getrandomimg(num); + let pagereg = new RegExp(`第(${numReg})页`) - if (res?.error) return e.reply(res.error) + let page = pagereg.exec(e.msg) - common.getRecallsendMsg(e, res) + if (page) { + tag = tag.replace(page[0], '') + page = common.translateChinaNum(page[1]) + } else { + page = '1' } - - //相关作品 - async relatedWorks(e) { - let { sese, sesepro } = Config.getGroup(e.group_id) - if (!sese && !sesepro && !e.isMaster) return e.reply(SWITCH_ERROR) - await e.reply("你先别急,马上去给你找哦ε(*´・ω・)з") - let regRet = relatedReg.exec(e.msg) - let res = await Pixiv.getrelated_works(regRet[1], !setu.getR18(e.group_id)) - if (res?.error) return e.reply(res.error) - common.getRecallsendMsg(e, res) + let res = null + if (regRet[1]) { + res = await Pixiv.searchTagspro(tag, page, !setu.getR18(e.group_id)) + } else { + res = await Pixiv.searchTags(tag, page) } + if (res?.error) return e.reply(res.error) + common.getRecallsendMsg(e, res) - //p站单图 - async pximg(e) { - let ispro = /pro/.test(e.msg) + return true + } - let { sese, sesepro } = Config.getGroup(e.group_id) - if ((!sese && !sesepro || !sesepro && ispro) && !e.isMaster) return e.reply(SWITCH_ERROR) + /** 获取热门tag */ + async trendTags (e) { + let { sese, sesepro } = Config.getGroup(e.group_id) + if (!sese && !sesepro && !e.isMaster) return e.reply(SWITCH_ERROR) + await e.reply('你先别急,马上去给你找哦ε(*´・ω・)з') - let res = await Pixiv.getPximg(ispro) - if (res?.error) return e.reply(res.error) - ispro ? common.getRecallsendMsg(e, [res]) : common.recallsendMsg(e, res) + let res = await Pixiv.gettrend_tags() + + if (res?.error) return e.reply(res.error) + + common.getRecallsendMsg(e, res) + } + + /** 以uid搜图**/ + async saucenaoUid (e) { + let { sese, sesepro } = Config.getGroup(e.group_id) + if (!sese && !sesepro && !e.isMaster) return e.reply(SWITCH_ERROR) + await e.reply('你先别急,正在给你搜了(。-ω-)zzz') + + let regRet = uidReg.exec(e.msg) + + let key = regRet[1] + + let pagereg = new RegExp(`第(${numReg})页`) + + let page = pagereg.exec(e.msg) + + if (page) { + key = key.replace(page[0], '') + page = page[1] + } else { + page = '1' } + page = common.translateChinaNum(page) + + let res = await Pixiv.public(key, page, !setu.getR18(e.group_id)) + + if (res?.error) return e.reply(res.error) + + common.getRecallsendMsg(e, res) + } + + // 随机原创插画 + async randomImg (e) { + let { sese, sesepro } = Config.getGroup(e.group_id) + if (!sese && !sesepro && !e.isMaster) return e.reply(SWITCH_ERROR) + await e.reply('你先别急,马上去给你找哦ε(*´・ω・)з') + + let regRet = randomImgReg.exec(e.msg) + + let num = regRet[1] || 1 + if (num > 50) { + e.reply('你要的太多辣,奴家只给你一张辣(•́へ•́ ╬)') + num = 1 + } + num = common.translateChinaNum(num) + let res = await Pixiv.getrandomimg(num) + + if (res?.error) return e.reply(res.error) + + common.getRecallsendMsg(e, res) + } + + // 相关作品 + async relatedWorks (e) { + let { sese, sesepro } = Config.getGroup(e.group_id) + if (!sese && !sesepro && !e.isMaster) return e.reply(SWITCH_ERROR) + await e.reply('你先别急,马上去给你找哦ε(*´・ω・)з') + let regRet = e.msg.match(/\d+/) + let res = await Pixiv.getrelated_works(regRet[0], !setu.getR18(e.group_id)) + if (res?.error) return e.reply(res.error) + common.getRecallsendMsg(e, res) + } + + // p站单图 + async pximg (e) { + let ispro = /pro/.test(e.msg) + + let { sese, sesepro } = Config.getGroup(e.group_id) + if (((!sese && !sesepro) || (!sesepro && ispro)) && !e.isMaster) return e.reply(SWITCH_ERROR) + + let res = await Pixiv.getPximg(ispro) + if (res?.error) return e.reply(res.error) + ispro ? common.getRecallsendMsg(e, [res]) : common.recallsendMsg(e, res) + } } diff --git a/apps/search.js b/apps/search.js index 744f436..81af1c4 100644 --- a/apps/search.js +++ b/apps/search.js @@ -4,65 +4,65 @@ import { puppeteer } from '../model/index.js' const SEARCH_MAP = { - "百度": "https://www.baidu.com/s?wd=", + 百度: 'https://www.baidu.com/s?wd=', - "必应": "https://cn.bing.com/search?q=", + 必应: 'https://cn.bing.com/search?q=', - "谷歌": "https://www.google.com/search?q=", + 谷歌: 'https://www.google.com/search?q=', - "微博": "https://s.weibo.com/weibo?q=", + 微博: 'https://s.weibo.com/weibo?q=', - "淘宝": "https://s.taobao.com/search?q=", + 淘宝: 'https://s.taobao.com/search?q=', - "京东": "https://search.jd.com/Search?keyword=", + 京东: 'https://search.jd.com/Search?keyword=', - "知乎": "https://www.zhihu.com/search?q=", + 知乎: 'https://www.zhihu.com/search?q=', - "头条": "https://so.toutiao.com/search?keyword=", + 头条: 'https://so.toutiao.com/search?keyword=', - "抖音": "https://www.douyin.com/search/", + 抖音: 'https://www.douyin.com/search/', - "快手": "https://www.kuaishou.com/search/video?searchKey=", + 快手: 'https://www.kuaishou.com/search/video?searchKey=', - "虎牙": "https://www.huya.com/search?hsk=", + 虎牙: 'https://www.huya.com/search?hsk=', - "斗鱼": "https://www.douyu.com/search/?kw=", + 斗鱼: 'https://www.douyu.com/search/?kw=', - "萌娘百科": "https://zh.moegirl.org.cn/index.php?search=", + 萌娘百科: 'https://zh.moegirl.org.cn/index.php?search=', - "B站": "https://search.bilibili.com/all?keyword=", + B站: 'https://search.bilibili.com/all?keyword=', - "腾讯视频": "https://v.qq.com/x/search/?q=", + 腾讯视频: 'https://v.qq.com/x/search/?q=', - "优酷": "https://so.youku.com/search_video/", + 优酷: 'https://so.youku.com/search_video/', - "爱奇艺": "https://so.iqiyi.com/so/q_", + 爱奇艺: 'https://so.iqiyi.com/so/q_', - "芒果TV": "https://so.mgtv.com/so?k=", + 芒果TV: 'https://so.mgtv.com/so?k=', - "百度图片": "https://image.baidu.com/search/index?tn=baiduimage&word=", + 百度图片: 'https://image.baidu.com/search/index?tn=baiduimage&word=', - "百度文库": "https://wenku.baidu.com/search?word=", + 百度文库: 'https://wenku.baidu.com/search?word=', - "4399": "https://so2.4399.com/search/search.php?k=", + 4399: 'https://so2.4399.com/search/search.php?k=', - "GitHub": "https://github.com/search?q=", + GitHub: 'https://github.com/search?q=', - "力扣": "https://leetcode.cn/search/?q=", + 力扣: 'https://leetcode.cn/search/?q=', - "MDN": "https://developer.mozilla.org/zh-CN/search?q=", + MDN: 'https://developer.mozilla.org/zh-CN/search?q=', - "CSDN": "https://so.csdn.net/so/search?q=", + CSDN: 'https://so.csdn.net/so/search?q=', - "掘金": "https://juejin.cn/search?query=", + 掘金: 'https://juejin.cn/search?query=', - "油猴": "https://greasyfork.org/zh-CN/scripts?q=", -}; + 油猴: 'https://greasyfork.org/zh-CN/scripts?q=' +} const searchReg = new RegExp(`^#?(${lodash.keys(SEARCH_MAP).join('|')})搜索(.*)`) export class example extends plugin { - constructor() { + constructor () { super({ name: '椰奶搜索', event: 'message', @@ -81,16 +81,17 @@ export class example extends plugin { }) } - async help(e) { - const searchs = Object.keys(SEARCH_MAP); - const menu = "当前支持的搜索引擎:\n"; - const tip = "\n格式:<搜索引擎> + 搜索 + <关键词>\n比如:萌娘百科搜索可莉"; - return e.reply(menu + searchs.join("、") + tip); + async help (e) { + const searchs = Object.keys(SEARCH_MAP) + const menu = '当前支持的搜索引擎:\n' + const tip = '\n格式:<搜索引擎> + 搜索 + <关键词>\n比如:萌娘百科搜索可莉' + return e.reply(menu + searchs.join('、') + tip) } - async search(e) { + + async search (e) { let regRet = searchReg.exec(e.msg) - if (/(lp|ip)|(i|p|l)(地址|查询)/ig.test(regRet[2])) return e.reply("(;`O´)o警告!!触发屏蔽词!!!", true) + if (/(lp|ip)|(i|p|l)(地址|查询)/ig.test(regRet[2])) return e.reply('(;`O´)o警告!!触发屏蔽词!!!', true) let url = SEARCH_MAP[regRet[1]] + encodeURIComponent(regRet[2]) - e.reply([await puppeteer.Webpage({ url }), url]); + e.reply([await puppeteer.Webpage({ url }), url]) } } diff --git a/apps/set.js b/apps/set.js index fb6d017..1517935 100644 --- a/apps/set.js +++ b/apps/set.js @@ -1,319 +1,318 @@ import plugin from '../../../lib/plugins/plugin.js' -import fs from "fs"; -import lodash from "lodash"; +import fs from 'fs' +import lodash from 'lodash' import { Config } from '../components/index.js' -import { YamlReader, setu, puppeteer } from '../model/index.js'; +import { YamlReader, setu, puppeteer } from '../model/index.js' const configs = { - "好友消息": "privateMessage", - "群消息": "groupMessage", - "群临时消息": "grouptemporaryMessage", - "群撤回": "groupRecall", - "好友撤回": "PrivateRecall", - // 申请通知 - "好友申请": "friendRequest", - "群邀请": "groupInviteRequest", - "加群申请": 'addGroupApplication', - // 信息变动 - "群管理变动": "groupAdminChange", - // 列表变动 - "好友列表变动": "friendNumberChange", - "群聊列表变动": "groupNumberChange", - "群成员变动": "groupMemberNumberChange", - // 其他通知 - "闪照": "flashPhoto", - "禁言": "botBeenBanned", + 好友消息: 'privateMessage', + 群消息: 'groupMessage', + 群临时消息: 'grouptemporaryMessage', + 群撤回: 'groupRecall', + 好友撤回: 'PrivateRecall', + // 申请通知 + 好友申请: 'friendRequest', + 群邀请: 'groupInviteRequest', + 加群申请: 'addGroupApplication', + // 信息变动 + 群管理变动: 'groupAdminChange', + // 列表变动 + 好友列表变动: 'friendNumberChange', + 群聊列表变动: 'groupNumberChange', + 群成员变动: 'groupMemberNumberChange', + // 其他通知 + 闪照: 'flashPhoto', + 禁言: 'botBeenBanned', - "全部通知": "notificationsAll", - "删除缓存": "deltime", - "涩涩": "sese", - "状态": "state", - "涩涩pro": "sesepro", - "陌生人点赞": "Strangers_love", - //给有问题的用户关闭定时器 - "状态任务": "statusTask" + 全部通知: 'notificationsAll', + 删除缓存: 'deltime', + 涩涩: 'sese', + 状态: 'state', + 涩涩pro: 'sesepro', + 陌生人点赞: 'Strangers_love', + // 给有问题的用户关闭定时器 + 状态任务: 'statusTask' } -let deltimereg = new RegExp('^#椰奶设置删除缓存时间(\\d+)秒?$') -let managereg = new RegExp(`^#椰奶设置(${Object.keys(configs).join("|")})(开启|关闭)$`) +let managereg = new RegExp(`^#椰奶设置(${Object.keys(configs).join('|')})(开启|关闭)$`) export class NewConfig extends plugin { - constructor() { - super({ - name: '椰奶配置', - event: 'message', - priority: 100, - rule: [ - { - reg: managereg, - fnc: 'Config_manage', - permission: 'master' - }, - { - reg: deltimereg, - fnc: 'Config_deltime', - permission: 'master' - }, - { - reg: '^#椰奶设置$', - fnc: 'yenaiset', - permission: 'master' - }, - { - reg: '^#椰奶(启用|禁用)全部通知$', - fnc: 'SetAll', - permission: 'master' - }, - { - reg: '^#椰奶(查看|更换)代理.*$', - fnc: 'proxy', - permission: 'master' - }, - { - reg: '^#(增加|减少|查看)头衔屏蔽词.*$', - fnc: 'NoTitle', - permission: 'master' - }, - { - reg: '^#切换头衔屏蔽词匹配(模式)?$', - fnc: 'NoTitlepattern', - permission: 'master' - }, - { - reg: '^#查看(sese|涩涩)设置$', - fnc: 'View_Settings', - permission: 'master' - } - ] - }) - this.NoTitlepath = './plugins/yenai-plugin/config/config/Shielding_words.yaml' - this.proxykey = `yenai:proxy` - this.proxydef = [ - "i.pixiv.re", - "proxy.pixivel.moe", - "px2.rainchan.win", - "sex.nyan.xyz" - ] - } - - //初始化 - async init() { - if (!await redis.get(this.proxykey)) { - await redis.set(this.proxykey, "i.pixiv.re") + constructor () { + super({ + name: '椰奶配置', + event: 'message', + priority: 100, + rule: [ + { + reg: managereg, + fnc: 'Config_manage', + permission: 'master' + }, + { + reg: '^#椰奶设置删除缓存时间(\\d+)秒?$', + fnc: 'Config_deltime', + permission: 'master' + }, + { + reg: '^#椰奶设置$', + fnc: 'yenaiset', + permission: 'master' + }, + { + reg: '^#椰奶(启用|禁用)全部通知$', + fnc: 'SetAll', + permission: 'master' + }, + { + reg: '^#椰奶(查看|更换)代理.*$', + fnc: 'proxy', + permission: 'master' + }, + { + reg: '^#(增加|减少|查看)头衔屏蔽词.*$', + fnc: 'NoTitle', + permission: 'master' + }, + { + reg: '^#切换头衔屏蔽词匹配(模式)?$', + fnc: 'NoTitlepattern', + permission: 'master' + }, + { + reg: '^#查看(sese|涩涩)设置$', + fnc: 'View_Settings', + permission: 'master' } + ] + }) + this.NoTitlepath = './plugins/yenai-plugin/config/config/Shielding_words.yaml' + this.proxykey = 'yenai:proxy' + this.proxydef = [ + 'i.pixiv.re', + 'proxy.pixivel.moe', + 'px2.rainchan.win', + 'sex.nyan.xyz' + ] + } + + // 初始化 + async init () { + if (!await redis.get(this.proxykey)) { + await redis.set(this.proxykey, 'i.pixiv.re') + } + } + + // 更改配置 + async Config_manage (e) { + // 解析消息 + let regRet = managereg.exec(e.msg) + let index = regRet[1] + let yes = regRet[2] == '开启' + // 处理 + Config.modify('whole', configs[index], yes) + // 单独处理 + if (index == '涩涩pro' && yes) Config.modify('whole', 'sese', yes) + + if (index == '涩涩' && !yes) Config.modify('whole', 'sesepro', yes) + + if (index == '涩涩' || index == '涩涩pro') return this.View_Settings(e) + this.yenaiset(e) + return true + } + + // 设置删除缓存时间 + async Config_deltime (e) { + let time = e.msg.match(/\d+/)[0] + + if (time < 120) return e.reply('❎ 时间不能小于两分钟') + + Config.modify('whole', 'deltime', Number(time[0])) + + this.yenaiset(e) + + return true + } + + // 修改全部设置 + async SetAll (e) { + let yes = /启用/.test(e.msg) + // 设置的任务 + let type = [ + 'privateMessage', + 'groupMessage', + 'grouptemporaryMessage', + 'groupRecall', + 'PrivateRecall', + 'friendRequest', + 'groupInviteRequest', + 'addGroupApplication', + 'groupAdminChange', + 'friendNumberChange', + 'groupNumberChange', + 'groupMemberNumberChange', + 'flashPhoto', + 'botBeenBanned' + ] + + for (let i in configs) { + if (!type.includes(configs[i])) continue + Config.modify('whole', configs[i], yes) } - // 更改配置 - async Config_manage(e) { - // 解析消息 - let regRet = managereg.exec(e.msg) - let index = regRet[1] - let yes = regRet[2] == "开启" ? true : false - // 处理 - Config.modify("whole", configs[index], yes) - //单独处理 - if (index == "涩涩pro" && yes) Config.modify("whole", "sese", yes) + this.yenaiset(e) + return true + } - if (index == "涩涩" && !yes) Config.modify("whole", "sesepro", yes) + // 渲染发送图片 + async yenaiset (e) { + let config = await Config.Notice + let data = { + // 好友消息 + privateMessage: getStatus(config.privateMessage), + // 群消息 + groupMessage: getStatus(config.groupMessage), + // 群临时消息 + grouptemporaryMessage: getStatus(config.grouptemporaryMessage), + // 群撤回 + groupRecall: getStatus(config.groupRecall), + // 好友撤回 + PrivateRecall: getStatus(config.PrivateRecall), + // 好友申请 + friendRequest: getStatus(config.friendRequest), + // 群邀请 + groupInviteRequest: getStatus(config.groupInviteRequest), + // 加群申请 + addGroupApplication: getStatus(config.addGroupApplication), + // 群管理变动 + groupAdminChange: getStatus(config.groupAdminChange), + // 好友列表变动 + friendNumberChange: getStatus(config.friendNumberChange), + // 群聊列表变动 + groupNumberChange: getStatus(config.groupNumberChange), + // 群成员变动 + groupMemberNumberChange: getStatus(config.groupMemberNumberChange), + // 闪照 + flashPhoto: getStatus(config.flashPhoto), + // 禁言 + botBeenBanned: getStatus(config.botBeenBanned), + // 全部通知 + notificationsAll: getStatus(config.notificationsAll), + // 陌生人点赞 + Strangers_love: getStatus(config.Strangers_love), + // 删除缓存时间 + deltime: Number(config.deltime), + // 默认状态 + state: getStatus(config.state), + // 状态任务定时器 + statusTask: getStatus(config.statusTask), - if (index == "涩涩" || index == "涩涩pro") return this.View_Settings(e) - this.yenaiset(e) - return true; + bg: await rodom() // 获取底图 } + // 渲染图像 + return await puppeteer.render('admin/index', { + ...data + }, { + e, + scale: 2.0 + }) + } - // 设置删除缓存时间 - async Config_deltime(e) { - let time = deltimereg.exec(e.msg)[1] + // 更换代理 + async proxy (e) { + if (/查看/.test(e.msg)) return e.reply(await redis.get(this.proxykey)) + let proxy = e.msg.replace(/#|椰奶更换代理/g, '').trim() + if (/^[1234]$/.test(proxy)) proxy = this.proxydef[proxy - 1] + if (!/([\w\d]+\.){2}[\w\d]+/.test(proxy)) return e.reply('请检查代理地址是否正确') + logger.mark(`${e.logFnc}切换为${proxy}`) + await redis.set(this.proxykey, proxy) + .then(() => e.reply(`✅ 已经切换代理为「${proxy}」`)) + .catch(err => console.log(err)) + } - if (time < 120) return e.reply('❎ 时间不能小于两分钟') - - Config.modify("whole", `deltime`, Number(time[0])) - - this.yenaiset(e) - - return true; - } - //修改全部设置 - async SetAll(e) { - let yes = /启用/.test(e.msg); - //设置的任务 - let type = [ - "privateMessage", - "groupMessage", - "grouptemporaryMessage", - "groupRecall", - "PrivateRecall", - "friendRequest", - "groupInviteRequest", - 'addGroupApplication', - "groupAdminChange", - "friendNumberChange", - "groupNumberChange", - "groupMemberNumberChange", - "flashPhoto", - "botBeenBanned", - ] - - for (let i in configs) { - if (!type.includes(configs[i])) continue - Config.modify("whole", configs[i], yes) - } - - this.yenaiset(e) - return true; - } - //渲染发送图片 - async yenaiset(e) { - - let config = await Config.Notice - let data = { - //好友消息 - privateMessage: getStatus(config.privateMessage), - //群消息 - groupMessage: getStatus(config.groupMessage), - //群临时消息 - grouptemporaryMessage: getStatus(config.grouptemporaryMessage), - //群撤回 - groupRecall: getStatus(config.groupRecall), - //好友撤回 - PrivateRecall: getStatus(config.PrivateRecall), - //好友申请 - friendRequest: getStatus(config.friendRequest), - //群邀请 - groupInviteRequest: getStatus(config.groupInviteRequest), - //加群申请 - addGroupApplication: getStatus(config.addGroupApplication), - //群管理变动 - groupAdminChange: getStatus(config.groupAdminChange), - //好友列表变动 - friendNumberChange: getStatus(config.friendNumberChange), - //群聊列表变动 - groupNumberChange: getStatus(config.groupNumberChange), - //群成员变动 - groupMemberNumberChange: getStatus(config.groupMemberNumberChange), - //闪照 - flashPhoto: getStatus(config.flashPhoto), - //禁言 - botBeenBanned: getStatus(config.botBeenBanned), - //全部通知 - notificationsAll: getStatus(config.notificationsAll), - //陌生人点赞 - Strangers_love: getStatus(config.Strangers_love), - //删除缓存时间 - deltime: Number(config.deltime), - //默认状态 - state: getStatus(config.state), - //状态任务定时器 - statusTask: getStatus(config.statusTask), - - bg: await rodom(), //获取底图 - } - //渲染图像 - return await puppeteer.render("admin/index", { - ...data, - }, { - e, - scale: 2.0 - }); - } - - //更换代理 - async proxy(e) { - if (/查看/.test(e.msg)) return e.reply(await redis.get(this.proxykey)) - let proxy = e.msg.replace(/#|椰奶更换代理/g, "").trim(); - if (/^[1234]$/.test(proxy)) proxy = this.proxydef[proxy - 1] - if (!/([\w\d]+\.){2}[\w\d]+/.test(proxy)) return e.reply('请检查代理地址是否正确') - logger.mark(`${e.logFnc}切换为${proxy}`) - await redis.set(this.proxykey, proxy) - .then(() => e.reply(`✅ 已经切换代理为「${proxy}」`)) - .catch(err => console.log(err)) - } - - //查看涩涩设置 - async View_Settings(e) { - let set = setu.getSeSeConfig(e) - let data = Config.Notice - e.reply([ - e.group_id ? `群${e.group_id}涩涩设置:\n` : `私聊涩涩设置:\n`, - `sese:${data.sese ? "✅" : "❎"}\n`, - `sesepro:${data.sesepro ? "✅" : "❎"}\n`, - `R17.9 + 0.1:${set.r18 ? "✅" : "❎"}\n`, + // 查看涩涩设置 + async View_Settings (e) { + let set = setu.getSeSeConfig(e) + let data = Config.Notice + e.reply([ + e.group_id ? `群${e.group_id}涩涩设置:\n` : '私聊涩涩设置:\n', + `sese:${data.sese ? '✅' : '❎'}\n`, + `sesepro:${data.sesepro ? '✅' : '❎'}\n`, + `R17.9 + 0.1:${set.r18 ? '✅' : '❎'}\n`, `CD:${set.cd}s`, - set.recall ? `\n撤回:${set.recall}s` : "" - ]) - } + set.recall ? `\n撤回:${set.recall}s` : '' + ]) + } - //增删查头衔屏蔽词 - async NoTitle(e) { - let getdata = new YamlReader(this.NoTitlepath) - let data = getdata.jsonData.Shielding_words - if (/查看/.test(e.msg)) { - return e.reply(`现有的头衔屏蔽词如下:${data.join("\n")}`) - } - let msg = e.msg.replace(/#|(增加|减少)头衔屏蔽词/g, "").trim().split(",") - let type = /增加/.test(e.msg) ? true : false - let no = [], yes = [] - for (let i of msg) { - if (data.includes(i)) { - no.push(i) - } else { - yes.push(i) - } - } - no = lodash.compact(lodash.uniq(no)) - yes = lodash.compact(lodash.uniq(yes)) - if (type) { - if (!lodash.isEmpty(yes)) { - for (let i of yes) { - getdata.addIn("Shielding_words", i) - } - e.reply(`✅ 成功添加:${yes.join(",")}`) - } - if (!lodash.isEmpty(no)) { - e.reply(`❎ 以下词已存在:${no.join(",")}`) - } - } else { - if (!lodash.isEmpty(no)) { - for (let i of no) { - let index = data.indexOf(i) - getdata.delete("Shielding_words." + index) - } - e.reply(`✅ 成功删除:${no.join(",")}`) - } - if (!lodash.isEmpty(yes)) { - e.reply(`❎ 以下词未在屏蔽词中:${yes.join(",")}`) - } - } + // 增删查头衔屏蔽词 + async NoTitle (e) { + let getdata = new YamlReader(this.NoTitlepath) + let data = getdata.jsonData.Shielding_words + if (/查看/.test(e.msg)) { + return e.reply(`现有的头衔屏蔽词如下:${data.join('\n')}`) } - //修改头衔匹配模式 - async NoTitlepattern(e) { - let getdata = new YamlReader(this.NoTitlepath) - let data = getdata.jsonData.Match_pattern - if (data) { - getdata.set("Match_pattern", 0) - e.reply("✅ 已修改匹配模式为精确匹配") - } else { - getdata.set("Match_pattern", 1) - e.reply("✅ 已修改匹配模式为模糊匹配") - } + let msg = e.msg.replace(/#|(增加|减少)头衔屏蔽词/g, '').trim().split(',') + let type = !!/增加/.test(e.msg) + let no = []; let yes = [] + for (let i of msg) { + if (data.includes(i)) { + no.push(i) + } else { + yes.push(i) + } } + no = lodash.compact(lodash.uniq(no)) + yes = lodash.compact(lodash.uniq(yes)) + if (type) { + if (!lodash.isEmpty(yes)) { + for (let i of yes) { + getdata.addIn('Shielding_words', i) + } + e.reply(`✅ 成功添加:${yes.join(',')}`) + } + if (!lodash.isEmpty(no)) { + e.reply(`❎ 以下词已存在:${no.join(',')}`) + } + } else { + if (!lodash.isEmpty(no)) { + for (let i of no) { + let index = data.indexOf(i) + getdata.delete('Shielding_words.' + index) + } + e.reply(`✅ 成功删除:${no.join(',')}`) + } + if (!lodash.isEmpty(yes)) { + e.reply(`❎ 以下词未在屏蔽词中:${yes.join(',')}`) + } + } + } + + // 修改头衔匹配模式 + async NoTitlepattern (e) { + let getdata = new YamlReader(this.NoTitlepath) + let data = getdata.jsonData.Match_pattern + if (data) { + getdata.set('Match_pattern', 0) + e.reply('✅ 已修改匹配模式为精确匹配') + } else { + getdata.set('Match_pattern', 1) + e.reply('✅ 已修改匹配模式为模糊匹配') + } + } } -//随机底图 +// 随机底图 const rodom = async function () { - var image = fs.readdirSync(`./plugins/yenai-plugin/resources/admin/imgs/bg`); - var list_img = []; - for (let val of image) { - list_img.push(val) - } - var imgs = list_img.length == 1 ? list_img[0] : list_img[lodash.random(0, list_img.length - 1)]; - return imgs; + let image = fs.readdirSync('./plugins/yenai-plugin/resources/admin/imgs/bg') + let listImg = [] + for (let val of image) { + listImg.push(val) + } + let imgs = listImg.length == 1 ? listImg[0] : listImg[lodash.random(0, listImg.length - 1)] + return imgs } const getStatus = function (rote) { - if (rote) { - return `
已开启
`; - } else { - return `
已关闭
`; - } - + if (rote) { + return '
已开启
' + } else { + return '
已关闭
' + } } - diff --git a/apps/setu.js b/apps/setu.js index 21e3ab0..93a8ead 100644 --- a/apps/setu.js +++ b/apps/setu.js @@ -2,13 +2,13 @@ import plugin from '../../../lib/plugins/plugin.js' import { Config } from '../components/index.js' import { setu, common } from '../model/index.js' import { NewConfig } from './set.js' -const SWITCH_ERROR = "主人没有开放这个功能哦(*/ω\*)" +const SWITCH_ERROR = '主人没有开放这个功能哦(*/ω\*)' -let NumReg = "[一壹二两三四五六七八九十百千万亿\\d]+" +let NumReg = '[一壹二两三四五六七八九十百千万亿\\d]+' let seturdReg = new RegExp(`^#(setu|无内鬼)\\s?((${NumReg})张)?$`) -let setcdReg = new RegExp(`^#?设置cd\\s?(\\d+)\\s(${NumReg})(s|秒)?$`, "i"); +let setcdReg = new RegExp(`^#?设置cd\\s?(\\d+)\\s(${NumReg})(s|秒)?$`, 'i') export class sese extends plugin { - constructor() { + constructor () { super({ name: '椰奶setu', event: 'message', @@ -19,7 +19,7 @@ export class sese extends plugin { fnc: 'setutag' }, { - reg: seturdReg,//无内鬼 + reg: seturdReg, // 无内鬼 fnc: 'seturd' }, { @@ -40,7 +40,7 @@ export class sese extends plugin { permission: 'master' }, { - reg: setcdReg,//设置cd + reg: setcdReg, // 设置cd fnc: 'setCd', permission: 'master' } @@ -48,7 +48,7 @@ export class sese extends plugin { }) } - async seturd(e) { + async seturd (e) { if (!Config.getGroup(e.group_id).sesepro && !e.isMaster) return e.reply(SWITCH_ERROR) let iscd = setu.getremainingCd(e) @@ -60,9 +60,9 @@ export class sese extends plugin { num = num[3] ? common.translateChinaNum(num[3]) : 1 if (num > 20) { - return e.reply("❎ 最大张数不能大于20张") + return e.reply('❎ 最大张数不能大于20张') } else if (num > 6) { - e.reply("你先等等,你冲的有点多~") + e.reply('你先等等,你冲的有点多~') } else { e.reply(setu.startMsg) } @@ -74,84 +74,84 @@ export class sese extends plugin { setu.sendMsgOrSetCd(e, res) } - //tag搜图 - async setutag(e) { + // tag搜图 + async setutag (e) { if (!Config.getGroup(e.group_id).sesepro && !e.isMaster) return e.reply(SWITCH_ERROR) let iscd = setu.getremainingCd(e) if (iscd) return e.reply(` ${setu.CDMsg}你的CD还有${iscd}`, false, { at: true }) - let tag = e.msg.replace(/#|椰奶tag/g, "").trim() + let tag = e.msg.replace(/#|椰奶tag/g, '').trim() let num = e.msg.match(new RegExp(`(${NumReg})张`)) if (!num) { num = 1 } else { - tag = tag.replace(num[0], "").trim() + tag = tag.replace(num[0], '').trim() num = common.translateChinaNum(num[1]) } if (num > 20) { - return e.reply("❎ 最大张数不能大于20张") + return e.reply('❎ 最大张数不能大于20张') } else if (num > 6) { - e.reply("你先等等,你冲的有点多~") + e.reply('你先等等,你冲的有点多~') } else { e.reply(setu.startMsg) } - if (!tag) return e.reply("tag为空!!!", false, { at: true }) + if (!tag) return e.reply('tag为空!!!', false, { at: true }) - tag = tag.split(" ") + tag = tag.split(' ') - if (tag.length > 3) return e.reply("tag最多只能指定三个哦~", false, { at: true }) + if (tag.length > 3) return e.reply('tag最多只能指定三个哦~', false, { at: true }) - tag = tag.map((item) => `&tag=${item}`).join("") + tag = tag.map((item) => `&tag=${item}`).join('') - //接口 + // 接口 let res = await setu.setuapi(e, setu.getR18(e.group_id), num, tag) - if (!res) return false; + if (!res) return false - //发送消息 + // 发送消息 setu.sendMsgOrSetCd(e, res) } - //设置群撤回间隔和cd - async setGroupRecallAndCD(e) { - let num = e.msg.replace(/#|撤回间隔|群cd/gi, "").trim() + // 设置群撤回间隔和cd + async setGroupRecallAndCD (e) { + let num = e.msg.replace(/#|撤回间隔|群cd/gi, '').trim() num = common.translateChinaNum(num) let type = /撤回间隔/.test(e.msg) setu.setGroupRecallTimeAndCd(e.group_id, num, type) new NewConfig().View_Settings(e) } - //开启r18 - async setsese(e) { - let isopen = /开启/.test(e.msg) ? true : false + // 开启r18 + async setsese (e) { + let isopen = !!/开启/.test(e.msg) setu.setR18(e.group_id, isopen) new NewConfig().View_Settings(e) } - //艾特设置cd - async atSetCd(e) { + // 艾特设置cd + async atSetCd (e) { let qq = e.message.find(item => item.type == 'at')?.qq - if (!qq) return false; + if (!qq) return false let cd = e.msg.match(new RegExp(NumReg)) - if (!cd) return e.reply("❎ CD为空,请检查", true); + if (!cd) return e.reply('❎ CD为空,请检查', true) cd = common.translateChinaNum(cd[0]) setu.setUserCd(e, qq, cd) } - //指令设置 - async setCd(e) { - let cdreg = setcdReg.exec(e.msg); + // 指令设置 + async setCd (e) { + let cdreg = setcdReg.exec(e.msg) let qq = cdreg[1] let cd = common.translateChinaNum(cdreg[2]) setu.setUserCd(e, qq, cd) diff --git a/apps/state.js b/apps/state.js index e153421..e05b323 100644 --- a/apps/state.js +++ b/apps/state.js @@ -1,15 +1,15 @@ import plugin from '../../../lib/plugins/plugin.js' -import os from 'os'; +import os from 'os' import { Config } from '../components/index.js' import { CPU, common, puppeteer } from '../model/index.js' -import moment from 'moment'; +import moment from 'moment' import lodash from 'lodash' -let si = await redis.get('yenai:node_modules') ? await import("systeminformation") : false +let si = await redis.get('yenai:node_modules') ? await import('systeminformation') : false -let interval = false; +let interval = false export class State extends plugin { - constructor() { + constructor () { super({ name: '椰奶状态', event: 'message', @@ -24,79 +24,77 @@ export class State extends plugin { }) } - async state(e) { - if (!/椰奶/.test(e.msg) && !Config.Notice.state) return false; + async state (e) { + if (!/椰奶/.test(e.msg) && !Config.Notice.state) return false - if (!si) return e.reply(`❎ 没有检测到systeminformation依赖,请运行:"pnpm add systeminformation -w"进行安装`) - //防止多次触发 - if (interval) { return false; } else interval = true; - //系统 - let osinfo = await si.osInfo(); - //可视化数据 + if (!si) return e.reply('❎ 没有检测到systeminformation依赖,请运行:"pnpm add systeminformation -w"进行安装') + // 防止多次触发 + if (interval) { return false } else interval = true + // 系统 + let osinfo = await si.osInfo() + // 可视化数据 let visualData = lodash.compact([ - //CPU板块 + // CPU板块 await CPU.getCpuInfo(osinfo.arch), - //内存板块 + // 内存板块 await CPU.getMemUsage(), - //GPU板块 + // GPU板块 await CPU.getGPU(), - //Node板块 + // Node板块 await CPU.getNodeInfo() ]) - //渲染数据 + // 渲染数据 let data = { - //头像 + // 头像 portrait: `https://q1.qlogo.cn/g?b=qq&s=0&nk=${Bot.uin}`, - //运行时间 + // 运行时间 runTime: Formatting(Date.now() / 1000 - Bot.stat.start_time), - //日历 - calendar: moment().format("YYYY-MM-DD HH:mm:ss"), - //昵称 + // 日历 + calendar: moment().format('YYYY-MM-DD HH:mm:ss'), + // 昵称 nickname: Bot.nickname, - //系统运行时间 + // 系统运行时间 systime: Formatting(os.uptime()), - //收 + // 收 recv: Bot.statistics.recv_msg_cnt, - //发 - sent: await redis.get(`Yz:count:sendMsg:total`) || 0, - //图片 - screenshot: await redis.get(`Yz:count:screenshot:total`) || 0, - //nodejs版本 + // 发 + sent: await redis.get('Yz:count:sendMsg:total') || 0, + // 图片 + screenshot: await redis.get('Yz:count:screenshot:total') || 0, + // nodejs版本 nodeversion: process.version, - //群数 + // 群数 group_quantity: Array.from(Bot.gl.values()).length, - //好友数 + // 好友数 friend_quantity: Array.from(Bot.fl.values()).length, - //登陆设备 + // 登陆设备 platform: common.platform[Bot.config.platform], - //在线状态 + // 在线状态 status: common.status[Bot.status], - //硬盘内存 + // 硬盘内存 HardDisk: await CPU.getfsSize(), - //FastFetch + // FastFetch FastFetch: await CPU.getFastFetch(e), // 取插件 plugin: CPU.numberOfPlugIns, - //硬盘速率 + // 硬盘速率 fsStats: CPU.DiskSpeed, - //网络 + // 网络 network: CPU.getnetwork, - //可视化数据 + // 可视化数据 visualData, - //系统信息 - osinfo, + // 系统信息 + osinfo } - //渲染图片 + // 渲染图片 await puppeteer.render('state/state', { - ...data, + ...data }, { e, scale: 2.0 }) - interval = false; + interval = false } - - } /** @@ -105,15 +103,14 @@ export class State extends plugin { * @param {boolean} yes 是否补零 * @return {String} 天:?时:分:秒 */ -function Formatting(time, repair = true) { +function Formatting (time, repair = true) { let times = common.getsecond(time, repair) let { second, minute, hour, day } = times if (day > 0) { - return day + "天 " + hour + ":" + minute + ":" + second + return day + '天 ' + hour + ':' + minute + ':' + second } else { - return hour + ":" + minute + ":" + second + return hour + ':' + minute + ':' + second } - } diff --git a/apps/update.js b/apps/update.js index e02e157..1a7038f 100644 --- a/apps/update.js +++ b/apps/update.js @@ -1,52 +1,52 @@ -import plugin from "../../../lib/plugins/plugin.js"; -import { createRequire } from "module"; -import lodash from "lodash"; +import plugin from '../../../lib/plugins/plugin.js' +import { createRequire } from 'module' +import lodash from 'lodash' import { Restart } from '../../other/restart.js' -const require = createRequire(import.meta.url); -const { exec, execSync } = require("child_process"); +const require = createRequire(import.meta.url) +const { exec, execSync } = require('child_process') // 是否在更新中 -let uping = false; +let uping = false /** * 处理插件更新 */ export class update extends plugin { - constructor() { + constructor () { super({ - name: "椰奶更新插件", - event: "message", + name: '椰奶更新插件', + event: 'message', priority: 1000, rule: [ { - reg: "^#*椰奶(插件)?(强制)?更新$", - fnc: "update", - }, - ], - }); + reg: '^#*椰奶(插件)?(强制)?更新$', + fnc: 'update' + } + ] + }) } /** * rule - 更新椰奶插件 * @returns */ - async update() { - if (!this.e.isMaster) return false; + async update () { + if (!this.e.isMaster) return false /** 检查是否正在更新中 */ if (uping) { - await this.reply("已有命令更新中..请勿重复操作"); - return; + await this.reply('已有命令更新中..请勿重复操作') + return } /** 检查git安装 */ - if (!(await this.checkGit())) return; + if (!(await this.checkGit())) return - const isForce = this.e.msg.includes("强制"); + const isForce = this.e.msg.includes('强制') /** 执行更新 */ - await this.runUpdate(isForce); + await this.runUpdate(isForce) /** 是否需要重启 */ if (this.isUp) { @@ -55,7 +55,7 @@ export class update extends plugin { } } - restart() { + restart () { new Restart(this.e).restart() } @@ -64,42 +64,42 @@ export class update extends plugin { * @param {boolean} isForce 是否为强制更新 * @returns */ - async runUpdate(isForce) { - let command = "git -C ./plugins/yenai-plugin/ pull --no-rebase"; + async runUpdate (isForce) { + let command = 'git -C ./plugins/yenai-plugin/ pull --no-rebase' if (isForce) { - command = `git -C ./plugins/yenai-plugin/ checkout . && ${command}`; - this.e.reply("正在执行强制更新操作,请稍等"); + command = `git -C ./plugins/yenai-plugin/ checkout . && ${command}` + this.e.reply('正在执行强制更新操作,请稍等') } else { - this.e.reply("正在执行更新操作,请稍等"); + this.e.reply('正在执行更新操作,请稍等') } /** 获取上次提交的commitId,用于获取日志时判断新增的更新日志 */ - this.oldCommitId = await this.getcommitId("yenai-plugin"); - uping = true; - let ret = await this.execSync(command); - uping = false; + this.oldCommitId = await this.getcommitId('yenai-plugin') + uping = true + let ret = await this.execSync(command) + uping = false if (ret.error) { - logger.mark(`${this.e.logFnc} 更新失败:椰奶插件`); - this.gitErr(ret.error, ret.stdout); - return false; + logger.mark(`${this.e.logFnc} 更新失败:椰奶插件`) + this.gitErr(ret.error, ret.stdout) + return false } /** 获取插件提交的最新时间 */ - let time = await this.getTime("yenai-plugin"); + let time = await this.getTime('yenai-plugin') if (/(Already up[ -]to[ -]date|已经是最新的)/.test(ret.stdout)) { - await this.reply(`椰奶插件已经是最新版本\n最后更新时间:${time}`); + await this.reply(`椰奶插件已经是最新版本\n最后更新时间:${time}`) } else { - await this.reply(`椰奶插件\n最后更新时间:${time}`); - this.isUp = true; + await this.reply(`椰奶插件\n最后更新时间:${time}`) + this.isUp = true /** 获取椰奶组件的更新日志 */ - let log = await this.getLog("yenai-plugin"); - await this.reply(log); + let log = await this.getLog('yenai-plugin') + await this.reply(log) } - logger.mark(`${this.e.logFnc} 最后更新时间:${time}`); + logger.mark(`${this.e.logFnc} 最后更新时间:${time}`) - return true; + return true } /** @@ -107,40 +107,40 @@ export class update extends plugin { * @param {string} plugin 插件名称 * @returns */ - async getLog(plugin = "") { - let cm = `cd ./plugins/${plugin}/ && git log -20 --oneline --pretty=format:"%h||[%cd] %s" --date=format:"%m-%d %H:%M"`; + async getLog (plugin = '') { + let cm = `cd ./plugins/${plugin}/ && git log -20 --oneline --pretty=format:"%h||[%cd] %s" --date=format:"%m-%d %H:%M"` - let logAll; + let logAll try { - logAll = await execSync(cm, { encoding: "utf-8" }); + logAll = await execSync(cm, { encoding: 'utf-8' }) } catch (error) { - logger.error(error.toString()); - this.reply(error.toString()); + logger.error(error.toString()) + this.reply(error.toString()) } - if (!logAll) return false; + if (!logAll) return false - logAll = logAll.split("\n"); + logAll = logAll.split('\n') - let log = []; + let log = [] for (let str of logAll) { - str = str.split("||"); - if (str[0] == this.oldCommitId) break; - if (str[1].includes("Merge branch")) continue; - log.push(str[1]); + str = str.split('||') + if (str[0] == this.oldCommitId) break + if (str[1].includes('Merge branch')) continue + log.push(str[1]) } - let line = log.length; - log = log.join("\n\n"); + let line = log.length + log = log.join('\n\n') - if (log.length <= 0) return ""; + if (log.length <= 0) return '' - let end = ""; + let end = '' end = - "更多详细信息,请前往gitee查看\nhttps://gitee.com/yeyang52/yenai-plugin/blob/master/CHANGELOG.md"; + '更多详细信息,请前往gitee查看\nhttps://gitee.com/yeyang52/yenai-plugin/blob/master/CHANGELOG.md' - log = await this.makeForwardMsg(`椰奶插件更新日志,共${line}条`, log, end); + log = await this.makeForwardMsg(`椰奶插件更新日志,共${line}条`, log, end) - return log; + return log } /** @@ -148,13 +148,13 @@ export class update extends plugin { * @param {string} plugin 插件名称 * @returns */ - async getcommitId(plugin = "") { - let cm = `git -C ./plugins/${plugin}/ rev-parse --short HEAD`; + async getcommitId (plugin = '') { + let cm = `git -C ./plugins/${plugin}/ rev-parse --short HEAD` - let commitId = await execSync(cm, { encoding: "utf-8" }); - commitId = lodash.trim(commitId); + let commitId = await execSync(cm, { encoding: 'utf-8' }) + commitId = lodash.trim(commitId) - return commitId; + return commitId } /** @@ -162,18 +162,18 @@ export class update extends plugin { * @param {string} plugin 插件名称 * @returns */ - async getTime(plugin = "") { - let cm = `cd ./plugins/${plugin}/ && git log -1 --oneline --pretty=format:"%cd" --date=format:"%m-%d %H:%M"`; + async getTime (plugin = '') { + let cm = `cd ./plugins/${plugin}/ && git log -1 --oneline --pretty=format:"%cd" --date=format:"%m-%d %H:%M"` - let time = ""; + let time = '' try { - time = await execSync(cm, { encoding: "utf-8" }); - time = lodash.trim(time); + time = await execSync(cm, { encoding: 'utf-8' }) + time = lodash.trim(time) } catch (error) { - logger.error(error.toString()); - time = "获取时间失败"; + logger.error(error.toString()) + time = '获取时间失败' } - return time; + return time } /** @@ -183,49 +183,49 @@ export class update extends plugin { * @param {string} end 最后一条信息 * @returns */ - async makeForwardMsg(title, msg, end) { - let nickname = Bot.nickname; + async makeForwardMsg (title, msg, end) { + let nickname = Bot.nickname if (this.e.isGroup) { - let info = await Bot.getGroupMemberInfo(this.e.group_id, Bot.uin); - nickname = info.card || info.nickname; + let info = await Bot.getGroupMemberInfo(this.e.group_id, Bot.uin) + nickname = info.card || info.nickname } let userInfo = { user_id: Bot.uin, - nickname, - }; + nickname + } let forwardMsg = [ { ...userInfo, - message: title, + message: title }, { ...userInfo, - message: msg, - }, - ]; + message: msg + } + ] if (end) { forwardMsg.push({ ...userInfo, - message: end, - }); + message: end + }) } /** 制作转发内容 */ if (this.e.isGroup) { - forwardMsg = await this.e.group.makeForwardMsg(forwardMsg); + forwardMsg = await this.e.group.makeForwardMsg(forwardMsg) } else { - forwardMsg = await this.e.friend.makeForwardMsg(forwardMsg); + forwardMsg = await this.e.friend.makeForwardMsg(forwardMsg) } /** 处理描述 */ forwardMsg.data = forwardMsg.data - .replace(/\n/g, "") - .replace(/(.+?)<\/title>/g, "___") - .replace(/___+/, `<title color="#777777" size="26">${title}`); + .replace(/\n/g, '') + .replace(/(.+?)<\/title>/g, '___') + .replace(/___+/, `<title color="#777777" size="26">${title}`) - return forwardMsg; + return forwardMsg } /** @@ -234,43 +234,43 @@ export class update extends plugin { * @param {string} stdout * @returns */ - async gitErr(err, stdout) { - let msg = "更新失败!"; - let errMsg = err.toString(); - stdout = stdout.toString(); + async gitErr (err, stdout) { + let msg = '更新失败!' + let errMsg = err.toString() + stdout = stdout.toString() - if (errMsg.includes("Timed out")) { - let remote = errMsg.match(/'(.+?)'/g)[0].replace(/'/g, ""); - await this.reply(msg + `\n连接超时:${remote}`); - return; + if (errMsg.includes('Timed out')) { + let remote = errMsg.match(/'(.+?)'/g)[0].replace(/'/g, '') + await this.reply(msg + `\n连接超时:${remote}`) + return } if (/Failed to connect|unable to access/g.test(errMsg)) { - let remote = errMsg.match(/'(.+?)'/g)[0].replace(/'/g, ""); - await this.reply(msg + `\n连接失败:${remote}`); - return; + let remote = errMsg.match(/'(.+?)'/g)[0].replace(/'/g, '') + await this.reply(msg + `\n连接失败:${remote}`) + return } - if (errMsg.includes("be overwritten by merge")) { + if (errMsg.includes('be overwritten by merge')) { await this.reply( msg + `存在冲突:\n${errMsg}\n` + - "请解决冲突后再更新,或者执行#强制更新,放弃本地修改" - ); - return; + '请解决冲突后再更新,或者执行#强制更新,放弃本地修改' + ) + return } - if (stdout.includes("CONFLICT")) { + if (stdout.includes('CONFLICT')) { await this.reply([ - msg + "存在冲突\n", + msg + '存在冲突\n', errMsg, stdout, - "\n请解决冲突后再更新,或者执行#强制更新,放弃本地修改", - ]); - return; + '\n请解决冲突后再更新,或者执行#强制更新,放弃本地修改' + ]) + return } - await this.reply([errMsg, stdout]); + await this.reply([errMsg, stdout]) } /** @@ -278,24 +278,24 @@ export class update extends plugin { * @param {string} cmd git命令 * @returns */ - async execSync(cmd) { + async execSync (cmd) { return new Promise((resolve, reject) => { exec(cmd, { windowsHide: true }, (error, stdout, stderr) => { - resolve({ error, stdout, stderr }); - }); - }); + resolve({ error, stdout, stderr }) + }) + }) } /** * 检查git是否安装 * @returns */ - async checkGit() { - let ret = await execSync("git --version", { encoding: "utf-8" }); - if (!ret || !ret.includes("git version")) { - await this.reply("请先安装git"); - return false; + async checkGit () { + let ret = await execSync('git --version', { encoding: 'utf-8' }) + if (!ret || !ret.includes('git version')) { + await this.reply('请先安装git') + return false } - return true; + return true } } diff --git a/components/Config.js b/components/Config.js index ca278b9..5242031 100644 --- a/components/Config.js +++ b/components/Config.js @@ -1,3 +1,4 @@ + import YAML from 'yaml' import chokidar from 'chokidar' import fs from 'node:fs' @@ -7,11 +8,11 @@ import loader from '../../../lib/plugins/loader.js' import lodash from 'lodash' import moment from 'moment' -const Path = process.cwd(); +const Path = process.cwd() const Plugin_Name = 'yenai-plugin' -const Plugin_Path = `${Path}/plugins/${Plugin_Name}`; +const Plugin_Path = `${Path}/plugins/${Plugin_Name}` class Config { - constructor() { + constructor () { this.config = {} /** 监听文件 */ @@ -19,8 +20,9 @@ class Config { this.initCfg() } + /** 初始化配置 */ - initCfg() { + initCfg () { let path = `${Plugin_Path}/config/config/` let pathDef = `${Plugin_Path}/config/default_config/` const files = fs.readdirSync(pathDef).filter(file => file.endsWith('.yaml')) @@ -28,14 +30,14 @@ class Config { if (!fs.existsSync(`${path}${file}`)) { fs.copyFileSync(`${pathDef}${file}`, `${path}${file}`) } - this.watch(`${path}${file}`, file.replace('.yaml', ""), 'config') + this.watch(`${path}${file}`, file.replace('.yaml', ''), 'config') } } /** 群配置 */ - getGroup(groupId = '') { + getGroup (groupId = '') { let config = this.getConfig('whole') - let group = this.getConfig("group") + let group = this.getConfig('group') let defCfg = this.getdefSet('whole') if (group[groupId]) { @@ -43,40 +45,46 @@ class Config { } return { ...defCfg, ...config } } - /**主人QQ */ - get masterQQ() { + + /** 主人QQ */ + get masterQQ () { return cfg.masterQQ } - /**获取全局设置 */ - get Notice() { + + /** 获取全局设置 */ + get Notice () { return this.getDefOrConfig('whole') } - /**进群验证配置 */ - get verifycfg() { - return this.getDefOrConfig("groupverify"); - } - /**头衔屏蔽词 */ - get NoTitle() { - return this.getDefOrConfig("Shielding_words"); - } - /**加群通知 */ - get groupAdd() { - return this.getDefOrConfig("groupAdd"); + + /** 进群验证配置 */ + get verifycfg () { + return this.getDefOrConfig('groupverify') } - /** 默认配置和用户配置*/ - getDefOrConfig(name) { + /** 头衔屏蔽词 */ + get NoTitle () { + return this.getDefOrConfig('Shielding_words') + } + + /** 加群通知 */ + get groupAdd () { + return this.getDefOrConfig('groupAdd') + } + + /** 默认配置和用户配置 */ + getDefOrConfig (name) { let def = this.getdefSet(name) let config = this.getConfig(name) return { ...def, ...config } } + /** 默认配置 */ - getdefSet(name) { + getdefSet (name) { return this.getYaml('default_config', name) } /** 用户配置 */ - getConfig(name) { + getConfig (name) { return this.getYaml('config', name) } @@ -85,7 +93,7 @@ class Config { * @param type 默认跑配置-defSet,用户配置-config * @param name 名称 */ - getYaml(type, name) { + getYaml (type, name) { let file = `${Plugin_Path}/config/${type}/${name}.yaml` let key = `${type}.${name}` @@ -101,7 +109,7 @@ class Config { } /** 监听配置文件 */ - watch(file, name, type = 'default_config') { + watch (file, name, type = 'default_config') { let key = `${type}.${name}` if (this.watcher[key]) return @@ -126,22 +134,17 @@ class Config { * @param {*} value 修改的value值 * @return {Boolean} 返回是否成功写入 */ - modify(name, key, value) { + modify (name, key, value) { let path = `${Plugin_Path}/config/config/${name}.yaml` new YamlReader(path).set(key, value) delete this.config[`config.${name}`] } - async change_picApi() { + async change_picApi () { let tmp = {} - try { - logger.debug("[椰奶]api接口修改,重载fun.js") - tmp = await import(`../apps/fun.js?${moment().format('x')}`) - } catch (error) { - logger.error(`载入插件错误:${logger.red(dirName + '/' + appName)}`) - logger.error(decodeURI(error.stack)) - return - } + + logger.debug('[椰奶]api接口修改,重载fun.js') + tmp = await import(`../apps/fun.js?${moment().format('x')}`) lodash.forEach(tmp, (p) => { /* eslint-disable new-cap */ @@ -155,4 +158,4 @@ class Config { }) } } -export default new Config() \ No newline at end of file +export default new Config() diff --git a/components/Data.js b/components/Data.js index 6421c63..696a10e 100644 --- a/components/Data.js +++ b/components/Data.js @@ -17,7 +17,7 @@ let Data = { /* * 根据指定的path依次检查与创建目录 * */ - createDir(path = '', root = '', includeFile = false) { + createDir (path = '', root = '', includeFile = false) { root = getRoot(root) let pathList = path.split('/') let nowPath = root @@ -34,8 +34,8 @@ let Data = { }) }, - /**读取json */ - readJSON(file = '', root = '') { + /** 读取json */ + readJSON (file = '', root = '') { root = getRoot(root) if (fs.existsSync(`${root}/${file}`)) { try { @@ -47,8 +47,8 @@ let Data = { return {} }, - /**写JSON */ - writeJSON(file, data, root = '', space = '\t') { + /** 写JSON */ + writeJSON (file, data, root = '', space = '\t') { // 检查并创建目录 Data.createDir(file, root, true) root = getRoot(root) @@ -58,11 +58,11 @@ let Data = { return true } catch (err) { logger.error(err) - return false; + return false } }, - async getCacheJSON(key) { + async getCacheJSON (key) { try { let txt = await redis.get(key) if (txt) { @@ -74,11 +74,11 @@ let Data = { return {} }, - async setCacheJSON(key, data, EX = 3600 * 24 * 90) { + async setCacheJSON (key, data, EX = 3600 * 24 * 90) { await redis.set(key, JSON.stringify(data), { EX }) }, - async importModule(file, root = '') { + async importModule (file, root = '') { root = getRoot(root) if (!/\.js$/.test(file)) { file = file + '.js' @@ -94,16 +94,16 @@ let Data = { return {} }, - async importDefault(file, root) { + async importDefault (file, root) { let ret = await Data.importModule(file, root) return ret.default || {} }, - async import(name) { + async import (name) { return await Data.importModule(`components/optional-lib/${name}.js`) }, - async importCfg(key) { + async importCfg (key) { let sysCfg = await Data.importModule(`config/system/${key}_system.js`) let diyCfg = await Data.importModule(`config/${key}.js`) if (diyCfg.isSys) { @@ -128,7 +128,7 @@ let Data = { * * */ - getData(target, keyList = '', cfg = {}) { + getData (target, keyList = '', cfg = {}) { target = target || {} let defaultData = cfg.defaultData || {} let ret = {} @@ -155,12 +155,12 @@ let Data = { return ret }, - getVal(target, keyFrom, defaultValue) { + getVal (target, keyFrom, defaultValue) { return lodash.get(target, keyFrom, defaultValue) }, // 异步池,聚合请求 - async asyncPool(poolLimit, array, iteratorFn) { + async asyncPool (poolLimit, array, iteratorFn) { const ret = [] // 存储所有的异步任务 const executing = [] // 存储正在执行的异步任务 for (const item of array) { @@ -184,12 +184,12 @@ let Data = { }, // sleep - sleep(ms) { + sleep (ms) { return new Promise((resolve) => setTimeout(resolve, ms)) }, // 获取默认值 - def() { + def () { for (let idx in arguments) { if (!lodash.isUndefined(arguments[idx])) { return arguments[idx] @@ -212,7 +212,7 @@ let Data = { }) }, - regRet(reg, txt, idx) { + regRet (reg, txt, idx) { if (reg && txt) { let ret = reg.exec(txt) if (ret && ret[idx]) { diff --git a/components/Version.js b/components/Version.js index 9483086..14cbda5 100644 --- a/components/Version.js +++ b/components/Version.js @@ -1,10 +1,11 @@ + import fs from 'fs' import lodash from 'lodash' import cfg from '../../../lib/config/config.js' -const Plugin_Path = `${process.cwd()}/plugins/yenai-plugin`; +const Plugin_Path = `${process.cwd()}/plugins/yenai-plugin` const README_path = `${Plugin_Path}/README.md` const CHANGELOG_path = `${Plugin_Path}/CHANGELOG.md` -const yunzai_ver = `v${cfg.package.version}`; +const yunzai_ver = `v${cfg.package.version}` let logs = {} let changelogs = [] @@ -15,7 +16,7 @@ const getLine = function (line) { line = line.replace(/(^\s*\*|\r)/g, '') line = line.replace(/\s*`([^`]+`)/g, '$1') line = line.replace(/`\s*/g, '') - line = line.replace(/\s*\*\*([^\*]+\*\*)/g, '$1') + line = line.replace(/\s*\*\*([^*]+\*\*)/g, '$1') line = line.replace(/\*\*\s*/g, '') line = line.replace(/ⁿᵉʷ/g, '') return line @@ -25,7 +26,7 @@ try { if (fs.existsSync(CHANGELOG_path)) { logs = fs.readFileSync(CHANGELOG_path, 'utf8') || '' logs = logs.replace(/\t/g, ' ').split('\n') - let temp = {}; + let temp = {} let lastLine = {} lodash.forEach(logs, (line) => { if (versionCount <= -1) { @@ -39,7 +40,7 @@ try { } else { changelogs.push(temp) if (/0\s*$/.test(v) && versionCount > 0) { - //versionCount = 0 + // versionCount = 0 versionCount-- } else { versionCount-- @@ -72,7 +73,7 @@ try { }) } } catch (e) { - logger.error(e); + logger.error(e) // do nth } @@ -87,14 +88,14 @@ try { } catch (err) { } let Version = { - get ver() { - return currentVersion; + get ver () { + return currentVersion }, - get yunzai() { - return yunzai_ver; + get yunzai () { + return yunzai_ver }, - get logs() { - return changelogs; + get logs () { + return changelogs } } -export default Version \ No newline at end of file +export default Version diff --git a/components/index.js b/components/index.js index 5eb6647..798a3a6 100644 --- a/components/index.js +++ b/components/index.js @@ -1,7 +1,7 @@ -const Path = process.cwd(); -const Plugin_Name = 'yenai-plugin' -const Plugin_Path = `${Path}/plugins/${Plugin_Name}`; import Version from './Version.js' import Data from './Data.js' import Config from './Config.js' -export { Config, Data, Version, Path, Plugin_Name, Plugin_Path } \ No newline at end of file +const Path = process.cwd() +const Plugin_Name = 'yenai-plugin' +const Plugin_Path = `${Path}/plugins/${Plugin_Name}` +export { Config, Data, Version, Path, Plugin_Name, Plugin_Path } diff --git a/config/system/gpadmin_system.js b/config/system/gpadmin_system.js index a7f5a49..6a34b12 100644 --- a/config/system/gpadmin_system.js +++ b/config/system/gpadmin_system.js @@ -24,247 +24,247 @@ export const helpCfg = { } export const helpList = [{ - "group": "基础功能", - "list": [{ - "icon": 1, - "title": "#禁言 <@QQ> <时间>", - "desc": "=-=" + group: '基础功能', + list: [{ + icon: 1, + title: '#禁言 <@QQ> <时间>', + desc: '=-=' }, { - "icon": 2, - "title": "#解禁 <@QQ>", - "desc": "=-=" + icon: 2, + title: '#解禁 <@QQ>', + desc: '=-=' }, { - "icon": 3, - "title": "#全体禁言|解禁", - "desc": "顾名思义" + icon: 3, + title: '#全体禁言|解禁', + desc: '顾名思义' }, { - "icon": 16, - "title": "#发通知 <消息>", - "desc": "发送@全体的通知" + icon: 16, + title: '#发通知 <消息>', + desc: '发送@全体的通知' }, { - "icon": 5, - "title": "#允许|禁止 匿名", - "desc": "顾名思义" + icon: 5, + title: '#允许|禁止 匿名', + desc: '顾名思义' }, { - "title": "#踢 <@QQ>", - "desc": "顾名思义", - "icon": 4 + title: '#踢 <@QQ>', + desc: '顾名思义', + icon: 4 }, { - "title": "#发群公告 <文字>", - "desc": "发送简易公告", - "icon": 16 + title: '#发群公告 <文字>', + desc: '发送简易公告', + icon: 16 }, { - "title": "#查群公告$", - "desc": "查看现有公告", - "icon": 3 + title: '#查群公告$', + desc: '查看现有公告', + icon: 3 }, { - "title": "#删群公告 <序号>", - "desc": "用查看公告获取序号", - "icon": 4 + title: '#删群公告 <序号>', + desc: '用查看公告获取序号', + icon: 4 }, { - "title": "#获取禁言列表", - "desc": "查看本群被禁言的人", - "icon": 8 + title: '#获取禁言列表', + desc: '查看本群被禁言的人', + icon: 8 }, { - "title": "#解除全部禁言", - "desc": "解除本群全部被禁言的人", - "icon": 6 + title: '#解除全部禁言', + desc: '解除本群全部被禁言的人', + icon: 6 }, { - "title": "#查看n月没发言的人", - "desc": "查看多少天|周|月没发言的人", - "icon": 15 + title: '#查看n月没发言的人', + desc: '查看多少天|周|月没发言的人', + icon: 15 }, { - "title": "#清理n天没发言的人", - "desc": "清理多少天|周|月没发言的人", - "icon": 14 + title: '#清理n天没发言的人', + desc: '清理多少天|周|月没发言的人', + icon: 14 }, { - "title": "#查看从未发言的人", - "desc": "查看进群后从未发言的人", - "icon": 1 + title: '#查看从未发言的人', + desc: '查看进群后从未发言的人', + icon: 1 }, { - "title": "#清理从未发言的人", - "desc": "清理进群后从未发言的人", - "icon": 5 + title: '#清理从未发言的人', + desc: '清理进群后从未发言的人', + icon: 5 }, { - "title": "#查看不活跃排行榜", - "desc": "后面可以加数字", - "icon": 16 + title: '#查看不活跃排行榜', + desc: '后面可以加数字', + icon: 16 }, { - "title": "#查看最近入群情况", - "desc": "后面可以加数字", - "icon": 4 + title: '#查看最近入群情况', + desc: '后面可以加数字', + icon: 4 }, { - "title": "#查看加群申请", - "desc": "查看本群的加群申请", - "icon": 2 + title: '#查看加群申请', + desc: '查看本群的加群申请', + icon: 2 }, { - "title": "#同意|拒绝加群申请", - "desc": "处理本群的加群申请", - "icon": 19 + title: '#同意|拒绝加群申请', + desc: '处理本群的加群申请', + icon: 19 }, { - "title": "#同意|拒绝全部加群申请", - "desc": "处理本群的全部加群申请", - "icon": 3 + title: '#同意|拒绝全部加群申请', + desc: '处理本群的全部加群申请', + icon: 3 }, { - "title": "#我要自闭 <时间>", - "desc": "自闭一会", - "icon": 20 - },] + title: '#我要自闭 <时间>', + desc: '自闭一会', + icon: 20 + }] }, { - "group": "字符", - "list": [ + group: '字符', + list: [ { - "title": "#幸运字符列表", - "desc": "查看现有字符", - "icon": 16 + title: '#幸运字符列表', + desc: '查看现有字符', + icon: 16 }, { - "title": "#替换幸运字符+(id)", - "desc": "用列表获取id", - "icon": 3 + title: '#替换幸运字符+(id)', + desc: '用列表获取id', + icon: 3 }, { - "title": "#抽幸运字符", - "desc": "bot抽取字符", - "icon": 4 + title: '#抽幸运字符', + desc: 'bot抽取字符', + icon: 4 }, { - "title": "#开启|关闭幸运字符", - "desc": "=-=", - "icon": 5 - }, + title: '#开启|关闭幸运字符', + desc: '=-=', + icon: 5 + } ] }, { - "group": "定时禁言", - "list": [ + group: '定时禁言', + list: [ { - "title": "#定时(禁言|解禁)(00:00 | cron)", - "desc": "设置定时禁言或解禁可用cron表达式设置", - "icon": 12 + title: '#定时(禁言|解禁)(00:00 | cron)', + desc: '设置定时禁言或解禁可用cron表达式设置', + icon: 12 }, { - "title": "#定时禁言任务", - "desc": "查看禁言任务", - "icon": 10 + title: '#定时禁言任务', + desc: '查看禁言任务', + icon: 10 }, { - "title": "#取消定时(禁言|解禁)", - "desc": "取消查看禁言任务", - "icon": 3 - }, + title: '#取消定时(禁言|解禁)', + desc: '取消查看禁言任务', + icon: 3 + } ] }, { - "group": "群信息", - "list": [ + group: '群信息', + list: [ { - "icon": 2, - "title": "#群星级", - "desc": "查看群星级" + icon: 2, + title: '#群星级', + desc: '查看群星级' }, { - "title": "#今天谁生日", - "desc": "今天可换为昨天或后天或日期", - "icon": 12 + title: '#今天谁生日', + desc: '今天可换为昨天或后天或日期', + icon: 12 }, { - "title": "#哪个叼毛是龙王", - "desc": "查看谁是龙王", - "icon": 6 + title: '#哪个叼毛是龙王', + desc: '查看谁是龙王', + icon: 6 }, { - "title": "#今日打卡", - "desc": "查看今日打卡", - "icon": 5 + title: '#今日打卡', + desc: '查看今日打卡', + icon: 5 }, { - "title": "#群数据(7天)?", - "desc": "活跃数据等", - "icon": 7 + title: '#群数据(7天)?', + desc: '活跃数据等', + icon: 7 }, { - "title": "#群发言榜单(7天)?", - "desc": "不加7天查看昨天的数据", - "icon": 16 - }, + title: '#群发言榜单(7天)?', + desc: '不加7天查看昨天的数据', + icon: 16 + } ] }, { - "group": "进群验证(更多设置请在config/groupverify.yaml进行设置)", - "list": [ + group: '进群验证(更多设置请在config/groupverify.yaml进行设置)', + list: [ { - "title": "#开启验证", - "desc": "开启本群验证", - "icon": 4 + title: '#开启验证', + desc: '开启本群验证', + icon: 4 }, { - "title": "#关闭验证", - "desc": "关闭本群验证", - "icon": 15 + title: '#关闭验证', + desc: '关闭本群验证', + icon: 15 }, { - "title": "#重新验证 <@群员>", - "desc": "重新发起验证", - "icon": 1 + title: '#重新验证 <@群员>', + desc: '重新发起验证', + icon: 1 }, { - "title": "#绕过验证 <@群员>", - "desc": "绕过本次验证", - "icon": 3 + title: '#绕过验证 <@群员>', + desc: '绕过本次验证', + icon: 3 }, { - "title": "#切换验证模式", - "desc": "更换答案匹配模式", - "icon": 2 + title: '#切换验证模式', + desc: '更换答案匹配模式', + icon: 2 }, { - "title": "#设置验证超时时间+(s)", - "desc": "多少秒后踢出", - "icon": 17 + title: '#设置验证超时时间+(s)', + desc: '多少秒后踢出', + icon: 17 }] }, { - "group": "Bot为群主可用", - "list": [ + group: 'Bot为群主可用', + list: [ { - "title": "#设置管理 <@QQ>", - "desc": "增加管理", - "icon": 8 + title: '#设置管理 <@QQ>', + desc: '增加管理', + icon: 8 }, { - "title": "#取消管理 <@QQ> ", - "desc": "=-=", - "icon": 9 + title: '#取消管理 <@QQ> ', + desc: '=-=', + icon: 9 }, { - "title": "#申请头衔 <头衔>", - "desc": "群员自己设置", - "icon": 19 + title: '#申请头衔 <头衔>', + desc: '群员自己设置', + icon: 19 }, { - "title": "#修改头衔 <@QQ> <头衔>", - "desc": "主人给别人设置", - "icon": 10 + title: '#修改头衔 <@QQ> <头衔>', + desc: '主人给别人设置', + icon: 10 }, { - "title": "#(增加|减少|查看)头衔屏蔽词", - "desc": "头衔屏蔽词", - "icon": 2 + title: '#(增加|减少|查看)头衔屏蔽词', + desc: '头衔屏蔽词', + icon: 2 }, { - "title": "#切换头衔屏蔽词匹配模式", - "desc": "模糊匹配和精确匹配", - "icon": 13 + title: '#切换头衔屏蔽词匹配模式', + desc: '模糊匹配和精确匹配', + icon: 13 }] }] diff --git a/config/system/help_system.js b/config/system/help_system.js index c7a3a49..35761ec 100644 --- a/config/system/help_system.js +++ b/config/system/help_system.js @@ -24,236 +24,238 @@ export const helpCfg = { } export const helpList = [{ - "group": "Bot相关", - "auth": "master", - "list": [{ - "icon": 1, - "title": "#发好友 <消息>", "desc": "给好友发送一条涩涩的消息" + group: 'Bot相关', + auth: 'master', + list: [{ + icon: 1, + title: '#发好友 <消息>', + desc: '给好友发送一条涩涩的消息' }, { - "icon": 2, - "title": "#发群聊 <群号> <消息>", - "desc": "给群聊发送一条涩涩的消息" + icon: 2, + title: '#发群聊 <群号> <消息>', + desc: '给群聊发送一条涩涩的消息' }, { - "icon": 3, - "title": "#改头像 <图片>", - "desc": "顾名思义" + icon: 3, + title: '#改头像 <图片>', + desc: '顾名思义' }, { - "icon": 4, - "title": "#改状态 <状态> ", - "desc": "顾名思义" + icon: 4, + title: '#改状态 <状态> ', + desc: '顾名思义' }, { - "icon": 5, - "title": "#改昵称 <昵称> ", - "desc": "顾名思义" + icon: 5, + title: '#改昵称 <昵称> ', + desc: '顾名思义' }, { - "icon": 6, - "title": "#改签名 <签名> ", - "desc": "顾名思义" + icon: 6, + title: '#改签名 <签名> ', + desc: '顾名思义' }, { - "title": "#改性别 <性别> ", - "desc": "顾名思义", - "icon": 7 + title: '#改性别 <性别> ', + desc: '顾名思义', + icon: 7 }, { - "title": "#改群名片 <名片> ", - "desc": "群里Bot自己的名片", - "icon": 8 + title: '#改群名片 <名片> ', + desc: '群里Bot自己的名片', + icon: 8 }, { - "title": "#改群昵称 <昵称>", - "desc": "改群的昵称", "icon": 9 + title: '#改群昵称 <昵称>', + desc: '改群的昵称', + icon: 9 }, { - "title": "#改群头像 <图片>", - "desc": "顾名思义", - "icon": 10 + title: '#改群头像 <图片>', + desc: '顾名思义', + icon: 10 }, { - "title": "#删好友 ", - "desc": "删掉涩涩的好友", - "icon": 11 + title: '#删好友 ', + desc: '删掉涩涩的好友', + icon: 11 }, { - "title": "#退群 <群号> ", - "desc": "退掉涩涩的群", - "icon": 12 + title: '#退群 <群号> ', + desc: '退掉涩涩的群', + icon: 12 }, { - "title": "#获取群列表", - "desc": "获取Bot的所有群", - "icon": 13 + title: '#获取群列表', + desc: '获取Bot的所有群', + icon: 13 }, { - "title": "#获取好友列表", - "desc": "获取Bot的所有好友", - "icon": 14 + title: '#获取好友列表', + desc: '获取Bot的所有好友', + icon: 14 }, { - "title": "#取说说列表 <页数> ", - "desc": "获取Bot的说说列表", - "icon": 15 + title: '#取说说列表 <页数> ', + desc: '获取Bot的说说列表', + icon: 15 }, { - "title": "#发说说 <内容> ", - "desc": "发送一条涩涩的说说", - "icon": 16 + title: '#发说说 <内容> ', + desc: '发送一条涩涩的说说', + icon: 16 }, { - "title": "#删说说 <序号>", - "desc": "用取说说列表获取序号", - "icon": 17 + title: '#删说说 <序号>', + desc: '用取说说列表获取序号', + icon: 17 }, { - "title": "#清空说说", - "desc": "一键清空", - "icon": 18 + title: '#清空说说', + desc: '一键清空', + icon: 18 }, { - "title": "#清空留言", - "desc": "一键清空留言", - "icon": 19 + title: '#清空留言', + desc: '一键清空留言', + icon: 19 }, { - "title": "#开启|关闭戳一戳", - "desc": "QQ的戳一戳开关", - "icon": 5 + title: '#开启|关闭戳一戳', + desc: 'QQ的戳一戳开关', + icon: 5 }, { - "title": "#同意|拒绝全部好友申请", - "desc": "顾名思义", - "icon": 6 + title: '#同意|拒绝全部好友申请', + desc: '顾名思义', + icon: 6 }, { - "title": "#查看好友申请", - "desc": "查看现有好友申请", - "icon": 1 + title: '#查看好友申请', + desc: '查看现有好友申请', + icon: 1 }, { - "title": "同意|拒绝好友申请 ", - "desc": "同意或拒绝好友申请", - "icon": 18 + title: '同意|拒绝好友申请 ', + desc: '同意或拒绝好友申请', + icon: 18 }, { - "title": "#查看群邀请", - "desc": "查看现有群邀请", - "icon": 3 + title: '#查看群邀请', + desc: '查看现有群邀请', + icon: 3 }, { - "title": "#同意|拒绝全部群邀请", - "desc": "同意或拒绝全部群邀请", - "icon": 15 + title: '#同意|拒绝全部群邀请', + desc: '同意或拒绝全部群邀请', + icon: 15 }, { - "title": "#同意|拒绝群邀请 <群号>", - "desc": "同意或拒绝全部群邀请", - "icon": 7 + title: '#同意|拒绝群邀请 <群号>', + desc: '同意或拒绝全部群邀请', + icon: 7 }, { - "title": "#查看全部请求", - "desc": "查看所有请求", - "icon": 20 + title: '#查看全部请求', + desc: '查看所有请求', + icon: 20 }, { - "title": "#(开启|关闭)好友添加", - "desc": "是否开启好友添加", - "icon": 7 + title: '#(开启|关闭)好友添加', + desc: '是否开启好友添加', + icon: 7 }, { - "title": "#更改好友申请方式[0123]", - "desc": "带0参数为帮助", - "icon": 12 - },] + title: '#更改好友申请方式[0123]', + desc: '带0参数为帮助', + icon: 12 + }] }, { - "group": "娱乐功能", - "list": [ + group: '娱乐功能', + list: [ { - "icon": 7, - "title": "#椰羊收益曲线", - "desc": "查看角色收益曲线" + icon: 7, + title: '#椰羊收益曲线', + desc: '查看角色收益曲线' }, { - "icon": 13, - "title": "#椰羊参考面板", - "desc": "查看角色参考面板" + icon: 13, + title: '#椰羊参考面板', + desc: '查看角色参考面板' }, { - "icon": 9, - "title": "#收益曲线帮助", - "desc": "=-=" + icon: 9, + title: '#收益曲线帮助', + desc: '=-=' }, { - "icon": 20, - "title": "#唱歌", - "desc": "随机唱鸭" + icon: 20, + title: '#唱歌', + desc: '随机唱鸭' }, { - "icon": 13, - "title": "#赞我", - "desc": "给你点一个大大的赞" + icon: 13, + title: '#赞我', + desc: '给你点一个大大的赞' }, { - "icon": 15, - "title": "#支付宝到账<数字>", - "desc": "听到账爽一下" + icon: 15, + title: '#支付宝到账<数字>', + desc: '听到账爽一下' }, { - "icon": 17, - "title": "#翻译", - "desc": "有道翻译" + icon: 17, + title: '#翻译', + desc: '有道翻译' }, { - "icon": 9, - "title": "#搜索菜单", - "desc": "各大引擎搜索" + icon: 9, + title: '#搜索菜单', + desc: '各大引擎搜索' }, { - "icon": 15, - "title": "#coser", - "desc": "养眼=-=" + icon: 15, + title: '#coser', + desc: '养眼=-=' }, { - "icon": 1, - "title": "#半次元话题", - "desc": "=-=" + icon: 1, + title: '#半次元话题', + desc: '=-=' }, { - "icon": 7, - "title": "#铃声搜索", - "desc": "铃声多多" + icon: 7, + title: '#铃声搜索', + desc: '铃声多多' }, { - "title": "#acg刻晴", - "desc": "acgcos", - "icon": 9 - },] + title: '#acg刻晴', + desc: 'acgcos', + icon: 9 + }] }, { - "group": "设置,版本相关", - "auth": "master", - "list": [{ - "icon": 8, - "title": "#椰奶设置", - "desc": "查看椰奶设置" + group: '设置,版本相关', + auth: 'master', + list: [{ + icon: 8, + title: '#椰奶设置', + desc: '查看椰奶设置' }, { - "icon": 1, - "title": "#椰奶(强制)更新", - "desc": "更新椰奶" + icon: 1, + title: '#椰奶(强制)更新', + desc: '更新椰奶' }, { - "icon": 15, - "title": "#椰奶版本", - "desc": "查看版本信息" + icon: 15, + title: '#椰奶版本', + desc: '查看版本信息' }, { - "icon": 12, - "title": "#椰奶更新日志", - "desc": "查看更新日志" + icon: 12, + title: '#椰奶更新日志', + desc: '查看更新日志' }, { - "icon": 8, - "title": "#椰奶状态(pro)?", - "desc": "查看系统状态" + icon: 8, + title: '#椰奶状态(pro)?', + desc: '查看系统状态' }, { - "icon": 3, - "title": "#椰奶群管帮助", - "desc": "群管帮助" + icon: 3, + title: '#椰奶群管帮助', + desc: '群管帮助' }, { - "icon": 12, - "title": "#椰奶(启|禁)用全部通知", - "desc": "一键启用或禁用全部通知" - },] + icon: 12, + title: '#椰奶(启|禁)用全部通知', + desc: '一键启用或禁用全部通知' + }] }] export const isSys = true diff --git a/model/CPU.js b/model/CPU.js index f09e5d6..c280f66 100644 --- a/model/CPU.js +++ b/model/CPU.js @@ -1,57 +1,53 @@ -import os from 'os'; +import os from 'os' import lodash from 'lodash' import fs from 'fs' import { common } from './index.js' import { Config } from '../components/index.js' -let si = await redis.get('yenai:node_modules') ? await import("systeminformation") : false +let si = await redis.get('yenai:node_modules') ? await import('systeminformation') : false export default new class OSUtils { - constructor() { - this.cpuUsageMSDefault = 1000; // CPU 利用率默认时间段 - this.isGPU = false; - this.now_network = null; - this.fsStats = null; - this.init(); + constructor () { + this.cpuUsageMSDefault = 1000 // CPU 利用率默认时间段 + this.isGPU = false + this.now_network = null + this.fsStats = null + this.init() } - async init() { + async init () { if (!si) return - //初始化GPU获取 + // 初始化GPU获取 if ((await si.graphics()).controllers.find(item => item.memoryUsed && item.memoryFree && item.utilizationGpu)) { this.isGPU = true } - //给有问题的用户关闭定时器 - if (!Config.Notice.statusTask) return; - //网速 + // 给有问题的用户关闭定时器 + if (!Config.Notice.statusTask) return + // 网速 let worktimer = setInterval(async () => { this.now_network = await si.networkStats() }, 5000) - //磁盘写入速度 + // 磁盘写入速度 let fsStatstimer = setInterval(async () => { - this.fsStats = await si.fsStats(); + this.fsStats = await si.fsStats() }, 5000) - //一分钟后检测是否能获取不能则销毁定时器 + // 一分钟后检测是否能获取不能则销毁定时器 setTimeout(() => { if (!this.now_network) clearTimeout(worktimer) if (!this.fsStats) clearTimeout(fsStatstimer) }, 60000) } - /**字节转换 */ - getfilesize(size, isbtye = true, issuffix = true) {//把字节转换成正常文件大小 - if (!size) return ""; - var num = 1024.00; //byte + /** 字节转换 */ + getfilesize (size, isbtye = true, issuffix = true) { // 把字节转换成正常文件大小 + if (!size) return '' + let num = 1024.00 // byte if (isbtye) { - if (size < num) - return size.toFixed(2) + "B"; + if (size < num) { return size.toFixed(2) + 'B' } } - if (size < Math.pow(num, 2)) - return (size / num).toFixed(2) + `K${issuffix ? 'b' : ''}`; //kb - if (size < Math.pow(num, 3)) - return (size / Math.pow(num, 2)).toFixed(2) + `M${issuffix ? 'b' : ''}`; //M - if (size < Math.pow(num, 4)) - return (size / Math.pow(num, 3)).toFixed(2) + "G"; //G - return (size / Math.pow(num, 4)).toFixed(2) + "T"; //T + if (size < Math.pow(num, 2)) { return (size / num).toFixed(2) + `K${issuffix ? 'b' : ''}` } // kb + if (size < Math.pow(num, 3)) { return (size / Math.pow(num, 2)).toFixed(2) + `M${issuffix ? 'b' : ''}` } // M + if (size < Math.pow(num, 4)) { return (size / Math.pow(num, 3)).toFixed(2) + 'G' } // G + return (size / Math.pow(num, 4)).toFixed(2) + 'T' // T } /** @@ -59,7 +55,7 @@ export default new class OSUtils { * @param {Number} res 百分比小数 * @return {*} css样式 */ - Circle(res) { + Circle (res) { let num = (res * 360).toFixed(0) let color = '#90ee90' if (res >= 0.9) { @@ -67,30 +63,30 @@ export default new class OSUtils { } else if (res >= 0.8) { color = '#ffa500' } - let leftCircle = `style="transform:rotate(-180deg);background:${color};"`; - let rightCircle = `style="transform:rotate(360deg);background:${color};"`; + let leftCircle = `style="transform:rotate(-180deg);background:${color};"` + let rightCircle = `style="transform:rotate(360deg);background:${color};"` if (num > 180) { - leftCircle = `style="transform:rotate(${num}deg);background:${color};"`; + leftCircle = `style="transform:rotate(${num}deg);background:${color};"` } else { - rightCircle = `style="transform:rotate(-${180 - num}deg);background:${color};"`; + rightCircle = `style="transform:rotate(-${180 - num}deg);background:${color};"` } return { leftCircle, rightCircle } } - /**获取nodejs内存情况 */ - getNodeInfo() { + /** 获取nodejs内存情况 */ + getNodeInfo () { let memory = process.memoryUsage() - //总共 - let rss = this.getfilesize(memory.rss); - //堆 - let heapTotal = this.getfilesize(memory.heapTotal); - //栈 - let heapUsed = this.getfilesize(memory.heapUsed); - //占用率 + // 总共 + let rss = this.getfilesize(memory.rss) + // 堆 + let heapTotal = this.getfilesize(memory.heapTotal) + // 栈 + let heapUsed = this.getfilesize(memory.heapUsed) + // 占用率 let occupy = (memory.rss / (os.totalmem() - os.freemem())).toFixed(2) return { ...this.Circle(occupy), - inner: parseInt(occupy * 100) + "%", + inner: parseInt(occupy * 100) + '%', title: 'Node', info: [ `总 ${rss}`, @@ -100,44 +96,44 @@ export default new class OSUtils { } } - /**获取当前内存占用 */ - getMemUsage() { - //内存使用率 + /** 获取当前内存占用 */ + getMemUsage () { + // 内存使用率 let MemUsage = (1 - os.freemem() / os.totalmem()).toFixed(2) - //空闲内存 + // 空闲内存 let freemem = this.getfilesize(os.freemem()) - //总共内存 + // 总共内存 let totalmem = this.getfilesize(os.totalmem()) - //使用内存 + // 使用内存 let Usingmemory = this.getfilesize((os.totalmem() - os.freemem())) return { ...this.Circle(MemUsage), - inner: parseInt(MemUsage * 100) + "%", + inner: parseInt(MemUsage * 100) + '%', title: 'RAM', info: [ `总共 ${totalmem}`, `已用 ${Usingmemory}`, - `空闲 ${freemem}`, + `空闲 ${freemem}` ] } } - /**获取CPU占用 */ - async getCpuInfo(arch) { - //cpu使用率 + /** 获取CPU占用 */ + async getCpuInfo (arch) { + // cpu使用率 let cpu_info = (await si.currentLoad())?.currentLoad if (cpu_info == null || cpu_info == undefined) return false - //核心 + // 核心 let hx = os.cpus() - //cpu制造者 - let cpumodel = hx[0]?.model.slice(0, hx[0]?.model.indexOf(" ")) || "" - //最大MHZ - let maxspeed = await si.cpuCurrentSpeed(); + // cpu制造者 + let cpumodel = hx[0]?.model.slice(0, hx[0]?.model.indexOf(' ')) || '' + // 最大MHZ + let maxspeed = await si.cpuCurrentSpeed() return { ...this.Circle(cpu_info / 100), - inner: parseInt(cpu_info) + "%", + inner: parseInt(cpu_info) + '%', title: 'CPU', info: [ `${cpumodel} ${hx.length}核 ${arch}`, @@ -148,17 +144,17 @@ export default new class OSUtils { } } - /**获取GPU占用 */ - async getGPU() { + /** 获取GPU占用 */ + async getGPU () { if (!this.isGPU) return false try { let graphics = (await si.graphics()).controllers.find(item => item.memoryUsed && item.memoryFree && item.utilizationGpu) let { vendor, temperatureGpu, utilizationGpu, memoryTotal, memoryUsed, powerDraw } = graphics temperatureGpu = temperatureGpu ? temperatureGpu + '℃' : '' - powerDraw = powerDraw ? powerDraw + "W" : "" + powerDraw = powerDraw ? powerDraw + 'W' : '' return { ...this.Circle(utilizationGpu / 100), - inner: parseInt(utilizationGpu) + "%", + inner: parseInt(utilizationGpu) + '%', title: 'GPU', info: [ `${vendor} ${temperatureGpu} ${powerDraw}`, @@ -167,8 +163,8 @@ export default new class OSUtils { ] } } catch (e) { - console.log(e); - return false; + console.log(e) + return false } } @@ -176,15 +172,15 @@ export default new class OSUtils { * @description: 获取硬盘 * @return {*} */ - async getfsSize() { - //去重 + async getfsSize () { + // 去重 let HardDisk = lodash.uniqWith(await si.fsSize(), (a, b) => a.used === b.used && a.size === b.size && a.use === b.use && a.available === b.available) - //过滤 + // 过滤 HardDisk = HardDisk.filter(item => item.size && item.used && item.available && item.use) - //为空返回false - if (lodash.isEmpty(HardDisk)) return false; - //数值转换 + // 为空返回false + if (lodash.isEmpty(HardDisk)) return false + // 数值转换 return HardDisk.map(item => { item.used = this.getfilesize(item.used) item.size = this.getfilesize(item.size) @@ -199,20 +195,20 @@ export default new class OSUtils { }) } - /**获取FastFetch */ - async getFastFetch(e) { - if (!/pro/.test(e.msg)) return "" - let ret = await common.execSync(`bash plugins/yenai-plugin/resources/state/state.sh`) + /** 获取FastFetch */ + async getFastFetch (e) { + if (!/pro/.test(e.msg)) return '' + let ret = await common.execSync('bash plugins/yenai-plugin/resources/state/state.sh') if (ret.error) { e.reply(`❎ 请检查是否使用git bash启动Yunzai-bot\n错误信息:${ret.stderr}`) - return "" + return '' } return ret.stdout.trim() } - //获取读取速率 - get DiskSpeed() { - if (!this.fsStats || !this.fsStats.rx_sec || !this.fsStats.wx_sec) return false; + // 获取读取速率 + get DiskSpeed () { + if (!this.fsStats || !this.fsStats.rx_sec || !this.fsStats.wx_sec) return false return { rx_sec: this.getfilesize(this.fsStats.rx_sec, false, false), wx_sec: this.getfilesize(this.fsStats.wx_sec, false, false) @@ -223,8 +219,9 @@ export default new class OSUtils { * @description: 获取网速 * @return {*} */ - get getnetwork() { - try { var network = lodash.cloneDeep(this.now_network)[0] } catch { return false } + get getnetwork () { + let network = {} + try { network = lodash.cloneDeep(this.now_network)[0] } catch { return false } if (network.rx_sec == null || network.tx_sec == null) return false network.rx_sec = this.getfilesize(network.rx_sec, false, false) network.tx_sec = this.getfilesize(network.tx_sec, false, false) @@ -235,12 +232,12 @@ export default new class OSUtils { * @description: 取插件包 * @return {*} 插件包数量 */ - get numberOfPlugIns() { - let str = "./plugins" - let arr = fs.readdirSync(str); - let plugin = []; + get numberOfPlugIns () { + let str = './plugins' + let arr = fs.readdirSync(str) + let plugin = [] arr.forEach((val) => { - let ph = fs.statSync(str + '/' + val); + let ph = fs.statSync(str + '/' + val) if (ph.isDirectory()) { plugin.push(val) } @@ -250,7 +247,7 @@ export default new class OSUtils { return { plugins: plugin?.length || 0, - js: fs.readdirSync("./plugins/example")?.filter(item => item.includes(".js"))?.length || 0 + js: fs.readdirSync('./plugins/example')?.filter(item => item.includes('.js'))?.length || 0 } } -} \ No newline at end of file +}() diff --git a/model/CronValidate.js b/model/CronValidate.js index 36d5855..544723e 100644 --- a/model/CronValidate.js +++ b/model/CronValidate.js @@ -1,439 +1,428 @@ -/*!!!!!!! +/*! !!!!!! 以下为凶残的cron表达式验证,胆小肾虚及心脏病者慎入!!! 不听劝告者后果自负T T !!!!!!! cron表达式为秒,分,时,日,月,周,年 判断正误方法:错误的话返回错误信息,正确的话返回true */ -//返回错误信息用 -var message = ''; -export default function cronValidate(cronExpression) { - //先将cron表达式进行分割 - var cronParams = cronExpression.split(" "); - //判断cron表达式是否具有该具有的属性长度,没有年份的长度为6,带年份的长度为7,其他情况都是错误的 - if (cronParams.length < 6 || cronParams.length > 7) { - return "cron表达式需要输入6-7位参数,请重新输入"; - } else { - //日和周必须有一个为?,或者全为* - if ((cronParams[3] == "?" && cronParams[5] != "?") || (cronParams[5] == "?" && cronParams[3] != "?") || (cronParams[3] == "*" && cronParams[5] == "*")) { - //检查第一位的秒是否正确 - message = checkSecondsField(cronParams[0]); - if (message != true) { - return message; - } +// 返回错误信息用 +let message = '' +export default function cronValidate (cronExpression) { + // 先将cron表达式进行分割 + let cronParams = cronExpression.split(' ') + // 判断cron表达式是否具有该具有的属性长度,没有年份的长度为6,带年份的长度为7,其他情况都是错误的 + if (cronParams.length < 6 || cronParams.length > 7) { + return 'cron表达式需要输入6-7位参数,请重新输入' + } else { + // 日和周必须有一个为?,或者全为* + if ((cronParams[3] == '?' && cronParams[5] != '?') || (cronParams[5] == '?' && cronParams[3] != '?') || (cronParams[3] == '*' && cronParams[5] == '*')) { + // 检查第一位的秒是否正确 + message = checkSecondsField(cronParams[0]) + if (message != true) { + return message + } - //检查第二位的分是否正确 - message = checkMinutesField(cronParams[1]); - if (message != true) { - return message; - } + // 检查第二位的分是否正确 + message = checkMinutesField(cronParams[1]) + if (message != true) { + return message + } - //检查第三位的时是否正确 - message = checkHoursField(cronParams[2]); - if (message != true) { - return message; - } + // 检查第三位的时是否正确 + message = checkHoursField(cronParams[2]) + if (message != true) { + return message + } - //检查第四位的日是否正确 - message = checkDayOfMonthField(cronParams[3]); - if (message != true) { - return message; - } + // 检查第四位的日是否正确 + message = checkDayOfMonthField(cronParams[3]) + if (message != true) { + return message + } - //检查第五位的月是否正确 - message = checkMonthsField(cronParams[4]); - if (message != true) { - return message; - } + // 检查第五位的月是否正确 + message = checkMonthsField(cronParams[4]) + if (message != true) { + return message + } - //检查第6位的周是否正确 - message = checkDayOfWeekField(cronParams[5]); - if (message != true) { - return message; - } + // 检查第6位的周是否正确 + message = checkDayOfWeekField(cronParams[5]) + if (message != true) { + return message + } - //检查第七位的年是否正确 - if (cronParams.length > 6) { - message = checkYearField(cronParams[6]); - if (message != true) { - return message; - } - } - - - return true; - } else { - return "指定日时周必须设为不指定(?),指定周时日必须设为不指定(?)" - } - } -} - -//检查秒的函数方法 -function checkSecondsField(secondsField) { - return checkField(secondsField, 0, 59, "秒"); -} - -//检查分的函数方法 -function checkMinutesField(minutesField) { - return checkField(minutesField, 0, 59, "分"); -} - -//检查小时的函数方法 -function checkHoursField(hoursField) { - return checkField(hoursField, 0, 23, "时"); -} - -//检查日期的函数方法 -function checkDayOfMonthField(dayOfMonthField) { - if (dayOfMonthField == "?") { - return true; - } - if (dayOfMonthField.indexOf("L") >= 0) { - return checkFieldWithLetter(dayOfMonthField, "L", 1, 7, "日"); - } else if (dayOfMonthField.indexOf("W") >= 0) { - return checkFieldWithLetter(dayOfMonthField, "W", 1, 31, "日"); - } else if (dayOfMonthField.indexOf("C") >= 0) { - return checkFieldWithLetter(dayOfMonthField, "C", 1, 31, "日"); - } - return checkField(dayOfMonthField, 1, 31, "日"); -} - -//检查月份的函数方法 -function checkMonthsField(monthsField) { - //月份简写处理 - if (monthsField != "*") { - monthsField = monthsField.replace("JAN", "1"); - monthsField = monthsField.replace("FEB", "2"); - monthsField = monthsField.replace("MAR", "3"); - monthsField = monthsField.replace("APR", "4"); - monthsField = monthsField.replace("MAY", "5"); - monthsField = monthsField.replace("JUN", "6"); - monthsField = monthsField.replace("JUL", "7"); - monthsField = monthsField.replace("AUG", "8"); - monthsField = monthsField.replace("SEP", "9"); - monthsField = monthsField.replace("OCT", "10"); - monthsField = monthsField.replace("NOV", "11"); - monthsField = monthsField.replace("DEC", "12"); - return checkField(monthsField, 1, 12, "月份"); - } else { - return true; - } - -} - -//星期验证 -function checkDayOfWeekField(dayOfWeekField) { - dayOfWeekField = dayOfWeekField.replace("SUN", "1"); - dayOfWeekField = dayOfWeekField.replace("MON", "2"); - dayOfWeekField = dayOfWeekField.replace("TUE", "3"); - dayOfWeekField = dayOfWeekField.replace("WED", "4"); - dayOfWeekField = dayOfWeekField.replace("THU", "5"); - dayOfWeekField = dayOfWeekField.replace("FRI", "6"); - dayOfWeekField = dayOfWeekField.replace("SAT", "7"); - if (dayOfWeekField == "?") { - return true; - } - if (dayOfWeekField.indexOf("L") >= 0) { - return checkFieldWithLetterWeek(dayOfWeekField, "L", 1, 7, "星期"); - } else if (dayOfWeekField.indexOf("C") >= 0) { - return checkFieldWithLetterWeek(dayOfWeekField, "C", 1, 7, "星期"); - } else if (dayOfWeekField.indexOf("#") >= 0) { - return checkFieldWithLetterWeek(dayOfWeekField, "#", 1, 7, "星期"); - } else { - return checkField(dayOfWeekField, 1, 7, "星期"); - } -} - -//检查年份的函数方法 -function checkYearField(yearField) { - return checkField(yearField, 1970, 2099, "年的"); -} - - - - - -//通用的检查值的大小范围的方法( - , / *) -function checkField(value, minimal, maximal, attribute) { - //校验值中是否有“-”,如果有“-”的话,下标会>0 - if (value.indexOf("-") > -1) { - return checkRangeAndCycle(value, minimal, maximal, attribute); - } - //校验值中是否有“,”,如果有“,”的话,下标会>0 - else if (value.indexOf(",") > -1) { - return checkListField(value, minimal, maximal, attribute); - } - //校验值中是否有“/”,如果有“/”的话,下标会>0 - else if (value.indexOf("/") > -1) { - return checkIncrementField(value, minimal, maximal, attribute); - } - //校验值是否为“*” - else if (value == "*") { - return true; - } - //校验单独的数字,英文字母,以及各种神奇的符号等... - else { - return checkIntValue(value, minimal, maximal, true, attribute); - } -} - - -//检测是否是整数以及是否在范围内,参数:检测的值,下限,上限,是否检查端点,检查的属性 -function checkIntValue(value, minimal, maximal, checkExtremity, attribute) { - try { - //用10进制犯法来进行整数转换 - var val = parseInt(value, 10); - if (value == val) { - if (checkExtremity) { - if (val < minimal || val > maximal) { - return (attribute + "的参数取值范围必须在" + minimal + "-" + maximal + "之间"); - } - return true; - } - return true; - } - return (attribute + "的参数存在非法字符,必须为整数或允许的大写英文"); - } catch (e) { - return (attribute + "的参数有非法字符,必须是整数~") - } -} -//检验枚举类型的参数是否正确 -function checkListField(value, minimal, maximal, attribute) { - var st = value.split(","); - var values = new Array(st.length); - //计算枚举的数字在数组中中出现的次数,出现一次为没有重复的。 - var count = 0; - for (var j = 0; j < st.length; j++) { - values[j] = st[j]; - } - //判断枚举类型的值是否重复 - for (var i = 0; i < values.length; i++) { - //判断枚举的值是否在范围内 - message = checkIntValue(values[i], minimal, maximal, true, attribute); + // 检查第七位的年是否正确 + if (cronParams.length > 6) { + message = checkYearField(cronParams[6]) if (message != true) { - return message; - } - count = 0; - for (var j = 0; j < values.length; j++) { - if (values[i] == values[j]) { - count++; - } - if (count > 1) { - return (attribute + "中的参数重复"); - } + return message } + } + + return true + } else { + return '指定日时周必须设为不指定(?),指定周时日必须设为不指定(?)' } - var previousValue = -1; - //判断枚举的值是否排序正确 - for (var i = 0; i < values.length; i++) { - var currentValue = values[i]; - try { - var val = parseInt(currentValue, 10); - if (val < previousValue) { - return (attribute + "的参数应该从小到大"); - } else { - previousValue = val; - } - } catch (e) { - //前面验证过了,这边的代码不可能跑到 - return ("这段提示用不到") - } - } - return true; + } } -//检验循环 -function checkIncrementField(value, minimal, maximal, attribute) { - if (value.split("/").length > 2) { - return (attribute + "中的参数只能有一个'/'"); - } - var start = value.substring(0, value.indexOf("/")); - var increment = value.substring(value.indexOf("/") + 1); - if (start != "*") { - //检验前值是否正确 - message = checkIntValue(start, minimal, maximal, true, attribute); - if (message != true) { - return message; - } - //检验后值是否正确 - message = checkIntValue(increment, minimal, maximal, true, attribute); - if (message != true) { - return message; - } - return true; - } else { - //检验后值是否正确 - return checkIntValue(increment, minimal, maximal, false, attribute); - } +// 检查秒的函数方法 +function checkSecondsField (secondsField) { + return checkField(secondsField, 0, 59, '秒') } -//检验范围 -function checkRangeAndCycle(params, minimal, maximal, attribute) { - //校验“-”符号是否只有一个 - if (params.split("-").length > 2) { - return (attribute + "中的参数只能有一个'-'"); - } - var value = null; - var cycle = null; - //检验范围内是否有嵌套周期 - if (params.indexOf("/") > -1) { - //校验“/”符号是否只有一个 - if (params.split("/").length > 2) { - return (attribute + "中的参数只能有一个'/'"); +// 检查分的函数方法 +function checkMinutesField (minutesField) { + return checkField(minutesField, 0, 59, '分') +} + +// 检查小时的函数方法 +function checkHoursField (hoursField) { + return checkField(hoursField, 0, 23, '时') +} + +// 检查日期的函数方法 +function checkDayOfMonthField (dayOfMonthField) { + if (dayOfMonthField == '?') { + return true + } + if (dayOfMonthField.indexOf('L') >= 0) { + return checkFieldWithLetter(dayOfMonthField, 'L', 1, 7, '日') + } else if (dayOfMonthField.indexOf('W') >= 0) { + return checkFieldWithLetter(dayOfMonthField, 'W', 1, 31, '日') + } else if (dayOfMonthField.indexOf('C') >= 0) { + return checkFieldWithLetter(dayOfMonthField, 'C', 1, 31, '日') + } + return checkField(dayOfMonthField, 1, 31, '日') +} + +// 检查月份的函数方法 +function checkMonthsField (monthsField) { + // 月份简写处理 + if (monthsField != '*') { + monthsField = monthsField.replace('JAN', '1') + monthsField = monthsField.replace('FEB', '2') + monthsField = monthsField.replace('MAR', '3') + monthsField = monthsField.replace('APR', '4') + monthsField = monthsField.replace('MAY', '5') + monthsField = monthsField.replace('JUN', '6') + monthsField = monthsField.replace('JUL', '7') + monthsField = monthsField.replace('AUG', '8') + monthsField = monthsField.replace('SEP', '9') + monthsField = monthsField.replace('OCT', '10') + monthsField = monthsField.replace('NOV', '11') + monthsField = monthsField.replace('DEC', '12') + return checkField(monthsField, 1, 12, '月份') + } else { + return true + } +} + +// 星期验证 +function checkDayOfWeekField (dayOfWeekField) { + dayOfWeekField = dayOfWeekField.replace('SUN', '1') + dayOfWeekField = dayOfWeekField.replace('MON', '2') + dayOfWeekField = dayOfWeekField.replace('TUE', '3') + dayOfWeekField = dayOfWeekField.replace('WED', '4') + dayOfWeekField = dayOfWeekField.replace('THU', '5') + dayOfWeekField = dayOfWeekField.replace('FRI', '6') + dayOfWeekField = dayOfWeekField.replace('SAT', '7') + if (dayOfWeekField == '?') { + return true + } + if (dayOfWeekField.indexOf('L') >= 0) { + return checkFieldWithLetterWeek(dayOfWeekField, 'L', 1, 7, '星期') + } else if (dayOfWeekField.indexOf('C') >= 0) { + return checkFieldWithLetterWeek(dayOfWeekField, 'C', 1, 7, '星期') + } else if (dayOfWeekField.indexOf('#') >= 0) { + return checkFieldWithLetterWeek(dayOfWeekField, '#', 1, 7, '星期') + } else { + return checkField(dayOfWeekField, 1, 7, '星期') + } +} + +// 检查年份的函数方法 +function checkYearField (yearField) { + return checkField(yearField, 1970, 2099, '年的') +} + +// 通用的检查值的大小范围的方法( - , / *) +function checkField (value, minimal, maximal, attribute) { + // 校验值中是否有“-”,如果有“-”的话,下标会>0 + if (value.indexOf('-') > -1) { + return checkRangeAndCycle(value, minimal, maximal, attribute) + } else if (value.indexOf(',') > -1) { + // 校验值中是否有“,”,如果有“,”的话,下标会>0 + return checkListField(value, minimal, maximal, attribute) + } else if (value.indexOf('/') > -1) { + // 校验值中是否有“/”,如果有“/”的话,下标会>0 + return checkIncrementField(value, minimal, maximal, attribute) + } else if (value == '*') { + // 校验值是否为“*” + return true + } else { + // 校验单独的数字,英文字母,以及各种神奇的符号等... + return checkIntValue(value, minimal, maximal, true, attribute) + } +} + +// 检测是否是整数以及是否在范围内,参数:检测的值,下限,上限,是否检查端点,检查的属性 +function checkIntValue (value, minimal, maximal, checkExtremity, attribute) { + try { + // 用10进制犯法来进行整数转换 + let val = parseInt(value, 10) + if (value == val) { + if (checkExtremity) { + if (val < minimal || val > maximal) { + return (attribute + '的参数取值范围必须在' + minimal + '-' + maximal + '之间') } - value = params.split("/")[0]; - cycle = params.split("/")[1]; - //判断循环的参数是否正确 - message = checkIntValue(cycle, minimal, maximal, true, attribute); - if (message != true) { - return message; - } - } else { - value = params; + return true + } + return true } - var startValue = value.substring(0, value.indexOf("-")); - var endValue = value.substring(value.indexOf("-") + 1); - //判断参数范围的第一个值是否正确 - message = checkIntValue(startValue, minimal, maximal, true, attribute); + return (attribute + '的参数存在非法字符,必须为整数或允许的大写英文') + } catch (e) { + return (attribute + '的参数有非法字符,必须是整数~') + } +} +// 检验枚举类型的参数是否正确 +function checkListField (value, minimal, maximal, attribute) { + let st = value.split(',') + let values = new Array(st.length) + // 计算枚举的数字在数组中中出现的次数,出现一次为没有重复的。 + let count = 0 + for (let j = 0; j < st.length; j++) { + values[j] = st[j] + } + // 判断枚举类型的值是否重复 + for (let i = 0; i < values.length; i++) { + // 判断枚举的值是否在范围内 + message = checkIntValue(values[i], minimal, maximal, true, attribute) if (message != true) { - return message; + return message } - //判断参数范围的第二个值是否正确 - message = checkIntValue(endValue, minimal, maximal, true, attribute); - if (message != true) { - return message; + count = 0 + for (let j = 0; j < values.length; j++) { + if (values[i] == values[j]) { + count++ + } + if (count > 1) { + return (attribute + '中的参数重复') + } } - //判断参数的范围前值是否小于后值 + } + let previousValue = -1 + // 判断枚举的值是否排序正确 + for (let i = 0; i < values.length; i++) { + let currentValue = values[i] try { - var startVal = parseInt(startValue, 10); - var endVal = parseInt(endValue, 10); - if (endVal < startVal) { - return (attribute + "的取值范围错误,前值必须小于后值"); - } - if ((endVal - startVal) < parseInt(cycle, 10)) { - return (attribute + "的取值范围内的循环无意义"); - } - return true; + let val = parseInt(currentValue, 10) + if (val < previousValue) { + return (attribute + '的参数应该从小到大') + } else { + previousValue = val + } } catch (e) { - //用不到这行代码的 - return (attribute + "的参数有非法字符,必须是整数"); + // 前面验证过了,这边的代码不可能跑到 + return ('这段提示用不到') } + } + return true } -//检查日中的特殊字符 -function checkFieldWithLetter(value, letter, minimalBefore, maximalBefore, attribute) { - //判断是否只有一个字母 - for (var i = 0; i < value.length; i++) { - var count = 0; - if (value.charAt(i) == letter) { - count++; - } - if (count > 1) { - return (attribute + "的值的" + letter + "字母只能有一个") - } +// 检验循环 +function checkIncrementField (value, minimal, maximal, attribute) { + if (value.split('/').length > 2) { + return (attribute + "中的参数只能有一个'/'") + } + let start = value.substring(0, value.indexOf('/')) + let increment = value.substring(value.indexOf('/') + 1) + if (start != '*') { + // 检验前值是否正确 + message = checkIntValue(start, minimal, maximal, true, attribute) + if (message != true) { + return message } - //校验L - if (letter == "L") { - if (value == "LW") { - return true; - } - if (value == "L") { - return true; - } - if (value.endsWith("LW") && value.length > 2) { - return (attribute + "中的参数,最后的LW前面不能有任何字母参数") - } - if (!value.endsWith("L")) { - return (attribute + "中的参数,L字母后面不能有W以外的字符、数字等") - } else { - var num = value.substring(0, value.indexOf(letter)); - return checkIntValue(num, minimalBefore, maximalBefore, true, attribute); - } - } - - //校验W - if (letter == "W") { - if (!value.endsWith("W")) { - return (attribute + "中的参数的W必须作为结尾") - } else { - if (value == "W") { - return (attribute + "中的参数的W前面必须有数字") - } - var num = value.substring(0, value.indexOf(letter)); - return checkIntValue(num, minimalBefore, maximalBefore, true, attribute); - } - } - - if (letter == "C") { - if (!value.endsWith("C")) { - return (attribute + "中的参数的C必须作为结尾") - } else { - if (value == "C") { - return (attribute + "中的参数的C前面必须有数字") - } - var num = value.substring(0, value.indexOf(letter)); - return checkIntValue(num, minimalBefore, maximalBefore, true, attribute); - } + // 检验后值是否正确 + message = checkIntValue(increment, minimal, maximal, true, attribute) + if (message != true) { + return message } + return true + } else { + // 检验后值是否正确 + return checkIntValue(increment, minimal, maximal, false, attribute) + } } -//检查星期中的特殊字符 -function checkFieldWithLetterWeek(value, letter, minimalBefore, maximalBefore, attribute) { - //判断是否只有一个字母 - for (var i = 0; i < value.length; i++) { - var count = 0; - if (value.charAt(i) == letter) { - count++; - } - if (count > 1) { - return (attribute + "的值的" + letter + "字母只能有一个") - } +// 检验范围 +function checkRangeAndCycle (params, minimal, maximal, attribute) { + // 校验“-”符号是否只有一个 + if (params.split('-').length > 2) { + return (attribute + "中的参数只能有一个'-'") + } + let value = null + let cycle = null + // 检验范围内是否有嵌套周期 + if (params.indexOf('/') > -1) { + // 校验“/”符号是否只有一个 + if (params.split('/').length > 2) { + return (attribute + "中的参数只能有一个'/'") } - //校验L - if (letter == "L") { - if (value == "L") { - return true; - } - if (!value.endsWith("L")) { - return (attribute + "中的参数,L字母必须是最后一位") - } else { - var num = value.substring(0, value.indexOf(letter)); - return checkIntValue(num, minimalBefore, maximalBefore, true, attribute); - } + value = params.split('/')[0] + cycle = params.split('/')[1] + // 判断循环的参数是否正确 + message = checkIntValue(cycle, minimal, maximal, true, attribute) + if (message != true) { + return message } + } else { + value = params + } + let startValue = value.substring(0, value.indexOf('-')) + let endValue = value.substring(value.indexOf('-') + 1) + // 判断参数范围的第一个值是否正确 + message = checkIntValue(startValue, minimal, maximal, true, attribute) + if (message != true) { + return message + } + // 判断参数范围的第二个值是否正确 + message = checkIntValue(endValue, minimal, maximal, true, attribute) + if (message != true) { + return message + } + // 判断参数的范围前值是否小于后值 + try { + let startVal = parseInt(startValue, 10) + let endVal = parseInt(endValue, 10) + if (endVal < startVal) { + return (attribute + '的取值范围错误,前值必须小于后值') + } + if ((endVal - startVal) < parseInt(cycle, 10)) { + return (attribute + '的取值范围内的循环无意义') + } + return true + } catch (e) { + // 用不到这行代码的 + return (attribute + '的参数有非法字符,必须是整数') + } +} - if (letter == "C") { - if (!value.endsWith("C")) { - return (attribute + "中的参数的C必须作为结尾") - } else { - if (value == "C") { - return (attribute + "中的参数的C前面必须有数字") - } - var num = value.substring(0, value.indexOf(letter)); - return checkIntValue(num, minimalBefore, maximalBefore, true, attribute); - } +// 检查日中的特殊字符 +function checkFieldWithLetter (value, letter, minimalBefore, maximalBefore, attribute) { + // 判断是否只有一个字母 + for (let i = 0; i < value.length; i++) { + let count = 0 + if (value.charAt(i) == letter) { + count++ } + if (count > 1) { + return (attribute + '的值的' + letter + '字母只能有一个') + } + } + // 校验L + if (letter == 'L') { + if (value == 'LW') { + return true + } + if (value == 'L') { + return true + } + if (value.endsWith('LW') && value.length > 2) { + return (attribute + '中的参数,最后的LW前面不能有任何字母参数') + } + if (!value.endsWith('L')) { + return (attribute + '中的参数,L字母后面不能有W以外的字符、数字等') + } else { + let num = value.substring(0, value.indexOf(letter)) + return checkIntValue(num, minimalBefore, maximalBefore, true, attribute) + } + } - if (letter == "#") { - if (value == "#") { - return (attribute + "中的#前后必须有整数"); - } - if (value.charAt(0) == letter) { - return (attribute + "中的#前面必须有整数") - } - if (value.endsWith("#")) { - return (attribute + "中的#后面必须有整数") - } - var num1 = value.substring(0, value.indexOf(letter)); - var num2 = value.substring(value.indexOf(letter) + 1, value.length) - message = checkIntValue(num1, 1, 4, true, (attribute + "的#前面")); - if (message != true) { - return message; - } - message = checkIntValue(num2, minimalBefore, maximalBefore, true, (attribute + "的#后面")); - if (message != true) { - return message; - } - return true; + // 校验W + if (letter == 'W') { + if (!value.endsWith('W')) { + return (attribute + '中的参数的W必须作为结尾') + } else { + if (value == 'W') { + return (attribute + '中的参数的W前面必须有数字') + } + let num = value.substring(0, value.indexOf(letter)) + return checkIntValue(num, minimalBefore, maximalBefore, true, attribute) } -} \ No newline at end of file + } + + if (letter == 'C') { + if (!value.endsWith('C')) { + return (attribute + '中的参数的C必须作为结尾') + } else { + if (value == 'C') { + return (attribute + '中的参数的C前面必须有数字') + } + let num = value.substring(0, value.indexOf(letter)) + return checkIntValue(num, minimalBefore, maximalBefore, true, attribute) + } + } +} + +// 检查星期中的特殊字符 +function checkFieldWithLetterWeek (value, letter, minimalBefore, maximalBefore, attribute) { + // 判断是否只有一个字母 + for (let i = 0; i < value.length; i++) { + let count = 0 + if (value.charAt(i) == letter) { + count++ + } + if (count > 1) { + return (attribute + '的值的' + letter + '字母只能有一个') + } + } + // 校验L + if (letter == 'L') { + if (value == 'L') { + return true + } + if (!value.endsWith('L')) { + return (attribute + '中的参数,L字母必须是最后一位') + } else { + let num = value.substring(0, value.indexOf(letter)) + return checkIntValue(num, minimalBefore, maximalBefore, true, attribute) + } + } + + if (letter == 'C') { + if (!value.endsWith('C')) { + return (attribute + '中的参数的C必须作为结尾') + } else { + if (value == 'C') { + return (attribute + '中的参数的C前面必须有数字') + } + let num = value.substring(0, value.indexOf(letter)) + return checkIntValue(num, minimalBefore, maximalBefore, true, attribute) + } + } + + if (letter == '#') { + if (value == '#') { + return (attribute + '中的#前后必须有整数') + } + if (value.charAt(0) == letter) { + return (attribute + '中的#前面必须有整数') + } + if (value.endsWith('#')) { + return (attribute + '中的#后面必须有整数') + } + let num1 = value.substring(0, value.indexOf(letter)) + let num2 = value.substring(value.indexOf(letter) + 1, value.length) + message = checkIntValue(num1, 1, 4, true, (attribute + '的#前面')) + if (message != true) { + return message + } + message = checkIntValue(num2, minimalBefore, maximalBefore, true, (attribute + '的#后面')) + if (message != true) { + return message + } + return true + } +} diff --git a/model/GroupAdmin.js b/model/GroupAdmin.js index 5d3dca0..d1a382c 100644 --- a/model/GroupAdmin.js +++ b/model/GroupAdmin.js @@ -1,44 +1,46 @@ -import { common } from './index.js'; -import lodash from 'lodash'; +import { common } from './index.js' +import lodash from 'lodash' import moment from 'moment' import { segment } from 'oicq' import loader from '../../../lib/plugins/loader.js' class Group_admin { - constructor() { - this.MuteTaskKey = 'yenai:MuteTasks' - } + constructor () { + this.MuteTaskKey = 'yenai:MuteTasks' + } - async getMemberMap(groupId, iskey = false) { - let Map = await Bot.pickGroup(groupId - 0).getMemberMap(); - return Array.from(iskey ? Map.keys() : Map.values()) - } - /** + async getMemberMap (groupId, iskey = false) { + let Map = await Bot.pickGroup(groupId - 0).getMemberMap() + return Array.from(iskey ? Map.keys() : Map.values()) + } + + /** * @description: 获取禁言中的人数组 * @param {Number} groupId 群号 * @return {Array} */ - async getMuteList(groupId) { - let list = await this.getMemberMap(groupId, true) - let mutelist = list.filter(item => Bot.pickGroup(groupId - 0).pickMember(item).mute_left != 0) - if (lodash.isEmpty(mutelist)) return false - return mutelist - } + async getMuteList (groupId) { + let list = await this.getMemberMap(groupId, true) + let mutelist = list.filter(item => Bot.pickGroup(groupId - 0).pickMember(item).mute_left != 0) + if (lodash.isEmpty(mutelist)) return false + return mutelist + } - /** + /** * @description: 解除全部禁言 * @param {Number} groupId 群号 * @return {*} */ - async releaseAllMute(groupId) { - let mutelist = await this.getMuteList(groupId) - if (!mutelist) return false; - for (let i of mutelist) { - await Bot.pickGroup(groupId - 0).muteMember(i, 0) - await common.sleep(2000) - } - return true; + async releaseAllMute (groupId) { + let mutelist = await this.getMuteList(groupId) + if (!mutelist) return false + for (let i of mutelist) { + await Bot.pickGroup(groupId - 0).muteMember(i, 0) + await common.sleep(2000) } - /** + return true + } + + /** * @description: 返回多少时间没发言的人信息 * @param {Number} groupId 群号 * @param {Number} times 时间数 @@ -46,263 +48,268 @@ class Group_admin { * @param {Number} page 页数 * @return {Array} */ - async getNoactiveInfo(groupId, times, unit, page = 1) { - let list = await this.noactiveList(groupId, times, unit) - if (!list) return { error: `暂时没有${times}${unit}没发言的淫哦╮( •́ω•̀ )╭` } - list.sort((a, b) => a.last_sent_time - b.last_sent_time) - let msg = list.map(item => - [ - segment.image(`https://q1.qlogo.cn/g?b=qq&s=100&nk=${item.user_id}`), + async getNoactiveInfo (groupId, times, unit, page = 1) { + let list = await this.noactiveList(groupId, times, unit) + if (!list) return { error: `暂时没有${times}${unit}没发言的淫哦╮( •́ω•̀ )╭` } + list.sort((a, b) => a.last_sent_time - b.last_sent_time) + let msg = list.map(item => + [ + segment.image(`https://q1.qlogo.cn/g?b=qq&s=100&nk=${item.user_id}`), `\nQQ:${item.user_id}\n`, `昵称:${item.card || item.nickname}\n`, - `最后发言时间:${moment(item.last_sent_time * 1000).format("YYYY-MM-DD HH:mm:ss")}` - ] - ) - let pageChunk = lodash.chunk(msg, 30) - if (page > pageChunk.length) return { error: "哪有那么多人辣o(´^`)o" } + `最后发言时间:${moment(item.last_sent_time * 1000).format('YYYY-MM-DD HH:mm:ss')}` + ] + ) + let pageChunk = lodash.chunk(msg, 30) + if (page > pageChunk.length) return { error: '哪有那么多人辣o(´^`)o' } - let msgs = pageChunk[page - 1] - msgs.unshift(`当前为第${page}页,共${pageChunk.length}页,本页共${msgs.length}人,总共${msg.length}人`) - msgs.unshift(`以下为${times}${unit}没发言过的坏淫`) - if (page < pageChunk.length) { - msgs.splice(2, 0, `可用 "#查看${times}${unit}没发言过的人第${page + 1}页" 翻页`) - } - return msgs + let msgs = pageChunk[page - 1] + msgs.unshift(`当前为第${page}页,共${pageChunk.length}页,本页共${msgs.length}人,总共${msg.length}人`) + msgs.unshift(`以下为${times}${unit}没发言过的坏淫`) + if (page < pageChunk.length) { + msgs.splice(2, 0, `可用 "#查看${times}${unit}没发言过的人第${page + 1}页" 翻页`) } + return msgs + } - /** + /** * @description: 清理多久没发言的人 * @param {Number} groupId 群号 * @param {Number} times 时间数 * @param {String} unit 单位 (天) - * @return {Boolean} + * @return {Boolean} */ - async clearNoactive(groupId, times, unit) { - let list = await this.noactiveList(groupId, times, unit) - if (!list) return false - list = list.map(item => item.user_id) - return await this.BatchKickMember(groupId, list) - } + async clearNoactive (groupId, times, unit) { + let list = await this.noactiveList(groupId, times, unit) + if (!list) return false + list = list.map(item => item.user_id) + return await this.BatchKickMember(groupId, list) + } - /** + /** * @description: 返回多少时间没发言的人列表 * @param {Number} groupId 群号 * @param {Number} times 时间数 * @param {String} unit 单位 (天) * @return {Array} */ - async noactiveList(groupId, times = 1, unit = "月") { - let nowtime = parseInt(Date.now() / 1000) - let timeUnit = common.Time_unit[unit] + async noactiveList (groupId, times = 1, unit = '月') { + let nowtime = parseInt(Date.now() / 1000) + let timeUnit = common.Time_unit[unit] - let time = nowtime - times * timeUnit - let list = await this.getMemberMap(groupId) + let time = nowtime - times * timeUnit + let list = await this.getMemberMap(groupId) - list = list.filter(item => item.last_sent_time < time && item.role == "member" && item.user_id != Bot.uin) - if (lodash.isEmpty(list)) return false - return list - } + list = list.filter(item => item.last_sent_time < time && item.role == 'member' && item.user_id != Bot.uin) + if (lodash.isEmpty(list)) return false + return list + } - /** + /** * @description: 返回从未发言的人 * @param {Number} geoupId 群号 * @return {Array} */ - async getNeverSpeak(groupId) { - let list = await this.getMemberMap(groupId) - list = list.filter(item => item.join_time == item.last_sent_time && item.role == "member" && item.user_id != Bot.uin) - if (lodash.isEmpty(list)) return false - return list - } - /** + async getNeverSpeak (groupId) { + let list = await this.getMemberMap(groupId) + list = list.filter(item => item.join_time == item.last_sent_time && item.role == 'member' && item.user_id != Bot.uin) + if (lodash.isEmpty(list)) return false + return list + } + + /** * @description: 返回从未发言的人信息 * @param {Number} geoupId 群号 * @return {Array} */ - async getNeverSpeakInfo(groupId, page = 1) { - let list = await this.getNeverSpeak(groupId) - if (!list) return { error: `咋群全是好淫哦~全都发过言辣٩(๑•̀ω•́๑)۶` } - list.sort((a, b) => a.join_time - b.join_time) - let msg = list.map(item => { - return [segment.image(`https://q1.qlogo.cn/g?b=qq&s=100&nk=${item.user_id}`), + async getNeverSpeakInfo (groupId, page = 1) { + let list = await this.getNeverSpeak(groupId) + if (!list) return { error: '咋群全是好淫哦~全都发过言辣٩(๑•̀ω•́๑)۶' } + list.sort((a, b) => a.join_time - b.join_time) + let msg = list.map(item => { + return [segment.image(`https://q1.qlogo.cn/g?b=qq&s=100&nk=${item.user_id}`), `\nQQ:${item.user_id}\n`, `昵称:${item.card || item.nickname}\n`, - `进群时间:${moment(item.join_time * 1000).format("YYYY-MM-DD HH:mm:ss")}` - ] - }) - let pageChunk = lodash.chunk(msg, 30) - if (page > pageChunk.length) return { error: "哪有那么多人辣o(´^`)o" } + `进群时间:${moment(item.join_time * 1000).format('YYYY-MM-DD HH:mm:ss')}` + ] + }) + let pageChunk = lodash.chunk(msg, 30) + if (page > pageChunk.length) return { error: '哪有那么多人辣o(´^`)o' } - let msgs = pageChunk[page - 1] - msgs.unshift(`当前为第${page}页,共${pageChunk.length}页,本页共${msgs.length}人,总共${msg.length}人`) - msgs.unshift(`以下为进群后从未发言过的坏淫`) - if (page < pageChunk.length) { - msgs.splice(2, 0, `可用 "#查看从未发言过的人第${page + 1}页" 翻页`) - } - return msgs + let msgs = pageChunk[page - 1] + msgs.unshift(`当前为第${page}页,共${pageChunk.length}页,本页共${msgs.length}人,总共${msg.length}人`) + msgs.unshift('以下为进群后从未发言过的坏淫') + if (page < pageChunk.length) { + msgs.splice(2, 0, `可用 "#查看从未发言过的人第${page + 1}页" 翻页`) } - /** + return msgs + } + + /** * @description: 批量踢出群成员 * @param {Number} geoupId 群号 * @param {Array} arr 要提出成员的数组 * @return {Object} 成功和失败的列表 */ - async BatchKickMember(groupId, arr) { - let success = [], fail = []; - for (let i of arr) { - if (await Bot.pickGroup(groupId - 0).kickMember(i)) { - success.push(i) - } else { - fail.push(i) - } - await common.sleep(5000) - } - let msg = [ - [`本次共清理${arr.length}人\n`, + async BatchKickMember (groupId, arr) { + let success = []; let fail = [] + for (let i of arr) { + if (await Bot.pickGroup(groupId - 0).kickMember(i)) { + success.push(i) + } else { + fail.push(i) + } + await common.sleep(5000) + } + let msg = [ + [`本次共清理${arr.length}人\n`, `成功:${success.length}人\n`, `失败:${fail.length}人`] - ] - if (!lodash.isEmpty(success)) { - success = success.map((item, index) => `\n${index + 1}、${item}`) - success.unshift("以下为清理成功的人员") - msg.push(success) - } - if (!lodash.isEmpty(fail)) { - fail = fail.map((item, index) => `\n${index + 1}、${item}`) - fail.unshift("以下为清理失败的人员") - msg.push(fail) - } - return msg + ] + if (!lodash.isEmpty(success)) { + success = success.map((item, index) => `\n${index + 1}、${item}`) + success.unshift('以下为清理成功的人员') + msg.push(success) } - /** + if (!lodash.isEmpty(fail)) { + fail = fail.map((item, index) => `\n${index + 1}、${item}`) + fail.unshift('以下为清理失败的人员') + msg.push(fail) + } + return msg + } + + /** * @description: 返回不活跃排行榜 * @param {Number} geoupId 群号 * @param {Number} num 榜单数量 * @return {Array} */ - async InactiveRanking(groupId, num) { - let list = await this.getMemberMap(groupId); - list.sort((a, b) => { - return a.last_sent_time - b.last_sent_time - }) - let msg = list.slice(0, num) - msg = msg.map((item, index) => { - return [`第${index + 1}名:\n`, - segment.image(`https://q1.qlogo.cn/g?b=qq&s=100&nk=${item.user_id}`), + async InactiveRanking (groupId, num) { + let list = await this.getMemberMap(groupId) + list.sort((a, b) => { + return a.last_sent_time - b.last_sent_time + }) + let msg = list.slice(0, num) + msg = msg.map((item, index) => { + return [`第${index + 1}名:\n`, + segment.image(`https://q1.qlogo.cn/g?b=qq&s=100&nk=${item.user_id}`), `\nQQ:${item.user_id}\n`, `昵称:${item.card || item.nickname}\n`, - `最后发言时间:${moment(item.last_sent_time * 1000).format("YYYY-MM-DD HH:mm:ss")}` - ] - }) - msg.unshift(`不活跃排行榜top1 - top${num}`) - return msg - } - /** + `最后发言时间:${moment(item.last_sent_time * 1000).format('YYYY-MM-DD HH:mm:ss')}` + ] + }) + msg.unshift(`不活跃排行榜top1 - top${num}`) + return msg + } + + /** * @description: 获取最近加群情况 * @param {Number} geoupId 群号 * @param {Number} num 获取的数量 - * @return {Array} + * @return {Array} */ - async getRecentlyJoined(groupId, num) { - let list = await this.getMemberMap(groupId); - list.sort((a, b) => { - return b.join_time - a.join_time - }) - let msg = list.slice(0, num) - msg = msg.map((item) => { - return [ - segment.image(`https://q1.qlogo.cn/g?b=qq&s=100&nk=${item.user_id}`), + async getRecentlyJoined (groupId, num) { + let list = await this.getMemberMap(groupId) + list.sort((a, b) => { + return b.join_time - a.join_time + }) + let msg = list.slice(0, num) + msg = msg.map((item) => { + return [ + segment.image(`https://q1.qlogo.cn/g?b=qq&s=100&nk=${item.user_id}`), `\nQQ:${item.user_id}\n`, `昵称:${item.card || item.nickname}\n`, - `入群时间:${moment(item.join_time * 1000).format("YYYY-MM-DD HH:mm:ss")}\n`, - `最后发言时间:${moment(item.last_sent_time * 1000).format("YYYY-MM-DD HH:mm:ss")}` - ] - }) - msg.unshift(`最近的${num}条入群记录`) - return msg - } - /** + `入群时间:${moment(item.join_time * 1000).format('YYYY-MM-DD HH:mm:ss')}\n`, + `最后发言时间:${moment(item.last_sent_time * 1000).format('YYYY-MM-DD HH:mm:ss')}` + ] + }) + msg.unshift(`最近的${num}条入群记录`) + return msg + } + + /** * @description: 设置群定时禁言 * @param {Number} group 群号 * @param {String} cron cron 表达式 * @param {Boolean} type true为禁言false为解禁 */ - async setMuteTask(group, cron, type) { - let name = `椰奶群定时${type ? '禁言' : "解禁"}${group}` - if (loader.task.find(item => item.name == name)) return false; - let redisTask = JSON.parse(await redis.get(this.MuteTaskKey)) || [] - let task = { - cron: cron, - name, - fnc: () => { - Bot.pickGroup(Number(group)).muteAll(type) - }, - } - loader.task.push(lodash.cloneDeep(task)) - loader.creatTask() - redisTask.push({ cron, group, type }) - redis.set(this.MuteTaskKey, JSON.stringify(redisTask)) - return true; + async setMuteTask (group, cron, type) { + let name = `椰奶群定时${type ? '禁言' : '解禁'}${group}` + if (loader.task.find(item => item.name == name)) return false + let redisTask = JSON.parse(await redis.get(this.MuteTaskKey)) || [] + let task = { + cron, + name, + fnc: () => { + Bot.pickGroup(Number(group)).muteAll(type) + } } + loader.task.push(lodash.cloneDeep(task)) + loader.creatTask() + redisTask.push({ cron, group, type }) + redis.set(this.MuteTaskKey, JSON.stringify(redisTask)) + return true + } - /** + /** * @description: 返回redis储存定时任务 * @return {Array} 定时任务数组 */ - async getRedisMuteTask() { - return JSON.parse(await redis.get(this.MuteTaskKey))?.map(item => { - return { - cron: item.cron, - name: `椰奶群定时${item.type ? '禁言' : "解禁"}${item.group}`, - fnc: () => { - Bot.pickGroup(Number(item.group)).muteAll(item.type) - } - } - }) - } + async getRedisMuteTask () { + return JSON.parse(await redis.get(this.MuteTaskKey))?.map(item => { + return { + cron: item.cron, + name: `椰奶群定时${item.type ? '禁言' : '解禁'}${item.group}`, + fnc: () => { + Bot.pickGroup(Number(item.group)).muteAll(item.type) + } + } + }) + } - /** + /** * @description: 删除定时任务 * @param {Number} group * @param {Boolean} type true为禁言false为解禁 * @return {Boolean} */ - async delMuteTask(group, type) { - let redisTask = JSON.parse(await redis.get(this.MuteTaskKey)) || [] - loader.task = loader.task.filter(item => item.name !== `椰奶群定时${type ? '禁言' : "解禁"}${group}`) - redisTask = redisTask.filter(item => item.group !== group && item.type !== type) - redis.set(this.MuteTaskKey, JSON.stringify(redisTask)) - return true - } + async delMuteTask (group, type) { + let redisTask = JSON.parse(await redis.get(this.MuteTaskKey)) || [] + loader.task = loader.task.filter(item => item.name !== `椰奶群定时${type ? '禁言' : '解禁'}${group}`) + redisTask = redisTask.filter(item => item.group !== group && item.type !== type) + redis.set(this.MuteTaskKey, JSON.stringify(redisTask)) + return true + } - /** + /** * @description: 获取定时任务 */ - getMuteTask() { - let RegEx = /椰奶群定时(禁言|解禁)(\d+)/ - let taskList = lodash.cloneDeep(loader.task) - let MuteList = taskList.filter(item => /椰奶群定时禁言\d+/.test(item.name)) - let noMuteList = taskList.filter(item => /椰奶群定时解禁\d+/.test(item.name)) - noMuteList.forEach(noitem => { - let index = MuteList.findIndex(item => noitem.name.match(RegEx)[2] == item.name.match(RegEx)[2]) - if (index !== -1) { - MuteList[index].nocron = noitem.cron - } else { - noitem.nocron = noitem.cron - delete noitem.cron - MuteList.push(noitem) - } - }) - return MuteList.map(item => { - let analysis = item.name.match(RegEx) - return [ - segment.image(`https://p.qlogo.cn/gh/${analysis[2]}/${analysis[2]}/100`), + getMuteTask () { + let RegEx = /椰奶群定时(禁言|解禁)(\d+)/ + let taskList = lodash.cloneDeep(loader.task) + let MuteList = taskList.filter(item => /椰奶群定时禁言\d+/.test(item.name)) + let noMuteList = taskList.filter(item => /椰奶群定时解禁\d+/.test(item.name)) + noMuteList.forEach(noitem => { + let index = MuteList.findIndex(item => noitem.name.match(RegEx)[2] == item.name.match(RegEx)[2]) + if (index !== -1) { + MuteList[index].nocron = noitem.cron + } else { + noitem.nocron = noitem.cron + delete noitem.cron + MuteList.push(noitem) + } + }) + return MuteList.map(item => { + let analysis = item.name.match(RegEx) + return [ + segment.image(`https://p.qlogo.cn/gh/${analysis[2]}/${analysis[2]}/100`), `\n群号:${analysis[2]}`, - item.cron ? `\n禁言时间:'${item.cron}'` : "", - item.nocron ? `\n解禁时间:'${item.nocron}'` : "", - ] - }) - } + item.cron ? `\n禁言时间:'${item.cron}'` : '', + item.nocron ? `\n解禁时间:'${item.nocron}'` : '' + ] + }) + } } -export default new Group_admin(); \ No newline at end of file +export default new Group_admin() diff --git a/model/Interface.js b/model/Interface.js index 48796fe..f6427c3 100644 --- a/model/Interface.js +++ b/model/Interface.js @@ -1,149 +1,148 @@ -import fetch from "node-fetch"; -import md5 from "md5"; -import lodash from "lodash"; +import fetch from 'node-fetch' +import md5 from 'md5' +import lodash from 'lodash' -const API_ERROR = "出了点小问题,待会再试试吧"; +const API_ERROR = '出了点小问题,待会再试试吧' export default new class Interface { - constructor() { - this.langtype = [{ - code: "ar", - label: "阿拉伯语", - alphabet: "A" - }, { - code: "de", - label: "德语", - alphabet: "D" - }, { - code: "ru", - label: "俄语", - alphabet: "E" - }, { - code: "fr", - label: "法语", - alphabet: "F" - }, { - code: "ko", - label: "韩语", - alphabet: "H" - }, { - code: "nl", - label: "荷兰语", - alphabet: "H" - }, { - code: "pt", - label: "葡萄牙语", - alphabet: "P" - }, { - code: "ja", - label: "日语", - alphabet: "R" - }, { - code: "th", - label: "泰语", - alphabet: "T" - }, { - code: "es", - label: "西班牙语", - alphabet: "X" - }, { - code: "en", - label: "英语", - alphabet: "Y" - }, { - code: "it", - label: "意大利语", - alphabet: "Y" - }, { - code: "vi", - label: "越南语", - alphabet: "Y" - }, { - code: "id", - label: "印度尼西亚语", - alphabet: "Y" - }, { - code: "zh-CHS", - label: "中文", - alphabet: "Z" - }] - } - /**有道翻译 */ - async youdao(msg, to = "auto", from = "auto") { - if (to != "auto") to = this.langtype.find(item => item.label == to)?.code; - if (from != "auto") from = this.langtype.find(item => item.label == from)?.code; - if (!to || !from) return `未找到翻译的语种,支持的语言为:\n${this.langtype.map(item => item.label).join(",")}\n示例:#翻译你好 - 自动翻译\n#日语翻译你好 - 指定翻译为语种\n#中文-日语翻译你好 - 指定原语言翻译为指定语言` - console.log(to, from); - // 翻译结果为空的提示 - const RESULT_ERROR = "找不到翻译结果"; - // API 请求错误提示 - const qs = (obj) => { - let res = ""; - for (const [k, v] of Object.entries(obj)) - res += `${k}=${encodeURIComponent(v)}&`; - return res.slice(0, res.length - 1); - }; - const appVersion = "5.0 (Windows NT 10.0; Win64; x64) Chrome/98.0.4750.0"; - const payload = { - from, - to, - bv: md5(appVersion), - client: "fanyideskweb", - doctype: "json", - version: "2.1", - keyfrom: "fanyi.web", - action: "FY_BY_DEFAULT", - smartresult: "dict" - }; - const headers = { - Host: "fanyi.youdao.com", - "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) Chrome/98.0.4758.102", - Referer: "https://fanyi.youdao.com/", - "Content-Type": "application/x-www-form-urlencoded; charset=UTF-8", - Cookie: `OUTFOX_SEARCH_USER_ID_NCOO=133190305.98519628; OUTFOX_SEARCH_USER_ID="2081065877@10.169.0.102";` - }; - const api = "https://fanyi.youdao.com/translate_o?smartresult=dict&smartresult=rule"; - const key = "Ygy_4c=r#e#4EX^NUGUc5"; + constructor () { + this.langtype = [{ + code: 'ar', + label: '阿拉伯语', + alphabet: 'A' + }, { + code: 'de', + label: '德语', + alphabet: 'D' + }, { + code: 'ru', + label: '俄语', + alphabet: 'E' + }, { + code: 'fr', + label: '法语', + alphabet: 'F' + }, { + code: 'ko', + label: '韩语', + alphabet: 'H' + }, { + code: 'nl', + label: '荷兰语', + alphabet: 'H' + }, { + code: 'pt', + label: '葡萄牙语', + alphabet: 'P' + }, { + code: 'ja', + label: '日语', + alphabet: 'R' + }, { + code: 'th', + label: '泰语', + alphabet: 'T' + }, { + code: 'es', + label: '西班牙语', + alphabet: 'X' + }, { + code: 'en', + label: '英语', + alphabet: 'Y' + }, { + code: 'it', + label: '意大利语', + alphabet: 'Y' + }, { + code: 'vi', + label: '越南语', + alphabet: 'Y' + }, { + code: 'id', + label: '印度尼西亚语', + alphabet: 'Y' + }, { + code: 'zh-CHS', + label: '中文', + alphabet: 'Z' + }] + } - const i = msg; // 翻译的内容 - const lts = "" + new Date().getTime(); - const salt = lts + parseInt(String(10 * Math.random()), 10); - const sign = md5(payload.client + i + salt + key); - const postData = qs(Object.assign({ i, lts, sign, salt }, payload)) - try { - let { errorCode, translateResult } = await fetch(api, { - method: "POST", - body: postData, - headers - }).then(res => res.json()).catch(err => console.error(err)); - if (errorCode != 0) return API_ERROR; - translateResult = lodash.flattenDeep(translateResult)?.map(item => item.tgt).join("\n"); - if (!translateResult) return RESULT_ERROR - return translateResult - } catch (e) { - console.log(e); - return API_ERROR - } + /** 有道翻译 */ + async youdao (msg, to = 'auto', from = 'auto') { + if (to != 'auto') to = this.langtype.find(item => item.label == to)?.code + if (from != 'auto') from = this.langtype.find(item => item.label == from)?.code + if (!to || !from) return `未找到翻译的语种,支持的语言为:\n${this.langtype.map(item => item.label).join(',')}\n示例:#翻译你好 - 自动翻译\n#日语翻译你好 - 指定翻译为语种\n#中文-日语翻译你好 - 指定原语言翻译为指定语言` + console.log(to, from) + // 翻译结果为空的提示 + const RESULT_ERROR = '找不到翻译结果' + // API 请求错误提示 + const qs = (obj) => { + let res = '' + for (const [k, v] of Object.entries(obj)) { res += `${k}=${encodeURIComponent(v)}&` } + return res.slice(0, res.length - 1) } - - /**随机唱歌/唱鸭 */ - async randomSinging() { - try { - const api = `https://m.api.singduck.cn/user-piece/SoQJ9cKu61FJ1Vwc7` - let res = await fetch(api).then(res => res.text()); - let JSONdara = JSON.parse(res.match(/