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:
Poojawa
2016-09-24 22:44:17 -05:00
committed by GitHub
parent f230203564
commit 4a51c6884f
7 changed files with 410 additions and 14 deletions
+4
View File
@@ -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
+36 -11
View File
@@ -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.")
+52 -3
View File
@@ -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
+312
View File
@@ -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"]"