176 lines
4.7 KiB
TypeScript
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();
|