Skip to main content
Fun commands provide entertainment and interactive features for server members.

/anime

Fetch random anime images from the archives with optional tag filtering.
include
String
Include specific tags (comma-separated, e.g: girl, long_hair)
exclude
String
Exclude specific tags (comma-separated, e.g: boy, short_hair)
rating
String
Content rating filter (only available if ANIME_RATING_MODE=true in environment)
  • Safe
  • Suggestive
  • Borderline
  • Explicit

Features

  • Uses the Anime Pictures API (https://anime-pictures.net)
  • Tag-based filtering for precise results
  • Optional content rating restrictions
  • Returns random images matching criteria
The rating parameter is only available when ANIME_RATING_MODE=true is set in the environment configuration.

/avatar

Display a user’s avatar and banner (if available).
user
User
The user whose avatar to view (defaults to command executor)

Display Format

Shows:
  • High-resolution avatar (512px)
  • Animated GIF support for Nitro users
  • User banner if available (1024px)
  • User’s hex accent color as embed color
  • Direct download links
// From avatar.ts:25-30
const isAnimatedAvatar = targetUser.avatar?.startsWith("a_");
const avatarURL = targetUser.displayAvatarURL({
  size: 512,
  extension: isAnimatedAvatar ? "gif" : "png",
});

/asset

Generate a download link for a Roblox asset by ID.
id
String
required
The Roblox asset ID to download

Features

  • Generates direct download links for Roblox assets
  • Uses the johnmarctumulak.com Roblox API
  • Supports all public asset types
  • Returns downloadable file links
This command relies on a third-party service. If the external API is down, the command will fail.

/aura

Calculate a user’s aura strength and generate fighter statistics based on their display name.
user
User
User to read (defaults to command executor)

Aura System

The aura percentage is calculated using a deterministic hash of the display name:
// From aura.ts:85-86
const percentage = calculateAuraPercentage(displayName);
const level = calculateAuraLevel(percentage);

Aura Levels

LevelNamePercentage Range
0Vile0-8%
1Invisible9-16%
2Weak17-24%
3Frail25-32%
4Mid33-40%
5Noticed41-48%
6Vibrant49-56%
7Strong57-64%
8Radiant65-72%
9Legendary73-80%
10Mythical81-88%
11Omnipotent89-100%

Fighter Statistics

Generated stats include:
  • HP - Health points
  • ATK - Attack power
  • DEF - Defense rating
  • SPD - Speed/agility
  • CRIT - Critical hit chance
  • Abilities - Two random special abilities

Fighter Classes

// From aura.ts:129-137
function getFighterClass(level: number): string {
  if (level === 0) return "Cursed Bum";
  if (level <= 2) return "Recruit";
  if (level <= 4) return "Hardened Fighter";
  if (level <= 6) return "Decimator";
  if (level <= 8) return "Egoistic Champion";
  if (level <= 10) return "Living Weapon";
  return "Ego's Chosen One";
}
Aura calculations are deterministic - the same display name will always produce the same results.

/battle

Simulate an epic turn-based combat between two users.
fighter1
User
required
First warrior to enter the arena
fighter2
User
required
Second warrior to challenge fate
ranked
String (Choice)
Enable ranked mode (requires consent from both fighters)Options: “True” or “False”

Battle Mechanics

1

Consent Phase (Ranked Only)

Both fighters must accept within 15 seconds
2

Fighter Generation

Stats generated from display names (90% aura for ranked)
3

Speed Determination

Higher speed goes first (+1% dodge per speed difference)
4

Combat Simulation

Turn-based combat with attacks, abilities, dodges, and blocks
5

Victory

Battle ends when HP reaches 0 or 55 turns pass

Combat Actions

Normal Attacks:
  • Base damage = attacker’s ATK
  • Critical hits: 1.8x damage
  • Defense reduces damage by DEF/2
  • 15% base dodge chance + speed bonus
  • 15% block chance (reduces damage by DEF)
Special Abilities (25% chance per turn): Over 20 unique abilities including:
  • Alter Ego Burst - 1.5x ATK damage
  • Ego Shield - +10 DEF
  • Shadow Clone - 1.2x ATK damage + permanent +1 ATK
  • Healing Light - Restore 30% max HP
  • Berserker Rage - +6 ATK, -2 DEF
  • Time Slow - +6 SPD
  • Freikugel - 35 fixed damage, costs 10% HP
  • Spectral Exonorator - Swap all stats with opponent

Battle Arenas

Background: deathbattle.pngDefault arena with celestial theme

Ranked Mode

  • Restricted to specific guild (ID: 1362084781134708907)
  • Both fighters must consent
  • All fighters adjusted to 90% aura
  • Results tracked in competitive ratings
  • Weighted score (WS) calculated based on wins/losses
// From battle.ts:989-995
await BattleStatsManager.recordBattle(
  winner.user.id,
  winner.user.tag,
  loser.user.id,
  loser.user.tag,
  turn,
  winner.hp,
  winner.maxHp,
  isRanked,
  interaction.guildId || undefined,
);
Only one battle can occur per server at a time. Fighters cannot participate in multiple battles simultaneously.

/battlestats

View battle statistics and leaderboards for the deathbattle system.

Subcommands

user

View a user’s battle statistics.
user
User
The warrior whose stats to view (defaults to yourself)
mode
String
View normal, ranked, or all stats (defaults to normal)
  • Normal: Casual battle stats
  • Ranked: Competitive battle stats
  • All: Combined statistics
Stats Displayed:
  • Total wins and losses
  • Win rate percentage
  • Total games played
  • Last game timestamp
  • Win-Loss ratio
  • Current streak (wins or losses)
  • Longest win streak
  • Longest loss streak
  • Weighted Score (for ranked mode)

leaderboard

View the top warriors leaderboard.
mode
String
View normal or ranked leaderboard (defaults to normal)
  • Normal: Casual battle rankings
  • Ranked: Competitive battle rankings
limit
Integer
Number of entries to show (1-100, defaults to 10)
Leaderboard Format:
  • Rank position
  • User tag
  • Win-Loss record
  • Win rate percentage
  • Weighted Score (ranked mode only)
// From battlestats.ts:31-40
.addStringOption((option) =>
  option
    .setName("mode")
    .setDescription("View normal, ranked, or all stats")
    .addChoices(
      { name: "Normal", value: "normal" },
      { name: "Ranked", value: "ranked" },
      { name: "All", value: "all" },
    )
)

/ship

Calculate compatibility between two users.
user1
User
First user to ship (random if not specified)
user2
User
Second user to ship (random if not specified)

Ship Calculation

Compatibility is deterministically calculated from display names:
// From ship.ts:46-58
function calculateShipPercentage(name1: string, name2: string): number {
  const realShipName = createRealShipName(name1, name2);
  const combinedNames = realShipName.toLowerCase();
  let hash = 0;

  for (let i = 0; i < combinedNames.length; i++) {
    const char = combinedNames.charCodeAt(i);
    hash = (hash << 5) - hash + char;
    hash = hash & hash;
  }

  return Math.abs(hash) % 101;
}

Ship Name Generation

Combines halves of both names:
// From ship.ts:28-32
function createShipName(name1: string, name2: string): string {
  const firstHalf = name1.slice(0, Math.ceil(name1.length / 2));
  const secondHalf = name2.slice(Math.floor(name2.length / 2));
  return firstHalf + secondHalf;
}

Compatibility Ratings

PercentageRatingFlavor Text
100%Soulmates! 💗“The stars have aligned perfectly!“
95-99%Perfect Couple! 😍“Written in the heavens above!“
80-94%Pretty Good! 😳“Ego has blessed this pairing!“
60-79%Great Match! 😊“There’s potential here…“
40-59%Maybe Not… 🙂“Perfectly balanced…“
20-39%Not Too Great… 😕“The spirits advise distance…“
1-19%Terrible Match… 😬“May Ego have mercy…“
0%Would Beat Each Other… 💔“May Ego have mercy on their souls…”

Visual Design

Ship images use different backgrounds based on compatibility:
  • ≥60%: Pink/romantic theme (ship.png)
  • <60%: Gray/neutral theme (ship2.png)

/russian

Play Russian Roulette with another user.
target
User
required
The user to challenge

Game Rules

1

Challenge & Consent

Both players must accept within 15 seconds
2

Setup

One bullet randomly placed in 6 chambers
3

Turns

Players take turns choosing an action
4

Game End

Game ends when someone gets shot or 5 minutes elapse

Available Actions

💥 Shoot

Fire at opponentIf bullet: opponent dies, you winIf empty: chamber advances, turn passes

🎲 Shoot Yourself

Fire at yourselfIf bullet: you die, opponent winsIf empty: gain bonus turn (cannot use consecutively)

⏭️ Pass

Skip turnPass gun to opponent

Turn Timer

  • 30 seconds per turn
  • Auto-pass if time expires
  • Gun automatically passes to opponent

Statistics Tracking

// From russian.ts:516-525
await RussianStatsManager.recordGame(
  winner.id,
  winner.tag,
  victim.id,
  victim.tag,
  turns,
  currentSlot + 1,
  cause,
  interaction.guildId || undefined,
);
Tracked data:
  • Winner and victim
  • Number of turns
  • Chamber number (1-6)
  • Cause of death (“shot” or “shot_self”)
  • Guild ID for server-specific stats
Only one Russian Roulette game can be active per server. Players cannot participate in multiple games simultaneously.

/russianstats

View Russian Roulette statistics and leaderboards.

Subcommands

user

View a user’s Russian Roulette statistics.
user
User
The player whose stats to view (defaults to yourself)
Stats Displayed:
  • Total wins and losses
  • Win rate percentage
  • Total games played
  • Last game timestamp
  • Win-Loss ratio
  • Current streak (wins or losses)
  • Longest win streak
  • Longest loss streak
  • Recent match history (last 5 games)
// From russianstats.ts:44-60
embed.addFields(
  { name: "🏆 Wins", value: stats.wins.toString(), inline: true },
  { name: "💀 Losses", value: stats.losses.toString(), inline: true },
  { name: "📈 Win Rate", value: `${stats.winRate}%`, inline: true },
  { name: "🎯 Total Games", value: stats.totalGames.toString(), inline: true },
  { name: "🗓️ Last Game", value: formatRelativeTimestamp(stats.lastGameAt), inline: true },
  { name: "⚖️ Ratio", value: `${stats.wins}W-${stats.losses}L`, inline: true },
);

leaderboard

View the top Russian Roulette players leaderboard.
limit
Integer
Number of entries to show (1-100, defaults to 10)
Leaderboard Format:
  • Rank position
  • User tag
  • Win-Loss record
  • Win rate percentage
  • Total games played
Leaderboard is sorted by wins first, then by win rate as a tiebreaker.

/oracle

8-ball style fortune telling command.
question
String
required
The question to ask (max 1024 characters)

Response Categories

The oracle provides 20 possible responses: Positive (9):
  • “The divine winds favor thee.”
  • “Alteruism shines upon thy path.”
  • “The oracles decree: Yes.”
  • “The answer is yes.”
  • “Signs point to divine approval.”
  • (and 4 more…)
Uncertain (5):
  • “The mists of fate cloud the answer. Try again.”
  • “The oracles are silent. Ask again later.”
  • “Cannot predict now.”
  • (and 2 more…)
Negative (6):
  • “Do not count on it.”
  • “The sacred decree is no.”
  • “The spirits say nay.”
  • “The omens are not favorable.”
  • (and 2 more…)

/furry

Detect furry energy levels in users.
target
User
User to check (random if not specified)

Detection System

// From furry.ts:72-74
const nameHash = hashString(displayName);
const furryLevel = (nameHash % 100) + 1;
const isFurry = furryLevel >= 50;

Fursona Assignment

If detected as furry (≥50%), assigns a fursona from categories:
Wolf, Fox, Dog, Coyote, Jackal, Dingo

Display Format

Shows:
  • Furry Level percentage
  • Fursona (species and category) if applicable
  • Color-coded embed (pink for furry, gray for non-furry)
Results are deterministic based on display name. The same name will always produce the same furry level.

Build docs developers (and LLMs) love