Skip to content

Releases: hackletloose/hall-ticket-bot

1.0.0

Choose a tag to compare

@bumseb1ene bumseb1ene released this 29 Mar 11:18

Changelog – Version 1.0.0

Hauptänderungen

  1. Wiederherstellung von Admin-Buttons in offenen Tickets

    • Im on_ready-Event (in main.py) wird nun nach offenen bzw. „claimed“ Tickets gesucht.
    • Für jedes dieser Tickets wird (falls vorhanden) die zuvor gespeicherte Admin-Button-Nachricht geladen und erneut mit einer TicketAdminView versehen.
    • Dadurch bleibt die Ticket-Bedienung (beanspruchen, schließen, löschen) auch nach einem Neustart des Bots erhalten.
  2. Datenbank-Erweiterung: admin_message_id

    • Eine neue Spalte admin_message_id in der Tabelle tickets (wird per _ensure_admin_message_id_column angelegt).
    • Methode log_ticket_admin_message(ticket_id, admin_message_id) im Database-Modul speichert die ID der Nachricht, welche die Admin-Buttons enthält.
    • Neue Methode get_open_or_claimed_tickets() liefert alle Tickets mit Status open oder claimed, damit diese zur Laufzeit erneut initialisiert werden können.
  3. OCR-Integration

    • Im TicketCog (ticket_cog.py) werden nun Bild-Anhänge (falls in den Detaildaten vorhanden) per pytesseract (pytesseract.image_to_string) eingelesen.
    • Anschließend wird das erkannte Textmaterial von der KI kurz zusammengefasst (summarize_ocr_text), bevor es in den Banngrund (reason) eingearbeitet wird.
    • Dadurch lassen sich z. B. hochgeladene Screenshots oder Beweisbilder direkt im Ticket auswerten und in den Gesprächsverlauf integrieren.
  4. Allgemeine Verbesserungen

    • Kleinere Log-Ausgaben und Debug-Informationen wurden hinzugefügt (z. B. beim OCR-Prozess und bei der Zusammenfassung).
    • Der KI-Aufruf erfolgt nun über OpenAI(api_key=...) statt über alte OpenAI-Aufrufe.
    • Ein neues Feld admin_message_id wird gesetzt, sobald die Admin-Buttons (TicketAdminView) in einem neuen Ticket gepostet werden.
    • Code-Aufräumarbeiten und erweiterte Kommentare.

Zusammenfassung

  • Admin-Button-View bleibt nach Neustart erhalten dank Speicherung und Wiederherstellung der admin_message_id.
  • OCR für Bild-Anhänge ermöglicht automatisiertes Auslesen und Zusammenfassen von Screenshots direkt im Ticket.
  • Verbesserte Logs und erweiterte Datenbankfunktionen sorgen für eine robustere Ticket-Verwaltung.

0.8.0

Choose a tag to compare

@bumseb1ene bumseb1ene released this 28 Mar 16:13

Changelog

Nachfolgend eine Zusammenfassung der wichtigsten Änderungen an den Dateien. Die Auflistung bezieht sich jeweils auf den Vergleich zwischen der alten und der neuen Version der entsprechenden Datei.


main.py

  1. Datenbank-Integration hinzugefügt

    • Neu: from utils.database import Database wird importiert.
    • Im on_ready-Event wird eine Database()-Instanz angelegt, um Einstellungen wie den Ticket-Button (Channel/Message-ID) zu laden und ggf. erneut herzustellen.
  2. Ticket-Button-Wiederherstellung

    • Es wird aus der Datenbank (db.get_bot_setting(...)) die zuletzt gespeicherte Ticket-Button-Nachricht geholt (Channel-ID, Message-ID).
    • Falls vorhanden, wird die alte Nachricht im entsprechenden Channel gesucht und die CreateTicketView erneut an diese Nachricht geheftet.
  3. Vereinfachung und Aufräumarbeiten

    • Die Permission-Einstellungen für die drei Ticket-Kategorien (created_cat, claimed_cat, closed_cat) sind jetzt kompakt gehalten.
    • Die fix_category_perms-Funktion ist nahezu unverändert, allerdings werden die Aufrufe bei fehlenden Kategorien nur ausgeführt, wenn die jeweilige Kategorie existiert.
  4. Slash-Command-Sync

    • Die Registrierung der Slash-Befehle erfolgt weiterhin per bot.sync_commands().
    • Neue Log-Ausgaben informieren über die Anzahl der registrierten Slash-Befehle oder über potenzielle Fehler beim Sync.

