{% extends "base.html" %} {% block content %}

Abuse

Customers whose coin-slot tap-without-coin behavior triggered the Anti-Abuse Throttle. Tune the threshold + lock duration + decay window in Customization.

{% if flash_msg %}
{{ flash_msg }}
{% endif %} {% if error_msg %}
{{ error_msg }}
{% endif %}
{# ============================================================ #} {# Currently locked #} {# ============================================================ #}

Currently Locked ({{ locked|length }})

{% if locked %}
{% for r in locked %} {% endfor %}
Identifier Fails Lock # Unlocks in Last attempt Action
{{ r.key }} {{ r.fail_count }} {% if r.consecutive_locks and r.consecutive_locks > 1 %} {{ r.consecutive_locks }}× {% else %} {{ r.consecutive_locks or 1 }} {% endif %} {{ (r.seconds_remaining // 60 + (1 if r.seconds_remaining % 60 else 0)) }} min {{ r.last_attempt_at | localtime }}
{% else %}

No customers currently locked.

{% endif %}
{# ============================================================ #} {# Active counters (not yet locked) #} {# ============================================================ #}

Active Counters ({{ counters|length }})

Customers who have made empty Insert Coin / Extend attempts but haven't hit the lockout threshold yet. Counter naturally decays — reset manually here only if you're sure they shouldn't be on the list.

{% if counters %}
{% for r in counters %} {% endfor %}
Identifier Fails Last attempt Action
{{ r.key }} {{ r.fail_count }} {{ r.last_attempt_at | localtime }}
{% else %}

No active fail counters.

{% endif %}
{# ============================================================ #} {# History #} {# ============================================================ #}

History ({{ log_total }})

Append-only log of lockout-related events: auto-locks (threshold hit), manual locks (you), and unlocks (you). Lock expirations don't appear — those are implicit (lock duration is known at lock time).

{% if log_rows %}
{% for r in log_rows %} {% endfor %}
When Identifier Event Actor Details
{{ r.ts_unix | localtime }} {{ r.key }} {% if r.event == 'locked' %} Auto-Locked {% elif r.event == 'manual_lock' %} Manual Lock {% elif r.event == 'unlocked' %} Unlocked {% else %} {{ r.event }} {% endif %} {{ r.actor }} {% if r.fail_count is not none %}fails={{ r.fail_count }}{% endif %} {% if r.locked_until_unix %} {% if r.fail_count is not none %} · {% endif %} until {{ r.locked_until_unix | localtime }} {% endif %}
{% if log_total > log_page_size %}
{% if log_offset > 0 %} ‹ Newer {% else %} ‹ Newer {% endif %} {{ log_offset + 1 }}–{{ [log_offset + log_page_size, log_total]|min }} of {{ log_total }} {% if log_offset + log_page_size < log_total %} Older › {% else %} Older › {% endif %}
{% endif %} {% else %}

No abuse events recorded yet.

{% endif %}
{# ============================================================ #} {# Manual Lock modal #} {# ============================================================ #} {% endblock %}