Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Wip: SS Central - whitelist, discord link #946

Open
wants to merge 40 commits into
base: master
Choose a base branch
from
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
40 commits
Select commit Hold shift + click to select a range
a512e53
wip ss central: wl and discord link
Furrior Dec 31, 2024
8713643
sshttp "improvement"
Furrior Jan 1, 2025
c537115
wip wl
Furrior Jan 1, 2025
c9191b7
typos
Furrior Jan 1, 2025
73b26b3
giving wl from interview
Furrior Jan 1, 2025
9bd06bd
nuke the old system
Furrior Jan 1, 2025
a50221f
Update modular_bandastation/tts/code/SSHttp.dm
Furrior Jan 1, 2025
91ef632
fixes
Furrior Jan 1, 2025
63508e8
Merge remote-tracking branch 'fur/sscentral' into sscentral
Furrior Jan 1, 2025
e211807
comments in config
Furrior Jan 1, 2025
0c05486
missed log
Furrior Jan 1, 2025
d3c84a6
typo
Furrior Jan 1, 2025
a6c86b4
or
Furrior Jan 1, 2025
06a1f85
Update modular_bandastation/metaserver/code/admin.dm
Furrior Jan 1, 2025
f98a847
various fixes
Furrior Jan 3, 2025
15afadf
atually include admin.dm
Furrior Jan 4, 2025
bc2bc96
rename discord link verb
Furrior Jan 4, 2025
c4bb628
admin.dm fixes
Furrior Jan 4, 2025
73411b9
better check for duration days
Furrior Jan 4, 2025
0188fe9
status code bandaid
Furrior Jan 4, 2025
bfba3c1
ah yes
Furrior Jan 4, 2025
be20bbc
update?
Furrior Feb 1, 2025
304f0fe
Merge remote-tracking branch 'origin/master' into sscentral
Furrior Feb 1, 2025
df71569
typo
Furrior Feb 1, 2025
b342c7e
fuck it
Furrior Feb 1, 2025
b31657e
fix tests
Furrior Feb 6, 2025
4589bab
its working I guess
Furrior Feb 7, 2025
a5e9cb6
config
Furrior Feb 7, 2025
cb5293a
bb
Furrior Feb 7, 2025
33ea3a7
central update
Furrior Feb 10, 2025
5a9575b
Update modular_bandastation/tts/code/SSHttp.dm
Furrior Feb 10, 2025
1b84f1c
req rename
Furrior Feb 10, 2025
255fe2f
admins need wl too
Furrior Feb 11, 2025
82dc99b
fiiiiiine
Furrior Feb 11, 2025
a37d5a7
wl double check
Furrior Feb 11, 2025
44af0ea
translations
Furrior Feb 11, 2025
d9d5d58
fixes
Furrior Feb 11, 2025
8dc5d27
stat entry
Furrior Feb 11, 2025
9ab24bc
typo
Furrior Feb 11, 2025
a24946b
translate no wl message
Furrior Feb 11, 2025
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
19 changes: 10 additions & 9 deletions code/modules/admin/IsBanned.dm
Original file line number Diff line number Diff line change
Expand Up @@ -53,16 +53,17 @@
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))
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")
// 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" = "\nПричина: Вас ([key]) нет в вайтлисте этого сервера. Приобрести доступ возможно у одного из стримеров Банды за баллы канала или записаться самостоятельно с помощью команды в дискорде, доступной сабам бусти, начиная со второго тира.")

//Guest Checking
if(!real_bans_only && !C && is_guest_key(key))
Expand Down
10 changes: 5 additions & 5 deletions code/modules/admin/whitelist.dm
Original file line number Diff line number Diff line change
Expand Up @@ -11,12 +11,12 @@ 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
. = (ckey in GLOB.whitelist)
// BANDASTATION EDIT - SSCentral
return SScentral.is_player_whitelisted(ckey)

#undef WHITELISTFILE
12 changes: 10 additions & 2 deletions config/bandastation/bandastation_config.txt
Original file line number Diff line number Diff line change
Expand Up @@ -4,13 +4,21 @@
#TTS_CACHE_ENABLED
#TTS_API_URL_SILERO

#WHITELIST220
## SS Central
Furrior marked this conversation as resolved.
Show resolved Hide resolved
#SS_CENTRAL_URL http://127.0.0.1:8000
#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
## 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
Expand Down Expand Up @@ -48,4 +56,4 @@ ROUNDSTART_RACES vulpkanin
# SPEECH_FILTER_BYPASS ckey

