//allows right clicking mobs to send an admin PM to their client, forwards the selected mob's client to cmd_admin_pm /client/proc/cmd_admin_pm_context(mob/M as mob in world) set category = null set name = "Admin PM Mob" if(!holder) src << "Error: Admin-PM-Context: Only administrators may use this command." return if( !ismob(M) || !M.client ) return cmd_admin_pm(M.client,null) //shows a list of clients we could send PMs to, then forwards our choice to cmd_admin_pm /client/proc/cmd_admin_pm_panel() set category = "Admin" set name = "Admin PM" if(!holder) src << "Error: Admin-PM-Panel: Only administrators may use this command." return var/list/client/targets[0] for(var/client/T) if(T.mob) if(istype(T.mob, /mob/new_player)) targets["(New Player) - [T]"] = T else if(istype(T.mob, /mob/dead/observer)) targets["[T.mob.name](Ghost) - [T]"] = T else targets["[T.mob.real_name](as [T.mob.name]) - [T]"] = T else targets["(No Mob) - [T]"] = T var/list/sorted = sortList(targets) var/target = input(src,"To whom shall we send a message?","Admin PM",null) in sorted|null cmd_admin_pm(targets[target],null) //takes input from cmd_admin_pm_context, cmd_admin_pm_panel or /client/Topic and sends them a PM. //Fetching a message if needed. src is the sender and C is the target client /client/proc/cmd_admin_pm(var/client/C, var/msg) if(src.muted_complete) src << "Error: Admin-PM: You are completely muted." return if( !C || !istype(C,/client) ) if(holder) src << "Error: Admin-PM: Client not found." else adminhelp(msg) //admin we are replying to left. adminhelp instead return //get message text, limit it's length.and clean/escape html if(!msg) msg = input(src,"Message:", "Private message to [C.key]") as text|null if(!msg) return if(!C) if(holder) src << "Error: Admin-PM: Client not found." else adminhelp(msg) //admin we are replying to has vanished, adminhelp instead return //clean the message if it's not sent by a GA or GM if( !holder || !(holder.rank in list("Game Admin", "Game Master")) ) msg = sanitize(copytext(msg,1,MAX_MESSAGE_LEN)) if(!msg) return if(C.holder) if(holder) //both are admins C << "Admin PM from-[key_name(src, C, 1)]: [msg]" src << "Admin PM to-[key_name(C, src, 1)]: [msg]" else //recipient is an admin but sender is not C << "Reply PM from-[key_name(src, C, 1)]: [msg]" src << "PM to-Admins: [msg]" //play the recieving admin the adminhelp sound (if they have them enabled) if(C.sound_adminhelp) C << 'adminhelp.ogg' else if(holder) //sender is an admin but recipient is not. Do BIG RED TEXT C << "-- Administrator private message --" C << "Admin PM from-[key_name(src, C, 0)]: [msg]" C << "Click on the administrator's name to reply." src << "Admin PM to-[key_name(C, src, 1)]: [msg]" //always play non-admin recipients the adminhelp sound C << 'adminhelp.ogg' //AdminPM popup for ApocStation and anybody else who wants to use it. Set it with POPUP_ADMIN_PM in config.txt ~Carn if(config.popup_admin_pm) spawn() //so we don't hold the caller proc up var/sender = src var/sendername = key var/reply = input(C, msg,"Admin PM from-[sendername]", "") as text|null //show message and await a reply if(C && reply) if(sender) C.cmd_admin_pm(sender,reply) //sender is still about, let's reply to them else adminhelp(reply) //sender has left, adminhelp instead return else //neither are admins src << "Error: Admin-PM: Non-admin to non-admin PM communication is forbidden." return log_admin("PM: [key_name(src)]->[key_name(C)]: [msg]") //we don't use message_admins here because the sender/receiver might get it too for(var/client/X) //there are fewer clients than mobs if(X.holder && X.key!=key && X.key!=C.key) //check client/X is an admin and isn't the sender or recipient X << "PM: [key_name(src, X, 0)]->[key_name(C, X, 0)]: \blue [msg]" //inform X