Consolidate soundboard categories and improve layout

- 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 <noreply@anthropic.com>
This commit is contained in:
Chris Ham
2025-08-16 16:47:59 -07:00
parent aaf33d55db
commit 18350ee878
3 changed files with 68 additions and 149 deletions

View File

@@ -0,0 +1,6 @@
version: '3.8'
services:
discord-bot:
volumes:
- ./src:/app/src

View File

@@ -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
```

View File

@@ -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"
);
},
};