diff --git a/code/__DEFINES/machines.dm b/code/__DEFINES/machines.dm index 070aaaa2249..521cf632388 100644 --- a/code/__DEFINES/machines.dm +++ b/code/__DEFINES/machines.dm @@ -97,3 +97,4 @@ #define LOGIN_TYPE_NORMAL 1 #define LOGIN_TYPE_AI 2 #define LOGIN_TYPE_ROBOT 3 +#define LOGIN_TYPE_ADMIN 4 diff --git a/code/__HELPERS/mobs.dm b/code/__HELPERS/mobs.dm index 055e52663a6..410f66b3056 100644 --- a/code/__HELPERS/mobs.dm +++ b/code/__HELPERS/mobs.dm @@ -238,36 +238,37 @@ if(70 to INFINITY) return "elderly" else return "unknown" -/proc/set_criminal_status(mob/living/user, datum/data/record/target_records , criminal_status, comment, user_rank, list/authcard_access = list()) +/proc/set_criminal_status(mob/living/user, datum/data/record/target_records , criminal_status, comment, user_rank, list/authcard_access = list(), user_name) var/status = criminal_status var/their_name = target_records.fields["name"] var/their_rank = target_records.fields["rank"] switch(criminal_status) - if("arrest") + if("arrest", SEC_RECORD_STATUS_ARREST) status = SEC_RECORD_STATUS_ARREST - if("none") + if("none", SEC_RECORD_STATUS_NONE) status = SEC_RECORD_STATUS_NONE - if("execute") + if("execute", SEC_RECORD_STATUS_EXECUTE) if((ACCESS_MAGISTRATE in authcard_access) || (ACCESS_ARMORY in authcard_access)) status = SEC_RECORD_STATUS_EXECUTE message_admins("[ADMIN_FULLMONTY(usr)] authorized EXECUTION for [their_rank] [their_name], with comment: [comment]") else return 0 - if("search") + if("search", SEC_RECORD_STATUS_SEARCH) status = SEC_RECORD_STATUS_SEARCH - if("monitor") + if("monitor", SEC_RECORD_STATUS_MONITOR) status = SEC_RECORD_STATUS_MONITOR - if ("demote") + if("demote", SEC_RECORD_STATUS_DEMOTE) + message_admins("[ADMIN_FULLMONTY(usr)] set criminal status to DEMOTE for [their_rank] [their_name], with comment: [comment]") status = SEC_RECORD_STATUS_DEMOTE - if("incarcerated") + if("incarcerated", SEC_RECORD_STATUS_INCARCERATED) status = SEC_RECORD_STATUS_INCARCERATED - if("parolled") + if("parolled", SEC_RECORD_STATUS_PAROLLED) status = SEC_RECORD_STATUS_PAROLLED - if("released") + if("released", SEC_RECORD_STATUS_RELEASED) status = SEC_RECORD_STATUS_RELEASED target_records.fields["criminal"] = status log_admin("[key_name_admin(user)] set secstatus of [their_rank] [their_name] to [status], comment: [comment]") - target_records.fields["comments"] += "Set to [status] by [user.name] ([user_rank]) on [GLOB.current_date_string] [station_time_timestamp()], comment: [comment]" + target_records.fields["comments"] += "Set to [status] by [user_name || user.name] ([user_rank]) on [GLOB.current_date_string] [station_time_timestamp()], comment: [comment]" update_all_mob_security_hud() return 1 diff --git a/code/datums/datacore.dm b/code/datums/datacore.dm index 0e98179e2f9..aafe126a0b4 100644 --- a/code/datums/datacore.dm +++ b/code/datums/datacore.dm @@ -278,8 +278,8 @@ GLOBAL_VAR_INIT(record_id_num, 1001) G.fields["sex"] = capitalize(H.gender) G.fields["species"] = H.dna.species.name G.fields["photo"] = get_id_photo(H) - G.fields["photo-south"] = "'data:image/png;base64,[icon2base64(icon(G.fields["photo"], dir = SOUTH))]'" - G.fields["photo-west"] = "'data:image/png;base64,[icon2base64(icon(G.fields["photo"], dir = WEST))]'" + G.fields["photo-south"] = "data:image/png;base64,[icon2base64(icon(G.fields["photo"], dir = SOUTH))]" + G.fields["photo-west"] = "data:image/png;base64,[icon2base64(icon(G.fields["photo"], dir = WEST))]" if(H.gen_record && !jobban_isbanned(H, "Records")) G.fields["notes"] = H.gen_record else @@ -319,7 +319,7 @@ GLOBAL_VAR_INIT(record_id_num, 1001) if(H.sec_record && !jobban_isbanned(H, "Records")) S.fields["notes"] = H.sec_record else - S.fields["notes"] = "No notes." + S.fields["notes"] = "No notes found." LAZYINITLIST(S.fields["comments"]) security += S diff --git a/code/game/machinery/computer/security.dm b/code/game/machinery/computer/security.dm index 8c815198d31..d091b07d4cb 100644 --- a/code/game/machinery/computer/security.dm +++ b/code/game/machinery/computer/security.dm @@ -2,43 +2,67 @@ #define SEC_DATA_MAINT 2 // Records maintenance #define SEC_DATA_RECORD 3 // Record -/obj/machinery/computer/secure_data//TODO:SANITY +#define SEC_FIELD(N, V, E, LB) list(field = N, value = V, edit = E, line_break = LB) + +/obj/machinery/computer/secure_data name = "security records" desc = "Used to view and edit personnel's security records." icon_keyboard = "security_key" icon_screen = "security" - req_one_access = list(ACCESS_SECURITY, ACCESS_FORENSICS_LOCKERS) circuit = /obj/item/circuitboard/secure_data - var/obj/item/card/id/scan = null - var/authenticated = null - var/rank = null - var/list/authcard_access = list() - var/screen = null - var/datum/data/record/active1 = null - var/datum/data/record/active2 = null - var/temp = null - var/printing = null - //Sorting Variables - var/sortBy = "name" - var/order = 1 // -1 = Descending - 1 = Ascending + /// The current page being viewed. + var/current_page = SEC_DATA_R_LIST + /// The current general record being viewed. + var/datum/data/record/record_general = null + /// The current security record being viewed. + var/datum/data/record/record_security = null + /// Whether the computer is currently printing a paper or not. + var/is_printing = FALSE + /// The editable fields and their associated question to display to the user. + var/static/list/field_edit_questions + /// The editable fields and their associated choices to display to the user. + var/static/list/field_edit_choices + /// The current temporary notice. + var/temp_notice light_color = LIGHT_COLOR_RED +/obj/machinery/computer/secure_data/Initialize(mapload) + . = ..() + req_one_access = list(ACCESS_SECURITY, ACCESS_FORENSICS_LOCKERS) + if(!field_edit_questions) + field_edit_questions = list( + // General + "name" = "Please input new name:", + "id" = "Please input new ID:", + "sex" = "Please select new sex:", + "age" = "Please input new age:", + "fingerprint" = "Please input new fingerprint hash:", + // Security + "criminal" = "Please select new criminal status:", + "mi_crim" = "Please input new minor crimes:", + "mi_crim_d" = "Please summarize minor crimes:", + "ma_crim" = "Please input new major crimes:", + "ma_crim_d" = "Please summarize major crimes:", + "notes" = "Please input new important notes:", + ) + field_edit_choices = list( + // General + "sex" = list("Male", "Female"), + // Security + "criminal" = list(SEC_RECORD_STATUS_NONE, SEC_RECORD_STATUS_ARREST, SEC_RECORD_STATUS_EXECUTE, SEC_RECORD_STATUS_INCARCERATED, SEC_RECORD_STATUS_RELEASED, SEC_RECORD_STATUS_PAROLLED, SEC_RECORD_STATUS_DEMOTE, SEC_RECORD_STATUS_SEARCH, SEC_RECORD_STATUS_MONITOR), + ) + /obj/machinery/computer/secure_data/Destroy() - active1 = null - active2 = null + record_general = null + record_security = null return ..() /obj/machinery/computer/secure_data/attackby(obj/item/O, mob/user, params) - if(istype(O, /obj/item/card/id) && !scan) - user.drop_item() - O.forceMove(src) - scan = O - ui_interact(user) + if(tgui_login_attackby(O, user)) return return ..() -//Someone needs to break down the dat += into chunks instead of long ass lines. /obj/machinery/computer/secure_data/attack_hand(mob/user) if(..()) return @@ -46,267 +70,124 @@ to_chat(user, "Unable to establish a connection: You're too far away from the station!") return add_fingerprint(user) - ui_interact(user) + tgui_interact(user) -/obj/machinery/computer/secure_data/ui_interact(mob/user, ui_key = "main", var/datum/nanoui/ui = null, var/force_open = 1) - ui = SSnanoui.try_update_ui(user, src, ui_key, ui, force_open) +/obj/machinery/computer/secure_data/tgui_interact(mob/user, ui_key = "main", datum/tgui/ui = null, force_open = TRUE, datum/tgui/master_ui = null, datum/tgui_state/state = GLOB.tgui_default_state) + ui = SStgui.try_update_ui(user, src, ui_key, ui, force_open) if(!ui) - ui = new(user, src, ui_key, "secure_data.tmpl", name, 800, 800) + ui = new(user, src, ui_key, "SecurityRecords", name, 800, 800) ui.open() + ui.set_autoupdate(FALSE) -/obj/machinery/computer/secure_data/ui_data(mob/user, ui_key = "main", datum/topic_state/state = GLOB.default_state) - var/data[0] - data["temp"] = temp - data["scan"] = scan ? scan.name : null - data["authenticated"] = authenticated - data["screen"] = screen - if(authenticated) - switch(screen) +/obj/machinery/computer/secure_data/tgui_data(mob/user, ui_key = "main", datum/topic_state/state = GLOB.default_state) + var/list/data = list() + data["currentPage"] = current_page + data["isPrinting"] = is_printing + tgui_login_data(data, user) + data["modal"] = tgui_modal_data() + data["temp"] = temp_notice + if(data["loginState"]["logged_in"]) + switch(current_page) if(SEC_DATA_R_LIST) - if(!isnull(GLOB.data_core.general)) - for(var/datum/data/record/R in sortRecord(GLOB.data_core.general, sortBy, order)) - var/crimstat = "null" - for(var/datum/data/record/E in GLOB.data_core.security) - if(E.fields["name"] == R.fields["name"] && E.fields["id"] == R.fields["id"]) - crimstat = E.fields["criminal"] - break - var/background = "''" - switch(crimstat) - if(SEC_RECORD_STATUS_EXECUTE) - background = "'background-color:#5E0A1A'" - if(SEC_RECORD_STATUS_ARREST) - background = "'background-color:#890E26'" - if(SEC_RECORD_STATUS_SEARCH) - background = "'background-color:#999900'" - if(SEC_RECORD_STATUS_MONITOR) - background = "'background-color:#004C99'" - if(SEC_RECORD_STATUS_DEMOTE) - background = "'background-color:#C2A111'" - if(SEC_RECORD_STATUS_INCARCERATED) - background = "'background-color:#743B03'" - if(SEC_RECORD_STATUS_PAROLLED) - background = "'background-color:#743B03'" - if(SEC_RECORD_STATUS_RELEASED) - background = "'background-color:#216489'" - if(SEC_RECORD_STATUS_NONE) - background = "'background-color:#007f47'" - if("null") - crimstat = "No record." - data["records"] += list(list("ref" = "\ref[R]", "id" = R.fields["id"], "name" = R.fields["name"], "rank" = R.fields["rank"], "fingerprint" = R.fields["fingerprint"], "background" = background, "crimstat" = crimstat)) + // Prepare the list of security records to associate with the general ones. + // This is not ideal but datacore code sucks and needs to be rewritten. + var/list/sec_records_assoc = list() + for(var/datum/data/record/S in GLOB.data_core.security) + sec_records_assoc["[S.fields["name"]]|[S.fields["id"]]"] = S + // List the general records + var/list/records = list() + data["records"] = records + for(var/datum/data/record/G in GLOB.data_core.general) + var/datum/data/record/S = sec_records_assoc["[G.fields["name"]]|[G.fields["id"]]"] + var/list/record_line = list("uid_gen" = G.UID(), "id" = G.fields["id"], "name" = G.fields["name"], "rank" = G.fields["rank"], "fingerprint" = G.fields["fingerprint"]) + record_line["status"] = S?.fields["criminal"] || "No record" + record_line["uid_sec"] = S?.UID() // So we don't have to perform the search through a for loop again later + records[++records.len] = record_line if(SEC_DATA_RECORD) var/list/general = list() data["general"] = general - if(istype(active1, /datum/data/record) && GLOB.data_core.general.Find(active1)) - var/list/fields = list() - general["fields"] = fields - fields[++fields.len] = list("field" = "Name:", "value" = active1.fields["name"], "edit" = "name") - fields[++fields.len] = list("field" = "ID:", "value" = active1.fields["id"], "edit" = "id") - fields[++fields.len] = list("field" = "Sex:", "value" = active1.fields["sex"], "edit" = "sex") - fields[++fields.len] = list("field" = "Age:", "value" = active1.fields["age"], "edit" = "age") - fields[++fields.len] = list("field" = "Rank:", "value" = active1.fields["rank"], "edit" = "rank") - fields[++fields.len] = list("field" = "Fingerprint:", "value" = active1.fields["fingerprint"], "edit" = "fingerprint") - fields[++fields.len] = list("field" = "Physical Status:", "value" = active1.fields["p_stat"], "edit" = null) - fields[++fields.len] = list("field" = "Mental Status:", "value" = active1.fields["m_stat"], "edit" = null) - var/list/photos = list() - general["photos"] = photos - photos[++photos.len] = list("photo" = active1.fields["photo-south"]) - photos[++photos.len] = list("photo" = active1.fields["photo-west"]) - general["has_photos"] += (active1.fields["photo-south"] || active1.fields["photo-west"] ? 1 : 0) - general["empty"] = 0 + if(record_general && GLOB.data_core.general.Find(record_general)) + var/list/gen_fields = record_general.fields + general["fields"] = list( + SEC_FIELD("Name", gen_fields["name"], "name", FALSE), + SEC_FIELD("ID", gen_fields["id"], "id", TRUE), + SEC_FIELD("Sex", gen_fields["sex"], "sex", FALSE), + SEC_FIELD("Age", gen_fields["age"], "age", TRUE), + SEC_FIELD("Assignment", gen_fields["rank"], null, FALSE), + SEC_FIELD("Fingerprint", gen_fields["fingerprint"], "fingerprint", TRUE), + SEC_FIELD("Physical Status", gen_fields["p_stat"], null, FALSE), + SEC_FIELD("Mental Status", gen_fields["m_stat"], null, TRUE), + SEC_FIELD("Important Notes", gen_fields["notes"], null, FALSE), + ) + general["photos"] = list( + gen_fields["photo-south"], + gen_fields["photo-west"], + ) + general["has_photos"] = (gen_fields["photo-south"] || gen_fields["photo-west"]) ? TRUE : FALSE + general["empty"] = FALSE else - general["empty"] = 1 + general["empty"] = TRUE var/list/security = list() data["security"] = security - if(istype(active2, /datum/data/record) && GLOB.data_core.security.Find(active2)) - var/list/fields = list() - security["fields"] = fields - fields[++fields.len] = list("field" = "Criminal Status:", "value" = active2.fields["criminal"], "edit" = "criminal", "line_break" = 1) - fields[++fields.len] = list("field" = "Minor Crimes:", "value" = active2.fields["mi_crim"], "edit" = "mi_crim", "line_break" = 0) - fields[++fields.len] = list("field" = "Details:", "value" = active2.fields["mi_crim_d"], "edit" = "mi_crim_d", "line_break" = 1) - fields[++fields.len] = list("field" = "Major Crimes:", "value" = active2.fields["ma_crim"], "edit" = "ma_crim", "line_break" = 0) - fields[++fields.len] = list("field" = "Details:", "value" = active2.fields["ma_crim_d"], "edit" = "ma_crim_d", "line_break" = 1) - fields[++fields.len] = list("field" = "Important Notes:", "value" = active2.fields["notes"], "edit" = "notes", "line_break" = 0) - if(!active2.fields["comments"] || !islist(active2.fields["comments"])) - active2.fields["comments"] = list() - security["comments"] = active2.fields["comments"] - security["empty"] = 0 + if(record_security && GLOB.data_core.security.Find(record_security)) + var/list/sec_fields = record_security.fields + security["fields"] = list( + SEC_FIELD("Criminal Status", sec_fields["criminal"], "criminal", TRUE), + SEC_FIELD("Minor Crimes", sec_fields["mi_crim"], "mi_crim", FALSE), + SEC_FIELD("Details", sec_fields["mi_crim_d"], "mi_crim_d", TRUE), + SEC_FIELD("Major Crimes", sec_fields["ma_crim"], "ma_crim", FALSE), + SEC_FIELD("Details", sec_fields["ma_crim_d"], "ma_crim_d", TRUE), + SEC_FIELD("Important Notes", sec_fields["notes"], null, FALSE), + ) + if(!islist(sec_fields["comments"])) + sec_fields["comments"] = list() + security["comments"] = sec_fields["comments"] + security["empty"] = FALSE else - security["empty"] = 1 + security["empty"] = TRUE + return data -/obj/machinery/computer/secure_data/Topic(href, href_list) +/obj/machinery/computer/secure_data/tgui_act(action, list/params) if(..()) - return 1 + return - if(!GLOB.data_core.general.Find(active1)) - active1 = null - if(!GLOB.data_core.security.Find(active2)) - active2 = null + . = TRUE + if(tgui_act_modal(action, params)) + return + if(tgui_login_act(action, params)) + return - if(href_list["temp"]) - temp = null - - if(href_list["temp_action"]) - var/temp_href = splittext(href_list["temp_action"], "=") - switch(temp_href[1]) - if("del_all2") - for(var/datum/data/record/R in GLOB.data_core.security) - qdel(R) - update_all_mob_security_hud() - setTemp("
| - Search: - | -
| {{:helper.link('Name', null, {'sort' : 'name'}, null, 'infoButton')}} | -{{:helper.link('ID', null, {'sort' : 'id'}, null, 'infoButton')}} | -{{:helper.link('Rank', null, {'sort' : 'rank'}, null, 'infoButton')}} | -{{:helper.link('Fingerprints', null, {'sort' : 'fingerprint'}, null, 'infoButton')}} | -{{:helper.link('Criminal Status', null, {'sort' : 'crimstat'}, null, 'infoButton')}} | -
|---|---|---|---|---|
| {{:helper.link(value.name, 'user', {'d_rec' : value.ref}, null, 'infoButton')}} | -{{:value.id}} | -{{:value.rank}} | -{{:value.fingerprint}} | -{{:value.crimstat}} | -
|
- {{for data.general.fields}}
-
-
- {{/for}}
-
- {{:value.field}}
-
-
- {{:helper.link(value.value, value.edit ? 'pencil' : 'user-times', {'field' : value.edit}, value.edit ? null : 'disabled')}}
-
- |
-
- {{if data.general.has_photos}}
-
- {{for data.general.photos}}
- {{if value.photo}}
- |
-