Key instead of ckey for user facing logs and ui (#39009)

* converts to using key instead of ckey for user facing logs and ui

* more key_name for airlock wires

* futureproofing check for if key changes

* --onlyckeymatch script argument and fail/success counter

* fix
This commit is contained in:
Jordie
2018-08-11 02:15:50 +10:00
committed by GitHub
parent a5df026802
commit 0d7ef3ed65
32 changed files with 412 additions and 269 deletions

View File

@@ -93,7 +93,7 @@ with open("..\\config\\admins.txt") as admins_file:
matches = re.match("(.+)\\b\\s+=\\s+(.+)", line) matches = re.match("(.+)\\b\\s+=\\s+(.+)", line)
ckey = "".join((c for c in matches.group(1) if c not in ckeyformat)).lower() ckey = "".join((c for c in matches.group(1) if c not in ckeyformat)).lower()
rank = "".join((c for c in matches.group(2) if c not in ckeyExformat)) rank = "".join((c for c in matches.group(2) if c not in ckeyExformat))
cursor.execute("INSERT INTO {0} (ckey, rank) VALUES ('{1}', '{2}')".format(admin_table, ckey, rank)) cursor.execute("INSERT INTO {0} (ckey, rank) VALUES ('{1}', '{2}')".format(admin_table, ckey, rank))
db.commit() db.commit()
cursor.close() cursor.close()
print("Import complete.") print("Import complete.")

View File

@@ -1,15 +1,23 @@
Any time you make a change to the schema files, remember to increment the database schema version. Generally increment the minor number, major should be reserved for significant changes to the schema. Both values go up to 255. Any time you make a change to the schema files, remember to increment the database schema version. Generally increment the minor number, major should be reserved for significant changes to the schema. Both values go up to 255.
The latest database version is 4.4; The query to update the schema revision table is: The latest database version is 4.5; The query to update the schema revision table is:
INSERT INTO `schema_revision` (`major`, `minor`) VALUES (4, 4); INSERT INTO `schema_revision` (`major`, `minor`) VALUES (4, 5);
or or
INSERT INTO `SS13_schema_revision` (`major`, `minor`) VALUES (4, 4); INSERT INTO `SS13_schema_revision` (`major`, `minor`) VALUES (4, 5);
In any query remember to add a prefix to the table names if you use one. In any query remember to add a prefix to the table names if you use one.
---------------------------------------------------- ----------------------------------------------------
Version 4.5, 9 July 2018, by Jordie0608
Modified table `player`, adding column `byond_key` to store a user's key along with their ckey.
To populate this new column run the included script 'populate_key_2018-07', see the file for use instructions.
ALTER TABLE `player` ADD `byond_key` VARCHAR(32) DEFAULT NULL AFTER `ckey`;
----------------------------------------------------
Version 4.4, 9 May 2018, by Jordie0608 Version 4.4, 9 May 2018, by Jordie0608
Modified table `round`, renaming column `start_datetime` to `initialize_datetime` and `end_datetime` to `shutdown_datetime` and adding columns to replace both under the same name in preparation for changes to TGS server initialization. Modified table `round`, renaming column `start_datetime` to `initialize_datetime` and `end_datetime` to `shutdown_datetime` and adding columns to replace both under the same name in preparation for changes to TGS server initialization.

View File

@@ -0,0 +1,92 @@
#Python 3+ Script for populating the key of all ckeys in player table made by Jordie0608
#
#Before starting ensure you have installed the mysqlclient package https://github.com/PyMySQL/mysqlclient-python
#It can be downloaded from command line with pip:
#pip install mysqlclient
#And that you have run the most recent commands listed in database_changelog.txt
#
#To view the parameters for this script, execute it with the argument --help
#All the positional arguments are required, remember to include a prefixe in your table name if you use one
#--useckey and --onlynull are optional arguments, see --help for their function
#An example of the command used to execute this script from powershell:
#python populate_key_2018-07-09.py "localhost" "root" "password" "feedback" "SS13_player" --onlynull --useckey
#
#This script requires an internet connection to function
#Sometimes byond.com fails to return the page for a valid ckey, this can be a temporary problem and may be resolved by rerunning the script
#You can have the script use the existing ckey instead if the key is unable to be parsed with the --useckey optional argument
#To make the script only iterate on rows that failed to parse a ckey and have a null byond_key column, use the --onlynull optional argument
#To make the script only iterate on rows that have a matching ckey and byond_key column, use the --onlyckeymatch optional argument
#The --onlynull and --onlyckeymatch arguments are mutually exclusive, the script can't be run with both of them enabled
#
#It's safe to run this script with your game server(s) active.
import MySQLdb
import argparse
import re
import sys
from urllib.request import urlopen
from datetime import datetime
if sys.version_info[0] < 3:
raise Exception("Python must be at least version 3 for this script.")
query_values = ""
current_round = 0
parser = argparse.ArgumentParser()
parser.add_argument("address", help="MySQL server address (use localhost for the current computer)")
parser.add_argument("username", help="MySQL login username")
parser.add_argument("password", help="MySQL login password")
parser.add_argument("database", help="Database name")
parser.add_argument("playertable", help="Name of the player table (remember a prefix if you use one)")
parser.add_argument("--useckey", help="Use the player's ckey for their key if unable to contact or parse their member page", action="store_true")
group = parser.add_mutually_exclusive_group()
group.add_argument("--onlynull", help="Only try to update rows if their byond_key column is null, mutually exclusive with --onlyckeymatch", action="store_true")
group.add_argument("--onlyckeymatch", help="Only try to update rows that have matching ckey and byond_key columns from the --useckey argument, mutually exclusive with --onlynull", action="store_true")
args = parser.parse_args()
where = ""
if args.onlynull:
where = " WHERE byond_key IS NULL"
if args.onlyckeymatch:
where = " WHERE byond_key = ckey"
db=MySQLdb.connect(host=args.address, user=args.username, passwd=args.password, db=args.database)
cursor=db.cursor()
player_table = args.playertable
cursor.execute("SELECT ckey FROM {0}{1}".format(player_table, where))
ckey_list = cursor.fetchall()
failed_ckeys = []
start_time = datetime.now()
success = 0
fail = 0
print("Beginning script at {0}".format(start_time.strftime("%Y-%m-%d %H:%M:%S")))
if not ckey_list:
print("Query returned no rows")
for current_ckey in ckey_list:
link = urlopen("https://secure.byond.com/members/{0}/?format=text".format(current_ckey[0]))
data = link.read()
data = data.decode("ISO-8859-1")
match = re.search("\tkey = \"(.+)\"", data)
if match:
key = match.group(1)
success += 1
else:
fail += 1
failed_ckeys.append(current_ckey[0])
msg = "Failed to parse a key for {0}".format(current_ckey[0])
if args.useckey:
msg += ", using their ckey instead"
print(msg)
key = current_ckey[0]
else:
print(msg)
continue
cursor.execute("UPDATE {0} SET byond_key = \'{1}\' WHERE ckey = \'{2}\'".format(player_table, key, current_ckey[0]))
db.commit()
end_time = datetime.now()
print("Script completed at {0} with duration {1}".format(datetime.now().strftime("%Y-%m-%d %H:%M:%S"), end_time - start_time))
if failed_ckeys:
if args.useckey:
print("The following ckeys failed to parse a key so their ckey was used instead:")
else:
print("The following ckeys failed to parse a key and were skipped:")
print("\n".join(failed_ckeys))
print("Keys successfully parsed: {0} Keys failed parsing: {1}".format(success, fail))
cursor.close()

View File

@@ -309,6 +309,7 @@ DROP TABLE IF EXISTS `player`;
/*!40101 SET character_set_client = utf8 */; /*!40101 SET character_set_client = utf8 */;
CREATE TABLE `player` ( CREATE TABLE `player` (
`ckey` varchar(32) NOT NULL, `ckey` varchar(32) NOT NULL,
`byond_key` varchar(32) DEFAULT NULL,
`firstseen` datetime NOT NULL, `firstseen` datetime NOT NULL,
`firstseen_round_id` int(11) unsigned NOT NULL, `firstseen_round_id` int(11) unsigned NOT NULL,
`lastseen` datetime NOT NULL, `lastseen` datetime NOT NULL,

View File

@@ -309,6 +309,7 @@ DROP TABLE IF EXISTS `SS13_player`;
/*!40101 SET character_set_client = utf8 */; /*!40101 SET character_set_client = utf8 */;
CREATE TABLE `SS13_player` ( CREATE TABLE `SS13_player` (
`ckey` varchar(32) NOT NULL, `ckey` varchar(32) NOT NULL,
`byond_key` varchar(32) DEFAULT NULL,
`firstseen` datetime NOT NULL, `firstseen` datetime NOT NULL,
`firstseen_round_id` int(11) unsigned NOT NULL, `firstseen_round_id` int(11) unsigned NOT NULL,
`lastseen` datetime NOT NULL, `lastseen` datetime NOT NULL,

View File

@@ -1,7 +1,7 @@
//Update this whenever the db schema changes //Update this whenever the db schema changes
//make sure you add an update to the schema_version stable in the db changelog //make sure you add an update to the schema_version stable in the db changelog
#define DB_MAJOR_VERSION 4 #define DB_MAJOR_VERSION 4
#define DB_MINOR_VERSION 4 #define DB_MINOR_VERSION 5
//Timing subsystem //Timing subsystem
//Don't run if there is an identical unique timer active //Don't run if there is an identical unique timer active

View File

@@ -192,15 +192,15 @@ Proc for attack log creation, because really why not
var/starget = "NON-EXISTENT SUBJECT" var/starget = "NON-EXISTENT SUBJECT"
if(target) if(target)
if(is_mob_target && target.ckey) if(is_mob_target && target.key)
starget = "[target.name]([target.ckey])" starget = "[target.name]([target.key])"
else else
starget = "[target.name]" starget = "[target.name]"
var/ssource = "NON-EXISTENT USER" //How!? var/ssource = "NON-EXISTENT USER" //How!?
if(user) if(user)
if(is_mob_user && user.ckey) if(is_mob_user && user.key)
ssource = "[user.name]([user.ckey])" ssource = "[user.name]([user.key])"
else else
ssource = "[user.name]" ssource = "[user.name]"

View File

@@ -14,8 +14,8 @@ SUBSYSTEM_DEF(medals)
return return
if(isnull(world.SetMedal(medal, player, CONFIG_GET(string/medal_hub_address), CONFIG_GET(string/medal_hub_password)))) if(isnull(world.SetMedal(medal, player, CONFIG_GET(string/medal_hub_address), CONFIG_GET(string/medal_hub_password))))
hub_enabled = FALSE hub_enabled = FALSE
log_game("MEDAL ERROR: Could not contact hub to award medal:[medal] player:[player.ckey]") log_game("MEDAL ERROR: Could not contact hub to award medal:[medal] player:[player.key]")
message_admins("Error! Failed to contact hub to award [medal] medal to [player.ckey]!") message_admins("Error! Failed to contact hub to award [medal] medal to [player.key]!")
return return
to_chat(player, "<span class='greenannounce'><B>Achievement unlocked: [medal]!</B></span>") to_chat(player, "<span class='greenannounce'><B>Achievement unlocked: [medal]!</B></span>")
@@ -38,8 +38,8 @@ SUBSYSTEM_DEF(medals)
if(isnull(world.SetScores(player.ckey, newscoreparam, CONFIG_GET(string/medal_hub_address), CONFIG_GET(string/medal_hub_password)))) if(isnull(world.SetScores(player.ckey, newscoreparam, CONFIG_GET(string/medal_hub_address), CONFIG_GET(string/medal_hub_password))))
hub_enabled = FALSE hub_enabled = FALSE
log_game("SCORE ERROR: Could not contact hub to set score. Score:[score] player:[player.ckey]") log_game("SCORE ERROR: Could not contact hub to set score. Score:[score] player:[player.key]")
message_admins("Error! Failed to contact hub to set [score] score for [player.ckey]!") message_admins("Error! Failed to contact hub to set [score] score for [player.key]!")
/datum/controller/subsystem/medals/proc/GetScore(score, client/player, returnlist) /datum/controller/subsystem/medals/proc/GetScore(score, client/player, returnlist)
if(!score || !hub_enabled) if(!score || !hub_enabled)
@@ -48,8 +48,8 @@ SUBSYSTEM_DEF(medals)
var/scoreget = world.GetScores(player.ckey, score, CONFIG_GET(string/medal_hub_address), CONFIG_GET(string/medal_hub_password)) var/scoreget = world.GetScores(player.ckey, score, CONFIG_GET(string/medal_hub_address), CONFIG_GET(string/medal_hub_password))
if(isnull(scoreget)) if(isnull(scoreget))
hub_enabled = FALSE hub_enabled = FALSE
log_game("SCORE ERROR: Could not contact hub to get score. Score:[score] player:[player.ckey]") log_game("SCORE ERROR: Could not contact hub to get score. Score:[score] player:[player.key]")
message_admins("Error! Failed to contact hub to get score: [score] for [player.ckey]!") message_admins("Error! Failed to contact hub to get score: [score] for [player.key]!")
return return
. = params2list(scoreget) . = params2list(scoreget)
if(!returnlist) if(!returnlist)
@@ -61,8 +61,8 @@ SUBSYSTEM_DEF(medals)
if(isnull(world.GetMedal(medal, player, CONFIG_GET(string/medal_hub_address), CONFIG_GET(string/medal_hub_password)))) if(isnull(world.GetMedal(medal, player, CONFIG_GET(string/medal_hub_address), CONFIG_GET(string/medal_hub_password))))
hub_enabled = FALSE hub_enabled = FALSE
log_game("MEDAL ERROR: Could not contact hub to get medal:[medal] player: [player.ckey]") log_game("MEDAL ERROR: Could not contact hub to get medal:[medal] player: [player.key]")
message_admins("Error! Failed to contact hub to get [medal] medal for [player.ckey]!") message_admins("Error! Failed to contact hub to get [medal] medal for [player.key]!")
return return
to_chat(player, "[medal] is unlocked") to_chat(player, "[medal] is unlocked")
@@ -73,15 +73,15 @@ SUBSYSTEM_DEF(medals)
switch(result) switch(result)
if(null) if(null)
hub_enabled = FALSE hub_enabled = FALSE
log_game("MEDAL ERROR: Could not contact hub to clear medal:[medal] player:[player.ckey]") log_game("MEDAL ERROR: Could not contact hub to clear medal:[medal] player:[player.key]")
message_admins("Error! Failed to contact hub to clear [medal] medal for [player.ckey]!") message_admins("Error! Failed to contact hub to clear [medal] medal for [player.key]!")
if(TRUE) if(TRUE)
message_admins("Medal: [medal] removed for [player.ckey]") message_admins("Medal: [medal] removed for [player.key]")
if(FALSE) if(FALSE)
message_admins("Medal: [medal] was not found for [player.ckey]. Unable to clear.") message_admins("Medal: [medal] was not found for [player.key]. Unable to clear.")
/datum/controller/subsystem/medals/proc/ClearScore(client/player) /datum/controller/subsystem/medals/proc/ClearScore(client/player)
if(isnull(world.SetScores(player.ckey, "", CONFIG_GET(string/medal_hub_address), CONFIG_GET(string/medal_hub_password)))) if(isnull(world.SetScores(player.ckey, "", CONFIG_GET(string/medal_hub_address), CONFIG_GET(string/medal_hub_password))))
log_game("MEDAL ERROR: Could not contact hub to clear scores for [player.ckey]!") log_game("MEDAL ERROR: Could not contact hub to clear scores for [player.key]!")
message_admins("Error! Failed to contact hub to clear scores for [player.ckey]!") message_admins("Error! Failed to contact hub to clear scores for [player.key]!")

View File

@@ -61,7 +61,7 @@
current_backseat = owner_backseat current_backseat = owner_backseat
free_backseat = stranger_backseat free_backseat = stranger_backseat
log_game("[key_name(current_backseat)] assumed control of [key_name(owner)] due to [src]. (Original owner: [current_controller == OWNER ? owner.ckey : current_backseat.ckey])") log_game("[key_name(current_backseat)] assumed control of [key_name(owner)] due to [src]. (Original owner: [current_controller == OWNER ? owner.key : current_backseat.key])")
to_chat(owner, "<span class='userdanger'>You feel your control being taken away... your other personality is in charge now!</span>") to_chat(owner, "<span class='userdanger'>You feel your control being taken away... your other personality is in charge now!</span>")
to_chat(current_backseat, "<span class='userdanger'>You manage to take control of your body!</span>") to_chat(current_backseat, "<span class='userdanger'>You manage to take control of your body!</span>")

View File

@@ -79,7 +79,7 @@
if(!A.secondsElectrified) if(!A.secondsElectrified)
A.set_electrified(30) A.set_electrified(30)
if(usr) if(usr)
LAZYADD(A.shockedby, text("\[[time_stamp()]\][usr](ckey:[usr.ckey])")) LAZYADD(A.shockedby, text("\[[time_stamp()]\] [key_name(usr)]"))
add_logs(usr, A, "electrified") add_logs(usr, A, "electrified")
if(WIRE_SAFETY) if(WIRE_SAFETY)
A.safe = !A.safe A.safe = !A.safe
@@ -134,7 +134,7 @@
if(A.secondsElectrified != -1) if(A.secondsElectrified != -1)
A.set_electrified(-1) A.set_electrified(-1)
if(usr) if(usr)
LAZYADD(A.shockedby, text("\[[time_stamp()]\][usr](ckey:[usr.ckey])")) LAZYADD(A.shockedby, text("\[[time_stamp()]\] [key_name(usr)]"))
add_logs(usr, A, "electrified") add_logs(usr, A, "electrified")
if(WIRE_SAFETY) // Cut to disable safeties, mend to re-enable. if(WIRE_SAFETY) // Cut to disable safeties, mend to re-enable.
A.safe = mend A.safe = mend

View File

@@ -435,23 +435,23 @@
continue // never had a client continue // never had a client
if(L.ckey && !GLOB.directory[L.ckey]) if(L.ckey && !GLOB.directory[L.ckey])
msg += "<b>[L.name]</b> ([L.ckey]), the [L.job] (<font color='#ffcc00'><b>Disconnected</b></font>)\n" msg += "<b>[L.name]</b> ([L.key]), the [L.job] (<font color='#ffcc00'><b>Disconnected</b></font>)\n"
if(L.ckey && L.client) if(L.ckey && L.client)
var/failed = FALSE var/failed = FALSE
if(L.client.inactivity >= (ROUNDSTART_LOGOUT_REPORT_TIME / 2)) //Connected, but inactive (alt+tabbed or something) if(L.client.inactivity >= (ROUNDSTART_LOGOUT_REPORT_TIME / 2)) //Connected, but inactive (alt+tabbed or something)
msg += "<b>[L.name]</b> ([L.ckey]), the [L.job] (<font color='#ffcc00'><b>Connected, Inactive</b></font>)\n" msg += "<b>[L.name]</b> ([L.key]), the [L.job] (<font color='#ffcc00'><b>Connected, Inactive</b></font>)\n"
failed = TRUE //AFK client failed = TRUE //AFK client
if(!failed && L.stat) if(!failed && L.stat)
if(L.suiciding) //Suicider if(L.suiciding) //Suicider
msg += "<b>[L.name]</b> ([L.ckey]), the [L.job] (<span class='boldannounce'>Suicide</span>)\n" msg += "<b>[L.name]</b> ([L.key]), the [L.job] (<span class='boldannounce'>Suicide</span>)\n"
failed = TRUE //Disconnected client failed = TRUE //Disconnected client
if(!failed && L.stat == UNCONSCIOUS) if(!failed && L.stat == UNCONSCIOUS)
msg += "<b>[L.name]</b> ([L.ckey]), the [L.job] (Dying)\n" msg += "<b>[L.name]</b> ([L.key]), the [L.job] (Dying)\n"
failed = TRUE //Unconscious failed = TRUE //Unconscious
if(!failed && L.stat == DEAD) if(!failed && L.stat == DEAD)
msg += "<b>[L.name]</b> ([L.ckey]), the [L.job] (Dead)\n" msg += "<b>[L.name]</b> ([L.key]), the [L.job] (Dead)\n"
failed = TRUE //Dead failed = TRUE //Dead
var/p_ckey = L.client.ckey var/p_ckey = L.client.ckey

View File

@@ -136,7 +136,7 @@
if(I && istype(I) && I.imp_in) if(I && istype(I) && I.imp_in)
var/mob/living/R = I.imp_in var/mob/living/R = I.imp_in
to_chat(R, "<span class='italics'>You hear a voice in your head saying: '[warning]'</span>") to_chat(R, "<span class='italics'>You hear a voice in your head saying: '[warning]'</span>")
log_talk(usr,"[key_name(usr)] sent an implant message to [R]/[R.ckey]: '[warning]'",LOGSAY) log_talk(usr,"[key_name(usr)] sent an implant message to [key_name(R)]: '[warning]'",LOGSAY)
src.add_fingerprint(usr) src.add_fingerprint(usr)
src.updateUsrDialog() src.updateUsrDialog()

View File

@@ -1280,7 +1280,7 @@
bolt() //Bolt it! bolt() //Bolt it!
set_electrified(ELECTRIFIED_PERMANENT) //Shock it! set_electrified(ELECTRIFIED_PERMANENT) //Shock it!
if(origin) if(origin)
LAZYADD(shockedby, "\[[time_stamp()]\][origin](ckey:[origin.ckey])") LAZYADD(shockedby, "\[[time_stamp()]\] [key_name(origin)]")
/obj/machinery/door/airlock/disable_lockdown() /obj/machinery/door/airlock/disable_lockdown()
@@ -1549,7 +1549,7 @@
if(wires.is_cut(WIRE_SHOCK)) if(wires.is_cut(WIRE_SHOCK))
to_chat(user, "The electrification wire has been cut") to_chat(user, "The electrification wire has been cut")
else else
LAZYADD(shockedby, "\[[time_stamp()]\][user](ckey:[user.ckey])") LAZYADD(shockedby, "\[[time_stamp()]\] [key_name(user)]")
add_logs(user, src, "electrified") add_logs(user, src, "electrified")
set_electrified(AI_ELECTRIFY_DOOR_TIME) set_electrified(AI_ELECTRIFY_DOOR_TIME)
@@ -1559,7 +1559,7 @@
if(wires.is_cut(WIRE_SHOCK)) if(wires.is_cut(WIRE_SHOCK))
to_chat(user, "The electrification wire has been cut") to_chat(user, "The electrification wire has been cut")
else else
LAZYADD(shockedby, text("\[[time_stamp()]\][user](ckey:[user.ckey])")) LAZYADD(shockedby, text("\[[time_stamp()]\] [key_name(user)]"))
add_logs(user, src, "electrified") add_logs(user, src, "electrified")
set_electrified(ELECTRIFIED_PERMANENT) set_electrified(ELECTRIFIED_PERMANENT)

View File

@@ -256,10 +256,10 @@ GLOBAL_LIST_EMPTY(crematoriums)
if (M.stat != DEAD) if (M.stat != DEAD)
M.emote("scream") M.emote("scream")
if(user) if(user)
user.log_message("Cremated <b>[M]/[M.ckey]</b>", INDIVIDUAL_ATTACK_LOG) user.log_message("Cremated <b>[key_name(M)]</b>", INDIVIDUAL_ATTACK_LOG)
log_attack("[user]/[user.ckey] cremated [M]/[M.ckey]") log_attack("[key_name(user)] cremated [key_name(M)]")
else else
log_attack("UNKNOWN cremated [M]/[M.ckey]") log_attack("UNKNOWN cremated [key_name(M)]")
M.death(1) M.death(1)
if(M) //some animals get automatically deleted on death. if(M) //some animals get automatically deleted on death.
M.ghostize() M.ghostize()

View File

@@ -2,7 +2,7 @@
#define MAX_ADMIN_BANS_PER_HEADMIN 3 #define MAX_ADMIN_BANS_PER_HEADMIN 3
//Either pass the mob you wish to ban in the 'banned_mob' attribute, or the banckey, banip and bancid variables. If both are passed, the mob takes priority! If a mob is not passed, banckey is the minimum that needs to be passed! banip and bancid are optional. //Either pass the mob you wish to ban in the 'banned_mob' attribute, or the banckey, banip and bancid variables. If both are passed, the mob takes priority! If a mob is not passed, banckey is the minimum that needs to be passed! banip and bancid are optional.
/datum/admins/proc/DB_ban_record(bantype, mob/banned_mob, duration = -1, reason, job = "", banckey = null, banip = null, bancid = null) /datum/admins/proc/DB_ban_record(bantype, mob/banned_mob, duration = -1, reason, job = "", bankey = null, banip = null, bancid = null)
if(!check_rights(R_BAN)) if(!check_rights(R_BAN))
return return
@@ -64,23 +64,24 @@
if(ismob(banned_mob)) if(ismob(banned_mob))
ckey = banned_mob.ckey ckey = banned_mob.ckey
bankey = banned_mob.key
if(banned_mob.client) if(banned_mob.client)
computerid = banned_mob.client.computer_id computerid = banned_mob.client.computer_id
ip = banned_mob.client.address ip = banned_mob.client.address
else else
computerid = banned_mob.computer_id computerid = banned_mob.computer_id
ip = banned_mob.lastKnownIP ip = banned_mob.lastKnownIP
else if(banckey) else if(bankey)
ckey = ckey(banckey) ckey = ckey(bankey)
computerid = bancid computerid = bancid
ip = banip ip = banip
var/had_banned_mob = banned_mob != null var/had_banned_mob = banned_mob != null
var/client/banned_client = banned_mob?.client var/client/banned_client = banned_mob?.client
var/banned_mob_guest_key = had_banned_mob && IsGuestKey(banned_mob.key) var/banned_mob_guest_key = had_banned_mob && IsGuestKey(banned_mob.key)
banned_mob = null banned_mob = null
var/datum/DBQuery/query_add_ban_get_ckey = SSdbcore.NewQuery("SELECT ckey FROM [format_table_name("player")] WHERE ckey = '[ckey]'") var/datum/DBQuery/query_add_ban_get_ckey = SSdbcore.NewQuery("SELECT 1 FROM [format_table_name("player")] WHERE ckey = '[ckey]'")
if(!query_add_ban_get_ckey.warn_execute()) if(!query_add_ban_get_ckey.warn_execute())
qdel(query_add_ban_get_ckey) qdel(query_add_ban_get_ckey)
return return
@@ -88,14 +89,16 @@
qdel(query_add_ban_get_ckey) qdel(query_add_ban_get_ckey)
if(!seen_before) if(!seen_before)
if(!had_banned_mob || (had_banned_mob && !banned_mob_guest_key)) if(!had_banned_mob || (had_banned_mob && !banned_mob_guest_key))
if(alert(usr, "[ckey] has not been seen before, are you sure you want to create a ban for them?", "Unknown ckey", "Yes", "No", "Cancel") != "Yes") if(alert(usr, "[bankey] has not been seen before, are you sure you want to create a ban for them?", "Unknown ckey", "Yes", "No", "Cancel") != "Yes")
return return
var/a_key
var/a_ckey var/a_ckey
var/a_computerid var/a_computerid
var/a_ip var/a_ip
if(istype(owner)) if(istype(owner))
a_key = owner.key
a_ckey = owner.ckey a_ckey = owner.ckey
a_computerid = owner.computer_id a_computerid = owner.computer_id
a_ip = owner.address a_ip = owner.address
@@ -147,17 +150,17 @@
return return
qdel(query_add_ban) qdel(query_add_ban)
to_chat(usr, "<span class='adminnotice'>Ban saved to database.</span>") to_chat(usr, "<span class='adminnotice'>Ban saved to database.</span>")
var/msg = "[key_name_admin(usr)] has added a [bantype_str] for [ckey] [(job)?"([job])":""] [(duration > 0)?"([duration] minutes)":""] with the reason: \"[reason]\" to the ban database." var/msg = "[key_name_admin(usr)] has added a [bantype_str] for [bankey] [(job)?"([job])":""] [(duration > 0)?"([duration] minutes)":""] with the reason: \"[reason]\" to the ban database."
message_admins(msg,1) message_admins(msg,1)
var/datum/admin_help/AH = admin_ticket_log(ckey, msg) var/datum/admin_help/AH = admin_ticket_log(ckey, msg)
if(announceinirc) if(announceinirc)
send2irc("BAN ALERT","[a_ckey] applied a [bantype_str] on [ckey]") send2irc("BAN ALERT","[a_key] applied a [bantype_str] on [bankey]")
if(kickbannedckey) if(kickbannedckey)
if(AH) if(AH)
AH.Resolve() //with prejudice AH.Resolve() //with prejudice
if(banned_client && banned_client.ckey == banckey) if(banned_client && banned_client.ckey == ckey)
qdel(banned_client) qdel(banned_client)
return 1 return 1
@@ -249,18 +252,18 @@
to_chat(usr, "Cancelled") to_chat(usr, "Cancelled")
return return
var/datum/DBQuery/query_edit_ban_get_details = SSdbcore.NewQuery("SELECT ckey, duration, reason FROM [format_table_name("ban")] WHERE id = [banid]") var/datum/DBQuery/query_edit_ban_get_details = SSdbcore.NewQuery("SELECT (SELECT byond_key FROM [format_table_name("player")] WHERE [format_table_name("player")].ckey = [format_table_name("ban")].ckey), duration, reason FROM [format_table_name("ban")] WHERE id = [banid]")
if(!query_edit_ban_get_details.warn_execute()) if(!query_edit_ban_get_details.warn_execute())
qdel(query_edit_ban_get_details) qdel(query_edit_ban_get_details)
return return
var/eckey = usr.ckey //Editing admin ckey var/e_key = usr.key //Editing admin key
var/pckey //(banned) Player ckey var/p_key //(banned) Player key
var/duration //Old duration var/duration //Old duration
var/reason //Old reason var/reason //Old reason
if(query_edit_ban_get_details.NextRow()) if(query_edit_ban_get_details.NextRow())
pckey = query_edit_ban_get_details.item[1] p_key = query_edit_ban_get_details.item[1]
duration = query_edit_ban_get_details.item[2] duration = query_edit_ban_get_details.item[2]
reason = query_edit_ban_get_details.item[3] reason = query_edit_ban_get_details.item[3]
else else
@@ -275,33 +278,33 @@
switch(param) switch(param)
if("reason") if("reason")
if(!value) if(!value)
value = input("Insert the new reason for [pckey]'s ban", "New Reason", "[reason]", null) as null|text value = input("Insert the new reason for [p_key]'s ban", "New Reason", "[reason]", null) as null|text
value = sanitizeSQL(value) value = sanitizeSQL(value)
if(!value) if(!value)
to_chat(usr, "Cancelled") to_chat(usr, "Cancelled")
return return
var/datum/DBQuery/query_edit_ban_reason = SSdbcore.NewQuery("UPDATE [format_table_name("ban")] SET reason = '[value]', edits = CONCAT(edits,'- [eckey] changed ban reason from <cite><b>\\\"[reason]\\\"</b></cite> to <cite><b>\\\"[value]\\\"</b></cite><BR>') WHERE id = [banid]") var/datum/DBQuery/query_edit_ban_reason = SSdbcore.NewQuery("UPDATE [format_table_name("ban")] SET reason = '[value]', edits = CONCAT(edits,'- [e_key] changed ban reason from <cite><b>\\\"[reason]\\\"</b></cite> to <cite><b>\\\"[value]\\\"</b></cite><BR>') WHERE id = [banid]")
if(!query_edit_ban_reason.warn_execute()) if(!query_edit_ban_reason.warn_execute())
qdel(query_edit_ban_reason) qdel(query_edit_ban_reason)
return return
qdel(query_edit_ban_reason) qdel(query_edit_ban_reason)
message_admins("[key_name_admin(usr)] has edited a ban for [pckey]'s reason from [reason] to [value]") message_admins("[key_name_admin(usr)] has edited a ban for [p_key]'s reason from [reason] to [value]")
if("duration") if("duration")
if(!value) if(!value)
value = input("Insert the new duration (in minutes) for [pckey]'s ban", "New Duration", "[duration]", null) as null|num value = input("Insert the new duration (in minutes) for [p_key]'s ban", "New Duration", "[duration]", null) as null|num
if(!isnum(value) || !value) if(!isnum(value) || !value)
to_chat(usr, "Cancelled") to_chat(usr, "Cancelled")
return return
var/datum/DBQuery/query_edit_ban_duration = SSdbcore.NewQuery("UPDATE [format_table_name("ban")] SET duration = [value], edits = CONCAT(edits,'- [eckey] changed ban duration from [duration] to [value]<br>'), expiration_time = DATE_ADD(bantime, INTERVAL [value] MINUTE) WHERE id = [banid]") var/datum/DBQuery/query_edit_ban_duration = SSdbcore.NewQuery("UPDATE [format_table_name("ban")] SET duration = [value], edits = CONCAT(edits,'- [e_key] changed ban duration from [duration] to [value]<br>'), expiration_time = DATE_ADD(bantime, INTERVAL [value] MINUTE) WHERE id = [banid]")
if(!query_edit_ban_duration.warn_execute()) if(!query_edit_ban_duration.warn_execute())
qdel(query_edit_ban_duration) qdel(query_edit_ban_duration)
return return
qdel(query_edit_ban_duration) qdel(query_edit_ban_duration)
message_admins("[key_name_admin(usr)] has edited a ban for [pckey]'s duration from [duration] to [value]") message_admins("[key_name_admin(usr)] has edited a ban for [p_key]'s duration from [duration] to [value]")
if("unban") if("unban")
if(alert("Unban [pckey]?", "Unban?", "Yes", "No") == "Yes") if(alert("Unban [p_key]?", "Unban?", "Yes", "No") == "Yes")
DB_ban_unban_by_id(banid) DB_ban_unban_by_id(banid)
return return
else else
@@ -316,20 +319,20 @@
if(!check_rights(R_BAN)) if(!check_rights(R_BAN))
return return
var/sql = "SELECT ckey FROM [format_table_name("ban")] WHERE id = [id]" var/sql = "SELECT (SELECT byond_key FROM [format_table_name("player")] WHERE [format_table_name("player")].ckey = [format_table_name("ban")].ckey) FROM [format_table_name("ban")] WHERE id = [id]"
if(!SSdbcore.Connect()) if(!SSdbcore.Connect())
return return
var/ban_number = 0 //failsafe var/ban_number = 0 //failsafe
var/pckey var/p_key
var/datum/DBQuery/query_unban_get_ckey = SSdbcore.NewQuery(sql) var/datum/DBQuery/query_unban_get_ckey = SSdbcore.NewQuery(sql)
if(!query_unban_get_ckey.warn_execute()) if(!query_unban_get_ckey.warn_execute())
qdel(query_unban_get_ckey) qdel(query_unban_get_ckey)
return return
while(query_unban_get_ckey.NextRow()) while(query_unban_get_ckey.NextRow())
pckey = query_unban_get_ckey.item[1] p_key = query_unban_get_ckey.item[1]
ban_number++; ban_number++;
qdel(query_unban_get_ckey) qdel(query_unban_get_ckey)
@@ -354,7 +357,7 @@
qdel(query_unban) qdel(query_unban)
return return
qdel(query_unban) qdel(query_unban)
message_admins("[key_name_admin(usr)] has lifted [pckey]'s ban.") message_admins("[key_name_admin(usr)] has lifted [p_key]'s ban.")
/client/proc/DB_ban_panel() /client/proc/DB_ban_panel()
set category = "Admin" set category = "Admin"
@@ -399,7 +402,7 @@
output += "<option value='[BANTYPE_ADMIN_PERMA]'>ADMIN PERMABAN</option>" output += "<option value='[BANTYPE_ADMIN_PERMA]'>ADMIN PERMABAN</option>"
output += "<option value='[BANTYPE_ADMIN_TEMP]'>ADMIN TEMPBAN</option>" output += "<option value='[BANTYPE_ADMIN_TEMP]'>ADMIN TEMPBAN</option>"
output += "</select></td>" output += "</select></td>"
output += "<td><b>Ckey:</b> <input type='text' name='dbbanaddckey'></td></tr>" output += "<td><b>Key:</b> <input type='text' name='dbbanaddkey'></td></tr>"
output += "<tr><td><b>IP:</b> <input type='text' name='dbbanaddip'></td>" output += "<tr><td><b>IP:</b> <input type='text' name='dbbanaddip'></td>"
output += "<td><b>Computer id:</b> <input type='text' name='dbbanaddcid'></td></tr>" output += "<td><b>Computer id:</b> <input type='text' name='dbbanaddcid'></td></tr>"
output += "<tr><td><b>Duration:</b> <input type='text' name='dbbaddduration'></td>" output += "<tr><td><b>Duration:</b> <input type='text' name='dbbaddduration'></td>"
@@ -474,7 +477,7 @@
output += "<th width='15%'><b>OPTIONS</b></th>" output += "<th width='15%'><b>OPTIONS</b></th>"
output += "</tr>" output += "</tr>"
var/limit = " LIMIT [bansperpage * page], [bansperpage]" var/limit = " LIMIT [bansperpage * page], [bansperpage]"
var/datum/DBQuery/query_search_bans = SSdbcore.NewQuery("SELECT id, bantime, bantype, reason, job, duration, expiration_time, ckey, a_ckey, unbanned, unbanned_ckey, unbanned_datetime, edits, round_id FROM [format_table_name("ban")] WHERE [search] ORDER BY bantime DESC[limit]") var/datum/DBQuery/query_search_bans = SSdbcore.NewQuery("SELECT id, bantime, bantype, reason, job, duration, expiration_time, (SELECT byond_key FROM [format_table_name("player")] WHERE [format_table_name("player")].ckey = [format_table_name("ban")].ckey), (SELECT byond_key FROM [format_table_name("player")] WHERE [format_table_name("player")].ckey = [format_table_name("ban")].a_ckey), unbanned, (SELECT byond_key FROM [format_table_name("player")] WHERE [format_table_name("player")].ckey = [format_table_name("ban")].unbanned_ckey), unbanned_datetime, edits, round_id FROM [format_table_name("ban")] WHERE [search] ORDER BY bantime DESC[limit]")
if(!query_search_bans.warn_execute()) if(!query_search_bans.warn_execute())
qdel(query_search_bans) qdel(query_search_bans)
return return
@@ -487,10 +490,10 @@
var/job = query_search_bans.item[5] var/job = query_search_bans.item[5]
var/duration = query_search_bans.item[6] var/duration = query_search_bans.item[6]
var/expiration = query_search_bans.item[7] var/expiration = query_search_bans.item[7]
var/ckey = query_search_bans.item[8] var/ban_key = query_search_bans.item[8]
var/ackey = query_search_bans.item[9] var/a_key = query_search_bans.item[9]
var/unbanned = query_search_bans.item[10] var/unbanned = query_search_bans.item[10]
var/unbanckey = query_search_bans.item[11] var/unban_key = query_search_bans.item[11]
var/unbantime = query_search_bans.item[12] var/unbantime = query_search_bans.item[12]
var/edits = query_search_bans.item[13] var/edits = query_search_bans.item[13]
var/round_id = query_search_bans.item[14] var/round_id = query_search_bans.item[14]
@@ -518,9 +521,9 @@
output += "<tr bgcolor='[dcolor]'>" output += "<tr bgcolor='[dcolor]'>"
output += "<td align='center'>[typedesc]</td>" output += "<td align='center'>[typedesc]</td>"
output += "<td align='center'><b>[ckey]</b></td>" output += "<td align='center'><b>[ban_key]</b></td>"
output += "<td align='center'>[bantime] (Round ID: [round_id])</td>" output += "<td align='center'>[bantime] (Round ID: [round_id])</td>"
output += "<td align='center'><b>[ackey]</b></td>" output += "<td align='center'><b>[a_key]</b></td>"
output += "<td align='center'>[(unbanned) ? "" : "<b><a href=\"byond://?src=[REF(src)];[HrefToken()];dbbanedit=unban;dbbanid=[banid]\">Unban</a></b>"]</td>" output += "<td align='center'>[(unbanned) ? "" : "<b><a href=\"byond://?src=[REF(src)];[HrefToken()];dbbanedit=unban;dbbanid=[banid]\">Unban</a></b>"]</td>"
output += "</tr>" output += "</tr>"
output += "<tr bgcolor='[lcolor]'>" output += "<tr bgcolor='[lcolor]'>"
@@ -535,7 +538,7 @@
output += "</tr>" output += "</tr>"
if(unbanned) if(unbanned)
output += "<tr bgcolor='[dcolor]'>" output += "<tr bgcolor='[dcolor]'>"
output += "<td align='center' colspan='5' bgcolor=''><b>UNBANNED by admin [unbanckey] on [unbantime]</b></td>" output += "<td align='center' colspan='5' bgcolor=''><b>UNBANNED by admin [unban_key] on [unbantime]</b></td>"
output += "</tr>" output += "</tr>"
output += "<tr>" output += "<tr>"
output += "<td colspan='5' bgcolor='white'>&nbsp</td>" output += "<td colspan='5' bgcolor='white'>&nbsp</td>"

View File

@@ -23,7 +23,7 @@
//Whitelist //Whitelist
if(CONFIG_GET(flag/usewhitelist)) if(CONFIG_GET(flag/usewhitelist))
if(!check_whitelist(ckey(key))) if(!check_whitelist(ckey))
if (admin) if (admin)
log_admin("The admin [key] has been allowed to bypass the whitelist") log_admin("The admin [key] has been allowed to bypass the whitelist")
message_admins("<span class='adminnotice'>The admin [key] has been allowed to bypass the whitelist</span>") message_admins("<span class='adminnotice'>The admin [key] has been allowed to bypass the whitelist</span>")
@@ -50,7 +50,7 @@
if(CONFIG_GET(flag/ban_legacy_system)) if(CONFIG_GET(flag/ban_legacy_system))
//Ban Checking //Ban Checking
. = CheckBan( ckey(key), computer_id, address ) . = CheckBan(ckey, computer_id, address )
if(.) if(.)
if (admin) if (admin)
log_admin("The admin [key] has been allowed to bypass a matching ban on [.["key"]]") log_admin("The admin [key] has been allowed to bypass a matching ban on [.["key"]]")
@@ -61,11 +61,8 @@
return . return .
else else
var/ckeytext = ckey(key)
if(!SSdbcore.Connect()) if(!SSdbcore.Connect())
var/msg = "Ban database connection failure. Key [ckeytext] not checked" var/msg = "Ban database connection failure. Key [ckey] not checked"
log_world(msg) log_world(msg)
message_admins(msg) message_admins(msg)
return return
@@ -78,13 +75,13 @@
if(computer_id) if(computer_id)
cidquery = " OR computerid = '[computer_id]' " cidquery = " OR computerid = '[computer_id]' "
var/datum/DBQuery/query_ban_check = SSdbcore.NewQuery("SELECT ckey, a_ckey, reason, expiration_time, duration, bantime, bantype, id, round_id FROM [format_table_name("ban")] WHERE (ckey = '[ckeytext]' [ipquery] [cidquery]) AND (bantype = 'PERMABAN' OR bantype = 'ADMIN_PERMABAN' OR ((bantype = 'TEMPBAN' OR bantype = 'ADMIN_TEMPBAN') AND expiration_time > Now())) AND isnull(unbanned)") var/datum/DBQuery/query_ban_check = SSdbcore.NewQuery("SELECT (SELECT byond_key FROM [format_table_name("player")] WHERE [format_table_name("player")].ckey = [format_table_name("ban")].ckey), (SELECT byond_key FROM [format_table_name("player")] WHERE [format_table_name("player")].ckey = [format_table_name("ban")].a_ckey), reason, expiration_time, duration, bantime, bantype, id, round_id FROM [format_table_name("ban")] WHERE (ckey = '[ckey]' [ipquery] [cidquery]) AND (bantype = 'PERMABAN' OR bantype = 'ADMIN_PERMABAN' OR ((bantype = 'TEMPBAN' OR bantype = 'ADMIN_TEMPBAN') AND expiration_time > Now())) AND isnull(unbanned)")
if(!query_ban_check.Execute(async = TRUE)) if(!query_ban_check.Execute(async = TRUE))
qdel(query_ban_check) qdel(query_ban_check)
return return
while(query_ban_check.NextRow()) while(query_ban_check.NextRow())
var/pckey = query_ban_check.item[1] var/pkey = query_ban_check.item[1]
var/ackey = query_ban_check.item[2] var/akey = query_ban_check.item[2]
var/reason = query_ban_check.item[3] var/reason = query_ban_check.item[3]
var/expiration = query_ban_check.item[4] var/expiration = query_ban_check.item[4]
var/duration = query_ban_check.item[5] var/duration = query_ban_check.item[5]
@@ -95,16 +92,16 @@
if (bantype == "ADMIN_PERMABAN" || bantype == "ADMIN_TEMPBAN") if (bantype == "ADMIN_PERMABAN" || bantype == "ADMIN_TEMPBAN")
//admin bans MUST match on ckey to prevent cid-spoofing attacks //admin bans MUST match on ckey to prevent cid-spoofing attacks
// as well as dynamic ip abuse // as well as dynamic ip abuse
if (pckey != ckey) if (ckey(pkey) != ckey)
continue continue
if (admin) if (admin)
if (bantype == "ADMIN_PERMABAN" || bantype == "ADMIN_TEMPBAN") if (bantype == "ADMIN_PERMABAN" || bantype == "ADMIN_TEMPBAN")
log_admin("The admin [key] is admin banned (#[banid]), and has been disallowed access") log_admin("The admin [key] is admin banned (#[banid]), and has been disallowed access")
message_admins("<span class='adminnotice'>The admin [key] is admin banned (#[banid]), and has been disallowed access</span>") message_admins("<span class='adminnotice'>The admin [key] is admin banned (#[banid]), and has been disallowed access</span>")
else else
log_admin("The admin [key] has been allowed to bypass a matching ban on [pckey] (#[banid])") log_admin("The admin [key] has been allowed to bypass a matching ban on [pkey] (#[banid])")
message_admins("<span class='adminnotice'>The admin [key] has been allowed to bypass a matching ban on [pckey] (#[banid])</span>") message_admins("<span class='adminnotice'>The admin [key] has been allowed to bypass a matching ban on [pkey] (#[banid])</span>")
addclientmessage(ckey,"<span class='adminnotice'>You have been allowed to bypass a matching ban on [pckey] (#[banid])</span>") addclientmessage(ckey,"<span class='adminnotice'>You have been allowed to bypass a matching ban on [pkey] (#[banid])</span>")
continue continue
var/expires = "" var/expires = ""
if(text2num(duration) > 0) if(text2num(duration) > 0)
@@ -112,7 +109,7 @@
else else
expires = " The is a permanent ban." expires = " The is a permanent ban."
var/desc = "\nReason: You, or another user of this computer or connection ([pckey]) is banned from playing here. The ban reason is:\n[reason]\nThis ban (BanID #[banid]) was applied by [ackey] on [bantime] during round ID [ban_round_id], [expires]" var/desc = "\nReason: You, or another user of this computer or connection ([pkey]) is banned from playing here. The ban reason is:\n[reason]\nThis ban (BanID #[banid]) was applied by [akey] on [bantime] during round ID [ban_round_id], [expires]"
. = list("reason"="[bantype]", "desc"="[desc]") . = list("reason"="[bantype]", "desc"="[desc]")

View File

@@ -98,22 +98,22 @@ GLOBAL_PROTECT(Banlist)
return 1 return 1
/proc/AddBan(ckey, computerid, reason, bannedby, temp, minutes, address) /proc/AddBan(key, computerid, reason, bannedby, temp, minutes, address)
var/bantimestamp var/bantimestamp
var/ban_ckey = ckey(key)
if (temp) if (temp)
UpdateTime() UpdateTime()
bantimestamp = GLOB.CMinutes + minutes bantimestamp = GLOB.CMinutes + minutes
GLOB.Banlist.cd = "/base" GLOB.Banlist.cd = "/base"
if ( GLOB.Banlist.dir.Find("[ckey][computerid]") ) if ( GLOB.Banlist.dir.Find("[ban_ckey][computerid]") )
to_chat(usr, text("<span class='danger'>Ban already exists.</span>")) to_chat(usr, text("<span class='danger'>Ban already exists.</span>"))
return 0 return 0
else else
GLOB.Banlist.dir.Add("[ckey][computerid]") GLOB.Banlist.dir.Add("[ban_ckey][computerid]")
GLOB.Banlist.cd = "/base/[ckey][computerid]" GLOB.Banlist.cd = "/base/[ban_ckey][computerid]"
WRITE_FILE(GLOB.Banlist["key"], ckey) WRITE_FILE(GLOB.Banlist["key"], ban_ckey)
WRITE_FILE(GLOB.Banlist["id"], computerid) WRITE_FILE(GLOB.Banlist["id"], computerid)
WRITE_FILE(GLOB.Banlist["ip"], address) WRITE_FILE(GLOB.Banlist["ip"], address)
WRITE_FILE(GLOB.Banlist["reason"], reason) WRITE_FILE(GLOB.Banlist["reason"], reason)
@@ -123,9 +123,9 @@ GLOBAL_PROTECT(Banlist)
if (temp) if (temp)
WRITE_FILE(GLOB.Banlist["minutes"], bantimestamp) WRITE_FILE(GLOB.Banlist["minutes"], bantimestamp)
if(!temp) if(!temp)
create_message("note", ckey, bannedby, "Permanently banned - [reason]", null, null, 0, 0) create_message("note", key, bannedby, "Permanently banned - [reason]", null, null, 0, 0)
else else
create_message("note", ckey, bannedby, "Banned for [minutes] minutes - [reason]", null, null, 0, 0) create_message("note", key, bannedby, "Banned for [minutes] minutes - [reason]", null, null, 0, 0)
return 1 return 1
/proc/RemoveBan(foldername) /proc/RemoveBan(foldername)

View File

@@ -29,7 +29,7 @@
body += "<body>Options panel for <b>[M]</b>" body += "<body>Options panel for <b>[M]</b>"
if(M.client) if(M.client)
body += " played by <b>[M.client]</b> " body += " played by <b>[M.client]</b> "
body += "\[<A href='?_src_=holder;[HrefToken()];editrights=[(GLOB.admin_datums[M.client.ckey] || GLOB.deadmins[M.client.ckey]) ? "rank" : "add"];ckey=[M.ckey]'>[M.client.holder ? M.client.holder.rank : "Player"]</A>\]" body += "\[<A href='?_src_=holder;[HrefToken()];editrights=[(GLOB.admin_datums[M.client.ckey] || GLOB.deadmins[M.client.ckey]) ? "rank" : "add"];ckey=[M.key]'>[M.client.holder ? M.client.holder.rank : "Player"]</A>\]"
if(CONFIG_GET(flag/use_exp_tracking)) if(CONFIG_GET(flag/use_exp_tracking))
body += "\[<A href='?_src_=holder;[HrefToken()];getplaytimewindow=[REF(M)]'>" + M.client.get_exp_living() + "</a>\]" body += "\[<A href='?_src_=holder;[HrefToken()];getplaytimewindow=[REF(M)]'>" + M.client.get_exp_living() + "</a>\]"
@@ -827,7 +827,7 @@
continue continue
if(message) if(message)
to_chat(C, message) to_chat(C, message)
kicked_client_names.Add("[C.ckey]") kicked_client_names.Add("[C.key]")
qdel(C) qdel(C)
return kicked_client_names return kicked_client_names
@@ -856,8 +856,8 @@
tomob.ghostize(0) tomob.ghostize(0)
message_admins("<span class='adminnotice'>[key_name_admin(usr)] has put [frommob.ckey] in control of [tomob.name].</span>") message_admins("<span class='adminnotice'>[key_name_admin(usr)] has put [frommob.key] in control of [tomob.name].</span>")
log_admin("[key_name(usr)] stuffed [frommob.ckey] into [tomob.name].") log_admin("[key_name(usr)] stuffed [frommob.key] into [tomob.name].")
SSblackbox.record_feedback("tally", "admin_verb", 1, "Ghost Drag Control") SSblackbox.record_feedback("tally", "admin_verb", 1, "Ghost Drag Control")
tomob.ckey = frommob.ckey tomob.ckey = frommob.ckey

View File

@@ -44,29 +44,29 @@
pagecount++ pagecount++
output += "|" output += "|"
var/limit = " LIMIT [logssperpage * page], [logssperpage]" var/limit = " LIMIT [logssperpage * page], [logssperpage]"
var/datum/DBQuery/query_search_admin_logs = SSdbcore.NewQuery("SELECT datetime, round_id, adminckey, operation, target, log FROM [format_table_name("admin_log")][search] ORDER BY datetime DESC[limit]") var/datum/DBQuery/query_search_admin_logs = SSdbcore.NewQuery("SELECT datetime, round_id, (SELECT byond_key FROM [format_table_name("player")] WHERE ckey = adminckey), operation, IF(ckey IS NULL, target, byond_key), log FROM [format_table_name("admin_log")] LEFT JOIN [format_table_name("player")] ON target = ckey[search] ORDER BY datetime DESC[limit]")
if(!query_search_admin_logs.warn_execute()) if(!query_search_admin_logs.warn_execute())
qdel(query_search_admin_logs) qdel(query_search_admin_logs)
return return
while(query_search_admin_logs.NextRow()) while(query_search_admin_logs.NextRow())
var/datetime = query_search_admin_logs.item[1] var/datetime = query_search_admin_logs.item[1]
var/round_id = query_search_admin_logs.item[2] var/round_id = query_search_admin_logs.item[2]
var/admin_ckey = query_search_admin_logs.item[3] var/admin_key = query_search_admin_logs.item[3]
operation = query_search_admin_logs.item[4] operation = query_search_admin_logs.item[4]
target = query_search_admin_logs.item[5] target = query_search_admin_logs.item[5]
var/log = query_search_admin_logs.item[6] var/log = query_search_admin_logs.item[6]
output += "<p style='margin:0px'><b>[datetime] | Round ID [round_id] | Admin [admin_ckey] | Operation [operation] on [target]</b><br>[log]</p><hr style='background:#000000; border:0; height:3px'>" output += "<p style='margin:0px'><b>[datetime] | Round ID [round_id] | Admin [admin_key] | Operation [operation] on [target]</b><br>[log]</p><hr style='background:#000000; border:0; height:3px'>"
qdel(query_search_admin_logs) qdel(query_search_admin_logs)
if(action == 2) if(action == 2)
output += "<h3>Admin ckeys with invalid ranks</h3>" output += "<h3>Admin ckeys with invalid ranks</h3>"
var/datum/DBQuery/query_check_admin_errors = SSdbcore.NewQuery("SELECT ckey, [format_table_name("admin")].rank FROM [format_table_name("admin")] LEFT JOIN [format_table_name("admin_ranks")] ON [format_table_name("admin_ranks")].rank = [format_table_name("admin")].rank WHERE [format_table_name("admin_ranks")].rank IS NULL") var/datum/DBQuery/query_check_admin_errors = SSdbcore.NewQuery("SELECT (SELECT byond_key FROM [format_table_name("player")] WHERE [format_table_name("player")].ckey = [format_table_name("admin")].ckey), [format_table_name("admin")].rank FROM [format_table_name("admin")] LEFT JOIN [format_table_name("admin_ranks")] ON [format_table_name("admin_ranks")].rank = [format_table_name("admin")].rank WHERE [format_table_name("admin_ranks")].rank IS NULL")
if(!query_check_admin_errors.warn_execute()) if(!query_check_admin_errors.warn_execute())
qdel(query_check_admin_errors) qdel(query_check_admin_errors)
return return
while(query_check_admin_errors.NextRow()) while(query_check_admin_errors.NextRow())
var/admin_ckey = query_check_admin_errors.item[1] var/admin_key = query_check_admin_errors.item[1]
var/admin_rank = query_check_admin_errors.item[2] var/admin_rank = query_check_admin_errors.item[2]
output += "[admin_ckey] has non-existent rank [admin_rank] | <a href='?_src_=holder;[HrefToken()];editrightsbrowsermanage=1;editrightschange=[admin_ckey]'>\[Change Rank\]</a> | <a href='?_src_=holder;[HrefToken()];editrightsbrowsermanage=1;editrightsremove=[admin_ckey]'>\[Remove\]</a>" output += "[admin_key] has non-existent rank [admin_rank] | <a href='?_src_=holder;[HrefToken()];editrightsbrowsermanage=1;editrightschange=[admin_key]'>\[Change Rank\]</a> | <a href='?_src_=holder;[HrefToken()];editrightsbrowsermanage=1;editrightsremove=[admin_key]'>\[Remove\]</a>"
output += "<hr style='background:#000000; border:0; height:1px'>" output += "<hr style='background:#000000; border:0; height:1px'>"
qdel(query_check_admin_errors) qdel(query_check_admin_errors)
output += "<h3>Unused ranks</h3>" output += "<h3>Unused ranks</h3>"
@@ -104,16 +104,18 @@
if (!D) if (!D)
continue continue
var/deadminlink = "" var/deadminlink = ""
if(D.owner)
adm_ckey = D.owner.key
if (D.deadmined) if (D.deadmined)
deadminlink = " <a class='small' href='?src=[REF(src)];[HrefToken()];editrights=activate;ckey=[adm_ckey]'>\[RA\]</a>" deadminlink = " <a class='small' href='?src=[REF(src)];[HrefToken()];editrights=activate;key=[adm_ckey]'>\[RA\]</a>"
else else
deadminlink = " <a class='small' href='?src=[REF(src)];[HrefToken()];editrights=deactivate;ckey=[adm_ckey]'>\[DA\]</a>" deadminlink = " <a class='small' href='?src=[REF(src)];[HrefToken()];editrights=deactivate;key=[adm_ckey]'>\[DA\]</a>"
output += "<tr>" output += "<tr>"
output += "<td style='text-align:center;'>[adm_ckey]<br>[deadminlink]<a class='small' href='?src=[REF(src)];[HrefToken()];editrights=remove;ckey=[adm_ckey]'>\[-\]</a><a class='small' href='?src=[REF(src)];[HrefToken()];editrights=sync;ckey=[adm_ckey]'>\[SYNC TGDB\]</a></td>" output += "<td style='text-align:center;'>[adm_ckey]<br>[deadminlink]<a class='small' href='?src=[REF(src)];[HrefToken()];editrights=remove;key=[adm_ckey]'>\[-\]</a><a class='small' href='?src=[REF(src)];[HrefToken()];editrights=sync;key=[adm_ckey]'>\[SYNC TGDB\]</a></td>"
output += "<td><a href='?src=[REF(src)];[HrefToken()];editrights=rank;ckey=[adm_ckey]'>[D.rank.name]</a></td>" output += "<td><a href='?src=[REF(src)];[HrefToken()];editrights=rank;key=[adm_ckey]'>[D.rank.name]</a></td>"
output += "<td><a class='small' href='?src=[REF(src)];[HrefToken()];editrights=permissions;ckey=[adm_ckey]'>[rights2text(D.rank.include_rights," ")]</a></td>" output += "<td><a class='small' href='?src=[REF(src)];[HrefToken()];editrights=permissions;key=[adm_ckey]'>[rights2text(D.rank.include_rights," ")]</a></td>"
output += "<td><a class='small' href='?src=[REF(src)];[HrefToken()];editrights=permissions;ckey=[adm_ckey]'>[rights2text(D.rank.exclude_rights," ", "-")]</a></td>" output += "<td><a class='small' href='?src=[REF(src)];[HrefToken()];editrights=permissions;key=[adm_ckey]'>[rights2text(D.rank.exclude_rights," ", "-")]</a></td>"
output += "<td><a class='small' href='?src=[REF(src)];[HrefToken()];editrights=permissions;ckey=[adm_ckey]'>[rights2text(D.rank.can_edit_rights," ", "*")]</a></td>" output += "<td><a class='small' href='?src=[REF(src)];[HrefToken()];editrights=permissions;key=[adm_ckey]'>[rights2text(D.rank.can_edit_rights," ", "*")]</a></td>"
output += "</tr>" output += "</tr>"
output += "</table></div><div id='top'><b>Search:</b> <input type='text' id='filter' value='' style='width:70%;' onkeyup='updateSearch();'></div></body>" output += "</table></div><div id='top'><b>Search:</b> <input type='text' id='filter' value='' style='width:70%;' onkeyup='updateSearch();'></div></body>"
if(QDELETED(usr)) if(QDELETED(usr))
@@ -130,7 +132,8 @@
return return
var/datum/asset/permissions_assets = get_asset_datum(/datum/asset/simple/permissions) var/datum/asset/permissions_assets = get_asset_datum(/datum/asset/simple/permissions)
permissions_assets.send(src) permissions_assets.send(src)
var/admin_ckey = ckey(href_list["ckey"]) var/admin_key = href_list["key"]
var/admin_ckey = ckey(admin_key)
var/datum/admins/D = GLOB.admin_datums[admin_ckey] var/datum/admins/D = GLOB.admin_datums[admin_ckey]
var/use_db var/use_db
var/task = href_list["editrights"] var/task = href_list["editrights"]
@@ -172,38 +175,39 @@
if(!D) if(!D)
return return
if((task != "sync") && !check_if_greater_rights_than_holder(D)) if((task != "sync") && !check_if_greater_rights_than_holder(D))
message_admins("[key_name_admin(usr)] attempted to change the rank of [admin_ckey] without sufficient rights.") message_admins("[key_name_admin(usr)] attempted to change the rank of [admin_key] without sufficient rights.")
log_admin("[key_name(usr)] attempted to change the rank of [admin_ckey] without sufficient rights.") log_admin("[key_name(usr)] attempted to change the rank of [admin_key] without sufficient rights.")
return return
switch(task) switch(task)
if("add") if("add")
admin_ckey = add_admin(admin_ckey, use_db) admin_ckey = add_admin(admin_ckey, admin_key, use_db)
if(!admin_ckey) if(!admin_ckey)
return return
change_admin_rank(admin_ckey, use_db, null, legacy_only) change_admin_rank(admin_ckey, admin_key, use_db, null, legacy_only)
if("remove") if("remove")
remove_admin(admin_ckey, use_db, D) remove_admin(admin_ckey, admin_key, use_db, D)
if("rank") if("rank")
change_admin_rank(admin_ckey, use_db, D, legacy_only) change_admin_rank(admin_ckey, admin_key, use_db, D, legacy_only)
if("permissions") if("permissions")
change_admin_flags(admin_ckey, use_db, D, legacy_only) change_admin_flags(admin_ckey, admin_key, use_db, D, legacy_only)
if("activate") if("activate")
force_readmin(admin_ckey, D) force_readmin(admin_key, D)
if("deactivate") if("deactivate")
force_deadmin(admin_ckey, D) force_deadmin(admin_key, D)
if("sync") if("sync")
sync_lastadminrank(admin_ckey, D) sync_lastadminrank(admin_ckey, admin_key, D)
edit_admin_permissions() edit_admin_permissions()
/datum/admins/proc/add_admin(admin_ckey, use_db) /datum/admins/proc/add_admin(admin_ckey, admin_key, use_db)
if(admin_ckey) if(admin_ckey)
. = admin_ckey . = admin_ckey
else else
. = ckey(input("New admin's ckey","Admin ckey") as text|null) admin_key = input("New admin's key","Admin key") as text|null
. = ckey(admin_key)
if(!.) if(!.)
return FALSE return FALSE
if(!admin_ckey && (. in GLOB.admin_datums+GLOB.deadmins)) if(!admin_ckey && (. in GLOB.admin_datums+GLOB.deadmins))
to_chat(usr, "<span class='danger'>[.] is already an admin.</span>") to_chat(usr, "<span class='danger'>[admin_key] is already an admin.</span>")
return FALSE return FALSE
if(use_db) if(use_db)
. = sanitizeSQL(.) . = sanitizeSQL(.)
@@ -214,7 +218,7 @@
return FALSE return FALSE
if(query_admin_in_db.NextRow()) if(query_admin_in_db.NextRow())
qdel(query_admin_in_db) qdel(query_admin_in_db)
to_chat(usr, "<span class='danger'>[.] already listed in admin database. Check the Management tab if they don't appear in the list of admins.</span>") to_chat(usr, "<span class='danger'>[admin_key] already listed in admin database. Check the Management tab if they don't appear in the list of admins.</span>")
return FALSE return FALSE
qdel(query_admin_in_db) qdel(query_admin_in_db)
var/datum/DBQuery/query_add_admin = SSdbcore.NewQuery("INSERT INTO [format_table_name("admin")] (ckey, rank) VALUES ('[.]', 'NEW ADMIN')") var/datum/DBQuery/query_add_admin = SSdbcore.NewQuery("INSERT INTO [format_table_name("admin")] (ckey, rank) VALUES ('[.]', 'NEW ADMIN')")
@@ -228,14 +232,14 @@
return FALSE return FALSE
qdel(query_add_admin_log) qdel(query_add_admin_log)
/datum/admins/proc/remove_admin(admin_ckey, use_db, datum/admins/D) /datum/admins/proc/remove_admin(admin_ckey, admin_key, use_db, datum/admins/D)
if(alert("Are you sure you want to remove [admin_ckey]?","Confirm Removal","Do it","Cancel") == "Do it") if(alert("Are you sure you want to remove [admin_ckey]?","Confirm Removal","Do it","Cancel") == "Do it")
GLOB.admin_datums -= admin_ckey GLOB.admin_datums -= admin_ckey
GLOB.deadmins -= admin_ckey GLOB.deadmins -= admin_ckey
if(D) if(D)
D.disassociate() D.disassociate()
var/m1 = "[key_name_admin(usr)] removed [admin_ckey] from the admins list [use_db ? "permanently" : "temporarily"]" var/m1 = "[key_name_admin(usr)] removed [admin_key] from the admins list [use_db ? "permanently" : "temporarily"]"
var/m2 = "[key_name(usr)] removed [admin_ckey] from the admins list [use_db ? "permanently" : "temporarily"]" var/m2 = "[key_name(usr)] removed [admin_key] from the admins list [use_db ? "permanently" : "temporarily"]"
if(use_db) if(use_db)
var/datum/DBQuery/query_add_rank = SSdbcore.NewQuery("DELETE FROM [format_table_name("admin")] WHERE ckey = '[admin_ckey]'") var/datum/DBQuery/query_add_rank = SSdbcore.NewQuery("DELETE FROM [format_table_name("admin")] WHERE ckey = '[admin_ckey]'")
if(!query_add_rank.warn_execute()) if(!query_add_rank.warn_execute())
@@ -247,25 +251,25 @@
qdel(query_add_rank_log) qdel(query_add_rank_log)
return return
qdel(query_add_rank_log) qdel(query_add_rank_log)
sync_lastadminrank(admin_ckey) sync_lastadminrank(admin_ckey, admin_key)
message_admins(m1) message_admins(m1)
log_admin(m2) log_admin(m2)
/datum/admins/proc/force_readmin(admin_ckey, datum/admins/D) /datum/admins/proc/force_readmin(admin_key, datum/admins/D)
if(!D || !D.deadmined) if(!D || !D.deadmined)
return return
D.activate() D.activate()
message_admins("[key_name_admin(usr)] forcefully readmined [admin_ckey]") message_admins("[key_name_admin(usr)] forcefully readmined [admin_key]")
log_admin("[key_name(usr)] forcefully readmined [admin_ckey]") log_admin("[key_name(usr)] forcefully readmined [admin_key]")
/datum/admins/proc/force_deadmin(admin_ckey, datum/admins/D) /datum/admins/proc/force_deadmin(admin_key, datum/admins/D)
if(!D || D.deadmined) if(!D || D.deadmined)
return return
message_admins("[key_name_admin(usr)] forcefully deadmined [admin_ckey]") message_admins("[key_name_admin(usr)] forcefully deadmined [admin_key]")
log_admin("[key_name(usr)] forcefully deadmined [admin_ckey]") log_admin("[key_name(usr)] forcefully deadmined [admin_key]")
D.deactivate() //after logs so the deadmined admin can see the message. D.deactivate() //after logs so the deadmined admin can see the message.
/datum/admins/proc/change_admin_rank(admin_ckey, use_db, datum/admins/D, legacy_only) /datum/admins/proc/change_admin_rank(admin_ckey, admin_key, use_db, datum/admins/D, legacy_only)
var/datum/admin_rank/R var/datum/admin_rank/R
var/list/rank_names = list() var/list/rank_names = list()
if(!use_db || (use_db && !legacy_only)) if(!use_db || (use_db && !legacy_only))
@@ -285,8 +289,8 @@
else else
R = new(new_rank) //blank new admin_rank R = new(new_rank) //blank new admin_rank
GLOB.admin_ranks += R GLOB.admin_ranks += R
var/m1 = "[key_name_admin(usr)] edited the admin rank of [admin_ckey] to [new_rank] [use_db ? "permanently" : "temporarily"]" var/m1 = "[key_name_admin(usr)] edited the admin rank of [admin_key] to [new_rank] [use_db ? "permanently" : "temporarily"]"
var/m2 = "[key_name(usr)] edited the admin rank of [admin_ckey] to [new_rank] [use_db ? "permanently" : "temporarily"]" var/m2 = "[key_name(usr)] edited the admin rank of [admin_key] to [new_rank] [use_db ? "permanently" : "temporarily"]"
if(use_db) if(use_db)
new_rank = sanitizeSQL(new_rank) new_rank = sanitizeSQL(new_rank)
//if a player was tempminned before having a permanent change made to their rank they won't yet be in the db //if a player was tempminned before having a permanent change made to their rank they won't yet be in the db
@@ -296,7 +300,7 @@
qdel(query_admin_in_db) qdel(query_admin_in_db)
return return
if(!query_admin_in_db.NextRow()) if(!query_admin_in_db.NextRow())
add_admin(admin_ckey, TRUE) add_admin(admin_ckey, admin_key, TRUE)
old_rank = "NEW ADMIN" old_rank = "NEW ADMIN"
else else
old_rank = query_admin_in_db.item[1] old_rank = query_admin_in_db.item[1]
@@ -339,18 +343,18 @@
message_admins(m1) message_admins(m1)
log_admin(m2) log_admin(m2)
/datum/admins/proc/change_admin_flags(admin_ckey, use_db, datum/admins/D, legacy_only) /datum/admins/proc/change_admin_flags(admin_ckey, admin_key, use_db, datum/admins/D, legacy_only)
var/new_flags = input_bitfield(usr, "Include permission flags<br>[use_db ? "This will affect ALL admins with this rank." : "This will affect only the current admin [admin_ckey]"]", "admin_flags", D.rank.include_rights, 350, 590, allowed_edit_list = usr.client.holder.rank.can_edit_rights) var/new_flags = input_bitfield(usr, "Include permission flags<br>[use_db ? "This will affect ALL admins with this rank." : "This will affect only the current admin [admin_key]"]", "admin_flags", D.rank.include_rights, 350, 590, allowed_edit_list = usr.client.holder.rank.can_edit_rights)
if(isnull(new_flags)) if(isnull(new_flags))
return return
var/new_exclude_flags = input_bitfield(usr, "Exclude permission flags<br>Flags enabled here will be removed from a rank.<br>Note these take precedence over included flags.<br>[use_db ? "This will affect ALL admins with this rank." : "This will affect only the current admin [admin_ckey]"]", "admin_flags", D.rank.exclude_rights, 350, 670, "red", usr.client.holder.rank.can_edit_rights) var/new_exclude_flags = input_bitfield(usr, "Exclude permission flags<br>Flags enabled here will be removed from a rank.<br>Note these take precedence over included flags.<br>[use_db ? "This will affect ALL admins with this rank." : "This will affect only the current admin [admin_key]"]", "admin_flags", D.rank.exclude_rights, 350, 670, "red", usr.client.holder.rank.can_edit_rights)
if(isnull(new_exclude_flags)) if(isnull(new_exclude_flags))
return return
var/new_can_edit_flags = input_bitfield(usr, "Editable permission flags<br>These are the flags this rank is allowed to edit if they have access to the permissions panel.<br>They will be unable to modify admins to a rank that has a flag not included here.<br>[use_db ? "This will affect ALL admins with this rank." : "This will affect only the current admin [admin_ckey]"]", "admin_flags", D.rank.can_edit_rights, 350, 710, allowed_edit_list = usr.client.holder.rank.can_edit_rights) var/new_can_edit_flags = input_bitfield(usr, "Editable permission flags<br>These are the flags this rank is allowed to edit if they have access to the permissions panel.<br>They will be unable to modify admins to a rank that has a flag not included here.<br>[use_db ? "This will affect ALL admins with this rank." : "This will affect only the current admin [admin_key]"]", "admin_flags", D.rank.can_edit_rights, 350, 710, allowed_edit_list = usr.client.holder.rank.can_edit_rights)
if(isnull(new_can_edit_flags)) if(isnull(new_can_edit_flags))
return return
var/m1 = "[key_name_admin(usr)] edited the permissions of [use_db ? " rank [D.rank.name] permanently" : "[admin_ckey] temporarily"]" var/m1 = "[key_name_admin(usr)] edited the permissions of [use_db ? " rank [D.rank.name] permanently" : "[admin_key] temporarily"]"
var/m2 = "[key_name(usr)] edited the permissions of [use_db ? " rank [D.rank.name] permanently" : "[admin_ckey] temporarily"]" var/m2 = "[key_name(usr)] edited the permissions of [use_db ? " rank [D.rank.name] permanently" : "[admin_key] temporarily"]"
if(use_db || legacy_only) if(use_db || legacy_only)
var/old_flags var/old_flags
var/old_exclude_flags var/old_exclude_flags
@@ -446,7 +450,7 @@
message_admins(m1) message_admins(m1)
log_admin(m2) log_admin(m2)
/datum/admins/proc/sync_lastadminrank(admin_ckey, datum/admins/D) /datum/admins/proc/sync_lastadminrank(admin_ckey, admin_key, datum/admins/D)
var/sqlrank = "Player" var/sqlrank = "Player"
if (D) if (D)
sqlrank = sanitizeSQL(D.rank.name) sqlrank = sanitizeSQL(D.rank.name)
@@ -456,4 +460,4 @@
qdel(query_sync_lastadminrank) qdel(query_sync_lastadminrank)
return return
qdel(query_sync_lastadminrank) qdel(query_sync_lastadminrank)
to_chat(usr, "<span class='admin'>Sync of [admin_ckey] successful.</span>") to_chat(usr, "<span class='admin'>Sync of [admin_key] successful.</span>")

View File

@@ -1,28 +1,32 @@
/proc/create_message(type, target_ckey, admin_ckey, text, timestamp, server, secret, logged = 1, browse) /proc/create_message(type, target_key, admin_ckey, text, timestamp, server, secret, logged = 1, browse)
if(!SSdbcore.Connect()) if(!SSdbcore.Connect())
to_chat(usr, "<span class='danger'>Failed to establish database connection.</span>") to_chat(usr, "<span class='danger'>Failed to establish database connection.</span>")
return return
if(!type) if(!type)
return return
if(!target_ckey && (type == "note" || type == "message" || type == "watchlist entry")) var/target_ckey
var/new_ckey = ckey(input(usr,"Who would you like to create a [type] for?","Enter a ckey",null) as null|text) if(!target_key && (type == "note" || type == "message" || type == "watchlist entry"))
if(!new_ckey) var/new_key = input(usr,"Who would you like to create a [type] for?","Enter a key or ckey",null) as null|text
if(!new_key)
return return
new_ckey = sanitizeSQL(new_ckey) var/new_ckey = sanitizeSQL(ckey(new_key))
var/datum/DBQuery/query_find_ckey = SSdbcore.NewQuery("SELECT ckey FROM [format_table_name("player")] WHERE ckey = '[new_ckey]'") var/datum/DBQuery/query_find_ckey = SSdbcore.NewQuery("SELECT ckey FROM [format_table_name("player")] WHERE ckey = '[new_ckey]'")
if(!query_find_ckey.warn_execute()) if(!query_find_ckey.warn_execute())
qdel(query_find_ckey) qdel(query_find_ckey)
return return
if(!query_find_ckey.NextRow()) if(!query_find_ckey.NextRow())
if(alert(usr, "[new_ckey] has not been seen before, are you sure you want to create a [type] for them?", "Unknown ckey", "Yes", "No", "Cancel") != "Yes") if(alert(usr, "[new_key]/([new_ckey]) has not been seen before, are you sure you want to create a [type] for them?", "Unknown ckey", "Yes", "No", "Cancel") != "Yes")
qdel(query_find_ckey) qdel(query_find_ckey)
return return
qdel(query_find_ckey) qdel(query_find_ckey)
target_ckey = new_ckey target_ckey = new_ckey
target_key = new_key
if(QDELETED(usr)) if(QDELETED(usr))
return return
if(target_ckey) if(target_ckey)
target_ckey = sanitizeSQL(target_ckey) target_ckey = sanitizeSQL(target_ckey)
if(!target_key)
target_key = target_ckey
if(!admin_ckey) if(!admin_ckey)
admin_ckey = usr.ckey admin_ckey = usr.ckey
if(!admin_ckey) if(!admin_ckey)
@@ -51,8 +55,8 @@
else else
return return
var/datum/DBQuery/query_create_message = SSdbcore.NewQuery("INSERT INTO [format_table_name("messages")] (type, targetckey, adminckey, text, timestamp, server, server_ip, server_port, round_id, secret) VALUES ('[type]', '[target_ckey]', '[admin_ckey]', '[text]', '[timestamp]', '[server]', INET_ATON(IF('[world.internet_address]' LIKE '', '0', '[world.internet_address]')), '[world.port]', '[GLOB.round_id]','[secret]')") var/datum/DBQuery/query_create_message = SSdbcore.NewQuery("INSERT INTO [format_table_name("messages")] (type, targetckey, adminckey, text, timestamp, server, server_ip, server_port, round_id, secret) VALUES ('[type]', '[target_ckey]', '[admin_ckey]', '[text]', '[timestamp]', '[server]', INET_ATON(IF('[world.internet_address]' LIKE '', '0', '[world.internet_address]')), '[world.port]', '[GLOB.round_id]','[secret]')")
var/pm = "[key_name(usr)] has created a [type][(type == "note" || type == "message" || type == "watchlist entry") ? " for [target_ckey]" : ""]: [text]" var/pm = "[key_name(usr)] has created a [type][(type == "note" || type == "message" || type == "watchlist entry") ? " for [target_key]" : ""]: [text]"
var/header = "[key_name_admin(usr)] has created a [type][(type == "note" || type == "message" || type == "watchlist entry") ? " for [target_ckey]" : ""]" var/header = "[key_name_admin(usr)] has created a [type][(type == "note" || type == "message" || type == "watchlist entry") ? " for [target_key]" : ""]"
if(!query_create_message.warn_execute()) if(!query_create_message.warn_execute())
qdel(query_create_message) qdel(query_create_message)
return return
@@ -75,18 +79,18 @@
if(!message_id) if(!message_id)
return return
var/type var/type
var/target_ckey var/target_key
var/text var/text
var/user_key_name = key_name(usr) var/user_key_name = key_name(usr)
var/user_name_admin = key_name_admin(usr) var/user_name_admin = key_name_admin(usr)
var/datum/DBQuery/query_find_del_message = SSdbcore.NewQuery("SELECT type, targetckey, adminckey, text FROM [format_table_name("messages")] WHERE id = [message_id] AND deleted = 0") var/datum/DBQuery/query_find_del_message = SSdbcore.NewQuery("SELECT type, (SELECT byond_key FROM [format_table_name("player")] WHERE ckey = targetckey), text FROM [format_table_name("messages")] WHERE id = [message_id] AND deleted = 0")
if(!query_find_del_message.warn_execute()) if(!query_find_del_message.warn_execute())
qdel(query_find_del_message) qdel(query_find_del_message)
return return
if(query_find_del_message.NextRow()) if(query_find_del_message.NextRow())
type = query_find_del_message.item[1] type = query_find_del_message.item[1]
target_ckey = query_find_del_message.item[2] target_key = query_find_del_message.item[2]
text = query_find_del_message.item[4] text = query_find_del_message.item[3]
qdel(query_find_del_message) qdel(query_find_del_message)
var/datum/DBQuery/query_del_message = SSdbcore.NewQuery("UPDATE [format_table_name("messages")] SET deleted = 1 WHERE id = [message_id]") var/datum/DBQuery/query_del_message = SSdbcore.NewQuery("UPDATE [format_table_name("messages")] SET deleted = 1 WHERE id = [message_id]")
if(!query_del_message.warn_execute()) if(!query_del_message.warn_execute())
@@ -94,14 +98,14 @@
return return
qdel(query_del_message) qdel(query_del_message)
if(logged) if(logged)
var/m1 = "[user_key_name] has deleted a [type][(type == "note" || type == "message" || type == "watchlist entry") ? " for" : " made by"] [target_ckey]: [text]" var/m1 = "[user_key_name] has deleted a [type][(type == "note" || type == "message" || type == "watchlist entry") ? " for" : " made by"] [target_key]: [text]"
var/m2 = "[user_name_admin] has deleted a [type][(type == "note" || type == "message" || type == "watchlist entry") ? " for" : " made by"] [target_ckey]:<br>[text]" var/m2 = "[user_name_admin] has deleted a [type][(type == "note" || type == "message" || type == "watchlist entry") ? " for" : " made by"] [target_key]:<br>[text]"
log_admin_private(m1) log_admin_private(m1)
message_admins(m2) message_admins(m2)
if(browse) if(browse)
browse_messages("[type]") browse_messages("[type]")
else else
browse_messages(target_ckey = target_ckey, agegate = TRUE) browse_messages(target_ckey = ckey(target_key), agegate = TRUE)
/proc/edit_message(message_id, browse) /proc/edit_message(message_id, browse)
if(!SSdbcore.Connect()) if(!SSdbcore.Connect())
@@ -110,33 +114,36 @@
message_id = text2num(message_id) message_id = text2num(message_id)
if(!message_id) if(!message_id)
return return
var/datum/DBQuery/query_find_edit_message = SSdbcore.NewQuery("SELECT type, targetckey, adminckey, text FROM [format_table_name("messages")] WHERE id = [message_id] AND deleted = 0") var/editor_ckey = sanitizeSQL(usr.ckey)
var/editor_key = sanitizeSQL(usr.key)
var/kn = key_name(usr)
var/kna = key_name_admin(usr)
var/datum/DBQuery/query_find_edit_message = SSdbcore.NewQuery("SELECT type, (SELECT byond_key FROM [format_table_name("player")] WHERE ckey = targetckey), (SELECT byond_key FROM [format_table_name("player")] WHERE ckey = adminckey), text FROM [format_table_name("messages")] WHERE id = [message_id] AND deleted = 0")
if(!query_find_edit_message.warn_execute()) if(!query_find_edit_message.warn_execute())
qdel(query_find_edit_message) qdel(query_find_edit_message)
return return
if(query_find_edit_message.NextRow()) if(query_find_edit_message.NextRow())
var/type = query_find_edit_message.item[1] var/type = query_find_edit_message.item[1]
var/target_ckey = query_find_edit_message.item[2] var/target_key = query_find_edit_message.item[2]
var/admin_ckey = query_find_edit_message.item[3] var/admin_key = query_find_edit_message.item[3]
var/old_text = query_find_edit_message.item[4] var/old_text = query_find_edit_message.item[4]
var/editor_ckey = sanitizeSQL(usr.ckey)
var/new_text = input("Input new [type]", "New [type]", "[old_text]") as null|message var/new_text = input("Input new [type]", "New [type]", "[old_text]") as null|message
if(!new_text) if(!new_text)
qdel(query_find_edit_message) qdel(query_find_edit_message)
return return
new_text = sanitizeSQL(new_text) new_text = sanitizeSQL(new_text)
var/edit_text = sanitizeSQL("Edited by [editor_ckey] on [SQLtime()] from<br>[old_text]<br>to<br>[new_text]<hr>") var/edit_text = sanitizeSQL("Edited by [editor_key] on [SQLtime()] from<br>[old_text]<br>to<br>[new_text]<hr>")
var/datum/DBQuery/query_edit_message = SSdbcore.NewQuery("UPDATE [format_table_name("messages")] SET text = '[new_text]', lasteditor = '[editor_ckey]', edits = CONCAT(IFNULL(edits,''),'[edit_text]') WHERE id = [message_id] AND deleted = 0") var/datum/DBQuery/query_edit_message = SSdbcore.NewQuery("UPDATE [format_table_name("messages")] SET text = '[new_text]', lasteditor = '[editor_ckey]', edits = CONCAT(IFNULL(edits,''),'[edit_text]') WHERE id = [message_id] AND deleted = 0")
if(!query_edit_message.warn_execute()) if(!query_edit_message.warn_execute())
qdel(query_edit_message) qdel(query_edit_message)
return return
qdel(query_edit_message) qdel(query_edit_message)
log_admin_private("[key_name(usr)] has edited a [type] [(type == "note" || type == "message" || type == "watchlist entry") ? " for [target_ckey]" : ""] made by [admin_ckey] from [old_text] to [new_text]") log_admin_private("[kn] has edited a [type] [(type == "note" || type == "message" || type == "watchlist entry") ? " for [target_key]" : ""] made by [admin_key] from [old_text] to [new_text]")
message_admins("[key_name_admin(usr)] has edited a [type] [(type == "note" || type == "message" || type == "watchlist entry") ? " for [target_ckey]" : ""] made by [admin_ckey] from<br>[old_text]<br>to<br>[new_text]") message_admins("[kna] has edited a [type] [(type == "note" || type == "message" || type == "watchlist entry") ? " for [target_key]" : ""] made by [admin_key] from<br>[old_text]<br>to<br>[new_text]")
if(browse) if(browse)
browse_messages("[type]") browse_messages("[type]")
else else
browse_messages(target_ckey = target_ckey, agegate = TRUE) browse_messages(target_ckey = ckey(target_key), agegate = TRUE)
qdel(query_find_edit_message) qdel(query_find_edit_message)
/proc/toggle_message_secrecy(message_id) /proc/toggle_message_secrecy(message_id)
@@ -146,29 +153,29 @@
message_id = text2num(message_id) message_id = text2num(message_id)
if(!message_id) if(!message_id)
return return
var/editor_ckey = usr.ckey var/editor_ckey = sanitizeSQL(usr.ckey)
var/editor_key = sanitizeSQL(usr.key)
var/kn = key_name(usr) var/kn = key_name(usr)
var/kna = key_name_admin(usr) var/kna = key_name_admin(usr)
var/datum/DBQuery/query_find_message_secret = SSdbcore.NewQuery("SELECT type, targetckey, adminckey, secret FROM [format_table_name("messages")] WHERE id = [message_id] AND deleted = 0") var/datum/DBQuery/query_find_message_secret = SSdbcore.NewQuery("SELECT type, (SELECT byond_key FROM [format_table_name("player")] WHERE ckey = targetckey), (SELECT byond_key FROM [format_table_name("player")] WHERE ckey = adminckey), secret FROM [format_table_name("messages")] WHERE id = [message_id] AND deleted = 0")
if(!query_find_message_secret.warn_execute()) if(!query_find_message_secret.warn_execute())
qdel(query_find_message_secret) qdel(query_find_message_secret)
return return
if(query_find_message_secret.NextRow()) if(query_find_message_secret.NextRow())
var/type = query_find_message_secret.item[1] var/type = query_find_message_secret.item[1]
var/target_ckey = query_find_message_secret.item[2] var/target_key = query_find_message_secret.item[2]
var/admin_ckey = query_find_message_secret.item[3] var/admin_key = query_find_message_secret.item[3]
var/secret = text2num(query_find_message_secret.item[4]) var/secret = text2num(query_find_message_secret.item[4])
editor_ckey = sanitizeSQL(editor_ckey) var/edit_text = "Made [secret ? "not secret" : "secret"] by [editor_key] on [SQLtime()]<hr>"
var/edit_text = "Made [secret ? "not secret" : "secret"] by [editor_ckey] on [SQLtime()]<hr>"
var/datum/DBQuery/query_message_secret = SSdbcore.NewQuery("UPDATE [format_table_name("messages")] SET secret = NOT secret, lasteditor = '[editor_ckey]', edits = CONCAT(IFNULL(edits,''),'[edit_text]') WHERE id = [message_id]") var/datum/DBQuery/query_message_secret = SSdbcore.NewQuery("UPDATE [format_table_name("messages")] SET secret = NOT secret, lasteditor = '[editor_ckey]', edits = CONCAT(IFNULL(edits,''),'[edit_text]') WHERE id = [message_id]")
if(!query_message_secret.warn_execute()) if(!query_message_secret.warn_execute())
qdel(query_find_message_secret) qdel(query_find_message_secret)
qdel(query_message_secret) qdel(query_message_secret)
return return
qdel(query_message_secret) qdel(query_message_secret)
log_admin_private("[kn] has toggled [target_ckey]'s [type] made by [admin_ckey] to [secret ? "not secret" : "secret"]") log_admin_private("[kn] has toggled [target_key]'s [type] made by [admin_key] to [secret ? "not secret" : "secret"]")
message_admins("[kna] has toggled [target_ckey]'s [type] made by [admin_ckey] to [secret ? "not secret" : "secret"]") message_admins("[kna] has toggled [target_key]'s [type] made by [admin_key] to [secret ? "not secret" : "secret"]")
browse_messages(target_ckey = target_ckey, agegate = TRUE) browse_messages(target_ckey = ckey(target_key), agegate = TRUE)
qdel(query_find_message_secret) qdel(query_find_message_secret)
/proc/browse_messages(type, target_ckey, index, linkless = FALSE, filter, agegate = FALSE) /proc/browse_messages(type, target_ckey, index, linkless = FALSE, filter, agegate = FALSE)
@@ -200,7 +207,7 @@
else else
output += "|<a href='?_src_=holder;[HrefToken()];showwatchfilter=1'>\[Filter offline clients\]</a></center>" output += "|<a href='?_src_=holder;[HrefToken()];showwatchfilter=1'>\[Filter offline clients\]</a></center>"
output += ruler output += ruler
var/datum/DBQuery/query_get_type_messages = SSdbcore.NewQuery("SELECT id, targetckey, adminckey, text, timestamp, server, lasteditor FROM [format_table_name("messages")] WHERE type = '[type]' AND deleted = 0") var/datum/DBQuery/query_get_type_messages = SSdbcore.NewQuery("SELECT id, (SELECT byond_key FROM [format_table_name("player")] WHERE ckey = targetckey), targetckey, (SELECT byond_key FROM [format_table_name("player")] WHERE ckey = adminckey), text, timestamp, server, (SELECT byond_key FROM [format_table_name("player")] WHERE ckey = lasteditor) FROM [format_table_name("messages")] WHERE type = '[type]' AND deleted = 0")
if(!query_get_type_messages.warn_execute()) if(!query_get_type_messages.warn_execute())
qdel(query_get_type_messages) qdel(query_get_type_messages)
return return
@@ -208,27 +215,29 @@
if(QDELETED(usr)) if(QDELETED(usr))
return return
var/id = query_get_type_messages.item[1] var/id = query_get_type_messages.item[1]
var/t_ckey = query_get_type_messages.item[2] var/t_key = query_get_type_messages.item[2]
var/t_ckey = query_get_type_messages.item[3]
if(type == "watchlist entry" && filter && !(t_ckey in GLOB.directory)) if(type == "watchlist entry" && filter && !(t_ckey in GLOB.directory))
continue continue
var/admin_ckey = query_get_type_messages.item[3] var/admin_key = query_get_type_messages.item[4]
var/text = query_get_type_messages.item[4] var/text = query_get_type_messages.item[5]
var/timestamp = query_get_type_messages.item[5] var/timestamp = query_get_type_messages.item[6]
var/server = query_get_type_messages.item[6] var/server = query_get_type_messages.item[7]
var/editor_ckey = query_get_type_messages.item[7] var/editor_key = query_get_type_messages.item[8]
output += "<b>" output += "<b>"
if(type == "watchlist entry") if(type == "watchlist entry")
output += "[t_ckey] | " output += "[t_key] | "
output += "[timestamp] | [server] | [admin_ckey]</b>" output += "[timestamp] | [server] | [admin_key]</b>"
output += " <a href='?_src_=holder;[HrefToken()];deletemessageempty=[id]'>\[Delete\]</a>" output += " <a href='?_src_=holder;[HrefToken()];deletemessageempty=[id]'>\[Delete\]</a>"
output += " <a href='?_src_=holder;[HrefToken()];editmessageempty=[id]'>\[Edit\]</a>" output += " <a href='?_src_=holder;[HrefToken()];editmessageempty=[id]'>\[Edit\]</a>"
if(editor_ckey) if(editor_key)
output += " <font size='2'>Last edit by [editor_ckey] <a href='?_src_=holder;[HrefToken()];messageedits=[id]'>(Click here to see edit log)</a></font>" output += " <font size='2'>Last edit by [editor_key] <a href='?_src_=holder;[HrefToken()];messageedits=[id]'>(Click here to see edit log)</a></font>"
output += "<br>[text]<hr style='background:#000000; border:0; height:1px'>" output += "<br>[text]<hr style='background:#000000; border:0; height:1px'>"
qdel(query_get_type_messages) qdel(query_get_type_messages)
if(target_ckey) if(target_ckey)
target_ckey = sanitizeSQL(target_ckey) target_ckey = sanitizeSQL(target_ckey)
var/datum/DBQuery/query_get_messages = SSdbcore.NewQuery("SELECT type, secret, id, adminckey, text, timestamp, server, lasteditor, DATEDIFF(NOW(), timestamp) AS `age` FROM [format_table_name("messages")] WHERE type <> 'memo' AND targetckey = '[target_ckey]' AND deleted = 0 ORDER BY timestamp DESC") var/target_key
var/datum/DBQuery/query_get_messages = SSdbcore.NewQuery("SELECT type, secret, id, (SELECT byond_key FROM [format_table_name("player")] WHERE ckey = adminckey), text, timestamp, server, (SELECT byond_key FROM [format_table_name("player")] WHERE ckey = lasteditor), DATEDIFF(NOW(), timestamp) AS `age`, (SELECT byond_key FROM [format_table_name("player")] WHERE ckey = targetckey) FROM [format_table_name("messages")] WHERE type <> 'memo' AND targetckey = '[target_ckey]' AND deleted = 0 ORDER BY timestamp DESC")
if(!query_get_messages.warn_execute()) if(!query_get_messages.warn_execute())
qdel(query_get_messages) qdel(query_get_messages)
return return
@@ -246,12 +255,13 @@
if(linkless && secret) if(linkless && secret)
continue continue
var/id = query_get_messages.item[3] var/id = query_get_messages.item[3]
var/admin_ckey = query_get_messages.item[4] var/admin_key = query_get_messages.item[4]
var/text = query_get_messages.item[5] var/text = query_get_messages.item[5]
var/timestamp = query_get_messages.item[6] var/timestamp = query_get_messages.item[6]
var/server = query_get_messages.item[7] var/server = query_get_messages.item[7]
var/editor_ckey = query_get_messages.item[8] var/editor_key = query_get_messages.item[8]
var/age = text2num(query_get_messages.item[9]) var/age = text2num(query_get_messages.item[9])
target_key = query_get_messages.item[10]
var/alphatext = "" var/alphatext = ""
var/nsd = CONFIG_GET(number/note_stale_days) var/nsd = CONFIG_GET(number/note_stale_days)
var/nfd = CONFIG_GET(number/note_fresh_days) var/nfd = CONFIG_GET(number/note_fresh_days)
@@ -266,19 +276,19 @@
skipped = TRUE skipped = TRUE
alphatext = "filter: alpha(opacity=[alpha]); opacity: [alpha/100];" alphatext = "filter: alpha(opacity=[alpha]); opacity: [alpha/100];"
var/list/data = list("<p style='margin:0px;[alphatext]'> <b>[timestamp] | [server] | [admin_ckey]</b>") var/list/data = list("<p style='margin:0px;[alphatext]'> <b>[timestamp] | [server] | [admin_key]</b>")
if(!linkless) if(!linkless)
data += " <a href='?_src_=holder;[HrefToken()];deletemessage=[id]'>\[Delete\]</a>" data += " <a href='?_src_=holder;[HrefToken()];deletemessage=[id]'>\[Delete\]</a>"
if(type == "note") if(type == "note")
data += " <a href='?_src_=holder;[HrefToken()];secretmessage=[id]'>[secret ? "<b>\[Secret\]</b>" : "\[Not secret\]"]</a>" data += " <a href='?_src_=holder;[HrefToken()];secretmessage=[id]'>[secret ? "<b>\[Secret\]</b>" : "\[Not secret\]"]</a>"
if(type == "message sent") if(type == "message sent")
data += " <font size='2'>Message has been sent</font>" data += " <font size='2'>Message has been sent</font>"
if(editor_ckey) if(editor_key)
data += "|" data += "|"
else else
data += " <a href='?_src_=holder;[HrefToken()];editmessage=[id]'>\[Edit\]</a>" data += " <a href='?_src_=holder;[HrefToken()];editmessage=[id]'>\[Edit\]</a>"
if(editor_ckey) if(editor_key)
data += " <font size='2'>Last edit by [editor_ckey] <a href='?_src_=holder;[HrefToken()];messageedits=[id]'>(Click here to see edit log)</a></font>" data += " <font size='2'>Last edit by [editor_key] <a href='?_src_=holder;[HrefToken()];messageedits=[id]'>(Click here to see edit log)</a></font>"
data += "<br>[text]</p><hr style='background:#000000; border:0; height:1px; [alphatext]'>" data += "<br>[text]</p><hr style='background:#000000; border:0; height:1px; [alphatext]'>"
switch(type) switch(type)
if("message") if("message")
@@ -290,11 +300,11 @@
if("note") if("note")
notedata += data notedata += data
qdel(query_get_messages) qdel(query_get_messages)
output += "<h2><center>[target_ckey]</center></h2><center>" output += "<h2><center>[target_key]</center></h2><center>"
if(!linkless) if(!linkless)
output += "<a href='?_src_=holder;[HrefToken()];addnote=[target_ckey]'>\[Add note\]</a>" output += "<a href='?_src_=holder;[HrefToken()];addnote=[target_key]'>\[Add note\]</a>"
output += " <a href='?_src_=holder;[HrefToken()];addmessage=[target_ckey]'>\[Add message\]</a>" output += " <a href='?_src_=holder;[HrefToken()];addmessage=[target_key]'>\[Add message\]</a>"
output += " <a href='?_src_=holder;[HrefToken()];addwatch=[target_ckey]'>\[Add to watchlist\]</a>" output += " <a href='?_src_=holder;[HrefToken()];addwatch=[target_key]'>\[Add to watchlist\]</a>"
output += " <a href='?_src_=holder;[HrefToken()];showmessageckey=[target_ckey]'>\[Refresh page\]</a></center>" output += " <a href='?_src_=holder;[HrefToken()];showmessageckey=[target_ckey]'>\[Refresh page\]</a></center>"
else else
output += " <a href='?_src_=holder;[HrefToken()];showmessageckeylinkless=[target_ckey]'>\[Refresh page\]</a></center>" output += " <a href='?_src_=holder;[HrefToken()];showmessageckeylinkless=[target_ckey]'>\[Refresh page\]</a></center>"
@@ -318,7 +328,6 @@
else else
output += " <center><a href='?_src_=holder;[HrefToken()];showmessageckey=[target_ckey]'>\[Hide Old\]</center>" output += " <center><a href='?_src_=holder;[HrefToken()];showmessageckey=[target_ckey]'>\[Hide Old\]</center>"
if(index) if(index)
var/index_ckey
var/search var/search
output += "<center><a href='?_src_=holder;[HrefToken()];addmessageempty=1'>\[Add message\]</a><a href='?_src_=holder;[HrefToken()];addwatchempty=1'>\[Add watchlist entry\]</a><a href='?_src_=holder;[HrefToken()];addnoteempty=1'>\[Add note\]</a></center>" output += "<center><a href='?_src_=holder;[HrefToken()];addmessageempty=1'>\[Add message\]</a><a href='?_src_=holder;[HrefToken()];addwatchempty=1'>\[Add watchlist entry\]</a><a href='?_src_=holder;[HrefToken()];addnoteempty=1'>\[Add note\]</a></center>"
output += ruler output += ruler
@@ -331,15 +340,16 @@
search = "^\[^\[:alpha:\]\]" search = "^\[^\[:alpha:\]\]"
else else
search = "^[index]" search = "^[index]"
var/datum/DBQuery/query_list_messages = SSdbcore.NewQuery("SELECT DISTINCT targetckey FROM [format_table_name("messages")] WHERE type <> 'memo' AND targetckey REGEXP '[search]' AND deleted = 0 ORDER BY targetckey") var/datum/DBQuery/query_list_messages = SSdbcore.NewQuery("SELECT DISTINCT targetckey, (SELECT byond_key FROM [format_table_name("player")] WHERE ckey = targetckey) FROM [format_table_name("messages")] WHERE type <> 'memo' AND targetckey REGEXP '[search]' AND deleted = 0 ORDER BY targetckey")
if(!query_list_messages.warn_execute()) if(!query_list_messages.warn_execute())
qdel(query_list_messages) qdel(query_list_messages)
return return
while(query_list_messages.NextRow()) while(query_list_messages.NextRow())
if(QDELETED(usr)) if(QDELETED(usr))
return return
index_ckey = query_list_messages.item[1] var/index_ckey = query_list_messages.item[1]
output += "<a href='?_src_=holder;[HrefToken()];showmessageckey=[index_ckey]'>[index_ckey]</a><br>" var/index_key = query_list_messages.item[2]
output += "<a href='?_src_=holder;[HrefToken()];showmessageckey=[index_ckey]'>[index_key]</a><br>"
qdel(query_list_messages) qdel(query_list_messages)
else if(!type && !target_ckey && !index) else if(!type && !target_ckey && !index)
output += "<center></a> <a href='?_src_=holder;[HrefToken()];addmessageempty=1'>\[Add message\]</a><a href='?_src_=holder;[HrefToken()];addwatchempty=1'>\[Add watchlist entry\]</a><a href='?_src_=holder;[HrefToken()];addnoteempty=1'>\[Add note\]</a></center>" output += "<center></a> <a href='?_src_=holder;[HrefToken()];addmessageempty=1'>\[Add message\]</a><a href='?_src_=holder;[HrefToken()];addwatchempty=1'>\[Add watchlist entry\]</a><a href='?_src_=holder;[HrefToken()];addnoteempty=1'>\[Add note\]</a></center>"
@@ -355,7 +365,7 @@
var/output var/output
if(target_ckey) if(target_ckey)
target_ckey = sanitizeSQL(target_ckey) target_ckey = sanitizeSQL(target_ckey)
var/query = "SELECT id, adminckey, text, timestamp, lasteditor FROM [format_table_name("messages")] WHERE type = '[type]' AND deleted = 0" var/query = "SELECT id, (SELECT byond_key FROM [format_table_name("player")] WHERE ckey = adminckey), text, timestamp, (SELECT byond_key FROM [format_table_name("player")] WHERE ckey = lasteditor) FROM [format_table_name("messages")] WHERE type = '[type]' AND deleted = 0"
if(type == "message" || type == "watchlist entry") if(type == "message" || type == "watchlist entry")
query += " AND targetckey = '[target_ckey]'" query += " AND targetckey = '[target_ckey]'"
var/datum/DBQuery/query_get_message_output = SSdbcore.NewQuery(query) var/datum/DBQuery/query_get_message_output = SSdbcore.NewQuery(query)
@@ -364,13 +374,13 @@
return return
while(query_get_message_output.NextRow()) while(query_get_message_output.NextRow())
var/message_id = query_get_message_output.item[1] var/message_id = query_get_message_output.item[1]
var/admin_ckey = query_get_message_output.item[2] var/admin_key = query_get_message_output.item[2]
var/text = query_get_message_output.item[3] var/text = query_get_message_output.item[3]
var/timestamp = query_get_message_output.item[4] var/timestamp = query_get_message_output.item[4]
var/editor_ckey = query_get_message_output.item[5] var/editor_key = query_get_message_output.item[5]
switch(type) switch(type)
if("message") if("message")
output += "<font color='red' size='3'><b>Admin message left by <span class='prefix'>[admin_ckey]</span> on [timestamp]</b></font>" output += "<font color='red' size='3'><b>Admin message left by <span class='prefix'>[admin_key]</span> on [timestamp]</b></font>"
output += "<br><font color='red'>[text]</font><br>" output += "<br><font color='red'>[text]</font><br>"
var/datum/DBQuery/query_message_read = SSdbcore.NewQuery("UPDATE [format_table_name("messages")] SET type = 'message sent' WHERE id = [message_id]") var/datum/DBQuery/query_message_read = SSdbcore.NewQuery("UPDATE [format_table_name("messages")] SET type = 'message sent' WHERE id = [message_id]")
if(!query_message_read.warn_execute()) if(!query_message_read.warn_execute())
@@ -382,9 +392,9 @@
message_admins("<font color='red'><B>Notice: </B></font><font color='blue'>[key_name_admin(target_ckey)] has been on the watchlist since [timestamp] and has just connected - Reason: [text]</font>") message_admins("<font color='red'><B>Notice: </B></font><font color='blue'>[key_name_admin(target_ckey)] has been on the watchlist since [timestamp] and has just connected - Reason: [text]</font>")
send2irc_adminless_only("Watchlist", "[key_name(target_ckey)] is on the watchlist and has just connected - Reason: [text]") send2irc_adminless_only("Watchlist", "[key_name(target_ckey)] is on the watchlist and has just connected - Reason: [text]")
if("memo") if("memo")
output += "<span class='memo'>Memo by <span class='prefix'>[admin_ckey]</span> on [timestamp]" output += "<span class='memo'>Memo by <span class='prefix'>[admin_key]</span> on [timestamp]"
if(editor_ckey) if(editor_key)
output += "<br><span class='memoedit'>Last edit by [editor_ckey] <A href='?_src_=holder;[HrefToken()];messageedits=[message_id]'>(Click here to see edit log)</A></span>" output += "<br><span class='memoedit'>Last edit by [editor_key] <A href='?_src_=holder;[HrefToken()];messageedits=[message_id]'>(Click here to see edit log)</A></span>"
output += "<br>[text]</span><br>" output += "<br>[text]</span><br>"
qdel(query_get_message_output) qdel(query_get_message_output)
return output return output

View File

@@ -206,15 +206,14 @@
if(!check_rights(R_BAN)) if(!check_rights(R_BAN))
return return
var/bantype = text2num(href_list["dbbanaddtype"]) var/bantype = text2num(href_list["dbbanaddtype"])
var/banckey = href_list["dbbanaddckey"] var/bankey = href_list["dbbanaddkey"]
var/banckey = ckey(bankey)
var/banip = href_list["dbbanaddip"] var/banip = href_list["dbbanaddip"]
var/bancid = href_list["dbbanaddcid"] var/bancid = href_list["dbbanaddcid"]
var/banduration = text2num(href_list["dbbaddduration"]) var/banduration = text2num(href_list["dbbaddduration"])
var/banjob = href_list["dbbanaddjob"] var/banjob = href_list["dbbanaddjob"]
var/banreason = href_list["dbbanreason"] var/banreason = href_list["dbbanreason"]
banckey = ckey(banckey)
switch(bantype) switch(bantype)
if(BANTYPE_PERMA) if(BANTYPE_PERMA)
if(!banckey || !banreason) if(!banckey || !banreason)
@@ -264,12 +263,12 @@
if(bancid) if(bancid)
banreason = "[banreason] (CUSTOM CID)" banreason = "[banreason] (CUSTOM CID)"
else else
message_admins("Ban process: A mob matching [playermob.ckey] was found at location [playermob.x], [playermob.y], [playermob.z]. Custom ip and computer id fields replaced with the ip and computer id from the located mob.") message_admins("Ban process: A mob matching [playermob.key] was found at location [playermob.x], [playermob.y], [playermob.z]. Custom ip and computer id fields replaced with the ip and computer id from the located mob.")
if(!DB_ban_record(bantype, playermob, banduration, banreason, banjob, banckey, banip, bancid )) if(!DB_ban_record(bantype, playermob, banduration, banreason, banjob, bankey, banip, bancid ))
to_chat(usr, "<span class='danger'>Failed to apply ban.</span>") to_chat(usr, "<span class='danger'>Failed to apply ban.</span>")
return return
create_message("note", banckey, null, banreason, null, null, 0, 0) create_message("note", bankey, null, banreason, null, null, 0, 0)
else if(href_list["editrightsbrowser"]) else if(href_list["editrightsbrowser"])
edit_admin_permissions(0) edit_admin_permissions(0)
@@ -279,9 +278,9 @@
if(href_list["editrightsbrowsermanage"]) if(href_list["editrightsbrowsermanage"])
if(href_list["editrightschange"]) if(href_list["editrightschange"])
change_admin_rank(href_list["editrightschange"], TRUE) change_admin_rank(ckey(href_list["editrightschange"]), href_list["editrightschange"], TRUE)
else if(href_list["editrightsremove"]) else if(href_list["editrightsremove"])
remove_admin(href_list["editrightsremove"], TRUE) remove_admin(ckey(href_list["editrightsremove"]), href_list["editrightsremove"], TRUE)
else if(href_list["editrightsremoverank"]) else if(href_list["editrightsremoverank"])
remove_rank(href_list["editrightsremoverank"]) remove_rank(href_list["editrightsremoverank"])
edit_admin_permissions(2) edit_admin_permissions(2)
@@ -591,9 +590,9 @@
if(M.client) if(M.client)
jobban_buildcache(M.client) jobban_buildcache(M.client)
message_admins("<span class='adminnotice'>[key_name_admin(usr)] removed [key_name_admin(M)]'s appearance ban.</span>") message_admins("<span class='adminnotice'>[key_name_admin(usr)] removed [key_name_admin(M)]'s appearance ban.</span>")
to_chat(M, "<span class='boldannounce'><BIG>[usr.client.ckey] has removed your appearance ban.</BIG></span>") to_chat(M, "<span class='boldannounce'><BIG>[usr.client.key] has removed your appearance ban.</BIG></span>")
else switch(alert("Appearance ban [M.ckey]?",,"Yes","No", "Cancel")) else switch(alert("Appearance ban [M.key]?",,"Yes","No", "Cancel"))
if("Yes") if("Yes")
var/reason = input(usr,"Please State Reason.","Reason") as message|null var/reason = input(usr,"Please State Reason.","Reason") as message|null
if(!reason) if(!reason)
@@ -605,9 +604,9 @@
jobban_buildcache(M.client) jobban_buildcache(M.client)
ban_unban_log_save("[key_name(usr)] appearance banned [key_name(M)]. reason: [reason]") ban_unban_log_save("[key_name(usr)] appearance banned [key_name(M)]. reason: [reason]")
log_admin_private("[key_name(usr)] appearance banned [key_name(M)]. \nReason: [reason]") log_admin_private("[key_name(usr)] appearance banned [key_name(M)]. \nReason: [reason]")
create_message("note", M.ckey, null, "Appearance banned - [reason]", null, null, 0, 0) create_message("note", M.key, null, "Appearance banned - [reason]", null, null, 0, 0)
message_admins("<span class='adminnotice'>[key_name_admin(usr)] appearance banned [key_name_admin(M)].</span>") message_admins("<span class='adminnotice'>[key_name_admin(usr)] appearance banned [key_name_admin(M)].</span>")
to_chat(M, "<span class='boldannounce'><BIG>You have been appearance banned by [usr.client.ckey].</BIG></span>") to_chat(M, "<span class='boldannounce'><BIG>You have been appearance banned by [usr.client.key].</BIG></span>")
to_chat(M, "<span class='boldannounce'>The reason is: [reason]</span>") to_chat(M, "<span class='boldannounce'>The reason is: [reason]</span>")
to_chat(M, "<span class='danger'>Appearance ban can be lifted only upon request.</span>") to_chat(M, "<span class='danger'>Appearance ban can be lifted only upon request.</span>")
var/bran = CONFIG_GET(string/banappeals) var/bran = CONFIG_GET(string/banappeals)
@@ -968,13 +967,13 @@
//Banning comes first //Banning comes first
if(notbannedlist.len) //at least 1 unbanned job exists in joblist so we have stuff to ban. if(notbannedlist.len) //at least 1 unbanned job exists in joblist so we have stuff to ban.
switch(alert("Temporary Ban for [M.ckey]?",,"Yes","No", "Cancel")) switch(alert("Temporary Ban for [M.key]?",,"Yes","No", "Cancel"))
if("Yes") if("Yes")
var/mins = input(usr,"How long (in minutes)?","Ban time",1440) as num|null var/mins = input(usr,"How long (in minutes)?","Ban time",1440) as num|null
if(mins <= 0) if(mins <= 0)
to_chat(usr, "<span class='danger'>[mins] is not a valid duration.</span>") to_chat(usr, "<span class='danger'>[mins] is not a valid duration.</span>")
return return
var/reason = input(usr,"Please State Reason For Banning [M.ckey].","Reason") as message|null var/reason = input(usr,"Please State Reason For Banning [M.key].","Reason") as message|null
if(!reason) if(!reason)
return return
@@ -991,15 +990,15 @@
msg = job msg = job
else else
msg += ", [job]" msg += ", [job]"
create_message("note", M.ckey, null, "Banned from [msg] - [reason]", null, null, 0, 0) create_message("note", M.key, null, "Banned from [msg] - [reason]", null, null, 0, 0)
message_admins("<span class='adminnotice'>[key_name_admin(usr)] banned [key_name_admin(M)] from [msg] for [mins] minutes.</span>") message_admins("<span class='adminnotice'>[key_name_admin(usr)] banned [key_name_admin(M)] from [msg] for [mins] minutes.</span>")
to_chat(M, "<span class='boldannounce'><BIG>You have been [(msg == ("ooc" || "appearance")) ? "banned" : "jobbanned"] by [usr.client.ckey] from: [msg].</BIG></span>") to_chat(M, "<span class='boldannounce'><BIG>You have been [(msg == ("ooc" || "appearance")) ? "banned" : "jobbanned"] by [usr.client.key] from: [msg].</BIG></span>")
to_chat(M, "<span class='boldannounce'>The reason is: [reason]</span>") to_chat(M, "<span class='boldannounce'>The reason is: [reason]</span>")
to_chat(M, "<span class='danger'>This jobban will be lifted in [mins] minutes.</span>") to_chat(M, "<span class='danger'>This jobban will be lifted in [mins] minutes.</span>")
href_list["jobban2"] = 1 // lets it fall through and refresh href_list["jobban2"] = 1 // lets it fall through and refresh
return 1 return 1
if("No") if("No")
var/reason = input(usr,"Please State Reason For Banning [M.ckey].","Reason") as message|null var/reason = input(usr,"Please State Reason For Banning [M.key].","Reason") as message|null
if(reason) if(reason)
var/msg var/msg
for(var/job in notbannedlist) for(var/job in notbannedlist)
@@ -1014,9 +1013,9 @@
msg = job msg = job
else else
msg += ", [job]" msg += ", [job]"
create_message("note", M.ckey, null, "Banned from [msg] - [reason]", null, null, 0, 0) create_message("note", M.key, null, "Banned from [msg] - [reason]", null, null, 0, 0)
message_admins("<span class='adminnotice'>[key_name_admin(usr)] banned [key_name_admin(M)] from [msg].</span>") message_admins("<span class='adminnotice'>[key_name_admin(usr)] banned [key_name_admin(M)] from [msg].</span>")
to_chat(M, "<span class='boldannounce'><BIG>You have been [(msg == ("ooc" || "appearance")) ? "banned" : "jobbanned"] by [usr.client.ckey] from: [msg].</BIG></span>") to_chat(M, "<span class='boldannounce'><BIG>You have been [(msg == ("ooc" || "appearance")) ? "banned" : "jobbanned"] by [usr.client.key] from: [msg].</BIG></span>")
to_chat(M, "<span class='boldannounce'>The reason is: [reason]</span>") to_chat(M, "<span class='boldannounce'>The reason is: [reason]</span>")
to_chat(M, "<span class='danger'>Jobban can be lifted only upon request.</span>") to_chat(M, "<span class='danger'>Jobban can be lifted only upon request.</span>")
href_list["jobban2"] = 1 // lets it fall through and refresh href_list["jobban2"] = 1 // lets it fall through and refresh
@@ -1047,7 +1046,7 @@
continue continue
if(msg) if(msg)
message_admins("<span class='adminnotice'>[key_name_admin(usr)] unbanned [key_name_admin(M)] from [msg].</span>") message_admins("<span class='adminnotice'>[key_name_admin(usr)] unbanned [key_name_admin(M)] from [msg].</span>")
to_chat(M, "<span class='boldannounce'><BIG>You have been un-jobbanned by [usr.client.ckey] from [msg].</BIG></span>") to_chat(M, "<span class='boldannounce'><BIG>You have been un-jobbanned by [usr.client.key] from [msg].</BIG></span>")
href_list["jobban2"] = 1 // lets it fall through and refresh href_list["jobban2"] = 1 // lets it fall through and refresh
return 1 return 1
return 0 //we didn't do anything! return 0 //we didn't do anything!
@@ -1068,7 +1067,7 @@
if(!M.client) if(!M.client)
to_chat(usr, "<span class='danger'>Error: [M] no longer has a client!</span>") to_chat(usr, "<span class='danger'>Error: [M] no longer has a client!</span>")
return return
to_chat(M, "<span class='danger'>You have been kicked from the server by [usr.client.holder.fakekey ? "an Administrator" : "[usr.client.ckey]"].</span>") to_chat(M, "<span class='danger'>You have been kicked from the server by [usr.client.holder.fakekey ? "an Administrator" : "[usr.client.key]"].</span>")
log_admin("[key_name(usr)] kicked [key_name(M)].") log_admin("[key_name(usr)] kicked [key_name(M)].")
message_admins("<span class='adminnotice'>[key_name_admin(usr)] kicked [key_name_admin(M)].</span>") message_admins("<span class='adminnotice'>[key_name_admin(usr)] kicked [key_name_admin(M)].</span>")
qdel(M.client) qdel(M.client)
@@ -1076,20 +1075,20 @@
else if(href_list["addmessage"]) else if(href_list["addmessage"])
if(!check_rights(R_ADMIN)) if(!check_rights(R_ADMIN))
return return
var/target_ckey = href_list["addmessage"] var/target_key = href_list["addmessage"]
create_message("message", target_ckey, secret = 0) create_message("message", target_key, secret = 0)
else if(href_list["addnote"]) else if(href_list["addnote"])
if(!check_rights(R_ADMIN)) if(!check_rights(R_ADMIN))
return return
var/target_ckey = href_list["addnote"] var/target_key = href_list["addnote"]
create_message("note", target_ckey) create_message("note", target_key)
else if(href_list["addwatch"]) else if(href_list["addwatch"])
if(!check_rights(R_ADMIN)) if(!check_rights(R_ADMIN))
return return
var/target_ckey = href_list["addwatch"] var/target_key = href_list["addwatch"]
create_message("watchlist entry", target_ckey, secret = 1) create_message("watchlist entry", target_key, secret = 1)
else if(href_list["addmemo"]) else if(href_list["addmemo"])
if(!check_rights(R_ADMIN)) if(!check_rights(R_ADMIN))
@@ -1217,13 +1216,13 @@
if(M.client && M.client.holder) if(M.client && M.client.holder)
return //admins cannot be banned. Even if they could, the ban doesn't affect them anyway return //admins cannot be banned. Even if they could, the ban doesn't affect them anyway
switch(alert("Temporary Ban for [M.ckey]?",,"Yes","No", "Cancel")) switch(alert("Temporary Ban for [M.key]?",,"Yes","No", "Cancel"))
if("Yes") if("Yes")
var/mins = input(usr,"How long (in minutes)?","Ban time",1440) as num|null var/mins = input(usr,"How long (in minutes)?","Ban time",1440) as num|null
if(mins <= 0) if(mins <= 0)
to_chat(usr, "<span class='danger'>[mins] is not a valid duration.</span>") to_chat(usr, "<span class='danger'>[mins] is not a valid duration.</span>")
return return
var/reason = input(usr,"Please State Reason For Banning [M.ckey].","Reason") as message|null var/reason = input(usr,"Please State Reason For Banning [M.key].","Reason") as message|null
if(!reason) if(!reason)
return return
if(!DB_ban_record(BANTYPE_TEMP, M, mins, reason)) if(!DB_ban_record(BANTYPE_TEMP, M, mins, reason))
@@ -1231,14 +1230,14 @@
return return
AddBan(M.ckey, M.computer_id, reason, usr.ckey, 1, mins) AddBan(M.ckey, M.computer_id, reason, usr.ckey, 1, mins)
ban_unban_log_save("[key_name(usr)] has banned [key_name(M)]. - Reason: [reason] - This will be removed in [mins] minutes.") ban_unban_log_save("[key_name(usr)] has banned [key_name(M)]. - Reason: [reason] - This will be removed in [mins] minutes.")
to_chat(M, "<span class='boldannounce'><BIG>You have been banned by [usr.client.ckey].\nReason: [reason]</BIG></span>") to_chat(M, "<span class='boldannounce'><BIG>You have been banned by [usr.client.key].\nReason: [reason]</BIG></span>")
to_chat(M, "<span class='danger'>This is a temporary ban, it will be removed in [mins] minutes. The round ID is [GLOB.round_id].</span>") to_chat(M, "<span class='danger'>This is a temporary ban, it will be removed in [mins] minutes. The round ID is [GLOB.round_id].</span>")
var/bran = CONFIG_GET(string/banappeals) var/bran = CONFIG_GET(string/banappeals)
if(bran) if(bran)
to_chat(M, "<span class='danger'>To try to resolve this matter head to [bran]</span>") to_chat(M, "<span class='danger'>To try to resolve this matter head to [bran]</span>")
else else
to_chat(M, "<span class='danger'>No ban appeals URL has been set.</span>") to_chat(M, "<span class='danger'>No ban appeals URL has been set.</span>")
log_admin_private("[key_name(usr)] has banned [M.ckey].\nReason: [key_name(M)]\nThis will be removed in [mins] minutes.") log_admin_private("[key_name(usr)] has banned [key_name(M)].\nReason: [key_name(M)]\nThis will be removed in [mins] minutes.")
var/msg = "<span class='adminnotice'>[key_name_admin(usr)] has banned [key_name_admin(M)].\nReason: [reason]\nThis will be removed in [mins] minutes.</span>" var/msg = "<span class='adminnotice'>[key_name_admin(usr)] has banned [key_name_admin(M)].\nReason: [reason]\nThis will be removed in [mins] minutes.</span>"
message_admins(msg) message_admins(msg)
var/datum/admin_help/AH = M.client ? M.client.current_ticket : null var/datum/admin_help/AH = M.client ? M.client.current_ticket : null
@@ -1246,7 +1245,7 @@
AH.Resolve() AH.Resolve()
qdel(M.client) qdel(M.client)
if("No") if("No")
var/reason = input(usr,"Please State Reason For Banning [M.ckey].","Reason") as message|null var/reason = input(usr,"Please State Reason For Banning [M.key].","Reason") as message|null
if(!reason) if(!reason)
return return
switch(alert(usr,"IP ban?",,"Yes","No","Cancel")) switch(alert(usr,"IP ban?",,"Yes","No","Cancel"))
@@ -1256,7 +1255,7 @@
AddBan(M.ckey, M.computer_id, reason, usr.ckey, 0, 0, M.lastKnownIP) AddBan(M.ckey, M.computer_id, reason, usr.ckey, 0, 0, M.lastKnownIP)
if("No") if("No")
AddBan(M.ckey, M.computer_id, reason, usr.ckey, 0, 0) AddBan(M.ckey, M.computer_id, reason, usr.ckey, 0, 0)
to_chat(M, "<span class='boldannounce'><BIG>You have been banned by [usr.client.ckey].\nReason: [reason]</BIG></span>") to_chat(M, "<span class='boldannounce'><BIG>You have been banned by [usr.client.key].\nReason: [reason]</BIG></span>")
to_chat(M, "<span class='danger'>This is a permanent ban. The round ID is [GLOB.round_id].</span>") to_chat(M, "<span class='danger'>This is a permanent ban. The round ID is [GLOB.round_id].</span>")
var/bran = CONFIG_GET(string/banappeals) var/bran = CONFIG_GET(string/banappeals)
if(bran) if(bran)
@@ -2349,7 +2348,7 @@
if(alert("Are you sure you want to kick all [afkonly ? "AFK" : ""] clients from the lobby??","Message","Yes","Cancel") != "Yes") if(alert("Are you sure you want to kick all [afkonly ? "AFK" : ""] clients from the lobby??","Message","Yes","Cancel") != "Yes")
to_chat(usr, "Kick clients from lobby aborted") to_chat(usr, "Kick clients from lobby aborted")
return return
var/list/listkicked = kick_clients_in_lobby("<span class='danger'>You were kicked from the lobby by [usr.client.holder.fakekey ? "an Administrator" : "[usr.client.ckey]"].</span>", afkonly) var/list/listkicked = kick_clients_in_lobby("<span class='danger'>You were kicked from the lobby by [usr.client.holder.fakekey ? "an Administrator" : "[usr.client.key]"].</span>", afkonly)
var/strkicked = "" var/strkicked = ""
for(var/name in listkicked) for(var/name in listkicked)

View File

@@ -21,10 +21,10 @@
/client/proc/SDQL2_query(query_text as message) /client/proc/SDQL2_query(query_text as message)
set category = "Debug" set category = "Debug"
if(!check_rights(R_DEBUG)) //Shouldn't happen... but just to be safe. if(!check_rights(R_DEBUG)) //Shouldn't happen... but just to be safe.
message_admins("<span class='danger'>ERROR: Non-admin [key_name(usr, usr.client)] attempted to execute a SDQL query!</span>") message_admins("<span class='danger'>ERROR: Non-admin [key_name(usr)] attempted to execute a SDQL query!</span>")
log_admin("Non-admin [usr.ckey]([usr]) attempted to execute a SDQL query!") log_admin("Non-admin [key_name(usr)] attempted to execute a SDQL query!")
return FALSE return FALSE
var/list/results = world.SDQL2_query(query_text, key_name_admin(usr), "[usr.ckey]([usr])") var/list/results = world.SDQL2_query(query_text, key_name_admin(usr), "[key_name(usr)]")
for(var/I in 1 to 3) for(var/I in 1 to 3)
to_chat(usr, results[I]) to_chat(usr, results[I])
SSblackbox.record_feedback("nested tally", "SDQL query", 1, list(ckey, query_text)) SSblackbox.record_feedback("nested tally", "SDQL query", 1, list(ckey, query_text))

View File

@@ -667,7 +667,7 @@ GLOBAL_DATUM_INIT(ahelp_tickets, /datum/admin_help_tickets, new)
var/is_antag = 0 var/is_antag = 0
if(found.mind && found.mind.special_role) if(found.mind && found.mind.special_role)
is_antag = 1 is_antag = 1
founds += "Name: [found.name]([found.real_name]) Ckey: [found.ckey] [is_antag ? "(Antag)" : null] " founds += "Name: [found.name]([found.real_name]) Key: [found.key] Ckey: [found.ckey] [is_antag ? "(Antag)" : null] "
msg += "[original_word]<font size='1' color='[is_antag ? "red" : "black"]'>(<A HREF='?_src_=holder;[HrefToken(TRUE)];adminmoreinfo=[REF(found)]'>?</A>|<A HREF='?_src_=holder;[HrefToken(TRUE)];adminplayerobservefollow=[REF(found)]'>F</A>)</font> " msg += "[original_word]<font size='1' color='[is_antag ? "red" : "black"]'>(<A HREF='?_src_=holder;[HrefToken(TRUE)];adminmoreinfo=[REF(found)]'>?</A>|<A HREF='?_src_=holder;[HrefToken(TRUE)];adminplayerobservefollow=[REF(found)]'>F</A>)</font> "
continue continue
msg += "[original_word] " msg += "[original_word] "

View File

@@ -494,7 +494,7 @@ GLOBAL_PROTECT(AdminProcCallSpamPrevention)
set desc = "Direct intervention" set desc = "Direct intervention"
if(M.ckey) if(M.ckey)
if(alert("This mob is being controlled by [M.ckey]. Are you sure you wish to assume control of it? [M.ckey] will be made a ghost.",,"Yes","No") != "Yes") if(alert("This mob is being controlled by [M.key]. Are you sure you wish to assume control of it? [M.key] will be made a ghost.",,"Yes","No") != "Yes")
return return
else else
var/mob/dead/observer/ghost = new/mob/dead/observer(M,1) var/mob/dead/observer/ghost = new/mob/dead/observer(M,1)

View File

@@ -265,9 +265,9 @@ GLOBAL_VAR_INIT(say_disabled, FALSE)
GLOB.say_disabled = !GLOB.say_disabled GLOB.say_disabled = !GLOB.say_disabled
if(GLOB.say_disabled) if(GLOB.say_disabled)
message_admins("[src.ckey] used 'Disable all communication verbs', killing all communication methods.") message_admins("[key] used 'Disable all communication verbs', killing all communication methods.")
else else
message_admins("[src.ckey] used 'Disable all communication verbs', restoring all communication methods.") message_admins("[key] used 'Disable all communication verbs', restoring all communication methods.")
//This generates the icon states for job starting location landmarks. //This generates the icon states for job starting location landmarks.
/client/proc/create_mapping_job_icons() /client/proc/create_mapping_job_icons()

View File

@@ -55,7 +55,7 @@
if(specialfunctions & SHOCK) if(specialfunctions & SHOCK)
if(D.secondsElectrified) if(D.secondsElectrified)
D.secondsElectrified = -1 D.secondsElectrified = -1
LAZYADD(D.shockedby, "\[[time_stamp()]\][usr](ckey:[usr.ckey])") LAZYADD(D.shockedby, "\[[time_stamp()]\] [key_name(usr)]")
add_logs(usr, D, "electrified") add_logs(usr, D, "electrified")
else else
D.secondsElectrified = 0 D.secondsElectrified = 0

View File

@@ -339,6 +339,7 @@ GLOBAL_LIST_EMPTY(external_rsc_urls)
send2irc_adminless_only("new_byond_user", "[key_name(src)] (IP: [address], ID: [computer_id]) is a new BYOND account [account_age] day[(account_age==1?"":"s")] old, created on [account_join_date].") send2irc_adminless_only("new_byond_user", "[key_name(src)] (IP: [address], ID: [computer_id]) is a new BYOND account [account_age] day[(account_age==1?"":"s")] old, created on [account_join_date].")
get_message_output("watchlist entry", ckey) get_message_output("watchlist entry", ckey)
check_ip_intel() check_ip_intel()
validate_key_in_db()
send_resources() send_resources()
@@ -484,7 +485,8 @@ GLOBAL_LIST_EMPTY(external_rsc_urls)
new_player = 1 new_player = 1
account_join_date = sanitizeSQL(findJoinDate()) account_join_date = sanitizeSQL(findJoinDate())
var/datum/DBQuery/query_add_player = SSdbcore.NewQuery("INSERT INTO [format_table_name("player")] (`ckey`, `firstseen`, `firstseen_round_id`, `lastseen`, `lastseen_round_id`, `ip`, `computerid`, `lastadminrank`, `accountjoindate`) VALUES ('[sql_ckey]', Now(), '[GLOB.round_id]', Now(), '[GLOB.round_id]', INET_ATON('[sql_ip]'), '[sql_computerid]', '[sql_admin_rank]', [account_join_date ? "'[account_join_date]'" : "NULL"])") var/sql_key = sanitizeSQL(key)
var/datum/DBQuery/query_add_player = SSdbcore.NewQuery("INSERT INTO [format_table_name("player")] (`ckey`, `byond_key`, `firstseen`, `firstseen_round_id`, `lastseen`, `lastseen_round_id`, `ip`, `computerid`, `lastadminrank`, `accountjoindate`) VALUES ('[sql_ckey]', '[sql_key]', Now(), '[GLOB.round_id]', Now(), '[GLOB.round_id]', INET_ATON('[sql_ip]'), '[sql_computerid]', '[sql_admin_rank]', [account_join_date ? "'[account_join_date]'" : "NULL"])")
if(!query_add_player.Execute()) if(!query_add_player.Execute())
qdel(query_client_in_db) qdel(query_client_in_db)
qdel(query_add_player) qdel(query_add_player)
@@ -535,7 +537,7 @@ GLOBAL_LIST_EMPTY(external_rsc_urls)
/client/proc/findJoinDate() /client/proc/findJoinDate()
var/list/http = world.Export("http://byond.com/members/[ckey]?format=text") var/list/http = world.Export("http://byond.com/members/[ckey]?format=text")
if(!http) if(!http)
log_world("Failed to connect to byond age check for [ckey]") log_world("Failed to connect to byond member page to age check [ckey]")
return return
var/F = file2text(http["CONTENT"]) var/F = file2text(http["CONTENT"])
if(F) if(F)
@@ -545,6 +547,32 @@ GLOBAL_LIST_EMPTY(external_rsc_urls)
else else
CRASH("Age check regex failed for [src.ckey]") CRASH("Age check regex failed for [src.ckey]")
/client/proc/validate_key_in_db()
var/sql_ckey = sanitizeSQL(ckey)
var/sql_key
var/datum/DBQuery/query_check_byond_key = SSdbcore.NewQuery("SELECT byond_key FROM [format_table_name("player")] WHERE ckey = '[sql_ckey]'")
if(!query_check_byond_key.Execute())
qdel(query_check_byond_key)
return
if(query_check_byond_key.NextRow())
sql_key = query_check_byond_key.item[1]
qdel(query_check_byond_key)
if(key != sql_key)
var/list/http = world.Export("http://byond.com/members/[ckey]?format=text")
if(!http)
log_world("Failed to connect to byond member page to get changed key for [ckey]")
return
var/F = file2text(http["CONTENT"])
if(F)
var/regex/R = regex("\\tkey = \"(.+)\"")
if(R.Find(F))
var/web_key = sanitizeSQL(R.group[1])
var/datum/DBQuery/query_update_byond_key = SSdbcore.NewQuery("UPDATE [format_table_name("player")] SET byond_key = '[web_key]' WHERE ckey = '[sql_ckey]'")
query_update_byond_key.Execute()
qdel(query_update_byond_key)
else
CRASH("Key check regex failed for [ckey]")
/client/proc/check_randomizer(topic) /client/proc/check_randomizer(topic)
. = FALSE . = FALSE
if (connection != "seeker") if (connection != "seeker")
@@ -653,7 +681,7 @@ GLOBAL_LIST_EMPTY(external_rsc_urls)
qdel(query_get_notes) qdel(query_get_notes)
return return
qdel(query_get_notes) qdel(query_get_notes)
create_message("note", ckey, system_ckey, message, null, null, 0, 0) create_message("note", key, system_ckey, message, null, null, 0, 0)
/client/proc/check_ip_intel() /client/proc/check_ip_intel()

View File

@@ -937,7 +937,7 @@ GLOBAL_LIST_EMPTY(preferences_datums)
if(href_list["jobbancheck"]) if(href_list["jobbancheck"])
var/job = sanitizeSQL(href_list["jobbancheck"]) var/job = sanitizeSQL(href_list["jobbancheck"])
var/sql_ckey = sanitizeSQL(user.ckey) var/sql_ckey = sanitizeSQL(user.ckey)
var/datum/DBQuery/query_get_jobban = SSdbcore.NewQuery("SELECT reason, bantime, duration, expiration_time, a_ckey FROM [format_table_name("ban")] WHERE ckey = '[sql_ckey]' AND (bantype = 'JOB_PERMABAN' OR (bantype = 'JOB_TEMPBAN' AND expiration_time > Now())) AND isnull(unbanned) AND job = '[job]'") var/datum/DBQuery/query_get_jobban = SSdbcore.NewQuery("SELECT reason, bantime, duration, expiration_time, (SELECT byond_key FROM [format_table_name("player")] WHERE [format_table_name("player")].ckey = [format_table_name("ban")].a_ckey) FROM [format_table_name("ban")] WHERE ckey = '[sql_ckey]' AND (bantype = 'JOB_PERMABAN' OR (bantype = 'JOB_TEMPBAN' AND expiration_time > Now())) AND isnull(unbanned) AND job = '[job]'")
if(!query_get_jobban.warn_execute()) if(!query_get_jobban.warn_execute())
qdel(query_get_jobban) qdel(query_get_jobban)
return return
@@ -946,9 +946,9 @@ GLOBAL_LIST_EMPTY(preferences_datums)
var/bantime = query_get_jobban.item[2] var/bantime = query_get_jobban.item[2]
var/duration = query_get_jobban.item[3] var/duration = query_get_jobban.item[3]
var/expiration_time = query_get_jobban.item[4] var/expiration_time = query_get_jobban.item[4]
var/a_ckey = query_get_jobban.item[5] var/admin_key = query_get_jobban.item[5]
var/text var/text
text = "<span class='redtext'>You, or another user of this computer, ([user.ckey]) is banned from playing [job]. The ban reason is:<br>[reason]<br>This ban was applied by [a_ckey] on [bantime]" text = "<span class='redtext'>You, or another user of this computer, ([user.key]) is banned from playing [job]. The ban reason is:<br>[reason]<br>This ban was applied by [admin_key] on [bantime]"
if(text2num(duration) > 0) if(text2num(duration) > 0)
text += ". The ban is for [duration] minutes and expires on [expiration_time] (server time)" text += ". The ban is for [duration] minutes and expires on [expiration_time] (server time)"
text += ".</span>" text += ".</span>"

View File

@@ -423,8 +423,9 @@ GLOBAL_LIST(cachedbooks) // List of our cached book datums
var/sqlauthor = sanitizeSQL(scanner.cache.author) var/sqlauthor = sanitizeSQL(scanner.cache.author)
var/sqlcontent = sanitizeSQL(scanner.cache.dat) var/sqlcontent = sanitizeSQL(scanner.cache.dat)
var/sqlcategory = sanitizeSQL(upload_category) var/sqlcategory = sanitizeSQL(upload_category)
var/sqlckey = sanitizeSQL(usr.ckey)
var/msg = "[key_name(usr)] has uploaded the book titled [scanner.cache.name], [length(scanner.cache.dat)] signs" var/msg = "[key_name(usr)] has uploaded the book titled [scanner.cache.name], [length(scanner.cache.dat)] signs"
var/datum/DBQuery/query_library_upload = SSdbcore.NewQuery("INSERT INTO [format_table_name("library")] (author, title, content, category, ckey, datetime, round_id_created) VALUES ('[sqlauthor]', '[sqltitle]', '[sqlcontent]', '[sqlcategory]', '[usr.ckey]', Now(), '[GLOB.round_id]')") var/datum/DBQuery/query_library_upload = SSdbcore.NewQuery("INSERT INTO [format_table_name("library")] (author, title, content, category, ckey, datetime, round_id_created) VALUES ('[sqlauthor]', '[sqltitle]', '[sqlcontent]', '[sqlcategory]', '[sqlckey]', Now(), '[GLOB.round_id]')")
if(!query_library_upload.Execute()) if(!query_library_upload.Execute())
qdel(query_library_upload) qdel(query_library_upload)
alert("Database error encountered uploading to Archive") alert("Database error encountered uploading to Archive")

View File

@@ -375,9 +375,9 @@
if (!usr || !src) if (!usr || !src)
return 0 return 0
//we gots ourselfs a dirty cheater on our hands! //we gots ourselfs a dirty cheater on our hands!
log_game("[key_name(usr)] attempted to rig the vote by voting as [ckey]") log_game("[key_name(usr)] attempted to rig the vote by voting as [key]")
message_admins("[key_name_admin(usr)] attempted to rig the vote by voting as [ckey]") message_admins("[key_name_admin(usr)] attempted to rig the vote by voting as [key]")
to_chat(usr, "<span class='danger'>You don't seem to be [ckey].</span>") to_chat(usr, "<span class='danger'>You don't seem to be [key].</span>")
to_chat(src, "<span class='danger'>Something went horribly wrong processing your vote. Please contact an administrator, they should have gotten a message about this</span>") to_chat(src, "<span class='danger'>Something went horribly wrong processing your vote. Please contact an administrator, they should have gotten a message about this</span>")
return 0 return 0
return 1 return 1
@@ -579,7 +579,7 @@
return 1 return 1
var/i var/i
if(query_multi_choicelen.NextRow()) if(query_multi_choicelen.NextRow())
i = text2num(query_multi_choicelen.item[1]) i = text2num(query_multi_choicelen.item[1])
qdel(query_multi_choicelen) qdel(query_multi_choicelen)
var/datum/DBQuery/query_multi_hasvoted = SSdbcore.NewQuery("SELECT id FROM [format_table_name("poll_vote")] WHERE pollid = [pollid] AND ckey = '[ckey]'") var/datum/DBQuery/query_multi_hasvoted = SSdbcore.NewQuery("SELECT id FROM [format_table_name("poll_vote")] WHERE pollid = [pollid] AND ckey = '[ckey]'")
if(!query_multi_hasvoted.warn_execute()) if(!query_multi_hasvoted.warn_execute())

View File

@@ -102,9 +102,8 @@
playsound(user, "explosion", 100, 1) playsound(user, "explosion", 100, 1)
var/turf/starting = get_turf(user) var/turf/starting = get_turf(user)
var/turf/targturf = get_turf(target) var/turf/targturf = get_turf(target)
var/log_str = "Blast wave fired from [ADMIN_VERBOSEJMP(starting)] ([get_area_name(user, TRUE)]) at [ADMIN_VERBOSEJMP(targturf)] ([target.name]) by [user.name]([user.ckey]) with power [heavy]/[medium]/[light]." message_admins("Blast wave fired from [ADMIN_VERBOSEJMP(starting)] at [ADMIN_VERBOSEJMP(targturf)] ([target.name]) by [key_name_admin(user)] with power [heavy]/[medium]/[light].")
message_admins(log_str) log_game("Blast wave fired from [AREACOORD(starting)] at [AREACOORD(targturf)] ([target.name]) by [key_name(user)] with power [heavy]/[medium]/[light].")
log_game(log_str)
var/obj/item/projectile/blastwave/BW = new(loc, heavy, medium, light) var/obj/item/projectile/blastwave/BW = new(loc, heavy, medium, light)
BW.hugbox = hugbox BW.hugbox = hugbox
BW.preparePixelProjectile(target, get_turf(src), params, 0) BW.preparePixelProjectile(target, get_turf(src), params, 0)
@@ -158,4 +157,4 @@
lightr = max(lightr - 1, 0) lightr = max(lightr - 1, 0)
/obj/item/projectile/blastwave/ex_act() /obj/item/projectile/blastwave/ex_act()
return return

View File

@@ -143,7 +143,7 @@
if(L != user) if(L != user)
add_logs(user, L, "injected", src, addition="which had [contained]") add_logs(user, L, "injected", src, addition="which had [contained]")
else else
log_attack("<font color='red'>[user.name] ([user.ckey]) injected [L.name] ([L.ckey]) with [src.name], which had [contained] (INTENT: [uppertext(user.a_intent)])</font>") log_attack("<font color='red'>[key_name(user)] injected [key_name(L)] with [src.name], which had [contained] (INTENT: [uppertext(user.a_intent)])</font>")
L.log_message("<font color='orange'>Injected themselves ([contained]) with [src.name].</font>", INDIVIDUAL_ATTACK_LOG) L.log_message("<font color='orange'>Injected themselves ([contained]) with [src.name].</font>", INDIVIDUAL_ATTACK_LOG)
var/fraction = min(amount_per_transfer_from_this/reagents.total_volume, 1) var/fraction = min(amount_per_transfer_from_this/reagents.total_volume, 1)