Activity & Replay
Track play sessions, forward chat messages, capture server replay snapshots, and report player geolocation — all with single function calls in your server script.
Activity tracking#
Activity tracking records when players join and leave each server. The data powers the Activity heatmap, session history, and Leaderboard in the dashboard.
RoPerms.EnableActivityTracking()
Hooks PlayerAdded and PlayerRemoving to automatically send activity.join and activity.leave events to the backend. Call this once at server startup.
RoPerms.Init()
RoPerms.EnableActivityTracking()Once enabled, every join and leave is recorded with the player ID, timestamp, and server job ID. Sessions are shown on the player's profile under the Activity tab, and aggregated on the org-level Activity page.
Chat logging#
Chat logging forwards in-game messages to the backend so staff can review them from the Chatlogs tab on a player's profile.
RoPerms.EnableChatlogs()
Wires up both TextChatService.MessageReceived (for modern chat) and legacy Player.Chatted to forward chat messages. Call once at server startup.
RoPerms.EnableChatlogs()⚠Player privacy
Server replay#
Server replay captures periodic snapshots of every player's position and character state. Staff can then watch a 2D top-down replay of a server from the dashboard to review incidents.
RoPerms.EnableReplay(opts: table?)
Starts capturing position snapshots at a regular interval. Snapshots are uploaded to the backend and associated with the current server job ID.
RoPerms.EnableReplay({
-- How often (seconds) to capture a snapshot. Default: 5
interval = 5,
-- Maximum snapshot history to keep per server (in seconds).
-- Older snapshots are pruned. Default: 3600 (1 hour)
maxHistory = 3600,
})Viewing replays
In the dashboard, go to Activity → Server Replay and enter the job ID of the server you want to review. The replay viewer shows a 2D top-down map with player positions animated over time. You can scrub through the timeline.
ℹMap calibration
Geolocation reporting#
RoPerms can show a player's country and region in the dashboard, and display a globe visualisation on their profile. The data comes from Roblox's own region metadata — it is not precise below country/region level.
RoPerms.ReportPresence(player: Player, country: string, region: string)
Reports the player's country (ISO alpha-2 code) and region string to the backend. Typically called on PlayerAdded after resolving the player's location from Roblox's LocalizationService.
local LocalizationService = game:GetService("LocalizationService")
Players.PlayerAdded:Connect(function(player)
local ok, countryCode = pcall(function()
return LocalizationService:GetCountryRegionForPlayerAsync(player)
end)
if ok and countryCode then
RoPerms.ReportPresence(player, countryCode, "")
end
end)ℹGetCountryRegionForPlayerAsync
LocalizationService:GetCountryRegionForPlayerAsync()is a Roblox API that returns the player's country code. It can fail with an error for some players — always wrap it in a pcall.Server heartbeat#
See the Modcalls & Enforcement page for EnableServerHeartbeat() — this keeps the Live Servers panel populated and lets staff see active server player counts.
Full activity setup#
local Players = game:GetService("Players")
local LocalizationService = game:GetService("LocalizationService")
local RoPerms = require(game.ServerScriptService.RoPerms)
RoPerms.Init()
RoPerms.EnableActivityTracking()
RoPerms.EnableChatlogs()
RoPerms.EnableServerHeartbeat()
RoPerms.EnableReplay({ interval = 5 })
Players.PlayerAdded:Connect(function(player)
local ok, code = pcall(function()
return LocalizationService:GetCountryRegionForPlayerAsync(player)
end)
if ok and code then
RoPerms.ReportPresence(player, code, "")
end
end)