diff --git a/code/controllers/configuration.dm b/code/controllers/configuration.dm
index 7e9ea75db89..89333ee5fa2 100644
--- a/code/controllers/configuration.dm
+++ b/code/controllers/configuration.dm
@@ -85,6 +85,9 @@
var/humans_need_surnames = 0
var/allow_random_events = 0 // enables random events mid-round when set to 1
var/allow_ai = 0 // allow ai job
+ var/panic_bunker = 0 // prevents new people it hasn't seen before from connecting
+ var/notify_new_player_age = 0 // how long do we notify admins of a new player
+ var/irc_first_connection_alert = 0 // do we notify the irc channel when somebody is connecting for the first time?
var/traitor_scaling_coeff = 6 //how much does the amount of players get divided by to determine traitors
var/changeling_scaling_coeff = 6 //how much does the amount of players get divided by to determine changelings
@@ -316,6 +319,12 @@
config.hard_popcap_message = value
if("extreme_popcap_message")
config.extreme_popcap_message = value
+ if("panic_bunker")
+ config.panic_bunker = 1
+ if("notify_new_player_age")
+ config.notify_new_player_age = text2num(value)
+ if("irc_first_connection_alert")
+ config.irc_first_connection_alert = 1
else
diary << "Unknown setting in configuration: '[name]'"
diff --git a/code/modules/admin/admin_verbs.dm b/code/modules/admin/admin_verbs.dm
index 0434213187c..f35c93a3e89 100644
--- a/code/modules/admin/admin_verbs.dm
+++ b/code/modules/admin/admin_verbs.dm
@@ -100,7 +100,8 @@ var/list/admin_verbs_server = list(
/datum/admins/proc/toggleAI,
/client/proc/cmd_admin_delete, /*delete an instance/object/mob/etc*/
/client/proc/cmd_debug_del_all,
- /client/proc/toggle_random_events
+ /client/proc/toggle_random_events,
+ /client/proc/panicbunker
)
var/list/admin_verbs_debug = list(
/client/proc/restart_controller,
@@ -190,7 +191,8 @@ var/list/admin_verbs_hideable = list(
/proc/possess,
/proc/release,
/client/proc/reload_admins,
- /client/proc/reset_all_tcs
+ /client/proc/reset_all_tcs,
+ /client/proc/panicbunker
)
/client/proc/add_admin_verbs()
diff --git a/code/modules/admin/verbs/panicbunker.dm b/code/modules/admin/verbs/panicbunker.dm
new file mode 100644
index 00000000000..e9b12dc5ba2
--- /dev/null
+++ b/code/modules/admin/verbs/panicbunker.dm
@@ -0,0 +1,16 @@
+/client/proc/panicbunker()
+ set category = "Server"
+ set name = "Toggle Panic Bunker"
+ if (!config.sql_enabled)
+ usr << "The Database is not enabled!"
+ return
+
+ if (!dbcon || !dbcon.IsConnected())
+ usr << "The Database is not connected!"
+ 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?"on":"off")]")
+ feedback_add_details("admin_verb","PANIC") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc!
+
diff --git a/code/modules/client/client procs.dm b/code/modules/client/client procs.dm
index 32ae0986467..51ca6ecf703 100644
--- a/code/modules/client/client procs.dm
+++ b/code/modules/client/client procs.dm
@@ -136,6 +136,24 @@ var/next_external_rsc = 0
add_verbs_from_config()
set_client_age_from_db()
+ if (isnum(player_age) && player_age == -1) //first connection
+ if (config.panic_bunker && !holder && !(ckey in deadmins))
+ src << "Sorry but the server is currently not accepting connections from never before seen players."
+ del(src)
+ return 0
+
+ if (config.notify_new_player_age >= 0)
+ message_admins("New user: [key_name_admin(src)] is connecting here for the first time.")
+
+ if (config.irc_first_connection_alert)
+ send2irc("New user", "[key_name(src)] is connecting for the first time!")
+
+ player_age = 0 // set it from -1 to 0 so the job selection code doesn't have a panic attack
+
+ else if (isnum(player_age) && player_age < config.notify_new_player_age)
+ message_admins("New user: [key_name_admin(src)] just connected with an age of [player_age] day[(player_age==1?"":"s")]")
+
+
if (!ticker || ticker.current_state == GAME_STATE_PREGAME)
spawn (rand(10,150))
if (src)
@@ -172,14 +190,15 @@ var/next_external_rsc = 0
var/sql_ckey = sanitizeSQL(src.ckey)
var/DBQuery/query = dbcon.NewQuery("SELECT id, datediff(Now(),firstseen) as age FROM [format_table_name("player")] WHERE ckey = '[sql_ckey]'")
- query.Execute()
+ if (!query.Execute())
+ return
while (query.NextRow())
player_age = text2num(query.item[2])
return
- //player not found.
- player_age = 0
- message_admins("[key_name_admin(src)] is connecting here for the first time.")
+
+ //no match mark it as a first connection for use in client/New()
+ player_age = -1
/client/proc/sync_client_with_db()
diff --git a/config/config.txt b/config/config.txt
index 412245906b1..e28c4ff6b2f 100644
--- a/config/config.txt
+++ b/config/config.txt
@@ -175,4 +175,16 @@ HARD_MESSAGE The server is currently serving a high number of users, You cannot
#EXTREME_POPCAP 200
## Message for extreme cap
-EXTREME_MESSAGE The server is currently serving a high number of users, find alternative servers.
\ No newline at end of file
+EXTREME_MESSAGE The server is currently serving a high number of users, find alternative servers.
+
+## Notify admins when a new player connects for the first x days a player's been around. (0 for first connection only, -1 for never)
+## Requres database
+NOTIFY_NEW_PLAYER_AGE 0
+
+## Notify the irc channel when a new player makes their first connection
+## Requres database
+#IRC_FIRST_CONNECTION_ALERT
+
+## Deny all new connections by ckeys we haven't seen before (exempts admins and only denies the connection if the database is enabled and connected)
+## Requires database
+#PANIC_BUNKER
\ No newline at end of file
diff --git a/tgstation.dme b/tgstation.dme
index 6bce7153849..08724346457 100644
--- a/tgstation.dme
+++ b/tgstation.dme
@@ -798,6 +798,7 @@
#include "code\modules\admin\verbs\modifyvariables.dm"
#include "code\modules\admin\verbs\one_click_antag.dm"
#include "code\modules\admin\verbs\onlyone.dm"
+#include "code\modules\admin\verbs\panicbunker.dm"
#include "code\modules\admin\verbs\playsound.dm"
#include "code\modules\admin\verbs\possess.dm"
#include "code\modules\admin\verbs\pray.dm"