Skip to content

SyntaxNyah/Nyathena

 
 

Repository files navigation

Athena logo

Nyathena

Nyathena is a fork of Athena a lightweight AO2 (Attorney Online 2) server written in Go. It is maintained by SyntaxNyah with huge credits to OmniTroid fur supporting this project with many bug fixes, improvements and code cleanup. Huge shoutouts to them. Full credit for the original server, its design, and everything it's built on goes to MangosArentLiterature.

This started as a personal server project and kind of spiralled. One punishment command becoming ten, a casino system, tag system, account system, a bunch of mini games and the whole time it kept being fun to add things, which is not always how software development goes. That's entirely down to how well Athena is built. Adding a new feature rarely meant slow build times or having to debug for hours in the codebase. It usually just meant writing the thing.

This fork is a 90+ command punishment system designed to give moderators a ridiculous, embarrassing amount of creative control over players to abuse as much as they want and mess with whether it be; backwards text, forced haiku, dere archetypes, voice corruption, coinflip PvP challenges. It's purposefully excessive and a little sadistic, and that's the point. Abuse players to your hearts content! Beyond that: a Discord bot, a casino with 11 games, a full Mafia minigame, server-relayed voice chat over websockets, and a lot of smaller quality-of-life things that accumulated over time.


What's Different From Upstream Athena

Punishment System (100+ Commands)

This is the main thing Nyathena exists for. All punishment commands support -d <duration>, -r <reason>, -h (hidden — applies silently without notifying the target), and the global keyword (applies to every non-moderator in the area). They accept comma-separated UIDs, auto-expire, and stack freely.

Text Effects (46): /whisper, /backward, /stutterstep, /elongate, /uppercase, /lowercase, /robotic, /alternating, /fancy, /uwu, /pirate, /shakespearean, /caveman, /censor, /fromsoftware, /confused, /paranoid, /drunk, /hiccup, /whistle, /mumble, /slang, /cherri, /albhed, /morse, /vowelhell, /upsidedown, /autospell, /thesaurusoverload, /valleygirl, /babytalk, /thirdperson, /unreliablenarrator, /uncannyvalley, /chef, /karen, /passiveaggressive, /nervous, /sarcasm, /academic, /philosopher, /poet, /quote, /spaghetti, /essay, /rng, /haiku, /dreamsequence, /timewarp

Themed Quote Replacers (10): /gordonramsay (60+ kitchen tirades), /biblebot, /grounded, /mime, /subtitles, /spotlight, /recipe, /rickroll, /pickup, /brainrot

Persona / Personality (5): /clown, /jester, /joker, /tourettes, /translator (via DeepL API)

Dere Archetypes (26): /tsundere, /yandere, /kuudere, /dandere, /deredere, /himedere, /kamidere, /undere, /bakadere, /mayadere, /smugdere, /deretsun, /bokodere, /thugdere, /teasedere, /dorodere, /hinedere, /hajidere, /rindere, /utsudere, /darudere, /butsudere, /sdere, /mdere, /tsuyodere, and /omnidere (random dere flavour on every single message — maximum tonal whiplash).

Animal Filters (12): /monkey, /snake, /dog, /cat, /bird, /cow, /frog, /duck, /horse, /lion, /zoo, /bunny

Visibility / Cosmetic (6): /emoji, /invisible, /shrink, /grow, /wide, /areainiswap

Timing (3): /slowpoke, /fastspammer, /lag

Audio (2): /sfxcurse <uid> <sfx-url> (forces an SFX on every IC message), /unsfx

Stacking / Chaos: /stack (supports many punishments examples including but not limited to; global), /torment, /lovebomb, /degrade, /emoticon, /51, /icwarp, /randompunishall, /togglerandompunish

/stack <type1> <type2> [...] [-d duration] [-r reason] [-h] global | <uid>

Tournament mode: /tournament start|status|stop — volunteers get 2–3 random punishments; most IC messages sent wins.

Self-applied: /maso (random single effect, rerolls on repeat) and /megamaso (each call stacks another random punishment on top — you can pile on as many as you like).

PvP: /coinflip <heads|tails> — area-scoped 30-second challenge where both players must pick opposite sides.

Remove: /unpunish <uid> (everything including lag), /unpunish -t <type> <uid> (specific), or /unpunish all (entire area). Regular mods cannot lift punishments applied by an admin or shadow mod.

Server-Relayed Voice Chat (enable_voice = true)

