-
-
Notifications
You must be signed in to change notification settings - Fork 1.2k
/
centcom_ban_db.dm
117 lines (100 loc) · 4.56 KB
/
centcom_ban_db.dm
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
// CCBDB = CentCom Ban DB
// This file contains procs for handling all requests to the CCBDB API, hosted by Bobbahbrown
// API Documentation: https://centcom.melonmesa.com/swagger/index.html
// Please refer to said documentation before editing any of the stuff in here, otherwise it will likely break
/**
* CCBDB Lookup Initiator
*
* Checks the configuration before invoking the request to the CCBDB server.
*
* Arguments:
* * ckey - ckey to be looked up
*/
/datum/admins/proc/create_ccbdb_lookup(ckey)
// Bail if disabled
if(!GLOB.configuration.url.centcom_ban_db_url)
to_chat(usr, "<span class='warning'>The CentCom Ban DB lookup is disabled. Please inform a maintainer or server host.</span>")
return
// Bail if no ckey is supplied
if(!ckey)
return
var/datum/callback/cb = CALLBACK(src, TYPE_PROC_REF(/datum/admins, ccbdb_lookup_callback), usr, ckey)
SShttp.create_async_request(RUSTG_HTTP_METHOD_GET, "[GLOB.configuration.url.centcom_ban_db_url][ckey]", proc_callback=cb)
/**
* CCBDB Lookup Callback
*
* Callback assigned in [/datum/admins/proc/create_ccbdb_lookup] for async operations without a sleep()
*
* Arguments:
* * user - Mob calling the lookup so the UI can be opened
* * ckey - Ckey being looked up
* * response - [/datum/http_response] passed through from [SShttp]
*/
/datum/admins/proc/ccbdb_lookup_callback(mob/user, ckey, datum/http_response/response)
// If the admin DC'd during the lookup, dont try and do things
if(!user)
return
// Bail if it errored
if(response.errored)
to_chat(user, "<span class='warning'>Error connecting to CentCom Ban DB. Please inform a maintainer or server host.</span>")
return
// Bail if the code isnt 200
if(response.status_code != 200)
to_chat(user, "<span class='warning'>Error performing CentCom Ban DB lookup (Code: [response.status_code])</span>")
return
var/list/popup_data = list()
// A body of "[]" means there were no bans on record for the user
if(response.body == "\[]")
popup_data += "<center><h3>0 bans detected for [ckey]</h3></center>"
else
var/list/bans = list()
// Wrap this in try/catch because JSON is a finnicky bastard
try
bans = json_decode(response.body)
// Yes I threw a ternary in because I am that obsessed over OCD
popup_data += "<center><h3>[length(bans)] ban[length(bans) == 1 ? "" : "s"] detected for [ckey]</h3></center>"
// These vars are also just for OCD (Adding a <hr> between each ban but the last)
var/total_bans = length(bans)
var/index = 0
for(var/list/ban in bans)
index++
// For anyone else who edits this. SANITIZE ALL THE DATA. OTHER SERVERS MAY HAVE BAD ACTORS WHO TRY AND XSS PEOPLE.
popup_data += "<b>Server:</b> [sanitize(ban["sourceName"])] ([sanitize(ban["sourceRoleplayLevel"])] RP)<br>"
var/ban_status
// If the ban is active, its, well, active
if(ban["active"] == TRUE) // The == TRUE is intentional here. Dont remove it.
ban_status = "<font color='red'>Ban Active</font>"
// If they have an entry of being unbanned by someone, its been appealed
else if(ban["unbannedBy"])
ban_status = "<font color='green'>Ban Appealed</font>"
else
ban_status = "<font color='cyan'>Ban Expired</font>"
popup_data += "<b>Status:</b> [ban_status]<br>"
// All the other stats
popup_data += "<b>Ban Type:</b> [sanitize(ban["type"])]<br>"
popup_data += "<b>Banning Admin:</b> [sanitize(ban["bannedBy"])]<br>"
popup_data += "<b>Ban Date:</b> [sanitize(ban["bannedOn"])]<br>"
var/expiration = ban["expires"]
popup_data += "<b>Expires:</b> [expiration ? "[sanitize(expiration)]" : "Permanent"]<br>"
popup_data += "<b>Ban Reason:</b> [sanitize(ban["reason"])]<br>"
// If its a job ban, tell the admin the job list
if(ban["type"] == "Job")
var/list/jobs = ban["jobs"]
popup_data += "<b>Jobs: </b>[sanitize(english_list(jobs))]<br>"
// Add a newline between bans if its not the last one
if(index != total_bans)
popup_data += "<hr>"
catch
to_chat(user, "<span class='warning'>Error parsing JSON data from CentCom Ban DB lookup. Please inform a maintainer.</span>")
return
var/datum/browser/popup = new(user, "ccbdblookup-[ckey]", "<div align='center'>CC Ban DB Lookup - [ckey]</div>", 700, 600)
popup.set_content(popup_data.Join())
popup.open(FALSE)
// Just a simple verb so admins can do manual lookups
/client/proc/ccbdb_lookup_ckey()
set name = "Global Ban DB Lookup"
set category = "Admin"
if(!check_rights(R_ADMIN))
return
var/input_ckey = input(usr, "Please enter a ckey to lookup", "Global Ban DB Lookup")
holder.create_ccbdb_lookup(input_ckey)