{"id":49754875,"url":"https://github.com/kieranmcm07/discord_moderation_bot","last_synced_at":"2026-06-15T17:00:25.118Z","repository":{"id":350965709,"uuid":"1208062804","full_name":"Kieranmcm07/Discord_Moderation_Bot","owner":"Kieranmcm07","description":"Feature-rich Discord moderation bot with tickets, AutoMod, appeals, activity tracking, music, and staff dashboards.","archived":false,"fork":false,"pushed_at":"2026-06-11T15:25:05.000Z","size":1340,"stargazers_count":1,"open_issues_count":0,"forks_count":0,"subscribers_count":0,"default_branch":"main","last_synced_at":"2026-06-11T16:22:13.784Z","etag":null,"topics":["appeals","automod","discord-bot","discord-py","moderation-bot","python","sqlite","tickets"],"latest_commit_sha":null,"homepage":"","language":"Python","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/Kieranmcm07.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null,"notice":null,"maintainers":null,"copyright":null,"agents":null,"dco":null,"cla":null}},"created_at":"2026-04-11T19:10:05.000Z","updated_at":"2026-06-11T15:26:41.000Z","dependencies_parsed_at":"2026-06-15T17:00:20.668Z","dependency_job_id":null,"html_url":"https://github.com/Kieranmcm07/Discord_Moderation_Bot","commit_stats":null,"previous_names":["kieranmcm07/discord_moderation_bot"],"tags_count":4,"template":false,"template_full_name":null,"purl":"pkg:github/Kieranmcm07/Discord_Moderation_Bot","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Kieranmcm07%2FDiscord_Moderation_Bot","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Kieranmcm07%2FDiscord_Moderation_Bot/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Kieranmcm07%2FDiscord_Moderation_Bot/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Kieranmcm07%2FDiscord_Moderation_Bot/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/Kieranmcm07","download_url":"https://codeload.github.com/Kieranmcm07/Discord_Moderation_Bot/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Kieranmcm07%2FDiscord_Moderation_Bot/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":34372130,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-05-26T15:22:16.424Z","status":"online","status_checked_at":"2026-06-15T02:00:07.085Z","response_time":63,"last_error":null,"robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":true,"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":["appeals","automod","discord-bot","discord-py","moderation-bot","python","sqlite","tickets"],"created_at":"2026-05-10T19:30:55.196Z","updated_at":"2026-06-15T17:00:25.108Z","avatar_url":"https://github.com/Kieranmcm07.png","language":"Python","funding_links":[],"categories":[],"sub_categories":[],"readme":"\u003c!--\n  ============================================================\n    Made by Kieranmcm07 on GitHub\n    GitHub: https://github.com/Kieranmcm07\n  ============================================================\n--\u003e\n\n\u003cp align=\"center\"\u003e\n  \u003cimg src=\"docs/assets/readme-banner.svg\" alt=\"Discord Moderation Bot banner\" width=\"100%\"\u003e\n\u003c/p\u003e\n\n\u003ch1 align=\"center\"\u003eDiscord Moderation Bot\u003c/h1\u003e\n\n\u003cp align=\"center\"\u003e\n  A polished \u003ccode\u003ediscord.py\u003c/code\u003e staff toolkit for keeping Discord communities cleaner,\n  calmer, and easier to run.\n  \u003cbr\u003e\n  Moderation, tickets, activity tracking, AutoMod, Sentinel, setup checks, and music tools\n  all live inside Discord.\n\u003c/p\u003e\n\n\u003cp align=\"center\"\u003e\n  \u003ca href=\"https://github.com/Kieranmcm07/Discord_Moderation_Bot/releases\"\u003e\n    \u003cimg alt=\"Latest release\" src=\"https://img.shields.io/github/v/release/Kieranmcm07/Discord_Moderation_Bot?style=for-the-badge\u0026color=5865F2\"\u003e\n  \u003c/a\u003e\n  \u003ca href=\"LICENSE\"\u003e\n    \u003cimg alt=\"MIT license\" src=\"https://img.shields.io/github/license/Kieranmcm07/Discord_Moderation_Bot?style=for-the-badge\u0026color=2ea043\"\u003e\n  \u003c/a\u003e\n  \u003cimg alt=\"Python 3.10+\" src=\"https://img.shields.io/badge/Python-3.10%2B-3776AB?style=for-the-badge\u0026logo=python\u0026logoColor=white\"\u003e\n  \u003cimg alt=\"discord.py 2.3+\" src=\"https://img.shields.io/badge/discord.py-2.3%2B-5865F2?style=for-the-badge\u0026logo=discord\u0026logoColor=white\"\u003e\n  \u003cimg alt=\"SQLite storage\" src=\"https://img.shields.io/badge/SQLite-local-044A64?style=for-the-badge\u0026logo=sqlite\u0026logoColor=white\"\u003e\n\u003c/p\u003e\n\n\u003cp align=\"center\"\u003e\n  \u003ca href=\"#staff-workflow\"\u003eWorkflow\u003c/a\u003e\n  |\n  \u003ca href=\"#features\"\u003eFeatures\u003c/a\u003e\n  |\n  \u003ca href=\"#screenshots\"\u003eScreenshots\u003c/a\u003e\n  |\n  \u003ca href=\"#setup\"\u003eSetup\u003c/a\u003e\n  |\n  \u003ca href=\"#command-overview\"\u003eCommands\u003c/a\u003e\n  |\n  \u003ca href=\"#configuration\"\u003eConfiguration\u003c/a\u003e\n\u003c/p\u003e\n\n\u003cp align=\"center\"\u003e\n  \u003cimg src=\"docs/assets/readme-moderation-loop.gif\" alt=\"Animated preview of the bot's staff dashboard, Sentinel radar, and moderation activity feed\" width=\"92%\"\u003e\n\u003c/p\u003e\n\n\u003cp align=\"center\"\u003e\n  \u003cstrong\u003eBuilt for busy staff teams:\u003c/strong\u003e\n  diagnose setup issues, handle incidents, open tickets, review cases, watch risk signals,\n  and keep community extras in one bot without a separate web dashboard.\n\u003c/p\u003e\n\n\u003e Tip: after inviting the bot, run `,doctor` in a server channel to check\n\u003e permissions, logging channels, and setup gaps before staff start using it.\n\n## Staff Workflow\n\n\u003ctable\u003e\n  \u003ctr\u003e\n    \u003ctd width=\"33%\" align=\"center\"\u003e\n      \u003cstrong\u003e1. Check The Setup\u003c/strong\u003e\u003cbr\u003e\n      Run \u003ccode\u003e,doctor\u003c/code\u003e to catch missing permissions, channel gaps, and setup issues\n      before staff need the bot under pressure.\n    \u003c/td\u003e\n    \u003ctd width=\"33%\" align=\"center\"\u003e\n      \u003cstrong\u003e2. Work From Mission Control\u003c/strong\u003e\u003cbr\u003e\n      Use \u003ccode\u003e,missioncontrol\u003c/code\u003e for server health, open tickets, moderation load,\n      activity signals, and suggested next actions.\n    \u003c/td\u003e\n    \u003ctd width=\"33%\" align=\"center\"\u003e\n      \u003cstrong\u003e3. Respond With Context\u003c/strong\u003e\u003cbr\u003e\n      Pull \u003ccode\u003e,member360\u003c/code\u003e, case history, Sentinel signals, chat logs, and tickets\n      into the same staff workflow.\n    \u003c/td\u003e\n  \u003c/tr\u003e\n\u003c/table\u003e\n\n## At A Glance\n\n\u003ctable\u003e\n  \u003ctr\u003e\n    \u003ctd width=\"25%\" align=\"center\"\u003e\n      \u003cstrong\u003eCommand Center\u003c/strong\u003e\u003cbr\u003e\n      Mission Control, Bot Doctor, setup checks, server health, and staff prompts.\n    \u003c/td\u003e\n    \u003ctd width=\"25%\" align=\"center\"\u003e\n      \u003cstrong\u003eCase Engine\u003c/strong\u003e\u003cbr\u003e\n      Warnings, bans, timeouts, notes, chat logs, escalation rules, and CSV exports.\n    \u003c/td\u003e\n    \u003ctd width=\"25%\" align=\"center\"\u003e\n      \u003cstrong\u003eSafety Automation\u003c/strong\u003e\u003cbr\u003e\n      AutoMod, Sentinel risk signals, invite logging, autoroles, and sticky messages.\n    \u003c/td\u003e\n    \u003ctd width=\"25%\" align=\"center\"\u003e\n      \u003cstrong\u003eCommunity Layer\u003c/strong\u003e\u003cbr\u003e\n      Tickets, appeals, reminders, AFK, reaction roles, custom commands, and music.\n    \u003c/td\u003e\n  \u003c/tr\u003e\n\u003c/table\u003e\n\n## Features\n\n\u003ctable\u003e\n  \u003ctr\u003e\n    \u003ctd width=\"50%\"\u003e\n      \u003cstrong\u003eComplete moderation workflow\u003c/strong\u003e\u003cbr\u003e\n      Ban, tempban, softban, kick, warn, timeout, clean messages, slowmode, add private notes,\n      export chat logs, and configure automatic warning escalations.\n    \u003c/td\u003e\n    \u003ctd width=\"50%\"\u003e\n      \u003cstrong\u003eCase history that staff can actually use\u003c/strong\u003e\u003cbr\u003e\n      Search cases, edit reasons, add follow-up comments, view recent actions, build compact\n      moderator summaries, and export case files as CSV.\n    \u003c/td\u003e\n  \u003c/tr\u003e\n  \u003ctr\u003e\n    \u003ctd width=\"50%\"\u003e\n      \u003cstrong\u003eMission Control dashboard\u003c/strong\u003e\u003cbr\u003e\n      See server health, moderation load, open tickets, activity, Sentinel status, and suggested\n      staff actions from inside Discord.\n    \u003c/td\u003e\n    \u003ctd width=\"50%\"\u003e\n      \u003cstrong\u003eMember 360 profiles\u003c/strong\u003e\u003cbr\u003e\n      Combine account age, moderation history, chat activity, voice time, and live Sentinel risk\n      signals into one staff-friendly view.\n    \u003c/td\u003e\n  \u003c/tr\u003e\n  \u003ctr\u003e\n    \u003ctd width=\"50%\"\u003e\n      \u003cstrong\u003eTickets and appeals\u003c/strong\u003e\u003cbr\u003e\n      Build ticket panels with category buttons, private channels, staff roles, transcripts,\n      logs, user controls, renaming, and moderation appeal decisions.\n    \u003c/td\u003e\n    \u003ctd width=\"50%\"\u003e\n      \u003cstrong\u003eAutoMod and Sentinel\u003c/strong\u003e\u003cbr\u003e\n      Block terms, delete invites and links, detect mass mentions, spot spam, link floods,\n      suspicious join waves, and new-account risk.\n    \u003c/td\u003e\n  \u003c/tr\u003e\n  \u003ctr\u003e\n    \u003ctd width=\"50%\"\u003e\n      \u003cstrong\u003eServer management tools\u003c/strong\u003e\u003cbr\u003e\n      Welcome and leave messages, invite logs, deleted and edited message audits, polls,\n      announcements, locks, nicknames, autoroles, and branded embeds.\n    \u003c/td\u003e\n    \u003ctd width=\"50%\"\u003e\n      \u003cstrong\u003eCommunity extras\u003c/strong\u003e\u003cbr\u003e\n      Activity leaderboards, reminders, AFK statuses, reaction-role buttons, custom commands,\n      fun commands, and music playback with queues and filters.\n    \u003c/td\u003e\n  \u003c/tr\u003e\n\u003c/table\u003e\n\n## Screenshots\n\nThese screenshots live in `docs/screenshots/`, so they render directly on the\nGitHub project page.\n\n\u003ctable\u003e\n  \u003ctr\u003e\n    \u003ctd align=\"center\" width=\"50%\"\u003e\n      \u003cstrong\u003eMission Control\u003c/strong\u003e\u003cbr\u003e\u003cbr\u003e\n      \u003cimg src=\"docs/screenshots/mission-control.png\" alt=\"Mission Control dashboard\" width=\"100%\"\u003e\n    \u003c/td\u003e\n    \u003ctd align=\"center\" width=\"50%\"\u003e\n      \u003cstrong\u003eBot Doctor\u003c/strong\u003e\u003cbr\u003e\u003cbr\u003e\n      \u003cimg src=\"docs/screenshots/bot-doctor.png\" alt=\"Bot Doctor setup check\" width=\"100%\"\u003e\n    \u003c/td\u003e\n  \u003c/tr\u003e\n  \u003ctr\u003e\n    \u003ctd align=\"center\" width=\"50%\"\u003e\n      \u003cstrong\u003eTicket Panel\u003c/strong\u003e\u003cbr\u003e\u003cbr\u003e\n      \u003cimg src=\"docs/screenshots/ticket-panel.png\" alt=\"Ticket creation panel\" width=\"100%\"\u003e\n    \u003c/td\u003e\n    \u003ctd align=\"center\" width=\"50%\"\u003e\n      \u003cstrong\u003eMember 360\u003c/strong\u003e\u003cbr\u003e\u003cbr\u003e\n      \u003cimg src=\"docs/screenshots/member-360.png\" alt=\"Member 360 staff profile\" width=\"100%\"\u003e\n    \u003c/td\u003e\n  \u003c/tr\u003e\n  \u003ctr\u003e\n    \u003ctd align=\"center\" colspan=\"2\"\u003e\n      \u003cstrong\u003eSentinel Threat Radar\u003c/strong\u003e\u003cbr\u003e\u003cbr\u003e\n      \u003cimg src=\"docs/screenshots/sentinel.png\" alt=\"Sentinel threat radar\" width=\"70%\"\u003e\n    \u003c/td\u003e\n  \u003c/tr\u003e\n\u003c/table\u003e\n\n## Requirements\n\n- Python 3.10 or newer\n- A Discord bot application and token\n- Discord privileged intents enabled for:\n  - Server Members Intent\n  - Message Content Intent\n- FFmpeg on your system path if you want to use the music commands\n- Optional Spotify developer app credentials if you want `,play` to accept\n  Spotify track, album, and playlist links\n\nRecommended Discord permissions:\n\n- View Channels\n- Send Messages\n- Embed Links\n- Read Message History\n- Manage Messages\n- Manage Channels\n- Manage Roles\n- Manage Nicknames\n- Kick Members\n- Ban Members\n- Moderate Members\n- Manage Guild\n- View Audit Log\n\n## Setup\n\n1. Clone the repository.\n\n```bash\ngit clone https://github.com/Kieranmcm07/Discord_Moderation_Bot.git\ncd Discord_Moderation_Bot\n```\n\n2. Install dependencies.\n\n```bash\npip install -r requirements.txt\n```\n\n3. Create your environment file.\n\n```bat\ncopy .env.example .env\n```\n\n4. Fill in `.env`.\n\n```env\nBOT_TOKEN=YOUR_BOT_TOKEN_HERE\nPREFIX=,\nOWNER_IDS=\nMOD_LOG_CHANNEL_ID=0\nINVITE_LOG_CHANNEL_ID=0\nJOIN_LOG_CHANNEL_ID=0\nDB_PATH=data/bot.db\nSPOTIFY_CLIENT_ID=\nSPOTIFY_CLIENT_SECRET=\nSPOTIFY_MAX_TRACKS=50\nSPOTIFY_MARKET=US\nBOT_FAILURE_MODE=retry\nBOT_RETRY_DELAY_SECONDS=5\n```\n\nOnly `BOT_TOKEN` is required. Spotify values are only needed for Spotify music\nlinks. The other values can be left as defaults or configured later with bot\ncommands.\n\n5. Run the bot.\n\n```bash\npy -3 main.py\n```\n\nIf the Python launcher is not available on your machine, use your normal Python\ncommand instead:\n\n```bash\npython main.py\n```\n\n### Optional Spotify Music Links\n\nTo use Spotify URLs with `,play`, create a Spotify app in the Spotify Developer\nDashboard and copy its Client ID and Client Secret into `.env`:\n\n```env\nSPOTIFY_CLIENT_ID=your_client_id\nSPOTIFY_CLIENT_SECRET=your_client_secret\nSPOTIFY_MAX_TRACKS=50\nSPOTIFY_MARKET=US\n```\n\nSupported inputs:\n\n- `https://open.spotify.com/track/...`\n- `https://open.spotify.com/album/...`\n- `https://open.spotify.com/playlist/...`\n- `spotify:track:...`, `spotify:album:...`, and `spotify:playlist:...`\n\nSpotify is used for metadata only. The bot reads the Spotify title/artist list,\nthen searches for a playable audio match through the existing `yt-dlp` music\nflow. `SPOTIFY_MAX_TRACKS` caps album and playlist expansion between 1 and 100\ntracks so a very large playlist does not lock up the music command.\n`SPOTIFY_MARKET` controls the country used for Spotify availability checks;\nuse `GB` instead of `US` if you want UK availability.\n\n## Windows Helper Scripts\n\nThe repository includes Windows batch files for common local workflows:\n\n| Script | Purpose |\n| --- | --- |\n| `start_bot.bat` | Start the bot through the launcher |\n| `restart_bot.bat` | Restart the bot |\n| `stop_bot.bat` | Stop the running bot process |\n| `install_startup.bat` | Add the bot to Windows startup |\n| `remove_startup.bat` | Remove the Windows startup entry |\n\nWhen failure handling is set to `retry`, unexpected top-level crashes are\nretried after 5 seconds by default. During launcher startup retries, press `C`\nto close instead.\n\n## Configuration\n\nEnvironment values are loaded from `.env`.\n\n| Variable | Description |\n| --- | --- |\n| `BOT_TOKEN` | Discord bot token |\n| `PREFIX` | Text command prefix, default `,` |\n| `OWNER_IDS` | Comma-separated Discord user IDs treated as bot owners |\n| `DB_PATH` | SQLite database path, default `data/bot.db` |\n| `BOT_FAILURE_MODE` | `retry` to restart after unexpected failures, or `close` to exit |\n| `BOT_RETRY_DELAY_SECONDS` | Seconds to wait before retrying, default `5` |\n| `MOD_LOG_CHANNEL_ID` | Optional fallback moderation log channel |\n| `INVITE_LOG_CHANNEL_ID` | Optional invite log channel |\n| `JOIN_LOG_CHANNEL_ID` | Optional join and leave log channel |\n\nMost server-specific setup can be managed inside Discord:\n\n```text\n,settings\n,setmodlog #channel\n,setmessagelog #channel\n,setwelcomechannel #channel\n,setwelcomemessage \u003cmessage\u003e\n,setleavechannel #channel\n,setleavemessage \u003cmessage\u003e\n,setembedcolor \u003chex\u003e\n,setembedimage \u003curl\u003e\n```\n\nWelcome and leave templates support `{user}`, `{username}`, `{server}`, and\n`{count}` placeholders. Custom command responses support `{user}`, `{username}`,\nand `{server}`.\n\n## Command Overview\n\nThe default prefix in this README is `,`. Change it with `PREFIX` in `.env`.\n\n### Command Center\n\n| Command | Description |\n| --- | --- |\n| `,missioncontrol` | Open the staff operations dashboard |\n| `,dashboard` | Alias for Mission Control |\n| `,doctor` | Diagnose permissions and setup gaps |\n| `,member360 @user` | Show a complete staff profile for one member |\n\n### Moderation\n\n| Command | Description |\n| --- | --- |\n| `,ban @user [reason]` | Ban a member |\n| `,tempban @user \u003cduration\u003e [reason]` | Ban a member for a limited time |\n| `,tempbans` | Show active temporary bans |\n| `,unban \u003cuser_id\u003e [reason]` | Unban a user by ID |\n| `,kick @user [reason]` | Kick a member |\n| `,softban @user [days] [reason]` | Ban then unban a member to clear recent messages |\n| `,warn @user [reason]` | Warn a member |\n| `,warnings @user` | Show active warnings |\n| `,clearwarns @user [amount] [reason]` | Remove recent warnings |\n| `,note @user \u003cnote\u003e` | Add a private moderator note |\n| `,timeout @user [duration] [reason]` | Timeout a member |\n| `,untimeout @user [reason]` | Remove a timeout |\n| `,purge \u003camount\u003e` | Delete recent messages |\n| `,clean \u003camount\u003e [@user]` | Delete recent messages, optionally from one user |\n| `,chatlog [#channel] [amount]` | Export recent messages as a text file |\n| `,purgelinks \u003camount\u003e` | Delete recent messages containing links |\n| `,purgebots \u003camount\u003e` | Delete recent bot messages |\n| `,slowmode [seconds]` | Set channel slowmode |\n| `,setescalation \u003cwarns\u003e \u003caction\u003e [duration]` | Configure automatic warning punishments |\n| `,removeescalation \u003cwarns\u003e` | Remove an escalation rule |\n| `,escalations` | List escalation rules |\n\n### Cases\n\n| Command | Description |\n| --- | --- |\n| `,case \u003cid\u003e` | Look up one case |\n| `,history @user` | Show a user's moderation history |\n| `,modsummary @user` | Show a compact moderation summary |\n| `,casefile @user [limit]` | Export moderation history as CSV |\n| `,recentcases [limit]` | Show recent moderation actions |\n| `,searchcases \u003cquery\u003e` | Search cases by action or reason |\n| `,casecomment \u003ccase_id\u003e \u003cnote\u003e` | Add a follow-up note |\n| `,reason \u003ccase_id\u003e \u003creason\u003e` | Update a case reason |\n\n### Tickets And Appeals\n\n| Command | Description |\n| --- | --- |\n| `,setticketcategory \u003ccategory\u003e` | Set the ticket channel category |\n| `,setticketlog #channel` | Set the ticket log channel |\n| `,ticketroleadd \u003crole\u003e` | Allow a role to access tickets |\n| `,ticketroleremove \u003crole\u003e` | Remove a ticket staff role |\n| `,ticketroles` | Show ticket staff roles |\n| `,ticketcategoryadd Name \\| Emoji \\| Description` | Add a ticket type |\n| `,ticketcategoryremove \u003cid\u003e` | Remove a ticket type |\n| `,ticketcategories` | List ticket types |\n| `,ticketpanel [#channel]` | Post the ticket panel |\n| `,ticketsettings` | Show ticket settings |\n| `,ticketadd @user` | Add a user to the ticket |\n| `,ticketremove @user` | Remove a user from the ticket |\n| `,ticketrename \u003cname\u003e` | Rename the current ticket channel |\n| `,closeticket` | Close the current ticket |\n| `,appealpanel [#channel]` | Post the case appeal panel |\n| `,appeal accept \u003cnote\u003e` | Accept the current appeal |\n| `,appeal deny \u003cnote\u003e` | Deny the current appeal |\n| `,appeal close` | Close the current appeal ticket |\n\n### AutoMod And Sentinel\n\n| Command | Description |\n| --- | --- |\n| `,automod` | Show AutoMod settings |\n| `,automod on/off` | Enable or disable AutoMod |\n| `,automod invites on/off` | Delete Discord invite links |\n| `,automod links on/off` | Delete external links |\n| `,automod mentions \u003cnumber\\|off\u003e` | Set the mass mention threshold |\n| `,automod warn on/off` | Add warning cases when AutoMod deletes |\n| `,automod addword \u003cterm\u003e` | Add a blocked word or phrase |\n| `,automod removeword \u003cterm\u003e` | Remove a blocked word or phrase |\n| `,automod words` | List blocked terms |\n| `,sentinel` | Show the live threat radar panel |\n| `,sentinel on/off` | Enable or disable Sentinel |\n| `,sentinel threshold \u003c40-95\u003e` | Set the alert risk score |\n| `,sentinel log #channel` | Set the Sentinel alert channel |\n| `,sentinel autotimeout \u003cseconds\\|off\u003e` | Auto-timeout high-risk users |\n| `,sentinelprofile @user` | Show a member's live behaviour profile |\n| `,sentinelincidents [limit]` | Show recent Sentinel incidents |\n\n### Server Management\n\n| Command | Description |\n| --- | --- |\n| `,serverinfo` | Show server details |\n| `,userinfo [@user]` | Show user details |\n| `,avatar [@user]` | Show a user's avatar |\n| `,roleinfo \u003crole\u003e` | Show role details |\n| `,announce #channel \u003cmessage\u003e` | Send an announcement embed |\n| `,poll Question \\| Option 1 \\| Option 2` | Create a reaction poll |\n| `,lock [#channel] [reason]` | Lock a channel |\n| `,unlock [#channel] [reason]` | Unlock a channel |\n| `,nick @user \u003cnickname\u003e` | Change a member's nickname |\n| `,resetnick @user` | Reset a nickname |\n| `,setautorole \u003crole\u003e` | Set the automatic join role |\n| `,autorole` | View the current autorole |\n| `,clearautorole` | Disable autorole |\n| `,setsticky [#channel] \u003cmessage\u003e` | Set a sticky message |\n| `,sticky [#channel]` | View a sticky message |\n| `,stickies` | List sticky messages |\n| `,clearsticky [#channel]` | Remove a sticky message |\n| `,botinfo` | Show bot stats |\n\n### Configuration\n\n| Command | Description |\n| --- | --- |\n| `,settings` | Show server configuration |\n| `,setwelcomechannel #channel` | Set the welcome channel |\n| `,setwelcomemessage \u003cmessage\u003e` | Set the welcome template |\n| `,setleavechannel #channel` | Set the leave channel |\n| `,setleavemessage \u003cmessage\u003e` | Set the leave template |\n| `,setembedcolor \u003chex\u003e` | Set the default embed color |\n| `,setembedimage \u003curl\u003e` | Set a shared embed image or GIF |\n| `,clearembedimage` | Remove the shared embed image |\n| `,setmodlog #channel` | Set moderation action logs |\n| `,viewmodlog` | Show the moderation log channel |\n| `,clearmodlog` | Disable moderation action logs |\n| `,setmessagelog #channel` | Set deleted and edited message audit logs |\n| `,viewmessagelog` | Show the message audit log channel |\n| `,clearmessagelog` | Disable message audit logs |\n\n### Community Tools\n\n| Command | Description |\n| --- | --- |\n| `,topchat [limit]` | Show top message senders |\n| `,topvoice [limit]` | Show top voice users |\n| `,stats [@user]` | Show activity stats |\n| `,rradd @role [Label \\| Emoji]` | Add or update a reaction-role option |\n| `,rrremove @role` | Remove a reaction-role option |\n| `,rrlist` | List reaction roles |\n| `,rrpanel [#channel]` | Post the role button panel |\n| `,remind \u003ctime\u003e \u003ctext\u003e` | Create a reminder |\n| `,reminders` | List your reminders |\n| `,delreminder \u003cid\u003e` | Delete a reminder |\n| `,afk [reason]` | Mark yourself AFK |\n| `,customadd \u003cname\u003e \u003cresponse\u003e` | Add or update a custom command |\n| `,customremove \u003cname\u003e` | Remove a custom command |\n| `,customlist` | List custom commands |\n| `,invites` | Show active server invites |\n\n### Music\n\n| Command | Description |\n| --- | --- |\n| `,join` | Join your current voice channel |\n| `,play \u003curl, search, or Spotify link\u003e` | Play audio from a URL, search term, Spotify track, Spotify album, or Spotify playlist |\n| `,queue` | Show the queue |\n| `,controls` | Show interactive music controls |\n| `,skip` | Skip the current track |\n| `,pause` | Pause playback |\n| `,resume` | Resume playback |\n| `,loop [on/off]` | Repeat the current track |\n| `,shuffle` | Shuffle queued tracks |\n| `,remove \u003cposition\u003e` | Remove a queued track |\n| `,move \u003cfrom\u003e \u003cto\u003e` | Move a queued track |\n| `,jump \u003cposition\u003e` | Skip ahead to a queued track |\n| `,replay` | Restart the current track |\n| `,volume [0-200]` | Show or set playback volume |\n| `,filters` | List available audio filters |\n| `,filter \u003cname\u003e` | Apply an audio filter |\n| `,bassboost` | Turn on bass boost |\n| `,chipmunk` | Turn on the chipmunk filter |\n| `,stop` | Stop playback and clear the queue |\n| `,leave` | Leave the current voice channel |\n| `,nowplaying` | Show the current track |\n\n### Fun And Utility\n\n| Command | Description |\n| --- | --- |\n| `,help [command]` | Show grouped help or details for one command |\n| `,help search \u003cword\u003e` | Search commands |\n| `,ping` | Check websocket latency |\n| `,about` | Show project and creator links |\n| `,8ball \u003cquestion\u003e` | Ask the magic 8-ball a question |\n| `,coinflip` | Flip a coin |\n| `,roll [max]` | Roll a number |\n| `,choose Option 1 \\| Option 2` | Choose between options |\n| `,joke` | Tell a clean joke |\n| `,meme [top \\| bottom]` | Post a generated meme image |\n| `,ship @user1 @user2` | Generate a fun ship score |\n\n## Data And Behaviour Notes\n\n- The bot stores local data in SQLite, by default at `data/bot.db`.\n- Temporary bans are checked and lifted in the background while the bot is\n  online.\n- Reminders are stored in SQLite and still deliver after restarts once due.\n- Durations support compact and readable formats such as `30m`, `1h30m`,\n  `2 hours`, and `7d`.\n- Sentinel stores incident metadata, not full message content.\n- Voice activity tracking only records time while the bot is running.\n- Guilds can set a custom embed color and an optional shared image or GIF for\n  branded embeds.\n- Once the bot is fully offline, Discord cannot deliver commands to it, so it\n  cannot reply until it starts again.\n\n## Project Structure\n\n```text\n.\n|-- cogs/\n|   |-- activity.py\n|   |-- afk.py\n|   |-- appeals.py\n|   |-- automod.py\n|   |-- cases.py\n|   |-- command_center.py\n|   |-- configuration.py\n|   |-- custom_commands.py\n|   |-- fun.py\n|   |-- help.py\n|   |-- invite_logger.py\n|   |-- message_audit.py\n|   |-- moderation.py\n|   |-- music.py\n|   |-- reaction_roles.py\n|   |-- reminders.py\n|   |-- server_management.py\n|   |-- sentinel.py\n|   |-- tickets.py\n|   `-- utility.py\n|-- data/\n|-- docs/\n|   |-- assets/\n|   |   |-- readme-banner.svg\n|   |   `-- readme-moderation-loop.gif\n|   `-- screenshots/\n|-- tests/\n|-- utils/\n|   |-- db.py\n|   |-- embeds.py\n|   |-- errors.py\n|   `-- time.py\n|-- .env.example\n|-- config.py\n|-- launcher.py\n|-- main.py\n`-- requirements.txt\n```\n\n## License\n\nThis project is licensed under the MIT License.\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fkieranmcm07%2Fdiscord_moderation_bot","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fkieranmcm07%2Fdiscord_moderation_bot","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fkieranmcm07%2Fdiscord_moderation_bot/lists"}