diff --git a/apps/groupAdmin.js b/apps/groupAdmin.js index 432714d..7cac79a 100644 --- a/apps/groupAdmin.js +++ b/apps/groupAdmin.js @@ -1,17 +1,13 @@ -import plugin from '../../../lib/plugins/plugin.js' -import { segment } from 'oicq' import _ from 'lodash' -import { Config } from '../components/index.js' -import { GroupAdmin as ga, common, QQApi, puppeteer } from '../model/index.js' -import cronValidate from '../tools/cronValidate.js' import moment from 'moment' - +import { segment } from 'oicq' +import plugin from '../../../lib/plugins/plugin.js' +import { Config } from '../components/index.js' +import { common, GroupAdmin as ga, puppeteer, QQApi } from '../model/index.js' +import cronValidate from '../tools/cronValidate.js' +import { groupTitleMsg } from '../tools/msg.js' // API请求错误文案 const API_ERROR = '❎ 出错辣,请稍后重试' -// 无管理文案 -const ROLE_ERROR = '我连管理员都木有,这种事怎么可能做到的辣!!!' -// 权限不足文案 -const PERMISSION_ERROR = '❎ 该命令仅限管理员可用' // 正则 const Numreg = '[一壹二两三四五六七八九十百千万亿\\d]+' const TimeUnitReg = Object.keys(common.Time_unit).join('|') @@ -155,36 +151,67 @@ export class GroupAdmin extends plugin { this.task = redisTask } + /** + * @description: 判断权限 + * @param {*} e + * @param {'master'|'admin'|'owner'|'all'} permission 权限 + * @param {'admin'|'owner'|'all'} role 需要的权限 + * @return {Boolean} + */ + Authentication (e, permission, role) { + if (role == 'owner' && !e.group.is_owner) { + e.reply('我连群主都木有,这种事怎么可能做到的辣!!!', true) + return false + } else if (role == 'admin' && !e.group.is_admin && !e.group.is_owner) { + e.reply('我连管理员都木有,这种事怎么可能做到的辣!!!', true) + return false + } + // 判断权限 + if (e.isMaster) return true + if (permission == 'master' && !e.isMaster) { + e.reply('❎ 该命令仅限主人可用', true) + return false + } else if (permission == 'owner' && !e.member.is_owner) { + e.reply('❎ 该命令仅限群主可用', true) + return false + } else if (permission == 'admin' && !e.member.is_admin && !e.member.is_owner) { + e.reply('❎ 该命令仅限管理可用') + return false + } + return true + } + /** 禁言 */ async muteMember (e) { - // 判断权限 - if (!e.member.is_admin && !e.member.is_owner && !e.isMaster) return e.reply(PERMISSION_ERROR) + if (!this.Authentication(e, 'admin', 'admin')) return let qq = e.message.find(item => item.type == 'at')?.qq - let regRet = e.msg.match(new RegExp(`#禁言\\s?((\\d+)\\s)?(${Numreg})?(${TimeUnitReg})?`)) - console.log(regRet) - let res = await ga.muteMember(e.group_id, qq ?? regRet[2], e.user_id, regRet[3], regRet[4]) - e.reply(res) + let reg = `#禁言\\s?((\\d+)\\s)?(${Numreg})?(${TimeUnitReg})?` + let regRet = e.msg.match(new RegExp(reg)) + e.reply(await ga.muteMember( + e.group_id, + qq ?? regRet[2], + e.user_id, + regRet[3], + regRet[4] + )) } /** 解禁 */ async noMuteMember (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 (!this.Authentication(e, 'admin', 'admin')) return let qq = e.message.find(item => item.type == 'at')?.qq let regRet = e.msg.match(/#解禁(\d+)/) - let res = await ga.muteMember(e.group_id, qq ?? regRet[1], e.user_id, 0) - e.reply(res) + e.reply(await ga.muteMember( + e.group_id, + qq ?? regRet[1], + e.user_id, + 0)) } /** 全体禁言 */ async muteAll (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 (!this.Authentication(e, 'admin', 'admin')) return let type = /全体禁言/.test(e.msg) let res = await e.group.muteAll(type) @@ -194,10 +221,7 @@ export class GroupAdmin extends plugin { // 踢群员 async kickMember (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 (!this.Authentication(e, 'admin', 'admin')) return let qq = e.message.find(item => item.type == 'at')?.qq if (!qq) qq = e.msg.replace(/#|踢/g, '').trim() @@ -225,10 +249,7 @@ export class GroupAdmin extends plugin { // 设置管理 async SetAdmin (e) { - // 判断权限 - if (!e.isMaster) return e.reply(PERMISSION_ERROR) - if (!e.group.is_owner) return e.reply(ROLE_ERROR, true) - + if (!this.Authentication(e, 'master', 'owner')) return let qq = e.message.find(item => item.type == 'at')?.qq let type = /设置管理/.test(e.msg) if (!qq) qq = e.msg.replace(/#|(设置|取消)管理/g, '').trim() @@ -246,10 +267,7 @@ export class GroupAdmin extends plugin { // 匿名 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) + if (!this.Authentication(e, 'admin', 'admin')) return let type = /(允许|开启)匿名/.test(e.msg) let res = await e.group.allowAnony(type) @@ -259,12 +277,7 @@ export class GroupAdmin extends plugin { // 发群公告 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) - } + if (!this.Authentication(e, 'admin', 'admin')) return // 获取发送的内容 let msg = e.msg.replace(/#|发群公告/g, '').trim() if (!msg) return e.reply('❎ 公告不能为空') @@ -286,12 +299,7 @@ export class GroupAdmin extends plugin { // 删群公告 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) - } + if (!this.Authentication(e, 'admin', 'admin')) return let msg = e.msg.replace(/#|删群公告/, '').trim() if (!msg) return e.reply('❎ 序号不可为空') @@ -307,17 +315,14 @@ export class GroupAdmin extends plugin { // 修改头衔 async adminsetTitle (e) { - if (!e.isMaster) return e.reply(PERMISSION_ERROR) + if (!this.Authentication(e, 'master', 'owner')) return - if (e.message.length < 2) return - - if (e.message[1].type != 'at') return - - 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) + let qq = e.message.find(item => item.type == 'at')?.qq + if (qq) return e.reply('请艾特要修改的人哦~') + let text = e.msg.replace(/#|修改头衔/, '') + let res = await e.group.setTitle(qq, text) if (res) { - e.reply(`已经把这个小可爱的头衔设置为「${e.message[2].text}」辣`) + e.reply(`已经把这个小可爱的头衔设置为「${text}」辣`) } else { e.reply('额...没给上不知道发生了神魔') } @@ -325,15 +330,7 @@ export class GroupAdmin extends plugin { // 申请头衔 async SetGroupSpecialTitle (e) { - let msgs = [ - '换上辣(´•ω•̥`)', - '嗯!不戳的头衔哦٩(๑•ㅂ•)۶', - '给你换上了哦(*^ワ^*)', - '又要换了吗,真是喜新厌旧呢( •̥́ ˍ •̀ू )', - '啾咪٩(๑•̀ω•́๑)۶', - '弃旧恋新了么笨蛋( 。ớ ₃ờ)ھ' - ] - if (!e.group.is_owner) return false + if (!this.Authentication(e, 'all', 'owner')) return let Title = e.msg.replace(/#|申请头衔/g, '') // 屏蔽词处理 @@ -353,7 +350,7 @@ export class GroupAdmin extends plugin { if (!Title) return e.reply('什么"(º Д º*)!没有头衔,哼把你的头衔吃掉!!!', true) - e.reply(_.sample(msgs), true) + e.reply(_.sample(groupTitleMsg), true) } // 字符列表 @@ -387,11 +384,7 @@ export class GroupAdmin extends plugin { // 替换幸运字符 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) - } + if (!this.Authentication(e, 'admin', 'admin')) return let id = e.msg.replace(/#|替换(幸运)?字符/g, '') let res = await QQApi.equipLucky(e.group_id, id) @@ -402,7 +395,7 @@ export class GroupAdmin extends plugin { // 开启或关闭群字符 async qun_luckyset (e) { - if (!e.member.is_admin && !e.member.is_owner && !e.isMaster) return e.reply(PERMISSION_ERROR) + if (!this.Authentication(e, 'admin', 'admin')) return let res = await QQApi.swichLucky(e.group_id, /开启/.test(e.msg)) if (!res) return e.reply(API_ERROR) @@ -421,38 +414,40 @@ export class GroupAdmin extends plugin { // 解除全部禁言 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) + if (!this.Authentication(e, 'admin', 'admin')) return 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 (!this.Authentication(e, 'admin', 'admin')) return + + let regRet = noactivereg.exec(e.msg) + regRet[2] = common.translateChinaNum(regRet[2] || 1) // 确认清理直接执行 - if (Reg[1] == '确认清理') { - if (!e.group.is_admin && !e.group.is_owner) { - return e.reply(ROLE_ERROR, true) - } - return e.reply(await ga.clearNoactive(e.group_id, Reg[2], Reg[3])) + if (regRet[1] == '确认清理') { + return e.reply(await ga.clearNoactive( + e.group_id, + regRet[2], + regRet[3] + )) } // 查看和清理都会发送列表 - let page = common.translateChinaNum(Reg[5] || 1) - let msg = await ga.getNoactiveInfo(e.group_id, Reg[2], Reg[3], page) + let page = common.translateChinaNum(regRet[5] || 1) + let msg = await ga.getNoactiveInfo( + e.group_id, + regRet[2], + regRet[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]) + if (regRet[1] == '清理') { + let list = await ga.noactiveList(e.group_id, regRet[2], regRet[3]) e.reply([ `本次共需清理「${list.length}」人,防止误触发\n`, - `请发送:#确认清理${Reg[2]}${Reg[3]}没发言的人` + `请发送:#确认清理${regRet[2]}${regRet[3]}没发言的人` ]) } common.getforwardMsg(e, msg) @@ -460,22 +455,21 @@ export class GroupAdmin extends plugin { // 查看和清理从未发言的人 async neverspeak (e) { - if (!e.member.is_admin && !e.member.is_owner && !e.isMaster) return e.reply(PERMISSION_ERROR) + if (!this.Authentication(e, 'admin', 'admin')) return 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 arr = list.map(item => item.user_id) return e.reply(await ga.BatchKickMember(e.group_id, arr)) } // 清理 if (/^#?清理/.test(e.msg)) { - if (!e.group.is_admin && !e.group.is_owner) { - return e.reply(ROLE_ERROR, true) - } - e.reply(`本次共需清理「${list.length}」人,防止误触发\n请发送:#确认清理从未发言的人`) + e.reply([ + `本次共需清理「${list.length}」人,防止误触发\n`, + '请发送:#确认清理从未发言的人' + ]) } // 发送列表 let page = e.msg.match(new RegExp(Numreg)) @@ -500,8 +494,7 @@ export class GroupAdmin extends plugin { // 发送通知 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) + if (!this.Authentication(e, 'admin', 'admin')) return e.message[0].text = e.message[0].text.replace('#发通知', '').trim() if (!e.message[0].text) e.message.shift() @@ -512,7 +505,7 @@ export class GroupAdmin extends plugin { // 设置定时群禁言 async timeMute (e) { - if (!e.member.is_admin && !e.member.is_owner && !e.isMaster) return e.reply(PERMISSION_ERROR) + if (!this.Authentication(e, 'admin', 'admin')) return let type = /禁言/.test(e.msg) if (/任务/.test(e.msg)) { let task = ga.getMuteTask() @@ -523,7 +516,6 @@ export class GroupAdmin extends plugin { 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表达式`) @@ -588,7 +580,7 @@ export class GroupAdmin extends plugin { // 群发言榜单 async SpeakRank (e) { - if (!e.group.is_admin && !e.group.is_owner) return e.reply(ROLE_ERROR, true) + if (!this.Authentication(e, 'all', 'admin')) return // 图片截图 let screenshot = await puppeteer.Webpage({ @@ -655,7 +647,7 @@ export class GroupAdmin extends plugin { // 群数据 async groupData (e) { - if (!e.group.is_admin && !e.group.is_owner) return e.reply(ROLE_ERROR, true) + if (!this.Authentication(e, 'all', 'admin')) return // 浏览器截图 let screenshot = await puppeteer.Webpage({ @@ -698,9 +690,9 @@ export class GroupAdmin extends plugin { ) } + /** 开启或关闭加群通知 */ 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) + if (!this.Authentication(e, 'admin', 'admin')) return let type = /开启/.test(e.msg) ? 'add' : 'del' let isopen = Config.groupAdd.openGroup.includes(e.group_id) if (isopen && type == 'add') return e.reply('❎ 本群加群申请通知已处于开启状态') diff --git a/model/GroupAdmin.js b/model/GroupAdmin.js index 024605c..3319f53 100644 --- a/model/GroupAdmin.js +++ b/model/GroupAdmin.js @@ -58,7 +58,7 @@ export default new class { * @param {Number} times 时间数 * @param {String} unit 单位 (天) * @param {Number} page 页数 - * @return {Array} + * @return {Promise} */ async getNoactiveInfo (groupId, times, unit, page = 1) { let list = await this.noactiveList(groupId, times, unit) @@ -89,7 +89,7 @@ export default new class { * @param {Number} groupId 群号 * @param {Number} times 时间数 * @param {String} unit 单位 (天) - * @return {Boolean} + * @return {Promise} */ async clearNoactive (groupId, times, unit) { let list = await this.noactiveList(groupId, times, unit) @@ -103,7 +103,7 @@ export default new class { * @param {Number} groupId 群号 * @param {Number} times 时间数 * @param {String} unit 单位 (天) - * @return {Array} + * @return {Promise} */ async noactiveList (groupId, times = 1, unit = '月') { let nowtime = parseInt(Date.now() / 1000) @@ -120,7 +120,7 @@ export default new class { /** * @description: 返回从未发言的人 * @param {Number} geoupId 群号 - * @return {Array} + * @return {Promise} */ async getNeverSpeak (groupId) { let list = await this.getMemberMap(groupId) @@ -132,7 +132,7 @@ export default new class { /** * @description: 返回从未发言的人信息 * @param {Number} geoupId 群号 - * @return {Array} + * @return {Promse} */ async getNeverSpeakInfo (groupId, page = 1) { let list = await this.getNeverSpeak(groupId) @@ -175,7 +175,7 @@ export default new class { * @description: 返回不活跃排行榜 * @param {Number} geoupId 群号 * @param {Number} num 榜单数量 - * @return {Array} + * @return {Promse} */ async InactiveRanking (groupId, num) { let list = await this.getMemberMap(groupId) @@ -199,7 +199,7 @@ export default new class { * @description: 获取最近加群情况 * @param {Number} geoupId 群号 * @param {Number} num 获取的数量 - * @return {Array} + * @return {Promse} */ async getRecentlyJoined (groupId, num) { let list = await this.getMemberMap(groupId) @@ -310,7 +310,7 @@ export default new class { * @param {Number} executor 执行人QQ * @param {Number} time 时间倍数 0为解禁 * @param {String} unit 时间单位 - * @return {String} 回复消息 + * @return {Promise} 回复消息 */ async muteMember (groupId, userId, executor, time = 5, unit = '分') { unit = common.Time_unit[unit.toUpperCase()] ?? (/^\d+$/.test(unit) ? unit : 60) @@ -346,7 +346,7 @@ export default new class { * @param {Number} groupId 群号 * @param {Number} userId 被踢人 * @param {Number} executor 执行人 - * @return {*} + * @return {Promise} */ async kickMember (groupId, userId, executor) { let group = null diff --git a/model/Pixiv.js b/model/Pixiv.js index 7b3173a..5e93586 100644 --- a/model/Pixiv.js +++ b/model/Pixiv.js @@ -4,7 +4,8 @@ import fetch from 'node-fetch' import { segment } from 'oicq' import { Config } from '../components/index.js' import request from '../lib/request/request.js' -import { MSG, rankType } from '../tools/pixiv.js' +import { rankType } from '../tools/pixiv.js' +import { pixivMsg } from '../tools/msg.js' import PixivApi from './Pixiv/api.js' /** API请求错误文案 */ @@ -54,7 +55,7 @@ export default new class Pixiv { /** 开始执行文案 */ get startMsg () { - return _.sample(MSG.start) + return _.sample(pixivMsg.start) } /** diff --git a/model/setu.js b/model/setu.js index 7a99488..2d603e2 100644 --- a/model/setu.js +++ b/model/setu.js @@ -1,7 +1,7 @@ import { common, Pixiv } from './index.js' import { Data, Plugin_Path, Config } from '../components/index.js' import _ from 'lodash' -import { MSG } from '../tools/setu.js' +import { setuMsg } from '../tools/msg.js' import request from '../lib/request/request.js' export default new class setu { constructor () { @@ -20,17 +20,17 @@ export default new class setu { /** 开始执行文案 */ get startMsg () { - return _.sample(MSG.start) + return _.sample(setuMsg.start) } /** CD中文案 */ get CDMsg () { - return _.sample(MSG.cd) + return _.sample(setuMsg.cd) } /** 发送图片文案 */ get sendMsgs () { - return _.sample(MSG.send) + return _.sample(setuMsg.send) } /** diff --git a/tools/setu.js b/tools/msg.js similarity index 75% rename from tools/setu.js rename to tools/msg.js index ac5727d..6665440 100644 --- a/tools/setu.js +++ b/tools/msg.js @@ -1,4 +1,4 @@ -export const MSG = { +export const setuMsg = { start: [ '正在给你找setu了,你先等等再冲~', '你先别急,正在找了~', @@ -47,3 +47,21 @@ export const MSG = { 'eee,死肥宅不要啦!恶心心!' ] } + +export const pixivMsg = { + start: [ + '你先别急,正在给你搜了(。-ω-)zzz', + '你先别急,马上去给你找哦ε(*´・ω・)з', + '你先别急,正在给你搜了(。-ω-)zzz', + '你先别急,马上去给你找哦ε(*´・ω・)з' + ] +} + +export const groupTitleMsg = [ + '换上辣(´•ω•̥`)', + '嗯!不戳的头衔哦٩(๑•ㅂ•)۶', + '给你换上了哦(*^ワ^*)', + '又要换了吗,真是喜新厌旧呢( •̥́ ˍ •̀ू )', + '啾咪٩(๑•̀ω•́๑)۶', + '弃旧恋新了么笨蛋( 。ớ ₃ờ)ھ' +] diff --git a/tools/pixiv.js b/tools/pixiv.js index 9a60dad..78fc3cf 100644 --- a/tools/pixiv.js +++ b/tools/pixiv.js @@ -81,11 +81,3 @@ export const rankType = { r18: false } } -export const MSG = { - start: [ - '你先别急,正在给你搜了(。-ω-)zzz', - '你先别急,马上去给你找哦ε(*´・ω・)з', - '你先别急,正在给你搜了(。-ω-)zzz', - '你先别急,马上去给你找哦ε(*´・ω・)з' - ] -}