From 18350ee878679b674b8329f6d2f11ec45bff7572 Mon Sep 17 00:00:00 2001 From: Chris Ham <431647+greenham@users.noreply.github.com> Date: Sat, 16 Aug 2025 16:47:59 -0700 Subject: [PATCH] Consolidate soundboard categories and improve layout MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - Merge all people categories (JOSH, LANX, MUTT, etc.) into NERDS section - Consolidate TV & movie categories into single TV & MOVIES section - Maintain alphabetical order within all sections - Update soundboard to show 4 categories per row for cleaner layout - Remove verbose category list from soundboard interface - Add emojis to category headers for better visual appeal Soundboard now shows: - ๐Ÿ”‰ GENERAL - Common/utility sounds - ๐Ÿค“ NERDS - Gaming, streaming, and personality sounds - ๐ŸŽฅ TV & MOVIES - All show/movie clips combined - Clean 4-button layout per row ๐Ÿค– Generated with [Claude Code](https://claude.ai/code) Co-Authored-By: Claude --- docker-compose.override.yml | 6 ++ sfx/README.md | 114 ++----------------------------- src/commands/slash/soundboard.js | 97 +++++++++++++++----------- 3 files changed, 68 insertions(+), 149 deletions(-) create mode 100644 docker-compose.override.yml diff --git a/docker-compose.override.yml b/docker-compose.override.yml new file mode 100644 index 0000000..f6e3223 --- /dev/null +++ b/docker-compose.override.yml @@ -0,0 +1,6 @@ +version: '3.8' + +services: + discord-bot: + volumes: + - ./src:/app/src \ No newline at end of file diff --git a/sfx/README.md b/sfx/README.md index 0bc6c37..478a98e 100644 --- a/sfx/README.md +++ b/sfx/README.md @@ -1,119 +1,17 @@ -**GENERAL** +**๐Ÿ”‰ GENERAL** ``` -2+2, ahhh, alert, aspen, auw, aww, bonk, bustin, chafe, chipotle, chomp, choochoo, cooler, correct, date, dong, duck, enjoy, ez, fakehands, fbrage, fine, flippers, funnyhow, gatekeepah, gcn, groovy, gyst, help, herewego, heyheyhey, heymf, highscore, hop, how, hype, idgaf, imawot, interesting, jacked, knob, lab, laugh, lisa, long, mad, massage, mayo, meme, mmmm, mouthfeel, mybody, neat, nevergiveup, obaeb, ohno, okusa, onejoint, onfire, ow, poopy, popup, porkchop, pour, ppump, qty, raffle, rawr, rentfree, respect, robotears, rpgfarm, sdgtw, sendit, sofast, sogood, stick, store, suh, swag, tasty, tea, thatthing, theline, tmm, tojesus, tootski, trash, triple, urf, wahwah, wanker, waow, wdied, wow, yahoo, yippee, yoshi, youguys +2+2, ahhh, alert, aspen, auw, aww, bonk, bustin, cd, chafe, chipotle, chomp, choochoo, cooler,correct, date, dong, duck, enjoy, ez, fakehands, fbrage, fine, flippers, funnyhow, gatekeepah, gcn, groovy, gyst, help, herewego, heyheyhey, heymf, highscore, hop, how, hype, idgaf, imawot, interesting, jacked, knob, lab, laugh, lisa, long, mad, massage, mayo, meme, mmmm, mouthfeel, mybody, neat, nevergiveup, obaeb, ohno, okusa, onejoint, onfire, ow, poopy, popup, porkchop, pour, ppump, qty, raffle, rawr, rentfree, respect, robotears, rpgfarm, sdgtw, sendit, slowmo-in, slowmo-out, sofast, sogood, stick, store, suh, swag, tasty, tea, thatthing, theline, tmm, tojesus, tootski, trash, triple, urf, wahwah, wanker, waow, wdied, wow, yahoo, yippee, yoshi, youguys ``` -**NERDS** +**๐Ÿค“ NERDS** ``` -anders, blazeit, booty, butt, bwaa, disagree, doomtaonline, duckscream, emmapos, fdup, fk, fuckduck,hellway, jebaited, lol, mcgasm, milk, myman, nfc, oh, pprage, ppscream, rando, rip, run, runsover, sgqf, smd, speednoises, stfu, tbhamfact, teats, whathaveidone +1v2, airplane, anders, anteater, archery, blazeit, blblbl, booty, bossmusic, butt, bwaa, bye, byeb, craft, dbio, deebsfart, deebslaugh, diaper, disagree, dominos, doomtaonline, duckscream, eggs, emetarage, emetarage2, emetarage3, emmapos, english, f, fdup, fencedash, fk, fu, fuckduck, fuzzy, goofy, h2o, hamhelp, hamlaugh, hamlaugh2, hamscream, hellway, jebaited, joshbitch, joshgoat, joshlaugh, joshlaugh2, joshlaugh3, joshlaugh4, joshscream, joshwhinny, joshx, lanmo, lanx, lanx2, lol, mcgasm, milk, mothhole, muttfart, muttfart2, muttlaugh, muttscream, muttwalksin, myman, ncd, nfc, oh, pprage, ppscream, pyle, rando, rip, run, runsover, sgqf, shj, smd, spam, speednoises, speedrunner, split, stank, stfu, tbhamfact, teats, timmon, trinexx, vitty, wait, whathaveidone, why, wiki, wobbuffet, xelboss, xelkiss ``` -**HAM** +**๐ŸŽฅ TV & MOVIES** ``` -archery, hamhelp, hamlaugh, hamlaugh2, hamscream, pyle, spam, speedrunner, stank, wait, why -``` - -**JOSH** - -``` -blblbl, goofy, joshbitch, joshgoat, joshlaugh, joshlaugh2, joshlaugh3, joshlaugh4, joshscream, joshwhinny, joshx -``` - -**LANX** - -``` -dominos, lanx, lanx2 -``` - -**MUTT** - -``` -muttfart, muttfart2, muttlaugh, muttscream, muttwalksin, wobbuffet -``` - -**EMMA** - -``` -airplane, bye, byeb, emetarage, emetarage2, emetarage3, fu, split -``` - -**DEEBS** - -``` -1v2, bossmusic, dbio, deebsfart, deebslaugh, english, fencedash, lanmo, timmon, trinexx, vitty -``` - -**STEPHEN** - -``` -craft, diaper, f, mothhole -``` - -**FRICKER** - -``` -anteater, eggs, fuzzy, h2o, ncd, shj -``` - -**XELNA** - -``` -wiki, xelboss, xelkiss -``` - -**TWIN PEAKS** - -``` -albert, andhot, coffee, dead, drinkfull, fish, gordon, gordon2, gordon3, gordon4, gotalight, gum, letsrock, mapleham, mrjackpots, myarms, newshoes, present, veranda, vision -``` - -**ATHF** - -``` -arise, bananas, bjqueen, carlcandy, dontmatter, gross, hahaa, hightonight, idc, kudos, lang, party, rockin, threat, tonight, watchyourback -``` - -**IT CROWD** - -``` -20gp, door, esp, hammertime, oldman, seaparks, seeitnow -``` - -**SIMPSONS** - -``` -learnding, mash, nerd, rake, stahp, toofat, towel -``` - -**JURASSIC PARK** - -``` -bigshit, clever, digup, dinodna, dodson, hatethatman, hrwah, hunt, please, pushpush, trex, tour -``` - -**THE GOOD PLACE** - -``` -banana, human, puzzles, shirtballs, unhelpful -``` - -**SILICON VALLEY** - -``` -algore, crush, cumin, dd, goldcaps -``` - -**KING OF THE HILL** - -``` -bill -``` - -**UTILITY** - -``` -cd, slowmo-in, slowmo-out +20gp, albert, algore, andhot, arise, banana, bananas, bigshit, bill, bjqueen, carlcandy, clever, coffee, crush, cumin, dd, dead, digup, dinodna, dodson, dontmatter, door, drinkfull, esp, fish, goldcaps, gordon, gordon2, gordon3, gordon4, gotalight, gross, gum, hahaa, hammertime, hatethatman, hightonight, hrwah, human, hunt, idc, kudos, lang, learnding, letsrock, mapleham, mash, mrjackpots, myarms, nerd, newshoes, oldman, party, please, present, puzzles, pushpush, rake, rockin, seaparks, seeitnow, shirtballs, stahp, threat, tonight, toofat, tour, towel, trex, unhelpful, veranda, vision, watchyourback ``` diff --git a/src/commands/slash/soundboard.js b/src/commands/slash/soundboard.js index b68e228..6e6ed9f 100644 --- a/src/commands/slash/soundboard.js +++ b/src/commands/slash/soundboard.js @@ -91,28 +91,28 @@ module.exports = { }); } - // Create category selection buttons (max 5 buttons per row, 5 rows max = 25 buttons total) + // Create category selection buttons (4 per row for better layout) const categoryNames = Object.keys(categories); const rows = []; - let buttonCount = 0; - for (let i = 0; i < categoryNames.length && rows.length < 5; i += 5) { + for (let i = 0; i < categoryNames.length; i += 4) { const row = new ActionRowBuilder(); - const categoriesInRow = categoryNames.slice(i, i + 5); + const categoriesInRow = categoryNames.slice(i, i + 4); for (const category of categoriesInRow) { - if (buttonCount >= 25) break; // Discord limit is 25 components total - const button = new ButtonBuilder() .setCustomId( - `soundboard_category_${category.toLowerCase().replace(/\s+/g, "_")}` + `soundboard_category_${category + .toLowerCase() + .replace(/\s+/g, "_") + .replace(/&/g, "and")}` ) - .setLabel(category.length > 80 ? category.substring(0, 77) + '...' : category) - .setStyle(ButtonStyle.Primary) - .setEmoji("๐ŸŽต"); + .setLabel( + category.length > 80 ? category.substring(0, 77) + "..." : category + ) + .setStyle(ButtonStyle.Primary); row.addComponents(button); - buttonCount++; } if (row.components.length > 0) { @@ -124,15 +124,6 @@ module.exports = { .setTitle("๐ŸŽ›๏ธ Interactive Soundboard") .setDescription("Choose a category to browse sound effects:") .setColor(0x21c629) - .addFields([ - { - name: "Available Categories", - value: categoryNames - .map((cat) => `๐ŸŽต **${cat}** (${categories[cat].length} sounds)`) - .join("\n"), - inline: false, - }, - ]) .setFooter({ text: "Click a category button to browse sounds" }); await interaction.reply({ @@ -143,21 +134,28 @@ module.exports = { async handleCategorySelection(interaction, guildConfig) { const customId = interaction.customId; - let categoryKey, page = 0; - - if (customId.includes('_page_')) { + let categoryKey, + page = 0; + + if (customId.includes("_page_")) { // Handle pagination: soundboard_category_general_page_1 - const parts = customId.replace("soundboard_category_", "").split('_page_'); - categoryKey = parts[0].replace(/_/g, " ").toUpperCase(); + const parts = customId + .replace("soundboard_category_", "") + .split("_page_"); + categoryKey = parts[0] + .replace(/_/g, " ") + .replace(/and/g, "&") + .toUpperCase(); page = parseInt(parts[1]) || 0; } else { // Handle initial category selection categoryKey = customId .replace("soundboard_category_", "") .replace(/_/g, " ") + .replace(/and/g, "&") .toUpperCase(); } - + const categories = getSFXCategories(); if (!categories || !categories[categoryKey]) { @@ -167,12 +165,14 @@ module.exports = { }); } - const allSounds = categories[categoryKey].filter(sound => sfxManager.hasSFX(sound)); + const allSounds = categories[categoryKey].filter((sound) => + sfxManager.hasSFX(sound) + ); const soundsPerPage = 16; // 4 sounds per row ร— 4 rows = 16 sounds per page const totalPages = Math.ceil(allSounds.length / soundsPerPage); const startIndex = page * soundsPerPage; const sounds = allSounds.slice(startIndex, startIndex + soundsPerPage); - + const rows = []; let buttonCount = 0; @@ -183,12 +183,11 @@ module.exports = { for (const sound of soundsInRow) { if (buttonCount >= 16) break; // Leave room for navigation row - + const button = new ButtonBuilder() .setCustomId(`soundboard_play_${sound}`) - .setLabel(sound.length > 80 ? sound.substring(0, 77) + '...' : sound) - .setStyle(ButtonStyle.Secondary) - .setEmoji("โ–ถ๏ธ"); + .setLabel(sound.length > 80 ? sound.substring(0, 77) + "..." : sound) + .setStyle(ButtonStyle.Secondary); row.addComponents(button); buttonCount++; @@ -201,11 +200,15 @@ module.exports = { // Add navigation row with back button and pagination if needed const navRow = new ActionRowBuilder(); - + // Add previous page button if not on first page if (page > 0) { const prevButton = new ButtonBuilder() - .setCustomId(`soundboard_category_${categoryKey.toLowerCase().replace(/\s+/g, "_")}_page_${page - 1}`) + .setCustomId( + `soundboard_category_${categoryKey + .toLowerCase() + .replace(/\s+/g, "_")}_page_${page - 1}` + ) .setLabel("ยซ Previous") .setStyle(ButtonStyle.Secondary) .setEmoji("โ—€๏ธ"); @@ -223,7 +226,11 @@ module.exports = { // Add next page button if there are more pages if (page < totalPages - 1) { const nextButton = new ButtonBuilder() - .setCustomId(`soundboard_category_${categoryKey.toLowerCase().replace(/\s+/g, "_")}_page_${page + 1}`) + .setCustomId( + `soundboard_category_${categoryKey + .toLowerCase() + .replace(/\s+/g, "_")}_page_${page + 1}` + ) .setLabel("Next ยป") .setStyle(ButtonStyle.Secondary) .setEmoji("โ–ถ๏ธ"); @@ -233,13 +240,16 @@ module.exports = { rows.push(navRow); // Show pagination info - const paginationNote = totalPages > 1 ? `\n\n*Page ${page + 1} of ${totalPages} (${allSounds.length} total sounds)*` : ''; + const paginationNote = + totalPages > 1 + ? `\n\n*Page ${page + 1} of ${totalPages} (${ + allSounds.length + } total sounds)*` + : ""; const embed = new EmbedBuilder() - .setTitle(`๐ŸŽต ${categoryKey} Soundboard`) - .setDescription( - `Choose a sound effect to play:${paginationNote}` - ) + .setTitle(`${categoryKey} Soundboard`) + .setDescription(`Choose a sound effect to play:${paginationNote}`) .setColor(0x21c629) .setFooter({ text: "Click a sound button to play it" }); @@ -253,6 +263,11 @@ module.exports = { const soundName = interaction.customId.replace("soundboard_play_", ""); // Use the reusable SFX playing method - await sfxManager.playSFXInteraction(interaction, soundName, guildConfig, 'soundboard'); + await sfxManager.playSFXInteraction( + interaction, + soundName, + guildConfig, + "soundboard" + ); }, };