diff --git a/SQL/paradise_schema.sql b/SQL/paradise_schema.sql index 043a47a02ad..c6045cd835e 100644 --- a/SQL/paradise_schema.sql +++ b/SQL/paradise_schema.sql @@ -446,10 +446,13 @@ DROP TABLE IF EXISTS `erro_watch`; /*!40101 SET @saved_cs_client = @@character_set_client */; /*!40101 SET character_set_client = utf8 */; CREATE TABLE `erro_watch` ( - `id` int(11) NOT NULL AUTO_INCREMENT, `ckey` varchar(32) NOT NULL, `reason` text NOT NULL, - PRIMARY KEY (`id`) + `timestamp` datetime NOT NULL, + `adminckey` varchar(32) NOT NULL, + `last_editor` varchar(32), + `edits` text, + PRIMARY KEY (`ckey`) ) ENGINE=InnoDB DEFAULT CHARSET=latin1; /*!40101 SET character_set_client = @saved_cs_client */; diff --git a/code/modules/admin/admin.dm b/code/modules/admin/admin.dm index 060518108a1..df5db483430 100644 --- a/code/modules/admin/admin.dm +++ b/code/modules/admin/admin.dm @@ -51,22 +51,26 @@ var/global/nologevent = 0 else body += " \[Heal\] " - body += {" -

\[ - VV - - TP - - PM - - SM - - [admin_jump_link(M, src)]\]
- Mob type = [M.type]

- Kick | - Warn | - Ban | - Jobban | - Appearance Ban | - Notes | - Watchlist Flag - "} + body += "

\[ " + body += "VV - " + body += "TP -" + body += "PM -" + body += "SM -" + body += "[admin_jump_link(M, src)]\]
" + + body += "Mob type = [M.type]

" + + body += "Kick | " + body += "Warn | " + body += "Ban | " + body += "Jobban | " + body += "Appearance Ban | " + body += "Notes | " + if(M.client.check_watchlist(M.client.ckey)) + body += "Remove from Watchlist | " + body += "Edit Watchlist Reason " + else + body += "Add to Watchlist " if(M.client) body += "| Prison | " diff --git a/code/modules/admin/admin_investigate.dm b/code/modules/admin/admin_investigate.dm index aea9f51f715..0fc31b8848a 100644 --- a/code/modules/admin/admin_investigate.dm +++ b/code/modules/admin/admin_investigate.dm @@ -26,7 +26,7 @@ F << "[time_stamp()] \ref[src] ([x],[y],[z]) || [src] [message]
" //ADMINVERBS -/client/proc/investigate_show( subject in list("hrefs","pda","singulo","atmos","ntsl","gold core","cult") ) +/client/proc/investigate_show( subject in list("hrefs","pda","singulo","atmos","watchlist","ntsl","gold core","cult") ) set name = "Investigate" set category = "Admin" if(!holder) return @@ -75,4 +75,7 @@ if(!F) src << "Error: admin_investigate: [INVESTIGATE_DIR][subject] is an invalid path or cannot be accessed." return - src << browse(F,"window=investigate[subject];size=800x300") \ No newline at end of file + src << browse(F,"window=investigate[subject];size=800x300") + + if("watchlist") + watchlist_show() \ No newline at end of file diff --git a/code/modules/admin/topic.dm b/code/modules/admin/topic.dm index dc66fdd713d..0ac5b340400 100644 --- a/code/modules/admin/topic.dm +++ b/code/modules/admin/topic.dm @@ -386,12 +386,12 @@ mins = min(525599,mins) minutes = CMinutes + mins duration = GetExp(minutes) - reason = input(usr,"Reason?","reason",reason2) as text|null + reason = input(usr,"Please state the reason","Reason",reason2) as message|null if(!reason) return if("No") temp = 0 duration = "Perma" - reason = input(usr,"Reason?","reason",reason2) as text|null + reason = input(usr,"Please state the reason","Reason",reason2) as message|null if(!reason) return log_admin("[key_name(usr)] edited [banned_key]'s ban. Reason: [reason] Duration: [duration]") @@ -437,7 +437,7 @@ else switch(alert("Appearance ban [M.ckey]?",,"Yes","No", "Cancel")) if("Yes") - var/reason = input(usr,"Reason?","reason","Metafriender") as text|null + var/reason = input(usr,"Please state the reason","Reason") as message|null if(!reason) return ban_unban_log_save("[key_name(usr)] appearance banned [key_name(M)]. reason: [reason]") @@ -870,7 +870,7 @@ var/mins = input(usr,"How long (in minutes)?","Ban time",1440) as num|null if(!mins) return - var/reason = input(usr,"Reason?","Please State Reason","") as text|null + var/reason = input(usr,"Please state the reason","Reason","") as message|null if(!reason) return @@ -894,7 +894,7 @@ href_list["jobban2"] = 1 // lets it fall through and refresh return 1 if("No") - var/reason = input(usr,"Reason?","Please State Reason","") as text|null + var/reason = input(usr,"Please state the reason","Reason","") as message|null if(reason) var/msg for(var/job in notbannedlist) @@ -1004,7 +1004,7 @@ if(!mins) return if(mins >= 525600) mins = 525599 - var/reason = input(usr,"Reason?","reason","Griefer") as text|null + var/reason = input(usr,"Please state the reason","Reason") as message|null if(!reason) return AddBan(M.ckey, M.computer_id, reason, usr.ckey, 1, mins) @@ -1024,7 +1024,7 @@ del(M.client) //del(M) // See no reason why to delete mob. Important stuff can be lost. And ban can be lifted before round ends. if("No") - var/reason = input(usr,"Reason?","reason","Griefer") as text|null + var/reason = input(usr,"Please state the reason","Reason") as message|null if(!reason) return switch(alert(usr,"IP ban?",,"Yes","No","Cancel")) @@ -1050,62 +1050,50 @@ if("Cancel") return + //Watchlist - else if(href_list["watchlist"]) - if(!check_rights(R_ADMIN)) return - var/mob/M = locate(href_list["watchlist"]) - if(!dbcon.IsConnected()) - usr << "Failed to establish database connection." + else if(href_list["watchadd"]) + var/target_ckey = locate(href_list["watchadd"]) + usr.client.watchlist_add(target_ckey) + + else if(href_list["watchremove"]) + var/target_ckey = href_list["watchremove"] + var/confirm = alert("Are you sure you want to remove [target_ckey] from the watchlist?", "Confirm Watchlist Removal", "Yes", "No") + if(confirm == "Yes") + usr.client.watchlist_remove(target_ckey) + + else if(href_list["watchedit"]) + var/target_ckey = href_list["watchedit"] + usr.client.watchlist_edit(target_ckey) + + else if(href_list["watchaddbrowse"]) + usr.client.watchlist_add(null, 1) + + else if(href_list["watchremovebrowse"]) + var/target_ckey = href_list["watchremovebrowse"] + usr.client.watchlist_remove(target_ckey, 1) + + else if(href_list["watcheditbrowse"]) + var/target_ckey = href_list["watcheditbrowse"] + usr.client.watchlist_edit(target_ckey, 1) + + else if(href_list["watchsearch"]) + var/target_ckey = href_list["watchsearch"] + usr.client.watchlist_show(target_ckey) + + else if(href_list["watchshow"]) + usr.client.watchlist_show() + + else if(href_list["watcheditlog"]) + var/target_ckey = sanitizeSQL("[href_list["watcheditlog"]]") + var/DBQuery/query_watchedits = dbcon.NewQuery("SELECT edits FROM [format_table_name("watch")] WHERE ckey = '[target_ckey]'") + if(!query_watchedits.Execute()) + var/err = query_watchedits.ErrorMsg() + log_game("SQL ERROR obtaining edits from watch table. Error : \[[err]\]\n") return - if(!ismob(M)) - usr << "This can only be used on instances of type /mob" - return - if(!M.ckey) - usr << "This mob has no ckey" - return - var/sql_ckey = sanitizeSQL(M.ckey) - 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[2] - 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]' 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 - 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") - 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) + if(query_watchedits.NextRow()) + var/edit_log = query_watchedits.item[1] + usr << browse(edit_log,"window=watchedits") else if(href_list["mute"]) if(!check_rights(R_MOD)) diff --git a/code/modules/admin/verbs/massmodvar.dm b/code/modules/admin/verbs/massmodvar.dm index 7a3ef8deb2b..aa05d810810 100644 --- a/code/modules/admin/verbs/massmodvar.dm +++ b/code/modules/admin/verbs/massmodvar.dm @@ -168,7 +168,7 @@ return .(O.vars[variable]) if("text") - var/new_value = input("Enter new text:","Text",O.vars[variable]) as text|null + var/new_value = input("Enter new text:","Text",O.vars[variable]) as message|null if(new_value == null) return O.vars[variable] = new_value diff --git a/code/modules/admin/verbs/modifyvariables.dm b/code/modules/admin/verbs/modifyvariables.dm index b49a0fe609a..f0532fbd254 100644 --- a/code/modules/admin/verbs/modifyvariables.dm +++ b/code/modules/admin/verbs/modifyvariables.dm @@ -44,7 +44,7 @@ var/list/forbidden_varedit_object_types = list( switch(class) if("text") - var_value = input("Enter new text:","Text") as null|text + var_value = input("Enter new text:","Text") as null|message if("num") var_value = input("Enter new number:","Num") as null|num @@ -93,7 +93,7 @@ var/list/forbidden_varedit_object_types = list( switch(class) if("text") - var_value = input("Enter new text:","Text") as text + var_value = input("Enter new text:","Text") as message|null if("num") var_value = input("Enter new number:","Num") as num @@ -494,7 +494,7 @@ var/list/forbidden_varedit_object_types = list( return .(O.vars[variable]) if("text") - var/var_new = input("Enter new text:","Text",O.vars[variable]) as null|text + var/var_new = input("Enter new text:","Text",O.vars[variable]) as null|message if(var_new==null) return O.vars[variable] = var_new diff --git a/code/modules/admin/watchlist.dm b/code/modules/admin/watchlist.dm new file mode 100644 index 00000000000..4ef6ce0b404 --- /dev/null +++ b/code/modules/admin/watchlist.dm @@ -0,0 +1,118 @@ +client/proc/watchlist_add(target_ckey, browse = 0) + if(!target_ckey) + var/new_ckey = ckey(input(usr,"Who would you like to add to the watchlist?","Enter a ckey",null) as text) + if(!new_ckey) + return + new_ckey = sanitizeSQL(new_ckey) + var/DBQuery/query_watchfind = dbcon.NewQuery("SELECT ckey FROM [format_table_name("player")] WHERE ckey = '[new_ckey]'") + if(!query_watchfind.Execute()) + var/err = query_watchfind.ErrorMsg() + log_game("SQL ERROR obtaining ckey from player table. Error : \[[err]\]\n") + return + if(!query_watchfind.NextRow()) + usr << "[new_ckey] has not been seen before, you can only add known players." + return + else + target_ckey = new_ckey + var/target_sql_ckey = sanitizeSQL(target_ckey) + if(check_watchlist(target_sql_ckey)) + usr << "[target_sql_ckey] is already on the watchlist." + return + var/reason = input(usr,"Please state the reason","Reason") as message|null + if(!reason) + return + reason = sanitizeSQL(reason) + var/timestamp = SQLtime() + var/adminckey = usr.ckey + if(!adminckey) + return + var/admin_sql_ckey = sanitizeSQL(adminckey) + var/DBQuery/query_watchadd = dbcon.NewQuery("INSERT INTO [format_table_name("watch")] (ckey, reason, adminckey, timestamp) VALUES ('[target_sql_ckey]', '[reason]', '[admin_sql_ckey]', '[timestamp]')") + if(!query_watchadd.Execute()) + var/err = query_watchadd.ErrorMsg() + log_game("SQL ERROR during adding new watch entry. Error : \[[err]\]\n") + return + log_admin("[key_name(usr)] has added [target_ckey] to the watchlist - Reason: [reason]") + message_admins("[key_name_admin(usr)] has added [target_ckey] to the watchlist - Reason: [reason]", 1) + if(browse) + watchlist_show(target_sql_ckey) + +client/proc/watchlist_remove(target_ckey, browse = 0) + var/target_sql_ckey = sanitizeSQL(target_ckey) + var/DBQuery/query_watchdel = dbcon.NewQuery("DELETE FROM [format_table_name("watch")] WHERE ckey = '[target_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(usr)] has removed [target_ckey] from the watchlist") + message_admins("[key_name_admin(usr)] has removed [target_ckey] from the watchlist", 1) + if(browse) + watchlist_show() + +client/proc/watchlist_edit(target_ckey, browse = 0) + var/target_sql_ckey = sanitizeSQL(target_ckey) + var/DBQuery/query_watchreason = dbcon.NewQuery("SELECT reason FROM [format_table_name("watch")] WHERE ckey = '[target_sql_ckey]'") + if(!query_watchreason.Execute()) + var/err = query_watchreason.ErrorMsg() + log_game("SQL ERROR obtaining reason from watch table. Error : \[[err]\]\n") + return + if(query_watchreason.NextRow()) + var/watch_reason = query_watchreason.item[1] + var/new_reason = input("Input the new reason", "New Reason", "[watch_reason]") as message|null + new_reason = sanitizeSQL(new_reason) + if(!new_reason || new_reason == watch_reason) + return + var/sql_ckey = sanitizeSQL(usr.ckey) + var/edit_text = "Edited by [sql_ckey] on [SQLtime()] from \"[watch_reason]\" to \"[new_reason]\"" + edit_text = sanitizeSQL(edit_text) + var/DBQuery/query_watchupdate = dbcon.NewQuery("UPDATE [format_table_name("watch")] SET reason = '[new_reason]', last_editor = '[sql_ckey]', edits = CONCAT(IFNULL(edits,''),'[edit_text]') WHERE ckey = '[target_sql_ckey]'") + if(!query_watchupdate.Execute()) + var/err = query_watchupdate.ErrorMsg() + log_game("SQL ERROR editing watchlist reason. Error : \[[err]\]\n") + return + log_admin("[key_name(usr)] has edited [target_ckey]'s watchlist reason from \"[watch_reason]\" to \"[new_reason]\"") + message_admins("[key_name_admin(usr)] has edited [target_ckey]'s watchlist reason from \"[watch_reason]\" to \"[new_reason]\"") + if(browse) + watchlist_show(target_sql_ckey) + +client/proc/watchlist_show(search) + var/output + output += "
\ + \ + \ +
" + output += "\[Clear Search\] \[Add Ckey\]" + output += "
" + if(search) + search = "^[search]" + else + search = "^." + search = sanitizeSQL(search) + var/DBQuery/query_watchlist = dbcon.NewQuery("SELECT ckey, reason, adminckey, timestamp, last_editor FROM [format_table_name("watch")] WHERE ckey REGEXP '[search]' ORDER BY ckey") + if(!query_watchlist.Execute()) + var/err = query_watchlist.ErrorMsg() + log_game("SQL ERROR obtaining ckey, reason, adminckey, timestamp, last_editor from watch table. Error : \[[err]\]\n") + return + while(query_watchlist.NextRow()) + var/ckey = query_watchlist.item[1] + var/reason = query_watchlist.item[2] + var/adminckey = query_watchlist.item[3] + var/timestamp = query_watchlist.item[4] + var/last_editor = query_watchlist.item[5] + output += "[ckey] | Added by [adminckey] on [timestamp] \[Remove\] \[Edit Reason\]" + if(last_editor) + output += " Last edit by [last_editor] (Click here to see edit log)" + output += "
[reason]
" + usr << browse(output, "window=watchwin;size=900x500") + +client/proc/check_watchlist(target_ckey) + var/target_sql_ckey = sanitizeSQL(target_ckey) + var/DBQuery/query_watch = dbcon.NewQuery("SELECT reason FROM [format_table_name("watch")] WHERE ckey = '[target_sql_ckey]'") + if(!query_watch.Execute()) + var/err = query_watch.ErrorMsg() + log_game("SQL ERROR obtaining reason from watch table. Error : \[[err]\]\n") + return + if(query_watch.NextRow()) + return query_watch.item[1] + else + return 0 diff --git a/code/modules/client/client procs.dm b/code/modules/client/client procs.dm index 241a1dc8237..1141e0e043d 100644 --- a/code/modules/client/client procs.dm +++ b/code/modules/client/client procs.dm @@ -330,11 +330,10 @@ if(related_accounts_cid.len) log_access("Alts: [key_name(src)]:[list2text(related_accounts_cid, " - ")]") - 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/watchreason = check_watchlist(sql_ckey) + if(watchreason) + message_admins("Notice: [key_name_admin(src)] is on the watchlist and has just connected - Reason: [watchreason]") + send2irc_adminless_only("Watchlist", "[key_name(src)] is on the watchlist and has just connected - Reason: [watchreason]") //Just the standard check to see if it's actually a number if(sql_id) diff --git a/paradise.dme b/paradise.dme index ccbdd95af88..a2cf2725771 100644 --- a/paradise.dme +++ b/paradise.dme @@ -913,6 +913,7 @@ #include "code\modules\admin\secrets.dm" #include "code\modules\admin\topic.dm" #include "code\modules\admin\ToRban.dm" +#include "code\modules\admin\watchlist.dm" #include "code\modules\admin\DB ban\functions.dm" #include "code\modules\admin\permissionverbs\permissionedit.dm" #include "code\modules\admin\verbs\adminhelp.dm"