[\s\S]+?<\/div>/)
let title = res.match(/
(.*?))
- if (!div) return e.reply("未获取到图片,请稍后重试")
- let list = div[0].match(/https?:\/\/(([a-zA-Z0-9_-])+(\.)?)*(:\d+)?(\/((\.)?(\?)?=?&?[a-zA-Z0-9_-](\?)?)*)*/ig);
+ if (!div) return e.reply('未获取到图片,请稍后重试')
+ let list = div[0].match(/https?:\/\/(([a-zA-Z0-9_-])+(\.)?)*(:\d+)?(\/((\.)?(\?)?=?&?[a-zA-Z0-9_-](\?)?)*)*/ig)
if (!list) {
if (!appoint) {
- return e.reply(`可能超过今日限制,请稍后再试`, true)
+ return e.reply('可能超过今日限制,请稍后再试', true)
} else {
- return e.reply(`请检查指定是否正确`, true)
+ return e.reply('请检查指定是否正确', true)
}
}
let msg = lodash.take(list.map(item => 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}`);
+ .replace(/\n/g, '')
+ .replace(/(.+?)<\/title>/g, '___')
+ .replace(/___+/, `${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(/