cogs/ticket_cog.py

  1. Aufteilung der Views

    • Neu: Zwei eigenständige Klassen, CreateTicketView und TicketAdminView, die jeweils Buttons beinhalten.
    • CreateTicketView enthält einen Button zum Erstellen eines Tickets.
    • TicketAdminView enthält Buttons zum Ticket-Beanspruchen, Schließen und Löschen.
  2. Slash-Befehl /setup_ticket_button

    • Der Befehl legt nun eine Nachricht mit einem CreateTicketView-Button an und speichert die Channel- und Message-ID in der Datenbank (Tabelle bot_settings).
    • Dadurch kann der Button nach Bot-Neustarts wiederhergestellt werden.
  3. Neue Callback-Methoden für Buttons

    • Statt on_interaction + custom_id-Checks gibt es jetzt strukturierte Methoden in den Views.
    • create_ticket(...), claim_ticket(...), close_ticket(...) und delete_ticket(...) sind jeweils als eigene Cog-Methoden vorhanden und werden direkt von den Button-Callbacks aufgerufen.
  4. Erweiterte KI-Logik bleibt erhalten

    • Weiterhin sind Features wie kooperativ/unkooperativ-Klassifikation, ID-Erkennung und das Einfordern einer Stellungnahme vorhanden.
    • Die KI-Kommunikation wird jetzt jedoch über neuere OpenAI-Methoden (openai.chat_completions.create(...)) abgewickelt.
  5. Kleine Anpassungen an der Ticket-Erstellung

    • Beim Erstellen eines Tickets wird nun konsequent der Nickname des Nutzers (falls vorhanden) bevorzugt, um den Channelnamen zu setzen.
    • Die KI wird direkt bei der Erstellung des Tickets aktiviert und sendet die erste Hinweismeldung („Bitte teile mir zuerst deine ID mit …“).

utils/database.py

  1. Neue Tabelle bot_settings

    • In der Datenbank wird mit CREATE TABLE IF NOT EXISTS bot_settings ... eine Key/Value-Tabelle angelegt.
    • Methoden save_bot_setting(key, value) und get_bot_setting(key) hinzugefügt, um z. B. die Ticket-Button-ID und -Channel zu speichern.
  2. Bereinigung des Codes

    • Die alte Logik mit ALTER TABLE ... ADD COLUMN user_name ist nun überflüssig, weil die Spalte user_name direkt in der CREATE TABLE-Definition integriert ist.
    • Die Funktionen für Ticket-Logs (log_ticket_created, log_ticket_claimed, log_ticket_closed usw.) bleiben inhaltlich gleich, sind aber etwas übersichtlicher strukturiert.
  3. Unveränderte Kern-Funktionen

    • Methoden zur Ticket-ID-Ermittlung (get_next_ticket_id), zum Speichern von Transkripten und zum Abrufen von Tickets funktionieren weitgehend wie zuvor.
    • Nur minimale Anpassungen im Code-Stil (z. B. bessere Lesbarkeit, modernere String-Formatierung).

Zusammenfassung der Hauptpunkte

  • Ticket-Button-Wiederherstellung: Das neue System speichert die Ticket-Button-Nachricht in der Datenbank und stellt sie beim Bot-Start automatisch wieder her.
  • Aufteilung in Views: Die Buttons zum Erstellen und Verwalten (Claim/Close/Delete) der Tickets sind jetzt in dedizierten UI-Klassen gekapselt.
  • KI- und Datenbank-Integration: Die KI-Logik ist nahezu identisch geblieben, nutzt aber nun an einigen Stellen aktualisierte OpenAI-Methoden. Zusätzlich wird die Datenbank in main.py verwendet, um Einstellungen (z. B. Button-Nachricht) zu laden.
  • Allgemeine Code-Verbesserungen: Bessere Logs, klarere Struktur bei der Erstellung und Verwaltung von Tickets sowie eine neu strukturierte database.py für mehr Übersichtlichkeit.

