autowhitelist/index.ts

129 lines
3.5 KiB
TypeScript
Raw Normal View History

2024-07-01 12:39:17 +00:00
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);
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.");
});
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;
if (!member) member = await f[1].guild.members.fetch(f[1].author.id);
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();