diff --git a/SQL/database_changelog.txt b/SQL/database_changelog.txt
index 80af03e4561..e1fc7d826f4 100644
--- a/SQL/database_changelog.txt
+++ b/SQL/database_changelog.txt
@@ -1,3 +1,15 @@
+19 May 2015, by Jordie0608
+
+Added new table 'watch' for use in flagging ckeys. It shouldn't ever exist, but also added command to de-erroize this new table just in case someone does make it like that.
+
+To create this new table run the following command:
+
+CREATE TABLE `watch` (`id` int(11) NOT NULL AUTO_INCREMENT, `ckey` varchar(32) NOT NULL, `reason` text NOT NULL, PRIMARY KEY (`id`))
+
+Remember to add prefix to the table name if you use them.
+
+----------------------------------------------------
+
19 September 2014, by MrStonedOne
Removed erro_ from table names. dbconfig.txt has a option allowing you to change the prefix used in code, defaults to "erro_" if left out for legacy reasons.
@@ -24,6 +36,4 @@ UPDATE erro_library SET deleted = 1 WHERE id = someid
(Replace someid with the id of the book you want to soft delete.)
-----------------------------------------------------
-
-
+----------------------------------------------------
\ No newline at end of file
diff --git a/SQL/errofreedatabase.sql b/SQL/errofreedatabase.sql
index ae5c0d7ee1c..d9590901deb 100644
--- a/SQL/errofreedatabase.sql
+++ b/SQL/errofreedatabase.sql
@@ -12,4 +12,5 @@ ALTER TABLE erro_poll_option RENAME TO SS13_poll_option;
ALTER TABLE erro_poll_question RENAME TO SS13_poll_question;
ALTER TABLE erro_poll_textreply RENAME TO SS13_poll_textreply;
ALTER TABLE erro_poll_vote RENAME TO SS13_poll_vote;
-ALTER TABLE erro_privacy RENAME TO SS13_privacy;
\ No newline at end of file
+ALTER TABLE erro_privacy RENAME TO SS13_privacy;
+ALTER TABLE erro_watch RENAME TO SS13_watch;
\ No newline at end of file
diff --git a/SQL/tgstation_schema.sql b/SQL/tgstation_schema.sql
index 30fd894e965..848e28b7f41 100644
--- a/SQL/tgstation_schema.sql
+++ b/SQL/tgstation_schema.sql
@@ -306,7 +306,16 @@ CREATE TABLE `poll_vote` (
) ENGINE=InnoDB DEFAULT CHARSET=latin1;
/*!40101 SET character_set_client = @saved_cs_client */;
---
+--var/reason = input(usr,"Reason?","reason","Metagaming") as text|null
+ if(!reason)
+ return
+ log_admin("[key_name_admin(usr)] has added [key_name_admin(M)] to the watchlist - Reason: [reason]")
+ message_admins("[key_name_admin(usr)] has added [key_name_admin(M)] to the watchlist - Reason: [reason]", 1)
+ reason = sanitizeSQL(reason)
+ var/DBQuery/query_watchadd = dbcon.NewQuery("INSERT INTO [format_table_name("watch")] (ckey, reason) VALUES ('[sql_ckey]', '[reason]')")
+ if(!query_watchadd.Execute())
+ var/err = query_watchadd.ErrorMsg()
+ log_game("SQL ERROR during adding new watch entry. Error : \[[err]\]\n")
-- Table structure for table `privacy`
--
@@ -332,4 +341,19 @@ CREATE TABLE `privacy` (
/*!40101 SET COLLATION_CONNECTION=@OLD_COLLATION_CONNECTION */;
/*!40111 SET SQL_NOTES=@OLD_SQL_NOTES */;
+--
+-- Table structure for table `watch`
+--
+
+DROP TABLE IF EXISTS `watch`;
+/*!40101 SET @saved_cs_client = @@character_set_client */;
+/*!40101 SET character_set_client = utf8 */;
+CREATE TABLE `watch` (
+ `id` int(11) NOT NULL AUTO_INCREMENT,
+ `ckey` varchar(32) NOT NULL,
+ `reason` text NOT NULL,
+ PRIMARY KEY (`id`)
+) ENGINE=InnoDB DEFAULT CHARSET=latin1;
+/*!40101 SET character_set_client = @saved_cs_client */;
+
-- Dump completed on 2013-03-24 18:02:35
diff --git a/SQL/tgstation_schema_prefixed.sql b/SQL/tgstation_schema_prefixed.sql
index c1b740b6874..b5b9bb0fe2d 100644
--- a/SQL/tgstation_schema_prefixed.sql
+++ b/SQL/tgstation_schema_prefixed.sql
@@ -327,4 +327,19 @@ CREATE TABLE `SS13_privacy` (
/*!40101 SET COLLATION_CONNECTION=@OLD_COLLATION_CONNECTION */;
/*!40111 SET SQL_NOTES=@OLD_SQL_NOTES */;
+--
+-- Table structure for table `watch`
+--
+
+DROP TABLE IF EXISTS `SS13_watch`;
+/*!40101 SET @saved_cs_client = @@character_set_client */;
+/*!40101 SET character_set_client = utf8 */;
+CREATE TABLE `SS13_watch` (
+ `id` int(11) NOT NULL AUTO_INCREMENT,
+ `ckey` varchar(32) NOT NULL,
+ `reason` text NOT NULL,
+ PRIMARY KEY (`id`)
+) ENGINE=InnoDB DEFAULT CHARSET=latin1;
+/*!40101 SET character_set_client = @saved_cs_client */;
+
-- Dump completed on 2013-03-24 18:02:35
\ No newline at end of file
diff --git a/code/modules/admin/topic.dm b/code/modules/admin/topic.dm
index 9a083fdb5cc..0df0b4cf81d 100644
--- a/code/modules/admin/topic.dm
+++ b/code/modules/admin/topic.dm
@@ -1076,6 +1076,13 @@
alert(usr,"This ban has already been lifted / does not exist.","Error","Ok")
unjobbanpanel()
+
+
+
+
+
+
+
//Watchlist
else if(href_list["watchlist"])
if(!check_rights(R_ADMIN)) return
@@ -1093,23 +1100,45 @@
var/DBQuery/query = dbcon.NewQuery("SELECT ckey FROM [format_table_name("watch")] WHERE (ckey = '[sql_ckey]')")
query.Execute()
if(query.NextRow())
+ switch(alert(usr, "Ckey already flagged", "[sql_ckey] is already on the watchlist, do you want to:", "Remove", "Edit reason", "Cancel"))
+ if("Cancel")
+ return
+ if("Remove")
+ var/DBQuery/query_watchdel = dbcon.NewQuery("DELETE FROM [format_table_name("watch")] WHERE ckey = '[sql_ckey]'")
+ if(!query_watchdel.Execute())
+ var/err = query_watchdel.ErrorMsg()
+ log_game("SQL ERROR during removing watch entry. Error : \[[err]\]\n")
+ return
+ log_admin("[key_name_admin(usr)] has removed [key_name_admin(M)] from the watchlist")
+ message_admins("[key_name_admin(usr)] has removed [key_name_admin(M)] from the watchlist", 1)
+ if("Edit Reason")
+ var/DBQuery/query_reason = dbcon.NewQuery("SELECT ckey, reason FROM [format_table_name("watch")] WHERE (ckey = '[sql_ckey]')")
+ query_reason.Execute()
+ if(query_reason.NextRow())
+ var/watch_reason = query_reason.item[3]
+ var/new_reason = input("Insert new reason", "New Reason", "[watch_reason]", null) as null|text
+ new_reason = sanitizeSQL(new_reason)
+ if(!new_reason)
+ return
+ var/DBQuery/update_query = dbcon.NewQuery("UPDATE [format_table_name("watch")] SET reason = '[new_reason]', edits = CONCAT(edits,'- [usr] changed watchlist reason from \\\"[watch_reason]\\\" to \\\"[new_reason]\\\"
') WHERE (ckey = '[sql_ckey]')")
+ if(!update_query.Execute())
+ var/err = update_query.ErrorMsg()
+ log_game("SQL ERROR during edit watch entry reason. Error : \[[err]\]\n")
+ return
+ log_admin("[key_name_admin(usr)] has edited [sql_ckey]'s reason from [watch_reason] to [new_reason]",1)
+ message_admins("[key_name_admin(usr)] has edited [sql_ckey]'s reason from [watch_reason] to [new_reason]",1)
+ else
var/reason = input(usr,"Reason?","reason","Metagaming") as text|null
if(!reason)
return
- log_admin("[key_name_admin(usr)] has added [key_name_admin(M)] to the watchlist - Reason: [reason]")
- message_admins("[key_name_admin(usr)] has added [key_name_admin(M)] to the watchlist - Reason: [reason]", 1)
reason = sanitizeSQL(reason)
var/DBQuery/query_watchadd = dbcon.NewQuery("INSERT INTO [format_table_name("watch")] (ckey, reason) VALUES ('[sql_ckey]', '[reason]')")
if(!query_watchadd.Execute())
var/err = query_watchadd.ErrorMsg()
log_game("SQL ERROR during adding new watch entry. Error : \[[err]\]\n")
- else
- log_admin("[key_name_admin(usr)] has removed [key_name_admin(M)] from the watchlist")
- message_admins("[key_name_admin(usr)] has removed [key_name_admin(M)] from the watchlist", 1)
- var/DBQuery/query_watchdel = dbcon.NewQuery("DELETE FROM [format_table_name("watch")] WHERE ckey = '[sql_ckey]'")
- if(!query_watchdel.Execute())
- var/err = query_watchdel.ErrorMsg()
- log_game("SQL ERROR during removing watch entry. Error : \[[err]\]\n")
+ return
+ log_admin("[key_name_admin(usr)] has added [key_name_admin(M)] to the watchlist - Reason: [reason]")
+ message_admins("[key_name_admin(usr)] has added [key_name_admin(M)] to the watchlist - Reason: [reason]", 1)
else if(href_list["mute"])
if(!check_rights(R_ADMIN)) return
diff --git a/code/modules/client/client procs.dm b/code/modules/client/client procs.dm
index d863edeacfb..46881e3cb1f 100644
--- a/code/modules/client/client procs.dm
+++ b/code/modules/client/client procs.dm
@@ -229,11 +229,11 @@ var/next_external_rsc = 0
while (query_cid.NextRow())
related_accounts_cid += "[query_cid.item[1]], "
- var/DBQuery/query = dbcon.NewQuery("SELECT ckey, reason FROM [format_table_name("watch")] WHERE (ckey = '[sql_ckey]')")
- query.Execute()
- if(query.NextRow())
- message_admins("Notice: [key_name_admin(src)] is flagged for watching and has just connected - Reason: [query_cid.item[2]]")
- send2irc_adminless_only("Watchlist", "[key_name_admin(src)] is flagged for watching and has just connected - Reason: [query_cid.item[2]]")
+ var/DBQuery/query_watch = dbcon.NewQuery("SELECT ckey, reason FROM [format_table_name("watch")] WHERE (ckey = '[sql_ckey]')")
+ query_watch.Execute()
+ if(query_watch.NextRow())
+ message_admins("Notice: [key_name_admin(src)] is flagged for watching and has just connected - Reason: [query_watch.item[2]]")
+ send2irc_adminless_only("Watchlist", "[key_name_admin(src)] is flagged for watching and has just connected - Reason: [query_watch.item[2]]")
var/admin_rank = "Player"
if (src.holder && src.holder.rank)