diff --git a/SQL/feedback_schema.sql b/SQL/feedback_schema.sql index 09657498b9f..cd4b5f07f37 100644 --- a/SQL/feedback_schema.sql +++ b/SQL/feedback_schema.sql @@ -246,7 +246,7 @@ CREATE TABLE IF NOT EXISTS `chatlogs_ckeys` ( ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci; CREATE TABLE IF NOT EXISTS `chatlogs_logs` ( - `id` int(11) NOT NULL AUTO_INCREMENT, + `id` bigint(20) NOT NULL AUTO_INCREMENT, `round_id` int(11) NOT NULL DEFAULT -1, `target` varchar(45) NOT NULL, `text` mediumtext NOT NULL, @@ -257,3 +257,40 @@ CREATE TABLE IF NOT EXISTS `chatlogs_logs` ( KEY `chatlogs_ckeys_FK` (`target`), CONSTRAINT `chatlogs_ckeys_FK` FOREIGN KEY (`target`) REFERENCES `chatlogs_ckeys` (`ckey`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci; + +CREATE EVENT `chatlogs_logs_clear_old_logs` + ON SCHEDULE + EVERY 1 MONTH STARTS '2025-01-01 04:00:00' + ON COMPLETION PRESERVE + ENABLE + COMMENT 'This event periodically clears the chatlog logs of very old logs' + DO BEGIN + +DELETE FROM chatlogs_logs WHERE created_at < UNIX_TIMESTAMP(DATE_SUB(NOW(), INTERVAL 3 MONTH)) * 1000; + +END + +CREATE TABLE `chatlogs_rounds` ( + `round_id` BIGINT(20) NOT NULL DEFAULT -1, + `ckey` VARCHAR(45) NOT NULL COLLATE 'utf8mb4_uca1400_ai_ci', + PRIMARY KEY (`round_id`, `ckey`) USING BTREE +) ENGINE=InnoDB COLLATE='utf8mb4_uca1400_ai_ci'; + +CREATE PROCEDURE `chatlogs_rounds_insert`( + IN `p_round_id` BIGINT, + IN `p_ckey` VARCHAR(45) +) +LANGUAGE SQL +NOT DETERMINISTIC +CONTAINS SQL +SQL SECURITY INVOKER +COMMENT 'Inserts a new row into \'chatlogs_rounds\' and deletes the oldest entry, if the ckey already has 10 round id\'s stored.' +BEGIN + +INSERT IGNORE INTO chatlogs_rounds(round_id, ckey) VALUES (p_round_id, p_ckey); + +IF (SELECT COUNT(*) FROM chatlogs_rounds WHERE ckey = p_ckey) > 10 THEN + DELETE FROM chatlogs_rounds WHERE ckey = p_ckey ORDER BY round_id ASC LIMIT 1; +END IF; + +END diff --git a/code/__defines/vchatlog.dm b/code/__defines/vchatlog.dm index 7b53cd1fbdd..a466767cf49 100644 --- a/code/__defines/vchatlog.dm +++ b/code/__defines/vchatlog.dm @@ -17,7 +17,7 @@ * * ckey - Ckey of the message receiver * * token - Randomized token */ -#define vchatlog_generate_token(ckey) VCHATLOG_CALL("generate_token", ckey) +#define vchatlog_generate_token(ckey, round_id) VCHATLOG_CALL("generate_token", ckey, round_id) /** * Writes a new chatlog entry to the database. This function does not return anything. diff --git a/code/modules/client/client procs.dm b/code/modules/client/client procs.dm index 37c5ef784cd..eaa98f36e22 100644 --- a/code/modules/client/client procs.dm +++ b/code/modules/client/client procs.dm @@ -245,7 +245,7 @@ GLOB.directory[ckey] = src if (CONFIG_GET(flag/chatlog_database_backend)) - chatlog_token = vchatlog_generate_token(ckey) + chatlog_token = vchatlog_generate_token(ckey, GLOB.round_id) // Instantiate stat panel stat_panel = new(src, "statbrowser") diff --git a/libvchatlog.so b/libvchatlog.so index a0b04f523e3..1fa6cb60714 100755 Binary files a/libvchatlog.so and b/libvchatlog.so differ diff --git a/vchatlog.dll b/vchatlog.dll index d43fbb74821..15c47ac6396 100644 Binary files a/vchatlog.dll and b/vchatlog.dll differ