Players and Moderation
See who is online, kick players, search player history and profiles, apply warns, mutes, kicks and bans, and work through in-game reports.
9 min read
Two Players pages#
The game sidebar has two entries called Players, and they do different jobs:
| Sidebar entry | URL | What it is for |
|---|---|---|
| Live → Players | /dashboard/{gameId}/players-online | Who is connected right now, with a Kick button per player, plus the live activity stream |
| Data → Player Search | /dashboard/{gameId}/players | Everyone seen in the last 30 days, searchable by name, leading to a per-player profile |
Data → Moderation (/dashboard/{gameId}/moderation) is the third piece: every sanction across the game, their history, and the queue of player reports.
All three depend on your game server being hosted on the platform. The roster comes from the running server, activity and profiles come from the events it records, and sanctions are delivered to it. A game that has never launched has nothing to show here; see Launch and hosting.
Who can do what#
| Action | Roles |
|---|---|
| View online players, activity, player search and profiles | Owner, Developer, Moderator, Support |
| Kick from the online roster | Owner, Developer, Moderator |
| Open the Moderation page | Owner, Moderator |
| Create or revoke a sanction, resolve a report | Owner, Developer, Moderator |
The Moderation entry is hidden from Developers and Support because it is gated on the mod.act capability, which only Owner and Moderator carry. The Sanctions tab on a player profile is visible to everyone who can see the profile, but a Support member's attempt to apply a sanction is rejected by the platform. Roles are explained in Members, roles and staff.
Player IDs and names#
On a hosted server players sign in with a join ticket, so the server identifies each player by their Vastopia account ID rather than a typed username. That account ID is the player ID you see throughout the dashboard, and it is what sanctions and staff ranks are keyed on. The player name is the display name the player chose in-game (the ::setname command). Wherever a name is missing, the dashboard shows the ID instead.
Online players#
Open Live → Players. The Online players card shows a count badge, a search box ("Search online players…"), a Refresh button and a table:
| Column | Meaning |
|---|---|
| Player | Display name, with a staff-rank badge (Moderator, Admin or Owner) if the server sees the player as staff |
| Region | The in-game region the player is in |
| Combat | Combat level |
| Online for | Time since login |
| Action | Kick |
The server pushes its roster on its control poll (about every 5 seconds) and the page re-reads it every 10 seconds while the tab is visible; the footer reads "Roster updated Ns ago · auto-refreshes every 10s". If the server has not reported recently, a yellow banner warns "The server hasn't reported a roster recently — this list may be out of date." The search box filters the list by name or ID without another request.
Kick a player#
- Find the player in the Online players table (type part of their name or ID in the search box).
- Click Kick.
- Confirm the browser prompt: "Kick NAME from the game? They can reconnect immediately."
The row disappears at once and the next roster refresh confirms it. Under the hood a kick is a kick sanction with the reason "Kicked by an operator.": the server picks it up on its next poll and disconnects the player with that message. It is recorded in the game's audit log as server.kick and appears in the player's sanction history. A kick is not a ban — use a ban (below) to keep someone out.
The activity feed#
Below the roster, the Activity section is the live stream of recorded player actions. The same feed, with a page of its own, is at /dashboard/{gameId}/activity ("Player activity"), and a per-player slice appears on each profile.
Filter bar:
| Filter | Notes |
|---|---|
| Type | All types or one event type (table below) |
| Player | An exact player ID — not a name |
| From / To | Date-time pickers bounding the range |
Results arrive 200 at a time, newest first, with a Load older entries button at the bottom. Each row shows the time, the event type, the player (a link to their profile) and a one-line detail.
| Type filter | Event | Detail column shows |
|---|---|---|
| Joins | player.join | "joined the server" |
| Leaves | player.leave | "left (reason)" |
| Chat | player.chat | The message text |
| Deaths | player.death | "died", with the killer kind when known |
| PK kills | player.killed_by_player | "killed by NAME" |
| Level ups | player.level_up | Skill number and new level |
| Items acquired | player.item_acquired | Amount, item number and source |
| Items dropped | player.item_dropped | Amount and item number, "(destroyed)" if it did not hit the ground |
| Trades | player.traded | The other player's ID |
| In-game purchases | player.purchase | Item, shop name and cost in coins |
Player Search and profiles#
Data → Player Search lists every player with activity in the last 30 days, newest activity first. Typing in the search box matches player names case-insensitively as a substring; searching is debounced, so results update as you pause. The table shows Player, Player ID and Last seen ("5m ago"). Up to 100 players are returned; if more match, a footer says "Results truncated — narrow your search to see more." With no activity at all the page says "No players seen in the last 30 days."
Click a row (or any player link elsewhere in the dashboard) to open the profile at /dashboard/{gameId}/players/{playerId}.
Profile#
The header shows the player's name and ID, followed by four tiles: Last seen, First seen, Total play time (with the session count beneath) and Recent events (with the purchase count beneath). A player with no recorded activity in the last 30 days shows "No data" instead.
| Tab | Contents |
|---|---|
| Overview | The ten most recent events |
| Activity | The full event list for this player, 100 per page, with Load older entries |
| Purchases | In-game shop purchases: time, item, amount, cost in coins, shop. These are purchases made with in-game currency through shops you built in the editor — not real-money sales, which live under Shop, revenue and payouts |
| Sessions | Each session's Joined and Left time and Duration; a session still in progress shows "in-game" |
| Sanctions | Apply a sanction to this player, and see their active sanctions and full history |
Sanctions#
A sanction is a moderation action recorded on the platform and delivered to your game server. There are four kinds:
| Type | In-game effect | Delivered to the server? |
|---|---|---|
| Warn | None — a note on the player's record | No; it stays in the record only |
| Mute | The player's chat messages are dropped silently | Yes |
| Kick | Immediate disconnect with the reason shown; the player can reconnect | Yes |
| Ban | Disconnected if online, and every reconnect is rejected with "Banned: REASON" | Yes |
Mutes, kicks and bans are queued for the server and picked up on its next control poll, which runs about every 5 seconds — the Moderation page header says as much. A kick aimed at a player who is offline is simply marked delivered. A ban is also enforced at login: the server checks the platform when a player connects, caching the answer for 60 seconds, so a banned player cannot get back in even after a server restart.
Each sanction has a Status:
| Status | Meaning |
|---|---|
| queued | Recorded, not yet acknowledged by the server |
| delivered | The server has applied it |
| expired | Its duration has run out |
| revoked | Lifted by a team member |
Because a warn is never sent anywhere, it stays "queued" for as long as it is active. Every sanction and revoke is written to the audit log (mod.warn, mod.mute, mod.kick, mod.ban, mod.revoke) with the actor, the reason and the duration.
Apply a sanction from a profile#
- Open the player's profile and the Sanctions tab.
- In Apply sanction, choose a Type: Warn (no in-game effect), Mute (block chat), Kick (immediate disconnect) or Ban (reject reconnects).
- Pick a Duration: 1h, 24h, 7d or Permanent. The default is 1h.
- Enter a Reason (required) — at least 3 characters, at most 500. It is shown to the player for kicks and bans.
- Click Apply TYPE (the button is labelled with the type you chose).
The new sanction appears under Active sanctions with status "queued" and moves to "delivered" once the server acknowledges it. Sanction history below keeps everything ever applied, including expired and revoked entries.
Apply a sanction from the Moderation page#
When you already know the player ID — from a report, for example — you do not need to open the profile:
- On Moderation, click New sanction.
- Enter the Player ID, choose the Type and set Duration (min) in minutes. Leave it blank (or 0) for a permanent sanction.
- Write a Reason and click Create.
Both the player ID and the reason are required.
Lift a sanction#
On the profile's Sanctions tab or the Moderation page's Active sanctions tab, click Revoke in the row. The entry's status becomes "revoked" and it moves to the history. Expired sanctions cannot be revoked; they already ended.
The Moderation page#
Data → Moderation has three tabs and re-polls every 15 seconds while visible:
| Tab | Contents |
|---|---|
| Active sanctions | Every active sanction across the game: Player (ID, linked to the profile), Type, Reason, Applied ("2h ago"), Expires (a date, or "permanent"), Status and a Revoke action |
| History | The most recent 100 sanctions of any status, without actions |
| Reports | Open reports and recently resolved ones; the tab shows a count badge while reports are open |
Reports#
Reports are filed by your game server on behalf of players: the page caption describes them as queued when a player types ::report <player> <reason> in chat. Each row lists When, the Reporter ID, the Reported player (linked to their profile) and the Reason.
To close a report:
- Investigate: open the reported player's profile, read their Activity, and apply a sanction if warranted.
- Back on Reports, click Mark resolved in the row.
- Type a short resolution note in the field that appears and press
Enteror click Save. If you leave it empty the note is recorded as "resolved".
The report moves to Recently resolved, where the note is shown in the Resolution column, and the action is logged as mod.report_resolved.
A moderation workflow#
- A report arrives: Moderation → Reports shows a count badge. Read the reason.
- Click the reported player's ID to open their profile. Check Activity filtered to chat, and Sanctions to see whether they have prior history.
- Apply the proportionate sanction from the Sanctions tab: a Warn for a first minor offence, a timed Mute for chat abuse, a Ban for cheating or repeated abuse. Write a reason a colleague would understand later.
- Resolve the report with a note saying what you did.
- For anything urgent while the player is still connected, Live → Players → Kick removes them immediately; follow up with a ban from the profile if they should not return.
Everything your team does here is visible to the Owner under Team → Audit, described in Members, roles and staff.
With AI (MCP)#
There are no MCP tools for moderation; sanctions, kicks and reports are dashboard-only. read_server_logs reads the most recent lines of a deployed server's log (mode picks test, live or beta, with contains, exclude and min_level filters) and can help while investigating a report — the same output the dashboard shows under Live → Logs (see Server controls and logs).
