Initial implementation of IRC LLM bot
Full implementation from spec: ZNC/IRC client with TLS, Ollama LLM backend, per-user SQLite conversation memory, and Flask web admin portal with 7 pages. Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
This commit is contained in:
62
portal/templates/index.html
Normal file
62
portal/templates/index.html
Normal file
@@ -0,0 +1,62 @@
|
||||
{% extends "base.html" %}
|
||||
{% block title %}Dashboard — IRC Bot Portal{% endblock %}
|
||||
{% block content %}
|
||||
<h1>Dashboard</h1>
|
||||
|
||||
<div class="cards">
|
||||
<div class="card">
|
||||
<div class="card-label">Bot Status</div>
|
||||
<div class="card-value status-{{ 'online' if pid_exists else 'offline' }}">
|
||||
{{ 'Running' if pid_exists else 'Stopped' }}
|
||||
</div>
|
||||
</div>
|
||||
<div class="card">
|
||||
<div class="card-label">Nick</div>
|
||||
<div class="card-value">{{ cfg.get('bot_nick', 'avcbot') }}</div>
|
||||
</div>
|
||||
<div class="card">
|
||||
<div class="card-label">Ollama Model</div>
|
||||
<div class="card-value">{{ cfg.get('ollama_model', '—') }}</div>
|
||||
</div>
|
||||
<div class="card">
|
||||
<div class="card-label">Channels</div>
|
||||
<div class="card-value">{{ cfg.get('channels', [])|length }}</div>
|
||||
</div>
|
||||
<div class="card">
|
||||
<div class="card-label">Memory</div>
|
||||
<div class="card-value">{{ 'Enabled' if cfg.get('memory_enabled', True) else 'Disabled' }}</div>
|
||||
</div>
|
||||
<div class="card">
|
||||
<div class="card-label">Reload Socket</div>
|
||||
<div class="card-value status-{{ 'online' if sock_exists else 'offline' }}">
|
||||
{{ 'Available' if sock_exists else 'Not available' }}
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="section">
|
||||
<h2>Connection</h2>
|
||||
<table class="info-table">
|
||||
<tr><td>ZNC Host</td><td>{{ cfg.get('znc_host', 'ham.activeblue.net') }}</td></tr>
|
||||
<tr><td>Ollama</td><td>{{ cfg.get('ollama_host', '—') }}:{{ cfg.get('ollama_port', '—') }}</td></tr>
|
||||
<tr><td>Joined Channels</td><td>{{ cfg.get('channels', [])|join(', ') or '—' }}</td></tr>
|
||||
<tr><td>Trigger on Nick</td><td>{{ 'Yes' if cfg.get('trigger_on_nick') else 'No' }}</td></tr>
|
||||
<tr><td>Trigger Prefix</td><td>{{ cfg.get('trigger_prefix') or '—' }}</td></tr>
|
||||
</table>
|
||||
</div>
|
||||
|
||||
<div class="section">
|
||||
<h2>Quick Actions</h2>
|
||||
<div class="actions">
|
||||
<form method="post" action="{{ url_for('action_reconnect') }}">
|
||||
<button class="btn btn-secondary">Reconnect</button>
|
||||
</form>
|
||||
<form method="post" action="{{ url_for('action_reload') }}">
|
||||
<button class="btn btn-secondary">Reload Config</button>
|
||||
</form>
|
||||
<form method="post" action="{{ url_for('action_clear_log') }}">
|
||||
<button class="btn btn-danger">Clear Log</button>
|
||||
</form>
|
||||
</div>
|
||||
</div>
|
||||
{% endblock %}
|
||||
Reference in New Issue
Block a user