diff --git a/code/__DEFINES/ARES.dm b/code/__DEFINES/ARES.dm
index ec84a6ab5992..6b90aa0f02bb 100644
--- a/code/__DEFINES/ARES.dm
+++ b/code/__DEFINES/ARES.dm
@@ -53,6 +53,10 @@
#define TICKET_REJECTED "rejected"
/// Completed by WJs
#define TICKET_COMPLETED "completed"
+/// Granted Access Ticket
+#define TICKET_GRANTED "granted"
+/// Granted Access Ticket
+#define TICKET_REVOKED "revoked"
/// Checks for if buttons can be used, these may yet be removed and internalised to the UI programming
#define TICKET_OPEN "OPEN"
diff --git a/code/game/machinery/ARES/ARES.dm b/code/game/machinery/ARES/ARES.dm
index 08e9e0a39498..dc9e168f4705 100644
--- a/code/game/machinery/ARES/ARES.dm
+++ b/code/game/machinery/ARES/ARES.dm
@@ -205,11 +205,6 @@
var/list/login_list = list()
- /// If this is used to create AI Core access tickets
- var/ticket_console = FALSE
- var/ticket_authenticated = FALSE
- var/obj/item/card/id/target_id
-
/obj/structure/machinery/computer/working_joe/proc/link_systems(datum/ares_link/new_link = GLOB.ares_link, override)
if(link && !override)
return FALSE
@@ -233,42 +228,3 @@
/obj/structure/machinery/computer/working_joe/Destroy()
delink()
return ..()
-
-/obj/structure/machinery/computer/working_joe/verb/eject_id()
- set category = "Object"
- set name = "Eject ID Card"
- set src in oview(1)
-
- if(!usr || usr.stat || usr.lying)
- return FALSE
-
- if(target_id)
- target_id.loc = get_turf(src)
- if(!usr.get_active_hand() && istype(usr,/mob/living/carbon/human))
- usr.put_in_hands(target_id)
- else
- to_chat(usr, "You remove [target_id] from [src].")
- target_id = null
-
- else
- to_chat(usr, "There is nothing to remove from the console.")
- return
-
-/obj/structure/machinery/computer/working_joe/attackby(obj/object, mob/user)
- if(istype(object, /obj/item/card/id))
- if(!ticket_console)
- to_chat(user, SPAN_WARNING("This console doesn't have an ID port!"))
- return FALSE
- if(!operable())
- to_chat(user, SPAN_NOTICE("You try to insert [object] but [src] remains silent."))
- return FALSE
- if(!target_id)
- if(user.drop_held_item())
- object.forceMove(src)
- target_id = object
- return TRUE
- else
- to_chat(user, "ID modification slot is full. Please remove existing card first.")
- return FALSE
- else
- ..()
diff --git a/code/game/machinery/ARES/ARES_procs.dm b/code/game/machinery/ARES/ARES_procs.dm
index 682f25ec7202..9a2e0582e79d 100644
--- a/code/game/machinery/ARES/ARES_procs.dm
+++ b/code/game/machinery/ARES/ARES_procs.dm
@@ -32,6 +32,8 @@ GLOBAL_LIST_INIT(maintenance_categories, list(
/// Working Joe stuff
var/list/tickets_maintenance = list()
var/list/tickets_access = list()
+ var/list/waiting_ids = list()
+ var/list/active_ids = list()
/datum/ares_link/Destroy()
for(var/obj/structure/machinery/ares/link in linked_systems)
@@ -650,7 +652,6 @@ GLOBAL_LIST_INIT(maintenance_categories, list(
/obj/structure/machinery/computer/working_joe/ui_data(mob/user)
var/list/data = list()
- data["ticket_console"] = ticket_console
data["current_menu"] = current_menu
data["last_page"] = last_menu
@@ -668,8 +669,6 @@ GLOBAL_LIST_INIT(maintenance_categories, list(
data["apollo_log"] = list()
data["apollo_log"] += link.apollo_log
- data["authenticated"] = ticket_authenticated
-
var/list/logged_maintenance = list()
for(var/datum/ares_ticket/maintenance/maint_ticket as anything in link.tickets_maintenance)
if(!istype(maint_ticket))
@@ -698,7 +697,7 @@ GLOBAL_LIST_INIT(maintenance_categories, list(
for(var/datum/ares_ticket/access/access_ticket as anything in link.tickets_access)
var/lock_status = TICKET_OPEN
switch(access_ticket.ticket_status)
- if(TICKET_REJECTED, TICKET_CANCELLED, TICKET_COMPLETED)
+ if(TICKET_REJECTED, TICKET_CANCELLED, TICKET_REVOKED)
lock_status = TICKET_CLOSED
var/list/current_ticket = list()
@@ -718,19 +717,6 @@ GLOBAL_LIST_INIT(maintenance_categories, list(
requesting_access += access_ticket.ticket_name
data["access_tickets"] = logged_access
- data["can_update_id"] = "No"
-
- if(!target_id)
- data["id_tooltip"] = "Target ID card is missing!"
- else if(!(target_id.registered_name in requesting_access) && !(ACCESS_MARINE_AI_TEMP in target_id.access))
- data["id_tooltip"] = "No existing access ticket for '[target_id.registered_name]'"
- else
- data["can_update_id"] = "Yes"
- if(ACCESS_MARINE_AI_TEMP in target_id.access)
- data["id_tooltip"] = "Revoke core access."
- else
- data["id_tooltip"] = "Grant core access."
-
return data
/obj/structure/machinery/computer/working_joe/ui_static_data(mob/user)
@@ -895,6 +881,23 @@ GLOBAL_LIST_INIT(maintenance_categories, list(
return TRUE
if("new_access")
+ var/obj/item/card/id/idcard = operator.get_active_hand()
+ var/has_id = FALSE
+ if(istype(idcard))
+ has_id = TRUE
+ else if(operator.wear_id)
+ idcard = operator.wear_id
+ if(istype(idcard))
+ has_id = TRUE
+ if(!has_id)
+ to_chat(operator, SPAN_WARNING("You require an ID card to request an access ticket!"))
+ playsound(src, 'sound/machines/buzz-two.ogg', 15, 1)
+ return FALSE
+ if(idcard.registered_name != last_login)
+ to_chat(operator, SPAN_WARNING("This ID card does not match the active login!"))
+ playsound(src, 'sound/machines/buzz-two.ogg', 15, 1)
+ return FALSE
+
var/ticket_holder
var/priority_report = FALSE
var/is_self = tgui_alert(operator, "Is this request for yourself?", "Ticket Holder", list("Yes", "No"))
@@ -916,63 +919,93 @@ GLOBAL_LIST_INIT(maintenance_categories, list(
var/confirm = alert(operator, "Please confirm the submission of your access ticket request. \n\n Priority: [priority_report ? "Yes" : "No"] \n Holder: '[ticket_holder]' \n Details: '[details]' \n\n Is this correct?", "Confirmation", "Yes", "No")
if(confirm != "Yes" || !link)
return FALSE
- var/datum/ares_ticket/access/access_ticket = new(last_login, ticket_holder, details, priority_report)
+ var/datum/ares_ticket/access/access_ticket = new(last_login, ticket_holder, details, priority_report, idcard.registered_gid)
+ link.waiting_ids += idcard
link.tickets_access += access_ticket
if(priority_report)
ares_apollo_talk("Priority Access Request: [ticket_holder] - ID [access_ticket.ticket_id]. Seek and resolve.")
log_game("ARES: Access Ticket '\ref[access_ticket]' created by [key_name(operator)] as [last_login] with Holder '[ticket_holder]' and Details of '[details]'.")
return TRUE
- if("eject_id")
- playsound = FALSE
- eject_id()
- if("apply_access")
- playsound = FALSE
- if(!target_id)
- return FALSE
- var/announce_text = "[last_login] revoked core access from [target_id.registered_name]'s ID card."
- if(ACCESS_MARINE_AI_TEMP in target_id.access)
- target_id.access -= ACCESS_MARINE_AI_TEMP
- target_id.modification_log += "Temporary AI access revoked by [key_name(operator)]"
- to_chat(operator, SPAN_NOTICE("Access revoked from [target_id.registered_name]."))
- else
- target_id.access += ACCESS_MARINE_AI_TEMP
- target_id.modification_log += "Temporary AI access granted by [key_name(operator)]"
- announce_text = "[last_login] granted core access to [target_id.registered_name]'s ID card."
- to_chat(operator, SPAN_NOTICE("Access granted to [target_id.registered_name]."))
- ares_apollo_talk(announce_text)
- playsound(src, 'sound/machines/chime.ogg', 15, 1)
-
if("return_access")
playsound = FALSE
- var/obj/item/card/id/idcard = operator.get_active_hand()
- var/real_id = TRUE
- if(!istype(idcard))
- real_id = FALSE
- if(operator.wear_id)
- idcard = operator.wear_id
- real_id = TRUE
- if(!istype(idcard))
- real_id = FALSE
- if(!real_id)
- to_chat(operator, SPAN_WARNING("You require an ID card to return an access ticket!"))
- playsound(src, 'sound/machines/buzz-two.ogg', 15, 1)
- return FALSE
-
- if(!(ACCESS_MARINE_AI_TEMP in idcard.access))
- to_chat(operator, SPAN_WARNING("This ID card does not have an access ticket!"))
- playsound(src, 'sound/machines/buzz-two.ogg', 15, 1)
- return FALSE
+ var/datum/ares_ticket/access/access_ticket
+ for(var/datum/ares_ticket/access/possible_ticket in link.tickets_access)
+ if(possible_ticket.ticket_status != TICKET_GRANTED)
+ continue
+ if(possible_ticket.ticket_name != last_login)
+ continue
+ access_ticket = possible_ticket
+ break
+
+ for(var/obj/item/card/id/identification in link.active_ids)
+ if(!istype(identification))
+ continue
+ if(identification.registered_gid != access_ticket.user_id_num)
+ continue
+
+ access_ticket.ticket_status = TICKET_REVOKED
+ identification.access -= ACCESS_MARINE_AI_TEMP
+ identification.modification_log += "Temporary AI Access self-returned by [key_name(operator)]."
+
+ to_chat(operator, SPAN_NOTICE("Temporary Access Ticket surrendered."))
+ playsound(src, 'sound/machines/chime.ogg', 15, 1)
+ ares_apollo_talk("[last_login] surrendered their access ticket.")
+
+ authentication = get_ares_access(identification)
+ if(authentication)
+ login_list += "[last_login] at [worldtime2text()], Surrendered Temporary Access Ticket."
+ return TRUE
- idcard.access -= ACCESS_MARINE_AI_TEMP
- idcard.modification_log += "Temporary AI Access self-returned by [key_name(operator)]."
- to_chat(operator, SPAN_NOTICE("Temporary Access Ticket surrendered."))
- playsound(src, 'sound/machines/chime.ogg', 15, 1)
- ares_apollo_talk("[last_login] surrendered their access ticket.")
- authentication = get_ares_access(idcard)
+ to_chat(operator, SPAN_WARNING("This ID card does not have an access ticket!"))
+ playsound(src, 'sound/machines/buzz-two.ogg', 15, 1)
+ return FALSE
- if(authentication)
- login_list += "[last_login] at [worldtime2text()], Surrendered Temporary Access Ticket."
+ if("auth_access")
+ playsound = FALSE
+ var/datum/ares_ticket/access/access_ticket = locate(params["ticket"])
+ if(!access_ticket)
+ return FALSE
+ for(var/obj/item/card/id/identification in link.waiting_ids)
+ if(!istype(identification))
+ continue
+ if(identification.registered_gid != access_ticket.user_id_num)
+ continue
+ identification.handle_ares_access(last_login, operator)
+ access_ticket.ticket_status = TICKET_GRANTED
+ playsound(src, 'sound/machines/chime.ogg', 15, 1)
+ return TRUE
+ for(var/obj/item/card/id/identification in link.active_ids)
+ if(!istype(identification))
+ continue
+ if(identification.registered_gid != access_ticket.user_id_num)
+ continue
+ identification.handle_ares_access(last_login, operator)
+ access_ticket.ticket_status = TICKET_REVOKED
+ playsound(src, 'sound/machines/chime.ogg', 15, 1)
+ return TRUE
+ return FALSE
if(playsound)
playsound(src, "keyboard_alt", 15, 1)
+
+/obj/item/card/id/proc/handle_ares_access(logged_in, mob/user)
+ var/announce_text = "[logged_in] revoked core access from [registered_name]'s ID card."
+ var/operator = key_name(user)
+ var/datum/ares_link/link = GLOB.ares_link
+ if(logged_in == MAIN_AI_SYSTEM)
+ operator = "[user.ckey]/([MAIN_AI_SYSTEM])"
+ if(ACCESS_MARINE_AI_TEMP in access)
+ access -= ACCESS_MARINE_AI_TEMP
+ link.active_ids -= src
+ modification_log += "Temporary AI access revoked by [operator]"
+ to_chat(user, SPAN_NOTICE("Access revoked from [registered_name]."))
+ else
+ access += ACCESS_MARINE_AI_TEMP
+ modification_log += "Temporary AI access granted by [operator]"
+ announce_text = "[logged_in] granted core access to [registered_name]'s ID card."
+ to_chat(user, SPAN_NOTICE("Access granted to [registered_name]."))
+ link.waiting_ids -= src
+ link.active_ids += src
+ ares_apollo_talk(announce_text)
+ return TRUE
diff --git a/code/game/machinery/ARES/ARES_records.dm b/code/game/machinery/ARES/ARES_records.dm
index 4e2b479e71a2..65fc2b1aa762 100644
--- a/code/game/machinery/ARES/ARES_records.dm
+++ b/code/game/machinery/ARES/ARES_records.dm
@@ -107,3 +107,17 @@
/datum/ares_ticket/access
ticket_type = ARES_RECORD_ACCESS
+ var/user_id_num
+
+/datum/ares_ticket/access/New(user, name, details, priority, global_id_num)
+ var/ref_holder = "\ref[src]"
+ var/pos = length(ref_holder)
+ var/new_id = "#[copytext("\ref[src]", pos - 4, pos)]"
+
+ ticket_time = worldtime2text()
+ ticket_submitter = user
+ ticket_details = details
+ ticket_name = name
+ ticket_priority = priority
+ ticket_id = new_id
+ user_id_num = global_id_num
diff --git a/maps/map_files/USS_Almayer/USS_Almayer.dmm b/maps/map_files/USS_Almayer/USS_Almayer.dmm
index 85917c43a680..17c7c6c9b459 100644
--- a/maps/map_files/USS_Almayer/USS_Almayer.dmm
+++ b/maps/map_files/USS_Almayer/USS_Almayer.dmm
@@ -37163,8 +37163,7 @@
/obj/structure/machinery/computer/working_joe{
dir = 8;
pixel_x = 17;
- pixel_y = -6;
- ticket_console = 1
+ pixel_y = -6
},
/obj/item/storage/box/ids{
pixel_x = -4
@@ -54819,8 +54818,7 @@
},
/obj/structure/machinery/computer/working_joe{
dir = 8;
- pixel_x = 17;
- ticket_console = 1
+ pixel_x = 17
},
/obj/structure/sign/safety/laser{
pixel_y = 24
@@ -72955,8 +72953,7 @@
},
/obj/structure/machinery/computer/working_joe{
dir = 4;
- pixel_x = -17;
- ticket_console = 1
+ pixel_x = -17
},
/turf/open/floor/almayer/no_build{
icon_state = "ai_floors"
diff --git a/tgui/packages/tgui/interfaces/WorkingJoe.js b/tgui/packages/tgui/interfaces/WorkingJoe.js
index eba8c56ace91..9bdadaa47c5b 100644
--- a/tgui/packages/tgui/interfaces/WorkingJoe.js
+++ b/tgui/packages/tgui/interfaces/WorkingJoe.js
@@ -63,14 +63,8 @@ const Login = (props, context) => {
const MainMenu = (props, context) => {
const { data, act } = useBackend(context);
- const {
- logged_in,
- access_text,
- last_page,
- current_menu,
- access_level,
- ticket_console,
- } = data;
+ const { logged_in, access_text, last_page, current_menu, access_level } =
+ data;
let can_request_access = 'Yes';
if (access_level === 3) {
can_request_access = 'No';
@@ -198,20 +192,18 @@ const MainMenu = (props, context) => {
Task Management
- {!!ticket_console && (
-
-
- )}
+
+