From dfd213828c5cb568cfbc8e27e2a4c4cffc3d2528 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E7=AD=89=E9=A3=8E=E6=9D=A5?= <3139373986@qq.com> Date: Wed, 5 Jun 2024 01:22:07 +0800 Subject: [PATCH] =?UTF-8?q?=E2=9C=A8=20=E6=8A=95=E7=A5=A8=E8=B8=A2?= =?UTF-8?q?=E4=BA=BA?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit close #119 Signed-off-by: 等风来 <3139373986@qq.com> --- .../{groupVoteBan.js => groupVote.js} | 86 +++++++++++-------- config/default_config/groupAdmin.yaml | 4 +- 2 files changed, 55 insertions(+), 35 deletions(-) rename apps/groupAdmin/{groupVoteBan.js => groupVote.js} (66%) diff --git a/apps/groupAdmin/groupVoteBan.js b/apps/groupAdmin/groupVote.js similarity index 66% rename from apps/groupAdmin/groupVoteBan.js rename to apps/groupAdmin/groupVote.js index 3a0b141..4a76010 100644 --- a/apps/groupAdmin/groupVoteBan.js +++ b/apps/groupAdmin/groupVote.js @@ -9,7 +9,7 @@ import md5 from "md5" let Vote = {} const SettingReg = /^#?投票设置(超时时间|最低票数|禁言时间)?(\d*)$/ -export class GroupVoteBan extends plugin { +export class GroupVote extends plugin { constructor() { super({ name: "椰奶群管-投票禁言", @@ -18,15 +18,15 @@ export class GroupVoteBan extends plugin { priority: 5000, rule: [ { - reg: "^#(发起)?投票禁言", + reg: "^#(发起)?投票(禁言|踢人)", fnc: "Initiate" }, { - reg: "^#(支持|反对)禁言", + reg: "^#(支持|反对)投票", fnc: "Follow" }, { - reg: "^#(启用|禁用)投票禁言$", + reg: "^#(启用|禁用)投票(禁言|踢人)$", fnc: "Switch" }, { @@ -43,15 +43,18 @@ export class GroupVoteBan extends plugin { async Switch() { if (!common.checkPermission(this.e, "master")) return - let type = !!/启用/.test(this.e.msg) + const type = !!/启用/.test(this.e.msg) + const isBan = !!/禁言/.test(this.e.msg) + const name = isBan ? "禁言" : "踢人" + const key = isBan ? "VoteBan" : "VoteKick" - const { VoteBan } = Config.groupAdmin + const open = Config.groupAdmin[key] - if (VoteBan && type) return this.reply("❎ 投票禁言功能已处于启用状态") - if (!VoteBan && !type) return this.reply("❎ 投票禁言功能已处于禁用状态") + if (open && type) return this.reply(`❎ 投票${name}功能已处于启用状态`) + if (!open && !type) return this.reply(`❎ 投票${name}功能已处于禁用状态`) - Config.modify("groupAdmin", "VoteBan", type) - this.reply(`✅ 已${type ? "启用" : "禁用"}投票禁言功能`) + Config.modify("groupAdmin", key, type) + this.reply(`✅ 已${type ? "启用" : "禁用"}投票${name}功能`) } /** @@ -64,7 +67,7 @@ export class GroupVoteBan extends plugin { const text = regRet[1] const value = Number(regRet[2]) - if (!text || !value) return this.reply("投票禁言配置参数:\n\n超时时间: 投票限时,单位:秒\n最低票数: 投票成功的最低票数\n禁言时间: 禁言的时长,单位:秒\n\n例: #投票设置禁言时间8600\n\n更多配置请看:\nconfig/groupAdmin.yaml", true) + if (!text || !value) return this.reply("投票配置参数:\n\n#(启用|禁用)投票(禁言|踢人)\n\n(超时时间: 投票限时,单位:秒\n最低票数: 投票成功的最低票数\n禁言时间: 禁言的时长,单位:秒\n\n例: #投票设置禁言时间8600\n\n更多配置请看:\nconfig/groupAdmin.yaml", true) let type if (text === "超时时间") type = "outTime" @@ -82,11 +85,13 @@ export class GroupVoteBan extends plugin { * @param e */ async Initiate(e) { - const { VoteBan, outTime, minNum, BanTime, voteAdmin } = Config.groupAdmin - - if (!VoteBan) return e.reply("❎ 该功能已被禁用,请发送 #启用投票禁言 来启用该功能。", true) - if (!common.checkPermission(e, "all", "admin")) return + const { VoteBan, VoteKick, outTime, minNum, BanTime, voteAdmin, veto } = Config.groupAdmin + + const isBan = !!/禁言/.test(this.e.msg) + + if (isBan && !VoteBan) return e.reply("❎ 该功能已被禁用,请发送 #启用投票禁言 来启用该功能。", true) + if (!isBan && !VoteKick) return e.reply("❎ 该功能已被禁用,请发送 #启用投票踢人 来启用该功能。", true) let targetQQ = e.at || (e.msg.match(/\d+/)?.[0] || "") targetQQ = Number(targetQQ) || String(targetQQ) @@ -96,7 +101,7 @@ export class GroupVoteBan extends plugin { if (Config.masterQQ?.includes(Number(targetQQ) || String(targetQQ)) || a.includes(md5(String(targetQQ)))) return e.reply("❎ 该命令对主人无效") - if (!targetQQ) return e.reply("❎ 请艾特或输入需要禁言的QQ") + if (!targetQQ) return e.reply("❎ 请艾特或输入被投票人的QQ") if (Vote[key]) return e.reply("❎ 已有相同投票,请勿重复发起") @@ -115,23 +120,25 @@ export class GroupVoteBan extends plugin { Vote[key] = { supportCount: 1, opposeCount: 0, - List: [ e.user_id ] + List: [ e.user_id ], + type: isBan ? "Ban" : "Kick" } let res = await e.reply([ segment.at(targetQQ), - `(${targetQQ})的禁言投票已发起\n`, + `(${targetQQ})的${isBan ? "禁言" : "踢出"}投票已发起\n`, "发起人:", segment.at(e.user_id), `(${e.user_id})\n`, "请支持者发送:\n", - `「#支持禁言${targetQQ}」\n`, + `「#支持投票${targetQQ}」\n`, "不支持者请发送:\n", - `「#反对禁言${targetQQ}」\n`, + `「#反对投票${targetQQ}」\n`, `超时时间:${outTime}秒\n`, - `禁言时间:${BanTime}秒\n`, - `规则:支持票大于反对票且参与人高于${minNum}人即可成功禁言` - ]) + isBan ? `禁言时间:${BanTime}秒\n` : "投票成功将会被移出群聊\n", + `规则:支持票大于反对票且参与人高于${minNum}人即可成功投票\n`, + veto ? "管理员拥有一票权" : "" + ], true) if (!res) return false @@ -142,10 +149,14 @@ export class GroupVoteBan extends plugin { let msg = `投票结束,投票结果:\n支持票数:${supportCount}\n反对票数:${opposeCount}\n` if (supportCount > opposeCount && supportCount >= minNum) { - msg += "支持票数大于反对票\n执行禁言操作" - await e.group.muteMember(targetQQ, BanTime) + msg += "支持票数大于反对票\n投票成功。" + if (isBan) { + await e.group.muteMember(targetQQ, BanTime) + } else { + await e.group.kickMember(targetQQ) + } } else { - msg += `反对票数大于支持票数或支持票数小于${minNum},不进行禁言操作` + msg += `反对票数大于支持票数或支持票数小于${minNum},投票失败。` } delete Vote[key] return e.reply(msg, true) @@ -155,13 +166,14 @@ export class GroupVoteBan extends plugin { const { supportCount, opposeCount } = Vote[key] const msg = [ segment.at(targetQQ), - `(${targetQQ})的禁言投票仅剩一分钟结束\n`, + `(${targetQQ})的${isBan ? "禁言" : "踢出"}投票仅剩一分钟结束\n`, "当前票数:\n", `支持票数:${supportCount}\n反对票数:${opposeCount}\n`, "请支持者发送:\n", - `「#支持禁言${targetQQ}」\n`, + `「#支持投票${targetQQ}」\n`, "不支持者请发送:\n", - `「#反对禁言${targetQQ}」` + `「#反对投票${targetQQ}」`, + `发起人:${e.user_id}` ] await e.reply(msg) @@ -175,6 +187,8 @@ export class GroupVoteBan extends plugin { async Follow(e) { if (!common.checkPermission(e, "all", "admin")) return + const { BanTime } = Config.groupAdmin + let targetQQ = e.at || (e.msg.match(/\d+/)?.[0] || "") targetQQ = Number(targetQQ) || String(targetQQ) let key = e.group_id + targetQQ @@ -187,21 +201,25 @@ export class GroupVoteBan extends plugin { if (!Vote[key]) return e.reply("❎ 未找到对应投票") + const { List, type } = Vote[key] + if (Config.groupAdmin.veto) { if (e.member.is_admin || e.member.is_owner) { if (/支持/.test(e.msg)) { - await e.reply("投票结束,管理员介入,无需投票直接执行禁言", true) - await e.group.muteMember(targetQQ, 3600) + await e.reply("投票结束,管理员介入,执行操作。", true) + if (type === "Ban") { + await e.group.muteMember(targetQQ, BanTime) + } else { + await e.group.kickMember(targetQQ) + } } else { - await e.reply("投票取消,管理员介入", true) + await e.reply("投票取消,管理员介入。", true) } delete Vote[key] return true } } - const { List } = Vote[key] - if (List.includes(e.user_id)) return e.reply("❎ 你已参与过投票,请勿重复参与") if (/支持/.test(e.msg)) { diff --git a/config/default_config/groupAdmin.yaml b/config/default_config/groupAdmin.yaml index 153c860..1297206 100644 --- a/config/default_config/groupAdmin.yaml +++ b/config/default_config/groupAdmin.yaml @@ -5,10 +5,12 @@ noBan: false # 投票禁言开关 VoteBan: true +# 投票踢人开关 +VoteKick: false # 投票禁言超时时间 单位:秒 outTime: 180 # 投票最低所需票数 不建议太低 -minNum: 3 +minNum: 4 # 投票成功禁言时间 单位:秒 BanTime: 3600 # 是否允许管理员一票否决