## Boolean value to derminate is it posible to die permanently due death of brain or not (value true means it's enabled)
BRAIN_PERMANENT_DEATH
BRAIN_PERMANENT_DEATH
4 changes: 2 additions & 2 deletions modular_bandastation/discord/_discord.dm
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
/datum/modpack/links_change
name = "Привязка Дискорда."
desc = "Добавление привязки Дискорда."
name = "Дискорд."
desc = "Ссылка на дискорд."
author = "KOJIT2009"
40 changes: 0 additions & 40 deletions modular_bandastation/discord/code/discord.dm
Original file line number Diff line number Diff line change
@@ -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 = "Вы уже сгенерировали токен <br/> [cached_one_time_token] <br/> В канале дом-бота используйте команду <br/> <span class='warning'>[prefix]привязать</span>"


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 = "В канале дом-бота используйте команду <br/> <span class='warning'>[prefix]привязать</span> и введите туда свой токен <br/> [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("<span>[message]</span>")
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"
Expand Down
61 changes: 8 additions & 53 deletions modular_bandastation/loadout/code/client.dm
Original file line number Diff line number Diff line change
@@ -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
4 changes: 4 additions & 0 deletions modular_bandastation/metaserver/_metaserver.dm
Original file line number Diff line number Diff line change
@@ -0,0 +1,4 @@
/datum/modpack/metaserver
name = "Metaserver"
desc = "Общая инфраструктура для серверов"
author = "furior, larentoun"
7 changes: 7 additions & 0 deletions modular_bandastation/metaserver/_metaserver.dme
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
#include "_metaserver.dm"

#include "code/admin.dm"
#include "code/discord_link.dm"
#include "code/donate.dm"
#include "code/interview.dm"
#include "code/ss_central.dm"
16 changes: 16 additions & 0 deletions modular_bandastation/metaserver/code/admin.dm
Gaxeer marked this conversation as resolved.
Show resolved Hide resolved
Original file line number Diff line number Diff line change
@@ -0,0 +1,16 @@
ADMIN_VERB(wl_ban, R_BAN, "WL Ban", "Выписать игрока из вайтлиста.", ADMIN_CATEGORY_MAIN)
BLACKBOX_LOG_ADMIN_VERB("WL Ban")
var/banned_ckey = input(user, "Укажите ckey игрока для выписки.", "Выписка", "") as text|null
banned_ckey = ckey(banned_ckey)
if(!banned_ckey)
return
var/duration_days = input(user, "Укажите длительность выписки в днях.", "Длительность", "") as num|null
if(isnull(duration_days) || duration_days < 0)
return

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_ckey] из вайтлиста на [duration_days] дней с причиной: [reason]")
46 changes: 46 additions & 0 deletions modular_bandastation/metaserver/code/discord_link.dm
Original file line number Diff line number Diff line change
@@ -0,0 +1,46 @@
/datum/preferences
var/discord_id

/client/New()
. = ..()
SScentral.get_player_discord_async(src)

/mob/dead/new_player/register_for_interview()
. = ..()
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"

if(!SScentral.initialized)
to_chat(src, span_warning("Привязка Discord сейчас недоступна."))
return

if(SScentral.is_player_discord_linked(src))
to_chat(src, span_warning("Вы уже привязали свою учетную запись Discord."))
return

to_chat(src, span_notice("Пытаемся получить токен для входа в Discord..."))
SScentral.verify_in_discord(src)

/datum/controller/subsystem/central/proc/verify_in_discord(client/player)
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)]"
)
SShttp.create_async_request(RUSTG_HTTP_METHOD_POST, endpoint, "", headers, CALLBACK(SScentral, PROC_REF(verify_in_discord_callback), player))

/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] - [response.error]")
return

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 секунд.<br/>Если окно не открывается, можете открыть ссылку в браузере самостоятельно:<br/><a href='[login_endpoint]'>[login_endpoint]</a>."))
Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Suggested change
to_chat(player, boxed_message("Авторизуйтесь в открывшемся окне и ожидайте 30 секунд.<br/>Если окно не открывается, можете открыть ссылку в браузере самостоятельно:<br/><a href='[login_endpoint]'>[login_endpoint]</a>."))
to_chat(player, boxed_message("Авторизуйтесь в открывшемся окне и ожидайте 30 секунд.<br/>Если окно не открывается, можете открыть ссылку в браузере самостоятельно:<br/><a href='[login_endpoint]'>Привязать дискорд.</a>."))

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)
3 changes: 3 additions & 0 deletions modular_bandastation/metaserver/code/donate.dm
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
/client/New()
. = ..()
SScentral.update_player_donate_tier_async(src)
57 changes: 57 additions & 0 deletions modular_bandastation/metaserver/code/interview.dm
Original file line number Diff line number Diff line change
@@ -0,0 +1,57 @@
/// 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(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)
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)] попытался безуспешно принять интервью [key_name(owner)]. Причина: Дискорд игрока не привязан.")
return
. = ..()
add_owner_to_whitelist(approved_by)
send_interview_webhook(src, "[approved_by.ckey] принял:")

/datum/interview_manager/enqueue(datum/interview/to_queue)
. = ..()
send_interview_webhook(to_queue, "Новое интервью в очереди:")

/datum/interview/deny(client/denied_by)
. = ..()
send_interview_webhook(src, "[denied_by.ckey] отказал:")

/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)
SScentral.add_to_whitelist(owner_ckey, added_by.ckey, 365)
Loading
Loading