autowhitelist/index.ts
2025-03-01 00:10:05 +02:00

176 lines
4.7 KiB
TypeScript

import { Client, Events, GatewayIntentBits, Message, TextChannel } from "discord.js";
import { Rcon } from "rconts";
import config from "./config.json" assert { type: "json" };
const rcon = new Rcon({
host: config.rcon.host,
port: config.rcon.port,
password: config.rcon.password
});
let ignoreDeletion: Set<string> = new Set();
const client = new Client({
intents: [
GatewayIntentBits.Guilds,
GatewayIntentBits.GuildMessages,
GatewayIntentBits.MessageContent,
],
});
rcon.on("connected", () => {
console.log("RCON connected.");
});
async function whitelist(message: Message, username: string) {
const response = await rcon.exec("whitelist add " + username);
let deleteThisMessage;
if (response == "That player does not exist") {
try {
ignoreDeletion.add(message.id);
await message.delete();
} catch {
}
deleteThisMessage = await message.channel.send(
`<@${message.author.id}>, you have not been whitelisted. Please join the server at least once, and then resend your IGN.`
);
} else if (response.includes("Incorrect argument for")) {
try {
ignoreDeletion.add(message.id);
await message.delete();
} catch {
}
deleteThisMessage = await message.channel.send(
`<@${message.author.id}>, your message was invalid. Include ONLY your username, nothing else.`
);
}
if(deleteThisMessage) {
setTimeout(async () => {
await deleteThisMessage.delete();
}, 5000);
}
console.log("[whitelist] response for", username, "is", response);
}
client.once(Events.ClientReady, async (readyClient) => {
console.log(`Ready! Logged in as ${readyClient.user.tag}`);
let playerUsernames: Map<Message, string[]> = new Map();
const channel = (await client.channels.fetch(config.channel)) as TextChannel;
const messages = await channel.messages.fetch();
for await (const f of messages) {
playerUsernames.set(f[1], f[1].content.split("\n"));
if (!f[1].reactions.resolve("✅")) await f[1].react("✅");
let member = f[1].member;
try {
if (!member) member = await f[1].guild.members.fetch(f[1].author.id);
} catch {
continue;
}
if (config.changeNicknames) {
if (member.nickname !== f[1].content.split("\n")[0]) {
try {
await member.setNickname(f[1].content.split("\n")[0], "whitelisted");
} catch { }
}
}
}
for await (let u of playerUsernames) {
for await(let name of u[1]) {
await whitelist(u[0], name);
}
}
console.log("Mass-whitelisted.");
});
client.on(Events.MessageCreate, async (message) => {
if (
message.channelId == config.channel &&
message.author!.id != client.user!.id
) {
const channel = (await client.channels.fetch(
config.channel
)) as TextChannel;
const messages = await channel.messages.fetch();
if (messages.filter((z) => z.author.id == message.author.id).size > 1) {
await message.delete();
const deleteThisMessage = await channel.send(
`<@${message.author.id}>, you can only have one message in this channel.`
);
setTimeout(async () => {
await deleteThisMessage.delete();
}, 5000);
return;
}
const playerUsernames = message.content.split("\n");
let member = message.member;
if (!member) member = await message.guild!.members.fetch(message.author.id);
if (config.changeNicknames) {
try {
await member.setNickname(playerUsernames[0]);
} catch { }
}
for await (let name of playerUsernames) {
await whitelist(message, name)
}
try {
await message.react("✅");
} catch {
}
}
});
client.on(Events.MessageDelete, async (message) => {
if (ignoreDeletion.has(message.id)) {
ignoreDeletion.delete(message.id);
return;
}
if (
message.channelId == config.channel &&
message.author!.id != client.user!.id
) {
if (message.reactions.resolve("✅")) {
const deleteThisMessage = await message.channel.send(
`<@${message.author?.id}>, you are no longer whitelisted.`
);
const member = await message.guild!.members.fetch(message.author!.id);
if (config.changeNicknames) {
try {
await member.setNickname(null, "unwhitelisted");
} catch { }
}
setTimeout(async () => {
await deleteThisMessage.delete();
}, 5000);
const playerUsernames = message.content?.split("\n") || [];
for await (let name of playerUsernames) {
const response = await rcon.exec("whitelist remove " + name);
console.log("[delete-whitelist] response for", name, "is", response);
}
}
}
});
client.login(config.token);
rcon.connect();