Files
yenai-plugin/apps/groupAdmin/groupAdmin.js
🌌 5ec37ed248 🐛
2024-04-16 18:51:31 +08:00

422 lines
14 KiB
JavaScript
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
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")
// 获取定时任务
const redisTask = await Ga.getRedisMuteTask() || false
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"
}
]
})
this.task = redisTask
}
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 ? "开启" : "关闭"}全体禁言`)
}
// 踢群员
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))
}
// 设置管理
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号")
const Member = e.group.pickMember(qq)
const Memberinfo = Member?.info || await Member?.getInfo?.()
if (!Memberinfo) return e.reply("❎ 这个群没有这个人哦~")
const res = await e.group.setAdmin(qq, type)
const name = Memberinfo.card || Memberinfo.nickname
if (!res) return e.reply("❎ 未知错误")
type ? e.reply(`✅ 已经把「${name}」设置为管理啦!!`) : e.reply(`✅ 已取消「${name}」的管理`)
}
// 修改头衔
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))
let name = Member.card || Member.nickname
e.reply(`✅ 已经将「${name}」的头衔设置为「${text}`)
} else {
e.reply("❎ 未知错误")
}
}
// 申请头衔
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)
}
// 获取禁言列表
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))
}
// 解除全部禁言
async relieveAllMute(e) {
if (!common.checkPermission(e, "admin", "admin")) { return true }
new Ga(e).releaseAllMute()
.then(() => e.reply("✅ 已将全部禁言解除"))
.catch(err => common.handleException(e, err))
}
// 查看和清理多久没发言的人
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, "")
})
}
// 查看和清理从未发言的人
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))
}
// 查看不活跃排行榜和入群记录
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 })
}
// 发送通知
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)
}
// 设置定时群禁言
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
if (!e.source) return e.reply("请对要加精的消息进行引用")
let source = (await e.group.getChatHistory(e.source.seq, 1)).pop()
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}精失败`)
}
// 我要自闭
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)
}
}