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 = 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 = 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();