From de722119aae767a9d3eb358c43fa3e9b2f85eb99 Mon Sep 17 00:00:00 2001
From: nevimer <77420409+nevimer@users.noreply.github.com>
Date: Thu, 19 Oct 2023 19:55:08 -0400
Subject: [PATCH] Vetted Player Locks (#601)
## About The Pull Request
This PR makes it so that players who are vetted receive a message on
inspect in game, as to indicate their status within the player vetting
system. Staff in game will also be able to know who is and isn't.



Mechanical Organic Interface Activity is also locked behind being vetted
now.
## Why It's Good For The Game
Ambiguity is bad in this case, so this adds incentive on both sides to
get vetted.
## Changelog
:cl:
add: Added new player ranks for being vetted.
code: Organic Interface is now locked behind being vetted.
/:cl:
---
code/modules/admin/verbs/admingame.dm | 5 +-
.../client/preferences/middleware/jobs.dm | 4 ++
config/bubbers/vetted_players.txt | 0
.../client/preferences/erp_preferences.dm | 6 ++-
.../code/subsystem/player_ranks.dm | 6 +--
modular_zubbers/modules/vetted/examine.dm | 9 ++++
modular_zubbers/modules/vetted/vetted.dm | 53 +++++++++++++++++++
tgstation.dme | 2 +
.../tgui/interfaces/PreferencesMenu/data.ts | 2 +-
9 files changed, 80 insertions(+), 7 deletions(-)
create mode 100644 config/bubbers/vetted_players.txt
create mode 100644 modular_zubbers/modules/vetted/examine.dm
create mode 100644 modular_zubbers/modules/vetted/vetted.dm
diff --git a/code/modules/admin/verbs/admingame.dm b/code/modules/admin/verbs/admingame.dm
index 317c8fafd3b..546225c8f85 100644
--- a/code/modules/admin/verbs/admingame.dm
+++ b/code/modules/admin/verbs/admingame.dm
@@ -43,7 +43,10 @@
if(SSplayer_ranks.is_veteran(M.client, admin_bypass = FALSE))
player_ranks += "Veteran"
-
+ //BUBBER ADDITION START
+ if(SSplayer_ranks.is_vetted(M.client, admin_bypass = FALSE))
+ player_ranks |= "Vetted"
+ // BUBBER ADDITION END
body += "
Player Ranks: [length(player_ranks) ? player_ranks.Join(", ") : "None"]"
// SKYRAT EDIT END
body += "
CentCom Galactic Ban DB: "
diff --git a/code/modules/client/preferences/middleware/jobs.dm b/code/modules/client/preferences/middleware/jobs.dm
index d61fb53c98f..319547e0d3c 100644
--- a/code/modules/client/preferences/middleware/jobs.dm
+++ b/code/modules/client/preferences/middleware/jobs.dm
@@ -102,6 +102,10 @@
if(SSplayer_ranks.is_veteran(user.client))
data["is_veteran"] = TRUE
// SKYRAT EDIT END
+ // BUBBER EDIT BEGIN
+ if(SSplayer_ranks.is_vetted(user.client))
+ data["is_vetted"] = TRUE
+ // BUBBER EDIT END
var/list/required_job_playtime = get_required_job_playtime(user)
if (!isnull(required_job_playtime))
data += required_job_playtime
diff --git a/config/bubbers/vetted_players.txt b/config/bubbers/vetted_players.txt
new file mode 100644
index 00000000000..e69de29bb2d
diff --git a/modular_skyrat/master_files/code/modules/client/preferences/erp_preferences.dm b/modular_skyrat/master_files/code/modules/client/preferences/erp_preferences.dm
index 2c4ffb82713..b04900ec2ef 100644
--- a/modular_skyrat/master_files/code/modules/client/preferences/erp_preferences.dm
+++ b/modular_skyrat/master_files/code/modules/client/preferences/erp_preferences.dm
@@ -20,7 +20,8 @@
/datum/preference/toggle/master_erp_preferences/is_accessible(datum/preferences/preferences)
if (!..(preferences))
return FALSE
-
+ if(!SSplayer_ranks.is_vetted(preferences.parent, admin_bypass = FALSE)) // BUBBER EDIT
+ return FALSE // BUBBER EDIT
if(CONFIG_GET(flag/disable_erp_preferences))
return FALSE
@@ -40,7 +41,8 @@
/datum/preference/toggle/erp/is_accessible(datum/preferences/preferences)
if (!..(preferences))
return FALSE
-
+ if(!SSplayer_ranks.is_vetted(preferences.parent, admin_bypass = FALSE)) // BUBBER EDIT
+ return FALSE // BUBBER EDIT
if(CONFIG_GET(flag/disable_erp_preferences))
return FALSE
diff --git a/modular_skyrat/modules/player_ranks/code/subsystem/player_ranks.dm b/modular_skyrat/modules/player_ranks/code/subsystem/player_ranks.dm
index 2b11cabb8b0..04130e93b7a 100644
--- a/modular_skyrat/modules/player_ranks/code/subsystem/player_ranks.dm
+++ b/modular_skyrat/modules/player_ranks/code/subsystem/player_ranks.dm
@@ -20,7 +20,7 @@ SUBSYSTEM_DEF(player_ranks)
var/datum/player_rank_controller/mentor/mentor_controller
/// The veteran player rank controller.
var/datum/player_rank_controller/veteran/veteran_controller
-
+ var/datum/player_rank_controller/vetted/vetted_controller // BUBBER EDIT ADDITION
/datum/controller/subsystem/player_ranks/Initialize()
if(IsAdminAdvancedProcCall())
@@ -29,7 +29,7 @@ SUBSYSTEM_DEF(player_ranks)
load_donators()
load_mentors()
load_veterans()
-
+ load_vetted_ckeys() // BUBBER EDIT ADDITION
return SS_INIT_SUCCESS
@@ -39,7 +39,7 @@ SUBSYSTEM_DEF(player_ranks)
QDEL_NULL(donator_controller)
QDEL_NULL(mentor_controller)
QDEL_NULL(veteran_controller)
-
+ QDEL_NULL(vetted_controller) // BUBBER EDIT ADDITION
/**
* Returns whether or not the user is qualified as a donator.
diff --git a/modular_zubbers/modules/vetted/examine.dm b/modular_zubbers/modules/vetted/examine.dm
new file mode 100644
index 00000000000..de2b450ccf4
--- /dev/null
+++ b/modular_zubbers/modules/vetted/examine.dm
@@ -0,0 +1,9 @@
+/mob/living/silicon/get_silicon_flavortext()
+ . = ..()
+ if(client && SSplayer_ranks.is_vetted(client, admin_bypass = FALSE))
+ . += span_greenannounce("This player has been vetted by staff.")
+
+/mob/living/carbon/human/examine(mob/user)
+ . = ..()
+ if(client && SSplayer_ranks.is_vetted(client, admin_bypass = FALSE))
+ . += span_greenannounce("This player has been vetted by staff.")
diff --git a/modular_zubbers/modules/vetted/vetted.dm b/modular_zubbers/modules/vetted/vetted.dm
new file mode 100644
index 00000000000..1682e818300
--- /dev/null
+++ b/modular_zubbers/modules/vetted/vetted.dm
@@ -0,0 +1,53 @@
+GLOBAL_LIST_EMPTY(vetted_list)
+GLOBAL_PROTECT(vetted_list)
+
+/datum/controller/subsystem/player_ranks
+
+/datum/player_rank_controller/vetted
+ rank_title = "vetted user"
+ var/file_path_vetted
+/datum/controller/subsystem/player_ranks/proc/is_vetted(client/user, admin_bypass = TRUE)
+ if(!istype(user))
+ CRASH("Invalid user type provided to is_vetted(), expected 'client' and obtained '[user ? user.type : "null"]'.")
+
+ if(GLOB.vetted_list[user.ckey])
+ return TRUE
+
+ if(admin_bypass && is_admin(user))
+ return TRUE
+
+ return FALSE
+
+
+/datum/controller/subsystem/player_ranks/proc/load_vetted_ckeys()
+ PROTECTED_PROC(TRUE)
+
+ if(IsAdminAdvancedProcCall())
+ return
+
+ vetted_controller = new
+ vetted_controller.file_path_vetted = "[global.config.directory]/bubbers/vetted_players.txt"
+ for(var/line in world.file2list(vetted_controller.file_path_vetted))
+ if(!line)
+ continue
+
+ if(findtextEx(line, "#", 1, 2))
+ continue
+
+ vetted_controller.add_player(line)
+
+ return TRUE
+
+/datum/player_rank_controller/vetted/add_player(ckey)
+ if(IsAdminAdvancedProcCall())
+ return
+
+ ckey = ckey(ckey)
+
+ GLOB.vetted_list[ckey] = TRUE
+
+/datum/player_rank_controller/vetted/remove_player(ckey)
+ if(IsAdminAdvancedProcCall())
+ return
+
+ GLOB.vetted_list -= ckey
diff --git a/tgstation.dme b/tgstation.dme
index dab890a999e..8673f5ed003 100644
--- a/tgstation.dme
+++ b/tgstation.dme
@@ -7882,4 +7882,6 @@
#include "modular_zubbers\modules\customization\modules\mob\dead\new_player\sprite_accessories\skrell_hair.dm"
#include "modular_zubbers\modules\customization\modules\mob\living\carbon\human\species\akula.dm"
#include "modular_zubbers\modules\emotes\code\emotes.dm"
+#include "modular_zubbers\modules\vetted\examine.dm"
+#include "modular_zubbers\modules\vetted\vetted.dm"
// END_INCLUDE
diff --git a/tgui/packages/tgui/interfaces/PreferencesMenu/data.ts b/tgui/packages/tgui/interfaces/PreferencesMenu/data.ts
index d1213517b6c..7c841fdfbe5 100644
--- a/tgui/packages/tgui/interfaces/PreferencesMenu/data.ts
+++ b/tgui/packages/tgui/interfaces/PreferencesMenu/data.ts
@@ -176,7 +176,7 @@ export type PreferencesMenuData = {
preview_selection: string; // SKYRAT EDIT ADDITION
is_veteran: BooleanLike; // SKYRAT EDIT - Veteran status
-
+ is_vetted: BooleanLike; // BUBBER EDIT - Vetted Users
character_preferences: {
clothing: Record;
features: Record;