//CCIAA's PDA. /obj/item/device/pda/central default_cartridge = /obj/item/cartridge/captain icon_state = "pda-h" detonate = 0 //CCIAA's tape recorder /obj/item/device/taperecorder/cciaa w_class = ITEMSIZE_TINY timestamp = list() //This actually turns timestamp into a string later on //Redundent matter = list() recording = FALSE playing = FALSE emagged = FALSE time_recorded = FALSE play_sleep_seconds = FALSE stored_info = list() can_print = TRUE //Specific for Duty Officers var/paused = FALSE var/sLogFile = null var/last_file_loc = null var/antag_involvement = FALSE var/antag_involvement_text = null var/datum/ccia_report/selected_report = null var/interviewee_id = null var/interviewee_name = null var/date_string = null /obj/item/device/taperecorder/cciaa/hear_talk(mob/living/M as mob, msg, var/verb="says") if(recording && !paused) timestamp = "[get_time()]" var/fmsg = "\[[timestamp]\] [M.name] [verb], \"[msg]\"" sLogFile << fmsg return /obj/item/device/taperecorder/cciaa/proc/get_time() return "[round(world.time / 36000)+12]:[(world.time / 600 % 60) < 10 ? add_zero(world.time / 600 % 60, 1) : world.time / 600 % 60]:[(world.time / 60 % 60) < 10 ? add_zero(world.time / 60 % 60, 1) : world.time / 60 % 60]" /obj/item/device/taperecorder/cciaa/record() set name = "Start Recording" set category = "Recorder" if(!check_rights(R_CCIAA,FALSE)) to_chat(usr, "The device beeps and flashes \"Unauthorised user.\".") return if(use_check_and_message(usr)) return if(recording) to_chat(usr, "The device beeps and flashes \"Already recording, Aborting\".") return //If nothing has been done with the device yet if(!selected_report && !interviewee_id) if(config.sql_ccia_logs) //Get the active cases from the database and display them var/list/reports = list() var/DBQuery/report_query = dbcon.NewQuery("SELECT id, report_date, title, public_topic, internal_topic, game_id, status FROM ss13_ccia_reports WHERE status IN ('in progress', 'approved') AND deleted_at IS NULL") report_query.Execute() while(report_query.NextRow()) CHECK_TICK var/datum/ccia_report/R = new(report_query.item[1], report_query.item[2], report_query.item[3], report_query.item[4], report_query.item[5], report_query.item[6], report_query.item[7]) reports["[report_query.item[1]] - [report_query.item[2]] - [report_query.item[3]]"] = R var/selection = input(usr, "Select Report","Report Name") as null|anything in reports if(!selection) to_chat(usr, "The device beeps and flashes \"No data entered, Aborting\".") return selected_report = reports[selection] to_chat(usr,"The device flashes \"Report [selected_report.title] selected, fingerprint of interviewee required\"") if(selected_report.internal_topic) send_link(usr, selected_report.internal_topic) else var/report_name = input(usr, "Select Report Name","Report Name") as null|text if(!report_name || report_name == "") to_chat(usr, "The device beeps and flashes \"No data entered, Aborting\".") return var/report_id = input(usr, "Select Report ID","Report ID") as null|text if(!report_id || report_id == "") to_chat(usr, "The device beeps and flashes \"No data entered, Aborting\".") return selected_report = new(report_id, time2text(world.realtime, "YYYY_MM_DD"), report_name) return //If we are ready to record, but no interviewee is selected else if(!selected_report && !interviewee_id) to_chat(usr,"The device beeps and flashes \"Fingerprint of interviewee required\"") return //If the report has been selected and the person scanned their frinterprint else if(selected_report && interviewee_id) date_string = time2text(world.realtime, "YYYY_MM_DD") var/fileLoc = "data/dutylogs/[usr.ckey]/[date_string]-[selected_report.id]-[interviewee_id].log" var/fileName = "[date_string]-[selected_report.id]-[interviewee_id].log" if(fexists(fileLoc)) var/safe = 0 var/i = 1 while(!safe) fileLoc = "data/dutylogs/[usr.ckey]/[date_string]-[selected_report.id]-[interviewee_id]-[i].log" if(!fexists(fileLoc)) fileName = "[date_string]-[selected_report.id]-[interviewee_id]-[i].log" safe = 1 break i++ last_file_loc = fileLoc sLogFile = file(fileLoc) sLogFile << "[selected_report.id]-[interviewee_id]" sLogFile << "Case file: [selected_report.title]" sLogFile << "--------------------------------" sLogFile << "Date: [date_string]" sLogFile << "--------------------------------" sLogFile << "Interviewer: [usr.name]" sLogFile << "Interviewee: [interviewee_name]" sLogFile << "Antag involvement: [antag_involvement]" sLogFile << "Recorder started: [get_time()]" sLogFile << "--------------------------------" recording = 1 icon_state = "taperecorderrecording" to_chat(usr, "The device beeps and flashes \"Writing to [fileName]\".") return /obj/item/device/taperecorder/cciaa/stop() set name = "Stop Recording" set category = "Recorder" if(use_check_and_message(usr)) return if(!check_rights(R_CCIAA,FALSE)) to_chat(usr, "The device beeps and flashes \"Unauthorised user.\".") return if(!recording) to_chat(usr, "The device beeps and flashes \"Not recording, Aborting\".") return recording = FALSE paused = FALSE sLogFile << "--------------------------------" sLogFile << "Recorder stopped: [get_time()]" sLogFile << "--------------------------------" var/obj/item/paper/P = get_last_transcript() P.forceMove(get_turf(src.loc)) //If we have sql ccia logs enabled, then persist it here if(config.sql_ccia_logs && establish_db_connection(dbcon)) //This query is split up into multiple parts due to the length limitations of byond. //To avoid this the text and the antag_involvement_text are saved separately var/DBQuery/save_log = dbcon.NewQuery("INSERT INTO ss13_ccia_reports_transcripts (id, report_id, character_id, interviewer, antag_involvement, text) VALUES (NULL, :report_id:, :character_id:, :interviewer:, :antag_involvement:, :text:)") save_log.Execute(list("report_id" = selected_report.id, "character_id" = interviewee_id, "interviewer" = usr.name, "antag_involvement" = antag_involvement, "text" = P.info)) //Run the query to get the inserted id var/transcript_id = null var/DBQuery/tid = dbcon.NewQuery("SELECT LAST_INSERT_ID() AS log_id") tid.Execute() if (tid.NextRow()) transcript_id = text2num(tid.item[1]) if(tid) var/DBQuery/add_text = dbcon.NewQuery("UPDATE ss13_ccia_reports_transcripts SET text = :text: WHERE id = :id:") add_text.Execute(list("id" = transcript_id, "text" = P.info)) var/DBQuery/add_antag_involvement_text = dbcon.NewQuery("UPDATE ss13_ccia_reports_transcripts SET antag_involvement_text = :antag_involvement_text: WHERE id = :id:") add_antag_involvement_text.Execute(list("id" = transcript_id, "antag_involvement_text" = antag_involvement_text)) else message_cciaa("Transcript could not be saved correctly. TiD Missing") //Check if we need to update the status to review required if(antag_involvement && selected_report.status == "in progress") to_chat(usr, "The device beeps and flashes \"Liaison Review Required. Interviewee claimed antag involvement.\".") var/DBQuery/update_db = dbcon.NewQuery("UPDATE ss13_ccia_reports SET status = 'review required' WHERE id = :id:") update_db.Execute(list("id" = selected_report.id)) sLogFile = null selected_report = null interviewee_id = null interviewee_name = null date_string = null antag_involvement = null to_chat(usr, "The device beeps and flashes \"Recording stopped log saved.\".") icon_state = "taperecorderidle" return /obj/item/device/taperecorder/cciaa/verb/reset_recorder() set name = "Reset Recorder" set category = "Recorder" if(!check_rights(R_CCIAA,FALSE)) to_chat(usr, "The device beeps and flashes \"Unauthorised user.\".") return var/confirmation = alert("Do you want to reset the recorder without saving?", "Reset Recorder", "Yes", "No") if(confirmation != "Yes") return sLogFile = null selected_report = null interviewee_id = null interviewee_name = null date_string = null antag_involvement = null to_chat(usr, "The device beeps and flashes \"Recorder Reset.\".") icon_state = "taperecorderidle" /obj/item/device/taperecorder/cciaa/proc/get_last_transcript() var/list/lFile = file2list(last_file_loc) var/dat = "" var/firstLine = null for(var/line in lFile) if(!line) continue if(!firstLine) firstLine = "[line]" continue dat += "[line]
\n" var/obj/item/paper/P = new /obj/item/paper(src) var/pname = "[firstLine]" var/info = "[dat]" P.set_content_unsafe(pname, info) return P /obj/item/device/taperecorder/cciaa/print_transcript() set name = "Print Transcript" set category = "Recorder" if(use_check_and_message(usr)) return if(!check_rights(R_CCIAA,FALSE)) to_chat(usr, "The device beeps and flashes \"Unauthorised user\".") return if(recording) to_chat(usr, "The device beeps and flashes \"Device recording, Aborting\".") return message_admins("[key_name_admin(usr)] accessed file: [last_file_loc]") var/obj/item/paper/P = get_last_transcript() P.forceMove(get_turf(src.loc)) return /obj/item/device/taperecorder/cciaa/verb/pause_recording() set name = "Pause Recording" set category = "Recorder" if(use_check_and_message(usr)) return if(!check_rights(R_CCIAA,FALSE)) to_chat(usr, "The device beeps and flashes \"Unauthorised user\".") return if(!recording) to_chat(usr, "The device beeps and flashes \"Not recording, Aborting\".") return if(!paused) sLogFile << "--------------------------------" sLogFile << "Recorder paused at: [get_time()]" to_chat(usr, "The device beeps and flashes \"Recording paused\".") paused = TRUE else sLogFile << "Recorder resumed at: [get_time()]" sLogFile << "--------------------------------" to_chat(usr, "The device beeps and flashes \"Recording resumed\".") paused = FALSE return /obj/item/device/taperecorder/cciaa/attack_self(mob/user) //If we are a ccia agent, then always go to the record function (to prompt for the report or start the recording) if(check_rights(R_CCIAA,FALSE)) record() return //Otherwise check if we already registered a interviewee if(interviewee_id) to_chat(user,"The device beeps and flashes \"A interviewee has already been associated with this interview\".") return if(ishuman(user)) var/mob/living/carbon/human/H = user if(!H.character_id) to_chat(user,"The device beeps and flashes \"Fingerprint is not recognized\".") return //Sync the intervieweee_id and interviewee_name interviewee_id = H.character_id interviewee_name = H.name //Show them the report they are interviewed about if(selected_report.public_topic) send_link(usr, selected_report.public_topic) //Ask them if there was antag involvement var/a = input(user, "Were your actions influenced by antagonists?", "Antagonist involvement") in list("yes","no") if(a == "yes") antag_involvement = TRUE antag_involvement_text = sanitizeSafe(input("Describe how your actions were influenced by the antagonists.", "Antag involvement") as message|null) message_cciaa("CCIA Interview: [user] claimed their actions were influenced by antagonists.", R_CCIAA) else antag_involvement = FALSE to_chat(user,"The device beeps and flashes \"Fingerprint recognized, Employee: [interviewee_name], ID: [interviewee_id]\".") playsound(src.loc, 'sound/machines/ping.ogg', 50, 0) else to_chat(user,"The device beeps and flashes \"Unrecognized entity - Aborting\".") return //redundent for now /obj/item/device/taperecorder/cciaa/clear_memory() set name = "Clear Memory" set category = null return /obj/item/device/taperecorder/cciaa/playback_memory() set name = "Playback Memory" set category = null return /obj/item/device/taperecorder/cciaa/explode() return //ccia headset, only command and ert channel are on by default /obj/item/device/radio/headset/ert/ccia name = "central command internal affairs radio headset" ks2type = /obj/item/device/encryptionkey/ccia /obj/item/device/encryptionkey/ccia name = "\improper CCIA radio encryption key" channels = list("Response Team" = 1, "Science" = 0, "Command" = 1, "Medical" = 0, "Engineering" = 0, "Security" = 0, "Supply" = 0, "Service" = 0) /obj/item/clothing/suit/storage/toggle/internalaffairs/cciaa name = "central command internal affairs jacket" /obj/item/storage/lockbox/cciaa req_access = list(access_cent_captain) name = "CCIA agent briefcase" desc = "A smart looking briefcase with a NT logo on the side" storage_slots = 8 max_storage_space = 16 /obj/item/storage/lockbox/cciaa/fib name = "FIB agent briefcase" desc = "A smart looking ID locked briefcase."