diff --git a/CHANGELOG.md b/CHANGELOG.md index 3cfbaf6..90918d5 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,9 @@ +# 1.1.6 + +* 新增**匿名**发送消息 +* 优化部分代码 +* 新增`对方正在输入`事件通知 + # 1.1.5 * 新增`#椰奶涩涩帮助`ⁿᵉʷ diff --git a/apps/bika.js b/apps/bika.js index f7968c4..9514011 100644 --- a/apps/bika.js +++ b/apps/bika.js @@ -65,7 +65,7 @@ export class NewBika extends plugin { let regRet = e.msg.match(searchReg) let page = common.translateChinaNum(regRet[5]) await Bika.search(regRet[3], page, regRet[2]) - .then(res => common.getRecallsendMsg(e, res)) + .then(res => common.recallSendForwardMsg(e, res)) .catch(err => { e.reply(err.message) }) } @@ -77,7 +77,7 @@ export class NewBika extends plugin { let page = common.translateChinaNum(regRet[4]) let order = common.translateChinaNum(regRet[6]) await Bika.comicPage(regRet[2], page, order) - .then(res => common.getRecallsendMsg(e, res)) + .then(res => common.recallSendForwardMsg(e, res)) .catch(err => { e.reply(err.message) }) } @@ -86,7 +86,7 @@ export class NewBika extends plugin { if (!await this._Authentication(e)) return let number = e.msg.match(/\d+/) - 1 await Bika.viewComicPage(number) - .then(res => common.getRecallsendMsg(e, res)) + .then(res => common.recallSendForwardMsg(e, res)) .catch(err => { e.reply(err.message) }) } @@ -94,7 +94,7 @@ export class NewBika extends plugin { async nextComicPage (e) { if (!await this._Authentication(e)) return await Bika.next() - .then(res => common.getRecallsendMsg(e, res)) + .then(res => common.recallSendForwardMsg(e, res)) .catch(err => e.reply(err.message)) } @@ -102,7 +102,7 @@ export class NewBika extends plugin { async nextChapter (e) { if (!await this._Authentication(e)) return await Bika.next('chapter') - .then(res => common.getRecallsendMsg(e, res)) + .then(res => common.recallSendForwardMsg(e, res)) .catch(err => e.reply(err.message)) } @@ -111,7 +111,7 @@ export class NewBika extends plugin { if (!await this._Authentication(e)) return e.reply(Pixiv.startMsg) await Bika.categories() - .then(res => common.getRecallsendMsg(e, res)) + .then(res => common.recallSendForwardMsg(e, res)) .catch(err => { e.reply(err.message) }) } @@ -121,7 +121,7 @@ export class NewBika extends plugin { e.reply(Pixiv.startMsg) let id = e.msg.match(new RegExp(`#?${Prefix}(详情|细节)(.*)`))[3] await Bika.comicDetail(id) - .then(res => common.getRecallsendMsg(e, res, { oneMsg: true })) + .then(res => common.recallSendForwardMsg(e, res, { oneMsg: true })) .catch(err => { e.reply(err.message) }) } diff --git a/apps/fun.js b/apps/fun.js index ee0a0c8..ddb24ba 100644 --- a/apps/fun.js +++ b/apps/fun.js @@ -238,7 +238,7 @@ export class Fun extends plugin { item++ } } - common.getRecallsendMsg(e, msg) + common.recallSendForwardMsg(e, msg) return true } @@ -250,7 +250,7 @@ export class Fun extends plugin { let keywords = e.msg.replace(/#|acg/g, '').trim() await funApi.pandadiu(keywords) - .then(res => common.getRecallsendMsg(e, res)) + .then(res => common.recallSendForwardMsg(e, res)) .catch(err => e.reply(err.message)) } @@ -262,7 +262,7 @@ export class Fun extends plugin { // 获取类型 const { type, page } = heisiType[e.msg.match(/#?来点(.*)/)[1]] await funApi.heisiwu(type, page) - .then(res => common.getRecallsendMsg(e, _.take(res, 20))) + .then(res => common.recallSendForwardMsg(e, _.take(res, 20))) .catch(err => e.reply(err.message)) } @@ -273,7 +273,7 @@ export class Fun extends plugin { e.reply(START_EXECUTION) let regRet = e.msg.match(/#?来点神秘图(s)?(.*)/) await funApi.mengdui(regRet[2], regRet[1]) - .then(res => common.getRecallsendMsg(e, res)) + .then(res => common.recallSendForwardMsg(e, res)) .catch(err => e.reply(err.message)) } @@ -282,7 +282,7 @@ export class Fun extends plugin { // 开始执行 e.reply(START_EXECUTION) await funApi.xiuren(e.msg.replace(/#?来点/, '')) - .then(res => common.getRecallsendMsg(e, res)) + .then(res => common.recallSendForwardMsg(e, res)) .catch(err => e.reply(err.message)) } diff --git a/apps/notice_friend.js b/apps/notice_friend.js deleted file mode 100644 index 878a7e6..0000000 --- a/apps/notice_friend.js +++ /dev/null @@ -1,123 +0,0 @@ -import plugin from '../../../lib/plugins/plugin.js' -import { common } from '../model/index.js' -import { Config } from '../components/index.js' - -/** 好友通知 */ -export class NoticeFriends extends plugin { - 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', - `好友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', - `好友QQ:${e.user_id}\n`, - `好友昵称:${e.nickname}` - ] - break - } - case 'recall': { - if (!Config.Notice.PrivateRecall) 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 - const msgType = { - flash: { - msg: () => false, - type: ['[闪照]\n', '撤回闪照:', segment.image(res[0].url)] - }, - record: { - msg: () => segment.record(res[0].url), - type: '[语音]' - }, - video: { - msg: () => segment.video(res[0].file), - type: '[视频]' - }, - xml: { - msg: () => res, - type: '[合并消息]' - } - } - if (msgType[res[0].type]) { - forwardMsg = msgType[res[0].type].msg() - res = msgType[res[0].type].type - } - // 消息 - 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', - `来源QQ:${e.user_id}` - ] - 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} ` -} diff --git a/apps/notice_group.js b/apps/notice_group.js deleted file mode 100644 index 3ccf78a..0000000 --- a/apps/notice_group.js +++ /dev/null @@ -1,278 +0,0 @@ -import plugin from '../../../lib/plugins/plugin.js' -import { common } from '../model/index.js' -import { Config } from '../components/index.js' -import moment from 'moment' - -/** 群通知 */ -export class NoticeGroup extends plugin { - 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 - - 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', - `操作人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 - - logger.mark('[椰奶]机器人被踢') - - msg = [ - segment.image( - `https://p.qlogo.cn/gh/${e.group_id}/${e.group_id}/100` - ), - '[通知 - 机器人被踢]\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 - - logger.mark('[椰奶]机器人退群') - - msg = [ - segment.image( - `https://p.qlogo.cn/gh/${e.group_id}/${e.group_id}/100` - ), - '[通知 - 机器人退群]\n', - `退出群号:${e.group_id}` - ] - } else if (e.operator_id === e.user_id) { - 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', - `退群人QQ:${e.user_id}\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 - - logger.mark('[椰奶]群员被踢') - - msg = [ - segment.image( - `https://p.qlogo.cn/gh/${e.group_id}/${e.group_id}/100` - ), - '[通知 - 群员被踢]\n', - `操作人QQ:${e.operator_id}\n`, - `被踢人QQ:${e.user_id}\n`, - `被踢人昵称:${e.member.nickname}\n`, - `被踢人群名片:${e.member.card}\n`, - `被踢群号:${e.group_id}` - ] - } - 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( - `https://p.qlogo.cn/gh/${e.group_id}/${e.group_id}/100` - ), - e.set - ? '[通知 - 机器人被设置管理]:\n' - : '[通知 - 机器人被取消管理]:\n', - `被操作群号:${e.group_id}` - ] - } else { - e.set ? logger.mark('[椰奶]新增群管理员') : logger.mark('[椰奶]取消群管理员') - - msg = [ - segment.image( - `https://p.qlogo.cn/gh/${e.group_id}/${e.group_id}/100` - ), - e.set ? '[通知 - 新增群管理员]:\n' : '[通知 - 取消群管理员]:\n', - `被操作QQ:${e.user_id}\n`, - `被操作群号:${e.group_id}` - ] - } - break - } - // 禁言 (这里仅处理机器人被禁言) - case 'ban': { - const forbiddenTime = common.getsecondformat(e.duration) - - if (!Config.getGroup(e.group_id).botBeenBanned) return false - - if (e.user_id != Bot.uin) return false - - if (e.duration == 0) { - logger.mark('[椰奶]机器人被解除禁言') - msg = [ - segment.image( - `https://p.qlogo.cn/gh/${e.group_id}/${e.group_id}/100` - ), - '[通知 - 机器人被解除禁言]\n', - `处理人QQ:${e.operator_id}\n`, - `处理群号:${e.group_id}` - ] - } else if (e.user_id === Bot.uin) { - logger.mark('[椰奶]机器人被禁言') - - msg = [ - segment.image( - `https://p.qlogo.cn/gh/${e.group_id}/${e.group_id}/100` - ), - '[通知 - 机器人被禁言]\n', - `禁言人QQ:${e.operator_id}\n`, - `禁言群号:${e.group_id}\n`, - `禁言时长:${forbiddenTime}` - ] - } - break - } - // 群转让 - case 'transfer': { - 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}\n`, - `旧群主:${e.operator_id}\n`, - `新群主:${e.user_id}` - ] - 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 = '' - let msgType = { - flash: { - msg: () => e.group.makeForwardMsg([ - { - message: segment.image(res[0].url), - nickname: e.group.pickMember(e.user_id).card, - user_id: e.user_id - } - ]), - type: '[闪照]' - }, - record: { - msg: () => segment.record(res[0].url), - type: '[语音]' - }, - video: { - msg: () => segment.video(res[0].file), - type: '[视频]' - }, - xml: { - msg: () => res, - type: '[合并消息]' - } - } - if (msgType[res[0].type]) { - forwardMsg = await msgType[res[0].type].msg() - special = msgType[res[0].type].type - } 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`, - `撤回群名:${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')}`, - special ? `\n特殊消息:${special}` : '' - ] - break - } - default: - return false - } - await common.sendMasterMsg(msg) - if (forwardMsg) await common.sendMasterMsg(forwardMsg) - } -} diff --git a/apps/notice_request.js b/apps/notice_request.js deleted file mode 100644 index 5945a8d..0000000 --- a/apps/notice_request.js +++ /dev/null @@ -1,95 +0,0 @@ -import plugin from '../../../lib/plugins/plugin.js' -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: '群员' -} - -/** 群邀请 */ -export class NoticeRequest 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', - `目标群号:${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}`), - `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', - `群号:${e.group_id}\n`, - `群名:${e.group_name}\n`, - `QQ:${e.user_id}\n`, - `昵称:${e.nickname}`, - 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', - `申请人QQ:${e.user_id}\n`, - `申请人昵称:${e.nickname}\n`, - `申请来源:${e.source || '未知'}\n`, - `附加信息:${e.comment || '无附加信息'}\n` - ] - if (cfg.other.autoFriend == 1) { - msg.push('已自动同意该好友申请') - } else { - msg.push( - `-------------\n可回复:#同意好友申请${e.user_id} \n或引用该消息回复"同意"或"拒绝"` - ) - } - break - } - await common.sendMasterMsg(msg) - } -} diff --git a/apps/picSearch.js b/apps/picSearch.js index 459d19c..8989ea0 100644 --- a/apps/picSearch.js +++ b/apps/picSearch.js @@ -39,7 +39,7 @@ export class NewPicSearch extends plugin { .then(async res => { res.length == 1 ? common.recallsendMsg(e, res[0], true) - : common.getRecallsendMsg(e, res, { isxmlMsg: false }) + : common.recallSendForwardMsg(e, res, { isxmlMsg: false }) }) .catch(async err => { await e.reply(err.message) @@ -52,7 +52,7 @@ export class NewPicSearch extends plugin { if (!await this.Authentication(e)) return if (!await this.handelImg(e, 'Ascii2D')) return await PicSearch.Ascii2D(e.img[0]) - .then(res => common.getRecallsendMsg(e, [...res.color, ...res.bovw], { isxmlMsg: false })) + .then(res => common.recallSendForwardMsg(e, [...res.color, ...res.bovw], { isxmlMsg: false })) .catch(err => e.reply(err.message)) } diff --git a/apps/pixiv.js b/apps/pixiv.js index ee31850..f2509ae 100644 --- a/apps/pixiv.js +++ b/apps/pixiv.js @@ -14,7 +14,7 @@ const rankingrReg = new RegExp(`^#?看看((\\d{4}-\\d{1,2}-\\d{1,2})的)?(${Obje const tagReg = new RegExp(`^#?tag(pro)?搜图(.*?)(第(${numReg})页)?$`, 'i') const uidReg = new RegExp(`^#?uid搜图(.*?)(第(${numReg})页)?$`, 'i') const searchUser = new RegExp(`^#?user搜索(.*?)(第(${numReg})页)?$`, 'i') -const randomImgReg = new RegExp(`^#?来(${numReg})?张(好(康|看)(的|哒)|hkd|涩图)$|#有内鬼$`) +const randomImgReg = new RegExp(`^#?来(${numReg})?张(好(康|看)(的|哒)|hkd|涩图)$|^#有内鬼$`) export class NewPixiv extends plugin { constructor () { @@ -91,7 +91,7 @@ export class NewPixiv extends plugin { await Pixiv.illust(regRet[1], filter) .then(async res => { await e.reply(res.msg) - res.img.length == 1 ? common.recallsendMsg(e, res.img) : common.getRecallsendMsg(e, res.img, false) + res.img.length == 1 ? common.recallsendMsg(e, res.img) : common.recallSendForwardMsg(e, res.img, false) }) .catch(err => e.reply(err.message)) } @@ -108,7 +108,7 @@ export class NewPixiv extends plugin { let page = common.translateChinaNum(regRet[6]) await Pixiv.Rank(page, regRet[2], regRet[3], regRet[4]) - .then(res => common.getRecallsendMsg(e, res)) + .then(res => common.recallSendForwardMsg(e, res)) .catch(err => e.reply(err.message)) } @@ -122,7 +122,7 @@ export class NewPixiv extends plugin { let page = common.translateChinaNum(regRet[4]) await Pixiv[`${regRet[1] ? 's' : 'vilipixS'}earchTags`](regRet[2], page, !setu.getR18(e.group_id)) - .then(res => common.getRecallsendMsg(e, res)) + .then(res => common.recallSendForwardMsg(e, res)) .catch(err => e.reply(err.message)) } @@ -131,7 +131,7 @@ export class NewPixiv extends plugin { if (!await this._Authentication(e, 'sese')) return e.reply(Pixiv.startMsg) await Pixiv.PopularTags() - .then(res => common.getRecallsendMsg(e, res)) + .then(res => common.recallSendForwardMsg(e, res)) .catch(err => e.reply(err.message)) } @@ -145,7 +145,7 @@ export class NewPixiv extends plugin { let page = common.translateChinaNum(regRet[3]) await Pixiv.userIllust(regRet[1], page, !setu.getR18(e.group_id)) - .then(res => common.getRecallsendMsg(e, res)) + .then(res => common.recallSendForwardMsg(e, res)) .catch(err => e.reply(err.message)) } @@ -162,7 +162,7 @@ export class NewPixiv extends plugin { } num = common.translateChinaNum(num) await Pixiv.vilipixRandomImg(num) - .then(res => common.getRecallsendMsg(e, res)) + .then(res => common.recallSendForwardMsg(e, res)) .catch(err => e.reply(err.message)) } @@ -174,7 +174,7 @@ export class NewPixiv extends plugin { let regRet = e.msg.match(/\d+/) await Pixiv.relatedIllust(regRet[0], !setu.getR18(e.group_id)) - .then(res => common.getRecallsendMsg(e, res)) + .then(res => common.recallSendForwardMsg(e, res)) .catch(err => e.reply(err.message)) } @@ -185,7 +185,7 @@ export class NewPixiv extends plugin { if (ispro && !await this._Authentication(e, 'sesepro')) return await Pixiv.pximg(ispro) - .then(res => ispro ? common.getRecallsendMsg(e, [res]) : common.recallsendMsg(e, res)) + .then(res => ispro ? common.recallSendForwardMsg(e, [res]) : common.recallsendMsg(e, res, false, { anony: true })) .catch(err => e.reply(err.message)) } @@ -197,7 +197,7 @@ export class NewPixiv extends plugin { let regRet = e.msg.match(searchUser) let page = common.translateChinaNum(regRet[3]) await Pixiv.searchUser(regRet[1], page, !setu.getR18(e.group_id)) - .then(res => common.getRecallsendMsg(e, res)) + .then(res => common.recallSendForwardMsg(e, res)) .catch(err => e.reply(err.message)) } @@ -210,7 +210,7 @@ export class NewPixiv extends plugin { console.log(res) res.length == 1 ? common.recallsendMsg(e, res[0], true) - : common.getRecallsendMsg(e, res) + : common.recallSendForwardMsg(e, res) }).catch(err => e.reply(err.message)) } diff --git a/apps/setting.js b/apps/setting.js index 4f3336d..caffd3f 100644 --- a/apps/setting.js +++ b/apps/setting.js @@ -22,12 +22,14 @@ const cfgType = { // 其他通知 闪照: 'flashPhoto', 禁言: 'botBeenBanned', + 输入: 'input', 全部通知: 'notificationsAll', 删除缓存: 'deltime', 涩涩: 'sese', 状态: 'state', 涩涩pro: 'sesepro', + 匿名: 'anonymous', 陌生人点赞: 'Strangers_love', // 给有问题的用户关闭定时器 状态任务: 'statusTask', @@ -99,8 +101,8 @@ export class Setting extends plugin { } else { Config.modify('whole', cfgType[index], yes) } - - if (index == '涩涩' || index == '涩涩pro' || index == '代理') { + let specialSese = ['涩涩', '涩涩pro', '代理', '匿名'] + if (specialSese.includes(index)) { return this.SeSe_Settings(e) } // 处理 @@ -145,7 +147,8 @@ export class Setting extends plugin { 'groupNumberChange', 'groupMemberNumberChange', 'flashPhoto', - 'botBeenBanned' + 'botBeenBanned', + 'input' ] for (let i in cfgType) { @@ -181,10 +184,11 @@ export class Setting extends plugin { // 查看涩涩设置 async SeSe_Settings (e) { let set = setu.getSeSeConfig(e) - let { proxy, pixiv, bika, Notice: { sese, sesepro } } = Config + let { proxy, pixiv, bika, Notice: { sese, sesepro, anonymous } } = Config let data = { sese: getStatus(sese), sesepro: getStatus(sesepro), + anonymous: getStatus(anonymous), r18: getStatus(set.r18), cd: Number(set.cd), recall: set.recall ? set.recall : '无', diff --git a/config/default_config/whole.yaml b/config/default_config/whole.yaml index ea36e6f..935d4f0 100644 --- a/config/default_config/whole.yaml +++ b/config/default_config/whole.yaml @@ -12,9 +12,11 @@ privateMessage: false #好友消息 PrivateRecall: false #好友撤回 friendRequest: false #好友申请 friendNumberChange: false #好友列表变动 -#其他设置 +#其他通知 flashPhoto: false #闪照 botBeenBanned: false #禁言 +input: false #对方正在输入 +#其他设置 notificationsAll: false #全部通知 Strangers_love: false #陌生人点赞 sese: false #涩涩 @@ -23,3 +25,4 @@ deltime: 600 #删除缓存 sesepro: false #涩涩增强 statusTask: true #状态网速定时器 renderScale: 100 #渲染精度 +anonymous: false #匿名 diff --git a/lib/common/common.js b/lib/common/common.js index 161ff52..20a353f 100644 --- a/lib/common/common.js +++ b/lib/common/common.js @@ -104,7 +104,8 @@ export default new class newCommon { * @param {Boolean} data.isxml 是否处理卡片 * @param {Boolean} data.isxmlMsg 是否处理卡片显示消息 * @param {Boolean} data.oneMsg 是否只有一条消息 - * @return {Object} 消息是否发送成功的对象 + * @param {Boolean | Omit} data.anony 匿名消息 + * @return {Promise} 消息是否发送成功的对象 */ async getforwardMsg (e, message, { recallMsg = 0, @@ -112,7 +113,8 @@ export default new class newCommon { fkmsg = '', isxml = false, isxmlMsg = true, - oneMsg = false + oneMsg = false, + anony } = {}) { let forwardMsg = [] if (_.isEmpty(message)) throw Error('[椰奶sendforwardMsg][Error]发送的转发消息不能为空') @@ -139,26 +141,96 @@ export default new class newCommon { .replace(/___+/, '涩批(//// ^ ////)') } } - // 发送消息 - let res = await e.reply(forwardMsg, false, { recallMsg }) - if (!res) await e.reply(fkmsg || '消息发送失败,可能被风控') - return res + let msgRes = await this.reply(e, forwardMsg, false, { + anony, + fkmsg, + recallMsg + }) + return msgRes } /** - * @description: 发送普通消息并根据指定时间撤回群消息 + * @description: 发送消息 * @param {*} e oicq * @param {Array|String} msg 消息 * @param {Boolean} quote 是否引用回复 - * @param {Number} time 撤回时间 - * @param {Boolean} fkmsg 风控消息 - * @return {*} + * @param {Object} data 其他参数 + * @param {Number} data.recallMsg 撤回时间 + * @param {Boolean} data.fkmsg 风控消息 + * @param {Boolean | Omit} data.anony 匿名消息 + * @return {Promise} */ - async recallsendMsg (e, msg, quote, time = setu.getRecallTime(e.group_id), fkmsg = '') { + async reply (e, msg, quote, { + recallMsg = 0, + fkmsg = '', + at = false, + anony + } = {}) { + let msgRes = null // 发送消息 - let res = await e.reply(msg, quote, { recallMsg: time }) - if (!res) await e.reply(fkmsg || '消息发送失败,可能被风控') - return res + if (e.isGroup) { + // 判断是否开启匿名 + if (anony) { + let getAnonyInfo = await e.group.getAnonyInfo() + if (!getAnonyInfo.enable) { + e.reply('[警告]该群未开启匿名,请启用匿名再使用匿名功能') + anony = false + } + } + msgRes = await e.group.sendMsg(msg, quote, anony) + } else { + msgRes = await e.reply(msg, quote) + if (!msgRes) await e.reply(fkmsg || '消息发送失败,可能被风控') + } + if (at && e.isGroup) { + let text = '' + if (e?.sender?.card) { + text = _.truncate(e.sender.card, { length: 10 }) + } + if (at === true) { + at = Number(e.user_id) + } else if (!isNaN(at)) { + let info = e.group.pickMember(at).info + text = info?.card ?? info?.nickname + text = _.truncate(text, { length: 10 }) + } + + if (Array.isArray(msg)) { + msg = [segment.at(at, text), ...msg] + } else { + msg = [segment.at(at, text), msg] + } + } + if (recallMsg > 0 && msgRes?.message_id) { + if (e.isGroup) { + setTimeout(() => e.group.recallMsg(msgRes.message_id), recallMsg * 1000) + } else if (e.friend) { + setTimeout(() => e.friend.recallMsg(msgRes.message_id), recallMsg * 1000) + } + } + return msgRes + } + + /** + * @description: 获取配置的撤回事件和匿名发送普通消息 + * @param {*} e oicq + * @param {Array|String} msg 消息 + * @param {Boolean} quote 是否引用回复 + * @param {Object} data 其他参数 + * @param {Number} data.recallMsg 撤回时间 + * @param {Boolean} data.fkmsg 风控消息 + * @param {Boolean | Omit} data.anony 匿名消息 + * @return {Promise} + */ + async recallsendMsg (e, msg, quote, data = {}) { + let recallMsg = setu.getRecallTime(e.group_id) + let anony = Config.Notice.anonymous + let msgRes = this.reply(e, msg, quote, { + recallMsg, + anony, + ...data + }) + return msgRes } /** @@ -169,12 +241,14 @@ export default new class newCommon { * @param {Object} data 其他参数 * @return {Object} 消息是否发送成功的对象 */ - async getRecallsendMsg (e, msg, data = {}) { + async recallSendForwardMsg (e, msg, data = {}) { let recalltime = setu.getRecallTime(e.group_id) + let anony = Config.Notice.anonymous return await this.getforwardMsg(e, msg, { recallMsg: recalltime, isBot: false, isxml: true, + anony, ...data }) } diff --git a/lib/puppeteer/puppeteer.js b/lib/puppeteer/puppeteer.js index e9bf05e..2c7a8a6 100644 --- a/lib/puppeteer/puppeteer.js +++ b/lib/puppeteer/puppeteer.js @@ -1,12 +1,8 @@ import fs from 'fs' import _ from 'lodash' -import puppeteer from 'puppeteer' import pet from '../../../../lib/puppeteer/puppeteer.js' import { Data, Version, Plugin_Name, Config } from '../../components/index.js' -let devices = puppeteer.devices -if (!devices) { - devices = (await import('puppeteer')).KnownDevices -} +const puppeteer = await import('puppeteer') const _path = process.cwd() export default new (class newPuppeteer { constructor () { @@ -24,7 +20,7 @@ export default new (class newPuppeteer { isLandscape: false } }, - ...devices + ...puppeteer.devices } this.browser = false this.config = { diff --git a/model/Pixiv.js b/model/Pixiv.js index 8d169d6..85a5980 100644 --- a/model/Pixiv.js +++ b/model/Pixiv.js @@ -474,7 +474,7 @@ export default new class Pixiv { } let res = await request.get(url).then(res => res.json()) let { pid, uid, title, author, tags, urls, r18 } = res.data[0] || res.data - urls = urls.original.replace(/i.der.ink|i.pixiv.re/, this.proxy) + urls = urls.original.replace(/i.piccache.top|i.pixiv.re/, this.proxy) let msg = [ `Pid: ${pid}\n`, `Uid: ${uid}\n`, diff --git a/model/index.js b/model/index.js index f241b3d..6e49a8c 100644 --- a/model/index.js +++ b/model/index.js @@ -11,6 +11,10 @@ import setu from './setu.js' import Ascii2D from './PicSearch/ascii2d.js' import SauceNAO from './PicSearch/saucenao.js' import WhatAnime from './PicSearch/whatanime.js' +import listener from './listener/loader.js' +// 加载监听事件 +listener.load() +// 导出模块 export const PicSearch = { Ascii2D, SauceNAO, diff --git a/model/listener/events/input.js b/model/listener/events/input.js new file mode 100644 index 0000000..9aada67 --- /dev/null +++ b/model/listener/events/input.js @@ -0,0 +1,14 @@ +import { common } from '../../index.js' +import { Config } from '../../../components/index.js' + +Bot.on('internal.input', async (e) => { + if (!Config.Notice.input) return false + // 判断是否主人消息 + if (Config.masterQQ.includes(e.user_id)) return false + let msg = [ + segment.image(`https://q1.qlogo.cn/g?b=qq&s=100&nk=${e.user_id}`), + `[事件 - 对方${e.end ? '输入完毕' : '正在输入'}]\n`, + `好友QQ:${e.user_id}` + ] + await common.sendMasterMsg(msg) +}) diff --git a/apps/notice_message.js b/model/listener/events/message.js similarity index 94% rename from apps/notice_message.js rename to model/listener/events/message.js index fdd71a4..e6b1b6f 100644 --- a/apps/notice_message.js +++ b/model/listener/events/message.js @@ -1,16 +1,5 @@ -import plugin from '../../../lib/plugins/plugin.js' -import { common } from '../model/index.js' -import { Config } from '../components/index.js' - -export class NoticeMessage extends plugin { - constructor () { - super({ - name: '椰奶消息通知', - event: 'message', - priority: 2000 - }) - } -} +import { common } from '../../../model/index.js' +import { Config } from '../../../components/index.js' Bot.on('message', async (e) => { // 判断是否为机器人消息 @@ -198,3 +187,4 @@ function getMsgType (msg) { } return msgType[msg[0].type] } +logger.debug('监听消息事件') diff --git a/model/listener/events/notice_friend.js b/model/listener/events/notice_friend.js new file mode 100644 index 0000000..706fa27 --- /dev/null +++ b/model/listener/events/notice_friend.js @@ -0,0 +1,112 @@ +import { common } from '../../../model/index.js' +import { Config } from '../../../components/index.js' + +Bot.on('notice.friend', async (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', + `好友QQ:${e.user_id}\n`, + `好友昵称:${e.nickname}` + ] + break + } + case 'recall': { + if (!Config.Notice.PrivateRecall) 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 + const msgType = { + flash: { + msg: () => false, + type: ['[闪照]\n', '撤回闪照:', segment.image(res[0].url)] + }, + record: { + msg: () => segment.record(res[0].url), + type: '[语音]' + }, + video: { + msg: () => segment.video(res[0].file), + type: '[视频]' + }, + xml: { + msg: () => res, + type: '[合并消息]' + } + } + if (msgType[res[0].type]) { + forwardMsg = msgType[res[0].type].msg() + res = msgType[res[0].type].type + } + // 消息 + 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', + `来源QQ:${e.user_id}` + ] + 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} ` +} diff --git a/model/listener/events/notice_group.js b/model/listener/events/notice_group.js new file mode 100644 index 0000000..5299734 --- /dev/null +++ b/model/listener/events/notice_group.js @@ -0,0 +1,266 @@ +import { common } from '../../../model/index.js' +import { Config } from '../../../components/index.js' +import moment from 'moment' + +Bot.on('notice.group', async (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('[椰奶]新增群聊') + + 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', + `操作人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 + + logger.mark('[椰奶]机器人被踢') + + msg = [ + segment.image( + `https://p.qlogo.cn/gh/${e.group_id}/${e.group_id}/100` + ), + '[通知 - 机器人被踢]\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 + + logger.mark('[椰奶]机器人退群') + + msg = [ + segment.image( + `https://p.qlogo.cn/gh/${e.group_id}/${e.group_id}/100` + ), + '[通知 - 机器人退群]\n', + `退出群号:${e.group_id}` + ] + } else if (e.operator_id === e.user_id) { + 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', + `退群人QQ:${e.user_id}\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 + + logger.mark('[椰奶]群员被踢') + + msg = [ + segment.image( + `https://p.qlogo.cn/gh/${e.group_id}/${e.group_id}/100` + ), + '[通知 - 群员被踢]\n', + `操作人QQ:${e.operator_id}\n`, + `被踢人QQ:${e.user_id}\n`, + `被踢人昵称:${e.member.nickname}\n`, + `被踢人群名片:${e.member.card}\n`, + `被踢群号:${e.group_id}` + ] + } + 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( + `https://p.qlogo.cn/gh/${e.group_id}/${e.group_id}/100` + ), + e.set + ? '[通知 - 机器人被设置管理]:\n' + : '[通知 - 机器人被取消管理]:\n', + `被操作群号:${e.group_id}` + ] + } else { + e.set ? logger.mark('[椰奶]新增群管理员') : logger.mark('[椰奶]取消群管理员') + + msg = [ + segment.image( + `https://p.qlogo.cn/gh/${e.group_id}/${e.group_id}/100` + ), + e.set ? '[通知 - 新增群管理员]:\n' : '[通知 - 取消群管理员]:\n', + `被操作QQ:${e.user_id}\n`, + `被操作群号:${e.group_id}` + ] + } + break + } + // 禁言 (这里仅处理机器人被禁言) + case 'ban': { + const forbiddenTime = common.getsecondformat(e.duration) + + if (!Config.getGroup(e.group_id).botBeenBanned) return false + + if (e.user_id != Bot.uin) return false + + if (e.duration == 0) { + logger.mark('[椰奶]机器人被解除禁言') + msg = [ + segment.image( + `https://p.qlogo.cn/gh/${e.group_id}/${e.group_id}/100` + ), + '[通知 - 机器人被解除禁言]\n', + `处理人QQ:${e.operator_id}\n`, + `处理群号:${e.group_id}` + ] + } else if (e.user_id === Bot.uin) { + logger.mark('[椰奶]机器人被禁言') + + msg = [ + segment.image( + `https://p.qlogo.cn/gh/${e.group_id}/${e.group_id}/100` + ), + '[通知 - 机器人被禁言]\n', + `禁言人QQ:${e.operator_id}\n`, + `禁言群号:${e.group_id}\n`, + `禁言时长:${forbiddenTime}` + ] + } + break + } + // 群转让 + case 'transfer': { + 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}\n`, + `旧群主:${e.operator_id}\n`, + `新群主:${e.user_id}` + ] + 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 = '' + let msgType = { + flash: { + msg: () => e.group.makeForwardMsg([ + { + message: segment.image(res[0].url), + nickname: e.group.pickMember(e.user_id).card, + user_id: e.user_id + } + ]), + type: '[闪照]' + }, + record: { + msg: () => segment.record(res[0].url), + type: '[语音]' + }, + video: { + msg: () => segment.video(res[0].file), + type: '[视频]' + }, + xml: { + msg: () => res, + type: '[合并消息]' + } + } + if (msgType[res[0].type]) { + forwardMsg = await msgType[res[0].type].msg() + special = msgType[res[0].type].type + } 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`, + `撤回群名:${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')}`, + special ? `\n特殊消息:${special}` : '' + ] + break + } + default: + return false + } + await common.sendMasterMsg(msg) + if (forwardMsg) await common.sendMasterMsg(forwardMsg) +}) diff --git a/model/listener/events/request.js b/model/listener/events/request.js new file mode 100644 index 0000000..a307112 --- /dev/null +++ b/model/listener/events/request.js @@ -0,0 +1,83 @@ +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: '群员' +} + +Bot.on('request', async (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}`), + `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', + `群号:${e.group_id}\n`, + `群名:${e.group_name}\n`, + `QQ:${e.user_id}\n`, + `昵称:${e.nickname}`, + 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', + `申请人QQ:${e.user_id}\n`, + `申请人昵称:${e.nickname}\n`, + `申请来源:${e.source || '未知'}\n`, + `附加信息:${e.comment || '无附加信息'}\n` + ] + if (cfg.other.autoFriend == 1) { + msg.push('已自动同意该好友申请') + } else { + msg.push( + `-------------\n可回复:#同意好友申请${e.user_id} \n或引用该消息回复"同意"或"拒绝"` + ) + } + break + } + await common.sendMasterMsg(msg) +}) diff --git a/model/listener/loader.js b/model/listener/loader.js new file mode 100644 index 0000000..d0589f0 --- /dev/null +++ b/model/listener/loader.js @@ -0,0 +1,17 @@ +import fs from 'fs' +export default new class { + async load () { + // 加载监听事件 + let eventsPath = './plugins/yenai-plugin/model/listener/events' + + const events = fs.readdirSync(eventsPath).filter(file => file.endsWith('.js')) + for (let File of events) { + try { + await import(`./events/${File}`) + } catch (e) { + logger.mark(`监听事件错误:${File}`) + logger.error(e) + } + } + } +}() diff --git a/model/setu.js b/model/setu.js index 122cc12..d237b9a 100644 --- a/model/setu.js +++ b/model/setu.js @@ -78,7 +78,7 @@ export default new class setu { */ async sendMsgOrSetCd (e, msg) { // 发送消息 - let res = await common.getRecallsendMsg(e, msg, false) + let res = await common.recallSendForwardMsg(e, msg, false) if (!res) return false // 设置CD if (!e.isMaster) this.setCdTime(e.user_id, e.group_id) diff --git a/resources/admin/index.html b/resources/admin/index.html index 7c1ff7c..884dbd3 100644 --- a/resources/admin/index.html +++ b/resources/admin/index.html @@ -143,6 +143,14 @@
破解闪照
+
  • +
    + 私聊输入 + #椰奶设置输入 + 开启/关闭 + {{@input}} +
    +
    对方正在输入事件
    +
  • Bot被禁言 diff --git a/resources/admin/sese.html b/resources/admin/sese.html index dc87051..116837f 100644 --- a/resources/admin/sese.html +++ b/resources/admin/sese.html @@ -124,6 +124,14 @@
    可选值:低质量,中等质量,高质量,原图
  • +
  • +
    + 匿名 + #椰奶设置匿名 + 开启/关闭 +
    {{@anonymous}}
    +
    +
    群聊使用匿名发送
    +
  • {{/block}} \ No newline at end of file