Records: the most bomb plants, defuses, knife, Zeus and headshot kills for the last 7 days, 30 days or all time, and each player's counts, when PlaytimeHistory 0.2.0's pt_events is there. The public site's top bar now sticks the whole way down, Playtime comes after Server, and only the player drawer scrolls while it's open.
174 lines
7.1 KiB
SQL
174 lines
7.1 KiB
SQL
-- A copy of PlaytimeHistory's Migrations/*.sql (plugins/PlaytimeHistory, 0.2.0), in order, for
|
|
-- playtime_db_test.go. Keep it in step with the plugin's migrations.
|
|
|
|
-- All times are UTC. Tables are prefixed pt_ so they can share a database if ever needed.
|
|
|
|
CREATE TABLE IF NOT EXISTS `pt_servers` (
|
|
`id` int NOT NULL,
|
|
`address` varchar(64) NOT NULL DEFAULT '',
|
|
`hostname` varchar(128) NOT NULL DEFAULT '',
|
|
`first_seen` datetime NOT NULL,
|
|
`last_seen` datetime NOT NULL,
|
|
PRIMARY KEY (`id`)
|
|
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
|
|
|
|
-- One row per connection, opened on join and closed on leave or map change.
|
|
-- end_kind: 0 open, 1 disconnect, 2 map change, 3 plugin unload, 4 stale (closed at its last
|
|
-- heartbeat after the server died).
|
|
CREATE TABLE IF NOT EXISTS `pt_sessions` (
|
|
`id` bigint unsigned NOT NULL AUTO_INCREMENT,
|
|
`session_key` char(32) NOT NULL,
|
|
`steamid64` bigint unsigned NOT NULL,
|
|
`server_id` int NOT NULL,
|
|
`nickname` varchar(128) NOT NULL,
|
|
`started_at` datetime NOT NULL,
|
|
`ended_at` datetime NULL,
|
|
`heartbeat_at` datetime NOT NULL,
|
|
`duration_seconds` int unsigned NULL,
|
|
`end_kind` tinyint NOT NULL DEFAULT 0,
|
|
`connect_map` varchar(64) NOT NULL,
|
|
`disconnect_map` varchar(64) NULL,
|
|
`disconnect_reason` smallint NULL,
|
|
`disconnect_reason_name` varchar(64) NULL,
|
|
`players_online` smallint unsigned NOT NULL,
|
|
`max_players` smallint unsigned NOT NULL,
|
|
`country_iso` char(2) NULL,
|
|
`country_name` varchar(64) NULL,
|
|
`city` varchar(128) NULL,
|
|
`kills` int NULL,
|
|
`deaths` int NULL,
|
|
`assists` int NULL,
|
|
`headshots` int NULL,
|
|
`damage` int NULL,
|
|
`mvp` int NULL,
|
|
`score` int NULL,
|
|
`rounds_played` smallint unsigned NULL,
|
|
`ping_avg` smallint unsigned NULL,
|
|
`ping_min` smallint unsigned NULL,
|
|
`ping_max` smallint unsigned NULL,
|
|
`ping_samples` int unsigned NULL,
|
|
`plugin_version` varchar(32) NOT NULL,
|
|
PRIMARY KEY (`id`),
|
|
UNIQUE KEY `uq_session_key` (`session_key`),
|
|
KEY `ix_steamid_started` (`steamid64`, `started_at`),
|
|
KEY `ix_server_started` (`server_id`, `started_at`),
|
|
KEY `ix_started` (`started_at`),
|
|
KEY `ix_server_open` (`server_id`, `ended_at`)
|
|
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
|
|
|
|
-- A stretch of a session where the player's team and alive/dead state didn't change.
|
|
-- team: 0 unassigned, 1 spectator, 2 T, 3 CT. alive: NULL when not on T/CT.
|
|
CREATE TABLE IF NOT EXISTS `pt_segments` (
|
|
`id` bigint unsigned NOT NULL AUTO_INCREMENT,
|
|
`segment_key` char(32) NOT NULL,
|
|
`session_key` char(32) NOT NULL,
|
|
`steamid64` bigint unsigned NOT NULL,
|
|
`server_id` int NOT NULL,
|
|
`map` varchar(64) NOT NULL,
|
|
`team` tinyint NOT NULL,
|
|
`alive` tinyint NULL,
|
|
`started_at` datetime NOT NULL,
|
|
`ended_at` datetime NULL,
|
|
`heartbeat_at` datetime NOT NULL,
|
|
`seconds` int unsigned NULL,
|
|
PRIMARY KEY (`id`),
|
|
UNIQUE KEY `uq_segment_key` (`segment_key`),
|
|
KEY `ix_steamid_started` (`steamid64`, `started_at`),
|
|
KEY `ix_started` (`started_at`),
|
|
KEY `ix_session` (`session_key`),
|
|
KEY `ix_server_open` (`server_id`, `ended_at`)
|
|
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
|
|
|
|
-- Running totals, added to in the same transaction that closes a segment or session.
|
|
-- spec_seconds covers both spectator and unassigned. total_seconds includes it only when the
|
|
-- plugin's CountSpectatorTime is on.
|
|
CREATE TABLE IF NOT EXISTS `pt_players` (
|
|
`steamid64` bigint unsigned NOT NULL,
|
|
`first_seen` datetime NOT NULL,
|
|
`last_seen` datetime NOT NULL,
|
|
`sessions_count` int unsigned NOT NULL DEFAULT 0,
|
|
`total_seconds` bigint unsigned NOT NULL DEFAULT 0,
|
|
`t_seconds` bigint unsigned NOT NULL DEFAULT 0,
|
|
`ct_seconds` bigint unsigned NOT NULL DEFAULT 0,
|
|
`spec_seconds` bigint unsigned NOT NULL DEFAULT 0,
|
|
`alive_seconds` bigint unsigned NOT NULL DEFAULT 0,
|
|
`dead_seconds` bigint unsigned NOT NULL DEFAULT 0,
|
|
`last_nickname` varchar(128) NOT NULL,
|
|
`last_country` char(2) NULL,
|
|
`last_server_id` int NOT NULL,
|
|
PRIMARY KEY (`steamid64`),
|
|
KEY `ix_total` (`total_seconds`)
|
|
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
|
|
|
|
CREATE TABLE IF NOT EXISTS `pt_nicknames` (
|
|
`steamid64` bigint unsigned NOT NULL,
|
|
`nickname` varchar(128) NOT NULL,
|
|
`first_seen` datetime NOT NULL,
|
|
`last_seen` datetime NOT NULL,
|
|
`times_seen` int unsigned NOT NULL DEFAULT 1,
|
|
PRIMARY KEY (`steamid64`, `nickname`)
|
|
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
|
|
|
|
CREATE TABLE IF NOT EXISTS `pt_online_snapshots` (
|
|
`id` bigint unsigned NOT NULL AUTO_INCREMENT,
|
|
`server_id` int NOT NULL,
|
|
`taken_at` datetime NOT NULL,
|
|
`players` smallint unsigned NOT NULL,
|
|
`bots` smallint unsigned NOT NULL,
|
|
`max_players` smallint unsigned NOT NULL,
|
|
`map` varchar(64) NOT NULL,
|
|
PRIMARY KEY (`id`),
|
|
KEY `ix_server_taken` (`server_id`, `taken_at`)
|
|
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
|
|
|
|
-- Segments split at the hour boundaries: one row per segment per UTC hour it touches. Closed
|
|
-- segments only; filter on hour_start (and steamid64) when reading.
|
|
CREATE VIEW IF NOT EXISTS `pt_segments_hourly` AS
|
|
WITH RECURSIVE h AS (
|
|
SELECT s.steamid64, s.server_id, s.map, s.team, s.alive, s.ended_at,
|
|
CAST(DATE_FORMAT(s.started_at, '%Y-%m-%d %H:00:00') AS DATETIME) AS hour_start,
|
|
s.started_at AS piece_start
|
|
FROM pt_segments s
|
|
WHERE s.ended_at IS NOT NULL AND s.ended_at > s.started_at
|
|
UNION ALL
|
|
SELECT steamid64, server_id, map, team, alive, ended_at,
|
|
hour_start + INTERVAL 1 HOUR, hour_start + INTERVAL 1 HOUR
|
|
FROM h
|
|
WHERE hour_start + INTERVAL 1 HOUR < ended_at
|
|
)
|
|
SELECT steamid64, server_id, map, team, alive, hour_start,
|
|
TIMESTAMPDIFF(SECOND, piece_start, LEAST(ended_at, hour_start + INTERVAL 1 HOUR)) AS seconds
|
|
FROM h;
|
|
|
|
-- Migrations/002_Events.sql (0.2.0)
|
|
|
|
-- One row per kill, bomb plant and bomb defuse, written as it happens (0.2.0+). Nothing during
|
|
-- warmup. Kills leave out suicides and team kills.
|
|
-- kind: 1 kill, 2 bomb planted, 3 bomb defused. steamid64 is who did it: the killer, planter or
|
|
-- defuser. The kill-only columns are NULL for plants and defuses, and site is NULL for kills.
|
|
-- victim_steamid64 is NULL when the victim was a bot (victim_bot 1).
|
|
CREATE TABLE IF NOT EXISTS `pt_events` (
|
|
`id` bigint unsigned NOT NULL AUTO_INCREMENT,
|
|
`event_key` char(32) NOT NULL,
|
|
`server_id` int NOT NULL,
|
|
`session_key` char(32) NULL,
|
|
`steamid64` bigint unsigned NOT NULL,
|
|
`kind` tinyint NOT NULL,
|
|
`at` datetime NOT NULL,
|
|
`map` varchar(64) NOT NULL,
|
|
`team` tinyint NOT NULL,
|
|
`weapon` varchar(64) NULL,
|
|
`headshot` tinyint NULL,
|
|
`noscope` tinyint NULL,
|
|
`thrusmoke` tinyint NULL,
|
|
`wallbang` tinyint NULL,
|
|
`blind` tinyint NULL,
|
|
`victim_steamid64` bigint unsigned NULL,
|
|
`victim_bot` tinyint NULL,
|
|
`site` int NULL,
|
|
PRIMARY KEY (`id`),
|
|
UNIQUE KEY `uq_event_key` (`event_key`),
|
|
KEY `ix_kind_at` (`kind`, `at`),
|
|
KEY `ix_steamid_at` (`steamid64`, `at`),
|
|
KEY `ix_at` (`at`)
|
|
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
|