diff --git a/code/controllers/configuration.dm b/code/controllers/configuration.dm
index 29188647f2..f6db4f65d4 100644
--- a/code/controllers/configuration.dm
+++ b/code/controllers/configuration.dm
@@ -97,6 +97,7 @@ var/list/gamemode_cache = list()
var/guests_allowed = 1
var/debugparanoid = 0
var/panic_bunker = 0
+ var/paranoia_logging = 0
var/serverurl
var/server
@@ -737,6 +738,12 @@ var/list/gamemode_cache = list()
if("radiation_lower_limit")
radiation_lower_limit = text2num(value)
+ if ("panic_bunker")
+ config.panic_bunker = 1
+
+ if ("paranoia_logging")
+ config.paranoia_logging = 1
+
else
log_misc("Unknown setting in configuration: '[name]'")
diff --git a/code/modules/admin/admin.dm b/code/modules/admin/admin.dm
index 84aa437c55..1ee7dc9686 100644
--- a/code/modules/admin/admin.dm
+++ b/code/modules/admin/admin.dm
@@ -52,6 +52,11 @@ proc/admin_notice(var/message, var/rights)
else
body += " \[Heal\] "
+ if(M.client)
+ body += "
First connection: [M.client.player_age] days ago"
+ body += "
BYOND account created: [M.client.account_join_date]"
+ body += "
BYOND account age (days): [M.client.account_age]"
+
body += {"
\[
VV -
diff --git a/code/modules/admin/admin_verbs.dm b/code/modules/admin/admin_verbs.dm
index 6b038aca4e..2386876cdb 100644
--- a/code/modules/admin/admin_verbs.dm
+++ b/code/modules/admin/admin_verbs.dm
@@ -174,7 +174,8 @@ var/list/admin_verbs_server = list(
/client/proc/nanomapgen_DumpImage,
/client/proc/modify_server_news,
/client/proc/recipe_dump,
- /client/proc/panicbunker
+ /client/proc/panicbunker,
+ /client/proc/paranoia_logging
)
var/list/admin_verbs_debug = list(
diff --git a/code/modules/admin/verbs/panicbunker.dm b/code/modules/admin/verbs/panicbunker.dm
index ac31c26071..a997fdcb11 100644
--- a/code/modules/admin/verbs/panicbunker.dm
+++ b/code/modules/admin/verbs/panicbunker.dm
@@ -1,15 +1,31 @@
/client/proc/panicbunker()
set category = "Server"
set name = "Toggle Panic Bunker"
+
+ if(!check_rights(R_ADMIN))
+ return
+
if (!config.sql_enabled)
to_chat(usr, "The Database is not enabled!")
return
config.panic_bunker = (!config.panic_bunker)
- log_admin("[key_name(usr)] has toggled the Panic Bunker, it is now [(config.panic_bunker?"on":"off")]")
- message_admins("[key_name_admin(usr)] has toggled the Panic Bunker, it is now [(config.panic_bunker?"enabled":"disabled")].")
+ log_and_message_admins("[key_name(usr)] has toggled the Panic Bunker, it is now [(config.panic_bunker?"on":"off")]")
if (config.panic_bunker && (!dbcon || !dbcon.IsConnected()))
message_admins("The Database is not connected! Panic bunker will not work until the connection is reestablished.")
feedback_add_details("admin_verb","PANIC") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc!
+/client/proc/paranoia_logging()
+ set category = "Server"
+ set name = "New Player Warnings"
+
+ if(!check_rights(R_ADMIN))
+ return
+
+ config.paranoia_logging = (!config.paranoia_logging)
+
+ log_and_message_admins("[key_name(usr)] has toggled Paranoia Logging, it is now [(config.paranoia_logging?"on":"off")]")
+ if (config.paranoia_logging && (!dbcon || !dbcon.IsConnected()))
+ message_admins("The Database is not connected! Paranoia logging will not be able to give 'player age' (time since first connection) warnings, only Byond account warnings.")
+ feedback_add_details("admin_verb","PARLOG") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc!
diff --git a/code/modules/client/client defines.dm b/code/modules/client/client defines.dm
index 09d4738d67..f272fba459 100644
--- a/code/modules/client/client defines.dm
+++ b/code/modules/client/client defines.dm
@@ -46,9 +46,11 @@
////////////////////////////////////
//things that require the database//
////////////////////////////////////
- var/player_age = "Requires database" //So admins know why it isn't working - Used to determine how old the account is - in days.
- var/related_accounts_ip = "Requires database" //So admins know why it isn't working - Used to determine what other accounts previously logged in from this ip
- var/related_accounts_cid = "Requires database" //So admins know why it isn't working - Used to determine what other accounts previously logged in from this computer id
+ var/player_age = "(Requires database)" //So admins know why it isn't working - Used to determine how old the account is - in days.
+ var/related_accounts_ip = "(Requires database)" //So admins know why it isn't working - Used to determine what other accounts previously logged in from this ip
+ var/related_accounts_cid = "(Requires database)" //So admins know why it isn't working - Used to determine what other accounts previously logged in from this computer id
+ var/account_join_date = "(Requires database)"
+ var/account_age = "(Requires database)"
preload_rsc = PRELOAD_RSC
diff --git a/code/modules/client/client procs.dm b/code/modules/client/client procs.dm
index 95ce3456b6..b4b842f0b3 100644
--- a/code/modules/client/client procs.dm
+++ b/code/modules/client/client procs.dm
@@ -162,8 +162,12 @@
winset(src, "rpane.changelog", "background-color=#eaeaea;font-style=bold")
if(config.aggressive_changelog)
src.changes()
-
-
+
+ if(config.paranoia_logging)
+ if(isnum(player_age) && player_age == 0)
+ log_and_message_admins("PARANOIA: [key_name(src)] has connected here for the first time.")
+ if(isnum(account_age) && account_age <= 2)
+ log_and_message_admins("PARANOIA: [key_name(src)] has a very new BYOND account ([account_age] days).")
//////////////
//DISCONNECT//
@@ -220,6 +224,12 @@
player_age = text2num(query.item[2])
break
+ account_join_date = sanitizeSQL(findJoinDate())
+ if(account_join_date && dbcon.IsConnected())
+ var/DBQuery/query_datediff = dbcon.NewQuery("SELECT DATEDIFF(Now(),'[account_join_date]')")
+ if(query_datediff.Execute() && query_datediff.NextRow())
+ account_age = text2num(query_datediff.item[1])
+
var/DBQuery/query_ip = dbcon.NewQuery("SELECT ckey FROM erro_player WHERE ip = '[address]'")
query_ip.Execute()
related_accounts_ip = ""
@@ -363,3 +373,16 @@ client/verb/character_setup()
set category = "Preferences"
if(prefs)
prefs.ShowChoices(usr)
+
+/client/proc/findJoinDate()
+ var/list/http = world.Export("http://byond.com/members/[ckey]?format=text")
+ if(!http)
+ log_world("Failed to connect to byond age check for [ckey]")
+ return
+ var/F = file2text(http["CONTENT"])
+ if(F)
+ var/regex/R = regex("joined = \"(\\d{4}-\\d{2}-\\d{2})\"")
+ if(R.Find(F))
+ . = R.group[1]
+ else
+ CRASH("Age check regex failed for [src.ckey]")
diff --git a/config/example/config.txt b/config/example/config.txt
index 23c5818162..d9d73c6ccb 100644
--- a/config/example/config.txt
+++ b/config/example/config.txt
@@ -243,8 +243,8 @@ GUEST_BAN
## Remove the # to allow special 'Easter-egg' events on special holidays such as seasonal holidays and stuff like 'Talk Like a Pirate Day' :3 YAARRR
ALLOW_HOLIDAYS
-##Defines the ticklag for the world. 0.9 is the normal one, 0.5 is smoother.
-TICKLAG 0.9
+##Defines the ticklag for the world. 0.6 is the normal one, 0.5 is smoother
+TICKLAG 0.6
## Defines if Tick Compensation is used. It results in a minor slowdown of movement of all mobs, but attempts to result in a level movement speed across all ticks. Recommended if tickrate is lowered.
TICKCOMP 0
@@ -401,4 +401,10 @@ STARLIGHT 0
#DEFAULT_BRAIN_HEALTH 400
## Default language prefix keys, separated with spaces. Only single character keys are supported. If unset, defaults to , # and -
-# DEFAULT_LANGUAGE_PREFIXES , # -
\ No newline at end of file
+# DEFAULT_LANGUAGE_PREFIXES , # -
+
+## Uncomment to enable the Panic Bunker by default. This will prevent all unseen-before players from connecting. Requires SQL.
+# PANIC_BUNKER
+
+## Uncomment to enable Paranoia Logging. This will notify admins and write to a file any time a new player (byond or your server) connects.
+# PARANOIA_LOGGING