From a512e536ca4cb0fd7b06fe8b4e33dae8318ac538 Mon Sep 17 00:00:00 2001 From: Furior Date: Tue, 31 Dec 2024 14:30:18 +0700 Subject: [PATCH 01/40] wip ss central: wl and discord link --- config/bandastation/bandastation_config.txt | 10 ++- .../metaserver/_metaserver.dm | 4 ++ .../metaserver/_metaserver.dme | 3 + .../code/old_wl.dm} | 6 +- .../metaserver/code/ss_central.dm | 72 +++++++++++++++++++ modular_bandastation/modular_bandastation.dme | 2 +- .../whitelist220/_whitelist220.dm | 4 -- .../whitelist220/_whitelist220.dme | 3 - 8 files changed, 91 insertions(+), 13 deletions(-) create mode 100644 modular_bandastation/metaserver/_metaserver.dm create mode 100644 modular_bandastation/metaserver/_metaserver.dme rename modular_bandastation/{whitelist220/code/whitelist220.dm => metaserver/code/old_wl.dm} (97%) create mode 100644 modular_bandastation/metaserver/code/ss_central.dm delete mode 100644 modular_bandastation/whitelist220/_whitelist220.dm delete mode 100644 modular_bandastation/whitelist220/_whitelist220.dme diff --git a/config/bandastation/bandastation_config.txt b/config/bandastation/bandastation_config.txt index 9227fcb4f1fdb..573d04b7dc352 100644 --- a/config/bandastation/bandastation_config.txt +++ b/config/bandastation/bandastation_config.txt @@ -4,13 +4,19 @@ #TTS_CACHE_ENABLED #TTS_API_URL_SILERO -#WHITELIST220 +## SS Central +SS_CENTRAL_URL http://127.0.0.1:8000 +SS_CENTRAL_TOKEN 12345678 +WHITELIST_TYPE default +## Entry from the general config.txt +#USEWHITELIST ## A minimum amount of security required on roundstart ## If there is less security than this value, a percent of roundstart threat will be pushed to midround ## Example: with value of 5, if there is 2 security members out of 5, then 3/5 of roundstart threat will be moved to midround #ROUNDSTART_SECURITY_FOR_THREAT 5 +## Webhooks #TRANSLATE_SUGGEST_WEBHOOK_URL #INTERVIEW_WEBHOOK_URL @@ -32,4 +38,4 @@ ROUNDSTART_RACES vulpkanin ## If players are able to create crew transfer vote #ALLOW_CREW_TRANSFER_VOTE ## If automatic crew transfer is enabled -#ENABLE_AUTOMATIC_CREW_TRANSFER \ No newline at end of file +#ENABLE_AUTOMATIC_CREW_TRANSFER diff --git a/modular_bandastation/metaserver/_metaserver.dm b/modular_bandastation/metaserver/_metaserver.dm new file mode 100644 index 0000000000000..dd2f59856dc9c --- /dev/null +++ b/modular_bandastation/metaserver/_metaserver.dm @@ -0,0 +1,4 @@ +/datum/modpack/metaserver + name = "Metaserver" + desc = "Использование вайтлиста через БД" + author = "furior, larentoun" diff --git a/modular_bandastation/metaserver/_metaserver.dme b/modular_bandastation/metaserver/_metaserver.dme new file mode 100644 index 0000000000000..e10d677c0149e --- /dev/null +++ b/modular_bandastation/metaserver/_metaserver.dme @@ -0,0 +1,3 @@ +#include "_metaserver.dm" + +#include "code/ss_central.dm" diff --git a/modular_bandastation/whitelist220/code/whitelist220.dm b/modular_bandastation/metaserver/code/old_wl.dm similarity index 97% rename from modular_bandastation/whitelist220/code/whitelist220.dm rename to modular_bandastation/metaserver/code/old_wl.dm index 0a43eb82fd1ef..533117df43aff 100644 --- a/modular_bandastation/whitelist220/code/whitelist220.dm +++ b/modular_bandastation/metaserver/code/old_wl.dm @@ -5,7 +5,7 @@ (date_end IS NULL OR NOW() Date: Wed, 1 Jan 2025 14:29:37 +0700 Subject: [PATCH 02/40] sshttp "improvement" --- modular_bandastation/tts/code/SSHttp.dm | 73 ++++++++++++++++--------- 1 file changed, 47 insertions(+), 26 deletions(-) diff --git a/modular_bandastation/tts/code/SSHttp.dm b/modular_bandastation/tts/code/SSHttp.dm index d9d96ff38c08a..e92ab0275d9cd 100644 --- a/modular_bandastation/tts/code/SSHttp.dm +++ b/modular_bandastation/tts/code/SSHttp.dm @@ -29,18 +29,13 @@ SUBSYSTEM_DEF(http) req.cb.InvokeAsync(res) // And log the result - if(logging_enabled) - var/list/log_data = list() - log_data += "BEGIN ASYNC RESPONSE (ID: [req.id])" - if(res.errored) - log_data += "\t ----- RESPONSE ERRROR -----" - log_data += "\t [res.error]" - else - log_data += "\tResponse status code: [res.status_code]" - log_data += "\tResponse body: [res.body]" - log_data += "\tResponse headers: [json_encode(res.headers)]" - log_data += "END ASYNC RESPONSE (ID: [req.id])" - logger.Log(LOG_CATEGORY_DEBUG, log_data.Join("\n")) + log_response(res) + +/datum/controller/subsystem/http/vv_edit_var(var_name, var_value) + if(var_name == "logging_enabled" && !check_rights(R_HOST)) + return FALSE + + . = ..() /** * Async request creator @@ -59,27 +54,27 @@ SUBSYSTEM_DEF(http) active_async_requests += req total_requests++ - if(logging_enabled) - // Create a log holder - var/list/log_data = list() - log_data += "BEGIN ASYNC REQUEST (ID: [req.id])" - log_data += "\t[uppertext(req.method)] [req.url]" - log_data += "\tRequest body: [req.body]" - log_data += "\tRequest headers: [req.headers]" - log_data += "END ASYNC REQUEST (ID: [req.id])" - - // Write the log data - - logger.Log(LOG_CATEGORY_DEBUG, log_data.Join("\n")) + log_request(req) /** * Blocking request creator * * Generates a blocking request, executes it, logs the info then cleanly returns the response - * Exists as a proof of concept, and should never be used + * Uses UNTIL, so is VERY dangerous to use. */ /datum/controller/subsystem/http/proc/make_blocking_request(method, url, body = "", list/headers) - CRASH("Attempted use of a blocking HTTP request") + var/datum/http_request/req = new() + req.prepare(method, url, body, headers) + req.begin_async() + active_async_requests += req + total_requests++ + log_request(req) + + UNTIL(req.is_complete()) + active_async_requests -= req + var/datum/http_response/res = req.into_response() + log_response(res) + return res /datum/http_request /// Callback for executing after async requests. Will be called with an argument of [/datum/http_response] as first argument @@ -88,3 +83,29 @@ SUBSYSTEM_DEF(http) /world/Del() rustgss220_close_async_http_client() . = ..() + +/datum/controller/subsystem/http/proc/log_request(datum/http_request/req, type = "ASYNC") + if(!logging_enabled) + return + + var/list/log_data = list() + log_data += "REQUEST (ID: [req.id]) ([type])" + log_data += "\t[uppertext(req.method)] [req.url]" + log_data += "\tRequest body: [req.body]" + log_data += "\tRequest headers: [req.headers]" + logger.Log(LOG_CATEGORY_DEBUG, log_data.Join("\n")) + +/datum/controller/subsystem/http/proc/log_response(datum/http_response/res) + if(!logging_enabled) + return + + var/list/log_data = list() + log_data += "RESPONSE (ID: [req.id])" + if(res.errored) + log_data += "\t ----- RESPONSE ERRROR -----" + log_data += "\t [res.error]" + else + log_data += "\tResponse status code: [res.status_code]" + log_data += "\tResponse body: [res.body]" + log_data += "\tResponse headers: [json_encode(res.headers)]" + logger.log(LOG_CATEGORY_DEBUG, log_data.Join("\n")) From c537115b4f43f5454fe826f856715443c36e52a4 Mon Sep 17 00:00:00 2001 From: Furior Date: Wed, 1 Jan 2025 14:42:15 +0700 Subject: [PATCH 03/40] wip wl --- code/modules/admin/whitelist.dm | 4 + modular_bandastation/discord/_discord.dm | 4 +- modular_bandastation/discord/code/discord.dm | 40 --------- .../metaserver/_metaserver.dme | 2 + .../metaserver/code/discord_link.dm | 34 ++++++++ .../metaserver/code/interview.dm | 55 +++++++++++++ .../metaserver/code/ss_central.dm | 82 +++++++++++++------ 7 files changed, 152 insertions(+), 69 deletions(-) create mode 100644 modular_bandastation/metaserver/code/discord_link.dm create mode 100644 modular_bandastation/metaserver/code/interview.dm diff --git a/code/modules/admin/whitelist.dm b/code/modules/admin/whitelist.dm index 759c381bb2e85..e49c97877d68b 100644 --- a/code/modules/admin/whitelist.dm +++ b/code/modules/admin/whitelist.dm @@ -19,4 +19,8 @@ GLOBAL_LIST(whitelist) return FALSE . = (ckey in GLOB.whitelist) + // SS220 ADDITION - SS Central + if (!. && GLOB.ss_central.active) + . = GLOB.ss_central.is_player_whitelisted(ckey) + #undef WHITELISTFILE diff --git a/modular_bandastation/discord/_discord.dm b/modular_bandastation/discord/_discord.dm index c63e63dd94ec0..481f2a74674b3 100644 --- a/modular_bandastation/discord/_discord.dm +++ b/modular_bandastation/discord/_discord.dm @@ -1,4 +1,4 @@ /datum/modpack/links_change - name = "Привязка Дискорда." - desc = "Добавление привязки Дискорда." + name = "Дискорд." + desc = "Ссылка на дискорд." author = "KOJIT2009" diff --git a/modular_bandastation/discord/code/discord.dm b/modular_bandastation/discord/code/discord.dm index 66b636eeefdf4..8507d4ba6cbd7 100644 --- a/modular_bandastation/discord/code/discord.dm +++ b/modular_bandastation/discord/code/discord.dm @@ -1,46 +1,6 @@ /datum/config_entry/string/discordurl default = "https://discord.gg/SS220" -/client/New() - . = ..() - prefs.discord_id = SSdiscord.lookup_id(ckey) - -/datum/preferences - var/discord_id - -// IF you have linked your account, this will trigger a verify of the user -/client/verify_in_discord() - // Safety checks - if(!CONFIG_GET(flag/sql_enabled)) - to_chat(src, span_warning("This feature requires the SQL backend to be running.")) - return - - // Why this would ever be unset, who knows - var/prefix = CONFIG_GET(string/discordbotcommandprefix) - if(!prefix) - to_chat(src, span_warning("Нет префикса для discord verification")) - - if(!SSdiscord || !SSdiscord.reverify_cache) - to_chat(src, span_warning("Wait for the Discord subsystem to finish initialising")) - return - var/message = "" - // Simple sanity check to prevent a user doing this too often - var/cached_one_time_token = SSdiscord.reverify_cache[usr.ckey] - if(cached_one_time_token && cached_one_time_token != "") - message = "Вы уже сгенерировали токен
[cached_one_time_token]
В канале дом-бота используйте команду
[prefix]привязать" - - - else - // Will generate one if an expired one doesn't exist already, otherwise will grab existing token - var/one_time_token = SSdiscord.get_or_generate_one_time_token_for_ckey(ckey) - SSdiscord.reverify_cache[usr.ckey] = one_time_token - message = "В канале дом-бота используйте команду
[prefix]привязать и введите туда свой токен
[one_time_token]" - - //Now give them a browse window so they can't miss whatever we told them - var/datum/browser/window = new/datum/browser(usr, "discordverification", "Discord verification") - window.set_content("[message]") - window.open() - //Please use mob or src (not usr) in these procs. This way they can be called in the same fashion as procs. /client/verb/discord() set name = "discord" diff --git a/modular_bandastation/metaserver/_metaserver.dme b/modular_bandastation/metaserver/_metaserver.dme index e10d677c0149e..6624ccab3847d 100644 --- a/modular_bandastation/metaserver/_metaserver.dme +++ b/modular_bandastation/metaserver/_metaserver.dme @@ -1,3 +1,5 @@ #include "_metaserver.dm" +#include "code/discord_link.dm" +#include "code/interview.dm" #include "code/ss_central.dm" diff --git a/modular_bandastation/metaserver/code/discord_link.dm b/modular_bandastation/metaserver/code/discord_link.dm new file mode 100644 index 0000000000000..f7922241f46b3 --- /dev/null +++ b/modular_bandastation/metaserver/code/discord_link.dm @@ -0,0 +1,34 @@ +/datum/preferences + var/discord_id + +/client/New() + . = ..() + GLOB.ss_central.get_player_discord_async(src) + +/client/verify_in_discord() + if(!GLOB.ss_central.active) + to_chat(src, span_warning("Привязка Discord сейчас недоступна.")) + + if(GLOB.ss_central.discord_links[src.ckey]) + to_chat(src, span_warning("Вы уже привязали свою учетную запись Discord.")) + + to_chat(src, span_notice("Пытаемся получить токен для входа в Discord...")) + GLOB.ss_central.verify_in_discord(src) + +/datum/ss_central/proc/verify_in_discord(client/player) + var/endpoint = "[CONFIG_GET(string/ss_central_url)]/player/token/[player.ckey]" + var/list/headers = list( + "Authorization" = "Bearer [CONFIG_GET(string/ss_central_token)]" + ) + SShttp.create_async_request(RUSTG_HTTP_METHOD_POST, endpoint, "", headers, CALLBACK(GLOB.ss_central, PROC_REF(verify_in_discord_callback), player)) + +/datum/ss_central/proc/verify_in_discord_callback(client/player, datum/http_response/response) + if(response.errored || response.status_code != 201) + stack_trace("Failed to get discord verification token: HTTP status code " + response.status_code) + return + + var/list/data = json_decode(response.body) + var/login_endpoint = "[CONFIG_GET(string/ss_central_url)]/player/login?token=[data]" + + to_chat(player, span_big("Авторизуйтесь в открывшемся окне. Если окно не открывается, можете открыть сами ссылку [login_endpoint] в браузере.")) + player << link(login_endpoint) diff --git a/modular_bandastation/metaserver/code/interview.dm b/modular_bandastation/metaserver/code/interview.dm new file mode 100644 index 0000000000000..d0cc3a9bf2224 --- /dev/null +++ b/modular_bandastation/metaserver/code/interview.dm @@ -0,0 +1,55 @@ +/// Doesnt need the panic bunker to work +/mob/dead/new_player/proc/check_whitelist_or_make_interviewee() + if(!CONFIG_GET(flag/panic_bunker_interview)) + return + if(client.interviewee) + return + if(!GLOB.ss_central.active) + return + if(GLOB.ss_central.is_player_whitelisted(ckey)) + return + client.interviewee = TRUE + +/datum/config_entry/string/interview_webhook_url + +/datum/interview/approve(client/approved_by) + add_owner_to_whitelist(approved_by) + send_interview_webhook(src, "[approved_by.ckey] approved:") + . = ..() + +/datum/interview_manager/enqueue(datum/interview/to_queue) + . = ..() + send_interview_webhook(to_queue, "New interview enqueued:") + +/datum/interview/deny(client/denied_by) + . = ..() + send_interview_webhook(src, "[denied_by.ckey] denied:") + +/datum/interview/proc/serialize_embed() + . = list( + "fields" = list(), + "author" = list( + "name" = owner_ckey + ) + ) + for(var/question_id in 1 to length(questions)) + var/list/question_data = list( + "name" = "[questions[question_id]]", + "value" = "[isnull(responses[question_id]) ? "N/A" : responses[question_id]]" + ) + .["fields"] += list(question_data) + return . + +/proc/send_interview_webhook(datum/interview/interview, additional_msg) + var/webhook = CONFIG_GET(string/interview_webhook_url) + if(!webhook || !interview) + return + var/list/webhook_info = list() + webhook_info["content"] = additional_msg + webhook_info["embeds"] = list(interview.serialize_embed()) + var/list/headers = list() + headers["Content-Type"] = "application/json" + SShttp.create_async_request(RUSTG_HTTP_METHOD_POST, webhook, json_encode(webhook_info), headers) + +/datum/interview/proc/add_owner_to_whitelist(client/added_by) + GLOB.ss_central.add_to_whitelist(owner_ckey, added_by.ckey, "Interview", 0) diff --git a/modular_bandastation/metaserver/code/ss_central.dm b/modular_bandastation/metaserver/code/ss_central.dm index 73b61a972e2e5..5ac3490eda24f 100644 --- a/modular_bandastation/metaserver/code/ss_central.dm +++ b/modular_bandastation/metaserver/code/ss_central.dm @@ -12,8 +12,11 @@ GLOBAL_DATUM_INIT(ss_central, /datum/ss_central, new) default = "default" /datum/ss_central + var/active = FALSE var/list/discord_links = list() +/datum/ss_central/proc/New() + active = CONFIG_GET(string/ss_central_url) && CONFIG_GET(string/ss_central_token) /datum/ss_central/proc/load_whitelist() var/endpoint = "[CONFIG_GET(string/ss_central_url)]/whitelist/simple/active_whitelists/ckey?wl_type=[CONFIG_GET(string/whitelist_type)]" @@ -21,20 +24,20 @@ GLOBAL_DATUM_INIT(ss_central, /datum/ss_central, new) SShttp.create_async_request(RUSTG_HTTP_METHOD_GET, endpoint, "", list(), CALLBACK(src, PROC_REF(load_whitelist_callback))) /datum/ss_central/proc/load_whitelist_callback(datum/http_response/response) - if(response.status_code != 200) + if(response.errored || response.status_code != 200) stack_trace("Failed to load whitelist: HTTP status code " + response.status_code) return var/list/ckeys = json_decode(response.body) GLOB.whitelist = ckeys -/datum/ss_central/proc/get_player_discord(ckey) - var/endpoint = "[CONFIG_GET(string/ss_central_url)]/player/ckey/[ckey]" +/datum/ss_central/proc/get_player_discord_async(client/player) + var/endpoint = "[CONFIG_GET(string/ss_central_url)]/player/ckey/[player.ckey]" - SShttp.create_async_request(RUSTG_HTTP_METHOD_GET, endpoint, "", list(), CALLBACK(src, PROC_REF(get_player_discord_callback))) + SShttp.create_async_request(RUSTG_HTTP_METHOD_GET, endpoint, "", list(), CALLBACK(src, PROC_REF(get_player_discord_callback), player)) -/datum/ss_central/proc/get_player_discord_callback(datum/http_response/response) - if(response.status_code != 200) +/datum/ss_central/proc/get_player_discord_callback(client/player, datum/http_response/response) + if(response.errored || response.status_code != 200) stack_trace("Failed to get player discord: HTTP status code " + response.status_code) return @@ -43,30 +46,55 @@ GLOBAL_DATUM_INIT(ss_central, /datum/ss_central, new) var/ckey = data["ckey"] discord_links[ckey] = discord_id -/client/verify_in_discord() - // TODO: check if already linked + player.prefs.discord_id = discord_id - var/endpoint = "[CONFIG_GET(string/ss_central_url)]/player/token/[ckey]" - var/list/headers = list( - "Authorization" = "Bearer [CONFIG_GET(string/ss_central_token)]" - ) - to_chat(src, span_notice("Пытаемся получить токен для входа в Discord...")) - SShttp.create_async_request(RUSTG_HTTP_METHOD_POST, endpoint, "", headers, CALLBACK(GLOB.ss_central, TYPE_PROC_REF(/datum/ss_central, verify_in_discord_callback), src)) +/datum/ss_central/proc/is_player_discord_linked(client/player) + if(!player) + return FALSE -/datum/ss_central/proc/verify_in_discord_callback(client/user, datum/http_response/response) - if(response.status_code != 201) - stack_trace("Failed to get discord verification token: HTTP status code " + response.status_code) - return + if(player.prefs.discord_id) + return TRUE - var/list/data = json_decode(response.body) - var/login_endpoint = "[CONFIG_GET(string/ss_central_url)]/player/login?token=[data]" + // If player somehow losed its id. Not sure if needed + if(GLOB.ss_central.discord_links[player.ckey]) + player.prefs.discord_id = GLOB.ss_central.discord_links[player.ckey] + return TRUE + + // Update the info just in case + GLOB.ss_central.get_player_discord_async(src) + + return FALSE + +/// WARNING: only semi async - UNTIL based +/datum/ss_central/proc/is_player_whitelisted(ckey) + . = (ckey in GLOB.whitelist) + + var/endpoint = "[CONFIG_GET(string/ss_central_url)]/whitelist/simple/is_whitelisted/ckey/[ckey]?wl_type=[CONFIG_GET(string/whitelist_type)]" + var/datum/http_response/response = SShttp.make_blocking_request(RUSTG_HTTP_METHOD_GET, endpoint, "", list()) + if(response.errored || response.status_code != 200) + return FALSE + + return json_decode(response.body) - to_chat(user, span_big("Авторизуйтесь в открывшемся окне. Если окно не открывается, можете открыть сами ссылку `[login_endpoint]`")) - user << link(login_endpoint) +/datum/ss_central/proc/add_to_whitelist(ckey, added_by, reason = "", duration_days = 0) + var/endpoint = "[CONFIG_GET(string/ss_central_url)]/whitelist/ckey/[ckey]" -/datum/controller/subsystem/discord/find_discord_link_by_ckey(ckey, timebound, only_valid) - return GLOB.ss_central.discord_links[ckey] + var/list/headers = list() + headers["Authorization"] = "Bearer [CONFIG_GET(string/ss_central_token)]" + var/list/body = list() + body["ckey"] = ckey + body["added_by"] = added_by + body["reason"] = reason + body["duration_days"] = duration_days + + SShttp.create_async_request(RUSTG_HTTP_METHOD_POST, endpoint, json_encode(body), headers, CALLBACK(src, PROC_REF(add_to_whitelist_callback))) + +/datum/ss_central/proc/add_to_whitelist_callback(datum/http_response/response) + if(response.errored || response.status_code != 200) + stack_trace("Failed to add to whitelist: HTTP status code " + response.status_code) + return + + var/list/data = json_decode(response.body) + var/ckey = data["ckey"] -/mob/dead/new_player/proc/check_whitelist_or_make_interviewee() - return - // TODO: Implement all the old functionality + GLOB.whitelist |= ckey From c9191b7c48e7e4ec861d303ac3c72b8edc1e7d46 Mon Sep 17 00:00:00 2001 From: Furior Date: Wed, 1 Jan 2025 14:44:58 +0700 Subject: [PATCH 04/40] typos --- modular_bandastation/tts/code/SSHttp.dm | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/modular_bandastation/tts/code/SSHttp.dm b/modular_bandastation/tts/code/SSHttp.dm index e92ab0275d9cd..0a8f5d64d23e2 100644 --- a/modular_bandastation/tts/code/SSHttp.dm +++ b/modular_bandastation/tts/code/SSHttp.dm @@ -32,7 +32,7 @@ SUBSYSTEM_DEF(http) log_response(res) /datum/controller/subsystem/http/vv_edit_var(var_name, var_value) - if(var_name == "logging_enabled" && !check_rights(R_HOST)) + if(var_name == "logging_enabled" && !check_rights(R_EVERYTHING)) return FALSE . = ..() @@ -100,7 +100,7 @@ SUBSYSTEM_DEF(http) return var/list/log_data = list() - log_data += "RESPONSE (ID: [req.id])" + log_data += "RESPONSE (ID: [res.id])" if(res.errored) log_data += "\t ----- RESPONSE ERRROR -----" log_data += "\t [res.error]" From 73b26b35d18860c9178f248e55755b3aad6a0306 Mon Sep 17 00:00:00 2001 From: Furior Date: Wed, 1 Jan 2025 15:04:50 +0700 Subject: [PATCH 05/40] giving wl from interview --- code/modules/admin/whitelist.dm | 4 +- .../metaserver/code/discord_link.dm | 14 +++---- .../metaserver/code/interview.dm | 6 +-- .../metaserver/code/ss_central.dm | 39 +++++++++---------- 4 files changed, 31 insertions(+), 32 deletions(-) diff --git a/code/modules/admin/whitelist.dm b/code/modules/admin/whitelist.dm index e49c97877d68b..fd6402ad98dcf 100644 --- a/code/modules/admin/whitelist.dm +++ b/code/modules/admin/whitelist.dm @@ -20,7 +20,7 @@ GLOBAL_LIST(whitelist) . = (ckey in GLOB.whitelist) // SS220 ADDITION - SS Central - if (!. && GLOB.ss_central.active) - . = GLOB.ss_central.is_player_whitelisted(ckey) + if (!. && SScentral.initialized) + . = SScentral.is_player_whitelisted(ckey) #undef WHITELISTFILE diff --git a/modular_bandastation/metaserver/code/discord_link.dm b/modular_bandastation/metaserver/code/discord_link.dm index f7922241f46b3..5e0b0a7be5392 100644 --- a/modular_bandastation/metaserver/code/discord_link.dm +++ b/modular_bandastation/metaserver/code/discord_link.dm @@ -3,26 +3,26 @@ /client/New() . = ..() - GLOB.ss_central.get_player_discord_async(src) + SScentral.get_player_discord_async(src) /client/verify_in_discord() - if(!GLOB.ss_central.active) + if(!SScentral.initialized) to_chat(src, span_warning("Привязка Discord сейчас недоступна.")) - if(GLOB.ss_central.discord_links[src.ckey]) + if(SScentral.discord_links[src.ckey]) to_chat(src, span_warning("Вы уже привязали свою учетную запись Discord.")) to_chat(src, span_notice("Пытаемся получить токен для входа в Discord...")) - GLOB.ss_central.verify_in_discord(src) + SScentral.verify_in_discord(src) -/datum/ss_central/proc/verify_in_discord(client/player) +/datum/controller/subsystem/central/proc/verify_in_discord(client/player) var/endpoint = "[CONFIG_GET(string/ss_central_url)]/player/token/[player.ckey]" var/list/headers = list( "Authorization" = "Bearer [CONFIG_GET(string/ss_central_token)]" ) - SShttp.create_async_request(RUSTG_HTTP_METHOD_POST, endpoint, "", headers, CALLBACK(GLOB.ss_central, PROC_REF(verify_in_discord_callback), player)) + SShttp.create_async_request(RUSTG_HTTP_METHOD_POST, endpoint, "", headers, CALLBACK(SScentral, PROC_REF(verify_in_discord_callback), player)) -/datum/ss_central/proc/verify_in_discord_callback(client/player, datum/http_response/response) +/datum/controller/subsystem/central/proc/verify_in_discord_callback(client/player, datum/http_response/response) if(response.errored || response.status_code != 201) stack_trace("Failed to get discord verification token: HTTP status code " + response.status_code) return diff --git a/modular_bandastation/metaserver/code/interview.dm b/modular_bandastation/metaserver/code/interview.dm index d0cc3a9bf2224..ece3dfecf2332 100644 --- a/modular_bandastation/metaserver/code/interview.dm +++ b/modular_bandastation/metaserver/code/interview.dm @@ -4,9 +4,9 @@ return if(client.interviewee) return - if(!GLOB.ss_central.active) + if(!SScentral.initialized) return - if(GLOB.ss_central.is_player_whitelisted(ckey)) + if(SScentral.is_player_whitelisted(ckey)) return client.interviewee = TRUE @@ -52,4 +52,4 @@ SShttp.create_async_request(RUSTG_HTTP_METHOD_POST, webhook, json_encode(webhook_info), headers) /datum/interview/proc/add_owner_to_whitelist(client/added_by) - GLOB.ss_central.add_to_whitelist(owner_ckey, added_by.ckey, "Interview", 0) + SScentral.add_to_whitelist(owner_ckey, added_by.ckey, 365) diff --git a/modular_bandastation/metaserver/code/ss_central.dm b/modular_bandastation/metaserver/code/ss_central.dm index 5ac3490eda24f..d9586e44d450e 100644 --- a/modular_bandastation/metaserver/code/ss_central.dm +++ b/modular_bandastation/metaserver/code/ss_central.dm @@ -1,5 +1,3 @@ -GLOBAL_DATUM_INIT(ss_central, /datum/ss_central, new) - /datum/config_entry/string/ss_central_url default = "" protection = CONFIG_ENTRY_LOCKED @@ -11,19 +9,20 @@ GLOBAL_DATUM_INIT(ss_central, /datum/ss_central, new) /datum/config_entry/string/whitelist_type default = "default" -/datum/ss_central - var/active = FALSE +SUBSYSTEM_DEF(central) var/list/discord_links = list() -/datum/ss_central/proc/New() - active = CONFIG_GET(string/ss_central_url) && CONFIG_GET(string/ss_central_token) +/datum/controller/subsystem/central/Initialize() + if(!(CONFIG_GET(string/ss_central_url) && CONFIG_GET(string/ss_central_token))) + return SS_INIT_FAILURE + load_whitelist() -/datum/ss_central/proc/load_whitelist() +/datum/controller/subsystem/central/proc/load_whitelist() var/endpoint = "[CONFIG_GET(string/ss_central_url)]/whitelist/simple/active_whitelists/ckey?wl_type=[CONFIG_GET(string/whitelist_type)]" SShttp.create_async_request(RUSTG_HTTP_METHOD_GET, endpoint, "", list(), CALLBACK(src, PROC_REF(load_whitelist_callback))) -/datum/ss_central/proc/load_whitelist_callback(datum/http_response/response) +/datum/controller/subsystem/central/proc/load_whitelist_callback(datum/http_response/response) if(response.errored || response.status_code != 200) stack_trace("Failed to load whitelist: HTTP status code " + response.status_code) return @@ -31,12 +30,12 @@ GLOBAL_DATUM_INIT(ss_central, /datum/ss_central, new) var/list/ckeys = json_decode(response.body) GLOB.whitelist = ckeys -/datum/ss_central/proc/get_player_discord_async(client/player) +/datum/controller/subsystem/central/proc/get_player_discord_async(client/player) var/endpoint = "[CONFIG_GET(string/ss_central_url)]/player/ckey/[player.ckey]" SShttp.create_async_request(RUSTG_HTTP_METHOD_GET, endpoint, "", list(), CALLBACK(src, PROC_REF(get_player_discord_callback), player)) -/datum/ss_central/proc/get_player_discord_callback(client/player, datum/http_response/response) +/datum/controller/subsystem/central/proc/get_player_discord_callback(client/player, datum/http_response/response) if(response.errored || response.status_code != 200) stack_trace("Failed to get player discord: HTTP status code " + response.status_code) return @@ -48,7 +47,7 @@ GLOBAL_DATUM_INIT(ss_central, /datum/ss_central, new) player.prefs.discord_id = discord_id -/datum/ss_central/proc/is_player_discord_linked(client/player) +/datum/controller/subsystem/central/proc/is_player_discord_linked(client/player) if(!player) return FALSE @@ -56,17 +55,17 @@ GLOBAL_DATUM_INIT(ss_central, /datum/ss_central, new) return TRUE // If player somehow losed its id. Not sure if needed - if(GLOB.ss_central.discord_links[player.ckey]) - player.prefs.discord_id = GLOB.ss_central.discord_links[player.ckey] + if(SScentral.discord_links[player.ckey]) + player.prefs.discord_id = SScentral.discord_links[player.ckey] return TRUE // Update the info just in case - GLOB.ss_central.get_player_discord_async(src) + SScentral.get_player_discord_async(src) return FALSE /// WARNING: only semi async - UNTIL based -/datum/ss_central/proc/is_player_whitelisted(ckey) +/datum/controller/subsystem/central/proc/is_player_whitelisted(ckey) . = (ckey in GLOB.whitelist) var/endpoint = "[CONFIG_GET(string/ss_central_url)]/whitelist/simple/is_whitelisted/ckey/[ckey]?wl_type=[CONFIG_GET(string/whitelist_type)]" @@ -76,20 +75,20 @@ GLOBAL_DATUM_INIT(ss_central, /datum/ss_central, new) return json_decode(response.body) -/datum/ss_central/proc/add_to_whitelist(ckey, added_by, reason = "", duration_days = 0) +/datum/controller/subsystem/central/proc/add_to_whitelist(ckey, added_by, duration_days = 0) var/endpoint = "[CONFIG_GET(string/ss_central_url)]/whitelist/ckey/[ckey]" var/list/headers = list() headers["Authorization"] = "Bearer [CONFIG_GET(string/ss_central_token)]" var/list/body = list() - body["ckey"] = ckey - body["added_by"] = added_by - body["reason"] = reason + body["player_ckey"] = ckey + body["admin_ckey"] = added_by + body["wl_type"] = CONFIG_GET(string/whitelist_type) body["duration_days"] = duration_days SShttp.create_async_request(RUSTG_HTTP_METHOD_POST, endpoint, json_encode(body), headers, CALLBACK(src, PROC_REF(add_to_whitelist_callback))) -/datum/ss_central/proc/add_to_whitelist_callback(datum/http_response/response) +/datum/controller/subsystem/central/proc/add_to_whitelist_callback(datum/http_response/response) if(response.errored || response.status_code != 200) stack_trace("Failed to add to whitelist: HTTP status code " + response.status_code) return From 9bd06bd6f1728781783457610ad262cc8f76f23d Mon Sep 17 00:00:00 2001 From: Furior Date: Wed, 1 Jan 2025 15:07:23 +0700 Subject: [PATCH 06/40] nuke the old system --- .../metaserver/code/old_wl.dm | 135 ------------------ 1 file changed, 135 deletions(-) delete mode 100644 modular_bandastation/metaserver/code/old_wl.dm diff --git a/modular_bandastation/metaserver/code/old_wl.dm b/modular_bandastation/metaserver/code/old_wl.dm deleted file mode 100644 index 533117df43aff..0000000000000 --- a/modular_bandastation/metaserver/code/old_wl.dm +++ /dev/null @@ -1,135 +0,0 @@ -#define TEST_TG_WL_PORT 9876 -#define CKEY_HAS_VALID_WHITELIST_QUERY {" - SELECT ckey FROM ckey_whitelist WHERE ckey=:ckey AND - is_valid=1 AND port=:port AND date_start<=NOW() AND - (date_end IS NULL OR NOW() Date: Wed, 1 Jan 2025 15:13:21 +0700 Subject: [PATCH 07/40] Update modular_bandastation/tts/code/SSHttp.dm Co-authored-by: sourcery-ai[bot] <58596630+sourcery-ai[bot]@users.noreply.github.com> --- modular_bandastation/tts/code/SSHttp.dm | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modular_bandastation/tts/code/SSHttp.dm b/modular_bandastation/tts/code/SSHttp.dm index 0a8f5d64d23e2..e5660a6c611d7 100644 --- a/modular_bandastation/tts/code/SSHttp.dm +++ b/modular_bandastation/tts/code/SSHttp.dm @@ -102,7 +102,7 @@ SUBSYSTEM_DEF(http) var/list/log_data = list() log_data += "RESPONSE (ID: [res.id])" if(res.errored) - log_data += "\t ----- RESPONSE ERRROR -----" + log_data += "\t ----- RESPONSE ERROR -----" log_data += "\t [res.error]" else log_data += "\tResponse status code: [res.status_code]" From 91ef632c5eadfd723590e4a740b02b6551d812f4 Mon Sep 17 00:00:00 2001 From: Furior Date: Wed, 1 Jan 2025 16:11:30 +0700 Subject: [PATCH 08/40] fixes --- modular_bandastation/metaserver/code/admin.dm | 16 +++++++++ .../metaserver/code/interview.dm | 7 ++-- .../metaserver/code/ss_central.dm | 33 ++++++++++++++++--- modular_bandastation/tts/code/SSHttp.dm | 8 ++--- 4 files changed, 51 insertions(+), 13 deletions(-) create mode 100644 modular_bandastation/metaserver/code/admin.dm diff --git a/modular_bandastation/metaserver/code/admin.dm b/modular_bandastation/metaserver/code/admin.dm new file mode 100644 index 0000000000000..38eb569dbd249 --- /dev/null +++ b/modular_bandastation/metaserver/code/admin.dm @@ -0,0 +1,16 @@ +ADMIN_VERB(wl_ban, R_BAN, "WL Ban", "Ban a player from the whitelist.", ADMIN_CATEGORY_MAIN) + var/banned_ckey = input(user, "Please specify the cckey of the player you want to ban from the whitelist.", "WL Ban", "") as string|null + banned_ckey = ckey(ckey) + if(!input) + return + var/duration_days = input(user, "Please specify the duration of the ban in days.", "Duration", "") as num|null + if(!duration_days or duration_days < 0) + return + + var/reason = input(user, "Please specify the reason for the ban.", "Reason", "") as text|null + + SScentral.whitelist_ban_player(banned_ckey, admin_ckey, duration_days, reason) + + log_admin("[key_name(user)] banned [banned_ckey] from whitelist for [duration_days] days for reason: [reason]") + message_admins("[key_name_admin(user)] banned [banned_ckey] from whitelist for [duration_days] days for reason: [reason]") + SSblackbox.record_feedback("nested tally", "admin_toggle", 1, list("WL Ban", "Ckey: [banned_ckey], Duration: [duration_days], Reason: [reason]")) diff --git a/modular_bandastation/metaserver/code/interview.dm b/modular_bandastation/metaserver/code/interview.dm index ece3dfecf2332..89e8e9fa70ed5 100644 --- a/modular_bandastation/metaserver/code/interview.dm +++ b/modular_bandastation/metaserver/code/interview.dm @@ -2,20 +2,17 @@ /mob/dead/new_player/proc/check_whitelist_or_make_interviewee() if(!CONFIG_GET(flag/panic_bunker_interview)) return - if(client.interviewee) - return - if(!SScentral.initialized) - return if(SScentral.is_player_whitelisted(ckey)) + client.interviewee = FALSE return client.interviewee = TRUE /datum/config_entry/string/interview_webhook_url /datum/interview/approve(client/approved_by) + . = ..() add_owner_to_whitelist(approved_by) send_interview_webhook(src, "[approved_by.ckey] approved:") - . = ..() /datum/interview_manager/enqueue(datum/interview/to_queue) . = ..() diff --git a/modular_bandastation/metaserver/code/ss_central.dm b/modular_bandastation/metaserver/code/ss_central.dm index d9586e44d450e..9063da9ba9f8b 100644 --- a/modular_bandastation/metaserver/code/ss_central.dm +++ b/modular_bandastation/metaserver/code/ss_central.dm @@ -11,6 +11,7 @@ SUBSYSTEM_DEF(central) var/list/discord_links = list() + flags = SS_NO_FIRE /datum/controller/subsystem/central/Initialize() if(!(CONFIG_GET(string/ss_central_url) && CONFIG_GET(string/ss_central_token))) @@ -24,7 +25,7 @@ SUBSYSTEM_DEF(central) /datum/controller/subsystem/central/proc/load_whitelist_callback(datum/http_response/response) if(response.errored || response.status_code != 200) - stack_trace("Failed to load whitelist: HTTP status code " + response.status_code) + stack_trace("Failed to load whitelist: HTTP status code [response.status_code]") return var/list/ckeys = json_decode(response.body) @@ -37,7 +38,7 @@ SUBSYSTEM_DEF(central) /datum/controller/subsystem/central/proc/get_player_discord_callback(client/player, datum/http_response/response) if(response.errored || response.status_code != 200) - stack_trace("Failed to get player discord: HTTP status code " + response.status_code) + stack_trace("Failed to get player discord: HTTP status code [response.status_code]") return var/list/data = json_decode(response.body) @@ -76,7 +77,7 @@ SUBSYSTEM_DEF(central) return json_decode(response.body) /datum/controller/subsystem/central/proc/add_to_whitelist(ckey, added_by, duration_days = 0) - var/endpoint = "[CONFIG_GET(string/ss_central_url)]/whitelist/ckey/[ckey]" + var/endpoint = "[CONFIG_GET(string/ss_central_url)]/whitelist/ckey" var/list/headers = list() headers["Authorization"] = "Bearer [CONFIG_GET(string/ss_central_token)]" @@ -90,10 +91,34 @@ SUBSYSTEM_DEF(central) /datum/controller/subsystem/central/proc/add_to_whitelist_callback(datum/http_response/response) if(response.errored || response.status_code != 200) - stack_trace("Failed to add to whitelist: HTTP status code " + response.status_code) + stack_trace("Failed to add to whitelist: HTTP status code [response.status_code]") return var/list/data = json_decode(response.body) var/ckey = data["ckey"] GLOB.whitelist |= ckey + +/datum/controller/subsystem/central/proc/whitelist_ban_player(player_ckey, admin_ckey, duration_days, reason) + var/endpoint = "[CONFIG_GET(string/ss_central_url)]/whitelist/ban/ckey" + + var/list/headers = list() + headers["Authorization"] = "Bearer [CONFIG_GET(string/ss_central_token)]" + var/list/body = list() + body["player_ckey"] = player_ckey + body["admin_ckey"] = admin_ckey + body["wl_type"] = CONFIG_GET(string/whitelist_type) + body["duration_days"] = duration_days + body["reason"] = reason + + SShttp.create_async_request(RUSTG_HTTP_METHOD_POST, endpoint, json_encode(body), headers, CALLBACK(src, PROC_REF(whitelist_ban_player_callback))) + +/datum/controller/subsystem/central/proc/whitelist_ban_player_callback(datum/http_response/response) + if(response.errored || response.status_code != 200) + stack_trace("Failed to ban player: HTTP status code [response.status_code]") + return + + var/list/data = json_decode(response.body) + var/ckey = data["ckey"] + + GLOB.whitelist -= ckey diff --git a/modular_bandastation/tts/code/SSHttp.dm b/modular_bandastation/tts/code/SSHttp.dm index 0a8f5d64d23e2..0fb0f1864e5a0 100644 --- a/modular_bandastation/tts/code/SSHttp.dm +++ b/modular_bandastation/tts/code/SSHttp.dm @@ -29,7 +29,7 @@ SUBSYSTEM_DEF(http) req.cb.InvokeAsync(res) // And log the result - log_response(res) + log_response(res, req.id) /datum/controller/subsystem/http/vv_edit_var(var_name, var_value) if(var_name == "logging_enabled" && !check_rights(R_EVERYTHING)) @@ -95,12 +95,12 @@ SUBSYSTEM_DEF(http) log_data += "\tRequest headers: [req.headers]" logger.Log(LOG_CATEGORY_DEBUG, log_data.Join("\n")) -/datum/controller/subsystem/http/proc/log_response(datum/http_response/res) +/datum/controller/subsystem/http/proc/log_response(datum/http_response/res, id) if(!logging_enabled) return var/list/log_data = list() - log_data += "RESPONSE (ID: [res.id])" + log_data += "RESPONSE (ID: [id])" if(res.errored) log_data += "\t ----- RESPONSE ERRROR -----" log_data += "\t [res.error]" @@ -108,4 +108,4 @@ SUBSYSTEM_DEF(http) log_data += "\tResponse status code: [res.status_code]" log_data += "\tResponse body: [res.body]" log_data += "\tResponse headers: [json_encode(res.headers)]" - logger.log(LOG_CATEGORY_DEBUG, log_data.Join("\n")) + logger.Log(LOG_CATEGORY_DEBUG, log_data.Join("\n")) From e211807ef5006dd1e30fd74b073a2d6cd710c732 Mon Sep 17 00:00:00 2001 From: Furior Date: Wed, 1 Jan 2025 16:17:14 +0700 Subject: [PATCH 09/40] comments in config --- config/bandastation/bandastation_config.txt | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/config/bandastation/bandastation_config.txt b/config/bandastation/bandastation_config.txt index 573d04b7dc352..cdf383af59f88 100644 --- a/config/bandastation/bandastation_config.txt +++ b/config/bandastation/bandastation_config.txt @@ -5,9 +5,9 @@ #TTS_API_URL_SILERO ## SS Central -SS_CENTRAL_URL http://127.0.0.1:8000 -SS_CENTRAL_TOKEN 12345678 -WHITELIST_TYPE default +#SS_CENTRAL_URL http://127.0.0.1:8000 +#SS_CENTRAL_TOKEN 12345678 +#WHITELIST_TYPE default ## Entry from the general config.txt #USEWHITELIST From 0c0548658bcc8e2b7b1f6c8f41ca3cfbb6d0d192 Mon Sep 17 00:00:00 2001 From: Furior Date: Wed, 1 Jan 2025 16:18:04 +0700 Subject: [PATCH 10/40] missed log --- modular_bandastation/tts/code/SSHttp.dm | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modular_bandastation/tts/code/SSHttp.dm b/modular_bandastation/tts/code/SSHttp.dm index f1d372a682d2b..bc7eceba9a118 100644 --- a/modular_bandastation/tts/code/SSHttp.dm +++ b/modular_bandastation/tts/code/SSHttp.dm @@ -73,7 +73,7 @@ SUBSYSTEM_DEF(http) UNTIL(req.is_complete()) active_async_requests -= req var/datum/http_response/res = req.into_response() - log_response(res) + log_response(res, id) return res /datum/http_request From d3c84a649aaabb943b170ffa817aca1f1bf5471c Mon Sep 17 00:00:00 2001 From: Furior Date: Wed, 1 Jan 2025 16:21:12 +0700 Subject: [PATCH 11/40] typo --- modular_bandastation/tts/code/SSHttp.dm | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modular_bandastation/tts/code/SSHttp.dm b/modular_bandastation/tts/code/SSHttp.dm index bc7eceba9a118..f42b5c800a7c2 100644 --- a/modular_bandastation/tts/code/SSHttp.dm +++ b/modular_bandastation/tts/code/SSHttp.dm @@ -73,7 +73,7 @@ SUBSYSTEM_DEF(http) UNTIL(req.is_complete()) active_async_requests -= req var/datum/http_response/res = req.into_response() - log_response(res, id) + log_response(res, req.id) return res /datum/http_request From a6c86b4c5461fcddb97c3667c1140fd5fa838a65 Mon Sep 17 00:00:00 2001 From: Furior Date: Wed, 1 Jan 2025 17:05:14 +0700 Subject: [PATCH 12/40] or --- modular_bandastation/metaserver/code/admin.dm | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modular_bandastation/metaserver/code/admin.dm b/modular_bandastation/metaserver/code/admin.dm index 38eb569dbd249..5e4babfc2e1a0 100644 --- a/modular_bandastation/metaserver/code/admin.dm +++ b/modular_bandastation/metaserver/code/admin.dm @@ -4,7 +4,7 @@ ADMIN_VERB(wl_ban, R_BAN, "WL Ban", "Ban a player from the whitelist.", ADMIN_CA if(!input) return var/duration_days = input(user, "Please specify the duration of the ban in days.", "Duration", "") as num|null - if(!duration_days or duration_days < 0) + if(!duration_days || duration_days < 0) return var/reason = input(user, "Please specify the reason for the ban.", "Reason", "") as text|null From 06a1f85bf578eb9a607a3875c2e2e3144e6312be Mon Sep 17 00:00:00 2001 From: "Mikhail G." Date: Wed, 1 Jan 2025 17:06:16 +0700 Subject: [PATCH 13/40] Update modular_bandastation/metaserver/code/admin.dm Co-authored-by: Gaxeer <44334376+Gaxeer@users.noreply.github.com> --- modular_bandastation/metaserver/code/admin.dm | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modular_bandastation/metaserver/code/admin.dm b/modular_bandastation/metaserver/code/admin.dm index 5e4babfc2e1a0..743885426ebce 100644 --- a/modular_bandastation/metaserver/code/admin.dm +++ b/modular_bandastation/metaserver/code/admin.dm @@ -1,5 +1,5 @@ ADMIN_VERB(wl_ban, R_BAN, "WL Ban", "Ban a player from the whitelist.", ADMIN_CATEGORY_MAIN) - var/banned_ckey = input(user, "Please specify the cckey of the player you want to ban from the whitelist.", "WL Ban", "") as string|null + var/banned_ckey = input(user, "Please specify the ckey of the player you want to ban from the whitelist.", "WL Ban", "") as string|null banned_ckey = ckey(ckey) if(!input) return From f98a847e68ddfd02f086773f450fe08d7207f157 Mon Sep 17 00:00:00 2001 From: Furior Date: Sat, 4 Jan 2025 01:26:58 +0700 Subject: [PATCH 14/40] various fixes --- .../metaserver/code/discord_link.dm | 12 ++++++-- .../metaserver/code/ss_central.dm | 28 +++++++++++++------ 2 files changed, 29 insertions(+), 11 deletions(-) diff --git a/modular_bandastation/metaserver/code/discord_link.dm b/modular_bandastation/metaserver/code/discord_link.dm index 5e0b0a7be5392..ccf8a9405a9a9 100644 --- a/modular_bandastation/metaserver/code/discord_link.dm +++ b/modular_bandastation/metaserver/code/discord_link.dm @@ -5,12 +5,18 @@ . = ..() SScentral.get_player_discord_async(src) +/mob/dead/new_player/register_for_interview() + . = ..() + add_verb(client, /client/verify_in_discord) + /client/verify_in_discord() if(!SScentral.initialized) to_chat(src, span_warning("Привязка Discord сейчас недоступна.")) + return if(SScentral.discord_links[src.ckey]) to_chat(src, span_warning("Вы уже привязали свою учетную запись Discord.")) + return to_chat(src, span_notice("Пытаемся получить токен для входа в Discord...")) SScentral.verify_in_discord(src) @@ -24,11 +30,13 @@ /datum/controller/subsystem/central/proc/verify_in_discord_callback(client/player, datum/http_response/response) if(response.errored || response.status_code != 201) - stack_trace("Failed to get discord verification token: HTTP status code " + response.status_code) + stack_trace("Failed to get discord verification token: HTTP status code [response.status_code] - [response.error]") return var/list/data = json_decode(response.body) var/login_endpoint = "[CONFIG_GET(string/ss_central_url)]/player/login?token=[data]" - to_chat(player, span_big("Авторизуйтесь в открывшемся окне. Если окно не открывается, можете открыть сами ссылку [login_endpoint] в браузере.")) + to_chat(player, boxed_message("Авторизуйтесь в открывшемся окне и ожидайте 30 секунд.
Если окно не открывается, можете открыть ссылку в браузере самостоятельно:
[login_endpoint].")) player << link(login_endpoint) + SScentral.get_player_discord_async(player) + addtimer(CALLBACK(SScentral, TYPE_PROC_REF(/datum/controller/subsystem/central, get_player_discord_async), player), 30 SECONDS) diff --git a/modular_bandastation/metaserver/code/ss_central.dm b/modular_bandastation/metaserver/code/ss_central.dm index 9063da9ba9f8b..3aad043febd09 100644 --- a/modular_bandastation/metaserver/code/ss_central.dm +++ b/modular_bandastation/metaserver/code/ss_central.dm @@ -25,7 +25,7 @@ SUBSYSTEM_DEF(central) /datum/controller/subsystem/central/proc/load_whitelist_callback(datum/http_response/response) if(response.errored || response.status_code != 200) - stack_trace("Failed to load whitelist: HTTP status code [response.status_code]") + stack_trace("Failed to load whitelist: HTTP status code [response.status_code] - [response.error]") return var/list/ckeys = json_decode(response.body) @@ -37,8 +37,8 @@ SUBSYSTEM_DEF(central) SShttp.create_async_request(RUSTG_HTTP_METHOD_GET, endpoint, "", list(), CALLBACK(src, PROC_REF(get_player_discord_callback), player)) /datum/controller/subsystem/central/proc/get_player_discord_callback(client/player, datum/http_response/response) - if(response.errored || response.status_code != 200) - stack_trace("Failed to get player discord: HTTP status code [response.status_code]") + if(response.errored || response.status_code != 200 && response.status_code != 404) + stack_trace("Failed to get player discord: HTTP status code [response.status_code] - [response.error]") return var/list/data = json_decode(response.body) @@ -61,7 +61,7 @@ SUBSYSTEM_DEF(central) return TRUE // Update the info just in case - SScentral.get_player_discord_async(src) + SScentral.get_player_discord_async(player) return FALSE @@ -71,7 +71,7 @@ SUBSYSTEM_DEF(central) var/endpoint = "[CONFIG_GET(string/ss_central_url)]/whitelist/simple/is_whitelisted/ckey/[ckey]?wl_type=[CONFIG_GET(string/whitelist_type)]" var/datum/http_response/response = SShttp.make_blocking_request(RUSTG_HTTP_METHOD_GET, endpoint, "", list()) - if(response.errored || response.status_code != 200) + if(response.errored || response.status_code != 200 && response.status_code != 404) return FALSE return json_decode(response.body) @@ -90,9 +90,19 @@ SUBSYSTEM_DEF(central) SShttp.create_async_request(RUSTG_HTTP_METHOD_POST, endpoint, json_encode(body), headers, CALLBACK(src, PROC_REF(add_to_whitelist_callback))) /datum/controller/subsystem/central/proc/add_to_whitelist_callback(datum/http_response/response) - if(response.errored || response.status_code != 200) - stack_trace("Failed to add to whitelist: HTTP status code [response.status_code]") - return + if(response.errored) + switch(response.status_code) + if(404) + message_admins("Failed to add to whitelist: Player not found") + return + + if(409) + message_admins("Failed to add to whitelist: Player is whitelist banned") + return + + else + stack_trace("Failed to add to whitelist: HTTP status code [response.status_code] - [response.error]") + return var/list/data = json_decode(response.body) var/ckey = data["ckey"] @@ -115,7 +125,7 @@ SUBSYSTEM_DEF(central) /datum/controller/subsystem/central/proc/whitelist_ban_player_callback(datum/http_response/response) if(response.errored || response.status_code != 200) - stack_trace("Failed to ban player: HTTP status code [response.status_code]") + stack_trace("Failed to ban player: HTTP status code [response.status_code] - [response.error]") return var/list/data = json_decode(response.body) From 15afadf66d686175ed71fe32a67449315003b071 Mon Sep 17 00:00:00 2001 From: Furior Date: Sat, 4 Jan 2025 15:57:05 +0700 Subject: [PATCH 15/40] atually include admin.dm --- modular_bandastation/metaserver/_metaserver.dme | 1 + 1 file changed, 1 insertion(+) diff --git a/modular_bandastation/metaserver/_metaserver.dme b/modular_bandastation/metaserver/_metaserver.dme index 6624ccab3847d..2417f1a9f5b9a 100644 --- a/modular_bandastation/metaserver/_metaserver.dme +++ b/modular_bandastation/metaserver/_metaserver.dme @@ -1,5 +1,6 @@ #include "_metaserver.dm" +#include "code/admin.dm" #include "code/discord_link.dm" #include "code/interview.dm" #include "code/ss_central.dm" From bc2bc96fa21414246ef8456870e7c8ed27855364 Mon Sep 17 00:00:00 2001 From: Furior Date: Sat, 4 Jan 2025 15:59:03 +0700 Subject: [PATCH 16/40] rename discord link verb --- modular_bandastation/metaserver/code/discord_link.dm | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/modular_bandastation/metaserver/code/discord_link.dm b/modular_bandastation/metaserver/code/discord_link.dm index ccf8a9405a9a9..91cd2ada26ab8 100644 --- a/modular_bandastation/metaserver/code/discord_link.dm +++ b/modular_bandastation/metaserver/code/discord_link.dm @@ -7,9 +7,13 @@ /mob/dead/new_player/register_for_interview() . = ..() - add_verb(client, /client/verify_in_discord) + add_verb(client, /client/verb/verify_in_discord_central) + +/client/verb/verify_in_discord_central() + set category = "OOC" + set name = "Привязать Discord" + set desc = "Привязка аккаунта Discord к BYOND" -/client/verify_in_discord() if(!SScentral.initialized) to_chat(src, span_warning("Привязка Discord сейчас недоступна.")) return From c4bb628803a2750946ed0047534db063ee8ea8eb Mon Sep 17 00:00:00 2001 From: Furior Date: Sat, 4 Jan 2025 16:02:45 +0700 Subject: [PATCH 17/40] admin.dm fixes --- modular_bandastation/metaserver/code/admin.dm | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/modular_bandastation/metaserver/code/admin.dm b/modular_bandastation/metaserver/code/admin.dm index 743885426ebce..153e90c7ee1d5 100644 --- a/modular_bandastation/metaserver/code/admin.dm +++ b/modular_bandastation/metaserver/code/admin.dm @@ -1,15 +1,15 @@ ADMIN_VERB(wl_ban, R_BAN, "WL Ban", "Ban a player from the whitelist.", ADMIN_CATEGORY_MAIN) - var/banned_ckey = input(user, "Please specify the ckey of the player you want to ban from the whitelist.", "WL Ban", "") as string|null - banned_ckey = ckey(ckey) - if(!input) + var/banned_ckey = input(user, "Please specify the ckey of the player you want to ban from the whitelist.", "WL Ban", "") as text|null + banned_ckey = ckey(banned_ckey) + if(!banned_ckey) return var/duration_days = input(user, "Please specify the duration of the ban in days.", "Duration", "") as num|null if(!duration_days || duration_days < 0) return - var/reason = input(user, "Please specify the reason for the ban.", "Reason", "") as text|null + var/reason = input(user, "Please specify the reason for the ban.", "Reason", "") as message|null - SScentral.whitelist_ban_player(banned_ckey, admin_ckey, duration_days, reason) + SScentral.whitelist_ban_player(banned_ckey, user.ckey, duration_days, reason) log_admin("[key_name(user)] banned [banned_ckey] from whitelist for [duration_days] days for reason: [reason]") message_admins("[key_name_admin(user)] banned [banned_ckey] from whitelist for [duration_days] days for reason: [reason]") From 73411b984b71e320b3944ba1100b735b3f5a7fcf Mon Sep 17 00:00:00 2001 From: Furior Date: Sat, 4 Jan 2025 16:15:06 +0700 Subject: [PATCH 18/40] better check for duration days --- modular_bandastation/metaserver/code/admin.dm | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modular_bandastation/metaserver/code/admin.dm b/modular_bandastation/metaserver/code/admin.dm index 153e90c7ee1d5..8135e2da36030 100644 --- a/modular_bandastation/metaserver/code/admin.dm +++ b/modular_bandastation/metaserver/code/admin.dm @@ -4,7 +4,7 @@ ADMIN_VERB(wl_ban, R_BAN, "WL Ban", "Ban a player from the whitelist.", ADMIN_CA if(!banned_ckey) return var/duration_days = input(user, "Please specify the duration of the ban in days.", "Duration", "") as num|null - if(!duration_days || duration_days < 0) + if(isnull(duration_days) || duration_days < 0) return var/reason = input(user, "Please specify the reason for the ban.", "Reason", "") as message|null From 0188fe9be86f09ad4589c84400be513e19f71aa5 Mon Sep 17 00:00:00 2001 From: Furior Date: Sat, 4 Jan 2025 16:42:30 +0700 Subject: [PATCH 19/40] status code bandaid --- modular_bandastation/tts/code/SSHttp.dm | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/modular_bandastation/tts/code/SSHttp.dm b/modular_bandastation/tts/code/SSHttp.dm index f42b5c800a7c2..52d7d298dd727 100644 --- a/modular_bandastation/tts/code/SSHttp.dm +++ b/modular_bandastation/tts/code/SSHttp.dm @@ -80,6 +80,15 @@ SUBSYSTEM_DEF(http) /// Callback for executing after async requests. Will be called with an argument of [/datum/http_response] as first argument var/datum/callback/cb +/datum/http_request/into_response() + . = ..() + + // HACK: I have no idea why this is necessary, but it is. + var/static/reg = ": status code ([0-9]{3})" + var/matched = findtext(_raw_response, reg) + if (matched) + R.status_code = text2num(copytext(matched, 15)) + /world/Del() rustgss220_close_async_http_client() . = ..() From bfba3c1b956c74324ecd5f176df451cbfaf0c0ef Mon Sep 17 00:00:00 2001 From: Furior Date: Sat, 4 Jan 2025 16:52:38 +0700 Subject: [PATCH 20/40] ah yes --- modular_bandastation/tts/code/SSHttp.dm | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/modular_bandastation/tts/code/SSHttp.dm b/modular_bandastation/tts/code/SSHttp.dm index 52d7d298dd727..fffb42757bf65 100644 --- a/modular_bandastation/tts/code/SSHttp.dm +++ b/modular_bandastation/tts/code/SSHttp.dm @@ -80,10 +80,11 @@ SUBSYSTEM_DEF(http) /// Callback for executing after async requests. Will be called with an argument of [/datum/http_response] as first argument var/datum/callback/cb +// HACK: I have no idea why this is necessary, but it is. /datum/http_request/into_response() . = ..() - // HACK: I have no idea why this is necessary, but it is. + var/datum/http_response/R = . var/static/reg = ": status code ([0-9]{3})" var/matched = findtext(_raw_response, reg) if (matched) From be20bbc119c2221067895bc0ee32bbdb977fa377 Mon Sep 17 00:00:00 2001 From: Furior Date: Sun, 2 Feb 2025 03:41:56 +0700 Subject: [PATCH 21/40] update? --- .../metaserver/code/discord_link.dm | 4 +- .../metaserver/code/interview.dm | 5 ++ .../metaserver/code/ss_central.dm | 62 ++++++++++--------- 3 files changed, 41 insertions(+), 30 deletions(-) diff --git a/modular_bandastation/metaserver/code/discord_link.dm b/modular_bandastation/metaserver/code/discord_link.dm index 91cd2ada26ab8..adabe386ae7c8 100644 --- a/modular_bandastation/metaserver/code/discord_link.dm +++ b/modular_bandastation/metaserver/code/discord_link.dm @@ -18,7 +18,7 @@ to_chat(src, span_warning("Привязка Discord сейчас недоступна.")) return - if(SScentral.discord_links[src.ckey]) + if(SScentral.is_player_discord_linked(src)) to_chat(src, span_warning("Вы уже привязали свою учетную запись Discord.")) return @@ -26,7 +26,7 @@ SScentral.verify_in_discord(src) /datum/controller/subsystem/central/proc/verify_in_discord(client/player) - var/endpoint = "[CONFIG_GET(string/ss_central_url)]/player/token/[player.ckey]" + var/endpoint = "[CONFIG_GET(string/ss_central_url)]/player/token?ckey=[player.ckey]" var/list/headers = list( "Authorization" = "Bearer [CONFIG_GET(string/ss_central_token)]" ) diff --git a/modular_bandastation/metaserver/code/interview.dm b/modular_bandastation/metaserver/code/interview.dm index 89e8e9fa70ed5..87be5f441fceb 100644 --- a/modular_bandastation/metaserver/code/interview.dm +++ b/modular_bandastation/metaserver/code/interview.dm @@ -10,6 +10,11 @@ /datum/config_entry/string/interview_webhook_url /datum/interview/approve(client/approved_by) + if(!SScentral.is_player_discord_linked(owner)) + to_chat(approved_by, span_warning("У игрока не привязана своя учетная запись Discord!")) + to_chat(owner, span_warning("Ваше интервью не удалось принять по причине: У вас не привязана учетная запись Discord!")) + log_admin("[key_name(approved_by)] tried and failed to approve [key_name(owner)] an interview. Reason: Discord account not linked.") + return . = ..() add_owner_to_whitelist(approved_by) send_interview_webhook(src, "[approved_by.ckey] approved:") diff --git a/modular_bandastation/metaserver/code/ss_central.dm b/modular_bandastation/metaserver/code/ss_central.dm index 3aad043febd09..49094270e0c87 100644 --- a/modular_bandastation/metaserver/code/ss_central.dm +++ b/modular_bandastation/metaserver/code/ss_central.dm @@ -19,7 +19,7 @@ SUBSYSTEM_DEF(central) load_whitelist() /datum/controller/subsystem/central/proc/load_whitelist() - var/endpoint = "[CONFIG_GET(string/ss_central_url)]/whitelist/simple/active_whitelists/ckey?wl_type=[CONFIG_GET(string/whitelist_type)]" + var/endpoint = "[CONFIG_GET(string/ss_central_url)]/whitelist/ckeys?wl_type=[CONFIG_GET(string/whitelist_type)]&active_only=true&page=1&page_size=9999" SShttp.create_async_request(RUSTG_HTTP_METHOD_GET, endpoint, "", list(), CALLBACK(src, PROC_REF(load_whitelist_callback))) @@ -28,11 +28,16 @@ SUBSYSTEM_DEF(central) stack_trace("Failed to load whitelist: HTTP status code [response.status_code] - [response.error]") return - var/list/ckeys = json_decode(response.body) + var/list/response = json_decode(response.body) + + log_game("Loading whitelist with [response["total"]] entries") + + var/list/ckeys = response["items"] + GLOB.whitelist = ckeys /datum/controller/subsystem/central/proc/get_player_discord_async(client/player) - var/endpoint = "[CONFIG_GET(string/ss_central_url)]/player/ckey/[player.ckey]" + var/endpoint = "[CONFIG_GET(string/ss_central_url)]/player?ckey=[player.ckey]" SShttp.create_async_request(RUSTG_HTTP_METHOD_GET, endpoint, "", list(), CALLBACK(src, PROC_REF(get_player_discord_callback), player)) @@ -69,15 +74,17 @@ SUBSYSTEM_DEF(central) /datum/controller/subsystem/central/proc/is_player_whitelisted(ckey) . = (ckey in GLOB.whitelist) - var/endpoint = "[CONFIG_GET(string/ss_central_url)]/whitelist/simple/is_whitelisted/ckey/[ckey]?wl_type=[CONFIG_GET(string/whitelist_type)]" + var/endpoint = "[CONFIG_GET(string/ss_central_url)]/whitelists?wl_type=[CONFIG_GET(string/whitelist_type)]&ckey=[ckey]&page=1&page_size=1" var/datum/http_response/response = SShttp.make_blocking_request(RUSTG_HTTP_METHOD_GET, endpoint, "", list()) if(response.errored || response.status_code != 200 && response.status_code != 404) return FALSE - return json_decode(response.body) + var/result = json_decode(response.body) + + return result["total"] /datum/controller/subsystem/central/proc/add_to_whitelist(ckey, added_by, duration_days = 0) - var/endpoint = "[CONFIG_GET(string/ss_central_url)]/whitelist/ckey" + var/endpoint = "[CONFIG_GET(string/ss_central_url)]/whitelist/by-ckey" var/list/headers = list() headers["Authorization"] = "Bearer [CONFIG_GET(string/ss_central_token)]" @@ -87,30 +94,32 @@ SUBSYSTEM_DEF(central) body["wl_type"] = CONFIG_GET(string/whitelist_type) body["duration_days"] = duration_days - SShttp.create_async_request(RUSTG_HTTP_METHOD_POST, endpoint, json_encode(body), headers, CALLBACK(src, PROC_REF(add_to_whitelist_callback))) + SShttp.create_async_request(RUSTG_HTTP_METHOD_POST, endpoint, json_encode(body), headers, CALLBACK(src, PROC_REF(add_to_whitelist_callback), ckey)) -/datum/controller/subsystem/central/proc/add_to_whitelist_callback(datum/http_response/response) +/datum/controller/subsystem/central/proc/add_to_whitelist_callback(ckey, datum/http_response/response) if(response.errored) - switch(response.status_code) - if(404) - message_admins("Failed to add to whitelist: Player not found") - return + stack_trace("Failed to add to whitelist: HTTP error - [response.error]") - if(409) - message_admins("Failed to add to whitelist: Player is whitelist banned") - return + switch(response.status_code) + if(201) + . = . // noop + if(404) + message_admins("Failed to add to whitelist: Player not found") + return - else - stack_trace("Failed to add to whitelist: HTTP status code [response.status_code] - [response.error]") - return + if(409) + message_admins("Failed to add to whitelist: Player is whitelist banned") + return - var/list/data = json_decode(response.body) - var/ckey = data["ckey"] + else + stack_trace("Failed to add to whitelist: HTTP status code [response.status_code] - [response.body]") + return + log_admin("Added [ckey] to whitelist successfully") GLOB.whitelist |= ckey /datum/controller/subsystem/central/proc/whitelist_ban_player(player_ckey, admin_ckey, duration_days, reason) - var/endpoint = "[CONFIG_GET(string/ss_central_url)]/whitelist/ban/ckey" + var/endpoint = "[CONFIG_GET(string/ss_central_url)]/whitelist/ban/by-ckey" var/list/headers = list() headers["Authorization"] = "Bearer [CONFIG_GET(string/ss_central_token)]" @@ -121,14 +130,11 @@ SUBSYSTEM_DEF(central) body["duration_days"] = duration_days body["reason"] = reason - SShttp.create_async_request(RUSTG_HTTP_METHOD_POST, endpoint, json_encode(body), headers, CALLBACK(src, PROC_REF(whitelist_ban_player_callback))) + SShttp.create_async_request(RUSTG_HTTP_METHOD_POST, endpoint, json_encode(body), headers, CALLBACK(src, PROC_REF(whitelist_ban_player_callback), player_ckey)) -/datum/controller/subsystem/central/proc/whitelist_ban_player_callback(datum/http_response/response) - if(response.errored || response.status_code != 200) - stack_trace("Failed to ban player: HTTP status code [response.status_code] - [response.error]") +/datum/controller/subsystem/central/proc/whitelist_ban_player_callback(ckey, datum/http_response/response) + if(response.errored || response.status_code != 201) + stack_trace("Failed to ban player: HTTP status code [response.status_code] - [response.error] - [response.body]") return - var/list/data = json_decode(response.body) - var/ckey = data["ckey"] - GLOB.whitelist -= ckey From df71569b5e5bf6a9e3d40aaa8488b8c076fc1c4a Mon Sep 17 00:00:00 2001 From: Furior Date: Sun, 2 Feb 2025 03:52:03 +0700 Subject: [PATCH 22/40] typo --- modular_bandastation/metaserver/code/ss_central.dm | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modular_bandastation/metaserver/code/ss_central.dm b/modular_bandastation/metaserver/code/ss_central.dm index 49094270e0c87..7e3ed841df106 100644 --- a/modular_bandastation/metaserver/code/ss_central.dm +++ b/modular_bandastation/metaserver/code/ss_central.dm @@ -28,7 +28,7 @@ SUBSYSTEM_DEF(central) stack_trace("Failed to load whitelist: HTTP status code [response.status_code] - [response.error]") return - var/list/response = json_decode(response.body) + var/list/result = json_decode(response.body) log_game("Loading whitelist with [response["total"]] entries") From b342c7ef7e1552e38db8f0bd4f89511be0e2478e Mon Sep 17 00:00:00 2001 From: Furior Date: Sun, 2 Feb 2025 03:53:09 +0700 Subject: [PATCH 23/40] fuck it --- modular_bandastation/metaserver/code/ss_central.dm | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modular_bandastation/metaserver/code/ss_central.dm b/modular_bandastation/metaserver/code/ss_central.dm index 7e3ed841df106..dc2066317266d 100644 --- a/modular_bandastation/metaserver/code/ss_central.dm +++ b/modular_bandastation/metaserver/code/ss_central.dm @@ -32,7 +32,7 @@ SUBSYSTEM_DEF(central) log_game("Loading whitelist with [response["total"]] entries") - var/list/ckeys = response["items"] + var/list/ckeys = result["items"] GLOB.whitelist = ckeys From b31657e4ee08a94092067bba677acb892a571458 Mon Sep 17 00:00:00 2001 From: Furior Date: Thu, 6 Feb 2025 16:12:28 +0700 Subject: [PATCH 24/40] fix tests --- .../metaserver/code/ss_central.dm | 25 ++++++++++++++++++- 1 file changed, 24 insertions(+), 1 deletion(-) diff --git a/modular_bandastation/metaserver/code/ss_central.dm b/modular_bandastation/metaserver/code/ss_central.dm index dc2066317266d..b709acea5cf85 100644 --- a/modular_bandastation/metaserver/code/ss_central.dm +++ b/modular_bandastation/metaserver/code/ss_central.dm @@ -15,7 +15,7 @@ SUBSYSTEM_DEF(central) /datum/controller/subsystem/central/Initialize() if(!(CONFIG_GET(string/ss_central_url) && CONFIG_GET(string/ss_central_token))) - return SS_INIT_FAILURE + return SS_INIT_NO_NEED load_whitelist() /datum/controller/subsystem/central/proc/load_whitelist() @@ -138,3 +138,26 @@ SUBSYSTEM_DEF(central) return GLOB.whitelist -= ckey + +/datum/controller/subsystem/central/proc/update_player_donate_tier_async(client/player) + // TODO: handle cases when player has several donate tiers??? + var/endpoint = "[CONFIG_GET(string/ss_central_url)]/donate?ckey=[player.ckey]&valid_only=true&page=1&page_size=1" + SShttp.create_async_request(RUSTG_HTTP_METHOD_GET, endpoint, "", list(), CALLBACK(src, PROC_REF(update_player_donate_tier_callback), player)) + +/datum/controller/subsystem/central/proc/update_player_donate_tier_callback(client/player, datum/http_response/response) + if(response.errored || response.status_code != 200 && response.status_code != 404) + stack_trace("Failed to get player donate tier: HTTP status code [response.status_code] - [response.error] - [response.body]") + return + + var/list/data = json_decode(response.body) + player.donator_level = data["items"][0]["tier"] + +/datum/controller/subsystem/central/proc/get_player_donate_tier_blocking(client/player) + var/endpoint = "[CONFIG_GET(string/ss_central_url)]/donate?ckey=[player.ckey]&valid_only=true&page=1&page_size=1" + var/datum/http_response/response = SShttp.make_blocking_request(RUSTG_HTTP_METHOD_GET, endpoint, "", list()) + if(response.errored || response.status_code != 200 && response.status_code != 404) + stack_trace("Failed to get player donate tier: HTTP status code [response.status_code] - [response.error] - [response.body]") + return + + var/list/data = json_decode(response.body) + return data["items"][0]["tier"] From 4589babbffab34fa5d70b0597af55c94cee4bca6 Mon Sep 17 00:00:00 2001 From: Furior Date: Fri, 7 Feb 2025 19:07:42 +0700 Subject: [PATCH 25/40] its working I guess --- modular_bandastation/loadout/code/client.dm | 61 +++---------------- .../metaserver/_metaserver.dme | 1 + .../metaserver/code/donate.dm | 3 + .../metaserver/code/ss_central.dm | 21 ++++--- 4 files changed, 25 insertions(+), 61 deletions(-) create mode 100644 modular_bandastation/metaserver/code/donate.dm diff --git a/modular_bandastation/loadout/code/client.dm b/modular_bandastation/loadout/code/client.dm index 936fbcf6300fe..8baa59273180e 100644 --- a/modular_bandastation/loadout/code/client.dm +++ b/modular_bandastation/loadout/code/client.dm @@ -1,73 +1,28 @@ -#define DONATION_TIER_1 220 -#define DONATION_TIER_2 440 -#define DONATION_TIER_3 1000 -#define DONATION_TIER_4 2220 -#define DONATION_TIER_5 10000 #define BASIC_DONATOR_LEVEL 0 +#define ADMIN_DONATOR_LEVEL 3 +#define MAX_DONATOR_LEVEL 5 /client /// Call `proc/get_donator_level()` instead to get a value when possible. var/donator_level = BASIC_DONATOR_LEVEL var/can_save_donator_level = FALSE - COOLDOWN_DECLARE(db_check_cooldown) // For unit-tests /datum/client_interface - var/donator_level = 0 + var/donator_level = BASIC_DONATOR_LEVEL /datum/client_interface/proc/get_donator_level() return donator_level /client/proc/get_donator_level() - donator_level = max(donator_level, get_donator_level_from_db(), get_donator_level_from_admin()) - return donator_level + return max(donator_level, get_donator_level_from_admin()) /client/proc/get_donator_level_from_admin() if(!holder) - return 0 + return BASIC_DONATOR_LEVEL var/rank_flags = holder.rank_flags() if(rank_flags & R_EVERYTHING) - return 5 + return MAX_DONATOR_LEVEL if(rank_flags & R_ADMIN) - return 3 - return 0 - -/client/proc/get_donator_level_from_db() - if(!COOLDOWN_FINISHED(src, db_check_cooldown)) - return 0 - COOLDOWN_START(src, db_check_cooldown, 15 SECONDS) - var/datum/db_query/query_get_donator_level = SSdbcore.NewQuery({" - SELECT CAST(SUM(amount) as UNSIGNED INTEGER) FROM budget - WHERE ckey=:ckey - AND is_valid=true - AND date_start <= NOW() - AND (NOW() < date_end OR date_end IS NULL) - GROUP BY ckey - "}, list("ckey" = ckey)) - - var/amount = 0 - if(query_get_donator_level.warn_execute() && length(query_get_donator_level.rows)) - query_get_donator_level.NextRow() - amount = query_get_donator_level.item[1] - //Даем разрешение сохранять лодаут только после успешного запроса к СУБД - can_save_donator_level = TRUE - qdel(query_get_donator_level) - - switch(amount) - if(DONATION_TIER_1 to (DONATION_TIER_2 - 1)) - return 1 - if(DONATION_TIER_2 to (DONATION_TIER_3 - 1)) - return 2 - if(DONATION_TIER_3 to (DONATION_TIER_4 - 1)) - return 3 - if(DONATION_TIER_4 to (DONATION_TIER_5 - 1)) - return 4 - if(DONATION_TIER_5 to INFINITY) - return 5 - return 0 - -#undef DONATION_TIER_1 -#undef DONATION_TIER_2 -#undef DONATION_TIER_3 -#undef DONATION_TIER_4 -#undef DONATION_TIER_5 + return ADMIN_DONATOR_LEVEL + return BASIC_DONATOR_LEVEL diff --git a/modular_bandastation/metaserver/_metaserver.dme b/modular_bandastation/metaserver/_metaserver.dme index 2417f1a9f5b9a..fdd849d82b23f 100644 --- a/modular_bandastation/metaserver/_metaserver.dme +++ b/modular_bandastation/metaserver/_metaserver.dme @@ -2,5 +2,6 @@ #include "code/admin.dm" #include "code/discord_link.dm" +#include "code/donate.dm" #include "code/interview.dm" #include "code/ss_central.dm" diff --git a/modular_bandastation/metaserver/code/donate.dm b/modular_bandastation/metaserver/code/donate.dm new file mode 100644 index 0000000000000..8801f00bd0fab --- /dev/null +++ b/modular_bandastation/metaserver/code/donate.dm @@ -0,0 +1,3 @@ +/client/New() + . = ..() + SScentral.update_player_donate_tier_async(src) diff --git a/modular_bandastation/metaserver/code/ss_central.dm b/modular_bandastation/metaserver/code/ss_central.dm index b709acea5cf85..eb6d8c2bc5e77 100644 --- a/modular_bandastation/metaserver/code/ss_central.dm +++ b/modular_bandastation/metaserver/code/ss_central.dm @@ -30,7 +30,7 @@ SUBSYSTEM_DEF(central) var/list/result = json_decode(response.body) - log_game("Loading whitelist with [response["total"]] entries") + log_game("Loading whitelist with [result["total"]] entries") var/list/ckeys = result["items"] @@ -134,30 +134,35 @@ SUBSYSTEM_DEF(central) /datum/controller/subsystem/central/proc/whitelist_ban_player_callback(ckey, datum/http_response/response) if(response.errored || response.status_code != 201) - stack_trace("Failed to ban player: HTTP status code [response.status_code] - [response.error] - [response.body]") + stack_trace("Failed to ban player from whitelist: HTTP status code [response.status_code] - [response.error] - [response.body]") + message_admins("Failed to ban player [ckey] from wl: check runtimes") return GLOB.whitelist -= ckey /datum/controller/subsystem/central/proc/update_player_donate_tier_async(client/player) // TODO: handle cases when player has several donate tiers??? - var/endpoint = "[CONFIG_GET(string/ss_central_url)]/donate?ckey=[player.ckey]&valid_only=true&page=1&page_size=1" + var/endpoint = "[CONFIG_GET(string/ss_central_url)]/donates?ckey=[player.ckey]&active_only=true&page=1&page_size=1" SShttp.create_async_request(RUSTG_HTTP_METHOD_GET, endpoint, "", list(), CALLBACK(src, PROC_REF(update_player_donate_tier_callback), player)) /datum/controller/subsystem/central/proc/update_player_donate_tier_callback(client/player, datum/http_response/response) - if(response.errored || response.status_code != 200 && response.status_code != 404) + if(response.errored || response.status_code != 200) stack_trace("Failed to get player donate tier: HTTP status code [response.status_code] - [response.error] - [response.body]") return var/list/data = json_decode(response.body) - player.donator_level = data["items"][0]["tier"] + if(data["total"] != 0) + player.donator_level = data["items"][1]["tier"] + player.can_save_donator_level = TRUE /datum/controller/subsystem/central/proc/get_player_donate_tier_blocking(client/player) - var/endpoint = "[CONFIG_GET(string/ss_central_url)]/donate?ckey=[player.ckey]&valid_only=true&page=1&page_size=1" + var/endpoint = "[CONFIG_GET(string/ss_central_url)]/donates?ckey=[player.ckey]&active_only=true&page=1&page_size=1" var/datum/http_response/response = SShttp.make_blocking_request(RUSTG_HTTP_METHOD_GET, endpoint, "", list()) - if(response.errored || response.status_code != 200 && response.status_code != 404) + if(response.errored || response.status_code != 200) stack_trace("Failed to get player donate tier: HTTP status code [response.status_code] - [response.error] - [response.body]") return var/list/data = json_decode(response.body) - return data["items"][0]["tier"] + if(data["total"] != 0) + player.donator_level = data["items"][0]["tier"] + player.can_save_donator_level = TRUE From a5e9cb6a648b0f0afda97950ae18d9467b53c807 Mon Sep 17 00:00:00 2001 From: Furior Date: Fri, 7 Feb 2025 19:08:34 +0700 Subject: [PATCH 26/40] config --- config/bandastation/bandastation_config.txt | 2 ++ 1 file changed, 2 insertions(+) diff --git a/config/bandastation/bandastation_config.txt b/config/bandastation/bandastation_config.txt index 02e729908e2af..42231bfd466b1 100644 --- a/config/bandastation/bandastation_config.txt +++ b/config/bandastation/bandastation_config.txt @@ -9,7 +9,9 @@ #SS_CENTRAL_TOKEN 12345678 #WHITELIST_TYPE default ## Entry from the general config.txt +## New behavior - enabled PANIC_BUNKER_INTERVIEW allows only whitelisted players to play, passing interview gives a year long whitelist #USEWHITELIST +#PANIC_BUNKER_INTERVIEW ## A minimum amount of security required on roundstart ## If there is less security than this value, a percent of roundstart threat will be pushed to midround From cb5293adb96b3c6931ce75b95f63f642cd263714 Mon Sep 17 00:00:00 2001 From: Furior Date: Fri, 7 Feb 2025 19:12:55 +0700 Subject: [PATCH 27/40] bb --- modular_bandastation/metaserver/code/admin.dm | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modular_bandastation/metaserver/code/admin.dm b/modular_bandastation/metaserver/code/admin.dm index 8135e2da36030..660072233c8d5 100644 --- a/modular_bandastation/metaserver/code/admin.dm +++ b/modular_bandastation/metaserver/code/admin.dm @@ -1,4 +1,5 @@ ADMIN_VERB(wl_ban, R_BAN, "WL Ban", "Ban a player from the whitelist.", ADMIN_CATEGORY_MAIN) + BLACKBOX_LOG_ADMIN_VERB("WL Ban") var/banned_ckey = input(user, "Please specify the ckey of the player you want to ban from the whitelist.", "WL Ban", "") as text|null banned_ckey = ckey(banned_ckey) if(!banned_ckey) @@ -13,4 +14,3 @@ ADMIN_VERB(wl_ban, R_BAN, "WL Ban", "Ban a player from the whitelist.", ADMIN_CA log_admin("[key_name(user)] banned [banned_ckey] from whitelist for [duration_days] days for reason: [reason]") message_admins("[key_name_admin(user)] banned [banned_ckey] from whitelist for [duration_days] days for reason: [reason]") - SSblackbox.record_feedback("nested tally", "admin_toggle", 1, list("WL Ban", "Ckey: [banned_ckey], Duration: [duration_days], Reason: [reason]")) From 33ea3a77215e45e1996fd59880283f9a0b5f17d9 Mon Sep 17 00:00:00 2001 From: Furior Date: Tue, 11 Feb 2025 00:23:41 +0700 Subject: [PATCH 28/40] central update --- modular_bandastation/metaserver/code/discord_link.dm | 4 ++-- modular_bandastation/metaserver/code/ss_central.dm | 12 ++++++------ 2 files changed, 8 insertions(+), 8 deletions(-) diff --git a/modular_bandastation/metaserver/code/discord_link.dm b/modular_bandastation/metaserver/code/discord_link.dm index adabe386ae7c8..31d45d52b077b 100644 --- a/modular_bandastation/metaserver/code/discord_link.dm +++ b/modular_bandastation/metaserver/code/discord_link.dm @@ -26,7 +26,7 @@ SScentral.verify_in_discord(src) /datum/controller/subsystem/central/proc/verify_in_discord(client/player) - var/endpoint = "[CONFIG_GET(string/ss_central_url)]/player/token?ckey=[player.ckey]" + var/endpoint = "[CONFIG_GET(string/ss_central_url)]/oauth/token?ckey=[player.ckey]" var/list/headers = list( "Authorization" = "Bearer [CONFIG_GET(string/ss_central_token)]" ) @@ -38,7 +38,7 @@ return var/list/data = json_decode(response.body) - var/login_endpoint = "[CONFIG_GET(string/ss_central_url)]/player/login?token=[data]" + var/login_endpoint = "[CONFIG_GET(string/ss_central_url)]/oauth/login?token=[data]" to_chat(player, boxed_message("Авторизуйтесь в открывшемся окне и ожидайте 30 секунд.
Если окно не открывается, можете открыть ссылку в браузере самостоятельно:
[login_endpoint].")) player << link(login_endpoint) diff --git a/modular_bandastation/metaserver/code/ss_central.dm b/modular_bandastation/metaserver/code/ss_central.dm index eb6d8c2bc5e77..df4db230a62f9 100644 --- a/modular_bandastation/metaserver/code/ss_central.dm +++ b/modular_bandastation/metaserver/code/ss_central.dm @@ -19,13 +19,13 @@ SUBSYSTEM_DEF(central) load_whitelist() /datum/controller/subsystem/central/proc/load_whitelist() - var/endpoint = "[CONFIG_GET(string/ss_central_url)]/whitelist/ckeys?wl_type=[CONFIG_GET(string/whitelist_type)]&active_only=true&page=1&page_size=9999" + var/endpoint = "[CONFIG_GET(string/ss_central_url)]/whitelists/ckeys?wl_type=[CONFIG_GET(string/whitelist_type)]&active_only=true&page=1&page_size=9999" SShttp.create_async_request(RUSTG_HTTP_METHOD_GET, endpoint, "", list(), CALLBACK(src, PROC_REF(load_whitelist_callback))) /datum/controller/subsystem/central/proc/load_whitelist_callback(datum/http_response/response) if(response.errored || response.status_code != 200) - stack_trace("Failed to load whitelist: HTTP status code [response.status_code] - [response.error]") + stack_trace("Failed to load whitelist: HTTP status code [response.status_code] - [response.error] - [response.body]") return var/list/result = json_decode(response.body) @@ -37,13 +37,13 @@ SUBSYSTEM_DEF(central) GLOB.whitelist = ckeys /datum/controller/subsystem/central/proc/get_player_discord_async(client/player) - var/endpoint = "[CONFIG_GET(string/ss_central_url)]/player?ckey=[player.ckey]" + var/endpoint = "[CONFIG_GET(string/ss_central_url)]/players/ckey/[player.ckey]" SShttp.create_async_request(RUSTG_HTTP_METHOD_GET, endpoint, "", list(), CALLBACK(src, PROC_REF(get_player_discord_callback), player)) /datum/controller/subsystem/central/proc/get_player_discord_callback(client/player, datum/http_response/response) if(response.errored || response.status_code != 200 && response.status_code != 404) - stack_trace("Failed to get player discord: HTTP status code [response.status_code] - [response.error]") + stack_trace("Failed to get player discord: HTTP status code [response.status_code] - [response.error] - [response.body]") return var/list/data = json_decode(response.body) @@ -84,7 +84,7 @@ SUBSYSTEM_DEF(central) return result["total"] /datum/controller/subsystem/central/proc/add_to_whitelist(ckey, added_by, duration_days = 0) - var/endpoint = "[CONFIG_GET(string/ss_central_url)]/whitelist/by-ckey" + var/endpoint = "[CONFIG_GET(string/ss_central_url)]/whitelists" var/list/headers = list() headers["Authorization"] = "Bearer [CONFIG_GET(string/ss_central_token)]" @@ -119,7 +119,7 @@ SUBSYSTEM_DEF(central) GLOB.whitelist |= ckey /datum/controller/subsystem/central/proc/whitelist_ban_player(player_ckey, admin_ckey, duration_days, reason) - var/endpoint = "[CONFIG_GET(string/ss_central_url)]/whitelist/ban/by-ckey" + var/endpoint = "[CONFIG_GET(string/ss_central_url)]/whitelist_bans" var/list/headers = list() headers["Authorization"] = "Bearer [CONFIG_GET(string/ss_central_token)]" From 5a9575b586abb261d7f19ef1b714bfcbd00c5916 Mon Sep 17 00:00:00 2001 From: "Mikhail G." Date: Tue, 11 Feb 2025 00:26:08 +0700 Subject: [PATCH 29/40] Update modular_bandastation/tts/code/SSHttp.dm Co-authored-by: Gaxeer <44334376+Gaxeer@users.noreply.github.com> --- modular_bandastation/tts/code/SSHttp.dm | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modular_bandastation/tts/code/SSHttp.dm b/modular_bandastation/tts/code/SSHttp.dm index c09655adf76a5..f6c73ae1031ac 100644 --- a/modular_bandastation/tts/code/SSHttp.dm +++ b/modular_bandastation/tts/code/SSHttp.dm @@ -65,7 +65,7 @@ SUBSYSTEM_DEF(http) * Generates a blocking request, executes it, logs the info then cleanly returns the response * Uses UNTIL, so is VERY dangerous to use. */ -/datum/controller/subsystem/http/proc/make_blocking_request(method, url, body = "", list/headers) +/datum/controller/subsystem/http/proc/make_sync_request(method, url, body = "", list/headers) var/datum/http_request/req = new() req.prepare(method, url, body, headers) req.begin_async() From 1b84f1c6bded346548418f4aeec2626fe0711fe9 Mon Sep 17 00:00:00 2001 From: Furior Date: Tue, 11 Feb 2025 00:49:00 +0700 Subject: [PATCH 30/40] req rename --- modular_bandastation/metaserver/code/ss_central.dm | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/modular_bandastation/metaserver/code/ss_central.dm b/modular_bandastation/metaserver/code/ss_central.dm index df4db230a62f9..865a7d5bc75f7 100644 --- a/modular_bandastation/metaserver/code/ss_central.dm +++ b/modular_bandastation/metaserver/code/ss_central.dm @@ -75,7 +75,7 @@ SUBSYSTEM_DEF(central) . = (ckey in GLOB.whitelist) var/endpoint = "[CONFIG_GET(string/ss_central_url)]/whitelists?wl_type=[CONFIG_GET(string/whitelist_type)]&ckey=[ckey]&page=1&page_size=1" - var/datum/http_response/response = SShttp.make_blocking_request(RUSTG_HTTP_METHOD_GET, endpoint, "", list()) + var/datum/http_response/response = SShttp.make_sync_request(RUSTG_HTTP_METHOD_GET, endpoint, "", list()) if(response.errored || response.status_code != 200 && response.status_code != 404) return FALSE @@ -157,7 +157,7 @@ SUBSYSTEM_DEF(central) /datum/controller/subsystem/central/proc/get_player_donate_tier_blocking(client/player) var/endpoint = "[CONFIG_GET(string/ss_central_url)]/donates?ckey=[player.ckey]&active_only=true&page=1&page_size=1" - var/datum/http_response/response = SShttp.make_blocking_request(RUSTG_HTTP_METHOD_GET, endpoint, "", list()) + var/datum/http_response/response = SShttp.make_sync_request(RUSTG_HTTP_METHOD_GET, endpoint, "", list()) if(response.errored || response.status_code != 200) stack_trace("Failed to get player donate tier: HTTP status code [response.status_code] - [response.error] - [response.body]") return From 255fe2ffdd9d0221dcb59591d6f71d6e3e6259a5 Mon Sep 17 00:00:00 2001 From: Furior Date: Tue, 11 Feb 2025 16:02:11 +0700 Subject: [PATCH 31/40] admins need wl too --- code/modules/admin/IsBanned.dm | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/code/modules/admin/IsBanned.dm b/code/modules/admin/IsBanned.dm index f98520bb84a69..5fb30af891a47 100644 --- a/code/modules/admin/IsBanned.dm +++ b/code/modules/admin/IsBanned.dm @@ -55,7 +55,7 @@ //Whitelist if(!real_bans_only && !C && CONFIG_GET(flag/usewhitelist)) if(!check_whitelist(ckey)) - if (admin) + if (FALSE) // BANDASTATION EDIT: SS Central log_admin("The admin [ckey] has been allowed to bypass the whitelist") if (message) message_admins(span_adminnotice("The admin [ckey] has been allowed to bypass the whitelist")) From 82dc99ba4fbde4f24e5a8b3c3ac57770f10fa29a Mon Sep 17 00:00:00 2001 From: Furior Date: Tue, 11 Feb 2025 16:13:46 +0700 Subject: [PATCH 32/40] fiiiiiine --- code/modules/admin/IsBanned.dm | 17 +++++++++-------- 1 file changed, 9 insertions(+), 8 deletions(-) diff --git a/code/modules/admin/IsBanned.dm b/code/modules/admin/IsBanned.dm index 5fb30af891a47..1f2cbeb1b7914 100644 --- a/code/modules/admin/IsBanned.dm +++ b/code/modules/admin/IsBanned.dm @@ -55,14 +55,15 @@ //Whitelist if(!real_bans_only && !C && CONFIG_GET(flag/usewhitelist)) if(!check_whitelist(ckey)) - if (FALSE) // BANDASTATION EDIT: SS Central - log_admin("The admin [ckey] has been allowed to bypass the whitelist") - if (message) - message_admins(span_adminnotice("The admin [ckey] has been allowed to bypass the whitelist")) - addclientmessage(ckey,span_adminnotice("You have been allowed to bypass the whitelist")) - else - log_access("Failed Login: [ckey] - Not on whitelist") - return list("reason"="whitelist", "desc" = "\nReason: You are not on the white list for this server") + // BANDASTATION EDIT - SSCentral - Admins need wls too + // if (admin) + // log_admin("The admin [ckey] has been allowed to bypass the whitelist") + // if (message) + // message_admins(span_adminnotice("The admin [ckey] has been allowed to bypass the whitelist")) + // addclientmessage(ckey,span_adminnotice("You have been allowed to bypass the whitelist")) + // else + log_access("Failed Login: [ckey] - Not on whitelist") + return list("reason"="whitelist", "desc" = "\nReason: You are not on the white list for this server") //Guest Checking if(!real_bans_only && !C && is_guest_key(key)) From a37d5a78e0828e6f92f51501677e1046a0c30dad Mon Sep 17 00:00:00 2001 From: Furior Date: Tue, 11 Feb 2025 16:16:25 +0700 Subject: [PATCH 33/40] wl double check --- code/modules/admin/whitelist.dm | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/code/modules/admin/whitelist.dm b/code/modules/admin/whitelist.dm index fd6402ad98dcf..19f6a39625710 100644 --- a/code/modules/admin/whitelist.dm +++ b/code/modules/admin/whitelist.dm @@ -17,10 +17,8 @@ GLOBAL_LIST(whitelist) /proc/check_whitelist(ckey) if(!GLOB.whitelist) return FALSE - . = (ckey in GLOB.whitelist) - // SS220 ADDITION - SS Central - if (!. && SScentral.initialized) - . = SScentral.is_player_whitelisted(ckey) + // BANDASTATION EDIT - SSCentral + return SScentral.is_player_whitelisted(ckey) #undef WHITELISTFILE From 44af0ea0d659dfd5c6e5a8f166d9640dbf44b277 Mon Sep 17 00:00:00 2001 From: Furior Date: Tue, 11 Feb 2025 16:23:01 +0700 Subject: [PATCH 34/40] translations --- modular_bandastation/metaserver/_metaserver.dm | 2 +- modular_bandastation/metaserver/code/admin.dm | 10 +++++----- modular_bandastation/metaserver/code/interview.dm | 8 ++++---- modular_bandastation/metaserver/code/ss_central.dm | 10 +++++----- 4 files changed, 15 insertions(+), 15 deletions(-) diff --git a/modular_bandastation/metaserver/_metaserver.dm b/modular_bandastation/metaserver/_metaserver.dm index dd2f59856dc9c..c136aa16bc31f 100644 --- a/modular_bandastation/metaserver/_metaserver.dm +++ b/modular_bandastation/metaserver/_metaserver.dm @@ -1,4 +1,4 @@ /datum/modpack/metaserver name = "Metaserver" - desc = "Использование вайтлиста через БД" + desc = "Общая инфраструктура для серверов" author = "furior, larentoun" diff --git a/modular_bandastation/metaserver/code/admin.dm b/modular_bandastation/metaserver/code/admin.dm index 660072233c8d5..b074fb1e5fbac 100644 --- a/modular_bandastation/metaserver/code/admin.dm +++ b/modular_bandastation/metaserver/code/admin.dm @@ -1,16 +1,16 @@ -ADMIN_VERB(wl_ban, R_BAN, "WL Ban", "Ban a player from the whitelist.", ADMIN_CATEGORY_MAIN) +ADMIN_VERB(wl_ban, R_BAN, "WL Ban", "Выписать игрока из вайтлиста.", ADMIN_CATEGORY_MAIN) BLACKBOX_LOG_ADMIN_VERB("WL Ban") - var/banned_ckey = input(user, "Please specify the ckey of the player you want to ban from the whitelist.", "WL Ban", "") as text|null + var/banned_ckey = input(user, "Укажите ckey игрока для выписки.", "Выписка", "") as text|null banned_ckey = ckey(banned_ckey) if(!banned_ckey) return - var/duration_days = input(user, "Please specify the duration of the ban in days.", "Duration", "") as num|null + var/duration_days = input(user, "Укажите длительность выписки в днях.", "Длительность", "") as num|null if(isnull(duration_days) || duration_days < 0) return - var/reason = input(user, "Please specify the reason for the ban.", "Reason", "") as message|null + var/reason = input(user, "Укажите причину выписки.", "Причина", "") as message|null SScentral.whitelist_ban_player(banned_ckey, user.ckey, duration_days, reason) log_admin("[key_name(user)] banned [banned_ckey] from whitelist for [duration_days] days for reason: [reason]") - message_admins("[key_name_admin(user)] banned [banned_ckey] from whitelist for [duration_days] days for reason: [reason]") + message_admins("[key_name_admin(user)] выписал [banned_ckey] из вайтлиста на [duration_days] дней с причиной: [reason]") diff --git a/modular_bandastation/metaserver/code/interview.dm b/modular_bandastation/metaserver/code/interview.dm index 87be5f441fceb..e967273742db7 100644 --- a/modular_bandastation/metaserver/code/interview.dm +++ b/modular_bandastation/metaserver/code/interview.dm @@ -13,19 +13,19 @@ if(!SScentral.is_player_discord_linked(owner)) to_chat(approved_by, span_warning("У игрока не привязана своя учетная запись Discord!")) to_chat(owner, span_warning("Ваше интервью не удалось принять по причине: У вас не привязана учетная запись Discord!")) - log_admin("[key_name(approved_by)] tried and failed to approve [key_name(owner)] an interview. Reason: Discord account not linked.") + log_admin("[key_name(approved_by)] попытался безуспешно принять интервью [key_name(owner)]. Причина: Дискорд игрока не привязан.") return . = ..() add_owner_to_whitelist(approved_by) - send_interview_webhook(src, "[approved_by.ckey] approved:") + send_interview_webhook(src, "[approved_by.ckey] принял:") /datum/interview_manager/enqueue(datum/interview/to_queue) . = ..() - send_interview_webhook(to_queue, "New interview enqueued:") + send_interview_webhook(to_queue, "Новое интервью в очереди:") /datum/interview/deny(client/denied_by) . = ..() - send_interview_webhook(src, "[denied_by.ckey] denied:") + send_interview_webhook(src, "[denied_by.ckey] отказал:") /datum/interview/proc/serialize_embed() . = list( diff --git a/modular_bandastation/metaserver/code/ss_central.dm b/modular_bandastation/metaserver/code/ss_central.dm index 865a7d5bc75f7..e924b1b750d1f 100644 --- a/modular_bandastation/metaserver/code/ss_central.dm +++ b/modular_bandastation/metaserver/code/ss_central.dm @@ -104,18 +104,18 @@ SUBSYSTEM_DEF(central) if(201) . = . // noop if(404) - message_admins("Failed to add to whitelist: Player not found") + message_admins("Не удалось добавить в вайтлист: Игрок не найден") return if(409) - message_admins("Failed to add to whitelist: Player is whitelist banned") + message_admins("Не удалось добавить в вайтлист: Игрок выписан") return else - stack_trace("Failed to add to whitelist: HTTP status code [response.status_code] - [response.body]") + stack_trace("Не удалось добавить в вайтлист: HTTP status code [response.status_code] - [response.body]") return - log_admin("Added [ckey] to whitelist successfully") + log_admin("Игрок [ckey] успешно добавлен в вайтлист") GLOB.whitelist |= ckey /datum/controller/subsystem/central/proc/whitelist_ban_player(player_ckey, admin_ckey, duration_days, reason) @@ -135,7 +135,7 @@ SUBSYSTEM_DEF(central) /datum/controller/subsystem/central/proc/whitelist_ban_player_callback(ckey, datum/http_response/response) if(response.errored || response.status_code != 201) stack_trace("Failed to ban player from whitelist: HTTP status code [response.status_code] - [response.error] - [response.body]") - message_admins("Failed to ban player [ckey] from wl: check runtimes") + message_admins("Не удалось выписать [ckey]. Больше информации в рантаймах.") return GLOB.whitelist -= ckey From d9d5d58b434e37e4bfc0101ca98ac36ac06aa7dc Mon Sep 17 00:00:00 2001 From: Furior Date: Tue, 11 Feb 2025 16:36:40 +0700 Subject: [PATCH 35/40] fixes --- code/modules/admin/IsBanned.dm | 4 ++-- code/modules/admin/whitelist.dm | 8 +++----- modular_bandastation/metaserver/code/ss_central.dm | 5 +++++ 3 files changed, 10 insertions(+), 7 deletions(-) diff --git a/code/modules/admin/IsBanned.dm b/code/modules/admin/IsBanned.dm index 1f2cbeb1b7914..7d5f407d8fccb 100644 --- a/code/modules/admin/IsBanned.dm +++ b/code/modules/admin/IsBanned.dm @@ -53,9 +53,9 @@ qdel(query_client_in_db) //Whitelist - if(!real_bans_only && !C && CONFIG_GET(flag/usewhitelist)) + // BANDASTATION EDIT - SSCentral - Admins need wls too + if(!real_bans_only && CONFIG_GET(flag/usewhitelist)) // Allow whitelist banning people who are already on a server if(!check_whitelist(ckey)) - // BANDASTATION EDIT - SSCentral - Admins need wls too // if (admin) // log_admin("The admin [ckey] has been allowed to bypass the whitelist") // if (message) diff --git a/code/modules/admin/whitelist.dm b/code/modules/admin/whitelist.dm index 19f6a39625710..822d72c2cf41d 100644 --- a/code/modules/admin/whitelist.dm +++ b/code/modules/admin/whitelist.dm @@ -11,13 +11,11 @@ GLOBAL_LIST(whitelist) continue GLOB.whitelist += ckey(line) - if(!GLOB.whitelist.len) - GLOB.whitelist = null + // BADNASTATION EDIT + // if(!GLOB.whitelist.len) + // GLOB.whitelist = null /proc/check_whitelist(ckey) - if(!GLOB.whitelist) - return FALSE - // BANDASTATION EDIT - SSCentral return SScentral.is_player_whitelisted(ckey) diff --git a/modular_bandastation/metaserver/code/ss_central.dm b/modular_bandastation/metaserver/code/ss_central.dm index e924b1b750d1f..64135e4baa286 100644 --- a/modular_bandastation/metaserver/code/ss_central.dm +++ b/modular_bandastation/metaserver/code/ss_central.dm @@ -18,6 +18,11 @@ SUBSYSTEM_DEF(central) return SS_INIT_NO_NEED load_whitelist() +/datum/controller/subsystem/central/stat_entry(msg) + if(!initialized) + return "OFFLINE" + return "WL: [CONFIG_GET(flag/usewhitelist)] [CONFIG_GET(string/whitelist_type)]" + /datum/controller/subsystem/central/proc/load_whitelist() var/endpoint = "[CONFIG_GET(string/ss_central_url)]/whitelists/ckeys?wl_type=[CONFIG_GET(string/whitelist_type)]&active_only=true&page=1&page_size=9999" From 8dc5d2743d52c1c09760d109370e5010617450f8 Mon Sep 17 00:00:00 2001 From: Furior Date: Tue, 11 Feb 2025 17:42:03 +0700 Subject: [PATCH 36/40] stat entry --- modular_bandastation/metaserver/code/ss_central.dm | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/modular_bandastation/metaserver/code/ss_central.dm b/modular_bandastation/metaserver/code/ss_central.dm index 64135e4baa286..aff0936736340 100644 --- a/modular_bandastation/metaserver/code/ss_central.dm +++ b/modular_bandastation/metaserver/code/ss_central.dm @@ -20,8 +20,10 @@ SUBSYSTEM_DEF(central) /datum/controller/subsystem/central/stat_entry(msg) if(!initialized) - return "OFFLINE" - return "WL: [CONFIG_GET(flag/usewhitelist)] [CONFIG_GET(string/whitelist_type)]" + msg = "OFFLINE" + else + "WL: [CONFIG_GET(flag/usewhitelist)] [CONFIG_GET(string/whitelist_type)]" + return ..() /datum/controller/subsystem/central/proc/load_whitelist() var/endpoint = "[CONFIG_GET(string/ss_central_url)]/whitelists/ckeys?wl_type=[CONFIG_GET(string/whitelist_type)]&active_only=true&page=1&page_size=9999" From 9ab24bc5ce69f12a4e78d9b098e392bcafc23ce8 Mon Sep 17 00:00:00 2001 From: Furior Date: Tue, 11 Feb 2025 17:42:20 +0700 Subject: [PATCH 37/40] typo --- modular_bandastation/metaserver/code/ss_central.dm | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modular_bandastation/metaserver/code/ss_central.dm b/modular_bandastation/metaserver/code/ss_central.dm index aff0936736340..585ae7a224183 100644 --- a/modular_bandastation/metaserver/code/ss_central.dm +++ b/modular_bandastation/metaserver/code/ss_central.dm @@ -22,7 +22,7 @@ SUBSYSTEM_DEF(central) if(!initialized) msg = "OFFLINE" else - "WL: [CONFIG_GET(flag/usewhitelist)] [CONFIG_GET(string/whitelist_type)]" + msg = "WL: [CONFIG_GET(flag/usewhitelist)] [CONFIG_GET(string/whitelist_type)]" return ..() /datum/controller/subsystem/central/proc/load_whitelist() From a24946b3cda0a1a5ea8c629edbe92fecc485cf4e Mon Sep 17 00:00:00 2001 From: Furior Date: Tue, 11 Feb 2025 21:02:19 +0700 Subject: [PATCH 38/40] translate no wl message --- code/modules/admin/IsBanned.dm | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/code/modules/admin/IsBanned.dm b/code/modules/admin/IsBanned.dm index 7d5f407d8fccb..e457831aa0716 100644 --- a/code/modules/admin/IsBanned.dm +++ b/code/modules/admin/IsBanned.dm @@ -63,7 +63,7 @@ // addclientmessage(ckey,span_adminnotice("You have been allowed to bypass the whitelist")) // else log_access("Failed Login: [ckey] - Not on whitelist") - return list("reason"="whitelist", "desc" = "\nReason: You are not on the white list for this server") + return list("reason"="whitelist", "desc" = "\nПричина: Вас ([key]) нет в вайтлисте этого сервера. Приобрести доступ возможно у одного из стримеров Банды за баллы канала или записаться самостоятельно с помощью команды в дискорде, доступной сабам бусти, начиная со второго тира.") //Guest Checking if(!real_bans_only && !C && is_guest_key(key)) From 4b4e75c3bce183098d18561626e0398479cc58c1 Mon Sep 17 00:00:00 2001 From: "Mikhail G." Date: Thu, 13 Feb 2025 19:52:42 +0700 Subject: [PATCH 39/40] Update modular_bandastation/metaserver/code/discord_link.dm Co-authored-by: Gaxeer <44334376+Gaxeer@users.noreply.github.com> --- modular_bandastation/metaserver/code/discord_link.dm | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modular_bandastation/metaserver/code/discord_link.dm b/modular_bandastation/metaserver/code/discord_link.dm index 31d45d52b077b..09d2414958b90 100644 --- a/modular_bandastation/metaserver/code/discord_link.dm +++ b/modular_bandastation/metaserver/code/discord_link.dm @@ -40,7 +40,7 @@ var/list/data = json_decode(response.body) var/login_endpoint = "[CONFIG_GET(string/ss_central_url)]/oauth/login?token=[data]" - to_chat(player, boxed_message("Авторизуйтесь в открывшемся окне и ожидайте 30 секунд.
Если окно не открывается, можете открыть ссылку в браузере самостоятельно:
[login_endpoint].")) + to_chat(player, boxed_message("Авторизуйтесь в открывшемся окне и ожидайте 30 секунд.
Если окно не открывается, можете открыть ссылку в браузере самостоятельно:
Привязать дискорд..")) player << link(login_endpoint) SScentral.get_player_discord_async(player) addtimer(CALLBACK(SScentral, TYPE_PROC_REF(/datum/controller/subsystem/central, get_player_discord_async), player), 30 SECONDS) From 08a4f53be1326e1ec281060d453ae0eeebd4bf6a Mon Sep 17 00:00:00 2001 From: Furior Date: Thu, 13 Feb 2025 19:54:45 +0700 Subject: [PATCH 40/40] im tired --- modular_bandastation/metaserver/code/ss_central.dm | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/modular_bandastation/metaserver/code/ss_central.dm b/modular_bandastation/metaserver/code/ss_central.dm index 585ae7a224183..31da138dc8408 100644 --- a/modular_bandastation/metaserver/code/ss_central.dm +++ b/modular_bandastation/metaserver/code/ss_central.dm @@ -79,7 +79,8 @@ SUBSYSTEM_DEF(central) /// WARNING: only semi async - UNTIL based /datum/controller/subsystem/central/proc/is_player_whitelisted(ckey) - . = (ckey in GLOB.whitelist) + if(ckey in GLOB.whitelist) + return TRUE var/endpoint = "[CONFIG_GET(string/ss_central_url)]/whitelists?wl_type=[CONFIG_GET(string/whitelist_type)]&ckey=[ckey]&page=1&page_size=1" var/datum/http_response/response = SShttp.make_sync_request(RUSTG_HTTP_METHOD_GET, endpoint, "", list())