0.7.0

Choose a tag to compare

@bumseb1ene bumseb1ene released this 23 Mar 15:50

Changelog

  • Slash-Befehle

    • sync_commands() liefert in neueren Pycord-Versionen nur noch None zurück.
    • Anpassung des Codes im on_ready()-Event, um per bot.application_commands alle registrierten Slash-Befehle aufzulisten.
  • Code-Optimierungen

    • Logging erweitert (Ausgabe von registrierten Slash-Befehlen in der Konsole).
    • Fehlerbehandlung bei nicht vorhandenen Kategorien und Rollen verfeinert.
  • Ticket-Cog

    • Weiterhin strukturiert: Erstellen/Claimen/Schließen/Löschen von Tickets.
    • Keine wesentlichen Logik-Änderungen; lediglich kosmetische Anpassungen (Logging).
  • KI-Logik

    • Klassifikations- und Antwort-Mechanismen für kooperatives/unkooperatives Verhalten beibehalten.
    • Kleinere Anpassungen in den Logs, um besser debuggen zu können.

0.5.0

Choose a tag to compare

@bumseb1ene bumseb1ene released this 23 Mar 10:51
24b0353

Ticket-Bot & Web-Panel (Discord + Flask)

Dies ist ein Discord-Ticket-Bot mit integrierter KI-Unterstützung (OpenAI GPT-4o-mini). Der Bot ermöglicht Nutzer*innen, über einen Button ein Ticket zu eröffnen, woraufhin eine „Sekretärin Sigrid“ (KI) direkt im Channel erste Fragen stellt und entscheidet, ob der/die Nutzer*in kooperativ ist. Anschließend kann das Support-/Admin-Team das Ticket übernehmen, bearbeiten, schließen oder löschen.

Zusätzlich enthält das Projekt eine Flask-Webanwendung (zugänglich über Discord-OAuth2-Login), die Übersichten und Transkripte der Tickets anzeigt.


Inhaltsverzeichnis

  1. Funktionsübersicht
  2. Voraussetzungen
  3. Discord Developer Portal: Bot erstellen & einrichten
    1. Neue Application erstellen
    2. Bot anlegen
    3. Privileged Gateway Intents
    4. Bot einladen (Invite-Link)
    5. Slash Commands
  4. Projektstruktur
  5. Installation & Konfiguration
  6. Start des Discord-Bots (lokal)
  7. Start des Flask-Webservers (lokal)
  8. Produktivbetrieb
    1. Gunicorn für Flask-Webapp
    2. Systemd-Service für mainpy (Discord-Bot)
    3. Systemd-Service für Gunicorn (Webapp)
  9. Discord-Bot-Kommandos & Workflow
  10. Web-Panel: Funktionen
  11. Lizenz / Hinweise

Funktionsübersicht

  • Ticket-Erstellung via Button in Discord-Kanälen.
  • KI-Unterstützung: Stellt anfangs Fragen (z. B. nach einer Bann-ID) und prüft Kooperationsbereitschaft.
  • Manuelles Claiming: Supporter/Admins können Tickets beanspruchen, schreiben und den User direkt betreuen.
  • Abschluss: Ticket schließen (Archiv in „Closed“-Kategorie, Transkript wird gespeichert) oder Ticket löschen (Kanal weg, Transkript bleibt in der Datenbank).
  • Web-Panel (Flask) mit Discord-OAuth2-Anmeldung, um Ticketlisten und Transkripte einzusehen.

Voraussetzungen

  • Python 3.9 oder höher (empfohlen).
  • Discord-Bot (Client-ID, Bot-Token) – Anlegen und konfigurieren siehe unten.
  • OpenAI-API-Key (für GPT-4o-mini).
  • SQLite (in Python enthalten).
  • Python-Bibliotheken wie discord.py/py-cord, openai, flask, requests, python-dotenv, aiohttp.
  • (Optional) gunicorn für einen produktiven Betrieb der Flask-App.

Discord Developer Portal: Bot erstellen & einrichten

