|
|
import { sendSocketList, Config, Version } from '../../components/index.js' |
|
|
import { makeOneBotReportMsg, makeGSUidReportMsg, setGuildLatestMsgId, setMsgMap } from '../../model/index.js' |
|
|
import _ from 'lodash' |
|
|
import cfg from '../../../../lib/config/config.js' |
|
|
|
|
|
|
|
|
Bot.on('message', async e => { |
|
|
if (e.self_id == '88888'){ |
|
|
if (e.group?.bot?.uin) { |
|
|
e.self_id = e.group.bot.uin |
|
|
} else if (e.friend?.bot?.uin) { |
|
|
e.self_id = e.friend.bot.uin |
|
|
} |
|
|
e.bot = Bot[e.self_id] |
|
|
} |
|
|
|
|
|
if (Config.muteStop && (e.group?.mute_left > 0 || e.group?.all_muted)) return false |
|
|
|
|
|
if (sendSocketList.length == 0) return false |
|
|
if (e.group_id) { |
|
|
|
|
|
const whiteGroup = Config.whiteGroup |
|
|
if (Array.isArray(whiteGroup) && whiteGroup.length > 0) { |
|
|
if (!whiteGroup.some(i => i == e.group_id)) return false |
|
|
} |
|
|
|
|
|
const yesGroup = Config.yesGroup |
|
|
if (Array.isArray(yesGroup) && yesGroup.length > 0) { |
|
|
if (!yesGroup.some(i => i == e.group_id)) return false |
|
|
} |
|
|
|
|
|
const blackGroup = Config.blackGroup |
|
|
if (Array.isArray(blackGroup) && blackGroup.length > 0) { |
|
|
if (blackGroup.some(i => i == e.group_id)) return false |
|
|
} |
|
|
|
|
|
const noGroup = Config.noGroup |
|
|
if (Array.isArray(noGroup) && noGroup.length > 0) { |
|
|
if (noGroup.some(i => i == e.group_id)) return false |
|
|
} |
|
|
} |
|
|
|
|
|
if (Array.isArray(Config.noMsgStart) && Config.noMsgStart.length > 0) { |
|
|
if (e.message?.[0]?.type === 'text') { |
|
|
if (Config.noMsgStart.some(i => e.message[0].text.startsWith(i))) return false |
|
|
} |
|
|
} |
|
|
let isMaster = e.isMaster |
|
|
if (Version.isTrss) { |
|
|
if (e.user_id && cfg.master[e.self_id]?.includes(String(e.user_id))) { |
|
|
isMaster = true |
|
|
} |
|
|
} |
|
|
const message_id = Math.floor(Math.random() * Math.pow(2, 32)) | 0 |
|
|
let msg = { |
|
|
time: e.time, |
|
|
message_id: e.message_id, |
|
|
message: _.cloneDeep(e.message), |
|
|
rand: e.rand, |
|
|
seq: e.seq, |
|
|
source: e.source, |
|
|
user_id: e.user_id, |
|
|
self_id: e.self_id, |
|
|
isMaster, |
|
|
sender: e.sender, |
|
|
param: { |
|
|
time: e.time, |
|
|
self_id: e.self_id, |
|
|
post_type: e.post_type, |
|
|
message_type: e.message_type, |
|
|
sub_type: e.sub_type, |
|
|
message_id, |
|
|
user_id: e.user_id, |
|
|
font: 0, |
|
|
sender: e.sender, |
|
|
anonymous: e.anonymous ? { |
|
|
id: e.anonymous.id, |
|
|
name: e.anonymous.name, |
|
|
flag: e.anonymous.flag |
|
|
} : null |
|
|
} |
|
|
} |
|
|
let message = [] |
|
|
|
|
|
if (e.guild_id) { |
|
|
setGuildLatestMsgId(e.message_id) |
|
|
|
|
|
if (e.content) { |
|
|
let content = toMsg(e.content) |
|
|
message.push(...content) |
|
|
} |
|
|
if (e.attachments) { |
|
|
e.attachments.forEach(i => { |
|
|
if (i.content_type.startsWith('image')) { |
|
|
message.push({ |
|
|
type: 'image', |
|
|
file: i.filename, |
|
|
url: i.url |
|
|
}) |
|
|
} |
|
|
}) |
|
|
} |
|
|
msg.message = message |
|
|
|
|
|
msg.isGuild = true |
|
|
msg.param = { |
|
|
time: Math.floor(new Date(msg.timestamp).getTime() / 1000), |
|
|
post_type: 'message', |
|
|
message_type: 'guild', |
|
|
sub_type: 'channel', |
|
|
guild_id: e.guild_id, |
|
|
channel_id: e.channel_id, |
|
|
user_id: e.author.id, |
|
|
message_id: e.message_id, |
|
|
self_id: e.bot.appID, |
|
|
sender: { |
|
|
user_id: e.author.id, |
|
|
nickname: e.author.username, |
|
|
tiny_id: e.author.id, |
|
|
}, |
|
|
self_tiny_id: e.bot.appID, |
|
|
} |
|
|
} else if (e.message_type == 'group') { |
|
|
msg.isGroup = true |
|
|
msg.group_id = e.group_id |
|
|
msg.param.group_id = e.group_id |
|
|
msg.self_id = e.group?.bot?.uin || msg.self_id |
|
|
} else if (e.message_type == 'private') { |
|
|
msg.isPrivate = true |
|
|
msg.self_id = e.friend?.bot?.uin || msg.self_id |
|
|
} else { |
|
|
return false |
|
|
} |
|
|
|
|
|
msg = onlyReplyAt(msg) |
|
|
if (!msg) return false |
|
|
for (const i of sendSocketList) { |
|
|
if (i.status == 1) { |
|
|
let reportMsg = null |
|
|
switch (Number(i.type)) { |
|
|
case 1: |
|
|
case 2: |
|
|
case 6: |
|
|
if (Version.isTrss) { |
|
|
if (i.uin != e.self_id) continue |
|
|
if (!Version.protocol.some(i => i == e.bot?.version?.name)) continue |
|
|
} |
|
|
e.reply = reply(e) |
|
|
reportMsg = await makeOneBotReportMsg(msg) |
|
|
break; |
|
|
case 3: |
|
|
reportMsg = await makeGSUidReportMsg(msg) |
|
|
break |
|
|
default: |
|
|
break; |
|
|
} |
|
|
if (reportMsg) i.ws.send(reportMsg) |
|
|
} |
|
|
} |
|
|
}) |
|
|
|
|
|
function reply(e) { |
|
|
if (!Version.isTrss) { |
|
|
const replyNew = e.reply |
|
|
return async function (massage, quote = false, data = {}) { |
|
|
const ret = await replyNew(massage, quote, data) |
|
|
if (ret) { |
|
|
setMsgMap({ |
|
|
message_id: ret.message_id, |
|
|
time: ret.time, |
|
|
seq: ret.seq, |
|
|
rand: ret.rand, |
|
|
user_id: e.user_id, |
|
|
group_id: e.group_id, |
|
|
onebot_id: Math.floor(Math.random() * Math.pow(2, 32)) | 0, |
|
|
}) |
|
|
} |
|
|
return ret |
|
|
} |
|
|
} else { |
|
|
if (e.bot?.version?.name == 'ICQQ') { |
|
|
return async function (massage, quote = false) { |
|
|
let ret |
|
|
if (e.isGroup) { |
|
|
if (e.group?.sendMsg) { |
|
|
ret = await e.group.sendMsg(massage, quote) |
|
|
} else { |
|
|
ret = await e.bot.pickGroup(e.group_id).sendMsg(massage, quote) |
|
|
} |
|
|
} else { |
|
|
if (e.friend?.sendMsg) { |
|
|
ret = await e.friend.sendMsg(massage, quote) |
|
|
} else { |
|
|
ret = await e.bot.pickFriend(e.user_id).sendMsg(massage, quote) |
|
|
} |
|
|
} |
|
|
if (ret) { |
|
|
setMsgMap({ |
|
|
message_id: ret.message_id, |
|
|
time: ret.time, |
|
|
seq: ret.seq, |
|
|
rand: ret.rand, |
|
|
user_id: e.user_id, |
|
|
group_id: e.group_id, |
|
|
onebot_id: Math.floor(Math.random() * Math.pow(2, 32)) | 0, |
|
|
}) |
|
|
} |
|
|
return ret |
|
|
} |
|
|
} |
|
|
return e.reply |
|
|
} |
|
|
} |
|
|
|
|
|
function onlyReplyAt(e) { |
|
|
if (!e.message) return false |
|
|
|
|
|
let groupCfg = Version.isTrss ? cfg.getGroup(e.self_id, e.group_id) : cfg.getGroup(e.group_id) |
|
|
if (groupCfg.onlyReplyAt != 1 || !groupCfg.botAlias || e.isPrivate) return e |
|
|
|
|
|
let at = atBot(e) |
|
|
if (at) return e |
|
|
e = hasAlias(e, groupCfg) |
|
|
if (e) return e |
|
|
|
|
|
return false |
|
|
} |
|
|
|
|
|
function atBot(e) { |
|
|
for (const i of e.message) { |
|
|
if (i.type === 'at') { |
|
|
if (i.qq == e.self_id) return true |
|
|
} |
|
|
} |
|
|
return false |
|
|
} |
|
|
|
|
|
function hasAlias(e, groupCfg) { |
|
|
if (e.message[0].type === 'text') { |
|
|
let alias = groupCfg.botAlias |
|
|
if (!Array.isArray(alias)) { |
|
|
alias = [alias] |
|
|
} |
|
|
for (let name of alias) { |
|
|
if (e.message[0].text.startsWith(name)) { |
|
|
e.message[0].text = _.trimStart(e.message[0].text, name).trim() |
|
|
return e |
|
|
} |
|
|
} |
|
|
} |
|
|
return false |
|
|
} |
|
|
|
|
|
function toMsg(content) { |
|
|
const regex = /<@!(\d+)>|<emoji:(\d+)>|([^<]+)/g; |
|
|
let match; |
|
|
const result = []; |
|
|
while ((match = regex.exec(content)) !== null) { |
|
|
if (match[1]) { |
|
|
result.push({ |
|
|
type: 'at', |
|
|
qq: match[1] |
|
|
}); |
|
|
} else if (match[2]) { |
|
|
result.push({ |
|
|
type: 'face', |
|
|
id: parseInt(match[2]) |
|
|
}); |
|
|
} else if (match[3]) { |
|
|
result.push({ |
|
|
type: 'text', |
|
|
text: match[3] |
|
|
}); |
|
|
} |
|
|
} |
|
|
return result; |
|
|
} |