{"id":22246129,"url":"https://github.com/dawnbrandbots/emcee-tournament-bot","last_synced_at":"2025-07-28T02:33:28.087Z","repository":{"id":38357307,"uuid":"271991538","full_name":"DawnbrandBots/emcee-tournament-bot","owner":"DawnbrandBots","description":"A Discord bot to facilitate organising Challonge tournaments and verify submitted decks.","archived":false,"fork":false,"pushed_at":"2024-11-24T18:53:03.000Z","size":2779,"stargazers_count":3,"open_issues_count":16,"forks_count":1,"subscribers_count":3,"default_branch":"master","last_synced_at":"2024-11-24T19:36:47.732Z","etag":null,"topics":["challonge","discord","discord-bot","discord-js","discordjs","docker","tournament","tournament-manager","ts","typescript","yu-gi-oh","yugioh"],"latest_commit_sha":null,"homepage":"","language":"TypeScript","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"agpl-3.0","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/DawnbrandBots.png","metadata":{"files":{"readme":"README.md","changelog":"changelog.md","contributing":".github/CONTRIBUTING.md","funding":".github/FUNDING.yml","license":"COPYING","code_of_conduct":".github/CODE_OF_CONDUCT.md","threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":".github/SECURITY.md","support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null},"funding":{"github":null,"patreon":"alphakretinbots","open_collective":null,"ko_fi":"dawnbrandbots","tidelift":null,"community_bridge":null,"liberapay":null,"issuehunt":null,"otechie":null,"custom":null}},"created_at":"2020-06-13T10:58:57.000Z","updated_at":"2024-11-24T18:53:06.000Z","dependencies_parsed_at":"2024-06-06T04:23:11.585Z","dependency_job_id":"adae7ad5-9c6f-473a-8cdc-5faa2f70e009","html_url":"https://github.com/DawnbrandBots/emcee-tournament-bot","commit_stats":null,"previous_names":[],"tags_count":9,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/DawnbrandBots%2Femcee-tournament-bot","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/DawnbrandBots%2Femcee-tournament-bot/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/DawnbrandBots%2Femcee-tournament-bot/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/DawnbrandBots%2Femcee-tournament-bot/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/DawnbrandBots","download_url":"https://codeload.github.com/DawnbrandBots/emcee-tournament-bot/tar.gz/refs/heads/master","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":227859471,"owners_count":17830593,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["challonge","discord","discord-bot","discord-js","discordjs","docker","tournament","tournament-manager","ts","typescript","yu-gi-oh","yugioh"],"created_at":"2024-12-03T05:26:13.741Z","updated_at":"2025-07-28T02:33:28.074Z","avatar_url":"https://github.com/DawnbrandBots.png","language":"TypeScript","funding_links":["https://patreon.com/alphakretinbots","https://ko-fi.com/dawnbrandbots"],"categories":[],"sub_categories":[],"readme":"# Emcee [\u003cimg src=\"https://img.shields.io/static/v1?label=invite%20to\u0026message=Discord\u0026color=informational\u0026style=for-the-badge\" alt=\"Invite to Discord\" align=\"right\" /\u003e](https://discord.com/api/oauth2/authorize?client_id=691882968809209917\u0026permissions=275146467392\u0026scope=bot)\n\n\u003c!-- Unfortunately, GitHub Markdown sanitizes style attributes, so we will have to use a deprecated HTML attribute. --\u003e\n[\u003cimg src=\"https://cdn.discordapp.com/avatars/691882968809209917/1ffd7675f6fb2a4c21b1b356b7856279.png\" alt=\"Emcee avatar\" align=\"right\" /\u003e](https://yugipedia.com/wiki/MC)\n\n[![Compile and test](https://github.com/DawnbrandBots/emcee-tournament-bot/actions/workflows/node.js.yml/badge.svg)](https://github.com/DawnbrandBots/emcee-tournament-bot/actions/workflows/node.js.yml)\n[![Build Docker image](https://github.com/DawnbrandBots/emcee-tournament-bot/actions/workflows/docker.yml/badge.svg)](https://github.com/DawnbrandBots/emcee-tournament-bot/actions/workflows/docker.yml)\n[![CodeQL](https://github.com/DawnbrandBots/emcee-tournament-bot/actions/workflows/codeql-analysis.yml/badge.svg)](https://github.com/DawnbrandBots/emcee-tournament-bot/actions/workflows/codeql-analysis.yml)\n[![Coverage Status](https://coveralls.io/repos/github/DawnbrandBots/emcee-tournament-bot/badge.svg?t=iUM0Et)](https://coveralls.io/github/DawnbrandBots/emcee-tournament-bot)\n\nA Discord bot to facilitate organising Yu-Gi-Oh! tournaments online using [Challonge](https://challonge.com/) and verify submitted decks.\nSpecial thanks to [Joseph Rothschild](https://www.youtube.com/c/MBTYuGiOh) aka [MBT](https://www.twitch.tv/mbtyugioh) for\nsponsoring the development of Emcee.\n\nEmcee automates the tedious tasks of the sign-up process, deck checks, and tracking match scores for tournament hosts.\nThis frees up hosts to focus on the overall flow of the tournament and any disputes instead of a lot of repetitive work.\nIt currently supports hosting Swiss tournaments of up to 256 participants (a limitation of Challonge's [standard tier](https://challonge.com/pricing))\nwith an optional single-elimination top cut of configurable size. Submitted deck files (.ydk) or `ydke://` URLs are\nautomatically verified against the current TCG card pool and Forbidden \u0026 Limited List, or a tournament host-provided\ncustom card pool. This was used for the [Chalislime Monthly](https://www.youtube.com/playlist?list=PLMr2265yrWMzCGkNlWLuyhv8rXCiN53Oi) tournament series.\n\nA secondary manual mode only provides a tournament registration workflow independent of Challonge.\nProspective participants submit screenshots of their deck, such as from Yu-Gi-Oh! Master Duel,\nand tournament hosts manually approve or reject these submitted decks.\nThe registered participant list may be downloaded at any time for use with other tournament software.\nThis was used for the [Master Circuit Series](https://www.youtube.com/playlist?list=PLMr2265yrWMyO7fDASPaubxIgCZcAXpKD).\nPlease contact us in the support server to enable the manual mode in your server.\n\n**❗ [Request for Comments: Emcee's future is uncertain](https://github.com/DawnbrandBots/emcee-tournament-bot/issues/395). Your input is appreciated!**\n\n## Discord permissions\n\nPlease make sure you use an [invite link](https://discord.com/api/oauth2/authorize?client_id=691882968809209917\u0026permissions=275146467392\u0026scope=bot) that automatically grants the following permissions.\n\n- Manage Roles: Emcee creates a role to designate Tournament Organisers upon joining a server and will create and delete participant roles for each tournament.\n- Send Messages\n- Manage Messages: Emcee automatically removes reactions from \"reaction buttons\" if participants are dropped via commands.\n- Embed Links: Emcee sends deck profiles in the form of a Discord rich embed.\n- Attach Files: Emcee attaches a YDK file to deck profiles.\n- Read Message History\n- Add Reactions: Emcee uses a \"reaction button\" for tournament registration.\n\nPrivileged gateway intents required:\n\n- Server members intent: Emcee removes participants from tournaments if they leave the server.\n\n## Usage\n\nAfter Emcee joins your server, you can ping it to confirm that it is working.\nYou can set permissions for Emcee so it is allowed to access only specific channels and locked out of the rest.\nIf you do not want people to use Emcee in a channel, deny Emcee access to the channel.\nHowever, if Emcee does have access to a channel, make sure it has the full range of permissions listed above.\n\nWhen Emcee joins your server, it will automatically create an `MC-TO` role to identify tournament hosts.\nGive this role to anybody who needs to be able to control Emcee to host tournament. Only users with the\nrole will be allowed to list all tournaments on the server and create new ones. For developers, the name\nof the role can be changed by the `EMCEE_DEFAULT_TO_ROLE` environment variable. In the future, the name\nand colour of this role will be configurable per server. For now, please do not delete the role,\nrename the role, or create another role with the same name \u0026mdash; Emcee will lose track of the role and\nrecreate it, or worse, identify authorised hosts with the incorrect role.\n\nThe default prefix for all Emcee commands is `mc!`. For developers, this can be changed by the `EMCEE_DEFAULT_PREFIX`\nenvironment variable. In the future, this will also be configurable per server. We may add support for\nDiscord slash commands in future when the feature is stable in Discord.\n\n- [Commands for tournament hosts](https://github.com/DawnbrandBots/emcee-tournament-bot/blob/master/docs/usage-organiser.md)\n- [Commands for participants](https://github.com/DawnbrandBots/emcee-tournament-bot/blob/master/docs/usage-participant.md)\n\n## Support server\n\n[![Support server invite](https://discordapp.com/api/guilds/381294999729340417/widget.png?style=banner3)](https://discord.gg/c3BPj2xESR)\n\n## Development\n\nEmcee is written in TypeScript. It targets Node.js 20+ and can be run with or without Docker.\nIt uses Discord.js to talk to Discord and PostgreSQL for persistence.\n\n\n1. Install Docker with Docker Compose, or install PostgreSQL.\n1. Start Postgres. You can start up just the Postgres container with `docker-compose up -d postgres`.\n1. Create a `.env` file with the required credentials and configuration. Examples below:\n    - In Docker:\n\n        ```\n        POSTGRES_HOST_PORT=127.0.0.1:5432\n        POSTGRES_USER=\n        POSTGRES_PASSWORD=\n        POSTGRES_DB=\n        DISCORD_TOKEN=\n        CHALLONGE_USERNAME=\n        CHALLONGE_TOKEN=\n        OCTOKIT_TOKEN=\n        EMCEE_DEFAULT_PREFIX=mc!\n        EMCEE_DEFAULT_TO_ROLE=MC-TO\n        ```\n\n    - Outside Docker:\n\n        ```\n        NODE_ENV=development\n        DEBUG=emcee:*\n        POSTGRESQL_URL=postgresql://USER:PASSWORD@localhost:5432/DBNAME\n        DISCORD_TOKEN=\n        CHALLONGE_USERNAME=\n        CHALLONGE_TOKEN=\n        OCTOKIT_TOKEN=\n        EMCEE_DEFAULT_PREFIX=mc!\n        EMCEE_DEFAULT_TO_ROLE=MC-TO\n        ```\n\n1. Start Emcee.\n    - In Docker: `docker-compose up --build` and wait for the image to build.\n    - Outside Docker: `yarn \u0026\u0026 yarn build \u0026\u0026 node --enable-source-maps dist`.\n\nPlease use Australian English spellings.\n\n## Licence\n\nCopyright © 2020\u0026ndash;2025 Luna Brand, Kevin Lu.\nSee [COPYING](https://github.com/DawnbrandBots/emcee-tournament-bot/blob/master/COPYING) for more details.\n\n```\nThis program is free software: you can redistribute it and/or modify\nit under the terms of the GNU Affero General Public License as published\nby the Free Software Foundation, either version 3 of the License, or\n(at your option) any later version.\n\nThis program is distributed in the hope that it will be useful,\nbut WITHOUT ANY WARRANTY; without even the implied warranty of\nMERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\nGNU Affero General Public License for more details.\n\nYou should have received a copy of the GNU Affero General Public License\nalong with this program.  If not, see \u003chttps://www.gnu.org/licenses/\u003e.\n```\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fdawnbrandbots%2Femcee-tournament-bot","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fdawnbrandbots%2Femcee-tournament-bot","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fdawnbrandbots%2Femcee-tournament-bot/lists"}