mirror of
https://github.com/Bubberstation/Bubberstation.git
synced 2026-08-30 00:29:02 +01:00
[MIRROR] Interview System / Soft Panic Bunker (#1458)
* Interview System / Soft Panic Bunker * a Co-authored-by: Bobbahbrown <bobbahbrown@gmail.com> Co-authored-by: Azarak <azarak10@gmail.com>
This commit is contained in:
co-authored by
Bobbahbrown
Azarak
parent
6c58c5bad7
commit
91773c46da
@@ -0,0 +1,162 @@
|
||||
/// State when an interview has been approved
|
||||
#define INTERVIEW_APPROVED "interview_approved"
|
||||
/// State when an interview as been denied
|
||||
#define INTERVIEW_DENIED "interview_denied"
|
||||
/// State when an interview has had no action on it yet
|
||||
#define INTERVIEW_PENDING "interview_pending"
|
||||
|
||||
/**
|
||||
* Represents a new-player interview form
|
||||
*
|
||||
* Represents a new-player interview form, enabled by configuration to require
|
||||
* players with low playtime to request access to the server. To do so, they will
|
||||
* out a brief questionnaire, and are otherwise unable to do anything while they
|
||||
* wait for a response.
|
||||
*/
|
||||
/datum/interview
|
||||
/// Unique ID of the interview
|
||||
var/id
|
||||
/// Atomic ID for incrementing unique IDs
|
||||
var/static/atomic_id = 0
|
||||
/// The /client who owns this interview, the intiator
|
||||
var/client/owner
|
||||
/// The Ckey of the owner, used for when a client could disconnect
|
||||
var/owner_ckey
|
||||
/// The welcome message shown at the top of the interview panel
|
||||
var/welcome_message
|
||||
/// The questions to display on the questionnaire of the interview
|
||||
var/list/questions
|
||||
/// The stored responses, will be filled as the questionnaire is answered
|
||||
var/list/responses = list()
|
||||
/// Boolean operator controlling if the questionnaire's contents can be edited
|
||||
var/read_only = FALSE
|
||||
/// Integer that contains the current position in the interview queue, used for rendering
|
||||
var/pos_in_queue
|
||||
/// Contains the state of the form, used for rendering and sanity checking
|
||||
var/status = INTERVIEW_PENDING
|
||||
|
||||
/datum/interview/New(client/interviewee)
|
||||
if(!interviewee)
|
||||
qdel(src)
|
||||
return
|
||||
id = ++atomic_id
|
||||
owner = interviewee
|
||||
owner_ckey = owner.ckey
|
||||
questions = CONFIG_GET(str_list/interview_questions)
|
||||
responses.len = questions.len
|
||||
welcome_message = CONFIG_GET(string/interview_welcome_msg)
|
||||
|
||||
/**
|
||||
* Approves the interview, forces reconnect of owner if relevant.
|
||||
*
|
||||
* Approves the interview, and if relevant will force the owner to reconnect so that they have the proper
|
||||
* verbs returned to them.
|
||||
* Arguments:
|
||||
* * approved_by - The user who approved the interview, used for logging
|
||||
*/
|
||||
/datum/interview/proc/approve(client/approved_by)
|
||||
status = INTERVIEW_APPROVED
|
||||
read_only = TRUE
|
||||
GLOB.interviews.approved_ckeys |= owner_ckey
|
||||
GLOB.interviews.close_interview(src)
|
||||
log_admin_private("[key_name(approved_by)] has approved interview #[id] for [owner_ckey][!owner ? "(DC)": ""].")
|
||||
message_admins("<span class='adminnotice'>[key_name(approved_by)] has approved interview #[id] for [owner_ckey][!owner ? "(DC)": ""].</span>")
|
||||
if (owner)
|
||||
SEND_SOUND(owner, sound('sound/effects/adminhelp.ogg'))
|
||||
to_chat(owner, "<font color='red' size='4'><b>-- Interview Update --</b></font>" \
|
||||
+ "\n<span class='adminsay'>Your interview was approved, you will now be reconnected in 5 seconds.</span>", confidential = TRUE)
|
||||
addtimer(CALLBACK(src, .proc/reconnect_owner), 50)
|
||||
|
||||
/**
|
||||
* Denies the interview and adds the owner to the cooldown for new interviews.
|
||||
*
|
||||
* Arguments:
|
||||
* * denied_by - The user who denied the interview, used for logging
|
||||
*/
|
||||
/datum/interview/proc/deny(client/denied_by)
|
||||
status = INTERVIEW_DENIED
|
||||
read_only = TRUE
|
||||
GLOB.interviews.close_interview(src)
|
||||
GLOB.interviews.cooldown_ckeys |= owner_ckey
|
||||
log_admin_private("[key_name(denied_by)] has denied interview #[id] for [owner_ckey][!owner ? "(DC)": ""].")
|
||||
message_admins("<span class='adminnotice'>[key_name(denied_by)] has denied interview #[id] for [owner_ckey][!owner ? "(DC)": ""].</span>")
|
||||
addtimer(CALLBACK(GLOB.interviews, /datum/interview_manager.proc/release_from_cooldown, owner_ckey), 180)
|
||||
if (owner)
|
||||
SEND_SOUND(owner, sound('sound/effects/adminhelp.ogg'))
|
||||
to_chat(owner, "<font color='red' size='4'><b>-- Interview Update --</b></font>" \
|
||||
+ "\n<span class='adminsay'>Unfortunately your interview was denied. Please try submitting another questionnaire." \
|
||||
+ " You may do this in three minutes.</span>", confidential = TRUE)
|
||||
|
||||
/**
|
||||
* Forces client to reconnect, used in the callback from approval
|
||||
*/
|
||||
/datum/interview/proc/reconnect_owner()
|
||||
if (!owner)
|
||||
return
|
||||
winset(owner, null, "command=.reconnect")
|
||||
|
||||
/**
|
||||
* Verb for opening the existing interview, or if relevant creating a new interview if possible.
|
||||
*/
|
||||
/mob/dead/new_player/proc/open_interview()
|
||||
set name = "Open Interview"
|
||||
set category = "Interview"
|
||||
var/mob/dead/new_player/M = usr
|
||||
if (M?.client?.interviewee)
|
||||
var/datum/interview/I = GLOB.interviews.interview_for_client(M.client)
|
||||
if (I) // we can be returned nothing if the user is on cooldown
|
||||
I.ui_interact(M)
|
||||
else
|
||||
to_chat(usr, "<span class='adminsay'>You are on cooldown for interviews. Please" \
|
||||
+ " wait at least 3 minutes before starting a new questionnaire.</span>", confidential = TRUE)
|
||||
|
||||
/datum/interview/ui_interact(mob/user, datum/tgui/ui = null)
|
||||
ui = SStgui.try_update_ui(user, src, ui)
|
||||
if (!ui)
|
||||
ui = new(user, src, "Interview")
|
||||
ui.open()
|
||||
|
||||
/datum/interview/ui_state(mob/user)
|
||||
return GLOB.new_player_state
|
||||
|
||||
/datum/interview/ui_act(action, list/params, datum/tgui/ui, datum/ui_state/state)
|
||||
if (..())
|
||||
return
|
||||
switch(action)
|
||||
if ("update_answer")
|
||||
if (!read_only)
|
||||
responses[text2num(params["qidx"])] = copytext_char(params["answer"], 1, 501) // byond indexing moment
|
||||
. = TRUE
|
||||
if ("submit")
|
||||
if (!read_only)
|
||||
read_only = TRUE
|
||||
GLOB.interviews.enqueue(src)
|
||||
. = TRUE
|
||||
if ("approve")
|
||||
if (usr.client?.holder && status == INTERVIEW_PENDING)
|
||||
src.approve(usr)
|
||||
. = TRUE
|
||||
if ("deny")
|
||||
if (usr.client?.holder && status == INTERVIEW_PENDING)
|
||||
src.deny(usr)
|
||||
. = TRUE
|
||||
if ("adminpm")
|
||||
if (usr.client?.holder && owner)
|
||||
usr.client.cmd_admin_pm(owner, null)
|
||||
|
||||
/datum/interview/ui_data(mob/user)
|
||||
. = list(
|
||||
"welcome_message" = welcome_message,
|
||||
"questions" = list(),
|
||||
"read_only" = read_only,
|
||||
"queue_pos" = pos_in_queue,
|
||||
"is_admin" = !!(user?.client && user.client.holder),
|
||||
"status" = status,
|
||||
"connected" = !!owner)
|
||||
for (var/i in 1 to questions.len)
|
||||
var/list/data = list(
|
||||
"qidx" = i,
|
||||
"question" = questions[i],
|
||||
"response" = responses.len < i ? null : responses[i]
|
||||
)
|
||||
.["questions"] += list(data)
|
||||
Reference in New Issue
Block a user