⚗️ 新增匿名发送消息,新增对方正在输入事件通知
This commit is contained in:
@@ -1,3 +1,9 @@
|
||||
# 1.1.6
|
||||
|
||||
* 新增**匿名**发送消息
|
||||
* 优化部分代码
|
||||
* 新增`对方正在输入`事件通知
|
||||
|
||||
# 1.1.5
|
||||
|
||||
* 新增`#椰奶涩涩帮助`ⁿᵉʷ
|
||||
|
||||
14
apps/bika.js
14
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) })
|
||||
}
|
||||
|
||||
|
||||
10
apps/fun.js
10
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))
|
||||
}
|
||||
|
||||
|
||||
@@ -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} `
|
||||
}
|
||||
@@ -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)
|
||||
}
|
||||
}
|
||||
@@ -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)
|
||||
}
|
||||
}
|
||||
@@ -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))
|
||||
}
|
||||
|
||||
|
||||
@@ -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))
|
||||
}
|
||||
|
||||
|
||||
@@ -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 : '无',
|
||||
|
||||
@@ -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 #匿名
|
||||
|
||||
@@ -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<Anonymous, "flag">} data.anony 匿名消息
|
||||
* @return {Promise<MessageRet>} 消息是否发送成功的对象
|
||||
*/
|
||||
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(/___+/, '<title color="#777777" size="26">涩批(//// ^ ////)</title>')
|
||||
}
|
||||
}
|
||||
// 发送消息
|
||||
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<Anonymous, "flag">} data.anony 匿名消息
|
||||
* @return {Promise<MessageRet>}
|
||||
*/
|
||||
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<Anonymous, "flag">} data.anony 匿名消息
|
||||
* @return {Promise<MessageRet>}
|
||||
*/
|
||||
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
|
||||
})
|
||||
}
|
||||
|
||||
@@ -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 = {
|
||||
|
||||
@@ -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`,
|
||||
|
||||
@@ -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,
|
||||
|
||||
14
model/listener/events/input.js
Normal file
14
model/listener/events/input.js
Normal file
@@ -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)
|
||||
})
|
||||
@@ -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('监听消息事件')
|
||||
112
model/listener/events/notice_friend.js
Normal file
112
model/listener/events/notice_friend.js
Normal file
@@ -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} `
|
||||
}
|
||||
266
model/listener/events/notice_group.js
Normal file
266
model/listener/events/notice_group.js
Normal file
@@ -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)
|
||||
})
|
||||
83
model/listener/events/request.js
Normal file
83
model/listener/events/request.js
Normal file
@@ -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)
|
||||
})
|
||||
17
model/listener/loader.js
Normal file
17
model/listener/loader.js
Normal file
@@ -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)
|
||||
}
|
||||
}
|
||||
}
|
||||
}()
|
||||
@@ -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)
|
||||
|
||||
@@ -143,6 +143,14 @@
|
||||
</div>
|
||||
<div class="cfg-desc">破解闪照</div>
|
||||
</li>
|
||||
<li class="cfg-li">
|
||||
<div class="cfg-line">
|
||||
私聊输入
|
||||
<span class="cfg-hint">#椰奶设置输入 + 开启/关闭 </span>
|
||||
{{@input}}
|
||||
</div>
|
||||
<div class="cfg-desc">对方正在输入事件</div>
|
||||
</li>
|
||||
<li class="cfg-li">
|
||||
<div class="cfg-line">
|
||||
Bot被禁言
|
||||
|
||||
@@ -124,6 +124,14 @@
|
||||
</div>
|
||||
<div class="cfg-desc">可选值:低质量,中等质量,高质量,原图</div>
|
||||
</li>
|
||||
<li class="cfg-li">
|
||||
<div class="cfg-line">
|
||||
匿名
|
||||
<span class="cfg-hint">#椰奶设置匿名 + 开启/关闭</span>
|
||||
<div class="cfg-status">{{@anonymous}}</div>
|
||||
</div>
|
||||
<div class="cfg-desc">群聊使用匿名发送</div>
|
||||
</li>
|
||||
</ul>
|
||||
</div>
|
||||
{{/block}}
|
||||
Reference in New Issue
Block a user