Panel: plugin integrations (LuckPerms ranks + group mapping, reports), server event queue, developer API endpoints
This commit is contained in:
10 files changed
+906
-2
No files matched your search
@@ -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#"
|
||||
|
||||
Reference in new issue
Block a user