Panel: plugin integrations (LuckPerms ranks + group mapping, reports), server event queue, developer API endpoints

This commit is contained in:
Claude committed 2026-09-30 18:06:18 +00:00
1 parent c256c15d0e
commit badb5fccc0
10 files changed
+906 -2

No files matched your search

+79
View File
@@ -575,6 +575,85 @@ const MIGRATIONS: &[&str] = &[
ALTER TABLE server_market ADD COLUMN seller_guild_id TEXT;
ALTER TABLE guild_wallet_transactions ADD COLUMN note TEXT NOT NULL DEFAULT '';
"#,
// Plugin integrations (LuckPerms ranks, WorldGuard, Spark, CoreProtect…) and
// events queued for game servers (level-ups, guild joins, achievements).
r#"
ALTER TABLE groups ADD COLUMN luckperms_group TEXT NOT NULL DEFAULT '';
CREATE TABLE server_integrations (
server_id INTEGER NOT NULL REFERENCES game_servers(id) ON DELETE CASCADE,
name TEXT NOT NULL,
version TEXT NOT NULL DEFAULT '',
data TEXT NOT NULL DEFAULT '{}',
updated_at TEXT NOT NULL,
PRIMARY KEY (server_id, name)
);
CREATE TABLE player_ranks (
server_id INTEGER NOT NULL REFERENCES game_servers(id) ON DELETE CASCADE,
uuid TEXT NOT NULL,
primary_group TEXT NOT NULL DEFAULT '',
display TEXT NOT NULL DEFAULT '',
prefix TEXT NOT NULL DEFAULT '',
suffix TEXT NOT NULL DEFAULT '',
groups TEXT NOT NULL DEFAULT '[]',
permissions TEXT NOT NULL DEFAULT '[]',
weight INTEGER NOT NULL DEFAULT 0,
updated_at TEXT NOT NULL,
PRIMARY KEY (server_id, uuid)
);
CREATE INDEX player_ranks_uuid ON player_ranks(uuid);
CREATE TABLE server_notifications (
id INTEGER PRIMARY KEY AUTOINCREMENT,
server_id INTEGER NOT NULL REFERENCES game_servers(id) ON DELETE CASCADE,
kind TEXT NOT NULL,
uuid TEXT NOT NULL,
payload TEXT NOT NULL DEFAULT '{}',
created_at TEXT NOT NULL
);
CREATE INDEX server_notifications_server ON server_notifications(server_id, id);
"#,
// Every code path that changes a level, unlocks an achievement or moves a
// member queues the matching event for the servers the player is on.
r#"
CREATE TRIGGER notify_global_level AFTER UPDATE OF global_level ON user_levels WHEN NEW.global_level > OLD.global_level BEGIN
INSERT INTO server_notifications (server_id, kind, uuid, payload, created_at)
SELECT so.server_id, 'level_up', NEW.uuid,
json_object('scope', 'global', 'level', NEW.global_level, 'previous', OLD.global_level, 'xp', NEW.global_xp),
strftime('%Y-%m-%dT%H:%M:%SZ', 'now')
FROM server_online so WHERE so.uuid = NEW.uuid;
END;
CREATE TRIGGER notify_server_level AFTER UPDATE OF server_level ON server_levels WHEN NEW.server_level > OLD.server_level BEGIN
INSERT INTO server_notifications (server_id, kind, uuid, payload, created_at)
SELECT NEW.server_id, 'level_up', NEW.uuid,
json_object('scope', 'server', 'level', NEW.server_level, 'previous', OLD.server_level, 'xp', NEW.server_xp),
strftime('%Y-%m-%dT%H:%M:%SZ', 'now')
WHERE EXISTS (SELECT 1 FROM server_online so WHERE so.server_id = NEW.server_id AND so.uuid = NEW.uuid);
END;
CREATE TRIGGER notify_achievement AFTER INSERT ON user_achievements BEGIN
INSERT INTO server_notifications (server_id, kind, uuid, payload, created_at)
SELECT so.server_id, 'achievement', NEW.user_uuid,
json_object('id', NEW.achievement_id,
'title', (SELECT title FROM achievements WHERE id = NEW.achievement_id),
'xp', (SELECT xp_reward FROM achievements WHERE id = NEW.achievement_id)),
strftime('%Y-%m-%dT%H:%M:%SZ', 'now')
FROM server_online so WHERE so.uuid = NEW.user_uuid;
END;
CREATE TRIGGER notify_guild_join AFTER INSERT ON guild_members BEGIN
INSERT INTO server_notifications (server_id, kind, uuid, payload, created_at)
SELECT so.server_id, 'guild_join', NEW.uuid,
json_object('guild_id', NEW.guild_id, 'guild', (SELECT name FROM guilds WHERE id = NEW.guild_id),
'tag', (SELECT tag FROM guilds WHERE id = NEW.guild_id), 'role', NEW.role),
strftime('%Y-%m-%dT%H:%M:%SZ', 'now')
FROM server_online so WHERE so.uuid = NEW.uuid;
END;
CREATE TRIGGER notify_guild_leave AFTER DELETE ON guild_members BEGIN
INSERT INTO server_notifications (server_id, kind, uuid, payload, created_at)
SELECT so.server_id, 'guild_leave', OLD.uuid,
json_object('guild_id', OLD.guild_id, 'guild', (SELECT name FROM guilds WHERE id = OLD.guild_id),
'tag', (SELECT tag FROM guilds WHERE id = OLD.guild_id)),
strftime('%Y-%m-%dT%H:%M:%SZ', 'now')
FROM server_online so WHERE so.uuid = OLD.uuid;
END;
"#,
// Bumped by any change to claims, guilds or membership so game servers can
// poll a single number instead of asking about every block.
r#"