diff --git a/code/__HELPERS/unsorted.dm b/code/__HELPERS/unsorted.dm index c1626ab99a..b307bc1694 100644 --- a/code/__HELPERS/unsorted.dm +++ b/code/__HELPERS/unsorted.dm @@ -475,68 +475,52 @@ Turf and target are seperate in case you want to teleport some distance from a t /proc/key_name(var/whom, var/include_link = null, var/include_name = 1) - var/mob/the_mob = null - var/client/the_client = null - var/the_key = "" + var/mob/M + var/client/C + var/key - if (isnull(whom)) - return "*null*" - else if (istype(whom, /client)) - the_client = whom - the_mob = the_client.mob - the_key = the_client.key - else if (ismob(whom)) - the_mob = whom - the_client = the_mob.client - the_key = the_mob.key - else if (istype(whom, /datum)) - var/datum/the_datum = whom - return "*invalid:[the_datum.type]*" + if(!whom) return "*null*" + if(istype(whom, /client)) + C = whom + M = C.mob + key = C.key + else if(ismob(whom)) + M = whom + C = M.client + key = M.key + else if(istype(whom, /datum)) + var/datum/D = whom + return "*invalid:[D.type]*" else return "*invalid*" - var/text = "" + . = "" - if (!the_key) - text += "*no client*" - else - var/linked = 1 - if (include_link && !isnull(the_mob)) - if (istext(include_link)) - text += "" - else - if(ismob(include_link)) - var/mob/MM = include_link - if(MM.client) - text += "" - else - linked = 0 - else if (istype(include_link, /client)) - text += "" - else - linked = 0 + if(key) + if(include_link && C) + . += "" - if (the_client && the_client.holder && the_client.holder.fakekey && !include_name) - text += "Administrator" + if(C && C.holder && C.holder.fakekey && !include_name) + . += "Administrator" else - text += "[the_key]" + . += key - if (!isnull(include_link) && !isnull(the_mob)) - if(linked) - text += "" - else - text += " (DC)" + if(include_link) + if(C) . += "" + else . += " (DC)" + else + . += "*no key*" - if (include_name && !isnull(the_mob)) - if (the_mob.real_name) - text += "/([the_mob.real_name])" - else if (the_mob.name) - text += "/([the_mob.name])" + if(include_name && M) + if(M.real_name) + . += "/([M.real_name])" + else if(M.name) + . += "/([M.name])" - return text + return . /proc/key_name_admin(var/whom, var/include_name = 1) - return key_name(whom, "%admin_ref%", include_name) + return key_name(whom, 1, include_name) // Registers the on-close verb for a browse window (client/verb/.windowclose) diff --git a/code/controllers/verbs.dm b/code/controllers/verbs.dm index fcd2c73012..d659d2fa68 100644 --- a/code/controllers/verbs.dm +++ b/code/controllers/verbs.dm @@ -24,7 +24,7 @@ if("Supply Shuttle") supply_shuttle.process() feedback_add_details("admin_verb","RSupply") - message_admins("Admin [key_name_admin(usr)] has restarted the [controller] controller.", 1) + message_admins("Admin [key_name_admin(usr)] has restarted the [controller] controller.") return @@ -74,5 +74,5 @@ if("Cameras") debug_variables(cameranet) feedback_add_details("admin_verb","DCameras") - message_admins("Admin [key_name_admin(usr)] is debugging the [controller] controller.", 1) + message_admins("Admin [key_name_admin(usr)] is debugging the [controller] controller.") return diff --git a/code/datums/datumvars.dm b/code/datums/datumvars.dm index 968f25ba52..d83e773bcc 100644 --- a/code/datums/datumvars.dm +++ b/code/datums/datumvars.dm @@ -417,7 +417,7 @@ client var/new_name = copytext(sanitize(input(usr,"What would you like to name this mob?","Input a name",M.real_name) as text|null),1,MAX_NAME_LEN) if( !new_name || !M ) return - message_admins("Admin [key_name_admin(usr)] renamed [key_name_admin(M)] to [new_name].", 1) + message_admins("Admin [key_name_admin(usr)] renamed [key_name_admin(M)] to [new_name].") M.fully_replace_character_name(M.real_name,new_name) href_list["datumrefresh"] = href_list["rename"] @@ -590,7 +590,7 @@ client usr << "No objects of this type exist" return log_admin("[key_name(usr)] deleted all objects of type [O_type] ([i] objects deleted) ") - message_admins("\blue [key_name(usr)] deleted all objects of type [O_type] ([i] objects deleted) ", 1) + message_admins("\blue [key_name(usr)] deleted all objects of type [O_type] ([i] objects deleted) ") if("Type and subtypes") var/i = 0 for(var/obj/Obj in world) @@ -601,7 +601,7 @@ client usr << "No objects of this type exist" return log_admin("[key_name(usr)] deleted all objects of type or subtype of [O_type] ([i] objects deleted) ") - message_admins("\blue [key_name(usr)] deleted all objects of type or subtype of [O_type] ([i] objects deleted) ", 1) + message_admins("\blue [key_name(usr)] deleted all objects of type or subtype of [O_type] ([i] objects deleted) ") else if(href_list["explode"]) if(!check_rights(0)) return @@ -774,7 +774,7 @@ client if(amount != 0) log_admin("[key_name(usr)] dealt [amount] amount of [Text] damage to [L] ") - message_admins("\blue [key_name(usr)] dealt [amount] amount of [Text] damage to [L] ", 1) + message_admins("\blue [key_name(usr)] dealt [amount] amount of [Text] damage to [L] ") href_list["datumrefresh"] = href_list["mobToDamage"] else . = 0 diff --git a/code/datums/diseases/advance/advance.dm b/code/datums/diseases/advance/advance.dm index 25c4262b4e..aed6a302a2 100644 --- a/code/datums/diseases/advance/advance.dm +++ b/code/datums/diseases/advance/advance.dm @@ -424,6 +424,6 @@ var/list/archive_diseases = list() var/list/name_symptoms = list() for(var/datum/symptom/S in D.symptoms) name_symptoms += S.name - message_admins("[key_name_admin(user)] has triggered a custom virus outbreak of [D.name]! It has these symptoms: [english_list(name_symptoms)]", 1) + message_admins("[key_name_admin(user)] has triggered a custom virus outbreak of [D.name]! It has these symptoms: [english_list(name_symptoms)]") #undef RANDOM_STARTING_LEVEL \ No newline at end of file diff --git a/code/datums/mind.dm b/code/datums/mind.dm index fc5cf3dd58..92629558ae 100644 --- a/code/datums/mind.dm +++ b/code/datums/mind.dm @@ -750,7 +750,7 @@ datum/mind var/mob/living/carbon/monkey/M = current if (istype(H)) log_admin("[key_name(usr)] attempting to monkeyize [key_name(current)]") - message_admins("\blue [key_name_admin(usr)] attempting to monkeyize [key_name_admin(current)]", 1) + message_admins("\blue [key_name_admin(usr)] attempting to monkeyize [key_name_admin(current)]") src = null M = H.monkeyize() src = M.mind @@ -780,7 +780,7 @@ datum/mind D.cure(0) sleep(0) //because deleting of virus is doing throught spawn(0) log_admin("[key_name(usr)] attempting to humanize [key_name(current)]") - message_admins("\blue [key_name_admin(usr)] attempting to humanize [key_name_admin(current)]", 1) + message_admins("\blue [key_name_admin(usr)] attempting to humanize [key_name_admin(current)]") var/obj/item/weapon/dnainjector/m2h/m2h = new var/obj/item/weapon/implant/mobfinder = new(M) //hack because humanizing deletes mind --rastaf0 src = null diff --git a/code/game/gamemodes/events/ninja_equipment.dm b/code/game/gamemodes/events/ninja_equipment.dm index e7f64d6e30..e0047e2d3c 100644 --- a/code/game/gamemodes/events/ninja_equipment.dm +++ b/code/game/gamemodes/events/ninja_equipment.dm @@ -593,7 +593,7 @@ ________________________________________________________________________________ grant_kamikaze(U)//Give them verbs and change variables as necessary. U.regenerate_icons()//Update their clothing. ninjablade()//Summon two energy blades. - message_admins("\blue [U.key] used KAMIKAZE mode.", 1)//Let the admins know. + message_admins("\blue [key_name_admin(U)] used KAMIKAZE mode.")//Let the admins know. s_busy = 0 return sleep(s_delay) diff --git a/code/game/gamemodes/events/space_ninja.dm b/code/game/gamemodes/events/space_ninja.dm index 76b0162cfb..4931b2129e 100644 --- a/code/game/gamemodes/events/space_ninja.dm +++ b/code/game/gamemodes/events/space_ninja.dm @@ -475,7 +475,7 @@ As such, it's hard-coded for now. No reason for it not to be, really. space_ninja_arrival(input, mission) - message_admins("\blue [key] has spawned [input] as a Space Ninja.\nTheir mission is: [mission]", 1) + message_admins("\blue [key_name_admin(key)] has spawned [input] as a Space Ninja.\nTheir mission is: [mission]") log_admin("[key] used Spawn Space Ninja.") return diff --git a/code/game/machinery/computer/communications.dm b/code/game/machinery/computer/communications.dm index 43a0113939..2660f015a9 100644 --- a/code/game/machinery/computer/communications.dm +++ b/code/game/machinery/computer/communications.dm @@ -84,7 +84,7 @@ if(security_level != old_level) //Only notify the admins if an actual change happened log_game("[key_name(usr)] has changed the security level to [get_security_level()].") - message_admins("[key_name_admin(usr)] has changed the security level to [get_security_level()].", 1) + message_admins("[key_name_admin(usr)] has changed the security level to [get_security_level()].") switch(security_level) if(SEC_LEVEL_GREEN) feedback_inc("alert_comms_green",1) diff --git a/code/game/verbs/who.dm b/code/game/verbs/who.dm index 33c704545a..5205de3393 100644 --- a/code/game/verbs/who.dm +++ b/code/game/verbs/who.dm @@ -27,7 +27,7 @@ entry += " - DEAD" if(is_special_character(C.mob)) entry += " - Antagonist" - entry += " (?)" + entry += " (?)" Lines += entry else for(var/client/C in clients) diff --git a/code/modules/admin/topic.dm b/code/modules/admin/topic.dm index bb5b3b9489..b59206366f 100644 --- a/code/modules/admin/topic.dm +++ b/code/modules/admin/topic.dm @@ -1,5 +1,6 @@ /datum/admins/Topic(href, href_list) ..() + if(usr.client != src.owner || !check_rights(0)) world << "\blue [usr.key] has attempted to override the admin panel!" log_admin("[key_name(usr)] tried to use the admin panel without authorization.") diff --git a/code/modules/admin/verbs/adminhelp.dm b/code/modules/admin/verbs/adminhelp.dm index 031395eb78..e3ab99954b 100644 --- a/code/modules/admin/verbs/adminhelp.dm +++ b/code/modules/admin/verbs/adminhelp.dm @@ -1,122 +1,101 @@ //This is a list of words which are ignored by the parser when comparing message contents for names. MUST BE IN LOWER CASE! -var/list/adminhelp_ignored_words = list("unknown","the","a","an", "monkey", "alien", "as") +var/list/adminhelp_ignored_words = list("unknown","the","a","an","of","monkey","alien","as") /client/verb/adminhelp(msg as text) set category = "Admin" set name = "Adminhelp" + //handle muting and automuting if(muted & MUTE_ADMINHELP) src << "Error: Admin-PM: You cannot send adminhelps (Muted)." return - - if (src.handle_spam_prevention(msg,MUTE_ADMINHELP)) + if(src.handle_spam_prevention(msg,MUTE_ADMINHELP)) return + //remove out adminhelp verb temporarily to prevent spamming of admins. src.verbs -= /client/verb/adminhelp spawn(1200) src.verbs += /client/verb/adminhelp // 2 minute cool-down for adminhelps + //clean the input msg if(!msg) return msg = sanitize(copytext(msg,1,MAX_MESSAGE_LEN)) - if (!msg) return - + if(!msg) return var/original_msg = msg - //The symbol × (fancy multiplication sign) will be used to mark where to put replacements, so the original message must not contain it. - msg = replacetext(msg, "×", "") - msg = replacetext(msg, "HOLDERREF", "HOLDER-REF") //HOLDERREF is a key word which gets replaced with the admin's holder ref later on, so it mustn't be in the original message - msg = replacetext(msg, "ADMINREF", "ADMIN-REF") //ADMINREF is a key word which gets replaced with the admin's client's ref. So it mustn't be in the original message. - + //explode the input msg into a list var/list/msglist = text2list(msg, " ") - var/list/mob/mobs = list() - + //generate keywords lookup + var/list/surnames = list() + var/list/forenames = list() + var/list/ckeys = list() for(var/mob/M in mob_list) - mobs += M + var/list/indexing = list(M.real_name, M.name) + if(M.mind) indexing += M.mind.name - var/list/replacement_value = list() //When a word match is found, the word matched will get replaced with an × (fancy multiplication symbol). - //This list will contain a list of values which the × will be replaced with in the same order as indexes in this list. - //So if this list has the value list("John","Jane") and msg is, at the end, "This is × and he griffed ×" the text to - //display will be "This is John and he griffe Jane". The strings in this list are a bit more complex than 'John' and 'Jane' tho. - - var/ai_found = 0 //If an AI name or 'ai' word is found in the text, the additional (CL) = Check Laws button gets added. Not added every time so it doesn't spam. - - //we will try to locate each word of the message in our lists of names and clients - //for each mob that we have found - //split the mob's info into a list. "John Arnolds" becomes list("John","Arnolds") so we can iterate through this - //for each of the name parts IE. "John", "Arnolds", etc. in the current name. - for(var/i = 1; i <= msglist.len; i++) - var/word = msglist[i] - var/original_word = word - word = replacetext(word, ".", "") - word = replacetext(word, ",", "") - word = replacetext(word, "!", "") - word = replacetext(word, "?", "") //Strips some common punctuation characters so the actual word can be better compared. - word = replacetext(word, ";", "") - word = replacetext(word, ":", "") - word = replacetext(word, "(", "") - word = replacetext(word, ")", "") - if(lowertext(word) in adminhelp_ignored_words) - continue - if(lowertext(word) == "ai") - ai_found = 1 - continue - for(var/mob/M in mobs) - var/list/namelist = text2list("[M.name] [M.real_name] [(M.mind)?"[M.mind.name]":""] [M.ckey] [M.key]", " ") - var/word_is_match = 0 //Used to break from this mob for loop if a match is found - for(var/namepart in namelist) - if( lowertext(word) == lowertext(namepart) ) - msglist[i] = "×" - var/description_string = "[original_word] (?)" - replacement_value += description_string - mobs -= M //If a mob is found then remove it from the list of mobs, so we don't get the same mob reported a million times. - word_is_match = 1 + for(var/string in indexing) + var/list/L = text2list(string, " ") + var/surname_found = 0 + //surnames + for(var/i=L.len, i>=1, i--) + var/word = ckey(L[i]) + if(word) + surnames[word] = M + surname_found = i break - if(word_is_match) - if(isAI(M)) + //forenames + for(var/i=1, iCL)" : ""]: [msg]" + + //send this msg to all admins var/admin_number_afk = 0 + for(var/client/X in admins) + if(X.is_afk()) + admin_number_afk++ + if(X.holder.sound_adminhelp) + X << 'sound/effects/adminhelp.ogg' + X << msg - if(mob) - var/ref_mob = "\ref[src.mob]" - for(var/client/X in admins) - if( X.inactivity > AFK_THRESHOLD ) //When I made this, the AFK_THRESHOLD was 3000ds = 300s = 5m, see setup.dm for the new one. - admin_number_afk++ - if(X.holder.sound_adminhelp) - X << 'sound/effects/adminhelp.ogg' - var/check_laws_text = "" - if(ai_found) - check_laws_text = (" (CL)") - - var/msg_to_send = "\blue HELP: [key_name(src, X)] (?) (PP) (VV) (SM) (JMP) (CA) [check_laws_text]: [msg]" - msg_to_send = replacetext(msg_to_send, "HOLDERREF", "\ref[X.holder]") - msg_to_send = replacetext(msg_to_send, "ADMINREF", "\ref[X]") - X << msg_to_send - else - var/ref_client = "\ref[src]" - for(var/client/X in admins) - if( X.inactivity > AFK_THRESHOLD ) //When I made this, the AFK_THRESHOLD was 3000ds = 300s = 5m, see setup.dm for the new one. - admin_number_afk++ - if(X.holder.sound_adminhelp) - X << 'sound/effects/adminhelp.ogg' - var/msg_to_send = "\blue HELP: [key_name(src, X)] (VV) (CA): [msg]" - msg_to_send = replacetext(msg_to_send, "HOLDERREF", "\ref[X.holder]") - msg_to_send = replacetext(msg_to_send, "ADMINREF", "\ref[X]") - X << msg_to_send - var/admin_number_present = admins.len - admin_number_afk + //show it to the person adminhelping too src << "PM to-Admins: [original_msg]" + + var/admin_number_present = admins.len - admin_number_afk log_admin("HELP: [key_name(src)]: [original_msg] - heard by [admin_number_present] non-AFK admins.") if(admin_number_present <= 0) if(!admin_number_afk) diff --git a/code/modules/admin/verbs/adminsay.dm b/code/modules/admin/verbs/adminsay.dm index 835665aaba..5adb784a25 100644 --- a/code/modules/admin/verbs/adminsay.dm +++ b/code/modules/admin/verbs/adminsay.dm @@ -6,14 +6,15 @@ msg = copytext(sanitize(msg), 1, MAX_MESSAGE_LEN) if(!msg) return - - if(check_rights(R_ADMIN,0)) - for(var/client/C in admins) - C << "ADMIN: [key_name(usr, C)] (JMP): [msg]" - else - for(var/client/C in admins) - C << "ADMIN: [key_name(usr, C)]: [msg]" - + log_admin("[key_name(src)] : [msg]") + + if(check_rights(R_ADMIN,0)) + msg = "ADMIN: [key_name(usr, 1)] (JMP): [msg]" + admins << msg + else + msg = "ADMIN: [key_name(usr, 1)]: [msg]" + admins << msg + feedback_add_details("admin_verb","M") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! diff --git a/code/modules/admin/verbs/pray.dm b/code/modules/admin/verbs/pray.dm index d154f157ed..3a782741ac 100644 --- a/code/modules/admin/verbs/pray.dm +++ b/code/modules/admin/verbs/pray.dm @@ -3,36 +3,32 @@ set name = "Pray" msg = copytext(sanitize(msg), 1, MAX_MESSAGE_LEN) + if(!msg) return - if (!msg) - return - - if (usr.client) + if(usr.client) if(usr.client.muted & MUTE_PRAY) usr << "\red You cannot pray (muted)." return - - if (src.client.handle_spam_prevention(msg,MUTE_PRAY)) + if(src.client.handle_spam_prevention(msg,MUTE_PRAY)) return - var/icon/cross = icon('icons/obj/storage.dmi',"bible") - + var/image/cross = image('icons/obj/storage.dmi',"bible") + msg = "\blue \icon[cross] PRAY: [key_name(src, 1)] (?) (PP) (VV) (SM) (JMP) (CA) (SC): [msg]" + for(var/client/C in admins) if(C.seeprayers) - C << "\blue \icon[cross] PRAY: [key_name(src, C)] (?) (PP) (VV) (SM) (JMP) (CA) (SC): [msg]" - + C << msg usr << "Your prayers have been received by the gods." + feedback_add_details("admin_verb","PR") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! //log_admin("HELP: [key_name(src)]: [msg]") - /proc/Centcomm_announce(var/text , var/mob/Sender) var/msg = copytext(sanitize(text), 1, MAX_MESSAGE_LEN) - for(var/client/C in admins) - C << "\blue CENTCOMM:[key_name(Sender, C)] (PP) (VV) (SM) (JMP) (CA) (BSA) (RPLY): [msg]" + msg = "\blue CENTCOMM:[key_name(Sender, 1)] (PP) (VV) (SM) (JMP) (CA) (BSA) (RPLY): [msg]" + admins << msg /proc/Syndicate_announce(var/text , var/mob/Sender) var/msg = copytext(sanitize(text), 1, MAX_MESSAGE_LEN) - for(var/client/C in admins) - C << "\blue SYNDICATE:[key_name(Sender, C)] (PP) (VV) (SM) (JMP) (CA) (BSA) (RPLY): [msg]" - + msg = "\blue SYNDICATE:[key_name(Sender, 1)] (PP) (VV) (SM) (JMP) (CA) (BSA) (RPLY): [msg]" + admins << msg diff --git a/code/modules/client/client procs.dm b/code/modules/client/client procs.dm index 5256c106b6..19f6ef3edd 100644 --- a/code/modules/client/client procs.dm +++ b/code/modules/client/client procs.dm @@ -47,12 +47,16 @@ //Logs all hrefs if(config && config.log_hrefs && href_logfile) - href_logfile << "[time2text(world.timeofday,"hh:mm")] [src] (usr:[usr]) || [href]
" + href_logfile << "[time2text(world.timeofday,"hh:mm")] [src] (usr:[usr]) || [hsrc ? "[hsrc] " : ""][href]
" + + switch(href_list["_src_"]) + if("holder") hsrc = usr.client.holder + if("usr") hsrc = usr if(view_var_Topic(href,href_list,hsrc)) //Until viewvars can be rewritten as datum/admins/Topic() return - ..() //redirect to [locate(hsrc)]/Topic() + ..() //redirect to hsrc.Topic() /client/proc/handle_spam_prevention(var/message, var/mute_type) if(config.automute_on && !holder && src.last_message == message) @@ -181,6 +185,6 @@ //checks if a client is afk //3000 frames = 5 minutes -/client/proc/is_afk(duration=3000) +/client/proc/is_afk(duration=AFK_THRESHOLD) if(inactivity > duration) return inactivity return 0 \ No newline at end of file