From 9deae19c90d52f5fad8635a9c55fcb4f2b2e2f79 Mon Sep 17 00:00:00 2001 From: joep van der velden Date: Sun, 23 Aug 2020 01:18:23 +0200 Subject: [PATCH] Log record view limits. No turf ref. null pointer fix. Performance improvements --- code/datums/log_record.dm | 12 ++++++++---- code/datums/log_viewer.dm | 35 ++++++++++++++++++++++++++--------- 2 files changed, 34 insertions(+), 13 deletions(-) diff --git a/code/datums/log_record.dm b/code/datums/log_record.dm index 7d127eedc7d..2a659477b47 100644 --- a/code/datums/log_record.dm +++ b/code/datums/log_record.dm @@ -3,8 +3,8 @@ var/raw_time // When did this happen? var/what // What happened var/who // Who did it - var/target // Who/what was targeted (can be a string) - var/turf/where // Where did it happen + var/target // Who/what was targeted + var/where // Where did it happen /datum/log_record/New(_log_type, _who, _what, _target, _where, _raw_time) log_type = _log_type @@ -12,9 +12,13 @@ who = get_subject_text(_who, _log_type) what = _what target = get_subject_text(_target, _log_type) - if(!_where) + if(!istext(_where) && !isturf(_where)) _where = get_turf(_who) - where = _where + if(isturf(_where)) + var/turf/T = _where + where = ADMIN_COORDJMP(T) + else + where = _where if(!_raw_time) _raw_time = world.time raw_time = _raw_time diff --git a/code/datums/log_viewer.dm b/code/datums/log_viewer.dm index 5f7084a738b..c5a17507606 100644 --- a/code/datums/log_viewer.dm +++ b/code/datums/log_viewer.dm @@ -4,6 +4,9 @@ if(!result || result.ckey != __ckey){\ selected_ckeys_mobs[__ckey] = result;\ } +#define RECORD_WARN_LIMIT 1000 +#define RECORD_HARD_LIMIT 2500 + /datum/log_viewer var/time_from = 0 var/time_to = 4 HOURS // 4 Hours should be enough. INFINITY would screw the UI up @@ -23,7 +26,7 @@ if(!result || result.ckey != __ckey){\ log_records.Cut() return -/datum/log_viewer/proc/search() +/datum/log_viewer/proc/search(user) log_records.Cut() // Empty the old results var/list/invalid_mobs = list() var/list/ckeys = selected_ckeys.Copy() @@ -47,8 +50,8 @@ if(!result || result.ckey != __ckey){\ continue log_records.Add(logs.Copy(start_index, end_index + 1)) - if(invalid_mobs.len) - to_chat(usr, "The search criteria contained invalid mobs. They have been removed from the criteria.") + if(length(invalid_mobs)) + to_chat(user, "The search criteria contained invalid mobs. They have been removed from the criteria.") for(var/i in invalid_mobs) selected_mobs -= i // Cleanup @@ -103,13 +106,13 @@ if(!result || result.ckey != __ckey){\ return 0 /datum/log_viewer/proc/add_mobs(list/mob/mobs) - if(!mobs?.len) + if(!length(mobs)) return for(var/i in mobs) add_mob(usr, i, FALSE) /datum/log_viewer/proc/add_ckey(mob/user, ckey) - if(!user || !user) + if(!user || !ckey) return selected_ckeys |= ckey UPDATE_CKEY_MOB(ckey) @@ -127,7 +130,7 @@ if(!result || result.ckey != __ckey){\ var/all_log_types = ALL_LOGS var/trStyleTop = "border-top:2px solid; border-bottom:2px solid; padding-top: 5px; padding-bottom: 5px;" var/trStyle = "border-top:1px solid; border-bottom:1px solid; padding-top: 5px; padding-bottom: 5px;" - var/dat + var/list/dat = list() dat += "" dat += "
" dat += "Time Search Range: [gameTimestamp(wtime = time_from)]" @@ -184,13 +187,12 @@ if(!result || result.ckey != __ckey){\ dat +="[time][L.log_type]\ [L.who][L.what]\ - [L.target][ADMIN_COORDJMP(L.where)]" - + [L.target][L.where]" dat += "" dat += "
" var/datum/browser/popup = new(user, "Log Viewer", "Log Viewer", 1500, 600) - popup.set_content(dat) + popup.set_content(dat.Join()) popup.open() /datum/log_viewer/Topic(href, href_list) @@ -219,6 +221,19 @@ if(!result || result.ckey != __ckey){\ return if(href_list["search"]) search(usr) + var/records_len = length(log_records) + if(records_len > RECORD_WARN_LIMIT) + var/datum/log_record/last_record = log_records[RECORD_WARN_LIMIT] + var/last_time = gameTimestamp(wtime = last_record.raw_time - 9.99) + var/answer = alert(usr, "More than [RECORD_WARN_LIMIT] records were found. continuing will take a long time. This won't cause much lag for the server. Time at the [RECORD_WARN_LIMIT]th record '[last_time]'", "Warning", "Continue", "Limit to [RECORD_WARN_LIMIT]", "Cancel") + if(answer == "Limit to [RECORD_WARN_LIMIT]") + log_records.Cut(RECORD_WARN_LIMIT) + else if(answer == "Cancel") + log_records.Cut() + else + if(records_len > RECORD_HARD_LIMIT) + to_chat(usr, "Record limit reached. Limiting to [RECORD_HARD_LIMIT].") + log_records.Cut(RECORD_HARD_LIMIT) show_ui(usr) return if(href_list["clear_all"]) @@ -300,3 +315,5 @@ if(!result || result.ckey != __ckey){\ return get_display_name(M) #undef UPDATE_CKEY_MOB +#undef RECORD_WARN_LIMIT +#undef RECORD_HARD_LIMIT