Advertisement
lokdei

@unknown-user on discord server welcome

Apr 20th, 2025
427
0
158 days
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
TypeScript 2.72 KB | Source Code | 0 0
  1. import {
  2.   Guild,
  3.   GuildMember,
  4.   MessageCreateOptions,
  5.   TextChannel,
  6. } from "discord.js";
  7. import { Discord, On } from "discordx";
  8. import { bot } from "../classes/discord-bot.js";
  9. import { createUserApplyButtonRow } from "../commands/onboarding-setup.js";
  10. import { OnboardingService } from "../services/onboarding-service.js";
  11. import { logger } from "../util/logger.js";
  12.  
  13. @Discord()
  14. export class WelcomeEvent {
  15.   @On({ event: "guildMemberAdd" })
  16.   async onMemberJoin(members: GuildMember[]): Promise<void> {
  17.     for (const member of members) {
  18.       let fetchedMember: GuildMember = member;
  19.       try {
  20.         // Fetch the member to ensure all data is loaded
  21.         fetchedMember = await member.fetch();
  22.       } catch (error) {
  23.         logger.error(
  24.           `Unable to fetch new guildmember with id ${member.id}`,
  25.           error
  26.         );
  27.       }
  28.  
  29.       const config = OnboardingService.getConfig(fetchedMember.guild.id);
  30.       if (!config.welcomeText && !config.welcomeChannelId) return;
  31.  
  32.       const welcomeChannel = fetchedMember.guild.channels.cache.get(
  33.         config.welcomeChannelId
  34.       ) as TextChannel;
  35.       if (!welcomeChannel) {
  36.         logger.warn(
  37.           "Onboarding welcome channel by id was not found in cache",
  38.           config.welcomeChannelId,
  39.           config.discordGuildName
  40.         );
  41.         return;
  42.       }
  43.  
  44.       const joinButtons = createUserApplyButtonRow(
  45.         config.enableWelcomeClanOnboarding,
  46.         config.enableWelcomeFriendOnboarding
  47.       );
  48.  
  49.       const greeting = transformedWelcomeText({
  50.         welcomeText: config.welcomeText,
  51.         newUser: fetchedMember,
  52.         guild: bot.guilds.cache.find((g) => g.id === config.discordGuildId)!,
  53.       });
  54.  
  55.       const sendOptions: MessageCreateOptions = {
  56.         content: greeting,
  57.       };
  58.  
  59.       if (
  60.         config.enableWelcomeClanOnboarding ||
  61.         config.enableWelcomeFriendOnboarding
  62.       ) {
  63.         sendOptions.components = [joinButtons];
  64.       }
  65.  
  66.       try {
  67.         logger.info("Sending welcome text to welcome channel");
  68.         await welcomeChannel.send(sendOptions);
  69.       } catch (error) {
  70.         logger.error("Unable to send welcome text to welcome channel", error);
  71.       }
  72.     }
  73.   }
  74. }
  75.  
  76. function transformedWelcomeText(data: {
  77.   welcomeText: string;
  78.   newUser: GuildMember;
  79.   guild: Guild;
  80. }): string {
  81.   const { guild, newUser, welcomeText } = data;
  82.   const changes = new Map<string, string>([
  83.     ["[ServerName]", guild.name],
  84.     ["[UserMention]", `<@${newUser.id}>`], // Works better then userMention, as fetching the user might fail.
  85.   ]);
  86.  
  87.   let result = welcomeText;
  88.   changes.forEach((v, k) => {
  89.     result = result.replaceAll(k, v);
  90.   });
  91.  
  92.   return result;
  93. }
  94.  
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement