Twitch stream event platform with OBS browser source overlay. Features: - Twitch OAuth login (streamer + mod access) - EventSub WebSocket for subs, gift subs, bits, channel points, follows, raids - Chat commands via tmi.js in the overlay - Gap audio — tone plays on new chat message after silence, volume/pitch scale with gap length - Self-hosted media library (upload sounds and videos) - Action configuration — map any event to sound, video, or alert - Per-action cooldowns, test button, enable/disable toggle - Multiple actions per event (all matching actions fire) - Activity log dashboard with EventSub connection status - Layout editor — iframe-based WYSIWYG with drag handles, live style preview - Custom CSS and custom JS injection into overlay - Custom DOM events (bashyoverlay:sub, bashyoverlay:raid, etc.) for custom JS hooks - deploy.sh — one-shot setup and launch script Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
50 lines
1.7 KiB
HTML
50 lines
1.7 KiB
HTML
{% extends "base.html" %}
|
|
{% block title %}Dashboard — BashyOverlay{% endblock %}
|
|
{% block content %}
|
|
<hgroup>
|
|
<h1>Dashboard</h1>
|
|
<p>Welcome, {{ user.twitch_display_name }}</p>
|
|
</hgroup>
|
|
|
|
<div class="status-bar">
|
|
<span class="status-dot {% if eventsub_connected %}connected{% else %}disconnected{% endif %}"></span>
|
|
EventSub: <strong>{% if eventsub_connected %}connected{% else %}disconnected{% endif %}</strong>
|
|
{% if not eventsub_connected %}
|
|
<form method="post" action="/settings/reconnect" style="display:inline">
|
|
<button type="submit" class="outline small-btn">Reconnect</button>
|
|
</form>
|
|
{% endif %}
|
|
</div>
|
|
|
|
<section>
|
|
<h2>Recent activity</h2>
|
|
{% if logs %}
|
|
<figure>
|
|
<table>
|
|
<thead>
|
|
<tr>
|
|
<th>Time</th>
|
|
<th>Event</th>
|
|
<th>User</th>
|
|
<th>Detail</th>
|
|
<th>Action taken</th>
|
|
</tr>
|
|
</thead>
|
|
<tbody>
|
|
{% for log in logs %}
|
|
<tr>
|
|
<td><small>{{ log.triggered_at.strftime('%H:%M:%S') }}</small></td>
|
|
<td><code>{{ log.event_type }}</code></td>
|
|
<td>{{ log.username or '—' }}</td>
|
|
<td>{{ log.detail or '—' }}</td>
|
|
<td>{{ log.action_taken or '<span class="muted">none configured</span>' | safe }}</td>
|
|
</tr>
|
|
{% endfor %}
|
|
</tbody>
|
|
</table>
|
|
</figure>
|
|
{% else %}
|
|
<p><em>No activity yet. Events will appear here as they come in.</em></p>
|
|
{% endif %}
|
|
</section>
|
|
{% endblock %}
|