Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
38 changes: 0 additions & 38 deletions docs/commands.md
Original file line number Diff line number Diff line change
Expand Up @@ -87,44 +87,6 @@ Fetch a single pull request by number.

Entertainment and engagement commands. All fun commands track usage for leaderboards.

### `/fun chucknorris`

Get Chuck Norris facts.

**Options:**

- `category` (optional) — Fetch from a specific category
- `query` (optional) — Search facts by keyword
- `ephemeral` (optional) — Show result only to you

**Modes:**

- Random fact (no options)
- Category-based fact
- Keyword search

**Use case:** Lighten the mood with absurd humor.

---

### `/fun dadjoke`

Get dad jokes.

**Options:**

- `query` (optional) — Search jokes by keyword
- `ephemeral` (optional) — Show result only to you

**Modes:**

- Random joke (no query)
- Search results (with query)

**Use case:** Classic groan-worthy humor.

---

### `/fun joke`

Community-submitted jokes organized by generation.
Expand Down
66 changes: 9 additions & 57 deletions src/commands/fun/fun.ts
Original file line number Diff line number Diff line change
Expand Up @@ -7,21 +7,19 @@ import {
} from "discord.js";
import { logger } from "../../utils/logger.js";

import { run as runChuckNorris } from "./subcommands/chucknorris.js";
import type { ChuckNorrisMode } from "./subcommands/chucknorris.js";

import { run as runDice } from "./subcommands/dice.js";

import { run as runWeather } from "./subcommands/weather.js";
import type { TempUnit, WeatherMode } from "../../services/weather/types.js";

import { run as runCoinflip } from "./subcommands/coinflip.js";
import { run as runPoll } from "./subcommands/poll.js";
import { run as runJava } from "./subcommands/java.js";

import { run as runLeaderboard } from "./subcommands/leaderboard.js";
import type { LeaderboardMode } from "./subcommands/leaderboard.js";

import { handleJoke, buildJokeSubcommands } from "./subcommands/joke/index.js";

import { recordFunUsage, type FunCommandKey } from "../../services/fun/funUsageStore.js";

function parseTempUnit(raw: string | null): TempUnit {
Expand All @@ -32,24 +30,8 @@ export const data = new SlashCommandBuilder()
.setName("fun")
.setDescription("Fun commands")

// /fun chucknorris
.addSubcommand((s) =>
s
.setName("chucknorris")
.setDescription("Chuck Norris facts (random, category, or search)")
.addStringOption((o) =>
o.setName("category").setDescription("Category (optional)").setRequired(false),
)
.addStringOption((o) =>
o.setName("query").setDescription("Search term (optional)").setRequired(false),
)
.addBooleanOption((o) =>
o
.setName("ephemeral")
.setDescription("Only show the result to you")
.setRequired(false),
),
)
// /fun joke
.addSubcommandGroup(buildJokeSubcommands)

// /fun dice
.addSubcommand((s) =>
Expand Down Expand Up @@ -93,19 +75,6 @@ export const data = new SlashCommandBuilder()
),
)

// /fun java
.addSubcommand((s) =>
s
.setName("java")
.setDescription("Random Java jokes ☕")
.addBooleanOption((o) =>
o
.setName("ephemeral")
.setDescription("Only show the result to you")
.setRequired(false),
),
)

// /fun poll (2–4 options)
.addSubcommand((s) =>
s
Expand Down Expand Up @@ -214,15 +183,13 @@ export const data = new SlashCommandBuilder()

function funKeyFromSub(sub: string): FunCommandKey | null {
const allowed: Record<string, FunCommandKey> = {
chucknorris: "chucknorris",
dadjoke: "dadjoke",
dice: "dice",
coinflip: "coinflip",
java: "java",
poll: "poll",
weather: "weather",
weather7: "weather7",
leaderboard: "leaderboard",
joke: "joke",
};

return allowed[sub] ?? null;
Expand All @@ -245,26 +212,17 @@ async function maybeRecordUsage(
export async function execute(interaction: ChatInputCommandInteraction): Promise<void> {
const sub = interaction.options.getSubcommand(true);

// Only some subcommands have the "ephemeral" option (poll does not).
const supportsEphemeral = sub !== "poll";
// Only some subcommands have the "ephemeral" option (poll and joke do not).
const supportsEphemeral = sub !== "poll" && sub !== "joke";
const ephemeral = supportsEphemeral
? (interaction.options.getBoolean("ephemeral") ?? false)
: false;

await interaction.deferReply(ephemeral ? { flags: MessageFlags.Ephemeral } : undefined);

try {
if (sub === "chucknorris") {
const category = interaction.options.getString("category")?.trim();
const query = interaction.options.getString("query")?.trim();

const mode: ChuckNorrisMode = query
? { kind: "search", query }
: category
? { kind: "category", category }
: { kind: "random" };

await runChuckNorris(interaction, mode);
if (sub === "joke") {
await handleJoke(interaction);
await maybeRecordUsage(interaction, sub);
return;
}
Expand All @@ -281,12 +239,6 @@ export async function execute(interaction: ChatInputCommandInteraction): Promise
return;
}

if (sub === "java") {
await runJava(interaction);
await maybeRecordUsage(interaction, sub);
return;
}

if (sub === "poll") {
await runPoll(interaction);
await maybeRecordUsage(interaction, sub);
Expand Down
220 changes: 0 additions & 220 deletions src/commands/fun/subcommands/chucknorris.ts

This file was deleted.

Loading