// Require the necessary discord.js classes const { Client, Events, GatewayIntentBits, REST, Routes, Collection, FLAGS, MessageMentionOptions } = require('discord.js'); const Discord = require('discord.js'); const { clientId, guildId, token } = require('./key.json'); const fs = require('node:fs'); const path = require('node:path'); // Create a new client instance const client = new Discord.Client({ intents: [ GatewayIntentBits.Guilds, GatewayIntentBits.GuildMessages, GatewayIntentBits.MessageContent, GatewayIntentBits.GuildMembers, ], }); // When the client is ready, run this code (only once) // We use 'c' for the event parameter to keep it separate from the already defined 'client' client.once(Events.ClientReady, c => { console.log(`Ready! Logged in as ${c.user.tag}`); }); // Log in to Discord with your client's token client.login(token); // Retrieve commands client.commands = new Collection(); const commandsPath = path.join(__dirname, 'commands'); const commandFiles = fs.readdirSync(commandsPath).filter(file => file.endsWith('.ts')); for (const file of commandFiles) { const filePath = path.join(commandsPath, file); const command = require(filePath); // Set a new item in the Collection with the key as the command name and the value as the exported module if ('data' in command && 'execute' in command) { client.commands.set(command.data.name, command); } else { console.log(`[WARNING] The command at ${filePath} is missing a required "data" or "execute" property.`); } } client.on(Events.InteractionCreate, async interaction => { if (!interaction.isChatInputCommand()) return; const command = interaction.client.commands.get(interaction.commandName); if (!command) { console.error(`No command matching ${interaction.commandName} was found.`); return; } try { await command.execute(interaction, client); } catch (error) { console.error(error); if (interaction.replied || interaction.deferred) { await interaction.followUp({ content: 'There was an error while executing this command!', ephemeral: true }); } else { await interaction.reply({ content: 'There was an error while executing this command!', ephemeral: true }); } } }); // My code var abbreviationKey = require("./abbreviation_key.json"); function arrayRotate(arr, reverse, amount) { for (var i = 0; i < amount; i++) { if (reverse) arr.unshift(arr.pop()); else arr.push(arr.shift()); return arr; } } function matchAbbr(abbrTarget) { console.log("Looking for: " + abbrTarget); for (var abbr in abbreviationKey.target_phrases) { if (abbreviationKey.target_phrases[abbr] == abbrTarget) { //console.log("abbrTarget: " + typeof (abbrTarget)); //console.log("abbr: " + typeof (abbr)); return abbr; } else { //console.log("abbrTarget: " + typeof (abbrTarget)); //console.log("abbr: " + typeof (abbr)); } } return ""; } function replyMessage(message, correctedMessage, abbrsUsed) { var plural = ""; if (abbrsUsed == 1) { plural = "an acronym"; } else { plural = abbrsUsed + " acronyms" } var replyString = "Your message contains " + plural + "! Let me fix that for you: \n > " + correctedMessage + "\n \n \|\|btw I was written by Caleb Fontenot\|\|" var stringLength = replyString.length; if (stringLength > 2000) { replyString = "Sorry, I detected " + plural + ", but the resultant response was " + stringLength + " characters long, and Discord only allows a maximum of 2000." } message.reply({content: replyString, allowedMentions: { repliedUser: false }}); } client.on('messageCreate', message => { checkMessage(message); checkInsult(message); }); client.on('messageUpdate', (undefined, newMessage) => { checkMessage(newMessage); checkInsult(newMessage); }); function checkMessage(message) { if (message.contains == "<@1091120267851485215>, what are your pronouns?") { message.reply({content: "My pronouns are she/her ☺️", allowedMentions: { repliedUser: false }}) } console.log(`${message.author.tag} in #${message.channel.name} sent: ${message.content}`); //console.log(message.author); if (message.author.id == "1091120267851485215") { return; } var matchMessageArray = message.content.toLowerCase().split(/[ ,!?\"@#$%^&*().;:|]+/); console.log(matchMessageArray); let correctedMessage = message.content; let matchDetected = false; var abbrsUsed = 0; for (let i = 0; i < matchMessageArray.length; ++i) { var rebuildMessageArray = []; //console.log("Corrected Message: " + correctedMessage); if (abbreviationKey.target_phrases[matchMessageArray[i]] !== undefined) { checkIfGirlfriend(message); if (checkIfExempt(message)) { return; } matchDetected = true; abbrsUsed++; //Return key var phrase = abbreviationKey.target_phrases[matchMessageArray[i]]; var abbr = matchAbbr(phrase); //abbreviationKey.target_phrases[phrase]; //console.log(typeof(abbr)); console.log("Found abbreviation: " + abbr); console.log("Phrase that matches used acronym: " + phrase); if (abbr !== "") { rebuildMessageArray = correctedMessage.split(new RegExp(abbr, 'i')); console.log("rebuildMessageArray: " + rebuildMessageArray); } else { message.reply("Detected abbreviation, but regex matching broke. Caleb is working on this..."); return; } //https://gitea.calebfontenot.com/CCF_100/NoMoreAcronyms/issues/1 arrayRotate(rebuildMessageArray, true, 1); rebuildMessageArray.unshift("`" + phrase + "`"); arrayRotate(rebuildMessageArray, true, 2); console.log(rebuildMessageArray); // Build into string and set to variable! correctedMessage = ""; // clear old message. for (let j = 0; j < rebuildMessageArray.length; j++) { correctedMessage += rebuildMessageArray[j]; } console.log(correctedMessage); //break; } } if (matchDetected) { replyMessage(message, correctedMessage, abbrsUsed); } } function checkIfGirlfriend(message) { if (message.author.id == "698360641731166238") { message.react('☺️'); message.react('❤️'); } } function checkIfExempt(message) { console.log("Has role? " + message.member.roles.cache.some(role => role.name == "Exempt from NoMoreAcronyms")); if (!message.author.bot) { if (message.member.roles.cache.some(role => role.name == "Exempt from NoMoreAcronyms")) { if (!message.member.roles.cache.some(role => role.name == "NoReactions")) { message.react('🇵'); message.react('🇴'); message.react('🇬'); return true; } return true; } } return false; } function checkInsult(message) { if (!message.author.bot) { if (!message.member.roles.cache.some(role => role.name == "Exempt from NoMoreAcronyms")) { if (message.content.includes("bot", "annoying")) { message.react('🇳'); message.react('🇴'); message.react('❌'); message.react('🇺'); } } } }