import { Client, Events, GatewayIntentBits, TextChannel } from "discord.js"; import { Rcon } from "./rcon"; import config from "./config.json" assert { type: "json" }; const rcon = new Rcon(config.rcon.host, config.rcon.port, config.rcon.password); let rconReconnectTimeout: Timer | null | undefined; const client = new Client({ intents: [ GatewayIntentBits.Guilds, GatewayIntentBits.GuildMessages, GatewayIntentBits.MessageContent, ], }); rcon.on("connect", () => { console.log("RCON connected."); }); rcon.on("auth", () => { console.log("RCON authenicated."); }); rcon.on("end", () => { console.log("RCON ended. Reconnecting in 2000ms.") if(rconReconnectTimeout) { clearTimeout(rconReconnectTimeout); } rconReconnectTimeout = setTimeout(() => { rcon.connect() }, 2000) }) client.once(Events.ClientReady, async (readyClient) => { console.log(`Ready! Logged in as ${readyClient.user.tag}`); let playerUsernames: string[] = []; const channel = (await client.channels.fetch(config.channel)) as TextChannel; const messages = await channel.messages.fetch(); for await (const f of messages) { playerUsernames = playerUsernames.concat(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 (let i = 0; i < playerUsernames.length; i++) { setTimeout(() => { rcon.send("whitelist add " + playerUsernames[i]); }, i * 20); } 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 (let i = 0; i < playerUsernames.length; i++) { setTimeout(() => { rcon.send("whitelist add " + playerUsernames[i]); }, i * 20); } await message.react("✅"); } }); client.on(Events.MessageDelete, async (message) => { 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 usernames = message.content?.split("\n") || []; for (let i = 0; i < usernames.length; i++) { setTimeout(() => { rcon.send("whitelist remove " + usernames[i]); }, i * 20); } } } }); client.login(config.token); rcon.connect();