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>
42 lines
1.7 KiB
HTML
42 lines
1.7 KiB
HTML
<div class="action-row" id="action-{{ action.id }}">
|
|
<div class="action-info">
|
|
<code>{{ action.event_type }}{% if action.event_detail %}:{{ action.event_detail }}{% endif %}</code>
|
|
→
|
|
<strong>{{ action.action_type }}</strong>
|
|
{% if action.media_file %}
|
|
<span class="muted">{{ action.media_file.original_name }}</span>
|
|
{% endif %}
|
|
{% if action.alert_text %}
|
|
<span class="muted">"{{ action.alert_text }}"</span>
|
|
{% endif %}
|
|
{% if action.cooldown_seconds %}
|
|
<small class="muted">{{ action.cooldown_seconds }}s cooldown</small>
|
|
{% endif %}
|
|
{% if just_tested %}
|
|
<span class="tested-badge">✓ fired</span>
|
|
{% endif %}
|
|
</div>
|
|
<div class="action-controls">
|
|
<form hx-post="/actions/{{ action.id }}/test"
|
|
hx-target="#action-{{ action.id }}"
|
|
hx-swap="outerHTML"
|
|
style="display:inline">
|
|
<button type="submit" class="outline small-btn">Test</button>
|
|
</form>
|
|
<form hx-post="/actions/{{ action.id }}/toggle"
|
|
hx-target="#action-{{ action.id }}"
|
|
hx-swap="outerHTML"
|
|
style="display:inline">
|
|
<button type="submit" class="outline small-btn {% if not action.enabled %}secondary{% endif %}">
|
|
{{ 'on' if action.enabled else 'off' }}
|
|
</button>
|
|
</form>
|
|
<button hx-delete="/actions/{{ action.id }}"
|
|
hx-target="#action-{{ action.id }}"
|
|
hx-swap="outerHTML"
|
|
hx-confirm="Delete this action?"
|
|
class="outline secondary small-btn">
|
|
Delete
|
|
</button>
|
|
</div>
|
|
</div>
|