From 9dd566a5867c821c4f5f17ad141ec5e3ea5ce4c0 Mon Sep 17 00:00:00 2001 From: Jordie <4343468+Jordie0608@users.noreply.github.com> Date: Fri, 27 Jul 2018 16:15:41 +1000 Subject: [PATCH] Change +everything admin flag to not use ALL define (#39142) * change +everything admin flag to not use ALL define * add proc to handle max flag value changing update to db --- code/__DEFINES/admin.dm | 2 +- code/__HELPERS/roundend.dm | 25 +++++++++++++++++++++++++ code/controllers/subsystem/ticker.dm | 1 + code/modules/admin/admin_ranks.dm | 12 +++++++++--- code/modules/admin/holder2.dm | 2 +- code/modules/client/client_procs.dm | 2 +- 6 files changed, 38 insertions(+), 6 deletions(-) diff --git a/code/__DEFINES/admin.dm b/code/__DEFINES/admin.dm index 255464d4068..811761c582b 100644 --- a/code/__DEFINES/admin.dm +++ b/code/__DEFINES/admin.dm @@ -38,7 +38,7 @@ #define R_DEFAULT R_AUTOLOGIN -#define R_MAXPERMISSION 4096 //This holds the maximum value for a permission. It is used in iteration, so keep it updated. +#define R_EVERYTHING (1<<15)-1 //the sum of all other rank permissions, used for +EVERYTHING #define ADMIN_QUE(user) "(?)" #define ADMIN_FLW(user) "(FLW)" diff --git a/code/__HELPERS/roundend.dm b/code/__HELPERS/roundend.dm index e86c57ac24b..5c2a4c42529 100644 --- a/code/__HELPERS/roundend.dm +++ b/code/__HELPERS/roundend.dm @@ -543,3 +543,28 @@ file_data["admins"]["[i]"] = A.rank.name fdel(json_file) WRITE_FILE(json_file, json_encode(file_data)) + +/datum/controller/subsystem/ticker/proc/update_everything_flag_in_db() + for(var/datum/admin_rank/R in GLOB.admin_ranks) + var/list/flags = list() + if(R.include_rights == R_EVERYTHING) + flags += "flags" + if(R.exclude_rights == R_EVERYTHING) + flags += "exclude_flags" + if(R.can_edit_rights == R_EVERYTHING) + flags += "can_edit_flags" + if(!flags.len) + continue + var/flags_to_check = flags.Join(" != [R_EVERYTHING] AND ") + " != [R_EVERYTHING]" + var/datum/DBQuery/query_check_everything_ranks = SSdbcore.NewQuery("SELECT flags, exclude_flags, can_edit_flags FROM [format_table_name("admin_ranks")] WHERE rank = '[R.name]' AND ([flags_to_check])") + if(!query_check_everything_ranks.Execute()) + qdel(query_check_everything_ranks) + return + if(query_check_everything_ranks.NextRow()) //no row is returned if the rank already has the correct flag value + var/flags_to_update = flags.Join(" = [R_EVERYTHING], ") + " = [R_EVERYTHING]" + var/datum/DBQuery/query_update_everything_ranks = SSdbcore.NewQuery("UPDATE [format_table_name("admin_ranks")] SET [flags_to_update] WHERE rank = '[R.name]'") + if(!query_update_everything_ranks.Execute()) + qdel(query_update_everything_ranks) + return + qdel(query_update_everything_ranks) + qdel(query_check_everything_ranks) diff --git a/code/controllers/subsystem/ticker.dm b/code/controllers/subsystem/ticker.dm index 02af7be0d83..0f93ddfb1cc 100755 --- a/code/controllers/subsystem/ticker.dm +++ b/code/controllers/subsystem/ticker.dm @@ -626,6 +626,7 @@ SUBSYSTEM_DEF(ticker) /datum/controller/subsystem/ticker/Shutdown() gather_newscaster() //called here so we ensure the log is created even upon admin reboot save_admin_data() + update_everything_flag_in_db() if(!round_end_sound) round_end_sound = pick(\ 'sound/roundend/newroundsexy.ogg', diff --git a/code/modules/admin/admin_ranks.dm b/code/modules/admin/admin_ranks.dm index 9fcde1f5014..bfd4ec54941 100644 --- a/code/modules/admin/admin_ranks.dm +++ b/code/modules/admin/admin_ranks.dm @@ -71,7 +71,7 @@ GLOBAL_PROTECT(protected_ranks) if("varedit") flag = R_VAREDIT if("everything","host","all") - flag = ALL + flag = R_EVERYTHING if("sound","sounds") flag = R_SOUNDS if("spawn","create") @@ -182,9 +182,12 @@ GLOBAL_PROTECT(protected_ranks) return FALSE var/list/json = json_decode(backup_file) for(var/J in json["ranks"]) + var/skip for(var/datum/admin_rank/R in GLOB.admin_ranks) if(R.name == "[J]") //this rank was already loaded from txt override - continue + skip = TRUE + if(skip) + continue var/datum/admin_rank/R = new("[J]", json["ranks"]["[J]"]["include rights"], json["ranks"]["[J]"]["exclude rights"], json["ranks"]["[J]"]["can edit rights"]) if(!R) continue @@ -266,9 +269,12 @@ GLOBAL_PROTECT(protected_ranks) return backup_file_json = json_decode(backup_file) for(var/J in backup_file_json["admins"]) + var/skip for(var/A in GLOB.admin_datums + GLOB.deadmins) if(A == "[J]") //this admin was already loaded from txt override - continue + skip = TRUE + if(skip) + continue new /datum/admins(rank_names[ckeyEx(backup_file_json["admins"]["[J]"])], ckey("[J]")) #ifdef TESTING var/msg = "Admins Built:\n" diff --git a/code/modules/admin/holder2.dm b/code/modules/admin/holder2.dm index 321142376ad..11fb4e7a8b0 100644 --- a/code/modules/admin/holder2.dm +++ b/code/modules/admin/holder2.dm @@ -137,7 +137,7 @@ GLOBAL_PROTECT(href_token) /datum/admins/proc/check_if_greater_rights_than_holder(datum/admins/other) if(!other) return 1 //they have no rights - if(rank.rights == 65535) + if(rank.rights == R_EVERYTHING) return 1 //we have all the rights if(src == other) return 1 //you always have more rights than yourself diff --git a/code/modules/client/client_procs.dm b/code/modules/client/client_procs.dm index 22879e35d90..626b5eb6998 100644 --- a/code/modules/client/client_procs.dm +++ b/code/modules/client/client_procs.dm @@ -188,7 +188,7 @@ GLOBAL_LIST_EMPTY(external_rsc_urls) if(CONFIG_GET(flag/enable_localhost_rank) && !connecting_admin) var/localhost_addresses = list("127.0.0.1", "::1") if(isnull(address) || (address in localhost_addresses)) - var/datum/admin_rank/localhost_rank = new("!localhost!", 65535, 16384, 65535) //+EVERYTHING -DBRANKS *EVERYTHING + var/datum/admin_rank/localhost_rank = new("!localhost!", R_EVERYTHING, R_DBRANKS, R_EVERYTHING) //+EVERYTHING -DBRANKS *EVERYTHING new /datum/admins(localhost_rank, ckey, 1, 1) //preferences datum - also holds some persistent data for the client (because we may as well keep these datums to a minimum) prefs = GLOB.preferences_datums[ckey]