Adds SDQL chat command (#33366)

Allow's calling SDQL from bots supporting the CHAT system API
This commit is contained in:
Jordan Brown
2017-12-14 16:43:54 -05:00
committed by CitadelStationBot
parent a22b225015
commit 253a3d519e
3 changed files with 30 additions and 6 deletions
+16
View File
@@ -82,6 +82,22 @@ GLOBAL_LIST(round_end_notifiees)
GLOB.round_end_notifiees[sender] = TRUE
return "I will notify [sender] when the round ends."
/datum/server_tools_command/sdql
name = "sdql"
help_text = "Runs an SDQL query"
admin_only = TRUE
/datum/server_tools_command/sdql/Run(sender, params)
if(GLOB.AdminProcCaller)
return "Unable to run query, another admin proc call is in progress. Try again later."
GLOB.AdminProcCaller = "CHAT_[sender]" //_ won't show up in ckeys so it'll never match with a real admin
var/list/results = world.SDQL2_query(params, GLOB.AdminProcCaller, GLOB.AdminProcCaller)
if(!results)
return "Query produced no output"
var/list/text_res = results.Copy(1, 3)
var/list/refs = results.len > 3 ? results.Copy(4) : null
. = "[text_res.Join("\n")][refs ? "\nRefs: [refs.Join(" ")]" : ""]"
/datum/server_tools_command/reload_admins
name = "reload_admins"
help_text = "Forces the server to reload admins."
+11 -5
View File
@@ -24,10 +24,14 @@
message_admins("<span class='danger'>ERROR: Non-admin [key_name(usr, usr.client)] attempted to execute a SDQL query!</span>")
log_admin("Non-admin [usr.ckey]([usr]) attempted to execute a SDQL query!")
return FALSE
var/list/results = world.SDQL2_query(query_text, key_name_admin(usr), "[usr.ckey]([usr])")
for(var/I in 1 to 3)
to_chat(usr, results[I])
/world/proc/SDQL2_query(query_text, log_entry1, log_entry2)
var/query_log = "executed SDQL query: \"[query_text]\"."
message_admins("[key_name_admin(usr)] [query_log]")
query_log = "[usr.ckey]([usr]) [query_log]"
message_admins("[log_entry1] [query_log]")
query_log = "[log_entry2] [query_log]"
log_game(query_log)
NOTICE(query_log)
var/objs_all = 0
@@ -49,6 +53,7 @@
if(!querys || querys.len < 1)
return
var/list/refs = list()
for(var/list/query_tree in querys)
var/list/from_objs = list()
var/list/select_types = list()
@@ -100,6 +105,7 @@
var/text = ""
for(var/datum/t in objs)
text += SDQL_gen_vv_href(t)
refs[REF(t)] = TRUE
CHECK_TICK
usr << browse(text, "window=SDQL-result")
@@ -112,9 +118,9 @@
var/end_time = REALTIMEOFDAY
end_time -= start_time
to_chat(usr, "<span class='admin'>SDQL query results: [query_text]</span>")
to_chat(usr, "<span class='admin'>SDQL query completed: [objs_all] objects selected by path, and [objs_eligible] objects executed on after WHERE filtering if applicable.</span>")
to_chat(usr, "<span class='admin'>SDQL query took [DisplayTimeText(end_time)] to complete.</span>")
return list("<span class='admin'>SDQL query results: [query_text]</span>",\
"<span class='admin'>SDQL query completed: [objs_all] objects selected by path, and [objs_eligible] objects executed on after WHERE filtering if applicable.</span>",\
"<span class='admin'>SDQL query took [DisplayTimeText(end_time)] to complete.</span>") + refs
/proc/SDQL_qdel_datum(datum/d)
qdel(d)
+3 -1
View File
@@ -110,7 +110,9 @@ GLOBAL_PROTECT(LastAdminCalledProc)
/proc/WrapAdminProcCall(target, procname, list/arguments)
var/current_caller = GLOB.AdminProcCaller
var/ckey = usr.client.ckey
var/ckey = usr ? usr.client.ckey : GLOB.AdminProcCaller
if(!ckey)
CRASH("WrapAdminProcCall with no ckey: [target] [procname] [english_list(arguments)]")
if(current_caller && current_caller != ckey)
to_chat(usr, "<span class='adminnotice'>Another set of admin called procs are still running, your proc will be run after theirs finish.</span>")
UNTIL(!GLOB.AdminProcCaller)