mirror of
https://github.com/Bubberstation/Bubberstation.git
synced 2026-01-26 17:11:52 +00:00
Adminhelps now use it so that they can cancel the timer to return the admin help verb. Adminhelps now allow admins to reject the adminhelp, giving the user back the verb and a message telling them how to construct a better admin help.
143 lines
5.2 KiB
Plaintext
143 lines
5.2 KiB
Plaintext
/client/var/adminhelptimerid = 0
|
|
|
|
/client/proc/giveadminhelpverb()
|
|
src.verbs |= /client/verb/adminhelp
|
|
adminhelptimerid = 0
|
|
|
|
//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","of","monkey","alien","as")
|
|
|
|
|
|
|
|
/client/verb/adminhelp(msg as text)
|
|
set category = "Admin"
|
|
set name = "Adminhelp"
|
|
|
|
if(say_disabled) //This is here to try to identify lag problems
|
|
usr << "<span class='danger'>Speech is currently admin-disabled.</span>"
|
|
return
|
|
|
|
//handle muting and automuting
|
|
if(prefs.muted & MUTE_ADMINHELP)
|
|
src << "<span class='danger'>Error: Admin-PM: You cannot send adminhelps (Muted).</span>"
|
|
return
|
|
if(src.handle_spam_prevention(msg,MUTE_ADMINHELP))
|
|
return
|
|
|
|
//clean the input msg
|
|
if(!msg) return
|
|
msg = sanitize(copytext(msg,1,MAX_MESSAGE_LEN))
|
|
if(!msg) return
|
|
var/original_msg = msg
|
|
|
|
//remove out adminhelp verb temporarily to prevent spamming of admins.
|
|
src.verbs -= /client/verb/adminhelp
|
|
adminhelptimerid = addtimer(src,"giveadminhelpverb",1200) //2 minute cooldown of admin helps
|
|
|
|
//explode the input msg into a list
|
|
var/list/msglist = text2list(msg, " ")
|
|
|
|
//generate keywords lookup
|
|
var/list/surnames = list()
|
|
var/list/forenames = list()
|
|
var/list/ckeys = list()
|
|
for(var/mob/M in mob_list)
|
|
var/list/indexing = list(M.real_name, M.name)
|
|
if(M.mind) indexing += M.mind.name
|
|
|
|
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
|
|
//forenames
|
|
for(var/i=1, i<surname_found, i++)
|
|
var/word = ckey(L[i])
|
|
if(word)
|
|
forenames[word] = M
|
|
//ckeys
|
|
ckeys[M.ckey] = M
|
|
|
|
var/ai_found = 0
|
|
msg = ""
|
|
var/list/mobs_found = list()
|
|
for(var/original_word in msglist)
|
|
var/word = ckey(original_word)
|
|
if(word)
|
|
if(!(word in adminhelp_ignored_words))
|
|
if(word == "ai")
|
|
ai_found = 1
|
|
else
|
|
var/mob/found = ckeys[word]
|
|
if(!found)
|
|
found = surnames[word]
|
|
if(!found)
|
|
found = forenames[word]
|
|
if(found)
|
|
if(!(found in mobs_found))
|
|
mobs_found += found
|
|
if(!ai_found && isAI(found))
|
|
ai_found = 1
|
|
msg += "<b><font color='black'>[original_word] (<A HREF='?_src_=holder;adminmoreinfo=\ref[found]'>?</A>) (<A HREF='?_src_=holder;adminplayerobservefollow=\ref[found]'>FLW</A>)</font></b> "
|
|
continue
|
|
msg += "[original_word] "
|
|
|
|
if(!mob) return //this doesn't happen
|
|
|
|
var/ref_mob = "\ref[mob]"
|
|
var/ref_client = "\ref[src]"
|
|
msg = "<span class='adminnotice'><b><font color=red>HELP: </font>[key_name_admin(src)] (<A HREF='?_src_=holder;adminmoreinfo=[ref_mob]'>?</A>) (<A HREF='?_src_=holder;adminplayeropts=[ref_mob]'>PP</A>) (<A HREF='?_src_=vars;Vars=[ref_mob]'>VV</A>) (<A HREF='?_src_=holder;subtlemessage=[ref_mob]'>SM</A>) (<A HREF='?_src_=holder;adminplayerobservefollow=[ref_mob]'>FLW</A>) (<A HREF='?_src_=holder;traitor=[ref_mob]'>TP</A>)[ai_found ? " (<A HREF='?_src_=holder;adminchecklaws=[ref_mob]'>CL</A>)" : ""] (<A HREF='?_src_=holder;rejectadminhelp=[ref_client]'>REJT</A>):</b> [msg]</span>"
|
|
|
|
//send this msg to all admins
|
|
|
|
for(var/client/X in admins)
|
|
if(X.prefs.toggles & SOUND_ADMINHELP)
|
|
X << 'sound/effects/adminhelp.ogg'
|
|
X << msg
|
|
|
|
|
|
//show it to the person adminhelping too
|
|
src << "<span class='adminnotice'>PM to-<b>Admins</b>: [original_msg]</span>"
|
|
|
|
//send it to irc if nobody is on and tell us how many were on
|
|
var/admin_number_present = send2irc_adminless_only(ckey,original_msg)
|
|
log_admin("HELP: [key_name(src)]: [original_msg] - heard by [admin_number_present] non-AFK admins who have +BAN.")
|
|
feedback_add_details("admin_verb","AH") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc!
|
|
return
|
|
|
|
/proc/send2irc_adminless_only(source, msg, requiredflags = R_BAN)
|
|
var/admin_number_total = 0 //Total number of admins
|
|
var/admin_number_afk = 0 //Holds the number of admins who are afk
|
|
var/admin_number_ignored = 0 //Holds the number of admins without +BAN (so admins who are not really admins)
|
|
var/admin_number_decrease = 0 //Holds the number of admins with are afk, ignored or both
|
|
for(var/client/X in admins)
|
|
admin_number_total++;
|
|
var/invalid = 0
|
|
if(requiredflags != 0 && !check_rights_for(X, requiredflags))
|
|
admin_number_ignored++
|
|
invalid = 1
|
|
if(X.is_afk())
|
|
admin_number_afk++
|
|
invalid = 1
|
|
if(X.holder.fakekey)
|
|
admin_number_ignored++
|
|
invalid = 1
|
|
if(invalid)
|
|
admin_number_decrease++
|
|
var/admin_number_present = admin_number_total - admin_number_decrease //Number of admins who are neither afk nor invalid
|
|
if(admin_number_present <= 0)
|
|
if(!admin_number_afk && !admin_number_ignored)
|
|
send2irc(source, "[msg] - No admins online")
|
|
else
|
|
send2irc(source, "[msg] - All admins AFK ([admin_number_afk]/[admin_number_total]) or skipped ([admin_number_ignored]/[admin_number_total])")
|
|
return admin_number_present
|
|
|
|
/proc/send2irc(msg,msg2)
|
|
if(config.useircbot)
|
|
shell("python nudge.py [msg] [msg2]")
|
|
return |