1. Neue Application erstellen

  1. Gehe zum Discord Developer Portal.
  2. Klicke auf New Application.
  3. Gib einen Namen für deine Anwendung ein, z. B. „TicketBot“.
  4. Klicke auf Create.

2. Bot anlegen

  1. Wähle deine neue Anwendung aus.
  2. Gehe links auf Bot.
  3. Klicke auf Add Bot → Yes, do it!.
  4. Nun hast du einen Bot-Account innerhalb der Anwendung.
  5. Kopiere unter TOKEN deinen Bot-Token (dieser muss in deiner .env unter BOT_TOKEN= eingetragen werden!).
  6. (Optional) Passe das Bot-Icon und den Benutzernamen an.

3. Privileged Gateway Intents

  1. In der Bot-Seite (im Developer Portal) scrolle zu Privileged Gateway Intents.
  2. Aktiviere ggf. Message Content Intent, wenn du benötigst, dass dein Bot Nachrichteninhalte lesen kann (hier im Code ist message_content = True gesetzt, also wird das benötigt).
  3. Aktiviere ggf. auch Presence Intent oder Server Members Intent falls du das brauchst (hier ggf. nur members relevant).
  4. Klicke auf Save Changes.

4. Bot einladen (Invite-Link)

  1. Gehe links auf OAuth2 > URL Generator.
  2. Wähle unter Scopes: bot & applications.commands (für Slash-Befehle).
  3. Unter Bot Permissions wähle die nötigen Rechte (z. B. Send Messages, Manage Channels, Manage Roles – je nachdem, welche Aktionen dein Bot ausführen muss, insb. um Tickets zu erstellen oder Rechte zu setzen).
  4. Der generierte Link (unten) kann jetzt kopiert und im Browser aufgerufen werden.
  5. Wähle den Server, auf dem der Bot hinzugefügt werden soll, und bestätige.

Anschließend ist der Bot auf deinem Server. Stelle sicher, dass er die Rechte hat, die er braucht (z. B. um Channels zu erstellen).

5. Slash Commands

  • Standardmäßig registriert Discord Slash-Befehle automatisch, wenn du sie in deinem Code (z. B. in ticket_cog.py oder transcript_cog.py) definiert hast.
  • Stelle sicher, dass in den Bot-Einstellungen unter General Information das Feld Public Bot (ggf. an) und die Intents korrekt gesetzt sind, damit Slash Commands ordnungsgemäß ankommen.
  • Manchmal kann es mehrere Minuten dauern, bis neue Slash Commands im Server verfügbar sind.

Projektstruktur

.
├── main.py                 # Startpunkt für den Discord-Bot
├── cogs/
│   ├── ticket_cog.py       # Hauptlogik (Ticketverwaltung + KI)
│   └── transcript_cog.py   # /ticket_transcript-Befehl
├── utils/
│   ├── config.py           # Lädt .env-Variablen, enthält IDs und Konstanten
│   └── database.py         # SQLite-Datenbankzugriff
├── webapp/
│   ├── app.py              # Flask-Anwendung (Web-Panel)
│   ├── templates/
│   │   ├── index.html      # Übersicht aller Tickets
│   │   └── transcript_detail.html  # Zeigt ein einzelnes Transkript
│   └── static/             # (optionale statische Dateien)
├── tickets.sqlite          # SQLite-Datenbank (wird automatisch angelegt)
├── .env                    # Deine Umgebungsvariablen
└── requirements.txt        # Liste benötigter Pakete (Beispiel)

