{# Admin activity + bans #}
{% if growth.admin_by_day %}
Admin Actions & Bans / Day
Moderation activity over time — spikes may indicate incidents
{% endif %}
Admin Action Types
{% set at_max = (growth.admin_action_types | map(attribute='c') | list | max) if growth.admin_action_types else 1 %}
{% for row in growth.admin_action_types %}
{{ row.action }}
{{ row.c }}
{% endfor %}
Ban & Unban History
Date
Bans
Unbans
{% set ban_map = {} %}{% set unban_map = {} %}
{% for row in growth.bans_by_day %}{% if row.action == 'ban' %}{% set _ = ban_map.update({row.d: row.c}) %}{% else %}{% set _ = unban_map.update({row.d: row.c}) %}{% endif %}{% endfor %}
{% for d in (ban_map.keys()|list + unban_map.keys()|list)|unique|sort %}
Player count history recording started — data will appear after the first 5-minute sample.
{% endif %}
Activity Popularity
Activity
Sessions
Playtime
Avg FPS
Avg Ping
Gifts
{% for name, s in activity_summary.items()|sort(attribute='1.total_time', reverse=true) %}
{% set fps=s.avg_fps %}{% set ping=s.avg_ping %}{% set secs=s.total_time %}
{% for name, s in activity_summary.items()|sort(attribute='1.sessions', reverse=true) %}
{% set fps=s.avg_fps %}{% set ping=s.avg_ping %}{% set secs=s.total_time %}{% set rw=s.avg_rw_drop %}
{% for region, s in photon_summary.items()|sort(attribute='1.avg') %}
{% set avp=s.avg %}
200 %} class="warn-row"{% endif %}>
{{ region|upper }}
{{ avp|round(0)|int }}ms
{{ s.min }}
{{ s.p95 }}
{{ s.max }}
{{ s.count }}
{% set perc=[avp/4,100]|min %}
{% if avp<=50 %}{% set bc='var(--kr-success)' %}{% elif avp<=100 %}{% set bc='#8bc34a' %}{% elif avp<=150 %}{% set bc='var(--kr-warning)' %}{% else %}{% set bc='var(--kr-danger)' %}{% endif %}
{% else %}
No photon data yet
{% endfor %}
Scene Load Events
Scene
Loads
Players
Top Source
{% for scene, s in load_scene_stats.items()|sort(attribute='1.count', reverse=true) %}
{% set ts = s.sources.items()|list|sort(attribute='1', reverse=true) %}
{{ scene }}
{{ s.count }}
{{ s.players }}
{{ ts[0][0] if ts else '—' }}
{% else %}
No load events
{% endfor %}
Activity Session Log {{ activity_rows|length }} records
Player
Activity
Time
FPS
±σ
Ping
±σ
RW%
SL
Load
Src
When
{% for a in activity_rows %}
{% set fps=a.avg_fps %}{% set ping=a.avg_ping %}{% set secs=a.total_time %}{% set rw=a.rw_dropped_perc %}
{% set et=ev.event_type %}
{% if et=='activity_stats' %}{{ et }}
{% elif 'load' in et %}{{ et }}
{% elif et=='game_start' %}{{ et }}
{% elif et in ('session_start','session_end') %}{{ et }}
{% elif et=='player_leveled_up' %}{{ et }}
{% elif et=='crashdump_details' %}{{ et }}
{% elif et=='purchased_item' %}{{ et }}
{% else %}{{ et }}{% endif %}
{% set props=ev._props %}
{% if props %}
{% set items=props.items()|list %}
{% for k,v in items[:6] %}{{ k }}={{ v|string|truncate(28,true,'…') }}{% if not loop.last %} · {% endif %}{% endfor %}
{% if items|length>6 %} +{{ items|length-6 }}{% endif %}
{% else %}—{% endif %}