Staff roster
The staff roster publishes your staff team as a page on your own FiveUnity address, and keeps it in step with Discord. Give somebody the Moderator role and they appear on it; take it off and they come off. Nobody has to remember to update a list, because there is no list to update: the Discord roles your team already holds are the list.
Where: Dashboard โ Staff Roster
#How it works
Discord is the source of truth. You link one Discord role to each staff rank, and holding a rank role is what puts somebody on the roster. Their rank is the most senior of the rank roles they hold, so promoting an admin in Discord promotes them here, and losing every staff role takes them off.
FiveUnity fills in the rest on its own:
- Their Discord name, their @handle and the nickname they use in your server.
- The join date: either the day they joined the staff team or the day they joined your Discord, whichever you choose.
- The last promotion: the day the rank they hold now took effect.
You keep two columns by hand, Status and Notes, because no Discord role can say "on leave until the 12th". A position that is full can keep a queue of people waiting for it: see Waiting list. Switch Activity on and the roster also counts how busy each person has been: see Activity below.
The roster updates the moment a staff role changes. It is rebuilt in full when the bot restarts, and re-checked every 30 minutes, which is also how a changed nickname reaches the page.
This is a different roster from the Police roster. That one is your in-character department, with call signs and nickname tags. This one is the people who run the Discord. They can both be switched on, and each gets its own address.
#Publish the roster
Switch Staff roster on. FiveUnity works out an address from your server's name (a server called 5Star Roleplay is published at .../5starroleplaystaff/roster) and you can change it to anything else. It has to be different from your police roster's address, since the address is what decides which roster a link opens.
| Setting | What it does |
|---|---|
| Roster address | The last part of the public link. Letters and numbers only. |
| Heading | The title at the top of the page. Empty uses your server's name plus "Staff". |
| Who can open it | Anyone with the link, members of this server (they sign in with Discord first), or staff only. |
| Roster managers | Roles that may edit the roster from the dashboard, on top of Administrator and Manage Server. |
| Log channel | Where staff joining, promotions, demotions and departures are posted. |
| Description | One line under the heading. |
| Accent colour | Hex code used for headings and links on the published page. |
| Banner image | Full https:// address of a header image. |
A roster set to members or staff is also kept out of search engines.
#Staff ranks
Add one row per Discord role that means a staff rank, most senior at the top. The order on this page is the order on the published roster.
| Field | What it does |
|---|---|
| Discord role | Holding it means this rank. |
| Name | What the roster calls it, e.g. Head Administrator. |
| Short form | Used where the full name will not fit. Up to 16 characters. |
| Maximum members | Flagged on the roster when the rank is over it. Nobody's Discord role is ever removed for it. |
| Colour | Hex code for this rank's bar on the published page. |
| Show publicly | A hidden rank still syncs, it is just kept off the public page. |
A typical set is Owner, Head Admin, Administrator, Moderator, Trial Moderator, Support. Somebody holding several of these shows at the most senior one.
Naming a role here only tells the roster how to read it, so a rank that sits above FiveUnity in your role list (Owner, usually) can still be configured. FiveUnity only needs to be above a role at the point where it actually hands one out, which is Move to rank on the roster table.
#Columns
The rank grouping and the member's name are always on the page. Everything else is a switch.
| Column | Default | Notes |
|---|---|---|
| Discord handle | Shown | Only ever sent to readers who are signed in and are members of your server, whatever this is set to. |
| Discord nickname | Shown | Their nickname in your server. Blank when they have not set one. |
| Status | Shown | Free text you keep by hand. |
| Join date | Shown | See Join date means below. |
| Last promotion | Shown | The day their current rank took effect. |
| Notes | Hidden | Off on purpose. Always visible in the dashboard. |
| Tickets claimed | Shown | Needs Activity switched on. |
| Tickets closed | Shown | Needs Activity switched on. |
| Tickets escalated | Hidden | Needs Activity switched on, then publishing. |
| Tickets renamed | Hidden | Needs Activity switched on, then publishing. |
| Reactions | Shown | Needs Activity switched on. |
| Mod actions | Shown | Needs Activity switched on. |
| Availability | Shown | Needs Activity switched on. |
| Rating | Hidden | Needs Activity switched on, then publishing. |
| Sits | Hidden | Needs Activity switched on, then publishing. |
| Duty shifts | Hidden | Needs Activity switched on, then publishing. |
| On duty | Hidden | Needs Activity switched on, then publishing. |
Order inside a rank decides how the rows under each rank heading are sorted: longest in the rank first, longest on the team first, or by name.
Join date means is worth a moment's thought. The day they joined the staff team is what a staff roster usually means, but FiveUnity only starts counting it when you switch this roster on, so a team that has existed for two years would show everybody as having joined today. The day they joined the Discord is already true of everyone from the first sync, so it is the better choice when you are rolling this out over a team that already exists.
Notes are off the public page by default because they are written for other admins. "Handling the refund dispute, do not assign tickets" is not something to publish by accident. When the column is off, FiveUnity does not send the text to the page at all, so it is not sitting in the page source either.
#Activity
Activity answers "how busy has this person actually been". It is off by default, because it is the one part of this roster that costs anything to keep.
| Figure | Where it comes from |
|---|---|
| Tickets claimed | Tickets they picked up. A ticket can be claimed by more than one person over its life, and each of them is credited. |
| Tickets closed | Tickets they closed themselves. Not the same question as claimed: a ticket claimed by one person and closed by another counts once on each side. |
| Tickets escalated | Times they moved a ticket to another support category with /ticket escalate. |
| Tickets renamed | Times they renamed a ticket channel with /ticket rename. |
| Reactions | Reactions they left on posts. |
| Mod actions | Warnings, timeouts, kicks and bans they issued. Cases opened by automod count for nobody, so this is human work only. |
| Rating | The average of the ratings members left after their tickets, out of 5, with how many ratings that is over. |
| Sits | Sits logged against them. |
| Duty shifts | How many times they clocked in. |
| On duty | Hours from completed duty shifts (/clock in, /clock out). A shift still running counts once it is clocked out. |
| Availability | Whether they are on approved leave right now, and when they are back. Read from leave requests, not typed. |
Everything except reactions is read from records FiveUnity already keeps, so those figures go back as far as your history does, from the moment you switch activity on. Reactions are the exception: nothing was counting them before, so that column starts at zero and fills up from the day you turn it on.
Count over the last sets the window, 30 days by default. Every figure is a rolling window, so somebody who was busy last year does not read as busy today. Availability is the exception: whether somebody is on leave is a fact about today, so it ignores the window entirely.
Mod actions and Availability are not in the Staff metrics panel or /staffmetrics. The roster is the first place either is visible per person.
The figures appear as extra columns on the roster table as soon as you switch Activity on. They are counted then and again every 30 minutes, so they are recent rather than live; Rebuild from Discord recounts them on demand.
#Reactions
Count reactions is the switch. Reaction channels narrows where they count: leave it empty to count reactions anywhere, or pick channels to count only there, which is what you want if the signal you care about is staff working through reports or suggestions rather than chatting.
Only reactions left by people who are on the staff roster are counted, and only in servers that have this switched on. Reactions are tallied in memory and written every couple of minutes rather than one write per click, so a hard crash can lose the last minute or two of counting.
A staff member who has not been seen recently enough for Discord to have sent us their details may have a reaction go uncounted. This is rare for anyone active enough to be reacting, and it is a deliberate trade: looking them up would mean a Discord request on an event that fires on every reaction in every server.
#What gets published
Every activity figure is visible in the dashboard as soon as activity is on, as extra columns on the roster table.
On the public page these are drawn straight away:
- Tickets claimed
- Tickets closed
- Reactions
- Mod actions
- Availability
The rest start hidden and are published only when you switch them on: tickets escalated and tickets renamed are extra work counts, a rating is other people's judgement of them, and sits, duty shifts and on duty are a shift record rather than a count of work. Switch any of them off, or those on, in the Activity panel.
Availability is published by default because "is this person around" is what a roster is read for, and being on leave is not a judgement about anybody.
When a column is not published, FiveUnity does not send the figure to the page at all, so it is not sitting in the page source either.
The numbers are counted when the roster is rebuilt, which is every 30 minutes, so they are recent rather than live. The published page says which window it is showing.
#Waiting list
A staff rank with a maximum members limit is a locked position: once it is at capacity you cannot place anyone else in it, even somebody you would hire tomorrow. The waiting list is where those people go, in order, with the answers they gave, so that when a spot opens the next person is already picked and their application has not been lost in a review channel from four months ago.
It is off by default. Switch Waiting list on and add one position per queue you want.
| Setting | What it does |
|---|---|
| Position | The staff rank people are waiting for. It needs a maximum members limit under Staff ranks, or it is never full and nobody ever waits. |
| Application form | The form that feeds this queue. Accepting one of these while the position is full puts the applicant on the list instead. |
| Next in line role | Given to whoever is at the top once a spot opens, and taken off again when they are placed or passed over. |
| Accept while full | On, accepting somebody for a full position waitlists them. Off, Accept means accept and the rank simply goes over its limit. |
| Openings channel | Where "a spot opened, X is next" is posted. Empty uses the roster log channel. |
One rank has one queue, and one form feeds one position. Two queues for the same position would each think they owned the opening.
#How somebody joins the list
Two ways, and both keep the answers they gave:
- A reviewer presses Waitlist. Application forms linked to a position get a third button next to Accept and Deny, for "good candidate, no spot right now". It asks for a reason the same way the other two do.
- Accept is pressed while the position is full. They go on the list instead of being placed, and the reviewer is told why. This is the Accept while full setting above.
You can also add somebody by hand from the dashboard, for a candidate who never filled in a form. That entry has no answers stored against it, which the queue says.
Applying again does not put a person in the line twice, does not send them to the back, and does not move them up. Their place is theirs and only their answers are refreshed. Somebody who was passed over and then applies again is back in the running.
#When a spot opens
Every time the roster is rebuilt, FiveUnity checks each position. When one has room:
- The person at the top of that queue is marked up for interview.
- They are given the next in line role, and it is taken off whoever held it before.
- A message goes to the openings channel: which position opened, who is next, what they applied with and how long they have been waiting.
Nobody is hired automatically. The role and the message are there so a human knows who to interview. Give them the rank role when you have talked to them, and the next rebuild marks them placed and moves the queue along on its own.
Only one person is up per position at a time. If the position fills again before you get to them, they stay up rather than being quietly dropped.
#Managing a queue
Each queue is listed under its position with how full the position is and how many are waiting.
- Up / Down reorders the queue. Who goes first when a spot opens is a judgement, not something a date can decide.
- Answers shows what they wrote on their application, and any note the reviewer left.
- Placed records that they took the spot. Pass takes them out of the running without deleting them.
- Remove deletes the entry and their stored answers.
The next in line role is handed out automatically, so it goes through the same guard as every other automatic role: FiveUnity must sit above it, and a role carrying Administrator is refused outright.
#The roster table
The The roster panel is the live list, showing rank, Discord name, nickname, status, join date, last promotion and notes. Every row can be edited.
- Status: free text, shown as its own column when that column is on. Useful for Active, On leave, Trial period.
- Activity columns: claimed, closed, escalated, renamed, reactions, mod actions, rating, sits, shifts, on duty and availability all appear here once activity is on. They are read only: they are counted, not typed.
- Notes: free text for your team. Only reaches the published page when the Notes column is switched on.
- Move to rank: a real promotion or demotion. It changes their Discord role, and the roster follows. This is the one place FiveUnity has to be above the role.
- Pin to a rank instead: places somebody without touching any Discord role, for a rank that has no role of its own. A pinned member stays put no matter what happens to their roles, until you clear the pin.
- Remove: takes their staff rank roles off in Discord, which is what takes them off the page.
- Rebuild from Discord: reads the whole member list and rebuilds the roster from the roles people hold right now. You need this the first time you set the ranks up, and never again in normal use.
#Related
- Staff for the staff metrics panel, which reports the same ticket figures a different way
- Police roster
- Staff
- Roles