Bullhorn (CES Edition)
#Bullhorn (CES Edition) β Help Doc
Bullhorn is a Discord bot for posting, scheduling, and cleaning up server announcements β built by Crazy Eyes Studio. This guide covers setup and every command.
#What you get
- One-off announcements and custom embeds, with optional images and role/user pings
- Announcements scheduled for a specific time (one-time or daily)
- Recurring announcements on a repeating interval
- Editing, pinning, and unpinning announcements after they're sent
- A log of recent announcements with jump links
- Bulk message cleanup for a specific user in a channel
All of it runs on your own bot application β Bullhorn is a self-hosted bot, not a service you log into.
#Requirements
- Node.js v16.11 or newer, installed wherever you'll run the bot
- A free Discord bot application (created at discord.com/developers/applications)
#Setup
1. Create your bot application
Go to the Discord Developer Portal, click New Application, name it, then open the Bot tab and click Reset Token to get your bot token. On the same page, turn on Message Content Intent. Copy the Application ID from the General Information page β you'll need both.
2. Configure Bullhorn
Extract the Bullhorn folder, open a terminal in it, and run:
npm installCopy .env.example to a new file named .env, and fill in the values you just copied:
TOKEN=your_bot_token_here
CLIENT_ID=your_application_id_here
GUILD_ID=your_server_id_here # optional, see belowIf you set GUILD_ID, commands appear on that one server instantly. Leave it blank to register commands globally across every server the bot is in β that can take up to an hour the first time.
3. Invite Bullhorn to your server
In the Developer Portal, go to OAuth2 β URL Generator, check the bot and applications.commands scopes, and under bot permissions select: Manage Messages, Send Messages, Embed Links, Attach Files, Read Message History. Open the generated URL and add the bot to your server.
4. Start it
npm startYou should see β
Logged in as <YourBot>#1234 in the terminal. Bullhorn's slash commands are now live.
#Who can use the commands?
Every Bullhorn command requires the Manage Messages permission by default, since they're all staff actions. If you want to hand a specific command to a role that doesn't have Manage Messages, go to Server Settings β Integrations β Bullhorn and adjust permissions per-command.
#Commands
Anywhere you see |n in a message, it inserts a line break β useful since Discord's slash command text boxes don't support pressing Enter.
#Sending announcements
/announce channel message [mention] [image]
Posts an announcement embed in channel. mention can be @role or @user to ping alongside it; image attaches a picture to the embed.
/embed channel title description [mention]
Posts a custom embed with its own title, instead of the default "π’ Announcement" heading.
#Scheduling
/scheduleannounce channel message time [mention] [repeat_daily]
Queues an announcement for time (24-hour HH:MM, e.g. 14:30, evaluated against the clock on whatever machine runs the bot). Leave repeat_daily off for a one-time post, or set it to true to repeat every day at that time.
/recurringannounce channel message interval [mention]
Posts immediately, then repeats every interval minutes (5-minute minimum). Good for rotating reminders β event start times, "read the rules" pings, etc.
/listschedules β lists every scheduled (one-time or daily) announcement with its ID.
/listrecurring β lists every recurring announcement with its ID.
/cancelschedule id β cancels a scheduled announcement by the ID shown in /listschedules.
/cancelrecurring id β cancels a recurring announcement by the ID shown in /listrecurring.
Scheduled and recurring announcements are saved to disk, so restarting the bot doesn't lose them β they pick back up automatically.
#Managing sent announcements
/editannounce channel message_id new_message
Edits an announcement Bullhorn already sent. Only works on messages the bot itself posted.
/pinannounce channel message_id / /unpinannounce channel message_id
Pins or unpins a message. Note Discord caps every channel at 50 pins.
/listannouncements
Shows the last 10 announcements Bullhorn sent, each with a jump link straight to the message.
To get a message ID: in Discord, go to Settings β Advanced and turn on Developer Mode, then right-click any message and choose Copy Message ID.
#Cleanup
/purgeuser target [channel] [scan_limit]
Deletes target's recent messages in channel (defaults to the channel you run the command in). scan_limit controls how many recent messages to look back through (default 200, max 1000).
Discord's API only allows bulk-deleting messages younger than 14 days β that's a platform limit, not a Bullhorn one. Anything older gets deleted one at a time, capped at 50 per run to stay within Discord's rate limits. If a purge reports skipped older messages, just run the command again to keep going.
#Troubleshooting
Bot won't log in / crashes on startup β Double check TOKEN and CLIENT_ID in .env are correct and that there are no extra spaces or quotes around the values.
Slash commands aren't showing up β Global commands can take up to an hour to appear after the bot's first run. For instant updates while testing, set GUILD_ID in .env to your server's ID.
Renamed or removed a command and Discord still shows the old one β Run npm run clear-commands, then restart the bot to re-register the current command set.
"Missing Permissions" errors β Make sure Bullhorn's role has Manage Messages (and is positioned above any role it needs to act on), and that it has access to the channel you're targeting.
A command says it can't find a message β Double-check the message ID and that you gave the right channel; /editannounce, /pinannounce, and /unpinannounce all look for the message in the specific channel you provide.
#Support
Questions or issues? Reach out through Crazy Eyes Studio's support channels listed on the site you downloaded Bullhorn from.
Β© 2026 Crazy Eyes Studio β All rights reserved.
Was this article helpful?