Installation & Konfiguration

  1. Projekt klonen/entpacken
    Lade das Projekt in einen geeigneten Ordner.

  2. Virtuelle Umgebung (optional, empfohlen)

    python -m venv venv
    source venv/bin/activate  # (Linux/Mac)
    # Windows: venv\Scripts\activate
  3. Abhängigkeiten installieren

    pip install -r requirements.txt

    Wenn keine requirements.txt vorliegt, erstelle eine mit ähnlichem Inhalt:

    discord.py==2.1.0
    openai==0.27.0
    flask==2.3.2
    requests==2.31.0
    python-dotenv==1.0.0
    aiohttp==3.8.4
    gunicorn==20.1.0   # nur falls benötigt
    
  4. Konfiguration in .env
    Erstelle eine Datei namens .env (im Hauptverzeichnis). Beispiel:

    BOT_TOKEN=DEIN_DISCORD_BOT_TOKEN
    GUILD_ID=123456789123456789
    
    SUPPORT_ROLE_ID=111111111111111111
    ADMIN_ROLE_ID=222222222222222222
    VIEWER_ROLE_ID=333333333333333333
    VIEWER2_ROLE_ID=444444444444444444
    
    CREATED_TICKETS_CATEGORY_ID=555555555555555555
    CLAIMED_TICKETS_CATEGORY_ID=666666666666666666
    CLOSED_TICKETS_CATEGORY_ID=777777777777777777
    
    TICKET_LOG_CHANNEL_ID=888888888888888888
    MAX_TICKETS_PER_SUPPORTER=3
    TICKET_CLEANUP_DAYS=7
    
    OPENAI_API_KEY=sk-...
    OPENAI_MODEL=gpt-4o-mini
    
    # Flask WebApp
    FLASK_SECRET_KEY=EinLangerGeheimerString
    DISCORD_CLIENT_ID=1234567890
    DISCORD_CLIENT_SECRET=ABCDEFGHIJKLMNOPQRST
    DISCORD_REDIRECT_URI=https://deine-app.de/callback

    Wichtig:

    • Trage deinen eigenen Bot-Token (BOT_TOKEN) aus dem Developer Portal ein.
    • Die IDs (GUILD_ID, SUPPORT_ROLE_ID usw.) müssen deinen Server/Rollen widerspiegeln.
    • OPENAI_API_KEY ist dein Key für die GPT-3.5-API.
    • Die Discord OAuth2-Daten (DISCORD_CLIENT_ID, DISCORD_CLIENT_SECRET, DISCORD_REDIRECT_URI) sind für die Web-App-Anmeldung relevant.

Start des Discord-Bots (lokal)

  1. Terminal öffnen, ins Projektverzeichnis wechseln.
  2. (Optional) Virtuelle Umgebung aktivieren.
  3. Bot starten:
    python main.py
  4. Auf der Konsole sollten Meldungen wie
    [LOG] Erfolgreich cogs.ticket_cog geladen.
    [LOG] Erfolgreich cogs.transcript_cog geladen.
    [LOG] Starte Bot...
    [LOG] Eingeloggt als DeinBotName (ID: 123456789)
    
    erscheinen. Der Bot ist nun auf deinem Server online (sofern Token & IDs stimmen).

Start des Flask-Webservers (lokal)

  1. Prüfe .env: FLASK_SECRET_KEY, DISCORD_CLIENT_ID, DISCORD_CLIENT_SECRET, DISCORD_REDIRECT_URI.
  2. Starte die Flask-App:
    python webapp/app.py
  3. Sie läuft in der Voreinstellung auf http://127.0.0.1:60123.
  4. Öffne die URL im Browser. Du wirst über Discord-OAuth2 geleitet (sofern DISCORD_REDIRECT_URI korrekt eingetragen ist).

Produktivbetrieb

Im produktiven Umfeld empfiehlt es sich, den Discord-Bot (main.py) als Systemd-Service laufen zu lassen und die Flask-App mit Gunicorn (ebenfalls in einem Systemd-Service) zu betreiben. So kannst du beide Prozesse dauerhaft und stabil im Hintergrund laufen lassen und über einen Reverse Proxy (Nginx/Apache) absichern.

Gunicorn für Flask-Webapp

  1. Gunicorn installieren (falls nicht bereits geschehen):
    pip install gunicorn
  2. Gunicorn starten (Beispiel):
    gunicorn -w 2 -b 0.0.0.0:60123 webapp.app:app
    • -w 2 = 2 Worker-Prozesse.
    • -b 0.0.0.0:60123 = Port 60123 auf allen Interfaces.
    • webapp.app:app = Importiere das Flask-App-Objekt app aus webapp/app.py.

Systemd-Service für main.py (Discord-Bot)

Lege eine Service-Datei an, z. B. /etc/systemd/system/discord_ticketbot.service:

[Unit]
Description=Discord Ticketbot
After=network.target

...
Read more