Arma Reforger server status in Discord: alerts and a live message
Nearly every Arma Reforger community lives in Discord, and the two most repeated questions are "is the server down?" and "who is playing?". Both answer themselves with a webhook and a query to the server. This guide explains how, and what belongs in which channel.
One webhook per channel
A Discord webhook is a URL any tool can post messages to without being a bot or asking for permissions. You create it under Channel settings → Integrations → Webhooks → New webhook. The URL is a secret: whoever has it can write to that channel, so never paste it in public and regenerate it if it leaks.
Separate channels pay off, because the public and the staff do not want the same things:
- #status (public): online / down, connected players, scheduled restarts.
- #admin-alerts (staff): bans, kicks, teamkills, who opened the Game Master, config changes.
- #ranking (public, optional): the season podium.
Knowing whether the server is up without RCON
For "is it alive?" you do not need RCON. Reforger answers the Steam Query (A2S) protocol on the port from the a2s block of config.json (17777 by convention): it returns name, scenario, connected players and max. It is the same query the in-game server browser makes. Advantages: read-only, does not consume the RCON session, and works even with RCON disabled. Any game-server monitoring tool supports it.
To avoid false alarms from a lost packet, the sane rule is to declare "down" after two consecutive unanswered queries, and "back" on the first one that answers.
A status message that edits itself
Better than a new message every minute (which floods the channel) is a single pinned message that gets edited: Discord allows editing messages sent by a webhook. Useful content for players: 🟢/🔴, players/max, scenario, in-game time and, if a mod reports it, connected names and server FPS. The channel always shows the current picture and nobody has to ask.
Moderation alerts
Every ban, kick and restart should land in the staff channel with who did it, to whom (name + identity id) and why. It is the team's memory: when someone appeals a ban, the answer is there, not in the head of an admin who has since left. Since the server does not store ban reasons (see how to ban), the Discord channel is often the only record.
How Reforger Ops does it
The panel implements all of the above: paste your webhooks under Integrations (one for alerts and, optionally, others for status, ranking and the watch), enter the A2S port, and from then on it alerts on downtime and recovery, posts and maintains the live status message, sends every ban/kick/restart with author and reason, and announces the podium when a season closes. Messages go out in the server's language (Spanish or English).
Steam Query is not instant, and that is a good thing
The standard way to tell whether an Arma Reforger server is online is Steam Query (A2S) against its query port, 17777 by default. The server replies with name, scenario, players connected and slots. It is the same mechanism the in-game server browser uses.
One detail that saves grief: do not alert on the first failure. A query can be lost to a dropped UDP packet with nothing wrong at the server. Polling every minute and waiting for two consecutive failures before raising the alarm is what separates a useful alert from a channel nobody reads because it cries wolf. The price is finding out up to a couple of minutes late, which for a downtime alert changes nothing.
The honest trade-off: an outage that fixes itself within seconds is invisible to this method. Catching those needs something inside the game that reports when the match starts again.
One message that updates, not a hundred messages
There are two ways to put status in Discord and they do different jobs. An alert is a new message for each thing that happens (it went down, it came back, someone banned): it is for finding out, and it belongs in a team channel. A status message is a single one, pinned in a public channel, edited every minute with the current numbers: it is for looking at, and it is what players want.
For the second, the trick is to store the message id when you post it and then edit it instead of posting another. If the message is deleted, the edit fails with a 404 and you have to post it again. Without that, the channel fills with stale statuses and stops being useful.
The webhook limit, which bites on the worst day
A Discord webhook takes on the order of five requests every two seconds. That sounds like plenty until the day the server restarts with people on it and twenty alerts pile up at the same instant: Discord starts rejecting, and if the sender does not retry, those alerts are lost without a trace — precisely the ones from the moment you wanted to understand.
The right answer is a queue per webhook, letting a short burst through and honouring the wait time Discord returns when it rejects. And the queue should be per webhook, not global: a slow channel has no business holding up another server's alerts.
What to put in a status message, and what to leave out
A status message in a public channel is read by players, not by admins, and that should decide every field. Players want to know whether they can play right now: online or not, how many are on out of how many slots, which scenario, and how to join. That is the whole list.
What does not belong there: mod versions, RCON internals, server IPs you would rather not publish, or anything that only means something to whoever administers it. Those belong in the team channel. A status message that nobody understands at a glance stops being read within a week, and then it is just noise in the channel.
Two things that are worth their space: the game time, because it decides whether people feel like joining, and a plain-language performance hint instead of a raw frame rate — "smooth" or "laggy" means something to everyone, a number does not.
