4.0 KiB
4.0 KiB
Operations
Smoke test after deploy
/networkcore status- confirm "Database: ok" and "Network: connected".- Connect a staff alt. Run
/lookup <your-main>. You should see your own UUID and online status. - Connect a non-staff alt. Have a staff member run
/warn <alt> test. The alt receives a chat message; nothing crashes. /scfrom a staff alt to toggle staff-chat-mode ON, then type a message in chat. Every other online staff member sees it; no non-staff sees it. Run/scagain to turn off.- Look in MySQL:
The warn should be the most recent row.
SELECT * FROM staff_punishments ORDER BY issued_at DESC LIMIT 5;
A staff member can't run staff commands
- The plugin checks
PermissionsModule.get().hasPermission(uuid, "networkstaff.<command>"). The error message includes the exact node that was checked - read it. - Confirm their group has either the specific node or
networkstaff.*. See 03_Commands.md for the full list. - Permission changes typically require the player to reconnect.
A ban isn't propagating
- On the issuing server:
/networkcore servers- is the destination server in the list? If no, the destination isn't actually on the network. - On the issuing server: confirm
messagebus_published_totalis incrementing in/metrics. - On the destination server: confirm
messagebus_received_totalis incrementing. If it's rising butmessagebus_rejected_totalis also rising fast, you have an auth token mismatch. - Confirm the destination server's
network.auth_tokenmatches the issuer's. Different tokens cause silent message drops. - As a last resort: the destination server queries MySQL on connect via
BanEnforcer. Have the target try to reconnect. If the ban still doesn't apply, the row may not actually be in the DB - checkSELECT * FROM staff_punishments WHERE target_uuid = ?.
A muted player can still chat
- The mute might have expired. Check
expires_atagainst now. MuteCacheon the chat server might be stale. The cache loads on connect; if the mute was issued while the player was already online, the broadcast path is what populates the cache.- If broadcasts aren't arriving, see the previous section.
- As a fallback, kick + rejoin the player.
PlayerSeenTracker.onConnectcallsloadMuteIntoCachewhich forces a fresh DB read.
players_seen.online is stuck at 1 after a crash
The plugin runs markServerOffline(serverId) in start(), which sets online=0 for all rows whose last_server_id matches this server. So a normal restart fixes it.
If you see online=1 for a player whose last_server_id belongs to a server that no longer exists (decommissioned, renamed): clear manually with UPDATE staff_players_seen SET online=0 WHERE last_server_id = 'old-server-id'.
Auditing
Recent actions taken by a moderator:
SELECT issued_at, type, target_name, reason
FROM staff_punishments
WHERE issued_by_name = 'StaffName'
ORDER BY issued_at DESC
LIMIT 50;
All actions in the last hour:
SELECT * FROM staff_punishments
WHERE issued_at > (UNIX_TIMESTAMP() * 1000) - 3600000
ORDER BY issued_at DESC;
Players who have been banned but later unbanned:
SELECT target_name, COUNT(*) AS unbanned_bans
FROM staff_punishments
WHERE type IN ('BAN', 'TEMPBAN') AND revoked_at IS NOT NULL
GROUP BY target_uuid, target_name
ORDER BY unbanned_bans DESC;
Things this plugin deliberately doesn't do
- IP bans. Privacy implications and uncertainty about the Hytale auth model. Use the punishment system on UUIDs.
- Appeals workflow. Staff just unban. There's no in-game appeal form. Build that externally if you want it.
- Multiple active bans on the same player. The repository's "active ban" query returns the most recent one. Stacking is unsupported by design - it complicates logic without changing outcomes.
- Per-world or per-server bans. Punishments are network-wide. If you need per-world, that's a different feature (likely a separate plugin built on top of this).