458 lines
14 KiB
JavaScript
458 lines
14 KiB
JavaScript
import _ from "lodash"
|
||
import { Config } from "../../components/index.js"
|
||
import { Time_unit } from "../../constants/other.js"
|
||
import { GroupAdmin as Ga, GroupBannedWords, common } from "../../model/index.js"
|
||
import { cronValidate, translateChinaNum } from "../../tools/index.js"
|
||
|
||
/** 正则 */
|
||
const Numreg = "[零一壹二两三四五六七八九十百千万亿\\d]+"
|
||
const TimeUnitReg = Object.keys(Time_unit).join("|")
|
||
|
||
/** 清理多久没发言的人正则 */
|
||
const noactivereg = new RegExp(`^#(查看|清理|确认清理|获取)(${Numreg})个?(${TimeUnitReg})没发言的人(第(${Numreg})页)?$`)
|
||
/** 我要自闭正则 */
|
||
const Autisticreg = new RegExp(`^#?我要(自闭|禅定)(${Numreg})?个?(${TimeUnitReg})?$`, "i")
|
||
Ga.loadRedisMuteTask()
|
||
export class GroupAdmin extends plugin {
|
||
constructor() {
|
||
super({
|
||
name: "椰奶群管-基础",
|
||
event: "message.group",
|
||
priority: 500,
|
||
rule: [
|
||
{
|
||
reg: `^#禁言\\s?((\\d+)\\s)?(${Numreg})?(${TimeUnitReg})?$`,
|
||
fnc: "muteMember"
|
||
},
|
||
{
|
||
reg: "^#解禁(\\d+)?$",
|
||
fnc: "noMuteMember"
|
||
},
|
||
{
|
||
reg: "^#全(体|员)(禁言|解禁)$",
|
||
fnc: "muteAll"
|
||
},
|
||
{
|
||
reg: "^#踢(\\d+)?$",
|
||
fnc: "kickMember"
|
||
},
|
||
{
|
||
reg: "^#(设置|取消)管理(\\d+)?$",
|
||
fnc: "SetAdmin"
|
||
},
|
||
{
|
||
reg: "^#(修改|设置)头衔",
|
||
fnc: "adminsetTitle"
|
||
},
|
||
{
|
||
reg: "^#(申请|我要)头衔",
|
||
fnc: "SetGroupSpecialTitle"
|
||
},
|
||
{
|
||
reg: "^#(获取|查看)?禁言列表$",
|
||
fnc: "Mutelist"
|
||
},
|
||
{
|
||
reg: "^#解除全部禁言$",
|
||
fnc: "relieveAllMute"
|
||
},
|
||
{
|
||
reg: `^#(查看|(确认)?清理)从未发言过?的人(第(${Numreg})页)?$`,
|
||
fnc: "neverspeak"
|
||
},
|
||
{
|
||
reg: `^#(查看|获取)?(不活跃|潜水)排行榜(${Numreg})?$`,
|
||
fnc: "RankingList"
|
||
},
|
||
{
|
||
reg: `^#(查看|获取)?最近的?入群(情况|记录)(${Numreg})?$`,
|
||
fnc: "RankingList"
|
||
},
|
||
{
|
||
reg: noactivereg, // 清理多久没发言的人
|
||
fnc: "noactive"
|
||
},
|
||
{
|
||
reg: "^#发通知",
|
||
fnc: "Send_notice"
|
||
},
|
||
{
|
||
reg: "^#(设置)?定时(禁言|解禁)(.*)$|^#定时禁言任务$|^#取消定时(禁言|解禁)$",
|
||
fnc: "timeMute"
|
||
},
|
||
{
|
||
reg: "^#(查看|获取)?群?发言(榜单|排行)((7|七)天)?",
|
||
fnc: "SpeakRank"
|
||
},
|
||
{
|
||
reg: "^#?(开启|关闭)加群通知$",
|
||
fnc: "handleGroupAdd"
|
||
},
|
||
{
|
||
reg: "^#?(加|设|移)精$",
|
||
fnc: "essenceMessage"
|
||
},
|
||
{
|
||
reg: Autisticreg, // 我要自闭
|
||
fnc: "Autistic"
|
||
}
|
||
]
|
||
})
|
||
}
|
||
|
||
get Bot() {
|
||
return this.e.bot ?? Bot
|
||
}
|
||
|
||
/**
|
||
* 禁言
|
||
* @param e
|
||
*/
|
||
async muteMember(e) {
|
||
if (!common.checkPermission(e, "admin", "admin")) { return true }
|
||
let qq = e.message.find(item => item.type == "at")?.qq
|
||
let reg = `#禁言\\s?((\\d+)\\s${qq ? "" : "?"})?(${Numreg})?(${TimeUnitReg})?`
|
||
let regRet = e.msg.match(new RegExp(reg))
|
||
const time = translateChinaNum(regRet[3])
|
||
new Ga(e).muteMember(
|
||
e.group_id, qq ?? regRet[2], e.user_id, time, regRet[4]
|
||
).then(res => e.reply(res))
|
||
.catch(err => common.handleException(e, err))
|
||
}
|
||
|
||
/**
|
||
* 解禁
|
||
* @param e
|
||
*/
|
||
async noMuteMember(e) {
|
||
if (!common.checkPermission(e, "admin", "admin")) { return true }
|
||
let qq = e.message.find(item => item.type == "at")?.qq
|
||
let regRet = e.msg.match(/#解禁(\d+)/)
|
||
new Ga(e).muteMember(
|
||
e.group_id, qq ?? regRet[1], e.user_id, 0
|
||
).then(res => e.reply(res))
|
||
.catch(err => common.handleException(e, err))
|
||
}
|
||
|
||
/**
|
||
* 全体禁言
|
||
* @param e
|
||
*/
|
||
async muteAll(e) {
|
||
if (!common.checkPermission(e, "admin", "admin")) { return true }
|
||
let type = /全(体|员)禁言/.test(e.msg)
|
||
let res = await e.group.muteAll(type)
|
||
if (!res) return e.reply("❎ 未知错误", true)
|
||
e.reply(`✅ 已${type ? "开启" : "关闭"}全体禁言`)
|
||
}
|
||
|
||
/**
|
||
* 踢群员
|
||
* @param e
|
||
*/
|
||
async kickMember(e) {
|
||
if (!common.checkPermission(e, "admin", "admin")) { return true }
|
||
let qq = e.message.find(item => item.type == "at")?.qq
|
||
if (!qq) qq = e.msg.replace(/#|踢/g, "").trim()
|
||
new Ga(e).kickMember(e.group_id, qq, e.user_id)
|
||
.then(res => e.reply(res))
|
||
.catch(err => common.handleException(e, err))
|
||
}
|
||
|
||
/**
|
||
* 设置管理
|
||
* @param e
|
||
*/
|
||
async SetAdmin(e) {
|
||
if (!common.checkPermission(e, "master", "owner")) return
|
||
let qq = e.message.find(item => item.type == "at")?.qq
|
||
const type = /设置管理/.test(e.msg)
|
||
if (!qq) qq = e.msg.replace(/#|(设置|取消)管理/g, "").trim()
|
||
if (!qq || !(/\d{5,}/.test(qq))) return e.reply("❎ 请输入正确的QQ号")
|
||
let Member;
|
||
try {
|
||
Member = e.group.pickMember(Number(qq) || qq, true)
|
||
} catch {
|
||
return e.reply("❎ 这个群没有这个人哦~")
|
||
}
|
||
const Memberinfo = Member?.info || await Member?.getInfo?.()
|
||
const res = await e.group.setAdmin(qq, type)
|
||
const name = Memberinfo.card || Memberinfo.nickname || (Number(qq) || qq)
|
||
if (!res) return e.reply("❎ 未知错误")
|
||
type ? e.reply(`✅ 已经把「${name}」设置为管理啦!!`) : e.reply(`✅ 已取消「${name}」的管理`)
|
||
}
|
||
|
||
/**
|
||
* 设置头衔
|
||
* @param e
|
||
*/
|
||
async adminsetTitle(e) {
|
||
if (!common.checkPermission(e, "master", "owner")) return
|
||
let qq = e.message.find(item => item.type == "at")?.qq
|
||
if (!qq) return e.reply("请艾特要修改的人哦~")
|
||
let text = e.msg.replace(/#?(修改|设置)头衔/g, "")
|
||
let res = await e.group.setTitle(qq, text)
|
||
if (res) {
|
||
let Member = e.group.pickMember(Number(qq) || qq)
|
||
let name = Member.card || Member.nickname
|
||
e.reply(`✅ 已经将「${name}」的头衔设置为「${text}」`)
|
||
} else {
|
||
e.reply("❎ 未知错误")
|
||
}
|
||
}
|
||
|
||
/**
|
||
* 申请头衔
|
||
* @param e
|
||
*/
|
||
async SetGroupSpecialTitle(e) {
|
||
if (!common.checkPermission(e, "all", "owner")) return
|
||
let Title = e.msg.replace(/#(申请|我要)头衔/g, "")
|
||
// 屏蔽词处理
|
||
let TitleFilterModeChange = GroupBannedWords.getTitleFilterModeChange(e.group_id)
|
||
let TitleBannedWords = GroupBannedWords.getTitleBannedWords(e.group_id)
|
||
TitleBannedWords = _.compact(TitleBannedWords)
|
||
if (!e.isMaster && !_.isEmpty(TitleBannedWords)) {
|
||
if (TitleFilterModeChange) {
|
||
let reg = new RegExp(TitleBannedWords.join("|"))
|
||
if (reg.test(Title)) return e.reply("❎ 包含违禁词", true)
|
||
} else {
|
||
if (TitleBannedWords.includes(Title)) return e.reply("❎ 包含违禁词", true)
|
||
}
|
||
}
|
||
let res = await e.group.setTitle(e.user_id, Title)
|
||
if (!res) return e.reply("❎ 未知错误", true)
|
||
|
||
if (!Title) return e.reply("❎ 什么\"(º Д º*)!没有头衔,哼把你的头衔吃掉!!!", true)
|
||
|
||
e.reply(`✅ 已将你的头衔更换为「${Title}」`, true)
|
||
}
|
||
|
||
/**
|
||
* 获取禁言列表
|
||
* @param e
|
||
*/
|
||
async Mutelist(e) {
|
||
new Ga(e).getMuteList(e.group_id, true)
|
||
.then(res => common.getforwardMsg(e, res, {
|
||
isxml: true,
|
||
xmlTitle: "禁言列表"
|
||
}))
|
||
.catch(err => common.handleException(e, err))
|
||
}
|
||
|
||
/**
|
||
* 解除全部禁言
|
||
* @param e
|
||
*/
|
||
async relieveAllMute(e) {
|
||
if (!common.checkPermission(e, "admin", "admin")) { return true }
|
||
new Ga(e).releaseAllMute()
|
||
.then(() => e.reply("✅ 已将全部禁言解除"))
|
||
.catch(err => common.handleException(e, err))
|
||
}
|
||
|
||
/**
|
||
* 查看和清理多久没发言的人
|
||
* @param e
|
||
*/
|
||
async noactive(e) {
|
||
if (!common.checkPermission(e, "admin", "admin")) { return true }
|
||
|
||
let regRet = noactivereg.exec(e.msg)
|
||
regRet[2] = translateChinaNum(regRet[2] || 1)
|
||
// 确认清理直接执行
|
||
if (regRet[1] == "确认清理") {
|
||
try {
|
||
return common.getforwardMsg(e,
|
||
await new Ga(e).clearNoactive(
|
||
e.group_id,
|
||
regRet[2],
|
||
regRet[3]
|
||
)
|
||
)
|
||
} catch (error) {
|
||
return common.handleException(e, error)
|
||
}
|
||
}
|
||
// 查看和清理都会发送列表
|
||
let page = translateChinaNum(regRet[5] || 1)
|
||
let msg = null
|
||
try {
|
||
msg = await new Ga(e).getNoactiveInfo(
|
||
e.group_id, regRet[2], regRet[3], page
|
||
)
|
||
} catch (err) {
|
||
return common.handleException(e, err)
|
||
}
|
||
// 清理
|
||
if (regRet[1] == "清理") {
|
||
let list = await new Ga(e).noactiveList(e.group_id, regRet[2], regRet[3])
|
||
e.reply([
|
||
`⚠ 本次共需清理「${list.length}」人,防止误触发\n`,
|
||
`请发送:#确认清理${regRet[2]}${regRet[3]}没发言的人`
|
||
])
|
||
}
|
||
common.getforwardMsg(e, msg, {
|
||
isxml: true,
|
||
xmlTitle: e.msg.replace(/#|查看|清理/g, "")
|
||
})
|
||
}
|
||
|
||
/**
|
||
* 查看和清理从未发言的人
|
||
* @param e
|
||
*/
|
||
async neverspeak(e) {
|
||
if (!common.checkPermission(e, "admin", "admin")) { return true }
|
||
let list = null
|
||
try {
|
||
list = await new Ga(e).getNeverSpeak(e.group_id)
|
||
} catch (error) {
|
||
return common.handleException(e, error)
|
||
}
|
||
|
||
// 确认清理直接执行
|
||
if (/^#?确认清理/.test(e.msg)) {
|
||
e.reply("⚠ 开始清理,这可能需要一点时间")
|
||
let arr = list.map(item => item.user_id)
|
||
let msg = await new Ga(e).BatchKickMember(e.group_id, arr)
|
||
return common.getforwardMsg(e, msg)
|
||
}
|
||
// 清理
|
||
if (/^#?清理/.test(e.msg)) {
|
||
e.reply([
|
||
`⚠ 本次共需清理「${list.length}」人,防止误触发\n`,
|
||
"请发送:#确认清理从未发言的人"
|
||
])
|
||
}
|
||
// 发送列表
|
||
let page = e.msg.match(new RegExp(Numreg))
|
||
page = page ? translateChinaNum(page[0]) : 1
|
||
new Ga(e).getNeverSpeakInfo(e.group_id, page)
|
||
.then(res => common.getforwardMsg(e, res, {
|
||
isxml: true,
|
||
xmlTitle: e.msg.replace(/#|查看|清理/g, "")
|
||
}))
|
||
.catch(err => common.handleException(e, err))
|
||
}
|
||
|
||
/**
|
||
* 查看不活跃排行榜和入群记录
|
||
* @param e
|
||
*/
|
||
async RankingList(e) {
|
||
let num = e.msg.match(new RegExp(Numreg))
|
||
num = num ? translateChinaNum(num[0]) : 10
|
||
let msg = ""
|
||
if (/(不活跃|潜水)/.test(e.msg)) {
|
||
msg = await new Ga(e).InactiveRanking(e.group_id, num)
|
||
} else {
|
||
msg = await new Ga(e).getRecentlyJoined(e.group_id, num)
|
||
}
|
||
common.getforwardMsg(e, msg, { isxml: true })
|
||
}
|
||
|
||
/**
|
||
* 发送通知
|
||
* @param e
|
||
*/
|
||
async Send_notice(e) {
|
||
if (!common.checkPermission(e, "admin", "admin")) return
|
||
|
||
e.message[0].text = e.message[0].text.replace("#发通知", "").trim()
|
||
if (!e.message[0].text) e.message.shift()
|
||
if (_.isEmpty(e.message)) return e.reply("❎ 通知不能为空")
|
||
e.message.unshift(segment.at("all"))
|
||
e.reply(e.message)
|
||
}
|
||
|
||
/**
|
||
* 设置定时群禁言
|
||
* @param e
|
||
*/
|
||
async timeMute(e) {
|
||
if (!common.checkPermission(e, "admin", "admin")) return
|
||
let type = /禁言/.test(e.msg)
|
||
if (/任务/.test(e.msg)) {
|
||
let task = new Ga(e).getMuteTask()
|
||
if (!task.length) return e.reply("目前还没有定时禁言任务")
|
||
return common.getforwardMsg(e, task)
|
||
}
|
||
if (/取消/.test(e.msg)) {
|
||
new Ga(e).delMuteTask(e.group_id, type)
|
||
return e.reply(`已取消本群定时${type ? "禁言" : "解禁"}`)
|
||
}
|
||
|
||
let RegRet = e.msg.match(/定时(禁言|解禁)((\d{1,2})(:|:)(\d{1,2})|.*)/)
|
||
if (!RegRet || !RegRet[2]) return e.reply(`格式不对\n示范:#定时${type ? "禁言" : "解禁"}00:00 或 #定时${type ? "禁言" : "解禁"} + cron表达式`)
|
||
let cron = ""
|
||
if (RegRet[3] && RegRet[5]) {
|
||
cron = `0 ${RegRet[5]} ${RegRet[3]} * * ?`
|
||
} else {
|
||
cron = RegRet[2]
|
||
// 校验cron表达式
|
||
let Validate = cronValidate(cron.trim())
|
||
if (Validate !== true) return e.reply(Validate)
|
||
}
|
||
|
||
let res = await new Ga(e).setMuteTask(e.group_id, cron, type, e.self_id ?? Bot.uin)
|
||
|
||
res
|
||
? e.reply("✅设置定时禁言成功,可发【#定时禁言任务】查看")
|
||
: e.reply(`❎ 该群定时${type ? "禁言" : "解禁"}已存在不可重复设置`)
|
||
}
|
||
|
||
/**
|
||
* 开启或关闭加群通知
|
||
* @param e
|
||
*/
|
||
async handleGroupAdd(e) {
|
||
if (!common.checkPermission(e, "admin", "admin")) return
|
||
let type = /开启/.test(e.msg) ? "add" : "del"
|
||
let isopen = Config.groupAdd.openGroup.includes(e.group_id)
|
||
if (isopen && type == "add") return e.reply("❎ 本群加群申请通知已处于开启状态")
|
||
if (!isopen && type == "del") return e.reply("❎ 本群暂未开启加群申请通知")
|
||
Config.modifyarr("groupAdd", "openGroup", e.group_id, type)
|
||
e.reply(`✅ 已${type == "add" ? "开启" : "关闭"}「${e.group_id}」的加群申请通知`)
|
||
}
|
||
|
||
/**
|
||
* 加精
|
||
* @param e
|
||
*/
|
||
async essenceMessage(e) {
|
||
if (!common.checkPermission(e, "admin", "admin")) return
|
||
const source = await common.takeSourceMsg(e)
|
||
if (!source) return e.reply("请对要加精的消息进行引用")
|
||
let isAdd = e.msg.match(/加|设|移/)?.[0]
|
||
let res
|
||
if (isAdd == "加" || isAdd == "设") {
|
||
res = await this.Bot.setEssenceMessage(source.message_id)
|
||
} else {
|
||
res = await this.Bot.removeEssenceMessage(source.message_id)
|
||
}
|
||
e.reply(res || `${isAdd}精失败`)
|
||
}
|
||
|
||
/**
|
||
* 我要自闭
|
||
* @param e
|
||
*/
|
||
async Autistic(e) {
|
||
// 判断是否有管理
|
||
if (!e.group.is_admin && !e.group.is_owner) return
|
||
if (e.isMaster) return e.reply("别自闭啦~~", true)
|
||
if (e.member.is_admin && !e.group.is_owner) return e.reply("别自闭啦~~", true)
|
||
// 解析正则
|
||
let regRet = Autisticreg.exec(e.msg)
|
||
// 获取数字
|
||
let TabooTime = translateChinaNum(regRet[2] || 5)
|
||
|
||
let Company = Time_unit[_.toUpper(regRet[3]) || "分"]
|
||
|
||
await e.group.muteMember(e.user_id, TabooTime * Company)
|
||
e.reply("那我就不手下留情了~", true)
|
||
}
|
||
}
|