diff --git a/apps/fun.js b/apps/fun.js index 1a5b8c7..8141eb2 100644 --- a/apps/fun.js +++ b/apps/fun.js @@ -31,7 +31,7 @@ lodash.forIn(picapis, (values, key) => { const apiReg = new RegExp(`(${picApiKeys.join('|')}|^jktj$|^接口统计$)`) -export class example extends plugin { +export class Fun extends plugin { constructor () { super({ name: '椰奶娱乐', diff --git a/apps/gp_admin.js b/apps/groupAdmin.js similarity index 87% rename from apps/gp_admin.js rename to apps/groupAdmin.js index 644b377..10d2e87 100644 --- a/apps/gp_admin.js +++ b/apps/groupAdmin.js @@ -18,28 +18,28 @@ const noactivereg = new RegExp(`^#(查看|清理|确认清理|获取)(${Numreg}) const Autisticreg = new RegExp(`^#?我要(自闭|禅定)(${Numreg})?个?(${TimeUnitReg})?$`, 'i') // 获取定时任务 const redisTask = await ga.getRedisMuteTask() || false -export class Basics extends plugin { +export class GroupAdmin extends plugin { constructor () { super({ - name: '椰奶基础群管', + name: '椰奶群管', event: 'message.group', priority: 500, rule: [ { - reg: '^#禁言.*$', - fnc: 'Taboo' + reg: `^#禁言\\s?((\\d+)\\s)?(${Numreg})?(${TimeUnitReg})?$`, + fnc: 'muteMember' }, { reg: '^#解禁(\\d+)?$', - fnc: 'Relieve' + fnc: 'noMuteMember' }, { reg: '^#全体(禁言|解禁)$', - fnc: 'TabooAll' + fnc: 'muteAll' }, { reg: '^#踢(\\d+)?$', - fnc: 'Kick' + fnc: 'kickMember' }, { reg: '^#(设置|取消)管理(\\d+)?$', @@ -155,76 +155,31 @@ export class Basics extends plugin { } /** 禁言 */ - async Taboo (e) { + async muteMember (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))) || '分'] - } - 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 + 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) } /** 解禁 */ - async Relieve (e) { + 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) 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) + let regRet = e.msg.match(/#解禁(\\d+)/) + let res = await ga.muteMember(e.group_id, qq ?? regRet[1], e.user_id, 0) + e.reply(res) } /** 全体禁言 */ - async TabooAll (e) { + async muteAll (e) { // 判断权限 if (!e.member.is_admin && !e.member.is_owner && !e.isMaster) return e.reply(PERMISSION_ERROR) // 判断是否有管理 @@ -237,7 +192,7 @@ export class Basics extends plugin { } // 踢群员 - async Kick (e) { + async kickMember (e) { // 判断权限 if (!e.member.is_admin && !e.member.is_owner && !e.isMaster) return e.reply(PERMISSION_ERROR) // 判断是否有管理 @@ -245,22 +200,8 @@ export class Basics extends plugin { 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) + let res = await ga.kickMember(e.group_id, qq, e.user_id) + e.reply(res) } // 我要自闭 diff --git a/apps/privateGroupAdmin.js b/apps/privateGroupAdmin.js new file mode 100644 index 0000000..671fb16 --- /dev/null +++ b/apps/privateGroupAdmin.js @@ -0,0 +1,63 @@ + import plugin from '../../../lib/plugins/plugin.js' +import { GroupAdmin as ga, common } from '../model/index.js' + +// 正则 +const Numreg = '[一壹二两三四五六七八九十百千万亿\\d]+' +const TimeUnitReg = Object.keys(common.Time_unit).join('|') +const muteMemberReg = new RegExp(`^#禁言\\s?(\\d+)\\s(\\d+)\\s(${Numreg})?(${TimeUnitReg})?$`) +export class PrivateGroupAdmin extends plugin { + constructor () { + super({ + name: '椰奶私聊群管', + event: 'message', + priority: 2000, + rule: [ + { + reg: muteMemberReg, + fnc: 'muteMember' + }, + { + reg: '^#解禁\\s?(\\d+)\\s(\\d+)$', + fnc: 'nomuteMember' + }, + { + reg: '^#全体(禁言|解禁)(\\d+)$', + fnc: 'muteAll' + }, + { + reg: '^#踢\\s?(\\d+)\\s(\\d+)$', + fnc: 'kickMember' + } + ] + }) + } + + async muteMember (e) { + if (!e.isMaster) return false + let regRet = e.msg.match(muteMemberReg) + let res = await ga.muteMember(regRet[1], regRet[2], e.user_id, regRet[3], regRet[4]) + e.reply(res) + } + + async noMuteMember (e) { + if (!e.isMaster) return false + let regRet = e.msg.match(/^#解禁\s?(\d+)\s(\d+)$/) + let res = await ga.muteMember(regRet[1], regRet[2], e.user_id, 0) + e.reply(res) + } + + async muteAll (e) { + if (!e.isMaster) return false + let regRet = e.msg.match(/全体(禁言|解禁)(\d+)/) + let group = Bot.pickGroup(Number(regRet[2])) + group.muteAll(regRet[1] == '禁言') + e.reply(`✅ 已将群「${group.name}(${group.group_id})」${regRet[1] == '禁言' ? '开启' : '解除'}全体禁言`) + } + + async kickMember (e) { + if (!e.isMaster) return false + let regRet = e.msg.match(/#踢\s?(\d+)\s(\d+)$/) + let res = await ga.kickMember(regRet[1], regRet[2], e.user_id) + e.reply(res) + } +} diff --git a/index.js b/index.js index 029bea3..a6aab48 100644 --- a/index.js +++ b/index.js @@ -42,6 +42,11 @@ for (let i in files) { logger.error(ret[i].reason) continue } - apps[name] = ret[i].value[Object.keys(ret[i].value)[0]] + let value = ret[i].value + for (let f in value) { + apps[f] = value[f] + } + // apps[name] = ret[i].value[Object.keys(ret[i].value)[0]] } + export { apps } diff --git a/model/Bika.js b/model/Bika.js index 4e795b0..b349f60 100644 --- a/model/Bika.js +++ b/model/Bika.js @@ -59,7 +59,7 @@ export default new (class { return [ `共找到${total}个关于「${keyword}」${type.alias[0]}的作品`, `当前为第${pg}页,共${pages}页`, - ...await Promise.all(docs.map(async (item) => { + ...await Promise.allSettled(docs.map(async (item) => { let { title, tags, categories, author, description = '未知', likesCount, thumb, _id, finished } = item return [ `id:${_id}\n`, @@ -94,7 +94,7 @@ export default new (class { return [ `id: ${_id}, ${title}`, `共${total}张,当前为第${pg}页,共${pages}页,当前为第${order}话`, - ...await Promise.all(docs.map(async item => await Pixiv.proxyFetchImg((this.imgproxy ?? `${item.media.fileServer}/static/`) + item.media.path))) + ...await Promise.allSettled(docs.map(async item => await Pixiv.proxyFetchImg((this.imgproxy ?? `${item.media.fileServer}/static/`) + item.media.path))) ] } @@ -111,7 +111,7 @@ export default new (class { res = res.data.categories.filter(item => !item.isWeb) await redis.set(key, JSON.stringify(res), { EX: 43200 }) } - return await Promise.all(res.map(async item => { + return await Promise.allSettled(res.map(async item => { let { title, thumb, description = '未知' } = item let { fileServer, path } = thumb fileServer = /static/.test(fileServer) ? fileServer : fileServer + '/static/' diff --git a/model/GroupAdmin.js b/model/GroupAdmin.js index ccf8911..cae5163 100644 --- a/model/GroupAdmin.js +++ b/model/GroupAdmin.js @@ -1,9 +1,13 @@ -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 { +import { Config } from '../components/index.js' +import { common } from './index.js' + +// 无管理文案 +const ROLE_ERROR = '做不到,怎么想我都做不到吧ヽ(≧Д≦)ノ' +export default new class { constructor () { this.MuteTaskKey = 'yenai:MuteTasks' } @@ -310,6 +314,65 @@ class Group_admin { ] }) } -} -export default new Group_admin() + /** + * @description: 禁言某人 + * @param {Number} groupId 群号 + * @param {Number} userId 被禁言人QQ + * @param {Number} executor 执行人QQ + * @param {Number} time 时间倍数 0为解禁 + * @param {String} unit 时间单位 + * @return {String} 回复消息 + */ + async muteMember (groupId, userId, executor, time = 5, unit = '分') { + unit = common.Time_unit[unit.toUpperCase()] ?? (/^\d+$/.test(unit) ? unit : 60) + let group = null + try { group = Bot.pickGroup(Number(groupId), true) } catch (err) { return err.message } + // 判断是否有管理 + if (!group.is_admin && !group.is_owner) return ROLE_ERROR + if (!(/\d{5,}/.test(userId))) return '❎ 请输入正确的QQ号' + // 判断是否为主人 + if (Config.masterQQ?.includes(Number(userId)) && time != 0) return '居然调戏主人!!!哼,坏蛋(ノ`⊿´)ノ' + + let Memberinfo = group.pickMember(Number(userId)).info + // 判断是否有这个人 + if (!Memberinfo) return '❎ 这个群没有这个人哦~' + + // 特殊处理 + if (Memberinfo.role === 'owner') return '调戏群主拖出去枪毙5分钟(。>︿<)_θ' + + let user = group.pickMember(Number(executor)) + let isMaster = Config.masterQQ?.includes(executor) + + if (Memberinfo.role === 'admin') { + if (!group.is_owner) return '人家又不是群主这种事做不到的辣!' + if (!isMaster && !user.member.is_owner) return '这个淫系管理员辣,只有主淫和群主才可以干ta' + } + + await group.muteMember(userId, time * unit) + return time == 0 ? `✅ 已把「${Memberinfo.card || Memberinfo.nickname}」从小黑屋揪了出来(。>∀<。)` : `已把「${Memberinfo.card || Memberinfo.nickname}」扔进了小黑屋( ・_・)ノ⌒●~*` + } + + async kickMember (groupId, userId, executor) { + let group = null + try { group = Bot.pickGroup(Number(groupId), true) } catch (err) { return err.message } + + if (!userId || !(/^\d+$/.test(userId))) return '❎ 请输入正确的QQ号' + if (!groupId || !(/^\d+$/.test(groupId))) return '❎ 请输入正确的群号' + // 判断是否为主人 + if (Config.masterQQ?.includes(Number(userId))) return '居然调戏主人!!!哼,坏蛋(ノ`⊿´)ノ' + + let Memberinfo = group?.pickMember(Number(userId)).info + // 判断是否有这个人 + if (!Memberinfo) return '❎ 这个群没有这个人哦~' + if (Memberinfo.role === 'owner') return '调戏群主拖出去枪毙5分钟(。>︿<)_θ' + let isMaster = Config.masterQQ?.includes(executor) + let user = group.pickMember(Number(executor)) + if (Memberinfo.role === 'admin') { + if (!group.is_owner) return '人家又不是群主这种事做不到的辣!' + if (!isMaster && !user.is_owner) return '这个淫系管理员辣,只有主淫和群主才可以干ta' + } + let res = await group.kickMember(Number(userId)) + return res ? '已把这个坏淫踢掉惹!!!' : '额...踢出失败哩,可能这个淫比较腻害>_<' + } +}() diff --git a/model/Pixiv.js b/model/Pixiv.js index 3e9f51e..5611ca4 100644 --- a/model/Pixiv.js +++ b/model/Pixiv.js @@ -147,8 +147,7 @@ export default new class Pixiv { } return { error: linkmsg } } - console.log(this.headers) - let img = await Promise.all(url.map(async item => await this.proxyFetchImg(item, { headers: this.headers }))) + let img = await Promise.allSettled(url.map(async item => await this.proxyFetchImg(item, { headers: this.headers }))) return { msg, img } } @@ -194,7 +193,7 @@ export default new class Pixiv { if (res.error) return { error: res.error.message } if (lodash.isEmpty(res.illusts)) return { error: '暂无数据,请等待榜单更新哦(。-ω-)zzz' } - let illusts = await Promise.all(res.illusts.map(async (item, index) => { + let illusts = await Promise.allSettled(res.illusts.map(async (item, index) => { let list = this.format(item) let { id, title, user, tags, total_bookmarks, image_urls } = list return [ @@ -405,7 +404,7 @@ export default new class Pixiv { if (user.error) return { error: user.error.message } if (lodash.isEmpty(user.user_previews)) return { error: '呜呜呜,人家没有找到这个淫d(ŐдŐ๑)' } - let msg = await Promise.all(user.user_previews.slice(0, 10).map(async (item, index) => { + let msg = await Promise.allSettled(user.user_previews.slice(0, 10).map(async (item, index) => { let { id, name, profile_image_urls } = item.user profile_image_urls = profile_image_urls.medium.replace('i.pximg.net', this.proxy) let ret = [ @@ -518,7 +517,7 @@ export default new class Pixiv { agent, headers }).then(res => res.arrayBuffer()) - .catch((err) => logger.warn(`图片加载失败,${err.message}`)) + .catch((err) => logger.warn(`图片加载失败 reason: ${err.message}`)) if (!buffer) return segment.image('/plugins/yenai-plugin/resources/img/imgerror.png') let buff = Buffer.from(buffer) logger.debug(`Success: imgSize => ${(buff.length / 1024).toFixed(2) + 'kb'}`) diff --git a/model/setu.js b/model/setu.js index afcd83a..411f09d 100644 --- a/model/setu.js +++ b/model/setu.js @@ -54,7 +54,7 @@ export default new class setu { return { error: '没有找到相关的tag' } } // 消息 - let msg = await Promise.all(result.data.map(async item => { + let msg = await Promise.allSettled(result.data.map(async item => { let { pid, title, tags, author, r18, urls, url } = item return [ `${this.sendMsgs}\n`,