diff --git a/baystation12.dme b/baystation12.dme
index 06fe933f756..dbed3c8fc38 100644
--- a/baystation12.dme
+++ b/baystation12.dme
@@ -149,6 +149,7 @@
#include "code\datums\diseases\advance\symptoms\weight.dm"
#include "code\datums\helper_datums\construction_datum.dm"
#include "code\datums\helper_datums\events.dm"
+#include "code\datums\helper_datums\getrev.dm"
#include "code\datums\helper_datums\global_iterator.dm"
#include "code\datums\helper_datums\teleport.dm"
#include "code\datums\helper_datums\topic_input.dm"
diff --git a/code/__HELPERS/type2type.dm b/code/__HELPERS/type2type.dm
index 478700d5f82..216a45ee1c3 100644
--- a/code/__HELPERS/type2type.dm
+++ b/code/__HELPERS/type2type.dm
@@ -70,19 +70,19 @@
/proc/list2text(list/ls, sep)
if (ls.len <= 1) // Early-out code for empty or singleton lists.
return ls.len ? ls[1] : ""
-
+
var/l = ls.len // Made local for sanic speed.
var/i = 0 // Incremented every time a list index is accessed.
-
+
if (sep <> null)
// Macros expand to long argument lists like so: sep, ls[++i], sep, ls[++i], sep, ls[++i], etc...
#define S1 sep, ls[++i]
#define S4 S1, S1, S1, S1
#define S16 S4, S4, S4, S4
#define S64 S16, S16, S16, S16
-
+
. = "[ls[++i]]" // Make sure the initial element is converted to text.
-
+
// Having the small concatenations come before the large ones boosted speed by an average of at least 5%.
if (l-1 & 0x01) // 'i' will always be 1 here.
. = text("[][][]", ., S1) // Append 1 element if the remaining elements are not a multiple of 2.
@@ -111,7 +111,7 @@
[][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][]\
[][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][]\
[][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][]", ., S64, S64)
-
+
#undef S64
#undef S16
#undef S4
@@ -122,9 +122,9 @@
#define S4 S1, S1, S1, S1
#define S16 S4, S4, S4, S4
#define S64 S16, S16, S16, S16
-
+
. = "[ls[++i]]" // Make sure the initial element is converted to text.
-
+
if (l-1 & 0x01) // 'i' will always be 1 here.
. += S1 // Append 1 element if the remaining elements are not a multiple of 2.
if (l-i & 0x02)
@@ -145,7 +145,7 @@
[][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][]\
[][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][]\
[][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][]", ., S64, S64)
-
+
#undef S64
#undef S16
#undef S4
@@ -165,11 +165,11 @@ proc/tg_list2text(list/list, glue=",")
var/delim_len = length(delimiter)
if (delim_len < 1)
return list(text)
-
+
. = list()
var/last_found = 1
var/found
-
+
do
found = findtext(text, delimiter, last_found, 0)
. += copytext(text, last_found, found)
@@ -181,11 +181,11 @@ proc/tg_list2text(list/list, glue=",")
var/delim_len = length(delimiter)
if (delim_len < 1)
return list(text)
-
+
. = list()
var/last_found = 1
var/found
-
+
do
found = findtextEx(text, delimiter, last_found, 0)
. += copytext(text, last_found, found)
@@ -325,3 +325,47 @@ proc/tg_list2text(list/list, glue=",")
. = 0
else
. = max(0, min(255, 138.5177312231 * log(temp - 10) - 305.0447927307))
+
+// Very ugly, BYOND doesn't support unix time and rounding errors make it really hard to convert it to BYOND time.
+// returns "YYYY-MM-DD" by default
+/proc/unix2date(timestamp, seperator = "-")
+ if(timestamp < 0)
+ return 0 //Do not accept negative values
+
+ var/const/dayInSeconds = 86400 //60secs*60mins*24hours
+ var/const/daysInYear = 365 //Non Leap Year
+ var/const/daysInLYear = daysInYear + 1//Leap year
+ var/days = round(timestamp / dayInSeconds) //Days passed since UNIX Epoc
+ var/year = 1970 //Unix Epoc begins 1970-01-01
+ var/tmpDays = days + 1 //If passed (timestamp < dayInSeconds), it will return 0, so add 1
+ var/monthsInDays = list() //Months will be in here ***Taken from the PHP source code***
+ var/month = 1 //This will be the returned MONTH NUMBER.
+ var/day //This will be the returned day number.
+
+ while(tmpDays > daysInYear) //Start adding years to 1970
+ year++
+ if(isLeap(year))
+ tmpDays -= daysInLYear
+ else
+ tmpDays -= daysInYear
+
+ if(isLeap(year)) //The year is a leap year
+ monthsInDays = list(-1,30,59,90,120,151,181,212,243,273,304,334)
+ else
+ monthsInDays = list(0,31,59,90,120,151,181,212,243,273,304,334)
+
+ var/mDays = 0;
+ var/monthIndex = 0;
+
+ for(var/m in monthsInDays)
+ monthIndex++
+ if(tmpDays > m)
+ mDays = m
+ month = monthIndex
+
+ day = tmpDays - mDays //Setup the date
+
+ return "[year][seperator][((month < 10) ? "0[month]" : month)][seperator][((day < 10) ? "0[day]" : day)]"
+
+/proc/isLeap(y)
+ return ((y) % 4 == 0 && ((y) % 100 != 0 || (y) % 400 == 0))
diff --git a/code/controllers/configuration.dm b/code/controllers/configuration.dm
index b7823a5b5f5..caed2c734c1 100644
--- a/code/controllers/configuration.dm
+++ b/code/controllers/configuration.dm
@@ -90,6 +90,7 @@
var/banappeals
var/wikiurl
var/forumurl
+ var/githuburl
//Alert level description
var/alert_desc_green = "All threats to the station have passed. Security may not have weapons visible, privacy laws are once again fully enforced."
@@ -376,6 +377,9 @@
if ("forumurl")
config.forumurl = value
+ if ("githuburl")
+ config.githuburl = value
+
if ("guest_jobban")
config.guest_jobban = 1
diff --git a/code/datums/helper_datums/getrev.dm b/code/datums/helper_datums/getrev.dm
new file mode 100644
index 00000000000..da4192df257
--- /dev/null
+++ b/code/datums/helper_datums/getrev.dm
@@ -0,0 +1,39 @@
+var/global/datum/getrev/revdata = new()
+
+/datum/getrev
+ var/revision
+ var/date
+ var/showinfo
+
+/datum/getrev/New()
+ var/list/head_log = file2list(".git/logs/HEAD", "\n")
+ for(var/line=head_log.len, line>=1, line--)
+ if(head_log[line])
+ var/list/last_entry = text2list(head_log[line], " ")
+ if(last_entry.len < 2) continue
+ revision = last_entry[2]
+ // Get date/time
+ if(last_entry.len >= 5)
+ var/unix_time = text2num(last_entry[5])
+ if(unix_time)
+ date = unix2date(unix_time)
+ break
+ world.log << "Running revision:"
+ world.log << date
+ world.log << revision
+ return
+
+client/verb/showrevinfo()
+ set category = "OOC"
+ set name = "Show Server Revision"
+ set desc = "Check the current server code revision"
+
+ if(revdata.revision)
+ src << "Server revision: [revdata.date]"
+ if(config.githuburl)
+ src << "[revdata.revision]"
+ else
+ src << revdata.revision
+ else
+ src << "Revision unknown"
+ return
diff --git a/config/example/config.txt b/config/example/config.txt
index 638e383b229..6119ab7cfd1 100644
--- a/config/example/config.txt
+++ b/config/example/config.txt
@@ -177,6 +177,9 @@ GUEST_BAN
## Wiki address
# WIKIURL http://example.com
+## GitHub address
+# GITHUBURL https://github.com/example-user/example-repository
+
## Ban appeals URL - usually for a forum or wherever people should go to contact your admins.
# BANAPPEALS http://example.com