Server-Monitor v3, Composer v2, Temp-Voice-Panel und Embed-Polish
- Server-Monitor v3: gamedig-Integration (300+ Spiele), GSM-Stil-Embeds (Spieler-Balken mit %, Map, Spieler-Liste, klickbarer Connect-Link, Ping im Footer), Down/Up-Alerts (2 Fails → 🚨, Recovery → ✅ mit Downtime) in konfigurierbaren Alert-Kanal; Server-Tab mit 19 Spiel-Presets, Host/Port bzw. Query-URL und Connect-URL - Composer v2: visueller Embed-Builder mit Live-Discord-Preview (Autor, Felder, Bilder, Farbe, Footer, Timestamp), speicherbare Vorlagen (/api/templates), /api/compose versteht volle Embeds - Temp-Voice: Control-Panel im erstellten Kanal (Umbenennen, Sperren, Limit, Löschen) — nur der Kanal-Besitzer darf bedienen - Embed-Polish: brandEmbed-Factory (src/embeds.js), Footer überall mit Bot-Avatar-Icon Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
This commit is contained in:
@@ -361,7 +361,26 @@ db.exec(`
|
||||
CREATE TABLE IF NOT EXISTS temp_voice (
|
||||
channel_id TEXT PRIMARY KEY
|
||||
);
|
||||
CREATE TABLE IF NOT EXISTS message_templates (
|
||||
id INTEGER PRIMARY KEY AUTOINCREMENT,
|
||||
name TEXT NOT NULL UNIQUE,
|
||||
payload TEXT NOT NULL
|
||||
);
|
||||
`);
|
||||
// Migration: Temp-Voice-Besitzer (fürs Control-Panel)
|
||||
{
|
||||
const cols = db.prepare('PRAGMA table_info(temp_voice)').all().map((c) => c.name);
|
||||
if (!cols.includes('owner_id')) db.exec(`ALTER TABLE temp_voice ADD COLUMN owner_id TEXT NOT NULL DEFAULT ''`);
|
||||
}
|
||||
const upsertTemplate = db.prepare(`
|
||||
INSERT INTO message_templates (name, payload) VALUES (?, ?)
|
||||
ON CONFLICT(name) DO UPDATE SET payload = excluded.payload
|
||||
`);
|
||||
const listTemplatesStmt = db.prepare('SELECT id, name, payload FROM message_templates ORDER BY name');
|
||||
const deleteTemplateStmt = db.prepare('DELETE FROM message_templates WHERE name = ?');
|
||||
export const saveTemplate = (name, payload) => upsertTemplate.run(name, JSON.stringify(payload));
|
||||
export const listTemplates = () => listTemplatesStmt.all().map((t) => ({ ...t, payload: JSON.parse(t.payload) }));
|
||||
export const deleteTemplate = (name) => deleteTemplateStmt.run(name).changes > 0;
|
||||
const upsertTrigger = db.prepare(`
|
||||
INSERT INTO triggers (keyword, reply) VALUES (?, ?)
|
||||
ON CONFLICT(keyword) DO UPDATE SET reply = excluded.reply
|
||||
@@ -395,10 +414,12 @@ const activityRangeStmt = db.prepare(
|
||||
);
|
||||
export const activityRange = (days = 30) => activityRangeStmt.all(`-${days} days`);
|
||||
|
||||
const insertTempVoice = db.prepare('INSERT OR IGNORE INTO temp_voice (channel_id) VALUES (?)');
|
||||
const insertTempVoice = db.prepare('INSERT OR IGNORE INTO temp_voice (channel_id, owner_id) VALUES (?, ?)');
|
||||
const tempVoiceOwnerStmt = db.prepare('SELECT owner_id FROM temp_voice WHERE channel_id = ?');
|
||||
export const tempVoiceOwner = (id) => tempVoiceOwnerStmt.get(id)?.owner_id ?? null;
|
||||
const deleteTempVoiceStmt = db.prepare('DELETE FROM temp_voice WHERE channel_id = ?');
|
||||
const listTempVoiceStmt = db.prepare('SELECT channel_id FROM temp_voice');
|
||||
export const trackTempVoice = (id) => insertTempVoice.run(id);
|
||||
export const trackTempVoice = (id, ownerId = '') => insertTempVoice.run(id, ownerId);
|
||||
export const untrackTempVoice = (id) => deleteTempVoiceStmt.run(id);
|
||||
export const listTempVoice = () => listTempVoiceStmt.all().map((r) => r.channel_id);
|
||||
const isTempVoiceStmt = db.prepare('SELECT 1 FROM temp_voice WHERE channel_id = ?');
|
||||
@@ -453,11 +474,21 @@ db.exec(`
|
||||
db.prepare(`DELETE FROM settings WHERE key = 'gameservers'`).run();
|
||||
}
|
||||
}
|
||||
// Migration v3: host/port (gamedig) + connect_url (Connect-Link im Embed)
|
||||
{
|
||||
const cols = db.prepare('PRAGMA table_info(gameservers)').all().map((c) => c.name);
|
||||
if (!cols.includes('host')) db.exec(`ALTER TABLE gameservers ADD COLUMN host TEXT NOT NULL DEFAULT ''`);
|
||||
if (!cols.includes('port')) db.exec('ALTER TABLE gameservers ADD COLUMN port INTEGER');
|
||||
if (!cols.includes('connect_url')) db.exec(`ALTER TABLE gameservers ADD COLUMN connect_url TEXT NOT NULL DEFAULT ''`);
|
||||
}
|
||||
const insertGameserver = db.prepare(`
|
||||
INSERT INTO gameservers (name, type, query_url, address) VALUES (@name, @type, @query_url, @address)
|
||||
INSERT INTO gameservers (name, type, query_url, address, host, port, connect_url)
|
||||
VALUES (@name, @type, @query_url, @address, @host, @port, @connect_url)
|
||||
`);
|
||||
const updateGameserverStmt = db.prepare(`
|
||||
UPDATE gameservers SET name = @name, type = @type, query_url = @query_url, address = @address WHERE id = @id
|
||||
UPDATE gameservers SET name = @name, type = @type, query_url = @query_url, address = @address,
|
||||
host = @host, port = @port, connect_url = @connect_url
|
||||
WHERE id = @id
|
||||
`);
|
||||
const setGameserverMessageStmt = db.prepare('UPDATE gameservers SET message_id = ? WHERE id = ?');
|
||||
const listGameserversStmt = db.prepare('SELECT * FROM gameservers ORDER BY id');
|
||||
|
||||
Reference in New Issue
Block a user