//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 mob_list) 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) feedback_add_details("admin_verb","APMM") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! //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/observer/dead)) 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) feedback_add_details("admin_verb","APM") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! //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 = null) if(prefs.muted & MUTE_ADMINHELP) src << "Error: Private-Message: You are unable to use PM-s (muted)." return if(!istype(C,/client)) if(holder) src << "Error: Private-Message: Client not found." else src << "Error: Private-Message: Client not found. They may have lost connection, so try using an adminhelp!" return //get message text, limit it's length.and clean/escape html if(!msg) msg = input(src,"Message:", "Private message to [key_name(C, 0, holder ? 1 : 0)]") as text|null if(!msg) return if(!C) if(holder) src << "Error: Admin-PM: Client not found." else src << "Error: Private-Message: Client not found. They may have lost connection, so try using an adminhelp!" return //clean the message if it's not sent by a high-rank admin //todo: sanitize for all??? if(!check_rights(R_SERVER|R_DEBUG,0)) msg = sanitize(msg) if(!msg) return var/recieve_pm_type = "Player" if(holder) //mod PMs are maroon //PMs sent from admins and mods display their rank if(holder) if(!C.holder && holder && holder.fakekey) recieve_pm_type = "Admin" else recieve_pm_type = holder.rank else if(!C.holder) src << "Error: Admin-PM: Non-admin to non-admin PM communication is forbidden." return var/recieve_message if(holder && !C.holder) recieve_message = "-- Click the [recieve_pm_type]'s name to reply --\n" if(C.adminhelped) C << recieve_message C.adminhelped = 0 //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(0) //so we don't hold the caller proc up var/sender = src var/sendername = key var/reply = sanitize(input(C, msg,"[recieve_pm_type] 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 src << "" + create_text_tag("pm_out_alt", "PM", src) + " to [get_options_bar(C, holder ? 1 : 0, holder ? 1 : 0, 1)]: [msg]" C << "" + create_text_tag("pm_in", "", C) + " \[[recieve_pm_type] PM\] [get_options_bar(src, C.holder ? 1 : 0, C.holder ? 1 : 0, 1)]: [msg]" //play the recieving admin the adminhelp sound (if they have them enabled) //non-admins shouldn't be able to disable this if(C.is_preference_enabled(/datum/client_preference/holder/play_adminhelp_ping)) C << 'sound/effects/adminhelp.ogg' log_adminpm(msg,src,C) send2adminirc("Reply: [key_name(src)]->[key_name(C)]: [html_decode(msg)]") //we don't use message_admins here because the sender/receiver might get it too for(var/client/X in admins) //check client/X is an admin and isn't the sender or recipient if(X == C || X == src) continue if(X.key != key && X.key != C.key && (X.holder.rights & R_ADMIN|R_MOD|R_EVENT)) X << "" + create_text_tag("pm_other", "PM:", X) + " [key_name(src, X, 0)] to [key_name(C, X, 0)]: [msg]" /client/proc/cmd_admin_irc_pm(sender) if(prefs.muted & MUTE_ADMINHELP) src << "Error: Private-Message: You are unable to use PM-s (muted)." return var/msg = input(src,"Message:", "Reply private message to [sender] on IRC / 400 character limit") as text|null if(!msg) return sanitize(msg) // Handled on Bot32's end, unsure about other bots // if(length(msg) > 400) // TODO: if message length is over 400, divide it up into seperate messages, the message length restriction is based on IRC limitations. Probably easier to do this on the bots ends. // src << "Your message was not sent because it was more then 400 characters find your message below for ease of copy/pasting" // src << "[msg]" // return send2adminirc("PlayerPM to [sender] from [key_name(src)]: [html_decode(msg)]") src << "" + create_text_tag("pm_out_alt", "", src) + " to IRC-[sender]: [msg]" log_admin("PM: [key_name(src)]->IRC-[sender]: [msg]") for(var/client/X in admins) if(X == src) continue if(X.holder.rights & R_ADMIN|R_MOD) X << "" + create_text_tag("pm_other", "PM:", X) + " [key_name(src, X, 0)] to IRC-[sender]: [msg]"