goat
command
spamban
No description
0
views
0
likes
0
installs
Aliases: unspam, spamlist
raw source
const moment = require("moment-timezone");
module.exports = {
config: {
name: "spamban",
aliases: ["unspam", "spamlist"],
version: "2.0",
author: "NeoKEX",
countDown: 5,
role: 2,
description: {
vi: "Quản lý danh sách các nhóm bị spam ban tự động",
en: "Manage auto spam-banned threads (unban only)"
},
category: "owner",
guide: {
vi: " {pn} list: Xem danh sách nhóm bị spam ban"
+ "\n {pn} unban <threadID>: Bỏ spam ban nhóm"
+ "\n {pn} info: Xem cấu hình spam detection",
en: " {pn} list: View list of spam-banned threads"
+ "\n {pn} unban <threadID>: Unban a spam-banned thread"
+ "\n {pn} info: View spam detection config"
}
},
langs: {
vi: {
noData: "≡ | Không có nhóm nào bị spam ban",
listBanned: "≡ | Danh sách spam ban (trang %1/%2):\n\n%3",
unbanned: "✅ | Đã bỏ spam ban cho nhóm %1",
notBanned: "⚠ | Nhóm này không bị spam ban",
invalidThreadID: "⚠ | Vui lòng nhập threadID hợp lệ",
info: "📊 | Spam Detection Config:\n• Threshold: %1 commands in %2 seconds\n• Ban duration: %3 hours\n• Total banned threads: %4"
},
en: {
noData: "≡ | No spam-banned threads",
listBanned: "≡ | Spam banned threads (page %1/%2):\n\n%3",
unbanned: "✅ | Unbanned thread %1 from spam ban",
notBanned: "⚠ | This thread is not spam-banned",
invalidThreadID: "⚠ | Please enter a valid threadID",
info: "📊 | Spam Detection Config:\n• Threshold: %1 commands in %2 seconds\n• Ban duration: %3 hours\n• Total banned threads: %4"
}
},
onStart: async function ({ message, args, threadsData, globalData, getLang }) {
const spamConfig = global.GoatBot.config.spamProtection || {
commandThreshold: 8,
timeWindow: 10,
banDuration: 24
};
const spamBannedThreads = await globalData.get("spamBannedThreads", "data", {});
const now = Date.now();
let hasExpired = false;
for (const threadID in spamBannedThreads) {
if (spamBannedThreads[threadID].expireTime <= now) {
delete spamBannedThreads[threadID];
hasExpired = true;
}
}
if (hasExpired) {
await globalData.set("spamBannedThreads", spamBannedThreads, "data");
}
switch (args[0]) {
case "list":
case "-l": {
const threadIDs = Object.keys(spamBannedThreads);
if (threadIDs.length === 0) {
return message.reply(getLang("noData"));
}
const limit = 10;
const page = parseInt(args[1]) || 1;
const start = (page - 1) * limit;
const end = page * limit;
const data = threadIDs.slice(start, end);
let msg = "";
for (let i = 0; i < data.length; i++) {
const threadID = data[i];
const banInfo = spamBannedThreads[threadID];
const expireTime = moment(banInfo.expireTime)
.tz(global.GoatBot.config.timeZone || "Asia/Ho_Chi_Minh")
.format("HH:mm:ss DD/MM/YYYY");
const threadName = banInfo.threadName || "Unknown";
msg += `${start + i + 1}. ${threadName}\n ID: ${threadID}\n Expires: ${expireTime}\n\n`;
}
return message.reply(getLang("listBanned", page, Math.ceil(threadIDs.length / limit), msg));
}
case "unban":
case "-u": {
const threadID = args[1];
if (!threadID || isNaN(threadID)) {
return message.reply(getLang("invalidThreadID"));
}
if (!spamBannedThreads[threadID]) {
return message.reply(getLang("notBanned"));
}
const threadName = spamBannedThreads[threadID].threadName || threadID;
delete spamBannedThreads[threadID];
await globalData.set("spamBannedThreads", spamBannedThreads, "data");
return message.reply(getLang("unbanned", threadName));
}
case "info":
case "-i": {
const threadCount = Object.keys(spamBannedThreads).length;
return message.reply(getLang("info",
spamConfig.commandThreshold,
spamConfig.timeWindow,
spamConfig.banDuration,
threadCount
));
}
default: {
return message.reply(
"📋 | Spam Ban Management\n\n" +
"Usage:\n" +
"• list - View banned threads\n" +
"• unban <threadID> - Unban a thread\n" +
"• info - View spam detection config\n\n" +
"Note: Threads are auto-banned when users spam commands too quickly."
);
}
}
}
};