Compatible clients only. Voice chat requires a WebSocket-capable AO2 client that implements the Nyathena voice protocol. The two known working clients are webao.miku.pizza (SyntaxNyah's hosted WebAO instance) and LemmyAO, SyntaxNyah's fork of the AO2 desktop client. Standard AO2 and unmodified WebAO builds do not support voice and will simply not see the voice channel.

Audio travels client → Athena → area peers. There is no peer-to-peer path, so players never learn each other's IPs from the voice connection. The server relays 20 ms Opus frames at 48 kHz as opaque base64 blobs — it never decodes audio, so the relay is CGO-free and codec-agnostic.

Voice punishment commands (manipulate the frame flow, not the audio signal itself):

  • /voicemute — drops every frame; silent to the room
  • /voicestatic — drops ~60% of frames; choppy and breaking up
  • /voicegarble — drops ~88% of frames; barely intelligible
  • /voicecutout — gates frames on a ~650 ms on/off cycle; walkie-talkie effect
  • /voicestutter — randomly replays the previous frame; glitchy voice stutter

Moderation: /vmute, /vban, /voicearea on|off, per-area join and frame rate limits, new-IPID cooldown.

Casino System (enable_casino = true)

Virtual currency (Nyathena Chips) stored in SQLite. New players start with 500 chips; cap is 10,000,000.

Game Command
Blackjack (6-deck, split/double/insurance, up to 6 players) /bj
Texas Hold'em (up to 9 players, 500-chip buy-in) /poker
Slots with area jackpot pool /slots
European Roulette (single-zero) /croulette
Baccarat (player / banker / tie) /baccarat
Craps (pass / don't-pass) /craps
Crash multiplier /crash
Minesweeper grid (1–24 mines, 5×5) /mines
Keno (pick 1–10 from 1–80) /keno
Prize wheel (~92.5% RTP) /wheel
Bar (33 drinks of wildly varying variance) /bar

Economy: /chips, /chips top, /chips give, /richest. Earn passively via jobs (/busker, /janitor, /paperboy, /clerk, /bailiffjob) or win unscramble events that fire every 30 min–3 h.

Shop (/shop): 30 cosmetic tags (1,000–10,000,000 chips), job cooldown reduction passes, job reward bonus passes.

Discord Bot Integration

A full Discord bot with slash commands, mod-bridge embeds, area/player listings, and live security toggles — so moderators can respond to incidents without being logged into the AO server.

Discord slash Effect
/firewall on|off Toggle IPHub VPN/proxy firewall
/lockdown on|off Toggle server-wide new-IPID lockdown
/lockdown whitelist_all Whitelist every currently-connected IPID

Mafia Social Deduction Minigame

Full in-server Mafia (4–20+ players) with automatic role pools, day/night phases, lynch voting, night actions, last wills, graveyard, whisper, and phase timers.

Town: Villager, Detective, Doctor, Sheriff, Bodyguard, Vigilante, Mayor, Escort
Mafia: Mafia, Shapeshifter, Godfather
Neutral: Jester, Witch, Lawyer, Arsonist, Serial Killer, Survivor

See MAFIA_COMMANDS.md for the full reference.

Potions System

Self-applied fun effects via /potion <name> (default 5 min, -d to override). /potions lists the cabinet; /potion off flushes everything.

Available potions: drunk, uwu, shy, dramatic, pirate, poet, caveman, fancy, chef, cherri, omnidere, character (auto-rotates your sprite every 30 seconds).

AutoMod

Word-list-based enforcement covering IC text, IC showname, OOC text, and OOC username. Actions: ban, kick, mute, or torment.

IPHub VPN Firewall

When iphub_api_key is set, new connections are checked against IPHub. Known IPs are cached permanently so repeat visitors never cost an API call (respects the 1,000 req/day free tier). Toggle in-game or via Discord.

Custom Tags (Admin)

Admins create cosmetic tags at runtime without touching config files or rebuilding.

/createtag <id> <display name>
/grantcustomtag <username> <tag_id>
/revokecustomtag <username> <tag_id>
/deletetag <id>
/listcustomtags

Custom tags never appear in /shop and can only be granted by an admin.

Per-Area Logging

Daily-rotating log files per area under logs/<AreaName>/. Format: [HH:MM:SS] | ACTION | CHARACTER | IPID | HDID | SHOWNAME | OOC_NAME | MESSAGE. Enable with enable_area_logging = true.

Persistent Pairing

UID-based mutual pairing that survives area and character changes. Pair messages use each player's showname when set. /unpair does a full bidirectional reset — no stale pair state left on the peer.

Other Additions

  • Doki Area Effect — literature-club-themed chaos per area (doki_area = true in areas.toml)
  • Shadow Mod Visibility — shadow mods are invisible in /gas//players to non-admins
  • /charshuffle / /uncharshuffle — Sattolo-permutes everyone's character sprite; originals remembered
  • /reversename / /unreversename — flips showname rune order; stacks cleanly with /forcename
  • /charcurse <uid> <charname> — one-time forced character swap
  • /rps — PvP rock-paper-scissors with hidden simultaneous commitment
  • /randomsong tiered cooldown (user / DJ / mod)
  • /randomchar DJ and mod cooldown bypass
  • /getmusic — re-sends the current music packet to the requester's client
  • /8ball <question> — customisable response pool via config/8ball.txt
  • /resetusername — account rename (capped at 3 per account)
  • /playtime top pagination (25 per page, pass a page number)
  • /reloadplaytime — admin IPID re-link and orphan playtime merge
  • /profile DJ insignia (💿 shown for players with the DJ permission bit)
  • /global shows the sender's tag in the prefix
  • /gas hides empty areas with a count at the bottom
  • Locked-room kick lockout bug fix (kicked players can no longer walk back in)
  • Hot Potato, Quick Draw, Chip Giveaway, Area Roulette minigames
  • Wardrobe management, /possess, in-place server restart via syscall.Exec

Inherited Features (Upstream Athena)

  • WebAO (plain WebSocket)
  • Concurrent client handling
  • Moderator user system with configurable TOML roles and permission bitfields
  • Privacy-oriented logging
  • Testimony recorder
  • CLI command parser (mkusr, etc.)
  • bcrypt password storage

Quick Start

make build
cp -r config_sample config
# edit config/config.toml, areas.toml, roles.toml, etc.
./bin/athena
# then in the CLI prompt:
mkusr

Pass -c /path/to/config for a custom config directory. Pass -nocli to disable stdin.

Binaries for common platforms are on the releases page.


Configuration

Key options beyond upstream defaults (config/config.toml):

Key Purpose
enable_casino Enable casino and player accounts
iphub_api_key IPHub key for VPN/proxy firewall
automod_enabled / automod_action AutoMod word enforcement
enable_voice Server-relayed voice chat
enable_area_logging Per-area rotating log files
webhook_url Discord webhook for modcall notifications
punishment_webhook_url Discord webhook for ban/kick embeds
[Discord] bot_token / guild_id Discord bot credentials

See CLAUDE.md for the full configuration reference.

WSS Setup

Via reverse proxy (recommended for Cloudflare):

enable_webao_secure = true
webao_secure_port   = 443
# leave tls_cert_path / tls_key_path empty

Direct TLS:

enable_webao_secure = true
webao_secure_port   = 443
tls_cert_path       = "/path/to/cert.crt"
tls_key_path        = "/path/to/key.key"

Building From Source

Go 1.19+ required.

make build    # produces bin/athena
make test     # go test -v -race ./...
make all      # build + test
make release  # goreleaser

License

GNU Affero General Public License v3.0, inherited from upstream Athena.


Credits

Upstream Athena by MangosArentLiterature

None of this would exist without Athena and MangosArentLiterature's work on it.

Picking Go for an AO2 server was genuinely one of the best decisions that could have been made. And the result is a codebase that stays readable under the kind of chaotic mess that Nyathena has become. Adding a new command never feels like a chore its super simple and easy.

Spending months adding feature after feature to Nyathena and genuinely enjoying it the whole time is a testament to how clean the original upstream base is is.

The package layout makes alot of sense. The addition of using a TOML config is easy to extend. The permission system is flexible without being overengineered and I was able to extend it to things such as full on account systems. Every time something new needed to be integrated in, it went in without too much trouble. The discord bot, the casino, the voice relay, the punishment system with its considerly bloated amounts of code, all of it hooks into structure that MangosArentLiterature laid down first, and all of it hangs together because the base is solid.

If you're running an AO2 server and don't need the chaos layer, please use upstream Athena. It's focused, well-tested, and exactly what it sets out to be. Nyathena is the chaotic abusive insanity fork that spiraled way way way further away from upstream Athena. If you want a solid AO experience without any bloat, it's recommended to use the real thing.

Genuine thanks and full credit to MangosArentLiterature for building something this good to start from.


Nyathena fork and most additions by SyntaxNyah with support, extra additions, bug fixes and cleanup from OmniTroid.

About

An Attorney Online 2 server written in Go

Resources

License

Stars

Watchers

Forks

Packages

 
 
 

Contributors

Languages

  • Go 100.0%