{"id":43023670,"url":"https://github.com/kernoeb/jean_racine_bot","last_synced_at":"2026-01-31T06:39:34.523Z","repository":{"id":37739942,"uuid":"396100693","full_name":"kernoeb/jean_racine_bot","owner":"kernoeb","description":"Discord Root-Me bot - built with Discord.js","archived":false,"fork":false,"pushed_at":"2023-08-04T14:23:22.000Z","size":65826,"stargazers_count":19,"open_issues_count":0,"forks_count":2,"subscribers_count":2,"default_branch":"main","last_synced_at":"2024-05-01T16:25:21.974Z","etag":null,"topics":["bot","ctftime","discord","discord-js","rootme"],"latest_commit_sha":null,"homepage":"","language":"JavaScript","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":null,"status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/kernoeb.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":".github/FUNDING.yml","license":null,"code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null},"funding":{"github":["kernoeb"],"ko_fi":"kernoeb"}},"created_at":"2021-08-14T18:55:58.000Z","updated_at":"2024-01-19T13:23:09.000Z","dependencies_parsed_at":"2022-07-13T16:44:27.920Z","dependency_job_id":null,"html_url":"https://github.com/kernoeb/jean_racine_bot","commit_stats":null,"previous_names":[],"tags_count":0,"template":false,"template_full_name":null,"purl":"pkg:github/kernoeb/jean_racine_bot","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/kernoeb%2Fjean_racine_bot","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/kernoeb%2Fjean_racine_bot/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/kernoeb%2Fjean_racine_bot/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/kernoeb%2Fjean_racine_bot/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/kernoeb","download_url":"https://codeload.github.com/kernoeb/jean_racine_bot/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/kernoeb%2Fjean_racine_bot/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":28931404,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-01-31T04:05:25.756Z","status":"ssl_error","status_checked_at":"2026-01-31T04:02:35.005Z","response_time":128,"last_error":"SSL_read: unexpected eof while reading","robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":false,"can_crawl_api":true,"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":["bot","ctftime","discord","discord-js","rootme"],"created_at":"2026-01-31T06:39:34.083Z","updated_at":"2026-01-31T06:39:34.512Z","avatar_url":"https://github.com/kernoeb.png","language":"JavaScript","funding_links":["https://github.com/sponsors/kernoeb","https://ko-fi.com/kernoeb"],"categories":[],"sub_categories":[],"readme":"# Jean Racine\n\n### RootMe bot\n\nRoot-Me Discord bot using `Discord.js` and Slash Commands.  \nbuilt by [@kernoeb](https://www.root-me.org/kernoeb).\n\n### Features\n\n- Add user / Remove user\n- Scoreboard with auto update / refresh\n- Notifications (new challenge added or succeed, new validation, new solution)\n- Search a user or a challenge id\n- Information about a challenge or a user\n- Chart (leaderboard)\n\n### Commands\n\n`/adduser \u003cid\u003e` : Add a user (id)  \n`/challenge \u003cid_or_name\u003e` : Information about a challenge  \n`/chart` : Leaderboard chart  \n`/createglobalscoreboard` : Create a global scoreboard  \n`/deluser \u003cid\u003e` : Delete a user (id)  \n`/getlastchallenges` : Get the last challenges   \n`/help` : Help  \n`/init` : Initialize the bot in the channel  \n`/ping` : Ping pong  \n`/scoreboard \u003ccategory\u003e` : Scoreboard (with optional category)  \n`/searchuser \u003cname\u003e` : Search a user by name  \n`/user \u003cid_or_name\u003e` : Information about a user (id or name)  \n`/topctftime \u003clocale\u003e` : CTFTime TOP 10 (global / country)  \n`/nextctf \u003cnumberctf\u003e` : Next CTF of week (CTFTime)  \n`/pickctf \u003cid\u003e` : Vote for a specific CTF (CTFTime)\n\n---\n\n## Prerequisites\n\n- Docker \u003e 20\n- Create a Discord bot and invite it : https://discord.com/api/oauth2/authorize?client_id=xxxx\u0026permissions=2684472384\u0026scope=applications.commands%20bot (replace xxxx with the bot client id)\n\n\u003e I'm using Docker version 20.10.x and Docker Compose (not docker-compose)\n\n## Installation\n\n- Clone the repository, or only download `.env.example`, `docker-compose.yml` and `update.sh` :\n\n```bash\nmkdir -p ./jean_racine \u0026\u0026 cd ./jean_racine\ncurl https://raw.githubusercontent.com/kernoeb/jean_racine_bot/main/update.sh -o update.sh\ncurl https://raw.githubusercontent.com/kernoeb/jean_racine_bot/main/docker-compose.yml -o docker-compose.yml\ncurl https://raw.githubusercontent.com/kernoeb/jean_racine_bot/main/.env.example -o .env.example\nchmod u+x update.sh\n```\n\nYou can also add the Dockerfile if you want to build the image by yourself\n\n- Get an API Key on Root-Me [here](https://www.root-me.org/?page=preferences)\n- Copy `.env.example` to `.env` and replace variables\n\n\u003e API_KEY is the main Root-Me API Key (premium is better!).  \n\u003e API_KEY_FIRST can be used to get all non-premium challenges, to avoid a lot of requests on your account  \n\u003e You can use an api key or a cookie\n\n```bash\nmkdir -p /opt/jeanracine\nchown -R 1001 /opt/jeanracine\n./update.sh\n```\n\n- Wait for the bot to load all the challenges (it can take a long time)\n\n\u003e Please note that registering the slash commands in Discord can take a **long time**. You can force it by using **Routes.applicationGuildCommands**, located in the register_slash_commands file\n\nIf this does not work -\u003e `kernoeb#7737` on Discord, [@kernoeb](https://t.me/kernoeb) on Telegram :)\n\n### Crontab\n\nYou can also add a cron to automatically update the bot ([crontab.guru](https://crontab.guru/) is a good tool)\n\nSomething like `0 0 * * * cd /path/to/jeanracine/ \u0026\u0026 ./update.sh`\n\n#### Optional :\n\nAdd this to your `.bashrc` :\n\n```\nfunction jeanracinelogs() {\n  if [ $# -eq 0 ]\n  then\n      docker logs jean_racine_bot-rootme_node-1 --tail 20 -f\n  else\n      docker logs jean_racine_bot-rootme_node-1 --tail $1 -f\n  fi\n}\n```\n\nOpen a new terminal, then try `jeanracinelogs`.\n\n### Force registering slash commands\n\n```bash\ndocker exec -it \u003cname-of-jean-racine-container\u003e register_slash_commands\n```\n\n---\n\n## Captures\n\n**Global Scoreboard**\n\n![Global Scoreboard](images/global_scoreboard.png)\n\n**Notifications**\n\n![Notifications 1](images/notifications_1.png)\n\n![Notifications 2](images/notifications_2.png)\n\n**Information about a user**\n\n![User info](images/img4.png)\n\n**Information about a challenge**\n\n![Challenge info](images/challenge.png)\n\n**Scoreboard with arrows**\n\n![Arrow scoreboard](images/arrow_scoreboard.png)\n\n**Last challenges**\n\n![Last challenges](images/last_challenges.png)\n\n**Charts**\n\n![img.png](images/chart.png)\n\n\n## Contributors\n\nThanks to [Antabuse](https://www.root-me.org/Antabuse) for his help for the CTFTime part of the bot !\n\n---\n\n### Similar projects\n\n- [RootMeBotV2](https://github.com/slowerzs/RootMeBotV2/) - [Slowerzs](https://www.root-me.org/Slowerzs)\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fkernoeb%2Fjean_racine_bot","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fkernoeb%2Fjean_racine_bot","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fkernoeb%2Fjean_racine_bot/lists"}