diff --git a/code/__DEFINES/preferences.dm b/code/__DEFINES/preferences.dm index aef77e7b57..cd13510366 100644 --- a/code/__DEFINES/preferences.dm +++ b/code/__DEFINES/preferences.dm @@ -78,7 +78,9 @@ #define EXP_TYPE_ADMIN "Admin" //Flags in the players table in the db -#define DB_FLAG_EXEMPT 1 +#define DB_FLAG_EXEMPT (1<<0) +#define DB_FLAG_AGE_CONFIRMATION_INCOMPLETE (1<<1) +#define DB_FLAG_AGE_CONFIRMATION_COMPLETE (1<<2) #define DEFAULT_CYBORG_NAME "Default Cyborg Name" diff --git a/code/controllers/configuration/entries/general.dm b/code/controllers/configuration/entries/general.dm index 48b159baa1..90ec3bc289 100644 --- a/code/controllers/configuration/entries/general.dm +++ b/code/controllers/configuration/entries/general.dm @@ -327,6 +327,9 @@ /datum/config_entry/number/notify_new_player_account_age // how long do we notify admins of a new byond account min_val = 0 +/datum/config_entry/flag/age_verification //are we using the automated age verification which asks users if they're 18+? + config_entry_value = TRUE + /datum/config_entry/flag/irc_first_connection_alert // do we notify the irc channel when somebody is connecting for the first time? /datum/config_entry/flag/check_randomizer diff --git a/code/modules/client/client_procs.dm b/code/modules/client/client_procs.dm index 7d33a87111..d4d0a48ce1 100644 --- a/code/modules/client/client_procs.dm +++ b/code/modules/client/client_procs.dm @@ -268,7 +268,7 @@ GLOBAL_LIST_INIT(blacklisted_builds, list( else prefs = new /datum/preferences(src) GLOB.preferences_datums[ckey] = prefs - + addtimer(CALLBACK(src, .proc/ensure_keys_set), 10) //prevents possible race conditions prefs.last_ip = address //these are gonna be used for banning @@ -561,36 +561,49 @@ GLOBAL_LIST_INIT(blacklisted_builds, list( if(!query_client_in_db.Execute()) qdel(query_client_in_db) return - if(!query_client_in_db.NextRow()) - if (CONFIG_GET(flag/panic_bunker) && !holder && !GLOB.deadmins[ckey] && !(ckey in GLOB.bunker_passthrough)) - log_access("Failed Login: [key] - New account attempting to connect during panic bunker") - message_admins("Failed Login: [key] - New account attempting to connect during panic bunker") - to_chat(src, "You must first join the Discord to verify your account before joining this server.
To do so, read the rules and post a request in the #station-access-requests channel under the \"Main server\" category in the Discord server linked here: https://discord.gg/E6SQuhz
If you have already done so, wait a few minutes then try again; sometimes the server needs to fully load before you can join.
") //CIT CHANGE - makes the panic bunker disconnect message point to the discord - var/list/connectiontopic_a = params2list(connectiontopic) - var/list/panic_addr = CONFIG_GET(string/panic_server_address) - if(panic_addr && !connectiontopic_a["redirect"]) - var/panic_name = CONFIG_GET(string/panic_server_name) - to_chat(src, "Sending you to [panic_name ? panic_name : panic_addr].") - winset(src, null, "command=.options") - src << link("[panic_addr]?redirect=1") - qdel(query_client_in_db) - qdel(src) - return + if(!query_client_in_db.NextRow()) //new user detected + if(!holder && !GLOB.deadmins[ckey]) + if(CONFIG_GET(flag/panic_bunker) && !(ckey in GLOB.bunker_passthrough)) + log_access("Failed Login: [key] - New account attempting to connect during panic bunker") + message_admins("Failed Login: [key] - New account attempting to connect during panic bunker") + to_chat(src, "You must first join the Discord to verify your account before joining this server.
To do so, read the rules and post a request in the #station-access-requests channel under the \"Main server\" category in the Discord server linked here: https://discord.gg/E6SQuhz
If you have already done so, wait a few minutes then try again; sometimes the server needs to fully load before you can join.
") //CIT CHANGE - makes the panic bunker disconnect message point to the discord + var/list/connectiontopic_a = params2list(connectiontopic) + var/list/panic_addr = CONFIG_GET(string/panic_server_address) + if(panic_addr && !connectiontopic_a["redirect"]) + var/panic_name = CONFIG_GET(string/panic_server_name) + to_chat(src, "Sending you to [panic_name ? panic_name : panic_addr].") + winset(src, null, "command=.options") + src << link("[panic_addr]?redirect=1") + qdel(query_client_in_db) + qdel(src) + return - new_player = 1 - account_join_date = sanitizeSQL(findJoinDate()) - var/sql_key = sanitizeSQL(key) - var/datum/DBQuery/query_add_player = SSdbcore.NewQuery("INSERT INTO [format_table_name("player")] (`ckey`, `byond_key`, `firstseen`, `firstseen_round_id`, `lastseen`, `lastseen_round_id`, `ip`, `computerid`, `lastadminrank`, `accountjoindate`) VALUES ('[sql_ckey]', '[sql_key]', Now(), '[GLOB.round_id]', Now(), '[GLOB.round_id]', INET_ATON('[sql_ip]'), '[sql_computerid]', '[sql_admin_rank]', [account_join_date ? "'[account_join_date]'" : "NULL"])") - if(!query_add_player.Execute()) - qdel(query_client_in_db) + new_player = 1 + account_join_date = sanitizeSQL(findJoinDate()) + var/sql_key = sanitizeSQL(key) + var/datum/DBQuery/query_add_player = SSdbcore.NewQuery("INSERT INTO [format_table_name("player")] (`ckey`, `byond_key`, `firstseen`, `firstseen_round_id`, `lastseen`, `lastseen_round_id`, `ip`, `computerid`, `lastadminrank`, `accountjoindate`) VALUES ('[sql_ckey]', '[sql_key]', Now(), '[GLOB.round_id]', Now(), '[GLOB.round_id]', INET_ATON('[sql_ip]'), '[sql_computerid]', '[sql_admin_rank]', [account_join_date ? "'[account_join_date]'" : "NULL"])") + if(!query_add_player.Execute()) + qdel(query_client_in_db) + qdel(query_add_player) + return qdel(query_add_player) - return - qdel(query_add_player) - if(!account_join_date) - account_join_date = "Error" - account_age = -1 - else if(ckey in GLOB.bunker_passthrough) - GLOB.bunker_passthrough -= ckey + if(!account_join_date) + account_join_date = "Error" + account_age = -1 + else if(ckey in GLOB.bunker_passthrough) + GLOB.bunker_passthrough -= ckey + if(CONFIG_GET(flag/age_verification)) //setup age verification + if(!C.set_db_player_flags()) + message_admins(usr, "ERROR: Unable to read player flags from database. Please check logs.") + return + else + var/dbflags = C.prefs.db_flags + if(!(dbflags & DB_FLAG_AGE_CONFIRMATION_COMPLETE)) //they have not completed age verification + if((ckey in GLOB.bunker_passthrough)) //they're verified in the panic bunker though + C.update_flag_db(DB_FLAG_AGE_CONFIRMATION_COMPLETE, TRUE) + else + C.update_flag_db(DB_FLAG_AGE_CONFIRMATION_INCOMPLETE, TRUE) + qdel(query_client_in_db) var/datum/DBQuery/query_get_client_age = SSdbcore.NewQuery("SELECT firstseen, DATEDIFF(Now(),firstseen), accountjoindate, DATEDIFF(Now(),accountjoindate) FROM [format_table_name("player")] WHERE ckey = '[sql_ckey]'") if(!query_get_client_age.Execute()) diff --git a/code/modules/mob/dead/new_player/new_player.dm b/code/modules/mob/dead/new_player/new_player.dm index 1fdf3102a9..e156f8904d 100644 --- a/code/modules/mob/dead/new_player/new_player.dm +++ b/code/modules/mob/dead/new_player/new_player.dm @@ -34,6 +34,26 @@ return /mob/dead/new_player/proc/new_player_panel() + //hold this until we know they passed age verification + if(CONFIG_GET(flag/age_verification)) //make sure they are verified + if(!C.set_db_player_flags()) + message_admins("Blocked [src] from new player panel because age verification could not access player database flags.") + return + else + var/dbflags = C.prefs.db_flags + if(dbflags & DB_FLAG_AGE_CONFIRMATION_INCOMPLETE) //they have not completed age verification + var/age_verification = alert(src, "You must be 18+ to enter this server. Please confirm your age.",, "I am 18+", "I am not 18+") + if(age_verification != "I am 18+") + create_message("note", ckey, "Server - Automated Age Verification", "Failed age verification.", null, null, TRUE, TRUE, null, "9999-01-01", "High") //log this occurence + qdel(client) //kick the user + else + //they claim to be of age, so allow them to continue and update their flags + client.update_flag_db(DB_FLAG_AGE_CONFIRMATION_COMPLETE, TRUE) + client.update_flag_db(DB_FLAG_AGE_CONFIRMATION_INCOMPLETE, FALSE) + //log this + message_admins("[ckey] has joined through the automated age verification process.") + + var/output = "

Welcome, [client ? client.prefs.real_name : "Unknown User"]

" output += "

Setup Character

" diff --git a/config/config.txt b/config/config.txt index 7e2ff5da41..5be76972ab 100644 --- a/config/config.txt +++ b/config/config.txt @@ -375,6 +375,9 @@ NOTIFY_NEW_PLAYER_ACCOUNT_AGE 1 ##Name of the place to send people rejected by the bunker #PANIC_SERVER_NAME [Put the name here] +##Automated age verification, comment this out to not ask new users if they are 18+ +AGE_VERIFICATION + ## Uncomment to have the changelog file automatically open when a user connects and hasn't seen the latest changelog #AGGRESSIVE_CHANGELOG