refraction/src/index.ts
Sefa Eyeoglu f799703959
chore: update support thread message
Signed-off-by: Sefa Eyeoglu <contact@scrumplex.net>
2023-08-22 19:53:50 +02:00

201 lines
5.7 KiB
TypeScript

import {
Client,
GatewayIntentBits,
Partials,
OAuth2Scopes,
InteractionType,
PermissionFlagsBits,
ChannelType,
Events,
} from 'discord.js';
import { reuploadCommands } from './_reupload';
import * as BuildConfig from './constants';
import { parseLog } from './logs';
import { getLatestMinecraftVersion } from './utils/remoteVersions';
import { expandDiscordLink } from './utils/resolveMessage';
import { membersCommand } from './commands/members';
import { starsCommand } from './commands/stars';
import { modrinthCommand } from './commands/modrinth';
import { tagsCommand } from './commands/tags';
import { jokeCommand } from './commands/joke';
import { roryCommand } from './commands/rory';
import { sayCommand } from './commands/say';
import random from 'just-random';
import { green, bold, yellow, cyan } from 'kleur/colors';
import 'dotenv/config';
const client = new Client({
intents: [
GatewayIntentBits.Guilds,
GatewayIntentBits.GuildMessages,
GatewayIntentBits.MessageContent,
GatewayIntentBits.DirectMessages,
GatewayIntentBits.GuildMembers,
GatewayIntentBits.GuildPresences,
GatewayIntentBits.GuildMessageReactions,
GatewayIntentBits.GuildModeration,
],
partials: [Partials.Channel],
});
client.once('ready', async () => {
console.log(green('Discord bot ready!'));
console.log(
cyan(
client.generateInvite({
scopes: [OAuth2Scopes.Bot],
permissions: [
PermissionFlagsBits.AddReactions,
PermissionFlagsBits.ViewChannel,
PermissionFlagsBits.BanMembers,
PermissionFlagsBits.KickMembers,
PermissionFlagsBits.CreatePublicThreads,
PermissionFlagsBits.CreatePrivateThreads,
PermissionFlagsBits.EmbedLinks,
PermissionFlagsBits.ManageChannels,
PermissionFlagsBits.ManageRoles,
PermissionFlagsBits.ModerateMembers,
PermissionFlagsBits.MentionEveryone,
PermissionFlagsBits.MuteMembers,
PermissionFlagsBits.SendMessages,
PermissionFlagsBits.SendMessagesInThreads,
PermissionFlagsBits.ReadMessageHistory,
],
})
)
);
if (process.env.NODE_ENV !== 'development')
console.warn(yellow(bold('Running in production mode!')));
const mcVersion = await getLatestMinecraftVersion();
client.user?.presence.set({
activities: [{ name: `Minecraft ${mcVersion}` }],
status: 'online',
});
client.on(Events.MessageCreate, async (e) => {
try {
if (e.channel.partial) await e.channel.fetch();
if (e.author.partial) await e.author.fetch();
if (!e.content) return;
if (!e.channel.isTextBased()) return;
if (e.author === client.user) return;
if (e.cleanContent.match(BuildConfig.ETA_REGEX)) {
await e.reply(
`${random(BuildConfig.ETA_MESSAGES)} <:pofat:1031701005559144458>`
);
}
const log = await parseLog(e.content);
if (log != null) {
e.reply({ embeds: [log] });
return;
}
await expandDiscordLink(e);
} catch (error) {
console.error('Unhandled exception on MessageCreate', error);
}
});
});
client.on(Events.InteractionCreate, async (interaction) => {
try {
if (!interaction.isChatInputCommand()) return;
const { commandName } = interaction;
if (commandName === 'ping') {
await interaction.reply({
content: `Pong! \`${client.ws.ping}ms\``,
ephemeral: true,
});
} else if (commandName === 'members') {
await membersCommand(interaction);
} else if (commandName === 'stars') {
await starsCommand(interaction);
} else if (commandName === 'modrinth') {
await modrinthCommand(interaction);
} else if (commandName === 'say') {
await sayCommand(interaction);
} else if (commandName === 'tag') {
await tagsCommand(interaction);
} else if (commandName === 'joke') {
await jokeCommand(interaction);
} else if (commandName === 'rory') {
await roryCommand(interaction);
}
} catch (error) {
console.error('Unhandled exception on InteractionCreate', error);
}
});
client.on(Events.MessageReactionAdd, async (reaction, user) => {
try {
if (reaction.partial) {
try {
await reaction.fetch();
} catch (error) {
console.error('Something went wrong when fetching the message:', error);
return;
}
}
if (
reaction.message.interaction &&
reaction.message.interaction?.type ===
InteractionType.ApplicationCommand &&
reaction.message.interaction?.user === user &&
reaction.emoji.name === '❌'
) {
await reaction.message.delete();
}
} catch (error) {
console.error('Unhandled exception on MessageReactionAdd', error);
}
});
client.on(Events.ThreadCreate, async (channel) => {
try {
if (
channel.type === ChannelType.PublicThread &&
channel.parent &&
channel.parent.name === 'support' &&
channel.guild
) {
const pingRole = channel.guild.roles.cache.find(
(r) => r.name === 'Moderators'
);
if (!pingRole) return;
await channel.send({
content: `
<@${channel.ownerId}> We've received your support ticket! Please upload your logs and post the link here if possible (run \`/tag log\` to find out how). Please don't ping people for support questions, unless you have their permission.
`.trim(),
allowedMentions: {
repliedUser: true,
roles: [],
users: channel.ownerId ? [channel.ownerId] : [],
},
});
}
} catch (error) {
console.error('Error handling ThreadCreate', error);
}
});
reuploadCommands()
.then(() => {
client.login(process.env.DISCORD_TOKEN);
})
.catch((e) => {
console.error(e);
process.exit(1);
});