Admin logging (#53)
* sync (#3) * shuttle auto call * Merge /vore into /master (#39) * progress * Compile errors fixed No idea if it's test worthy tho as conflicts with race overhaul and narky removal. * Update admins.txt * efforts continue Fuck grab code, seriously * grab code is cancer * Execute the Narkism Do not hesitate. Show no mercy. * holy shit grab code is awful * have I bitched about grab code My bitching, let me show you it * código de agarre es una mierda No really it is * yeah I don't even know anymore. * Lolnope. Fuck grab code * I'm not even sure what to fix anymore * Self eating is not an acceptable fate * Taste the void, son. * My code doesn't pass it's own sanity check. Maybe it's a sign of things to come. * uncommented and notes * It Works and I Don't Know Why (#38) * shuttle auto call * it works and I don't know why * Admin ticket system * admin rights
This commit is contained in:
@@ -22,6 +22,10 @@ var/list/admin_verbs_default = list(
|
||||
/client/proc/stop_sounds
|
||||
)
|
||||
var/list/admin_verbs_admin = list(
|
||||
/client/proc/resolvehandlingahelp,
|
||||
/client/proc/listhandlingahelp,
|
||||
/datum/adminticket/proc/listunresolvedtickets,
|
||||
/datum/adminticket/proc/listtickets,
|
||||
/client/proc/player_panel_new, /*shows an interface for all players, with links to various panels*/
|
||||
/client/proc/invisimin, /*allows our mob to go invisible/visible*/
|
||||
// /datum/admins/proc/show_traitor_panel, /*interface which shows a mob's mind*/ -Removed due to rare practical use. Moved to debug verbs ~Errorage
|
||||
|
||||
@@ -83,25 +83,49 @@
|
||||
if(src.handle_spam_prevention(msg,MUTE_ADMINHELP))
|
||||
return
|
||||
|
||||
var/ref_mob = "\ref[mob]"
|
||||
for(var/datum/adminticket/T in admintickets)
|
||||
if(T.permckey == src.ckey && T.resolved == "No")
|
||||
if(alert(usr,"You already have an adminhelp open, would you like to bump it?", "Bump Adminhelp", "Yes", "No") == "Yes")
|
||||
T.logs += "[src.ckey] has bumped this adminhelp!"
|
||||
if(T.admin == "N/A")
|
||||
usr << "<b>Due to the fact your Adminhelp had no assigned admin, admins have been pinged.</b>"
|
||||
message_admins("[src.ckey] has bumped their adminhelp #[T.ID], still no assigned admin!")
|
||||
msg = "<span class='adminnotice'><b><font color=red>ADMINHELP: </font><A HREF='?priv_msg=[ckey];ahelp_reply=1'>[key_name(src)]</A> (<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;traitor=[ref_mob]'>TP</A>) (<A HREF='?_src_=holder;adminplayerobservefollow=[ref_mob]'>FLW</A>) (<a href='?src=\ref[T];resolve=\ref[T]'>R</a>):</b> [T.msg]</span>"
|
||||
for(var/client/X in admins)
|
||||
if(X.prefs.toggles & SOUND_ADMINHELP)
|
||||
X << 'sound/effects/adminhelp.ogg'
|
||||
X << msg
|
||||
else
|
||||
usr << "<b>Admins have been notified.</b>"
|
||||
message_admins("[src.ckey] has bumped their adminhelp #[T.ID].")
|
||||
src.verbs -= /client/verb/adminhelp
|
||||
adminhelptimerid = addtimer(src,"giveadminhelpverb",1200, FALSE)
|
||||
return
|
||||
usr << "<b>Thank you for your patience.</b>"
|
||||
return
|
||||
|
||||
src.verbs -= /client/verb/adminhelp
|
||||
adminhelptimerid = addtimer(src,"giveadminhelpverb",1200, FALSE)
|
||||
|
||||
//clean the input msg
|
||||
if(!msg)
|
||||
return
|
||||
if(!msg) return
|
||||
msg = sanitize(copytext(msg,1,MAX_MESSAGE_LEN))
|
||||
if(!msg) return
|
||||
var/original_msg = msg
|
||||
|
||||
//remove our adminhelp verb temporarily to prevent spamming of admins.
|
||||
src.verbs -= /client/verb/adminhelp
|
||||
adminhelptimerid = addtimer(src, "giveadminhelpverb", 1200, FALSE) //2 minute cooldown of admin helps
|
||||
|
||||
msg = keywords_lookup(msg)
|
||||
|
||||
if(!mob)
|
||||
return //this doesn't happen
|
||||
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><A HREF='?priv_msg=[ckey];ahelp_reply=1'>[key_name(src)]</A> (<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>) (<A HREF='?_src_=holder;rejectadminhelp=[ref_client]'>REJT</A>):</b> [msg]</span>"
|
||||
createticket(src, msg, src.ckey, mob)
|
||||
var/datum/adminticket/ticket
|
||||
|
||||
for(var/datum/adminticket/T in admintickets)
|
||||
if(T.permckey == src.ckey)
|
||||
ticket = T
|
||||
|
||||
msg = "<span class='adminnotice'><b><font color=red>ADMINHELP: </font><A HREF='?priv_msg=[ckey];ahelp_reply=1'>[key_name(src)]</A> (<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;traitor=[ref_mob]'>TP</A>) (<A HREF='?_src_=holder;adminplayerobservefollow=[ref_mob]'>FLW</A>) (<a href='?src=\ref[ticket];resolve=\ref[ticket]'>R</a>):</b> [msg]</span>"
|
||||
|
||||
//send this msg to all admins
|
||||
|
||||
@@ -114,6 +138,7 @@
|
||||
//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.")
|
||||
|
||||
@@ -48,11 +48,46 @@
|
||||
if(holder)
|
||||
src << "<font color='red'>Error: Admin-PM: Client not found.</font>"
|
||||
return
|
||||
message_admins("[key_name_admin(src)] has started replying to [key_name(C, 0, 0)]'s admin help.")
|
||||
var/datum/adminticket/ticket
|
||||
|
||||
for(var/datum/adminticket/T in admintickets)
|
||||
if(T.permckey == C.ckey)
|
||||
ticket = T
|
||||
|
||||
if(ticket)
|
||||
if(ticket.active == "No" && ticket.replying == 0)
|
||||
message_admins("[key_name_admin(src)] has been assigned to [key_name(C, 0, 0)]'s admin help. This is the first reply. ([ticket.uID])")
|
||||
ticket.replying = 1
|
||||
ticket.user << "<b>[src.ckey] has been assigned to your admin help, please await a reply.</b>"
|
||||
else if(ticket.replying == 1)
|
||||
src << "<b>Error, this ticket is already being replied to!</b>"
|
||||
return
|
||||
else if(ticket.admin != "N/A" && ticket.replying == 0)
|
||||
if(ticket.admin != src.ckey)
|
||||
if(alert(src, "This adminhelp already has an admin assigned: [ticket.admin]! Are you sure you want to take it over?", "Conflict", "Yes", "No") == "Yes")
|
||||
message_admins("[key_name_admin(src)] has been assigned to [key_name(C, 0, 0)]'s admin help. Override: [ticket.admin]. ([ticket.uID])")
|
||||
ticket.user << "<b>[src.ckey] has been assigned to your admin help, please await a reply.</b>"
|
||||
ticket.replying = 1
|
||||
else
|
||||
message_admins("[key_name_admin(src)] has started replying to [key_name(C, 0, 0)]'s admin help. They did not have an active ahelp.")
|
||||
|
||||
var/msg = input(src,"Message:", "Private message to [key_name(C, 0, 0)]") as text|null
|
||||
|
||||
if (!msg)
|
||||
message_admins("[key_name_admin(src)] has cancelled their reply to [key_name(C, 0, 0)]'s admin help.")
|
||||
if(ticket)
|
||||
if(ticket.admin != src.ckey)
|
||||
message_admins("[key_name_admin(src)] has been unassigned from [key_name(C, 0, 0)]'s admin help. Cancelled reply. ([ticket.uID])")
|
||||
ticket.user << "<b>[src.ckey] has been unassigned from your admin help. (reply cancelled)</b>"
|
||||
ticket.replying = 0
|
||||
else
|
||||
message_admins("[key_name_admin(src)] has cancelled their reply to [key_name(C, 0, 0)]'s admin help. No active ahelp.")
|
||||
return
|
||||
|
||||
if(ticket)
|
||||
ticket.replying = 0
|
||||
ticket.admin = src.ckey
|
||||
ticket.active = "Yes"
|
||||
|
||||
cmd_admin_pm(whom, msg)
|
||||
|
||||
//takes input from cmd_admin_pm_context, cmd_admin_pm_panel or /client/Topic and sends them a PM.
|
||||
@@ -106,10 +141,16 @@
|
||||
|
||||
if(C.holder)
|
||||
if(holder) //both are admins
|
||||
for(var/datum/adminticket/T in admintickets)
|
||||
if(T.permckey == C.ckey && T.resolved == "No")
|
||||
T.logs += "<span class='notice'>[src] TO [C]: [msg] </span>"
|
||||
C << "<font color='red'>Admin PM from-<b>[key_name(src, C, 1)]</b>: [keywordparsedmsg]</font>"
|
||||
src << "<font color='blue'>Admin PM to-<b>[key_name(C, src, 1)]</b>: [keywordparsedmsg]</font>"
|
||||
|
||||
else //recipient is an admin but sender is not
|
||||
for(var/datum/adminticket/T in admintickets)
|
||||
if(T.permckey == C.ckey && T.resolved == "No")
|
||||
T.logs += "<span class='notice'>[src] TO [C]: [msg] </span>"
|
||||
C << "<font color='red'>Reply PM from-<b>[key_name(src, C, 1)]</b>: [keywordparsedmsg]</font>"
|
||||
src << "<font color='blue'>PM to-<b>Admins</b>: [msg]</font>"
|
||||
|
||||
@@ -119,11 +160,16 @@
|
||||
|
||||
else
|
||||
if(holder) //sender is an admin but recipient is not. Do BIG RED TEXT
|
||||
|
||||
C << "<font color='red' size='4'><b>-- Administrator private message --</b></font>"
|
||||
C << "<font color='red'>Admin PM from-<b>[key_name(src, C, 0)]</b>: [msg]</font>"
|
||||
C << "<font color='red'><i>Click on the administrator's name to reply.</i></font>"
|
||||
src << "<font color='blue'>Admin PM to-<b>[key_name(C, src, 1)]</b>: [msg]</font>"
|
||||
|
||||
for(var/datum/adminticket/T in admintickets)
|
||||
if(T.permckey == C.ckey && T.resolved == "No")
|
||||
T.logs += "<span class='notice'>[src] TO [C]: [msg] </span>"
|
||||
|
||||
//always play non-admin recipients the adminhelp sound
|
||||
C << 'sound/effects/adminhelp.ogg'
|
||||
|
||||
@@ -135,7 +181,10 @@
|
||||
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
|
||||
C.cmd_admin_pm(sender,reply)
|
||||
for(var/datum/adminticket/T in admintickets)
|
||||
if(T.permckey == C.ckey && T.resolved == "No")
|
||||
T.logs += "<span class='danger'>[sendername] TO [C]: [msg] </span>" //sender is still about, let's reply to them
|
||||
else
|
||||
adminhelp(reply) //sender has left, adminhelp instead
|
||||
return
|
||||
|
||||
@@ -0,0 +1,312 @@
|
||||
/datum/adminticket
|
||||
var/ID = "" //ID of the ticket, very important as its used to find adminhelps.
|
||||
var/user = "" //The user of the ahelp.
|
||||
var/uckey //The saved ckey of the adminheloing user.
|
||||
var/admin = "N/A" //The handling admin? Like come on.
|
||||
var/msg = "" //The adminhelp message.
|
||||
var/resolved = "No" //Is it resolved? Its much easier to have a "Yes" or a "No", as you can directly concat it into strings making life that much easier.
|
||||
var/permckey = "" //The perm ckey, never removed essentially.
|
||||
var/permuser = "" //Same as above!
|
||||
var/uID = "" //The UNIQUE id, made by putting part of the ckey and the ID together. Used internally in code.
|
||||
var/active = "No" //Is the adminhelp active, eg admin responded? This is the same as above, it makes life easier.
|
||||
var/logs = list() //The logs of the adminhelp.
|
||||
var/replying = 0 //Is someone responding to the adminhelp?
|
||||
var/mob //The mob adminhelping mob.
|
||||
|
||||
/client/proc/list_ahelps(user, resolved)
|
||||
if(!check_rights(R_BAN))
|
||||
src << "<font color='red'>Error: Only administrators may use this command.</font>"
|
||||
return
|
||||
|
||||
if(resolved)
|
||||
user << "Current Ahelps:"
|
||||
for(var/datum/adminticket/T in admintickets)
|
||||
var/ref_mob = "\ref[T.mob]"
|
||||
usr << "<span class='adminnotice'><b><font color=red>#[T.ID] By:</font> <A HREF='?priv_msg=[T.permckey];ahelp_reply=1'>[key_name(T.permuser)]</A></b><b> Ckey:</b> [T.permckey] <b>Name:</b> [T.permuser] <b>Unique ID:</b> [T.uID]</span>"
|
||||
usr << " <b>Controls:</b> (<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;traitor=[ref_mob]'>TP</A>) (<A HREF='?_src_=holder;adminplayerobservefollow=[ref_mob]'>FLW</A>)"
|
||||
usr << " <b>Message:</b> [T.msg]"
|
||||
usr << " <b>Handling Admin:</b> [T.admin]"
|
||||
usr << " <b>Replied To:</b> [T.active]/<b><a href='?src=\ref[T];view_logs=\ref[T]'>(LOGS)</a></b>"
|
||||
if(T.resolved == "No")
|
||||
usr << " <b>Resolved:</b> [T.resolved] <a href='?src=\ref[T];resolve=\ref[T]'>(Resolve)</a>"
|
||||
else
|
||||
usr << " <b>Resolved:</b> [T.resolved] <a href='?src=\ref[T];resolve=\ref[T]'>(Unresolve)</a>"
|
||||
|
||||
else
|
||||
user << "Current Unresolved Ahelps:"
|
||||
for(var/datum/adminticket/T in admintickets)
|
||||
if(T.resolved == "No")
|
||||
var/ref_mob = "\ref[T.mob]"
|
||||
usr << "<span class='adminnotice'><b><font color=red>#[T.ID] By:</font> <A HREF='?priv_msg=[T.permckey];ahelp_reply=1'>[key_name(T.permuser)]</A></b><b> Ckey:</b> [T.permckey] <b>Name:</b> [T.permuser] <b>Unique ID:</b> [T.uID]</span>"
|
||||
usr << " <b>Controls:</b> (<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;traitor=[ref_mob]'>TP</A>) (<A HREF='?_src_=holder;adminplayerobservefollow=[ref_mob]'>FLW</A>)"
|
||||
usr << " <b>Message:</b> [T.msg]"
|
||||
usr << " <b>Handling Admin:</b> [T.admin]"
|
||||
usr << " <b>Replied To:</b> [T.active]/<b><a href='?src=\ref[T];view_logs=\ref[T]'>(LOGS)</a></b>"
|
||||
if(T.resolved == "No")
|
||||
usr << " <b>Resolved:</b> [T.resolved] <a href='?src=\ref[T];resolve=\ref[T]'>(Resolve)</a>"
|
||||
else
|
||||
usr << " <b>Resolved:</b> [T.resolved] <a href='?src=\ref[T];resolve=\ref[T]'>(Unresolve)</a>"
|
||||
|
||||
/client/proc/ahelp_count(modifier)
|
||||
var/amount
|
||||
for(var/datum/adminticket/T in admintickets)
|
||||
switch(modifier)
|
||||
if(0)
|
||||
if(T.resolved == "No")
|
||||
amount++
|
||||
if(1)
|
||||
if(T.resolved == "Yes")
|
||||
amount++
|
||||
if(2)
|
||||
amount++
|
||||
|
||||
return amount
|
||||
|
||||
|
||||
/datum/adminticket/proc/listtickets()
|
||||
set category = "Admin Help"
|
||||
set name = "List Adminhelps"
|
||||
set desc = "List all current adminhelps"
|
||||
|
||||
if(!check_rights(R_BAN))
|
||||
src << "<font color='red'>Error: Only administrators may use this command.</font>"
|
||||
return
|
||||
|
||||
var/count = 0
|
||||
|
||||
for(var/datum/adminticket/T in admintickets)
|
||||
count++
|
||||
|
||||
usr << "<b>Current Ahelps:</b>"
|
||||
|
||||
if(count < 1)
|
||||
usr << " None"
|
||||
return
|
||||
|
||||
for(var/datum/adminticket/T in admintickets)
|
||||
var/ref_mob = "\ref[T.mob]"
|
||||
usr << "<span class='adminnotice'><b><font color=red>#[T.ID] By:</font> <A HREF='?priv_msg=[T.permckey];ahelp_reply=1'>[key_name(T.permuser)]</b></A><b> Ckey:</b> [T.permckey] <b>Name:</b> [T.permuser] <b>Unique ID:</b> [T.uID]</span>"
|
||||
usr << " <b>Controls:</b> (<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;traitor=[ref_mob]'>TP</A>) (<A HREF='?_src_=holder;adminplayerobservefollow=[ref_mob]'>FLW</A>)"
|
||||
usr << " <b>Message:</b> [T.msg]"
|
||||
usr << " <b>Handling Admin:</b> [T.admin]"
|
||||
usr << " <b>Replied To:</b> [T.active]/<b><a href='?src=\ref[T];view_logs=\ref[T]'>(LOGS)</a></b>"
|
||||
if(T.resolved == "No")
|
||||
usr << " <b>Resolved:</b> [T.resolved] <a href='?src=\ref[T];resolve=\ref[T]'>(Resolve)</a>"
|
||||
else
|
||||
usr << " <b>Resolved:</b> [T.resolved] <a href='?src=\ref[T];resolve=\ref[T]'>(Unresolve)</a>"
|
||||
|
||||
/datum/adminticket/proc/listunresolvedtickets()
|
||||
set category = "Admin Help"
|
||||
set name = "List Unresolved Adminhelps"
|
||||
set desc = "List all current unresolved adminhelps"
|
||||
|
||||
if(!check_rights(R_BAN))
|
||||
src << "<font color='red'>Error: Only administrators may use this command.</font>"
|
||||
return
|
||||
|
||||
var/count = 0
|
||||
|
||||
for(var/datum/adminticket/T in admintickets)
|
||||
if(T.resolved =="No")
|
||||
count++
|
||||
|
||||
usr << "<b>Current Unresolved Ahelps:</b>"
|
||||
|
||||
if(count < 1)
|
||||
usr << " None"
|
||||
return
|
||||
|
||||
for(var/datum/adminticket/T in admintickets)
|
||||
if(T.resolved == "No")
|
||||
var/ref_mob = "\ref[T.mob]"
|
||||
usr << "<span class='adminnotice'><b><font color=red>#[T.ID] By:</font> <A HREF='?priv_msg=[T.permckey];ahelp_reply=1'>[key_name(T.permuser)]</b></A><b> Ckey:</b> [T.permckey] <b>Name:</b> [T.permuser] <b>Unique ID:</b> [T.uID]</span>"
|
||||
usr << " <b>Controls:</b> (<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;traitor=[ref_mob]'>TP</A>) (<A HREF='?_src_=holder;adminplayerobservefollow=[ref_mob]'>FLW</A>)"
|
||||
usr << " <b>Message:</b> [T.msg]"
|
||||
usr << " <b>Handling Admin:</b> [T.admin]"
|
||||
usr << " <b>Replied To:</b> [T.active]/<b><a href='?src=\ref[T];view_logs=\ref[T]'>(LOGS)</a></b>"
|
||||
if(T.resolved == "No")
|
||||
usr << " <b>Resolved:</b> [T.resolved] <a href='?src=\ref[T];resolve=\ref[T]'>(Resolve)</a>"
|
||||
else
|
||||
usr << " <b>Resolved:</b> [T.resolved] <a href='?src=\ref[T];resolve=\ref[T]'>(Unresolve)</a>"
|
||||
|
||||
/client/proc/listhandlingahelp()
|
||||
set category = "Admin Help"
|
||||
set name = "View Handling Ahelps"
|
||||
set desc = "List all current handling ahelps"
|
||||
|
||||
if(!check_rights(R_BAN))
|
||||
src << "<font color='red'>Error: Only administrators may use this command.</font>"
|
||||
return
|
||||
|
||||
var/count = 0
|
||||
|
||||
for(var/datum/adminticket/T in admintickets)
|
||||
if(T.resolved == "No" && T.admin == ckey)
|
||||
count++
|
||||
|
||||
if(count < 1)
|
||||
usr << "<b>You don't have any ACTIVE ahelps!</b>"
|
||||
return
|
||||
|
||||
|
||||
|
||||
for(var/datum/adminticket/T in admintickets)
|
||||
if(T.resolved == "No" && T.admin == ckey)
|
||||
var/ref_mob = "\ref[T.mob]"
|
||||
usr << "<span class='adminnotice'><b><font color=red>#[T.ID] By:</font> <A HREF='?priv_msg=[T.permckey];ahelp_reply=1'>[key_name(T.permuser)]</A></b><b> Ckey:</b> [T.permckey] <b>Name:</b> [T.permuser] <b>Unique ID:</b> [T.uID]</span>"
|
||||
usr << " <b>Controls:</b> (<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;traitor=[ref_mob]'>TP</A>) (<A HREF='?_src_=holder;adminplayerobservefollow=[ref_mob]'>FLW</A>)"
|
||||
usr << " <b>Message:</b> [T.msg]"
|
||||
usr << " <b>Handling Admin:</b> [T.admin]"
|
||||
usr << " <b>Replied To:</b> [T.active]/<b><a href='?src=\ref[T];view_logs=\ref[T]'>(LOGS)</a></b>"
|
||||
if(T.resolved == "No")
|
||||
usr << " <b>Resolved:</b> [T.resolved] <a href='?src=\ref[T];resolve=\ref[T]'>(Resolve)</a>"
|
||||
else
|
||||
usr << " <b>Resolved:</b> [T.resolved] <a href='?src=\ref[T];resolve=\ref[T]'>(Unresolve)</a>"
|
||||
|
||||
/client/verb/viewmyahelp()
|
||||
set category = "Admin"
|
||||
set name = "View my Ahelps"
|
||||
set desc = "List your ahelps"
|
||||
|
||||
var/count = 0
|
||||
|
||||
for(var/datum/adminticket/T in admintickets)
|
||||
if(T.permckey == ckey)
|
||||
count++
|
||||
|
||||
if(count < 1)
|
||||
usr << "<b>You don't have any ahelps!</b>"
|
||||
return
|
||||
|
||||
usr << "<b>Resolved Ahelps</b>"
|
||||
|
||||
var/rpass = 0
|
||||
|
||||
for(var/datum/adminticket/T in admintickets)
|
||||
if(T.permckey == ckey && T.resolved == "Yes")
|
||||
rpass = 1
|
||||
usr << "<span class='adminnotice'><b><font color=red>Adminhelp ID: #[T.ID] </font></b></span>"
|
||||
usr << " <b>Message:</b> [T.msg]"
|
||||
usr << " <b>Handling Admin:</b> [T.admin]"
|
||||
usr << " <b>Replied To:</b> [T.active]/<b><a href='?src=\ref[T];view_logs=\ref[T]'>(LOGS)</a></b>"
|
||||
usr << " <b>Resolved:</b> [T.resolved]"
|
||||
|
||||
if(rpass == 0)
|
||||
usr << " None"
|
||||
|
||||
usr << "<b>Unresolved Ahelps</b>"
|
||||
|
||||
var/upass = 0
|
||||
|
||||
for(var/datum/adminticket/T in admintickets)
|
||||
if(T.permckey == ckey && T.resolved == "No")
|
||||
upass = 1
|
||||
usr << "<span class='adminnotice'><b><font color=red>Adminhelp ID: #[T.ID] </font></b></span>"
|
||||
usr << " <b>Message:</b> [T.msg]"
|
||||
usr << " <b>Handling Admin:</b> [T.admin]"
|
||||
usr << " <b>Replied To:</b> [T.active]/<b><a href='?src=\ref[T];view_logs=\ref[T]'>(LOGS)</a></b>"
|
||||
usr << " <b>Resolved:</b> [T.resolved]"
|
||||
|
||||
if(upass == 0)
|
||||
usr << " None"
|
||||
|
||||
/client/proc/createticket(player, message, uckey, mob)
|
||||
var/datum/adminticket/A = new()
|
||||
A.user = player
|
||||
A.msg = message
|
||||
A.uckey = uckey
|
||||
A.permckey = uckey
|
||||
A.permuser = A.user
|
||||
admintickets += A
|
||||
A.logs += "<b>ADMINHELP:</b> [A.permckey]([A.permuser]): [A.msg]"
|
||||
A.mob = mob
|
||||
|
||||
var/index = 0
|
||||
for(var/datum/adminticket/T in admintickets)
|
||||
index++
|
||||
T.ID = index
|
||||
T.uID = "[T.permckey][T.ID]"
|
||||
|
||||
/client/verb/resolveticketself()
|
||||
set category = "Admin"
|
||||
set name = "Resolve My Adminhelp"
|
||||
set desc = "Resolve my own adminhelp"
|
||||
|
||||
var/pass = 0
|
||||
var/datum/adminticket/ticket
|
||||
|
||||
for(var/datum/adminticket/T in admintickets)
|
||||
if(T.permckey == ckey && T.resolved != "Yes")
|
||||
T.resolved = "Yes"
|
||||
ticket = T
|
||||
pass = 1
|
||||
|
||||
switch(pass)
|
||||
if(1)
|
||||
src << "<b>You have resolved your current adminhelp.</b>"
|
||||
message_admins("[src] has resolved his adminhelp (#[ticket.ID])")
|
||||
if(0)
|
||||
src << "<b>Error, you do not have any active adminhelps.</b>"
|
||||
|
||||
/client/proc/resolvehandlingahelp()
|
||||
set category = "Admin Help"
|
||||
set name = "Resolve Handling Ahelp"
|
||||
set desc = "Resolve my own adminhelp"
|
||||
|
||||
if(!check_rights(R_BAN))
|
||||
src << "<font color='red'>Error: Only administrators may use this command.</font>"
|
||||
return
|
||||
|
||||
var/count = 0
|
||||
|
||||
var/datum/adminticket/ticket
|
||||
|
||||
for(var/datum/adminticket/T in admintickets)
|
||||
if(T.admin == ckey && T.resolved != "Yes")
|
||||
count++
|
||||
ticket = T
|
||||
|
||||
if(count >= 1)
|
||||
usr << "<b>Adminhelp #[ticket.ID]([ticket.uID]) resolved.</b>"
|
||||
message_admins("Adminhelp ID: #[ticket.ID]([ticket.uID]) was resolved by [usr.ckey]")
|
||||
ticket.user << "<b>Your adminhelp (#[ticket.ID]) has been resolved by [usr.ckey]</b>"
|
||||
ticket.user << 'sound/machines/twobeep.ogg'
|
||||
ticket.resolved = "Yes"
|
||||
|
||||
if(count < 1)
|
||||
usr << "<b>You are not currently handling any adminhelps!</b>"
|
||||
|
||||
/datum/adminticket/proc/viewlogs(NuID, mob/user)
|
||||
var/dat = "<h3>View Logs for ahelp [NuID]</h3>"
|
||||
var/datum/adminticket/ticket
|
||||
|
||||
var/pass = 0
|
||||
|
||||
for(var/datum/adminticket/T in admintickets)
|
||||
if(NuID == T.uID)
|
||||
ticket = T
|
||||
pass = 1
|
||||
|
||||
if(pass == 0)
|
||||
src << "Error, log system not found for [NuID]... "
|
||||
return
|
||||
|
||||
dat += "<table>"
|
||||
for(var/text in ticket.logs)
|
||||
dat += "<tr><td>[text]</td></tr>"
|
||||
dat += "</table>"
|
||||
|
||||
var/datum/browser/popup = new(user, "ahelp logs", ticket.permuser, 500, 500)
|
||||
popup.set_content(dat)
|
||||
popup.open()
|
||||
|
||||
/datum/adminticket/Topic(href, href_list)
|
||||
if(href_list["view_logs"])
|
||||
var/datum/adminticket/T = locate(href_list["view_logs"])
|
||||
viewlogs(T.uID, usr)
|
||||
if(href_list["resolve"])
|
||||
var/datum/adminticket/T = locate(href_list["resolve"])
|
||||
message_admins("Adminhelp ID: #[T.ID]([T.uID]) was [T.resolved == "Yes" ? "unresolved" : "resolved"] by [usr.ckey]")
|
||||
T.user << "<b>Your adminhelp (#[T.ID]) has been [T.resolved == "Yes" ? "unresolved" : "resolved"] by [usr.ckey]</b>"
|
||||
T.user << 'sound/machines/twobeep.ogg'
|
||||
T.resolved = "[T.resolved == "Yes" ? "No" : "Yes"]"
|
||||
Reference in New Issue
Block a user