Anonymous Wolf Game Bot
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
Joey Hines 2aec084712
Keep dead player channels
3 months ago
src Keep dead player channels 3 months ago
.gitignore Added commands + persistence 7 months ago
.woodpecker.yml Add woodpecker config 4 months ago
Cargo.lock Added config for themes. Fixes #1 4 months ago
Cargo.toml Added config for themes. Fixes #1 4 months ago
LICENSE Initial commit 7 months ago Added config for themes. Fixes #1 4 months ago


Discord bot for managing an anonymous Werewolf Game.

How It Works

A host gets a list of players to play, and then begins the game with the $start command.

Each player is assigned a channel where they will view the game through. The player can read and send messages in this channel normally. When a message is sent, it is forwarded to all other player channels. The message's author is obscured by a codename. During day phases, players can cast a vote for who they wish to "terminate" that day.

The game proceeds as a normal Werewolf game.


  • Host Channel: Used by the host to interact with the game, can also be used by spectators to see the game state.
    • Real player names are displayed along with code names in this channel
  • Player Channel: A channel for a single player, allows them to chat with the other players and run commands.
  • Vote Channel: Contains all the votes made in a game.



  • $start <hours>h<minutes>m <list of player ids> - starts the game
  • $end - Ends the current game
  • $say <msg> - Allows the host to speak into the game chat
  • $broadcast <msg> - Broadcasts a system message, this message is then pinned in each player channel
  • $next_phase <hours>h<minutes>m <msg> - Send the next phase message. Also cycles the phase
  • $terminate <player> - Kills a player and removes them from the game
  • $add_time <hours>h<minutes>m - Adds more time to the current game


  • $vote <player> - Casts a vote for a player to be terminated. Only can be used during the day phase
  • $status - Get the current game status. Includes time left in the phase and current vote tallies
  • $players - Lists all the players in the game

Example Config

# Directory to store the game state in
game_state_dir = "."
# imgur API client id
imgur_client_id = ""

# Discord Bot Config
# Bot token
token = ""
# Bor app id
app_id = 0
# Channel for the host to interact the bot
host_channel = 949483310613143564
# Webhook id for the host channel
host_webhook_id = 955135068341415996
# CHannel to post vote status
vote_channel = 950078550717923329
# Category to create player channels under
category = 949766593322303518

# An example game config
# Game name, used to identify this config
game_name = "rouge_ai"
# The bot's name for this game
bot_name = "WOxlf"
# Vote phase name
vote_phase_name = "Day"
# Enemy phase name
enemy_phase_name = "Night"
# Imgur album hash for profile pics
profile_album_hash = "Raf84L4"
# PLayer group name
player_group_name = "Test Subjects"

# Names used for codename generation
first_name = ["Sleepy", "Drunk", "Smart", "Gifted", "Extreme", "Eccentric", "Amazing", "Bad", "Silly", "Dumb", "Smelly",
  "Gooey", "Ok", "Poor", "Fast", "Gentle", "Dangerous", "Spooky", "Soft", "Small", "Big"]

last_name = ["Engineer", "Scientist", "Dancer", "Farmer", "Captain", "Janitor", "Author", "Bartender", "Bum",
  "Student", "Teacher", "Chef", "Waiter", "Comedian", "Doctor", "Athlete", "Gamer"]

# Message config for this game
# Format of the codenames
name_format = "{{ first_name }} {{ last_name }}"

# Welcome message to send to players at the start of a game
welcome_message = '''
Welcome {{ discord_user.mention }} to your WOxlf Terminal. You may use this terminal to communicate to other subjects.
You will also use this terminal for choosing one of your fellow subjects for termination.

Happy testing :)

Do $help to see all commands.

**SUBJECT CODENAME: {{ player_data.codename }}**


# Status message format
status_message = '''
CURRENT EXPERIMENT PHASE: {{ game_state.current_phase }} {{ game_state.phase_number}}
PHASE END TIME: {{ to_local_time(time=game_state.phase_end_time) }}
PHASE ENDING {{ to_countdown(time=game_state.phase_end_time) }}

{% for player in game_state.player_data %}* {{ player.codename }}
{% endfor %}

# Wrapper for annoucments
announcement_format = '''
{{ message }}

# Vote tally message format
tally_message = '''
{% if tallies | length == 0 %} NO TERMIANTION VOTES HAVE BEEN CAST! {% else %}
{% for target, count in tallies %}* {{ target }}: {{ count }} {% endfor %}
{% endif %}

# Vote message format, used in the vote status channel
vote_message = "{{ player_data.codename }} has selected {{ target_data.codename }} for termination."

# Message to send whene extending a phase
phase_extend_message = "THE EXPERIMENT PHASE HAS BEEN EXTENDED!!!!"


MIT License