GTA RP
The line-up for factions and families — with sign-off cross-checking, a weekly overview and self-deleting alerts.
The Termine (events) module answers "who is coming?". A line-up answers a different question: who has responded, and who has not? That sounds similar and is the opposite.
With an event, silence is harmless — whoever does not accept is not coming. With a line-up, silence is the actual result. There is one role whose every single member is expected to answer, and anyone who does not ends up in a list of their own. That is why this is a module of its own and not a checkbox on an event.
/aufstellung setup → set it up, creates templates and alerts
/aufstellung neu → announce a line-up
/aufstellung erinnern → remind people about the next line-up right now
/aufstellung verwalten → edit, cancel, lock, delete
/aufstellung vorlagen → edit the announcement texts
/aufstellung zahlen → look at the results of a line-up straight away
/aufstellung woche → look at the weekly summary straight away
/alarm auslösen → bunker, lab or an alert of your own
/alarm frei → a one-off alert with your own text, no template
/alarm texte → edit the alert texts
/alarm reaktionen → keywords the bot reacts to
Reminding — automatically and by hand
The reminder you set runs by the clock: that many minutes before the start, the bot posts a message in the channel and adds how many have not reacted at all yet. That is the sentence that works — "remember the line-up" nobody reads twice, "four of you have not clicked yet" hits exactly those four.
Sometimes the clock does not fit, though. It is an hour beforehand, half of them are still missing, and you want to push now instead of waiting:
/aufstellung erinnern
That sends the same reminder immediately. With nothing specified, the bot takes the next
upcoming line-up; with the aufstellung option you pick a different one. The automatic reminder
still comes — one does not replace the other.
So this does not turn into a constant ping, it can be used again at the earliest every five minutes. A ping is an interruption for everyone, and twice in five minutes is no longer a reminder but noise.
The first setting is the most important one
The line-up role. Its members are the ones expected to answer, and only they can be missing. Without this role anyone can click and the list of absentees stays empty — then the line-up is a poll.
Everything else is convenience: announcement channel, results channel, sign-off channel, reminder time, day and hour of the weekly summary. You can set it in both places, and both can do the same:
/aufstellung setupin Discord — with Discord's native role and channel pickers.- Dashboard → Einstellungen (settings) → GTA RP — the same thing on one page.
How it runs
/aufstellung neu datum:24.12. uhrzeit:20:30 — that is all it takes. Subject, text and place come
from the template, the role is pinged, and three buttons sit below the announcement:
| ✅ Zusage (accept) | I will be there on time |
| ❌ Absage (decline) | I am not coming at all |
| ⏰ Später (later) | I am coming, but not on time |
The third button is the reason there are three. With only Zusage and Absage, someone who arrives half an hour late clicks something arbitrary — and both answers are wrong. As a decline he is missing from the planning although he is coming; as an acceptance he is missing at the muster although he accepted.
A second click on the same button takes the answer back. That is the only way to say "I do not know yet" without leaving a wrong answer standing.
Two hours beforehand — configurable — a reminder goes out to the whole role. It does not say "remember the line-up", nobody reads that twice, but how many have not reacted at all yet. That hits exactly those people.
The results
Five minutes after the start, the results channel shows how it went: a bar per answer, the names alongside, and right at the bottom the part people actually look at — 🚫 Nicht reagiert (did not react).
The five minutes are deliberate. Evaluating to the second counts the people who are clicking at that very moment as a failure.
You do not have to wait for it:
/aufstellung zahlen
posts the results immediately in the channel where you type the command. With nothing specified,
the bot takes the current line-up — the one that ran a moment ago, and if there has not been one
today, the next one coming up. You pick a different one in the aufstellung field.
Typed beforehand it is an interim state: anyone who has not clicked by then is listed under "Nicht reagiert". That is the view you want when you are reminding people — and not the same as the results afterwards.
The sign-off cross-check
This is the part no other bot has.
Enter a sign-off channel and the bot holds the declines against it. What is checked is who wrote something there on the calendar day of the line-up — not what. That produces three lines:
- ✔️ Absage und abgemeldet (declined and signed off) — did everything right.
- ⚠️ Absage ohne Abmeldung (declined without signing off) — pressed the button but told nobody.
- ✍️ Nicht geklickt, aber abgemeldet (did not click, but signed off) — said something, only forgot the button. That is something other than silence, and so it gets a line of its own.
Two decisions behind this, both of them deliberate:
The content does not matter. "not here today" is enough. A bot that decides whether a sentence sounds enough like a sign-off becomes a matter of dispute: "I wrote something" can be checked, "the bot did not accept my sentence" cannot.
The whole day counts, not the hour. Anyone who signs off at nine in the morning for a line-up at eight in the evening has signed off. A deadline of "only up to two hours beforehand" punishes exactly the people who were early.
On message content: The check needs no reading along — the bot gets the sender and the timestamp anyway. Only the text excerpt behind the name ("bin heute nicht da") appears if the operator has switched the read permission on. If it is off, the check stays and the excerpt is missing — not the other way round.
The weekly summary
/aufstellung woche
Sunday evening by itself, day and hour configurable — and with the command immediately at any time: an overview per member. Acceptances, declines, Später, silence — and for anyone it applies to, with the dates: "🔎 2× abgesagt ohne Abmeldung (21.08. 24.08.)".
It is sorted by failures, but ascending: whoever always reacted is at the top. A list that starts with the offenders is read as an attack — including by the people who have done nothing wrong.
The dashboard shows the same week as a table. The difference is not the looks: a single line-up with three absentees is one evening, the same name four weeks in a row is a conversation — and only a table can be sorted.
The contribution system
A faction's second pillar: who brings in how much, and what gets paid out for it.
/abgabe panel puts a panel into the contribution channel. It stays at the bottom — when
somebody writes, the bot deletes it and posts it again. Without that it slips out of sight
after two conversations, and then nobody logs anything any more.
The path is deliberately short: button, product, number, done. Three steps, doable while playing. The products — name, emoji, unit, payout price — you set up in the dashboard, not in Discord: nobody creates twelve products in a dialog four lines tall.
The price is locked in with every hand-in. Raise weed from $20 to $30 next week and this week's hand-in stays at $20. A payout already settled never changes after the fact — anything else is impossible to explain to a player who was shown 12,000 yesterday.
The weekly quota
The weekly quota is the amount every member is expected to hand in per period. Without one, "bring what you can" means that with thirty people, five bring everything.
It belongs to the product, not the member: 500 coke and 200 weed are two obligations, and coke cannot be settled with weed. A product with a quota of 0 counts as credit only. You set it in the dashboard, in the same row as the price.
Who has to meet it is decided by the contribution role under /abgabe setup — the
counterpart to the muster role. Only those holding it get a quota and appear in the summary,
even with nothing handed in; anyone who brought nothing at all is named there in a
separate “Nothing handed in” block.
Every period starts at zero. A shortfall is not carried over, and neither is a surplus. On Monday everybody is back at −500.
The red button
Next to "Log a contribution" the panel carries a red button: Check weekly quota. It shows your own standing, and only to the person who pressed it:
❄️ Coke · 300 of 500 grams · −200
🌿 Weed · 250 of 200 grams · +50
⚠️ You are still 200 units short of your quota.
The standing in the channel, readable by everyone, would be a public debt board. The leadership gets the same calculation in full — in the summary.
If the accounting period is not a calendar week, the button does not say "weekly" either; it simply says "Check my quota".
The summary
/abgabe auswertung shows who brought in how much and what gets paid out — sorted by payout
at the top, and below it the quota standing per member, this time with the laggards first:
⚠️ @Tom · ❄️ 0/500 · 🌿 0/200 · −700
⚠️ @Max · ❄️ 300/500 · 🌿 250/200 · −200
Two extras:
table: yesattaches the file for a spreadsheet program — one row per player, one column per product, plus the weekly quota, total amount and payout. Including those who brought nothing. That is where things get sorted and recalculated, so the amount handed in and the quota sit in separate columns: "300/500" would be text, and text cannot be added up.post: yesputs the summary into the summary channel instead of showing it only to you. That is not the default: a summary that lands in the channel unasked names the laggards in front of the whole faction — that should be a decision, not a side effect.
Templates
A template is the finished announcement text. /aufstellung setup creates three — Tägliche
Aufstellung, Sonderaufstellung, Krisensitzung (daily line-up, special line-up, crisis meeting) —
and /aufstellung vorlagen rewrites them.
The text is fixed in place when the announcement goes out. If someone changes the template later, nothing changes about line-ups that are already up. An announcement that rewrites itself retroactively is no longer a record.
Alerts
/alarm auslösen welcher:bunker puts a message in the announcement channel, pings the role — and
deletes it again after five minutes. The deletion time is configurable per alert, from one
minute up to one day.
The self-deletion is the whole point. "Bunker down, get over here" has a half-life of minutes, and a channel full of old alerts gets nobody moving any more.
Secured twice over: a timer deletes to the second, an entry in the database survives a restart of the bot. Without the second one, a message would stand for ever if the bot restarts at the wrong moment.
Bunker and Labor (lab) are ready as suggestions. You create your own with /alarm texte — symbol,
heading, text and deletion time freely selectable, up to twelve of them.
And for the case that occurs exactly once, no template is needed at all:
/alarm frei
opens a form, you type a heading and a text into it, and the message goes out immediately and disappears again after the time you set. Nothing is saved in the process — "meeting at the harbour in ten minutes" as a catalogue entry would be rubbish left lying around.
Reactions to keywords
The bot attaches an emoji to a message for certain words — "ban" gets the hammer. Three brakes are built in, because a bot that hangs an emoji under every second message gets switched off:
- Whole words. "ban" does not match inside "Banane" and not inside "urban".
- At most three reactions per message.
- A one-and-a-half-second lock per channel, in case someone spams the word.
Links and code blocks are taken out beforehand: a link almost always contains some keyword or other.
This is the only function of the module that genuinely needs reading along. If the permission is off, messages arrive without text and the rules do not apply — the bot writes that into the log instead of leaving it unsaid.
Who may do what
| Clicking | Only the line-up role. Otherwise a spectator is sitting in the results. |
| Announcing and managing | The server leadership and the leadership roles you have entered. |
| Triggering an alert | The same people, plus the alert roles. An alert pings the whole role. |
| Looking at the figures | The same people. In the dashboard, anyone with access to the server. |
Limits
The member list needs the Server Members Intent. If it is off, the bot works with what it has in its cache — the results would then not be wrong but incomplete, and they say so too, instead of claiming a clean zero.
The sign-off channel is read back a thousand messages at most. In a channel that holds more than a thousand messages a day, it is no longer a sign-off channel.
Last updated: 14 October 2026
