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:
6
docker-compose.override.yml
Normal file
6
docker-compose.override.yml
Normal file
@@ -0,0 +1,6 @@
|
|||||||
|
version: '3.8'
|
||||||
|
|
||||||
|
services:
|
||||||
|
discord-bot:
|
||||||
|
volumes:
|
||||||
|
- ./src:/app/src
|
||||||
114
sfx/README.md
114
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
|
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
|
||||||
```
|
|
||||||
|
|
||||||
**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
|
|
||||||
```
|
```
|
||||||
|
|||||||
@@ -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 categoryNames = Object.keys(categories);
|
||||||
const rows = [];
|
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 row = new ActionRowBuilder();
|
||||||
const categoriesInRow = categoryNames.slice(i, i + 5);
|
const categoriesInRow = categoryNames.slice(i, i + 4);
|
||||||
|
|
||||||
for (const category of categoriesInRow) {
|
for (const category of categoriesInRow) {
|
||||||
if (buttonCount >= 25) break; // Discord limit is 25 components total
|
|
||||||
|
|
||||||
const button = new ButtonBuilder()
|
const button = new ButtonBuilder()
|
||||||
.setCustomId(
|
.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)
|
.setLabel(
|
||||||
.setStyle(ButtonStyle.Primary)
|
category.length > 80 ? category.substring(0, 77) + "..." : category
|
||||||
.setEmoji("🎵");
|
)
|
||||||
|
.setStyle(ButtonStyle.Primary);
|
||||||
|
|
||||||
row.addComponents(button);
|
row.addComponents(button);
|
||||||
buttonCount++;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
if (row.components.length > 0) {
|
if (row.components.length > 0) {
|
||||||
@@ -124,15 +124,6 @@ module.exports = {
|
|||||||
.setTitle("🎛️ Interactive Soundboard")
|
.setTitle("🎛️ Interactive Soundboard")
|
||||||
.setDescription("Choose a category to browse sound effects:")
|
.setDescription("Choose a category to browse sound effects:")
|
||||||
.setColor(0x21c629)
|
.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" });
|
.setFooter({ text: "Click a category button to browse sounds" });
|
||||||
|
|
||||||
await interaction.reply({
|
await interaction.reply({
|
||||||
@@ -143,21 +134,28 @@ module.exports = {
|
|||||||
|
|
||||||
async handleCategorySelection(interaction, guildConfig) {
|
async handleCategorySelection(interaction, guildConfig) {
|
||||||
const customId = interaction.customId;
|
const customId = interaction.customId;
|
||||||
let categoryKey, page = 0;
|
let categoryKey,
|
||||||
|
page = 0;
|
||||||
if (customId.includes('_page_')) {
|
|
||||||
|
if (customId.includes("_page_")) {
|
||||||
// Handle pagination: soundboard_category_general_page_1
|
// Handle pagination: soundboard_category_general_page_1
|
||||||
const parts = customId.replace("soundboard_category_", "").split('_page_');
|
const parts = customId
|
||||||
categoryKey = parts[0].replace(/_/g, " ").toUpperCase();
|
.replace("soundboard_category_", "")
|
||||||
|
.split("_page_");
|
||||||
|
categoryKey = parts[0]
|
||||||
|
.replace(/_/g, " ")
|
||||||
|
.replace(/and/g, "&")
|
||||||
|
.toUpperCase();
|
||||||
page = parseInt(parts[1]) || 0;
|
page = parseInt(parts[1]) || 0;
|
||||||
} else {
|
} else {
|
||||||
// Handle initial category selection
|
// Handle initial category selection
|
||||||
categoryKey = customId
|
categoryKey = customId
|
||||||
.replace("soundboard_category_", "")
|
.replace("soundboard_category_", "")
|
||||||
.replace(/_/g, " ")
|
.replace(/_/g, " ")
|
||||||
|
.replace(/and/g, "&")
|
||||||
.toUpperCase();
|
.toUpperCase();
|
||||||
}
|
}
|
||||||
|
|
||||||
const categories = getSFXCategories();
|
const categories = getSFXCategories();
|
||||||
|
|
||||||
if (!categories || !categories[categoryKey]) {
|
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 soundsPerPage = 16; // 4 sounds per row × 4 rows = 16 sounds per page
|
||||||
const totalPages = Math.ceil(allSounds.length / soundsPerPage);
|
const totalPages = Math.ceil(allSounds.length / soundsPerPage);
|
||||||
const startIndex = page * soundsPerPage;
|
const startIndex = page * soundsPerPage;
|
||||||
const sounds = allSounds.slice(startIndex, startIndex + soundsPerPage);
|
const sounds = allSounds.slice(startIndex, startIndex + soundsPerPage);
|
||||||
|
|
||||||
const rows = [];
|
const rows = [];
|
||||||
let buttonCount = 0;
|
let buttonCount = 0;
|
||||||
|
|
||||||
@@ -183,12 +183,11 @@ module.exports = {
|
|||||||
|
|
||||||
for (const sound of soundsInRow) {
|
for (const sound of soundsInRow) {
|
||||||
if (buttonCount >= 16) break; // Leave room for navigation row
|
if (buttonCount >= 16) break; // Leave room for navigation row
|
||||||
|
|
||||||
const button = new ButtonBuilder()
|
const button = new ButtonBuilder()
|
||||||
.setCustomId(`soundboard_play_${sound}`)
|
.setCustomId(`soundboard_play_${sound}`)
|
||||||
.setLabel(sound.length > 80 ? sound.substring(0, 77) + '...' : sound)
|
.setLabel(sound.length > 80 ? sound.substring(0, 77) + "..." : sound)
|
||||||
.setStyle(ButtonStyle.Secondary)
|
.setStyle(ButtonStyle.Secondary);
|
||||||
.setEmoji("▶️");
|
|
||||||
|
|
||||||
row.addComponents(button);
|
row.addComponents(button);
|
||||||
buttonCount++;
|
buttonCount++;
|
||||||
@@ -201,11 +200,15 @@ module.exports = {
|
|||||||
|
|
||||||
// Add navigation row with back button and pagination if needed
|
// Add navigation row with back button and pagination if needed
|
||||||
const navRow = new ActionRowBuilder();
|
const navRow = new ActionRowBuilder();
|
||||||
|
|
||||||
// Add previous page button if not on first page
|
// Add previous page button if not on first page
|
||||||
if (page > 0) {
|
if (page > 0) {
|
||||||
const prevButton = new ButtonBuilder()
|
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")
|
.setLabel("« Previous")
|
||||||
.setStyle(ButtonStyle.Secondary)
|
.setStyle(ButtonStyle.Secondary)
|
||||||
.setEmoji("◀️");
|
.setEmoji("◀️");
|
||||||
@@ -223,7 +226,11 @@ module.exports = {
|
|||||||
// Add next page button if there are more pages
|
// Add next page button if there are more pages
|
||||||
if (page < totalPages - 1) {
|
if (page < totalPages - 1) {
|
||||||
const nextButton = new ButtonBuilder()
|
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 »")
|
.setLabel("Next »")
|
||||||
.setStyle(ButtonStyle.Secondary)
|
.setStyle(ButtonStyle.Secondary)
|
||||||
.setEmoji("▶️");
|
.setEmoji("▶️");
|
||||||
@@ -233,13 +240,16 @@ module.exports = {
|
|||||||
rows.push(navRow);
|
rows.push(navRow);
|
||||||
|
|
||||||
// Show pagination info
|
// 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()
|
const embed = new EmbedBuilder()
|
||||||
.setTitle(`🎵 ${categoryKey} Soundboard`)
|
.setTitle(`${categoryKey} Soundboard`)
|
||||||
.setDescription(
|
.setDescription(`Choose a sound effect to play:${paginationNote}`)
|
||||||
`Choose a sound effect to play:${paginationNote}`
|
|
||||||
)
|
|
||||||
.setColor(0x21c629)
|
.setColor(0x21c629)
|
||||||
.setFooter({ text: "Click a sound button to play it" });
|
.setFooter({ text: "Click a sound button to play it" });
|
||||||
|
|
||||||
@@ -253,6 +263,11 @@ module.exports = {
|
|||||||
const soundName = interaction.customId.replace("soundboard_play_", "");
|
const soundName = interaction.customId.replace("soundboard_play_", "");
|
||||||
|
|
||||||
// Use the reusable SFX playing method
|
// Use the reusable SFX playing method
|
||||||
await sfxManager.playSFXInteraction(interaction, soundName, guildConfig, 'soundboard');
|
await sfxManager.playSFXInteraction(
|
||||||
|
interaction,
|
||||||
|
soundName,
|
||||||
|
guildConfig,
|
||||||
|
"soundboard"
|
||||||
|
);
|
||||||
},
|
},
|
||||||
};
|
};
|
||||||
|
|||||||
Reference in New Issue
Block a user