From 099412730c923b55046c045c7a961354a1c9e604 Mon Sep 17 00:00:00 2001
From: Daniel Gibbs <me@danielgibbs.co.uk>
Date: Sun, 1 Oct 2023 23:20:55 +0100
Subject: [PATCH 001/154] feat(alerts): deprecate mailgun (#4324)

mailgun is no longer free and stats suggest it is not used at all. Removing support
---
 .../config-lgsm/acserver/_default.cfg         |  8 -----
 .../config-lgsm/ahl2server/_default.cfg       |  8 -----
 .../config-lgsm/ahlserver/_default.cfg        |  8 -----
 .../config-lgsm/arkserver/_default.cfg        |  8 -----
 .../config-lgsm/arma3server/_default.cfg      |  8 -----
 .../config-lgsm/armarserver/_default.cfg      |  8 -----
 .../config-lgsm/atsserver/_default.cfg        |  8 -----
 .../config-lgsm/avserver/_default.cfg         |  8 -----
 .../config-lgsm/bb2server/_default.cfg        |  8 -----
 .../config-lgsm/bbserver/_default.cfg         |  8 -----
 .../config-lgsm/bdserver/_default.cfg         |  8 -----
 .../config-lgsm/bf1942server/_default.cfg     |  8 -----
 .../config-lgsm/bfvserver/_default.cfg        |  8 -----
 .../config-lgsm/bmdmserver/_default.cfg       |  8 -----
 .../config-lgsm/boserver/_default.cfg         |  8 -----
 .../config-lgsm/bsserver/_default.cfg         |  8 -----
 .../config-lgsm/btlserver/_default.cfg        |  8 -----
 .../config-lgsm/btserver/_default.cfg         |  8 -----
 .../config-lgsm/ccserver/_default.cfg         |  8 -----
 .../config-lgsm/cdserver/_default.cfg         |  8 -----
 .../config-lgsm/ckserver/_default.cfg         |  8 -----
 .../config-lgsm/cmwserver/_default.cfg        |  8 -----
 .../config-lgsm/cod2server/_default.cfg       |  8 -----
 .../config-lgsm/cod4server/_default.cfg       |  8 -----
 .../config-lgsm/codserver/_default.cfg        |  8 -----
 .../config-lgsm/coduoserver/_default.cfg      |  8 -----
 .../config-lgsm/codwawserver/_default.cfg     |  8 -----
 .../config-lgsm/colserver/_default.cfg        |  8 -----
 .../config-lgsm/csczserver/_default.cfg       |  8 -----
 .../config-lgsm/csgoserver/_default.cfg       |  8 -----
 .../config-lgsm/csserver/_default.cfg         |  8 -----
 .../config-lgsm/cssserver/_default.cfg        |  8 -----
 .../config-lgsm/ctserver/_default.cfg         |  8 -----
 .../config-lgsm/dabserver/_default.cfg        |  8 -----
 .../config-lgsm/dayzserver/_default.cfg       |  8 -----
 .../config-lgsm/dmcserver/_default.cfg        |  8 -----
 .../config-lgsm/dodrserver/_default.cfg       |  8 -----
 .../config-lgsm/dodserver/_default.cfg        |  8 -----
 .../config-lgsm/dodsserver/_default.cfg       |  8 -----
 .../config-lgsm/doiserver/_default.cfg        |  8 -----
 .../config-lgsm/dstserver/_default.cfg        |  8 -----
 .../config-lgsm/dysserver/_default.cfg        |  8 -----
 .../config-lgsm/ecoserver/_default.cfg        |  8 -----
 .../config-lgsm/emserver/_default.cfg         |  8 -----
 .../config-lgsm/etlserver/_default.cfg        |  8 -----
 .../config-lgsm/ets2server/_default.cfg       |  8 -----
 .../config-lgsm/fctrserver/_default.cfg       |  8 -----
 .../config-lgsm/fofserver/_default.cfg        |  8 -----
 .../config-lgsm/gmodserver/_default.cfg       |  8 -----
 .../config-lgsm/hcuserver/_default.cfg        |  8 -----
 .../config-lgsm/hl2dmserver/_default.cfg      |  8 -----
 .../config-lgsm/hldmserver/_default.cfg       |  8 -----
 .../config-lgsm/hldmsserver/_default.cfg      |  8 -----
 .../config-lgsm/hwserver/_default.cfg         |  8 -----
 .../config-lgsm/insserver/_default.cfg        |  8 -----
 .../config-lgsm/inssserver/_default.cfg       |  8 -----
 .../config-lgsm/iosserver/_default.cfg        |  8 -----
 .../config-lgsm/jc2server/_default.cfg        |  8 -----
 .../config-lgsm/jc3server/_default.cfg        |  8 -----
 .../config-lgsm/jk2server/_default.cfg        |  8 -----
 .../config-lgsm/kf2server/_default.cfg        |  8 -----
 .../config-lgsm/kfserver/_default.cfg         |  8 -----
 .../config-lgsm/l4d2server/_default.cfg       |  8 -----
 .../config-lgsm/l4dserver/_default.cfg        |  8 -----
 .../config-lgsm/loserver/_default.cfg         |  8 -----
 .../config-lgsm/mcbserver/_default.cfg        |  8 -----
 .../config-lgsm/mcserver/_default.cfg         |  8 -----
 .../config-lgsm/mhserver/_default.cfg         |  8 -----
 .../config-lgsm/mohaaserver/_default.cfg      |  8 -----
 .../config-lgsm/momserver/_default.cfg        |  8 -----
 .../config-lgsm/mtaserver/_default.cfg        |  8 -----
 .../config-lgsm/ndserver/_default.cfg         |  8 -----
 .../config-lgsm/necserver/_default.cfg        |  8 -----
 .../config-lgsm/nmrihserver/_default.cfg      |  8 -----
 .../config-lgsm/ns2cserver/_default.cfg       |  8 -----
 .../config-lgsm/ns2server/_default.cfg        |  8 -----
 .../config-lgsm/nsserver/_default.cfg         |  8 -----
 .../config-lgsm/ohdserver/_default.cfg        |  8 -----
 .../config-lgsm/onsetserver/_default.cfg      |  8 -----
 .../config-lgsm/opforserver/_default.cfg      |  8 -----
 .../config-lgsm/pc2server/_default.cfg        |  8 -----
 .../config-lgsm/pcserver/_default.cfg         |  8 -----
 .../config-lgsm/pmcserver/_default.cfg        |  8 -----
 .../config-lgsm/psserver/_default.cfg         |  8 -----
 .../config-lgsm/pvkiiserver/_default.cfg      |  8 -----
 .../config-lgsm/pvrserver/_default.cfg        |  8 -----
 .../config-lgsm/pzserver/_default.cfg         |  8 -----
 .../config-lgsm/q2server/_default.cfg         |  8 -----
 .../config-lgsm/q3server/_default.cfg         |  8 -----
 .../config-lgsm/qlserver/_default.cfg         |  8 -----
 .../config-lgsm/qwserver/_default.cfg         |  8 -----
 .../config-lgsm/ricochetserver/_default.cfg   |  8 -----
 .../config-lgsm/roserver/_default.cfg         |  8 -----
 .../config-lgsm/rtcwserver/_default.cfg       |  8 -----
 .../config-lgsm/rustserver/_default.cfg       |  8 -----
 .../config-lgsm/rwserver/_default.cfg         |  8 -----
 .../config-lgsm/sampserver/_default.cfg       |  8 -----
 .../config-lgsm/sbotsserver/_default.cfg      |  8 -----
 .../config-lgsm/sbserver/_default.cfg         |  8 -----
 .../config-lgsm/scpslserver/_default.cfg      |  8 -----
 .../config-lgsm/scpslsmserver/_default.cfg    |  8 -----
 .../config-lgsm/sdtdserver/_default.cfg       |  8 -----
 .../config-lgsm/sfcserver/_default.cfg        |  8 -----
 .../config-lgsm/sfserver/_default.cfg         |  8 -----
 .../config-lgsm/sof2server/_default.cfg       |  8 -----
 .../config-lgsm/solserver/_default.cfg        |  8 -----
 .../config-lgsm/squadserver/_default.cfg      |  8 -----
 .../config-lgsm/stnserver/_default.cfg        |  8 -----
 .../config-lgsm/stserver/_default.cfg         |  8 -----
 .../config-lgsm/svenserver/_default.cfg       |  8 -----
 .../config-lgsm/terrariaserver/_default.cfg   |  8 -----
 .../config-lgsm/tf2server/_default.cfg        |  8 -----
 .../config-lgsm/tfcserver/_default.cfg        |  8 -----
 .../config-lgsm/tiserver/_default.cfg         |  8 -----
 .../config-lgsm/ts3server/_default.cfg        |  8 -----
 .../config-lgsm/tsserver/_default.cfg         |  8 -----
 .../config-lgsm/tuserver/_default.cfg         |  8 -----
 .../config-lgsm/twserver/_default.cfg         |  8 -----
 .../config-lgsm/untserver/_default.cfg        |  8 -----
 .../config-lgsm/ut2k4server/_default.cfg      |  8 -----
 .../config-lgsm/ut3server/_default.cfg        |  8 -----
 .../config-lgsm/ut99server/_default.cfg       |  8 -----
 .../config-lgsm/utserver/_default.cfg         |  8 -----
 .../config-lgsm/vhserver/_default.cfg         |  8 -----
 .../config-lgsm/vintsserver/_default.cfg      |  8 -----
 .../config-lgsm/vpmcserver/_default.cfg       |  8 -----
 .../config-lgsm/vsserver/_default.cfg         |  8 -----
 .../config-lgsm/wetserver/_default.cfg        |  8 -----
 .../config-lgsm/wfserver/_default.cfg         |  8 -----
 .../config-lgsm/wmcserver/_default.cfg        |  8 -----
 .../config-lgsm/wurmserver/_default.cfg       |  8 -----
 .../config-lgsm/zmrserver/_default.cfg        |  8 -----
 .../config-lgsm/zpsserver/_default.cfg        |  8 -----
 lgsm/modules/alert.sh                         | 11 -------
 lgsm/modules/alert_mailgun.sh                 | 32 -------------------
 lgsm/modules/core_functions.sh                |  5 ---
 lgsm/modules/core_modules.sh                  |  5 ---
 lgsm/modules/info_stats.sh                    |  9 ++----
 tests/tests_defaultcfg/defaultcfg_1.txt       |  1 -
 139 files changed, 2 insertions(+), 1125 deletions(-)
 delete mode 100644 lgsm/modules/alert_mailgun.sh

diff --git a/lgsm/config-default/config-lgsm/acserver/_default.cfg b/lgsm/config-default/config-lgsm/acserver/_default.cfg
index 3dbc9cbeb..c6aeb7b63 100644
--- a/lgsm/config-default/config-lgsm/acserver/_default.cfg
+++ b/lgsm/config-default/config-lgsm/acserver/_default.cfg
@@ -51,14 +51,6 @@ iftttalert="off"
 ifttttoken="accesstoken"
 iftttevent="linuxgsm_alert"
 
-# Mailgun Email Alerts | https://docs.linuxgsm.com/alerts/mailgun
-mailgunalert="off"
-mailgunapiregion="us"
-mailguntoken="accesstoken"
-mailgundomain="example.com"
-mailgunemailfrom="alert@example.com"
-mailgunemail="email@myemail.com"
-
 # Pushbullet Alerts | https://docs.linuxgsm.com/alerts/pushbullet
 pushbulletalert="off"
 pushbullettoken="accesstoken"
diff --git a/lgsm/config-default/config-lgsm/ahl2server/_default.cfg b/lgsm/config-default/config-lgsm/ahl2server/_default.cfg
index 91bfdd25c..fa8f9fa90 100644
--- a/lgsm/config-default/config-lgsm/ahl2server/_default.cfg
+++ b/lgsm/config-default/config-lgsm/ahl2server/_default.cfg
@@ -59,14 +59,6 @@ iftttalert="off"
 ifttttoken="accesstoken"
 iftttevent="linuxgsm_alert"
 
-# Mailgun Email Alerts | https://docs.linuxgsm.com/alerts/mailgun
-mailgunalert="off"
-mailgunapiregion="us"
-mailguntoken="accesstoken"
-mailgundomain="example.com"
-mailgunemailfrom="alert@example.com"
-mailgunemail="email@myemail.com"
-
 # Pushbullet Alerts | https://docs.linuxgsm.com/alerts/pushbullet
 pushbulletalert="off"
 pushbullettoken="accesstoken"
diff --git a/lgsm/config-default/config-lgsm/ahlserver/_default.cfg b/lgsm/config-default/config-lgsm/ahlserver/_default.cfg
index 78a3059f9..6b8012b36 100644
--- a/lgsm/config-default/config-lgsm/ahlserver/_default.cfg
+++ b/lgsm/config-default/config-lgsm/ahlserver/_default.cfg
@@ -54,14 +54,6 @@ iftttalert="off"
 ifttttoken="accesstoken"
 iftttevent="linuxgsm_alert"
 
-# Mailgun Email Alerts | https://docs.linuxgsm.com/alerts/mailgun
-mailgunalert="off"
-mailgunapiregion="us"
-mailguntoken="accesstoken"
-mailgundomain="example.com"
-mailgunemailfrom="alert@example.com"
-mailgunemail="email@myemail.com"
-
 # Pushbullet Alerts | https://docs.linuxgsm.com/alerts/pushbullet
 pushbulletalert="off"
 pushbullettoken="accesstoken"
diff --git a/lgsm/config-default/config-lgsm/arkserver/_default.cfg b/lgsm/config-default/config-lgsm/arkserver/_default.cfg
index e3fb9654e..6e3b466fd 100644
--- a/lgsm/config-default/config-lgsm/arkserver/_default.cfg
+++ b/lgsm/config-default/config-lgsm/arkserver/_default.cfg
@@ -57,14 +57,6 @@ iftttalert="off"
 ifttttoken="accesstoken"
 iftttevent="linuxgsm_alert"
 
-# Mailgun Email Alerts | https://docs.linuxgsm.com/alerts/mailgun
-mailgunalert="off"
-mailgunapiregion="us"
-mailguntoken="accesstoken"
-mailgundomain="example.com"
-mailgunemailfrom="alert@example.com"
-mailgunemail="email@myemail.com"
-
 # Pushbullet Alerts | https://docs.linuxgsm.com/alerts/pushbullet
 pushbulletalert="off"
 pushbullettoken="accesstoken"
diff --git a/lgsm/config-default/config-lgsm/arma3server/_default.cfg b/lgsm/config-default/config-lgsm/arma3server/_default.cfg
index 60662bed2..8a59a6fb1 100644
--- a/lgsm/config-default/config-lgsm/arma3server/_default.cfg
+++ b/lgsm/config-default/config-lgsm/arma3server/_default.cfg
@@ -70,14 +70,6 @@ iftttalert="off"
 ifttttoken="accesstoken"
 iftttevent="linuxgsm_alert"
 
-# Mailgun Email Alerts | https://docs.linuxgsm.com/alerts/mailgun
-mailgunalert="off"
-mailgunapiregion="us"
-mailguntoken="accesstoken"
-mailgundomain="example.com"
-mailgunemailfrom="alert@example.com"
-mailgunemail="email@myemail.com"
-
 # Pushbullet Alerts | https://docs.linuxgsm.com/alerts/pushbullet
 pushbulletalert="off"
 pushbullettoken="accesstoken"
diff --git a/lgsm/config-default/config-lgsm/armarserver/_default.cfg b/lgsm/config-default/config-lgsm/armarserver/_default.cfg
index faf64c559..913447e47 100644
--- a/lgsm/config-default/config-lgsm/armarserver/_default.cfg
+++ b/lgsm/config-default/config-lgsm/armarserver/_default.cfg
@@ -55,14 +55,6 @@ iftttalert="off"
 ifttttoken="accesstoken"
 iftttevent="linuxgsm_alert"
 
-# Mailgun Email Alerts | https://docs.linuxgsm.com/alerts/mailgun
-mailgunalert="off"
-mailgunapiregion="us"
-mailguntoken="accesstoken"
-mailgundomain="example.com"
-mailgunemailfrom="alert@example.com"
-mailgunemail="email@myemail.com"
-
 # Pushbullet Alerts | https://docs.linuxgsm.com/alerts/pushbullet
 pushbulletalert="off"
 pushbullettoken="accesstoken"
diff --git a/lgsm/config-default/config-lgsm/atsserver/_default.cfg b/lgsm/config-default/config-lgsm/atsserver/_default.cfg
index 3274e757e..04b795dc5 100644
--- a/lgsm/config-default/config-lgsm/atsserver/_default.cfg
+++ b/lgsm/config-default/config-lgsm/atsserver/_default.cfg
@@ -47,14 +47,6 @@ iftttalert="off"
 ifttttoken="accesstoken"
 iftttevent="linuxgsm_alert"
 
-# Mailgun Email Alerts | https://docs.linuxgsm.com/alerts/mailgun
-mailgunalert="off"
-mailgunapiregion="us"
-mailguntoken="accesstoken"
-mailgundomain="example.com"
-mailgunemailfrom="alert@example.com"
-mailgunemail="email@myemail.com"
-
 # Pushbullet Alerts | https://docs.linuxgsm.com/alerts/pushbullet
 pushbulletalert="off"
 pushbullettoken="accesstoken"
diff --git a/lgsm/config-default/config-lgsm/avserver/_default.cfg b/lgsm/config-default/config-lgsm/avserver/_default.cfg
index 532740d57..45cd149b2 100644
--- a/lgsm/config-default/config-lgsm/avserver/_default.cfg
+++ b/lgsm/config-default/config-lgsm/avserver/_default.cfg
@@ -47,14 +47,6 @@ iftttalert="off"
 ifttttoken="accesstoken"
 iftttevent="linuxgsm_alert"
 
-# Mailgun Email Alerts | https://docs.linuxgsm.com/alerts/mailgun
-mailgunalert="off"
-mailgunapiregion="us"
-mailguntoken="accesstoken"
-mailgundomain="example.com"
-mailgunemailfrom="alert@example.com"
-mailgunemail="email@myemail.com"
-
 # Pushbullet Alerts | https://docs.linuxgsm.com/alerts/pushbullet
 pushbulletalert="off"
 pushbullettoken="accesstoken"
diff --git a/lgsm/config-default/config-lgsm/bb2server/_default.cfg b/lgsm/config-default/config-lgsm/bb2server/_default.cfg
index 396893061..4076878d4 100644
--- a/lgsm/config-default/config-lgsm/bb2server/_default.cfg
+++ b/lgsm/config-default/config-lgsm/bb2server/_default.cfg
@@ -60,14 +60,6 @@ iftttalert="off"
 ifttttoken="accesstoken"
 iftttevent="linuxgsm_alert"
 
-# Mailgun Email Alerts | https://docs.linuxgsm.com/alerts/mailgun
-mailgunalert="off"
-mailgunapiregion="us"
-mailguntoken="accesstoken"
-mailgundomain="example.com"
-mailgunemailfrom="alert@example.com"
-mailgunemail="email@myemail.com"
-
 # Pushbullet Alerts | https://docs.linuxgsm.com/alerts/pushbullet
 pushbulletalert="off"
 pushbullettoken="accesstoken"
diff --git a/lgsm/config-default/config-lgsm/bbserver/_default.cfg b/lgsm/config-default/config-lgsm/bbserver/_default.cfg
index 32621c7be..9932d4ffe 100644
--- a/lgsm/config-default/config-lgsm/bbserver/_default.cfg
+++ b/lgsm/config-default/config-lgsm/bbserver/_default.cfg
@@ -54,14 +54,6 @@ iftttalert="off"
 ifttttoken="accesstoken"
 iftttevent="linuxgsm_alert"
 
-# Mailgun Email Alerts | https://docs.linuxgsm.com/alerts/mailgun
-mailgunalert="off"
-mailgunapiregion="us"
-mailguntoken="accesstoken"
-mailgundomain="example.com"
-mailgunemailfrom="alert@example.com"
-mailgunemail="email@myemail.com"
-
 # Pushbullet Alerts | https://docs.linuxgsm.com/alerts/pushbullet
 pushbulletalert="off"
 pushbullettoken="accesstoken"
diff --git a/lgsm/config-default/config-lgsm/bdserver/_default.cfg b/lgsm/config-default/config-lgsm/bdserver/_default.cfg
index 23bf71196..7fcdb4e1d 100644
--- a/lgsm/config-default/config-lgsm/bdserver/_default.cfg
+++ b/lgsm/config-default/config-lgsm/bdserver/_default.cfg
@@ -54,14 +54,6 @@ iftttalert="off"
 ifttttoken="accesstoken"
 iftttevent="linuxgsm_alert"
 
-# Mailgun Email Alerts | https://docs.linuxgsm.com/alerts/mailgun
-mailgunalert="off"
-mailgunapiregion="us"
-mailguntoken="accesstoken"
-mailgundomain="example.com"
-mailgunemailfrom="alert@example.com"
-mailgunemail="email@myemail.com"
-
 # Pushbullet Alerts | https://docs.linuxgsm.com/alerts/pushbullet
 pushbulletalert="off"
 pushbullettoken="accesstoken"
diff --git a/lgsm/config-default/config-lgsm/bf1942server/_default.cfg b/lgsm/config-default/config-lgsm/bf1942server/_default.cfg
index 8cbcd35a1..d99068522 100644
--- a/lgsm/config-default/config-lgsm/bf1942server/_default.cfg
+++ b/lgsm/config-default/config-lgsm/bf1942server/_default.cfg
@@ -47,14 +47,6 @@ iftttalert="off"
 ifttttoken="accesstoken"
 iftttevent="linuxgsm_alert"
 
-# Mailgun Email Alerts | https://docs.linuxgsm.com/alerts/mailgun
-mailgunalert="off"
-mailgunapiregion="us"
-mailguntoken="accesstoken"
-mailgundomain="example.com"
-mailgunemailfrom="alert@example.com"
-mailgunemail="email@myemail.com"
-
 # Pushbullet Alerts | https://docs.linuxgsm.com/alerts/pushbullet
 pushbulletalert="off"
 pushbullettoken="accesstoken"
diff --git a/lgsm/config-default/config-lgsm/bfvserver/_default.cfg b/lgsm/config-default/config-lgsm/bfvserver/_default.cfg
index 2c5672106..c6e4b8bb7 100644
--- a/lgsm/config-default/config-lgsm/bfvserver/_default.cfg
+++ b/lgsm/config-default/config-lgsm/bfvserver/_default.cfg
@@ -47,14 +47,6 @@ iftttalert="off"
 ifttttoken="accesstoken"
 iftttevent="linuxgsm_alert"
 
-# Mailgun Email Alerts | https://docs.linuxgsm.com/alerts/mailgun
-mailgunalert="off"
-mailgunapiregion="us"
-mailguntoken="accesstoken"
-mailgundomain="example.com"
-mailgunemailfrom="alert@example.com"
-mailgunemail="email@myemail.com"
-
 # Pushbullet Alerts | https://docs.linuxgsm.com/alerts/pushbullet
 pushbulletalert="off"
 pushbullettoken="accesstoken"
diff --git a/lgsm/config-default/config-lgsm/bmdmserver/_default.cfg b/lgsm/config-default/config-lgsm/bmdmserver/_default.cfg
index 659e1abd7..b17a16f4d 100644
--- a/lgsm/config-default/config-lgsm/bmdmserver/_default.cfg
+++ b/lgsm/config-default/config-lgsm/bmdmserver/_default.cfg
@@ -60,14 +60,6 @@ iftttalert="off"
 ifttttoken="accesstoken"
 iftttevent="linuxgsm_alert"
 
-# Mailgun Email Alerts | https://docs.linuxgsm.com/alerts/mailgun
-mailgunalert="off"
-mailgunapiregion="us"
-mailguntoken="accesstoken"
-mailgundomain="example.com"
-mailgunemailfrom="alert@example.com"
-mailgunemail="email@myemail.com"
-
 # Pushbullet Alerts | https://docs.linuxgsm.com/alerts/pushbullet
 pushbulletalert="off"
 pushbullettoken="accesstoken"
diff --git a/lgsm/config-default/config-lgsm/boserver/_default.cfg b/lgsm/config-default/config-lgsm/boserver/_default.cfg
index a56292a3a..1ede22c39 100644
--- a/lgsm/config-default/config-lgsm/boserver/_default.cfg
+++ b/lgsm/config-default/config-lgsm/boserver/_default.cfg
@@ -52,14 +52,6 @@ iftttalert="off"
 ifttttoken="accesstoken"
 iftttevent="linuxgsm_alert"
 
-# Mailgun Email Alerts | https://docs.linuxgsm.com/alerts/mailgun
-mailgunalert="off"
-mailgunapiregion="us"
-mailguntoken="accesstoken"
-mailgundomain="example.com"
-mailgunemailfrom="alert@example.com"
-mailgunemail="email@myemail.com"
-
 # Pushbullet Alerts | https://docs.linuxgsm.com/alerts/pushbullet
 pushbulletalert="off"
 pushbullettoken="accesstoken"
diff --git a/lgsm/config-default/config-lgsm/bsserver/_default.cfg b/lgsm/config-default/config-lgsm/bsserver/_default.cfg
index 503cde7b5..d01696170 100644
--- a/lgsm/config-default/config-lgsm/bsserver/_default.cfg
+++ b/lgsm/config-default/config-lgsm/bsserver/_default.cfg
@@ -64,14 +64,6 @@ iftttalert="off"
 ifttttoken="accesstoken"
 iftttevent="linuxgsm_alert"
 
-# Mailgun Email Alerts | https://docs.linuxgsm.com/alerts/mailgun
-mailgunalert="off"
-mailgunapiregion="us"
-mailguntoken="accesstoken"
-mailgundomain="example.com"
-mailgunemailfrom="alert@example.com"
-mailgunemail="email@myemail.com"
-
 # Pushbullet Alerts | https://docs.linuxgsm.com/alerts/pushbullet
 pushbulletalert="off"
 pushbullettoken="accesstoken"
diff --git a/lgsm/config-default/config-lgsm/btlserver/_default.cfg b/lgsm/config-default/config-lgsm/btlserver/_default.cfg
index e26ca7e77..aeaadea9b 100644
--- a/lgsm/config-default/config-lgsm/btlserver/_default.cfg
+++ b/lgsm/config-default/config-lgsm/btlserver/_default.cfg
@@ -52,14 +52,6 @@ iftttalert="off"
 ifttttoken="accesstoken"
 iftttevent="linuxgsm_alert"
 
-# Mailgun Email Alerts | https://docs.linuxgsm.com/alerts/mailgun
-mailgunalert="off"
-mailgunapiregion="us"
-mailguntoken="accesstoken"
-mailgundomain="example.com"
-mailgunemailfrom="alert@example.com"
-mailgunemail="email@myemail.com"
-
 # Pushbullet Alerts | https://docs.linuxgsm.com/alerts/pushbullet
 pushbulletalert="off"
 pushbullettoken="accesstoken"
diff --git a/lgsm/config-default/config-lgsm/btserver/_default.cfg b/lgsm/config-default/config-lgsm/btserver/_default.cfg
index 8c32ee2d4..636136580 100644
--- a/lgsm/config-default/config-lgsm/btserver/_default.cfg
+++ b/lgsm/config-default/config-lgsm/btserver/_default.cfg
@@ -47,14 +47,6 @@ iftttalert="off"
 ifttttoken="accesstoken"
 iftttevent="linuxgsm_alert"
 
-# Mailgun Email Alerts | https://docs.linuxgsm.com/alerts/mailgun
-mailgunalert="off"
-mailgunapiregion="us"
-mailguntoken="accesstoken"
-mailgundomain="example.com"
-mailgunemailfrom="alert@example.com"
-mailgunemail="email@myemail.com"
-
 # Pushbullet Alerts | https://docs.linuxgsm.com/alerts/pushbullet
 pushbulletalert="off"
 pushbullettoken="accesstoken"
diff --git a/lgsm/config-default/config-lgsm/ccserver/_default.cfg b/lgsm/config-default/config-lgsm/ccserver/_default.cfg
index 3aaa47dca..1b8617e11 100644
--- a/lgsm/config-default/config-lgsm/ccserver/_default.cfg
+++ b/lgsm/config-default/config-lgsm/ccserver/_default.cfg
@@ -55,14 +55,6 @@ iftttalert="off"
 ifttttoken="accesstoken"
 iftttevent="linuxgsm_alert"
 
-# Mailgun Email Alerts | https://docs.linuxgsm.com/alerts/mailgun
-mailgunalert="off"
-mailgunapiregion="us"
-mailguntoken="accesstoken"
-mailgundomain="example.com"
-mailgunemailfrom="alert@example.com"
-mailgunemail="email@myemail.com"
-
 # Pushbullet Alerts | https://docs.linuxgsm.com/alerts/pushbullet
 pushbulletalert="off"
 pushbullettoken="accesstoken"
diff --git a/lgsm/config-default/config-lgsm/cdserver/_default.cfg b/lgsm/config-default/config-lgsm/cdserver/_default.cfg
index 419eb5e3d..69e4ee51e 100644
--- a/lgsm/config-default/config-lgsm/cdserver/_default.cfg
+++ b/lgsm/config-default/config-lgsm/cdserver/_default.cfg
@@ -47,14 +47,6 @@ iftttalert="off"
 ifttttoken="accesstoken"
 iftttevent="linuxgsm_alert"
 
-# Mailgun Email Alerts | https://docs.linuxgsm.com/alerts/mailgun
-mailgunalert="off"
-mailgunapiregion="us"
-mailguntoken="accesstoken"
-mailgundomain="example.com"
-mailgunemailfrom="alert@example.com"
-mailgunemail="email@myemail.com"
-
 # Pushbullet Alerts | https://docs.linuxgsm.com/alerts/pushbullet
 pushbulletalert="off"
 pushbullettoken="accesstoken"
diff --git a/lgsm/config-default/config-lgsm/ckserver/_default.cfg b/lgsm/config-default/config-lgsm/ckserver/_default.cfg
index 164fd85f9..fe3d56f44 100644
--- a/lgsm/config-default/config-lgsm/ckserver/_default.cfg
+++ b/lgsm/config-default/config-lgsm/ckserver/_default.cfg
@@ -51,14 +51,6 @@ iftttalert="off"
 ifttttoken="accesstoken"
 iftttevent="linuxgsm_alert"
 
-# Mailgun Email Alerts | https://docs.linuxgsm.com/alerts/mailgun
-mailgunalert="off"
-mailgunapiregion="us"
-mailguntoken="accesstoken"
-mailgundomain="example.com"
-mailgunemailfrom="alert@example.com"
-mailgunemail="email@myemail.com"
-
 # Pushbullet Alerts | https://docs.linuxgsm.com/alerts/pushbullet
 pushbulletalert="off"
 pushbullettoken="accesstoken"
diff --git a/lgsm/config-default/config-lgsm/cmwserver/_default.cfg b/lgsm/config-default/config-lgsm/cmwserver/_default.cfg
index a03f04dd2..d0fe00b0d 100644
--- a/lgsm/config-default/config-lgsm/cmwserver/_default.cfg
+++ b/lgsm/config-default/config-lgsm/cmwserver/_default.cfg
@@ -53,14 +53,6 @@ iftttalert="off"
 ifttttoken="accesstoken"
 iftttevent="linuxgsm_alert"
 
-# Mailgun Email Alerts | https://docs.linuxgsm.com/alerts/mailgun
-mailgunalert="off"
-mailgunapiregion="us"
-mailguntoken="accesstoken"
-mailgundomain="example.com"
-mailgunemailfrom="alert@example.com"
-mailgunemail="email@myemail.com"
-
 # Pushbullet Alerts | https://docs.linuxgsm.com/alerts/pushbullet
 pushbulletalert="off"
 pushbullettoken="accesstoken"
diff --git a/lgsm/config-default/config-lgsm/cod2server/_default.cfg b/lgsm/config-default/config-lgsm/cod2server/_default.cfg
index e27276e2f..8f0d889d0 100644
--- a/lgsm/config-default/config-lgsm/cod2server/_default.cfg
+++ b/lgsm/config-default/config-lgsm/cod2server/_default.cfg
@@ -53,14 +53,6 @@ iftttalert="off"
 ifttttoken="accesstoken"
 iftttevent="linuxgsm_alert"
 
-# Mailgun Email Alerts | https://docs.linuxgsm.com/alerts/mailgun
-mailgunalert="off"
-mailgunapiregion="us"
-mailguntoken="accesstoken"
-mailgundomain="example.com"
-mailgunemailfrom="alert@example.com"
-mailgunemail="email@myemail.com"
-
 # Pushbullet Alerts | https://docs.linuxgsm.com/alerts/pushbullet
 pushbulletalert="off"
 pushbullettoken="accesstoken"
diff --git a/lgsm/config-default/config-lgsm/cod4server/_default.cfg b/lgsm/config-default/config-lgsm/cod4server/_default.cfg
index fb46bcec6..6fce7fea3 100644
--- a/lgsm/config-default/config-lgsm/cod4server/_default.cfg
+++ b/lgsm/config-default/config-lgsm/cod4server/_default.cfg
@@ -53,14 +53,6 @@ iftttalert="off"
 ifttttoken="accesstoken"
 iftttevent="linuxgsm_alert"
 
-# Mailgun Email Alerts | https://docs.linuxgsm.com/alerts/mailgun
-mailgunalert="off"
-mailgunapiregion="us"
-mailguntoken="accesstoken"
-mailgundomain="example.com"
-mailgunemailfrom="alert@example.com"
-mailgunemail="email@myemail.com"
-
 # Pushbullet Alerts | https://docs.linuxgsm.com/alerts/pushbullet
 pushbulletalert="off"
 pushbullettoken="accesstoken"
diff --git a/lgsm/config-default/config-lgsm/codserver/_default.cfg b/lgsm/config-default/config-lgsm/codserver/_default.cfg
index 89631a67d..9929f2626 100644
--- a/lgsm/config-default/config-lgsm/codserver/_default.cfg
+++ b/lgsm/config-default/config-lgsm/codserver/_default.cfg
@@ -53,14 +53,6 @@ iftttalert="off"
 ifttttoken="accesstoken"
 iftttevent="linuxgsm_alert"
 
-# Mailgun Email Alerts | https://docs.linuxgsm.com/alerts/mailgun
-mailgunalert="off"
-mailgunapiregion="us"
-mailguntoken="accesstoken"
-mailgundomain="example.com"
-mailgunemailfrom="alert@example.com"
-mailgunemail="email@myemail.com"
-
 # Pushbullet Alerts | https://docs.linuxgsm.com/alerts/pushbullet
 pushbulletalert="off"
 pushbullettoken="accesstoken"
diff --git a/lgsm/config-default/config-lgsm/coduoserver/_default.cfg b/lgsm/config-default/config-lgsm/coduoserver/_default.cfg
index 2c26a36bb..1719eb8f7 100644
--- a/lgsm/config-default/config-lgsm/coduoserver/_default.cfg
+++ b/lgsm/config-default/config-lgsm/coduoserver/_default.cfg
@@ -53,14 +53,6 @@ iftttalert="off"
 ifttttoken="accesstoken"
 iftttevent="linuxgsm_alert"
 
-# Mailgun Email Alerts | https://docs.linuxgsm.com/alerts/mailgun
-mailgunalert="off"
-mailgunapiregion="us"
-mailguntoken="accesstoken"
-mailgundomain="example.com"
-mailgunemailfrom="alert@example.com"
-mailgunemail="email@myemail.com"
-
 # Pushbullet Alerts | https://docs.linuxgsm.com/alerts/pushbullet
 pushbulletalert="off"
 pushbullettoken="accesstoken"
diff --git a/lgsm/config-default/config-lgsm/codwawserver/_default.cfg b/lgsm/config-default/config-lgsm/codwawserver/_default.cfg
index 2943f832d..c7169f170 100644
--- a/lgsm/config-default/config-lgsm/codwawserver/_default.cfg
+++ b/lgsm/config-default/config-lgsm/codwawserver/_default.cfg
@@ -53,14 +53,6 @@ iftttalert="off"
 ifttttoken="accesstoken"
 iftttevent="linuxgsm_alert"
 
-# Mailgun Email Alerts | https://docs.linuxgsm.com/alerts/mailgun
-mailgunalert="off"
-mailgunapiregion="us"
-mailguntoken="accesstoken"
-mailgundomain="example.com"
-mailgunemailfrom="alert@example.com"
-mailgunemail="email@myemail.com"
-
 # Pushbullet Alerts | https://docs.linuxgsm.com/alerts/pushbullet
 pushbulletalert="off"
 pushbullettoken="accesstoken"
diff --git a/lgsm/config-default/config-lgsm/colserver/_default.cfg b/lgsm/config-default/config-lgsm/colserver/_default.cfg
index 9a88956f7..4d2f04cd2 100644
--- a/lgsm/config-default/config-lgsm/colserver/_default.cfg
+++ b/lgsm/config-default/config-lgsm/colserver/_default.cfg
@@ -48,14 +48,6 @@ iftttalert="off"
 ifttttoken="accesstoken"
 iftttevent="linuxgsm_alert"
 
-# Mailgun Email Alerts | https://docs.linuxgsm.com/alerts/mailgun
-mailgunalert="off"
-mailgunapiregion="us"
-mailguntoken="accesstoken"
-mailgundomain="example.com"
-mailgunemailfrom="alert@example.com"
-mailgunemail="email@myemail.com"
-
 # Pushbullet Alerts | https://docs.linuxgsm.com/alerts/pushbullet
 pushbulletalert="off"
 pushbullettoken="accesstoken"
diff --git a/lgsm/config-default/config-lgsm/csczserver/_default.cfg b/lgsm/config-default/config-lgsm/csczserver/_default.cfg
index c8996acd7..a3f49922b 100644
--- a/lgsm/config-default/config-lgsm/csczserver/_default.cfg
+++ b/lgsm/config-default/config-lgsm/csczserver/_default.cfg
@@ -54,14 +54,6 @@ iftttalert="off"
 ifttttoken="accesstoken"
 iftttevent="linuxgsm_alert"
 
-# Mailgun Email Alerts | https://docs.linuxgsm.com/alerts/mailgun
-mailgunalert="off"
-mailgunapiregion="us"
-mailguntoken="accesstoken"
-mailgundomain="example.com"
-mailgunemailfrom="alert@example.com"
-mailgunemail="email@myemail.com"
-
 # Pushbullet Alerts | https://docs.linuxgsm.com/alerts/pushbullet
 pushbulletalert="off"
 pushbullettoken="accesstoken"
diff --git a/lgsm/config-default/config-lgsm/csgoserver/_default.cfg b/lgsm/config-default/config-lgsm/csgoserver/_default.cfg
index e030a9896..f9d0acf1a 100644
--- a/lgsm/config-default/config-lgsm/csgoserver/_default.cfg
+++ b/lgsm/config-default/config-lgsm/csgoserver/_default.cfg
@@ -91,14 +91,6 @@ iftttalert="off"
 ifttttoken="accesstoken"
 iftttevent="linuxgsm_alert"
 
-# Mailgun Email Alerts | https://docs.linuxgsm.com/alerts/mailgun
-mailgunalert="off"
-mailgunapiregion="us"
-mailguntoken="accesstoken"
-mailgundomain="example.com"
-mailgunemailfrom="alert@example.com"
-mailgunemail="email@myemail.com"
-
 # Pushbullet Alerts | https://docs.linuxgsm.com/alerts/pushbullet
 pushbulletalert="off"
 pushbullettoken="accesstoken"
diff --git a/lgsm/config-default/config-lgsm/csserver/_default.cfg b/lgsm/config-default/config-lgsm/csserver/_default.cfg
index d81af84dc..87a132f3d 100644
--- a/lgsm/config-default/config-lgsm/csserver/_default.cfg
+++ b/lgsm/config-default/config-lgsm/csserver/_default.cfg
@@ -54,14 +54,6 @@ iftttalert="off"
 ifttttoken="accesstoken"
 iftttevent="linuxgsm_alert"
 
-# Mailgun Email Alerts | https://docs.linuxgsm.com/alerts/mailgun
-mailgunalert="off"
-mailgunapiregion="us"
-mailguntoken="accesstoken"
-mailgundomain="example.com"
-mailgunemailfrom="alert@example.com"
-mailgunemail="email@myemail.com"
-
 # Pushbullet Alerts | https://docs.linuxgsm.com/alerts/pushbullet
 pushbulletalert="off"
 pushbullettoken="accesstoken"
diff --git a/lgsm/config-default/config-lgsm/cssserver/_default.cfg b/lgsm/config-default/config-lgsm/cssserver/_default.cfg
index 018842405..612aeb0f1 100644
--- a/lgsm/config-default/config-lgsm/cssserver/_default.cfg
+++ b/lgsm/config-default/config-lgsm/cssserver/_default.cfg
@@ -60,14 +60,6 @@ iftttalert="off"
 ifttttoken="accesstoken"
 iftttevent="linuxgsm_alert"
 
-# Mailgun Email Alerts | https://docs.linuxgsm.com/alerts/mailgun
-mailgunalert="off"
-mailgunapiregion="us"
-mailguntoken="accesstoken"
-mailgundomain="example.com"
-mailgunemailfrom="alert@example.com"
-mailgunemail="email@myemail.com"
-
 # Pushbullet Alerts | https://docs.linuxgsm.com/alerts/pushbullet
 pushbulletalert="off"
 pushbullettoken="accesstoken"
diff --git a/lgsm/config-default/config-lgsm/ctserver/_default.cfg b/lgsm/config-default/config-lgsm/ctserver/_default.cfg
index 205c4e8c2..2c31d5cc6 100644
--- a/lgsm/config-default/config-lgsm/ctserver/_default.cfg
+++ b/lgsm/config-default/config-lgsm/ctserver/_default.cfg
@@ -47,14 +47,6 @@ iftttalert="off"
 ifttttoken="accesstoken"
 iftttevent="linuxgsm_alert"
 
-# Mailgun Email Alerts | https://docs.linuxgsm.com/alerts/mailgun
-mailgunalert="off"
-mailgunapiregion="us"
-mailguntoken="accesstoken"
-mailgundomain="example.com"
-mailgunemailfrom="alert@example.com"
-mailgunemail="email@myemail.com"
-
 # Pushbullet Alerts | https://docs.linuxgsm.com/alerts/pushbullet
 pushbulletalert="off"
 pushbullettoken="accesstoken"
diff --git a/lgsm/config-default/config-lgsm/dabserver/_default.cfg b/lgsm/config-default/config-lgsm/dabserver/_default.cfg
index 002ed2033..84ea667e4 100644
--- a/lgsm/config-default/config-lgsm/dabserver/_default.cfg
+++ b/lgsm/config-default/config-lgsm/dabserver/_default.cfg
@@ -55,14 +55,6 @@ iftttalert="off"
 ifttttoken="accesstoken"
 iftttevent="linuxgsm_alert"
 
-# Mailgun Email Alerts | https://docs.linuxgsm.com/alerts/mailgun
-mailgunalert="off"
-mailgunapiregion="us"
-mailguntoken="accesstoken"
-mailgundomain="example.com"
-mailgunemailfrom="alert@example.com"
-mailgunemail="email@myemail.com"
-
 # Pushbullet Alerts | https://docs.linuxgsm.com/alerts/pushbullet
 pushbulletalert="off"
 pushbullettoken="accesstoken"
diff --git a/lgsm/config-default/config-lgsm/dayzserver/_default.cfg b/lgsm/config-default/config-lgsm/dayzserver/_default.cfg
index 8ec58f069..01eb4509e 100644
--- a/lgsm/config-default/config-lgsm/dayzserver/_default.cfg
+++ b/lgsm/config-default/config-lgsm/dayzserver/_default.cfg
@@ -66,14 +66,6 @@ iftttalert="off"
 ifttttoken="accesstoken"
 iftttevent="linuxgsm_alert"
 
-# Mailgun Email Alerts | https://docs.linuxgsm.com/alerts/mailgun
-mailgunalert="off"
-mailgunapiregion="us"
-mailguntoken="accesstoken"
-mailgundomain="example.com"
-mailgunemailfrom="alert@example.com"
-mailgunemail="email@myemail.com"
-
 # Pushbullet Alerts | https://docs.linuxgsm.com/alerts/pushbullet
 pushbulletalert="off"
 pushbullettoken="accesstoken"
diff --git a/lgsm/config-default/config-lgsm/dmcserver/_default.cfg b/lgsm/config-default/config-lgsm/dmcserver/_default.cfg
index 5ea5c1352..f46fe5025 100644
--- a/lgsm/config-default/config-lgsm/dmcserver/_default.cfg
+++ b/lgsm/config-default/config-lgsm/dmcserver/_default.cfg
@@ -54,14 +54,6 @@ iftttalert="off"
 ifttttoken="accesstoken"
 iftttevent="linuxgsm_alert"
 
-# Mailgun Email Alerts | https://docs.linuxgsm.com/alerts/mailgun
-mailgunalert="off"
-mailgunapiregion="us"
-mailguntoken="accesstoken"
-mailgundomain="example.com"
-mailgunemailfrom="alert@example.com"
-mailgunemail="email@myemail.com"
-
 # Pushbullet Alerts | https://docs.linuxgsm.com/alerts/pushbullet
 pushbulletalert="off"
 pushbullettoken="accesstoken"
diff --git a/lgsm/config-default/config-lgsm/dodrserver/_default.cfg b/lgsm/config-default/config-lgsm/dodrserver/_default.cfg
index cae228a0c..d692fdfa7 100644
--- a/lgsm/config-default/config-lgsm/dodrserver/_default.cfg
+++ b/lgsm/config-default/config-lgsm/dodrserver/_default.cfg
@@ -53,14 +53,6 @@ iftttalert="off"
 ifttttoken="accesstoken"
 iftttevent="linuxgsm_alert"
 
-# Mailgun Email Alerts | https://docs.linuxgsm.com/alerts/mailgun
-mailgunalert="off"
-mailgunapiregion="us"
-mailguntoken="accesstoken"
-mailgundomain="example.com"
-mailgunemailfrom="alert@example.com"
-mailgunemail="email@myemail.com"
-
 # Pushbullet Alerts | https://docs.linuxgsm.com/alerts/pushbullet
 pushbulletalert="off"
 pushbullettoken="accesstoken"
diff --git a/lgsm/config-default/config-lgsm/dodserver/_default.cfg b/lgsm/config-default/config-lgsm/dodserver/_default.cfg
index 7bd86724b..b2940a658 100644
--- a/lgsm/config-default/config-lgsm/dodserver/_default.cfg
+++ b/lgsm/config-default/config-lgsm/dodserver/_default.cfg
@@ -54,14 +54,6 @@ iftttalert="off"
 ifttttoken="accesstoken"
 iftttevent="linuxgsm_alert"
 
-# Mailgun Email Alerts | https://docs.linuxgsm.com/alerts/mailgun
-mailgunalert="off"
-mailgunapiregion="us"
-mailguntoken="accesstoken"
-mailgundomain="example.com"
-mailgunemailfrom="alert@example.com"
-mailgunemail="email@myemail.com"
-
 # Pushbullet Alerts | https://docs.linuxgsm.com/alerts/pushbullet
 pushbulletalert="off"
 pushbullettoken="accesstoken"
diff --git a/lgsm/config-default/config-lgsm/dodsserver/_default.cfg b/lgsm/config-default/config-lgsm/dodsserver/_default.cfg
index af4a32dc2..9ff0cfa96 100644
--- a/lgsm/config-default/config-lgsm/dodsserver/_default.cfg
+++ b/lgsm/config-default/config-lgsm/dodsserver/_default.cfg
@@ -55,14 +55,6 @@ iftttalert="off"
 ifttttoken="accesstoken"
 iftttevent="linuxgsm_alert"
 
-# Mailgun Email Alerts | https://docs.linuxgsm.com/alerts/mailgun
-mailgunalert="off"
-mailgunapiregion="us"
-mailguntoken="accesstoken"
-mailgundomain="example.com"
-mailgunemailfrom="alert@example.com"
-mailgunemail="email@myemail.com"
-
 # Pushbullet Alerts | https://docs.linuxgsm.com/alerts/pushbullet
 pushbulletalert="off"
 pushbullettoken="accesstoken"
diff --git a/lgsm/config-default/config-lgsm/doiserver/_default.cfg b/lgsm/config-default/config-lgsm/doiserver/_default.cfg
index 1c99abaa7..1580d58b2 100644
--- a/lgsm/config-default/config-lgsm/doiserver/_default.cfg
+++ b/lgsm/config-default/config-lgsm/doiserver/_default.cfg
@@ -56,14 +56,6 @@ iftttalert="off"
 ifttttoken="accesstoken"
 iftttevent="linuxgsm_alert"
 
-# Mailgun Email Alerts | https://docs.linuxgsm.com/alerts/mailgun
-mailgunalert="off"
-mailgunapiregion="us"
-mailguntoken="accesstoken"
-mailgundomain="example.com"
-mailgunemailfrom="alert@example.com"
-mailgunemail="email@myemail.com"
-
 # Pushbullet Alerts | https://docs.linuxgsm.com/alerts/pushbullet
 pushbulletalert="off"
 pushbullettoken="accesstoken"
diff --git a/lgsm/config-default/config-lgsm/dstserver/_default.cfg b/lgsm/config-default/config-lgsm/dstserver/_default.cfg
index 706327460..8b404391d 100644
--- a/lgsm/config-default/config-lgsm/dstserver/_default.cfg
+++ b/lgsm/config-default/config-lgsm/dstserver/_default.cfg
@@ -58,14 +58,6 @@ iftttalert="off"
 ifttttoken="accesstoken"
 iftttevent="linuxgsm_alert"
 
-# Mailgun Email Alerts | https://docs.linuxgsm.com/alerts/mailgun
-mailgunalert="off"
-mailgunapiregion="us"
-mailguntoken="accesstoken"
-mailgundomain="example.com"
-mailgunemailfrom="alert@example.com"
-mailgunemail="email@myemail.com"
-
 # Pushbullet Alerts | https://docs.linuxgsm.com/alerts/pushbullet
 pushbulletalert="off"
 pushbullettoken="accesstoken"
diff --git a/lgsm/config-default/config-lgsm/dysserver/_default.cfg b/lgsm/config-default/config-lgsm/dysserver/_default.cfg
index 96d12d677..907482a36 100644
--- a/lgsm/config-default/config-lgsm/dysserver/_default.cfg
+++ b/lgsm/config-default/config-lgsm/dysserver/_default.cfg
@@ -60,14 +60,6 @@ iftttalert="off"
 ifttttoken="accesstoken"
 iftttevent="linuxgsm_alert"
 
-# Mailgun Email Alerts | https://docs.linuxgsm.com/alerts/mailgun
-mailgunalert="off"
-mailgunapiregion="us"
-mailguntoken="accesstoken"
-mailgundomain="example.com"
-mailgunemailfrom="alert@example.com"
-mailgunemail="email@myemail.com"
-
 # Pushbullet Alerts | https://docs.linuxgsm.com/alerts/pushbullet
 pushbulletalert="off"
 pushbullettoken="accesstoken"
diff --git a/lgsm/config-default/config-lgsm/ecoserver/_default.cfg b/lgsm/config-default/config-lgsm/ecoserver/_default.cfg
index 475edb4ba..ae4bfa681 100644
--- a/lgsm/config-default/config-lgsm/ecoserver/_default.cfg
+++ b/lgsm/config-default/config-lgsm/ecoserver/_default.cfg
@@ -47,14 +47,6 @@ iftttalert="off"
 ifttttoken="accesstoken"
 iftttevent="linuxgsm_alert"
 
-# Mailgun Email Alerts | https://docs.linuxgsm.com/alerts/mailgun
-mailgunalert="off"
-mailgunapiregion="us"
-mailguntoken="accesstoken"
-mailgundomain="example.com"
-mailgunemailfrom="alert@example.com"
-mailgunemail="email@myemail.com"
-
 # Pushbullet Alerts | https://docs.linuxgsm.com/alerts/pushbullet
 pushbulletalert="off"
 pushbullettoken="accesstoken"
diff --git a/lgsm/config-default/config-lgsm/emserver/_default.cfg b/lgsm/config-default/config-lgsm/emserver/_default.cfg
index 8f935152f..33fb4f849 100644
--- a/lgsm/config-default/config-lgsm/emserver/_default.cfg
+++ b/lgsm/config-default/config-lgsm/emserver/_default.cfg
@@ -60,14 +60,6 @@ iftttalert="off"
 ifttttoken="accesstoken"
 iftttevent="linuxgsm_alert"
 
-# Mailgun Email Alerts | https://docs.linuxgsm.com/alerts/mailgun
-mailgunalert="off"
-mailgunapiregion="us"
-mailguntoken="accesstoken"
-mailgundomain="example.com"
-mailgunemailfrom="alert@example.com"
-mailgunemail="email@myemail.com"
-
 # Pushbullet Alerts | https://docs.linuxgsm.com/alerts/pushbullet
 pushbulletalert="off"
 pushbullettoken="accesstoken"
diff --git a/lgsm/config-default/config-lgsm/etlserver/_default.cfg b/lgsm/config-default/config-lgsm/etlserver/_default.cfg
index c0c97cd2a..034f29c5d 100644
--- a/lgsm/config-default/config-lgsm/etlserver/_default.cfg
+++ b/lgsm/config-default/config-lgsm/etlserver/_default.cfg
@@ -47,14 +47,6 @@ iftttalert="off"
 ifttttoken="accesstoken"
 iftttevent="linuxgsm_alert"
 
-# Mailgun Email Alerts | https://docs.linuxgsm.com/alerts/mailgun
-mailgunalert="off"
-mailgunapiregion="us"
-mailguntoken="accesstoken"
-mailgundomain="example.com"
-mailgunemailfrom="alert@example.com"
-mailgunemail="email@myemail.com"
-
 # Pushbullet Alerts | https://docs.linuxgsm.com/alerts/pushbullet
 pushbulletalert="off"
 pushbullettoken="accesstoken"
diff --git a/lgsm/config-default/config-lgsm/ets2server/_default.cfg b/lgsm/config-default/config-lgsm/ets2server/_default.cfg
index a18d6ca79..215ab2b41 100644
--- a/lgsm/config-default/config-lgsm/ets2server/_default.cfg
+++ b/lgsm/config-default/config-lgsm/ets2server/_default.cfg
@@ -47,14 +47,6 @@ iftttalert="off"
 ifttttoken="accesstoken"
 iftttevent="linuxgsm_alert"
 
-# Mailgun Email Alerts | https://docs.linuxgsm.com/alerts/mailgun
-mailgunalert="off"
-mailgunapiregion="us"
-mailguntoken="accesstoken"
-mailgundomain="example.com"
-mailgunemailfrom="alert@example.com"
-mailgunemail="email@myemail.com"
-
 # Pushbullet Alerts | https://docs.linuxgsm.com/alerts/pushbullet
 pushbulletalert="off"
 pushbullettoken="accesstoken"
diff --git a/lgsm/config-default/config-lgsm/fctrserver/_default.cfg b/lgsm/config-default/config-lgsm/fctrserver/_default.cfg
index d35c36050..6b03f9a30 100644
--- a/lgsm/config-default/config-lgsm/fctrserver/_default.cfg
+++ b/lgsm/config-default/config-lgsm/fctrserver/_default.cfg
@@ -54,14 +54,6 @@ iftttalert="off"
 ifttttoken="accesstoken"
 iftttevent="linuxgsm_alert"
 
-# Mailgun Email Alerts | https://docs.linuxgsm.com/alerts/mailgun
-mailgunalert="off"
-mailgunapiregion="us"
-mailguntoken="accesstoken"
-mailgundomain="example.com"
-mailgunemailfrom="alert@example.com"
-mailgunemail="email@myemail.com"
-
 # Pushbullet Alerts | https://docs.linuxgsm.com/alerts/pushbullet
 pushbulletalert="off"
 pushbullettoken="accesstoken"
diff --git a/lgsm/config-default/config-lgsm/fofserver/_default.cfg b/lgsm/config-default/config-lgsm/fofserver/_default.cfg
index f85822d30..41dae637a 100644
--- a/lgsm/config-default/config-lgsm/fofserver/_default.cfg
+++ b/lgsm/config-default/config-lgsm/fofserver/_default.cfg
@@ -55,14 +55,6 @@ iftttalert="off"
 ifttttoken="accesstoken"
 iftttevent="linuxgsm_alert"
 
-# Mailgun Email Alerts | https://docs.linuxgsm.com/alerts/mailgun
-mailgunalert="off"
-mailgunapiregion="us"
-mailguntoken="accesstoken"
-mailgundomain="example.com"
-mailgunemailfrom="alert@example.com"
-mailgunemail="email@myemail.com"
-
 # Pushbullet Alerts | https://docs.linuxgsm.com/alerts/pushbullet
 pushbulletalert="off"
 pushbullettoken="accesstoken"
diff --git a/lgsm/config-default/config-lgsm/gmodserver/_default.cfg b/lgsm/config-default/config-lgsm/gmodserver/_default.cfg
index 31a6ceedf..b170c3436 100644
--- a/lgsm/config-default/config-lgsm/gmodserver/_default.cfg
+++ b/lgsm/config-default/config-lgsm/gmodserver/_default.cfg
@@ -67,14 +67,6 @@ iftttalert="off"
 ifttttoken="accesstoken"
 iftttevent="linuxgsm_alert"
 
-# Mailgun Email Alerts | https://docs.linuxgsm.com/alerts/mailgun
-mailgunalert="off"
-mailgunapiregion="us"
-mailguntoken="accesstoken"
-mailgundomain="example.com"
-mailgunemailfrom="alert@example.com"
-mailgunemail="email@myemail.com"
-
 # Pushbullet Alerts | https://docs.linuxgsm.com/alerts/pushbullet
 pushbulletalert="off"
 pushbullettoken="accesstoken"
diff --git a/lgsm/config-default/config-lgsm/hcuserver/_default.cfg b/lgsm/config-default/config-lgsm/hcuserver/_default.cfg
index b53af15d3..00b0b30c7 100644
--- a/lgsm/config-default/config-lgsm/hcuserver/_default.cfg
+++ b/lgsm/config-default/config-lgsm/hcuserver/_default.cfg
@@ -62,14 +62,6 @@ iftttalert="off"
 ifttttoken="accesstoken"
 iftttevent="linuxgsm_alert"
 
-# Mailgun Email Alerts | https://docs.linuxgsm.com/alerts/mailgun
-mailgunalert="off"
-mailgunapiregion="us"
-mailguntoken="accesstoken"
-mailgundomain="example.com"
-mailgunemailfrom="alert@example.com"
-mailgunemail="email@myemail.com"
-
 # Pushbullet Alerts | https://docs.linuxgsm.com/alerts/pushbullet
 pushbulletalert="off"
 pushbullettoken="accesstoken"
diff --git a/lgsm/config-default/config-lgsm/hl2dmserver/_default.cfg b/lgsm/config-default/config-lgsm/hl2dmserver/_default.cfg
index 74a75fc21..8bbf8fdec 100644
--- a/lgsm/config-default/config-lgsm/hl2dmserver/_default.cfg
+++ b/lgsm/config-default/config-lgsm/hl2dmserver/_default.cfg
@@ -55,14 +55,6 @@ iftttalert="off"
 ifttttoken="accesstoken"
 iftttevent="linuxgsm_alert"
 
-# Mailgun Email Alerts | https://docs.linuxgsm.com/alerts/mailgun
-mailgunalert="off"
-mailgunapiregion="us"
-mailguntoken="accesstoken"
-mailgundomain="example.com"
-mailgunemailfrom="alert@example.com"
-mailgunemail="email@myemail.com"
-
 # Pushbullet Alerts | https://docs.linuxgsm.com/alerts/pushbullet
 pushbulletalert="off"
 pushbullettoken="accesstoken"
diff --git a/lgsm/config-default/config-lgsm/hldmserver/_default.cfg b/lgsm/config-default/config-lgsm/hldmserver/_default.cfg
index c94297f1f..f78e1542b 100644
--- a/lgsm/config-default/config-lgsm/hldmserver/_default.cfg
+++ b/lgsm/config-default/config-lgsm/hldmserver/_default.cfg
@@ -54,14 +54,6 @@ iftttalert="off"
 ifttttoken="accesstoken"
 iftttevent="linuxgsm_alert"
 
-# Mailgun Email Alerts | https://docs.linuxgsm.com/alerts/mailgun
-mailgunalert="off"
-mailgunapiregion="us"
-mailguntoken="accesstoken"
-mailgundomain="example.com"
-mailgunemailfrom="alert@example.com"
-mailgunemail="email@myemail.com"
-
 # Pushbullet Alerts | https://docs.linuxgsm.com/alerts/pushbullet
 pushbulletalert="off"
 pushbullettoken="accesstoken"
diff --git a/lgsm/config-default/config-lgsm/hldmsserver/_default.cfg b/lgsm/config-default/config-lgsm/hldmsserver/_default.cfg
index 32d5fe791..fd854b0c2 100644
--- a/lgsm/config-default/config-lgsm/hldmsserver/_default.cfg
+++ b/lgsm/config-default/config-lgsm/hldmsserver/_default.cfg
@@ -55,14 +55,6 @@ iftttalert="off"
 ifttttoken="accesstoken"
 iftttevent="linuxgsm_alert"
 
-# Mailgun Email Alerts | https://docs.linuxgsm.com/alerts/mailgun
-mailgunalert="off"
-mailgunapiregion="us"
-mailguntoken="accesstoken"
-mailgundomain="example.com"
-mailgunemailfrom="alert@example.com"
-mailgunemail="email@myemail.com"
-
 # Pushbullet Alerts | https://docs.linuxgsm.com/alerts/pushbullet
 pushbulletalert="off"
 pushbullettoken="accesstoken"
diff --git a/lgsm/config-default/config-lgsm/hwserver/_default.cfg b/lgsm/config-default/config-lgsm/hwserver/_default.cfg
index 923865478..99b08e358 100644
--- a/lgsm/config-default/config-lgsm/hwserver/_default.cfg
+++ b/lgsm/config-default/config-lgsm/hwserver/_default.cfg
@@ -65,14 +65,6 @@ iftttalert="off"
 ifttttoken="accesstoken"
 iftttevent="linuxgsm_alert"
 
-# Mailgun Email Alerts | https://docs.linuxgsm.com/alerts/mailgun
-mailgunalert="off"
-mailgunapiregion="us"
-mailguntoken="accesstoken"
-mailgundomain="example.com"
-mailgunemailfrom="alert@example.com"
-mailgunemail="email@myemail.com"
-
 # Pushbullet Alerts | https://docs.linuxgsm.com/alerts/pushbullet
 pushbulletalert="off"
 pushbullettoken="accesstoken"
diff --git a/lgsm/config-default/config-lgsm/insserver/_default.cfg b/lgsm/config-default/config-lgsm/insserver/_default.cfg
index 8b6b599f3..69d095881 100644
--- a/lgsm/config-default/config-lgsm/insserver/_default.cfg
+++ b/lgsm/config-default/config-lgsm/insserver/_default.cfg
@@ -61,14 +61,6 @@ iftttalert="off"
 ifttttoken="accesstoken"
 iftttevent="linuxgsm_alert"
 
-# Mailgun Email Alerts | https://docs.linuxgsm.com/alerts/mailgun
-mailgunalert="off"
-mailgunapiregion="us"
-mailguntoken="accesstoken"
-mailgundomain="example.com"
-mailgunemailfrom="alert@example.com"
-mailgunemail="email@myemail.com"
-
 # Pushbullet Alerts | https://docs.linuxgsm.com/alerts/pushbullet
 pushbulletalert="off"
 pushbullettoken="accesstoken"
diff --git a/lgsm/config-default/config-lgsm/inssserver/_default.cfg b/lgsm/config-default/config-lgsm/inssserver/_default.cfg
index 076b61ecb..6a7313c7b 100644
--- a/lgsm/config-default/config-lgsm/inssserver/_default.cfg
+++ b/lgsm/config-default/config-lgsm/inssserver/_default.cfg
@@ -64,14 +64,6 @@ iftttalert="off"
 ifttttoken="accesstoken"
 iftttevent="linuxgsm_alert"
 
-# Mailgun Email Alerts | https://docs.linuxgsm.com/alerts/mailgun
-mailgunalert="off"
-mailgunapiregion="us"
-mailguntoken="accesstoken"
-mailgundomain="example.com"
-mailgunemailfrom="alert@example.com"
-mailgunemail="email@myemail.com"
-
 # Pushbullet Alerts | https://docs.linuxgsm.com/alerts/pushbullet
 pushbulletalert="off"
 pushbullettoken="accesstoken"
diff --git a/lgsm/config-default/config-lgsm/iosserver/_default.cfg b/lgsm/config-default/config-lgsm/iosserver/_default.cfg
index 48c5511c7..365a3dee2 100644
--- a/lgsm/config-default/config-lgsm/iosserver/_default.cfg
+++ b/lgsm/config-default/config-lgsm/iosserver/_default.cfg
@@ -55,14 +55,6 @@ iftttalert="off"
 ifttttoken="accesstoken"
 iftttevent="linuxgsm_alert"
 
-# Mailgun Email Alerts | https://docs.linuxgsm.com/alerts/mailgun
-mailgunalert="off"
-mailgunapiregion="us"
-mailguntoken="accesstoken"
-mailgundomain="example.com"
-mailgunemailfrom="alert@example.com"
-mailgunemail="email@myemail.com"
-
 # Pushbullet Alerts | https://docs.linuxgsm.com/alerts/pushbullet
 pushbulletalert="off"
 pushbullettoken="accesstoken"
diff --git a/lgsm/config-default/config-lgsm/jc2server/_default.cfg b/lgsm/config-default/config-lgsm/jc2server/_default.cfg
index 0610507d6..69bc8018b 100644
--- a/lgsm/config-default/config-lgsm/jc2server/_default.cfg
+++ b/lgsm/config-default/config-lgsm/jc2server/_default.cfg
@@ -47,14 +47,6 @@ iftttalert="off"
 ifttttoken="accesstoken"
 iftttevent="linuxgsm_alert"
 
-# Mailgun Email Alerts | https://docs.linuxgsm.com/alerts/mailgun
-mailgunalert="off"
-mailgunapiregion="us"
-mailguntoken="accesstoken"
-mailgundomain="example.com"
-mailgunemailfrom="alert@example.com"
-mailgunemail="email@myemail.com"
-
 # Pushbullet Alerts | https://docs.linuxgsm.com/alerts/pushbullet
 pushbulletalert="off"
 pushbullettoken="accesstoken"
diff --git a/lgsm/config-default/config-lgsm/jc3server/_default.cfg b/lgsm/config-default/config-lgsm/jc3server/_default.cfg
index c2cac1cfe..872541961 100644
--- a/lgsm/config-default/config-lgsm/jc3server/_default.cfg
+++ b/lgsm/config-default/config-lgsm/jc3server/_default.cfg
@@ -47,14 +47,6 @@ iftttalert="off"
 ifttttoken="accesstoken"
 iftttevent="linuxgsm_alert"
 
-# Mailgun Email Alerts | https://docs.linuxgsm.com/alerts/mailgun
-mailgunalert="off"
-mailgunapiregion="us"
-mailguntoken="accesstoken"
-mailgundomain="example.com"
-mailgunemailfrom="alert@example.com"
-mailgunemail="email@myemail.com"
-
 # Pushbullet Alerts | https://docs.linuxgsm.com/alerts/pushbullet
 pushbulletalert="off"
 pushbullettoken="accesstoken"
diff --git a/lgsm/config-default/config-lgsm/jk2server/_default.cfg b/lgsm/config-default/config-lgsm/jk2server/_default.cfg
index 5b7f6b893..4313daa58 100644
--- a/lgsm/config-default/config-lgsm/jk2server/_default.cfg
+++ b/lgsm/config-default/config-lgsm/jk2server/_default.cfg
@@ -56,14 +56,6 @@ iftttalert="off"
 ifttttoken="accesstoken"
 iftttevent="linuxgsm_alert"
 
-# Mailgun Email Alerts | https://docs.linuxgsm.com/alerts/mailgun
-mailgunalert="off"
-mailgunapiregion="us"
-mailguntoken="accesstoken"
-mailgundomain="example.com"
-mailgunemailfrom="alert@example.com"
-mailgunemail="email@myemail.com"
-
 # Pushbullet Alerts | https://docs.linuxgsm.com/alerts/pushbullet
 pushbulletalert="off"
 pushbullettoken="accesstoken"
diff --git a/lgsm/config-default/config-lgsm/kf2server/_default.cfg b/lgsm/config-default/config-lgsm/kf2server/_default.cfg
index 6d71d6351..88fe360be 100644
--- a/lgsm/config-default/config-lgsm/kf2server/_default.cfg
+++ b/lgsm/config-default/config-lgsm/kf2server/_default.cfg
@@ -53,14 +53,6 @@ iftttalert="off"
 ifttttoken="accesstoken"
 iftttevent="linuxgsm_alert"
 
-# Mailgun Email Alerts | https://docs.linuxgsm.com/alerts/mailgun
-mailgunalert="off"
-mailgunapiregion="us"
-mailguntoken="accesstoken"
-mailgundomain="example.com"
-mailgunemailfrom="alert@example.com"
-mailgunemail="email@myemail.com"
-
 # Pushbullet Alerts | https://docs.linuxgsm.com/alerts/pushbullet
 pushbulletalert="off"
 pushbullettoken="accesstoken"
diff --git a/lgsm/config-default/config-lgsm/kfserver/_default.cfg b/lgsm/config-default/config-lgsm/kfserver/_default.cfg
index 362dfa54f..92cfd258c 100644
--- a/lgsm/config-default/config-lgsm/kfserver/_default.cfg
+++ b/lgsm/config-default/config-lgsm/kfserver/_default.cfg
@@ -59,14 +59,6 @@ iftttalert="off"
 ifttttoken="accesstoken"
 iftttevent="linuxgsm_alert"
 
-# Mailgun Email Alerts | https://docs.linuxgsm.com/alerts/mailgun
-mailgunalert="off"
-mailgunapiregion="us"
-mailguntoken="accesstoken"
-mailgundomain="example.com"
-mailgunemailfrom="alert@example.com"
-mailgunemail="email@myemail.com"
-
 # Pushbullet Alerts | https://docs.linuxgsm.com/alerts/pushbullet
 pushbulletalert="off"
 pushbullettoken="accesstoken"
diff --git a/lgsm/config-default/config-lgsm/l4d2server/_default.cfg b/lgsm/config-default/config-lgsm/l4d2server/_default.cfg
index 4a04cac2c..96c2cc5bc 100644
--- a/lgsm/config-default/config-lgsm/l4d2server/_default.cfg
+++ b/lgsm/config-default/config-lgsm/l4d2server/_default.cfg
@@ -54,14 +54,6 @@ iftttalert="off"
 ifttttoken="accesstoken"
 iftttevent="linuxgsm_alert"
 
-# Mailgun Email Alerts | https://docs.linuxgsm.com/alerts/mailgun
-mailgunalert="off"
-mailgunapiregion="us"
-mailguntoken="accesstoken"
-mailgundomain="example.com"
-mailgunemailfrom="alert@example.com"
-mailgunemail="email@myemail.com"
-
 # Pushbullet Alerts | https://docs.linuxgsm.com/alerts/pushbullet
 pushbulletalert="off"
 pushbullettoken="accesstoken"
diff --git a/lgsm/config-default/config-lgsm/l4dserver/_default.cfg b/lgsm/config-default/config-lgsm/l4dserver/_default.cfg
index 9447b2823..2b5a64be6 100644
--- a/lgsm/config-default/config-lgsm/l4dserver/_default.cfg
+++ b/lgsm/config-default/config-lgsm/l4dserver/_default.cfg
@@ -54,14 +54,6 @@ iftttalert="off"
 ifttttoken="accesstoken"
 iftttevent="linuxgsm_alert"
 
-# Mailgun Email Alerts | https://docs.linuxgsm.com/alerts/mailgun
-mailgunalert="off"
-mailgunapiregion="us"
-mailguntoken="accesstoken"
-mailgundomain="example.com"
-mailgunemailfrom="alert@example.com"
-mailgunemail="email@myemail.com"
-
 # Pushbullet Alerts | https://docs.linuxgsm.com/alerts/pushbullet
 pushbulletalert="off"
 pushbullettoken="accesstoken"
diff --git a/lgsm/config-default/config-lgsm/loserver/_default.cfg b/lgsm/config-default/config-lgsm/loserver/_default.cfg
index 7df8a8f3d..5a205d88f 100644
--- a/lgsm/config-default/config-lgsm/loserver/_default.cfg
+++ b/lgsm/config-default/config-lgsm/loserver/_default.cfg
@@ -58,14 +58,6 @@ iftttalert="off"
 ifttttoken="accesstoken"
 iftttevent="linuxgsm_alert"
 
-# Mailgun Email Alerts | https://docs.linuxgsm.com/alerts/mailgun
-mailgunalert="off"
-mailgunapiregion="us"
-mailguntoken="accesstoken"
-mailgundomain="example.com"
-mailgunemailfrom="alert@example.com"
-mailgunemail="email@myemail.com"
-
 # Pushbullet Alerts | https://docs.linuxgsm.com/alerts/pushbullet
 pushbulletalert="off"
 pushbullettoken="accesstoken"
diff --git a/lgsm/config-default/config-lgsm/mcbserver/_default.cfg b/lgsm/config-default/config-lgsm/mcbserver/_default.cfg
index 8ffc45667..c4d9d5455 100644
--- a/lgsm/config-default/config-lgsm/mcbserver/_default.cfg
+++ b/lgsm/config-default/config-lgsm/mcbserver/_default.cfg
@@ -50,14 +50,6 @@ iftttalert="off"
 ifttttoken="accesstoken"
 iftttevent="linuxgsm_alert"
 
-# Mailgun Email Alerts | https://docs.linuxgsm.com/alerts/mailgun
-mailgunalert="off"
-mailgunapiregion="us"
-mailguntoken="accesstoken"
-mailgundomain="example.com"
-mailgunemailfrom="alert@example.com"
-mailgunemail="email@myemail.com"
-
 # Pushbullet Alerts | https://docs.linuxgsm.com/alerts/pushbullet
 pushbulletalert="off"
 pushbullettoken="accesstoken"
diff --git a/lgsm/config-default/config-lgsm/mcserver/_default.cfg b/lgsm/config-default/config-lgsm/mcserver/_default.cfg
index 269e96f8b..cd2a80849 100644
--- a/lgsm/config-default/config-lgsm/mcserver/_default.cfg
+++ b/lgsm/config-default/config-lgsm/mcserver/_default.cfg
@@ -56,14 +56,6 @@ iftttalert="off"
 ifttttoken="accesstoken"
 iftttevent="linuxgsm_alert"
 
-# Mailgun Email Alerts | https://docs.linuxgsm.com/alerts/mailgun
-mailgunalert="off"
-mailgunapiregion="us"
-mailguntoken="accesstoken"
-mailgundomain="example.com"
-mailgunemailfrom="alert@example.com"
-mailgunemail="email@myemail.com"
-
 # Pushbullet Alerts | https://docs.linuxgsm.com/alerts/pushbullet
 pushbulletalert="off"
 pushbullettoken="accesstoken"
diff --git a/lgsm/config-default/config-lgsm/mhserver/_default.cfg b/lgsm/config-default/config-lgsm/mhserver/_default.cfg
index 8a9b2331e..4be0fab64 100644
--- a/lgsm/config-default/config-lgsm/mhserver/_default.cfg
+++ b/lgsm/config-default/config-lgsm/mhserver/_default.cfg
@@ -55,14 +55,6 @@ iftttalert="off"
 ifttttoken="accesstoken"
 iftttevent="linuxgsm_alert"
 
-# Mailgun Email Alerts | https://docs.linuxgsm.com/alerts/mailgun
-mailgunalert="off"
-mailgunapiregion="us"
-mailguntoken="accesstoken"
-mailgundomain="example.com"
-mailgunemailfrom="alert@example.com"
-mailgunemail="email@myemail.com"
-
 # Pushbullet Alerts | https://docs.linuxgsm.com/alerts/pushbullet
 pushbulletalert="off"
 pushbullettoken="accesstoken"
diff --git a/lgsm/config-default/config-lgsm/mohaaserver/_default.cfg b/lgsm/config-default/config-lgsm/mohaaserver/_default.cfg
index 490767e4a..cbfbcfb92 100644
--- a/lgsm/config-default/config-lgsm/mohaaserver/_default.cfg
+++ b/lgsm/config-default/config-lgsm/mohaaserver/_default.cfg
@@ -52,14 +52,6 @@ iftttalert="off"
 ifttttoken="accesstoken"
 iftttevent="linuxgsm_alert"
 
-# Mailgun Email Alerts | https://docs.linuxgsm.com/alerts/mailgun
-mailgunalert="off"
-mailgunapiregion="us"
-mailguntoken="accesstoken"
-mailgundomain="example.com"
-mailgunemailfrom="alert@example.com"
-mailgunemail="email@myemail.com"
-
 # Pushbullet Alerts | https://docs.linuxgsm.com/alerts/pushbullet
 pushbulletalert="off"
 pushbullettoken="accesstoken"
diff --git a/lgsm/config-default/config-lgsm/momserver/_default.cfg b/lgsm/config-default/config-lgsm/momserver/_default.cfg
index 3219ae662..670e7b3a7 100644
--- a/lgsm/config-default/config-lgsm/momserver/_default.cfg
+++ b/lgsm/config-default/config-lgsm/momserver/_default.cfg
@@ -52,14 +52,6 @@ iftttalert="off"
 ifttttoken="accesstoken"
 iftttevent="linuxgsm_alert"
 
-# Mailgun Email Alerts | https://docs.linuxgsm.com/alerts/mailgun
-mailgunalert="off"
-mailgunapiregion="us"
-mailguntoken="accesstoken"
-mailgundomain="example.com"
-mailgunemailfrom="alert@example.com"
-mailgunemail="email@myemail.com"
-
 # Pushbullet Alerts | https://docs.linuxgsm.com/alerts/pushbullet
 pushbulletalert="off"
 pushbullettoken="accesstoken"
diff --git a/lgsm/config-default/config-lgsm/mtaserver/_default.cfg b/lgsm/config-default/config-lgsm/mtaserver/_default.cfg
index 5ab7c3283..8397146b8 100644
--- a/lgsm/config-default/config-lgsm/mtaserver/_default.cfg
+++ b/lgsm/config-default/config-lgsm/mtaserver/_default.cfg
@@ -51,14 +51,6 @@ iftttalert="off"
 ifttttoken="accesstoken"
 iftttevent="linuxgsm_alert"
 
-# Mailgun Email Alerts | https://docs.linuxgsm.com/alerts/mailgun
-mailgunalert="off"
-mailgunapiregion="us"
-mailguntoken="accesstoken"
-mailgundomain="example.com"
-mailgunemailfrom="alert@example.com"
-mailgunemail="email@myemail.com"
-
 # Pushbullet Alerts | https://docs.linuxgsm.com/alerts/pushbullet
 pushbulletalert="off"
 pushbullettoken="accesstoken"
diff --git a/lgsm/config-default/config-lgsm/ndserver/_default.cfg b/lgsm/config-default/config-lgsm/ndserver/_default.cfg
index 30ee62109..de3a3aaec 100644
--- a/lgsm/config-default/config-lgsm/ndserver/_default.cfg
+++ b/lgsm/config-default/config-lgsm/ndserver/_default.cfg
@@ -55,14 +55,6 @@ iftttalert="off"
 ifttttoken="accesstoken"
 iftttevent="linuxgsm_alert"
 
-# Mailgun Email Alerts | https://docs.linuxgsm.com/alerts/mailgun
-mailgunalert="off"
-mailgunapiregion="us"
-mailguntoken="accesstoken"
-mailgundomain="example.com"
-mailgunemailfrom="alert@example.com"
-mailgunemail="email@myemail.com"
-
 # Pushbullet Alerts | https://docs.linuxgsm.com/alerts/pushbullet
 pushbulletalert="off"
 pushbullettoken="accesstoken"
diff --git a/lgsm/config-default/config-lgsm/necserver/_default.cfg b/lgsm/config-default/config-lgsm/necserver/_default.cfg
index 30290acb5..4857107c8 100644
--- a/lgsm/config-default/config-lgsm/necserver/_default.cfg
+++ b/lgsm/config-default/config-lgsm/necserver/_default.cfg
@@ -50,14 +50,6 @@ iftttalert="off"
 ifttttoken="accesstoken"
 iftttevent="linuxgsm_alert"
 
-# Mailgun Email Alerts | https://docs.linuxgsm.com/alerts/mailgun
-mailgunalert="off"
-mailgunapiregion="us"
-mailguntoken="accesstoken"
-mailgundomain="example.com"
-mailgunemailfrom="alert@example.com"
-mailgunemail="email@myemail.com"
-
 # Pushbullet Alerts | https://docs.linuxgsm.com/alerts/pushbullet
 pushbulletalert="off"
 pushbullettoken="accesstoken"
diff --git a/lgsm/config-default/config-lgsm/nmrihserver/_default.cfg b/lgsm/config-default/config-lgsm/nmrihserver/_default.cfg
index d3dfa30d3..e3b56f545 100644
--- a/lgsm/config-default/config-lgsm/nmrihserver/_default.cfg
+++ b/lgsm/config-default/config-lgsm/nmrihserver/_default.cfg
@@ -60,14 +60,6 @@ iftttalert="off"
 ifttttoken="accesstoken"
 iftttevent="linuxgsm_alert"
 
-# Mailgun Email Alerts | https://docs.linuxgsm.com/alerts/mailgun
-mailgunalert="off"
-mailgunapiregion="us"
-mailguntoken="accesstoken"
-mailgundomain="example.com"
-mailgunemailfrom="alert@example.com"
-mailgunemail="email@myemail.com"
-
 # Pushbullet Alerts | https://docs.linuxgsm.com/alerts/pushbullet
 pushbulletalert="off"
 pushbullettoken="accesstoken"
diff --git a/lgsm/config-default/config-lgsm/ns2cserver/_default.cfg b/lgsm/config-default/config-lgsm/ns2cserver/_default.cfg
index ce44d932d..4579d3bb0 100644
--- a/lgsm/config-default/config-lgsm/ns2cserver/_default.cfg
+++ b/lgsm/config-default/config-lgsm/ns2cserver/_default.cfg
@@ -62,14 +62,6 @@ iftttalert="off"
 ifttttoken="accesstoken"
 iftttevent="linuxgsm_alert"
 
-# Mailgun Email Alerts | https://docs.linuxgsm.com/alerts/mailgun
-mailgunalert="off"
-mailgunapiregion="us"
-mailguntoken="accesstoken"
-mailgundomain="example.com"
-mailgunemailfrom="alert@example.com"
-mailgunemail="email@myemail.com"
-
 # Pushbullet Alerts | https://docs.linuxgsm.com/alerts/pushbullet
 pushbulletalert="off"
 pushbullettoken="accesstoken"
diff --git a/lgsm/config-default/config-lgsm/ns2server/_default.cfg b/lgsm/config-default/config-lgsm/ns2server/_default.cfg
index fdb0252f1..9f09491cf 100644
--- a/lgsm/config-default/config-lgsm/ns2server/_default.cfg
+++ b/lgsm/config-default/config-lgsm/ns2server/_default.cfg
@@ -62,14 +62,6 @@ iftttalert="off"
 ifttttoken="accesstoken"
 iftttevent="linuxgsm_alert"
 
-# Mailgun Email Alerts | https://docs.linuxgsm.com/alerts/mailgun
-mailgunalert="off"
-mailgunapiregion="us"
-mailguntoken="accesstoken"
-mailgundomain="example.com"
-mailgunemailfrom="alert@example.com"
-mailgunemail="email@myemail.com"
-
 # Pushbullet Alerts | https://docs.linuxgsm.com/alerts/pushbullet
 pushbulletalert="off"
 pushbullettoken="accesstoken"
diff --git a/lgsm/config-default/config-lgsm/nsserver/_default.cfg b/lgsm/config-default/config-lgsm/nsserver/_default.cfg
index 44faa5b95..7880222fa 100644
--- a/lgsm/config-default/config-lgsm/nsserver/_default.cfg
+++ b/lgsm/config-default/config-lgsm/nsserver/_default.cfg
@@ -54,14 +54,6 @@ iftttalert="off"
 ifttttoken="accesstoken"
 iftttevent="linuxgsm_alert"
 
-# Mailgun Email Alerts | https://docs.linuxgsm.com/alerts/mailgun
-mailgunalert="off"
-mailgunapiregion="us"
-mailguntoken="accesstoken"
-mailgundomain="example.com"
-mailgunemailfrom="alert@example.com"
-mailgunemail="email@myemail.com"
-
 # Pushbullet Alerts | https://docs.linuxgsm.com/alerts/pushbullet
 pushbulletalert="off"
 pushbullettoken="accesstoken"
diff --git a/lgsm/config-default/config-lgsm/ohdserver/_default.cfg b/lgsm/config-default/config-lgsm/ohdserver/_default.cfg
index afc11d09f..25a418edc 100644
--- a/lgsm/config-default/config-lgsm/ohdserver/_default.cfg
+++ b/lgsm/config-default/config-lgsm/ohdserver/_default.cfg
@@ -57,14 +57,6 @@ iftttalert="off"
 ifttttoken="accesstoken"
 iftttevent="linuxgsm_alert"
 
-# Mailgun Email Alerts | https://docs.linuxgsm.com/alerts/mailgun
-mailgunalert="off"
-mailgunapiregion="us"
-mailguntoken="accesstoken"
-mailgundomain="example.com"
-mailgunemailfrom="alert@example.com"
-mailgunemail="email@myemail.com"
-
 # Pushbullet Alerts | https://docs.linuxgsm.com/alerts/pushbullet
 pushbulletalert="off"
 pushbullettoken="accesstoken"
diff --git a/lgsm/config-default/config-lgsm/onsetserver/_default.cfg b/lgsm/config-default/config-lgsm/onsetserver/_default.cfg
index ffbcabdc3..b25cfb60c 100644
--- a/lgsm/config-default/config-lgsm/onsetserver/_default.cfg
+++ b/lgsm/config-default/config-lgsm/onsetserver/_default.cfg
@@ -47,14 +47,6 @@ iftttalert="off"
 ifttttoken="accesstoken"
 iftttevent="linuxgsm_alert"
 
-# Mailgun Email Alerts | https://docs.linuxgsm.com/alerts/mailgun
-mailgunalert="off"
-mailgunapiregion="us"
-mailguntoken="accesstoken"
-mailgundomain="example.com"
-mailgunemailfrom="alert@example.com"
-mailgunemail="email@myemail.com"
-
 # Pushbullet Alerts | https://docs.linuxgsm.com/alerts/pushbullet
 pushbulletalert="off"
 pushbullettoken="accesstoken"
diff --git a/lgsm/config-default/config-lgsm/opforserver/_default.cfg b/lgsm/config-default/config-lgsm/opforserver/_default.cfg
index c04666dfd..a0785a4b6 100644
--- a/lgsm/config-default/config-lgsm/opforserver/_default.cfg
+++ b/lgsm/config-default/config-lgsm/opforserver/_default.cfg
@@ -54,14 +54,6 @@ iftttalert="off"
 ifttttoken="accesstoken"
 iftttevent="linuxgsm_alert"
 
-# Mailgun Email Alerts | https://docs.linuxgsm.com/alerts/mailgun
-mailgunalert="off"
-mailgunapiregion="us"
-mailguntoken="accesstoken"
-mailgundomain="example.com"
-mailgunemailfrom="alert@example.com"
-mailgunemail="email@myemail.com"
-
 # Pushbullet Alerts | https://docs.linuxgsm.com/alerts/pushbullet
 pushbulletalert="off"
 pushbullettoken="accesstoken"
diff --git a/lgsm/config-default/config-lgsm/pc2server/_default.cfg b/lgsm/config-default/config-lgsm/pc2server/_default.cfg
index 37efdd824..1b9a6e6f1 100644
--- a/lgsm/config-default/config-lgsm/pc2server/_default.cfg
+++ b/lgsm/config-default/config-lgsm/pc2server/_default.cfg
@@ -51,14 +51,6 @@ iftttalert="off"
 ifttttoken="accesstoken"
 iftttevent="linuxgsm_alert"
 
-# Mailgun Email Alerts | https://docs.linuxgsm.com/alerts/mailgun
-mailgunalert="off"
-mailgunapiregion="us"
-mailguntoken="accesstoken"
-mailgundomain="example.com"
-mailgunemailfrom="alert@example.com"
-mailgunemail="email@myemail.com"
-
 # Pushbullet Alerts | https://docs.linuxgsm.com/alerts/pushbullet
 pushbulletalert="off"
 pushbullettoken="accesstoken"
diff --git a/lgsm/config-default/config-lgsm/pcserver/_default.cfg b/lgsm/config-default/config-lgsm/pcserver/_default.cfg
index e70ce6d26..1d4b15394 100644
--- a/lgsm/config-default/config-lgsm/pcserver/_default.cfg
+++ b/lgsm/config-default/config-lgsm/pcserver/_default.cfg
@@ -47,14 +47,6 @@ iftttalert="off"
 ifttttoken="accesstoken"
 iftttevent="linuxgsm_alert"
 
-# Mailgun Email Alerts | https://docs.linuxgsm.com/alerts/mailgun
-mailgunalert="off"
-mailgunapiregion="us"
-mailguntoken="accesstoken"
-mailgundomain="example.com"
-mailgunemailfrom="alert@example.com"
-mailgunemail="email@myemail.com"
-
 # Pushbullet Alerts | https://docs.linuxgsm.com/alerts/pushbullet
 pushbulletalert="off"
 pushbullettoken="accesstoken"
diff --git a/lgsm/config-default/config-lgsm/pmcserver/_default.cfg b/lgsm/config-default/config-lgsm/pmcserver/_default.cfg
index 984ebb470..430daefbe 100644
--- a/lgsm/config-default/config-lgsm/pmcserver/_default.cfg
+++ b/lgsm/config-default/config-lgsm/pmcserver/_default.cfg
@@ -54,14 +54,6 @@ iftttalert="off"
 ifttttoken="accesstoken"
 iftttevent="linuxgsm_alert"
 
-# Mailgun Email Alerts | https://docs.linuxgsm.com/alerts/mailgun
-mailgunalert="off"
-mailgunapiregion="us"
-mailguntoken="accesstoken"
-mailgundomain="example.com"
-mailgunemailfrom="alert@example.com"
-mailgunemail="email@myemail.com"
-
 # Pushbullet Alerts | https://docs.linuxgsm.com/alerts/pushbullet
 pushbulletalert="off"
 pushbullettoken="accesstoken"
diff --git a/lgsm/config-default/config-lgsm/psserver/_default.cfg b/lgsm/config-default/config-lgsm/psserver/_default.cfg
index d028fad57..9d8fa9383 100644
--- a/lgsm/config-default/config-lgsm/psserver/_default.cfg
+++ b/lgsm/config-default/config-lgsm/psserver/_default.cfg
@@ -56,14 +56,6 @@ iftttalert="off"
 ifttttoken="accesstoken"
 iftttevent="linuxgsm_alert"
 
-# Mailgun Email Alerts | https://docs.linuxgsm.com/alerts/mailgun
-mailgunalert="off"
-mailgunapiregion="us"
-mailguntoken="accesstoken"
-mailgundomain="example.com"
-mailgunemailfrom="alert@example.com"
-mailgunemail="email@myemail.com"
-
 # Pushbullet Alerts | https://docs.linuxgsm.com/alerts/pushbullet
 pushbulletalert="off"
 pushbullettoken="accesstoken"
diff --git a/lgsm/config-default/config-lgsm/pvkiiserver/_default.cfg b/lgsm/config-default/config-lgsm/pvkiiserver/_default.cfg
index e3e96a8ff..7f8adbf5f 100644
--- a/lgsm/config-default/config-lgsm/pvkiiserver/_default.cfg
+++ b/lgsm/config-default/config-lgsm/pvkiiserver/_default.cfg
@@ -55,14 +55,6 @@ iftttalert="off"
 ifttttoken="accesstoken"
 iftttevent="linuxgsm_alert"
 
-# Mailgun Email Alerts | https://docs.linuxgsm.com/alerts/mailgun
-mailgunalert="off"
-mailgunapiregion="us"
-mailguntoken="accesstoken"
-mailgundomain="example.com"
-mailgunemailfrom="alert@example.com"
-mailgunemail="email@myemail.com"
-
 # Pushbullet Alerts | https://docs.linuxgsm.com/alerts/pushbullet
 pushbulletalert="off"
 pushbullettoken="accesstoken"
diff --git a/lgsm/config-default/config-lgsm/pvrserver/_default.cfg b/lgsm/config-default/config-lgsm/pvrserver/_default.cfg
index 5063868b0..12e089fe0 100644
--- a/lgsm/config-default/config-lgsm/pvrserver/_default.cfg
+++ b/lgsm/config-default/config-lgsm/pvrserver/_default.cfg
@@ -55,14 +55,6 @@ iftttalert="off"
 ifttttoken="accesstoken"
 iftttevent="linuxgsm_alert"
 
-# Mailgun Email Alerts | https://docs.linuxgsm.com/alerts/mailgun
-mailgunalert="off"
-mailgunapiregion="us"
-mailguntoken="accesstoken"
-mailgundomain="example.com"
-mailgunemailfrom="alert@example.com"
-mailgunemail="email@myemail.com"
-
 # Pushbullet Alerts | https://docs.linuxgsm.com/alerts/pushbullet
 pushbulletalert="off"
 pushbullettoken="accesstoken"
diff --git a/lgsm/config-default/config-lgsm/pzserver/_default.cfg b/lgsm/config-default/config-lgsm/pzserver/_default.cfg
index b82f136ed..a3a5ac340 100644
--- a/lgsm/config-default/config-lgsm/pzserver/_default.cfg
+++ b/lgsm/config-default/config-lgsm/pzserver/_default.cfg
@@ -51,14 +51,6 @@ iftttalert="off"
 ifttttoken="accesstoken"
 iftttevent="linuxgsm_alert"
 
-# Mailgun Email Alerts | https://docs.linuxgsm.com/alerts/mailgun
-mailgunalert="off"
-mailgunapiregion="us"
-mailguntoken="accesstoken"
-mailgundomain="example.com"
-mailgunemailfrom="alert@example.com"
-mailgunemail="email@myemail.com"
-
 # Pushbullet Alerts | https://docs.linuxgsm.com/alerts/pushbullet
 pushbulletalert="off"
 pushbullettoken="accesstoken"
diff --git a/lgsm/config-default/config-lgsm/q2server/_default.cfg b/lgsm/config-default/config-lgsm/q2server/_default.cfg
index aa07f21b7..0d899df65 100644
--- a/lgsm/config-default/config-lgsm/q2server/_default.cfg
+++ b/lgsm/config-default/config-lgsm/q2server/_default.cfg
@@ -52,14 +52,6 @@ iftttalert="off"
 ifttttoken="accesstoken"
 iftttevent="linuxgsm_alert"
 
-# Mailgun Email Alerts | https://docs.linuxgsm.com/alerts/mailgun
-mailgunalert="off"
-mailgunapiregion="us"
-mailguntoken="accesstoken"
-mailgundomain="example.com"
-mailgunemailfrom="alert@example.com"
-mailgunemail="email@myemail.com"
-
 # Pushbullet Alerts | https://docs.linuxgsm.com/alerts/pushbullet
 pushbulletalert="off"
 pushbullettoken="accesstoken"
diff --git a/lgsm/config-default/config-lgsm/q3server/_default.cfg b/lgsm/config-default/config-lgsm/q3server/_default.cfg
index eacb87049..e53fb4285 100644
--- a/lgsm/config-default/config-lgsm/q3server/_default.cfg
+++ b/lgsm/config-default/config-lgsm/q3server/_default.cfg
@@ -52,14 +52,6 @@ iftttalert="off"
 ifttttoken="accesstoken"
 iftttevent="linuxgsm_alert"
 
-# Mailgun Email Alerts | https://docs.linuxgsm.com/alerts/mailgun
-mailgunalert="off"
-mailgunapiregion="us"
-mailguntoken="accesstoken"
-mailgundomain="example.com"
-mailgunemailfrom="alert@example.com"
-mailgunemail="email@myemail.com"
-
 # Pushbullet Alerts | https://docs.linuxgsm.com/alerts/pushbullet
 pushbulletalert="off"
 pushbullettoken="accesstoken"
diff --git a/lgsm/config-default/config-lgsm/qlserver/_default.cfg b/lgsm/config-default/config-lgsm/qlserver/_default.cfg
index f6b5342e0..3f28329ac 100644
--- a/lgsm/config-default/config-lgsm/qlserver/_default.cfg
+++ b/lgsm/config-default/config-lgsm/qlserver/_default.cfg
@@ -47,14 +47,6 @@ iftttalert="off"
 ifttttoken="accesstoken"
 iftttevent="linuxgsm_alert"
 
-# Mailgun Email Alerts | https://docs.linuxgsm.com/alerts/mailgun
-mailgunalert="off"
-mailgunapiregion="us"
-mailguntoken="accesstoken"
-mailgundomain="example.com"
-mailgunemailfrom="alert@example.com"
-mailgunemail="email@myemail.com"
-
 # Pushbullet Alerts | https://docs.linuxgsm.com/alerts/pushbullet
 pushbulletalert="off"
 pushbullettoken="accesstoken"
diff --git a/lgsm/config-default/config-lgsm/qwserver/_default.cfg b/lgsm/config-default/config-lgsm/qwserver/_default.cfg
index 5f6288879..95dea75f8 100644
--- a/lgsm/config-default/config-lgsm/qwserver/_default.cfg
+++ b/lgsm/config-default/config-lgsm/qwserver/_default.cfg
@@ -51,14 +51,6 @@ iftttalert="off"
 ifttttoken="accesstoken"
 iftttevent="linuxgsm_alert"
 
-# Mailgun Email Alerts | https://docs.linuxgsm.com/alerts/mailgun
-mailgunalert="off"
-mailgunapiregion="us"
-mailguntoken="accesstoken"
-mailgundomain="example.com"
-mailgunemailfrom="alert@example.com"
-mailgunemail="email@myemail.com"
-
 # Pushbullet Alerts | https://docs.linuxgsm.com/alerts/pushbullet
 pushbulletalert="off"
 pushbullettoken="accesstoken"
diff --git a/lgsm/config-default/config-lgsm/ricochetserver/_default.cfg b/lgsm/config-default/config-lgsm/ricochetserver/_default.cfg
index b1bb3e794..419825ec1 100644
--- a/lgsm/config-default/config-lgsm/ricochetserver/_default.cfg
+++ b/lgsm/config-default/config-lgsm/ricochetserver/_default.cfg
@@ -54,14 +54,6 @@ iftttalert="off"
 ifttttoken="accesstoken"
 iftttevent="linuxgsm_alert"
 
-# Mailgun Email Alerts | https://docs.linuxgsm.com/alerts/mailgun
-mailgunalert="off"
-mailgunapiregion="us"
-mailguntoken="accesstoken"
-mailgundomain="example.com"
-mailgunemailfrom="alert@example.com"
-mailgunemail="email@myemail.com"
-
 # Pushbullet Alerts | https://docs.linuxgsm.com/alerts/pushbullet
 pushbulletalert="off"
 pushbullettoken="accesstoken"
diff --git a/lgsm/config-default/config-lgsm/roserver/_default.cfg b/lgsm/config-default/config-lgsm/roserver/_default.cfg
index 8e4fe21a6..4617289fd 100644
--- a/lgsm/config-default/config-lgsm/roserver/_default.cfg
+++ b/lgsm/config-default/config-lgsm/roserver/_default.cfg
@@ -55,14 +55,6 @@ iftttalert="off"
 ifttttoken="accesstoken"
 iftttevent="linuxgsm_alert"
 
-# Mailgun Email Alerts | https://docs.linuxgsm.com/alerts/mailgun
-mailgunalert="off"
-mailgunapiregion="us"
-mailguntoken="accesstoken"
-mailgundomain="example.com"
-mailgunemailfrom="alert@example.com"
-mailgunemail="email@myemail.com"
-
 # Pushbullet Alerts | https://docs.linuxgsm.com/alerts/pushbullet
 pushbulletalert="off"
 pushbullettoken="accesstoken"
diff --git a/lgsm/config-default/config-lgsm/rtcwserver/_default.cfg b/lgsm/config-default/config-lgsm/rtcwserver/_default.cfg
index d99061bdb..159b8dfd4 100644
--- a/lgsm/config-default/config-lgsm/rtcwserver/_default.cfg
+++ b/lgsm/config-default/config-lgsm/rtcwserver/_default.cfg
@@ -52,14 +52,6 @@ iftttalert="off"
 ifttttoken="accesstoken"
 iftttevent="linuxgsm_alert"
 
-# Mailgun Email Alerts | https://docs.linuxgsm.com/alerts/mailgun
-mailgunalert="off"
-mailgunapiregion="us"
-mailguntoken="accesstoken"
-mailgundomain="example.com"
-mailgunemailfrom="alert@example.com"
-mailgunemail="email@myemail.com"
-
 # Pushbullet Alerts | https://docs.linuxgsm.com/alerts/pushbullet
 pushbulletalert="off"
 pushbullettoken="accesstoken"
diff --git a/lgsm/config-default/config-lgsm/rustserver/_default.cfg b/lgsm/config-default/config-lgsm/rustserver/_default.cfg
index a07838143..fc955a94a 100644
--- a/lgsm/config-default/config-lgsm/rustserver/_default.cfg
+++ b/lgsm/config-default/config-lgsm/rustserver/_default.cfg
@@ -66,14 +66,6 @@ iftttalert="off"
 ifttttoken="accesstoken"
 iftttevent="linuxgsm_alert"
 
-# Mailgun Email Alerts | https://docs.linuxgsm.com/alerts/mailgun
-mailgunalert="off"
-mailgunapiregion="us"
-mailguntoken="accesstoken"
-mailgundomain="example.com"
-mailgunemailfrom="alert@example.com"
-mailgunemail="email@myemail.com"
-
 # Pushbullet Alerts | https://docs.linuxgsm.com/alerts/pushbullet
 pushbulletalert="off"
 pushbullettoken="accesstoken"
diff --git a/lgsm/config-default/config-lgsm/rwserver/_default.cfg b/lgsm/config-default/config-lgsm/rwserver/_default.cfg
index 74288a4f8..c714045ca 100644
--- a/lgsm/config-default/config-lgsm/rwserver/_default.cfg
+++ b/lgsm/config-default/config-lgsm/rwserver/_default.cfg
@@ -47,14 +47,6 @@ iftttalert="off"
 ifttttoken="accesstoken"
 iftttevent="linuxgsm_alert"
 
-# Mailgun Email Alerts | https://docs.linuxgsm.com/alerts/mailgun
-mailgunalert="off"
-mailgunapiregion="us"
-mailguntoken="accesstoken"
-mailgundomain="example.com"
-mailgunemailfrom="alert@example.com"
-mailgunemail="email@myemail.com"
-
 # Pushbullet Alerts | https://docs.linuxgsm.com/alerts/pushbullet
 pushbulletalert="off"
 pushbullettoken="accesstoken"
diff --git a/lgsm/config-default/config-lgsm/sampserver/_default.cfg b/lgsm/config-default/config-lgsm/sampserver/_default.cfg
index 709c9922c..448f8c20f 100644
--- a/lgsm/config-default/config-lgsm/sampserver/_default.cfg
+++ b/lgsm/config-default/config-lgsm/sampserver/_default.cfg
@@ -51,14 +51,6 @@ iftttalert="off"
 ifttttoken="accesstoken"
 iftttevent="linuxgsm_alert"
 
-# Mailgun Email Alerts | https://docs.linuxgsm.com/alerts/mailgun
-mailgunalert="off"
-mailgunapiregion="us"
-mailguntoken="accesstoken"
-mailgundomain="example.com"
-mailgunemailfrom="alert@example.com"
-mailgunemail="email@myemail.com"
-
 # Pushbullet Alerts | https://docs.linuxgsm.com/alerts/pushbullet
 pushbulletalert="off"
 pushbullettoken="accesstoken"
diff --git a/lgsm/config-default/config-lgsm/sbotsserver/_default.cfg b/lgsm/config-default/config-lgsm/sbotsserver/_default.cfg
index 50c2a4e76..0107c39d5 100644
--- a/lgsm/config-default/config-lgsm/sbotsserver/_default.cfg
+++ b/lgsm/config-default/config-lgsm/sbotsserver/_default.cfg
@@ -53,14 +53,6 @@ iftttalert="off"
 ifttttoken="accesstoken"
 iftttevent="linuxgsm_alert"
 
-# Mailgun Email Alerts | https://docs.linuxgsm.com/alerts/mailgun
-mailgunalert="off"
-mailgunapiregion="us"
-mailguntoken="accesstoken"
-mailgundomain="example.com"
-mailgunemailfrom="alert@example.com"
-mailgunemail="email@myemail.com"
-
 # Pushbullet Alerts | https://docs.linuxgsm.com/alerts/pushbullet
 pushbulletalert="off"
 pushbullettoken="accesstoken"
diff --git a/lgsm/config-default/config-lgsm/sbserver/_default.cfg b/lgsm/config-default/config-lgsm/sbserver/_default.cfg
index 733267b4b..79e447454 100644
--- a/lgsm/config-default/config-lgsm/sbserver/_default.cfg
+++ b/lgsm/config-default/config-lgsm/sbserver/_default.cfg
@@ -54,14 +54,6 @@ iftttalert="off"
 ifttttoken="accesstoken"
 iftttevent="linuxgsm_alert"
 
-# Mailgun Email Alerts | https://docs.linuxgsm.com/alerts/mailgun
-mailgunalert="off"
-mailgunapiregion="us"
-mailguntoken="accesstoken"
-mailgundomain="example.com"
-mailgunemailfrom="alert@example.com"
-mailgunemail="email@myemail.com"
-
 # Pushbullet Alerts | https://docs.linuxgsm.com/alerts/pushbullet
 pushbulletalert="off"
 pushbullettoken="accesstoken"
diff --git a/lgsm/config-default/config-lgsm/scpslserver/_default.cfg b/lgsm/config-default/config-lgsm/scpslserver/_default.cfg
index 100de02a8..ad2e2f9d5 100644
--- a/lgsm/config-default/config-lgsm/scpslserver/_default.cfg
+++ b/lgsm/config-default/config-lgsm/scpslserver/_default.cfg
@@ -52,14 +52,6 @@ iftttalert="off"
 ifttttoken="accesstoken"
 iftttevent="linuxgsm_alert"
 
-# Mailgun Email Alerts | https://docs.linuxgsm.com/alerts/mailgun
-mailgunalert="off"
-mailgunapiregion="us"
-mailguntoken="accesstoken"
-mailgundomain="example.com"
-mailgunemailfrom="alert@example.com"
-mailgunemail="email@myemail.com"
-
 # Pushbullet Alerts | https://docs.linuxgsm.com/alerts/pushbullet
 pushbulletalert="off"
 pushbullettoken="accesstoken"
diff --git a/lgsm/config-default/config-lgsm/scpslsmserver/_default.cfg b/lgsm/config-default/config-lgsm/scpslsmserver/_default.cfg
index 1e041e93b..6c7a7b3ca 100644
--- a/lgsm/config-default/config-lgsm/scpslsmserver/_default.cfg
+++ b/lgsm/config-default/config-lgsm/scpslsmserver/_default.cfg
@@ -52,14 +52,6 @@ iftttalert="off"
 ifttttoken="accesstoken"
 iftttevent="linuxgsm_alert"
 
-# Mailgun Email Alerts | https://docs.linuxgsm.com/alerts/mailgun
-mailgunalert="off"
-mailgunapiregion="us"
-mailguntoken="accesstoken"
-mailgundomain="example.com"
-mailgunemailfrom="alert@example.com"
-mailgunemail="email@myemail.com"
-
 # Pushbullet Alerts | https://docs.linuxgsm.com/alerts/pushbullet
 pushbulletalert="off"
 pushbullettoken="accesstoken"
diff --git a/lgsm/config-default/config-lgsm/sdtdserver/_default.cfg b/lgsm/config-default/config-lgsm/sdtdserver/_default.cfg
index 7775f16ab..b2c8e00f0 100644
--- a/lgsm/config-default/config-lgsm/sdtdserver/_default.cfg
+++ b/lgsm/config-default/config-lgsm/sdtdserver/_default.cfg
@@ -50,14 +50,6 @@ iftttalert="off"
 ifttttoken="accesstoken"
 iftttevent="linuxgsm_alert"
 
-# Mailgun Email Alerts | https://docs.linuxgsm.com/alerts/mailgun
-mailgunalert="off"
-mailgunapiregion="us"
-mailguntoken="accesstoken"
-mailgundomain="example.com"
-mailgunemailfrom="alert@example.com"
-mailgunemail="email@myemail.com"
-
 # Pushbullet Alerts | https://docs.linuxgsm.com/alerts/pushbullet
 pushbulletalert="off"
 pushbullettoken="accesstoken"
diff --git a/lgsm/config-default/config-lgsm/sfcserver/_default.cfg b/lgsm/config-default/config-lgsm/sfcserver/_default.cfg
index f64261993..b566de690 100644
--- a/lgsm/config-default/config-lgsm/sfcserver/_default.cfg
+++ b/lgsm/config-default/config-lgsm/sfcserver/_default.cfg
@@ -55,14 +55,6 @@ iftttalert="off"
 ifttttoken="accesstoken"
 iftttevent="linuxgsm_alert"
 
-# Mailgun Email Alerts | https://docs.linuxgsm.com/alerts/mailgun
-mailgunalert="off"
-mailgunapiregion="us"
-mailguntoken="accesstoken"
-mailgundomain="example.com"
-mailgunemailfrom="alert@example.com"
-mailgunemail="email@myemail.com"
-
 # Pushbullet Alerts | https://docs.linuxgsm.com/alerts/pushbullet
 pushbulletalert="off"
 pushbullettoken="accesstoken"
diff --git a/lgsm/config-default/config-lgsm/sfserver/_default.cfg b/lgsm/config-default/config-lgsm/sfserver/_default.cfg
index bc25dccfa..46d0ebf88 100644
--- a/lgsm/config-default/config-lgsm/sfserver/_default.cfg
+++ b/lgsm/config-default/config-lgsm/sfserver/_default.cfg
@@ -53,14 +53,6 @@ iftttalert="off"
 ifttttoken="accesstoken"
 iftttevent="linuxgsm_alert"
 
-# Mailgun Email Alerts | https://docs.linuxgsm.com/alerts/mailgun
-mailgunalert="off"
-mailgunapiregion="us"
-mailguntoken="accesstoken"
-mailgundomain="example.com"
-mailgunemailfrom="alert@example.com"
-mailgunemail="email@myemail.com"
-
 # Pushbullet Alerts | https://docs.linuxgsm.com/alerts/pushbullet
 pushbulletalert="off"
 pushbullettoken="accesstoken"
diff --git a/lgsm/config-default/config-lgsm/sof2server/_default.cfg b/lgsm/config-default/config-lgsm/sof2server/_default.cfg
index 282c8166d..6169950c0 100644
--- a/lgsm/config-default/config-lgsm/sof2server/_default.cfg
+++ b/lgsm/config-default/config-lgsm/sof2server/_default.cfg
@@ -52,14 +52,6 @@ iftttalert="off"
 ifttttoken="accesstoken"
 iftttevent="linuxgsm_alert"
 
-# Mailgun Email Alerts | https://docs.linuxgsm.com/alerts/mailgun
-mailgunalert="off"
-mailgunapiregion="us"
-mailguntoken="accesstoken"
-mailgundomain="example.com"
-mailgunemailfrom="alert@example.com"
-mailgunemail="email@myemail.com"
-
 # Pushbullet Alerts | https://docs.linuxgsm.com/alerts/pushbullet
 pushbulletalert="off"
 pushbullettoken="accesstoken"
diff --git a/lgsm/config-default/config-lgsm/solserver/_default.cfg b/lgsm/config-default/config-lgsm/solserver/_default.cfg
index aa8d02d5a..671dcd429 100644
--- a/lgsm/config-default/config-lgsm/solserver/_default.cfg
+++ b/lgsm/config-default/config-lgsm/solserver/_default.cfg
@@ -51,14 +51,6 @@ iftttalert="off"
 ifttttoken="accesstoken"
 iftttevent="linuxgsm_alert"
 
-# Mailgun Email Alerts | https://docs.linuxgsm.com/alerts/mailgun
-mailgunalert="off"
-mailgunapiregion="us"
-mailguntoken="accesstoken"
-mailgundomain="example.com"
-mailgunemailfrom="alert@example.com"
-mailgunemail="email@myemail.com"
-
 # Pushbullet Alerts | https://docs.linuxgsm.com/alerts/pushbullet
 pushbulletalert="off"
 pushbullettoken="accesstoken"
diff --git a/lgsm/config-default/config-lgsm/squadserver/_default.cfg b/lgsm/config-default/config-lgsm/squadserver/_default.cfg
index 432b5a402..dbaa3c736 100644
--- a/lgsm/config-default/config-lgsm/squadserver/_default.cfg
+++ b/lgsm/config-default/config-lgsm/squadserver/_default.cfg
@@ -52,14 +52,6 @@ iftttalert="off"
 ifttttoken="accesstoken"
 iftttevent="linuxgsm_alert"
 
-# Mailgun Email Alerts | https://docs.linuxgsm.com/alerts/mailgun
-mailgunalert="off"
-mailgunapiregion="us"
-mailguntoken="accesstoken"
-mailgundomain="example.com"
-mailgunemailfrom="alert@example.com"
-mailgunemail="email@myemail.com"
-
 # Pushbullet Alerts | https://docs.linuxgsm.com/alerts/pushbullet
 pushbulletalert="off"
 pushbullettoken="accesstoken"
diff --git a/lgsm/config-default/config-lgsm/stnserver/_default.cfg b/lgsm/config-default/config-lgsm/stnserver/_default.cfg
index 463e808ed..8531c111b 100644
--- a/lgsm/config-default/config-lgsm/stnserver/_default.cfg
+++ b/lgsm/config-default/config-lgsm/stnserver/_default.cfg
@@ -51,14 +51,6 @@ iftttalert="off"
 ifttttoken="accesstoken"
 iftttevent="linuxgsm_alert"
 
-# Mailgun Email Alerts | https://docs.linuxgsm.com/alerts/mailgun
-mailgunalert="off"
-mailgunapiregion="us"
-mailguntoken="accesstoken"
-mailgundomain="example.com"
-mailgunemailfrom="alert@example.com"
-mailgunemail="email@myemail.com"
-
 # Pushbullet Alerts | https://docs.linuxgsm.com/alerts/pushbullet
 pushbulletalert="off"
 pushbullettoken="accesstoken"
diff --git a/lgsm/config-default/config-lgsm/stserver/_default.cfg b/lgsm/config-default/config-lgsm/stserver/_default.cfg
index eef67827f..0d8f9317f 100644
--- a/lgsm/config-default/config-lgsm/stserver/_default.cfg
+++ b/lgsm/config-default/config-lgsm/stserver/_default.cfg
@@ -52,14 +52,6 @@ iftttalert="off"
 ifttttoken="accesstoken"
 iftttevent="linuxgsm_alert"
 
-# Mailgun Email Alerts | https://docs.linuxgsm.com/alerts/mailgun
-mailgunalert="off"
-mailgunapiregion="us"
-mailguntoken="accesstoken"
-mailgundomain="example.com"
-mailgunemailfrom="alert@example.com"
-mailgunemail="email@myemail.com"
-
 # Pushbullet Alerts | https://docs.linuxgsm.com/alerts/pushbullet
 pushbulletalert="off"
 pushbullettoken="accesstoken"
diff --git a/lgsm/config-default/config-lgsm/svenserver/_default.cfg b/lgsm/config-default/config-lgsm/svenserver/_default.cfg
index 309e73d04..7f47091e4 100644
--- a/lgsm/config-default/config-lgsm/svenserver/_default.cfg
+++ b/lgsm/config-default/config-lgsm/svenserver/_default.cfg
@@ -54,14 +54,6 @@ iftttalert="off"
 ifttttoken="accesstoken"
 iftttevent="linuxgsm_alert"
 
-# Mailgun Email Alerts | https://docs.linuxgsm.com/alerts/mailgun
-mailgunalert="off"
-mailgunapiregion="us"
-mailguntoken="accesstoken"
-mailgundomain="example.com"
-mailgunemailfrom="alert@example.com"
-mailgunemail="email@myemail.com"
-
 # Pushbullet Alerts | https://docs.linuxgsm.com/alerts/pushbullet
 pushbulletalert="off"
 pushbullettoken="accesstoken"
diff --git a/lgsm/config-default/config-lgsm/terrariaserver/_default.cfg b/lgsm/config-default/config-lgsm/terrariaserver/_default.cfg
index ea0d549be..562b0fd9b 100644
--- a/lgsm/config-default/config-lgsm/terrariaserver/_default.cfg
+++ b/lgsm/config-default/config-lgsm/terrariaserver/_default.cfg
@@ -54,14 +54,6 @@ iftttalert="off"
 ifttttoken="accesstoken"
 iftttevent="linuxgsm_alert"
 
-# Mailgun Email Alerts | https://docs.linuxgsm.com/alerts/mailgun
-mailgunalert="off"
-mailgunapiregion="us"
-mailguntoken="accesstoken"
-mailgundomain="example.com"
-mailgunemailfrom="alert@example.com"
-mailgunemail="email@myemail.com"
-
 # Pushbullet Alerts | https://docs.linuxgsm.com/alerts/pushbullet
 pushbulletalert="off"
 pushbullettoken="accesstoken"
diff --git a/lgsm/config-default/config-lgsm/tf2server/_default.cfg b/lgsm/config-default/config-lgsm/tf2server/_default.cfg
index 851e80386..d7d53928b 100644
--- a/lgsm/config-default/config-lgsm/tf2server/_default.cfg
+++ b/lgsm/config-default/config-lgsm/tf2server/_default.cfg
@@ -60,14 +60,6 @@ iftttalert="off"
 ifttttoken="accesstoken"
 iftttevent="linuxgsm_alert"
 
-# Mailgun Email Alerts | https://docs.linuxgsm.com/alerts/mailgun
-mailgunalert="off"
-mailgunapiregion="us"
-mailguntoken="accesstoken"
-mailgundomain="example.com"
-mailgunemailfrom="alert@example.com"
-mailgunemail="email@myemail.com"
-
 # Pushbullet Alerts | https://docs.linuxgsm.com/alerts/pushbullet
 pushbulletalert="off"
 pushbullettoken="accesstoken"
diff --git a/lgsm/config-default/config-lgsm/tfcserver/_default.cfg b/lgsm/config-default/config-lgsm/tfcserver/_default.cfg
index c0c09ec66..6709767a9 100644
--- a/lgsm/config-default/config-lgsm/tfcserver/_default.cfg
+++ b/lgsm/config-default/config-lgsm/tfcserver/_default.cfg
@@ -54,14 +54,6 @@ iftttalert="off"
 ifttttoken="accesstoken"
 iftttevent="linuxgsm_alert"
 
-# Mailgun Email Alerts | https://docs.linuxgsm.com/alerts/mailgun
-mailgunalert="off"
-mailgunapiregion="us"
-mailguntoken="accesstoken"
-mailgundomain="example.com"
-mailgunemailfrom="alert@example.com"
-mailgunemail="email@myemail.com"
-
 # Pushbullet Alerts | https://docs.linuxgsm.com/alerts/pushbullet
 pushbulletalert="off"
 pushbullettoken="accesstoken"
diff --git a/lgsm/config-default/config-lgsm/tiserver/_default.cfg b/lgsm/config-default/config-lgsm/tiserver/_default.cfg
index 6e04a4d32..994a2574a 100644
--- a/lgsm/config-default/config-lgsm/tiserver/_default.cfg
+++ b/lgsm/config-default/config-lgsm/tiserver/_default.cfg
@@ -52,14 +52,6 @@ iftttalert="off"
 ifttttoken="accesstoken"
 iftttevent="linuxgsm_alert"
 
-# Mailgun Email Alerts | https://docs.linuxgsm.com/alerts/mailgun
-mailgunalert="off"
-mailgunapiregion="us"
-mailguntoken="accesstoken"
-mailgundomain="example.com"
-mailgunemailfrom="alert@example.com"
-mailgunemail="email@myemail.com"
-
 # Pushbullet Alerts | https://docs.linuxgsm.com/alerts/pushbullet
 pushbulletalert="off"
 pushbullettoken="accesstoken"
diff --git a/lgsm/config-default/config-lgsm/ts3server/_default.cfg b/lgsm/config-default/config-lgsm/ts3server/_default.cfg
index 8dff8f7f8..dc3e7a3fa 100644
--- a/lgsm/config-default/config-lgsm/ts3server/_default.cfg
+++ b/lgsm/config-default/config-lgsm/ts3server/_default.cfg
@@ -47,14 +47,6 @@ iftttalert="off"
 ifttttoken="accesstoken"
 iftttevent="linuxgsm_alert"
 
-# Mailgun Email Alerts | https://docs.linuxgsm.com/alerts/mailgun
-mailgunalert="off"
-mailgunapiregion="us"
-mailguntoken="accesstoken"
-mailgundomain="example.com"
-mailgunemailfrom="alert@example.com"
-mailgunemail="email@myemail.com"
-
 # Pushbullet Alerts | https://docs.linuxgsm.com/alerts/pushbullet
 pushbulletalert="off"
 pushbullettoken="accesstoken"
diff --git a/lgsm/config-default/config-lgsm/tsserver/_default.cfg b/lgsm/config-default/config-lgsm/tsserver/_default.cfg
index 8eb00e73a..c9ea3b381 100644
--- a/lgsm/config-default/config-lgsm/tsserver/_default.cfg
+++ b/lgsm/config-default/config-lgsm/tsserver/_default.cfg
@@ -54,14 +54,6 @@ iftttalert="off"
 ifttttoken="accesstoken"
 iftttevent="linuxgsm_alert"
 
-# Mailgun Email Alerts | https://docs.linuxgsm.com/alerts/mailgun
-mailgunalert="off"
-mailgunapiregion="us"
-mailguntoken="accesstoken"
-mailgundomain="example.com"
-mailgunemailfrom="alert@example.com"
-mailgunemail="email@myemail.com"
-
 # Pushbullet Alerts | https://docs.linuxgsm.com/alerts/pushbullet
 pushbulletalert="off"
 pushbullettoken="accesstoken"
diff --git a/lgsm/config-default/config-lgsm/tuserver/_default.cfg b/lgsm/config-default/config-lgsm/tuserver/_default.cfg
index f62740818..551ce95f4 100644
--- a/lgsm/config-default/config-lgsm/tuserver/_default.cfg
+++ b/lgsm/config-default/config-lgsm/tuserver/_default.cfg
@@ -57,14 +57,6 @@ iftttalert="off"
 ifttttoken="accesstoken"
 iftttevent="linuxgsm_alert"
 
-# Mailgun Email Alerts | https://docs.linuxgsm.com/alerts/mailgun
-mailgunalert="off"
-mailgunapiregion="us"
-mailguntoken="accesstoken"
-mailgundomain="example.com"
-mailgunemailfrom="alert@example.com"
-mailgunemail="email@myemail.com"
-
 # Pushbullet Alerts | https://docs.linuxgsm.com/alerts/pushbullet
 pushbulletalert="off"
 pushbullettoken="accesstoken"
diff --git a/lgsm/config-default/config-lgsm/twserver/_default.cfg b/lgsm/config-default/config-lgsm/twserver/_default.cfg
index 13edffe2f..d7e84704a 100644
--- a/lgsm/config-default/config-lgsm/twserver/_default.cfg
+++ b/lgsm/config-default/config-lgsm/twserver/_default.cfg
@@ -54,14 +54,6 @@ iftttalert="off"
 ifttttoken="accesstoken"
 iftttevent="linuxgsm_alert"
 
-# Mailgun Email Alerts | https://docs.linuxgsm.com/alerts/mailgun
-mailgunalert="off"
-mailgunapiregion="us"
-mailguntoken="accesstoken"
-mailgundomain="example.com"
-mailgunemailfrom="alert@example.com"
-mailgunemail="email@myemail.com"
-
 # Pushbullet Alerts | https://docs.linuxgsm.com/alerts/pushbullet
 pushbulletalert="off"
 pushbullettoken="accesstoken"
diff --git a/lgsm/config-default/config-lgsm/untserver/_default.cfg b/lgsm/config-default/config-lgsm/untserver/_default.cfg
index fc1718967..b250d3284 100644
--- a/lgsm/config-default/config-lgsm/untserver/_default.cfg
+++ b/lgsm/config-default/config-lgsm/untserver/_default.cfg
@@ -61,14 +61,6 @@ iftttalert="off"
 ifttttoken="accesstoken"
 iftttevent="linuxgsm_alert"
 
-# Mailgun Email Alerts | https://docs.linuxgsm.com/alerts/mailgun
-mailgunalert="off"
-mailgunapiregion="us"
-mailguntoken="accesstoken"
-mailgundomain="example.com"
-mailgunemailfrom="alert@example.com"
-mailgunemail="email@myemail.com"
-
 # Pushbullet Alerts | https://docs.linuxgsm.com/alerts/pushbullet
 pushbulletalert="off"
 pushbullettoken="accesstoken"
diff --git a/lgsm/config-default/config-lgsm/ut2k4server/_default.cfg b/lgsm/config-default/config-lgsm/ut2k4server/_default.cfg
index 5b0fc6a2b..dc5d39fd7 100644
--- a/lgsm/config-default/config-lgsm/ut2k4server/_default.cfg
+++ b/lgsm/config-default/config-lgsm/ut2k4server/_default.cfg
@@ -51,14 +51,6 @@ iftttalert="off"
 ifttttoken="accesstoken"
 iftttevent="linuxgsm_alert"
 
-# Mailgun Email Alerts | https://docs.linuxgsm.com/alerts/mailgun
-mailgunalert="off"
-mailgunapiregion="us"
-mailguntoken="accesstoken"
-mailgundomain="example.com"
-mailgunemailfrom="alert@example.com"
-mailgunemail="email@myemail.com"
-
 # Pushbullet Alerts | https://docs.linuxgsm.com/alerts/pushbullet
 pushbulletalert="off"
 pushbullettoken="accesstoken"
diff --git a/lgsm/config-default/config-lgsm/ut3server/_default.cfg b/lgsm/config-default/config-lgsm/ut3server/_default.cfg
index b52bcbfb0..412422257 100644
--- a/lgsm/config-default/config-lgsm/ut3server/_default.cfg
+++ b/lgsm/config-default/config-lgsm/ut3server/_default.cfg
@@ -67,14 +67,6 @@ iftttalert="off"
 ifttttoken="accesstoken"
 iftttevent="linuxgsm_alert"
 
-# Mailgun Email Alerts | https://docs.linuxgsm.com/alerts/mailgun
-mailgunalert="off"
-mailgunapiregion="us"
-mailguntoken="accesstoken"
-mailgundomain="example.com"
-mailgunemailfrom="alert@example.com"
-mailgunemail="email@myemail.com"
-
 # Pushbullet Alerts | https://docs.linuxgsm.com/alerts/pushbullet
 pushbulletalert="off"
 pushbullettoken="accesstoken"
diff --git a/lgsm/config-default/config-lgsm/ut99server/_default.cfg b/lgsm/config-default/config-lgsm/ut99server/_default.cfg
index 21db8e024..6df4ea539 100644
--- a/lgsm/config-default/config-lgsm/ut99server/_default.cfg
+++ b/lgsm/config-default/config-lgsm/ut99server/_default.cfg
@@ -51,14 +51,6 @@ iftttalert="off"
 ifttttoken="accesstoken"
 iftttevent="linuxgsm_alert"
 
-# Mailgun Email Alerts | https://docs.linuxgsm.com/alerts/mailgun
-mailgunalert="off"
-mailgunapiregion="us"
-mailguntoken="accesstoken"
-mailgundomain="example.com"
-mailgunemailfrom="alert@example.com"
-mailgunemail="email@myemail.com"
-
 # Pushbullet Alerts | https://docs.linuxgsm.com/alerts/pushbullet
 pushbulletalert="off"
 pushbullettoken="accesstoken"
diff --git a/lgsm/config-default/config-lgsm/utserver/_default.cfg b/lgsm/config-default/config-lgsm/utserver/_default.cfg
index 82b47bf9a..1ae90d9bb 100644
--- a/lgsm/config-default/config-lgsm/utserver/_default.cfg
+++ b/lgsm/config-default/config-lgsm/utserver/_default.cfg
@@ -55,14 +55,6 @@ iftttalert="off"
 ifttttoken="accesstoken"
 iftttevent="linuxgsm_alert"
 
-# Mailgun Email Alerts | https://docs.linuxgsm.com/alerts/mailgun
-mailgunalert="off"
-mailgunapiregion="us"
-mailguntoken="accesstoken"
-mailgundomain="example.com"
-mailgunemailfrom="alert@example.com"
-mailgunemail="email@myemail.com"
-
 # Pushbullet Alerts | https://docs.linuxgsm.com/alerts/pushbullet
 pushbulletalert="off"
 pushbullettoken="accesstoken"
diff --git a/lgsm/config-default/config-lgsm/vhserver/_default.cfg b/lgsm/config-default/config-lgsm/vhserver/_default.cfg
index 5fd29f6a7..f0eb4cf8e 100644
--- a/lgsm/config-default/config-lgsm/vhserver/_default.cfg
+++ b/lgsm/config-default/config-lgsm/vhserver/_default.cfg
@@ -64,14 +64,6 @@ iftttalert="off"
 ifttttoken="accesstoken"
 iftttevent="linuxgsm_alert"
 
-# Mailgun Email Alerts | https://docs.linuxgsm.com/alerts/mailgun
-mailgunalert="off"
-mailgunapiregion="us"
-mailguntoken="accesstoken"
-mailgundomain="example.com"
-mailgunemailfrom="alert@example.com"
-mailgunemail="email@myemail.com"
-
 # Pushbullet Alerts | https://docs.linuxgsm.com/alerts/pushbullet
 pushbulletalert="off"
 pushbullettoken="accesstoken"
diff --git a/lgsm/config-default/config-lgsm/vintsserver/_default.cfg b/lgsm/config-default/config-lgsm/vintsserver/_default.cfg
index 2db6dbc06..75288012e 100644
--- a/lgsm/config-default/config-lgsm/vintsserver/_default.cfg
+++ b/lgsm/config-default/config-lgsm/vintsserver/_default.cfg
@@ -51,14 +51,6 @@ iftttalert="off"
 ifttttoken="accesstoken"
 iftttevent="linuxgsm_alert"
 
-# Mailgun Email Alerts | https://docs.linuxgsm.com/alerts/mailgun
-mailgunalert="off"
-mailgunapiregion="us"
-mailguntoken="accesstoken"
-mailgundomain="example.com"
-mailgunemailfrom="alert@example.com"
-mailgunemail="email@myemail.com"
-
 # Pushbullet Alerts | https://docs.linuxgsm.com/alerts/pushbullet
 pushbulletalert="off"
 pushbullettoken="accesstoken"
diff --git a/lgsm/config-default/config-lgsm/vpmcserver/_default.cfg b/lgsm/config-default/config-lgsm/vpmcserver/_default.cfg
index 8a47f056e..636f23d9a 100644
--- a/lgsm/config-default/config-lgsm/vpmcserver/_default.cfg
+++ b/lgsm/config-default/config-lgsm/vpmcserver/_default.cfg
@@ -54,14 +54,6 @@ iftttalert="off"
 ifttttoken="accesstoken"
 iftttevent="linuxgsm_alert"
 
-# Mailgun Email Alerts | https://docs.linuxgsm.com/alerts/mailgun
-mailgunalert="off"
-mailgunapiregion="us"
-mailguntoken="accesstoken"
-mailgundomain="example.com"
-mailgunemailfrom="alert@example.com"
-mailgunemail="email@myemail.com"
-
 # Pushbullet Alerts | https://docs.linuxgsm.com/alerts/pushbullet
 pushbulletalert="off"
 pushbullettoken="accesstoken"
diff --git a/lgsm/config-default/config-lgsm/vsserver/_default.cfg b/lgsm/config-default/config-lgsm/vsserver/_default.cfg
index e99f063e8..257c98963 100644
--- a/lgsm/config-default/config-lgsm/vsserver/_default.cfg
+++ b/lgsm/config-default/config-lgsm/vsserver/_default.cfg
@@ -54,14 +54,6 @@ iftttalert="off"
 ifttttoken="accesstoken"
 iftttevent="linuxgsm_alert"
 
-# Mailgun Email Alerts | https://docs.linuxgsm.com/alerts/mailgun
-mailgunalert="off"
-mailgunapiregion="us"
-mailguntoken="accesstoken"
-mailgundomain="example.com"
-mailgunemailfrom="alert@example.com"
-mailgunemail="email@myemail.com"
-
 # Pushbullet Alerts | https://docs.linuxgsm.com/alerts/pushbullet
 pushbulletalert="off"
 pushbullettoken="accesstoken"
diff --git a/lgsm/config-default/config-lgsm/wetserver/_default.cfg b/lgsm/config-default/config-lgsm/wetserver/_default.cfg
index 045afb9e0..153a2b1c5 100644
--- a/lgsm/config-default/config-lgsm/wetserver/_default.cfg
+++ b/lgsm/config-default/config-lgsm/wetserver/_default.cfg
@@ -47,14 +47,6 @@ iftttalert="off"
 ifttttoken="accesstoken"
 iftttevent="linuxgsm_alert"
 
-# Mailgun Email Alerts | https://docs.linuxgsm.com/alerts/mailgun
-mailgunalert="off"
-mailgunapiregion="us"
-mailguntoken="accesstoken"
-mailgundomain="example.com"
-mailgunemailfrom="alert@example.com"
-mailgunemail="email@myemail.com"
-
 # Pushbullet Alerts | https://docs.linuxgsm.com/alerts/pushbullet
 pushbulletalert="off"
 pushbullettoken="accesstoken"
diff --git a/lgsm/config-default/config-lgsm/wfserver/_default.cfg b/lgsm/config-default/config-lgsm/wfserver/_default.cfg
index 5924cd8af..80fbe2037 100644
--- a/lgsm/config-default/config-lgsm/wfserver/_default.cfg
+++ b/lgsm/config-default/config-lgsm/wfserver/_default.cfg
@@ -52,14 +52,6 @@ iftttalert="off"
 ifttttoken="accesstoken"
 iftttevent="linuxgsm_alert"
 
-# Mailgun Email Alerts | https://docs.linuxgsm.com/alerts/mailgun
-mailgunalert="off"
-mailgunapiregion="us"
-mailguntoken="accesstoken"
-mailgundomain="example.com"
-mailgunemailfrom="alert@example.com"
-mailgunemail="email@myemail.com"
-
 # Pushbullet Alerts | https://docs.linuxgsm.com/alerts/pushbullet
 pushbulletalert="off"
 pushbullettoken="accesstoken"
diff --git a/lgsm/config-default/config-lgsm/wmcserver/_default.cfg b/lgsm/config-default/config-lgsm/wmcserver/_default.cfg
index 007e5542d..82a398363 100644
--- a/lgsm/config-default/config-lgsm/wmcserver/_default.cfg
+++ b/lgsm/config-default/config-lgsm/wmcserver/_default.cfg
@@ -54,14 +54,6 @@ iftttalert="off"
 ifttttoken="accesstoken"
 iftttevent="linuxgsm_alert"
 
-# Mailgun Email Alerts | https://docs.linuxgsm.com/alerts/mailgun
-mailgunalert="off"
-mailgunapiregion="us"
-mailguntoken="accesstoken"
-mailgundomain="example.com"
-mailgunemailfrom="alert@example.com"
-mailgunemail="email@myemail.com"
-
 # Pushbullet Alerts | https://docs.linuxgsm.com/alerts/pushbullet
 pushbulletalert="off"
 pushbullettoken="accesstoken"
diff --git a/lgsm/config-default/config-lgsm/wurmserver/_default.cfg b/lgsm/config-default/config-lgsm/wurmserver/_default.cfg
index f648abe05..e4ef942d5 100644
--- a/lgsm/config-default/config-lgsm/wurmserver/_default.cfg
+++ b/lgsm/config-default/config-lgsm/wurmserver/_default.cfg
@@ -91,14 +91,6 @@ iftttalert="off"
 ifttttoken="accesstoken"
 iftttevent="linuxgsm_alert"
 
-# Mailgun Email Alerts | https://docs.linuxgsm.com/alerts/mailgun
-mailgunalert="off"
-mailgunapiregion="us"
-mailguntoken="accesstoken"
-mailgundomain="example.com"
-mailgunemailfrom="alert@example.com"
-mailgunemail="email@myemail.com"
-
 # Pushbullet Alerts | https://docs.linuxgsm.com/alerts/pushbullet
 pushbulletalert="off"
 pushbullettoken="accesstoken"
diff --git a/lgsm/config-default/config-lgsm/zmrserver/_default.cfg b/lgsm/config-default/config-lgsm/zmrserver/_default.cfg
index ad5619dae..4de16fd16 100644
--- a/lgsm/config-default/config-lgsm/zmrserver/_default.cfg
+++ b/lgsm/config-default/config-lgsm/zmrserver/_default.cfg
@@ -55,14 +55,6 @@ iftttalert="off"
 ifttttoken="accesstoken"
 iftttevent="linuxgsm_alert"
 
-# Mailgun Email Alerts | https://docs.linuxgsm.com/alerts/mailgun
-mailgunalert="off"
-mailgunapiregion="us"
-mailguntoken="accesstoken"
-mailgundomain="example.com"
-mailgunemailfrom="alert@example.com"
-mailgunemail="email@myemail.com"
-
 # Pushbullet Alerts | https://docs.linuxgsm.com/alerts/pushbullet
 pushbulletalert="off"
 pushbullettoken="accesstoken"
diff --git a/lgsm/config-default/config-lgsm/zpsserver/_default.cfg b/lgsm/config-default/config-lgsm/zpsserver/_default.cfg
index 33ad128cb..0cb900501 100644
--- a/lgsm/config-default/config-lgsm/zpsserver/_default.cfg
+++ b/lgsm/config-default/config-lgsm/zpsserver/_default.cfg
@@ -60,14 +60,6 @@ iftttalert="off"
 ifttttoken="accesstoken"
 iftttevent="linuxgsm_alert"
 
-# Mailgun Email Alerts | https://docs.linuxgsm.com/alerts/mailgun
-mailgunalert="off"
-mailgunapiregion="us"
-mailguntoken="accesstoken"
-mailgundomain="example.com"
-mailgunemailfrom="alert@example.com"
-mailgunemail="email@myemail.com"
-
 # Pushbullet Alerts | https://docs.linuxgsm.com/alerts/pushbullet
 pushbulletalert="off"
 pushbullettoken="accesstoken"
diff --git a/lgsm/modules/alert.sh b/lgsm/modules/alert.sh
index 03d672a66..b8b668ef4 100644
--- a/lgsm/modules/alert.sh
+++ b/lgsm/modules/alert.sh
@@ -178,17 +178,6 @@ elif [ -z "${ifttttoken}" ] && [ "${commandname}" == "TEST-ALERT" ]; then
 	fn_script_error "IFTTT token not set"
 fi
 
-if [ "${mailgunalert}" == "on" ] && [ -n "${mailgunalert}" ]; then
-	alert_mailgun.sh
-elif [ "${mailgunalert}" != "on" ] && [ "${commandname}" == "TEST-ALERT" ]; then
-	fn_print_warn_nl "Mailgun alerts not enabled"
-	fn_script_log_warn "Mailgun alerts not enabled"
-elif [ -z "${mailguntoken}" ] && [ "${commandname}" == "TEST-ALERT" ]; then
-	fn_print_error_nl "Mailgun token not set"
-	echo -e "* https://docs.linuxgsm.com/alerts/mailgun"
-	fn_script_error "Mailgun token not set"
-fi
-
 if [ "${pushbulletalert}" == "on" ] && [ -n "${pushbullettoken}" ]; then
 	alert_pushbullet.sh
 elif [ "${pushbulletalert}" != "on" ] && [ "${commandname}" == "TEST-ALERT" ]; then
diff --git a/lgsm/modules/alert_mailgun.sh b/lgsm/modules/alert_mailgun.sh
deleted file mode 100644
index a25c82648..000000000
--- a/lgsm/modules/alert_mailgun.sh
+++ /dev/null
@@ -1,32 +0,0 @@
-#!/bin/bash
-# LinuxGSM alert_mailgun.sh module
-# Author: Daniel Gibbs
-# Contributors: http://linuxgsm.com/contrib
-# Website: https://linuxgsm.com
-# Description: Sends Mailgun Email alert.
-
-moduleselfname="$(basename "$(readlink -f "${BASH_SOURCE[0]}")")"
-
-if [ "${mailgunapiregion}" == "eu" ]; then
-	mailgunapiurl="https://api.eu.mailgun.net"
-else
-	mailgunapiurl="https://api.mailgun.net"
-fi
-
-fn_print_dots "Sending Email alert: Mailgun: ${mailgunemail}"
-
-mailgunsend=$(curl --connect-timeout 10 -s --user "api:${mailguntoken}" \
-	-F from="LinuxGSM <${mailgunemailfrom}>" \
-	-F to="LinuxGSM Admin <${mailgunemail}>" \
-	-F subject="${alertemoji} ${alertsubject} ${alertemoji}" \
-	-F o:tag='alert' \
-	-F o:tag='LinuxGSM' \
-	-F text="$(cat "${alertlog}")" "${mailgunapiurl}/v3/${mailgundomain}/messages")
-
-if [ -z "${mailgunsend}" ]; then
-	fn_print_fail_nl "Sending Email alert: Mailgun: ${mailgunemail}"
-	fn_script_log_fatal "Sending Email alert: Mailgun: ${mailgunemail}"
-else
-	fn_print_ok_nl "Sending Email alert: Mailgun: ${mailgunemail}"
-	fn_script_log_pass "Sending Email alert: Mailgun: ${mailgunemail}"
-fi
diff --git a/lgsm/modules/core_functions.sh b/lgsm/modules/core_functions.sh
index c0195b249..09eedeb7b 100644
--- a/lgsm/modules/core_functions.sh
+++ b/lgsm/modules/core_functions.sh
@@ -565,11 +565,6 @@ alert_ifttt.sh() {
 	fn_fetch_function
 }
 
-alert_mailgun.sh() {
-	functionfile="${FUNCNAME[0]}"
-	fn_fetch_function
-}
-
 alert_pushbullet.sh() {
 	functionfile="${FUNCNAME[0]}"
 	fn_fetch_function
diff --git a/lgsm/modules/core_modules.sh b/lgsm/modules/core_modules.sh
index d03102ef5..c2b529741 100644
--- a/lgsm/modules/core_modules.sh
+++ b/lgsm/modules/core_modules.sh
@@ -575,11 +575,6 @@ alert_ifttt.sh() {
 	fn_fetch_module
 }
 
-alert_mailgun.sh() {
-	modulefile="${FUNCNAME[0]}"
-	fn_fetch_module
-}
-
 alert_pushbullet.sh() {
 	modulefile="${FUNCNAME[0]}"
 	fn_fetch_module
diff --git a/lgsm/modules/info_stats.sh b/lgsm/modules/info_stats.sh
index 965e3898e..8f0119532 100644
--- a/lgsm/modules/info_stats.sh
+++ b/lgsm/modules/info_stats.sh
@@ -87,8 +87,8 @@ payload="{
 	]
 }"
 
-fn_alert_payload(){
-alertpayload="{
+fn_alert_payload() {
+	alertpayload="{
 	\"client_id\": \"${uuidinstance}\",
 	\"events\": [
 		{
@@ -123,11 +123,6 @@ if [ "${iftttalert}" == "on" ]; then
 	fn_alert_payload
 	curl -X POST "https://www.google-analytics.com/mp/collect?api_secret=${apisecret}&measurement_id=${measurementid}" -H "Content-Type: application/json" -d "${alertpayload}"
 fi
-if [ "${mailgunalert}" == "on" ]; then
-	alerttype="mailgun"
-	fn_alert_payload
-	curl -X POST "https://www.google-analytics.com/mp/collect?api_secret=${apisecret}&measurement_id=${measurementid}" -H "Content-Type: application/json" -d "${alertpayload}"
-fi
 if [ "${pushbulletalert}" == "on" ]; then
 	alerttype="pushbullet"
 	fn_alert_payload
diff --git a/tests/tests_defaultcfg/defaultcfg_1.txt b/tests/tests_defaultcfg/defaultcfg_1.txt
index aa5b8a207..63b888f9d 100644
--- a/tests/tests_defaultcfg/defaultcfg_1.txt
+++ b/tests/tests_defaultcfg/defaultcfg_1.txt
@@ -15,7 +15,6 @@
 # Discord Alerts | https://docs.linuxgsm.com/alerts/discord
 # Email Alerts | https://docs.linuxgsm.com/alerts/email
 # IFTTT Alerts | https://docs.linuxgsm.com/alerts/ifttt
-# Mailgun Email Alerts | https://docs.linuxgsm.com/alerts/mailgun
 # Pushbullet Alerts | https://docs.linuxgsm.com/alerts/pushbullet
 # Pushover Alerts | https://docs.linuxgsm.com/alerts/pushover
 # Slack Alerts | https://docs.linuxgsm.com/alerts/slack

From e0b77391bc9c11c779d2ccca874fb6e967b6650e Mon Sep 17 00:00:00 2001
From: Daniel Gibbs <me@danielgibbs.co.uk>
Date: Sat, 7 Oct 2023 23:06:09 +0100
Subject: [PATCH 002/154] feat: various UI changes (#4326)

* refactor: remove unnecessary comments in default server configurations

The commit removes unnecessary comments from the default server configurations. The comments were providing instructions to edit the configuration files with care, but they are not needed and can be safely removed.

* refactor: update server names in default configuration files

- Updated the servername value in multiple default configuration files to "LinuxGSM" for consistency.
- Refactored the code to reflect the changes made.

* refactor: rename fn_script_log_fatal to fn_script_log_faail

to create more consistency with naming

* feat: improve console output formatting

- Added separator function to improve readability of console output.
- Replaced multiple instances of manual separators with the new function.
- Updated commit message to follow conventional commit standard.

* refactor: remove unnecessary fn_sleep_time calls

This commit removes the fn_sleep_time function calls that are no longer needed in multiple modules. The fn_sleep_time function was used to introduce a delay, but it is no longer necessary for the current implementation.

* better standardise random

* removed bold where not required
---
 .../config-lgsm/dstserver/_default.cfg        |  1 -
 .../config-lgsm/hwserver/_default.cfg         |  2 +-
 .../config-lgsm/inssserver/_default.cfg       |  2 +-
 .../config-lgsm/loserver/_default.cfg         |  2 +-
 .../config-lgsm/mtaserver/_default.cfg        |  1 -
 .../config-lgsm/ns2cserver/_default.cfg       |  2 +-
 .../config-lgsm/ns2server/_default.cfg        |  2 +-
 .../config-lgsm/rustserver/_default.cfg       |  2 +-
 .../config-lgsm/sbotsserver/_default.cfg      |  2 +-
 .../config-lgsm/stnserver/_default.cfg        |  2 +-
 .../config-lgsm/stserver/_default.cfg         |  1 -
 .../config-lgsm/vhserver/_default.cfg         |  2 +-
 lgsm/modules/alert_discord.sh                 |  2 +-
 lgsm/modules/alert_email.sh                   |  3 +-
 lgsm/modules/alert_gotify.sh                  |  2 +-
 lgsm/modules/alert_ifttt.sh                   |  2 +-
 lgsm/modules/alert_pushbullet.sh              |  2 +-
 lgsm/modules/alert_pushover.sh                |  2 +-
 lgsm/modules/alert_rocketchat.sh              |  2 +-
 lgsm/modules/alert_slack.sh                   |  2 +-
 lgsm/modules/alert_telegram.sh                |  2 +-
 lgsm/modules/check_config.sh                  |  4 +-
 lgsm/modules/check_deps.sh                    | 14 +++--
 lgsm/modules/check_executable.sh              |  2 +-
 lgsm/modules/check_permissions.sh             |  8 +--
 lgsm/modules/check_root.sh                    |  2 +-
 lgsm/modules/check_system_dir.sh              |  4 +-
 lgsm/modules/check_tmuxception.sh             |  4 +-
 lgsm/modules/command_backup.sh                | 10 ++--
 lgsm/modules/command_debug.sh                 |  2 +-
 lgsm/modules/command_dev_clear_modules.sh     |  6 +--
 lgsm/modules/command_dev_details.sh           | 10 ++--
 lgsm/modules/command_dev_detect_deps.sh       | 20 ++++----
 lgsm/modules/command_dev_detect_glibc.sh      | 10 ++--
 lgsm/modules/command_dev_detect_ldd.sh        |  8 +--
 lgsm/modules/command_dev_query_raw.sh         | 20 ++++----
 lgsm/modules/command_fastdl.sh                | 30 +++++------
 lgsm/modules/command_install_resources_mta.sh |  2 +-
 lgsm/modules/command_mods_install.sh          |  6 +--
 lgsm/modules/command_mods_remove.sh           |  8 +--
 lgsm/modules/command_mods_update.sh           |  2 +-
 lgsm/modules/command_monitor.sh               |  2 +-
 lgsm/modules/command_skeleton.sh              |  2 +-
 lgsm/modules/command_sponsor.sh               |  2 +-
 lgsm/modules/command_start.sh                 | 10 ++--
 lgsm/modules/command_stop.sh                  |  2 +-
 lgsm/modules/command_update_linuxgsm.sh       | 20 ++++----
 lgsm/modules/core_dl.sh                       | 33 ++++++------
 lgsm/modules/core_exit.sh                     |  2 +-
 lgsm/modules/core_github.sh                   |  6 +--
 lgsm/modules/core_logs.sh                     |  1 -
 lgsm/modules/core_messages.sh                 | 16 ++++--
 lgsm/modules/core_steamcmd.sh                 | 14 ++---
 lgsm/modules/fix.sh                           |  3 +-
 lgsm/modules/fix_av.sh                        |  1 -
 lgsm/modules/fix_kf2.sh                       |  1 -
 lgsm/modules/fix_lo.sh                        |  2 -
 lgsm/modules/fix_mta.sh                       |  1 -
 lgsm/modules/fix_samp.sh                      |  4 +-
 lgsm/modules/fix_ts3.sh                       |  2 +-
 lgsm/modules/fix_ut3.sh                       |  1 -
 lgsm/modules/info_messages.sh                 | 51 ++++++++-----------
 lgsm/modules/install_complete.sh              | 10 ++--
 lgsm/modules/install_config.sh                | 38 +++++++++-----
 lgsm/modules/install_dst_token.sh             |  5 +-
 lgsm/modules/install_eula.sh                  |  5 +-
 lgsm/modules/install_factorio_save.sh         |  5 +-
 lgsm/modules/install_gslt.sh                  |  4 +-
 lgsm/modules/install_header.sh                | 10 ++--
 lgsm/modules/install_logs.sh                  |  5 +-
 lgsm/modules/install_server_dir.sh            |  4 +-
 lgsm/modules/install_server_files.sh          |  9 ++--
 lgsm/modules/install_squad_license.sh         |  5 +-
 lgsm/modules/install_stats.sh                 |  9 ++--
 lgsm/modules/install_steamcmd.sh              |  5 +-
 lgsm/modules/install_ts3db.sh                 | 17 +++----
 lgsm/modules/install_ut2k4_key.sh             |  5 +-
 lgsm/modules/mods_core.sh                     | 42 +++++++--------
 lgsm/modules/update_fctr.sh                   |  4 +-
 lgsm/modules/update_jk2.sh                    |  4 +-
 lgsm/modules/update_mc.sh                     |  4 +-
 lgsm/modules/update_mcb.sh                    | 10 ++--
 lgsm/modules/update_mta.sh                    |  4 +-
 lgsm/modules/update_pmc.sh                    |  4 +-
 lgsm/modules/update_ts3.sh                    |  6 +--
 lgsm/modules/update_ut99.sh                   |  4 +-
 lgsm/modules/update_vints.sh                  |  4 +-
 linuxgsm.sh                                   |  4 +-
 tests/tests_fctrserver.sh                     |  4 +-
 tests/tests_jc2server.sh                      |  4 +-
 tests/tests_mcserver.sh                       |  4 +-
 tests/tests_ts3server.sh                      |  4 +-
 92 files changed, 310 insertions(+), 320 deletions(-)

diff --git a/lgsm/config-default/config-lgsm/dstserver/_default.cfg b/lgsm/config-default/config-lgsm/dstserver/_default.cfg
index 8b404391d..4677162c3 100644
--- a/lgsm/config-default/config-lgsm/dstserver/_default.cfg
+++ b/lgsm/config-default/config-lgsm/dstserver/_default.cfg
@@ -15,7 +15,6 @@ shard="Master"
 cluster="Cluster_1"
 cave="false"
 
-# Edit with care
 persistentstorageroot="${HOME}/.klei"
 confdir="DoNotStarveTogether"
 
diff --git a/lgsm/config-default/config-lgsm/hwserver/_default.cfg b/lgsm/config-default/config-lgsm/hwserver/_default.cfg
index 99b08e358..853a52078 100644
--- a/lgsm/config-default/config-lgsm/hwserver/_default.cfg
+++ b/lgsm/config-default/config-lgsm/hwserver/_default.cfg
@@ -26,7 +26,7 @@ admins=""
 loadsave=""
 
 ## Server Parameters | https://docs.linuxgsm.com/configuration/start-parameters#additional-parameters
-# Edit with care | http://hurtworld.wikia.com/wiki/Hosting_A_Server
+# http://hurtworld.wikia.com/wiki/Hosting_A_Server
 startparameters="-batchmode -nographics -logfile ${gamelog} -exec \"host ${port} ${defaultmap} ${loadsave};queryport ${queryport};maxplayers ${maxplayers};servername ${servername};creativemode ${creativemode};${admins}\""
 
 #### LinuxGSM Settings ####
diff --git a/lgsm/config-default/config-lgsm/inssserver/_default.cfg b/lgsm/config-default/config-lgsm/inssserver/_default.cfg
index 6a7313c7b..117ddbff8 100644
--- a/lgsm/config-default/config-lgsm/inssserver/_default.cfg
+++ b/lgsm/config-default/config-lgsm/inssserver/_default.cfg
@@ -14,7 +14,7 @@ port="27102"
 queryport="27131"
 rconport="27015"
 rconpassword=""
-servername="LinuxGSM Server"
+servername="LinuxGSM"
 defaultmap="Canyon"
 defaultscenario="Scenario_Crossing_Push_Security"
 maxplayers="28"
diff --git a/lgsm/config-default/config-lgsm/loserver/_default.cfg b/lgsm/config-default/config-lgsm/loserver/_default.cfg
index 5a205d88f..cc2f7b89a 100644
--- a/lgsm/config-default/config-lgsm/loserver/_default.cfg
+++ b/lgsm/config-default/config-lgsm/loserver/_default.cfg
@@ -10,7 +10,7 @@
 
 ## Predefined Parameters | https://docs.linuxgsm.com/configuration/start-parameters
 ## https://docs.linuxgsm.com/game-servers/last-oasis
-servername="${selfname}"
+servername="LinuxGSM"
 ip="0.0.0.0"
 port="7777"
 queryport="27015"
diff --git a/lgsm/config-default/config-lgsm/mtaserver/_default.cfg b/lgsm/config-default/config-lgsm/mtaserver/_default.cfg
index 8397146b8..3af42ea2b 100644
--- a/lgsm/config-default/config-lgsm/mtaserver/_default.cfg
+++ b/lgsm/config-default/config-lgsm/mtaserver/_default.cfg
@@ -12,7 +12,6 @@
 ip="0.0.0.0"
 
 ## Server Parameters | https://docs.linuxgsm.com/configuration/start-parameters#additional-parameters
-# Edit with care
 startparameters=""
 
 #### LinuxGSM Settings ####
diff --git a/lgsm/config-default/config-lgsm/ns2cserver/_default.cfg b/lgsm/config-default/config-lgsm/ns2cserver/_default.cfg
index 4579d3bb0..2ca53a335 100644
--- a/lgsm/config-default/config-lgsm/ns2cserver/_default.cfg
+++ b/lgsm/config-default/config-lgsm/ns2cserver/_default.cfg
@@ -13,7 +13,7 @@ ip="0.0.0.0"
 port="27015"
 defaultmap="co_core"
 maxplayers="24"
-servername="LinuxGSM Server"
+servername="LinuxGSM"
 httpuser="admin"
 httppassword="admin"
 httpport="8080"
diff --git a/lgsm/config-default/config-lgsm/ns2server/_default.cfg b/lgsm/config-default/config-lgsm/ns2server/_default.cfg
index 9f09491cf..3ee3a0514 100644
--- a/lgsm/config-default/config-lgsm/ns2server/_default.cfg
+++ b/lgsm/config-default/config-lgsm/ns2server/_default.cfg
@@ -13,7 +13,7 @@ ip="0.0.0.0"
 port="27015"
 defaultmap="ns2_summit"
 maxplayers="24"
-servername="LinuxGSM Server"
+servername="LinuxGSM"
 httpuser="admin"
 httppassword="admin"
 httpport="8080"
diff --git a/lgsm/config-default/config-lgsm/rustserver/_default.cfg b/lgsm/config-default/config-lgsm/rustserver/_default.cfg
index fc955a94a..9a4bfe147 100644
--- a/lgsm/config-default/config-lgsm/rustserver/_default.cfg
+++ b/lgsm/config-default/config-lgsm/rustserver/_default.cfg
@@ -16,7 +16,7 @@ appport="28082"
 queryport="28017"
 rconpassword="CHANGE_ME"
 rconweb="1" # values: Facepunch web panel, Rustadmin desktop and Rustadmin Online = 1, Rusty = 0.
-servername="Rust"
+servername="LinuxGSM"
 gamemode="vanilla"           # values: vanilla, softcore ( Doc: https://wiki.facepunch.com/rust/server-gamemodes )
 serverlevel="Procedural Map" # values: Procedural Map, Barren, HapisIsland, SavasIsland
 customlevelurl=""            # Custom level url. +server.levelurl \"${customlevelurl}\"
diff --git a/lgsm/config-default/config-lgsm/sbotsserver/_default.cfg b/lgsm/config-default/config-lgsm/sbotsserver/_default.cfg
index 0107c39d5..e5fe5b5d8 100644
--- a/lgsm/config-default/config-lgsm/sbotsserver/_default.cfg
+++ b/lgsm/config-default/config-lgsm/sbotsserver/_default.cfg
@@ -12,7 +12,7 @@
 port="7777"
 queryport="27015"
 defaultmap="StationKappa"
-servername="LinuxGSM Server"
+servername="LinuxGSM"
 
 ## Server Parameters | https://docs.linuxgsm.com/configuration/start-parameters#additional-parameters
 startparameters="Port=${port}?QueryPort=${queryport} -startup_map ${defaultmap} -server_name \"${servername}\""
diff --git a/lgsm/config-default/config-lgsm/stnserver/_default.cfg b/lgsm/config-default/config-lgsm/stnserver/_default.cfg
index 8531c111b..3e5f97c7b 100644
--- a/lgsm/config-default/config-lgsm/stnserver/_default.cfg
+++ b/lgsm/config-default/config-lgsm/stnserver/_default.cfg
@@ -12,7 +12,7 @@ maxplayers="20"
 region="0"
 
 ## Server Parameters | https://docs.linuxgsm.com/configuration/start-parameters#additional-parameters
-# Edit with care | https://colonysurvival.gamepedia.com/Dedicated_Server#Installation_.28Linux.29
+# https://colonysurvival.gamepedia.com/Dedicated_Server#Installation_.28Linux.29
 startparameters="-mc ${maxplayers} -r ${region}"
 
 #### LinuxGSM Settings ####
diff --git a/lgsm/config-default/config-lgsm/stserver/_default.cfg b/lgsm/config-default/config-lgsm/stserver/_default.cfg
index 0d8f9317f..980c4e045 100644
--- a/lgsm/config-default/config-lgsm/stserver/_default.cfg
+++ b/lgsm/config-default/config-lgsm/stserver/_default.cfg
@@ -13,7 +13,6 @@ worldname="moon_save"
 worldtype="Moon"
 
 ## Server Parameters | https://docs.linuxgsm.com/configuration/start-parameters#additional-parameters
-# Edit with care
 startparameters="-LOADLATEST ${worldname} ${worldtype}"
 
 #### LinuxGSM Settings ####
diff --git a/lgsm/config-default/config-lgsm/vhserver/_default.cfg b/lgsm/config-default/config-lgsm/vhserver/_default.cfg
index f0eb4cf8e..ce90a2b07 100644
--- a/lgsm/config-default/config-lgsm/vhserver/_default.cfg
+++ b/lgsm/config-default/config-lgsm/vhserver/_default.cfg
@@ -9,7 +9,7 @@
 #### Game Server Settings ####
 
 ## Predefined Parameters | https://docs.linuxgsm.com/configuration/start-parameters
-servername="Valheim Server"
+servername="LinuxGSM"
 # Minimum password length is 5.
 serverpassword=""
 port="2456"
diff --git a/lgsm/modules/alert_discord.sh b/lgsm/modules/alert_discord.sh
index a384de3db..f3a79416a 100644
--- a/lgsm/modules/alert_discord.sh
+++ b/lgsm/modules/alert_discord.sh
@@ -52,7 +52,7 @@ discordsend=$(curl --connect-timeout 10 -sSL -H "Content-Type: application/json"
 
 if [ -n "${discordsend}" ]; then
 	fn_print_fail_nl "Sending Discord alert: ${discordsend}"
-	fn_script_log_fatal "Sending Discord alert: ${discordsend}"
+	fn_script_log_fail "Sending Discord alert: ${discordsend}"
 else
 	fn_print_ok_nl "Sending Discord alert"
 	fn_script_log_pass "Sending Discord alert"
diff --git a/lgsm/modules/alert_email.sh b/lgsm/modules/alert_email.sh
index e2cf5f123..0aca09fef 100644
--- a/lgsm/modules/alert_email.sh
+++ b/lgsm/modules/alert_email.sh
@@ -8,7 +8,6 @@
 moduleselfname="$(basename "$(readlink -f "${BASH_SOURCE[0]}")")"
 
 fn_print_dots "Sending Email alert: ${email}"
-fn_sleep_time
 
 if [ -n "${emailfrom}" ]; then
 	mail -s "${alertsubject}" -r "${emailfrom}" "${email}" < "${alertlog}"
@@ -21,5 +20,5 @@ if [ "${exitcode}" == "0" ]; then
 	fn_script_log_pass "Sending Email alert: ${email}"
 else
 	fn_print_fail_nl "Sending Email alert: ${email}"
-	fn_script_log_fatal "Sending Email alert: ${email}"
+	fn_script_log_fail "Sending Email alert: ${email}"
 fi
diff --git a/lgsm/modules/alert_gotify.sh b/lgsm/modules/alert_gotify.sh
index ef833ba75..27e4d3439 100644
--- a/lgsm/modules/alert_gotify.sh
+++ b/lgsm/modules/alert_gotify.sh
@@ -26,5 +26,5 @@ if [ -n "${gotifysend}" ]; then
 	fn_script_log_pass "Sending Gotify alert"
 else
 	fn_print_fail_nl "Sending Gotify alert: ${gotifysend}"
-	fn_script_log_fatal "Sending Gotify alert: ${gotifysend}"
+	fn_script_log_fail "Sending Gotify alert: ${gotifysend}"
 fi
diff --git a/lgsm/modules/alert_ifttt.sh b/lgsm/modules/alert_ifttt.sh
index ae0de8ed6..c1ccfc9cb 100644
--- a/lgsm/modules/alert_ifttt.sh
+++ b/lgsm/modules/alert_ifttt.sh
@@ -22,7 +22,7 @@ iftttsend=$(curl --connect-timeout 10 -sSL -H "Content-Type: application/json" -
 
 if [ -n "${iftttsend}" ]; then
 	fn_print_fail_nl "Sending IFTTT alert: ${pushbulletsend}"
-	fn_script_log_fatal "Sending IFTTT alert: ${pushbulletsend}"
+	fn_script_log_fail "Sending IFTTT alert: ${pushbulletsend}"
 else
 	fn_print_ok_nl "Sending IFTTT alert"
 	fn_script_log_pass "Sent IFTTT alert"
diff --git a/lgsm/modules/alert_pushbullet.sh b/lgsm/modules/alert_pushbullet.sh
index eec141611..3bcd6141b 100644
--- a/lgsm/modules/alert_pushbullet.sh
+++ b/lgsm/modules/alert_pushbullet.sh
@@ -23,7 +23,7 @@ pushbulletsend=$(curl --connect-timeout 10 -sSL -u """${pushbullettoken}"":" -H
 
 if [ -n "${pushbulletsend}" ]; then
 	fn_print_fail_nl "Sending Pushbullet alert: ${pushbulletsend}"
-	fn_script_log_fatal "Sending Pushbullet alert: ${pushbulletsend}"
+	fn_script_log_fail "Sending Pushbullet alert: ${pushbulletsend}"
 else
 	fn_print_ok_nl "Sending Pushbullet alert"
 	fn_script_log_pass "Sent Pushbullet alert"
diff --git a/lgsm/modules/alert_pushover.sh b/lgsm/modules/alert_pushover.sh
index 608e73c30..35229094a 100644
--- a/lgsm/modules/alert_pushover.sh
+++ b/lgsm/modules/alert_pushover.sh
@@ -26,7 +26,7 @@ pushoversend=$(curl --connect-timeout 10 -sS -F token="${pushovertoken}" -F user
 
 if [ -n "${pushoversend}" ]; then
 	fn_print_fail_nl "Sending Pushover alert: ${pushoversend}"
-	fn_script_log_fatal "Sending Pushover alert: ${pushoversend}"
+	fn_script_log_fail "Sending Pushover alert: ${pushoversend}"
 else
 	fn_print_ok_nl "Sending Pushover alert"
 	fn_script_log_pass "Sent Pushover alert"
diff --git a/lgsm/modules/alert_rocketchat.sh b/lgsm/modules/alert_rocketchat.sh
index 875a6ff5d..f6e410ef8 100644
--- a/lgsm/modules/alert_rocketchat.sh
+++ b/lgsm/modules/alert_rocketchat.sh
@@ -46,5 +46,5 @@ if [ -n "${rocketchatsend}" ]; then
 	fn_script_log_pass "Sending Rocketchat alert"
 else
 	fn_print_fail_nl "Sending Rocketchat alert: ${rocketchatsend}"
-	fn_script_log_fatal "Sending Rocketchat alert: ${rocketchatsend}"
+	fn_script_log_fail "Sending Rocketchat alert: ${rocketchatsend}"
 fi
diff --git a/lgsm/modules/alert_slack.sh b/lgsm/modules/alert_slack.sh
index 3bb148828..f83df9510 100644
--- a/lgsm/modules/alert_slack.sh
+++ b/lgsm/modules/alert_slack.sh
@@ -71,5 +71,5 @@ if [ "${slacksend}" == "ok" ]; then
 	fn_script_log_pass "Sending Slack alert"
 else
 	fn_print_fail_nl "Sending Slack alert: ${slacksend}"
-	fn_script_log_fatal "Sending Slack alert: ${slacksend}"
+	fn_script_log_fail "Sending Slack alert: ${slacksend}"
 fi
diff --git a/lgsm/modules/alert_telegram.sh b/lgsm/modules/alert_telegram.sh
index 77b89560c..d2e72346a 100644
--- a/lgsm/modules/alert_telegram.sh
+++ b/lgsm/modules/alert_telegram.sh
@@ -23,7 +23,7 @@ telegramsend=$(curl --connect-timeout 10 -sSL -H "Content-Type: application/json
 
 if [ -n "${telegramsend}" ]; then
 	fn_print_fail_nl "Sending Telegram alert: ${telegramsend}"
-	fn_script_log_fatal "Sending Telegram alert: ${telegramsend}"
+	fn_script_log_fail "Sending Telegram alert: ${telegramsend}"
 else
 	fn_print_ok_nl "Sending Telegram alert"
 	fn_script_log_pass "Sent Telegram alert"
diff --git a/lgsm/modules/check_config.sh b/lgsm/modules/check_config.sh
index 4f96a8db4..436740afa 100644
--- a/lgsm/modules/check_config.sh
+++ b/lgsm/modules/check_config.sh
@@ -28,8 +28,8 @@ fi
 
 if [ "${shortname}" == "vh" ] && [ -z "${serverpassword}" ]; then
 	fn_print_fail_nl "serverpassword is not set"
-	fn_script_log_fatal "serverpassword is not set"
+	fn_script_log_fail "serverpassword is not set"
 elif [ "${shortname}" == "vh" ] && [ "${#serverpassword}" -le "4" ]; then
 	fn_print_fail_nl "serverpassword is to short (min 5 chars)"
-	fn_script_log_fatal "serverpassword is to short (min 5 chars)"
+	fn_script_log_fail "serverpassword is to short (min 5 chars)"
 fi
diff --git a/lgsm/modules/check_deps.sh b/lgsm/modules/check_deps.sh
index 2818ffc11..d10948ca5 100644
--- a/lgsm/modules/check_deps.sh
+++ b/lgsm/modules/check_deps.sh
@@ -80,7 +80,7 @@ fn_install_mono_repo() {
 		if [ "${monoautoinstall}" != "1" ]; then
 			if [ $? != 0 ]; then
 				fn_print_failure_nl "Unable to install Mono repository."
-				fn_script_log_fatal "Unable to install Mono repository."
+				fn_script_log_fail "Unable to install Mono repository."
 			else
 				fn_print_complete_nl "Installing Mono repository completed."
 				fn_script_log_pass "Installing Mono repository completed."
@@ -138,7 +138,6 @@ fn_install_missing_deps() {
 			fn_print_warn "Missing dependencies: ${red}${array_deps_missing[*]}${default}"
 			fn_script_log_warn "Missing dependencies: ${array_deps_missing[*]}"
 		fi
-		fn_sleep_time
 
 		# Attempt automatic dependency installation
 		if [ "${autoinstall}" == "1" ]; then
@@ -216,7 +215,7 @@ fn_install_missing_deps() {
 		if [ "${steamcmdfail}" ]; then
 			if [ "${commandname}" == "INSTALL" ]; then
 				fn_print_failure_nl "Missing dependencies required to run SteamCMD."
-				fn_script_log_fatal "Missing dependencies required to run SteamCMD."
+				fn_script_log_fail "Missing dependencies required to run SteamCMD."
 				core_exit.sh
 			else
 				fn_print_error_nl "Missing dependencies required to run SteamCMD."
@@ -336,15 +335,14 @@ fn_deps_detector() {
 if [ "${commandname}" == "INSTALL" ]; then
 	if [ "$(whoami)" == "root" ]; then
 		echo -e ""
-		echo -e "${lightyellow}Checking Dependencies as root${default}"
-		echo -e "================================="
+		echo -e "${bold}${lightyellow}Checking ${gamename} Dependencies as root${default}"
+		fn_messages_separator
 		fn_print_information_nl "Checking any missing dependencies for ${gamename} server only."
 		fn_print_information_nl "This will NOT install a ${gamename} server."
-		fn_sleep_time
 	else
 		echo -e ""
-		echo -e "${lightyellow}Checking Dependencies${default}"
-		echo -e "================================="
+		echo -e "${bold}${lightyellow}Checking ${gamename} Dependencies${default}"
+		fn_messages_separator
 	fi
 fi
 
diff --git a/lgsm/modules/check_executable.sh b/lgsm/modules/check_executable.sh
index 6c8feab2a..91db68f1a 100644
--- a/lgsm/modules/check_executable.sh
+++ b/lgsm/modules/check_executable.sh
@@ -20,7 +20,7 @@ if [ ! -f "${executabledir}/${execname}" ]; then
 	fn_print_fail_nl "executable was not found"
 	echo -e "* ${executabledir}/${execname}"
 	if [ -d "${lgsmlogdir}" ]; then
-		fn_script_log_fatal "Executable was not found: ${executabledir}/${execname}"
+		fn_script_log_fail "Executable was not found: ${executabledir}/${execname}"
 	fi
 	unset exitbypass
 	core_exit.sh
diff --git a/lgsm/modules/check_permissions.sh b/lgsm/modules/check_permissions.sh
index d582e5f24..a6a37ce5c 100644
--- a/lgsm/modules/check_permissions.sh
+++ b/lgsm/modules/check_permissions.sh
@@ -25,7 +25,7 @@ fn_check_ownership() {
 	fi
 	if [ "${selfownissue}" == "1" ] || [ "${funcownissue}" == "1" ] || [ "${filesownissue}" == "1" ]; then
 		fn_print_fail_nl "Ownership issues found"
-		fn_script_log_fatal "Ownership issues found"
+		fn_script_log_fail "Ownership issues found"
 		fn_print_information_nl "The current user ($(whoami)) does not have ownership of the following files:"
 		fn_script_log_info "The current user ($(whoami)) does not have ownership of the following files:"
 		{
@@ -56,7 +56,7 @@ fn_check_permissions() {
 	if [ -d "${modulesdir}" ]; then
 		if [ "$(find "${modulesdir}" -type f -not -executable | wc -l)" -ne "0" ]; then
 			fn_print_fail_nl "Permissions issues found"
-			fn_script_log_fatal "Permissions issues found"
+			fn_script_log_fail "Permissions issues found"
 			fn_print_information_nl "The following files are not executable:"
 			fn_script_log_info "The following files are not executable:"
 			{
@@ -80,7 +80,7 @@ fn_check_permissions() {
 		grouprootdirperm="${rootdirperm:1:1}"
 		if [ "${userrootdirperm}" != "7" ] && [ "${grouprootdirperm}" != "7" ]; then
 			fn_print_fail_nl "Permissions issues found"
-			fn_script_log_fatal "Permissions issues found"
+			fn_script_log_fail "Permissions issues found"
 			fn_print_information_nl "The following directory does not have the correct permissions:"
 			fn_script_log_info "The following directory does not have the correct permissions:"
 			fn_script_log_info "${rootdir}"
@@ -198,7 +198,7 @@ fn_sys_perm_errors_fix() {
 		if [ "${sysdirpermerror}" == "1" ] || [ "${classdirpermerror}" == "1" ] || [ "${netdirpermerror}" == "1" ]; then
 			fn_print_error "Could not fix /sys permissions"
 			fn_script_log_error "Could not fix /sys permissions."
-			fn_sleep_time
+
 			# Show the user how to fix.
 			fn_sys_perm_fix_manually_msg
 		else
diff --git a/lgsm/modules/check_root.sh b/lgsm/modules/check_root.sh
index 063a2b0d3..81115394a 100644
--- a/lgsm/modules/check_root.sh
+++ b/lgsm/modules/check_root.sh
@@ -11,7 +11,7 @@ if [ "$(whoami)" == "root" ]; then
 	if [ "${commandname}" != "INSTALL" ]; then
 		fn_print_fail_nl "Do NOT run this script as root!"
 		if [ -d "${lgsmlogdir}" ]; then
-			fn_script_log_fatal "${selfname} attempted to run as root."
+			fn_script_log_fail "${selfname} attempted to run as root."
 		else
 			# Forces exit code is log does not yet exist.
 			exitcode=1
diff --git a/lgsm/modules/check_system_dir.sh b/lgsm/modules/check_system_dir.sh
index 162037861..01c643748 100644
--- a/lgsm/modules/check_system_dir.sh
+++ b/lgsm/modules/check_system_dir.sh
@@ -10,7 +10,7 @@ moduleselfname="$(basename "$(readlink -f "${BASH_SOURCE[0]}")")"
 if [ ! -d "${serverfiles}" ]; then
 	fn_print_fail_nl "Cannot access ${serverfiles}: No such directory"
 	if [ -d "${lgsmlogdir}" ]; then
-		fn_script_log_fatal "Cannot access ${serverfiles}: No such directory."
+		fn_script_log_fail "Cannot access ${serverfiles}: No such directory."
 	fi
 	core_exit.sh
 fi
@@ -18,7 +18,7 @@ fi
 if [ ! -d "${systemdir}" ]; then
 	fn_print_fail_nl "Cannot access ${systemdir}: No such directory"
 	if [ -d "${lgsmlogdir}" ]; then
-		fn_script_log_fatal "Cannot access ${systemdir}: No such directory."
+		fn_script_log_fail "Cannot access ${systemdir}: No such directory."
 	fi
 	core_exit.sh
 fi
diff --git a/lgsm/modules/check_tmuxception.sh b/lgsm/modules/check_tmuxception.sh
index aded5cb2d..8f1f94c73 100644
--- a/lgsm/modules/check_tmuxception.sh
+++ b/lgsm/modules/check_tmuxception.sh
@@ -10,7 +10,7 @@ moduleselfname="$(basename "$(readlink -f "${BASH_SOURCE[0]}")")"
 fn_check_is_in_tmux() {
 	if [ "${TMUX}" ]; then
 		fn_print_fail_nl "tmuxception error: Sorry Cobb you cannot start a tmux session inside of a tmux session."
-		fn_script_log_fatal "Tmuxception error: Attempted to start a tmux session inside of a tmux session."
+		fn_script_log_fail "Tmuxception error: Attempted to start a tmux session inside of a tmux session."
 		fn_print_information_nl "LinuxGSM creates a tmux session when starting the server."
 		echo -e "It is not possible to run a tmux session inside another tmux session"
 		echo -e "https://docs.linuxgsm.com/requirements/tmux#tmuxception"
@@ -21,7 +21,7 @@ fn_check_is_in_tmux() {
 fn_check_is_in_screen() {
 	if [ "${STY}" ]; then
 		fn_print_fail_nl "tmuxception error: Sorry Cobb you cannot start a tmux session inside of a screen session."
-		fn_script_log_fatal "Tmuxception error: Attempted to start a tmux session inside of a screen session."
+		fn_script_log_fail "Tmuxception error: Attempted to start a tmux session inside of a screen session."
 		fn_print_information_nl "LinuxGSM creates a tmux session when starting the server."
 		echo -e "It is not possible to run a tmux session inside screen session"
 		echo -e "https://docs.linuxgsm.com/requirements/tmux#tmuxception"
diff --git a/lgsm/modules/command_backup.sh b/lgsm/modules/command_backup.sh
index b63c82625..16223c914 100644
--- a/lgsm/modules/command_backup.sh
+++ b/lgsm/modules/command_backup.sh
@@ -148,7 +148,7 @@ fn_backup_compression() {
 	# Check that excludedir is a valid path.
 	if [ ! -d "${excludedir}" ]; then
 		fn_print_fail_nl "Problem identifying the previous backup directory for exclusion."
-		fn_script_log_fatal "Problem identifying the previous backup directory for exclusion"
+		fn_script_log_fail "Problem identifying the previous backup directory for exclusion"
 		core_exit.sh
 	fi
 
@@ -156,10 +156,10 @@ fn_backup_compression() {
 	local exitcode=$?
 	if [ "${exitcode}" != 0 ]; then
 		fn_print_fail_eol
-		fn_script_log_fatal "Backup in progress: FAIL"
+		fn_script_log_fail "Backup in progress: FAIL"
 		echo -e "${extractcmd}" | tee -a "${lgsmlog}"
 		fn_print_fail_nl "Starting backup"
-		fn_script_log_fatal "Starting backup"
+		fn_script_log_fail "Starting backup"
 	else
 		fn_print_ok_eol
 		fn_print_ok_nl "Completed: ${backupname}.tar.gz, total size $(du -sh "${backupdir}/${backupname}.tar.gz" | awk '{print $1}')"
@@ -217,7 +217,7 @@ fn_backup_relpath() {
 	declare -a rdirtoks=($(readlink -f "${rootdir}" | sed "s/\// /g"))
 	if [ ${#rdirtoks[@]} -eq 0 ]; then
 		fn_print_fail_nl "Problem assessing rootdir during relative path assessment"
-		fn_script_log_fatal "Problem assessing rootdir during relative path assessment: ${rootdir}"
+		fn_script_log_fail "Problem assessing rootdir during relative path assessment: ${rootdir}"
 		core_exit.sh
 	fi
 
@@ -225,7 +225,7 @@ fn_backup_relpath() {
 	declare -a bdirtoks=($(readlink -f "${backupdir}" | sed "s/\// /g"))
 	if [ ${#bdirtoks[@]} -eq 0 ]; then
 		fn_print_fail_nl "Problem assessing backupdir during relative path assessment"
-		fn_script_log_fatal "Problem assessing backupdir during relative path assessment: ${rootdir}"
+		fn_script_log_fail "Problem assessing backupdir during relative path assessment: ${rootdir}"
 		core_exit.sh
 	fi
 
diff --git a/lgsm/modules/command_debug.sh b/lgsm/modules/command_debug.sh
index 41722e507..495417c16 100644
--- a/lgsm/modules/command_debug.sh
+++ b/lgsm/modules/command_debug.sh
@@ -82,7 +82,7 @@ echo -e ""
 echo -e "Use debug for identifying server issues only!"
 echo -e "Press CTRL+c to drop out of debug mode."
 fn_print_warning_nl "If ${selfname} is already running it will be stopped."
-echo -e ""
+
 if ! fn_prompt_yn "Continue?" Y; then
 	exitcode=0
 	core_exit.sh
diff --git a/lgsm/modules/command_dev_clear_modules.sh b/lgsm/modules/command_dev_clear_modules.sh
index 52d07ee1a..bf19b2578 100644
--- a/lgsm/modules/command_dev_clear_modules.sh
+++ b/lgsm/modules/command_dev_clear_modules.sh
@@ -10,9 +10,9 @@ commandaction="Clearing modules"
 moduleselfname="$(basename "$(readlink -f "${BASH_SOURCE[0]}")")"
 fn_firstcommand_set
 
-echo -e "================================="
-echo -e "Clear Modules"
-echo -e "================================="
+echo -e ""
+echo -e "${bold}${lightyellow}Clear Modules${default}"
+fn_messages_separator
 echo -e ""
 if fn_prompt_yn "Do you want to delete all modules?" Y; then
 	rm -rfv "${modulesdir:?}/"*
diff --git a/lgsm/modules/command_dev_details.sh b/lgsm/modules/command_dev_details.sh
index b95418121..2659465d3 100644
--- a/lgsm/modules/command_dev_details.sh
+++ b/lgsm/modules/command_dev_details.sh
@@ -17,8 +17,8 @@ info_game.sh
 carriagereturn=$(file -b "${servercfgfullpath}" | grep -q CRLF && echo "${red}CRLF${default}" || echo "${lightgreen}LF${default}")
 
 echo -e ""
-echo -e "${lightgreen}Server Details${default}"
-echo -e "=================================================================="
+echo -e "${bold}${lightgreen}Server Details${default}"
+fn_messages_separator
 echo -e ""
 
 echo -e "Game: ${gamename}"
@@ -76,8 +76,8 @@ missing_details=""
 
 # Loop through the server details and output them.
 echo -e ""
-echo -e "${lightgreen}Available Server Details${default}"
-echo -e "================================="
+echo -e "${bold}${lightgreen}Available Server Details${default}"
+fn_messages_separator
 for key in "${!server_details[@]}"; do
 	value=${server_details[$key]}
 	if [ -z "$value" ]; then
@@ -91,7 +91,7 @@ done
 if [ -n "$missing_details" ]; then
 	echo -e ""
 	echo -e "${lightgreen}Missing Server Details${default}"
-	echo -e "================================="
+	fn_messages_separator
 	echo -e "${missing_details}"
 fi
 
diff --git a/lgsm/modules/command_dev_detect_deps.sh b/lgsm/modules/command_dev_detect_deps.sh
index 763ab5554..6215fb897 100644
--- a/lgsm/modules/command_dev_detect_deps.sh
+++ b/lgsm/modules/command_dev_detect_deps.sh
@@ -10,9 +10,9 @@ commandaction="Developer detect deps"
 moduleselfname="$(basename "$(readlink -f "${BASH_SOURCE[0]}")")"
 fn_firstcommand_set
 
-echo -e "================================="
-echo -e "Dependencies Checker"
-echo -e "================================="
+echo -e ""
+echo -e "${bold}Dependencies Checker${default}"
+fn_messages_separator
 echo -e "Checking directory: "
 echo -e "${serverfiles}"
 if [ "$(command -v eu-readelf 2> /dev/null)" ]; then
@@ -182,33 +182,33 @@ awk -vORS='' '{ print $1,$2 }' "${tmpdir}/.depdetect_ubuntu_list_uniq" > "${tmpd
 awk -vORS='' '{ print $1,$2 }' "${tmpdir}/.depdetect_debian_list_uniq" > "${tmpdir}/.depdetect_debian_line"
 echo -e ""
 echo -e ""
-echo -e "Required Dependencies"
-echo -e "================================="
+echo -e "${bold}Required Dependencies${default}"
+fn_messages_separator
 echo -e "${executable}"
 echo -e ""
 echo -e "CentOS"
-echo -e "================================="
+fn_messages_separator
 cat "${tmpdir}/.depdetect_centos_line"
 echo -e ""
 echo -e ""
 echo -e "Ubuntu"
-echo -e "================================="
+fn_messages_separator
 cat "${tmpdir}/.depdetect_ubuntu_line"
 echo -e ""
 echo -e ""
 echo -e "Debian"
-echo -e "================================="
+fn_messages_separator
 cat "${tmpdir}/.depdetect_debian_line"
 echo -e ""
 if [ "${unknownlib}" == "1" ]; then
 	echo -e ""
 	echo -e "Unknown shared Library"
-	echo -e "================================="
+	fn_messages_separator
 	cat "${tmpdir}/.depdetect_unknown"
 fi
 echo -e ""
 echo -e "Required Librarys"
-echo -e "================================="
+fn_messages_separator
 sort "${tmpdir}/.depdetect_readelf" | uniq
 echo -en "\n"
 rm -f "${tmpdir:?}/.depdetect_centos_line"
diff --git a/lgsm/modules/command_dev_detect_glibc.sh b/lgsm/modules/command_dev_detect_glibc.sh
index ca64ed7cc..214adc88e 100644
--- a/lgsm/modules/command_dev_detect_glibc.sh
+++ b/lgsm/modules/command_dev_detect_glibc.sh
@@ -11,13 +11,13 @@ commandaction="Developer detect glibc"
 moduleselfname="$(basename "$(readlink -f "${BASH_SOURCE[0]}")")"
 fn_firstcommand_set
 
-echo -e "================================="
+fn_messages_separator
 echo -e "glibc Requirements Checker"
-echo -e "================================="
+fn_messages_separator
 
 if [ ! "$(command -v objdump 2> /dev/null)" ]; then
 	fn_print_failure_nl "objdump is missing"
-	fn_script_log_fatal "objdump is missing"
+	fn_script_log_fail "objdump is missing"
 	core_exit.sh
 fi
 
@@ -59,7 +59,7 @@ for glibc_check_var in "${glibc_check_dir_array[@]}"; do
 		echo -e ""
 		echo -e ""
 		echo -e "${glibc_check_name} glibc Requirements"
-		echo -e "================================="
+		fn_messages_separator
 		if [ -f "${tmpdir}/detect_glibc_files_${glibc_check_var}.tmp" ]; then
 			echo -e "Required glibc"
 			cat "${tmpdir}/detect_glibc_${glibc_check_var}.tmp" | sort | uniq | sort -r --version-sort | head -1 | tee -a "${tmpdir}/detect_glibc_highest.tmp"
@@ -81,7 +81,7 @@ for glibc_check_var in "${glibc_check_dir_array[@]}"; do
 done
 echo -e ""
 echo -e "Final glibc Requirement"
-echo -e "================================="
+fn_messages_separator
 if [ -f "${tmpdir}/detect_glibc_highest.tmp" ]; then
 	cat "${tmpdir}/detect_glibc_highest.tmp" | sort | uniq | sort -r --version-sort | head -1
 	rm -f "${tmpdir:?}/detect_glibc_highest.tmp"
diff --git a/lgsm/modules/command_dev_detect_ldd.sh b/lgsm/modules/command_dev_detect_ldd.sh
index 877c8d95b..af41bb522 100644
--- a/lgsm/modules/command_dev_detect_ldd.sh
+++ b/lgsm/modules/command_dev_detect_ldd.sh
@@ -11,9 +11,9 @@ commandaction="Developer detect ldd"
 moduleselfname="$(basename "$(readlink -f "${BASH_SOURCE[0]}")")"
 fn_firstcommand_set
 
-echo -e "================================="
+fn_messages_separator
 echo -e "Shared Object dependencies Checker"
-echo -e "================================="
+fn_messages_separator
 
 if [ -z "${serverfiles}" ]; then
 	dir=$(dirname "$(readlink -f "${BASH_SOURCE[0]}")")
@@ -47,12 +47,12 @@ find "${serverfiles}" -type f -print0 \
 echo -e ""
 echo -e ""
 echo -e "All"
-echo -e "================================="
+fn_messages_separator
 cat "${tmpdir}/detect_ldd.tmp"
 
 echo -e ""
 echo -e "Not Found"
-echo -e "================================="
+fn_messages_separator
 cat "${tmpdir}/detect_ldd_not_found.tmp"
 
 rm -f "${tmpdir:?}/detect_ldd.tmp"
diff --git a/lgsm/modules/command_dev_query_raw.sh b/lgsm/modules/command_dev_query_raw.sh
index 1abd6cdf3..cf9e14858 100644
--- a/lgsm/modules/command_dev_query_raw.sh
+++ b/lgsm/modules/command_dev_query_raw.sh
@@ -17,14 +17,14 @@ info_messages.sh
 
 echo -e ""
 echo -e "${lightgreen}Query IP Addresses${default}"
-echo -e "=================================================================="
+fn_messages_separator
 echo -e ""
 for queryip in "${queryips[@]}"; do
 	echo -e "${queryip}"
 done
 echo -e ""
 echo -e "${lightgreen}Game Server Ports${default}"
-echo -e "=================================================================="
+fn_messages_separator
 {
 	echo -e "${lightblue}Port Name \tPort Number \tStatus \tTCP \tUDP${default}"
 	if [ -v port ]; then
@@ -184,18 +184,18 @@ echo -e "=================================================================="
 	| column -s $'\t' -t
 echo -e ""
 echo -e "${lightgreen}SS Output${default}"
-echo -e "================================="
+fn_messages_separator
 fn_info_message_ports
 eval "${portcommand}"
 echo -e ""
 echo -e "${lightgreen}Query Port - Raw Output${default}"
-echo -e "=================================================================="
+fn_messages_separator
 echo -e ""
 echo -e "PORT: ${port}"
 echo -e "QUERY PORT: ${queryport}"
 echo -e ""
 echo -e "${lightgreen}Gamedig Raw Output${default}"
-echo -e "================================="
+fn_messages_separator
 echo -e ""
 if [ ! "$(command -v gamedig 2> /dev/null)" ]; then
 	fn_print_failure_nl "gamedig not installed"
@@ -211,7 +211,7 @@ for queryip in "${queryips[@]}"; do
 done
 echo -e ""
 echo -e "${lightgreen}gsquery Raw Output${default}"
-echo -e "================================="
+fn_messages_separator
 echo -e ""
 for queryip in "${queryips[@]}"; do
 	echo -e "./query_gsquery.py -a \"${queryip}\" -p \"${queryport}\" -e \"${querytype}\""
@@ -223,7 +223,7 @@ for queryip in "${queryips[@]}"; do
 done
 echo -e ""
 echo -e "${lightgreen}TCP Raw Output${default}"
-echo -e "================================="
+fn_messages_separator
 echo -e ""
 for queryip in "${queryips[@]}"; do
 	echo -e "bash -c 'exec 3<> /dev/tcp/'${queryip}'/'${queryport}''"
@@ -239,10 +239,10 @@ for queryip in "${queryips[@]}"; do
 done
 echo -e ""
 echo -e "${lightgreen}Game Port - Raw Output${default}"
-echo -e "=================================================================="
+fn_messages_separator
 echo -e ""
 echo -e "${lightgreen}TCP Raw Output${default}"
-echo -e "================================="
+fn_messages_separator
 echo -e ""
 for queryip in "${queryips[@]}"; do
 	echo -e "bash -c 'exec 3<> /dev/tcp/'${queryip}'/'${port}''"
@@ -258,7 +258,7 @@ for queryip in "${queryips[@]}"; do
 done
 echo -e ""
 echo -e "${lightgreen}Steam Master Server Response${default}"
-echo -e "=================================================================="
+fn_messages_separator
 echo -e ""
 echo -e "curl -m 3 -s https://api.steampowered.com/ISteamApps/GetServersAtAddress/v0001?addr=${publicip}"
 echo -e ""
diff --git a/lgsm/modules/command_fastdl.sh b/lgsm/modules/command_fastdl.sh
index 4aff9994d..acc3a1ba4 100644
--- a/lgsm/modules/command_fastdl.sh
+++ b/lgsm/modules/command_fastdl.sh
@@ -26,7 +26,7 @@ luafastdlfullpath="${luasvautorundir}/${luafastdlfile}"
 # Check if bzip2 is installed.
 if [ ! "$(command -v bzip2 2> /dev/null)" ]; then
 	fn_print_fail "bzip2 is not installed"
-	fn_script_log_fatal "bzip2 is not installed"
+	fn_script_log_fail "bzip2 is not installed"
 	core_exit.sh
 fi
 
@@ -37,7 +37,7 @@ echo -e ""
 
 # Prompts user for FastDL creation settings.
 echo -e "${commandaction} setup"
-echo -e "================================="
+fn_messages_separator
 
 # Prompt for clearing old files if directory was already here.
 if [ -d "${fastdldir}" ]; then
@@ -72,7 +72,7 @@ fn_clear_old_fastdl() {
 		exitcode=$?
 		if [ "${exitcode}" != 0 ]; then
 			fn_print_fail_eol_nl
-			fn_script_log_fatal "Clearing existing FastDL directory ${fastdldir}"
+			fn_script_log_fail "Clearing existing FastDL directory ${fastdldir}"
 			core_exit.sh
 		else
 			fn_print_ok_eol_nl
@@ -89,7 +89,7 @@ fn_fastdl_dirs() {
 		exitcode=$?
 		if [ "${exitcode}" != 0 ]; then
 			fn_print_fail_eol_nl
-			fn_script_log_fatal "Creating web directory ${webdir}"
+			fn_script_log_fail "Creating web directory ${webdir}"
 			core_exit.sh
 		else
 			fn_print_ok_eol_nl
@@ -102,7 +102,7 @@ fn_fastdl_dirs() {
 		exitcode=$?
 		if [ "${exitcode}" != 0 ]; then
 			fn_print_fail_eol_nl
-			fn_script_log_fatal "Creating fastdl directory ${fastdldir}"
+			fn_script_log_fail "Creating fastdl directory ${fastdldir}"
 			core_exit.sh
 		else
 			fn_print_ok_eol_nl
@@ -218,13 +218,13 @@ fn_fastdl_preview() {
 			exitcode=$?
 			if [ "${exitcode}" != 0 ]; then
 				fn_print_fail_eol_nl
-				fn_script_log_fatal "Calculating total file size."
+				fn_script_log_fail "Calculating total file size."
 				core_exit.sh
 			fi
 		done < "${tmpdir}/fastdl_files_to_compress.txt"
 	else
 		fn_print_fail_eol_nl "generating file list"
-		fn_script_log_fatal "Generating file list."
+		fn_script_log_fail "Generating file list."
 		core_exit.sh
 	fi
 	echo -e "about to compress ${totalfiles} files, total size $(fn_human_readable_file_size ${filesizetotal} 0)"
@@ -251,7 +251,7 @@ fn_fastdl_gmod() {
 			exitcode=$?
 			if [ "${exitcode}" != 0 ]; then
 				fn_print_fail_eol_nl
-				fn_script_log_fatal "Copying ${fastdlfile} > ${fastdldir}"
+				fn_script_log_fail "Copying ${fastdlfile} > ${fastdldir}"
 				core_exit.sh
 			else
 				fn_script_log_pass "Copying ${fastdlfile} > ${fastdldir}"
@@ -268,7 +268,7 @@ fn_fastdl_gmod() {
 		exitcode=$?
 		if [ "${exitcode}" != 0 ]; then
 			fn_print_fail_eol_nl
-			fn_script_log_fatal "Updating addons file structure"
+			fn_script_log_fail "Updating addons file structure"
 			core_exit.sh
 		else
 			fn_print_ok_eol_nl
@@ -281,7 +281,7 @@ fn_fastdl_gmod() {
 		exitcode=$?
 		if [ "${exitcode}" != 0 ]; then
 			fn_print_fail_eol_nl
-			fn_script_log_fatal "Clearing addons dir from fastdl dir"
+			fn_script_log_fail "Clearing addons dir from fastdl dir"
 			core_exit.sh
 		else
 			fn_print_ok_eol_nl
@@ -296,7 +296,7 @@ fn_fastdl_gmod() {
 		exitcode=$?
 		if [ "${exitcode}" != 0 ]; then
 			fn_print_fail_eol_nl
-			fn_script_log_fatal "Correcting DarkRP files"
+			fn_script_log_fail "Correcting DarkRP files"
 			core_exit.sh
 		else
 			fn_print_ok_eol_nl
@@ -347,7 +347,7 @@ fn_fastdl_source() {
 					exitcode=$?
 					if [ "${exitcode}" != 0 ]; then
 						fn_print_fail_eol_nl
-						fn_script_log_fatal "Copying ${fastdlfile} > ${fastdldir}/${copytodir}"
+						fn_script_log_fail "Copying ${fastdlfile} > ${fastdldir}/${copytodir}"
 						core_exit.sh
 					else
 						fn_script_log_pass "Copying ${fastdlfile} > ${fastdldir}/${copytodir}"
@@ -383,7 +383,7 @@ fn_fastdl_gmod_dl_enforcer() {
 		exitcode=$?
 		if [ "${exitcode}" != 0 ]; then
 			fn_print_fail_eol_nl
-			fn_script_log_fatal "Removing existing download enforcer ${luafastdlfullpath}"
+			fn_script_log_fail "Removing existing download enforcer ${luafastdlfullpath}"
 			core_exit.sh
 		else
 			fn_print_ok_eol_nl
@@ -401,7 +401,7 @@ fn_fastdl_gmod_dl_enforcer() {
 		exitcode=$?
 		if [ "${exitcode}" != 0 ]; then
 			fn_print_fail_eol_nl
-			fn_script_log_fatal "Creating new download enforcer ${luafastdlfullpath}"
+			fn_script_log_fail "Creating new download enforcer ${luafastdlfullpath}"
 			core_exit.sh
 		else
 			fn_print_ok_eol_nl
@@ -418,7 +418,7 @@ fn_fastdl_bzip2() {
 		exitcode=$?
 		if [ "${exitcode}" != 0 ]; then
 			fn_print_fail_eol_nl
-			fn_script_log_fatal "Compressing ${filetocompress}"
+			fn_script_log_fail "Compressing ${filetocompress}"
 			core_exit.sh
 		else
 			fn_script_log_pass "Compressing ${filetocompress}"
diff --git a/lgsm/modules/command_install_resources_mta.sh b/lgsm/modules/command_install_resources_mta.sh
index c3d745a30..31a9165fd 100644
--- a/lgsm/modules/command_install_resources_mta.sh
+++ b/lgsm/modules/command_install_resources_mta.sh
@@ -13,7 +13,7 @@ fn_firstcommand_set
 fn_install_resources() {
 	echo -e ""
 	echo -e "${lightyellow}Installing Default Resources${default}"
-	echo -e "================================="
+	fn_messages_separator
 	fn_fetch_file "http://mirror.mtasa.com/mtasa/resources/mtasa-resources-latest.zip" "" "" "" "${tmpdir}" "mtasa-resources-latest.zip" "nochmodx" "norun" "noforce" "nohash"
 	fn_dl_extract "${tmpdir}" "mtasa-resources-latest.zip" "${resourcesdir}"
 	echo -e "Default Resources Installed."
diff --git a/lgsm/modules/command_mods_install.sh b/lgsm/modules/command_mods_install.sh
index d602be2cd..19de72ab0 100644
--- a/lgsm/modules/command_mods_install.sh
+++ b/lgsm/modules/command_mods_install.sh
@@ -19,7 +19,7 @@ fn_print_header
 fn_mods_installed_list
 if [ "${installedmodscount}" -gt "0" ]; then
 	echo -e "Installed addons/mods"
-	echo -e "================================="
+	fn_messages_separator
 	# Go through all available commands, get details and display them to the user.
 	for ((llindex = 0; llindex < ${#installedmodslist[@]}; llindex++)); do
 		# Current mod is the "llindex" value of the array we're going through.
@@ -32,7 +32,7 @@ if [ "${installedmodscount}" -gt "0" ]; then
 fi
 
 echo -e "Available addons/mods"
-echo -e "================================="
+fn_messages_separator
 # Display available mods from mods_list.sh.
 # Set and reset vars
 compatiblemodslistindex=0
@@ -78,7 +78,7 @@ fn_mod_get_info
 
 echo -e ""
 echo -e "Installing ${modprettyname}"
-echo -e "================================="
+fn_messages_separator
 fn_script_log_info "${modprettyname} selected for install"
 
 # Check if the mod is already installed and warn the user.
diff --git a/lgsm/modules/command_mods_remove.sh b/lgsm/modules/command_mods_remove.sh
index 8f9ea3739..db7763cd8 100644
--- a/lgsm/modules/command_mods_remove.sh
+++ b/lgsm/modules/command_mods_remove.sh
@@ -16,7 +16,7 @@ fn_mods_check_installed
 
 fn_print_header
 echo -e "Remove addons/mods"
-echo -e "================================="
+fn_messages_separator
 
 # Displays list of installed mods.
 # Generates list to display to user.
@@ -72,7 +72,7 @@ while [ "${modfileline}" -le "${modsfilelistsize}" ]; do
 		rm -rf "${modinstalldir:?}/${currentfileremove:?}"
 		((exitcode = $?))
 		if [ "${exitcode}" != 0 ]; then
-			fn_script_log_fatal "Removing ${modinstalldir}/${currentfileremove}"
+			fn_script_log_fail "Removing ${modinstalldir}/${currentfileremove}"
 			break
 		else
 			fn_script_log_pass "Removing ${modinstalldir}/${currentfileremove}"
@@ -103,7 +103,7 @@ fn_sleep_time
 rm -rf "${modsdir:?}/${modcommand}-files.txt"
 exitcode=$?
 if [ "${exitcode}" != 0 ]; then
-	fn_script_log_fatal "Removing ${modsdir}/${modcommand}-files.txt"
+	fn_script_log_fail "Removing ${modsdir}/${modcommand}-files.txt"
 	fn_print_fail_eol_nl
 	core_exit.sh
 else
@@ -118,7 +118,7 @@ fn_sleep_time
 sed -i "/^${modcommand}$/d" "${modsinstalledlistfullpath}"
 exitcode=$?
 if [ "${exitcode}" != 0 ]; then
-	fn_script_log_fatal "Removing ${modcommand} from ${modsinstalledlist}"
+	fn_script_log_fail "Removing ${modcommand} from ${modsinstalledlist}"
 	fn_print_fail_eol_nl
 	core_exit.sh
 else
diff --git a/lgsm/modules/command_mods_update.sh b/lgsm/modules/command_mods_update.sh
index b917f191f..cfbafc80c 100644
--- a/lgsm/modules/command_mods_update.sh
+++ b/lgsm/modules/command_mods_update.sh
@@ -97,7 +97,7 @@ while [ "${installedmodsline}" -le "${installedmodscount}" ]; do
 		((installedmodsline++))
 	else
 		fn_print_fail "No mod was selected"
-		fn_script_log_fatal "No mod was selected"
+		fn_script_log_fail "No mod was selected"
 		exitcode="1"
 		core_exit.sh
 	fi
diff --git a/lgsm/modules/command_monitor.sh b/lgsm/modules/command_monitor.sh
index 5ce104a95..079ad334d 100644
--- a/lgsm/modules/command_monitor.sh
+++ b/lgsm/modules/command_monitor.sh
@@ -206,7 +206,7 @@ fn_monitor_check_session() {
 	else
 		fn_print_error "Checking session: "
 		fn_print_fail_eol_nl
-		fn_script_log_fatal "Checking session: FAIL"
+		fn_script_log_fail "Checking session: FAIL"
 		alert="restart"
 		alert.sh
 		fn_script_log_info "Checking session: Monitor is restarting ${selfname}"
diff --git a/lgsm/modules/command_skeleton.sh b/lgsm/modules/command_skeleton.sh
index 9e7c19a6a..48a6bd187 100644
--- a/lgsm/modules/command_skeleton.sh
+++ b/lgsm/modules/command_skeleton.sh
@@ -18,7 +18,7 @@ find "${rootdir}" -type d -not \( -path ./skel -prune \) | cpio -pdvm skel 2> /d
 exitcode=$?
 if [ "${exitcode}" != 0 ]; then
 	fn_print_fail_nl "Creating skeleton directory"
-	fn_script_log_fatal "Creating skeleton directory"
+	fn_script_log_fail "Creating skeleton directory"
 else
 	fn_print_ok_nl "Creating skeleton directory: ./skel"
 	fn_script_log_pass "Creating skeleton directory: ./skel"
diff --git a/lgsm/modules/command_sponsor.sh b/lgsm/modules/command_sponsor.sh
index 336f20f0a..ea49a3099 100755
--- a/lgsm/modules/command_sponsor.sh
+++ b/lgsm/modules/command_sponsor.sh
@@ -12,7 +12,7 @@ fn_firstcommand_set
 
 fn_print_ascii_logo
 echo -e "${lightyellow}Support LinuxGSM${default}"
-echo -e "================================="
+fn_messages_separator
 echo -e ""
 echo -e "Been using LinuxGSM?"
 echo -e "Consider sponsoring to support development."
diff --git a/lgsm/modules/command_start.sh b/lgsm/modules/command_start.sh
index b2f46855d..4b45f0bc3 100644
--- a/lgsm/modules/command_start.sh
+++ b/lgsm/modules/command_start.sh
@@ -120,24 +120,24 @@ fn_start_tmux() {
 	check_status.sh
 	if [ "${status}" == "0" ]; then
 		fn_print_fail_nl "Unable to start ${servername}"
-		fn_script_log_fatal "Unable to start ${servername}"
+		fn_script_log_fail "Unable to start ${servername}"
 		if [ -s "${lgsmlogdir}/.${selfname}-tmux-error.tmp" ]; then
 			fn_print_fail_nl "Unable to start ${servername}: tmux error:"
-			fn_script_log_fatal "Unable to start ${servername}: tmux error:"
+			fn_script_log_fail "Unable to start ${servername}: tmux error:"
 			echo -e ""
 			echo -e "Command"
-			echo -e "================================="
+			fn_messages_separator
 			echo -e "tmux -L \"${sessionname}\" new-session -d -s \"${sessionname}\" \"${preexecutable} ${executable} ${startparameters}\"" | tee -a "${lgsmlog}"
 			echo -e ""
 			echo -e "Error"
-			echo -e "================================="
+			fn_messages_separator
 			tee -a "${lgsmlog}" < "${lgsmlogdir}/.${selfname}-tmux-error.tmp"
 
 			# Detected error https://linuxgsm.com/support
 			if grep -c "Operation not permitted" "${lgsmlogdir}/.${selfname}-tmux-error.tmp"; then
 				echo -e ""
 				echo -e "Fix"
-				echo -e "================================="
+				fn_messages_separator
 				if ! grep "tty:" /etc/group | grep "$(whoami)"; then
 					echo -e "$(whoami) is not part of the tty group."
 					fn_script_log_info "$(whoami) is not part of the tty group."
diff --git a/lgsm/modules/command_stop.sh b/lgsm/modules/command_stop.sh
index 409e57b14..ee9152862 100644
--- a/lgsm/modules/command_stop.sh
+++ b/lgsm/modules/command_stop.sh
@@ -248,7 +248,7 @@ fn_stop_tmux() {
 		fn_script_log_pass "Stopped ${servername}"
 	else
 		fn_print_fail_nl "Unable to stop ${servername}"
-		fn_script_log_fatal "Unable to stop ${servername}"
+		fn_script_log_fail "Unable to stop ${servername}"
 	fi
 }
 
diff --git a/lgsm/modules/command_update_linuxgsm.sh b/lgsm/modules/command_update_linuxgsm.sh
index 3c4e6d080..65b72bcbb 100644
--- a/lgsm/modules/command_update_linuxgsm.sh
+++ b/lgsm/modules/command_update_linuxgsm.sh
@@ -24,7 +24,7 @@ if [ $? != "0" ]; then
 	curl --connect-timeout 10 -IsfL "https://bitbucket.org/${githubuser}/${githubrepo}/raw/${githubbranch}/linuxgsm.sh" 1> /dev/null
 	if [ $? != "0" ]; then
 		fn_print_fail_nl "Selecting repo: Unable to to access GitHub or Bitbucket repositories"
-		fn_script_log_fatal "Selecting repo: Unable to to access GitHub or Bitbucket repositories"
+		fn_script_log_fail "Selecting repo: Unable to to access GitHub or Bitbucket repositories"
 		core_exit.sh
 	else
 		remotereponame="Bitbucket"
@@ -44,8 +44,8 @@ else
 fi
 if [ $? != "0" ]; then
 	fn_print_fail_eol_nl
-	fn_script_log_fatal "Checking ${remotereponame} linuxgsm.sh"
-	fn_script_log_fatal "Curl returned error: $?"
+	fn_script_log_fail "Checking ${remotereponame} linuxgsm.sh"
+	fn_script_log_fail "Curl returned error: $?"
 	core_exit.sh
 fi
 
@@ -82,7 +82,7 @@ if [ "${script_diff}" != "" ]; then
 	cp "${rootdir}/${selfname}" "${backupdir}/script/${selfname}-$(date +"%m_%d_%Y_%M").bak"
 	if [ $? != 0 ]; then
 		fn_print_fail_eol_nl
-		fn_script_log_fatal "Backup ${selfname}"
+		fn_script_log_fail "Backup ${selfname}"
 		core_exit.sh
 	else
 		fn_print_ok_eol_nl
@@ -103,7 +103,7 @@ if [ "${script_diff}" != "" ]; then
 
 	if [ $? != "0" ]; then
 		fn_print_fail_eol_nl
-		fn_script_log_fatal "copying ${selfname}"
+		fn_script_log_fail "copying ${selfname}"
 		core_exit.sh
 	else
 		fn_print_ok_eol_nl
@@ -124,8 +124,8 @@ else
 fi
 if [ $? != "0" ]; then
 	fn_print_fail_eol_nl
-	fn_script_log_fatal "Checking ${remotereponame} config _default.cfg"
-	fn_script_log_fatal "Curl returned error: $?"
+	fn_script_log_fail "Checking ${remotereponame} config _default.cfg"
+	fn_script_log_fail "Curl returned error: $?"
 	core_exit.sh
 fi
 
@@ -158,8 +158,8 @@ if [ -f "${datadir}/${distroid}-${distroversioncsv}.csv" ]; then
 	fi
 	if [ $? != "0" ]; then
 		fn_print_fail_eol_nl
-		fn_script_log_fatal "Checking ${remotereponame} ${distroid}-${distroversioncsv}.csv"
-		fn_script_log_fatal "Curl returned error: $?"
+		fn_script_log_fail "Checking ${remotereponame} ${distroid}-${distroversioncsv}.csv"
+		fn_script_log_fail "Curl returned error: $?"
 		core_exit.sh
 	fi
 
@@ -200,7 +200,7 @@ if [ -n "${modulesdir}" ]; then
 					echo -en "removing module ${modulefile}...\c"
 					if ! rm -f "${modulefile:?}"; then
 						fn_print_fail_eol_nl
-						fn_script_log_fatal "Removing module ${modulefile}"
+						fn_script_log_fail "Removing module ${modulefile}"
 						core_exit.sh
 					else
 						fn_print_ok_eol_nl
diff --git a/lgsm/modules/core_dl.sh b/lgsm/modules/core_dl.sh
index 2a6c7c400..3b2e7f117 100644
--- a/lgsm/modules/core_dl.sh
+++ b/lgsm/modules/core_dl.sh
@@ -93,27 +93,27 @@ fn_dl_steamcmd() {
 			# Not enough space.
 			if [ -n "$(grep "0x202" "${steamcmdlog}" | tail -1)" ]; then
 				fn_print_failure_nl "${commandaction} ${selfname}: ${remotelocation}: Not enough disk space to download server files"
-				fn_script_log_fatal "${commandaction} ${selfname}: ${remotelocation}: Not enough disk space to download server files"
+				fn_script_log_fail "${commandaction} ${selfname}: ${remotelocation}: Not enough disk space to download server files"
 				core_exit.sh
 				# Not enough space.
 			elif [ -n "$(grep "0x212" "${steamcmdlog}" | tail -1)" ]; then
 				fn_print_failure_nl "${commandaction} ${selfname}: ${remotelocation}: Not enough disk space to download server files"
-				fn_script_log_fatal "${commandaction} ${selfname}: ${remotelocation}: Not enough disk space to download server files"
+				fn_script_log_fail "${commandaction} ${selfname}: ${remotelocation}: Not enough disk space to download server files"
 				core_exit.sh
 			# Need tp purchase game.
 			elif [ -n "$(grep "No subscription" "${steamcmdlog}" | tail -1)" ]; then
 				fn_print_failure_nl "${commandaction} ${selfname}: ${remotelocation}: Steam account does not have a license for the required game"
-				fn_script_log_fatal "${commandaction} ${selfname}: ${remotelocation}: Steam account does not have a license for the required game"
+				fn_script_log_fail "${commandaction} ${selfname}: ${remotelocation}: Steam account does not have a license for the required game"
 				core_exit.sh
 			# Two-factor authentication failure
 			elif [ -n "$(grep "Two-factor code mismatch" "${steamcmdlog}" | tail -1)" ]; then
 				fn_print_failure_nl "${commandaction} ${selfname}: ${remotelocation}: Two-factor authentication failure"
-				fn_script_log_fatal "${commandaction} ${selfname}: ${remotelocation}: Two-factor authentication failure"
+				fn_script_log_fail "${commandaction} ${selfname}: ${remotelocation}: Two-factor authentication failure"
 				core_exit.sh
 			# Incorrect Branch password
 			elif [ -n "$(grep "Password check for AppId" "${steamcmdlog}" | tail -1)" ]; then
 				fn_print_failure_nl "${commandaction} ${selfname}: ${remotelocation}: betapassword is incorrect"
-				fn_script_log_fatal "${commandaction} ${selfname}: ${remotelocation}: betapassword is incorrect"
+				fn_script_log_fail "${commandaction} ${selfname}: ${remotelocation}: betapassword is incorrect"
 				core_exit.sh
 			# Update did not finish.
 			elif [ -n "$(grep "0x402" "${steamcmdlog}" | tail -1)" ] || [ -n "$(grep "0x602" "${steamcmdlog}" | tail -1)" ]; then
@@ -142,7 +142,7 @@ fn_dl_steamcmd() {
 
 		if [ "${counter}" -gt "10" ]; then
 			fn_print_failure_nl "${commandaction} ${selfname}: ${remotelocation}: Did not complete the download, too many retrys"
-			fn_script_log_fatal "${commandaction} ${selfname}: ${remotelocation}: Did not complete the download, too many retrys"
+			fn_script_log_fail "${commandaction} ${selfname}: ${remotelocation}: Did not complete the download, too many retrys"
 			core_exit.sh
 		fi
 	done
@@ -195,7 +195,7 @@ fn_dl_hash() {
 			fn_print_fail_eol_nl
 			echo -e "${local_filename} returned ${hashtype} checksum: ${hashsumcmd}"
 			echo -e "expected ${hashtype} checksum: ${hash}"
-			fn_script_log_fatal "Verifying ${local_filename} with ${hashtype}"
+			fn_script_log_fail "Verifying ${local_filename} with ${hashtype}"
 			fn_script_log_info "${local_filename} returned ${hashtype} checksum: ${hashsumcmd}"
 			fn_script_log_info "Expected ${hashtype} checksum: ${hash}"
 			core_exit.sh
@@ -226,8 +226,8 @@ fn_dl_extract() {
 	if [ ! -f "${local_filedir}/${local_filename}" ]; then
 		fn_print_fail_eol_nl
 		echo -en "file ${local_filedir}/${local_filename} not found"
-		fn_script_log_fatal "Extracting ${local_filename}"
-		fn_script_log_fatal "File ${local_filedir}/${local_filename} not found"
+		fn_script_log_fail "Extracting ${local_filename}"
+		fn_script_log_fail "File ${local_filedir}/${local_filename} not found"
 		core_exit.sh
 	fi
 	mime=$(file -b --mime-type "${local_filedir}/${local_filename}")
@@ -259,7 +259,7 @@ fn_dl_extract() {
 	local exitcode=$?
 	if [ "${exitcode}" != 0 ]; then
 		fn_print_fail_eol_nl
-		fn_script_log_fatal "Extracting ${local_filename}"
+		fn_script_log_fail "Extracting ${local_filename}"
 		if [ -f "${lgsmlog}" ]; then
 			echo -e "${extractcmd}" >> "${lgsmlog}"
 		fi
@@ -277,7 +277,6 @@ fn_fetch_trap() {
 	echo -en "downloading ${local_filename}..."
 	fn_print_canceled_eol_nl
 	fn_script_log_info "Downloading ${local_filename}...CANCELED"
-	fn_sleep_time
 	rm -f "${local_filedir:?}/${local_filename}"
 	echo -en "downloading ${local_filename}..."
 	fn_print_removed_eol_nl
@@ -320,8 +319,8 @@ fn_check_file() {
 			if [ ${counter} -ge 2 ]; then
 				fn_print_fail_eol_nl
 				if [ -f "${lgsmlog}" ]; then
-					fn_script_log_fatal "Checking ${remote_filename}"
-					fn_script_log_fatal "${fileurl}"
+					fn_script_log_fail "Checking ${remote_filename}"
+					fn_script_log_fail "${fileurl}"
 					checkflag=1
 				fi
 			else
@@ -421,8 +420,8 @@ fn_fetch_file() {
 				if [ ${counter} -ge 2 ]; then
 					fn_print_fail_eol_nl
 					if [ -f "${lgsmlog}" ]; then
-						fn_script_log_fatal "Downloading ${local_filename}..."
-						fn_script_log_fatal "${fileurl}"
+						fn_script_log_fail "Downloading ${local_filename}..."
+						fn_script_log_fail "${fileurl}"
 					fi
 					core_exit.sh
 				else
@@ -617,7 +616,7 @@ fn_dl_latest_release_github() {
 	# Check how many releases we got from the api and exit if we have more then one.
 	if [ "$(echo -e "${githubreleaseassets}" | jq '. | length')" -gt 1 ]; then
 		fn_print_fatal_nl "Found more than one release to download - Please report this to the LinuxGSM issue tracker"
-		fn_script_log_fatal "Found more than one release to download - Please report this to the LinuxGSM issue tracker"
+		fn_script_log_fail "Found more than one release to download - Please report this to the LinuxGSM issue tracker"
 	else
 		# Set variables for download via fn_fetch_file.
 		githubreleasefilename=$(echo -e "${githubreleaseassets}" | jq -r '.[]name')
@@ -626,7 +625,7 @@ fn_dl_latest_release_github() {
 		# Error if no version is there.
 		if [ -z "${githubreleasefilename}" ]; then
 			fn_print_fail_nl "Cannot get version from GitHub API for ${githubreleaseuser}/${githubreleaserepo}"
-			fn_script_log_fatal "Cannot get version from GitHub API for ${githubreleaseuser}/${githubreleaserepo}"
+			fn_script_log_fail "Cannot get version from GitHub API for ${githubreleaseuser}/${githubreleaserepo}"
 		else
 			# Fetch file from the remote location from the existing module to the ${tmpdir} for now.
 			fn_fetch_file "${githubreleasedownloadlink}" "" "${githubreleasefilename}" "" "${githubreleasedownloadpath}" "${githubreleasefilename}"
diff --git a/lgsm/modules/core_exit.sh b/lgsm/modules/core_exit.sh
index 6947a3d4a..496cde422 100644
--- a/lgsm/modules/core_exit.sh
+++ b/lgsm/modules/core_exit.sh
@@ -29,7 +29,7 @@ elif [ "${exitcode}" != "0" ]; then
 	# List LinuxGSM version in logs
 	fn_script_log_info "LinuxGSM version: ${version}"
 	if [ "${exitcode}" == "1" ]; then
-		fn_script_log_fatal "${moduleselfname} exiting with code: ${exitcode}"
+		fn_script_log_fail "${moduleselfname} exiting with code: ${exitcode}"
 	elif [ "${exitcode}" == "2" ]; then
 		fn_script_log_error "${moduleselfname} exiting with code: ${exitcode}"
 	elif [ "${exitcode}" == "3" ]; then
diff --git a/lgsm/modules/core_github.sh b/lgsm/modules/core_github.sh
index 228fe1078..7290f9bdf 100644
--- a/lgsm/modules/core_github.sh
+++ b/lgsm/modules/core_github.sh
@@ -28,7 +28,7 @@ fn_github_get_latest_release_version() {
 	# error if no version is there
 	if [ -z "${githubreleaseversion}" ]; then
 		fn_print_fail_nl "Cannot get version from GitHub API for ${githubreleaseuser}/${githubreleaserepo}"
-		fn_script_log_fatal "Cannot get version from GitHub API for ${githubreleaseuser}/${githubreleaserepo}"
+		fn_script_log_fail "Cannot get version from GitHub API for ${githubreleaseuser}/${githubreleaserepo}"
 	fi
 }
 
@@ -46,7 +46,7 @@ fn_github_set_latest_release_version() {
 	# error if no version is there
 	if [ -z "${githubreleaseversion}" ]; then
 		fn_print_fail_nl "Cannot get version from GitHub API for ${githubreleaseuser}/${githubreleaserepo}"
-		fn_script_log_fatal "Cannot get version from GitHub API for ${githubreleaseuser}/${githubreleaserepo}"
+		fn_script_log_fail "Cannot get version from GitHub API for ${githubreleaseuser}/${githubreleaserepo}"
 	else
 		echo "${githubreleaseversion}" > "${githublocalversionfile}"
 	fi
@@ -81,7 +81,7 @@ fn_github_compare_version() {
 	# error if no version is there
 	if [ -z "${githubreleaseversion}" ]; then
 		fn_print_fail_nl "Can not get version from Github Api for ${githubreleaseuser}/${githubreleaserepo}"
-		fn_script_log_fatal "Can not get version from Github Api for ${githubreleaseuser}/${githubreleaserepo}"
+		fn_script_log_fail "Can not get version from Github Api for ${githubreleaseuser}/${githubreleaserepo}"
 	else
 		if [ "${githublocalversion}" == "${githubreleaseversion}" ]; then
 			echo -en "\n"
diff --git a/lgsm/modules/core_logs.sh b/lgsm/modules/core_logs.sh
index 8057f30f7..3166041ae 100644
--- a/lgsm/modules/core_logs.sh
+++ b/lgsm/modules/core_logs.sh
@@ -46,7 +46,6 @@ if [ "$(find "${lgsmlogdir}"/ -type f -mtime +"${logdays}" | wc -l)" -ne "0" ];
 	ulxcount="0"
 	darkrpcount="0"
 	legacycount="0"
-	fn_sleep_time
 	fn_print_info "Removing logs older than ${logdays} days"
 	fn_script_log_info "Removing logs older than ${logdays} days"
 	# Logging logfiles to be removed according to "${logdays}", counting and removing them.
diff --git a/lgsm/modules/core_messages.sh b/lgsm/modules/core_messages.sh
index 6d3ca9a25..5af4c5639 100644
--- a/lgsm/modules/core_messages.sh
+++ b/lgsm/modules/core_messages.sh
@@ -70,7 +70,7 @@ fn_script_log_pass() {
 }
 
 ## Feb 28 14:56:58 ut99-server: Monitor: FATAL:
-fn_script_log_fatal() {
+fn_script_log_fail() {
 	if [ -d "${lgsmlogdir}" ]; then
 		if [ -n "${commandname}" ]; then
 			echo -e "$(date '+%b %d %H:%M:%S.%3N') ${selfname}: ${commandname}: FATAL: ${1}" >> "${lgsmlog}"
@@ -273,12 +273,22 @@ fn_print_start_nl() {
 # On-Screen - Interactive messages
 ##################################
 
+# Separator is different for details.
+fn_messages_separator() {
+	if [ "${commandname}" == "DETAILS" ]; then
+		printf '%*s\n' "${COLUMNS:-$(tput cols)}" '' | tr ' ' =
+	else
+		echo -e "${bold}=================================${default}"
+		fn_sleep_time
+	fi
+}
+
 # No More Room in Hell Debug
 # =================================
 fn_print_header() {
 	echo -e ""
-	echo -e "${lightyellow}${gamename} ${commandaction}${default}"
-	echo -e "=================================${default}"
+	echo -e "${bold}${lightyellow}${gamename} ${commandaction}${default}"
+	fn_messages_separator
 }
 
 # Complete!
diff --git a/lgsm/modules/core_steamcmd.sh b/lgsm/modules/core_steamcmd.sh
index 6a7b25c11..e628e44b9 100644
--- a/lgsm/modules/core_steamcmd.sh
+++ b/lgsm/modules/core_steamcmd.sh
@@ -25,7 +25,7 @@ fn_check_steamcmd_user() {
 		fn_print_fail_nl "Steam login not set. Update steamuser in ${configdirserver}"
 		echo -e "	* Change steamuser=\"username\" to a valid steam login."
 		if [ -d "${lgsmlogdir}" ]; then
-			fn_script_log_fatal "Steam login not set. Update steamuser in ${configdirserver}"
+			fn_script_log_fail "Steam login not set. Update steamuser in ${configdirserver}"
 		fi
 		core_exit.sh
 	fi
@@ -129,7 +129,7 @@ fn_check_steamcmd_clear() {
 		rm -rf "${steamcmddir:?}"
 		exitcode=$?
 		if [ "${exitcode}" != 0 ]; then
-			fn_script_log_fatal "Removing ${rootdir}/steamcmd"
+			fn_script_log_fail "Removing ${rootdir}/steamcmd"
 		else
 			fn_script_log_pass "Removing ${rootdir}/steamcmd"
 		fi
@@ -154,7 +154,7 @@ fn_update_steamcmd_localbuild() {
 	# Checks if localbuild variable has been set.
 	if [ -z "${localbuild}" ]; then
 		fn_print_fail "Checking local build: ${remotelocation}: missing local build info"
-		fn_script_log_fatal "Missing local build info"
+		fn_script_log_fail "Missing local build info"
 		core_exit.sh
 	else
 		fn_print_ok "Checking local build: ${remotelocation}"
@@ -188,7 +188,7 @@ fn_update_steamcmd_remotebuild() {
 		# Checks if remotebuildversion variable has been set.
 		if [ -z "${remotebuildversion}" ] || [ "${remotebuildversion}" == "null" ]; then
 			fn_print_fail "Checking remote build: ${remotelocation}"
-			fn_script_log_fatal "Checking remote build"
+			fn_script_log_fail "Checking remote build"
 			core_exit.sh
 		else
 			fn_print_ok "Checking remote build: ${remotelocation}"
@@ -198,7 +198,7 @@ fn_update_steamcmd_remotebuild() {
 		# Checks if remotebuild variable has been set.
 		if [ -z "${remotebuildversion}" ] || [ "${remotebuildversion}" == "null" ]; then
 			fn_print_failure "Unable to get remote build"
-			fn_script_log_fatal "Unable to get remote build"
+			fn_script_log_fail "Unable to get remote build"
 			core_exit.sh
 		fi
 	fi
@@ -305,7 +305,7 @@ fn_check_steamcmd_appmanifest() {
 		# if error can not be resolved.
 		if [ "${appmanifestfilewc}" -ge "2" ]; then
 			fn_print_fail "Unable to remove x${appmanifestfilewc} appmanifest_${appid}.acf files"
-			fn_script_log_fatal "Unable to remove x${appmanifestfilewc} appmanifest_${appid}.acf files"
+			fn_script_log_fail "Unable to remove x${appmanifestfilewc} appmanifest_${appid}.acf files"
 			echo -e "* Check user permissions"
 			for appfile in ${appmanifestfile}; do
 				echo -e "	${appfile}"
@@ -327,7 +327,7 @@ fn_check_steamcmd_appmanifest() {
 		fn_appmanifest_info
 		if [ "${appmanifestfilewc}" -eq "0" ]; then
 			fn_print_fail_nl "Still no appmanifest_${appid}.acf found"
-			fn_script_log_fatal "Still no appmanifest_${appid}.acf found"
+			fn_script_log_fail "Still no appmanifest_${appid}.acf found"
 			core_exit.sh
 		fi
 	fi
diff --git a/lgsm/modules/fix.sh b/lgsm/modules/fix.sh
index a7f5f7378..9a4f5b779 100644
--- a/lgsm/modules/fix.sh
+++ b/lgsm/modules/fix.sh
@@ -80,8 +80,7 @@ if [ "${commandname}" == "INSTALL" ]; then
 	if grep -qEe "(^|\s)${shortname}(\s|$)" <<< "${apply_post_install_fix[@]}"; then
 		echo -e ""
 		echo -e "${lightyellow}Applying Post-Install Fixes${default}"
-		echo -e "================================="
-		fn_sleep_time
+		fn_messages_separator
 		postinstall=1
 		fn_apply_fix "post install" "${shortname}"
 	fi
diff --git a/lgsm/modules/fix_av.sh b/lgsm/modules/fix_av.sh
index fbb259900..bfff59af6 100644
--- a/lgsm/modules/fix_av.sh
+++ b/lgsm/modules/fix_av.sh
@@ -13,7 +13,6 @@ export LD_LIBRARY_PATH="$LD_LIBRARY_PATH:${serverfiles}:${serverfiles}/linux64"
 if [ ! -f "${servercfgfullpath}" ]; then
 	startparameters="--datapath ${avdatapath} --galaxy-name ${selfname} --init-folders-only"
 	fn_print_information "starting ${gamename} server to generate configs."
-	fn_sleep_time
 	cd "${systemdir}" || exit
 	eval "${executable} ${startparameters}"
 fi
diff --git a/lgsm/modules/fix_kf2.sh b/lgsm/modules/fix_kf2.sh
index 46850bd64..13176d448 100644
--- a/lgsm/modules/fix_kf2.sh
+++ b/lgsm/modules/fix_kf2.sh
@@ -10,7 +10,6 @@ moduleselfname="$(basename "$(readlink -f "${BASH_SOURCE[0]}")")"
 startparameters="\"${defaultmap}?Game=KFGameContent.KFGameInfo_VersusSurvival\""
 
 fn_print_information "starting ${gamename} server to generate configs."
-fn_sleep_time
 exitbypass=1
 command_start.sh
 fn_firstcommand_reset
diff --git a/lgsm/modules/fix_lo.sh b/lgsm/modules/fix_lo.sh
index 4c3758b01..4966afd57 100644
--- a/lgsm/modules/fix_lo.sh
+++ b/lgsm/modules/fix_lo.sh
@@ -9,9 +9,7 @@ moduleselfname="$(basename "$(readlink -f "${BASH_SOURCE[0]}")")"
 appidfile=${executabledir}/steam_appid.txt
 if [ ! -f "${appidfile}" ]; then
 	fn_print_information "adding ${appidfile} to ${gamename} server."
-	fn_sleep_time
 	echo "903950" > "${appidfile}"
 else
 	fn_print_information "${appidfile} already exists. No action to be taken."
-	fn_sleep_time
 fi
diff --git a/lgsm/modules/fix_mta.sh b/lgsm/modules/fix_mta.sh
index 65488f2a1..4e533eb51 100644
--- a/lgsm/modules/fix_mta.sh
+++ b/lgsm/modules/fix_mta.sh
@@ -10,7 +10,6 @@ moduleselfname="$(basename "$(readlink -f "${BASH_SOURCE[0]}")")"
 if [ ! -f "${lgsmdir}/lib/libmysqlclient.so.16" ]; then
 	fixname="libmysqlclient16"
 	fn_fix_msg_start_nl
-	fn_sleep_time
 	fn_fetch_file "https://nightly.mtasa.com/files/modules/64/libmysqlclient.so.16" "" "" "" "${lgsmdir}/lib" "libmysqlclient.so.16" "chmodx" "norun" "noforce" "6c188e0f8fb5d7a29f4bc413b9fed6c2"
 	fn_fix_msg_end
 fi
diff --git a/lgsm/modules/fix_samp.sh b/lgsm/modules/fix_samp.sh
index 461d92aee..24882f915 100644
--- a/lgsm/modules/fix_samp.sh
+++ b/lgsm/modules/fix_samp.sh
@@ -16,8 +16,8 @@ if [ -f "${servercfgfullpath}" ]; then
 		fixname="change default rcon password"
 		fn_fix_msg_start
 		fn_script_log_info "changing rcon/admin password."
-		random=$(tr -dc A-Za-z0-9_ < /dev/urandom | head -c 8 | xargs)
-		rconpass="admin${random}"
+		randomstring=$(tr -dc 'A-Za-z0-9_' < /dev/urandom 2> /dev/null | head -c 8 | xargs)
+		rconpass="admin${randomstring}"
 		sed -i "s/rcon_password changeme/rcon_password ${rconpass}/g" "${servercfgfullpath}"
 		fn_fix_msg_end
 	fi
diff --git a/lgsm/modules/fix_ts3.sh b/lgsm/modules/fix_ts3.sh
index c655a4322..5c80aa15e 100644
--- a/lgsm/modules/fix_ts3.sh
+++ b/lgsm/modules/fix_ts3.sh
@@ -40,7 +40,7 @@ if [ -f "${accountingfile}" ] && [ "${status}" == "0" ]; then
 	# file is not owned by the current user and needs to be deleted manually.
 	else
 		fn_print_error_nl "File ${accountingfile} is not owned by $(whoami) and needs to be deleted manually"
-		fn_script_log_fatal "File ${accountingfile} is not owned by $(whoami) and needs to be deleted manually"
+		fn_script_log_fail "File ${accountingfile} is not owned by $(whoami) and needs to be deleted manually"
 		core_exit.sh
 	fi
 fi
diff --git a/lgsm/modules/fix_ut3.sh b/lgsm/modules/fix_ut3.sh
index 97326c786..d725de4a2 100644
--- a/lgsm/modules/fix_ut3.sh
+++ b/lgsm/modules/fix_ut3.sh
@@ -10,7 +10,6 @@ moduleselfname="$(basename "$(readlink -f "${BASH_SOURCE[0]}")")"
 startparameters="server VCTF-Suspense?Game=UTGameContent.UTVehicleCTFGame_Content?bIsDedicated=true?bIsLanMatch=false?bUsesStats=false?bShouldAdvertise=false?PureServer=1?bAllowJoinInProgress=true?ConfigSubDir=${selfname} -port=${port} -queryport=${queryport} -multihome=${ip} -nohomedir -unattended -log=${gamelog}"
 
 fn_print_information "starting ${gamename} server to generate configs."
-fn_sleep_time
 exitbypass=1
 command_start.sh
 fn_firstcommand_reset
diff --git a/lgsm/modules/info_messages.sh b/lgsm/modules/info_messages.sh
index a05da414f..340e11f6b 100644
--- a/lgsm/modules/info_messages.sh
+++ b/lgsm/modules/info_messages.sh
@@ -7,15 +7,6 @@
 
 moduleselfname="$(basename "$(readlink -f "${BASH_SOURCE[0]}")")"
 
-# Separator is different for details.
-fn_messages_separator() {
-	if [ "${commandname}" == "DETAILS" ]; then
-		printf '%*s\n' "${COLUMNS:-$(tput cols)}" '' | tr ' ' =
-	else
-		echo -e "================================="
-	fi
-}
-
 # Removes the passwords form all but details.
 fn_info_message_password_strip() {
 	if [ "${commandname}" != "DETAILS" ]; then
@@ -57,7 +48,7 @@ fn_info_message_password_strip() {
 # used with alertlog
 fn_info_message_head() {
 	echo -e ""
-	echo -e "${lightyellow}Alert Summary${default}"
+	echo -e "${bold}${lightyellow}Alert Summary${default}"
 	fn_messages_separator
 	echo -e "Message"
 	echo -e "${alertbody}"
@@ -89,7 +80,7 @@ fn_info_message_distro() {
 	# glibc:     2.31
 
 	echo -e ""
-	echo -e "${lightyellow}Distro Details${default}"
+	echo -e "${bold}${lightyellow}Distro Details${default}"
 	fn_messages_separator
 	{
 		echo -e "${lightblue}Date:\t${default}$(date)"
@@ -132,7 +123,7 @@ fn_info_message_server_resource() {
 	# Internet IP:  176.58.124.96
 
 	echo -e ""
-	echo -e "${lightyellow}Server Resource${default}"
+	echo -e "${bold}${lightyellow}Server Resource${default}"
 	fn_messages_separator
 	{
 		echo -e "${lightyellow}CPU\t${default}"
@@ -185,7 +176,7 @@ fn_info_message_gameserver_resource() {
 	# Backups:      24K
 
 	echo -e ""
-	echo -e "${lightyellow}Game Server Resource Usage${default}"
+	echo -e "${bold}${lightgreen}${gamename} Resource Usage${default}"
 	fn_messages_separator
 	{
 		if [ "${status}" != "0" ] && [ -v status ]; then
@@ -234,7 +225,7 @@ fn_info_message_gameserver() {
 	# Status:           STARTED
 
 	echo -e ""
-	echo -e "${lightgreen}${gamename} Server Details${default}"
+	echo -e "${bold}${lightgreen}${gamename} Server Details${default}"
 	fn_info_message_password_strip
 	fn_messages_separator
 	{
@@ -526,7 +517,7 @@ fn_info_message_script() {
 	# Location:               /home/lgsm/csgoserver
 	# Config file:            /home/lgsm/csgoserver/serverfiles/csgo/cfg/csgoserver.cfg
 
-	echo -e "${lightgreen}${selfname} Script Details${default}"
+	echo -e "${bold}${lightgreen}${selfname} Script Details${default}"
 	fn_messages_separator
 	{
 		# Script name
@@ -618,7 +609,7 @@ fn_info_message_backup() {
 	#     size:          945M
 
 	echo -e ""
-	echo -e "${lightgreen}Backups${default}"
+	echo -e "${bold}${lightgreen}Backups${default}"
 	fn_messages_separator
 	if [ ! -d "${backupdir}" ] || [ "${backupcount}" == "0" ]; then
 		echo -e "No Backups created"
@@ -646,7 +637,7 @@ fn_info_message_commandlineparms() {
 	# ./run_server_x86.sh +set net_strict 1
 
 	echo -e ""
-	echo -e "${lightgreen}Command-line Parameters${default}"
+	echo -e "${bold}${lightgreen}Command-line Parameters${default}"
 	fn_info_message_password_strip
 	fn_messages_separator
 	if [ "${serverpassword}" == "NOT SET" ]; then
@@ -663,7 +654,7 @@ fn_info_message_ports_edit() {
 	# Change ports by editing the parameters in:
 	# /home/lgsm/qlserver/serverfiles/baseq3/ql-server.cfg
 	echo -e ""
-	echo -e "${lightgreen}Ports${default}"
+	echo -e "${bold}${lightgreen}Ports${default}"
 	fn_messages_separator
 	echo -e "${lightblue}Change ports by editing the parameters in:${default}"
 
@@ -726,8 +717,8 @@ fn_info_message_statusbottom() {
 
 fn_info_logs() {
 	echo -e ""
-	echo -e "${selfname} Logs"
-	echo -e "================================="
+	echo -e "${bold}${selfname} Logs"
+	fn_messages_separator
 
 	if [ -n "${lgsmlog}" ]; then
 		echo -e "\nScript log\n==================="
@@ -1111,7 +1102,7 @@ fn_info_message_kf() {
 		fn_port "Steam" steamport udp
 	} | column -s $'\t' -t
 	echo -e ""
-	echo -e "${lightgreen}${servername} Web Interface${default}"
+	echo -e "${bold}${lightgreen}${servername} Web Interface${default}"
 	fn_messages_separator
 	{
 		echo -e "${lightblue}Web Interface enabled:\t${default}${httpenabled}"
@@ -1130,7 +1121,7 @@ fn_info_message_kf2() {
 		fn_port "Web Interface" httpport tcp
 	} | column -s $'\t' -t
 	echo -e ""
-	echo -e "${lightgreen}${servername} Web Interface${default}"
+	echo -e "${bold}${lightgreen}${servername} Web Interface${default}"
 	fn_messages_separator
 	{
 		echo -e "${lightblue}Web Interface enabled:\t${default}${httpenabled}"
@@ -1235,7 +1226,7 @@ fn_info_message_pc() {
 		fn_port "API" apiport tcp
 	} | column -s $'\t' -t
 	echo -e ""
-	echo -e "${lightgreen}${gamename} Web Interface${default}"
+	echo -e "${bold}${lightgreen}${gamename} Web Interface${default}"
 	fn_messages_separator
 	{
 		echo -e "${lightblue}Web Interface enabled:\t${default}${httpenabled}"
@@ -1321,7 +1312,7 @@ fn_info_message_ro() {
 		fn_port "Steam" steamport udp
 	} | column -s $'\t' -t
 	echo -e ""
-	echo -e "${lightgreen}${servername} Web Interface${default}"
+	echo -e "${bold}${lightgreen}${servername} Web Interface${default}"
 	fn_messages_separator
 	{
 		echo -e "${lightblue}Web Interface enabled:\t${default}${httpenabled}"
@@ -1400,7 +1391,7 @@ fn_info_message_sdtd() {
 		fn_port "Telnet" telnetport tcp
 	} | column -s $'\t' -t
 	echo -e ""
-	echo -e "${lightgreen}${gamename} Web Interface${default}"
+	echo -e "${bold}${lightgreen}${gamename} Web Interface${default}"
 	fn_messages_separator
 	{
 		echo -e "${lightblue}Web Interface enabled:\t${default}${httpenabled}"
@@ -1408,7 +1399,7 @@ fn_info_message_sdtd() {
 		echo -e "${lightblue}Web Interface password:\t${default}${httppassword}"
 	} | column -s $'\t' -t
 	echo -e ""
-	echo -e "${lightgreen}${gamename} Telnet${default}"
+	echo -e "${bold}${lightgreen}${gamename} Telnet${default}"
 	fn_messages_separator
 	{
 		echo -e "${lightblue}Telnet enabled:\t${default}${telnetenabled}"
@@ -1475,7 +1466,7 @@ fn_info_message_spark() {
 		fn_port "Web Interface" httpport tcp
 	} | column -s $'\t' -t
 	echo -e ""
-	echo -e "${lightgreen}${gamename} Web Interface${default}"
+	echo -e "${bold}${lightgreen}${gamename} Web Interface${default}"
 	fn_messages_separator
 	{
 		echo -e "${lightblue}Web Interface url:\t${default}http://${httpip}:${httpport}/index.html"
@@ -1558,7 +1549,7 @@ fn_info_message_ut2k4() {
 		fn_port "LAN" lanport udp
 	} | column -s $'\t' -t
 	echo -e ""
-	echo -e "${lightgreen}${servername} Web Interface${default}"
+	echo -e "${bold}${lightgreen}${gamename} Web Interface${default}"
 	fn_messages_separator
 	{
 		echo -e "${lightblue}Web Interface enabled:\t${default}${httpenabled}"
@@ -1577,7 +1568,7 @@ fn_info_message_unreal() {
 		fn_port "Web Interface" httpport tcp
 	} | column -s $'\t' -t
 	echo -e ""
-	echo -e "${lightgreen}${servername} Web Interface${default}"
+	echo -e "${bold}${lightgreen}${gamename} Web Interface${default}"
 	fn_messages_separator
 	{
 		echo -e "${lightblue}Web Interface enabled:\t${default}${httpenabled}"
@@ -1613,7 +1604,7 @@ fn_info_message_ut3() {
 		fn_port "Web Interface" httpport tcp
 	} | column -s $'\t' -t
 	echo -e ""
-	echo -e "${lightgreen}${servername} Web Interface${default}"
+	echo -e "${bold}${lightgreen}${gamename} Web Interface${default}"
 	fn_messages_separator
 	{
 		echo -e "${lightblue}Web Interface enabled:\t${default}${httpenabled}"
diff --git a/lgsm/modules/install_complete.sh b/lgsm/modules/install_complete.sh
index 013ba7334..2c3cb2493 100644
--- a/lgsm/modules/install_complete.sh
+++ b/lgsm/modules/install_complete.sh
@@ -8,19 +8,19 @@
 moduleselfname="$(basename "$(readlink -f "${BASH_SOURCE[0]}")")"
 
 echo -e ""
-echo -e "================================="
+fn_messages_separator
 
 if [ "${exitcode}" == "1" ]; then
-	echo -e "Install Failed!"
+	echo -e "${bold}${red}Install Failed!${default}"
 	fn_script_log_fatal "Install Failed!"
 elif [ "${exitcode}" == "2" ]; then
-	echo -e "Install Completed with Errors!"
+	echo -e "${bold}${red}Install Completed with Errors!${default}}"
 	fn_script_log_error "Install Completed with Errors!"
 elif [ "${exitcode}" == "3" ]; then
-	echo -e "Install Completed with Warnings!"
+	echo -e "${bold}${lightyellow}Install Completed with Warnings!${default}}"
 	fn_script_log_warn "Install Completed with Warnings!"
 elif [ -z "${exitcode}" ] || [ "${exitcode}" == "0" ]; then
-	echo -e "Install Complete!"
+	echo -e "${bold}${green}Install Complete!${default}"
 	fn_script_log_pass "Install Complete!"
 fi
 
diff --git a/lgsm/modules/install_config.sh b/lgsm/modules/install_config.sh
index 54f819aaf..1e3c243ab 100644
--- a/lgsm/modules/install_config.sh
+++ b/lgsm/modules/install_config.sh
@@ -19,9 +19,12 @@ fn_check_cfgdir() {
 # Downloads default configs from Game-Server-Configs repo to lgsm/config-default.
 fn_fetch_default_config() {
 	echo -e ""
-	echo -e "${lightyellow}Downloading ${gamename} Configs${default}"
-	echo -e "================================="
-	echo -e "default configs from https://github.com/GameServerManagers/Game-Server-Configs"
+	echo -e "${bold}${lightyellow}Downloading ${gamename} Configs${default}"
+	fn_messages_separator
+	echo -e "Downloading default configs from:"
+	echo -e ""
+	echo -e "${italic}https://github.com/GameServerManagers/Game-Server-Configs${default}"
+	echo -e ""
 	fn_sleep_time
 	mkdir -p "${lgsmdir}/config-default/config-game"
 	githuburl="https://raw.githubusercontent.com/GameServerManagers/Game-Server-Configs/main"
@@ -54,9 +57,20 @@ fn_default_config_remote() {
 
 # Copys local default config to server config location.
 fn_default_config_local() {
-	echo -e "copying ${servercfgdefault} config file."
-	cp -nv "${servercfgdir}/${servercfgdefault}" "${servercfgfullpath}"
-	fn_sleep_time
+	echo -e ""
+	echo -e "${bold}${lightyellow}Copying ${gamename} Configs${default}"
+	fn_messages_separator
+	echo -e "Copying default configs."
+	fn_check_cfgdir
+	echo -en "copying config file [ ${italic}${servercfgdefault}${default} ]"
+	cp -n "${servercfgdir}/${servercfgdefault}" "${servercfgfullpath}"
+	if [ "${exitcode}" != 0 ]; then
+		fn_print_fail_eol
+		fn_script_log_fatal "copying config file [ ${servercfgdefault} ]"
+	else
+		fn_print_ok_eol
+		fn_script_log_pass "copying config file [ ${servercfgdefault} ]"
+	fi
 }
 
 # Changes some variables within the default configs.
@@ -64,9 +78,9 @@ fn_default_config_local() {
 # PASSWORD to random password
 fn_set_config_vars() {
 	if [ -f "${servercfgfullpath}" ]; then
-		random=$(tr -dc 'A-Za-z0-9_' < /dev/urandom 2>/dev/null | head -c 8 | xargs)
+		randomstring=$(tr -dc 'A-Za-z0-9_' < /dev/urandom 2> /dev/null | head -c 8 | xargs)
 		servername="LinuxGSM"
-		rconpass="admin${random}"
+		rconpass="admin${randomstring}"
 		echo -e "changing hostname."
 		fn_script_log_info "changing hostname."
 		fn_sleep_time
@@ -107,8 +121,8 @@ fn_set_dst_config_vars() {
 		fn_sleep_time
 		echo -e "randomizing cluster key."
 		fn_script_log_info "randomizing cluster key."
-		randomkey=$(tr -dc A-Za-z0-9_ < /dev/urandom | head -c 8 | xargs)
-		sed -i "s/CLUSTERKEY/${randomkey}/g" "${clustercfgfullpath}"
+		randomstring=$(tr -dc 'A-Za-z0-9_' < /dev/urandom 2> /dev/null | head -c 8 | xargs)
+		sed -i "s/CLUSTERKEY/${randomstring}/g" "${clustercfgfullpath}"
 		fn_sleep_time
 	else
 		echo -e "${clustercfg} is already configured."
@@ -146,8 +160,8 @@ fn_set_dst_config_vars() {
 # Lists local config file locations
 fn_list_config_locations() {
 	echo -e ""
-	echo -e "${lightyellow}Config File Locations${default}"
-	echo -e "================================="
+	echo -e "${bold}${lightyellow}Config Locations${default}"
+	fn_messages_separator
 	if [ -n "${servercfgfullpath}" ]; then
 		if [ -f "${servercfgfullpath}" ]; then
 			echo -e "Game Server Config File: ${servercfgfullpath}"
diff --git a/lgsm/modules/install_dst_token.sh b/lgsm/modules/install_dst_token.sh
index 43db58fab..89ec00a90 100644
--- a/lgsm/modules/install_dst_token.sh
+++ b/lgsm/modules/install_dst_token.sh
@@ -8,9 +8,8 @@
 moduleselfname="$(basename "$(readlink -f "${BASH_SOURCE[0]}")")"
 
 echo -e ""
-echo -e "${lightyellow}Enter ${gamename} Cluster Token${default}"
-echo -e "================================="
-fn_sleep_time
+echo -e "${bold}${lightyellow}Enter ${gamename} Cluster Token${default}"
+fn_messages_separator
 echo -e "A cluster token is required to run this server!"
 echo -e "Follow the instructions in this link to obtain this key:"
 echo -e "https://linuxgsm.com/dst-auth-token"
diff --git a/lgsm/modules/install_eula.sh b/lgsm/modules/install_eula.sh
index d70ca7d31..7f0229bfa 100644
--- a/lgsm/modules/install_eula.sh
+++ b/lgsm/modules/install_eula.sh
@@ -16,9 +16,8 @@ elif [ "${shortname}" == "ut" ]; then
 fi
 
 echo -e ""
-echo -e "${lightyellow}Accept ${gamename} EULA${default}"
-echo -e "================================="
-fn_sleep_time
+echo -e "${bold}${lightyellow}Accept ${gamename} EULA${default}"
+fn_messages_separator
 echo -e "You are required to accept the EULA:"
 echo -e "${eulaurl}"
 echo -e ""
diff --git a/lgsm/modules/install_factorio_save.sh b/lgsm/modules/install_factorio_save.sh
index c86ee2f37..589a9d8ed 100644
--- a/lgsm/modules/install_factorio_save.sh
+++ b/lgsm/modules/install_factorio_save.sh
@@ -8,8 +8,7 @@
 moduleselfname="$(basename "$(readlink -f "${BASH_SOURCE[0]}")")"
 
 echo -e ""
-echo -e "${lightyellow}Creating initial Factorio savefile${default}"
-echo -e "================================="
-fn_sleep_time
+echo -e "${bold}${lightyellow}Creating initial Factorio savefile${default}"
+fn_messages_separator
 check_glibc.sh
 "${executabledir}"/factorio --create "${serverfiles}/save1"
diff --git a/lgsm/modules/install_gslt.sh b/lgsm/modules/install_gslt.sh
index e2224276f..772885d64 100644
--- a/lgsm/modules/install_gslt.sh
+++ b/lgsm/modules/install_gslt.sh
@@ -8,8 +8,8 @@
 moduleselfname="$(basename "$(readlink -f "${BASH_SOURCE[0]}")")"
 
 echo -e ""
-echo -e "${lightyellow}Game Server Login Token${default}"
-echo -e "================================="
+echo -e "${bold}${lightyellow}Game Server Login Token${default}"
+fn_messages_separator
 fn_sleep_time
 if [ "${shortname}" == "csgo" ] || [ "${shortname}" == "css" ] || [ "${shortname}" == "nmrih" ] || [ "${shortname}" == "bs" ]; then
 	echo -e "GSLT is required to run a public ${gamename} server"
diff --git a/lgsm/modules/install_header.sh b/lgsm/modules/install_header.sh
index b52e116e7..a7f1f9ddb 100644
--- a/lgsm/modules/install_header.sh
+++ b/lgsm/modules/install_header.sh
@@ -9,14 +9,12 @@ moduleselfname="$(basename "$(readlink -f "${BASH_SOURCE[0]}")")"
 
 clear
 fn_print_ascii_logo
-fn_sleep_time
-echo -e "================================="
-echo -e "${lightyellow}Linux${default}GSM_"
-echo -e "by Daniel Gibbs"
+fn_messages_separator
+echo -e "${bold}${lightyellow}Linux${default}${bold}GSM_${default}"
+echo -e "${italic}by Daniel Gibbs${default}"
 echo -e "${lightblue}Version:${default} ${version}"
 echo -e "${lightblue}Game:${default} ${gamename}"
 echo -e "${lightblue}Website:${default} https://linuxgsm.com"
 echo -e "${lightblue}Contributors:${default} https://linuxgsm.com/contrib"
 echo -e "${lightblue}Sponsor:${default} https://linuxgsm.com/sponsor"
-echo -e "================================="
-fn_sleep_time
+fn_messages_separator
diff --git a/lgsm/modules/install_logs.sh b/lgsm/modules/install_logs.sh
index cd26addd3..5b12dd3e1 100644
--- a/lgsm/modules/install_logs.sh
+++ b/lgsm/modules/install_logs.sh
@@ -9,8 +9,9 @@ moduleselfname="$(basename "$(readlink -f "${BASH_SOURCE[0]}")")"
 
 if [ "${checklogs}" != "1" ]; then
 	echo -e ""
-	echo -e "${lightyellow}Creating log directories${default}"
-	echo -e "================================="
+	echo -e "${bold}${lightyellow}Creating Log Directories${default}"
+	fn_messages_separator
+	fn_sleep_time
 fi
 fn_sleep_time
 # Create LinuxGSM logs.
diff --git a/lgsm/modules/install_server_dir.sh b/lgsm/modules/install_server_dir.sh
index 08e83dce6..0136e52fc 100644
--- a/lgsm/modules/install_server_dir.sh
+++ b/lgsm/modules/install_server_dir.sh
@@ -8,8 +8,8 @@
 moduleselfname="$(basename "$(readlink -f "${BASH_SOURCE[0]}")")"
 
 echo -e ""
-echo -e "${lightyellow}Server Directory${default}"
-echo -e "================================="
+echo -e "${bold}${lightyellow}Server Directory${default}"
+fn_messages_separator
 fn_sleep_time
 if [ -d "${serverfiles}" ]; then
 	fn_print_warning_nl "A server is already installed here."
diff --git a/lgsm/modules/install_server_files.sh b/lgsm/modules/install_server_files.sh
index 70eb808b0..2763f470b 100644
--- a/lgsm/modules/install_server_files.sh
+++ b/lgsm/modules/install_server_files.sh
@@ -199,16 +199,15 @@ fn_install_server_files() {
 		md5="0188ae86dbc9376f11ae3032dba2d665"
 	else
 		fn_print_fail_nl "Installing ${gamename} Server failed, missing default configuration"
-		fn_script_log_fatal "Installing ${gamename} Server failed, missing default configuration"
+		fn_script_log_fail "Installing ${gamename} Server failed, missing default configuration"
 	fi
 	fn_fetch_file "${remote_fileurl}" "" "" "" "${local_filedir}" "${local_filename}" "${chmodx}" "${run}" "${forcedl}" "${md5}"
 	fn_dl_extract "${local_filedir}" "${local_filename}" "${serverfiles}"
 }
 
 echo -e ""
-echo -e "${lightyellow}Installing ${gamename} Server${default}"
-echo -e "================================="
-fn_sleep_time
+echo -e "${bold}${lightyellow}Installing ${gamename} Server${default}"
+fn_messages_separator
 
 if [ "${appid}" ]; then
 	remotelocation="SteamCMD"
@@ -250,7 +249,7 @@ fi
 
 if [ -z "${autoinstall}" ]; then
 	echo -e ""
-	echo -e "================================="
+	fn_messages_separator
 	if ! fn_prompt_yn "Was the install successful?" Y; then
 		install_retry.sh
 	fi
diff --git a/lgsm/modules/install_squad_license.sh b/lgsm/modules/install_squad_license.sh
index 75499f4a0..604b3bcad 100644
--- a/lgsm/modules/install_squad_license.sh
+++ b/lgsm/modules/install_squad_license.sh
@@ -8,9 +8,8 @@
 moduleselfname="$(basename "$(readlink -f "${BASH_SOURCE[0]}")")"
 
 echo -e ""
-echo -e "${lightyellow}Squad Server License${default}"
-echo -e "================================="
-fn_sleep_time
+echo -e "${bold}${lightyellow}${gamename} Server License${default}"
+fn_messages_separator
 echo -e "Server license is an optional feature for ${gamename} server"
 fn_script_log_info "Server license is an optional feature for ${gamename} server"
 
diff --git a/lgsm/modules/install_stats.sh b/lgsm/modules/install_stats.sh
index 8c65c007c..c3e92323d 100644
--- a/lgsm/modules/install_stats.sh
+++ b/lgsm/modules/install_stats.sh
@@ -8,12 +8,13 @@
 moduleselfname="$(basename "$(readlink -f "${BASH_SOURCE[0]}")")"
 
 echo -e ""
-echo -e "${lightyellow}LinuxGSM Stats${default}"
-echo -e "================================="
+echo -e "${bold}${lightyellow}LinuxGSM Stats${default}"
+fn_messages_separator
 fn_sleep_time
 echo -e "Assist LinuxGSM development by sending anonymous stats to developers."
-echo -e "More info: https://docs.linuxgsm.com/configuration/linuxgsm-stats"
-echo -e "The following info will be sent:"
+echo -e "Collected data is publicly available: ${italic}https://linuxgsm.com/data/usage${default}"
+echo -e "More info: ${italic}https://docs.linuxgsm.com/configuration/linuxgsm-stats${default}"
+echo -e "The following info will be sent: "
 echo -e "* game server"
 echo -e "* distro"
 echo -e "* game server resource usage"
diff --git a/lgsm/modules/install_steamcmd.sh b/lgsm/modules/install_steamcmd.sh
index 8eeb2de53..50599ebd5 100644
--- a/lgsm/modules/install_steamcmd.sh
+++ b/lgsm/modules/install_steamcmd.sh
@@ -8,7 +8,6 @@
 moduleselfname="$(basename "$(readlink -f "${BASH_SOURCE[0]}")")"
 
 echo -e ""
-echo -e "${lightyellow}Installing SteamCMD${default}"
-echo -e "================================="
-fn_sleep_time
+echo -e "${bold}${lightyellow}Installing SteamCMD${default}"
+fn_messages_separator
 check_steamcmd.sh
diff --git a/lgsm/modules/install_ts3db.sh b/lgsm/modules/install_ts3db.sh
index 703f9b645..e5776c30f 100644
--- a/lgsm/modules/install_ts3db.sh
+++ b/lgsm/modules/install_ts3db.sh
@@ -14,7 +14,7 @@ fn_install_ts3db_mariadb() {
 		local exitcode=$?
 		if [ "${exitcode}" != "0" ]; then
 			fn_print_fail_eol_nl
-			fn_script_log_fatal "copying libmariadb.so.2"
+			fn_script_log_fail "copying libmariadb.so.2"
 			core_exit.sh
 		else
 			fn_print_ok_eol_nl
@@ -23,9 +23,8 @@ fn_install_ts3db_mariadb() {
 	fi
 
 	echo -e ""
-	echo -e "${lightyellow}Configure ${gamename} Server for MariaDB${default}"
-	echo -e "================================="
-	fn_sleep_time
+	echo -e "${bold}${lightyellow}Configure ${gamename} Server for MariaDB${default}"
+	fn_messages_separator
 	read -rp "Enter MariaDB hostname: " mariahostname
 	read -rp "Enter MariaDB port: " mariaport
 	read -rp "Enter MariaDB username: " mariausername
@@ -50,9 +49,8 @@ fn_install_ts3db_mariadb() {
 }
 
 echo -e ""
-echo -e "${lightyellow}Select Database${default}"
-echo -e "================================="
-fn_sleep_time
+echo -e "${bold}${lightyellow}Select Database${default}"
+fn_messages_separator
 if [ -z "${autoinstall}" ]; then
 	if fn_prompt_yn "Do you want to use MariaDB instead of sqlite? (MariaDB must be pre-configured)" N; then
 		fn_install_ts3db_mariadb
@@ -64,9 +62,8 @@ fi
 install_eula.sh
 
 echo -e ""
-echo -e "${lightyellow}Getting Privilege Key${default}"
-echo -e "================================="
-fn_sleep_time
+echo -e "${bold}${lightyellow}Getting Privilege Key${default}"
+fn_messages_separator
 fn_print_information_nl "Save these details for later."
 fn_print_information_nl "Key also saved in:"
 echo -e "${serverfiles}/privilege_key.txt"
diff --git a/lgsm/modules/install_ut2k4_key.sh b/lgsm/modules/install_ut2k4_key.sh
index c09c4590c..6fbd2a838 100644
--- a/lgsm/modules/install_ut2k4_key.sh
+++ b/lgsm/modules/install_ut2k4_key.sh
@@ -8,9 +8,8 @@
 moduleselfname="$(basename "$(readlink -f "${BASH_SOURCE[0]}")")"
 
 echo -e ""
-echo -e "${lightyellow}Enter ${gamename} CD Key${default}"
-echo -e "================================="
-fn_sleep_time
+echo -e "${bold}${lightyellow}Enter ${gamename} CD Key${default}"
+fn_messages_separator
 echo -e "To get your server listed on the Master Server list"
 echo -e "you must get a free CD key. Get a key here:"
 echo -e "https://www.epicgames.com/unrealtournament/forums/cdkey.php?2004"
diff --git a/lgsm/modules/mods_core.sh b/lgsm/modules/mods_core.sh
index 2078ae167..1b85a95b3 100644
--- a/lgsm/modules/mods_core.sh
+++ b/lgsm/modules/mods_core.sh
@@ -22,7 +22,7 @@ fn_mod_install_files() {
 	# Check if variable is valid checking if file has been downloaded and exists.
 	if [ ! -f "${modstmpdir}/${modfilename}" ]; then
 		fn_print_failure "An issue occurred downloading ${modprettyname}"
-		fn_script_log_fatal "An issue occurred downloading ${modprettyname}"
+		fn_script_log_fail "An issue occurred downloading ${modprettyname}"
 		core_exit.sh
 	fi
 	if [ ! -d "${extractdest}" ]; then
@@ -77,7 +77,7 @@ fn_mod_create_filelist() {
 	local exitcode=$?
 	if [ "${exitcode}" != 0 ]; then
 		fn_print_fail_eol_nl
-		fn_script_log_fatal "Building ${modsdir}/${modcommand}-files.txt"
+		fn_script_log_fail "Building ${modsdir}/${modcommand}-files.txt"
 		core_exit.sh
 	else
 		fn_print_ok_eol_nl
@@ -97,7 +97,7 @@ fn_mod_copy_destination() {
 	local exitcode=$?
 	if [ "${exitcode}" != 0 ]; then
 		fn_print_fail_eol_nl
-		fn_script_log_fatal "Copying ${modprettyname} to ${modinstalldir}"
+		fn_script_log_fail "Copying ${modprettyname} to ${modinstalldir}"
 	else
 		fn_print_ok_eol_nl
 		fn_script_log_pass "Copying ${modprettyname} to ${modinstalldir}"
@@ -135,7 +135,7 @@ fn_mod_tidy_files_list() {
 		local exitcode=$?
 		if [ "${exitcode}" != 0 ]; then
 			fn_print_fail_eol_nl
-			fn_script_log_fatal "Error while tidying line: ${removefilevar} from: ${modsdir}/${modcommand}-files.txt"
+			fn_script_log_fail "Error while tidying line: ${removefilevar} from: ${modsdir}/${modcommand}-files.txt"
 			core_exit.sh
 			break
 		fi
@@ -228,7 +228,7 @@ fn_mod_get_info() {
 # Define all variables for a mod at once when index is set to a separator.
 fn_mods_define() {
 	if [ -z "$index" ]; then
-		fn_script_log_fatal "index variable not set. Please report an issue."
+		fn_script_log_fail "index variable not set. Please report an issue."
 		fn_print_error "index variable not set. Please report an issue."
 		echo -e "* https://github.com/GameServerManagers/LinuxGSM/issues"
 		core_exit.sh
@@ -390,7 +390,7 @@ fn_create_mods_dir() {
 		exitcode=$?
 		if [ "${exitcode}" != 0 ]; then
 			fn_print_fail_eol_nl
-			fn_script_log_fatal "Creating mod download dir ${modsdir}"
+			fn_script_log_fail "Creating mod download dir ${modsdir}"
 			core_exit.sh
 		else
 			fn_print_ok_eol_nl
@@ -404,7 +404,7 @@ fn_create_mods_dir() {
 		exitcode=$?
 		if [ "${exitcode}" != 0 ]; then
 			fn_print_fail_eol_nl
-			fn_script_log_fatal "Creating mod install directory ${modinstalldir}"
+			fn_script_log_fail "Creating mod install directory ${modinstalldir}"
 			core_exit.sh
 		else
 			fn_print_ok_eol_nl
@@ -427,7 +427,7 @@ fn_mods_create_tmp_dir() {
 		echo -en "creating mod download directory ${modstmpdir}..."
 		if [ "${exitcode}" != 0 ]; then
 			fn_print_fail_eol_nl
-			fn_script_log_fatal "Creating mod download directory ${modstmpdir}"
+			fn_script_log_fail "Creating mod download directory ${modstmpdir}"
 			core_exit.sh
 		else
 			fn_print_ok_eol_nl
@@ -444,7 +444,7 @@ fn_mods_clear_tmp_dir() {
 		exitcode=$?
 		if [ "${exitcode}" != 0 ]; then
 			fn_print_fail_eol_nl
-			fn_script_log_fatal "Clearing mod download directory ${modstmpdir}"
+			fn_script_log_fail "Clearing mod download directory ${modstmpdir}"
 			core_exit.sh
 		else
 			fn_print_ok_eol_nl
@@ -491,12 +491,12 @@ fn_check_mod_files_list() {
 		if [ "${modsfilelistsize}" -eq 0 ]; then
 			fn_print_failure "${modcommand}-files.txt is empty"
 			echo -e "* Unable to remove ${modprettyname}"
-			fn_script_log_fatal "${modcommand}-files.txt is empty: Unable to remove ${modprettyname}."
+			fn_script_log_fail "${modcommand}-files.txt is empty: Unable to remove ${modprettyname}."
 			core_exit.sh
 		fi
 	else
 		fn_print_failure "${modsdir}/${modcommand}-files.txt does not exist"
-		fn_script_log_fatal "${modsdir}/${modcommand}-files.txt does not exist: Unable to remove ${modprettyname}."
+		fn_script_log_fail "${modsdir}/${modcommand}-files.txt does not exist: Unable to remove ${modprettyname}."
 		core_exit.sh
 	fi
 }
@@ -519,7 +519,7 @@ fn_mod_exist() {
 fn_mod_required_fail_exist() {
 	modreq=$1
 	# requires one parameter, the mod
-	fn_script_log_fatal "${modreq}-files.txt is empty: unable to find ${modreq} installed"
+	fn_script_log_fail "${modreq}-files.txt is empty: unable to find ${modreq} installed"
 	echo -en "* Unable to find '${modreq}' which is required prior to installing this mod..."
 	fn_print_fail_eol_nl
 	core_exit.sh
@@ -581,7 +581,7 @@ fn_mod_install_liblist_gam_file() {
 		exitcode=$?
 		# if replacement back didn't happen, error out.
 		if [ "${exitcode}" != 0 ]; then
-			fn_script_log_fatal "${logentry}"
+			fn_script_log_fail "${logentry}"
 			fn_print_fail_eol_nl
 		else
 			fn_script_log_pass "${logentry}"
@@ -597,7 +597,7 @@ fn_mod_install_liblist_gam_file() {
 		exitcode=$?
 		# if replacement back didn't happen, error out
 		if [ "${exitcode}" != 0 ]; then
-			fn_script_log_fatal "${logentry}"
+			fn_script_log_fail "${logentry}"
 			fn_print_fail_eol_nl
 		else
 			fn_script_log_pass "${logentry}"
@@ -615,7 +615,7 @@ fn_mod_install_liblist_gam_file() {
 			exitcode=$?
 			# if replacement back didn't happen, error out.
 			if [ "${exitcode}" != 0 ]; then
-				fn_script_log_fatal "${logentry}"
+				fn_script_log_fail "${logentry}"
 				fn_print_fail_eol_nl
 			else
 				fn_script_log_pass ${logentry}
@@ -639,7 +639,7 @@ fn_mod_remove_liblist_gam_file() {
 		exitcode=$?
 		# if replacement back didn't happen, error out.
 		if [ "${exitcode}" != 0 ]; then
-			fn_script_log_fatal "${logentry}"
+			fn_script_log_fail "${logentry}"
 			fn_print_fail_eol_nl
 		else
 			fn_script_log_pass ${logentry}
@@ -655,7 +655,7 @@ fn_mod_remove_liblist_gam_file() {
 		exitcode=$?
 		# if replacement back didn't happen, error out
 		if [ "${exitcode}" != 0 ]; then
-			fn_script_log_fatal "${logentry}"
+			fn_script_log_fail "${logentry}"
 			fn_print_fail_eol_nl
 		else
 			fn_script_log_pass ${logentry}
@@ -673,7 +673,7 @@ fn_mod_remove_liblist_gam_file() {
 			# if replacement back didn't happen, error out.
 			exitcode=$?
 			if [ "${exitcode}" != 0 ]; then
-				fn_script_log_fatal "${logentry}"
+				fn_script_log_fail "${logentry}"
 				fn_print_fail_eol_nl
 			else
 				fn_script_log_pass ${logentry}
@@ -696,7 +696,7 @@ fn_mod_install_amxmodx_file() {
 			echo "linux addons/amxmodx/dlls/amxmodx_mm_i386.so" >> "${modinstalldir}/addons/metamod/plugins.ini"
 			exitcode=$?
 			if [ "${exitcode}" != 0 ]; then
-				fn_script_log_fatal "${logentry}"
+				fn_script_log_fail "${logentry}"
 				fn_print_fail_eol_nl
 			else
 				fn_script_log_pass ${logentry}
@@ -708,7 +708,7 @@ fn_mod_install_amxmodx_file() {
 		echo "linux addons/amxmodx/dlls/amxmodx_mm_i386.so" > "${modinstalldir}/addons/metamod/plugins.ini"
 		exitcode=$?
 		if [ "${exitcode}" != 0 ]; then
-			fn_script_log_fatal "${logentry}"
+			fn_script_log_fail "${logentry}"
 			fn_print_fail_eol_nl
 			core_exit.sh
 		else
@@ -733,7 +733,7 @@ fn_mod_remove_amxmodx_file() {
 			sed -i '/^$/d' "${modinstalldir}/addons/metamod/plugins.ini"
 			exitcode=$?
 			if [ "${exitcode}" != 0 ]; then
-				fn_script_log_fatal "${logentry}"
+				fn_script_log_fail "${logentry}"
 				fn_print_fail_eol_nl
 			else
 				fn_script_log_pass ${logentry}
diff --git a/lgsm/modules/update_fctr.sh b/lgsm/modules/update_fctr.sh
index 9b88fcd17..2eef0d4cd 100644
--- a/lgsm/modules/update_fctr.sh
+++ b/lgsm/modules/update_fctr.sh
@@ -46,7 +46,7 @@ fn_update_remotebuild() {
 		# Checks if remotebuildversion variable has been set.
 		if [ -z "${remotebuildversion}" ] || [ "${remotebuildversion}" == "null" ]; then
 			fn_print_fail "Checking remote build: ${remotelocation}"
-			fn_script_log_fatal "Checking remote build"
+			fn_script_log_fail "Checking remote build"
 			core_exit.sh
 		else
 			fn_print_ok "Checking remote build: ${remotelocation}"
@@ -56,7 +56,7 @@ fn_update_remotebuild() {
 		# Checks if remotebuild variable has been set.
 		if [ -z "${remotebuildversion}" ] || [ "${remotebuildversion}" == "null" ]; then
 			fn_print_failure "Unable to get remote build"
-			fn_script_log_fatal "Unable to get remote build"
+			fn_script_log_fail "Unable to get remote build"
 			core_exit.sh
 		fi
 	fi
diff --git a/lgsm/modules/update_jk2.sh b/lgsm/modules/update_jk2.sh
index e67b0c02b..f685fd4cb 100644
--- a/lgsm/modules/update_jk2.sh
+++ b/lgsm/modules/update_jk2.sh
@@ -43,7 +43,7 @@ fn_update_remotebuild() {
 		# Checks if remotebuildversion variable has been set.
 		if [ -z "${remotebuildversion}" ] || [ "${remotebuildversion}" == "null" ]; then
 			fn_print_fail "Checking remote build: ${remotelocation}"
-			fn_script_log_fatal "Checking remote build"
+			fn_script_log_fail "Checking remote build"
 			core_exit.sh
 		else
 			fn_print_ok "Checking remote build: ${remotelocation}"
@@ -53,7 +53,7 @@ fn_update_remotebuild() {
 		# Checks if remotebuild variable has been set.
 		if [ -z "${remotebuildversion}" ] || [ "${remotebuildversion}" == "null" ]; then
 			fn_print_failure "Unable to get remote build"
-			fn_script_log_fatal "Unable to get remote build"
+			fn_script_log_fail "Unable to get remote build"
 			core_exit.sh
 		fi
 	fi
diff --git a/lgsm/modules/update_mc.sh b/lgsm/modules/update_mc.sh
index 2f7381da7..c4aa1b425 100644
--- a/lgsm/modules/update_mc.sh
+++ b/lgsm/modules/update_mc.sh
@@ -58,7 +58,7 @@ fn_update_remotebuild() {
 		# Checks if remotebuildversion variable has been set.
 		if [ -z "${remotebuildversion}" ] || [ "${remotebuildversion}" == "null" ]; then
 			fn_print_fail "Checking remote build: ${remotelocation}"
-			fn_script_log_fatal "Checking remote build"
+			fn_script_log_fail "Checking remote build"
 			core_exit.sh
 		else
 			fn_print_ok "Checking remote build: ${remotelocation}"
@@ -68,7 +68,7 @@ fn_update_remotebuild() {
 		# Checks if remotebuild variable has been set.
 		if [ -z "${remotebuildversion}" ] || [ "${remotebuildversion}" == "null" ]; then
 			fn_print_failure "Unable to get remote build"
-			fn_script_log_fatal "Unable to get remote build"
+			fn_script_log_fail "Unable to get remote build"
 			core_exit.sh
 		fi
 	fi
diff --git a/lgsm/modules/update_mcb.sh b/lgsm/modules/update_mcb.sh
index f3a802e9e..eb8adfd12 100644
--- a/lgsm/modules/update_mcb.sh
+++ b/lgsm/modules/update_mcb.sh
@@ -18,7 +18,7 @@ fn_update_dl() {
 	local exitcode=$?
 	if [ "${exitcode}" != 0 ]; then
 		fn_print_fail_eol_nl
-		fn_script_log_fatal "Extracting ${local_filename}"
+		fn_script_log_fail "Extracting ${local_filename}"
 		if [ -f "${lgsmlog}" ]; then
 			echo -e "${extractcmd}" >> "${lgsmlog}"
 		fi
@@ -50,10 +50,10 @@ fn_update_localbuild() {
 
 fn_update_remotebuild() {
 	# Random number for userAgent
-	randnum=$((1 + RANDOM % 5000))
+	randomint=$(tr -dc 0-9 < /dev/urandom 2> /dev/null | head -c 4 | xargs)
 	# Get remote build info.
 	if [ "${mcversion}" == "latest" ]; then
-		remotebuildversion=$(curl -H "Accept-Encoding: identity" -H "Accept-Language: en" -Ls -A "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/90.0.${randnum}.212 Safari/537.36" "https://www.minecraft.net/en-us/download/server/bedrock/" | grep -o 'https://minecraft.azureedge.net/bin-linux/[^"]*' | sed 's/.*\///' | grep -Eo "[.0-9]+[0-9]")
+		remotebuildversion=$(curl -H "Accept-Encoding: identity" -H "Accept-Language: en" -Ls -A "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/90.0.${randomint}.212 Safari/537.36" "https://www.minecraft.net/en-us/download/server/bedrock/" | grep -o 'https://minecraft.azureedge.net/bin-linux/[^"]*' | sed 's/.*\///' | grep -Eo "[.0-9]+[0-9]")
 	else
 		remotebuildversion="${mcversion}"
 	fi
@@ -64,7 +64,7 @@ fn_update_remotebuild() {
 		# Checks if remotebuildversion variable has been set.
 		if [ -z "${remotebuildversion}" ] || [ "${remotebuildversion}" == "null" ]; then
 			fn_print_fail "Checking remote build: ${remotelocation}"
-			fn_script_log_fatal "Checking remote build"
+			fn_script_log_fail "Checking remote build"
 			core_exit.sh
 		else
 			fn_print_ok "Checking remote build: ${remotelocation}"
@@ -74,7 +74,7 @@ fn_update_remotebuild() {
 		# Checks if remotebuild variable has been set.
 		if [ -z "${remotebuildversion}" ] || [ "${remotebuildversion}" == "null" ]; then
 			fn_print_failure "Unable to get remote build"
-			fn_script_log_fatal "Unable to get remote build"
+			fn_script_log_fail "Unable to get remote build"
 			core_exit.sh
 		fi
 	fi
diff --git a/lgsm/modules/update_mta.sh b/lgsm/modules/update_mta.sh
index fd728b22d..cd1195563 100644
--- a/lgsm/modules/update_mta.sh
+++ b/lgsm/modules/update_mta.sh
@@ -45,7 +45,7 @@ fn_update_remotebuild() {
 		# Checks if remotebuildversion variable has been set.
 		if [ -z "${remotebuildversion}" ] || [ "${remotebuildversion}" == "null" ]; then
 			fn_print_fail "Checking remote build: ${remotelocation}"
-			fn_script_log_fatal "Checking remote build"
+			fn_script_log_fail "Checking remote build"
 			core_exit.sh
 		else
 			fn_print_ok "Checking remote build: ${remotelocation}"
@@ -55,7 +55,7 @@ fn_update_remotebuild() {
 		# Checks if remotebuild variable has been set.
 		if [ -z "${remotebuildversion}" ] || [ "${remotebuildversion}" == "null" ]; then
 			fn_print_failure "Unable to get remote build"
-			fn_script_log_fatal "Unable to get remote build"
+			fn_script_log_fail "Unable to get remote build"
 			core_exit.sh
 		fi
 	fi
diff --git a/lgsm/modules/update_pmc.sh b/lgsm/modules/update_pmc.sh
index 2ad6b91ab..9bfa82101 100644
--- a/lgsm/modules/update_pmc.sh
+++ b/lgsm/modules/update_pmc.sh
@@ -68,7 +68,7 @@ fn_update_remotebuild() {
 		# Checks if remotebuildversion variable has been set.
 		if [ -z "${remotebuildversion}" ] || [ "${remotebuildversion}" == "null" ]; then
 			fn_print_fail "Checking remote build: ${remotelocation}"
-			fn_script_log_fatal "Checking remote build"
+			fn_script_log_fail "Checking remote build"
 			core_exit.sh
 		else
 			fn_print_ok "Checking remote build: ${remotelocation}"
@@ -78,7 +78,7 @@ fn_update_remotebuild() {
 		# Checks if remotebuild variable has been set.
 		if [ -z "${remotebuildversion}" ] || [ "${remotebuildversion}" == "null" ]; then
 			fn_print_failure "Unable to get remote build"
-			fn_script_log_fatal "Unable to get remote build"
+			fn_script_log_fail "Unable to get remote build"
 			core_exit.sh
 		fi
 	fi
diff --git a/lgsm/modules/update_ts3.sh b/lgsm/modules/update_ts3.sh
index bb137a0b3..c00ae75cb 100644
--- a/lgsm/modules/update_ts3.sh
+++ b/lgsm/modules/update_ts3.sh
@@ -50,7 +50,7 @@ fn_update_remotebuild() {
 		# Checks if remotebuildversion variable has been set.
 		if [ -z "${remotebuildversion}" ] || [ "${remotebuildversion}" == "null" ]; then
 			fn_print_fail "Checking remote build: ${remotelocation}"
-			fn_script_log_fatal "Checking remote build"
+			fn_script_log_fail "Checking remote build"
 			core_exit.sh
 		else
 			fn_print_ok "Checking remote build: ${remotelocation}"
@@ -60,7 +60,7 @@ fn_update_remotebuild() {
 		# Checks if remotebuild variable has been set.
 		if [ -z "${remotebuildversion}" ] || [ "${remotebuildversion}" == "null" ]; then
 			fn_print_failure "Unable to get remote build"
-			fn_script_log_fatal "Unable to get remote build"
+			fn_script_log_fail "Unable to get remote build"
 			core_exit.sh
 		fi
 	fi
@@ -164,7 +164,7 @@ elif [ "${arch}" == "i386" ] || [ "${arch}" == "i686" ]; then
 	ts3arch="x86"
 else
 	fn_print_failure "Unknown or unsupported architecture: ${arch}"
-	fn_script_log_fatal "Unknown or unsupported architecture: ${arch}"
+	fn_script_log_fail "Unknown or unsupported architecture: ${arch}"
 	core_exit.sh
 fi
 
diff --git a/lgsm/modules/update_ut99.sh b/lgsm/modules/update_ut99.sh
index c1dc1dade..bdd3631f3 100644
--- a/lgsm/modules/update_ut99.sh
+++ b/lgsm/modules/update_ut99.sh
@@ -44,7 +44,7 @@ fn_update_remotebuild() {
 		# Checks if remotebuildversion variable has been set.
 		if [ -z "${remotebuildversion}" ] || [ "${remotebuildversion}" == "null" ]; then
 			fn_print_fail "Checking remote build: ${remotelocation}"
-			fn_script_log_fatal "Checking remote build"
+			fn_script_log_fail "Checking remote build"
 			core_exit.sh
 		else
 			fn_print_ok "Checking remote build: ${remotelocation}"
@@ -54,7 +54,7 @@ fn_update_remotebuild() {
 		# Checks if remotebuild variable has been set.
 		if [ -z "${remotebuildversion}" ] || [ "${remotebuildversion}" == "null" ]; then
 			fn_print_failure "Unable to get remote build"
-			fn_script_log_fatal "Unable to get remote build"
+			fn_script_log_fail "Unable to get remote build"
 			core_exit.sh
 		fi
 	fi
diff --git a/lgsm/modules/update_vints.sh b/lgsm/modules/update_vints.sh
index 47195b9b2..b38372058 100644
--- a/lgsm/modules/update_vints.sh
+++ b/lgsm/modules/update_vints.sh
@@ -51,7 +51,7 @@ fn_update_remotebuild() {
 		# Checks if remotebuildversion variable has been set.
 		if [ -z "${remotebuildversion}" ] || [ "${remotebuildversion}" == "null" ]; then
 			fn_print_fail "Checking remote build: ${remotelocation}"
-			fn_script_log_fatal "Checking remote build"
+			fn_script_log_fail "Checking remote build"
 			core_exit.sh
 		else
 			fn_print_ok "Checking remote build: ${remotelocation}"
@@ -61,7 +61,7 @@ fn_update_remotebuild() {
 		# Checks if remotebuild variable has been set.
 		if [ -z "${remotebuildversion}" ] || [ "${remotebuildversion}" == "null" ]; then
 			fn_print_failure "Unable to get remote build"
-			fn_script_log_fatal "Unable to get remote build"
+			fn_script_log_fail "Unable to get remote build"
 			core_exit.sh
 		fi
 	fi
diff --git a/linuxgsm.sh b/linuxgsm.sh
index 6da7de664..520373d48 100755
--- a/linuxgsm.sh
+++ b/linuxgsm.sh
@@ -124,8 +124,8 @@ fn_bootstrap_fetch_file() {
 				if [ ${counter} -ge 2 ]; then
 					echo -e "FAIL"
 					if [ -f "${lgsmlog}" ]; then
-						fn_script_log_fatal "Downloading ${local_filename}"
-						fn_script_log_fatal "${fileurl}"
+						fn_script_log_fail "Downloading ${local_filename}"
+						fn_script_log_fail "${fileurl}"
 					fi
 					core_exit.sh
 				else
diff --git a/tests/tests_fctrserver.sh b/tests/tests_fctrserver.sh
index a63023dc8..0b4530d87 100644
--- a/tests/tests_fctrserver.sh
+++ b/tests/tests_fctrserver.sh
@@ -122,8 +122,8 @@ fn_bootstrap_fetch_file() {
 				if [ ${counter} -ge 2 ]; then
 					echo -e "FAIL"
 					if [ -f "${lgsmlog}" ]; then
-						fn_script_log_fatal "Downloading ${local_filename}"
-						fn_script_log_fatal "${fileurl}"
+						fn_script_log_fail "Downloading ${local_filename}"
+						fn_script_log_fail "${fileurl}"
 					fi
 					core_exit.sh
 				else
diff --git a/tests/tests_jc2server.sh b/tests/tests_jc2server.sh
index b921de274..adf59ab92 100644
--- a/tests/tests_jc2server.sh
+++ b/tests/tests_jc2server.sh
@@ -123,8 +123,8 @@ fn_bootstrap_fetch_file() {
 				if [ ${counter} -ge 2 ]; then
 					echo -e "FAIL"
 					if [ -f "${lgsmlog}" ]; then
-						fn_script_log_fatal "Downloading ${local_filename}"
-						fn_script_log_fatal "${fileurl}"
+						fn_script_log_fail "Downloading ${local_filename}"
+						fn_script_log_fail "${fileurl}"
 					fi
 					core_exit.sh
 				else
diff --git a/tests/tests_mcserver.sh b/tests/tests_mcserver.sh
index d173c7d68..3a40e9aa5 100644
--- a/tests/tests_mcserver.sh
+++ b/tests/tests_mcserver.sh
@@ -123,8 +123,8 @@ fn_bootstrap_fetch_file() {
 				if [ ${counter} -ge 2 ]; then
 					echo -e "FAIL"
 					if [ -f "${lgsmlog}" ]; then
-						fn_script_log_fatal "Downloading ${local_filename}"
-						fn_script_log_fatal "${fileurl}"
+						fn_script_log_fail "Downloading ${local_filename}"
+						fn_script_log_fail "${fileurl}"
 					fi
 					core_exit.sh
 				else
diff --git a/tests/tests_ts3server.sh b/tests/tests_ts3server.sh
index 7363a1025..3fcb8ae24 100644
--- a/tests/tests_ts3server.sh
+++ b/tests/tests_ts3server.sh
@@ -123,8 +123,8 @@ fn_bootstrap_fetch_file() {
 				if [ ${counter} -ge 2 ]; then
 					echo -e "FAIL"
 					if [ -f "${lgsmlog}" ]; then
-						fn_script_log_fatal "Downloading ${local_filename}"
-						fn_script_log_fatal "${fileurl}"
+						fn_script_log_fail "Downloading ${local_filename}"
+						fn_script_log_fail "${fileurl}"
 					fi
 					core_exit.sh
 				else

From 08a8da26ff6fb8c25079ab52ae371ce8e625866d Mon Sep 17 00:00:00 2001
From: Daniel Gibbs <me@danielgibbs.co.uk>
Date: Sun, 8 Oct 2023 20:08:44 +0100
Subject: [PATCH 003/154] feat: convert public ip to json (#4332)

* refactor: improve retrieval and handling of public IP address

The code in `info_game.sh` has been refactored to enhance the process of retrieving and handling the public IP address. The changes include:
- Using the API endpoint `http://ip-api.com/json/` instead of `https://api.ipify.org`
- Storing the retrieved data in `publicip.txt`
- Extracting additional information such as country and country code using `jq`

These improvements aim to provide more accurate and detailed information about the public IP address.

* refactor: update API URL and set default values for public IP, country, and country code

The commit refactors the code by updating the API URL to remove a trailing slash. Additionally, it sets default values for the variables `publicip`, `country`, and `countrycode` when the file `${tmpdir}/publicip.txt` is not found.

* feat: cache and retrieve public IP address

This commit adds functionality to cache the public IP address for 24 hours. If the cached IP address is older than 24 hours or doesn't exist, a new request is made to retrieve the public IP address. The retrieved IP address is then stored in a file for future use. Additionally, if there are any errors during the retrieval process, appropriate warning messages are logged and default values are set for the IP address, country, and country code.

Co-authored-by: AI Assistant <assistant@example.com>

* feat: cache and retrieve public IP address

This commit adds functionality to cache the public IP address for 24 hours. If the cached IP address is older than 24 hours or doesn't exist, a new request is made to retrieve the public IP address. The retrieved IP address is then stored in a file for future use. Additionally, if there are any errors during the retrieval process, appropriate warning messages are logged and default values are set for the IP address, country, and country code.

* refactor: improve caching and logging of public IP address

The code has been refactored to use a JSON file instead of a text file for caching the public IP address. The log messages have also been updated to provide more informative output.

* refactor(info_messages): Remove Mailgun alert

This commit refactors the `info_messages.sh` module by removing the Mailgun (email) alert functionality. The code changes remove the corresponding section that displays the Mailgun alert status in the info message script. This change simplifies and streamlines the code by eliminating unused functionality.

---------

Co-authored-by: AI Assistant <assistant@example.com>
---
 lgsm/modules/info_game.sh     | 32 ++++++++++++++++++--------------
 lgsm/modules/info_messages.sh |  3 ---
 2 files changed, 18 insertions(+), 17 deletions(-)

diff --git a/lgsm/modules/info_game.sh b/lgsm/modules/info_game.sh
index 77251784c..2d172cdd5 100644
--- a/lgsm/modules/info_game.sh
+++ b/lgsm/modules/info_game.sh
@@ -2400,25 +2400,29 @@ elif [ "${engine}" == "unreal2" ]; then
 	fn_info_game_unreal2
 fi
 
-# External IP address
-# Cache external IP address for 24 hours
-if [ -f "${tmpdir}/publicip.txt" ]; then
-	if [ "$(find "${tmpdir}/publicip.txt" -mmin +1440)" ]; then
-		rm -f "${tmpdir:?}/publicip.txt"
-	fi
-fi
-
-if [ ! -f "${tmpdir}/publicip.txt" ]; then
-	publicip="$(curl --connect-timeout 10 -s https://api.ipify.org 2> /dev/null)"
+# Public IP address
+# Cache public IP address for 24 hours
+if [ ! -f "${tmpdir}/publicip.json" ] || [ "$(find "${tmpdir}/publicip.json" -mmin +1440)" ]; then
+	apiurl="http://ip-api.com/json"
+	publicipresponse=$(curl -s "${apiurl}")
 	exitcode=$?
-	# if curl passes add publicip to externalip.txt
+	# if curl passes add publicip to publicip.json
 	if [ "${exitcode}" == "0" ]; then
-		echo "${publicip}" > "${tmpdir}/publicip.txt"
+		fn_script_log_pass "Getting public IP address"
+		echo "${publicipresponse}" > "${tmpdir}/publicip.json"
+		publicip="$(jq -r '.query' "${tmpdir}/publicip.json")"
+		country="$(jq -r '.country' "${tmpdir}/publicip.json")"
+		countrycode="$(jq -r '.countryCode' "${tmpdir}/publicip.json")"
 	else
-		echo "Unable to get external IP address"
+		fn_script_log_warn "Unable to get public IP address"
+		publicip="NOT SET"
+		country="NOT SET"
+		countrycode="NOT SET"
 	fi
 else
-	publicip="$(cat "${tmpdir}/publicip.txt")"
+	publicip="$(jq -r '.query' "${tmpdir}/publicip.json")"
+	country="$(jq -r '.country' "${tmpdir}/publicip.json")"
+	countrycode="$(jq -r '.countryCode' "${tmpdir}/publicip.json")"
 fi
 
 # Alert IP address
diff --git a/lgsm/modules/info_messages.sh b/lgsm/modules/info_messages.sh
index 340e11f6b..3f0c6d235 100644
--- a/lgsm/modules/info_messages.sh
+++ b/lgsm/modules/info_messages.sh
@@ -506,7 +506,6 @@ fn_info_message_script() {
 	# Email alert:            off
 	# Gotify alert:           off
 	# IFTTT alert:            off
-	# Mailgun (email) alert:  off
 	# Pushbullet alert:       off
 	# Pushover alert:         off
 	# Rocketchat alert:       off
@@ -550,8 +549,6 @@ fn_info_message_script() {
 		echo -e "${lightblue}Gotify alert:\t${default}${gotifyalert}"
 		# IFTTT alert
 		echo -e "${lightblue}IFTTT alert:\t${default}${iftttalert}"
-		# Mailgun alert
-		echo -e "${lightblue}Mailgun (email) alert:\t${default}${mailgunalert}"
 		# Pushbullet alert
 		echo -e "${lightblue}Pushbullet alert:\t${default}${pushbulletalert}"
 		# Pushover alert

From f5496c72f65bc11f0a961300511f51efe536a0da Mon Sep 17 00:00:00 2001
From: Daniel Gibbs <me@danielgibbs.co.uk>
Date: Sun, 8 Oct 2023 23:33:20 +0100
Subject: [PATCH 004/154] update package.json

---
 .prettierrc       |   2 +-
 package-lock.json | 246 ++++------------------------------------------
 package.json      |   4 +-
 3 files changed, 24 insertions(+), 228 deletions(-)

diff --git a/.prettierrc b/.prettierrc
index 02d542d50..1902f8021 100644
--- a/.prettierrc
+++ b/.prettierrc
@@ -1,3 +1,3 @@
 {
-  "plugins": ["prettier-plugin-sh"]
+	"plugins": ["prettier-plugin-sh"]
 }
diff --git a/package-lock.json b/package-lock.json
index 8532248e0..669e4f59d 100644
--- a/package-lock.json
+++ b/package-lock.json
@@ -7,274 +7,70 @@
       "name": "linuxgsm",
       "license": "MIT",
       "devDependencies": {
-        "prettier": "^2.8.8",
-        "prettier-plugin-sh": "^0.12.8"
+        "prettier": "^3.0.3",
+        "prettier-plugin-sh": "^0.13.1"
       }
     },
-    "node_modules/@pkgr/utils": {
-      "version": "2.3.1",
-      "resolved": "https://registry.npmjs.org/@pkgr/utils/-/utils-2.3.1.tgz",
-      "integrity": "sha512-wfzX8kc1PMyUILA+1Z/EqoE4UCXGy0iRGMhPwdfae1+f0OXlLqCk+By+aMzgJBzR9AzS4CDizioG6Ss1gvAFJw==",
-      "dev": true,
-      "dependencies": {
-        "cross-spawn": "^7.0.3",
-        "is-glob": "^4.0.3",
-        "open": "^8.4.0",
-        "picocolors": "^1.0.0",
-        "tiny-glob": "^0.2.9",
-        "tslib": "^2.4.0"
-      },
-      "engines": {
-        "node": "^12.20.0 || ^14.18.0 || >=16.0.0"
-      },
-      "funding": {
-        "url": "https://opencollective.com/unts"
-      }
-    },
-    "node_modules/cross-spawn": {
-      "version": "7.0.3",
-      "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz",
-      "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==",
-      "dev": true,
-      "dependencies": {
-        "path-key": "^3.1.0",
-        "shebang-command": "^2.0.0",
-        "which": "^2.0.1"
-      },
-      "engines": {
-        "node": ">= 8"
-      }
-    },
-    "node_modules/define-lazy-prop": {
-      "version": "2.0.0",
-      "resolved": "https://registry.npmjs.org/define-lazy-prop/-/define-lazy-prop-2.0.0.tgz",
-      "integrity": "sha512-Ds09qNh8yw3khSjiJjiUInaGX9xlqZDY7JVryGxdxV7NPeuqQfplOpQ66yJFZut3jLa5zOwkXw1g9EI2uKh4Og==",
-      "dev": true,
-      "engines": {
-        "node": ">=8"
-      }
-    },
-    "node_modules/globalyzer": {
-      "version": "0.1.0",
-      "resolved": "https://registry.npmjs.org/globalyzer/-/globalyzer-0.1.0.tgz",
-      "integrity": "sha512-40oNTM9UfG6aBmuKxk/giHn5nQ8RVz/SS4Ir6zgzOv9/qC3kKZ9v4etGTcJbEl/NyVQH7FGU7d+X1egr57Md2Q==",
-      "dev": true
-    },
-    "node_modules/globrex": {
-      "version": "0.1.2",
-      "resolved": "https://registry.npmjs.org/globrex/-/globrex-0.1.2.tgz",
-      "integrity": "sha512-uHJgbwAMwNFf5mLst7IWLNg14x1CkeqglJb/K3doi4dw6q2IvAAmM/Y81kevy83wP+Sst+nutFTYOGg3d1lsxg==",
-      "dev": true
-    },
-    "node_modules/is-docker": {
-      "version": "2.2.1",
-      "resolved": "https://registry.npmjs.org/is-docker/-/is-docker-2.2.1.tgz",
-      "integrity": "sha512-F+i2BKsFrH66iaUFc0woD8sLy8getkwTwtOBjvs56Cx4CgJDeKQeqfz8wAYiSb8JOprWhHH5p77PbmYCvvUuXQ==",
-      "dev": true,
-      "bin": {
-        "is-docker": "cli.js"
-      },
-      "engines": {
-        "node": ">=8"
-      },
-      "funding": {
-        "url": "https://github.com/sponsors/sindresorhus"
-      }
-    },
-    "node_modules/is-extglob": {
-      "version": "2.1.1",
-      "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz",
-      "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==",
-      "dev": true,
-      "engines": {
-        "node": ">=0.10.0"
-      }
-    },
-    "node_modules/is-glob": {
-      "version": "4.0.3",
-      "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz",
-      "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==",
-      "dev": true,
-      "dependencies": {
-        "is-extglob": "^2.1.1"
-      },
-      "engines": {
-        "node": ">=0.10.0"
-      }
-    },
-    "node_modules/is-wsl": {
-      "version": "2.2.0",
-      "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-2.2.0.tgz",
-      "integrity": "sha512-fKzAra0rGJUUBwGBgNkHZuToZcn+TtXHpeCgmkMJMMYx1sQDYaCSyjJBSCa2nH1DGm7s3n1oBnohoVTBaN7Lww==",
-      "dev": true,
-      "dependencies": {
-        "is-docker": "^2.0.0"
-      },
-      "engines": {
-        "node": ">=8"
-      }
-    },
-    "node_modules/isexe": {
-      "version": "2.0.0",
-      "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz",
-      "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==",
-      "dev": true
-    },
     "node_modules/mvdan-sh": {
       "version": "0.10.1",
       "resolved": "https://registry.npmjs.org/mvdan-sh/-/mvdan-sh-0.10.1.tgz",
       "integrity": "sha512-kMbrH0EObaKmK3nVRKUIIya1dpASHIEusM13S4V1ViHFuxuNxCo+arxoa6j/dbV22YBGjl7UKJm9QQKJ2Crzhg==",
       "dev": true
     },
-    "node_modules/open": {
-      "version": "8.4.2",
-      "resolved": "https://registry.npmjs.org/open/-/open-8.4.2.tgz",
-      "integrity": "sha512-7x81NCL719oNbsq/3mh+hVrAWmFuEYUqrq/Iw3kUzH8ReypT9QQ0BLoJS7/G9k6N81XjW4qHWtjWwe/9eLy1EQ==",
-      "dev": true,
-      "dependencies": {
-        "define-lazy-prop": "^2.0.0",
-        "is-docker": "^2.1.1",
-        "is-wsl": "^2.2.0"
-      },
-      "engines": {
-        "node": ">=12"
-      },
-      "funding": {
-        "url": "https://github.com/sponsors/sindresorhus"
-      }
-    },
-    "node_modules/path-key": {
-      "version": "3.1.1",
-      "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz",
-      "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==",
-      "dev": true,
-      "engines": {
-        "node": ">=8"
-      }
-    },
-    "node_modules/picocolors": {
-      "version": "1.0.0",
-      "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.0.tgz",
-      "integrity": "sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==",
-      "dev": true
-    },
     "node_modules/prettier": {
-      "version": "2.8.8",
-      "resolved": "https://registry.npmjs.org/prettier/-/prettier-2.8.8.tgz",
-      "integrity": "sha512-tdN8qQGvNjw4CHbY+XXk0JgCXn9QiF21a55rBe5LJAU+kDyC4WQn4+awm2Xfk2lQMk5fKup9XgzTZtGkjBdP9Q==",
+      "version": "3.0.3",
+      "resolved": "https://registry.npmjs.org/prettier/-/prettier-3.0.3.tgz",
+      "integrity": "sha512-L/4pUDMxcNa8R/EthV08Zt42WBO4h1rarVtK0K+QJG0X187OLo7l699jWw0GKuwzkPQ//jMFA/8Xm6Fh3J/DAg==",
       "dev": true,
       "bin": {
-        "prettier": "bin-prettier.js"
+        "prettier": "bin/prettier.cjs"
       },
       "engines": {
-        "node": ">=10.13.0"
+        "node": ">=14"
       },
       "funding": {
         "url": "https://github.com/prettier/prettier?sponsor=1"
       }
     },
     "node_modules/prettier-plugin-sh": {
-      "version": "0.12.8",
-      "resolved": "https://registry.npmjs.org/prettier-plugin-sh/-/prettier-plugin-sh-0.12.8.tgz",
-      "integrity": "sha512-VOq8h2Gn5UzrCIKm4p/nAScXJbN09HdyFDknAcxt6Qu/tv/juu9bahxSrcnM9XWYA+Spz1F1ANJ4LhfwB7+Q1Q==",
+      "version": "0.13.1",
+      "resolved": "https://registry.npmjs.org/prettier-plugin-sh/-/prettier-plugin-sh-0.13.1.tgz",
+      "integrity": "sha512-ytMcl1qK4s4BOFGvsc9b0+k9dYECal7U29bL/ke08FEUsF/JLN0j6Peo0wUkFDG4y2UHLMhvpyd6Sd3zDXe/eg==",
       "dev": true,
       "dependencies": {
         "mvdan-sh": "^0.10.1",
-        "sh-syntax": "^0.3.6",
-        "synckit": "^0.8.1"
+        "sh-syntax": "^0.4.1"
       },
       "engines": {
-        "node": "^12.20.0 || ^14.18.0 || >=16.0.0"
+        "node": ">=16.0.0"
       },
       "funding": {
         "url": "https://opencollective.com/unts"
       },
       "peerDependencies": {
-        "prettier": "^2.0.0"
+        "prettier": "^3.0.0"
       }
     },
     "node_modules/sh-syntax": {
-      "version": "0.3.7",
-      "resolved": "https://registry.npmjs.org/sh-syntax/-/sh-syntax-0.3.7.tgz",
-      "integrity": "sha512-xIB/uRniZ9urxAuXp1Ouh/BKSI1VK8RSqfwGj7cV57HvGrFo3vHdJfv8Tdp/cVcxJgXQTkmHr5mG5rqJW8r4wQ==",
+      "version": "0.4.1",
+      "resolved": "https://registry.npmjs.org/sh-syntax/-/sh-syntax-0.4.1.tgz",
+      "integrity": "sha512-MW/ZsCYTu11EIYYTSZcfAgMFszAodCmQVB27XssHoIN6L4EG0KSA3h32x8whaSOKuYBX5wz9EybfnPBUFQMCKA==",
       "dev": true,
       "dependencies": {
-        "tslib": "^2.4.0"
+        "tslib": "^2.6.0"
       },
       "engines": {
-        "node": "^12.20.0 || ^14.18.0 || >=16.0.0"
+        "node": ">=16.0.0"
       },
       "funding": {
         "url": "https://opencollective.com/unts"
       }
     },
-    "node_modules/shebang-command": {
-      "version": "2.0.0",
-      "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz",
-      "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==",
-      "dev": true,
-      "dependencies": {
-        "shebang-regex": "^3.0.0"
-      },
-      "engines": {
-        "node": ">=8"
-      }
-    },
-    "node_modules/shebang-regex": {
-      "version": "3.0.0",
-      "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz",
-      "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==",
-      "dev": true,
-      "engines": {
-        "node": ">=8"
-      }
-    },
-    "node_modules/synckit": {
-      "version": "0.8.5",
-      "resolved": "https://registry.npmjs.org/synckit/-/synckit-0.8.5.tgz",
-      "integrity": "sha512-L1dapNV6vu2s/4Sputv8xGsCdAVlb5nRDMFU/E27D44l5U6cw1g0dGd45uLc+OXjNMmF4ntiMdCimzcjFKQI8Q==",
-      "dev": true,
-      "dependencies": {
-        "@pkgr/utils": "^2.3.1",
-        "tslib": "^2.5.0"
-      },
-      "engines": {
-        "node": "^14.18.0 || >=16.0.0"
-      },
-      "funding": {
-        "url": "https://opencollective.com/unts"
-      }
-    },
-    "node_modules/tiny-glob": {
-      "version": "0.2.9",
-      "resolved": "https://registry.npmjs.org/tiny-glob/-/tiny-glob-0.2.9.tgz",
-      "integrity": "sha512-g/55ssRPUjShh+xkfx9UPDXqhckHEsHr4Vd9zX55oSdGZc/MD0m3sferOkwWtp98bv+kcVfEHtRJgBVJzelrzg==",
-      "dev": true,
-      "dependencies": {
-        "globalyzer": "0.1.0",
-        "globrex": "^0.1.2"
-      }
-    },
     "node_modules/tslib": {
-      "version": "2.5.0",
-      "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.5.0.tgz",
-      "integrity": "sha512-336iVw3rtn2BUK7ORdIAHTyxHGRIHVReokCR3XjbckJMK7ms8FysBfhLR8IXnAgy7T0PTPNBWKiH514FOW/WSg==",
+      "version": "2.6.2",
+      "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.2.tgz",
+      "integrity": "sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q==",
       "dev": true
-    },
-    "node_modules/which": {
-      "version": "2.0.2",
-      "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz",
-      "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==",
-      "dev": true,
-      "dependencies": {
-        "isexe": "^2.0.0"
-      },
-      "bin": {
-        "node-which": "bin/node-which"
-      },
-      "engines": {
-        "node": ">= 8"
-      }
     }
   }
 }
diff --git a/package.json b/package.json
index f3d3df0fd..89bb70244 100644
--- a/package.json
+++ b/package.json
@@ -5,8 +5,8 @@
     "test": "tests"
   },
   "devDependencies": {
-    "prettier": "^2.8.8",
-    "prettier-plugin-sh": "^0.12.8"
+    "prettier": "^3.0.3",
+    "prettier-plugin-sh": "^0.13.1"
   },
   "scripts": {
     "test": "echo \"Error: no test specified\" && exit 1"

From 3259981e616353216fff2c8caa18c299ac052400 Mon Sep 17 00:00:00 2001
From: Daniel Gibbs <me@danielgibbs.co.uk>
Date: Tue, 10 Oct 2023 20:19:53 +0100
Subject: [PATCH 005/154] refactor: remove unused tests

- Removed the following files:
  - `tests/tests_defaultcfg/defaultcfg_0.txt`
  - `tests/tests_defaultcfg/defaultcfg_1.txt`
  - `tests/tests_defaultcfg/tests_defaultcfg.sh`
  - `tests/tests_fctrserver.sh`

These files were no longer needed and have been deleted.
refactor: remove unused code

- Removed the following files:
  - `tests/tests_defaultcfg/defaultcfg_0.txt`
  - `tests/tests_defaultcfg/defaultcfg_1.txt`
  - `tests/tests_defaultcfg/tests_defaultcfg.sh`
  - `tests/tests_fctrserver.sh`

These files were no longer needed and have been deleted.
---
 tests/tests_defaultcfg/defaultcfg_0.txt    |   63 -
 tests/tests_defaultcfg/defaultcfg_1.txt    |   53 -
 tests/tests_defaultcfg/tests_defaultcfg.sh |   65 -
 tests/tests_fctrserver.sh                  | 1186 -----------------
 tests/tests_jc2server.sh                   | 1352 --------------------
 tests/tests_mcserver.sh                    | 1231 ------------------
 tests/tests_ts3server.sh                   | 1184 -----------------
 7 files changed, 5134 deletions(-)
 delete mode 100644 tests/tests_defaultcfg/defaultcfg_0.txt
 delete mode 100644 tests/tests_defaultcfg/defaultcfg_1.txt
 delete mode 100644 tests/tests_defaultcfg/tests_defaultcfg.sh
 delete mode 100644 tests/tests_fctrserver.sh
 delete mode 100644 tests/tests_jc2server.sh
 delete mode 100644 tests/tests_mcserver.sh
 delete mode 100644 tests/tests_ts3server.sh

diff --git a/tests/tests_defaultcfg/defaultcfg_0.txt b/tests/tests_defaultcfg/defaultcfg_0.txt
deleted file mode 100644
index bcaa9f1dd..000000000
--- a/tests/tests_defaultcfg/defaultcfg_0.txt
+++ /dev/null
@@ -1,63 +0,0 @@
-stats
-displayip
-postalert
-discordalert
-discordwebhook
-emailalert
-email
-emailfrom
-iftttalert
-ifttttoken
-iftttevent
-mailgunalert
-mailguntoken
-mailgundomain
-mailgunemailfrom
-mailgunemail
-pushbulletalert
-pushbullettoken
-channeltag
-rocketchatalert
-rocketchatwebhook
-rocketchattoken
-slackalert
-slackwebhook
-pushoveralert
-pushovertoken
-telegramalert
-telegramtoken
-telegramchatid
-curlcustomstring
-maxbackups
-maxbackupdays
-stoponbackup
-consolelogging
-logdays
-querydelay
-ansi
-sleeptime
-stopmode
-querymode
-querytype
-consoleverbose
-consoleinteract
-gamename
-engine
-glibc
-systemdir
-executabledir
-executable
-servercfgdir
-servercfg
-servercfgdefault
-servercfgfullpath
-backupdir
-logdir
-lgsmlogdir
-consolelogdir
-lgsmlog
-consolelog
-alertlog
-postdetailslog
-lgsmlogdate
-consolelogdate
diff --git a/tests/tests_defaultcfg/defaultcfg_1.txt b/tests/tests_defaultcfg/defaultcfg_1.txt
deleted file mode 100644
index 63b888f9d..000000000
--- a/tests/tests_defaultcfg/defaultcfg_1.txt
+++ /dev/null
@@ -1,53 +0,0 @@
-##################################
-######## Default Settings ########
-##################################
-# DO NOT EDIT, ANY CHANGES WILL BE OVERWRITTEN!
-# Copy settings from here and use them in either:
-# common.cfg - applies settings to every instance.
-# [instance].cfg - applies settings to a specific instance.
-#### Game Server Settings ####
-## Server Parameters | https://docs.linuxgsm.com/configuration/start-parameters#additional-parameters
-#### LinuxGSM Settings ####
-## Notification Alerts
-# (on|off)
-# Display IP | https://docs.linuxgsm.com/alerts#display-ip
-# More info | https://docs.linuxgsm.com/alerts#more-info
-# Discord Alerts | https://docs.linuxgsm.com/alerts/discord
-# Email Alerts | https://docs.linuxgsm.com/alerts/email
-# IFTTT Alerts | https://docs.linuxgsm.com/alerts/ifttt
-# Pushbullet Alerts | https://docs.linuxgsm.com/alerts/pushbullet
-# Pushover Alerts | https://docs.linuxgsm.com/alerts/pushover
-# Slack Alerts | https://docs.linuxgsm.com/alerts/slack
-# Telegram Alerts | https://docs.linuxgsm.com/alerts/telegram
-# You can add a custom cURL string eg proxy (useful in Russia) in "curlcustomstring".
-# For example "--socks5 ipaddr:port" for socks5 proxy see more in "curl --help".
-## Backup | https://docs.linuxgsm.com/commands/backup
-## Logging | https://docs.linuxgsm.com/features/logging
-## Monitor | https://docs.linuxgsm.com/commands/monitor
-# Query delay time
-## ANSI Colors | https://docs.linuxgsm.com/features/ansi-colors
-#### Advanced Settings ####
-## Message Display Time | https://docs.linuxgsm.com/features/message-display-time
-## Stop Mode | https://docs.linuxgsm.com/features/stop-mode
-# 1: tmux kill
-# 2: CTRL+c
-# 3: quit
-# 4: quit 120s
-# 5: stop
-# 6: q
-# 7: exit
-# 8: 7 Days to Die
-# 9: GoldSrc
-# 10: Avorion
-# 11: end
-## Console type
-consoleverbose=""
-consoleinteract=""
-## Game Server Details
-# Do not edit
-#### Directories ####
-# Edit with care
-## Game Server Directories
-## Backup Directory
-## Logging Directories
-## Logs Naming
diff --git a/tests/tests_defaultcfg/tests_defaultcfg.sh b/tests/tests_defaultcfg/tests_defaultcfg.sh
deleted file mode 100644
index 5f97f9a33..000000000
--- a/tests/tests_defaultcfg/tests_defaultcfg.sh
+++ /dev/null
@@ -1,65 +0,0 @@
-#!/bin/bash
-echo -e ""
-echo -e "0.1 - Full comparison Output"
-echo -e "=================================================================="
-echo -e "Description:"
-echo -e "test checks that vars present in ALL _default.cfg files are correct."
-echo -e ""
-echo -e "In master config < | > In game config"
-find "lgsm/config-default/config-lgsm/" ! -name '*template.cfg' -name "*.cfg" -type f -print0 \
-	| while IFS= read -r -d $'\0' line; do
-		grep "=" "${line}" | cut -f1 -d"=" > defaultcfgtemp.txt
-		diffoutput=$(diff tests/tests_defaultcfg/defaultcfg_0.txt defaultcfgtemp.txt)
-		if [ "${diffoutput}" ]; then
-			echo "File with errors:"
-			echo "${line}"
-			echo -e "================================="
-			echo -e "In master config < | > In game config"
-			echo "${diffoutput}"
-			echo ""
-		fi
-		rm -f defaultcfgtemp.txt
-	done
-
-echo -e ""
-echo -e "1.0 - Master Comparison"
-echo -e "=================================================================="
-echo -e "Description:"
-echo -e "test checks that vars present in ALL _default.cfg files are correct."
-echo -e ""
-echo -e "In master config < | > In game config"
-find lgsm/config-default/config-lgsm/ ! -name '*template.cfg' -name "*.cfg" -type f -print0 \
-	| while IFS= read -r -d $'\0' line; do
-		grep "=" "${line}" | cut -f1 -d"=" > defaultcfgtemp.txt
-		diffoutput=$(diff tests/tests_defaultcfg/defaultcfg_0.txt defaultcfgtemp.txt | grep '^<')
-		if [ "${diffoutput}" ]; then
-			echo "File with errors:"
-			echo "${line}"
-			echo -e "================================="
-			echo -e "In master config < | > In game config"
-			echo "${diffoutput}"
-			echo ""
-		fi
-		rm -f defaultcfgtemp.txt
-	done
-
-echo -e ""
-echo -e "2.0 - Check Comment"
-echo -e "=================================================================="
-echo -e "Description:"
-echo -e "test checks that comments in ALL _default.cfg files are correct."
-echo -e ""
-echo -e "In master config < | > In game config"
-find lgsm/config-default/config-lgsm/ ! -name '*template.cfg' -name "*.cfg" -type f -print0 \
-	| while IFS= read -r -d $'\0' line; do
-		grep "#" "${line}" > defaultcfgtemp.txt
-		diffoutput=$(diff tests/tests_defaultcfg/defaultcfg_1.txt defaultcfgtemp.txt | grep '^<')
-		if [ "${diffoutput}" ]; then
-			echo "File with errors:"
-			echo "${line}"
-			echo -e "================================="
-			echo "${diffoutput}"
-			echo ""
-		fi
-		rm -f defaultcfgtemp.txt
-	done
diff --git a/tests/tests_fctrserver.sh b/tests/tests_fctrserver.sh
deleted file mode 100644
index 0b4530d87..000000000
--- a/tests/tests_fctrserver.sh
+++ /dev/null
@@ -1,1186 +0,0 @@
-#!/bin/bash
-# Project: Game Server Managers - LinuxGSM
-# Author: Daniel Gibbs
-# License: MIT License, Copyright (c) 2020 Daniel Gibbs
-# Purpose: Travis CI Tests: Factorio | Linux Game Server Management Script
-# Contributors: https://linuxgsm.com/contrib
-# Documentation: https://docs.linuxgsm.com
-# Website: https://linuxgsm.com
-
-# DO NOT EDIT THIS FILE
-# LinuxGSM configuration is no longer edited here
-# To update your LinuxGSM config go to:
-# lgsm/config-lgsm
-# https://docs.linuxgsm.com/configuration/linuxgsm-config
-
-# Debugging
-if [ -f ".dev-debug" ]; then
-	exec 5> dev-debug.log
-	BASH_XTRACEFD="5"
-	set -x
-fi
-
-version="v23.5.3"
-shortname="fctr"
-gameservername="fctrserver"
-commandname="CORE"
-rootdir=$(dirname "$(readlink -f "${BASH_SOURCE[0]}")")
-selfname=$(basename "$(readlink -f "${BASH_SOURCE[0]}")")
-sessionname=$(echo "${selfname}" | cut -f1 -d".")
-lgsmdir="${rootdir}/lgsm"
-logdir="${rootdir}/log"
-lgsmlogdir="${logdir}/lgsm"
-steamcmddir="${HOME}/.steam/steamcmd"
-serverfiles="${rootdir}/serverfiles"
-modulesdir="${lgsmdir}/modules"
-tmpdir="${lgsmdir}/tmp"
-datadir="${lgsmdir}/data"
-lockdir="${lgsmdir}/lock"
-serverlist="${datadir}/serverlist.csv"
-serverlistmenu="${datadir}/serverlistmenu.csv"
-configdir="${lgsmdir}/config-lgsm"
-configdirserver="${configdir}/${gameservername}"
-configdirdefault="${lgsmdir}/config-default"
-userinput="${1}"
-
-# Allows for testing not on Travis CI.
-# if using travis for tests
-if [ -z "${TRAVIS}" ]; then
-	TRAVIS_BRANCH="develop"
-	TRAVIS_BUILD_DIR="${rootdir}"
-fi
-travistest="1"
-## GitHub Branch Select
-# Allows for the use of different module files
-# from a different repo and/or branch.
-githubuser="GameServerManagers"
-githubrepo="LinuxGSM"
-githubbranch="${TRAVIS_BRANCH}"
-
-# Core module that is required first.
-core_modules.sh() {
-	modulefile="${FUNCNAME[0]}"
-	fn_bootstrap_fetch_file_github "lgsm/modules" "core_modules.sh" "${modulesdir}" "chmodx" "run" "noforcedl" "nohash"
-}
-
-# Bootstrap
-# Fetches the core modules required before passed off to core_dl.sh.
-fn_bootstrap_fetch_file() {
-	remote_fileurl="${1}"
-	remote_fileurl_backup="${2}"
-	remote_fileurl_name="${3}"
-	remote_fileurl_backup_name="${4}"
-	local_filedir="${5}"
-	local_filename="${6}"
-	chmodx="${7:-0}"
-	run="${8:-0}"
-	forcedl="${9:-0}"
-	md5="${10:-0}"
-	# Download file if missing or download forced.
-	if [ ! -f "${local_filedir}/${local_filename}" ] || [ "${forcedl}" == "forcedl" ]; then
-		# If backup fileurl exists include it.
-		if [ -n "${remote_fileurl_backup}" ]; then
-			# counter set to 0 to allow second try
-			counter=0
-			remote_fileurls_array=(remote_fileurl remote_fileurl_backup)
-		else
-			# counter set to 1 to not allow second try
-			counter=1
-			remote_fileurls_array=(remote_fileurl)
-		fi
-
-		for remote_fileurl_array in "${remote_fileurls_array[@]}"; do
-			if [ "${remote_fileurl_array}" == "remote_fileurl" ]; then
-				fileurl="${remote_fileurl}"
-				fileurl_name="${remote_fileurl_name}"
-			elif [ "${remote_fileurl_array}" == "remote_fileurl_backup" ]; then
-				fileurl="${remote_fileurl_backup}"
-				fileurl_name="${remote_fileurl_backup_name}"
-			fi
-			counter=$((counter + 1))
-			if [ ! -d "${local_filedir}" ]; then
-				mkdir -p "${local_filedir}"
-			fi
-			# Trap will remove part downloaded files if canceled.
-			trap fn_fetch_trap INT
-			# Larger files show a progress bar.
-
-			echo -en "fetching ${fileurl_name} ${local_filename}...\c"
-			curlcmd=$(curl -s --fail -L -o "${local_filedir}/${local_filename}" "${fileurl}" 2>&1)
-
-			local exitcode=$?
-			# Download will fail if downloads a html file.
-			if [ -f "${local_filedir}/${local_filename}" ]; then
-				if [ -n "$(head "${local_filedir}/${local_filename}" | grep "DOCTYPE")" ]; then
-					rm -f "${local_filedir:?}/${local_filename:?}"
-					local exitcode=2
-				fi
-			fi
-
-			# On first try will error. On second try will fail.
-			if [ "${exitcode}" != 0 ]; then
-				if [ ${counter} -ge 2 ]; then
-					echo -e "FAIL"
-					if [ -f "${lgsmlog}" ]; then
-						fn_script_log_fail "Downloading ${local_filename}"
-						fn_script_log_fail "${fileurl}"
-					fi
-					core_exit.sh
-				else
-					echo -e "ERROR"
-					if [ -f "${lgsmlog}" ]; then
-						fn_script_log_error "Downloading ${local_filename}"
-						fn_script_log_error "${fileurl}"
-					fi
-				fi
-
-			else
-				echo -en "OK"
-				sleep 0.3
-				echo -en "\033[2K\\r"
-				if [ -f "${lgsmlog}" ]; then
-					fn_script_log_pass "Downloading ${local_filename}"
-				fi
-
-				# Make file executable if chmodx is set.
-				if [ "${chmodx}" == "chmodx" ]; then
-					chmod +x "${local_filedir}/${local_filename}"
-				fi
-
-				# Remove trap.
-				trap - INT
-
-				break
-			fi
-		done
-	fi
-
-	if [ -f "${local_filedir}/${local_filename}" ]; then
-		# Execute file if run is set.
-		if [ "${run}" == "run" ]; then
-			# shellcheck source=/dev/null
-			source "${local_filedir}/${local_filename}"
-		fi
-	fi
-}
-
-fn_bootstrap_fetch_file_github() {
-	github_file_url_dir="${1}"
-	github_file_url_name="${2}"
-	# If master branch will currently running LinuxGSM version to prevent "version mixing". This is ignored if a fork.
-	if [ "${githubbranch}" == "master" ] && [ "${githubuser}" == "GameServerManagers" ] && [ "${commandname}" != "UPDATE-LGSM" ]; then
-		remote_fileurl="https://raw.githubusercontent.com/${githubuser}/${githubrepo}/${version}/${github_file_url_dir}/${github_file_url_name}"
-		remote_fileurl_backup="https://bitbucket.org/${githubuser}/${githubrepo}/raw/${version}/${github_file_url_dir}/${github_file_url_name}"
-	else
-		remote_fileurl="https://raw.githubusercontent.com/${githubuser}/${githubrepo}/${githubbranch}/${github_file_url_dir}/${github_file_url_name}"
-		remote_fileurl_backup="https://bitbucket.org/${githubuser}/${githubrepo}/raw/${githubbranch}/${github_file_url_dir}/${github_file_url_name}"
-	fi
-	remote_fileurl_name="GitHub"
-	remote_fileurl_backup_name="Bitbucket"
-	local_filedir="${3}"
-	local_filename="${github_file_url_name}"
-	chmodx="${4:-0}"
-	run="${5:-0}"
-	forcedl="${6:-0}"
-	md5="${7:-0}"
-	# Passes vars to the file download module.
-	fn_bootstrap_fetch_file "${remote_fileurl}" "${remote_fileurl_backup}" "${remote_fileurl_name}" "${remote_fileurl_backup_name}" "${local_filedir}" "${local_filename}" "${chmodx}" "${run}" "${forcedl}" "${md5}"
-}
-
-# Installer menu.
-
-fn_print_center() {
-	columns=$(tput cols)
-	line="$*"
-	printf "%*s\n" $(((${#line} + columns) / 2)) "${line}"
-}
-
-fn_print_horizontal() {
-	printf '%*s\n' "${COLUMNS:-$(tput cols)}" '' | tr ' ' "="
-}
-
-# Bash menu.
-fn_install_menu_bash() {
-	local resultvar=$1
-	title=$2
-	caption=$3
-	options=$4
-	fn_print_horizontal
-	fn_print_center "${title}"
-	fn_print_center "${caption}"
-	fn_print_horizontal
-	menu_options=()
-	while read -r line || [[ -n "${line}" ]]; do
-		var=$(echo -e "${line}" | awk -F "," '{print $2 " - " $3}')
-		menu_options+=("${var}")
-	done < "${options}"
-	menu_options+=("Cancel")
-	select option in "${menu_options[@]}"; do
-		if [ "${option}" ] && [ "${option}" != "Cancel" ]; then
-			eval "$resultvar=\"${option/%\ */}\""
-		fi
-		break
-	done
-}
-
-# Whiptail/Dialog menu.
-fn_install_menu_whiptail() {
-	local menucmd=$1
-	local resultvar=$2
-	title=$3
-	caption=$4
-	options=$5
-	height=${6:-40}
-	width=${7:-80}
-	menuheight=${8:-30}
-	IFS=","
-	menu_options=()
-	while read -r line; do
-		key=$(echo -e "${line}" | awk -F "," '{print $3}')
-		val=$(echo -e "${line}" | awk -F "," '{print $2}')
-		menu_options+=("${val//\"/}" "${key//\"/}")
-	done < "${options}"
-	OPTION=$(${menucmd} --title "${title}" --menu "${caption}" "${height}" "${width}" "${menuheight}" "${menu_options[@]}" 3>&1 1>&2 2>&3)
-	if [ $? == 0 ]; then
-		eval "$resultvar=\"${OPTION}\""
-	else
-		eval "$resultvar="
-	fi
-}
-
-# Menu selector.
-fn_install_menu() {
-	local resultvar=$1
-	local selection=""
-	title=$2
-	caption=$3
-	options=$4
-	# Get menu command.
-	for menucmd in whiptail dialog bash; do
-		if [ "$(command -v "${menucmd}")" ]; then
-			menucmd=$(command -v "${menucmd}")
-			break
-		fi
-	done
-	case "$(basename "${menucmd}")" in
-		whiptail | dialog)
-			fn_install_menu_whiptail "${menucmd}" selection "${title}" "${caption}" "${options}" 40 80 30
-			;;
-		*)
-			fn_install_menu_bash selection "${title}" "${caption}" "${options}"
-			;;
-	esac
-	eval "$resultvar=\"${selection}\""
-}
-
-# Gets server info from serverlist.csv and puts in to array.
-fn_server_info() {
-	IFS=","
-	server_info_array=($(grep -aw "${userinput}" "${serverlist}"))
-	shortname="${server_info_array[0]}"      # csgo
-	gameservername="${server_info_array[1]}" # csgoserver
-	gamename="${server_info_array[2]}"       # Counter Strike: Global Offensive
-}
-
-fn_install_getopt() {
-	userinput="empty"
-	echo -e "Usage: $0 [option]"
-	echo -e ""
-	echo -e "Installer - Linux Game Server Managers - Version ${version}"
-	echo -e "https://linuxgsm.com"
-	echo -e ""
-	echo -e "Commands"
-	echo -e "install\t\t| Select server to install."
-	echo -e "servername\t| Enter name of game server to install. e.g $0 csgoserver."
-	echo -e "list\t\t| List all servers available for install."
-	exit
-}
-
-fn_install_file() {
-	local_filename="${gameservername}"
-	if [ -e "${local_filename}" ]; then
-		i=2
-		while [ -e "${local_filename}-${i}" ]; do
-			((i++))
-		done
-		local_filename="${local_filename}-${i}"
-	fi
-	cp -R "${selfname}" "${local_filename}"
-	sed -i -e "s/shortname=\"core\"/shortname=\"${shortname}\"/g" "${local_filename}"
-	sed -i -e "s/gameservername=\"core\"/gameservername=\"${gameservername}\"/g" "${local_filename}"
-	echo -e "Installed ${gamename} server as ${local_filename}"
-	echo -e ""
-	if [ ! -d "${serverfiles}" ]; then
-		echo -e "./${local_filename} install"
-	else
-		echo -e "Remember to check server ports"
-		echo -e "./${local_filename} details"
-	fi
-	echo -e ""
-	exit
-}
-
-# Prevent LinuxGSM from running as root. Except if doing a dependency install.
-if [ "$(whoami)" == "root" ]; then
-	if [ "${userinput}" == "install" ] || [ "${userinput}" == "auto-install" ] || [ "${userinput}" == "i" ] || [ "${userinput}" == "ai" ]; then
-		if [ "${shortname}" == "core" ]; then
-			echo -e "[ FAIL ] Do NOT run this script as root!"
-			exit 1
-		fi
-	elif [ ! -f "${modulesdir}/core_modules.sh" ] || [ ! -f "${modulesdir}/check_root.sh" ] || [ ! -f "${modulesdir}/core_messages.sh" ]; then
-		echo -e "[ FAIL ] Do NOT run this script as root!"
-		exit 1
-	else
-		core_modules.sh
-		check_root.sh
-	fi
-fi
-
-# LinuxGSM installer mode.
-if [ "${shortname}" == "core" ]; then
-	# Download the latest serverlist. This is the complete list of all supported servers.
-	fn_bootstrap_fetch_file_github "lgsm/data" "serverlist.csv" "${datadir}" "nochmodx" "norun" "forcedl" "nohash"
-	if [ ! -f "${serverlist}" ]; then
-		echo -e "[ FAIL ] serverlist.csv could not be loaded."
-		exit 1
-	fi
-
-	if [ "${userinput}" == "list" ] || [ "${userinput}" == "l" ]; then
-		{
-			tail -n +2 "${serverlist}" | awk -F "," '{print $2 "\t" $3}'
-		} | column -s $'\t' -t | more
-		exit
-	elif [ "${userinput}" == "install" ] || [ "${userinput}" == "i" ]; then
-		tail -n +2 "${serverlist}" | awk -F "," '{print $1 "," $2 "," $3}' > "${serverlistmenu}"
-		fn_install_menu result "LinuxGSM" "Select game server to install." "${serverlistmenu}"
-		userinput="${result}"
-		fn_server_info
-		if [ "${result}" == "${gameservername}" ]; then
-			fn_install_file
-		elif [ "${result}" == "" ]; then
-			echo -e "Install canceled"
-		else
-			echo -e "[ FAIL ] menu result does not match gameservername"
-			echo -e "result: ${result}"
-			echo -e "gameservername: ${gameservername}"
-		fi
-	elif [ "${userinput}" ]; then
-		fn_server_info
-		if [ "${userinput}" == "${gameservername}" ] || [ "${userinput}" == "${gamename}" ] || [ "${userinput}" == "${shortname}" ]; then
-			fn_install_file
-		else
-			echo -e "[ FAIL ] Unknown game server"
-		fi
-	else
-		fn_install_getopt
-	fi
-
-# LinuxGSM server mode.
-else
-	core_modules.sh
-	if [ "${shortname}" != "core-dep" ]; then
-		# Load LinuxGSM configs.
-		# These are required to get all the default variables for the specific server.
-		# Load the default config. If missing download it. If changed reload it.
-		if [ ! -f "${configdirdefault}/config-lgsm/${gameservername}/_default.cfg" ]; then
-			mkdir -p "${configdirdefault}/config-lgsm/${gameservername}"
-			fn_fetch_config "lgsm/config-default/config-lgsm/${gameservername}" "_default.cfg" "${configdirdefault}/config-lgsm/${gameservername}" "_default.cfg" "nochmodx" "norun" "noforcedl" "nohash"
-		fi
-		if [ ! -f "${configdirserver}/_default.cfg" ]; then
-			mkdir -p "${configdirserver}"
-			echo -en "copying _default.cfg...\c"
-			cp -R "${configdirdefault}/config-lgsm/${gameservername}/_default.cfg" "${configdirserver}/_default.cfg"
-			exitcode=$?
-			if [ "${exitcode}" != 0 ]; then
-				echo -e "FAIL"
-				exit 1
-			else
-				echo -e "OK"
-			fi
-		else
-			module_file_diff=$(diff -q "${configdirdefault}/config-lgsm/${gameservername}/_default.cfg" "${configdirserver}/_default.cfg")
-			if [ "${module_file_diff}" != "" ]; then
-				fn_print_warn_nl "_default.cfg has been altered. reloading config."
-				echo -en "copying _default.cfg...\c"
-				cp -R "${configdirdefault}/config-lgsm/${gameservername}/_default.cfg" "${configdirserver}/_default.cfg"
-				exitcode=$?
-				if [ "${exitcode}" != 0 ]; then
-					echo -e "FAIL"
-					exit 1
-				else
-					echo -e "OK"
-				fi
-			fi
-		fi
-		# shellcheck source=/dev/null
-		source "${configdirserver}/_default.cfg"
-		# Load the common.cfg config. If missing download it.
-		if [ ! -f "${configdirserver}/common.cfg" ]; then
-			fn_fetch_config "lgsm/config-default/config-lgsm" "common-template.cfg" "${configdirserver}" "common.cfg" "${chmodx}" "nochmodx" "norun" "noforcedl" "nohash"
-			# shellcheck source=/dev/null
-			source "${configdirserver}/common.cfg"
-		else
-			# shellcheck source=/dev/null
-			source "${configdirserver}/common.cfg"
-		fi
-		# Load the secrets-common.cfg config. If missing download it.
-		if [ ! -f "${configdirserver}/secrets-common.cfg" ]; then
-			fn_fetch_config "lgsm/config-default/config-lgsm" "secrets-common-template.cfg" "${configdirserver}" "secrets-common.cfg" "${chmodx}" "nochmodx" "norun" "noforcedl" "nohash"
-			# shellcheck source=/dev/null
-			source "${configdirserver}/secrets-common.cfg"
-		else
-			# shellcheck source=/dev/null
-			source "${configdirserver}/secrets-common.cfg"
-		fi
-		# Load the instance.cfg config. If missing download it.
-		if [ ! -f "${configdirserver}/${selfname}.cfg" ]; then
-			fn_fetch_config "lgsm/config-default/config-lgsm" "instance-template.cfg" "${configdirserver}" "${selfname}.cfg" "nochmodx" "norun" "noforcedl" "nohash"
-			# shellcheck source=/dev/null
-			source "${configdirserver}/${selfname}.cfg"
-		else
-			# shellcheck source=/dev/null
-			source "${configdirserver}/${selfname}.cfg"
-		fi
-		# Load the secrets-instance.cfg config. If missing download it.
-		if [ ! -f "${configdirserver}/secrets-${selfname}.cfg" ]; then
-			fn_fetch_config "lgsm/config-default/config-lgsm" "secrets-instance-template.cfg" "${configdirserver}" "secrets-${selfname}.cfg" "nochmodx" "norun" "noforcedl" "nohash"
-			# shellcheck source=/dev/null
-			source "${configdirserver}/secrets-${selfname}.cfg"
-		else
-			# shellcheck source=/dev/null
-			source "${configdirserver}/secrets-${selfname}.cfg"
-		fi
-
-		# Load the linuxgsm.sh in to tmpdir. If missing download it.
-		if [ ! -f "${tmpdir}/linuxgsm.sh" ]; then
-			fn_fetch_file_github "" "linuxgsm.sh" "${tmpdir}" "chmodx" "norun" "noforcedl" "nohash"
-		fi
-	fi
-	# Enables ANSI colours from core_messages.sh. Can be disabled with ansi=off.
-	fn_ansi_loader
-	# Prevents running of core_exit.sh for Travis-CI.
-	if [ "${travistest}" != "1" ]; then
-		getopt=$1
-		core_getopt.sh
-	fi
-fi
-
-fn_currentstatus_tmux() {
-	check_status.sh
-	if [ "${status}" != "0" ]; then
-		currentstatus="STARTED"
-	else
-		currentstatus="STOPPED"
-	fi
-}
-
-fn_setstatus() {
-	fn_currentstatus_tmux
-	echo""
-	echo -e "Required status: ${requiredstatus}"
-	counter=0
-	echo -e "Current status:  ${currentstatus}"
-	while [ "${requiredstatus}" != "${currentstatus}" ]; do
-		counter=$((counter + 1))
-		fn_currentstatus_tmux
-		echo -en "New status:  ${currentstatus}\\r"
-
-		if [ "${requiredstatus}" == "STARTED" ]; then
-			(command_start.sh > /dev/null 2>&1)
-		else
-			(command_stop.sh > /dev/null 2>&1)
-		fi
-		if [ "${counter}" -gt "5" ]; then
-			currentstatus="FAIL"
-			echo -e "Current status:  ${currentstatus}"
-			echo -e ""
-			echo -e "Unable to start or stop server."
-			exit 1
-		fi
-	done
-	echo -en "New status:  ${currentstatus}\\r"
-	echo -e "\n"
-	echo -e "Test starting:"
-	echo -e ""
-}
-
-# End of every test will expect the result to either pass or fail
-# If the script does not do as intended the whole test will fail
-# if expecting a pass
-fn_test_result_pass() {
-	if [ $? != 0 ]; then
-		echo -e "================================="
-		echo -e "Expected result: PASS"
-		echo -e "Actual result: FAIL"
-		fn_print_fail_nl "TEST FAILED"
-		exitcode=1
-		core_exit.sh
-	else
-		echo -e "================================="
-		echo -e "Expected result: PASS"
-		echo -e "Actual result: PASS"
-		fn_print_ok_nl "TEST PASSED"
-		echo -e ""
-	fi
-}
-
-# if expecting a fail
-fn_test_result_fail() {
-	if [ $? == 0 ]; then
-		echo -e "================================="
-		echo -e "Expected result: FAIL"
-		echo -e "Actual result: PASS"
-		fn_print_fail_nl "TEST FAILED"
-		exitcode=1
-		core_exit.sh
-	else
-		echo -e "================================="
-		echo -e "Expected result: FAIL"
-		echo -e "Actual result: FAIL"
-		fn_print_ok_nl "TEST PASSED"
-		echo -e ""
-	fi
-}
-
-# test result n/a
-fn_test_result_na() {
-	echo -e "================================="
-	echo -e "Expected result: N/A"
-	echo -e "Actual result: N/A"
-	fn_print_fail_nl "TEST N/A"
-}
-
-sleeptime="0"
-
-echo -e "================================="
-echo -e "Travis CI Tests"
-echo -e "Linux Game Server Manager"
-echo -e "by Daniel Gibbs"
-echo -e "Contributors: http://goo.gl/qLmitD"
-echo -e "https://linuxgsm.com"
-echo -e "================================="
-echo -e ""
-echo -e "================================="
-echo -e "Server Tests"
-echo -e "Using: ${gamename}"
-echo -e "Testing Branch: ${TRAVIS_BRANCH}"
-echo -e "================================="
-
-echo -e ""
-echo -e "Tests Summary"
-echo -e "================================="
-echo -e "0.0 - Pre-test Tasks"
-echo -e "0.1 - Create log dir's"
-echo -e "0.2 - Enable dev-debug"
-echo -e ""
-echo -e "1.0 - Pre-install tests"
-echo -e "1.1 - start - no files"
-echo -e "1.2 - getopt"
-echo -e "1.3 - getopt with incorrect args"
-echo -e ""
-echo -e "2.0 - Installation"
-echo -e "2.1 - install"
-echo -e ""
-echo -e "3.0 - Start/Stop/Restart Tests"
-echo -e "3.1 - start"
-echo -e "3.2 - start - online"
-echo -e "3.3 - start - updateonstart"
-echo -e "3.4 - stop"
-echo -e "3.5 - stop - offline"
-echo -e "3.6 - restart"
-echo -e "3.7 - restart - offline"
-echo -e ""
-echo -e "4.0 - Update Tests"
-echo -e "4.1 - update"
-echo -e "4.2 - update-lgsm"
-echo -e ""
-echo -e "5.0 - Monitor Tests"
-echo -e "5.1 - monitor - online"
-echo -e "5.2 - monitor - offline - with lockfile"
-echo -e "5.3 - monitor - offline - no lockfile"
-echo -e "5.4 - test-alert"
-echo -e ""
-echo -e "6.0 - Details Tests"
-echo -e "6.1 - details"
-echo -e "6.2 - postdetails"
-echo -e ""
-echo -e "7.0 - Backup Tests"
-echo -e "7.1 - backup"
-echo -e ""
-echo -e "8.0 - Development Tools Tests"
-echo -e "8.1 - dev - detect glibc"
-echo -e "8.2 - dev - detect ldd"
-echo -e "8.3 - dev - detect deps"
-echo -e "8.4 - dev - query-raw"
-
-echo -e ""
-echo -e "9.0 - Sponsor"
-echo -e "9.1 - sponsor"
-echo -e ""
-
-echo -e "0.0 - Pre-test Tasks"
-echo -e "=================================================================="
-echo -e "Description:"
-echo -e "Create log dir's"
-echo -e ""
-
-echo -e ""
-echo -e "0.1 - Create log dir's"
-echo -e "================================="
-echo -e ""
-(
-	exec 5> "${TRAVIS_BUILD_DIR}/dev-debug.log"
-	BASH_XTRACEFD="5"
-	set -x
-	install_logs.sh
-)
-echo -e "run order"
-echo -e "================="
-grep modulefile= "${TRAVIS_BUILD_DIR}/dev-debug.log" | sed 's/modulefile=//g'
-
-echo -e ""
-echo -e "0.2 - Enable dev-debug"
-echo -e "================================="
-echo -e "Description:"
-echo -e "Enable dev-debug"
-echo -e ""
-(
-	exec 5> "${TRAVIS_BUILD_DIR}/dev-debug.log"
-	BASH_XTRACEFD="5"
-	set -x
-	command_dev_debug.sh
-)
-fn_test_result_pass
-echo -e "run order"
-echo -e "================="
-grep modulefile= "${TRAVIS_BUILD_DIR}/dev-debug.log" | sed 's/modulefile=//g'
-
-echo -e ""
-echo -e "1.0 - Pre-install tests"
-echo -e "=================================================================="
-echo -e ""
-
-echo -e "1.1 - start - no files"
-echo -e "================================="
-echo -e "Description:"
-echo -e "test script reaction to missing server files."
-echo -e "Command: ./${gameservername} start"
-echo -e ""
-# Allows for testing not on Travis CI
-if [ -z "${TRAVIS}" ]; then
-	(
-		exec 5> "${TRAVIS_BUILD_DIR}/dev-debug.log"
-		BASH_XTRACEFD="5"
-		set -x
-		command_start.sh
-	)
-	fn_test_result_fail
-else
-	echo -e "Test bypassed"
-fi
-
-echo -e "run order"
-echo -e "================="
-grep modulefile= "${TRAVIS_BUILD_DIR}/dev-debug.log" | sed 's/modulefile=//g'
-
-echo -e ""
-echo -e "1.2 - getopt"
-echo -e "================================="
-echo -e "Description:"
-echo -e "displaying options messages."
-echo -e "Command: ./${gameservername}"
-echo -e ""
-(
-	exec 5> "${TRAVIS_BUILD_DIR}/dev-debug.log"
-	BASH_XTRACEFD="5"
-	set -x
-	core_getopt.sh
-)
-fn_test_result_pass
-echo -e "run order"
-echo -e "================="
-grep modulefile= "${TRAVIS_BUILD_DIR}/dev-debug.log" | sed 's/modulefile=//g'
-
-echo -e ""
-echo -e "1.3 - getopt with incorrect args"
-echo -e "================================="
-echo -e "Description:"
-echo -e "displaying options messages."
-echo -e "Command: ./${gameservername} abc123"
-echo -e ""
-getopt="abc123"
-(
-	exec 5> "${TRAVIS_BUILD_DIR}/dev-debug.log"
-	BASH_XTRACEFD="5"
-	set -x
-	core_getopt.sh
-)
-fn_test_result_pass
-echo -e "run order"
-echo -e "================="
-grep modulefile= "${TRAVIS_BUILD_DIR}/dev-debug.log" | sed 's/modulefile=//g'
-
-echo -e ""
-echo -e "2.0 - Installation"
-echo -e "=================================================================="
-
-echo -e ""
-echo -e "2.1 - install"
-echo -e "================================="
-echo -e "Description:"
-echo -e "install ${gamename} server."
-echo -e "Command: ./${gameservername} auto-install"
-(
-	exec 5> "${TRAVIS_BUILD_DIR}/dev-debug.log"
-	BASH_XTRACEFD="5"
-	set -x
-	fn_autoinstall
-)
-fn_test_result_pass
-echo -e "run order"
-echo -e "================="
-grep modulefile= "${TRAVIS_BUILD_DIR}/dev-debug.log" | sed 's/modulefile=//g'
-
-echo -e ""
-echo -e "3.0 - Start/Stop/Restart Tests"
-echo -e "=================================================================="
-
-echo -e ""
-echo -e "3.1 - start"
-echo -e "================================="
-echo -e "Description:"
-echo -e "start ${gamename} server."
-echo -e "Command: ./${gameservername} start"
-requiredstatus="STOPPED"
-fn_setstatus
-(
-	exec 5> "${TRAVIS_BUILD_DIR}/dev-debug.log"
-	BASH_XTRACEFD="5"
-	set -x
-	command_start.sh
-)
-fn_test_result_pass
-echo -e "run order"
-echo -e "================="
-grep modulefile= "${TRAVIS_BUILD_DIR}/dev-debug.log" | sed 's/modulefile=//g'
-
-echo -e ""
-echo -e "3.2 - start - online"
-echo -e "================================="
-echo -e "Description:"
-echo -e "start ${gamename} server while already running."
-echo -e "Command: ./${gameservername} start"
-requiredstatus="STARTED"
-fn_setstatus
-(
-	exec 5> "${TRAVIS_BUILD_DIR}/dev-debug.log"
-	BASH_XTRACEFD="5"
-	set -x
-	command_start.sh
-)
-fn_test_result_fail
-echo -e "run order"
-echo -e "================="
-grep modulefile= "${TRAVIS_BUILD_DIR}/dev-debug.log" | sed 's/modulefile=//g'
-
-echo -e ""
-echo -e "3.3 - start - updateonstart"
-echo -e "================================="
-echo -e "Description:"
-echo -e "will update server on start."
-echo -e "Command: ./${gameservername} start"
-requiredstatus="STOPPED"
-fn_setstatus
-(
-	exec 5> "${TRAVIS_BUILD_DIR}/dev-debug.log"
-	BASH_XTRACEFD="5"
-	set -x
-	updateonstart="on"
-	command_start.sh
-)
-fn_test_result_pass
-echo -e "run order"
-echo -e "================="
-grep modulefile= "${TRAVIS_BUILD_DIR}/dev-debug.log" | sed 's/modulefile=//g'
-
-echo -e ""
-echo -e "3.4 - stop"
-echo -e "================================="
-echo -e "Description:"
-echo -e "stop ${gamename} server."
-echo -e "Command: ./${gameservername} stop"
-requiredstatus="STARTED"
-fn_setstatus
-(
-	exec 5> "${TRAVIS_BUILD_DIR}/dev-debug.log"
-	BASH_XTRACEFD="5"
-	set -x
-	command_stop.sh
-)
-fn_test_result_pass
-echo -e "run order"
-echo -e "================="
-grep modulefile= "${TRAVIS_BUILD_DIR}/dev-debug.log" | sed 's/modulefile=//g'
-
-echo -e ""
-echo -e "3.5 - stop - offline"
-echo -e "================================="
-echo -e "Description:"
-echo -e "stop ${gamename} server while already stopped."
-echo -e "Command: ./${gameservername} stop"
-requiredstatus="STOPPED"
-fn_setstatus
-(
-	exec 5> "${TRAVIS_BUILD_DIR}/dev-debug.log"
-	BASH_XTRACEFD="5"
-	set -x
-	command_stop.sh
-)
-fn_test_result_fail
-echo -e "run order"
-echo -e "================="
-grep modulefile= "${TRAVIS_BUILD_DIR}/dev-debug.log" | sed 's/modulefile=//g'
-
-echo -e ""
-echo -e "3.6 - restart"
-echo -e "================================="
-echo -e "Description:"
-echo -e "restart ${gamename}."
-echo -e "Command: ./${gameservername} restart"
-requiredstatus="STARTED"
-fn_setstatus
-(
-	exec 5> "${TRAVIS_BUILD_DIR}/dev-debug.log"
-	BASH_XTRACEFD="5"
-	set -x
-	command_restart.sh
-)
-fn_test_result_pass
-echo -e "run order"
-echo -e "================="
-grep modulefile= "${TRAVIS_BUILD_DIR}/dev-debug.log" | sed 's/modulefile=//g'
-
-echo -e ""
-echo -e "3.7 - restart - offline"
-echo -e "================================="
-echo -e "Description:"
-echo -e "restart ${gamename} while already stopped."
-echo -e "Command: ./${gameservername} restart"
-requiredstatus="STOPPED"
-fn_setstatus
-(
-	exec 5> "${TRAVIS_BUILD_DIR}/dev-debug.log"
-	BASH_XTRACEFD="5"
-	set -x
-	command_restart.sh
-)
-fn_test_result_pass
-echo -e "run order"
-echo -e "================="
-grep modulefile= "${TRAVIS_BUILD_DIR}/dev-debug.log" | sed 's/modulefile=//g'
-
-echo -e ""
-echo -e "4.0 - Update Tests"
-echo -e "=================================================================="
-
-echo -e ""
-echo -e "4.1 - update"
-echo -e "================================="
-echo -e "Description:"
-echo -e "check for updates."
-echo -e "Command: ./${gameservername} update"
-requiredstatus="STOPPED"
-fn_setstatus
-(
-	exec 5> "${TRAVIS_BUILD_DIR}/dev-debug.log"
-	BASH_XTRACEFD="5"
-	set -x
-	command_update.sh
-)
-fn_test_result_pass
-echo -e "run order"
-echo -e "================="
-grep modulefile= "${TRAVIS_BUILD_DIR}/dev-debug.log" | sed 's/modulefile=//g'
-
-echo -e ""
-echo -e "4.2 - update-lgsm"
-echo -e "================================="
-echo -e "Description:"
-echo -e "update LinuxGSM."
-echo -e ""
-echo -e "Command: ./jc2server update-lgam"
-requiredstatus="STARTED"
-fn_setstatus
-(
-	exec 5> "${TRAVIS_BUILD_DIR}/dev-debug.log"
-	BASH_XTRACEFD="5"
-	set -x
-	command_update_linuxgsm.sh
-)
-fn_test_result_pass
-echo -e "run order"
-echo -e "================="
-grep modulefile= "${TRAVIS_BUILD_DIR}/dev-debug.log" | sed 's/modulefile=//g'
-
-echo -e ""
-echo -e "5.0 - Monitor Tests"
-echo -e "=================================================================="
-echo -e ""
-info_game.sh
-echo -e "Server IP - Port: ${ip}:${port}"
-echo -e "Server IP - Query Port: ${ip}:${queryport}"
-
-echo -e ""
-echo -e "5.1 - monitor - online"
-echo -e "================================="
-echo -e "Description:"
-echo -e "run monitor server while already running."
-echo -e "Command: ./${gameservername} monitor"
-requiredstatus="STARTED"
-fn_setstatus
-(
-	exec 5> "${TRAVIS_BUILD_DIR}/dev-debug.log"
-	BASH_XTRACEFD="5"
-	set -x
-	command_monitor.sh
-)
-fn_test_result_pass
-echo -e "run order"
-echo -e "================="
-grep modulefile= "${TRAVIS_BUILD_DIR}/dev-debug.log" | sed 's/modulefile=//g'
-
-echo -e ""
-echo -e "5.2 - monitor - offline - with lockfile"
-echo -e "================================="
-echo -e "Description:"
-echo -e "run monitor while server is offline with lockfile."
-echo -e "Command: ./${gameservername} monitor"
-requiredstatus="STOPPED"
-fn_setstatus
-fn_print_info_nl "creating lockfile."
-date '+%s' > "${lockdir}/${selfname}.lock"
-echo "${version}" >> "${lockdir}/${selfname}.lock"
-echo "${port}" >> "${lockdir}/${selfname}.lock"
-(
-	exec 5> "${TRAVIS_BUILD_DIR}/dev-debug.log"
-	BASH_XTRACEFD="5"
-	set -x
-	command_monitor.sh
-)
-fn_test_result_pass
-echo -e "run order"
-echo -e "================="
-grep modulefile= "${TRAVIS_BUILD_DIR}/dev-debug.log" | sed 's/modulefile=//g'
-
-echo -e ""
-echo -e "5.3 - monitor - offline - no lockfile"
-echo -e "================================="
-echo -e "Description:"
-echo -e "run monitor while server is offline with no lockfile."
-echo -e "Command: ./${gameservername} monitor"
-requiredstatus="STOPPED"
-fn_setstatus
-(
-	exec 5> "${TRAVIS_BUILD_DIR}/dev-debug.log"
-	BASH_XTRACEFD="5"
-	set -x
-	command_monitor.sh
-)
-fn_test_result_fail
-echo -e "run order"
-echo -e "================="
-grep modulefile= "${TRAVIS_BUILD_DIR}/dev-debug.log" | sed 's/modulefile=//g'
-
-echo -e ""
-echo -e "5.4 - test-alert"
-echo -e "================================="
-echo -e "Description:"
-echo -e "run monitor while server is offline with no lockfile."
-echo -e "Command: ./${gameservername} test-alert"
-requiredstatus="STOPPED"
-fn_setstatus
-(
-	exec 5> "${TRAVIS_BUILD_DIR}/dev-debug.log"
-	BASH_XTRACEFD="5"
-	set -x
-	command_test_alert.sh
-)
-fn_test_result_fail
-echo -e "run order"
-echo -e "================="
-grep modulefile= "${TRAVIS_BUILD_DIR}/dev-debug.log" | sed 's/modulefile=//g'
-
-echo -e ""
-echo -e "6.0 - Details Tests"
-echo -e "=================================================================="
-
-echo -e ""
-echo -e "6.1 - details"
-echo -e "================================="
-echo -e "Description:"
-echo -e "display details."
-echo -e "Command: ./${gameservername} details"
-requiredstatus="STARTED"
-fn_setstatus
-(
-	exec 5> "${TRAVIS_BUILD_DIR}/dev-debug.log"
-	BASH_XTRACEFD="5"
-	set -x
-	command_details.sh
-)
-fn_test_result_pass
-echo -e "run order"
-echo -e "================="
-grep modulefile= "${TRAVIS_BUILD_DIR}/dev-debug.log" | sed 's/modulefile=//g'
-
-echo -e ""
-echo -e "6.2 - postdetails"
-echo -e "================================="
-echo -e "Description:"
-echo -e "post details."
-echo -e "Command: ./${gameservername} postdetails"
-requiredstatus="STARTED"
-fn_setstatus
-(
-	exec 5> "${TRAVIS_BUILD_DIR}/dev-debug.log"
-	BASH_XTRACEFD="5"
-	set -x
-	command_postdetails.sh
-)
-fn_test_result_pass
-echo -e "run order"
-echo -e "================="
-grep modulefile= "${TRAVIS_BUILD_DIR}/dev-debug.log" | sed 's/modulefile=//g'
-
-echo -e ""
-echo -e "7.0 - Backup Tests"
-echo -e "=================================================================="
-
-echo -e ""
-echo -e "7.1 - backup"
-echo -e "================================="
-echo -e "Description:"
-echo -e "run a backup."
-echo -e "Command: ./${gameservername} backup"
-requiredstatus="STARTED"
-fn_setstatus
-echo -e "test de-activated until issue #1839 fixed"
-#(command_backup.sh)
-fn_test_result_pass
-echo -e "run order"
-echo -e "================="
-grep modulefile= "${TRAVIS_BUILD_DIR}/dev-debug.log" | sed 's/modulefile=//g'
-
-echo -e ""
-echo -e "8.0 - Development Tools Tests"
-echo -e "=================================================================="
-
-echo -e ""
-echo -e "8.1 - dev - detect glibc"
-echo -e "================================="
-echo -e "Description:"
-echo -e "detect glibc."
-echo -e "Command: ./${gameservername} detect-glibc"
-requiredstatus="STARTED"
-fn_setstatus
-(
-	exec 5> "${TRAVIS_BUILD_DIR}/dev-debug.log"
-	BASH_XTRACEFD="5"
-	set -x
-	command_dev_detect_glibc.sh
-)
-fn_test_result_pass
-echo -e "run order"
-echo -e "================="
-grep modulefile= "${TRAVIS_BUILD_DIR}/dev-debug.log" | sed 's/modulefile=//g'
-
-echo -e ""
-echo -e "8.2 - dev - detect ldd"
-echo -e "================================="
-echo -e "Description:"
-echo -e "detect ldd."
-echo -e "Command: ./${gameservername} detect-ldd"
-requiredstatus="STARTED"
-fn_setstatus
-(
-	exec 5> "${TRAVIS_BUILD_DIR}/dev-debug.log"
-	BASH_XTRACEFD="5"
-	set -x
-	command_dev_detect_ldd.sh
-)
-fn_test_result_pass
-echo -e "run order"
-echo -e "================="
-grep modulefile= "${TRAVIS_BUILD_DIR}/dev-debug.log" | sed 's/modulefile=//g'
-
-echo -e ""
-echo -e "8.3 - dev - detect deps"
-echo -e "================================="
-echo -e "Description:"
-echo -e "detect dependencies."
-echo -e "Command: ./${gameservername} detect-deps"
-requiredstatus="STARTED"
-fn_setstatus
-(
-	exec 5> "${TRAVIS_BUILD_DIR}/dev-debug.log"
-	BASH_XTRACEFD="5"
-	set -x
-	command_dev_detect_deps.sh
-)
-fn_test_result_pass
-echo -e "run order"
-echo -e "================="
-grep modulefile= "${TRAVIS_BUILD_DIR}/dev-debug.log" | sed 's/modulefile=//g'
-
-echo -e ""
-echo -e "8.4 - dev - query-raw"
-echo -e "================================="
-echo -e "Description:"
-echo -e "raw query output."
-echo -e "Command: ./${gameservername} query-raw"
-requiredstatus="STARTED"
-fn_setstatus
-(
-	exec 5> "${TRAVIS_BUILD_DIR}/dev-debug.log"
-	BASH_XTRACEFD="5"
-	set -x
-	command_dev_query_raw.sh
-)
-fn_test_result_na
-echo -e "run order"
-echo -e "================="
-grep modulefile= "${TRAVIS_BUILD_DIR}/dev-debug.log" | sed 's/modulefile=//g'
-
-echo -e ""
-
-echo -e "9.0 - Sponsor"
-echo -e "=================================================================="
-
-echo -e ""
-echo -e "9.1 - sponsor"
-echo -e "================================="
-echo -e "Description:"
-echo -e "sponsor."
-echo -e "Command: ./${gameservername} sponsor"
-requiredstatus="STARTED"
-fn_setstatus
-(
-	exec 5> "${TRAVIS_BUILD_DIR}/dev-debug.log"
-	BASH_XTRACEFD="5"
-	set -x
-	command_sponsor.sh
-)
-fn_test_result_pass
-echo -e "run order"
-echo -e "================="
-grep modulefile= "${TRAVIS_BUILD_DIR}/dev-debug.log" | sed 's/modulefile=//g'
-
-echo -e ""
-echo -e "================================="
-echo -e "Server Tests - Complete!"
-echo -e "Using: ${gamename}"
-echo -e "================================="
-requiredstatus="STOPPED"
-fn_setstatus
-
-core_exit.sh
diff --git a/tests/tests_jc2server.sh b/tests/tests_jc2server.sh
deleted file mode 100644
index adf59ab92..000000000
--- a/tests/tests_jc2server.sh
+++ /dev/null
@@ -1,1352 +0,0 @@
-#!/bin/bash
-# Project: Game Server Managers - LinuxGSM
-# Author: Daniel Gibbs
-# License: MIT License, Copyright (c) 2020 Daniel Gibbs
-# Purpose: Travis CI Tests: Just Cause 2 | Linux Game Server Management Script
-# Contributors: https://linuxgsm.com/contrib
-# Documentation: https://docs.linuxgsm.com
-# Website: https://linuxgsm.com
-
-# DO NOT EDIT THIS FILE
-# LinuxGSM configuration is no longer edited here
-# To update your LinuxGSM config go to:
-# lgsm/config-lgsm
-# https://docs.linuxgsm.com/configuration/linuxgsm-config
-
-# Debugging
-if [ -f ".dev-debug" ]; then
-	exec 5> dev-debug.log
-	BASH_XTRACEFD="5"
-	set -x
-fi
-
-version="v23.5.3"
-shortname="jc2"
-gameservername="jc2server"
-commandname="CORE"
-rootdir=$(dirname "$(readlink -f "${BASH_SOURCE[0]}")")
-selfname=$(basename "$(readlink -f "${BASH_SOURCE[0]}")")
-sessionname=$(echo "${selfname}" | cut -f1 -d".")
-lgsmdir="${rootdir}/lgsm"
-logdir="${rootdir}/log"
-lgsmlogdir="${logdir}/lgsm"
-steamcmddir="${HOME}/.steam/steamcmd"
-serverfiles="${rootdir}/serverfiles"
-modulesdir="${lgsmdir}/modules"
-tmpdir="${lgsmdir}/tmp"
-datadir="${lgsmdir}/data"
-lockdir="${lgsmdir}/lock"
-serverlist="${datadir}/serverlist.csv"
-serverlistmenu="${datadir}/serverlistmenu.csv"
-configdir="${lgsmdir}/config-lgsm"
-configdirserver="${configdir}/${gameservername}"
-configdirdefault="${lgsmdir}/config-default"
-userinput="${1}"
-
-# Allows for testing not on Travis CI.
-# if using travis for tests
-if [ -z "${TRAVIS}" ]; then
-	TRAVIS_BRANCH="develop"
-	TRAVIS_BUILD_DIR="${rootdir}"
-fi
-travistest="1"
-
-## GitHub Branch Select
-# Allows for the use of different module files
-# from a different repo and/or branch.
-githubuser="GameServerManagers"
-githubrepo="LinuxGSM"
-githubbranch="${TRAVIS_BRANCH}"
-
-# Core module that is required first.
-core_modules.sh() {
-	modulefile="${FUNCNAME[0]}"
-	fn_bootstrap_fetch_file_github "lgsm/modules" "core_modules.sh" "${modulesdir}" "chmodx" "run" "noforcedl" "nohash"
-}
-
-# Bootstrap
-# Fetches the core modules required before passed off to core_dl.sh.
-fn_bootstrap_fetch_file() {
-	remote_fileurl="${1}"
-	remote_fileurl_backup="${2}"
-	remote_fileurl_name="${3}"
-	remote_fileurl_backup_name="${4}"
-	local_filedir="${5}"
-	local_filename="${6}"
-	chmodx="${7:-0}"
-	run="${8:-0}"
-	forcedl="${9:-0}"
-	md5="${10:-0}"
-	# Download file if missing or download forced.
-	if [ ! -f "${local_filedir}/${local_filename}" ] || [ "${forcedl}" == "forcedl" ]; then
-		# If backup fileurl exists include it.
-		if [ -n "${remote_fileurl_backup}" ]; then
-			# counter set to 0 to allow second try
-			counter=0
-			remote_fileurls_array=(remote_fileurl remote_fileurl_backup)
-		else
-			# counter set to 1 to not allow second try
-			counter=1
-			remote_fileurls_array=(remote_fileurl)
-		fi
-
-		for remote_fileurl_array in "${remote_fileurls_array[@]}"; do
-			if [ "${remote_fileurl_array}" == "remote_fileurl" ]; then
-				fileurl="${remote_fileurl}"
-				fileurl_name="${remote_fileurl_name}"
-			elif [ "${remote_fileurl_array}" == "remote_fileurl_backup" ]; then
-				fileurl="${remote_fileurl_backup}"
-				fileurl_name="${remote_fileurl_backup_name}"
-			fi
-			counter=$((counter + 1))
-			if [ ! -d "${local_filedir}" ]; then
-				mkdir -p "${local_filedir}"
-			fi
-			# Trap will remove part downloaded files if canceled.
-			trap fn_fetch_trap INT
-			# Larger files show a progress bar.
-
-			echo -en "fetching ${fileurl_name} ${local_filename}...\c"
-			curlcmd=$(curl -s --fail -L -o "${local_filedir}/${local_filename}" "${fileurl}" 2>&1)
-
-			local exitcode=$?
-			# Download will fail if downloads a html file.
-			if [ -f "${local_filedir}/${local_filename}" ]; then
-				if [ -n "$(head "${local_filedir}/${local_filename}" | grep "DOCTYPE")" ]; then
-					rm -f "${local_filedir:?}/${local_filename:?}"
-					local exitcode=2
-				fi
-			fi
-
-			# On first try will error. On second try will fail.
-			if [ "${exitcode}" != 0 ]; then
-				if [ ${counter} -ge 2 ]; then
-					echo -e "FAIL"
-					if [ -f "${lgsmlog}" ]; then
-						fn_script_log_fail "Downloading ${local_filename}"
-						fn_script_log_fail "${fileurl}"
-					fi
-					core_exit.sh
-				else
-					echo -e "ERROR"
-					if [ -f "${lgsmlog}" ]; then
-						fn_script_log_error "Downloading ${local_filename}"
-						fn_script_log_error "${fileurl}"
-					fi
-				fi
-
-			else
-				echo -en "OK"
-				sleep 0.3
-				echo -en "\033[2K\\r"
-				if [ -f "${lgsmlog}" ]; then
-					fn_script_log_pass "Downloading ${local_filename}"
-				fi
-
-				# Make file executable if chmodx is set.
-				if [ "${chmodx}" == "chmodx" ]; then
-					chmod +x "${local_filedir}/${local_filename}"
-				fi
-
-				# Remove trap.
-				trap - INT
-
-				break
-			fi
-		done
-	fi
-
-	if [ -f "${local_filedir}/${local_filename}" ]; then
-		# Execute file if run is set.
-		if [ "${run}" == "run" ]; then
-			# shellcheck source=/dev/null
-			source "${local_filedir}/${local_filename}"
-		fi
-	fi
-}
-
-fn_bootstrap_fetch_file_github() {
-	github_file_url_dir="${1}"
-	github_file_url_name="${2}"
-	# If master branch will currently running LinuxGSM version to prevent "version mixing". This is ignored if a fork.
-	if [ "${githubbranch}" == "master" ] && [ "${githubuser}" == "GameServerManagers" ] && [ "${commandname}" != "UPDATE-LGSM" ]; then
-		remote_fileurl="https://raw.githubusercontent.com/${githubuser}/${githubrepo}/${version}/${github_file_url_dir}/${github_file_url_name}"
-		remote_fileurl_backup="https://bitbucket.org/${githubuser}/${githubrepo}/raw/${version}/${github_file_url_dir}/${github_file_url_name}"
-	else
-		remote_fileurl="https://raw.githubusercontent.com/${githubuser}/${githubrepo}/${githubbranch}/${github_file_url_dir}/${github_file_url_name}"
-		remote_fileurl_backup="https://bitbucket.org/${githubuser}/${githubrepo}/raw/${githubbranch}/${github_file_url_dir}/${github_file_url_name}"
-	fi
-	remote_fileurl_name="GitHub"
-	remote_fileurl_backup_name="Bitbucket"
-	local_filedir="${3}"
-	local_filename="${github_file_url_name}"
-	chmodx="${4:-0}"
-	run="${5:-0}"
-	forcedl="${6:-0}"
-	md5="${7:-0}"
-	# Passes vars to the file download module.
-	fn_bootstrap_fetch_file "${remote_fileurl}" "${remote_fileurl_backup}" "${remote_fileurl_name}" "${remote_fileurl_backup_name}" "${local_filedir}" "${local_filename}" "${chmodx}" "${run}" "${forcedl}" "${md5}"
-}
-
-# Installer menu.
-
-fn_print_center() {
-	columns=$(tput cols)
-	line="$*"
-	printf "%*s\n" $(((${#line} + columns) / 2)) "${line}"
-}
-
-fn_print_horizontal() {
-	printf '%*s\n' "${COLUMNS:-$(tput cols)}" '' | tr ' ' "="
-}
-
-# Bash menu.
-fn_install_menu_bash() {
-	local resultvar=$1
-	title=$2
-	caption=$3
-	options=$4
-	fn_print_horizontal
-	fn_print_center "${title}"
-	fn_print_center "${caption}"
-	fn_print_horizontal
-	menu_options=()
-	while read -r line || [[ -n "${line}" ]]; do
-		var=$(echo -e "${line}" | awk -F "," '{print $2 " - " $3}')
-		menu_options+=("${var}")
-	done < "${options}"
-	menu_options+=("Cancel")
-	select option in "${menu_options[@]}"; do
-		if [ "${option}" ] && [ "${option}" != "Cancel" ]; then
-			eval "$resultvar=\"${option/%\ */}\""
-		fi
-		break
-	done
-}
-
-# Whiptail/Dialog menu.
-fn_install_menu_whiptail() {
-	local menucmd=$1
-	local resultvar=$2
-	title=$3
-	caption=$4
-	options=$5
-	height=${6:-40}
-	width=${7:-80}
-	menuheight=${8:-30}
-	IFS=","
-	menu_options=()
-	while read -r line; do
-		key=$(echo -e "${line}" | awk -F "," '{print $3}')
-		val=$(echo -e "${line}" | awk -F "," '{print $2}')
-		menu_options+=("${val//\"/}" "${key//\"/}")
-	done < "${options}"
-	OPTION=$(${menucmd} --title "${title}" --menu "${caption}" "${height}" "${width}" "${menuheight}" "${menu_options[@]}" 3>&1 1>&2 2>&3)
-	if [ $? == 0 ]; then
-		eval "$resultvar=\"${OPTION}\""
-	else
-		eval "$resultvar="
-	fi
-}
-
-# Menu selector.
-fn_install_menu() {
-	local resultvar=$1
-	local selection=""
-	title=$2
-	caption=$3
-	options=$4
-	# Get menu command.
-	for menucmd in whiptail dialog bash; do
-		if [ "$(command -v "${menucmd}")" ]; then
-			menucmd=$(command -v "${menucmd}")
-			break
-		fi
-	done
-	case "$(basename "${menucmd}")" in
-		whiptail | dialog)
-			fn_install_menu_whiptail "${menucmd}" selection "${title}" "${caption}" "${options}" 40 80 30
-			;;
-		*)
-			fn_install_menu_bash selection "${title}" "${caption}" "${options}"
-			;;
-	esac
-	eval "$resultvar=\"${selection}\""
-}
-
-# Gets server info from serverlist.csv and puts in to array.
-fn_server_info() {
-	IFS=","
-	server_info_array=($(grep -aw "${userinput}" "${serverlist}"))
-	shortname="${server_info_array[0]}"      # csgo
-	gameservername="${server_info_array[1]}" # csgoserver
-	gamename="${server_info_array[2]}"       # Counter Strike: Global Offensive
-}
-
-fn_install_getopt() {
-	userinput="empty"
-	echo -e "Usage: $0 [option]"
-	echo -e ""
-	echo -e "Installer - Linux Game Server Managers - Version ${version}"
-	echo -e "https://linuxgsm.com"
-	echo -e ""
-	echo -e "Commands"
-	echo -e "install\t\t| Select server to install."
-	echo -e "servername\t| Enter name of game server to install. e.g $0 csgoserver."
-	echo -e "list\t\t| List all servers available for install."
-	exit
-}
-
-fn_install_file() {
-	local_filename="${gameservername}"
-	if [ -e "${local_filename}" ]; then
-		i=2
-		while [ -e "${local_filename}-${i}" ]; do
-			((i++))
-		done
-		local_filename="${local_filename}-${i}"
-	fi
-	cp -R "${selfname}" "${local_filename}"
-	sed -i -e "s/shortname=\"core\"/shortname=\"${shortname}\"/g" "${local_filename}"
-	sed -i -e "s/gameservername=\"core\"/gameservername=\"${gameservername}\"/g" "${local_filename}"
-	echo -e "Installed ${gamename} server as ${local_filename}"
-	echo -e ""
-	if [ ! -d "${serverfiles}" ]; then
-		echo -e "./${local_filename} install"
-	else
-		echo -e "Remember to check server ports"
-		echo -e "./${local_filename} details"
-	fi
-	echo -e ""
-	exit
-}
-
-# Prevent LinuxGSM from running as root. Except if doing a dependency install.
-if [ "$(whoami)" == "root" ]; then
-	if [ "${userinput}" == "install" ] || [ "${userinput}" == "auto-install" ] || [ "${userinput}" == "i" ] || [ "${userinput}" == "ai" ]; then
-		if [ "${shortname}" == "core" ]; then
-			echo -e "[ FAIL ] Do NOT run this script as root!"
-			exit 1
-		fi
-	elif [ ! -f "${modulesdir}/core_modules.sh" ] || [ ! -f "${modulesdir}/check_root.sh" ] || [ ! -f "${modulesdir}/core_messages.sh" ]; then
-		echo -e "[ FAIL ] Do NOT run this script as root!"
-		exit 1
-	else
-		core_modules.sh
-		check_root.sh
-	fi
-fi
-
-# LinuxGSM installer mode.
-if [ "${shortname}" == "core" ]; then
-	# Download the latest serverlist. This is the complete list of all supported servers.
-	fn_bootstrap_fetch_file_github "lgsm/data" "serverlist.csv" "${datadir}" "nochmodx" "norun" "forcedl" "nohash"
-	if [ ! -f "${serverlist}" ]; then
-		echo -e "[ FAIL ] serverlist.csv could not be loaded."
-		exit 1
-	fi
-
-	if [ "${userinput}" == "list" ] || [ "${userinput}" == "l" ]; then
-		{
-			tail -n +2 "${serverlist}" | awk -F "," '{print $2 "\t" $3}'
-		} | column -s $'\t' -t | more
-		exit
-	elif [ "${userinput}" == "install" ] || [ "${userinput}" == "i" ]; then
-		tail -n +2 "${serverlist}" | awk -F "," '{print $1 "," $2 "," $3}' > "${serverlistmenu}"
-		fn_install_menu result "LinuxGSM" "Select game server to install." "${serverlistmenu}"
-		userinput="${result}"
-		fn_server_info
-		if [ "${result}" == "${gameservername}" ]; then
-			fn_install_file
-		elif [ "${result}" == "" ]; then
-			echo -e "Install canceled"
-		else
-			echo -e "[ FAIL ] menu result does not match gameservername"
-			echo -e "result: ${result}"
-			echo -e "gameservername: ${gameservername}"
-		fi
-	elif [ "${userinput}" ]; then
-		fn_server_info
-		if [ "${userinput}" == "${gameservername}" ] || [ "${userinput}" == "${gamename}" ] || [ "${userinput}" == "${shortname}" ]; then
-			fn_install_file
-		else
-			echo -e "[ FAIL ] Unknown game server"
-		fi
-	else
-		fn_install_getopt
-	fi
-
-# LinuxGSM server mode.
-else
-	core_modules.sh
-	if [ "${shortname}" != "core-dep" ]; then
-		# Load LinuxGSM configs.
-		# These are required to get all the default variables for the specific server.
-		# Load the default config. If missing download it. If changed reload it.
-		if [ ! -f "${configdirdefault}/config-lgsm/${gameservername}/_default.cfg" ]; then
-			mkdir -p "${configdirdefault}/config-lgsm/${gameservername}"
-			fn_fetch_config "lgsm/config-default/config-lgsm/${gameservername}" "_default.cfg" "${configdirdefault}/config-lgsm/${gameservername}" "_default.cfg" "nochmodx" "norun" "noforcedl" "nohash"
-		fi
-		if [ ! -f "${configdirserver}/_default.cfg" ]; then
-			mkdir -p "${configdirserver}"
-			echo -en "copying _default.cfg...\c"
-			cp -R "${configdirdefault}/config-lgsm/${gameservername}/_default.cfg" "${configdirserver}/_default.cfg"
-			exitcode=$?
-			if [ "${exitcode}" != 0 ]; then
-				echo -e "FAIL"
-				exit 1
-			else
-				echo -e "OK"
-			fi
-		else
-			module_file_diff=$(diff -q "${configdirdefault}/config-lgsm/${gameservername}/_default.cfg" "${configdirserver}/_default.cfg")
-			if [ "${module_file_diff}" != "" ]; then
-				fn_print_warn_nl "_default.cfg has been altered. reloading config."
-				echo -en "copying _default.cfg...\c"
-				cp -R "${configdirdefault}/config-lgsm/${gameservername}/_default.cfg" "${configdirserver}/_default.cfg"
-				exitcode=$?
-				if [ "${exitcode}" != 0 ]; then
-					echo -e "FAIL"
-					exit 1
-				else
-					echo -e "OK"
-				fi
-			fi
-		fi
-		# shellcheck source=/dev/null
-		source "${configdirserver}/_default.cfg"
-		# Load the common.cfg config. If missing download it.
-		if [ ! -f "${configdirserver}/common.cfg" ]; then
-			fn_fetch_config "lgsm/config-default/config-lgsm" "common-template.cfg" "${configdirserver}" "common.cfg" "${chmodx}" "nochmodx" "norun" "noforcedl" "nohash"
-			# shellcheck source=/dev/null
-			source "${configdirserver}/common.cfg"
-		else
-			# shellcheck source=/dev/null
-			source "${configdirserver}/common.cfg"
-		fi
-		# Load the secrets-common.cfg config. If missing download it.
-		if [ ! -f "${configdirserver}/secrets-common.cfg" ]; then
-			fn_fetch_config "lgsm/config-default/config-lgsm" "secrets-common-template.cfg" "${configdirserver}" "secrets-common.cfg" "${chmodx}" "nochmodx" "norun" "noforcedl" "nohash"
-			# shellcheck source=/dev/null
-			source "${configdirserver}/secrets-common.cfg"
-		else
-			# shellcheck source=/dev/null
-			source "${configdirserver}/secrets-common.cfg"
-		fi
-		# Load the instance.cfg config. If missing download it.
-		if [ ! -f "${configdirserver}/${selfname}.cfg" ]; then
-			fn_fetch_config "lgsm/config-default/config-lgsm" "instance-template.cfg" "${configdirserver}" "${selfname}.cfg" "nochmodx" "norun" "noforcedl" "nohash"
-			# shellcheck source=/dev/null
-			source "${configdirserver}/${selfname}.cfg"
-		else
-			# shellcheck source=/dev/null
-			source "${configdirserver}/${selfname}.cfg"
-		fi
-		# Load the secrets-instance.cfg config. If missing download it.
-		if [ ! -f "${configdirserver}/secrets-${selfname}.cfg" ]; then
-			fn_fetch_config "lgsm/config-default/config-lgsm" "secrets-instance-template.cfg" "${configdirserver}" "secrets-${selfname}.cfg" "nochmodx" "norun" "noforcedl" "nohash"
-			# shellcheck source=/dev/null
-			source "${configdirserver}/secrets-${selfname}.cfg"
-		else
-			# shellcheck source=/dev/null
-			source "${configdirserver}/secrets-${selfname}.cfg"
-		fi
-
-		# Load the linuxgsm.sh in to tmpdir. If missing download it.
-		if [ ! -f "${tmpdir}/linuxgsm.sh" ]; then
-			fn_fetch_file_github "" "linuxgsm.sh" "${tmpdir}" "chmodx" "norun" "noforcedl" "nohash"
-		fi
-	fi
-	# Enables ANSI colours from core_messages.sh. Can be disabled with ansi=off.
-	fn_ansi_loader
-	# Prevents running of core_exit.sh for Travis-CI.
-	if [ "${travistest}" != "1" ]; then
-		getopt=$1
-		core_getopt.sh
-	fi
-fi
-
-fn_currentstatus_tmux() {
-	check_status.sh
-	if [ "${status}" != "0" ]; then
-		currentstatus="STARTED"
-	else
-		currentstatus="STOPPED"
-	fi
-}
-
-fn_setstatus() {
-	fn_currentstatus_tmux
-	echo""
-	echo -e "Required status: ${requiredstatus}"
-	counter=0
-	echo -e "Current status:  ${currentstatus}"
-	while [ "${requiredstatus}" != "${currentstatus}" ]; do
-		counter=$((counter + 1))
-		fn_currentstatus_tmux
-		echo -en "New status:  ${currentstatus}\\r"
-
-		if [ "${requiredstatus}" == "STARTED" ]; then
-			(command_start.sh > /dev/null 2>&1)
-		else
-			(command_stop.sh > /dev/null 2>&1)
-		fi
-		if [ "${counter}" -gt "5" ]; then
-			currentstatus="FAIL"
-			echo -e "Current status:  ${currentstatus}"
-			echo -e ""
-			echo -e "Unable to start or stop server."
-			exit 1
-		fi
-	done
-	echo -en "New status:  ${currentstatus}\\r"
-	echo -e "\n"
-	echo -e "Test starting:"
-	echo -e ""
-}
-
-# End of every test will expect the result to either pass or fail
-# If the script does not do as intended the whole test will fail
-# if expecting a pass
-fn_test_result_pass() {
-	if [ $? != 0 ]; then
-		echo -e "================================="
-		echo -e "Expected result: PASS"
-		echo -e "Actual result: FAIL"
-		fn_print_fail_nl "TEST FAILED"
-		exitcode=1
-		core_exit.sh
-	else
-		echo -e "================================="
-		echo -e "Expected result: PASS"
-		echo -e "Actual result: PASS"
-		fn_print_ok_nl "TEST PASSED"
-		echo -e ""
-	fi
-}
-
-# if expecting a fail
-fn_test_result_fail() {
-	if [ $? == 0 ]; then
-		echo -e "================================="
-		echo -e "Expected result: FAIL"
-		echo -e "Actual result: PASS"
-		fn_print_fail_nl "TEST FAILED"
-		exitcode=1
-		core_exit.sh
-	else
-		echo -e "================================="
-		echo -e "Expected result: FAIL"
-		echo -e "Actual result: FAIL"
-		fn_print_ok_nl "TEST PASSED"
-		echo -e ""
-	fi
-}
-
-# test result n/a
-fn_test_result_na() {
-	echo -e "================================="
-	echo -e "Expected result: N/A"
-	echo -e "Actual result: N/A"
-	fn_print_fail_nl "TEST N/A"
-}
-
-sleeptime="0"
-
-echo -e "================================="
-echo -e "Travis CI Tests"
-echo -e "Linux Game Server Manager"
-echo -e "by Daniel Gibbs"
-echo -e "Contributors: http://goo.gl/qLmitD"
-echo -e "https://linuxgsm.com"
-echo -e "================================="
-echo -e ""
-echo -e "================================="
-echo -e "Server Tests"
-echo -e "Using: ${gamename}"
-echo -e "Testing Branch: ${TRAVIS_BRANCH}"
-echo -e "================================="
-echo -e ""
-echo -e "Tests Summary"
-echo -e "================================="
-echo -e "0.0 - Pre-test Tasks"
-echo -e "0.1 - Create log dir's"
-echo -e "0.2 - Enable dev-debug"
-echo -e ""
-echo -e "1.0 - Pre-install tests"
-echo -e "1.1 - start - no files"
-echo -e "1.2 - getopt"
-echo -e "1.3 - getopt with incorrect args"
-echo -e ""
-echo -e "2.0 - Installation"
-echo -e "2.1 - install"
-echo -e ""
-echo -e "3.0 - Start/Stop/Restart Tests"
-echo -e "3.1 - start"
-echo -e "3.2 - start - online"
-echo -e "3.3 - start - updateonstart"
-echo -e "3.4 - stop"
-echo -e "3.5 - stop - offline"
-echo -e "3.6 - restart"
-echo -e "3.7 - restart - offline"
-echo -e ""
-echo -e "4.0 - Update Tests"
-echo -e "4.1 - update"
-echo -e "4.2 - update  - change buildid"
-echo -e "4.3 - update  - change buildid - online"
-echo -e "4.4 - update  - remove appmanifest file"
-echo -e "4.5 - force-update"
-echo -e "4.6 - force-update - online"
-echo -e "4.7 - validate"
-echo -e "4.8 - validate - online"
-echo -e "4.9 - update-lgsm"
-echo -e ""
-echo -e "5.0 - Monitor Tests"
-echo -e "5.1 - monitor - online"
-echo -e "5.2 - monitor - offline - with lockfile"
-echo -e "5.3 - monitor - offline - no lockfile"
-echo -e "5.4 - test-alert"
-echo -e ""
-echo -e "6.0 - Details Tests"
-echo -e "6.1 - details"
-echo -e "6.2 - postdetails"
-echo -e ""
-echo -e "7.0 - Backup Tests"
-echo -e "7.1 - backup"
-echo -e ""
-echo -e "8.0 - Development Tools Tests"
-echo -e "8.1 - dev - detect glibc"
-echo -e "8.2 - dev - detect ldd"
-echo -e "8.3 - dev - detect deps"
-echo -e "8.4 - dev - query-raw"
-echo -e ""
-echo -e "9.0 - Sponsor"
-echo -e "9.1 - sponsor"
-echo -e ""
-echo -e "0.0 - Pre-test Tasks"
-echo -e "=================================================================="
-echo -e "Description:"
-echo -e "Create log dir's"
-echo -e ""
-
-echo -e ""
-echo -e "0.1 - Create log dir's"
-echo -e "================================="
-echo -e ""
-(
-	exec 5> "${TRAVIS_BUILD_DIR}/dev-debug.log"
-	BASH_XTRACEFD="5"
-	set -x
-	install_logs.sh
-)
-echo -e "run order"
-echo -e "================="
-grep modulefile= "${TRAVIS_BUILD_DIR}/dev-debug.log" | sed 's/modulefile=//g'
-
-echo -e ""
-echo -e "0.2 - Enable dev-debug"
-echo -e "================================="
-echo -e "Description:"
-echo -e "Enable dev-debug"
-echo -e ""
-(
-	exec 5> "${TRAVIS_BUILD_DIR}/dev-debug.log"
-	BASH_XTRACEFD="5"
-	set -x
-	command_dev_debug.sh
-)
-fn_test_result_pass
-echo -e "run order"
-echo -e "================="
-grep modulefile= "${TRAVIS_BUILD_DIR}/dev-debug.log" | sed 's/modulefile=//g'
-
-echo -e ""
-echo -e "1.0 - Pre-install tests"
-echo -e "=================================================================="
-echo -e ""
-
-echo -e "1.1 - start - no files"
-echo -e "================================="
-echo -e "Description:"
-echo -e "test script reaction to missing server files."
-echo -e "Command: ./${gameservername} start"
-echo -e ""
-# Allows for testing not on Travis CI
-if [ -z "${TRAVIS}" ]; then
-	(
-		exec 5> "${TRAVIS_BUILD_DIR}/dev-debug.log"
-		BASH_XTRACEFD="5"
-		set -x
-		command_start.sh
-	)
-	fn_test_result_fail
-else
-	echo -e "Test bypassed"
-fi
-
-echo -e "run order"
-echo -e "================="
-grep modulefile= "${TRAVIS_BUILD_DIR}/dev-debug.log" | sed 's/modulefile=//g'
-
-echo -e ""
-echo -e "1.2 - getopt"
-echo -e "================================="
-echo -e "Description:"
-echo -e "displaying options messages."
-echo -e "Command: ./${gameservername}"
-echo -e ""
-(
-	exec 5> "${TRAVIS_BUILD_DIR}/dev-debug.log"
-	BASH_XTRACEFD="5"
-	set -x
-	core_getopt.sh
-)
-fn_test_result_pass
-echo -e "run order"
-echo -e "================="
-grep modulefile= "${TRAVIS_BUILD_DIR}/dev-debug.log" | sed 's/modulefile=//g'
-
-echo -e ""
-echo -e "1.3 - getopt with incorrect args"
-echo -e "================================="
-echo -e "Description:"
-echo -e "displaying options messages."
-echo -e "Command: ./${gameservername} abc123"
-echo -e ""
-getopt="abc123"
-(
-	exec 5> "${TRAVIS_BUILD_DIR}/dev-debug.log"
-	BASH_XTRACEFD="5"
-	set -x
-	core_getopt.sh
-)
-fn_test_result_pass
-echo -e "run order"
-echo -e "================="
-grep modulefile= "${TRAVIS_BUILD_DIR}/dev-debug.log" | sed 's/modulefile=//g'
-
-echo -e ""
-echo -e "2.0 - Installation"
-echo -e "=================================================================="
-
-echo -e ""
-echo -e "2.1 - install"
-echo -e "================================="
-echo -e "Description:"
-echo -e "install ${gamename} server."
-echo -e "Command: ./${gameservername} auto-install"
-(
-	exec 5> "${TRAVIS_BUILD_DIR}/dev-debug.log"
-	BASH_XTRACEFD="5"
-	set -x
-	fn_autoinstall
-)
-fn_test_result_pass
-echo -e "run order"
-echo -e "================="
-grep modulefile= "${TRAVIS_BUILD_DIR}/dev-debug.log" | sed 's/modulefile=//g'
-
-echo -e ""
-echo -e "3.0 - Start/Stop/Restart Tests"
-echo -e "=================================================================="
-
-echo -e ""
-echo -e "3.1 - start"
-echo -e "================================="
-echo -e "Description:"
-echo -e "start ${gamename} server."
-echo -e "Command: ./${gameservername} start"
-requiredstatus="STOPPED"
-fn_setstatus
-(
-	exec 5> "${TRAVIS_BUILD_DIR}/dev-debug.log"
-	BASH_XTRACEFD="5"
-	set -x
-	command_start.sh
-)
-fn_test_result_pass
-echo -e "run order"
-echo -e "================="
-grep modulefile= "${TRAVIS_BUILD_DIR}/dev-debug.log" | sed 's/modulefile=//g'
-
-echo -e ""
-echo -e "3.2 - start - online"
-echo -e "================================="
-echo -e "Description:"
-echo -e "start ${gamename} server while already running."
-echo -e "Command: ./${gameservername} start"
-requiredstatus="STARTED"
-fn_setstatus
-(
-	exec 5> "${TRAVIS_BUILD_DIR}/dev-debug.log"
-	BASH_XTRACEFD="5"
-	set -x
-	command_start.sh
-)
-fn_test_result_fail
-echo -e "run order"
-echo -e "================="
-grep modulefile= "${TRAVIS_BUILD_DIR}/dev-debug.log" | sed 's/modulefile=//g'
-
-echo -e ""
-echo -e "3.3 - start - updateonstart"
-echo -e "================================="
-echo -e "Description:"
-echo -e "will update server on start."
-echo -e "Command: ./${gameservername} start"
-requiredstatus="STOPPED"
-fn_setstatus
-(
-	exec 5> "${TRAVIS_BUILD_DIR}/dev-debug.log"
-	BASH_XTRACEFD="5"
-	set -x
-	updateonstart="on"
-	command_start.sh
-)
-fn_test_result_pass
-echo -e "run order"
-echo -e "================="
-grep modulefile= "${TRAVIS_BUILD_DIR}/dev-debug.log" | sed 's/modulefile=//g'
-
-echo -e ""
-echo -e "3.4 - stop"
-echo -e "================================="
-echo -e "Description:"
-echo -e "stop ${gamename} server."
-echo -e "Command: ./${gameservername} stop"
-requiredstatus="STARTED"
-fn_setstatus
-(
-	exec 5> "${TRAVIS_BUILD_DIR}/dev-debug.log"
-	BASH_XTRACEFD="5"
-	set -x
-	command_stop.sh
-)
-fn_test_result_pass
-echo -e "run order"
-echo -e "================="
-grep modulefile= "${TRAVIS_BUILD_DIR}/dev-debug.log" | sed 's/modulefile=//g'
-
-echo -e ""
-echo -e "3.5 - stop - offline"
-echo -e "================================="
-echo -e "Description:"
-echo -e "stop ${gamename} server while already stopped."
-echo -e "Command: ./${gameservername} stop"
-requiredstatus="STOPPED"
-fn_setstatus
-(
-	exec 5> "${TRAVIS_BUILD_DIR}/dev-debug.log"
-	BASH_XTRACEFD="5"
-	set -x
-	command_stop.sh
-)
-fn_test_result_fail
-echo -e "run order"
-echo -e "================="
-grep modulefile= "${TRAVIS_BUILD_DIR}/dev-debug.log" | sed 's/modulefile=//g'
-
-echo -e ""
-echo -e "3.6 - restart"
-echo -e "================================="
-echo -e "Description:"
-echo -e "restart ${gamename}."
-echo -e "Command: ./${gameservername} restart"
-requiredstatus="STARTED"
-fn_setstatus
-(
-	exec 5> "${TRAVIS_BUILD_DIR}/dev-debug.log"
-	BASH_XTRACEFD="5"
-	set -x
-	command_restart.sh
-)
-fn_test_result_pass
-echo -e "run order"
-echo -e "================="
-grep modulefile= "${TRAVIS_BUILD_DIR}/dev-debug.log" | sed 's/modulefile=//g'
-
-echo -e ""
-echo -e "3.7 - restart - offline"
-echo -e "================================="
-echo -e "Description:"
-echo -e "restart ${gamename} while already stopped."
-echo -e "Command: ./${gameservername} restart"
-requiredstatus="STOPPED"
-fn_setstatus
-(
-	exec 5> "${TRAVIS_BUILD_DIR}/dev-debug.log"
-	BASH_XTRACEFD="5"
-	set -x
-	command_restart.sh
-)
-fn_test_result_pass
-echo -e "run order"
-echo -e "================="
-grep modulefile= "${TRAVIS_BUILD_DIR}/dev-debug.log" | sed 's/modulefile=//g'
-
-echo -e ""
-echo -e "4.0 - Update Tests"
-echo -e "=================================================================="
-
-echo -e ""
-echo -e "4.1 - update"
-echo -e "================================="
-echo -e "Description:"
-echo -e "check for updates."
-echo -e "Command: ./${gameservername} update"
-requiredstatus="STOPPED"
-fn_setstatus
-(
-	exec 5> "${TRAVIS_BUILD_DIR}/dev-debug.log"
-	BASH_XTRACEFD="5"
-	set -x
-	command_update.sh
-)
-fn_test_result_pass
-echo -e "run order"
-echo -e "================="
-grep modulefile= "${TRAVIS_BUILD_DIR}/dev-debug.log" | sed 's/modulefile=//g'
-
-echo -e ""
-echo -e "4.2 - update  - change buildid"
-echo -e "================================="
-echo -e "Description:"
-echo -e "change the buildid tricking SteamCMD to update."
-echo -e "Command: ./jc2server update"
-requiredstatus="STOPPED"
-fn_setstatus
-fn_print_info_nl "changed buildid to 0."
-sed -i 's/[0-9]\+/0/' "${serverfiles}/steamapps/appmanifest_${appid}.acf"
-(
-	exec 5> "${TRAVIS_BUILD_DIR}/dev-debug.log"
-	BASH_XTRACEFD="5"
-	set -x
-	command_update.sh
-)
-fn_test_result_pass
-echo -e "run order"
-echo -e "================="
-grep modulefile= "${TRAVIS_BUILD_DIR}/dev-debug.log" | sed 's/modulefile=//g'
-
-echo -e ""
-echo -e "4.3 - update  - change buildid - online"
-echo -e "================================="
-echo -e "Description:"
-echo -e "change the buildid tricking SteamCMD to update server while already running."
-echo -e "Command: ./jc2server update"
-requiredstatus="STARTED"
-fn_setstatus
-fn_print_info_nl "changed buildid to 0."
-sed -i 's/[0-9]\+/0/' "${serverfiles}/steamapps/appmanifest_${appid}.acf"
-(
-	exec 5> "${TRAVIS_BUILD_DIR}/dev-debug.log"
-	BASH_XTRACEFD="5"
-	set -x
-	command_update.sh
-)
-fn_test_result_pass
-echo -e "run order"
-echo -e "================="
-grep modulefile= "${TRAVIS_BUILD_DIR}/dev-debug.log" | sed 's/modulefile=//g'
-
-echo -e ""
-echo -e "4.4 - update  - remove appmanifest file"
-echo -e "================================="
-echo -e "Description:"
-echo -e "removing appmanifest file will cause script to repair."
-echo -e "Command: ./jc2server update"
-requiredstatus="STOPPED"
-fn_setstatus
-fn_print_info_nl "removed appmanifest_${appid}.acf."
-rm --verbose "${serverfiles:?}/steamapps/appmanifest_${appid}.acf"
-(
-	exec 5> "${TRAVIS_BUILD_DIR}/dev-debug.log"
-	BASH_XTRACEFD="5"
-	set -x
-	command_update.sh
-)
-fn_test_result_pass
-echo -e "run order"
-echo -e "================="
-grep modulefile= "${TRAVIS_BUILD_DIR}/dev-debug.log" | sed 's/modulefile=//g'
-
-echo -e ""
-echo -e "4.5 - force-update"
-echo -e "================================="
-echo -e "Description:"
-echo -e "force-update bypassing update check."
-echo -e "Command: ./jc2server force-update"
-requiredstatus="STOPPED"
-fn_setstatus
-(
-	exec 5> "${TRAVIS_BUILD_DIR}/dev-debug.log"
-	BASH_XTRACEFD="5"
-	set -x
-	forceupdate=1
-	command_update.sh
-)
-fn_test_result_pass
-echo -e "run order"
-echo -e "================="
-grep modulefile= "${TRAVIS_BUILD_DIR}/dev-debug.log" | sed 's/modulefile=//g'
-
-echo -e ""
-echo -e "4.6 - force-update - online"
-echo -e "================================="
-echo -e "Description:"
-echo -e "force-update bypassing update check server while already running."
-echo -e "Command: ./jc2server force-update"
-requiredstatus="STARTED"
-fn_setstatus
-(
-	exec 5> "${TRAVIS_BUILD_DIR}/dev-debug.log"
-	BASH_XTRACEFD="5"
-	set -x
-	forceupdate=1
-	command_update.sh
-)
-fn_test_result_pass
-echo -e "run order"
-echo -e "================="
-grep modulefile= "${TRAVIS_BUILD_DIR}/dev-debug.log" | sed 's/modulefile=//g'
-
-echo -e ""
-echo -e "4.7 - validate"
-echo -e "================================="
-echo -e "Description:"
-echo -e "validate server files."
-echo -e "Command: ./jc2server validate"
-requiredstatus="STOPPED"
-fn_setstatus
-(
-	exec 5> "${TRAVIS_BUILD_DIR}/dev-debug.log"
-	BASH_XTRACEFD="5"
-	set -x
-	command_validate.sh
-)
-fn_test_result_pass
-echo -e "run order"
-echo -e "================="
-grep modulefile= "${TRAVIS_BUILD_DIR}/dev-debug.log" | sed 's/modulefile=//g'
-
-echo -e ""
-echo -e "4.8 - validate - online"
-echo -e "================================="
-echo -e "Description:"
-echo -e "validate server files while server already running."
-echo -e ""
-echo -e "Command: ./jc2server validate"
-requiredstatus="STARTED"
-fn_setstatus
-(
-	exec 5> "${TRAVIS_BUILD_DIR}/dev-debug.log"
-	BASH_XTRACEFD="5"
-	set -x
-	command_validate.sh
-)
-fn_test_result_pass
-echo -e "run order"
-echo -e "================="
-grep modulefile= "${TRAVIS_BUILD_DIR}/dev-debug.log" | sed 's/modulefile=//g'
-
-echo -e ""
-echo -e "4.9 - update-lgsm"
-echo -e "================================="
-echo -e "Description:"
-echo -e "update LinuxGSM."
-echo -e ""
-echo -e "Command: ./jc2server update-lgam"
-requiredstatus="STARTED"
-fn_setstatus
-(
-	exec 5> "${TRAVIS_BUILD_DIR}/dev-debug.log"
-	BASH_XTRACEFD="5"
-	set -x
-	command_update_linuxgsm.sh
-)
-fn_test_result_pass
-echo -e "run order"
-echo -e "================="
-grep modulefile= "${TRAVIS_BUILD_DIR}/dev-debug.log" | sed 's/modulefile=//g'
-
-echo -e ""
-echo -e "Inserting IP address"
-echo -e "================================="
-echo -e "Description:"
-echo -e "Inserting Travis IP in to config."
-echo -e "Allows monitor to work"
-if [ "$(${ipcommand}-o -4 addr | grep eth0)" ]; then
-	travisip=$(${ipcommand}-o -4 addr | grep eth0 | awk '{print $4}' | grep -oe '\([0-9]\{1,3\}\.\?\)\{4\}' | grep -v 127.0.0)
-else
-	travisip=$(${ipcommand}-o -4 addr | grep ens | awk '{print $4}' | grep -oe '\([0-9]\{1,3\}\.\?\)\{4\}' | sort -u | grep -v 127.0.0)
-fi
-sed -i "/BindIP/c\BindIP                      = \"${travisip}\"," "${serverfiles}/config.lua"
-echo -e "IP: ${travisip}"
-
-echo -e ""
-echo -e "5.0 - Monitor Tests"
-echo -e "=================================================================="
-echo -e ""
-info_game.sh
-echo -e "Server IP - Port: ${ip}:${port}"
-echo -e "Server IP - Query Port: ${ip}:${queryport}"
-
-echo -e ""
-echo -e "5.1 - monitor - online"
-echo -e "================================="
-echo -e "Description:"
-echo -e "run monitor server while already running."
-echo -e "Command: ./${gameservername} monitor"
-requiredstatus="STARTED"
-fn_setstatus
-(
-	exec 5> "${TRAVIS_BUILD_DIR}/dev-debug.log"
-	BASH_XTRACEFD="5"
-	set -x
-	command_monitor.sh
-)
-fn_test_result_pass
-echo -e "run order"
-echo -e "================="
-grep modulefile= "${TRAVIS_BUILD_DIR}/dev-debug.log" | sed 's/modulefile=//g'
-
-echo -e ""
-echo -e "5.2 - monitor - offline - with lockfile"
-echo -e "================================="
-echo -e "Description:"
-echo -e "run monitor while server is offline with lockfile."
-echo -e "Command: ./${gameservername} monitor"
-requiredstatus="STOPPED"
-fn_setstatus
-fn_print_info_nl "creating lockfile."
-date '+%s' > "${lockdir}/${selfname}.lock"
-echo "${version}" >> "${lockdir}/${selfname}.lock"
-echo "${port}" >> "${lockdir}/${selfname}.lock"
-(
-	exec 5> "${TRAVIS_BUILD_DIR}/dev-debug.log"
-	BASH_XTRACEFD="5"
-	set -x
-	command_monitor.sh
-)
-fn_test_result_pass
-echo -e "run order"
-echo -e "================="
-grep modulefile= "${TRAVIS_BUILD_DIR}/dev-debug.log" | sed 's/modulefile=//g'
-
-echo -e ""
-echo -e "5.3 - monitor - offline - no lockfile"
-echo -e "================================="
-echo -e "Description:"
-echo -e "run monitor while server is offline with no lockfile."
-echo -e "Command: ./${gameservername} monitor"
-requiredstatus="STOPPED"
-fn_setstatus
-(
-	exec 5> "${TRAVIS_BUILD_DIR}/dev-debug.log"
-	BASH_XTRACEFD="5"
-	set -x
-	command_monitor.sh
-)
-fn_test_result_fail
-echo -e "run order"
-echo -e "================="
-grep modulefile= "${TRAVIS_BUILD_DIR}/dev-debug.log" | sed 's/modulefile=//g'
-
-echo -e ""
-echo -e "5.4 - test-alert"
-echo -e "================================="
-echo -e "Description:"
-echo -e "run monitor while server is offline with no lockfile."
-echo -e "Command: ./${gameservername} test-alert"
-requiredstatus="STOPPED"
-fn_setstatus
-cp "${servercfgfullpath}" "config.lua"
-sed -i 's/[0-9]\+/0/' "${servercfgfullpath}"
-(
-	exec 5> "${TRAVIS_BUILD_DIR}/dev-debug.log"
-	BASH_XTRACEFD="5"
-	set -x
-	command_test_alert.sh
-)
-fn_test_result_fail
-echo -e "run order"
-echo -e "================="
-grep modulefile= "${TRAVIS_BUILD_DIR}/dev-debug.log" | sed 's/modulefile=//g'
-
-echo -e ""
-fn_print_info_nl "Re-generating ${servercfg}."
-cp -v "config.lua" "${servercfgfullpath}"
-echo -e "================================="
-
-echo -e ""
-echo -e "6.0 - Details Tests"
-echo -e "=================================================================="
-
-echo -e ""
-echo -e "6.1 - details"
-echo -e "================================="
-echo -e "Description:"
-echo -e "display details."
-echo -e "Command: ./${gameservername} details"
-requiredstatus="STARTED"
-fn_setstatus
-(
-	exec 5> "${TRAVIS_BUILD_DIR}/dev-debug.log"
-	BASH_XTRACEFD="5"
-	set -x
-	command_details.sh
-)
-fn_test_result_pass
-echo -e "run order"
-echo -e "================="
-grep modulefile= "${TRAVIS_BUILD_DIR}/dev-debug.log" | sed 's/modulefile=//g'
-
-echo -e ""
-echo -e "6.2 - postdetails"
-echo -e "================================="
-echo -e "Description:"
-echo -e "post details."
-echo -e "Command: ./${gameservername} postdetails"
-requiredstatus="STARTED"
-fn_setstatus
-(
-	exec 5> "${TRAVIS_BUILD_DIR}/dev-debug.log"
-	BASH_XTRACEFD="5"
-	set -x
-	command_postdetails.sh
-)
-fn_test_result_pass
-echo -e "run order"
-echo -e "================="
-grep modulefile= "${TRAVIS_BUILD_DIR}/dev-debug.log" | sed 's/modulefile=//g'
-
-echo -e ""
-echo -e "7.0 - Backup Tests"
-echo -e "=================================================================="
-
-echo -e ""
-echo -e "7.1 - backup"
-echo -e "================================="
-echo -e "Description:"
-echo -e "run a backup."
-echo -e "Command: ./${gameservername} backup"
-requiredstatus="STARTED"
-fn_setstatus
-echo -e "test de-activated until issue #1839 fixed"
-#(command_backup.sh)
-fn_test_result_pass
-echo -e "run order"
-echo -e "================="
-grep modulefile= "${TRAVIS_BUILD_DIR}/dev-debug.log" | sed 's/modulefile=//g'
-
-echo -e ""
-echo -e "8.0 - Development Tools Tests"
-echo -e "=================================================================="
-
-echo -e ""
-echo -e "8.1 - dev - detect glibc"
-echo -e "================================="
-echo -e "Description:"
-echo -e "detect glibc."
-echo -e "Command: ./${gameservername} detect-glibc"
-requiredstatus="STARTED"
-fn_setstatus
-(
-	exec 5> "${TRAVIS_BUILD_DIR}/dev-debug.log"
-	BASH_XTRACEFD="5"
-	set -x
-	command_dev_detect_glibc.sh
-)
-fn_test_result_pass
-echo -e "run order"
-echo -e "================="
-grep modulefile= "${TRAVIS_BUILD_DIR}/dev-debug.log" | sed 's/modulefile=//g'
-
-echo -e ""
-echo -e "8.2 - dev - detect ldd"
-echo -e "================================="
-echo -e "Description:"
-echo -e "detect ldd."
-echo -e "Command: ./${gameservername} detect-ldd"
-requiredstatus="STARTED"
-fn_setstatus
-(
-	exec 5> "${TRAVIS_BUILD_DIR}/dev-debug.log"
-	BASH_XTRACEFD="5"
-	set -x
-	command_dev_detect_ldd.sh
-)
-fn_test_result_pass
-echo -e "run order"
-echo -e "================="
-grep modulefile= "${TRAVIS_BUILD_DIR}/dev-debug.log" | sed 's/modulefile=//g'
-
-echo -e ""
-echo -e "8.3 - dev - detect deps"
-echo -e "================================="
-echo -e "Description:"
-echo -e "detect dependencies."
-echo -e "Command: ./${gameservername} detect-deps"
-requiredstatus="STARTED"
-fn_setstatus
-(
-	exec 5> "${TRAVIS_BUILD_DIR}/dev-debug.log"
-	BASH_XTRACEFD="5"
-	set -x
-	command_dev_detect_deps.sh
-)
-fn_test_result_pass
-echo -e "run order"
-echo -e "================="
-grep modulefile= "${TRAVIS_BUILD_DIR}/dev-debug.log" | sed 's/modulefile=//g'
-
-echo -e ""
-echo -e "8.4 - dev - query-raw"
-echo -e "================================="
-echo -e "Description:"
-echo -e "raw query output."
-echo -e "Command: ./${gameservername} query-raw"
-requiredstatus="STARTED"
-fn_setstatus
-(
-	exec 5> "${TRAVIS_BUILD_DIR}/dev-debug.log"
-	BASH_XTRACEFD="5"
-	set -x
-	command_dev_query_raw.sh
-)
-fn_test_result_na
-echo -e "run order"
-echo -e "================="
-grep modulefile= "${TRAVIS_BUILD_DIR}/dev-debug.log" | sed 's/modulefile=//g'
-
-echo -e ""
-echo -e "9.0 - Sponsor"
-echo -e "=================================================================="
-
-echo -e ""
-echo -e "9.1 - sponsor"
-echo -e "================================="
-echo -e "Description:"
-echo -e "sponsor."
-echo -e "Command: ./${gameservername} sponsor"
-requiredstatus="STARTED"
-fn_setstatus
-(
-	exec 5> "${TRAVIS_BUILD_DIR}/dev-debug.log"
-	BASH_XTRACEFD="5"
-	set -x
-	command_sponsor.sh
-)
-fn_test_result_pass
-echo -e "run order"
-echo -e "================="
-grep modulefile= "${TRAVIS_BUILD_DIR}/dev-debug.log" | sed 's/modulefile=//g'
-
-echo -e ""
-echo -e "================================="
-echo -e "Server Tests - Complete!"
-echo -e "Using: ${gamename}"
-echo -e "================================="
-requiredstatus="STOPPED"
-fn_setstatus
-core_exit.sh
diff --git a/tests/tests_mcserver.sh b/tests/tests_mcserver.sh
deleted file mode 100644
index 3a40e9aa5..000000000
--- a/tests/tests_mcserver.sh
+++ /dev/null
@@ -1,1231 +0,0 @@
-#!/bin/bash
-# Project: Game Server Managers - LinuxGSM
-# Author: Daniel Gibbs
-# License: MIT License, Copyright (c) 2020 Daniel Gibbs
-# Purpose: Travis CI Tests: Minecraft | Linux Game Server Management Script
-# Contributors: https://linuxgsm.com/contrib
-# Documentation: https://docs.linuxgsm.com
-# Website: https://linuxgsm.com
-
-# DO NOT EDIT THIS FILE
-# LinuxGSM configuration is no longer edited here
-# To update your LinuxGSM config go to:
-# lgsm/config-lgsm
-# https://docs.linuxgsm.com/configuration/linuxgsm-config
-
-# Debugging
-if [ -f ".dev-debug" ]; then
-	exec 5> dev-debug.log
-	BASH_XTRACEFD="5"
-	set -x
-fi
-
-version="v23.5.3"
-shortname="mc"
-gameservername="mcserver"
-commandname="CORE"
-rootdir=$(dirname "$(readlink -f "${BASH_SOURCE[0]}")")
-selfname=$(basename "$(readlink -f "${BASH_SOURCE[0]}")")
-sessionname=$(echo "${selfname}" | cut -f1 -d".")
-lgsmdir="${rootdir}/lgsm"
-logdir="${rootdir}/log"
-lgsmlogdir="${logdir}/lgsm"
-steamcmddir="${HOME}/.steam/steamcmd"
-serverfiles="${rootdir}/serverfiles"
-modulesdir="${lgsmdir}/modules"
-tmpdir="${lgsmdir}/tmp"
-datadir="${lgsmdir}/data"
-lockdir="${lgsmdir}/lock"
-serverlist="${datadir}/serverlist.csv"
-serverlistmenu="${datadir}/serverlistmenu.csv"
-configdir="${lgsmdir}/config-lgsm"
-configdirserver="${configdir}/${gameservername}"
-configdirdefault="${lgsmdir}/config-default"
-userinput="${1}"
-
-# Allows for testing not on Travis CI.
-# if using travis for tests
-if [ -z "${TRAVIS}" ]; then
-	TRAVIS_BRANCH="develop"
-	TRAVIS_BUILD_DIR="${rootdir}"
-fi
-travistest="1"
-
-## GitHub Branch Select
-# Allows for the use of different module files
-# from a different repo and/or branch.
-githubuser="GameServerManagers"
-githubrepo="LinuxGSM"
-githubbranch="${TRAVIS_BRANCH}"
-
-# Core module that is required first.
-core_modules.sh() {
-	modulefile="${FUNCNAME[0]}"
-	fn_bootstrap_fetch_file_github "lgsm/modules" "core_modules.sh" "${modulesdir}" "chmodx" "run" "noforcedl" "nohash"
-}
-
-# Bootstrap
-# Fetches the core modules required before passed off to core_dl.sh.
-fn_bootstrap_fetch_file() {
-	remote_fileurl="${1}"
-	remote_fileurl_backup="${2}"
-	remote_fileurl_name="${3}"
-	remote_fileurl_backup_name="${4}"
-	local_filedir="${5}"
-	local_filename="${6}"
-	chmodx="${7:-0}"
-	run="${8:-0}"
-	forcedl="${9:-0}"
-	md5="${10:-0}"
-	# Download file if missing or download forced.
-	if [ ! -f "${local_filedir}/${local_filename}" ] || [ "${forcedl}" == "forcedl" ]; then
-		# If backup fileurl exists include it.
-		if [ -n "${remote_fileurl_backup}" ]; then
-			# counter set to 0 to allow second try
-			counter=0
-			remote_fileurls_array=(remote_fileurl remote_fileurl_backup)
-		else
-			# counter set to 1 to not allow second try
-			counter=1
-			remote_fileurls_array=(remote_fileurl)
-		fi
-
-		for remote_fileurl_array in "${remote_fileurls_array[@]}"; do
-			if [ "${remote_fileurl_array}" == "remote_fileurl" ]; then
-				fileurl="${remote_fileurl}"
-				fileurl_name="${remote_fileurl_name}"
-			elif [ "${remote_fileurl_array}" == "remote_fileurl_backup" ]; then
-				fileurl="${remote_fileurl_backup}"
-				fileurl_name="${remote_fileurl_backup_name}"
-			fi
-			counter=$((counter + 1))
-			if [ ! -d "${local_filedir}" ]; then
-				mkdir -p "${local_filedir}"
-			fi
-			# Trap will remove part downloaded files if canceled.
-			trap fn_fetch_trap INT
-			# Larger files show a progress bar.
-
-			echo -en "fetching ${fileurl_name} ${local_filename}...\c"
-			curlcmd=$(curl -s --fail -L -o "${local_filedir}/${local_filename}" "${fileurl}" 2>&1)
-
-			local exitcode=$?
-			# Download will fail if downloads a html file.
-			if [ -f "${local_filedir}/${local_filename}" ]; then
-				if [ -n "$(head "${local_filedir}/${local_filename}" | grep "DOCTYPE")" ]; then
-					rm -f "${local_filedir:?}/${local_filename:?}"
-					local exitcode=2
-				fi
-			fi
-
-			# On first try will error. On second try will fail.
-			if [ "${exitcode}" != 0 ]; then
-				if [ ${counter} -ge 2 ]; then
-					echo -e "FAIL"
-					if [ -f "${lgsmlog}" ]; then
-						fn_script_log_fail "Downloading ${local_filename}"
-						fn_script_log_fail "${fileurl}"
-					fi
-					core_exit.sh
-				else
-					echo -e "ERROR"
-					if [ -f "${lgsmlog}" ]; then
-						fn_script_log_error "Downloading ${local_filename}"
-						fn_script_log_error "${fileurl}"
-					fi
-				fi
-
-			else
-				echo -en "OK"
-				sleep 0.3
-				echo -en "\033[2K\\r"
-				if [ -f "${lgsmlog}" ]; then
-					fn_script_log_pass "Downloading ${local_filename}"
-				fi
-
-				# Make file executable if chmodx is set.
-				if [ "${chmodx}" == "chmodx" ]; then
-					chmod +x "${local_filedir}/${local_filename}"
-				fi
-
-				# Remove trap.
-				trap - INT
-
-				break
-			fi
-		done
-	fi
-
-	if [ -f "${local_filedir}/${local_filename}" ]; then
-		# Execute file if run is set.
-		if [ "${run}" == "run" ]; then
-			# shellcheck source=/dev/null
-			source "${local_filedir}/${local_filename}"
-		fi
-	fi
-}
-
-fn_bootstrap_fetch_file_github() {
-	github_file_url_dir="${1}"
-	github_file_url_name="${2}"
-	# If master branch will currently running LinuxGSM version to prevent "version mixing". This is ignored if a fork.
-	if [ "${githubbranch}" == "master" ] && [ "${githubuser}" == "GameServerManagers" ] && [ "${commandname}" != "UPDATE-LGSM" ]; then
-		remote_fileurl="https://raw.githubusercontent.com/${githubuser}/${githubrepo}/${version}/${github_file_url_dir}/${github_file_url_name}"
-		remote_fileurl_backup="https://bitbucket.org/${githubuser}/${githubrepo}/raw/${version}/${github_file_url_dir}/${github_file_url_name}"
-	else
-		remote_fileurl="https://raw.githubusercontent.com/${githubuser}/${githubrepo}/${githubbranch}/${github_file_url_dir}/${github_file_url_name}"
-		remote_fileurl_backup="https://bitbucket.org/${githubuser}/${githubrepo}/raw/${githubbranch}/${github_file_url_dir}/${github_file_url_name}"
-	fi
-	remote_fileurl_name="GitHub"
-	remote_fileurl_backup_name="Bitbucket"
-	local_filedir="${3}"
-	local_filename="${github_file_url_name}"
-	chmodx="${4:-0}"
-	run="${5:-0}"
-	forcedl="${6:-0}"
-	md5="${7:-0}"
-	# Passes vars to the file download module.
-	fn_bootstrap_fetch_file "${remote_fileurl}" "${remote_fileurl_backup}" "${remote_fileurl_name}" "${remote_fileurl_backup_name}" "${local_filedir}" "${local_filename}" "${chmodx}" "${run}" "${forcedl}" "${md5}"
-}
-
-# Installer menu.
-
-fn_print_center() {
-	columns=$(tput cols)
-	line="$*"
-	printf "%*s\n" $(((${#line} + columns) / 2)) "${line}"
-}
-
-fn_print_horizontal() {
-	printf '%*s\n' "${COLUMNS:-$(tput cols)}" '' | tr ' ' "="
-}
-
-# Bash menu.
-fn_install_menu_bash() {
-	local resultvar=$1
-	title=$2
-	caption=$3
-	options=$4
-	fn_print_horizontal
-	fn_print_center "${title}"
-	fn_print_center "${caption}"
-	fn_print_horizontal
-	menu_options=()
-	while read -r line || [[ -n "${line}" ]]; do
-		var=$(echo -e "${line}" | awk -F "," '{print $2 " - " $3}')
-		menu_options+=("${var}")
-	done < "${options}"
-	menu_options+=("Cancel")
-	select option in "${menu_options[@]}"; do
-		if [ "${option}" ] && [ "${option}" != "Cancel" ]; then
-			eval "$resultvar=\"${option/%\ */}\""
-		fi
-		break
-	done
-}
-
-# Whiptail/Dialog menu.
-fn_install_menu_whiptail() {
-	local menucmd=$1
-	local resultvar=$2
-	title=$3
-	caption=$4
-	options=$5
-	height=${6:-40}
-	width=${7:-80}
-	menuheight=${8:-30}
-	IFS=","
-	menu_options=()
-	while read -r line; do
-		key=$(echo -e "${line}" | awk -F "," '{print $3}')
-		val=$(echo -e "${line}" | awk -F "," '{print $2}')
-		menu_options+=("${val//\"/}" "${key//\"/}")
-	done < "${options}"
-	OPTION=$(${menucmd} --title "${title}" --menu "${caption}" "${height}" "${width}" "${menuheight}" "${menu_options[@]}" 3>&1 1>&2 2>&3)
-	if [ $? == 0 ]; then
-		eval "$resultvar=\"${OPTION}\""
-	else
-		eval "$resultvar="
-	fi
-}
-
-# Menu selector.
-fn_install_menu() {
-	local resultvar=$1
-	local selection=""
-	title=$2
-	caption=$3
-	options=$4
-	# Get menu command.
-	for menucmd in whiptail dialog bash; do
-		if [ "$(command -v "${menucmd}")" ]; then
-			menucmd=$(command -v "${menucmd}")
-			break
-		fi
-	done
-	case "$(basename "${menucmd}")" in
-		whiptail | dialog)
-			fn_install_menu_whiptail "${menucmd}" selection "${title}" "${caption}" "${options}" 40 80 30
-			;;
-		*)
-			fn_install_menu_bash selection "${title}" "${caption}" "${options}"
-			;;
-	esac
-	eval "$resultvar=\"${selection}\""
-}
-
-# Gets server info from serverlist.csv and puts in to array.
-fn_server_info() {
-	IFS=","
-	server_info_array=($(grep -aw "${userinput}" "${serverlist}"))
-	shortname="${server_info_array[0]}"      # csgo
-	gameservername="${server_info_array[1]}" # csgoserver
-	gamename="${server_info_array[2]}"       # Counter Strike: Global Offensive
-}
-
-fn_install_getopt() {
-	userinput="empty"
-	echo -e "Usage: $0 [option]"
-	echo -e ""
-	echo -e "Installer - Linux Game Server Managers - Version ${version}"
-	echo -e "https://linuxgsm.com"
-	echo -e ""
-	echo -e "Commands"
-	echo -e "install\t\t| Select server to install."
-	echo -e "servername\t| Enter name of game server to install. e.g $0 csgoserver."
-	echo -e "list\t\t| List all servers available for install."
-	exit
-}
-
-fn_install_file() {
-	local_filename="${gameservername}"
-	if [ -e "${local_filename}" ]; then
-		i=2
-		while [ -e "${local_filename}-${i}" ]; do
-			((i++))
-		done
-		local_filename="${local_filename}-${i}"
-	fi
-	cp -R "${selfname}" "${local_filename}"
-	sed -i -e "s/shortname=\"core\"/shortname=\"${shortname}\"/g" "${local_filename}"
-	sed -i -e "s/gameservername=\"core\"/gameservername=\"${gameservername}\"/g" "${local_filename}"
-	echo -e "Installed ${gamename} server as ${local_filename}"
-	echo -e ""
-	if [ ! -d "${serverfiles}" ]; then
-		echo -e "./${local_filename} install"
-	else
-		echo -e "Remember to check server ports"
-		echo -e "./${local_filename} details"
-	fi
-	echo -e ""
-	exit
-}
-
-# Prevent LinuxGSM from running as root. Except if doing a dependency install.
-if [ "$(whoami)" == "root" ]; then
-	if [ "${userinput}" == "install" ] || [ "${userinput}" == "auto-install" ] || [ "${userinput}" == "i" ] || [ "${userinput}" == "ai" ]; then
-		if [ "${shortname}" == "core" ]; then
-			echo -e "[ FAIL ] Do NOT run this script as root!"
-			exit 1
-		fi
-	elif [ ! -f "${modulesdir}/core_modules.sh" ] || [ ! -f "${modulesdir}/check_root.sh" ] || [ ! -f "${modulesdir}/core_messages.sh" ]; then
-		echo -e "[ FAIL ] Do NOT run this script as root!"
-		exit 1
-	else
-		core_modules.sh
-		check_root.sh
-	fi
-fi
-
-# LinuxGSM installer mode.
-if [ "${shortname}" == "core" ]; then
-	# Download the latest serverlist. This is the complete list of all supported servers.
-	fn_bootstrap_fetch_file_github "lgsm/data" "serverlist.csv" "${datadir}" "nochmodx" "norun" "forcedl" "nohash"
-	if [ ! -f "${serverlist}" ]; then
-		echo -e "[ FAIL ] serverlist.csv could not be loaded."
-		exit 1
-	fi
-
-	if [ "${userinput}" == "list" ] || [ "${userinput}" == "l" ]; then
-		{
-			tail -n +2 "${serverlist}" | awk -F "," '{print $2 "\t" $3}'
-		} | column -s $'\t' -t | more
-		exit
-	elif [ "${userinput}" == "install" ] || [ "${userinput}" == "i" ]; then
-		tail -n +2 "${serverlist}" | awk -F "," '{print $1 "," $2 "," $3}' > "${serverlistmenu}"
-		fn_install_menu result "LinuxGSM" "Select game server to install." "${serverlistmenu}"
-		userinput="${result}"
-		fn_server_info
-		if [ "${result}" == "${gameservername}" ]; then
-			fn_install_file
-		elif [ "${result}" == "" ]; then
-			echo -e "Install canceled"
-		else
-			echo -e "[ FAIL ] menu result does not match gameservername"
-			echo -e "result: ${result}"
-			echo -e "gameservername: ${gameservername}"
-		fi
-	elif [ "${userinput}" ]; then
-		fn_server_info
-		if [ "${userinput}" == "${gameservername}" ] || [ "${userinput}" == "${gamename}" ] || [ "${userinput}" == "${shortname}" ]; then
-			fn_install_file
-		else
-			echo -e "[ FAIL ] Unknown game server"
-		fi
-	else
-		fn_install_getopt
-	fi
-
-# LinuxGSM server mode.
-else
-	core_modules.sh
-	if [ "${shortname}" != "core-dep" ]; then
-		# Load LinuxGSM configs.
-		# These are required to get all the default variables for the specific server.
-		# Load the default config. If missing download it. If changed reload it.
-		if [ ! -f "${configdirdefault}/config-lgsm/${gameservername}/_default.cfg" ]; then
-			mkdir -p "${configdirdefault}/config-lgsm/${gameservername}"
-			fn_fetch_config "lgsm/config-default/config-lgsm/${gameservername}" "_default.cfg" "${configdirdefault}/config-lgsm/${gameservername}" "_default.cfg" "nochmodx" "norun" "noforcedl" "nohash"
-		fi
-		if [ ! -f "${configdirserver}/_default.cfg" ]; then
-			mkdir -p "${configdirserver}"
-			echo -en "copying _default.cfg...\c"
-			cp -R "${configdirdefault}/config-lgsm/${gameservername}/_default.cfg" "${configdirserver}/_default.cfg"
-			exitcode=$?
-			if [ "${exitcode}" != 0 ]; then
-				echo -e "FAIL"
-				exit 1
-			else
-				echo -e "OK"
-			fi
-		else
-			module_file_diff=$(diff -q "${configdirdefault}/config-lgsm/${gameservername}/_default.cfg" "${configdirserver}/_default.cfg")
-			if [ "${module_file_diff}" != "" ]; then
-				fn_print_warn_nl "_default.cfg has been altered. reloading config."
-				echo -en "copying _default.cfg...\c"
-				cp -R "${configdirdefault}/config-lgsm/${gameservername}/_default.cfg" "${configdirserver}/_default.cfg"
-				exitcode=$?
-				if [ "${exitcode}" != 0 ]; then
-					echo -e "FAIL"
-					exit 1
-				else
-					echo -e "OK"
-				fi
-			fi
-		fi
-		# shellcheck source=/dev/null
-		source "${configdirserver}/_default.cfg"
-		# Load the common.cfg config. If missing download it.
-		if [ ! -f "${configdirserver}/common.cfg" ]; then
-			fn_fetch_config "lgsm/config-default/config-lgsm" "common-template.cfg" "${configdirserver}" "common.cfg" "${chmodx}" "nochmodx" "norun" "noforcedl" "nohash"
-			# shellcheck source=/dev/null
-			source "${configdirserver}/common.cfg"
-		else
-			# shellcheck source=/dev/null
-			source "${configdirserver}/common.cfg"
-		fi
-		# Load the secrets-common.cfg config. If missing download it.
-		if [ ! -f "${configdirserver}/secrets-common.cfg" ]; then
-			fn_fetch_config "lgsm/config-default/config-lgsm" "secrets-common.cfg" "${configdirserver}" "secrets-common.cfg" "${chmodx}" "nochmodx" "norun" "noforcedl" "nohash"
-			# shellcheck source=/dev/null
-			source "${configdirserver}/secrets-common.cfg"
-		else
-			# shellcheck source=/dev/null
-			source "${configdirserver}/secrets-common.cfg"
-		fi
-		# Load the instance.cfg config. If missing download it.
-		if [ ! -f "${configdirserver}/${selfname}.cfg" ]; then
-			fn_fetch_config "lgsm/config-default/config-lgsm" "instance-template.cfg" "${configdirserver}" "${selfname}.cfg" "nochmodx" "norun" "noforcedl" "nohash"
-			# shellcheck source=/dev/null
-			source "${configdirserver}/${selfname}.cfg"
-		else
-			# shellcheck source=/dev/null
-			source "${configdirserver}/${selfname}.cfg"
-		fi
-		# Load the secrets-instance.cfg config. If missing download it.
-		if [ ! -f "${configdirserver}/secrets-${selfname}.cfg" ]; then
-			fn_fetch_config "lgsm/config-default/config-lgsm" "secrets-instance-template.cfg" "${configdirserver}" "secrets-${selfname}.cfg" "nochmodx" "norun" "noforcedl" "nohash"
-			# shellcheck source=/dev/null
-			source "${configdirserver}/secrets-${selfname}.cfg"
-		else
-			# shellcheck source=/dev/null
-			source "${configdirserver}/secrets-${selfname}.cfg"
-		fi
-
-		# Load the linuxgsm.sh in to tmpdir. If missing download it.
-		if [ ! -f "${tmpdir}/linuxgsm.sh" ]; then
-			fn_fetch_file_github "" "linuxgsm.sh" "${tmpdir}" "chmodx" "norun" "noforcedl" "nohash"
-		fi
-	fi
-	# Enables ANSI colours from core_messages.sh. Can be disabled with ansi=off.
-	fn_ansi_loader
-	# Prevents running of core_exit.sh for Travis-CI.
-	if [ "${travistest}" != "1" ]; then
-		getopt=$1
-		core_getopt.sh
-	fi
-fi
-
-fn_currentstatus_tmux() {
-	check_status.sh
-	if [ "${status}" != "0" ]; then
-		currentstatus="STARTED"
-	else
-		currentstatus="STOPPED"
-	fi
-}
-
-fn_setstatus() {
-	fn_currentstatus_tmux
-	echo""
-	echo -e "Required status: ${requiredstatus}"
-	counter=0
-	echo -e "Current status:  ${currentstatus}"
-	while [ "${requiredstatus}" != "${currentstatus}" ]; do
-		counter=$((counter + 1))
-		fn_currentstatus_tmux
-		echo -en "New status:  ${currentstatus}\\r"
-
-		if [ "${requiredstatus}" == "STARTED" ]; then
-			(command_start.sh > /dev/null 2>&1)
-		else
-			(command_stop.sh > /dev/null 2>&1)
-		fi
-		if [ "${counter}" -gt "5" ]; then
-			currentstatus="FAIL"
-			echo -e "Current status:  ${currentstatus}"
-			echo -e ""
-			echo -e "Unable to start or stop server."
-			exit 1
-		fi
-	done
-	echo -en "New status:  ${currentstatus}\\r"
-	echo -e "\n"
-	echo -e "Test starting:"
-	echo -e ""
-}
-
-# End of every test will expect the result to either pass or fail
-# If the script does not do as intended the whole test will fail
-# if expecting a pass
-fn_test_result_pass() {
-	if [ $? != 0 ]; then
-		echo -e "================================="
-		echo -e "Expected result: PASS"
-		echo -e "Actual result: FAIL"
-		fn_print_fail_nl "TEST FAILED"
-		exitcode=1
-		core_exit.sh
-	else
-		echo -e "================================="
-		echo -e "Expected result: PASS"
-		echo -e "Actual result: PASS"
-		fn_print_ok_nl "TEST PASSED"
-		echo -e ""
-	fi
-}
-
-# if expecting a fail
-fn_test_result_fail() {
-	if [ $? == 0 ]; then
-		echo -e "================================="
-		echo -e "Expected result: FAIL"
-		echo -e "Actual result: PASS"
-		fn_print_fail_nl "TEST FAILED"
-		exitcode=1
-		core_exit.sh
-	else
-		echo -e "================================="
-		echo -e "Expected result: FAIL"
-		echo -e "Actual result: FAIL"
-		fn_print_ok_nl "TEST PASSED"
-		echo -e ""
-	fi
-}
-
-# test result n/a
-fn_test_result_na() {
-	echo -e "================================="
-	echo -e "Expected result: N/A"
-	echo -e "Actual result: N/A"
-	fn_print_fail_nl "TEST N/A"
-}
-
-sleeptime="0"
-
-echo -e "================================="
-echo -e "Travis CI Tests"
-echo -e "Linux Game Server Manager"
-echo -e "by Daniel Gibbs"
-echo -e "Contributors: http://goo.gl/qLmitD"
-echo -e "https://linuxgsm.com"
-echo -e "================================="
-echo -e ""
-echo -e "================================="
-echo -e "Server Tests"
-echo -e "Using: ${gamename}"
-echo -e "Testing Branch: ${TRAVIS_BRANCH}"
-echo -e "================================="
-echo -e ""
-echo -e "Tests Summary"
-echo -e "================================="
-echo -e "0.0 - Pre-test Tasks"
-echo -e "0.1 - Create log dir's"
-echo -e "0.2 - Enable dev-debug"
-echo -e ""
-echo -e "1.0 - Pre-install tests"
-echo -e "1.1 - start - no files"
-echo -e "1.2 - getopt"
-echo -e "1.3 - getopt with incorrect args"
-echo -e ""
-echo -e "2.0 - Installation"
-echo -e "2.1 - install"
-echo -e ""
-echo -e "3.0 - Start/Stop/Restart Tests"
-echo -e "3.1 - start"
-echo -e "3.2 - start - online"
-echo -e "3.3 - start - updateonstart"
-echo -e "3.4 - stop"
-echo -e "3.5 - stop - offline"
-echo -e "3.6 - restart"
-echo -e "3.7 - restart - offline"
-echo -e ""
-echo -e "4.0 - Update Tests"
-echo -e "4.1 - update"
-echo -e "4.2 - update-lgsm"
-echo -e ""
-echo -e "5.0 - Monitor Tests"
-echo -e "5.1 - monitor - online"
-echo -e "5.2 - monitor - offline - with lockfile"
-echo -e "5.3 - monitor - offline - no lockfile"
-echo -e "5.4 - test-alert"
-echo -e ""
-echo -e "6.0 - Details Tests"
-echo -e "6.1 - details"
-echo -e "6.2 - postdetails"
-echo -e ""
-echo -e "7.0 - Backup Tests"
-echo -e "7.1 - backup"
-echo -e ""
-echo -e "8.0 - Development Tools Tests"
-echo -e "8.1 - dev - detect glibc"
-echo -e "8.2 - dev - detect ldd"
-echo -e "8.3 - dev - detect deps"
-echo -e "8.4 - dev - query-raw"
-echo -e ""
-echo -e "9.0 - Sponsor"
-echo -e "9.1 - sponsor"
-
-echo -e ""
-echo -e "0.0 - Pre-test Tasks"
-echo -e "=================================================================="
-echo -e "Description:"
-echo -e "Create log dir's"
-echo -e ""
-
-echo -e ""
-echo -e "0.1 - Create log dir's"
-echo -e "================================="
-echo -e ""
-(
-	exec 5> "${TRAVIS_BUILD_DIR}/dev-debug.log"
-	BASH_XTRACEFD="5"
-	set -x
-	install_logs.sh
-)
-echo -e "run order"
-echo -e "================="
-grep modulefile= "${TRAVIS_BUILD_DIR}/dev-debug.log" | sed 's/modulefile=//g'
-
-echo -e ""
-echo -e "0.2 - Enable dev-debug"
-echo -e "================================="
-echo -e "Description:"
-echo -e "Enable dev-debug"
-echo -e ""
-(
-	exec 5> "${TRAVIS_BUILD_DIR}/dev-debug.log"
-	BASH_XTRACEFD="5"
-	set -x
-	command_dev_debug.sh
-)
-fn_test_result_pass
-echo -e "run order"
-echo -e "================="
-grep modulefile= "${TRAVIS_BUILD_DIR}/dev-debug.log" | sed 's/modulefile=//g'
-
-echo -e ""
-echo -e "1.0 - Pre-install tests"
-echo -e "=================================================================="
-echo -e ""
-
-echo -e "1.1 - start - no files"
-echo -e "================================="
-echo -e "Description:"
-echo -e "test script reaction to missing server files."
-echo -e "Command: ./${gameservername} start"
-echo -e ""
-# Allows for testing not on Travis CI
-if [ -z "${TRAVIS}" ]; then
-	(
-		exec 5> "${TRAVIS_BUILD_DIR}/dev-debug.log"
-		BASH_XTRACEFD="5"
-		set -x
-		command_start.sh
-	)
-	fn_test_result_fail
-else
-	echo -e "Test bypassed"
-fi
-
-echo -e "run order"
-echo -e "================="
-grep modulefile= "${TRAVIS_BUILD_DIR}/dev-debug.log" | sed 's/modulefile=//g'
-
-echo -e ""
-echo -e "1.2 - getopt"
-echo -e "================================="
-echo -e "Description:"
-echo -e "displaying options messages."
-echo -e "Command: ./${gameservername}"
-echo -e ""
-(
-	exec 5> "${TRAVIS_BUILD_DIR}/dev-debug.log"
-	BASH_XTRACEFD="5"
-	set -x
-	core_getopt.sh
-)
-fn_test_result_pass
-echo -e "run order"
-echo -e "================="
-grep modulefile= "${TRAVIS_BUILD_DIR}/dev-debug.log" | sed 's/modulefile=//g'
-
-echo -e ""
-echo -e "1.3 - getopt with incorrect args"
-echo -e "================================="
-echo -e "Description:"
-echo -e "displaying options messages."
-echo -e "Command: ./${gameservername} abc123"
-echo -e ""
-getopt="abc123"
-(
-	exec 5> "${TRAVIS_BUILD_DIR}/dev-debug.log"
-	BASH_XTRACEFD="5"
-	set -x
-	core_getopt.sh
-)
-fn_test_result_pass
-echo -e "run order"
-echo -e "================="
-grep modulefile= "${TRAVIS_BUILD_DIR}/dev-debug.log" | sed 's/modulefile=//g'
-
-echo -e ""
-echo -e "2.0 - Installation"
-echo -e "=================================================================="
-
-echo -e ""
-echo -e "2.1 - install"
-echo -e "================================="
-echo -e "Description:"
-echo -e "install ${gamename} server."
-echo -e "Command: ./${gameservername} auto-install"
-(
-	exec 5> "${TRAVIS_BUILD_DIR}/dev-debug.log"
-	BASH_XTRACEFD="5"
-	set -x
-	fn_autoinstall
-)
-fn_test_result_pass
-echo -e "run order"
-echo -e "================="
-grep modulefile= "${TRAVIS_BUILD_DIR}/dev-debug.log" | sed 's/modulefile=//g'
-
-echo -e ""
-echo -e "3.0 - Start/Stop/Restart Tests"
-echo -e "=================================================================="
-
-echo -e ""
-echo -e "3.1 - start"
-echo -e "================================="
-echo -e "Description:"
-echo -e "start ${gamename} server."
-echo -e "Command: ./${gameservername} start"
-requiredstatus="STOPPED"
-fn_setstatus
-(
-	exec 5> "${TRAVIS_BUILD_DIR}/dev-debug.log"
-	BASH_XTRACEFD="5"
-	set -x
-	command_start.sh
-)
-fn_test_result_pass
-echo -e "run order"
-echo -e "================="
-grep modulefile= "${TRAVIS_BUILD_DIR}/dev-debug.log" | sed 's/modulefile=//g'
-
-echo -e ""
-echo -e "3.2 - start - online"
-echo -e "================================="
-echo -e "Description:"
-echo -e "start ${gamename} server while already running."
-echo -e "Command: ./${gameservername} start"
-requiredstatus="STARTED"
-fn_setstatus
-(
-	exec 5> "${TRAVIS_BUILD_DIR}/dev-debug.log"
-	BASH_XTRACEFD="5"
-	set -x
-	command_start.sh
-)
-fn_test_result_fail
-echo -e "run order"
-echo -e "================="
-grep modulefile= "${TRAVIS_BUILD_DIR}/dev-debug.log" | sed 's/modulefile=//g'
-
-echo -e ""
-echo -e "3.3 - start - updateonstart"
-echo -e "================================="
-echo -e "Description:"
-echo -e "will update server on start."
-echo -e "Command: ./${gameservername} start"
-requiredstatus="STOPPED"
-fn_setstatus
-(
-	exec 5> "${TRAVIS_BUILD_DIR}/dev-debug.log"
-	BASH_XTRACEFD="5"
-	set -x
-	updateonstart="on"
-	command_start.sh
-)
-fn_test_result_pass
-echo -e "run order"
-echo -e "================="
-grep modulefile= "${TRAVIS_BUILD_DIR}/dev-debug.log" | sed 's/modulefile=//g'
-echo -e ""
-echo -e "30s Pause"
-echo -e "================================="
-echo -e "Description:"
-echo -e "give time for server to fully start."
-echo -e "Command: sleep 30"
-requiredstatus="STARTED"
-fn_setstatus
-sleep 30
-
-echo -e ""
-echo -e "3.4 - stop"
-echo -e "================================="
-echo -e "Description:"
-echo -e "stop ${gamename} server."
-echo -e "Command: ./${gameservername} stop"
-requiredstatus="STARTED"
-fn_setstatus
-(
-	exec 5> "${TRAVIS_BUILD_DIR}/dev-debug.log"
-	BASH_XTRACEFD="5"
-	set -x
-	command_stop.sh
-)
-fn_test_result_pass
-echo -e "run order"
-echo -e "================="
-grep modulefile= "${TRAVIS_BUILD_DIR}/dev-debug.log" | sed 's/modulefile=//g'
-
-echo -e ""
-echo -e "3.5 - stop - offline"
-echo -e "================================="
-echo -e "Description:"
-echo -e "stop ${gamename} server while already stopped."
-echo -e "Command: ./${gameservername} stop"
-requiredstatus="STOPPED"
-fn_setstatus
-(
-	exec 5> "${TRAVIS_BUILD_DIR}/dev-debug.log"
-	BASH_XTRACEFD="5"
-	set -x
-	command_stop.sh
-)
-fn_test_result_fail
-echo -e "run order"
-echo -e "================="
-grep modulefile= "${TRAVIS_BUILD_DIR}/dev-debug.log" | sed 's/modulefile=//g'
-
-echo -e ""
-echo -e "3.6 - restart"
-echo -e "================================="
-echo -e "Description:"
-echo -e "restart ${gamename}."
-echo -e "Command: ./${gameservername} restart"
-requiredstatus="STARTED"
-fn_setstatus
-(
-	exec 5> "${TRAVIS_BUILD_DIR}/dev-debug.log"
-	BASH_XTRACEFD="5"
-	set -x
-	command_restart.sh
-)
-fn_test_result_pass
-echo -e "run order"
-echo -e "================="
-grep modulefile= "${TRAVIS_BUILD_DIR}/dev-debug.log" | sed 's/modulefile=//g'
-
-echo -e ""
-echo -e "3.7 - restart - offline"
-echo -e "================================="
-echo -e "Description:"
-echo -e "restart ${gamename} while already stopped."
-echo -e "Command: ./${gameservername} restart"
-requiredstatus="STOPPED"
-fn_setstatus
-(
-	exec 5> "${TRAVIS_BUILD_DIR}/dev-debug.log"
-	BASH_XTRACEFD="5"
-	set -x
-	command_restart.sh
-)
-fn_test_result_pass
-echo -e "run order"
-echo -e "================="
-grep modulefile= "${TRAVIS_BUILD_DIR}/dev-debug.log" | sed 's/modulefile=//g'
-
-echo -e ""
-echo -e "4.0 - Update Tests"
-echo -e "=================================================================="
-
-echo -e ""
-echo -e "4.1 - update"
-echo -e "================================="
-echo -e "Description:"
-echo -e "check for updates."
-echo -e "Command: ./${gameservername} update"
-requiredstatus="STOPPED"
-fn_setstatus
-(
-	exec 5> "${TRAVIS_BUILD_DIR}/dev-debug.log"
-	BASH_XTRACEFD="5"
-	set -x
-	command_update.sh
-)
-fn_test_result_pass
-echo -e "run order"
-echo -e "================="
-grep modulefile= "${TRAVIS_BUILD_DIR}/dev-debug.log" | sed 's/modulefile=//g'
-
-echo -e ""
-echo -e "4.2 - update-lgsm"
-echo -e "================================="
-echo -e "Description:"
-echo -e "update LinuxGSM."
-echo -e ""
-echo -e "Command: ./jc2server update-lgam"
-requiredstatus="STARTED"
-fn_setstatus
-(
-	exec 5> "${TRAVIS_BUILD_DIR}/dev-debug.log"
-	BASH_XTRACEFD="5"
-	set -x
-	command_update_linuxgsm.sh
-)
-fn_test_result_pass
-echo -e "run order"
-echo -e "================="
-grep modulefile= "${TRAVIS_BUILD_DIR}/dev-debug.log" | sed 's/modulefile=//g'
-
-echo -e ""
-echo -e "Inserting IP address"
-echo -e "================================="
-echo -e "Description:"
-echo -e "Inserting Travis IP in to config."
-echo -e "Allows monitor to work"
-if [ "$(${ipcommand}-o -4 addr | grep eth0)" ]; then
-	travisip=$(${ipcommand}-o -4 addr | grep eth0 | awk '{print $4}' | grep -oe '\([0-9]\{1,3\}\.\?\)\{4\}' | grep -v 127.0.0)
-else
-	travisip=$(${ipcommand}-o -4 addr | grep ens | awk '{print $4}' | grep -oe '\([0-9]\{1,3\}\.\?\)\{4\}' | sort -u | grep -v 127.0.0)
-fi
-sed -i "/server-ip=/c\server-ip=${travisip}" "${serverfiles}/server.properties"
-echo -e "IP: ${travisip}"
-
-echo -e ""
-echo -e "5.0 - Monitor Tests"
-echo -e "=================================================================="
-echo -e ""
-info_game.sh
-echo -e "Server IP - Port: ${ip}:${port}"
-echo -e "Server IP - Query Port: ${ip}:${queryport}"
-
-echo -e ""
-echo -e "30s Pause"
-echo -e "================================="
-echo -e "Description:"
-echo -e "give time for server to fully start."
-echo -e "Command: sleep 30"
-requiredstatus="STARTED"
-fn_setstatus
-sleep 30
-
-echo -e ""
-echo -e "5.1 - monitor - online"
-echo -e "================================="
-echo -e "Description:"
-echo -e "run monitor server while already running."
-echo -e "Command: ./${gameservername} monitor"
-requiredstatus="STARTED"
-fn_setstatus
-(
-	exec 5> "${TRAVIS_BUILD_DIR}/dev-debug.log"
-	BASH_XTRACEFD="5"
-	set -x
-	command_monitor.sh
-)
-fn_test_result_pass
-echo -e "run order"
-echo -e "================="
-grep modulefile= "${TRAVIS_BUILD_DIR}/dev-debug.log" | sed 's/modulefile=//g'
-
-echo -e ""
-echo -e "5.2 - monitor - offline - with lockfile"
-echo -e "================================="
-echo -e "Description:"
-echo -e "run monitor while server is offline with lockfile."
-echo -e "Command: ./${gameservername} monitor"
-requiredstatus="STOPPED"
-fn_setstatus
-fn_print_info_nl "creating lockfile."
-date '+%s' > "${lockdir}/${selfname}.lock"
-echo "${version}" >> "${lockdir}/${selfname}.lock"
-echo "${port}" >> "${lockdir}/${selfname}.lock"
-(
-	exec 5> "${TRAVIS_BUILD_DIR}/dev-debug.log"
-	BASH_XTRACEFD="5"
-	set -x
-	command_monitor.sh
-)
-fn_test_result_pass
-echo -e "run order"
-echo -e "================="
-grep modulefile= "${TRAVIS_BUILD_DIR}/dev-debug.log" | sed 's/modulefile=//g'
-
-echo -e ""
-echo -e "5.3 - monitor - offline - no lockfile"
-echo -e "================================="
-echo -e "Description:"
-echo -e "run monitor while server is offline with no lockfile."
-echo -e "Command: ./${gameservername} monitor"
-requiredstatus="STOPPED"
-fn_setstatus
-(
-	exec 5> "${TRAVIS_BUILD_DIR}/dev-debug.log"
-	BASH_XTRACEFD="5"
-	set -x
-	command_monitor.sh
-)
-fn_test_result_fail
-echo -e "run order"
-echo -e "================="
-grep modulefile= "${TRAVIS_BUILD_DIR}/dev-debug.log" | sed 's/modulefile=//g'
-
-echo -e ""
-echo -e "5.4 - test-alert"
-echo -e "================================="
-echo -e "Description:"
-echo -e "run monitor while server is offline with no lockfile."
-echo -e "Command: ./${gameservername} test-alert"
-requiredstatus="STOPPED"
-fn_setstatus
-(
-	exec 5> "${TRAVIS_BUILD_DIR}/dev-debug.log"
-	BASH_XTRACEFD="5"
-	set -x
-	command_test_alert.sh
-)
-fn_test_result_fail
-echo -e "run order"
-echo -e "================="
-grep modulefile= "${TRAVIS_BUILD_DIR}/dev-debug.log" | sed 's/modulefile=//g'
-
-echo -e ""
-echo -e "6.0 - Details Tests"
-echo -e "=================================================================="
-
-echo -e ""
-echo -e "6.1 - details"
-echo -e "================================="
-echo -e "Description:"
-echo -e "display details."
-echo -e "Command: ./${gameservername} details"
-requiredstatus="STARTED"
-fn_setstatus
-(
-	exec 5> "${TRAVIS_BUILD_DIR}/dev-debug.log"
-	BASH_XTRACEFD="5"
-	set -x
-	command_details.sh
-)
-fn_test_result_pass
-echo -e "run order"
-echo -e "================="
-grep modulefile= "${TRAVIS_BUILD_DIR}/dev-debug.log" | sed 's/modulefile=//g'
-
-echo -e ""
-echo -e "6.2 - postdetails"
-echo -e "================================="
-echo -e "Description:"
-echo -e "post details."
-echo -e "Command: ./${gameservername} postdetails"
-requiredstatus="STARTED"
-fn_setstatus
-(
-	exec 5> "${TRAVIS_BUILD_DIR}/dev-debug.log"
-	BASH_XTRACEFD="5"
-	set -x
-	command_postdetails.sh
-)
-fn_test_result_pass
-echo -e "run order"
-echo -e "================="
-grep modulefile= "${TRAVIS_BUILD_DIR}/dev-debug.log" | sed 's/modulefile=//g'
-
-echo -e ""
-echo -e "7.0 - Backup Tests"
-echo -e "=================================================================="
-
-echo -e ""
-echo -e "7.1 - backup"
-echo -e "================================="
-echo -e "Description:"
-echo -e "run a backup."
-echo -e "Command: ./${gameservername} backup"
-requiredstatus="STARTED"
-fn_setstatus
-echo -e "test de-activated until issue #1839 fixed"
-#(command_backup.sh)
-fn_test_result_pass
-echo -e "run order"
-echo -e "================="
-grep modulefile= "${TRAVIS_BUILD_DIR}/dev-debug.log" | sed 's/modulefile=//g'
-
-echo -e ""
-echo -e "8.0 - Development Tools Tests"
-echo -e "=================================================================="
-
-echo -e ""
-echo -e "8.1 - dev - detect glibc"
-echo -e "================================="
-echo -e "Description:"
-echo -e "detect glibc."
-echo -e "Command: ./${gameservername} detect-glibc"
-requiredstatus="STARTED"
-fn_setstatus
-(
-	exec 5> "${TRAVIS_BUILD_DIR}/dev-debug.log"
-	BASH_XTRACEFD="5"
-	set -x
-	command_dev_detect_glibc.sh
-)
-fn_test_result_pass
-echo -e "run order"
-echo -e "================="
-grep modulefile= "${TRAVIS_BUILD_DIR}/dev-debug.log" | sed 's/modulefile=//g'
-
-echo -e ""
-echo -e "8.2 - dev - detect ldd"
-echo -e "================================="
-echo -e "Description:"
-echo -e "detect ldd."
-echo -e "Command: ./${gameservername} detect-ldd"
-requiredstatus="STARTED"
-fn_setstatus
-(
-	exec 5> "${TRAVIS_BUILD_DIR}/dev-debug.log"
-	BASH_XTRACEFD="5"
-	set -x
-	command_dev_detect_ldd.sh
-)
-fn_test_result_pass
-echo -e "run order"
-echo -e "================="
-grep modulefile= "${TRAVIS_BUILD_DIR}/dev-debug.log" | sed 's/modulefile=//g'
-
-echo -e ""
-echo -e "8.3 - dev - detect deps"
-echo -e "================================="
-echo -e "Description:"
-echo -e "detect dependencies."
-echo -e "Command: ./${gameservername} detect-deps"
-requiredstatus="STARTED"
-fn_setstatus
-(
-	exec 5> "${TRAVIS_BUILD_DIR}/dev-debug.log"
-	BASH_XTRACEFD="5"
-	set -x
-	command_dev_detect_deps.sh
-)
-fn_test_result_pass
-echo -e "run order"
-echo -e "================="
-grep modulefile= "${TRAVIS_BUILD_DIR}/dev-debug.log" | sed 's/modulefile=//g'
-
-echo -e ""
-echo -e "Inserting IP address"
-echo -e "================================="
-echo -e "Description:"
-echo -e "Inserting Travis IP in to config."
-echo -e "Allows monitor to work"
-if [ "$(${ipcommand}-o -4 addr | grep eth0)" ]; then
-	travisip=$(${ipcommand}-o -4 addr | grep eth0 | awk '{print $4}' | grep -oe '\([0-9]\{1,3\}\.\?\)\{4\}' | grep -v 127.0.0)
-else
-	travisip=$(${ipcommand}-o -4 addr | grep ens | awk '{print $4}' | grep -oe '\([0-9]\{1,3\}\.\?\)\{4\}' | sort -u | grep -v 127.0.0)
-fi
-sed -i "/server-ip=/c\server-ip=${travisip}" "${serverfiles}/server.properties"
-echo -e "IP: ${travisip}"
-
-echo -e ""
-echo -e "8.4 - dev - query-raw"
-echo -e "================================="
-echo -e "Description:"
-echo -e "raw query output."
-echo -e "Command: ./${gameservername} query-raw"
-requiredstatus="STARTED"
-fn_setstatus
-(
-	exec 5> "${TRAVIS_BUILD_DIR}/dev-debug.log"
-	BASH_XTRACEFD="5"
-	set -x
-	command_dev_query_raw.sh
-)
-fn_test_result_na
-echo -e "run order"
-echo -e "================="
-grep modulefile= "${TRAVIS_BUILD_DIR}/dev-debug.log" | sed 's/modulefile=//g'
-
-echo -e ""
-echo -e "9.0 - Sponsor"
-echo -e "=================================================================="
-
-echo -e ""
-echo -e "9.1 - sponsor"
-echo -e "================================="
-echo -e "Description:"
-echo -e "sponsor."
-echo -e "Command: ./${gameservername} sponsor"
-requiredstatus="STARTED"
-fn_setstatus
-(
-	exec 5> "${TRAVIS_BUILD_DIR}/dev-debug.log"
-	BASH_XTRACEFD="5"
-	set -x
-	command_sponsor.sh
-)
-fn_test_result_pass
-echo -e "run order"
-echo -e "================="
-grep modulefile= "${TRAVIS_BUILD_DIR}/dev-debug.log" | sed 's/modulefile=//g'
-
-echo -e ""
-echo -e "================================="
-echo -e "Server Tests - Complete!"
-echo -e "Using: ${gamename}"
-echo -e "================================="
-requiredstatus="STOPPED"
-fn_setstatus
-
-core_exit.sh
diff --git a/tests/tests_ts3server.sh b/tests/tests_ts3server.sh
deleted file mode 100644
index 3fcb8ae24..000000000
--- a/tests/tests_ts3server.sh
+++ /dev/null
@@ -1,1184 +0,0 @@
-#!/bin/bash
-# Project: Game Server Managers - LinuxGSM
-# Author: Daniel Gibbs
-# License: MIT License, Copyright (c) 2020 Daniel Gibbs
-# Purpose: Travis CI Tests: Teamspeak 3 | Linux Game Server Management Script
-# Contributors: https://linuxgsm.com/contrib
-# Documentation: https://docs.linuxgsm.com
-# Website: https://linuxgsm.com
-
-# DO NOT EDIT THIS FILE
-# LinuxGSM configuration is no longer edited here
-# To update your LinuxGSM config go to:
-# lgsm/config-lgsm
-# https://docs.linuxgsm.com/configuration/linuxgsm-config
-
-# Debugging
-if [ -f ".dev-debug" ]; then
-	exec 5> dev-debug.log
-	BASH_XTRACEFD="5"
-	set -x
-fi
-
-version="v23.5.3"
-shortname="ts3"
-gameservername="ts3server"
-commandname="CORE"
-rootdir=$(dirname "$(readlink -f "${BASH_SOURCE[0]}")")
-selfname=$(basename "$(readlink -f "${BASH_SOURCE[0]}")")
-sessionname=$(echo "${selfname}" | cut -f1 -d".")
-lgsmdir="${rootdir}/lgsm"
-logdir="${rootdir}/log"
-lgsmlogdir="${logdir}/lgsm"
-steamcmddir="${HOME}/.steam/steamcmd"
-serverfiles="${rootdir}/serverfiles"
-modulesdir="${lgsmdir}/modules"
-tmpdir="${lgsmdir}/tmp"
-datadir="${lgsmdir}/data"
-lockdir="${lgsmdir}/lock"
-serverlist="${datadir}/serverlist.csv"
-serverlistmenu="${datadir}/serverlistmenu.csv"
-configdir="${lgsmdir}/config-lgsm"
-configdirserver="${configdir}/${gameservername}"
-configdirdefault="${lgsmdir}/config-default"
-userinput="${1}"
-
-# Allows for testing not on Travis CI.
-# if using travis for tests
-if [ -z "${TRAVIS}" ]; then
-	TRAVIS_BRANCH="develop"
-	TRAVIS_BUILD_DIR="${rootdir}"
-fi
-travistest="1"
-
-## GitHub Branch Select
-# Allows for the use of different module files
-# from a different repo and/or branch.
-githubuser="GameServerManagers"
-githubrepo="LinuxGSM"
-githubbranch="${TRAVIS_BRANCH}"
-
-# Core module that is required first.
-core_modules.sh() {
-	modulefile="${FUNCNAME[0]}"
-	fn_bootstrap_fetch_file_github "lgsm/modules" "core_modules.sh" "${modulesdir}" "chmodx" "run" "noforcedl" "nohash"
-}
-
-# Bootstrap
-# Fetches the core modules required before passed off to core_dl.sh.
-fn_bootstrap_fetch_file() {
-	remote_fileurl="${1}"
-	remote_fileurl_backup="${2}"
-	remote_fileurl_name="${3}"
-	remote_fileurl_backup_name="${4}"
-	local_filedir="${5}"
-	local_filename="${6}"
-	chmodx="${7:-0}"
-	run="${8:-0}"
-	forcedl="${9:-0}"
-	md5="${10:-0}"
-	# Download file if missing or download forced.
-	if [ ! -f "${local_filedir}/${local_filename}" ] || [ "${forcedl}" == "forcedl" ]; then
-		# If backup fileurl exists include it.
-		if [ -n "${remote_fileurl_backup}" ]; then
-			# counter set to 0 to allow second try
-			counter=0
-			remote_fileurls_array=(remote_fileurl remote_fileurl_backup)
-		else
-			# counter set to 1 to not allow second try
-			counter=1
-			remote_fileurls_array=(remote_fileurl)
-		fi
-
-		for remote_fileurl_array in "${remote_fileurls_array[@]}"; do
-			if [ "${remote_fileurl_array}" == "remote_fileurl" ]; then
-				fileurl="${remote_fileurl}"
-				fileurl_name="${remote_fileurl_name}"
-			elif [ "${remote_fileurl_array}" == "remote_fileurl_backup" ]; then
-				fileurl="${remote_fileurl_backup}"
-				fileurl_name="${remote_fileurl_backup_name}"
-			fi
-			counter=$((counter + 1))
-			if [ ! -d "${local_filedir}" ]; then
-				mkdir -p "${local_filedir}"
-			fi
-			# Trap will remove part downloaded files if canceled.
-			trap fn_fetch_trap INT
-			# Larger files show a progress bar.
-
-			echo -en "fetching ${fileurl_name} ${local_filename}...\c"
-			curlcmd=$(curl -s --fail -L -o "${local_filedir}/${local_filename}" "${fileurl}" 2>&1)
-
-			local exitcode=$?
-			# Download will fail if downloads a html file.
-			if [ -f "${local_filedir}/${local_filename}" ]; then
-				if [ -n "$(head "${local_filedir}/${local_filename}" | grep "DOCTYPE")" ]; then
-					rm -f "${local_filedir:?}/${local_filename:?}"
-					local exitcode=2
-				fi
-			fi
-
-			# On first try will error. On second try will fail.
-			if [ "${exitcode}" != 0 ]; then
-				if [ ${counter} -ge 2 ]; then
-					echo -e "FAIL"
-					if [ -f "${lgsmlog}" ]; then
-						fn_script_log_fail "Downloading ${local_filename}"
-						fn_script_log_fail "${fileurl}"
-					fi
-					core_exit.sh
-				else
-					echo -e "ERROR"
-					if [ -f "${lgsmlog}" ]; then
-						fn_script_log_error "Downloading ${local_filename}"
-						fn_script_log_error "${fileurl}"
-					fi
-				fi
-
-			else
-				echo -en "OK"
-				sleep 0.3
-				echo -en "\033[2K\\r"
-				if [ -f "${lgsmlog}" ]; then
-					fn_script_log_pass "Downloading ${local_filename}"
-				fi
-
-				# Make file executable if chmodx is set.
-				if [ "${chmodx}" == "chmodx" ]; then
-					chmod +x "${local_filedir}/${local_filename}"
-				fi
-
-				# Remove trap.
-				trap - INT
-
-				break
-			fi
-		done
-	fi
-
-	if [ -f "${local_filedir}/${local_filename}" ]; then
-		# Execute file if run is set.
-		if [ "${run}" == "run" ]; then
-			# shellcheck source=/dev/null
-			source "${local_filedir}/${local_filename}"
-		fi
-	fi
-}
-
-fn_bootstrap_fetch_file_github() {
-	github_file_url_dir="${1}"
-	github_file_url_name="${2}"
-	# If master branch will currently running LinuxGSM version to prevent "version mixing". This is ignored if a fork.
-	if [ "${githubbranch}" == "master" ] && [ "${githubuser}" == "GameServerManagers" ] && [ "${commandname}" != "UPDATE-LGSM" ]; then
-		remote_fileurl="https://raw.githubusercontent.com/${githubuser}/${githubrepo}/${version}/${github_file_url_dir}/${github_file_url_name}"
-		remote_fileurl_backup="https://bitbucket.org/${githubuser}/${githubrepo}/raw/${version}/${github_file_url_dir}/${github_file_url_name}"
-	else
-		remote_fileurl="https://raw.githubusercontent.com/${githubuser}/${githubrepo}/${githubbranch}/${github_file_url_dir}/${github_file_url_name}"
-		remote_fileurl_backup="https://bitbucket.org/${githubuser}/${githubrepo}/raw/${githubbranch}/${github_file_url_dir}/${github_file_url_name}"
-	fi
-	remote_fileurl_name="GitHub"
-	remote_fileurl_backup_name="Bitbucket"
-	local_filedir="${3}"
-	local_filename="${github_file_url_name}"
-	chmodx="${4:-0}"
-	run="${5:-0}"
-	forcedl="${6:-0}"
-	md5="${7:-0}"
-	# Passes vars to the file download module.
-	fn_bootstrap_fetch_file "${remote_fileurl}" "${remote_fileurl_backup}" "${remote_fileurl_name}" "${remote_fileurl_backup_name}" "${local_filedir}" "${local_filename}" "${chmodx}" "${run}" "${forcedl}" "${md5}"
-}
-
-# Installer menu.
-
-fn_print_center() {
-	columns=$(tput cols)
-	line="$*"
-	printf "%*s\n" $(((${#line} + columns) / 2)) "${line}"
-}
-
-fn_print_horizontal() {
-	printf '%*s\n' "${COLUMNS:-$(tput cols)}" '' | tr ' ' "="
-}
-
-# Bash menu.
-fn_install_menu_bash() {
-	local resultvar=$1
-	title=$2
-	caption=$3
-	options=$4
-	fn_print_horizontal
-	fn_print_center "${title}"
-	fn_print_center "${caption}"
-	fn_print_horizontal
-	menu_options=()
-	while read -r line || [[ -n "${line}" ]]; do
-		var=$(echo -e "${line}" | awk -F "," '{print $2 " - " $3}')
-		menu_options+=("${var}")
-	done < "${options}"
-	menu_options+=("Cancel")
-	select option in "${menu_options[@]}"; do
-		if [ "${option}" ] && [ "${option}" != "Cancel" ]; then
-			eval "$resultvar=\"${option/%\ */}\""
-		fi
-		break
-	done
-}
-
-# Whiptail/Dialog menu.
-fn_install_menu_whiptail() {
-	local menucmd=$1
-	local resultvar=$2
-	title=$3
-	caption=$4
-	options=$5
-	height=${6:-40}
-	width=${7:-80}
-	menuheight=${8:-30}
-	IFS=","
-	menu_options=()
-	while read -r line; do
-		key=$(echo -e "${line}" | awk -F "," '{print $3}')
-		val=$(echo -e "${line}" | awk -F "," '{print $2}')
-		menu_options+=("${val//\"/}" "${key//\"/}")
-	done < "${options}"
-	OPTION=$(${menucmd} --title "${title}" --menu "${caption}" "${height}" "${width}" "${menuheight}" "${menu_options[@]}" 3>&1 1>&2 2>&3)
-	if [ $? == 0 ]; then
-		eval "$resultvar=\"${OPTION}\""
-	else
-		eval "$resultvar="
-	fi
-}
-
-# Menu selector.
-fn_install_menu() {
-	local resultvar=$1
-	local selection=""
-	title=$2
-	caption=$3
-	options=$4
-	# Get menu command.
-	for menucmd in whiptail dialog bash; do
-		if [ "$(command -v "${menucmd}")" ]; then
-			menucmd=$(command -v "${menucmd}")
-			break
-		fi
-	done
-	case "$(basename "${menucmd}")" in
-		whiptail | dialog)
-			fn_install_menu_whiptail "${menucmd}" selection "${title}" "${caption}" "${options}" 40 80 30
-			;;
-		*)
-			fn_install_menu_bash selection "${title}" "${caption}" "${options}"
-			;;
-	esac
-	eval "$resultvar=\"${selection}\""
-}
-
-# Gets server info from serverlist.csv and puts in to array.
-fn_server_info() {
-	IFS=","
-	server_info_array=($(grep -aw "${userinput}" "${serverlist}"))
-	shortname="${server_info_array[0]}"      # csgo
-	gameservername="${server_info_array[1]}" # csgoserver
-	gamename="${server_info_array[2]}"       # Counter Strike: Global Offensive
-}
-
-fn_install_getopt() {
-	userinput="empty"
-	echo -e "Usage: $0 [option]"
-	echo -e ""
-	echo -e "Installer - Linux Game Server Managers - Version ${version}"
-	echo -e "https://linuxgsm.com"
-	echo -e ""
-	echo -e "Commands"
-	echo -e "install\t\t| Select server to install."
-	echo -e "servername\t| Enter name of game server to install. e.g $0 csgoserver."
-	echo -e "list\t\t| List all servers available for install."
-	exit
-}
-
-fn_install_file() {
-	local_filename="${gameservername}"
-	if [ -e "${local_filename}" ]; then
-		i=2
-		while [ -e "${local_filename}-${i}" ]; do
-			((i++))
-		done
-		local_filename="${local_filename}-${i}"
-	fi
-	cp -R "${selfname}" "${local_filename}"
-	sed -i -e "s/shortname=\"core\"/shortname=\"${shortname}\"/g" "${local_filename}"
-	sed -i -e "s/gameservername=\"core\"/gameservername=\"${gameservername}\"/g" "${local_filename}"
-	echo -e "Installed ${gamename} server as ${local_filename}"
-	echo -e ""
-	if [ ! -d "${serverfiles}" ]; then
-		echo -e "./${local_filename} install"
-	else
-		echo -e "Remember to check server ports"
-		echo -e "./${local_filename} details"
-	fi
-	echo -e ""
-	exit
-}
-
-# Prevent LinuxGSM from running as root. Except if doing a dependency install.
-if [ "$(whoami)" == "root" ]; then
-	if [ "${userinput}" == "install" ] || [ "${userinput}" == "auto-install" ] || [ "${userinput}" == "i" ] || [ "${userinput}" == "ai" ]; then
-		if [ "${shortname}" == "core" ]; then
-			echo -e "[ FAIL ] Do NOT run this script as root!"
-			exit 1
-		fi
-	elif [ ! -f "${modulesdir}/core_modules.sh" ] || [ ! -f "${modulesdir}/check_root.sh" ] || [ ! -f "${modulesdir}/core_messages.sh" ]; then
-		echo -e "[ FAIL ] Do NOT run this script as root!"
-		exit 1
-	else
-		core_modules.sh
-		check_root.sh
-	fi
-fi
-
-# LinuxGSM installer mode.
-if [ "${shortname}" == "core" ]; then
-	# Download the latest serverlist. This is the complete list of all supported servers.
-	fn_bootstrap_fetch_file_github "lgsm/data" "serverlist.csv" "${datadir}" "nochmodx" "norun" "forcedl" "nohash"
-	if [ ! -f "${serverlist}" ]; then
-		echo -e "[ FAIL ] serverlist.csv could not be loaded."
-		exit 1
-	fi
-
-	if [ "${userinput}" == "list" ] || [ "${userinput}" == "l" ]; then
-		{
-			tail -n +2 "${serverlist}" | awk -F "," '{print $2 "\t" $3}'
-		} | column -s $'\t' -t | more
-		exit
-	elif [ "${userinput}" == "install" ] || [ "${userinput}" == "i" ]; then
-		tail -n +2 "${serverlist}" | awk -F "," '{print $1 "," $2 "," $3}' > "${serverlistmenu}"
-		fn_install_menu result "LinuxGSM" "Select game server to install." "${serverlistmenu}"
-		userinput="${result}"
-		fn_server_info
-		if [ "${result}" == "${gameservername}" ]; then
-			fn_install_file
-		elif [ "${result}" == "" ]; then
-			echo -e "Install canceled"
-		else
-			echo -e "[ FAIL ] menu result does not match gameservername"
-			echo -e "result: ${result}"
-			echo -e "gameservername: ${gameservername}"
-		fi
-	elif [ "${userinput}" ]; then
-		fn_server_info
-		if [ "${userinput}" == "${gameservername}" ] || [ "${userinput}" == "${gamename}" ] || [ "${userinput}" == "${shortname}" ]; then
-			fn_install_file
-		else
-			echo -e "[ FAIL ] Unknown game server"
-		fi
-	else
-		fn_install_getopt
-	fi
-
-# LinuxGSM server mode.
-else
-	core_modules.sh
-	if [ "${shortname}" != "core-dep" ]; then
-		# Load LinuxGSM configs.
-		# These are required to get all the default variables for the specific server.
-		# Load the default config. If missing download it. If changed reload it.
-		if [ ! -f "${configdirdefault}/config-lgsm/${gameservername}/_default.cfg" ]; then
-			mkdir -p "${configdirdefault}/config-lgsm/${gameservername}"
-			fn_fetch_config "lgsm/config-default/config-lgsm/${gameservername}" "_default.cfg" "${configdirdefault}/config-lgsm/${gameservername}" "_default.cfg" "nochmodx" "norun" "noforcedl" "nohash"
-		fi
-		if [ ! -f "${configdirserver}/_default.cfg" ]; then
-			mkdir -p "${configdirserver}"
-			echo -en "copying _default.cfg...\c"
-			cp -R "${configdirdefault}/config-lgsm/${gameservername}/_default.cfg" "${configdirserver}/_default.cfg"
-			exitcode=$?
-			if [ "${exitcode}" != 0 ]; then
-				echo -e "FAIL"
-				exit 1
-			else
-				echo -e "OK"
-			fi
-		else
-			module_file_diff=$(diff -q "${configdirdefault}/config-lgsm/${gameservername}/_default.cfg" "${configdirserver}/_default.cfg")
-			if [ "${module_file_diff}" != "" ]; then
-				fn_print_warn_nl "_default.cfg has been altered. reloading config."
-				echo -en "copying _default.cfg...\c"
-				cp -R "${configdirdefault}/config-lgsm/${gameservername}/_default.cfg" "${configdirserver}/_default.cfg"
-				exitcode=$?
-				if [ "${exitcode}" != 0 ]; then
-					echo -e "FAIL"
-					exit 1
-				else
-					echo -e "OK"
-				fi
-			fi
-		fi
-		# shellcheck source=/dev/null
-		source "${configdirserver}/_default.cfg"
-		# Load the common.cfg config. If missing download it.
-		if [ ! -f "${configdirserver}/common.cfg" ]; then
-			fn_fetch_config "lgsm/config-default/config-lgsm" "common-template.cfg" "${configdirserver}" "common.cfg" "${chmodx}" "nochmodx" "norun" "noforcedl" "nohash"
-			# shellcheck source=/dev/null
-			source "${configdirserver}/common.cfg"
-		else
-			# shellcheck source=/dev/null
-			source "${configdirserver}/common.cfg"
-		fi
-		# Load the secrets-common.cfg config. If missing download it.
-		if [ ! -f "${configdirserver}/secrets-common.cfg" ]; then
-			fn_fetch_config "lgsm/config-default/config-lgsm" "secrets-common-template.cfg" "${configdirserver}" "secrets-common.cfg" "${chmodx}" "nochmodx" "norun" "noforcedl" "nohash"
-			# shellcheck source=/dev/null
-			source "${configdirserver}/secrets-common.cfg"
-		else
-			# shellcheck source=/dev/null
-			source "${configdirserver}/secrets-common.cfg"
-		fi
-		# Load the instance.cfg config. If missing download it.
-		if [ ! -f "${configdirserver}/${selfname}.cfg" ]; then
-			fn_fetch_config "lgsm/config-default/config-lgsm" "instance-template.cfg" "${configdirserver}" "${selfname}.cfg" "nochmodx" "norun" "noforcedl" "nohash"
-			# shellcheck source=/dev/null
-			source "${configdirserver}/${selfname}.cfg"
-		else
-			# shellcheck source=/dev/null
-			source "${configdirserver}/${selfname}.cfg"
-		fi
-		# Load the secrets-instance.cfg config. If missing download it.
-		if [ ! -f "${configdirserver}/secrets-${selfname}.cfg" ]; then
-			fn_fetch_config "lgsm/config-default/config-lgsm" "secrets-instance-template.cfg" "${configdirserver}" "secrets-${selfname}.cfg" "nochmodx" "norun" "noforcedl" "nohash"
-			# shellcheck source=/dev/null
-			source "${configdirserver}/secrets-${selfname}.cfg"
-		else
-			# shellcheck source=/dev/null
-			source "${configdirserver}/secrets-${selfname}.cfg"
-		fi
-
-		# Load the linuxgsm.sh in to tmpdir. If missing download it.
-		if [ ! -f "${tmpdir}/linuxgsm.sh" ]; then
-			fn_fetch_file_github "" "linuxgsm.sh" "${tmpdir}" "chmodx" "norun" "noforcedl" "nohash"
-		fi
-	fi
-	# Enables ANSI colours from core_messages.sh. Can be disabled with ansi=off.
-	fn_ansi_loader
-	# Prevents running of core_exit.sh for Travis-CI.
-	if [ "${travistest}" != "1" ]; then
-		getopt=$1
-		core_getopt.sh
-	fi
-fi
-
-fn_currentstatus_tmux() {
-	check_status.sh
-	if [ "${status}" != "0" ]; then
-		currentstatus="STARTED"
-	else
-		currentstatus="STOPPED"
-	fi
-}
-
-fn_setstatus() {
-	fn_currentstatus_tmux
-	echo""
-	echo -e "Required status: ${requiredstatus}"
-	counter=0
-	echo -e "Current status:  ${currentstatus}"
-	while [ "${requiredstatus}" != "${currentstatus}" ]; do
-		counter=$((counter + 1))
-		fn_currentstatus_tmux
-		echo -en "New status:  ${currentstatus}\\r"
-
-		if [ "${requiredstatus}" == "STARTED" ]; then
-			(command_start.sh > /dev/null 2>&1)
-		else
-			(command_stop.sh > /dev/null 2>&1)
-		fi
-		if [ "${counter}" -gt "5" ]; then
-			currentstatus="FAIL"
-			echo -e "Current status:  ${currentstatus}"
-			echo -e ""
-			echo -e "Unable to start or stop server."
-			exit 1
-		fi
-	done
-	echo -en "New status:  ${currentstatus}\\r"
-	echo -e "\n"
-	echo -e "Test starting:"
-	echo -e ""
-}
-
-# End of every test will expect the result to either pass or fail
-# If the script does not do as intended the whole test will fail
-# if expecting a pass
-fn_test_result_pass() {
-	if [ $? != 0 ]; then
-		echo -e "================================="
-		echo -e "Expected result: PASS"
-		echo -e "Actual result: FAIL"
-		fn_print_fail_nl "TEST FAILED"
-		exitcode=1
-		core_exit.sh
-	else
-		echo -e "================================="
-		echo -e "Expected result: PASS"
-		echo -e "Actual result: PASS"
-		fn_print_ok_nl "TEST PASSED"
-		echo -e ""
-	fi
-}
-
-# if expecting a fail
-fn_test_result_fail() {
-	if [ $? == 0 ]; then
-		echo -e "================================="
-		echo -e "Expected result: FAIL"
-		echo -e "Actual result: PASS"
-		fn_print_fail_nl "TEST FAILED"
-		exitcode=1
-		core_exit.sh
-	else
-		echo -e "================================="
-		echo -e "Expected result: FAIL"
-		echo -e "Actual result: FAIL"
-		fn_print_ok_nl "TEST PASSED"
-		echo -e ""
-	fi
-}
-
-# test result n/a
-fn_test_result_na() {
-	echo -e "================================="
-	echo -e "Expected result: N/A"
-	echo -e "Actual result: N/A"
-	fn_print_fail_nl "TEST N/A"
-}
-
-sleeptime="0"
-
-echo -e "================================="
-echo -e "Travis CI Tests"
-echo -e "Linux Game Server Manager"
-echo -e "by Daniel Gibbs"
-echo -e "Contributors: http://goo.gl/qLmitD"
-echo -e "https://linuxgsm.com"
-echo -e "================================="
-echo -e ""
-echo -e "================================="
-echo -e "Server Tests"
-echo -e "Using: ${gamename}"
-echo -e "Testing Branch: ${TRAVIS_BRANCH}"
-echo -e "================================="
-
-echo -e ""
-echo -e "Tests Summary"
-echo -e "================================="
-echo -e "0.0 - Pre-test Tasks"
-echo -e "0.1 - Create log dir's"
-echo -e "0.2 - Enable dev-debug"
-echo -e ""
-echo -e "1.0 - Pre-install tests"
-echo -e "1.1 - start - no files"
-echo -e "1.2 - getopt"
-echo -e "1.3 - getopt with incorrect args"
-echo -e ""
-echo -e "2.0 - Installation"
-echo -e "2.1 - install"
-echo -e ""
-echo -e "3.0 - Start/Stop/Restart Tests"
-echo -e "3.1 - start"
-echo -e "3.2 - start - online"
-echo -e "3.3 - start - updateonstart"
-echo -e "3.4 - stop"
-echo -e "3.5 - stop - offline"
-echo -e "3.6 - restart"
-echo -e "3.7 - restart - offline"
-echo -e ""
-echo -e "4.0 - Update Tests"
-echo -e "4.1 - update"
-echo -e "4.2 - update-lgsm"
-echo -e ""
-echo -e "5.0 - Monitor Tests"
-echo -e "5.1 - monitor - online"
-echo -e "5.2 - monitor - offline - with lockfile"
-echo -e "5.3 - monitor - offline - no lockfile"
-echo -e "5.4 - test-alert"
-echo -e ""
-echo -e "6.0 - Details Tests"
-echo -e "6.1 - details"
-echo -e "6.2 - postdetails"
-echo -e ""
-echo -e "7.0 - Backup Tests"
-echo -e "7.1 - backup"
-echo -e ""
-echo -e "8.0 - Development Tools Tests"
-echo -e "8.1 - dev - detect glibc"
-echo -e "8.2 - dev - detect ldd"
-echo -e "8.3 - dev - detect deps"
-echo -e "8.4 - dev - query-raw"
-echo -e ""
-echo -e "9.0 - Sponsor"
-echo -e "9.1 - sponsor"
-echo -e ""
-echo -e "0.0 - Pre-test Tasks"
-echo -e "=================================================================="
-echo -e "Description:"
-echo -e "Create log dir's"
-echo -e ""
-
-echo -e ""
-echo -e "0.1 - Create log dir's"
-echo -e "================================="
-echo -e ""
-(
-	exec 5> "${TRAVIS_BUILD_DIR}/dev-debug.log"
-	BASH_XTRACEFD="5"
-	set -x
-	install_logs.sh
-)
-echo -e "run order"
-echo -e "================="
-grep modulefile= "${TRAVIS_BUILD_DIR}/dev-debug.log" | sed 's/modulefile=//g'
-
-echo -e ""
-echo -e "0.2 - Enable dev-debug"
-echo -e "================================="
-echo -e "Description:"
-echo -e "Enable dev-debug"
-echo -e ""
-(
-	exec 5> "${TRAVIS_BUILD_DIR}/dev-debug.log"
-	BASH_XTRACEFD="5"
-	set -x
-	command_dev_debug.sh
-)
-fn_test_result_pass
-echo -e "run order"
-echo -e "================="
-grep modulefile= "${TRAVIS_BUILD_DIR}/dev-debug.log" | sed 's/modulefile=//g'
-
-echo -e ""
-echo -e "1.0 - Pre-install tests"
-echo -e "=================================================================="
-echo -e ""
-
-echo -e "1.1 - start - no files"
-echo -e "================================="
-echo -e "Description:"
-echo -e "test script reaction to missing server files."
-echo -e "Command: ./${gameservername} start"
-echo -e ""
-# Allows for testing not on Travis CI
-if [ -z "${TRAVIS}" ]; then
-	(
-		exec 5> "${TRAVIS_BUILD_DIR}/dev-debug.log"
-		BASH_XTRACEFD="5"
-		set -x
-		command_start.sh
-	)
-	fn_test_result_fail
-else
-	echo -e "Test bypassed"
-fi
-
-echo -e "run order"
-echo -e "================="
-grep modulefile= "${TRAVIS_BUILD_DIR}/dev-debug.log" | sed 's/modulefile=//g'
-
-echo -e ""
-echo -e "1.2 - getopt"
-echo -e "================================="
-echo -e "Description:"
-echo -e "displaying options messages."
-echo -e "Command: ./${gameservername}"
-echo -e ""
-(
-	exec 5> "${TRAVIS_BUILD_DIR}/dev-debug.log"
-	BASH_XTRACEFD="5"
-	set -x
-	core_getopt.sh
-)
-fn_test_result_pass
-echo -e "run order"
-echo -e "================="
-grep modulefile= "${TRAVIS_BUILD_DIR}/dev-debug.log" | sed 's/modulefile=//g'
-
-echo -e ""
-echo -e "1.3 - getopt with incorrect args"
-echo -e "================================="
-echo -e "Description:"
-echo -e "displaying options messages."
-echo -e "Command: ./${gameservername} abc123"
-echo -e ""
-getopt="abc123"
-(
-	exec 5> "${TRAVIS_BUILD_DIR}/dev-debug.log"
-	BASH_XTRACEFD="5"
-	set -x
-	core_getopt.sh
-)
-fn_test_result_pass
-echo -e "run order"
-echo -e "================="
-grep modulefile= "${TRAVIS_BUILD_DIR}/dev-debug.log" | sed 's/modulefile=//g'
-
-echo -e ""
-echo -e "2.0 - Installation"
-echo -e "=================================================================="
-
-echo -e ""
-echo -e "2.1 - install"
-echo -e "================================="
-echo -e "Description:"
-echo -e "install ${gamename} server."
-echo -e "Command: ./${gameservername} auto-install"
-(
-	exec 5> "${TRAVIS_BUILD_DIR}/dev-debug.log"
-	BASH_XTRACEFD="5"
-	set -x
-	fn_autoinstall
-)
-fn_test_result_pass
-echo -e "run order"
-echo -e "================="
-grep modulefile= "${TRAVIS_BUILD_DIR}/dev-debug.log" | sed 's/modulefile=//g'
-
-echo -e ""
-echo -e "3.0 - Start/Stop/Restart Tests"
-echo -e "=================================================================="
-
-echo -e ""
-echo -e "3.1 - start"
-echo -e "================================="
-echo -e "Description:"
-echo -e "start ${gamename} server."
-echo -e "Command: ./${gameservername} start"
-requiredstatus="STOPPED"
-fn_setstatus
-(
-	exec 5> "${TRAVIS_BUILD_DIR}/dev-debug.log"
-	BASH_XTRACEFD="5"
-	set -x
-	command_start.sh
-)
-fn_test_result_pass
-echo -e "run order"
-echo -e "================="
-grep modulefile= "${TRAVIS_BUILD_DIR}/dev-debug.log" | sed 's/modulefile=//g'
-
-echo -e ""
-echo -e "3.2 - start - online"
-echo -e "================================="
-echo -e "Description:"
-echo -e "start ${gamename} server while already running."
-echo -e "Command: ./${gameservername} start"
-requiredstatus="STARTED"
-fn_setstatus
-(
-	exec 5> "${TRAVIS_BUILD_DIR}/dev-debug.log"
-	BASH_XTRACEFD="5"
-	set -x
-	command_start.sh
-)
-fn_test_result_fail
-echo -e "run order"
-echo -e "================="
-grep modulefile= "${TRAVIS_BUILD_DIR}/dev-debug.log" | sed 's/modulefile=//g'
-
-echo -e ""
-echo -e "3.3 - start - updateonstart"
-echo -e "================================="
-echo -e "Description:"
-echo -e "will update server on start."
-echo -e "Command: ./${gameservername} start"
-requiredstatus="STOPPED"
-fn_setstatus
-(
-	exec 5> "${TRAVIS_BUILD_DIR}/dev-debug.log"
-	BASH_XTRACEFD="5"
-	set -x
-	updateonstart="on"
-	command_start.sh
-)
-fn_test_result_pass
-echo -e "run order"
-echo -e "================="
-grep modulefile= "${TRAVIS_BUILD_DIR}/dev-debug.log" | sed 's/modulefile=//g'
-
-echo -e ""
-echo -e "3.4 - stop"
-echo -e "================================="
-echo -e "Description:"
-echo -e "stop ${gamename} server."
-echo -e "Command: ./${gameservername} stop"
-requiredstatus="STARTED"
-fn_setstatus
-(
-	exec 5> "${TRAVIS_BUILD_DIR}/dev-debug.log"
-	BASH_XTRACEFD="5"
-	set -x
-	command_stop.sh
-)
-fn_test_result_pass
-echo -e "run order"
-echo -e "================="
-grep modulefile= "${TRAVIS_BUILD_DIR}/dev-debug.log" | sed 's/modulefile=//g'
-
-echo -e ""
-echo -e "3.5 - stop - offline"
-echo -e "================================="
-echo -e "Description:"
-echo -e "stop ${gamename} server while already stopped."
-echo -e "Command: ./${gameservername} stop"
-requiredstatus="STOPPED"
-fn_setstatus
-(
-	exec 5> "${TRAVIS_BUILD_DIR}/dev-debug.log"
-	BASH_XTRACEFD="5"
-	set -x
-	command_stop.sh
-)
-fn_test_result_fail
-echo -e "run order"
-echo -e "================="
-grep modulefile= "${TRAVIS_BUILD_DIR}/dev-debug.log" | sed 's/modulefile=//g'
-
-echo -e ""
-echo -e "3.6 - restart"
-echo -e "================================="
-echo -e "Description:"
-echo -e "restart ${gamename}."
-echo -e "Command: ./${gameservername} restart"
-requiredstatus="STARTED"
-fn_setstatus
-(
-	exec 5> "${TRAVIS_BUILD_DIR}/dev-debug.log"
-	BASH_XTRACEFD="5"
-	set -x
-	command_restart.sh
-)
-fn_test_result_pass
-echo -e "run order"
-echo -e "================="
-grep modulefile= "${TRAVIS_BUILD_DIR}/dev-debug.log" | sed 's/modulefile=//g'
-
-echo -e ""
-echo -e "3.7 - restart - offline"
-echo -e "================================="
-echo -e "Description:"
-echo -e "restart ${gamename} while already stopped."
-echo -e "Command: ./${gameservername} restart"
-requiredstatus="STOPPED"
-fn_setstatus
-(
-	exec 5> "${TRAVIS_BUILD_DIR}/dev-debug.log"
-	BASH_XTRACEFD="5"
-	set -x
-	command_restart.sh
-)
-fn_test_result_pass
-echo -e "run order"
-echo -e "================="
-grep modulefile= "${TRAVIS_BUILD_DIR}/dev-debug.log" | sed 's/modulefile=//g'
-
-echo -e ""
-echo -e "4.0 - Update Tests"
-echo -e "=================================================================="
-
-echo -e ""
-echo -e "4.1 - update"
-echo -e "================================="
-echo -e "Description:"
-echo -e "check for updates."
-echo -e "Command: ./${gameservername} update"
-requiredstatus="STOPPED"
-fn_setstatus
-(
-	exec 5> "${TRAVIS_BUILD_DIR}/dev-debug.log"
-	BASH_XTRACEFD="5"
-	set -x
-	command_update.sh
-)
-fn_test_result_pass
-echo -e "run order"
-echo -e "================="
-grep modulefile= "${TRAVIS_BUILD_DIR}/dev-debug.log" | sed 's/modulefile=//g'
-
-echo -e ""
-echo -e "4.2 - update-lgsm"
-echo -e "================================="
-echo -e "Description:"
-echo -e "update LinuxGSM."
-echo -e ""
-echo -e "Command: ./jc2server update-lgam"
-requiredstatus="STARTED"
-fn_setstatus
-(
-	exec 5> "${TRAVIS_BUILD_DIR}/dev-debug.log"
-	BASH_XTRACEFD="5"
-	set -x
-	command_update_linuxgsm.sh
-)
-fn_test_result_pass
-echo -e "run order"
-echo -e "================="
-grep modulefile= "${TRAVIS_BUILD_DIR}/dev-debug.log" | sed 's/modulefile=//g'
-
-echo -e ""
-echo -e "5.0 - Monitor Tests"
-echo -e "=================================================================="
-echo -e ""
-info_game.sh
-echo -e "Server IP - Port: ${ip}:${port}"
-echo -e "Server IP - Query Port: ${ip}:${queryport}"
-
-echo -e ""
-echo -e "5.1 - monitor - online"
-echo -e "================================="
-echo -e "Description:"
-echo -e "run monitor server while already running."
-echo -e "Command: ./${gameservername} monitor"
-requiredstatus="STARTED"
-fn_setstatus
-(
-	exec 5> "${TRAVIS_BUILD_DIR}/dev-debug.log"
-	BASH_XTRACEFD="5"
-	set -x
-	command_monitor.sh
-)
-fn_test_result_pass
-echo -e "run order"
-echo -e "================="
-grep modulefile= "${TRAVIS_BUILD_DIR}/dev-debug.log" | sed 's/modulefile=//g'
-
-echo -e ""
-echo -e "5.2 - monitor - offline - with lockfile"
-echo -e "================================="
-echo -e "Description:"
-echo -e "run monitor while server is offline with lockfile."
-echo -e "Command: ./${gameservername} monitor"
-requiredstatus="STOPPED"
-fn_setstatus
-fn_print_info_nl "creating lockfile."
-date '+%s' > "${lockdir}/${selfname}.lock"
-echo "${version}" >> "${lockdir}/${selfname}.lock"
-echo "${port}" >> "${lockdir}/${selfname}.lock"
-(
-	exec 5> "${TRAVIS_BUILD_DIR}/dev-debug.log"
-	BASH_XTRACEFD="5"
-	set -x
-	command_monitor.sh
-)
-fn_test_result_pass
-echo -e "run order"
-echo -e "================="
-grep modulefile= "${TRAVIS_BUILD_DIR}/dev-debug.log" | sed 's/modulefile=//g'
-
-echo -e ""
-echo -e "5.3 - monitor - offline - no lockfile"
-echo -e "================================="
-echo -e "Description:"
-echo -e "run monitor while server is offline with no lockfile."
-echo -e "Command: ./${gameservername} monitor"
-requiredstatus="STOPPED"
-fn_setstatus
-(
-	exec 5> "${TRAVIS_BUILD_DIR}/dev-debug.log"
-	BASH_XTRACEFD="5"
-	set -x
-	command_monitor.sh
-)
-fn_test_result_fail
-echo -e "run order"
-echo -e "================="
-grep modulefile= "${TRAVIS_BUILD_DIR}/dev-debug.log" | sed 's/modulefile=//g'
-
-echo -e ""
-echo -e "5.4 - test-alert"
-echo -e "================================="
-echo -e "Description:"
-echo -e "run monitor while server is offline with no lockfile."
-echo -e "Command: ./${gameservername} test-alert"
-requiredstatus="STOPPED"
-fn_setstatus
-(
-	exec 5> "${TRAVIS_BUILD_DIR}/dev-debug.log"
-	BASH_XTRACEFD="5"
-	set -x
-	command_test_alert.sh
-)
-fn_test_result_fail
-echo -e "run order"
-echo -e "================="
-grep modulefile= "${TRAVIS_BUILD_DIR}/dev-debug.log" | sed 's/modulefile=//g'
-
-echo -e ""
-echo -e "6.0 - Details Tests"
-echo -e "=================================================================="
-
-echo -e ""
-echo -e "6.1 - details"
-echo -e "================================="
-echo -e "Description:"
-echo -e "display details."
-echo -e "Command: ./${gameservername} details"
-requiredstatus="STARTED"
-fn_setstatus
-(
-	exec 5> "${TRAVIS_BUILD_DIR}/dev-debug.log"
-	BASH_XTRACEFD="5"
-	set -x
-	command_details.sh
-)
-fn_test_result_pass
-echo -e "run order"
-echo -e "================="
-grep modulefile= "${TRAVIS_BUILD_DIR}/dev-debug.log" | sed 's/modulefile=//g'
-
-echo -e ""
-echo -e "6.2 - postdetails"
-echo -e "================================="
-echo -e "Description:"
-echo -e "post details."
-echo -e "Command: ./${gameservername} postdetails"
-requiredstatus="STARTED"
-fn_setstatus
-(
-	exec 5> "${TRAVIS_BUILD_DIR}/dev-debug.log"
-	BASH_XTRACEFD="5"
-	set -x
-	command_postdetails.sh
-)
-fn_test_result_pass
-echo -e "run order"
-echo -e "================="
-grep modulefile= "${TRAVIS_BUILD_DIR}/dev-debug.log" | sed 's/modulefile=//g'
-
-echo -e ""
-echo -e "7.0 - Backup Tests"
-echo -e "=================================================================="
-
-echo -e ""
-echo -e "7.1 - backup"
-echo -e "================================="
-echo -e "Description:"
-echo -e "run a backup."
-echo -e "Command: ./${gameservername} backup"
-requiredstatus="STARTED"
-fn_setstatus
-echo -e "test de-activated until issue #1839 fixed"
-#(command_backup.sh)
-fn_test_result_pass
-echo -e "run order"
-echo -e "================="
-grep modulefile= "${TRAVIS_BUILD_DIR}/dev-debug.log" | sed 's/modulefile=//g'
-
-echo -e ""
-echo -e "8.0 - Development Tools Tests"
-echo -e "=================================================================="
-
-echo -e ""
-echo -e "8.1 - dev - detect glibc"
-echo -e "================================="
-echo -e "Description:"
-echo -e "detect glibc."
-echo -e "Command: ./${gameservername} detect-glibc"
-requiredstatus="STARTED"
-fn_setstatus
-(
-	exec 5> "${TRAVIS_BUILD_DIR}/dev-debug.log"
-	BASH_XTRACEFD="5"
-	set -x
-	command_dev_detect_glibc.sh
-)
-fn_test_result_pass
-echo -e "run order"
-echo -e "================="
-grep modulefile= "${TRAVIS_BUILD_DIR}/dev-debug.log" | sed 's/modulefile=//g'
-
-echo -e ""
-echo -e "8.2 - dev - detect ldd"
-echo -e "================================="
-echo -e "Description:"
-echo -e "detect ldd."
-echo -e "Command: ./${gameservername} detect-ldd"
-requiredstatus="STARTED"
-fn_setstatus
-(
-	exec 5> "${TRAVIS_BUILD_DIR}/dev-debug.log"
-	BASH_XTRACEFD="5"
-	set -x
-	command_dev_detect_ldd.sh
-)
-fn_test_result_pass
-echo -e "run order"
-echo -e "================="
-grep modulefile= "${TRAVIS_BUILD_DIR}/dev-debug.log" | sed 's/modulefile=//g'
-
-echo -e ""
-echo -e "8.3 - dev - detect deps"
-echo -e "================================="
-echo -e "Description:"
-echo -e "detect dependencies."
-echo -e "Command: ./${gameservername} detect-deps"
-requiredstatus="STARTED"
-fn_setstatus
-(
-	exec 5> "${TRAVIS_BUILD_DIR}/dev-debug.log"
-	BASH_XTRACEFD="5"
-	set -x
-	command_dev_detect_deps.sh
-)
-fn_test_result_pass
-echo -e "run order"
-echo -e "================="
-grep modulefile= "${TRAVIS_BUILD_DIR}/dev-debug.log" | sed 's/modulefile=//g'
-
-echo -e ""
-echo -e "8.4 - dev - query-raw"
-echo -e "================================="
-echo -e "Description:"
-echo -e "raw query output."
-echo -e "Command: ./${gameservername} query-raw"
-requiredstatus="STARTED"
-fn_setstatus
-(
-	exec 5> "${TRAVIS_BUILD_DIR}/dev-debug.log"
-	BASH_XTRACEFD="5"
-	set -x
-	command_dev_query_raw.sh
-)
-fn_test_result_na
-echo -e "run order"
-echo -e "================="
-grep modulefile= "${TRAVIS_BUILD_DIR}/dev-debug.log" | sed 's/modulefile=//g'
-
-echo -e ""
-echo -e "9.0 - Sponsor"
-echo -e "=================================================================="
-
-echo -e ""
-echo -e "9.1 - sponsor"
-echo -e "================================="
-echo -e "Description:"
-echo -e "sponsor."
-echo -e "Command: ./${gameservername} sponsor"
-requiredstatus="STARTED"
-fn_setstatus
-(
-	exec 5> "${TRAVIS_BUILD_DIR}/dev-debug.log"
-	BASH_XTRACEFD="5"
-	set -x
-	command_sponsor.sh
-)
-fn_test_result_pass
-echo -e "run order"
-echo -e "================="
-grep modulefile= "${TRAVIS_BUILD_DIR}/dev-debug.log" | sed 's/modulefile=//g'
-
-echo -e ""
-echo -e "================================="
-echo -e "Server Tests - Complete!"
-echo -e "Using: ${gamename}"
-echo -e "================================="
-requiredstatus="STOPPED"
-fn_setstatus
-
-core_exit.sh

From 9ff3409f4e0fb2f07dd5edca7440db344981591c Mon Sep 17 00:00:00 2001
From: CosminPerRam <cosmin.p@live.com>
Date: Sat, 14 Oct 2023 19:32:33 +0300
Subject: [PATCH 006/154] docs: replace gamedig repository links to the actual
 repository (#4338)

---
 lgsm/functions/query_gamedig.sh | 2 +-
 lgsm/modules/query_gamedig.sh   | 2 +-
 2 files changed, 2 insertions(+), 2 deletions(-)

diff --git a/lgsm/functions/query_gamedig.sh b/lgsm/functions/query_gamedig.sh
index 265607acd..344874011 100644
--- a/lgsm/functions/query_gamedig.sh
+++ b/lgsm/functions/query_gamedig.sh
@@ -4,7 +4,7 @@
 # Contributors: http://linuxgsm.com/contrib
 # Website: https://linuxgsm.com
 # Description: Querys a gameserver using node-gamedig.
-# https://github.com/sonicsnes/node-gamedig
+# https://github.com/gamedig/node-gamedig
 
 functionselfname="$(basename "$(readlink -f "${BASH_SOURCE[0]}")")"
 querystatus="2"
diff --git a/lgsm/modules/query_gamedig.sh b/lgsm/modules/query_gamedig.sh
index 138e014a0..28f70a3b7 100644
--- a/lgsm/modules/query_gamedig.sh
+++ b/lgsm/modules/query_gamedig.sh
@@ -4,7 +4,7 @@
 # Contributors: http://linuxgsm.com/contrib
 # Website: https://linuxgsm.com
 # Description: Querys a gameserver using node-gamedig.
-# https://github.com/sonicsnes/node-gamedig
+# https://github.com/gamedig/node-gamedig
 
 moduleselfname="$(basename "$(readlink -f "${BASH_SOURCE[0]}")")"
 # Default query status to failure. Will be changed to 0 if query is successful.

From 68ae13c0695f1aaa5a1d6e8f711481e15e144542 Mon Sep 17 00:00:00 2001
From: Daniel Gibbs <me@danielgibbs.co.uk>
Date: Sun, 15 Oct 2023 17:52:03 +0100
Subject: [PATCH 007/154] feat: change sleep timers (#4339)

* refactor: simplify sleep time functions

The `fn_sleep_time` function has been refactored to remove unnecessary conditions and set a default sleep time of 0.5 seconds. Additionally, four new functions (`fn_sleep_time_1`, `fn_sleep_time_5`, `fn_sleep_time_10`) have been added to provide different sleep times of 1, 5, and 10 seconds respectively. This improves code readability and allows for more flexibility in setting sleep times.

* change sleep to fn_sleep_time

* refactor: optimize sleep time functions

- Refactored the code to optimize the sleep time functions.
- Updated the `fn_sleep_time` function calls to `fn_sleep_time_1` in multiple files.
- Removed unnecessary sleep time calls in some files.

* refactor: simplify sleep time function call

The code changes refactor the sleep time function call in the check_deps.sh file. Instead of calling fn_sleep_time_1, it now calls fn_sleep_time. This change simplifies the code and improves readability.

* feat: add sleep time before checking session

Add a sleep time of 1 second before checking the session in the command_monitor.sh file. This allows for better synchronization and improves the accuracy of the session check.

* changes

* refactor: optimize sleep time function

The code changes refactor the sleep time function in multiple files to improve efficiency. The fn_sleep_time function is replaced with fn_sleep_time_1. This change reduces unnecessary delays during execution.

* refactor: update sleep time function names

The sleep time functions in the core_messages.sh file have been updated to use more descriptive names. The fn_sleep_time function has been renamed to fn_sleep_time_1 for clarity and consistency. This change improves code readability and maintainability.

* refactor: optimize sleep time in core_messages.sh

The commit optimizes the sleep time in the core_messages.sh file. The fn_sleep_time and fn_print_dots functions now use a shorter sleep time of 0.5 seconds instead of 1 second, resulting in faster execution.

* refactor: improve readability and consistency in code

- Refactored the log messages to use consistent capitalization and wording.
- Updated log messages in check_glibc.sh, check_permissions.sh, command_backup.sh, command_update_linuxgsm.sh, command_wipe.sh, fix_samp.sh, install_config.sh, and set_dst_config_vars() functions.

feat: add more descriptive log messages

- Added more descriptive log messages to provide clearer information about the actions being performed.
- Updated log messages in check_glibc.sh, check_permissions.sh, command_backup.sh, command_update_linuxgsm.sh, command_wipe.sh, fix_samp.sh, install_config.sh.

fix: correct spelling errors in log messages

- Corrected spelling errors in some of the log messages for better clarity.
- Updated log messages in check_glibc.sh and fix_samp.sh.

* refactor: remove unnecessary print statements

This commit refactors the code by removing unnecessary print statements in multiple files. The removed print statements were used for displaying dots and warnings, but they are not needed anymore. This improves the readability and cleanliness of the code.

* refactor: improve commit messages for code changes

- Refactored check_glibc.sh to improve readability and clarity of error messages.
- Refactored check_permissions.sh to provide more informative error messages when checking /sys permissions.
- Refactored check_system_requirements.sh to provide clearer warning message when checking RAM requirements.
- Refactored command_backup.sh to provide more descriptive messages when starting a backup.

* remove legacy code

* fix: remove \t

* fix: run check_root

check root was never running because of logic in linuxgsm.sh

* fix: update warning message for missing sudo access

The warning message for users without sudo access has been updated to provide clearer instructions. Instead of just suggesting manual installation, it now also suggests running the script as root using `./${selfname} install`. This change improves user experience and helps them resolve dependency installation issues more effectively.

* tidy
---
 .github/workflows/serverlist-validate.sh  |  2 +-
 lgsm/functions/check_status.sh            |  2 +-
 lgsm/functions/command_stop.sh            |  2 +-
 lgsm/modules/check_config.sh              |  3 --
 lgsm/modules/check_deps.sh                | 20 ++++-----
 lgsm/modules/check_glibc.sh               | 18 ++++----
 lgsm/modules/check_permissions.sh         | 13 +++---
 lgsm/modules/check_root.sh                |  2 +-
 lgsm/modules/check_system_requirements.sh |  6 +--
 lgsm/modules/check_version.sh             |  2 +-
 lgsm/modules/command_backup.sh            | 50 ++++++-----------------
 lgsm/modules/command_dev_debug.sh         |  4 ++
 lgsm/modules/command_dev_details.sh       |  2 +-
 lgsm/modules/command_fastdl.sh            | 11 +++--
 lgsm/modules/command_mods_remove.sh       |  6 +--
 lgsm/modules/command_mods_update.sh       |  2 +-
 lgsm/modules/command_monitor.sh           |  3 +-
 lgsm/modules/command_start.sh             |  3 +-
 lgsm/modules/command_stop.sh              | 15 +++----
 lgsm/modules/command_update_linuxgsm.sh   |  4 +-
 lgsm/modules/command_validate.sh          |  8 ++--
 lgsm/modules/command_wipe.sh              | 14 +++----
 lgsm/modules/core_messages.sh             | 49 +++++++++++++---------
 lgsm/modules/fix_kf.sh                    |  8 ++--
 lgsm/modules/fix_kf2.sh                   |  2 +-
 lgsm/modules/fix_ro.sh                    | 10 ++---
 lgsm/modules/fix_samp.sh                  |  4 +-
 lgsm/modules/fix_ut2k4.sh                 |  4 +-
 lgsm/modules/fix_ut3.sh                   |  2 +-
 lgsm/modules/info_messages.sh             |  4 +-
 lgsm/modules/install_config.sh            | 22 +++++-----
 lgsm/modules/install_eula.sh              |  4 +-
 lgsm/modules/install_gslt.sh              |  4 +-
 lgsm/modules/install_logs.sh              |  2 -
 lgsm/modules/install_server_dir.sh        |  1 -
 lgsm/modules/install_squad_license.sh     |  2 +-
 lgsm/modules/install_stats.sh             |  1 -
 lgsm/modules/install_ts3db.sh             |  4 +-
 lgsm/modules/update_fctr.sh               |  2 +-
 lgsm/modules/update_jk2.sh                |  2 +-
 lgsm/modules/update_mc.sh                 |  2 +-
 lgsm/modules/update_mcb.sh                |  2 +-
 lgsm/modules/update_mta.sh                |  2 +-
 lgsm/modules/update_pmc.sh                |  2 +-
 lgsm/modules/update_ts3.sh                |  2 +-
 lgsm/modules/update_ut99.sh               |  2 +-
 lgsm/modules/update_vints.sh              |  2 +-
 linuxgsm.sh                               | 19 +++++----
 48 files changed, 171 insertions(+), 181 deletions(-)

diff --git a/.github/workflows/serverlist-validate.sh b/.github/workflows/serverlist-validate.sh
index 50b2da712..bc192ec37 100755
--- a/.github/workflows/serverlist-validate.sh
+++ b/.github/workflows/serverlist-validate.sh
@@ -10,7 +10,7 @@ csvlist="$(ls -1 | grep -E '^(ubuntu|debian|centos|rhel|almalinux|rocky).*\.csv$
 # loop though each csv file and make sure the number of lines is the same as the serverlistcount
 for csv in $csvlist; do
 	csvcount="$(wc -l < "${csv}")"
-	csvcount=$((csvcount-2))
+	csvcount=$((csvcount - 2))
 	if [ "$csvcount" -ne "$serverlistcount" ]; then
 		echo "ERROR: $csv ($csvcount) does not match serverlist.csv ($serverlistcount)"
 		exitcode=1
diff --git a/lgsm/functions/check_status.sh b/lgsm/functions/check_status.sh
index a454b4eff..429f7c72d 100644
--- a/lgsm/functions/check_status.sh
+++ b/lgsm/functions/check_status.sh
@@ -7,4 +7,4 @@
 
 functionselfname="$(basename "$(readlink -f "${BASH_SOURCE[0]}")")"
 
-status=$(tmux -L "${sessionname}" list-sessions -F "#{session_name}" 2>/dev/null | grep -Ecx "^${sessionname}")
+status=$(tmux -L "${sessionname}" list-sessions -F "#{session_name}" 2> /dev/null | grep -Ecx "^${sessionname}")
diff --git a/lgsm/functions/command_stop.sh b/lgsm/functions/command_stop.sh
index d2e88fcea..92785af98 100644
--- a/lgsm/functions/command_stop.sh
+++ b/lgsm/functions/command_stop.sh
@@ -15,7 +15,7 @@ fn_stop_graceful_ctrlc() {
 	fn_print_dots "Graceful: CTRL+c"
 	fn_script_log_info "Graceful: CTRL+c"
 	# Sends quit.
-	tmux -L "${sessionname}" send-keys -t "${sessionname}" C-c  > /dev/null 2>&1
+	tmux -L "${sessionname}" send-keys -t "${sessionname}" C-c > /dev/null 2>&1
 	# Waits up to 30 seconds giving the server time to shutdown gracefuly.
 	for seconds in {1..30}; do
 		check_status.sh
diff --git a/lgsm/modules/check_config.sh b/lgsm/modules/check_config.sh
index 436740afa..42892a191 100644
--- a/lgsm/modules/check_config.sh
+++ b/lgsm/modules/check_config.sh
@@ -8,7 +8,6 @@
 moduleselfname="$(basename "$(readlink -f "${BASH_SOURCE[0]}")")"
 
 if [ -n "${servercfgfullpath}" ] && [ ! -f "${servercfgfullpath}" ]; then
-	fn_print_dots ""
 	fn_print_warn_nl "Configuration file missing!"
 	echo -e "${servercfgfullpath}"
 	fn_script_log_warn "Configuration file missing!"
@@ -17,11 +16,9 @@ if [ -n "${servercfgfullpath}" ] && [ ! -f "${servercfgfullpath}" ]; then
 fi
 
 if [ "${shortname}" == "rust" ] && [ -v rconpassword ] && [ -z "${rconpassword}" ]; then
-	fn_print_dots ""
 	fn_print_fail_nl "RCON password is not set"
 	fn_script_log_warn "RCON password is not set"
 elif [ -v rconpassword ] && [ "${rconpassword}" == "CHANGE_ME" ]; then
-	fn_print_dots ""
 	fn_print_warn_nl "Default RCON Password detected"
 	fn_script_log_warn "Default RCON Password detected"
 fi
diff --git a/lgsm/modules/check_deps.sh b/lgsm/modules/check_deps.sh
index d10948ca5..0f8304a18 100644
--- a/lgsm/modules/check_deps.sh
+++ b/lgsm/modules/check_deps.sh
@@ -25,11 +25,11 @@ fn_install_mono_repo() {
 		fn_print_information_nl "Automatically adding Mono repository."
 		fn_script_log_info "Automatically adding Mono repository."
 		echo -en ".\r"
-		sleep 1
+		fn_sleep_time_1
 		echo -en "..\r"
-		sleep 1
+		fn_sleep_time_1
 		echo -en "...\r"
-		sleep 1
+		fn_sleep_time_1
 		echo -en "   \r"
 		if [ "${distroid}" == "ubuntu" ]; then
 			if [ "${distroversion}" == "22.04" ]; then
@@ -160,8 +160,8 @@ fn_install_missing_deps() {
 				fn_print_information_nl "$(whoami) has sudo access."
 				fn_script_log_info "$(whoami) has sudo access."
 			else
-				fn_print_warning_nl "$(whoami) does not have sudo access. Manually install dependencies."
-				fn_script_log_warn "$(whoami) does not have sudo access. Manually install dependencies."
+				fn_print_warning_nl "$(whoami) does not have sudo access. Manually install dependencies or run ./${selfname} install as root."
+				fn_script_log_warn "$(whoami) does not have sudo access. Manually install dependencies or run ./${selfname} install as root."
 			fi
 		fi
 
@@ -177,11 +177,11 @@ fn_install_missing_deps() {
 			fn_print_information_nl "Automatically installing missing dependencies."
 			fn_script_log_info "Automatically installing missing dependencies."
 			echo -en ".\r"
-			sleep 1
+			fn_sleep_time_1
 			echo -en "..\r"
-			sleep 1
+			fn_sleep_time_1
 			echo -en "...\r"
-			sleep 1
+			fn_sleep_time_1
 			echo -en "   \r"
 			if [ "$(command -v apt 2> /dev/null)" ]; then
 				cmd="echo steamcmd steam/question select \"I AGREE\" | sudo debconf-set-selections; echo steamcmd steam/license note '' | sudo debconf-set-selections; ${i386installcommand}sudo apt-get update; sudo apt-get -y install ${array_deps_missing[*]}"
@@ -306,14 +306,14 @@ fn_deps_detector() {
 		missingdep=0
 		if [ "${commandname}" == "INSTALL" ]; then
 			echo -e "${green}${deptocheck}${default}"
-			sleep 0.1
+			fn_sleep_time
 		fi
 	elif [ "${depstatus}" != "0" ]; then
 		# If dependency is not found.
 		missingdep=1
 		if [ "${commandname}" == "INSTALL" ]; then
 			echo -e "${red}${deptocheck}${default}"
-			sleep 0.1
+			fn_sleep_time
 		fi
 		# If SteamCMD requirements are not met install will fail.
 		if [ -n "${appid}" ]; then
diff --git a/lgsm/modules/check_glibc.sh b/lgsm/modules/check_glibc.sh
index 25357a461..9da491bce 100644
--- a/lgsm/modules/check_glibc.sh
+++ b/lgsm/modules/check_glibc.sh
@@ -13,17 +13,19 @@ if [ "${glibc}" == "null" ]; then
 	# Glibc is not required.
 	:
 elif [ -z "${glibc}" ]; then
-	fn_print_dots "glibc"
-	fn_print_error_nl "glibc requirement unknown"
-	fn_script_log_error "glibc requirement unknown"
+	fn_print_dots "Checking glibc"
+	fn_print_error_nl "Checking glibc: requirement unknown"
+	fn_script_log_error "Checking glibc: requirement unknown"
+	fn_sleep_time_5
 elif [ "$(printf '%s\n'${glibc}'\n' "${glibcversion}" | sort -V | head -n 1)" != "${glibc}" ]; then
-	fn_print_dots "glibc"
-	fn_print_error_nl "glibc requirements not met"
-	fn_script_log_error "glibc requirements not met"
+	fn_print_dots "Checking glibc"
+	fn_print_error_nl "Checking glibc: requirements not met"
+	fn_script_log_error "Checking glibc: requirements not met"
 	echo -en "\n"
 	echo -e "	* glibc required: ${glibc}"
 	echo -e "	* glibc installed: ${red}${glibcversion}${default}"
 	echo -en "\n"
-	fn_print_information_nl "distro upgrade is required"
-	fn_script_log_info "distro upgrade is required"
+	fn_print_information_nl "Distro upgrade is required"
+	fn_script_log_info "Distro upgrade is required"
+	fn_sleep_time_5
 fi
diff --git a/lgsm/modules/check_permissions.sh b/lgsm/modules/check_permissions.sh
index a6a37ce5c..572b403cc 100644
--- a/lgsm/modules/check_permissions.sh
+++ b/lgsm/modules/check_permissions.sh
@@ -171,7 +171,7 @@ fn_sys_perm_fix_manually_msg() {
 	fn_script_log_info "To fix this issue, run the following command as root:"
 	echo -e "	  chmod a+rx /sys /sys/class /sys/class/net"
 	fn_script_log "chmod a+rx /sys /sys/class /sys/class/net"
-	fn_sleep_time
+	fn_sleep_time_5
 	if [ "${monitorflag}" == 1 ]; then
 		alert="permissions"
 		alert.sh
@@ -182,8 +182,8 @@ fn_sys_perm_fix_manually_msg() {
 # Attempt to fix /sys related permission errors if sudo is available, exits otherwise.
 fn_sys_perm_errors_fix() {
 	if sudo -n true > /dev/null 2>&1; then
-		fn_print_dots "Automatically fixing /sys permissions"
-		fn_script_log_info "Automatically fixing /sys permissions."
+		fn_print_dots "Fixing /sys permissions"
+		fn_script_log_info "Fixing /sys permissions."
 		if [ "${sysdirpermerror}" == "1" ]; then
 			sudo chmod a+rx "/sys"
 		fi
@@ -202,7 +202,7 @@ fn_sys_perm_errors_fix() {
 			# Show the user how to fix.
 			fn_sys_perm_fix_manually_msg
 		else
-			fn_print_ok_nl "Automatically fixing /sys permissions"
+			fn_print_ok_nl "Fixing /sys permissions"
 			fn_script_log_pass "Permissions in /sys fixed"
 		fi
 	else
@@ -216,8 +216,9 @@ fn_sys_perm_error_process() {
 	fn_sys_perm_errors_detect
 	# If any error was found.
 	if [ "${sysdirpermerror}" == "1" ] || [ "${classdirpermerror}" == "1" ] || [ "${netdirpermerror}" == "1" ]; then
-		fn_print_error_nl "Permission error(s) found in /sys"
-		fn_script_log_error "Permission error(s) found in /sys"
+		fn_print_dots "Checking /sys permissions"
+		fn_print_error_nl "Checking /sys permissions"
+		fn_script_log_error "Checking /sys permissions"
 		# Run the fix
 		fn_sys_perm_errors_fix
 	fi
diff --git a/lgsm/modules/check_root.sh b/lgsm/modules/check_root.sh
index 81115394a..8fe20764c 100644
--- a/lgsm/modules/check_root.sh
+++ b/lgsm/modules/check_root.sh
@@ -9,7 +9,7 @@ moduleselfname="$(basename "$(readlink -f "${BASH_SOURCE[0]}")")"
 
 if [ "$(whoami)" == "root" ]; then
 	if [ "${commandname}" != "INSTALL" ]; then
-		fn_print_fail_nl "Do NOT run this script as root!"
+		fn_print_fail_nl "Do NOT run as root!"
 		if [ -d "${lgsmlogdir}" ]; then
 			fn_script_log_fail "${selfname} attempted to run as root."
 		else
diff --git a/lgsm/modules/check_system_requirements.sh b/lgsm/modules/check_system_requirements.sh
index 88fb9d15a..6932de4dc 100644
--- a/lgsm/modules/check_system_requirements.sh
+++ b/lgsm/modules/check_system_requirements.sh
@@ -46,10 +46,10 @@ fi
 # If the game or engine has a minimum RAM Requirement, compare it to system's available RAM.
 if [ "${ramrequirementmb}" ]; then
 	if [ "${physmemtotalmb}" -lt "${ramrequirementmb}" ]; then
-		fn_print_dots "Check RAM"
+		fn_print_dots "Checking RAM"
 		# Warn the user.
-		fn_print_warn_nl "Check RAM: ${ramrequirementgb}G required, ${physmemtotal} available"
+		fn_print_warn_nl "Checking RAM: ${ramrequirementgb}G required, ${physmemtotal} available"
 		echo "* ${gamename} server may fail to run or experience poor performance."
-		fn_sleep_time
+		fn_sleep_time_5
 	fi
 fi
diff --git a/lgsm/modules/check_version.sh b/lgsm/modules/check_version.sh
index 3ca015843..5369fd832 100644
--- a/lgsm/modules/check_version.sh
+++ b/lgsm/modules/check_version.sh
@@ -16,8 +16,8 @@ if [ -n "${modulesversion}" ] && [ -n "${version}" ] && [ "${version}" != "${mod
 	echo -e "* ${selfname}: ${version}"
 	echo -e "* modules: ${modulesversion}"
 	echo -e ""
-	fn_sleep_time
 	fn_script_log_error "LinuxGSM Version mismatch: ${selfname}: ${version}: modules: ${modulesversion}"
+	fn_sleep_time_1
 	command_update_linuxgsm.sh
 	fn_firstcommand_reset
 fi
diff --git a/lgsm/modules/command_backup.sh b/lgsm/modules/command_backup.sh
index 16223c914..fac5dc38b 100644
--- a/lgsm/modules/command_backup.sh
+++ b/lgsm/modules/command_backup.sh
@@ -10,8 +10,6 @@ commandaction="Backing up"
 moduleselfname="$(basename "$(readlink -f "${BASH_SOURCE[0]}")")"
 fn_firstcommand_set
 
-check.sh
-
 # Trap to remove lockfile on quit.
 fn_backup_trap() {
 	echo -e ""
@@ -56,12 +54,14 @@ fn_backup_init() {
 	backupname="${selfname}-$(date '+%Y-%m-%d-%H%M%S')"
 
 	info_distro.sh
-	fn_print_dots "Backup starting"
-	fn_script_log_info "Backup starting"
-	fn_print_ok_nl "Backup starting"
+	fn_print_dots "Starting backup"
+	fn_script_log_info "Starting backup"
 	if [ ! -d "${backupdir}" ] || [ "${backupcount}" == "0" ]; then
-		fn_print_info_nl "There are no previous backups"
+		fn_print_info_nl "Starting backup: No previous backups found"
+		fn_script_log_info "No previous backups found"
 	else
+		fn_print_info_nl "Starting backup: Previous backups found"
+		fn_script_log_info "Previous backups found"
 		if [ "${lastbackupdaysago}" == "0" ]; then
 			daysago="less than 1 day ago"
 		elif [ "${lastbackupdaysago}" == "1" ]; then
@@ -101,32 +101,6 @@ fn_backup_dir() {
 	fi
 }
 
-# Migrate Backups from old dir before refactor
-fn_backup_migrate_olddir() {
-	# Check if old backup dir is there before the refactor and move the backups
-	if [ -d "${rootdir}/backups" ]; then
-		if [ "${rootdir}/backups" != "${backupdir}" ]; then
-			fn_print_dots "Backup directory is being migrated"
-			fn_script_log_info "Backup directory is being migrated"
-			fn_script_log_info "${rootdir}/backups > ${backupdir}"
-			mv "${rootdir}/backups/"* "${backupdir}" 2> /dev/null
-			exitcode=$?
-			if [ "${exitcode}" == 0 ]; then
-				rmdir "${rootdir}/backups" 2> /dev/null
-				exitcode=$?
-			fi
-			if [ "${exitcode}" != 0 ]; then
-				fn_print_error_nl "Backup directory is being migrated"
-				fn_script_log_error "Backup directory is being migrated"
-			else
-
-				fn_print_ok_nl "Backup directory is being migrated"
-				fn_script_log_pass "Backup directory is being migrated"
-			fi
-		fi
-	fi
-}
-
 fn_backup_create_lockfile() {
 	# Create lockfile.
 	date '+%s' > "${lockdir:?}/backup.lock"
@@ -142,7 +116,7 @@ fn_backup_compression() {
 	fn_print_info "A total of ${rootdirduexbackup} will be compressed."
 	fn_script_log_info "A total of ${rootdirduexbackup} will be compressed: ${backupdir}/${backupname}.tar.gz"
 	fn_print_dots "Backup (${rootdirduexbackup}) ${backupname}.tar.gz, in progress..."
-	fn_script_log_info "backup ${rootdirduexbackup} ${backupname}.tar.gz, in progress"
+	fn_script_log_info "Backup ${rootdirduexbackup} ${backupname}.tar.gz, in progress"
 	excludedir=$(fn_backup_relpath)
 
 	# Check that excludedir is a valid path.
@@ -187,7 +161,7 @@ fn_backup_prune() {
 				# Display how many backups will be cleared.
 				echo -e "* Pruning: ${backupquotadiff} backup(s) has exceeded the ${maxbackups} backups limit"
 				fn_script_log_info "Pruning: ${backupquotadiff} backup(s) has exceeded the ${maxbackups} backups limit"
-				fn_sleep_time
+				fn_sleep_time_1
 				fn_print_dots "Pruning: Clearing ${backupquotadiff} backup(s)"
 				fn_script_log_info "Pruning: Clearing ${backupquotadiff} backup(s)"
 				# Clear backups over quota.
@@ -199,7 +173,7 @@ fn_backup_prune() {
 				# Display how many backups will be cleared.
 				echo -e "* Pruning: ${backupsoudatedcount} backup(s) are older than ${maxbackupdays} days."
 				fn_script_log_info "Pruning: ${backupsoudatedcount} backup(s) older than ${maxbackupdays} days."
-				fn_sleep_time
+				fn_sleep_time_1
 				fn_print_dots "Pruning: Clearing ${backupquotadiff} backup(s)."
 				fn_script_log_info "Pruning: Clearing ${backupquotadiff} backup(s)"
 				# Clear backups over quota
@@ -264,12 +238,14 @@ fn_backup_start_server() {
 	fi
 }
 
-# Run functions.
+fn_print_dots ""
+check.sh
+core_logs.sh
+
 fn_backup_check_lockfile
 fn_backup_init
 fn_backup_stop_server
 fn_backup_dir
-fn_backup_migrate_olddir
 fn_backup_create_lockfile
 fn_backup_compression
 fn_backup_prune
diff --git a/lgsm/modules/command_dev_debug.sh b/lgsm/modules/command_dev_debug.sh
index 081bda611..eb0356985 100644
--- a/lgsm/modules/command_dev_debug.sh
+++ b/lgsm/modules/command_dev_debug.sh
@@ -10,6 +10,10 @@ commandaction="Developer debug"
 moduleselfname="$(basename "$(readlink -f "${BASH_SOURCE[0]}")")"
 fn_firstcommand_reset
 
+fn_print_dots ""
+check.sh
+core_logs.sh
+
 if [ -f "${rootdir}/.dev-debug" ]; then
 	rm -f "${rootdir:?}/.dev-debug"
 	fn_print_ok_nl "Disabled dev-debug"
diff --git a/lgsm/modules/command_dev_details.sh b/lgsm/modules/command_dev_details.sh
index 2659465d3..93dae77bc 100644
--- a/lgsm/modules/command_dev_details.sh
+++ b/lgsm/modules/command_dev_details.sh
@@ -19,8 +19,8 @@ carriagereturn=$(file -b "${servercfgfullpath}" | grep -q CRLF && echo "${red}CR
 echo -e ""
 echo -e "${bold}${lightgreen}Server Details${default}"
 fn_messages_separator
-echo -e ""
 
+echo -e ""
 echo -e "Game: ${gamename}"
 echo -e "Config type: ${configtype}"
 echo -e "Config file: ${servercfgfullpath}"
diff --git a/lgsm/modules/command_fastdl.sh b/lgsm/modules/command_fastdl.sh
index acc3a1ba4..c1c667797 100644
--- a/lgsm/modules/command_fastdl.sh
+++ b/lgsm/modules/command_fastdl.sh
@@ -10,8 +10,6 @@ commandaction="Fastdl"
 moduleselfname="$(basename "$(readlink -f "${BASH_SOURCE[0]}")")"
 fn_firstcommand_set
 
-check.sh
-
 # Directories.
 if [ -z "${webdir}" ]; then
 	webdir="${rootdir}/public_html"
@@ -209,7 +207,7 @@ fn_fastdl_preview() {
 	fi
 	if [ -f "${tmpdir}/fastdl_files_to_compress.txt" ]; then
 		echo -e "calculating total file size..."
-		fn_sleep_time
+		fn_sleep_time_1
 		totalfiles=$(wc -l < "${tmpdir}/fastdl_files_to_compress.txt")
 		# Calculates total file size.
 		while read -r dufile; do
@@ -276,7 +274,7 @@ fn_fastdl_gmod() {
 		fi
 		# Clear addons directory in fastdl.
 		echo -en "clearing addons dir from fastdl dir..."
-		fn_sleep_time
+		fn_sleep_time_1
 		rm -rf "${fastdldir:?}/addons"
 		exitcode=$?
 		if [ "${exitcode}" != 0 ]; then
@@ -291,7 +289,7 @@ fn_fastdl_gmod() {
 	# Correct content that may be into a lua directory by mistake like some darkrpmodification addons.
 	if [ -d "${fastdldir}/lua" ]; then
 		echo -en "correcting DarkRP files..."
-		fn_sleep_time
+		fn_sleep_time_1
 		cp -Rf "${fastdldir}/lua/"* "${fastdldir}"
 		exitcode=$?
 		if [ "${exitcode}" != 0 ]; then
@@ -335,7 +333,7 @@ fn_fastdl_source() {
 					tput rc
 					tput el
 					echo -e "copying ${directory} ${allowed_extention} : ${fileswc}..."
-					fn_sleep_time
+					fn_sleep_time_1
 					# get relative path of file in the dir
 					tmprelfilepath="${fastdlfile#"${systemdir}/"}"
 					copytodir="${tmprelfilepath%/*}"
@@ -427,6 +425,7 @@ fn_fastdl_bzip2() {
 	fn_print_ok_eol_nl
 }
 
+check.sh
 # Run functions.
 fn_fastdl_preview
 fn_clear_old_fastdl
diff --git a/lgsm/modules/command_mods_remove.sh b/lgsm/modules/command_mods_remove.sh
index db7763cd8..5f70ac389 100644
--- a/lgsm/modules/command_mods_remove.sh
+++ b/lgsm/modules/command_mods_remove.sh
@@ -59,7 +59,7 @@ fn_script_log_info "Removing ${modsfilelistsize} files from ${modprettyname}"
 echo -e "removing ${modprettyname}"
 echo -e "* ${modsfilelistsize} files to be removed"
 echo -e "* location: ${modinstalldir}"
-fn_sleep_time
+fn_sleep_time_1
 # Go through every file and remove it.
 modfileline="1"
 tput sc
@@ -99,7 +99,7 @@ fi
 
 # Remove file list.
 echo -en "removing ${modcommand}-files.txt..."
-fn_sleep_time
+fn_sleep_time_1
 rm -rf "${modsdir:?}/${modcommand}-files.txt"
 exitcode=$?
 if [ "${exitcode}" != 0 ]; then
@@ -113,7 +113,7 @@ fi
 
 # Remove mods from installed mods list.
 echo -en "removing ${modcommand} from ${modsinstalledlist}..."
-fn_sleep_time
+fn_sleep_time_1
 
 sed -i "/^${modcommand}$/d" "${modsinstalledlistfullpath}"
 exitcode=$?
diff --git a/lgsm/modules/command_mods_update.sh b/lgsm/modules/command_mods_update.sh
index cfbafc80c..cd5c3b03f 100644
--- a/lgsm/modules/command_mods_update.sh
+++ b/lgsm/modules/command_mods_update.sh
@@ -18,7 +18,7 @@ mods_core.sh
 fn_remove_cfg_files() {
 	if [ "${modkeepfiles}" != "OVERWRITE" ] && [ "${modkeepfiles}" != "NOUPDATE" ]; then
 		echo -e "the following files/directories will be preserved:"
-		fn_sleep_time
+		fn_sleep_time_1
 		# Count how many files there are to remove.
 		filestopreserve=$(echo -e "${modkeepfiles}" | awk -F ';' '{ print NF }')
 		# Test all subvalues of "modkeepfiles" using the ";" separator.
diff --git a/lgsm/modules/command_monitor.sh b/lgsm/modules/command_monitor.sh
index 079ad334d..d4d88bd56 100644
--- a/lgsm/modules/command_monitor.sh
+++ b/lgsm/modules/command_monitor.sh
@@ -330,7 +330,7 @@ fn_monitor_query() {
 		# Second counter will wait for 15s before breaking loop.
 		for seconds in {1..15}; do
 			fn_print_fail "Querying port: ${querymethod}: ${ip}:${queryport} : ${totalseconds}/${queryattempt} : ${cyan}WAIT${default}"
-			sleep 0.5
+			fn_sleep_time_1
 			totalseconds=$((totalseconds + 1))
 			if [ "${seconds}" == "15" ]; then
 				break
@@ -371,6 +371,7 @@ fn_monitor_loop() {
 	done
 }
 
+fn_print_dots ""
 monitorflag=1
 # Dont do any monitoring or checks if installer is running.
 fn_monitor_check_install
diff --git a/lgsm/modules/command_start.sh b/lgsm/modules/command_start.sh
index 4b45f0bc3..364733ea2 100644
--- a/lgsm/modules/command_start.sh
+++ b/lgsm/modules/command_start.sh
@@ -114,7 +114,7 @@ fn_start_tmux() {
 		echo -e "Console logging disabled in settings" >> "${consolelog}"
 		fn_script_log_info "Console logging disabled by user"
 	fi
-	fn_sleep_time
+	fn_sleep_time_1
 
 	# If the server fails to start.
 	check_status.sh
@@ -186,6 +186,7 @@ if [ "${firstcommandname}" == "START" ] || [ "${firstcommandname}" == "RESTART"
 	date '+%s' > "${lockdir:?}/${selfname}-monitoring.lock"
 fi
 
+fn_print_dots ""
 check.sh
 
 # If the server already started dont start again.
diff --git a/lgsm/modules/command_stop.sh b/lgsm/modules/command_stop.sh
index ee9152862..1567252f9 100644
--- a/lgsm/modules/command_stop.sh
+++ b/lgsm/modules/command_stop.sh
@@ -25,7 +25,7 @@ fn_stop_graceful_ctrlc() {
 			fn_script_log_pass "Graceful: CTRL+c: OK: ${seconds} seconds"
 			break
 		fi
-		sleep 1
+		fn_sleep_time_1
 		fn_print_dots "Graceful: CTRL+c: ${seconds}"
 	done
 	check_status.sh
@@ -53,7 +53,7 @@ fn_stop_graceful_cmd() {
 			fn_script_log_pass "Graceful: sending \"${1}\": OK: ${seconds} seconds"
 			break
 		fi
-		sleep 1
+		fn_sleep_time_1
 		fn_print_dots "Graceful: sending \"${1}\": ${seconds}"
 	done
 	check_status.sh
@@ -74,7 +74,7 @@ fn_stop_graceful_goldsrc() {
 	tmux -L "${socketname}" send -t "${sessionname}" quit ENTER > /dev/null 2>&1
 	# Waits 3 seconds as goldsrc servers restart with the quit command.
 	for seconds in {1..3}; do
-		sleep 1
+		fn_sleep_time_1
 		fn_print_dots "Graceful: sending \"quit\": ${seconds}"
 	done
 	fn_print_ok "Graceful: sending \"quit\": ${seconds}: "
@@ -154,7 +154,7 @@ fn_stop_graceful_sdtd() {
 					fn_script_log_pass "Graceful: telnet: ${telnetip}:${telnetport} : ${seconds} seconds"
 					break
 				fi
-				sleep 1
+				fn_sleep_time_1
 				fn_print_dots "Graceful: telnet: ${seconds}"
 			done
 		# If telnet shutdown fails tmux shutdown will be used, this risks loss of world save.
@@ -185,7 +185,7 @@ fn_stop_graceful_avorion() {
 	fn_script_log_info "Graceful: /save /stop"
 	# Sends /save.
 	tmux -L "${socketname}" send-keys -t "${sessionname}" /save ENTER > /dev/null 2>&1
-	sleep 5
+	fn_sleep_time_5
 	# Sends /quit.
 	tmux -L "${socketname}" send-keys -t "${sessionname}" /stop ENTER > /dev/null 2>&1
 	# Waits up to 30 seconds giving the server time to shutdown gracefuly.
@@ -197,7 +197,7 @@ fn_stop_graceful_avorion() {
 			fn_script_log_pass "Graceful: /save /stop: OK: ${seconds} seconds"
 			break
 		fi
-		sleep 1
+		fn_sleep_time_1
 		fn_print_dots "Graceful: /save /stop: ${seconds}"
 	done
 	check_status.sh
@@ -241,7 +241,7 @@ fn_stop_tmux() {
 	fn_script_log_info "tmux kill-session: ${sessionname}: ${servername}"
 	# Kill tmux session.
 	tmux -L "${socketname}" kill-session -t "${sessionname}" > /dev/null 2>&1
-	sleep 0.5
+	fn_sleep_time_1
 	check_status.sh
 	if [ "${status}" == "0" ]; then
 		fn_print_ok_nl "${servername}"
@@ -268,6 +268,7 @@ fn_stop_pre_check() {
 	fi
 }
 
+fn_print_dots ""
 check.sh
 
 # Create a stopping lockfile that only exists while the stop command is running.
diff --git a/lgsm/modules/command_update_linuxgsm.sh b/lgsm/modules/command_update_linuxgsm.sh
index 65b72bcbb..9cd66430c 100644
--- a/lgsm/modules/command_update_linuxgsm.sh
+++ b/lgsm/modules/command_update_linuxgsm.sh
@@ -10,10 +10,10 @@ commandaction="Updating LinuxGSM"
 moduleselfname="$(basename "$(readlink -f "${BASH_SOURCE[0]}")")"
 fn_firstcommand_set
 
+fn_print_dots ""
 check.sh
 info_distro.sh
 
-fn_print_dots ""
 fn_script_log_info "Updating LinuxGSM"
 
 fn_print_dots "Selecting repo"
@@ -92,7 +92,7 @@ if [ "${script_diff}" != "" ]; then
 	fi
 
 	echo -en "copying ${selfname}...\c"
-	fn_script_log_info "copying ${selfname}"
+	fn_script_log_info "Copying ${selfname}"
 	cp "${tmpdir}/linuxgsm.sh" "${rootdir}/${selfname}"
 	sed -i "s+shortname=\"core\"+shortname=\"${shortname}\"+g" "${rootdir}/${selfname}"
 	sed -i "s+gameservername=\"core\"+gameservername=\"${gameservername}\"+g" "${rootdir}/${selfname}"
diff --git a/lgsm/modules/command_validate.sh b/lgsm/modules/command_validate.sh
index f4a6250f3..d3511d7bb 100644
--- a/lgsm/modules/command_validate.sh
+++ b/lgsm/modules/command_validate.sh
@@ -17,7 +17,7 @@ fn_validate() {
 	for seconds in {3..1}; do
 		fn_print_warn "Validate might overwrite some customised files: ${totalseconds}"
 		totalseconds=$((totalseconds - 1))
-		sleep 1
+		fn_sleep_time_1
 		if [ "${seconds}" == "0" ]; then
 			break
 		fi
@@ -27,11 +27,11 @@ fn_validate() {
 	fn_dl_steamcmd
 }
 
-# The location where the builds are checked and downloaded.
-remotelocation="SteamCMD"
+fn_print_dots ""
 check.sh
+core_logs.sh
 
-fn_print_dots "${remotelocation}"
+fn_print_dots "SteamCMD"
 
 if [ "${status}" != "0" ]; then
 	fn_print_restart_warning
diff --git a/lgsm/modules/command_wipe.sh b/lgsm/modules/command_wipe.sh
index 193d2cd2d..d20bd0d3e 100644
--- a/lgsm/modules/command_wipe.sh
+++ b/lgsm/modules/command_wipe.sh
@@ -30,7 +30,7 @@ fn_wipe_files() {
 	if [ -n "${serverwipe}" ] || [ -n "${mapwipe}" ]; then
 		if [ -n "$(find "${serveridentitydir}" -type f -name "*.map")" ]; then
 			echo -en "removing .map file(s)..."
-			fn_script_log_info "removing *.map file(s)"
+			fn_script_log_info "Removing *.map file(s)"
 			fn_sleep_time
 			find "${serveridentitydir:?}" -type f -name "*.map" -printf "%f\n" >> "${lgsmlog}"
 			find "${serveridentitydir:?}" -type f -name "*.map" -delete | tee -a "${lgsmlog}"
@@ -45,7 +45,7 @@ fn_wipe_files() {
 	if [ -n "${serverwipe}" ] || [ -n "${mapwipe}" ]; then
 		if [ -n "$(find "${serveridentitydir}" -type f -name "*.sav*")" ]; then
 			echo -en "removing .sav file(s)..."
-			fn_script_log_info "removing .sav file(s)"
+			fn_script_log_info "Removing .sav file(s)"
 			fn_sleep_time
 			find "${serveridentitydir:?}" -type f -name "*.sav*" -printf "%f\n" >> "${lgsmlog}"
 			find "${serveridentitydir:?}" -type f -name "*.sav*" -delete
@@ -61,7 +61,7 @@ fn_wipe_files() {
 	if [ -n "${serverwipe}" ]; then
 		if [ -n "$(find "${serveridentitydir}" -type f ! -name 'player.tokens.db' -name "*.db")" ]; then
 			echo -en "removing .db file(s)..."
-			fn_script_log_info "removing .db file(s)"
+			fn_script_log_info "Removing .db file(s)"
 			fn_sleep_time
 			find "${serveridentitydir:?}" -type f ! -name 'player.tokens.db' -name "*.db" -printf "%f\n" >> "${lgsmlog}"
 			find "${serveridentitydir:?}" -type f ! -name 'player.tokens.db' -name "*.db" -delete
@@ -79,9 +79,9 @@ fn_map_wipe_warning() {
 	fn_script_log_warn "Map wipe will reset the map data and keep blueprint data"
 	totalseconds=3
 	for seconds in {3..1}; do
-		fn_print_warn "Map wipe will reset the map data and keep blueprint data: ${totalseconds}"
+		fn_print_warn "map wipe will reset the map data and keep blueprint data: ${totalseconds}"
 		totalseconds=$((totalseconds - 1))
-		sleep 1
+		fn_sleep_time_1
 		if [ "${seconds}" == "0" ]; then
 			break
 		fi
@@ -94,9 +94,9 @@ fn_full_wipe_warning() {
 	fn_script_log_warn "Server wipe will reset the map data and remove blueprint data"
 	totalseconds=3
 	for seconds in {3..1}; do
-		fn_print_warn "Server wipe will reset the map data and remove blueprint data: ${totalseconds}"
+		fn_print_warn "server wipe will reset the map data and remove blueprint data: ${totalseconds}"
 		totalseconds=$((totalseconds - 1))
-		sleep 1
+		fn_sleep_time_1
 		if [ "${seconds}" == "0" ]; then
 			break
 		fi
diff --git a/lgsm/modules/core_messages.sh b/lgsm/modules/core_messages.sh
index 5af4c5639..929e942be 100644
--- a/lgsm/modules/core_messages.sh
+++ b/lgsm/modules/core_messages.sh
@@ -35,12 +35,23 @@ fn_ansi_loader() {
 }
 
 fn_sleep_time() {
-	if [ "${sleeptime}" != "0" ] || [ "${travistest}" != "1" ]; then
-		if [ -z "${sleeptime}" ]; then
-			sleeptime=0.5
-		fi
-		sleep "${sleeptime}"
-	fi
+	sleep "0.1"
+}
+
+fn_sleep_time_05() {
+	sleep "0.5"
+}
+
+fn_sleep_time_1() {
+	sleep "1"
+}
+
+fn_sleep_time_5() {
+	sleep "5"
+}
+
+fn_sleep_time_10() {
+	sleep "10"
 }
 
 # Log display
@@ -137,7 +148,7 @@ fn_print_dots() {
 	else
 		echo -en "${creeol}[ .... ] $*"
 	fi
-	fn_sleep_time
+	fn_sleep_time_05
 }
 
 fn_print_dots_nl() {
@@ -146,7 +157,7 @@ fn_print_dots_nl() {
 	else
 		echo -e "${creeol}[ .... ] $*"
 	fi
-	fn_sleep_time
+	fn_sleep_time_05
 	echo -en "\n"
 }
 
@@ -476,56 +487,56 @@ fn_print_info_eol_nl() {
 # QUERYING
 fn_print_querying_eol() {
 	echo -en "${cyan}QUERYING${default}"
-	fn_sleep_time
+	fn_sleep_time_1
 }
 
 fn_print_querying_eol_nl() {
 	echo -e "${cyan}QUERYING${default}"
-	fn_sleep_time
+	fn_sleep_time_1
 }
 
 # CHECKING
 fn_print_checking_eol() {
 	echo -en "${cyan}CHECKING${default}"
-	fn_sleep_time
+	fn_sleep_time_1
 }
 
 fn_print_checking_eol_nl() {
 	echo -e "${cyan}CHECKING${default}"
-	fn_sleep_time
+	fn_sleep_time_1
 }
 
 # DELAY
 fn_print_delay_eol() {
 	echo -en "${green}DELAY${default}"
-	fn_sleep_time
+	fn_sleep_time_1
 }
 
 fn_print_delay_eol_nl() {
 	echo -e "${green}DELAY${default}"
-	fn_sleep_time
+	fn_sleep_time_1
 }
 
 # CANCELED
 fn_print_canceled_eol() {
 	echo -en "${lightyellow}CANCELED${default}"
-	fn_sleep_time
+	fn_sleep_time_1
 }
 
 fn_print_canceled_eol_nl() {
 	echo -e "${lightyellow}CANCELED${default}"
-	fn_sleep_time
+	fn_sleep_time_1
 }
 
 # REMOVED
 fn_print_removed_eol() {
 	echo -en "${red}REMOVED${default}"
-	fn_sleep_time
+	fn_sleep_time_1
 }
 
 fn_print_removed_eol_nl() {
 	echo -e "${red}REMOVED${default}"
-	fn_sleep_time
+	fn_sleep_time_1
 }
 
 # UPDATE
@@ -582,7 +593,7 @@ fn_print_restart_warning() {
 	for seconds in {3..1}; do
 		fn_print_warn "${selfname} will be restarted: ${totalseconds}"
 		totalseconds=$((totalseconds - 1))
-		sleep 1
+		fn_sleep_time_1
 		if [ "${seconds}" == "0" ]; then
 			break
 		fi
diff --git a/lgsm/modules/fix_kf.sh b/lgsm/modules/fix_kf.sh
index fe8b574aa..1bec47a4b 100644
--- a/lgsm/modules/fix_kf.sh
+++ b/lgsm/modules/fix_kf.sh
@@ -7,12 +7,12 @@
 
 moduleselfname="$(basename "$(readlink -f "${BASH_SOURCE[0]}")")"
 
-echo -e "Applying WebAdmin ROOst.css fix."
+echo -e "applying WebAdmin ROOst.css fix."
 echo -e "http://forums.tripwireinteractive.com/showpost.php?p=585435&postcount=13"
 sed -i 's/none}/none;/g' "${serverfiles}/Web/ServerAdmin/ROOst.css"
 sed -i 's/underline}/underline;/g' "${serverfiles}/Web/ServerAdmin/ROOst.css"
 fn_sleep_time
-echo -e "Applying WebAdmin CharSet fix."
+echo -e "applying WebAdmin CharSet fix."
 echo -e "http://forums.tripwireinteractive.com/showpost.php?p=442340&postcount=1"
 sed -i 's/CharSet="iso-8859-1"/CharSet="utf-8"/g' "${systemdir}/UWeb.int"
 fn_sleep_time
@@ -23,14 +23,14 @@ fn_sleep_time
 exitbypass=1
 command_start.sh
 fn_firstcommand_reset
-sleep 5
+fn_sleep_time_5
 exitbypass=1
 command_stop.sh
 fn_firstcommand_reset
 exitbypass=1
 command_start.sh
 fn_firstcommand_reset
-sleep 5
+fn_sleep_time_5
 exitbypass=1
 command_stop.sh
 fn_firstcommand_reset
diff --git a/lgsm/modules/fix_kf2.sh b/lgsm/modules/fix_kf2.sh
index 13176d448..cb4707414 100644
--- a/lgsm/modules/fix_kf2.sh
+++ b/lgsm/modules/fix_kf2.sh
@@ -13,7 +13,7 @@ fn_print_information "starting ${gamename} server to generate configs."
 exitbypass=1
 command_start.sh
 fn_firstcommand_reset
-sleep 10
+fn_sleep_time_10
 exitbypass=1
 command_stop.sh
 fn_firstcommand_reset
diff --git a/lgsm/modules/fix_ro.sh b/lgsm/modules/fix_ro.sh
index 6ae485dbe..72864d699 100644
--- a/lgsm/modules/fix_ro.sh
+++ b/lgsm/modules/fix_ro.sh
@@ -7,16 +7,16 @@
 
 moduleselfname="$(basename "$(readlink -f "${BASH_SOURCE[0]}")")"
 
-echo -e "Applying webinterface ROOst.css fix."
+echo -e "applying webinterface ROOst.css fix."
 echo -e "http://forums.tripwireinteractive.com/showpost.php?p=585435&postcount=13"
 sed -i 's/none}/none;/g' "${serverfiles}/Web/ServerAdmin/ROOst.css"
 sed -i 's/underline}/underline;/g' "${serverfiles}/Web/ServerAdmin/ROOst.css"
 fn_sleep_time
-echo -e "Applying webinterface CharSet fix."
+echo -e "applying webinterface CharSet fix."
 echo -e "http://forums.tripwireinteractive.com/showpost.php?p=442340&postcount=1"
 sed -i 's/CharSet="iso-8859-1"/CharSet="utf-8"/g' "${systemdir}/uweb.int"
 fn_sleep_time
-echo -e "Applying Steam AppID fix."
+echo -e "applying Steam AppID fix."
 sed -i 's/1210/1200/g' "${systemdir}/steam_appid.txt"
 fn_sleep_time
 echo -e "applying server name fix."
@@ -26,14 +26,14 @@ fn_sleep_time
 exitbypass=1
 command_start.sh
 fn_firstcommand_reset
-sleep 5
+fn_sleep_time_5
 exitbypass=1
 command_stop.sh
 fn_firstcommand_reset
 exitbypass=1
 command_start.sh
 fn_firstcommand_reset
-sleep 5
+fn_sleep_time_5
 exitbypass=1
 command_stop.sh
 fn_firstcommand_reset
diff --git a/lgsm/modules/fix_samp.sh b/lgsm/modules/fix_samp.sh
index 24882f915..0b5d0ab22 100644
--- a/lgsm/modules/fix_samp.sh
+++ b/lgsm/modules/fix_samp.sh
@@ -15,7 +15,7 @@ if [ -f "${servercfgfullpath}" ]; then
 	if [ "${currentpass}" == "${defaultpass}" ]; then
 		fixname="change default rcon password"
 		fn_fix_msg_start
-		fn_script_log_info "changing rcon/admin password."
+		fn_script_log_info "Changing rcon/admin password."
 		randomstring=$(tr -dc 'A-Za-z0-9_' < /dev/urandom 2> /dev/null | head -c 8 | xargs)
 		rconpass="admin${randomstring}"
 		sed -i "s/rcon_password changeme/rcon_password ${rconpass}/g" "${servercfgfullpath}"
@@ -27,7 +27,7 @@ if [ -f "${servercfgfullpath}" ]; then
 	if [ "${currenthostname}" == "${defaulthostname}" ]; then
 		fixname="change default hostname"
 		fn_fix_msg_start
-		fn_script_log_info "changing default hostname to LinuxGSM"
+		fn_script_log_info "Changing default hostname to LinuxGSM"
 		sed -i "s/hostname ${defaulthostname}/hostname LinuxGSM/g" "${servercfgfullpath}"
 		fn_fix_msg_end
 	fi
diff --git a/lgsm/modules/fix_ut2k4.sh b/lgsm/modules/fix_ut2k4.sh
index 2f7fc0d4d..5da1eee12 100644
--- a/lgsm/modules/fix_ut2k4.sh
+++ b/lgsm/modules/fix_ut2k4.sh
@@ -23,14 +23,14 @@ fn_sleep_time
 exitbypass=1
 command_start.sh
 fn_firstcommand_reset
-sleep 5
+fn_sleep_time_5
 exitbypass=1
 command_stop.sh
 fn_firstcommand_reset
 exitbypass=1
 command_start.sh
 fn_firstcommand_reset
-sleep 5
+fn_sleep_time_5
 exitbypass=1
 command_stop.sh
 fn_firstcommand_reset
diff --git a/lgsm/modules/fix_ut3.sh b/lgsm/modules/fix_ut3.sh
index d725de4a2..386833efc 100644
--- a/lgsm/modules/fix_ut3.sh
+++ b/lgsm/modules/fix_ut3.sh
@@ -13,7 +13,7 @@ fn_print_information "starting ${gamename} server to generate configs."
 exitbypass=1
 command_start.sh
 fn_firstcommand_reset
-sleep 10
+fn_sleep_time_10
 exitbypass=1
 command_stop.sh
 fn_firstcommand_reset
diff --git a/lgsm/modules/info_messages.sh b/lgsm/modules/info_messages.sh
index 3f0c6d235..c959df307 100644
--- a/lgsm/modules/info_messages.sh
+++ b/lgsm/modules/info_messages.sh
@@ -143,8 +143,8 @@ fn_info_message_server_resource() {
 	{
 		echo -e "${lightyellow}Storage${default}"
 		echo -e "${lightblue}Filesystem:\t${default}${filesystem}"
-		echo -e "${lightblue}Total:\t\t${default}${totalspace}"
-		echo -e "${lightblue}Used:\t\t${default}${usedspace}"
+		echo -e "${lightblue}Total:\t${default}${totalspace}"
+		echo -e "${lightblue}Used:\t${default}${usedspace}"
 		echo -e "${lightblue}Available:\t${default}${availspace}"
 	} | column -s $'\t' -t
 	echo -e ""
diff --git a/lgsm/modules/install_config.sh b/lgsm/modules/install_config.sh
index 1e3c243ab..258a7744a 100644
--- a/lgsm/modules/install_config.sh
+++ b/lgsm/modules/install_config.sh
@@ -11,7 +11,7 @@ moduleselfname="$(basename "$(readlink -f "${BASH_SOURCE[0]}")")"
 fn_check_cfgdir() {
 	if [ ! -d "${servercfgdir}" ]; then
 		echo -e "creating ${servercfgdir} config directory."
-		fn_script_log_info "creating ${servercfgdir} config directory."
+		fn_script_log_info "Creating ${servercfgdir} config directory."
 		mkdir -pv "${servercfgdir}"
 	fi
 }
@@ -25,7 +25,7 @@ fn_fetch_default_config() {
 	echo -e ""
 	echo -e "${italic}https://github.com/GameServerManagers/Game-Server-Configs${default}"
 	echo -e ""
-	fn_sleep_time
+	fn_sleep_time_1
 	mkdir -p "${lgsmdir}/config-default/config-game"
 	githuburl="https://raw.githubusercontent.com/GameServerManagers/Game-Server-Configs/main"
 	for config in "${array_configs[@]}"; do
@@ -38,7 +38,7 @@ fn_default_config_remote() {
 	for config in "${array_configs[@]}"; do
 		# every config is copied
 		echo -e "copying ${config} config file."
-		fn_script_log_info "copying ${servercfg} config file."
+		fn_script_log_info "Copying ${servercfg} config file."
 		if [ "${config}" == "${servercfgdefault}" ]; then
 			mkdir -p "${servercfgdir}"
 			cp -nv "${lgsmdir}/config-default/config-game/${config}" "${servercfgfullpath}"
@@ -82,7 +82,7 @@ fn_set_config_vars() {
 		servername="LinuxGSM"
 		rconpass="admin${randomstring}"
 		echo -e "changing hostname."
-		fn_script_log_info "changing hostname."
+		fn_script_log_info "Changing hostname."
 		fn_sleep_time
 		# prevents var from being overwritten with the servername.
 		if grep -q "SERVERNAME=SERVERNAME" "${lgsmdir}/config-default/config-game/${config}" 2> /dev/null; then
@@ -93,7 +93,7 @@ fn_set_config_vars() {
 			sed -i "s/SERVERNAME/${servername}/g" "${servercfgfullpath}"
 		fi
 		echo -e "changing rcon/admin password."
-		fn_script_log_info "changing rcon/admin password."
+		fn_script_log_info "Changing rcon/admin password."
 		if [ "${shortname}" == "squad" ]; then
 			sed -i "s/ADMINPASSWORD/${rconpass}/g" "${servercfgdir}/Rcon.cfg"
 		else
@@ -112,15 +112,15 @@ fn_set_dst_config_vars() {
 	## cluster.ini
 	if grep -Fq "SERVERNAME" "${clustercfgfullpath}"; then
 		echo -e "changing server name."
-		fn_script_log_info "changing server name."
+		fn_script_log_info "Changing server name."
 		sed -i "s/SERVERNAME/LinuxGSM/g" "${clustercfgfullpath}"
 		fn_sleep_time
 		echo -e "changing shard mode."
-		fn_script_log_info "changing shard mode."
+		fn_script_log_info "Changing shard mode."
 		sed -i "s/USESHARDING/${sharding}/g" "${clustercfgfullpath}"
 		fn_sleep_time
 		echo -e "randomizing cluster key."
-		fn_script_log_info "randomizing cluster key."
+		fn_script_log_info "Randomizing cluster key."
 		randomstring=$(tr -dc 'A-Za-z0-9_' < /dev/urandom 2> /dev/null | head -c 8 | xargs)
 		sed -i "s/CLUSTERKEY/${randomstring}/g" "${clustercfgfullpath}"
 		fn_sleep_time
@@ -139,18 +139,18 @@ fn_set_dst_config_vars() {
 	fi
 
 	echo -e "changing shard name."
-	fn_script_log_info "changing shard name."
+	fn_script_log_info "Changing shard name."
 	sed -i "s/SHARDNAME/${shard}/g" "${servercfgfullpath}"
 	fn_sleep_time
 	echo -e "changing master setting."
-	fn_script_log_info "changing master setting."
+	fn_script_log_info "Changing master setting."
 	sed -i "s/ISMASTER/${master}/g" "${servercfgfullpath}"
 	fn_sleep_time
 
 	## worldgenoverride.lua
 	if [ "${cave}" == "true" ]; then
 		echo -e "defining ${shard} as cave in ${servercfgdir}/worldgenoverride.lua."
-		fn_script_log_info "defining ${shard} as cave in ${servercfgdir}/worldgenoverride.lua."
+		fn_script_log_info "Defining ${shard} as cave in ${servercfgdir}/worldgenoverride.lua."
 		echo 'return { override_enabled = true, preset = "DST_CAVE", }' > "${servercfgdir}/worldgenoverride.lua"
 	fi
 	fn_sleep_time
diff --git a/lgsm/modules/install_eula.sh b/lgsm/modules/install_eula.sh
index 7f0229bfa..7f7f95f35 100644
--- a/lgsm/modules/install_eula.sh
+++ b/lgsm/modules/install_eula.sh
@@ -30,10 +30,10 @@ if [ -z "${autoinstall}" ]; then
 	fi
 elif [ "${commandname}" == "START" ]; then
 	fn_print_info "By continuing you are indicating your agreement to the EULA."
-	sleep 5
+	fn_sleep_time_5
 else
 	echo -e "By using auto-install you are indicating your agreement to the EULA."
-	sleep 5
+	fn_sleep_time_5
 fi
 
 if [ "${shortname}" == "ts3" ]; then
diff --git a/lgsm/modules/install_gslt.sh b/lgsm/modules/install_gslt.sh
index 772885d64..aa8d89d33 100644
--- a/lgsm/modules/install_gslt.sh
+++ b/lgsm/modules/install_gslt.sh
@@ -10,7 +10,6 @@ moduleselfname="$(basename "$(readlink -f "${BASH_SOURCE[0]}")")"
 echo -e ""
 echo -e "${bold}${lightyellow}Game Server Login Token${default}"
 fn_messages_separator
-fn_sleep_time
 if [ "${shortname}" == "csgo" ] || [ "${shortname}" == "css" ] || [ "${shortname}" == "nmrih" ] || [ "${shortname}" == "bs" ]; then
 	echo -e "GSLT is required to run a public ${gamename} server"
 	fn_script_log_info "GSLT is required to run a public ${gamename} server"
@@ -36,7 +35,7 @@ if [ -z "${autoinstall}" ]; then
 		fi
 	fi
 fi
-fn_sleep_time
+
 if [ "${shortname}" == "tu" ]; then
 	echo -e "The GSLT can be changed by editing ${servercfgdir}/${servercfg}."
 	fn_script_log_info "The GSLT can be changed by editing ${servercfgdir}/${servercfg}."
@@ -44,4 +43,5 @@ else
 	echo -e "The GSLT can be changed by editing ${configdirserver}/${selfname}.cfg."
 	fn_script_log_info "The GSLT can be changed by editing ${configdirserver}/${selfname}.cfg."
 fi
+fn_sleep_time_1
 echo -e ""
diff --git a/lgsm/modules/install_logs.sh b/lgsm/modules/install_logs.sh
index 5b12dd3e1..294bc1e46 100644
--- a/lgsm/modules/install_logs.sh
+++ b/lgsm/modules/install_logs.sh
@@ -11,9 +11,7 @@ if [ "${checklogs}" != "1" ]; then
 	echo -e ""
 	echo -e "${bold}${lightyellow}Creating Log Directories${default}"
 	fn_messages_separator
-	fn_sleep_time
 fi
-fn_sleep_time
 # Create LinuxGSM logs.
 echo -en "installing log dir: ${logdir}..."
 mkdir -p "${logdir}"
diff --git a/lgsm/modules/install_server_dir.sh b/lgsm/modules/install_server_dir.sh
index 0136e52fc..0703e0c54 100644
--- a/lgsm/modules/install_server_dir.sh
+++ b/lgsm/modules/install_server_dir.sh
@@ -10,7 +10,6 @@ moduleselfname="$(basename "$(readlink -f "${BASH_SOURCE[0]}")")"
 echo -e ""
 echo -e "${bold}${lightyellow}Server Directory${default}"
 fn_messages_separator
-fn_sleep_time
 if [ -d "${serverfiles}" ]; then
 	fn_print_warning_nl "A server is already installed here."
 fi
diff --git a/lgsm/modules/install_squad_license.sh b/lgsm/modules/install_squad_license.sh
index 604b3bcad..28f4456a5 100644
--- a/lgsm/modules/install_squad_license.sh
+++ b/lgsm/modules/install_squad_license.sh
@@ -18,7 +18,7 @@ echo -e "https://squad.fandom.com/wiki/Server_licensing"
 fn_script_log_info "Get more info and a server license here:"
 fn_script_log_info "https://squad.fandom.com/wiki/Server_licensing"
 echo -e ""
-fn_sleep_time
+fn_sleep_time_1
 echo -e "The Squad server license can be changed by editing ${servercfgdir}/License.cfg."
 fn_script_log_info "The Squad server license can be changed by editing ${selfname}."
 echo -e ""
diff --git a/lgsm/modules/install_stats.sh b/lgsm/modules/install_stats.sh
index c3e92323d..40a13434d 100644
--- a/lgsm/modules/install_stats.sh
+++ b/lgsm/modules/install_stats.sh
@@ -10,7 +10,6 @@ moduleselfname="$(basename "$(readlink -f "${BASH_SOURCE[0]}")")"
 echo -e ""
 echo -e "${bold}${lightyellow}LinuxGSM Stats${default}"
 fn_messages_separator
-fn_sleep_time
 echo -e "Assist LinuxGSM development by sending anonymous stats to developers."
 echo -e "Collected data is publicly available: ${italic}https://linuxgsm.com/data/usage${default}"
 echo -e "More info: ${italic}https://docs.linuxgsm.com/configuration/linuxgsm-stats${default}"
diff --git a/lgsm/modules/install_ts3db.sh b/lgsm/modules/install_ts3db.sh
index e5776c30f..464bd686a 100644
--- a/lgsm/modules/install_ts3db.sh
+++ b/lgsm/modules/install_ts3db.sh
@@ -45,7 +45,7 @@ fn_install_ts3db_mariadb() {
 	sed -i "s/dbpluginparameter=/dbpluginparameter=ts3db_mariadb.ini/g" "${servercfgfullpath}"
 	sed -i "s/dbsqlcreatepath=create_sqlite\//dbsqlcreatepath=create_mariadb\//g" "${servercfgfullpath}"
 	echo -e "updating ts3db_mariadb.ini."
-	fn_sleep_time
+	fn_sleep_time_1
 }
 
 echo -e ""
@@ -69,5 +69,5 @@ fn_print_information_nl "Key also saved in:"
 echo -e "${serverfiles}/privilege_key.txt"
 cd "${executabledir}" || exit
 ./ts3server_startscript.sh start inifile=ts3-server.ini 2>&1 | tee "${serverfiles}/privilege_key.txt"
-sleep 5
+fn_sleep_time_5
 ./ts3server_startscript.sh stop
diff --git a/lgsm/modules/update_fctr.sh b/lgsm/modules/update_fctr.sh
index 2eef0d4cd..8fb78ede3 100644
--- a/lgsm/modules/update_fctr.sh
+++ b/lgsm/modules/update_fctr.sh
@@ -104,7 +104,7 @@ fn_update_compare() {
 					command_start.sh
 					fn_firstcommand_reset
 					exitbypass=1
-					sleep 5
+					fn_sleep_time_5
 					command_stop.sh
 					fn_firstcommand_reset
 				fi
diff --git a/lgsm/modules/update_jk2.sh b/lgsm/modules/update_jk2.sh
index f685fd4cb..e2715c01c 100644
--- a/lgsm/modules/update_jk2.sh
+++ b/lgsm/modules/update_jk2.sh
@@ -100,7 +100,7 @@ fn_update_compare() {
 					command_start.sh
 					fn_firstcommand_reset
 					exitbypass=1
-					sleep 5
+					fn_sleep_time_5
 					command_stop.sh
 					fn_firstcommand_reset
 				fi
diff --git a/lgsm/modules/update_mc.sh b/lgsm/modules/update_mc.sh
index c4aa1b425..4a0bdde37 100644
--- a/lgsm/modules/update_mc.sh
+++ b/lgsm/modules/update_mc.sh
@@ -116,7 +116,7 @@ fn_update_compare() {
 					command_start.sh
 					fn_firstcommand_reset
 					exitbypass=1
-					sleep 5
+					fn_sleep_time_5
 					command_stop.sh
 					fn_firstcommand_reset
 				fi
diff --git a/lgsm/modules/update_mcb.sh b/lgsm/modules/update_mcb.sh
index eb8adfd12..7bd273d66 100644
--- a/lgsm/modules/update_mcb.sh
+++ b/lgsm/modules/update_mcb.sh
@@ -122,7 +122,7 @@ fn_update_compare() {
 					command_start.sh
 					fn_firstcommand_reset
 					exitbypass=1
-					sleep 5
+					fn_sleep_time_5
 					command_stop.sh
 					fn_firstcommand_reset
 				fi
diff --git a/lgsm/modules/update_mta.sh b/lgsm/modules/update_mta.sh
index cd1195563..c6f7dfcb0 100644
--- a/lgsm/modules/update_mta.sh
+++ b/lgsm/modules/update_mta.sh
@@ -108,7 +108,7 @@ fn_update_compare() {
 					command_start.sh
 					fn_firstcommand_reset
 					exitbypass=1
-					sleep 5
+					fn_sleep_time_5
 					command_stop.sh
 					fn_firstcommand_reset
 				fi
diff --git a/lgsm/modules/update_pmc.sh b/lgsm/modules/update_pmc.sh
index 9bfa82101..5d44bee21 100644
--- a/lgsm/modules/update_pmc.sh
+++ b/lgsm/modules/update_pmc.sh
@@ -126,7 +126,7 @@ fn_update_compare() {
 					command_start.sh
 					fn_firstcommand_reset
 					exitbypass=1
-					sleep 5
+					fn_sleep_time_5
 					command_stop.sh
 					fn_firstcommand_reset
 				fi
diff --git a/lgsm/modules/update_ts3.sh b/lgsm/modules/update_ts3.sh
index c00ae75cb..1fa77f428 100644
--- a/lgsm/modules/update_ts3.sh
+++ b/lgsm/modules/update_ts3.sh
@@ -108,7 +108,7 @@ fn_update_compare() {
 					command_start.sh
 					fn_firstcommand_reset
 					exitbypass=1
-					sleep 5
+					fn_sleep_time_5
 					command_stop.sh
 					fn_firstcommand_reset
 				fi
diff --git a/lgsm/modules/update_ut99.sh b/lgsm/modules/update_ut99.sh
index bdd3631f3..6d0be1941 100644
--- a/lgsm/modules/update_ut99.sh
+++ b/lgsm/modules/update_ut99.sh
@@ -102,7 +102,7 @@ fn_update_compare() {
 					command_start.sh
 					fn_firstcommand_reset
 					exitbypass=1
-					sleep 5
+					fn_sleep_time_5
 					command_stop.sh
 					fn_firstcommand_reset
 				fi
diff --git a/lgsm/modules/update_vints.sh b/lgsm/modules/update_vints.sh
index b38372058..403917e0c 100644
--- a/lgsm/modules/update_vints.sh
+++ b/lgsm/modules/update_vints.sh
@@ -109,7 +109,7 @@ fn_update_compare() {
 					command_start.sh
 					fn_firstcommand_reset
 					exitbypass=1
-					sleep 5
+					fn_sleep_time_5
 					command_stop.sh
 					fn_firstcommand_reset
 				fi
diff --git a/linuxgsm.sh b/linuxgsm.sh
index 520373d48..20adc1db6 100755
--- a/linuxgsm.sh
+++ b/linuxgsm.sh
@@ -323,17 +323,18 @@ fn_install_file() {
 
 # Prevent LinuxGSM from running as root. Except if doing a dependency install.
 if [ "$(whoami)" == "root" ]; then
-	if [ "${userinput}" == "install" ] || [ "${userinput}" == "auto-install" ] || [ "${userinput}" == "i" ] || [ "${userinput}" == "ai" ]; then
-		if [ "${shortname}" == "core" ]; then
-			echo -e "[ FAIL ] Do NOT run this script as root!"
-			exit 1
+	if [ -f "${modulesdir}/core_modules.sh" ] || [ -f "${modulesdir}/check_root.sh" ] || [ -f "${modulesdir}/core_messages.sh" ]; then
+		if [ "${userinput}" != "install" ] && [ "${userinput}" != "auto-install" ] && [ "${userinput}" != "i" ] && [ "${userinput}" != "ai" ]; then
+			core_modules.sh
+			core_messages.sh
+			fn_ansi_loader
+			check_root.sh
 		fi
-	elif [ ! -f "${modulesdir}/core_modules.sh" ] || [ ! -f "${modulesdir}/check_root.sh" ] || [ ! -f "${modulesdir}/core_messages.sh" ]; then
-		echo -e "[ FAIL ] Do NOT run this script as root!"
-		exit 1
 	else
-		core_modules.sh
-		check_root.sh
+		if [ "${userinput}" != "install" ] && [ "${userinput}" != "auto-install" ] && [ "${userinput}" != "i" ] && [ "${userinput}" != "ai" ]; then
+			echo -e "[ FAIL ] Do NOT run as root!"
+			exit 1
+		fi
 	fi
 fi
 

From 120023dcaefd9a363e16aff09622132fa36157ed Mon Sep 17 00:00:00 2001
From: Daniel Gibbs <me@danielgibbs.co.uk>
Date: Sun, 22 Oct 2023 21:47:18 +0100
Subject: [PATCH 008/154] feat: alerts refactor (#4345)

* feat(alert): add new alert types

- Added new alert types for different scenarios such as stopped, started, restarted, monitor session failure, monitor query failure, wipe, and info.
- Updated the `alert.sh` script to include functions for each new alert type.
- Modified the `command_monitor.sh` script to use the appropriate alert type based on the monitoring results.

* feat: remove more info if not enabled

* refactor: refactor alert functions and add color codes

This commit refactors the alert functions in the `alert.sh` module. It adds color codes for different types of alerts, such as green for started/restarted alerts, red for stopped/monitor session/query/permissions alerts, and blue for update/config/wipe/info alerts. The commit also updates the alert emoji to better represent each type of alert.

* feat: add colour to discord alert

* refactor: improve Pushbullet alert sending

The code in the `alert_pushbullet.sh` file has been refactored to improve the way Pushbullet alerts are sent. The curl command now includes the access token as a header instead of in the URL, resulting in more secure communication with the Pushbullet API. This change enhances the reliability and security of sending Pushbullet alerts.

* feat: add alert icon and footer to Discord alerts

- Added a new variable `alerticon` to store the URL of the alert icon image.
- Included the `alerticon` in the JSON payload for both short info and no info alerts.
- Added a footer with text "Sent by LinuxGSM v23.5.3" to the JSON payload for both short info and no info alerts.

This commit enhances the appearance of Discord alerts by adding an icon, a footer, and additional information about the sender.

* refactor(alert): refactor alert functions

- Refactored the alert functions to improve code readability and maintainability.
- Renamed variables for better clarity and consistency.
- Updated function names to be more descriptive of their purpose.
- Reorganized the order of function definitions for better organization.

* feat: add first batch of icons

* refactor: improve serverlist validation script

The commit refactors the serverlist validation script to include a new check. It now compares all game servers listed in `serverlist.csv` to `$shortname-icon.png` files in `lgsm/data/gameicons`. If a game server is listed in `serverlist.csv`, it should have a corresponding `$shortname-icon.png` file. The commit adds a loop that checks for the existence of these files and outputs an error message if any are missing.

* another batch of icons

* more icons

* updated icons

a

* feat: add serverlist game icon validation

This commit adds a new script `serverlist-validate-game-icons.sh` that checks if all the game servers listed in `serverlist.csv` have a corresponding `shortname-icon.png` file. It also verifies that the number of game icons matches the number of servers in `serverlist.csv`. The script is executed as part of the workflow defined in `serverlist-validate.yml`.

Co-authored-by: [co-author-name]

* refactor: improve game icon validation script

The commit refactors the game icon validation script to improve its functionality. It adds a check for unexpected game icons and ensures that the number of game icons matches the number of servers in serverlist.csv. The commit also updates error messages for better clarity and readability.

* refactor: remove unused mumble-icon.png game icon

The code changes involve removing the unused mumble-icon.png game icon. This change helps to clean up the codebase by removing unnecessary files.

* feat: update game icons

Updated the game icons for bf1942, pmc, vints, vpmc, and wmc. Changed resolution to 32px

* feat(alert): add alert action and information to Discord message

- Added a new variable `alertaction` to store the action performed in the alert
- Modified the Discord message template to include the alert action and information
- Updated the author name in the Discord message template to "LinuxGSM Alert"

The changes allow for more informative and descriptive alerts in Discord messages.

* feat(alert.sh): add alertaction variable

This commit adds the `alertaction` variable to the `fn_alert_*` functions in the `alert.sh` module. The `alertaction` variable is used to specify the action that triggered the alert, such as "Started", "Stopped", "Restarted", etc. This allows for more informative and descriptive alerts.

* refactor: rework email alert

* feat: add environment detail

* refactor: simplify Discord and Pushbullet alert message handling

The code changes in this commit refactor the way Discord and Pushbullet alert messages are handled. The previous implementation used separate variables for short information and no information scenarios, but now it uses a single variable for both cases. Additionally, the code now checks if the "alerturl" is empty instead of comparing it to a specific value.

These changes improve code readability and maintainability by reducing redundancy and simplifying conditional logic.

* title

* fix: update Pushover alert message formatting

The commit fixes the formatting of the Pushover alert message by removing unnecessary information and adding a conditional check for the presence of an alert URL.

* refactor: improve formatting of server IP value in Discord alert

The code changes in this commit refactor the formatting of the server IP value in the Discord alert. The value is now enclosed in single quotes for better readability.

* refactor: improve alert message formatting and remove unnecessary code

The commit refactors the alert message formatting in the `alert_pushbullet.sh`, `alert_slack.sh`, and `alert_telegram.sh` files. It improves the structure and readability of the messages by using proper markdown syntax. Additionally, it removes unnecessary code from the files to simplify their implementation.

* more changes

* feat: add server name and information fields to Discord alert

The code changes in the `alert_discord.sh` file include adding new fields for server name and information to the JSON payload sent in a Discord alert. This allows for more detailed information about the server to be included in the alert message.

refactor: improve conditional logic for Gotify alerts

In the `alert_gotify.sh` file, the code changes involve improving the conditional logic for determining which JSON payload to use when sending a Gotify alert. The updated logic checks if an alert URL is provided and selects the appropriate JSON payload accordingly.

chore: update field names in IFTTT alerts

The changes made in `alert_ifttt.sh` involve updating field names in the JSON payloads used for IFTTT alerts. The field names have been modified to match a consistent format across all fields.

fix: correct body formatting in Pushbullet alerts

The code changes made in `alert_pushbullet.sh` address an issue with incorrect body formatting in Pushbullet alerts. The body of the alert now includes separate lines for each piece of information, such as server name, information, game, server IP, hostname, and more info.

refactor: improve attachment structure in RocketChat alerts

In `alert_rocketchat.sh`, the code changes involve improving the attachment structure of RocketChat alerts. The updated structure includes separate sections for server name, information, game, server IP, hostname, and more info.

feat: add additional sections to Slack alerts

The changes made in `alert_slack.sh` include adding additional sections to Slack alerts. These sections provide separate blocks of text for server name and information within each message.

feat: add HTML formatting to Telegram alerts

In `alert_telegram.sh`, HTML formatting has been added to Telegram alerts. This allows for bold text styling and clickable links within each message sent via Telegram.

* bug

* bug

* refactor: improve alert message formatting

- Refactored the code in `alert_pushover.sh` and `alert_telegram.sh` to improve the formatting of the alert messages.
- Updated the message structure to include the server name before other information.
- Added line breaks for better readability.
- Made sure that all variables are properly interpolated within the messages.

* bug

* remove rocketchattoken

* feat: add alert types for server start, stop, restart, and wipe

- Added new alert types for server start, stop, restart, and wipe.
- Updated the `alert.sh` module to include functions for handling these new alert types.
- Modified the `command_start.sh`, `command_stop.sh`, and `command_wipe.sh` modules to trigger the corresponding alerts when appropriate.
- Updated the `alert_rocketchat.sh` module to display the relevant information for each alert type in Rocket.Chat notifications.

* refactor: update alert messages in lgsm/modules/alert.sh

- Updated the alert messages for when the game server is stopped, started, restarted, and when an LinuxGSM update is received.
- Changed the wording to use "has been" instead of "has" for consistency.
- Added a mention that the server has been restarted after receiving an LinuxGSM update.

* bug

* refactor: update alert emojis and add server time

- Updated the alert emojis in the `alert.sh` module.
- Added the server time to the alert messages in various modules (`alert_discord.sh`, `alert_gotify.sh`, `alert_ifttt.sh`, `alert_pushbullet.sh`, `alert_pushover.sh`, `alert_rocketchat.sh`, and `alert_slack.sh`).

* refactor: remove date from alert messages

The commit refactors the code in `alert_discord.sh` and `alert_slack.sh` to remove the date from the alert messages sent by LinuxGSM. This change simplifies the message content while still indicating that it was sent by LinuxGSM and includes the version number.

* feat: add statusalert option to server configs

This commit adds the "statusalert" option to the default configuration files for various game servers. The "statusalert" option allows users to enable or disable alerts on server start, stop, and restart events. This feature provides more flexibility in managing server notifications.

* feat: add alert for update and restart if necessary

The code change adds an alert for updates and restarts the service if necessary. This ensures that the service is restarted after an update to prevent any issues.

* feat: add backup alert functionality

This commit adds a new function `fn_alert_backup` to the `alert.sh` module. This function sends an alert when the system has been backed up. The alert includes a message, action, emoji, sound, and color.

In addition, this commit modifies the `command_backup.sh` module to trigger the backup alert by setting the variable `alert` to "backup" and calling `alert.sh`.

The purpose of these changes is to provide notifications when backups are created.

Co-authored-by: AI Assistant <assistant@example.com>

* refactor: change alert color to green

The code in the `alert.sh` file has been refactored to change the alert color from blue to green. This change updates the `alertcolourhex` and `alertcolourdec` variables accordingly.

---------

Co-authored-by: AI Assistant <assistant@example.com>
---
 .../serverlist-validate-game-icons.sh         |  40 ++++
 .github/workflows/serverlist-validate.sh      |  16 ++
 .github/workflows/serverlist-validate.yml     |   3 +
 .../config-lgsm/acserver/_default.cfg         |   4 +-
 .../config-lgsm/ahl2server/_default.cfg       |   4 +-
 .../config-lgsm/ahlserver/_default.cfg        |   4 +-
 .../config-lgsm/arkserver/_default.cfg        |   4 +-
 .../config-lgsm/arma3server/_default.cfg      |   4 +-
 .../config-lgsm/armarserver/_default.cfg      |   4 +-
 .../config-lgsm/atsserver/_default.cfg        |   4 +-
 .../config-lgsm/avserver/_default.cfg         |   4 +-
 .../config-lgsm/bb2server/_default.cfg        |   4 +-
 .../config-lgsm/bbserver/_default.cfg         |   4 +-
 .../config-lgsm/bdserver/_default.cfg         |   4 +-
 .../config-lgsm/bf1942server/_default.cfg     |   4 +-
 .../config-lgsm/bfvserver/_default.cfg        |   4 +-
 .../config-lgsm/bmdmserver/_default.cfg       |   4 +-
 .../config-lgsm/boserver/_default.cfg         |   4 +-
 .../config-lgsm/bsserver/_default.cfg         |   4 +-
 .../config-lgsm/btlserver/_default.cfg        |   4 +-
 .../config-lgsm/btserver/_default.cfg         |   4 +-
 .../config-lgsm/ccserver/_default.cfg         |   4 +-
 .../config-lgsm/cdserver/_default.cfg         |   4 +-
 .../config-lgsm/ckserver/_default.cfg         |   4 +-
 .../config-lgsm/cmwserver/_default.cfg        |   4 +-
 .../config-lgsm/cod2server/_default.cfg       |   4 +-
 .../config-lgsm/cod4server/_default.cfg       |   4 +-
 .../config-lgsm/codserver/_default.cfg        |   4 +-
 .../config-lgsm/coduoserver/_default.cfg      |   4 +-
 .../config-lgsm/codwawserver/_default.cfg     |   4 +-
 .../config-lgsm/colserver/_default.cfg        |   4 +-
 .../config-lgsm/csczserver/_default.cfg       |   4 +-
 .../config-lgsm/csgoserver/_default.cfg       |   4 +-
 .../config-lgsm/csserver/_default.cfg         |   4 +-
 .../config-lgsm/cssserver/_default.cfg        |   4 +-
 .../config-lgsm/ctserver/_default.cfg         |   4 +-
 .../config-lgsm/dabserver/_default.cfg        |   4 +-
 .../config-lgsm/dayzserver/_default.cfg       |   4 +-
 .../config-lgsm/dmcserver/_default.cfg        |   4 +-
 .../config-lgsm/dodrserver/_default.cfg       |   4 +-
 .../config-lgsm/dodserver/_default.cfg        |   4 +-
 .../config-lgsm/dodsserver/_default.cfg       |   4 +-
 .../config-lgsm/doiserver/_default.cfg        |   4 +-
 .../config-lgsm/dstserver/_default.cfg        |   4 +-
 .../config-lgsm/dysserver/_default.cfg        |   4 +-
 .../config-lgsm/ecoserver/_default.cfg        |   4 +-
 .../config-lgsm/emserver/_default.cfg         |   4 +-
 .../config-lgsm/etlserver/_default.cfg        |   4 +-
 .../config-lgsm/ets2server/_default.cfg       |   4 +-
 .../config-lgsm/fctrserver/_default.cfg       |   4 +-
 .../config-lgsm/fofserver/_default.cfg        |   4 +-
 .../config-lgsm/gmodserver/_default.cfg       |   4 +-
 .../config-lgsm/hcuserver/_default.cfg        |   4 +-
 .../config-lgsm/hl2dmserver/_default.cfg      |   4 +-
 .../config-lgsm/hldmserver/_default.cfg       |   4 +-
 .../config-lgsm/hldmsserver/_default.cfg      |   4 +-
 .../config-lgsm/hwserver/_default.cfg         |   4 +-
 .../config-lgsm/insserver/_default.cfg        |   4 +-
 .../config-lgsm/inssserver/_default.cfg       |   4 +-
 .../config-lgsm/iosserver/_default.cfg        |   4 +-
 .../config-lgsm/jc2server/_default.cfg        |   4 +-
 .../config-lgsm/jc3server/_default.cfg        |   4 +-
 .../config-lgsm/jk2server/_default.cfg        |   4 +-
 .../config-lgsm/kf2server/_default.cfg        |   4 +-
 .../config-lgsm/kfserver/_default.cfg         |   4 +-
 .../config-lgsm/l4d2server/_default.cfg       |   4 +-
 .../config-lgsm/l4dserver/_default.cfg        |   4 +-
 .../config-lgsm/loserver/_default.cfg         |   4 +-
 .../config-lgsm/mcbserver/_default.cfg        |   4 +-
 .../config-lgsm/mcserver/_default.cfg         |   4 +-
 .../config-lgsm/mhserver/_default.cfg         |   4 +-
 .../config-lgsm/mohaaserver/_default.cfg      |   4 +-
 .../config-lgsm/momserver/_default.cfg        |   4 +-
 .../config-lgsm/mtaserver/_default.cfg        |   4 +-
 .../config-lgsm/ndserver/_default.cfg         |   4 +-
 .../config-lgsm/necserver/_default.cfg        |   4 +-
 .../config-lgsm/nmrihserver/_default.cfg      |   4 +-
 .../config-lgsm/ns2cserver/_default.cfg       |   4 +-
 .../config-lgsm/ns2server/_default.cfg        |   4 +-
 .../config-lgsm/nsserver/_default.cfg         |   4 +-
 .../config-lgsm/ohdserver/_default.cfg        |   4 +-
 .../config-lgsm/onsetserver/_default.cfg      |   4 +-
 .../config-lgsm/opforserver/_default.cfg      |   4 +-
 .../config-lgsm/pc2server/_default.cfg        |   4 +-
 .../config-lgsm/pcserver/_default.cfg         |   4 +-
 .../config-lgsm/pmcserver/_default.cfg        |   4 +-
 .../config-lgsm/psserver/_default.cfg         |   4 +-
 .../config-lgsm/pvkiiserver/_default.cfg      |   4 +-
 .../config-lgsm/pvrserver/_default.cfg        |   4 +-
 .../config-lgsm/pzserver/_default.cfg         |   4 +-
 .../config-lgsm/q2server/_default.cfg         |   4 +-
 .../config-lgsm/q3server/_default.cfg         |   4 +-
 .../config-lgsm/qlserver/_default.cfg         |   4 +-
 .../config-lgsm/qwserver/_default.cfg         |   4 +-
 .../config-lgsm/ricochetserver/_default.cfg   |   4 +-
 .../config-lgsm/roserver/_default.cfg         |   4 +-
 .../config-lgsm/rtcwserver/_default.cfg       |   4 +-
 .../config-lgsm/rustserver/_default.cfg       |   4 +-
 .../config-lgsm/rwserver/_default.cfg         |   4 +-
 .../config-lgsm/sampserver/_default.cfg       |   4 +-
 .../config-lgsm/sbotsserver/_default.cfg      |   4 +-
 .../config-lgsm/sbserver/_default.cfg         |   4 +-
 .../config-lgsm/scpslserver/_default.cfg      |   4 +-
 .../config-lgsm/scpslsmserver/_default.cfg    |   4 +-
 .../config-lgsm/sdtdserver/_default.cfg       |   4 +-
 .../config-lgsm/sfcserver/_default.cfg        |   4 +-
 .../config-lgsm/sfserver/_default.cfg         |   4 +-
 .../config-lgsm/sof2server/_default.cfg       |   4 +-
 .../config-lgsm/solserver/_default.cfg        |   4 +-
 .../config-lgsm/squadserver/_default.cfg      |   4 +-
 .../config-lgsm/stnserver/_default.cfg        |   4 +-
 .../config-lgsm/stserver/_default.cfg         |   4 +-
 .../config-lgsm/svenserver/_default.cfg       |   4 +-
 .../config-lgsm/terrariaserver/_default.cfg   |   4 +-
 .../config-lgsm/tf2server/_default.cfg        |   4 +-
 .../config-lgsm/tfcserver/_default.cfg        |   4 +-
 .../config-lgsm/tiserver/_default.cfg         |   4 +-
 .../config-lgsm/ts3server/_default.cfg        |   4 +-
 .../config-lgsm/tsserver/_default.cfg         |   4 +-
 .../config-lgsm/tuserver/_default.cfg         |   4 +-
 .../config-lgsm/twserver/_default.cfg         |   4 +-
 .../config-lgsm/untserver/_default.cfg        |   4 +-
 .../config-lgsm/ut2k4server/_default.cfg      |   4 +-
 .../config-lgsm/ut3server/_default.cfg        |   4 +-
 .../config-lgsm/ut99server/_default.cfg       |   4 +-
 .../config-lgsm/utserver/_default.cfg         |   4 +-
 .../config-lgsm/vhserver/_default.cfg         |   4 +-
 .../config-lgsm/vintsserver/_default.cfg      |   4 +-
 .../config-lgsm/vpmcserver/_default.cfg       |   4 +-
 .../config-lgsm/vsserver/_default.cfg         |   4 +-
 .../config-lgsm/wetserver/_default.cfg        |   4 +-
 .../config-lgsm/wfserver/_default.cfg         |   4 +-
 .../config-lgsm/wmcserver/_default.cfg        |   4 +-
 .../config-lgsm/wurmserver/_default.cfg       |   4 +-
 .../config-lgsm/zmrserver/_default.cfg        |   4 +-
 .../config-lgsm/zpsserver/_default.cfg        |   4 +-
 lgsm/data/gameicons/ac-icon.png               | Bin 0 -> 1801 bytes
 lgsm/data/gameicons/ahl-icon.png              | Bin 0 -> 2983 bytes
 lgsm/data/gameicons/ahl2-icon.png             | Bin 0 -> 2532 bytes
 lgsm/data/gameicons/ark-icon.png              | Bin 0 -> 2006 bytes
 lgsm/data/gameicons/arma3-icon.png            | Bin 0 -> 954 bytes
 lgsm/data/gameicons/armar-icon.png            | Bin 0 -> 722 bytes
 lgsm/data/gameicons/ats-icon.png              | Bin 0 -> 2037 bytes
 lgsm/data/gameicons/av-icon.png               | Bin 0 -> 1983 bytes
 lgsm/data/gameicons/bb-icon.png               | Bin 0 -> 2837 bytes
 lgsm/data/gameicons/bb2-icon.png              | Bin 0 -> 2082 bytes
 lgsm/data/gameicons/bd-icon.png               | Bin 0 -> 2094 bytes
 lgsm/data/gameicons/bf1942-icon.png           | Bin 0 -> 2847 bytes
 lgsm/data/gameicons/bfv-icon.png              | Bin 0 -> 2094 bytes
 lgsm/data/gameicons/bmdm-icon.png             | Bin 0 -> 2082 bytes
 lgsm/data/gameicons/bo-icon.png               | Bin 0 -> 2030 bytes
 lgsm/data/gameicons/bs-icon.png               | Bin 0 -> 1916 bytes
 lgsm/data/gameicons/bt-icon.png               | Bin 0 -> 2091 bytes
 lgsm/data/gameicons/btl-icon.png              | Bin 0 -> 2334 bytes
 lgsm/data/gameicons/cc-icon.png               | Bin 0 -> 2147 bytes
 lgsm/data/gameicons/cd-icon.png               | Bin 0 -> 2819 bytes
 lgsm/data/gameicons/ck-icon.png               | Bin 0 -> 2828 bytes
 lgsm/data/gameicons/cmw-icon.png              | Bin 0 -> 2645 bytes
 lgsm/data/gameicons/cod-icon.png              | Bin 0 -> 2050 bytes
 lgsm/data/gameicons/cod2-icon.png             | Bin 0 -> 2707 bytes
 lgsm/data/gameicons/cod4-icon.png             | Bin 0 -> 2878 bytes
 lgsm/data/gameicons/coduo-icon.png            | Bin 0 -> 2652 bytes
 lgsm/data/gameicons/codwaw-icon.png           | Bin 0 -> 2819 bytes
 lgsm/data/gameicons/col-icon.png              | Bin 0 -> 2411 bytes
 lgsm/data/gameicons/cs-icon.png               | Bin 0 -> 2150 bytes
 lgsm/data/gameicons/cscz-icon.png             | Bin 0 -> 2362 bytes
 lgsm/data/gameicons/csgo-icon.png             | Bin 0 -> 2735 bytes
 lgsm/data/gameicons/css-icon.png              | Bin 0 -> 2791 bytes
 lgsm/data/gameicons/ct-icon.png               | Bin 0 -> 2951 bytes
 lgsm/data/gameicons/dab-icon.png              | Bin 0 -> 2589 bytes
 lgsm/data/gameicons/dayz-icon.png             | Bin 0 -> 2370 bytes
 lgsm/data/gameicons/dmc-icon.png              | Bin 0 -> 2774 bytes
 lgsm/data/gameicons/dod-icon.png              | Bin 0 -> 2489 bytes
 lgsm/data/gameicons/dodr-icon.png             | Bin 0 -> 3083 bytes
 lgsm/data/gameicons/dods-icon.png             | Bin 0 -> 2359 bytes
 lgsm/data/gameicons/doi-icon.png              | Bin 0 -> 2520 bytes
 lgsm/data/gameicons/dst-icon.png              | Bin 0 -> 3125 bytes
 lgsm/data/gameicons/dys-icon.png              | Bin 0 -> 2777 bytes
 lgsm/data/gameicons/eco-icon.png              | Bin 0 -> 2910 bytes
 lgsm/data/gameicons/em-icon.png               | Bin 0 -> 2442 bytes
 lgsm/data/gameicons/etl-icon.png              | Bin 0 -> 1774 bytes
 lgsm/data/gameicons/ets2-icon.png             | Bin 0 -> 2997 bytes
 lgsm/data/gameicons/fctr-icon.png             | Bin 0 -> 2596 bytes
 lgsm/data/gameicons/fof-icon.png              | Bin 0 -> 2491 bytes
 lgsm/data/gameicons/gmod-icon.png             | Bin 0 -> 2429 bytes
 lgsm/data/gameicons/hcu-icon.png              | Bin 0 -> 2241 bytes
 lgsm/data/gameicons/hl2dm-icon.png            | Bin 0 -> 2549 bytes
 lgsm/data/gameicons/hldm-icon.png             | Bin 0 -> 2722 bytes
 lgsm/data/gameicons/hldms-icon.png            | Bin 0 -> 2834 bytes
 lgsm/data/gameicons/hw-icon.png               | Bin 0 -> 2207 bytes
 lgsm/data/gameicons/ins-icon.png              | Bin 0 -> 2738 bytes
 lgsm/data/gameicons/inss-icon.png             | Bin 0 -> 3200 bytes
 lgsm/data/gameicons/ios-icon.png              | Bin 0 -> 2815 bytes
 lgsm/data/gameicons/jc2-icon.png              | Bin 0 -> 2983 bytes
 lgsm/data/gameicons/jc3-icon.png              | Bin 0 -> 2979 bytes
 lgsm/data/gameicons/jk2-icon.png              | Bin 0 -> 2805 bytes
 lgsm/data/gameicons/kf-icon.png               | Bin 0 -> 2687 bytes
 lgsm/data/gameicons/kf2-icon.png              | Bin 0 -> 2706 bytes
 lgsm/data/gameicons/l4d-icon.png              | Bin 0 -> 2487 bytes
 lgsm/data/gameicons/l4d2-icon.png             | Bin 0 -> 2741 bytes
 lgsm/data/gameicons/lo-icon.png               | Bin 0 -> 2747 bytes
 lgsm/data/gameicons/mc-icon.png               | Bin 0 -> 2423 bytes
 lgsm/data/gameicons/mcb-icon.png              | Bin 0 -> 2737 bytes
 lgsm/data/gameicons/mh-icon.png               | Bin 0 -> 2638 bytes
 lgsm/data/gameicons/mohaa-icon.png            | Bin 0 -> 2845 bytes
 lgsm/data/gameicons/mom-icon.png              | Bin 0 -> 3025 bytes
 lgsm/data/gameicons/mta-icon.png              | Bin 0 -> 2147 bytes
 lgsm/data/gameicons/nd-icon.png               | Bin 0 -> 2520 bytes
 lgsm/data/gameicons/nec-icon.png              | Bin 0 -> 2009 bytes
 lgsm/data/gameicons/nmrih-icon.png            | Bin 0 -> 1100 bytes
 lgsm/data/gameicons/ns-icon.png               | Bin 0 -> 3113 bytes
 lgsm/data/gameicons/ns2-icon.png              | Bin 0 -> 2859 bytes
 lgsm/data/gameicons/ns2c-icon.png             | Bin 0 -> 2603 bytes
 lgsm/data/gameicons/ohd-icon.png              | Bin 0 -> 2630 bytes
 lgsm/data/gameicons/onset-icon.png            | Bin 0 -> 2927 bytes
 lgsm/data/gameicons/opfor-icon.png            | Bin 0 -> 2428 bytes
 lgsm/data/gameicons/pc-icon.png               | Bin 0 -> 2605 bytes
 lgsm/data/gameicons/pc2-icon.png              | Bin 0 -> 2504 bytes
 lgsm/data/gameicons/pmc-icon.png              | Bin 0 -> 1312 bytes
 lgsm/data/gameicons/ps-icon.png               | Bin 0 -> 1216 bytes
 lgsm/data/gameicons/pvkii-icon.png            | Bin 0 -> 2938 bytes
 lgsm/data/gameicons/pvr-icon.png              | Bin 0 -> 3021 bytes
 lgsm/data/gameicons/pz-icon.png               | Bin 0 -> 2489 bytes
 lgsm/data/gameicons/q2-icon.png               | Bin 0 -> 2584 bytes
 lgsm/data/gameicons/q3-icon.png               | Bin 0 -> 2734 bytes
 lgsm/data/gameicons/ql-icon.png               | Bin 0 -> 2974 bytes
 lgsm/data/gameicons/qw-icon.png               | Bin 0 -> 2725 bytes
 lgsm/data/gameicons/ricochet-icon.png         | Bin 0 -> 2727 bytes
 lgsm/data/gameicons/ro-icon.png               | Bin 0 -> 2393 bytes
 lgsm/data/gameicons/rtcw-icon.png             | Bin 0 -> 2244 bytes
 lgsm/data/gameicons/rust-icon.png             | Bin 0 -> 2351 bytes
 lgsm/data/gameicons/rw-icon.png               | Bin 0 -> 2644 bytes
 lgsm/data/gameicons/samp-icon.png             | Bin 0 -> 3026 bytes
 lgsm/data/gameicons/sb-icon.png               | Bin 0 -> 2598 bytes
 lgsm/data/gameicons/sbots-icon.png            | Bin 0 -> 2927 bytes
 lgsm/data/gameicons/scpsl-icon.png            | Bin 0 -> 3090 bytes
 lgsm/data/gameicons/scpslsm-icon.png          | Bin 0 -> 3090 bytes
 lgsm/data/gameicons/sdtd-icon.png             | Bin 0 -> 2010 bytes
 lgsm/data/gameicons/sf-icon.png               | Bin 0 -> 1649 bytes
 lgsm/data/gameicons/sfc-icon.png              | Bin 0 -> 2165 bytes
 lgsm/data/gameicons/sof2-icon.png             | Bin 0 -> 1476 bytes
 lgsm/data/gameicons/sol-icon.png              | Bin 0 -> 2978 bytes
 lgsm/data/gameicons/squad-icon.png            | Bin 0 -> 2321 bytes
 lgsm/data/gameicons/st-icon.png               | Bin 0 -> 3083 bytes
 lgsm/data/gameicons/stn-icon.png              | Bin 0 -> 1622 bytes
 lgsm/data/gameicons/sven-icon.png             | Bin 0 -> 2878 bytes
 lgsm/data/gameicons/terraria-icon.png         | Bin 0 -> 2241 bytes
 lgsm/data/gameicons/tf2-icon.png              | Bin 0 -> 2745 bytes
 lgsm/data/gameicons/tfc-icon.png              | Bin 0 -> 2349 bytes
 lgsm/data/gameicons/ti-icon.png               | Bin 0 -> 2163 bytes
 lgsm/data/gameicons/ts-icon.png               | Bin 0 -> 2922 bytes
 lgsm/data/gameicons/ts3-icon.png              | Bin 0 -> 2561 bytes
 lgsm/data/gameicons/tu-icon.png               | Bin 0 -> 2389 bytes
 lgsm/data/gameicons/tw-icon.png               | Bin 0 -> 2644 bytes
 lgsm/data/gameicons/unt-icon.png              | Bin 0 -> 1495 bytes
 lgsm/data/gameicons/ut-icon.png               | Bin 0 -> 1134 bytes
 lgsm/data/gameicons/ut2k4-icon.png            | Bin 0 -> 2814 bytes
 lgsm/data/gameicons/ut3-icon.png              | Bin 0 -> 2749 bytes
 lgsm/data/gameicons/ut99-icon.png             | Bin 0 -> 2797 bytes
 lgsm/data/gameicons/vh-icon.png               | Bin 0 -> 2598 bytes
 lgsm/data/gameicons/vints-icon.png            | Bin 0 -> 9075 bytes
 lgsm/data/gameicons/vpmc-icon.png             | Bin 0 -> 1171 bytes
 lgsm/data/gameicons/vs-icon.png               | Bin 0 -> 500 bytes
 lgsm/data/gameicons/wet-icon.png              | Bin 0 -> 478 bytes
 lgsm/data/gameicons/wf-icon.png               | Bin 0 -> 2494 bytes
 lgsm/data/gameicons/wmc-icon.png              | Bin 0 -> 1017 bytes
 lgsm/data/gameicons/wurm-icon.png             | Bin 0 -> 2643 bytes
 lgsm/data/gameicons/zmr-icon.png              | Bin 0 -> 1696 bytes
 lgsm/data/gameicons/zps-icon.png              | Bin 0 -> 2679 bytes
 lgsm/modules/alert.sh                         | 200 ++++++++++++----
 lgsm/modules/alert_discord.sh                 | 160 ++++++++++---
 lgsm/modules/alert_email.sh                   |   4 +-
 lgsm/modules/alert_gotify.sh                  |  23 +-
 lgsm/modules/alert_ifttt.sh                   |  22 +-
 lgsm/modules/alert_pushbullet.sh              |  25 +-
 lgsm/modules/alert_pushover.sh                |   6 +-
 lgsm/modules/alert_rocketchat.sh              | 102 ++++++++-
 lgsm/modules/alert_slack.sh                   | 216 ++++++++++++++----
 lgsm/modules/alert_telegram.sh                |  21 +-
 lgsm/modules/check_last_update.sh             |   2 +
 lgsm/modules/command_backup.sh                |   2 +
 lgsm/modules/command_monitor.sh               |   6 +-
 lgsm/modules/command_start.sh                 |   7 +
 lgsm/modules/command_stop.sh                  |  24 ++
 lgsm/modules/command_wipe.sh                  |   4 +
 lgsm/modules/info_messages.sh                 |  20 +-
 286 files changed, 1139 insertions(+), 296 deletions(-)
 create mode 100755 .github/workflows/serverlist-validate-game-icons.sh
 create mode 100644 lgsm/data/gameicons/ac-icon.png
 create mode 100644 lgsm/data/gameicons/ahl-icon.png
 create mode 100644 lgsm/data/gameicons/ahl2-icon.png
 create mode 100644 lgsm/data/gameicons/ark-icon.png
 create mode 100644 lgsm/data/gameicons/arma3-icon.png
 create mode 100644 lgsm/data/gameicons/armar-icon.png
 create mode 100644 lgsm/data/gameicons/ats-icon.png
 create mode 100644 lgsm/data/gameicons/av-icon.png
 create mode 100644 lgsm/data/gameicons/bb-icon.png
 create mode 100644 lgsm/data/gameicons/bb2-icon.png
 create mode 100644 lgsm/data/gameicons/bd-icon.png
 create mode 100644 lgsm/data/gameicons/bf1942-icon.png
 create mode 100644 lgsm/data/gameicons/bfv-icon.png
 create mode 100644 lgsm/data/gameicons/bmdm-icon.png
 create mode 100644 lgsm/data/gameicons/bo-icon.png
 create mode 100644 lgsm/data/gameicons/bs-icon.png
 create mode 100644 lgsm/data/gameicons/bt-icon.png
 create mode 100644 lgsm/data/gameicons/btl-icon.png
 create mode 100644 lgsm/data/gameicons/cc-icon.png
 create mode 100644 lgsm/data/gameicons/cd-icon.png
 create mode 100644 lgsm/data/gameicons/ck-icon.png
 create mode 100644 lgsm/data/gameicons/cmw-icon.png
 create mode 100644 lgsm/data/gameicons/cod-icon.png
 create mode 100644 lgsm/data/gameicons/cod2-icon.png
 create mode 100644 lgsm/data/gameicons/cod4-icon.png
 create mode 100644 lgsm/data/gameicons/coduo-icon.png
 create mode 100644 lgsm/data/gameicons/codwaw-icon.png
 create mode 100644 lgsm/data/gameicons/col-icon.png
 create mode 100644 lgsm/data/gameicons/cs-icon.png
 create mode 100644 lgsm/data/gameicons/cscz-icon.png
 create mode 100644 lgsm/data/gameicons/csgo-icon.png
 create mode 100644 lgsm/data/gameicons/css-icon.png
 create mode 100644 lgsm/data/gameicons/ct-icon.png
 create mode 100644 lgsm/data/gameicons/dab-icon.png
 create mode 100644 lgsm/data/gameicons/dayz-icon.png
 create mode 100644 lgsm/data/gameicons/dmc-icon.png
 create mode 100644 lgsm/data/gameicons/dod-icon.png
 create mode 100644 lgsm/data/gameicons/dodr-icon.png
 create mode 100644 lgsm/data/gameicons/dods-icon.png
 create mode 100644 lgsm/data/gameicons/doi-icon.png
 create mode 100644 lgsm/data/gameicons/dst-icon.png
 create mode 100644 lgsm/data/gameicons/dys-icon.png
 create mode 100644 lgsm/data/gameicons/eco-icon.png
 create mode 100644 lgsm/data/gameicons/em-icon.png
 create mode 100644 lgsm/data/gameicons/etl-icon.png
 create mode 100644 lgsm/data/gameicons/ets2-icon.png
 create mode 100644 lgsm/data/gameicons/fctr-icon.png
 create mode 100644 lgsm/data/gameicons/fof-icon.png
 create mode 100644 lgsm/data/gameicons/gmod-icon.png
 create mode 100644 lgsm/data/gameicons/hcu-icon.png
 create mode 100644 lgsm/data/gameicons/hl2dm-icon.png
 create mode 100644 lgsm/data/gameicons/hldm-icon.png
 create mode 100644 lgsm/data/gameicons/hldms-icon.png
 create mode 100644 lgsm/data/gameicons/hw-icon.png
 create mode 100644 lgsm/data/gameicons/ins-icon.png
 create mode 100644 lgsm/data/gameicons/inss-icon.png
 create mode 100644 lgsm/data/gameicons/ios-icon.png
 create mode 100644 lgsm/data/gameicons/jc2-icon.png
 create mode 100644 lgsm/data/gameicons/jc3-icon.png
 create mode 100644 lgsm/data/gameicons/jk2-icon.png
 create mode 100644 lgsm/data/gameicons/kf-icon.png
 create mode 100644 lgsm/data/gameicons/kf2-icon.png
 create mode 100644 lgsm/data/gameicons/l4d-icon.png
 create mode 100644 lgsm/data/gameicons/l4d2-icon.png
 create mode 100644 lgsm/data/gameicons/lo-icon.png
 create mode 100644 lgsm/data/gameicons/mc-icon.png
 create mode 100644 lgsm/data/gameicons/mcb-icon.png
 create mode 100644 lgsm/data/gameicons/mh-icon.png
 create mode 100644 lgsm/data/gameicons/mohaa-icon.png
 create mode 100644 lgsm/data/gameicons/mom-icon.png
 create mode 100644 lgsm/data/gameicons/mta-icon.png
 create mode 100644 lgsm/data/gameicons/nd-icon.png
 create mode 100644 lgsm/data/gameicons/nec-icon.png
 create mode 100644 lgsm/data/gameicons/nmrih-icon.png
 create mode 100644 lgsm/data/gameicons/ns-icon.png
 create mode 100644 lgsm/data/gameicons/ns2-icon.png
 create mode 100644 lgsm/data/gameicons/ns2c-icon.png
 create mode 100644 lgsm/data/gameicons/ohd-icon.png
 create mode 100644 lgsm/data/gameicons/onset-icon.png
 create mode 100644 lgsm/data/gameicons/opfor-icon.png
 create mode 100644 lgsm/data/gameicons/pc-icon.png
 create mode 100644 lgsm/data/gameicons/pc2-icon.png
 create mode 100644 lgsm/data/gameicons/pmc-icon.png
 create mode 100644 lgsm/data/gameicons/ps-icon.png
 create mode 100644 lgsm/data/gameicons/pvkii-icon.png
 create mode 100644 lgsm/data/gameicons/pvr-icon.png
 create mode 100644 lgsm/data/gameicons/pz-icon.png
 create mode 100644 lgsm/data/gameicons/q2-icon.png
 create mode 100644 lgsm/data/gameicons/q3-icon.png
 create mode 100644 lgsm/data/gameicons/ql-icon.png
 create mode 100644 lgsm/data/gameicons/qw-icon.png
 create mode 100644 lgsm/data/gameicons/ricochet-icon.png
 create mode 100644 lgsm/data/gameicons/ro-icon.png
 create mode 100644 lgsm/data/gameicons/rtcw-icon.png
 create mode 100644 lgsm/data/gameicons/rust-icon.png
 create mode 100644 lgsm/data/gameicons/rw-icon.png
 create mode 100644 lgsm/data/gameicons/samp-icon.png
 create mode 100644 lgsm/data/gameicons/sb-icon.png
 create mode 100644 lgsm/data/gameicons/sbots-icon.png
 create mode 100644 lgsm/data/gameicons/scpsl-icon.png
 create mode 100644 lgsm/data/gameicons/scpslsm-icon.png
 create mode 100644 lgsm/data/gameicons/sdtd-icon.png
 create mode 100644 lgsm/data/gameicons/sf-icon.png
 create mode 100644 lgsm/data/gameicons/sfc-icon.png
 create mode 100644 lgsm/data/gameicons/sof2-icon.png
 create mode 100644 lgsm/data/gameicons/sol-icon.png
 create mode 100644 lgsm/data/gameicons/squad-icon.png
 create mode 100644 lgsm/data/gameicons/st-icon.png
 create mode 100644 lgsm/data/gameicons/stn-icon.png
 create mode 100644 lgsm/data/gameicons/sven-icon.png
 create mode 100644 lgsm/data/gameicons/terraria-icon.png
 create mode 100644 lgsm/data/gameicons/tf2-icon.png
 create mode 100644 lgsm/data/gameicons/tfc-icon.png
 create mode 100644 lgsm/data/gameicons/ti-icon.png
 create mode 100644 lgsm/data/gameicons/ts-icon.png
 create mode 100644 lgsm/data/gameicons/ts3-icon.png
 create mode 100644 lgsm/data/gameicons/tu-icon.png
 create mode 100644 lgsm/data/gameicons/tw-icon.png
 create mode 100644 lgsm/data/gameicons/unt-icon.png
 create mode 100644 lgsm/data/gameicons/ut-icon.png
 create mode 100644 lgsm/data/gameicons/ut2k4-icon.png
 create mode 100644 lgsm/data/gameicons/ut3-icon.png
 create mode 100644 lgsm/data/gameicons/ut99-icon.png
 create mode 100644 lgsm/data/gameicons/vh-icon.png
 create mode 100644 lgsm/data/gameicons/vints-icon.png
 create mode 100644 lgsm/data/gameicons/vpmc-icon.png
 create mode 100644 lgsm/data/gameicons/vs-icon.png
 create mode 100644 lgsm/data/gameicons/wet-icon.png
 create mode 100644 lgsm/data/gameicons/wf-icon.png
 create mode 100644 lgsm/data/gameicons/wmc-icon.png
 create mode 100644 lgsm/data/gameicons/wurm-icon.png
 create mode 100644 lgsm/data/gameicons/zmr-icon.png
 create mode 100644 lgsm/data/gameicons/zps-icon.png

diff --git a/.github/workflows/serverlist-validate-game-icons.sh b/.github/workflows/serverlist-validate-game-icons.sh
new file mode 100755
index 000000000..ca41892c9
--- /dev/null
+++ b/.github/workflows/serverlist-validate-game-icons.sh
@@ -0,0 +1,40 @@
+#!/bin/bash
+
+cd "lgsm/data" || exit
+
+echo ""
+echo "Checking that all the game servers listed in serverlist.csv have a shortname-icon.png file"
+for shortname in $(tail -n +2 serverlist.csv | cut -d ',' -f1); do
+	# check if $shortname-icon.png exists
+	if [ ! -f "gameicons/${shortname}-icon.png" ]; then
+		echo "ERROR: gameicons/${shortname}-icon.png does not exist"
+		exitcode=1
+	else
+		echo "OK: gameicons/${shortname}-icon.png exists"
+	fi
+done
+
+echo ""
+echo "Checking if an unexpected gameicon exists"
+for gameicon in $(ls -1 gameicons); do
+	# check if $gameicon is in serverlist.csv
+	if ! grep -q "${gameicon%-icon.png}" serverlist.csv; then
+		echo "ERROR: gameicon ${gameicon} is not in serverlist.csv"
+		exitcode=1
+	else
+		echo "OK: gameicon ${gameicon} is in serverlist.csv"
+	fi
+done
+
+echo ""
+echo "Checking that the number of gameicons matches the number of servers in serverlist.csv"
+gameiconcount="$(ls -1 gameicons | wc -l)"
+serverlistcount="$(tail -n +2 serverlist.csv | wc -l)"
+if [ "${gameiconcount}" -ne "${serverlistcount}" ]; then
+	echo "ERROR: game icons (${gameiconcount}) does not match serverlist.csv ($serverlistcount)"
+	exitcode=1
+else
+	echo "OK: gameiconcount ($gameiconcount) matches serverlistcount ($serverlistcount)"
+fi
+
+exit ${exitcode}
diff --git a/.github/workflows/serverlist-validate.sh b/.github/workflows/serverlist-validate.sh
index bc192ec37..0c7634018 100755
--- a/.github/workflows/serverlist-validate.sh
+++ b/.github/workflows/serverlist-validate.sh
@@ -19,4 +19,20 @@ for csv in $csvlist; do
 	fi
 done
 
+# Compare all game servers listed in serverlist.csv to $shortname-icon.png files in lgsm/data/gameicons
+# if the game server is listed in serverlist.csv then it will have a $shortname-icon.png file
+
+# loop though shortname in serverlist.csv
+echo ""
+echo "Checking that all the game servers listed in serverlist.csv have a shortname-icon.png file"
+for shortname in $(tail -n +2 serverlist.csv | cut -d ',' -f1); do
+	# check if $shortname-icon.png exists
+	if [ ! -f "gameicons/${shortname}-icon.png" ]; then
+		echo "ERROR: gameicons/${shortname}-icon.png does not exist"
+		exitcode=1
+	else
+		echo "OK: gameicons/${shortname}-icon.png exists"
+	fi
+done
+
 exit ${exitcode}
diff --git a/.github/workflows/serverlist-validate.yml b/.github/workflows/serverlist-validate.yml
index 13f7376a1..931329571 100644
--- a/.github/workflows/serverlist-validate.yml
+++ b/.github/workflows/serverlist-validate.yml
@@ -12,3 +12,6 @@ jobs:
 
       - name: Compare Versions
         run: chmod +x .github/workflows/serverlist-validate.sh; .github/workflows/serverlist-validate.sh
+
+      - name: Validate Game Icons
+        run: chmod +x .github/workflows/serverlist-validate-game-icons.sh; .github/workflows/serverlist-validate-game-icons.sh
diff --git a/lgsm/config-default/config-lgsm/acserver/_default.cfg b/lgsm/config-default/config-lgsm/acserver/_default.cfg
index c6aeb7b63..b3ad14caf 100644
--- a/lgsm/config-default/config-lgsm/acserver/_default.cfg
+++ b/lgsm/config-default/config-lgsm/acserver/_default.cfg
@@ -32,6 +32,9 @@ displayip=""
 # More info | https://docs.linuxgsm.com/alerts#more-info
 postalert="off"
 
+# Alert on Start/Stop/Restart
+statusalert="off"
+
 # Discord Alerts | https://docs.linuxgsm.com/alerts/discord
 discordalert="off"
 discordwebhook="webhook"
@@ -64,7 +67,6 @@ pushoveruserkey="userkey"
 # Rocket.Chat Alerts | https://docs.linuxgsm.com/alerts/rocket.chat
 rocketchatalert="off"
 rocketchatwebhook="webhook"
-rocketchattoken=""
 
 # Slack Alerts | https://docs.linuxgsm.com/alerts/slack
 slackalert="off"
diff --git a/lgsm/config-default/config-lgsm/ahl2server/_default.cfg b/lgsm/config-default/config-lgsm/ahl2server/_default.cfg
index fa8f9fa90..086047093 100644
--- a/lgsm/config-default/config-lgsm/ahl2server/_default.cfg
+++ b/lgsm/config-default/config-lgsm/ahl2server/_default.cfg
@@ -40,6 +40,9 @@ displayip=""
 # More info | https://docs.linuxgsm.com/alerts#more-info
 postalert="off"
 
+# Alert on Start/Stop/Restart
+statusalert="off"
+
 # Discord Alerts | https://docs.linuxgsm.com/alerts/discord
 discordalert="off"
 discordwebhook="webhook"
@@ -72,7 +75,6 @@ pushoveruserkey="userkey"
 # Rocket.Chat Alerts | https://docs.linuxgsm.com/alerts/rocket.chat
 rocketchatalert="off"
 rocketchatwebhook="webhook"
-rocketchattoken=""
 
 # Slack Alerts | https://docs.linuxgsm.com/alerts/slack
 slackalert="off"
diff --git a/lgsm/config-default/config-lgsm/ahlserver/_default.cfg b/lgsm/config-default/config-lgsm/ahlserver/_default.cfg
index 6b8012b36..fb7725e1f 100644
--- a/lgsm/config-default/config-lgsm/ahlserver/_default.cfg
+++ b/lgsm/config-default/config-lgsm/ahlserver/_default.cfg
@@ -35,6 +35,9 @@ displayip=""
 # More info | https://docs.linuxgsm.com/alerts#more-info
 postalert="off"
 
+# Alert on Start/Stop/Restart
+statusalert="off"
+
 # Discord Alerts | https://docs.linuxgsm.com/alerts/discord
 discordalert="off"
 discordwebhook="webhook"
@@ -67,7 +70,6 @@ pushoveruserkey="userkey"
 # Rocket.Chat Alerts | https://docs.linuxgsm.com/alerts/rocket.chat
 rocketchatalert="off"
 rocketchatwebhook="webhook"
-rocketchattoken=""
 
 # Slack Alerts | https://docs.linuxgsm.com/alerts/slack
 slackalert="off"
diff --git a/lgsm/config-default/config-lgsm/arkserver/_default.cfg b/lgsm/config-default/config-lgsm/arkserver/_default.cfg
index 6e3b466fd..7f38c974f 100644
--- a/lgsm/config-default/config-lgsm/arkserver/_default.cfg
+++ b/lgsm/config-default/config-lgsm/arkserver/_default.cfg
@@ -38,6 +38,9 @@ displayip=""
 # More info | https://docs.linuxgsm.com/alerts#more-info
 postalert="off"
 
+# Alert on Start/Stop/Restart
+statusalert="off"
+
 # Discord Alerts | https://docs.linuxgsm.com/alerts/discord
 discordalert="off"
 discordwebhook="webhook"
@@ -70,7 +73,6 @@ pushoveruserkey="userkey"
 # Rocket.Chat Alerts | https://docs.linuxgsm.com/alerts/rocket.chat
 rocketchatalert="off"
 rocketchatwebhook="webhook"
-rocketchattoken=""
 
 # Slack Alerts | https://docs.linuxgsm.com/alerts/slack
 slackalert="off"
diff --git a/lgsm/config-default/config-lgsm/arma3server/_default.cfg b/lgsm/config-default/config-lgsm/arma3server/_default.cfg
index 8a59a6fb1..f89b751ed 100644
--- a/lgsm/config-default/config-lgsm/arma3server/_default.cfg
+++ b/lgsm/config-default/config-lgsm/arma3server/_default.cfg
@@ -51,6 +51,9 @@ displayip=""
 # More info | https://docs.linuxgsm.com/alerts#more-info
 postalert="off"
 
+# Alert on Start/Stop/Restart
+statusalert="off"
+
 # Discord Alerts | https://docs.linuxgsm.com/alerts/discord
 discordalert="off"
 discordwebhook="webhook"
@@ -83,7 +86,6 @@ pushoveruserkey="userkey"
 # Rocket.Chat Alerts | https://docs.linuxgsm.com/alerts/rocket.chat
 rocketchatalert="off"
 rocketchatwebhook="webhook"
-rocketchattoken=""
 
 # Slack Alerts | https://docs.linuxgsm.com/alerts/slack
 slackalert="off"
diff --git a/lgsm/config-default/config-lgsm/armarserver/_default.cfg b/lgsm/config-default/config-lgsm/armarserver/_default.cfg
index 913447e47..3637f469b 100644
--- a/lgsm/config-default/config-lgsm/armarserver/_default.cfg
+++ b/lgsm/config-default/config-lgsm/armarserver/_default.cfg
@@ -36,6 +36,9 @@ displayip=""
 # More info | https://docs.linuxgsm.com/alerts#more-info
 postalert="off"
 
+# Alert on Start/Stop/Restart
+statusalert="off"
+
 # Discord Alerts | https://docs.linuxgsm.com/alerts/discord
 discordalert="off"
 discordwebhook="webhook"
@@ -68,7 +71,6 @@ pushoveruserkey="userkey"
 # Rocket.Chat Alerts | https://docs.linuxgsm.com/alerts/rocket.chat
 rocketchatalert="off"
 rocketchatwebhook="webhook"
-rocketchattoken=""
 
 # Slack Alerts | https://docs.linuxgsm.com/alerts/slack
 slackalert="off"
diff --git a/lgsm/config-default/config-lgsm/atsserver/_default.cfg b/lgsm/config-default/config-lgsm/atsserver/_default.cfg
index 04b795dc5..9d8125a31 100644
--- a/lgsm/config-default/config-lgsm/atsserver/_default.cfg
+++ b/lgsm/config-default/config-lgsm/atsserver/_default.cfg
@@ -28,6 +28,9 @@ displayip=""
 # More info | https://docs.linuxgsm.com/alerts#more-info
 postalert="off"
 
+# Alert on Start/Stop/Restart
+statusalert="off"
+
 # Discord Alerts | https://docs.linuxgsm.com/alerts/discord
 discordalert="off"
 discordwebhook="webhook"
@@ -60,7 +63,6 @@ pushoveruserkey="userkey"
 # Rocket.Chat Alerts | https://docs.linuxgsm.com/alerts/rocket.chat
 rocketchatalert="off"
 rocketchatwebhook="webhook"
-rocketchattoken=""
 
 # Slack Alerts | https://docs.linuxgsm.com/alerts/slack
 slackalert="off"
diff --git a/lgsm/config-default/config-lgsm/avserver/_default.cfg b/lgsm/config-default/config-lgsm/avserver/_default.cfg
index 45cd149b2..5777198c8 100644
--- a/lgsm/config-default/config-lgsm/avserver/_default.cfg
+++ b/lgsm/config-default/config-lgsm/avserver/_default.cfg
@@ -28,6 +28,9 @@ displayip=""
 # More info | https://docs.linuxgsm.com/alerts#more-info
 postalert="off"
 
+# Alert on Start/Stop/Restart
+statusalert="off"
+
 # Discord Alerts | https://docs.linuxgsm.com/alerts/discord
 discordalert="off"
 discordwebhook="webhook"
@@ -60,7 +63,6 @@ pushoveruserkey="userkey"
 # Rocket.Chat Alerts | https://docs.linuxgsm.com/alerts/rocket.chat
 rocketchatalert="off"
 rocketchatwebhook="webhook"
-rocketchattoken=""
 
 # Slack Alerts | https://docs.linuxgsm.com/alerts/slack
 slackalert="off"
diff --git a/lgsm/config-default/config-lgsm/bb2server/_default.cfg b/lgsm/config-default/config-lgsm/bb2server/_default.cfg
index 4076878d4..c52c8c540 100644
--- a/lgsm/config-default/config-lgsm/bb2server/_default.cfg
+++ b/lgsm/config-default/config-lgsm/bb2server/_default.cfg
@@ -41,6 +41,9 @@ displayip=""
 # More info | https://docs.linuxgsm.com/alerts#more-info
 postalert="off"
 
+# Alert on Start/Stop/Restart
+statusalert="off"
+
 # Discord Alerts | https://docs.linuxgsm.com/alerts/discord
 discordalert="off"
 discordwebhook="webhook"
@@ -73,7 +76,6 @@ pushoveruserkey="userkey"
 # Rocket.Chat Alerts | https://docs.linuxgsm.com/alerts/rocket.chat
 rocketchatalert="off"
 rocketchatwebhook="webhook"
-rocketchattoken=""
 
 # Slack Alerts | https://docs.linuxgsm.com/alerts/slack
 slackalert="off"
diff --git a/lgsm/config-default/config-lgsm/bbserver/_default.cfg b/lgsm/config-default/config-lgsm/bbserver/_default.cfg
index 9932d4ffe..2cfabab9c 100644
--- a/lgsm/config-default/config-lgsm/bbserver/_default.cfg
+++ b/lgsm/config-default/config-lgsm/bbserver/_default.cfg
@@ -35,6 +35,9 @@ displayip=""
 # More info | https://docs.linuxgsm.com/alerts#more-info
 postalert="off"
 
+# Alert on Start/Stop/Restart
+statusalert="off"
+
 # Discord Alerts | https://docs.linuxgsm.com/alerts/discord
 discordalert="off"
 discordwebhook="webhook"
@@ -67,7 +70,6 @@ pushoveruserkey="userkey"
 # Rocket.Chat Alerts | https://docs.linuxgsm.com/alerts/rocket.chat
 rocketchatalert="off"
 rocketchatwebhook="webhook"
-rocketchattoken=""
 
 # Slack Alerts | https://docs.linuxgsm.com/alerts/slack
 slackalert="off"
diff --git a/lgsm/config-default/config-lgsm/bdserver/_default.cfg b/lgsm/config-default/config-lgsm/bdserver/_default.cfg
index 7fcdb4e1d..674fabb10 100644
--- a/lgsm/config-default/config-lgsm/bdserver/_default.cfg
+++ b/lgsm/config-default/config-lgsm/bdserver/_default.cfg
@@ -35,6 +35,9 @@ displayip=""
 # More info | https://docs.linuxgsm.com/alerts#more-info
 postalert="off"
 
+# Alert on Start/Stop/Restart
+statusalert="off"
+
 # Discord Alerts | https://docs.linuxgsm.com/alerts/discord
 discordalert="off"
 discordwebhook="webhook"
@@ -67,7 +70,6 @@ pushoveruserkey="userkey"
 # Rocket.Chat Alerts | https://docs.linuxgsm.com/alerts/rocket.chat
 rocketchatalert="off"
 rocketchatwebhook="webhook"
-rocketchattoken=""
 
 # Slack Alerts | https://docs.linuxgsm.com/alerts/slack
 slackalert="off"
diff --git a/lgsm/config-default/config-lgsm/bf1942server/_default.cfg b/lgsm/config-default/config-lgsm/bf1942server/_default.cfg
index d99068522..5bd576b22 100644
--- a/lgsm/config-default/config-lgsm/bf1942server/_default.cfg
+++ b/lgsm/config-default/config-lgsm/bf1942server/_default.cfg
@@ -28,6 +28,9 @@ displayip=""
 # More info | https://docs.linuxgsm.com/alerts#more-info
 postalert="off"
 
+# Alert on Start/Stop/Restart
+statusalert="off"
+
 # Discord Alerts | https://docs.linuxgsm.com/alerts/discord
 discordalert="off"
 discordwebhook="webhook"
@@ -60,7 +63,6 @@ pushoveruserkey="userkey"
 # Rocket.Chat Alerts | https://docs.linuxgsm.com/alerts/rocket.chat
 rocketchatalert="off"
 rocketchatwebhook="webhook"
-rocketchattoken=""
 
 # Slack Alerts | https://docs.linuxgsm.com/alerts/slack
 slackalert="off"
diff --git a/lgsm/config-default/config-lgsm/bfvserver/_default.cfg b/lgsm/config-default/config-lgsm/bfvserver/_default.cfg
index c6e4b8bb7..66c4ef8fc 100644
--- a/lgsm/config-default/config-lgsm/bfvserver/_default.cfg
+++ b/lgsm/config-default/config-lgsm/bfvserver/_default.cfg
@@ -28,6 +28,9 @@ displayip=""
 # More info | https://docs.linuxgsm.com/alerts#more-info
 postalert="off"
 
+# Alert on Start/Stop/Restart
+statusalert="off"
+
 # Discord Alerts | https://docs.linuxgsm.com/alerts/discord
 discordalert="off"
 discordwebhook="webhook"
@@ -60,7 +63,6 @@ pushoveruserkey="userkey"
 # Rocket.Chat Alerts | https://docs.linuxgsm.com/alerts/rocket.chat
 rocketchatalert="off"
 rocketchatwebhook="webhook"
-rocketchattoken=""
 
 # Slack Alerts | https://docs.linuxgsm.com/alerts/slack
 slackalert="off"
diff --git a/lgsm/config-default/config-lgsm/bmdmserver/_default.cfg b/lgsm/config-default/config-lgsm/bmdmserver/_default.cfg
index b17a16f4d..dfe04bcd8 100644
--- a/lgsm/config-default/config-lgsm/bmdmserver/_default.cfg
+++ b/lgsm/config-default/config-lgsm/bmdmserver/_default.cfg
@@ -41,6 +41,9 @@ displayip=""
 # More info | https://docs.linuxgsm.com/alerts#more-info
 postalert="off"
 
+# Alert on Start/Stop/Restart
+statusalert="off"
+
 # Discord Alerts | https://docs.linuxgsm.com/alerts/discord
 discordalert="off"
 discordwebhook="webhook"
@@ -73,7 +76,6 @@ pushoveruserkey="userkey"
 # Rocket.Chat Alerts | https://docs.linuxgsm.com/alerts/rocket.chat
 rocketchatalert="off"
 rocketchatwebhook="webhook"
-rocketchattoken=""
 
 # Slack Alerts | https://docs.linuxgsm.com/alerts/slack
 slackalert="off"
diff --git a/lgsm/config-default/config-lgsm/boserver/_default.cfg b/lgsm/config-default/config-lgsm/boserver/_default.cfg
index 1ede22c39..d6e2b4f4f 100644
--- a/lgsm/config-default/config-lgsm/boserver/_default.cfg
+++ b/lgsm/config-default/config-lgsm/boserver/_default.cfg
@@ -33,6 +33,9 @@ displayip=""
 # More info | https://docs.linuxgsm.com/alerts#more-info
 postalert="off"
 
+# Alert on Start/Stop/Restart
+statusalert="off"
+
 # Discord Alerts | https://docs.linuxgsm.com/alerts/discord
 discordalert="off"
 discordwebhook="webhook"
@@ -65,7 +68,6 @@ pushoveruserkey="userkey"
 # Rocket.Chat Alerts | https://docs.linuxgsm.com/alerts/rocket.chat
 rocketchatalert="off"
 rocketchatwebhook="webhook"
-rocketchattoken=""
 
 # Slack Alerts | https://docs.linuxgsm.com/alerts/slack
 slackalert="off"
diff --git a/lgsm/config-default/config-lgsm/bsserver/_default.cfg b/lgsm/config-default/config-lgsm/bsserver/_default.cfg
index d01696170..b5f6017c0 100644
--- a/lgsm/config-default/config-lgsm/bsserver/_default.cfg
+++ b/lgsm/config-default/config-lgsm/bsserver/_default.cfg
@@ -45,6 +45,9 @@ displayip=""
 # More info | https://docs.linuxgsm.com/alerts#more-info
 postalert="off"
 
+# Alert on Start/Stop/Restart
+statusalert="off"
+
 # Discord Alerts | https://docs.linuxgsm.com/alerts/discord
 discordalert="off"
 discordwebhook="webhook"
@@ -77,7 +80,6 @@ pushoveruserkey="userkey"
 # Rocket.Chat Alerts | https://docs.linuxgsm.com/alerts/rocket.chat
 rocketchatalert="off"
 rocketchatwebhook="webhook"
-rocketchattoken=""
 
 # Slack Alerts | https://docs.linuxgsm.com/alerts/slack
 slackalert="off"
diff --git a/lgsm/config-default/config-lgsm/btlserver/_default.cfg b/lgsm/config-default/config-lgsm/btlserver/_default.cfg
index aeaadea9b..b6cf3da34 100644
--- a/lgsm/config-default/config-lgsm/btlserver/_default.cfg
+++ b/lgsm/config-default/config-lgsm/btlserver/_default.cfg
@@ -33,6 +33,9 @@ displayip=""
 # More info | https://docs.linuxgsm.com/alerts#more-info
 postalert="off"
 
+# Alert on Start/Stop/Restart
+statusalert="off"
+
 # Discord Alerts | https://docs.linuxgsm.com/alerts/discord
 discordalert="off"
 discordwebhook="webhook"
@@ -65,7 +68,6 @@ pushoveruserkey="userkey"
 # Rocket.Chat Alerts | https://docs.linuxgsm.com/alerts/rocket.chat
 rocketchatalert="off"
 rocketchatwebhook="webhook"
-rocketchattoken=""
 
 # Slack Alerts | https://docs.linuxgsm.com/alerts/slack
 slackalert="off"
diff --git a/lgsm/config-default/config-lgsm/btserver/_default.cfg b/lgsm/config-default/config-lgsm/btserver/_default.cfg
index 636136580..c02b8c6ca 100644
--- a/lgsm/config-default/config-lgsm/btserver/_default.cfg
+++ b/lgsm/config-default/config-lgsm/btserver/_default.cfg
@@ -28,6 +28,9 @@ displayip=""
 # More info | https://docs.linuxgsm.com/alerts#more-info
 postalert="off"
 
+# Alert on Start/Stop/Restart
+statusalert="off"
+
 # Discord Alerts | https://docs.linuxgsm.com/alerts/discord
 discordalert="off"
 discordwebhook="webhook"
@@ -60,7 +63,6 @@ pushoveruserkey="userkey"
 # Rocket.Chat Alerts | https://docs.linuxgsm.com/alerts/rocket.chat
 rocketchatalert="off"
 rocketchatwebhook="webhook"
-rocketchattoken=""
 
 # Slack Alerts | https://docs.linuxgsm.com/alerts/slack
 slackalert="off"
diff --git a/lgsm/config-default/config-lgsm/ccserver/_default.cfg b/lgsm/config-default/config-lgsm/ccserver/_default.cfg
index 1b8617e11..a8cd9f6d2 100644
--- a/lgsm/config-default/config-lgsm/ccserver/_default.cfg
+++ b/lgsm/config-default/config-lgsm/ccserver/_default.cfg
@@ -36,6 +36,9 @@ displayip=""
 # More info | https://docs.linuxgsm.com/alerts#more-info
 postalert="off"
 
+# Alert on Start/Stop/Restart
+statusalert="off"
+
 # Discord Alerts | https://docs.linuxgsm.com/alerts/discord
 discordalert="off"
 discordwebhook="webhook"
@@ -68,7 +71,6 @@ pushoveruserkey="userkey"
 # Rocket.Chat Alerts | https://docs.linuxgsm.com/alerts/rocket.chat
 rocketchatalert="off"
 rocketchatwebhook="webhook"
-rocketchattoken=""
 
 # Slack Alerts | https://docs.linuxgsm.com/alerts/slack
 slackalert="off"
diff --git a/lgsm/config-default/config-lgsm/cdserver/_default.cfg b/lgsm/config-default/config-lgsm/cdserver/_default.cfg
index 69e4ee51e..28deeb6e6 100644
--- a/lgsm/config-default/config-lgsm/cdserver/_default.cfg
+++ b/lgsm/config-default/config-lgsm/cdserver/_default.cfg
@@ -28,6 +28,9 @@ displayip=""
 # More info | https://docs.linuxgsm.com/alerts#more-info
 postalert="off"
 
+# Alert on Start/Stop/Restart
+statusalert="off"
+
 # Discord Alerts | https://docs.linuxgsm.com/alerts/discord
 discordalert="off"
 discordwebhook="webhook"
@@ -60,7 +63,6 @@ pushoveruserkey="userkey"
 # Rocket.Chat Alerts | https://docs.linuxgsm.com/alerts/rocket.chat
 rocketchatalert="off"
 rocketchatwebhook="webhook"
-rocketchattoken=""
 
 # Slack Alerts | https://docs.linuxgsm.com/alerts/slack
 slackalert="off"
diff --git a/lgsm/config-default/config-lgsm/ckserver/_default.cfg b/lgsm/config-default/config-lgsm/ckserver/_default.cfg
index fe3d56f44..c662f3b04 100644
--- a/lgsm/config-default/config-lgsm/ckserver/_default.cfg
+++ b/lgsm/config-default/config-lgsm/ckserver/_default.cfg
@@ -32,6 +32,9 @@ displayip=""
 # More info | https://docs.linuxgsm.com/alerts#more-info
 postalert="off"
 
+# Alert on Start/Stop/Restart
+statusalert="off"
+
 # Discord Alerts | https://docs.linuxgsm.com/alerts/discord
 discordalert="off"
 discordwebhook="webhook"
@@ -64,7 +67,6 @@ pushoveruserkey="userkey"
 # Rocket.Chat Alerts | https://docs.linuxgsm.com/alerts/rocket.chat
 rocketchatalert="off"
 rocketchatwebhook="webhook"
-rocketchattoken=""
 
 # Slack Alerts | https://docs.linuxgsm.com/alerts/slack
 slackalert="off"
diff --git a/lgsm/config-default/config-lgsm/cmwserver/_default.cfg b/lgsm/config-default/config-lgsm/cmwserver/_default.cfg
index d0fe00b0d..29df71d95 100644
--- a/lgsm/config-default/config-lgsm/cmwserver/_default.cfg
+++ b/lgsm/config-default/config-lgsm/cmwserver/_default.cfg
@@ -34,6 +34,9 @@ displayip=""
 # More info | https://docs.linuxgsm.com/alerts#more-info
 postalert="off"
 
+# Alert on Start/Stop/Restart
+statusalert="off"
+
 # Discord Alerts | https://docs.linuxgsm.com/alerts/discord
 discordalert="off"
 discordwebhook="webhook"
@@ -66,7 +69,6 @@ pushoveruserkey="userkey"
 # Rocket.Chat Alerts | https://docs.linuxgsm.com/alerts/rocket.chat
 rocketchatalert="off"
 rocketchatwebhook="webhook"
-rocketchattoken=""
 
 # Slack Alerts | https://docs.linuxgsm.com/alerts/slack
 slackalert="off"
diff --git a/lgsm/config-default/config-lgsm/cod2server/_default.cfg b/lgsm/config-default/config-lgsm/cod2server/_default.cfg
index 8f0d889d0..95b76ae1e 100644
--- a/lgsm/config-default/config-lgsm/cod2server/_default.cfg
+++ b/lgsm/config-default/config-lgsm/cod2server/_default.cfg
@@ -34,6 +34,9 @@ displayip=""
 # More info | https://docs.linuxgsm.com/alerts#more-info
 postalert="off"
 
+# Alert on Start/Stop/Restart
+statusalert="off"
+
 # Discord Alerts | https://docs.linuxgsm.com/alerts/discord
 discordalert="off"
 discordwebhook="webhook"
@@ -66,7 +69,6 @@ pushoveruserkey="userkey"
 # Rocket.Chat Alerts | https://docs.linuxgsm.com/alerts/rocket.chat
 rocketchatalert="off"
 rocketchatwebhook="webhook"
-rocketchattoken=""
 
 # Slack Alerts | https://docs.linuxgsm.com/alerts/slack
 slackalert="off"
diff --git a/lgsm/config-default/config-lgsm/cod4server/_default.cfg b/lgsm/config-default/config-lgsm/cod4server/_default.cfg
index 6fce7fea3..a93237894 100644
--- a/lgsm/config-default/config-lgsm/cod4server/_default.cfg
+++ b/lgsm/config-default/config-lgsm/cod4server/_default.cfg
@@ -34,6 +34,9 @@ displayip=""
 # More info | https://docs.linuxgsm.com/alerts#more-info
 postalert="off"
 
+# Alert on Start/Stop/Restart
+statusalert="off"
+
 # Discord Alerts | https://docs.linuxgsm.com/alerts/discord
 discordalert="off"
 discordwebhook="webhook"
@@ -66,7 +69,6 @@ pushoveruserkey="userkey"
 # Rocket.Chat Alerts | https://docs.linuxgsm.com/alerts/rocket.chat
 rocketchatalert="off"
 rocketchatwebhook="webhook"
-rocketchattoken=""
 
 # Slack Alerts | https://docs.linuxgsm.com/alerts/slack
 slackalert="off"
diff --git a/lgsm/config-default/config-lgsm/codserver/_default.cfg b/lgsm/config-default/config-lgsm/codserver/_default.cfg
index 9929f2626..6263d79b6 100644
--- a/lgsm/config-default/config-lgsm/codserver/_default.cfg
+++ b/lgsm/config-default/config-lgsm/codserver/_default.cfg
@@ -34,6 +34,9 @@ displayip=""
 # More info | https://docs.linuxgsm.com/alerts#more-info
 postalert="off"
 
+# Alert on Start/Stop/Restart
+statusalert="off"
+
 # Discord Alerts | https://docs.linuxgsm.com/alerts/discord
 discordalert="off"
 discordwebhook="webhook"
@@ -66,7 +69,6 @@ pushoveruserkey="userkey"
 # Rocket.Chat Alerts | https://docs.linuxgsm.com/alerts/rocket.chat
 rocketchatalert="off"
 rocketchatwebhook="webhook"
-rocketchattoken=""
 
 # Slack Alerts | https://docs.linuxgsm.com/alerts/slack
 slackalert="off"
diff --git a/lgsm/config-default/config-lgsm/coduoserver/_default.cfg b/lgsm/config-default/config-lgsm/coduoserver/_default.cfg
index 1719eb8f7..b7c6036b9 100644
--- a/lgsm/config-default/config-lgsm/coduoserver/_default.cfg
+++ b/lgsm/config-default/config-lgsm/coduoserver/_default.cfg
@@ -34,6 +34,9 @@ displayip=""
 # More info | https://docs.linuxgsm.com/alerts#more-info
 postalert="off"
 
+# Alert on Start/Stop/Restart
+statusalert="off"
+
 # Discord Alerts | https://docs.linuxgsm.com/alerts/discord
 discordalert="off"
 discordwebhook="webhook"
@@ -66,7 +69,6 @@ pushoveruserkey="userkey"
 # Rocket.Chat Alerts | https://docs.linuxgsm.com/alerts/rocket.chat
 rocketchatalert="off"
 rocketchatwebhook="webhook"
-rocketchattoken=""
 
 # Slack Alerts | https://docs.linuxgsm.com/alerts/slack
 slackalert="off"
diff --git a/lgsm/config-default/config-lgsm/codwawserver/_default.cfg b/lgsm/config-default/config-lgsm/codwawserver/_default.cfg
index c7169f170..0820475f1 100644
--- a/lgsm/config-default/config-lgsm/codwawserver/_default.cfg
+++ b/lgsm/config-default/config-lgsm/codwawserver/_default.cfg
@@ -34,6 +34,9 @@ displayip=""
 # More info | https://docs.linuxgsm.com/alerts#more-info
 postalert="off"
 
+# Alert on Start/Stop/Restart
+statusalert="off"
+
 # Discord Alerts | https://docs.linuxgsm.com/alerts/discord
 discordalert="off"
 discordwebhook="webhook"
@@ -66,7 +69,6 @@ pushoveruserkey="userkey"
 # Rocket.Chat Alerts | https://docs.linuxgsm.com/alerts/rocket.chat
 rocketchatalert="off"
 rocketchatwebhook="webhook"
-rocketchattoken=""
 
 # Slack Alerts | https://docs.linuxgsm.com/alerts/slack
 slackalert="off"
diff --git a/lgsm/config-default/config-lgsm/colserver/_default.cfg b/lgsm/config-default/config-lgsm/colserver/_default.cfg
index 4d2f04cd2..63182f515 100644
--- a/lgsm/config-default/config-lgsm/colserver/_default.cfg
+++ b/lgsm/config-default/config-lgsm/colserver/_default.cfg
@@ -29,6 +29,9 @@ displayip=""
 # More info | https://docs.linuxgsm.com/alerts#more-info
 postalert="off"
 
+# Alert on Start/Stop/Restart
+statusalert="off"
+
 # Discord Alerts | https://docs.linuxgsm.com/alerts/discord
 discordalert="off"
 discordwebhook="webhook"
@@ -61,7 +64,6 @@ pushoveruserkey="userkey"
 # Rocket.Chat Alerts | https://docs.linuxgsm.com/alerts/rocket.chat
 rocketchatalert="off"
 rocketchatwebhook="webhook"
-rocketchattoken=""
 
 # Slack Alerts | https://docs.linuxgsm.com/alerts/slack
 slackalert="off"
diff --git a/lgsm/config-default/config-lgsm/csczserver/_default.cfg b/lgsm/config-default/config-lgsm/csczserver/_default.cfg
index a3f49922b..11d0da197 100644
--- a/lgsm/config-default/config-lgsm/csczserver/_default.cfg
+++ b/lgsm/config-default/config-lgsm/csczserver/_default.cfg
@@ -35,6 +35,9 @@ displayip=""
 # More info | https://docs.linuxgsm.com/alerts#more-info
 postalert="off"
 
+# Alert on Start/Stop/Restart
+statusalert="off"
+
 # Discord Alerts | https://docs.linuxgsm.com/alerts/discord
 discordalert="off"
 discordwebhook="webhook"
@@ -67,7 +70,6 @@ pushoveruserkey="userkey"
 # Rocket.Chat Alerts | https://docs.linuxgsm.com/alerts/rocket.chat
 rocketchatalert="off"
 rocketchatwebhook="webhook"
-rocketchattoken=""
 
 # Slack Alerts | https://docs.linuxgsm.com/alerts/slack
 slackalert="off"
diff --git a/lgsm/config-default/config-lgsm/csgoserver/_default.cfg b/lgsm/config-default/config-lgsm/csgoserver/_default.cfg
index f9d0acf1a..5efdd4942 100644
--- a/lgsm/config-default/config-lgsm/csgoserver/_default.cfg
+++ b/lgsm/config-default/config-lgsm/csgoserver/_default.cfg
@@ -72,6 +72,9 @@ displayip=""
 # More info | https://docs.linuxgsm.com/alerts#more-info
 postalert="off"
 
+# Alert on Start/Stop/Restart
+statusalert="off"
+
 # Discord Alerts | https://docs.linuxgsm.com/alerts/discord
 discordalert="off"
 discordwebhook="webhook"
@@ -104,7 +107,6 @@ pushoveruserkey="userkey"
 # Rocket.Chat Alerts | https://docs.linuxgsm.com/alerts/rocket.chat
 rocketchatalert="off"
 rocketchatwebhook="webhook"
-rocketchattoken=""
 
 # Slack Alerts | https://docs.linuxgsm.com/alerts/slack
 slackalert="off"
diff --git a/lgsm/config-default/config-lgsm/csserver/_default.cfg b/lgsm/config-default/config-lgsm/csserver/_default.cfg
index 87a132f3d..2e53616bd 100644
--- a/lgsm/config-default/config-lgsm/csserver/_default.cfg
+++ b/lgsm/config-default/config-lgsm/csserver/_default.cfg
@@ -35,6 +35,9 @@ displayip=""
 # More info | https://docs.linuxgsm.com/alerts#more-info
 postalert="off"
 
+# Alert on Start/Stop/Restart
+statusalert="off"
+
 # Discord Alerts | https://docs.linuxgsm.com/alerts/discord
 discordalert="off"
 discordwebhook="webhook"
@@ -67,7 +70,6 @@ pushoveruserkey="userkey"
 # Rocket.Chat Alerts | https://docs.linuxgsm.com/alerts/rocket.chat
 rocketchatalert="off"
 rocketchatwebhook="webhook"
-rocketchattoken=""
 
 # Slack Alerts | https://docs.linuxgsm.com/alerts/slack
 slackalert="off"
diff --git a/lgsm/config-default/config-lgsm/cssserver/_default.cfg b/lgsm/config-default/config-lgsm/cssserver/_default.cfg
index 612aeb0f1..1af41c5fe 100644
--- a/lgsm/config-default/config-lgsm/cssserver/_default.cfg
+++ b/lgsm/config-default/config-lgsm/cssserver/_default.cfg
@@ -41,6 +41,9 @@ displayip=""
 # More info | https://docs.linuxgsm.com/alerts#more-info
 postalert="off"
 
+# Alert on Start/Stop/Restart
+statusalert="off"
+
 # Discord Alerts | https://docs.linuxgsm.com/alerts/discord
 discordalert="off"
 discordwebhook="webhook"
@@ -73,7 +76,6 @@ pushoveruserkey="userkey"
 # Rocket.Chat Alerts | https://docs.linuxgsm.com/alerts/rocket.chat
 rocketchatalert="off"
 rocketchatwebhook="webhook"
-rocketchattoken=""
 
 # Slack Alerts | https://docs.linuxgsm.com/alerts/slack
 slackalert="off"
diff --git a/lgsm/config-default/config-lgsm/ctserver/_default.cfg b/lgsm/config-default/config-lgsm/ctserver/_default.cfg
index 2c31d5cc6..74bd230c7 100644
--- a/lgsm/config-default/config-lgsm/ctserver/_default.cfg
+++ b/lgsm/config-default/config-lgsm/ctserver/_default.cfg
@@ -28,6 +28,9 @@ displayip=""
 # More info | https://docs.linuxgsm.com/alerts#more-info
 postalert="off"
 
+# Alert on Start/Stop/Restart
+statusalert="off"
+
 # Discord Alerts | https://docs.linuxgsm.com/alerts/discord
 discordalert="off"
 discordwebhook="webhook"
@@ -60,7 +63,6 @@ pushoveruserkey="userkey"
 # Rocket.Chat Alerts | https://docs.linuxgsm.com/alerts/rocket.chat
 rocketchatalert="off"
 rocketchatwebhook="webhook"
-rocketchattoken=""
 
 # Slack Alerts | https://docs.linuxgsm.com/alerts/slack
 slackalert="off"
diff --git a/lgsm/config-default/config-lgsm/dabserver/_default.cfg b/lgsm/config-default/config-lgsm/dabserver/_default.cfg
index 84ea667e4..62e3acf99 100644
--- a/lgsm/config-default/config-lgsm/dabserver/_default.cfg
+++ b/lgsm/config-default/config-lgsm/dabserver/_default.cfg
@@ -36,6 +36,9 @@ displayip=""
 # More info | https://docs.linuxgsm.com/alerts#more-info
 postalert="off"
 
+# Alert on Start/Stop/Restart
+statusalert="off"
+
 # Discord Alerts | https://docs.linuxgsm.com/alerts/discord
 discordalert="off"
 discordwebhook="webhook"
@@ -68,7 +71,6 @@ pushoveruserkey="userkey"
 # Rocket.Chat Alerts | https://docs.linuxgsm.com/alerts/rocket.chat
 rocketchatalert="off"
 rocketchatwebhook="webhook"
-rocketchattoken=""
 
 # Slack Alerts | https://docs.linuxgsm.com/alerts/slack
 slackalert="off"
diff --git a/lgsm/config-default/config-lgsm/dayzserver/_default.cfg b/lgsm/config-default/config-lgsm/dayzserver/_default.cfg
index 01eb4509e..ed9e8783c 100644
--- a/lgsm/config-default/config-lgsm/dayzserver/_default.cfg
+++ b/lgsm/config-default/config-lgsm/dayzserver/_default.cfg
@@ -47,6 +47,9 @@ displayip=""
 # More info | https://docs.linuxgsm.com/alerts#more-info
 postalert="off"
 
+# Alert on Start/Stop/Restart
+statusalert="off"
+
 # Discord Alerts | https://docs.linuxgsm.com/alerts/discord
 discordalert="off"
 discordwebhook="webhook"
@@ -79,7 +82,6 @@ pushoveruserkey="userkey"
 # Rocket.Chat Alerts | https://docs.linuxgsm.com/alerts/rocket.chat
 rocketchatalert="off"
 rocketchatwebhook="webhook"
-rocketchattoken=""
 
 # Slack Alerts | https://docs.linuxgsm.com/alerts/slack
 slackalert="off"
diff --git a/lgsm/config-default/config-lgsm/dmcserver/_default.cfg b/lgsm/config-default/config-lgsm/dmcserver/_default.cfg
index f46fe5025..5f56a842c 100644
--- a/lgsm/config-default/config-lgsm/dmcserver/_default.cfg
+++ b/lgsm/config-default/config-lgsm/dmcserver/_default.cfg
@@ -35,6 +35,9 @@ displayip=""
 # More info | https://docs.linuxgsm.com/alerts#more-info
 postalert="off"
 
+# Alert on Start/Stop/Restart
+statusalert="off"
+
 # Discord Alerts | https://docs.linuxgsm.com/alerts/discord
 discordalert="off"
 discordwebhook="webhook"
@@ -67,7 +70,6 @@ pushoveruserkey="userkey"
 # Rocket.Chat Alerts | https://docs.linuxgsm.com/alerts/rocket.chat
 rocketchatalert="off"
 rocketchatwebhook="webhook"
-rocketchattoken=""
 
 # Slack Alerts | https://docs.linuxgsm.com/alerts/slack
 slackalert="off"
diff --git a/lgsm/config-default/config-lgsm/dodrserver/_default.cfg b/lgsm/config-default/config-lgsm/dodrserver/_default.cfg
index d692fdfa7..555a1a007 100644
--- a/lgsm/config-default/config-lgsm/dodrserver/_default.cfg
+++ b/lgsm/config-default/config-lgsm/dodrserver/_default.cfg
@@ -34,6 +34,9 @@ displayip=""
 # More info | https://docs.linuxgsm.com/alerts#more-info
 postalert="off"
 
+# Alert on Start/Stop/Restart
+statusalert="off"
+
 # Discord Alerts | https://docs.linuxgsm.com/alerts/discord
 discordalert="off"
 discordwebhook="webhook"
@@ -66,7 +69,6 @@ pushoveruserkey="userkey"
 # Rocket.Chat Alerts | https://docs.linuxgsm.com/alerts/rocket.chat
 rocketchatalert="off"
 rocketchatwebhook="webhook"
-rocketchattoken=""
 
 # Slack Alerts | https://docs.linuxgsm.com/alerts/slack
 slackalert="off"
diff --git a/lgsm/config-default/config-lgsm/dodserver/_default.cfg b/lgsm/config-default/config-lgsm/dodserver/_default.cfg
index b2940a658..61700d621 100644
--- a/lgsm/config-default/config-lgsm/dodserver/_default.cfg
+++ b/lgsm/config-default/config-lgsm/dodserver/_default.cfg
@@ -35,6 +35,9 @@ displayip=""
 # More info | https://docs.linuxgsm.com/alerts#more-info
 postalert="off"
 
+# Alert on Start/Stop/Restart
+statusalert="off"
+
 # Discord Alerts | https://docs.linuxgsm.com/alerts/discord
 discordalert="off"
 discordwebhook="webhook"
@@ -67,7 +70,6 @@ pushoveruserkey="userkey"
 # Rocket.Chat Alerts | https://docs.linuxgsm.com/alerts/rocket.chat
 rocketchatalert="off"
 rocketchatwebhook="webhook"
-rocketchattoken=""
 
 # Slack Alerts | https://docs.linuxgsm.com/alerts/slack
 slackalert="off"
diff --git a/lgsm/config-default/config-lgsm/dodsserver/_default.cfg b/lgsm/config-default/config-lgsm/dodsserver/_default.cfg
index 9ff0cfa96..390f87b70 100644
--- a/lgsm/config-default/config-lgsm/dodsserver/_default.cfg
+++ b/lgsm/config-default/config-lgsm/dodsserver/_default.cfg
@@ -36,6 +36,9 @@ displayip=""
 # More info | https://docs.linuxgsm.com/alerts#more-info
 postalert="off"
 
+# Alert on Start/Stop/Restart
+statusalert="off"
+
 # Discord Alerts | https://docs.linuxgsm.com/alerts/discord
 discordalert="off"
 discordwebhook="webhook"
@@ -68,7 +71,6 @@ pushoveruserkey="userkey"
 # Rocket.Chat Alerts | https://docs.linuxgsm.com/alerts/rocket.chat
 rocketchatalert="off"
 rocketchatwebhook="webhook"
-rocketchattoken=""
 
 # Slack Alerts | https://docs.linuxgsm.com/alerts/slack
 slackalert="off"
diff --git a/lgsm/config-default/config-lgsm/doiserver/_default.cfg b/lgsm/config-default/config-lgsm/doiserver/_default.cfg
index 1580d58b2..6aa10ee9b 100644
--- a/lgsm/config-default/config-lgsm/doiserver/_default.cfg
+++ b/lgsm/config-default/config-lgsm/doiserver/_default.cfg
@@ -37,6 +37,9 @@ displayip=""
 # More info | https://docs.linuxgsm.com/alerts#more-info
 postalert="off"
 
+# Alert on Start/Stop/Restart
+statusalert="off"
+
 # Discord Alerts | https://docs.linuxgsm.com/alerts/discord
 discordalert="off"
 discordwebhook="webhook"
@@ -69,7 +72,6 @@ pushoveruserkey="userkey"
 # Rocket.Chat Alerts | https://docs.linuxgsm.com/alerts/rocket.chat
 rocketchatalert="off"
 rocketchatwebhook="webhook"
-rocketchattoken=""
 
 # Slack Alerts | https://docs.linuxgsm.com/alerts/slack
 slackalert="off"
diff --git a/lgsm/config-default/config-lgsm/dstserver/_default.cfg b/lgsm/config-default/config-lgsm/dstserver/_default.cfg
index 4677162c3..d757ea732 100644
--- a/lgsm/config-default/config-lgsm/dstserver/_default.cfg
+++ b/lgsm/config-default/config-lgsm/dstserver/_default.cfg
@@ -38,6 +38,9 @@ displayip=""
 # More info | https://docs.linuxgsm.com/alerts#more-info
 postalert="off"
 
+# Alert on Start/Stop/Restart
+statusalert="off"
+
 # Discord Alerts | https://docs.linuxgsm.com/alerts/discord
 discordalert="off"
 discordwebhook="webhook"
@@ -70,7 +73,6 @@ pushoveruserkey="userkey"
 # Rocket.Chat Alerts | https://docs.linuxgsm.com/alerts/rocket.chat
 rocketchatalert="off"
 rocketchatwebhook="webhook"
-rocketchattoken=""
 
 # Slack Alerts | https://docs.linuxgsm.com/alerts/slack
 slackalert="off"
diff --git a/lgsm/config-default/config-lgsm/dysserver/_default.cfg b/lgsm/config-default/config-lgsm/dysserver/_default.cfg
index 907482a36..eb1861c7d 100644
--- a/lgsm/config-default/config-lgsm/dysserver/_default.cfg
+++ b/lgsm/config-default/config-lgsm/dysserver/_default.cfg
@@ -41,6 +41,9 @@ displayip=""
 # More info | https://docs.linuxgsm.com/alerts#more-info
 postalert="off"
 
+# Alert on Start/Stop/Restart
+statusalert="off"
+
 # Discord Alerts | https://docs.linuxgsm.com/alerts/discord
 discordalert="off"
 discordwebhook="webhook"
@@ -73,7 +76,6 @@ pushoveruserkey="userkey"
 # Rocket.Chat Alerts | https://docs.linuxgsm.com/alerts/rocket.chat
 rocketchatalert="off"
 rocketchatwebhook="webhook"
-rocketchattoken=""
 
 # Slack Alerts | https://docs.linuxgsm.com/alerts/slack
 slackalert="off"
diff --git a/lgsm/config-default/config-lgsm/ecoserver/_default.cfg b/lgsm/config-default/config-lgsm/ecoserver/_default.cfg
index ae4bfa681..470b43d06 100644
--- a/lgsm/config-default/config-lgsm/ecoserver/_default.cfg
+++ b/lgsm/config-default/config-lgsm/ecoserver/_default.cfg
@@ -28,6 +28,9 @@ displayip=""
 # More info | https://docs.linuxgsm.com/alerts#more-info
 postalert="off"
 
+# Alert on Start/Stop/Restart
+statusalert="off"
+
 # Discord Alerts | https://docs.linuxgsm.com/alerts/discord
 discordalert="off"
 discordwebhook="webhook"
@@ -60,7 +63,6 @@ pushoveruserkey="userkey"
 # Rocket.Chat Alerts | https://docs.linuxgsm.com/alerts/rocket.chat
 rocketchatalert="off"
 rocketchatwebhook="webhook"
-rocketchattoken=""
 
 # Slack Alerts | https://docs.linuxgsm.com/alerts/slack
 slackalert="off"
diff --git a/lgsm/config-default/config-lgsm/emserver/_default.cfg b/lgsm/config-default/config-lgsm/emserver/_default.cfg
index 33fb4f849..1610d0816 100644
--- a/lgsm/config-default/config-lgsm/emserver/_default.cfg
+++ b/lgsm/config-default/config-lgsm/emserver/_default.cfg
@@ -41,6 +41,9 @@ displayip=""
 # More info | https://docs.linuxgsm.com/alerts#more-info
 postalert="off"
 
+# Alert on Start/Stop/Restart
+statusalert="off"
+
 # Discord Alerts | https://docs.linuxgsm.com/alerts/discord
 discordalert="off"
 discordwebhook="webhook"
@@ -73,7 +76,6 @@ pushoveruserkey="userkey"
 # Rocket.Chat Alerts | https://docs.linuxgsm.com/alerts/rocket.chat
 rocketchatalert="off"
 rocketchatwebhook="webhook"
-rocketchattoken=""
 
 # Slack Alerts | https://docs.linuxgsm.com/alerts/slack
 slackalert="off"
diff --git a/lgsm/config-default/config-lgsm/etlserver/_default.cfg b/lgsm/config-default/config-lgsm/etlserver/_default.cfg
index 034f29c5d..18d6d302f 100644
--- a/lgsm/config-default/config-lgsm/etlserver/_default.cfg
+++ b/lgsm/config-default/config-lgsm/etlserver/_default.cfg
@@ -28,6 +28,9 @@ displayip=""
 # More info | https://docs.linuxgsm.com/alerts#more-info
 postalert="off"
 
+# Alert on Start/Stop/Restart
+statusalert="off"
+
 # Discord Alerts | https://docs.linuxgsm.com/alerts/discord
 discordalert="off"
 discordwebhook="webhook"
@@ -60,7 +63,6 @@ pushoveruserkey="userkey"
 # Rocket.Chat Alerts | https://docs.linuxgsm.com/alerts/rocket.chat
 rocketchatalert="off"
 rocketchatwebhook="webhook"
-rocketchattoken=""
 
 # Slack Alerts | https://docs.linuxgsm.com/alerts/slack
 slackalert="off"
diff --git a/lgsm/config-default/config-lgsm/ets2server/_default.cfg b/lgsm/config-default/config-lgsm/ets2server/_default.cfg
index 215ab2b41..24462bc45 100644
--- a/lgsm/config-default/config-lgsm/ets2server/_default.cfg
+++ b/lgsm/config-default/config-lgsm/ets2server/_default.cfg
@@ -28,6 +28,9 @@ displayip=""
 # More info | https://docs.linuxgsm.com/alerts#more-info
 postalert="off"
 
+# Alert on Start/Stop/Restart
+statusalert="off"
+
 # Discord Alerts | https://docs.linuxgsm.com/alerts/discord
 discordalert="off"
 discordwebhook="webhook"
@@ -60,7 +63,6 @@ pushoveruserkey="userkey"
 # Rocket.Chat Alerts | https://docs.linuxgsm.com/alerts/rocket.chat
 rocketchatalert="off"
 rocketchatwebhook="webhook"
-rocketchattoken=""
 
 # Slack Alerts | https://docs.linuxgsm.com/alerts/slack
 slackalert="off"
diff --git a/lgsm/config-default/config-lgsm/fctrserver/_default.cfg b/lgsm/config-default/config-lgsm/fctrserver/_default.cfg
index 6b03f9a30..d77284d5e 100644
--- a/lgsm/config-default/config-lgsm/fctrserver/_default.cfg
+++ b/lgsm/config-default/config-lgsm/fctrserver/_default.cfg
@@ -35,6 +35,9 @@ displayip=""
 # More info | https://docs.linuxgsm.com/alerts#more-info
 postalert="off"
 
+# Alert on Start/Stop/Restart
+statusalert="off"
+
 # Discord Alerts | https://docs.linuxgsm.com/alerts/discord
 discordalert="off"
 discordwebhook="webhook"
@@ -67,7 +70,6 @@ pushoveruserkey="userkey"
 # Rocket.Chat Alerts | https://docs.linuxgsm.com/alerts/rocket.chat
 rocketchatalert="off"
 rocketchatwebhook="webhook"
-rocketchattoken=""
 
 # Slack Alerts | https://docs.linuxgsm.com/alerts/slack
 slackalert="off"
diff --git a/lgsm/config-default/config-lgsm/fofserver/_default.cfg b/lgsm/config-default/config-lgsm/fofserver/_default.cfg
index 41dae637a..1f7ef0168 100644
--- a/lgsm/config-default/config-lgsm/fofserver/_default.cfg
+++ b/lgsm/config-default/config-lgsm/fofserver/_default.cfg
@@ -36,6 +36,9 @@ displayip=""
 # More info | https://docs.linuxgsm.com/alerts#more-info
 postalert="off"
 
+# Alert on Start/Stop/Restart
+statusalert="off"
+
 # Discord Alerts | https://docs.linuxgsm.com/alerts/discord
 discordalert="off"
 discordwebhook="webhook"
@@ -68,7 +71,6 @@ pushoveruserkey="userkey"
 # Rocket.Chat Alerts | https://docs.linuxgsm.com/alerts/rocket.chat
 rocketchatalert="off"
 rocketchatwebhook="webhook"
-rocketchattoken=""
 
 # Slack Alerts | https://docs.linuxgsm.com/alerts/slack
 slackalert="off"
diff --git a/lgsm/config-default/config-lgsm/gmodserver/_default.cfg b/lgsm/config-default/config-lgsm/gmodserver/_default.cfg
index b170c3436..869628e8c 100644
--- a/lgsm/config-default/config-lgsm/gmodserver/_default.cfg
+++ b/lgsm/config-default/config-lgsm/gmodserver/_default.cfg
@@ -48,6 +48,9 @@ displayip=""
 # More info | https://docs.linuxgsm.com/alerts#more-info
 postalert="off"
 
+# Alert on Start/Stop/Restart
+statusalert="off"
+
 # Discord Alerts | https://docs.linuxgsm.com/alerts/discord
 discordalert="off"
 discordwebhook="webhook"
@@ -80,7 +83,6 @@ pushoveruserkey="userkey"
 # Rocket.Chat Alerts | https://docs.linuxgsm.com/alerts/rocket.chat
 rocketchatalert="off"
 rocketchatwebhook="webhook"
-rocketchattoken=""
 
 # Slack Alerts | https://docs.linuxgsm.com/alerts/slack
 slackalert="off"
diff --git a/lgsm/config-default/config-lgsm/hcuserver/_default.cfg b/lgsm/config-default/config-lgsm/hcuserver/_default.cfg
index 00b0b30c7..225482c69 100644
--- a/lgsm/config-default/config-lgsm/hcuserver/_default.cfg
+++ b/lgsm/config-default/config-lgsm/hcuserver/_default.cfg
@@ -43,6 +43,9 @@ displayip=""
 # More info | https://docs.linuxgsm.com/alerts#more-info
 postalert="off"
 
+# Alert on Start/Stop/Restart
+statusalert="off"
+
 # Discord Alerts | https://docs.linuxgsm.com/alerts/discord
 discordalert="off"
 discordwebhook="webhook"
@@ -75,7 +78,6 @@ pushoveruserkey="userkey"
 # Rocket.Chat Alerts | https://docs.linuxgsm.com/alerts/rocket.chat
 rocketchatalert="off"
 rocketchatwebhook="webhook"
-rocketchattoken=""
 
 # Slack Alerts | https://docs.linuxgsm.com/alerts/slack
 slackalert="off"
diff --git a/lgsm/config-default/config-lgsm/hl2dmserver/_default.cfg b/lgsm/config-default/config-lgsm/hl2dmserver/_default.cfg
index 8bbf8fdec..cdbbfb168 100644
--- a/lgsm/config-default/config-lgsm/hl2dmserver/_default.cfg
+++ b/lgsm/config-default/config-lgsm/hl2dmserver/_default.cfg
@@ -36,6 +36,9 @@ displayip=""
 # More info | https://docs.linuxgsm.com/alerts#more-info
 postalert="off"
 
+# Alert on Start/Stop/Restart
+statusalert="off"
+
 # Discord Alerts | https://docs.linuxgsm.com/alerts/discord
 discordalert="off"
 discordwebhook="webhook"
@@ -68,7 +71,6 @@ pushoveruserkey="userkey"
 # Rocket.Chat Alerts | https://docs.linuxgsm.com/alerts/rocket.chat
 rocketchatalert="off"
 rocketchatwebhook="webhook"
-rocketchattoken=""
 
 # Slack Alerts | https://docs.linuxgsm.com/alerts/slack
 slackalert="off"
diff --git a/lgsm/config-default/config-lgsm/hldmserver/_default.cfg b/lgsm/config-default/config-lgsm/hldmserver/_default.cfg
index f78e1542b..f69d56c34 100644
--- a/lgsm/config-default/config-lgsm/hldmserver/_default.cfg
+++ b/lgsm/config-default/config-lgsm/hldmserver/_default.cfg
@@ -35,6 +35,9 @@ displayip=""
 # More info | https://docs.linuxgsm.com/alerts#more-info
 postalert="off"
 
+# Alert on Start/Stop/Restart
+statusalert="off"
+
 # Discord Alerts | https://docs.linuxgsm.com/alerts/discord
 discordalert="off"
 discordwebhook="webhook"
@@ -67,7 +70,6 @@ pushoveruserkey="userkey"
 # Rocket.Chat Alerts | https://docs.linuxgsm.com/alerts/rocket.chat
 rocketchatalert="off"
 rocketchatwebhook="webhook"
-rocketchattoken=""
 
 # Slack Alerts | https://docs.linuxgsm.com/alerts/slack
 slackalert="off"
diff --git a/lgsm/config-default/config-lgsm/hldmsserver/_default.cfg b/lgsm/config-default/config-lgsm/hldmsserver/_default.cfg
index fd854b0c2..0baf4f955 100644
--- a/lgsm/config-default/config-lgsm/hldmsserver/_default.cfg
+++ b/lgsm/config-default/config-lgsm/hldmsserver/_default.cfg
@@ -36,6 +36,9 @@ displayip=""
 # More info | https://docs.linuxgsm.com/alerts#more-info
 postalert="off"
 
+# Alert on Start/Stop/Restart
+statusalert="off"
+
 # Discord Alerts | https://docs.linuxgsm.com/alerts/discord
 discordalert="off"
 discordwebhook="webhook"
@@ -68,7 +71,6 @@ pushoveruserkey="userkey"
 # Rocket.Chat Alerts | https://docs.linuxgsm.com/alerts/rocket.chat
 rocketchatalert="off"
 rocketchatwebhook="webhook"
-rocketchattoken=""
 
 # Slack Alerts | https://docs.linuxgsm.com/alerts/slack
 slackalert="off"
diff --git a/lgsm/config-default/config-lgsm/hwserver/_default.cfg b/lgsm/config-default/config-lgsm/hwserver/_default.cfg
index 853a52078..ea18f00cf 100644
--- a/lgsm/config-default/config-lgsm/hwserver/_default.cfg
+++ b/lgsm/config-default/config-lgsm/hwserver/_default.cfg
@@ -46,6 +46,9 @@ displayip=""
 # More info | https://docs.linuxgsm.com/alerts#more-info
 postalert="off"
 
+# Alert on Start/Stop/Restart
+statusalert="off"
+
 # Discord Alerts | https://docs.linuxgsm.com/alerts/discord
 discordalert="off"
 discordwebhook="webhook"
@@ -78,7 +81,6 @@ pushoveruserkey="userkey"
 # Rocket.Chat Alerts | https://docs.linuxgsm.com/alerts/rocket.chat
 rocketchatalert="off"
 rocketchatwebhook="webhook"
-rocketchattoken=""
 
 # Slack Alerts | https://docs.linuxgsm.com/alerts/slack
 slackalert="off"
diff --git a/lgsm/config-default/config-lgsm/insserver/_default.cfg b/lgsm/config-default/config-lgsm/insserver/_default.cfg
index 69d095881..b41fb2491 100644
--- a/lgsm/config-default/config-lgsm/insserver/_default.cfg
+++ b/lgsm/config-default/config-lgsm/insserver/_default.cfg
@@ -42,6 +42,9 @@ displayip=""
 # More info | https://docs.linuxgsm.com/alerts#more-info
 postalert="off"
 
+# Alert on Start/Stop/Restart
+statusalert="off"
+
 # Discord Alerts | https://docs.linuxgsm.com/alerts/discord
 discordalert="off"
 discordwebhook="webhook"
@@ -74,7 +77,6 @@ pushoveruserkey="userkey"
 # Rocket.Chat Alerts | https://docs.linuxgsm.com/alerts/rocket.chat
 rocketchatalert="off"
 rocketchatwebhook="webhook"
-rocketchattoken=""
 
 # Slack Alerts | https://docs.linuxgsm.com/alerts/slack
 slackalert="off"
diff --git a/lgsm/config-default/config-lgsm/inssserver/_default.cfg b/lgsm/config-default/config-lgsm/inssserver/_default.cfg
index 117ddbff8..9c23bffa0 100644
--- a/lgsm/config-default/config-lgsm/inssserver/_default.cfg
+++ b/lgsm/config-default/config-lgsm/inssserver/_default.cfg
@@ -45,6 +45,9 @@ displayip=""
 # More info | https://docs.linuxgsm.com/alerts#more-info
 postalert="off"
 
+# Alert on Start/Stop/Restart
+statusalert="off"
+
 # Discord Alerts | https://docs.linuxgsm.com/alerts/discord
 discordalert="off"
 discordwebhook="webhook"
@@ -77,7 +80,6 @@ pushoveruserkey="userkey"
 # Rocket.Chat Alerts | https://docs.linuxgsm.com/alerts/rocket.chat
 rocketchatalert="off"
 rocketchatwebhook="webhook"
-rocketchattoken=""
 
 # Slack Alerts | https://docs.linuxgsm.com/alerts/slack
 slackalert="off"
diff --git a/lgsm/config-default/config-lgsm/iosserver/_default.cfg b/lgsm/config-default/config-lgsm/iosserver/_default.cfg
index 365a3dee2..bcc35e483 100644
--- a/lgsm/config-default/config-lgsm/iosserver/_default.cfg
+++ b/lgsm/config-default/config-lgsm/iosserver/_default.cfg
@@ -36,6 +36,9 @@ displayip=""
 # More info | https://docs.linuxgsm.com/alerts#more-info
 postalert="off"
 
+# Alert on Start/Stop/Restart
+statusalert="off"
+
 # Discord Alerts | https://docs.linuxgsm.com/alerts/discord
 discordalert="off"
 discordwebhook="webhook"
@@ -68,7 +71,6 @@ pushoveruserkey="userkey"
 # Rocket.Chat Alerts | https://docs.linuxgsm.com/alerts/rocket.chat
 rocketchatalert="off"
 rocketchatwebhook="webhook"
-rocketchattoken=""
 
 # Slack Alerts | https://docs.linuxgsm.com/alerts/slack
 slackalert="off"
diff --git a/lgsm/config-default/config-lgsm/jc2server/_default.cfg b/lgsm/config-default/config-lgsm/jc2server/_default.cfg
index 69bc8018b..caa40d93a 100644
--- a/lgsm/config-default/config-lgsm/jc2server/_default.cfg
+++ b/lgsm/config-default/config-lgsm/jc2server/_default.cfg
@@ -28,6 +28,9 @@ displayip=""
 # More info | https://docs.linuxgsm.com/alerts#more-info
 postalert="off"
 
+# Alert on Start/Stop/Restart
+statusalert="off"
+
 # Discord Alerts | https://docs.linuxgsm.com/alerts/discord
 discordalert="off"
 discordwebhook="webhook"
@@ -60,7 +63,6 @@ pushoveruserkey="userkey"
 # Rocket.Chat Alerts | https://docs.linuxgsm.com/alerts/rocket.chat
 rocketchatalert="off"
 rocketchatwebhook="webhook"
-rocketchattoken=""
 
 # Slack Alerts | https://docs.linuxgsm.com/alerts/slack
 slackalert="off"
diff --git a/lgsm/config-default/config-lgsm/jc3server/_default.cfg b/lgsm/config-default/config-lgsm/jc3server/_default.cfg
index 872541961..9c902f476 100644
--- a/lgsm/config-default/config-lgsm/jc3server/_default.cfg
+++ b/lgsm/config-default/config-lgsm/jc3server/_default.cfg
@@ -28,6 +28,9 @@ displayip=""
 # More info | https://docs.linuxgsm.com/alerts#more-info
 postalert="off"
 
+# Alert on Start/Stop/Restart
+statusalert="off"
+
 # Discord Alerts | https://docs.linuxgsm.com/alerts/discord
 discordalert="off"
 discordwebhook="webhook"
@@ -60,7 +63,6 @@ pushoveruserkey="userkey"
 # Rocket.Chat Alerts | https://docs.linuxgsm.com/alerts/rocket.chat
 rocketchatalert="off"
 rocketchatwebhook="webhook"
-rocketchattoken=""
 
 # Slack Alerts | https://docs.linuxgsm.com/alerts/slack
 slackalert="off"
diff --git a/lgsm/config-default/config-lgsm/jk2server/_default.cfg b/lgsm/config-default/config-lgsm/jk2server/_default.cfg
index 4313daa58..4d49e4e7e 100644
--- a/lgsm/config-default/config-lgsm/jk2server/_default.cfg
+++ b/lgsm/config-default/config-lgsm/jk2server/_default.cfg
@@ -37,6 +37,9 @@ displayip=""
 # More info | https://docs.linuxgsm.com/alerts#more-info
 postalert="off"
 
+# Alert on Start/Stop/Restart
+statusalert="off"
+
 # Discord Alerts | https://docs.linuxgsm.com/alerts/discord
 discordalert="off"
 discordwebhook="webhook"
@@ -69,7 +72,6 @@ pushoveruserkey="userkey"
 # Rocket.Chat Alerts | https://docs.linuxgsm.com/alerts/rocket.chat
 rocketchatalert="off"
 rocketchatwebhook="webhook"
-rocketchattoken=""
 
 # Slack Alerts | https://docs.linuxgsm.com/alerts/slack
 slackalert="off"
diff --git a/lgsm/config-default/config-lgsm/kf2server/_default.cfg b/lgsm/config-default/config-lgsm/kf2server/_default.cfg
index 88fe360be..9ca4a096c 100644
--- a/lgsm/config-default/config-lgsm/kf2server/_default.cfg
+++ b/lgsm/config-default/config-lgsm/kf2server/_default.cfg
@@ -34,6 +34,9 @@ displayip=""
 # More info | https://docs.linuxgsm.com/alerts#more-info
 postalert="off"
 
+# Alert on Start/Stop/Restart
+statusalert="off"
+
 # Discord Alerts | https://docs.linuxgsm.com/alerts/discord
 discordalert="off"
 discordwebhook="webhook"
@@ -66,7 +69,6 @@ pushoveruserkey="userkey"
 # Rocket.Chat Alerts | https://docs.linuxgsm.com/alerts/rocket.chat
 rocketchatalert="off"
 rocketchatwebhook="webhook"
-rocketchattoken=""
 
 # Slack Alerts | https://docs.linuxgsm.com/alerts/slack
 slackalert="off"
diff --git a/lgsm/config-default/config-lgsm/kfserver/_default.cfg b/lgsm/config-default/config-lgsm/kfserver/_default.cfg
index 92cfd258c..4aa128830 100644
--- a/lgsm/config-default/config-lgsm/kfserver/_default.cfg
+++ b/lgsm/config-default/config-lgsm/kfserver/_default.cfg
@@ -40,6 +40,9 @@ displayip=""
 # More info | https://docs.linuxgsm.com/alerts#more-info
 postalert="off"
 
+# Alert on Start/Stop/Restart
+statusalert="off"
+
 # Discord Alerts | https://docs.linuxgsm.com/alerts/discord
 discordalert="off"
 discordwebhook="webhook"
@@ -72,7 +75,6 @@ pushoveruserkey="userkey"
 # Rocket.Chat Alerts | https://docs.linuxgsm.com/alerts/rocket.chat
 rocketchatalert="off"
 rocketchatwebhook="webhook"
-rocketchattoken=""
 
 # Slack Alerts | https://docs.linuxgsm.com/alerts/slack
 slackalert="off"
diff --git a/lgsm/config-default/config-lgsm/l4d2server/_default.cfg b/lgsm/config-default/config-lgsm/l4d2server/_default.cfg
index 96c2cc5bc..676a72360 100644
--- a/lgsm/config-default/config-lgsm/l4d2server/_default.cfg
+++ b/lgsm/config-default/config-lgsm/l4d2server/_default.cfg
@@ -35,6 +35,9 @@ displayip=""
 # More info | https://docs.linuxgsm.com/alerts#more-info
 postalert="off"
 
+# Alert on Start/Stop/Restart
+statusalert="off"
+
 # Discord Alerts | https://docs.linuxgsm.com/alerts/discord
 discordalert="off"
 discordwebhook="webhook"
@@ -67,7 +70,6 @@ pushoveruserkey="userkey"
 # Rocket.Chat Alerts | https://docs.linuxgsm.com/alerts/rocket.chat
 rocketchatalert="off"
 rocketchatwebhook="webhook"
-rocketchattoken=""
 
 # Slack Alerts | https://docs.linuxgsm.com/alerts/slack
 slackalert="off"
diff --git a/lgsm/config-default/config-lgsm/l4dserver/_default.cfg b/lgsm/config-default/config-lgsm/l4dserver/_default.cfg
index 2b5a64be6..cf1f641ec 100644
--- a/lgsm/config-default/config-lgsm/l4dserver/_default.cfg
+++ b/lgsm/config-default/config-lgsm/l4dserver/_default.cfg
@@ -35,6 +35,9 @@ displayip=""
 # More info | https://docs.linuxgsm.com/alerts#more-info
 postalert="off"
 
+# Alert on Start/Stop/Restart
+statusalert="off"
+
 # Discord Alerts | https://docs.linuxgsm.com/alerts/discord
 discordalert="off"
 discordwebhook="webhook"
@@ -67,7 +70,6 @@ pushoveruserkey="userkey"
 # Rocket.Chat Alerts | https://docs.linuxgsm.com/alerts/rocket.chat
 rocketchatalert="off"
 rocketchatwebhook="webhook"
-rocketchattoken=""
 
 # Slack Alerts | https://docs.linuxgsm.com/alerts/slack
 slackalert="off"
diff --git a/lgsm/config-default/config-lgsm/loserver/_default.cfg b/lgsm/config-default/config-lgsm/loserver/_default.cfg
index cc2f7b89a..9a2e90a47 100644
--- a/lgsm/config-default/config-lgsm/loserver/_default.cfg
+++ b/lgsm/config-default/config-lgsm/loserver/_default.cfg
@@ -39,6 +39,9 @@ displayip=""
 # More info | https://docs.linuxgsm.com/alerts#more-info
 postalert="off"
 
+# Alert on Start/Stop/Restart
+statusalert="off"
+
 # Discord Alerts | https://docs.linuxgsm.com/alerts/discord
 discordalert="off"
 discordwebhook="webhook"
@@ -71,7 +74,6 @@ pushoveruserkey="userkey"
 # Rocket.Chat Alerts | https://docs.linuxgsm.com/alerts/rocket.chat
 rocketchatalert="off"
 rocketchatwebhook="webhook"
-rocketchattoken=""
 
 # Slack Alerts | https://docs.linuxgsm.com/alerts/slack
 slackalert="off"
diff --git a/lgsm/config-default/config-lgsm/mcbserver/_default.cfg b/lgsm/config-default/config-lgsm/mcbserver/_default.cfg
index c4d9d5455..586575d10 100644
--- a/lgsm/config-default/config-lgsm/mcbserver/_default.cfg
+++ b/lgsm/config-default/config-lgsm/mcbserver/_default.cfg
@@ -31,6 +31,9 @@ displayip=""
 # More info | https://docs.linuxgsm.com/alerts#more-info
 postalert="off"
 
+# Alert on Start/Stop/Restart
+statusalert="off"
+
 # Discord Alerts | https://docs.linuxgsm.com/alerts/discord
 discordalert="off"
 discordwebhook="webhook"
@@ -63,7 +66,6 @@ pushoveruserkey="userkey"
 # Rocket.Chat Alerts | https://docs.linuxgsm.com/alerts/rocket.chat
 rocketchatalert="off"
 rocketchatwebhook="webhook"
-rocketchattoken=""
 
 # Slack Alerts | https://docs.linuxgsm.com/alerts/slack
 slackalert="off"
diff --git a/lgsm/config-default/config-lgsm/mcserver/_default.cfg b/lgsm/config-default/config-lgsm/mcserver/_default.cfg
index cd2a80849..b6f923ade 100644
--- a/lgsm/config-default/config-lgsm/mcserver/_default.cfg
+++ b/lgsm/config-default/config-lgsm/mcserver/_default.cfg
@@ -37,6 +37,9 @@ displayip=""
 # More info | https://docs.linuxgsm.com/alerts#more-info
 postalert="off"
 
+# Alert on Start/Stop/Restart
+statusalert="off"
+
 # Discord Alerts | https://docs.linuxgsm.com/alerts/discord
 discordalert="off"
 discordwebhook="webhook"
@@ -69,7 +72,6 @@ pushoveruserkey="userkey"
 # Rocket.Chat Alerts | https://docs.linuxgsm.com/alerts/rocket.chat
 rocketchatalert="off"
 rocketchatwebhook="webhook"
-rocketchattoken=""
 
 # Slack Alerts | https://docs.linuxgsm.com/alerts/slack
 slackalert="off"
diff --git a/lgsm/config-default/config-lgsm/mhserver/_default.cfg b/lgsm/config-default/config-lgsm/mhserver/_default.cfg
index 4be0fab64..846aed06e 100644
--- a/lgsm/config-default/config-lgsm/mhserver/_default.cfg
+++ b/lgsm/config-default/config-lgsm/mhserver/_default.cfg
@@ -36,6 +36,9 @@ displayip=""
 # More info | https://docs.linuxgsm.com/alerts#more-info
 postalert="off"
 
+# Alert on Start/Stop/Restart
+statusalert="off"
+
 # Discord Alerts | https://docs.linuxgsm.com/alerts/discord
 discordalert="off"
 discordwebhook="webhook"
@@ -68,7 +71,6 @@ pushoveruserkey="userkey"
 # Rocket.Chat Alerts | https://docs.linuxgsm.com/alerts/rocket.chat
 rocketchatalert="off"
 rocketchatwebhook="webhook"
-rocketchattoken=""
 
 # Slack Alerts | https://docs.linuxgsm.com/alerts/slack
 slackalert="off"
diff --git a/lgsm/config-default/config-lgsm/mohaaserver/_default.cfg b/lgsm/config-default/config-lgsm/mohaaserver/_default.cfg
index cbfbcfb92..a457832cf 100644
--- a/lgsm/config-default/config-lgsm/mohaaserver/_default.cfg
+++ b/lgsm/config-default/config-lgsm/mohaaserver/_default.cfg
@@ -33,6 +33,9 @@ displayip=""
 # More info | https://docs.linuxgsm.com/alerts#more-info
 postalert="off"
 
+# Alert on Start/Stop/Restart
+statusalert="off"
+
 # Discord Alerts | https://docs.linuxgsm.com/alerts/discord
 discordalert="off"
 discordwebhook="webhook"
@@ -65,7 +68,6 @@ pushoveruserkey="userkey"
 # Rocket.Chat Alerts | https://docs.linuxgsm.com/alerts/rocket.chat
 rocketchatalert="off"
 rocketchatwebhook="webhook"
-rocketchattoken=""
 
 # Slack Alerts | https://docs.linuxgsm.com/alerts/slack
 slackalert="off"
diff --git a/lgsm/config-default/config-lgsm/momserver/_default.cfg b/lgsm/config-default/config-lgsm/momserver/_default.cfg
index 670e7b3a7..c075067f5 100644
--- a/lgsm/config-default/config-lgsm/momserver/_default.cfg
+++ b/lgsm/config-default/config-lgsm/momserver/_default.cfg
@@ -33,6 +33,9 @@ displayip=""
 # More info | https://docs.linuxgsm.com/alerts#more-info
 postalert="off"
 
+# Alert on Start/Stop/Restart
+statusalert="off"
+
 # Discord Alerts | https://docs.linuxgsm.com/alerts/discord
 discordalert="off"
 discordwebhook="webhook"
@@ -65,7 +68,6 @@ pushoveruserkey="userkey"
 # Rocket.Chat Alerts | https://docs.linuxgsm.com/alerts/rocket.chat
 rocketchatalert="off"
 rocketchatwebhook="webhook"
-rocketchattoken=""
 
 # Slack Alerts | https://docs.linuxgsm.com/alerts/slack
 slackalert="off"
diff --git a/lgsm/config-default/config-lgsm/mtaserver/_default.cfg b/lgsm/config-default/config-lgsm/mtaserver/_default.cfg
index 3af42ea2b..ff40ffa67 100644
--- a/lgsm/config-default/config-lgsm/mtaserver/_default.cfg
+++ b/lgsm/config-default/config-lgsm/mtaserver/_default.cfg
@@ -31,6 +31,9 @@ displayip=""
 # More info | https://docs.linuxgsm.com/alerts#more-info
 postalert="off"
 
+# Alert on Start/Stop/Restart
+statusalert="off"
+
 # Discord Alerts | https://docs.linuxgsm.com/alerts/discord
 discordalert="off"
 discordwebhook="webhook"
@@ -63,7 +66,6 @@ pushoveruserkey="userkey"
 # Rocket.Chat Alerts | https://docs.linuxgsm.com/alerts/rocket.chat
 rocketchatalert="off"
 rocketchatwebhook="webhook"
-rocketchattoken=""
 
 # Slack Alerts | https://docs.linuxgsm.com/alerts/slack
 slackalert="off"
diff --git a/lgsm/config-default/config-lgsm/ndserver/_default.cfg b/lgsm/config-default/config-lgsm/ndserver/_default.cfg
index de3a3aaec..fcf1caffb 100644
--- a/lgsm/config-default/config-lgsm/ndserver/_default.cfg
+++ b/lgsm/config-default/config-lgsm/ndserver/_default.cfg
@@ -36,6 +36,9 @@ displayip=""
 # More info | https://docs.linuxgsm.com/alerts#more-info
 postalert="off"
 
+# Alert on Start/Stop/Restart
+statusalert="off"
+
 # Discord Alerts | https://docs.linuxgsm.com/alerts/discord
 discordalert="off"
 discordwebhook="webhook"
@@ -68,7 +71,6 @@ pushoveruserkey="userkey"
 # Rocket.Chat Alerts | https://docs.linuxgsm.com/alerts/rocket.chat
 rocketchatalert="off"
 rocketchatwebhook="webhook"
-rocketchattoken=""
 
 # Slack Alerts | https://docs.linuxgsm.com/alerts/slack
 slackalert="off"
diff --git a/lgsm/config-default/config-lgsm/necserver/_default.cfg b/lgsm/config-default/config-lgsm/necserver/_default.cfg
index 4857107c8..993572b34 100644
--- a/lgsm/config-default/config-lgsm/necserver/_default.cfg
+++ b/lgsm/config-default/config-lgsm/necserver/_default.cfg
@@ -31,6 +31,9 @@ displayip=""
 # More info | https://docs.linuxgsm.com/alerts#more-info
 postalert="off"
 
+# Alert on Start/Stop/Restart
+statusalert="off"
+
 # Discord Alerts | https://docs.linuxgsm.com/alerts/discord
 discordalert="off"
 discordwebhook="webhook"
@@ -63,7 +66,6 @@ pushoveruserkey="userkey"
 # Rocket.Chat Alerts | https://docs.linuxgsm.com/alerts/rocket.chat
 rocketchatalert="off"
 rocketchatwebhook="webhook"
-rocketchattoken=""
 
 # Slack Alerts | https://docs.linuxgsm.com/alerts/slack
 slackalert="off"
diff --git a/lgsm/config-default/config-lgsm/nmrihserver/_default.cfg b/lgsm/config-default/config-lgsm/nmrihserver/_default.cfg
index e3b56f545..f3b740a3b 100644
--- a/lgsm/config-default/config-lgsm/nmrihserver/_default.cfg
+++ b/lgsm/config-default/config-lgsm/nmrihserver/_default.cfg
@@ -41,6 +41,9 @@ displayip=""
 # More info | https://docs.linuxgsm.com/alerts#more-info
 postalert="off"
 
+# Alert on Start/Stop/Restart
+statusalert="off"
+
 # Discord Alerts | https://docs.linuxgsm.com/alerts/discord
 discordalert="off"
 discordwebhook="webhook"
@@ -73,7 +76,6 @@ pushoveruserkey="userkey"
 # Rocket.Chat Alerts | https://docs.linuxgsm.com/alerts/rocket.chat
 rocketchatalert="off"
 rocketchatwebhook="webhook"
-rocketchattoken=""
 
 # Slack Alerts | https://docs.linuxgsm.com/alerts/slack
 slackalert="off"
diff --git a/lgsm/config-default/config-lgsm/ns2cserver/_default.cfg b/lgsm/config-default/config-lgsm/ns2cserver/_default.cfg
index 2ca53a335..fb4686c1e 100644
--- a/lgsm/config-default/config-lgsm/ns2cserver/_default.cfg
+++ b/lgsm/config-default/config-lgsm/ns2cserver/_default.cfg
@@ -43,6 +43,9 @@ displayip=""
 # More info | https://docs.linuxgsm.com/alerts#more-info
 postalert="off"
 
+# Alert on Start/Stop/Restart
+statusalert="off"
+
 # Discord Alerts | https://docs.linuxgsm.com/alerts/discord
 discordalert="off"
 discordwebhook="webhook"
@@ -75,7 +78,6 @@ pushoveruserkey="userkey"
 # Rocket.Chat Alerts | https://docs.linuxgsm.com/alerts/rocket.chat
 rocketchatalert="off"
 rocketchatwebhook="webhook"
-rocketchattoken=""
 
 # Slack Alerts | https://docs.linuxgsm.com/alerts/slack
 slackalert="off"
diff --git a/lgsm/config-default/config-lgsm/ns2server/_default.cfg b/lgsm/config-default/config-lgsm/ns2server/_default.cfg
index 3ee3a0514..8cca4da81 100644
--- a/lgsm/config-default/config-lgsm/ns2server/_default.cfg
+++ b/lgsm/config-default/config-lgsm/ns2server/_default.cfg
@@ -43,6 +43,9 @@ displayip=""
 # More info | https://docs.linuxgsm.com/alerts#more-info
 postalert="off"
 
+# Alert on Start/Stop/Restart
+statusalert="off"
+
 # Discord Alerts | https://docs.linuxgsm.com/alerts/discord
 discordalert="off"
 discordwebhook="webhook"
@@ -75,7 +78,6 @@ pushoveruserkey="userkey"
 # Rocket.Chat Alerts | https://docs.linuxgsm.com/alerts/rocket.chat
 rocketchatalert="off"
 rocketchatwebhook="webhook"
-rocketchattoken=""
 
 # Slack Alerts | https://docs.linuxgsm.com/alerts/slack
 slackalert="off"
diff --git a/lgsm/config-default/config-lgsm/nsserver/_default.cfg b/lgsm/config-default/config-lgsm/nsserver/_default.cfg
index 7880222fa..c207a0a10 100644
--- a/lgsm/config-default/config-lgsm/nsserver/_default.cfg
+++ b/lgsm/config-default/config-lgsm/nsserver/_default.cfg
@@ -35,6 +35,9 @@ displayip=""
 # More info | https://docs.linuxgsm.com/alerts#more-info
 postalert="off"
 
+# Alert on Start/Stop/Restart
+statusalert="off"
+
 # Discord Alerts | https://docs.linuxgsm.com/alerts/discord
 discordalert="off"
 discordwebhook="webhook"
@@ -67,7 +70,6 @@ pushoveruserkey="userkey"
 # Rocket.Chat Alerts | https://docs.linuxgsm.com/alerts/rocket.chat
 rocketchatalert="off"
 rocketchatwebhook="webhook"
-rocketchattoken=""
 
 # Slack Alerts | https://docs.linuxgsm.com/alerts/slack
 slackalert="off"
diff --git a/lgsm/config-default/config-lgsm/ohdserver/_default.cfg b/lgsm/config-default/config-lgsm/ohdserver/_default.cfg
index 25a418edc..58a42d3b3 100644
--- a/lgsm/config-default/config-lgsm/ohdserver/_default.cfg
+++ b/lgsm/config-default/config-lgsm/ohdserver/_default.cfg
@@ -38,6 +38,9 @@ displayip=""
 # More info | https://docs.linuxgsm.com/alerts#more-info
 postalert="off"
 
+# Alert on Start/Stop/Restart
+statusalert="off"
+
 # Discord Alerts | https://docs.linuxgsm.com/alerts/discord
 discordalert="off"
 discordwebhook="webhook"
@@ -70,7 +73,6 @@ pushoveruserkey="userkey"
 # Rocket.Chat Alerts | https://docs.linuxgsm.com/alerts/rocket.chat
 rocketchatalert="off"
 rocketchatwebhook="webhook"
-rocketchattoken=""
 
 # Slack Alerts | https://docs.linuxgsm.com/alerts/slack
 slackalert="off"
diff --git a/lgsm/config-default/config-lgsm/onsetserver/_default.cfg b/lgsm/config-default/config-lgsm/onsetserver/_default.cfg
index b25cfb60c..b0f0d00bc 100644
--- a/lgsm/config-default/config-lgsm/onsetserver/_default.cfg
+++ b/lgsm/config-default/config-lgsm/onsetserver/_default.cfg
@@ -28,6 +28,9 @@ displayip=""
 # More info | https://docs.linuxgsm.com/alerts#more-info
 postalert="off"
 
+# Alert on Start/Stop/Restart
+statusalert="off"
+
 # Discord Alerts | https://docs.linuxgsm.com/alerts/discord
 discordalert="off"
 discordwebhook="webhook"
@@ -60,7 +63,6 @@ pushoveruserkey="userkey"
 # Rocket.Chat Alerts | https://docs.linuxgsm.com/alerts/rocket.chat
 rocketchatalert="off"
 rocketchatwebhook="webhook"
-rocketchattoken=""
 
 # Slack Alerts | https://docs.linuxgsm.com/alerts/slack
 slackalert="off"
diff --git a/lgsm/config-default/config-lgsm/opforserver/_default.cfg b/lgsm/config-default/config-lgsm/opforserver/_default.cfg
index a0785a4b6..8ba202b14 100644
--- a/lgsm/config-default/config-lgsm/opforserver/_default.cfg
+++ b/lgsm/config-default/config-lgsm/opforserver/_default.cfg
@@ -35,6 +35,9 @@ displayip=""
 # More info | https://docs.linuxgsm.com/alerts#more-info
 postalert="off"
 
+# Alert on Start/Stop/Restart
+statusalert="off"
+
 # Discord Alerts | https://docs.linuxgsm.com/alerts/discord
 discordalert="off"
 discordwebhook="webhook"
@@ -67,7 +70,6 @@ pushoveruserkey="userkey"
 # Rocket.Chat Alerts | https://docs.linuxgsm.com/alerts/rocket.chat
 rocketchatalert="off"
 rocketchatwebhook="webhook"
-rocketchattoken=""
 
 # Slack Alerts | https://docs.linuxgsm.com/alerts/slack
 slackalert="off"
diff --git a/lgsm/config-default/config-lgsm/pc2server/_default.cfg b/lgsm/config-default/config-lgsm/pc2server/_default.cfg
index 1b9a6e6f1..b55447802 100644
--- a/lgsm/config-default/config-lgsm/pc2server/_default.cfg
+++ b/lgsm/config-default/config-lgsm/pc2server/_default.cfg
@@ -32,6 +32,9 @@ displayip=""
 # More info | https://docs.linuxgsm.com/alerts#more-info
 postalert="off"
 
+# Alert on Start/Stop/Restart
+statusalert="off"
+
 # Discord Alerts | https://docs.linuxgsm.com/alerts/discord
 discordalert="off"
 discordwebhook="webhook"
@@ -64,7 +67,6 @@ pushoveruserkey="userkey"
 # Rocket.Chat Alerts | https://docs.linuxgsm.com/alerts/rocket.chat
 rocketchatalert="off"
 rocketchatwebhook="webhook"
-rocketchattoken=""
 
 # Slack Alerts | https://docs.linuxgsm.com/alerts/slack
 slackalert="off"
diff --git a/lgsm/config-default/config-lgsm/pcserver/_default.cfg b/lgsm/config-default/config-lgsm/pcserver/_default.cfg
index 1d4b15394..2c1514488 100644
--- a/lgsm/config-default/config-lgsm/pcserver/_default.cfg
+++ b/lgsm/config-default/config-lgsm/pcserver/_default.cfg
@@ -28,6 +28,9 @@ displayip=""
 # More info | https://docs.linuxgsm.com/alerts#more-info
 postalert="off"
 
+# Alert on Start/Stop/Restart
+statusalert="off"
+
 # Discord Alerts | https://docs.linuxgsm.com/alerts/discord
 discordalert="off"
 discordwebhook="webhook"
@@ -60,7 +63,6 @@ pushoveruserkey="userkey"
 # Rocket.Chat Alerts | https://docs.linuxgsm.com/alerts/rocket.chat
 rocketchatalert="off"
 rocketchatwebhook="webhook"
-rocketchattoken=""
 
 # Slack Alerts | https://docs.linuxgsm.com/alerts/slack
 slackalert="off"
diff --git a/lgsm/config-default/config-lgsm/pmcserver/_default.cfg b/lgsm/config-default/config-lgsm/pmcserver/_default.cfg
index 430daefbe..57838ad98 100644
--- a/lgsm/config-default/config-lgsm/pmcserver/_default.cfg
+++ b/lgsm/config-default/config-lgsm/pmcserver/_default.cfg
@@ -35,6 +35,9 @@ displayip=""
 # More info | https://docs.linuxgsm.com/alerts#more-info
 postalert="off"
 
+# Alert on Start/Stop/Restart
+statusalert="off"
+
 # Discord Alerts | https://docs.linuxgsm.com/alerts/discord
 discordalert="off"
 discordwebhook="webhook"
@@ -67,7 +70,6 @@ pushoveruserkey="userkey"
 # Rocket.Chat Alerts | https://docs.linuxgsm.com/alerts/rocket.chat
 rocketchatalert="off"
 rocketchatwebhook="webhook"
-rocketchattoken=""
 
 # Slack Alerts | https://docs.linuxgsm.com/alerts/slack
 slackalert="off"
diff --git a/lgsm/config-default/config-lgsm/psserver/_default.cfg b/lgsm/config-default/config-lgsm/psserver/_default.cfg
index 9d8fa9383..143a3349d 100644
--- a/lgsm/config-default/config-lgsm/psserver/_default.cfg
+++ b/lgsm/config-default/config-lgsm/psserver/_default.cfg
@@ -37,6 +37,9 @@ displayip=""
 # More info | https://docs.linuxgsm.com/alerts#more-info
 postalert="off"
 
+# Alert on Start/Stop/Restart
+statusalert="off"
+
 # Discord Alerts | https://docs.linuxgsm.com/alerts/discord
 discordalert="off"
 discordwebhook="webhook"
@@ -69,7 +72,6 @@ pushoveruserkey="userkey"
 # Rocket.Chat Alerts | https://docs.linuxgsm.com/alerts/rocket.chat
 rocketchatalert="off"
 rocketchatwebhook="webhook"
-rocketchattoken=""
 
 # Slack Alerts | https://docs.linuxgsm.com/alerts/slack
 slackalert="off"
diff --git a/lgsm/config-default/config-lgsm/pvkiiserver/_default.cfg b/lgsm/config-default/config-lgsm/pvkiiserver/_default.cfg
index 7f8adbf5f..0565f806a 100644
--- a/lgsm/config-default/config-lgsm/pvkiiserver/_default.cfg
+++ b/lgsm/config-default/config-lgsm/pvkiiserver/_default.cfg
@@ -36,6 +36,9 @@ displayip=""
 # More info | https://docs.linuxgsm.com/alerts#more-info
 postalert="off"
 
+# Alert on Start/Stop/Restart
+statusalert="off"
+
 # Discord Alerts | https://docs.linuxgsm.com/alerts/discord
 discordalert="off"
 discordwebhook="webhook"
@@ -68,7 +71,6 @@ pushoveruserkey="userkey"
 # Rocket.Chat Alerts | https://docs.linuxgsm.com/alerts/rocket.chat
 rocketchatalert="off"
 rocketchatwebhook="webhook"
-rocketchattoken=""
 
 # Slack Alerts | https://docs.linuxgsm.com/alerts/slack
 slackalert="off"
diff --git a/lgsm/config-default/config-lgsm/pvrserver/_default.cfg b/lgsm/config-default/config-lgsm/pvrserver/_default.cfg
index 12e089fe0..c84064900 100644
--- a/lgsm/config-default/config-lgsm/pvrserver/_default.cfg
+++ b/lgsm/config-default/config-lgsm/pvrserver/_default.cfg
@@ -36,6 +36,9 @@ displayip=""
 # More info | https://docs.linuxgsm.com/alerts#more-info
 postalert="off"
 
+# Alert on Start/Stop/Restart
+statusalert="off"
+
 # Discord Alerts | https://docs.linuxgsm.com/alerts/discord
 discordalert="off"
 discordwebhook="webhook"
@@ -68,7 +71,6 @@ pushoveruserkey="userkey"
 # Rocket.Chat Alerts | https://docs.linuxgsm.com/alerts/rocket.chat
 rocketchatalert="off"
 rocketchatwebhook="webhook"
-rocketchattoken=""
 
 # Slack Alerts | https://docs.linuxgsm.com/alerts/slack
 slackalert="off"
diff --git a/lgsm/config-default/config-lgsm/pzserver/_default.cfg b/lgsm/config-default/config-lgsm/pzserver/_default.cfg
index a3a5ac340..5a34c04bc 100644
--- a/lgsm/config-default/config-lgsm/pzserver/_default.cfg
+++ b/lgsm/config-default/config-lgsm/pzserver/_default.cfg
@@ -32,6 +32,9 @@ displayip=""
 # More info | https://docs.linuxgsm.com/alerts#more-info
 postalert="off"
 
+# Alert on Start/Stop/Restart
+statusalert="off"
+
 # Discord Alerts | https://docs.linuxgsm.com/alerts/discord
 discordalert="off"
 discordwebhook="webhook"
@@ -64,7 +67,6 @@ pushoveruserkey="userkey"
 # Rocket.Chat Alerts | https://docs.linuxgsm.com/alerts/rocket.chat
 rocketchatalert="off"
 rocketchatwebhook="webhook"
-rocketchattoken=""
 
 # Slack Alerts | https://docs.linuxgsm.com/alerts/slack
 slackalert="off"
diff --git a/lgsm/config-default/config-lgsm/q2server/_default.cfg b/lgsm/config-default/config-lgsm/q2server/_default.cfg
index 0d899df65..b92c36c38 100644
--- a/lgsm/config-default/config-lgsm/q2server/_default.cfg
+++ b/lgsm/config-default/config-lgsm/q2server/_default.cfg
@@ -33,6 +33,9 @@ displayip=""
 # More info | https://docs.linuxgsm.com/alerts#more-info
 postalert="off"
 
+# Alert on Start/Stop/Restart
+statusalert="off"
+
 # Discord Alerts | https://docs.linuxgsm.com/alerts/discord
 discordalert="off"
 discordwebhook="webhook"
@@ -65,7 +68,6 @@ pushoveruserkey="userkey"
 # Rocket.Chat Alerts | https://docs.linuxgsm.com/alerts/rocket.chat
 rocketchatalert="off"
 rocketchatwebhook="webhook"
-rocketchattoken=""
 
 # Slack Alerts | https://docs.linuxgsm.com/alerts/slack
 slackalert="off"
diff --git a/lgsm/config-default/config-lgsm/q3server/_default.cfg b/lgsm/config-default/config-lgsm/q3server/_default.cfg
index e53fb4285..534bf2429 100644
--- a/lgsm/config-default/config-lgsm/q3server/_default.cfg
+++ b/lgsm/config-default/config-lgsm/q3server/_default.cfg
@@ -33,6 +33,9 @@ displayip=""
 # More info | https://docs.linuxgsm.com/alerts#more-info
 postalert="off"
 
+# Alert on Start/Stop/Restart
+statusalert="off"
+
 # Discord Alerts | https://docs.linuxgsm.com/alerts/discord
 discordalert="off"
 discordwebhook="webhook"
@@ -65,7 +68,6 @@ pushoveruserkey="userkey"
 # Rocket.Chat Alerts | https://docs.linuxgsm.com/alerts/rocket.chat
 rocketchatalert="off"
 rocketchatwebhook="webhook"
-rocketchattoken=""
 
 # Slack Alerts | https://docs.linuxgsm.com/alerts/slack
 slackalert="off"
diff --git a/lgsm/config-default/config-lgsm/qlserver/_default.cfg b/lgsm/config-default/config-lgsm/qlserver/_default.cfg
index 3f28329ac..5d5614a02 100644
--- a/lgsm/config-default/config-lgsm/qlserver/_default.cfg
+++ b/lgsm/config-default/config-lgsm/qlserver/_default.cfg
@@ -28,6 +28,9 @@ displayip=""
 # More info | https://docs.linuxgsm.com/alerts#more-info
 postalert="off"
 
+# Alert on Start/Stop/Restart
+statusalert="off"
+
 # Discord Alerts | https://docs.linuxgsm.com/alerts/discord
 discordalert="off"
 discordwebhook="webhook"
@@ -60,7 +63,6 @@ pushoveruserkey="userkey"
 # Rocket.Chat Alerts | https://docs.linuxgsm.com/alerts/rocket.chat
 rocketchatalert="off"
 rocketchatwebhook="webhook"
-rocketchattoken=""
 
 # Slack Alerts | https://docs.linuxgsm.com/alerts/slack
 slackalert="off"
diff --git a/lgsm/config-default/config-lgsm/qwserver/_default.cfg b/lgsm/config-default/config-lgsm/qwserver/_default.cfg
index 95dea75f8..63d554f27 100644
--- a/lgsm/config-default/config-lgsm/qwserver/_default.cfg
+++ b/lgsm/config-default/config-lgsm/qwserver/_default.cfg
@@ -32,6 +32,9 @@ displayip=""
 # More info | https://docs.linuxgsm.com/alerts#more-info
 postalert="off"
 
+# Alert on Start/Stop/Restart
+statusalert="off"
+
 # Discord Alerts | https://docs.linuxgsm.com/alerts/discord
 discordalert="off"
 discordwebhook="webhook"
@@ -64,7 +67,6 @@ pushoveruserkey="userkey"
 # Rocket.Chat Alerts | https://docs.linuxgsm.com/alerts/rocket.chat
 rocketchatalert="off"
 rocketchatwebhook="webhook"
-rocketchattoken=""
 
 # Slack Alerts | https://docs.linuxgsm.com/alerts/slack
 slackalert="off"
diff --git a/lgsm/config-default/config-lgsm/ricochetserver/_default.cfg b/lgsm/config-default/config-lgsm/ricochetserver/_default.cfg
index 419825ec1..36845b0a2 100644
--- a/lgsm/config-default/config-lgsm/ricochetserver/_default.cfg
+++ b/lgsm/config-default/config-lgsm/ricochetserver/_default.cfg
@@ -35,6 +35,9 @@ displayip=""
 # More info | https://docs.linuxgsm.com/alerts#more-info
 postalert="off"
 
+# Alert on Start/Stop/Restart
+statusalert="off"
+
 # Discord Alerts | https://docs.linuxgsm.com/alerts/discord
 discordalert="off"
 discordwebhook="webhook"
@@ -67,7 +70,6 @@ pushoveruserkey="userkey"
 # Rocket.Chat Alerts | https://docs.linuxgsm.com/alerts/rocket.chat
 rocketchatalert="off"
 rocketchatwebhook="webhook"
-rocketchattoken=""
 
 # Slack Alerts | https://docs.linuxgsm.com/alerts/slack
 slackalert="off"
diff --git a/lgsm/config-default/config-lgsm/roserver/_default.cfg b/lgsm/config-default/config-lgsm/roserver/_default.cfg
index 4617289fd..1a95add2a 100644
--- a/lgsm/config-default/config-lgsm/roserver/_default.cfg
+++ b/lgsm/config-default/config-lgsm/roserver/_default.cfg
@@ -36,6 +36,9 @@ displayip=""
 # More info | https://docs.linuxgsm.com/alerts#more-info
 postalert="off"
 
+# Alert on Start/Stop/Restart
+statusalert="off"
+
 # Discord Alerts | https://docs.linuxgsm.com/alerts/discord
 discordalert="off"
 discordwebhook="webhook"
@@ -68,7 +71,6 @@ pushoveruserkey="userkey"
 # Rocket.Chat Alerts | https://docs.linuxgsm.com/alerts/rocket.chat
 rocketchatalert="off"
 rocketchatwebhook="webhook"
-rocketchattoken=""
 
 # Slack Alerts | https://docs.linuxgsm.com/alerts/slack
 slackalert="off"
diff --git a/lgsm/config-default/config-lgsm/rtcwserver/_default.cfg b/lgsm/config-default/config-lgsm/rtcwserver/_default.cfg
index 159b8dfd4..d62dcb048 100644
--- a/lgsm/config-default/config-lgsm/rtcwserver/_default.cfg
+++ b/lgsm/config-default/config-lgsm/rtcwserver/_default.cfg
@@ -33,6 +33,9 @@ displayip=""
 # More info | https://docs.linuxgsm.com/alerts#more-info
 postalert="off"
 
+# Alert on Start/Stop/Restart
+statusalert="off"
+
 # Discord Alerts | https://docs.linuxgsm.com/alerts/discord
 discordalert="off"
 discordwebhook="webhook"
@@ -65,7 +68,6 @@ pushoveruserkey="userkey"
 # Rocket.Chat Alerts | https://docs.linuxgsm.com/alerts/rocket.chat
 rocketchatalert="off"
 rocketchatwebhook="webhook"
-rocketchattoken=""
 
 # Slack Alerts | https://docs.linuxgsm.com/alerts/slack
 slackalert="off"
diff --git a/lgsm/config-default/config-lgsm/rustserver/_default.cfg b/lgsm/config-default/config-lgsm/rustserver/_default.cfg
index 9a4bfe147..e04577792 100644
--- a/lgsm/config-default/config-lgsm/rustserver/_default.cfg
+++ b/lgsm/config-default/config-lgsm/rustserver/_default.cfg
@@ -47,6 +47,9 @@ displayip=""
 # More info | https://docs.linuxgsm.com/alerts#more-info
 postalert="off"
 
+# Alert on Start/Stop/Restart
+statusalert="off"
+
 # Discord Alerts | https://docs.linuxgsm.com/alerts/discord
 discordalert="off"
 discordwebhook="webhook"
@@ -79,7 +82,6 @@ pushoveruserkey="userkey"
 # Rocket.Chat Alerts | https://docs.linuxgsm.com/alerts/rocket.chat
 rocketchatalert="off"
 rocketchatwebhook="webhook"
-rocketchattoken=""
 
 # Slack Alerts | https://docs.linuxgsm.com/alerts/slack
 slackalert="off"
diff --git a/lgsm/config-default/config-lgsm/rwserver/_default.cfg b/lgsm/config-default/config-lgsm/rwserver/_default.cfg
index c714045ca..9a798c66c 100644
--- a/lgsm/config-default/config-lgsm/rwserver/_default.cfg
+++ b/lgsm/config-default/config-lgsm/rwserver/_default.cfg
@@ -28,6 +28,9 @@ displayip=""
 # More info | https://docs.linuxgsm.com/alerts#more-info
 postalert="off"
 
+# Alert on Start/Stop/Restart
+statusalert="off"
+
 # Discord Alerts | https://docs.linuxgsm.com/alerts/discord
 discordalert="off"
 discordwebhook="webhook"
@@ -60,7 +63,6 @@ pushoveruserkey="userkey"
 # Rocket.Chat Alerts | https://docs.linuxgsm.com/alerts/rocket.chat
 rocketchatalert="off"
 rocketchatwebhook="webhook"
-rocketchattoken=""
 
 # Slack Alerts | https://docs.linuxgsm.com/alerts/slack
 slackalert="off"
diff --git a/lgsm/config-default/config-lgsm/sampserver/_default.cfg b/lgsm/config-default/config-lgsm/sampserver/_default.cfg
index 448f8c20f..1dbeaaccf 100644
--- a/lgsm/config-default/config-lgsm/sampserver/_default.cfg
+++ b/lgsm/config-default/config-lgsm/sampserver/_default.cfg
@@ -32,6 +32,9 @@ displayip=""
 # More info | https://docs.linuxgsm.com/alerts#more-info
 postalert="off"
 
+# Alert on Start/Stop/Restart
+statusalert="off"
+
 # Discord Alerts | https://docs.linuxgsm.com/alerts/discord
 discordalert="off"
 discordwebhook="webhook"
@@ -64,7 +67,6 @@ pushoveruserkey="userkey"
 # Rocket.Chat Alerts | https://docs.linuxgsm.com/alerts/rocket.chat
 rocketchatalert="off"
 rocketchatwebhook="webhook"
-rocketchattoken=""
 
 # Slack Alerts | https://docs.linuxgsm.com/alerts/slack
 slackalert="off"
diff --git a/lgsm/config-default/config-lgsm/sbotsserver/_default.cfg b/lgsm/config-default/config-lgsm/sbotsserver/_default.cfg
index e5fe5b5d8..a5b1aa9a8 100644
--- a/lgsm/config-default/config-lgsm/sbotsserver/_default.cfg
+++ b/lgsm/config-default/config-lgsm/sbotsserver/_default.cfg
@@ -34,6 +34,9 @@ displayip=""
 # More info | https://docs.linuxgsm.com/alerts#more-info
 postalert="off"
 
+# Alert on Start/Stop/Restart
+statusalert="off"
+
 # Discord Alerts | https://docs.linuxgsm.com/alerts/discord
 discordalert="off"
 discordwebhook="webhook"
@@ -66,7 +69,6 @@ pushoveruserkey="userkey"
 # Rocket.Chat Alerts | https://docs.linuxgsm.com/alerts/rocket.chat
 rocketchatalert="off"
 rocketchatwebhook="webhook"
-rocketchattoken=""
 
 # Slack Alerts | https://docs.linuxgsm.com/alerts/slack
 slackalert="off"
diff --git a/lgsm/config-default/config-lgsm/sbserver/_default.cfg b/lgsm/config-default/config-lgsm/sbserver/_default.cfg
index 79e447454..6032abe06 100644
--- a/lgsm/config-default/config-lgsm/sbserver/_default.cfg
+++ b/lgsm/config-default/config-lgsm/sbserver/_default.cfg
@@ -35,6 +35,9 @@ displayip=""
 # More info | https://docs.linuxgsm.com/alerts#more-info
 postalert="off"
 
+# Alert on Start/Stop/Restart
+statusalert="off"
+
 # Discord Alerts | https://docs.linuxgsm.com/alerts/discord
 discordalert="off"
 discordwebhook="webhook"
@@ -67,7 +70,6 @@ pushoveruserkey="userkey"
 # Rocket.Chat Alerts | https://docs.linuxgsm.com/alerts/rocket.chat
 rocketchatalert="off"
 rocketchatwebhook="webhook"
-rocketchattoken=""
 
 # Slack Alerts | https://docs.linuxgsm.com/alerts/slack
 slackalert="off"
diff --git a/lgsm/config-default/config-lgsm/scpslserver/_default.cfg b/lgsm/config-default/config-lgsm/scpslserver/_default.cfg
index ad2e2f9d5..f00574bd8 100644
--- a/lgsm/config-default/config-lgsm/scpslserver/_default.cfg
+++ b/lgsm/config-default/config-lgsm/scpslserver/_default.cfg
@@ -33,6 +33,9 @@ displayip=""
 # More info | https://docs.linuxgsm.com/alerts#more-info
 postalert="off"
 
+# Alert on Start/Stop/Restart
+statusalert="off"
+
 # Discord Alerts | https://docs.linuxgsm.com/alerts/discord
 discordalert="off"
 discordwebhook="webhook"
@@ -65,7 +68,6 @@ pushoveruserkey="userkey"
 # Rocket.Chat Alerts | https://docs.linuxgsm.com/alerts/rocket.chat
 rocketchatalert="off"
 rocketchatwebhook="webhook"
-rocketchattoken=""
 
 # Slack Alerts | https://docs.linuxgsm.com/alerts/slack
 slackalert="off"
diff --git a/lgsm/config-default/config-lgsm/scpslsmserver/_default.cfg b/lgsm/config-default/config-lgsm/scpslsmserver/_default.cfg
index 6c7a7b3ca..bb26d6ca6 100644
--- a/lgsm/config-default/config-lgsm/scpslsmserver/_default.cfg
+++ b/lgsm/config-default/config-lgsm/scpslsmserver/_default.cfg
@@ -33,6 +33,9 @@ displayip=""
 # More info | https://docs.linuxgsm.com/alerts#more-info
 postalert="off"
 
+# Alert on Start/Stop/Restart
+statusalert="off"
+
 # Discord Alerts | https://docs.linuxgsm.com/alerts/discord
 discordalert="off"
 discordwebhook="webhook"
@@ -65,7 +68,6 @@ pushoveruserkey="userkey"
 # Rocket.Chat Alerts | https://docs.linuxgsm.com/alerts/rocket.chat
 rocketchatalert="off"
 rocketchatwebhook="webhook"
-rocketchattoken=""
 
 # Slack Alerts | https://docs.linuxgsm.com/alerts/slack
 slackalert="off"
diff --git a/lgsm/config-default/config-lgsm/sdtdserver/_default.cfg b/lgsm/config-default/config-lgsm/sdtdserver/_default.cfg
index b2c8e00f0..61cd85a8a 100644
--- a/lgsm/config-default/config-lgsm/sdtdserver/_default.cfg
+++ b/lgsm/config-default/config-lgsm/sdtdserver/_default.cfg
@@ -31,6 +31,9 @@ displayip=""
 # More info | https://docs.linuxgsm.com/alerts#more-info
 postalert="off"
 
+# Alert on Start/Stop/Restart
+statusalert="off"
+
 # Discord Alerts | https://docs.linuxgsm.com/alerts/discord
 discordalert="off"
 discordwebhook="webhook"
@@ -63,7 +66,6 @@ pushoveruserkey="userkey"
 # Rocket.Chat Alerts | https://docs.linuxgsm.com/alerts/rocket.chat
 rocketchatalert="off"
 rocketchatwebhook="webhook"
-rocketchattoken=""
 
 # Slack Alerts | https://docs.linuxgsm.com/alerts/slack
 slackalert="off"
diff --git a/lgsm/config-default/config-lgsm/sfcserver/_default.cfg b/lgsm/config-default/config-lgsm/sfcserver/_default.cfg
index b566de690..40c5a0c18 100644
--- a/lgsm/config-default/config-lgsm/sfcserver/_default.cfg
+++ b/lgsm/config-default/config-lgsm/sfcserver/_default.cfg
@@ -36,6 +36,9 @@ displayip=""
 # More info | https://docs.linuxgsm.com/alerts#more-info
 postalert="off"
 
+# Alert on Start/Stop/Restart
+statusalert="off"
+
 # Discord Alerts | https://docs.linuxgsm.com/alerts/discord
 discordalert="off"
 discordwebhook="webhook"
@@ -68,7 +71,6 @@ pushoveruserkey="userkey"
 # Rocket.Chat Alerts | https://docs.linuxgsm.com/alerts/rocket.chat
 rocketchatalert="off"
 rocketchatwebhook="webhook"
-rocketchattoken=""
 
 # Slack Alerts | https://docs.linuxgsm.com/alerts/slack
 slackalert="off"
diff --git a/lgsm/config-default/config-lgsm/sfserver/_default.cfg b/lgsm/config-default/config-lgsm/sfserver/_default.cfg
index 46d0ebf88..4beb002f6 100644
--- a/lgsm/config-default/config-lgsm/sfserver/_default.cfg
+++ b/lgsm/config-default/config-lgsm/sfserver/_default.cfg
@@ -34,6 +34,9 @@ displayip=""
 # More info | https://docs.linuxgsm.com/alerts#more-info
 postalert="off"
 
+# Alert on Start/Stop/Restart
+statusalert="off"
+
 # Discord Alerts | https://docs.linuxgsm.com/alerts/discord
 discordalert="off"
 discordwebhook="webhook"
@@ -66,7 +69,6 @@ pushoveruserkey="userkey"
 # Rocket.Chat Alerts | https://docs.linuxgsm.com/alerts/rocket.chat
 rocketchatalert="off"
 rocketchatwebhook="webhook"
-rocketchattoken=""
 
 # Slack Alerts | https://docs.linuxgsm.com/alerts/slack
 slackalert="off"
diff --git a/lgsm/config-default/config-lgsm/sof2server/_default.cfg b/lgsm/config-default/config-lgsm/sof2server/_default.cfg
index 6169950c0..59fb8373b 100644
--- a/lgsm/config-default/config-lgsm/sof2server/_default.cfg
+++ b/lgsm/config-default/config-lgsm/sof2server/_default.cfg
@@ -33,6 +33,9 @@ displayip=""
 # More info | https://docs.linuxgsm.com/alerts#more-info
 postalert="off"
 
+# Alert on Start/Stop/Restart
+statusalert="off"
+
 # Discord Alerts | https://docs.linuxgsm.com/alerts/discord
 discordalert="off"
 discordwebhook="webhook"
@@ -65,7 +68,6 @@ pushoveruserkey="userkey"
 # Rocket.Chat Alerts | https://docs.linuxgsm.com/alerts/rocket.chat
 rocketchatalert="off"
 rocketchatwebhook="webhook"
-rocketchattoken=""
 
 # Slack Alerts | https://docs.linuxgsm.com/alerts/slack
 slackalert="off"
diff --git a/lgsm/config-default/config-lgsm/solserver/_default.cfg b/lgsm/config-default/config-lgsm/solserver/_default.cfg
index 671dcd429..601018529 100644
--- a/lgsm/config-default/config-lgsm/solserver/_default.cfg
+++ b/lgsm/config-default/config-lgsm/solserver/_default.cfg
@@ -32,6 +32,9 @@ displayip=""
 # More info | https://docs.linuxgsm.com/alerts#more-info
 postalert="off"
 
+# Alert on Start/Stop/Restart
+statusalert="off"
+
 # Discord Alerts | https://docs.linuxgsm.com/alerts/discord
 discordalert="off"
 discordwebhook="webhook"
@@ -64,7 +67,6 @@ pushoveruserkey="userkey"
 # Rocket.Chat Alerts | https://docs.linuxgsm.com/alerts/rocket.chat
 rocketchatalert="off"
 rocketchatwebhook="webhook"
-rocketchattoken=""
 
 # Slack Alerts | https://docs.linuxgsm.com/alerts/slack
 slackalert="off"
diff --git a/lgsm/config-default/config-lgsm/squadserver/_default.cfg b/lgsm/config-default/config-lgsm/squadserver/_default.cfg
index dbaa3c736..424d81f32 100644
--- a/lgsm/config-default/config-lgsm/squadserver/_default.cfg
+++ b/lgsm/config-default/config-lgsm/squadserver/_default.cfg
@@ -33,6 +33,9 @@ displayip=""
 # More info | https://docs.linuxgsm.com/alerts#more-info
 postalert="off"
 
+# Alert on Start/Stop/Restart
+statusalert="off"
+
 # Discord Alerts | https://docs.linuxgsm.com/alerts/discord
 discordalert="off"
 discordwebhook="webhook"
@@ -65,7 +68,6 @@ pushoveruserkey="userkey"
 # Rocket.Chat Alerts | https://docs.linuxgsm.com/alerts/rocket.chat
 rocketchatalert="off"
 rocketchatwebhook="webhook"
-rocketchattoken=""
 
 # Slack Alerts | https://docs.linuxgsm.com/alerts/slack
 slackalert="off"
diff --git a/lgsm/config-default/config-lgsm/stnserver/_default.cfg b/lgsm/config-default/config-lgsm/stnserver/_default.cfg
index 3e5f97c7b..7bf2d7234 100644
--- a/lgsm/config-default/config-lgsm/stnserver/_default.cfg
+++ b/lgsm/config-default/config-lgsm/stnserver/_default.cfg
@@ -32,6 +32,9 @@ displayip=""
 # More info | https://docs.linuxgsm.com/alerts#more-info
 postalert="off"
 
+# Alert on Start/Stop/Restart
+statusalert="off"
+
 # Discord Alerts | https://docs.linuxgsm.com/alerts/discord
 discordalert="off"
 discordwebhook="webhook"
@@ -64,7 +67,6 @@ pushoveruserkey="userkey"
 # Rocket.Chat Alerts | https://docs.linuxgsm.com/alerts/rocket.chat
 rocketchatalert="off"
 rocketchatwebhook="webhook"
-rocketchattoken=""
 
 # Slack Alerts | https://docs.linuxgsm.com/alerts/slack
 slackalert="off"
diff --git a/lgsm/config-default/config-lgsm/stserver/_default.cfg b/lgsm/config-default/config-lgsm/stserver/_default.cfg
index 980c4e045..e245c57c0 100644
--- a/lgsm/config-default/config-lgsm/stserver/_default.cfg
+++ b/lgsm/config-default/config-lgsm/stserver/_default.cfg
@@ -32,6 +32,9 @@ displayip=""
 # More info | https://docs.linuxgsm.com/alerts#more-info
 postalert="off"
 
+# Alert on Start/Stop/Restart
+statusalert="off"
+
 # Discord Alerts | https://docs.linuxgsm.com/alerts/discord
 discordalert="off"
 discordwebhook="webhook"
@@ -64,7 +67,6 @@ pushoveruserkey="userkey"
 # Rocket.Chat Alerts | https://docs.linuxgsm.com/alerts/rocket.chat
 rocketchatalert="off"
 rocketchatwebhook="webhook"
-rocketchattoken=""
 
 # Slack Alerts | https://docs.linuxgsm.com/alerts/slack
 slackalert="off"
diff --git a/lgsm/config-default/config-lgsm/svenserver/_default.cfg b/lgsm/config-default/config-lgsm/svenserver/_default.cfg
index 7f47091e4..11822d1f1 100644
--- a/lgsm/config-default/config-lgsm/svenserver/_default.cfg
+++ b/lgsm/config-default/config-lgsm/svenserver/_default.cfg
@@ -35,6 +35,9 @@ displayip=""
 # More info | https://docs.linuxgsm.com/alerts#more-info
 postalert="off"
 
+# Alert on Start/Stop/Restart
+statusalert="off"
+
 # Discord Alerts | https://docs.linuxgsm.com/alerts/discord
 discordalert="off"
 discordwebhook="webhook"
@@ -67,7 +70,6 @@ pushoveruserkey="userkey"
 # Rocket.Chat Alerts | https://docs.linuxgsm.com/alerts/rocket.chat
 rocketchatalert="off"
 rocketchatwebhook="webhook"
-rocketchattoken=""
 
 # Slack Alerts | https://docs.linuxgsm.com/alerts/slack
 slackalert="off"
diff --git a/lgsm/config-default/config-lgsm/terrariaserver/_default.cfg b/lgsm/config-default/config-lgsm/terrariaserver/_default.cfg
index 562b0fd9b..0fc6a06b2 100644
--- a/lgsm/config-default/config-lgsm/terrariaserver/_default.cfg
+++ b/lgsm/config-default/config-lgsm/terrariaserver/_default.cfg
@@ -35,6 +35,9 @@ displayip=""
 # More info | https://docs.linuxgsm.com/alerts#more-info
 postalert="off"
 
+# Alert on Start/Stop/Restart
+statusalert="off"
+
 # Discord Alerts | https://docs.linuxgsm.com/alerts/discord
 discordalert="off"
 discordwebhook="webhook"
@@ -67,7 +70,6 @@ pushoveruserkey="userkey"
 # Rocket.Chat Alerts | https://docs.linuxgsm.com/alerts/rocket.chat
 rocketchatalert="off"
 rocketchatwebhook="webhook"
-rocketchattoken=""
 
 # Slack Alerts | https://docs.linuxgsm.com/alerts/slack
 slackalert="off"
diff --git a/lgsm/config-default/config-lgsm/tf2server/_default.cfg b/lgsm/config-default/config-lgsm/tf2server/_default.cfg
index d7d53928b..7d3164e0e 100644
--- a/lgsm/config-default/config-lgsm/tf2server/_default.cfg
+++ b/lgsm/config-default/config-lgsm/tf2server/_default.cfg
@@ -41,6 +41,9 @@ displayip=""
 # More info | https://docs.linuxgsm.com/alerts#more-info
 postalert="off"
 
+# Alert on Start/Stop/Restart
+statusalert="off"
+
 # Discord Alerts | https://docs.linuxgsm.com/alerts/discord
 discordalert="off"
 discordwebhook="webhook"
@@ -73,7 +76,6 @@ pushoveruserkey="userkey"
 # Rocket.Chat Alerts | https://docs.linuxgsm.com/alerts/rocket.chat
 rocketchatalert="off"
 rocketchatwebhook="webhook"
-rocketchattoken=""
 
 # Slack Alerts | https://docs.linuxgsm.com/alerts/slack
 slackalert="off"
diff --git a/lgsm/config-default/config-lgsm/tfcserver/_default.cfg b/lgsm/config-default/config-lgsm/tfcserver/_default.cfg
index 6709767a9..3334509a1 100644
--- a/lgsm/config-default/config-lgsm/tfcserver/_default.cfg
+++ b/lgsm/config-default/config-lgsm/tfcserver/_default.cfg
@@ -35,6 +35,9 @@ displayip=""
 # More info | https://docs.linuxgsm.com/alerts#more-info
 postalert="off"
 
+# Alert on Start/Stop/Restart
+statusalert="off"
+
 # Discord Alerts | https://docs.linuxgsm.com/alerts/discord
 discordalert="off"
 discordwebhook="webhook"
@@ -67,7 +70,6 @@ pushoveruserkey="userkey"
 # Rocket.Chat Alerts | https://docs.linuxgsm.com/alerts/rocket.chat
 rocketchatalert="off"
 rocketchatwebhook="webhook"
-rocketchattoken=""
 
 # Slack Alerts | https://docs.linuxgsm.com/alerts/slack
 slackalert="off"
diff --git a/lgsm/config-default/config-lgsm/tiserver/_default.cfg b/lgsm/config-default/config-lgsm/tiserver/_default.cfg
index 994a2574a..dd3e1dd90 100644
--- a/lgsm/config-default/config-lgsm/tiserver/_default.cfg
+++ b/lgsm/config-default/config-lgsm/tiserver/_default.cfg
@@ -33,6 +33,9 @@ displayip=""
 # More info | https://docs.linuxgsm.com/alerts#more-info
 postalert="off"
 
+# Alert on Start/Stop/Restart
+statusalert="off"
+
 # Discord Alerts | https://docs.linuxgsm.com/alerts/discord
 discordalert="off"
 discordwebhook="webhook"
@@ -65,7 +68,6 @@ pushoveruserkey="userkey"
 # Rocket.Chat Alerts | https://docs.linuxgsm.com/alerts/rocket.chat
 rocketchatalert="off"
 rocketchatwebhook="webhook"
-rocketchattoken=""
 
 # Slack Alerts | https://docs.linuxgsm.com/alerts/slack
 slackalert="off"
diff --git a/lgsm/config-default/config-lgsm/ts3server/_default.cfg b/lgsm/config-default/config-lgsm/ts3server/_default.cfg
index dc3e7a3fa..36c0d2bae 100644
--- a/lgsm/config-default/config-lgsm/ts3server/_default.cfg
+++ b/lgsm/config-default/config-lgsm/ts3server/_default.cfg
@@ -28,6 +28,9 @@ displayip=""
 # More info | https://docs.linuxgsm.com/alerts#more-info
 postalert="off"
 
+# Alert on Start/Stop/Restart
+statusalert="off"
+
 # Discord Alerts | https://docs.linuxgsm.com/alerts/discord
 discordalert="off"
 discordwebhook="webhook"
@@ -60,7 +63,6 @@ pushoveruserkey="userkey"
 # Rocket.Chat Alerts | https://docs.linuxgsm.com/alerts/rocket.chat
 rocketchatalert="off"
 rocketchatwebhook="webhook"
-rocketchattoken=""
 
 # Slack Alerts | https://docs.linuxgsm.com/alerts/slack
 slackalert="off"
diff --git a/lgsm/config-default/config-lgsm/tsserver/_default.cfg b/lgsm/config-default/config-lgsm/tsserver/_default.cfg
index c9ea3b381..05189f90b 100644
--- a/lgsm/config-default/config-lgsm/tsserver/_default.cfg
+++ b/lgsm/config-default/config-lgsm/tsserver/_default.cfg
@@ -35,6 +35,9 @@ displayip=""
 # More info | https://docs.linuxgsm.com/alerts#more-info
 postalert="off"
 
+# Alert on Start/Stop/Restart
+statusalert="off"
+
 # Discord Alerts | https://docs.linuxgsm.com/alerts/discord
 discordalert="off"
 discordwebhook="webhook"
@@ -67,7 +70,6 @@ pushoveruserkey="userkey"
 # Rocket.Chat Alerts | https://docs.linuxgsm.com/alerts/rocket.chat
 rocketchatalert="off"
 rocketchatwebhook="webhook"
-rocketchattoken=""
 
 # Slack Alerts | https://docs.linuxgsm.com/alerts/slack
 slackalert="off"
diff --git a/lgsm/config-default/config-lgsm/tuserver/_default.cfg b/lgsm/config-default/config-lgsm/tuserver/_default.cfg
index 551ce95f4..086968e98 100644
--- a/lgsm/config-default/config-lgsm/tuserver/_default.cfg
+++ b/lgsm/config-default/config-lgsm/tuserver/_default.cfg
@@ -38,6 +38,9 @@ displayip=""
 # More info | https://docs.linuxgsm.com/alerts#more-info
 postalert="off"
 
+# Alert on Start/Stop/Restart
+statusalert="off"
+
 # Discord Alerts | https://docs.linuxgsm.com/alerts/discord
 discordalert="off"
 discordwebhook="webhook"
@@ -70,7 +73,6 @@ pushoveruserkey="userkey"
 # Rocket.Chat Alerts | https://docs.linuxgsm.com/alerts/rocket.chat
 rocketchatalert="off"
 rocketchatwebhook="webhook"
-rocketchattoken=""
 
 # Slack Alerts | https://docs.linuxgsm.com/alerts/slack
 slackalert="off"
diff --git a/lgsm/config-default/config-lgsm/twserver/_default.cfg b/lgsm/config-default/config-lgsm/twserver/_default.cfg
index d7e84704a..6f9c2adb6 100644
--- a/lgsm/config-default/config-lgsm/twserver/_default.cfg
+++ b/lgsm/config-default/config-lgsm/twserver/_default.cfg
@@ -35,6 +35,9 @@ displayip=""
 # More info | https://docs.linuxgsm.com/alerts#more-info
 postalert="off"
 
+# Alert on Start/Stop/Restart
+statusalert="off"
+
 # Discord Alerts | https://docs.linuxgsm.com/alerts/discord
 discordalert="off"
 discordwebhook="webhook"
@@ -67,7 +70,6 @@ pushoveruserkey="userkey"
 # Rocket.Chat Alerts | https://docs.linuxgsm.com/alerts/rocket.chat
 rocketchatalert="off"
 rocketchatwebhook="webhook"
-rocketchattoken=""
 
 # Slack Alerts | https://docs.linuxgsm.com/alerts/slack
 slackalert="off"
diff --git a/lgsm/config-default/config-lgsm/untserver/_default.cfg b/lgsm/config-default/config-lgsm/untserver/_default.cfg
index b250d3284..e76aefba4 100644
--- a/lgsm/config-default/config-lgsm/untserver/_default.cfg
+++ b/lgsm/config-default/config-lgsm/untserver/_default.cfg
@@ -42,6 +42,9 @@ displayip=""
 # More info | https://docs.linuxgsm.com/alerts#more-info
 postalert="off"
 
+# Alert on Start/Stop/Restart
+statusalert="off"
+
 # Discord Alerts | https://docs.linuxgsm.com/alerts/discord
 discordalert="off"
 discordwebhook="webhook"
@@ -74,7 +77,6 @@ pushoveruserkey="userkey"
 # Rocket.Chat Alerts | https://docs.linuxgsm.com/alerts/rocket.chat
 rocketchatalert="off"
 rocketchatwebhook="webhook"
-rocketchattoken=""
 
 # Slack Alerts | https://docs.linuxgsm.com/alerts/slack
 slackalert="off"
diff --git a/lgsm/config-default/config-lgsm/ut2k4server/_default.cfg b/lgsm/config-default/config-lgsm/ut2k4server/_default.cfg
index dc5d39fd7..709b9855a 100644
--- a/lgsm/config-default/config-lgsm/ut2k4server/_default.cfg
+++ b/lgsm/config-default/config-lgsm/ut2k4server/_default.cfg
@@ -32,6 +32,9 @@ displayip=""
 # More info | https://docs.linuxgsm.com/alerts#more-info
 postalert="off"
 
+# Alert on Start/Stop/Restart
+statusalert="off"
+
 # Discord Alerts | https://docs.linuxgsm.com/alerts/discord
 discordalert="off"
 discordwebhook="webhook"
@@ -64,7 +67,6 @@ pushoveruserkey="userkey"
 # Rocket.Chat Alerts | https://docs.linuxgsm.com/alerts/rocket.chat
 rocketchatalert="off"
 rocketchatwebhook="webhook"
-rocketchattoken=""
 
 # Slack Alerts | https://docs.linuxgsm.com/alerts/slack
 slackalert="off"
diff --git a/lgsm/config-default/config-lgsm/ut3server/_default.cfg b/lgsm/config-default/config-lgsm/ut3server/_default.cfg
index 412422257..cdadca663 100644
--- a/lgsm/config-default/config-lgsm/ut3server/_default.cfg
+++ b/lgsm/config-default/config-lgsm/ut3server/_default.cfg
@@ -48,6 +48,9 @@ displayip=""
 # More info | https://docs.linuxgsm.com/alerts#more-info
 postalert="off"
 
+# Alert on Start/Stop/Restart
+statusalert="off"
+
 # Discord Alerts | https://docs.linuxgsm.com/alerts/discord
 discordalert="off"
 discordwebhook="webhook"
@@ -80,7 +83,6 @@ pushoveruserkey="userkey"
 # Rocket.Chat Alerts | https://docs.linuxgsm.com/alerts/rocket.chat
 rocketchatalert="off"
 rocketchatwebhook="webhook"
-rocketchattoken=""
 
 # Slack Alerts | https://docs.linuxgsm.com/alerts/slack
 slackalert="off"
diff --git a/lgsm/config-default/config-lgsm/ut99server/_default.cfg b/lgsm/config-default/config-lgsm/ut99server/_default.cfg
index 6df4ea539..f4a3d8ecf 100644
--- a/lgsm/config-default/config-lgsm/ut99server/_default.cfg
+++ b/lgsm/config-default/config-lgsm/ut99server/_default.cfg
@@ -32,6 +32,9 @@ displayip=""
 # More info | https://docs.linuxgsm.com/alerts#more-info
 postalert="off"
 
+# Alert on Start/Stop/Restart
+statusalert="off"
+
 # Discord Alerts | https://docs.linuxgsm.com/alerts/discord
 discordalert="off"
 discordwebhook="webhook"
@@ -64,7 +67,6 @@ pushoveruserkey="userkey"
 # Rocket.Chat Alerts | https://docs.linuxgsm.com/alerts/rocket.chat
 rocketchatalert="off"
 rocketchatwebhook="webhook"
-rocketchattoken=""
 
 # Slack Alerts | https://docs.linuxgsm.com/alerts/slack
 slackalert="off"
diff --git a/lgsm/config-default/config-lgsm/utserver/_default.cfg b/lgsm/config-default/config-lgsm/utserver/_default.cfg
index 1ae90d9bb..0ffdd821f 100644
--- a/lgsm/config-default/config-lgsm/utserver/_default.cfg
+++ b/lgsm/config-default/config-lgsm/utserver/_default.cfg
@@ -36,6 +36,9 @@ displayip=""
 # More info | https://docs.linuxgsm.com/alerts#more-info
 postalert="off"
 
+# Alert on Start/Stop/Restart
+statusalert="off"
+
 # Discord Alerts | https://docs.linuxgsm.com/alerts/discord
 discordalert="off"
 discordwebhook="webhook"
@@ -68,7 +71,6 @@ pushoveruserkey="userkey"
 # Rocket.Chat Alerts | https://docs.linuxgsm.com/alerts/rocket.chat
 rocketchatalert="off"
 rocketchatwebhook="webhook"
-rocketchattoken=""
 
 # Slack Alerts | https://docs.linuxgsm.com/alerts/slack
 slackalert="off"
diff --git a/lgsm/config-default/config-lgsm/vhserver/_default.cfg b/lgsm/config-default/config-lgsm/vhserver/_default.cfg
index ce90a2b07..084adf50c 100644
--- a/lgsm/config-default/config-lgsm/vhserver/_default.cfg
+++ b/lgsm/config-default/config-lgsm/vhserver/_default.cfg
@@ -45,6 +45,9 @@ displayip=""
 # More info | https://docs.linuxgsm.com/alerts#more-info
 postalert="off"
 
+# Alert on Start/Stop/Restart
+statusalert="off"
+
 # Discord Alerts | https://docs.linuxgsm.com/alerts/discord
 discordalert="off"
 discordwebhook="webhook"
@@ -77,7 +80,6 @@ pushoveruserkey="userkey"
 # Rocket.Chat Alerts | https://docs.linuxgsm.com/alerts/rocket.chat
 rocketchatalert="off"
 rocketchatwebhook="webhook"
-rocketchattoken=""
 
 # Slack Alerts | https://docs.linuxgsm.com/alerts/slack
 slackalert="off"
diff --git a/lgsm/config-default/config-lgsm/vintsserver/_default.cfg b/lgsm/config-default/config-lgsm/vintsserver/_default.cfg
index 75288012e..1b64ae29d 100644
--- a/lgsm/config-default/config-lgsm/vintsserver/_default.cfg
+++ b/lgsm/config-default/config-lgsm/vintsserver/_default.cfg
@@ -32,6 +32,9 @@ displayip=""
 # More info | https://docs.linuxgsm.com/alerts#more-info
 postalert="off"
 
+# Alert on Start/Stop/Restart
+statusalert="off"
+
 # Discord Alerts | https://docs.linuxgsm.com/alerts/discord
 discordalert="off"
 discordwebhook="webhook"
@@ -64,7 +67,6 @@ pushoveruserkey="userkey"
 # Rocket.Chat Alerts | https://docs.linuxgsm.com/alerts/rocket.chat
 rocketchatalert="off"
 rocketchatwebhook="webhook"
-rocketchattoken=""
 
 # Slack Alerts | https://docs.linuxgsm.com/alerts/slack
 slackalert="off"
diff --git a/lgsm/config-default/config-lgsm/vpmcserver/_default.cfg b/lgsm/config-default/config-lgsm/vpmcserver/_default.cfg
index 636f23d9a..09d6bf93f 100644
--- a/lgsm/config-default/config-lgsm/vpmcserver/_default.cfg
+++ b/lgsm/config-default/config-lgsm/vpmcserver/_default.cfg
@@ -35,6 +35,9 @@ displayip=""
 # More info | https://docs.linuxgsm.com/alerts#more-info
 postalert="off"
 
+# Alert on Start/Stop/Restart
+statusalert="off"
+
 # Discord Alerts | https://docs.linuxgsm.com/alerts/discord
 discordalert="off"
 discordwebhook="webhook"
@@ -67,7 +70,6 @@ pushoveruserkey="userkey"
 # Rocket.Chat Alerts | https://docs.linuxgsm.com/alerts/rocket.chat
 rocketchatalert="off"
 rocketchatwebhook="webhook"
-rocketchattoken=""
 
 # Slack Alerts | https://docs.linuxgsm.com/alerts/slack
 slackalert="off"
diff --git a/lgsm/config-default/config-lgsm/vsserver/_default.cfg b/lgsm/config-default/config-lgsm/vsserver/_default.cfg
index 257c98963..0195393fd 100644
--- a/lgsm/config-default/config-lgsm/vsserver/_default.cfg
+++ b/lgsm/config-default/config-lgsm/vsserver/_default.cfg
@@ -35,6 +35,9 @@ displayip=""
 # More info | https://docs.linuxgsm.com/alerts#more-info
 postalert="off"
 
+# Alert on Start/Stop/Restart
+statusalert="off"
+
 # Discord Alerts | https://docs.linuxgsm.com/alerts/discord
 discordalert="off"
 discordwebhook="webhook"
@@ -67,7 +70,6 @@ pushoveruserkey="userkey"
 # Rocket.Chat Alerts | https://docs.linuxgsm.com/alerts/rocket.chat
 rocketchatalert="off"
 rocketchatwebhook="webhook"
-rocketchattoken=""
 
 # Slack Alerts | https://docs.linuxgsm.com/alerts/slack
 slackalert="off"
diff --git a/lgsm/config-default/config-lgsm/wetserver/_default.cfg b/lgsm/config-default/config-lgsm/wetserver/_default.cfg
index 153a2b1c5..4c3738909 100644
--- a/lgsm/config-default/config-lgsm/wetserver/_default.cfg
+++ b/lgsm/config-default/config-lgsm/wetserver/_default.cfg
@@ -28,6 +28,9 @@ displayip=""
 # More info | https://docs.linuxgsm.com/alerts#more-info
 postalert="off"
 
+# Alert on Start/Stop/Restart
+statusalert="off"
+
 # Discord Alerts | https://docs.linuxgsm.com/alerts/discord
 discordalert="off"
 discordwebhook="webhook"
@@ -60,7 +63,6 @@ pushoveruserkey="userkey"
 # Rocket.Chat Alerts | https://docs.linuxgsm.com/alerts/rocket.chat
 rocketchatalert="off"
 rocketchatwebhook="webhook"
-rocketchattoken=""
 
 # Slack Alerts | https://docs.linuxgsm.com/alerts/slack
 slackalert="off"
diff --git a/lgsm/config-default/config-lgsm/wfserver/_default.cfg b/lgsm/config-default/config-lgsm/wfserver/_default.cfg
index 80fbe2037..80ff4ba96 100644
--- a/lgsm/config-default/config-lgsm/wfserver/_default.cfg
+++ b/lgsm/config-default/config-lgsm/wfserver/_default.cfg
@@ -33,6 +33,9 @@ displayip=""
 # More info | https://docs.linuxgsm.com/alerts#more-info
 postalert="off"
 
+# Alert on Start/Stop/Restart
+statusalert="off"
+
 # Discord Alerts | https://docs.linuxgsm.com/alerts/discord
 discordalert="off"
 discordwebhook="webhook"
@@ -65,7 +68,6 @@ pushoveruserkey="userkey"
 # Rocket.Chat Alerts | https://docs.linuxgsm.com/alerts/rocket.chat
 rocketchatalert="off"
 rocketchatwebhook="webhook"
-rocketchattoken=""
 
 # Slack Alerts | https://docs.linuxgsm.com/alerts/slack
 slackalert="off"
diff --git a/lgsm/config-default/config-lgsm/wmcserver/_default.cfg b/lgsm/config-default/config-lgsm/wmcserver/_default.cfg
index 82a398363..f38976d6e 100644
--- a/lgsm/config-default/config-lgsm/wmcserver/_default.cfg
+++ b/lgsm/config-default/config-lgsm/wmcserver/_default.cfg
@@ -35,6 +35,9 @@ displayip=""
 # More info | https://docs.linuxgsm.com/alerts#more-info
 postalert="off"
 
+# Alert on Start/Stop/Restart
+statusalert="off"
+
 # Discord Alerts | https://docs.linuxgsm.com/alerts/discord
 discordalert="off"
 discordwebhook="webhook"
@@ -67,7 +70,6 @@ pushoveruserkey="userkey"
 # Rocket.Chat Alerts | https://docs.linuxgsm.com/alerts/rocket.chat
 rocketchatalert="off"
 rocketchatwebhook="webhook"
-rocketchattoken=""
 
 # Slack Alerts | https://docs.linuxgsm.com/alerts/slack
 slackalert="off"
diff --git a/lgsm/config-default/config-lgsm/wurmserver/_default.cfg b/lgsm/config-default/config-lgsm/wurmserver/_default.cfg
index e4ef942d5..5405be85a 100644
--- a/lgsm/config-default/config-lgsm/wurmserver/_default.cfg
+++ b/lgsm/config-default/config-lgsm/wurmserver/_default.cfg
@@ -72,6 +72,9 @@ displayip=""
 # More info | https://docs.linuxgsm.com/alerts#more-info
 postalert="off"
 
+# Alert on Start/Stop/Restart
+statusalert="off"
+
 # Discord Alerts | https://docs.linuxgsm.com/alerts/discord
 discordalert="off"
 discordwebhook="webhook"
@@ -104,7 +107,6 @@ pushoveruserkey="userkey"
 # Rocket.Chat Alerts | https://docs.linuxgsm.com/alerts/rocket.chat
 rocketchatalert="off"
 rocketchatwebhook="webhook"
-rocketchattoken=""
 
 # Slack Alerts | https://docs.linuxgsm.com/alerts/slack
 slackalert="off"
diff --git a/lgsm/config-default/config-lgsm/zmrserver/_default.cfg b/lgsm/config-default/config-lgsm/zmrserver/_default.cfg
index 4de16fd16..1bcd5d4a7 100644
--- a/lgsm/config-default/config-lgsm/zmrserver/_default.cfg
+++ b/lgsm/config-default/config-lgsm/zmrserver/_default.cfg
@@ -36,6 +36,9 @@ displayip=""
 # More info | https://docs.linuxgsm.com/alerts#more-info
 postalert="off"
 
+# Alert on Start/Stop/Restart
+statusalert="off"
+
 # Discord Alerts | https://docs.linuxgsm.com/alerts/discord
 discordalert="off"
 discordwebhook="webhook"
@@ -68,7 +71,6 @@ pushoveruserkey="userkey"
 # Rocket.Chat Alerts | https://docs.linuxgsm.com/alerts/rocket.chat
 rocketchatalert="off"
 rocketchatwebhook="webhook"
-rocketchattoken=""
 
 # Slack Alerts | https://docs.linuxgsm.com/alerts/slack
 slackalert="off"
diff --git a/lgsm/config-default/config-lgsm/zpsserver/_default.cfg b/lgsm/config-default/config-lgsm/zpsserver/_default.cfg
index 0cb900501..f4497786b 100644
--- a/lgsm/config-default/config-lgsm/zpsserver/_default.cfg
+++ b/lgsm/config-default/config-lgsm/zpsserver/_default.cfg
@@ -41,6 +41,9 @@ displayip=""
 # More info | https://docs.linuxgsm.com/alerts#more-info
 postalert="off"
 
+# Alert on Start/Stop/Restart
+statusalert="off"
+
 # Discord Alerts | https://docs.linuxgsm.com/alerts/discord
 discordalert="off"
 discordwebhook="webhook"
@@ -73,7 +76,6 @@ pushoveruserkey="userkey"
 # Rocket.Chat Alerts | https://docs.linuxgsm.com/alerts/rocket.chat
 rocketchatalert="off"
 rocketchatwebhook="webhook"
-rocketchattoken=""
 
 # Slack Alerts | https://docs.linuxgsm.com/alerts/slack
 slackalert="off"
diff --git a/lgsm/data/gameicons/ac-icon.png b/lgsm/data/gameicons/ac-icon.png
new file mode 100644
index 0000000000000000000000000000000000000000..fcf39841e5f7b89373652ca2dd8884ff8cdc5a06
GIT binary patch
literal 1801
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

literal 0
HcmV?d00001

diff --git a/lgsm/data/gameicons/ahl-icon.png b/lgsm/data/gameicons/ahl-icon.png
new file mode 100644
index 0000000000000000000000000000000000000000..f4e5cb5350f81161641de88914ba7e229c354d5a
GIT binary patch
literal 2983
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

literal 0
HcmV?d00001

diff --git a/lgsm/data/gameicons/ahl2-icon.png b/lgsm/data/gameicons/ahl2-icon.png
new file mode 100644
index 0000000000000000000000000000000000000000..04d35d040388534d61e8105973403e2c533cb1c0
GIT binary patch
literal 2532
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

literal 0
HcmV?d00001

diff --git a/lgsm/data/gameicons/ark-icon.png b/lgsm/data/gameicons/ark-icon.png
new file mode 100644
index 0000000000000000000000000000000000000000..096e7cfbfac269251911c007a08977fac6559a20
GIT binary patch
literal 2006
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

literal 0
HcmV?d00001

diff --git a/lgsm/data/gameicons/arma3-icon.png b/lgsm/data/gameicons/arma3-icon.png
new file mode 100644
index 0000000000000000000000000000000000000000..0bb0bc64c7c2f0a43ece0073ff799bf46aebc3ba
GIT binary patch
literal 954
zcmeAS@N?(olHy`uVBq!ia0vp^3Lwk@BpAX3RW*PVOS+@4BLl<6e(pbstRTr`k04(L
zhAK4%hK3dfhF?ITh8GMBr3MTPuM!v-tY$DUh!@P+6=(yLU`q0KcVYP7-hXC4kjGx)
z>Fdh=oJ&BEQ+adk*&9IlL!K^<Ar_}gC!Nm^DHS<-e((L?_g??en5!w^&@Hyaq}54k
zRY!t}Q^C<gy`9-%?|KpswzbSXxZfdc!Um;AR?bFQ#U&zBmT+#ll^~L=(^Pir<(_kA
zW`BS7d*A)jO`_+2McykedS`obY4Cm>-#IJz(^||wE-kAmf4J83*3Un8<{50U(~<a8
zb3k=}{EfU_>Bj;MgG#@sJw37d+P$6H!peIOnoJ7YIpKn#o2hKI|FWt}YonvjakVi>
z%3QM(*%+xg?b7Kar?743)R-K#TV=D{UmtCm5$>HGJMr3v>?{9yZ~b3+GB07Kk8_PS
z&x!BGn)Py_X@5GO{QF?{^Y^!gw7~U`_e}1aVy?^XwD;=Q$uFPPEVsF{>%QKuWsdfy
zp4O97cBJ?5MB0D&a=ibr%IVK}{<A+vyG_=bWqfaGQn*3ctra)a&Gk>NubpfrReo=o
z{&%LCe}6{an$D-i?zBYB!es5w&)4);#qKNL_oz{)OHJ%DpZ?mL%y-W{-nY0la`W$i
zy=@Z@i;BhmKe?1WdUgG#*sg7D`p;%+N<X<Tx3It8ZzKE9pQ3f*^-tcs6*Qc!&V1_L
z{Gu|(OS-)&vE8?>h;4tV!L#T^nQ`H@m3x2f{iTy1|Nh09+Vv}!Rem<|deh$<`0`CT
zPv+4DM?#(leOFKyudNOII{9MEvSqXX9+h6aTKj9o%g*)ork}&@c5lnI`B=R9c=NT5
zk*j#0O)@{Vb%k}wre6xS@A7!-e_emv=4E|P)O}yOK!O9qFR!n+^Y_$!Y(C~L$Z$-;
z@jz{t%?-z<kK(;5adpe|A6HD$?JPdmZn=t~F@Yn2t(Ai}A%UmIU@_M-0Ux#lulo%Q
zc#ISz1cDjZ4m9x!upJPIVr6*DZDh@`z`>()fmf7)K-_uPg<cMEF%y_qH5fH6ydl8a
ze4~*iL2uQW1_7BehMxb8jk2E(-my>d*m!W_sx7s@M8(BCv-)C>0J8vtYKdz^NlIc#
zs#S7PDv)9@GB7gMH8jvQGz~E_wlXxdGPTq;Ft9Q(V0yE$8%0BIeoAIqC5i?kkOmVA
Wh=wD-ZUZwG1B0ilpUXO@geCw^O`j_O

literal 0
HcmV?d00001

diff --git a/lgsm/data/gameicons/armar-icon.png b/lgsm/data/gameicons/armar-icon.png
new file mode 100644
index 0000000000000000000000000000000000000000..ea79ba0885fc86e817240157a80e72d5ada7dd1c
GIT binary patch
literal 722
zcmeAS@N?(olHy`uVBq!ia0vp^3Lwk@BpAX3RW*PVOS+@4BLl<6e(pbstRTr`k04(L
zhAK4%hK3dfhF?ITh8GMBr3MTPuM!v-tY$DUh!@P+6=(yLU`q0KcVYP7-hXC4kjGx)
z>Fdh=oJ&BEQ+adk*&7TDjJG^p978Nlzn#1{D>P7`b^px0-*=i%*JjzeVbX$#=p|bO
z<sEcdZgg}_&A4|cZbQf)O&0CN9UZN0KZK@fsVtrG=#}reo9XXUH!}Yc@cVgo*38f~
zjsIC2nAzNzikYoGT#(o?(|~dEysMw>&ip!=`2C~^S3;Ij{;Qi`1GN@=?X22z_3!;?
z<2dh0zZ}nd)bC`RAsC^1O6pkP)8l&#5A2a-E<7rz$zoBcDC4`kaxI(Cr_(*2u07|r
zPMUBaD|O=1AeG#IQYNn+_l2}QjWwMmzE5;Tg<`g<z>ht=a?4p;f*)z0%LrI&_2)yx
zs%E`dn>CBSyf_;qrLy+u`t#@cVtt=J<o-29?6%p#)n<8fbta_8@0-2;u7;`Dx!jTy
z+wRTXSDEGYRekrV*f;TYhx^`oYppuvdf3)8Xx*#TDsSbFUw))pS-@$jx$u-k?#)iC
z5C78HCx6um)m(k;uJt92mk#W|bf=ao2pp^km}+XnD`CA#YZrf8vOvRuxM|0Vq}zQ{
zSKhbIayTNRv(vC$&yq93ut3>~eaBfwCb5IevIp+$Iohr1GQ&-#gY)x=E>n&f$v%r2
zS=hN5nRWaO?=Z|Zv0gco>wzD8i)XM~flia-7lw_hcNMpt-F(g1W{Z2lo}&^!nA=3Z
zo!usP@jEc$RZCnWN>UO_QmvAUQh^kMk%5u1uAzahp=pSbv6Z2rm8qq+fq|8Q0n?j}
n-6$Gz^HVa@Dp52Tfi##{Kr|frbsL!A7#KWV{an^LB{Ts5ag!e3

literal 0
HcmV?d00001

diff --git a/lgsm/data/gameicons/ats-icon.png b/lgsm/data/gameicons/ats-icon.png
new file mode 100644
index 0000000000000000000000000000000000000000..6495b10737417b00113e735c641e9e5c7a62f2f5
GIT binary patch
literal 2037
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
Qxyb<7lATCpM|>{*3s-`Tg8%>k

literal 0
HcmV?d00001

diff --git a/lgsm/data/gameicons/av-icon.png b/lgsm/data/gameicons/av-icon.png
new file mode 100644
index 0000000000000000000000000000000000000000..4bce455adcc406311e72d4ed220da36f7f567079
GIT binary patch
literal 1983
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
I8~Ek_1Nwjlr2qf`

literal 0
HcmV?d00001

diff --git a/lgsm/data/gameicons/bb-icon.png b/lgsm/data/gameicons/bb-icon.png
new file mode 100644
index 0000000000000000000000000000000000000000..2c6b7ec88310b2fed7a1e0be13ea9758f007ff3e
GIT binary patch
literal 2837
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

literal 0
HcmV?d00001

diff --git a/lgsm/data/gameicons/bb2-icon.png b/lgsm/data/gameicons/bb2-icon.png
new file mode 100644
index 0000000000000000000000000000000000000000..56716418c160e2be5713b2440d6f2abda66fde1e
GIT binary patch
literal 2082
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
KHci$6Y5xK^my;d<

literal 0
HcmV?d00001

diff --git a/lgsm/data/gameicons/bd-icon.png b/lgsm/data/gameicons/bd-icon.png
new file mode 100644
index 0000000000000000000000000000000000000000..93ba9db926b62ffd054b3b76c5b999dea81a6e8f
GIT binary patch
literal 2094
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
Vf5O#%FFVWu9BHo9W68y<{tIb6c*g($

literal 0
HcmV?d00001

diff --git a/lgsm/data/gameicons/bf1942-icon.png b/lgsm/data/gameicons/bf1942-icon.png
new file mode 100644
index 0000000000000000000000000000000000000000..653ce6a8f8756df2bd96063e3bbf637b3623851f
GIT binary patch
literal 2847
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

literal 0
HcmV?d00001

diff --git a/lgsm/data/gameicons/bfv-icon.png b/lgsm/data/gameicons/bfv-icon.png
new file mode 100644
index 0000000000000000000000000000000000000000..70cae02ee14e53688895624ae53e00205ab0bb7c
GIT binary patch
literal 2094
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
C06Dk-

literal 0
HcmV?d00001

diff --git a/lgsm/data/gameicons/bmdm-icon.png b/lgsm/data/gameicons/bmdm-icon.png
new file mode 100644
index 0000000000000000000000000000000000000000..4ff37301e7da0e8a36066211067c075cb239f77b
GIT binary patch
literal 2082
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

literal 0
HcmV?d00001

diff --git a/lgsm/data/gameicons/bo-icon.png b/lgsm/data/gameicons/bo-icon.png
new file mode 100644
index 0000000000000000000000000000000000000000..53f5577d8d99b4e01270e07e377ca50788311c2f
GIT binary patch
literal 2030
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

literal 0
HcmV?d00001

diff --git a/lgsm/data/gameicons/bs-icon.png b/lgsm/data/gameicons/bs-icon.png
new file mode 100644
index 0000000000000000000000000000000000000000..712f8d43012a97b4fbfd720e22a1822046a54f41
GIT binary patch
literal 1916
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
C*pU1H

literal 0
HcmV?d00001

diff --git a/lgsm/data/gameicons/bt-icon.png b/lgsm/data/gameicons/bt-icon.png
new file mode 100644
index 0000000000000000000000000000000000000000..d262bf39fe8eddeb5712a3f8835a3c3ec5d9a1c3
GIT binary patch
literal 2091
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
bQ6B{{>i-MQzP;u7$pNsM(v173&1(4*av`BP

literal 0
HcmV?d00001

diff --git a/lgsm/data/gameicons/btl-icon.png b/lgsm/data/gameicons/btl-icon.png
new file mode 100644
index 0000000000000000000000000000000000000000..615ba7cb9aa4528ef3d2c5351b2e1a170c1e73bc
GIT binary patch
literal 2334
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
Ef&ylH`v3p{

literal 0
HcmV?d00001

diff --git a/lgsm/data/gameicons/cc-icon.png b/lgsm/data/gameicons/cc-icon.png
new file mode 100644
index 0000000000000000000000000000000000000000..6249a0f892ab527989c3dd5ec7402e48071f9be8
GIT binary patch
literal 2147
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
M*bs65vG$7pFA`tQga7~l

literal 0
HcmV?d00001

diff --git a/lgsm/data/gameicons/cd-icon.png b/lgsm/data/gameicons/cd-icon.png
new file mode 100644
index 0000000000000000000000000000000000000000..dddd49f7c40781aa78c47fbbdb28e6d889e41c2a
GIT binary patch
literal 2819
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
Tt|?&kn>i?BOJt#uYs7y6+R9E?

literal 0
HcmV?d00001

diff --git a/lgsm/data/gameicons/ck-icon.png b/lgsm/data/gameicons/ck-icon.png
new file mode 100644
index 0000000000000000000000000000000000000000..a22d81480c1fcb53f9e432919ce47d9a98a0a56f
GIT binary patch
literal 2828
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

literal 0
HcmV?d00001

diff --git a/lgsm/data/gameicons/cmw-icon.png b/lgsm/data/gameicons/cmw-icon.png
new file mode 100644
index 0000000000000000000000000000000000000000..6274908664ae2f34bf00f3bea7226dcf0552944b
GIT binary patch
literal 2645
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

literal 0
HcmV?d00001

diff --git a/lgsm/data/gameicons/cod-icon.png b/lgsm/data/gameicons/cod-icon.png
new file mode 100644
index 0000000000000000000000000000000000000000..7af55bf2c24d0627de8dfe4b41fc758d0efe028c
GIT binary patch
literal 2050
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
a{Sc6?{x1-0yq0~?0Ju7PQfdwdr~VHLrE2T|

literal 0
HcmV?d00001

diff --git a/lgsm/data/gameicons/cod2-icon.png b/lgsm/data/gameicons/cod2-icon.png
new file mode 100644
index 0000000000000000000000000000000000000000..dfd6ee7de82588901d0d4accf5477ffb11b11b50
GIT binary patch
literal 2707
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
N002ovPDHLkV1jdi3(f!l

literal 0
HcmV?d00001

diff --git a/lgsm/data/gameicons/cod4-icon.png b/lgsm/data/gameicons/cod4-icon.png
new file mode 100644
index 0000000000000000000000000000000000000000..25808b182e79a1e0e759078d975bd4bfa03e26b3
GIT binary patch
literal 2878
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
F{{@k_OGf|z

literal 0
HcmV?d00001

diff --git a/lgsm/data/gameicons/coduo-icon.png b/lgsm/data/gameicons/coduo-icon.png
new file mode 100644
index 0000000000000000000000000000000000000000..c8151fee296fd995dac2aaf96a47dff79a044972
GIT binary patch
literal 2652
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
KMNUMnLSTXo^c5Na

literal 0
HcmV?d00001

diff --git a/lgsm/data/gameicons/codwaw-icon.png b/lgsm/data/gameicons/codwaw-icon.png
new file mode 100644
index 0000000000000000000000000000000000000000..10f06601ddff3f5abfb2ac14cf7e68f1cdfb8066
GIT binary patch
literal 2819
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
LF$Ps(=o0l`hlM^N

literal 0
HcmV?d00001

diff --git a/lgsm/data/gameicons/col-icon.png b/lgsm/data/gameicons/col-icon.png
new file mode 100644
index 0000000000000000000000000000000000000000..fbd91f9ef1e2c703dc445cd4a86526519d83f2af
GIT binary patch
literal 2411
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
LcYLi~(6#>p?u<oh

literal 0
HcmV?d00001

diff --git a/lgsm/data/gameicons/cs-icon.png b/lgsm/data/gameicons/cs-icon.png
new file mode 100644
index 0000000000000000000000000000000000000000..5e61337e05a6124abf8e4e744e33169ac03cfb20
GIT binary patch
literal 2150
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

literal 0
HcmV?d00001

diff --git a/lgsm/data/gameicons/cscz-icon.png b/lgsm/data/gameicons/cscz-icon.png
new file mode 100644
index 0000000000000000000000000000000000000000..490174b30705f8feebca4c6d4cc8423c99a83c06
GIT binary patch
literal 2362
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
O0sszUgMMl5neboedpGL<

literal 0
HcmV?d00001

diff --git a/lgsm/data/gameicons/csgo-icon.png b/lgsm/data/gameicons/csgo-icon.png
new file mode 100644
index 0000000000000000000000000000000000000000..b9ed6ca4d3db71ddbcde39e0b9095e12b056a60b
GIT binary patch
literal 2735
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

literal 0
HcmV?d00001

diff --git a/lgsm/data/gameicons/css-icon.png b/lgsm/data/gameicons/css-icon.png
new file mode 100644
index 0000000000000000000000000000000000000000..e0f099f8a83b1e9e4a5cc99e531d759de09ad8cf
GIT binary patch
literal 2791
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

literal 0
HcmV?d00001

diff --git a/lgsm/data/gameicons/ct-icon.png b/lgsm/data/gameicons/ct-icon.png
new file mode 100644
index 0000000000000000000000000000000000000000..5fb048b56bf564a14f5ebae8a8178b5697054ed5
GIT binary patch
literal 2951
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

literal 0
HcmV?d00001

diff --git a/lgsm/data/gameicons/dab-icon.png b/lgsm/data/gameicons/dab-icon.png
new file mode 100644
index 0000000000000000000000000000000000000000..fac2aaf24ffe50b3e7f557e460a52fbf7843a7c0
GIT binary patch
literal 2589
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

literal 0
HcmV?d00001

diff --git a/lgsm/data/gameicons/dayz-icon.png b/lgsm/data/gameicons/dayz-icon.png
new file mode 100644
index 0000000000000000000000000000000000000000..de66c61122fb87dcca6eabb4ccbbc56e0fbd383b
GIT binary patch
literal 2370
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
W{C|Oyi_sp90Pvytd(~3IPW>0|kYrE*

literal 0
HcmV?d00001

diff --git a/lgsm/data/gameicons/dmc-icon.png b/lgsm/data/gameicons/dmc-icon.png
new file mode 100644
index 0000000000000000000000000000000000000000..0d3dad7099550acc5267fa6b6e655a92d2252106
GIT binary patch
literal 2774
zcmZ{mdpy&N8^^y$hGHC*TW+a?<1))F<bJ<zS|um9VN7C73`uQLHkX(r46!3@lxt`l
z2XlxyiIiN*IE)_>b7w#O`TOJddS0LB^Ll+g&-?%9v4@-eNfB8Q002%pI@rLET<NDk
z{6~9Vdb#Y#j-f1FEdk(lrs%%E;Lj520Cxp|_zM7#OaOr0qbPX+0Ae5ju;>Q>#?JuY
zOk`mz%=D-@9^h<m1Mq%M38NzCC=rfy@QMZiv96!u>y3CBcoYg@9bIjO=0(5~B8tuC
zGlfTIJ&rb(R~&i;JHKQW&fNvRZXGaES0U2_tpDJ8m-4x|vxSY1(`^$FFm$DsD?b99
zn^om-svj|O$j5Olvw@B5O>nDDJ|5SDmrG{D`PKa<WN!(Ck-WYnP%aOAE7);cUCWy<
zt$n+lCvIpkyasVo38&BMiC90RoP%3=Bp_X+M>XTi3Gic!^hOH-aTkz3BPTnW6%+KX
zZeV@D$lG}_HwFf+pWqBPMi*fWcK-G4&>Kb5YHK^zm<8$Ap-K|-CmxSJgf9x8eDU(7
z6bOi5Y{5s!O`t1IHKczF1^n@y9;ddiO~1wXb7$t|<T`LmlbjY?imRQwZ@Z@Y!EBjH
zPTy?zzG*zWh(j@5D;hhj`8#U$uFsYJmV#!p_`T)kJa=t7=s&q(QC<i^xMC0A{Det~
zg7<HO=Dd2jV*2#-c-#Q!@~3IGGAhBuyL+eq8MHP{)Aw2NdQ;T6{H7R_Ex~uA);;E$
zF*kUr%tVoB5v9)1=c-AKq+-54if|nwQ#m-j+}-a7;$j&Y>B9?W<9Z7m!%bzkzJc#=
z#tZ#Hv(k1#(6DVoW_!1ui=Exob5*wmhB?~ipC^82M3(C1sAVZv5L#WTu_Hp@2Lk6`
zt$lZ%|J^{g$}|U)uGO54eYUyR%f>>brBGML(^a8223Z3R${)wfzkK@i(ohzf^{y!A
z(e{$zbc7D;67@WQdWpy%L86vR%%uuFoq9RjZ>AM9J!KwxrW0a<3lIol7CyQ8IYvti
z)S5-aA50DT@VIpG)kEI0J3cFs-BUZiQ~qVybbDr<KDf*YCh|GC-NzwL<6z*w-ga3W
zn=-M&Bqh~QMqCm1w<uuAhjo;0&vaR?T~y@NU%HpZShY773s(%bV(-ZG+)y&gy0<^I
z1z1$Vz0<pOk3Zm(O=mG-9##BCbMj11mT@Zc6)W-Gb**Cre~(&QvI<xQ0KFJ(^>OA`
zPBR@^@B4hQLg=7<bo=We{(v!=pMM%Wl<dYt_EEq3Q`3hpJhDQb6#ULa(?9)iv93(x
z4>|$bRRbBN+=BX_puGpAfQ$^W3+#<y&paO<XDBvyll|t-{L1bIb}%7~o?*?QiQ->s
zo`P1<SVVb-XVCfNXto|7Z4`}>x{539d{~I_lUK_Lh)lFeX8L1yhUXH=DVj!;H!II`
z-B<4>#>E*;R*ms@N{e>=lOSm;QBp4@46fFC-K{2|A_bCCS0+TU_=JtcEt2CpL$n@~
zYOY?pR@@SQ(8s2Sx%-;54ac<Z_xBL-mNLDsb+3jw3rpE5tBQ7IfdfddKc-ovLHs7E
zGB-n6e|nvh7EJ3l!CuHf(sP@dKHqBp(LcShhxe>t&EkAc<pW?iIycj<tR>%T=535v
zvK*4$>_x$$x*%50j0!*cuY^cHk}j*$E1V|zz&q^H8MfXYbIiApLTO|w%FEv}ONx5c
zcG1WTeLh_j#ag+2vZ0AAYJ(<WSTa-rWoc?FjTX)HVpXaV5>^F0lqe#LCrZg0R5J8h
zt=am<hoK2Z>`-YY`#ML`gU?c@YaPX6x%J{Zl^nCxK=~z82}NRPjE$*AxGflAjI1~v
z%(!Ure!(dhCk^V9DH}-83HrX=aj==%d>9dnO6B{&Jed8JXQ$f{d6)<bW!d^%6<0Jv
zH|I6zDoChBb+&+QVJdK9Njl#~S_z-ijFDK^v*^B-KzRA**&R8<l}W~B(?zWTJ@<w$
z=64UyP_lH|C%6RJC8E>K_Nd&)e%aR?@*8C<E2J80!0J?z2Sm)0qoM;1(u0qO=$E}=
zrnvOx)X%eGuC^WvK~WO|TI!Q{o$Nu1Jv?)+OQ_hKn>%V$72{S@=*xK1$jBt5DM1x}
zE2DEU@+LN`46@_{2-#A}8di)Z5#g7LmqaenZno?%^s(=3HOxirg?!iH?K;~#B!r@q
zZU-;*vDsY;f+_-si`BI%_~E$aNIh*@nS+v!h*$~2@_k)Or5`k3uR`{b8r8z8-m$4^
zbM$sa&V0{IRK>@T!(N?xjrFl3Rm8cJ&(8@MW60Fdpq9es9)?j$$MOCRXMG#zhB<0|
z{<7*QqlUb6CdlhmkDUX^AiMk-DJH0H?ak>?pSW)+9uGy=opYmjTqbY-km3DkcH@WD
zWwM6i#p4AgZRGV2s3F|U5_h-E-Zyb;mG^Bf&sW=-TQGgtoONIK_>+*ZWbn&0k)rzX
z(sk00`Qi>3iD-Fmqi+|_m|7bwP(<6aio7V4sxSl-lTJ+5Wl9&_cI|<^nef@2SL8Y5
z_K3IhteM^8<GFY|@<RFMLRKAXzd_dy%91G$-5nUKIb5s1H?o?k7S!dx%PfdkURE4(
z>6zTj?zgM@n-)XypvF)UaA#6YJmUaMc2XWE61@w)_%afMqQg*neQL>T83`f^p)i>l
z*Xq&T9P_&?aYjzEp5!(5p17ex__=IqiWkbMth!E9LR#o};nwD+qWSKRzj_eZr*UmY
zCTB($;oYm#t&I$ZD4amTXPJ(TV^*ZAuN=}lwok*Meb69N|9$#2gZ)HP>*Kk{wz@y2
z9vP7>zZN=Y+k`P%cH)vS_a*OKmk$qL*-GWC^0x4uHp<Fh6T^ayT|GZ~`M7)-IcFSZ
zb}(C0voX3f)<QPl+wwL2Z0r&c6@YO|7FCU&QZ5aGIjLU~(6)JcCQqAw^X>LXQCo51
z_fC4|YLbtdJxJL4iK;Gj#N=JDTw_<)VWsEf+?}@O=8pDuMiMXM#Ejv+Jq2VS4s!tr
z3=!UiI7uT5`6PXx21(oEV8Rl&R#tfPwMmA5YbdLs$Usp+(e36uECRfG{Tz6HsA#Wq
zix<kB*s=FDBk@C}|1gZWdz{el{QU&hGq=U>Yawx_)p`UGN=kbnEv%H{|D3Ttb=k^6
z>i&r`C6aH#a$}xPJm&VDI}x$5kcE0GXZKdMzT1b)+tUhSb_bo2P5K|u`l=O!c9Ws5
z!m>*sK_nyEC%^xfD$+UuJ!d1OU*JjDzCo{{J7$kZ51DTTuJ@U&wzoAhDjR}7Jkfkt
zH@3tT5}<RZR$%a239D?iK#Mff3V?|#cQGMaWWo9U3Y*2AB<oT<9?iTN&b4<>4)jXm
z9UgSC*^W=;mOka@5L4|_#}{ZCLY!kpAocs;u>L9yO%>>hZOMC2k*C}6Y9$iQ9#s@G
zWfEwyu3|kS<AGd`G}6?_b*nSIw!8^7zxRz66JHw}QWTqEP%!8uht~#Bq_saA3>HjP
zj30J;D{m{EO<)tiBNtWMt29&>igXvqmdlLT^5NjulRj-xbK(I3CkB~2=-Q(n?>yG_
zIyTTB8)S@(3OX_X3V~kK(uHX08eGveG=^L<zNr5j1Y!(<*r1!%{|5+<2n-Fz{eM8;
SP|W=Z032=IY-+6h9{d-=B2Q`n

literal 0
HcmV?d00001

diff --git a/lgsm/data/gameicons/dod-icon.png b/lgsm/data/gameicons/dod-icon.png
new file mode 100644
index 0000000000000000000000000000000000000000..49e9633925189683ad2fe710883fbf5b1dc2ddd4
GIT binary patch
literal 2489
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

literal 0
HcmV?d00001

diff --git a/lgsm/data/gameicons/dodr-icon.png b/lgsm/data/gameicons/dodr-icon.png
new file mode 100644
index 0000000000000000000000000000000000000000..db43137199e74c45fcb889ff647646bf7a02c520
GIT binary patch
literal 3083
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
Uf}8@#=(+&F9vW&_YT88n7vjwG{Qv*}

literal 0
HcmV?d00001

diff --git a/lgsm/data/gameicons/dods-icon.png b/lgsm/data/gameicons/dods-icon.png
new file mode 100644
index 0000000000000000000000000000000000000000..455a25b8cc0fb07cf27bdbe8df4cce2a39898766
GIT binary patch
literal 2359
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
Nz&M<+e`M<!`yUN5V6p%J

literal 0
HcmV?d00001

diff --git a/lgsm/data/gameicons/doi-icon.png b/lgsm/data/gameicons/doi-icon.png
new file mode 100644
index 0000000000000000000000000000000000000000..bd1329216c5c40b969943271d55c459d5537108f
GIT binary patch
literal 2520
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
V{{c;HxD7u5SeRLxmgC$X{1;K(v=#sW

literal 0
HcmV?d00001

diff --git a/lgsm/data/gameicons/dst-icon.png b/lgsm/data/gameicons/dst-icon.png
new file mode 100644
index 0000000000000000000000000000000000000000..25b41366c18d71d00b41ac543798ca8a88f84cfb
GIT binary patch
literal 3125
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
P00000NkvXXu0mjfk<s)u

literal 0
HcmV?d00001

diff --git a/lgsm/data/gameicons/dys-icon.png b/lgsm/data/gameicons/dys-icon.png
new file mode 100644
index 0000000000000000000000000000000000000000..bab210283e423d789048dcbd608ec92fe2d361ee
GIT binary patch
literal 2777
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
a<U{t2{Qm+2!+nlh0sw2_fT=<gZ~qslHZ#ru

literal 0
HcmV?d00001

diff --git a/lgsm/data/gameicons/eco-icon.png b/lgsm/data/gameicons/eco-icon.png
new file mode 100644
index 0000000000000000000000000000000000000000..c3f995e69d0e1c72923b669e14f0674d9bfd6cff
GIT binary patch
literal 2910
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
G_xgW)bdTHs

literal 0
HcmV?d00001

diff --git a/lgsm/data/gameicons/em-icon.png b/lgsm/data/gameicons/em-icon.png
new file mode 100644
index 0000000000000000000000000000000000000000..2c98840b272e90dee3fe5b69e6aa02745b3da947
GIT binary patch
literal 2442
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

literal 0
HcmV?d00001

diff --git a/lgsm/data/gameicons/etl-icon.png b/lgsm/data/gameicons/etl-icon.png
new file mode 100644
index 0000000000000000000000000000000000000000..d81c43fb57730c0465e1d3ea6c10f1ef16613de0
GIT binary patch
literal 1774
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
QPXGV_07*qoM6N<$f`IlbmH+?%

literal 0
HcmV?d00001

diff --git a/lgsm/data/gameicons/ets2-icon.png b/lgsm/data/gameicons/ets2-icon.png
new file mode 100644
index 0000000000000000000000000000000000000000..11779d255958f90f75f0e123b719576fbe704d25
GIT binary patch
literal 2997
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

literal 0
HcmV?d00001

diff --git a/lgsm/data/gameicons/fctr-icon.png b/lgsm/data/gameicons/fctr-icon.png
new file mode 100644
index 0000000000000000000000000000000000000000..42123534322707d6d1b5b3680b4db202af8d9618
GIT binary patch
literal 2596
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
AMgRZ+

literal 0
HcmV?d00001

diff --git a/lgsm/data/gameicons/fof-icon.png b/lgsm/data/gameicons/fof-icon.png
new file mode 100644
index 0000000000000000000000000000000000000000..c9e17c4ff444aafb6a4acf4651f94819afca78f6
GIT binary patch
literal 2491
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
FV1kTTv5^1(

literal 0
HcmV?d00001

diff --git a/lgsm/data/gameicons/gmod-icon.png b/lgsm/data/gameicons/gmod-icon.png
new file mode 100644
index 0000000000000000000000000000000000000000..00ba856c8ecbcc447dcf50527b0721d634cd6386
GIT binary patch
literal 2429
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

literal 0
HcmV?d00001

diff --git a/lgsm/data/gameicons/hcu-icon.png b/lgsm/data/gameicons/hcu-icon.png
new file mode 100644
index 0000000000000000000000000000000000000000..f265a5853349142db415ec9d95ec1101e834546a
GIT binary patch
literal 2241
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
IH1VPQ3s4~QUH||9

literal 0
HcmV?d00001

diff --git a/lgsm/data/gameicons/hl2dm-icon.png b/lgsm/data/gameicons/hl2dm-icon.png
new file mode 100644
index 0000000000000000000000000000000000000000..5bf5720ac2623da53e36251b2ec90f7a2a010453
GIT binary patch
literal 2549
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
IT}<qM0YhBJaR2}S

literal 0
HcmV?d00001

diff --git a/lgsm/data/gameicons/hldm-icon.png b/lgsm/data/gameicons/hldm-icon.png
new file mode 100644
index 0000000000000000000000000000000000000000..2a97796401490cb48e8be7955801bfe9b58c9325
GIT binary patch
literal 2722
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
DwgK*+

literal 0
HcmV?d00001

diff --git a/lgsm/data/gameicons/hldms-icon.png b/lgsm/data/gameicons/hldms-icon.png
new file mode 100644
index 0000000000000000000000000000000000000000..37e2a20b8031ad54ec534ac430a97179267e07a1
GIT binary patch
literal 2834
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
SDQL|J0A|KkMt`B*68{UNggRIN

literal 0
HcmV?d00001

diff --git a/lgsm/data/gameicons/hw-icon.png b/lgsm/data/gameicons/hw-icon.png
new file mode 100644
index 0000000000000000000000000000000000000000..0894332e32b75faeab63a8539fd318e2ed583788
GIT binary patch
literal 2207
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
Z;KGgnA2@Eb^Ry%Y5D5<W3f#F{{{RpL2_FCe

literal 0
HcmV?d00001

diff --git a/lgsm/data/gameicons/ins-icon.png b/lgsm/data/gameicons/ins-icon.png
new file mode 100644
index 0000000000000000000000000000000000000000..30cfaaf358b2fbc6fcfdc3c7d45b53d772f72beb
GIT binary patch
literal 2738
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

literal 0
HcmV?d00001

diff --git a/lgsm/data/gameicons/inss-icon.png b/lgsm/data/gameicons/inss-icon.png
new file mode 100644
index 0000000000000000000000000000000000000000..0109dd07c97ff20e0fc669da1db637c5a9d30042
GIT binary patch
literal 3200
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

literal 0
HcmV?d00001

diff --git a/lgsm/data/gameicons/ios-icon.png b/lgsm/data/gameicons/ios-icon.png
new file mode 100644
index 0000000000000000000000000000000000000000..d53577676dbfef4a251b043d5dcfb0c6d838f6d3
GIT binary patch
literal 2815
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
NurRfSHyC>){1>I5JYN6+

literal 0
HcmV?d00001

diff --git a/lgsm/data/gameicons/jc2-icon.png b/lgsm/data/gameicons/jc2-icon.png
new file mode 100644
index 0000000000000000000000000000000000000000..782edabc314ebfd05b6e4ce09c91abe073d132dc
GIT binary patch
literal 2983
zcmZ`*X*AT0|NYu!3=?`tWO{5_8<imwGGrKojCn{AV~y01t+I{mC1S{$B@Io=^3)Jx
z%Y?EFS%&P{CXJ=Cuk-V~{J;30&$*v_&i$PG;=cKun|Q?v1s0MP0ssJPZf1f#Waxho
z<UZVcQcJ~$#Oq~bX#@aODWE+(-+xCpGpr>5JWv7vVhjN697@C=01yNNfS)b^pqB*z
zl74x0HWv>M{H_)#6M*yI6gHHS4wWN*W)1-W022ETTz%sadxxSxpt<E`0hSQtsE}NZ
z;dCAV2t6}5F~XU(^L=#i%NW7~Qvr-f#`X~H$4?*Hhz_sVu>@V;;E%8tP4CK?w(JMU
zb2C;-;Wu;c{TWEypNcmKJbNGGt-PeblU+@D&MSk^4z>h~BqtgPa-9`J?q-yiSJMvI
z+dXM3(X7UuzE9(ZVlQN6PRPp2S}OISy?NPKew$Y>iT*OTq(1pWssJ~2MLs|UA{`e)
zwClw7yC|TgY$y`s^neQp1VT#-FU1@lmg<_*%gK@M$=A<CE507|kpVFj$v7ghof}x(
zjgS#2DMHx*MRAZm;#=_#IZaJAj!TPUx#;(8*iVi=Ii6Ccwzi~lcFa?dq~;|-yk;gM
z@*oU88n*ps?#mZ*a(cR>3I*tei6OZJDMnWzT!O&EOQ$XIueJhup3IIcU9VXVZEX1W
z8WvcnJ9+sia%%PqsnqKEYn-a&nHvLb?bac|!A`Y*82gm?OGYZO>D=DLX@!SZ{X|Y-
zxsA*q3eUdZ#GyqnJYfr;PnvBp%I!BZ*s+2~Dd}l_u(iDo9|=>synK?@z~JCNsu?9E
zC9Wrr95;S-9_%AM+r{dlg3Y1r2@ZNuX`p#y7d-N!W)WU^$#8<kdUZnOQq+};{aMVQ
z7csm527`gM?d<MW;dNVGjS`0a)&Gjec9{I_Km93DpoUP3U!cl`v3AzktE=o=+jXRY
zxDAo>FGsN8g>V7>Bn7nB-7}40dvo@U^y%lifOyTy-fq(Y?nt4V#`FuU3K!rvg-XZL
z2kM(kB_LovBN*bG{pwiL#gG!mQGRL8NavaQ&E<8+@`loy)m#?irsrxY$u`KkOT&7^
zl)rWAV?&R+GWFm0VLy7K$g!<H6st<pBV2&@%uEkTeRx81aeRn$r}7r{^~_60oj@lh
zqIa~9`AKmtTzAI{m1(B~e}v$<{Z-B|a%+;%kjZ8@taTOy&5jt<ZhV~|dGM{w4n23*
z+iRtHYJ&+!jtmzWBhB()tuuoUQNxQPZ(da~eCc;IbobW25M&njx<Bm~)a!S{%ld4z
zgs}$6LATcLD2?`4MG^wU)8cnUV^SR*8P}ga)tKm?tf{X)yY81PufRJ5<0rZmURZVR
z`qs5Ov7HIeWZj~k?$-}ve{Ug|^>>2!xS;R5hF4F;dg@hGR1mroF(K!MMtyXYL}a8I
zc9yB0#a~4)$bX!k$Ljk9(TP{(1=SLuFQo9hy$8{8H!o<9g@$^S3lET51!4y?@>6*%
zX}*yt_S<P}G-<s5o2}RlG>UE+ow96oAI*?wPptVmNA`>(`Zd!QvQP#VY!l;apJNaI
zMTu!8JYqvF=TX7MJi*S^gAF@6^x}NcO7~y;=Vp`xl$^##em&IP$jY{K?P>6jjJO+d
zU$Ue8>pnWVV0;Vr_yf7H;5?t{!z*oyF;|U$WzV#er_AVmtVKpw+P6jmMKwgfw)(?8
z-&d0^(~*S8hnVoN#UE8}?RA?Xnv9DE5nE=Vb=r?SS}?SLR*I-$3U9g<+9ew2A*~=B
zM}g`oq=9%dj3DqMl_Zr?@~)&kAz3&W$7I<KpOlt1D5HkM5JyL!(VQAK-I=WVGAiBN
z!>11Mz!hUxOkvmDgxcDbFg}QYh5qLLM}hAJud5(m3>E@*JE_GDfiKQ=?`2xa(Dvge
zQv!pQRaY~b43sK}*PXktuED{Zf-f7#nh2g+asw~?-rZ35mFL2sSbg?m)HEyMa7okD
zC}Nv~LjRF?Y%~y~G9Z8E{b_Uf%aaU4gTqvt^DK`49G$)zg33i1KC#o|r-cTMFw<^Z
z!*w>-n$}v%#=w%Rot%)R*NDw6f~m;KZg-cfo4U-iPa@pts1&aQ_Dss&>EKiEeL+J!
z5>bAQu;NNt13yGc68W8_zj5caY=*rur@l;|<lDU@C(D=<Nd}`F)5{`?Qx}d3v|Fu&
zul?L?TF&@DcTnkojE{or)To${Nq39RC3Guu$&NCUFbFMOXg2el(i;u`)yhL?h{G?S
zcm$&Gi5Y#$qRU}y8s~?Dd%NfaXFYyNmQq~G2=rwS*F=%Z-l!>=*q}JI_t*uy$<6n=
zU)g_nRLM)c=^^2g<Yw(Ny8dhJb2BKIwV1q_EpMS!QG8ogwZFPrjSA)BYqLC0Ti4|<
zXifG0+s62xWv$aKEz`$%XX@0%rbg|0uHk-LY~x1r#e^>?T8g2L$H*J{Neo!Jy}hyE
z+vRKjOcyGGQOpA4aOF&GG+EA7EMS(Tq`S{t3-@A<iGcJf`?EDFl4Cj2vQm^b^<V00
z?;5UMU#s_ICfHWbF@Jjwf*R_g28*9`m;c2|@83$#kDx6YrWuvtueg}09A|ZZQ2@kj
zwidS*J{s>D4Gx8G&lGU3Cl{{h@q|96eomDkOUA5Q&nZ7c<DeiD8E8_fcdU)WjQ?wG
z9p}^g4dc#d(kJ<-ra2PZ+Mt)ND#B?Aioc!C2>-6F$lHG`>5LKZQ5?C?nvNxW^_5RN
zZ@c{HnnP~^Qz$~vEbZ=bKb0gCY0#vF>bctr>+_3?8++VE#-H}^79qHAsS!>$KT|dG
z{>|=uN~~zuh`zKcMjInonHv3mpZZPw@y`4mcf~Ffl5fY}__L)eEHCnQqSBjq?%HGS
zk9FU?1B2D)B^kmer=9c>^jhIJh%xRGTUfK?1XDmR(xtN3<c(%W@A~TL2lbU<3oOaE
z$^65G*Pq|6`u<Dkm322f9#L6+)#{!V6fO?A6y+o$!Iz~bc8$wy-zS9BZd1NenX96f
zl&`K)Eev+vT_>zWgxN;xW@DIPI=}YH>??w2M?&LF36gN)(}l+L%U9HOOC+GTH`~CP
z(}DUM+C&vH8GXUk$ZM$i1fl-B-RqR)NzNZz>ti7HdNb|!g51w2PRBOE%G#QBSN8dm
zEb<HP@9l%#m8OFoHpOJRk8BaSPR;c6^vp+u|Cv6cxxZ94xzXYh?BTCnP*EF1gg%<l
z%?|8ac#oHAecNs3r<Tzdh$baop-dEgyz=QfdHgw+{DDfXe1Gq|G6$=gksq<+O@z*b
zDHiC6GZ0Oogm-qaaYvC3zsIRhxLZuPV^v}&Iq@r8yd2h2P1+ZCcrG7cVsvw~y5wUW
zOX);kXJ=>f^MUhET)P|`H8XQ_bAz0Q&UbI_Ba3?bhiG+mBZGq<rDpQPk#IOXd@^#i
zTZc72KLv8uuOYZ^O*DjxmdJ4fEig=JKVFKPa+;jaQWQ&s39Bd}1r>RlrGZQ6M93d{
zVNp?(mJ&HeNGk4VToDARyq4{ie_Tc;FDt7z*aE@B6FojY&P!@(Gu3;(aZ!}(iK}WX
z5_0LVRSE)y5^aJ|iS{ZFha|1`>S)+(-if$Vv99W-fK;9T?B~>dIz8j=_8&q7-{|Nl
zra$ap``t4SZ8*HVqQce()&`C7m+^Y%P;r9?7_J7NiZL5>GR(%<mHl&y7nu-nC&v@Q
zOTih-v|~Hk+W03oAGc0(A_Kcc9hYV)q+8omM93Ysi9OcFwemC)5}R}w?r!ZH{6k2R
zE{|ZG`pXzQ)nfpWbw3SMDDhZI@#TD-l-tm1u*DpWB;M3?zaO;cWv#!fTz-4*Ez$h<
z*kNf^47_|b&>bJ>q33qj<B))}u(Rhhv|t)qaGaKo9_)hNIc+r<Ob-S#@u^<@KZe@`
acW=-8|Gz<7N5uNj0GMC4GAT#8Jp3QnCZBKs

literal 0
HcmV?d00001

diff --git a/lgsm/data/gameicons/jc3-icon.png b/lgsm/data/gameicons/jc3-icon.png
new file mode 100644
index 0000000000000000000000000000000000000000..3c1cfff2993291f472b443d1aea4215c50a10815
GIT binary patch
literal 2979
zcmV;U3taSxP)<h;3K|Lk000e1NJLTq001BW001Be0ssI2{21+{00004XF*Lt006O%
z3;baP0000WV@Og>004R>004l5008;`004mK004C`008P>0026e000+ooVrmw00006
zVoOIv0RI600RN!9r;`8x010qNS#tmY4%h$y4%h()NRg%h000McNliru=L!%J3Lm#W
z;+y~g3X(}gK~zY`1;J@-9min+;F;N(z25G=lkYt~9^xgEqDWbXFIlx5J4zh6u~k@(
zo4Wncs`=5s{?np>1GEj0!bQ-uNRSw5Y8P!&ponV+0a_Q1i^@kV%XU~vlx2$)MN;Iu
z?|pmD%+B=t;KgTu=U#|M*pe8krWq#~Bcvx0<%Vj2L<R&P0!+pwl^mOpQ-YI3!61Q@
zGOnmr!l?;F$SuoON8vz9X%ICT^i4Xfq&2+lN@`{lE0;1bgc1XlV2qhJrdv_yYQ%w<
z07)RiQ8-c{XBcq_q^1I#He#tzNF40)5tf1@W}8{bK@bEelZ%CU)9qrBE=po!MTz^J
zQMbt;A(~3vF2P6zQ1YZ$nM{vY;y3`|@XoCb0fCmyNW;z+XLH4=PP5wG-u8Me0-`v9
zs+qM4<#Zv3F$mlkYZhF+cnO;sHXIyWd%s{PW+qD+Qz7#bk+-tL&d6hYVtLW^hGo+j
z(=`L@2SIz#iBzrF#gYfjscvtcA{llfY*Zz=!vva~m|Q+;X%?UYV@*|6wKwbyYkQae
z<kC~mJQK6HkT#rLj{1yI^wM{}Q*Gb-<~J^U<NQ-ORTn_>X-`X(%U3sE{{G*b0nyiq
zYBSm+QOs%V<klJZpX%Kzl*Q=<NfRuQ773gxP3aS}fnq>2Q^`05N40Sh8}id@pQ%{<
z_T!ISc;d0?N~zUocVb@7YBo`*8ey;dDAtce{*ID-W|j)>a6AZ4nbrY_-@Ee(qr2n9
zG*UQM5K0${R%zn3*WY~crN4OVoy!1XLBTK#fBJ9#dgIoH!g<axy@0;_<DY!{FTdBM
zk(zVr2d%yvc1-7*o%yd+=AZj;+Zqdi#4O5cs)m4YYvH{cSmk~?T}dEXSy{U2wKmp2
zoh|1tJ^M9)h@XJ1YOOmQHfnW26DGiZ&)vSh^Y%wqy9X6k^<1v~xVmE#b5NdB#}WZX
zi29P)T_3tIcX)DYQVlTSffd)RVz~vUkDdG0&8xo_s>X?@1_HrY7pm7sEkBI?c8*{u
zQB*9v^789L|6V+-kJ;sxI@Ocj3t9F4(RSd)9A$4R_IlJp`Ej)L&?u5vNhE<F^m}29
z{E%d975Fi7lOaTiCpw6L@MsuHtoJBmG?8H|3<ico0OnFhPT0rpLzLaRS9gYfIdO|n
zE($RPl0FY1;z9>_psPiUdfQu{uip~F81&uMC(j5grAWnQe4<iJ7o4o^=%zIS3iU>f
z?JIx#{qKGK%$NV}2e1C}qmL(ch|O`c+WA4P^+HN5Ve0T`F|F<3#PocPAe>RN_1$`F
zZ}aJ|K62vJ!*Bfj7qjD89I-?Lm>8kv*t16rr%)^wlsKF#<?l{RFO64b3VGcmbnoU<
z%+C$tD_Csf$TCbX_SKLTjFjlN>F$1davIZE+QbAQogT|vc=GI5&OXfI7;6wF;eOM-
z)$p}Ls~sw8je4f&{P7<=d;Z+{h3UhDWb&m7!iq6+4+X53RbEuU%7_V}M~WE<?t242
z4sF#?W*>Y=_<h>00oPreot;}+GP3Cq0TA*Z{^LJw>@{ar@88<mI@sM@S(uxfKRh=-
zLA7Mq?Y#f)<=tM(gv4YLBUuqNq_T$8Yn)#h^tz5yI(CxUIr#MRzwfs9d!7B>pm*l+
zCuZiBvW5d9_U<R^*Ec>Src*rnTckX*bM5M!A&)H0Ezg&>JB`iX+}ycaQzvFf-K#X}
z<upqW8OWp^B%5A1P>rdT6XW-tjH!h8fA!(%TuzBux7FEi5BfnO5e7nznCd9ivMNTY
zL(XH*6*A?$ci*n=UDE<#7K(1*FPu6)xpwAYqguW7>u$8Jwhd-*J&I+nIKOsgZf3QO
zMdAnWsVC0@7S5O486)$5@bGT=xG@OGsNUUOZ?{{4ka}ft@$`9|DTRZ6*lQZ`J*i;L
zOeX^RA+roC^n)l2k>56TEyk8HwTw(lj=Boxoqm87x|OJQC$U+Vs*_HRFvsfc?%b%>
z+ZsXXR4Sj%IFQAIdiVCNer>M|X>nqFRBhIq?M|<Ykz(nZsT<=*SFB7PW~W`PK!G4;
z+-rA3C56kjF(B%}0Qo?SYd9@<iZw^g`r`az<PGbs=Fau?yptJue*HIBrV4gecWN6q
z{3tyA$V2(UiEPFq05lu*s*sK9E(>IKWy*D31raS}d7NTN%Mb;_MtAv0IhTTj=se;C
zPQLVKFJcAm+}ZxC@Ba1ePd_jX?ZkZL>90M}9t8jS-*1)1^3T6;u|Mb(vYENrLmDQk
znOa}J_T5*0cEFJ{w<ZChQAk*bdJ)g+aAgb~n>6z}HzDP595FEFs3sOOhbqU{mb&#l
zU6B``yKwyEiQ;5ATgqFx%*^6K5V6Z2eDvDCyng3i3vqFJW&Xa2jJLn7KpZiQAx<HN
z49A}=;xi{I<&<K?BaIyxXyC=$apX--R%|DA?%cWZSb?$Fax%oueCg4%r%ye=gNO$-
zYv(s_-ucnrzw*K5t1;3-j+}J9(`tjrN6c4YB4~tjrtn8WZo-MEFi0?^2bKwJO(qaE
zyMtzDSSpTJ#>dyzj^4MrcKx$krR<obB6I^Dg)>v*M^~2Go!0!qG{FEl8CM_$#HfA4
z-QSAbUdkE64z&07JBjWtWX3Y8&`A`BQcr9q2ujdFwPmML-}<9VrLn@sjT^su`<>@5
z{w_cY(J%+e_+<I_{_vX*KKekhTvFw**^58Fvy)4~VDqxk+fsqr=<K0p9Obg67>p<g
zGFg#C{tyZYgF)Lh6temGwY}=?<7XelY5T+XKg{dS?A&yAtdJ>|r>AEGje~A`EM+;0
zzHz<tvwwK?i|Ze!Cg!xtY9!OC;!1Ay0uH>;$rz61U_~3cQQ*-;5C!YyTzcqsg4qAX
zn^#Uh@c7-WyZ`<lumAbC|I|=nFzisz9rW5(%GlmL_~9!*4VdioB8bG?$;S?@ous|p
z^5T;3hk(^El2Aq1Bt{a;A!jU-35P6VjoQK7+H#>(-n#w9)&G6(^P3w&(irnN4AQn0
z_-><CPp8xS_4dabo2r$|O->(LIyybStRkk$I9)2%_IG!`_yB8~CPWg2ek`a#AO<jE
zyg%su<ki<so&6Hh)250)dG`$h!P0D{QSZ0h(4#^sL_!E5%H_wLY;NJ`$>me4OtI*w
z?Ic|gG-{ppL9>f7!ZBlEC=|p&l5idC2*fdy+*d89+3|Mw?(*1OT1YvnQhTo<`uwxa
zyPG@v$BsXcE0i??O+&+ij%Tg@y)W+8x@izOhL2(|P8<(fsY(fts3brb2I2`|5v4#1
zDav_g<Ho1(*6pp^TPGG%P<mcKbGG)*8*je#t6%m9?#jyQkKBO*SiN4=k|1$wzSq+H
z$RZ+b;s}ULCUdwv(dZ4}GheyihM}X%7(oR~O>zj-{dQRE4K2eW2u>7D$4m$zL8R{N
z4@Z%k0M&~V#+aZnje|<1teYtwjSx{)5iieG!iewm6Obx#K;ZMwo|nTKjNMpD!z7l%
ziJ}hzkj|TehKdvr5IvRgDUBje0&Z|lkv5{pNM(J`<t(%;6Do)Yk%XW>auWe^#qmVq
zMzcF}X#W2JkR9Y9zIpcG0000bbVXQnWMOn=I%9HWVRU5xGB7eTEio`HF*Z~&H##sm
zIx{sZFfckWFhpv$^8f$<C3HntbYx+4WjbwdWNBu305UK#Gc7SNEipD!F*iCeIXW{n
ZD=;uRFfcVY4o?68002ovPDHLkV1oHmv(5kj

literal 0
HcmV?d00001

diff --git a/lgsm/data/gameicons/jk2-icon.png b/lgsm/data/gameicons/jk2-icon.png
new file mode 100644
index 0000000000000000000000000000000000000000..8c480a205e7544d61ede62b163768a2402748dff
GIT binary patch
literal 2805
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
DlL1HN

literal 0
HcmV?d00001

diff --git a/lgsm/data/gameicons/kf-icon.png b/lgsm/data/gameicons/kf-icon.png
new file mode 100644
index 0000000000000000000000000000000000000000..516bf8d6f1759770e47360c8ecf2f3360108d857
GIT binary patch
literal 2687
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

literal 0
HcmV?d00001

diff --git a/lgsm/data/gameicons/kf2-icon.png b/lgsm/data/gameicons/kf2-icon.png
new file mode 100644
index 0000000000000000000000000000000000000000..5e3a57c6e51bf2193cca8c1104cfaf7691f0f01e
GIT binary patch
literal 2706
zcmZ{mcRbXOAICrT-u&!QMz-TFgk(Fi&IqT>v&l>+JEN4WY#Gt1yUs{Cd}Sni&usc;
z#NmX5!`)AR{{Hwq-jCP&^?1Bq@8|#TR4WT(7DfR^003A_pa#~LF7{XSl$ZOQZ@2Q&
zsJ(T~bphZ*2GhA4&EL`kYHbbxkE8$~J_!Jbmr?vC06YKz0Nxb<GztKKH~7^*Fs;ji
z*8R4z0YLsc<*jdDUM38|P{%L;V4eLd3OZ<3)n!N*Zengo_mh#GgHg2c){j@0X9*?-
zy0*|>g~_v*OP(=wzm9)4M+g1fA<Q``whVIWF!QVGy+N^SHh2t{)9ylJ>vU?t-+VQ>
zx6Pi1>@bH1c>DOmx9J%@>*foYZ6vH=5V7u@=h8-y0(S|-%gm*Kh|$us8!Ll{T4k1T
zb#Y()oj;NFA4VUdyuA;Ov@={B)3tdH$7aMQ4^=trn^c^h4uxvj#<W2ucR6k^u?`M6
z2&TU4^tD1)u)iHz+S21Ox;Ny5`BZI9WXc!1$PLU1MB5OaP|eBxiJdT?j4E}%J%^mb
z2+m`NPY5Xk)(o)59Vyk@OMTXQJ?V>3UkRhz{Q^~ii%B!gzWimG1ob#ah=P+h8kQ)i
z8qs|&De~$+VfnR0hGp1y{RQ4C-o{uGT`!I*Mn{?f215!<CNPQt@go5ucOBg^RYV%6
z1b3vE>L!(1l>8OD8^+H=_9K6fFcJ2(AWdj!?Ff$4&nv>W@=s;beJL0imu#V*`nnu!
zP}48zaT8IJm91h?zBEQ;XUPng@tPg#T}?_Ex8Xn^uSHv}nxVA`r+OPf`y0~+d#$9D
zeWy4<j|X;^qde1ITO+56@)5x&Yk9)A?I7|g@2lYB{{}w)XhaqwP-322V@)DO+Gx;}
zronO%UgRd3n=4c;+Rm-*wkrvR(zH=Qi<3H^#@-%9f9G73cwu=?C`(tu%dNDYZM!@Q
z-%Xxw$j)-y%^8tP@bRP?NV=k9Xf1v73uJv5Cxq;rVg<MuMGXU0i}i|xi&n-XPkBO4
zUoXT3DRwHXz7({KnMv&%=qE2WlIuV8Q9_v~45*ZWN)CS?VXkg~V!^I{@?Df$S(2)`
zX6TiY#y_67{5HNi>OPpWYjA0?l^%)=JNt3{_|~8G;3ZC%AvQw$c35vZq{PdCo0vbA
zl5;Smo6DKolhEqrkfOH9zYM`nRB&u*$wa9l;3x`*(G)KU!-V%iXMHg%WFsHvP0^FC
zteE!wF*)NAFujnwGW~TZG{<B@Yy9e)tcCBX>=4Fv6LlsH#hiW?=GVnrFm|*aDoZ*U
z^YnW12Os20rOYBYBTgKfGc)bgvc6$gN4Cjrkgk@kE#Y?KqtckrFx$vZ)R&h{z;yAh
zarv8F#R@-8>TA}S&dhx9q<e1C#JibvkW8XmIePeT@nUU$fC$lUElhVJm2B7Cio_=$
zxv{!BOTndut?+z{>3ny@;;Y_KAh7T@6&VQtov4%9;b$f-tfpq69TvVo*sc_9`=iDt
zggnHxYfo=Ma3kcyf1jj_#_mwviggPKaKjTNQ4VZ$;G-Se=4O^cdudI>pJpv{eq?4l
zbZ&iWNM1>m%2-Ff%?%u2*S>T{Vv88MN17@jBPVAF3@yBSnkRERHf4nuUyqBIG#{2M
zA9mP0SuKuTGCl$j@xYXj(9K`=wXLz|r{JJ-`5ap{Nauqu#SpNk_S1xc%<-l|!TcVs
zLk)}AgTuvDz45l=(Y=fOT5UM_*BL4F&_ac~Qa*2a*8*D|dx0{sG{HKbj(oH{pII&0
z==rw~cb7ts%1<t!yHsq_5aj6B8z#VO$7E>kR=N56Tgou4=k2JO-Er|jIkx4at&Es;
z0_s+qTg*LBxOZtZapX*U;n~m>zyqsM4*ncK*(}c~$*DmvgD~ArvU3WZ<ZfiB&o=vd
z4iPL-z^oL(3y9xKk<B)?r_`tnAx-7uLM6i4S%&#6bE^%XbCY~td((c;oAJ!T4`U<t
zZ5NZHEGux<#AnpBMX3d}oJL~R?lz5C-08DqN>Vt=3<{sH{HdgFn!!KyELyEzDSCUe
zv{~U}T=?M_p8q{*tK(YZIcYaBb?#B^;l>5qMR8Eg9j=NNhHI#Y&-9+T^6~$0&=gN#
z;1&Y_hiZ4>W{U?0Ta7sNn}uevqiV<fT_4FIYw4|f0}&$%HpeY&qN-0wQQ}pho6cHc
zBxA$Iv~n#z_A3;W2~R_VEoJrP;WDG0jIL6nTG^A=zO`MnuFv$IwBGY}#}>)%k9Q|#
zprUZA!;PZw1$CQnn%q=n2}ouhLhQm+x!h0-ENCbJ=!ek1F(`)$($m-QC3E#EX(<vB
zqTUVjx}c#T?j>R;(qlcE^Im<~c6+KHYg3ZHef}ecZsc4B%^0&k13bP!k|*tpEU2L1
z3Om)~@d26#_Z!qDO`iT*9b0e{fH|w~%+_yro#m(4RLZC!GkRVlcDg?dy3EH8+t<uS
zf(B|RJM>DKp92D}lrOD&d~|@M4%a%yK;99Yr;e=5SjG`JQq2nQes<2bqE7zih^YQ4
z{@H7@qyY)~Mh@LOu~aPmCvXtej=?vuUv;5yrTO4j-hAzgv}Ye3r5JTNr?cn_)h<E)
zHD$b{%crBSm@?*rZsKn|lXrh_W8PjJ`tyAA2~>^@=Ol^sE$jLh(^48Z#G8u88+Nf5
zvOi|CvJx=bGX3<sB#0?gm|jDN*1}kdFn8dhfBcnL0%i&&XDmBZ*X4B8vauNavBm#J
z+)0D$Q&D?D92_(e9oUg6kd)Dy?Jrj;bUw0pg6ob<ielm<g`aB-<J%wKU0lL$zE`8x
z<5F7pRO(U8=$=DYI0}Q)Fs$flIknf>VTC-K=Ka&|WgeV^JCKX|P5}&zo|!rxqHAI$
zk_78ef(K%reHeOLi~VBZvh;$#m$346AgozpTqh(7q8+Kf6&8_<Q}*X!#}sUmE4PHy
z_3v|2gDL=kQ%EaqIAOKA)IV?VM;P+`{=U^{rCXGGw8fR_$BeRhPLC?ZucPgoq(H`~
z8)fCSdK6t0u67Ozub%<t8g(<d>hV^-6A5*c*w$Q^tkt_e$XMtN2HQTeY+Pb#Q)hSJ
zCrxdkME)GS8&}oTcdM)-b%YH{dO)xOinV7P5v*o_QIzRvail(eXX-6e!8>~F-?I#V
zcQx$2r<HqD_K<XLg*^<Zg}d8#>*RbsCFV`yHBJwBMbyNeqYpnqWX(j^ba<^qS|ZIA
zpjMBEq45%D0v;UwrUY+ntY&ae#LIb9XV|wS*r}oG!kb4;3T&N4v&D7l?YqD6+5}7S
ziOhnAO4HBm9~-6IFa_ljMtn3pUkv75(7WN?hwx(AG?Z_)W^Fklv__scXQi7s9&w=y
zHsHpoZVbPlQB@punz^6in>El`$1Dz34raE>_Stylz&}OFSeX<~9Uu^sS_I$U-b%aw
z>A*_xV@=w4&^7HZdF@B*lNiCQB9Y>#J-ZeX+ktvWT$u<w^zuKG3^#NLN4SN1YIuZt
zUK*eRQUNO{gA|liZI#tDKsPkN*X2MU4G_q{4|n)KKwuEU*DLb>1J~79EiVDU#L&W^
JM$h%}e*qqL2l)U1

literal 0
HcmV?d00001

diff --git a/lgsm/data/gameicons/l4d-icon.png b/lgsm/data/gameicons/l4d-icon.png
new file mode 100644
index 0000000000000000000000000000000000000000..319f644f86f719f32533a42bf19416265779380f
GIT binary patch
literal 2487
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
BqIv)T

literal 0
HcmV?d00001

diff --git a/lgsm/data/gameicons/l4d2-icon.png b/lgsm/data/gameicons/l4d2-icon.png
new file mode 100644
index 0000000000000000000000000000000000000000..9a9a3d68bd67e7e3fc777895ccea823109cd8ebc
GIT binary patch
literal 2741
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

literal 0
HcmV?d00001

diff --git a/lgsm/data/gameicons/lo-icon.png b/lgsm/data/gameicons/lo-icon.png
new file mode 100644
index 0000000000000000000000000000000000000000..17aa10b3176c55b836423d2df7a426763b75483d
GIT binary patch
literal 2747
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

literal 0
HcmV?d00001

diff --git a/lgsm/data/gameicons/mc-icon.png b/lgsm/data/gameicons/mc-icon.png
new file mode 100644
index 0000000000000000000000000000000000000000..ad6904d9cb10e5776dd8c5ba8c85beb2a8a16162
GIT binary patch
literal 2423
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

literal 0
HcmV?d00001

diff --git a/lgsm/data/gameicons/mcb-icon.png b/lgsm/data/gameicons/mcb-icon.png
new file mode 100644
index 0000000000000000000000000000000000000000..9634220307042b92eab42c05a91ceb2656ef5dfc
GIT binary patch
literal 2737
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

literal 0
HcmV?d00001

diff --git a/lgsm/data/gameicons/mh-icon.png b/lgsm/data/gameicons/mh-icon.png
new file mode 100644
index 0000000000000000000000000000000000000000..1f1621f1576c206a38cee743696027f9121ec19d
GIT binary patch
literal 2638
zcmZ`*YdF&lAO4RplbKT%g*k-Fp&>cdu$Y-cSuCbR3uQS)SaTSLVwoHxhawiC2O)WQ
zDss%qp-E0rvz(Kb9G<<eKE5B`>v!G1`?~J?cYnD*{cfLev6qA>LI41ebimr;_gM80
zz(RX_7rs)yNBaV7oNWN0o++{GEAq!AVe!rYaPtTN(C7fLy(iJW0l*C;04(|dfW<uk
zPzWu0;d)}v5WVDRZwvhA&pc>nW$!8Cp;*sw0Dyk{1CSW@ZsndR7UAG*C&q)oq#-IT
zR&zyrXD1zOZQQUuv3Y$VhkE3@$xGFBt0fDwZ$neaYH3EA1NYILP@jP|X>%B3-|ag<
z7_?8brzq=`AWPL6Q18|3;L3bt`zx&*Of=Z(kD~E&sIQ@gQ^xJ1C7pnUhV|l^--{sr
zzthy{RI&K)o$2}K>Z;3!5~Pi5B6}rs3n_4qUdW)d{9C1hG#e*vm!LiqQNV|hi-%Kl
zqU~Hm*~!Cfa~>lcig1(nd-A~|YV{C1y(}vFCCC@`6meQy9@_(w2Vap&r}?=LK}jAC
zL2}<S#ZJud>|8OfgG4WaJ3N_k*NY4<@0>+~g=$S`4{G{<n!On%0lttkez_b7MVZxM
z{m~vq!~$JVAG)|EJ3*13JlqXuQ(WcXBwW>Knpn|Uf_MTf3r}!&fAZl`4&^Q>;~))e
z9T2Mre}qZ`Yq?QzR4@!zA;vHU{i+%54Pe`_g%KJ&5S<3QRCAKu5Oa^<x8AK}l?>zW
z#3JZCO2?Wk`c@c5*k0Pe+4F2Bm_*)3&2!-Dy|>=Up?o?>XBG$l?#PlkMW;EAFboOl
zOIj{5OQWy*(iM(+KM$Sdk6mQt;Bk$5jT{+a{mRj+r*usxZpGI>pKL<jDQXT>i!wP7
zl=4lgbeF8sH*ZTW{9Xn}(9JfpI|U)}8%sRzXjGc|7rka{%lnm8;dR;=j;OD`Q8%nY
z<On$WBlna2<yMmqhb!BT^Ur!dGC$=P+py&nAej2`;3enK{?Kf7ZdQ3Yuhcw#eMh0X
z8qKi?*!Wv7O$gl!Co!bak8;>(Iiu<vJX95zg89X~Dc0@`cBD)WyzBaqE>WEk$6q9e
zr`^L1V=j;-5sb3WR0Z#853f|VpS{D)QI!lMau938up5kkz2XpYIvLT{bp60Qa|@eK
zymtofQ6VP3_YZp-Q8`wdQ*+yCMVi?X%$S>7FXoMaghLDG=Kb@tuX!E#*6ui0x+YSQ
z<fY_e)_ZAlXyQNcl_Li`yUbD$qNv%?r!;6P8#CKzMRD!dz&c3}&uxqTg57#uOePO#
zot_$6@L4$nGqIaes;$GduvQQMY`gL!A=%_yBDZI75Y_rAerLYl`R*9t{*kDj`2}_T
zmIq)i3BSXH+{m1s9={;05g#b<UUPX<<{#kw_m1G*yAtsj)Z?xvNB?=hz3#ZW(BtUE
zS^Y^62wrvNl7qvko8twu`z33WFvmsahJA&RTvQfqry~sT-R-RhsMOV;c*mB-T%1c(
zt%`*Dum0L`$f2=+yC;X=&8s-JZOr}{A?tsdJv{MP%xkGr_uM#tVz+;L$Lk!GfKQEj
zeA`p9=bq>M4hOyBW@*8d6@NxVnMTjqJRQ$~zU{g;kz4+a4VqMr02Rh^xioX$hizrc
zRo1#XGcnagftUYGYGu(In<RDN1<RyG&g+|`NU+Gm3bzC1Pzqf1=&PF#xvv(^#)$_q
zQIS{q7!A82OKq2<&&}#?Qm?hoJURDhAh;&RFn8kV)0!V?rdkTkw_7FxUxZ6te9;;g
zVHQzDzJ@8m2nFihAwB96T~jXC*krYB7^lBZwI@e~#KcjW917E=nzUTTRod0!wuq5&
zRrg9yXTLgcrHlT-9%Op)3U^vUCZ|u|6_@v^NRiE}@BdovI^er6w(Q}084W8dDqt7<
zdUZDaIbBOb_c6S=T}tqKtZMDVx-y*Nl~zD7YxQ8I2an$J&!65MusnY7r(l;g7xfR*
zbTv;y@@}B&#0Ku=d$}ryrOX5*EJNz>y5}55UGdlk$J9RRoK?(DUsV-!PRV{Jq@C~o
zo7+FOGy`|SRA(lw*ks4VJv07zp2;YcztbtE{ERC6JiE{=FH8>p%_g$|ZzPrbK12JA
zoVhT%fBZ4dYG)ha^o6h!8qOR|B&Z9P8y)!t?3l)E4Tqv?KC|Px*g}7PzDZ|fpb#o1
z3q?s8jFeWpestY26(F$j5=uf@{^AUK;m>@g?8&hR_VQD2%YA)wyRUz(NIIW~?Nf6Y
z+otk~;U4mp+NFPgpPVs>ZHNqMG#P)>D?toeb{Z{o6cb*c8Fn8`2Q=t#(k+Y+fMbf>
z@X*rh9nmwet8e8Go+&;-B`COibBh<)tkU@U8|1S_8Zp0Drua)wOc%qJ>4?_8U$Q#<
zdgd`9n>KH00C))_&N$LAs4_6ZuL5Kso7g;o{Ha?YeAKLI_oJKJCOo-_6aCD1QLBCW
z%G&oYQi2uT_lzZ6l`1%JWGZPWG>X*bl$z~(vMjE*pqbzil%VdTt)-Yl^t$To5F5EQ
zq}z611~z?dW_;WrBcu3(pH86bWyBp&9{zL`>#|WzH3S{dgg~fVzIs2bNUr?J(xo;Y
zgCMu1=nQ8x+!KfB241la^9#Ok@nU;pxr}jy&kZhyFb}dt@FhraHBryETh?C>v^`LM
zPeYSdgK8e)2CYKNEJsdap(e*N)d0j_Y=X>Kr(*p93t`66F$>x35sj}U_DOHvR1_>Y
zNi}+__!74srSxLCC9iIcfV1LCJonpq>##GJqAeUks>`(VW=mG=LybtN^l3B}zR|G!
ze28J_fBW&3@}Zfjkazmcs#n=@x?7794mybA$C?{dFG<#F=2eCosCG1QWZDG$d=3$K
zDVVOrLx9hux~4ol8o-wDT;+6hH2=yjK0wOZnhwn|(0>~;c|i$kOwZ&|*yf1QXs!@o
z#_N{IYl@6fA|bosByw#yo0x8x0?X2_cJxHfoK*zKIu#>R!PJJ<jxcgmlznxgVaP5B
zpuvWTOb`Ho5oqw<LjkwUcylkHHW`-Hpl8m)YcIPZ=rY{P0dt?4bg2_ccCN?nO9C`J
z1pSRt!nx_BD7>0)6qm8_Jmh4?XJV~)o?p4N5;+}>?B|RH&$PBH+7%h%z*W@{(tbdV
z?w0!!{%`zdn9`bpB#RYLY|L3SD|rub%l+P}V21*FH~!)f$tybvutdYkCJcDWw0+Go
zV^Yk6JkXGXzr<KyUOr#KL}Jj`?&w23=mT9zeu!ts*&xR4@Zb~5;D=#if=vd9^e{&T
zeFk@b@CYhiP@w0Cuw{gii}4V|63zG6=qDd1fJRiJKiI2B64-qT>3$6lzsR(IG8J5E
z7B*+qoFnLjwOJ(ZRiPPS=Miz)H^R??blq={03)Q4vA!Wv-|)Dbp{WJZ+``yI7m2h$
jB5ebkH~uFO6mt2hKjr@iOiZDt_X2=}or`T9+9&b9)%v?O

literal 0
HcmV?d00001

diff --git a/lgsm/data/gameicons/mohaa-icon.png b/lgsm/data/gameicons/mohaa-icon.png
new file mode 100644
index 0000000000000000000000000000000000000000..0acd3dcf39d8fbd564eb4078eac8748d412e98d9
GIT binary patch
literal 2845
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

literal 0
HcmV?d00001

diff --git a/lgsm/data/gameicons/mom-icon.png b/lgsm/data/gameicons/mom-icon.png
new file mode 100644
index 0000000000000000000000000000000000000000..317b6010a9e19865cb56eb507aef10d03ce9ece6
GIT binary patch
literal 3025
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
TH8&1V00000NkvXXu0mjfy342o

literal 0
HcmV?d00001

diff --git a/lgsm/data/gameicons/mta-icon.png b/lgsm/data/gameicons/mta-icon.png
new file mode 100644
index 0000000000000000000000000000000000000000..25f89c9d86612df2fdff6167f52686fb8936a1a2
GIT binary patch
literal 2147
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
GH~tHF4)IU`

literal 0
HcmV?d00001

diff --git a/lgsm/data/gameicons/nd-icon.png b/lgsm/data/gameicons/nd-icon.png
new file mode 100644
index 0000000000000000000000000000000000000000..dbc6a689100adf77227ae5a8cdcfc9b2057dfdd8
GIT binary patch
literal 2520
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

literal 0
HcmV?d00001

diff --git a/lgsm/data/gameicons/nec-icon.png b/lgsm/data/gameicons/nec-icon.png
new file mode 100644
index 0000000000000000000000000000000000000000..27ba109ea91c1da49c028be0747643982cd0cb1c
GIT binary patch
literal 2009
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

literal 0
HcmV?d00001

diff --git a/lgsm/data/gameicons/nmrih-icon.png b/lgsm/data/gameicons/nmrih-icon.png
new file mode 100644
index 0000000000000000000000000000000000000000..02631268fda286ab42ef67094bea2a7093e2ed2c
GIT binary patch
literal 1100
zcmV-S1he~zP)<h;3K|Lk000e1NJLTq001BW001Be00000RuLsA00004XF*Lt006O%
z3;baP00002VoOIv0RM-N%)bBt010qNS#tmY3labT3lag+-G2N4000McNliru=L!%J
z3Lm#W;+y~g18Ye{K~y-)1;N{kRaG1Z@b7Q^)?Rz>v(KJ6$Kgz;hGCjX!^=ZbkXR{7
z8ATCvCB%oWAk0G#(nG!`;Y$$x3561bJsFuqj>AL{mXnRxl&GV2^QbdtX74%svex?b
z`S6R&Wdzm|kdGynSOQH-dBuTJk?-uI?kx|1lncu!wZ<_lvXVsvAn+(D4=|k4L&G}X
z`qY@YHgmq^mj>(<ITEI*070nPZrS{;{Yf16)v2S(+ke&s075NLB4)#ouF!4$#=Bgj
zx!t-z-4orlL>?3s>~(jTI5UrY1{6`{kB3KvNLK!}%15lNsFAj-B+{=-w^Fq((!IU&
zuoU{jgOyd3v{l^@o6QuiW|nA5ZOh`Yqzz5hqR3-ZN>frDp1oRXi^@7gNnV=@qhdvY
zn@SPLMdCIkegGc?5X&S0B}$a%6o7;7Q{5A!xhisWH6Q?nv@iv2uSDPs)X%e>SPd6-
zao_Bf$P=8&y&_G{6Qtszlb(3x19kj~BRySdFXSx((#kjyf*7~_>Y;_Ths`tBcW$1&
zNnS+61z=8zi3BxTbLXC)xOr=|yS@M3QsMz2N9$VH1>zuVk@y?O;sfrh^0mL&2}HQo
zqNp@Ev?VFR?1A2o7cbkwT)NY+j-1rq5~E!=M69;MtLfEC;}e@lY2T-p4FxsAg8e#2
zRl_T#OI0$mE#n(IG<Evjr3;aOYOZLNUDF3*CGa&x)jRhW|4p^$Mqi>|t15D$doee%
zPF@XX+9g<{m1)`*M>FGF_HJx-76Kr1Y=vLmdNHYy8E!6~q^%F0bQ52H;V0ft=PJp-
zMh*Db>P+m@+{XFS(_?3f{qvXK9+}Md^e^~aGuNs&|IsghCWF{qd+ZZ;<GVf7-i<_C
z?Y>+=$V|@s)jRy{ZPTacjx3*8+A+DN*U1$_{f`$SM;uh9Z2lBa|1k8%fj1k~qgT2k
z&PM}DvqRs6Wm2+*$9iXG@S%TUajY=?(~rYj8zyI_=R=_~p=1!0TDAL|4(|Nj?#gD<
z-F+kKkI%pFiz8iwf|}xWASFEX<jmofQwOW;?&8^VR2Rxac}+2`BP_K=vkLSiZg0Bo
z)>g?3$otR<99l?71&S0J2-3KTRwGVf0KforFF%{#F_t4I(ICcvE!D1e%En|wg1EKg
zfBR6yOCb3=E&u=kC3HntbYx+4WjbSWWnpw>05UK#Gc7SNEipD!F*iCeIXW{nD=;uR
zFfc@Fw(|f003~!qSaf7zbY(hiZ)9m^c>ppnGBYhPFfB1QR53R?FgZFiH7hVMIxsLb
SHx5q#0000<MNUMnLSTZ_rSf9{

literal 0
HcmV?d00001

diff --git a/lgsm/data/gameicons/ns-icon.png b/lgsm/data/gameicons/ns-icon.png
new file mode 100644
index 0000000000000000000000000000000000000000..bb59c4a0e8c81c4c728503d1ac2e1194913a5a26
GIT binary patch
literal 3113
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
DUH$8a

literal 0
HcmV?d00001

diff --git a/lgsm/data/gameicons/ns2-icon.png b/lgsm/data/gameicons/ns2-icon.png
new file mode 100644
index 0000000000000000000000000000000000000000..4894b0fa4997d6ca618cf69404c0ebccfbb17d2d
GIT binary patch
literal 2859
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
JPDHLkV1fdEQ2YP@

literal 0
HcmV?d00001

diff --git a/lgsm/data/gameicons/ns2c-icon.png b/lgsm/data/gameicons/ns2c-icon.png
new file mode 100644
index 0000000000000000000000000000000000000000..c519b771d1c6e080489554a1d1b58e086c9e5152
GIT binary patch
literal 2603
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
Hb$|3<Xej8n

literal 0
HcmV?d00001

diff --git a/lgsm/data/gameicons/ohd-icon.png b/lgsm/data/gameicons/ohd-icon.png
new file mode 100644
index 0000000000000000000000000000000000000000..85ccded1499681e00339f50692a9420f1bbb1b3d
GIT binary patch
literal 2630
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

literal 0
HcmV?d00001

diff --git a/lgsm/data/gameicons/onset-icon.png b/lgsm/data/gameicons/onset-icon.png
new file mode 100644
index 0000000000000000000000000000000000000000..598455658fd8dc52ca0860ad6dbd9402b86b9e59
GIT binary patch
literal 2927
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
U2h`NL%})Tp*uYG`3hDCTzcJ!$N&o-=

literal 0
HcmV?d00001

diff --git a/lgsm/data/gameicons/opfor-icon.png b/lgsm/data/gameicons/opfor-icon.png
new file mode 100644
index 0000000000000000000000000000000000000000..3ff940ea18f1e1ff796e385f0dcc7c308f959923
GIT binary patch
literal 2428
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

literal 0
HcmV?d00001

diff --git a/lgsm/data/gameicons/pc-icon.png b/lgsm/data/gameicons/pc-icon.png
new file mode 100644
index 0000000000000000000000000000000000000000..f115231ddf6bd67f47dadf5aa9beb4e54e2f4c85
GIT binary patch
literal 2605
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
MXS!<Ts>q1{0_3#c+5i9m

literal 0
HcmV?d00001

diff --git a/lgsm/data/gameicons/pc2-icon.png b/lgsm/data/gameicons/pc2-icon.png
new file mode 100644
index 0000000000000000000000000000000000000000..8a20b75c8a80d2266c4726a1b99caca33baea066
GIT binary patch
literal 2504
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
IsL&h#0sWDtWB>pF

literal 0
HcmV?d00001

diff --git a/lgsm/data/gameicons/pmc-icon.png b/lgsm/data/gameicons/pmc-icon.png
new file mode 100644
index 0000000000000000000000000000000000000000..c58cb7aed3ad978f08b9b80a0d4ec962e2cf55fe
GIT binary patch
literal 1312
zcmV+*1>gFKP)<h;3K|Lk000e1NJLTq001BW001Be1^@s6b9#F80004mX+uL$Nkc;*
zaB^>EX>4Tx04R}tkv&MmKpe$iTcuhm9V{rtAwzYti;6gwDi*;)X)CnqU~=gfG-*gu
zTpR`0f`cE6RR<SmT^(EnLGS~_)x}BCMN0f%QfLw5!Ery{-Fw`<1H7#oQ;fbips1#v
zNhXARVO8+IB7hJ^Fo=lA3@w#i%)xbh-NVDzyBN=MKlkStl8XidJOXi?X}U?gK|H%@
zYMl3p!>l68#OK75I$e<Xk?WGfZ=B0EdwFJ9&t>L`!^A?lhov576<r~oA&$z5O8MTr
z!!qYB&PuJpI``x+3>MXuEZ1p{A&DiVkcI#W4OCHsi5RUaDF!mMpK$R<Y=4?u61l2i
z<XAu*3Pjrv{s+IiHA>S{PEs%d^uJiv$2j2M1=>x^`aZU-_6gv72Cmeuzup4oK1pwO
zwdfHL+6FGJyPC8IT<!p)PnxKUw&bJfEtP=xGy0|iFnkLH)|}ot`#607a@5uG4RCM>
zOq3~m-R0c_y}kW=rqkaKiqvwjts>H+00006VoOIv0RI600RN!9r;`8x010qNS#tmY
z4#NNd4#NS*Z>VGd000McNliru=L!%N8VBi^z()W802y>eSad^gZEa<4bO1wgWnpw>
zWFU8GbZ8()Nlj2!fese{00Q_)L_t(o!|j)UXv|?8$6wF)zS!4cF51f2B5OA{J7RWz
zgjVLq=0}OmV$P2!g<2v)6fGh{Yb}a@l%y2JQkwkZ3b7@2yRR{Z&ad0W#<{!i;}5#E
zsGaU^SMvGu^E{v4ub%Jc`+h!;;8$c?3oHWRkkU9W6jK@r2x)}h386S8()F_Co)16(
zWQ@ymsDsS)KtBBw&7nZo=GSeHT_V$3U=c#O-H+lC2q}%Zia<D$AP$f(5Dt-<Gu4}@
zZyrrgD9I8B5Q-^HA<6OY0R+Pa*<;6W<ls(Rjo13zuf`kT@ZKsG78jA8o<@sXPdtE>
z5(7cyic*}F6=aVe7g>Aj^(G#`o@eF2o+@&4bI?*!XmRUgWoDph8m+CK!~g`tVQkr1
zY+Sd7mCKj@%msrq+-xMzmV>5g0DKPw;t!yzDw~|;tY5o|^t2ueIbC;_qB*k|oiPf4
z&tJOm=+EK@U>=-8*|G(clq_V*WP2p<>-2NHrk05|E0gRKBl$oefcO2U_yAZesnk^O
zXXcDTRJEt1<MkVk9;?A-v$3RfQLmb>-Q6@j(PQ_4EgM(Uc>NM{X3y*;?rzoDUbUM*
zFihEsWoTMT@4o|yzw2x4Ct%OdV~E+@D|f5$4%Np_fiO{DyNBVaslV0Tf6#;x3V~@r
zYyew#?4xk1opr0rn2?*pgNIG*+E>l+p=K^!IK#-1BmP+T{KYF&Q{P4_vT_S$Uz-d=
z5(tIKw~pnl_amRXy18)nB-0%Qn3O+@6fZ8vtv^Qy5qlFVia;Bv;%R$@VMrFto6W2l
zg%KwNeiM5C$=9cNTrQ)#u6vv~S<6#*kLx{kd+_=E(fLX&;vT(?iVfQUs5^I&()mR!
zDJiD2(;vOD{q+<hpuN2VkKV?CLq~e-IT+&d)dntJxq+ex2AHBd+^CxH|3s8f0BMBZ
zB}@G0SS}Q2(#CS3I2DO>0nJI!Z<a`x$^YTaw;{tUj}&#_G$6e{AEzCjN4iM%^ZW<$
WqY!OAe!SoS0000<MNUMnLSTZ!L}-Zs

literal 0
HcmV?d00001

diff --git a/lgsm/data/gameicons/ps-icon.png b/lgsm/data/gameicons/ps-icon.png
new file mode 100644
index 0000000000000000000000000000000000000000..afe81e82340b2e04a66a4487da79be395d144dc4
GIT binary patch
literal 1216
zcmV;x1V8(UP)<h;3K|Lk000e1NJLTq001BW001Be00000RuLsA00004XF*Lt006O%
z3;baP00002VoOIv0RM-N%)bBt010qNS#tmY4%h$y4%h()NRg%h000McNliru=L!%J
z3Lm#W;+y~g1K&wRK~y-)CDZ>;lyv|H@b~B2J<r|o#k=4TI@BS!3Jrx61afYqvsA2T
zYEV)-r!HJg6Wds|wYFMoQ=pkTMmVb3#>k~o$#Q~>DXj^_S7i)EPB=jBK)UDdc|P~)
z2mgfE4=;dFa0&s!U?*Sz2so$?5(^FxfC&QtlMpG{EAgK;a(CD!C2SGUC=pCVVF~C;
z#(r2?arfipR>>a6ar=;|q|+jrCAq0t1kn)rbbpF1I1+c$es5`W1z9y%Z!OwG2Ib5d
zQi{oflGLHUdvA`1$483;&t?9+>O{^pD@=7$5|H?ya^{8_-F-c3#-9Dr=!QMpr*eV*
z?e~Rg4-+tHQ{FXk@84ntA$>k3^OZiu-pR>W>*+2EN>Cz9>TG?9{bbH=Rc|Mqxc=<s
zbrezEGq1Y`v<Nr31WE7srptdJ7<f1|Y<~93p%r69EUmXcinv><O`R%T>X#C}`ce<K
z#VYCToURQM&GhYm9Gk9tC^HCA4doI8hs*A7h%4K+a_05W-0bPag)lNg#GxJ-M3}3W
zJPHKl#ox1ZAEi4pNx<pHrrB_7q0;)+=-f;zGg4mMHSLgrob_j`lA2Gjii3_&h#t%h
zEsS!5i!H|%AGG>eyf-teI&QFUegY>)zXP`>A}ejXn_7Xm7`G>u=vT|nUqIHyqy3$g
zZdM)x9o=%iub6S$7e%gwno2t?4P>w<?bHjU`NQ9bVX&MyMK#GIw?cEn?Fa;NQu-A=
z``#9Hd9tYQNF$M-?~Ga2@BwrB=EjrLd-+>__q`6&>bf~r!rB)0H7dE9_ck^L=;DEv
z_WB)+Cd0ipDlBWVt>np$`_YXNbe(E?LO77LJ~cTJubC=hZGa{qY`9X_e+0!5Q^{Py
zZBvK5$=P*3>?VQPiSj$W!UX)&OBTh|qIo*y)3}L@!hdS6jE%V}2742$t8PQvB!Z7x
zQY#<pyz^q1gTI^L@|JpzWWKz)X)>`aQG4dq;ZKeSkL`-uedja=XsC-$nCc7;6q3F3
z*Z%st;dbzXGiSLceklh5VUl}$bYJbazwI>;>rTy0b1htJZ}4h%Yr1HW00O|)!1*&b
z{v4=U!8kY^-jh?^wWZ3)XWR|~qBNA9G%u|cY5c*zbJCNMo_f8lV_Vs=UnQ7ifQ^Rl
z_}`rJ*xy*^$~Fok4@aI%6|KwP_Xh-`oPtFR#+nOMx_?<-%gE6Iee&=PnmUtr8`Na5
zz;y`50BrlQJ$!lev{FsRaLq<I0Qz(?bVCTk7K!5dj69da<sa|r@i7(w1BogH2<Q|#
zC>Q|kDGLB00t5vA18}>p&PR)|6951JC3HntbYx+4WjbSWWnpw>05UK#Gc7SNEipD!
zF*iCeIXW{nD=;uRFfc@Fw(|f003~!qSaf7zbY(hiZ)9m^c>ppnGBYhPFfB1QR53R?
eFgZFiH7hVMIxsLbHx5q#0000<MNUMnLSTZ!Wg^S~

literal 0
HcmV?d00001

diff --git a/lgsm/data/gameicons/pvkii-icon.png b/lgsm/data/gameicons/pvkii-icon.png
new file mode 100644
index 0000000000000000000000000000000000000000..bf518f6c841dbe3daa8bbd2865853ba935d29073
GIT binary patch
literal 2938
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

literal 0
HcmV?d00001

diff --git a/lgsm/data/gameicons/pvr-icon.png b/lgsm/data/gameicons/pvr-icon.png
new file mode 100644
index 0000000000000000000000000000000000000000..f471bd5d03a4aafa404894ec6e8775017b5ffeef
GIT binary patch
literal 3021
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
P00000NkvXXu0mjf`D4<9

literal 0
HcmV?d00001

diff --git a/lgsm/data/gameicons/pz-icon.png b/lgsm/data/gameicons/pz-icon.png
new file mode 100644
index 0000000000000000000000000000000000000000..63218d100b1cae615cab14b3e58cd64b93dab065
GIT binary patch
literal 2489
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
DXezE*

literal 0
HcmV?d00001

diff --git a/lgsm/data/gameicons/q2-icon.png b/lgsm/data/gameicons/q2-icon.png
new file mode 100644
index 0000000000000000000000000000000000000000..e57d4917dc497cb10b82f177225c7ea57c0e2870
GIT binary patch
literal 2584
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

literal 0
HcmV?d00001

diff --git a/lgsm/data/gameicons/q3-icon.png b/lgsm/data/gameicons/q3-icon.png
new file mode 100644
index 0000000000000000000000000000000000000000..7d111da1e115035b14c2f9e34f74622660048d32
GIT binary patch
literal 2734
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
T8cPe_C;(VnIAH5A-l_iuYp(db

literal 0
HcmV?d00001

diff --git a/lgsm/data/gameicons/ql-icon.png b/lgsm/data/gameicons/ql-icon.png
new file mode 100644
index 0000000000000000000000000000000000000000..5b0e5ceffccd10b9201b2a5ca7937c4c62df9013
GIT binary patch
literal 2974
zcmZ{mcQo4#AH{!mtTuQQLB&>86-~-x)JjssD55q|d+!=iBg7u5+Mzsct+p>!o1(RA
zl<K2qYZfK;DxqHe^ZnyJ-*dm8bM8I&|C@Nv;4V80garTqb{%b`@dcrO1fsq8r@R}_
zFF^02p|1e|)#<FK_6&bQ2W?}000@%+fT&miIJvN*RskSL4gl700HBl$06e}0%|<F0
z0pkPAT_kY+=Zag)o?JN0zS<T60Km%mM>M0~B2F(%ra&Ei6w?X|n1e;AL2aP`09aCW
zkQ!L+Uh$Em9PF4Nu)WoK)Jp9iq);|J9j>v85Z>!@z>o|k;1@jXaa|eD(AUrbY;Ne7
ztDMghCB?)tkaVtah!I!6&YNc<`t;ch52H(N4Af8Nh59(#HX+oO_9Vkcyc%Rrm-Y;6
zA`H5xsxwkx10VG0;|O5URIdTQyLJfAiMhCWcF|loc$|jy<fLWFu+Db%9r8^{QwO6w
zTaQSF@7igGk0u*5?lvNYEXSPc>ABVy9D|d%jg=9@smGPDGkR{mwn$zcZ1P?R`TAw!
zpkQl5$<$;UQ<qiu6OM6_?wK*alwvd8;1jXYJwT_b&CiS!5sbkwIK<xLuIc$F6=ad^
zETA6E=n0LPl0hrzw;b<CM%?#cDw~}lqzU*XSM#qsCOx$5?)L`=<j6~tSgHiIylvzf
zL#OaJ+jnXXZk87dk!7#|B)T{gTuMjZCwHv}h7lfM>h?T)Ri}3TY0#p`Ym(QC>O(Y<
z-6d2&m*#NE;4jFB>7NLRzU5CqGqGc{aQm+QUZ^R4tMjNqKxqw9`ie8cIvYf@+$H`n
zMZ}S2VN?g}h4-P>!oQ#O#Vl>dYa}Jth!dYM^p@99azURohuPepzZfw{?9xeVwPl#3
zsa-S`H92@<cPDg}LOje4fabl|eV~!3(Wrk<2GnCTHQ9DHBwT2te7~yv=05kEYZ>hN
zhOeKAX&6{b%{8LUF9i$KG*dzh{*s1=>@K!%R_Y$wQ5t#UKS)wrYUtE#kEYX)1ULH+
z<uSBI(#G@|6KU{_{fd>R5F)|mvML<gVS!`+;zMo@ck30Z@7lOQ%VgR&XsX1)loW**
zDDmV$eG}UB$W`*18P6#^{slU0^&A(!Srkc`3?k2dUvpwoCq%=liCDCI&rpMkA9X`H
zqIT-=M43aV;dI);#hSV~6_nLKt^{S7?9&Sqr=Xn@<Pg#PsH@TocYD?L0zM24s|2hr
zdKnqc8(SqCnIU|RZG3(|B9|n<5uYdO^$v4pRolJJAd_JQlW~taH&{2#YghiEa>-}F
z#x*_E1>Bq=EFg}!uh1;8W|TbU@v?2@vpvd0UAx+^qQVmY>eJ)-yjhE}(MM|`z2YW1
z1dYL5<=_+2t4rQf;M|Vlx>vvVsb&%Ta*p`euMpu>u%>zRvZY@|CVeSl+|r#r0d4Gj
z23_aQ?=g6YR<QX_wP@h^OVnrn^3`wec2J&>iMo#&P6M-(wJ;9t`HmMYZPQ_MfQJt|
zfQr&g)ns?7z-Tg9XAxNtESa**rkr5c|CEb^_LukY3THnCf+I0bYi~?G?`}?eL(2@$
z38Rn}@7<)6{OB+7w3UnC*~YcsF=Pb{gRlrHHAxe%x16`#xJ%q6_V@b9E;VT{KNvGh
z+vRX!bjl5^7u-;py7QYH%zP!ZI|MiUeZ4ItrU#VHf2(3|)kOowulOlz{E>J+wN=tm
z_ewwOPi9l_TWGP=2d+70DHbVdtT7mxz_xI`5B=_a$ek+;L-=4Jfp%XvB#|^yj~_o6
zH+-VKAgo1Z;rZ0fLfh@prYP#|c9ckA4vcoQTjeY!k$}Zq5_tY?9Ejg3Hk|n2f&Z7J
zk#k95$+`W{qC-PmgqQT7(TJCb#YS$^EOcr0%d!J8|8iq{=e}+0dbN%;As#O-HhQeX
zvuG%xZWIFC69`BXc8oIBi;^qh&=82>Tn+bopYg--$6VvcWZ_Zu$Bfcs%*$04h)xa-
zT;lqv?(|k_roK2}0@mj9=aawc&&SM-5p;Vmfs%OKHwVe3t%REZgzf&nNWSJLNdwOY
zX-T&SCb$*3#Y2elowUiqNv)4lpC@rUYv)$!>u7YT6NO)7^^$tQA}z&<LILSI$z)4+
z^aqA6%*aZ@{K0eee?J=+)knEM=+1&LD2~p^5B1R$-?y@|GTF=R*DK_UzM*eRzm`u2
zIT3e&$RrB$@KrnO<>;?UzSK@3Y2Cp(H!Eok?mVgbVgB@IyB@u^uHuR<?;PeVhd=)E
zFidK<v1YL#aB$su2rDe@AVs^B1>$}?l*wG1u$@)YULa}CuT4i!%T4DdCh#*?wT&nH
z^L}W6tgQ+;Ia!P_*f(FlzQ4lSct)w1dMxTWkeyG#pVQr!9<q8QRAXYv;7qGhk%xjC
zAFHe@j1;aHc|8rn{QZ?tL~k35BCZgVb}Y%VHV0t$*WX$KTwrE_h?D}QrVYLLB=I|6
z{A2^h%B3Y8Tsbc<9i6VvvYVyb)~-dz#=0{g=xdX7!HNjSiG=H9bV{q+vH%yC8mS-L
zyflXM1<-KBr$|SX0MGZx<1x0N4p8Zge8BK`!^94A|2mJO-hgab2VH*S)3c^oVpAJ6
zve~)gU6nC1US1wzRi|50>)E!TOIn`bFEiGSyZ^yg7wv{GFD#AWzklkb^;TkUlfNoh
z$iv8b+(y-VsnO$bOBrP8fOB70``-5O<0;Y$?FREbo~bW;%0+*5=2rtVrmfUC>sn`i
zZY8gNiUzmN8)#QJNuvknK++(2?AWIoo-U@IT(etK_M`j=T9@gfF1XGoF&%EH`M)kf
zkwMDY_|pHJwM$-}Z3ttiSKnTZVJF*$x+R;aI{t`T;ZZr`75X-pb;=l(nN8D$fb?*-
zJd>g|vpZ`oY5(Qw@@NmcsyQ5S9{;Z9mB4_Xg0<T5R|~7#ttrfjV)1Z5lk~c(Ik5Ds
zx*M}>vgmQmJU?1Z?W{4=>7USo_VC}Gf{`{gVJpi#K^EDDSI>tOys5*i>n$x|fv-!F
zEYr8FZ&CB{(ztq>y?BME%C+Y|XMaOv+<D_z>1ASpDD(YS3bR<1={EnKS|>j0y6lWq
zYNXO$oCE%jw42eWrpMJx)ylfEtglAUQv$9#{Ln7aJoqSKZObUYB45T;Pbi!^_NZmH
zV(4Ee5`bpuf(zcjbC})hf&vSMk9>Zu_h=PSN+PV|jKiz<`VP%3FHvq%rS;cej_L^G
z^W-sftvPqp!sd#qd@S~Sd&yOkgrL8(^{`dneucaLTizW!GdVs+hGOkOsFWy99+NBG
zoWfq6yVF<N_Xk|+D`!I<?A27l-zh?hahA}$zny;z9<^?39({an_$iOP<ByUBH1cWb
z`cj_y4+|A-T{{j|eY4Q@@e7utqzOQMk!6(4BQe7C-^YGfuWCj39a64enGGApOhcS!
zGAb*0A9O;al=NJ&%S~7NoUgY=_ryXnJIusA+?mp!)*V*h8`^4vw#w}C8&;7XEe=Y0
z7|}c+1qqXviRmd|2Dt3Cq}>&J4GQz*gAWCRWi5_Z(|f7u55wPxM&isiJGvbm7LUQ4
zO7o@bs8)S)FJjnSW&fn2s6g>IdD^TE?|Ab{KfMe?XC~5~ueP*H{U9$tys2-2SG3^8
zLofras2nWONF*;G?lk(2xF?au_vA&U1ZCphV<aEPFC$-J{=o3>J6{hQ(h9s$Y;;|a
z_q9?kZ18)!#Ct(OL9U+(M5fC^l(l9y#@igFI9CZhM}KaVwkRtdj>W(!D9FjFUk+xh
zVt4o)oV6>G!jjD&O^YLq+;`N1It=)GMu+k`F<x#9>+d?JLASI2NXwN9x!9`WfhhAp
zNBcl0B?o_}3jp$R^0#il<Zi%jV_^zPa(^q`LR^=VQ<9TIy4UahPr=K_(akyZ{}&Jn
RmkciofDXz4S*eL5{1=R&a^wI2

literal 0
HcmV?d00001

diff --git a/lgsm/data/gameicons/qw-icon.png b/lgsm/data/gameicons/qw-icon.png
new file mode 100644
index 0000000000000000000000000000000000000000..c5a65f4cac99692bcea2c4080a0116a9cfbc8ce0
GIT binary patch
literal 2725
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
Nz?)cNs*K%k{uh0a`TPI?

literal 0
HcmV?d00001

diff --git a/lgsm/data/gameicons/ricochet-icon.png b/lgsm/data/gameicons/ricochet-icon.png
new file mode 100644
index 0000000000000000000000000000000000000000..da9b2a3095c0d888d41decd57dfb6b0c24189c58
GIT binary patch
literal 2727
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

literal 0
HcmV?d00001

diff --git a/lgsm/data/gameicons/ro-icon.png b/lgsm/data/gameicons/ro-icon.png
new file mode 100644
index 0000000000000000000000000000000000000000..027c0f6623f4e63ae6c511f47340b82e86e0ad67
GIT binary patch
literal 2393
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
IG4T3-0YBcB#Q*>R

literal 0
HcmV?d00001

diff --git a/lgsm/data/gameicons/rtcw-icon.png b/lgsm/data/gameicons/rtcw-icon.png
new file mode 100644
index 0000000000000000000000000000000000000000..d0fb797a7a368a3eddd3731240c4a0849f025e50
GIT binary patch
literal 2244
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
LU8rRg&#3<bjmrci

literal 0
HcmV?d00001

diff --git a/lgsm/data/gameicons/rust-icon.png b/lgsm/data/gameicons/rust-icon.png
new file mode 100644
index 0000000000000000000000000000000000000000..4847775036245698151d4dcd19e234595fd909a4
GIT binary patch
literal 2351
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
VFfcVY4o?68002ovPDHLkV1ia%R`UP=

literal 0
HcmV?d00001

diff --git a/lgsm/data/gameicons/rw-icon.png b/lgsm/data/gameicons/rw-icon.png
new file mode 100644
index 0000000000000000000000000000000000000000..58d4a949bd2c358b6d21f92fbb99cf760536f58e
GIT binary patch
literal 2644
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

literal 0
HcmV?d00001

diff --git a/lgsm/data/gameicons/samp-icon.png b/lgsm/data/gameicons/samp-icon.png
new file mode 100644
index 0000000000000000000000000000000000000000..d20d3faf74fc1ef829114dd3836e944b1abf5ed4
GIT binary patch
literal 3026
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
N(A6}8y;paL{x9xjx`O}!

literal 0
HcmV?d00001

diff --git a/lgsm/data/gameicons/sb-icon.png b/lgsm/data/gameicons/sb-icon.png
new file mode 100644
index 0000000000000000000000000000000000000000..3baf0a116c838149b4f331b9bd105a1985d5d313
GIT binary patch
literal 2598
zcmZ`*X*AT08~xd0cx6b4N=BBlPId~T!A#y!WJ$)Jv6p?{mn<*YH5wvIGGQz+mTZYP
z%E-<P5}`@PzAy9Y<Nw3|Jm)_5oO_@9@t*S}-ZRwaWEW%y0Du#TfE%Ckl|Nu(Jl#hE
zE5)b8>;yx>0H7w7<H(NXkLiFgMgc&uH~>V(0>Htk6!{YX{Nw@Pmn{IOV*!BQGq2g`
z=BaVU-asD?(Em(fYgy*00`f#y_yEA!i9cXqMWnwz6<K|eC|%Yib}%=)Fi~qR@AT|E
z5)Ly#{OgzFmb~cb*D<gV^pd{NO41mgb`0?6_g8V}uZ}|reJzDBmY;{?rOB@N6i|b3
z$A~j8PT-st!agMt)FYk*O;;97&oTh<zKxb5!egys{W@jp6zb{}Hc5vk-{=cX`QaTL
zE}whlmMFceT}?k`TfT*DZng({1<DGXfA0gg9m(3}L_!pks&Ma=(Mk#OkTamBc*onD
zeax#(vZ%85Nt0`DXK#XG$uARPC-z<at0KO4wtg`(Go*~XODY<}vqA}YnQn3%WS|+f
zBBa8o^_83uncz%geXioqTS4>v+rrcLQpXux=yl<%dhqYF4j#DLiiyTA$_}gLxK+YD
z{<WFC_qvWEn<is$&tp9Q`-(Vci<-SG`E#BthBwG~wqa>1!{}hGz03!mgx)LFbq%rx
zCmZH7`$LI#&KLt?#&TQ{8v69FfJ*))oS6nu2~fujDGE8P*=1m*18e;&pRe-OQ$t14
z#R~096WFk6ERmpkV@2!}+5ye-TTsk^i6KKsew8Zz7xG0&rJB02y57Ui!mw`MU~yD5
z@6$~5%CnlQiHv+Tj#+vP+#-zJQ34Ec0@xQj1;;_l2gNbnxB5l3CXBJ7V#u*d4u_$8
z<EYn|`W=lO-j=f!m2!SjN|9Y}jCfMZprpkhE#_jstxi2qY%CkBC^B{K=OA4me6D!l
zmBEZpm!sCLpr{WSrdUNcq_JJr2=?`cG3t_PiPnDHg`UKK^uqJ=&h%0Ve|H=0SKw-|
z+uRISn3E6;X$e?fHtvm)Uj89B*-(FK_GqhyQvq5tjm!Gcl;3oJXUmJuk`+@(eND3d
zGc>bNmW#XSG0c1S_&MRFOC*u`PNp&xoCfjG{xk`OFhXk~5IJP4kqp{zp=<Y+uXjV4
zwd(rG%F&0n1k}m03I#SgF}oj63Z2{8L|NV3n3xrf7{A!W_%hJla{X;e4Glh>F{e^b
zQ=H8v=^)%=EXbpGMi<~x9dRUG)FdPcM9iPw>zke~CcbxEXg7Zn@-4UJ@<gk*{c^IO
zxlNcIlL6sY%X^<1;j-4V3cr&igw+mbaPjqh6mjx*UMGW0?<tqvUwV0^6{A%i*JeFs
z>6vWvu>s_V7nDQ_!jF7}3QnfldflYT3fyc0QNk6$1Bc;9eb9?$7UYu5hE`j`(R>*>
zBFJ|=`<$iuMeD@Q@I~R*pT~Z;hpy;%_XGunP~M<*?(2$_$dc;0_L>JKn|m}9a`aem
z5x<|=M0_upd8jNQd=l=zTq);7MKh%J<W>$g(};Sy!{6t}+rz%&c4bZuSe%#lJ4Za1
z=B^c?aim7+ccANu^XrmG9#UW@_K~r6g0<08-i+k%brVyRxPDcOyUE%1?QJNJMSI!S
zz>i6qD#N%MWhmtCv9Z?4-od|`(U)Z9RJRne(P(}11J2AS@Z^vSq^Bd78sapR^%seW
ztDa`qBi8lherl?Kb?XViNi%T%XgWY{!S9u2kU-bpH)LH69k}|($`vqaW6v)>Zae6|
zgu|6(peF?#Odi&FutNw+K7GSR*I5(_&5KlK$S|jfc~Z@gR*>RkyT|gHU)>?*pODpo
zWK_A8@~FI90soO;lJ|#!%Ra;~e~Po?c6S-^Z9-BMIFF^$5{dtX`53da-=J4?S_MKq
zCoE+u^;~_OEkS2{mP>`cW$d@jiZN^pJ@{Cj?})y?(%rwVm*MQoPIWhRdTwn`|0Oes
zs$8LbgF&6l|78$V-Y&U5<f}b~ddJ<FhV`FJW^s>Zy)AvHT;uFjeVl_c%egy2h?t+H
z?Jso@r^cwE)t~%2VdhN?IT9yz)UB;c!oR=yu7F3VLk&YE9LnNf0|vR@BUPWiGw2#L
zBln)nCCzu%w;g`nQBy#M=#la-IOWvYifiy><7XBpxOUq(2)EQXw-iE>@nI~Ibt%b`
z(}DM4m1BL#3|x~}cPVAJD&WX-X=jYT{f+xHQ?BnQt%oyZ=3!;+XD$yLH4P!+*rCZ{
zn@DX<{pF36Sdj8w1PA=bwzSA+Mg8_?jn%aA0<E^)0xhj(>gp1q$=RdA$IYrAq?hYf
z(6~`e-;Ez1b7}rWMpZq?z2~KLwX=;%@_LMct!>{<_!PU>{HaB}Tb4tomd9ifeYo#1
zn*N!}6d}~+lj_x#?r9n`73{FH)77gRzmYxuR3d`<7Hg~-g~4~%)!Q_fw3cf-sKj!n
zfj;J`G6{<GG3`E{I-$A{gK0~0VkRV-+LO?M=j7d+b)mmC11K`bvkO}<tmLA#i%0nE
z&lh#&j=>U{i`aNy*}(xY$gnS~jIHaD@j@%UobL`%@#o9k6DgafO(6=Oob~YbhhZ+h
z{8#jOu3=YGOY`kTyRh!7Uiz+2i+h7J`Ws6E??*YN{rq^4W0+;>*~n|@k2d<cmf3PN
zv-8ujmybfNC#o!2yDPaY#-Jcl(CF+^NTeAw{wo-6@-bGx;m9hUsR%2;Q#gW+9KtTV
z0lAay6wV*T(<I9<i#^4|n@QwsBKtXszHR{z6H_=C7um(;5HCs^QRET1lBvTBvc7t~
z|4PCdt2O{I$p5OiNf~xM##?F7j=1UloKCA@p7Kxej<o`}lNp#HjNCjN3bW`X+qHxb
zN%!GN&>PXleHQed&f_rNiCiyD|J3$_Cq7HUVboeHjc0@xrAWET$@nt>R*fxiHB!)i
zpz_g73%CfeH+>yYUj?tx9~UGb=1l7}OK6P~&6~xnnwx~f-=1+{v{o@4OmZXu0RxQJ
z3I#;D-Llh+p^SitcQVg99maO$L5B+-*V3kiUFMHzlAy#?)x3Csh~Zxi6$2wg+-zC$
zJhjf)VK6H(`ruMF?xF`#SHMMq>1!eP-YbU<XF**IvvI=huH!`E1JevcjT*!tE5BHE
zkwDmdkCC9@mu+oI&$B!^9cd5Ayn;Q|pkt4uIp!lFk*TSQ0o8l9`yqEtn$%mQCP#l{
zf<2NiLnU<)gYgfqz0AF^MyYD7mHy{7KH2CFHx!%{DQXW16>ZO#D8NjciHR!ak4Xv*
z9lW{}=&p7(D#DT^&Ev4OxjD>lv!PFCdS`Jj7vcD%>-1+5^VNOe`^e7MQQg7Y@sxlY
z@;4M@pz<<MWfQ21y1bgYf|8WHyt=$R+_hoze*zv)9=TwG{(nG8<?P+l0D#mrgjea<
GM*j!BUiOaw

literal 0
HcmV?d00001

diff --git a/lgsm/data/gameicons/sbots-icon.png b/lgsm/data/gameicons/sbots-icon.png
new file mode 100644
index 0000000000000000000000000000000000000000..c897b3ccefbb75a97f8f719fade2b347051ec483
GIT binary patch
literal 2927
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
S^0Wq50YFCsp<Z_%8T~)eMRgtk

literal 0
HcmV?d00001

diff --git a/lgsm/data/gameicons/scpsl-icon.png b/lgsm/data/gameicons/scpsl-icon.png
new file mode 100644
index 0000000000000000000000000000000000000000..2872a78412197e19dbfc9d427bb1ef27f51a2510
GIT binary patch
literal 3090
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

literal 0
HcmV?d00001

diff --git a/lgsm/data/gameicons/scpslsm-icon.png b/lgsm/data/gameicons/scpslsm-icon.png
new file mode 100644
index 0000000000000000000000000000000000000000..2872a78412197e19dbfc9d427bb1ef27f51a2510
GIT binary patch
literal 3090
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

literal 0
HcmV?d00001

diff --git a/lgsm/data/gameicons/sdtd-icon.png b/lgsm/data/gameicons/sdtd-icon.png
new file mode 100644
index 0000000000000000000000000000000000000000..04c8f87f8541442d813edb5f19579a97ba4881d7
GIT binary patch
literal 2010
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

literal 0
HcmV?d00001

diff --git a/lgsm/data/gameicons/sf-icon.png b/lgsm/data/gameicons/sf-icon.png
new file mode 100644
index 0000000000000000000000000000000000000000..8685b4ad5763607075c2091bcb5ae134180092a5
GIT binary patch
literal 1649
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

literal 0
HcmV?d00001

diff --git a/lgsm/data/gameicons/sfc-icon.png b/lgsm/data/gameicons/sfc-icon.png
new file mode 100644
index 0000000000000000000000000000000000000000..5f866bd7742068f641570fe7ab90976ccbfd1d95
GIT binary patch
literal 2165
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

literal 0
HcmV?d00001

diff --git a/lgsm/data/gameicons/sof2-icon.png b/lgsm/data/gameicons/sof2-icon.png
new file mode 100644
index 0000000000000000000000000000000000000000..7da4f30c17d5c5dfe44d1c2afd3ac5dd02916d5d
GIT binary patch
literal 1476
zcmZ9KYgCd47{_1KmSSSd6l&$ANS)RKD`!rpB18l@wek`#@*3VK!As(0atjf$ghbHD
zYpG~Wq}fHynOcTguFJ-9EpMGhW!mhVZKZjs(b=c%Ip=x)=ehj8Jm+5=9!9i-uZIHw
zU`N`Ek2I_6$F#OISA64%0kc>ohfqTRpzW0HQv8aKOXl84Dgb=z4gewv04$hCqA392
zVgO(o0swyv03g$=yCMPrz(NsDIY8*?=_x2E5Pb|`NeO4b0JeMwYPDc<GiWe?G8soA
z5z1sdgMrxF>#dMOxkqSRE<Pm%luBu5E6|2p1eq-D^y$-$jg9T?0xp-@+Nx`4XgGhq
zS*xuQ3WWkbudFQJU{G~-c4{;lsZ=^WJ+0SkdwYAuVzEl4s;a7*o_;wv*h|^BPmrG8
z)zvjWKi|>Oq0{No)6-=#naO1G^72YcOMCe6;mF8HT}AoK%uINAI1z_ys;PPR?wvv*
zXEMojI@r=uKQ=bz>+2g45pn0vo#El(n3xzcnOvq+mXw^#$Z*TZ07pk3mzI_)6pEWS
zZ)Rm>wYIj_*VoJC^8Wt*H*ek?Ja~{!hlxa>NF*pKiV+Iq7z{TCV^d}(IX2cRlS$?t
zrqb4}VZ?39$RHIKCe!KbI2=GC5tOS?L^RUH1(A>tpPI@#lETbLBOFah5eoTa@*W})
z2SH$591VgH#l?cbKD3aR&t|ioot^c1{ldb6(P(6|X>)UPadC0xpVif&B$BwHA+$uo
z0YOlyR4y+s2L}gFPEKO6SRRij77KMcP^Y7*)oOu2P+nes;evW#fGCmh1_nH3GIn!w
zb5KywnKPwBL*MlGJ99Y1#l^)#hYn3lOmMlh@o|z~&z4G4wOXP|m8(`Od3kxPlth(E
zdFqrrK0Z_+K<4M?hlPcSM4U7>9z>%+8VUqa>5#KX$oBN~#Nlup4oAS_3HW?88jV7s
z@OXS)ULF#ObaHaCx3?z}i6jz<MvG;!qV4SL%sz~cjz%D02n2#aAcTa3z+f;J7Z)0h
zW?^9gL6En%_lFN3ijPG7Xg-A<CKK_$<-l|N%+1Oy5|yy>1$_0VHk&W=?>;g+cLxa{
za=>qx3AtLKY=BSPt)Qg%MCOYprl)(>FmaK6{lkOXT|LoTH+e~^$2%pB>MJF>4GrDm
z`m#%Ksl~xvTs!JE_C|VQAm1`{Gt(h!MUyni>$y`!)QE3;_FIG^?A{c7CtU}Qj|B!?
zP3`XHZ{RI2VJX(uJK=D|Pu6y}ryeLuPAEd6SAT}AE7hp0%PK2s)ygyF@^h{pUv3ZT
zJ^TIn&c-Xc?)ppc&=4+_P3MO)_a8ecXM69b<*$_5)X*v8f!AyK@?{5iAL_K}hV}W|
z`!()ig`OH;{s1Lu)r!kW_my>{GrR2@q4ySesK9Y(*s^%HE%GjXL))$Rmy*Qc=stoQ
zoYK8bR9)T@busn_&azZq^_*h4kCt2Is?$80X1C>$M@QJBIj_d99qm}Exa&00>JTx8
zY2)6X;2Zm(56AiWbHQ4rvH#X=K@sA$>hxsJ{DT{_#S~Nz@c3KPRNL=G_AWu$f6D^e
z*KQF$HC-?!->VHgw(!eshd*Q1Qd)wdh3{W==Oy2_TxY~M4*g2^v$aCHCe#E}idl<a
zj4=GZdj0dW%gNgrl{s&5%Lcx2HQeNp&4BrL&)$qb*^+$Ex!sR<4l$+m9(Q==2H%Qs
zxt?t?b&(bQ7EABVzE;kfbUZs-?4jQnm<o%;w7!2;=-~QS)5hw7ovl~7>oqV_ZD+dE
zR7|PZb{z7!%_!<xb*J=o4-nOt&}RQRSbBWvYnkIbEcA&yG#3WgOxTRqTorhk9knHk
z5R;V<pOxs(%uF;3;Dhnmu?>sahV?yw_4VKB<B#$2#$fz0n94sUIR63IX$h>Py#E7O
X|6RWS0^Oc-O=bWf5yJ3#93=h+Owouh

literal 0
HcmV?d00001

diff --git a/lgsm/data/gameicons/sol-icon.png b/lgsm/data/gameicons/sol-icon.png
new file mode 100644
index 0000000000000000000000000000000000000000..e2589b0edcca248152abf5df25e4818ef3433d33
GIT binary patch
literal 2978
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
T0l|Lj3;^`BjL}t^w&DK+&R2Qs

literal 0
HcmV?d00001

diff --git a/lgsm/data/gameicons/squad-icon.png b/lgsm/data/gameicons/squad-icon.png
new file mode 100644
index 0000000000000000000000000000000000000000..adc1464f8bc8e517df0fd2b8f50e44bf0523c6b4
GIT binary patch
literal 2321
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

literal 0
HcmV?d00001

diff --git a/lgsm/data/gameicons/st-icon.png b/lgsm/data/gameicons/st-icon.png
new file mode 100644
index 0000000000000000000000000000000000000000..67ca7ade62ed03f47e5f339664e73d52a7448f80
GIT binary patch
literal 3083
zcmV+m4D|DfP)<h;3K|Lk000e1NJLTq001BW001Be0ssI2{21+{00004XF*Lt006O%
z3;baP0000WV@Og>004R>004l5008;`004mK004C`008P>0026e000+ooVrmw00006
zVoOIv0RI600RN!9r;`8x010qNS#tmY4%h$y4%h()NRg%h000McNliru=L!%J3Lm#W
z;+y~g3i?SzK~zY`1;Gh)ROO)n;D5XOy|d3GnMo!q31A9@eG#Z)h1L!A$<r3wW9{p!
zJ?in<SF0Xv-D{7v7LV0#6dwh|dO&b1>Jx3XpnyV<7zmJcmP|5p=gxNb|K5Hdyl(4_
z1Mwza4)Ri~5@smOg_)>9qXI5yC=&2|9}`C=B8RBQ64#PVkmHz;&_dOc?oDxkMO4Z9
zddTNQSX9kf1d@8)H_U0HQa+ZMB0bSCn_QMi6U^}nlZ>*Lco;Td!6WOIK|>2CIOH;_
zaV}pSpBXLLN{wk;!iHS&{G0{dvfYV1qo@}Wq{lTTeYiM)vFQ`DmUT3FDo^J!9_fg;
zh2wzdye3IeL=SS9C}}FUwHbbmb3gjW;QqtIx$!f>>~P$!v0&Q7a^7-kQfeaB+uA>H
z>t$=MS+f`bwd^l(%8p%|V0^4gV%AoZF<-P3@P+5M2a<twBGQd{yCnu<kv84Yz52T&
z>chW2D4*E78jdvwK`<HDm;eW{YkBR6RSm6R&*UoT!$vQ>Wc@P_et*M!S@xt!miR@L
zRkd+Ur*f)#VTJ%=3aCdGSR)kVgUvzegK+GJ&%gH0Q&0S?`Rsy)$^~)R8<q6YdK9{r
zRRJJGf#rv>-LEuOG-ZEBM@Mom-*NLtSKj^LU+(*M$gPzVf<wJ{wW0daf|4gPqxA(9
zmWM!4QiL=D;`;yk<?PFkp4>q8!QLN~7R?r;pfU`~86n=m$*$!GfRWd&^6^IeGkfDM
zw{%bE`TtM+bIUJoyL9y8-~aq@yHg(vDA=|;Bt|7F@qD4^TMUf%yS5{WD{g;;-T&y|
z_1vc7`cE5ujGhOxUoKy?{^oDA2U=nO(xr(!nF+hcJ{$ky$mm~>{9{^*JvG{UsHNlN
z*4J0O{`0lAd2;)cO$}{Oj(X(+c6h?zHo{hj5DO~8ZO<PtcmC?cMlh#%i&_<(>@l%*
z&a>Md`R~pB63+rpG91A4fVgch>~DLA%Z~kPs+PcCRJ~8L%{}II=hpA(d;PiZEn2+m
zJ4+<snMAXg6!PE<aT4tU+;h%;<?$!>UuoW0+mbUyGdr|=Y46EH&)#$MO5PWNCjkf$
z(lPZ2!#XwalO3N-H+Nj0Ft^ASVXds4-aNDJ#9F-fv4;)}*@2({0cD|!C~9IA4FK=K
z$9CV9I(3v?@If|?W-qQ>)cyXOe@TQD1OVna)1r0V!i)%gm50tNAD){T9?5#0&z%V`
zPWda68gR#ljr23j{Ab!S_r3T>vEs9kl^{XBXBZy4@A#N9wCAeM=o3?4Q@Aqr1F!z+
zSqT74Etk3t-QWZa8DiQdAQ7#ozJKVT9=oJ7Vh1F&ZK8LrTwWRXvsPqht^cx)M(Oar
zw@y#UY{WtqlCgk9ckg>=H`rgD<eGAB%$}LP_b0cuwFJz%#xsl$peP9d06;B?CBR38
z27d3<m>eavbe82%UbBwWTUP}*UUrJA_yOtqL15~ShmTVs*kE*o7=S1$p8C8w2KE#q
z5-h>y&i}n_6~I801G?!t4%H1E0#D+JYt{g)?>hMR>a@|rGg#<!P-scgeXkO*>)N__
z1wiAq@}hYyboTg}f>RS&4guDln6UW#SE0_-u-?*`DO|g$FUXLZX*vL5Mi6+3AP9g5
z0AP68r1G2Ze2@sy8OoZBgssZOhNM6@4?z=O#>o1z7BLkish*#joD854;u(3Un2Y#Y
zqsk!P2NW%8ZNXR}9E$*eo(}=QnDGF1A!`BV>20r#jH`iIlL$46T#FMU(1|i!i3vK?
z<9%fL2r$h87|TvpC?LqOwMjh?K?RQ>P8S&H;`Vk_#|(syWnzSY4}1tR`PtvRwBzv6
zGbO8L_}BnpVzHuW@;+i1O5NE)6^bB&G3EfFzDF4?XJLal$Y+}3wAS!Ni=j5CGLF^6
zRvRLqz#<&Pwg&+4ZS>@y_WkU~FaGHM7jC?4*~<PlSkKsOrNRo3)`253Fd%Rd!_NUs
z92>ZfDPop!Ou=Q5;Lb21w(9U{FI*E?n&5Zs9vt5FQ1Qswshn9NI0qYyfCl>3fpn_p
zYsqs)m{Mn22>E!iP%pVYc7@q85h5@H9gYRA$C@lB+KwnQ6k?y0pxl#mPw-KvItbtj
zx3zETlRb7y`b56GcU!+73FiAQZG_}y%^M#6!_RMuRzH5@cgN3E2a-wyUF1mEka=KQ
zW$MP+3ZpBkWAI|YuV)(W(%yyrer1HPo)C)|qb+@wIlhV?`8?-rjg(j4{=lITI%h1?
zJ(lS{J!yzFF8Z4#^OyOSo6L`n&b{JUwRyfcV}aRtRjB%0yJw_$<}Eb{IWoXrbSg$Q
zy=-oXIj13H)zxUIMVY&1q@Z3EpTI_|7%FD}b$m`VsNTIj_pAS_Z~d;ecEAh9!RhnH
zr(Z;Y_Uqn#Ya%DUGQu^$XMuGAlFP%D>3V1ixzyq|1#;y&BlfltAi1_dT*jsvx%<jx
z4;>J9Qj5xs9o0p5O&(vk@wW%+-3KP?3kGfoN6j|1ngE%!eF{um0HrVA#<T0*9~`g5
zb>3SYDYnb_wF&Gxj>1$nSkt#uTkgATz{WQ8IK1WRO-i77#iI0!gCu?7qcz=QuZ(RL
z${&7HdaI)=m@1tLWp;*7?2v}`PZW)pj4Mwh`txl!1(vVB{)z!%Y5%&e<hsQ9ZNpmG
z=A0_Iulu4lH1h7!JO6OkEw!nS3swT|-u_lg7c;N3?P$ijVdH;jtI8X}n$O2O?uos+
zHpsQa#gn=}o{fA=;$yQ$)~y3PR}O=DUFm^&=@tF+=fv&PdGh#kI|`J&j-Pp6c(eWU
zu6O?SMn?}WPZh_{o`ElK-_z5T;8W>^LAZ72@R3Ju8Tv+}J^!7uE-PH!_I-;=B9Slz
zkg<ZINq|x>8#aQDS<=fkQ23TG$=mT3DRVKhzvpf4(nt61y?yn`T3yc!T^LspF=tGd
zR6M5cN;~hmM%jG#>cjYa_p7TVL@kjJ(i*R$KoJQuA)#&n&TxxDs}tZFtQ>3Y=i{<b
zDuq`urQzg1m%m2>H~e(>y_@TvSEamZq)?@SphRPkYqhizAdFKzy6Y+Brl(i`&HsJV
zOZT@OV{A8*k7AgRAyZdtilKY9M#oGS2o_5+*)Bq&5A+|}(Ykx}0aw2H(Ic-s4ox*{
zRhk-;Eev8qHvan6*Satn5*z~c3LBS!bI0{x{|wE&f6s+g?)eAPQ+-i;qNGh2tcAmd
zTE}jCQF3dJIbdJ-Ve0gq;<?Ij>Ds}*%O7~);FJFYXiWvYud0sTxTsdgi(~M`=U$T2
z$=0@D7X@xG$tA+ARIhmS-LvJ#p5AGEd~i!*x+wznK!}qShkAxZSm+=(ha6bV(1WFv
z_08LVdB+u3EoowPK7(0jR)sU_l;F>nisf@T_`(xUipj7T64SvBiE}-Knc!R$v16`n
zGRoV>hW>i+Q11MhczGhMm3U7;P;Cg!HC`zwsl<Ynw|;B+riEz^5)B1t$?%Oa7I<~r
z&T55P36@4D;JrV+GaR1Rnv%F+gp<QEf|zn1829{CLb7!(U?EO%%2U(oiGowMEC*QK
zoSTl%?TpAUh%JaiwSwjcs5OmX*a3#-x|W`!H7lEE)$$;`=0C4qob2JF5-&7KEDumN
zB8N1ZQgEZ<Ljh5RVH^-egs`Y?BSQpy-61@nF2=s8ThwYmS$3*bSBNq7l3t=tvu;7t
zn$pX~!F=}LH&3ZVn(b3&0000bbVXQnWMOn=I%9HWVRU5xGB7eTEio`HF*Z~&H##sm
zIx{sZFfckWFhpv$^8f$<C3HntbYx+4WjbwdWNBu305UK#Gc7SNEipD!F*iCeIXW{n
ZD=;uRFfcVY4o?68002ovPDHLkV1fsI;}ie@

literal 0
HcmV?d00001

diff --git a/lgsm/data/gameicons/stn-icon.png b/lgsm/data/gameicons/stn-icon.png
new file mode 100644
index 0000000000000000000000000000000000000000..8bb7b1e3add1ee356f74c054eb7b6c05555a32fb
GIT binary patch
literal 1622
zcmV-c2C4apP)<h;3K|Lk000e1NJLTq001BW001Be0ssI2{21+{00004XF*Lt006O%
z3;baP0000WV@Og>004R>004l5008;`004mK004C`008P>0026e000+ooVrmw00006
zVoOIv0RI600RN!9r;`8x010qNS#tmY4%h$y4%h()NRg%h000McNliru=L!%J3Lm#W
z;+y~g1w~0jK~zY`wN}fHT}KsNd)MpSSHDcBn;R(^pcoH~0+z*qArUb11o0pI5ko$J
z852+>BoOK-0VPUg5J9p-J9b}px4Z8>r)obK9CKxP<c`Q5997k+z1FT(CGABI9y~ZX
zIXOK&Wo9BGB6kNce&0NZXdG<QkB^V<-Mfe7aykABA-tAwqj)uUgd(Ela*31@fRxfW
zAfgb$Yh-T{W7f#DMN291h-GFXG7`AEncbAY%(ht~;_feNWoA_!=i@be1N2wVF&<(B
z;Sq7GI5Us?N+~ym9#gi3j!;At$0c`vRhe<|Mg-&I*&>WI?*8&nBV3Fz=lqTJ0gzIP
zF}@UsIfM}Ao`*!B1m|ps>a7?jOr%qi1URF3ku;fb5^l&ShKX~f00eMk1i%BxlkXDN
zS-}yeojH+5&49FG&B20TA)}@57=O(hFrcsqsRO(gi4&wI=>=54nW+W=TeiT)&5GKP
z6_aWa;)v@IktZ=#2V;`qWNSC~#s&aO<BjD&bV+Ri6Z3+`NX&hO%?O=iCD;Mj<dl((
z0K1G<5*!Fsu86p|crh*eBEPKRE*NkNybeBvFI1lpDsVym9*`L43~}q!5_QSrh1buy
zzDJ8EDgQP+U$HJ*_k)HHL<;0F(r<FT${JC<!ia3&(-f4I*Ve?_R~Z{q7VgCdAUPB4
z*mw@@(JslO>#pH8`98^Avp)!)n9kYP(6`B6Xj5^Kt2lx0G7de7@?S8VqFyI>#HFHm
zm?M9v6$nJgR)6OC{lF*CPpH1*Ik`3;j>LZje8KpN@;}@^!}=XhJwoH&!EuASs7UY&
zwvP+W2;URFvkq?so_PS`m%$!N7y`dd^?k!s!!`V4mS+@?!|=>`hwGv7&mF%5ow@(h
zO%XO=_CU;W-xmX~&P?95_=`=Lq3l5dYEU@i95{<O*9eWlaDWYh-BN(CvbLj09u2j+
zePH;EhI4pj%ncD%)YXMAyVVe}hrld*!4J>})IS1$PhbOKwrGqfJ3dT||DEC^#mR&Z
zZMrTM6F6F-?%IQ7{F>@*Z{m}$W1DgRB3jKkswP!kA+F4Ud<}Y9{Lh{KbR!NJ(9~h5
zP7dEQ3*e(>pZYrXyaWZHO8Y42ZpDuY50K7@W{$O$WNtFV@AkL;gY{pz{VkhYKW(sq
z9u9t=NWc=f#R#Te(@?K>OcL@BMNW!6ld=N-#hW{guM{6;K4SYxvy~2wpftBw2d?pK
z_AHA0Xu$0rdq4oLlfTOx#gghoHw%@7*vQv}o{$K4D12Y68rZD^CW!~N&#QmP*oP#-
z^MI-nRAxq8t4}2EVS0ctr-^eQ!O>uM^K>WiCfPcm1wqgPiq7mDNIS)O*ff$uCB)Pl
zE;;>)@QG3O?oepzl6|AZvAD9~Iq)UvoUJ9FDVD9P8+!<Qi~yi8I_J*IW7rIoY`Tk0
z>Cg+G^+|bh1Yj1QYWw{Vf~F4bDf)FlpAyZ}{K|DH+M@!r4!!_(HLf~g$AP9NLYG`Q
zWrgi!kpXX2RD?%Kp*S+wjQrXg;ze*oy=5HCvf>eAY6S-+Ajci%0!+~%W)uXTGEdPl
zrG3yIm=>`xatFlF5eo7G-E2-N<qo9~QUngDP{0BuV3ILKm(i7Pz2Q*KxwZD1%^DYP
z3SDd6PRF8SjB#wp+otdCs=D=eZyuutTNg2Q_?ON_RbSmVa@<s$F=Z@q3;?4oV*JnS
znVGw9tGMY2Mo%>wi%}aMUDwDwUe4Co+>~JJg|_G~mH4*JZ@hp1{?@*aPxk*}--&3n
z@Bam0;3!YJ$hZgq001R)MObuXVRU6WV{&C-bY%cCFfubOF)%GLHdHY;IxsmpGc_wP
zFgh?WL~6G40000bbVXQnWMOn=I&E)cX=Zr<GB7eTEio`HF*Z~&H##smIx{sZFfckW
UFf}(0PXGV_07*qoM6N<$f_-+;JOBUy

literal 0
HcmV?d00001

diff --git a/lgsm/data/gameicons/sven-icon.png b/lgsm/data/gameicons/sven-icon.png
new file mode 100644
index 0000000000000000000000000000000000000000..a46d412615dc34e3ff5054596a579d2673241522
GIT binary patch
literal 2878
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
VfQlN|Kc@k}%;=ioYXg@D{{?a-Q3C(~

literal 0
HcmV?d00001

diff --git a/lgsm/data/gameicons/terraria-icon.png b/lgsm/data/gameicons/terraria-icon.png
new file mode 100644
index 0000000000000000000000000000000000000000..8f0a253e7405d32d4d451958be28571066bab3e0
GIT binary patch
literal 2241
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
JHoHb-{ST!}6LA0l

literal 0
HcmV?d00001

diff --git a/lgsm/data/gameicons/tf2-icon.png b/lgsm/data/gameicons/tf2-icon.png
new file mode 100644
index 0000000000000000000000000000000000000000..3f5474ba967a1f87824644d2bd8f215d3a3ea305
GIT binary patch
literal 2745
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

literal 0
HcmV?d00001

diff --git a/lgsm/data/gameicons/tfc-icon.png b/lgsm/data/gameicons/tfc-icon.png
new file mode 100644
index 0000000000000000000000000000000000000000..f04580e2c3b7158e82b59652f0eb5b53710df0e2
GIT binary patch
literal 2349
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

literal 0
HcmV?d00001

diff --git a/lgsm/data/gameicons/ti-icon.png b/lgsm/data/gameicons/ti-icon.png
new file mode 100644
index 0000000000000000000000000000000000000000..0c6e126dd700138fa7a6edb1122ea0167f961eae
GIT binary patch
literal 2163
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
T>SlIO8vuy@2mIOyF-89cq4l|w

literal 0
HcmV?d00001

diff --git a/lgsm/data/gameicons/ts-icon.png b/lgsm/data/gameicons/ts-icon.png
new file mode 100644
index 0000000000000000000000000000000000000000..271c5bc70b125dfcfd52e8bb7410ca8a6cf685a6
GIT binary patch
literal 2922
zcmZ`*c{J1w7yeNggKU*adYLSl6eeTeGFit`4T&@;j3sNf>=aVQQpVDZNQ^$R%f3b#
zg+aEl3|_K~ZK{cp_0yl<AK$s>-sha>p6A?q?z!il`|O5=5g%9-3;+P1iLpNV2qpeH
zi2W$;LDut+;JB-vxgG#irts|D<M^9&GDe#NK&T7=M8^Wa&Jh*83;=<O0I=c+02)~U
zAmW?dcvI^r!Fk`*NFO--Yj0ZKr5!QczQ(rx0Kg;k*V(?&BKM9+t^gBr1Fj{ofFM}B
zPIoRF0Km2;`g&HzWaW%7{K!ZknH91}VI0`A)Pu1Q$BijAut~h$6}%K5<}#n4kU=G+
z`<LKQ*4w$~XzNQQS;kUQZ)0W5&5|ODOeSaFnihYMTs|*UB6mv4rqh(oCHmF9Mat`4
zVptSoCggWYQ|N)_YDrDM&Tdm%Zba%0A-2bd4q!YQELkE&hRBfs0QyP&9bU$y1M<YC
zOXC*s%7#r3&XJTDE0nFDB`9hlQ009_9S}vxvKL(ChQ`OoYiMec@OU&#nsZ_IV4~)M
zf<tTg)|xE}23TE8&(C*N4fhyHo0$$ATJmo8>mz7x>`weU#vf5qcW5_rXc3R4NpR~c
z%Du~dw7b1&a@#K^Rv;a<P&?_}v&6(;Fd!((U5t!(FSRxu+mrx-<JghLpnH(`^2g7<
zd>M74u@`1CEn^g3;-OaSuU(AE>8bPp8=>9}SQJ8ItGgxTjg-k~xkH=B$VFsA*=n{w
zr2&nC8V?QEu5X<N@MuCIowZ-TJ>--9A#Ggemi^o~4vxLZ9=Qh1$pCFa#UanqruH*g
zCv9JN5U>QSPOd6%{#|*ppC^P9nP56-;Q)&hc!_Q-lZzd2n3DIWplI}qK{AapqHIaq
zMjHj0kGxy#%l_y%N!cySxndo8za>z5d#SZvgvA`~Fv@Gqr4V~f2h7;K8Yh4RbwPmQ
zk(I6WNs-|GaizUEx$=Lu<nMMyr{Oqndc^E4Zg^Gm@Ptr;<`BfO=0GCKvFPlgWsl;S
zk*Zq%pHFzW93ovD9ow1B*lH8lP#^{r1K-l(2Qn_5@kC7BCxH^e|4_=;wDw+ejI@Fz
zIM_B9b+ubqjDtUMc4HAYS9|4=_3;F9iJH0y8kxY@#Z|^nLLd;?li)Zcn=t!bHe@vP
z#Cck8x0S5?jK-EsEUJNRnegUD+e7W7w5+ew4_PgmL0;qFw$RPYv`oYDv!s>VZB`K*
zv*&^5iq>FK5zwBWKi}v*>`@bxuGob};owW$gKjl<B0{#)1M5nT8J!hB$Bbxu|NgyW
zI$YY)((+;9g5gK=vnmG_K9Sh@+o-y!4F*-2RtIqq&lNz{mxZw~!Tj>Jo|@JU4i1OS
z#a@$W6igag(A3m~KB`8gQm0$O*xCazJyi(v$tstgeb&s(;NZWb<*&Y07VPx)=gMmz
z@{|4IFNj{Ew~sfc^=U>f^YKQ`H7w<7{t)LvEzCU&w)han4S?f1UPv0{g#Y@IcH#O7
zets5<m4d@%6`H_G$5t85OiFdX4i7-><uFV&rrn}{8o0omuFtok;^<UrR@rLV>f*x&
zI-QQp8}O)6?1~kD9(Tf_MdSY+9v=Sw-FdP<+aKe!PUhp~oeJ-{11x9hUYHrU+Wq*o
zvS|xW?jUiW?vi5tenj>;Z)d_h)lX~)LBiwULx_oB0i+limX1QBDC&T7^|)aK0X}-W
z^dIfe-&>Sltr5E&k1q1{CU1m@sFq;1d!kC+%NiGCcDbUG1d%8hOd2?@=Lm_%e?yqV
z((!0e9{j7ij|vf2c}mWDZKiFe>eA6l#_IVV?1f;)RDGtyr<vzC(^9-gB3r|L8#R6P
z)MM^(lpM1*wm;jXu|B$9;xb`~kBx@@3zq>wKS6l*Zj1$XQR8?-RJ^Ai{g~AoLQIC>
za5x09@0@0knVH#t`~r7YXWEwz#>Ri;ONWW~6DpW-Z446xPSCy@o8)5aCFDjJU96t1
z!gzPt5Ce|JG!_;X#xJHeFfuX{WL9e3^yugPlLptd8#l{-3X2qFS(J-K%{e&#M*(y2
zO4I}{>rAvD6gHOC-2@Bafp(Cf8R9D`VJH^uVVi-kin3?Wdl>6>n+wP<71+S6TFVXD
zP^C1>)=A<j?MyMDy(dUJ+hk5*+Mg>knuLGKFYcWZBl|pjh77SpaqF49^rZy8u1P_W
zUNUx_%tb=xqP)9j{D*cr6<UXflval+QJ(it4SST@7<{<r7qXQmS61%uYE?EvKd085
z*uO-=6AIl4qoXRxmM9nr@1N&RC|h+W=xkA)tn&nlWKoiE`sLk@KHcyYpMR(gwj#}^
z%nJKVlY=^s3Ez&=@(GFTbB+2nJ0=z6-eS+#*syq6khELN3A|Y)po?jl$ON_Iu+UJo
zrTN=s_fNdh13zb<X!IglQi?KsBZQ<}-(qdP^y}G2eB5XYr89}1gpasNMc#Z_kLyIW
zWNzqDOMuf<h6o@_LKUec_h)PH<?SqYzF)fDrVy8<8fKw<{(_E{Qj^<6Rbr(CLZa{s
z*OREmrS1psgyJSgYrO1WBa4xmZ_(}QWQgmP60aAA`IX^+9u5r%pA|&<Tbu@gJ?p#b
z@!!Zwg`dSVFGRS^dM<2cCXnn>=Md(^J{jOqjuFVcGg^Qhz`<dpC5~(+y6EV3EcWLf
zb_dtJgR!FXGx$@zn;3akMGJ{KHw!*f%944+oA+1K-)|PU4C*QHDz%&{ala!*_7k(q
z-~ikSwYo5no){Sg8$xhH??HB2k8ah<;wPzZ?l*6kM*|Sr@7NvIj09BWMt~br_)w*O
zu9uN=GBYDmX^$5?e{~z8-yzkn*eTLITGgj7M0&i)TikHGS|8f`*=*uDFVZQ!dhIO3
zCU}k}O!IdQwElV#DjZA;XO*t1&^_5I{QI?96&d)xz205FF;>uIl-5ZFJH2a<SFH>Z
zmIQPd7`w$6<io9JF1hxcsMVEWc!f-=bi}dzHcfZys@s&|Z{)T=D|^sJR?$jTo|vVn
zZp)8Xj)cZa*+G#j(sb2)t6P<yrRpuEe@^?MVz5c<H$VpU2^x};lC>H8JDoGn^|epm
z8BCL&^u+eXEi}BM#+~Emm6^>^Z#w+;fI{?%zP3<qZ!x3o^8Hx`m<X{b<~(GQhWK?>
z%+2H<9fa|0Oz1ZpFFk|5^D9*7OfqdmH>I#7iqi4LFza~ce6Ja&ZK$_}-~xj0Jx%w4
zXM`;2yFV$fV$H0Lr4q%upM#XF;VW<(H@oJyGpftb4LqUKtQEXa%=-MAdX*1vBy8LC
zZr-VMx*?OlWkY9kf1<Wr<6O+V8YFln@2#&i&DXW%kG+p;!+cF<V&`sQGJjO_*pHO`
z+N+%(_I~m@t3UM}6xY|*mYNAUu)Nmyc(_VlsoHG~x&D#ieNOals=w7i`r+xP$)v=d
zJ=U0+gz5FY9nU8Lz5`g>JP~SMiJsFz$-|26>T{_Jy`{o^Am)6*>5Inp+XhT7{-H#-
zE)Oe=tBe2lP1WfZ)@Zt{wbD&(Emaley1Q^q$j`ElT$+RKZqw*5(kPLPg@ztKUr5aj
zKS=Ri`z+LAP{lt|9u+|U?J;p^sJxT-pgVMJ5@XxA^J8$$uKY~pCFifywg5Lry2!Lv
z4l2&70Qn-4z7=@5xl$2daiWp+bpKDoDH6R(u(p7!l?bo?>7xL9;fzS=Ff@cbsMA{3
z*%#&)dWr2)j<Fmbc$wPCo)*5`Q)rPocLi-Pb|`)~A|+y0hS%@t@01QOunBO!7vQ4d
z^w8x9fGdhulrF;+FT+)=;Hnym>KaPQa*B!?ii-Lkwaot!c=<THV?+MGKw0&~^&<gb
MVql?PhID-VU;5dUDgXcg

literal 0
HcmV?d00001

diff --git a/lgsm/data/gameicons/ts3-icon.png b/lgsm/data/gameicons/ts3-icon.png
new file mode 100644
index 0000000000000000000000000000000000000000..1a71ba0ca358391aee836d4708e2808a0ad4e340
GIT binary patch
literal 2561
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
Nz|6!NU2o)*^k3_~!o~mq

literal 0
HcmV?d00001

diff --git a/lgsm/data/gameicons/tu-icon.png b/lgsm/data/gameicons/tu-icon.png
new file mode 100644
index 0000000000000000000000000000000000000000..80ea98bab3c11fc1c6c9e5344c6886ee642e4499
GIT binary patch
literal 2389
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
Hu0mjfijhn*

literal 0
HcmV?d00001

diff --git a/lgsm/data/gameicons/tw-icon.png b/lgsm/data/gameicons/tw-icon.png
new file mode 100644
index 0000000000000000000000000000000000000000..cd8ccd809cac1682a4b994c748189e9ae3555d70
GIT binary patch
literal 2644
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
CP4bWc

literal 0
HcmV?d00001

diff --git a/lgsm/data/gameicons/unt-icon.png b/lgsm/data/gameicons/unt-icon.png
new file mode 100644
index 0000000000000000000000000000000000000000..bd8d9491585a62834c4c7f4c1319deb4546030b6
GIT binary patch
literal 1495
zcmZ{kdo<K}7{<RYF)7x#4hc;tq8SO1rLn)!48~>7jLRZT%ugzpTykf&+)qSdkPxAi
zQto3%H<#3)Vdv!J7DBRNjba$=^ymJu=RME+obx>AbKd{n3>T-<vNGy2003Dc0V0cB
z`==1%qAf&ys}z}J0FHzM;OUJ$LfWpMr5}Mz0w7io07fzZ8={Eu1%OB_0AJ4nU|9%&
zYG?_|)k;)IopU%1ft{aI&aSy7N_K}5Ji`IlqwrH=gJX$8Q79cjB;lp!WaN=DS}itH
zC8DF<L<mPA^xP?E&pu8>rZ{^ad&pu1NJ$^aiI$4j(UEWQNq!x6xqdk(T2(`nmU{~I
zx4O2xg7zdIO=#cgcXW5B!`|509WlR;=U<WZJFJi~<h1e4PjO?cE=IW<mFJj=sOU7x
zCvx^Cx8IlyJ<LSo+aoJV=4x+UFyfRH&A)uxB4+hcQXBmhyR>+a75TmKK|x?q^=rt0
zvzMWWGyk5(&=53pHpkZ@wSw+bxWspq)_NrxjJ%s1Fe>SyGLVjla<=O|2N&F}HN+EB
zs1#4A(Bc*<Op%d}Qo=!j-~qwabckt!bfr>VsQ^9@woe;9UVBK~YCn`$R6>M0IjfI>
z9_z9MKq7m+^p{v-k1&HL{vfRB*u&>sW`nLX&F4ztTut$F@_={mEGuWA^K^ks|0k!;
zh>@GWwn^<)F!btnDt)z!6E}grio+a~;38Dp`Xm7qojg5uNgs)fn~1hPT4it$wS4@r
zRiEFe%rdIfF2ztv;`)0u|MFyA5Ic%);TR6<l~bYMGtUr#`OKvmY#+XHt)nT6Idi!D
z^8EDRSa@s3n=hMn3~m&x84MdAWj`ThFlXK@uu7}xvt;eH8tH~|2+3A<fz<p})@su1
zV{>93rA7LDZyo)$BW9y#V*AYO{FYXH63Yw9Y)P!l6_a*X?&nYQ%d9u9HElPA#Ba5Z
z{?pvlKFzN7XxJS3&7(1BXGdw3ozk^6|FZq!+pT%ph<d_8&xF-jS@ldgwK`BCmm}%H
z{eWNan`^5+=wRV3jG=)jW~)YF_t~mTl{SCT_oo)mLrO??)I!G-CVxoqm6S$ey>nEc
z#M<n$NLP_yK*e;m_hAZy!&Sdbt;CisRK91Uax7nHC9QMsN2=@C0mq7bLw3?Kzs$Zk
zyKfI;-i+bQV>P|iJF!~w!h&#3%*6#y9w1@i3V9{&mCCEnw^s%vsue#m*W`Q+GtD9?
zx)sBl$(HMrnCBa^{!gVyf<?@DQqus>Cg89sX)>p|OpZ<_FBJ4WQ`WjQI7W_{D2!*K
zVtE30<xrm+pM5P765CGJ4LBd?6)VzgEBxDAXJ%G-m;`~Xa9}P8pM6^_s3-UH9y)m<
zG^Zh$j-pHC_<QA_EV7R3J$WaZ`7O57708=q>l`&4{XFfvb0*cvTXua~pa_P?`x;Vo
zShrcL(Le5?AL^<;$is0KgW)`Rd0k|No66oAgWqpj$?*@whr*ccuUY6Y%f2$J1h-75
zDmQ9KrGa>_Hd1^TXlW9_TTXhp<h56+c{;Xa;c|ct>sg5{ROEz{smOi4x!l6`J;v|q
zEmA{b1PDY>oolYW4!S5hJTVV{iT~1F>BY$Sg*vsz?>!qIa@!qMkua>XSc-|68nF@d
z|LNGTpW<9IM47!ZJ{$XG(03OCN5yQq+0zgWKk5`S3WOocEA{XQ>s#ChK0gJ2FOyRB
zxu>V6jl=BVDyJpmYq~kFQ@esy(&)w)Y3mbTPJFC~$9;~duGZ5u+B~zl52}lN9PFrb
zk?ayDhovlP=9`V#-KU&|hlCs0CCvic+M2+p#vjjHKbm*D=rdyRM0&`Sly9@OYJ#hM
zgR0C^K&HA+#qm}`nuGUenJX0YL{CmP0`C#wPm7>i`i0R&299BmnHU*kjf~AG#^#n-
q3riEzBUr2@77JZy=Klu>3h@twWBwm7HJ5W10f2~if*#wRz4|Xm9;sgd

literal 0
HcmV?d00001

diff --git a/lgsm/data/gameicons/ut-icon.png b/lgsm/data/gameicons/ut-icon.png
new file mode 100644
index 0000000000000000000000000000000000000000..8c81e418a3ae42c78294ae7f652b44e85c6f070c
GIT binary patch
literal 1134
zcmeAS@N?(olHy`uVBq!ia0vp^3Lwk@BpAX3RW*PVOS+@4BLl<6e(pbstUx|flDE4H
z!~gdFGy8!&&H|6fVg?31We{epSZZGe6l5>)^mS!_&LtqoCBNPN(HsT_=3Y-1#}JFt
zs+aF(UoDkk|M30!=f8FJ{Li;+Zcn?wob$>gxn;)co{KyS7bvk_lxpoT4L>H-Q)Z~u
z-6%LwBq=c@r&F~oFd{>E?Fw%0Wv`PQXRFS#G@F)QJa6vj>K}Hc7hl&`FeY%aD6lp#
zF(_~{ZDwFrNMuZnofCb;_VuiM!>Ol}=Ud1wyVS5}1ItU9$>mq>E?=frueJKntaG!)
z+xtXUPml`}IN-E7{_nX-591HdNfj&7dVeeMuI<6N)F-S<Hg9}c`TqCcVm~kUKvk1x
zw=(~-%`e_IW3qsl`PE<Z?^~-GC+55^jrCDFxuas=^2{sGH;O4t{r2wFe9=me+i^30
zv@^}Ve*WgANAb30cQl<lCW|hQ+smbXeb1IRYXv`5&iS<<`?2iqJK6sCcE|}S?A!Z?
z^<e&My{Yo+j0MbcC0`gcAAf!Q{&vk%76+1b<vCNTw@nw)?Gfg_W4dLU-`q?ezbR(R
zT_z|mR^KXL(X?4W{$IsZz7yM;X5MoW`1H=*oQrL%OxdfOzAP{Q6l-s>uUP&h;ZBqh
z_j9kt^o!PapIBAt9&C1!y;LD*S>DWA<8WEus*JxcbF28tboZ1rg)FIKM%5LQ9sh6Z
zi!_}UTYvb>IsR{o%WOD1w|qFEd7^8k^=*Zey5Bz&oGS~Iy0&s#o=NeobeOp$K(ub#
z3dz7<AvG^#p3dadU9vsy)tyN3P?4M&Z8GuM`TrlT5Vh-eyeGI?Dlp7I(|X4e&B-Uf
zwmnIh(WZ9JbK#>;2VNbhN)36{{r$hTq_|c4`UMLDxm$dtBdk25(n53P3#M+JJn!Z1
z=>H*GLndtf5Ex{frdZUus{7jg;0dzJXJ)FzJ#F23tU=~g(*CVGlTu#qUH@LrE40E%
zcz6Ho`(I`zn5M<fn;&=U+{{%$3$1>9{&Ty#mTkeKrDt<jPv2j!Xjr*ya#n8LzL=e6
zpI@F@I(Pqci8CJj{47%KK~MLdXZTxwz|?N{`J@ji@00|(EIyyzG<EefS-sgg8?DL<
z&+guA?7V%ej{S#j76-0b(*5x-*Lyc5#iu)m)FlR$bSGbWQ&V#|N5zCuWkXWMyHxLM
zKYq3A^_o4KvcdAgHCs*3<{Q-$mh0c{=MkSXXSMLo>2bD~z8?=$-)f@RXnW{PyZ`%#
z6W1?OD4k%E|DNkxeclb$pZ_Z#x17}ad!{ceHrin6vz%8iCYb2VnR-sJ<xESf$-<2q
zxsiu1$Ln)E@7y!}9OrNO8&S8a7wk*g0?ezbC9V-ADTyViR>?)FK#IZ0z{ptF&_LJF
yEX2^<%D~df*i_rVz{<eDC2QMf6b-rgDVb@NxHXuX^Z5fcFnGH9xvX<aXaWEuANYa*

literal 0
HcmV?d00001

diff --git a/lgsm/data/gameicons/ut2k4-icon.png b/lgsm/data/gameicons/ut2k4-icon.png
new file mode 100644
index 0000000000000000000000000000000000000000..3494d31fb2e3f4492d7c8d2206d199000e03420f
GIT binary patch
literal 2814
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
A=>Px#

literal 0
HcmV?d00001

diff --git a/lgsm/data/gameicons/ut3-icon.png b/lgsm/data/gameicons/ut3-icon.png
new file mode 100644
index 0000000000000000000000000000000000000000..1713a35319c5b3e86f8eabad2156cdf8a6f722db
GIT binary patch
literal 2749
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

literal 0
HcmV?d00001

diff --git a/lgsm/data/gameicons/ut99-icon.png b/lgsm/data/gameicons/ut99-icon.png
new file mode 100644
index 0000000000000000000000000000000000000000..5ebe6c09c9ab1b0cb341ed608d253a307c0fd786
GIT binary patch
literal 2797
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

literal 0
HcmV?d00001

diff --git a/lgsm/data/gameicons/vh-icon.png b/lgsm/data/gameicons/vh-icon.png
new file mode 100644
index 0000000000000000000000000000000000000000..e74f2604d93d5538d20f95ca9b2f054e01208f45
GIT binary patch
literal 2598
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
B*Ma~5

literal 0
HcmV?d00001

diff --git a/lgsm/data/gameicons/vints-icon.png b/lgsm/data/gameicons/vints-icon.png
new file mode 100644
index 0000000000000000000000000000000000000000..f6e6748c0387094221caf896ca964908300b5fc3
GIT binary patch
literal 9075
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

literal 0
HcmV?d00001

diff --git a/lgsm/data/gameicons/vpmc-icon.png b/lgsm/data/gameicons/vpmc-icon.png
new file mode 100644
index 0000000000000000000000000000000000000000..95d3e0f8a1d8b046c620f2fa6f3ae9acbafa3485
GIT binary patch
literal 1171
zcmV;E1Z?|>P)<h;3K|Lk000e1NJLTq001BW001Be1^@s6b9#F80004mX+uL$Nkc;*
zaB^>EX>4Tx04R}tkv&MmKpe$iTcuhm9V{rtAwzYti;6gwDi*;)X)CnqU~=gfG-*gu
zTpR`0f`cE6RR<SmT^(EnLGS~_)x}BCMN0f%QfLw5!Ery{-Fw`<1H7#oQ;fbips1#v
zNhXARVO8+IB7hJ^Fo=lA3@w#i%)xbh-NVDzyBN=MKlkStl8XidJOXi?X}U?gK|H%@
zYMl3p!>l68#OK75I$e<Xk?WGfZ=B0EdwFJ9&t>L`!^A?lhov576<r~oA&$z5O8MTr
z!!qYB&PuJpI``x+3>MXuEZ1p{A&DiVkcI#W4OCHsi5RUaDF!mMpK$R<Y=4?u61l2i
z<XAu*3Pjrv{s+IiHA>S{PEs%d^uJiv$2j2M1=>x^`aZU-_6gv72Cmeuzup4oK1pwO
zwdfHL+6FGJyPC8IT<!p)PnxKUw&bJfEtP=xGy0|iFnkLH)|}ot`#607a@5uG4RCM>
zOq3~m-R0c_y}kW=rqkaKiqvwjts>H+00006VoOIv0RI600RN!9r;`8x010qNS#tmY
z4#NNd4#NS*Z>VGd000McNliru=L!%N88m%m@{#}m02y>eSad^gZEa<4bO1wgWnpw>
zWFU8GbZ8()Nlj2!fese{00L`CL_t(o!|j*POVeQ-$6wF)``w&O)HR*+N0TILl}d!x
zU>Cgv5=kl)LV?jiI&?_7btt?=oq~eukU@0te~_etmX_!+RFZydtu|frSNq|2Kb{U&
zC!0d*F8iE6&*%N(c|OnQhv2t4oGliCa7mdN6pCtN2TW$t^Fk=S66x{Hj4c8Pfa<yi
zmsVhY05q{X=1r|d`vM=QJi_5@u?V4z?4tNz2q`nIia@w>AP&$Z5H8_3*c{raH{VK5
zD7g{`5Q=J3$g$-C@&Gvp(6-`aw^?a*H&b0zMY+w6&+p^Ty+KkLxn9dR3akhU3k?4c
zuoBl9x;;Q+;}Hr?Chk8Rq~~lG&I9$>Y-J!fJ{JrI>Fd9-Da57#7dlUJ_^^{glZiKD
z<LHSPmG%lOZ59%V1ZCDe06cj*#QW)4G8u_45Fi*_z+~Kp8|XNFig)9ajE;`->h)W$
zUA=;)X_!@&Xf(>|>Q9D8UJ^^hDYcZM>pCmTtJ{|Yu~-~UQ|a#N!tHi5{QL#Sjy8Z0
z6q(H^ib6?AF-D^iyG<vw5avurI|4yC65-L~XIbN`rR6m@vpJ-baV}jvPo>?)-kNGs
z=`?yW2@<SU3kHLMeYFni_t&wsw9NF(9PxMp@1z&MKR_TjpS>T{9y%ej{!>-udjDm5
z&UKSmTO+CKd=G~B^u@n%Kp?WX#K5h)TWd(00sMjJY;R*B{DV+9!qn_%QmNFx{S`rh
zLEAond@0TY<N<aRKxWeOxe{L=%Z1XLv$0$#y^2J70B;WTy%OnBm&4x@Ma7m0MKc};
lDt2=@{rX{IPULz${{<~a>3)Uebz%Sj002ovPDHLkV1kvD5K;gD

literal 0
HcmV?d00001

diff --git a/lgsm/data/gameicons/vs-icon.png b/lgsm/data/gameicons/vs-icon.png
new file mode 100644
index 0000000000000000000000000000000000000000..0817c14ebf0e891a5033483e283c1251f84ce1e0
GIT binary patch
literal 500
zcmeAS@N?(olHy`uVBq!ia0vp^3LwnF3?v&v(vJfvmUKs7M+SzC{oH>NSwWJ?9znhg
z3{`3j3=J&|48MRv4KElNN(~qoUL`OvSj}Ky5HFasE6@fgArasc;tEpG(D48N{{sgO
zG%z#(c_0x6hNZ~`=0Fx>NswPKgTu2MX&_FLx4R2d8h1?!ki%Z$>Fdh=oJ&BEQ+adk
z*&9HiGoCJvAsXkWPBi2@WWeJZyD;tCdciYGVh$L->UqHA;c>=s>W=?{1sY8%J{4YZ
zZ~n{9&ggvT5L#lrZ%X-brX@@<ragy48V)kN=QhZmVsTYUN50qkQY=eNNq+3LPT|Fq
zEj`Y)b*+<Ua1=Gq_Ix~JcZ2PbK;gBU7O!x<BCu%rJ-)0--fZ$`T}suD6l^&4cJ<i@
zmCSRNA65Mwz`xp)@89iJ3+AyeWPHcIMb&R9V_}ZV;y>Im%vMjU^f&*Nd3wcPh-vzQ
z(~|py1ix)Po$l|?U?9KdTdBu;pubd0Tq8<S5=&C8l8aJ-6oZk0k+H6!fv%xhh@qL4
viHVh|xwe6Um4QL8cK<6B4Y~O#nQ4_+G#EoPa99e1qJY8E)z4*}Q$iB}R-UL>

literal 0
HcmV?d00001

diff --git a/lgsm/data/gameicons/wet-icon.png b/lgsm/data/gameicons/wet-icon.png
new file mode 100644
index 0000000000000000000000000000000000000000..e24d585a91d273974abd56e477a81508f7317c53
GIT binary patch
literal 478
zcmeAS@N?(olHy`uVBq!ia0vp^3LwnF3?v&v(vJfvmUKs7M+SzC{oH>NSwWJ?9znhg
z3{`3j3=J&|48MRv4KElNN(~qoUL`OvSj}Ky5HFasE6@fgAr#;f;tHgJ;J|?c|A7Fg
zxS_#4k>e&%h_NKdFPOpM*^M+1C&}C0g;|it=M#{_UgGKN%Kn^7K#)^;bM4t1K%qUJ
zE{-7@=UXQ>a<&-oxISj<J;<nahhgE}1$qTe-{YTt61H8{9^)VtS2sD{`HTGzA+~2%
zoxB3)%*^=Yba&e`Po>q7Tesa(QeGV?s$dlUfXOc0C+<ebpN!5$o`Sj;57q2gVkW+W
z--AJ+f;lCPG2odh^PVdH3%}>_zh*4k{*NW$DVLk;H_dOiezH{X)zmc}yFbZ#gPM9n
zwccqf1~Iv1D`L$z^mWNE2v1Oc@8CL(c?Kg-s%^OBY46~w8-LkjtL)R}E;F<O`a`wE
zHKHUXu_V<hxhNG#F&G&b8S5Gv=o*@Z7@Ap`m|7W`Y8x0>85sQE{O1XZhTQy=%(O}@
Y8Vn#B?p(_ThA#tyr>mdKI;Vst00iKl7XSbN

literal 0
HcmV?d00001

diff --git a/lgsm/data/gameicons/wf-icon.png b/lgsm/data/gameicons/wf-icon.png
new file mode 100644
index 0000000000000000000000000000000000000000..21b6a98cc48f96ad8298f557b435f145fdb8a68d
GIT binary patch
literal 2494
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
GGxk4du8<M{

literal 0
HcmV?d00001

diff --git a/lgsm/data/gameicons/wmc-icon.png b/lgsm/data/gameicons/wmc-icon.png
new file mode 100644
index 0000000000000000000000000000000000000000..ebdbae8d61faa8c9f364fff26c30eb5b2782b3dc
GIT binary patch
literal 1017
zcmV<V0|xwwP)<h;3K|Lk000e1NJLTq001BW001Be1^@s6b9#F80004mX+uL$Nkc;*
zaB^>EX>4Tx04R}tkv&MmKpe$iTcuhm9V{rtAwzYti;6gwDi*;)X)CnqU~=gfG-*gu
zTpR`0f`cE6RR<SmT^(EnLGS~_)x}BCMN0f%QfLw5!Ery{-Fw`<1H7#oQ;fbips1#v
zNhXARVO8+IB7hJ^Fo=lA3@w#i%)xbh-NVDzyBN=MKlkStl8XidJOXi?X}U?gK|H%@
zYMl3p!>l68#OK75I$e<Xk?WGfZ=B0EdwFJ9&t>L`!^A?lhov576<r~oA&$z5O8MTr
z!!qYB&PuJpI``x+3>MXuEZ1p{A&DiVkcI#W4OCHsi5RUaDF!mMpK$R<Y=4?u61l2i
z<XAu*3Pjrv{s+IiHA>S{PEs%d^uJiv$2j2M1=>x^`aZU-_6gv72Cmeuzup4oK1pwO
zwdfHL+6FGJyPC8IT<!p)PnxKUw&bJfEtP=xGy0|iFnkLH)|}ot`#607a@5uG4RCM>
zOq3~m-R0c_y}kW=rqkaKiqvwjts>H+00006VoOIv0RI600RN!9r;`8x010qNS#tmY
z4#NNd4#NS*Z>VGd000McNliru=L!%N85*Ip|6Kq802y>eSad^gZEa<4bO1wgWnpw>
zWFU8GbZ8()Nlj2!fese{00GfSL_t(o!|j*PYZFlr$3OEDs==^pXqt*YB6zVWAsA?z
z4bs*Ia`PYPEf%FMz4p|TH;+BnlmA3o3axn3Kno2)ieMEZDp;h&Lut$=`#eNc$i)rW
zU4+c(F^~7YA7&o&W`tjs9Gi>@VrlI>6BSC}foZ3GETT#pUHSNC?-W1)uH8yo;R}~G
zfDHavt@Yz<@$>uF6-kaw#zfQ$AH{z|Xzkonf>;5F17rlTBzb${t5-Symp7q;5(f|!
zN+<%h0l@zY&~`LS3-c^3%+q#s&j8_G58f}{W%<zq0P6KRTe~m)i-2iFSzdgIX&RWO
z(ODZ&e*hZI7Hg|3WYXh*N?LlHwbd0G&6f87RyM`l>~xoZZgv_goAMr@SePLmAMWzU
z<HHmSGd@HhpF@dsUnGK+&v_5<ckbQn^$p<Y-G`p``UX%gZ(`eam*2K+%H>Vh0HMnx
z*B`q%uwOmo#?=w7j3$UgE&_0Ja>~~B4o}vfqP4rKC^u6%*LC!~*`kooawpTtd9`-P
z^H&E%hTIp{o&W~F;Q*ko0NQCE2PNKV%SDv}Ys*EIltx#8S^)Yrjjn{gfBVvi8nLPh
n4^081eh#Of-d2w!=<)m~o8FrnKeGt}00000NkvXXu0mjfAGXI+

literal 0
HcmV?d00001

diff --git a/lgsm/data/gameicons/wurm-icon.png b/lgsm/data/gameicons/wurm-icon.png
new file mode 100644
index 0000000000000000000000000000000000000000..248b42618902853cf25f0ed4e370dfe73a133c5f
GIT binary patch
literal 2643
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

literal 0
HcmV?d00001

diff --git a/lgsm/data/gameicons/zmr-icon.png b/lgsm/data/gameicons/zmr-icon.png
new file mode 100644
index 0000000000000000000000000000000000000000..d6c61b1d48f7489e4229153b6356bcfefadbf1a0
GIT binary patch
literal 1696
zcmZXT2~ZPP7{}ip*@PsU-GqVApaY^X<q!jbB!nmuKtTnm2Zv__!K0uQ0y8Kw7_B8*
zsai--w6ql{GorRoR4fz&Efue^QY{olL}NADQG_alvyViXX`A`yd*AzxdEfrtt}Zra
zG07IO0RUuFWcUiWx=#IB7_{LP2ixF+ZwZYK1>n2SIAfa_Q_1AW7103f@&KS<KL8^z
zRPYplY%u`O)Bq?-0T5=Ky!?R@0Q70>vQ-hVAlTksVUs|hc&8vf-zJ!~X{tsbn2!G^
z`!-I~)Ad0#4JCgUfsW08Ybi=jQLq?VsnwBD6qM55-sadwn(}!(=tDa#I0p2kP$X#+
zJbl`k_NODVcUhKDxELO1?W!P%QUvj2vx9j&e*hp;6aXHEu>gRYLJR;G00<R<%n-y5
z!nW4HxU+Q&>tPBC{%mC6oIwJCTp$SH^Ow+cG)*t!^Mm<(Ikfin3;Fyk4yT;KD8sNr
zC|ZEy=`7X~in38EVzH_LSPsB@0C22FivSQ~SOAZgLXy>RRO>-p3==~jH2o2WlZc`Y
z1OWj?()1b}cZbs=h%ZUTQB*#IF$(}UHX8zrrKkfe);<IgF_}4RwiZF=1K>yy5KB6T
zv(oyELb&De){^7~1ew8N1yR%v41<s6!DjDZG6@u&N0Nyo8H^wT1_Ry~guj5MV+jJX
zLJ`Cr9z@eBippiNRFDsjL&zaCoyOr*;rJ;4769OjqVY^-BuUEQ{CxgKF1G?f5&+=C
zEQ+p#jU>5@qKcTza|p5>G6z6~<4f6W1&^1?<(`Gm0Pwb6%`5~7Wio@g+!QXi7D3hn
z06!9VL9-YPe=helj;kR?f(Rr@M*s)}nVg(F*>k`I0j6tK#H<9kXIf3yz<8P`j>!zY
zqochB879)1pXo$_EfW(hfuWt9p;D>QC_;6p+$_fonAiRLUg@LhHC=;)<AYr_(4C4H
zFuB<*M|B5L=T@V0P<OX1LjLo_jKhE7in6{jhR@FP-LFr1j!wNINYc{9;X`M7b`8M|
zQxg>(!F<A|`F6AG_T21*43$ygp{wNAlhp;tB9BzZIB8CfG|rJ1<4b6++-$x6OF0M0
zMYXCHx9WkflO9@J8?;(&kCHxeq*$dl=#Mhmg^mt}VtvWJ)mPiST}=)pUIhb;lGS$u
z>$6{zu9mhoj}(W}Mz4eg7pog8>(4fwt~=xG)B9UR4N<>wrq9OCj_%(n!rmhWZI=aZ
z+p0Cy|K#QRqD)!o!miR*mQ_V}+(W!>e|#zAqI%@h<FSmoRGIeiH)gX$?9{I^WpSR|
zIK`AC<<CyYH=<#)iDdi2JY!45p;0wkAD}V`OHcTfhP9s0FxNg7TP7T0EeuCJ*XMTs
z`iAYVMVGYov6k%THBJd%^)+XX6PNNP+oECQ9#=|R8VAf}eI99Dm+icoZ|V2WbSpQ+
zUpPxvsYi>p!I~U3<3VR)LzZxv@x^?xr76eNd%#uQJAu)beV<erO+$ZRGwn)3@=Q<t
z3bl`(zqw*sE*F2hup<5oW%kI8#6oS>lX>fUI7dVJu0EIpihY|k4I|g?ekhi$`yv0)
zpZA+wbGHbIc-fb4)?R$slOBeLP3m_KxhU~#<rzb2nt$#3?!SlIJLZnR|DbD7IBzdo
z+2rKZxMxFC{@?`{ta0~b-~RJ1;`zhOys_^qU7Ux<+{LWo3T@brNhL2Q9YsV`aUZ|a
zA$*bXShi+PoMmfxTcPf7n4##<;m})aUfJoY2XuC?s*g)NgWLm2k23v<V<-0?ZSIix
z*VSe{e3)5V=P$X_*8&RN8e8x5_YcEY%Uu(ZpxL}hlcGq@Oo0pV7yC=*`ibZINmuzv
x6#;>Y06%ZBSRoeQ{QTF9e>J4<+`KI{_x}x&09%7evOE(ufT)O=@N+7)_8;#_?-l?6

literal 0
HcmV?d00001

diff --git a/lgsm/data/gameicons/zps-icon.png b/lgsm/data/gameicons/zps-icon.png
new file mode 100644
index 0000000000000000000000000000000000000000..e37f37280fe02567579d2cfeec922ea75e689a74
GIT binary patch
literal 2679
zcmV--3W)WIP)<h;3K|Lk000e1NJLTq001BW001Be0ssI2{21+{00004XF*Lt006O%
z3;baP0000WV@Og>004R>004l5008;`004mK004C`008P>0026e000+ooVrmw00006
zVoOIv0RI600RN!9r;`8x00(qQO+^Ri3J?(rAGbf^oB#j`dr3q=R7l5NmFbUMXO+g!
zd6#={-Ktwvx0ZHQb+==8x9!-b?Q9wdAS<y0iVz||1PDlwf{<qU4BwFQ4<I3iK^h4O
z(1?)+M8akkjWPlyF%AJ{+_7U~Y`5KQ_g-D=-QVT#Ar3_I`~i>j=$z;G;K{izB9S(d
zDBu#6F&fY>MPR2!6~MTZ5=DQ1f0RyK>6DR?vA~GAGB?TsmC9Za1baKXjIoj^DWx1y
zA|fI*#_(29K?atH0eHxP$XWw}$3_!pX^|Uk#-ouos!&R6t+WErsWNe1I35QEMNtSL
zW_!ITiY$TaIBAv>fam#HmI=dv5G;aVXb=F%Sc}Fer3!-#a2icaRup6%$(evcnc1Ur
zgouchYLMson^$h=(SDxiVHghg$CEe;>us&|IGUC#fiMV&KnNCq0Eox{G15xqqclyF
z0RRV?17M8N1W$kJ$+I6m+ibN;rE;}e?e_=IfA#q*D>nv7L<SI12xmH-3P(Dgo2h~k
zf<Yj>m&1S|u$IX4ymGmW00M!?&h|Q|-*fUKPd;|;?3qU%T4q**&iA(N3Zid)^IzNT
zpzI5!lw0zo<0zvokaQdr$N&K0Z4vxUNMv=9rvP9G=I46d?t%M{9XWO4go&dP11yT!
zRy!V!i#Qq&hUXr8JdU;R`<~~;aa;@QzVAoz#P=NDs#Q1u7?J=UaMT)%VL}qe{ZWJn
zkG}8WPkrK(^K-qyV6eS;=hV@q!`<HMTQ^?(;R~zRZVvW_kDYn^;KBQDudS}H-*LT?
zHi`i<M6gyBIqw7kLqJOczy;2XA!C_fQBh>NK!kt!=YM?k(f797%|HC<4^|gP58juK
zqHq8Ex364&bF@F6MoG2SsD_Ql&pvVfSHCC<RSg1;Xq76tjv(T_po(OXNLZ2<Kx;%q
z&K1EZ&Mm-`Pk!j?<tyL)&Uc2B@z%yxktDZou3f*es&e!7Z+^?KRA2k!>jxJXl`&qa
z^y(`YU00YacYtwYUB-pOI1yMRiCkJBWR@%<LqyL7;$mfG<<;N*W;7Zpu+4gXr$2h`
z*)MeOTm0p(e>I5`LOi^9WMN@pFdi*0pX35KgEUJ#*RPg?G)ee;t%?8uBmgBK8Ug~8
zJR|E@gRD^N>+4yPJ^So4$By6s@~gi;dFs>$&pz><2T$k5eDC}JvHZa4(+@phtQn4n
zzF%5jyHzA<)$@xeuDEW+ad{^w6Bx3VA&9q&0EB{*<4n?+OD9d!BFnz~<*z8K|NEtv
zKl99I+nobRoP6ksbBha$lkw0LMd16ZH~!+6+~t!e=DR&KW@G)X$E8+EC~E*L5g{_e
z5Ybu$M2O?qFZ+ssG)c$%(sN%#hcz4JEX$Axfd<=KomzF}!p3iZem-n9fwMzL7Mtz%
zv8AO`M~^SeAO6V;FES>0EAR=45Rj1rjK~5ZaG?d8W*IWUk%hI|;X{XvrD!_7eEIUu
z-HmIPR#skn{p6vA^|#)dsRX0lotOUScOIu!vk?Tr^_#07ed?(ffATXFT-<wFOB}%>
z0z)ET426)wXk&~(ws2^1ufJ3FN-h^doBw;|)y3J_<%Oj?m)_7j{Wq_?L7Y7>+xE5j
z?8l#WYSk!LD{o%Sh&;~~mN5oo(O6`b2#JWm0;Opt97g~f_V=${yEYmQwJ~9%=1X~N
zuyOtRZHkIsvt1NfHW}5c6=`V3b9kP+O#IjRpZ@0yKjxmJ$l}6$7r-)WT*Ls8X-fvs
zl`-1XSVA@)PC~yj8H@^}Tt^~UFfbF&oH=u5ufKWe;w$(0_)nkz%)`s4S2wrTQhV;x
zpF8)|)3>&^dWYvM7)JPa0s%362S{3LDW%b5j0wZAHPhydE2S(@xmLf^@BirhFVDaH
zit_kJpZ-`BjdVJpEPw6d1(mDi<x}le8vwE_`@181hkA@G5`ZOZEdX#KgyS??&6&=D
zN;Lq)?ZG|=J}st4mzGYQe()dO|AEWbu7B+t|K|99*l3NXlWw=mq|jQID<yW%n(on*
z5g-90kX#g5CLLa>RN^=W#tzK(+TBi+n}vgO)p~7qW^QM1@8<0_!-Qr6q_^_tYyHs}
z1z$X}1OQy1)|xS}?+_aPmIeVhAQEt7Qm{17rg4<(TzaxvkwuYdT?_^TDP^3bul?_(
zt>NgzBairvW|S49@ieH_kWtBT8N9s*Wa0nI8e?2n8e^1FobxD6?rv|6<7u<qN|Gea
zGeZ=o`TW5{Klt&_{<5|+&UNR|0tgwUNxc!4d>;u&8-eednRg%j?QWALLLi1fn5u#o
ze6YRSs)f>(mUz22Q*SjY4&3aI?(Xg5<*R<RwtVV=TYEcu{oPtnsn==(0FW4gAw&SM
z2!KGqfU}~|C><%KQcAc^;D&-(004%ra2a=R-MV#a^?Fzm(s#Coli)zootqm^C&G1F
zGc%x77AH({hcQM(ObCOJ8(mnk9JMvTkW0aZV+lCt<#JgQwA$@y91q7M;P-;=>`!)v
z#m;!jyz;RV$M0-zD5Ga*XZQE_B^NABQ)9ue1aX>ZB)?iQ402<*>ltKGoLXzE)oQMF
zzu&h89(?$rPNx^A>0~kyj9Wv>f?x9#;v`NArFM6>*Vk{a-(7QrNRoulcREE;Xt35=
z-}6S32@v|#V3@?*alCTbYHN)-(CgM4js9St0Ty{a9FEf@0U+0Nn1Dv3&KYw(&uHTX
zmDew?T)1$-<>J`VF_ESza;}UKj*t}}vZN8V_J*TMy<S+V*BfQu2V;HT?@!0W;b?DT
z_du)Rx=x<vU~Q%3lklbI1f?<xzOlW<%HG9`7m~zOB_2M!$PYBzg;BtnSN7Y@mhbz=
zj-RO1s)n;543V)SS7<SgleLYF!TtyURGwO6r4-B(kuhMbHCd8YeBWAg<?7YjTbrEY
ze0OfP)8nmLok@B0__1cQQK^)t@pLkoX2vqt6VholXJ)%SqwI|vH#c@Rh2XyDDXpd8
zW#1QM$yk(}2_}&@!!U}XOK)6@3T??!VYWASSe)gZPNyD*{qb;`C6#&zlA|NWaRi(Z
z!rGmUt5>g%$75HxN*S#+05HY?fFmO^)>><A7>4C?d9b&O0EoaC7P%e_Mtr8(3c}i*
zjXSHiZw8ehN#a3&e;h@GNQm2;yPJ16Tp^{Dz*#*Ed)<!XO5ZEhYeB0XI*#C;Qx9wR
zFCCei?d)#v6eh)zKqk7aE=T@X{?1cMbAx?v0000bbVXQnWMOn=I%9HWVRU5xGB7eT
zEio`HF*Z~&H##smIx{sZFfckWFhpv$^8f$<C3HntbYx+4WjbwdWNBu305UK#Gc7SN
lEipD!F*iCeIXW{nD=;uRFfcVY4o?68002ovPDHLkV1jJW`XK-S

literal 0
HcmV?d00001

diff --git a/lgsm/modules/alert.sh b/lgsm/modules/alert.sh
index b8b668ef4..785c7ae20 100644
--- a/lgsm/modules/alert.sh
+++ b/lgsm/modules/alert.sh
@@ -28,95 +28,203 @@ fn_alert_log() {
 }
 
 fn_alert_test() {
-	fn_script_log_info "Sending test alert"
-	alertsubject="Alert - ${selfname} - Test"
+	fn_script_log_info "Sending alert: Testing LinuxGSM Alert. No action to be taken"
+	alertaction="Tested"
 	alertemoji="🚧"
 	alertsound="1"
-	alerturl="not enabled"
-	alertbody="Testing LinuxGSM Alert. No action to be taken."
+	alertmessage="Testing ${selfname} LinuxGSM Alert. No action to be taken."
+	# Green
+	alertcolourhex="#cdcd00"
+	alertcolourdec="13487360"
 }
 
-fn_alert_restart() {
-	fn_script_log_info "Sending alert: Restarted: ${executable} not running"
-	alertsubject="Alert - ${selfname} - Restarted"
+# Running command manually
+fn_alert_stopped() {
+	fn_script_log_info "Sending alert: ${selfname} has stopped"
+	alertaction="Stopped"
+	alertemoji="❌"
+	alertsound="1"
+	alertmessage="${selfname} has been stopped."
+	# Red
+	alertcolourhex="#cd0000"
+	alertcolourdec="13434880"
+}
+
+fn_alert_started() {
+	fn_script_log_info "Sending alert: ${selfname} has started"
+	alertaction="Started"
+	alertemoji="✔️"
+	alertsound="1"
+	alertmessage="${selfname} has been started."
+	# Green
+	alertcolourhex="#00cd00"
+	alertcolourdec="52480"
+}
+
+fn_alert_restarted() {
+	fn_script_log_info "Sending alert: ${selfname} has restarted"
+	alertaction="Restarted"
+	alertemoji="🗘"
+	alertsound="1"
+	alertmessage="${selfname} has been restarted."
+	# Green
+	alertcolourhex="#00cd00"
+	alertcolourdec="52480"
+}
+
+# Failed monitor checks
+fn_alert_monitor_session() {
+	fn_script_log_info "Sending alert: ${selfname} is not running. Game server has been restarted"
+	alertaction="Restarted"
 	alertemoji="🚨"
 	alertsound="2"
-	alerturl="not enabled"
-	alertbody="${selfname} ${executable} not running"
+	alertmessage="${selfname} is not running. Game server has been restarted."
+	# Red
+	alertcolourhex="#cd0000"
+	alertcolourdec="13434880"
 }
 
-fn_alert_restart_query() {
-	fn_script_log_info "Sending alert: Restarted: ${selfname}"
-	alertsubject="Alert - ${selfname} - Restarted"
+fn_alert_monitor_query() {
+	fn_script_log_info "Sending alert: Unable to query ${selfname}. Game server has been restarted"
+	alertaction="Restarted"
 	alertemoji="🚨"
 	alertsound="2"
-	alerturl="not enabled"
-	alertbody="Unable to query: ${selfname}"
+	alertmessage="Unable to query ${selfname}. Game server has been restarted."
+	# Red
+	alertcolourhex="#cd0000"
+	alertcolourdec="13434880"
 }
 
+# Update alerts
 fn_alert_update() {
-	fn_script_log_info "Sending alert: Updated"
-	alertsubject="Alert - ${selfname} - Updated"
-	alertemoji="🎮"
+	fn_script_log_info "Sending alert: ${selfname} has received a game server update: ${localbuild}"
+	alertaction="Updated"
+	alertemoji="🎉"
 	alertsound="1"
-	alerturl="not enabled"
-	alertbody="${gamename} received update: ${remotebuildversion}"
+	alertmessage="${selfname} has received a game server update: ${localbuild}."
+	# Green
+	alertcolourhex="#00cd00"
+	alertcolourdec="52480"
 }
 
 fn_alert_check_update() {
-	fn_script_log_info "Sending alert: Update available"
-	alertsubject="Alert - ${selfname} - Update available"
-	alertemoji="🎮"
+	fn_script_log_info "Sending alert: ${gamename} update available: ${remotebuildversion}"
+	alertaction="Checked for Update"
+	alertemoji="🎉"
+	alertsound="1"
+	alertmessage="${gamename} update available: ${remotebuildversion}"
+	# Blue
+	alertcolourhex="#1e90ff"
+	alertcolourdec="2003199"
+}
+
+fn_alert_update_linuxgsm() {
+	fn_script_log_info "Sending alert: ${selfname} has received an LinuxGSM update"
+	alertaction="Updated"
+	alertemoji="🎉"
 	alertsound="1"
-	alerturl="not enabled"
-	alertbody="${gamename} update available: ${remotebuildversion}"
+	alertbody="${gamename} update available"
+	alertmessage="${selfname} has received an LinuxGSM update and been restarted."
+	# Green
+	alertcolourhex="#00cd00"
+	alertcolourdec="52480"
 }
 
-fn_alert_update_restart() {
-	fn_script_log_info "Sending alert: Restarted"
-	alertsubject="Alert - ${selfname} - Restarted"
-	alertemoji="🎮"
+fn_alert_backup() {
+	fn_script_log_info "Sending alert: ${selfname} has been backed up"
+	alertaction="Backed Up"
+	alertemoji="📂"
 	alertsound="1"
-	alerturl="not enabled"
-	alertbody="${gamename} received update: ${remotebuildversion} and required restarting"
+	alertmessage="${selfname} has been backed up."
+	# Green
+	alertcolourhex="#00cd00"
+	alertcolourdec="52480"
 }
 
 fn_alert_permissions() {
-	fn_script_log_info "Sending alert: Permissions error"
-	alertsubject="Alert - ${selfname}: Permissions error"
+	fn_script_log_info "Sending alert: ${selfname} has permissions issues"
+	alertaction="Checked Permissions"
 	alertemoji="❗"
 	alertsound="2"
-	alerturl="not enabled"
-	alertbody="${selfname} has permissions issues"
+	alertmessage="${selfname} has permissions issues."
+	# Red
+	alertcolourhex="#cd0000"
+	alertcolourdec="13434880"
 }
 
 fn_alert_config() {
-	fn_script_log_info "Sending alert: New _default.cfg"
-	alertsubject="Alert - ${selfname} - New _default.cfg"
-	alertemoji="🎮"
+	fn_script_log_info "Sending alert: ${selfname} has received a new _default.cfg"
+	alertaction="Updated _default.cfg"
+	alertemoji="🎉"
+	alertsound="1"
+	alertmessage="${selfname} has received a new _default.cfg."
+	# Blue
+	alertcolourhex="#1e90ff"
+	alertcolourdec="2003199"
+}
+
+fn_alert_wipe() {
+	fn_script_log_info "Sending alert: ${selfname} has been wiped"
+	alertaction="Wiped"
+	alertemoji="🧹"
 	alertsound="1"
-	alerturl="not enabled"
-	alertbody="${selfname} has received a new _default.cfg. Check file for changes."
+	alertmessage="${selfname} has been wiped."
+	# Green
+	alertcolourhex="#00cd00"
+	alertcolourdec="52480"
 }
 
+fn_alert_info() {
+	fn_script_log_info "Sending alert: ${selfname} info"
+	alerttitle="LinuxGSM Alert - ${selfname} - Info"
+	alertaction="Queried"
+	alertemoji="📄"
+	alertsound="1"
+	alertmessage="${selfname} info."
+	# Blue
+	alertcolourhex="#1e90ff"
+	alertcolourdec="2003199"
+}
+
+# Images
+alerticon="https://raw.githubusercontent.com/${githubuser}/${githubrepo}/${githubbranch}/lgsm/data/gameicons/${shortname}-icon.png"
+
 if [ "${alert}" == "permissions" ]; then
 	fn_alert_permissions
-elif [ "${alert}" == "restart" ]; then
-	fn_alert_restart
-elif [ "${alert}" == "restartquery" ]; then
-	fn_alert_restart_query
+elif [ "${alert}" == "monitor-session" ]; then
+	fn_alert_monitor_session
+elif [ "${alert}" == "monitor-query" ]; then
+	fn_alert_monitor_query
 elif [ "${alert}" == "test" ]; then
 	fn_alert_test
 elif [ "${alert}" == "update" ]; then
 	fn_alert_update
 elif [ "${alert}" == "check-update" ]; then
 	fn_alert_check_update
-elif [ "${alert}" == "update-restart" ]; then
-	fn_alert_update_restart
 elif [ "${alert}" == "config" ]; then
 	fn_alert_config
+elif [ "${alert}" == "wipe" ]; then
+	fn_alert_wipe
+elif [ "${alert}" == "info" ]; then
+	fn_alert_info
+elif [ "${alert}" == "started" ]; then
+	fn_alert_started
+elif [ "${alert}" == "stopped" ]; then
+	fn_alert_stopped
+elif [ "${alert}" == "restarted" ]; then
+	fn_alert_restarted
+elif [ "${alert}" == "update-linuxgsm" ]; then
+	fn_alert_update_linuxgsm
+elif [ "${alert}" == "backup" ]; then
+	fn_alert_backup
+else
+	fn_print_fail_nl "Missing alert type"
+	fn_script_log_fatal "Missing alert type"
+	core_exit.sh
 fi
 
+alerttitle="${alertemoji} ${alertaction} - ${servername} ${alertemoji}"
+
 # Generate alert log.
 fn_alert_log
 
@@ -220,7 +328,7 @@ if [ "${rocketchatalert}" == "on" ] && [ -n "${rocketchatalert}" ]; then
 elif [ "${rocketchatalert}" != "on" ] && [ "${commandname}" == "TEST-ALERT" ]; then
 	fn_print_warn_nl "Rocketchat alerts not enabled"
 	fn_script_log_warn "Rocketchat alerts not enabled"
-elif [ -z "${rocketchattoken}" ] && [ "${commandname}" == "TEST-ALERT" ]; then
+elif [ -z "${rocketchatwebhook}" ] && [ "${commandname}" == "TEST-ALERT" ]; then
 	fn_print_error_nl "Rocketchat token not set"
 	#echo -e "* https://docs.linuxgsm.com/alerts/slack"
 	fn_script_error "Rocketchat token not set"
diff --git a/lgsm/modules/alert_discord.sh b/lgsm/modules/alert_discord.sh
index f3a79416a..54cf8a348 100644
--- a/lgsm/modules/alert_discord.sh
+++ b/lgsm/modules/alert_discord.sh
@@ -7,47 +7,141 @@
 
 moduleselfname="$(basename "$(readlink -f "${BASH_SOURCE[0]}")")"
 
-json=$(
+jsoninfo=$(
 	cat << EOF
 {
-	"username":"LinuxGSM",
-	"avatar_url":"https://raw.githubusercontent.com/${githubuser}/${githubrepo}/${githubbranch}/lgsm/data/alert_discord_logo.jpg",
-	"file":"content",
-	"embeds": [{
-		"color": "2067276",
-		"author": {
-			"name": "${alertemoji} ${alertsubject} ${alertemoji}",
-			"icon_url": "https://raw.githubusercontent.com/${githubuser}/${githubrepo}/${githubbranch}/lgsm/data/alert_discord_logo.jpg"
-		},
-		"title": "${servername}",
-		"description": "${alertbody} \n More info: ${alerturl}",
-		"url": "",
-		"type": "content",
-		"thumbnail": {},
-		"fields": [
-			{
-				"name": "Game",
-				"value": "${gamename}",
-				"inline": true
-			},
-			{
-				"name": "Server IP",
-				"value": "[${alertip}:${port}](https://www.gametracker.com/server_info/${alertip}:${port})",
-				"inline": true
-			},
-			{
-				"name": "Hostname",
-				"value": "${HOSTNAME}",
-				"inline": true
-			}
-		]
-	}]
+    "username": "LinuxGSM",
+    "avatar_url": "https://raw.githubusercontent.com/${githubuser}/${githubrepo}/${githubbranch}/lgsm/data/alert_discord_logo.jpg",
+    "file": "content",
+    "embeds": [
+        {
+            "author": {
+                "name": "LinuxGSM Alert",
+                "url": "",
+                "icon_url": "https://raw.githubusercontent.com/${githubuser}/${githubrepo}/${githubbranch}/lgsm/data/alert_discord_logo.jpg"
+            },
+            "title": "${alerttitle}",
+            "url": "",
+            "description": "",
+            "color": "${alertcolourdec}",
+            "type": "content",
+            "thumbnail": {
+                "url": "${alerticon}"
+            },
+            "fields": [
+				{
+					"name": "Server Name",
+					"value": "${servername}"
+				},
+				{
+					"name": "Information",
+					"value": "${alertmessage}"
+				},
+                {
+                    "name": "Game",
+                    "value": "${gamename}",
+                    "inline": true
+                },
+                {
+                    "name": "Server IP",
+                    "value": "\`${alertip}:${port}\`",
+                    "inline": true
+                },
+                {
+                    "name": "Hostname",
+                    "value": "${HOSTNAME}",
+                    "inline": true
+                },
+				{
+					"name": "More info",
+					"value": "${alerturl}",
+					"inline": true
+				},
+                {
+                    "name": "Server Time",
+                    "value": "$(date)",
+                    "inline": true
+                }
+            ],
+            "footer": {
+				"icon_url": "https://raw.githubusercontent.com/${githubuser}/${githubrepo}/${githubbranch}/lgsm/data/alert_discord_logo.jpg",
+                "text": "Sent by LinuxGSM ${version}"
+            }
+        }
+    ]
+}
+EOF
+)
+
+jsonnoinfo=$(
+	cat << EOF
+{
+    "username": "LinuxGSM",
+    "avatar_url": "https://raw.githubusercontent.com/${githubuser}/${githubrepo}/${githubbranch}/lgsm/data/alert_discord_logo.jpg",
+    "file": "content",
+    "embeds": [
+        {
+            "author": {
+                "name": "LinuxGSM Alert",
+                "url": "",
+                "icon_url": "https://raw.githubusercontent.com/${githubuser}/${githubrepo}/${githubbranch}/lgsm/data/alert_discord_logo.jpg"
+            },
+            "title": "${alerttitle}",
+            "url": "",
+            "description": "",
+            "color": "${alertcolourdec}",
+            "type": "content",
+            "thumbnail": {
+                "url": "${alerticon}"
+            },
+            "fields": [
+				{
+					"name": "Server Name",
+					"value": "${servername}"
+				},
+				{
+					"name": "Information",
+					"value": "${alertmessage}"
+				},
+                {
+                    "name": "Game",
+                    "value": "${gamename}",
+                    "inline": true
+                },
+                {
+                    "name": "Server IP",
+                    "value": "\`${alertip}:${port}\`",
+                    "inline": true
+                },
+                {
+                    "name": "Hostname",
+                    "value": "${HOSTNAME}",
+                    "inline": true
+                },
+                {
+                    "name": "Server Time",
+                    "value": "$(date)",
+                    "inline": true
+                }
+            ],
+            "footer": {
+				"icon_url": "https://raw.githubusercontent.com/${githubuser}/${githubrepo}/${githubbranch}/lgsm/data/alert_discord_logo.jpg",
+                "text": "Sent by LinuxGSM ${version}"
+            }
+        }
+    ]
 }
 EOF
 )
 
 fn_print_dots "Sending Discord alert"
 
+if [ -z "${alerturl}" ]; then
+	json="${jsonnoinfo}"
+else
+	json="${jsoninfo}"
+fi
+
 discordsend=$(curl --connect-timeout 10 -sSL -H "Content-Type: application/json" -X POST -d "$(echo -n "${json}" | jq -c .)" "${discordwebhook}")
 
 if [ -n "${discordsend}" ]; then
diff --git a/lgsm/modules/alert_email.sh b/lgsm/modules/alert_email.sh
index 0aca09fef..6833d9670 100644
--- a/lgsm/modules/alert_email.sh
+++ b/lgsm/modules/alert_email.sh
@@ -10,9 +10,9 @@ moduleselfname="$(basename "$(readlink -f "${BASH_SOURCE[0]}")")"
 fn_print_dots "Sending Email alert: ${email}"
 
 if [ -n "${emailfrom}" ]; then
-	mail -s "${alertsubject}" -r "${emailfrom}" "${email}" < "${alertlog}"
+	mail -s "${alerttitle}" -r "${emailfrom}" "${email}" < "${alertlog}"
 else
-	mail -s "${alertsubject}" "${email}" < "${alertlog}"
+	mail -s "${alerttitle}" "${email}" < "${alertlog}"
 fi
 exitcode=$?
 if [ "${exitcode}" == "0" ]; then
diff --git a/lgsm/modules/alert_gotify.sh b/lgsm/modules/alert_gotify.sh
index 27e4d3439..2ab6e9eb7 100644
--- a/lgsm/modules/alert_gotify.sh
+++ b/lgsm/modules/alert_gotify.sh
@@ -7,18 +7,33 @@
 
 module_selfname="$(basename "$(readlink -f "${BASH_SOURCE[0]}")")"
 
-json=$(
+jsoninfo=$(
 	cat << EOF
 {
-	"title": "${alertemoji} ${alertsubject} ${alertemoji}",
-	"message": "Server name\n${servername}\n\nMessage\n${alertbody}\n\nGame\n${gamename}\n\nServer IP\n${alertip}:${port}\n\nHostname\n${HOSTNAME}\n\nMore info\n${alerturl}",
+	"title": "${alerttitle}",
+	"message": "Server Name\n${servername}\n\nInformation\n${alertmessage}\n\nGame\n${gamename}\n\nServer IP\n${alertip}:${port}\n\nHostname\n${HOSTNAME}\n\nMore info\n${alerturl}\n\nServer Time\n$(date)",
 	"priority": 5
 }
 EOF
 )
 
-fn_print_dots "Sending Gotify alert"
+jsonnoinfo=$(
+	cat << EOF
+{
+	"title": "${alerttitle}",
+	"message": "Server Name\n${servername}\n\nInformation\n${alertmessage}\n\nGame\n${gamename}\n\nServer IP\n${alertip}:${port}\n\nHostname\n${HOSTNAME}\n\nServer Time\n$(date)",
+	"priority": 5
+}
+EOF
+)
 
+if [ -z "${alerturl}" ]; then
+	json="${jsonnoinfo}"
+else
+	json="${jsoninfo}"
+fi
+
+fn_print_dots "Sending Gotify alert"
 gotifysend=$(curl --connect-timeout 10 -sSL "${gotifywebhook}/message"?token="${gotifytoken}" -H "Content-Type: application/json" -X POST -d "$(echo -n "${json}" | jq -c .)")
 
 if [ -n "${gotifysend}" ]; then
diff --git a/lgsm/modules/alert_ifttt.sh b/lgsm/modules/alert_ifttt.sh
index c1ccfc9cb..77932569b 100644
--- a/lgsm/modules/alert_ifttt.sh
+++ b/lgsm/modules/alert_ifttt.sh
@@ -7,16 +7,32 @@
 
 moduleselfname="$(basename "$(readlink -f "${BASH_SOURCE[0]}")")"
 
-json=$(
+jsoninfo=$(
 	cat << EOF
 {
 	"value1": "${selfname}",
-	"value2": "${alertemoji} ${alertsubject} ${alertemoji}",
-	"value3": "Message: \n${alertbody}\n\nGame: \n${gamename}\n\nServer name: \n${servername}\n\nHostname: \n${HOSTNAME}\n\nServer IP: \n${alertip}:${port}\n\nMore info: \n${alerturl}"
+	"value2": "${alerttitle}",
+	"value3": "Server Name\n${servername}\n\nInformation\n${alertmessage}\n\nGame\n${gamename}\n\nServer IP\n${alertip}:${port}\n\nHostname\n${HOSTNAME}\n\nMore info\n${alerturl}\n\nServer Time\n$(date)"
 }
 EOF
 )
 
+jsonnoinfo=$(
+	cat << EOF
+{
+	"value1": "${selfname}",
+	"value2": "${alerttitle}",
+	"value3": "Server Name\n${servername}\n\nInformation\n${alertmessage}\n\nGame\n${gamename}\n\nServer IP\n${alertip}:${port}\n\nHostname\n${HOSTNAME}\n\nServer Time\n$(date)"
+}
+EOF
+)
+
+if [ -z "${alerturl}" ]; then
+	json="${jsonnoinfo}"
+else
+	json="${jsoninfo}"
+fi
+
 fn_print_dots "Sending IFTTT alert"
 iftttsend=$(curl --connect-timeout 10 -sSL -H "Content-Type: application/json" -X POST -d "$(echo -n "${json}" | jq -c .)" "https://maker.ifttt.com/trigger/${iftttevent}/with/key/${ifttttoken}" | grep "Bad Request")
 
diff --git a/lgsm/modules/alert_pushbullet.sh b/lgsm/modules/alert_pushbullet.sh
index 3bcd6141b..dedd43268 100644
--- a/lgsm/modules/alert_pushbullet.sh
+++ b/lgsm/modules/alert_pushbullet.sh
@@ -7,19 +7,36 @@
 
 moduleselfname="$(basename "$(readlink -f "${BASH_SOURCE[0]}")")"
 
-json=$(
+jsoninfo=$(
 	cat << EOF
 {
 	"channel_tag": "${channeltag}",
 	"type": "note",
-	"title": "${alertemoji} ${alertsubject} ${alertemoji}",
-	"body": "Server name\n${servername}\n\nMessage\n${alertbody}\n\nGame\n${gamename}\n\nServer IP\n${alertip}:${port}\n\nHostname\n${HOSTNAME}\n\nMore info\n${alerturl}"
+	"title": "${alerttitle}",
+	"body": "Server Name\n${servername}\n\nInformation\n${alertmessage}\n\nGame\n${gamename}\n\nServer IP\n${alertip}:${port}\n\nHostname\n${HOSTNAME}\n\nMore info\n${alerturl}\n\nServer Time\n$(date)"
 }
 EOF
 )
 
+jsonnoinfo=$(
+	cat << EOF
+{
+	"channel_tag": "${channeltag}",
+	"type": "note",
+	"title": "${alerttitle}",
+	"body": "Server Name\n${servername}\n\nInformation\n${alertmessage}\n\nGame\n${gamename}\n\nServer IP\n${alertip}:${port}\n\nHostname\n${HOSTNAME}\n\nServer Time\n$(date)"
+}
+EOF
+)
+
+if [ -z "${alerturl}" ]; then
+	json="${jsonnoinfo}"
+else
+	json="${jsoninfo}"
+fi
+
 fn_print_dots "Sending Pushbullet alert"
-pushbulletsend=$(curl --connect-timeout 10 -sSL -u """${pushbullettoken}"":" -H "Content-Type: application/json" -X POST -d "$(echo -n "${json}" | jq -c .)" "https://api.pushbullet.com/v2/pushes" | grep "error_code")
+pushbulletsend=$(curl --connect-timeout 10 -sSL -H "Access-Token: ${pushbullettoken}" -H "Content-Type: application/json" -X POST -d "$(echo -n "${json}" | jq -c .)" "https://api.pushbullet.com/v2/pushes" | grep "error_code")
 
 if [ -n "${pushbulletsend}" ]; then
 	fn_print_fail_nl "Sending Pushbullet alert: ${pushbulletsend}"
diff --git a/lgsm/modules/alert_pushover.sh b/lgsm/modules/alert_pushover.sh
index 35229094a..c436a4a91 100644
--- a/lgsm/modules/alert_pushover.sh
+++ b/lgsm/modules/alert_pushover.sh
@@ -22,7 +22,11 @@ else
 	alertpriority="0"
 fi
 
-pushoversend=$(curl --connect-timeout 10 -sS -F token="${pushovertoken}" -F user="${pushoveruserkey}" -F html="1" -F sound="${alertsound}" -F priority="${alertpriority}" -F title="${alertemoji} ${alertsubject} ${alertemoji}" -F message=" <b>Server name</b><br>${servername}<br><br><b>Message</b><br>${alertbody}<br><br><b>Game</b><br>${gamename}<br><br><b>Server IP</b><br><a href='https://www.gametracker.com/server_info/${alertip}:${port}'>${alertip}:${port}</a><br><br><b>Hostname</b><br>${HOSTNAME}<br><br><b>More info</b><br><a href='${alerturl}'>${alerturl}</a>" "https://api.pushover.net/1/messages.json" | grep errors)
+if [ -z "${alerturl}" ]; then
+	pushoversend=$(curl --connect-timeout 10 -sS -F token="${pushovertoken}" -F user="${pushoveruserkey}" -F html="1" -F sound="${alertsound}" -F priority="${alertpriority}" -F title="${alerttitle}" -F message=" <b>Server name</b><br>${servername}<br><br><b>Information</b><br>${alertmessage}<br><br><b>Game</b><br>${gamename}<br><br><b>Server IP</b><br>${alertip}:${port}<br><br><b>Hostname</b><br>${HOSTNAME}<br><br>Server Time<br>$(date)" "https://api.pushover.net/1/messages.json" | grep errors)
+else
+	pushoversend=$(curl --connect-timeout 10 -sS -F token="${pushovertoken}" -F user="${pushoveruserkey}" -F html="1" -F sound="${alertsound}" -F priority="${alertpriority}" -F title="${alerttitle}" -F message=" <b>Server name</b><br>${servername}<br><br><b>Information</b><br>${alertmessage}<br><br><b>Game</b><br>${gamename}<br><br><b>Server IP</b><br>${alertip}:${port}<br><br><b>Hostname</b><br>${HOSTNAME}<br><br><b>More info</b><br><a href='${alerturl}'>${alerturl}</a><br><br>Server Time<br>$(date)" "https://api.pushover.net/1/messages.json" | grep errors)
+fi
 
 if [ -n "${pushoversend}" ]; then
 	fn_print_fail_nl "Sending Pushover alert: ${pushoversend}"
diff --git a/lgsm/modules/alert_rocketchat.sh b/lgsm/modules/alert_rocketchat.sh
index f6e410ef8..329111494 100644
--- a/lgsm/modules/alert_rocketchat.sh
+++ b/lgsm/modules/alert_rocketchat.sh
@@ -7,28 +7,55 @@
 
 moduleselfname="$(basename "$(readlink -f "${BASH_SOURCE[0]}")")"
 
-json=$(
+jsoninfo=$(
 	cat << EOF
 {
 	"alias": "LinuxGSM",
-	"text": "*${alertemoji} ${alertsubject} ${alertemoji}* \n *${servername}* \n ${alertbody} \n More info: ${alerturl}",
+	"text": "*${alerttitle}*",
 	"attachments": [
 		{
+			"title": "",
+			"color": "${alertcolourhex}",
+			"author_name": "LinuxGSM Alert",
+			"author_link": "https://linuxgsm.com",
+			"author_icon": "https://raw.githubusercontent.com/${githubuser}/${githubrepo}/${githubbranch}/lgsm/data/alert_discord_logo.jpg",
+			"thumb_url": "${alerticon}",
+			"text": "",
 			"fields": [
 				{
-					"short": true,
-					"title": "Game:",
+					"short": false,
+					"title": "Server Name",
+					"value": "${servername}"
+				},
+				{
+					"short": false,
+					"title": "Information",
+					"value": "${alertmessage}"
+				},
+				{
+					"short": false,
+					"title": "Game",
 					"value": "${gamename}"
 				},
 				{
-					"short": true,
-					"title": "Server IP:",
+					"short": false,
+					"title": "Server IP",
 					"value": "${alertip}:${port}"
 				},
 				{
-					"short": true,
-					"title": "Hostname:",
+					"short": false,
+					"title": "Hostname",
 					"value": "${HOSTNAME}"
+				},
+				{
+					"short": false,
+					"title": "More info",
+					"value": "${alerturl}"
+				},
+				{
+					"short": false,
+					"title": "Server Time",
+					"value": "$(date)"
 				}
 			]
 		}
@@ -37,8 +64,65 @@ json=$(
 EOF
 )
 
-fn_print_dots "Sending Rocketchat alert"
+jsonnoinfo=$(
+	cat << EOF
+{
+	"alias": "LinuxGSM",
+	"text": "*${alerttitle}*",
+	"attachments": [
+		{
+			"title": "",
+			"color": "${alertcolourhex}",
+			"author_name": "LinuxGSM Alert",
+			"author_link": "https://linuxgsm.com",
+			"author_icon": "https://raw.githubusercontent.com/${githubuser}/${githubrepo}/${githubbranch}/lgsm/data/alert_discord_logo.jpg",
+			"thumb_url": "${alerticon}",
+			"text": "",
+			"fields": [
+				{
+					"short": false,
+					"title": "Server Name",
+					"value": "${servername}"
+				},
+				{
+					"short": false,
+					"title": "Information",
+					"value": "${alertmessage}"
+				},
+				{
+					"short": false,
+					"title": "Game",
+					"value": "${gamename}"
+				},
+				{
+					"short": false,
+					"title": "Server IP",
+					"value": "${alertip}:${port}"
+				},
+				{
+					"short": false,
+					"title": "Hostname",
+					"value": "${HOSTNAME}"
+				},
+				{
+					"short": false,
+					"title": "Server Time",
+					"value": "$(date)"
+				}
+			]
+		}
+	]
+}
+EOF
+)
 
+if [ -z "${alerturl}" ]; then
+	json="${jsonnoinfo}"
+else
+	json="${jsoninfo}"
+fi
+
+fn_print_dots "Sending Rocketchat alert"
 rocketchatsend=$(curl --connect-timeout 10 -sSL -H "Content-Type: application/json" -X POST -d "$(echo -n "${json}" | jq -c .)" "${rocketchatwebhook}")
 
 if [ -n "${rocketchatsend}" ]; then
diff --git a/lgsm/modules/alert_slack.sh b/lgsm/modules/alert_slack.sh
index f83df9510..728a564e0 100644
--- a/lgsm/modules/alert_slack.sh
+++ b/lgsm/modules/alert_slack.sh
@@ -7,61 +7,179 @@
 
 moduleselfname="$(basename "$(readlink -f "${BASH_SOURCE[0]}")")"
 
-json=$(
+jsonnoinfo=$(
 	cat << EOF
 {
-		"attachments": [
-			{
-				"color": "#36a64f",
-				"blocks": [
-					{
-										"type": "section",
-										"text": {
-												"type": "mrkdwn",
-												"text": "*LinuxGSM Alert*"
-										}
-								},
-								{
-										"type": "section",
-										"text": {
-												"type": "mrkdwn",
-												"text": "*${alertemoji} ${alertsubject}* \n ${alertbody}"
-										}
-								},
-								{
-										"type": "divider"
-								},
-								{
-										"type": "section",
-										"fields": [
-												{
-														"type": "mrkdwn",
-														"text": "*Game:* \n ${gamename}"
-												},
-												{
-														"type": "mrkdwn",
-														"text": "*Server IP:* \n ${alertip}:${port}"
-												},
-												{
-														"type": "mrkdwn",
-														"text": "*Server Name:* \n ${servername}"
-												}
-										]
-								},
-					 {
-										"type": "section",
-										"text": {
-														"type": "mrkdwn",
-														"text": "Hostname: ${HOSTNAME} / More info: ${alerturl}"
-										}
-								}
-						]
-			}
-		]
+	"attachments": [
+		{
+			"color": "${alertcolourhex}",
+			"blocks": [
+				{
+					"type": "header",
+					"text": {
+						"type": "mrkdwn",
+						"text": "${alerttitle}",
+						"emoji": true
+					}
+				},
+				{
+					"type": "divider"
+				},
+				{
+					"type": "section",
+					"text": {
+						"type": "mrkdwn",
+						"text": "*Server Name*\n${servername}"
+					}
+				},
+				{
+					"type": "section",
+					"text": {
+						"type": "mrkdwn",
+						"text": "*Information*\n${alertmessage}"
+					}
+				},
+				{
+					"type": "section",
+					"fields": [
+						{
+							"type": "mrkdwn",
+							"text": "*Game*\n${gamename}"
+						},
+						{
+							"type": "mrkdwn",
+							"text": "*Server IP*\n\`${alertip}:${port}\`"
+						},
+						{
+							"type": "mrkdwn",
+							"text": "*Hostname*\n${HOSTNAME}"
+						},
+						{
+							"type": "mrkdwn",
+							"text": "*Server Time*\n$(date)"
+						}
+					],
+					"accessory": {
+						"type": "image",
+						"image_url": "${alerticon}",
+						"alt_text": "cute cat"
+					}
+				},
+				{
+					"type": "context",
+					"elements": [
+						{
+							"type": "image",
+							"image_url": "https://raw.githubusercontent.com/${githubuser}/${githubrepo}/${githubbranch}/lgsm/data/alert_discord_logo.jpg",
+							"alt_text": "LinuxGSM icon"
+						},
+						{
+							"type": "plain_text",
+							"text": "Sent by LinuxGSM ${version}",
+							"emoji": true
+						}
+					]
+				}
+			]
+		}
+	]
 }
 EOF
 )
 
+jsoninfo=$(
+	cat << EOF
+{
+	"attachments": [
+		{
+			"color": "${alertcolourhex}",
+			"blocks": [
+				{
+					"type": "header",
+					"text": {
+						"type": "mrkdwn",
+						"text": "${alerttitle}",
+						"emoji": true
+					}
+				},
+				{
+					"type": "divider"
+				},
+				{
+					"type": "section",
+					"text": {
+						"type": "mrkdwn",
+						"text": "*Server Name*\n${servername}"
+					}
+				},
+				{
+					"type": "section",
+					"text": {
+						"type": "mrkdwn",
+						"text": "*Information*\n${alertmessage}"
+					}
+				},
+				{
+					"type": "section",
+					"fields": [
+						{
+							"type": "mrkdwn",
+							"text": "*Game*\n${gamename}"
+						},
+						{
+							"type": "mrkdwn",
+							"text": "*Server IP*\n\`${alertip}:${port}\`"
+						},
+						{
+							"type": "mrkdwn",
+							"text": "*Hostname*\n${HOSTNAME}"
+						},
+						{
+							"type": "mrkdwn",
+							"text": "*Server Time*\n$(date)"
+						}
+					],
+					"accessory": {
+						"type": "image",
+						"image_url": "${alerticon}",
+						"alt_text": "cute cat"
+					}
+				},
+				{
+					"type": "section",
+					"text": {
+						"type": "mrkdwn",
+						"text": "*Server Time*\n${alertmessage}"
+					}
+				},
+				{
+					"type": "context",
+					"elements": [
+						{
+							"type": "image",
+							"image_url": "https://raw.githubusercontent.com/${githubuser}/${githubrepo}/${githubbranch}/lgsm/data/alert_discord_logo.jpg",
+							"alt_text": "LinuxGSM icon"
+						},
+						{
+							"type": "plain_text",
+							"text": "Sent by LinuxGSM ${version}",
+							"emoji": true
+						}
+					]
+				}
+			]
+		}
+	]
+}
+EOF
+)
+
+if [ -z "${alerturl}" ]; then
+	json="${jsonnoinfo}"
+else
+	json="${jsoninfo}"
+fi
+
 fn_print_dots "Sending Slack alert"
 
 slacksend=$(curl --connect-timeout 10 -sSL -H "Content-Type: application/json" -X POST -d "$(echo -n "${json}" | jq -c .)" "${slackwebhook}")
diff --git a/lgsm/modules/alert_telegram.sh b/lgsm/modules/alert_telegram.sh
index d2e72346a..3b3ec9912 100644
--- a/lgsm/modules/alert_telegram.sh
+++ b/lgsm/modules/alert_telegram.sh
@@ -7,17 +7,34 @@
 
 moduleselfname="$(basename "$(readlink -f "${BASH_SOURCE[0]}")")"
 
-json=$(
+jsoninfo=$(
 	cat << EOF
 {
 	"chat_id": "${telegramchatid}",
 	"parse_mode": "HTML",
-	"text": "<b>${alertemoji} ${alertsubject} ${alertemoji}</b>\n\n<b>Server name</b>\n${servername}\n\n<b>Message</b>\n${alertbody}\n\n<b>Game</b>\n${gamename}\n\n<b>Server IP</b>\n<a href='https://www.gametracker.com/server_info/${alertip}:${port}'>${alertip}:${port}</a>\n\n<b>Hostname</b>\n${HOSTNAME}\n\n<b>More info</b>\n<a href='${alerturl}'>${alerturl}</a>",
+	"text": "<b>${alerttitle}</b>\n\n<b>Server name</b>\n${servername}\n\n<b>Information</b>\n${alertmessage}\n\n<b>Game</b>\n${gamename}\n\n<b>Server IP</b>\n${alertip}:${port}\n\n<b>Hostname</b>\n${HOSTNAME}\n\n<b>More info</b>\n<a href='${alerturl}'>${alerturl}</a>\n\n<b>Server Time</b>\n$(date)",
 	"disable_web_page_preview": "yes"
 }
 EOF
 )
 
+jsonnoinfo=$(
+	cat << EOF
+{
+	"chat_id": "${telegramchatid}",
+	"parse_mode": "HTML",
+	"text": "<b>${alerttitle}</b>\n\n<b>Server name</b>\n${servername}\n\n<b>Information</b>\n${alertmessage}\n\n<b>Game</b>\n${gamename}\n\n<b>Server IP</b>\n${alertip}:${port}\n\n<b>Hostname</b>\n${HOSTNAME}\n\n<b>Server Time</b>\n$(date)",
+	"disable_web_page_preview": "yes"
+}
+EOF
+)
+
+if [ -z "${alerturl}" ]; then
+	json="${jsonnoinfo}"
+else
+	json="${jsoninfo}"
+fi
+
 fn_print_dots "Sending Telegram alert"
 telegramsend=$(curl --connect-timeout 10 -sSL -H "Content-Type: application/json" -X POST -d "$(echo -n "${json}" | jq -c .)" ${curlcustomstring} "https://${telegramapi}/bot${telegramtoken}/sendMessage" | grep "error_code")
 
diff --git a/lgsm/modules/check_last_update.sh b/lgsm/modules/check_last_update.sh
index 02d17c975..166d80a17 100644
--- a/lgsm/modules/check_last_update.sh
+++ b/lgsm/modules/check_last_update.sh
@@ -20,6 +20,8 @@ if [ -f "${lockdir}/last-updated.lock" ] && [ "${status}" != "0" ]; then
 	if [ ! -f "${lockdir}/${selfname}-last-started.lock" ] || [ "${laststart}" -lt "${lastupdate}" ]; then
 		fn_print_info "${selfname} has not been restarted since last update"
 		fn_script_log_info "${selfname} has not been restarted since last update"
+		alert="update"
+		alert.sh
 		command_restart.sh
 		fn_firstcommand_reset
 	fi
diff --git a/lgsm/modules/command_backup.sh b/lgsm/modules/command_backup.sh
index fac5dc38b..55981e19e 100644
--- a/lgsm/modules/command_backup.sh
+++ b/lgsm/modules/command_backup.sh
@@ -138,6 +138,8 @@ fn_backup_compression() {
 		fn_print_ok_eol
 		fn_print_ok_nl "Completed: ${backupname}.tar.gz, total size $(du -sh "${backupdir}/${backupname}.tar.gz" | awk '{print $1}')"
 		fn_script_log_pass "Backup created: ${backupname}.tar.gz, total size $(du -sh "${backupdir}/${backupname}.tar.gz" | awk '{print $1}')"
+		alert="backup"
+		alert.sh
 	fi
 }
 
diff --git a/lgsm/modules/command_monitor.sh b/lgsm/modules/command_monitor.sh
index d4d88bd56..51a1e99bf 100644
--- a/lgsm/modules/command_monitor.sh
+++ b/lgsm/modules/command_monitor.sh
@@ -154,7 +154,7 @@ fn_monitor_check_update_source() {
 			fn_print_ok "Checking update: "
 			fn_print_ok_eol_nl
 			fn_script_log_info "Checking update: Monitor is restarting ${selfname} to apply update"
-			alert="update-restart"
+			alert="update"
 			alert.sh
 			command_restart.sh
 			core_exit.sh
@@ -207,7 +207,7 @@ fn_monitor_check_session() {
 		fn_print_error "Checking session: "
 		fn_print_fail_eol_nl
 		fn_script_log_fail "Checking session: FAIL"
-		alert="restart"
+		alert="monitor-session"
 		alert.sh
 		fn_script_log_info "Checking session: Monitor is restarting ${selfname}"
 		command_restart.sh
@@ -319,7 +319,7 @@ fn_monitor_query() {
 					fn_print_fail_eol_nl
 					fn_script_log_warn "Querying port: ${querymethod}: ${queryip}:${queryport} : ${queryattempt} : FAIL"
 					# Send alert if enabled.
-					alert="restartquery"
+					alert="monitor-query"
 					alert.sh
 					command_restart.sh
 					fn_firstcommand_reset
diff --git a/lgsm/modules/command_start.sh b/lgsm/modules/command_start.sh
index 364733ea2..345ede786 100644
--- a/lgsm/modules/command_start.sh
+++ b/lgsm/modules/command_start.sh
@@ -176,6 +176,13 @@ fn_start_tmux() {
 
 		fn_print_ok "${servername}"
 		fn_script_log_pass "Started ${servername}"
+		if [ "${statusalert}" == "on" ] && [ "${firstcommandname}" == "START" ]; then
+			alert="started"
+			alert.sh
+		elif [ "${statusalert}" == "on" ] && [ "${firstcommandname}" == "RESTART" ]; then
+			alert="restarted"
+			alert.sh
+		fi
 	fi
 	rm -f "${lgsmlogdir:?}/.${selfname}-tmux-error.tmp" 2> /dev/null
 	echo -en "\n"
diff --git a/lgsm/modules/command_stop.sh b/lgsm/modules/command_stop.sh
index 1567252f9..3e503a4f5 100644
--- a/lgsm/modules/command_stop.sh
+++ b/lgsm/modules/command_stop.sh
@@ -23,6 +23,10 @@ fn_stop_graceful_ctrlc() {
 			fn_print_ok "Graceful: CTRL+c: ${seconds}: "
 			fn_print_ok_eol_nl
 			fn_script_log_pass "Graceful: CTRL+c: OK: ${seconds} seconds"
+			if [ "${statusalert}" == "on" ] && [ "${firstcommandname}" == "STOP" ]; then
+				alert="stopped"
+				alert.sh
+			fi
 			break
 		fi
 		fn_sleep_time_1
@@ -51,6 +55,10 @@ fn_stop_graceful_cmd() {
 			fn_print_ok "Graceful: sending \"${1}\": ${seconds}: "
 			fn_print_ok_eol_nl
 			fn_script_log_pass "Graceful: sending \"${1}\": OK: ${seconds} seconds"
+			if [ "${statusalert}" == "on" ] && [ "${firstcommandname}" == "STOP" ]; then
+				alert="stopped"
+				alert.sh
+			fi
 			break
 		fi
 		fn_sleep_time_1
@@ -80,6 +88,10 @@ fn_stop_graceful_goldsrc() {
 	fn_print_ok "Graceful: sending \"quit\": ${seconds}: "
 	fn_print_ok_eol_nl
 	fn_script_log_pass "Graceful: sending \"quit\": OK: ${seconds} seconds"
+	if [ "${statusalert}" == "on" ] && [ "${firstcommandname}" == "STOP" ]; then
+		alert="stopped"
+		alert.sh
+	fi
 }
 
 # telnet command for sdtd graceful shutdown.
@@ -152,6 +164,10 @@ fn_stop_graceful_sdtd() {
 					fn_print_ok "Graceful: telnet: ${telnetip}:${telnetport} : "
 					fn_print_ok_eol_nl
 					fn_script_log_pass "Graceful: telnet: ${telnetip}:${telnetport} : ${seconds} seconds"
+					if [ "${statusalert}" == "on" ] && [ "${firstcommandname}" == "STOP" ]; then
+						alert="stopped"
+						alert.sh
+					fi
 					break
 				fi
 				fn_sleep_time_1
@@ -195,6 +211,10 @@ fn_stop_graceful_avorion() {
 			fn_print_ok "Graceful: /save /stop: ${seconds}: "
 			fn_print_ok_eol_nl
 			fn_script_log_pass "Graceful: /save /stop: OK: ${seconds} seconds"
+			if [ "${statusalert}" == "on" ] && [ "${firstcommandname}" == "STOP" ]; then
+				alert="stopped"
+				alert.sh
+			fi
 			break
 		fi
 		fn_sleep_time_1
@@ -246,6 +266,10 @@ fn_stop_tmux() {
 	if [ "${status}" == "0" ]; then
 		fn_print_ok_nl "${servername}"
 		fn_script_log_pass "Stopped ${servername}"
+		if [ "${statusalert}" == "on" ] && [ "${firstcommandname}" == "STOP" ]; then
+			alert="stopped"
+			alert.sh
+		fi
 	else
 		fn_print_fail_nl "Unable to stop ${servername}"
 		fn_script_log_fail "Unable to stop ${servername}"
diff --git a/lgsm/modules/command_wipe.sh b/lgsm/modules/command_wipe.sh
index d20bd0d3e..378dae0ec 100644
--- a/lgsm/modules/command_wipe.sh
+++ b/lgsm/modules/command_wipe.sh
@@ -167,6 +167,8 @@ if [ -n "$(find "${serveridentitydir}" -type f -name "*.map")" ] || [ -n "$(find
 		fn_wipe_random_seed
 		fn_print_complete_nl "${wipetype}"
 		fn_script_log_pass "${wipetype}"
+		alert="wipe"
+		alert.sh
 		exitbypass=1
 		command_start.sh
 		fn_firstcommand_reset
@@ -175,6 +177,8 @@ if [ -n "$(find "${serveridentitydir}" -type f -name "*.map")" ] || [ -n "$(find
 		fn_wipe_random_seed
 		fn_print_complete_nl "${wipetype}"
 		fn_script_log_pass "${wipetype}"
+		alert="wipe"
+		alert.sh
 	fi
 else
 	fn_print_ok_nl "Wipe not required"
diff --git a/lgsm/modules/info_messages.sh b/lgsm/modules/info_messages.sh
index c959df307..121341878 100644
--- a/lgsm/modules/info_messages.sh
+++ b/lgsm/modules/info_messages.sh
@@ -48,22 +48,26 @@ fn_info_message_password_strip() {
 # used with alertlog
 fn_info_message_head() {
 	echo -e ""
-	echo -e "${bold}${lightyellow}Alert Summary${default}"
+	echo -e "LinuxGSM Alert Summary"
 	fn_messages_separator
-	echo -e "Message"
-	echo -e "${alertbody}"
+	echo -e ""
+	echo -e "Server name"
+	echo -e "${servername}"
+	echo -e ""
+	echo -e "Information"
+	echo -e "${alertmessage}"
 	echo -e ""
 	echo -e "Game"
 	echo -e "${gamename}"
 	echo -e ""
-	echo -e "Server name"
-	echo -e "${servername}"
+	echo -e "Server IP"
+	echo -e "${alertip}:${port}"
 	echo -e ""
 	echo -e "Hostname"
 	echo -e "${HOSTNAME}"
 	echo -e ""
-	echo -e "Server IP"
-	echo -e "${ip}:${port}"
+	echo -e "Server Time"
+	echo -e "$(date)"
 }
 
 fn_info_message_distro() {
@@ -75,6 +79,7 @@ fn_info_message_distro() {
 	# Arch:      x86_64
 	# Kernel:    5.4.0-65-generic
 	# Hostname:  server
+	# Environment: kvm
 	# Uptime:    16d, 5h, 18m
 	# tmux:      tmux 3.0a
 	# glibc:     2.31
@@ -88,6 +93,7 @@ fn_info_message_distro() {
 		echo -e "${lightblue}Arch:\t${default}${arch}"
 		echo -e "${lightblue}Kernel:\t${default}${kernel}"
 		echo -e "${lightblue}Hostname:\t${default}${HOSTNAME}"
+		echo -e "${lightblue}Environment:\t${default}${virtualenvironment}"
 		echo -e "${lightblue}Uptime:\t${default}${days}d, ${hours}h, ${minutes}m"
 		echo -e "${lightblue}tmux:\t${default}${tmuxv}"
 		echo -e "${lightblue}glibc:\t${default}${glibcversion}"

From 29246f84a482cad29d4cd84e76727f9aeb1c66cf Mon Sep 17 00:00:00 2001
From: Daniel Gibbs <me@danielgibbs.co.uk>
Date: Sun, 22 Oct 2023 22:48:22 +0100
Subject: [PATCH 009/154] feat: update package netcat dependencies for Debian
 and Ubuntu  (#4348)

- Updated the package dependencies in the Debian 12, Ubuntu 23.04, and Ubuntu 23.10 CSV files.
- Replaced "netcat" with "netcat-openbsd" as a dependency.
- Ensured consistency across different versions of Ubuntu.

This commit refactors the code by updating the package dependencies for Debian and Ubuntu distributions. The changes include replacing "netcat" with "netcat-openbsd" as a dependency in all three CSV files (Debian 12, Ubuntu 23.04, and Ubuntu 23.10). These updates ensure consistency across different versions of Ubuntu.
---
 lgsm/data/debian-12.csv    |   2 +-
 lgsm/data/ubuntu-23.04.csv |   2 +-
 lgsm/data/ubuntu-23.10.csv | 135 +++++++++++++++++++++++++++++++++++++
 3 files changed, 137 insertions(+), 2 deletions(-)
 create mode 100644 lgsm/data/ubuntu-23.10.csv

diff --git a/lgsm/data/debian-12.csv b/lgsm/data/debian-12.csv
index 3a5c24fbf..ed35f9e41 100644
--- a/lgsm/data/debian-12.csv
+++ b/lgsm/data/debian-12.csv
@@ -1,4 +1,4 @@
-all,bc,binutils,bsdmainutils,bzip2,ca-certificates,cpio,curl,distro-info,file,gzip,hostname,jq,lib32gcc-s1,lib32stdc++6,netcat-traditional,python3,tar,tmux,unzip,util-linux,uuid-runtime,wget,xz-utils
+all,bc,binutils,bsdmainutils,bzip2,ca-certificates,cpio,curl,distro-info,file,gzip,hostname,jq,lib32gcc-s1,lib32stdc++6,netcat-openbsd,python3,tar,tmux,unzip,util-linux,uuid-runtime,wget,xz-utils
 steamcmd,lib32gcc-s1,lib32stdc++6,libsdl2-2.0-0:i386,steamcmd
 ac
 ahl
diff --git a/lgsm/data/ubuntu-23.04.csv b/lgsm/data/ubuntu-23.04.csv
index 8526a176b..1b59e7431 100644
--- a/lgsm/data/ubuntu-23.04.csv
+++ b/lgsm/data/ubuntu-23.04.csv
@@ -1,4 +1,4 @@
-all,bc,binutils,bsdmainutils,bzip2,ca-certificates,cpio,curl,distro-info,file,gzip,hostname,jq,lib32gcc-s1,lib32stdc++6,netcat,python3,tar,tmux,unzip,util-linux,uuid-runtime,wget,xz-utils
+all,bc,binutils,bsdmainutils,bzip2,ca-certificates,cpio,curl,distro-info,file,gzip,hostname,jq,lib32gcc-s1,lib32stdc++6,netcat-openbsd,python3,tar,tmux,unzip,util-linux,uuid-runtime,wget,xz-utils
 steamcmd,lib32gcc-s1,lib32stdc++6,libsdl2-2.0-0:i386,steamcmd
 ac
 ahl
diff --git a/lgsm/data/ubuntu-23.10.csv b/lgsm/data/ubuntu-23.10.csv
new file mode 100644
index 000000000..1b59e7431
--- /dev/null
+++ b/lgsm/data/ubuntu-23.10.csv
@@ -0,0 +1,135 @@
+all,bc,binutils,bsdmainutils,bzip2,ca-certificates,cpio,curl,distro-info,file,gzip,hostname,jq,lib32gcc-s1,lib32stdc++6,netcat-openbsd,python3,tar,tmux,unzip,util-linux,uuid-runtime,wget,xz-utils
+steamcmd,lib32gcc-s1,lib32stdc++6,libsdl2-2.0-0:i386,steamcmd
+ac
+ahl
+ahl2
+ark
+arma3
+armar,libcurl4
+ats
+av
+bb
+bb2,libcurl4-gnutls-dev:i386
+bd
+bf1942,libncurses5:i386,libtinfo5:i386
+bfv,libncurses5:i386,libstdc++5:i386
+bmdm,libncurses5:i386
+bo
+bs
+bt,libicu-dev,dos2unix,libxml2-utils
+btl
+cc
+cd
+ck,xvfb,libxi6
+cmw
+cod,libstdc++5:i386
+cod2,libstdc++5:i386
+cod4
+coduo,libstdc++5:i386
+codwaw
+col
+cs
+cscz
+csgo
+css,libtinfo5:i386
+ct
+dab
+dayz
+dmc
+dod
+dodr
+dods
+doi
+dst,libcurl4-gnutls-dev:i386
+dys
+eco,libgdiplus
+em
+etl
+ets2
+fctr
+fof
+gmod,libtinfo5:i386
+hcu
+hl2dm
+hldm
+hldms
+hw,lib32z1
+ins
+inss
+ios
+jc2
+jc3
+jk2
+kf
+kf2
+l4d
+l4d2
+lo
+mc,openjdk-17-jre
+mcb
+mh
+mohaa,libstdc++5:i386
+mom
+mta,libncursesw5,libxml2-utils
+nd
+nec
+nmrih,libtinfo5:i386
+ns
+ns2,speex,libtbb2
+ns2c,speex:i386,libtbb2
+ohd
+onset,libmariadb-dev
+opfor
+pc
+pc2
+pmc,openjdk-17-jre
+ps,libgconf-2-4
+pvkii
+pvr,libc++1
+pz,openjdk-17-jre,rng-tools5
+q2
+q3
+ql
+qw
+ricochet
+ro
+rtcw
+rust,lib32z1
+rw,openjdk-17-jre
+samp
+sb
+sbots
+scpsl,mono-complete
+scpslsm,mono-complete
+sdtd,telnet,expect,libxml2-utils
+sf
+sfc,libtinfo5:i386
+sof2
+sol
+squad
+st,libxml2-utils
+stn
+sven,libssl1.1:i386,zlib1g:i386
+terraria
+tf2,libcurl4-gnutls-dev:i386
+tfc
+ti
+ts
+ts3
+tu
+tw
+unt
+ut
+ut2k4
+ut3
+ut99
+vh,libc6-dev
+vints,aspnetcore-runtime-7.0
+vpmc,openjdk-17-jre
+vs
+wet
+wf
+wmc,openjdk-17-jre
+wurm,xvfb
+zmr,libtinfo5:i386
+zps,libtinfo5:i386

From 069e3bd4e1232ff01131efa6239a7ff22d13c715 Mon Sep 17 00:00:00 2001
From: Daniel Gibbs <me@danielgibbs.co.uk>
Date: Sun, 22 Oct 2023 23:19:24 +0100
Subject: [PATCH 010/154] refactor: remove legacy code

core_functsions.sh is no longer required

refactor: remove legacy code

A lot of time has passed on many of these changes. Moving old legacy code conversions

refactor: remove unused alert modules

This commit removes the unused alert modules `alert.sh`, `alert_discord.sh`, and `alert_email.sh`. These modules were not being used in the codebase and were therefore deleted.
---
 lgsm/functions/README.md                      |   17 -
 lgsm/functions/alert.sh                       |  238 --
 lgsm/functions/alert_discord.sh               |   59 -
 lgsm/functions/alert_email.sh                 |   25 -
 lgsm/functions/alert_gotify.sh                |   30 -
 lgsm/functions/alert_ifttt.sh                 |   29 -
 lgsm/functions/alert_mailgun.sh               |   32 -
 lgsm/functions/alert_pushbullet.sh            |   30 -
 lgsm/functions/alert_pushover.sh              |   33 -
 lgsm/functions/alert_rocketchat.sh            |   50 -
 lgsm/functions/alert_slack.sh                 |   75 -
 lgsm/functions/alert_telegram.sh              |   30 -
 lgsm/functions/check.sh                       |  101 -
 lgsm/functions/check_config.sh                |   35 -
 lgsm/functions/check_deps.sh                  |  363 ---
 lgsm/functions/check_executable.sh            |   20 -
 lgsm/functions/check_glibc.sh                 |   29 -
 lgsm/functions/check_ip.sh                    |   63 -
 lgsm/functions/check_last_update.sh           |   26 -
 lgsm/functions/check_logs.sh                  |   26 -
 lgsm/functions/check_permissions.sh           |  233 --
 lgsm/functions/check_root.sh                  |   21 -
 lgsm/functions/check_status.sh                |   10 -
 lgsm/functions/check_steamcmd.sh              |   22 -
 lgsm/functions/check_system_dir.sh            |   22 -
 lgsm/functions/check_system_requirements.sh   |   55 -
 lgsm/functions/check_tmuxception.sh           |   33 -
 lgsm/functions/check_version.sh               |   23 -
 lgsm/functions/command_backup.sh              |  268 --
 lgsm/functions/command_check_update.sh        |   39 -
 lgsm/functions/command_console.sh             |   58 -
 lgsm/functions/command_debug.sh               |  142 -
 lgsm/functions/command_details.sh             |   41 -
 lgsm/functions/command_dev_clear_functions.sh |   24 -
 lgsm/functions/command_dev_debug.sh           |   23 -
 lgsm/functions/command_dev_detect_deps.sh     |  231 --
 lgsm/functions/command_dev_detect_glibc.sh    |   92 -
 lgsm/functions/command_dev_detect_ldd.sh      |   61 -
 lgsm/functions/command_dev_query_raw.sh       |  280 --
 lgsm/functions/command_donate.sh              |   26 -
 lgsm/functions/command_fastdl.sh              |  442 ---
 lgsm/functions/command_install.sh             |   52 -
 .../command_install_resources_mta.sh          |   32 -
 lgsm/functions/command_mods_install.sh        |  135 -
 lgsm/functions/command_mods_remove.sh         |  153 -
 lgsm/functions/command_mods_update.sh         |  109 -
 lgsm/functions/command_monitor.sh             |  245 --
 lgsm/functions/command_postdetails.sh         |   78 -
 lgsm/functions/command_restart.sh             |   18 -
 lgsm/functions/command_send.sh                |   41 -
 lgsm/functions/command_skeleton.sh            |   23 -
 lgsm/functions/command_start.sh               |  224 --
 lgsm/functions/command_stop.sh                |  283 --
 lgsm/functions/command_test_alert.sh          |   19 -
 lgsm/functions/command_ts3_server_pass.sh     |   57 -
 lgsm/functions/command_update.sh              |   40 -
 lgsm/functions/command_update_linuxgsm.sh     |  236 --
 lgsm/functions/command_validate.sh            |   49 -
 lgsm/functions/command_wipe.sh                |  183 --
 lgsm/functions/compress_unreal2_maps.sh       |   35 -
 lgsm/functions/compress_ut99_maps.sh          |   35 -
 lgsm/functions/core_dl.sh                     |  625 ----
 lgsm/functions/core_exit.sh                   |   61 -
 lgsm/functions/core_functions.sh              |  816 ------
 lgsm/functions/core_getopt.sh                 |  215 --
 lgsm/functions/core_github.sh                 |  114 -
 lgsm/functions/core_legacy.sh                 |   84 -
 lgsm/functions/core_logs.sh                   |  110 -
 lgsm/functions/core_messages.sh               |  598 ----
 lgsm/functions/core_modules.sh                |  816 ------
 lgsm/functions/core_steamcmd.sh               |  334 ---
 lgsm/functions/core_trap.sh                   |   22 -
 lgsm/functions/fix.sh                         |   88 -
 lgsm/functions/fix_ark.sh                     |   62 -
 lgsm/functions/fix_arma3.sh                   |   16 -
 lgsm/functions/fix_armar.sh                   |   17 -
 lgsm/functions/fix_av.sh                      |   19 -
 lgsm/functions/fix_bo.sh                      |   10 -
 lgsm/functions/fix_bt.sh                      |   24 -
 lgsm/functions/fix_cmw.sh                     |   23 -
 lgsm/functions/fix_csgo.sh                    |   42 -
 lgsm/functions/fix_dst.sh                     |   17 -
 lgsm/functions/fix_hw.sh                      |   10 -
 lgsm/functions/fix_ins.sh                     |   20 -
 lgsm/functions/fix_kf.sh                      |   36 -
 lgsm/functions/fix_kf2.sh                     |   20 -
 lgsm/functions/fix_lo.sh                      |   17 -
 lgsm/functions/fix_mcb.sh                     |   11 -
 lgsm/functions/fix_mta.sh                     |   16 -
 lgsm/functions/fix_nmrih.sh                   |   17 -
 lgsm/functions/fix_onset.sh                   |   19 -
 lgsm/functions/fix_ro.sh                      |   39 -
 lgsm/functions/fix_rust.sh                    |   32 -
 lgsm/functions/fix_rw.sh                      |   10 -
 lgsm/functions/fix_samp.sh                    |   34 -
 lgsm/functions/fix_sdtd.sh                    |   10 -
 lgsm/functions/fix_sfc.sh                     |   48 -
 lgsm/functions/fix_sof2.sh                    |   11 -
 lgsm/functions/fix_squad.sh                   |   26 -
 lgsm/functions/fix_st.sh                      |   11 -
 lgsm/functions/fix_steamcmd.sh                |  141 -
 lgsm/functions/fix_terraria.sh                |   10 -
 lgsm/functions/fix_tf2.sh                     |   16 -
 lgsm/functions/fix_ts3.sh                     |   33 -
 lgsm/functions/fix_unt.sh                     |   10 -
 lgsm/functions/fix_ut.sh                      |   13 -
 lgsm/functions/fix_ut2k4.sh                   |   36 -
 lgsm/functions/fix_ut3.sh                     |   20 -
 lgsm/functions/fix_vh.sh                      |   35 -
 lgsm/functions/fix_wurm.sh                    |   23 -
 lgsm/functions/fix_zmr.sh                     |   48 -
 lgsm/functions/info_distro.sh                 |  281 --
 lgsm/functions/info_game.sh                   | 2600 -----------------
 lgsm/functions/info_messages.sh               | 1849 ------------
 lgsm/functions/info_stats.sh                  |  173 --
 lgsm/functions/install_complete.sh            |   18 -
 lgsm/functions/install_config.sh              |  937 ------
 lgsm/functions/install_dst_token.sh           |   45 -
 lgsm/functions/install_eula.sh                |   47 -
 lgsm/functions/install_factorio_save.sh       |   15 -
 lgsm/functions/install_gslt.sh                |   47 -
 lgsm/functions/install_header.sh              |   22 -
 lgsm/functions/install_logs.sh                |  100 -
 lgsm/functions/install_mta_resources.sh       |   12 -
 lgsm/functions/install_retry.sh               |   16 -
 lgsm/functions/install_server_dir.sh          |   26 -
 lgsm/functions/install_server_files.sh        |  255 --
 lgsm/functions/install_squad_license.sh       |   25 -
 lgsm/functions/install_stats.sh               |   28 -
 lgsm/functions/install_steamcmd.sh            |   14 -
 lgsm/functions/install_ts3db.sh               |   76 -
 lgsm/functions/install_ut2k4_key.sh           |   30 -
 lgsm/functions/mods_core.sh                   |  755 -----
 lgsm/functions/mods_list.sh                   |  209 --
 lgsm/functions/query_gamedig.sh               |   93 -
 lgsm/functions/query_gsquery.py               |  151 -
 lgsm/functions/update_factorio.sh             |  168 --
 lgsm/functions/update_jediknight2.sh          |  163 --
 lgsm/functions/update_minecraft.sh            |  176 --
 lgsm/functions/update_minecraft_bedrock.sh    |  181 --
 lgsm/functions/update_mta.sh                  |  166 --
 lgsm/functions/update_papermc.sh              |  194 --
 lgsm/functions/update_steamcmd.sh             |   39 -
 lgsm/functions/update_ts3.sh                  |  181 --
 lgsm/functions/update_ut99.sh                 |  163 --
 lgsm/functions/update_vintagestory.sh         |  170 --
 lgsm/modules/command_send.sh                  |    2 +-
 lgsm/modules/core_dl.sh                       |    6 +-
 lgsm/modules/core_functions.sh                |  811 -----
 lgsm/modules/core_legacy.sh                   |   71 -
 linuxgsm.sh                                   |   17 -
 151 files changed, 2 insertions(+), 20719 deletions(-)
 delete mode 100644 lgsm/functions/README.md
 delete mode 100644 lgsm/functions/alert.sh
 delete mode 100644 lgsm/functions/alert_discord.sh
 delete mode 100644 lgsm/functions/alert_email.sh
 delete mode 100644 lgsm/functions/alert_gotify.sh
 delete mode 100644 lgsm/functions/alert_ifttt.sh
 delete mode 100644 lgsm/functions/alert_mailgun.sh
 delete mode 100644 lgsm/functions/alert_pushbullet.sh
 delete mode 100644 lgsm/functions/alert_pushover.sh
 delete mode 100644 lgsm/functions/alert_rocketchat.sh
 delete mode 100644 lgsm/functions/alert_slack.sh
 delete mode 100644 lgsm/functions/alert_telegram.sh
 delete mode 100644 lgsm/functions/check.sh
 delete mode 100644 lgsm/functions/check_config.sh
 delete mode 100644 lgsm/functions/check_deps.sh
 delete mode 100644 lgsm/functions/check_executable.sh
 delete mode 100644 lgsm/functions/check_glibc.sh
 delete mode 100644 lgsm/functions/check_ip.sh
 delete mode 100644 lgsm/functions/check_last_update.sh
 delete mode 100644 lgsm/functions/check_logs.sh
 delete mode 100644 lgsm/functions/check_permissions.sh
 delete mode 100644 lgsm/functions/check_root.sh
 delete mode 100644 lgsm/functions/check_status.sh
 delete mode 100644 lgsm/functions/check_steamcmd.sh
 delete mode 100644 lgsm/functions/check_system_dir.sh
 delete mode 100644 lgsm/functions/check_system_requirements.sh
 delete mode 100644 lgsm/functions/check_tmuxception.sh
 delete mode 100644 lgsm/functions/check_version.sh
 delete mode 100644 lgsm/functions/command_backup.sh
 delete mode 100644 lgsm/functions/command_check_update.sh
 delete mode 100644 lgsm/functions/command_console.sh
 delete mode 100644 lgsm/functions/command_debug.sh
 delete mode 100644 lgsm/functions/command_details.sh
 delete mode 100644 lgsm/functions/command_dev_clear_functions.sh
 delete mode 100644 lgsm/functions/command_dev_debug.sh
 delete mode 100644 lgsm/functions/command_dev_detect_deps.sh
 delete mode 100644 lgsm/functions/command_dev_detect_glibc.sh
 delete mode 100644 lgsm/functions/command_dev_detect_ldd.sh
 delete mode 100644 lgsm/functions/command_dev_query_raw.sh
 delete mode 100644 lgsm/functions/command_donate.sh
 delete mode 100644 lgsm/functions/command_fastdl.sh
 delete mode 100644 lgsm/functions/command_install.sh
 delete mode 100644 lgsm/functions/command_install_resources_mta.sh
 delete mode 100644 lgsm/functions/command_mods_install.sh
 delete mode 100644 lgsm/functions/command_mods_remove.sh
 delete mode 100644 lgsm/functions/command_mods_update.sh
 delete mode 100644 lgsm/functions/command_monitor.sh
 delete mode 100644 lgsm/functions/command_postdetails.sh
 delete mode 100644 lgsm/functions/command_restart.sh
 delete mode 100644 lgsm/functions/command_send.sh
 delete mode 100644 lgsm/functions/command_skeleton.sh
 delete mode 100644 lgsm/functions/command_start.sh
 delete mode 100644 lgsm/functions/command_stop.sh
 delete mode 100644 lgsm/functions/command_test_alert.sh
 delete mode 100644 lgsm/functions/command_ts3_server_pass.sh
 delete mode 100644 lgsm/functions/command_update.sh
 delete mode 100644 lgsm/functions/command_update_linuxgsm.sh
 delete mode 100644 lgsm/functions/command_validate.sh
 delete mode 100644 lgsm/functions/command_wipe.sh
 delete mode 100644 lgsm/functions/compress_unreal2_maps.sh
 delete mode 100644 lgsm/functions/compress_ut99_maps.sh
 delete mode 100644 lgsm/functions/core_dl.sh
 delete mode 100644 lgsm/functions/core_exit.sh
 delete mode 100644 lgsm/functions/core_functions.sh
 delete mode 100644 lgsm/functions/core_getopt.sh
 delete mode 100644 lgsm/functions/core_github.sh
 delete mode 100644 lgsm/functions/core_legacy.sh
 delete mode 100644 lgsm/functions/core_logs.sh
 delete mode 100644 lgsm/functions/core_messages.sh
 delete mode 100644 lgsm/functions/core_modules.sh
 delete mode 100644 lgsm/functions/core_steamcmd.sh
 delete mode 100644 lgsm/functions/core_trap.sh
 delete mode 100644 lgsm/functions/fix.sh
 delete mode 100644 lgsm/functions/fix_ark.sh
 delete mode 100644 lgsm/functions/fix_arma3.sh
 delete mode 100644 lgsm/functions/fix_armar.sh
 delete mode 100644 lgsm/functions/fix_av.sh
 delete mode 100644 lgsm/functions/fix_bo.sh
 delete mode 100644 lgsm/functions/fix_bt.sh
 delete mode 100644 lgsm/functions/fix_cmw.sh
 delete mode 100644 lgsm/functions/fix_csgo.sh
 delete mode 100644 lgsm/functions/fix_dst.sh
 delete mode 100644 lgsm/functions/fix_hw.sh
 delete mode 100644 lgsm/functions/fix_ins.sh
 delete mode 100644 lgsm/functions/fix_kf.sh
 delete mode 100644 lgsm/functions/fix_kf2.sh
 delete mode 100644 lgsm/functions/fix_lo.sh
 delete mode 100644 lgsm/functions/fix_mcb.sh
 delete mode 100644 lgsm/functions/fix_mta.sh
 delete mode 100644 lgsm/functions/fix_nmrih.sh
 delete mode 100644 lgsm/functions/fix_onset.sh
 delete mode 100644 lgsm/functions/fix_ro.sh
 delete mode 100644 lgsm/functions/fix_rust.sh
 delete mode 100644 lgsm/functions/fix_rw.sh
 delete mode 100644 lgsm/functions/fix_samp.sh
 delete mode 100644 lgsm/functions/fix_sdtd.sh
 delete mode 100644 lgsm/functions/fix_sfc.sh
 delete mode 100644 lgsm/functions/fix_sof2.sh
 delete mode 100644 lgsm/functions/fix_squad.sh
 delete mode 100644 lgsm/functions/fix_st.sh
 delete mode 100644 lgsm/functions/fix_steamcmd.sh
 delete mode 100644 lgsm/functions/fix_terraria.sh
 delete mode 100644 lgsm/functions/fix_tf2.sh
 delete mode 100644 lgsm/functions/fix_ts3.sh
 delete mode 100644 lgsm/functions/fix_unt.sh
 delete mode 100644 lgsm/functions/fix_ut.sh
 delete mode 100644 lgsm/functions/fix_ut2k4.sh
 delete mode 100644 lgsm/functions/fix_ut3.sh
 delete mode 100644 lgsm/functions/fix_vh.sh
 delete mode 100644 lgsm/functions/fix_wurm.sh
 delete mode 100644 lgsm/functions/fix_zmr.sh
 delete mode 100644 lgsm/functions/info_distro.sh
 delete mode 100644 lgsm/functions/info_game.sh
 delete mode 100644 lgsm/functions/info_messages.sh
 delete mode 100644 lgsm/functions/info_stats.sh
 delete mode 100644 lgsm/functions/install_complete.sh
 delete mode 100644 lgsm/functions/install_config.sh
 delete mode 100644 lgsm/functions/install_dst_token.sh
 delete mode 100644 lgsm/functions/install_eula.sh
 delete mode 100644 lgsm/functions/install_factorio_save.sh
 delete mode 100644 lgsm/functions/install_gslt.sh
 delete mode 100644 lgsm/functions/install_header.sh
 delete mode 100644 lgsm/functions/install_logs.sh
 delete mode 100644 lgsm/functions/install_mta_resources.sh
 delete mode 100644 lgsm/functions/install_retry.sh
 delete mode 100644 lgsm/functions/install_server_dir.sh
 delete mode 100644 lgsm/functions/install_server_files.sh
 delete mode 100644 lgsm/functions/install_squad_license.sh
 delete mode 100644 lgsm/functions/install_stats.sh
 delete mode 100644 lgsm/functions/install_steamcmd.sh
 delete mode 100644 lgsm/functions/install_ts3db.sh
 delete mode 100644 lgsm/functions/install_ut2k4_key.sh
 delete mode 100644 lgsm/functions/mods_core.sh
 delete mode 100644 lgsm/functions/mods_list.sh
 delete mode 100644 lgsm/functions/query_gamedig.sh
 delete mode 100644 lgsm/functions/query_gsquery.py
 delete mode 100644 lgsm/functions/update_factorio.sh
 delete mode 100644 lgsm/functions/update_jediknight2.sh
 delete mode 100644 lgsm/functions/update_minecraft.sh
 delete mode 100644 lgsm/functions/update_minecraft_bedrock.sh
 delete mode 100644 lgsm/functions/update_mta.sh
 delete mode 100644 lgsm/functions/update_papermc.sh
 delete mode 100644 lgsm/functions/update_steamcmd.sh
 delete mode 100644 lgsm/functions/update_ts3.sh
 delete mode 100644 lgsm/functions/update_ut99.sh
 delete mode 100644 lgsm/functions/update_vintagestory.sh
 delete mode 100644 lgsm/modules/core_functions.sh

diff --git a/lgsm/functions/README.md b/lgsm/functions/README.md
deleted file mode 100644
index de008ecfa..000000000
--- a/lgsm/functions/README.md
+++ /dev/null
@@ -1,17 +0,0 @@
-# LinuxGSM - Modules
-
-These modules are scripts that are called upon by the primary script linuxgsm.sh
-
-## Module Names
-
-Modules have been named to give an idea of what the function does.
-
--   core: Essential modules that will always run first.
--   command: Primary command function.
--   check: Runs checks that will either halt on or fix an issue.
--   dev: development modules.
--   fix: Applies a game server specific fix.
--   info: retrieves information from a source such as config file or the OS.
--   install: modules related to the installer.
--   monitor: modules related to monitor.
--   update: modules that update the game server.
diff --git a/lgsm/functions/alert.sh b/lgsm/functions/alert.sh
deleted file mode 100644
index 59deae2b6..000000000
--- a/lgsm/functions/alert.sh
+++ /dev/null
@@ -1,238 +0,0 @@
-#!/bin/bash
-# LinuxGSM alert.sh module
-# Author: Daniel Gibbs
-# Contributors: http://linuxgsm.com/contrib
-# Website: https://linuxgsm.com
-# Description: Overall function for managing alerts.
-
-functionselfname="$(basename "$(readlink -f "${BASH_SOURCE[0]}")")"
-
-# Generates alert log of the details at the time of the alert.
-# Used with email alerts.
-fn_alert_log() {
-	info_distro.sh
-	info_game.sh
-	info_messages.sh
-	if [ -f "${alertlog}" ]; then
-		rm -f "${alertlog:?}"
-	fi
-
-	{
-		fn_info_message_head
-		fn_info_message_distro
-		fn_info_message_server_resource
-		fn_info_message_gameserver_resource
-		fn_info_message_gameserver
-		fn_info_logs
-	} | sed -r "s/\x1B\[([0-9]{1,2}(;[0-9]{1,2})?)?[m|K]//g" | tee -a "${alertlog}" > /dev/null 2>&1
-}
-
-fn_alert_test() {
-	fn_script_log_info "Sending test alert"
-	alertsubject="Alert - ${selfname} - Test"
-	alertemoji="🚧"
-	alertsound="1"
-	alerturl="not enabled"
-	alertbody="Testing LinuxGSM Alert. No action to be taken."
-}
-
-fn_alert_restart() {
-	fn_script_log_info "Sending alert: Restarted: ${executable} not running"
-	alertsubject="Alert - ${selfname} - Restarted"
-	alertemoji="🚨"
-	alertsound="2"
-	alerturl="not enabled"
-	alertbody="${selfname} ${executable} not running"
-}
-
-fn_alert_restart_query() {
-	fn_script_log_info "Sending alert: Restarted: ${selfname}"
-	alertsubject="Alert - ${selfname} - Restarted"
-	alertemoji="🚨"
-	alertsound="2"
-	alerturl="not enabled"
-	alertbody="Unable to query: ${selfname}"
-}
-
-fn_alert_update() {
-	fn_script_log_info "Sending alert: Updated"
-	alertsubject="Alert - ${selfname} - Updated"
-	alertemoji="🎮"
-	alertsound="1"
-	alerturl="not enabled"
-	alertbody="${gamename} received update: ${remotebuildversion}"
-}
-
-fn_alert_check_update() {
-	fn_script_log_info "Sending alert: Update available"
-	alertsubject="Alert - ${selfname} - Update available"
-	alertemoji="🎮"
-	alertsound="1"
-	alerturl="not enabled"
-	alertbody="${gamename} update available: ${remotebuildversion}"
-}
-
-fn_alert_permissions() {
-	fn_script_log_info "Sending alert: Permissions error"
-	alertsubject="Alert - ${selfname}: Permissions error"
-	alertemoji="❗"
-	alertsound="2"
-	alerturl="not enabled"
-	alertbody="${selfname} has permissions issues"
-}
-
-fn_alert_config() {
-	fn_script_log_info "Sending alert: New _default.cfg"
-	alertsubject="Alert - ${selfname} - New _default.cfg"
-	alertemoji="🎮"
-	alertsound="1"
-	alerturl="not enabled"
-	alertbody="${selfname} has received a new _default.cfg. Check file for changes."
-}
-
-if [ "${alert}" == "permissions" ]; then
-	fn_alert_permissions
-elif [ "${alert}" == "restart" ]; then
-	fn_alert_restart
-elif [ "${alert}" == "restartquery" ]; then
-	fn_alert_restart_query
-elif [ "${alert}" == "test" ]; then
-	fn_alert_test
-elif [ "${alert}" == "update" ]; then
-	fn_alert_update
-elif [ "${alert}" == "check-update" ]; then
-	fn_alert_check_update
-elif [ "${alert}" == "config" ]; then
-	fn_alert_config
-fi
-
-# Generate alert log.
-fn_alert_log
-
-# Generates the more info link.
-if [ "${postalert}" == "on" ] && [ -n "${postalert}" ]; then
-	exitbypass=1
-	command_postdetails.sh
-	fn_firstcommand_reset
-	unset exitbypass
-elif [ "${postalert}" != "on" ] && [ "${commandname}" == "TEST-ALERT" ]; then
-	fn_print_warn_nl "More Info not enabled"
-	fn_script_log_warn "More Info alerts not enabled"
-fi
-
-if [ "${discordalert}" == "on" ] && [ -n "${discordalert}" ]; then
-	alert_discord.sh
-elif [ "${discordalert}" != "on" ] && [ "${commandname}" == "TEST-ALERT" ]; then
-	fn_print_warn_nl "Discord alerts not enabled"
-	fn_script_log_warn "Discord alerts not enabled"
-elif [ -z "${discordtoken}" ] && [ "${commandname}" == "TEST-ALERT" ]; then
-	fn_print_error_nl "Discord token not set"
-	echo -e "* https://docs.linuxgsm.com/alerts/discord"
-	fn_script_error "Discord token not set"
-fi
-
-if [ "${emailalert}" == "on" ] && [ -n "${email}" ]; then
-	alert_email.sh
-elif [ "${emailalert}" != "on" ] && [ "${commandname}" == "TEST-ALERT" ]; then
-	fn_print_warn_nl "Email alerts not enabled"
-	fn_script_log_warn "Email alerts not enabled"
-elif [ -z "${email}" ] && [ "${commandname}" == "TEST-ALERT" ]; then
-	fn_print_error_nl "Email not set"
-	fn_script_log_error "Email not set"
-fi
-
-if [ "${gotifyalert}" == "on" ] && [ -n "${gotifyalert}" ]; then
-	alert_gotify.sh
-elif [ "${gotifyalert}" != "on" ] && [ "${commandname}" == "TEST-ALERT" ]; then
-	fn_print_warn_nl "Gotify alerts not enabled"
-	fn_script_log_warn "Gotify alerts not enabled"
-elif [ -z "${gotifytoken}" ] && [ "${commandname}" == "TEST-ALERT" ]; then
-	fn_print_error_nl "Gotify token not set"
-	echo -e "* https://docs.linuxgsm.com/alerts/gotify"
-	fn_script_error "Gotify token not set"
-elif [ -z "${gotifywebhook}" ] && [ "${commandname}" == "TEST-ALERT" ]; then
-	fn_print_error_nl "Gotify webhook not set"
-	echo -e "* https://docs.linuxgsm.com/alerts/gotify"
-	fn_script_error "Gotify webhook not set"
-fi
-
-if [ "${iftttalert}" == "on" ] && [ -n "${iftttalert}" ]; then
-	alert_ifttt.sh
-elif [ "${iftttalert}" != "on" ] && [ "${commandname}" == "TEST-ALERT" ]; then
-	fn_print_warn_nl "IFTTT alerts not enabled"
-	fn_script_log_warn "IFTTT alerts not enabled"
-elif [ -z "${ifttttoken}" ] && [ "${commandname}" == "TEST-ALERT" ]; then
-	fn_print_error_nl "IFTTT token not set"
-	echo -e "* https://docs.linuxgsm.com/alerts/ifttt"
-	fn_script_error "IFTTT token not set"
-fi
-
-if [ "${mailgunalert}" == "on" ] && [ -n "${mailgunalert}" ]; then
-	alert_mailgun.sh
-elif [ "${mailgunalert}" != "on" ] && [ "${commandname}" == "TEST-ALERT" ]; then
-	fn_print_warn_nl "Mailgun alerts not enabled"
-	fn_script_log_warn "Mailgun alerts not enabled"
-elif [ -z "${mailguntoken}" ] && [ "${commandname}" == "TEST-ALERT" ]; then
-	fn_print_error_nl "Mailgun token not set"
-	echo -e "* https://docs.linuxgsm.com/alerts/mailgun"
-	fn_script_error "Mailgun token not set"
-fi
-
-if [ "${pushbulletalert}" == "on" ] && [ -n "${pushbullettoken}" ]; then
-	alert_pushbullet.sh
-elif [ "${pushbulletalert}" != "on" ] && [ "${commandname}" == "TEST-ALERT" ]; then
-	fn_print_warn_nl "Pushbullet alerts not enabled"
-	fn_script_log_warn "Pushbullet alerts not enabled"
-elif [ -z "${pushbullettoken}" ] && [ "${commandname}" == "TEST-ALERT" ]; then
-	fn_print_error_nl "Pushbullet token not set"
-	echo -e "* https://docs.linuxgsm.com/alerts/pushbullet"
-	fn_script_error "Pushbullet token not set"
-fi
-
-if [ "${pushoveralert}" == "on" ] && [ -n "${pushoveralert}" ]; then
-	alert_pushover.sh
-elif [ "${pushoveralert}" != "on" ] && [ "${commandname}" == "TEST-ALERT" ]; then
-	fn_print_warn_nl "Pushover alerts not enabled"
-	fn_script_log_warn "Pushover alerts not enabled"
-elif [ -z "${pushovertoken}" ] && [ "${commandname}" == "TEST-ALERT" ]; then
-	fn_print_error_nl "Pushover token not set"
-	echo -e "* https://docs.linuxgsm.com/alerts/pushover"
-	fn_script_error "Pushover token not set"
-fi
-
-if [ "${telegramalert}" == "on" ] && [ -n "${telegramtoken}" ]; then
-	alert_telegram.sh
-elif [ "${telegramalert}" != "on" ] && [ "${commandname}" == "TEST-ALERT" ]; then
-	fn_print_warn_nl "Telegram Messages not enabled"
-	fn_script_log_warn "Telegram Messages not enabled"
-elif [ -z "${telegramtoken}" ] && [ "${commandname}" == "TEST-ALERT" ]; then
-	fn_print_error_nl "Telegram token not set."
-	echo -e "* https://docs.linuxgsm.com/alerts/telegram"
-	fn_script_error "Telegram token not set."
-elif [ -z "${telegramchatid}" ] && [ "${commandname}" == "TEST-ALERT" ]; then
-	fn_print_error_nl "Telegram chat id not set."
-	echo -e "* https://docs.linuxgsm.com/alerts/telegram"
-	fn_script_error "Telegram chat id not set."
-fi
-
-if [ "${rocketchatalert}" == "on" ] && [ -n "${rocketchatalert}" ]; then
-	alert_rocketchat.sh
-elif [ "${rocketchatalert}" != "on" ] && [ "${commandname}" == "TEST-ALERT" ]; then
-	fn_print_warn_nl "Rocketchat alerts not enabled"
-	fn_script_log_warn "Rocketchat alerts not enabled"
-elif [ -z "${rocketchattoken}" ] && [ "${commandname}" == "TEST-ALERT" ]; then
-	fn_print_error_nl "Rocketchat token not set"
-	#echo -e "* https://docs.linuxgsm.com/alerts/slack"
-	fn_script_error "Rocketchat token not set"
-fi
-
-if [ "${slackalert}" == "on" ] && [ -n "${slackalert}" ]; then
-	alert_slack.sh
-elif [ "${slackalert}" != "on" ] && [ "${commandname}" == "TEST-ALERT" ]; then
-	fn_print_warn_nl "Slack alerts not enabled"
-	fn_script_log_warn "Slack alerts not enabled"
-elif [ -z "${slacktoken}" ] && [ "${commandname}" == "TEST-ALERT" ]; then
-	fn_print_error_nl "Slack token not set"
-	echo -e "* https://docs.linuxgsm.com/alerts/slack"
-	fn_script_error "Slack token not set"
-fi
diff --git a/lgsm/functions/alert_discord.sh b/lgsm/functions/alert_discord.sh
deleted file mode 100644
index 770817516..000000000
--- a/lgsm/functions/alert_discord.sh
+++ /dev/null
@@ -1,59 +0,0 @@
-#!/bin/bash
-# LinuxGSM alert_discord.sh module
-# Author: Daniel Gibbs
-# Contributors: http://linuxgsm.com/contrib
-# Website: https://linuxgsm.com
-# Description: Sends Discord alert.
-
-functionselfname="$(basename "$(readlink -f "${BASH_SOURCE[0]}")")"
-
-json=$(
-	cat << EOF
-{
-	"username":"LinuxGSM",
-	"avatar_url":"https://raw.githubusercontent.com/${githubuser}/${githubrepo}/${githubbranch}/lgsm/data/alert_discord_logo.jpg",
-	"file":"content",
-	"embeds": [{
-		"color": "2067276",
-		"author": {
-			"name": "${alertemoji} ${alertsubject} ${alertemoji}",
-			"icon_url": "https://raw.githubusercontent.com/${githubuser}/${githubrepo}/${githubbranch}/lgsm/data/alert_discord_logo.jpg"
-		},
-		"title": "${servername}",
-		"description": "${alertbody} \n More info: ${alerturl}",
-		"url": "",
-		"type": "content",
-		"thumbnail": {},
-		"fields": [
-			{
-				"name": "Game",
-				"value": "${gamename}",
-				"inline": true
-			},
-			{
-				"name": "Server IP",
-				"value": "[${alertip}:${port}](https://www.gametracker.com/server_info/${alertip}:${port})",
-				"inline": true
-			},
-			{
-				"name": "Hostname",
-				"value": "${HOSTNAME}",
-				"inline": true
-			}
-		]
-	}]
-}
-EOF
-)
-
-fn_print_dots "Sending Discord alert"
-
-discordsend=$(curl --connect-timeout 10 -sSL -H "Content-Type: application/json" -X POST -d "$(echo -n "${json}" | jq -c .)" "${discordwebhook}")
-
-if [ -n "${discordsend}" ]; then
-	fn_print_fail_nl "Sending Discord alert: ${discordsend}"
-	fn_script_log_fatal "Sending Discord alert: ${discordsend}"
-else
-	fn_print_ok_nl "Sending Discord alert"
-	fn_script_log_pass "Sending Discord alert"
-fi
diff --git a/lgsm/functions/alert_email.sh b/lgsm/functions/alert_email.sh
deleted file mode 100644
index ad90e880f..000000000
--- a/lgsm/functions/alert_email.sh
+++ /dev/null
@@ -1,25 +0,0 @@
-#!/bin/bash
-# LinuxGSM alert_email.sh module
-# Author: Daniel Gibbs
-# Contributors: http://linuxgsm.com/contrib
-# Website: https://linuxgsm.com
-# Description: Sends email alert.
-
-functionselfname="$(basename "$(readlink -f "${BASH_SOURCE[0]}")")"
-
-fn_print_dots "Sending Email alert: ${email}"
-fn_sleep_time
-
-if [ -n "${emailfrom}" ]; then
-	mail -s "${alertsubject}" -r "${emailfrom}" "${email}" < "${alertlog}"
-else
-	mail -s "${alertsubject}" "${email}" < "${alertlog}"
-fi
-exitcode=$?
-if [ "${exitcode}" == "0" ]; then
-	fn_print_ok_nl "Sending Email alert: ${email}"
-	fn_script_log_pass "Sending Email alert: ${email}"
-else
-	fn_print_fail_nl "Sending Email alert: ${email}"
-	fn_script_log_fatal "Sending Email alert: ${email}"
-fi
diff --git a/lgsm/functions/alert_gotify.sh b/lgsm/functions/alert_gotify.sh
deleted file mode 100644
index faeba4593..000000000
--- a/lgsm/functions/alert_gotify.sh
+++ /dev/null
@@ -1,30 +0,0 @@
-#!/bin/bash
-# LinuxGSM alert_gotify.sh module
-# Author: Daniel Gibbs
-# Contributors: http://linuxgsm.com/contrib
-# Website: https://linuxgsm.com
-# Description: Sends Gotify alert.
-
-functionselfname="$(basename "$(readlink -f "${BASH_SOURCE[0]}")")"
-
-json=$(
-	cat << EOF
-{
-	"title": "${alertemoji} ${alertsubject} ${alertemoji}",
-	"message": "Server name\n${servername}\n\nMessage\n${alertbody}\n\nGame\n${gamename}\n\nServer IP\n${alertip}:${port}\n\nHostname\n${HOSTNAME}\n\nMore info\n${alerturl}",
-	"priority": 5
-}
-EOF
-)
-
-fn_print_dots "Sending Gotify alert"
-
-gotifysend=$(curl --connect-timeout 10 -sSL "${gotifywebhook}/message"?token="${gotifytoken}" -H "Content-Type: application/json" -X POST -d "$(echo -n "${json}" | jq -c .)")
-
-if [ -n "${gotifysend}" ]; then
-	fn_print_ok_nl "Sending Gotify alert"
-	fn_script_log_pass "Sending Gotify alert"
-else
-	fn_print_fail_nl "Sending Gotify alert: ${gotifysend}"
-	fn_script_log_fatal "Sending Gotify alert: ${gotifysend}"
-fi
diff --git a/lgsm/functions/alert_ifttt.sh b/lgsm/functions/alert_ifttt.sh
deleted file mode 100644
index f8bbc24ad..000000000
--- a/lgsm/functions/alert_ifttt.sh
+++ /dev/null
@@ -1,29 +0,0 @@
-#!/bin/bash
-# LinuxGSM alert_ifttt.sh module
-# Author: Daniel Gibbs
-# Contributors: http://linuxgsm.com/contrib
-# Website: https://linuxgsm.com
-# Description: Sends IFTTT alert.
-
-functionselfname="$(basename "$(readlink -f "${BASH_SOURCE[0]}")")"
-
-json=$(
-	cat << EOF
-{
-	"value1": "${selfname}",
-	"value2": "${alertemoji} ${alertsubject} ${alertemoji}",
-	"value3": "Message: \n${alertbody}\n\nGame: \n${gamename}\n\nServer name: \n${servername}\n\nHostname: \n${HOSTNAME}\n\nServer IP: \n${alertip}:${port}\n\nMore info: \n${alerturl}"
-}
-EOF
-)
-
-fn_print_dots "Sending IFTTT alert"
-iftttsend=$(curl --connect-timeout 10 -sSL -H "Content-Type: application/json" -X POST -d "$(echo -n "${json}" | jq -c .)" "https://maker.ifttt.com/trigger/${iftttevent}/with/key/${ifttttoken}" | grep "Bad Request")
-
-if [ -n "${iftttsend}" ]; then
-	fn_print_fail_nl "Sending IFTTT alert: ${pushbulletsend}"
-	fn_script_log_fatal "Sending IFTTT alert: ${pushbulletsend}"
-else
-	fn_print_ok_nl "Sending IFTTT alert"
-	fn_script_log_pass "Sent IFTTT alert"
-fi
diff --git a/lgsm/functions/alert_mailgun.sh b/lgsm/functions/alert_mailgun.sh
deleted file mode 100644
index 25576209c..000000000
--- a/lgsm/functions/alert_mailgun.sh
+++ /dev/null
@@ -1,32 +0,0 @@
-#!/bin/bash
-# LinuxGSM alert_mailgun.sh module
-# Author: Daniel Gibbs
-# Contributors: http://linuxgsm.com/contrib
-# Website: https://linuxgsm.com
-# Description: Sends Mailgun Email alert.
-
-functionselfname="$(basename "$(readlink -f "${BASH_SOURCE[0]}")")"
-
-if [ "${mailgunapiregion}" == "eu" ]; then
-	mailgunapiurl="https://api.eu.mailgun.net"
-else
-	mailgunapiurl="https://api.mailgun.net"
-fi
-
-fn_print_dots "Sending Email alert: Mailgun: ${mailgunemail}"
-
-mailgunsend=$(curl --connect-timeout 10 -s --user "api:${mailguntoken}" \
-	-F from="LinuxGSM <${mailgunemailfrom}>" \
-	-F to="LinuxGSM Admin <${mailgunemail}>" \
-	-F subject="${alertemoji} ${alertsubject} ${alertemoji}" \
-	-F o:tag='alert' \
-	-F o:tag='LinuxGSM' \
-	-F text="$(cat "${alertlog}")" "${mailgunapiurl}/v3/${mailgundomain}/messages")
-
-if [ -z "${mailgunsend}" ]; then
-	fn_print_fail_nl "Sending Email alert: Mailgun: ${mailgunemail}"
-	fn_script_log_fatal "Sending Email alert: Mailgun: ${mailgunemail}"
-else
-	fn_print_ok_nl "Sending Email alert: Mailgun: ${mailgunemail}"
-	fn_script_log_pass "Sending Email alert: Mailgun: ${mailgunemail}"
-fi
diff --git a/lgsm/functions/alert_pushbullet.sh b/lgsm/functions/alert_pushbullet.sh
deleted file mode 100644
index 3e82d0db0..000000000
--- a/lgsm/functions/alert_pushbullet.sh
+++ /dev/null
@@ -1,30 +0,0 @@
-#!/bin/bash
-# LinuxGSM alert_pushbullet.sh module
-# Author: Daniel Gibbs
-# Contributors: http://linuxgsm.com/contrib
-# Website: https://linuxgsm.com
-# Description: Sends Pushbullet Messenger alert.
-
-functionselfname="$(basename "$(readlink -f "${BASH_SOURCE[0]}")")"
-
-json=$(
-	cat << EOF
-{
-	"channel_tag": "${channeltag}",
-	"type": "note",
-	"title": "${alertemoji} ${alertsubject} ${alertemoji}",
-	"body": "Server name\n${servername}\n\nMessage\n${alertbody}\n\nGame\n${gamename}\n\nServer IP\n${alertip}:${port}\n\nHostname\n${HOSTNAME}\n\nMore info\n${alerturl}"
-}
-EOF
-)
-
-fn_print_dots "Sending Pushbullet alert"
-pushbulletsend=$(curl --connect-timeout 10 -sSL -u """${pushbullettoken}"":" -H "Content-Type: application/json" -X POST -d "$(echo -n "${json}" | jq -c .)" "https://api.pushbullet.com/v2/pushes" | grep "error_code")
-
-if [ -n "${pushbulletsend}" ]; then
-	fn_print_fail_nl "Sending Pushbullet alert: ${pushbulletsend}"
-	fn_script_log_fatal "Sending Pushbullet alert: ${pushbulletsend}"
-else
-	fn_print_ok_nl "Sending Pushbullet alert"
-	fn_script_log_pass "Sent Pushbullet alert"
-fi
diff --git a/lgsm/functions/alert_pushover.sh b/lgsm/functions/alert_pushover.sh
deleted file mode 100644
index d7c086478..000000000
--- a/lgsm/functions/alert_pushover.sh
+++ /dev/null
@@ -1,33 +0,0 @@
-#!/bin/bash
-# LinuxGSM alert_pushover.sh module
-# Author: Daniel Gibbs
-# Contributors: http://linuxgsm.com/contrib
-# Website: https://linuxgsm.com
-# Description: Sends Pushover alert.
-
-functionselfname="$(basename "$(readlink -f "${BASH_SOURCE[0]}")")"
-
-fn_print_dots "Sending Pushover alert"
-
-# Different alerts are given different priorities and notification sounds.
-if [ "${alertsound}" == "1" ]; then
-	alertsound=""
-	alertpriority="0"
-elif [ "${alertsound}" == "2" ]; then
-	# restarted.
-	alertsound="siren"
-	alertpriority="1"
-else
-	alertsound=""
-	alertpriority="0"
-fi
-
-pushoversend=$(curl --connect-timeout 10 -sS -F token="${pushovertoken}" -F user="${pushoveruserkey}" -F html="1" -F sound="${alertsound}" -F priority="${alertpriority}" -F title="${alertemoji} ${alertsubject} ${alertemoji}" -F message=" <b>Server name</b><br>${servername}<br><br><b>Message</b><br>${alertbody}<br><br><b>Game</b><br>${gamename}<br><br><b>Server IP</b><br><a href='https://www.gametracker.com/server_info/${alertip}:${port}'>${alertip}:${port}</a><br><br><b>Hostname</b><br>${HOSTNAME}<br><br><b>More info</b><br><a href='${alerturl}'>${alerturl}</a>" "https://api.pushover.net/1/messages.json" | grep errors)
-
-if [ -n "${pushoversend}" ]; then
-	fn_print_fail_nl "Sending Pushover alert: ${pushoversend}"
-	fn_script_log_fatal "Sending Pushover alert: ${pushoversend}"
-else
-	fn_print_ok_nl "Sending Pushover alert"
-	fn_script_log_pass "Sent Pushover alert"
-fi
diff --git a/lgsm/functions/alert_rocketchat.sh b/lgsm/functions/alert_rocketchat.sh
deleted file mode 100644
index 34d018e38..000000000
--- a/lgsm/functions/alert_rocketchat.sh
+++ /dev/null
@@ -1,50 +0,0 @@
-#!/bin/bash
-# LinuxGSM alert_rocketchat.sh module
-# Author: Daniel Gibbs
-# Contributors: http://linuxgsm.com/contrib
-# Website: https://linuxgsm.com
-# Description: Sends Rocketchat alert.
-
-functionselfname="$(basename "$(readlink -f "${BASH_SOURCE[0]}")")"
-
-json=$(
-	cat << EOF
-{
-	"alias": "LinuxGSM",
-	"text": "*${alertemoji} ${alertsubject} ${alertemoji}* \n *${servername}* \n ${alertbody} \n More info: ${alerturl}",
-	"attachments": [
-		{
-			"fields": [
-				{
-					"short": true,
-					"title": "Game:",
-					"value": "${gamename}"
-				},
-				{
-					"short": true,
-					"title": "Server IP:",
-					"value": "${alertip}:${port}"
-				},
-				{
-					"short": true,
-					"title": "Hostname:",
-					"value": "${HOSTNAME}"
-				}
-			]
-		}
-	]
-}
-EOF
-)
-
-fn_print_dots "Sending Rocketchat alert"
-
-rocketchatsend=$(curl --connect-timeout 10 -sSL -H "Content-Type: application/json" -X POST -d "$(echo -n "${json}" | jq -c .)" "${rocketchatwebhook}")
-
-if [ -n "${rocketchatsend}" ]; then
-	fn_print_ok_nl "Sending Rocketchat alert"
-	fn_script_log_pass "Sending Rocketchat alert"
-else
-	fn_print_fail_nl "Sending Rocketchat alert: ${rocketchatsend}"
-	fn_script_log_fatal "Sending Rocketchat alert: ${rocketchatsend}"
-fi
diff --git a/lgsm/functions/alert_slack.sh b/lgsm/functions/alert_slack.sh
deleted file mode 100644
index 2e87c1571..000000000
--- a/lgsm/functions/alert_slack.sh
+++ /dev/null
@@ -1,75 +0,0 @@
-#!/bin/bash
-# LinuxGSM alert_slack.sh module
-# Author: Daniel Gibbs
-# Contributors: http://linuxgsm.com/contrib
-# Website: https://linuxgsm.com
-# Description: Sends Slack alert.
-
-functionselfname="$(basename "$(readlink -f "${BASH_SOURCE[0]}")")"
-
-json=$(
-	cat << EOF
-{
-		"attachments": [
-			{
-				"color": "#36a64f",
-				"blocks": [
-					{
-										"type": "section",
-										"text": {
-												"type": "mrkdwn",
-												"text": "*LinuxGSM Alert*"
-										}
-								},
-								{
-										"type": "section",
-										"text": {
-												"type": "mrkdwn",
-												"text": "*${alertemoji} ${alertsubject}* \n ${alertbody}"
-										}
-								},
-								{
-										"type": "divider"
-								},
-								{
-										"type": "section",
-										"fields": [
-												{
-														"type": "mrkdwn",
-														"text": "*Game:* \n ${gamename}"
-												},
-												{
-														"type": "mrkdwn",
-														"text": "*Server IP:* \n ${alertip}:${port}"
-												},
-												{
-														"type": "mrkdwn",
-														"text": "*Server Name:* \n ${servername}"
-												}
-										]
-								},
-					 {
-										"type": "section",
-										"text": {
-														"type": "mrkdwn",
-														"text": "Hostname: ${HOSTNAME} / More info: ${alerturl}"
-										}
-								}
-						]
-			}
-		]
-}
-EOF
-)
-
-fn_print_dots "Sending Slack alert"
-
-slacksend=$(curl --connect-timeout 10 -sSL -H "Content-Type: application/json" -X POST -d "$(echo -n "${json}" | jq -c .)" "${slackwebhook}")
-
-if [ "${slacksend}" == "ok" ]; then
-	fn_print_ok_nl "Sending Slack alert"
-	fn_script_log_pass "Sending Slack alert"
-else
-	fn_print_fail_nl "Sending Slack alert: ${slacksend}"
-	fn_script_log_fatal "Sending Slack alert: ${slacksend}"
-fi
diff --git a/lgsm/functions/alert_telegram.sh b/lgsm/functions/alert_telegram.sh
deleted file mode 100644
index 27e34beb4..000000000
--- a/lgsm/functions/alert_telegram.sh
+++ /dev/null
@@ -1,30 +0,0 @@
-#!/bin/bash
-# LinuxGSM alert_telegram.sh module
-# Author: Daniel Gibbs
-# Contributors: http://linuxgsm.com/contrib
-# Website: https://linuxgsm.com
-# Description: Sends Telegram Messenger alert.
-
-functionselfname="$(basename "$(readlink -f "${BASH_SOURCE[0]}")")"
-
-json=$(
-	cat << EOF
-{
-	"chat_id": "${telegramchatid}",
-	"parse_mode": "HTML",
-	"text": "<b>${alertemoji} ${alertsubject} ${alertemoji}</b>\n\n<b>Server name</b>\n${servername}\n\n<b>Message</b>\n${alertbody}\n\n<b>Game</b>\n${gamename}\n\n<b>Server IP</b>\n<a href='https://www.gametracker.com/server_info/${alertip}:${port}'>${alertip}:${port}</a>\n\n<b>Hostname</b>\n${HOSTNAME}\n\n<b>More info</b>\n<a href='${alerturl}'>${alerturl}</a>",
-	"disable_web_page_preview": "yes"
-}
-EOF
-)
-
-fn_print_dots "Sending Telegram alert"
-telegramsend=$(curl --connect-timeout 10 -sSL -H "Content-Type: application/json" -X POST -d "$(echo -n "${json}" | jq -c .)" ${curlcustomstring} "https://${telegramapi}/bot${telegramtoken}/sendMessage" | grep "error_code")
-
-if [ -n "${telegramsend}" ]; then
-	fn_print_fail_nl "Sending Telegram alert: ${telegramsend}"
-	fn_script_log_fatal "Sending Telegram alert: ${telegramsend}"
-else
-	fn_print_ok_nl "Sending Telegram alert"
-	fn_script_log_pass "Sent Telegram alert"
-fi
diff --git a/lgsm/functions/check.sh b/lgsm/functions/check.sh
deleted file mode 100644
index e19853424..000000000
--- a/lgsm/functions/check.sh
+++ /dev/null
@@ -1,101 +0,0 @@
-#!/bin/bash
-# LinuxGSM check.sh module
-# Author: Daniel Gibbs
-# Contributors: http://linuxgsm.com/contrib
-# Website: https://linuxgsm.com
-# Description: Overall function for managing checks.
-# Runs checks that will either halt on or fix an issue.
-
-functionselfname="$(basename "$(readlink -f "${BASH_SOURCE[0]}")")"
-
-# Every command that requires checks just references check.sh.
-# check.sh selects which checks to run by using arrays.
-
-if [ "${commandname}" != "INSTALL" ]; then
-	check_root.sh
-fi
-
-if [ "${commandname}" != "UPDATE-LGSM" ]; then
-	check_version.sh
-fi
-
-check_tmuxception.sh
-
-if [ "$(whoami)" != "root" ] || [ -f /.dockerenv ]; then
-	if [ "${commandname}" != "MONITOR" ]; then
-		check_permissions.sh
-	fi
-fi
-
-if [ "${commandname}" != "INSTALL" ] && [ "${commandname}" != "UPDATE-LGSM" ] && [ "${commandname}" != "DETAILS" ] && [ "${commandname}" != "POST-DETAILS" ]; then
-	check_system_dir.sh
-fi
-
-allowed_commands_array=(DEBUG START)
-for allowed_command in "${allowed_commands_array[@]}"; do
-	if [ "${allowed_command}" == "${commandname}" ]; then
-		check_executable.sh
-	fi
-done
-
-if [ "$(whoami)" != "root" ] || [ -f /.dockerenv ]; then
-	allowed_commands_array=(DEBUG START INSTALL)
-	for allowed_command in "${allowed_commands_array[@]}"; do
-		if [ "${allowed_command}" == "${commandname}" ]; then
-			check_glibc.sh
-		fi
-	done
-fi
-
-allowed_commands_array=(BACKUP CHANGE-PASSWORD CONSOLE DEBUG DETAILS FASTDL MAP-COMPRESSOR MODS-INSTALL MODS-REMOVE MODS-UPDATE MONITOR POST-DETAILS RESTART START STOP TEST-ALERT UPDATE UPDATE-LGSM VALIDATE WIPE)
-for allowed_command in "${allowed_commands_array[@]}"; do
-	if [ "${allowed_command}" == "${commandname}" ]; then
-		check_logs.sh
-	fi
-done
-
-allowed_commands_array=(DEBUG START)
-for allowed_command in "${allowed_commands_array[@]}"; do
-	if [ "${allowed_command}" == "${commandname}" ]; then
-		check_deps.sh
-	fi
-done
-
-allowed_commands_array=(CONSOLE DEBUG MONITOR START STOP)
-for allowed_command in "${allowed_commands_array[@]}"; do
-	if [ "${allowed_command}" == "${commandname}" ]; then
-		check_config.sh
-	fi
-done
-
-allowed_commands_array=(DEBUG DETAILS DEV-QUERY-RAW MONITOR POST-DETAILS START STOP)
-for allowed_command in "${allowed_commands_array[@]}"; do
-	if [ "${allowed_command}" == "${commandname}" ]; then
-		if [ -z "${installflag}" ]; then
-			check_ip.sh
-		fi
-	fi
-done
-
-allowed_commands_array=(CHECK-UPDATE DEBUG MONITOR START UPDATE VALIDATE)
-for allowed_command in "${allowed_commands_array[@]}"; do
-	if [ "${allowed_command}" == "${commandname}" ]; then
-		if [ "${appid}" ]; then
-			check_steamcmd.sh
-		fi
-	fi
-done
-
-allowed_commands_array=(CHANGE-PASSWORD DETAILS MONITOR POST-DETAILS START STOP UPDATE VALIDATE)
-for allowed_command in "${allowed_commands_array[@]}"; do
-	if [ "${allowed_command}" == "${commandname}" ]; then
-		check_status.sh
-	fi
-done
-
-allowed_commands_array=(DEBUG START INSTALL)
-for allowed_command in "${allowed_commands_array[@]}"; do
-	if [ "${allowed_command}" == "${commandname}" ]; then
-		check_system_requirements.sh
-	fi
-done
diff --git a/lgsm/functions/check_config.sh b/lgsm/functions/check_config.sh
deleted file mode 100644
index 2c65243eb..000000000
--- a/lgsm/functions/check_config.sh
+++ /dev/null
@@ -1,35 +0,0 @@
-#!/bin/bash
-# LinuxGSM check_config.sh module
-# Author: Daniel Gibbs
-# Contributors: http://linuxgsm.com/contrib
-# Website: https://linuxgsm.com
-# Description: Checks if the server config is missing and warns the user if needed.
-
-functionselfname="$(basename "$(readlink -f "${BASH_SOURCE[0]}")")"
-
-if [ -n "${servercfgfullpath}" ] && [ ! -f "${servercfgfullpath}" ]; then
-	fn_print_dots ""
-	fn_print_warn_nl "Configuration file missing!"
-	echo -e "${servercfgfullpath}"
-	fn_script_log_warn "Configuration file missing!"
-	fn_script_log_warn "${servercfgfullpath}"
-	install_config.sh
-fi
-
-if [ "${shortname}" == "rust" ] && [ -v rconpassword ] && [ -z "${rconpassword}" ]; then
-	fn_print_dots ""
-	fn_print_fail_nl "RCON password is not set"
-	fn_script_log_warn "RCON password is not set"
-elif [ -v rconpassword ] && [ "${rconpassword}" == "CHANGE_ME" ]; then
-	fn_print_dots ""
-	fn_print_warn_nl "Default RCON Password detected"
-	fn_script_log_warn "Default RCON Password detected"
-fi
-
-if [ "${shortname}" == "vh" ] && [ -z "${serverpassword}" ]; then
-	fn_print_fail_nl "serverpassword is not set"
-	fn_script_log_fatal "serverpassword is not set"
-elif [ "${shortname}" == "vh" ] && [ "${#serverpassword}" -le "4" ]; then
-	fn_print_fail_nl "serverpassword is to short (min 5 chars)"
-	fn_script_log_fatal "serverpassword is to short (min 5 chars)"
-fi
diff --git a/lgsm/functions/check_deps.sh b/lgsm/functions/check_deps.sh
deleted file mode 100644
index bb8507769..000000000
--- a/lgsm/functions/check_deps.sh
+++ /dev/null
@@ -1,363 +0,0 @@
-#!/bin/bash
-# LinuxGSM check_deps.sh module
-# Author: Daniel Gibbs
-# Contributors: http://linuxgsm.com/contrib
-# Website: https://linuxgsm.com
-# Description: Checks and installs missing dependencies.
-
-functionselfname="$(basename "$(readlink -f "${BASH_SOURCE[0]}")")"
-
-fn_install_mono_repo() {
-	if [ "${autodepinstall}" == "0" ]; then
-		fn_print_information_nl "Automatically adding Mono repository."
-		fn_script_log_info "Automatically adding Mono repository."
-		echo -en ".\r"
-		sleep 1
-		echo -en "..\r"
-		sleep 1
-		echo -en "...\r"
-		sleep 1
-		echo -en "   \r"
-		if [ "${distroid}" == "ubuntu" ]; then
-			if [ "${distroversion}" == "20.04" ]; then
-				cmd="sudo apt install gnupg ca-certificates;sudo apt-key adv --keyserver hkp://keyserver.ubuntu.com:80 --recv-keys 3FA7E0328081BFF6A14DA29AA6A19B38D3D831EF;echo 'deb https://download.mono-project.com/repo/ubuntu stable-focal main' | sudo tee /etc/apt/sources.list.d/mono-official-stable.list;sudo apt update"
-			elif [ "${distroversion}" == "18.04" ]; then
-				cmd="sudo apt install gnupg ca-certificates;sudo apt-key adv --keyserver hkp://keyserver.ubuntu.com:80 --recv-keys 3FA7E0328081BFF6A14DA29AA6A19B38D3D831EF;echo 'deb https://download.mono-project.com/repo/ubuntu stable-bionic main' | sudo tee /etc/apt/sources.list.d/mono-official-stable.list;sudo apt update"
-			elif [ "${distroversion}" == "16.04" ]; then
-				cmd="sudo apt-key adv --keyserver hkp://keyserver.ubuntu.com:80 --recv-keys 3FA7E0328081BFF6A14DA29AA6A19B38D3D831EF;sudo apt install apt-transport-https ca-certificates;echo 'deb https://download.mono-project.com/repo/ubuntu stable-xenial main' | sudo tee /etc/apt/sources.list.d/mono-official-stable.list;sudo apt update"
-			else
-				monoautoinstall="1"
-			fi
-		elif [ "${distroid}" == "debian" ]; then
-			if [ "${distroversion}" == "10" ]; then
-				cmd="sudo apt install apt-transport-https dirmngr gnupg ca-certificates;sudo apt-key adv --keyserver hkp://keyserver.ubuntu.com:80 --recv-keys 3FA7E0328081BFF6A14DA29AA6A19B38D3D831EF;echo 'deb https://download.mono-project.com/repo/debian stable-buster main' | sudo tee /etc/apt/sources.list.d/mono-official-stable.list;sudo apt update"
-			elif [ "${distroversion}" == "9" ]; then
-				cmd="sudo apt install apt-transport-https dirmngr gnupg ca-certificates;sudo apt-key adv --keyserver hkp://keyserver.ubuntu.com:80 --recv-keys 3FA7E0328081BFF6A14DA29AA6A19B38D3D831EF;echo 'deb https://download.mono-project.com/repo/debian stable-stretch main' | sudo tee /etc/apt/sources.list.d/mono-official-stable.list;sudo apt update"
-			else
-				monoautoinstall="1"
-			fi
-		elif [ "${distroid}" == "centos" ] || [ "${distroid}" == "almalinux" ] || [ "${distroid}" == "rocky" ]; then
-			if [ "${distroversion}" == "8" ]; then
-				cmd="sudo rpmkeys --import 'https://keyserver.ubuntu.com/pks/lookup?op=get&search=0x3FA7E0328081BFF6A14DA29AA6A19B38D3D831EF';su -c 'curl https://download.mono-project.com/repo/centos8-stable.repo | tee /etc/yum.repos.d/mono-centos8-stable.repo'"
-			elif [ "${distroversion}" == "7" ]; then
-				cmd="sudo rpmkeys --import 'https://keyserver.ubuntu.com/pks/lookup?op=get&search=0x3FA7E0328081BFF6A14DA29AA6A19B38D3D831EF';su -c 'curl https://download.mono-project.com/repo/centos7-stable.repo | tee /etc/yum.repos.d/mono-centos7-stable.repo'"
-			else
-				monoautoinstall="1"
-			fi
-		elif [ "${distroid}" == "fedora" ]; then
-			if [ "${distroversion}" -ge "29" ]; then
-				cmd="sudo rpm --import 'https://keyserver.ubuntu.com/pks/lookup?op=get&search=0x3FA7E0328081BFF6A14DA29AA6A19B38D3D831EF';su -c 'curl https://download.mono-project.com/repo/centos8-stable.repo | tee /etc/yum.repos.d/mono-centos8-stable.repo';dnf update"
-			else
-				cmd="sudo rpm --import 'https://keyserver.ubuntu.com/pks/lookup?op=get&search=0x3FA7E0328081BFF6A14DA29AA6A19B38D3D831EF';su -c 'curl https://download.mono-project.com/repo/centos7-stable.repo | tee /etc/yum.repos.d/mono-centos7-stable.repo';dnf update"
-			fi
-		else
-			monoautoinstall="1"
-		fi
-
-		# Run the mono repo install.
-		eval "${cmd}"
-
-		# Did Mono repo install correctly?
-		if [ "${monoautoinstall}" != "1" ]; then
-			if [ $? != 0 ]; then
-				fn_print_failure_nl "Unable to install Mono repository."
-				fn_script_log_fatal "Unable to install Mono repository."
-			else
-				fn_print_complete_nl "Installing Mono repository completed."
-				fn_script_log_pass "Installing Mono repository completed."
-			fi
-		fi
-
-		# Mono can not be auto installed with this distro.
-		if [ "${monoautoinstall}" == "1" ]; then
-			fn_print_warning_nl "Mono auto install not available for ${distroname}."
-			echo -e "Follow instructions on Mono website to install."
-			echo -e "https://www.mono-project.com/download/stable/#download-lin"
-			fn_script_log_warn "Unable to install Mono repository. Mono auto install not available for ${distroname}."
-		fi
-
-	else
-		fn_print_information_nl "Installing Mono repository."
-		fn_print_warning_nl "$(whoami) does not have sudo access."
-		echo -e "Follow instructions on Mono website to install."
-		echo -e "https://www.mono-project.com/download/stable/#download-lin"
-		fn_script_log_warn "Unable to install Mono repository. $(whoami) does not have sudo access."
-	fi
-}
-
-fn_deps_email() {
-	# Adds postfix to required dependencies if email alert is enabled.
-	if [ "${emailalert}" == "on" ]; then
-		if [ -f /usr/bin/mailx ]; then
-			if [ -d /etc/exim4 ]; then
-				array_deps_required+=(exim4)
-			elif [ -d /etc/sendmail ]; then
-				array_deps_required+=(sendmail)
-			elif [ "$(command -v dpkg-query 2> /dev/null)" ]; then
-				array_deps_required+=(mailutils postfix)
-			elif [ "$(command -v rpm 2> /dev/null)" ]; then
-				array_deps_required+=(mailx postfix)
-			fi
-		else
-			if [ "$(command -v dpkg-query 2> /dev/null)" ]; then
-				array_deps_required+=(mailutils postfix)
-			elif [ "$(command -v rpm 2> /dev/null)" ]; then
-				array_deps_required+=(mailx postfix)
-			fi
-		fi
-	fi
-}
-
-fn_install_missing_deps() {
-	# If any dependencies are not installed.
-	if [ "${#array_deps_missing[*]}" != "0" ]; then
-		if [ "${commandname}" == "INSTALL" ]; then
-			fn_print_warning_nl "Missing dependencies: ${red}${array_deps_missing[*]}${default}"
-			fn_script_log_warn "Missing dependencies: ${array_deps_missing[*]}"
-		else
-			fn_print_dots "Missing dependencies"
-			fn_print_warn "Missing dependencies: ${red}${array_deps_missing[*]}${default}"
-			fn_script_log_warn "Missing dependencies: ${array_deps_missing[*]}"
-		fi
-		fn_sleep_time
-
-		# Attempt automatic dependency installation
-		if [ "${autoinstall}" == "1" ]; then
-			sudo -n true > /dev/null 2>&1
-		else
-			sudo -v > /dev/null 2>&1
-		fi
-		autodepinstall="$?"
-
-		if [ "${monostatus}" == "1" ]; then
-			fn_install_mono_repo
-		fi
-
-		if [ "${commandname}" == "INSTALL" ]; then
-			if [ "${autodepinstall}" == "0" ]; then
-				fn_print_information_nl "$(whoami) has sudo access."
-				fn_script_log_info "$(whoami) has sudo access."
-			else
-				fn_print_warning_nl "$(whoami) does not have sudo access. Manually install dependencies."
-				fn_script_log_warn "$(whoami) does not have sudo access. Manually install dependencies."
-			fi
-		fi
-
-		# Add sudo dpkg --add-architecture i386 if using i386 packages.
-		if [ "$(command -v dpkg-query 2> /dev/null)" ]; then
-			if printf '%s\n' "${array_deps_required[@]}" | grep -q -P 'i386'; then
-				i386installcommand="sudo dpkg --add-architecture i386; "
-			fi
-		fi
-
-		# If automatic dependency install is available
-		if [ "${autodepinstall}" == "0" ]; then
-			fn_print_information_nl "Automatically installing missing dependencies."
-			fn_script_log_info "Automatically installing missing dependencies."
-			echo -en ".\r"
-			sleep 1
-			echo -en "..\r"
-			sleep 1
-			echo -en "...\r"
-			sleep 1
-			echo -en "   \r"
-			if [ "$(command -v dpkg-query 2> /dev/null)" ]; then
-				cmd="echo steamcmd steam/question select \"I AGREE\" | sudo debconf-set-selections; echo steamcmd steam/license note '' | sudo debconf-set-selections; ${i386installcommand}sudo apt-get update; sudo apt-get -y install ${array_deps_missing[*]}"
-				eval "${cmd}"
-			elif [ "$(command -v dnf 2> /dev/null)" ]; then
-				cmd="sudo dnf -y install ${array_deps_missing[*]}"
-				eval "${cmd}"
-			elif [ "$(command -v yum 2> /dev/null)" ]; then
-				cmd="sudo yum -y install ${array_deps_missing[*]}"
-				eval "${cmd}"
-			fi
-			autodepinstall="$?"
-
-			# If auto install passes remove steamcmd install failure.
-			if [ "${autodepinstall}" == "0" ]; then
-				unset steamcmdfail
-			fi
-		fi
-
-		# If automatic dependency install is unavailable.
-		if [ "${autodepinstall}" != "0" ]; then
-			if [ "$(command -v dpkg-query 2> /dev/null)" ]; then
-				echo -e "${i386installcommand}sudo apt update; sudo apt install ${array_deps_missing[*]}"
-			elif [ "$(command -v dnf 2> /dev/null)" ]; then
-				echo -e "sudo dnf install ${array_deps_missing[*]}"
-			elif [ "$(command -v yum 2> /dev/null)" ]; then
-				echo -e "sudo yum install ${array_deps_missing[*]}"
-			fi
-		fi
-
-		if [ "${steamcmdfail}" ]; then
-			if [ "${commandname}" == "INSTALL" ]; then
-				fn_print_failure_nl "Missing dependencies required to run SteamCMD."
-				fn_script_log_fatal "Missing dependencies required to run SteamCMD."
-				core_exit.sh
-			else
-				fn_print_error_nl "Missing dependencies required to run SteamCMD."
-				fn_script_log_error "Missing dependencies required to run SteamCMD."
-			fi
-		fi
-
-	else
-		if [ "${commandname}" == "INSTALL" ]; then
-			fn_print_information_nl "Required dependencies already installed."
-			fn_script_log_info "Required dependencies already installed."
-		fi
-	fi
-}
-
-fn_check_loop() {
-	# Loop though required depenencies checking if they are installed.
-	for deptocheck in ${array_deps_required[*]}; do
-		fn_deps_detector
-	done
-
-	# user will be informed of any missing dependencies.
-	fn_install_missing_deps
-}
-
-# Checks if dependency is installed or not.
-fn_deps_detector() {
-	## Check.
-	# SteamCMD: Will be removed from required array if no appid is present or non-free repo is not available.
-	# This will cause SteamCMD to be installed using tar.
-	if [ "${deptocheck}" == "libsdl2-2.0-0:i386" ] && [ -z "${appid}" ]; then
-		array_deps_required=("${array_deps_required[@]/libsdl2-2.0-0:i386/}")
-		steamcmdstatus=1
-	elif [ "${deptocheck}" == "steamcmd" ] && [ -z "${appid}" ]; then
-		array_deps_required=("${array_deps_required[@]/steamcmd/}")
-		steamcmdstatus=1
-	elif [ "${deptocheck}" == "steamcmd" ] && [ "${distroid}" == "debian" ] && ! grep -qE "^deb .*non-free" /etc/apt/sources.list; then
-		array_deps_required=("${array_deps_required[@]/steamcmd/}")
-		steamcmdstatus=1
-	# Java: Added for users using Oracle JRE to bypass check.
-	elif [[ ${deptocheck} == "openjdk"* ]] || [[ ${deptocheck} == "java"* ]]; then
-		# Is java already installed?
-		if [ -n "${javaversion}" ]; then
-			# Added for users using Oracle JRE to bypass check.
-			depstatus=0
-			deptocheck="${javaversion}"
-		else
-			depstatus=1
-		fi
-	# Mono: A Mono repo needs to be installed.
-	elif [ "${deptocheck}" == "mono-complete" ]; then
-		if [ -n "${monoversion}" ] && [ "${monoversion}" -ge "5" ]; then
-			# Mono >= 5.0.0 already installed.
-			depstatus=0
-			monostatus=0
-		else
-			# Mono not installed or installed Mono < 5.0.0.
-			depstatus=1
-			monostatus=1
-		fi
-	elif [ "$(command -v dpkg-query 2> /dev/null)" ]; then
-		dpkg-query -W -f='${Status}' "${deptocheck}" 2> /dev/null | grep -q -P '^install ok installed'
-		depstatus=$?
-	elif [ "$(command -v dnf 2> /dev/null)" ]; then
-		dnf list installed "${deptocheck}" > /dev/null 2>&1
-		depstatus=$?
-	elif [ "$(command -v rpm 2> /dev/null)" ]; then
-		rpm -q "${deptocheck}" > /dev/null 2>&1
-		depstatus=$?
-	fi
-
-	# Outcome of Check.
-	if [ "${steamcmdstatus}" == "1" ]; then
-		# If SteamCMD is not available in repo dont check for it.
-		unset steamcmdstatus
-	elif [ "${depstatus}" == "0" ]; then
-		# If dependency is found.
-		missingdep=0
-		if [ "${commandname}" == "INSTALL" ]; then
-			echo -e "${green}${deptocheck}${default}"
-			sleep 0.1
-		fi
-	elif [ "${depstatus}" != "0" ]; then
-		# If dependency is not found.
-		missingdep=1
-		if [ "${commandname}" == "INSTALL" ]; then
-			echo -e "${red}${deptocheck}${default}"
-			sleep 0.1
-		fi
-		# If SteamCMD requirements are not met install will fail.
-		if [ -n "${appid}" ]; then
-			for steamcmddeptocheck in ${array_deps_required_steamcmd[*]}; do
-				if [ "${deptocheck}" != "steamcmd" ] && [ "${deptocheck}" == "${steamcmddeptocheck}" ]; then
-					steamcmdfail=1
-				fi
-			done
-		fi
-	fi
-	unset depstatus
-
-	# Missing dependencies are added to array_deps_missing.
-	if [ "${missingdep}" == "1" ]; then
-		array_deps_missing+=("${deptocheck}")
-	fi
-}
-
-if [ "${commandname}" == "INSTALL" ]; then
-	if [ "$(whoami)" == "root" ] && [ ! -f /.dockerenv ]; then
-		echo -e ""
-		echo -e "${lightyellow}Checking Dependencies as root${default}"
-		echo -e "================================="
-		fn_print_information_nl "Checking any missing dependencies for ${gamename} server only."
-		fn_print_information_nl "This will NOT install a ${gamename} server."
-		fn_sleep_time
-	else
-		echo -e ""
-		echo -e "${lightyellow}Checking Dependencies${default}"
-		echo -e "================================="
-	fi
-fi
-
-# Will warn user if their distro is no longer supported by the vendor.
-if [ -n "${distrosupport}" ]; then
-	if [ "${distrosupport}" == "unsupported" ]; then
-		fn_print_warning_nl "${distroname} is no longer supported by the vendor. Upgrading is recommended."
-		fn_script_log_warn "${distroname} is no longer supported by the vendor. Upgrading is recommended."
-	fi
-fi
-
-info_distro.sh
-
-if [ ! -f "${tmpdir}/dependency-no-check.tmp" ] && [ ! -f "${datadir}/${distroid}-${distroversioncsv}.csv" ]; then
-	# Check that the distro dependency csv file exists.
-	fn_check_file_github "lgsm/data" "${distroid}-${distroversioncsv}.csv"
-	if [ -n "${checkflag}" ] && [ "${checkflag}" == "0" ]; then
-		fn_fetch_file_github "lgsm/data" "${distroid}-${distroversioncsv}.csv" "lgsm/data" "chmodx" "norun" "noforce" "nohash"
-	fi
-fi
-
-# If the file successfully downloaded run the dependency check.
-if [ -f "${datadir}/${distroid}-${distroversioncsv}.csv" ]; then
-	depall=$(awk -F, '$1=="all" {$1=""; print $0}' "${datadir}/${distroid}-${distroversioncsv}.csv")
-	depsteamcmd=$(awk -F, '$1=="steamcmd" {$1=""; print $0}' "${datadir}/${distroid}-${distroversioncsv}.csv")
-	depshortname=$(awk -v shortname="${shortname}" -F, '$1==shortname {$1=""; print $0}' "${datadir}/${distroid}-${distroversioncsv}.csv")
-
-	# Generate array of missing deps.
-	array_deps_missing=()
-
-	array_deps_required=("${depall} ${depsteamcmd} ${depshortname}")
-	array_deps_required_steamcmd=("${depsteamcmd}")
-	fn_deps_email
-	# Unique sort dependency array.
-	IFS=" " read -r -a array_deps_required <<< "$(echo "${array_deps_required[@]}" | tr ' ' '\n' | sort -u | tr '\n' ' ')"
-
-	fn_check_loop
-# Warn the user that dependency checking is unavailable for their distro.
-elif [ "${commandname}" == "INSTALL" ] || [ -n "${checkflag}" ] && [ "${checkflag}" != "0" ]; then
-	fn_print_warning_nl "LinuxGSM dependency checking currently unavailable for ${distroname}."
-	# Prevent future dependency checking if unavailable for the distro.
-	echo "${version}" > "${tmpdir}/dependency-no-check.tmp"
-elif [ -f "${tmpdir}/dependency-no-check.tmp" ]; then
-	# Allow LinuxGSM to try a dependency check if LinuxGSM has been recently updated.
-	nocheckversion=$(cat "${tmpdir}/dependency-no-check.tmp")
-	if [ "${version}" != "${nocheckversion}" ]; then
-		rm -f "${tmpdir:?}/dependency-no-check.tmp"
-	fi
-fi
diff --git a/lgsm/functions/check_executable.sh b/lgsm/functions/check_executable.sh
deleted file mode 100644
index d1b5c3efd..000000000
--- a/lgsm/functions/check_executable.sh
+++ /dev/null
@@ -1,20 +0,0 @@
-#!/bin/bash
-# LinuxGSM check_executable.sh module
-# Author: Daniel Gibbs
-# Contributors: http://linuxgsm.com/contrib
-# Website: https://linuxgsm.com
-# Description: Checks if server executable exists.
-
-functionselfname="$(basename "$(readlink -f "${BASH_SOURCE[0]}")")"
-
-# Check if executable exists
-execname=$(basename "${executable}")
-if [ ! -f "${executabledir}/${execname}" ]; then
-	fn_print_fail_nl "executable was not found"
-	echo -e "* ${executabledir}/${execname}"
-	if [ -d "${lgsmlogdir}" ]; then
-		fn_script_log_fatal "Executable was not found: ${executabledir}/${execname}"
-	fi
-	unset exitbypass
-	core_exit.sh
-fi
diff --git a/lgsm/functions/check_glibc.sh b/lgsm/functions/check_glibc.sh
deleted file mode 100644
index b1a959f5b..000000000
--- a/lgsm/functions/check_glibc.sh
+++ /dev/null
@@ -1,29 +0,0 @@
-#!/bin/bash
-# LinuxGSM check_glibc.sh module
-# Author: Daniel Gibbs
-# Contributors: http://linuxgsm.com/contrib
-# Website: https://linuxgsm.com
-# Description: Checks if the server has the correct Glibc version.
-
-functionselfname="$(basename "$(readlink -f "${BASH_SOURCE[0]}")")"
-
-info_distro.sh
-
-if [ "${glibc}" == "null" ]; then
-	# Glibc is not required.
-	:
-elif [ -z "${glibc}" ]; then
-	fn_print_dots "glibc"
-	fn_print_error_nl "glibc requirement unknown"
-	fn_script_log_error "glibc requirement unknown"
-elif [ "$(printf '%s\n'${glibc}'\n' "${glibcversion}" | sort -V | head -n 1)" != "${glibc}" ]; then
-	fn_print_dots "glibc"
-	fn_print_error_nl "glibc requirements not met"
-	fn_script_log_error "glibc requirements not met"
-	echo -en "\n"
-	echo -e "	* glibc required: ${glibc}"
-	echo -e "	* glibc installed: ${red}${glibcversion}${default}"
-	echo -en "\n"
-	fn_print_information_nl "distro upgrade is required"
-	fn_script_log_info "distro upgrade is required"
-fi
diff --git a/lgsm/functions/check_ip.sh b/lgsm/functions/check_ip.sh
deleted file mode 100644
index 4b8eca5ec..000000000
--- a/lgsm/functions/check_ip.sh
+++ /dev/null
@@ -1,63 +0,0 @@
-#!/bin/bash
-# LinuxGSM check_ip.sh module
-# Author: Daniel Gibbs
-# Contributors: http://linuxgsm.com/contrib
-# Website: https://linuxgsm.com
-# Description: Automatically identifies the server interface IP.
-# If multiple interfaces are detected the user will need to manually set using ip="0.0.0.0".
-
-functionselfname="$(basename "$(readlink -f "${BASH_SOURCE[0]}")")"
-
-info_game.sh
-
-ip_commands_array=("/bin/ip" "/usr/sbin/ip" "ip")
-for ip_command in "${ip_commands_array[@]}"; do
-	if [ "$(command -v "${ip_command}" 2> /dev/null)" ]; then
-		ipcommand="${ip_command}"
-		break
-	fi
-done
-
-ethtool_commands_array=("/bin/ethtool" "/usr/sbin/ethtool" "ethtool")
-for ethtool_command in "${ethtool_commands_array[@]}"; do
-	if [ "$(command -v "${ethtool_command}" 2> /dev/null)" ]; then
-		ethtoolcommand="${ethtool_command}"
-		break
-	fi
-done
-
-mapfile -t current_ips < <(${ipcommand} -o -4 addr | awk '{print $4}' | grep -oe '\([0-9]\{1,3\}\.\?\)\{4\}' | sort -u | grep -v 127.0.0)
-
-function fn_is_valid_ip() {
-	local ip="${1}"
-	# excluding 0.* ips also
-	grep -qEe '^[1-9]+[0-9]*\.[0-9]+\.[0-9]+\.[0-9]+$' <<< "${ip}"
-}
-
-# Check if server has multiple IP addresses
-
-# If the IP variable has been set by user.
-if fn_is_valid_ip "${ip}"; then
-	queryips=("${ip}")
-	webadminip=("${ip}")
-	telnetip=("${ip}")
-# If game config does have an IP set.
-elif fn_is_valid_ip "${configip}"; then
-	queryips=("${configip}")
-	ip="${configip}"
-	webadminip=("${configip}")
-	telnetip=("${configip}")
-# If there is only 1 server IP address.
-# Some IP details can automaticly use the one IP
-elif [ "${#current_ips[@]}" == "1" ]; then
-	queryips=("127.0.0.1" "${current_ips[@]}")
-	ip="0.0.0.0"
-	webadminip=("${current_ips[@]}")
-	telnetip=("${current_ips[@]}")
-# If no ip is set by the user and server has more than one IP.
-else
-	queryips=("127.0.0.1" "${current_ips[@]}")
-	ip="0.0.0.0"
-	webadminip=("${ip}")
-	telnetip=("${ip}")
-fi
diff --git a/lgsm/functions/check_last_update.sh b/lgsm/functions/check_last_update.sh
deleted file mode 100644
index ee86c0ba1..000000000
--- a/lgsm/functions/check_last_update.sh
+++ /dev/null
@@ -1,26 +0,0 @@
-#!/bin/bash
-# LinuxGSM check_last_update.sh module
-# Author: Daniel Gibbs
-# Contributors: http://linuxgsm.com/contrib
-# Website: https://linuxgsm.com
-# Description: Checks lock file to see when last update happened.
-# Will reboot server if instance not rebooted since update.
-
-functionselfname="$(basename "$(readlink -f "${BASH_SOURCE[0]}")")"
-
-if [ -f "${lockdir}/${selfname}-laststart.lock" ]; then
-	laststart=$(cat "${lockdir}/${selfname}-laststart.lock")
-fi
-if [ -f "${lockdir}/lastupdate.lock" ]; then
-	lastupdate=$(cat "${lockdir}/lastupdate.lock")
-fi
-
-check_status.sh
-if [ -f "${lockdir}/lastupdate.lock" ] && [ "${status}" != "0" ]; then
-	if [ ! -f "${lockdir}/${selfname}-laststart.lock" ] || [ "${laststart}" -lt "${lastupdate}" ]; then
-		fn_print_info "${selfname} has not been restarted since last update"
-		fn_script_log_info "${selfname} has not been restarted since last update"
-		command_restart.sh
-		fn_firstcommand_reset
-	fi
-fi
diff --git a/lgsm/functions/check_logs.sh b/lgsm/functions/check_logs.sh
deleted file mode 100644
index fa3df92d1..000000000
--- a/lgsm/functions/check_logs.sh
+++ /dev/null
@@ -1,26 +0,0 @@
-#!/bin/bash
-# LinuxGSM check_logs.sh module
-# Author: Daniel Gibbs
-# Contributors: http://linuxgsm.com/contrib
-# Website: https://linuxgsm.com
-# Description: Checks if log files exist.
-
-functionselfname="$(basename "$(readlink -f "${BASH_SOURCE[0]}")")"
-
-fn_check_logs() {
-	fn_print_dots "Checking for log files"
-	fn_print_info_nl "Checking for log files: Creating log files"
-	checklogs=1
-	install_logs.sh
-}
-
-# Create directories for the script and console logs.
-if [ ! -d "${lgsmlogdir}" ] || [ ! -d "${consolelogdir}" ]; then
-	fn_check_logs
-fi
-
-# Create gamelogdir.
-# If variable exists gamelogdir exists and log/server does not.
-if [ "${gamelogdir}" ] && [ -d "${gamelogdir}" ] && [ ! -d "${logdir}/server" ]; then
-	fn_check_logs
-fi
diff --git a/lgsm/functions/check_permissions.sh b/lgsm/functions/check_permissions.sh
deleted file mode 100644
index 0094456ec..000000000
--- a/lgsm/functions/check_permissions.sh
+++ /dev/null
@@ -1,233 +0,0 @@
-#!/bin/bash
-# LinuxGSM check_permissions.sh
-# Author: Daniel Gibbs
-# Contributors: http://linuxgsm.com/contrib
-# Website: https://linuxgsm.com
-# Description: Checks ownership & permissions of scripts, files and directories.
-
-functionselfname="$(basename "$(readlink -f "${BASH_SOURCE[0]}")")"
-
-fn_check_ownership() {
-	if [ -f "${rootdir}/${selfname}" ]; then
-		if [ "$(find "${rootdir}/${selfname}" -not -user "$(whoami)" | wc -l)" -ne "0" ]; then
-			selfownissue=1
-		fi
-	fi
-	if [ -d "${functionsdir}" ]; then
-		if [ "$(find "${functionsdir}" -not -user "$(whoami)" | wc -l)" -ne "0" ]; then
-			funcownissue=1
-		fi
-	fi
-	if [ -d "${serverfiles}" ]; then
-		if [ "$(find "${serverfiles}" -not -user "$(whoami)" | wc -l)" -ne "0" ]; then
-			filesownissue=1
-		fi
-	fi
-	if [ "${selfownissue}" == "1" ] || [ "${funcownissue}" == "1" ] || [ "${filesownissue}" == "1" ]; then
-		fn_print_fail_nl "Ownership issues found"
-		fn_script_log_fatal "Ownership issues found"
-		fn_print_information_nl "The current user ($(whoami)) does not have ownership of the following files:"
-		fn_script_log_info "The current user ($(whoami)) does not have ownership of the following files:"
-		{
-			echo -e "User\tGroup\tFile\n"
-			if [ "${selfownissue}" == "1" ]; then
-				find "${rootdir}/${selfname}" -not -user "$(whoami)" -printf "%u\t%g\t%p\n"
-			fi
-			if [ "${funcownissue}" == "1" ]; then
-				find "${functionsdir}" -not -user "$(whoami)" -printf "%u\t%g\t%p\n"
-			fi
-			if [ "${filesownissue}" == "1" ]; then
-				find "${serverfiles}" -not -user "$(whoami)" -printf "%u\t%g\t%p\n"
-			fi
-
-		} | column -s $'\t' -t | tee -a "${lgsmlog}"
-		echo -e ""
-		fn_print_information_nl "please see https://docs.linuxgsm.com/support/faq#fail-starting-game-server-permission-issues-found"
-		fn_script_log "For more information, please see https://docs.linuxgsm.com/support/faq#fail-starting-game-server-permission-issues-found"
-		if [ "${monitorflag}" == 1 ]; then
-			alert="permissions"
-			alert.sh
-		fi
-		core_exit.sh
-	fi
-}
-
-fn_check_permissions() {
-	if [ -d "${functionsdir}" ]; then
-		if [ "$(find "${functionsdir}" -type f -not -executable | wc -l)" -ne "0" ]; then
-			fn_print_fail_nl "Permissions issues found"
-			fn_script_log_fatal "Permissions issues found"
-			fn_print_information_nl "The following files are not executable:"
-			fn_script_log_info "The following files are not executable:"
-			{
-				echo -e "File\n"
-				find "${functionsdir}" -type f -not -executable -printf "%p\n"
-			} | column -s $'\t' -t | tee -a "${lgsmlog}"
-			if [ "${monitorflag}" == 1 ]; then
-				alert="permissions"
-				alert.sh
-			fi
-			core_exit.sh
-		fi
-	fi
-
-	# Check rootdir permissions.
-	if [ "${rootdir}" ]; then
-		# Get permission numbers on directory under the form 775.
-		rootdirperm=$(stat -c %a "${rootdir}")
-		# Grab the first and second digit for user and group permission.
-		userrootdirperm="${rootdirperm:0:1}"
-		grouprootdirperm="${rootdirperm:1:1}"
-		if [ "${userrootdirperm}" != "7" ] && [ "${grouprootdirperm}" != "7" ]; then
-			fn_print_fail_nl "Permissions issues found"
-			fn_script_log_fatal "Permissions issues found"
-			fn_print_information_nl "The following directory does not have the correct permissions:"
-			fn_script_log_info "The following directory does not have the correct permissions:"
-			fn_script_log_info "${rootdir}"
-			ls -l "${rootdir}"
-			if [ "${monitorflag}" == 1 ]; then
-				alert="permissions"
-				alert.sh
-			fi
-			core_exit.sh
-		fi
-	fi
-	# Check if executable is executable and attempt to fix it.
-	# First get executable name.
-	execname=$(basename "${executable}")
-	if [ -f "${executabledir}/${execname}" ]; then
-		# Get permission numbers on file under the form 775.
-		execperm=$(stat -c %a "${executabledir}/${execname}")
-		# Grab the first and second digit for user and group permission.
-		userexecperm="${execperm:0:1}"
-		groupexecperm="${execperm:1:1}"
-		# Check for invalid user permission.
-		if [ "${userexecperm}" == "0" ] || [ "${userexecperm}" == "2" ] || [ "${userexecperm}" == "4" ] || [ "${userexecperm}" == "6" ]; then
-			# If user permission is invalid, then check for invalid group permissions.
-			if [ "${groupexecperm}" == "0" ] || [ "${groupexecperm}" == "2" ] || [ "${groupexecperm}" == "4" ] || [ "${groupexecperm}" == "6" ]; then
-				# If permission issues are found.
-				fn_print_warn_nl "Permissions issue found"
-				fn_script_log_warn "Permissions issue found"
-				fn_print_information_nl "The following file is not executable:"
-				ls -l "${executabledir}/${execname}"
-				fn_script_log_info "The following file is not executable:"
-				fn_script_log_info "${executabledir}/${execname}"
-				fn_print_information_nl "Applying chmod u+x,g+x ${executabledir}/${execname}"
-				fn_script_log_info "Applying chmod u+x,g+x ${execperm}"
-				# Make the executable executable.
-				chmod u+x,g+x "${executabledir}/${execname}"
-				# Second check to see if it's been successfully applied.
-				# Get permission numbers on file under the form 775.
-				execperm=$(stat -c %a "${executabledir}/${execname}")
-				# Grab the first and second digit for user and group permission.
-				userexecperm="${execperm:0:1}"
-				groupexecperm="${execperm:1:1}"
-				if [ "${userexecperm}" == "0" ] || [ "${userexecperm}" == "2" ] || [ "${userexecperm}" == "4" ] || [ "${userexecperm}" == "6" ]; then
-					if [ "${groupexecperm}" == "0" ] || [ "${groupexecperm}" == "2" ] || [ "${groupexecperm}" == "4" ] || [ "${groupexecperm}" == "6" ]; then
-						# If errors are still found.
-						fn_print_fail_nl "The following file could not be set executable:"
-						ls -l "${executabledir}/${execname}"
-						fn_script_log_warn "The following file could not be set executable:"
-						fn_script_log_info "${executabledir}/${execname}"
-						if [ "${monitorflag}" == "1" ]; then
-							alert="permissions"
-							alert.sh
-						fi
-						core_exit.sh
-					fi
-				fi
-			fi
-		fi
-	fi
-}
-
-## The following fn_sys_perm_* functions checks for permission errors in /sys directory.
-
-# Checks for permission errors in /sys directory.
-fn_sys_perm_errors_detect() {
-	# Reset test variables.
-	sysdirpermerror="0"
-	classdirpermerror="0"
-	netdirpermerror="0"
-	# Check permissions.
-	# /sys, /sys/class and /sys/class/net should be readable & executable.
-	if [ ! -r "/sys" ] || [ ! -x "/sys" ]; then
-		sysdirpermerror="1"
-	fi
-	if [ ! -r "/sys/class" ] || [ ! -x "/sys/class" ]; then
-		classdirpermerror="1"
-	fi
-	if [ ! -r "/sys/class/net" ] || [ ! -x "/sys/class/net" ]; then
-		netdirpermerror="1"
-	fi
-}
-
-# Display a message on how to fix the issue manually.
-fn_sys_perm_fix_manually_msg() {
-	echo -e ""
-	fn_print_information_nl "This error causes servers to fail starting properly"
-	fn_script_log_info "This error causes servers to fail starting properly."
-	echo -e "	* To fix this issue, run the following command as root:"
-	fn_script_log_info "To fix this issue, run the following command as root:"
-	echo -e "	  chmod a+rx /sys /sys/class /sys/class/net"
-	fn_script_log "chmod a+rx /sys /sys/class /sys/class/net"
-	fn_sleep_time
-	if [ "${monitorflag}" == 1 ]; then
-		alert="permissions"
-		alert.sh
-	fi
-	core_exit.sh
-}
-
-# Attempt to fix /sys related permission errors if sudo is available, exits otherwise.
-fn_sys_perm_errors_fix() {
-	if sudo -n true > /dev/null 2>&1; then
-		fn_print_dots "Automatically fixing /sys permissions"
-		fn_script_log_info "Automatically fixing /sys permissions."
-		if [ "${sysdirpermerror}" == "1" ]; then
-			sudo chmod a+rx "/sys"
-		fi
-		if [ "${classdirpermerror}" == "1" ]; then
-			sudo chmod a+rx "/sys/class"
-		fi
-		if [ "${netdirpermerror}" == "1" ]; then
-			sudo chmod a+rx "/sys/class/net"
-		fi
-		# Run check again to see if it's fixed.
-		fn_sys_perm_errors_detect
-		if [ "${sysdirpermerror}" == "1" ] || [ "${classdirpermerror}" == "1" ] || [ "${netdirpermerror}" == "1" ]; then
-			fn_print_error "Could not fix /sys permissions"
-			fn_script_log_error "Could not fix /sys permissions."
-			fn_sleep_time
-			# Show the user how to fix.
-			fn_sys_perm_fix_manually_msg
-		else
-			fn_print_ok_nl "Automatically fixing /sys permissions"
-			fn_script_log_pass "Permissions in /sys fixed"
-		fi
-	else
-		# Show the user how to fix.
-		fn_sys_perm_fix_manually_msg
-	fi
-}
-
-# Processes to the /sys related permission errors check & fix/info.
-fn_sys_perm_error_process() {
-	fn_sys_perm_errors_detect
-	# If any error was found.
-	if [ "${sysdirpermerror}" == "1" ] || [ "${classdirpermerror}" == "1" ] || [ "${netdirpermerror}" == "1" ]; then
-		fn_print_error_nl "Permission error(s) found in /sys"
-		fn_script_log_error "Permission error(s) found in /sys"
-		# Run the fix
-		fn_sys_perm_errors_fix
-	fi
-}
-
-## Run permisions checks when not root or docker.
-if [ "$(whoami)" != "root" ] && [ ! -f /.dockerenv ]; then
-	fn_check_ownership
-	fn_check_permissions
-	if [ "${commandname}" == "START" ]; then
-		fn_sys_perm_error_process
-	fi
-fi
diff --git a/lgsm/functions/check_root.sh b/lgsm/functions/check_root.sh
deleted file mode 100644
index dab033148..000000000
--- a/lgsm/functions/check_root.sh
+++ /dev/null
@@ -1,21 +0,0 @@
-#!/bin/bash
-# LinuxGSM check_root.sh module
-# Author: Daniel Gibbs
-# Contributors: http://linuxgsm.com/contrib
-# Website: https://linuxgsm.com
-# Description: Checks if the user tried to run the script as root.
-
-functionselfname="$(basename "$(readlink -f "${BASH_SOURCE[0]}")")"
-
-if [ "$(whoami)" == "root" ] && [ ! -f /.dockerenv ]; then
-	if [ "${commandname}" != "INSTALL" ]; then
-		fn_print_fail_nl "Do NOT run this script as root!"
-		if [ -d "${lgsmlogdir}" ]; then
-			fn_script_log_fatal "${selfname} attempted to run as root."
-		else
-			# Forces exit code is log does not yet exist.
-			exitcode=1
-		fi
-		core_exit.sh
-	fi
-fi
diff --git a/lgsm/functions/check_status.sh b/lgsm/functions/check_status.sh
deleted file mode 100644
index 429f7c72d..000000000
--- a/lgsm/functions/check_status.sh
+++ /dev/null
@@ -1,10 +0,0 @@
-#!/bin/bash
-# LinuxGSM check_status.sh module
-# Author: Daniel Gibbs
-# Contributors: http://linuxgsm.com/contrib
-# Website: https://linuxgsm.com
-# Description: Checks the process status of the server. Either online or offline.
-
-functionselfname="$(basename "$(readlink -f "${BASH_SOURCE[0]}")")"
-
-status=$(tmux -L "${sessionname}" list-sessions -F "#{session_name}" 2> /dev/null | grep -Ecx "^${sessionname}")
diff --git a/lgsm/functions/check_steamcmd.sh b/lgsm/functions/check_steamcmd.sh
deleted file mode 100644
index d41e8669f..000000000
--- a/lgsm/functions/check_steamcmd.sh
+++ /dev/null
@@ -1,22 +0,0 @@
-#!/bin/bash
-# LinuxGSM check_steamcmd.sh module
-# Author: Daniel Gibbs
-# Contributors: http://linuxgsm.com/contrib
-# Website: https://linuxgsm.com
-# Description: Checks if SteamCMD is installed correctly.
-
-functionselfname="$(basename "$(readlink -f "${BASH_SOURCE[0]}")")"
-
-# init steamcmd functions
-core_steamcmd.sh
-
-fn_check_steamcmd_clear
-fn_check_steamcmd
-if [ "${shortname}" == "ark" ]; then
-	fn_check_steamcmd_ark
-fi
-fn_check_steamcmd_dir
-fn_check_steamcmd_dir_legacy
-fn_check_steamcmd_steamapp
-fn_check_steamcmd_user
-fn_check_steamcmd_exec
diff --git a/lgsm/functions/check_system_dir.sh b/lgsm/functions/check_system_dir.sh
deleted file mode 100644
index 0a732d6d1..000000000
--- a/lgsm/functions/check_system_dir.sh
+++ /dev/null
@@ -1,22 +0,0 @@
-#!/bin/bash
-# LinuxGSM check_system_dir.sh module
-# Author: Daniel Gibbs
-# Contributors: http://linuxgsm.com/contrib
-# Website: https://linuxgsm.com
-# Description: Checks if systemdir/serverfiles is accessible.
-
-functionselfname="$(basename "$(readlink -f "${BASH_SOURCE[0]}")")"
-
-if [ "${commandname}" != "VALIDATE" ]; then
-	checkdir="${serverfiles}"
-else
-	checkdir="${systemdir}"
-fi
-
-if [ ! -d "${checkdir}" ]; then
-	fn_print_fail_nl "Cannot access ${checkdir}: No such directory"
-	if [ -d "${lgsmlogdir}" ]; then
-		fn_script_log_fatal "Cannot access ${checkdir}: No such directory."
-	fi
-	core_exit.sh
-fi
diff --git a/lgsm/functions/check_system_requirements.sh b/lgsm/functions/check_system_requirements.sh
deleted file mode 100644
index bfe597135..000000000
--- a/lgsm/functions/check_system_requirements.sh
+++ /dev/null
@@ -1,55 +0,0 @@
-#!/bin/bash
-# LinuxGSM check_system_requirements.sh
-# Author: Daniel Gibbs
-# Contributors: http://linuxgsm.com/contrib
-# Website: https://linuxgsm.com
-# Description: Checks RAM requirements.
-
-functionselfname="$(basename "$(readlink -f "${BASH_SOURCE[0]}")")"
-
-info_distro.sh
-
-# RAM requirements in megabytes for each game or engine.
-
-if [ "${shortname}" == "ark" ]; then
-	ramrequirementmb="4000"
-	ramrequirementgb="4"
-elif [ "${shortname}" == "bt" ]; then
-	ramrequirementmb="1000"
-	ramrequirementgb="1"
-elif [ "${shortname}" == "mh" ]; then
-	ramrequirementmb="4000"
-	ramrequirementgb="4"
-elif [ "${shortname}" == "arma3" ]; then
-	ramrequirementmb="1000"
-	ramrequirementgb="1"
-elif [ "${shortname}" == "rust" ]; then
-	ramrequirementmb="4000"
-	ramrequirementgb="4"
-elif [ "${shortname}" == "mc" ] || [ "${shortname}" == "pmc" ] || [ "${shortname}" == "wmc" ]; then
-	ramrequirementmb="1000"
-	ramrequirementgb="1"
-elif [ "${shortname}" == "pstbs" ]; then
-	ramrequirementmb="2000"
-	ramrequirementgb="2"
-elif [ "${shortname}" == "ns2" ] || [ "${shortname}" == "ns2c" ]; then
-	ramrequirementmb="1000"
-	ramrequirementgb="1"
-elif [ "${shortname}" == "st" ]; then
-	ramrequirementmb="1000"
-	ramrequirementgb="1"
-elif [ "${shortname}" == "pvr" ]; then
-	ramrequirementmb="2000"
-	ramrequirementgb="2"
-fi
-
-# If the game or engine has a minimum RAM Requirement, compare it to system's available RAM.
-if [ "${ramrequirementmb}" ]; then
-	if [ "${physmemtotalmb}" -lt "${ramrequirementmb}" ]; then
-		fn_print_dots "Check RAM"
-		# Warn the user.
-		fn_print_warn_nl "Check RAM: ${ramrequirementgb}G required, ${physmemtotal} available"
-		echo "* ${gamename} server may fail to run or experience poor performance."
-		fn_sleep_time
-	fi
-fi
diff --git a/lgsm/functions/check_tmuxception.sh b/lgsm/functions/check_tmuxception.sh
deleted file mode 100644
index 64705a3a8..000000000
--- a/lgsm/functions/check_tmuxception.sh
+++ /dev/null
@@ -1,33 +0,0 @@
-#!/bin/bash
-# LinuxGSM check_config.sh module
-# Author: Daniel Gibbs
-# Contributors: http://linuxgsm.com/contrib
-# Website: https://linuxgsm.com
-# Description: Checks if run from tmux or screen.
-
-functionselfname="$(basename "$(readlink -f "${BASH_SOURCE[0]}")")"
-
-fn_check_is_in_tmux() {
-	if [ "${TMUX}" ]; then
-		fn_print_fail_nl "tmuxception error: Sorry Cobb you cannot start a tmux session inside of a tmux session."
-		fn_script_log_fatal "Tmuxception error: Attempted to start a tmux session inside of a tmux session."
-		fn_print_information_nl "LinuxGSM creates a tmux session when starting the server."
-		echo -e "It is not possible to run a tmux session inside another tmux session"
-		echo -e "https://docs.linuxgsm.com/requirements/tmux#tmuxception"
-		core_exit.sh
-	fi
-}
-
-fn_check_is_in_screen() {
-	if [ "${STY}" ]; then
-		fn_print_fail_nl "tmuxception error: Sorry Cobb you cannot start a tmux session inside of a screen session."
-		fn_script_log_fatal "Tmuxception error: Attempted to start a tmux session inside of a screen session."
-		fn_print_information_nl "LinuxGSM creates a tmux session when starting the server."
-		echo -e "It is not possible to run a tmux session inside screen session"
-		echo -e "https://docs.linuxgsm.com/requirements/tmux#tmuxception"
-		core_exit.sh
-	fi
-}
-
-fn_check_is_in_tmux
-fn_check_is_in_screen
diff --git a/lgsm/functions/check_version.sh b/lgsm/functions/check_version.sh
deleted file mode 100644
index 657e32b54..000000000
--- a/lgsm/functions/check_version.sh
+++ /dev/null
@@ -1,23 +0,0 @@
-#!/bin/bash
-# LinuxGSM command_version.sh module
-# Author: Daniel Gibbs
-# Contributors: http://linuxgsm.com/contrib
-# Website: https://linuxgsm.com
-# Description: Will run update-lgsm if gameserver.sh and modules version does not match
-# this will allow gameserver.sh to update - useful for multi instance servers.
-
-functionselfname="$(basename "$(readlink -f "${BASH_SOURCE[0]}")")"
-
-if [ -n "${modulesversion}" ] && [ -n "${version}" ] && [ "${version}" != "${modulesversion}" ]; then
-	exitbypass=1
-	echo -e ""
-	fn_print_error_nl "LinuxGSM version mismatch"
-	echo -e ""
-	echo -e "* ${selfname}: ${version}"
-	echo -e "* modules: ${modulesversion}"
-	echo -e ""
-	fn_sleep_time
-	fn_script_log_error "LinuxGSM Version mismatch: ${selfname}: ${version}: modules: ${modulesversion}"
-	command_update_linuxgsm.sh
-	fn_firstcommand_reset
-fi
diff --git a/lgsm/functions/command_backup.sh b/lgsm/functions/command_backup.sh
deleted file mode 100644
index d69c57a0f..000000000
--- a/lgsm/functions/command_backup.sh
+++ /dev/null
@@ -1,268 +0,0 @@
-#!/bin/bash
-# LinuxGSM command_backup.sh module
-# Author: Daniel Gibbs
-# Contributors: http://linuxgsm.com/contrib
-# Website: https://linuxgsm.com
-# Description: Creates a .tar.gz file in the backup directory.
-
-commandname="BACKUP"
-commandaction="Backing up"
-functionselfname="$(basename "$(readlink -f "${BASH_SOURCE[0]}")")"
-fn_firstcommand_set
-
-check.sh
-
-# Trap to remove lockfile on quit.
-fn_backup_trap() {
-	echo -e ""
-	echo -en "backup ${backupname}.tar.gz..."
-	fn_print_canceled_eol_nl
-	fn_script_log_info "Backup ${backupname}.tar.gz: CANCELED"
-	rm -f "${backupdir:?}/${backupname}.tar.gz" | tee -a "${lgsmlog}"
-	echo -en "backup ${backupname}.tar.gz..."
-	fn_print_removed_eol_nl
-	fn_script_log_info "Backup ${backupname}.tar.gz: REMOVED"
-	# Remove lock file.
-	rm -f "${lockdir:?}/backup.lock"
-	fn_backup_start_server
-	unset exitbypass
-	core_exit.sh
-}
-
-# Check if a backup is pending or has been aborted using backup.lock.
-fn_backup_check_lockfile() {
-	if [ -f "${lockdir}/backup.lock" ]; then
-		fn_print_info_nl "Lock file found: Backup is currently running"
-		fn_script_log_error "Lock file found: Backup is currently running: ${lockdir}/backup.lock"
-		core_exit.sh
-	fi
-}
-
-# Initialisation.
-fn_backup_init() {
-	# Backup file name with selfname and current date.
-	backupname="${selfname}-$(date '+%Y-%m-%d-%H%M%S')"
-
-	info_distro.sh
-	fn_print_dots "Backup starting"
-	fn_script_log_info "Backup starting"
-	fn_print_ok_nl "Backup starting"
-	if [ ! -d "${backupdir}" ] || [ "${backupcount}" == "0" ]; then
-		fn_print_info_nl "There are no previous backups"
-	else
-		if [ "${lastbackupdaysago}" == "0" ]; then
-			daysago="less than 1 day ago"
-		elif [ "${lastbackupdaysago}" == "1" ]; then
-			daysago="1 day ago"
-		else
-			daysago="${lastbackupdaysago} days ago"
-		fi
-		echo -e "* Previous backup was created ${daysago}, total size ${lastbackupsize}"
-	fi
-}
-
-# Check if server is started and whether to stop it.
-fn_backup_stop_server() {
-	check_status.sh
-	# Server is running but will not be stopped.
-	if [ "${stoponbackup}" == "off" ]; then
-		fn_print_warn_nl "${selfname} is currently running"
-		echo -e "* Although unlikely; creating a backup while ${selfname} is running might corrupt the backup."
-		fn_script_log_warn "${selfname} is currently running"
-		fn_script_log_warn "Although unlikely; creating a backup while ${selfname} is running might corrupt the backup"
-	# Server is running and will be stopped if stoponbackup=on or unset.
-	# If server is started
-	elif [ "${status}" != "0" ]; then
-		fn_print_restart_warning
-		startserver="1"
-		exitbypass=1
-		command_stop.sh
-		fn_firstcommand_reset
-	fi
-}
-
-# Create required folders.
-fn_backup_dir() {
-	# Create backupdir if it doesn't exist.
-	if [ ! -d "${backupdir}" ]; then
-		mkdir -p "${backupdir}"
-	fi
-}
-
-# Migrate Backups from old dir before refactor
-fn_backup_migrate_olddir() {
-	# Check if old backup dir is there before the refactor and move the backups
-	if [ -d "${rootdir}/backups" ]; then
-		if [ "${rootdir}/backups" != "${backupdir}" ]; then
-			fn_print_dots "Backup directory is being migrated"
-			fn_script_log_info "Backup directory is being migrated"
-			fn_script_log_info "${rootdir}/backups > ${backupdir}"
-			mv "${rootdir}/backups/"* "${backupdir}" 2> /dev/null
-			exitcode=$?
-			if [ "${exitcode}" == 0 ]; then
-				rmdir "${rootdir}/backups" 2> /dev/null
-				exitcode=$?
-			fi
-			if [ "${exitcode}" != 0 ]; then
-				fn_print_error_nl "Backup directory is being migrated"
-				fn_script_log_error "Backup directory is being migrated"
-			else
-
-				fn_print_ok_nl "Backup directory is being migrated"
-				fn_script_log_pass "Backup directory is being migrated"
-			fi
-		fi
-	fi
-}
-
-fn_backup_create_lockfile() {
-	# Create lockfile.
-	date '+%s' > "${lockdir}/backup.lock"
-	fn_script_log_info "Lockfile generated"
-	fn_script_log_info "${lockdir}/backup.lock"
-	# trap to remove lockfile on quit.
-	trap fn_backup_trap INT
-}
-
-# Compressing files.
-fn_backup_compression() {
-	# Tells how much will be compressed using rootdirduexbackup value from info_distro and prompt for continue.
-	fn_print_info "A total of ${rootdirduexbackup} will be compressed."
-	fn_script_log_info "A total of ${rootdirduexbackup} will be compressed: ${backupdir}/${backupname}.tar.gz"
-	fn_print_dots "Backup (${rootdirduexbackup}) ${backupname}.tar.gz, in progress..."
-	fn_script_log_info "backup ${rootdirduexbackup} ${backupname}.tar.gz, in progress"
-	excludedir=$(fn_backup_relpath)
-
-	# Check that excludedir is a valid path.
-	if [ ! -d "${excludedir}" ]; then
-		fn_print_fail_nl "Problem identifying the previous backup directory for exclusion."
-		fn_script_log_fatal "Problem identifying the previous backup directory for exclusion"
-		core_exit.sh
-	fi
-
-	tar -czf "${backupdir}/${backupname}.tar.gz" -C "${rootdir}" --exclude "${excludedir}" --exclude "${lockdir}/backup.lock" ./.
-	local exitcode=$?
-	if [ "${exitcode}" != 0 ]; then
-		fn_print_fail_eol
-		fn_script_log_fatal "Backup in progress: FAIL"
-		echo -e "${extractcmd}" | tee -a "${lgsmlog}"
-		fn_print_fail_nl "Starting backup"
-		fn_script_log_fatal "Starting backup"
-	else
-		fn_print_ok_eol
-		fn_print_ok_nl "Completed: ${backupname}.tar.gz, total size $(du -sh "${backupdir}/${backupname}.tar.gz" | awk '{print $1}')"
-		fn_script_log_pass "Backup created: ${backupname}.tar.gz, total size $(du -sh "${backupdir}/${backupname}.tar.gz" | awk '{print $1}')"
-	fi
-	# Remove lock file
-	rm -f "${lockdir:?}/backup.lock"
-}
-
-# Clear old backups according to maxbackups and maxbackupdays variables.
-fn_backup_prune() {
-	# Clear if backup variables are set.
-	if [ "${maxbackups}" ] && [ -n "${maxbackupdays}" ]; then
-		# How many backups there are.
-		info_distro.sh
-		# How many backups exceed maxbackups.
-		backupquotadiff=$((backupcount - maxbackups))
-		# How many backups exceed maxbackupdays.
-		backupsoudatedcount=$(find "${backupdir}"/ -type f -name "*.tar.gz" -mtime +"${maxbackupdays}" | wc -l)
-		# If anything can be cleared.
-		if [ "${backupquotadiff}" -gt "0" ] || [ "${backupsoudatedcount}" -gt "0" ]; then
-			fn_print_dots "Pruning"
-			fn_script_log_info "Backup pruning activated"
-			fn_print_ok_nl "Pruning"
-			# If maxbackups greater or equal to backupsoutdatedcount, then it is over maxbackupdays.
-			if [ "${backupquotadiff}" -ge "${backupsoudatedcount}" ]; then
-				# Display how many backups will be cleared.
-				echo -e "* Pruning: ${backupquotadiff} backup(s) has exceeded the ${maxbackups} backups limit"
-				fn_script_log_info "Pruning: ${backupquotadiff} backup(s) has exceeded the ${maxbackups} backups limit"
-				fn_sleep_time
-				fn_print_dots "Pruning: Clearing ${backupquotadiff} backup(s)"
-				fn_script_log_info "Pruning: Clearing ${backupquotadiff} backup(s)"
-				# Clear backups over quota.
-				find "${backupdir}"/ -type f -name "*.tar.gz" -printf '%T@ %p\n' | sort -rn | tail -${backupquotadiff} | cut -f2- -d" " | xargs rm
-				fn_print_ok_nl "Pruning: Clearing ${backupquotadiff} backup(s)"
-				fn_script_log_pass "Pruning: Cleared ${backupquotadiff} backup(s)"
-			# If maxbackupdays is used over maxbackups.
-			elif [ "${backupquotadiff}" -lt "${backupsoudatedcount}" ]; then
-				# Display how many backups will be cleared.
-				echo -e "* Pruning: ${backupsoudatedcount} backup(s) are older than ${maxbackupdays} days."
-				fn_script_log_info "Pruning: ${backupsoudatedcount} backup(s) older than ${maxbackupdays} days."
-				fn_sleep_time
-				fn_print_dots "Pruning: Clearing ${backupquotadiff} backup(s)."
-				fn_script_log_info "Pruning: Clearing ${backupquotadiff} backup(s)"
-				# Clear backups over quota
-				find "${backupdir}"/ -type f -mtime +"${maxbackupdays}" -exec rm -f {} \;
-				fn_print_ok_nl "Pruning: Clearing ${backupquotadiff} backup(s)"
-				fn_script_log_pass "Pruning: Cleared ${backupquotadiff} backup(s)"
-			fi
-		fi
-	fi
-}
-
-fn_backup_relpath() {
-	# Written by CedarLUG as a "realpath --relative-to" alternative in bash.
-	# Populate an array of tokens initialized from the rootdir components.
-	declare -a rdirtoks=($(readlink -f "${rootdir}" | sed "s/\// /g"))
-	if [ ${#rdirtoks[@]} -eq 0 ]; then
-		fn_print_fail_nl "Problem assessing rootdir during relative path assessment"
-		fn_script_log_fatal "Problem assessing rootdir during relative path assessment: ${rootdir}"
-		core_exit.sh
-	fi
-
-	# Populate an array of tokens initialized from the backupdir components.
-	declare -a bdirtoks=($(readlink -f "${backupdir}" | sed "s/\// /g"))
-	if [ ${#bdirtoks[@]} -eq 0 ]; then
-		fn_print_fail_nl "Problem assessing backupdir during relative path assessment"
-		fn_script_log_fatal "Problem assessing backupdir during relative path assessment: ${rootdir}"
-		core_exit.sh
-	fi
-
-	# Compare the leading entries of each array.  These common elements will be clipped off.
-	# for the relative path output.
-	for ((base = 0; base < ${#rdirtoks[@]}; base++)); do
-		[[ "${rdirtoks[$base]}" != "${bdirtoks[$base]}" ]] && break
-	done
-
-	# Next, climb out of the remaining rootdir location with updir references.
-	for ((x = base; x < ${#rdirtoks[@]}; x++)); do
-		echo -n "../"
-	done
-
-	# Climb down the remaining components of the backupdir location.
-	for ((x = base; x < $((${#bdirtoks[@]} - 1)); x++)); do
-		echo -n "${bdirtoks[$x]}/"
-	done
-
-	# In the event there were no directories left in the backupdir above to
-	# traverse down, just add a newline. Otherwise at this point, there is
-	# one remaining directory component in the backupdir to navigate.
-	if (("$base" < "${#bdirtoks[@]}")); then
-		echo -e "${bdirtoks[$((${#bdirtoks[@]} - 1))]}"
-	else
-		echo
-	fi
-}
-
-# Start the server if it was stopped for the backup.
-fn_backup_start_server() {
-	if [ -n "${startserver}" ]; then
-		exitbypass=1
-		command_start.sh
-		fn_firstcommand_reset
-	fi
-}
-
-# Run functions.
-fn_backup_check_lockfile
-fn_backup_init
-fn_backup_stop_server
-fn_backup_dir
-fn_backup_migrate_olddir
-fn_backup_create_lockfile
-fn_backup_compression
-fn_backup_prune
-fn_backup_start_server
-
-core_exit.sh
diff --git a/lgsm/functions/command_check_update.sh b/lgsm/functions/command_check_update.sh
deleted file mode 100644
index b2647e2a1..000000000
--- a/lgsm/functions/command_check_update.sh
+++ /dev/null
@@ -1,39 +0,0 @@
-#!/bin/bash
-# LinuxGSM command_check_update.sh module
-# Author: Daniel Gibbs
-# Contributors: http://linuxgsm.com/contrib
-# Website: https://linuxgsm.com
-# Description: Handles updating of servers.
-
-commandname="CHECK-UPDATE"
-commandaction="Check for Update"
-functionselfname="$(basename "$(readlink -f "${BASH_SOURCE[0]}")")"
-fn_firstcommand_set
-
-fn_print_dots ""
-check.sh
-core_logs.sh
-
-if [ "${shortname}" == "ts3" ]; then
-	update_ts3.sh
-elif [ "${shortname}" == "mc" ]; then
-	update_minecraft.sh
-elif [ "${shortname}" == "mcb" ]; then
-	update_minecraft_bedrock.sh
-elif [ "${shortname}" == "pmc" ] || [ "${shortname}" == "vpmc" ] || [ "${shortname}" == "wmc" ]; then
-	update_papermc.sh
-elif [ "${shortname}" == "fctr" ]; then
-	update_factorio.sh
-elif [ "${shortname}" == "mta" ]; then
-	update_mta.sh
-elif [ "${shortname}" == "jk2" ]; then
-	update_jediknight2.sh
-elif [ "${shortname}" == "vints" ]; then
-	update_vintagestory.sh
-elif [ "${shortname}" == "ut99" ]; then
-	update_ut99.sh
-else
-	update_steamcmd.sh
-fi
-
-core_exit.sh
diff --git a/lgsm/functions/command_console.sh b/lgsm/functions/command_console.sh
deleted file mode 100644
index 4f09776b8..000000000
--- a/lgsm/functions/command_console.sh
+++ /dev/null
@@ -1,58 +0,0 @@
-#!/bin/bash
-# LinuxGSM command_console.sh module
-# Author: Daniel Gibbs
-# Contributors: http://linuxgsm.com/contrib
-# Website: https://linuxgsm.com
-# Description: Gives access to the server tmux console.
-
-commandname="CONSOLE"
-commandaction="Access console"
-functionselfname="$(basename "$(readlink -f "${BASH_SOURCE[0]}")")"
-fn_firstcommand_set
-
-check.sh
-fn_print_header
-
-if [ "${consoleverbose}" == "yes" ]; then
-	echo -e "* Verbose output: ${lightgreen}yes${default}"
-elif [ "${consoleverbose}" == "no" ]; then
-	echo -e "* Verbose output: ${red}no${default}"
-else
-	echo -e "* Verbose output: ${red}unknown${default}"
-fi
-
-if [ "${consoleinteract}" == "yes" ]; then
-	echo -e "* Interactive output: ${lightgreen}yes${default}"
-elif [ "${consoleinteract}" == "no" ]; then
-	echo -e "* Interactive output: ${red}no${default}"
-else
-	echo -e "* Interactive output: ${red}unknown${default}"
-fi
-echo ""
-fn_print_information_nl "Press \"CTRL+b\" then \"d\" to exit console."
-fn_print_warning_nl "Do NOT press CTRL+c to exit."
-echo -e "* https://docs.linuxgsm.com/commands/console"
-echo -e ""
-if ! fn_prompt_yn "Continue?" Y; then
-	exitcode=0
-	core_exit.sh
-fi
-fn_print_dots "Accessing console"
-check_status.sh
-if [ "${status}" != "0" ]; then
-	fn_print_ok_nl "Accessing console"
-	fn_script_log_pass "Console accessed"
-	tmux -L "${sessionname}" attach-session -t "${sessionname}"
-	fn_print_ok_nl "Closing console"
-	fn_script_log_pass "Console closed"
-else
-	fn_print_error_nl "Server not running"
-	fn_script_log_error "Failed to access: Server not running"
-	if fn_prompt_yn "Do you want to start the server?" Y; then
-		exitbypass=1
-		command_start.sh
-		fn_firstcommand_reset
-	fi
-fi
-
-core_exit.sh
diff --git a/lgsm/functions/command_debug.sh b/lgsm/functions/command_debug.sh
deleted file mode 100644
index c6422be65..000000000
--- a/lgsm/functions/command_debug.sh
+++ /dev/null
@@ -1,142 +0,0 @@
-#!/bin/bash
-# LinuxGSM command_debug.sh module
-# Author: Daniel Gibbs
-# Contributors: http://linuxgsm.com/contrib
-# Website: https://linuxgsm.com
-# Description: Runs the server without tmux and directly from the terminal.
-
-commandname="DEBUG"
-commandaction="Debuging"
-functionselfname="$(basename "$(readlink -f "${BASH_SOURCE[0]}")")"
-fn_firstcommand_set
-
-# Trap to remove lockfile on quit.
-fn_lockfile_trap() {
-	# Remove lockfile.
-	rm -f "${lockdir:?}/${selfname}.lock"
-	# resets terminal. Servers can sometimes mess up the terminal on exit.
-	reset
-	fn_print_dots "Stopping debug"
-	fn_print_ok_nl "Stopping debug"
-	fn_script_log_pass "Stopping debug"
-	# remove trap.
-	trap - INT
-	core_exit.sh
-}
-
-check.sh
-fix.sh
-info_distro.sh
-info_game.sh
-fn_print_header
-{
-	echo -e "${lightblue}Distro:\t\t${default}${distroname}"
-	echo -e "${lightblue}Architecture:\t\t${default}${arch}"
-	echo -e "${lightblue}Kernel:\t\t${default}${kernel}"
-	echo -e "${lightblue}Hostname:\t\t${default}${HOSTNAME}"
-	echo -e "${lightblue}tmux:\t\t${default}${tmuxv}"
-	echo -e "${lightblue}Avg Load:\t\t${default}${load}"
-	echo -e "${lightblue}Free Memory:\t\t${default}${physmemfree}"
-	echo -e "${lightblue}Free Disk:\t\t${default}${availspace}"
-} | column -s $'\t' -t
-
-# glibc required.
-if [ -n "${glibc}" ]; then
-	if [ "${glibc}" == "null" ]; then
-		# Glibc is not required.
-		:
-	elif [ -z "${glibc}" ]; then
-		echo -e "${lightblue}glibc required:\t${red}UNKNOWN${default}"
-	elif [ "$(printf '%s\n'${glibc}'\n' ${glibcversion} | sort -V | head -n 1)" != "${glibc}" ]; then
-		echo -e "${lightblue}glibc required:\t${red}${glibc} ${default}(${red}distro glibc ${glibcversion} too old${default})"
-	else
-		echo -e "${lightblue}glibc required:\t${green}${glibc}${default}"
-	fi
-fi
-
-# Server IP.
-echo -e "${lightblue}Game Server IP:\t${default}${ip}:${port}"
-
-# External server IP.
-if [ "${extip}" ]; then
-	if [ "${ip}" != "${extip}" ]; then
-		echo -e "${lightblue}Internet IP:\t${default}${extip}:${port}"
-	fi
-fi
-
-# Server password.
-if [ "${serverpassword}" ]; then
-	echo -e "${lightblue}Server password:\t${default}${serverpassword}"
-fi
-
-fn_reload_startparameters
-echo -e "${lightblue}Start parameters:${default}"
-if [ "${engine}" == "source" ] || [ "${engine}" == "goldsrc" ]; then
-	echo -e "${executable} ${startparameters} -debug"
-elif [ "${engine}" == "quake" ]; then
-	echo -e "${executable} ${startparameters} -condebug"
-else
-	echo -e "${preexecutable} ${executable} ${startparameters}"
-fi
-echo -e ""
-echo -e "Use debug for identifying server issues only!"
-echo -e "Press CTRL+c to drop out of debug mode."
-fn_print_warning_nl "If ${selfname} is already running it will be stopped."
-echo -e ""
-if ! fn_prompt_yn "Continue?" Y; then
-	exitcode=0
-	core_exit.sh
-fi
-
-fn_print_info_nl "Stopping any running servers"
-fn_script_log_info "Stopping any running servers"
-exitbypass=1
-command_stop.sh
-fn_firstcommand_reset
-unset exitbypass
-fn_print_dots "Starting debug"
-fn_script_log_info "Starting debug"
-fn_print_ok_nl "Starting debug"
-
-# Create lockfile.
-date '+%s' > "${lockdir}/${selfname}.lock"
-echo "${version}" >> "${lockdir}/${selfname}.lock"
-echo "${port}" >> "${lockdir}/${selfname}.lock"
-fn_script_log_info "Lockfile generated"
-fn_script_log_info "${lockdir}/${selfname}.lock"
-
-if [ "${shortname}" == "av" ]; then
-	cd "${systemdir}" || exit
-else
-	cd "${executabledir}" || exit
-fi
-
-# Note: do not add double quotes to ${executable} ${startparameters}.
-if [ "${engine}" == "source" ] || [ "${engine}" == "goldsrc" ]; then
-	eval "${executable} ${startparameters} -debug"
-elif [ "${engine}" == "quake" ]; then
-	eval "${executable} ${startparameters} -condebug"
-else
-	# shellcheck disable=SC2086
-	eval "${preexecutable} ${executable} ${startparameters}"
-fi
-
-if [ $? -ne 0 ]; then
-	fn_print_error_nl "Server has stopped: exit code: $?"
-	fn_script_log_error "Server has stopped: exit code: $?"
-	fn_print_error_nl "Press ENTER to exit debug mode"
-	read -r
-else
-	fn_print_ok_nl "Server has stopped"
-	fn_script_log_pass "Server has stopped"
-	fn_print_ok_nl "Press ENTER to exit debug mode"
-	read -r
-fi
-
-fn_lockfile_trap
-
-fn_print_dots "Stopping debug"
-fn_print_ok_nl "Stopping debug"
-fn_script_log_info "Stopping debug"
-
-core_exit.sh
diff --git a/lgsm/functions/command_details.sh b/lgsm/functions/command_details.sh
deleted file mode 100644
index 08d9f031b..000000000
--- a/lgsm/functions/command_details.sh
+++ /dev/null
@@ -1,41 +0,0 @@
-#!/bin/bash
-# LinuxGSM command_details.sh module
-# Author: Daniel Gibbs
-# Contributors: http://linuxgsm.com/contrib
-# Website: https://linuxgsm.com
-# Description: Displays server information.
-
-commandname="DETAILS"
-commandaction="Viewing details"
-functionselfname="$(basename "$(readlink -f "${BASH_SOURCE[0]}")")"
-fn_firstcommand_set
-
-# Run checks and gathers details to display.
-check.sh
-info_distro.sh
-info_game.sh
-info_messages.sh
-if [ "${querymode}" == "2" ] || [ "${querymode}" == "3" ]; then
-	for queryip in "${queryips[@]}"; do
-		query_gamedig.sh
-		if [ "${querystatus}" == "0" ]; then
-			break
-		fi
-	done
-fi
-fn_info_message_distro
-fn_info_message_server_resource
-fn_info_message_gameserver_resource
-fn_info_message_gameserver
-fn_info_message_script
-fn_info_message_backup
-# Some game servers do not have parms.
-if [ "${shortname}" != "jc2" ] && [ "${shortname}" != "dst" ] && [ "${shortname}" != "pz" ] && [ "${engine}" != "renderware" ]; then
-	fn_info_message_commandlineparms
-fi
-fn_info_message_ports_edit
-fn_info_message_ports
-fn_info_message_select_engine
-fn_info_message_statusbottom
-
-core_exit.sh
diff --git a/lgsm/functions/command_dev_clear_functions.sh b/lgsm/functions/command_dev_clear_functions.sh
deleted file mode 100644
index 87c77515d..000000000
--- a/lgsm/functions/command_dev_clear_functions.sh
+++ /dev/null
@@ -1,24 +0,0 @@
-#!/bin/bash
-# LinuxGSM command_dev_clear_functions.sh module
-# Author: Daniel Gibbs
-# Contributors: http://linuxgsm.com/contrib
-# Website: https://linuxgsm.com
-# Description: Deletes the contents of the functions dir.
-
-commandname="DEV-CLEAR-MODULES"
-commandaction="Clearing modules"
-functionselfname="$(basename "$(readlink -f "${BASH_SOURCE[0]}")")"
-fn_firstcommand_set
-
-echo -e "================================="
-echo -e "Clear Functions"
-echo -e "================================="
-echo -e ""
-if fn_prompt_yn "Do you want to delete all functions?" Y; then
-	rm -rfv "${functionsdir:?}/"*
-	rm -rfv "${configdirdefault:?}/"*
-	fn_script_log_info "Cleared modules directory"
-	fn_script_log_info "Cleared default config directory"
-fi
-
-core_exit.sh
diff --git a/lgsm/functions/command_dev_debug.sh b/lgsm/functions/command_dev_debug.sh
deleted file mode 100644
index 19f16d58e..000000000
--- a/lgsm/functions/command_dev_debug.sh
+++ /dev/null
@@ -1,23 +0,0 @@
-#!/bin/bash
-# LinuxGSM command_dev_debug.sh module
-# Author: Daniel Gibbs
-# Contributors: http://linuxgsm.com/contrib
-# Website: https://linuxgsm.com
-# Description: Dev only: Enables debugging log to be saved to dev-debug.log.
-
-commandname="DEV-DEBUG"
-commandaction="Developer debug"
-functionselfname="$(basename "$(readlink -f "${BASH_SOURCE[0]}")")"
-fn_firstcommand_reset
-
-if [ -f "${rootdir}/.dev-debug" ]; then
-	rm -f "${rootdir:?}/.dev-debug"
-	fn_print_ok_nl "Disabled dev-debug"
-	fn_script_log_info "Disabled dev-debug"
-else
-	date '+%s' > "${rootdir}/.dev-debug"
-	fn_print_ok_nl "Enabled dev-debug"
-	fn_script_log_info "Enabled dev-debug"
-fi
-
-core_exit.sh
diff --git a/lgsm/functions/command_dev_detect_deps.sh b/lgsm/functions/command_dev_detect_deps.sh
deleted file mode 100644
index d16b74418..000000000
--- a/lgsm/functions/command_dev_detect_deps.sh
+++ /dev/null
@@ -1,231 +0,0 @@
-#!/bin/bash
-# LinuxGSM command_dev_detect_deps.sh module
-# Author: Daniel Gibbs
-# Contributors: http://linuxgsm.com/contrib
-# Website: https://linuxgsm.com
-# Description: Detects dependencies the server binary requires.
-
-commandname="DEV-DETECT-DEPS"
-commandaction="Developer detect deps"
-functionselfname="$(basename "$(readlink -f "${BASH_SOURCE[0]}")")"
-fn_firstcommand_set
-
-echo -e "================================="
-echo -e "Dependencies Checker"
-echo -e "================================="
-echo -e "Checking directory: "
-echo -e "${serverfiles}"
-if [ "$(command -v eu-readelf 2> /dev/null)" ]; then
-	readelf=eu-readelf
-elif [ "$(command -v readelf 2> /dev/null)" ]; then
-	readelf=readelf
-else
-	echo -e "readelf/eu-readelf not installed"
-fi
-files=$(find "${serverfiles}" | wc -l)
-find "${serverfiles}" -type f -print0 \
-	| while IFS= read -r -d $'\0' line; do
-		if [ "${readelf}" == "eu-readelf" ]; then
-			${readelf} -d "${line}" 2> /dev/null | grep NEEDED | awk '{ print $4 }' | sed 's/\[//g;s/\]//g' >> "${tmpdir}/.depdetect_readelf"
-		else
-			${readelf} -d "${line}" 2> /dev/null | grep NEEDED | awk '{ print $5 }' | sed 's/\[//g;s/\]//g' >> "${tmpdir}/.depdetect_readelf"
-		fi
-		echo -n "${i} / ${files}" $'\r'
-		((i++))
-	done
-
-sort "${tmpdir}/.depdetect_readelf" | uniq > "${tmpdir}/.depdetect_readelf_uniq"
-
-touch "${tmpdir}/.depdetect_centos_list"
-touch "${tmpdir}/.depdetect_ubuntu_list"
-touch "${tmpdir}/.depdetect_debian_list"
-
-while read -r lib; do
-	echo -e "${lib}"
-	libs_array=(libm.so.6 libc.so.6 libtcmalloc_minimal.so.4 libpthread.so.0 libdl.so.2 libnsl.so.1 libgcc_s.so.1 librt.so.1 ld-linux.so.2 libdbus-glib-1.so.2 libgio-2.0.so.0 libglib-2.0.so.0 libGL.so.1 libgobject-2.0.so.0 libnm-glib.so.4 libnm-util.so.2)
-	for lib_file in "${libs_array[@]}"; do
-		if [ "${lib}" == "${lib_file}" ]; then
-			echo -e "glibc.i686" >> "${tmpdir}/.depdetect_centos_list"
-			echo -e "lib32gcc1" >> "${tmpdir}/.depdetect_ubuntu_list"
-			echo -e "lib32gcc1" >> "${tmpdir}/.depdetect_debian_list"
-			libdetected=1
-		fi
-	done
-
-	libs_array=(libawt.so libjava.so libjli.so libjvm.so libnet.so libnio.so libverify.so)
-	for lib_file in "${libs_array[@]}"; do
-		if [ "${lib}" == "${lib_file}" ]; then
-			echo -e "java-1.8.0-openjdk" >> "${tmpdir}/.depdetect_centos_list"
-			echo -e "default-jre" >> "${tmpdir}/.depdetect_ubuntu_list"
-			echo -e "default-jre" >> "${tmpdir}/.depdetect_debian_list"
-			libdetected=1
-		fi
-	done
-
-	libs_array=(libtier0.so libtier0_srv.so libvstdlib_srv.so Core.so libvstdlib.so libtier0_s.so Editor.so Engine.so liblua.so libsteam_api.so ld-linux-x86-64.so.2 libPhysX3_x86.so libPhysX3Common_x86.so libPhysX3Cooking_x86.so)
-	for lib_file in "${libs_array[@]}"; do
-		# Known shared libs what dont requires dependencies.
-		if [ "${lib}" == "${lib_file}" ]; then
-			libdetected=1
-		fi
-	done
-
-	if [ "${lib}" == "libstdc++.so.6" ]; then
-		echo -e "libstdc++.i686" >> "${tmpdir}/.depdetect_centos_list"
-		echo -e "libstdc++6:i386" >> "${tmpdir}/.depdetect_ubuntu_list"
-		echo -e "libstdc++6:i386" >> "${tmpdir}/.depdetect_debian_list"
-		libdetected=1
-	elif [ "${lib}" == "libstdc++.so.5" ]; then
-		echo -e "compat-libstdc++-33.i686" >> "${tmpdir}/.depdetect_centos_list"
-		echo -e "libstdc++5:i386" >> "${tmpdir}/.depdetect_ubuntu_list"
-		echo -e "libstdc++5:i386" >> "${tmpdir}/.depdetect_debian_list"
-		libdetected=1
-	elif [ "${lib}" == "libcurl-gnutls.so.4" ]; then
-		echo -e "libcurl.i686" >> "${tmpdir}/.depdetect_centos_list"
-		echo -e "libcurl4-gnutls-dev:i386" >> "${tmpdir}/.depdetect_ubuntu_list"
-		echo -e "libcurl4-gnutls-dev:i386" >> "${tmpdir}/.depdetect_debian_list"
-		libdetected=1
-	elif [ "${lib}" == "libspeex.so.1" ] || [ "${lib}" == "libspeexdsp.so.1" ]; then
-		echo -e "speex.i686" >> "${tmpdir}/.depdetect_centos_list"
-		echo -e "speex:i386" >> "${tmpdir}/.depdetect_ubuntu_list"
-		echo -e "speex:i386" >> "${tmpdir}/.depdetect_debian_list"
-		libdetected=1
-	elif [ "${lib}" == "./libSDL-1.2.so.0" ] || [ "${lib}" == "libSDL-1.2.so.0" ]; then
-		echo -e "SDL.i686" >> "${tmpdir}/.depdetect_centos_list"
-		echo -e "libsdl1.2debian" >> "${tmpdir}/.depdetect_ubuntu_list"
-		echo -e "libsdl1.2debian" >> "${tmpdir}/.depdetect_debian_list"
-		libdetected=1
-	elif [ "${lib}" == "libtbb.so.2" ]; then
-		echo -e "tbb.i686" >> "${tmpdir}/.depdetect_centos_list"
-		echo -e "libtbb2" >> "${tmpdir}/.depdetect_ubuntu_list"
-		echo -e "libtbb2" >> "${tmpdir}/.depdetect_debian_list"
-		libdetected=1
-
-	elif [ "${lib}" == "libXrandr.so.2" ]; then
-		echo -e "libXrandr" >> "${tmpdir}/.depdetect_centos_list"
-		echo -e "libxrandr2" >> "${tmpdir}/.depdetect_ubuntu_list"
-		echo -e "libxrandr2" >> "${tmpdir}/.depdetect_debian_list"
-		libdetected=1
-	elif [ "${lib}" == "libXext.so.6" ]; then
-		echo -e "libXext" >> "${tmpdir}/.depdetect_centos_list"
-		echo -e "libxext6" >> "${tmpdir}/.depdetect_ubuntu_list"
-		echo -e "libxext6" >> "${tmpdir}/.depdetect_debian_list"
-		libdetected=1
-	elif [ "${lib}" == "libXtst.so.6" ]; then
-		echo -e "libXtst" >> "${tmpdir}/.depdetect_centos_list"
-		echo -e "libxtst6" >> "${tmpdir}/.depdetect_ubuntu_list"
-		echo -e "libxtst6" >> "${tmpdir}/.depdetect_debian_list"
-		libdetected=1
-	elif [ "${lib}" == "libpulse.so.0" ]; then
-		echo -e "pulseaudio-libs" >> "${tmpdir}/.depdetect_centos_list"
-		echo -e "libpulse0" >> "${tmpdir}/.depdetect_ubuntu_list"
-		echo -e "libpulse0" >> "${tmpdir}/.depdetect_debian_list"
-		libdetected=1
-	elif [ "${lib}" == "libopenal.so.1" ]; then
-		echo -e "" >> "${tmpdir}/.depdetect_centos_list"
-		echo -e "libopenal1" >> "${tmpdir}/.depdetect_ubuntu_list"
-		echo -e "libopenal1" >> "${tmpdir}/.depdetect_debian_list"
-		libdetected=1
-	elif [ "${lib}" == "libgconf-2.so.4" ]; then
-		echo -e "GConf2" >> "${tmpdir}/.depdetect_centos_list"
-		echo -e "libgconf2-4" >> "${tmpdir}/.depdetect_ubuntu_list"
-		echo -e "libgconf2-4" >> "${tmpdir}/.depdetect_debian_list"
-		libdetected=1
-	elif [ "${lib}" == "libz.so.1" ]; then
-		echo -e "zlib" >> "${tmpdir}/.depdetect_centos_list"
-		echo -e "zlib1g" >> "${tmpdir}/.depdetect_ubuntu_list"
-		echo -e "zlib1g" >> "${tmpdir}/.depdetect_debian_list"
-		libdetected=1
-	elif [ "${lib}" == "libatk-1.0.so.0" ]; then
-		echo -e "atk" >> "${tmpdir}/.depdetect_centos_list"
-		echo -e "libatk1.0-0" >> "${tmpdir}/.depdetect_ubuntu_list"
-		echo -e "libatk1.0-0" >> "${tmpdir}/.depdetect_debian_list"
-		libdetected=1
-	elif [ "${lib}" == "libcairo.so.2" ]; then
-		echo -e "cairo" >> "${tmpdir}/.depdetect_centos_list"
-		echo -e "libcairo2" >> "${tmpdir}/.depdetect_ubuntu_list"
-		echo -e "libcairo2" >> "${tmpdir}/.depdetect_debian_list"
-		libdetected=1
-	elif [ "${lib}" == "libfontconfig.so.1" ]; then
-		echo -e "fontconfig" >> "${tmpdir}/.depdetect_centos_list"
-		echo -e "libfontconfig1" >> "${tmpdir}/.depdetect_ubuntu_list"
-		echo -e "libfontconfig1" >> "${tmpdir}/.depdetect_debian_list"
-		libdetected=1
-	elif [ "${lib}" == "libfreetype.so.6" ]; then
-		echo -e "freetype" >> "${tmpdir}/.depdetect_centos_list"
-		echo -e "libfreetype6" >> "${tmpdir}/.depdetect_ubuntu_list"
-		echo -e "libfreetype6" >> "${tmpdir}/.depdetect_debian_list"
-		libdetected=1
-	elif [ "${lib}" == "libc++.so.1" ]; then
-		echo -e "libcxx" >> "${tmpdir}/.depdetect_centos_list"
-		echo -e "libc++1" >> "${tmpdir}/.depdetect_ubuntu_list"
-		echo -e "libc++1" >> "${tmpdir}/.depdetect_debian_list"
-		libdetected=1
-	fi
-
-	if [ "${libdetected}" != "1" ]; then
-		unknownlib=1
-		echo -e "${lib}" >> "${tmpdir}/.depdetect_unknown"
-	fi
-	unset libdetected
-done < "${tmpdir}/.depdetect_readelf_uniq"
-
-sort "${tmpdir}/.depdetect_centos_list" | uniq >> "${tmpdir}/.depdetect_centos_list_uniq"
-sort "${tmpdir}/.depdetect_ubuntu_list" | uniq >> "${tmpdir}/.depdetect_ubuntu_list_uniq"
-sort "${tmpdir}/.depdetect_debian_list" | uniq >> "${tmpdir}/.depdetect_debian_list_uniq"
-if [ "${unknownlib}" == "1" ]; then
-	sort "${tmpdir}/.depdetect_unknown" | uniq >> "${tmpdir}/.depdetect_unknown_uniq"
-fi
-
-awk -vORS='' '{ print $1,$2 }' "${tmpdir}/.depdetect_centos_list_uniq" > "${tmpdir}/.depdetect_centos_line"
-awk -vORS='' '{ print $1,$2 }' "${tmpdir}/.depdetect_ubuntu_list_uniq" > "${tmpdir}/.depdetect_ubuntu_line"
-awk -vORS='' '{ print $1,$2 }' "${tmpdir}/.depdetect_debian_list_uniq" > "${tmpdir}/.depdetect_debian_line"
-echo -e ""
-echo -e ""
-echo -e "Required Dependencies"
-echo -e "================================="
-echo -e "${executable}"
-echo -e ""
-echo -e "CentOS"
-echo -e "================================="
-cat "${tmpdir}/.depdetect_centos_line"
-echo -e ""
-echo -e ""
-echo -e "Ubuntu"
-echo -e "================================="
-cat "${tmpdir}/.depdetect_ubuntu_line"
-echo -e ""
-echo -e ""
-echo -e "Debian"
-echo -e "================================="
-cat "${tmpdir}/.depdetect_debian_line"
-echo -e ""
-if [ "${unknownlib}" == "1" ]; then
-	echo -e ""
-	echo -e "Unknown shared Library"
-	echo -e "================================="
-	cat "${tmpdir}/.depdetect_unknown"
-fi
-echo -e ""
-echo -e "Required Librarys"
-echo -e "================================="
-sort "${tmpdir}/.depdetect_readelf" | uniq
-echo -en "\n"
-rm -f "${tmpdir:?}/.depdetect_centos_line"
-rm -f "${tmpdir:?}/.depdetect_centos_list"
-rm -f "${tmpdir:?}/.depdetect_centos_list_uniq"
-
-rm -f "${tmpdir:?}/.depdetect_debian_line"
-rm -f "${tmpdir:?}/.depdetect_debian_list"
-rm -f "${tmpdir:?}/.depdetect_debian_list_uniq"
-
-rm -f "${tmpdir:?}/.depdetect_ubuntu_line"
-rm -f "${tmpdir:?}/.depdetect_ubuntu_list"
-rm -f "${tmpdir:?}/.depdetect_ubuntu_list_uniq"
-
-rm -f "${tmpdir:?}/.depdetect_readelf"
-rm -f "${tmpdir:?}/.depdetect_readelf_uniq"
-rm -f "${tmpdir:?}/.depdetect_unknown"
-rm -f "${tmpdir:?}/.depdetect_unknown_uniq"
-
-core_exit.sh
diff --git a/lgsm/functions/command_dev_detect_glibc.sh b/lgsm/functions/command_dev_detect_glibc.sh
deleted file mode 100644
index 73280e55d..000000000
--- a/lgsm/functions/command_dev_detect_glibc.sh
+++ /dev/null
@@ -1,92 +0,0 @@
-#!/bin/bash
-# LinuxGSM command_dev_detect_glibc.sh module
-# Author: Daniel Gibbs
-# Contributors: http://linuxgsm.com/contrib
-# Website: https://linuxgsm.com
-# Description: Automatically detects the version of GLIBC that is required.
-# Can check a file or directory recursively.
-
-commandname="DEV-DETECT-GLIBC"
-commandaction="Developer detect glibc"
-functionselfname="$(basename "$(readlink -f "${BASH_SOURCE[0]}")")"
-fn_firstcommand_set
-
-echo -e "================================="
-echo -e "glibc Requirements Checker"
-echo -e "================================="
-
-if [ ! "$(command -v objdump)" ]; then
-	fn_print_failure_nl "objdump is missing"
-	fn_script_log_fatal "objdump is missing"
-	core_exit.sh
-fi
-
-if [ -z "${serverfiles}" ]; then
-	dir=$(dirname "$(readlink -f "${BASH_SOURCE[0]}")")
-fi
-
-if [ -d "${serverfiles}" ]; then
-	echo -e "Checking directory: "
-	echo -e "${serverfiles}"
-elif [ -f "${serverfiles}" ]; then
-	echo -e "Checking file: "
-	echo -e "${serverfiles}"
-fi
-echo -e ""
-
-glibc_check_dir_array=(steamcmddir serverfiles)
-for glibc_check_var in "${glibc_check_dir_array[@]}"; do
-	if [ "${glibc_check_var}" == "serverfiles" ]; then
-		glibc_check_dir="${serverfiles}"
-		glibc_check_name="${gamename}"
-	elif [ "${glibc_check_var}" == "steamcmddir" ]; then
-		glibc_check_dir="${steamcmddir}"
-		glibc_check_name="SteamCMD"
-	fi
-
-	if [ -d "${glibc_check_dir}" ]; then
-		glibc_check_files=$(find "${glibc_check_dir}" | wc -l)
-		find "${glibc_check_dir}" -type f -print0 \
-			| while IFS= read -r -d $'\0' line; do
-				glibcversion=$(objdump -T "${line}" 2> /dev/null | grep -oP "GLIBC[^ ]+" | grep -v GLIBCXX | sort | uniq | sort -r --version-sort | head -n 1)
-				if [ "${glibcversion}" ]; then
-					echo -e "${glibcversion}: ${line}" >> "${tmpdir}/detect_glibc_files_${glibc_check_var}.tmp"
-				fi
-				objdump -T "${line}" 2> /dev/null | grep -oP "GLIBC[^ ]+" >> "${tmpdir}/detect_glibc_${glibc_check_var}.tmp"
-				echo -n "${i} / ${glibc_check_files}" $'\r'
-				((i++))
-			done
-		echo -e ""
-		echo -e ""
-		echo -e "${glibc_check_name} glibc Requirements"
-		echo -e "================================="
-		if [ -f "${tmpdir}/detect_glibc_files_${glibc_check_var}.tmp" ]; then
-			echo -e "Required glibc"
-			cat "${tmpdir}/detect_glibc_${glibc_check_var}.tmp" | sort | uniq | sort -r --version-sort | head -1 | tee -a "${tmpdir}/detect_glibc_highest.tmp"
-			echo -e ""
-			echo -e "Files requiring GLIBC"
-			echo -e "Highest verion required: filename"
-			cat "${tmpdir}/detect_glibc_files_${glibc_check_var}.tmp"
-			echo -e ""
-			echo -e "All required GLIBC versions"
-			cat "${tmpdir}/detect_glibc_${glibc_check_var}.tmp" | sort | uniq | sort -r --version-sort
-			rm -f "${tmpdir:?}/detect_glibc_${glibc_check_var}.tmp"
-			rm -f "${tmpdir:?}/detect_glibc_files_${glibc_check_var}.tmp"
-		else
-			fn_print_information_nl "glibc is not required"
-		fi
-	else
-		fn_print_information_nl "${glibc_check_name} is not installed"
-	fi
-done
-echo -e ""
-echo -e "Final glibc Requirement"
-echo -e "================================="
-if [ -f "${tmpdir}/detect_glibc_highest.tmp" ]; then
-	cat "${tmpdir}/detect_glibc_highest.tmp" | sort | uniq | sort -r --version-sort | head -1
-	rm -f "${tmpdir:?}/detect_glibc_highest.tmp"
-else
-	fn_print_information_nl "glibc is not required"
-fi
-
-core_exit.sh
diff --git a/lgsm/functions/command_dev_detect_ldd.sh b/lgsm/functions/command_dev_detect_ldd.sh
deleted file mode 100644
index 43630d4e9..000000000
--- a/lgsm/functions/command_dev_detect_ldd.sh
+++ /dev/null
@@ -1,61 +0,0 @@
-#!/bin/bash
-# LinuxGSM command_dev_detect_ldd.sh module
-# Author: Daniel Gibbs
-# Contributors: http://linuxgsm.com/contrib
-# Website: https://linuxgsm.com
-# Description: Automatically detects required deps using ldd.
-# Can check a file or directory recursively.
-
-commandname="DEV-DETECT-LDD"
-commandaction="Developer detect ldd"
-functionselfname="$(basename "$(readlink -f "${BASH_SOURCE[0]}")")"
-fn_firstcommand_set
-
-echo -e "================================="
-echo -e "Shared Object dependencies Checker"
-echo -e "================================="
-
-if [ -z "${serverfiles}" ]; then
-	dir=$(dirname "$(readlink -f "${BASH_SOURCE[0]}")")
-fi
-
-if [ -d "${serverfiles}" ]; then
-	echo -e "Checking directory: "
-	echo -e "${serverfiles}"
-elif [ -f "${serverfiles}" ]; then
-	echo -e "Checking file: "
-	echo -e "${serverfiles}"
-fi
-echo -e ""
-touch "${tmpdir}/detect_ldd.tmp"
-touch "${tmpdir}/detect_ldd_not_found.tmp"
-
-files=$(find "${serverfiles}" | wc -l)
-find "${serverfiles}" -type f -print0 \
-	| while IFS= read -r -d $'\0' line; do
-		if ldd "${line}" 2> /dev/null | grep -v "not a dynamic executable"; then
-			echo -e "${line}" >> "${tmpdir}/detect_ldd.tmp"
-			ldd "${line}" 2> /dev/null | grep -v "not a dynamic executable" >> "${tmpdir}/detect_ldd.tmp"
-			if ldd "${line}" 2> /dev/null | grep -v "not a dynamic executable" | grep "not found"; then
-				echo -e "${line}" >> "${tmpdir}/detect_ldd_not_found.tmp"
-				ldd "${line}" 2> /dev/null | grep -v "not a dynamic executable" | grep "not found" >> "${tmpdir}/detect_ldd_not_found.tmp"
-			fi
-		fi
-		echo -n "$i / $files" $'\r'
-		((i++))
-	done
-echo -e ""
-echo -e ""
-echo -e "All"
-echo -e "================================="
-cat "${tmpdir}/detect_ldd.tmp"
-
-echo -e ""
-echo -e "Not Found"
-echo -e "================================="
-cat "${tmpdir}/detect_ldd_not_found.tmp"
-
-rm -f "${tmpdir:?}/detect_ldd.tmp"
-rm -f "${tmpdir:?}/detect_ldd_not_found.tmp"
-
-core_exit.sh
diff --git a/lgsm/functions/command_dev_query_raw.sh b/lgsm/functions/command_dev_query_raw.sh
deleted file mode 100644
index 26884b259..000000000
--- a/lgsm/functions/command_dev_query_raw.sh
+++ /dev/null
@@ -1,280 +0,0 @@
-#!/bin/bash
-# LinuxGSM command_dev_query_raw.sh module
-# Author: Daniel Gibbs
-# Contributors: http://linuxgsm.com/contrib
-# Website: https://linuxgsm.com
-# Description: Raw gamedig output of the server.
-
-commandname="DEV-QUERY-RAW"
-commandaction="Developer query raw"
-functionselfname="$(basename "$(readlink -f "${BASH_SOURCE[0]}")")"
-fn_firstcommand_set
-
-check.sh
-info_game.sh
-info_distro.sh
-info_messages.sh
-
-echo -e ""
-echo -e "${lightgreen}Query IP Addresses${default}"
-echo -e "=================================================================="
-echo -e ""
-for queryip in "${queryips[@]}"; do
-	echo -e "${queryip}"
-done
-echo -e ""
-echo -e "${lightgreen}Game Server Ports${default}"
-echo -e "=================================================================="
-{
-	echo -e "${lightblue}Port Name \tPort Number \tStatus \tTCP \tUDP${default}"
-	if [ -v port ]; then
-		echo -e "Game: \t${port} \t$(ss -tupl | grep -c ${port}) \t$(ss -tupl | grep ${port} | grep tcp | awk '{ print $2 }') \t$(ss -tupl | grep ${port} | grep udp | awk '{ print $2 }')"
-	else
-		echo -e "Game:"
-	fi
-	if [ "${shortname}" == "rw" ]; then
-		if [ -v port2 ]; then
-			echo -e "Game+1: \t${port2} \t$(ss -tupl | grep -c ${port}) \t$(ss -tupl | grep ${port2} | grep tcp | awk '{ print $2 }') \t$(ss -tupl | grep ${port2} | grep udp | awk '{ print $2 }')"
-		else
-			echo -e "Game+1:"
-		fi
-
-		if [ -v port3 ]; then
-			echo -e "Game+2: \t${port3} \t$(ss -tupl | grep -c ${port}) \t$(ss -tupl | grep ${port3} | grep tcp | awk '{ print $2 }') \t$(ss -tupl | grep ${port3} | grep udp | awk '{ print $2 }')"
-		else
-			echo -e "Game+2:"
-		fi
-
-		if [ -v port4 ]; then
-			echo -e "Game+3: \t${port4} \t$(ss -tupl | grep -c ${port}) \t$(ss -tupl | grep ${port4} | grep tcp | awk '{ print $2 }') \t$(ss -tupl | grep ${port4} | grep udp | awk '{ print $2 }')"
-		else
-			echo -e "Game+3:"
-		fi
-	fi
-
-	if [ -v port401 ]; then
-		echo -e "Game+400: \t${port401} \t$(ss -tupl | grep -c ${port401}) \t$(ss -tupl | grep ${port401} | grep tcp | awk '{ print $2 }') \t$(ss -tupl | grep ${port401} | grep udp | awk '{ print $2 }')"
-	else
-		echo -e "Game+400:"
-	fi
-
-	if [ -v portipv6 ]; then
-		echo -e "Game ipv6: \t${portipv6} \t$(ss -tupl | grep -c ${portipv6}) \t$(ss -tupl | grep ${portipv6} | grep tcp | awk '{ print $2 }') \t$(ss -tupl | grep ${portipv6} | grep udp | awk '{ print $2 }')"
-	else
-		echo -e "Game ipv6:"
-	fi
-
-	if [ -v queryport ]; then
-		echo -e "Query: \t${queryport} \t$(ss -tupl | grep -c ${queryport}) \t$(ss -tupl | grep ${queryport} | grep tcp | awk '{ print $2 }') \t$(ss -tupl | grep ${queryport} | grep udp | awk '{ print $2 }')"
-	else
-		echo -e "Query:"
-	fi
-
-	if [ -v httpport ]; then
-		echo -e "HTTP: \t${httpport} \t$(ss -tupl | grep -c ${httpport}) \t$(ss -tupl | grep ${httpport} | grep tcp | awk '{ print $2 }') \t$(ss -tupl | grep ${httpport} | grep udp | awk '{ print $2 }')"
-	else
-		echo -e "HTTP:"
-	fi
-
-	if [ -v httpqueryport ]; then
-		echo -e "HTTP Query: \t${httpqueryport} \t$(ss -tupl | grep -c ${httpqueryport}) \t$(ss -tupl | grep ${httpqueryport} | grep tcp | awk '{ print $2 }') \t$(ss -tupl | grep ${httpqueryport} | grep udp | awk '{ print $2 }')"
-	else
-		echo -e "HTTP Query:"
-	fi
-
-	if [ -v webadminport ]; then
-		echo -e "Web Admin: \t${webadminport} \t$(ss -tupl | grep -c ${webadminport}) \t$(ss -tupl | grep ${webadminport} | grep tcp | awk '{ print $2 }') \t$(ss -tupl | grep ${webadminport} | grep udp | awk '{ print $2 }')"
-	else
-		echo -e "Web Admin:"
-	fi
-
-	if [ -v clientport ]; then
-		echo -e "Client: \t${clientport} \t$(ss -tupl | grep -c ${clientport}) \t$(ss -tupl | grep ${clientport} | grep tcp | awk '{ print $2 }') \t$(ss -tupl | grep ${clientport} | grep udp | awk '{ print $2 }')"
-	else
-		echo -e "Client:"
-	fi
-
-	if [ -v rconport ]; then
-		echo -e "RCON: \t${rconport} \t$(ss -tupl | grep -c ${rconport}) \t$(ss -tupl | grep ${rconport} | grep tcp | awk '{ print $2 }') \t$(ss -tupl | grep ${rconport} | grep udp | awk '{ print $2 }')"
-	else
-		echo -e "RCON:"
-	fi
-
-	if [ -v rawport ]; then
-		echo -e "RAW UDP Socket: \t${rawport} \t$(ss -tupl | grep -c ${rawport}) \t$(ss -tupl | grep ${rawport} | grep tcp | awk '{ print $2 }') \t$(ss -tupl | grep ${rawport} | grep udp | awk '{ print $2 }')"
-	else
-		echo -e "RAW UDP Socket:"
-	fi
-
-	if [ -v masterport ]; then
-		echo -e "Game: Master: \t${masterport} \t$(ss -tupl | grep -c ${masterport}) \t$(ss -tupl | grep ${masterport} | grep tcp | awk '{ print $2 }') \t$(ss -tupl | grep ${masterport} | grep udp | awk '{ print $2 }')"
-	else
-		echo -e "Game: Master:"
-	fi
-
-	if [ -v steamport ]; then
-		echo -e "Steam: \t${steamport} \t$(ss -tupl | grep -c ${steamport}) \t$(ss -tupl | grep ${steamport} | grep tcp | awk '{ print $2 }') \t$(ss -tupl | grep ${steamport} | grep udp | awk '{ print $2 }')"
-	else
-		echo -e "Steam:"
-	fi
-
-	if [ -v steamauthport ]; then
-		echo -e "Steam: Auth: \t${steamauthport} \t$(ss -tupl | grep -c ${steamauthport}) \t$(ss -tupl | grep ${steamauthport} | grep tcp | awk '{ print $2 }') \t$(ss -tupl | grep ${steamauthport} | grep udp | awk '{ print $2 }')"
-	else
-		echo -e "Steam: Auth:"
-	fi
-
-	if [ -v steammasterport ]; then
-		echo -e "Steam: Master: \t${steammasterport} \t$(ss -tupl | grep -c ${steammasterport}) \t$(ss -tupl | grep ${steammasterport} | grep tcp | awk '{ print $2 }') \t$(ss -tupl | grep ${steammasterport} | grep udp | awk '{ print $2 }')"
-	else
-		echo -e "Steam: Master:"
-	fi
-
-	if [ -v steamqueryport ]; then
-		echo -e "Steam: Query: \t${steamqueryport} \t$(ss -tupl | grep -c ${steamqueryport}) \t$(ss -tupl | grep ${steamqueryport} | grep tcp | awk '{ print $2 }') \t$(ss -tupl | grep ${steamqueryport} | grep udp | awk '{ print $2 }')"
-	else
-		echo -e "Steam: Query:"
-	fi
-	if [ -v beaconport ]; then
-		echo -e "Beacon: \t${beaconport} \t$(ss -tupl | grep -c ${beaconport}) \t$(ss -tupl | grep ${beaconport} | grep tcp | awk '{ print $2 }') \t$(ss -tupl | grep ${beaconport} | grep udp | awk '{ print $2 }')"
-	else
-		echo -e "Beacon:"
-	fi
-
-	if [ -v appport ]; then
-		echo -e "App: \t${appport} \t$(ss -tupl | grep -c ${appport}) \t$(ss -tupl | grep ${appport} | grep tcp | awk '{ print $2 }') \t$(ss -tupl | grep ${appport} | grep udp | awk '{ print $2 }')"
-	else
-		echo -e "App:"
-	fi
-
-	if [ -v telnetport ]; then
-		echo -e "Telnet: \t${telnetport} \t$(ss -tupl | grep -c ${telnetport}) \t$(ss -tupl | grep ${telnetport} | grep tcp | awk '{ print $2 }') \t$(ss -tupl | grep ${telnetport} | grep udp | awk '{ print $2 }')"
-	else
-		echo -e "Telnet:"
-	fi
-
-	if [ -v sourcetvport ]; then
-		echo -e "SourceTV: \t${sourcetvport} \t$(ss -tupl | grep -c ${sourcetvport}) \t$(ss -tupl | grep ${sourcetvport} | grep tcp | awk '{ print $2 }') \t$(ss -tupl | grep ${sourcetvport} | grep udp | awk '{ print $2 }')"
-	else
-		echo -e "SourceTV:"
-	fi
-
-	if [ -v fileport ]; then
-		echo -e "File: \t${fileport} \t$(ss -tupl | grep -c ${fileport}) \t$(ss -tupl | grep ${fileport} | grep tcp | awk '{ print $2 }') \t$(ss -tupl | grep ${fileport} | grep udp | awk '{ print $2 }')"
-	else
-		echo -e "File:"
-	fi
-
-	if [ -v udplinkport ]; then
-		echo -e "UDP Link: \t${udplinkport} \t$(ss -tupl | grep -c ${udplinkport}) \t$(ss -tupl | grep ${udplinkport} | grep tcp | awk '{ print $2 }') \t$(ss -tupl | grep ${udplinkport} | grep udp | awk '{ print $2 }')"
-	else
-		echo -e "UDP Link:"
-	fi
-
-	if [ -v voiceport ]; then
-		echo -e "Voice: \t${voiceport} \t$(ss -tupl | grep -c ${voiceport}) \t$(ss -tupl | grep ${voiceport} | grep tcp | awk '{ print $2 }') \t$(ss -tupl | grep ${voiceport} | grep udp | awk '{ print $2 }')"
-	else
-		echo -e "Voice:"
-	fi
-
-	if [ -v voiceunusedport ]; then
-		echo -e "Voice (Unused): \t${voiceunusedport} \t$(ss -tupl | grep -c ${voiceunusedport}) \t$(ss -tupl | grep ${voiceunusedport} | grep tcp | awk '{ print $2 }') \t$(ss -tupl | grep ${voiceunusedport} | grep udp | awk '{ print $2 }')"
-	else
-		echo -e "Voice (Unused):"
-	fi
-
-	if [ -v battleeyeport ]; then
-		echo -e "BattleEye: \t${battleeyeport} \t$(ss -tupl | grep -c ${battleeyeport}) \t$(ss -tupl | grep ${battleeyeport} | grep tcp | awk '{ print $2 }') \t$(ss -tupl | grep ${battleeyeport} | grep udp | awk '{ print $2 }')"
-	else
-		echo -e "BattleEye:"
-	fi
-
-	if [ -v statsport ]; then
-		echo -e "Stats: \t${battleeyeport} \t$(ss -tupl | grep -c ${statsport}) \t$(ss -tupl | grep ${statsport} | grep tcp | awk '{ print $2 }') \t$(ss -tupl | grep ${statsport} | grep udp | awk '{ print $2 }')"
-	else
-		echo -e "Stats:"
-	fi
-
-} | column -s $'\t' -t
-echo -e ""
-echo -e "${lightgreen}SS Output${default}"
-echo -e "================================="
-fn_info_message_ports
-echo -e ""
-echo -e "${lightgreen}Query Port - Raw Output${default}"
-echo -e "=================================================================="
-echo -e ""
-echo -e "PORT: ${port}"
-echo -e "QUERY PORT: ${queryport}"
-echo -e ""
-echo -e "${lightgreen}Gamedig Raw Output${default}"
-echo -e "================================="
-echo -e ""
-if [ ! "$(command -v gamedig 2> /dev/null)" ]; then
-	fn_print_failure_nl "gamedig not installed"
-fi
-if [ ! "$(command -v jq 2> /dev/null)" ]; then
-	fn_print_failure_nl "jq not installed"
-fi
-for queryip in "${queryips[@]}"; do
-	query_gamedig.sh
-	echo -e "${gamedigcmd}"
-	echo""
-	echo "${gamedigraw}" | jq
-done
-echo -e ""
-echo -e "${lightgreen}gsquery Raw Output${default}"
-echo -e "================================="
-echo -e ""
-for queryip in "${queryips[@]}"; do
-	echo -e "./query_gsquery.py -a \"${queryip}\" -p \"${queryport}\" -e \"${querytype}\""
-	echo -e ""
-	if [ ! -f "${functionsdir}/query_gsquery.py" ]; then
-		fn_fetch_file_github "lgsm/functions" "query_gsquery.py" "${functionsdir}" "chmodx" "norun" "noforce" "nohash"
-	fi
-	"${functionsdir}"/query_gsquery.py -a "${queryip}" -p "${queryport}" -e "${querytype}"
-done
-echo -e ""
-echo -e "${lightgreen}TCP Raw Output${default}"
-echo -e "================================="
-echo -e ""
-for queryip in "${queryips[@]}"; do
-	echo -e "bash -c 'exec 3<> /dev/tcp/'${queryip}'/'${queryport}''"
-	echo -e ""
-	timeout 3 bash -c 'exec 3<> /dev/tcp/'${queryip}'/'${queryport}''
-	querystatus="$?"
-	echo -e ""
-	if [ "${querystatus}" == "0" ]; then
-		echo -e "TCP query PASS"
-	else
-		echo -e "TCP query FAIL"
-	fi
-done
-echo -e ""
-echo -e "${lightgreen}Game Port - Raw Output${default}"
-echo -e "=================================================================="
-echo -e ""
-echo -e "${lightgreen}TCP Raw Output${default}"
-echo -e "================================="
-echo -e ""
-for queryip in "${queryips[@]}"; do
-	echo -e "bash -c 'exec 3<> /dev/tcp/'${queryip}'/'${port}''"
-	echo -e ""
-	timeout 3 bash -c 'exec 3<> /dev/tcp/'${queryip}'/'${port}''
-	querystatus="$?"
-	echo -e ""
-	if [ "${querystatus}" == "0" ]; then
-		echo -e "TCP query PASS"
-	else
-		echo -e "TCP query FAIL"
-	fi
-done
-echo -e ""
-echo -e "${lightgreen}Steam Master Server Response${default}"
-echo -e "=================================================================="
-echo -e ""
-echo -e "Response: ${displaymasterserver}"
-echo -e ""
-
-exitcode=0
-core_exit.sh
diff --git a/lgsm/functions/command_donate.sh b/lgsm/functions/command_donate.sh
deleted file mode 100644
index f00a4d702..000000000
--- a/lgsm/functions/command_donate.sh
+++ /dev/null
@@ -1,26 +0,0 @@
-#!/bin/bash
-# LinuxGSM command_donate.sh module
-# Author: Daniel Gibbs
-# Contributors: http://linuxgsm.com/contrib
-# Website: https://linuxgsm.com
-# Description: Shows ways to donate.
-
-commandname="DONATE"
-commandaction="Donate"
-functionselfname="$(basename "$(readlink -f "${BASH_SOURCE[0]}")")"
-fn_firstcommand_set
-
-fn_print_ascii_logo
-echo -e "${lightyellow}Support LinuxGSM${default}"
-echo -e "================================="
-echo -e ""
-echo -e "Been using LinuxGSM?"
-echo -e "Consider donating to support development."
-echo -e ""
-echo -e "* ${lightblue}Patreon:${default} https://linuxgsm.com/patreon"
-echo -e "* ${lightblue}GitHub:${default} https://github.com/sponsors/dgibbs64"
-echo -e "* ${lightblue}PayPal:${default} https://linuxgsm.com/paypal"
-echo -e ""
-echo -e "LinuxGSM est. 2012"
-
-core_exit.sh
diff --git a/lgsm/functions/command_fastdl.sh b/lgsm/functions/command_fastdl.sh
deleted file mode 100644
index 78abd650a..000000000
--- a/lgsm/functions/command_fastdl.sh
+++ /dev/null
@@ -1,442 +0,0 @@
-#!/bin/bash
-# LinuxGSM command_fastdl.sh module
-# Author: Daniel Gibbs
-# Contributors: http://linuxgsm.com/contrib
-# Website: https://linuxgsm.com
-# Description: Creates a FastDL directory.
-
-commandname="FASTDL"
-commandaction="Fastdl"
-functionselfname="$(basename "$(readlink -f "${BASH_SOURCE[0]}")")"
-fn_firstcommand_set
-
-check.sh
-
-# Directories.
-if [ -z "${webdir}" ]; then
-	webdir="${rootdir}/public_html"
-fi
-fastdldir="${webdir}/fastdl"
-addonsdir="${systemdir}/addons"
-# Server lua autorun dir, used to autorun lua on client connect to the server.
-luasvautorundir="${systemdir}/lua/autorun/server"
-luafastdlfile="lgsm_cl_force_fastdl.lua"
-luafastdlfullpath="${luasvautorundir}/${luafastdlfile}"
-
-# Check if bzip2 is installed.
-if [ ! "$(command -v bzip2 2> /dev/null)" ]; then
-	fn_print_fail "bzip2 is not installed"
-	fn_script_log_fatal "bzip2 is not installed"
-	core_exit.sh
-fi
-
-# Header
-fn_print_header
-echo -e "More info: https://docs.linuxgsm.com/commands/fastdl"
-echo -e ""
-
-# Prompts user for FastDL creation settings.
-echo -e "${commandaction} setup"
-echo -e "================================="
-
-# Prompt for clearing old files if directory was already here.
-if [ -d "${fastdldir}" ]; then
-	fn_print_warning_nl "FastDL directory already exists."
-	echo -e "${fastdldir}"
-	echo -e ""
-	if fn_prompt_yn "Overwrite existing directory?" Y; then
-		fn_script_log_info "Overwrite existing directory: YES"
-	else
-		core_exit.sh
-	fi
-fi
-
-# Garry's Mod Specific.
-if [ "${shortname}" == "gmod" ]; then
-	# Prompt for download enforcer, which is using a .lua addfile resource generator.
-	if fn_prompt_yn "Force clients to download files?" Y; then
-		luaresource="on"
-		fn_script_log_info "Force clients to download files: YES"
-	else
-		luaresource="off"
-		fn_script_log_info "Force clients to download filesr: NO"
-	fi
-fi
-
-# Clears any fastdl directory content.
-fn_clear_old_fastdl() {
-	# Clearing old FastDL.
-	if [ -d "${fastdldir}" ]; then
-		echo -en "clearing existing FastDL directory ${fastdldir}..."
-		rm -rf "${fastdldir:?}"
-		exitcode=$?
-		if [ "${exitcode}" != 0 ]; then
-			fn_print_fail_eol_nl
-			fn_script_log_fatal "Clearing existing FastDL directory ${fastdldir}"
-			core_exit.sh
-		else
-			fn_print_ok_eol_nl
-			fn_script_log_pass "Clearing existing FastDL directory ${fastdldir}"
-		fi
-	fi
-}
-
-fn_fastdl_dirs() {
-	# Check and create directories.
-	if [ ! -d "${webdir}" ]; then
-		echo -en "creating web directory ${webdir}..."
-		mkdir -p "${webdir}"
-		exitcode=$?
-		if [ "${exitcode}" != 0 ]; then
-			fn_print_fail_eol_nl
-			fn_script_log_fatal "Creating web directory ${webdir}"
-			core_exit.sh
-		else
-			fn_print_ok_eol_nl
-			fn_script_log_pass "Creating web directory ${webdir}"
-		fi
-	fi
-	if [ ! -d "${fastdldir}" ]; then
-		echo -en "creating fastdl directory ${fastdldir}..."
-		mkdir -p "${fastdldir}"
-		exitcode=$?
-		if [ "${exitcode}" != 0 ]; then
-			fn_print_fail_eol_nl
-			fn_script_log_fatal "Creating fastdl directory ${fastdldir}"
-			core_exit.sh
-		else
-			fn_print_ok_eol_nl
-			fn_script_log_pass "Creating fastdl directory ${fastdldir}"
-		fi
-	fi
-}
-
-# Using this gist https://gist.github.com/agunnerson-ibm/efca449565a3e7356906
-fn_human_readable_file_size() {
-	local abbrevs=(
-		$((1 << 60)):ZB
-		$((1 << 50)):EB
-		$((1 << 40)):TB
-		$((1 << 30)):GB
-		$((1 << 20)):MB
-		$((1 << 10)):KB
-		$((1)):bytes
-	)
-
-	local bytes="${1}"
-	local precision="${2}"
-
-	if [[ "${bytes}" == "1" ]]; then
-		echo -e "1 byte"
-	else
-		for item in "${abbrevs[@]}"; do
-			local factor="${item%:*}"
-			local abbrev="${item#*:}"
-			if [[ "${bytes}" -ge "${factor}" ]]; then
-				size=$(bc -l <<< "${bytes} / ${factor}")
-				printf "%.*f %s\n" "${precision}" "${size}" "${abbrev}"
-				break
-			fi
-		done
-	fi
-}
-
-# Provides info about the fastdl directory content and prompts for confirmation.
-fn_fastdl_preview() {
-	# Remove any file list.
-	if [ -f "${tmpdir}/fastdl_files_to_compress.txt" ]; then
-		rm -f "${tmpdir:?}/fastdl_files_to_compress.txt"
-	fi
-	echo -e "analysing required files"
-	fn_script_log_info "Analysing required files"
-	# Garry's Mod
-	if [ "${shortname}" == "gmod" ]; then
-		cd "${systemdir}" || exit
-		allowed_extentions_array=("*.ain" "*.bsp" "*.mdl" "*.mp3" "*.ogg" "*.otf" "*.pcf" "*.phy" "*.png" "*.svg" "*.vtf" "*.vmt" "*.vtx" "*.vvd" "*.ttf" "*.wav")
-		for allowed_extention in "${allowed_extentions_array[@]}"; do
-			fileswc=0
-			tput sc
-			while read -r ext; do
-				((fileswc++))
-				tput rc
-				tput el
-				echo -e "gathering ${allowed_extention} : ${fileswc}..."
-				echo -e "${ext}" >> "${tmpdir}/fastdl_files_to_compress.txt"
-			done < <(find . -type f -iname "${allowed_extention}")
-			if [ ${fileswc} != 0 ]; then
-				fn_print_ok_eol_nl
-			else
-				fn_print_info_eol_nl
-			fi
-		done
-	# Source engine
-	else
-		fastdl_directories_array=("maps" "materials" "models" "particles" "sound" "resources")
-		for directory in "${fastdl_directories_array[@]}"; do
-			if [ -d "${systemdir}/${directory}" ]; then
-				if [ "${directory}" == "maps" ]; then
-					local allowed_extentions_array=("*.bsp" "*.ain" "*.nav" "*.jpg" "*.txt")
-				elif [ "${directory}" == "materials" ]; then
-					local allowed_extentions_array=("*.vtf" "*.vmt" "*.vbf" "*.png" "*.svg")
-				elif [ "${directory}" == "models" ]; then
-					local allowed_extentions_array=("*.vtx" "*.vvd" "*.mdl" "*.phy" "*.jpg" "*.png" "*.vmt" "*.vtf")
-				elif [ "${directory}" == "particles" ]; then
-					local allowed_extentions_array=("*.pcf")
-				elif [ "${directory}" == "sound" ]; then
-					local allowed_extentions_array=("*.wav" "*.mp3" "*.ogg")
-				fi
-				for allowed_extention in "${allowed_extentions_array[@]}"; do
-					fileswc=0
-					tput sc
-					while read -r ext; do
-						((fileswc++))
-						tput rc
-						tput el
-						echo -e "gathering ${directory} ${allowed_extention} : ${fileswc}..."
-						echo -e "${ext}" >> "${tmpdir}/fastdl_files_to_compress.txt"
-					done < <(find "${systemdir}/${directory}" -type f -iname "${allowed_extention}")
-					tput rc
-					tput el
-					echo -e "gathering ${directory} ${allowed_extention} : ${fileswc}..."
-					if [ ${fileswc} != 0 ]; then
-						fn_print_ok_eol_nl
-					else
-						fn_print_info_eol_nl
-					fi
-				done
-			fi
-		done
-	fi
-	if [ -f "${tmpdir}/fastdl_files_to_compress.txt" ]; then
-		echo -e "calculating total file size..."
-		fn_sleep_time
-		totalfiles=$(wc -l < "${tmpdir}/fastdl_files_to_compress.txt")
-		# Calculates total file size.
-		while read -r dufile; do
-			filesize=$(stat -c %s "${dufile}")
-			filesizetotal=$((filesizetotal + filesize))
-			exitcode=$?
-			if [ "${exitcode}" != 0 ]; then
-				fn_print_fail_eol_nl
-				fn_script_log_fatal "Calculating total file size."
-				core_exit.sh
-			fi
-		done < "${tmpdir}/fastdl_files_to_compress.txt"
-	else
-		fn_print_fail_eol_nl "generating file list"
-		fn_script_log_fatal "Generating file list."
-		core_exit.sh
-	fi
-	echo -e "about to compress ${totalfiles} files, total size $(fn_human_readable_file_size ${filesizetotal} 0)"
-	fn_script_log_info "${totalfiles} files, total size $(fn_human_readable_file_size ${filesizetotal} 0)"
-	rm -f "${tmpdir:?}/fastdl_files_to_compress.txt"
-	if ! fn_prompt_yn "Continue?" Y; then
-		fn_script_log "User exited"
-		core_exit.sh
-	fi
-}
-
-# Builds Garry's Mod fastdl directory content.
-fn_fastdl_gmod() {
-	cd "${systemdir}" || exit
-	for allowed_extention in "${allowed_extentions_array[@]}"; do
-		fileswc=0
-		tput sc
-		while read -r fastdlfile; do
-			((fileswc++))
-			tput rc
-			tput el
-			echo -e "copying ${allowed_extention} : ${fileswc}..."
-			cp --parents "${fastdlfile}" "${fastdldir}"
-			exitcode=$?
-			if [ "${exitcode}" != 0 ]; then
-				fn_print_fail_eol_nl
-				fn_script_log_fatal "Copying ${fastdlfile} > ${fastdldir}"
-				core_exit.sh
-			else
-				fn_script_log_pass "Copying ${fastdlfile} > ${fastdldir}"
-			fi
-		done < <(find . -type f -iname "${allowed_extention}")
-		if [ ${fileswc} != 0 ]; then
-			fn_print_ok_eol_nl
-		fi
-	done
-	# Correct addons directory structure for FastDL.
-	if [ -d "${fastdldir}/addons" ]; then
-		echo -en "updating addons file structure..."
-		cp -Rf "${fastdldir}"/addons/*/* "${fastdldir}"
-		exitcode=$?
-		if [ "${exitcode}" != 0 ]; then
-			fn_print_fail_eol_nl
-			fn_script_log_fatal "Updating addons file structure"
-			core_exit.sh
-		else
-			fn_print_ok_eol_nl
-			fn_script_log_pass "Updating addons file structure"
-		fi
-		# Clear addons directory in fastdl.
-		echo -en "clearing addons dir from fastdl dir..."
-		fn_sleep_time
-		rm -rf "${fastdldir:?}/addons"
-		exitcode=$?
-		if [ "${exitcode}" != 0 ]; then
-			fn_print_fail_eol_nl
-			fn_script_log_fatal "Clearing addons dir from fastdl dir"
-			core_exit.sh
-		else
-			fn_print_ok_eol_nl
-			fn_script_log_pass "Clearing addons dir from fastdl dir"
-		fi
-	fi
-	# Correct content that may be into a lua directory by mistake like some darkrpmodification addons.
-	if [ -d "${fastdldir}/lua" ]; then
-		echo -en "correcting DarkRP files..."
-		fn_sleep_time
-		cp -Rf "${fastdldir}/lua/"* "${fastdldir}"
-		exitcode=$?
-		if [ "${exitcode}" != 0 ]; then
-			fn_print_fail_eol_nl
-			fn_script_log_fatal "Correcting DarkRP files"
-			core_exit.sh
-		else
-			fn_print_ok_eol_nl
-			fn_script_log_pass "Correcting DarkRP files"
-		fi
-	fi
-	if [ -f "${tmpdir}/fastdl_files_to_compress.txt" ]; then
-		totalfiles=$(wc -l < "${tmpdir}/fastdl_files_to_compress.txt")
-		# Calculates total file size.
-		while read -r dufile; do
-			filesize=$(du -b "${dufile}" | awk '{ print $1 }')
-			filesizetotal=$((filesizetotal + filesize))
-		done < "${tmpdir}/fastdl_files_to_compress.txt"
-	fi
-}
-
-fn_fastdl_source() {
-	for directory in "${fastdl_directories_array[@]}"; do
-		if [ -d "${systemdir}/${directory}" ]; then
-			if [ "${directory}" == "maps" ]; then
-				local allowed_extentions_array=("*.bsp" "*.ain" "*.nav" "*.jpg" "*.txt")
-			elif [ "${directory}" == "materials" ]; then
-				local allowed_extentions_array=("*.vtf" "*.vmt" "*.vbf" "*.png" "*.svg")
-			elif [ "${directory}" == "models" ]; then
-				local allowed_extentions_array=("*.vtx" "*.vvd" "*.mdl" "*.phy" "*.jpg" "*.png")
-			elif [ "${directory}" == "particles" ]; then
-				local allowed_extentions_array=("*.pcf")
-			elif [ "${directory}" == "sound" ]; then
-				local allowed_extentions_array=("*.wav" "*.mp3" "*.ogg")
-			fi
-			for allowed_extention in "${allowed_extentions_array[@]}"; do
-				fileswc=0
-				tput sc
-				while read -r fastdlfile; do
-					((fileswc++))
-					tput rc
-					tput el
-					echo -e "copying ${directory} ${allowed_extention} : ${fileswc}..."
-					fn_sleep_time
-					# get relative path of file in the dir
-					tmprelfilepath="${fastdlfile#"${systemdir}/"}"
-					copytodir="${tmprelfilepath%/*}"
-					# create relative path for fastdl
-					if [ ! -d "${fastdldir}/${copytodir}" ]; then
-						mkdir -p "${fastdldir}/${copytodir}"
-					fi
-					cp "${fastdlfile}" "${fastdldir}/${copytodir}"
-					exitcode=$?
-					if [ "${exitcode}" != 0 ]; then
-						fn_print_fail_eol_nl
-						fn_script_log_fatal "Copying ${fastdlfile} > ${fastdldir}/${copytodir}"
-						core_exit.sh
-					else
-						fn_script_log_pass "Copying ${fastdlfile} > ${fastdldir}/${copytodir}"
-					fi
-				done < <(find "${systemdir}/${directory}" -type f -iname "${allowed_extention}")
-				if [ ${fileswc} != 0 ]; then
-					fn_print_ok_eol_nl
-				fi
-			done
-		fi
-	done
-}
-
-# Builds the fastdl directory content.
-fn_fastdl_build() {
-	# Copy all needed files for FastDL.
-	echo -e "copying files to ${fastdldir}"
-	fn_script_log_info "Copying files to ${fastdldir}"
-	if [ "${shortname}" == "gmod" ]; then
-		fn_fastdl_gmod
-		fn_fastdl_gmod_dl_enforcer
-	else
-		fn_fastdl_source
-	fi
-}
-
-# Generate lua file that will force download any file into the FastDL directory.
-fn_fastdl_gmod_dl_enforcer() {
-	# Clear old lua file.
-	if [ -f "${luafastdlfullpath}" ]; then
-		echo -en "removing existing download enforcer: ${luafastdlfile}..."
-		rm -f "${luafastdlfullpath:?}"
-		exitcode=$?
-		if [ "${exitcode}" != 0 ]; then
-			fn_print_fail_eol_nl
-			fn_script_log_fatal "Removing existing download enforcer ${luafastdlfullpath}"
-			core_exit.sh
-		else
-			fn_print_ok_eol_nl
-			fn_script_log_pass "Removing existing download enforcer ${luafastdlfullpath}"
-		fi
-	fi
-	# Generate new one if user said yes.
-	if [ "${luaresource}" == "on" ]; then
-		echo -en "creating new download enforcer: ${luafastdlfile}..."
-		touch "${luafastdlfullpath}"
-		# Read all filenames and put them into a lua file at the right path.
-		while read -r line; do
-			echo -e "resource.AddFile( \"${line}\" )" >> "${luafastdlfullpath}"
-		done < <(find "${fastdldir:?}" \( -type f ! -name "*.bz2" \) -printf '%P\n')
-		exitcode=$?
-		if [ "${exitcode}" != 0 ]; then
-			fn_print_fail_eol_nl
-			fn_script_log_fatal "Creating new download enforcer ${luafastdlfullpath}"
-			core_exit.sh
-		else
-			fn_print_ok_eol_nl
-			fn_script_log_pass "Creating new download enforcer ${luafastdlfullpath}"
-		fi
-	fi
-}
-
-# Compresses FastDL files using bzip2.
-fn_fastdl_bzip2() {
-	while read -r filetocompress; do
-		echo -en "\r\033[Kcompressing ${filetocompress}..."
-		bzip2 -f "${filetocompress}"
-		exitcode=$?
-		if [ "${exitcode}" != 0 ]; then
-			fn_print_fail_eol_nl
-			fn_script_log_fatal "Compressing ${filetocompress}"
-			core_exit.sh
-		else
-			fn_script_log_pass "Compressing ${filetocompress}"
-		fi
-	done < <(find "${fastdldir:?}" \( -type f ! -name "*.bz2" \))
-	fn_print_ok_eol_nl
-}
-
-# Run functions.
-fn_fastdl_preview
-fn_clear_old_fastdl
-fn_fastdl_dirs
-fn_fastdl_build
-fn_fastdl_bzip2
-# Finished message.
-echo -e "FastDL files are located in:"
-echo -e "${fastdldir}"
-echo -e "FastDL completed"
-fn_script_log_info "FastDL completed"
-
-core_exit.sh
diff --git a/lgsm/functions/command_install.sh b/lgsm/functions/command_install.sh
deleted file mode 100644
index 19dc59c7e..000000000
--- a/lgsm/functions/command_install.sh
+++ /dev/null
@@ -1,52 +0,0 @@
-#!/bin/bash
-# LinuxGSM command_install.sh module
-# Author: Daniel Gibbs
-# Contributors: http://linuxgsm.com/contrib
-# Website: https://linuxgsm.com
-# Description: Overall function for the installer.
-
-commandname="INSTALL"
-commandaction="Installing"
-functionselfname="$(basename "$(readlink -f "${BASH_SOURCE[0]}")")"
-fn_firstcommand_set
-
-check.sh
-if [ "$(whoami)" == "root" ] && [ ! -f /.dockerenv ]; then
-	check_deps.sh
-else
-	install_header.sh
-	install_server_dir.sh
-	install_logs.sh
-	check_deps.sh
-	installflag=1
-	# Download and install.
-	if [ "${shortname}" == "ut2k4" ]; then
-		install_server_files.sh
-		install_ut2k4_key.sh
-	elif [ -z "${appid}" ]; then
-		install_server_files.sh
-	elif [ "${appid}" ]; then
-		install_steamcmd.sh
-		install_server_files.sh
-	fi
-
-	# Configuration.
-	install_config.sh
-	if [ -v gslt ]; then
-		install_gslt.sh
-	elif [ "${shortname}" == "dst" ]; then
-		install_dst_token.sh
-	elif [ "${shortname}" == "squad" ]; then
-		install_squad_license.sh
-	elif [ "${shortname}" == "ts3" ]; then
-		install_ts3db.sh
-	elif [ "${shortname}" == "mta" ]; then
-		command_install_resources_mta.sh
-		fn_firstcommand_reset
-	fi
-
-	fix.sh
-	install_stats.sh
-	install_complete.sh
-fi
-core_exit.sh
diff --git a/lgsm/functions/command_install_resources_mta.sh b/lgsm/functions/command_install_resources_mta.sh
deleted file mode 100644
index daf039551..000000000
--- a/lgsm/functions/command_install_resources_mta.sh
+++ /dev/null
@@ -1,32 +0,0 @@
-#!/bin/bash
-# LinuxGSM command_install_resources_mta.sh module
-# Author: Daniel Gibbs
-# Contributors: http://linuxgsm.com/contrib
-# Website: https://linuxgsm.com
-# Description: Installs the default resources for Multi Theft Auto.
-
-commandname="DEFAULT-RESOURCES"
-commandaction="Default Resources"
-functionselfname="$(basename "$(readlink -f "${BASH_SOURCE[0]}")")"
-fn_firstcommand_set
-
-fn_install_resources() {
-	echo -e ""
-	echo -e "${lightyellow}Installing Default Resources${default}"
-	echo -e "================================="
-	fn_fetch_file "http://mirror.mtasa.com/mtasa/resources/mtasa-resources-latest.zip" "" "" "" "${tmpdir}" "mtasa-resources-latest.zip" "nochmodx" "norun" "noforce" "nohash"
-	fn_dl_extract "${tmpdir}" "mtasa-resources-latest.zip" "${resourcesdir}"
-	echo -e "Default Resources Installed."
-}
-
-fn_print_header
-
-if [ -z "${autoinstall}" ]; then
-	fn_print_warning_nl "Installing the default resources with existing resources may cause issues."
-	if fn_prompt_yn "Do you want to install MTA default resources?" Y; then
-		fn_install_resources
-	fi
-else
-	fn_print_warning_nl "Default resources are not installed when using ./${selfname} auto-install."
-	fn_print_information_nl "To install default resources use ./${selfname} install"
-fi
diff --git a/lgsm/functions/command_mods_install.sh b/lgsm/functions/command_mods_install.sh
deleted file mode 100644
index 0edbe5bc0..000000000
--- a/lgsm/functions/command_mods_install.sh
+++ /dev/null
@@ -1,135 +0,0 @@
-#!/bin/bash
-# LinuxGSM command_mods_install.sh module
-# Author: Daniel Gibbs
-# Contributors: http://linuxgsm.com/contrib
-# Website: https://linuxgsm.com
-# Description: List and installs available mods along with mods_list.sh and mods_core.sh.
-
-commandname="MODS-INSTALL"
-commandaction="Installing mods"
-functionselfname="$(basename "$(readlink -f "${BASH_SOURCE[0]}")")"
-fn_firstcommand_set
-
-check.sh
-mods_core.sh
-
-fn_print_header
-
-# Displays a list of installed mods.
-fn_mods_installed_list
-if [ "${installedmodscount}" -gt "0" ]; then
-	echo -e "Installed addons/mods"
-	echo -e "================================="
-	# Go through all available commands, get details and display them to the user.
-	for ((llindex = 0; llindex < ${#installedmodslist[@]}; llindex++)); do
-		# Current mod is the "llindex" value of the array we're going through.
-		currentmod="${installedmodslist[llindex]}"
-		fn_mod_get_info
-		# Display mod info to the user.
-		echo -e " * ${green}${modcommand}${default}${default}"
-	done
-	echo -e ""
-fi
-
-echo -e "Available addons/mods"
-echo -e "================================="
-# Display available mods from mods_list.sh.
-# Set and reset vars
-compatiblemodslistindex=0
-# As long as we're within index values.
-while [ "${compatiblemodslistindex}" -lt "${#compatiblemodslist[@]}" ]; do
-	# Set values for convenience.
-	displayedmodname="${compatiblemodslist[compatiblemodslistindex]}"
-	displayedmodcommand="${compatiblemodslist[compatiblemodslistindex + 1]}"
-	displayedmodsite="${compatiblemodslist[compatiblemodslistindex + 2]}"
-	displayedmoddescription="${compatiblemodslist[compatiblemodslistindex + 3]}"
-	# Output mods to the user.
-	echo -e "${displayedmodname} - ${displayedmoddescription} - ${displayedmodsite}"
-	echo -e " * ${cyan}${displayedmodcommand}${default}"
-	# Increment index from the amount of values we just displayed.
-	let "compatiblemodslistindex+=4"
-	((totalmodsavailable++))
-done
-
-# If no mods are available for a specific game.
-if [ -z "${compatiblemodslist}" ]; then
-	fn_print_fail_nl "No mods are currently available for ${gamename}."
-	fn_script_log_info "No mods are currently available for ${gamename}."
-	core_exit.sh
-fi
-fn_script_log_info "${totalmodsavailable} addons/mods are available for install"
-
-## User selects a mod.
-echo -e ""
-while [[ ! " ${availablemodscommands[@]} " =~ " ${usermodselect} " ]]; do
-	echo -en "Enter an ${cyan}addon/mod${default} to ${green}install${default} (or exit to abort): "
-	read -r usermodselect
-	# Exit if user says exit or abort.
-	if [ "${usermodselect}" == "exit" ] || [ "${usermodselect}" == "abort" ]; then
-		core_exit.sh
-	# Supplementary output upon invalid user input.
-	elif [[ ! " ${availablemodscommands[@]} " =~ " ${usermodselect} " ]]; then
-		fn_print_error2_nl "${usermodselect} is not a valid addon/mod."
-	fi
-done
-# Get mod info.
-currentmod="${usermodselect}"
-fn_mod_get_info
-
-echo -e ""
-echo -e "Installing ${modprettyname}"
-echo -e "================================="
-fn_script_log_info "${modprettyname} selected for install"
-
-# Check if the mod is already installed and warn the user.
-if [ -f "${modsinstalledlistfullpath}" ]; then
-	if [ "$(sed -n "/^${modcommand}$/p" "${modsinstalledlistfullpath}")" ]; then
-		fn_print_warning_nl "${modprettyname} is already installed"
-		fn_script_log_warn "${modprettyname} is already installed"
-		echo -e " * Any configs may be overwritten."
-		if ! fn_prompt_yn "Continue?" Y; then
-			core_exit.sh
-		fi
-		fn_script_log_info "User selected to continue"
-	fi
-fi
-
-## Installation.
-# If amxmodx check if metamod exists first
-if [ "${modcommand}" == "amxmodx" ]; then
-	fn_mod_exist "metamod"
-fi
-
-if [ "${modcommand}" == "amxmodxcs" ] \
-	|| [ "${modcommand}" == "amxmodxdod" ] \
-	|| [ "${modcommand}" == "amxmodxtfc" ] \
-	|| [ "${modcommand}" == "amxmodxns" ] \
-	|| [ "${modcommand}" == "amxmodxts" ]; then
-	fn_mod_exist "amxmodx"
-fi
-
-fn_create_mods_dir
-fn_mods_clear_tmp_dir
-fn_mods_create_tmp_dir
-fn_mod_install_files
-fn_mod_lowercase
-fn_mod_create_filelist
-fn_mod_copy_destination
-fn_mod_add_list
-fn_mod_tidy_files_list
-fn_mods_clear_tmp_dir
-
-# Create/modify existing liblist.gam file for Metamod
-if [ "${modcommand}" == "metamod" ]; then
-	fn_mod_install_liblist_gam_file
-fi
-
-# Create/modify plugins.ini file for Metamod
-if [ "${modcommand}" == "amxmodx" ]; then
-	fn_mod_install_amxmodx_file
-fi
-
-echo -e "${modprettyname} installed"
-fn_script_log_pass "${modprettyname} installed."
-
-core_exit.sh
diff --git a/lgsm/functions/command_mods_remove.sh b/lgsm/functions/command_mods_remove.sh
deleted file mode 100644
index 7127dcb3c..000000000
--- a/lgsm/functions/command_mods_remove.sh
+++ /dev/null
@@ -1,153 +0,0 @@
-#!/bin/bash
-# LinuxGSM command_mods_uninstall.sh module
-# Author: Daniel Gibbs
-# Contributors: http://linuxgsm.com/contrib
-# Website: https://linuxgsm.com
-# Description: Uninstall mods along with mods_list.sh and mods_core.sh.
-
-commandname="MODS-REMOVE"
-commandaction="Removing mods"
-functionselfname="$(basename "$(readlink -f "${BASH_SOURCE[0]}")")"
-fn_firstcommand_set
-
-check.sh
-mods_core.sh
-fn_mods_check_installed
-
-fn_print_header
-echo -e "Remove addons/mods"
-echo -e "================================="
-
-# Displays list of installed mods.
-# Generates list to display to user.
-fn_mods_installed_list
-for ((mlindex = 0; mlindex < ${#installedmodslist[@]}; mlindex++)); do
-	# Current mod is the "mlindex" value of the array we are going through.
-	currentmod="${installedmodslist[mlindex]}"
-	# Get mod info.
-	fn_mod_get_info
-	# Display mod info to the user.
-	echo -e "${red}${modcommand}${default} - ${modprettyname} - ${moddescription}"
-done
-
-echo -e ""
-# Keep prompting as long as the user input doesn't correspond to an available mod.
-while [[ ! " ${installedmodslist[@]} " =~ " ${usermodselect} " ]]; do
-	echo -en "Enter an ${cyan}addon/mod${default} to ${red}remove${default} (or exit to abort): "
-	read -r usermodselect
-	# Exit if user says exit or abort.
-	if [ "${usermodselect}" == "exit" ] || [ "${usermodselect}" == "abort" ]; then
-		core_exit.sh
-	# Supplementary output upon invalid user input.
-	elif [[ ! " ${availablemodscommands[@]} " =~ " ${usermodselect} " ]]; then
-		fn_print_error2_nl "${usermodselect} is not a valid addon/mod."
-	fi
-done
-
-fn_print_warning_nl "You are about to remove ${cyan}${usermodselect}${default}."
-echo -e " * Any custom files/configuration will be removed."
-if ! fn_prompt_yn "Continue?" Y; then
-	core_exit.sh
-fi
-
-currentmod="${usermodselect}"
-fn_mod_get_info
-fn_check_mod_files_list
-
-# Uninstall the mod.
-fn_script_log_info "Removing ${modsfilelistsize} files from ${modprettyname}"
-echo -e "removing ${modprettyname}"
-echo -e "* ${modsfilelistsize} files to be removed"
-echo -e "* location: ${modinstalldir}"
-fn_sleep_time
-# Go through every file and remove it.
-modfileline="1"
-tput sc
-while [ "${modfileline}" -le "${modsfilelistsize}" ]; do
-	# Current line defines current file to remove.
-	currentfileremove=$(sed "${modfileline}q;d" "${modsdir}/${modcommand}-files.txt")
-	# If file or directory exists, then remove it.
-
-	if [ -f "${modinstalldir}/${currentfileremove}" ] || [ -d "${modinstalldir}/${currentfileremove}" ]; then
-		rm -rf "${modinstalldir:?}/${currentfileremove:?}"
-		((exitcode = $?))
-		if [ "${exitcode}" != 0 ]; then
-			fn_script_log_fatal "Removing ${modinstalldir}/${currentfileremove}"
-			break
-		else
-			fn_script_log_pass "Removing ${modinstalldir}/${currentfileremove}"
-		fi
-	fi
-	tput rc
-	tput el
-	echo -e "removing ${modprettyname} ${modfileline} / ${modsfilelistsize} : ${currentfileremove}..."
-	((modfileline++))
-done
-
-# Added logic not to fail since removing game specific mods (amxmodxcs) removes files that will
-# not be found when removing the base (amxmodx) mod
-if [ "${modcommand}" != "amxmodx" ]; then
-	if [ "${exitcode}" != 0 ]; then
-		fn_print_fail_eol_nl
-		core_exit.sh
-	else
-		fn_print_ok_eol_nl
-	fi
-else
-	fn_print_ok_eol_nl
-fi
-
-# Remove file list.
-echo -en "removing ${modcommand}-files.txt..."
-fn_sleep_time
-rm -rf "${modsdir:?}/${modcommand}-files.txt"
-exitcode=$?
-if [ "${exitcode}" != 0 ]; then
-	fn_script_log_fatal "Removing ${modsdir}/${modcommand}-files.txt"
-	fn_print_fail_eol_nl
-	core_exit.sh
-else
-	fn_script_log_pass "Removing ${modsdir}/${modcommand}-files.txt"
-	fn_print_ok_eol_nl
-fi
-
-# Remove mods from installed mods list.
-echo -en "removing ${modcommand} from ${modsinstalledlist}..."
-fn_sleep_time
-
-sed -i "/^${modcommand}$/d" "${modsinstalledlistfullpath}"
-exitcode=$?
-if [ "${exitcode}" != 0 ]; then
-	fn_script_log_fatal "Removing ${modcommand} from ${modsinstalledlist}"
-	fn_print_fail_eol_nl
-	core_exit.sh
-else
-	fn_script_log_pass "Removing ${modcommand} from ${modsinstalledlist}"
-	fn_print_ok_eol_nl
-fi
-
-# Oxide fix
-# Oxide replaces server files, so a validate is required after uninstall.
-if [ "${engine}" == "unity3d" ] && [[ "${modprettyname}" == *"Oxide"* ]]; then
-	fn_print_information_nl "Validating to restore original ${gamename} files replaced by Oxide"
-	fn_script_log "Validating to restore original ${gamename} files replaced by Oxide"
-	exitbypass="1"
-	command_validate.sh
-	fn_firstcommand_reset
-	unset exitbypass
-fi
-
-# Remove/modify existing liblist.gam file for Metamod
-if [ "${modcommand}" == "metamod" ]; then
-	fn_mod_remove_liblist_gam_file
-fi
-
-# Remove/modify plugins.ini file for AMX Mod X
-if [ "${modcommand}" == "amxmodx" ]; then
-	fn_mod_remove_amxmodx_file
-fi
-
-echo -e "${modprettyname} removed"
-fn_script_log "${modprettyname} removed"
-
-core_exit.sh
diff --git a/lgsm/functions/command_mods_update.sh b/lgsm/functions/command_mods_update.sh
deleted file mode 100644
index 80b23fea9..000000000
--- a/lgsm/functions/command_mods_update.sh
+++ /dev/null
@@ -1,109 +0,0 @@
-#!/bin/bash
-# LinuxGSM command_mods_update.sh module
-# Author: Daniel Gibbs
-# Contributors: http://linuxgsm.com/contrib
-# Website: https://linuxgsm.com
-# Description: Updates installed mods along with mods_list.sh and mods_core.sh.
-
-commandname="MODS-UPDATE"
-commandaction="Updating mods"
-functionselfname="$(basename "$(readlink -f "${BASH_SOURCE[0]}")")"
-fn_firstcommand_set
-
-check.sh
-mods_core.sh
-
-# Prevents specific files being overwritten upon update (set by ${modkeepfiles}).
-# For that matter, remove cfg files after extraction before copying them to destination.
-fn_remove_cfg_files() {
-	if [ "${modkeepfiles}" != "OVERWRITE" ] && [ "${modkeepfiles}" != "NOUPDATE" ]; then
-		echo -e "the following files/directories will be preserved:"
-		fn_sleep_time
-		# Count how many files there are to remove.
-		filestopreserve=$(echo -e "${modkeepfiles}" | awk -F ';' '{ print NF }')
-		# Test all subvalues of "modkeepfiles" using the ";" separator.
-		for ((preservefilesindex = 1; preservefilesindex < filestopreserve; preservefilesindex++)); do
-			# Put the current file we are looking for into a variable.
-			filetopreserve=$(echo -e "${modkeepfiles}" | awk -F ';' -v x=${preservefilesindex} '{ print $x }')
-			echo -e "	* serverfiles/${filetopreserve}"
-			# If it matches an existing file that have been extracted delete the file.
-			if [ -f "${extractdest}/${filetopreserve}" ] || [ -d "${extractdest}/${filetopreserve}" ]; then
-				rm -r "${extractdest:?}/${filetopreserve}"
-				# Write the file path in a tmp file, to rebuild a full file list as it is rebuilt upon update.
-				if [ ! -f "${modsdir}/.removedfiles.tmp" ]; then
-					touch "${modsdir}/.removedfiles.tmp"
-				fi
-				echo -e "${filetopreserve}" >> "${modsdir}/.removedfiles.tmp"
-			fi
-		done
-	fi
-}
-
-fn_print_dots "Update addons/mods"
-fn_mods_check_installed
-fn_print_info_nl "Update addons/mods: ${installedmodscount} addons/mods will be updated"
-fn_script_log_info "${installedmodscount} mods or addons will be updated"
-fn_mods_installed_list
-# Go through all available commands, get details and display them to the user.
-for ((ulindex = 0; ulindex < ${#installedmodslist[@]}; ulindex++)); do
-	# Current mod is the "ulindex" value of the array we're going through.
-	currentmod="${installedmodslist[ulindex]}"
-	fn_mod_get_info
-	# Display installed mods and the update policy.
-	if [ -z "${modkeepfiles}" ]; then
-		# If modkeepfiles is not set for some reason, that's a problem.
-		fn_script_log_error "Could not find update policy for ${modprettyname}"
-		fn_print_error_nl "Could not find update policy for ${modprettyname}"
-		exitcode="1"
-		core_exit.sh
-	# If the mod won't get updated.
-	elif [ "${modkeepfiles}" == "NOUPDATE" ]; then
-		echo -e "	* ${red}{modprettyname}${default} (won't be updated)"
-	# If the mode is just overwritten.
-	elif [ "${modkeepfiles}" == "OVERWRITE" ]; then
-		echo -e "	* ${modprettyname} (overwrite)"
-	else
-		echo -e "	* ${yellow}${modprettyname}${default} (retain common custom files)"
-	fi
-done
-
-## Update
-# List all installed mods and apply update.
-# Reset line value.
-installedmodsline="1"
-while [ "${installedmodsline}" -le "${installedmodscount}" ]; do
-	currentmod=$(sed "${installedmodsline}q;d" "${modsinstalledlistfullpath}")
-	if [ "${currentmod}" ]; then
-		fn_mod_get_info
-		# Don not update mod if the policy is set to "NOUPDATE".
-		if [ "${modkeepfiles}" == "NOUPDATE" ]; then
-			fn_print_info "${modprettyname} will not be updated to preserve custom files"
-			fn_script_log_info "${modprettyname} will not be updated to preserve custom files"
-		else
-			echo -e ""
-			echo -e "==> Updating ${modprettyname}"
-			fn_create_mods_dir
-			fn_mods_clear_tmp_dir
-			fn_mods_create_tmp_dir
-			fn_mod_install_files
-			fn_mod_lowercase
-			fn_remove_cfg_files
-			fn_mod_create_filelist
-			fn_mod_copy_destination
-			fn_mod_add_list
-			fn_mod_tidy_files_list
-			fn_mods_clear_tmp_dir
-		fi
-		((installedmodsline++))
-	else
-		fn_print_fail "No mod was selected"
-		fn_script_log_fatal "No mod was selected"
-		exitcode="1"
-		core_exit.sh
-	fi
-done
-echo -e ""
-fn_print_ok_nl "Mods update complete"
-fn_script_log_info "Mods update complete"
-
-core_exit.sh
diff --git a/lgsm/functions/command_monitor.sh b/lgsm/functions/command_monitor.sh
deleted file mode 100644
index 20c830e0b..000000000
--- a/lgsm/functions/command_monitor.sh
+++ /dev/null
@@ -1,245 +0,0 @@
-#!/bin/bash
-# LinuxGSM command_monitor.sh module
-# Author: Daniel Gibbs
-# Contributors: http://linuxgsm.com/contrib
-# Website: https://linuxgsm.com
-# Description: Monitors server by checking for running processes
-# then passes to gamedig and gsquery.
-
-commandname="MONITOR"
-commandaction="Monitoring"
-functionselfname="$(basename "$(readlink -f "${BASH_SOURCE[0]}")")"
-fn_firstcommand_set
-
-fn_monitor_check_lockfile() {
-	# Monitor does not run it lockfile is not found.
-	if [ ! -f "${lockdir}/${selfname}.lock" ]; then
-		fn_print_dots "Checking lockfile: "
-		fn_print_checking_eol
-		fn_script_log_info "Checking lockfile: CHECKING"
-		fn_print_error "Checking lockfile: No lockfile found: "
-		fn_print_error_eol_nl
-		fn_script_log_error "Checking lockfile: No lockfile found: ERROR"
-		echo -e "* Start ${selfname} to run monitor."
-		core_exit.sh
-	fi
-
-	# Fix if lockfile is not unix time or contains letters
-	if [ -f "${lockdir}/${selfname}.lock" ] && [[ "$(head -n 1 "${lockdir}/${selfname}.lock")" =~ [A-Za-z] ]]; then
-		date '+%s' > "${lockdir}/${selfname}.lock"
-		echo "${version}" >> "${lockdir}/${selfname}.lock"
-		echo "${port}" >> "${lockdir}/${selfname}.lock"
-	fi
-}
-
-fn_monitor_check_update() {
-	# Monitor will check if update is already running.
-	if [ "$(pgrep "${selfname} update" | wc -l)" != "0" ]; then
-		fn_print_dots "Checking active updates: "
-		fn_print_checking_eol
-		fn_script_log_info "Checking active updates: CHECKING"
-		fn_print_error_nl "Checking active updates: SteamCMD is currently checking for updates: "
-		fn_print_error_eol
-		fn_script_log_error "Checking active updates: SteamCMD is currently checking for updates: ERROR"
-		core_exit.sh
-	fi
-}
-
-fn_monitor_check_session() {
-	fn_print_dots "Checking session: "
-	fn_print_checking_eol
-	fn_script_log_info "Checking session: CHECKING"
-	# uses status var from check_status.sh
-	if [ "${status}" != "0" ]; then
-		fn_print_ok "Checking session: "
-		fn_print_ok_eol_nl
-		fn_script_log_pass "Checking session: OK"
-	else
-		fn_print_error "Checking session: "
-		fn_print_fail_eol_nl
-		fn_script_log_fatal "Checking session: FAIL"
-		alert="restart"
-		alert.sh
-		fn_script_log_info "Checking session: Monitor is restarting ${selfname}"
-		command_restart.sh
-		core_exit.sh
-	fi
-}
-
-fn_monitor_check_queryport() {
-	# Monitor will check queryport is set before continuing.
-	if [ -z "${queryport}" ] || [ "${queryport}" == "0" ]; then
-		fn_print_dots "Checking port: "
-		fn_print_checking_eol
-		fn_script_log_info "Checking port: CHECKING"
-		if [ -n "${rconenabled}" ] && [ "${rconenabled}" != "true" ] && [ "${shortname}" == "av" ]; then
-			fn_print_warn "Checking port: Unable to query, rcon is not enabled"
-			fn_script_log_warn "Checking port: Unable to query, rcon is not enabled"
-		else
-			fn_print_error "Checking port: Unable to query, queryport is not set"
-			fn_script_log_error "Checking port: Unable to query, queryport is not set"
-		fi
-		core_exit.sh
-	fi
-}
-
-fn_query_gsquery() {
-	if [ ! -f "${functionsdir}/query_gsquery.py" ]; then
-		fn_fetch_file_github "lgsm/functions" "query_gsquery.py" "${functionsdir}" "chmodx" "norun" "noforce" "nohash"
-	fi
-	"${functionsdir}"/query_gsquery.py -a "${queryip}" -p "${queryport}" -e "${querytype}" > /dev/null 2>&1
-	querystatus="$?"
-}
-
-fn_query_tcp() {
-	bash -c 'exec 3<> /dev/tcp/'${queryip}'/'${queryport}'' > /dev/null 2>&1
-	querystatus="$?"
-}
-
-fn_monitor_query() {
-	# Will loop and query up to 5 times every 15 seconds.
-	# Query will wait up to 60 seconds to confirm server is down as server can become non-responsive during map changes.
-	totalseconds=0
-	for queryattempt in {1..5}; do
-		for queryip in "${queryips[@]}"; do
-			fn_print_dots "Querying port: ${querymethod}: ${queryip}:${queryport} : ${totalseconds}/${queryattempt}: "
-			fn_print_querying_eol
-			fn_script_log_info "Querying port: ${querymethod}: ${queryip}:${queryport} : ${queryattempt} : QUERYING"
-			# querydelay
-			if [ "$(head -n 1 "${lockdir}/${selfname}.lock")" -gt "$(date "+%s" -d "${querydelay} mins ago")" ]; then
-				fn_print_ok "Querying port: ${querymethod}: ${ip}:${queryport} : ${totalseconds}/${queryattempt}: "
-				fn_print_delay_eol_nl
-				fn_script_log_info "Querying port: ${querymethod}: ${ip}:${queryport} : ${queryattempt} : DELAY"
-				fn_script_log_info "Query bypassed: ${gameservername} started less than ${querydelay} minutes ago"
-				fn_script_log_info "Server started: $(date -d @$(head -n 1 "${lockdir}/${selfname}.lock"))"
-				fn_script_log_info "Current time: $(date)"
-				monitorpass=1
-				core_exit.sh
-			# will use query method selected in fn_monitor_loop
-			# gamedig
-			elif [ "${querymethod}" == "gamedig" ]; then
-				query_gamedig.sh
-			# gsquery
-			elif [ "${querymethod}" == "gsquery" ]; then
-				fn_query_gsquery
-			#tcp query
-			elif [ "${querymethod}" == "tcp" ]; then
-				fn_query_tcp
-			fi
-
-			if [ "${querystatus}" == "0" ]; then
-				# Server query OK.
-				fn_print_ok "Querying port: ${querymethod}: ${queryip}:${queryport} : ${totalseconds}/${queryattempt}: "
-				fn_print_ok_eol_nl
-				fn_script_log_pass "Querying port: ${querymethod}: ${queryip}:${queryport} : ${queryattempt} : OK"
-				monitorpass=1
-				if [ "${querystatus}" == "0" ]; then
-					# Add query data to log.
-					if [ "${gdname}" ]; then
-						fn_script_log_info "Server name: ${gdname}"
-					fi
-					if [ "${gdplayers}" ]; then
-						fn_script_log_info "Players: ${gdplayers}/${gdmaxplayers}"
-					fi
-					if [ "${gdbots}" ]; then
-						fn_script_log_info "Bots: ${gdbots}"
-					fi
-					if [ "${gdmap}" ]; then
-						fn_script_log_info "Map: ${gdmap}"
-					fi
-					if [ "${gdgamemode}" ]; then
-						fn_script_log_info "Game Mode: ${gdgamemode}"
-					fi
-
-					# send LinuxGSM stats if monitor is OK.
-					if [ "${stats}" == "on" ] || [ "${stats}" == "y" ]; then
-						info_stats.sh
-					fi
-				fi
-				core_exit.sh
-			else
-				# Server query FAIL.
-				fn_print_fail "Querying port: ${querymethod}: ${queryip}:${queryport} : ${totalseconds}/${queryattempt}: "
-				fn_print_fail_eol
-				fn_script_log_warn "Querying port: ${querymethod}: ${queryip}:${queryport} : ${queryattempt} : FAIL"
-				# Monitor will try gamedig (if supported) for first 30s then gsquery before restarting.
-				# gsquery will fail if longer than 60s
-				if [ "${totalseconds}" -ge "59" ]; then
-					# Monitor will FAIL if over 60s and trigger gane server reboot.
-					fn_print_fail "Querying port: ${querymethod}: ${queryip}:${queryport} : ${totalseconds}/${queryattempt}: "
-					fn_print_fail_eol_nl
-					fn_script_log_warn "Querying port: ${querymethod}: ${queryip}:${queryport} : ${queryattempt} : FAIL"
-					# Send alert if enabled.
-					alert="restartquery"
-					alert.sh
-					command_restart.sh
-					fn_firstcommand_reset
-					core_exit.sh
-				fi
-			fi
-		done
-		# Second counter will wait for 15s before breaking loop.
-		for seconds in {1..15}; do
-			fn_print_fail "Querying port: ${querymethod}: ${ip}:${queryport} : ${totalseconds}/${queryattempt} : ${cyan}WAIT${default}"
-			sleep 0.5
-			totalseconds=$((totalseconds + 1))
-			if [ "${seconds}" == "15" ]; then
-				break
-			fi
-		done
-	done
-}
-
-fn_monitor_loop() {
-	# loop though query methods selected by querymode.
-	totalseconds=0
-	if [ "${querymode}" == "2" ]; then
-		local query_methods_array=(gamedig gsquery)
-	elif [ "${querymode}" == "3" ]; then
-		local query_methods_array=(gamedig)
-	elif [ "${querymode}" == "4" ]; then
-		local query_methods_array=(gsquery)
-	elif [ "${querymode}" == "5" ]; then
-		local query_methods_array=(tcp)
-	fi
-	for querymethod in "${query_methods_array[@]}"; do
-		# Will check if gamedig is installed and bypass if not.
-		if [ "${querymethod}" == "gamedig" ]; then
-			if [ "$(command -v gamedig 2> /dev/null)" ] && [ "$(command -v jq 2> /dev/null)" ]; then
-				if [ -z "${monitorpass}" ]; then
-					fn_monitor_query
-				fi
-			else
-				fn_script_log_info "gamedig is not installed"
-				fn_script_log_info "https://docs.linuxgsm.com/requirements/gamedig"
-			fi
-		else
-			# will not query if query already passed.
-			if [ -z "${monitorpass}" ]; then
-				fn_monitor_query
-			fi
-		fi
-	done
-}
-
-monitorflag=1
-check.sh
-core_logs.sh
-info_game.sh
-
-# query pre-checks
-fn_monitor_check_lockfile
-fn_monitor_check_update
-fn_monitor_check_session
-# Monitor will not continue if session only check.
-if [ "${querymode}" != "1" ]; then
-	fn_monitor_check_queryport
-
-	# Add a querydelay of 1 min if var missing.
-	if [ -z "${querydelay}" ]; then
-		querydelay="1"
-	fi
-
-	fn_monitor_loop
-fi
-core_exit.sh
diff --git a/lgsm/functions/command_postdetails.sh b/lgsm/functions/command_postdetails.sh
deleted file mode 100644
index dad44d9af..000000000
--- a/lgsm/functions/command_postdetails.sh
+++ /dev/null
@@ -1,78 +0,0 @@
-#!/bin/bash
-# LinuxGSM command_postdetails.sh module
-# Author: Daniel Gibbs
-# Contributors: http://linuxgsm.com/contrib
-# Website: https://linuxgsm.com
-# Description: Strips sensitive information out of Details output.
-
-commandname="POST-DETAILS"
-commandaction="Posting details"
-functionselfname="$(basename "$(readlink -f "${BASH_SOURCE[0]}")")"
-fn_firstcommand_set
-
-posttarget="https://termbin.com"
-
-# source all of the functions defined in the details command.
-info_messages.sh
-
-fn_bad_postdetailslog() {
-	fn_print_fail_nl "Unable to create temporary file ${postdetailslog}."
-	core_exit.sh
-}
-
-# Remove any existing postdetails.log file.
-if [ -f "${postdetailslog}" ]; then
-	rm -f "${postdetailslog:?}"
-fi
-
-# Rather than a one-pass sed parser, default to using a temporary directory.
-if [ "${exitbypass}" ]; then
-	postdetailslog="${alertlog}"
-else
-	# Run checks and gathers details to display.
-	check.sh
-	info_game.sh
-	info_distro.sh
-	info_messages.sh
-	for queryip in "${queryips[@]}"; do
-		query_gamedig.sh
-		if [ "${querystatus}" == "0" ]; then
-			break
-		fi
-	done
-	touch "${postdetailslog}" || fn_bad_postdetailslog
-	{
-		fn_info_message_distro
-		fn_info_message_server_resource
-		fn_info_message_gameserver_resource
-		fn_info_message_gameserver
-		fn_info_message_script
-		fn_info_message_backup
-		# Some game servers do not have parms.
-		if [ "${shortname}" != "jc2" ] && [ "${shortname}" != "jc3" ] && [ "${shortname}" != "dst" ] && [ "${shortname}" != "pz" ] && [ "${engine}" != "renderware" ]; then
-			fn_info_message_commandlineparms
-		fi
-		fn_info_message_ports_edit
-		fn_info_message_ports
-		fn_info_message_select_engine
-		fn_info_message_statusbottom
-	} | sed -r "s/\x1B\[([0-9]{1,2}(;[0-9]{1,2})?)?[m|K]//g" | tee -a "${postdetailslog}" > /dev/null 2>&1
-fi
-
-fn_print_dots "termbin.com"
-link=$(cat "${postdetailslog}" | nc termbin.com 9999 | tr -d '\n\0')
-fn_print_ok_nl "termbin.com for 30D"
-fn_script_log_pass "termbin.com for 30D"
-pdurl="${link}"
-
-if [ "${firstcommandname}" == "POST-DETAILS" ]; then
-	echo -e ""
-	echo -e "Please share the following url for support: "
-	echo -e "${pdurl}"
-fi
-fn_script_log_info "${pdurl}"
-alerturl="${pdurl}"
-
-if [ -z "${exitbypass}" ]; then
-	core_exit.sh
-fi
diff --git a/lgsm/functions/command_restart.sh b/lgsm/functions/command_restart.sh
deleted file mode 100644
index 3bf60c32c..000000000
--- a/lgsm/functions/command_restart.sh
+++ /dev/null
@@ -1,18 +0,0 @@
-#!/bin/bash
-# LinuxGSM command_restart.sh module
-# Author: Daniel Gibbs
-# Contributors: http://linuxgsm.com/contrib
-# Website: https://linuxgsm.com
-# Description: Restarts the server.
-
-commandname="MODS-INSTALL"
-commandaction="Restarting"
-functionselfname="$(basename "$(readlink -f "${BASH_SOURCE[0]}")")"
-fn_firstcommand_set
-
-info_game.sh
-exitbypass=1
-command_stop.sh
-command_start.sh
-fn_firstcommand_reset
-core_exit.sh
diff --git a/lgsm/functions/command_send.sh b/lgsm/functions/command_send.sh
deleted file mode 100644
index d65212571..000000000
--- a/lgsm/functions/command_send.sh
+++ /dev/null
@@ -1,41 +0,0 @@
-#!/bin/bash
-# LinuxGSM command_send.sh module
-# Author: Daniel Gibbs
-# Contributors: http://linuxgsm.com/contrib
-# Website: https://linuxgsm.com
-# Description: Send command to the server tmux console.
-
-commandname="SEND"
-commandaction="Send"
-functionselfname="$(basename "$(readlink -f "${BASH_SOURCE[0]}")")"
-fn_firstcommand_set
-
-check.sh
-if [ -z "${userinput2}" ]; then
-	fn_print_header
-	fn_print_information_nl "Send a command to the console."
-fi
-
-check_status.sh
-if [ "${status}" != "0" ]; then
-	if [ -n "${userinput2}" ]; then
-		commandtosend="${userinput2}"
-	else
-		echo ""
-		commandtosend=$(fn_prompt_message "send: ")
-	fi
-	echo ""
-	fn_print_dots "Sending command to console: \"${commandtosend}\""
-	tmux -L "${sessionname}" send-keys -t "${servicename}" "${commandtosend}" ENTER
-	fn_print_ok_nl "Sending command to console: \"${commandtosend}\""
-	fn_script_log_pass "Command \"${commandtosend}\" sent to console"
-else
-	fn_print_error_nl "Server not running"
-	fn_script_log_error "Failed to access: Server not running"
-	if fn_prompt_yn "Do you want to start the server?" Y; then
-		exitbypass=1
-		command_start.sh
-	fi
-fi
-
-core_exit.sh
diff --git a/lgsm/functions/command_skeleton.sh b/lgsm/functions/command_skeleton.sh
deleted file mode 100644
index 53c4ddec5..000000000
--- a/lgsm/functions/command_skeleton.sh
+++ /dev/null
@@ -1,23 +0,0 @@
-#!/bin/bash
-# LinuxGSM command_skeleton.sh module
-# Author: Daniel Gibbs
-# Contributors: http://linuxgsm.com/contrib
-# Website: https://linuxgsm.com
-# Description: Creates an copy of a game servers directorys.
-
-functionselfname="$(basename "$(readlink -f "${BASH_SOURCE[0]}")")"
-
-fn_print_dots "Creating skeleton directory"
-check.sh
-
-# Find all directorys and create them in the skel directory
-find "${rootdir}" -type d -not \( -path ./skel -prune \) | cpio -pdvm skel 2> /dev/null
-exitcode=$?
-if [ "${exitcode}" != 0 ]; then
-	fn_print_fail_nl "Creating skeleton directory"
-	fn_script_log_fatal "Creating skeleton directory"
-else
-	fn_print_ok_nl "Creating skeleton directory: ./skel"
-	fn_script_log_pass "Creating skeleton directory: ./skel"
-fi
-core_exit.sh
diff --git a/lgsm/functions/command_start.sh b/lgsm/functions/command_start.sh
deleted file mode 100644
index 699bc8222..000000000
--- a/lgsm/functions/command_start.sh
+++ /dev/null
@@ -1,224 +0,0 @@
-#!/bin/bash
-# LinuxGSM command_start.sh module
-# Author: Daniel Gibbs
-# Contributors: http://linuxgsm.com/contrib
-# Website: https://linuxgsm.com
-# Description: Starts the server.
-
-commandname="START"
-commandaction="Starting"
-functionselfname="$(basename "$(readlink -f "${BASH_SOURCE[0]}")")"
-addtimestamp="gawk '{ print strftime(\\\"[$logtimestampformat]\\\"), \\\$0 }'"
-fn_firstcommand_set
-
-fn_start_teamspeak3() {
-	if [ ! -f "${servercfgfullpath}" ]; then
-		fn_print_warn_nl "${servercfgfullpath} is missing"
-		fn_script_log_warn "${servercfgfullpath} is missing"
-		echo "	* Creating blank ${servercfg}"
-		fn_script_log_info "Creating blank ${servercfg}"
-		fn_sleep_time
-		echo "	* ${servercfg} can remain blank by default."
-		fn_script_log_info "${servercfgfullpath} can remain blank by default."
-		fn_sleep_time
-		echo "	* ${servercfg} is located in ${servercfgfullpath}."
-		fn_script_log_info "${servercfg} is located in ${servercfgfullpath}."
-		sleep 5
-		touch "${servercfgfullpath}"
-	fi
-	# Accept license.
-	if [ ! -f "${executabledir}/.ts3server_license_accepted" ]; then
-		install_eula.sh
-	fi
-	fn_start_tmux
-}
-
-# This will allow the Jedi Knight 2 version to be printed in console on start.
-# Used to allow update to detect JK2MV server version.
-fn_start_jk2() {
-	fn_start_tmux
-	tmux -L "${sessionname}" send -t "${sessionname}" version ENTER > /dev/null 2>&1
-}
-
-fn_start_tmux() {
-	if [ "${parmsbypass}" ]; then
-		startparameters=""
-	fi
-	# check for tmux size variables.
-	if [[ "${servercfgtmuxwidth}" =~ ^[0-9]+$ ]]; then
-		sessionwidth="${servercfgtmuxwidth}"
-	else
-		sessionwidth="80"
-	fi
-	if [[ "${servercfgtmuxheight}" =~ ^[0-9]+$ ]]; then
-		sessionheight="${servercfgtmuxheight}"
-	else
-		sessionheight="23"
-	fi
-
-	# Log rotation.
-	fn_script_log_info "Rotating log files"
-	if [ "${engine}" == "unreal2" ] && [ -f "${gamelog}" ]; then
-		mv "${gamelog}" "${gamelogdate}"
-	fi
-	if [ -f "${lgsmlog}" ]; then
-		mv "${lgsmlog}" "${lgsmlogdate}"
-	fi
-	if [ -f "${consolelog}" ]; then
-		mv "${consolelog}" "${consolelogdate}"
-	fi
-
-	# Create lockfile
-	date '+%s' > "${lockdir}/${selfname}.lock"
-	echo "${version}" >> "${lockdir}/${selfname}.lock"
-	echo "${port}" >> "${lockdir}/${selfname}.lock"
-	fn_reload_startparameters
-
-	if [ "${shortname}" == "av" ]; then
-		cd "${systemdir}" || exit
-	else
-		cd "${executabledir}" || exit
-	fi
-
-	tmux -L "${sessionname}" new-session -d -x "${sessionwidth}" -y "${sessionheight}" -s "${sessionname}" "${preexecutable} ${executable} ${startparameters}" 2> "${lgsmlogdir}/.${selfname}-tmux-error.tmp"
-
-	# Create logfile.
-	touch "${consolelog}"
-
-	# Create last start lock file
-	date +%s > "${lockdir}/${selfname}-laststart.lock"
-
-	# tmux compiled from source will return "master", therefore ignore it.
-	if [ "${tmuxv}" == "master" ]; then
-		fn_script_log "tmux version: master (user compiled)"
-		echo -e "tmux version: master (user compiled)" >> "${consolelog}"
-		if [ "${consolelogging}" == "on" ] || [ -z "${consolelogging}" ]; then
-			if [ "$logtimestamp" == "on" ]; then
-				tmux -L "${sessionname}" pipe-pane -o -t "${sessionname}" "exec bash -c \"cat | $addtimestamp\" >> '${consolelog}'"
-			else
-				tmux -L "${sessionname}" pipe-pane -o -t "${sessionname}" "exec cat >> '${consolelog}'"
-			fi
-		fi
-
-	elif [ -n "${tmuxv}" ]; then
-		# tmux pipe-pane not supported in tmux versions < 1.6.
-		if [ "${tmuxvdigit}" -lt "16" ]; then
-			echo -e "Console logging disabled: tmux => 1.6 required
-			https://linuxgsm.com/tmux-upgrade
-			Currently installed: $(tmux -V)" > "${consolelog}"
-
-		# Console logging disabled: Bug in tmux 1.8 breaks logging.
-		elif [ "${tmuxvdigit}" -eq "18" ]; then
-			echo -e "Console logging disabled: Bug in tmux 1.8 breaks logging
-			https://linuxgsm.com/tmux-upgrade
-			Currently installed: $(tmux -V)" > "${consolelog}"
-		# Console logging enable or not set.
-		elif [ "${consolelogging}" == "on" ] || [ -z "${consolelogging}" ]; then
-			if [ "$logtimestamp" == "on" ]; then
-				tmux pipe-pane -o -t "${sessionname}" "exec bash -c \"cat | $addtimestamp\" >> '${consolelog}'"
-			else
-				tmux pipe-pane -o -t "${sessionname}" "exec cat >> '${consolelog}'"
-			fi
-		fi
-	else
-		echo -e "Unable to detect tmux version" >> "${consolelog}"
-		fn_script_log_warn "Unable to detect tmux version"
-	fi
-
-	# Console logging disabled.
-	if [ "${consolelogging}" == "off" ]; then
-		echo -e "Console logging disabled by user" >> "${consolelog}"
-		fn_script_log_info "Console logging disabled by user"
-	fi
-	fn_sleep_time
-
-	# If the server fails to start.
-	check_status.sh
-	if [ "${status}" == "0" ]; then
-		fn_print_fail_nl "Unable to start ${servername}"
-		fn_script_log_fatal "Unable to start ${servername}"
-		if [ -s "${lgsmlogdir}/.${selfname}-tmux-error.tmp" ]; then
-			fn_print_fail_nl "Unable to start ${servername}: tmux error:"
-			fn_script_log_fatal "Unable to start ${servername}: tmux error:"
-			echo -e ""
-			echo -e "Command"
-			echo -e "================================="
-			echo -e "tmux -L \"${sessionname}\" new-session -d -s \"${sessionname}\" \"${preexecutable} ${executable} ${startparameters}\"" | tee -a "${lgsmlog}"
-			echo -e ""
-			echo -e "Error"
-			echo -e "================================="
-			tee -a "${lgsmlog}" < "${lgsmlogdir}/.${selfname}-tmux-error.tmp"
-
-			# Detected error https://linuxgsm.com/support
-			if grep -c "Operation not permitted" "${lgsmlogdir}/.${selfname}-tmux-error.tmp"; then
-				echo -e ""
-				echo -e "Fix"
-				echo -e "================================="
-				if ! grep "tty:" /etc/group | grep "$(whoami)"; then
-					echo -e "$(whoami) is not part of the tty group."
-					fn_script_log_info "$(whoami) is not part of the tty group."
-					group=$(grep tty /etc/group)
-					echo -e ""
-					echo -e "	${group}"
-					fn_script_log_info "${group}"
-					echo -e ""
-					echo -e "Run the following command with root privileges."
-					echo -e ""
-					echo -e "	usermod -G tty $(whoami)"
-					echo -e ""
-					echo -e "https://linuxgsm.com/tmux-op-perm"
-					fn_script_log_info "https://linuxgsm.com/tmux-op-perm"
-				else
-					echo -e "No known fix currently. Please log an issue."
-					fn_script_log_info "No known fix currently. Please log an issue."
-					echo -e "https://linuxgsm.com/support"
-					fn_script_log_info "https://linuxgsm.com/support"
-				fi
-			fi
-		fi
-		core_exit.sh
-	else
-		fn_print_ok "${servername}"
-		fn_script_log_pass "Started ${servername}"
-	fi
-	rm -f "${lgsmlogdir:?}/.${selfname}-tmux-error.tmp" 2> /dev/null
-	echo -en "\n"
-}
-
-check.sh
-
-# Is the server already started.
-# $status comes from check_status.sh, which is run by check.sh for this command
-if [ "${status}" != "0" ]; then
-	fn_print_dots "${servername}"
-	fn_print_info_nl "${servername} is already running"
-	fn_script_log_error "${servername} is already running"
-	if [ -z "${exitbypass}" ]; then
-		core_exit.sh
-	fi
-fi
-if [ -z "${fixbypass}" ]; then
-	fix.sh
-fi
-info_game.sh
-core_logs.sh
-
-# Will check for updates is updateonstart is yes.
-if [ "${updateonstart}" == "yes" ] || [ "${updateonstart}" == "1" ] || [ "${updateonstart}" == "on" ]; then
-	exitbypass=1
-	unset updateonstart
-	command_update.sh
-	fn_firstcommand_reset
-fi
-
-fn_print_dots "${servername}"
-
-if [ "${shortname}" == "ts3" ]; then
-	fn_start_teamspeak3
-elif [ "${shortname}" == "jk2" ]; then
-	fn_start_jk2
-else
-	fn_start_tmux
-fi
-
-core_exit.sh
diff --git a/lgsm/functions/command_stop.sh b/lgsm/functions/command_stop.sh
deleted file mode 100644
index 92785af98..000000000
--- a/lgsm/functions/command_stop.sh
+++ /dev/null
@@ -1,283 +0,0 @@
-#!/bin/bash
-# LinuxGSM command_stop.sh module
-# Author: Daniel Gibbs
-# Contributors: http://linuxgsm.com/contrib
-# Website: https://linuxgsm.com
-# Description: Stops the server.
-
-commandname="STOP"
-commandaction="Stopping"
-functionselfname="$(basename "$(readlink -f "${BASH_SOURCE[0]}")")"
-fn_firstcommand_set
-
-# Attempts graceful shutdown by sending 'CTRL+c'.
-fn_stop_graceful_ctrlc() {
-	fn_print_dots "Graceful: CTRL+c"
-	fn_script_log_info "Graceful: CTRL+c"
-	# Sends quit.
-	tmux -L "${sessionname}" send-keys -t "${sessionname}" C-c > /dev/null 2>&1
-	# Waits up to 30 seconds giving the server time to shutdown gracefuly.
-	for seconds in {1..30}; do
-		check_status.sh
-		if [ "${status}" == "0" ]; then
-			fn_print_ok "Graceful: CTRL+c: ${seconds}: "
-			fn_print_ok_eol_nl
-			fn_script_log_pass "Graceful: CTRL+c: OK: ${seconds} seconds"
-			break
-		fi
-		sleep 1
-		fn_print_dots "Graceful: CTRL+c: ${seconds}"
-	done
-	check_status.sh
-	if [ "${status}" != "0" ]; then
-		fn_print_error "Graceful: CTRL+c: "
-		fn_print_fail_eol_nl
-		fn_script_log_error "Graceful: CTRL+c: FAIL"
-	fi
-}
-
-# Attempts graceful shutdown by sending a specified command.
-# Usage: fn_stop_graceful_cmd "console_command" "timeout_in_seconds"
-# e.g.: fn_stop_graceful_cmd "quit" "30"
-fn_stop_graceful_cmd() {
-	fn_print_dots "Graceful: sending \"${1}\""
-	fn_script_log_info "Graceful: sending \"${1}\""
-	# Sends specific stop command.
-	tmux -L "${sessionname}" send -t "${sessionname}" ENTER "${1}" ENTER > /dev/null 2>&1
-	# Waits up to ${seconds} seconds giving the server time to shutdown gracefully.
-	for ((seconds = 1; seconds <= ${2}; seconds++)); do
-		check_status.sh
-		if [ "${status}" == "0" ]; then
-			fn_print_ok "Graceful: sending \"${1}\": ${seconds}: "
-			fn_print_ok_eol_nl
-			fn_script_log_pass "Graceful: sending \"${1}\": OK: ${seconds} seconds"
-			break
-		fi
-		sleep 1
-		fn_print_dots "Graceful: sending \"${1}\": ${seconds}"
-	done
-	check_status.sh
-	if [ "${status}" != "0" ]; then
-		fn_print_error "Graceful: sending \"${1}\": "
-		fn_print_fail_eol_nl
-		fn_script_log_error "Graceful: sending \"${1}\": FAIL"
-	fi
-}
-
-# Attempts graceful shutdown of goldsrc using rcon 'quit' command.
-# There is only a 3 second delay before a forced a tmux shutdown
-# as GoldSrc servers 'quit' command does a restart rather than shutdown.
-fn_stop_graceful_goldsrc() {
-	fn_print_dots "Graceful: sending \"quit\""
-	fn_script_log_info "Graceful: sending \"quit\""
-	# sends quit
-	tmux -L "${sessionname}" send -t "${sessionname}" quit ENTER > /dev/null 2>&1
-	# Waits 3 seconds as goldsrc servers restart with the quit command.
-	for seconds in {1..3}; do
-		sleep 1
-		fn_print_dots "Graceful: sending \"quit\": ${seconds}"
-	done
-	fn_print_ok "Graceful: sending \"quit\": ${seconds}: "
-	fn_print_ok_eol_nl
-	fn_script_log_pass "Graceful: sending \"quit\": OK: ${seconds} seconds"
-}
-
-# telnet command for sdtd graceful shutdown.
-fn_stop_graceful_sdtd_telnet() {
-	if [ -z "${telnetpass}" ] || [ "${telnetpass}" == "NOT SET" ]; then
-		sdtd_telnet_shutdown=$(expect -c '
-		proc abort {} {
-			puts "Timeout or EOF\n"
-			exit 1
-		}
-		spawn telnet '"${telnetip}"' '"${telnetport}"'
-		expect {
-			"session."  { send "shutdown\r" }
-			default         abort
-		}
-		expect { eof }
-		puts "Completed.\n"
-		')
-	else
-		sdtd_telnet_shutdown=$(expect -c '
-		proc abort {} {
-			puts "Timeout or EOF\n"
-			exit 1
-		}
-		spawn telnet '"${telnetip}"' '"${telnetport}"'
-		expect {
-			"password:"     { send "'"${telnetpass}"'\r" }
-			default         abort
-		}
-		expect {
-			"session."  { send "shutdown\r" }
-			default         abort
-		}
-		expect { eof }
-		puts "Completed.\n"
-		')
-	fi
-}
-
-# Attempts graceful shutdown of 7 Days To Die using telnet.
-fn_stop_graceful_sdtd() {
-	fn_print_dots "Graceful: telnet"
-	fn_script_log_info "Graceful: telnet"
-	if [ "${telnetenabled}" == "false" ]; then
-		fn_print_info_nl "Graceful: telnet: DISABLED: Enable in ${servercfg}"
-	elif [ "$(command -v expect 2> /dev/null)" ]; then
-		# Tries to shutdown with both localhost and server IP.
-		for telnetip in 127.0.0.1 ${ip}; do
-			fn_print_dots "Graceful: telnet: ${telnetip}:${telnetport}"
-			fn_script_log_info "Graceful: telnet: ${telnetip}:${telnetport}"
-			fn_stop_graceful_sdtd_telnet
-			completed=$(echo -en "\n ${sdtd_telnet_shutdown}" | grep "Completed.")
-			refused=$(echo -en "\n ${sdtd_telnet_shutdown}" | grep "Timeout or EOF")
-			if [ "${refused}" ]; then
-				fn_print_error "Graceful: telnet: ${telnetip}:${telnetport} : "
-				fn_print_fail_eol_nl
-				fn_script_log_error "Graceful: telnet:  ${telnetip}:${telnetport} : FAIL"
-			elif [ "${completed}" ]; then
-				break
-			fi
-		done
-
-		# If telnet shutdown was successful will use telnet again to check
-		# the connection has closed, confirming that the tmux session can now be killed.
-		if [ "${completed}" ]; then
-			for seconds in {1..30}; do
-				fn_stop_graceful_sdtd_telnet
-				refused=$(echo -en "\n ${sdtd_telnet_shutdown}" | grep "Timeout or EOF")
-				if [ "${refused}" ]; then
-					fn_print_ok "Graceful: telnet: ${telnetip}:${telnetport} : "
-					fn_print_ok_eol_nl
-					fn_script_log_pass "Graceful: telnet: ${telnetip}:${telnetport} : ${seconds} seconds"
-					break
-				fi
-				sleep 1
-				fn_print_dots "Graceful: telnet: ${seconds}"
-			done
-		# If telnet shutdown fails tmux shutdown will be used, this risks loss of world save.
-		else
-			if [ "${refused}" ]; then
-				fn_print_error "Graceful: telnet: "
-				fn_print_fail_eol_nl
-				fn_script_log_error "Graceful: telnet: ${telnetip}:${telnetport} : FAIL"
-			else
-				fn_print_error_nl "Graceful: telnet: Unknown error"
-				fn_script_log_error "Graceful: telnet: Unknown error"
-			fi
-			echo -en "\n" | tee -a "${lgsmlog}"
-			echo -en "Telnet output:" | tee -a "${lgsmlog}"
-			echo -en "\n ${sdtd_telnet_shutdown}" | tee -a "${lgsmlog}"
-			echo -en "\n\n" | tee -a "${lgsmlog}"
-		fi
-	else
-		fn_print_warn "Graceful: telnet: expect not installed: "
-		fn_print_fail_eol_nl
-		fn_script_log_warn "Graceful: telnet: expect not installed: FAIL"
-	fi
-}
-
-# Attempts graceful shutdown by sending /save /stop.
-fn_stop_graceful_avorion() {
-	fn_print_dots "Graceful: /save /stop"
-	fn_script_log_info "Graceful: /save /stop"
-	# Sends /save.
-	tmux -L "${sessionname}" send-keys -t "${sessionname}" /save ENTER > /dev/null 2>&1
-	sleep 5
-	# Sends /quit.
-	tmux -L "${sessionname}" send-keys -t "${sessionname}" /stop ENTER > /dev/null 2>&1
-	# Waits up to 30 seconds giving the server time to shutdown gracefuly.
-	for seconds in {1..30}; do
-		check_status.sh
-		if [ "${status}" == "0" ]; then
-			fn_print_ok "Graceful: /save /stop: ${seconds}: "
-			fn_print_ok_eol_nl
-			fn_script_log_pass "Graceful: /save /stop: OK: ${seconds} seconds"
-			break
-		fi
-		sleep 1
-		fn_print_dots "Graceful: /save /stop: ${seconds}"
-	done
-	check_status.sh
-	if [ "${status}" != "0" ]; then
-		fn_print_error "Graceful: /save /stop: "
-		fn_print_fail_eol_nl
-		fn_script_log_error "Graceful: /save /stop: FAIL"
-	fi
-}
-
-fn_stop_graceful_select() {
-	if [ "${stopmode}" == "1" ]; then
-		fn_stop_tmux
-	elif [ "${stopmode}" == "2" ]; then
-		fn_stop_graceful_ctrlc
-	elif [ "${stopmode}" == "3" ]; then
-		fn_stop_graceful_cmd "quit" 30
-	elif [ "${stopmode}" == "4" ]; then
-		fn_stop_graceful_cmd "quit" 120
-	elif [ "${stopmode}" == "5" ]; then
-		fn_stop_graceful_cmd "stop" 30
-	elif [ "${stopmode}" == "6" ]; then
-		fn_stop_graceful_cmd "q" 30
-	elif [ "${stopmode}" == "7" ]; then
-		fn_stop_graceful_cmd "exit" 30
-	elif [ "${stopmode}" == "8" ]; then
-		fn_stop_graceful_sdtd
-	elif [ "${stopmode}" == "9" ]; then
-		fn_stop_graceful_goldsrc
-	elif [ "${stopmode}" == "10" ]; then
-		fn_stop_graceful_avorion
-	elif [ "${stopmode}" == "11" ]; then
-		fn_stop_graceful_cmd "end" 30
-	elif [ "${stopmode}" == "12" ]; then
-		fn_stop_graceful_cmd "shutdown" 30
-	fi
-}
-
-fn_stop_tmux() {
-	fn_print_dots "${servername}"
-	fn_script_log_info "tmux kill-session: ${sessionname}: ${servername}"
-	# Kill tmux session.
-	tmux -L "${sessionname}" kill-session -t "${sessionname}" > /dev/null 2>&1
-	sleep 0.5
-	check_status.sh
-	if [ "${status}" == "0" ]; then
-		fn_print_ok_nl "${servername}"
-		fn_script_log_pass "Stopped ${servername}"
-	else
-		fn_print_fail_nl "Unable to stop ${servername}"
-		fn_script_log_fatal "Unable to stop ${servername}"
-	fi
-}
-
-# Checks if the server is already stopped.
-fn_stop_pre_check() {
-	if [ "${status}" == "0" ]; then
-		fn_print_info_nl "${servername} is already stopped"
-		fn_script_log_error "${servername} is already stopped"
-	else
-		# Select graceful shutdown.
-		fn_stop_graceful_select
-	fi
-	# Check status again, a kill tmux session if graceful shutdown failed.
-	check_status.sh
-	if [ "${status}" != "0" ]; then
-		fn_stop_tmux
-	fi
-}
-
-check.sh
-fn_print_dots "${servername}"
-
-info_game.sh
-fn_stop_pre_check
-# Remove lockfile.
-if [ -f "${lockdir}/${selfname}.lock" ]; then
-	rm -f "${lockdir:?}/${selfname}.lock"
-fi
-
-if [ -z "${exitbypass}" ]; then
-	core_exit.sh
-fi
diff --git a/lgsm/functions/command_test_alert.sh b/lgsm/functions/command_test_alert.sh
deleted file mode 100644
index 7fe61e48a..000000000
--- a/lgsm/functions/command_test_alert.sh
+++ /dev/null
@@ -1,19 +0,0 @@
-#!/bin/bash
-# LinuxGSM command_test_alert.sh module
-# Author: Daniel Gibbs
-# Contributors: http://linuxgsm.com/contrib
-# Website: https://linuxgsm.com
-# Description: Sends a test alert.
-
-commandname="TEST-ALERT"
-commandaction="Sending Alert"
-functionselfname="$(basename "$(readlink -f "${BASH_SOURCE[0]}")")"
-fn_firstcommand_set
-
-fn_print_dots "${servername}"
-check.sh
-info_game.sh
-alert="test"
-alert.sh
-
-core_exit.sh
diff --git a/lgsm/functions/command_ts3_server_pass.sh b/lgsm/functions/command_ts3_server_pass.sh
deleted file mode 100644
index be0816d15..000000000
--- a/lgsm/functions/command_ts3_server_pass.sh
+++ /dev/null
@@ -1,57 +0,0 @@
-#!/bin/bash
-# LinuxGSM command_ts3_server_pass.sh module
-# Author: Daniel Gibbs
-# Contributors: http://linuxgsm.com/contrib
-# Website: https://linuxgsm.com
-# Description: Changes TS3 serveradmin password.
-
-commandname="CHANGE-PASSWORD"
-commandaction="Changing password"
-functionselfname="$(basename "$(readlink -f "${BASH_SOURCE[0]}")")"
-fn_firstcommand_set
-
-fn_serveradmin_password_prompt() {
-	fn_print_header
-	fn_print_information_nl "You are about to change the ${gamename} ServerAdmin password."
-	fn_print_warning_nl "${gamename} will restart during this process."
-	echo -e ""
-	if ! fn_prompt_yn "Continue?" Y; then
-		exitcode=0
-		core_exit.sh
-	fi
-	fn_script_log_info "Initiating ${gamename} ServerAdmin password change"
-	read -rp "Enter new password: " newpassword
-	fn_print_info_nl "Changing password"
-	fn_script_log_info "Changing password"
-}
-
-fn_serveradmin_password_set() {
-	# Start server in "new password mode".
-	ts3serverpass="1"
-	exitbypass="1"
-	command_start.sh
-	fn_firstcommand_reset
-	fn_print_ok_nl "New password applied"
-	fn_script_log_pass "New ServerAdmin password applied"
-}
-
-# Running functions.
-check.sh
-fn_serveradmin_password_prompt
-if [ "${status}" != "0" ]; then
-	# Stop any running server.
-	exitbypass="1"
-	command_stop.sh
-	fn_firstcommand_reset
-	fn_serveradmin_password_set
-	parms="serveradmin_password=\"${newpassword}\" inifile=\"${servercfgfullpath}\" > /dev/null 2>&1"
-	ts3serverpass="0"
-	command_restart.sh
-	fn_firstcommand_reset
-else
-	fn_serveradmin_password_set
-	command_stop.sh
-	fn_firstcommand_reset
-fi
-
-core_exit.sh
diff --git a/lgsm/functions/command_update.sh b/lgsm/functions/command_update.sh
deleted file mode 100644
index ae5c2065c..000000000
--- a/lgsm/functions/command_update.sh
+++ /dev/null
@@ -1,40 +0,0 @@
-#!/bin/bash
-# LinuxGSM command_update.sh module
-# Author: Daniel Gibbs
-# Contributors: http://linuxgsm.com/contrib
-# Website: https://linuxgsm.com
-# Description: Handles updating of servers.
-
-commandname="UPDATE"
-commandaction="Updating"
-functionselfname="$(basename "$(readlink -f "${BASH_SOURCE[0]}")")"
-fn_firstcommand_set
-
-fn_print_dots ""
-check.sh
-core_logs.sh
-check_last_update.sh
-
-if [ "${shortname}" == "ts3" ]; then
-	update_ts3.sh
-elif [ "${shortname}" == "mc" ]; then
-	update_minecraft.sh
-elif [ "${shortname}" == "mcb" ]; then
-	update_minecraft_bedrock.sh
-elif [ "${shortname}" == "pmc" ] || [ "${shortname}" == "vpmc" ] || [ "${shortname}" == "wmc" ]; then
-	update_papermc.sh
-elif [ "${shortname}" == "fctr" ]; then
-	update_factorio.sh
-elif [ "${shortname}" == "mta" ]; then
-	update_mta.sh
-elif [ "${shortname}" == "jk2" ]; then
-	update_jediknight2.sh
-elif [ "${shortname}" == "vints" ]; then
-	update_vintagestory.sh
-elif [ "${shortname}" == "ut99" ]; then
-	update_ut99.sh
-else
-	update_steamcmd.sh
-fi
-
-core_exit.sh
diff --git a/lgsm/functions/command_update_linuxgsm.sh b/lgsm/functions/command_update_linuxgsm.sh
deleted file mode 100644
index 569bc7cdb..000000000
--- a/lgsm/functions/command_update_linuxgsm.sh
+++ /dev/null
@@ -1,236 +0,0 @@
-#!/bin/bash
-# LinuxGSM command_update_linuxgsm.sh module
-# Author: Daniel Gibbs
-# Contributors: http://linuxgsm.com/contrib
-# Website: https://linuxgsm.com
-# Description: Deletes the functions dir to allow re-downloading of functions from GitHub.
-
-commandname="UPDATE-LGSM"
-commandaction="Updating LinuxGSM"
-functionselfname="$(basename "$(readlink -f "${BASH_SOURCE[0]}")")"
-fn_firstcommand_set
-
-check.sh
-info_distro.sh
-
-fn_print_dots ""
-fn_script_log_info "Updating LinuxGSM"
-
-fn_print_dots "Selecting repo"
-fn_script_log_info "Selecting repo"
-# Select remotereponame
-curl --connect-timeout 10 -IsfL "https://raw.githubusercontent.com/${githubuser}/${githubrepo}/${githubbranch}/linuxgsm.sh" 1> /dev/null
-if [ $? != "0" ]; then
-	curl --connect-timeout 10 -IsfL "https://bitbucket.org/${githubuser}/${githubrepo}/raw/${githubbranch}/linuxgsm.sh" 1> /dev/null
-	if [ $? != "0" ]; then
-		fn_print_fail_nl "Selecting repo: Unable to to access GitHub or Bitbucket repositories"
-		fn_script_log_fatal "Selecting repo: Unable to to access GitHub or Bitbucket repositories"
-		core_exit.sh
-	else
-		remotereponame="Bitbucket"
-		fn_print_ok_nl "Selecting repo: ${remotereponame}"
-	fi
-else
-	remotereponame="GitHub"
-	fn_print_ok_nl "Selecting repo: ${remotereponame}"
-fi
-
-# Check linuxsm.sh
-echo -en "checking ${remotereponame} linuxgsm.sh...\c"
-if [ "${remotereponame}" == "GitHub" ]; then
-	curl --connect-timeout 10 -IsfL "https://raw.githubusercontent.com/${githubuser}/${githubrepo}/${githubbranch}/linuxgsm.sh" 1> /dev/null
-else
-	curl --connect-timeout 10 -IsfL "https://bitbucket.org/${githubuser}/${githubrepo}/raw/${githubbranch}/linuxgsm.sh" 1> /dev/null
-fi
-if [ $? != "0" ]; then
-	fn_print_fail_eol_nl
-	fn_script_log_fatal "Checking ${remotereponame} linuxgsm.sh"
-	fn_script_log_fatal "Curl returned error: $?"
-	core_exit.sh
-fi
-
-if [ "${remotereponame}" == "GitHub" ]; then
-	tmp_script_diff=$(diff "${tmpdir}/linuxgsm.sh" <(curl --connect-timeout 10 -s "https://raw.githubusercontent.com/${githubuser}/${githubrepo}/${githubbranch}/linuxgsm.sh"))
-else
-	tmp_script_diff=$(diff "${tmpdir}/linuxgsm.sh" <(curl --connect-timeout 10 -s "https://bitbucket.org/${githubuser}/${githubrepo}/raw/${githubbranch}/linuxgsm.sh"))
-fi
-
-if [ "${tmp_script_diff}" != "" ]; then
-	fn_print_update_eol_nl
-	fn_script_log_update "Checking ${remotereponame} linuxgsm.sh"
-	rm -f "${tmpdir:?}/linuxgsm.sh"
-	fn_fetch_file_github "" "linuxgsm.sh" "${tmpdir}" "nochmodx" "norun" "noforcedl" "nohash"
-else
-	fn_print_ok_eol_nl
-	fn_script_log_pass "Checking ${remotereponame} linuxgsm.sh"
-fi
-
-# Check gameserver.sh
-# Compare gameserver.sh against linuxgsm.sh in the tmp dir.
-# Ignoring server specific vars.
-echo -en "checking ${selfname}...\c"
-fn_script_log_info "Checking ${selfname}"
-script_diff=$(diff <(sed '\/shortname/d;\/gameservername/d;\/gamename/d;\/githubuser/d;\/githubrepo/d;\/githubbranch/d' "${tmpdir}/linuxgsm.sh") <(sed '\/shortname/d;\/gameservername/d;\/gamename/d;\/githubuser/d;\/githubrepo/d;\/githubbranch/d' "${rootdir}/${selfname}"))
-if [ "${script_diff}" != "" ]; then
-	fn_print_update_eol_nl
-	fn_script_log_update "Checking ${selfname}"
-	echo -en "backup ${selfname}...\c"
-	fn_script_log_info "Backup ${selfname}"
-	if [ ! -d "${backupdir}/script" ]; then
-		mkdir -p "${backupdir}/script"
-	fi
-	cp "${rootdir}/${selfname}" "${backupdir}/script/${selfname}-$(date +"%m_%d_%Y_%M").bak"
-	if [ $? != 0 ]; then
-		fn_print_fail_eol_nl
-		fn_script_log_fatal "Backup ${selfname}"
-		core_exit.sh
-	else
-		fn_print_ok_eol_nl
-		fn_script_log_pass "Backup ${selfname}"
-		echo -e "backup location ${backupdir}/script/${selfname}-$(date +"%m_%d_%Y_%M").bak"
-		fn_script_log_pass "Backup location ${backupdir}/script/${selfname}-$(date +"%m_%d_%Y_%M").bak"
-	fi
-
-	echo -en "copying ${selfname}...\c"
-	fn_script_log_info "copying ${selfname}"
-	cp "${tmpdir}/linuxgsm.sh" "${rootdir}/${selfname}"
-	sed -i "s+shortname=\"core\"+shortname=\"${shortname}\"+g" "${rootdir}/${selfname}"
-	sed -i "s+gameservername=\"core\"+gameservername=\"${gameservername}\"+g" "${rootdir}/${selfname}"
-	sed -i "s+gamename=\"core\"+gamename=\"${gamename}\"+g" "${rootdir}/${selfname}"
-	sed -i "s+githubuser=\"GameServerManagers\"+githubuser=\"${githubuser}\"+g" "${rootdir}/${selfname}"
-	sed -i "s+githubrepo=\"LinuxGSM\"+githubrepo=\"${githubrepo}\"+g" "${rootdir}/${selfname}"
-	sed -i "s+githubbranch=\"master\"+githubbranch=\"${githubbranch}\"+g" "${rootdir}/${selfname}"
-
-	if [ $? != "0" ]; then
-		fn_print_fail_eol_nl
-		fn_script_log_fatal "copying ${selfname}"
-		core_exit.sh
-	else
-		fn_print_ok_eol_nl
-		fn_script_log_pass "copying ${selfname}"
-	fi
-else
-	fn_print_ok_eol_nl
-	fn_script_log_info "Checking ${selfname}"
-fi
-
-# Check _default.cfg.
-echo -en "checking ${remotereponame} config _default.cfg...\c"
-fn_script_log_info "Checking ${remotereponame} config _default.cfg"
-if [ "${remotereponame}" == "GitHub" ]; then
-	curl --connect-timeout 10 -IsfL "https://raw.githubusercontent.com/${githubuser}/${githubrepo}/${githubbranch}/lgsm/config-default/config-lgsm/${gameservername}/_default.cfg" 1> /dev/null
-else
-	curl --connect-timeout 10 -IsfL "https://bitbucket.org/${githubuser}/${githubrepo}/raw/${githubbranch}/lgsm/config-default/config-lgsm/${gameservername}/_default.cfg" 1> /dev/null
-fi
-if [ $? != "0" ]; then
-	fn_print_fail_eol_nl
-	fn_script_log_fatal "Checking ${remotereponame} config _default.cfg"
-	fn_script_log_fatal "Curl returned error: $?"
-	core_exit.sh
-fi
-
-if [ "${remotereponame}" == "GitHub" ]; then
-	config_file_diff=$(diff "${configdirdefault}/config-lgsm/${gameservername}/_default.cfg" <(curl --connect-timeout 10 -s "https://raw.githubusercontent.com/${githubuser}/${githubrepo}/${githubbranch}/lgsm/config-default/config-lgsm/${gameservername}/_default.cfg"))
-else
-	config_file_diff=$(diff "${configdirdefault}/config-lgsm/${gameservername}/_default.cfg" <(curl --connect-timeout 10 -s "https://bitbucket.org/${githubuser}/${githubrepo}/raw/${githubbranch}/lgsm/config-default/config-lgsm/${gameservername}/_default.cfg"))
-fi
-
-if [ "${config_file_diff}" != "" ]; then
-	fn_print_update_eol_nl
-	fn_script_log_update "Checking ${remotereponame} config _default.cfg"
-	rm -f "${configdirdefault:?}/config-lgsm/${gameservername:?}/_default.cfg"
-	fn_fetch_file_github "lgsm/config-default/config-lgsm/${gameservername}" "_default.cfg" "${configdirdefault}/config-lgsm/${gameservername}" "nochmodx" "norun" "noforce" "nohash"
-	alert="config"
-	alert.sh
-else
-	fn_print_ok_eol_nl
-	fn_script_log_pass "Checking ${remotereponame} config _default.cfg"
-fi
-
-# Check distro csv. ${datadir}/${distroid}-${distroversioncsv}.csv
-if [ -f "${datadir}/${distroid}-${distroversioncsv}.csv" ]; then
-	echo -en "checking ${remotereponame} config ${distroid}-${distroversioncsv}.csv...\c"
-	fn_script_log_info "Checking ${remotereponame} ${distroid}-${distroversioncsv}.csv"
-	if [ "${remotereponame}" == "GitHub" ]; then
-		curl --connect-timeout 10 -IsfL "https://raw.githubusercontent.com/${githubuser}/${githubrepo}/${githubbranch}/lgsm/data/${distroid}-${distroversioncsv}.csv" 1> /dev/null
-	else
-		curl --connect-timeout 10 -IsfL "https://bitbucket.org/${githubuser}/${githubrepo}/raw/${githubbranch}/lgsm/data/${distroid}-${distroversioncsv}.csv" 1> /dev/null
-	fi
-	if [ $? != "0" ]; then
-		fn_print_fail_eol_nl
-		fn_script_log_fatal "Checking ${remotereponame} ${distroid}-${distroversioncsv}.csv"
-		fn_script_log_fatal "Curl returned error: $?"
-		core_exit.sh
-	fi
-
-	if [ "${remotereponame}" == "GitHub" ]; then
-		config_file_diff=$(diff "${datadir}/${distroid}-${distroversioncsv}.csv" <(curl --connect-timeout 10 -s "https://raw.githubusercontent.com/${githubuser}/${githubrepo}/${githubbranch}/lgsm/data/${distroid}-${distroversioncsv}.csv"))
-	else
-		config_file_diff=$(diff "${datadir}/${distroid}-${distroversioncsv}.csv" <(curl --connect-timeout 10 -s "https://bitbucket.org/${githubuser}/${githubrepo}/raw/${githubbranch}/lgsm/data/${distroid}-${distroversioncsv}.csv"))
-	fi
-
-	if [ "${config_file_diff}" != "" ]; then
-		fn_print_update_eol_nl
-		fn_script_log_update "Checking ${remotereponame} ${distroid}-${distroversioncsv}.csv"
-		rm -f "${datadir:?}/${distroid}-${distroversioncsv}.csv"
-		fn_fetch_file_github "lgsm/data" "${distroid}-${distroversioncsv}.csv" "${datadir}" "nochmodx" "norun" "noforce" "nohash"
-	else
-		fn_print_ok_eol_nl
-		fn_script_log_pass "Checking ${remotereponame} ${distroid}-${distroversioncsv}.csv"
-	fi
-fi
-# Check and update modules.
-if [ -n "${functionsdir}" ]; then
-	if [ -d "${functionsdir}" ]; then
-		(
-			cd "${functionsdir}" || exit
-			for functionfile in *; do
-				# check if module exists in the repo and remove if missing.
-				# commonly used if module names change.
-				echo -en "checking ${remotereponame} module ${functionfile}...\c"
-				github_file_url_dir="lgsm/functions"
-				if [ "${remotereponame}" == "GitHub" ]; then
-					curl --connect-timeout 10 -IsfL "https://raw.githubusercontent.com/${githubuser}/${githubrepo}/${githubbranch}/${github_file_url_dir}/${functionfile}" 1> /dev/null
-				else
-					curl --connect-timeout 10 -IsfL "https://bitbucket.org/${githubuser}/${githubrepo}/raw/${githubbranch}/${github_file_url_dir}/${functionfile}" 1> /dev/null
-				fi
-				if [ $? != 0 ]; then
-					fn_print_error_eol_nl
-					fn_script_log_error "Checking ${remotereponame} module ${functionfile}"
-					echo -en "removing module ${functionfile}...\c"
-					if ! rm -f "${functionfile:?}"; then
-						fn_print_fail_eol_nl
-						fn_script_log_fatal "Removing module ${functionfile}"
-						core_exit.sh
-					else
-						fn_print_ok_eol_nl
-						fn_script_log_pass "Removing module ${functionfile}"
-					fi
-				else
-					# compare file
-					if [ "${remotereponame}" == "GitHub" ]; then
-						function_file_diff=$(diff "${functionsdir}/${functionfile}" <(curl --connect-timeout 10 -s "https://raw.githubusercontent.com/${githubuser}/${githubrepo}/${githubbranch}/${github_file_url_dir}/${functionfile}"))
-					else
-						function_file_diff=$(diff "${functionsdir}/${functionfile}" <(curl --connect-timeout 10 -s "https://bitbucket.org/${githubuser}/${githubrepo}/raw/${githubbranch}/${github_file_url_dir}/${functionfile}"))
-					fi
-
-					# results
-					if [ "${function_file_diff}" != "" ]; then
-						fn_print_update_eol_nl
-						fn_script_log_update "Checking ${remotereponame} module ${functionfile}"
-						rm -rf "${functionsdir:?}/${functionfile}"
-						fn_update_function
-					else
-						fn_print_ok_eol_nl
-						fn_script_log_pass "Checking ${remotereponame} module ${functionfile}"
-					fi
-				fi
-			done
-		)
-	fi
-fi
-
-fn_print_ok_nl "Updating functions"
-fn_script_log_pass "Updating functions"
-
-core_exit.sh
diff --git a/lgsm/functions/command_validate.sh b/lgsm/functions/command_validate.sh
deleted file mode 100644
index 15257a3e2..000000000
--- a/lgsm/functions/command_validate.sh
+++ /dev/null
@@ -1,49 +0,0 @@
-#!/bin/bash
-# LinuxGSM command_validate.sh module
-# Author: Daniel Gibbs
-# Contributors: http://linuxgsm.com/contrib
-# Website: https://linuxgsm.com
-# Description: Runs a server validation.
-
-commandname="VALIDATE"
-commandaction="Validating"
-functionselfname="$(basename "$(readlink -f "${BASH_SOURCE[0]}")")"
-fn_firstcommand_set
-
-fn_validate() {
-	fn_print_warn "Validate might overwrite some customised files"
-	fn_script_log_warn "${commandaction} server: Validate might overwrite some customised files"
-	totalseconds=3
-	for seconds in {3..1}; do
-		fn_print_warn "Validate might overwrite some customised files: ${totalseconds}"
-		totalseconds=$((totalseconds - 1))
-		sleep 1
-		if [ "${seconds}" == "0" ]; then
-			break
-		fi
-	done
-	fn_print_warn_nl "Validate might overwrite some customised files"
-
-	fn_dl_steamcmd
-}
-
-# The location where the builds are checked and downloaded.
-remotelocation="SteamCMD"
-check.sh
-
-fn_print_dots "${remotelocation}"
-
-if [ "${status}" != "0" ]; then
-	fn_print_restart_warning
-	exitbypass=1
-	command_stop.sh
-	fn_firstcommand_reset
-	fn_validate
-	exitbypass=1
-	command_start.sh
-	fn_firstcommand_reset
-else
-	fn_validate
-fi
-
-core_exit.sh
diff --git a/lgsm/functions/command_wipe.sh b/lgsm/functions/command_wipe.sh
deleted file mode 100644
index e1677e827..000000000
--- a/lgsm/functions/command_wipe.sh
+++ /dev/null
@@ -1,183 +0,0 @@
-#!/bin/bash
-# LinuxGSM command_backup.sh module
-# Author: Daniel Gibbs
-# Contributors: http://linuxgsm.com/contrib
-# Website: https://linuxgsm.com
-# Description: Wipes server data, useful after updates for some games like Rust.
-
-commandname="WIPE"
-commandaction="Wiping"
-functionselfname="$(basename "$(readlink -f "${BASH_SOURCE[0]}")")"
-fn_firstcommand_set
-
-# Provides an exit code upon error.
-fn_wipe_exit_code() {
-	exitcode=$?
-	if [ "${exitcode}" != 0 ]; then
-		fn_print_fail_eol_nl
-		core_exit.sh
-	else
-		fn_print_ok_eol_nl
-	fi
-}
-
-# Removes files to wipe server.
-fn_wipe_files() {
-	fn_print_start_nl "${wipetype}"
-	fn_script_log_info "${wipetype}"
-
-	# Remove Map files
-	if [ -n "${serverwipe}" ] || [ -n "${mapwipe}" ]; then
-		if [ -n "$(find "${serveridentitydir}" -type f -name "*.map")" ]; then
-			echo -en "removing .map file(s)..."
-			fn_script_log_info "removing *.map file(s)"
-			fn_sleep_time
-			find "${serveridentitydir:?}" -type f -name "*.map" -printf "%f\n" >> "${lgsmlog}"
-			find "${serveridentitydir:?}" -type f -name "*.map" -delete | tee -a "${lgsmlog}"
-			fn_wipe_exit_code
-		else
-			echo -e "no .map file(s) to remove"
-			fn_sleep_time
-			fn_script_log_pass "no .map file(s) to remove"
-		fi
-	fi
-	# Remove Save files.
-	if [ -n "${serverwipe}" ] || [ -n "${mapwipe}" ]; then
-		if [ -n "$(find "${serveridentitydir}" -type f -name "*.sav*")" ]; then
-			echo -en "removing .sav file(s)..."
-			fn_script_log_info "removing .sav file(s)"
-			fn_sleep_time
-			find "${serveridentitydir:?}" -type f -name "*.sav*" -printf "%f\n" >> "${lgsmlog}"
-			find "${serveridentitydir:?}" -type f -name "*.sav*" -delete
-			fn_wipe_exit_code
-		else
-			echo -e "no .sav file(s) to remove"
-			fn_script_log_pass "no .sav file(s) to remove"
-			fn_sleep_time
-		fi
-	fi
-	# Remove db files for full wipe.
-	# Excluding player.tokens.db for Rust+.
-	if [ -n "${serverwipe}" ]; then
-		if [ -n "$(find "${serveridentitydir}" -type f ! -name 'player.tokens.db' -name "*.db")" ]; then
-			echo -en "removing .db file(s)..."
-			fn_script_log_info "removing .db file(s)"
-			fn_sleep_time
-			find "${serveridentitydir:?}" -type f ! -name 'player.tokens.db' -name "*.db" -printf "%f\n" >> "${lgsmlog}"
-			find "${serveridentitydir:?}" -type f ! -name 'player.tokens.db' -name "*.db" -delete
-			fn_wipe_exit_code
-		else
-			echo -e "no .db file(s) to remove"
-			fn_sleep_time
-			fn_script_log_pass "no .db file(s) to remove"
-		fi
-	fi
-}
-
-fn_map_wipe_warning() {
-	fn_print_warn "Map wipe will reset the map data and keep blueprint data"
-	fn_script_log_warn "Map wipe will reset the map data and keep blueprint data"
-	totalseconds=3
-	for seconds in {3..1}; do
-		fn_print_warn "Map wipe will reset the map data and keep blueprint data: ${totalseconds}"
-		totalseconds=$((totalseconds - 1))
-		sleep 1
-		if [ "${seconds}" == "0" ]; then
-			break
-		fi
-	done
-	fn_print_warn_nl "Map wipe will reset the map data and keep blueprint data"
-}
-
-fn_full_wipe_warning() {
-	fn_print_warn "Server wipe will reset the map data and remove blueprint data"
-	fn_script_log_warn "Server wipe will reset the map data and remove blueprint data"
-	totalseconds=3
-	for seconds in {3..1}; do
-		fn_print_warn "Server wipe will reset the map data and remove blueprint data: ${totalseconds}"
-		totalseconds=$((totalseconds - 1))
-		sleep 1
-		if [ "${seconds}" == "0" ]; then
-			break
-		fi
-	done
-	fn_print_warn_nl "Server wipe will reset the map data and remove blueprint data"
-}
-
-# Will change the seed if the seed is not defined by the user.
-fn_wipe_random_seed() {
-	if [ -f "${datadir}/${selfname}-seed.txt" ] && [ -n "${randomseed}" ]; then
-		shuf -i 1-2147483647 -n 1 > "${datadir}/${selfname}-seed.txt"
-		seed=$(cat "${datadir}/${selfname}-seed.txt")
-		randomseed=1
-		echo -en "generating new random seed (${cyan}${seed}${default})..."
-		fn_script_log_pass "Generating new random seed (${cyan}${seed}${default})"
-		fn_sleep_time
-		fn_print_ok_eol_nl
-	fi
-}
-
-# A summary of what wipe is going to do.
-fn_wipe_details() {
-	fn_print_information_nl "Wipe does not remove Rust+ data."
-	echo -en "* Wipe map data: "
-	if [ -n "${serverwipe}" ] || [ -n "${mapwipe}" ]; then
-		fn_print_yes_eol_nl
-	else
-		fn_print_no_eol_nl
-	fi
-
-	echo -en "* Wipe blueprint data: "
-	if [ -n "${serverwipe}" ]; then
-		fn_print_yes_eol_nl
-	else
-		fn_print_no_eol_nl
-	fi
-
-	echo -en "* Change Procedural Map seed: "
-	if [ -n "${randomseed}" ]; then
-		fn_print_yes_eol_nl
-	else
-		fn_print_no_eol_nl
-	fi
-}
-
-fn_print_dots ""
-check.sh
-fix_rust.sh
-
-# Check if there is something to wipe.
-if [ -n "$(find "${serveridentitydir}" -type f -name "*.map")" ] || [ -n "$(find "${serveridentitydir}" -type f -name "*.sav*")" ] && [ -n "$(find "${serveridentitydir}" -type f ! -name 'player.tokens.db' -name "*.db")" ]; then
-	if [ -n "${serverwipe}" ]; then
-		wipetype="Full wipe"
-		fn_full_wipe_warning
-		fn_wipe_details
-	elif [ -n "${mapwipe}" ]; then
-		wipetype="Map wipe"
-		fn_map_wipe_warning
-		fn_wipe_details
-	fi
-	check_status.sh
-	if [ "${status}" != "0" ]; then
-		fn_print_restart_warning
-		exitbypass=1
-		command_stop.sh
-		fn_firstcommand_reset
-		fn_wipe_files
-		fn_wipe_random_seed
-		fn_print_complete_nl "${wipetype}"
-		fn_script_log_pass "${wipetype}"
-		exitbypass=1
-		command_start.sh
-		fn_firstcommand_reset
-	else
-		fn_wipe_files
-		fn_wipe_random_seed
-		fn_print_complete_nl "${wipetype}"
-		fn_script_log_pass "${wipetype}"
-	fi
-else
-	fn_print_ok_nl "Wipe not required"
-	fn_script_log_pass "Wipe not required"
-fi
-core_exit.sh
diff --git a/lgsm/functions/compress_unreal2_maps.sh b/lgsm/functions/compress_unreal2_maps.sh
deleted file mode 100644
index 0c32d3c77..000000000
--- a/lgsm/functions/compress_unreal2_maps.sh
+++ /dev/null
@@ -1,35 +0,0 @@
-#!/bin/bash
-# LinuxGSM compress_unreal2_maps.sh module
-# Author: Daniel Gibbs
-# Contributors: http://linuxgsm.com/contrib
-# Website: https://linuxgsm.com
-# Description: Compresses unreal maps.
-
-commandname="MAP-COMPRESSOR"
-commandaction="Compressing maps"
-functionselfname="$(basename "$(readlink -f "${BASH_SOURCE[0]}")")"
-fn_firstcommand_set
-
-check.sh
-fn_print_header
-echo -e "Will compress all maps in:"
-echo -e ""
-pwd
-echo -e ""
-echo -e "Compressed maps saved to:"
-echo -e ""
-echo -e "${compressedmapsdir}"
-echo -e ""
-if ! fn_prompt_yn "Start compression?" Y; then
-	exitcode=0
-	core_exit.sh
-fi
-mkdir -pv "${compressedmapsdir}" > /dev/null 2>&1
-rm -rfv "${serverfiles:?}/Maps/"*.ut2.uz2
-cd "${systemdir}" || exit
-for map in "${serverfiles}/Maps/"*; do
-	./ucc-bin compress "${map}" --nohomedir
-done
-mv -fv "${serverfiles}/Maps/"*.ut2.uz2 "${compressedmapsdir}"
-
-core_exit.sh
diff --git a/lgsm/functions/compress_ut99_maps.sh b/lgsm/functions/compress_ut99_maps.sh
deleted file mode 100644
index 9aa074ba9..000000000
--- a/lgsm/functions/compress_ut99_maps.sh
+++ /dev/null
@@ -1,35 +0,0 @@
-#!/bin/bash
-# LinuxGSM compress_ut99_maps.sh module
-# Author: Daniel Gibbs
-# Contributors: http://linuxgsm.com/contrib
-# Website: https://linuxgsm.com
-# Description: Compresses unreal maps.
-
-commandname="MAP-COMPRESSOR"
-commandaction="Compressing maps"
-functionselfname="$(basename "$(readlink -f "${BASH_SOURCE[0]}")")"
-fn_firstcommand_set
-
-check.sh
-fn_print_header
-echo -e "Will compress all maps in:"
-echo -e ""
-pwd
-echo -e ""
-echo -e "Compressed maps saved to:"
-echo -e ""
-echo -e "${compressedmapsdir}"
-echo -e ""
-if ! fn_prompt_yn "Start compression?" Y; then
-	exitcode=0
-	core_exit.sh
-fi
-mkdir -pv "${compressedmapsdir}" > /dev/null 2>&1
-rm -rfv "${serverfiles:?}/Maps/"*.unr.uz
-cd "${systemdir}" || exit
-for map in "${serverfiles}/Maps/"*; do
-	./ucc-bin compress "${map}" --nohomedir
-done
-mv -fv "${serverfiles}/Maps/"*.unr.uz "${compressedmapsdir}"
-
-core_exit.sh
diff --git a/lgsm/functions/core_dl.sh b/lgsm/functions/core_dl.sh
deleted file mode 100644
index 53a60cc1a..000000000
--- a/lgsm/functions/core_dl.sh
+++ /dev/null
@@ -1,625 +0,0 @@
-#!/bin/bash
-# LinuxGSM core_dl.sh module
-# Author: Daniel Gibbs
-# Contributors: http://linuxgsm.com/contrib
-# Website: https://linuxgsm.com
-# Description: Deals with all downloads for LinuxGSM.
-
-# remote_fileurl: The URL of the file: http://example.com/dl/File.tar.bz2
-# local_filedir: location the file is to be saved: /home/server/lgsm/tmp
-# local_filename: name of file (this can be different from the url name): file.tar.bz2
-# chmodx: Optional, set to "chmodx" to make file executable using chmod +x
-# run: Optional, set run to execute the file after download
-# forcedl: Optional, force re-download of file even if exists
-# hash: Optional, set an hash sum and will compare it against the file.
-#
-# Downloads can be defined in code like so:
-# fn_fetch_file "${remote_fileurl}" "${remote_fileurl_backup}" "${remote_fileurl_name}" "${remote_fileurl_backup_name}" "${local_filedir}" "${local_filename}" "${chmodx}" "${run}" "${forcedl}" "${hash}"
-# fn_fetch_file "http://example.com/file.tar.bz2" "http://example.com/file2.tar.bz2" "file.tar.bz2" "file2.tar.bz2" "/some/dir" "file.tar.bz2" "chmodx" "run" "forcedl" "10cd7353aa9d758a075c600a6dd193fd"
-
-functionselfname="$(basename "$(readlink -f "${BASH_SOURCE[0]}")")"
-
-fn_dl_steamcmd() {
-	fn_print_start_nl "${remotelocation}"
-	fn_script_log_info "${commandaction} ${selfname}: ${remotelocation}"
-	if [ -n "${branch}" ]; then
-		echo -e "Branch: ${branch}"
-		fn_script_log_info "Branch: ${branch}"
-	fi
-	if [ -n "${betapassword}" ]; then
-		echo -e "Branch password: ${betapassword}"
-		fn_script_log_info "Branch password: ${betapassword}"
-	fi
-	if [ -d "${steamcmddir}" ]; then
-		cd "${steamcmddir}" || exit
-	fi
-
-	# Unbuffer will allow the output of steamcmd not buffer allowing a smooth output.
-	# unbuffer us part of the expect package.
-	if [ "$(command -v unbuffer)" ]; then
-		unbuffer="unbuffer"
-	fi
-
-	# Validate will be added as a parameter if required.
-	if [ "${commandname}" == "VALIDATE" ] || [ "${commandname}" == "INSTALL" ]; then
-		validate="validate"
-	fi
-
-	# To do error checking for SteamCMD the output of steamcmd will be saved to a log.
-	steamcmdlog="${lgsmlogdir}/${selfname}-steamcmd.log"
-
-	# clear previous steamcmd log
-	if [ -f "${steamcmdlog}" ]; then
-		rm -f "${steamcmdlog:?}"
-	fi
-	counter=0
-	while [ "${counter}" == "0" ] || [ "${exitcode}" != "0" ]; do
-		counter=$((counter + 1))
-		# Select SteamCMD parameters
-		# If GoldSrc (appid 90) servers. GoldSrc (appid 90) require extra commands.
-		if [ "${appid}" == "90" ]; then
-			# If using a specific branch.
-			if [ -n "${branch}" ] && [ -n "${betapassword}" ]; then
-				${unbuffer} ${steamcmdcommand} +force_install_dir "${serverfiles}" +login "${steamuser}" "${steampass}" +app_set_config 90 mod "${appidmod}" +app_update "${appid}" -beta "${branch}" -betapassword "${betapassword}" ${validate} +quit | uniq | tee -a "${lgsmlog}" "${steamcmdlog}"
-			elif [ -n "${branch}" ]; then
-				${unbuffer} ${steamcmdcommand} +force_install_dir "${serverfiles}" +login "${steamuser}" "${steampass}" +app_set_config 90 mod "${appidmod}" +app_update "${appid}" -beta "${branch}" ${validate} +quit | uniq | tee -a "${lgsmlog}" "${steamcmdlog}"
-			else
-				${unbuffer} ${steamcmdcommand} +force_install_dir "${serverfiles}" +login "${steamuser}" "${steampass}" +app_set_config 90 mod "${appidmod}" +app_update "${appid}" ${validate} +quit | uniq | tee -a "${lgsmlog}" "${steamcmdlog}"
-			fi
-		# Force Windows Platform type.
-		elif [ "${steamcmdforcewindows}" == "yes" ]; then
-			if [ -n "${branch}" ] && [ -n "${betapassword}" ]; then
-				${unbuffer} ${steamcmdcommand} +@sSteamCmdForcePlatformType windows +force_install_dir "${serverfiles}" +login "${steamuser}" "${steampass}" +app_update "${appid}" -beta "${branch}" -betapassword "${betapassword}" ${validate} +quit | uniq | tee -a "${lgsmlog}" "${steamcmdlog}"
-			elif [ -n "${branch}" ]; then
-				${unbuffer} ${steamcmdcommand} +@sSteamCmdForcePlatformType windows +force_install_dir "${serverfiles}" +login "${steamuser}" "${steampass}" +app_update "${appid}" -beta "${branch}" ${validate} +quit | uniq | tee -a "${lgsmlog}" "${steamcmdlog}"
-			else
-				${unbuffer} ${steamcmdcommand} +@sSteamCmdForcePlatformType windows +force_install_dir "${serverfiles}" +login "${steamuser}" "${steampass}" +app_update "${appid}" ${validate} +quit | uniq | tee -a "${lgsmlog}" "${steamcmdlog}"
-			fi
-		# All other servers.
-		else
-			if [ -n "${branch}" ] && [ -n "${betapassword}" ]; then
-				${unbuffer} ${steamcmdcommand} +force_install_dir "${serverfiles}" +login "${steamuser}" "${steampass}" +app_update "${appid}" -beta "${branch}" -betapassword "${betapassword}" ${validate} +quit | uniq | tee -a "${lgsmlog}" "${steamcmdlog}"
-			elif [ -n "${branch}" ]; then
-				${unbuffer} ${steamcmdcommand} +force_install_dir "${serverfiles}" +login "${steamuser}" "${steampass}" +app_update "${appid}" -beta "${branch}" ${validate} +quit | uniq | tee -a "${lgsmlog}" "${steamcmdlog}"
-			else
-				${unbuffer} ${steamcmdcommand} +force_install_dir "${serverfiles}" +login "${steamuser}" "${steampass}" +app_update "${appid}" ${validate} +quit | uniq | tee -a "${lgsmlog}" "${steamcmdlog}"
-			fi
-		fi
-
-		# Error checking for SteamCMD. Some errors will loop to try again and some will just exit.
-		# Check also if we have more errors than retries to be sure that we do not loop to many times and error out.
-		exitcode=$?
-		if [ -n "$(grep -i "Error!" "${steamcmdlog}" | tail -1)" ] && [ "$(grep -ic "Error!" "${steamcmdlog}")" -ge "${counter}" ]; then
-			# Not enough space.
-			if [ -n "$(grep "0x202" "${steamcmdlog}" | tail -1)" ]; then
-				fn_print_failure_nl "${commandaction} ${selfname}: ${remotelocation}: Not enough disk space to download server files"
-				fn_script_log_fatal "${commandaction} ${selfname}: ${remotelocation}: Not enough disk space to download server files"
-				core_exit.sh
-				# Not enough space.
-			elif [ -n "$(grep "0x212" "${steamcmdlog}" | tail -1)" ]; then
-				fn_print_failure_nl "${commandaction} ${selfname}: ${remotelocation}: Not enough disk space to download server files"
-				fn_script_log_fatal "${commandaction} ${selfname}: ${remotelocation}: Not enough disk space to download server files"
-				core_exit.sh
-			# Need tp purchase game.
-			elif [ -n "$(grep "No subscription" "${steamcmdlog}" | tail -1)" ]; then
-				fn_print_failure_nl "${commandaction} ${selfname}: ${remotelocation}: Steam account does not have a license for the required game"
-				fn_script_log_fatal "${commandaction} ${selfname}: ${remotelocation}: Steam account does not have a license for the required game"
-				core_exit.sh
-			# Two-factor authentication failure
-			elif [ -n "$(grep "Two-factor code mismatch" "${steamcmdlog}" | tail -1)" ]; then
-				fn_print_failure_nl "${commandaction} ${selfname}: ${remotelocation}: Two-factor authentication failure"
-				fn_script_log_fatal "${commandaction} ${selfname}: ${remotelocation}: Two-factor authentication failure"
-				core_exit.sh
-			# Incorrect Branch password
-			elif [ -n "$(grep "Password check for AppId" "${steamcmdlog}" | tail -1)" ]; then
-				fn_print_failure_nl "${commandaction} ${selfname}: ${remotelocation}: betapassword is incorrect"
-				fn_script_log_fatal "${commandaction} ${selfname}: ${remotelocation}: betapassword is incorrect"
-				core_exit.sh
-			# Update did not finish.
-			elif [ -n "$(grep "0x402" "${steamcmdlog}" | tail -1)" ] || [ -n "$(grep "0x602" "${steamcmdlog}" | tail -1)" ]; then
-				fn_print_error2_nl "${commandaction} ${selfname}: ${remotelocation}: Update required but not completed - check network"
-				fn_script_log_error "${commandaction} ${selfname}: ${remotelocation}: Update required but not completed - check network"
-			else
-				fn_print_error2_nl "${commandaction} ${selfname}: ${remotelocation}: Unknown error occured"
-				echo -en "Please provide content log to LinuxGSM developers https://linuxgsm.com/steamcmd-error"
-				fn_script_log_error "${commandaction} ${selfname}: ${remotelocation}: Unknown error occured"
-			fi
-		elif [ "${exitcode}" != 0 ]; then
-			fn_print_error2_nl "${commandaction} ${selfname}: ${remotelocation}: Exit code: ${exitcode}"
-			fn_script_log_error "${commandaction} ${selfname}: ${remotelocation}: Exit code: ${exitcode}"
-		else
-			fn_print_complete_nl "${commandaction} ${selfname}: ${remotelocation}"
-			fn_script_log_pass "${commandaction} ${selfname}: ${remotelocation}"
-		fi
-
-		if [ "${counter}" -gt "10" ]; then
-			fn_print_failure_nl "${commandaction} ${selfname}: ${remotelocation}: Did not complete the download, too many retrys"
-			fn_script_log_fatal "${commandaction} ${selfname}: ${remotelocation}: Did not complete the download, too many retrys"
-			core_exit.sh
-		fi
-	done
-}
-
-# Emptys contents of the LinuxGSM tmpdir.
-fn_clear_tmp() {
-	echo -en "clearing LinuxGSM tmp directory..."
-	if [ -d "${tmpdir}" ]; then
-		rm -rf "${tmpdir:?}/"*
-		local exitcode=$?
-		if [ "${exitcode}" != 0 ]; then
-			fn_print_error_eol_nl
-			fn_script_log_error "clearing LinuxGSM tmp directory"
-		else
-			fn_print_ok_eol_nl
-			fn_script_log_pass "clearing LinuxGSM tmp directory"
-		fi
-	fi
-}
-
-fn_dl_hash() {
-	# Runs Hash Check if available.
-	if [ "${hash}" != "0" ] && [ "${hash}" != "nohash" ] && [ "${hash}" != "nomd5" ]; then
-		# MD5
-		if [ "${#hash}" == "32" ]; then
-			hashbin="md5sum"
-			hashtype="MD5"
-		# SHA1
-		elif [ "${#hash}" == "40" ]; then
-			hashbin="sha1sum"
-			hashtype="SHA1"
-		# SHA256
-		elif [ "${#hash}" == "64" ]; then
-			hashbin="sha256sum"
-			hashtype="SHA256"
-		# SHA512
-		elif [ "${#hash}" == "128" ]; then
-			hashbin="sha512sum"
-			hashtype="SHA512"
-		else
-			fn_script_log_error "hash lengh not known for hash type"
-			fn_print_error_nl "hash lengh not known for hash type"
-			core_exit.sh
-		fi
-		echo -en "verifying ${local_filename} with ${hashtype}..."
-		fn_sleep_time
-		hashsumcmd=$(${hashbin} "${local_filedir}/${local_filename}" | awk '{print $1}')
-		if [ "${hashsumcmd}" != "${hash}" ]; then
-			fn_print_fail_eol_nl
-			echo -e "${local_filename} returned ${hashtype} checksum: ${hashsumcmd}"
-			echo -e "expected ${hashtype} checksum: ${hash}"
-			fn_script_log_fatal "Verifying ${local_filename} with ${hashtype}"
-			fn_script_log_info "${local_filename} returned ${hashtype} checksum: ${hashsumcmd}"
-			fn_script_log_info "Expected ${hashtype} checksum: ${hash}"
-			core_exit.sh
-		else
-			fn_print_ok_eol_nl
-			fn_script_log_pass "Verifying ${local_filename} with ${hashtype}"
-			fn_script_log_info "${local_filename} returned ${hashtype} checksum: ${hashsumcmd}"
-			fn_script_log_info "Expected ${hashtype} checksum: ${hash}"
-		fi
-	fi
-}
-
-# Extracts bzip2, gzip or zip files.
-# Extracts can be defined in code like so:
-# fn_dl_extract "${local_filedir}" "${local_filename}" "${extractdest}" "${extractsrc}"
-# fn_dl_extract "/home/gameserver/lgsm/tmp" "file.tar.bz2" "/home/gamserver/serverfiles"
-fn_dl_extract() {
-	local_filedir="${1}"
-	local_filename="${2}"
-	extractdest="${3}"
-	extractsrc="${4}"
-	# Extracts archives.
-	echo -en "extracting ${local_filename}..."
-
-	if [ ! -d "${extractdest}" ]; then
-		mkdir "${extractdest}"
-	fi
-	if [ ! -f "${local_filedir}/${local_filename}" ]; then
-		fn_print_fail_eol_nl
-		echo -en "file ${local_filedir}/${local_filename} not found"
-		fn_script_log_fatal "Extracting ${local_filename}"
-		fn_script_log_fatal "File ${local_filedir}/${local_filename} not found"
-		core_exit.sh
-	fi
-	mime=$(file -b --mime-type "${local_filedir}/${local_filename}")
-	if [ "${mime}" == "application/gzip" ] || [ "${mime}" == "application/x-gzip" ]; then
-		if [ -n "${extractsrc}" ]; then
-			extractcmd=$(tar -zxf "${local_filedir}/${local_filename}" -C "${extractdest}" --strip-components=1 "${extractsrc}")
-		else
-			extractcmd=$(tar -zxf "${local_filedir}/${local_filename}" -C "${extractdest}")
-		fi
-	elif [ "${mime}" == "application/x-bzip2" ]; then
-		if [ -n "${extractsrc}" ]; then
-			extractcmd=$(tar -jxf "${local_filedir}/${local_filename}" -C "${extractdest}" --strip-components=1 "${extractsrc}")
-		else
-			extractcmd=$(tar -jxf "${local_filedir}/${local_filename}" -C "${extractdest}")
-		fi
-	elif [ "${mime}" == "application/x-xz" ]; then
-		if [ -n "${extractsrc}" ]; then
-			extractcmd=$(tar -Jxf "${local_filedir}/${local_filename}" -C "${extractdest}" --strip-components=1 "${extractsrc}")
-		else
-			extractcmd=$(tar -Jxf "${local_filedir}/${local_filename}" -C "${extractdest}")
-		fi
-	elif [ "${mime}" == "application/zip" ]; then
-		if [ -n "${extractsrc}" ]; then
-			extractcmd=$(unzip -qoj -d "${extractdest}" "${local_filedir}/${local_filename}" "${extractsrc}"/*)
-		else
-			extractcmd=$(unzip -qo -d "${extractdest}" "${local_filedir}/${local_filename}")
-		fi
-	fi
-	local exitcode=$?
-	if [ "${exitcode}" != 0 ]; then
-		fn_print_fail_eol_nl
-		fn_script_log_fatal "Extracting ${local_filename}"
-		if [ -f "${lgsmlog}" ]; then
-			echo -e "${extractcmd}" >> "${lgsmlog}"
-		fi
-		echo -e "${extractcmd}"
-		core_exit.sh
-	else
-		fn_print_ok_eol_nl
-		fn_script_log_pass "Extracting ${local_filename}"
-	fi
-}
-
-# Trap to remove file download if canceled before completed.
-fn_fetch_trap() {
-	echo -e ""
-	echo -en "downloading ${local_filename}..."
-	fn_print_canceled_eol_nl
-	fn_script_log_info "Downloading ${local_filename}...CANCELED"
-	fn_sleep_time
-	rm -f "${local_filedir:?}/${local_filename}"
-	echo -en "downloading ${local_filename}..."
-	fn_print_removed_eol_nl
-	fn_script_log_info "Downloading ${local_filename}...REMOVED"
-	core_exit.sh
-}
-
-# Will check a file exists and download it. Will not exit if fails to download.
-fn_check_file() {
-	remote_fileurl="${1}"
-	remote_fileurl_backup="${2}"
-	remote_fileurl_name="${3}"
-	remote_fileurl_backup_name="${4}"
-	remote_filename="${5}"
-	# If backup fileurl exists include it.
-	if [ -n "${remote_fileurl_backup}" ]; then
-		# counter set to 0 to allow second try
-		counter=0
-		remote_fileurls_array=(remote_fileurl remote_fileurl_backup)
-	else
-		# counter set to 1 to not allow second try
-		counter=1
-		remote_fileurls_array=(remote_fileurl)
-	fi
-	for remote_fileurl_array in "${remote_fileurls_array[@]}"; do
-		if [ "${remote_fileurl_array}" == "remote_fileurl" ]; then
-			fileurl="${remote_fileurl}"
-			fileurl_name="${remote_fileurl_name}"
-		elif [ "${remote_fileurl_array}" == "remote_fileurl_backup" ]; then
-			fileurl="${remote_fileurl_backup}"
-			fileurl_name="${remote_fileurl_backup_name}"
-		fi
-		counter=$((counter + 1))
-		echo -en "checking ${fileurl_name} ${remote_filename}...\c"
-		curlcmd=$(curl --output /dev/null --silent --head --fail "${fileurl}" 2>&1)
-		local exitcode=$?
-
-		# On first try will error. On second try will fail.
-		if [ "${exitcode}" != 0 ]; then
-			if [ ${counter} -ge 2 ]; then
-				fn_print_fail_eol_nl
-				if [ -f "${lgsmlog}" ]; then
-					fn_script_log_fatal "Checking ${remote_filename}"
-					fn_script_log_fatal "${fileurl}"
-					checkflag=1
-				fi
-			else
-				fn_print_error_eol_nl
-				if [ -f "${lgsmlog}" ]; then
-					fn_script_log_error "Checking ${remote_filename}"
-					fn_script_log_error "${fileurl}"
-					checkflag=2
-				fi
-			fi
-		else
-			fn_print_ok_eol
-			echo -en "\033[2K\\r"
-			if [ -f "${lgsmlog}" ]; then
-				fn_script_log_pass "Checking ${remote_filename}"
-				checkflag=0
-			fi
-			break
-		fi
-	done
-
-	if [ -f "${local_filedir}/${local_filename}" ]; then
-		fn_dl_hash
-		# Execute file if run is set.
-		if [ "${run}" == "run" ]; then
-			# shellcheck source=/dev/null
-			source "${local_filedir}/${local_filename}"
-		fi
-	fi
-}
-
-fn_fetch_file() {
-	remote_fileurl="${1}"
-	remote_fileurl_backup="${2}"
-	remote_fileurl_name="${3}"
-	remote_fileurl_backup_name="${4}"
-	local_filedir="${5}"
-	local_filename="${6}"
-	chmodx="${7:-0}"
-	run="${8:-0}"
-	forcedl="${9:-0}"
-	hash="${10:-0}"
-
-	# Download file if missing or download forced.
-	if [ ! -f "${local_filedir}/${local_filename}" ] || [ "${forcedl}" == "forcedl" ]; then
-		# If backup fileurl exists include it.
-		if [ -n "${remote_fileurl_backup}" ]; then
-			# counter set to 0 to allow second try
-			counter=0
-			remote_fileurls_array=(remote_fileurl remote_fileurl_backup)
-		else
-			# counter set to 1 to not allow second try
-			counter=1
-			remote_fileurls_array=(remote_fileurl)
-		fi
-		for remote_fileurl_array in "${remote_fileurls_array[@]}"; do
-			if [ "${remote_fileurl_array}" == "remote_fileurl" ]; then
-				fileurl="${remote_fileurl}"
-				fileurl_name="${remote_fileurl_name}"
-			elif [ "${remote_fileurl_array}" == "remote_fileurl_backup" ]; then
-				fileurl="${remote_fileurl_backup}"
-				fileurl_name="${remote_fileurl_backup_name}"
-			fi
-			counter=$((counter + 1))
-			if [ ! -d "${local_filedir}" ]; then
-				mkdir -p "${local_filedir}"
-			fi
-			# Trap will remove part downloaded files if canceled.
-			trap fn_fetch_trap INT
-			curlcmd=(curl --connect-timeout 10 --fail -L -o "${local_filedir}/${local_filename}" --retry 2)
-
-			# if is large file show progress, else be silent
-			local exitcode=""
-			large_files=("bz2" "gz" "zip" "jar" "xz")
-			if grep -qE "(^|\s)${local_filename##*.}(\s|$)" <<< "${large_files[@]}"; then
-				echo -en "downloading ${local_filename}..."
-				fn_sleep_time
-				echo -en "\033[1K"
-				"${curlcmd[@]}" --progress-bar "${fileurl}" 2>&1
-				exitcode="$?"
-			else
-				echo -en "fetching ${fileurl_name} ${local_filename}...\c"
-				"${curlcmd[@]}" --silent --show-error "${fileurl}" 2>&1
-				exitcode="$?"
-			fi
-
-			# Download will fail if downloads a html file.
-			if [ -f "${local_filedir}/${local_filename}" ]; then
-				if head -n 1 "${local_filedir}/${local_filename}" | grep -q "DOCTYPE"; then
-					rm "${local_filedir:?}/${local_filename:?}"
-					local exitcode=2
-				fi
-			fi
-
-			# On first try will error. On second try will fail.
-			if [ "${exitcode}" != 0 ]; then
-				if [ ${counter} -ge 2 ]; then
-					fn_print_fail_eol_nl
-					if [ -f "${lgsmlog}" ]; then
-						fn_script_log_fatal "Downloading ${local_filename}..."
-						fn_script_log_fatal "${fileurl}"
-					fi
-					core_exit.sh
-				else
-					fn_print_error_eol_nl
-					if [ -f "${lgsmlog}" ]; then
-						fn_script_log_error "Downloading ${local_filename}..."
-						fn_script_log_error "${fileurl}"
-					fi
-				fi
-			else
-				fn_print_ok_eol_nl
-				if [ -f "${lgsmlog}" ]; then
-					fn_script_log_pass "Downloading ${local_filename}..."
-				fi
-
-				# Make file executable if chmodx is set.
-				if [ "${chmodx}" == "chmodx" ]; then
-					chmod +x "${local_filedir}/${local_filename}"
-				fi
-
-				# Remove trap.
-				trap - INT
-
-				break
-			fi
-		done
-	fi
-
-	if [ -f "${local_filedir}/${local_filename}" ]; then
-		fn_dl_hash
-		# Execute file if run is set.
-		if [ "${run}" == "run" ]; then
-			# shellcheck source=/dev/null
-			source "${local_filedir}/${local_filename}"
-		fi
-	fi
-}
-
-# GitHub file download functions.
-# Used to simplify downloading specific files from GitHub.
-
-# github_fileurl_dir: the directory of the file in the GitHub: lgsm/functions
-# github_fileurl_name: the filename of the file to download from GitHub: core_messages.sh
-# githuburl: the full GitHub url
-
-# remote_fileurl: The URL of the file: http://example.com/dl/File.tar.bz2
-# local_filedir: location the file is to be saved: /home/server/lgsm/tmp
-# local_filename: name of file (this can be different from the url name): file.tar.bz2
-# chmodx: Optional, set to "chmodx" to make file executable using chmod +x
-# run: Optional, set run to execute the file after download
-# forcedl: Optional, force re-download of file even if exists
-# hash: Optional, set an hash sum and will compare it against the file.
-
-# Fetches files from the Git repo.
-fn_fetch_file_github() {
-	github_fileurl_dir="${1}"
-	github_fileurl_name="${2}"
-	# For legacy versions - code can be removed at a future date
-	if [ "${legacymode}" == "1" ]; then
-		remote_fileurl="https://raw.githubusercontent.com/${githubuser}/${githubrepo}/${githubbranch}/${github_fileurl_dir}/${github_fileurl_name}"
-		remote_fileurl_backup="https://bitbucket.org/${githubuser}/${githubrepo}/raw/${githubbranch}/${github_fileurl_dir}/${github_fileurl_name}"
-	# If master branch will currently running LinuxGSM version to prevent "version mixing". This is ignored if a fork.
-	elif [ "${githubbranch}" == "master" ] && [ "${githubuser}" == "GameServerManager" ] && [ "${commandname}" != "UPDATE-LGSM" ]; then
-		remote_fileurl="https://raw.githubusercontent.com/${githubuser}/${githubrepo}/${version}/${github_fileurl_dir}/${github_fileurl_name}"
-		remote_fileurl_backup="https://bitbucket.org/${githubuser}/${githubrepo}/raw/${version}/${github_fileurl_dir}/${github_fileurl_name}"
-	else
-		remote_fileurl="https://raw.githubusercontent.com/${githubuser}/${githubrepo}/${githubbranch}/${github_fileurl_dir}/${github_fileurl_name}"
-		remote_fileurl_backup="https://bitbucket.org/${githubuser}/${githubrepo}/raw/${githubbranch}/${github_fileurl_dir}/${github_fileurl_name}"
-	fi
-	remote_fileurl_name="GitHub"
-	remote_fileurl_backup_name="Bitbucket"
-	local_filedir="${3}"
-	local_filename="${github_fileurl_name}"
-	chmodx="${4:-0}"
-	run="${5:-0}"
-	forcedl="${6:-0}"
-	hash="${7:-0}"
-	# Passes vars to the file download function.
-	fn_fetch_file "${remote_fileurl}" "${remote_fileurl_backup}" "${remote_fileurl_name}" "${remote_fileurl_backup_name}" "${local_filedir}" "${local_filename}" "${chmodx}" "${run}" "${forcedl}" "${hash}"
-}
-
-fn_check_file_github() {
-	github_fileurl_dir="${1}"
-	github_fileurl_name="${2}"
-	if [ "${githubbranch}" == "master" ] && [ "${githubuser}" == "GameServerManager" ] && [ "${commandname}" != "UPDATE-LGSM" ]; then
-		remote_fileurl="https://raw.githubusercontent.com/${githubuser}/${githubrepo}/${version}/${github_fileurl_dir}/${github_fileurl_name}"
-		remote_fileurl_backup="https://bitbucket.org/${githubuser}/${githubrepo}/raw/${version}/${github_fileurl_dir}/${github_fileurl_name}"
-	else
-		remote_fileurl="https://raw.githubusercontent.com/${githubuser}/${githubrepo}/${githubbranch}/${github_fileurl_dir}/${github_fileurl_name}"
-		remote_fileurl_backup="https://bitbucket.org/${githubuser}/${githubrepo}/raw/${githubbranch}/${github_fileurl_dir}/${github_fileurl_name}"
-	fi
-	remote_fileurl_name="GitHub"
-	remote_fileurl_backup_name="Bitbucket"
-	fn_check_file "${remote_fileurl}" "${remote_fileurl_backup}" "${remote_fileurl_name}" "${remote_fileurl_backup_name}" "${github_fileurl_name}"
-}
-
-# Fetches config files from the Git repo.
-fn_fetch_config() {
-	github_fileurl_dir="${1}"
-	github_fileurl_name="${2}"
-	# If master branch will currently running LinuxGSM version to prevent "version mixing". This is ignored if a fork.
-	if [ "${githubbranch}" == "master" ] && [ "${githubuser}" == "GameServerManager" ] && [ "${commandname}" != "UPDATE-LGSM" ]; then
-		remote_fileurl="https://raw.githubusercontent.com/${githubuser}/${githubrepo}/${version}/${github_fileurl_dir}/${github_fileurl_name}"
-		remote_fileurl_backup="https://bitbucket.org/${githubuser}/${githubrepo}/raw/${version}/${github_fileurl_dir}/${github_fileurl_name}"
-	else
-		remote_fileurl="https://raw.githubusercontent.com/${githubuser}/${githubrepo}/${githubbranch}/${github_fileurl_dir}/${github_fileurl_name}"
-		remote_fileurl_backup="https://bitbucket.org/${githubuser}/${githubrepo}/raw/${githubbranch}/${github_fileurl_dir}/${github_fileurl_name}"
-	fi
-	remote_fileurl_name="GitHub"
-	remote_fileurl_backup_name="Bitbucket"
-	local_filedir="${3}"
-	local_filename="${4}"
-	chmodx="nochmodx"
-	run="norun"
-	forcedl="noforce"
-	hash="nohash"
-	# Passes vars to the file download function.
-	fn_fetch_file "${remote_fileurl}" "${remote_fileurl_backup}" "${remote_fileurl_name}" "${remote_fileurl_backup_name}" "${local_filedir}" "${local_filename}" "${chmodx}" "${run}" "${forcedl}" "${hash}"
-}
-
-# Fetches modules from the Git repo during first download.
-fn_fetch_function() {
-	github_fileurl_dir="lgsm/functions"
-	github_fileurl_name="${functionfile}"
-	# If master branch will currently running LinuxGSM version to prevent "version mixing". This is ignored if a fork.
-	if [ "${githubbranch}" == "master" ] && [ "${githubuser}" == "GameServerManager" ] && [ "${commandname}" != "UPDATE-LGSM" ]; then
-		remote_fileurl="https://raw.githubusercontent.com/${githubuser}/${githubrepo}/${version}/${github_fileurl_dir}/${github_fileurl_name}"
-		remote_fileurl_backup="https://bitbucket.org/${githubuser}/${githubrepo}/raw/${version}/${github_fileurl_dir}/${github_fileurl_name}"
-	else
-		remote_fileurl="https://raw.githubusercontent.com/${githubuser}/${githubrepo}/${githubbranch}/${github_fileurl_dir}/${github_fileurl_name}"
-		remote_fileurl_backup="https://bitbucket.org/${githubuser}/${githubrepo}/raw/${githubbranch}/${github_fileurl_dir}/${github_fileurl_name}"
-	fi
-	remote_fileurl_name="GitHub"
-	remote_fileurl_backup_name="Bitbucket"
-	local_filedir="${functionsdir}"
-	local_filename="${github_fileurl_name}"
-	chmodx="chmodx"
-	run="run"
-	forcedl="noforce"
-	hash="nohash"
-	# Passes vars to the file download function.
-	fn_fetch_file "${remote_fileurl}" "${remote_fileurl_backup}" "${remote_fileurl_name}" "${remote_fileurl_backup_name}" "${local_filedir}" "${local_filename}" "${chmodx}" "${run}" "${forcedl}" "${hash}"
-}
-
-# Fetches modules from the Git repo during update-lgsm.
-fn_update_function() {
-	github_fileurl_dir="lgsm/functions"
-	github_fileurl_name="${functionfile}"
-	# If master branch will currently running LinuxGSM version to prevent "version mixing". This is ignored if a fork.
-	if [ "${githubbranch}" == "master" ] && [ "${githubuser}" == "GameServerManager" ] && [ "${commandname}" != "UPDATE-LGSM" ]; then
-		remote_fileurl="https://raw.githubusercontent.com/${githubuser}/${githubrepo}/${version}/${github_fileurl_dir}/${github_fileurl_name}"
-		remote_fileurl_backup="https://bitbucket.org/${githubuser}/${githubrepo}/raw/${version}/${github_fileurl_dir}/${github_fileurl_name}"
-	else
-		remote_fileurl="https://raw.githubusercontent.com/${githubuser}/${githubrepo}/${githubbranch}/${github_fileurl_dir}/${github_fileurl_name}"
-		remote_fileurl_backup="https://bitbucket.org/${githubuser}/${githubrepo}/raw/${githubbranch}/${github_fileurl_dir}/${github_fileurl_name}"
-	fi
-	remote_fileurl_name="GitHub"
-	remote_fileurl_backup_name="Bitbucket"
-	local_filedir="${functionsdir}"
-	local_filename="${github_fileurl_name}"
-	chmodx="chmodx"
-	run="norun"
-	forcedl="noforce"
-	hash="nohash"
-	# Passes vars to the file download function.
-	fn_fetch_file "${remote_fileurl}" "${remote_fileurl_backup}" "${remote_fileurl_name}" "${remote_fileurl_backup_name}" "${local_filedir}" "${local_filename}" "${chmodx}" "${run}" "${forcedl}" "${hash}"
-
-}
-
-# Function to download latest github release.
-# $1 GitHub user / organisation.
-# $2 Repo name.
-# $3 Destination for download.
-# $4 Search string in releases (needed if there are more files that can be downloaded from the release pages).
-fn_dl_latest_release_github() {
-	local githubreleaseuser="${1}"
-	local githubreleaserepo="${2}"
-	local githubreleasedownloadpath="${3}"
-	local githubreleasesearch="${4}"
-	local githublatestreleaseurl="https://api.github.com/repos/${githubreleaseuser}/${githubreleaserepo}/releases/latest"
-
-	# Get last github release.
-	# If no search for the release filename is set, just get the first file from the latest release.
-	if [ -z "${githubreleasesearch}" ]; then
-		githubreleaseassets=$(curl -s "${githublatestreleaseurl}" | jq '[ .assets[] ]')
-	else
-		githubreleaseassets=$(curl -s "${githublatestreleaseurl}" | jq "[ .assets[]|select(.browser_download_url | contains(\"${githubreleasesearch}\")) ]")
-	fi
-
-	# Check how many releases we got from the api and exit if we have more then one.
-	if [ "$(echo -e "${githubreleaseassets}" | jq '. | length')" -gt 1 ]; then
-		fn_print_fatal_nl "Found more than one release to download - Please report this to the LinuxGSM issue tracker"
-		fn_script_log_fatal "Found more than one release to download - Please report this to the LinuxGSM issue tracker"
-	else
-		# Set variables for download via fn_fetch_file.
-		githubreleasefilename=$(echo -e "${githubreleaseassets}" | jq -r '.[]name')
-		githubreleasedownloadlink=$(echo -e "${githubreleaseassets}" | jq -r '.[]browser_download_url')
-
-		# Error if no version is there.
-		if [ -z "${githubreleasefilename}" ]; then
-			fn_print_fail_nl "Cannot get version from GitHub API for ${githubreleaseuser}/${githubreleaserepo}"
-			fn_script_log_fatal "Cannot get version from GitHub API for ${githubreleaseuser}/${githubreleaserepo}"
-		else
-			# Fetch file from the remote location from the existing function to the ${tmpdir} for now.
-			fn_fetch_file "${githubreleasedownloadlink}" "" "${githubreleasefilename}" "" "${githubreleasedownloadpath}" "${githubreleasefilename}"
-		fi
-	fi
-}
diff --git a/lgsm/functions/core_exit.sh b/lgsm/functions/core_exit.sh
deleted file mode 100644
index 95d9d8cae..000000000
--- a/lgsm/functions/core_exit.sh
+++ /dev/null
@@ -1,61 +0,0 @@
-#!/bin/bash
-# LinuxGSM core_exit.sh module
-# Author: Daniel Gibbs
-# Contributors: http://linuxgsm.com/contrib
-# Website: https://linuxgsm.com
-# Description: Handles exiting of LinuxGSM by running and reporting an exit code.
-
-functionselfname="$(basename "$(readlink -f "${BASH_SOURCE[0]}")")"
-
-fn_exit_dev_debug() {
-	if [ -f "${rootdir}/.dev-debug" ]; then
-		echo -e ""
-		echo -e "${functionselfname} exiting with code: ${exitcode}"
-		if [ -f "${rootdir}/dev-debug.log" ]; then
-			grep "functionfile=" "${rootdir}/dev-debug.log" | sed 's/functionfile=//g' > "${rootdir}/dev-debug-function-order.log"
-		fi
-	fi
-}
-
-# If running dependency check as root will remove any files that belong to root user.
-if [ "$(whoami)" == "root" ] && [ ! -f /.dockerenv ]; then
-	find "${lgsmdir}"/ -group root -prune -exec rm -rf {} + > /dev/null 2>&1
-	find "${logdir}"/ -group root -prune -exec rm -rf {} + > /dev/null 2>&1
-fi
-
-if [ "${exitbypass}" ]; then
-	unset exitbypass
-elif [ "${exitcode}" != "0" ]; then
-	# List LinuxGSM version in logs
-	fn_script_log_info "LinuxGSM version: ${version}"
-	if [ "${exitcode}" == "1" ]; then
-		fn_script_log_fatal "${functionselfname} exiting with code: ${exitcode}"
-	elif [ "${exitcode}" == "2" ]; then
-		fn_script_log_error "${functionselfname} exiting with code: ${exitcode}"
-	elif [ "${exitcode}" == "3" ]; then
-		fn_script_log_warn "${functionselfname} exiting with code: ${exitcode}"
-	else
-		fn_script_log_warn "${functionselfname} exiting with code: ${exitcode}"
-	fi
-	fn_exit_dev_debug
-	# remove trap.
-	trap - INT
-	exit "${exitcode}"
-elif [ "${exitcode}" ] && [ "${exitcode}" == "0" ]; then
-	# List LinuxGSM version in logs
-	fn_script_log_info "LinuxGSM version: ${version}"
-	fn_script_log_pass "${functionselfname} exiting with code: ${exitcode}"
-	fn_exit_dev_debug
-	# remove trap.
-	trap - INT
-	exit "${exitcode}"
-else
-	# List LinuxGSM version in logs
-	fn_script_log_info "LinuxGSM version: ${version}"
-	fn_print_error "No exit code set"
-	fn_script_log_pass "${functionselfname} exiting with code: NOT SET"
-	fn_exit_dev_debug
-	# remove trap.
-	trap - INT
-	exit "${exitcode}"
-fi
diff --git a/lgsm/functions/core_functions.sh b/lgsm/functions/core_functions.sh
deleted file mode 100644
index b301b7e46..000000000
--- a/lgsm/functions/core_functions.sh
+++ /dev/null
@@ -1,816 +0,0 @@
-#!/bin/bash
-# LinuxGSM core_functions.sh module
-# Author: Daniel Gibbs
-# Contributors: http://linuxgsm.com/contrib
-# Website: https://linuxgsm.com
-# Description: Defines all functions to allow download and execution of functions using fn_fetch_function.
-# This function is called first before any other function. Without this file other functions will not load.
-
-functionselfname="$(basename "$(readlink -f "${BASH_SOURCE[0]}")")"
-
-modulesversion="v23.2.3"
-
-# Core
-
-core_dl.sh() {
-	functionfile="${FUNCNAME[0]}"
-	if [ "$(type fn_fetch_core_dl 2> /dev/null)" ]; then
-		fn_fetch_core_dl "lgsm/functions" "core_dl.sh" "${functionsdir}" "chmodx" "run" "noforcedl" "nohash"
-	else
-		fn_bootstrap_fetch_file_github "lgsm/functions" "core_dl.sh" "${functionsdir}" "chmodx" "run" "noforcedl" "nohash"
-	fi
-}
-
-core_messages.sh() {
-	functionfile="${FUNCNAME[0]}"
-	if [ "$(type fn_fetch_core_dl 2> /dev/null)" ]; then
-		fn_fetch_core_dl "lgsm/functions" "core_messages.sh" "${functionsdir}" "chmodx" "run" "noforcedl" "nohash"
-	else
-		fn_bootstrap_fetch_file_github "lgsm/functions" "core_messages.sh" "${functionsdir}" "chmodx" "run" "noforcedl" "nohash"
-	fi
-}
-
-core_legacy.sh() {
-	functionfile="${FUNCNAME[0]}"
-	if [ "$(type fn_fetch_core_dl 2> /dev/null)" ]; then
-		fn_fetch_core_dl "lgsm/functions" "core_legacy.sh" "${functionsdir}" "chmodx" "run" "noforcedl" "nohash"
-	else
-		fn_bootstrap_fetch_file_github "lgsm/functions" "core_legacy.sh" "${functionsdir}" "chmodx" "run" "noforcedl" "nohash"
-	fi
-}
-
-core_exit.sh() {
-	functionfile="${FUNCNAME[0]}"
-	fn_fetch_function
-}
-
-core_getopt.sh() {
-	functionfile="${FUNCNAME[0]}"
-	fn_fetch_function
-}
-
-core_trap.sh() {
-	functionfile="${FUNCNAME[0]}"
-	fn_fetch_function
-}
-
-core_steamcmd.sh() {
-	functionfile="${FUNCNAME[0]}"
-	fn_fetch_function
-}
-
-core_github.sh() {
-	functionfile="${FUNCNAME[0]}"
-	fn_fetch_function
-}
-
-# Commands
-
-command_backup.sh() {
-	functionfile="${FUNCNAME[0]}"
-	fn_fetch_function
-}
-
-command_console.sh() {
-	functionfile="${FUNCNAME[0]}"
-	fn_fetch_function
-}
-
-command_debug.sh() {
-	functionfile="${FUNCNAME[0]}"
-	fn_fetch_function
-}
-
-command_details.sh() {
-	functionfile="${FUNCNAME[0]}"
-	fn_fetch_function
-}
-
-command_donate.sh() {
-	functionfile="${FUNCNAME[0]}"
-	fn_fetch_function
-}
-
-command_postdetails.sh() {
-	functionfile="${FUNCNAME[0]}"
-	fn_fetch_function
-}
-
-command_test_alert.sh() {
-	functionfile="${FUNCNAME[0]}"
-	fn_fetch_function
-}
-
-command_monitor.sh() {
-	functionfile="${FUNCNAME[0]}"
-	fn_fetch_function
-}
-
-command_start.sh() {
-	functionfile="${FUNCNAME[0]}"
-	fn_fetch_function
-}
-
-command_stop.sh() {
-	functionfile="${FUNCNAME[0]}"
-	fn_fetch_function
-}
-
-command_validate.sh() {
-	functionfile="${FUNCNAME[0]}"
-	fn_fetch_function
-}
-
-command_install.sh() {
-	functionfile="${FUNCNAME[0]}"
-	fn_fetch_function
-}
-
-command_install_resources_mta.sh() {
-	functionfile="${FUNCNAME[0]}"
-	fn_fetch_function
-}
-
-install_squad_license.sh() {
-	functionfile="${FUNCNAME[0]}"
-	fn_fetch_function
-}
-
-command_mods_install.sh() {
-	functionfile="${FUNCNAME[0]}"
-	fn_fetch_function
-}
-
-command_mods_update.sh() {
-	functionfile="${FUNCNAME[0]}"
-	fn_fetch_function
-}
-
-command_mods_remove.sh() {
-	functionfile="${FUNCNAME[0]}"
-	fn_fetch_function
-}
-
-command_fastdl.sh() {
-	functionfile="${FUNCNAME[0]}"
-	fn_fetch_function
-}
-
-command_ts3_server_pass.sh() {
-	functionfile="${FUNCNAME[0]}"
-	fn_fetch_function
-}
-
-command_restart.sh() {
-	functionfile="${FUNCNAME[0]}"
-	fn_fetch_function
-}
-
-command_skeleton.sh() {
-	functionfile="${FUNCNAME[0]}"
-	fn_fetch_function
-}
-
-command_wipe.sh() {
-	functionfile="${FUNCNAME[0]}"
-	fn_fetch_function
-}
-
-command_send.sh() {
-	functionfile="${FUNCNAME[0]}"
-	fn_fetch_function
-}
-
-# Checks
-
-check.sh() {
-	functionfile="${FUNCNAME[0]}"
-	fn_fetch_function
-}
-
-check_config.sh() {
-	functionfile="${FUNCNAME[0]}"
-	fn_fetch_function
-}
-
-check_deps.sh() {
-	functionfile="${FUNCNAME[0]}"
-	fn_fetch_function
-}
-
-check_executable.sh() {
-	functionfile="${FUNCNAME[0]}"
-	fn_fetch_function
-}
-
-check_glibc.sh() {
-	functionfile="${FUNCNAME[0]}"
-	fn_fetch_function
-}
-
-check_ip.sh() {
-	functionfile="${FUNCNAME[0]}"
-	fn_fetch_function
-}
-
-check_last_update.sh() {
-	functionfile="${FUNCNAME[0]}"
-	fn_fetch_function
-}
-
-check_logs.sh() {
-	functionfile="${FUNCNAME[0]}"
-	fn_fetch_function
-}
-
-check_permissions.sh() {
-	functionfile="${FUNCNAME[0]}"
-	fn_fetch_function
-}
-
-check_root.sh() {
-	functionfile="${FUNCNAME[0]}"
-	fn_fetch_function
-}
-
-check_status.sh() {
-	functionfile="${FUNCNAME[0]}"
-	fn_fetch_function
-}
-
-check_steamcmd.sh() {
-	functionfile="${FUNCNAME[0]}"
-	fn_fetch_function
-}
-
-check_system_dir.sh() {
-	functionfile="${FUNCNAME[0]}"
-	fn_fetch_function
-}
-
-check_system_requirements.sh() {
-	functionfile="${FUNCNAME[0]}"
-	fn_fetch_function
-}
-
-check_tmuxception.sh() {
-	functionfile="${FUNCNAME[0]}"
-	fn_fetch_function
-}
-
-check_version.sh() {
-	functionfile="${FUNCNAME[0]}"
-	fn_fetch_function
-}
-
-# Compress
-
-compress_unreal2_maps.sh() {
-	functionfile="${FUNCNAME[0]}"
-	fn_fetch_function
-}
-
-compress_ut99_maps.sh() {
-	functionfile="${FUNCNAME[0]}"
-	fn_fetch_function
-}
-
-# Mods
-
-mods_list.sh() {
-	functionfile="${FUNCNAME[0]}"
-	fn_fetch_function
-}
-
-mods_core.sh() {
-	functionfile="${FUNCNAME[0]}"
-	fn_fetch_function
-}
-
-# Dev
-
-command_dev_clear_functions.sh() {
-	functionfile="${FUNCNAME[0]}"
-	fn_fetch_function
-}
-
-command_dev_debug.sh() {
-	functionfile="${FUNCNAME[0]}"
-	fn_fetch_function
-}
-
-command_dev_detect_deps.sh() {
-	functionfile="${FUNCNAME[0]}"
-	fn_fetch_function
-}
-
-command_dev_detect_glibc.sh() {
-	functionfile="${FUNCNAME[0]}"
-	fn_fetch_function
-}
-
-command_dev_detect_ldd.sh() {
-	functionfile="${FUNCNAME[0]}"
-	fn_fetch_function
-}
-
-command_dev_query_raw.sh() {
-	functionfile="${FUNCNAME[0]}"
-	fn_fetch_function
-}
-
-# Fix
-
-fix.sh() {
-	functionfile="${FUNCNAME[0]}"
-	fn_fetch_function
-}
-
-fix_ark.sh() {
-	functionfile="${FUNCNAME[0]}"
-	fn_fetch_function
-}
-
-fix_av.sh() {
-	functionfile="${FUNCNAME[0]}"
-	fn_fetch_function
-}
-
-fix_arma3.sh() {
-	functionfile="${FUNCNAME[0]}"
-	fn_fetch_function
-}
-
-fix_armar.sh() {
-	functionfile="${FUNCNAME[0]}"
-	fn_fetch_function
-}
-
-fix_bt.sh() {
-	functionfile="${FUNCNAME[0]}"
-	fn_fetch_function
-}
-
-fix_bo.sh() {
-	functionfile="${FUNCNAME[0]}"
-	fn_fetch_function
-}
-
-fix_cmw.sh() {
-	functionfile="${FUNCNAME[0]}"
-	fn_fetch_function
-}
-
-fix_csgo.sh() {
-	functionfile="${FUNCNAME[0]}"
-	fn_fetch_function
-}
-
-fix_dst.sh() {
-	functionfile="${FUNCNAME[0]}"
-	fn_fetch_function
-}
-
-fix_hw.sh() {
-	functionfile="${FUNCNAME[0]}"
-	fn_fetch_function
-}
-
-fix_ins.sh() {
-	functionfile="${FUNCNAME[0]}"
-	fn_fetch_function
-}
-
-fix_kf.sh() {
-	functionfile="${FUNCNAME[0]}"
-	fn_fetch_function
-}
-
-fix_kf2.sh() {
-	functionfile="${FUNCNAME[0]}"
-	fn_fetch_function
-}
-
-fix_lo.sh() {
-	functionfile="${FUNCNAME[0]}"
-	fn_fetch_function
-}
-
-fix_mcb.sh() {
-	functionfile="${FUNCNAME[0]}"
-	fn_fetch_function
-}
-
-fix_mta.sh() {
-	functionfile="${FUNCNAME[0]}"
-	fn_fetch_function
-}
-
-fix_nmrih.sh() {
-	functionfile="${FUNCNAME[0]}"
-	fn_fetch_function
-}
-
-fix_onset.sh() {
-	functionfile="${FUNCNAME[0]}"
-	fn_fetch_function
-}
-
-fix_ro.sh() {
-	functionfile="${FUNCNAME[0]}"
-	fn_fetch_function
-}
-
-fix_rust.sh() {
-	functionfile="${FUNCNAME[0]}"
-	fn_fetch_function
-}
-
-fix_rw.sh() {
-	functionfile="${FUNCNAME[0]}"
-	fn_fetch_function
-}
-
-fix_sfc.sh() {
-	functionfile="${FUNCNAME[0]}"
-	fn_fetch_function
-}
-
-fix_st.sh() {
-	functionfile="${FUNCNAME[0]}"
-	fn_fetch_function
-}
-
-fix_steamcmd.sh() {
-	functionfile="${FUNCNAME[0]}"
-	fn_fetch_function
-}
-
-fix_terraria.sh() {
-	functionfile="${FUNCNAME[0]}"
-	fn_fetch_function
-}
-
-fix_tf2.sh() {
-	functionfile="${FUNCNAME[0]}"
-	fn_fetch_function
-}
-
-fix_ut3.sh() {
-	functionfile="${FUNCNAME[0]}"
-	fn_fetch_function
-}
-
-fix_rust.sh() {
-	functionfile="${FUNCNAME[0]}"
-	fn_fetch_function
-}
-
-fix_samp.sh() {
-	functionfile="${FUNCNAME[0]}"
-	fn_fetch_function
-}
-
-fix_sdtd.sh() {
-	functionfile="${FUNCNAME[0]}"
-	fn_fetch_function
-}
-
-fix_sof2.sh() {
-	functionfile="${FUNCNAME[0]}"
-	fn_fetch_function
-}
-
-fix_squad.sh() {
-	functionfile="${FUNCNAME[0]}"
-	fn_fetch_function
-}
-
-fix_ts3.sh() {
-	functionfile="${FUNCNAME[0]}"
-	fn_fetch_function
-}
-
-fix_ut2k4.sh() {
-	functionfile="${FUNCNAME[0]}"
-	fn_fetch_function
-}
-
-fix_ut.sh() {
-	functionfile="${FUNCNAME[0]}"
-	fn_fetch_function
-}
-
-fix_unt.sh() {
-	functionfile="${FUNCNAME[0]}"
-	fn_fetch_function
-}
-
-fix_vh.sh() {
-	functionfile="${FUNCNAME[0]}"
-	fn_fetch_function
-}
-
-fix_wurm.sh() {
-	functionfile="${FUNCNAME[0]}"
-	fn_fetch_function
-}
-
-fix_zmr.sh() {
-	functionfile="${FUNCNAME[0]}"
-	fn_fetch_function
-}
-
-# Info
-
-info_distro.sh() {
-	functionfile="${FUNCNAME[0]}"
-	fn_fetch_function
-}
-
-info_game.sh() {
-	functionfile="${FUNCNAME[0]}"
-	fn_fetch_function
-}
-
-info_messages.sh() {
-	functionfile="${FUNCNAME[0]}"
-	fn_fetch_function
-}
-
-info_stats.sh() {
-	functionfile="${FUNCNAME[0]}"
-	fn_fetch_function
-}
-
-# Alert
-
-alert.sh() {
-	functionfile="${FUNCNAME[0]}"
-	fn_fetch_function
-}
-
-alert_discord.sh() {
-	functionfile="${FUNCNAME[0]}"
-	fn_fetch_function
-}
-
-alert_email.sh() {
-	functionfile="${FUNCNAME[0]}"
-	fn_fetch_function
-}
-
-alert_ifttt.sh() {
-	functionfile="${FUNCNAME[0]}"
-	fn_fetch_function
-}
-
-alert_mailgun.sh() {
-	functionfile="${FUNCNAME[0]}"
-	fn_fetch_function
-}
-
-alert_pushbullet.sh() {
-	functionfile="${FUNCNAME[0]}"
-	fn_fetch_function
-}
-
-alert_pushover.sh() {
-	functionfile="${FUNCNAME[0]}"
-	fn_fetch_function
-}
-
-alert_gotify.sh() {
-	functionfile="${FUNCNAME[0]}"
-	fn_fetch_function
-}
-
-alert_telegram.sh() {
-	functionfile="${FUNCNAME[0]}"
-	fn_fetch_function
-}
-
-alert_rocketchat.sh() {
-	functionfile="${FUNCNAME[0]}"
-	fn_fetch_function
-}
-
-alert_slack.sh() {
-	functionfile="${FUNCNAME[0]}"
-	fn_fetch_function
-}
-# Logs
-
-core_logs.sh() {
-	functionfile="${FUNCNAME[0]}"
-	fn_fetch_function
-}
-
-# Query
-
-query_gamedig.sh() {
-	functionfile="${FUNCNAME[0]}"
-	fn_fetch_function
-}
-
-# Update
-
-command_update_functions.sh() {
-	functionfile="${FUNCNAME[0]}"
-	fn_fetch_function
-}
-
-command_update_linuxgsm.sh() {
-	functionfile="${FUNCNAME[0]}"
-	fn_fetch_function
-}
-
-command_update.sh() {
-	functionfile="${FUNCNAME[0]}"
-	fn_fetch_function
-}
-
-command_check_update.sh() {
-	functionfile="${FUNCNAME[0]}"
-	fn_fetch_function
-}
-
-update_ts3.sh() {
-	functionfile="${FUNCNAME[0]}"
-	fn_fetch_function
-}
-
-update_minecraft.sh() {
-	functionfile="${FUNCNAME[0]}"
-	fn_fetch_function
-}
-
-update_minecraft_bedrock.sh() {
-	functionfile="${FUNCNAME[0]}"
-	fn_fetch_function
-}
-
-update_papermc.sh() {
-	functionfile="${FUNCNAME[0]}"
-	fn_fetch_function
-}
-
-update_mta.sh() {
-	functionfile="${FUNCNAME[0]}"
-	fn_fetch_function
-}
-
-update_factorio.sh() {
-	functionfile="${FUNCNAME[0]}"
-	fn_fetch_function
-}
-
-update_jediknight2.sh() {
-	functionfile="${FUNCNAME[0]}"
-	fn_fetch_function
-}
-
-update_steamcmd.sh() {
-	functionfile="${FUNCNAME[0]}"
-	fn_fetch_function
-}
-
-update_vintagestory.sh() {
-	functionfile="${FUNCNAME[0]}"
-	fn_fetch_function
-}
-
-update_ut99.sh() {
-	functionfile="${FUNCNAME[0]}"
-	fn_fetch_function
-}
-
-fn_update_functions.sh() {
-	functionfile="${FUNCNAME[0]}"
-	fn_fetch_function
-}
-
-#
-## Installer functions
-#
-
-fn_autoinstall() {
-	autoinstall=1
-	command_install.sh
-}
-
-install_complete.sh() {
-	functionfile="${FUNCNAME[0]}"
-	fn_fetch_function
-}
-
-install_config.sh() {
-	functionfile="${FUNCNAME[0]}"
-	fn_fetch_function
-}
-
-install_factorio_save.sh() {
-	functionfile="${FUNCNAME[0]}"
-	fn_fetch_function
-}
-
-install_dst_token.sh() {
-	functionfile="${FUNCNAME[0]}"
-	fn_fetch_function
-}
-
-install_eula.sh() {
-	functionfile="${FUNCNAME[0]}"
-	fn_fetch_function
-}
-
-install_gsquery.sh() {
-	functionfile="${FUNCNAME[0]}"
-	fn_fetch_function
-}
-
-install_gslt.sh() {
-	functionfile="${FUNCNAME[0]}"
-	fn_fetch_function
-}
-
-install_header.sh() {
-	functionfile="${FUNCNAME[0]}"
-	fn_fetch_function
-}
-
-install_logs.sh() {
-	functionfile="${FUNCNAME[0]}"
-	fn_fetch_function
-}
-
-install_retry.sh() {
-	functionfile="${FUNCNAME[0]}"
-	fn_fetch_function
-}
-
-install_server_dir.sh() {
-	functionfile="${FUNCNAME[0]}"
-	fn_fetch_function
-}
-install_server_files.sh() {
-	functionfile="${FUNCNAME[0]}"
-	fn_fetch_function
-}
-
-install_stats.sh() {
-	functionfile="${FUNCNAME[0]}"
-	fn_fetch_function
-}
-
-install_steamcmd.sh() {
-	functionfile="${FUNCNAME[0]}"
-	fn_fetch_function
-}
-
-install_ts3.sh() {
-	functionfile="${FUNCNAME[0]}"
-	fn_fetch_function
-}
-
-install_ts3db.sh() {
-	functionfile="${FUNCNAME[0]}"
-	fn_fetch_function
-}
-
-install_ut2k4.sh() {
-	functionfile="${FUNCNAME[0]}"
-	fn_fetch_function
-}
-
-install_dl_ut2k4.sh() {
-	functionfile="${FUNCNAME[0]}"
-	fn_fetch_function
-}
-
-install_ut2k4_key.sh() {
-	functionfile="${FUNCNAME[0]}"
-	fn_fetch_function
-}
-
-# Calls code required for legacy servers
-core_legacy.sh
-
-# Creates tmp dir if missing
-if [ ! -d "${tmpdir}" ]; then
-	mkdir -p "${tmpdir}"
-fi
-
-# Creates lock dir if missing
-if [ ! -d "${lockdir}" ]; then
-	mkdir -p "${lockdir}"
-fi
-
-# Calls on-screen messages (bootstrap)
-core_messages.sh
-
-#Calls file downloader (bootstrap)
-core_dl.sh
-
-# Calls the global Ctrl-C trap
-core_trap.sh
diff --git a/lgsm/functions/core_getopt.sh b/lgsm/functions/core_getopt.sh
deleted file mode 100644
index 808fe2e2a..000000000
--- a/lgsm/functions/core_getopt.sh
+++ /dev/null
@@ -1,215 +0,0 @@
-#!/bin/bash
-# LinuxGSM core_getopt.sh module
-# Author: Daniel Gibbs
-# Contributors: http://linuxgsm.com/contrib
-# Website: https://linuxgsm.com
-# Description: getopt arguments.
-
-functionselfname="$(basename "$(readlink -f "${BASH_SOURCE[0]}")")"
-
-### Define all commands here.
-## User commands | Trigger commands | Description
-# Standard commands.
-cmd_install=("i;install" "command_install.sh" "Install the server.")
-cmd_auto_install=("ai;auto-install" "fn_autoinstall" "Install the server without prompts.")
-cmd_start=("st;start" "command_start.sh" "Start the server.")
-cmd_stop=("sp;stop" "command_stop.sh" "Stop the server.")
-cmd_restart=("r;restart" "command_restart.sh" "Restart the server.")
-cmd_details=("dt;details" "command_details.sh" "Display server information.")
-cmd_postdetails=("pd;postdetails" "command_postdetails.sh" "Post details to termbin.com (removing passwords).")
-cmd_backup=("b;backup" "command_backup.sh" "Create backup archives of the server.")
-cmd_update_linuxgsm=("ul;update-lgsm;uf;update-functions" "command_update_linuxgsm.sh" "Check and apply any LinuxGSM updates.")
-cmd_test_alert=("ta;test-alert" "command_test_alert.sh" "Send a test alert.")
-cmd_monitor=("m;monitor" "command_monitor.sh" "Check server status and restart if crashed.")
-cmd_skeleton=("sk;skeleton" "command_skeleton.sh" "Create a skeleton directory.")
-cmd_donate=("do;donate" "command_donate.sh" "Donation options.")
-cmd_send=("sd;send" "command_send.sh" "Send command to game server console.")
-# Console servers only.
-cmd_console=("c;console" "command_console.sh" "Access server console.")
-cmd_debug=("d;debug" "command_debug.sh" "Start server directly in your terminal.")
-# Update servers only.
-cmd_update=("u;update" "command_update.sh" "Check and apply any server updates.")
-cmd_check_update=("cu;check-update" "command_check_update.sh" "Check if a gameserver update is available")
-cmd_force_update=("fu;force-update;update-restart;ur" "forceupdate=1; command_update.sh" "Apply server updates bypassing check.")
-# SteamCMD servers only.
-cmd_validate=("v;validate" "command_validate.sh" "Validate server files with SteamCMD.")
-# Server with mods-install.
-cmd_mods_install=("mi;mods-install" "command_mods_install.sh" "View and install available mods/addons.")
-cmd_mods_remove=("mr;mods-remove" "command_mods_remove.sh" "View and remove an installed mod/addon.")
-cmd_mods_update=("mu;mods-update" "command_mods_update.sh" "Update installed mods/addons.")
-# Server specific.
-cmd_change_password=("pw;change-password" "command_ts3_server_pass.sh" "Change TS3 serveradmin password.")
-cmd_install_default_resources=("ir;install-default-resources" "command_install_resources_mta.sh" "Install the MTA default resources.")
-cmd_fullwipe=("fw;full-wipe;wa;wipeall" "serverwipe=1; command_wipe.sh" "Reset the map and remove blueprint data.")
-cmd_mapwipe=("mw;map-wipe;w;wipe;wi" "mapwipe=1; command_wipe.sh" "Reset the map and keep blueprint data.")
-cmd_map_compressor_u99=("mc;map-compressor" "compress_ut99_maps.sh" "Compresses all ${gamename} server maps.")
-cmd_map_compressor_u2=("mc;map-compressor" "compress_unreal2_maps.sh" "Compresses all ${gamename} server maps.")
-cmd_install_cdkey=("cd;server-cd-key" "install_ut2k4_key.sh" "Add your server cd key.")
-cmd_install_dst_token=("ct;cluster-token" "install_dst_token.sh" "Configure cluster token.")
-cmd_install_squad_license=("li;license" "install_squad_license.sh" "Add your Squad server license.")
-cmd_fastdl=("fd;fastdl" "command_fastdl.sh" "Build a FastDL directory.")
-# Dev commands.
-cmd_dev_debug=("dev;developer" "command_dev_debug.sh" "Enable developer Mode.")
-cmd_dev_detect_deps=("dd;detect-deps" "command_dev_detect_deps.sh" "Detect required dependencies.")
-cmd_dev_detect_glibc=("dg;detect-glibc" "command_dev_detect_glibc.sh" "Detect required glibc.")
-cmd_dev_detect_ldd=("dl;detect-ldd" "command_dev_detect_ldd.sh" "Detect required dynamic dependencies.")
-cmd_dev_query_raw=("qr;query-raw" "command_dev_query_raw.sh" "The raw output of gamedig and gsquery.")
-cmd_dev_clear_functions=("cf;clear-functions" "command_dev_clear_functions.sh" "Delete the contents of the functions dir.")
-
-### Set specific opt here.
-
-currentopt=("${cmd_start[@]}" "${cmd_stop[@]}" "${cmd_restart[@]}" "${cmd_monitor[@]}" "${cmd_test_alert[@]}" "${cmd_details[@]}" "${cmd_postdetails[@]}" "${cmd_skeleton[@]}")
-
-# Update LinuxGSM.
-currentopt+=("${cmd_update_linuxgsm[@]}")
-
-# Exclude noupdate games here.
-if [ "${shortname}" == "jk2" ] || [ "${engine}" != "idtech3" ]; then
-	if [ "${shortname}" != "bf1942" ] && [ "${shortname}" != "bfv" ] && [ "${engine}" != "idtech2" ] && [ "${engine}" != "iw2.0" ] && [ "${engine}" != "iw3.0" ] && [ "${engine}" != "quake" ] && [ "${shortname}" != "samp" ] && [ "${shortname}" != "ut2k4" ]; then
-		currentopt+=("${cmd_update[@]}" "${cmd_check_update[@]}")
-		# force update for SteamCMD or Multi Theft Auto only.
-		if [ "${appid}" ] || [ "${shortname}" == "mta" ]; then
-			currentopt+=("${cmd_force_update[@]}")
-		fi
-	fi
-fi
-
-# Validate and check-update command.
-if [ "${appid}" ]; then
-	currentopt+=("${cmd_validate[@]}")
-fi
-
-# Backup.
-currentopt+=("${cmd_backup[@]}")
-
-# Console & Debug.
-currentopt+=("${cmd_console[@]}" "${cmd_debug[@]}")
-
-# Console send.
-if [ "${consoleinteract}" == "yes" ]; then
-	currentopt+=("${cmd_send[@]}")
-fi
-
-## Game server exclusive commands.
-
-# FastDL command.
-if [ "${engine}" == "source" ]; then
-	currentopt+=("${cmd_fastdl[@]}")
-fi
-
-# TeamSpeak exclusive.
-if [ "${shortname}" == "ts3" ]; then
-	currentopt+=("${cmd_change_password[@]}")
-fi
-
-# Rust exclusive.
-if [ "${shortname}" == "rust" ]; then
-	currentopt+=("${cmd_fullwipe[@]}" "${cmd_mapwipe[@]}")
-fi
-
-# Unreal exclusive.
-if [ "${engine}" == "unreal2" ]; then
-	if [ "${shortname}" == "ut2k4" ]; then
-		currentopt+=("${cmd_install_cdkey[@]}" "${cmd_map_compressor_u2[@]}")
-	else
-		currentopt+=("${cmd_map_compressor_u2[@]}")
-	fi
-fi
-if [ "${engine}" == "unreal" ]; then
-	currentopt+=("${cmd_map_compressor_u99[@]}")
-fi
-
-# DST exclusive.
-if [ "${shortname}" == "dst" ]; then
-	currentopt+=("${cmd_install_dst_token[@]}")
-fi
-
-# MTA exclusive.
-if [ "${shortname}" == "mta" ]; then
-	currentopt+=("${cmd_install_default_resources[@]}")
-fi
-
-# Squad license exclusive.
-if [ "${shortname}" == "squad" ]; then
-	currentopt+=("${cmd_install_squad_license[@]}")
-fi
-
-## Mods commands.
-if [ "${engine}" == "source" ] || [ "${shortname}" == "rust" ] || [ "${shortname}" == "hq" ] || [ "${shortname}" == "sdtd" ] || [ "${shortname}" == "cs" ] || [ "${shortname}" == "dod" ] || [ "${shortname}" == "tfc" ] || [ "${shortname}" == "ns" ] || [ "${shortname}" == "ts" ] || [ "${shortname}" == "hldm" ] || [ "${shortname}" == "vh" ]; then
-	currentopt+=("${cmd_mods_install[@]}" "${cmd_mods_remove[@]}" "${cmd_mods_update[@]}")
-fi
-
-## Installer.
-currentopt+=("${cmd_install[@]}" "${cmd_auto_install[@]}")
-
-## Developer commands.
-currentopt+=("${cmd_dev_debug[@]}")
-if [ -f ".dev-debug" ]; then
-	currentopt+=("${cmd_dev_detect_deps[@]}" "${cmd_dev_detect_glibc[@]}" "${cmd_dev_detect_ldd[@]}" "${cmd_dev_query_raw[@]}" "${cmd_dev_clear_functions[@]}")
-fi
-
-## Donate.
-currentopt+=("${cmd_donate[@]}")
-
-### Build list of available commands.
-optcommands=()
-index="0"
-for ((index = "0"; index < ${#currentopt[@]}; index += 3)); do
-	cmdamount=$(echo -e "${currentopt[index]}" | awk -F ';' '{ print NF }')
-	for ((cmdindex = 1; cmdindex <= cmdamount; cmdindex++)); do
-		optcommands+=("$(echo -e "${currentopt[index]}" | awk -F ';' -v x=${cmdindex} '{ print $x }')")
-	done
-done
-
-# Shows LinuxGSM usage.
-fn_opt_usage() {
-	echo -e "Usage: $0 [option]"
-	echo -e ""
-	echo -e "LinuxGSM - ${gamename} - Version ${version}"
-	echo -e "https://linuxgsm.com/${gameservername}"
-	echo -e ""
-	echo -e "${lightyellow}Commands${default}"
-	# Display available commands.
-	index="0"
-	{
-		for ((index = "0"; index < ${#currentopt[@]}; index += 3)); do
-			# Hide developer commands.
-			if [ "${currentopt[index + 2]}" != "DEVCOMMAND" ]; then
-				echo -e "${cyan}$(echo -e "${currentopt[index]}" | awk -F ';' '{ print $2 }')\t${default}$(echo -e "${currentopt[index]}" | awk -F ';' '{ print $1 }')\t| ${currentopt[index + 2]}"
-			fi
-		done
-	} | column -s $'\t' -t
-	fn_script_log_pass "Display commands"
-	core_exit.sh
-}
-
-# Check if command existw and run corresponding scripts, or display script usage.
-if [ -z "${getopt}" ]; then
-	fn_opt_usage
-fi
-# If command exists.
-for i in "${optcommands[@]}"; do
-	if [ "${i}" == "${getopt}" ]; then
-		# Seek and run command.
-		index="0"
-		for ((index = "0"; index < ${#currentopt[@]}; index += 3)); do
-			currcmdamount=$(echo -e "${currentopt[index]}" | awk -F ';' '{ print NF }')
-			for ((currcmdindex = 1; currcmdindex <= currcmdamount; currcmdindex++)); do
-				if [ "$(echo -e "${currentopt[index]}" | awk -F ';' -v x=${currcmdindex} '{ print $x }')" == "${getopt}" ]; then
-					# Run command.
-					eval "${currentopt[index + 1]}"
-					# Exit should occur in modules. Should this not happen print an error
-					fn_print_error2_nl "Command did not exit correctly: ${getopt}"
-					fn_script_log_error "Command did not exit correctly: ${getopt}"
-					core_exit.sh
-				fi
-			done
-		done
-	fi
-done
-
-# If we're executing this, it means command was not found.
-fn_print_error2_nl "Unknown command: $0 ${getopt}"
-fn_script_log_error "Unknown command: $0 ${getopt}"
-fn_opt_usage
-core_exit.sh
diff --git a/lgsm/functions/core_github.sh b/lgsm/functions/core_github.sh
deleted file mode 100644
index 0462e65bf..000000000
--- a/lgsm/functions/core_github.sh
+++ /dev/null
@@ -1,114 +0,0 @@
-#!/bin/bash
-# LinuxGSM core_github.sh function
-# Author: Daniel Gibbs
-# Contributors: http://linuxgsm.com/contrib
-# Website: https://linuxgsm.com
-# Description: core function file for updates via github
-
-functionselfname="$(basename "$(readlink -f "${BASH_SOURCE[0]}")")"
-
-github_api="https://api.github.com"
-
-fn_githublocalversionfile() {
-	local githubreleaseuser="${1}"
-	local githubreleaserepo="${2}"
-
-	githublocalversionfile="${datadir}/github-${githubreleaseuser}-${githubreleaserepo}-version"
-}
-
-# $1 githubuser/group
-# $2 github repo name
-fn_github_get_latest_release_version() {
-	local githubreleaseuser="${1}"
-	local githubreleaserepo="${2}"
-	local githublatestreleaseurl="${github_api}/repos/${githubreleaseuser}/${githubreleaserepo}/releases/latest"
-
-	githubreleaseversion=$(curl -s --connect-timeout 10 "${githublatestreleaseurl}" | jq '.tag_name')
-
-	# error if no version is there
-	if [ -z "${githubreleaseversion}" ]; then
-		fn_print_fail_nl "Cannot get version from GitHub API for ${githubreleaseuser}/${githubreleaserepo}"
-		fn_script_log_fatal "Cannot get version from GitHub API for ${githubreleaseuser}/${githubreleaserepo}"
-	fi
-}
-
-# $1 githubuser/group
-# $2 github repo name
-fn_github_set_latest_release_version() {
-	local githubreleaseuser="${1}"
-	local githubreleaserepo="${2}"
-
-	fn_githublocalversionfile "${githubreleaseuser}" "${githubreleaserepo}"
-
-	local githublatestreleaseurl="${github_api}/repos/${githubreleaseuser}/${githubreleaserepo}/releases/latest"
-	githubreleaseversion=$(curl -s "${githublatestreleaseurl}" | jq -r '.tag_name')
-
-	# error if no version is there
-	if [ -z "${githubreleaseversion}" ]; then
-		fn_print_fail_nl "Cannot get version from GitHub API for ${githubreleaseuser}/${githubreleaserepo}"
-		fn_script_log_fatal "Cannot get version from GitHub API for ${githubreleaseuser}/${githubreleaserepo}"
-	else
-		echo "${githubreleaseversion}" > "${githublocalversionfile}"
-	fi
-}
-
-# $1 githubuser/group
-# $2 github repo name
-fn_github_get_installed_version() {
-	local githubreleaseuser="${1}"
-	local githubreleaserepo="${2}"
-
-	fn_githublocalversionfile "${githubreleaseuser}" "${githubreleaserepo}"
-
-	githublocalversion=$(cat "${githublocalversionfile}")
-}
-
-# $1 githubuser/group
-# $2 github repo name
-# if a update needs to be downloaded - updateneeded is set to 1
-fn_github_compare_version() {
-	local githubreleaseuser="${1}"
-	local githubreleaserepo="${2}"
-	exitcode=0
-	updateneeded=0
-
-	fn_githublocalversionfile "${githubreleaseuser}" "${githubreleaserepo}"
-	local githublatestreleaseurl="${github_api}/repos/${githubreleaseuser}/${githubreleaserepo}/releases/latest"
-
-	githublocalversion=$(cat "${githublocalversionfile}")
-	githubreleaseversion=$(curl -s "${githublatestreleaseurl}" | jq '.tag_name')
-
-	# error if no version is there
-	if [ -z "${githubreleaseversion}" ]; then
-		fn_print_fail_nl "Can not get version from Github Api for ${githubreleaseuser}/${githubreleaserepo}"
-		fn_script_log_fatal "Can not get version from Github Api for ${githubreleaseuser}/${githubreleaserepo}"
-	else
-		if [ "${githublocalversion}" == "${githubreleaseversion}" ]; then
-			echo -en "\n"
-			echo -e "No update from github.com/${githubreleaseuser}/${githubreleaserepo}/ available:"
-			echo -e "* Local build: ${red}${githublocalversion}${default}"
-			echo -e "* Remote build: ${green}${githubreleaseversion}${default}"
-			echo -en "\n"
-		else
-			# check if version that is installed is higher than the remote version to not override it
-			last_version=$(echo -e "${githublocalversion}\n${githubreleaseversion}" | sort -V | head -n1)
-			if [ "${githubreleaseversion}" == "${last_version}" ]; then
-				echo -en "\n"
-				echo -e "Update from github.com/${githubreleaseuser}/${githubreleaserepo}/ available:"
-				echo -e "* Local build: ${red}${githublocalversion}${default}"
-				echo -e "* Remote build: ${green}${githubreleaseversion}${default}"
-				echo -en "\n"
-				updateneeded=1
-			else
-				# local version is higher than the remote version output this to the user
-				# strange case but could be possible, as a release could be removed from github
-				echo -en "\n"
-				echo -e "Local version is newer than the remote version"
-				echo -e "* Local version: ${green}${githublocalversion}${default}"
-				echo -e "* Remote version: ${green}${githubreleaseversion}${default}"
-				echo -en "\n"
-				exitcode=1
-			fi
-		fi
-	fi
-}
diff --git a/lgsm/functions/core_legacy.sh b/lgsm/functions/core_legacy.sh
deleted file mode 100644
index 1cb77258b..000000000
--- a/lgsm/functions/core_legacy.sh
+++ /dev/null
@@ -1,84 +0,0 @@
-#!/bin/bash
-# LinuxGSM core_legacy.sh module
-# Author: Daniel Gibbs
-# Contributors: http://linuxgsm.com/contrib
-# Website: https://linuxgsm.com
-# Description: Code for backwards compatability with older versions of LinuxGSM.
-
-functionselfname="$(basename "$(readlink -f "${BASH_SOURCE[0]}")")"
-
-# This is to help the transition to v20.3.0 and above
-legacy_versions_array=(v20.2.1 v20.2.0 v20.1.5 v20.1.4 v20.1.3 v20.1.2 v20.1.1 v20.1.0 v19.12.5 v19.12.4 v19.12.3 v19.12.2 v19.12.1 v19.12.0)
-for legacy_version in "${legacy_versions_array[@]}"; do
-	if [ "${version}" == "${legacy_version}" ]; then
-		legacymode=1
-	fi
-done
-
-if [ -z "${serverfiles}" ]; then
-	serverfiles="${filesdir}"
-fi
-
-if [ -z "${logdir}" ]; then
-	[ -n "${LGSM_LOGDIR}" ] && logdir="${LGSM_LOGDIR}" || logdir="${rootdir}/log"
-fi
-
-if [ -z "${lgsmlogdir}" ]; then
-	lgsmlogdir="${scriptlogdir}"
-fi
-
-if [ -z "${lgsmlog}" ]; then
-	lgsmlog="${scriptlog}"
-fi
-
-if [ -z "${lgsmlogdate}" ]; then
-	lgsmlogdate="${scriptlogdate}"
-fi
-
-if [ -z "${steamcmddir}" ]; then
-	steamcmddir="${HOME}/.steam/steamcmd"
-fi
-
-if [ -z "${lgsmdir}" ]; then
-	lgsmdir="${rootdir}/lgsm"
-fi
-
-if [ -z "${tmpdir}" ]; then
-	tmpdir="${lgsmdir}/tmp"
-fi
-
-if [ -z "${alertlog}" ]; then
-	alertlog="${emaillog}"
-fi
-
-if [ -z "${servicename}" ]; then
-	servicename="${selfname}"
-fi
-
-# Alternations to workshop variables.
-if [ -z "${wsapikey}" ]; then
-	if [ "${workshopauth}" ]; then
-		wsapikey="${workshopauth}"
-	elif [ "${authkey}" ]; then
-		wsapikey="${authkey}"
-	fi
-fi
-
-if [ -z "${wscollectionid}" ]; then
-	if [ "${workshopauth}" ]; then
-		wscollectionid="${ws_collection_id}"
-	elif [ "${authkey}" ]; then
-		wscollectionid="${workshopcollectionid}"
-	fi
-fi
-
-if [ -z "${wsstartmap}" ]; then
-	if [ "${ws_start_map}" ]; then
-		wscollectionid="${ws_start_map}"
-	fi
-fi
-
-fn_parms() {
-	fn_reload_startparameters
-	parms="${startparameters}"
-}
diff --git a/lgsm/functions/core_logs.sh b/lgsm/functions/core_logs.sh
deleted file mode 100644
index 1f0e27540..000000000
--- a/lgsm/functions/core_logs.sh
+++ /dev/null
@@ -1,110 +0,0 @@
-#!/bin/bash
-# LinuxGSM core_logs.sh module
-# Author: Daniel Gibbs
-# Contributors: http://linuxgsm.com/contrib
-# Website: https://linuxgsm.com
-# Description: Acts as a log rotator, removing old logs.
-
-functionselfname="$(basename "$(readlink -f "${BASH_SOURCE[0]}")")"
-
-# Check if logfile variable and file exist, create logfile if it doesn't exist.
-if [ "${consolelog}" ]; then
-	if [ ! -f "${consolelog}" ]; then
-		touch "${consolelog}"
-	fi
-fi
-
-# For games not displaying a console, and having logs into their game directory.
-check_status.sh
-if [ "${status}" != "0" ] && [ "${commandname}" == "START" ] && [ -n "${gamelogfile}" ]; then
-	if [ "$(find "${systemdir}" -name "gamelog*.log")" ]; then
-		fn_print_info "Moving game logs to ${gamelogdir}"
-		fn_script_log_info "Moving game logs to ${gamelogdir}"
-		echo -en "\n"
-		fn_sleep_time
-		mv "${systemdir}"/gamelog*.log "${gamelogdir}"
-	fi
-fi
-
-# Log manager will start the cleanup if it finds logs older than "${logdays}".
-if [ "$(find "${lgsmlogdir}"/ -type f -mtime +"${logdays}" | wc -l)" -ne "0" ]; then
-	fn_print_dots "Starting"
-	# Set common logs directories
-	commonlogs="${systemdir}/logs"
-	commonsourcelogs="${systemdir}/*/logs"
-	# Set addon logs directories
-	sourcemodlogdir="${systemdir}/addons/sourcemod/logs"
-	ulxlogdir="${systemdir}/data/ulx_logs"
-	darkrplogdir="${systemdir}/data/darkrp_logs"
-	legacyserverlogdir="${logdir}/server"
-	# Setting up counting variables
-	scriptcount="0"
-	consolecount="0"
-	gamecount="0"
-	srcdscount="0"
-	smcount="0"
-	ulxcount="0"
-	darkrpcount="0"
-	legacycount="0"
-	fn_sleep_time
-	fn_print_info "Removing logs older than ${logdays} days"
-	fn_script_log_info "Removing logs older than ${logdays} days"
-	# Logging logfiles to be removed according to "${logdays}", counting and removing them.
-	# Script logfiles.
-	find "${lgsmlogdir}"/ -type f -mtime +"${logdays}" | tee >> "${lgsmlog}"
-	scriptcount=$(find "${lgsmlogdir}"/ -type f -mtime +"${logdays}" | wc -l)
-	find "${lgsmlogdir}"/ -mtime +"${logdays}" -type f -exec rm -f {} \;
-	# SRCDS and unreal logfiles.
-	if [ "${engine}" == "unreal2" ] || [ "${engine}" == "source" ]; then
-		find "${gamelogdir}"/ -type f -mtime +"${logdays}" | tee >> "${lgsmlog}"
-		gamecount=$(find "${gamelogdir}"/ -type f -mtime +"${logdays}" | wc -l)
-		find "${gamelogdir}"/ -mtime +"${logdays}" -type f -exec rm -f {} \;
-	fi
-	# Console logfiles.
-	if [ "${consolelog}" ]; then
-		find "${consolelogdir}"/ -type f -mtime +"${logdays}" | tee >> "${lgsmlog}"
-		consolecount=$(find "${consolelogdir}"/ -type f -mtime +"${logdays}" | wc -l)
-		find "${consolelogdir}"/ -mtime +"${logdays}" -type f -exec rm -f {} \;
-	fi
-	# Common logfiles.
-	if [ -d "${commonlogs}" ]; then
-		find "${commonlogs}"/ -type f -mtime +"${logdays}" | tee >> "${lgsmlog}"
-		smcount=$(find "${commonlogs}"/ -type f -mtime +"${logdays}" | wc -l)
-		find "${commonlogs}"/ -mtime +"${logdays}" -type f -exec rm -f {} \;
-	fi
-	if [ -d "${commonsourcelogs}" ]; then
-		find "${commonsourcelogs}"/* -type f -mtime +"${logdays}" | tee >> "${lgsmlog}"
-		smcount=$(find "${commonsourcelogs}"/* -type f -mtime +"${logdays}" | wc -l)
-		find "${commonsourcelogs}"/* -mtime +"${logdays}" -type f -exec rm -f {} \;
-	fi
-	# Source addons logfiles.
-	if [ "${engine}" == "source" ]; then
-		# SourceMod logfiles.
-		if [ -d "${sourcemodlogdir}" ]; then
-			find "${sourcemodlogdir}"/ -type f -mtime +"${logdays}" | tee >> "${lgsmlog}"
-			smcount=$(find "${sourcemodlogdir}"/ -type f -mtime +"${logdays}" | wc -l)
-			find "${sourcemodlogdir}"/ -mtime +"${logdays}" -type f -exec rm -f {} \;
-		fi
-		# Garry's Mod logfiles.
-		if [ "${shortname}" == "gmod" ]; then
-			# ULX logfiles.
-			if [ -d "${ulxlogdir}" ]; then
-				find "${ulxlogdir}"/ -type f -mtime +"${logdays}" | tee >> "${lgsmlog}"
-				ulxcount=$(find "${ulxlogdir}"/ -type f -mtime +"${logdays}" | wc -l)
-				find "${ulxlogdir}"/ -mtime +"${logdays}" -type f -exec rm -f {} \;
-			fi
-			# DarkRP logfiles.
-			if [ -d "${darkrplogdir}" ]; then
-				find "${darkrplogdir}"/ -type f -mtime +"${logdays}" | tee >> "${lgsmlog}"
-				darkrpcount=$(find "${darkrplogdir}"/ -type f -mtime +"${logdays}" | wc -l)
-				find "${darkrplogdir}"/ -mtime +"${logdays}" -type f -exec rm -f {} \;
-			fi
-		fi
-	fi
-
-	# Count total amount of files removed.
-	countlogs=$((scriptcount + consolecount + gamecount + srcdscount + smcount + ulxcount + darkrpcount))
-	# Job done.
-	fn_print_ok "Removed ${countlogs} log files"
-	fn_script_log "Removed ${countlogs} log files"
-fi
diff --git a/lgsm/functions/core_messages.sh b/lgsm/functions/core_messages.sh
deleted file mode 100644
index 5362dd3d3..000000000
--- a/lgsm/functions/core_messages.sh
+++ /dev/null
@@ -1,598 +0,0 @@
-#!/bin/bash
-# LinuxGSM core_messages.sh module
-# Author: Daniel Gibbs
-# Contributors: http://linuxgsm.com/contrib
-# Website: https://linuxgsm.com
-# Description: Defines on-screen messages such as [  OK  ] and how script logs look.
-
-functionselfname="$(basename "$(readlink -f "${BASH_SOURCE[0]}")")"
-
-# nl: new line: message is following by a new line.
-# eol: end of line: message is placed at the end of the current line.
-fn_ansi_loader() {
-	if [ "${ansi}" != "off" ]; then
-		# echo colors
-		default="\e[0m"
-		black="\e[30m"
-		red="\e[31m"
-		lightred="\e[91m"
-		green="\e[32m"
-		lightgreen="\e[92m"
-		yellow="\e[33m"
-		lightyellow="\e[93m"
-		blue="\e[34m"
-		lightblue="\e[94m"
-		magenta="\e[35m"
-		lightmagenta="\e[95m"
-		cyan="\e[36m"
-		lightcyan="\e[96m"
-		darkgrey="\e[90m"
-		lightgrey="\e[37m"
-		white="\e[97m"
-	fi
-	# carriage return & erase to end of line.
-	creeol="\r\033[K"
-}
-
-fn_sleep_time() {
-	if [ "${sleeptime}" != "0" ] || [ "${travistest}" != "1" ]; then
-		if [ -z "${sleeptime}" ]; then
-			sleeptime=0.5
-		fi
-		sleep "${sleeptime}"
-	fi
-}
-
-# Log display
-########################
-## Feb 28 14:56:58 ut99-server: Monitor:
-fn_script_log() {
-	if [ -d "${lgsmlogdir}" ]; then
-		if [ -n "${commandname}" ]; then
-			echo -e "$(date '+%b %d %H:%M:%S.%3N') ${selfname}: ${commandname}: ${1}" >> "${lgsmlog}"
-		else
-			echo -e "$(date '+%b %d %H:%M:%S.%3N') ${selfname}: ${1}" >> "${lgsmlog}"
-		fi
-	fi
-}
-
-## Feb 28 14:56:58 ut99-server: Monitor: PASS:
-fn_script_log_pass() {
-	if [ -d "${lgsmlogdir}" ]; then
-
-		if [ -n "${commandname}" ]; then
-			echo -e "$(date '+%b %d %H:%M:%S.%3N') ${selfname}: ${commandname}: PASS: ${1}" >> "${lgsmlog}"
-		else
-			echo -e "$(date '+%b %d %H:%M:%S.%3N') ${selfname}: PASS: ${1}" >> "${lgsmlog}"
-		fi
-	fi
-	exitcode=0
-}
-
-## Feb 28 14:56:58 ut99-server: Monitor: FATAL:
-fn_script_log_fatal() {
-	if [ -d "${lgsmlogdir}" ]; then
-		if [ -n "${commandname}" ]; then
-			echo -e "$(date '+%b %d %H:%M:%S.%3N') ${selfname}: ${commandname}: FATAL: ${1}" >> "${lgsmlog}"
-		else
-			echo -e "$(date '+%b %d %H:%M:%S.%3N') ${selfname}: FATAL: ${1}" >> "${lgsmlog}"
-		fi
-	fi
-	exitcode=1
-}
-
-## Feb 28 14:56:58 ut99-server: Monitor: ERROR:
-fn_script_log_error() {
-	if [ -d "${lgsmlogdir}" ]; then
-		if [ -n "${commandname}" ]; then
-			echo -e "$(date '+%b %d %H:%M:%S.%3N') ${selfname}: ${commandname}: ERROR: ${1}" >> "${lgsmlog}"
-		else
-			echo -e "$(date '+%b %d %H:%M:%S.%3N') ${selfname}: ERROR: ${1}" >> "${lgsmlog}"
-		fi
-	fi
-	exitcode=2
-}
-
-## Feb 28 14:56:58 ut99-server: Monitor: WARN:
-fn_script_log_warn() {
-	if [ -d "${lgsmlogdir}" ]; then
-		if [ -n "${commandname}" ]; then
-			echo -e "$(date '+%b %d %H:%M:%S.%3N') ${selfname}: ${commandname}: WARN: ${1}" >> "${lgsmlog}"
-		else
-			echo -e "$(date '+%b %d %H:%M:%S.%3N') ${selfname}: WARN: ${1}" >> "${lgsmlog}"
-		fi
-	fi
-	exitcode=3
-}
-
-## Feb 28 14:56:58 ut99-server: Monitor: INFO:
-fn_script_log_info() {
-	if [ -d "${lgsmlogdir}" ]; then
-		if [ -n "${commandname}" ]; then
-			echo -e "$(date '+%b %d %H:%M:%S.%3N') ${selfname}: ${commandname}: INFO: ${1}" >> "${lgsmlog}"
-		else
-			echo -e "$(date '+%b %d %H:%M:%S.%3N') ${selfname}: INFO: ${1}" >> "${lgsmlog}"
-		fi
-	fi
-}
-
-## Feb 28 14:56:58 ut99-server: Monitor: UPDATE:
-fn_script_log_update() {
-	if [ -d "${lgsmlogdir}" ]; then
-		if [ -n "${commandname}" ]; then
-			echo -e "$(date '+%b %d %H:%M:%S.%3N') ${selfname}: ${commandname}: UPDATE: ${1}" >> "${lgsmlog}"
-		else
-			echo -e "$(date '+%b %d %H:%M:%S.%3N') ${selfname}: UPDATE: ${1}" >> "${lgsmlog}"
-		fi
-	fi
-}
-
-# On-Screen - Automated functions
-##################################
-
-# [ .... ]
-fn_print_dots() {
-	if [ "${commandaction}" ]; then
-		echo -en "${creeol}[ .... ] ${commandaction} ${selfname}: $*"
-	else
-		echo -en "${creeol}[ .... ] $*"
-	fi
-	fn_sleep_time
-}
-
-fn_print_dots_nl() {
-	if [ "${commandaction}" ]; then
-		echo -e "${creeol}[ .... ] ${commandaction} ${selfname}: $*"
-	else
-		echo -e "${creeol}[ .... ] $*"
-	fi
-	fn_sleep_time
-	echo -en "\n"
-}
-
-# [  OK  ]
-fn_print_ok() {
-	if [ "${commandaction}" ]; then
-		echo -en "${creeol}[${green}  OK  ${default}] ${commandaction} ${selfname}: $*"
-	else
-		echo -en "${creeol}[${green}  OK  ${default}] $*"
-	fi
-	fn_sleep_time
-}
-
-fn_print_ok_nl() {
-	if [ "${commandaction}" ]; then
-		echo -en "${creeol}[${green}  OK  ${default}] ${commandaction} ${selfname}: $*"
-	else
-		echo -en "${creeol}[${green}  OK  ${default}] $*"
-	fi
-	fn_sleep_time
-	echo -en "\n"
-}
-
-# [ FAIL ]
-fn_print_fail() {
-	if [ "${commandaction}" ]; then
-		echo -en "${creeol}[${red} FAIL ${default}] ${commandaction} ${selfname}: $*"
-	else
-		echo -en "${creeol}[${red} FAIL ${default}] $*"
-	fi
-	fn_sleep_time
-}
-
-fn_print_fail_nl() {
-	if [ "${commandaction}" ]; then
-		echo -en "${creeol}[${red} FAIL ${default}] ${commandaction} ${selfname}: $*"
-	else
-		echo -en "${creeol}[${red} FAIL ${default}] $*"
-	fi
-	fn_sleep_time
-	echo -en "\n"
-}
-
-# [ ERROR ]
-fn_print_error() {
-	if [ "${commandaction}" ]; then
-		echo -en "${creeol}[${red} ERROR ${default}] ${commandaction} ${selfname}: $*"
-	else
-		echo -en "${creeol}[${red} ERROR ${default}] $*"
-	fi
-	fn_sleep_time
-}
-
-fn_print_error_nl() {
-	if [ "${commandaction}" ]; then
-		echo -en "${creeol}[${red} ERROR ${default}] ${commandaction} ${selfname}: $*"
-	else
-		echo -en "${creeol}[${red} ERROR ${default}] $*"
-	fi
-	fn_sleep_time
-	echo -en "\n"
-}
-
-# [ WARN ]
-fn_print_warn() {
-	if [ "${commandaction}" ]; then
-		echo -en "${creeol}[${lightyellow} WARN ${default}] ${commandaction} ${selfname}: $*"
-	else
-		echo -en "${creeol}[${lightyellow} WARN ${default}] $*"
-	fi
-	fn_sleep_time
-}
-
-fn_print_warn_nl() {
-	if [ "${commandaction}" ]; then
-		echo -en "${creeol}[${lightyellow} WARN ${default}] ${commandaction} ${selfname}: $*"
-	else
-		echo -en "${creeol}[${lightyellow} WARN ${default}] $*"
-	fi
-	fn_sleep_time
-	echo -en "\n"
-}
-
-# [ INFO ]
-fn_print_info() {
-	if [ "${commandaction}" ]; then
-		echo -en "${creeol}[${cyan} INFO ${default}] ${commandaction} ${selfname}: $*"
-	else
-		echo -en "${creeol}[${cyan} INFO ${default}] $*"
-	fi
-	fn_sleep_time
-}
-
-fn_print_info_nl() {
-	if [ "${commandaction}" ]; then
-		echo -en "${creeol}[${cyan} INFO ${default}] ${commandaction} ${selfname}: $*"
-	else
-		echo -en "${creeol}[${cyan} INFO ${default}] $*"
-	fi
-	fn_sleep_time
-	echo -en "\n"
-}
-
-# [ START ]
-fn_print_start() {
-	if [ "${commandaction}" ]; then
-		echo -en "${creeol}[${lightgreen} START ${default}] ${commandaction} ${selfname}: $*"
-	else
-		echo -en "${creeol}[${lightgreen} START ${default}] $*"
-	fi
-	fn_sleep_time
-}
-
-fn_print_start_nl() {
-	if [ "${commandaction}" ]; then
-		echo -en "${creeol}[${lightgreen} START ${default}] ${commandaction} ${selfname}: $*"
-	else
-		echo -en "${creeol}[${lightgreen} START ${default}] $*"
-	fi
-	fn_sleep_time
-	echo -en "\n"
-}
-
-# On-Screen - Interactive messages
-##################################
-
-# No More Room in Hell Debug
-# =================================
-fn_print_header() {
-	echo -e ""
-	echo -e "${lightyellow}${gamename} ${commandaction}${default}"
-	echo -e "=================================${default}"
-}
-
-# Complete!
-fn_print_complete() {
-	echo -en "${green}Complete!${default} $*"
-	fn_sleep_time
-}
-
-fn_print_complete_nl() {
-	echo -e "${green}Complete!${default} $*"
-	fn_sleep_time
-}
-
-# Failure!
-fn_print_failure() {
-	echo -en "${red}Failure!${default} $*"
-	fn_sleep_time
-}
-
-fn_print_failure_nl() {
-	echo -e "${red}Failure!${default} $*"
-	fn_sleep_time
-}
-
-# Error!
-fn_print_error2() {
-	echo -en "${red}Error!${default} $*"
-	fn_sleep_time
-}
-
-fn_print_error2_nl() {
-	echo -e "${red}Error!${default} $*"
-	fn_sleep_time
-}
-
-# Warning!
-fn_print_warning() {
-	echo -en "${lightyellow}Warning!${default} $*"
-	fn_sleep_time
-}
-
-fn_print_warning_nl() {
-	echo -e "${lightyellow}Warning!${default} $*"
-	fn_sleep_time
-}
-
-# Information!
-fn_print_information() {
-	echo -en "${cyan}Information!${default} $*"
-	fn_sleep_time
-}
-
-fn_print_information_nl() {
-	echo -e "${cyan}Information!${default} $*"
-	fn_sleep_time
-}
-
-# Y/N Prompt
-fn_prompt_yn() {
-	local prompt="$1"
-	local initial="$2"
-
-	if [ "${initial}" == "Y" ]; then
-		prompt+=" [Y/n] "
-	elif [ "${initial}" == "N" ]; then
-		prompt+=" [y/N] "
-	else
-		prompt+=" [y/n] "
-	fi
-
-	while true; do
-		read -e -i "${initial}" -p "${prompt}" -r yn
-		case "${yn}" in
-			[Yy] | [Yy][Ee][Ss]) return 0 ;;
-			[Nn] | [Nn][Oo]) return 1 ;;
-			*) echo -e "Please answer yes or no." ;;
-		esac
-	done
-}
-
-# Prompt for message
-fn_prompt_message() {
-	while true; do
-		unset prompt
-		local prompt="$1"
-		read -e -p "${prompt}" -r answer
-		if fn_prompt_yn "Continue" Y; then
-			break
-		fi
-	done
-	echo "${answer}"
-}
-
-# On-Screen End of Line
-##################################
-
-# YES
-fn_print_yes_eol() {
-	echo -en "${cyan}YES${default}"
-	fn_sleep_time
-}
-
-fn_print_yes_eol_nl() {
-	echo -e "${cyan}YES${default}"
-	fn_sleep_time
-}
-
-# NO
-fn_print_no_eol() {
-	echo -en "${red}NO${default}"
-	fn_sleep_time
-}
-
-fn_print_no_eol_nl() {
-	echo -e "${red}NO${default}"
-	fn_sleep_time
-}
-
-# OK
-fn_print_ok_eol() {
-	echo -en "${green}OK${default}"
-	fn_sleep_time
-}
-
-fn_print_ok_eol_nl() {
-	echo -e "${green}OK${default}"
-	fn_sleep_time
-}
-
-# FAIL
-fn_print_fail_eol() {
-	echo -en "${red}FAIL${default}"
-	fn_sleep_time
-}
-
-fn_print_fail_eol_nl() {
-	echo -e "${red}FAIL${default}"
-	fn_sleep_time
-}
-
-# ERROR
-fn_print_error_eol() {
-	echo -en "${red}ERROR${default}"
-	fn_sleep_time
-}
-
-fn_print_error_eol_nl() {
-	echo -e "${red}ERROR${default}"
-	fn_sleep_time
-}
-
-# WAIT
-fn_print_wait_eol() {
-	echo -en "${cyan}WAIT${default}"
-	fn_sleep_time
-}
-
-fn_print_wait_eol_nl() {
-	echo -e "${cyan}WAIT${default}"
-	fn_sleep_time
-}
-
-# WARN
-fn_print_warn_eol() {
-	echo -en "${lightyellow}WARN${default}"
-	fn_sleep_time
-}
-
-fn_print_warn_eol_nl() {
-	echo -e "${lightyellow}WARN${default}"
-	fn_sleep_time
-}
-
-# INFO
-fn_print_info_eol() {
-	echo -en "${cyan}INFO${default}"
-	fn_sleep_time
-}
-
-fn_print_info_eol_nl() {
-	echo -e "${cyan}INFO${default}"
-	fn_sleep_time
-}
-
-# QUERYING
-fn_print_querying_eol() {
-	echo -en "${cyan}QUERYING${default}"
-	fn_sleep_time
-}
-
-fn_print_querying_eol_nl() {
-	echo -e "${cyan}QUERYING${default}"
-	fn_sleep_time
-}
-
-# CHECKING
-fn_print_checking_eol() {
-	echo -en "${cyan}CHECKING${default}"
-	fn_sleep_time
-}
-
-fn_print_checking_eol_nl() {
-	echo -e "${cyan}CHECKING${default}"
-	fn_sleep_time
-}
-
-# DELAY
-fn_print_delay_eol() {
-	echo -en "${green}DELAY${default}"
-	fn_sleep_time
-}
-
-fn_print_delay_eol_nl() {
-	echo -e "${green}DELAY${default}"
-	fn_sleep_time
-}
-
-# CANCELED
-fn_print_canceled_eol() {
-	echo -en "${lightyellow}CANCELED${default}"
-	fn_sleep_time
-}
-
-fn_print_canceled_eol_nl() {
-	echo -e "${lightyellow}CANCELED${default}"
-	fn_sleep_time
-}
-
-# REMOVED
-fn_print_removed_eol() {
-	echo -en "${red}REMOVED${default}"
-	fn_sleep_time
-}
-
-fn_print_removed_eol_nl() {
-	echo -e "${red}REMOVED${default}"
-	fn_sleep_time
-}
-
-# UPDATE
-fn_print_update_eol() {
-	echo -en "${cyan}UPDATE${default}"
-	fn_sleep_time
-}
-
-fn_print_update_eol_nl() {
-	echo -e "${cyan}UPDATE${default}"
-	fn_sleep_time
-}
-
-fn_print_ascii_logo() {
-	echo -e ""
-	echo -e "                                mdMMMMbm"
-	echo -e "                              mMMMMMMMMMMm"
-	echo -e "                              mMMMMMMMMMMMMm"
-	echo -e "                             mMMMMMMMMMMMMMMm"
-	echo -e "                             hMMMV^VMMV^VMMMh"
-	echo -e "                             MMMMM  MM  MMMMM"
-	echo -e "                             hMMs   vv   sMMh"
-	echo -e "                            hMMM:        :MMMh"
-	echo -e "                          .hMMMh          hMMMh."
-	echo -e "                         -dMMMh     ${lightgrey}__${default}     hMMMd-"
-	echo -e "                        :mMMMs      ${lightgrey}||${default}      sMMMm:"
-	echo -e "                       :MMMM+       ${lightgrey}||${default} ${red}_${default}     +NMMN:"
-	echo -e "                      .mMMM+     ${lightgrey}========${default}     +MMMm."
-	echo -e "                      yMMMy   ${darkgrey}##############${default}   yMMMy"
-	echo -e "                      mMMM:   ${darkgrey}##############${default}   :MMMm"
-	echo -e "                      mMM   ${lightyellow}nn${default}   ${lightyellow}nn${default}    ${lightyellow}nn${default}   ${lightyellow}nn${default}   MMm"
-	echo -e "                      o   ${lightyellow}nNNNNNNNn${default}    ${lightyellow}nNNNNNNNn${default}   o"
-	echo -e "                         ${lightyellow}nNNNNNNNNNn${default}  ${lightyellow}nNNNNNNNNNn${default}"
-	echo -e "                        ${lightyellow}nNNNNNNNNNNN${default}  ${lightyellow}NNNNNNNNNNNn${default}"
-	echo -e "                         ${lightyellow}+NNNNNNNNN:${default}  ${lightyellow}:NNNNNNNNN+${default}"
-	echo -e "                           ${lightyellow}nNNNNNNN${default} /\ ${lightyellow}NNNNNNNn${default}"
-	echo -e "                             ${lightyellow}nnnnn${default}  db  ${lightyellow}nnnnn${default}"
-	echo -e ""
-	echo -e "${lightyellow}888${default}      ${lightyellow}d8b${default}                             ${default}.d8888b.   .d8888b.  888b     d888"
-	echo -e "${lightyellow}888      Y8P                            ${default}d88P  Y88b d88P  Y88b 8888b   d8888"
-	echo -e "${lightyellow}888${default}                                     ${default}888${default}    888 Y88b.      88888b.d88888"
-	echo -e "${lightyellow}888${default}      ${lightyellow}888${default} ${lightyellow}88888b.${default}  ${lightyellow}888${default}  ${lightyellow}888${default} ${lightyellow}888${default}  ${lightyellow}888${default} 888          Y888b.   888Y88888P888"
-	echo -e "${lightyellow}888${default}      ${lightyellow}888${default} ${lightyellow}888${default}  ${lightyellow}88b${default} ${lightyellow}888${default}  ${lightyellow}888${default}  ${lightyellow}Y8bd8P${default}  888  88888      Y88b. 888 Y888P 888"
-	echo -e "${lightyellow}888${default}      ${lightyellow}888${default} ${lightyellow}888${default}  ${lightyellow}888${default} ${lightyellow}888${default}  ${lightyellow}888${default}   ${lightyellow}X88K${default}   888    888        888 888  Y8P  888"
-	echo -e "${lightyellow}888${default}      ${lightyellow}888${default} ${lightyellow}888${default}  ${lightyellow}888${default} ${lightyellow}Y88b${default} ${lightyellow}88Y${default} ${lightyellow}.d8pq8b.${default} Y88b  d88P Y88b  d88P 888   *   888"
-	echo -e "${lightyellow}LinuxGSM${default} ${lightyellow}888${default} ${lightyellow}888${default}  ${lightyellow}888${default}  ${lightyellow}Y8888Y${default}  ${lightyellow}888${default}  ${lightyellow}888${default}   Y2012P88   Y8888P   888       888"
-	echo -e ""
-}
-
-fn_print_restart_warning() {
-	fn_print_warn "${selfname} will be restarted"
-	fn_script_log_warn "${selfname} will be restarted"
-	totalseconds=3
-	for seconds in {3..1}; do
-		fn_print_warn "${selfname} will be restarted: ${totalseconds}"
-		totalseconds=$((totalseconds - 1))
-		sleep 1
-		if [ "${seconds}" == "0" ]; then
-			break
-		fi
-	done
-	fn_print_warn_nl "${selfname} will be restarted"
-}
-
-# Functions below are used to ensure that logs and UI correctly reflect the command it is actually running.
-# Useful when a command has to call upon another command causing the other command to overrite commandname variables
-
-# Used to remember the command that ran first.
-fn_firstcommand_set() {
-	if [ -z "${firstcommandname}" ]; then
-		firstcommandname="${commandname}"
-		firstcommandaction="${commandaction}"
-	fi
-}
-
-# Used to reset commandname variables to the command the script ran first.
-fn_firstcommand_reset() {
-	commandname="${firstcommandname}"
-	commandaction="${firstcommandaction}"
-}
diff --git a/lgsm/functions/core_modules.sh b/lgsm/functions/core_modules.sh
deleted file mode 100644
index 80e890d1a..000000000
--- a/lgsm/functions/core_modules.sh
+++ /dev/null
@@ -1,816 +0,0 @@
-#!/bin/bash
-# LinuxGSM core_modules.sh module
-# Author: Daniel Gibbs
-# Contributors: http://linuxgsm.com/contrib
-# Website: https://linuxgsm.com
-# Description: Defines all modules to allow download and execution of modules using fn_fetch_module.
-# This module is called first before any other module. Without this file other modules will not load.
-
-moduleselfname="$(basename "$(readlink -f "${BASH_SOURCE[0]}")")"
-
-modulesversion="v23.3.1"
-
-# Core
-
-core_dl.sh() {
-	modulefile="${FUNCNAME[0]}"
-	if [ "$(type fn_fetch_core_dl 2> /dev/null)" ]; then
-		fn_fetch_core_dl "lgsm/modules" "core_dl.sh" "${modulesdir}" "chmodx" "run" "noforcedl" "nohash"
-	else
-		fn_bootstrap_fetch_file_github "lgsm/modules" "core_dl.sh" "${modulesdir}" "chmodx" "run" "noforcedl" "nohash"
-	fi
-}
-
-core_messages.sh() {
-	modulefile="${FUNCNAME[0]}"
-	if [ "$(type fn_fetch_core_dl 2> /dev/null)" ]; then
-		fn_fetch_core_dl "lgsm/modules" "core_messages.sh" "${modulesdir}" "chmodx" "run" "noforcedl" "nohash"
-	else
-		fn_bootstrap_fetch_file_github "lgsm/modules" "core_messages.sh" "${modulesdir}" "chmodx" "run" "noforcedl" "nohash"
-	fi
-}
-
-core_legacy.sh() {
-	modulefile="${FUNCNAME[0]}"
-	if [ "$(type fn_fetch_core_dl 2> /dev/null)" ]; then
-		fn_fetch_core_dl "lgsm/modules" "core_legacy.sh" "${modulesdir}" "chmodx" "run" "noforcedl" "nohash"
-	else
-		fn_bootstrap_fetch_file_github "lgsm/modules" "core_legacy.sh" "${modulesdir}" "chmodx" "run" "noforcedl" "nohash"
-	fi
-}
-
-core_exit.sh() {
-	modulefile="${FUNCNAME[0]}"
-	fn_fetch_module
-}
-
-core_getopt.sh() {
-	modulefile="${FUNCNAME[0]}"
-	fn_fetch_module
-}
-
-core_trap.sh() {
-	modulefile="${FUNCNAME[0]}"
-	fn_fetch_module
-}
-
-core_steamcmd.sh() {
-	modulefile="${FUNCNAME[0]}"
-	fn_fetch_module
-}
-
-core_github.sh() {
-	modulefile="${FUNCNAME[0]}"
-	fn_fetch_module
-}
-
-# Commands
-
-command_backup.sh() {
-	modulefile="${FUNCNAME[0]}"
-	fn_fetch_module
-}
-
-command_console.sh() {
-	modulefile="${FUNCNAME[0]}"
-	fn_fetch_module
-}
-
-command_debug.sh() {
-	modulefile="${FUNCNAME[0]}"
-	fn_fetch_module
-}
-
-command_details.sh() {
-	modulefile="${FUNCNAME[0]}"
-	fn_fetch_module
-}
-
-command_sponsor.sh() {
-	modulefile="${FUNCNAME[0]}"
-	fn_fetch_module
-}
-
-command_postdetails.sh() {
-	modulefile="${FUNCNAME[0]}"
-	fn_fetch_module
-}
-
-command_test_alert.sh() {
-	modulefile="${FUNCNAME[0]}"
-	fn_fetch_module
-}
-
-command_monitor.sh() {
-	modulefile="${FUNCNAME[0]}"
-	fn_fetch_module
-}
-
-command_start.sh() {
-	modulefile="${FUNCNAME[0]}"
-	fn_fetch_module
-}
-
-command_stop.sh() {
-	modulefile="${FUNCNAME[0]}"
-	fn_fetch_module
-}
-
-command_validate.sh() {
-	modulefile="${FUNCNAME[0]}"
-	fn_fetch_module
-}
-
-command_install.sh() {
-	modulefile="${FUNCNAME[0]}"
-	fn_fetch_module
-}
-
-command_install_resources_mta.sh() {
-	modulefile="${FUNCNAME[0]}"
-	fn_fetch_module
-}
-
-install_squad_license.sh() {
-	modulefile="${FUNCNAME[0]}"
-	fn_fetch_module
-}
-
-command_mods_install.sh() {
-	modulefile="${FUNCNAME[0]}"
-	fn_fetch_module
-}
-
-command_mods_update.sh() {
-	modulefile="${FUNCNAME[0]}"
-	fn_fetch_module
-}
-
-command_mods_remove.sh() {
-	modulefile="${FUNCNAME[0]}"
-	fn_fetch_module
-}
-
-command_fastdl.sh() {
-	modulefile="${FUNCNAME[0]}"
-	fn_fetch_module
-}
-
-command_ts3_server_pass.sh() {
-	modulefile="${FUNCNAME[0]}"
-	fn_fetch_module
-}
-
-command_restart.sh() {
-	modulefile="${FUNCNAME[0]}"
-	fn_fetch_module
-}
-
-command_skeleton.sh() {
-	modulefile="${FUNCNAME[0]}"
-	fn_fetch_module
-}
-
-command_wipe.sh() {
-	modulefile="${FUNCNAME[0]}"
-	fn_fetch_module
-}
-
-command_send.sh() {
-	modulefile="${FUNCNAME[0]}"
-	fn_fetch_module
-}
-
-# Checks
-
-check.sh() {
-	modulefile="${FUNCNAME[0]}"
-	fn_fetch_module
-}
-
-check_config.sh() {
-	modulefile="${FUNCNAME[0]}"
-	fn_fetch_module
-}
-
-check_deps.sh() {
-	modulefile="${FUNCNAME[0]}"
-	fn_fetch_module
-}
-
-check_executable.sh() {
-	modulefile="${FUNCNAME[0]}"
-	fn_fetch_module
-}
-
-check_glibc.sh() {
-	modulefile="${FUNCNAME[0]}"
-	fn_fetch_module
-}
-
-check_ip.sh() {
-	modulefile="${FUNCNAME[0]}"
-	fn_fetch_module
-}
-
-check_last_update.sh() {
-	modulefile="${FUNCNAME[0]}"
-	fn_fetch_module
-}
-
-check_logs.sh() {
-	modulefile="${FUNCNAME[0]}"
-	fn_fetch_module
-}
-
-check_permissions.sh() {
-	modulefile="${FUNCNAME[0]}"
-	fn_fetch_module
-}
-
-check_root.sh() {
-	modulefile="${FUNCNAME[0]}"
-	fn_fetch_module
-}
-
-check_status.sh() {
-	modulefile="${FUNCNAME[0]}"
-	fn_fetch_module
-}
-
-check_steamcmd.sh() {
-	modulefile="${FUNCNAME[0]}"
-	fn_fetch_module
-}
-
-check_system_dir.sh() {
-	modulefile="${FUNCNAME[0]}"
-	fn_fetch_module
-}
-
-check_system_requirements.sh() {
-	modulefile="${FUNCNAME[0]}"
-	fn_fetch_module
-}
-
-check_tmuxception.sh() {
-	modulefile="${FUNCNAME[0]}"
-	fn_fetch_module
-}
-
-check_version.sh() {
-	modulefile="${FUNCNAME[0]}"
-	fn_fetch_module
-}
-
-# Compress
-
-compress_unreal2_maps.sh() {
-	modulefile="${FUNCNAME[0]}"
-	fn_fetch_module
-}
-
-compress_ut99_maps.sh() {
-	modulefile="${FUNCNAME[0]}"
-	fn_fetch_module
-}
-
-# Mods
-
-mods_list.sh() {
-	modulefile="${FUNCNAME[0]}"
-	fn_fetch_module
-}
-
-mods_core.sh() {
-	modulefile="${FUNCNAME[0]}"
-	fn_fetch_module
-}
-
-# Dev
-
-command_dev_clear_modules.sh() {
-	modulefile="${FUNCNAME[0]}"
-	fn_fetch_module
-}
-
-command_dev_debug.sh() {
-	modulefile="${FUNCNAME[0]}"
-	fn_fetch_module
-}
-
-command_dev_detect_deps.sh() {
-	modulefile="${FUNCNAME[0]}"
-	fn_fetch_module
-}
-
-command_dev_detect_glibc.sh() {
-	modulefile="${FUNCNAME[0]}"
-	fn_fetch_module
-}
-
-command_dev_detect_ldd.sh() {
-	modulefile="${FUNCNAME[0]}"
-	fn_fetch_module
-}
-
-command_dev_query_raw.sh() {
-	modulefile="${FUNCNAME[0]}"
-	fn_fetch_module
-}
-
-# Fix
-
-fix.sh() {
-	modulefile="${FUNCNAME[0]}"
-	fn_fetch_module
-}
-
-fix_ark.sh() {
-	modulefile="${FUNCNAME[0]}"
-	fn_fetch_module
-}
-
-fix_av.sh() {
-	modulefile="${FUNCNAME[0]}"
-	fn_fetch_module
-}
-
-fix_arma3.sh() {
-	modulefile="${FUNCNAME[0]}"
-	fn_fetch_module
-}
-
-fix_armar.sh() {
-	modulefile="${FUNCNAME[0]}"
-	fn_fetch_module
-}
-
-fix_bt.sh() {
-	modulefile="${FUNCNAME[0]}"
-	fn_fetch_module
-}
-
-fix_bo.sh() {
-	modulefile="${FUNCNAME[0]}"
-	fn_fetch_module
-}
-
-fix_cmw.sh() {
-	modulefile="${FUNCNAME[0]}"
-	fn_fetch_module
-}
-
-fix_csgo.sh() {
-	modulefile="${FUNCNAME[0]}"
-	fn_fetch_module
-}
-
-fix_dst.sh() {
-	modulefile="${FUNCNAME[0]}"
-	fn_fetch_module
-}
-
-fix_hw.sh() {
-	modulefile="${FUNCNAME[0]}"
-	fn_fetch_module
-}
-
-fix_ins.sh() {
-	modulefile="${FUNCNAME[0]}"
-	fn_fetch_module
-}
-
-fix_kf.sh() {
-	modulefile="${FUNCNAME[0]}"
-	fn_fetch_module
-}
-
-fix_kf2.sh() {
-	modulefile="${FUNCNAME[0]}"
-	fn_fetch_module
-}
-
-fix_lo.sh() {
-	modulefile="${FUNCNAME[0]}"
-	fn_fetch_module
-}
-
-fix_mcb.sh() {
-	modulefile="${FUNCNAME[0]}"
-	fn_fetch_module
-}
-
-fix_mta.sh() {
-	modulefile="${FUNCNAME[0]}"
-	fn_fetch_module
-}
-
-fix_nmrih.sh() {
-	modulefile="${FUNCNAME[0]}"
-	fn_fetch_module
-}
-
-fix_onset.sh() {
-	modulefile="${FUNCNAME[0]}"
-	fn_fetch_module
-}
-
-fix_ro.sh() {
-	modulefile="${FUNCNAME[0]}"
-	fn_fetch_module
-}
-
-fix_rust.sh() {
-	modulefile="${FUNCNAME[0]}"
-	fn_fetch_module
-}
-
-fix_rw.sh() {
-	modulefile="${FUNCNAME[0]}"
-	fn_fetch_module
-}
-
-fix_sfc.sh() {
-	modulefile="${FUNCNAME[0]}"
-	fn_fetch_module
-}
-
-fix_st.sh() {
-	modulefile="${FUNCNAME[0]}"
-	fn_fetch_module
-}
-
-fix_steamcmd.sh() {
-	modulefile="${FUNCNAME[0]}"
-	fn_fetch_module
-}
-
-fix_terraria.sh() {
-	modulefile="${FUNCNAME[0]}"
-	fn_fetch_module
-}
-
-fix_tf2.sh() {
-	modulefile="${FUNCNAME[0]}"
-	fn_fetch_module
-}
-
-fix_ut3.sh() {
-	modulefile="${FUNCNAME[0]}"
-	fn_fetch_module
-}
-
-fix_rust.sh() {
-	modulefile="${FUNCNAME[0]}"
-	fn_fetch_module
-}
-
-fix_samp.sh() {
-	modulefile="${FUNCNAME[0]}"
-	fn_fetch_module
-}
-
-fix_sdtd.sh() {
-	modulefile="${FUNCNAME[0]}"
-	fn_fetch_module
-}
-
-fix_sof2.sh() {
-	modulefile="${FUNCNAME[0]}"
-	fn_fetch_module
-}
-
-fix_squad.sh() {
-	modulefile="${FUNCNAME[0]}"
-	fn_fetch_module
-}
-
-fix_ts3.sh() {
-	modulefile="${FUNCNAME[0]}"
-	fn_fetch_module
-}
-
-fix_ut2k4.sh() {
-	modulefile="${FUNCNAME[0]}"
-	fn_fetch_module
-}
-
-fix_ut.sh() {
-	modulefile="${FUNCNAME[0]}"
-	fn_fetch_module
-}
-
-fix_unt.sh() {
-	modulefile="${FUNCNAME[0]}"
-	fn_fetch_module
-}
-
-fix_vh.sh() {
-	modulefile="${FUNCNAME[0]}"
-	fn_fetch_module
-}
-
-fix_wurm.sh() {
-	modulefile="${FUNCNAME[0]}"
-	fn_fetch_module
-}
-
-fix_zmr.sh() {
-	modulefile="${FUNCNAME[0]}"
-	fn_fetch_module
-}
-
-# Info
-
-info_distro.sh() {
-	modulefile="${FUNCNAME[0]}"
-	fn_fetch_module
-}
-
-info_game.sh() {
-	modulefile="${FUNCNAME[0]}"
-	fn_fetch_module
-}
-
-info_messages.sh() {
-	modulefile="${FUNCNAME[0]}"
-	fn_fetch_module
-}
-
-info_stats.sh() {
-	modulefile="${FUNCNAME[0]}"
-	fn_fetch_module
-}
-
-# Alert
-
-alert.sh() {
-	modulefile="${FUNCNAME[0]}"
-	fn_fetch_module
-}
-
-alert_discord.sh() {
-	modulefile="${FUNCNAME[0]}"
-	fn_fetch_module
-}
-
-alert_email.sh() {
-	modulefile="${FUNCNAME[0]}"
-	fn_fetch_module
-}
-
-alert_ifttt.sh() {
-	modulefile="${FUNCNAME[0]}"
-	fn_fetch_module
-}
-
-alert_mailgun.sh() {
-	modulefile="${FUNCNAME[0]}"
-	fn_fetch_module
-}
-
-alert_pushbullet.sh() {
-	modulefile="${FUNCNAME[0]}"
-	fn_fetch_module
-}
-
-alert_pushover.sh() {
-	modulefile="${FUNCNAME[0]}"
-	fn_fetch_module
-}
-
-alert_gotify.sh() {
-	modulefile="${FUNCNAME[0]}"
-	fn_fetch_module
-}
-
-alert_telegram.sh() {
-	modulefile="${FUNCNAME[0]}"
-	fn_fetch_module
-}
-
-alert_rocketchat.sh() {
-	modulefile="${FUNCNAME[0]}"
-	fn_fetch_module
-}
-
-alert_slack.sh() {
-	modulefile="${FUNCNAME[0]}"
-	fn_fetch_module
-}
-# Logs
-
-core_logs.sh() {
-	modulefile="${FUNCNAME[0]}"
-	fn_fetch_module
-}
-
-# Query
-
-query_gamedig.sh() {
-	modulefile="${FUNCNAME[0]}"
-	fn_fetch_module
-}
-
-# Update
-
-command_update_modules.sh() {
-	modulefile="${FUNCNAME[0]}"
-	fn_fetch_module
-}
-
-command_update_linuxgsm.sh() {
-	modulefile="${FUNCNAME[0]}"
-	fn_fetch_module
-}
-
-command_update.sh() {
-	modulefile="${FUNCNAME[0]}"
-	fn_fetch_module
-}
-
-command_check_update.sh() {
-	modulefile="${FUNCNAME[0]}"
-	fn_fetch_module
-}
-
-update_ts3.sh() {
-	modulefile="${FUNCNAME[0]}"
-	fn_fetch_module
-}
-
-update_minecraft.sh() {
-	modulefile="${FUNCNAME[0]}"
-	fn_fetch_module
-}
-
-update_minecraft_bedrock.sh() {
-	modulefile="${FUNCNAME[0]}"
-	fn_fetch_module
-}
-
-update_papermc.sh() {
-	modulefile="${FUNCNAME[0]}"
-	fn_fetch_module
-}
-
-update_mta.sh() {
-	modulefile="${FUNCNAME[0]}"
-	fn_fetch_module
-}
-
-update_factorio.sh() {
-	modulefile="${FUNCNAME[0]}"
-	fn_fetch_module
-}
-
-update_jediknight2.sh() {
-	modulefile="${FUNCNAME[0]}"
-	fn_fetch_module
-}
-
-update_steamcmd.sh() {
-	modulefile="${FUNCNAME[0]}"
-	fn_fetch_module
-}
-
-update_vintagestory.sh() {
-	modulefile="${FUNCNAME[0]}"
-	fn_fetch_module
-}
-
-update_ut99.sh() {
-	modulefile="${FUNCNAME[0]}"
-	fn_fetch_module
-}
-
-fn_update_modules.sh() {
-	modulefile="${FUNCNAME[0]}"
-	fn_fetch_module
-}
-
-#
-## Installer modules
-#
-
-fn_autoinstall() {
-	autoinstall=1
-	command_install.sh
-}
-
-install_complete.sh() {
-	modulefile="${FUNCNAME[0]}"
-	fn_fetch_module
-}
-
-install_config.sh() {
-	modulefile="${FUNCNAME[0]}"
-	fn_fetch_module
-}
-
-install_factorio_save.sh() {
-	modulefile="${FUNCNAME[0]}"
-	fn_fetch_module
-}
-
-install_dst_token.sh() {
-	modulefile="${FUNCNAME[0]}"
-	fn_fetch_module
-}
-
-install_eula.sh() {
-	modulefile="${FUNCNAME[0]}"
-	fn_fetch_module
-}
-
-install_gsquery.sh() {
-	modulefile="${FUNCNAME[0]}"
-	fn_fetch_module
-}
-
-install_gslt.sh() {
-	modulefile="${FUNCNAME[0]}"
-	fn_fetch_module
-}
-
-install_header.sh() {
-	modulefile="${FUNCNAME[0]}"
-	fn_fetch_module
-}
-
-install_logs.sh() {
-	modulefile="${FUNCNAME[0]}"
-	fn_fetch_module
-}
-
-install_retry.sh() {
-	modulefile="${FUNCNAME[0]}"
-	fn_fetch_module
-}
-
-install_server_dir.sh() {
-	modulefile="${FUNCNAME[0]}"
-	fn_fetch_module
-}
-install_server_files.sh() {
-	modulefile="${FUNCNAME[0]}"
-	fn_fetch_module
-}
-
-install_stats.sh() {
-	modulefile="${FUNCNAME[0]}"
-	fn_fetch_module
-}
-
-install_steamcmd.sh() {
-	modulefile="${FUNCNAME[0]}"
-	fn_fetch_module
-}
-
-install_ts3.sh() {
-	modulefile="${FUNCNAME[0]}"
-	fn_fetch_module
-}
-
-install_ts3db.sh() {
-	modulefile="${FUNCNAME[0]}"
-	fn_fetch_module
-}
-
-install_ut2k4.sh() {
-	modulefile="${FUNCNAME[0]}"
-	fn_fetch_module
-}
-
-install_dl_ut2k4.sh() {
-	modulefile="${FUNCNAME[0]}"
-	fn_fetch_module
-}
-
-install_ut2k4_key.sh() {
-	modulefile="${FUNCNAME[0]}"
-	fn_fetch_module
-}
-
-# Calls code required for legacy servers
-core_legacy.sh
-
-# Creates tmp dir if missing
-if [ ! -d "${tmpdir}" ]; then
-	mkdir -p "${tmpdir}"
-fi
-
-# Creates lock dir if missing
-if [ ! -d "${lockdir}" ]; then
-	mkdir -p "${lockdir}"
-fi
-
-# Calls on-screen messages (bootstrap)
-core_messages.sh
-
-#Calls file downloader (bootstrap)
-core_dl.sh
-
-# Calls the global Ctrl-C trap
-core_trap.sh
diff --git a/lgsm/functions/core_steamcmd.sh b/lgsm/functions/core_steamcmd.sh
deleted file mode 100644
index 77dd12d5e..000000000
--- a/lgsm/functions/core_steamcmd.sh
+++ /dev/null
@@ -1,334 +0,0 @@
-#!/bin/bash
-# LinuxGSM core_steamcmd.sh module
-# Author: Daniel Gibbs
-# Contributors: http://linuxgsm.com/contrib
-# Website: https://linuxgsm.com
-# Description: Core functions for SteamCMD
-
-functionselfname="$(basename "$(readlink -f "${BASH_SOURCE[0]}")")"
-
-fn_install_steamcmd() {
-	if [ "${shortname}" == "ark" ] && [ "${installsteamcmd}" == "1" ]; then
-		steamcmddir="${serverfiles}/Engine/Binaries/ThirdParty/SteamCMD/Linux"
-	fi
-	if [ ! -d "${steamcmddir}" ]; then
-		mkdir -p "${steamcmddir}"
-	fi
-	fn_fetch_file "http://media.steampowered.com/client/steamcmd_linux.tar.gz" "" "" "" "${tmpdir}" "steamcmd_linux.tar.gz" "nochmodx" "norun" "noforce" "nohash"
-	fn_dl_extract "${tmpdir}" "steamcmd_linux.tar.gz" "${steamcmddir}"
-	chmod +x "${steamcmddir}/steamcmd.sh"
-}
-
-fn_check_steamcmd_user() {
-	# Checks if steamuser is setup.
-	if [ "${steamuser}" == "username" ]; then
-		fn_print_fail_nl "Steam login not set. Update steamuser in ${configdirserver}"
-		echo -e "	* Change steamuser=\"username\" to a valid steam login."
-		if [ -d "${lgsmlogdir}" ]; then
-			fn_script_log_fatal "Steam login not set. Update steamuser in ${configdirserver}"
-		fi
-		core_exit.sh
-	fi
-	# Anonymous user is set if steamuser is missing.
-	if [ -z "${steamuser}" ]; then
-		if [ -d "${lgsmlogdir}" ]; then
-			fn_script_log_info "Login to SteamCMD as: anonymous"
-		fi
-		steamuser="anonymous"
-		steampass=''
-	else
-		if [ -d "${lgsmlogdir}" ]; then
-			fn_script_log_info "Login to SteamCMD as: ${steamuser}"
-		fi
-	fi
-}
-
-fn_check_steamcmd() {
-	# Checks if SteamCMD exists when starting or updating a server.
-	# Only install if steamcmd package is missing or steamcmd dir is missing.
-	if [ ! -f "${steamcmddir}/steamcmd.sh" ] && [ -z "$(command -v steamcmd 2> /dev/null)" ]; then
-		if [ "${commandname}" == "INSTALL" ]; then
-			fn_install_steamcmd
-		else
-			fn_print_warn_nl "SteamCMD is missing"
-			fn_script_log_warn "SteamCMD is missing"
-			fn_install_steamcmd
-		fi
-	elif [ "${commandname}" == "INSTALL" ]; then
-		fn_print_information "SteamCMD is already installed..."
-		fn_print_ok_eol_nl
-	fi
-}
-
-fn_check_steamcmd_dir() {
-	# Worksround that pre-installs the correct steam directories to ensure all packages use the correct Standard.
-	# https://github.com/ValveSoftware/steam-for-linux/issues/6976#issuecomment-610446347
-
-	# Create Steam installation directory.
-	if [ ! -d "${XDG_DATA_HOME:="${HOME}/.local/share"}/Steam" ]; then
-		mkdir -p "${XDG_DATA_HOME:="${HOME}/.local/share"}/Steam"
-	fi
-
-	# Create common Steam directory.
-	if [ ! -d "${HOME}/.steam" ]; then
-		mkdir -p "${HOME}/.steam"
-	fi
-
-	# Symbolic links to Steam installation directory.
-	if [ ! -L "${HOME}/.steam/root" ]; then
-		if [ -d "${HOME}/.steam/root" ]; then
-			rm -f "${HOME:?}/.steam/root"
-		fi
-		ln -s "${XDG_DATA_HOME:="${HOME}/.local/share"}/Steam" "${HOME}/.steam/root"
-	fi
-
-	if [ ! -L "${HOME}/.steam/steam" ]; then
-		if [ -d "${HOME}/.steam/steam" ]; then
-			rm -rf "${HOME}/.steam/steam"
-		fi
-		ln -s "${XDG_DATA_HOME:="${HOME}/.local/share"}/Steam" "${HOME}/.steam/steam"
-	fi
-}
-
-fn_check_steamcmd_dir_legacy() {
-	# Remove old Steam installation directories ~/Steam and ${rootdir}/steamcmd
-	if [ -d "${rootdir}/steamcmd" ] && [ "${steamcmddir}" == "${XDG_DATA_HOME:="${HOME}/.local/share"}/Steam" ]; then
-		rm -rf "${rootdir:?}/steamcmd"
-	fi
-
-	if [ -d "${HOME}/Steam" ] && [ "${steamcmddir}" == "${XDG_DATA_HOME:="${HOME}/.local/share"}/Steam" ]; then
-		rm -rf "${HOME}/Steam"
-	fi
-}
-
-fn_check_steamcmd_steamapp() {
-	# Check that steamapp directory fixes issue #3481
-	if [ ! -d "${serverfiles}/steamapps" ]; then
-		mkdir -p "${serverfiles}/steamapps"
-	fi
-}
-
-fn_check_steamcmd_ark() {
-	# Checks if SteamCMD exists in
-	# Engine/Binaries/ThirdParty/SteamCMD/Linux
-	# to allow ark mods to work
-	if [ ! -f "${serverfiles}/Engine/Binaries/ThirdParty/SteamCMD/Linux/steamcmd.sh" ]; then
-		installsteamcmd=1
-		if [ "${commandname}" == "INSTALL" ]; then
-			fn_install_steamcmd
-		else
-			fn_print_warn_nl "ARK mods SteamCMD is missing"
-			fn_script_log_warn "ARK mods SteamCMD is missing"
-			fn_install_steamcmd
-		fi
-	elif [ "${commandname}" == "INSTALL" ]; then
-		fn_print_information "ARK mods SteamCMD is already installed..."
-		fn_print_ok_eol_nl
-	fi
-}
-
-fn_check_steamcmd_clear() {
-	# Will remove steamcmd dir if steamcmd package is installed.
-	if [ "$(command -v steamcmd 2> /dev/null)" ] && [ -d "${rootdir}/steamcmd" ]; then
-		rm -rf "${steamcmddir:?}"
-		exitcode=$?
-		if [ "${exitcode}" != 0 ]; then
-			fn_script_log_fatal "Removing ${rootdir}/steamcmd"
-		else
-			fn_script_log_pass "Removing ${rootdir}/steamcmd"
-		fi
-	fi
-}
-
-fn_check_steamcmd_exec() {
-	if [ "$(command -v steamcmd 2> /dev/null)" ]; then
-		steamcmdcommand="steamcmd"
-	else
-		steamcmdcommand="./steamcmd.sh"
-	fi
-}
-
-fn_update_steamcmd_localbuild() {
-	# Gets local build info.
-	fn_print_dots "Checking local build: ${remotelocation}"
-	fn_appmanifest_check
-	# Uses appmanifest to find local build.
-	localbuild=$(grep buildid "${appmanifestfile}" | tr '[:blank:]"' ' ' | tr -s ' ' | cut -d\  -f3)
-
-	# Set branch to public if no custom branch.
-	if [ -z "${branch}" ]; then
-		branch="public"
-	fi
-
-	# Checks if localbuild variable has been set.
-	if [ -z "${localbuild}" ]; then
-		fn_print_fail "Checking local build: ${remotelocation}: missing local build info"
-		fn_script_log_fatal "Missing local build info"
-		core_exit.sh
-	else
-		fn_print_ok "Checking local build: ${remotelocation}"
-		fn_script_log_pass "Checking local build"
-	fi
-}
-
-fn_update_steamcmd_remotebuild() {
-	# Get remote build info.
-	if [ -d "${steamcmddir}" ]; then
-		cd "${steamcmddir}" || exit
-	fi
-
-	# Removes appinfo.vdf as a fix for not always getting up to date version info from SteamCMD.
-	if [ "$(find "${HOME}" -type f -name "appinfo.vdf" | wc -l)" -ne "0" ]; then
-		find "${HOME}" -type f -name "appinfo.vdf" -exec rm -f {} \;
-	fi
-
-	# password for branch not needed to check the buildid
-	remotebuildversion=$(${steamcmdcommand} +login "${steamuser}" "${steampass}" +app_info_update 1 +app_info_print "${appid}" +quit | sed -e '/"branches"/,/^}/!d' | sed -n "/\"${branch}\"/,/}/p" | grep -m 1 buildid | tr -cd '[:digit:]')
-
-	if [ "${firstcommandname}" != "INSTALL" ]; then
-		fn_print_dots "Checking remote build: ${remotelocation}"
-		# Checks if remotebuildversion variable has been set.
-		if [ -z "${remotebuildversion}" ] || [ "${remotebuildversion}" == "null" ]; then
-			fn_print_fail "Checking remote build: ${remotelocation}"
-			fn_script_log_fatal "Checking remote build"
-			core_exit.sh
-		else
-			fn_print_ok "Checking remote build: ${remotelocation}"
-			fn_script_log_pass "Checking remote build"
-		fi
-	else
-		# Checks if remotebuild variable has been set.
-		if [ -z "${remotebuildversion}" ] || [ "${remotebuildversion}" == "null" ]; then
-			fn_print_failure "Unable to get remote build"
-			fn_script_log_fatal "Unable to get remote build"
-			core_exit.sh
-		fi
-	fi
-}
-
-fn_update_steamcmd_compare() {
-	fn_print_dots "Checking for update: ${remotelocation}"
-	if [ "${localbuild}" != "${remotebuildversion}" ] || [ "${forceupdate}" == "1" ]; then
-		fn_print_ok_nl "Checking for update: ${remotelocation}"
-		echo -en "\n"
-		echo -e "Update available"
-		echo -e "* Local build: ${red}${localbuild}${default}"
-		echo -e "* Remote build: ${green}${remotebuildversion}${default}"
-		if [ -n "${branch}" ]; then
-			echo -e "* Branch: ${branch}"
-		fi
-		if [ -n "${betapassword}" ]; then
-			echo -e "* Branch password: ${betapassword}"
-		fi
-		echo -e "https://steamdb.info/app/${appid}/"
-		echo -en "\n"
-		fn_script_log_info "Update available"
-		fn_script_log_info "Local build: ${localbuild}"
-		fn_script_log_info "Remote build: ${remotebuildversion}"
-		if [ -n "${branch}" ]; then
-			fn_script_log_info "Branch: ${branch}"
-		fi
-		if [ -n "${betapassword}" ]; then
-			fn_script_log_info "Branch password: ${betapassword}"
-		fi
-		fn_script_log_info "${localbuild} > ${remotebuildversion}"
-
-		if [ "${commandname}" == "UPDATE" ]; then
-			unset updateonstart
-			check_status.sh
-			# If server stopped.
-			if [ "${status}" == "0" ]; then
-				fn_dl_steamcmd
-			# If server started.
-			else
-				fn_print_restart_warning
-				exitbypass=1
-				command_stop.sh
-				fn_firstcommand_reset
-				exitbypass=1
-				fn_dl_steamcmd
-				exitbypass=1
-				command_start.sh
-				fn_firstcommand_reset
-			fi
-			unset exitbypass
-			date +%s > "${lockdir}/lastupdate.lock"
-			alert="update"
-		elif [ "${commandname}" == "CHECK-UPDATE" ]; then
-			alert="check-update"
-		fi
-		alert.sh
-	else
-		fn_print_ok_nl "Checking for update: ${remotelocation}"
-		echo -en "\n"
-		echo -e "No update available"
-		echo -e "* Local build: ${green}${localbuild}${default}"
-		echo -e "* Remote build: ${green}${remotebuildversion}${default}"
-		if [ -n "${branch}" ]; then
-			echo -e "* Branch: ${branch}"
-		fi
-		if [ -n "${betapassword}" ]; then
-			echo -e "* Branch password: ${betapassword}"
-		fi
-		echo -e "https://steamdb.info/app/${appid}/"
-		echo -en "\n"
-		fn_script_log_info "No update available"
-		fn_script_log_info "Local build: ${localbuild}"
-		fn_script_log_info "Remote build: ${remotebuildversion}"
-		if [ -n "${branch}" ]; then
-			fn_script_log_info "Branch: ${branch}"
-		fi
-		if [ -n "${betapassword}" ]; then
-			fn_script_log_info "Branch password: ${betapassword}"
-		fi
-	fi
-}
-
-fn_appmanifest_info() {
-	appmanifestfile=$(find -L "${serverfiles}" -type f -name "appmanifest_${appid}.acf")
-	appmanifestfilewc=$(find -L "${serverfiles}" -type f -name "appmanifest_${appid}.acf" | wc -l)
-}
-
-fn_appmanifest_check() {
-	fn_appmanifest_info
-	# Multiple or no matching appmanifest files may sometimes be present.
-	# This error is corrected if required.
-	if [ "${appmanifestfilewc}" -ge "2" ]; then
-		fn_print_error "Multiple appmanifest_${appid}.acf files found"
-		fn_script_log_error "Multiple appmanifest_${appid}.acf files found"
-		fn_print_dots "Removing x${appmanifestfilewc} appmanifest_${appid}.acf files"
-		for appfile in ${appmanifestfile}; do
-			rm -f "${appfile:?}"
-		done
-		appmanifestfilewc1="${appmanifestfilewc}"
-		fn_appmanifest_info
-		# if error can not be resolved.
-		if [ "${appmanifestfilewc}" -ge "2" ]; then
-			fn_print_fail "Unable to remove x${appmanifestfilewc} appmanifest_${appid}.acf files"
-			fn_script_log_fatal "Unable to remove x${appmanifestfilewc} appmanifest_${appid}.acf files"
-			echo -e "* Check user permissions"
-			for appfile in ${appmanifestfile}; do
-				echo -e "	${appfile}"
-			done
-			core_exit.sh
-		else
-			fn_print_ok "Removed x${appmanifestfilewc1} appmanifest_${appid}.acf files"
-			fn_script_log_pass "Removed x${appmanifestfilewc1} appmanifest_${appid}.acf files"
-			fn_print_info_nl "Forcing update to correct issue"
-			fn_script_log_info "Forcing update to correct issue"
-			fn_dl_steamcmd
-		fi
-	elif [ "${appmanifestfilewc}" -eq "0" ]; then
-		fn_print_error_nl "No appmanifest_${appid}.acf found"
-		fn_script_log_error "No appmanifest_${appid}.acf found"
-		fn_print_info_nl "Forcing update to correct issue"
-		fn_script_log_info "Forcing update to correct issue"
-		fn_dl_steamcmd
-		fn_appmanifest_info
-		if [ "${appmanifestfilewc}" -eq "0" ]; then
-			fn_print_fail_nl "Still no appmanifest_${appid}.acf found"
-			fn_script_log_fatal "Still no appmanifest_${appid}.acf found"
-			core_exit.sh
-		fi
-	fi
-}
diff --git a/lgsm/functions/core_trap.sh b/lgsm/functions/core_trap.sh
deleted file mode 100644
index ae2b79470..000000000
--- a/lgsm/functions/core_trap.sh
+++ /dev/null
@@ -1,22 +0,0 @@
-#!/bin/bash
-# LinuxGSM core_trap.sh module
-# Author: Daniel Gibbs
-# Contributors: http://linuxgsm.com/contrib
-# Website: https://linuxgsm.com
-# Description: Handles CTRL-C trap to give an exit code.
-
-functionselfname="$(basename "$(readlink -f "${BASH_SOURCE[0]}")")"
-
-fn_exit_trap() {
-	if [ -z "${exitcode}" ]; then
-		exitcode=$?
-	fi
-	echo -e ""
-	if [ -z "${exitcode}" ]; then
-		exitcode=0
-	fi
-	core_exit.sh
-}
-
-# trap to give an exit code.
-trap fn_exit_trap INT
diff --git a/lgsm/functions/fix.sh b/lgsm/functions/fix.sh
deleted file mode 100644
index 57f6a91fa..000000000
--- a/lgsm/functions/fix.sh
+++ /dev/null
@@ -1,88 +0,0 @@
-#!/bin/bash
-# LinuxGSM fix.sh module
-# Author: Daniel Gibbs
-# Contributors: http://linuxgsm.com/contrib
-# Website: https://linuxgsm.com
-# Description: Overall function for managing fixes.
-# Runs functions that will fix an issue.
-
-functionselfname="$(basename "$(readlink -f "${BASH_SOURCE[0]}")")"
-
-# Messages that are displayed for some fixes.
-fn_fix_msg_start() {
-	fn_print_dots "Applying ${fixname} fix: ${gamename}"
-	fn_print_info "Applying ${fixname} fix: ${gamename}"
-	fn_script_log_info "Applying ${fixname} fix: ${gamename}"
-}
-
-fn_fix_msg_start_nl() {
-	fn_print_dots "Applying ${fixname} fix: ${gamename}"
-	fn_print_info_nl "Applying ${fixname} fix: ${gamename}"
-	fn_script_log_info "Applying ${fixname} fix: ${gamename}"
-}
-
-fn_fix_msg_end() {
-	if [ $? != 0 ]; then
-		fn_print_error_nl "Applying ${fixname} fix: ${gamename}"
-		fn_script_log_error "Applying ${fixname} fix: ${gamename}"
-	else
-		fn_print_ok_nl "Applying ${fixname} fix: ${gamename}"
-		fn_script_log_pass "Applying ${fixname} fix: ${gamename}"
-	fi
-}
-
-fn_exists_fix() {
-	local short="${1:?}"
-
-	if [ "$(type -t "fix_${short}.sh")" == 'function' ]; then
-		return 0
-	else
-		return 1
-	fi
-}
-
-fn_apply_fix() {
-	local phase_message="${1:?}"
-	local short="${2:?}"
-
-	if fn_exists_fix "${short}"; then
-		"fix_${short}.sh"
-	else
-		fn_print_error_nl "${shortname} is marked to apply pre start fix but there is no fix registered"
-	fi
-}
-
-apply_pre_start_fix=(arma3 armar ark av bt bo csgo cmw dst hw ins nmrih onset rust rw sdtd sfc sof2 squad st tf2 terraria ts3 mcb mta unt vh wurm zmr)
-apply_post_install_fix=(av kf kf2 lo ro samp ut2k4 ut ut3)
-
-# validate registered fixes for safe development
-for fix in "${apply_pre_start_fix[@]}" "${apply_post_install_fix[@]}"; do
-	if ! fn_exists_fix "${fix}"; then
-		fn_print_fail_nl "fix_${fix}.sh is registered but doesn't exist. Typo or did you miss to modify core_functions.sh?"
-		exitcode 1
-		core_exit.sh
-	fi
-done
-
-# Fixes that are run on start.
-if [ "${commandname}" != "INSTALL" ] && [ -z "${fixbypass}" ]; then
-	if [ "${appid}" ]; then
-		fix_steamcmd.sh
-	fi
-
-	if grep -qEe "(^|\s)${shortname}(\s|$)" <<< "${apply_pre_start_fix[@]}"; then
-		fn_apply_fix "pre start" "${shortname}"
-	fi
-fi
-
-# Fixes that are run on install only.
-if [ "${commandname}" == "INSTALL" ]; then
-	if grep -qEe "(^|\s)${shortname}(\s|$)" <<< "${apply_post_install_fix[@]}"; then
-		echo -e ""
-		echo -e "${lightyellow}Applying Post-Install Fixes${default}"
-		echo -e "================================="
-		fn_sleep_time
-		postinstall=1
-		fn_apply_fix "post install" "${shortname}"
-	fi
-fi
diff --git a/lgsm/functions/fix_ark.sh b/lgsm/functions/fix_ark.sh
deleted file mode 100644
index f8e0447e3..000000000
--- a/lgsm/functions/fix_ark.sh
+++ /dev/null
@@ -1,62 +0,0 @@
-#!/bin/bash
-# LinuxGSM fix_ark.sh module
-# Author: Daniel Gibbs
-# Contributors: http://linuxgsm.com/contrib
-# Website: https://linuxgsm.com
-# Description: Resolves various issues with ARK: Survival Evolved.
-
-functionselfname="$(basename "$(readlink -f "${BASH_SOURCE[0]}")")"
-
-# removes mulitple appworkshop_346110.acf if found.
-steamappsfilewc="$(find "${HOME}" -name appworkshop_346110.acf | wc -l)"
-if [ "${steamappsfilewc}" -gt "1" ]; then
-	fixname="multiple appworkshop acf files"
-	fn_fix_msg_start
-	find "${HOME}" -name appworkshop_346110.acf -exec rm -f {} \;
-	fn_fix_msg_end
-elif [ "${steamappsfilewc}" -eq "1" ]; then
-	# Steam mods directory selecter
-	# This allows LinxuGSM to select either ~/.steam or ~/Steam. depending on what is being used
-	steamappsfile=$(find "${HOME}" -name appworkshop_346110.acf)
-	steamappsdir=$(dirname "${steamappsfile}")
-	steamappspath=$(
-		cd "${steamappsdir}" || return
-		cd ../
-		pwd
-	)
-
-	# removes the symlink if exists.
-	# fixes issue with older versions of LinuxGSM linking to /home/arkserver/steamcmd
-	if [ -L "${serverfiles}/Engine/Binaries/ThirdParty/SteamCMD/Linux" ]; then
-		fixname="broken SteamCMD symlink"
-		fn_fix_msg_start
-		unlink "${serverfiles:?}/Engine/Binaries/ThirdParty/SteamCMD/Linux"
-		fn_fix_msg_end
-		check_steamcmd.sh
-	fi
-
-	# removed ARK steamcmd directory if steamcmd is missing.
-	if [ ! -f "${serverfiles}/Engine/Binaries/ThirdParty/SteamCMD/Linux/steamcmd.sh" ]; then
-		fixname="remove invalid ARK SteamCMD directory"
-		fn_fix_msg_start
-		rm -rf "${serverfiles:?}/Engine/Binaries/ThirdParty/SteamCMD/Linux"
-		fn_fix_msg_end
-		check_steamcmd.sh
-	fi
-
-	# if the steamapps symlink is incorrect unlink it.
-	if [ -d "${serverfiles}/Engine/Binaries/ThirdParty/SteamCMD/Linux" ] && [ -L "${serverfiles}/Engine/Binaries/ThirdParty/SteamCMD/Linux/steamapps" ] && [ "$(readlink "${serverfiles}/Engine/Binaries/ThirdParty/SteamCMD/Linux/steamapps")" != "${steamappspath}" ]; then
-		fixname="incorrect steamapps symlink"
-		fn_fix_msg_start
-		unlink "${serverfiles:?}/Engine/Binaries/ThirdParty/SteamCMD/Linux/steamapps"
-		fn_fix_msg_end
-	fi
-
-	# Put symlink to steamapps directory into the ARK SteamCMD directory to link the downloaded mods to the correct location.
-	if [ ! -L "${serverfiles}/Engine/Binaries/ThirdParty/SteamCMD/Linux/steamapps" ]; then
-		fixname="steamapps symlink"
-		fn_fix_msg_start
-		ln -s "${steamappspath}" "${serverfiles}/Engine/Binaries/ThirdParty/SteamCMD/Linux/steamapps"
-		fn_fix_msg_end
-	fi
-fi
diff --git a/lgsm/functions/fix_arma3.sh b/lgsm/functions/fix_arma3.sh
deleted file mode 100644
index bbf14c9d2..000000000
--- a/lgsm/functions/fix_arma3.sh
+++ /dev/null
@@ -1,16 +0,0 @@
-#!/bin/bash
-# LinuxGSM fix_arma3.sh module
-# Author: Daniel Gibbs
-# Contributors: http://linuxgsm.com/contrib
-# Website: https://linuxgsm.com
-# Description: Resolves an issue with ARMA3.
-
-functionselfname="$(basename "$(readlink -f "${BASH_SOURCE[0]}")")"
-
-# Fixes: 20150 Segmentation fault (core dumped) error.
-if [ ! -d "${XDG_DATA_HOME:="${HOME}/.local/share"}/Arma 3" ] || [ ! -d "${XDG_DATA_HOME:="${HOME}/.local/share"}/Arma 3 - Other Profiles" ]; then
-	fixname="20150 Segmentation fault (core dumped)"
-	fn_fix_msg_start
-	mkdir -p "${XDG_DATA_HOME:="${HOME}/.local/share"}/Arma 3 - Other Profiles"
-	fn_fix_msg_end
-fi
diff --git a/lgsm/functions/fix_armar.sh b/lgsm/functions/fix_armar.sh
deleted file mode 100644
index 9db42f51a..000000000
--- a/lgsm/functions/fix_armar.sh
+++ /dev/null
@@ -1,17 +0,0 @@
-#!/bin/bash
-# LinuxGSM fix_armar.sh module
-# Author: Daniel Gibbs
-# Contributors: http://linuxgsm.com/contrib
-# Website: https://linuxgsm.com
-# Description: Resolves an issue with Arma Reforger.
-
-functionselfname="$(basename "$(readlink -f "${BASH_SOURCE[0]}")")"
-
-# Fixes: Profile directory doesn't exist.
-# Issue Link: https://feedback.bistudio.com/T164845
-if [ ! -d "${serverprofilefullpath}" ]; then
-	fixname="Profile directory doesn't exist"
-	fn_fix_msg_start
-	mkdir -p "${serverprofilefullpath}"
-	fn_fix_msg_end
-fi
diff --git a/lgsm/functions/fix_av.sh b/lgsm/functions/fix_av.sh
deleted file mode 100644
index a61a8be65..000000000
--- a/lgsm/functions/fix_av.sh
+++ /dev/null
@@ -1,19 +0,0 @@
-#!/bin/bash
-# LinuxGSM fix_av.sh module
-# Author: Daniel Gibbs
-# Contributors: http://linuxgsm.com/contrib
-# Website: https://linuxgsm.com
-# Description: Resolves startup issue with Avorion
-
-functionselfname="$(basename "$(readlink -f "${BASH_SOURCE[0]}")")"
-
-export LD_LIBRARY_PATH="$LD_LIBRARY_PATH:${serverfiles}:${serverfiles}/linux64"
-
-# Generates the server config if it doesn't exist.
-if [ ! -f "${servercfgfullpath}" ]; then
-	startparameters="--datapath ${avdatapath} --galaxy-name ${selfname} --init-folders-only"
-	fn_print_information "starting ${gamename} server to generate configs."
-	fn_sleep_time
-	cd "${systemdir}" || exit
-	eval "${executable} ${startparameters}"
-fi
diff --git a/lgsm/functions/fix_bo.sh b/lgsm/functions/fix_bo.sh
deleted file mode 100644
index 453691874..000000000
--- a/lgsm/functions/fix_bo.sh
+++ /dev/null
@@ -1,10 +0,0 @@
-#!/bin/bash
-# LinuxGSM fix_hw.sh module
-# Author: Daniel Gibbs
-# Contributors: http://linuxgsm.com/contrib
-# Website: https://linuxgsm.com
-# Description: Resolves various issues with Ballistic Overkill.
-
-functionselfname="$(basename "$(readlink -f "${BASH_SOURCE[0]}")")"
-
-export LD_LIBRARY_PATH="$LD_LIBRARY_PATH:${serverfiles}:${serverfiles}/BODS_Data/Plugins/x86_64"
diff --git a/lgsm/functions/fix_bt.sh b/lgsm/functions/fix_bt.sh
deleted file mode 100644
index 07fd61ce5..000000000
--- a/lgsm/functions/fix_bt.sh
+++ /dev/null
@@ -1,24 +0,0 @@
-#!/bin/bash
-# LinuxGSM fix_bt.sh module
-# Author: Daniel Gibbs
-# Contributors: http://linuxgsm.com/contrib
-# Website: https://linuxgsm.com
-# Description: Resolves an issue with Barotrauma.
-
-functionselfname="$(basename "$(readlink -f "${BASH_SOURCE[0]}")")"
-
-# Fixes: Missing user data directory error.
-if [ ! -d "${XDG_DATA_HOME:="${HOME}/.local/share"}/Daedalic Entertainment GmbH/Barotrauma" ]; then
-	fixname="Missing user data directory error."
-	fn_fix_msg_start
-	mkdir -p "${XDG_DATA_HOME:="${HOME}/.local/share"}/Daedalic Entertainment GmbH/Barotrauma"
-	fn_fix_msg_end
-fi
-
-# check if startscript is with windows line endings and reformat it
-if file -b "${serverfiles}${executable:1}" | grep -q CRLF; then
-	fixname="Convert ${executable:2} to unix file format"
-	fn_fix_msg_start
-	dos2unix -q "${serverfiles}${executable:1}"
-	fn_fix_msg_end
-fi
diff --git a/lgsm/functions/fix_cmw.sh b/lgsm/functions/fix_cmw.sh
deleted file mode 100644
index 192f483e8..000000000
--- a/lgsm/functions/fix_cmw.sh
+++ /dev/null
@@ -1,23 +0,0 @@
-#!/bin/bash
-# LinuxGSM fix_cmw.sh module
-# Author: Daniel Gibbs
-# Contributors: http://linuxgsm.com/contrib
-# Website: https://linuxgsm.com
-# Description: Resolves the issue of the not starting server on linux
-
-functionselfname="$(basename "$(readlink -f "${BASH_SOURCE[0]}")")"
-
-if [ ! -f "${executabledir}/steam_appid.txt" ]; then
-	fixname="steam_appid.txt"
-	fn_fix_msg_start
-	echo 219640 > "${executabledir}/steam_appid.txt"
-	fn_fix_msg_end
-fi
-
-if [ ! -f "${servercfgfullpath}" ]; then
-	fn_fix_msg_start
-	fixname="copy config"
-	mkdir "${servercfgdir}"
-	cp "${systemdir}/UDKGame/Config/"*.ini "${servercfgdir}"
-	fn_fix_msg_end
-fi
diff --git a/lgsm/functions/fix_csgo.sh b/lgsm/functions/fix_csgo.sh
deleted file mode 100644
index a393f2fd9..000000000
--- a/lgsm/functions/fix_csgo.sh
+++ /dev/null
@@ -1,42 +0,0 @@
-#!/bin/bash
-# LinuxGSM fix_csgo.sh module
-# Author: Daniel Gibbs
-# Contributors: http://linuxgsm.com/contrib
-# Website: https://linuxgsm.com
-# Description: Resolves various issues with CS:GO.
-
-functionselfname="$(basename "$(readlink -f "${BASH_SOURCE[0]}")")"
-
-# Fixes: server not always creating steam_appid.txt file.
-if [ ! -f "${serverfiles}/steam_appid.txt" ]; then
-	fixname="730 steam_appid.txt"
-	fn_fix_msg_start
-	echo -n "730" >> "${serverfiles}/steam_appid.txt"
-	fn_fix_msg_end
-fi
-
-# Fixes: Error parsing BotProfile.db - unknown attribute 'Rank'".
-if [ -f "${systemdir}/botprofile.db" ] && grep "^\s*Rank" "${systemdir}/botprofile.db" > /dev/null 2>&1; then
-	fixname="botprofile.db"
-	fn_fix_msg_start
-	sed -i 's/^\s*Rank/\t\/\/Rank/g' "${systemdir}/botprofile.db" > /dev/null 2>&1
-	fn_fix_msg_end
-fi
-
-# Fixes: Unknown command "cl_bobamt_vert" and exec: couldn't exec joystick.cfg.
-if [ -f "${servercfgdir}/valve.rc" ] && grep -E '^\s*exec\s*(default|joystick)\.cfg' "${servercfgdir}/valve.rc" > /dev/null 2>&1; then
-	fixname="valve.rc"
-	fn_fix_msg_start
-	sed -i 's/^\s*exec\s*default.cfg/\/\/exec default.cfg/g' "${servercfgdir}/valve.rc" > /dev/null 2>&1
-	sed -i 's/^\s*exec\s*joystick.cfg/\/\/exec joystick.cfg/g' "${servercfgdir}/valve.rc" > /dev/null 2>&1
-	fn_fix_msg_end
-fi
-
-# Fixes: Detected engine 11 but could not load: /home/csgo/serverfiles/bin/libgcc_s.so.1: version `GCC_7.0.0' not found (required by /lib/i386-linux-gnu/libstdc++.so.6)
-libgccc_so="${serverfiles}/bin/libgcc_s.so.1"
-if [ -f "${libgccc_so}" ]; then
-	fixname="libgcc_s.so.1 move away"
-	fn_fix_msg_start
-	mv -v "${libgccc_so}" "${libgccc_so}.bck"
-	fn_fix_msg_end
-fi
diff --git a/lgsm/functions/fix_dst.sh b/lgsm/functions/fix_dst.sh
deleted file mode 100644
index e30507dc9..000000000
--- a/lgsm/functions/fix_dst.sh
+++ /dev/null
@@ -1,17 +0,0 @@
-#!/bin/bash
-# LinuxGSM fix_dst.sh module
-# Author: Daniel Gibbs
-# Contributors: http://linuxgsm.com/contrib
-# Website: https://linuxgsm.com
-# Description: Resolves various issues with Don't Starve Together.
-
-functionselfname="$(basename "$(readlink -f "${BASH_SOURCE[0]}")")"
-
-# Fixes: ./dontstarve_dedicated_server_nullrenderer: ./lib32/libcurl-gnutls.so.4: no version information available (required by ./dontstarve_dedicated_server_nullrenderer).
-# Issue only occures on CentOS as libcurl-gnutls.so.4 is called libcurl.so.4 on CentOS.
-if [ -f "/etc/redhat-release" ] && [ ! -f "${serverfiles}/bin/lib32/libcurl-gnutls.so.4" ]; then
-	fixname="libcurl-gnutls.so.4"
-	fn_fix_msg_start
-	ln -s "/usr/lib/libcurl.so.4" "${serverfiles}/bin/lib32/libcurl-gnutls.so.4"
-	fn_fix_msg_end
-fi
diff --git a/lgsm/functions/fix_hw.sh b/lgsm/functions/fix_hw.sh
deleted file mode 100644
index af06924db..000000000
--- a/lgsm/functions/fix_hw.sh
+++ /dev/null
@@ -1,10 +0,0 @@
-#!/bin/bash
-# LinuxGSM fix_hw.sh module
-# Author: Daniel Gibbs
-# Contributors: http://linuxgsm.com/contrib
-# Website: https://linuxgsm.com
-# Description: Resolves various issues with Hurtworld.
-
-functionselfname="$(basename "$(readlink -f "${BASH_SOURCE[0]}")")"
-
-export LD_LIBRARY_PATH="$LD_LIBRARY_PATH:${serverfiles}:${serverfiles}/Hurtworld_Data/Plugins/x86_64"
diff --git a/lgsm/functions/fix_ins.sh b/lgsm/functions/fix_ins.sh
deleted file mode 100644
index 21a979c4c..000000000
--- a/lgsm/functions/fix_ins.sh
+++ /dev/null
@@ -1,20 +0,0 @@
-#!/bin/bash
-# LinuxGSM fix_ins.sh module
-# Author: Daniel Gibbs
-# Contributors: http://linuxgsm.com/contrib
-# Website: https://linuxgsm.com
-# Description: Resolves various issues with Insurgency.
-
-functionselfname="$(basename "$(readlink -f "${BASH_SOURCE[0]}")")"
-
-# Fixes: ./srcds_linux: error while loading shared libraries: libtier0.so: cannot open shared object file: No such file or directory.
-
-export LD_LIBRARY_PATH="$LD_LIBRARY_PATH:${serverfiles}:${serverfiles}/bin"
-
-# Fixes: issue #529 - gamemode not passed to debug or start.
-
-if [ "${commandname}" == "DEBUG" ]; then
-	defaultmap="\"${defaultmap}\""
-else
-	defaultmap="\\\"${defaultmap}\\\""
-fi
diff --git a/lgsm/functions/fix_kf.sh b/lgsm/functions/fix_kf.sh
deleted file mode 100644
index e749a2d27..000000000
--- a/lgsm/functions/fix_kf.sh
+++ /dev/null
@@ -1,36 +0,0 @@
-#!/bin/bash
-# LinuxGSM fix_kf.sh module
-# Author: Daniel Gibbs
-# Contributors: http://linuxgsm.com/contrib
-# Website: https://linuxgsm.com
-# Description: Resolves various issues with Killing Floor.
-
-functionselfname="$(basename "$(readlink -f "${BASH_SOURCE[0]}")")"
-
-echo -e "Applying WebAdmin ROOst.css fix."
-echo -e "http://forums.tripwireinteractive.com/showpost.php?p=585435&postcount=13"
-sed -i 's/none}/none;/g' "${serverfiles}/Web/ServerAdmin/ROOst.css"
-sed -i 's/underline}/underline;/g' "${serverfiles}/Web/ServerAdmin/ROOst.css"
-fn_sleep_time
-echo -e "Applying WebAdmin CharSet fix."
-echo -e "http://forums.tripwireinteractive.com/showpost.php?p=442340&postcount=1"
-sed -i 's/CharSet="iso-8859-1"/CharSet="utf-8"/g' "${systemdir}/UWeb.int"
-fn_sleep_time
-echo -e "applying server name fix."
-fn_sleep_time
-echo -e "forcing server restart..."
-fn_sleep_time
-exitbypass=1
-command_start.sh
-fn_firstcommand_reset
-sleep 5
-exitbypass=1
-command_stop.sh
-fn_firstcommand_reset
-exitbypass=1
-command_start.sh
-fn_firstcommand_reset
-sleep 5
-exitbypass=1
-command_stop.sh
-fn_firstcommand_reset
diff --git a/lgsm/functions/fix_kf2.sh b/lgsm/functions/fix_kf2.sh
deleted file mode 100644
index b680a9937..000000000
--- a/lgsm/functions/fix_kf2.sh
+++ /dev/null
@@ -1,20 +0,0 @@
-#!/bin/bash
-# LinuxGSM fix_kf2.sh module
-# Author: Daniel Gibbs
-# Contributors: http://linuxgsm.com/contrib
-# Website: https://linuxgsm.com
-# Description: Resolves various issues with Killing Floor 2.
-
-functionselfname="$(basename "$(readlink -f "${BASH_SOURCE[0]}")")"
-
-startparameters="\"${defaultmap}?Game=KFGameContent.KFGameInfo_VersusSurvival\""
-
-fn_print_information "starting ${gamename} server to generate configs."
-fn_sleep_time
-exitbypass=1
-command_start.sh
-fn_firstcommand_reset
-sleep 10
-exitbypass=1
-command_stop.sh
-fn_firstcommand_reset
diff --git a/lgsm/functions/fix_lo.sh b/lgsm/functions/fix_lo.sh
deleted file mode 100644
index eec2ebd36..000000000
--- a/lgsm/functions/fix_lo.sh
+++ /dev/null
@@ -1,17 +0,0 @@
-#!/bin/bash
-# LinuxGSM fix_lo.sh function
-# Author: Daniel Gibbs
-# Website: https://linuxgsm.com
-# Description: Resolves installation issue with Last Oasis
-
-functionselfname="$(basename "$(readlink -f "${BASH_SOURCE[0]}")")"
-
-appidfile=${executabledir}/steam_appid.txt
-if [ ! -f "${appidfile}" ]; then
-	fn_print_information "adding ${appidfile} to ${gamename} server."
-	fn_sleep_time
-	echo "903950" > "${appidfile}"
-else
-	fn_print_information "${appidfile} already exists. No action to be taken."
-	fn_sleep_time
-fi
diff --git a/lgsm/functions/fix_mcb.sh b/lgsm/functions/fix_mcb.sh
deleted file mode 100644
index 4768a40cf..000000000
--- a/lgsm/functions/fix_mcb.sh
+++ /dev/null
@@ -1,11 +0,0 @@
-#!/bin/bash
-# LinuxGSM fix_mcb.sh module
-# Author: Daniel Gibbs
-# Contributors: http://linuxgsm.com/contrib
-# Website: https://linuxgsm.com
-# Description: Resolves possible startup issue with Minecraft Bedrock.
-
-functionselfname="$(basename "$(readlink -f "${BASH_SOURCE[0]}")")"
-
-# official docs state that the server should be started with: LD_LIBRARY_PATH=. ./bedrock_server
-export LD_LIBRARY_PATH="$LD_LIBRARY_PATH:${serverfiles}"
diff --git a/lgsm/functions/fix_mta.sh b/lgsm/functions/fix_mta.sh
deleted file mode 100644
index 2c92e8d12..000000000
--- a/lgsm/functions/fix_mta.sh
+++ /dev/null
@@ -1,16 +0,0 @@
-#!/bin/bash
-# LinuxGSM fix_mta.sh module
-# Author: Daniel Gibbs
-# Contributors: http://linuxgsm.com/contrib
-# Website: https://linuxgsm.com
-# Description: Installs the libmysqlclient for database functions on the server.
-
-functionselfname="$(basename "$(readlink -f "${BASH_SOURCE[0]}")")"
-
-if [ ! -f "${lgsmdir}/lib/libmysqlclient.so.16" ]; then
-	fixname="libmysqlclient16"
-	fn_fix_msg_start_nl
-	fn_sleep_time
-	fn_fetch_file "https://nightly.mtasa.com/files/modules/64/libmysqlclient.so.16" "" "" "" "${lgsmdir}/lib" "libmysqlclient.so.16" "chmodx" "norun" "noforce" "6c188e0f8fb5d7a29f4bc413b9fed6c2"
-	fn_fix_msg_end
-fi
diff --git a/lgsm/functions/fix_nmrih.sh b/lgsm/functions/fix_nmrih.sh
deleted file mode 100644
index 4bb70c6f9..000000000
--- a/lgsm/functions/fix_nmrih.sh
+++ /dev/null
@@ -1,17 +0,0 @@
-#!/bin/bash
-# LinuxGSM fix_nmrih.sh module
-# Author: Daniel Gibbs
-# Contributors: http://linuxgsm.com/contrib
-# Website: https://linuxgsm.com
-# Description: Create symlinks for renamed No More Room In Hell serverfiles.
-# Solution from Steam Community post: https://steamcommunity.com/app/224260/discussions/2/1732089092441769414/
-
-functionselfname="$(basename "$(readlink -f "${BASH_SOURCE[0]}")")"
-
-ln -s "${serverfiles}/bin/vphysics_srv.so" "${serverfiles}/bin/vphysics.so"
-ln -s "${serverfiles}/bin/studiorender_srv.so" "${serverfiles}/bin/studiorender.so"
-ln -s "${serverfiles}/bin/soundemittersystem_srv.so" "${serverfiles}/bin/soundemittersystem.so"
-ln -s "${serverfiles}/bin/shaderapiempty_srv.so" "${serverfiles}/bin/shaderapiempty.so"
-ln -s "${serverfiles}/bin/scenefilecache_srv.so" "${serverfiles}/bin/scenefilecache.so"
-ln -s "${serverfiles}/bin/replay_srv.so" "${serverfiles}/bin/replay.so"
-ln -s "${serverfiles}/bin/materialsystem_srv.so" "${serverfiles}/bin/materialsystem.so"
diff --git a/lgsm/functions/fix_onset.sh b/lgsm/functions/fix_onset.sh
deleted file mode 100644
index e4183999d..000000000
--- a/lgsm/functions/fix_onset.sh
+++ /dev/null
@@ -1,19 +0,0 @@
-#!/bin/bash
-# LinuxGSM fix_onset.sh module
-# Author: Daniel Gibbs
-# Contributors: http://linuxgsm.com/contrib
-# Website: https://linuxgsm.com
-# Description: Resolves various issues with Onset.
-
-functionselfname="$(basename "$(readlink -f "${BASH_SOURCE[0]}")")"
-
-export LD_LIBRARY_PATH="$LD_LIBRARY_PATH:${serverfiles}"
-
-# Fixes: Failed loading "mariadb": libmariadbclient.so.18: cannot open shared object file: No such file or directory
-# Issue only occures on CentOS as libmariadbclient.so.18 is called libmariadb.so.3 on CentOS.
-if [ -f "/etc/redhat-release" ] && [ ! -f "${serverfiles}/libmariadbclient.so.18" ] && [ -f "/usr/lib64/libmariadb.so.3" ]; then
-	fixname="libmariadbclient.so.18"
-	fn_fix_msg_start
-	ln -s "/usr/lib64/libmariadb.so.3" "${serverfiles}/libmariadbclient.so.18"
-	fn_fix_msg_end
-fi
diff --git a/lgsm/functions/fix_ro.sh b/lgsm/functions/fix_ro.sh
deleted file mode 100644
index 895c7c2da..000000000
--- a/lgsm/functions/fix_ro.sh
+++ /dev/null
@@ -1,39 +0,0 @@
-#!/bin/bash
-# LinuxGSM fix_ro.sh module
-# Author: Daniel Gibbs
-# Contributors: http://linuxgsm.com/contrib
-# Website: https://linuxgsm.com
-# Description: Resolves various issues with Red Orchestra.
-
-functionselfname="$(basename "$(readlink -f "${BASH_SOURCE[0]}")")"
-
-echo -e "Applying WebAdmin ROOst.css fix."
-echo -e "http://forums.tripwireinteractive.com/showpost.php?p=585435&postcount=13"
-sed -i 's/none}/none;/g' "${serverfiles}/Web/ServerAdmin/ROOst.css"
-sed -i 's/underline}/underline;/g' "${serverfiles}/Web/ServerAdmin/ROOst.css"
-fn_sleep_time
-echo -e "Applying WebAdmin CharSet fix."
-echo -e "http://forums.tripwireinteractive.com/showpost.php?p=442340&postcount=1"
-sed -i 's/CharSet="iso-8859-1"/CharSet="utf-8"/g' "${systemdir}/uweb.int"
-fn_sleep_time
-echo -e "Applying Steam AppID fix."
-sed -i 's/1210/1200/g' "${systemdir}/steam_appid.txt"
-fn_sleep_time
-echo -e "applying server name fix."
-fn_sleep_time
-echo -e "forcing server restart..."
-fn_sleep_time
-exitbypass=1
-command_start.sh
-fn_firstcommand_reset
-sleep 5
-exitbypass=1
-command_stop.sh
-fn_firstcommand_reset
-exitbypass=1
-command_start.sh
-fn_firstcommand_reset
-sleep 5
-exitbypass=1
-command_stop.sh
-fn_firstcommand_reset
diff --git a/lgsm/functions/fix_rust.sh b/lgsm/functions/fix_rust.sh
deleted file mode 100644
index 5f407e89f..000000000
--- a/lgsm/functions/fix_rust.sh
+++ /dev/null
@@ -1,32 +0,0 @@
-#!/bin/bash
-# LinuxGSM fix_rust.sh module
-# Author: Daniel Gibbs
-# Contributors: http://linuxgsm.com/contrib
-# Website: https://linuxgsm.com
-# Description: Resolves startup issue with Rust.
-
-functionselfname="$(basename "$(readlink -f "${BASH_SOURCE[0]}")")"
-
-# Fixes: [Raknet] Server Shutting Down (Shutting Down).
-export LD_LIBRARY_PATH="$LD_LIBRARY_PATH:${serverfiles}:${serverfiles}/RustDedicated_Data/Plugins/x86_64"
-
-# Part of random seed feature.
-# If seed is not defined by user generate a seed file.
-if [ -z "${seed}" ] || [ "${seed}" == "0" ]; then
-	if [ ! -f "${datadir}/${selfname}-seed.txt" ]; then
-		shuf -i 1-2147483647 -n 1 > "${datadir}/${selfname}-seed.txt"
-		seed="$(cat "${datadir}/${selfname}-seed.txt")"
-		fn_print_info_nl "Generating new random seed (${cyan}${seed}${default})"
-		fn_script_log_pass "Generating new random seed (${cyan}${seed}${default})"
-	fi
-	seed="$(cat "${datadir}/${selfname}-seed.txt")"
-	randomseed=1
-fi
-
-# If Carbon mod is installed, run enviroment.sh
-if [ -f "${serverfiles}/carbon/tools/environment.sh" ]; then
-	fn_print_info_nl "Running Carbon environment.sh"
-	fn_script_log_info "Running Carbon environment.sh"
-	# shellcheck source=/dev/null
-	source "${serverfiles}/carbon/tools/environment.sh"
-fi
diff --git a/lgsm/functions/fix_rw.sh b/lgsm/functions/fix_rw.sh
deleted file mode 100644
index aef41a703..000000000
--- a/lgsm/functions/fix_rw.sh
+++ /dev/null
@@ -1,10 +0,0 @@
-#!/bin/bash
-# LinuxGSM fix_rw.sh module
-# Author: Daniel Gibbs
-# Contributors: http://linuxgsm.com/contrib
-# Website: https://linuxgsm.com
-# Description: Resolves various issues with Rising World.
-
-functionselfname="$(basename "$(readlink -f "${BASH_SOURCE[0]}")")"
-
-export LD_LIBRARY_PATH="$LD_LIBRARY_PATH:${serverfiles}:${serverfiles}/linux64"
diff --git a/lgsm/functions/fix_samp.sh b/lgsm/functions/fix_samp.sh
deleted file mode 100644
index a88bf154f..000000000
--- a/lgsm/functions/fix_samp.sh
+++ /dev/null
@@ -1,34 +0,0 @@
-#!/bin/bash
-# LinuxGSM fix_sfc.sh module
-# Author: Daniel Gibbs
-# Contributors: http://linuxgsm.com/contrib
-# Website: https://linuxgsm.com
-# Description: Resolves issue that the default rcon password is not changed
-
-functionselfname="$(basename "$(readlink -f "${BASH_SOURCE[0]}")")"
-
-if [ -f "${servercfgfullpath}" ]; then
-	# check if default password is set "changeme"
-	currentpass=$(grep -E "^rcon_password" "${servercfgfullpath}" | sed 's/^rcon_password //')
-	defaultpass="changeme"
-	# check if default password is set
-	if [ "${currentpass}" == "${defaultpass}" ]; then
-		fixname="change default rcon password"
-		fn_fix_msg_start
-		fn_script_log_info "changing rcon/admin password."
-		random=$(tr -dc A-Za-z0-9_ < /dev/urandom | head -c 8 | xargs)
-		rconpass="admin${random}"
-		sed -i "s/rcon_password changeme/rcon_password ${rconpass}/g" "${servercfgfullpath}"
-		fn_fix_msg_end
-	fi
-	# check if the hostname is the default name
-	currenthostname=$(grep -E "^hostname" "${servercfgfullpath}" | sed 's/^hostname //')
-	defaulthostname="SA-MP 0.3 Server"
-	if [ "${currenthostname}" == "${defaulthostname}" ]; then
-		fixname="change default hostname"
-		fn_fix_msg_start
-		fn_script_log_info "changing default hostname to LinuxGSM"
-		sed -i "s/hostname ${defaulthostname}/hostname LinuxGSM/g" "${servercfgfullpath}"
-		fn_fix_msg_end
-	fi
-fi
diff --git a/lgsm/functions/fix_sdtd.sh b/lgsm/functions/fix_sdtd.sh
deleted file mode 100644
index e93db7970..000000000
--- a/lgsm/functions/fix_sdtd.sh
+++ /dev/null
@@ -1,10 +0,0 @@
-#!/bin/bash
-# LinuxGSM fix_sdtd.sh module
-# Author: Daniel Gibbs
-# Contributors: http://linuxgsm.com/contrib
-# Website: https://linuxgsm.com
-# Description: Resolves various issues with 7 Days to Die.
-
-functionselfname="$(basename "$(readlink -f "${BASH_SOURCE[0]}")")"
-
-export LD_LIBRARY_PATH="$LD_LIBRARY_PATH:${serverfiles}/7DaysToDieServer_Data/Plugins/x86_64"
diff --git a/lgsm/functions/fix_sfc.sh b/lgsm/functions/fix_sfc.sh
deleted file mode 100644
index 51b95b9d5..000000000
--- a/lgsm/functions/fix_sfc.sh
+++ /dev/null
@@ -1,48 +0,0 @@
-#!/bin/bash
-# LinuxGSM fix_sfc.sh module
-# Author: Daniel Gibbs
-# Contributors: http://linuxgsm.com/contrib
-# Website: https://linuxgsm.com
-# Description: Resolves various issues with Source Forts Classic.
-
-functionselfname="$(basename "$(readlink -f "${BASH_SOURCE[0]}")")"
-
-if [ ! -f "${serverfiles}/bin/datacache.so" ]; then
-	ln -s "${serverfiles}/bin/datacache_srv.so" "${serverfiles}/bin/datacache.so"
-fi
-
-if [ ! -f "${serverfiles}/bin/dedicated.so" ]; then
-	ln -s "${serverfiles}/bin/dedicated_srv.so" "${serverfiles}/bin/dedicated.so"
-fi
-
-if [ ! -f "${serverfiles}/bin/engine.so" ]; then
-	ln -s "${serverfiles}/bin/engine_srv.so" "${serverfiles}/bin/engine.so"
-fi
-
-if [ ! -f "${serverfiles}/bin/materialsystem.so" ]; then
-	ln -s "${serverfiles}/bin/materialsystem_srv.so" "${serverfiles}/bin/materialsystem.so"
-fi
-
-if [ ! -f "${serverfiles}/bin/replay.so" ]; then
-	ln -s "${serverfiles}/bin/replay_srv.so" "${serverfiles}/bin/replay.so"
-fi
-
-if [ ! -f "${serverfiles}/bin/shaderapiempty.so" ]; then
-	ln -s "${serverfiles}/bin/shaderapiempty_srv.so" "${serverfiles}/bin/shaderapiempty.so"
-fi
-
-if [ ! -f "${serverfiles}/bin/soundemittersystem.so" ]; then
-	ln -s "${serverfiles}/bin/soundemittersystem_srv.so" "${serverfiles}/bin/soundemittersystem.so"
-fi
-
-if [ ! -f "${serverfiles}/bin/studiorender.so" ]; then
-	ln -s "${serverfiles}/bin/studiorender_srv.so" "${serverfiles}/bin/studiorender.so"
-fi
-
-if [ ! -f "${serverfiles}/bin/vphysics.so" ]; then
-	ln -s "${serverfiles}/bin/vphysics_srv.so" "${serverfiles}/bin/vphysics.so"
-fi
-
-if [ ! -f "${serverfiles}/bin/scenefilecache.so" ]; then
-	ln -s "${serverfiles}/bin/scenefilecache_srv.so" "${serverfiles}/bin/scenefilecache.so"
-fi
diff --git a/lgsm/functions/fix_sof2.sh b/lgsm/functions/fix_sof2.sh
deleted file mode 100644
index 002f42952..000000000
--- a/lgsm/functions/fix_sof2.sh
+++ /dev/null
@@ -1,11 +0,0 @@
-#!/bin/bash
-# LinuxGSM fix_rust.sh module
-# Author: Daniel Gibbs
-# Contributors: http://linuxgsm.com/contrib
-# Website: https://linuxgsm.com
-# Description: Resolves various issues with Soldier of Fortune 2.
-
-functionselfname="$(basename "$(readlink -f "${BASH_SOURCE[0]}")")"
-
-# Fixes: error while loading shared libraries: libcxa.so.1
-export LD_LIBRARY_PATH="$LD_LIBRARY_PATH:${serverfiles}"
diff --git a/lgsm/functions/fix_squad.sh b/lgsm/functions/fix_squad.sh
deleted file mode 100644
index 7d5929b5d..000000000
--- a/lgsm/functions/fix_squad.sh
+++ /dev/null
@@ -1,26 +0,0 @@
-#!/bin/bash
-# LinuxGSM fix_squad.sh module
-# Author: Daniel Gibbs
-# Contributors: http://linuxgsm.com/contrib
-# Website: https://linuxgsm.com
-# Description: Resolves various issues with Squad.
-
-functionselfname="$(basename "$(readlink -f "${BASH_SOURCE[0]}")")"
-
-# As the server base dir changed for the game, we need to migrate the default config from the old to the new location
-oldservercfg="${serverfiles}/Squad/ServerConfig/${servercfg}"
-if [ -f "${oldservercfg}" ] && [ -f "${servercfgfullpath}" ]; then
-	# diff old and new config - if it is different move the old config over the new one
-	if [ "$(diff -c "${oldservercfg}" "${servercfgfullpath}" | wc -l)" -gt 0 ]; then
-		fixname="Migrate server config to new Game folder"
-		fn_fix_msg_start
-		mv -v "${oldservercfg}" "${servercfgfullpath}"
-		fn_fix_msg_end
-	else
-		fixname="remove the same config from old configdir"
-		fn_fix_msg_start
-		rm -f "${oldservercfg}"
-		fn_fix_msg_end
-
-	fi
-fi
diff --git a/lgsm/functions/fix_st.sh b/lgsm/functions/fix_st.sh
deleted file mode 100644
index b9fb5b084..000000000
--- a/lgsm/functions/fix_st.sh
+++ /dev/null
@@ -1,11 +0,0 @@
-#!/bin/bash
-# LinuxGSM fix_rust.sh module
-# Author: Daniel Gibbs
-# Contributors: http://linuxgsm.com/contrib
-# Website: https://linuxgsm.com
-# Description: Resolves startup issue with Stationeers.
-
-functionselfname="$(basename "$(readlink -f "${BASH_SOURCE[0]}")")"
-
-# Fixes: [Raknet] Server Shutting Down (Shutting Down).
-export LD_LIBRARY_PATH="$LD_LIBRARY_PATH:${serverfiles}:${serverfiles}/rocketstation_DedicatedServer_Data/Plugins/x86_64"
diff --git a/lgsm/functions/fix_steamcmd.sh b/lgsm/functions/fix_steamcmd.sh
deleted file mode 100644
index 9644208dc..000000000
--- a/lgsm/functions/fix_steamcmd.sh
+++ /dev/null
@@ -1,141 +0,0 @@
-#!/bin/bash
-# LinuxGSM fix_steamcmd.sh module
-# Author: Daniel Gibbs
-# Contributors: http://linuxgsm.com/contrib
-# Website: https://linuxgsm.com
-# Description: Resolves various issues related to SteamCMD.
-
-functionselfname="$(basename "$(readlink -f "${BASH_SOURCE[0]}")")"
-
-# function to simplify the steamclient.so fix
-# example
-# fn_fix_steamclient_so 32|64 (bit) "${serverfiles}/linux32/"
-fn_fix_steamclient_so() {
-	# $1 type of fix 32 or 64 as possible values
-	# $2 as destination where the lib will be copied to
-	if [ "$1" == "32" ]; then
-		# steamclient.so x86 fix.
-		if [ ! -f "${2}/steamclient.so" ]; then
-			fixname="steamclient.so x86"
-			fn_fix_msg_start
-			if [ ! -d "${2}" ]; then
-				mkdir -p "${2}"
-			fi
-			if [ -f "${HOME}/.steam/steamcmd/linux32/steamclient.so" ]; then
-				cp "${HOME}/.steam/steamcmd/linux32/steamclient.so" "${2}/steamclient.so"
-			elif [ -f "${steamcmddir}/linux32/steamclient.so" ]; then
-				cp "${steamcmddir}/linux32/steamclient.so" "${2}/steamclient.so"
-			elif [ -f "${HOME}/.local/share/Steam/steamcmd/linux32/steamclient.so" ]; then
-				cp "${HOME}/.local/share/Steam/steamcmd/linux32/steamclient.so" "${2}/steamclient.so"
-			fi
-			fn_fix_msg_end
-		fi
-	elif [ "$1" == "64" ]; then
-		# steamclient.so x86_64 fix.
-		if [ ! -f "${2}/steamclient.so" ]; then
-			fixname="steamclient.so x86_64"
-			fn_fix_msg_start
-			if [ ! -d "${2}" ]; then
-				mkdir -p "${2}"
-			fi
-			if [ -f "${HOME}/.steam/steamcmd/linux64/steamclient.so" ]; then
-				cp "${HOME}/.steam/steamcmd/linux64/steamclient.so" "${2}/steamclient.so"
-			elif [ -f "${steamcmddir}/linux64/steamclient.so" ]; then
-				cp "${steamcmddir}/linux64/steamclient.so" "${2}/steamclient.so"
-			elif [ -f "${HOME}/.local/share/Steam/steamcmd/linux64/steamclient.so" ]; then
-				cp "${HOME}/.local/share/Steam/steamcmd/linux64/steamclient.so" "${2}/steamclient.so"
-			fi
-			fn_fix_msg_end
-		fi
-	fi
-}
-
-# Helps fix: [S_API FAIL] SteamAPI_Init() failed; unable to locate a running instance of Steam,or a local steamclient.so.
-steamsdk64="${HOME}/.steam/sdk64"
-steamclientsdk64="${steamsdk64}/steamclient.so"
-# remove any old unlinked versions of steamclient.so
-if [ -f "${steamclientsdk64}" ]; then
-	if [ "$(stat -c '%h' "${steamclientsdk64}")" -eq 1 ]; then
-		fixname="steamclient.so sdk64 - remove old file"
-		fn_fix_msg_start
-		rm -f "${steamclientsdk64}"
-		fn_fix_msg_end
-	fi
-fi
-
-# place new hardlink for the file to the disk
-if [ ! -f "${steamclientsdk64}" ]; then
-	fixname="steamclient.so sdk64 hardlink"
-	fn_fix_msg_start
-	if [ ! -d "${steamsdk64}" ]; then
-		mkdir -p "${steamsdk64}"
-	fi
-	if [ -f "${HOME}/.steam/steamcmd/linux64/steamclient.so" ]; then
-		ln "${HOME}/.steam/steamcmd/linux64/steamclient.so" "${steamclientsdk64}"
-	elif [ -f "${steamcmddir}/linux64/steamclient.so" ]; then
-		ln "${steamcmddir}/linux64/steamclient.so" "${steamclientsdk64}"
-	elif [ -f "${HOME}/.local/share/Steam/steamcmd/linux64/steamclient.so" ]; then
-		ln "${HOME}/.local/share/Steam/steamcmd/linux64/steamclient.so" "${steamclientsdk64}"
-	else
-		fn_print_fail_nl "Could not copy any steamclient.so 64bit for the gameserver"
-	fi
-	fn_fix_msg_end
-fi
-
-# Helps fix: [S_API FAIL] SteamAPI_Init() failed; unable to locate a running instance of Steam,or a local steamclient.so.
-steamsdk32="${HOME}/.steam/sdk32"
-steamclientsdk32="${HOME}/.steam/sdk32/steamclient.so"
-if [ -f "${steamclientsdk32}" ]; then
-	if [ " $(stat -c '%h' "${steamclientsdk32}")" -eq 1 ]; then
-		fixname="steamclient.so sdk32 - remove old file"
-		fn_fix_msg_start
-		rm -f "${steamclientsdk32}"
-		fn_fix_msg_end
-	fi
-fi
-
-# place new hardlink for the file to the disk
-if [ ! -f "${steamclientsdk32}" ]; then
-	fixname="steamclient.so sdk32 link"
-	fn_fix_msg_start
-	if [ ! -d "${steamsdk32}" ]; then
-		mkdir -p "${steamsdk32}"
-	fi
-	if [ -f "${HOME}/.steam/steamcmd/linux32/steamclient.so" ]; then
-		ln "${HOME}/.steam/steamcmd/linux32/steamclient.so" "${steamclientsdk32}"
-	elif [ -f "${steamcmddir}/linux32/steamclient.so" ]; then
-		ln "${steamcmddir}/linux32/steamclient.so" "${steamclientsdk32}"
-	elif [ -f "${HOME}/.local/share/Steam/steamcmd/linux32/steamclient.so" ]; then
-		ln "${HOME}/.local/share/Steam/steamcmd/linux32/steamclient.so" "${steamclientsdk32}"
-	else
-		fn_print_fail_nl "Could not copy any steamclient.so 32bit for the gameserver"
-	fi
-	fn_fix_msg_end
-fi
-
-# steamclient.so fixes
-if [ "${shortname}" == "bo" ]; then
-	fn_fix_steamclient_so "32" "${serverfiles}/BODS_Data/Plugins/x86"
-	fn_fix_steamclient_so "64" "${serverfiles}/BODS_Data/Plugins/x86_64"
-elif [ "${shortname}" == "cmw" ]; then
-	fn_fix_steamclient_so "32" "${executabledir}/lib"
-elif [ "${shortname}" == "cs" ]; then
-	fn_fix_steamclient_so "32" "${serverfiles}"
-elif [ "${shortname}" == "col" ]; then
-	fn_fix_steamclient_so "64" "${serverfiles}"
-elif [ "${shortname}" == "ins" ]; then
-	fn_fix_steamclient_so "32" "${serverfiles}/bin"
-elif [ "${shortname}" == "pz" ]; then
-	fn_fix_steamclient_so "32" "${serverfiles}/linux32"
-	fn_fix_steamclient_so "64" "${serverfiles}/linux64"
-elif [ "${shortname}" == "pvr" ]; then
-	fn_fix_steamclient_so "64" "${executabledir}"
-elif [ "${shortname}" == "ss3" ]; then
-	fn_fix_steamclient_so "32" "${serverfiles}/Bin"
-elif [ "${shortname}" == "tu" ]; then
-	fn_fix_steamclient_so "64" "${executabledir}"
-elif [ "${shortname}" == "unt" ]; then
-	fn_fix_steamclient_so "64" "${serverfiles}"
-elif [ "${shortname}" == "wurm" ]; then
-	fn_fix_steamclient_so "64" "${serverfiles}/nativelibs"
-fi
diff --git a/lgsm/functions/fix_terraria.sh b/lgsm/functions/fix_terraria.sh
deleted file mode 100644
index 7758fdad9..000000000
--- a/lgsm/functions/fix_terraria.sh
+++ /dev/null
@@ -1,10 +0,0 @@
-#!/bin/bash
-# LinuxGSM fix_terraria.sh module
-# Author: Daniel Gibbs
-# Contributors: http://linuxgsm.com/contrib
-# Website: https://linuxgsm.com
-# Description: Resolves an issue with Terraria.
-
-functionselfname="$(basename "$(readlink -f "${BASH_SOURCE[0]}")")"
-
-export TERM=xterm
diff --git a/lgsm/functions/fix_tf2.sh b/lgsm/functions/fix_tf2.sh
deleted file mode 100644
index 77e41a969..000000000
--- a/lgsm/functions/fix_tf2.sh
+++ /dev/null
@@ -1,16 +0,0 @@
-#!/bin/bash
-# LinuxGSM fix_tf2.sh module
-# Author: Daniel Gibbs
-# Contributors: http://linuxgsm.com/contrib
-# Website: https://linuxgsm.com
-# Description: Resolves various issues with Team Fortress 2.
-
-functionselfname="$(basename "$(readlink -f "${BASH_SOURCE[0]}")")"
-
-# Fixes: Team Fortress 2 Segmentation fault for Red-Hat Distros #2062.
-if [ -f "/etc/redhat-release" ] && [ ! -f "${serverfiles}/bin/libcurl-gnutls.so.4" ]; then
-	fixname="libcurl-gnutls.so.4"
-	fn_fix_msg_start
-	ln -s "/usr/lib/libcurl.so.4" "${serverfiles}/bin/libcurl-gnutls.so.4"
-	fn_fix_msg_end
-fi
diff --git a/lgsm/functions/fix_ts3.sh b/lgsm/functions/fix_ts3.sh
deleted file mode 100644
index 7c7387cb6..000000000
--- a/lgsm/functions/fix_ts3.sh
+++ /dev/null
@@ -1,33 +0,0 @@
-#!/bin/bash
-# LinuxGSM fix_ts3.sh module
-# Author: Daniel Gibbs
-# Contributors: http://linuxgsm.com/contrib
-# Website: https://linuxgsm.com
-# Description: Resolves various issues with Teamspeak 3.
-
-functionselfname="$(basename "$(readlink -f "${BASH_SOURCE[0]}")")"
-
-# Fixes: makes libmariadb2 available #1924.
-if [ ! -f "${serverfiles}/libmariadb.so.2" ]; then
-	fixname="libmariadb.so.2"
-	fn_fix_msg_start
-	cp "${serverfiles}/redist/libmariadb.so.2" "${serverfiles}/libmariadb.so.2"
-	fn_fix_msg_end
-fi
-
-# Fixes: failed to register local accounting service: No such file or directory.
-accountingfile="/dev/shm/7gbhujb54g8z9hu43jre8"
-if [ -f "${accountingfile}" ] && [ "${status}" == "0" ]; then
-	# Check permissions for the file if the current user owns it, if not exit.
-	if [ "$(stat -c %U ${accountingfile})" == "$(whoami)" ]; then
-		fixname="Delete file ${accountingfile}"
-		fn_fix_msg_start
-		rm -f "${accountingfile}"
-		fn_fix_msg_end
-	# file is not owned by the current user and needs to be deleted manually.
-	else
-		fn_print_error_nl "File ${accountingfile} is not owned by $(whoami) and needs to be deleted manually"
-		fn_script_log_fatal "File ${accountingfile} is not owned by $(whoami) and needs to be deleted manually"
-		core_exit.sh
-	fi
-fi
diff --git a/lgsm/functions/fix_unt.sh b/lgsm/functions/fix_unt.sh
deleted file mode 100644
index eae2e6313..000000000
--- a/lgsm/functions/fix_unt.sh
+++ /dev/null
@@ -1,10 +0,0 @@
-#!/bin/bash
-# LinuxGSM fix_rust.sh module
-# Author: Daniel Gibbs
-# Contributors: http://linuxgsm.com/contrib
-# Website: https://linuxgsm.com
-# Description: Resolves startup issue with Unturned.
-
-functionselfname="$(basename "$(readlink -f "${BASH_SOURCE[0]}")")"
-
-export LD_LIBRARY_PATH="$LD_LIBRARY_PATH:${serverfiles}:${serverfiles}/Unturned_Headless_Data/Plugins/x86_64"
diff --git a/lgsm/functions/fix_ut.sh b/lgsm/functions/fix_ut.sh
deleted file mode 100644
index 2e6686a8d..000000000
--- a/lgsm/functions/fix_ut.sh
+++ /dev/null
@@ -1,13 +0,0 @@
-#!/bin/bash
-# LinuxGSM fix_ut.sh module
-# Author: Daniel Gibbs
-# Contributors: http://linuxgsm.com/contrib
-# Website: https://linuxgsm.com
-# Description: Resolves various issues with Unreal Tournament.
-
-functionselfname="$(basename "$(readlink -f "${BASH_SOURCE[0]}")")"
-
-#Set Binary Executable
-echo -e "chmod +x ${executabledir}/${executable}"
-chmod +x "${executabledir}/${executable}"
-fn_sleep_time
diff --git a/lgsm/functions/fix_ut2k4.sh b/lgsm/functions/fix_ut2k4.sh
deleted file mode 100644
index 49610e4b6..000000000
--- a/lgsm/functions/fix_ut2k4.sh
+++ /dev/null
@@ -1,36 +0,0 @@
-#!/bin/bash
-# LinuxGSM fix_ut2k4.sh module
-# Author: Daniel Gibbs
-# Contributors: http://linuxgsm.com/contrib
-# Website: https://linuxgsm.com
-# Description: Resolves various issues with Unreal Tournament 2004.
-
-functionselfname="$(basename "$(readlink -f "${BASH_SOURCE[0]}")")"
-
-echo -e "applying WebAdmin ut2003.css fix."
-echo -e "http://forums.tripwireinteractive.com/showpost.php?p=585435&postcount=13"
-sed -i 's/none}/none;/g' "${serverfiles}/Web/ServerAdmin/ut2003.css"
-sed -i 's/underline}/underline;/g' "${serverfiles}/Web/ServerAdmin/ut2003.css"
-fn_sleep_time
-echo -e "applying WebAdmin CharSet fix."
-echo -e "http://forums.tripwireinteractive.com/showpost.php?p=442340&postcount=1"
-sed -i 's/CharSet="iso-8859-1"/CharSet="utf-8"/g' "${systemdir}/UWeb.int"
-fn_sleep_time
-echo -e "applying server name fix."
-fn_sleep_time
-echo -e "forcing server restart."
-fn_sleep_time
-exitbypass=1
-command_start.sh
-fn_firstcommand_reset
-sleep 5
-exitbypass=1
-command_stop.sh
-fn_firstcommand_reset
-exitbypass=1
-command_start.sh
-fn_firstcommand_reset
-sleep 5
-exitbypass=1
-command_stop.sh
-fn_firstcommand_reset
diff --git a/lgsm/functions/fix_ut3.sh b/lgsm/functions/fix_ut3.sh
deleted file mode 100644
index 6bd26a53a..000000000
--- a/lgsm/functions/fix_ut3.sh
+++ /dev/null
@@ -1,20 +0,0 @@
-#!/bin/bash
-# LinuxGSM fix_ut2.sh module
-# Author: Daniel Gibbs
-# Contributors: http://linuxgsm.com/contrib
-# Website: https://linuxgsm.com
-# Description: Resolves various issues with Unreal Tournament 3.
-
-functionselfname="$(basename "$(readlink -f "${BASH_SOURCE[0]}")")"
-
-startparameters="server VCTF-Suspense?Game=UTGameContent.UTVehicleCTFGame_Content?bIsDedicated=true?bIsLanMatch=false?bUsesStats=false?bShouldAdvertise=false?PureServer=1?bAllowJoinInProgress=true?ConfigSubDir=${selfname} -port=${port} -queryport=${queryport} -multihome=${ip} -nohomedir -unattended -log=${gamelog}"
-
-fn_print_information "starting ${gamename} server to generate configs."
-fn_sleep_time
-exitbypass=1
-command_start.sh
-fn_firstcommand_reset
-sleep 10
-exitbypass=1
-command_stop.sh
-fn_firstcommand_reset
diff --git a/lgsm/functions/fix_vh.sh b/lgsm/functions/fix_vh.sh
deleted file mode 100644
index a90c5d0b0..000000000
--- a/lgsm/functions/fix_vh.sh
+++ /dev/null
@@ -1,35 +0,0 @@
-#!/bin/bash
-# LinuxGSM fix_rust.sh function
-# Author: Alasdair Haig
-# Website: https://linuxgsm.com
-# Description: Resolves startup issue with Valheim
-
-functionselfname="$(basename "$(readlink -f "${BASH_SOURCE[0]}")")"
-
-export LD_LIBRARY_PATH=./linux64:$LD_LIBRARY_PATH
-
-modsdir="${lgsmdir}/mods"
-modsinstalledlistfullpath="${modsdir}/installed-mods.txt"
-if [ -f "${modsinstalledlistfullpath}" ]; then
-	# special check if Valheim Plus is installed
-	if grep -qE "^valheimplus" "${modsinstalledlistfullpath}"; then
-		if ! grep -qE "^executable=\"./start_server_bepinex.sh\"" "${configdirserver}/${selfname}.cfg"; then
-			echo 'executable="./start_server_bepinex.sh"' >> "${configdirserver}/${selfname}.cfg"
-			executable="./start_server_bepinex.sh"
-		fi
-	fi
-	# special exports for BepInEx if installed
-	if grep -qE "^bepinexvh" "${modsinstalledlistfullpath}"; then
-		fn_print_info_nl "BepInEx install detected, applying start exports"
-		fn_script_log_info "BepInEx install detected, applying start exports"
-		# exports for BepInEx framework from script start_server_bepinex.sh
-		export DOORSTOP_ENABLE=TRUE
-		export DOORSTOP_INVOKE_DLL_PATH=./BepInEx/core/BepInEx.Preloader.dll
-		export DOORSTOP_CORLIB_OVERRIDE_PATH=./unstripped_corlib
-
-		export LD_LIBRARY_PATH="./doorstop_libs:${LD_LIBRARY_PATH}"
-		export LD_PRELOAD="libdoorstop_x64.so:${LD_PRELOAD}"
-
-		export SteamAppId=892970
-	fi
-fi
diff --git a/lgsm/functions/fix_wurm.sh b/lgsm/functions/fix_wurm.sh
deleted file mode 100644
index aba24d382..000000000
--- a/lgsm/functions/fix_wurm.sh
+++ /dev/null
@@ -1,23 +0,0 @@
-#!/bin/bash
-# LinuxGSM fix_wurm.sh module
-# Author: Daniel Gibbs
-# Contributors: http://linuxgsm.com/contrib
-# Website: https://linuxgsm.com
-# Description: Resolves various issues with Wurm Unlimited.
-
-functionselfname="$(basename "$(readlink -f "${BASH_SOURCE[0]}")")"
-
-# First run requires start with no parms.
-# After first run new dirs are created.
-if [ ! -d "${serverfiles}/Creative" ]; then
-	parmsbypass=1
-	fixbypass=1
-	exitbypass=1
-	command_start.sh
-	fn_firstcommand_reset
-	sleep 10
-	exitbypass=1
-	command_stop.sh
-	fn_firstcommand_reset
-	unset parmsbypass
-fi
diff --git a/lgsm/functions/fix_zmr.sh b/lgsm/functions/fix_zmr.sh
deleted file mode 100644
index 491c36638..000000000
--- a/lgsm/functions/fix_zmr.sh
+++ /dev/null
@@ -1,48 +0,0 @@
-#!/bin/bash
-# LinuxGSM fix_sfc.sh module
-# Author: Daniel Gibbs
-# Contributors: http://linuxgsm.com/contrib
-# Website: https://linuxgsm.com
-# Description: Resolves various issues with Zombie Master: Reborn.
-
-functionselfname="$(basename "$(readlink -f "${BASH_SOURCE[0]}")")"
-
-if [ ! -f "${serverfiles}/bin/datacache.so" ]; then
-	ln -s "${serverfiles}/bin/datacache_srv.so" "${serverfiles}/bin/datacache.so"
-fi
-
-if [ ! -f "${serverfiles}/bin/dedicated.so" ]; then
-	ln -s "${serverfiles}/bin/dedicated_srv.so" "${serverfiles}/bin/dedicated.so"
-fi
-
-if [ ! -f "${serverfiles}/bin/engine.so" ]; then
-	ln -s "${serverfiles}/bin/engine_srv.so" "${serverfiles}/bin/engine.so"
-fi
-
-if [ ! -f "${serverfiles}/bin/materialsystem.so" ]; then
-	ln -s "${serverfiles}/bin/materialsystem_srv.so" "${serverfiles}/bin/materialsystem.so"
-fi
-
-if [ ! -f "${serverfiles}/bin/replay.so" ]; then
-	ln -s "${serverfiles}/bin/replay_srv.so" "${serverfiles}/bin/replay.so"
-fi
-
-if [ ! -f "${serverfiles}/bin/shaderapiempty.so" ]; then
-	ln -s "${serverfiles}/bin/shaderapiempty_srv.so" "${serverfiles}/bin/shaderapiempty.so"
-fi
-
-if [ ! -f "${serverfiles}/bin/soundemittersystem.so" ]; then
-	ln -s "${serverfiles}/bin/soundemittersystem_srv.so" "${serverfiles}/bin/soundemittersystem.so"
-fi
-
-if [ ! -f "${serverfiles}/bin/studiorender.so" ]; then
-	ln -s "${serverfiles}/bin/studiorender_srv.so" "${serverfiles}/bin/studiorender.so"
-fi
-
-if [ ! -f "${serverfiles}/bin/vphysics.so" ]; then
-	ln -s "${serverfiles}/bin/vphysics_srv.so" "${serverfiles}/bin/vphysics.so"
-fi
-
-if [ ! -f "${serverfiles}/bin/scenefilecache.so" ]; then
-	ln -s "${serverfiles}/bin/scenefilecache_srv.so" "${serverfiles}/bin/scenefilecache.so"
-fi
diff --git a/lgsm/functions/info_distro.sh b/lgsm/functions/info_distro.sh
deleted file mode 100644
index 8c2a67adf..000000000
--- a/lgsm/functions/info_distro.sh
+++ /dev/null
@@ -1,281 +0,0 @@
-#!/bin/bash
-# LinuxGSM info_distro.sh module
-# Author: Daniel Gibbs
-# Contributors: http://linuxgsm.com/contrib
-# Website: https://linuxgsm.com
-# Description: Variables providing useful info on the Operating System such as disk and performace info.
-# Used for command_details.sh, command_debug.sh and alert.sh.
-
-functionselfname="$(basename "$(readlink -f "${BASH_SOURCE[0]}")")"
-
-### Game Server pid
-if [ "${status}" == "1" ]; then
-	gameserverpid="$(tmux -L "${sessionname}" list-sessions -F "#{session_name} #{pane_pid}" | grep "^${sessionname} " | awk '{print $NF}')"
-	if [ "${engine}" == "source" ]; then
-		srcdslinuxpid="$(ps -ef | grep -v grep | grep "${gameserverpid}" | grep srcds_linux | awk '{print $2}')"
-	elif [ "${engine}" == "goldsrc" ]; then
-		hldslinuxpid="$(ps -ef | grep -v grep | grep "${gameserverpid}" | grep hlds_linux | awk '{print $2}')"
-	fi
-fi
-### Distro information
-
-## Distro
-# Returns architecture, kernel and distro/os.
-arch="$(uname -m)"
-kernel="$(uname -r)"
-
-# Distro Name - Ubuntu 16.04 LTS
-# Distro Version - 16.04
-# Distro ID - ubuntu
-# Distro Codename - xenial
-
-# Gathers distro info from various sources filling in missing gaps.
-distro_info_array=(os-release lsb_release hostnamectl debian_version redhat-release)
-for distro_info in "${distro_info_array[@]}"; do
-	if [ -f "/etc/os-release" ] && [ "${distro_info}" == "os-release" ]; then
-		distroname="$(grep "PRETTY_NAME" /etc/os-release | awk -F\= '{gsub(/"/,"",$2);print $2}')"
-		distroversion="$(grep "VERSION_ID" /etc/os-release | awk -F\= '{gsub(/"/,"",$2);print $2}')"
-		# Special var for rhel like distros to removed point in number e.g 8.4 to just 8.
-		distroversionrh="$(sed -nr 's/^VERSION_ID="([0-9]*).+?"/\1/p' /etc/os-release)"
-		distroid="$(grep "ID=" /etc/os-release | grep -v _ID | awk -F\= '{gsub(/"/,"",$2);print $2}')"
-		distroidlike="$(grep "ID_LIKE=" /etc/os-release | grep -v _ID | awk -F\= '{gsub(/"/,"",$2);print $2}')"
-		distrocodename="$(grep "VERSION_CODENAME" /etc/os-release | awk -F\= '{gsub(/"/,"",$2);print $2}')"
-	elif [ "$(command -v lsb_release 2> /dev/null)" ] && [ "${distro_info}" == "lsb_release" ]; then
-		if [ -z "${distroname}" ]; then
-			distroname="$(lsb_release -sd)"
-		elif [ -z "${distroversion}" ]; then
-			distroversion="$(lsb_release -sr)"
-		elif [ -z "${distroid}" ]; then
-			distroid="$(lsb_release -si)"
-		elif [ -z "${distrocodename}" ]; then
-			distrocodename="$(lsb_release -sc)"
-		fi
-	elif [ "$(command -v hostnamectl 2> /dev/null)" ] && [ "${distro_info}" == "hostnamectl" ]; then
-		if [ -z "${distroname}" ]; then
-			distroname="$(hostnamectl | grep "Operating System" | sed 's/Operating System: //g')"
-		fi
-	elif [ -f "/etc/debian_version" ] && [ "${distro_info}" == "debian_version" ]; then
-		if [ -z "${distroname}" ]; then
-			distroname="Debian $(cat /etc/debian_version)"
-		elif [ -z "${distroversion}" ]; then
-			distroversion="$(cat /etc/debian_version)"
-		elif [ -z "${distroid}" ]; then
-			distroid="debian"
-		fi
-	elif [ -f "/etc/redhat-release" ] && [ "${distro_info}" == "redhat-release" ]; then
-		if [ -z "${distroname}" ]; then
-			distroname="$(cat /etc/redhat-release)"
-		elif [ -z "${distroversion}" ]; then
-			distroversion="$(rpm -qa \*-release | grep -Ei "oracle|redhat|centos|fedora" | cut -d"-" -f3)"
-		elif [ -z "${distroid}" ]; then
-			distroid="$(awk '{print $1}' /etc/redhat-release)"
-		fi
-	fi
-done
-
-# some RHEL based distros use 8.4 instead of just 8.
-if [[ "${distroidlike}" == *"rhel"* ]] || [ "${distroid}" == "rhel" ]; then
-	distroversioncsv="${distroversionrh}"
-else
-	distroversioncsv="${distroversion}"
-fi
-
-# Check if distro supported by distro vendor.
-if [ "$(command -v distro-info 2> /dev/null)" ]; then
-	distrosunsupported="$(distro-info --unsupported)"
-	distrosunsupported_array=("${distrosunsupported}")
-	for distrounsupported in "${distrosunsupported_array[@]}"; do
-		if [ "${distrounsupported}" == "${distrocodename}" ]; then
-			distrosupport=unsupported
-			break
-		else
-			distrosupport=supported
-		fi
-	done
-else
-	distrosupport=unknown
-fi
-
-## Glibc version
-# e.g: 1.17
-glibcversion="$(ldd --version | sed -n '1s/.* //p')"
-
-## tmux version
-# e.g: tmux 1.6
-if [ ! "$(command -V tmux 2> /dev/null)" ]; then
-	tmuxv="${red}NOT INSTALLED!${default}"
-	tmuxvdigit="0"
-else
-	tmuxvdigit="$(tmux -V | sed "s/tmux //" | sed -n '1 p' | tr -cd '[:digit:]')"
-	if [ "${tmuxvdigit}" -lt "16" ]; then
-		tmuxv="$(tmux -V) (>= 1.6 required for console log)"
-	else
-		tmuxv="$(tmux -V)"
-	fi
-fi
-
-if [ "$(command -V java 2> /dev/null)" ]; then
-	javaversion="$(java -version 2>&1 | grep "version")"
-fi
-
-if [ "$(command -v mono 2> /dev/null)" ]; then
-	monoversion="$(mono --version 2>&1 | grep -Po '(?<=version )\d')"
-fi
-
-## Uptime
-uptime="$(< /proc/uptime)"
-uptime=${uptime/[. ]*/}
-minutes="$((uptime / 60 % 60))"
-hours="$((uptime / 60 / 60 % 24))"
-days="$((uptime / 60 / 60 / 24))"
-
-### Performance information
-
-## Average server load
-load="$(uptime | awk -F 'load average: ' '{ print $2 }')"
-
-## CPU information
-cpumodel="$(awk -F: '/model name/ {name=$2} END {print name}' /proc/cpuinfo | sed 's/^[ \t]*//;s/[ \t]*$//')"
-cpucores="$(awk -F: '/model name/ {core++} END {print core}' /proc/cpuinfo)"
-cpufreqency="$(awk -F: '/cpu MHz/ {freq=$2} END {print freq}' /proc/cpuinfo | sed 's/^[ \t]*//;s/[ \t]*$//')"
-# CPU usage of the game server pid
-if [ -n "${gameserverpid}" ]; then
-	cpuused="$(ps --forest -o pcpu -g "${gameserverpid}" | awk '{s+=$1} END {print s}')"
-	cpuusedmhz="$(echo "${cpufreqency} * ${cpuused} / 100" | bc)"
-fi
-
-## Memory information
-# Available RAM and swap.
-
-# Newer distros can use numfmt to give more accurate results.
-if [ "$(command -v numfmt 2> /dev/null)" ]; then
-	# Issue #2005 - Kernel 3.14+ contains MemAvailable which should be used. All others will be calculated.
-
-	# get the raw KB values of these fields.
-	physmemtotalkb="$(grep MemTotal /proc/meminfo | awk '{print $2}')"
-	physmemfreekb="$(grep ^MemFree /proc/meminfo | awk '{print $2}')"
-	physmembufferskb="$(grep ^Buffers /proc/meminfo | awk '{print $2}')"
-	physmemcachedkb="$(grep ^Cached /proc/meminfo | awk '{print $2}')"
-	physmemreclaimablekb="$(grep ^SReclaimable /proc/meminfo | awk '{print $2}')"
-
-	# check if MemAvailable Exists.
-	if grep -q ^MemAvailable /proc/meminfo; then
-		physmemactualfreekb="$(grep ^MemAvailable /proc/meminfo | awk '{print $2}')"
-	else
-		physmemactualfreekb="$((physmemfreekb + physmembufferskb + physmemcachedkb))"
-	fi
-
-	# Available RAM and swap.
-	physmemtotalmb="$((physmemtotalkb / 1024))"
-	physmemtotal="$(numfmt --to=iec --from=iec --suffix=B "${physmemtotalkb}K")"
-	physmemfree="$(numfmt --to=iec --from=iec --suffix=B "${physmemactualfreekb}K")"
-	physmemused="$(numfmt --to=iec --from=iec --suffix=B "$((physmemtotalkb - physmemfreekb - physmembufferskb - physmemcachedkb - physmemreclaimablekb))K")"
-	physmemavailable="$(numfmt --to=iec --from=iec --suffix=B "${physmemactualfreekb}K")"
-	physmemcached="$(numfmt --to=iec --from=iec --suffix=B "$((physmemcachedkb + physmemreclaimablekb))K")"
-
-	swaptotal="$(numfmt --to=iec --from=iec --suffix=B "$(grep ^SwapTotal /proc/meminfo | awk '{print $2}')K")"
-	swapfree="$(numfmt --to=iec --from=iec --suffix=B "$(grep ^SwapFree /proc/meminfo | awk '{print $2}')K")"
-	swapused="$(numfmt --to=iec --from=iec --suffix=B "$(($(grep ^SwapTotal /proc/meminfo | awk '{print $2}') - $(grep ^SwapFree /proc/meminfo | awk '{print $2}')))K")"
-	# RAM usage of the game server pid
-	# MB
-	if [ "${gameserverpid}" ]; then
-		memused="$(ps --forest -o rss -g "${gameserverpid}" | awk '{s+=$1} END {print s}' | awk '{$1/=1024;printf "%.0f",$1}{print $2}')"
-		# %
-		pmemused="$(ps --forest -o %mem -g "${gameserverpid}" | awk '{s+=$1} END {print s}')"
-	fi
-else
-	# Older distros will need to use free.
-	# Older versions of free do not support -h option.
-	if [ "$(
-		free -h > /dev/null 2>&1
-		echo $?
-	)" -ne "0" ]; then
-		humanreadable="-m"
-	else
-		humanreadable="-h"
-	fi
-	physmemtotalmb="$(free -m | awk '/Mem:/ {print $2}')"
-	physmemtotal="$(free ${humanreadable} | awk '/Mem:/ {print $2}')"
-	physmemfree="$(free ${humanreadable} | awk '/Mem:/ {print $4}')"
-	physmemused="$(free ${humanreadable} | awk '/Mem:/ {print $3}')"
-
-	oldfree="$(free ${humanreadable} | awk '/cache:/')"
-	if [ "${oldfree}" ]; then
-		physmemavailable="n/a"
-		physmemcached="n/a"
-	else
-		physmemavailable="$(free ${humanreadable} | awk '/Mem:/ {print $7}')"
-		physmemcached="$(free ${humanreadable} | awk '/Mem:/ {print $6}')"
-	fi
-
-	swaptotal="$(free ${humanreadable} | awk '/Swap:/ {print $2}')"
-	swapused="$(free ${humanreadable} | awk '/Swap:/ {print $3}')"
-	swapfree="$(free ${humanreadable} | awk '/Swap:/ {print $4}')"
-fi
-
-### Disk information
-
-## Available disk space on the partition.
-filesystem="$(LC_ALL=C df -hP "${rootdir}" | tail -n 1 | awk '{print $1}')"
-totalspace="$(LC_ALL=C df -hP "${rootdir}" | tail -n 1 | awk '{print $2}')"
-usedspace="$(LC_ALL=C df -hP "${rootdir}" | tail -n 1 | awk '{print $3}')"
-availspace="$(LC_ALL=C df -hP "${rootdir}" | tail -n 1 | awk '{print $4}')"
-
-## LinuxGSM used space total.
-rootdirdu="$(du -sh "${rootdir}" 2> /dev/null | awk '{print $1}')"
-if [ -z "${rootdirdu}" ]; then
-	rootdirdu="0M"
-fi
-
-## LinuxGSM used space in serverfiles dir.
-serverfilesdu="$(du -sh "${serverfiles}" 2> /dev/null | awk '{print $1}')"
-if [ -z "${serverfilesdu}" ]; then
-	serverfilesdu="0M"
-fi
-
-## LinuxGSM used space total minus backup dir.
-rootdirduexbackup="$(du -sh --exclude="${backupdir}" "${serverfiles}" 2> /dev/null | awk '{print $1}')"
-if [ -z "${rootdirduexbackup}" ]; then
-	rootdirduexbackup="0M"
-fi
-
-## Backup info
-if [ -d "${backupdir}" ]; then
-	# Used space in backups dir.
-	backupdirdu="$(du -sh "${backupdir}" | awk '{print $1}')"
-	# If no backup dir, size is 0M.
-	if [ -z "${backupdirdu}" ]; then
-		backupdirdu="0M"
-	fi
-
-	# number of backups set to 0 by default.
-	backupcount=0
-
-	# If there are backups in backup dir.
-	if [ "$(find "${backupdir}" -name "*.tar.gz" | wc -l)" -ne "0" ]; then
-		# number of backups.
-		backupcount="$(find "${backupdir}"/*.tar.gz | wc -l)"
-		# most recent backup.
-		lastbackup="$(ls -1t "${backupdir}"/*.tar.gz | head -1)"
-		# date of most recent backup.
-		lastbackupdate="$(date -r "${lastbackup}")"
-		# no of days since last backup.
-		lastbackupdaysago="$((($(date +'%s') - $(date -r "${lastbackup}" +'%s')) / 60 / 60 / 24))"
-		# size of most recent backup.
-		lastbackupsize="$(du -h "${lastbackup}" | awk '{print $1}')"
-	fi
-fi
-
-# Network Interface name
-netint=$(${ipcommand} -o addr | grep "${ip}" | awk '{print $2}')
-netlink=$(${ethtoolcommand} "${netint}" 2> /dev/null | grep Speed | awk '{print $2}')
-
-# Sets the SteamCMD glibc requirement if the game server requirement is less or not required.
-if [ "${appid}" ]; then
-	if [ "${glibc}" = "null" ] || [ -z "${glibc}" ] || [ "$(printf '%s\n'${glibc}'\n' "2.14" | sort -V | head -n 1)" != "2.14" ]; then
-		glibc="2.14"
-	fi
-fi
-
-# Gather Port Info using ss
-ssinfo="$(ss -tuplwn)"
diff --git a/lgsm/functions/info_game.sh b/lgsm/functions/info_game.sh
deleted file mode 100644
index b8f94c18a..000000000
--- a/lgsm/functions/info_game.sh
+++ /dev/null
@@ -1,2600 +0,0 @@
-#!/bin/bash
-# LinuxGSM info_game.sh module
-# Author: Daniel Gibbs
-# Contributors: http://linuxgsm.com/contrib
-# Website: https://linuxgsm.com
-# Description: Gathers various game server information.
-
-functionselfname="$(basename "$(readlink -f "${BASH_SOURCE[0]}")")"
-
-## Examples of filtering to get info from config files.
-# sed 's/foo//g' - remove foo
-# tr -cd '[:digit:]' leave only digits
-# tr -d '=\"; ' remove selected characters =\";
-# grep -v "foo" filter out lines that contain foo
-# cut -f1 -d "/" remove everything after /
-
-fn_info_game_ac() {
-	# Config
-	if [ ! -f "${servercfgfullpath}" ]; then
-		adminpassword="${unavailable}"
-		httpport="${zero}"
-		port="${zero}"
-		queryport="${zero}"
-		servername="${unavailable}"
-	else
-		adminpassword=$(grep "ADMIN_PASSWORD" "${servercfgfullpath}" | sed -e 's/^[ \t]*//g' -e '/^\//d' -e 's/ADMIN_PASSWORD//g' | tr -d '=\";,:' | sed -e 's/^[ \t]*//' -e 's/[ \t]*$//')
-		httpport=$(grep "HTTP_PORT" "${servercfgfullpath}" | tr -cd '[:digit:]')
-		port=$(grep "TCP_PORT" "${servercfgfullpath}" | tr -cd '[:digit:]')
-		queryport="${httpport}"
-		servername=$(grep "NAME" "${servercfgfullpath}" | sed -e 's/^[ \t]*//g' -e '/^\//d' -e 's/NAME//g' | tr -d '=\";,:' | sed -e 's/^[ \t]*//' -e 's/[ \t]*$//' | head -n 1)
-
-		# Not set
-		adminpassword=${adminpassword:-"NOT SET"}
-		httpport=${httpport:-"0"}
-		port=${port:-"0"}
-		queryport=${queryport:-"0"}
-		servername=${servername:-"NOT SET"}
-
-	fi
-}
-
-fn_info_game_ark() {
-	# Config
-	if [ ! -f "${servercfgfullpath}" ]; then
-		adminpassword="${unavailable}"
-		servername="${unavailable}"
-		serverpassword="${unavailable}"
-	else
-		adminpassword=$(sed -nr 's/^ServerAdminPassword=(.*)/\1/p' "${servercfgfullpath}")
-		servername=$(sed -nr 's/^SessionName=(.*)/\1/p' "${servercfgfullpath}")
-		serverpassword=$(sed -nr 's/^ServerPassword=(.*)/\1/p' "${servercfgfullpath}")
-
-		# Not set
-		adminpassword=${adminpassword:-"NOT SET"}
-		servername=${servername:-"NOT SET"}
-		serverpassword=${serverpassword:-"NOT SET"}
-	fi
-
-	# Parameters
-	maxplayers=${maxplayers:-"0"}
-	port=${port:-"0"}
-	queryport=${queryport:-"0"}
-	rawport=$((port + 1))
-	rconport=${rconport:-"0"}
-}
-
-fn_info_game_arma3() {
-	# Config
-	if [ ! -f "${servercfgfullpath}" ]; then
-		adminpassword="${unavailable}"
-		maxplayers="${zero}"
-		servername="${unavailable}"
-		serverpassword="${unavailable}"
-	else
-		adminpassword=$(sed -nr 's/^passwordAdmin\s*=\s*"(.*)"\s*;/\1/p' "${servercfgfullpath}")
-		maxplayers=$(sed -nr 's/^maxPlayers\s*=\s*([0-9]+)\s*;/\1/p' "${servercfgfullpath}")
-		servername=$(sed -nr 's/^hostname\s*=\s*"(.*)"\s*;/\1/p' "${servercfgfullpath}")
-		serverpassword=$(sed -nr 's/^password\s*=\s*"(.*)"\s*;/\1/p' "${servercfgfullpath}")
-
-		# Not set
-		adminpassword=${adminpassword:-"NOT SET"}
-		maxplayers=${maxplayers:-"0"}
-		servername=${servername:-"NOT SET"}
-		serverpassword=${serverpassword:-"NOT SET"}
-	fi
-
-	# Parameters
-	battleeyeport=$((port + 4))
-	port=${port:-"2302"}
-	queryport=$((port + 1))
-	steammasterport=$((port + 2))
-	voiceport=${port:-"2302"}
-	voiceunusedport=$((port + 3))
-}
-
-fn_info_game_armar() {
-	if [ ! -f "${servercfgfullpath}" ]; then
-		adminpassword="${unavailable}"
-		maxplayers="${zero}"
-		port="${zero}"
-		queryport="${zero}"
-		servername="${unavailable}"
-		serverpassword="${unavailable}"
-	else
-		adminpassword=$(jq -r '.game.passwordAdmin' "${servercfgfullpath}")
-		battleeyeport=1376
-		configip=$(jq -r '.bindAddress' "${servercfgfullpath}")
-		maxplayers=$(jq -r '.game.maxPlayers' "${servercfgfullpath}")
-		port=$(jq -r '.bindPort' "${servercfgfullpath}")
-		queryport=$(jq -r '.a2s.port' "${servercfgfullpath}")
-		servername=$(jq -r '.game.name' "${servercfgfullpath}")
-		serverpassword=$(jq -r '.game.password' "${servercfgfullpath}")
-
-		# Not set
-		adminpassword=${adminpassword:-"NOT SET"}
-		configip=${configip:-"0.0.0.0"}
-		maxplayers=${maxplayers:-"0"}
-		port=${port:-"0"}
-		queryport=${queryport:-"0"}
-		servername=${servername:-"NOT SET"}
-		serverpassword=${serverpassword:-"NOT SET"}
-	fi
-}
-
-fn_info_game_av() {
-	# Config
-	if [ ! -f "${servercfgfullpath}" ]; then
-		maxplayers="${unavailable}"
-		servername="${unavailable}"
-		serverpassword="${unavailable}"
-		port=${zero}
-		queryport=${zero}
-		steamqueryport=${zero}
-		steammasterport=${zero}
-		rconport=${zero}
-		rconenabled="${unavailable}"
-		rconpassword="${unavailable}"
-	else
-		maxplayers=$(grep "maxPlayers=" "${servercfgfullpath}" | sed 's/maxPlayers=//')
-		servername=$(grep "name=" "${servercfgfullpath}" | sed 's/name=//')
-		serverpassword=$(grep "password=" "${servercfgfullpath}" | sed 's/password=//')
-		port=$(grep "port=" "${servercfgfullpath}" | sed 's/port=//')
-		queryport=$((port + 3))
-		steamqueryport=$((port + 20))
-		steammasterport=$((port + 21))
-		rconport=$(grep "rconPort=" "${servercfgfullpath}" | sed 's/rconPort=//')
-
-		rconpassword=$(grep "rconPassword=" "${servercfgfullpath}" | sed 's/rconPassword=//')
-		if [ -n "${rconpassword}" ]; then
-			rconenabled="true"
-		fi
-
-		# Not set
-		maxplayers=${maxplayers:-"0"}
-		servername=${servername:-"NOT SET"}
-		serverpassword=${serverpassword:-"NOT SET"}
-		port=${port:-"0"}
-		queryport=${queryport:-"0"}
-		steamqueryport=${steamqueryport:-"0"}
-		steammasterport=${steammasterport:-"0"}
-		rconport=${rconport:-"0"}
-		rconenabled=${rconenabled:-"NOT SET"}
-		rconpassword=${rconpassword:-"NOT SET"}
-	fi
-}
-
-fn_info_game_bf1942() {
-	# Config
-	if [ ! -f "${servercfgfullpath}" ]; then
-		servername="${unavailable}"
-		serverpassword="${unavailable}"
-		maxplayers="${zero}"
-		port="${zero}"
-		queryport="${zero}"
-	else
-		servername=$(grep -E "^game.serverName " "${servercfgfullpath}" | sed -e 's/^[ \t]*//g' -e '/^--/d' -e 's/game.serverName //g' | tr -d '=\";,:' | xargs)
-		serverpassword=$(grep "game.serverPassword" "${servercfgfullpath}" | sed -e 's/^ *//g' -e '/^--/d' -e 's/game.serverPassword//g' | tr -d '=\";,:' | xargs)
-		maxplayers=$(grep "game.serverMaxPlayers" "${servercfgfullpath}" | grep -v "\--" | tr -cd '[:digit:]')
-		port=$(grep "game.serverPort" "${servercfgfullpath}" | grep -v "\--" | tr -cd '[:digit:]')
-		queryport="22000"
-		configip=$(grep "game.serverIP" "${servercfgfullpath}" | sed -e 's/^[ \t]*//g' -e '/^--/d' -e 's/game.serverIP//g' | tr -d '=\";,:' | xargs)
-
-		# Not set
-		servername=${servername:-"NOT SET"}
-		serverpassword=${serverpassword:-"NOT SET"}
-		maxplayers=${maxplayers:-"0"}
-		port=${port:-"0"}
-		queryport=${queryport:-"0"}
-		configip=${configip:-"0.0.0.0"}
-	fi
-}
-
-fn_info_game_bfv() {
-	# Config
-	if [ ! -f "${servercfgfullpath}" ]; then
-		servername="${unavailable}"
-		serverpassword="${unavailable}"
-		maxplayers="${zero}"
-		port="${zero}"
-		queryport="${zero}"
-	else
-		servername=$(grep "game.serverName" "${servercfgfullpath}" | sed -e 's/^[ \t]*//g' -e '/^--/d' -e 's/game.serverName//g' | tr -d '=\";,:' | xargs)
-		serverpassword=$(grep "game.serverPassword" "${servercfgfullpath}" | sed -e 's/^ *//g' -e '/^--/d' -e 's/game.serverPassword//g' | tr -d '=\";,:' | xargs)
-		maxplayers=$(grep "game.serverMaxPlayers" "${servercfgfullpath}" | grep -v "\--" | tr -cd '[:digit:]')
-		port=$(grep "game.serverPort" "${servercfgfullpath}" | grep -v "\--" | tr -cd '[:digit:]')
-		queryport="23000"
-		configip=$(grep "game.serverIP" "${servercfgfullpath}" | sed -e 's/^[ \t]*//g' -e '/^--/d' -e 's/game.serverIP//g' | tr -d '=\";,:' | xargs)
-
-		# Not set
-		servername=${servername:-"NOT SET"}
-		serverpassword=${serverpassword:-"NOT SET"}
-		maxplayers=${maxplayers:-"0"}
-		port=${port:-"0"}
-		queryport=${queryport:-"0"}
-		configip=${configip:-"0.0.0.0"}
-	fi
-}
-
-fn_info_game_bo() {
-	# Config
-	if [ ! -f "${servercfgfullpath}" ]; then
-		servername="${unavailable}"
-		serverpassword="${unavailable}"
-		port="${zero}"
-		queryport="${zero}"
-		maxplayers="${unavailable}"
-	else
-		servername=$(grep "ServerName=" "${servercfgfullpath}" | sed -e 's/^[ \t]*//g' -e '/^#/d' -e 's/ServerName//g' | tr -d '=\";,:' | sed -e 's/^[ \t]*//' -e 's/[ \t]*$//')
-		serverpassword=$(grep "Password=" "${servercfgfullpath}" | sed -e 's/^[ \t]*//g' -e '/^#/d' -e 's/Password//g' | tr -d '=\";,:' | sed -e 's/^[ \t]*//' -e 's/[ \t]*$//')
-		port=$(grep "ServerPort=" "${servercfgfullpath}" | tr -cd '[:digit:]')
-		queryport=$((port + 1))
-		maxplayers=$(grep "MaxPlayers=" "${servercfgfullpath}" | tr -cd '[:digit:]')
-
-		# Not set
-		servername=${servername:-"NOT SET"}
-		serverpassword=${serverpassword:-"NOT SET"}
-		port=${port:-"0"}
-		queryport=${queryport:-"0"}
-		maxplayers=${maxplayers:-"0"}
-	fi
-}
-
-fn_info_game_bt() {
-	# Config
-	if [ ! -f "${servercfgfullpath}" ]; then
-		servername="${unavailable}"
-		serverpassword="${unavailable}"
-		port="${zero}"
-		queryport="${zero}"
-		maxplayers="${unavailable}"
-	else
-		servername=$(grep -Po 'name="\K.*(?=")' "${servercfgfullpath}")         # Assuming GNU grep is used
-		serverpassword=$(grep -Po 'password="\K.*(?=")' "${servercfgfullpath}") # Assuming GNU grep is used
-		port=$(grep " port=" "${servercfgfullpath}" | tr -cd '[:digit:]')
-		queryport=$(grep "queryport=" "${servercfgfullpath}" | tr -cd '[:digit:]')
-		maxplayers=$(grep "maxplayers=" "${servercfgfullpath}" | tr -cd '[:digit:]')
-
-		# Not set
-		servername=${servername:-"NOT SET"}
-		serverpassword=${serverpassword:-"NOT SET"}
-		port=${port:-"0"}
-		queryport=${queryport:-"0"}
-		maxplayers=${maxplayers:-"0"}
-	fi
-}
-
-fn_info_game_btl() {
-	# Config
-	if [ ! -f "${servercfgfullpath}" ]; then
-		servername="${unavailable}"
-		serverpassword="${unavailable}"
-		gamemode="${unavailable}"
-	else
-		servername=$(grep -m2 "ServerName" "${servercfgfullpath}" | sed -e 's/^[ \t]*//g' -e '/^--/d' -e 's/ServerName//g' | tr -d '=\";,:' | sed -e 's/^[ \t]*//' -e 's/[ \t]*$//')
-		serverpassword=$(grep "Password" "${servercfgfullpath}" | grep -v "RCONPassword" | sed -e 's/^[ \t]*//g' -e '/^--/d' -e 's/Password//g' | tr -d '=\";,:' | sed -e 's/^[ \t]*//' -e 's/[ \t]*$//')
-		gamemode=$(grep -m2 "PlayMode" "${servercfgfullpath}" | sed -e 's/^[ \t]*//g' -e '/^--/d' -e 's/PlayMode//g' | tr -d '=\";,:' | sed -e 's/^[ \t]*//' -e 's/[ \t]*$//')
-
-		# Not set
-		servername=${servername:-"NOT SET"}
-		serverpassword=${serverpassword:-"NOT SET"}
-		gamemode=${gamemode:-"NOT SET"}
-	fi
-
-	# Parameters
-	port=${port:-"0"}
-	queryport=${queryport:-"0"}
-	rconport=$((port + 2))
-}
-
-fn_info_game_cd() {
-	if [ ! -f "${servercfgfullpath}" ]; then
-		servername="${unavailable}"
-		port="${zero}"
-		rconenabled="false"
-		rconport="${zero}"
-		rconpassword="${unavailable}"
-		steamport="${zero}"
-		maxplayers="${zero}"
-	else
-		servername=$(jq -r '.game_title' "${servercfgfullpath}")
-		port=$(jq -r '.game_port' "${servercfgfullpath}")
-		steamport=$(jq -r '.steam_port_messages' "${servercfgfullpath}")
-		rconenabled=$(jq -r '.rcon' "${servercfgfullpath}")
-		rconport=$(jq -r '.rcon_port' "${servercfgfullpath}")
-		rconpassword=$(jq -r '.rcon_password' "${servercfgfullpath}")
-		maxplayers=$(jq -r '.player_count' "${servercfgfullpath}")
-	fi
-}
-
-fn_info_game_ck() {
-	if [ ! -f "${servercfgfullpath}" ]; then
-		servername="${unavailable}"
-		maxplayers="${zero}"
-	else
-		servername=$(jq -r '.worldName' "${servercfgfullpath}")
-		maxplayers=$(jq -r '.maxNumberPlayers' "${servercfgfullpath}")
-	fi
-	queryport=$((port + 1))
-}
-
-fn_info_game_cmw() {
-	# Config
-	if [ ! -f "${servercfgfullpath}" ]; then
-		adminpassword="${unavailable}"
-		rconport=${zero}
-		servername="${unavailable}"
-		serverpassword="${unavailable}"
-
-	else
-		adminpassword=$(grep -E "^adminpassword=" "${servercfgfullpath}" | tr -cd '[:digit:]')
-		rconport=$(grep -E "^RConPort=" "${servercfgdir}/DefaultGame.ini" | tr -cd '[:digit:]')
-		servername=$(grep -E "^ServerName" "${servercfgfullpath}" | sed 's/^ServerName=//')
-		serverpassword=$(grep -E "^GamePassword" "${servercfgfullpath}" | sed 's/^ServerName=//')
-
-		# Not set
-		adminpassword=${adminpassword:-"NOT SET"}
-		rconport=${rconport:-"0"}
-		servername=${servername:-"NOT SET"}
-		serverpassword=${serverpassword:-"NOT SET"}
-	fi
-
-	# Parameters
-	defaultmap=${defaultmap:-"NOT SET"}
-	port=${port:-"0"}
-	queryport=${queryport:-"0"}
-}
-
-fn_info_game_cod() {
-	# Config
-	if [ ! -f "${servercfgfullpath}" ]; then
-		servername="${unavailable}"
-		rconpassword="${unavailable}"
-	else
-		servername=$(grep "sv_hostname " "${servercfgfullpath}" | sed -e 's/^[ \t]*//g' -e '/^\//d' -e 's/set sv_hostname //g' | tr -d '=\";,:' | xargs)
-		rconpassword=$(grep "rconpassword" "${servercfgfullpath}" | sed -e 's/^[ \t]*//g' -e '/^\//d' -e 's/set rconpassword //g' | tr -d '=\";,:' | sed -e 's/^[ \t]*//' -e 's/[ \t]*$//')
-
-		# Not set
-		servername=${servername:-"NOT SET"}
-		rconpassword=${rconpassword=:-"NOT SET"}
-	fi
-
-	# Parameters
-	defaultmap=${defaultmap:-"NOT SET"}
-	maxplayers=${maxplayers:-"0"}
-	port=${port:-"0"}
-}
-
-fn_info_game_coduo() {
-	# Config
-	if [ ! -f "${servercfgfullpath}" ]; then
-		servername="${unavailable}"
-		rconpassword="${unavailable}"
-	else
-		servername=$(grep "sv_hostname " "${servercfgfullpath}" | sed -e 's/^[ \t]*//g' -e '/^\//d' -e 's/set sv_hostname //g' | tr -d '=\";,:' | xargs)
-		rconpassword=$(grep "rconpassword" "${servercfgfullpath}" | sed -e 's/^[ \t]*//g' -e '/^\//d' -e 's/set rconpassword //g' | tr -d '=\";,:' | sed -e 's/^[ \t]*//' -e 's/[ \t]*$//')
-
-		# Not set
-		servername=${servername:-"NOT SET"}
-		rconpassword=${rconpassword=:-"NOT SET"}
-	fi
-
-	# Parameters
-	defaultmap=${defaultmap:-"NOT SET"}
-	maxplayers=${maxplayers:-"0"}
-	port=${port:-"0"}
-	queryport=${port:-"28960"}
-}
-
-fn_info_game_cod2() {
-	# Config
-	if [ ! -f "${servercfgfullpath}" ]; then
-		servername="${unavailable}"
-		rconpassword="${unavailable}"
-	else
-		servername=$(grep "sv_hostname " "${servercfgfullpath}" | sed -e 's/^[ \t]*//g' -e '/^\//d' -e 's/set sv_hostname //g' | tr -d '=\";,:' | xargs)
-		rconpassword=$(grep "rconpassword" "${servercfgfullpath}" | sed -e 's/^[ \t]*//g' -e '/^\//d' -e 's/set rconpassword //g' | tr -d '=\";,:' | sed -e 's/^[ \t]*//' -e 's/[ \t]*$//')
-
-		# Not set
-		servername=${servername:-"NOT SET"}
-		rconpassword=${rconpassword=:-"NOT SET"}
-	fi
-
-	# Parameters
-	defaultmap=${defaultmap:-"NOT SET"}
-	maxplayers=${maxplayers:-"0"}
-	port=${port:-"0"}
-	queryport=${port:-"28960"}
-}
-
-fn_info_game_cod4() {
-	# Config
-	if [ ! -f "${servercfgfullpath}" ]; then
-		servername="${unavailable}"
-		rconpassword="${unavailable}"
-	else
-		servername=$(sed -nr 's/^set\s*sv_hostname\s*"(.*)".*/\1/p' "${servercfgfullpath}")
-		rconpassword=$(sed -nr 's/^set\s*rcon_password\s*"(.*)"\s*\/.*/\1/p' "${servercfgfullpath}")
-		queryport=${port:-"28960"}
-
-		# Not set
-		servername=${servername:-"NOT SET"}
-		rconpassword=${rconpassword=:-"NOT SET"}
-		queryport=${queryport:-"28960"}
-	fi
-
-	# Parameters
-	defaultmap=${defaultmap:-"NOT SET"}
-	maxplayers=${maxplayers:-"0"}
-	port=${port:-"0"}
-	queryport=${port:-"28960"}
-}
-
-fn_info_game_codwaw() {
-	# Config
-	if [ ! -f "${servercfgfullpath}" ]; then
-		servername="${unavailable}"
-		rconpassword="${unavailable}"
-	else
-		servername=$(grep "sv_hostname " "${servercfgfullpath}" | sed -e 's/^[ \t]*//g' -e '/^\//d' -e 's/set sv_hostname //g' | tr -d '=\";,:' | xargs)
-		rconpassword=$(grep "rconpassword" "${servercfgfullpath}" | sed -e 's/^[ \t]*//g' -e '/^\//d' -e 's/set rconpassword //g' | tr -d '=\";,:' | sed -e 's/^[ \t]*//' -e 's/[ \t]*$//')
-
-		# Not set
-		servername=${servername:-"NOT SET"}
-		rconpassword=${rconpassword=:-"NOT SET"}
-	fi
-
-	# Parameters
-	defaultmap=${defaultmap:-"NOT SET"}
-	maxplayers=${maxplayers:-"0"}
-	port=${port:-"0"}
-	queryport=${port:-"28960"}
-}
-
-fn_info_game_col() {
-	# Config
-	if [ ! -f "${servercfgfullpath}" ]; then
-		servername="${unavailable}"
-		serverpassword="${unavailable}"
-		maxplayers="${unavailable}"
-		port="${zero}"
-		queryport="${zero}"
-		steamport="${zero}"
-		rconpassword="${unavailable}"
-	else
-		servername=$(jq -r '.ServerSettings.ServerName' "${servercfgfullpath}")
-		serverpassword=$(jq -r '.ServerSettings.ServerPassword' "${servercfgfullpath}")
-		maxplayers=$(jq -r '.ServerSettings.MaxPlayerCount' "${servercfgfullpath}")
-		port=$(jq -r '.ServerSettings.ServerGamePort' "${servercfgfullpath}")
-		queryport=${port:-"0"}
-		steamport=$(jq -r '.ServerSettings.ServerSteamPort' "${servercfgfullpath}")
-		rconpassword=$(jq -r '.ServerSettings.RCONPassword' "${servercfgfullpath}")
-		configip=$(jq -r '.ServerSettings.ServerIP' "${servercfgfullpath}")
-
-		# Not set
-		servername=${servername:-"NOT SET"}
-		serverpassword=${serverpassword:-"NOT SET"}
-		maxplayers=${maxplayers:-"0"}
-		port=${port:-"27004"}
-		queryport=${queryport:-"0"}
-		steamport=${steamport:-"27005"}
-		rconpassword=${rconpassword:-"NOT SET"}
-		configip=${configip:-"0.0.0.0"}
-	fi
-}
-
-fn_info_game_dodr() {
-	# Config
-	if [ ! -f "${servercfgfullpath}" ]; then
-		maxplayers="${zero}"
-	else
-		maxplayers=$(sed -nr 's/^iServerMaxPlayers=(.*)$/\1/p' "${servercfgfullpath}")
-
-		# Not set
-		maxplayers=${maxplayers:-"0"}
-	fi
-
-	# Parameters
-	servername=${servername:-"NOT SET"}
-	port=${port:-"7777"}
-	queryport=${queryport:-"27015"}
-}
-
-fn_info_game_dayz() {
-	# Config
-	if [ ! -f "${servercfgfullpath}" ]; then
-		servername="${unavailable}"
-		adminpassword="${unavailable}"
-		serverpassword="${unavailable}"
-		maxplayers="${zero}"
-	else
-		servername=$(sed -nr 's/^hostname\s*=\s*"(.*)"\s*;/\1/p' "${servercfgfullpath}")
-		adminpassword=$(sed -nr 's/^passwordAdmin\s*=\s*"(.*)"\s*;/\1/p' "${servercfgfullpath}")
-		serverpassword=$(sed -nr 's/^password\s*=\s*"(.*)"\s*;/\1/p' "${servercfgfullpath}")
-		maxplayers=$(sed -nr 's/^maxPlayers\s*=\s*([0-9]+)\s*;/\1/p' "${servercfgfullpath}")
-		queryport=$(sed -nr 's/^steamQueryPort\s*=\s*([0-9]+)\s*;/\1/p' "${servercfgfullpath}")
-
-		# Not Set
-		servername=${servername:-"NOT SET"}
-		adminpassword=${adminpassword:-"NOT SET"}
-		serverpassword=${serverpassword:-"NOT SET"}
-		maxplayers=${maxplayers:-"0"}
-		queryport=${queryport:-"27016"}
-	fi
-
-	# Parameters
-	port=${port:-"2302"}
-	steammasterport=$((port + 2))
-	battleeyeport=$((port + 4))
-}
-
-fn_info_game_dst() {
-	# Config
-	if [ ! -f "${clustercfgfullpath}" ]; then
-		servername="${unavailable}"
-		serverpassword="${unavailable}"
-		maxplayers="${zero}"
-		gamemode="${unavailable}"
-		tickrate="${zero}"
-		masterport="${zero}"
-	else
-		servername=$(grep "cluster_name" "${clustercfgfullpath}" | sed -e 's/^[ \t]*//g' -e '/^#/d' -e 's/cluster_name//g' | tr -d '=\";,:' | sed -e 's/^[ \t]*//' -e 's/[ \t]*$//')
-		serverpassword=$(grep "cluster_password" "${clustercfgfullpath}" | sed -e 's/^[ \t]*//g' -e '/^#/d' -e 's/cluster_password//g' | tr -d '=\";,:' | sed -e 's/^[ \t]*//' -e 's/[ \t]*$//')
-		maxplayers=$(grep "max_players" "${clustercfgfullpath}" | grep -v "#" | tr -cd '[:digit:]')
-		gamemode=$(grep "game_mode" "${clustercfgfullpath}" | sed -e 's/^[ \t]*//g' -e '/^#/d' -e 's/game_mode//g' | tr -d '=\";,:' | sed -e 's/^[ \t]*//' -e 's/[ \t]*$//')
-		tickrate=$(grep "tick_rate" "${clustercfgfullpath}" | grep -v "#" | tr -cd '[:digit:]')
-		masterport=$(grep "master_port" "${clustercfgfullpath}" | grep -v "#" | tr -cd '[:digit:]')
-		configip=$(grep "bind_ip" "${clustercfgfullpath}" | sed -e 's/^[ \t]*//g' -e '/^#/d' -e 's/bind_ip//g' | tr -d '=\";,:' | sed -e 's/^[ \t]*//' -e 's/[ \t]*$//')
-
-		# Not set
-		servername=${servername:-"NOT SET"}
-		serverpassword=${serverpassword:-"NOT SET"}
-		maxplayers=${maxplayers:-"0"}
-		gamemode=${gamemode:-"NOT SET"}
-		tickrate=${tickrate:-"0"}
-		masterport=${masterport:-"0"}
-		configip=${configip:-"0.0.0.0"}
-	fi
-
-	if [ ! -f "${servercfgfullpath}" ]; then
-		port="${zero}"
-		steamauthport="${zero}"
-		steammasterport="${zero}"
-	else
-		port=$(grep "server_port" "${servercfgfullpath}" | grep "^server_port" | grep -v "#" | tr -cd '[:digit:]')
-		steamauthport=$(grep "authentication_port" "${servercfgfullpath}" | grep -v "#" | tr -cd '[:digit:]')
-		steammasterport=$(grep "master_server_port" "${servercfgfullpath}" | grep -v "#" | tr -cd '[:digit:]')
-
-		# Not set
-		port=${port:-"0"}
-		steamauthport=${steamauthport:-"0"}
-		steammasterport=${steammasterport:-"0"}
-	fi
-
-	# Parameters
-	sharding=${sharding:-"NOT SET"}
-	master=${master:-"NOT SET"}
-	shard=${shard:-"NOT SET"}
-	cluster=${cluster:-"NOT SET"}
-	cave=${cave:-"NOT SET"}
-}
-
-fn_info_game_eco() {
-	# Config
-	if [ ! -f "${servercfgfullpath}" ]; then
-		servername="${unavailable}"
-		serverpassword="${unavailable}"
-		maxplayers="${zero}"
-		tickrate="${zero}"
-		port="${zero}"
-		webadminport="${zero}"
-	else
-		configip=$(jq -r '.IPAddress' "${servercfgfullpath}")
-		servername=$(jq -r '.Description' "${servercfgfullpath}")
-		serverpassword=$(jq -r '.Password' "${servercfgfullpath}")
-		maxplayers=$(jq -r '.MaxConnections' "${servercfgfullpath}")
-		tickrate=$(jq -r '.Rate' "${servercfgfullpath}")
-		port=$(jq -r '.GameServerPort' "${servercfgfullpath}")
-		webadminport=$(jq -r '.WebServerPort' "${servercfgfullpath}")
-
-		# Not set
-		configip=${configip:-"0.0.0.0"}
-		servername=${servername:-"NOT SET"}
-		serverpassword=${serverpassword:-"NOT SET"}
-		maxplayers=${maxplayers=:-"0"}
-		tickrate=${tickrate=:-"0"}
-		port=${port=:-"0"}
-		webadminport=${webadminport=:-"0"}
-	fi
-}
-
-fn_info_game_etl() {
-	# Config
-	if [ ! -f "${servercfgfullpath}" ]; then
-		rconpassword="${unavailable}"
-		servername="${unavailable}"
-		serverpassword="${unavailable}"
-		maxplayers="${zero}"
-		port="${zero}"
-		queryport="${zero}"
-	else
-		port=$(grep "set net_port" "${servercfgfullpath}" | grep -v "//" | tr -cd '[:digit:]')
-		queryport="${port}"
-		rconpassword=$(grep "set rconpassword" "${servercfgfullpath}" | sed -e 's/^[ \t]*//g' -e '/^\//d' -e 's/set rconpassword //g' | tr -d '=\";,:' | sed -e 's/^[ \t]*//g' -e '/^\//d' | sed -e 's/^[ \t]*//' -e 's/[ \t]*$//')
-		servername=$(grep "set sv_hostname" "${servercfgfullpath}" | sed -e 's/^[ \t]*//g' -e '/^\//d' -e 's/set sv_hostname //g' | tr -d '=\";,:' | sed -e 's/^[ \t]*//' -e 's/[ \t]*$//')
-		serverpassword=$(grep "set g_password" "${servercfgfullpath}" | sed -e 's/^[ \t]*//g' -e '/^\//d' -e 's/set g_password //g' | tr -d '=\";,:' | sed -e 's/^[ \t]*//' -e 's/[ \t]*$//')
-		maxplayers=$(grep "set sv_maxclients" "${servercfgfullpath}" | grep -v "//" | tr -cd '[:digit:]')
-		configip=$(grep "set net_ip" "${servercfgfullpath}" | sed -e 's/^[ \t]*//g' -e '/^\//d' -e 's/set net_ip//g' | tr -d '=\";,:' | sed -e 's/^[ \t]*//' -e 's/[ \t]*$//')
-
-		# Not set
-		rconpassword=${rconpassword:-"NOT SET"}
-		servername=${servername:-"NOT SET"}
-		serverpassword=${serverpassword:-"NOT SET"}
-		maxplayers=${maxplayers:-"0"}
-		port=${port:-"27960"}
-		queryport=${queryport:-"27960"}
-		configip=${configip:-"0.0.0.0"}
-	fi
-}
-
-fn_info_game_fctr() {
-	# Config
-	if [ ! -f "${servercfgfullpath}" ]; then
-		servername="Factorio Server"
-		serverpassword="${unavailable}"
-		maxplayers="${zero}"
-		authtoken="${unavailable}"
-		savegameinterval="${unavailable}"
-		versioncount="${unavailable}"
-	else
-		servername=$(jq -r '.name' "${servercfgfullpath}")
-		serverpassword=$(jq -r '.game_password' "${servercfgfullpath}")
-		maxplayers=$(jq -r '.max_players' "${servercfgfullpath}")
-		authtoken=$(jq -r '.token' "${servercfgfullpath}")
-		savegameinterval=$(jq -r '.autosave_interval' "${servercfgfullpath}")
-		versioncount=$(jq -r '.autosave_slots' "${servercfgfullpath}")
-
-		# Not set
-		servername=${servername:-"NOT SET"}
-		serverpassword=${serverpassword:-"NOT SET"}
-		maxplayers=${maxplayers:-"0"}
-		authtoken=${authtoken:-"NOT SET"}
-		savegameinterval=${savegameinterval:-"0"}
-		versioncount=${versioncount:-"0"}
-	fi
-
-	# Parameters
-	port=${port:-"0"}
-	rconport=${rconport:-"0"}
-	rconpassword=${rconpassword:-"NOT SET"}
-
-	# get server version if installed
-	local factoriobin="${executabledir}${executable:1}"
-	if [ -f "${factoriobin}" ]; then
-		serverversion=$(${factoriobin} --version | grep "Version:" | awk '{print $2}')
-	fi
-}
-
-fn_info_game_jc2() {
-	# Config
-	if [ ! -f "${servercfgfullpath}" ]; then
-		servername="${unavailable}"
-		serverdescription="${unavailable}"
-		serverpassword="${unavailable}"
-		maxplayers="${zero}"
-		port="${zero}"
-		queryport="${zero}"
-	else
-		servername=$(grep "Name" "${servercfgfullpath}" | sed -e 's/^[ \t]*//g' -e '/^--/d' -e 's/Name//g' | tr -d '=\";,:' | sed -e 's/^[ \t]*//' -e 's/[ \t]*$//')
-		serverdescription=$(grep "Description" "${servercfgfullpath}" | sed -e 's/^[ \t]*//g' -e '/^--/d' -e 's/Description//g' | tr -d '=\";,:' | sed -e 's/^[ \t]*//' -e 's/[ \t]*$//')
-		serverpassword=$(grep "Password" "${servercfgfullpath}" | sed -e 's/^ *//g' -e '/^--/d' -e 's/Password//g' | tr -d '=\";,:' | sed -e 's/^[ \t]*//' -e 's/[ \t]*$//')
-		maxplayers=$(grep "MaxPlayers" "${servercfgfullpath}" | grep -v "\--" | tr -cd '[:digit:]')
-		port=$(grep "BindPort" "${servercfgfullpath}" | grep -v "\--" | tr -cd '[:digit:]')
-		queryport="${port}"
-		configip=$(grep "BindIP" "${servercfgfullpath}" | sed -e 's/^[ \t]*//g' -e '/^--/d' -e 's/BindIP//g' | tr -d '=\";,:' | sed -e 's/^[ \t]*//' -e 's/[ \t]*$//')
-
-		# Not set
-		servername=${servername:-"NOT SET"}
-		serverpassword=${serverpassword:-"NOT SET"}
-		serverdescription=${serverdescription:-"NOT SET"}
-		maxplayers=${maxplayers:-"0"}
-		port=${port:-"0"}
-		queryport=${queryport:-"0"}
-		configip=${configip:-"0.0.0.0"}
-	fi
-}
-
-fn_info_game_hw() {
-	# Parameters
-	servername=${servername:-"NOT SET"}
-	port=${port:-"0"}
-	queryport=${queryport:-"0"}
-	maxplayers=${maxplayers:-"0"}
-	defaultmap=${defaultmap:-"NOT SET"}
-	creativemode=${creativemode:-"NOT SET"}
-}
-
-fn_info_game_inss() {
-	# Parameters
-	port=${port:-"0"}
-	queryport=${queryport:-"0"}
-	rconport=${rconport:-"0"}
-	servername=${servername:-"NOT SET"}
-	serverpassword=${serverpassword:-"NOT SET"}
-	defaultmap=${defaultmap:-"NOT SET"}
-	defaultscenario=${defaultscenario:-"NOT SET"}
-	maxplayers=${maxplayers:-"0"}
-}
-
-fn_info_game_jc3() {
-	# Config
-	if [ ! -f "${servercfgfullpath}" ]; then
-		servername="${unavailable}"
-		serverdescription="${unavailable}"
-		serverpassword="${unavailable}"
-		maxplayers="${zero}"
-		port="${zero}"
-		queryPort="${zero}"
-		steamport="${zero}"
-		httpport="${zero}"
-		tickrate="${zero}"
-	else
-		servername=$(grep "name" "${servercfgfullpath}" | sed -e 's/^[ \t]*//g' -e '/^#/d' -e 's/name//g' | tr -d '=\";,:' | sed -e 's/^[ \t]*//' -e 's/[ \t]*$//')
-		serverdescription=$(grep "description" "${servercfgfullpath}" | sed -e 's/^[ \t]*//g' -e '/^#/d' -e 's/description//g' | tr -d '=\";,:' | sed -e 's/^[ \t]*//' -e 's/[ \t]*$//')
-		serverpassword=$(grep "password" "${servercfgfullpath}" | sed -e 's/^[ \t]*//g' -e '/^#/d' -e 's/password//g' | tr -d '=\";,:' | sed -e 's/^[ \t]*//' -e 's/[ \t]*$//')
-		maxplayers=$(grep "\"maxPlayers\"" "${servercfgfullpath}" | tr -cd '[:digit:]')
-		port=$(grep "\"port\"" "${servercfgfullpath}" | tr -cd '[:digit:]')
-		queryport=$(grep "\"queryPort\"" "${servercfgfullpath}" | tr -cd '[:digit:]')
-		steamport=$(grep "\"steamPort\"" "${servercfgfullpath}" | tr -cd '[:digit:]')
-		httpport=$(grep "\"httpPort\"" "${servercfgfullpath}" | tr -cd '[:digit:]')
-		tickrate=$(grep "\"maxTickRate\"" "${servercfgfullpath}" | tr -cd '[:digit:]')
-		configip=$(grep "host" "${servercfgfullpath}" | sed -e 's/^[ \t]*//g' -e '/^#/d' -e 's/host//g' | tr -d '=\";,:' | sed -e 's/^[ \t]*//' -e 's/[ \t]*$//')
-
-		# Not set
-		servername=${servername:-"NOT SET"}
-		serverdescription=${serverdescription:-"NOT SET"}
-		serverpassword=${serverpassword:-"NOT SET"}
-		maxplayers=${maxplayers=:-"0"}
-		port=${port=:-"0"}
-		queryport=${queryport=:-"0"}
-		steamport=${steamport=:-"0"}
-		httpport=${httpport=:-"0"}
-		tickrate=${tickrate=:-"0"}
-		configip=${configip:-"0.0.0.0"}
-	fi
-}
-
-fn_info_game_jk2() {
-	# Config
-	if [ ! -f "${servercfgfullpath}" ]; then
-		rconpassword="${unavailable}"
-		servername="${unavailable}"
-		serverpassword="${unavailable}"
-		maxplayers="${zero}"
-		serverversion="${unavailable}"
-	else
-		rconpassword=$(grep "seta rconpassword" "${servercfgfullpath}" | sed -e 's/^[ \t]*//g' -e '/^\//d' -e 's/seta rconpassword//g' | tr -d '=\";,:' | sed -e 's/^[ \t]*//' -e 's/[ \t]*$//')
-		servername=$(grep "seta sv_hostname" "${servercfgfullpath}" | sed -e 's/^[ \t]*//g' -e '/^\//d' -e 's/seta sv_hostname//g' | tr -d '=\";,:' | sed -e 's/^[ \t]*//' -e 's/[ \t]*$//')
-		serverpassword=$(grep "seta g_password" "${servercfgfullpath}" | sed -e 's/^[ \t]*//g' -e '/^\//d' -e 's/seta g_password//g' | tr -d '=\";,:' | sed -e 's/^[ \t]*//' -e 's/[ \t]*$//')
-		maxplayers=$(grep "seta sv_maxclients" "${servercfgfullpath}" | grep -v "#" | tr -cd '[:digit:]')
-		serverversion=$(grep "seta mv_serverversion" "${servercfgfullpath}" | sed -e 's/^[ \t]*//g' -e '/^\//d' -e 's/seta mv_serverversion//g' | tr -d '=\";,:' | sed -e 's/^[ \t]*//' -e 's/[ \t]*$//')
-
-		# Not set
-		rconpassword=${rconpassword:-"NOT SET"}
-		servername=${servername:-"NOT SET"}
-		serverpassword=${serverpassword:-"NOT SET"}
-		maxplayers=${maxplayers:-"0"}
-		serverversion=${serverversion:-"NOT SET"}
-	fi
-
-	# Parameters
-	port=${port:-"0"}
-	queryport=${port}
-	defaultmap=${defaultmap:-"NOT SET"}
-}
-
-fn_info_game_kf() {
-	# Config
-	if [ ! -f "${servercfgfullpath}" ]; then
-		servername="${unavailable}"
-		serverpassword="${unavailable}"
-		adminpassword="${unavailable}"
-		port="${zero}"
-		queryport="${zero}"
-		queryportgs="${zero}"
-		steamport="${zero}"
-		steammasterport="${zero}"
-		lanport="${zero}"
-		httpport="${zero}"
-		webadminenabled="${unavailable}"
-		webadminuser="${unavailable}"
-		webadminpass="${unavailable}"
-	else
-		servername=$(sed -nr 's/^ServerName=(.*)$/\1/p' "${servercfgfullpath}" | tr -d '=\";,:' | sed 's/\r$//')
-		serverpassword=$(sed -nr 's/^GamePassword=(.*)$/\1/p' "${servercfgfullpath}" | tr -d '=\";,:' | sed 's/\r$//')
-		adminpassword=$(sed -nr 's/^AdminPassword=(.*)$/\1/p' "${servercfgfullpath}" | tr -d '=\";,:' | sed 's/\r$//')
-		port=$(sed -nr 's/^Port=(.*)$/\1/p' "${servercfgfullpath}" | tr -cd '[:digit:]')
-		queryport=$((port + 1))
-		queryportgs=$(sed -nr 's/^OldQueryPortNumber=(.*)$/\1/p' "${servercfgfullpath}" | tr -cd '[:digit:]')
-		steamport="20560"
-		steammasterport="28852"
-		lanport=$(grep "LANServerPort=" "${servercfgfullpath}" | tr -cd '[:digit:]')
-		httpport=$(sed -nr 's/^ListenPort=(.*)$/\1/p' "${servercfgfullpath}" | tr -cd '[:digit:]')
-		webadminenabled=$(sed -nr 's/^bEnabled=(.*)$/\1/p' "${servercfgfullpath}" | tr -d '=\";,:' | sed 's/\r$//')
-		webadminuser=$(sed -nr 's/^AdminName=(.*)$/\1/p' "${servercfgfullpath}" | tr -d '=\";,:' | sed 's/\r$//')
-		webadminpass="${adminpassword}"
-
-		# Not set
-		servername=${servername:-"NOT SET"}
-		serverpassword=${serverpassword:-"NOT SET"}
-		adminpassword=${adminpassword:-"NOT SET"}
-		port=${port:-"0"}
-		queryport=${queryport:-"0"}
-		queryportgs=${queryportgs:-"0"}
-		steamport=${steamport:-"0"}
-		steammasterport=${steammasterport:-"0"}
-		lanport=${lanport:-"0"}
-		httpport=${httpport:-"0"}
-		webadminenabled=${webadminenabled:-"NOT SET"}
-		webadminuser=${webadminuser:-"NOT SET"}
-		webadminpass=${webadminpass:-"NOT SET"}
-	fi
-
-	# Parameters
-	defaultmap=${defaultmap:-"NOT SET"}
-}
-
-fn_info_game_kf2() {
-	# Config
-	if [ ! -f "${servercfgfullpath}" ]; then
-		servername="${unavailable}"
-		serverpassword="${unavailable}"
-		adminpassword="${unavailable}"
-		port=${zero}
-		queryport=${zero}
-		webadminenabled="${unavailable}"
-		httpport="${zero}"
-		webadminuser="${unavailable}"
-		webadminpass="${unavailable}"
-	else
-		servername=$(grep "ServerName" "${servercfgfullpath}" | sed -e 's/^[ \t]*//g' -e '/^#/d' -e 's/ServerName//g' | tr -d '=\";,:' | sed -e 's/^[ \t]*//' -e 's/[ \t]*$//')
-		serverpassword=$(grep "GamePassword" "${servercfgfullpath}" | sed -e 's/^[ \t]*//g' -e '/^#/d' -e 's/GamePassword//g' | tr -d '=\";,:' | sed -e 's/^[ \t]*//' -e 's/[ \t]*$//')
-		adminpassword=$(grep "AdminPassword" "${servercfgfullpath}" | sed -e 's/^[ \t]*//g' -e '/^#/d' -e 's/AdminPassword//g' | tr -d '=\";,:' | sed -e 's/^[ \t]*//' -e 's/[ \t]*$//')
-		port=$(grep "Port" "${servercfgdir}/LinuxServer-KFEngine.ini" | sed -e 's/^[ \t]*//g' | grep "^Port" | grep -v "#" | tr -cd '[:digit:]')
-		webadminenabled=$(grep "bEnabled" "${servercfgdir}/KFWeb.ini" | sed -e 's/^[ \t]*//g' -e '/^#/d' -e 's/bEnabled//g' | tr -d '=\";,:' | sed -e 's/^[ \t]*//' -e 's/[ \t]*$//')
-		httpport=$(grep "ListenPort" "${servercfgdir}/KFWeb.ini" | grep -v "#" | tr -cd '[:digit:]')
-		webadminuser="Admin"
-		webadminpass=$(grep "AdminPassword" "${servercfgfullpath}" | sed -e 's/^[ \t]*//g' -e '/^#/d' -e 's/AdminPassword//g' | tr -d '=\";,:' | sed -e 's/^[ \t]*//' -e 's/[ \t]*$//')
-
-		# Not set
-		servername=${servername:-"NOT SET"}
-		serverpassword=${serverpassword:-"NOT SET"}
-		adminpassword=${adminpassword:-"NOT SET"}
-		port=${port:-"0"}
-		webadminenabled=${webadminenabled:-"NOT SET"}
-		httpport=${webadminport:-"0"}
-		webadminuser=${webadminuser:-"NOT SET"}
-		webadminpass=${webadminpass:-"NOT SET"}
-	fi
-
-	# Parameters
-	queryport=${queryport:-"0"}
-	defaultmap=${defaultmap:-"NOT SET"}
-}
-
-fn_info_game_lo() {
-	# Parameters
-	servername=${servername:-"NOT SET"}
-	port=${port:-"0"}
-	queryport=${queryport:-"0"}
-	maxplayers=${slots:-"0"}
-}
-
-fn_info_game_mc() {
-	# Config
-	if [ ! -f "${servercfgfullpath}" ]; then
-		servername="${unavailable}"
-		rconpassword="${unavailable}"
-		rconport="${zero}"
-		maxplayers="${zero}"
-		port="${zero}"
-		queryport="${zero}"
-		queryenabled="${unavailable}"
-		gamemode="${unavailable}"
-		gameworld="${unavailable}"
-	else
-		servername=$(grep "motd" "${servercfgfullpath}" | sed -e 's/^[ \t]*//g' -e '/^#/d' -e 's/motd//g' | tr -d '=\";,:' | sed 's/\\u00A70//g;s/\\u00A71//g;s/\\u00A72//g;s/\\u00A73//g;s/\\u00A74//g;s/\\u00A75//g;s/\\u00A76//g;s/\\u00A77//g;s/\\u00A78//g;s/\\u00A79//g;s/\\u00A7a//g;s/\\u00A7b//g;s/\\u00A7c//g;s/\\u00A7d//g;s/\\u00A7e//g;s/\\u00A7f//g;s/\\u00A7l//g;s/\\u00A7o//g;s/\\u00A7n//g;s/\\u00A7m//g;s/\\u00A7k//g' | sed -e 's/^[ \t]*//' -e 's/[ \t]*$//')
-		rconpassword=$(grep "rcon.password" "${servercfgfullpath}" | sed -e 's/^[ \t]*//g' -e '/^#/d' -e 's/rcon.password//g' | tr -d '=\";,:' | sed -e 's/^[ \t]*//' -e 's/[ \t]*$//')
-		rconport=$(grep "rcon.port" "${servercfgfullpath}" | grep -v "#" | tr -cd '[:digit:]')
-		maxplayers=$(grep "max-players" "${servercfgfullpath}" | grep -v "#" | tr -cd '[:digit:]')
-		port=$(grep "server-port" "${servercfgfullpath}" | grep -v "#" | tr -cd '[:digit:]')
-		queryport=$(grep "query.port" "${servercfgfullpath}" | grep -v "#" | tr -cd '[:digit:]')
-		if [ -z "${queryport}" ]; then
-			queryport=${port}
-		fi
-		queryenabled=$(grep "enable-query" "${servercfgfullpath}" | sed -e 's/^[ \t]*//g' -e '/^#/d' -e 's/enable-query//g' | tr -d '=\";,:' | sed -e 's/^[ \t]*//' -e 's/[ \t]*$//')
-		gamemode=$(grep "gamemode" "${servercfgfullpath}" | grep -v "#" | tr -cd '[:digit:]')
-		gameworld=$(grep "level-name" "${servercfgfullpath}" | sed -e 's/^[ \t]*//g' -e '/^#/d' -e 's/level-name//g' | tr -d '=\";,:' | sed -e 's/^[ \t]*//' -e 's/[ \t]*$//')
-		configip=$(grep "server-ip" "${servercfgfullpath}" | sed -e 's/^[ \t]*//g' -e '/^--/d' -e 's/server-ip//g' | tr -d '=\";,:' | sed -e 's/^[ \t]*//' -e 's/[ \t]*$//')
-
-		# Not set
-		servername=${servername:-"NOT SET"}
-		rconpassword=${rconpassword:-"NOT SET"}
-		rconport=${rconport:-"NOT SET"}
-		maxplayers=${maxplayers:-"0"}
-		port=${port:-"NOT SET"}
-		queryport=${queryport:-"NOT SET"}
-		queryenabled="${queryenabled:-"NOT SET"}"
-		gamemode=${gamemode:-"NOT SET"}
-		gameworld=${gameworld:-"NOT SET"}
-		configip=${configip:-"0.0.0.0"}
-	fi
-}
-
-fn_info_game_mcb() {
-	# Config
-	if [ ! -f "${servercfgfullpath}" ]; then
-		servername="${unavailable}"
-		maxplayers="${zero}"
-		port="${zero}"
-		portipv6="${zero}"
-		queryport="${zero}"
-		gamemode="${unavailable}"
-		gameworld="${unavailable}"
-	else
-		servername=$(grep "server-name" "${servercfgfullpath}" | sed -e 's/^[ \t]*//g' -e '/^#/d' -e 's/server-name//g' | tr -d '=\";,:' | sed -e 's/^[ \t]*//' -e 's/[ \t]*$//')
-		maxplayers=$(grep "max-players" "${servercfgfullpath}" | grep -v "#" | tr -cd '[:digit:]')
-		port=$(grep "server-port\b" "${servercfgfullpath}" | grep -v "#" | tr -cd '[:digit:]')
-		portipv6=$(grep "server-portv6\b" "${servercfgfullpath}" | sed 's/v6//g' | grep -v "#" | tr -cd '[:digit:]')
-		queryport=${port}
-		gamemode=$(grep "gamemode" "${servercfgfullpath}" | sed -e 's/^[ \t]*//g' -e '/^#/d' -e 's/gamemode//g' | tr -d '=\";,:' | sed -e 's/^[ \t]*//' -e 's/[ \t]*$//')
-		gameworld=$(grep "level-name" "${servercfgfullpath}" | sed -e 's/^[ \t]*//g' -e '/^#/d' -e 's/level-name//g' | tr -d '=\";,:' | sed -e 's/^[ \t]*//' -e 's/[ \t]*$//')
-
-		# Not set
-		servername=${servername:-"NOT SET"}
-		maxplayers=${maxplayers:-"0"}
-		port=${port:-"NOT SET"}
-		portipv6=${portipv6:-"NOT SET"}
-		queryport=${queryport:-"NOT SET"}
-		gamemode=${gamemode:-"NOT SET"}
-		gameworld=${gameworld:-"NOT SET"}
-	fi
-}
-
-fn_info_game_mh() {
-	# Config
-	if [ ! -f "${servercfgfullpath}" ]; then
-		servername="${unavailable}"
-		serverpassword="${unavailable}"
-		rconpassword="${unavailable}"
-		maxplayers="${unavailable}"
-	else
-		servername=$(grep "ServerName" "${servercfgfullpath}" | awk -F '=' '{print $2}')
-		serverpassword=$(grep "ServerPassword" "${servercfgfullpath}" | awk -F '=' '{print $2}')
-		rconpassword=$(grep "AdminPassword" "${servercfgfullpath}" | awk -F '=' '{print $2}')
-		maxplayers=$(grep "MaxSlots" "${servercfgfullpath}" | awk -F '=' '{print $2}')
-
-		# Not set
-		servername=${servername:-"NOT SET"}
-		serverpassword=${serverpassword:-"NOT SET"}
-		rconpassword=${rconpassword:-"NOT SET"}
-		maxplayers=${maxplayers:-"0"}
-	fi
-
-	# Parameters
-	port=${port:-"0"}
-	queryport=${queryport:-"0"}
-	beaconport=${beaconport:-"0"}
-}
-
-fn_info_game_mohaa() {
-	# Config
-	if [ ! -f "${servercfgfullpath}" ]; then
-		rconpassword="${unavailable}"
-		servername="${unavailable}"
-		serverpassword="${unavailable}"
-		maxplayers="${zero}"
-	else
-		rconpassword=$(grep "rconpassword" "${servercfgfullpath}" | sed -e 's/^[ \t]*//g' -e '/^\//d' -e 's/seta rconpassword//g' | tr -d '=\";,:' | sed -e 's/^[ \t]*//' -e 's/[ \t]*$//')
-		servername=$(grep "sv_hostname" "${servercfgfullpath}" | sed -e 's/^[ \t]*//g' -e '/^\//d' -e 's/seta sv_hostname//g' | tr -d '=\";,:' | sed -e 's/^[ \t]*//' -e 's/[ \t]*$//')
-		serverpassword=$(grep "g_password" "${servercfgfullpath}" | sed -e 's/^[ \t]*//g' -e '/^\//d' -e 's/seta g_password//g' | tr -d '=\";,:' | sed -e 's/^[ \t]*//' -e 's/[ \t]*$//')
-		maxplayers=$(grep "sv_maxclients" "${servercfgfullpath}" | grep -v "#" | tr -cd '[:digit:]')
-
-		# Not set
-		rconpassword=${rconpassword:-"NOT SET"}
-		servername=${servername:-"NOT SET"}
-		serverpassword=${serverpassword:-"NOT SET"}
-		maxplayers=${maxplayers:-"0"}
-	fi
-
-	# Parameters
-	port=${port:-"0"}
-	queryport=${port:-"0"}
-	defaultmap=${defaultmap:-"NOT SET"}
-}
-
-fn_info_game_mom() {
-	# Config
-	if [ ! -f "${servercfgfullpath}" ]; then
-		servername="${unavailable}"
-		serverpassword="${unavailable}"
-		maxplayers="${zero}"
-		defaultmap="${unavailable}"
-	else
-		servername=$(grep "ServerName" "${servercfgfullpath}" | sed -e 's/^[ \t]*//g' -e '/^--/d' -e 's/ServerName//g' | tr -d '=\";,:' | sed -e 's/^[ \t]*//' -e 's/[ \t]*$//')
-		serverpassword=$(grep "ServerPassword" "${servercfgfullpath}" | sed -e 's/^ *//g' -e '/^--/d' -e 's/ServerPassword//g' | tr -d '=\";,:' | sed -e 's/^[ \t]*//' -e 's/[ \t]*$//')
-		maxplayers=$(grep "MaxPlayers" "${servercfgfullpath}" | sed -e 's/^ *//g' -e '/^--/d' -e 's/MaxPlayers//g' | tr -d '=\";,:' | sed -e 's/^[ \t]*//' -e 's/[ \t]*$//')
-		defaultmap=$(grep "MapName" "${servercfgfullpath}" | sed -e 's/^ *//g' -e '/^--/d' -e 's/MapName//g' | tr -d '=\";,:' | sed -e 's/^[ \t]*//' -e 's/[ \t]*$//')
-
-		# Not set
-		servername=${servername:-"NOT SET"}
-		serverpassword=${serverpassword:-"NOT SET"}
-		maxplayers=${maxplayers:-"0"}
-		defaultmap=${defaultmap:-"NOT SET"}
-	fi
-
-	# Parameters
-	port=${port:-"7777"}
-	beaconport=${queryport:-"15000"}
-}
-
-fn_info_game_mta() {
-	# Config
-	if [ ! -f "${servercfgfullpath}" ]; then
-		port=${zero}
-		queryport=${zero}
-		httpport=${zero}
-		ase="${unavailable}"
-		servername="${unavailable}"
-		serverpassword="${unavailable}"
-		maxplayers="${zero}"
-	else
-		port=$(grep -m 1 "serverport" "${servercfgfullpath}" | sed -e 's/^[ \t]*//g' -e '/^\//d' -e 's/<serverport>//g' | sed -e 's/^[ \t]*//' -e 's/[ \t]*$//' | cut -f1 -d "<" | tr -cd '[:digit:]')
-		queryport=$((port + 123))
-		httpport=$(grep -m 1 "httpport" "${servercfgfullpath}" | sed -e 's/^[ \t]*//g' -e '/^\//d' -e 's/<httpport>//g' | sed -e 's/^[ \t]*//' -e 's/[ \t]*$//' | cut -f1 -d "<" | tr -cd '[:digit:]')
-		servername=$(grep -m 1 "servername" "${servercfgfullpath}" | sed -e 's/^[ \t]*//g' -e '/^\//d' -e 's/<servername>//g' | sed -e 's/^[ \t]*//' -e 's/[ \t]*$//' | cut -f1 -d "<")
-		serverpassword=$(grep -m 1 "password" "${servercfgfullpath}" | sed -e 's/^[ \t]*//g' -e '/^\//d' -e 's/<password>//g' | sed -e 's/^[ \t]*//' -e 's/[ \t]*$//' | cut -f1 -d "<")
-		maxplayers=$(grep -m 1 "maxplayers" "${servercfgfullpath}" | sed -e 's/^[ \t]*//g' -e '/^\//d' -e 's/<maxplayers>//g' | sed -e 's/^[ \t]*//' -e 's/[ \t]*$//' | cut -f1 -d "<" | tr -cd '[:digit:]')
-		ase=$(grep -m 1 "ase" "${servercfgfullpath}" | sed -e 's/^[ \t]*//g' -e '/^\//d' -e 's/<ase>//g' | sed -e 's/^[ \t]*//' -e 's/[ \t]*$//' | cut -f1 -d "<" | tr -cd '[:digit:]')
-		if [ "${ase}" == "1" ]; then
-			ase="Enabled"
-		else
-			ase="Disabled"
-		fi
-
-		# Not set
-		port=${port:-"22003"}
-		queryport=${queryport:-"2326"}
-		httpport=${httpport:-"22005"}
-		ase=${ase:-"Disabled"}
-		servername=${servername:-"NOT SET"}
-		serverpassword=${serverpassword:-"NOT SET"}
-		maxplayers=${maxplayers:-"0"}
-	fi
-
-}
-
-fn_info_game_nec() {
-	# Config
-	if [ ! -f "${servercfgfullpath}" ]; then
-		maxplayers=${maxplayers:-"0"}
-		port=${port:-"0"}
-		servername="Necesse"
-		serverpassword="${unavailable}"
-	else
-		maxplayers=$(grep "slots" "${servercfgfullpath}" | cut -f1 -d "/" | tr -cd '[:digit:]')
-		port=$(grep "port" "${servercfgfullpath}" | cut -f1 -d "/" | tr -cd '[:digit:]')
-		serverpassword=$(grep "password" "${servercfgfullpath}" | cut -f1 -d "/" | tr -cd '[:digit:]')
-
-		# Not set
-		maxplayers=${maxplayers:-"0"}
-		port=${port:-"0"}
-		servername="Necesse Port ${port}"
-		serverpassword=${serverpassword:-"NOT SET"}
-	fi
-}
-
-fn_info_game_onset() {
-	# Config
-	if [ ! -f "${servercfgfullpath}" ]; then
-		servername="${unavailable}"
-		maxplayers="${zero}"
-		port="${zero}"
-		httpport="${zero}"
-		queryport="${zero}"
-	else
-		servername=$(grep -v "servername_short" "${servercfgfullpath}" | grep "servername" | sed -e 's/^[ \t]*//g' -e '/^#/d' -e 's/servername//g' | tr -d '=\";,:' | sed -e 's/^[ \t]*//' -e 's/[ \t]*$//')
-		maxplayers=$(grep "maxplayers" "${servercfgfullpath}" | grep -v "#" | tr -cd '[:digit:]')
-		port=$(grep "port" "${servercfgfullpath}" | grep -v "#" | tr -cd '[:digit:]')
-		httpport=$((port - 2))
-		queryport=$((port - 1))
-
-		# Not set
-		servername=${servername:-"NOT SET"}
-		maxplayers=${maxplayers:-"0"}
-		port=${port:-"NOT SET"}
-		httpport=${httpport:-"NOT SET"}
-		queryport=${queryport:-"NOT SET"}
-	fi
-}
-
-fn_info_game_pc() {
-	# Config
-	if [ ! -f "${servercfgfullpath}" ]; then
-		servername="${unavailable}"
-		serverpassword="${unavailable}"
-		maxplayers="${zero}"
-		port="${zero}"
-		queryport="${zero}"
-		steamport="${zero}"
-	else
-		servername=$(grep "name" "${servercfgfullpath}" | sed -e 's/^[ \t]*//g' -e '/^\//d' -e 's/name//g' | tr -d '=\";,:' | sed -e 's/^[ \t]*//' -e 's/[ \t]*$//')
-		serverpassword=$(grep "password " "${servercfgfullpath}" | sed -e 's/^[ \t]*//g' -e '/^\//d' -e 's/password//g' | tr -d '=\";,:' | sed -e 's/^[ \t]*//' -e 's/[ \t]*$//')
-		maxplayers=$(grep "MaxPlayers" "${servercfgfullpath}" | grep -v "//" | tr -cd '[:digit:]')
-		port=$(grep "hostPort" "${servercfgfullpath}" | grep -v "//" | tr -cd '[:digit:]')
-		queryport=$(grep "queryPort" "${servercfgfullpath}" | grep -v "//" | tr -cd '[:digit:]')
-		steamport=$(grep "steamPort" "${servercfgfullpath}" | grep -v "//" | tr -cd '[:digit:]')
-
-		# Not set
-		servername=${servername:-"NOT SET"}
-		serverpassword=${serverpassword:-"NOT SET"}
-		maxplayers=${maxplayers:-"0"}
-		port=${port:-"NOT SET"}
-		queryport=${queryport:-"NOT SET"}
-		steamport=${steamport:-"NOT SET"}
-	fi
-}
-
-fn_info_game_pc2() {
-	# Config
-	if [ ! -f "${servercfgfullpath}" ]; then
-		servername="${unavailable}"
-		serverpassword="${unavailable}"
-		maxplayers="${zero}"
-		port="${zero}"
-		queryport="${zero}"
-		steamport="${zero}"
-	else
-		servername=$(grep "name" "${servercfgfullpath}" | sed -e 's/^[ \t]*//g' -e '/^\//d' -e 's/name//g' | tr -d '=\";,:' | sed -e 's/^[ \t]*//' -e 's/[ \t]*$//')
-		serverpassword=$(grep "password " "${servercfgfullpath}" | sed -e 's/^[ \t]*//g' -e '/^\//d' -e 's/password//g' | tr -d '=\";,:' | sed -e 's/^[ \t]*//' -e 's/[ \t]*$//')
-		maxplayers=$(grep "MaxPlayers" "${servercfgfullpath}" | grep -v "//" | tr -cd '[:digit:]')
-		port=$(grep "hostPort" "${servercfgfullpath}" | grep -v "//" | tr -cd '[:digit:]')
-		queryport=$(grep "queryPort" "${servercfgfullpath}" | grep -v "//" | tr -cd '[:digit:]')
-		steamport=$(grep "steamPort" "${servercfgfullpath}" | grep -v "//" | tr -cd '[:digit:]')
-
-		# Not set
-		servername=${servername:-"NOT SET"}
-		serverpassword=${serverpassword:-"NOT SET"}
-		maxplayers=${maxplayers:-"0"}
-		port=${port:-"NOT SET"}
-		queryport=${queryport:-"NOT SET"}
-		steamport=${steamport:-"NOT SET"}
-	fi
-}
-
-fn_info_game_pstbs() {
-	# Config
-	if [ ! -f "${servercfgfullpath}" ]; then
-		servername="${unavailable}"
-		maxplayers="${unavailable}"
-		reservedslots="${unavailable}"
-	else
-		servername=$(grep "ServerName=" "${servercfgfullpath}" | sed -e 's/^[ \t]//g' -e '/^#/d' -e 's/ServerName//g' | tr -d '=";,:' | sed -e 's/^[ \t]//' -e 's/[ \t]*$//')
-		maxplayers=$(grep "MaxPlayers=" "${servercfgfullpath}" | tr -cd '[:digit:]')
-		reservedslots=$(grep "NumReservedSlots=" "${servercfgfullpath}" | tr -cd '[:digit:]')
-
-		# Not set
-		servername=${servername:-"NOT SET"}
-		maxplayers=${maxplayers:-"0"}
-		reservedslots=${reservedslots:-"0"}
-	fi
-
-	if [ ! -f "${servercfgdir}/Rcon.cfg" ]; then
-		rconport=${unavailable}
-		rconpassword=${unavailable}
-	else
-		rconport=$(grep "Port=" "${servercfgdir}/Rcon.cfg" | tr -cd '[:digit:]')
-		rconpassword=$(grep "Password=" "${servercfgdir}/Rcon.cfg" | sed -e 's/^[ \t]*//g' -e '/^\//d' -e 's/Password//g' | tr -d '=\";,:' | sed -e 's/^[ \t]*//' -e 's/[ \t]*$//')
-
-		# Not set
-		rconport=${rconport:-"0"}
-		if [ -z "${rconpassword}" ] || [ ${#rconpassword} == 1 ]; then
-			rconpassword="NOT SET"
-		fi
-	fi
-
-	# Parameters
-	port=${port:-"0"}
-	if [ -z "${queryport}" ]; then
-		queryport=${port:-"0"}
-	fi
-	rconport=${rconport:-"0"}
-	randommap=${randommap:-"NOT SET"}
-	maxplayers=${maxplayers:-"0"}
-	reservedslots=${reservedslots:-"0"}
-}
-
-fn_info_game_pvr() {
-	# Config
-	if [ ! -f "${servercfgfullpath}" ]; then
-		servername="${unavailable}"
-		maxplayers="${unavailable}"
-	else
-		servername=$(grep "ServerName" "${servercfgfullpath}" | awk -F '=' '{print $2}')
-		maxplayers=$(grep "MaxPlayers" "${servercfgfullpath}" | awk -F '=' '{print $2}')
-
-		# Not set
-		servername=${servername:-"NOT SET"}
-		maxplayers=${maxplayers:-"0"}
-	fi
-
-	# Parameters
-	port=${port:-"0"}
-	port401=$((port + 400))
-	queryport=${port:-"0"}
-}
-
-fn_info_game_prism3d() {
-	# Config
-	if [ ! -f "${servercfgfullpath}" ]; then
-		maxplayers="${unavailable}"
-		port="${zero}"
-		queryport="${zero}"
-		servername="${unavailable}"
-		serverpassword="${unavailable}"
-	else
-		maxplayers=$(sed -nr 's/^\s*max_players\s*:\s*([0-9]+)/\1/p' "${servercfgfullpath}")
-		port=$(sed -nr 's/^\s*connection_dedicated_port\s*:\s*([0-9]+)/\1/p' "${servercfgfullpath}")
-		queryport=$(sed -nr 's/^\s*query_dedicated_port\s*:\s*([0-9]+)/\1/p' "${servercfgfullpath}")
-		servername=$(sed -nr 's/^\s*lobby_name\s*:\s*"?([^"\r\n]+)"?/\1/p' "${servercfgfullpath}")
-		serverpassword=$(sed -nr 's/^\s*password\s*:\s*"(.*)"/\1/p' "${servercfgfullpath}")
-
-		# Not set
-		maxplayers=${maxplayers:-"0"}
-		port=${port:-"27015"}
-		queryport=${queryport:-"27016"}
-		servername=${servername:-"NOT SET"}
-		serverpassword=${serverpassword:-"NOT SET"}
-	fi
-}
-
-fn_info_game_pz() {
-	# Config
-	if [ ! -f "${servercfgfullpath}" ]; then
-		servername="${unavailable}"
-		serverpassword="${unavailable}"
-		rconpassword="${unavailable}"
-		maxplayers="${zero}"
-		port="${zero}"
-		queryport="${zero}"
-		gameworld="${unavailable}"
-	else
-		servername=$(grep "PublicName" "${servercfgfullpath}" | sed -e 's/^[ \t]*//g' -e '/^#/d' -e 's/PublicName//g' | tr -d '=\";,:' | sed -e 's/^[ \t]*//' -e 's/[ \t]*$//')
-		serverpassword=$(grep "Password" "${servercfgfullpath}" | sed -e 's/^[ \t]*//g' | grep "^Password" | sed -e '/^#/d' -e 's/Password//g' | tr -d '=\";,:' | sed -e 's/^[ \t]*//' -e 's/[ \t]*$//')
-		rconpassword=$(grep "RCONPassword" "${servercfgfullpath}" | sed -e 's/^[ \t]*//g' -e '/^#/d' -e 's/RCONPassword//g' | tr -d '=\";,:' | sed -e 's/^[ \t]*//' -e 's/[ \t]*$//')
-		maxplayers=$(grep "MaxPlayers" "${servercfgfullpath}" | grep -v "#" | tr -cd '[:digit:]')
-		port=$(grep "DefaultPort" "${servercfgfullpath}" | tr -cd '[:digit:]')
-		queryport=${port}
-		gameworld=$(grep "Map" "${servercfgfullpath}" | sed -e 's/^[ \t]*//g' | grep "^Map" | sed -e '/^#/d' -e 's/Map//g' | tr -d '=\";' | sed -e 's/^[ \t]*//' -e 's/[ \t]*$//')
-
-		# Not set
-		servername=${servername:-"NOT SET"}
-		serverpassword=${serverpassword:-"NOT SET"}
-		rconpassword=${rconpassword:-"NOT SET"}
-		maxplayers=${maxplayers:-"0"}
-		port=${port:-"0"}
-		queryport=${queryport:-"0"}
-		gameworld=${gameworld:-"NOT SET"}
-	fi
-
-	# Parameters
-	adminpassword=${adminpassword:-"NOT SET"}
-
-}
-
-fn_info_game_q2() {
-	# Config
-	if [ ! -f "${servercfgfullpath}" ]; then
-		rconpassword="${unavailable}"
-		servername="${unavailable}"
-		maxplayers="${zero}"
-	else
-		rconpassword=$(grep "rcon_password" "${servercfgfullpath}" | sed -e 's/^[ \t]*//g' -e '/^\//d' -e 's/set rcon_password//g' | tr -d '=\";,:' | sed -e 's/^[ \t]*//' -e 's/[ \t]*$//')
-		servername=$(grep "hostname" "${servercfgfullpath}" | sed -e 's/^[ \t]*//g' -e '/^\//d' -e 's/set hostname//g' | tr -d '=\";,:' | sed -e 's/^[ \t]*//' -e 's/[ \t]*$//')
-		maxplayers=$(grep "maxclients" "${servercfgfullpath}" | grep -v "#" | tr -cd '[:digit:]')
-
-		# Not set
-		rconpassword=${rconpassword:-"NOT SET"}
-		servername=${servername:-"NOT SET"}
-		maxplayers=${maxplayers:-"0"}
-	fi
-
-	# Parameters
-	port=${port:-"0"}
-	queryport=${port}
-	defaultmap=${defaultmap:-"NOT SET"}
-}
-
-fn_info_game_q3() {
-	# Config
-	if [ ! -f "${servercfgfullpath}" ]; then
-		rconpassword="${unavailable}"
-		servername="${unavailable}"
-		serverpassword="${unavailable}"
-		maxplayers="${zero}"
-	else
-		rconpassword=$(grep "zmq_rcon_password" "${servercfgfullpath}" | sed -e 's/^[ \t]*//g' -e '/^\//d' -e 's/set zmq_rcon_password//g' | tr -d '=\";,:' | sed -e 's/^[ \t]*//' -e 's/[ \t]*$//')
-		servername=$(grep "sv_hostname" "${servercfgfullpath}" | sed -e 's/^[ \t]*//g' -e '/^\//d' -e 's/set sv_hostname//g' | tr -d '=\";,:' | sed -e 's/^[ \t]*//' -e 's/[ \t]*$//')
-		serverpassword=$(grep "rconpassword" "${servercfgfullpath}" | sed -e 's/^[ \t]*//g' -e '/^\//d' -e 's/set rconpassword//g' | tr -d '=\";,:' | sed -e 's/^[ \t]*//' -e 's/[ \t]*$//')
-		maxplayers=$(grep "sv_maxclients" "${servercfgfullpath}" | grep -v "#" | tr -cd '[:digit:]')
-
-		# Not set
-		rconpassword=${rconpassword:-"NOT SET"}
-		servername=${servername:-"NOT SET"}
-		serverpassword=${serverpassword:-"NOT SET"}
-		maxplayers=${maxplayers:-"0"}
-	fi
-
-	# Parameters
-	port=${port:-"0"}
-	queryport=${port}
-	defaultmap=${defaultmap:-"NOT SET"}
-}
-
-fn_info_game_ql() {
-	# Config
-	if [ ! -f "${servercfgfullpath}" ]; then
-		rconpassword="${unavailable}"
-		servername="${unavailable}"
-		serverpassword="${unavailable}"
-		maxplayers="${zero}"
-		port="${zero}"
-		queryport="${zero}"
-		rconport="${zero}"
-		statsport="${zero}"
-	else
-		rconpassword=$(grep "zmq_rcon_password" "${servercfgfullpath}" | sed -e 's/^[ \t]*//g' -e '/^\//d' -e 's/set zmq_rcon_password//g' | tr -d '=\";,:' | sed -e 's/^[ \t]*//' -e 's/[ \t]*$//')
-		servername=$(grep "sv_hostname" "${servercfgfullpath}" | sed -e 's/^[ \t]*//g' -e '/^\//d' -e 's/set sv_hostname//g' | tr -d '=\";,:' | sed -e 's/^[ \t]*//' -e 's/[ \t]*$//')
-		serverpassword=$(grep "g_password" "${servercfgfullpath}" | sed -e 's/^[ \t]*//g' -e '/^\//d' -e 's/set g_password//g' | tr -d '=\";,:' | sed -e 's/^[ \t]*//' -e 's/[ \t]*$//')
-		maxplayers=$(grep "sv_maxClients" "${servercfgfullpath}" | grep -v "//" | tr -cd '[:digit:]')
-		port=$(grep "net_port" "${servercfgfullpath}" | grep -v "//" | tr -cd '[:digit:]')
-		queryport=${port}
-		rconport=$(grep "zmq_rcon_port" "${servercfgfullpath}" | grep -v "//" | tr -cd '[:digit:]')
-		statsport=$(grep "zmq_stats_port" "${servercfgfullpath}" | grep -v "//" | tr -cd '[:digit:]')
-		configip=$(grep "set net_ip" "${servercfgfullpath}" | sed -e 's/^[ \t]*//g' -e '/^\//d' -e 's/set net_ip//g' | tr -d '=\";,:' | sed -e 's/^[ \t]*//' -e 's/[ \t]*$//')
-
-		# Not set
-		rconpassword=${rconpassword:-"NOT SET"}
-		servername=${servername:-"NOT SET"}
-		serverpassword=${serverpassword:-"NOT SET"}
-		maxplayers=${maxplayers:-"0"}
-		port=${port:-"0"}
-		queryport=${queryport:-"0"}
-		rconport=${rconport:-"0"}
-		statsport=${statsport:-"0"}
-		configip=${configip:-"0.0.0.0"}
-	fi
-}
-
-fn_info_game_qw() {
-	# Config
-	if [ ! -f "${servercfgfullpath}" ]; then
-		rconpassword="${unavailable}"
-		servername="${unavailable}"
-		serverpassword="${unavailable}"
-		maxplayers="${zero}"
-		port="${zero}"
-	else
-		rconpassword=$(grep "rcon_password" "${servercfgfullpath}" | sed -e 's/^[ \t]*//g' -e '/^\//d' -e 's/set rcon_password//g' | tr -d '=\";,:' | sed -e 's/^[ \t]*//' -e 's/[ \t]*$//' | cut -f1 -d "/")
-		servername=$(grep "hostname" "${servercfgfullpath}" | sed -e 's/^[ \t]*//g' -e '/^\//d' -e 's/set hostname//g' | tr -d '=\";,:' | sed -e 's/^[ \t]*//' -e 's/[ \t]*$//' | cut -f1 -d "/")
-		maxplayers=$(grep "maxclients" "${servercfgfullpath}" | grep -v "#" | tr -cd '[:digit:]')
-
-		# Not set
-		rconpassword=${rconpassword:-"NOT SET"}
-		servername=${servername:-"NOT SET"}
-		maxplayers=${maxplayers:-"0"}
-	fi
-
-	# Parameters
-	port=${port:-"0"}
-	queryport=${port}
-}
-
-fn_info_game_ro() {
-	# Config
-	if [ ! -f "${servercfgfullpath}" ]; then
-		servername="${unavailable}"
-		serverpassword="${unavailable}"
-		adminpassword="${unavailable}"
-		port="${zero}"
-		queryport="${zero}"
-		steamport="${zero}"
-		steammasterport="${zero}"
-		lanport="${zero}"
-		httpport="${zero}"
-		webadminenabled="${unavailable}"
-		webadminuser="${unavailable}"
-		webadminpass="${unavailable}"
-	else
-		servername=$(sed -nr 's/^ServerName=(.*)$/\1/p' "${servercfgfullpath}" | tr -d '=\";,:' | sed 's/\r$//')
-		serverpassword=$(sed -nr 's/^GamePassword=(.*)$/\1/p' "${servercfgfullpath}" | tr -d '=\";,:' | sed 's/\r$//')
-		adminpassword=$(sed -nr 's/^AdminPassword=(.*)$/\1/p' "${servercfgfullpath}" | tr -d '=\";,:' | sed 's/\r$//')
-		port=$(sed -nr 's/^Port=(.*)$/\1/p' "${servercfgfullpath}" | tr -cd '[:digit:]')
-		queryport=$((port + 1))
-		steamport="20610"
-		steammasterport="28902"
-		lanport=$(grep "LANServerPort=" "${servercfgfullpath}" | tr -cd '[:digit:]')
-		httpport=$(sed -nr 's/^ListenPort=(.*)$/\1/p' "${servercfgfullpath}" | tr -cd '[:digit:]')
-		webadminenabled=$(sed -nr 's/^bEnabled=(.*)$/\1/p' "${servercfgfullpath}" | tr -d '=\";,:' | sed 's/\r$//')
-		webadminuser=$(sed -nr 's/^AdminName=(.*)$/\1/p' "${servercfgfullpath}" | tr -d '=\";,:' | sed 's/\r$//')
-		webadminpass="${adminpassword}"
-
-		# Not set
-		servername=${servername:-"NOT SET"}
-		serverpassword=${serverpassword:-"NOT SET"}
-		adminpassword=${adminpassword:-"NOT SET"}
-		port=${port:-"0"}
-		queryport=${queryport:-"0"}
-		steamport=${steamport:-"0"}
-		steammasterport=${steammasterport:-"0"}
-		lanport=${lanport:-"0"}
-		httpport=${httpport:-"0"}
-		webadminenabled=${webadminenabled:-"NOT SET"}
-		webadminuser=${webadminuser:-"NOT SET"}
-		webadminpass=${webadminpass:-"NOT SET"}
-	fi
-
-	# Parameters
-	defaultmap=${defaultmap:-"NOT SET"}
-}
-
-fn_info_game_rtcw() {
-	# Config
-	if [ ! -f "${servercfgfullpath}" ]; then
-		rconpassword="${unavailable}"
-		servername="${unavailable}"
-		serverpassword="${unavailable}"
-		maxplayers="${zero}"
-	else
-		rconpassword=$(grep "rconpassword" "${servercfgfullpath}" | sed -e 's/^[ \t]*//g' -e '/^\//d' -e 's/set rconpassword//g' | tr -d '=\";,:' | sed -e 's/^[ \t]*//' -e 's/[ \t]*$//')
-		servername=$(grep "sv_hostname" "${servercfgfullpath}" | sed -e 's/^[ \t]*//g' -e '/^\//d' -e 's/set sv_hostname//g' | tr -d '=\";,:' | sed -e 's/^[ \t]*//' -e 's/[ \t]*$//')
-		serverpassword=$(grep "g_password" "${servercfgfullpath}" | sed -e 's/^[ \t]*//g' -e '/^\//d' -e 's/set g_password//g' | tr -d '=\";,:' | sed -e 's/^[ \t]*//' -e 's/[ \t]*$//')
-		maxplayers=$(grep "sv_maxclients" "${servercfgfullpath}" | grep -v "#" | tr -cd '[:digit:]')
-
-		# Not set
-		rconpassword=${rconpassword:-"NOT SET"}
-		servername=${servername:-"NOT SET"}
-		serverpassword=${serverpassword:-"NOT SET"}
-		maxplayers=${maxplayers:-"0"}
-	fi
-
-	# Parameters
-	port=${port:-"0"}
-	queryport=${port:-"0"}
-	defaultmap=${defaultmap:-"NOT SET"}
-}
-
-fn_info_game_rust() {
-	# Parameters
-	servername=${servername:-"NOT SET"}
-	port=${port:-"0"}
-	queryport=${queryport:-"0"}
-	appport=${appport:-"0"}
-	rconport=${rconport:-"0"}
-	gamemode=${gamemode:-"NOT SET"}
-	maxplayers=${maxplayers:-"0"}
-	rconpassword=${rconpassword:-"NOT SET"}
-	rconweb=${rconweb:-"NOT SET"}
-	tickrate=${tickrate:-"0"}
-	saveinterval=${saveinterval:-"0"}
-	serverlevel=${serverlevel:-"NOT SET"}
-	customlevelurl=${customlevelurl:-"NOT SET"}
-	worldsize=${worldsize:-"0"}
-	if [ -n "${seed}" ]; then
-		seed=${seed:-"0"}
-	elif [ -f "${datadir}/${selfname}-seed.txt" ]; then
-		seed=$(cat "${datadir}/${selfname}-seed.txt")
-	else
-		seed="0"
-	fi
-	salt=${salt:-"0"}
-}
-
-fn_info_game_rw() {
-	# Config
-	if [ ! -f "${servercfgfullpath}" ]; then
-		servername="${unavailable}"
-		serverpassword="${unavailable}"
-		rconpassword="${unavailable}"
-		rconport="${zero}"
-		maxplayers="${zero}"
-		port="${zero}"
-		port2="${zero}"
-		port3="${zero}"
-		port4="${zero}"
-		queryport="${zero}"
-		gamemode="${unavailable}"
-		gameworld="${unavailable}"
-	else
-		servername=$(grep "server_name" "${servercfgfullpath}" | sed -e 's/^[ \t]*//g' -e '/^#/d' -e 's/server_name//g' | tr -d '=\";,:' | sed -e 's/^[ \t]*//' -e 's/[ \t]*$//')
-		serverpassword=$(grep "server_password" "${servercfgfullpath}" | sed -e 's/^[ \t]*//g' -e '/^#/d' -e 's/server_password//g' | tr -d '=\";,:' | sed -e 's/^[ \t]*//' -e 's/[ \t]*$//')
-		rconpassword=$(grep "rcon_password" "${servercfgfullpath}" | sed -e 's/^[ \t]*//g' -e '/^#/d' -e 's/rcon_password//g' | tr -d '=\";,:' | sed -e 's/^[ \t]*//' -e 's/[ \t]*$//')
-		rconport=$(grep "rcon_port" "${servercfgfullpath}" | grep -v "#" | tr -cd '[:digit:]')
-		maxplayers=$(grep "settings_max_players" "${servercfgfullpath}" | grep -v "#" | tr -cd '[:digit:]')
-		port=$(grep "server_port" "${servercfgfullpath}" | grep -v "database_mysql_server_port" | grep -v "#" | tr -cd '[:digit:]')
-		port2=$((port + 1))
-		port3=$((port + 2))
-		port4=$((port + 3))
-		queryport="${port}"
-		httpqueryport=$((port - 1))
-		gamemode=$(grep "settings_default_gamemode=" "${servercfgfullpath}" | sed -e 's/^[ \t]*//g' -e '/^#/d' -e 's/settings_default_gamemode//g' | tr -d '=\";,:' | sed -e 's/^[ \t]*//' -e 's/[ \t]*$//')
-		gameworld=$(grep "server_world_name" "${servercfgfullpath}" | sed -e 's/^[ \t]*//g' -e '/^#/d' -e 's/server_world_name//g' | tr -d '=\";,:' | sed -e 's/^[ \t]*//' -e 's/[ \t]*$//')
-		configip=$(grep "server_ip" "${servercfgfullpath}" | grep -v "database_mysql_server_ip" | sed -e 's/^[ \t]*//g' -e '/^--/d' -e 's/server_ip//g' | tr -d '=\";,:' | sed -e 's/^[ \t]*//' -e 's/[ \t]*$//')
-
-		# Not set
-		servername=${servername:-"NOT SET"}
-		serverpassword=${serverpassword:-"NOT SET"}
-		rconpassword=${rconpassword:-"NOT SET"}
-		rconport=${rconport:-"NOT SET"}
-		maxplayers=${maxplayers:-"0"}
-		port=${port:-"0"}
-		port2=${port2:-"0"}
-		port3=${port3:-"0"}
-		port4=${port4:-"0"}
-		queryport=${queryport:-"0"}
-		httpqueryport=${httpport:-"0"}
-		gamemode=${gamemode:-"NOT SET"}
-		gameworld=${gameworld:-"NOT SET"}
-		configip=${configip:-"0.0.0.0"}
-	fi
-}
-
-fn_info_game_samp() {
-	# Config
-	if [ ! -f "${servercfgfullpath}" ]; then
-		servername="unnamed server"
-		rconpassword="${unavailable}"
-		port="7777"
-		rconport="${port}"
-		maxplayers="50"
-	else
-		servername=$(grep "hostname" "${servercfgfullpath}" | sed -e 's/^[ \t]*//g' -e '/^\//d' -e 's/hostname//g' | tr -d '=\";,:' | sed -e 's/^[ \t]*//' -e 's/[ \t]*$//')
-		rconpassword=$(grep "rcon_password" "${servercfgfullpath}" | sed -e 's/^[ \t]*//g' -e '/^#/d' -e 's/^rcon_password//g' | tr -d '=\";,:' | sed -e 's/^[ \t]*//' -e 's/[ \t]*$//')
-		port=$(grep "port" "${servercfgfullpath}" | grep -v "#" | tr -cd '[:digit:]')
-		queryport=${port}
-		rconport=${port}
-		maxplayers=$(grep "maxplayers" "${servercfgfullpath}" | grep -v "#" | tr -cd '[:digit:]')
-
-		# Not set
-		servername=${servername:-"NOT SET"}
-		rconpassword=${rconpassword:-"NOT SET"}
-		port=${port:-"7777"}
-		queryport=${port:-"7777"}
-		rconport=${rconport:-"7777"}
-		maxplayers=${maxplayers:-"12"}
-	fi
-}
-
-fn_info_game_sb() {
-	# Config
-	if [ ! -f "${servercfgfullpath}" ]; then
-		servername="${unavailable}"
-		queryenabled="${unavailable}"
-		rconenabled="${unavailable}"
-		rconpassword="${unavailable}"
-		port="21025"
-		queryport="21025"
-		rconport="21026"
-		maxplayers="8"
-	else
-		servername=$(grep "serverName" "${servercfgfullpath}" | sed -e 's/^[ \t]*//g' -e 's/serverName//g' | tr -d '=\";,:' | sed -e 's/^[ \t]*//' -e 's/[ \t]*$//')
-		queryenabled=$(grep "runQueryServer" "${servercfgfullpath}" | sed -e 's/^[ \t]*//g' -e 's/runQueryServer//g' | tr -d '=\";,:' | sed -e 's/^[ \t]*//' -e 's/[ \t]*$//')
-		rconenabled=$(grep "runRconServer" "${servercfgfullpath}" | sed -e 's/^[ \t]*//g' -e 's/runRconServer//g' | tr -d '=\";,:' | sed -e 's/^[ \t]*//' -e 's/[ \t]*$//')
-		rconpassword=$(grep "rconServerPassword" "${servercfgfullpath}" | sed -e 's/^[ \t]*//g' -e 's/rconServerPassword//g' | tr -d '=\";,:' | sed -e 's/^[ \t]*//' -e 's/[ \t]*$//')
-		port=$(grep "gameServerPort" "${servercfgfullpath}" | tr -cd '[:digit:]')
-		queryport=$(grep "queryServerPort" "${servercfgfullpath}" | tr -cd '[:digit:]')
-		rconport=$(grep "rconServerPort" "${servercfgfullpath}" | tr -cd '[:digit:]')
-		maxplayers=$(grep "maxPlayers" "${servercfgfullpath}" | tr -cd '[:digit:]')
-
-		# Not set
-		servername=${servername:-"NOT SET"}
-		queryenabled=${queryenabled:-"NOT SET"}
-		rconenabled=${rconenabled:-"NOT SET"}
-		rconpassword=${rconpassword:-"NOT SET"}
-		port=${port:-"21025"}
-		queryport=${queryport:-"21025"}
-		rconport=${rconport:-"21026"}
-		maxplayers=${maxplayers:-"8"}
-	fi
-}
-
-fn_info_game_sbots() {
-	# Config
-	if [ ! -f "${servercfgfullpath}" ]; then
-		servername="${unavailable}"
-		maxplayers="${unavailable}"
-	else
-		servername=$(grep "ServerName=" "${servercfgfullpath}" | sed -e 's/^[ \t]//g' -e '/^#/d' -e 's/ServerName//g' | tr -d '=";,:' | sed -e 's/^[ \t]//' -e 's/[ \t]*$//')
-		maxplayers=$(grep "MaxPlayers=" "${servercfgfullpath}" | tr -cd '[:digit:]')
-
-		# Not set
-		servername=${servername:-"NOT SET"}
-		maxplayers=${maxplayers:-"0"}
-	fi
-
-	# Parameters
-	port=${port:-"0"}
-	queryport=${queryport:-"0"}
-	servername=${servername:-"NOT SET"}
-	serverpassword=${serverpassword:-"NOT SET"}
-	defaultmap=${defaultmap:-"NOT SET"}
-	maxplayers=${maxplayers:-"0"}
-}
-
-fn_info_game_scpsl() {
-	# Config
-	if [ ! -f "${servercfgfullpath}" ]; then
-		servername=${servername:-"NOT SET"}
-		maxplayers=${maxplayers:-"0"}
-		configip=${configip:-"0.0.0.0"}
-		tickrate=${tickrate:-"NOT SET"}
-		adminpassword=${adminpassword:-"NOT SET"}
-	else
-		servername=$(sed -nr 's/^server_name: (.*)$/\1/p' "${servercfgfullpath}")
-		maxplayers=$(sed -nr 's/^max_players: (.*)$/\1/p' "${servercfgfullpath}")
-		configip=$(sed -nr 's/^ipv4_bind_ip: (.*)$/\1/p' "${servercfgfullpath}")
-		tickrate=$(sed -nr 's/^server_tickrate: (.*)$/\1/p' "${servercfgfullpath}")
-		adminpassword=$(sed -nr 's/^administrator_query_password: (.*)$/\1/p' "${servercfgfullpath}")
-	fi
-
-	# Parameters
-	port=${port:-"0"}
-	queryport=${port}
-}
-
-fn_info_game_sdtd() {
-	# Config
-	if [ ! -f "${servercfgfullpath}" ]; then
-		servername="${unavailable}"
-		serverpassword="${unavailable}"
-		port="${zero}"
-		port3="${zero}"
-		queryport="${zero}"
-		webadminenabled="${unavailable}"
-		webadminport="${zero}"
-		webadminpass="${unavailable}"
-		telnetenabled="${unavailable}"
-		telnetport="${zero}"
-		telnetpass="${unavailable}"
-		telnetip="${unavailable}"
-		maxplayers="${unavailable}"
-		gamemode="${unavailable}"
-		gameworld="${unavailable}"
-	else
-		servername=$(grep "ServerName" "${servercfgfullpath}" | sed 's/^.*value="//' | cut -f1 -d"\"")
-		serverpassword=$(grep "ServerPassword" "${servercfgfullpath}" | sed 's/^.*value="//' | cut -f1 -d"\"")
-		port=$(grep "ServerPort" "${servercfgfullpath}" | grep -Eo 'value="[0-9]+"' | tr -cd '[:digit:]')
-		port3=$((port + 2))
-		queryport=${port:-"0"}
-		webadminenabled=$(grep "ControlPanelEnabled" "${servercfgfullpath}" | sed 's/^.*value="//' | cut -f1 -d"\"")
-		webadminport=$(grep "ControlPanelPort" "${servercfgfullpath}" | tr -cd '[:digit:]')
-		webadminpass=$(grep "ControlPanelPassword" "${servercfgfullpath}" | sed 's/^.*value="//' | cut -f1 -d"\"")
-		telnetenabled=$(grep "TelnetEnabled" "${servercfgfullpath}" | sed 's/^.*value="//' | cut -f1 -d"\"")
-		telnetport=$(grep "TelnetPort" "${servercfgfullpath}" | tr -cd '[:digit:]')
-		telnetpass=$(grep "TelnetPassword" "${servercfgfullpath}" | sed 's/^.*value="//' | cut -f1 -d"\"")
-		# Telnet IP will be localhost if no password is set
-		# check_ip will set the IP first. This will overwrite it.
-		if [ -z "${telnetpass}" ]; then
-			telnetip="127.0.0.1"
-		fi
-		maxplayers=$(grep "ServerMaxPlayerCount" "${servercfgfullpath}" | tr -cd '[:digit:]')
-		gamemode=$(grep "GameMode" "${servercfgfullpath}" | sed 's/^.*value="//' | cut -f1 -d"\"")
-		gameworld=$(grep "GameWorld" "${servercfgfullpath}" | sed 's/^.*value="//' | cut -f1 -d"\"")
-
-		# Not set
-		servername=${servername:-"NOT SET"}
-		serverpassword=${serverpassword:-"NOT SET"}
-		port=${port:-"0"}
-		queryport=${queryport:-"0"}
-		webadminenabled=${webadminenabled:-"NOT SET"}
-		webadminport=${webadminport:-"0"}
-		webadminpass=${webadminpass:-"NOT SET"}
-		telnetenabled=${telnetenabled:-"NOT SET"}
-		telnetport=${telnetport:-"0"}
-		telnetpass=${telnetpass:-"NOT SET"}
-		maxplayers=${maxplayers:-"0"}
-		gamemode=${gamemode:-"NOT SET"}
-		gameworld=${gameworld:-"NOT SET"}
-	fi
-}
-
-fn_info_game_sf() {
-	# Parameters
-	servername=${selfname:-"NOT SET"}
-	port=${port:-"0"}
-	queryport=${queryport:-"0"}
-	beaconport=${beaconport:-"0"}
-}
-
-fn_info_game_sof2() {
-	# Config
-	if [ ! -f "${servercfgfullpath}" ]; then
-		rconpassword="${unavailable}"
-		servername="${unavailable}"
-		serverpassword="${unavailable}"
-		maxplayers="${zero}"
-	else
-		rconpassword=$(grep "rconpassword" "${servercfgfullpath}" | sed -e 's/^[ \t]*//g' -e '/^\//d' -e 's/set rconpassword//g' | tr -d '=\";,:' | sed -e 's/^[ \t]*//' -e 's/[ \t]*$//')
-		servername=$(grep "sv_hostname" "${servercfgfullpath}" | sed -e 's/^[ \t]*//g' -e '/^\//d' -e 's/set sv_hostname//g' | tr -d '=\";,:' | sed -e 's/^[ \t]*//' -e 's/[ \t]*$//')
-		serverpassword=$(grep "g_password" "${servercfgfullpath}" | sed -e 's/^[ \t]*//g' -e '/^\//d' -e 's/set g_password//g' | tr -d '=\";,:' | sed -e 's/^[ \t]*//' -e 's/[ \t]*$//')
-		maxplayers=$(grep "sv_maxclients" "${servercfgfullpath}" | grep -v "#" | tr -cd '[:digit:]')
-
-		# Not set
-		rconpassword=${rconpassword:-"NOT SET"}
-		servername=${servername:-"NOT SET"}
-		serverpassword=${serverpassword:-"NOT SET"}
-		maxplayers=${maxplayers:-"0"}
-	fi
-
-	# Parameters
-	port=${port:-"0"}
-	queryport=${port}
-	defaultmap=${defaultmap:-"NOT SET"}
-}
-
-fn_info_game_sol() {
-	# Config
-	if [ ! -f "${servercfgfullpath}" ]; then
-		adminpassword="${unavailable}"
-		maxplayers="${unavailable}"
-		port="${zero}"
-		queryport="${zero}"
-		servername="${unavailable}"
-		serverpassword="${unavailable}"
-	else
-		adminpassword=$(grep "Admin_Password=" "${servercfgfullpath}" | awk -F '=' '{print $2}')
-		maxplayers=$(grep "Max_Players=" "${servercfgfullpath}" | tr -cd '[:digit:]')
-		port=$(grep "Port=" "${servercfgfullpath}" | tr -cd '[:digit:]')
-		queryport="${port}"
-		filesport=$((port + 10))
-		servername=$(grep "Server_Name=" "${servercfgfullpath}" | awk -F '=' '{print $2}')
-		serverpassword=$(grep "Game_Password=" "${servercfgfullpath}" | awk -F '=' '{print $2}')
-
-		# Not set
-		adminpassword=${adminpassword:-"NOT SET"}
-		maxplayers=${maxplayers:-"0"}
-		port=${port:-"23073"}
-		queryport=${queryport:-"23083"}
-		servername=${servername:-"NOT SET"}
-		serverpassword=${serverpassword:-"NOT SET"}
-	fi
-}
-
-fn_info_game_source() {
-	# Config
-	if [ ! -f "${servercfgfullpath}" ]; then
-		servername="${unavailable}"
-		serverpassword="${unavailable}"
-		rconpassword="${unavailable}"
-	else
-		servername=$(grep "hostname" "${servercfgfullpath}" | sed -e 's/^[ \t]*//g' -e '/^\//d' -e 's/hostname//g' | tr -d '=\";,:' | sed -e 's/^[ \t]*//' -e 's/[ \t]*$//')
-		serverpassword=$(grep "sv_password" "${servercfgfullpath}" | sed -e 's/^[ \t]*//g' -e '/^\//d' -e 's/sv_password//g' | tr -d '=\";,:' | sed -e 's/^[ \t]*//' -e 's/[ \t]*$//')
-		rconpassword=$(grep "rcon_password" "${servercfgfullpath}" | sed -e 's/^[ \t]*//g' -e '/^\//d' -e 's/rcon_password//g' | tr -d '=\";,:' | sed -e 's/^[ \t]*//' -e 's/[ \t]*$//')
-
-		# Not set
-		servername=${servername:-"NOT SET"}
-		serverpassword=${serverpassword:-"NOT SET"}
-		rconpassword=${rconpassword:-"NOT SET"}
-	fi
-
-	# Parameters
-	defaultmap=${defaultmap:-"NOT SET"}
-	maxplayers=${maxplayers:-"0"}
-	port=${port:-"0"}
-	rconport=${port:-"0"}
-	queryport=${port:-"0"}
-	clientport=${clientport:-"0"}
-	# Steamport can be between 26901-26910 and is normaly automatically set.
-	# Some servers might support -steamport parameter to set
-	if [ "${steamport}" == "0" ] || [ -v "${steamport}" ]; then
-		steamport="$(echo "${ssinfo}" | grep "${srcdslinuxpid}" | awk '{print $5}' | grep ":269" | cut -d ":" -f2)"
-	fi
-}
-
-fn_info_game_spark() {
-	defaultmap=${defaultmap:-"NOT SET"}
-	maxplayers=${maxplayers:-"0"}
-	port=${port:-"0"}
-	queryport=$((port + 1))
-	servername=${servername:-"NOT SET"}
-	serverpassword=${serverpassword:-"NOT SET"}
-	webadminuser=${webadminuser:-"NOT SET"}
-	webadminpass=${webadminpass:-"NOT SET"}
-	webadminport=${webadminport:-"0"}
-	# Commented out as displaying not set in details parameters
-	#mods=${mods:-"NOT SET"}
-}
-
-fn_info_game_squad() {
-	# Config
-	if [ ! -f "${servercfgfullpath}" ]; then
-		servername="${unavailable}"
-		maxplayers="${unavailable}"
-	else
-		servername=$(grep "ServerName=" "${servercfgfullpath}" | sed -e 's/^[ \t]*//g' -e '/^#/d' -e 's/ServerName//g' | tr -d '=\";,:' | sed -e 's/^[ \t]*//' -e 's/[ \t]*$//')
-		maxplayers=$(grep "MaxPlayers=" "${servercfgfullpath}" | tr -cd '[:digit:]')
-
-		servername=${servername:-"NOT SET"}
-		maxplayers=${maxplayers:-"0"}
-	fi
-
-	if [ ! -f "${servercfgdir}/Rcon.cfg" ]; then
-		rconport=${unavailable}
-		rconpassword=${unavailable}
-	else
-		rconport=$(grep "Port=" "${servercfgdir}/Rcon.cfg" | tr -cd '[:digit:]')
-		rconpassword=$(grep "Password=" "${servercfgdir}/Rcon.cfg" | sed -e 's/^[ \t]*//g' -e '/^\//d' -e 's/Password//g' | tr -d '=\";,:' | sed -e 's/^[ \t]*//' -e 's/[ \t]*$//')
-
-		rconport=${rconport:-"0"}
-		if [ -z "${rconpassword}" ] || [ ${#rconpassword} == 1 ]; then
-			rconpassword="NOT SET"
-		fi
-
-	fi
-
-	# Parameters
-	port=${port:-"0"}
-	queryport=${queryport:-"0"}
-}
-
-fn_info_game_st() {
-	# Config
-	if [ ! -f "${servercfgfullpath}" ]; then
-		servername="${unavailable}"
-		serverpassword="${unavailable}"
-		rconpassword="${unavailable}"
-		maxplayers="${unavailable}"
-	else
-		servername=$(grep "SERVERNAME" "${servercfgfullpath}" | sed -e 's/^[ \t]*//g' -e '/^\//d' -e 's/SERVERNAME//g' | tr -d '=\";,:' | sed -e 's/^[ \t]*//' -e 's/[ \t]*$//')
-		serverpassword=$(grep "PASSWORD" "${servercfgfullpath}" | grep "^PASSWORD" | sed -e 's/^[ \t]*//g' -e '/^\//d' -e 's/PASSWORD//g' | tr -d '=\";,:' | sed -e 's/^[ \t]*//' -e 's/[ \t]*$//')
-		rconpassword=$(grep "RCONPASSWORD" "${servercfgfullpath}" | sed -e 's/^[ \t]*//g' -e '/^\//d' -e 's/RCONPASSWORD//g' | tr -d '=\";,:' | sed -e 's/^[ \t]*//' -e 's/[ \t]*$//')
-		maxplayers=$(grep "MAXPLAYER" "${servercfgfullpath}" | sed -e 's/^[ \t]*//g' -e '/^\//d' -e 's/MAXPLAYER//g' | tr -d '=\";,:' | sed -e 's/^[ \t]*//' -e 's/[ \t]*$//')
-
-		# Not set
-		servername=${servername:-"NOT SET"}
-		serverpassword=${serverpassword:-"NOT SET"}
-		rconpassword=${rconpassword:-"NOT SET"}
-		maxplayers=${maxplayers:-"0"}
-	fi
-
-	# Parameters
-	port=${port:-"0"}
-	queryport=${queryport:-"0"}
-	httpport=${port:-"0"}
-	worldtype=${worldtype:-"NOT SET"}
-	autosaveinterval=${autosaveinterval:-"0"}
-	clearinterval=${clearinterval:-"0"}
-	worldname=${worldname:-"NOT SET"}
-}
-
-fn_info_game_terraria() {
-	# Config
-	if [ ! -f "${servercfgfullpath}" ]; then
-		servername="${unavailable}"
-		port="${zero}"
-		gameworld="${unavailable}"
-		maxplayers="${zero}"
-		queryport="${zero}"
-	else
-		servername=$(grep "worldname" "${servercfgfullpath}" | sed -e 's/^[ \t]*//g' -e '/^#/d' -e 's/worldname//g' | tr -d '=\";,:' | sed -e 's/^[ \t]*//' -e 's/[ \t]*$//')
-		port=$(grep "port" "${servercfgfullpath}" | tr -cd '[:digit:]')
-		queryport=${port:-"0"}
-		gameworld=$(grep "world=" "${servercfgfullpath}" | grep -v "//" | sed -e 's/^[ \t]*//g' -e '/^#/d' -e 's/world=//g' | tr -d '=\";,:' | sed -e 's/^[ \t]*//' -e 's/[ \t]*$//')
-		maxplayers=$(grep "maxplayers" "${servercfgfullpath}" | grep -v "//" | tr -cd '[:digit:]')
-
-		# Not set
-		servername=${servername:-"NOT SET"}
-		port=${port:-"0"}
-		queryport=${queryport:-"0"}
-		gameworld=${gameworld:-"NOT SET"}
-		maxplayers=${maxplayers:-"0"}
-	fi
-}
-
-fn_info_game_stn() {
-	# Config
-	if [ ! -f "${servercfgfullpath}" ]; then
-		servername="${unavailable}"
-		configip=${configip:-"0.0.0.0"}
-		port="${zero}"
-		queryport="${zero}"
-		serverpassword=${serverpassword:-"NOT SET"}
-	else
-		servername=$(sed -nr 's/^ServerName="(.*)"/\1/p' "${servercfgfullpath}")
-		configip=$(sed -nr 's/^ServerIP=([0-9]+)/\1/p' "${servercfgfullpath}")
-		port=$(sed -nr 's/^ServerPort=([0-9]+)/\1/p' "${servercfgfullpath}")
-		serverpassword=$(sed -nr 's/^ServerPassword=(.*)$/\1/p' "${servercfgfullpath}")
-		queryport=$((port + 1))
-
-		# Not set
-		serverpassword=${serverpassword:-"NOT SET"}
-		port=${port:-"0"}
-		serverpassword=${serverpassword:-"NOT SET"}
-		queryport=${queryport:-"0"}
-	fi
-}
-
-fn_info_game_ti() {
-	if [ ! -f "${servercfgfullpath}" ]; then
-		servername="${unavailable}"
-		maxplayers="${zero}"
-	else
-		servername=$(sed -nr 's/^ServerName="(.*)"/\1/p' "${servercfgfullpath}")
-		maxplayers=$(sed -nr 's/^MaxPlayerCount=([0-9]+)/\1/' "${servercfgfullpath}")
-
-		# Not set
-		servername=${servername:-"NOT SET"}
-		maxplayers=${maxplayers:-"0"}
-	fi
-
-}
-
-fn_info_game_ts3() {
-	# Config
-	if [ ! -f "${servercfgfullpath}" ]; then
-		dbplugin="${unavailable}"
-		port="9987"
-		queryport="10011"
-		querysshport="10022"
-		queryhttpport="10080"
-		queryhttpsport="10443"
-		fileport="30033"
-		telnetport="10011"
-	else
-		dbplugin=$(grep "dbplugin=" "${servercfgfullpath}" | sed -e 's/^[ \t]*//g' -e '/^#/d' -e 's/dbplugin=//g' | tr -d '=\";,:' | sed -e 's/^[ \t]*//' -e 's/[ \t]*$//')
-		port=$(grep "default_voice_port" "${servercfgfullpath}" | tr -cd '[:digit:]')
-		queryport=$(grep "query_port" "${servercfgfullpath}" | grep -v "#" | tr -cd '[:digit:]')
-		querysshport=$(grep "query_ssh_port" "${servercfgfullpath}" | grep -v "#" | tr -cd '[:digit:]')
-		queryhttpport=$(grep "query_http_port" "${servercfgfullpath}" | grep -v "#" | tr -cd '[:digit:]')
-		queryhttpsport=$(grep "query_https_port" "${servercfgfullpath}" | grep -v "#" | tr -cd '[:digit:]')
-		fileport=$(grep "filetransfer_port" "${servercfgfullpath}" | grep -v "#" | tr -cd '[:digit:]')
-		telnetport="${queryport}"
-		configip=$(grep "voice_ip" "${servercfgfullpath}" | sed -e 's/^[ \t]*//g' -e '/^#/d' -e 's/voice_ip//g' | sed 's/,.*//' | tr -d '=\";,' | sed -e 's/^[ \t]*//' -e 's/[ \t]*$//')
-
-		# Not set
-		dbplugin=${dbplugin:-"NOT SET"}
-		port=${port:-"9987"}
-		queryport=${queryport:-"10011"}
-		querysshport=${querysshport:-"10022"}
-		queryhttpport=${queryhttpport:-"10080"}
-		queryhttpsport=${queryhttpsport:-"10443"}
-		fileport=${fileport:-"30033"}
-		telnetport=${telnetport:-"10011"}
-		configip=${configip:-"0.0.0.0"}
-	fi
-}
-
-fn_info_game_tu() {
-	# Config
-	if [ ! -f "${servercfgfullpath}" ]; then
-		servername="${unavailable}"
-		maxplayers="${zero}"
-	else
-		servername=$(grep "ServerTitle" "${servercfgfullpath}" | sed -e 's/^[ \t]*//g' -e '/^--/d' -e 's/ServerTitle//g' | tr -d '=\";,:' | sed -e 's/^[ \t]*//' -e 's/[ \t]*$//')
-		maxplayers=$(grep "MaxPlayers" "${servercfgfullpath}" | grep -v "#" | tr -cd '[:digit:]')
-
-		# Not set
-		servername=${servername:-"NOT SET"}
-		maxplayers=${maxplayers:-"0"}
-	fi
-
-	# Parameters
-	port=${port:-"0"}
-	steamport=$((port + 1))
-	queryport=${queryport:-"0"}
-}
-
-fn_info_game_tw() {
-	# Config
-	if [ ! -f "${servercfgfullpath}" ]; then
-		servername="unnamed server"
-		serverpassword="${unavailable}"
-		rconpassword="${unavailable}"
-		port="8303"
-		queryport="8303"
-		maxplayers="12"
-	else
-		servername=$(grep "sv_name" "${servercfgfullpath}" | sed -e 's/^[ \t]*//g' -e '/^#/d' -e 's/^sv_name//g' | tr -d '=\";,:' | sed -e 's/^[ \t]*//' -e 's/[ \t]*$//')
-		serverpassword=$(grep "password" "${servercfgfullpath}" | sed -e 's/^[ \t]*//g' | grep "^password" | sed -e '/^#/d' -e 's/^password//g' | tr -d '=\";,:' | sed -e 's/^[ \t]*//' -e 's/[ \t]*$//')
-		rconpassword=$(grep "sv_rcon_password" "${servercfgfullpath}" | sed -e 's/^[ \t]*//g' -e '/^#/d' -e 's/^sv_rcon_password//g' | tr -d '=\";,:' | sed -e 's/^[ \t]*//' -e 's/[ \t]*$//')
-		port=$(grep "sv_port" "${servercfgfullpath}" | grep -v "#" | tr -cd '[:digit:]')
-		queryport="${port}"
-		maxplayers=$(grep "sv_max_clients" "${servercfgfullpath}" | grep -v "#" | tr -cd '[:digit:]')
-
-		# Not set
-		servername=${servername:-"NOT SET"}
-		serverpassword=${serverpassword:-"NOT SET"}
-		rconpassword=${rconpassword:-"NOT SET"}
-		port=${port:-"8303"}
-		queryport=${port:-"8303"}
-		maxplayers=${maxplayers:-"12"}
-	fi
-}
-
-fn_info_game_ut99() {
-	# Config
-	if [ ! -f "${servercfgfullpath}" ]; then
-		servername="${unavailable}"
-		serverpassword="${unavailable}"
-		adminpassword="${unavailable}"
-		port="${zero}"
-		queryport="${zero}"
-		queryportgs="${zero}"
-		webadminenabled="${unavailable}"
-		webadminport="${zero}"
-		webadminuser="${unavailable}"
-		webadminpass="${unavailable}"
-	else
-		servername=$(grep "ServerName" "${servercfgfullpath}" | sed -e 's/^[ \t]*//g' -e '/^#/d' -e 's/ServerName//g' | tr -d '=\";,:' | sed -e 's/^[ \t]*//' -e 's/[ \t]*$//' | sed 's/\r$//')
-		serverpassword=$(grep "GamePassword" "${servercfgfullpath}" | sed -e 's/^[ \t]*//g' -e '/^#/d' -e 's/GamePassword//g' | tr -d '=\";,:' | sed -e 's/^[ \t]*//' -e 's/[ \t]*$//' | sed 's/\r$//')
-		adminpassword=$(grep "AdminPassword" "${servercfgfullpath}" | sed -e 's/^[ \t]*//g' -e '/^#/d' -e 's/AdminPassword//g' | tr -d '=\";,:' | sed -e 's/^[ \t]*//' -e 's/[ \t]*$//' | sed 's/\r$//')
-		port=$(grep "Port" "${servercfgfullpath}" | sed -e 's/^[ \t]*//g' | grep "^Port" | grep -v "#" | tr -cd '[:digit:]')
-		queryport=$((port + 1))
-		queryportgs=$(grep "OldQueryPortNumber" "${servercfgfullpath}" | grep -v "#" | tr -cd '[:digit:]')
-		beaconport=$(grep "ServerBeaconPort" "${servercfgfullpath}" | grep -v "#" | tr -cd '[:digit:]')
-		webadminenabled=$(grep "bEnabled" "${servercfgfullpath}" | sed -e 's/^[ \t]*//g' -e '/^#/d' -e 's/bEnabled//g' | tr -d '=\";,:' | sed -e 's/^[ \t]*//' -e 's/[ \t]*$//' | sed 's/\r$//')
-		httpport=$(grep "ListenPort" "${servercfgfullpath}" | grep -v "#" | tr -cd '[:digit:]')
-		webadminuser=$(grep "AdminUsername" "${servercfgfullpath}" | sed -e 's/^[ \t]*//g' -e '/^#/d' -e 's/AdminUsername//g' | tr -d '=\";,:' | sed -e 's/^[ \t]*//' -e 's/[ \t]*$//' | sed 's/\r$//')
-		webadminpass=$(grep "UTServerAdmin.UTServerAdmin" "${servercfgfullpath}" -A 4 | grep "AdminPassword" | sed -e 's/^[ \t]*//g' -e '/^#/d' -e 's/AdminPassword//g' | tr -d '=\";,:' | sed -e 's/^[ \t]*//' -e 's/[ \t]*$//' | sed 's/\r$//')
-
-		# Not set
-		servername=${servername:-"NOT SET"}
-		serverpassword=${serverpassword:-"NOT SET"}
-		adminpassword=${adminpassword:-"NOT SET"}
-		port=${port:-"0"}
-		queryport=${queryport:-"0"}
-		beaconport=${beaconport:-"8777"}
-		queryportgs=${queryportgs:-"0"}
-		webadminenabled=${webadminenabled:-"NOT SET"}
-		webadminport=${webadminport:-"0"}
-		webadminuser=${webadminuser:-"NOT SET"}
-		webadminpass=${webadminpass:-"NOT SET"}
-	fi
-
-	# Parameters
-	defaultmap=${defaultmap:-"NOT SET"}
-}
-
-fn_info_game_unreal2() {
-	# Config
-	if [ ! -f "${servercfgfullpath}" ]; then
-		servername="${unavailable}"
-		serverpassword="${unavailable}"
-		adminpassword="${unavailable}"
-		port="${zero}"
-		queryport="${zero}"
-		queryportgs="${zero}"
-		webadminenabled="${unavailable}"
-		webadminport="${zero}"
-		webadminuser="${unavailable}"
-		webadminpass="${unavailable}"
-	else
-		servername=$(sed -nr 's/^ServerName=(.*)$/\1/p' "${servercfgfullpath}" | tr -d '=\";,:' | sed 's/\r$//')
-		serverpassword=$(sed -nr 's/^GamePassword=(.*)$/\1/p' "${servercfgfullpath}" | tr -d '=\";,:' | sed 's/\r$//')
-		adminpassword=$(sed -nr 's/^AdminPassword=(.*)$/\1/p' "${servercfgfullpath}" | tr -d '=\";,:' | sed 's/\r$//')
-		port=$(sed -nr 's/^Port=(.*)$/\1/p' "${servercfgfullpath}" | tr -cd '[:digit:]')
-		queryport=$((port + 1))
-		queryportgs=$(sed -nr 's/^OldQueryPortNumber=(.*)$/\1/p' "${servercfgfullpath}" | tr -cd '[:digit:]')
-		webadminenabled=$(sed -nr 's/^bEnabled=(.*)$/\1/p' "${servercfgfullpath}" | tr -d '=\";,:' | sed 's/\r$//')
-		webadminport=$(sed -nr 's/^ListenPort=(.*)$/\1/p' "${servercfgfullpath}" | tr -cd '[:digit:]')
-		webadminuser=$(sed -nr 's/^AdminName=(.*)$/\1/p' "${servercfgfullpath}" | tr -d '=\";,:' | sed 's/\r$//')
-		webadminpass="${adminpassword}"
-
-		# Not set
-		servername=${servername:-"NOT SET"}
-		serverpassword=${serverpassword:-"NOT SET"}
-		adminpassword=${adminpassword:-"NOT SET"}
-		port=${port:-"0"}
-		queryport=${queryport:-"0"}
-		queryportgs=${queryportgs:-"0"}
-		webadminenabled=${webadminenabled:-"NOT SET"}
-		webadminport=${webadminport:-"0"}
-		webadminuser=${webadminuser:-"NOT SET"}
-		webadminpass=${webadminpass:-"NOT SET"}
-	fi
-
-	# Parameters
-	defaultmap=${defaultmap:-"NOT SET"}
-}
-
-fn_info_game_unt() {
-	# Parameters
-	servername=${selfname:-"NOT SET"}
-	port=${port:-"0"}
-	queryport=${port}
-	steamport=$((port + 1))
-}
-
-fn_info_game_ut() {
-	# Config
-	if [ ! -f "${servercfgfullpath}" ]; then
-		servername="${unavailable}"
-	else
-		servername=$(grep "ServerName" "${servercfgfullpath}" | awk -F '=' '{print $2}')
-
-		# Not set
-		servername=${servername:-"NOT SET"}
-	fi
-
-	# Parameters
-	port=${port:-"0"}
-	queryport=$((port + 1))
-}
-
-fn_info_game_unreal2k4() {
-	# Config
-	if [ ! -f "${servercfgfullpath}" ]; then
-		servername="${unavailable}"
-		serverpassword="${unavailable}"
-		adminpassword="${unavailable}"
-		port="${zero}"
-		queryport="${zero}"
-		queryportgs="${zero}"
-		lanport="${zero}"
-		webadminenabled="${unavailable}"
-		httpport="${zero}"
-		webadminuser="${unavailable}"
-		webadminpass="${unavailable}"
-	else
-		servername=$(sed -nr 's/^ServerName=(.*)$/\1/p' "${servercfgfullpath}" | tr -d '=\";,:' | sed 's/\r$//')
-		serverpassword=$(sed -nr 's/^GamePassword=(.*)$/\1/p' "${servercfgfullpath}" | tr -d '=\";,:' | sed 's/\r$//')
-		adminpassword=$(sed -nr 's/^AdminPassword=(.*)$/\1/p' "${servercfgfullpath}" | tr -d '=\";,:' | sed 's/\r$//')
-		port=$(sed -nr 's/^Port=(.*)$/\1/p' "${servercfgfullpath}" | tr -cd '[:digit:]')
-		queryport=$((port + 1))
-		queryportgs=$(sed -nr 's/^OldQueryPortNumber=(.*)$/\1/p' "${servercfgfullpath}" | tr -cd '[:digit:]')
-		lanport=$(grep "LANServerPort=" "${servercfgfullpath}" | tr -cd '[:digit:]')
-		webadminenabled=$(sed -nr 's/^bEnabled=(.*)$/\1/p' "${servercfgfullpath}" | tr -d '=\";,:' | sed 's/\r$//')
-		httpport=$(sed -nr 's/^ListenPort=(.*)$/\1/p' "${servercfgfullpath}" | tr -cd '[:digit:]')
-		webadminuser=$(sed -nr 's/^AdminName=(.*)$/\1/p' "${servercfgfullpath}" | tr -d '=\";,:' | sed 's/\r$//')
-		webadminpass="${adminpassword}"
-
-		# Not set
-		servername=${servername:-"NOT SET"}
-		serverpassword=${serverpassword:-"NOT SET"}
-		adminpassword=${adminpassword:-"NOT SET"}
-		port=${port:-"0"}
-		queryport=${queryport:-"0"}
-		queryportgs=${queryportgs:-"0"}
-		lanport=${lanport:-"0"}
-		webadminenabled=${webadminenabled:-"NOT SET"}
-		httpport=${httpport:-"0"}
-		webadminuser=${webadminuser:-"NOT SET"}
-		webadminpass=${webadminpass:-"NOT SET"}
-	fi
-}
-
-fn_info_game_ut3() {
-	# Config
-	if [ ! -f "${servercfgfullpath}" ]; then
-		servername="${unavailable}"
-		serverpassword="${unavailable}"
-		adminpassword="${unavailable}"
-		maxplayers="${unavailable}"
-		webadminenabled="${unavailable}"
-		webadminport="${zero}"
-		webadminuser="${unavailable}"
-		webadminpass="${unavailable}"
-	else
-		servername=$(grep "ServerName" "${servercfgfullpath}" | sed -e 's/^[ \t]*//g' -e '/^#/d' -e 's/ServerName//g' | tr -d '=\";,:' | sed -e 's/^[ \t]*//' -e 's/[ \t]*$//')
-		serverpassword=$(grep "GamePassword" "${servercfgfullpath}" | sed -e 's/^[ \t]*//g' -e '/^#/d' -e 's/GamePassword//g' | tr -d '=\";,:' | sed -e 's/^[ \t]*//' -e 's/[ \t]*$//')
-		adminpassword=$(grep "AdminPassword" "${servercfgfullpath}" | sed -e 's/^[ \t]*//g' -e '/^#/d' -e 's/AdminPassword//g' | tr -d '=\";,:' | sed -e 's/^[ \t]*//' -e 's/[ \t]*$//')
-		maxplayers=$(grep "MaxPlayers" "${servercfgfullpath}" | grep -v "#" | tr -cd '[:digit:]')
-		webadminenabled=$(grep "bEnabled" "${servercfgdir}/UTWeb.ini" | sed -e 's/^[ \t]*//g' -e '/^#/d' -e 's/bEnabled//g' | tr -d '=\";,:' | sed -e 's/^[ \t]*//' -e 's/[ \t]*$//')
-		webadminport=$(grep "ListenPort" "${servercfgdir}/UTWeb.ini" | grep -v "#" | tr -cd '[:digit:]')
-		webadminuser="Admin"
-		webadminpass=$(grep "AdminPassword" "${servercfgfullpath}" | sed -e 's/^[ \t]*//g' -e '/^#/d' -e 's/AdminPassword//g' | tr -d '=\";,:' | sed -e 's/^[ \t]*//' -e 's/[ \t]*$//')
-
-		# Not set
-		servername=${servername:-"NOT SET"}
-		serverpassword=${serverpassword:-"NOT SET"}
-		adminpassword=${adminpassword:-"NOT SET"}
-		maxplayers=${maxplayers:-"0"}
-		webadminenabled=${webadminenabled:-"NOT SET"}
-		webadminport=${webadminport:-"0"}
-		webadminuser=${webadminuser:-"NOT SET"}
-		webadminpass=${webadminpass:-"NOT SET"}
-	fi
-
-	# Parameters
-	port=${port:-"0"}
-	queryport=${queryport:-"0"}
-	defaultmap=${defaultmap:-"NOT SET"}
-}
-
-fn_info_game_vh() {
-	# Parameters
-	port=${port:-"0"}
-	# Query port only enabled if public server
-	if [ "${public}" != "0" ]; then
-		queryport=$((port + 1))
-	else
-		querymode="1"
-	fi
-	gameworld=${gameworld:-"NOT SET"}
-	serverpassword=${serverpassword:-"NOT SET"}
-	servername=${servername:-"NOT SET"}
-}
-
-fn_info_game_vints() {
-	if [ ! -f "${servercfgfullpath}" ]; then
-		servername="${unavailable}"
-		maxplayers="${unavailable}"
-		serverpassword="${unavailable}"
-		port="${port:-"0"}"
-	else
-		servername=$(jq -r '.ServerName' "${servercfgfullpath}")
-		maxplayers=$(jq -r '.MaxClients' "${servercfgfullpath}")
-		serverpassword=$(jq -r 'select(.Password != null) | .Password' "${servercfgfullpath}")
-		port=$(jq -r '.Port' "${servercfgfullpath}")
-		configip=$(jq -r 'select(.Ip != null) | .Ip' "${servercfgfullpath}")
-	fi
-	queryport=${port:-"0"}
-	serverpassword=${serverpassword:-"NOT SET"}
-	configip=${configip:-"0.0.0.0"}
-}
-
-fn_info_game_vpmc() {
-	if [ ! -f "${servercfgfullpath}" ]; then
-		servername="${unavailable}"
-		configip="0.0.0.0"
-		port="25577"
-	else
-		servername=$(sed -nr 's/^motd\s*=\s*"(.*)"/\1/p' "${servercfgfullpath}")
-		bindaddress=$(sed -nr 's/^bind\s*=\s*"([0-9.:]+)"/\1/p' "${servercfgfullpath}")
-		configip=$(echo "${bindaddress}" | cut -d ':' -f 1)
-		port=$(echo "${bindaddress}" | cut -d ':' -f 2)
-
-		servername=${servername:-"NOT SET"}
-	fi
-	queryport=${port:-"25577"}
-}
-
-fn_info_game_wet() {
-	# Config
-	if [ ! -f "${servercfgfullpath}" ]; then
-		rconpassword="${unavailable}"
-		servername="${unavailable}"
-		serverpassword="${unavailable}"
-		maxplayers="${zero}"
-		port="${zero}"
-		queryport="${zero}"
-	else
-		port=$(grep "set net_port" "${servercfgfullpath}" | grep -v "//" | tr -cd '[:digit:]')
-		queryport="${port}"
-		rconpassword=$(grep "set zmq_rcon_password" "${servercfgfullpath}" | sed -e 's/^[ \t]*//g' -e '/^\//d' -e 's/set zmq_rcon_password //g' | tr -d '=\";,:' | sed -e 's/^[ \t]*//g' -e '/^\//d' | sed -e 's/^[ \t]*//' -e 's/[ \t]*$//')
-		servername=$(grep "set sv_hostname" "${servercfgfullpath}" | sed -e 's/^[ \t]*//g' -e '/^\//d' -e 's/set sv_hostname //g' | tr -d '=\";,:' | sed -e 's/^[ \t]*//' -e 's/[ \t]*$//')
-		serverpassword=$(grep "set g_password" "${servercfgfullpath}" | sed -e 's/^[ \t]*//g' -e '/^\//d' -e 's/set g_password //g' | tr -d '=\";,:' | sed -e 's/^[ \t]*//' -e 's/[ \t]*$//')
-		maxplayers=$(grep "set sv_maxclients" "${servercfgfullpath}" | grep -v "//" | tr -cd '[:digit:]')
-		configip=$(grep "set net_ip" "${servercfgfullpath}" | sed -e 's/^[ \t]*//g' -e '/^\//d' -e 's/set net_ip//g' | tr -d '=\";,:' | sed -e 's/^[ \t]*//' -e 's/[ \t]*$//')
-
-		# Not set
-		rconpassword=${rconpassword:-"NOT SET"}
-		servername=${servername:-"NOT SET"}
-		serverpassword=${serverpassword:-"NOT SET"}
-		maxplayers=${maxplayers:-"0"}
-		port=${port:-"27960"}
-		queryport=${queryport:-"27960"}
-		configip=${configip:-"0.0.0.0"}
-	fi
-}
-
-fn_info_game_wf() {
-	# Config
-	if [ ! -f "${servercfgfullpath}" ]; then
-		rconpassword="${unavailable}"
-		servername="${unavailable}"
-		maxplayers="${zero}"
-	else
-		rconpassword=$(grep "rcon_password" "${servercfgfullpath}" | sed -e 's/^[ \t]*//g' -e '/^\//d' -e 's/set rcon_password//g' | tr -d '=\";,:' | sed -e 's/^[ \t]*//' -e 's/[ \t]*$//')
-		servername=$(grep "sv_hostname" "${servercfgfullpath}" | sed -e 's/^[ \t]*//g' -e '/^\//d' -e 's/set sv_hostname//g' | tr -d '=\";,:' | sed -e 's/^[ \t]*//' -e 's/[ \t]*$//')
-		maxplayers=$(grep "sv_maxclients" "${servercfgfullpath}" | grep -v "#" | tr -cd '[:digit:]')
-
-		# Not set
-		rconpassword=${rconpassword:-"NOT SET"}
-		servername=${servername:-"NOT SET"}
-		maxplayers=${maxplayers:-"0"}
-	fi
-
-	# Parameters
-	port=${port:-"0"}
-	queryport="${port:-"0"}"
-	webadminport=${webadminport:-"0"}
-}
-
-fn_info_game_wmc() {
-	if [ ! -f "${servercfgfullpath}" ]; then
-		servername="${unavailable}"
-		maxplayers="${zero}"
-		port="${zero}"
-		queryport="${zero}"
-		queryenabled="${unavailable}"
-	else
-		servername=$(sed -e '/^listeners:/,/^[a-z]/!d' "${servercfgfullpath}" | sed -nr 's/^[ ]+motd: (.*)$/\1/p' | tr -d "'" | sed 's/&1//')
-		queryport=$(sed -nr 's/^[ -]+query_port: ([0-9]+)/\1/p' "${servercfgfullpath}")
-		queryenabled=$(sed -nr 's/^[ ]+query_enabled: (.*)$/\1/p' "${servercfgfullpath}")
-		port=$(sed -nr 's/^[ ]+host: [0-9]+\.[0-9]+\.[0-9]+\.[0-9]+:([0-9]+)/\1/p' "${servercfgfullpath}")
-		# the normal max_players does only show in on the client side and has no effect how many players can connect.
-		maxplayers=$(sed -nr 's/^player_limit: ([-]*[0-9])/\1/p' "${servercfgfullpath}")
-		configip=$(sed -nr 's/^[ ]+host: ([0-9]+\.[0-9]+\.[0-9]+\.[0-9]+):[0-9]+/\1/p' "${servercfgfullpath}")
-
-		if [ "${maxplayers}" == "-1" ] || [ "${maxplayers}" == "0" ]; then
-			maxplayers="UNLIMITED"
-		fi
-
-		# Not set
-		servername=${servername:-"NOT SET"}
-		queryport=${queryport:-"25577"}
-		maxplayers=${maxplayers:-"0"}
-		configip=${configip:-"0.0.0.0"}
-	fi
-}
-
-fn_info_game_wurm() {
-	# Config
-	if [ ! -f "${servercfgfullpath}" ]; then
-		port="${zero}"
-		queryport="${zero}"
-		rconpassword="${unavailable}"
-		servername="${unavailable}"
-		serverpassword="${unavailable}"
-		adminpassword="${unavailable}"
-		maxplayers="${zero}"
-	else
-		port=$(grep "EXTERNALPORT=" "${servercfgfullpath}" | grep -v "#" | tr -cd '[:digit:]')
-		queryport=$(grep "QUERYPORT=" "${servercfgfullpath}" | grep -v "#" | tr -cd '[:digit:]')
-		servername=$(grep "SERVERNAME=" "${servercfgfullpath}" | sed -e 's/^[ \t]*//g' -e '/^\//d' -e 's/SERVERNAME//g' | tr -d '=\";,:' | sed -e 's/^[ \t]*//' -e 's/[ \t]*$//')
-		serverpassword=$(grep "SERVERPASSWORD=" "${servercfgfullpath}" | sed -e 's/^[ \t]*//g' -e '/^\//d' -e 's/SERVERPASSWORD//g' | tr -d '=\";,:' | sed -e 's/^[ \t]*//' -e 's/[ \t]*$//')
-		adminpassword=$(grep "ADMINPWD=" "${servercfgfullpath}" | sed -e 's/^[ \t]*//g' -e '/^\//d' -e 's/ADMINPWD//g' | tr -d '=\";,:' | sed -e 's/^[ \t]*//' -e 's/[ \t]*$//')
-		maxplayers=$(grep "MAXPLAYERS=" "${servercfgfullpath}" | grep -v "#" | tr -cd '[:digit:]')
-		configip=$(grep "IP" "${servercfgfullpath}" | sed -e 's/^[ \t]*//g' -e '/^#/d' -e 's/IP//g' | tr -d '=\";,:' | sed -e 's/^[ \t]*//' -e 's/[ \t]*$//')
-
-		# Not set
-		port=${port:-"3724"}
-		queryport=${queryport:-"27017"}
-		servername=${servername:-"NOT SET"}
-		serverpassword=${serverpassword:-"NOT SET"}
-		adminpassword=${adminpassword:-"NOT SET"}
-		maxplayers=${maxplayers:-"0"}
-	fi
-}
-
-unavailable="${red}UNAVAILABLE${default}"
-zero="${red}0${default}"
-
-if [ "${shortname}" == "ac" ]; then
-	fn_info_game_ac
-elif [ "${shortname}" == "ark" ]; then
-	fn_info_game_ark
-elif [ "${shortname}" == "arma3" ]; then
-	fn_info_game_arma3
-elif [ "${shortname}" == "armar" ]; then
-	fn_info_game_armar
-elif [ "${shortname}" == "av" ]; then
-	fn_info_game_av
-elif [ "${shortname}" == "bf1942" ]; then
-	fn_info_game_bf1942
-elif [ "${shortname}" == "bfv" ]; then
-	fn_info_game_bfv
-elif [ "${shortname}" == "bo" ]; then
-	fn_info_game_bo
-elif [ "${shortname}" == "bt" ]; then
-	fn_info_game_bt
-elif [ "${shortname}" == "btl" ]; then
-	fn_info_game_btl
-elif [ "${shortname}" == "cd" ]; then
-	fn_info_game_cd
-elif [ "${shortname}" == "ck" ]; then
-	fn_info_game_ck
-elif [ "${shortname}" == "cmw" ]; then
-	fn_info_game_cmw
-elif [ "${shortname}" == "cod" ]; then
-	fn_info_game_cod
-elif [ "${shortname}" == "coduo" ]; then
-	fn_info_game_cod
-elif [ "${shortname}" == "cod2" ]; then
-	fn_info_game_cod2
-elif [ "${shortname}" == "cod4" ]; then
-	fn_info_game_cod4
-elif [ "${shortname}" == "codwaw" ]; then
-	fn_info_game_codwaw
-elif [ "${shortname}" == "col" ]; then
-	fn_info_game_col
-elif [ "${shortname}" == "dayz" ]; then
-	fn_info_game_dayz
-elif [ "${shortname}" == "dodr" ]; then
-	fn_info_game_dodr
-elif [ "${shortname}" == "dst" ]; then
-	fn_info_game_dst
-elif [ "${shortname}" == "eco" ]; then
-	fn_info_game_eco
-elif [ "${shortname}" == "etl" ]; then
-	fn_info_game_etl
-elif [ "${shortname}" == "fctr" ]; then
-	fn_info_game_fctr
-elif [ "${shortname}" == "hw" ]; then
-	fn_info_game_hw
-elif [ "${shortname}" == "inss" ]; then
-	fn_info_game_inss
-elif [ "${shortname}" == "jc2" ]; then
-	fn_info_game_jc2
-elif [ "${shortname}" == "jc3" ]; then
-	fn_info_game_jc3
-elif [ "${shortname}" == "jk2" ]; then
-	fn_info_game_jk2
-elif [ "${shortname}" == "kf" ]; then
-	fn_info_game_kf
-elif [ "${shortname}" == "kf2" ]; then
-	fn_info_game_kf2
-elif [ "${shortname}" == "lo" ]; then
-	fn_info_game_lo
-elif [ "${shortname}" == "mc" ] || [ "${shortname}" == "pmc" ]; then
-	fn_info_game_mc
-elif [ "${shortname}" == "mcb" ]; then
-	fn_info_game_mcb
-elif [ "${shortname}" == "mh" ]; then
-	fn_info_game_mh
-elif [ "${shortname}" == "mohaa" ]; then
-	fn_info_game_mohaa
-elif [ "${shortname}" == "mom" ]; then
-	fn_info_game_mom
-elif [ "${shortname}" == "mta" ]; then
-	fn_info_game_mta
-elif [ "${shortname}" == "nec" ]; then
-	fn_info_game_nec
-elif [ "${shortname}" == "onset" ]; then
-	fn_info_game_onset
-elif [ "${shortname}" == "pc" ]; then
-	fn_info_game_pc
-elif [ "${shortname}" == "pc2" ]; then
-	fn_info_game_pc2
-elif [ "${shortname}" == "pstbs" ]; then
-	fn_info_game_pstbs
-elif [ "${shortname}" == "pvr" ]; then
-	fn_info_game_pvr
-elif [ "${shortname}" == "pz" ]; then
-	fn_info_game_pz
-elif [ "${shortname}" == "q2" ]; then
-	fn_info_game_q2
-elif [ "${shortname}" == "q3" ]; then
-	fn_info_game_q3
-elif [ "${shortname}" == "ql" ]; then
-	fn_info_game_ql
-elif [ "${shortname}" == "qw" ]; then
-	fn_info_game_qw
-elif [ "${shortname}" == "ro" ]; then
-	fn_info_game_ro
-elif [ "${shortname}" == "rtcw" ]; then
-	fn_info_game_rtcw
-elif [ "${shortname}" == "rust" ]; then
-	fn_info_game_rust
-elif [ "${shortname}" == "rw" ]; then
-	fn_info_game_rw
-elif [ "${shortname}" == "samp" ]; then
-	fn_info_game_samp
-elif [ "${shortname}" == "sb" ]; then
-	fn_info_game_sb
-elif [ "${shortname}" == "sbots" ]; then
-	fn_info_game_sbots
-elif [ "${shortname}" == "scpsl" ] || [ "${shortname}" == "scpslsm" ]; then
-	fn_info_game_scpsl
-elif [ "${shortname}" == "sdtd" ]; then
-	fn_info_game_sdtd
-elif [ "${shortname}" == "sf" ]; then
-	fn_info_game_sf
-elif [ "${shortname}" == "sof2" ]; then
-	fn_info_game_sof2
-elif [ "${shortname}" == "sol" ]; then
-	fn_info_game_sol
-elif [ "${engine}" == "spark" ]; then
-	fn_info_game_spark
-elif [ "${shortname}" == "squad" ]; then
-	fn_info_game_squad
-elif [ "${shortname}" == "st" ]; then
-	fn_info_game_st
-elif [ "${shortname}" == "stn" ]; then
-	fn_info_game_stn
-elif [ "${shortname}" == "terraria" ]; then
-	fn_info_game_terraria
-elif [ "${shortname}" == "ti" ]; then
-	fn_info_game_ti
-elif [ "${shortname}" == "ts3" ]; then
-	fn_info_game_ts3
-elif [ "${shortname}" == "tu" ]; then
-	fn_info_game_tu
-elif [ "${shortname}" == "tw" ]; then
-	fn_info_game_tw
-elif [ "${shortname}" == "unt" ]; then
-	fn_info_game_unt
-elif [ "${shortname}" == "ut" ]; then
-	fn_info_game_ut
-elif [ "${shortname}" == "ut2k4" ]; then
-	fn_info_game_unreal2k4
-elif [ "${shortname}" == "ut3" ]; then
-	fn_info_game_ut3
-elif [ "${shortname}" == "ut99" ]; then
-	fn_info_game_ut99
-elif [ "${shortname}" == "vh" ]; then
-	fn_info_game_vh
-elif [ "${shortname}" == "vints" ]; then
-	fn_info_game_vints
-elif [ "${shortname}" == "vpmc" ]; then
-	fn_info_game_vpmc
-elif [ "${shortname}" == "wet" ]; then
-	fn_info_game_wet
-elif [ "${shortname}" == "wf" ]; then
-	fn_info_game_wf
-elif [ "${shortname}" == "wmc" ]; then
-	fn_info_game_wmc
-elif [ "${shortname}" == "wurm" ]; then
-	fn_info_game_wurm
-elif [ "${engine}" == "prism3d" ]; then
-	fn_info_game_prism3d
-elif [ "${engine}" == "source" ] || [ "${engine}" == "goldsrc" ]; then
-	fn_info_game_source
-elif [ "${engine}" == "unreal2" ]; then
-	fn_info_game_unreal2
-fi
-
-# External IP address
-# Cache external IP address for 24 hours
-if [ -f "${tmpdir}/extip.txt" ]; then
-	if [ "$(find "${tmpdir}/extip.txt" -mmin +1440)" ]; then
-		rm -f "${tmpdir:?}/extip.txt"
-	fi
-fi
-
-if [ ! -f "${tmpdir}/extip.txt" ]; then
-	extip="$(curl --connect-timeout 10 -s https://api.ipify.org 2> /dev/null)"
-	exitcode=$?
-	# if curl passes add extip to externalip.txt
-	if [ "${exitcode}" != "0" ]; then
-		echo "Unable to get external IP address"
-	else
-		echo "${extip}" > "${tmpdir}/extip.txt"
-	fi
-else
-	extip="$(cat "${tmpdir}/extip.txt")"
-fi
-
-# Alert IP address
-if [ "${displayip}" ]; then
-	alertip="${displayip}"
-elif [ "${extip}" ]; then
-	alertip="${extip}"
-else
-	alertip="${ip}"
-fi
-
-# Steam Master Server - checks if detected by master server.
-# Checked after config init, as the queryport is needed
-if [ -z "${displaymasterserver}" ]; then
-	if [ "$(command -v jq 2> /dev/null)" ]; then
-		if [ "${ip}" ] && [ "${port}" ]; then
-			if [ "${steammaster}" == "true" ] || [ "${commandname}" == "DEV-QUERY-RAW" ]; then
-				# Will query server IP addresses first.
-				for queryip in "${queryips[@]}"; do
-					masterserver="$(curl --connect-timeout 10 -m 3 -s "https://api.steampowered.com/ISteamApps/GetServersAtAddress/v0001?addr=${queryip}&format=json" | jq --arg port "${port}" --arg queryport "${queryport}" '.response.servers[] | select((.gameport == ($port|tonumber) or (.gameport == ($queryport|tonumber)))) | .addr' | wc -l 2> /dev/null)"
-				done
-				# Should that not work it will try the external IP.
-				if [ "${masterserver}" == "0" ]; then
-					masterserver="$(curl --connect-timeout 10 -m 3 -s "https://api.steampowered.com/ISteamApps/GetServersAtAddress/v0001?addr=${extip}&format=json" | jq --arg port "${port}" --arg queryport "${queryport}" '.response.servers[] | select((.gameport == ($port|tonumber) or (.gameport == ($queryport|tonumber)))) | .addr' | wc -l 2> /dev/null)"
-				fi
-				if [ "${masterserver}" == "0" ]; then
-					displaymasterserver="false"
-				else
-					displaymasterserver="true"
-				fi
-			fi
-		fi
-	fi
-fi
diff --git a/lgsm/functions/info_messages.sh b/lgsm/functions/info_messages.sh
deleted file mode 100644
index 3766049c6..000000000
--- a/lgsm/functions/info_messages.sh
+++ /dev/null
@@ -1,1849 +0,0 @@
-#!/bin/bash
-# LinuxGSM info_messages.sh module
-# Author: Daniel Gibbs
-# Contributors: http://linuxgsm.com/contrib
-# Website: https://linuxgsm.com
-# Description: Defines server info messages for details and alerts.
-
-functionselfname="$(basename "$(readlink -f "${BASH_SOURCE[0]}")")"
-
-# Separator is different for details.
-fn_messages_separator() {
-	if [ "${commandname}" == "DETAILS" ]; then
-		printf '%*s\n' "${COLUMNS:-$(tput cols)}" '' | tr ' ' =
-	else
-		echo -e "================================="
-	fi
-}
-
-# Removes the passwords form all but details.
-fn_info_message_password_strip() {
-	if [ "${commandname}" != "DETAILS" ]; then
-		if [ "${serverpassword}" ]; then
-			serverpassword="********"
-		fi
-
-		if [ "${rconpassword}" ]; then
-			rconpassword="********"
-		fi
-
-		if [ "${adminpassword}" ]; then
-			adminpassword="********"
-		fi
-
-		if [ "${statspassword}" ]; then
-			statspassword="********"
-		fi
-
-		if [ "${webadminpass}" ]; then
-			webadminpass="********"
-		fi
-
-		if [ "${telnetpass}" ]; then
-			telnetpass="********"
-		fi
-
-		if [ "${wsapikey}" ]; then
-			wsapikey="********"
-		fi
-
-		if [ "${gslt}" ]; then
-			gslt="********"
-		fi
-	fi
-}
-
-# Alert Summary
-# used with alertlog
-fn_info_message_head() {
-	echo -e ""
-	echo -e "${lightyellow}Alert Summary${default}"
-	fn_messages_separator
-	echo -e "Message"
-	echo -e "${alertbody}"
-	echo -e ""
-	echo -e "Game"
-	echo -e "${gamename}"
-	echo -e ""
-	echo -e "Server name"
-	echo -e "${servername}"
-	echo -e ""
-	echo -e "Hostname"
-	echo -e "${HOSTNAME}"
-	echo -e ""
-	echo -e "Server IP"
-	echo -e "${ip}:${port}"
-}
-
-fn_info_message_distro() {
-	#
-	# Distro Details
-	# =================================
-	# Date:      Sun 21 Feb 2021 09:22:53 AM UTC
-	# Distro:    Ubuntu 20.04.2 LTS
-	# Arch:      x86_64
-	# Kernel:    5.4.0-65-generic
-	# Hostname:  server
-	# Uptime:    16d, 5h, 18m
-	# tmux:      tmux 3.0a
-	# glibc:     2.31
-
-	echo -e ""
-	echo -e "${lightyellow}Distro Details${default}"
-	fn_messages_separator
-	{
-		echo -e "${lightblue}Date:\t${default}$(date)"
-		echo -e "${lightblue}Distro:\t${default}${distroname}"
-		echo -e "${lightblue}Arch:\t${default}${arch}"
-		echo -e "${lightblue}Kernel:\t${default}${kernel}"
-		echo -e "${lightblue}Hostname:\t${default}${HOSTNAME}"
-		echo -e "${lightblue}Uptime:\t${default}${days}d, ${hours}h, ${minutes}m"
-		echo -e "${lightblue}tmux:\t${default}${tmuxv}"
-		echo -e "${lightblue}glibc:\t${default}${glibcversion}"
-		if [ -n "${javaram}" ]; then
-			echo -e "${lightblue}Java:\t${default}${javaversion}"
-		fi
-	} | column -s $'\t' -t
-}
-
-fn_info_message_server_resource() {
-	#
-	# Server Resource
-	# =================================
-	# CPU
-	# Model:      AMD EPYC 7601 32-Core Processor
-	# Cores:      2
-	# Frequency:  2199.994MHz
-	# Avg Load:   0.01, 0.05, 0.18
-	#
-	# Memory
-	# Mem:       total  used   free   cached  available
-	# Physical:  3.9GB  350MB  3.3GB  3.2GB   3.3GB
-	# Swap:      512MB  55MB   458MB
-	#
-	# Storage
-	# Filesystem:  /dev/sda
-	# Total:       79G
-	# Used:        73G
-	# Available:   1.4G
-	#
-	# Network
-	# IP:           0.0.0.0
-	# Internet IP:  176.58.124.96
-
-	echo -e ""
-	echo -e "${lightyellow}Server Resource${default}"
-	fn_messages_separator
-	{
-		echo -e "${lightyellow}CPU\t${default}"
-		echo -e "${lightblue}Model:\t${default}${cpumodel}"
-		echo -e "${lightblue}Cores:\t${default}${cpucores}"
-		echo -e "${lightblue}Frequency:\t${default}${cpufreqency}MHz"
-		echo -e "${lightblue}Avg Load:\t${default}${load}"
-	} | column -s $'\t' -t
-	echo -e ""
-	{
-		echo -e "${lightyellow}Memory\t${default}"
-		echo -e "${lightblue}Mem:\t${lightblue}total\tused\tfree\tcached\tavailable${default}"
-		echo -e "${lightblue}Physical:\t${default}${physmemtotal}\t${physmemused}\t${physmemfree}\t${physmemcached}\t${physmemavailable}${default}"
-		echo -e "${lightblue}Swap:\t${default}${swaptotal}\t${swapused}\t${swapfree}${default}"
-	} | column -s $'\t' -t
-	echo -e ""
-	{
-		echo -e "${lightyellow}Storage${default}"
-		echo -e "${lightblue}Filesystem:\t${default}${filesystem}"
-		echo -e "${lightblue}Total:\t\t${default}${totalspace}"
-		echo -e "${lightblue}Used:\t\t${default}${usedspace}"
-		echo -e "${lightblue}Available:\t${default}${availspace}"
-	} | column -s $'\t' -t
-	echo -e ""
-	{
-		echo -e "${lightyellow}Network${default}"
-		if [ -n "${netint}" ]; then
-			echo -e "${lightblue}Interface:\t${default}${netint}"
-		fi
-		if [ -n "${netlink}" ]; then
-			echo -e "${lightblue}Link Speed:\t${default}${netlink}"
-		fi
-		echo -e "${lightblue}IP:\t${default}${ip}"
-		if [ "${ip}" != "${extip}" ]; then
-			echo -e "${lightblue}Internet IP:\t${default}${extip}"
-		fi
-	} | column -s $'\t' -t
-}
-
-fn_info_message_gameserver_resource() {
-	#
-	# Game Server Resource Usage
-	# =================================
-	# CPU Used:  1.1%
-	# Mem Used:  4.8%  189MB
-	#
-	# Storage
-	# Total:        241M
-	# Serverfiles:  240M
-	# Backups:      24K
-
-	echo -e ""
-	echo -e "${lightyellow}Game Server Resource Usage${default}"
-	fn_messages_separator
-	{
-		if [ "${status}" != "0" ] && [ -v status ]; then
-			if [ -n "${cpuused}" ]; then
-				echo -e "${lightblue}CPU Used:\t${default}${cpuused}%${default}"
-			else
-				echo -e "${lightblue}CPU Used:\t${red}unknown${default}"
-			fi
-			if [ -n "${memused}" ]; then
-				echo -e "${lightblue}Mem Used:\t${default}${pmemused}%\t${memused}MB${default}"
-			else
-				echo -e "${lightblue}Mem Used:\t${default}${pmemused}\t${red}unknown${default}"
-			fi
-		else
-			echo -e "${lightblue}CPU Used:\t${default}0%${default}"
-			echo -e "${lightblue}Mem Used:\t${default}0%\t0MB${default}"
-		fi
-	} | column -s $'\t' -t
-	echo -e ""
-	{
-		echo -e "${lightyellow}Storage${default}"
-		echo -e "${lightblue}Total:\t${default}${rootdirdu}"
-		echo -e "${lightblue}Serverfiles:\t${default}${serverfilesdu}"
-		if [ -d "${backupdir}" ]; then
-			echo -e "${lightblue}Backups:\t${default}${backupdirdu}"
-		fi
-	} | column -s $'\t' -t
-}
-
-fn_info_message_gameserver() {
-	#
-	# Counter-Strike: Global Offensive Server Details
-	# =================================
-	# Server name:      LinuxGSM
-	# Server IP:        0.0.0.0:27015
-	# Internet IP:      176.48.124.96:34197
-	# Server password:  NOT SET
-	# RCON password:    adminF54CC0VR
-	# Players:          0/16
-	# Current map:      de_mirage
-	# Default map:      de_mirage
-	# Game type:        0
-	# Game mode:        0
-	# Tick rate:        64
-	# Master Server:    listed
-	# Status:           STARTED
-
-	echo -e ""
-	echo -e "${lightgreen}${gamename} Server Details${default}"
-	fn_info_message_password_strip
-	fn_messages_separator
-	{
-		# Server name
-		if [ -n "${gdname}" ]; then
-			echo -e "${lightblue}Server name:\t${default}${gdname}"
-		elif [ -n "${servername}" ]; then
-			echo -e "${lightblue}Server name:\t${default}${servername}"
-		fi
-
-		# Server description
-		if [ -n "${serverdescription}" ]; then
-			echo -e "${lightblue}Server Description:\t${default}${serverdescription}"
-		fi
-
-		# Appid
-		if [ -n "${appid}" ]; then
-			echo -e "${lightblue}App ID:\t${default}${appid}"
-		fi
-
-		# Branch
-		if [ -n "${branch}" ]; then
-			echo -e "${lightblue}Branch:\t${default}${branch}"
-		fi
-
-		# Beta Password
-		if [ -n "${betapassword}" ]; then
-			echo -e "${lightblue}Beta Password:\t${default}${betapassword}"
-		fi
-
-		# Server Version
-		if [ -n "${gdversion}" ]; then
-			echo -e "${lightblue}Server Version:\t${default}${gdversion}"
-		fi
-
-		# Server ip
-		echo -e "${lightblue}Server IP:\t${default}${ip}:${port}"
-
-		# Internet ip
-		if [ -n "${extip}" ]; then
-			if [ "${ip}" != "${extip}" ]; then
-				echo -e "${lightblue}Internet IP:\t${default}${extip}:${port}"
-			fi
-		fi
-
-		# Display ip
-		if [ -n "${displayip}" ]; then
-			echo -e "${lightblue}Display IP:\t${default}${displayip}:${port}"
-		fi
-
-		# Server password
-		if [ -n "${serverpassword}" ]; then
-			echo -e "${lightblue}Server password:\t${default}${serverpassword}"
-		fi
-
-		# Query enabled (Starbound)
-		if [ -n "${queryenabled}" ]; then
-			echo -e "${lightblue}Query enabled:\t${default}${queryenabled}"
-		fi
-
-		# RCON enabled (Starbound)
-		if [ -n "${rconenabled}" ]; then
-			echo -e "${lightblue}RCON enabled:\t${default}${rconenabled}"
-		fi
-
-		# RCON password
-		if [ -n "${rconpassword}" ]; then
-			echo -e "${lightblue}RCON password:\t${default}${rconpassword}"
-		fi
-
-		# RCON web (Rust)
-		if [ -n "${rconweb}" ]; then
-			echo -e "${lightblue}RCON web:\t${default}${rconweb}"
-		fi
-
-		# Admin password
-		if [ -n "${adminpassword}" ]; then
-			echo -e "${lightblue}Admin password:\t${default}${adminpassword}"
-		fi
-
-		# Stats password (Quake Live)
-		if [ -n "${statspassword}" ]; then
-			echo -e "${lightblue}Stats password:\t${default}${statspassword}"
-		fi
-
-		# Players
-		if [ "${querystatus}" != "0" ]; then
-			if [ -n "${maxplayers}" ]; then
-				echo -e "${lightblue}Maxplayers:\t${default}${maxplayers}"
-			fi
-		else
-			if [ -n "${gdplayers}" ] && [ -n "${gdmaxplayers}" ]; then
-				echo -e "${lightblue}Players:\t${default}${gdplayers}/${gdmaxplayers}"
-			elif [ -n "${gdplayers}" ] && [ -n "${maxplayers}" ]; then
-				echo -e "${lightblue}Players:\t${default}${gdplayers}/${maxplayers}"
-			elif [ -z "${gdplayers}" ] && [ -n "${gdmaxplayers}" ]; then
-				echo -e "${lightblue}Players:\t${default}0/${gdmaxplayers}"
-			elif [ -n "${gdplayers}" ] && [ -z "${gdmaxplayers}" ]; then
-				echo -e "${lightblue}Players:\t${default}${gdplayers}/∞"
-			elif [ -z "${gdplayers}" ] && [ -z "${gdmaxplayers}" ] && [ -n "${maxplayers}" ]; then
-				echo -e "${lightblue}Maxplayers:\t${default}${maxplayers}"
-			fi
-		fi
-
-		# Reverved Slots
-		if [ -n "${statspassword}" ]; then
-			echo -e "${lightblue}Reserved Slots:\t${default}${reservedslots}"
-		fi
-
-		# Bots
-		if [ -n "${gdbots}" ]; then
-			echo -e "${lightblue}Bots:\t${default}${gdbots}"
-		fi
-
-		# Current map
-		if [ -n "${gdmap}" ]; then
-			echo -e "${lightblue}Current map:\t${default}${gdmap}"
-		fi
-
-		# Default map
-		if [ -n "${defaultmap}" ]; then
-			echo -e "${lightblue}Default map:\t${default}${defaultmap}"
-		fi
-
-		if [ -n "${defaultscenario}" ]; then
-			# Current scenario (Insurgency: Sandstorm)
-			if [ -n "${gdgamemode}" ]; then
-				echo -e "${lightblue}Current scenario:\t${default}${gdgamemode}"
-			fi
-		else
-			# Current game mode
-			if [ -n "${gdgamemode}" ]; then
-				echo -e "${lightblue}Current game mode:\t${default}${gdgamemode}"
-			fi
-		fi
-
-		# Default scenario
-		if [ -n "${defaultscenario}" ]; then
-			echo -e "${lightblue}Default scenario:\t${default}${defaultscenario}"
-		fi
-
-		# Game type
-		if [ -n "${gametype}" ]; then
-			echo -e "${lightblue}Game type:\t${default}${gametype}"
-		fi
-
-		# Game mode
-		if [ -n "${gamemode}" ]; then
-			echo -e "${lightblue}Game mode:\t${default}${gamemode}"
-		fi
-
-		# Game world
-		if [ -n "${gameworld}" ]; then
-			echo -e "${lightblue}Game world:\t${default}${gameworld}"
-		fi
-
-		# Tick rate
-		if [ -n "${tickrate}" ]; then
-			echo -e "${lightblue}Tick rate:\t${default}${tickrate}"
-		fi
-
-		# Sharding (Don't Starve Together)
-		if [ -n "${sharding}" ]; then
-			echo -e "${lightblue}Sharding:\t${default}${sharding}"
-		fi
-
-		# Master (Don't Starve Together)
-		if [ -n "${master}" ]; then
-			echo -e "${lightblue}Master:\t${default}${master}"
-		fi
-
-		# Shard (Don't Starve Together)
-		if [ -n "${shard}" ]; then
-			echo -e "${lightblue}Shard:\t${default}${shard}"
-		fi
-
-		# Cluster (Don't Starve Together)
-		if [ -n "${cluster}" ]; then
-			echo -e "${lightblue}Cluster:\t${default}${cluster}"
-		fi
-
-		# Cave (Don't Starve Together)
-		if [ -n "${cave}" ]; then
-			echo -e "${lightblue}Cave:\t${default}${cave}"
-		fi
-
-		# Creativemode (Hurtworld)
-		if [ -n "${creativemode}" ]; then
-			echo -e "${lightblue}Creativemode:\t${default}${creativemode}"
-		fi
-
-		# TeamSpeak dbplugin
-		if [ -n "${dbplugin}" ]; then
-			echo -e "${lightblue}dbplugin:\t${default}${dbplugin}"
-		fi
-
-		# ASE (Multi Theft Auto)
-		if [ -n "${ase}" ]; then
-			echo -e "${lightblue}ASE:\t${default}${ase}"
-		fi
-
-		# Save interval (Rust)
-		if [ -n "${saveinterval}" ]; then
-			echo -e "${lightblue}Save interval:\t${default}${saveinterval}s"
-		fi
-
-		# Seed (Rust)
-		if [ -n "${seed}" ]; then
-			echo -e "${lightblue}Seed:\t${default}${seed}"
-		fi
-
-		# Salt (Rust)
-		if [ -n "${salt}" ]; then
-			echo -e "${lightblue}Salt:\t${default}${salt}"
-		fi
-
-		# World Size (Rust)
-		if [ -n "${worldsize}" ]; then
-			echo -e "${lightblue}World size:\t${default}${worldsize}m"
-		fi
-
-		# Random map rotation mode (Squad and Post Scriptum)
-		if [ -n "${randommap}" ]; then
-			echo -e "${lightblue}Map rotation:\t${default}${randommap}"
-		fi
-
-		# Server Version (Jedi Knight II: Jedi Outcast)
-		if [ -n "${serverversion}" ]; then
-			echo -e "${lightblue}Server Version:\t${default}${serverversion}"
-		fi
-
-		# authentication token (Factorio)
-		if [ -n "${authtoken}" ]; then
-			echo -e "${lightblue}Auth Token:\t${default}${authtoken}"
-		fi
-
-		# savegameinterval (Factorio)
-		if [ -n "${savegameinterval}" ]; then
-			echo -e "${lightblue}Savegame Interval:\t${default}${savegameinterval}"
-		fi
-
-		# versioncount (Factorio)
-		if [ -n "${versioncount}" ]; then
-			echo -e "${lightblue}Version Count:\t${default}${versioncount}"
-		fi
-
-		# Listed on Master server
-		if [ -n "${displaymasterserver}" ]; then
-			if [ "${displaymasterserver}" == "true" ]; then
-				echo -e "${lightblue}Master server:\t${green}listed${default}"
-			else
-				echo -e "${lightblue}Master server:\t${red}not listed${default}"
-			fi
-		fi
-
-		# Game server status
-		if [ "${status}" == "0" ]; then
-			echo -e "${lightblue}Status:\t${red}STOPPED${default}"
-		else
-			echo -e "${lightblue}Status:\t${green}STARTED${default}"
-		fi
-	} | column -s $'\t' -t
-	echo -e ""
-}
-
-fn_info_message_script() {
-	# csgoserver Script Details
-	# =================================
-	# Script name:            csgoserver
-	# LinuxGSM version:       v21.1.3
-	# glibc required:         2.18
-	# Discord alert:          off
-	# Email alert:            off
-	# Gotify alert:           off
-	# IFTTT alert:            off
-	# Mailgun (email) alert:  off
-	# Pushbullet alert:       off
-	# Pushover alert:         off
-	# Rocketchat alert:       off
-	# Slack alert:            off
-	# Telegram alert:         off
-	# Update on start:        off
-	# User:                   lgsm
-	# Location:               /home/lgsm/csgoserver
-	# Config file:            /home/lgsm/csgoserver/serverfiles/csgo/cfg/csgoserver.cfg
-
-	echo -e "${lightgreen}${selfname} Script Details${default}"
-	fn_messages_separator
-	{
-		# Script name
-		echo -e "${lightblue}Script name:\t${default}${selfname}"
-
-		# LinuxGSM version
-		if [ -n "${version}" ]; then
-			echo -e "${lightblue}LinuxGSM version:\t${default}${version}"
-		fi
-
-		# glibc required
-		if [ -n "${glibc}" ]; then
-			if [ "${glibc}" == "null" ]; then
-				# Glibc is not required.
-				:
-			elif [ -z "${glibc}" ]; then
-				echo -e "${lightblue}glibc required:\t${red}UNKNOWN${default}"
-			elif [ "$(printf '%s\n'${glibc}'\n' ${glibcversion} | sort -V | head -n 1)" != "${glibc}" ]; then
-				echo -e "${lightblue}glibc required:\t${red}${glibc} ${default}(${red}distro glibc ${glibcversion} too old${default})"
-			else
-				echo -e "${lightblue}glibc required:\t${green}${glibc}${default}"
-			fi
-		fi
-
-		# Discord alert
-		echo -e "${lightblue}Discord alert:\t${default}${discordalert}"
-		# Email alert
-		echo -e "${lightblue}Email alert:\t${default}${emailalert}"
-		# Gotify alert
-		echo -e "${lightblue}Gotify alert:\t${default}${gotifyalert}"
-		# IFTTT alert
-		echo -e "${lightblue}IFTTT alert:\t${default}${iftttalert}"
-		# Mailgun alert
-		echo -e "${lightblue}Mailgun (email) alert:\t${default}${mailgunalert}"
-		# Pushbullet alert
-		echo -e "${lightblue}Pushbullet alert:\t${default}${pushbulletalert}"
-		# Pushover alert
-		echo -e "${lightblue}Pushover alert:\t${default}${pushoveralert}"
-		# Rocketchat alert
-		echo -e "${lightblue}Rocketchat alert:\t${default}${rocketchatalert}"
-		# Slack alert
-		echo -e "${lightblue}Slack alert:\t${default}${slackalert}"
-		# Telegram alert
-		echo -e "${lightblue}Telegram alert:\t${default}${telegramalert}"
-
-		# Update on start
-		if [ -n "${updateonstart}" ]; then
-			echo -e "${lightblue}Update on start:\t${default}${updateonstart}"
-		fi
-
-		# User
-		echo -e "${lightblue}User:\t${default}$(whoami)"
-
-		# Script location
-		echo -e "${lightblue}Location:\t${default}${rootdir}"
-
-		# Config file location
-		if [ -n "${servercfgfullpath}" ]; then
-			if [ -f "${servercfgfullpath}" ]; then
-				echo -e "${lightblue}Config file:\t${default}${servercfgfullpath}"
-			elif [ -d "${servercfgfullpath}" ]; then
-				echo -e "${lightblue}Config dir:\t${default}${servercfgfullpath}"
-			else
-				echo -e "${lightblue}Config file:\t${default}${red}${servercfgfullpath}${default} (${red}FILE MISSING${default})"
-			fi
-		fi
-
-		# Network config file location (ARMA 3)
-		if [ -n "${networkcfgfullpath}" ]; then
-			echo -e "${lightblue}Network config file:\t${default}${networkcfgfullpath}"
-		fi
-	} | column -s $'\t' -t
-}
-
-fn_info_message_backup() {
-	#
-	# Backups
-	# =================================
-	# No. of backups:    1
-	# Latest backup:
-	#     date:          Fri May  6 18:34:19 UTC 2016
-	#     file:          /home/lgsm/qlserver/backups/ql-server-2016-05-06-183239.tar.gz
-	#     size:          945M
-
-	echo -e ""
-	echo -e "${lightgreen}Backups${default}"
-	fn_messages_separator
-	if [ ! -d "${backupdir}" ] || [ "${backupcount}" == "0" ]; then
-		echo -e "No Backups created"
-	else
-		{
-			echo -e "${lightblue}No. of backups:\t${default}${backupcount}"
-			echo -e "${lightblue}Latest backup:${default}"
-			if [ "${lastbackupdaysago}" == "0" ]; then
-				echo -e "${lightblue}    date:\t${default}${lastbackupdate} (less than 1 day ago)"
-			elif [ "${lastbackupdaysago}" == "1" ]; then
-				echo -e "${lightblue}    date:\t${default}${lastbackupdate} (1 day ago)"
-			else
-				echo -e "${lightblue}    date:\t${default}${lastbackupdate} (${lastbackupdaysago} days ago)"
-			fi
-			echo -e "${lightblue}    file:\t${default}${lastbackup}"
-			echo -e "${lightblue}    size:\t${default}${lastbackupsize}"
-		} | column -s $'\t' -t
-	fi
-}
-
-fn_info_message_commandlineparms() {
-	#
-	# Command-line Parameters
-	# =================================
-	# ./run_server_x86.sh +set net_strict 1
-
-	echo -e ""
-	echo -e "${lightgreen}Command-line Parameters${default}"
-	fn_info_message_password_strip
-	fn_messages_separator
-	if [ "${serverpassword}" == "NOT SET" ]; then
-		unset serverpassword
-	fi
-	fn_reload_startparameters
-	echo -e "${preexecutable} ${executable} ${startparameters}"
-}
-
-fn_info_message_ports_edit() {
-	#
-	# Ports
-	# =================================
-	# Change ports by editing the parameters in:
-	# /home/lgsm/qlserver/serverfiles/baseq3/ql-server.cfg
-	echo -e ""
-	echo -e "${lightgreen}Ports${default}"
-	fn_messages_separator
-	echo -e "${lightblue}Change ports by editing the parameters in:${default}"
-
-	startparameterslocation="${red}UNKNOWN${default}"
-	# engines/games that require editing in the config file.
-	local ports_edit_array=("ac" "arma3" "armar" "bo" "bt" "cd" "dst" "eco" "idtech2" "idtech3" "idtech3_ql" "jc2" "jc3" "lwjgl2" "mcb" "nec" "pc" "pc2" "prism3d" "pz" "qw" "refractor" "renderware" "rw" "sb" "sdtd" "st" "stn" "ts3" "tw" "terraria" "unreal" "unreal2" "unreal3" "vints" "wurm")
-	for port_edit in "${ports_edit_array[@]}"; do
-		if [ "${shortname}" == "ut3" ]; then
-			startparameterslocation="${servercfgdir}/UTWeb.ini"
-		elif [ "${shortname}" == "kf2" ]; then
-			startparameterslocation="${servercfgdir}/LinuxServer-KFEngine.ini\n${servercfgdir}/KFWeb.ini"
-		elif [ "${engine}" == "${port_edit}" ] || [ "${gamename}" == "${port_edit}" ] || [ "${shortname}" == "${port_edit}" ]; then
-			startparameterslocation="${servercfgfullpath}"
-		fi
-	done
-	# engines/games that require editing the start parameters.
-	local ports_edit_array=("av" "ck" "col" "fctr" "goldsrc" "hw" "iw3.0" "ioquake3" "qfusion" "rust" "scpsl" "scpslsm" "sol" "spark" "source" "unreal4" "arma3" "dayz" "unt" "vh")
-	for port_edit in "${ports_edit_array[@]}"; do
-		if [ "${engine}" == "${port_edit}" ] || [ "${gamename}" == "${port_edit}" ] || [ "${shortname}" == "${port_edit}" ]; then
-			startparameterslocation="${configdirserver}"
-		fi
-	done
-	echo -e "${startparameterslocation}"
-	echo -e ""
-}
-
-fn_info_message_ports() {
-	echo -e "${lightblue}Useful port diagnostic command:${default}"
-	if [ "${shortname}" == "armar" ]; then
-		echo -e "ss -tuplwn | grep enfMain"
-	elif [ "${shortname}" == "av" ]; then
-		echo -e "ss -tuplwn | grep AvorionServer"
-	elif [ "${shortname}" == "bf1942" ]; then
-		echo -e "ss -tuplwn | grep bf1942_lnxded"
-	elif [ "${shortname}" == "mc" ] || [ "${shortname}" == "nec" ] || [ "${shortname}" == "pmc" ] || [ "${shortname}" == "rw" ] || [ "${shortname}" == "vpmc" ] || [ "${shortname}" == "wmc" ]; then
-		echo -e "ss -tuplwn | grep java"
-	elif [ "${shortname}" == "terraria" ]; then
-		echo -e "ss -tuplwn | grep Main"
-	elif [ "${engine}" == "source" ]; then
-		echo -e "ss -tuplwn | grep srcds_linux"
-	elif [ "${engine}" == "goldsrc" ]; then
-		echo -e "ss -tuplwn | grep hlds_linux"
-	else
-		executableshort="$(basename "${executable}" | cut -c -15)"
-		echo -e "ss -tuplwn | grep ${executableshort}"
-	fi
-	echo -e ""
-}
-
-fn_info_message_statusbottom() {
-	echo -e ""
-	if [ "${status}" == "0" ]; then
-		echo -e "${lightblue}Status:\t${red}STOPPED${default}"
-	else
-		echo -e "${lightblue}Status:\t${green}STARTED${default}"
-	fi
-	echo -e ""
-}
-
-fn_info_logs() {
-	echo -e ""
-	echo -e "${selfname} Logs"
-	echo -e "================================="
-
-	if [ -n "${lgsmlog}" ]; then
-		echo -e "\nScript log\n==================="
-		if [ ! "$(ls -A "${lgsmlogdir}")" ]; then
-			echo -e "${lgsmlogdir} (NO LOG FILES)"
-		elif [ ! -s "${lgsmlog}" ]; then
-			echo -e "${lgsmlog} (LOG FILE IS EMPTY)"
-		else
-			echo -e "${lgsmlog}"
-			tail -25 "${lgsmlog}"
-		fi
-		echo -e ""
-	fi
-
-	if [ -n "${consolelog}" ]; then
-		echo -e "\nConsole log\n===================="
-		if [ ! "$(ls -A "${consolelogdir}")" ]; then
-			echo -e "${consolelogdir} (NO LOG FILES)"
-		elif [ ! -s "${consolelog}" ]; then
-			echo -e "${consolelog} (LOG FILE IS EMPTY)"
-		else
-			echo -e "${consolelog}"
-			tail -25 "${consolelog}" | awk '{ sub("\r$", ""); print }'
-		fi
-		echo -e ""
-	fi
-
-	if [ -n "${gamelogdir}" ]; then
-		echo -e "\nServer log\n==================="
-		if [ ! "$(ls -A "${gamelogdir}")" ]; then
-			echo -e "${gamelogdir} (NO LOG FILES)"
-		else
-			echo -e "${gamelogdir}"
-			# dos2unix sed 's/\r//'
-			tail "${gamelogdir}"/* 2> /dev/null | grep -v "==>" | sed '/^$/d' | sed 's/\r//' | tail -25
-		fi
-		echo -e ""
-	fi
-}
-
-# Engine/Game Specific details
-
-# Function used to generate port info. by passing info to function. (Reduces repeating code)
-# example output
-# DESCRIPTION     PORT   PROTOCOL  LISTEN
-# Game            7777   udp       1
-# RAW UDP Socket  7778   udp       1
-# Query           27015  udp       1
-# RCON            27020  tcp       1
-
-fn_port() {
-	if [ "${1}" == "header" ]; then
-		echo -e "${lightblue}DESCRIPTION\tPORT\tPROTOCOL\tLISTEN${default}"
-	else
-		portname="${1}"
-		porttype="${2}"
-		portprotocol="${3}"
-		echo -e "${portname}\t${!porttype}\t${portprotocol}\t$(echo "${ssinfo}" | grep "${portprotocol}" | grep -c "${!porttype}")"
-	fi
-}
-
-fn_info_message_ac() {
-	{
-		fn_port "header"
-		fn_port "Game" port udp
-		fn_port "Game" port tcp
-		fn_port "Query" queryport udp
-		fn_port "HTTP" httpport tcp
-	} | column -s $'\t' -t
-}
-
-fn_info_message_ark() {
-	{
-		fn_port "header"
-		fn_port "Game" port udp
-		fn_port "RAW UDP Socket" rawport udp
-		fn_port "Query" queryport udp
-		fn_port "RCON" rconport tcp
-	} | column -s $'\t' -t
-}
-
-fn_info_message_arma3() {
-	{
-		fn_port "header"
-		fn_port "Game" port udp
-		fn_port "Voice" voiceport udp
-		fn_port "Query" queryport udp
-		fn_port "Steam Master" steammasterport udp
-		fn_port "Voice (unused)" voiceunusedport udp
-		fn_port "BattleEye" battleeyeport udp
-	} | column -s $'\t' -t
-}
-
-fn_info_message_armar() {
-	{
-		fn_port "header"
-		fn_port "Game" port udp
-		fn_port "Steam Query" queryport udp
-		fn_port "BattleEye" battleeyeport tcp
-	} | column -s $'\t' -t
-}
-
-fn_info_message_av() {
-	{
-		fn_port "header"
-		fn_port "Game" port udp
-		fn_port "Query" queryport udp
-		fn_port "Steam Master" steammasterport udp
-		fn_port "Steam Query" steamqueryport udp
-		fn_port "RCON" rconport tcp
-	} | column -s $'\t' -t
-}
-
-fn_info_message_bf1942() {
-	{
-		fn_port "header"
-		fn_port "Game" port udp
-		fn_port "Query" queryport udp
-	} | column -s $'\t' -t
-}
-
-fn_info_message_bfv() {
-	{
-		fn_port "header"
-		fn_port "Game" port udp
-		fn_port "Query" queryport udp
-	} | column -s $'\t' -t
-}
-
-fn_info_message_bo() {
-	{
-		fn_port "header"
-		fn_port "Game" port udp
-		fn_port "Query" queryport udp
-	} | column -s $'\t' -t
-}
-
-fn_info_message_bt() {
-	{
-		fn_port "header"
-		fn_port "Game" port udp
-		fn_port "Query" queryport udp
-	} | column -s $'\t' -t
-}
-
-fn_info_message_btl() {
-	{
-		fn_port "header"
-		fn_port "Game" port udp
-		fn_port "Query" queryport udp
-		fn_port "RCON" rconport tcp
-	} | column -s $'\t' -t
-}
-
-fn_info_messages_cd() {
-	{
-		fn_port "header"
-		fn_port "Game" port udp
-		fn_port "Steam" steamport udp
-		fn_port "RCON" rconport tcp
-	} | column -s $'\t' -t
-}
-
-fn_info_messages_ck() {
-	{
-		fn_port "header"
-		fn_port "Game" port udp
-		fn_port "Query" queryport udp
-	} | column -s $'\t' -t
-}
-
-fn_info_message_cmw() {
-	fn_info_message_password_strip
-	{
-		fn_port "header"
-		fn_port "Game" port udp
-		fn_port "Query" queryport udp
-		fn_port "RCON" rconport tcp
-	} | column -s $'\t' -t
-}
-
-fn_info_message_cod() {
-	{
-		fn_port "header"
-		fn_port "Game" port udp
-		fn_port "Query" queryport udp
-	} | column -s $'\t' -t
-}
-
-fn_info_message_coduo() {
-	{
-		fn_port "header"
-		fn_port "Game" port udp
-		fn_port "Query" queryport udp
-	} | column -s $'\t' -t
-}
-
-fn_info_message_cod2() {
-	{
-		fn_port "header"
-		fn_port "Game" port udp
-		fn_port "Query" queryport udp
-	} | column -s $'\t' -t
-}
-
-fn_info_message_cod4() {
-	{
-		fn_port "header"
-		fn_port "Game" port udp
-		fn_port "Query" queryport udp
-	} | column -s $'\t' -t
-}
-
-fn_info_message_codwaw() {
-	{
-		fn_port "header"
-		fn_port "Game" port udp
-		fn_port "Query" queryport udp
-	} | column -s $'\t' -t
-}
-
-fn_info_message_col() {
-	{
-		fn_port "header"
-		fn_port "Game" port udp
-		fn_port "Query" queryport tcp
-		fn_port "Steam" steamport tcp
-	} | column -s $'\t' -t
-}
-
-fn_info_message_csgo() {
-	{
-		fn_port "header"
-		fn_port "Game" port udp
-		fn_port "Query" queryport tcp
-		fn_port "RCON" rconport tcp
-		fn_port "SourceTV" sourcetvport udp
-		fn_port "Client" clientport udp
-	} | column -s $'\t' -t
-}
-
-fn_info_message_dayz() {
-	{
-		fn_port "header"
-		fn_port "Game" port udp
-		fn_port "Query Steam" queryport udp
-		fn_port "Steam Master" steammasterport udp
-		fn_port "BattleEye" battleeyeport udp
-	} | column -s $'\t' -t
-}
-
-fn_info_message_dodr() {
-	{
-		fn_port "header"
-		fn_port "Game" port udp
-		fn_port "Query" queryport udp
-	} | column -s $'\t' -t
-}
-
-fn_info_message_dst() {
-	{
-		fn_port "header"
-		fn_port "Game: Server" port udp
-		fn_port "Game: Master" masterport udp
-		fn_port "Steam: Auth" steamauthport udp
-		fn_port "Steam: Master" steammasterport udp
-	} | column -s $'\t' -t
-}
-
-fn_info_message_eco() {
-	{
-		fn_port "header"
-		fn_port "Game" port udp
-		fn_port "Web Admin" webadminport tcp
-	} | column -s $'\t' -t
-}
-
-fn_info_message_etl() {
-	{
-		fn_port "header"
-		fn_port "Game" port udp
-		fn_port "Query" queryport udp
-	} | column -s $'\t' -t
-}
-
-fn_info_message_fctr() {
-	{
-		fn_port "header"
-		fn_port "Game" port udp
-		fn_port "RCON" rconport tcp
-	} | column -s $'\t' -t
-}
-
-fn_info_message_goldsrc() {
-	{
-		fn_port "header"
-		fn_port "Game" port udp
-		fn_port "Client" clientport udp
-	} | column -s $'\t' -t
-}
-
-fn_info_message_hw() {
-	{
-		fn_port "header"
-		fn_port "Game" port udp
-		fn_port "Query" queryport udp
-	} | column -s $'\t' -t
-}
-
-fn_info_message_ins() {
-	{
-		fn_port "header"
-		fn_port "Game" port udp
-		fn_port "Query" queryport tcp
-		fn_port "RCON" rconport tcp
-		fn_port "SourceTV" sourcetvport udp
-		fn_port "Client" clientport udp
-	} | column -s $'\t' -t
-}
-
-fn_info_message_inss() {
-	{
-		fn_port "header"
-		fn_port "Game" port udp
-		fn_port "Query" queryport udp
-		fn_port "RCON" rconport tcp
-	} | column -s $'\t' -t
-}
-
-fn_info_message_jc2() {
-	{
-		fn_port "header"
-		fn_port "Game" port udp
-		fn_port "Query" queryport udp
-	} | column -s $'\t' -t
-}
-
-fn_info_message_jc3() {
-	{
-		fn_port "header"
-		fn_port "Game" port udp
-		fn_port "Query" queryport udp
-		fn_port "Steam" steamport udp
-		fn_port "HTTP" httpport tcp
-	} | column -s $'\t' -t
-}
-
-fn_info_message_jk2() {
-	{
-		fn_port "header"
-		fn_port "Game" port udp
-	} | column -s $'\t' -t
-}
-
-fn_info_message_kf() {
-	{
-		fn_port "header"
-		fn_port "Game" port udp
-		fn_port "Query" queryport udp
-		fn_port "Query (GameSpy)" queryportgs udp
-		fn_port "Web Admin" webadminport tcp
-		fn_port "LAN" lanport udp
-		fn_port "Steam" steamport udp
-		fn_port "Steam Master" steammasterport udp
-	} | column -s $'\t' -t
-	echo -e ""
-	echo -e "${lightgreen}${servername} Web Admin${default}"
-	fn_messages_separator
-	{
-		echo -e "${lightblue}Web Admin enabled:\t${default}${webadminenabled}"
-		echo -e "${lightblue}Web Admin url:\t${default}http://${webadminip}:${webadminport}"
-		echo -e "${lightblue}Web Admin username:\t${default}${webadminuser}"
-		echo -e "${lightblue}Web Admin password:\t${default}${webadminpass}"
-	} | column -s $'\t' -t
-}
-
-fn_info_message_kf2() {
-	fn_info_message_password_strip
-	{
-		fn_port "header"
-		fn_port "Game" port udp
-		fn_port "Query" queryport udp
-		fn_port "Web Admin" webadminport tcp
-	} | column -s $'\t' -t
-	echo -e ""
-	echo -e "${lightgreen}${servername} Web Admin${default}"
-	fn_messages_separator
-	{
-		echo -e "${lightblue}Web Admin enabled:\t${default}${webadminenabled}"
-		echo -e "${lightblue}Web Admin url:\t${default}http://${webadminip}:${webadminport}"
-		echo -e "${lightblue}Web Admin username:\t${default}${webadminuser}"
-		echo -e "${lightblue}Web Admin password:\t${default}${webadminpass}"
-	} | column -s $'\t' -t
-}
-
-fn_info_message_lo() {
-	{
-		fn_port "header"
-		fn_port "Game" port udp
-		fn_port "Query" queryport udp
-	} | column -s $'\t' -t
-}
-
-fn_info_message_mc() {
-	{
-		fn_port "header"
-		fn_port "Game" port tcp
-		fn_port "Query" queryport udp
-		fn_port "RCON" rconport tcp
-	} | column -s $'\t' -t
-}
-
-fn_info_message_mcb() {
-	{
-		fn_port "header"
-		fn_port "Game" port udp
-		fn_port "Game" portipv6 udp6
-	} | column -s $'\t' -t
-}
-
-fn_info_message_mh() {
-	{
-		fn_port "header"
-		fn_port "Game" port udp
-		fn_port "Query" queryport udp
-		fn_port "Beacon" beaconport udp
-	} | column -s $'\t' -t
-}
-
-fn_info_message_mohaa() {
-	{
-		fn_port "header"
-		fn_port "Game" port udp
-	} | column -s $'\t' -t
-}
-
-fn_info_message_mom() {
-	{
-		fn_port "header"
-		fn_port "Game" port udp
-		fn_port "Beacon" beaconport udp
-	} | column -s $'\t' -t
-}
-
-fn_info_message_mta() {
-	{
-		fn_port "header"
-		fn_port "Game" port udp
-		if [ "${ase}" == "Enabled" ]; then
-			fn_port "Query" queryport udp
-		fi
-		fn_port "HTTP" httpport tcp
-	} | column -s $'\t' -t
-}
-
-fn_info_message_nec() {
-	{
-		fn_port "header"
-		fn_port "Game" port udp
-	} | column -s $'\t' -t
-}
-
-fn_info_message_onset() {
-	{
-		fn_port "header"
-		fn_port "Game" port udp
-		fn_port "Query" queryport udp
-		fn_port "HTTP" httpport tcp
-	} | column -s $'\t' -t
-}
-
-fn_info_message_pc() {
-	{
-		fn_port "header"
-		fn_port "Game" port udp
-		fn_port "Query" queryport udp
-		fn_port "Steam" steamport udp
-	} | column -s $'\t' -t
-}
-
-fn_info_message_pc2() {
-	{
-		fn_port "header"
-		fn_port "Game" port udp
-		fn_port "Query" queryport udp
-		fn_port "Steam" steamport udp
-	} | column -s $'\t' -t
-}
-
-fn_info_message_pstbs() {
-	{
-		fn_port "header"
-		fn_port "Game" port udp
-		fn_port "Query" queryport udp
-		fn_port "RCON" rconport tcp
-	} | column -s $'\t' -t
-}
-
-fn_info_message_pvr() {
-	{
-		fn_port "header"
-		fn_port "Game" port udp
-		fn_port "Game" port tcp
-		fn_port "Game+400" port401 udp
-		fn_port "Query" queryport tcp
-	} | column -s $'\t' -t
-}
-
-fn_info_message_pz() {
-	{
-		fn_port "header"
-		fn_port "Game" port udp
-		fn_port "Query" queryport udp
-	} | column -s $'\t' -t
-}
-
-fn_info_message_qw() {
-	{
-		fn_port "header"
-		fn_port "Game" port udp
-	} | column -s $'\t' -t
-}
-
-fn_info_message_q2() {
-	{
-		fn_port "header"
-		fn_port "Game" port udp
-	} | column -s $'\t' -t
-}
-
-fn_info_message_q3() {
-	{
-		fn_port "header"
-		fn_port "Game" port udp
-	} | column -s $'\t' -t
-}
-
-fn_info_message_ql() {
-	{
-		fn_port "header"
-		fn_port "Game" port udp
-		fn_port "Query" queryport udp
-		fn_port "RCON" rconport tcp
-		fn_port "Stats" statsport udp
-	} | column -s $'\t' -t
-}
-
-fn_info_message_ro() {
-	{
-		fn_port "header"
-		fn_port "Game" port udp
-		fn_port "Query" queryport udp
-		fn_port "Web Admin" webadminport tcp
-		fn_port "LAN" lanport udp
-		fn_port "Steam" steamport udp
-		fn_port "Steam Master" steammasterport udp
-	} | column -s $'\t' -t
-	echo -e ""
-	echo -e "${lightgreen}${servername} Web Admin${default}"
-	fn_messages_separator
-	{
-		echo -e "${lightblue}Web Admin enabled:\t${default}${webadminenabled}"
-		echo -e "${lightblue}Web Admin url:\t${default}http://${webadminip}:${webadminport}"
-		echo -e "${lightblue}Web Admin username:\t${default}${webadminuser}"
-		echo -e "${lightblue}Web Admin password:\t${default}${webadminpass}"
-	} | column -s $'\t' -t
-}
-
-fn_info_message_rtcw() {
-	{
-		fn_port "header"
-		fn_port "Game" port udp
-	} | column -s $'\t' -t
-}
-
-fn_info_message_rust() {
-	{
-		fn_port "header"
-		fn_port "Game" port udp
-		fn_port "Query" queryport udp
-		fn_port "RCON" rconport tcp
-		fn_port "App" appport tcp
-	} | column -s $'\t' -t
-}
-
-fn_info_message_rw() {
-	{
-		fn_port "header"
-		fn_port "Game" port udp
-		fn_port "Game+1" port2 udp
-		fn_port "Game+2" port3 udp
-		fn_port "Game+3" port4 udp
-		fn_port "Game+1" port2 tcp
-		fn_port "Game+2" port3 tcp
-		fn_port "Game+3" port4 tcp
-		fn_port "Query" queryport tcp
-		fn_port "Query HTTP" httpqueryport tcp
-		fn_port "RCON" rconport tcp
-	} | column -s $'\t' -t
-}
-
-fn_info_message_samp() {
-	{
-		fn_port "header"
-		fn_port "Game" port udp
-		fn_port "RCON" rconport udp
-	} | column -s $'\t' -t
-}
-
-fn_info_message_sb() {
-	{
-		fn_port "header"
-		fn_port "Game" port udp
-		fn_port "Query" queryport tcp
-		fn_port "RCON" rconport tcp
-	} | column -s $'\t' -t
-}
-
-fn_info_message_sbots() {
-	{
-		fn_port "header"
-		fn_port "Game" port udp
-		fn_port "Query" queryport udp
-	} | column -s $'\t' -t
-}
-
-fn_info_message_scpsl() {
-	{
-		fn_port "header"
-		fn_port "Game" port tcp
-	} | column -s $'\t' -t
-}
-
-fn_info_message_sdtd() {
-	fn_info_message_password_strip
-	{
-		fn_port "header"
-		fn_port "Game" port udp
-		fn_port "Game+2" port3 udp
-		fn_port "Query" queryport tcp
-		fn_port "Web Admin" webadminport tcp
-		fn_port "Telnet" telnetport tcp
-	} | column -s $'\t' -t
-	echo -e ""
-	echo -e "${lightgreen}${gamename} Web Admin${default}"
-	fn_messages_separator
-	{
-		echo -e "${lightblue}Web Admin enabled:\t${default}${webadminenabled}"
-		echo -e "${lightblue}Web Admin url:\t${default}http://${webadminip}:${webadminport}/index.html"
-		echo -e "${lightblue}Web Admin username:\t${default}${webadminuser}"
-		echo -e "${lightblue}Web Admin password:\t${default}${webadminpass}"
-	} | column -s $'\t' -t
-	echo -e ""
-	echo -e "${lightgreen}${gamename} Telnet${default}"
-	fn_messages_separator
-	{
-		echo -e "${lightblue}Telnet enabled:\t${default}${telnetenabled}"
-		echo -e "${lightblue}Telnet address:\t${default}${telnetip} ${telnetport}"
-		echo -e "${lightblue}Telnet password:\t${default}${telnetpass}"
-	} | column -s $'\t' -t
-}
-
-fn_info_message_sf() {
-	{
-		fn_port "header"
-		fn_port "Game" port udp
-		fn_port "Query" queryport udp
-		fn_port "Beacon" beaconport udp
-	} | column -s $'\t' -t
-}
-
-fn_info_message_sof2() {
-	{
-		fn_port "header"
-		fn_port "Game" port udp
-		fn_port "Query" queryport udp
-	} | column -s $'\t' -t
-}
-
-fn_info_message_sol() {
-	{
-		fn_port "header"
-		fn_port "Game" port udp
-		fn_port "Query" queryport udp
-		fn_port "Files" filesport tcp
-	} | column -s $'\t' -t
-}
-
-fn_info_message_prism3d() {
-	{
-		fn_port "header"
-		fn_port "Game" port udp
-		fn_port "Query" queryport udp
-	} | column -s $'\t' -t
-}
-
-fn_info_message_source() {
-	{
-		fn_port "header"
-		fn_port "Game" port udp
-		fn_port "Query" queryport tcp
-		fn_port "RCON" rconport tcp
-		fn_port "SourceTV" sourcetvport udp
-		# Will not show if unaviable
-		if [ "${steamport}" == "0" ] || [ -v "${steamport}" ]; then
-			fn_port "Steam" steamport udp
-		fi
-		fn_port "Client" clientport udp
-	} | column -s $'\t' -t
-}
-
-fn_info_message_spark() {
-	fn_info_message_password_strip
-	{
-		fn_port "header"
-		fn_port "Game" port udp
-		fn_port "Query" queryport udp
-		fn_port "Web Admin" webadminport tcp
-	} | column -s $'\t' -t
-	echo -e ""
-	echo -e "${lightgreen}${gamename} Web Admin${default}"
-	fn_messages_separator
-	{
-		echo -e "${lightblue}Web Admin url:\t${default}http://${webadminip}:${webadminport}/index.html"
-		echo -e "${lightblue}Web Admin username:\t${default}${webadminuser}"
-		echo -e "${lightblue}Web Admin password:\t${default}${webadminpass}"
-	} | column -s $'\t' -t
-}
-
-fn_info_message_squad() {
-	{
-		fn_port "header"
-		fn_port "Game" port udp
-		fn_port "Query" queryport udp
-		fn_port "RCON" rconport tcp
-	} | column -s $'\t' -t
-}
-
-fn_info_message_st() {
-	{
-		fn_port "header"
-		fn_port "Game" port udp
-		fn_port "Query" queryport udp
-		fn_port "Web Admin" webadminport tcp
-	} | column -s $'\t' -t
-	echo -e ""
-	echo -e "${lightgreen}${gamename} Web Admin${default}"
-	fn_messages_separator
-	{
-		echo -e "${lightblue}Web Admin url:\t${default}http://${webadminip}:${webadminport}"
-	} | column -s $'\t' -t
-}
-
-fn_info_message_ti() {
-	{
-		fn_port "header"
-		fn_port "Game" port udp
-		fn_port "Query" queryport udp
-	} | column -s $'\t' -t
-}
-
-fn_info_message_ts3() {
-	{
-		fn_port "header"
-		fn_port "Voice" port udp
-		fn_port "Query" queryport tcp
-		fn_port "Query (SSH)" querysshport tcp
-		fn_port "Query (http)" queryhttpport tcp
-		fn_port "Query (https)" queryhttpsport tcp
-		fn_port "File Transfer" fileport tcp
-		fn_port "Telnet" telnetport tcp
-	} | column -s $'\t' -t
-}
-
-fn_info_message_tw() {
-	{
-		fn_port "header"
-		fn_port "Game" port udp
-		fn_port "Query" queryport udp
-	} | column -s $'\t' -t
-}
-
-fn_info_message_terraria() {
-	{
-		fn_port "header"
-		fn_port "Game" port tcp
-		fn_port "Query" queryport tcp
-	} | column -s $'\t' -t
-}
-
-fn_info_message_tu() {
-	{
-		fn_port "header"
-		fn_port "Game" port udp
-		fn_port "Query" queryport udp
-		fn_port "Steam" steamport udp
-	} | column -s $'\t' -t
-}
-
-fn_info_message_unreal() {
-	fn_info_message_password_strip
-	{
-		fn_port "header"
-		fn_port "Game" port udp
-		fn_port "Query" queryport udp
-		fn_port "LAN Beacon" beaconport udp
-		fn_port "Web Admin" webadminport tcp
-	} | column -s $'\t' -t
-	echo -e ""
-	echo -e "${lightgreen}${servername} Web Admin${default}"
-	fn_messages_separator
-	{
-		echo -e "${lightblue}Web Admin enabled:\t${default}${webadminenabled}"
-		echo -e "${lightblue}Web Admin url:\t${default}http://${webadminip}:${webadminport}"
-		echo -e "${lightblue}Web Admin username:\t${default}${webadminuser}"
-		echo -e "${lightblue}Web Admin password:\t${default}${webadminpass}"
-	} | column -s $'\t' -t
-}
-
-fn_info_message_ut2k4() {
-	{
-		fn_port "header"
-		fn_port "Game" port udp
-		fn_port "Query" queryport udp
-		fn_port "Query (GameSpy)" queryportgs udp
-		fn_port "Web Admin" webadminport tcp
-		fn_port "LAN" lanport udp
-	} | column -s $'\t' -t
-	echo -e ""
-	echo -e "${lightgreen}${servername} Web Admin${default}"
-	fn_messages_separator
-	{
-		echo -e "${lightblue}Web Admin enabled:\t${default}${webadminenabled}"
-		echo -e "${lightblue}Web Admin url:\t${default}http://${webadminip}:${webadminport}"
-		echo -e "${lightblue}Web Admin username:\t${default}${webadminuser}"
-		echo -e "${lightblue}Web Admin password:\t${default}${webadminpass}"
-	} | column -s $'\t' -t
-}
-
-fn_info_message_unreal() {
-	fn_info_message_password_strip
-	{
-		fn_port "header"
-		fn_port "Game" port udp
-		fn_port "Query" queryport udp
-		fn_port "LAN Beacon" beaconport udp
-		fn_port "Web Admin" webadminport tcp
-	} | column -s $'\t' -t
-	echo -e ""
-	echo -e "${lightgreen}${servername} Web Admin${default}"
-	fn_messages_separator
-	{
-		echo -e "${lightblue}Web Admin enabled:\t${default}${webadminenabled}"
-		echo -e "${lightblue}Web Admin url:\t${default}http://${webadminip}:${webadminport}"
-		echo -e "${lightblue}Web Admin username:\t${default}${webadminuser}"
-		echo -e "${lightblue}Web Admin password:\t${default}${webadminpass}"
-	} | column -s $'\t' -t
-}
-
-fn_info_message_unt() {
-	{
-		fn_port "header"
-		fn_port "Game" port udp
-		fn_port "Query" queryport udp
-		fn_port "Steam" steamport udp
-	} | column -s $'\t' -t
-}
-
-fn_info_message_ut() {
-	{
-		fn_port "header"
-		fn_port "Game" port udp
-		fn_port "Query" queryport udp
-	} | column -s $'\t' -t
-}
-
-fn_info_message_ut3() {
-	fn_info_message_password_strip
-	{
-		fn_port "header"
-		fn_port "Game" port udp
-		fn_port "Query" queryport udp
-		fn_port "Web Admin" webadminport tcp
-	} | column -s $'\t' -t
-	echo -e ""
-	echo -e "${lightgreen}${servername} Web Admin${default}"
-	fn_messages_separator
-	{
-		echo -e "${lightblue}Web Admin enabled:\t${default}${webadminenabled}"
-		echo -e "${lightblue}Web Admin url:\t${default}http://${webadminip}:${webadminport}"
-		echo -e "${lightblue}Web Admin username:\t${default}${webadminuser}"
-		echo -e "${lightblue}Web Admin password:\t${default}${webadminpass}"
-	} | column -s $'\t' -t
-}
-
-fn_info_message_vh() {
-	{
-		fn_port "header"
-		fn_port "Game" port udp
-		fn_port "Query" queryport udp
-	} | column -s $'\t' -t
-}
-
-fn_info_message_vints() {
-	{
-		fn_port "header"
-		fn_port "Game" port tcp
-	} | column -s $'\t' -t
-}
-
-fn_info_message_vpmc() {
-	{
-		fn_port "header"
-		fn_port "Game" port tcp
-	} | column -s $'\t' -t
-}
-
-fn_info_message_wet() {
-	{
-		fn_port "header"
-		fn_port "Game" port udp
-		fn_port "Query" queryport udp
-	} | column -s $'\t' -t
-}
-
-fn_info_message_wf() {
-	{
-		fn_port "header"
-		fn_port "Game" port udp
-		fn_port "HTTP" httpport tcp
-	} | column -s $'\t' -t
-}
-
-fn_info_message_wurm() {
-	{
-		fn_port "header"
-		fn_port "Game" port tcp
-		fn_port "Query" queryport udp
-	} | column -s $'\t' -t
-}
-
-fn_info_message_stn() {
-	{
-		fn_port "header"
-		fn_port "Game" port udp
-		fn_port "Query" queryport udp
-	} | column -s $'\t' -t
-}
-
-fn_info_message_select_engine() {
-	# Display details depending on game or engine.
-	if [ "${shortname}" == "ac" ]; then
-		fn_info_message_ac
-	elif [ "${shortname}" == "ark" ]; then
-		fn_info_message_ark
-	elif [ "${shortname}" == "arma3" ]; then
-		fn_info_message_arma3
-	elif [ "${shortname}" == "armar" ]; then
-		fn_info_message_armar
-	elif [ "${shortname}" == "av" ]; then
-		fn_info_message_av
-	elif [ "${shortname}" == "bf1942" ]; then
-		fn_info_message_bf1942
-	elif [ "${shortname}" == "bfv" ]; then
-		fn_info_message_bfv
-	elif [ "${shortname}" == "bo" ]; then
-		fn_info_message_bo
-	elif [ "${shortname}" == "bt" ]; then
-		fn_info_message_bt
-	elif [ "${shortname}" == "btl" ]; then
-		fn_info_message_btl
-	elif [ "${shortname}" == "cd" ]; then
-		fn_info_messages_cd
-	elif [ "${shortname}" == "ck" ]; then
-		fn_info_messages_ck
-	elif [ "${shortname}" == "csgo" ]; then
-		fn_info_message_csgo
-	elif [ "${shortname}" == "cmw" ]; then
-		fn_info_message_cmw
-	elif [ "${shortname}" == "cod" ]; then
-		fn_info_message_cod
-	elif [ "${shortname}" == "coduo" ]; then
-		fn_info_message_coduo
-	elif [ "${shortname}" == "cod2" ]; then
-		fn_info_message_cod2
-	elif [ "${shortname}" == "cod4" ]; then
-		fn_info_message_cod4
-	elif [ "${shortname}" == "codwaw" ]; then
-		fn_info_message_codwaw
-	elif [ "${shortname}" == "col" ]; then
-		fn_info_message_col
-	elif [ "${shortname}" == "dayz" ]; then
-		fn_info_message_dayz
-	elif [ "${shortname}" == "dodr" ]; then
-		fn_info_message_dodr
-	elif [ "${shortname}" == "dst" ]; then
-		fn_info_message_dst
-	elif [ "${shortname}" == "eco" ]; then
-		fn_info_message_eco
-	elif [ "${shortname}" == "etl" ]; then
-		fn_info_message_etl
-	elif [ "${shortname}" == "fctr" ]; then
-		fn_info_message_fctr
-	elif [ "${shortname}" == "hcu" ]; then
-		fn_info_message_hcu
-	elif [ "${shortname}" == "hw" ]; then
-		fn_info_message_hw
-	elif [ "${shortname}" == "ins" ]; then
-		fn_info_message_ins
-	elif [ "${shortname}" == "inss" ]; then
-		fn_info_message_inss
-	elif [ "${shortname}" == "jc2" ]; then
-		fn_info_message_jc2
-	elif [ "${shortname}" == "jc3" ]; then
-		fn_info_message_jc3
-	elif [ "${shortname}" == "jk2" ]; then
-		fn_info_message_jk2
-	elif [ "${shortname}" == "kf" ]; then
-		fn_info_message_kf
-	elif [ "${shortname}" == "kf2" ]; then
-		fn_info_message_kf2
-	elif [ "${shortname}" == "lo" ]; then
-		fn_info_message_lo
-	elif [ "${shortname}" == "mc" ] || [ "${shortname}" == "pmc" ] || [ "${shortname}" == "wmc" ]; then
-		fn_info_message_mc
-	elif [ "${shortname}" == "mcb" ]; then
-		fn_info_message_mcb
-	elif [ "${shortname}" == "mh" ]; then
-		fn_info_message_mh
-	elif [ "${shortname}" == "mohaa" ]; then
-		fn_info_message_mohaa
-	elif [ "${shortname}" == "mom" ]; then
-		fn_info_message_mom
-	elif [ "${shortname}" == "mta" ]; then
-		fn_info_message_mta
-	elif [ "${shortname}" == "nec" ]; then
-		fn_info_message_nec
-	elif [ "${shortname}" == "onset" ]; then
-		fn_info_message_onset
-	elif [ "${shortname}" == "pc" ]; then
-		fn_info_message_pc
-	elif [ "${shortname}" == "pc2" ]; then
-		fn_info_message_pc2
-	elif [ "${shortname}" == "pstbs" ]; then
-		fn_info_message_pstbs
-	elif [ "${shortname}" == "pvr" ]; then
-		fn_info_message_pvr
-	elif [ "${shortname}" == "pz" ]; then
-		fn_info_message_pz
-	elif [ "${shortname}" == "q2" ]; then
-		fn_info_message_q2
-	elif [ "${shortname}" == "q3" ]; then
-		fn_info_message_q3
-	elif [ "${shortname}" == "ql" ]; then
-		fn_info_message_ql
-	elif [ "${shortname}" == "qw" ]; then
-		fn_info_message_qw
-	elif [ "${shortname}" == "ro" ]; then
-		fn_info_message_ro
-	elif [ "${shortname}" == "rtcw" ]; then
-		fn_info_message_rtcw
-	elif [ "${shortname}" == "samp" ]; then
-		fn_info_message_samp
-	elif [ "${shortname}" == "sb" ]; then
-		fn_info_message_sb
-	elif [ "${shortname}" == "sbots" ]; then
-		fn_info_message_sbots
-	elif [ "${shortname}" == "scpsl" ] || [ "${shortname}" == "scpslsm" ]; then
-		fn_info_message_scpsl
-	elif [ "${shortname}" == "sdtd" ]; then
-		fn_info_message_sdtd
-	elif [ "${shortname}" == "sf" ]; then
-		fn_info_message_sf
-	elif [ "${shortname}" == "sof2" ]; then
-		fn_info_message_sof2
-	elif [ "${shortname}" == "sol" ]; then
-		fn_info_message_sol
-	elif [ "${shortname}" == "squad" ]; then
-		fn_info_message_squad
-	elif [ "${shortname}" == "st" ]; then
-		fn_info_message_st
-	elif [ "${shortname}" == "stn" ]; then
-		fn_info_message_stn
-	elif [ "${shortname}" == "terraria" ]; then
-		fn_info_message_terraria
-	elif [ "${shortname}" == "ti" ]; then
-		fn_info_message_ti
-	elif [ "${shortname}" == "ts3" ]; then
-		fn_info_message_ts3
-	elif [ "${shortname}" == "tu" ]; then
-		fn_info_message_tu
-	elif [ "${shortname}" == "tw" ]; then
-		fn_info_message_tw
-	elif [ "${shortname}" == "unt" ]; then
-		fn_info_message_unt
-	elif [ "${shortname}" == "vh" ]; then
-		fn_info_message_vh
-	elif [ "${shortname}" == "vints" ]; then
-		fn_info_message_vints
-	elif [ "${shortname}" == "rust" ]; then
-		fn_info_message_rust
-	elif [ "${shortname}" == "rw" ]; then
-		fn_info_message_rw
-	elif [ "${shortname}" == "ut" ]; then
-		fn_info_message_ut
-	elif [ "${shortname}" == "ut2k4" ]; then
-		fn_info_message_ut2k4
-	elif [ "${shortname}" == "ut3" ]; then
-		fn_info_message_ut3
-	elif [ "${shortname}" == "vpmc" ]; then
-		fn_info_message_vpmc
-	elif [ "${shortname}" == "wet" ]; then
-		fn_info_message_wet
-	elif [ "${shortname}" == "wf" ]; then
-		fn_info_message_wf
-	elif [ "${shortname}" == "wurm" ]; then
-		fn_info_message_wurm
-	elif [ "${engine}" == "goldsrc" ]; then
-		fn_info_message_goldsrc
-	elif [ "${engine}" == "prism3d" ]; then
-		fn_info_message_prism3d
-	elif [ "${engine}" == "source" ]; then
-		fn_info_message_source
-	elif [ "${engine}" == "spark" ]; then
-		fn_info_message_spark
-	elif [ "${engine}" == "unreal" ]; then
-		fn_info_message_unreal
-	else
-		fn_print_error_nl "Unable to detect game server."
-	fi
-}
diff --git a/lgsm/functions/info_stats.sh b/lgsm/functions/info_stats.sh
deleted file mode 100644
index 0589770f6..000000000
--- a/lgsm/functions/info_stats.sh
+++ /dev/null
@@ -1,173 +0,0 @@
-#!/bin/bash
-# LinuxGSM info_stats.sh module
-# Author: Daniel Gibbs
-# Contributors: http://linuxgsm.com/contrib
-# Website: https://linuxgsm.com
-# Description: Collect optional Stats sent to LinuxGSM project.
-# Uses Google analytics.
-
-functionselfname="$(basename "$(readlink -f "${BASH_SOURCE[0]}")")"
-
-info_distro.sh
-
-# remove uuid that was used in v20.2.0 and below
-if [ -f "${datadir}/uuid.txt" ]; then
-	rm -f "${datadir:?}/uuid.txt"
-fi
-
-# generate uuid's
-# this consists of a standard uuid and a docker style name
-# to allow human readable uuid's.
-# e.g angry_proskuriakova_38a9ef76-4ae3-46a6-a895-7af474831eba
-
-if [ ! -f "${datadir}/uuid-${selfname}.txt" ] || [ ! -f "${datadir}/uuid-install.txt" ]; then
-	# download dictionary words
-	if [ ! -f "${datadir}/name-left.csv" ]; then
-		fn_fetch_file_github "lgsm/data" "name-left.csv" "${datadir}" "nochmodx" "norun" "forcedl" "nohash"
-	fi
-	if [ ! -f "${datadir}/name-right.csv" ]; then
-		fn_fetch_file_github "lgsm/data" "name-right.csv" "${datadir}" "nochmodx" "norun" "forcedl" "nohash"
-	fi
-
-	# generate instance uuid
-	if [ -n "$(command -v uuidgen 2> /dev/null)" ]; then
-		uuid="$(uuidgen)"
-	else
-		uuid="$(cat /proc/sys/kernel/random/uuid)"
-	fi
-
-	nameleft="$(shuf -n 1 "${datadir}/name-left.csv")"
-	nameright="$(shuf -n 1 "${datadir}/name-right.csv")"
-	echo "instance_${nameleft}_${nameright}_${uuid}" > "${datadir}/uuid-${selfname}.txt"
-	# generate install uuid if missing
-	if [ ! -f "${datadir}/uuid-install.txt" ]; then
-		echo "${nameleft}_${nameright}_${uuid}" > "${datadir}/uuid-install.txt"
-	fi
-fi
-
-uuidinstance=$(cat "${datadir}/uuid-${selfname}.txt")
-uuidinstall=$(cat "${datadir}/uuid-install.txt")
-# machine-id is a unique id set on OS install
-uuidhardware=$(cat "/etc/machine-id")
-
-# results are rounded up to reduce number of different results in analytics.
-# nearest 100Mhz.
-cpuusedmhzroundup="$(((cpuusedmhz + 99) / 100 * 100))"
-# nearest 100MB
-memusedroundup="$(((memused + 99) / 100 * 100))"
-
-# Spliting the metrics in to 3 propertys allows more accurate metrics on numbers of invidual instances, installs and hardware.
-# Instance Property - UA-165287622-1
-# Install Property - UA-165287622-2
-# Hardware Property - UA-165287622-3
-
-## Distro.
-curl https://www.google-analytics.com/collect -d "tid=UA-165287622-1" -d "aip=1" -d "cid=${uuidinstance}" -d "t=event" -d "ec=distro" -d "ea=${distroname}" -d "el=${gamename}" -d "v=1" > /dev/null 2>&1
-curl https://www.google-analytics.com/collect -d "tid=UA-165287622-2" -d "aip=1" -d "cid=${uuidinstall}" -d "t=event" -d "ec=distro" -d "ea=${distroname}" -d "el=${gamename}" -d "v=1" > /dev/null 2>&1
-curl https://www.google-analytics.com/collect -d "tid=UA-165287622-3" -d "aip=1" -d "cid=${uuidhardware}" -d "t=event" -d "ec=distro" -d "ea=${distroname}" -d "el=${gamename}" -d "v=1" > /dev/null 2>&1
-
-## Game Server Name.
-curl https://www.google-analytics.com/collect -d "tid=UA-165287622-1" -d "aip=1" -d "cid=${uuidinstance}" -d "t=event" -d "ec=game" -d "ea=${gamename}" -d "el=${gamename}" -d "v=1" > /dev/null 2>&1
-curl https://www.google-analytics.com/collect -d "tid=UA-165287622-2" -d "aip=1" -d "cid=${uuidinstall}" -d "t=event" -d "ec=game" -d "ea=${gamename}" -d "el=${gamename}" -d "v=1" > /dev/null 2>&1
-curl https://www.google-analytics.com/collect -d "tid=UA-165287622-3" -d "aip=1" -d "cid=${uuidhardware}" -d "t=event" -d "ec=game" -d "ea=${gamename}" -d "el=${gamename}" -d "v=1" > /dev/null 2>&1
-
-## LinuxGSM Version.
-curl https://www.google-analytics.com/collect -d "tid=UA-165287622-1" -d "aip=1" -d "cid=${uuidinstance}" -d "t=event" -d "ec=version" -d "ea=${version}" -d "el=${gamename}" -d "v=1" > /dev/null 2>&1
-curl https://www.google-analytics.com/collect -d "tid=UA-165287622-2" -d "aip=1" -d "cid=${uuidinstall}" -d "t=event" -d "ec=version" -d "ea=${version}" -d "el=${gamename}" -d "v=1" > /dev/null 2>&1
-curl https://www.google-analytics.com/collect -d "tid=UA-165287622-3" -d "aip=1" -d "cid=${uuidhardware}" -d "t=event" -d "ec=version" -d "ea=${version}" -d "el=${gamename}" -d "v=1" > /dev/null 2>&1
-
-## CPU usage of a game server.
-if [ -n "${cpuusedmhzroundup}" ]; then
-	curl https://www.google-analytics.com/collect -d "tid=UA-165287622-1" -d "aip=1" -d "cid=${uuidinstance}" -d "t=event" -d "ec=cpuused" -d "ea=${cpuusedmhzroundup}MHz" -d "el=${gamename}" -d "v=1" > /dev/null 2>&1
-	curl https://www.google-analytics.com/collect -d "tid=UA-165287622-2" -d "aip=1" -d "cid=${uuidinstall}" -d "t=event" -d "ec=cpuused" -d "ea=${cpuusedmhzroundup}MHz" -d "el=${gamename}" -d "v=1" > /dev/null 2>&1
-	curl https://www.google-analytics.com/collect -d "tid=UA-165287622-3" -d "aip=1" -d "cid=${uuidhardware}" -d "t=event" -d "ec=cpuused" -d "ea=${cpuusedmhzroundup}MHz" -d "el=${gamename}" -d "v=1" > /dev/null 2>&1
-fi
-## Ram usage of a game server.
-if [ -n "${memusedroundup}" ]; then
-	curl https://www.google-analytics.com/collect -d "tid=UA-165287622-1" -d "aip=1" -d "cid=${uuidinstance}" -d "t=event" -d "ec=ramused" -d "ea=${memusedroundup}MB" -d "el=${gamename}" -d "v=1" > /dev/null 2>&1
-	curl https://www.google-analytics.com/collect -d "tid=UA-165287622-2" -d "aip=1" -d "cid=${uuidinstall}" -d "t=event" -d "ec=ramused" -d "ea=${memusedroundup}MB" -d "el=${gamename}" -d "v=1" > /dev/null 2>&1
-	curl https://www.google-analytics.com/collect -d "tid=UA-165287622-3" -d "aip=1" -d "cid=${uuidhardware}" -d "t=event" -d "ec=ramused" -d "ea=${memusedroundup}MB" -d "el=${gamename}" -d "v=1" > /dev/null 2>&1
-fi
-## Disk usage of a game server.
-if [ -n "${serverfilesdu}" ]; then
-	curl https://www.google-analytics.com/collect -d "tid=UA-165287622-1" -d "aip=1" -d "cid=${uuidinstance}" -d "t=event" -d "ec=diskused" -d "ea=${serverfilesdu}" -d "el=${gamename}" -d "v=1" > /dev/null 2>&1
-	curl https://www.google-analytics.com/collect -d "tid=UA-165287622-2" -d "aip=1" -d "cid=${uuidinstall}" -d "t=event" -d "ec=diskused" -d "ea=${serverfilesdu}" -d "el=${gamename}" -d "v=1" > /dev/null 2>&1
-	curl https://www.google-analytics.com/collect -d "tid=UA-165287622-3" -d "aip=1" -d "cid=${uuidhardware}" -d "t=event" -d "ec=diskused" -d "ea=${serverfilesdu}" -d "el=${gamename}" -d "v=1" > /dev/null 2>&1
-fi
-
-## CPU Model.
-if [ -n "${cpumodel}" ]; then
-	curl https://www.google-analytics.com/collect -d "tid=UA-165287622-1" -d "aip=1" -d "cid=${uuidinstance}" -d "t=event" -d "ec=servercpu" -d "ea=${cpumodel} ${cpucores} cores" -d "el=${gamename}" -d "v=1" > /dev/null 2>&1
-	curl https://www.google-analytics.com/collect -d "tid=UA-165287622-2" -d "aip=1" -d "cid=${uuidinstall}" -d "t=event" -d "ec=servercpu" -d "ea=${cpumodel} ${cpucores} cores" -d "el=${gamename}" -d "v=1" > /dev/null 2>&1
-	curl https://www.google-analytics.com/collect -d "tid=UA-165287622-3" -d "aip=1" -d "cid=${uuidhardware}" -d "t=event" -d "ec=servercpu" -d "ea=${cpumodel} ${cpucores} cores" -d "el=${gamename}" -d "v=1" > /dev/null 2>&1
-
-fi
-
-## CPU Frequency.
-if [ -n "${cpufreqency}" ]; then
-	curl https://www.google-analytics.com/collect -d "tid=UA-165287622-1" -d "aip=1" -d "cid=${uuidinstance}" -d "t=event" -d "ec=servercpufreq" -d "ea=${cpufreqency} x${cpucores}" -d "el=${gamename}" -d "v=1" > /dev/null 2>&1
-	curl https://www.google-analytics.com/collect -d "tid=UA-165287622-2" -d "aip=1" -d "cid=${uuidinstall}" -d "t=event" -d "ec=servercpufreq" -d "ea=${cpufreqency} x${cpucores}" -d "el=${gamename}" -d "v=1" > /dev/null 2>&1
-	curl https://www.google-analytics.com/collect -d "tid=UA-165287622-3" -d "aip=1" -d "cid=${uuidhardware}" -d "t=event" -d "ec=servercpufreq" -d "ea=${cpufreqency} x${cpucores}" -d "el=${gamename}" -d "v=1" > /dev/null 2>&1
-fi
-
-## Server RAM.
-if [ -n "${physmemtotal}" ]; then
-	curl https://www.google-analytics.com/collect -d "tid=UA-165287622-1" -d "aip=1" -d "cid=${uuidinstance}" -d "t=event" -d "ec=serverram" -d "ea=${physmemtotal}" -d "el=${gamename}" -d "v=1" > /dev/null 2>&1
-	curl https://www.google-analytics.com/collect -d "tid=UA-165287622-2" -d "aip=1" -d "cid=${uuidinstall}" -d "t=event" -d "ec=serverram" -d "ea=${physmemtotal}" -d "el=${gamename}" -d "v=1" > /dev/null 2>&1
-	curl https://www.google-analytics.com/collect -d "tid=UA-165287622-3" -d "aip=1" -d "cid=${uuidhardware}" -d "t=event" -d "ec=serverram" -d "ea=${physmemtotal}" -d "el=${gamename}" -d "v=1" > /dev/null 2>&1
-fi
-
-## Server Disk.
-if [ -n "${totalspace}" ]; then
-	curl https://www.google-analytics.com/collect -d "tid=UA-165287622-1" -d "aip=1" -d "cid=${uuidinstance}" -d "t=event" -d "ec=serverdisk" -d "ea=${totalspace}" -d "el=${gamename}" -d "v=1" > /dev/null 2>&1
-	curl https://www.google-analytics.com/collect -d "tid=UA-165287622-2" -d "aip=1" -d "cid=${uuidinstall}" -d "t=event" -d "ec=serverdisk" -d "ea=${totalspace}" -d "el=${gamename}" -d "v=1" > /dev/null 2>&1
-	curl https://www.google-analytics.com/collect -d "tid=UA-165287622-3" -d "aip=1" -d "cid=${uuidhardware}" -d "t=event" -d "ec=serverdisk" -d "ea=${totalspace}" -d "el=${gamename}" -d "v=1" > /dev/null 2>&1
-fi
-
-## Alert Stats.
-if [ "${discordalert}" == "on" ]; then
-	curl https://www.google-analytics.com/collect -d "tid=UA-165287622-1" -d "aip=1" -d "cid=${uuidinstance}" -d "t=event" -d "ec=alert" -d "ea=Discord" -d "el=${gamename}" -d "v=1" > /dev/null 2>&1
-fi
-if [ "${emailalert}" == "on" ]; then
-	curl https://www.google-analytics.com/collect -d "tid=UA-165287622-1" -d "aip=1" -d "cid=${uuidinstance}" -d "t=event" -d "ec=alert" -d "ea=Email" -d "el=${gamename}" -d "v=1" > /dev/null 2>&1
-fi
-if [ "${iftttalert}" == "on" ]; then
-	curl https://www.google-analytics.com/collect -d "tid=UA-165287622-1" -d "aip=1" -d "cid=${uuidinstance}" -d "t=event" -d "ec=alert" -d "ea=IFTTT" -d "el=${gamename}" -d "v=1" > /dev/null 2>&1
-fi
-if [ "${mailgunalert}" == "on" ]; then
-	curl https://www.google-analytics.com/collect -d "tid=UA-165287622-1" -d "aip=1" -d "cid=${uuidinstance}" -d "t=event" -d "ec=alert" -d "ea=Mailgun" -d "el=${gamename}" -d "v=1" > /dev/null 2>&1
-fi
-if [ "${pushbulletalert}" == "on" ]; then
-	curl https://www.google-analytics.com/collect -d "tid=UA-165287622-1" -d "aip=1" -d "cid=${uuidinstance}" -d "t=event" -d "ec=alert" -d "ea=Pushbullet" -d "el=${gamename}" -d "v=1" > /dev/null 2>&1
-fi
-if [ "${pushoveralert}" == "on" ]; then
-	curl https://www.google-analytics.com/collect -d "tid=UA-165287622-1" -d "aip=1" -d "cid=${uuidinstance}" -d "t=event" -d "ec=alert" -d "ea=Pushover" -d "el=${gamename}" -d "v=1" > /dev/null 2>&1
-fi
-if [ "${rocketchatalert}" == "on" ]; then
-	curl https://www.google-analytics.com/collect -d "tid=UA-165287622-1" -d "aip=1" -d "cid=${uuidinstance}" -d "t=event" -d "ec=alert" -d "ea=Rocket Chat" -d "el=${gamename}" -d "v=1" > /dev/null 2>&1
-fi
-if [ "${slackalert}" == "on" ]; then
-	curl https://www.google-analytics.com/collect -d "tid=UA-165287622-1" -d "aip=1" -d "cid=${uuidinstance}" -d "t=event" -d "ec=alert" -d "ea=Slack" -d "el=${gamename}" -d "v=1" > /dev/null 2>&1
-fi
-if [ "${telegramalert}" == "on" ]; then
-	curl https://www.google-analytics.com/collect -d "tid=UA-165287622-1" -d "aip=1" -d "cid=${uuidinstance}" -d "t=event" -d "ec=alert" -d "ea=Telegram" -d "el=${gamename}" -d "v=1" > /dev/null 2>&1
-fi
-
-## Summary Stats
-curl https://www.google-analytics.com/collect -d "tid=UA-165287622-1" -d "aip=1" -d "cid=${uuidinstance}" -d "t=event" -d "ec=summary" -d "ea=GAME: ${gamename} | DISTRO: ${distroname} | CPU MODEL: ${cpumodel} ${cpucores} cores | RAM: ${physmemtotal} | DISK: ${totalspace}" -d "el=${gamename}" -d "v=1" > /dev/null 2>&1
-curl https://www.google-analytics.com/collect -d "tid=UA-165287622-2" -d "aip=1" -d "cid=${uuidinstall}" -d "t=event" -d "ec=summary" -d "ea=GAME: ${gamename} | DISTRO: ${distroname} | CPU MODEL: ${cpumodel} ${cpucores} cores | RAM: ${physmemtotal} | DISK: ${totalspace}" -d "el=${gamename}" -d "v=1" > /dev/null 2>&1
-curl https://www.google-analytics.com/collect -d "tid=UA-165287622-3" -d "aip=1" -d "cid=${uuidhardware}" -d "t=event" -d "ec=summary" -d "ea=GAME: ${gamename} | DISTRO: ${distroname} | CPU MODEL: ${cpumodel} ${cpucores} cores | RAM: ${physmemtotal} | DISK: ${totalspace}" -d "el=${gamename}" -d "v=1" > /dev/null 2>&1
-
-fn_script_log_info "Send LinuxGSM stats"
-fn_script_log_info "* uuid-${selfname}: ${uuidinstance}"
-fn_script_log_info "* uuid-install: ${uuidinstall}"
-fn_script_log_info "* uuid-hardware: ${uuidhardware}"
-fn_script_log_info "* Game Name: ${gamename}"
-fn_script_log_info "* Distro Name: ${distroname}"
-fn_script_log_info "* Game Server CPU Used: ${cpuusedmhzroundup}MHz"
-fn_script_log_info "* Game Server RAM Used: ${memusedroundup}MB"
-fn_script_log_info "* Game Server Disk Used: ${serverfilesdu}"
-fn_script_log_info "* Server CPU Model: ${cpumodel}"
-fn_script_log_info "* Server CPU Frequency: ${cpufreqency}"
-fn_script_log_info "* Server RAM: ${physmemtotal}"
-fn_script_log_info "* Server Disk: ${totalspace}"
diff --git a/lgsm/functions/install_complete.sh b/lgsm/functions/install_complete.sh
deleted file mode 100644
index ad258b224..000000000
--- a/lgsm/functions/install_complete.sh
+++ /dev/null
@@ -1,18 +0,0 @@
-#!/bin/bash
-# LinuxGSM install_complete.sh module
-# Author: Daniel Gibbs
-# Contributors: http://linuxgsm.com/contrib
-# Website: https://linuxgsm.com
-# Description: Prints installation completion message and hints.
-
-functionselfname="$(basename "$(readlink -f "${BASH_SOURCE[0]}")")"
-
-echo -e ""
-echo -e "================================="
-echo -e "Install Complete!"
-fn_script_log_info "Install Complete!"
-echo -e ""
-echo -e "To start server type:"
-echo -e "./${selfname} start"
-echo -e ""
-core_exit.sh
diff --git a/lgsm/functions/install_config.sh b/lgsm/functions/install_config.sh
deleted file mode 100644
index 35d7df7c6..000000000
--- a/lgsm/functions/install_config.sh
+++ /dev/null
@@ -1,937 +0,0 @@
-#!/bin/bash
-# LinuxGSM install_config.sh module
-# Author: Daniel Gibbs
-# Contributors: http://linuxgsm.com/contrib
-# Website: https://linuxgsm.com
-# Description: Creates default server configs.
-
-functionselfname="$(basename "$(readlink -f "${BASH_SOURCE[0]}")")"
-
-# Checks if server cfg dir exists, creates it if it doesn't.
-fn_check_cfgdir() {
-	if [ ! -d "${servercfgdir}" ]; then
-		echo -e "creating ${servercfgdir} config directory."
-		fn_script_log_info "creating ${servercfgdir} config directory."
-		mkdir -pv "${servercfgdir}"
-	fi
-}
-
-# Downloads default configs from Game-Server-Configs repo to lgsm/config-default.
-fn_fetch_default_config() {
-	echo -e ""
-	echo -e "${lightyellow}Downloading ${gamename} Configs${default}"
-	echo -e "================================="
-	echo -e "default configs from https://github.com/GameServerManagers/Game-Server-Configs"
-	fn_sleep_time
-	mkdir -p "${lgsmdir}/config-default/config-game"
-	githuburl="https://raw.githubusercontent.com/GameServerManagers/Game-Server-Configs/master"
-	for config in "${array_configs[@]}"; do
-		fn_fetch_file "${githuburl}/${gamedirname}/${config}" "${remote_fileurl_backup}" "GitHub" "Bitbucket" "${lgsmdir}/config-default/config-game" "${config}" "nochmodx" "norun" "forcedl" "nohash"
-	done
-}
-
-# Copys default configs from Game-Server-Configs repo to server config location.
-fn_default_config_remote() {
-	for config in "${array_configs[@]}"; do
-		# every config is copied
-		echo -e "copying ${config} config file."
-		fn_script_log_info "copying ${servercfg} config file."
-		if [ "${config}" == "${servercfgdefault}" ]; then
-			mkdir -p "${servercfgdir}"
-			cp -nv "${lgsmdir}/config-default/config-game/${config}" "${servercfgfullpath}"
-		elif [ "${shortname}" == "arma3" ] && [ "${config}" == "${networkcfgdefault}" ]; then
-			mkdir -p "${servercfgdir}"
-			cp -nv "${lgsmdir}/config-default/config-game/${config}" "${networkcfgfullpath}"
-		elif [ "${shortname}" == "dst" ] && [ "${config}" == "${clustercfgdefault}" ]; then
-			cp -nv "${lgsmdir}/config-default/config-game/${clustercfgdefault}" "${clustercfgfullpath}"
-		else
-			mkdir -p "${servercfgdir}"
-			cp -nv "${lgsmdir}/config-default/config-game/${config}" "${servercfgdir}/${config}"
-		fi
-	done
-	fn_sleep_time
-}
-
-# Copys local default config to server config location.
-fn_default_config_local() {
-	echo -e "copying ${servercfgdefault} config file."
-	cp -nv "${servercfgdir}/${servercfgdefault}" "${servercfgfullpath}"
-	fn_sleep_time
-}
-
-# Changes some variables within the default configs.
-# SERVERNAME to LinuxGSM
-# PASSWORD to random password
-fn_set_config_vars() {
-	if [ -f "${servercfgfullpath}" ]; then
-		random=$(tr -dc A-Za-z0-9_ < /dev/urandom | head -c 8 | xargs)
-		servername="LinuxGSM"
-		rconpass="admin${random}"
-		echo -e "changing hostname."
-		fn_script_log_info "changing hostname."
-		fn_sleep_time
-		# prevents var from being overwritten with the servername.
-		if grep -q "SERVERNAME=SERVERNAME" "${lgsmdir}/config-default/config-game/${config}" 2> /dev/null; then
-			sed -i "s/SERVERNAME=SERVERNAME/SERVERNAME=${servername}/g" "${servercfgfullpath}"
-		elif grep -q "SERVERNAME=\"SERVERNAME\"" "${lgsmdir}/config-default/config-game/${config}" 2> /dev/null; then
-			sed -i "s/SERVERNAME=\"SERVERNAME\"/SERVERNAME=\"${servername}\"/g" "${servercfgfullpath}"
-		else
-			sed -i "s/SERVERNAME/${servername}/g" "${servercfgfullpath}"
-		fi
-		echo -e "changing rcon/admin password."
-		fn_script_log_info "changing rcon/admin password."
-		if [ "${shortname}" == "squad" ]; then
-			sed -i "s/ADMINPASSWORD/${rconpass}/g" "${servercfgdir}/Rcon.cfg"
-		else
-			sed -i "s/ADMINPASSWORD/${rconpass}/g" "${servercfgfullpath}"
-		fi
-		fn_sleep_time
-	else
-		fn_script_log_warn "Config file not found, cannot alter it."
-		echo -e "Config file not found, cannot alter it."
-		fn_sleep_time
-	fi
-}
-
-# Changes some variables within the default Don't Starve Together configs.
-fn_set_dst_config_vars() {
-	## cluster.ini
-	if grep -Fq "SERVERNAME" "${clustercfgfullpath}"; then
-		echo -e "changing server name."
-		fn_script_log_info "changing server name."
-		sed -i "s/SERVERNAME/LinuxGSM/g" "${clustercfgfullpath}"
-		fn_sleep_time
-		echo -e "changing shard mode."
-		fn_script_log_info "changing shard mode."
-		sed -i "s/USESHARDING/${sharding}/g" "${clustercfgfullpath}"
-		fn_sleep_time
-		echo -e "randomizing cluster key."
-		fn_script_log_info "randomizing cluster key."
-		randomkey=$(tr -dc A-Za-z0-9_ < /dev/urandom | head -c 8 | xargs)
-		sed -i "s/CLUSTERKEY/${randomkey}/g" "${clustercfgfullpath}"
-		fn_sleep_time
-	else
-		echo -e "${clustercfg} is already configured."
-		fn_script_log_info "${clustercfg} is already configured."
-	fi
-
-	## server.ini
-	# removing unnecessary options (dependent on sharding & shard type).
-	if [ "${sharding}" == "false" ]; then
-		sed -i "s/ISMASTER//g" "${servercfgfullpath}"
-		sed -i "/SHARDNAME/d" "${servercfgfullpath}"
-	elif [ "${master}" == "true" ]; then
-		sed -i "/SHARDNAME/d" "${servercfgfullpath}"
-	fi
-
-	echo -e "changing shard name."
-	fn_script_log_info "changing shard name."
-	sed -i "s/SHARDNAME/${shard}/g" "${servercfgfullpath}"
-	fn_sleep_time
-	echo -e "changing master setting."
-	fn_script_log_info "changing master setting."
-	sed -i "s/ISMASTER/${master}/g" "${servercfgfullpath}"
-	fn_sleep_time
-
-	## worldgenoverride.lua
-	if [ "${cave}" == "true" ]; then
-		echo -e "defining ${shard} as cave in ${servercfgdir}/worldgenoverride.lua."
-		fn_script_log_info "defining ${shard} as cave in ${servercfgdir}/worldgenoverride.lua."
-		echo 'return { override_enabled = true, preset = "DST_CAVE", }' > "${servercfgdir}/worldgenoverride.lua"
-	fi
-	fn_sleep_time
-	echo -e ""
-}
-
-# Lists local config file locations
-fn_list_config_locations() {
-	echo -e ""
-	echo -e "${lightyellow}Config File Locations${default}"
-	echo -e "================================="
-	if [ -n "${servercfgfullpath}" ]; then
-		if [ -f "${servercfgfullpath}" ]; then
-			echo -e "Game Server Config File: ${servercfgfullpath}"
-		elif [ -d "${servercfgfullpath}" ]; then
-			echo -e "Game Server Config Dir: ${servercfgfullpath}"
-		else
-			echo -e "Config file: ${red}${servercfgfullpath} (${red}FILE MISSING${default})"
-		fi
-	fi
-	echo -e "LinuxGSM Config: ${lgsmdir}/config-lgsm/${gameservername}"
-	echo -e "Documentation: https://docs.linuxgsm.com/configuration/game-server-config"
-}
-
-if [ "${shortname}" == "sdtd" ]; then
-	gamedirname="7DaysToDie"
-	fn_default_config_local
-	fn_list_config_locations
-elif [ "${shortname}" == "ac" ]; then
-	gamedirname="AssettoCorsa"
-	array_configs+=(server_cfg.ini)
-	fn_fetch_default_config
-	fn_default_config_remote
-	fn_set_config_vars
-	fn_list_config_locations
-elif [ "${shortname}" == "ahl" ]; then
-	gamedirname="ActionHalfLife"
-	array_configs+=(server.cfg)
-	fn_fetch_default_config
-	fn_default_config_remote
-	fn_set_config_vars
-	fn_list_config_locations
-elif [ "${shortname}" == "ahl2" ]; then
-	gamedirname="ActionSource"
-	array_configs+=(server.cfg)
-	fn_fetch_default_config
-	fn_default_config_remote
-	fn_set_config_vars
-	fn_list_config_locations
-elif [ "${shortname}" == "ark" ]; then
-	gamedirname="ARKSurvivalEvolved"
-	fn_check_cfgdir
-	array_configs+=(GameUserSettings.ini)
-	fn_fetch_default_config
-	fn_default_config_remote
-	fn_set_config_vars
-	fn_list_config_locations
-elif [ "${shortname}" == "arma3" ]; then
-	gamedirname="Arma3"
-	fn_check_cfgdir
-	array_configs+=(server.cfg network.cfg)
-	fn_fetch_default_config
-	fn_default_config_remote
-	fn_set_config_vars
-	fn_list_config_locations
-elif [ "${shortname}" == "armar" ]; then
-	gamedirname="ArmaReforger"
-	fn_check_cfgdir
-	array_configs+=(server.json)
-	fn_fetch_default_config
-	fn_default_config_remote
-	fn_set_config_vars
-	fn_list_config_locations
-elif [ "${shortname}" == "ats" ]; then
-	gamedirname="AmericanTruckSimulator"
-	fn_check_cfgdir
-	array_configs+=(server_config.sii)
-	fn_fetch_default_config
-	fn_default_config_remote
-	fn_set_config_vars
-	fn_list_config_locations
-elif [ "${shortname}" == "bo" ]; then
-	gamedirname="BallisticOverkill"
-	array_configs+=(config.txt)
-	fn_fetch_default_config
-	fn_default_config_remote
-	fn_set_config_vars
-	fn_list_config_locations
-elif [ "${shortname}" == "bd" ]; then
-	gamedirname="BaseDefense"
-	array_configs+=(server.cfg)
-	fn_fetch_default_config
-	fn_default_config_remote
-	fn_set_config_vars
-	fn_list_config_locations
-elif [ "${shortname}" == "bt" ]; then
-	gamedirname="Barotrauma"
-	fn_check_cfgdir
-	array_configs+=(serversettings.xml)
-	fn_fetch_default_config
-	fn_default_config_remote
-	fn_set_config_vars
-	fn_list_config_locations
-elif [ "${shortname}" == "btl" ]; then
-	gamedirname="BattalionLegacy"
-	fn_check_cfgdir
-	array_configs+=(DefaultGame.ini)
-	fn_fetch_default_config
-	fn_default_config_remote
-	fn_set_config_vars
-	fn_list_config_locations
-elif [ "${shortname}" == "bf1942" ]; then
-	gamedirname="Battlefield1942"
-	array_configs+=(serversettings.con)
-	fn_fetch_default_config
-	fn_default_config_remote
-	fn_set_config_vars
-	fn_list_config_locations
-elif [ "${shortname}" == "bfv" ]; then
-	gamedirname="BattlefieldVietnam"
-	array_configs+=(serversettings.con)
-	fn_fetch_default_config
-	fn_default_config_remote
-	fn_set_config_vars
-	fn_list_config_locations
-elif [ "${shortname}" == "bs" ]; then
-	gamedirname="BladeSymphony"
-	array_configs+=(server.cfg)
-	fn_fetch_default_config
-	fn_default_config_remote
-	fn_set_config_vars
-	fn_list_config_locations
-elif [ "${shortname}" == "bb" ]; then
-	gamedirname="BrainBread"
-	array_configs+=(server.cfg)
-	fn_fetch_default_config
-	fn_default_config_remote
-	fn_set_config_vars
-	fn_list_config_locations
-elif [ "${shortname}" == "bb2" ]; then
-	gamedirname="BrainBread2"
-	array_configs+=(server.cfg)
-	fn_fetch_default_config
-	fn_default_config_remote
-	fn_set_config_vars
-	fn_list_config_locations
-elif [ "${shortname}" == "bmdm" ]; then
-	gamedirname="BlackMesa"
-	array_configs+=(server.cfg)
-	fn_fetch_default_config
-	fn_default_config_remote
-	fn_set_config_vars
-	fn_list_config_locations
-elif [ "${shortname}" == "cd" ]; then
-	gamedirname="CraftingDead"
-	array_configs+=(properties.json)
-	fn_fetch_default_config
-	fn_default_config_remote
-	fn_set_config_vars
-	fn_list_config_locations
-elif [ "${shortname}" == "ck" ]; then
-	gamedirname="CoreKeeper"
-	array_configs+=(ServerConfig.json)
-	fn_fetch_default_config
-	fn_default_config_remote
-	fn_set_config_vars
-	fn_list_config_locations
-elif [ "${shortname}" == "cod" ]; then
-	gamedirname="CallOfDuty"
-	array_configs+=(server.cfg)
-	fn_fetch_default_config
-	fn_default_config_remote
-	fn_set_config_vars
-	fn_list_config_locations
-elif [ "${shortname}" == "coduo" ]; then
-	gamedirname="CallOfDutyUnitedOffensive"
-	array_configs+=(server.cfg)
-	fn_fetch_default_config
-	fn_default_config_remote
-	fn_set_config_vars
-	fn_list_config_locations
-elif [ "${shortname}" == "cod2" ]; then
-	gamedirname="CallOfDuty2"
-	array_configs+=(server.cfg)
-	fn_fetch_default_config
-	fn_default_config_remote
-	fn_set_config_vars
-	fn_list_config_locations
-elif [ "${shortname}" == "cod4" ]; then
-	gamedirname="CallOfDuty4"
-	array_configs+=(server.cfg)
-	fn_fetch_default_config
-	fn_default_config_remote
-	fn_set_config_vars
-	fn_list_config_locations
-elif [ "${shortname}" == "codwaw" ]; then
-	gamedirname="CallOfDutyWorldAtWar"
-	array_configs+=(server.cfg)
-	fn_fetch_default_config
-	fn_default_config_remote
-	fn_set_config_vars
-	fn_list_config_locations
-elif [ "${shortname}" == "cc" ]; then
-	gamedirname="CodenameCURE"
-	array_configs+=(server.cfg)
-	fn_fetch_default_config
-	fn_default_config_remote
-	fn_set_config_vars
-	fn_list_config_locations
-elif [ "${shortname}" == "col" ]; then
-	gamedirname="ColonySurvival"
-	array_configs+=(colserver.json)
-	fn_fetch_default_config
-	fn_default_config_remote
-	fn_set_config_vars
-	fn_list_config_locations
-elif [ "${shortname}" == "cs" ]; then
-	gamedirname="CounterStrike"
-	array_configs+=(server.cfg)
-	fn_fetch_default_config
-	fn_default_config_remote
-	fn_set_config_vars
-	fn_list_config_locations
-elif [ "${shortname}" == "cscz" ]; then
-	gamedirname="CounterStrikeConditionZero"
-	array_configs+=(server.cfg)
-	fn_fetch_default_config
-	fn_default_config_remote
-	fn_set_config_vars
-	fn_list_config_locations
-elif [ "${shortname}" == "csgo" ]; then
-	gamedirname="CounterStrikeGlobalOffensive"
-	array_configs+=(server.cfg)
-	fn_fetch_default_config
-	fn_default_config_remote
-	fn_set_config_vars
-	fn_list_config_locations
-elif [ "${shortname}" == "css" ]; then
-	gamedirname="CounterStrikeSource"
-	array_configs+=(server.cfg)
-	fn_fetch_default_config
-	fn_default_config_remote
-	fn_set_config_vars
-	fn_list_config_locations
-elif [ "${shortname}" == "dayz" ]; then
-	gamedirname="DayZ"
-	fn_check_cfgdir
-	array_configs+=(server.cfg)
-	fn_fetch_default_config
-	fn_default_config_remote
-	fn_set_config_vars
-	fn_list_config_locations
-elif [ "${shortname}" == "dod" ]; then
-	gamedirname="DayOfDefeat"
-	array_configs+=(server.cfg)
-	fn_fetch_default_config
-	fn_default_config_remote
-	fn_set_config_vars
-	fn_list_config_locations
-elif [ "${shortname}" == "dodr" ]; then
-	gamedirname="DayOfDragons"
-	array_configs+=(Game.ini)
-	fn_fetch_default_config
-	fn_default_config_remote
-	fn_list_config_locations
-elif [ "${shortname}" == "dods" ]; then
-	gamedirname="DayOfDefeatSource"
-	array_configs+=(server.cfg)
-	fn_fetch_default_config
-	fn_default_config_remote
-	fn_set_config_vars
-	fn_list_config_locations
-elif [ "${shortname}" == "doi" ]; then
-	gamedirname="DayOfInfamy"
-	array_configs+=(server.cfg)
-	fn_fetch_default_config
-	fn_default_config_remote
-	fn_set_config_vars
-	fn_list_config_locations
-elif [ "${shortname}" == "dmc" ]; then
-	gamedirname="DeathmatchClassic"
-	array_configs+=(server.cfg)
-	fn_fetch_default_config
-	fn_default_config_remote
-	fn_set_config_vars
-	fn_list_config_locations
-elif [ "${shortname}" == "dst" ]; then
-	gamedirname="DontStarveTogether"
-	fn_check_cfgdir
-	array_configs+=(cluster.ini server.ini)
-	fn_fetch_default_config
-	fn_default_config_remote
-	fn_set_dst_config_vars
-	fn_list_config_locations
-elif [ "${shortname}" == "dab" ]; then
-	gamedirname="DoubleActionBoogaloo"
-	array_configs+=(server.cfg)
-	fn_fetch_default_config
-	fn_default_config_remote
-	fn_set_config_vars
-	fn_list_config_locations
-elif [ "${shortname}" == "dys" ]; then
-	gamedirname="Dystopia"
-	array_configs+=(server.cfg)
-	fn_fetch_default_config
-	fn_default_config_remote
-	fn_set_config_vars
-	fn_list_config_locations
-elif [ "${shortname}" == "eco" ]; then
-	gamedirname="Eco"
-	array_configs+=(Network.eco)
-	fn_fetch_default_config
-	fn_default_config_remote
-	fn_set_config_vars
-	fn_list_config_locations
-elif [ "${shortname}" == "etl" ]; then
-	gamedirname="ETLegacy"
-	array_configs+=(server.cfg)
-	fn_fetch_default_config
-	fn_default_config_remote
-	fn_set_config_vars
-	fn_list_config_locations
-elif [ "${shortname}" == "ets2" ]; then
-	gamedirname="EuroTruckSimulator2"
-	fn_check_cfgdir
-	array_configs+=(server_config.sii)
-	fn_fetch_default_config
-	fn_default_config_remote
-	fn_set_config_vars
-	fn_list_config_locations
-elif [ "${shortname}" == "fctr" ]; then
-	gamedirname="Factorio"
-	array_configs+=(server-settings.json)
-	fn_fetch_default_config
-	fn_default_config_remote
-	fn_set_config_vars
-	fn_list_config_locations
-elif [ "${shortname}" == "fof" ]; then
-	gamedirname="FistfulofFrags"
-	array_configs+=(server.cfg)
-	fn_fetch_default_config
-	fn_default_config_remote
-	fn_set_config_vars
-	fn_list_config_locations
-elif [ "${shortname}" == "gmod" ]; then
-	gamedirname="GarrysMod"
-	array_configs+=(server.cfg)
-	fn_fetch_default_config
-	fn_default_config_remote
-	fn_set_config_vars
-	fn_list_config_locations
-elif [ "${shortname}" == "hldm" ]; then
-	gamedirname="HalfLifeDeathmatch"
-	array_configs+=(server.cfg)
-	fn_fetch_default_config
-	fn_default_config_remote
-	fn_set_config_vars
-	fn_list_config_locations
-elif [ "${shortname}" == "hldms" ]; then
-	gamedirname="HalfLifeDeathmatchSource"
-	array_configs+=(server.cfg)
-	fn_fetch_default_config
-	fn_default_config_remote
-	fn_set_config_vars
-	fn_list_config_locations
-elif [ "${shortname}" == "opfor" ]; then
-	gamedirname="OpposingForce"
-	array_configs+=(server.cfg)
-	fn_fetch_default_config
-	fn_default_config_remote
-	fn_set_config_vars
-	fn_list_config_locations
-elif [ "${shortname}" == "hl2dm" ]; then
-	gamedirname="HalfLife2Deathmatch"
-	array_configs+=(server.cfg)
-	fn_fetch_default_config
-	fn_default_config_remote
-	fn_set_config_vars
-	fn_list_config_locations
-elif [ "${shortname}" == "ins" ]; then
-	gamedirname="Insurgency"
-	array_configs+=(server.cfg)
-	fn_fetch_default_config
-	fn_default_config_remote
-	fn_set_config_vars
-	fn_list_config_locations
-elif [ "${shortname}" == "ios" ]; then
-	gamedirname="IOSoccer"
-	array_configs+=(server.cfg)
-	fn_fetch_default_config
-	fn_default_config_remote
-	fn_set_config_vars
-	fn_list_config_locations
-elif [ "${shortname}" == "jc2" ]; then
-	gamedirname="JustCause2"
-	array_configs+=(config.lua)
-	fn_fetch_default_config
-	fn_default_config_remote
-	fn_set_config_vars
-	fn_list_config_locations
-elif [ "${shortname}" == "jc3" ]; then
-	gamedirname="JustCause3"
-	array_configs+=(config.json)
-	fn_fetch_default_config
-	fn_default_config_remote
-	fn_set_config_vars
-	fn_list_config_locations
-elif [ "${shortname}" == "kf" ]; then
-	gamedirname="KillingFloor"
-	array_configs+=(Default.ini)
-	fn_fetch_default_config
-	fn_default_config_remote
-	fn_set_config_vars
-	fn_list_config_locations
-elif [ "${shortname}" == "l4d" ]; then
-	gamedirname="Left4Dead"
-	array_configs+=(server.cfg)
-	fn_fetch_default_config
-	fn_default_config_remote
-	fn_set_config_vars
-	fn_list_config_locations
-elif [ "${shortname}" == "l4d2" ]; then
-	gamedirname="Left4Dead2"
-	array_configs+=(server.cfg)
-	fn_fetch_default_config
-	fn_default_config_remote
-	fn_set_config_vars
-	fn_list_config_locations
-elif [ "${shortname}" == "mc" ] || [ "${shortname}" == "pmc" ]; then
-	gamedirname="Minecraft"
-	array_configs+=(server.properties)
-	fn_fetch_default_config
-	fn_default_config_remote
-	fn_set_config_vars
-	fn_list_config_locations
-elif [ "${shortname}" == "mcb" ]; then
-	gamedirname="MinecraftBedrock"
-	array_configs+=(server.properties)
-	fn_fetch_default_config
-	fn_default_config_remote
-	fn_set_config_vars
-	fn_list_config_locations
-elif [ "${shortname}" == "mohaa" ]; then
-	gamedirname="MedalOfHonorAlliedAssault"
-	array_configs+=(server.cfg)
-	fn_fetch_default_config
-	fn_default_config_remote
-	fn_set_config_vars
-	fn_list_config_locations
-elif [ "${shortname}" == "mh" ]; then
-	gamedirname="Mordhau"
-	fn_check_cfgdir
-	array_configs+=(Game.ini)
-	fn_fetch_default_config
-	fn_default_config_remote
-	fn_set_config_vars
-	fn_list_config_locations
-elif [ "${shortname}" == "ns" ]; then
-	gamedirname="NaturalSelection"
-	array_configs+=(server.cfg)
-	fn_fetch_default_config
-	fn_default_config_remote
-	fn_set_config_vars
-	fn_list_config_locations
-elif [ "${shortname}" == "nmrih" ]; then
-	gamedirname="NoMoreRoominHell"
-	array_configs+=(server.cfg)
-	fn_fetch_default_config
-	fn_default_config_remote
-	fn_set_config_vars
-	fn_list_config_locations
-elif [ "${shortname}" == "nd" ]; then
-	gamedirname="NuclearDawn"
-	array_configs+=(server.cfg)
-	fn_fetch_default_config
-	fn_default_config_remote
-	fn_set_config_vars
-	fn_list_config_locations
-elif [ "${shortname}" == "mta" ]; then
-	gamedirname="MultiTheftAuto"
-	fn_check_cfgdir
-	array_configs+=(acl.xml mtaserver.conf vehiclecolors.conf)
-	fn_fetch_default_config
-	fn_default_config_remote
-	fn_list_config_locations
-elif [ "${shotname}" == "mom" ]; then
-	gamedirname="MemoriesofMars"
-	array_configs+=(DedicatedServerConfig.cfg)
-	fn_fetch_default_config
-	fn_default_config_remote
-	fn_set_config_vars
-	fn_list_config_locations
-elif [ "${shortname}" == "pvr" ]; then
-	gamedirname="PavlovVR"
-	fn_check_cfgdir
-	array_configs+=(Game.ini)
-	fn_fetch_default_config
-	fn_default_config_remote
-	fn_set_config_vars
-elif [ "${shortname}" == "pvkii" ]; then
-	gamedirname="PiratesVikingandKnightsII"
-	array_configs+=(server.cfg)
-	fn_fetch_default_config
-	fn_default_config_remote
-	fn_set_config_vars
-	fn_list_config_locations
-elif [ "${shortname}" == "pz" ]; then
-	gamedirname="ProjectZomboid"
-	fn_check_cfgdir
-	array_configs+=(server.ini)
-	fn_fetch_default_config
-	fn_default_config_remote
-	fn_set_config_vars
-	fn_list_config_locations
-elif [ "${shortname}" == "nec" ]; then
-	gamedirname="Necesse"
-	fn_check_cfgdir
-	array_configs+=(server.cfg)
-	fn_fetch_default_config
-	fn_default_config_remote
-	fn_set_config_vars
-	fn_list_config_locations
-elif [ "${shortname}" == "pc" ]; then
-	gamedirname="ProjectCars"
-	array_configs+=(server.cfg)
-	fn_fetch_default_config
-	fn_default_config_remote
-	fn_set_config_vars
-	fn_list_config_locations
-elif [ "${shortname}" == "pc2" ]; then
-	gamedirname="ProjectCars2"
-	fn_default_config_local
-	fn_list_config_locations
-elif [ "${shortname}" == "q2" ]; then
-	gamedirname="Quake2"
-	array_configs+=(server.cfg)
-	fn_fetch_default_config
-	fn_default_config_remote
-	fn_set_config_vars
-	fn_list_config_locations
-elif [ "${shortname}" == "q3" ]; then
-	gamedirname="Quake3Arena"
-	array_configs+=(server.cfg)
-	fn_fetch_default_config
-	fn_default_config_remote
-	fn_set_config_vars
-	fn_list_config_locations
-elif [ "${shortname}" == "ql" ]; then
-	gamedirname="QuakeLive"
-	array_configs+=(server.cfg)
-	fn_fetch_default_config
-	fn_default_config_remote
-	fn_set_config_vars
-	fn_list_config_locations
-elif [ "${shortname}" == "jk2" ]; then
-	gamedirname="JediKnightIIJediOutcast"
-	array_configs+=(server.cfg)
-	fn_fetch_default_config
-	fn_default_config_remote
-	fn_set_config_vars
-elif [ "${shortname}" == "qw" ]; then
-	gamedirname="QuakeWorld"
-	array_configs+=(server.cfg)
-	fn_fetch_default_config
-	fn_default_config_remote
-	fn_set_config_vars
-	fn_list_config_locations
-elif [ "${shortname}" == "ricochet" ]; then
-	gamedirname="Ricochet"
-	array_configs+=(server.cfg)
-	fn_fetch_default_config
-	fn_default_config_remote
-	fn_set_config_vars
-	fn_list_config_locations
-elif [ "${shortname}" == "rtcw" ]; then
-	gamedirname="ReturnToCastleWolfenstein"
-	array_configs+=(server.cfg)
-	fn_fetch_default_config
-	fn_default_config_remote
-	fn_set_config_vars
-	fn_list_config_locations
-elif [ "${shortname}" == "rust" ]; then
-	gamedirname="Rust"
-	fn_check_cfgdir
-	array_configs+=(server.cfg)
-	fn_fetch_default_config
-	fn_default_config_remote
-	fn_list_config_locations
-elif [ "${shortname}" == "scpsl" ] || [ "${shortname}" == "scpslsm" ]; then
-	gamedirname="SCPSecretLaboratory"
-	array_configs+=(config_gameplay.txt config_localadmin.txt)
-	fn_fetch_default_config
-	fn_default_config_remote
-	fn_set_config_vars
-	fn_list_config_locations
-elif [ "${shortname}" == "sf" ]; then
-	gamedirname="Satisfactory"
-	array_configs+=(GameUserSettings.ini)
-	fn_fetch_default_config
-	fn_default_config_remote
-	fn_set_config_vars
-	fn_list_config_locations
-elif [ "${shortname}" == "sol" ]; then
-	gamedirname="Soldat"
-	array_configs+=(soldat.ini)
-	fn_fetch_default_config
-	fn_default_config_remote
-	fn_set_config_vars
-	fn_list_config_locations
-elif [ "${shortname}" == "sof2" ]; then
-	gamedirname="SoldierOfFortune2Gold"
-	array_configs+=(server.cfg mapcycle.txt)
-	fn_fetch_default_config
-	fn_default_config_remote
-	fn_set_config_vars
-	fn_list_config_locations
-elif [ "${shortname}" == "sfc" ]; then
-	gamedirname="SourceFortsClassic"
-	array_configs+=(server.cfg)
-	fn_fetch_default_config
-	fn_default_config_remote
-	fn_set_config_vars
-	fn_list_config_locations
-elif [ "${shortname}" == "squad" ]; then
-	gamedirname="Squad"
-	array_configs+=(Admins.cfg Bans.cfg License.cfg Server.cfg Rcon.cfg)
-	fn_fetch_default_config
-	fn_default_config_remote
-	fn_set_config_vars
-	fn_list_config_locations
-elif [ "${shortname}" == "sb" ]; then
-	gamedirname="Starbound"
-	array_configs+=(starbound_server.config)
-	fn_fetch_default_config
-	fn_default_config_remote
-	fn_set_config_vars
-	fn_list_config_locations
-elif [ "${shortname}" == "st" ]; then
-	gamedirname="Stationeers"
-	array_configs+=(default.ini)
-	fn_fetch_default_config
-	fn_default_config_remote
-	fn_set_config_vars
-	fn_list_config_locations
-elif [ "${shortname}" == "stn" ]; then
-	gamedirname="SurvivetheNights"
-	array_configs+=(ServerConfig.txt ServerUsers.txt TpPresets.json UserPermissions.json)
-	fn_fetch_default_config
-	fn_default_config_remote
-	fn_set_config_vars
-	fn_list_config_locations
-elif [ "${shortname}" == "sven" ]; then
-	gamedirname="SvenCoop"
-	array_configs+=(server.cfg)
-	fn_fetch_default_config
-	fn_default_config_remote
-	fn_set_config_vars
-	fn_list_config_locations
-elif [ "${shortname}" == "tf2" ]; then
-	gamedirname="TeamFortress2"
-	array_configs+=(server.cfg)
-	fn_fetch_default_config
-	fn_default_config_remote
-	fn_set_config_vars
-	fn_list_config_locations
-elif [ "${shortname}" == "tfc" ]; then
-	gamedirname="TeamFortressClassic"
-	array_configs+=(server.cfg)
-	fn_fetch_default_config
-	fn_default_config_remote
-	fn_set_config_vars
-	fn_list_config_locations
-elif [ "${shortname}" == "ti" ]; then
-	gamedirname="TheIsle"
-	array_configs+=(Game.ini)
-	fn_fetch_default_config
-	fn_default_config_remote
-	fn_set_config_vars
-	fn_list_config_locations
-elif [ "${shortname}" == "ts" ]; then
-	gamedirname="TheSpecialists"
-	array_configs+=(server.cfg)
-	fn_fetch_default_config
-	fn_default_config_remote
-	fn_set_config_vars
-	fn_list_config_locations
-elif [ "${shortname}" == "ts3" ]; then
-	gamedirname="TeamSpeak3"
-	array_configs+=(ts3server.ini)
-	fn_fetch_default_config
-	fn_default_config_remote
-	fn_list_config_locations
-elif [ "${shortname}" == "tw" ]; then
-	gamedirname="Teeworlds"
-	array_configs+=(server.cfg ctf.cfg dm.cfg duel.cfg tdm.cfg)
-	fn_fetch_default_config
-	fn_default_config_remote
-	fn_set_config_vars
-	fn_list_config_locations
-elif [ "${shortname}" == "terraria" ]; then
-	gamedirname="Terraria"
-	array_configs+=(serverconfig.txt)
-	fn_fetch_default_config
-	fn_default_config_remote
-	fn_set_config_vars
-	fn_list_config_locations
-elif [ "${shortname}" == "tu" ]; then
-	gamedirname="TowerUnite"
-	fn_check_cfgdir
-	array_configs+=(TowerServer.ini)
-	fn_fetch_default_config
-	fn_default_config_remote
-	fn_set_config_vars
-	fn_list_config_locations
-elif [ "${shortname}" == "ut" ]; then
-	gamedirname="UnrealTournament"
-	array_configs+=(Game.ini Engine.ini)
-	fn_fetch_default_config
-	fn_default_config_remote
-	fn_set_config_vars
-	fn_list_config_locations
-elif [ "${shortname}" == "ut2k4" ]; then
-	gamedirname="UnrealTournament2004"
-	array_configs+=(UT2004.ini)
-	fn_fetch_default_config
-	fn_default_config_remote
-	fn_set_config_vars
-	fn_list_config_locations
-elif [ "${shortname}" == "ut99" ]; then
-	gamedirname="UnrealTournament99"
-	array_configs+=(Default.ini)
-	fn_fetch_default_config
-	fn_default_config_remote
-	fn_set_config_vars
-	fn_list_config_locations
-elif [ "${shortname}" == "unt" ]; then
-	gamedirname="Unturned"
-	array_configs+=(Config.json)
-	fn_fetch_default_config
-	fn_default_config_remote
-	fn_set_config_vars
-	fn_list_config_locations
-elif [ "${shortname}" == "vints" ]; then
-	gamedirname="VintageStory"
-	array_configs+=(serverconfig.json)
-	fn_fetch_default_config
-	fn_default_config_remote
-	fn_set_config_vars
-	fn_list_config_locations
-elif [ "${shortname}" == "vs" ]; then
-	gamedirname="VampireSlayer"
-	array_configs+=(server.cfg)
-	fn_fetch_default_config
-	fn_default_config_remote
-	fn_set_config_vars
-	fn_list_config_locations
-elif [ "${shortname}" == "wet" ]; then
-	gamedirname="WolfensteinEnemyTerritory"
-	array_configs+=(server.cfg)
-	fn_fetch_default_config
-	fn_default_config_remote
-	fn_set_config_vars
-	fn_list_config_locations
-elif [ "${shortname}" == "wf" ]; then
-	gamedirname="Warfork"
-	array_configs+=(server.cfg)
-	fn_fetch_default_config
-	fn_default_config_remote
-	fn_set_config_vars
-	fn_list_config_locations
-elif [ "${shortname}" == "wmc" ]; then
-	gamedirname="Waterfall"
-	array_configs+=(config.yml)
-	fn_fetch_default_config
-	fn_default_config_remote
-	fn_set_config_vars
-elif [ "${shortname}" == "wurm" ]; then
-	gamedirname="WurmUnlimited"
-	array_configs+=(server.cfg)
-	fn_fetch_default_config
-	fn_default_config_remote
-	fn_set_config_vars
-	fn_list_config_locations
-elif [ "${shortname}" == "zmr" ]; then
-	gamedirname="ZombieMasterReborn"
-	array_configs+=(server.cfg)
-	fn_fetch_default_config
-	fn_default_config_remote
-	fn_set_config_vars
-	fn_list_config_locations
-elif [ "${shortname}" == "zps" ]; then
-	gamedirname="ZombiePanicSource"
-	array_configs+=(server.cfg)
-	fn_fetch_default_config
-	fn_default_config_remote
-	fn_set_config_vars
-	fn_list_config_locations
-fi
diff --git a/lgsm/functions/install_dst_token.sh b/lgsm/functions/install_dst_token.sh
deleted file mode 100644
index 50bc7ed97..000000000
--- a/lgsm/functions/install_dst_token.sh
+++ /dev/null
@@ -1,45 +0,0 @@
-#!/bin/bash
-# LinuxGSM install_dst_token.sh module
-# Author: Daniel Gibbs
-# Contributors: http://linuxgsm.com/contrib
-# Website: https://linuxgsm.com
-# Description: Configures Don't Starve Together cluster with given token.
-
-functionselfname="$(basename "$(readlink -f "${BASH_SOURCE[0]}")")"
-
-echo -e ""
-echo -e "${lightyellow}Enter ${gamename} Cluster Token${default}"
-echo -e "================================="
-fn_sleep_time
-echo -e "A cluster token is required to run this server!"
-echo -e "Follow the instructions in this link to obtain this key:"
-echo -e "https://linuxgsm.com/dst-auth-token"
-echo -e ""
-if [ -z "${autoinstall}" ]; then
-	overwritetoken="true"
-	if [ -s "${clustercfgdir}/cluster_token.txt" ]; then
-		echo -e "The cluster token is already set. Do you want to overwrite it?"
-		fn_script_log_info "Don't Starve Together cluster token is already set"
-		if fn_prompt_yn "Continue?" N; then
-			overwritetoken="true"
-		else
-			overwritetoken="false"
-		fi
-	fi
-	if [ "${overwritetoken}" == "true" ]; then
-		echo -e "Once you have the cluster token, enter it below"
-		echo -n "Cluster Token: "
-		read -r token
-		mkdir -pv "${clustercfgdir}"
-		echo -e "${token}" > "${clustercfgdir}/cluster_token.txt"
-		if [ -f "${clustercfgdir}/cluster_token.txt" ]; then
-			echo -e "Don't Starve Together cluster token created"
-			fn_script_log_info "Don't Starve Together cluster token created"
-		fi
-		unset overwritetoken
-	fi
-else
-	echo -e "You can add your cluster token using the following command"
-	echo -e "./${selfname} cluster-token"
-fi
-echo -e ""
diff --git a/lgsm/functions/install_eula.sh b/lgsm/functions/install_eula.sh
deleted file mode 100644
index 3e51fac71..000000000
--- a/lgsm/functions/install_eula.sh
+++ /dev/null
@@ -1,47 +0,0 @@
-#!/bin/bash
-# LinuxGSM install_eula.sh module
-# Author: Daniel Gibbs
-# Contributors: http://linuxgsm.com/contrib
-# Website: https://linuxgsm.com
-# Description: Gets user to accept the EULA.
-
-functionselfname="$(basename "$(readlink -f "${BASH_SOURCE[0]}")")"
-
-if [ "${shortname}" == "ts3" ]; then
-	eulaurl="https://www.teamspeak.com/en/privacy-and-terms"
-elif [ "${shortname}" == "mc" ] || [ "${shortname}" == "pmc" ]; then
-	eulaurl="https://account.mojang.com/documents/minecraft_eula"
-elif [ "${shortname}" == "ut" ]; then
-	eulaurl="https://www.epicgames.com/unrealtournament/unreal-tournament-pre-alpha-test-development-build-eula"
-fi
-
-echo -e ""
-echo -e "${lightyellow}Accept ${gamename} EULA${default}"
-echo -e "================================="
-fn_sleep_time
-echo -e "You are required to accept the EULA:"
-echo -e "${eulaurl}"
-echo -e ""
-if [ -z "${autoinstall}" ]; then
-	echo -e "By continuing you are indicating your agreement to the EULA."
-	echo -e ""
-	if ! fn_prompt_yn "Continue?" Y; then
-		exitcode=0
-		core_exit.sh
-	fi
-elif [ "${commandname}" == "START" ]; then
-	fn_print_info "By continuing you are indicating your agreement to the EULA."
-	sleep 5
-else
-	echo -e "By using auto-install you are indicating your agreement to the EULA."
-	sleep 5
-fi
-
-if [ "${shortname}" == "ts3" ]; then
-	touch "${executabledir}/.ts3server_license_accepted"
-elif [ "${shortname}" == "mc" ] || [ "${shortname}" == "pmc" ]; then
-	touch "${serverfiles}/eula.txt"
-	echo -e "eula=true" > "${serverfiles}/eula.txt"
-elif [ "${shortname}" == "ut" ]; then
-	:
-fi
diff --git a/lgsm/functions/install_factorio_save.sh b/lgsm/functions/install_factorio_save.sh
deleted file mode 100644
index f5fdb8a04..000000000
--- a/lgsm/functions/install_factorio_save.sh
+++ /dev/null
@@ -1,15 +0,0 @@
-#!/bin/bash
-# LinuxGSM install_factorio_save.sh module
-# Author: Daniel Gibbs
-# Contributors: http://linuxgsm.com/contrib
-# Website: https://linuxgsm.com
-# Description: Creates the initial save file for Factorio.
-
-functionselfname="$(basename "$(readlink -f "${BASH_SOURCE[0]}")")"
-
-echo -e ""
-echo -e "${lightyellow}Creating initial Factorio savefile${default}"
-echo -e "================================="
-fn_sleep_time
-check_glibc.sh
-"${executabledir}"/factorio --create "${serverfiles}/save1"
diff --git a/lgsm/functions/install_gslt.sh b/lgsm/functions/install_gslt.sh
deleted file mode 100644
index 1ae1ef3b0..000000000
--- a/lgsm/functions/install_gslt.sh
+++ /dev/null
@@ -1,47 +0,0 @@
-#!/bin/bash
-# LinuxGSM install_gslt.sh module
-# Author: Daniel Gibbs
-# Contributors: http://linuxgsm.com/contrib
-# Website: https://linuxgsm.com
-# Description: Configures GSLT.
-
-functionselfname="$(basename "$(readlink -f "${BASH_SOURCE[0]}")")"
-
-echo -e ""
-echo -e "${lightyellow}Game Server Login Token${default}"
-echo -e "================================="
-fn_sleep_time
-if [ "${shortname}" == "csgo" ] || [ "${shortname}" == "css" ] || [ "${shortname}" == "nmrih" ] || [ "${shortname}" == "bs" ]; then
-	echo -e "GSLT is required to run a public ${gamename} server"
-	fn_script_log_info "GSLT is required to run a public ${gamename} server"
-else
-	echo -e "GSLT is an optional feature for ${gamename} server"
-	fn_script_log_info "GSLT is an optional feature for ${gamename} server"
-fi
-
-echo -e "Get more info and a token here:"
-echo -e "https://docs.linuxgsm.com/steamcmd/gslt"
-fn_script_log_info "Get more info and a token here:"
-fn_script_log_info "https://docs.linuxgsm.com/steamcmd/gslt"
-echo -e ""
-if [ -z "${autoinstall}" ]; then
-	if [ "${shortname}" != "tu" ]; then
-		echo -e "Enter token below (Can be blank)."
-		echo -n "GSLT TOKEN: "
-		read -r token
-		if ! grep -q "^gslt=" "${configdirserver}/${selfname}.cfg" > /dev/null 2>&1; then
-			echo -e "\ngslt=\"${token}\"" >> "${configdirserver}/${selfname}.cfg"
-		else
-			sed -i -e "s/gslt=\"[^\"]*\"/gslt=\"${token}\"/g" "${configdirserver}/${selfname}.cfg"
-		fi
-	fi
-fi
-fn_sleep_time
-if [ "${shortname}" == "tu" ]; then
-	echo -e "The GSLT can be changed by editing ${servercfgdir}/${servercfg}."
-	fn_script_log_info "The GSLT can be changed by editing ${servercfgdir}/${servercfg}."
-else
-	echo -e "The GSLT can be changed by editing ${configdirserver}/${selfname}.cfg."
-	fn_script_log_info "The GSLT can be changed by editing ${configdirserver}/${selfname}.cfg."
-fi
-echo -e ""
diff --git a/lgsm/functions/install_header.sh b/lgsm/functions/install_header.sh
deleted file mode 100644
index 4cf067f8f..000000000
--- a/lgsm/functions/install_header.sh
+++ /dev/null
@@ -1,22 +0,0 @@
-#!/bin/bash
-# LinuxGSM install_header.sh module
-# Author: Daniel Gibbs
-# Contributors: http://linuxgsm.com/contrib
-# Website: https://linuxgsm.com
-# Description: Prints installation header.
-
-functionselfname="$(basename "$(readlink -f "${BASH_SOURCE[0]}")")"
-
-clear
-fn_print_ascii_logo
-fn_sleep_time
-echo -e "================================="
-echo -e "${lightyellow}Linux${default}GSM_"
-echo -e "by Daniel Gibbs"
-echo -e "${lightblue}Version:${default} ${version}"
-echo -e "${lightblue}Game:${default} ${gamename}"
-echo -e "${lightblue}Website:${default} https://linuxgsm.com"
-echo -e "${lightblue}Contributors:${default} https://linuxgsm.com/contrib"
-echo -e "${lightblue}Sponsor:${default} https://linuxgsm.com/sponsor"
-echo -e "================================="
-fn_sleep_time
diff --git a/lgsm/functions/install_logs.sh b/lgsm/functions/install_logs.sh
deleted file mode 100644
index 80a55fb94..000000000
--- a/lgsm/functions/install_logs.sh
+++ /dev/null
@@ -1,100 +0,0 @@
-#!/bin/bash
-# LinuxGSM install_logs.sh module
-# Author: Daniel Gibbs
-# Contributors: http://linuxgsm.com/contrib
-# Website: https://linuxgsm.com
-# Description: Creates log directories.
-
-functionselfname="$(basename "$(readlink -f "${BASH_SOURCE[0]}")")"
-
-if [ "${checklogs}" != "1" ]; then
-	echo -e ""
-	echo -e "${lightyellow}Creating log directories${default}"
-	echo -e "================================="
-fi
-fn_sleep_time
-# Create LinuxGSM logs.
-echo -en "installing log dir: ${logdir}..."
-mkdir -p "${logdir}"
-if [ $? != 0 ]; then
-	fn_print_fail_eol_nl
-	core_exit.sh
-else
-	fn_print_ok_eol_nl
-fi
-
-echo -en "installing LinuxGSM log dir: ${lgsmlogdir}..."
-mkdir -p "${lgsmlogdir}"
-if [ $? != 0 ]; then
-	fn_print_fail_eol_nl
-	core_exit.sh
-else
-	fn_print_ok_eol_nl
-fi
-echo -en "creating LinuxGSM log: ${lgsmlog}..."
-touch "${lgsmlog}"
-if [ $? != 0 ]; then
-	fn_print_fail_eol_nl
-	core_exit.sh
-else
-	fn_print_ok_eol_nl
-fi
-# Create Console logs.
-if [ "${consolelogdir}" ]; then
-	echo -en "installing console log dir: ${consolelogdir}..."
-	mkdir -p "${consolelogdir}"
-	if [ $? != 0 ]; then
-		fn_print_fail_eol_nl
-		core_exit.sh
-	else
-		fn_print_ok_eol_nl
-	fi
-	echo -en "creating console log: ${consolelog}..."
-	if ! touch "${consolelog}"; then
-		fn_print_fail_eol_nl
-		core_exit.sh
-	else
-		fn_print_ok_eol_nl
-	fi
-fi
-
-# Create Game logs.
-if [ "${gamelogdir}" ] && [ ! -d "${gamelogdir}" ]; then
-	echo -en "installing game log dir: ${gamelogdir}..."
-	if ! mkdir -p "${gamelogdir}"; then
-		fn_print_fail_eol_nl
-		core_exit.sh
-	else
-		fn_print_ok_eol_nl
-	fi
-fi
-
-# Symlink to gamelogdir
-# unless gamelogdir is within logdir.
-# e.g serverfiles/log is not within log/: symlink created
-# log/server is in log/: symlink not created
-if [ "${gamelogdir}" ]; then
-	if [ "${gamelogdir:0:${#logdir}}" != "${logdir}" ]; then
-		echo -en "creating symlink to game log dir: ${logdir}/server -> ${gamelogdir}..."
-		if ! ln -nfs "${gamelogdir}" "${logdir}/server"; then
-			fn_print_fail_eol_nl
-			core_exit.sh
-		else
-			fn_print_ok_eol_nl
-		fi
-	fi
-fi
-
-# If server uses SteamCMD create a symbolic link to the Steam logs.
-if [ -d "${rootdir}/Steam/logs" ]; then
-	if [ ! -L "${logdir}/steamcmd" ]; then
-		echo -en "creating symlink to steam log dir: ${logdir}/steamcmd -> ${rootdir}/Steam/logs..."
-		if ! ln -nfs "${rootdir}/Steam/logs" "${logdir}/steamcmd"; then
-			fn_print_fail_eol_nl
-			core_exit.sh
-		else
-			fn_print_ok_eol_nl
-		fi
-	fi
-fi
-fn_script_log_info "Logs installed"
diff --git a/lgsm/functions/install_mta_resources.sh b/lgsm/functions/install_mta_resources.sh
deleted file mode 100644
index 011ad9b71..000000000
--- a/lgsm/functions/install_mta_resources.sh
+++ /dev/null
@@ -1,12 +0,0 @@
-#!/bin/bash
-# LinuxGSM install_mta_resources.sh module
-# Author: Daniel Gibbs
-# Contributors: http://linuxgsm.com/contrib
-# Website: https://linuxgsm.com
-# Description: Installs the libmysqlclient for database functions on the server and optionally installs default resources required to run the server.
-
-functionselfname="$(basename "$(readlink -f "${BASH_SOURCE[0]}")")"
-
-fn_print_information_nl "${gamename} will not function without resources!"
-echo -e "	* install default resources using ./${selfname} install-default-resources"
-echo -e "	* download resources from https://community.multitheftauto.com"
diff --git a/lgsm/functions/install_retry.sh b/lgsm/functions/install_retry.sh
deleted file mode 100644
index a36b4fb38..000000000
--- a/lgsm/functions/install_retry.sh
+++ /dev/null
@@ -1,16 +0,0 @@
-#!/bin/bash
-# LinuxGSM install_retry.sh module
-# Author: Daniel Gibbs
-# Contributors: http://linuxgsm.com/contrib
-# Website: https://linuxgsm.com
-# Description: Asks for installation retry after failure.
-
-functionselfname="$(basename "$(readlink -f "${BASH_SOURCE[0]}")")"
-
-if fn_prompt_yn "Retry install?" Y; then
-	command_install.sh
-	core_exit.sh
-else
-	exitcode=0
-	core_exit.sh
-fi
diff --git a/lgsm/functions/install_server_dir.sh b/lgsm/functions/install_server_dir.sh
deleted file mode 100644
index 658f4360c..000000000
--- a/lgsm/functions/install_server_dir.sh
+++ /dev/null
@@ -1,26 +0,0 @@
-#!/bin/bash
-# LinuxGSM install_server_dir.sh module
-# Author: Daniel Gibbs
-# Contributors: http://linuxgsm.com/contrib
-# Website: https://linuxgsm.com
-# Description: Creates the server directory.
-
-functionselfname="$(basename "$(readlink -f "${BASH_SOURCE[0]}")")"
-
-echo -e ""
-echo -e "${lightyellow}Server Directory${default}"
-echo -e "================================="
-fn_sleep_time
-if [ -d "${serverfiles}" ]; then
-	fn_print_warning_nl "A server is already installed here."
-fi
-pwd
-if [ -z "${autoinstall}" ]; then
-	if ! fn_prompt_yn "Continue?" Y; then
-		exitcode=0
-		core_exit.sh
-	fi
-fi
-if [ ! -d "${serverfiles}" ]; then
-	mkdir -v "${serverfiles}"
-fi
diff --git a/lgsm/functions/install_server_files.sh b/lgsm/functions/install_server_files.sh
deleted file mode 100644
index e550e1455..000000000
--- a/lgsm/functions/install_server_files.sh
+++ /dev/null
@@ -1,255 +0,0 @@
-#!/bin/bash
-# LinuxGSM install_server_files.sh module
-# Author: Daniel Gibbs
-# Contributors: http://linuxgsm.com/contrib
-# Website: https://linuxgsm.com
-# Description: Installs server files.
-
-functionselfname="$(basename "$(readlink -f "${BASH_SOURCE[0]}")")"
-
-fn_install_server_files() {
-	if [ "${shortname}" == "ahl" ]; then
-		remote_fileurl="http://linuxgsm.download/ActionHalfLife/action_halflife-1.0.tar.xz"
-		local_filedir="${tmpdir}"
-		local_filename="action_halflife-1.0.tar.xz"
-		chmodx="nochmodx" run="norun"
-		force="noforce"
-		md5="61d7b79fd714888b6d65944fdaafa94a"
-	elif [ "${shortname}" == "bf1942" ]; then
-		remote_fileurl="http://linuxgsm.download/BattleField1942/bf1942_lnxded-1.61-hacked-to-1.612.full.tar.xz"
-		local_filedir="${tmpdir}"
-		local_filename="bf1942_lnxded-1.61-hacked-to-1.612.full.tar.xz"
-		chmodx="nochmodx" run="norun"
-		force="noforce"
-		md5="4223bf4ed85f5162c24b2cba51249b9e"
-	elif [ "${shortname}" == "bfv" ]; then
-		remote_fileurl="http://linuxgsm.download/BattlefieldVietnam/bfv_linded-v1.21-20041207_patch.tar.xz"
-		local_filedir="${tmpdir}"
-		local_filename="bfv_linded-v1.21-20041207_patch.tar.xz"
-		chmodx="nochmodx" run="norun"
-		force="noforce"
-		md5="e3b4962cdd9d41e23c6fed65101bccde"
-	elif [ "${shortname}" == "bb" ]; then
-		remote_fileurl="http://linuxgsm.download/BrainBread/brainbread-v1.2-linuxserver.tar.xz"
-		local_filedir="${tmpdir}"
-		local_filename="brainbread-v1.2-linuxserver.tar.xz"
-		chmodx="nochmodx" run="norun"
-		force="noforce"
-		md5="55f227183b736397806d5b6db6143f15"
-	elif [ "${shortname}" == "cod" ]; then
-		remote_fileurl="http://linuxgsm.download/CallOfDuty/cod-lnxded-1.5b-full.tar.xz"
-		local_filedir="${tmpdir}"
-		local_filename="cod-lnxded-1.5-large.tar.xz"
-		chmodx="nochmodx" run="norun"
-		force="noforce"
-		md5="ee0ad1ccbfa1fd27fde01a4a431a5c2f"
-	elif [ "${shortname}" == "coduo" ]; then
-		remote_fileurl="http://linuxgsm.download/CallOfDutyUnitedOffensive/coduo-lnxded-1.51b-full.tar.xz"
-		local_filedir="${tmpdir}"
-		local_filename="coduo-lnxded-1.51b-full.tar.xz"
-		chmodx="nochmodx" run="norun"
-		force="noforce"
-		md5="35cabccd67adcda44aaebc59405915b9"
-	elif [ "${shortname}" == "cod2" ]; then
-		remote_fileurl="http://linuxgsm.download/CallOfDuty2/cod2-lnxded-1.3-full.tar.xz"
-		local_filedir="${tmpdir}"
-		local_filename="cod2-lnxded-1.3-full.tar.xz"
-		chmodx="nochmodx" run="norun"
-		force="noforce"
-		md5="b8c4c611f01627dd43348e78478a3d41"
-	elif [ "${shortname}" == "cod4" ]; then
-		remote_fileurl="http://linuxgsm.download/CallOfDuty4/cod4x18_lnxded.tar.xz"
-		local_filedir="${tmpdir}"
-		local_filename="cod4x18_lnxded.tar.xz"
-		chmodx="nochmodx" run="norun"
-		force="noforce"
-		md5="d255b59b9756d7dbead67718208512ee"
-	elif [ "${shortname}" == "codwaw" ]; then
-		remote_fileurl="http://linuxgsm.download/CallOfDutyWorldAtWar/codwaw-lnxded-1.7-full.tar.xz"
-		local_filedir="${tmpdir}"
-		local_filename="codwaw-lnxded-1.7-full.tar.xz"
-		chmodx="nochmodx" run="norun"
-		force="noforce"
-		md5="2c6be1bb66ea631b9b2e7ae6216c6680"
-	elif [ "${shortname}" == "etl" ]; then
-		remote_fileurl="http://linuxgsm.download/WolfensteinEnemyTerritory/etlegacy-v2.78.1-i386-et-260b.tar.xz"
-		local_filedir="${tmpdir}"
-		local_filename="etlegacy-v2.78.1-i386-et-260b.tar.xz"
-		chmodx="nochmodx" run="norun"
-		force="noforce"
-		md5="7c08b52cb09b30eadb98ea05ef780fc7"
-	elif [ "${shortname}" == "mohaa" ]; then
-		remote_fileurl="http://linuxgsm.download/MedalofHonorAlliedAssault/moh_revival_v1.12_RC3.5.1.tar.xz"
-		local_filedir="${tmpdir}"
-		local_filename="moh_revival_v1.12_RC3.5.1.tar.xz"
-		chmodx="nochmodx" run="norun"
-		force="noforce"
-		md5="7c664538999252eeaf2b6d9949416480"
-	elif [ "${shortname}" == "ns" ]; then
-		remote_fileurl="http://linuxgsm.download/NaturalSelection/ns_dedicated_server_v32.tar.xz"
-		local_filedir="${tmpdir}"
-		local_filename="ns_dedicated_server_v32.tar.xz"
-		chmodx="nochmodx" run="norun"
-		force="noforce"
-		md5="23ec3cadd93d8bb1c475bad5b9cce370"
-	elif [ "${shortname}" == "q2" ]; then
-		remote_fileurl="http://linuxgsm.download/Quake2/quake2-3.20-glibc-i386-full-linux2.0.tar.xz"
-		local_filedir="${tmpdir}"
-		local_filename="quake2-3.20-glibc-i386-full-linux2.0.tar.xz"
-		chmodx="nochmodx" run="norun"
-		force="noforce"
-		md5="2908164a32d4808bb720f2161f6b0c82"
-	elif [ "${shortname}" == "q3" ]; then
-		remote_fileurl="http://linuxgsm.download/Quake3/quake3-1.32c-x86-full-linux.tar.xz"
-		local_filedir="${tmpdir}"
-		local_filename="quake3-1.32c-x86-full-linux.tar.xz"
-		chmodx="nochmodx" run="norun"
-		force="noforce"
-		md5="b0e26d8919fe9313fb9d8ded2360f3db"
-	elif [ "${shortname}" == "qw" ]; then
-		remote_fileurl="http://linuxgsm.download/QuakeWorld/nquake.server.linux.190506.full.tar.xz"
-		local_filedir="${tmpdir}"
-		local_filename="nquake.server.linux.190506.full.tar.xz"
-		chmodx="nochmodx" run="norun"
-		force="noforce"
-		md5="82055b7d973206c13a606db8ba288d03"
-	elif [ "${shortname}" == "rtcw" ]; then
-		remote_fileurl="http://linuxgsm.download/ReturnToCastleWolfenstein/iortcw-1.51c-x86_64-server-linux-20190507.tar.xz"
-		local_filedir="${tmpdir}"
-		local_filename="iortcw-1.51c-x86_64-server-linux-20190507.tar.xz"
-		chmodx="nochmodx" run="norun"
-		force="noforce"
-		md5="df6ff664d37dd0d22787848bdb3cac5f"
-	elif [ "${shortname}" == "sfc" ]; then
-		remote_fileurl="http://linuxgsm.download/SourceFortsClassic/SFClassic-1.0-RC7-fix.tar.xz"
-		local_filedir="${tmpdir}"
-		local_filename="SFClassic-1.0-RC7-fix.tar.xz"
-		chmodx="nochmodx" run="norun"
-		force="noforce"
-		md5="70077137185700e28fe6bbb6021d12bc"
-	elif [ "${shortname}" == "sof2" ]; then
-		remote_fileurl="http://linuxgsm.download/SoldierOfFortune2/sof2gold-1.03.tar.xz"
-		local_filedir="${tmpdir}"
-		local_filename="sof2gold-1.03.tar.xz"
-		chmodx="nochmodx" run="norun"
-		force="noforce"
-		md5="201e23bab04207d00ce813d001c483d9"
-	elif [ "${shortname}" == "ts" ]; then
-		remote_fileurl="http://linuxgsm.download/TheSpecialists/ts-3-linux-final.tar.xz"
-		local_filedir="${tmpdir}"
-		local_filename="ts-3-linux-final.tar.xz"
-		chmodx="nochmodx" run="norun"
-		force="noforce"
-		md5="3c66ecff6e3644f7ac88015732a0fb93"
-	elif [ "${shortname}" == "ut2k4" ]; then
-		remote_fileurl="http://linuxgsm.download/UnrealTournament2004/ut2004-server-3369-3-ultimate-linux.tar.xz"
-		local_filedir="${tmpdir}"
-		local_filename="ut2004-server-3369-3-ultimate-linux.tar.xz"
-		chmodx="nochmodx" run="norun"
-		force="noforce"
-		md5="9fceaab68554749f4b45be66613b9a15"
-	elif [ "${shortname}" == "ut99" ]; then
-		remote_fileurl="http://linuxgsm.download/UnrealTournament99/ut99-server-469b-ultimate-linux.tar.xz"
-		local_filedir="${tmpdir}"
-		local_filename="ut99-server-469b-ultimate-linux.tar.xz"
-		chmodx="nochmodx" run="norun"
-		force="noforce"
-		md5="dba3f1122a5e60ee45ece7422fcf78f5"
-	elif [ "${shortname}" == "ut" ]; then
-		remote_fileurl="http://linuxgsm.download/UnrealTournament/UnrealTournament-Server-XAN-3525360-Linux.tar.xz"
-		local_filedir="${tmpdir}"
-		local_filename="UnrealTournament-Server-XAN-3525360-Linux.tar.xz"
-		chmodx="noexecute" run="norun"
-		force="noforce"
-		md5="41dd92015713a78211eaccf503b72393"
-	elif [ "${shortname}" == "ut3" ]; then
-		remote_fileurl="http://linuxgsm.download/UnrealTournament3/UT3-linux-server-2.1.tar.xz"
-		local_filedir="${tmpdir}"
-		local_filename="UT3-linux-server-2.1.tar.xz"
-		chmodx="nochmodx" run="norun"
-		force="noforce"
-		md5="8876cca61e3f83ea08db25208bde6ac6"
-	elif [ "${shortname}" == "vs" ]; then
-		remote_fileurl="http://linuxgsm.download/VampireSlayer/vs_l-6.0_full.tar.xz"
-		local_filedir="${tmpdir}"
-		local_filename="vs_l-6.0_full.tar.xz"
-		chmodx="nochmodx" run="norun"
-		force="noforce"
-		md5="b322f79e0abd31847493c52acf802667"
-	elif [ "${shortname}" == "wet" ]; then
-		remote_fileurl="http://linuxgsm.download/WolfensteinEnemyTerritory/enemy-territory.260b.tar.xz"
-		local_filedir="${tmpdir}"
-		local_filename="enemy-territory.260b.tar.xz"
-		chmodx="nochmodx" run="norun"
-		force="noforce"
-		md5="581a333cc7eacda2f56d5a00fe11eafa"
-	elif [ "${shortname}" == "samp" ]; then
-		remote_fileurl="https://files.sa-mp.com/samp037svr_R2-1.tar.gz"
-		local_filedir="${tmpdir}"
-		local_filename="samp037svr_R2-1.tar.gz"
-		chmodx="nochmodx" run="norun"
-		force="noforce"
-		md5="93705e165550c97484678236749198a4"
-	elif [ "${shortname}" == "zmr" ]; then
-		remote_fileurl="http://linuxgsm.download/ZombieMasterReborn/zombie_master_reborn_b6_1.tar.xz"
-		local_filedir="${tmpdir}"
-		local_filename="zombie_master_reborn_b6_1.tar.xz"
-		chmodx="nochmodx" run="norun"
-		force="noforce"
-		md5="0188ae86dbc9376f11ae3032dba2d665"
-	else
-		fn_print_fail_nl "Installing ${gamename} Server failed, missing default configuration"
-		fn_script_log_fatal "Installing ${gamename} Server failed, missing default configuration"
-	fi
-	fn_fetch_file "${remote_fileurl}" "" "" "" "${local_filedir}" "${local_filename}" "${chmodx}" "${run}" "${forcedl}" "${md5}"
-	fn_dl_extract "${local_filedir}" "${local_filename}" "${serverfiles}"
-}
-
-echo -e ""
-echo -e "${lightyellow}Installing ${gamename} Server${default}"
-echo -e "================================="
-fn_sleep_time
-
-if [ "${appid}" ]; then
-	remotelocation="SteamCMD"
-	fn_dl_steamcmd
-fi
-
-if [ "${shortname}" == "ts3" ]; then
-	update_ts3.sh
-elif [ "${shortname}" == "mc" ]; then
-	install_eula.sh
-	update_minecraft.sh
-elif [ "${shortname}" == "mcb" ]; then
-	update_minecraft_bedrock.sh
-elif [ "${shortname}" == "pmc" ]; then
-	install_eula.sh
-	update_papermc.sh
-elif [ "${shortname}" == "wmc" ] || [ "${shortname}" == "vpmc" ]; then
-	update_papermc.sh
-elif [ "${shortname}" == "mta" ]; then
-	update_mta.sh
-elif [ "${shortname}" == "fctr" ]; then
-	update_factorio.sh
-	install_factorio_save.sh
-elif [ "${shortname}" == "jk2" ]; then
-	update_jediknight2.sh
-elif [ "${shortname}" == "vints" ]; then
-	update_vintagestory.sh
-elif [ "${shortname}" == "ut99" ]; then
-	fn_install_server_files
-	update_ut99.sh
-elif [ -z "${appid}" ] || [ "${shortname}" == "ahl" ] || [ "${shortname}" == "bb" ] || [ "${shortname}" == "ns" ] || [ "${shortname}" == "sfc" ] || [ "${shortname}" == "ts" ] || [ "${shortname}" == "vs" ] || [ "${shortname}" == "zmr" ]; then
-	if [ "${shortname}" == "ut" ]; then
-		install_eula.sh
-	fi
-	fn_install_server_files
-fi
-
-if [ -z "${autoinstall}" ]; then
-	echo -e ""
-	echo -e "================================="
-	if ! fn_prompt_yn "Was the install successful?" Y; then
-		install_retry.sh
-	fi
-fi
diff --git a/lgsm/functions/install_squad_license.sh b/lgsm/functions/install_squad_license.sh
deleted file mode 100644
index 181646e85..000000000
--- a/lgsm/functions/install_squad_license.sh
+++ /dev/null
@@ -1,25 +0,0 @@
-#!/bin/bash
-# LinuxGSM install_squad_license.sh module
-# Author: Daniel Gibbs
-# Contributors: http://linuxgsm.com/contrib
-# Website: https://linuxgsm.com
-# Description: Configures the Squad server's license.
-
-functionselfname="$(basename "$(readlink -f "${BASH_SOURCE[0]}")")"
-
-echo -e ""
-echo -e "${lightyellow}Squad Server License${default}"
-echo -e "================================="
-fn_sleep_time
-echo -e "Server license is an optional feature for ${gamename} server"
-fn_script_log_info "Server license is an optional feature for ${gamename} server"
-
-echo -e "Get more info and a server license here:"
-echo -e "http://forums.joinsquad.com/topic/16519-server-licensing-general-info/"
-fn_script_log_info "Get more info and a server license here:"
-fn_script_log_info "http://forums.joinsquad.com/topic/16519-server-licensing-general-info/"
-echo -e ""
-fn_sleep_time
-echo -e "The Squad server license can be changed by editing ${servercfgdir}/License.cfg."
-fn_script_log_info "The Squad server license can be changed by editing ${selfname}."
-echo -e ""
diff --git a/lgsm/functions/install_stats.sh b/lgsm/functions/install_stats.sh
deleted file mode 100644
index d3b45b40b..000000000
--- a/lgsm/functions/install_stats.sh
+++ /dev/null
@@ -1,28 +0,0 @@
-#!/bin/bash
-# LinuxGSM install_stats.sh module
-# Author: Daniel Gibbs
-# Contributors: http://linuxgsm.com/contrib
-# Website: https://linuxgsm.com
-# Description: Enabled LinuxGSM Stats.
-
-functionselfname="$(basename "$(readlink -f "${BASH_SOURCE[0]}")")"
-
-echo -e ""
-echo -e "${lightyellow}LinuxGSM Stats${default}"
-echo -e "================================="
-fn_sleep_time
-echo -e "Assist LinuxGSM development by sending anonymous stats to developers."
-echo -e "More info: https://docs.linuxgsm.com/configuration/linuxgsm-stats"
-echo -e "The following info will be sent:"
-echo -e "* game server"
-echo -e "* distro"
-echo -e "* game server resource usage"
-echo -e "* server hardware info"
-if [ -z "${autoinstall}" ]; then
-	if fn_prompt_yn "Allow anonymous usage statistics?" Y; then
-		echo "stats=\"on\"" >> "${configdirserver}/common.cfg"
-		fn_print_information_nl "Stats setting is now enabled in common.cfg."
-	fi
-else
-	fn_print_information_nl "auto-install leaves stats off by default. Stats can be enabled in common.cfg"
-fi
diff --git a/lgsm/functions/install_steamcmd.sh b/lgsm/functions/install_steamcmd.sh
deleted file mode 100644
index b1e64a42c..000000000
--- a/lgsm/functions/install_steamcmd.sh
+++ /dev/null
@@ -1,14 +0,0 @@
-#!/bin/bash
-# LinuxGSM install_steamcmd.sh module
-# Author: Daniel Gibbs
-# Contributors: http://linuxgsm.com/contrib
-# Website: https://linuxgsm.com
-# Description: Downloads SteamCMD on install.
-
-functionselfname="$(basename "$(readlink -f "${BASH_SOURCE[0]}")")"
-
-echo -e ""
-echo -e "${lightyellow}Installing SteamCMD${default}"
-echo -e "================================="
-fn_sleep_time
-check_steamcmd.sh
diff --git a/lgsm/functions/install_ts3db.sh b/lgsm/functions/install_ts3db.sh
deleted file mode 100644
index ed879cd28..000000000
--- a/lgsm/functions/install_ts3db.sh
+++ /dev/null
@@ -1,76 +0,0 @@
-#!/bin/bash
-# LinuxGSM install_ts3db.sh module
-# Author: Daniel Gibbs
-# Contributors: http://linuxgsm.com/contrib
-# Website: https://linuxgsm.com
-# Description: Installs the database server MariaDB for TeamSpeak 3.
-
-functionselfname="$(basename "$(readlink -f "${BASH_SOURCE[0]}")")"
-
-fn_install_ts3db_mariadb() {
-	if [ ! -f "${serverfiles}/libts3db_mariadb.so" ]; then
-		echo -e "copying libmariadb.so.2...\c"
-		cp "${serverfiles}/redist/libmariadb.so.2" "${serverfiles}"
-		local exitcode=$?
-		if [ "${exitcode}" != "0" ]; then
-			fn_print_fail_eol_nl
-			fn_script_log_fatal "copying libmariadb.so.2"
-			core_exit.sh
-		else
-			fn_print_ok_eol_nl
-			fn_script_log_pass "copying libmariadb.so.2"
-		fi
-	fi
-
-	echo -e ""
-	echo -e "${lightyellow}Configure ${gamename} Server for MariaDB${default}"
-	echo -e "================================="
-	fn_sleep_time
-	read -rp "Enter MariaDB hostname: " mariahostname
-	read -rp "Enter MariaDB port: " mariaport
-	read -rp "Enter MariaDB username: " mariausername
-	read -rp "Enter MariaDB password: " mariapassword
-	read -rp "Enter MariaDB database name: " mariadbname
-	read -rp "Enter MariaDB socket path: " mariadbsocket
-
-	{
-		echo -e "[config]"
-		echo -e "host='${mariahostname}'"
-		echo -e "port='${mariaport}'"
-		echo -e "username='${mariausername}'"
-		echo -e "password='${mariapassword}'"
-		echo -e "database='${mariadbname}'"
-		echo -e "socket='${mariadbsocket}'"
-	} >> "${servercfgdir}/ts3db_mariadb.ini"
-	sed -i "s/dbplugin=ts3db_sqlite3/dbplugin=ts3db_mariadb/g" "${servercfgfullpath}"
-	sed -i "s/dbpluginparameter=/dbpluginparameter=ts3db_mariadb.ini/g" "${servercfgfullpath}"
-	sed -i "s/dbsqlcreatepath=create_sqlite\//dbsqlcreatepath=create_mariadb\//g" "${servercfgfullpath}"
-	echo -e "updating ts3db_mariadb.ini."
-	fn_sleep_time
-}
-
-echo -e ""
-echo -e "${lightyellow}Select Database${default}"
-echo -e "================================="
-fn_sleep_time
-if [ -z "${autoinstall}" ]; then
-	if fn_prompt_yn "Do you want to use MariaDB instead of sqlite? (MariaDB must be pre-configured)" N; then
-		fn_install_ts3db_mariadb
-	fi
-else
-	fn_print_information_nl "./${selfname} auto-install is uses sqlite. For MariaDB use ./${selfname} install"
-fi
-
-install_eula.sh
-
-echo -e ""
-echo -e "${lightyellow}Getting Privilege Key${default}"
-echo -e "================================="
-fn_sleep_time
-fn_print_information_nl "Save these details for later."
-fn_print_information_nl "Key also saved in:"
-echo -e "${serverfiles}/privilege_key.txt"
-cd "${executabledir}" || exit
-./ts3server_startscript.sh start inifile=ts3-server.ini 2>&1 | tee "${serverfiles}/privilege_key.txt"
-sleep 5
-./ts3server_startscript.sh stop
diff --git a/lgsm/functions/install_ut2k4_key.sh b/lgsm/functions/install_ut2k4_key.sh
deleted file mode 100644
index 124052d05..000000000
--- a/lgsm/functions/install_ut2k4_key.sh
+++ /dev/null
@@ -1,30 +0,0 @@
-#!/bin/bash
-# LinuxGSM install_ut2k4_key.sh module
-# Author: Daniel Gibbs
-# Contributors: http://linuxgsm.com/contrib
-# Website: https://linuxgsm.com
-# Description: Activates ut2k4 server with given key.
-
-functionselfname="$(basename "$(readlink -f "${BASH_SOURCE[0]}")")"
-
-echo -e ""
-echo -e "${lightyellow}Enter ${gamename} CD Key${default}"
-echo -e "================================="
-fn_sleep_time
-echo -e "To get your server listed on the Master Server list"
-echo -e "you must get a free CD key. Get a key here:"
-echo -e "https://www.epicgames.com/unrealtournament/forums/cdkey.php?2004"
-echo -e ""
-if [ -z "${autoinstall}" ]; then
-	echo -e "Once you have the key enter it below"
-	echo -n "KEY: "
-	read -r CODE
-	echo -e ""\""CDKey"\""="\""${CODE}"\""" > "${systemdir}/cdkey"
-	if [ -f "${systemdir}/cdkey" ]; then
-		fn_script_log_info "UT2K4 Server CD Key created"
-	fi
-else
-	echo -e "You can add your key using the following command"
-	echo -e "./${selfname} server-cd-key"
-fi
-echo -e ""
diff --git a/lgsm/functions/mods_core.sh b/lgsm/functions/mods_core.sh
deleted file mode 100644
index 8e4ade771..000000000
--- a/lgsm/functions/mods_core.sh
+++ /dev/null
@@ -1,755 +0,0 @@
-#!/bin/bash
-# LinuxGSM command_mods_install.sh module
-# Author: Daniel Gibbs
-# Contributors: http://linuxgsm.com/contrib
-# Website: https://linuxgsm.com
-# Description: Core functions for mods list/install/update/remove
-
-functionselfname="$(basename "$(readlink -f "${BASH_SOURCE[0]}")")"
-
-# Files and Directories.
-modsdir="${lgsmdir}/mods"
-modstmpdir="${modsdir}/tmp"
-extractdest="${modstmpdir}/extract"
-modsinstalledlist="installed-mods.txt"
-modsinstalledlistfullpath="${modsdir}/${modsinstalledlist}"
-
-## Installation.
-
-# Download management.
-fn_mod_install_files() {
-	fn_fetch_file "${modurl}" "" "" "" "${modstmpdir}" "${modfilename}"
-	# Check if variable is valid checking if file has been downloaded and exists.
-	if [ ! -f "${modstmpdir}/${modfilename}" ]; then
-		fn_print_failure "An issue occurred downloading ${modprettyname}"
-		fn_script_log_fatal "An issue occurred downloading ${modprettyname}"
-		core_exit.sh
-	fi
-	if [ ! -d "${extractdest}" ]; then
-		mkdir -p "${extractdest}"
-	fi
-	fn_dl_extract "${modstmpdir}" "${modfilename}" "${extractdest}"
-}
-
-# Convert mod files to lowercase if needed.
-fn_mod_lowercase() {
-	# Checking lowercase settings from mods array definition
-	if [ "${modlowercase}" == "LowercaseOn" ]; then
-		echo -en "converting ${modprettyname} files to lowercase..."
-		fn_sleep_time
-		fn_script_log_info "Converting ${modprettyname} files to lowercase"
-		# Total files and directories for the mod, to output to the user
-		fileswc=$(find "${extractdest}" | wc -l)
-		# Total uppercase files and directories for the mod, to output to the user
-		filesupperwc=$(find "${extractdest}" -name '*[[:upper:]]*' | wc -l)
-		fn_script_log_info "Found ${filesupperwc} uppercase files out of ${fileswc}, converting"
-		echo -en "Found ${filesupperwc} uppercase files out of ${fileswc}, converting..."
-		# Convert files and directories starting from the deepest to prevent issues (-depth argument)
-		while read -r src; do
-			# We have to convert only the last file from the path, otherwise we will fail to convert anything if a parent dir has any uppercase
-			# therefore, we have to separate the end of the filename to only lowercase it rather than the whole line
-			# Gather parent dir, filename lowercase filename, and set lowercase destination name
-			latestparentdir=$(dirname "${src}")
-			latestfilelc=$(basename "${src}" | tr '[:upper:]' '[:lower:]')
-			dst="${latestparentdir}/${latestfilelc}"
-			# Only convert if destination does not already exist for some reason
-			if [ ! -e "${dst}" ]; then
-				# Finally we can rename the file
-				mv "${src}" "${dst}"
-				# Exit if it fails for any reason
-				local exitcode=$?
-				if [ "${exitcode}" != 0 ]; then
-					fn_print_fail_eol_nl
-					core_exit.sh
-				fi
-			fi
-		done < <(find "${extractdest}" -depth -name '*[[:upper:]]*')
-		fn_print_ok_eol_nl
-	fi
-}
-
-# Create ${modcommand}-files.txt containing the full extracted file/directory list.
-fn_mod_create_filelist() {
-	echo -en "building ${modcommand}-files.txt..."
-	fn_sleep_time
-	# ${modsdir}/${modcommand}-files.txt.
-	find "${extractdest}" -mindepth 1 -printf '%P\n' > "${modsdir}/${modcommand}-files.txt"
-	local exitcode=$?
-	if [ "${exitcode}" != 0 ]; then
-		fn_print_fail_eol_nl
-		fn_script_log_fatal "Building ${modsdir}/${modcommand}-files.txt"
-		core_exit.sh
-	else
-		fn_print_ok_eol_nl
-		fn_script_log_pass "Building ${modsdir}/${modcommand}-files.txt"
-	fi
-	# Adding removed files if needed.
-	if [ -f "${modsdir}/.removedfiles.tmp" ]; then
-		cat "${modsdir}/.removedfiles.tmp" >> "${modsdir}/${modcommand}-files.txt"
-	fi
-}
-
-# Copy the mod into serverfiles.
-fn_mod_copy_destination() {
-	echo -en "copying ${modprettyname} to ${modinstalldir}..."
-	fn_sleep_time
-	cp -Rf "${extractdest}/." "${modinstalldir}/"
-	local exitcode=$?
-	if [ "${exitcode}" != 0 ]; then
-		fn_print_fail_eol_nl
-		fn_script_log_fatal "Copying ${modprettyname} to ${modinstalldir}"
-	else
-		fn_print_ok_eol_nl
-		fn_script_log_pass "Copying ${modprettyname} to ${modinstalldir}"
-	fi
-}
-
-# Add the mod to the installed-mods.txt.
-fn_mod_add_list() {
-	if [ -z "$(sed -n "/^${modcommand}$/p" "${modsinstalledlistfullpath}")" ]; then
-		echo -e "${modcommand}" >> "${modsinstalledlistfullpath}"
-		fn_script_log_info "${modcommand} added to ${modsinstalledlist}"
-	fi
-}
-
-# Prevent sensitive directories from being erased upon uninstall by removing them from: ${modcommand}-files.txt.
-fn_mod_tidy_files_list() {
-	# Check file list validity.
-	fn_check_mod_files_list
-	# Output to the user
-	echo -en "tidy up ${modcommand}-files.txt..."
-	fn_sleep_time
-	fn_script_log_info "Tidy up ${modcommand}-files.txt"
-	# Lines/files to remove from file list (end with ";" separator).
-	removefromlist="cfg;addons;RustDedicated_Data;RustDedicated_Data\/Managed;RustDedicated_Data\/Managed\/x86;RustDedicated_Data\/Managed\/x64;"
-	# Loop through files to remove from file list,
-	# generate elements to remove from list.
-	removefromlistamount=$(echo -e "${removefromlist}" | awk -F ';' '{ print NF }')
-	# Test all subvalue of "removefromlist" using the ";" separator.
-	for ((filesindex = 1; filesindex < removefromlistamount; filesindex++)); do
-		# Put current file into test variable.
-		removefilevar=$(echo -e "${removefromlist}" | awk -F ';' -v x=${filesindex} '{ print $x }')
-		# Delete line(s) matching exactly.
-		sed -i "/^${removefilevar}$/d" "${modsdir}/${modcommand}-files.txt"
-		# Exit on error.
-		local exitcode=$?
-		if [ "${exitcode}" != 0 ]; then
-			fn_print_fail_eol_nl
-			fn_script_log_fatal "Error while tidying line: ${removefilevar} from: ${modsdir}/${modcommand}-files.txt"
-			core_exit.sh
-			break
-		fi
-	done
-	fn_print_ok_eol_nl
-	# Sourcemod fix
-	# Remove metamod from sourcemod fileslist.
-	if [ "${modcommand}" == "sourcemod" ]; then
-		# Remove addons/metamod & addons/metamod/sourcemod.vdf from ${modcommand}-files.txt.
-		sed -i "/^addons\/metamod$/d" "${modsdir}/${modcommand}-files.txt"
-		sed -i "/^addons\/metamod\/sourcemod.vdf$/d" "${modsdir}/${modcommand}-files.txt"
-	fi
-
-	# Remove common paths from deletion list (Add your sourcemod mod here)
-	if [ "${modcommand}" == "gokz" ] || [ "${modcommand}" == "ttt" ] || [ "${modcommand}" == "steamworks" ] || [ "${modcommand}" == "get5" ]; then
-		sed -i "/^addons\/sourcemod$/d" "${modsdir}/${modcommand}-files.txt"
-		sed -i "/^addons\/sourcemod\/configs$/d" "${modsdir}/${modcommand}-files.txt"
-		sed -i "/^addons\/sourcemod\/extensions$/d" "${modsdir}/${modcommand}-files.txt"
-		sed -i "/^addons\/sourcemod\/logs$/d" "${modsdir}/${modcommand}-files.txt"
-		sed -i "/^addons\/sourcemod\/plugins$/d" "${modsdir}/${modcommand}-files.txt"
-		sed -i "/^addons\/sourcemod\/plugins\/disabled$/d" "${modsdir}/${modcommand}-files.txt"
-		sed -i "/^addons\/sourcemod\/scripting$/d" "${modsdir}/${modcommand}-files.txt"
-		sed -i "/^addons\/sourcemod\/scripting\/include$/d" "${modsdir}/${modcommand}-files.txt"
-		sed -i "/^addons\/sourcemod\/translations$/d" "${modsdir}/${modcommand}-files.txt"
-		# Don't delete directories of translations like 'fr', 'sv', 'de', etc
-		sed -i "/^addons\/sourcemod\/translations\/[A-Za-z0-9_]*$/d" "${modsdir}/${modcommand}-files.txt"
-		sed -i "/^cfg\/sourcemod$/d" "${modsdir}/${modcommand}-files.txt"
-		sed -i "/^maps$/d" "${modsdir}/${modcommand}-files.txt"
-		sed -i "/^materialss$/d" "${modsdir}/${modcommand}-files.txt"
-		sed -i "/^materials\/models$/d" "${modsdir}/${modcommand}-files.txt"
-		sed -i "/^materials\/models\/weapons$/d" "${modsdir}/${modcommand}-files.txt"
-		sed -i "/^materials\/darkness$/d" "${modsdir}/${modcommand}-files.txt"
-		sed -i "/^materials\/decals$/d" "${modsdir}/${modcommand}-files.txt"
-		sed -i "/^materials\/overlays$/d" "${modsdir}/${modcommand}-files.txt"
-		sed -i "/^models$/d" "${modsdir}/${modcommand}-files.txt"
-		sed -i "/^models\/weapons$/d" "${modsdir}/${modcommand}-files.txt"
-		sed -i "/^sound$/d" "${modsdir}/${modcommand}-files.txt"
-		sed -i "/^sound\/weapons$/d" "${modsdir}/${modcommand}-files.txt"
-	fi
-
-	# Remove paths of specific mods from deletion list
-	if [ "${modcommand}" == "gokz" ]; then
-		sed -i "/^addons\/sourcemod\/scripting\/include\/smjansson.inc$/d" "${modsdir}/${modcommand}-files.txt"
-		sed -i "/^addons\/sourcemod\/scripting\/include\/GlobalAPI-Core.inc$/d" "${modsdir}/${modcommand}-files.txt"
-		sed -i "/^addons\/sourcemod\/scripting\/include\/sourcebanspp.inc$/d" "${modsdir}/${modcommand}-files.txt"
-		sed -i "/^addons\/sourcemod\/scripting\/include\/autoexecconfig.inc$/d" "${modsdir}/${modcommand}-files.txt"
-		sed -i "/^addons\/sourcemod\/scripting\/include\/colorvariables.inc$/d" "${modsdir}/${modcommand}-files.txt"
-		sed -i "/^addons\/sourcemod\/scripting\/include\/movementapi.inc$/d" "${modsdir}/${modcommand}-files.txt"
-		sed -i "/^addons\/sourcemod\/scripting\/include\/movement.inc$/d" "${modsdir}/${modcommand}-files.txt"
-		sed -i "/^addons\/sourcemod\/scripting\/include\/dhooks.inc$/d" "${modsdir}/${modcommand}-files.txt"
-		sed -i "/^addons\/sourcemod\/scripting\/include\/updater.inc$/d" "${modsdir}/${modcommand}-files.txt"
-	fi
-}
-
-## Information Gathering.
-
-# Get details of a mod any (relevant and unique, such as full mod name or install command) value.
-fn_mod_get_info() {
-	# Variable to know when job is done.
-	modinfocommand="0"
-	# Find entry in global array.
-	for ((index = 0; index <= ${#mods_global_array[@]}; index++)); do
-		# When entry is found.
-		if [ "${mods_global_array[index]}" == "${currentmod}" ]; then
-			# Go back to the previous "MOD" separator.
-			for ((index = index; index <= ${#mods_global_array[@]}; index--)); do
-				# When "MOD" is found.
-				if [ "${mods_global_array[index]}" == "MOD" ]; then
-					# Get info.
-					fn_mods_define
-					modinfocommand="1"
-					break
-				fi
-			done
-		fi
-		# Exit the loop if job is done.
-		if [ "${modinfocommand}" == "1" ]; then
-			break
-		fi
-	done
-
-	# What happens if mod is not found.
-	if [ "${modinfocommand}" == "0" ]; then
-		fn_script_log_error "Could not find information for ${currentmod}"
-		fn_print_error_nl "Could not find information for ${currentmod}"
-		core_exit.sh
-	fi
-}
-
-# Define all variables for a mod at once when index is set to a separator.
-fn_mods_define() {
-	if [ -z "$index" ]; then
-		fn_script_log_fatal "index variable not set. Please report an issue."
-		fn_print_error "index variable not set. Please report an issue."
-		echo -e "* https://github.com/GameServerManagers/LinuxGSM/issues"
-		core_exit.sh
-	fi
-	modcommand="${mods_global_array[index + 1]}"
-	modprettyname="${mods_global_array[index + 2]}"
-	modurl="${mods_global_array[index + 3]}"
-	modfilename="${mods_global_array[index + 4]}"
-	modsubdirs="${mods_global_array[index + 5]}"
-	modlowercase="${mods_global_array[index + 6]}"
-	modinstalldir="${mods_global_array[index + 7]}"
-	modkeepfiles="${mods_global_array[index + 8]}"
-	modengines="${mods_global_array[index + 9]}"
-	modgames="${mods_global_array[index + 10]}"
-	modexcludegames="${mods_global_array[index + 11]}"
-	modsite="${mods_global_array[index + 12]}"
-	moddescription="${mods_global_array[index + 13]}"
-}
-
-# Builds list of installed mods.
-# using installed-mods.txt grabing mod info from mods_list.sh.
-fn_mods_installed_list() {
-	fn_mods_count_installed
-	# Set/reset variables.
-	installedmodsline="1"
-	installedmodslist=()
-	modprettynamemaxlength="0"
-	modsitemaxlength="0"
-	moddescriptionmaxlength="0"
-	modcommandmaxlength="0"
-	# Loop through every line of the installed mods list ${modsinstalledlistfullpath}.
-	while [ "${installedmodsline}" -le "${installedmodscount}" ]; do
-		currentmod=$(sed "${installedmodsline}q;d" "${modsinstalledlistfullpath}")
-		# Get mod info to make sure mod exists.
-		fn_mod_get_info
-		# Add the mod to available commands.
-		installedmodslist+=("${modcommand}")
-		# Increment line check.
-		((installedmodsline++))
-	done
-	if [ "${installedmodscount}" ]; then
-		fn_script_log_info "${installedmodscount} addons/mods are currently installed"
-	fi
-}
-
-# Loops through mods_global_array to define available mods & provide available commands for mods installation.
-fn_mods_available() {
-	# First, reset variables.
-	compatiblemodslist=()
-	availablemodscommands=()
-	# Find compatible games.
-	# Find separators through the global array.
-	for ((index = "0"; index <= ${#mods_global_array[@]}; index++)); do
-		# If current value is a separator; then.
-		if [ "${mods_global_array[index]}" == "${modseparator}" ]; then
-			# Set mod variables.
-			fn_mods_define
-			# Test if game is compatible.
-			fn_mod_compatible_test
-			# If game is compatible.
-			if [ "${modcompatibility}" == "1" ]; then
-				# Put it into an array to prepare user output.
-				compatiblemodslist+=("${modprettyname}" "${modcommand}" "${modsite}" "${moddescription}")
-				# Keep available commands in an array to make life easier.
-				availablemodscommands+=("${modcommand}")
-			fi
-		fi
-	done
-}
-
-## Mod compatibility check.
-
-# Find out if a game is compatible with a mod from a modgames (list of games supported by a mod) variable.
-fn_compatible_mod_games() {
-	# Reset test value.
-	modcompatiblegame="0"
-	# If value is set to GAMES (ignore).
-	if [ "${modgames}" != "GAMES" ]; then
-		# How many games we need to test.
-		gamesamount=$(echo -e "${modgames}" | awk -F ';' '{ print NF }')
-		# Test all subvalue of "modgames" using the ";" separator.
-		for ((gamevarindex = 1; gamevarindex < gamesamount; gamevarindex++)); do
-			# Put current game name into modtest variable.
-			gamemodtest=$(echo -e "${modgames}" | awk -F ';' -v x=${gamevarindex} '{ print $x }')
-			# If game name matches.
-			if [ "${gamemodtest}" == "${gamename}" ]; then
-				# Mod is compatible.
-				modcompatiblegame="1"
-			fi
-		done
-	fi
-}
-
-# Find out if an engine is compatible with a mod from a modengines (list of engines supported by a mod) variable.
-fn_compatible_mod_engines() {
-	# Reset test value.
-	modcompatibleengine="0"
-	# If value is set to ENGINES (ignore).
-	if [ "${modengines}" != "ENGINES" ]; then
-		# How many engines we need to test.
-		enginesamount=$(echo -e "${modengines}" | awk -F ';' '{ print NF }')
-		# Test all subvalue of "modengines" using the ";" separator.
-		for ((gamevarindex = 1; gamevarindex < ${enginesamount}; gamevarindex++)); do
-			# Put current engine name into modtest variable.
-			enginemodtest=$(echo -e "${modengines}" | awk -F ';' -v x=${gamevarindex} '{ print $x }')
-			# If engine name matches.
-			if [ "${enginemodtest}" == "${engine}" ]; then
-				# Mod is compatible.
-				modcompatibleengine="1"
-			fi
-		done
-	fi
-}
-
-# Find out if a game is not compatible with a mod from a modnotgames (list of games not supported by a mod) variable.
-fn_not_compatible_mod_games() {
-	# Reset test value.
-	modeincompatiblegame="0"
-	# If value is set to NOTGAMES (ignore).
-	if [ "${modexcludegames}" != "NOTGAMES" ]; then
-		# How many engines we need to test.
-		excludegamesamount=$(echo -e "${modexcludegames}" | awk -F ';' '{ print NF }')
-		# Test all subvalue of "modexcludegames" using the ";" separator.
-		for ((gamevarindex = 1; gamevarindex < excludegamesamount; gamevarindex++)); do
-			# Put current engine name into modtest variable.
-			excludegamemodtest=$(echo -e "${modexcludegames}" | awk -F ';' -v x=${gamevarindex} '{ print $x }')
-			# If engine name matches.
-			if [ "${excludegamemodtest}" == "${gamename}" ]; then
-				# Mod is compatible.
-				modeincompatiblegame="1"
-			fi
-		done
-	fi
-}
-
-# Sums up if a mod is compatible or not with modcompatibility=0/1.
-fn_mod_compatible_test() {
-	# Test game and engine compatibility.
-	fn_compatible_mod_games
-	fn_compatible_mod_engines
-	fn_not_compatible_mod_games
-	if [ "${modeincompatiblegame}" == "1" ]; then
-		modcompatibility="0"
-	elif [ "${modcompatibleengine}" == "1" ] || [ "${modcompatiblegame}" == "1" ]; then
-		modcompatibility="1"
-	else
-		modcompatibility="0"
-	fi
-}
-
-## Directory management.
-
-# Create mods files and directories if it doesn't exist.
-fn_create_mods_dir() {
-	# Create lgsm data modsdir.
-	if [ ! -d "${modsdir}" ]; then
-		echo -en "creating LinuxGSM mods data directory ${modsdir}..."
-		mkdir -p "${modsdir}"
-		exitcode=$?
-		if [ "${exitcode}" != 0 ]; then
-			fn_print_fail_eol_nl
-			fn_script_log_fatal "Creating mod download dir ${modsdir}"
-			core_exit.sh
-		else
-			fn_print_ok_eol_nl
-			fn_script_log_pass "Creating mod download dir ${modsdir}"
-		fi
-	fi
-	# Create mod install directory.
-	if [ ! -d "${modinstalldir}" ]; then
-		echo -en "creating mods install directory ${modinstalldir}..."
-		mkdir -p "${modinstalldir}"
-		exitcode=$?
-		if [ "${exitcode}" != 0 ]; then
-			fn_print_fail_eol_nl
-			fn_script_log_fatal "Creating mod install directory ${modinstalldir}"
-			core_exit.sh
-		else
-			fn_print_ok_eol_nl
-			fn_script_log_pass "Creating mod install directory ${modinstalldir}"
-		fi
-	fi
-
-	# Create lgsm/data/${modsinstalledlist}.
-	if [ ! -f "${modsinstalledlistfullpath}" ]; then
-		touch "${modsinstalledlistfullpath}"
-		fn_script_log_info "Created ${modsinstalledlistfullpath}"
-	fi
-}
-
-# Create tmp download mod directory.
-fn_mods_create_tmp_dir() {
-	if [ ! -d "${modstmpdir}" ]; then
-		mkdir -p "${modstmpdir}"
-		exitcode=$?
-		echo -en "creating mod download directory ${modstmpdir}..."
-		if [ "${exitcode}" != 0 ]; then
-			fn_print_fail_eol_nl
-			fn_script_log_fatal "Creating mod download directory ${modstmpdir}"
-			core_exit.sh
-		else
-			fn_print_ok_eol_nl
-			fn_script_log_pass "Creating mod download directory ${modstmpdir}"
-		fi
-	fi
-}
-
-# Remove the tmp mod download directory when finished.
-fn_mods_clear_tmp_dir() {
-	if [ -d "${modstmpdir}" ]; then
-		echo -en "clearing mod download directory ${modstmpdir}..."
-		rm -rf "${modstmpdir:?}"
-		exitcode=$?
-		if [ "${exitcode}" != 0 ]; then
-			fn_print_fail_eol_nl
-			fn_script_log_fatal "Clearing mod download directory ${modstmpdir}"
-			core_exit.sh
-		else
-			fn_print_ok_eol_nl
-			fn_script_log_pass "Clearing mod download directory ${modstmpdir}"
-		fi
-
-	fi
-	# Clear temp file list as well.
-	if [ -f "${modsdir}/.removedfiles.tmp" ]; then
-		rm -f "${modsdir:?}/.removedfiles.tmp"
-	fi
-}
-
-# Counts how many mods were installed.
-fn_mods_count_installed() {
-	if [ -f "${modsinstalledlistfullpath}" ]; then
-		installedmodscount=$(wc -l < "${modsinstalledlistfullpath}")
-	else
-		installedmodscount=0
-	fi
-}
-
-# Exits if no mods were installed.
-fn_mods_check_installed() {
-	# Count installed mods.
-	fn_mods_count_installed
-	# If no mods are found.
-	if [ ${installedmodscount} -eq 0 ]; then
-		echo -e ""
-		fn_print_failure_nl "No installed mods or addons were found"
-		echo -e " * Install mods using LinuxGSM first with: ./${selfname} mods-install"
-		fn_script_log_error "No installed mods or addons were found."
-		core_exit.sh
-	fi
-}
-
-# Checks that mod files list exists and isn't empty.
-fn_check_mod_files_list() {
-	# File list must exist and be valid before any operation on it.
-	if [ -f "${modsdir}/${modcommand}-files.txt" ]; then
-		# How many lines is the file list.
-		modsfilelistsize=$(wc -l < "${modsdir}/${modcommand}-files.txt")
-		# If file list is empty.
-		if [ "${modsfilelistsize}" -eq 0 ]; then
-			fn_print_failure "${modcommand}-files.txt is empty"
-			echo -e "* Unable to remove ${modprettyname}"
-			fn_script_log_fatal "${modcommand}-files.txt is empty: Unable to remove ${modprettyname}."
-			core_exit.sh
-		fi
-	else
-		fn_print_failure "${modsdir}/${modcommand}-files.txt does not exist"
-		fn_script_log_fatal "${modsdir}/${modcommand}-files.txt does not exist: Unable to remove ${modprettyname}."
-		core_exit.sh
-	fi
-}
-
-fn_mod_exist() {
-	modreq=$1
-	# requires one parameter, the mod
-	if [ -f "${modsdir}/${modreq}-files.txt" ]; then
-		# how many lines is the file list
-		modsfilelistsize=$(wc -l < "${modsdir}/${modreq}-files.txt")
-		# if file list is empty
-		if [ "${modsfilelistsize}" -eq 0 ]; then
-			fn_mod_required_fail_exist "${modreq}"
-		fi
-	else
-		fn_mod_required_fail_exist "${modreq}"
-	fi
-}
-
-fn_mod_required_fail_exist() {
-	modreq=$1
-	# requires one parameter, the mod
-	fn_script_log_fatal "${modreq}-files.txt is empty: unable to find ${modreq} installed"
-	echo -en "* Unable to find '${modreq}' which is required prior to installing this mod..."
-	fn_print_fail_eol_nl
-	core_exit.sh
-}
-
-fn_mod_liblist_gam_filenames() {
-	# clear variables just in case
-	moddll=""
-	modso=""
-	moddylib=""
-
-	# default libraries
-	case ${gamename} in
-		"Counter-Strike 1.6")
-			moddll="mp.dll"
-			modso="cs.so"
-			moddylib="cs.dylib"
-			;;
-		"Day of Defeat")
-			moddll="dod.dll"
-			modso="dod.so"
-			moddylib="dod.dylib"
-			;;
-		"Team Fortress Classic")
-			moddll="tfc.dll"
-			modso="tfc.so"
-			moddylib="tfc.dylib"
-			;;
-		"Natural Selection")
-			moddll="ns.dll"
-			modso="ns_i386.so"
-			moddylib=""
-			;;
-		"The Specialists")
-			moddll="mp.dll"
-			modso="ts_i386.so"
-			moddylib=""
-			;;
-		"Half-Life: Deathmatch")
-			moddll="hl.dll"
-			modso="hl.so"
-			moddylib="hl.dylib"
-			;;
-	esac
-}
-
-# modifers for liblist.gam to add/remote metamod binaries
-fn_mod_install_liblist_gam_file() {
-
-	fn_mod_liblist_gam_filenames
-
-	if [ -f "${modinstalldir}/liblist.gam" ]; then
-		# modify the liblist.gam file to initialize Metamod
-		logentry="sed replace (dlls\\${moddll}) ${modinstalldir}/liblist.gam"
-		echo -en "modifying gamedll in liblist.gam..."
-		rpldll="s/dlls\\\\${moddll}/addons\/metamod\/dlls\/metamod.dll/g"
-		sed -i $rpldll "${modinstalldir}/liblist.gam"
-		grep -q "addons/metamod/dlls/metamod.dll" "${modinstalldir}/liblist.gam"
-		exitcode=$?
-		# if replacement back didn't happen, error out.
-		if [ "${exitcode}" != 0 ]; then
-			fn_script_log_fatal "${logentry}"
-			fn_print_fail_eol_nl
-		else
-			fn_script_log_pass "${logentry}"
-			fn_print_ok_eol_nl
-		fi
-
-		# modify the liblist.gam file to initialize metamod
-		logentry="sed replace (dlls\\${modso}) ${modinstalldir}/liblist.gam"
-		echo -en "modifying gamedll_linux in liblist.gam..."
-		rplso="s/dlls\/${modso}/addons\/metamod\/dlls\/metamod.so/g"
-		sed -i $rplso "${modinstalldir}/liblist.gam"
-		grep -q "addons/metamod/dlls/metamod.so" "${modinstalldir}/liblist.gam"
-		exitcode=$?
-		# if replacement back didn't happen, error out
-		if [ "${exitcode}" != 0 ]; then
-			fn_script_log_fatal "${logentry}"
-			fn_print_fail_eol_nl
-		else
-			fn_script_log_pass "${logentry}"
-			fn_print_ok_eol_nl
-		fi
-
-		# mac os needs to be checked not all mods support mac os
-		if [ -n "${moddylib}" ]; then
-			# modify the liblist.gam file to initialize metamod
-			logentry="sed replace (dlls\\${moddylib}) ${modinstalldir}/liblist.gam"
-			echo -en "modifying gamedll_osx in liblist.gam..."
-			rpldylib="s/dlls\/${moddylib}/addons\/metamod\/dlls\/metamod.dylib/g"
-			sed -i $rpldylib "${modinstalldir}/liblist.gam"
-			grep -q "addons/metamod/dlls/metamod.dylib" "${modinstalldir}/liblist.gam"
-			exitcode=$?
-			# if replacement back didn't happen, error out.
-			if [ "${exitcode}" != 0 ]; then
-				fn_script_log_fatal "${logentry}"
-				fn_print_fail_eol_nl
-			else
-				fn_script_log_pass ${logentry}
-				fn_print_ok_eol_nl
-			fi
-		fi
-	fi
-}
-
-fn_mod_remove_liblist_gam_file() {
-
-	fn_mod_liblist_gam_filenames
-
-	if [ -f "${modinstalldir}/liblist.gam" ]; then
-		# modify the liblist.gam file back to defaults
-		logentry="sed replace (addons/metamod/dlls/metamod.dll) ${modinstalldir}/liblist.gam"
-		echo -en "modifying gamedll in liblist.gam..."
-		rpldll="s/addons\/metamod\/dlls\/metamod.dll/dlls\\\\${moddll}/g"
-		sed -i $rpldll "${modinstalldir}/liblist.gam"
-		grep -q "${moddll}" "${modinstalldir}/liblist.gam"
-		exitcode=$?
-		# if replacement back didn't happen, error out.
-		if [ "${exitcode}" != 0 ]; then
-			fn_script_log_fatal "${logentry}"
-			fn_print_fail_eol_nl
-		else
-			fn_script_log_pass ${logentry}
-			fn_print_ok_eol_nl
-		fi
-
-		# modify the liblist.gam file back to defaults
-		logentry="sed replace (addons/metamod/dlls/metamod.so) ${modinstalldir}/liblist.gam"
-		echo -en "modifying gamedll_linux in liblist.gam..."
-		rplso="s/addons\/metamod\/dlls\/metamod.so/dlls\/${modso}/g"
-		sed -i $rplso "${modinstalldir}/liblist.gam"
-		grep -q "${modso}" "${modinstalldir}/liblist.gam"
-		exitcode=$?
-		# if replacement back didn't happen, error out
-		if [ "${exitcode}" != 0 ]; then
-			fn_script_log_fatal "${logentry}"
-			fn_print_fail_eol_nl
-		else
-			fn_script_log_pass ${logentry}
-			fn_print_ok_eol_nl
-		fi
-
-		# mac os needs to be checked not all mods support mac os
-		if [ -n "${moddylib}" ]; then
-			# modify the liblist.gam file back to defaults
-			logentry="sed replace (addons/metamod/dlls/metamod.dylib) ${modinstalldir}/liblist.gam"
-			echo -en "modifying gamedll_osx in liblist.gam..."
-			rpldylib="s/addons\/metamod\/dlls\/metamod.dylib/dlls\/${moddylib}/g"
-			sed -i $rpldylib "${modinstalldir}/liblist.gam"
-			grep -q "${moddylib}" "${modinstalldir}/liblist.gam"
-			# if replacement back didn't happen, error out.
-			exitcode=$?
-			if [ "${exitcode}" != 0 ]; then
-				fn_script_log_fatal "${logentry}"
-				fn_print_fail_eol_nl
-			else
-				fn_script_log_pass ${logentry}
-				fn_print_ok_eol_nl
-			fi
-		fi
-	fi
-}
-
-fn_mod_install_amxmodx_file() {
-	# does plugins.ini exist?
-	if [ -f "${modinstalldir}/addons/metamod/plugins.ini" ]; then
-		# since it does exist, is the entry already in plugins.ini
-		logentry="line (linux addons/amxmodx/dlls/amxmodx_mm_i386.so) inserted into ${modinstalldir}/addons/metamod/plugins.ini"
-		echo -en "adding amxmodx_mm_i386.so in plugins.ini..."
-		grep -q "amxmodx_mm_i386.so" "${modinstalldir}/addons/metamod/plugins.ini"
-		exitcode=$?
-		if [ "${exitcode}" != 0 ]; then
-			# file exists but the entry does not, let's add it
-			echo "linux addons/amxmodx/dlls/amxmodx_mm_i386.so" >> "${modinstalldir}/addons/metamod/plugins.ini"
-			exitcode=$?
-			if [ "${exitcode}" != 0 ]; then
-				fn_script_log_fatal "${logentry}"
-				fn_print_fail_eol_nl
-			else
-				fn_script_log_pass ${logentry}
-				fn_print_ok_eol_nl
-			fi
-		fi
-	else
-		# create new file and add the mod to it
-		echo "linux addons/amxmodx/dlls/amxmodx_mm_i386.so" > "${modinstalldir}/addons/metamod/plugins.ini"
-		exitcode=$?
-		if [ "${exitcode}" != 0 ]; then
-			fn_script_log_fatal "${logentry}"
-			fn_print_fail_eol_nl
-			core_exit.sh
-		else
-			fn_script_log_pass ${logentry}
-			fn_print_ok_eol_nl
-		fi
-	fi
-}
-
-fn_mod_remove_amxmodx_file() {
-	if [ -f "${modinstalldir}/addons/metamod/plugins.ini" ]; then
-		# since it does exist, is the entry already in plugins.ini
-		logentry="line (linux addons/amxmodx/dlls/amxmodx_mm_i386.so) removed from ${modinstalldir}/addons/metamod/plugins.ini"
-		echo -en "removing amxmodx_mm_i386.so in plugins.ini..."
-		grep -q "linux addons/amxmodx/dlls/amxmodx_mm_i386.so" "${modinstalldir}/addons/metamod/plugins.ini"
-		# iIs it found? If so remove it and clean up
-		exitcode=$?
-		if [ "${exitcode}" == 0 ]; then
-			# delete the line we inserted
-			sed -i '/linux addons\/amxmodx\/dlls\/amxmodx_mm_i386.so/d' "${modinstalldir}/addons/metamod/plugins.ini"
-			# remove empty lines
-			sed -i '/^$/d' "${modinstalldir}/addons/metamod/plugins.ini"
-			exitcode=$?
-			if [ "${exitcode}" != 0 ]; then
-				fn_script_log_fatal "${logentry}"
-				fn_print_fail_eol_nl
-			else
-				fn_script_log_pass ${logentry}
-				fn_print_ok_eol_nl
-			fi
-
-			# if file is empty, remove it.
-			if [ -f "${modinstalldir}/addons/metamod/plugins.ini" ]; then
-				rm -f "${modinstalldir}/addons/metamod/plugins.ini"
-				fn_script_log_pass "file removed ${modinstalldir}/addons/metamod/plugins.ini because it was empty"
-			fi
-		fi
-	fi
-}
-
-## Database initialisation.
-
-mods_list.sh
-fn_mods_available
diff --git a/lgsm/functions/mods_list.sh b/lgsm/functions/mods_list.sh
deleted file mode 100644
index a83b7e303..000000000
--- a/lgsm/functions/mods_list.sh
+++ /dev/null
@@ -1,209 +0,0 @@
-#!/bin/bash
-# LinuxGSM mods_list.sh module
-# Author: Daniel Gibbs
-# Contributors: http://linuxgsm.com/contrib
-# Website: https://linuxgsm.com
-# Description: Lists and defines available mods for LinuxGSM supported servers; works along with mods_core.sh.
-# Usage: To add a mod, you need to add an array variable following the guide to set proper values;
-# Usage: Then add this array to the mods_global_array.
-# Usage: If needed, you can scrape the download URL first.
-
-functionselfname="$(basename "$(readlink -f "${BASH_SOURCE[0]}")")"
-
-# Get a proper URL for mods that don't provide a good one (optional)
-fn_script_log_info "Retrieving latest mods URLs"
-
-# Metamod (Half-life 1 Classic Engine)
-metamodversion="1.21.1-am"
-metamodlatestfile="metamod-${metamodversion}.zip"
-metamoddownloadurl="https://www.amxmodx.org/release/${metamodlatestfile}"
-metamodurl="${metamoddownloadurl}"
-# AMX Mod X: Base
-amxxbaseversion="1.8.2"
-amxxbasemod="base"
-amxxbaselatestfile="amxmodx-${amxxbaseversion}-${amxxbasemod}-linux.tar.gz"
-amxxbasedownloadurl="https://www.amxmodx.org/release/${amxxbaselatestfile}"
-amxxbaseurl="${amxxbasedownloadurl}"
-# AMX Mod X: Counter-Strike
-amxxcsversion="1.8.2"
-amxxcsmod="cstrike"
-amxxcslatestfile="amxmodx-${amxxbaseversion}-${amxxcsmod}-linux.tar.gz"
-amxxcsdownloadurl="https://www.amxmodx.org/release/${amxxcslatestfile}"
-amxxcsurl="${amxxcsdownloadurl}"
-# AMX Mod X: Day of Defeat
-amxxdodversion="1.8.2"
-amxxdodmod="dod"
-amxxdodlatestfile="amxmodx-${amxxdodversion}-${amxxdodmod}-linux.tar.gz"
-amxxdoddownloadurl="https://www.amxmodx.org/release/${amxxdodlatestfile}"
-amxxdodurl="${amxxdoddownloadurl}"
-# AMX Mod X: Team Fortress Classic
-amxxtfcversion="1.8.2"
-amxxtfcmod="tfc"
-amxxtfclatestfile="amxmodx-${amxxtfcversion}-${amxxtfcmod}-linux.tar.gz"
-amxxtfcdownloadurl="https://www.amxmodx.org/release/${amxxtfclatestfile}"
-amxxtfcurl="${amxxtfcdownloadurl}"
-# AMX Mod X: Natural Selection
-amxxnsversion="1.8.2"
-amxxnsmod="ns"
-amxxnslatestfile="amxmodx-${amxxnsversion}-${amxxnsmod}-linux.tar.gz"
-amxxnsdownloadurl="https://www.amxmodx.org/release/${amxxnslatestfile}"
-amxxnsurl="${amxxnsdownloadurl}"
-# AMX Mod X: The Specialists
-amxxtsversion="1.8.2"
-amxxtsmod="ts"
-amxxtslatestfile="amxmodx-${amxxtsversion}-${amxxtsmod}-linux.tar.gz"
-amxxtsdownloadurl="https://www.amxmodx.org/release/${amxxtslatestfile}"
-amxxtsurl="${amxxtsdownloadurl}"
-# Metamod:Source
-metamodsourceversion="1.11"
-metamodsourcescrapeurl="https://mms.alliedmods.net/mmsdrop/${metamodsourceversion}/mmsource-latest-linux"
-metamodsourcelatestfile=$(wget "${metamodsourcescrapeurl}" -q -O -)
-metamodsourcedownloadurl="https://www.metamodsource.net/latest.php?os=linux&version=${metamodsourceversion}"
-metamodsourceurl="${metamodsourcedownloadurl}"
-# Sourcemod
-sourcemodversion="1.11"
-sourcemodscrapeurl="https://sm.alliedmods.net/smdrop/${sourcemodversion}/sourcemod-latest-linux"
-sourcemodlatestfile=$(wget "${sourcemodscrapeurl}" -q -O -)
-sourcemoddownloadurl="https://www.sourcemod.net/latest.php?os=linux&version=${sourcemodversion}"
-sourcemodurl="${sourcemoddownloadurl}"
-# Steamworks
-steamworksscrapeurl="https://users.alliedmods.net/~kyles/builds/SteamWorks"
-steamworkslatestfile=$(curl --connect-timeout 10 -sL ${steamworksscrapeurl} | grep -m 1 linux | cut -d '"' -f 4)
-steamworksdownloadurl="${steamworksscrapeurl}/${steamworkslatestfile}"
-steamworksurl="${steamworksdownloadurl}"
-# CS:GO Mods
-get5lastbuild=$(curl --connect-timeout 10 -sL https://api.github.com/repos/splewis/get5/releases/latest | jq '.assets[] |select(.browser_download_url | endswith(".tar.gz"))')
-get5latestfile=$(echo -e "${get5lastbuild}" | jq -r '.name')
-get5latestfilelink=$(echo -e "${get5lastbuild}" | jq -r '.browser_download_url')
-csgopracticelatest=$(curl --connect-timeout 10 -sL https://api.github.com/repos/splewis/csgo-practice-mode/releases/latest | jq '.assets[]')
-csgopracticelatestfile=$(echo -e "${csgopracticelatest}" | jq -r '.name')
-csgopracticelatestlink=$(echo -e "${csgopracticelatest}" | jq -r '.browser_download_url')
-csgopuglatest=$(curl --connect-timeout 10 -sL https://api.github.com/repos/splewis/csgo-pug-setup/releases/latest | jq '.assets[]')
-csgopuglatestfile=$(echo -e "${csgopuglatest}" | jq -r '.name')
-csgopuglatestlink=$(echo -e "${csgopuglatest}" | jq -r '.browser_download_url')
-gokzlatestversion=$(curl --connect-timeout 10 -s https://api.github.com/repos/KZGlobalTeam/gokz/releases/latest | grep "tag_name" | cut -d : -f 2,3 | sed -E 's/.*"([^"]+)".*/\1/')
-gokzlatestfile="GOKZ-v${gokzlatestversion}.zip"
-gokzlatestlink="https://github.com/KZGlobalTeam/gokz/releases/download/${gokzlatestversion}/${gokzlatestfile}"
-movementapilatestversion=$(curl --connect-timeout 10 -s https://api.github.com/repos/danzayau/MovementAPI/releases/latest | grep "tag_name" | cut -d : -f 2,3 | sed -E 's/.*"([^"]+)".*/\1/')
-movementapilatestfile="MovementAPI-v${movementapilatestversion}.zip"
-movementapilatestlink="https://github.com/danzayau/MovementAPI/releases/download/${movementapilatestversion}/${movementapilatestfile}"
-
-# Rust
-carbonrustapilatestfile="Carbon.Linux.Release.tar.gz"
-carbonrustlatestlink=$(curl --connect-timeout 10 -sL https://api.github.com/repos/CarbonCommunity/Carbon.Core/releases/tags/production_build | jq -r '.assets[]|select(.name == "Carbon.Linux.Release.tar.gz") | .browser_download_url')
-
-# Oxide
-oxiderustlatestlink=$(curl --connect-timeout 10 -sL https://api.github.com/repos/OxideMod/Oxide.Rust/releases/latest | jq -r '.assets[]|select(.browser_download_url | contains("linux")) | .browser_download_url')
-oxidehurtworldlatestlink=$(curl --connect-timeout 10 -sL https://api.github.com/repos/OxideMod/Oxide.Hurtworld/releases/latest | jq -r '.assets[].browser_download_url')
-oxidesdtdlatestlink=$(curl --connect-timeout 10 -sL https://api.github.com/repos/OxideMod/Oxide.SevenDaysToDie/releases/latest | jq -r '.assets[]|select(.browser_download_url | contains("linux")) | .browser_download_url')
-# Valheim Plus
-valeimpluslatestlink=$(curl --connect-timeout 10 -sL https://api.github.com/repos/valheimPlus/ValheimPlus/releases/latest | jq -r '.assets[]|select(.browser_download_url | contains("UnixServer.tar.gz")) | .browser_download_url')
-# Valheim BepInEx
-bepinexvhlatestlink=$(curl --connect-timeout 10 -sL "https://valheim.thunderstore.io/api/experimental/package/denikson/BepInExPack_Valheim/" -H "accept: application/json" | jq -r '.latest.download_url')
-
-# Define mods information (required)
-
-# Separator name
-modseparator="MOD"
-
-# REQUIRED: mod_info_name=( MOD "modcommand" "Pretty Name" "URL" "filename" "modsubdirs" "LowercaseOn/Off" "/files/to/keep;" "/install/path" "ENGINES" "GAMES" "NOTGAMES" "AUTHOR_URL" "Short Description" )
-# Example 1) Well made mod: mod_info_name=( MOD "awesomemod" "This is an Awesome Mod" "https://awesomemod.com/latest.zip" "awesomemod.zip" "0" "LowercaseOff" "OVERWRITE" "${systemdir}/addons" "source;unity3d;" "GAMES" "NOTGAMES" "https://awesomemod.com/" "This mod knows that 42 is the answer" )
-# Example 2) Poorly made mod: mod_info_name=( MOD "stupidmod" "This is a stupid mod" "${crappymodurl}" "StupidMod.zip" "2" "LowercaseOn" "cfg;data/crappymod;" "${systemdir}" "source;" "GAMES" "Garry's mod;Counter-Strike: Source;" "This mod is dumber than dumb" )
-# None of those values can be empty
-# index | Usage
-# [0] 	| MOD: separator, all mods must begin with it
-# [1] 	| "modcommand": the LGSM name and command to install the mod (must be unique and lowercase)
-# [2] 	| "Pretty Name": the common name people use to call the mod that will be displayed to the user
-# [3] 	| "URL": link to the mod archive file; can be a variable previously defined while scraping a URL
-# [4] 	| "filename": the output filename
-# [5]	| "modsubdirs": in how many subdirectories is the mod (none is 0) (not used at release, but could be in the future)
-# [6]	| "LowercaseOn/Off": LowercaseOff or LowercaseOn: enable/disable converting extracted files and directories to lowercase (some games require it)
-# [7] 	| "modinstalldir": the directory in which to install the mode (use LGSM dir variables such as ${systemdir})
-# [8]	| "/files/to/keep;", files & directories that should not be overwritten upon update, separated and ended with a semicolon; you can also use "OVERWRITE" value to ignore the value or "NOUPDATE" to disallow updating; for files to keep upon uninstall, see fn_mod_tidy_files_list from mods_core.sh
-# [9] 	| "Supported Engines;": list them according to LGSM ${engine} variables, separated and ended with a semicolon, or use ENGINES to ignore the value
-# [10] 	| "Supported Games;": list them according to LGSM ${gamename} variables, separated and ended with a semicolon, or use GAMES to ignore the value
-# [11]	| "Unsupported Games;": list them according to LGSM ${gamename} variables, separated and ended with a semicolon, or use NOTGAMES to ignore the value (useful to exclude a game when using Supported Engines)
-# [12]	| "AUTHOR_URL" is the author's website, displayed to the user when chosing mods to install
-# [13]	| "Short Description" a description showed to the user upon installation/removal
-
-# Half-life 1 Engine Mods
-mod_info_metamod=(MOD "metamod" "Metamod" "${metamodurl}" "${metamodlatestfile}" "0" "LowercaseOff" "${systemdir}" "addons/metamod/plugins.ini;" "ENGINES" "Counter-Strike 1.6;Day of Defeat;Team Fortress Classic;Natural Selection;The Specialists;Half-Life: Deathmatch;" "NOTGAMES" "https://github.com/alliedmodders/metamod-hl1" "Plugins Framework")
-mod_info_base_amxx=(MOD "amxmodx" "AMX Mod X: Base" "${amxxbaseurl}" "${amxxbaselatestfile}" "0" "LowercaseOff" "${systemdir}" "addons/amxmodx/configs;" "ENGINES" "Counter-Strike 1.6;Day of Defeat;Team Fortress Classic;Natural Selection;The Specialists;Half-Life: Deathmatch;" "NOTGAMES" "https://www.amxmodx.org" "Admin Features (requires Metamod)")
-
-# CS 1.6 (HL1) Engine Mods
-mod_info_cs_amxx=(MOD "amxmodxcs" "AMX Mod X: Counter-Strike" "${amxxcsurl}" "${amxxcslatestfile}" "0" "LowercaseOff" "${systemdir}" "addons/amxmodx/configs;" "ENGINES" "Counter-Strike 1.6;" "NOTGAMES" "https://www.amxmodx.org" "Admin Features (requires Metamod & AMX Mod X: Base)")
-
-# DOD (HL1) Engine Mods
-mod_info_dod_amxx=(MOD "amxmodxdod" "AMX Mod X: Day of Defeat" "${amxxdodurl}" "${amxxdodlatestfile}" "0" "LowercaseOff" "${systemdir}" "addons/amxmodx/configs;" "ENGINES" "Day of Defeat;" "NOTGAMES" "https://www.amxmodx.org" "Admin Features (requires Metamod & AMX Mod X: Base)")
-
-# TFC (HL1) Engine Mods
-mod_info_tfc_amxx=(MOD "amxmodxtfc" "AMX Mod X: Team Fortress Classic" "${amxxtfcurl}" "${amxxtfclatestfile}" "0" "LowercaseOff" "${systemdir}" "addons/amxmodx/configs;" "ENGINES" "Team Fortress Classic;" "NOTGAMES" "https://www.amxmodx.org" "Admin Features (requires Metamod & AMX Mod X: Base)")
-
-# NS (Natural Selection) (HL1) Engine Mods
-mod_info_ns_amxx=(MOD "amxmodxns" "AMX Mod X: Natural Selection" "${amxxnsurl}" "${amxxnslatestfile}" "0" "LowercaseOff" "${systemdir}" "addons/amxmodx/configs;" "ENGINES" "Natural Selection;" "NOTGAMES" "https://www.amxmodx.org" "Admin Features (requires Metamod & AMX Mod X: Base)")
-
-# TS (The Specialists) (HL1) Engine Mods
-mod_info_ts_amxx=(MOD "amxmodxts" "AMX Mod X: The Specialists" "${amxxtsurl}" "${amxxtslatestfile}" "0" "LowercaseOff" "${systemdir}" "addons/amxmodx/configs;" "ENGINES" "The Specialists;" "NOTGAMES" "https://www.amxmodx.org" "Admin Features (requires Metamod & AMX Mod X: Base)")
-
-# Source mods
-mod_info_metamodsource=(MOD "metamodsource" "Metamod: Source" "${metamodsourceurl}" "${metamodsourcelatestfile}" "0" "LowercaseOff" "${systemdir}" "addons/metamod/metaplugins.ini;" "source;" "GAMES" "NOTGAMES" "https://www.sourcemm.net" "Plugins Framework")
-mod_info_sourcemod=(MOD "sourcemod" "SourceMod" "${sourcemodurl}" "${sourcemodlatestfile}" "0" "LowercaseOff" "${systemdir}" "cfg;addons/sourcemod/configs;" "source;" "GAMES" "NOTGAMES" "http://www.sourcemod.net" "Admin Features (requires Metamod: Source)")
-mod_info_steamworks=(MOD "steamworks" "SteamWorks" "${steamworksurl}" "${steamworkslatestfile}" "0" "LowercaseOff" "${systemdir}" "OVERWRITE" "ENGINES" "Counter-Strike: Global Offensive;" "NOTGAMES" "https://github.com/KyleSanderson/SteamWorks" "Exposing SteamWorks functions to SourcePawn")
-mod_info_stripper=(MOD "stripper" "Stripper Source" "http://www.bailopan.net/stripper/snapshots/1.2/stripper-1.2.2-git129-linux.tar.gz" "stripper-1.2.2-git129-linux.tar.gz" "0" "LowercaseOff" "${systemdir}" "addons/stripper/maps;" "ENGINES" "Counter-Strike: Global Offensive;Counter-Strike: Source;Day of Defeat: Source;Half Life: Deathmatch;Half Life 2: Deathmatch;Insurgency;Left 4 Dead;Left 4 Dead 2;Nuclear Dawn;Team Fortress 2;" "NOTGAMES" "http://www.bailopan.net/stripper/" "Add or remove objects from map (requires MetaMod)")
-
-# CS:GO Mods
-mod_info_gokz=(MOD "gokz" "GOKZ" "${gokzlatestlink}" "${gokzlatestfile}" "0" "LowercaseOff" "${systemdir}" "cfg;addons/sourcemod/configs;" "ENGINES" "Counter-Strike: Global Offensive;" "NOTGAMES" "https://github.com/KZGlobalTeam/gokz" "GOKZ ${gokzlatestversion} - Implements the KZ game mode (requires SourceMod and MetaMod)")
-mod_info_ttt=(MOD "ttt" "Trouble in Terrorist Town" "https://csgottt.com/downloads/ttt-latest-dev-${sourcemodversion}.zip" "ttt-latest.zip" "0" "LowercaseOff" "${systemdir}" "cfg;addons/sourcemod/configs;" "ENGINES" "Counter-Strike: Global Offensive;" "NOTGAMES" "https://github.com/Bara/TroubleinTerroristTown" "Implements the TTT game mode (requires SourceMod and MetaMod)")
-mod_info_get5=(MOD "get5" "Get 5" "${get5latestfilelink}" "${get5latestfile}" "0" "LowercaseOff" "${systemdir}" "cfg;addons/sourcemod/configs;" "ENGINES" "Counter-Strike: Global Offensive;" "NOTGAMES" "https://github.com/splewis/get5" "Plugin for competitive matches/scrims (requires SourceMod and MetaMod)")
-mod_info_prac=(MOD "prac" "csgo practice mode" "${csgopracticelatestlink}" "${csgopracticelatestfile}" "0" "LowercaseOff" "${systemdir}" "cfg;addons/sourcemod/configs;" "ENGINES" "Counter-Strike: Global Offensive;" "NOTGAMES" "https://github.com/splewis/csgo-practice-mode" "Practice Mode is a sourcemod plugin for helping players/teams run practices.")
-mod_info_pug=(MOD "pug" "PUG" "${csgopuglatestlink}" "${csgopuglatestfile}" "0" "LowercaseOff" "${systemdir}" "cfg;addons/sourcemod/configs;" "ENGINES" "Counter-Strike: Global Offensive;" "NOTGAMES" "https://github.com/splewis/csgo-pug-setup" "plugin for setting up private pug/10man games")
-mod_info_dhook=(MOD "dhook" "dhook" "https://forums.alliedmods.net/attachment.php?attachmentid=190123&d=1625050030" "dhooks-2.2.0d17.zip" "0" "LowercaseOff" "${systemdir}" "cfg;addons/sourcemod/configs;" "ENGINES" "Counter-Strike: Global Offensive;" "NOTGAMES" "https://forums.alliedmods.net/showpost.php?p=2588686&postcount=589" "DHooks 2.2.0 - Required for GOKZ")
-mod_info_movement=(MOD "movementapi" "movementapi" "${movementapilatestlink}" "${movementapilatestfile}" "0" "LowercaseOff" "${systemdir}" "cfg;addons/sourcemod/configs;" "ENGINES" "Counter-Strike: Global Offensive;" "NOTGAMES" "https://github.com/danzayau/MovementAPI" "Movement API ${movementapilatestversion} - Required for GOKZ")
-mod_info_cleaner=(MOD "cleaner" "cleaner" "https://github.com/e54385991/console-cleaner/archive/refs/heads/master.zip" "console-cleaner.zip" "0" "LowercaseOff" "${systemdir}" "cfg;addons/sourcemod/configs;" "ENGINES" "Counter-Strike: Global Offensive;" "NOTGAMES" "https://github.com/e54385991/console-cleaner" "Console Cleaner - Optional for GOKZ")
-
-# Garry's Mod Addons
-mod_info_ulib=(MOD "ulib" "ULib" "https://codeload.github.com/TeamUlysses/ulib/zip/master" "ulib-master.zip" "0" "LowercaseOff" "${systemdir}/addons" "OVERWRITE" "ENGINES" "Garry's Mod;" "NOTGAMES" "http://ulyssesmod.net" "Complete Framework")
-mod_info_ulx=(MOD "ulx" "ULX" "https://codeload.github.com/TeamUlysses/ulx/zip/master" "ulx-master.zip" "0" "LowercaseOff" "${systemdir}/addons" "OVERWRITE" "ENGINES" "Garry's Mod;" "NOTGAMES" "http://ulyssesmod.net" "Admin Panel (requires ULib)")
-mod_info_utime=(MOD "utime" "UTime" "https://github.com/TeamUlysses/utime/archive/master.zip" "utime-master.zip" "0" "LowercaseOff" "${systemdir}/addons" "OVERWRITE" "ENGINES" "Garry's Mod;" "NOTGAMES" "http://ulyssesmod.net" "Keep track of players play time")
-mod_info_uclip=(MOD "uclip" "UClip" "https://github.com/TeamUlysses/uclip/archive/master.zip" "uclip-master.zip" "0" "LowercaseOff" "${systemdir}/addons" "OVERWRITE" "ENGINES" "Garry's Mod;" "NOTGAMES" "http://ulyssesmod.net" "An alternative to noclip")
-mod_info_acf=(MOD "acf" "Armoured Combat Framework" "https://github.com/nrlulz/ACF/archive/master.zip" "acf-master.zip" "0" "LowercaseOn" "${systemdir}/addons" "acf-master/lua/acf/shared/guns;" "ENGINES" "Garry's Mod;" "NOTGAMES" "https://github.com/nrlulz/ACF" "Realistic Wepons & Engines")
-mod_info_acf_missiles=(MOD "acfmissiles" "ACF Missiles" "https://github.com/Bubbus/ACF-Missiles/archive/master.zip" "acf-missiles-master.zip" "0" "LowercaseOn" "${systemdir}/addons" "OVERWRITE" "ENGINES" "Garry's Mod;" "NOTGAMES" "https://github.com/Bubbus/ACF-Missiles" "More missiles for ACF")
-mod_info_advdupe2=(MOD "advdupe2" "Advanced Duplicator 2" "https://github.com/wiremod/advdupe2/archive/master.zip" "advdupe2-master.zip" "0" "LowercaseOn" "${systemdir}/addons" "OVERWRITE" "ENGINES" "Garry's Mod;" "NOTGAMES" "http://www.wiremod.com" "Save your constructions. Second version")
-mod_info_pac3=(MOD "pac3" "PAC3" "https://github.com/CapsAdmin/pac3/archive/master.zip" "pac3-master.zip" "0" "LowercaseOff" "${systemdir}/addons" "OVERWRITE" "ENGINES" "Garry's Mod;" "NOTGAMES" "https://github.com/CapsAdmin/pac3" "Advanced player model customization")
-mod_info_wiremod=(MOD "wiremod" "Wiremod" "https://github.com/wiremod/wire/archive/master.zip" "wire-master.zip" "0" "LowercaseOff" "${systemdir}/addons" "OVERWRITE" "ENGINES" "Garry's Mod;" "NOTGAMES" "https://github.com/wiremod/wire" "Base Wiremod Addon")
-mod_info_wiremodextras=(MOD "wiremod-extras" "Wiremod Extras" "https://github.com/wiremod/wire-extras/archive/master.zip" "wire-extras-master.zip" "0" "LowercaseOff" "${systemdir}/addons" "OVERWRITE" "ENGINES" "Garry's Mod;" "NOTGAMES" "https://github.com/wiremod/wire-extras/" "Addition to Wiremod, Extra Content")
-mod_info_advduplicator=(MOD "advdupe1" "Advanced Duplicator 1" "https://github.com/wiremod/advduplicator/archive/master.zip" "advduplicator-master.zip" "0" "LowercaseOn" "${systemdir}/addons" "OVERWRITE" "ENGINES" "Garry's Mod;" "NOTGAMES" "https://github.com/wiremod/advduplicator" "Save your constructions. First version")
-mod_info_trackassemblytool=(MOD "trackassemblytool" "Track Assembly Tool" "https://github.com/dvdvideo1234/trackassemblytool/archive/master.zip" "trackassemblytool-master.zip" "0" "LowercaseOn" "${systemdir}/addons" "OVERWRITE" "ENGINES" "Garry's Mod;" "NOTGAMES" "https://github.com/dvdvideo1234/TrackAssemblyTool" "Assembles segmented track. Supports wire")
-mod_info_physpropertiesadv=(MOD "physpropertiesadv" "Phys Properties Adv" "https://github.com/dvdvideo1234/physpropertiesadv/archive/master.zip" "physpropertiesadv-master.zip" "0" "LowercaseOn" "${systemdir}/addons" "OVERWRITE" "ENGINES" "Garry's Mod;" "NOTGAMES" "https://github.com/dvdvideo1234/PhysPropertiesAdv" "Advanced configurable properties")
-mod_info_controlsystemse2=(MOD "controlsystemse2" "Control Systems E2" "https://github.com/dvdvideo1234/controlsystemse2/archive/master.zip" "controlsystemse2-master.zip" "0" "LowercaseOn" "${systemdir}/addons" "OVERWRITE" "ENGINES" "Garry's Mod;" "NOTGAMES" "https://github.com/dvdvideo1234/ControlSystemsE2" "PID controllers and fast traces for E2. Minor included in wire-extas")
-mod_info_e2pistontiming=(MOD "e2pistontiming" "E2 Piston Timing" "https://github.com/dvdvideo1234/e2pistontiming/archive/master.zip" "e2pistontiming-master.zip" "0" "LowercaseOn" "${systemdir}/addons" "OVERWRITE" "ENGINES" "Garry's Mod;" "NOTGAMES" "https://github.com/dvdvideo1234/E2PistonTiming" "Routine driven piston engine timings for E2")
-mod_info_propcannontool=(MOD "propcannontool" "Prop Cannon Tool" "https://github.com/dvdvideo1234/propcannontool/archive/master.zip" "propcannontool-master.zip" "0" "LowercaseOn" "${systemdir}/addons" "OVERWRITE" "ENGINES" "Garry's Mod;" "NOTGAMES" "https://github.com/dvdvideo1234/PropCannonTool" "Cannon entity that can fire props. Supports wire")
-mod_info_gearassemblytool=(MOD "gearassemblytool" "Gear Assembly Tool" "https://github.com/dvdvideo1234/gearassemblytool/archive/master.zip" "gearassemblytool-master.zip" "0" "LowercaseOn" "${systemdir}/addons" "OVERWRITE" "ENGINES" "Garry's Mod;" "NOTGAMES" "https://github.com/dvdvideo1234/GearAssemblyTool" "Assembles segmented gearbox")
-mod_info_spinnertool=(MOD "spinnertool" "Spinner Tool" "https://github.com/dvdvideo1234/spinnertool/archive/master.zip" "spinnertool-master.zip" "0" "LowercaseOn" "${systemdir}/addons" "OVERWRITE" "ENGINES" "Garry's Mod;" "NOTGAMES" "https://github.com/dvdvideo1234/SpinnerTool" "Torque lever controlled spinner. Supports wire")
-mod_info_surfacefrictiontool=(MOD "surfacefrictiontool" "Surface Friction Tool" "https://github.com/dvdvideo1234/surfacefrictiontool/archive/master.zip" "surfacefrictiontool-master.zip" "0" "LowercaseOn" "${systemdir}/addons" "OVERWRITE" "ENGINES" "Garry's Mod;" "NOTGAMES" "https://github.com/dvdvideo1234/SurfaceFrictionTool" "Controls the surface friction of a prop")
-mod_info_magneticdipole=(MOD "magneticdipole" "Magnetic Dipole" "https://github.com/dvdvideo1234/magneticdipole/archive/master.zip" "magneticdipole-master.zip" "0" "LowercaseOn" "${systemdir}/addons" "OVERWRITE" "ENGINES" "Garry's Mod;" "NOTGAMES" "https://github.com/dvdvideo1234/MagneticDipole" "Magnet entity that runs forces on its poles. Supports wire")
-mod_info_environmentorganizer=(MOD "environmentorganizer" "Environment Organizer" "https://github.com/dvdvideo1234/environmentorganizer/archive/master.zip" "environmentorganizer-master.zip" "0" "LowercaseOn" "${systemdir}/addons" "OVERWRITE" "ENGINES" "Garry's Mod;" "NOTGAMES" "https://github.com/dvdvideo1234/EnvironmentOrganizer" "Installs routines designed for server settings adjustment")
-mod_info_precision_alignment=(MOD "precision-alignment" "Precision Alignment" "https://github.com/Mista-Tea/precision-alignment/archive/master.zip" "precision-alignment-master.zip" "0" "LowercaseOn" "${systemdir}/addons" "OVERWRITE" "ENGINES" "Garry's Mod;" "NOTGAMES" "https://github.com/Mista-Tea/precision-alignment" "Creates precise constraints and aligments")
-mod_info_improved_stacker=(MOD "improved-stacker" "Improved Stacker" "https://github.com/Mista-Tea/improved-stacker/archive/master.zip" "improved-stacker-master.zip" "0" "LowercaseOn" "${systemdir}/addons" "OVERWRITE" "ENGINES" "Garry's Mod;" "NOTGAMES" "https://github.com/Mista-Tea/improved-stacker" "Stacks entities in the direction chosen")
-mod_info_improved_weight=(MOD "improved-weight" "Improved Weight" "https://github.com/Mista-Tea/improved-weight/archive/master.zip" "improved-weight-master.zip" "0" "LowercaseOn" "${systemdir}/addons" "OVERWRITE" "ENGINES" "Garry's Mod;" "NOTGAMES" "https://github.com/Mista-Tea/improved-weight" "Weight tool but with more features")
-mod_info_improved_antinoclip=(MOD "improved-antinoclip" "Improved Antinoclip" "https://github.com/Mista-Tea/improved-antinoclip/archive/master.zip" "improved-antinoclip-master.zip" "0" "LowercaseOn" "${systemdir}/addons" "OVERWRITE" "ENGINES" "Garry's Mod;" "NOTGAMES" "https://github.com/Mista-Tea/improved-antinoclip" "Controls clipping trough an object")
-mod_info_darkrp=(MOD "darkrp" "DarkRP" "https://github.com/FPtje/DarkRP/archive/master.zip" "darkrp-master.zip" "0" "LowercaseOn" "${systemdir}/gamemodes" "OVERWRITE" "ENGINES" "Garry's Mod;" "NOTGAMES" "http://darkrp.com" "Most popular gamemode")
-mod_info_darkrpmodification=(MOD "darkrpmodification" "DarkRP Modification" "https://github.com/FPtje/darkrpmodification/archive/master.zip" "darkrpmodification-master.zip" "0" "LowercaseOff" "${systemdir}/addons" "NOUPDATE" "ENGINES" "Garry's Mod;" "NOTGAMES" "http://darkrp.com" "Customize DarkRP settings")
-mod_info_laserstool=(MOD "laserstool" "Laser STool" "https://github.com/dvdvideo1234/laserstool/archive/main.zip" "laserstool-main.zip" "0" "LowercaseOn" "${systemdir}/addons" "OVERWRITE" "ENGINES" "Garry's Mod;" "NOTGAMES" "https://github.com/dvdvideo1234/LaserSTool" "Scripted tool that spawns laser entities, simulates light rays and even kill players")
-
-# Rust
-mod_info_rustcarbon=(MOD "rustcarbon" "Carbon for Rust" "${carbonrustlatestlink}" "Carbon.Linux.Release.tar.gz" "0" "LowercaseOff" "${systemdir}" "OVERWRITE" "ENGINES" "Rust;" "NOTGAMES" "carbonmod.gg" "Allows for the use of both plugins and harmony mods")
-
-# Oxidemod
-mod_info_rustoxide=(MOD "rustoxide" "Oxide for Rust" "${oxiderustlatestlink}" "Oxide.Rust-linux.zip" "0" "LowercaseOff" "${systemdir}" "OVERWRITE" "ENGINES" "Rust;" "NOTGAMES" "https://umod.org/games/rust" "Allows for the use of plugins")
-mod_info_hwoxide=(MOD "hwoxide" "Oxide for Hurtworld" "${oxidehurtworldlatestlink}" "Oxide.Hurtworld.zip" "0" "LowercaseOff" "${systemdir}" "OVERWRITE" "ENGINES" "Hurtworld;" "NOTGAMES" "https://umod.org/games/hurtworld" "Allows for the use of plugins")
-mod_info_sdtdoxide=(MOD "sdtdoxide" "Oxide for 7 Days To Die" "${oxidesdtdlatestlink}" "Oxide.SevenDaysToDie.zip" "0" "LowercaseOff" "${systemdir}" "OVERWRITE" "ENGINES" "7 Days To Die;" "NOTGAMES" "https://umod.org/games/7-days-to-die" "Allows for the use of plugins")
-
-# ValheimPlus
-mod_info_valheimplus=(MOD "valheimplus" "Valheim PLUS" "${valeimpluslatestlink}" "ValheimPlus.tar.gz" "0" "LowercaseOff" "${systemdir}" "OVERWRITE" "ENGINES" "Valheim;" "NOTGAMES" "https://github.com/valheimPlus/ValheimPlus" "Mod to improve Valheim gameplay")
-
-# BepInEx Valheim
-mod_info_bepinexvh=(MOD "bepinexvh" "BepInEx Valheim" "${bepinexvhlatestlink}" "denikson-BepInExPack_Valheim.zip" "0" "LowercaseOff" "${systemdir}" "OVERWRITE" "ENGINES" "Valheim;" "NOTGAMES" "https://valheim.thunderstore.io/package/denikson/BepInExPack_Valheim/" "Unity / XNA game patcher and plugin framework")
-
-# REQUIRED: Set all mods info into the global array
-mods_global_array=("${mod_info_metamod[@]}" "${mod_info_base_amxx[@]}" "${mod_info_cs_amxx[@]}" "${mod_info_dod_amxx[@]}" "${mod_info_tfc_amxx[@]}" "${mod_info_ns_amxx[@]}" "${mod_info_ts_amxx[@]}" "${mod_info_metamodsource[@]}" "${mod_info_sourcemod[@]}" "${mod_info_steamworks[@]}" "${mod_info_gokz[@]}" "${mod_info_ttt[@]}" "${mod_info_get5[@]}" "${mod_info_prac[@]}" "${mod_info_pug[@]}" "${mod_info_dhook[@]}" "${mod_info_movement[@]}" "${mod_info_cleaner[@]}" "${mod_info_ulib[@]}" "${mod_info_ulx[@]}" "${mod_info_utime[@]}" "${mod_info_uclip[@]}" "${mod_info_acf[@]}" "${mod_info_acf_missiles[@]}" "${mod_info_acf_sweps[@]}" "${mod_info_advdupe2[@]}" "${mod_info_pac3[@]}" "${mod_info_wiremod[@]}" "${mod_info_wiremodextras[@]}" "${mod_info_darkrp[@]}" "${mod_info_darkrpmodification[@]}" "${mod_info_rustcarbon[@]}" "${mod_info_rustoxide[@]}" "${mod_info_hwoxide[@]}" "${mod_info_sdtdoxide[@]}" "${mod_info_advduplicator[@]}" "${mod_info_trackassemblytool[@]}" "${mod_info_physpropertiesadv[@]}" "${mod_info_controlsystemse2[@]}" "${mod_info_e2pistontiming[@]}" "${mod_info_propcannontool[@]}" "${mod_info_gearassemblytool[@]}" "${mod_info_spinnertool[@]}" "${mod_info_surfacefrictiontool[@]}" "${mod_info_magneticdipole[@]}" "${mod_info_environmentorganizer[@]}" "${mod_info_precision_alignment[@]}" "${mod_info_improved_stacker[@]}" "${mod_info_improved_weight[@]}" "${mod_info_improved_antinoclip[@]}" "${mod_info_laserstool[@]}" "${mod_info_valheimplus[@]}" "${mod_info_bepinexvh[@]}")
diff --git a/lgsm/functions/query_gamedig.sh b/lgsm/functions/query_gamedig.sh
deleted file mode 100644
index 344874011..000000000
--- a/lgsm/functions/query_gamedig.sh
+++ /dev/null
@@ -1,93 +0,0 @@
-#!/bin/bash
-# LinuxGSM query_gamedig.sh module
-# Author: Daniel Gibbs
-# Contributors: http://linuxgsm.com/contrib
-# Website: https://linuxgsm.com
-# Description: Querys a gameserver using node-gamedig.
-# https://github.com/gamedig/node-gamedig
-
-functionselfname="$(basename "$(readlink -f "${BASH_SOURCE[0]}")")"
-querystatus="2"
-# Check if gamedig and jq are installed.
-if [ "$(command -v gamedig 2> /dev/null)" ] && [ "$(command -v jq 2> /dev/null)" ]; then
-
-	# will bypass query if server offline.
-	check_status.sh
-	if [ "${status}" != "0" ]; then
-		# GameDig requires you use the voice port when querying.
-		if [ "${querytype}" == "teamspeak3" ]; then
-			queryport="${port}"
-		fi
-		# checks if query is working null = pass.
-		gamedigcmd=$(echo -e "gamedig --type \"${querytype}\" --host \"${queryip}\" --query_port \"${queryport}\"|jq")
-		gamedigraw=$(gamedig --type "${querytype}" --host "${queryip}" --query_port "${queryport}")
-		querystatus=$(echo "${gamedigraw}" | jq '.error|length')
-
-		if [ "${querystatus}" != "null" ]; then
-			gamedigcmd=$(echo -e "gamedig --type \"${querytype}\" --host \"${queryip}\" --port \"${queryport}\"|jq")
-			gamedigraw=$(gamedig --type "${querytype}" --host "${queryip}" --port "${queryport}")
-			querystatus=$(echo "${gamedigraw}" | jq '.error|length')
-		fi
-
-		if [ "${querytype}" == "teamspeak3" ]; then
-			fn_info_game_ts3
-		fi
-
-		# server name.
-		gdname=$(echo "${gamedigraw}" | jq -re '.name')
-		if [ "${gdname}" == "null" ]; then
-			unset gdname
-		fi
-
-		# numplayers.
-		if [ "${querytype}" == "minecraft" ]; then
-			gdplayers=$(echo "${gamedigraw}" | jq -re '.players | length-1')
-		elif [ "${querytype}" == "teamspeak3" ]; then
-			gdplayers=$(echo "${gamedigraw}" | jq -re '.raw.virtualserver_clientsonline')
-		else
-			gdplayers=$(echo "${gamedigraw}" | jq -re '.players | length')
-		fi
-		if [ "${gdplayers}" == "null" ]; then
-			unset gdplayers
-		elif [ "${gdplayers}" == "[]" ] || [ "${gdplayers}" == "-1" ]; then
-			gdplayers=0
-		fi
-
-		# maxplayers.
-		gdmaxplayers=$(echo "${gamedigraw}" | jq -re '.maxplayers')
-		if [ "${gdmaxplayers}" == "null" ]; then
-			unset gdmaxplayers
-		elif [ "${gdmaxplayers}" == "[]" ]; then
-			gdmaxplayers=0
-		fi
-
-		# current map.
-		gdmap=$(echo "${gamedigraw}" | jq -re '.map')
-		if [ "${gdmap}" == "null" ]; then
-			unset gdmap
-		fi
-
-		# current gamemode.
-		gdgamemode=$(echo "${gamedigraw}" | jq -re '.raw.rules.GameMode_s')
-		if [ "${gdgamemode}" == "null" ]; then
-			unset gdgamemode
-		fi
-
-		# numbots.
-		gdbots=$(echo "${gamedigraw}" | jq -re '.bots | length')
-		if [ "${gdbots}" == "null" ] || [ "${gdbots}" == "0" ]; then
-			unset gdbots
-		fi
-
-		# server version.
-		if [ "${querytype}" == "teamspeak3" ]; then
-			gdversion=$(echo "${gamedigraw}" | jq -re '.raw.virtualserver_version')
-		else
-			gdversion=$(echo "${gamedigraw}" | jq -re '.raw.version')
-		fi
-
-		if [ "${gdversion}" == "null" ] || [ "${gdversion}" == "0" ]; then
-			unset gdversion
-		fi
-	fi
-fi
diff --git a/lgsm/functions/query_gsquery.py b/lgsm/functions/query_gsquery.py
deleted file mode 100644
index 62c92082e..000000000
--- a/lgsm/functions/query_gsquery.py
+++ /dev/null
@@ -1,151 +0,0 @@
-#! /usr/bin/env python3
-# -*- coding: utf-8 -*-
-# LinuxGSM query_gsquery.py function
-# Author: Daniel Gibbs
-# Contributors: http://linuxgsm.com/contrib
-# Website: https://linuxgsm.com
-# Description: Allows querying of various game servers.
-
-import argparse
-import socket
-import sys
-
-engine_types=('protocol-valve','protocol-quake3','protocol-quake3','protocol-gamespy1','protocol-unreal2','ut3','minecraft','minecraftbe','jc2mp','mumbleping','soldat','teeworlds')
-
-class gsquery:
-    server_response_timeout = 5
-    default_buffer_length = 1024
-    sourcequery=('protocol-valve','avalanche3.0','barotrauma','madness','quakelive','realvirtuality','refractor','source','goldsrc','spark','starbound','unity3d','unreal4','wurm')
-    idtech2query=('protocol-quake3','idtech2','quake','iw2.0')
-    idtech3query=('protocol-quake3','iw3.0','ioquake3','qfusion')
-    minecraftquery=('minecraft','lwjgl2')
-    minecraftbequery=('minecraftbe',)
-    jc2mpquery=('jc2mp',)
-    mumblequery=('mumbleping',)
-    soldatquery=('soldat',)
-    twquery=('teeworlds',)
-    unrealquery=('protocol-gamespy1','unreal')
-    unreal2query=('protocol-unreal2','unreal2')
-    unreal3query=('ut3','unreal3')
-
-    def __init__(self, arguments):
-        self.argument = arguments
-        #
-        if self.argument.engine in self.sourcequery:
-            self.query_prompt_string = b'\xFF\xFF\xFF\xFFTSource Engine Query\0'
-        elif self.argument.engine in self.idtech2query:
-            self.query_prompt_string = b'\xff\xff\xff\xffstatus\x00'
-        elif self.argument.engine in self.idtech3query:
-            self.query_prompt_string = b'\xff\xff\xff\xffgetstatus'
-        elif self.argument.engine in self.jc2mpquery:
-            self.query_prompt_string = b'\xFE\xFD\x09\x10\x20\x30\x40'
-        elif self.argument.engine in self.minecraftquery:
-            self.query_prompt_string = b'\xFE\xFD\x09\x3d\x54\x1f\x93'
-        elif self.argument.engine in self.minecraftbequery:
-            self.query_prompt_string = b'\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\xff\xff\x00\xfe\xfe\xfe\xfe\xfd\xfd\xfd\xfd\x12\x34\x56\x78\x00\x00\x00\x00\x00\x00\x00\x00'
-        elif self.argument.engine in self.mumblequery:
-            self.query_prompt_string = b'\x00\x00\x00\x00\x01\x02\x03\x04\x05\x06\x07\x08'
-        elif self.argument.engine in self.soldatquery:
-            self.query_prompt_string = b'\x69\x00'
-        elif self.argument.engine in self.twquery:
-            self.query_prompt_string = b'\x04\x00\x00\xff\xff\xff\xff\x05' + bytearray(511)
-        elif self.argument.engine in self.unrealquery:
-            self.query_prompt_string = b'\x5C\x69\x6E\x66\x6F\x5C'
-        elif self.argument.engine in self.unreal2query:
-            self.query_prompt_string = b'\x79\x00\x00\x00\x00'
-        elif self.argument.engine in self.unreal3query:
-            self.query_prompt_string = b'\xFE\xFD\x09\x00\x00\x00\x00'
-
-        self.connected = False
-        self.response = None
-
-    @staticmethod
-    def fatal_error(error_message, error_code=1):
-        sys.stderr.write('ERROR: ' + str(error_message) + '\n')
-        sys.exit(error_code)
-
-    @staticmethod
-    def exit_success(success_message=''):
-        sys.stdout.write('OK: ' + str(success_message) + '\n')
-        sys.exit(0)
-
-    def responding(self):
-        # Connect.
-        connection = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
-        connection.settimeout(self.server_response_timeout)
-        try:
-            self.connected = connection.connect((self.argument.address, int(self.argument.port)))
-        except socket.timeout:
-            self.fatal_error('Request timed out', 1)
-        except Exception:
-            self.fatal_error('Unable to connect', 1)
-        # Send.
-        connection.send(self.query_prompt_string)
-        # Receive.
-        try:
-            self.response = connection.recv(self.default_buffer_length)
-        except socket.error:
-            self.fatal_error('Unable to receive', 2)
-        connection.close()
-        # Response.
-        if self.response is None:
-            self.fatal_error('No response', 3)
-        if len(self.response) < 5:
-            sys.exit('Short response.', 3)
-        else:
-            self.exit_success(str(self.response))
-
-def parse_args():
-    parser = argparse.ArgumentParser(
-        description='Allows querying of various game servers.',
-        usage='usage: python3 %(prog)s [options]',
-        add_help=False
-    )
-    parser.add_argument(
-        '-a', '--address',
-        type=str,
-        required=True,
-        help='The IPv4 address of the server.'
-    )
-    parser.add_argument(
-        '-p', '--port',
-        type=int,
-        required=True,
-        help='The IPv4 port of the server.'
-    )
-    parser.add_argument(
-        '-e', '--engine',
-        metavar='ENGINE',
-        choices=engine_types,
-        help='Engine type: ' + ' '.join(engine_types)
-    )
-    parser.add_argument(
-        '-v', '--verbose',
-        action='store_true',
-        help='Display verbose output.'
-    )
-    parser.add_argument(
-        '-d', '--debug',
-        action='store_true',
-        help='Display debugging output.'
-    )
-    parser.add_argument(
-        '-V', '--version',
-        action='version',
-        version='%(prog)s 0.0.1',
-        help='Display version and exit.'
-    )
-    parser.add_argument(
-        '-h', '--help',
-        action='help',
-        help='Display help and exit.'
-    )
-    return parser.parse_args()
-
-def main():
-    arguments = parse_args()
-    server = gsquery(arguments)
-    server.responding()
-
-if __name__ == '__main__':
-    main()
diff --git a/lgsm/functions/update_factorio.sh b/lgsm/functions/update_factorio.sh
deleted file mode 100644
index 852ab9d87..000000000
--- a/lgsm/functions/update_factorio.sh
+++ /dev/null
@@ -1,168 +0,0 @@
-#!/bin/bash
-# LinuxGSM update_factorio.sh module
-# Author: Daniel Gibbs
-# Contributors: http://linuxgsm.com/contrib
-# Website: https://linuxgsm.com
-# Description: Handles updating of Factorio servers.
-
-functionselfname="$(basename "$(readlink -f "${BASH_SOURCE[0]}")")"
-
-fn_update_dl() {
-	# Download and extract files to serverfiles.
-	fn_fetch_file "${remotebuildurl}" "" "" "" "${tmpdir}" "${remotebuildfilename}" "nochmodx" "norun" "force" "nohash"
-	fn_dl_extract "${tmpdir}" "factorio_headless_${factorioarch}-${remotebuildversion}.tar.xz" "${serverfiles}" "factorio"
-	fn_clear_tmp
-}
-
-fn_update_localbuild() {
-	# Gets local build info.
-	fn_print_dots "Checking local build: ${remotelocation}"
-	# Uses executable to get local build.
-	if [ -d "${executabledir}" ]; then
-		cd "${executabledir}" || exit
-		localbuild=$(${executable} --version | grep "Version:" | awk '{print $2}')
-	fi
-	if [ -z "${localbuild}" ]; then
-		fn_print_error "Checking local build: ${remotelocation}: missing local build info"
-		fn_script_log_error "Missing local build info"
-		fn_script_log_error "Set localbuild to 0"
-		localbuild="0"
-	else
-		fn_print_ok "Checking local build: ${remotelocation}"
-		fn_script_log_pass "Checking local build"
-	fi
-}
-
-fn_update_remotebuild() {
-	# Get remote build info.
-	apiurl="https://factorio.com/get-download/${branch}/headless/${factorioarch}"
-	remotebuildresponse=$(curl -s "${apiurl}")
-	remotebuildversion=$(echo "${remotebuildresponse}" | grep -o '[0-9]\.[0-9]\{1,\}\.[0-9]\{1,\}' | head -1)
-	remotebuildurl="https://factorio.com/get-download/${branch}/headless/${factorioarch}"
-	remotebuildfilename="factorio_headless_${factorioarch}-${remotebuildversion}.tar.xz"
-
-	if [ "${firstcommandname}" != "INSTALL" ]; then
-		fn_print_dots "Checking remote build: ${remotelocation}"
-		# Checks if remotebuildversion variable has been set.
-		if [ -z "${remotebuildversion}" ] || [ "${remotebuildversion}" == "null" ]; then
-			fn_print_fail "Checking remote build: ${remotelocation}"
-			fn_script_log_fatal "Checking remote build"
-			core_exit.sh
-		else
-			fn_print_ok "Checking remote build: ${remotelocation}"
-			fn_script_log_pass "Checking remote build"
-		fi
-	else
-		# Checks if remotebuild variable has been set.
-		if [ -z "${remotebuildversion}" ] || [ "${remotebuildversion}" == "null" ]; then
-			fn_print_failure "Unable to get remote build"
-			fn_script_log_fatal "Unable to get remote build"
-			core_exit.sh
-		fi
-	fi
-}
-
-fn_update_compare() {
-	fn_print_dots "Checking for update: ${remotelocation}"
-	if [ "${localbuild}" != "${remotebuildversion}" ] || [ "${forceupdate}" == "1" ]; then
-		fn_print_ok_nl "Checking for update: ${remotelocation}"
-		echo -en "\n"
-		echo -e "Update available"
-		echo -e "* Local build: ${red}${localbuild} ${factorioarch}${default}"
-		echo -e "* Remote build: ${green}${remotebuildversion} ${factorioarch}${default}"
-		if [ -n "${branch}" ]; then
-			echo -e "* Branch: ${branch}"
-		fi
-		if [ -f "${rootdir}/.dev-debug" ]; then
-			echo -e "Remote build info"
-			echo -e "* apiurl: ${apiurl}"
-			echo -e "* remotebuildfilename: ${remotebuildfilename}"
-			echo -e "* remotebuildurl: ${remotebuildurl}"
-			echo -e "* remotebuildversion: ${remotebuildversion}"
-		fi
-		echo -en "\n"
-		fn_script_log_info "Update available"
-		fn_script_log_info "Local build: ${localbuild} ${factorioarch}"
-		fn_script_log_info "Remote build: ${remotebuildversion} ${factorioarch}"
-		if [ -n "${branch}" ]; then
-			fn_script_log_info "Branch: ${branch}"
-		fi
-		fn_script_log_info "${localbuild} > ${remotebuildversion}"
-
-		if [ "${commandname}" == "UPDATE" ]; then
-			unset updateonstart
-			check_status.sh
-			# If server stopped.
-			if [ "${status}" == "0" ]; then
-				fn_update_dl
-				if [ "${localbuild}" == "0" ]; then
-					exitbypass=1
-					command_start.sh
-					fn_firstcommand_reset
-					exitbypass=1
-					sleep 5
-					command_stop.sh
-					fn_firstcommand_reset
-				fi
-			# If server started.
-			else
-				fn_print_restart_warning
-				exitbypass=1
-				command_stop.sh
-				fn_firstcommand_reset
-				exitbypass=1
-				fn_update_dl
-				exitbypass=1
-				command_start.sh
-				fn_firstcommand_reset
-			fi
-			unset exitbypass
-			date +%s > "${lockdir}/lastupdate.lock"
-			alert="update"
-		elif [ "${commandname}" == "CHECK-UPDATE" ]; then
-			alert="check-update"
-		fi
-		alert.sh
-	else
-		fn_print_ok_nl "Checking for update: ${remotelocation}"
-		echo -en "\n"
-		echo -e "No update available"
-		echo -e "* Local build: ${green}${localbuild} ${factorioarch}${default}"
-		echo -e "* Remote build: ${green}${remotebuildversion} ${factorioarch}${default}"
-		if [ -n "${branch}" ]; then
-			echo -e "* Branch: ${branch}"
-		fi
-		echo -en "\n"
-		fn_script_log_info "No update available"
-		fn_script_log_info "Local build: ${localbuild} ${factorioarch}"
-		fn_script_log_info "Remote build: ${remotebuildversion} ${factorioarch}"
-		if [ -n "${branch}" ]; then
-			fn_script_log_info "Branch: ${branch}"
-		fi
-		if [ -f "${rootdir}/.dev-debug" ]; then
-			echo -e "Remote build info"
-			echo -e "* apiurl: ${apiurl}"
-			echo -e "* remotebuildfilename: ${remotebuildfilename}"
-			echo -e "* remotebuildurl: ${remotebuildurl}"
-			echo -e "* remotebuildversion: ${remotebuildversion}"
-		fi
-	fi
-}
-
-# Game server architecture.
-factorioarch="linux64"
-
-# The location where the builds are checked and downloaded.
-remotelocation="factorio.com"
-
-if [ "${firstcommandname}" == "INSTALL" ]; then
-	fn_update_remotebuild
-	fn_update_dl
-else
-	fn_print_dots "Checking for update"
-	fn_print_dots "Checking for update: ${remotelocation}"
-	fn_script_log_info "Checking for update: ${remotelocation}"
-	fn_update_localbuild
-	fn_update_remotebuild
-	fn_update_compare
-fi
diff --git a/lgsm/functions/update_jediknight2.sh b/lgsm/functions/update_jediknight2.sh
deleted file mode 100644
index a88b96f61..000000000
--- a/lgsm/functions/update_jediknight2.sh
+++ /dev/null
@@ -1,163 +0,0 @@
-#!/bin/bash
-# LinuxGSM update_jk2.sh module
-# Author: Daniel Gibbs
-# Contributors: http://linuxgsm.com/contrib
-# Website: https://linuxgsm.com
-# Description: Handles updating of Jedi Knight 2 servers.
-
-functionselfname="$(basename "$(readlink -f "${BASH_SOURCE[0]}")")"
-
-fn_update_dl() {
-	# Download and extract files to serverfiles.
-	fn_fetch_file "${remotebuildurl}" "" "" "" "${tmpdir}" "${remotebuildfilename}" "nochmodx" "norun" "force" "nohash"
-	fn_dl_extract "${tmpdir}" "${remotebuildfilename}" "${serverfiles}/GameData" "linux-amd64"
-	fn_clear_tmp
-}
-
-fn_update_localbuild() {
-	# Gets local build info.
-	fn_print_dots "Checking local build: ${remotelocation}"
-	# Uses log file to get local build.
-	localbuild=$(grep "\"version\"" "${consolelogdir}"/* 2> /dev/null | sed 's/.*://' | awk '{print $1}' | head -n 1 | sed 's/v//')
-	if [ -z "${localbuild}" ]; then
-		fn_print_error "Checking local build: ${remotelocation}: missing local build info"
-		fn_script_log_error "Missing local build info"
-		fn_script_log_error "Set localbuild to 0"
-		localbuild="0"
-	else
-		fn_print_ok "Checking local build: ${remotelocation}"
-		fn_script_log_pass "Checking local build"
-	fi
-}
-
-fn_update_remotebuild() {
-	# Get remote build info.
-	apiurl="https://api.github.com/repos/mvdevs/jk2mv/releases/latest"
-	remotebuildresponse=$(curl -s "${apiurl}")
-	remotebuildfilename=$(echo "${remotebuildresponse}" | jq -r '.assets[]|select(.browser_download_url | contains("dedicated.zip")) | .name')
-	remotebuildurl=$(echo "${remotebuildresponse}" | jq -r '.assets[]|select(.browser_download_url | contains("dedicated.zip")) | .browser_download_url')
-	remotebuildversion=$(echo "${remotebuildresponse}" | jq -r '.tag_name')
-
-	if [ "${firstcommandname}" != "INSTALL" ]; then
-		fn_print_dots "Checking remote build: ${remotelocation}"
-		# Checks if remotebuildversion variable has been set.
-		if [ -z "${remotebuildversion}" ] || [ "${remotebuildversion}" == "null" ]; then
-			fn_print_fail "Checking remote build: ${remotelocation}"
-			fn_script_log_fatal "Checking remote build"
-			core_exit.sh
-		else
-			fn_print_ok "Checking remote build: ${remotelocation}"
-			fn_script_log_pass "Checking remote build"
-		fi
-	else
-		# Checks if remotebuild variable has been set.
-		if [ -z "${remotebuildversion}" ] || [ "${remotebuildversion}" == "null" ]; then
-			fn_print_failure "Unable to get remote build"
-			fn_script_log_fatal "Unable to get remote build"
-			core_exit.sh
-		fi
-	fi
-}
-
-fn_update_compare() {
-	fn_print_dots "Checking for update: ${remotelocation}"
-	if [ "${localbuild}" != "${remotebuildversion}" ] || [ "${forceupdate}" == "1" ]; then
-		fn_print_ok_nl "Checking for update: ${remotelocation}"
-		echo -en "\n"
-		echo -e "Update available"
-		echo -e "* Local build: ${red}${localbuild}${default}"
-		echo -e "* Remote build: ${green}${remotebuildversion}${default}"
-		if [ -n "${branch}" ]; then
-			echo -e "* Branch: ${branch}"
-		fi
-		if [ -f "${rootdir}/.dev-debug" ]; then
-			echo -e "Remote build info"
-			echo -e "* apiurl: ${apiurl}"
-			echo -e "* remotebuildfilename: ${remotebuildfilename}"
-			echo -e "* remotebuildurl: ${remotebuildurl}"
-			echo -e "* remotebuildversion: ${remotebuildversion}"
-		fi
-		echo -en "\n"
-		fn_script_log_info "Update available"
-		fn_script_log_info "Local build: ${localbuild}"
-		fn_script_log_info "Remote build: ${remotebuildversion}"
-		if [ -n "${branch}" ]; then
-			fn_script_log_info "Branch: ${branch}"
-		fi
-		fn_script_log_info "${localbuild} > ${remotebuildversion}"
-
-		if [ "${commandname}" == "UPDATE" ]; then
-			unset updateonstart
-			check_status.sh
-			# If server stopped.
-			if [ "${status}" == "0" ]; then
-				fn_update_dl
-				if [ "${localbuild}" == "0" ]; then
-					exitbypass=1
-					command_start.sh
-					fn_firstcommand_reset
-					exitbypass=1
-					sleep 5
-					command_stop.sh
-					fn_firstcommand_reset
-				fi
-			# If server started.
-			else
-				fn_print_restart_warning
-				exitbypass=1
-				command_stop.sh
-				fn_firstcommand_reset
-				exitbypass=1
-				fn_update_dl
-				exitbypass=1
-				command_start.sh
-				fn_firstcommand_reset
-			fi
-			unset exitbypass
-			date +%s > "${lockdir}/lastupdate.lock"
-			alert="update"
-		elif [ "${commandname}" == "CHECK-UPDATE" ]; then
-			alert="check-update"
-		fi
-		alert.sh
-	else
-		fn_print_ok_nl "Checking for update: ${remotelocation}"
-		echo -en "\n"
-		echo -e "No update available"
-		echo -e "* Local build: ${green}${localbuild}${default}"
-		echo -e "* Remote build: ${green}${remotebuildversion}${default}"
-		if [ -n "${branch}" ]; then
-			echo -e "* Branch: ${branch}"
-		fi
-		echo -en "\n"
-		fn_script_log_info "No update available"
-		fn_script_log_info "Local build: ${localbuild}"
-		fn_script_log_info "Remote build: ${remotebuildversion}"
-		if [ -n "${branch}" ]; then
-			fn_script_log_info "Branch: ${branch}"
-		fi
-		if [ -f "${rootdir}/.dev-debug" ]; then
-			echo -e "Remote build info"
-			echo -e "* apiurl: ${apiurl}"
-			echo -e "* remotebuildfilename: ${remotebuildfilename}"
-			echo -e "* remotebuildurl: ${remotebuildurl}"
-			echo -e "* remotebuildversion: ${remotebuildversion}"
-		fi
-	fi
-}
-
-# The location where the builds are checked and downloaded.
-remotelocation="github.com"
-
-if [ "${firstcommandname}" == "INSTALL" ]; then
-	fn_update_remotebuild
-	fn_update_dl
-else
-	update_steamcmd.sh
-	fn_print_dots "Checking for update"
-	fn_print_dots "Checking for update: ${remotelocation}"
-	fn_script_log_info "Checking for update: ${remotelocation}"
-	fn_update_localbuild
-	fn_update_remotebuild
-	fn_update_compare
-fi
diff --git a/lgsm/functions/update_minecraft.sh b/lgsm/functions/update_minecraft.sh
deleted file mode 100644
index dbef26d34..000000000
--- a/lgsm/functions/update_minecraft.sh
+++ /dev/null
@@ -1,176 +0,0 @@
-#!/bin/bash
-# LinuxGSM update_minecraft.sh module
-# Author: Daniel Gibbs
-# Contributors: http://linuxgsm.com/contrib
-# Website: https://linuxgsm.com
-# Description: Handles updating of Minecraft: Java Edition servers.
-
-functionselfname="$(basename "$(readlink -f "${BASH_SOURCE[0]}")")"
-
-fn_update_dl() {
-	# Download and extract files to serverfiles.
-	fn_fetch_file "${remotebuildurl}" "" "" "" "${tmpdir}" "${remotebuildfilename}" "chmodx" "norun" "noforce" "nohash"
-	cp -f "${tmpdir}/${remotebuildfilename}" "${serverfiles}/${executable#./}"
-}
-
-fn_update_localbuild() {
-	# Gets local build info.
-	fn_print_dots "Checking local build: ${remotelocation}"
-	# Uses executable to get local build.
-	if [ -d "${executabledir}" ]; then
-		cd "${executabledir}" || exit
-		localbuild=$(unzip -p "minecraft_server.jar" version.json | jq -r '.id')
-	fi
-	if [ -z "${localbuild}" ]; then
-		fn_print_error "Checking local build: ${remotelocation}: missing local build info"
-		fn_script_log_error "Missing local build info"
-		fn_script_log_error "Set localbuild to 0"
-		localbuild="0"
-	else
-		fn_print_ok "Checking local build: ${remotelocation}"
-		fn_script_log_pass "Checking local build"
-	fi
-}
-
-fn_update_remotebuild() {
-	# Get remote build info.
-	apiurl="https://launchermeta.mojang.com/mc/game/version_manifest.json"
-	remotebuildresponse=$(curl -s "${apiurl}")
-	# Latest release.
-	if [ "${branch}" == "release" ] && [ "${mcversion}" == "latest" ]; then
-		remotebuildversion=$(echo "${remotebuildresponse}" | jq -r '.latest.release')
-	# Latest snapshot.
-	elif [ "${branch}" == "snapshot" ] && [ "${mcversion}" == "latest" ]; then
-		remotebuildversion=$(echo "${remotebuildresponse}" | jq -r '.latest.snapshot')
-	# Specific release/snapshot.
-	else
-		remotebuildversion=$(echo "${remotebuildresponse}" | jq -r --arg branch "${branch}" --arg mcversion "${mcversion}" '.versions | .[] | select(.type==$branch and .id==$mcversion) | .id')
-	fi
-	remotebuildfilename="minecraft_server.${remotebuildversion}.jar"
-	# Generate link to version manifest json.
-	remotebuildmanifest=$(echo "${remotebuildresponse}" | jq -r --arg branch "${branch}" --arg mcversion "${remotebuildversion}" '.versions | .[] | select(.type==$branch and .id==$mcversion) | .url')
-	# Generate link to server.jar
-	remotebuildurl=$(curl -s "${remotebuildmanifest}" | jq -r '.downloads.server.url')
-
-	if [ "${firstcommandname}" != "INSTALL" ]; then
-		fn_print_dots "Checking remote build: ${remotelocation}"
-		# Checks if remotebuildversion variable has been set.
-		if [ -z "${remotebuildversion}" ] || [ "${remotebuildversion}" == "null" ]; then
-			fn_print_fail "Checking remote build: ${remotelocation}"
-			fn_script_log_fatal "Checking remote build"
-			core_exit.sh
-		else
-			fn_print_ok "Checking remote build: ${remotelocation}"
-			fn_script_log_pass "Checking remote build"
-		fi
-	else
-		# Checks if remotebuild variable has been set.
-		if [ -z "${remotebuildversion}" ] || [ "${remotebuildversion}" == "null" ]; then
-			fn_print_failure "Unable to get remote build"
-			fn_script_log_fatal "Unable to get remote build"
-			core_exit.sh
-		fi
-	fi
-}
-
-fn_update_compare() {
-	fn_print_dots "Checking for update: ${remotelocation}"
-	if [ "${localbuild}" != "${remotebuildversion}" ] || [ "${forceupdate}" == "1" ]; then
-		fn_print_ok_nl "Checking for update: ${remotelocation}"
-		echo -en "\n"
-		echo -e "Update available"
-		echo -e "* Local build: ${red}${localbuild}${default}"
-		echo -e "* Remote build: ${green}${remotebuildversion}${default}"
-		if [ -n "${branch}" ]; then
-			echo -e "* Branch: ${branch}"
-		fi
-		if [ -f "${rootdir}/.dev-debug" ]; then
-			echo -e "Remote build info"
-			echo -e "* apiurl: ${apiurl}"
-			echo -e "* remotebuildfilename: ${remotebuildfilename}"
-			echo -e "* remotebuildurl: ${remotebuildurl}"
-			echo -e "* remotebuildversion: ${remotebuildversion}"
-		fi
-		echo -en "\n"
-		fn_script_log_info "Update available"
-		fn_script_log_info "Local build: ${localbuild}"
-		fn_script_log_info "Remote build: ${remotebuildversion}"
-		if [ -n "${branch}" ]; then
-			fn_script_log_info "Branch: ${branch}"
-		fi
-		fn_script_log_info "${localbuild} > ${remotebuildversion}"
-
-		if [ "${commandname}" == "UPDATE" ]; then
-			unset updateonstart
-			check_status.sh
-			# If server stopped.
-			if [ "${status}" == "0" ]; then
-				fn_update_dl
-				if [ "${localbuild}" == "0" ]; then
-					exitbypass=1
-					command_start.sh
-					fn_firstcommand_reset
-					exitbypass=1
-					sleep 5
-					command_stop.sh
-					fn_firstcommand_reset
-				fi
-			# If server started.
-			else
-				fn_print_restart_warning
-				exitbypass=1
-				command_stop.sh
-				fn_firstcommand_reset
-				exitbypass=1
-				fn_update_dl
-				exitbypass=1
-				command_start.sh
-				fn_firstcommand_reset
-			fi
-			unset exitbypass
-			date +%s > "${lockdir}/lastupdate.lock"
-			alert="update"
-		elif [ "${commandname}" == "CHECK-UPDATE" ]; then
-			alert="check-update"
-		fi
-		alert.sh
-	else
-		fn_print_ok_nl "Checking for update: ${remotelocation}"
-		echo -en "\n"
-		echo -e "No update available"
-		echo -e "* Local build: ${green}${localbuild}${default}"
-		echo -e "* Remote build: ${green}${remotebuildversion}${default}"
-		if [ -n "${branch}" ]; then
-			echo -e "* Branch: ${branch}"
-		fi
-		echo -en "\n"
-		fn_script_log_info "No update available"
-		fn_script_log_info "Local build: ${localbuild}"
-		fn_script_log_info "Remote build: ${remotebuildversion}"
-		if [ -n "${branch}" ]; then
-			fn_script_log_info "Branch: ${branch}"
-		fi
-		if [ -f "${rootdir}/.dev-debug" ]; then
-			echo -e "Remote build info"
-			echo -e "* apiurl: ${apiurl}"
-			echo -e "* remotebuildfilename: ${remotebuildfilename}"
-			echo -e "* remotebuildurl: ${remotebuildurl}"
-			echo -e "* remotebuildversion: ${remotebuildversion}"
-		fi
-	fi
-}
-
-# The location where the builds are checked and downloaded.
-remotelocation="mojang.com"
-
-if [ "${firstcommandname}" == "INSTALL" ]; then
-	fn_update_remotebuild
-	fn_update_dl
-else
-	fn_print_dots "Checking for update"
-	fn_print_dots "Checking for update: ${remotelocation}"
-	fn_script_log_info "Checking for update: ${remotelocation}"
-	fn_update_localbuild
-	fn_update_remotebuild
-	fn_update_compare
-fi
diff --git a/lgsm/functions/update_minecraft_bedrock.sh b/lgsm/functions/update_minecraft_bedrock.sh
deleted file mode 100644
index c17088171..000000000
--- a/lgsm/functions/update_minecraft_bedrock.sh
+++ /dev/null
@@ -1,181 +0,0 @@
-#!/bin/bash
-# LinuxGSM update_minecraft_bedrock.sh module
-# Author: Daniel Gibbs
-# Contributors: http://linuxgsm.com/contrib
-# Website: https://linuxgsm.com
-# Description: Handles updating of Minecraft Bedrock servers.
-
-functionselfname="$(basename "$(readlink -f "${BASH_SOURCE[0]}")")"
-
-fn_update_dl() {
-	fn_fetch_file "${remotebuildurl}" "" "" "" "${tmpdir}" "bedrock_server.${remotebuildversion}.zip" "nochmodx" "norun" "noforce" "nohash"
-	echo -e "Extracting to ${serverfiles}...\c"
-	if [ "${firstcommandname}" == "INSTALL" ]; then
-		unzip -oq "${tmpdir}/bedrock_server.${remotebuildversion}.zip" -x "server.properties" -d "${serverfiles}"
-	else
-		unzip -oq "${tmpdir}/bedrock_server.${remotebuildversion}.zip" -x "permissions.json" "server.properties" "allowlist.json" -d "${serverfiles}"
-	fi
-	local exitcode=$?
-	if [ "${exitcode}" != 0 ]; then
-		fn_print_fail_eol_nl
-		fn_script_log_fatal "Extracting ${local_filename}"
-		if [ -f "${lgsmlog}" ]; then
-			echo -e "${extractcmd}" >> "${lgsmlog}"
-		fi
-		echo -e "${extractcmd}"
-		core_exit.sh
-	else
-		fn_print_ok_eol_nl
-		fn_script_log_pass "Extracting ${local_filename}"
-	fi
-}
-
-fn_update_localbuild() {
-	# Gets local build info.
-	fn_print_dots "Checking local build: ${remotelocation}"
-	# Uses log file to get local build.
-	localbuild=$(grep Version "${consolelogdir}"/* 2> /dev/null | tail -1 | sed 's/.*Version: //' | tr -d '\000-\011\013-\037')
-	if [ -z "${localbuild}" ]; then
-		fn_print_error "Checking local build: ${remotelocation}: missing local build info"
-		fn_script_log_error "Missing local build info"
-		fn_script_log_error "Set localbuild to 0"
-		localbuild="0"
-	else
-		fn_print_ok "Checking local build: ${remotelocation}"
-		fn_script_log_pass "Checking local build"
-	fi
-}
-
-fn_update_remotebuild() {
-	# Random number for userAgent
-	randnum=$((1 + RANDOM % 5000))
-	# Get remote build info.
-	if [ "${mcversion}" == "latest" ]; then
-		remotebuildversion=$(curl -H "Accept-Encoding: identity" -H "Accept-Language: en" -Ls -A "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/90.0.${randnum}.212 Safari/537.36" "https://www.minecraft.net/en-us/download/server/bedrock/" | grep -o 'https://minecraft.azureedge.net/bin-linux/[^"]*' | sed 's/.*\///' | grep -Eo "[.0-9]+[0-9]")
-	else
-		remotebuildversion="${mcversion}"
-	fi
-	remotebuildurl="https://minecraft.azureedge.net/bin-linux/bedrock-server-${remotebuildversion}.zip"
-
-	if [ "${firstcommandname}" != "INSTALL" ]; then
-		fn_print_dots "Checking remote build: ${remotelocation}"
-		# Checks if remotebuildversion variable has been set.
-		if [ -z "${remotebuildversion}" ] || [ "${remotebuildversion}" == "null" ]; then
-			fn_print_fail "Checking remote build: ${remotelocation}"
-			fn_script_log_fatal "Checking remote build"
-			core_exit.sh
-		else
-			fn_print_ok "Checking remote build: ${remotelocation}"
-			fn_script_log_pass "Checking remote build"
-		fi
-	else
-		# Checks if remotebuild variable has been set.
-		if [ -z "${remotebuildversion}" ] || [ "${remotebuildversion}" == "null" ]; then
-			fn_print_failure "Unable to get remote build"
-			fn_script_log_fatal "Unable to get remote build"
-			core_exit.sh
-		fi
-	fi
-}
-
-fn_update_compare() {
-	fn_print_dots "Checking for update: ${remotelocation}"
-	if [ "${localbuild}" != "${remotebuildversion}" ] || [ "${forceupdate}" == "1" ]; then
-		fn_print_ok_nl "Checking for update: ${remotelocation}"
-		echo -en "\n"
-		echo -e "Update available"
-		echo -e "* Local build: ${red}${localbuild}${default}"
-		echo -e "* Remote build: ${green}${remotebuildversion}${default}"
-		if [ -n "${branch}" ]; then
-			echo -e "* Branch: ${branch}"
-		fi
-		if [ -f "${rootdir}/.dev-debug" ]; then
-			echo -e "Remote build info"
-			echo -e "* apiurl: ${apiurl}"
-			echo -e "* remotebuildfilename: ${remotebuildfilename}"
-			echo -e "* remotebuildurl: ${remotebuildurl}"
-			echo -e "* remotebuildversion: ${remotebuildversion}"
-		fi
-		echo -en "\n"
-		fn_script_log_info "Update available"
-		fn_script_log_info "Local build: ${localbuild}"
-		fn_script_log_info "Remote build: ${remotebuildversion}"
-		if [ -n "${branch}" ]; then
-			fn_script_log_info "Branch: ${branch}"
-		fi
-		fn_script_log_info "${localbuild} > ${remotebuildversion}"
-
-		if [ "${commandname}" == "UPDATE" ]; then
-			unset updateonstart
-			check_status.sh
-			# If server stopped.
-			if [ "${status}" == "0" ]; then
-				fn_update_dl
-				if [ "${localbuild}" == "0" ]; then
-					exitbypass=1
-					command_start.sh
-					fn_firstcommand_reset
-					exitbypass=1
-					sleep 5
-					command_stop.sh
-					fn_firstcommand_reset
-				fi
-			# If server started.
-			else
-				fn_print_restart_warning
-				exitbypass=1
-				command_stop.sh
-				fn_firstcommand_reset
-				exitbypass=1
-				fn_update_dl
-				exitbypass=1
-				command_start.sh
-				fn_firstcommand_reset
-			fi
-			unset exitbypass
-			date +%s > "${lockdir}/lastupdate.lock"
-			alert="update"
-		elif [ "${commandname}" == "CHECK-UPDATE" ]; then
-			alert="check-update"
-		fi
-		alert.sh
-	else
-		fn_print_ok_nl "Checking for update: ${remotelocation}"
-		echo -en "\n"
-		echo -e "No update available"
-		echo -e "* Local build: ${green}${localbuild}${default}"
-		echo -e "* Remote build: ${green}${remotebuildversion}${default}"
-		if [ -n "${branch}" ]; then
-			echo -e "* Branch: ${branch}"
-		fi
-		echo -en "\n"
-		fn_script_log_info "No update available"
-		fn_script_log_info "Local build: ${localbuild}"
-		fn_script_log_info "Remote build: ${remotebuildversion}"
-		if [ -n "${branch}" ]; then
-			fn_script_log_info "Branch: ${branch}"
-		fi
-		if [ -f "${rootdir}/.dev-debug" ]; then
-			echo -e "Remote build info"
-			echo -e "* apiurl: ${apiurl}"
-			echo -e "* remotebuildfilename: ${remotebuildfilename}"
-			echo -e "* remotebuildurl: ${remotebuildurl}"
-			echo -e "* remotebuildversion: ${remotebuildversion}"
-		fi
-	fi
-}
-
-# The location where the builds are checked and downloaded.
-remotelocation="minecraft.net"
-
-if [ "${firstcommandname}" == "INSTALL" ]; then
-	fn_update_remotebuild
-	fn_update_dl
-else
-	fn_print_dots "Checking for update"
-	fn_print_dots "Checking for update: ${remotelocation}"
-	fn_script_log_info "Checking for update: ${remotelocation}"
-	fn_update_localbuild
-	fn_update_remotebuild
-	fn_update_compare
-fi
diff --git a/lgsm/functions/update_mta.sh b/lgsm/functions/update_mta.sh
deleted file mode 100644
index 5252c1328..000000000
--- a/lgsm/functions/update_mta.sh
+++ /dev/null
@@ -1,166 +0,0 @@
-#!/bin/bash
-# LinuxGSM update_mta.sh module
-# Author: Daniel Gibbs
-# Contributors: http://linuxgsm.com/contrib
-# Website: https://linuxgsm.com
-# Description: Handles updating of Multi Theft Auto servers.
-
-functionselfname="$(basename "$(readlink -f "${BASH_SOURCE[0]}")")"
-
-fn_update_dl() {
-	# Download and extract files to tmpdir.
-	fn_fetch_file "http://linux.mtasa.com/dl/multitheftauto_linux_x64.tar.gz" "" "" "" "${tmpdir}" "multitheftauto_linux_x64.tar.gz" "nochmodx" "norun" "force" "nohash"
-	fn_dl_extract "${tmpdir}" "multitheftauto_linux_x64.tar.gz" "${serverfiles}" "multitheftauto_linux_x64"
-}
-
-fn_update_localbuild() {
-	# Gets local build info.
-	fn_print_dots "Checking local build: ${remotelocation}"
-	# Uses log file to get local build.
-	localbuild=$(grep "= Multi Theft Auto: San Andreas v" "${serverfiles}/mods/deathmatch/logs/server.log" | awk '{ print $7 }' | sed -r 's/^.{1}//' | tail -1)
-	if [ -z "${localbuild}" ]; then
-		fn_print_error "Checking local build: ${remotelocation}: missing local build info"
-		fn_script_log_error "Missing local build info"
-		fn_script_log_error "Set localbuild to 0"
-		localbuild="0"
-	else
-		fn_print_ok "Checking local build: ${remotelocation}"
-		fn_script_log_pass "Checking local build"
-	fi
-}
-
-fn_update_remotebuild() {
-	# Get remote build info.
-	apiurl="https://api.github.com/repos/multitheftauto/mtasa-blue/releases/latest"
-	remotebuildresponse=$(curl -s "${apiurl}")
-	remotebuildfilename=$(echo "${remotebuildresponse}" | jq -r '.assets[]|select(.browser_download_url | contains("Linux-amd64")) | .name')
-	remotebuildurl=$(echo "${remotebuildresponse}" | jq -r '.assets[]|select(.browser_download_url | contains("Linux-amd64")) | .browser_download_url')
-	remotebuildversion=$(echo "${remotebuildresponse}" | jq -r '.tag_name')
-	if [ "${firstcommandname}" != "INSTALL" ]; then
-		fn_print_dots "Checking remote build: ${remotelocation}"
-		# Checks if remotebuildversion variable has been set.
-		if [ -z "${remotebuildversion}" ] || [ "${remotebuildversion}" == "null" ]; then
-			fn_print_fail "Checking remote build: ${remotelocation}"
-			fn_script_log_fatal "Checking remote build"
-			core_exit.sh
-		else
-			fn_print_ok "Checking remote build: ${remotelocation}"
-			fn_script_log_pass "Checking remote build"
-		fi
-	else
-		# Checks if remotebuild variable has been set.
-		if [ -z "${remotebuildversion}" ] || [ "${remotebuildversion}" == "null" ]; then
-			fn_print_failure "Unable to get remote build"
-			fn_script_log_fatal "Unable to get remote build"
-			core_exit.sh
-		fi
-	fi
-}
-
-fn_update_compare() {
-	fn_print_dots "Checking for update: ${remotelocation}"
-	if [ "${localbuild}" != "${remotebuildversion}" ] || [ "${forceupdate}" == "1" ]; then
-		if [ "${forceupdate}" == "1" ]; then
-			# forceupdate bypasses checks, useful for small build changes
-			mtaupdatestatus="forced"
-		else
-			mtaupdatestatus="available"
-		fi
-		fn_print_ok_nl "Checking for update: ${remotelocation}"
-		echo -en "\n"
-		echo -e "Update available"
-		echo -e "* Local build: ${red}${localbuild}${default}"
-		echo -e "* Remote build: ${green}${remotebuildversion}${default}"
-		if [ -n "${branch}" ]; then
-			echo -e "* Branch: ${branch}"
-		fi
-		if [ -f "${rootdir}/.dev-debug" ]; then
-			echo -e "Remote build info"
-			echo -e "* apiurl: ${apiurl}"
-			echo -e "* remotebuildfilename: ${remotebuildfilename}"
-			echo -e "* remotebuildurl: ${remotebuildurl}"
-			echo -e "* remotebuildversion: ${remotebuildversion}"
-		fi
-		echo -en "\n"
-		fn_script_log_info "Update available"
-		fn_script_log_info "Local build: ${localbuild}"
-		fn_script_log_info "Remote build: ${remotebuildversion}"
-		if [ -n "${branch}" ]; then
-			fn_script_log_info "Branch: ${branch}"
-		fi
-		fn_script_log_info "${localbuild} > ${remotebuildversion}"
-
-		if [ "${commandname}" == "UPDATE" ]; then
-			unset updateonstart
-			check_status.sh
-			# If server stopped.
-			if [ "${status}" == "0" ]; then
-				fn_update_dl
-				if [ "${localbuild}" == "0" ]; then
-					exitbypass=1
-					command_start.sh
-					fn_firstcommand_reset
-					exitbypass=1
-					sleep 5
-					command_stop.sh
-					fn_firstcommand_reset
-				fi
-			# If server started.
-			else
-				fn_print_restart_warning
-				exitbypass=1
-				command_stop.sh
-				fn_firstcommand_reset
-				exitbypass=1
-				fn_update_dl
-				exitbypass=1
-				command_start.sh
-				fn_firstcommand_reset
-			fi
-			unset exitbypass
-			date +%s > "${lockdir}/lastupdate.lock"
-			alert="update"
-		elif [ "${commandname}" == "CHECK-UPDATE" ]; then
-			alert="check-update"
-		fi
-		alert.sh
-	else
-		fn_print_ok_nl "Checking for update: ${remotelocation}"
-		echo -en "\n"
-		echo -e "No update available"
-		echo -e "* Local build: ${green}${localbuild}${default}"
-		echo -e "* Remote build: ${green}${remotebuildversion}${default}"
-		if [ -n "${branch}" ]; then
-			echo -e "* Branch: ${branch}"
-		fi
-		echo -en "\n"
-		fn_script_log_info "No update available"
-		fn_script_log_info "Local build: ${localbuild}"
-		fn_script_log_info "Remote build: ${remotebuildversion}"
-		if [ -n "${branch}" ]; then
-			fn_script_log_info "Branch: ${branch}"
-		fi
-		if [ -f "${rootdir}/.dev-debug" ]; then
-			echo -e "Remote build info"
-			echo -e "* apiurl: ${apiurl}"
-			echo -e "* remotebuildfilename: ${remotebuildfilename}"
-			echo -e "* remotebuildurl: ${remotebuildurl}"
-			echo -e "* remotebuildversion: ${remotebuildversion}"
-		fi
-	fi
-}
-
-# The location where the builds are checked and downloaded.
-remotelocation="linux.mtasa.com"
-
-if [ "${firstcommandname}" == "INSTALL" ]; then
-	fn_update_remotebuild
-	fn_update_dl
-else
-	fn_print_dots "Checking for update"
-	fn_print_dots "Checking for update: ${remotelocation}"
-	fn_script_log_info "Checking for update: ${remotelocation}"
-	fn_update_localbuild
-	fn_update_remotebuild
-	fn_update_compare
-fi
diff --git a/lgsm/functions/update_papermc.sh b/lgsm/functions/update_papermc.sh
deleted file mode 100644
index 102ef6570..000000000
--- a/lgsm/functions/update_papermc.sh
+++ /dev/null
@@ -1,194 +0,0 @@
-#!/bin/bash
-# LinuxGSM update_papermc.sh function
-# Author: Daniel Gibbs
-# Contributors: http://linuxgsm.com/contrib
-# Website: https://linuxgsm.com
-# Description: Handles updating of PaperMC and Waterfall servers.
-
-functionselfname="$(basename "$(readlink -f "${BASH_SOURCE[0]}")")"
-
-fn_update_dl() {
-	# Download and extract files to serverfiles.
-	fn_fetch_file "${remotebuildurl}" "" "" "" "${tmpdir}" "${remotebuildfilename}" "chmodx" "norun" "force" "${remotebuildhash}"
-	cp -f "${tmpdir}/${remotebuildfilename}" "${serverfiles}/${executable#./}"
-	echo "${remotebuildversion}" > "${serverfiles}/build.txt"
-}
-
-fn_update_localbuild() {
-	# Gets local build info.
-	fn_print_dots "Checking local build: ${remotelocation}"
-	# Uses build file to get local build.
-	localbuild=$(head -n 1 "${serverfiles}/build.txt" 2> /dev/null)
-	if [ -z "${localbuild}" ]; then
-		fn_print_error "Checking local build: ${remotelocation}: missing local build info"
-		fn_script_log_error "Missing local build info"
-		fn_script_log_error "Set localbuild to 0"
-		localbuild="0"
-	else
-		fn_print_ok "Checking local build: ${remotelocation}"
-		fn_script_log_pass "Checking local build"
-	fi
-}
-
-fn_update_remotebuild() {
-	# Get remote build info.
-	apiurl="https://papermc.io/api/v2/projects"
-	# Get list of projects.
-	remotebuildresponse=$(curl -s "${apiurl}")
-	# Get list of Minecraft versions for project.
-	remotebuildresponseproject=$(curl -s "${apiurl}/${paperproject}")
-	# Get latest Minecraft: Java Edition version or user specified version.
-	if [ "${mcversion}" == "latest" ]; then
-		remotebuildmcversion=$(echo "${remotebuildresponseproject}" | jq -r '.versions[-1]')
-	else
-		# Checks if user specified version exists.
-		remotebuildmcversion=$(echo "${remotebuildresponseproject}" | jq -r -e --arg mcversion "${mcversion}" '.versions[]|select(. == $mcversion)')
-		if [ -z "${remotebuildmcversion}" ]; then
-			# user passed version does not exist
-			fn_print_error_nl "Version ${mcversion} not available from ${remotelocation}"
-			fn_script_log_error "Version ${mcversion} not available from ${remotelocation}"
-			core_exit.sh
-		fi
-	fi
-	# Get list of paper builds for specific Minecraft: Java Edition version.
-	remotebuildresponsemcversion=$(curl -s "${apiurl}/paper/versions/${remotebuildmcversion}")
-	# Get latest paper build for specific Minecraft: Java Edition version.
-	remotebuildpaperversion=$(echo "${remotebuildresponsemcversion}" | jq -r '.builds[-1]')
-	# Get various info about the paper build.
-	remotebuildresponseversion=$(curl -s "${apiurl}/${paperproject}/versions/${remotebuildmcversion}/builds/${remotebuildpaperversion}")
-	remotebuildfilename=$(echo "${remotebuildresponseversion}" | jq -r '.downloads.application.name')
-	remotebuildhash=$(echo "${remotebuildresponseversion}" | jq -r '.downloads.application.sha256')
-	remotebuildurl="${apiurl}/${paperproject}/versions/${remotebuildmcversion}/builds/${remotebuildpaperversion}/downloads/${remotebuildfilename}"
-	# Combines Minecraft: Java Edition version and paper build. e.g 1.16.5-456
-	remotebuildversion="${remotebuildmcversion}-${remotebuildpaperversion}"
-
-	if [ "${firstcommandname}" != "INSTALL" ]; then
-		fn_print_dots "Checking remote build: ${remotelocation}"
-		# Checks if remotebuildversion variable has been set.
-		if [ -z "${remotebuildversion}" ] || [ "${remotebuildversion}" == "null" ]; then
-			fn_print_fail "Checking remote build: ${remotelocation}"
-			fn_script_log_fatal "Checking remote build"
-			core_exit.sh
-		else
-			fn_print_ok "Checking remote build: ${remotelocation}"
-			fn_script_log_pass "Checking remote build"
-		fi
-	else
-		# Checks if remotebuild variable has been set.
-		if [ -z "${remotebuildversion}" ] || [ "${remotebuildversion}" == "null" ]; then
-			fn_print_failure "Unable to get remote build"
-			fn_script_log_fatal "Unable to get remote build"
-			core_exit.sh
-		fi
-	fi
-}
-
-fn_update_compare() {
-	fn_print_dots "Checking for update: ${remotelocation}"
-	if [ "${localbuild}" != "${remotebuildversion}" ] || [ "${forceupdate}" == "1" ]; then
-		fn_print_ok_nl "Checking for update: ${remotelocation}"
-		echo -en "\n"
-		echo -e "Update available"
-		echo -e "* Local build: ${red}${localbuild}${default}"
-		echo -e "* Remote build: ${green}${remotebuildversion}${default}"
-		if [ -n "${branch}" ]; then
-			echo -e "* Branch: ${branch}"
-		fi
-		if [ -f "${rootdir}/.dev-debug" ]; then
-			echo -e "Remote build info"
-			echo -e "* apiurl: ${apiurl}"
-			echo -e "* remotebuildfilename: ${remotebuildfilename}"
-			echo -e "* remotebuildurl: ${remotebuildurl}"
-			echo -e "* remotebuildversion: ${remotebuildversion}"
-		fi
-		echo -en "\n"
-		fn_script_log_info "Update available"
-		fn_script_log_info "Local build: ${localbuild}"
-		fn_script_log_info "Remote build: ${remotebuildversion}"
-		if [ -n "${branch}" ]; then
-			fn_script_log_info "Branch: ${branch}"
-		fi
-		fn_script_log_info "${localbuild} > ${remotebuildversion}"
-
-		if [ "${commandname}" == "UPDATE" ]; then
-			unset updateonstart
-			check_status.sh
-			# If server stopped.
-			if [ "${status}" == "0" ]; then
-				fn_update_dl
-				if [ "${localbuild}" == "0" ]; then
-					exitbypass=1
-					command_start.sh
-					fn_firstcommand_reset
-					exitbypass=1
-					sleep 5
-					command_stop.sh
-					fn_firstcommand_reset
-				fi
-			# If server started.
-			else
-				fn_print_restart_warning
-				exitbypass=1
-				command_stop.sh
-				fn_firstcommand_reset
-				exitbypass=1
-				fn_update_dl
-				exitbypass=1
-				command_start.sh
-				fn_firstcommand_reset
-			fi
-			unset exitbypass
-			date +%s > "${lockdir}/lastupdate.lock"
-			alert="update"
-		elif [ "${commandname}" == "CHECK-UPDATE" ]; then
-			alert="check-update"
-		fi
-		alert.sh
-	else
-		fn_print_ok_nl "Checking for update: ${remotelocation}"
-		echo -en "\n"
-		echo -e "No update available"
-		echo -e "* Local build: ${green}${localbuild}${default}"
-		echo -e "* Remote build: ${green}${remotebuildversion}${default}"
-		if [ -n "${branch}" ]; then
-			echo -e "* Branch: ${branch}"
-		fi
-		echo -en "\n"
-		fn_script_log_info "No update available"
-		fn_script_log_info "Local build: ${localbuild}"
-		fn_script_log_info "Remote build: ${remotebuildversion}"
-		if [ -n "${branch}" ]; then
-			fn_script_log_info "Branch: ${branch}"
-		fi
-		if [ -f "${rootdir}/.dev-debug" ]; then
-			echo -e "Remote build info"
-			echo -e "* apiurl: ${apiurl}"
-			echo -e "* remotebuildfilename: ${remotebuildfilename}"
-			echo -e "* remotebuildurl: ${remotebuildurl}"
-			echo -e "* remotebuildversion: ${remotebuildversion}"
-		fi
-	fi
-}
-
-# The location where the builds are checked and downloaded.
-remotelocation="papermc.io"
-
-if [ "${shortname}" == "pmc" ]; then
-	paperproject="paper"
-elif [ "${shortname}" == "vpmc" ]; then
-	paperproject="velocity"
-elif [ "${shortname}" == "wmc" ]; then
-	paperproject="waterfall"
-fi
-
-if [ "${firstcommandname}" == "INSTALL" ]; then
-	fn_update_remotebuild
-	fn_update_dl
-else
-	fn_print_dots "Checking for update"
-	fn_print_dots "Checking for update: ${remotelocation}"
-	fn_script_log_info "Checking for update: ${remotelocation}"
-	fn_update_localbuild
-	fn_update_remotebuild
-	fn_update_compare
-fi
diff --git a/lgsm/functions/update_steamcmd.sh b/lgsm/functions/update_steamcmd.sh
deleted file mode 100644
index 85bacb899..000000000
--- a/lgsm/functions/update_steamcmd.sh
+++ /dev/null
@@ -1,39 +0,0 @@
-#!/bin/bash
-# LinuxGSM update_steamcmd.sh module
-# Author: Daniel Gibbs
-# Contributors: http://linuxgsm.com/contrib
-# Website: https://linuxgsm.com
-# Description: Handles updating using SteamCMD.
-
-functionselfname="$(basename "$(readlink -f "${BASH_SOURCE[0]}")")"
-
-# init steamcmd functions
-core_steamcmd.sh
-
-# The location where the builds are checked and downloaded.
-remotelocation="SteamCMD"
-check.sh
-
-fn_print_dots "${remotelocation}"
-
-if [ "${forceupdate}" == "1" ]; then
-	# forceupdate bypasses update checks.
-	if [ "${status}" != "0" ]; then
-		fn_print_restart_warning
-		exitbypass=1
-		command_stop.sh
-		fn_firstcommand_reset
-		fn_dl_steamcmd
-		date +%s > "${lockdir}/lastupdate.lock"
-		exitbypass=1
-		command_start.sh
-		fn_firstcommand_reset
-	else
-		fn_dl_steamcmd
-		date +%s > "${lockdir}/lastupdate.lock"
-	fi
-else
-	fn_update_steamcmd_localbuild
-	fn_update_steamcmd_remotebuild
-	fn_update_steamcmd_compare
-fi
diff --git a/lgsm/functions/update_ts3.sh b/lgsm/functions/update_ts3.sh
deleted file mode 100644
index 0f5327de2..000000000
--- a/lgsm/functions/update_ts3.sh
+++ /dev/null
@@ -1,181 +0,0 @@
-#!/bin/bash
-# LinuxGSM command_ts3.sh module
-# Author: Daniel Gibbs
-# Contributors: http://linuxgsm.com/contrib
-# Website: https://linuxgsm.com
-# Description: Handles updating of Teamspeak 3 servers.
-
-functionselfname="$(basename "$(readlink -f "${BASH_SOURCE[0]}")")"
-
-fn_update_dl() {
-	# Download and extract files to serverfiles.
-	fn_fetch_file "${remotebuildurl}" "" "" "" "${tmpdir}" "${remotebuildfilename}" "nochmodx" "norun" "force" "${remotebuildhash}"
-	fn_dl_extract "${tmpdir}" "${remotebuildfilename}" "${serverfiles}" "teamspeak3-server_linux_${ts3arch}"
-	fn_clear_tmp
-}
-
-fn_update_localbuild() {
-	# Gets local build info.
-	fn_print_dots "Checking local build: ${remotelocation}"
-	# Uses log file to get local build.
-	localbuild=$(grep -Eo "TeamSpeak 3 Server ((\.)?[0-9]{1,3}){1,3}\.[0-9]{1,3}" "$(find ./* -name "ts3server*_0.log" 2> /dev/null | sort | tail -1)" | grep -Eo "((\.)?[0-9]{1,3}){1,3}\.[0-9]{1,3}" | tail -1)
-	if [ -z "${localbuild}" ]; then
-		fn_print_error "Checking local build: ${remotelocation}: missing local build info"
-		fn_script_log_error "Missing local build info"
-		fn_script_log_error "Set localbuild to 0"
-		localbuild="0"
-	else
-		fn_print_ok "Checking local build: ${remotelocation}"
-		fn_script_log_pass "Checking local build"
-	fi
-}
-
-fn_update_remotebuild() {
-	# Get remote build info.
-	apiurl="https://www.teamspeak.com/versions/server.json"
-	remotebuildresponse=$(curl -s "${apiurl}")
-
-	if [ "${ts3arch}" == "amd64" ]; then
-		remotebuildurl=$(echo -e "${remotebuildresponse}" | jq -r '.linux.x86_64.mirrors."teamspeak.com"')
-		remotebuildhash=$(echo -e "${remotebuildresponse}" | jq -r '.linux.x86_64.checksum')
-	elif [ "${ts3arch}" == "x86" ]; then
-		remotebuildurl=$(echo -e "${remotebuildresponse}" | jq -r '.linux.x86.mirrors."teamspeak.com"')
-		remotebuildhash=$(echo -e "${remotebuildresponse}" | jq -r '.linux.x86.checksum')
-	fi
-	remotebuildfilename=$(basename "${remotebuildurl}")
-	remotebuildversion=$(echo -e "${remotebuildresponse}" | jq -r '.linux.x86_64.version')
-
-	if [ "${firstcommandname}" != "INSTALL" ]; then
-		fn_print_dots "Checking remote build: ${remotelocation}"
-		# Checks if remotebuildversion variable has been set.
-		if [ -z "${remotebuildversion}" ] || [ "${remotebuildversion}" == "null" ]; then
-			fn_print_fail "Checking remote build: ${remotelocation}"
-			fn_script_log_fatal "Checking remote build"
-			core_exit.sh
-		else
-			fn_print_ok "Checking remote build: ${remotelocation}"
-			fn_script_log_pass "Checking remote build"
-		fi
-	else
-		# Checks if remotebuild variable has been set.
-		if [ -z "${remotebuildversion}" ] || [ "${remotebuildversion}" == "null" ]; then
-			fn_print_failure "Unable to get remote build"
-			fn_script_log_fatal "Unable to get remote build"
-			core_exit.sh
-		fi
-	fi
-}
-
-fn_update_compare() {
-	fn_print_dots "Checking for update: ${remotelocation}"
-	if [ "${localbuild}" != "${remotebuildversion}" ] || [ "${forceupdate}" == "1" ]; then
-		fn_print_ok_nl "Checking for update: ${remotelocation}"
-		echo -en "\n"
-		echo -e "Update available"
-		echo -e "* Local build: ${red}${localbuild}${default}"
-		echo -e "* Remote build: ${green}${remotebuildversion}${default}"
-		if [ -n "${branch}" ]; then
-			echo -e "* Branch: ${branch}"
-		fi
-		if [ -f "${rootdir}/.dev-debug" ]; then
-			echo -e "Remote build info"
-			echo -e "* apiurl: ${apiurl}"
-			echo -e "* remotebuildfilename: ${remotebuildfilename}"
-			echo -e "* remotebuildurl: ${remotebuildurl}"
-			echo -e "* remotebuildversion: ${remotebuildversion}"
-		fi
-		echo -en "\n"
-		fn_script_log_info "Update available"
-		fn_script_log_info "Local build: ${localbuild}"
-		fn_script_log_info "Remote build: ${remotebuildversion}"
-		if [ -n "${branch}" ]; then
-			fn_script_log_info "Branch: ${branch}"
-		fi
-		fn_script_log_info "${localbuild} > ${remotebuildversion}"
-
-		if [ "${commandname}" == "UPDATE" ]; then
-			unset updateonstart
-			check_status.sh
-			# If server stopped.
-			if [ "${status}" == "0" ]; then
-				fn_update_dl
-				if [ "${localbuild}" == "0" ]; then
-					exitbypass=1
-					command_start.sh
-					fn_firstcommand_reset
-					exitbypass=1
-					sleep 5
-					command_stop.sh
-					fn_firstcommand_reset
-				fi
-			# If server started.
-			else
-				fn_print_restart_warning
-				exitbypass=1
-				command_stop.sh
-				fn_firstcommand_reset
-				exitbypass=1
-				fn_update_dl
-				exitbypass=1
-				command_start.sh
-				fn_firstcommand_reset
-			fi
-			unset exitbypass
-			date +%s > "${lockdir}/lastupdate.lock"
-			alert="update"
-		elif [ "${commandname}" == "CHECK-UPDATE" ]; then
-			alert="check-update"
-		fi
-		alert.sh
-	else
-		fn_print_ok_nl "Checking for update: ${remotelocation}"
-		echo -en "\n"
-		echo -e "No update available"
-		echo -e "* Local build: ${green}${localbuild}${default}"
-		echo -e "* Remote build: ${green}${remotebuildversion}${default}"
-		if [ -n "${branch}" ]; then
-			echo -e "* Branch: ${branch}"
-		fi
-		echo -en "\n"
-		fn_script_log_info "No update available"
-		fn_script_log_info "Local build: ${localbuild}"
-		fn_script_log_info "Remote build: ${remotebuildversion}"
-		if [ -n "${branch}" ]; then
-			fn_script_log_info "Branch: ${branch}"
-		fi
-		if [ -f "${rootdir}/.dev-debug" ]; then
-			echo -e "Remote build info"
-			echo -e "* apiurl: ${apiurl}"
-			echo -e "* remotebuildfilename: ${remotebuildfilename}"
-			echo -e "* remotebuildurl: ${remotebuildurl}"
-			echo -e "* remotebuildversion: ${remotebuildversion}"
-		fi
-	fi
-}
-
-# Game server architecture.
-info_distro.sh
-if [ "${arch}" == "x86_64" ]; then
-	ts3arch="amd64"
-elif [ "${arch}" == "i386" ] || [ "${arch}" == "i686" ]; then
-	ts3arch="x86"
-else
-	fn_print_failure "Unknown or unsupported architecture: ${arch}"
-	fn_script_log_fatal "Unknown or unsupported architecture: ${arch}"
-	core_exit.sh
-fi
-
-# The location where the builds are checked and downloaded.
-remotelocation="teamspeak.com"
-
-if [ "${firstcommandname}" == "INSTALL" ]; then
-	fn_update_remotebuild
-	fn_update_dl
-else
-	fn_print_dots "Checking for update"
-	fn_print_dots "Checking for update: ${remotelocation}"
-	fn_script_log_info "Checking for update: ${remotelocation}"
-	fn_update_localbuild
-	fn_update_remotebuild
-	fn_update_compare
-fi
diff --git a/lgsm/functions/update_ut99.sh b/lgsm/functions/update_ut99.sh
deleted file mode 100644
index 045b29dbe..000000000
--- a/lgsm/functions/update_ut99.sh
+++ /dev/null
@@ -1,163 +0,0 @@
-#!/bin/bash
-# LinuxGSM command_ut99.sh module
-# Author: Daniel Gibbs
-# Contributors: http://linuxgsm.com/contrib
-# Website: https://linuxgsm.com
-# Description: Handles updating of Unreal Tournament 99 servers.
-
-functionselfname="$(basename "$(readlink -f "${BASH_SOURCE[0]}")")"
-
-fn_update_dl() {
-	# Download and extract files to serverfiles.
-	fn_fetch_file "${remotebuildurl}" "" "" "" "${tmpdir}" "${remotebuildfilename}" "nochmodx" "norun" "force" "nohash"
-	fn_dl_extract "${tmpdir}" "${remotebuildfilename}" "${serverfiles}"
-	echo "${remotebuildversion}" > "${serverfiles}/build.txt"
-	fn_clear_tmp
-}
-
-fn_update_localbuild() {
-	# Gets local build info.
-	fn_print_dots "Checking local build: ${remotelocation}"
-	# Uses build file to get local build.
-	localbuild=$(head -n 1 "${serverfiles}/build.txt" 2> /dev/null)
-	if [ -z "${localbuild}" ]; then
-		fn_print_error "Checking local build: ${remotelocation}: missing local build info"
-		fn_script_log_error "Missing local build info"
-		fn_script_log_error "Set localbuild to 0"
-		localbuild="0"
-	else
-		fn_print_ok "Checking local build: ${remotelocation}"
-		fn_script_log_pass "Checking local build"
-	fi
-}
-
-fn_update_remotebuild() {
-	# Get remote build info.
-	apiurl="https://api.github.com/repos/OldUnreal/UnrealTournamentPatches/releases/latest"
-	remotebuildresponse=$(curl -s "${apiurl}")
-	remotebuildfilename=$(echo "${remotebuildresponse}" | jq -r '.assets[]|select(.browser_download_url | contains("Linux-amd64")) | .name')
-	remotebuildurl=$(echo "${remotebuildresponse}" | jq -r '.assets[]|select(.browser_download_url | contains("Linux-amd64")) | .browser_download_url')
-	remotebuildversion=$(echo "${remotebuildresponse}" | jq -r '.tag_name')
-
-	if [ "${firstcommandname}" != "INSTALL" ]; then
-		fn_print_dots "Checking remote build: ${remotelocation}"
-		# Checks if remotebuildversion variable has been set.
-		if [ -z "${remotebuildversion}" ] || [ "${remotebuildversion}" == "null" ]; then
-			fn_print_fail "Checking remote build: ${remotelocation}"
-			fn_script_log_fatal "Checking remote build"
-			core_exit.sh
-		else
-			fn_print_ok "Checking remote build: ${remotelocation}"
-			fn_script_log_pass "Checking remote build"
-		fi
-	else
-		# Checks if remotebuild variable has been set.
-		if [ -z "${remotebuildversion}" ] || [ "${remotebuildversion}" == "null" ]; then
-			fn_print_failure "Unable to get remote build"
-			fn_script_log_fatal "Unable to get remote build"
-			core_exit.sh
-		fi
-	fi
-}
-
-fn_update_compare() {
-	fn_print_dots "Checking for update: ${remotelocation}"
-	if [ "${localbuild}" != "${remotebuildversion}" ] || [ "${forceupdate}" == "1" ]; then
-		fn_print_ok_nl "Checking for update: ${remotelocation}"
-		echo -en "\n"
-		echo -e "Update available"
-		echo -e "* Local build: ${red}${localbuild}${default}"
-		echo -e "* Remote build: ${green}${remotebuildversion}${default}"
-		if [ -n "${branch}" ]; then
-			echo -e "* Branch: ${branch}"
-		fi
-		if [ -f "${rootdir}/.dev-debug" ]; then
-			echo -e "Remote build info"
-			echo -e "* apiurl: ${apiurl}"
-			echo -e "* remotebuildfilename: ${remotebuildfilename}"
-			echo -e "* remotebuildurl: ${remotebuildurl}"
-			echo -e "* remotebuildversion: ${remotebuildversion}"
-		fi
-		echo -en "\n"
-		fn_script_log_info "Update available"
-		fn_script_log_info "Local build: ${localbuild}"
-		fn_script_log_info "Remote build: ${remotebuildversion}"
-		if [ -n "${branch}" ]; then
-			fn_script_log_info "Branch: ${branch}"
-		fi
-		fn_script_log_info "${localbuild} > ${remotebuildversion}"
-
-		if [ "${commandname}" == "UPDATE" ]; then
-			unset updateonstart
-			check_status.sh
-			# If server stopped.
-			if [ "${status}" == "0" ]; then
-				fn_update_dl
-				if [ "${localbuild}" == "0" ]; then
-					exitbypass=1
-					command_start.sh
-					fn_firstcommand_reset
-					exitbypass=1
-					sleep 5
-					command_stop.sh
-					fn_firstcommand_reset
-				fi
-			# If server started.
-			else
-				fn_print_restart_warning
-				exitbypass=1
-				command_stop.sh
-				fn_firstcommand_reset
-				exitbypass=1
-				fn_update_dl
-				exitbypass=1
-				command_start.sh
-				fn_firstcommand_reset
-			fi
-			unset exitbypass
-			date +%s > "${lockdir}/lastupdate.lock"
-			alert="update"
-		elif [ "${commandname}" == "CHECK-UPDATE" ]; then
-			alert="check-update"
-		fi
-		alert.sh
-	else
-		fn_print_ok_nl "Checking for update: ${remotelocation}"
-		echo -en "\n"
-		echo -e "No update available"
-		echo -e "* Local build: ${green}${localbuild}${default}"
-		echo -e "* Remote build: ${green}${remotebuildversion}${default}"
-		if [ -n "${branch}" ]; then
-			echo -e "* Branch: ${branch}"
-		fi
-		echo -en "\n"
-		fn_script_log_info "No update available"
-		fn_script_log_info "Local build: ${localbuild}"
-		fn_script_log_info "Remote build: ${remotebuildversion}"
-		if [ -n "${branch}" ]; then
-			fn_script_log_info "Branch: ${branch}"
-		fi
-		if [ -f "${rootdir}/.dev-debug" ]; then
-			echo -e "Remote build info"
-			echo -e "* apiurl: ${apiurl}"
-			echo -e "* remotebuildfilename: ${remotebuildfilename}"
-			echo -e "* remotebuildurl: ${remotebuildurl}"
-			echo -e "* remotebuildversion: ${remotebuildversion}"
-		fi
-	fi
-}
-
-# The location where the builds are checked and downloaded.
-remotelocation="github.com"
-
-if [ "${firstcommandname}" == "INSTALL" ]; then
-	fn_update_remotebuild
-	fn_update_dl
-else
-	fn_print_dots "Checking for update"
-	fn_print_dots "Checking for update: ${remotelocation}"
-	fn_script_log_info "Checking for update: ${remotelocation}"
-	fn_update_localbuild
-	fn_update_remotebuild
-	fn_update_compare
-fi
diff --git a/lgsm/functions/update_vintagestory.sh b/lgsm/functions/update_vintagestory.sh
deleted file mode 100644
index 7307a4b77..000000000
--- a/lgsm/functions/update_vintagestory.sh
+++ /dev/null
@@ -1,170 +0,0 @@
-#!/bin/bash
-# LinuxGSM update_vintagestory.sh module
-# Author: Daniel Gibbs
-# Contributors: http://linuxgsm.com/contrib
-# Website: https://linuxgsm.com
-# Description: Handles updating of Vintage Story servers.
-
-functionselfname="$(basename "$(readlink -f "${BASH_SOURCE[0]}")")"
-
-fn_update_dl() {
-	# Download and extract files to serverfiles.
-	fn_fetch_file "${remotebuildurl}" "" "" "" "${tmpdir}" "${remotebuildfilename}" "nochmodx" "norun" "force" "${remotebuildhash}"
-	fn_dl_extract "${tmpdir}" "${remotebuildfilename}" "${serverfiles}"
-	fn_clear_tmp
-}
-
-fn_update_localbuild() {
-	# Gets local build info.
-	fn_print_dots "Checking local build: ${remotelocation}"
-	# Uses executable to get local build.
-	if [ -d "${executabledir}" ]; then
-		cd "${executabledir}" || exit
-		localbuild="$(${preexecutable} ${executable} --version | sed '/^[[:space:]]*$/d')"
-	fi
-	if [ -z "${localbuild}" ]; then
-		fn_print_error "Checking local build: ${remotelocation}: missing local build info"
-		fn_script_log_error "Missing local build info"
-		fn_script_log_error "Set localbuild to 0"
-		localbuild="0"
-	else
-		fn_print_ok "Checking local build: ${remotelocation}"
-		fn_script_log_pass "Checking local build"
-	fi
-}
-
-fn_update_remotebuild() {
-	# Get remote build info.
-	apiurl="http://api.vintagestory.at/stable-unstable.json"
-	remotebuildresponse=$(curl -s "${apiurl}")
-	if [ "${branch}" == "stable" ]; then
-		remotebuildversion=$(echo "${remotebuildresponse}" | jq -r '[ to_entries[] ] | .[].key' | grep -Ev "\-rc|\-pre" | sort -r -V | head -1)
-	else
-		remotebuildversion=$(echo "${remotebuildresponse}" | jq -r '[ to_entries[] ] | .[].key' | grep -E "\-rc|\-pre" | sort -r -V | head -1)
-	fi
-	remotebuildfilename=$(echo "${remotebuildresponse}" | jq --arg remotebuildversion "${remotebuildversion}" -r '.[$remotebuildversion].server.filename')
-	remotebuildurl=$(echo "${remotebuildresponse}" | jq --arg remotebuildversion "${remotebuildversion}" -r '.[$remotebuildversion].server.urls.cdn')
-	remotebuildhash=$(echo "${remotebuildresponse}" | jq --arg remotebuildversion "${remotebuildversion}" -r '.[$remotebuildversion].server.md5')
-
-	if [ "${firstcommandname}" != "INSTALL" ]; then
-		fn_print_dots "Checking remote build: ${remotelocation}"
-		# Checks if remotebuildversion variable has been set.
-		if [ -z "${remotebuildversion}" ] || [ "${remotebuildversion}" == "null" ]; then
-			fn_print_fail "Checking remote build: ${remotelocation}"
-			fn_script_log_fatal "Checking remote build"
-			core_exit.sh
-		else
-			fn_print_ok "Checking remote build: ${remotelocation}"
-			fn_script_log_pass "Checking remote build"
-		fi
-	else
-		# Checks if remotebuild variable has been set.
-		if [ -z "${remotebuildversion}" ] || [ "${remotebuildversion}" == "null" ]; then
-			fn_print_failure "Unable to get remote build"
-			fn_script_log_fatal "Unable to get remote build"
-			core_exit.sh
-		fi
-	fi
-}
-
-fn_update_compare() {
-	fn_print_dots "Checking for update: ${remotelocation}"
-	if [ "${localbuild}" != "${remotebuildversion}" ] || [ "${forceupdate}" == "1" ]; then
-		fn_print_ok_nl "Checking for update: ${remotelocation}"
-		echo -en "\n"
-		echo -e "Update available"
-		echo -e "* Local build: ${red}${localbuild}${default}"
-		echo -e "* Remote build: ${green}${remotebuildversion}${default}"
-		if [ -n "${branch}" ]; then
-			echo -e "* Branch: ${branch}"
-		fi
-		if [ -f "${rootdir}/.dev-debug" ]; then
-			echo -e "Remote build info"
-			echo -e "* apiurl: ${apiurl}"
-			echo -e "* remotebuildfilename: ${remotebuildfilename}"
-			echo -e "* remotebuildurl: ${remotebuildurl}"
-			echo -e "* remotebuildversion: ${remotebuildversion}"
-		fi
-		echo -en "\n"
-		fn_script_log_info "Update available"
-		fn_script_log_info "Local build: ${localbuild}"
-		fn_script_log_info "Remote build: ${remotebuildversion}"
-		if [ -n "${branch}" ]; then
-			fn_script_log_info "Branch: ${branch}"
-		fi
-		fn_script_log_info "${localbuild} > ${remotebuildversion}"
-
-		if [ "${commandname}" == "UPDATE" ]; then
-			unset updateonstart
-			check_status.sh
-			# If server stopped.
-			if [ "${status}" == "0" ]; then
-				fn_update_dl
-				if [ "${localbuild}" == "0" ]; then
-					exitbypass=1
-					command_start.sh
-					fn_firstcommand_reset
-					exitbypass=1
-					sleep 5
-					command_stop.sh
-					fn_firstcommand_reset
-				fi
-			# If server started.
-			else
-				fn_print_restart_warning
-				exitbypass=1
-				command_stop.sh
-				fn_firstcommand_reset
-				exitbypass=1
-				fn_update_dl
-				exitbypass=1
-				command_start.sh
-				fn_firstcommand_reset
-			fi
-			unset exitbypass
-			date +%s > "${lockdir}/lastupdate.lock"
-			alert="update"
-		elif [ "${commandname}" == "CHECK-UPDATE" ]; then
-			alert="check-update"
-		fi
-		alert.sh
-	else
-		fn_print_ok_nl "Checking for update: ${remotelocation}"
-		echo -en "\n"
-		echo -e "No update available"
-		echo -e "* Local build: ${green}${localbuild}${default}"
-		echo -e "* Remote build: ${green}${remotebuildversion}${default}"
-		if [ -n "${branch}" ]; then
-			echo -e "* Branch: ${branch}"
-		fi
-		echo -en "\n"
-		fn_script_log_info "No update available"
-		fn_script_log_info "Local build: ${localbuild}"
-		fn_script_log_info "Remote build: ${remotebuildversion}"
-		if [ -n "${branch}" ]; then
-			fn_script_log_info "Branch: ${branch}"
-		fi
-		if [ -f "${rootdir}/.dev-debug" ]; then
-			echo -e "Remote build info"
-			echo -e "* apiurl: ${apiurl}"
-			echo -e "* remotebuildfilename: ${remotebuildfilename}"
-			echo -e "* remotebuildurl: ${remotebuildurl}"
-			echo -e "* remotebuildversion: ${remotebuildversion}"
-		fi
-	fi
-}
-
-# The location where the builds are checked and downloaded.
-remotelocation="vintagestory.at"
-
-if [ "${firstcommandname}" == "INSTALL" ]; then
-	fn_update_remotebuild
-	fn_update_dl
-else
-	fn_print_dots "Checking for update"
-	fn_print_dots "Checking for update: ${remotelocation}"
-	fn_script_log_info "Checking for update: ${remotelocation}"
-	fn_update_localbuild
-	fn_update_remotebuild
-	fn_update_compare
-fi
diff --git a/lgsm/modules/command_send.sh b/lgsm/modules/command_send.sh
index e3dafd693..cf6a9f08a 100644
--- a/lgsm/modules/command_send.sh
+++ b/lgsm/modules/command_send.sh
@@ -26,7 +26,7 @@ if [ "${status}" != "0" ]; then
 	fi
 	echo ""
 	fn_print_dots "Sending command to console: \"${commandtosend}\""
-	tmux -L "${socketname}" send-keys -t "${servicename}" "${commandtosend}" ENTER
+	tmux -L "${socketname}" send-keys -t "${sessionname}" "${commandtosend}" ENTER
 	fn_print_ok_nl "Sending command to console: \"${commandtosend}\""
 	fn_script_log_pass "Command \"${commandtosend}\" sent to console"
 else
diff --git a/lgsm/modules/core_dl.sh b/lgsm/modules/core_dl.sh
index 3b2e7f117..caca0fc58 100644
--- a/lgsm/modules/core_dl.sh
+++ b/lgsm/modules/core_dl.sh
@@ -481,12 +481,8 @@ fn_fetch_file() {
 fn_fetch_file_github() {
 	github_file_url_dir="${1}"
 	github_file_url_name="${2}"
-	# For legacy versions - code can be removed at a future date
-	if [ "${legacymode}" == "1" ]; then
-		remote_fileurl="https://raw.githubusercontent.com/${githubuser}/${githubrepo}/${githubbranch}/${github_file_url_dir}/${github_file_url_name}"
-		remote_fileurl_backup="https://bitbucket.org/${githubuser}/${githubrepo}/raw/${githubbranch}/${github_file_url_dir}/${github_file_url_name}"
 	# If master branch will currently running LinuxGSM version to prevent "version mixing". This is ignored if a fork.
-	elif [ "${githubbranch}" == "master" ] && [ "${githubuser}" == "GameServerManagers" ] && [ "${commandname}" != "UPDATE-LGSM" ]; then
+	if [ "${githubbranch}" == "master" ] && [ "${githubuser}" == "GameServerManagers" ] && [ "${commandname}" != "UPDATE-LGSM" ]; then
 		remote_fileurl="https://raw.githubusercontent.com/${githubuser}/${githubrepo}/${version}/${github_file_url_dir}/${github_file_url_name}"
 		remote_fileurl_backup="https://bitbucket.org/${githubuser}/${githubrepo}/raw/${version}/${github_file_url_dir}/${github_file_url_name}"
 	else
diff --git a/lgsm/modules/core_functions.sh b/lgsm/modules/core_functions.sh
deleted file mode 100644
index 09eedeb7b..000000000
--- a/lgsm/modules/core_functions.sh
+++ /dev/null
@@ -1,811 +0,0 @@
-#!/bin/bash
-# LinuxGSM core_functions.sh module
-# Author: Daniel Gibbs
-# Contributors: http://linuxgsm.com/contrib
-# Website: https://linuxgsm.com
-# Description: Defines all functions to allow download and execution of functions using fn_fetch_function.
-# This function is called first before any other function. Without this file other functions will not load.
-
-module_selfname="$(basename "$(readlink -f "${BASH_SOURCE[0]}")")"
-
-modulesversion="v23.5.3"
-
-# Core
-
-core_dl.sh() {
-	functionfile="${FUNCNAME[0]}"
-	if [ "$(type fn_fetch_core_dl 2> /dev/null)" ]; then
-		fn_fetch_core_dl "lgsm/functions" "core_dl.sh" "${functionsdir}" "chmodx" "run" "noforcedl" "nohash"
-	else
-		fn_bootstrap_fetch_file_github "lgsm/functions" "core_dl.sh" "${functionsdir}" "chmodx" "run" "noforcedl" "nohash"
-	fi
-}
-
-core_messages.sh() {
-	functionfile="${FUNCNAME[0]}"
-	if [ "$(type fn_fetch_core_dl 2> /dev/null)" ]; then
-		fn_fetch_core_dl "lgsm/functions" "core_messages.sh" "${functionsdir}" "chmodx" "run" "noforcedl" "nohash"
-	else
-		fn_bootstrap_fetch_file_github "lgsm/functions" "core_messages.sh" "${functionsdir}" "chmodx" "run" "noforcedl" "nohash"
-	fi
-}
-
-core_legacy.sh() {
-	functionfile="${FUNCNAME[0]}"
-	if [ "$(type fn_fetch_core_dl 2> /dev/null)" ]; then
-		fn_fetch_core_dl "lgsm/functions" "core_legacy.sh" "${functionsdir}" "chmodx" "run" "noforcedl" "nohash"
-	else
-		fn_bootstrap_fetch_file_github "lgsm/functions" "core_legacy.sh" "${functionsdir}" "chmodx" "run" "noforcedl" "nohash"
-	fi
-}
-
-core_exit.sh() {
-	functionfile="${FUNCNAME[0]}"
-	fn_fetch_function
-}
-
-core_getopt.sh() {
-	functionfile="${FUNCNAME[0]}"
-	fn_fetch_function
-}
-
-core_trap.sh() {
-	functionfile="${FUNCNAME[0]}"
-	fn_fetch_function
-}
-
-core_steamcmd.sh() {
-	functionfile="${FUNCNAME[0]}"
-	fn_fetch_function
-}
-
-core_github.sh() {
-	functionfile="${FUNCNAME[0]}"
-	fn_fetch_function
-}
-
-# Commands
-
-command_backup.sh() {
-	functionfile="${FUNCNAME[0]}"
-	fn_fetch_function
-}
-
-command_console.sh() {
-	functionfile="${FUNCNAME[0]}"
-	fn_fetch_function
-}
-
-command_debug.sh() {
-	functionfile="${FUNCNAME[0]}"
-	fn_fetch_function
-}
-
-command_details.sh() {
-	functionfile="${FUNCNAME[0]}"
-	fn_fetch_function
-}
-
-command_sponsor.sh() {
-	functionfile="${FUNCNAME[0]}"
-	fn_fetch_function
-}
-
-command_postdetails.sh() {
-	functionfile="${FUNCNAME[0]}"
-	fn_fetch_function
-}
-
-command_test_alert.sh() {
-	functionfile="${FUNCNAME[0]}"
-	fn_fetch_function
-}
-
-command_monitor.sh() {
-	functionfile="${FUNCNAME[0]}"
-	fn_fetch_function
-}
-
-command_start.sh() {
-	functionfile="${FUNCNAME[0]}"
-	fn_fetch_function
-}
-
-command_stop.sh() {
-	functionfile="${FUNCNAME[0]}"
-	fn_fetch_function
-}
-
-command_validate.sh() {
-	functionfile="${FUNCNAME[0]}"
-	fn_fetch_function
-}
-
-command_install.sh() {
-	functionfile="${FUNCNAME[0]}"
-	fn_fetch_function
-}
-
-command_install_resources_mta.sh() {
-	functionfile="${FUNCNAME[0]}"
-	fn_fetch_function
-}
-
-install_squad_license.sh() {
-	functionfile="${FUNCNAME[0]}"
-	fn_fetch_function
-}
-
-command_mods_install.sh() {
-	functionfile="${FUNCNAME[0]}"
-	fn_fetch_function
-}
-
-command_mods_update.sh() {
-	functionfile="${FUNCNAME[0]}"
-	fn_fetch_function
-}
-
-command_mods_remove.sh() {
-	functionfile="${FUNCNAME[0]}"
-	fn_fetch_function
-}
-
-command_fastdl.sh() {
-	functionfile="${FUNCNAME[0]}"
-	fn_fetch_function
-}
-
-command_ts3_server_pass.sh() {
-	functionfile="${FUNCNAME[0]}"
-	fn_fetch_function
-}
-
-command_restart.sh() {
-	functionfile="${FUNCNAME[0]}"
-	fn_fetch_function
-}
-
-command_skeleton.sh() {
-	functionfile="${FUNCNAME[0]}"
-	fn_fetch_function
-}
-
-command_wipe.sh() {
-	functionfile="${FUNCNAME[0]}"
-	fn_fetch_function
-}
-
-command_send.sh() {
-	functionfile="${FUNCNAME[0]}"
-	fn_fetch_function
-}
-
-# Checks
-
-check.sh() {
-	functionfile="${FUNCNAME[0]}"
-	fn_fetch_function
-}
-
-check_config.sh() {
-	functionfile="${FUNCNAME[0]}"
-	fn_fetch_function
-}
-
-check_deps.sh() {
-	functionfile="${FUNCNAME[0]}"
-	fn_fetch_function
-}
-
-check_executable.sh() {
-	functionfile="${FUNCNAME[0]}"
-	fn_fetch_function
-}
-
-check_glibc.sh() {
-	functionfile="${FUNCNAME[0]}"
-	fn_fetch_function
-}
-
-check_ip.sh() {
-	functionfile="${FUNCNAME[0]}"
-	fn_fetch_function
-}
-
-check_last_update.sh() {
-	functionfile="${FUNCNAME[0]}"
-	fn_fetch_function
-}
-
-check_logs.sh() {
-	functionfile="${FUNCNAME[0]}"
-	fn_fetch_function
-}
-
-check_permissions.sh() {
-	functionfile="${FUNCNAME[0]}"
-	fn_fetch_function
-}
-
-check_root.sh() {
-	functionfile="${FUNCNAME[0]}"
-	fn_fetch_function
-}
-
-check_status.sh() {
-	functionfile="${FUNCNAME[0]}"
-	fn_fetch_function
-}
-
-check_steamcmd.sh() {
-	functionfile="${FUNCNAME[0]}"
-	fn_fetch_function
-}
-
-check_system_dir.sh() {
-	functionfile="${FUNCNAME[0]}"
-	fn_fetch_function
-}
-
-check_system_requirements.sh() {
-	functionfile="${FUNCNAME[0]}"
-	fn_fetch_function
-}
-
-check_tmuxception.sh() {
-	functionfile="${FUNCNAME[0]}"
-	fn_fetch_function
-}
-
-check_version.sh() {
-	functionfile="${FUNCNAME[0]}"
-	fn_fetch_function
-}
-
-# Compress
-
-compress_unreal2_maps.sh() {
-	functionfile="${FUNCNAME[0]}"
-	fn_fetch_function
-}
-
-compress_ut99_maps.sh() {
-	functionfile="${FUNCNAME[0]}"
-	fn_fetch_function
-}
-
-# Mods
-
-mods_list.sh() {
-	functionfile="${FUNCNAME[0]}"
-	fn_fetch_function
-}
-
-mods_core.sh() {
-	functionfile="${FUNCNAME[0]}"
-	fn_fetch_function
-}
-
-# Dev
-
-command_dev_clear_functions.sh() {
-	functionfile="${FUNCNAME[0]}"
-	fn_fetch_function
-}
-
-command_dev_debug.sh() {
-	functionfile="${FUNCNAME[0]}"
-	fn_fetch_function
-}
-
-command_dev_detect_deps.sh() {
-	functionfile="${FUNCNAME[0]}"
-	fn_fetch_function
-}
-
-command_dev_detect_glibc.sh() {
-	functionfile="${FUNCNAME[0]}"
-	fn_fetch_function
-}
-
-command_dev_detect_ldd.sh() {
-	functionfile="${FUNCNAME[0]}"
-	fn_fetch_function
-}
-
-command_dev_query_raw.sh() {
-	functionfile="${FUNCNAME[0]}"
-	fn_fetch_function
-}
-
-# Fix
-
-fix.sh() {
-	functionfile="${FUNCNAME[0]}"
-	fn_fetch_function
-}
-
-fix_ark.sh() {
-	functionfile="${FUNCNAME[0]}"
-	fn_fetch_function
-}
-
-fix_av.sh() {
-	functionfile="${FUNCNAME[0]}"
-	fn_fetch_function
-}
-
-fix_arma3.sh() {
-	functionfile="${FUNCNAME[0]}"
-	fn_fetch_function
-}
-
-fix_armar.sh() {
-	functionfile="${FUNCNAME[0]}"
-	fn_fetch_function
-}
-
-fix_bt.sh() {
-	functionfile="${FUNCNAME[0]}"
-	fn_fetch_function
-}
-
-fix_bo.sh() {
-	functionfile="${FUNCNAME[0]}"
-	fn_fetch_function
-}
-
-fix_cmw.sh() {
-	functionfile="${FUNCNAME[0]}"
-	fn_fetch_function
-}
-
-fix_csgo.sh() {
-	functionfile="${FUNCNAME[0]}"
-	fn_fetch_function
-}
-
-fix_dst.sh() {
-	functionfile="${FUNCNAME[0]}"
-	fn_fetch_function
-}
-
-fix_hw.sh() {
-	functionfile="${FUNCNAME[0]}"
-	fn_fetch_function
-}
-
-fix_ins.sh() {
-	functionfile="${FUNCNAME[0]}"
-	fn_fetch_function
-}
-
-fix_kf.sh() {
-	functionfile="${FUNCNAME[0]}"
-	fn_fetch_function
-}
-
-fix_kf2.sh() {
-	functionfile="${FUNCNAME[0]}"
-	fn_fetch_function
-}
-
-fix_lo.sh() {
-	functionfile="${FUNCNAME[0]}"
-	fn_fetch_function
-}
-
-fix_mcb.sh() {
-	functionfile="${FUNCNAME[0]}"
-	fn_fetch_function
-}
-
-fix_mta.sh() {
-	functionfile="${FUNCNAME[0]}"
-	fn_fetch_function
-}
-
-fix_nmrih.sh() {
-	functionfile="${FUNCNAME[0]}"
-	fn_fetch_function
-}
-
-fix_onset.sh() {
-	functionfile="${FUNCNAME[0]}"
-	fn_fetch_function
-}
-
-fix_ro.sh() {
-	functionfile="${FUNCNAME[0]}"
-	fn_fetch_function
-}
-
-fix_rust.sh() {
-	functionfile="${FUNCNAME[0]}"
-	fn_fetch_function
-}
-
-fix_rw.sh() {
-	functionfile="${FUNCNAME[0]}"
-	fn_fetch_function
-}
-
-fix_sfc.sh() {
-	functionfile="${FUNCNAME[0]}"
-	fn_fetch_function
-}
-
-fix_st.sh() {
-	functionfile="${FUNCNAME[0]}"
-	fn_fetch_function
-}
-
-fix_steamcmd.sh() {
-	functionfile="${FUNCNAME[0]}"
-	fn_fetch_function
-}
-
-fix_terraria.sh() {
-	functionfile="${FUNCNAME[0]}"
-	fn_fetch_function
-}
-
-fix_tf2.sh() {
-	functionfile="${FUNCNAME[0]}"
-	fn_fetch_function
-}
-
-fix_ut3.sh() {
-	functionfile="${FUNCNAME[0]}"
-	fn_fetch_function
-}
-
-fix_rust.sh() {
-	functionfile="${FUNCNAME[0]}"
-	fn_fetch_function
-}
-
-fix_samp.sh() {
-	functionfile="${FUNCNAME[0]}"
-	fn_fetch_function
-}
-
-fix_sdtd.sh() {
-	functionfile="${FUNCNAME[0]}"
-	fn_fetch_function
-}
-
-fix_sof2.sh() {
-	functionfile="${FUNCNAME[0]}"
-	fn_fetch_function
-}
-
-fix_squad.sh() {
-	functionfile="${FUNCNAME[0]}"
-	fn_fetch_function
-}
-
-fix_ts3.sh() {
-	functionfile="${FUNCNAME[0]}"
-	fn_fetch_function
-}
-
-fix_ut2k4.sh() {
-	functionfile="${FUNCNAME[0]}"
-	fn_fetch_function
-}
-
-fix_ut.sh() {
-	functionfile="${FUNCNAME[0]}"
-	fn_fetch_function
-}
-
-fix_unt.sh() {
-	functionfile="${FUNCNAME[0]}"
-	fn_fetch_function
-}
-
-fix_vh.sh() {
-	functionfile="${FUNCNAME[0]}"
-	fn_fetch_function
-}
-
-fix_wurm.sh() {
-	functionfile="${FUNCNAME[0]}"
-	fn_fetch_function
-}
-
-fix_zmr.sh() {
-	functionfile="${FUNCNAME[0]}"
-	fn_fetch_function
-}
-
-# Info
-
-info_distro.sh() {
-	functionfile="${FUNCNAME[0]}"
-	fn_fetch_function
-}
-
-info_game.sh() {
-	functionfile="${FUNCNAME[0]}"
-	fn_fetch_function
-}
-
-info_messages.sh() {
-	functionfile="${FUNCNAME[0]}"
-	fn_fetch_function
-}
-
-info_stats.sh() {
-	functionfile="${FUNCNAME[0]}"
-	fn_fetch_function
-}
-
-# Alert
-
-alert.sh() {
-	functionfile="${FUNCNAME[0]}"
-	fn_fetch_function
-}
-
-alert_discord.sh() {
-	functionfile="${FUNCNAME[0]}"
-	fn_fetch_function
-}
-
-alert_email.sh() {
-	functionfile="${FUNCNAME[0]}"
-	fn_fetch_function
-}
-
-alert_ifttt.sh() {
-	functionfile="${FUNCNAME[0]}"
-	fn_fetch_function
-}
-
-alert_pushbullet.sh() {
-	functionfile="${FUNCNAME[0]}"
-	fn_fetch_function
-}
-
-alert_pushover.sh() {
-	functionfile="${FUNCNAME[0]}"
-	fn_fetch_function
-}
-
-alert_gotify.sh() {
-	functionfile="${FUNCNAME[0]}"
-	fn_fetch_function
-}
-
-alert_telegram.sh() {
-	functionfile="${FUNCNAME[0]}"
-	fn_fetch_function
-}
-
-alert_rocketchat.sh() {
-	functionfile="${FUNCNAME[0]}"
-	fn_fetch_function
-}
-
-alert_slack.sh() {
-	functionfile="${FUNCNAME[0]}"
-	fn_fetch_function
-}
-# Logs
-
-core_logs.sh() {
-	functionfile="${FUNCNAME[0]}"
-	fn_fetch_function
-}
-
-# Query
-
-query_gamedig.sh() {
-	functionfile="${FUNCNAME[0]}"
-	fn_fetch_function
-}
-
-# Update
-
-command_update_functions.sh() {
-	functionfile="${FUNCNAME[0]}"
-	fn_fetch_function
-}
-
-command_update_linuxgsm.sh() {
-	functionfile="${FUNCNAME[0]}"
-	fn_fetch_function
-}
-
-command_update.sh() {
-	functionfile="${FUNCNAME[0]}"
-	fn_fetch_function
-}
-
-command_check_update.sh() {
-	functionfile="${FUNCNAME[0]}"
-	fn_fetch_function
-}
-
-update_ts3.sh() {
-	functionfile="${FUNCNAME[0]}"
-	fn_fetch_function
-}
-
-update_mc.sh() {
-	functionfile="${FUNCNAME[0]}"
-	fn_fetch_function
-}
-
-update_mcb.sh() {
-	functionfile="${FUNCNAME[0]}"
-	fn_fetch_function
-}
-
-update_pmc.sh() {
-	functionfile="${FUNCNAME[0]}"
-	fn_fetch_function
-}
-
-update_mta.sh() {
-	functionfile="${FUNCNAME[0]}"
-	fn_fetch_function
-}
-
-update_fctr.sh() {
-	functionfile="${FUNCNAME[0]}"
-	fn_fetch_function
-}
-
-update_jk2.sh() {
-	functionfile="${FUNCNAME[0]}"
-	fn_fetch_function
-}
-
-update_steamcmd.sh() {
-	functionfile="${FUNCNAME[0]}"
-	fn_fetch_function
-}
-
-update_vints.sh() {
-	functionfile="${FUNCNAME[0]}"
-	fn_fetch_function
-}
-
-update_ut99.sh() {
-	functionfile="${FUNCNAME[0]}"
-	fn_fetch_function
-}
-
-fn_update_functions.sh() {
-	functionfile="${FUNCNAME[0]}"
-	fn_fetch_function
-}
-
-#
-## Installer functions
-#
-
-fn_autoinstall() {
-	autoinstall=1
-	command_install.sh
-}
-
-install_complete.sh() {
-	functionfile="${FUNCNAME[0]}"
-	fn_fetch_function
-}
-
-install_config.sh() {
-	functionfile="${FUNCNAME[0]}"
-	fn_fetch_function
-}
-
-install_factorio_save.sh() {
-	functionfile="${FUNCNAME[0]}"
-	fn_fetch_function
-}
-
-install_dst_token.sh() {
-	functionfile="${FUNCNAME[0]}"
-	fn_fetch_function
-}
-
-install_eula.sh() {
-	functionfile="${FUNCNAME[0]}"
-	fn_fetch_function
-}
-
-install_gsquery.sh() {
-	functionfile="${FUNCNAME[0]}"
-	fn_fetch_function
-}
-
-install_gslt.sh() {
-	functionfile="${FUNCNAME[0]}"
-	fn_fetch_function
-}
-
-install_header.sh() {
-	functionfile="${FUNCNAME[0]}"
-	fn_fetch_function
-}
-
-install_logs.sh() {
-	functionfile="${FUNCNAME[0]}"
-	fn_fetch_function
-}
-
-install_retry.sh() {
-	functionfile="${FUNCNAME[0]}"
-	fn_fetch_function
-}
-
-install_server_dir.sh() {
-	functionfile="${FUNCNAME[0]}"
-	fn_fetch_function
-}
-install_server_files.sh() {
-	functionfile="${FUNCNAME[0]}"
-	fn_fetch_function
-}
-
-install_stats.sh() {
-	functionfile="${FUNCNAME[0]}"
-	fn_fetch_function
-}
-
-install_steamcmd.sh() {
-	functionfile="${FUNCNAME[0]}"
-	fn_fetch_function
-}
-
-install_ts3.sh() {
-	functionfile="${FUNCNAME[0]}"
-	fn_fetch_function
-}
-
-install_ts3db.sh() {
-	functionfile="${FUNCNAME[0]}"
-	fn_fetch_function
-}
-
-install_ut2k4.sh() {
-	functionfile="${FUNCNAME[0]}"
-	fn_fetch_function
-}
-
-install_dl_ut2k4.sh() {
-	functionfile="${FUNCNAME[0]}"
-	fn_fetch_function
-}
-
-install_ut2k4_key.sh() {
-	functionfile="${FUNCNAME[0]}"
-	fn_fetch_function
-}
-
-# Calls code required for legacy servers
-core_legacy.sh
-
-# Creates tmp dir if missing
-if [ ! -d "${tmpdir}" ]; then
-	mkdir -p "${tmpdir}"
-fi
-
-# Creates lock dir if missing
-if [ ! -d "${lockdir}" ]; then
-	mkdir -p "${lockdir}"
-fi
-
-# Calls on-screen messages (bootstrap)
-core_messages.sh
-
-#Calls file downloader (bootstrap)
-core_dl.sh
-
-# Calls the global Ctrl-C trap
-core_trap.sh
diff --git a/lgsm/modules/core_legacy.sh b/lgsm/modules/core_legacy.sh
index 7a7e554ed..cf11e3a54 100644
--- a/lgsm/modules/core_legacy.sh
+++ b/lgsm/modules/core_legacy.sh
@@ -7,14 +7,6 @@
 
 moduleselfname="$(basename "$(readlink -f "${BASH_SOURCE[0]}")")"
 
-# This is to help the transition to v20.3.0 and above
-legacy_versions_array=(v20.2.1 v20.2.0 v20.1.5 v20.1.4 v20.1.3 v20.1.2 v20.1.1 v20.1.0 v19.12.5 v19.12.4 v19.12.3 v19.12.2 v19.12.1 v19.12.0)
-for legacy_version in "${legacy_versions_array[@]}"; do
-	if [ "${version}" == "${legacy_version}" ]; then
-		legacymode=1
-	fi
-done
-
 if [ -z "${socketname}" ]; then
 	socketname="${sessionname}"
 fi
@@ -43,69 +35,6 @@ if [ -n "${autosaveinterval}" ]; then
 	saveinterval="${autosaveinterval}"
 fi
 
-if [ -z "${serverfiles}" ]; then
-	serverfiles="${filesdir}"
-fi
-
-if [ -z "${logdir}" ]; then
-	[ -n "${LGSM_LOGDIR}" ] && logdir="${LGSM_LOGDIR}" || logdir="${rootdir}/log"
-fi
-
-if [ -z "${lgsmlogdir}" ]; then
-	lgsmlogdir="${scriptlogdir}"
-fi
-
-if [ -z "${lgsmlog}" ]; then
-	lgsmlog="${scriptlog}"
-fi
-
-if [ -z "${lgsmlogdate}" ]; then
-	lgsmlogdate="${scriptlogdate}"
-fi
-
-if [ -z "${steamcmddir}" ]; then
-	steamcmddir="${HOME}/.steam/steamcmd"
-fi
-
-if [ -z "${lgsmdir}" ]; then
-	lgsmdir="${rootdir}/lgsm"
-fi
-
-if [ -z "${tmpdir}" ]; then
-	tmpdir="${lgsmdir}/tmp"
-fi
-
-if [ -z "${alertlog}" ]; then
-	alertlog="${emaillog}"
-fi
-
-if [ -z "${servicename}" ]; then
-	servicename="${selfname}"
-fi
-
-# Alternations to workshop variables.
-if [ -z "${wsapikey}" ]; then
-	if [ "${workshopauth}" ]; then
-		wsapikey="${workshopauth}"
-	elif [ "${authkey}" ]; then
-		wsapikey="${authkey}"
-	fi
-fi
-
-if [ -z "${wscollectionid}" ]; then
-	if [ "${workshopauth}" ]; then
-		wscollectionid="${ws_collection_id}"
-	elif [ "${authkey}" ]; then
-		wscollectionid="${workshopcollectionid}"
-	fi
-fi
-
-if [ -z "${wsstartmap}" ]; then
-	if [ "${ws_start_map}" ]; then
-		wscollectionid="${ws_start_map}"
-	fi
-fi
-
 # Added as part of migrating functions dir to modules dir.
 # Will remove functions dir if files in modules dir older than 14 days
 functionsdir="${lgsmdir}/modules"
diff --git a/linuxgsm.sh b/linuxgsm.sh
index 20adc1db6..395285c7b 100755
--- a/linuxgsm.sh
+++ b/linuxgsm.sh
@@ -490,23 +490,6 @@ else
 		elif grep -qE "^[[:blank:]]*preexecutable=" "${configdirserver}/_default.cfg"; then
 			eval preexecutable="$(sed -nr 's/^ *preexecutable=(.*)$/\1/p' "${configdirserver}/_default.cfg")"
 		fi
-
-		# For legacy configs that still use parms= 15.03.21
-		if grep -qE "^[[:blank:]]*parms=" "${configdirserver}/secrets-${selfname}.cfg"; then
-			eval parms="$(sed -nr 's/^ *parms=(.*)$/\1/p' "${configdirserver}/secrets-${selfname}.cfg")"
-		elif grep -qE "^[[:blank:]]*parms=" "${configdirserver}/${selfname}.cfg"; then
-			eval parms="$(sed -nr 's/^ *parms=(.*)$/\1/p' "${configdirserver}/${selfname}.cfg")"
-		elif grep -qE "^[[:blank:]]*parms=" "${configdirserver}/secrets-common.cfg"; then
-			eval parms="$(sed -nr 's/^ *parms=(.*)$/\1/p' "${configdirserver}/secrets-common.cfg")"
-		elif grep -qE "^[[:blank:]]*parms=" "${configdirserver}/common.cfg"; then
-			eval parms="$(sed -nr 's/^ *parms=(.*)$/\1/p' "${configdirserver}/common.cfg")"
-		elif grep -qE "^[[:blank:]]*parms=" "${configdirserver}/_default.cfg"; then
-			eval parms="$(sed -nr 's/^ *parms=(.*)$/\1/p' "${configdirserver}/_default.cfg")"
-		fi
-
-		if [ -n "${parms}" ]; then
-			startparameters="${parms}"
-		fi
 	}
 
 	# Load the linuxgsm.sh in to tmpdir. If missing download it.

From 8b0d98c887e7bee7cfce0046ae7d0600cf71f099 Mon Sep 17 00:00:00 2001
From: Daniel Gibbs <me@danielgibbs.co.uk>
Date: Sun, 22 Oct 2023 23:24:29 +0100
Subject: [PATCH 011/154] feat: deprecate Last Oasis (#4349)

The commit removes the Last Oasis game server configuration file `_default.cfg` and the corresponding module `fix_lo.sh`. These files are no longer needed as Last Oasis is being removed from the supported games list.
---
 .../config-lgsm/loserver/_default.cfg         | 189 ------------------
 lgsm/data/serverlist.csv                      |   1 -
 lgsm/modules/core_modules.sh                  |   5 -
 lgsm/modules/fix_lo.sh                        |  15 --
 lgsm/modules/info_game.sh                     |  10 -
 lgsm/modules/info_messages.sh                 |  10 -
 6 files changed, 230 deletions(-)
 delete mode 100644 lgsm/config-default/config-lgsm/loserver/_default.cfg
 delete mode 100644 lgsm/modules/fix_lo.sh

diff --git a/lgsm/config-default/config-lgsm/loserver/_default.cfg b/lgsm/config-default/config-lgsm/loserver/_default.cfg
deleted file mode 100644
index 9a2e90a47..000000000
--- a/lgsm/config-default/config-lgsm/loserver/_default.cfg
+++ /dev/null
@@ -1,189 +0,0 @@
-##################################
-######## Default Settings ########
-##################################
-# DO NOT EDIT, ANY CHANGES WILL BE OVERWRITTEN!
-# Copy settings from here and use them in either:
-# common.cfg - applies settings to every instance.
-# [instance].cfg - applies settings to a specific instance.
-
-#### Game Server Settings ####
-
-## Predefined Parameters | https://docs.linuxgsm.com/configuration/start-parameters
-## https://docs.linuxgsm.com/game-servers/last-oasis
-servername="LinuxGSM"
-ip="0.0.0.0"
-port="7777"
-queryport="27015"
-customerkey=""
-providerkey=""
-slots="100"
-
-## Server Parameters | https://docs.linuxgsm.com/configuration/start-parameters#additional-parameters
-# For specific IP use: -OverrideConnectionAddress=${ip}
-startparameters="-log -force_steamclient_link -messaging -NoLiveServer -EnableCheats -backendapiurloverride="backend.last-oasis.com" -identifier=${servername} -port=${port} -CustomerKey=${customerkey} -ProviderKey=${providerkey} -slots=${slots} -QueryPort=${queryport}"
-
-#### LinuxGSM Settings ####
-
-## LinuxGSM Stats
-# Send useful stats to LinuxGSM developers.
-# https://docs.linuxgsm.com/configuration/linuxgsm-stats
-# (on|off)
-stats="off"
-
-## Notification Alerts
-# (on|off)
-
-# Display IP | https://docs.linuxgsm.com/alerts#display-ip
-displayip=""
-
-# More info | https://docs.linuxgsm.com/alerts#more-info
-postalert="off"
-
-# Alert on Start/Stop/Restart
-statusalert="off"
-
-# Discord Alerts | https://docs.linuxgsm.com/alerts/discord
-discordalert="off"
-discordwebhook="webhook"
-
-# Email Alerts | https://docs.linuxgsm.com/alerts/email
-emailalert="off"
-email="email@example.com"
-emailfrom=""
-
-# Gotify Alerts | https://docs.linuxgsm.com/alerts/gotify
-gotifyalert="off"
-gotifytoken="token"
-gotifywebhook="webhook"
-
-# IFTTT Alerts | https://docs.linuxgsm.com/alerts/ifttt
-iftttalert="off"
-ifttttoken="accesstoken"
-iftttevent="linuxgsm_alert"
-
-# Pushbullet Alerts | https://docs.linuxgsm.com/alerts/pushbullet
-pushbulletalert="off"
-pushbullettoken="accesstoken"
-channeltag=""
-
-# Pushover Alerts | https://docs.linuxgsm.com/alerts/pushover
-pushoveralert="off"
-pushovertoken="accesstoken"
-pushoveruserkey="userkey"
-
-# Rocket.Chat Alerts | https://docs.linuxgsm.com/alerts/rocket.chat
-rocketchatalert="off"
-rocketchatwebhook="webhook"
-
-# Slack Alerts | https://docs.linuxgsm.com/alerts/slack
-slackalert="off"
-slackwebhook="webhook"
-
-# Telegram Alerts | https://docs.linuxgsm.com/alerts/telegram
-# You can add a custom cURL string eg proxy (useful in Russia) in "curlcustomstring".
-# For example "--socks5 ipaddr:port" for socks5 proxy see more in "curl --help".
-telegramapi="api.telegram.org"
-telegramalert="off"
-telegramtoken="accesstoken"
-telegramchatid=""
-curlcustomstring=""
-
-## Updating | https://docs.linuxgsm.com/commands/update
-updateonstart="off"
-
-## Backup | https://docs.linuxgsm.com/commands/backup
-maxbackups="4"
-maxbackupdays="30"
-stoponbackup="on"
-
-## Logging | https://docs.linuxgsm.com/features/logging
-consolelogging="on"
-logdays="7"
-
-## Monitor | https://docs.linuxgsm.com/commands/monitor
-# Query delay time
-querydelay="1"
-
-## ANSI Colors | https://docs.linuxgsm.com/features/ansi-colors
-ansi="on"
-
-#### Advanced Settings ####
-
-## Message Display Time | https://docs.linuxgsm.com/features/message-display-time
-sleeptime="0.5"
-
-## SteamCMD Settings | https://docs.linuxgsm.com/steamcmd
-# Server appid
-appid="920720"
-steamcmdforcewindows="no"
-# SteamCMD Branch | https://docs.linuxgsm.com/steamcmd/branch
-branch=""
-betapassword=""
-# Master Server | https://docs.linuxgsm.com/steamcmd/steam-master-server
-steammaster="false"
-
-## Stop Mode | https://docs.linuxgsm.com/features/stop-mode
-# 1: tmux kill
-# 2: CTRL+c
-# 3: quit
-# 4: quit 120s
-# 5: stop
-# 6: q
-# 7: exit
-# 8: 7 Days to Die
-# 9: GoldSrc
-# 10: Avorion
-# 11: end
-stopmode="2"
-
-## Query mode
-# 1: session only
-# 2: gamedig (gsquery fallback)
-# 3: gamedig
-# 4: gsquery
-# 5: tcp
-querymode="1"
-querytype=""
-
-## Console type
-consoleverbose="yes"
-consoleinteract="no"
-
-## Game Server Details
-# Do not edit
-gamename="Last Oasis"
-engine="unreal4"
-glibc="2.17"
-
-#### Directories ####
-# Edit with care
-
-## Game Server Directories
-systemdir="${serverfiles}/Mist"
-executabledir="${systemdir}/Binaries/Linux"
-executable="./MistServer-Linux-Shipping"
-servercfgdir="${systemdir}/Saved/Config/LinuxServer"
-servercfg="Game.ini"
-servercfgdefault="Game.ini"
-servercfgfullpath="${servercfgdir}/${servercfg}"
-
-## Backup Directory
-backupdir="${lgsmdir}/backup"
-
-## Logging Directories
-[ -n "${LGSM_LOGDIR}" ] && logdir="${LGSM_LOGDIR}" || logdir="${rootdir}/log"
-gamelogdir="${systemdir}/Saved/Logs"
-lgsmlogdir="${logdir}/script"
-consolelogdir="${logdir}/console"
-lgsmlog="${lgsmlogdir}/${selfname}-script.log"
-consolelog="${consolelogdir}/${selfname}-console.log"
-alertlog="${lgsmlogdir}/${selfname}-alert.log"
-postdetailslog="${lgsmlogdir}/${selfname}-postdetails.log"
-
-## Logs Naming
-lgsmlogdate="${lgsmlogdir}/${selfname}-script-$(date '+%Y-%m-%d-%H:%M:%S').log"
-consolelogdate="${consolelogdir}/${selfname}-console-$(date '+%Y-%m-%d-%H:%M:%S').log"
-
-## Log Parameters
-logtimestamp="off"
-logtimestampformat="%Y-%m-%d %H:%M:%S"
diff --git a/lgsm/data/serverlist.csv b/lgsm/data/serverlist.csv
index 7872048c7..43b9dc426 100644
--- a/lgsm/data/serverlist.csv
+++ b/lgsm/data/serverlist.csv
@@ -63,7 +63,6 @@ kf,kfserver,Killing Floor,ubuntu-22.04
 kf2,kf2server,Killing Floor 2,ubuntu-22.04
 l4d,l4dserver,Left 4 Dead,ubuntu-22.04
 l4d2,l4d2server,Left 4 Dead 2,ubuntu-22.04
-lo,loserver,Last Oasis,ubuntu-22.04
 mc,mcserver,Minecraft,ubuntu-22.04
 mcb,mcbserver,Minecraft Bedrock,ubuntu-22.04
 mh,mhserver,MORDHAU,ubuntu-22.04
diff --git a/lgsm/modules/core_modules.sh b/lgsm/modules/core_modules.sh
index c2b529741..3d989f346 100644
--- a/lgsm/modules/core_modules.sh
+++ b/lgsm/modules/core_modules.sh
@@ -396,11 +396,6 @@ fix_kf2.sh() {
 	fn_fetch_module
 }
 
-fix_lo.sh() {
-	modulefile="${FUNCNAME[0]}"
-	fn_fetch_module
-}
-
 fix_mcb.sh() {
 	modulefile="${FUNCNAME[0]}"
 	fn_fetch_module
diff --git a/lgsm/modules/fix_lo.sh b/lgsm/modules/fix_lo.sh
deleted file mode 100644
index 4966afd57..000000000
--- a/lgsm/modules/fix_lo.sh
+++ /dev/null
@@ -1,15 +0,0 @@
-#!/bin/bash
-# LinuxGSM fix_lo.sh module
-# Author: Daniel Gibbs
-# Website: https://linuxgsm.com
-# Description: Resolves various issues with Last Oasis.
-
-moduleselfname="$(basename "$(readlink -f "${BASH_SOURCE[0]}")")"
-
-appidfile=${executabledir}/steam_appid.txt
-if [ ! -f "${appidfile}" ]; then
-	fn_print_information "adding ${appidfile} to ${gamename} server."
-	echo "903950" > "${appidfile}"
-else
-	fn_print_information "${appidfile} already exists. No action to be taken."
-fi
diff --git a/lgsm/modules/info_game.sh b/lgsm/modules/info_game.sh
index 2d172cdd5..c31a4171f 100644
--- a/lgsm/modules/info_game.sh
+++ b/lgsm/modules/info_game.sh
@@ -1366,14 +1366,6 @@ fn_info_game_jk2() {
 	serverversion="${serverversion:-"NOT SET"}"
 }
 
-# Config Type: unknown
-fn_info_game_lo() {
-	servername="${servername:-"NOT SET"}"
-	port="${port:-"0"}"
-	queryport="${queryport:-"0"}"
-	maxplayers="${slots:-"0"}"
-}
-
 # Config Type: Java properties
 # Comment: # or !
 # Example: motd=SERVERNAME
@@ -2288,8 +2280,6 @@ elif [ "${shortname}" == "kf" ]; then
 	fn_info_game_kf
 elif [ "${shortname}" == "kf2" ]; then
 	fn_info_game_kf2
-elif [ "${shortname}" == "lo" ]; then
-	fn_info_game_lo
 elif [ "${shortname}" == "mc" ] || [ "${shortname}" == "pmc" ]; then
 	fn_info_game_mc
 elif [ "${shortname}" == "mcb" ]; then
diff --git a/lgsm/modules/info_messages.sh b/lgsm/modules/info_messages.sh
index 121341878..4bd6a3c66 100644
--- a/lgsm/modules/info_messages.sh
+++ b/lgsm/modules/info_messages.sh
@@ -1134,14 +1134,6 @@ fn_info_message_kf2() {
 	} | column -s $'\t' -t
 }
 
-fn_info_message_lo() {
-	{
-		fn_port "header"
-		fn_port "Game" port udp
-		fn_port "Query" queryport udp
-	} | column -s $'\t' -t
-}
-
 fn_info_message_mc() {
 	{
 		fn_port "header"
@@ -1747,8 +1739,6 @@ fn_info_message_select_engine() {
 		fn_info_message_kf
 	elif [ "${shortname}" == "kf2" ]; then
 		fn_info_message_kf2
-	elif [ "${shortname}" == "lo" ]; then
-		fn_info_message_lo
 	elif [ "${shortname}" == "mc" ] || [ "${shortname}" == "pmc" ] || [ "${shortname}" == "wmc" ]; then
 		fn_info_message_mc
 	elif [ "${shortname}" == "mcb" ]; then

From ab0fb4f14e4420dcaa428fa21e8d4ab9b098e8dd Mon Sep 17 00:00:00 2001
From: Daniel Gibbs <me@danielgibbs.co.uk>
Date: Mon, 23 Oct 2023 13:34:00 +0100
Subject: [PATCH 012/154] fix: correct fn_script_log_fail

---
 lgsm/modules/alert.sh            | 2 +-
 lgsm/modules/install_complete.sh | 2 +-
 lgsm/modules/install_config.sh   | 2 +-
 3 files changed, 3 insertions(+), 3 deletions(-)

diff --git a/lgsm/modules/alert.sh b/lgsm/modules/alert.sh
index 785c7ae20..74822e94c 100644
--- a/lgsm/modules/alert.sh
+++ b/lgsm/modules/alert.sh
@@ -219,7 +219,7 @@ elif [ "${alert}" == "backup" ]; then
 	fn_alert_backup
 else
 	fn_print_fail_nl "Missing alert type"
-	fn_script_log_fatal "Missing alert type"
+	fn_script_log_fail "Missing alert type"
 	core_exit.sh
 fi
 
diff --git a/lgsm/modules/install_complete.sh b/lgsm/modules/install_complete.sh
index 2c3cb2493..5a9873067 100644
--- a/lgsm/modules/install_complete.sh
+++ b/lgsm/modules/install_complete.sh
@@ -12,7 +12,7 @@ fn_messages_separator
 
 if [ "${exitcode}" == "1" ]; then
 	echo -e "${bold}${red}Install Failed!${default}"
-	fn_script_log_fatal "Install Failed!"
+	fn_script_log_fail "Install Failed!"
 elif [ "${exitcode}" == "2" ]; then
 	echo -e "${bold}${red}Install Completed with Errors!${default}}"
 	fn_script_log_error "Install Completed with Errors!"
diff --git a/lgsm/modules/install_config.sh b/lgsm/modules/install_config.sh
index 258a7744a..a8d97e661 100644
--- a/lgsm/modules/install_config.sh
+++ b/lgsm/modules/install_config.sh
@@ -66,7 +66,7 @@ fn_default_config_local() {
 	cp -n "${servercfgdir}/${servercfgdefault}" "${servercfgfullpath}"
 	if [ "${exitcode}" != 0 ]; then
 		fn_print_fail_eol
-		fn_script_log_fatal "copying config file [ ${servercfgdefault} ]"
+		fn_script_log_fail "copying config file [ ${servercfgdefault} ]"
 	else
 		fn_print_ok_eol
 		fn_script_log_pass "copying config file [ ${servercfgdefault} ]"

From f33bfdf47c226a1ea66f91956d0900b5c4b8b95e Mon Sep 17 00:00:00 2001
From: Daniel Gibbs <me@danielgibbs.co.uk>
Date: Fri, 27 Oct 2023 23:59:57 +0100
Subject: [PATCH 013/154] feat(new server): Counter Strike 2 (#4356)

* cs2

* config

* fix: remove lo code

* config

* params

* source2

* game info

* messages

* config changes

* dirs

* config

* refactor: refactor info message functions in alert.sh, command_details.sh, command_dev_query_raw.sh, and command_postdetails.sh

- Refactored the info message functions in multiple files to have consistent naming conventions.
- Renamed fn_info_message_* functions to fn_info_messages_* for clarity and consistency.
- Updated function calls accordingly.

* refactor: remove unnecessary code duplication in info_game.sh

The commit removes duplicated code for retrieving server information from the game configuration file. Specifically, it removes redundant lines related to rconpassword, rconport, and serverpassword. This improves code readability and maintainability.

* cs2

* cs2

* cs2 icon

* remove lo

* remove file

* remove lo

* update url

* ignore games with no configs

* remove configs from games that have non

* details check fix

* details check

* details check

* ignore systemdir check if running github actions

* fix name
---
 .github/workflows/details-check.yml           |   4 +-
 .../workflows/detals-check-generate-matrix.sh |   2 +-
 .../config-lgsm/cs2server/_default.cfg        | 217 ++++++++++
 .../config-lgsm/inssserver/_default.cfg       |   3 -
 .../config-lgsm/sbotsserver/_default.cfg      |   5 -
 lgsm/data/almalinux-8.csv                     |   2 +-
 lgsm/data/almalinux-9.csv                     |   2 +-
 lgsm/data/centos-7.csv                        |   2 +-
 lgsm/data/centos-8.csv                        |   2 +-
 lgsm/data/centos-9.csv                        |   2 +-
 lgsm/data/debian-10.csv                       |   2 +-
 lgsm/data/debian-11.csv                       |   2 +-
 lgsm/data/debian-12.csv                       |   2 +-
 lgsm/data/debian-9.csv                        |   2 +-
 lgsm/data/gameicons/cs2-icon.png              | Bin 0 -> 2397 bytes
 lgsm/data/gameicons/lo-icon.png               | Bin 2747 -> 0 bytes
 lgsm/data/rhel-7.csv                          |   2 +-
 lgsm/data/rhel-8.csv                          |   2 +-
 lgsm/data/rhel-9.csv                          |   2 +-
 lgsm/data/rocky-8.csv                         |   2 +-
 lgsm/data/rocky-9.csv                         |   2 +-
 lgsm/data/serverlist.csv                      |   1 +
 lgsm/data/ubuntu-16.04.csv                    |   2 +-
 lgsm/data/ubuntu-18.04.csv                    |   2 +-
 lgsm/data/ubuntu-20.04.csv                    |   2 +-
 lgsm/data/ubuntu-22.04.csv                    |   2 +-
 lgsm/data/ubuntu-23.04.csv                    |   2 +-
 lgsm/data/ubuntu-23.10.csv                    |   2 +-
 lgsm/modules/alert.sh                         |  10 +-
 lgsm/modules/check_system_dir.sh              |   2 +-
 lgsm/modules/command_details.sh               |  22 +-
 lgsm/modules/command_dev_query_raw.sh         |   2 +-
 lgsm/modules/command_postdetails.sh           |  22 +-
 lgsm/modules/command_stop.sh                  |   2 +-
 lgsm/modules/fix.sh                           |   4 +-
 lgsm/modules/info_game.sh                     |  22 +
 lgsm/modules/info_messages.sh                 | 402 +++++++++---------
 lgsm/modules/install_config.sh                |   6 +
 38 files changed, 507 insertions(+), 259 deletions(-)
 create mode 100644 lgsm/config-default/config-lgsm/cs2server/_default.cfg
 create mode 100644 lgsm/data/gameicons/cs2-icon.png
 delete mode 100644 lgsm/data/gameicons/lo-icon.png

diff --git a/.github/workflows/details-check.yml b/.github/workflows/details-check.yml
index ca27ba5a3..ce9b45996 100644
--- a/.github/workflows/details-check.yml
+++ b/.github/workflows/details-check.yml
@@ -59,14 +59,14 @@ jobs:
 
       - name: Download config
         run: |
-          if [ -z "${{ steps.sets-servercfgname.outputs.servercfgname }}" ]; then
+          if [ "${{ steps.sets-servercfgname.outputs.servercfgname }}" == "" ]; then
             echo "This game server has no config file."
           else
             curl -f -o config "https://raw.githubusercontent.com/GameServerManagers/Game-Server-Configs/main/${{ matrix.shortname }}/${{ steps.sets-servercfgname.outputs.servercfgname }}"
           fi
       - name: Display config
         run: |
-          if [ -z "${{ steps.sets-servercfgname.outputs.servercfgname }}" ]; then
+          if [ "${{ steps.sets-servercfgname.outputs.servercfgname }}" == "" ]; then
             echo "This game server has no config file."
           else
             cat config
diff --git a/.github/workflows/detals-check-generate-matrix.sh b/.github/workflows/detals-check-generate-matrix.sh
index 14cbb6ee7..bba9e8d5d 100755
--- a/.github/workflows/detals-check-generate-matrix.sh
+++ b/.github/workflows/detals-check-generate-matrix.sh
@@ -1,6 +1,6 @@
 #!/bin/bash
 
-curl "https://raw.githubusercontent.com/GameServerManagers/LinuxGSM/master/lgsm/data/serverlist.csv" | grep -v '^[[:blank:]]*$' > serverlist.csv
+curl "https://raw.githubusercontent.com/GameServerManagers/LinuxGSM/${GITHUB_REF#refs/heads/}/lgsm/data/serverlist.csv" | grep -v '^[[:blank:]]*$' > serverlist.csv
 
 echo -n "{" > "shortnamearray.json"
 echo -n "\"include\":[" >> "shortnamearray.json"
diff --git a/lgsm/config-default/config-lgsm/cs2server/_default.cfg b/lgsm/config-default/config-lgsm/cs2server/_default.cfg
new file mode 100644
index 000000000..820f80379
--- /dev/null
+++ b/lgsm/config-default/config-lgsm/cs2server/_default.cfg
@@ -0,0 +1,217 @@
+##################################
+######## Default Settings ########
+##################################
+# DO NOT EDIT, ANY CHANGES WILL BE OVERWRITTEN!
+# Copy settings from here and use them in either:
+# common.cfg - applies settings to every instance.
+# [instance].cfg - applies settings to a specific instance.
+
+#### Game Server Settings ####
+
+## SteamCMD Login | https://docs.linuxgsm.com/steamcmd#steamcmd-login
+steamuser="username"
+steampass='password'
+
+## Predefined Parameters | https://docs.linuxgsm.com/configuration/start-parameters
+# https://docs.linuxgsm.com/game-servers/counter-strike-2
+# [Game Modes]						gametype	gamemode	gamemodeflags	skirmishid	mapgroup (you can mix these across all Game Modes except Danger Zone, but use only one)
+# Arms Race							1			0			0				0			mg_armsrace
+# Boom! Headshot!					1			2			0				6			mg_skirmish_headshots
+# Classic Casual					0			0			0				0			mg_casualsigma, mg_casualdelta
+# Classic Competitive (Default)		0			1			0				0			mg_active, mg_reserves, mg_hostage, mg_de_dust2, ...
+# Classic Competitive (Short Match)	0			1			32				0			mg_active, mg_reserves, mg_hostage, mg_de_dust2, ...
+# Danger Zone						6			0			0				0			mg_dz_blacksite (map: dz_blacksite), mg_dz_sirocco (map: dz_sirocco)
+# Deathmatch (Default)				1			2			0				0			mg_deathmatch
+# Deathmatch (Free For All)			1			2			32				0			mg_deathmatch
+# Deathmatch (Team vs Team)			1			2			4				0			mg_deathmatch
+# Demolition						1			1			0				0			mg_demolition
+# Flying Scoutsman					0			0			0				3			mg_skirmish_flyingscoutsman
+# Hunter-Gatherers					1			2			0				7			mg_skirmish_huntergatherers
+# Retakes							0			0			0				12			mg_skirmish_retakes
+# Stab Stab Zap						0			0			0				1			mg_skirmish_stabstabzap
+# Trigger Discipline				0			0			0				4			mg_skirmish_triggerdiscipline
+# Wingman							0			2			0				0			mg_de_prime, mg_de_blagai, mg_de_vertigo, mg_de_inferno, mg_de_overpass, mg_de_cbble, mg_de_train, mg_de_shortnuke,	mg_de_shortdust, mg_de_lake
+gametype="0"
+gamemode="1"
+gamemodeflags="0"
+skirmishid="0"
+mapgroup="mg_active"
+ip="0.0.0.0"
+port="27015"
+defaultmap="de_dust2"
+maxplayers="16"
+tickrate="64"
+
+## Game Server Login Token (GSLT): Required
+# GSLT is required for running a public server.
+# More info: https://docs.linuxgsm.com/steamcmd/gslt
+gslt=""
+
+## Server Parameters | https://docs.linuxgsm.com/configuration/start-parameters#additional-parameters
+startparameters="-dedicated +sv_setsteamaccount ${gslt} +map ${defaultmap} +game_type 0 +game_mode 1 +sv_logfile 1 -serverlogging +exec ${selfname}.cfg"
+
+#### LinuxGSM Settings ####
+
+## LinuxGSM Stats
+# Send useful stats to LinuxGSM developers.
+# https://docs.linuxgsm.com/configuration/linuxgsm-stats
+# (on|off)
+stats="off"
+
+## Notification Alerts
+# (on|off)
+
+# Display IP | https://docs.linuxgsm.com/alerts#display-ip
+displayip=""
+
+# More info | https://docs.linuxgsm.com/alerts#more-info
+postalert="off"
+
+# Alert on Start/Stop/Restart
+statusalert="off"
+
+# Discord Alerts | https://docs.linuxgsm.com/alerts/discord
+discordalert="off"
+discordwebhook="webhook"
+
+# Email Alerts | https://docs.linuxgsm.com/alerts/email
+emailalert="off"
+email="email@example.com"
+emailfrom=""
+
+# Gotify Alerts | https://docs.linuxgsm.com/alerts/gotify
+gotifyalert="off"
+gotifytoken="token"
+gotifywebhook="webhook"
+
+# IFTTT Alerts | https://docs.linuxgsm.com/alerts/ifttt
+iftttalert="off"
+ifttttoken="accesstoken"
+iftttevent="linuxgsm_alert"
+
+# Pushbullet Alerts | https://docs.linuxgsm.com/alerts/pushbullet
+pushbulletalert="off"
+pushbullettoken="accesstoken"
+channeltag=""
+
+# Pushover Alerts | https://docs.linuxgsm.com/alerts/pushover
+pushoveralert="off"
+pushovertoken="accesstoken"
+pushoveruserkey="userkey"
+
+# Rocket.Chat Alerts | https://docs.linuxgsm.com/alerts/rocket.chat
+rocketchatalert="off"
+rocketchatwebhook="webhook"
+
+# Slack Alerts | https://docs.linuxgsm.com/alerts/slack
+slackalert="off"
+slackwebhook="webhook"
+
+# Telegram Alerts | https://docs.linuxgsm.com/alerts/telegram
+# You can add a custom cURL string eg proxy (useful in Russia) in "curlcustomstring".
+# For example "--socks5 ipaddr:port" for socks5 proxy see more in "curl --help".
+telegramapi="api.telegram.org"
+telegramalert="off"
+telegramtoken="accesstoken"
+telegramchatid=""
+curlcustomstring=""
+
+## Updating | https://docs.linuxgsm.com/commands/update
+updateonstart="off"
+
+## Backup | https://docs.linuxgsm.com/commands/backup
+maxbackups="4"
+maxbackupdays="30"
+stoponbackup="on"
+
+## Logging | https://docs.linuxgsm.com/features/logging
+consolelogging="on"
+logdays="7"
+
+## Monitor | https://docs.linuxgsm.com/commands/monitor
+# Query delay time
+querydelay="1"
+
+## ANSI Colors | https://docs.linuxgsm.com/features/ansi-colors
+ansi="on"
+
+#### Advanced Settings ####
+
+## Message Display Time | https://docs.linuxgsm.com/features/message-display-time
+sleeptime="0.5"
+
+## SteamCMD Settings | https://docs.linuxgsm.com/steamcmd
+# Server appid
+appid="730"
+steamcmdforcewindows="no"
+# SteamCMD Branch | https://docs.linuxgsm.com/steamcmd/branch
+branch=""
+betapassword=""
+# Master Server | https://docs.linuxgsm.com/steamcmd/steam-master-server
+steammaster="true"
+
+## Stop Mode | https://docs.linuxgsm.com/features/stop-mode
+# 1: tmux kill
+# 2: CTRL+c
+# 3: quit
+# 4: quit 120s
+# 5: stop
+# 6: q
+# 7: exit
+# 8: 7 Days to Die
+# 9: GoldSrc
+# 10: Avorion
+# 11: end
+stopmode="9"
+
+## Query mode
+# 1: session only
+# 2: gamedig (gsquery fallback)
+# 3: gamedig
+# 4: gsquery
+# 5: tcp
+querymode="2"
+querytype="protocol-valve"
+
+## Console type
+consoleverbose="yes"
+consoleinteract="yes"
+
+## Game Server Details
+# Do not edit
+gamename="Counter-Strike 2"
+engine="source2"
+glibc="2.31"
+
+#### Directories ####
+# Edit with care
+
+## Game Server Directories
+systemdir="${serverfiles}/game/csgo"
+executabledir="${serverfiles}/game/bin/linuxsteamrt64"
+executable="./cs2"
+servercfgdir="${systemdir}/cfg"
+servercfg="${selfname}.cfg"
+servercfgdefault="server.cfg"
+servercfgfullpath="${servercfgdir}/${servercfg}"
+
+## Backup Directory
+backupdir="${lgsmdir}/backup"
+
+## Logging Directories
+[ -n "${LGSM_LOGDIR}" ] && logdir="${LGSM_LOGDIR}" || logdir="${rootdir}/log"
+gamelogdir="${systemdir}/logs"
+lgsmlogdir="${logdir}/script"
+consolelogdir="${logdir}/console"
+lgsmlog="${lgsmlogdir}/${selfname}-script.log"
+consolelog="${consolelogdir}/${selfname}-console.log"
+alertlog="${lgsmlogdir}/${selfname}-alert.log"
+postdetailslog="${lgsmlogdir}/${selfname}-postdetails.log"
+
+## Logs Naming
+lgsmlogdate="${lgsmlogdir}/${selfname}-script-$(date '+%Y-%m-%d-%H:%M:%S').log"
+consolelogdate="${consolelogdir}/${selfname}-console-$(date '+%Y-%m-%d-%H:%M:%S').log"
+
+## Log Parameters
+logtimestamp="off"
+logtimestampformat="%Y-%m-%d %H:%M:%S"
diff --git a/lgsm/config-default/config-lgsm/inssserver/_default.cfg b/lgsm/config-default/config-lgsm/inssserver/_default.cfg
index 9c23bffa0..13addae47 100644
--- a/lgsm/config-default/config-lgsm/inssserver/_default.cfg
+++ b/lgsm/config-default/config-lgsm/inssserver/_default.cfg
@@ -168,9 +168,6 @@ glibc="2.17"
 systemdir="${serverfiles}/Insurgency"
 executabledir="${systemdir}/Binaries/Linux"
 executable="./InsurgencyServer-Linux-Shipping"
-servercfgdir="${systemdir}/Saved/Config/LinuxServer"
-servercfg="Game.ini"
-servercfgdefault="Game.ini"
 
 ## Backup Directory
 backupdir="${lgsmdir}/backup"
diff --git a/lgsm/config-default/config-lgsm/sbotsserver/_default.cfg b/lgsm/config-default/config-lgsm/sbotsserver/_default.cfg
index a5b1aa9a8..ef33b7f9a 100644
--- a/lgsm/config-default/config-lgsm/sbotsserver/_default.cfg
+++ b/lgsm/config-default/config-lgsm/sbotsserver/_default.cfg
@@ -157,11 +157,6 @@ glibc="2.17"
 systemdir="${serverfiles}"
 executabledir="${systemdir}/blank1/Binaries/Linux"
 executable="./blank1Server-Linux-Shipping"
-servercfgdir="${systemdir}/blank1/Saved/Config/LinuxServer"
-servercfg="Game.ini"
-servercfgdefault="Game.ini"
-servercfgfullpath="${servercfgdir}/${servercfg}"
-
 ## Backup Directory
 backupdir="${lgsmdir}/backup"
 
diff --git a/lgsm/data/almalinux-8.csv b/lgsm/data/almalinux-8.csv
index ac4b7c36f..4142c3c82 100644
--- a/lgsm/data/almalinux-8.csv
+++ b/lgsm/data/almalinux-8.csv
@@ -29,6 +29,7 @@ coduo,compat-libstdc++-33.i686
 codwaw
 col
 cs
+cs2
 cscz
 csgo
 css,ncurses-libs.i686
@@ -64,7 +65,6 @@ kf
 kf2
 l4d
 l4d2
-lo
 mc,java-17-openjdk
 mcb,libnsl
 mh
diff --git a/lgsm/data/almalinux-9.csv b/lgsm/data/almalinux-9.csv
index 124322b62..0e9ff15e2 100644
--- a/lgsm/data/almalinux-9.csv
+++ b/lgsm/data/almalinux-9.csv
@@ -29,6 +29,7 @@ coduo,compat-libstdc++-33.i686
 codwaw
 col
 cs
+cs2
 cscz
 csgo
 css,ncurses-libs.i686
@@ -64,7 +65,6 @@ kf
 kf2
 l4d
 l4d2
-lo
 mc,java-17-openjdk
 mcb,libnsl
 mh
diff --git a/lgsm/data/centos-7.csv b/lgsm/data/centos-7.csv
index 4c256491d..111bd9afa 100644
--- a/lgsm/data/centos-7.csv
+++ b/lgsm/data/centos-7.csv
@@ -29,6 +29,7 @@ coduo,compat-libstdc++-33.i686
 codwaw
 col
 cs
+cs2
 cscz
 csgo
 css,ncurses-libs.i686
@@ -64,7 +65,6 @@ kf
 kf2
 l4d
 l4d2
-lo
 mc,java-11-openjdk
 mcb,libnsl
 mh
diff --git a/lgsm/data/centos-8.csv b/lgsm/data/centos-8.csv
index ac4b7c36f..4142c3c82 100644
--- a/lgsm/data/centos-8.csv
+++ b/lgsm/data/centos-8.csv
@@ -29,6 +29,7 @@ coduo,compat-libstdc++-33.i686
 codwaw
 col
 cs
+cs2
 cscz
 csgo
 css,ncurses-libs.i686
@@ -64,7 +65,6 @@ kf
 kf2
 l4d
 l4d2
-lo
 mc,java-17-openjdk
 mcb,libnsl
 mh
diff --git a/lgsm/data/centos-9.csv b/lgsm/data/centos-9.csv
index 124322b62..0e9ff15e2 100644
--- a/lgsm/data/centos-9.csv
+++ b/lgsm/data/centos-9.csv
@@ -29,6 +29,7 @@ coduo,compat-libstdc++-33.i686
 codwaw
 col
 cs
+cs2
 cscz
 csgo
 css,ncurses-libs.i686
@@ -64,7 +65,6 @@ kf
 kf2
 l4d
 l4d2
-lo
 mc,java-17-openjdk
 mcb,libnsl
 mh
diff --git a/lgsm/data/debian-10.csv b/lgsm/data/debian-10.csv
index 4b1c94518..0e9d67d03 100644
--- a/lgsm/data/debian-10.csv
+++ b/lgsm/data/debian-10.csv
@@ -29,6 +29,7 @@ coduo,libstdc++5:i386
 codwaw
 col
 cs
+cs2
 cscz
 csgo
 css,libtinfo5:i386
@@ -64,7 +65,6 @@ kf
 kf2
 l4d
 l4d2
-lo
 mc,openjdk-11-jre
 mcb
 mh
diff --git a/lgsm/data/debian-11.csv b/lgsm/data/debian-11.csv
index 9ab997eaa..9a458349e 100644
--- a/lgsm/data/debian-11.csv
+++ b/lgsm/data/debian-11.csv
@@ -29,6 +29,7 @@ coduo,libstdc++5:i386
 codwaw
 col
 cs
+cs2
 cscz
 csgo
 css,libtinfo5:i386
@@ -64,7 +65,6 @@ kf
 kf2
 l4d
 l4d2
-lo
 mc,openjdk-17-jre
 mcb
 mh
diff --git a/lgsm/data/debian-12.csv b/lgsm/data/debian-12.csv
index ed35f9e41..d0e56cf46 100644
--- a/lgsm/data/debian-12.csv
+++ b/lgsm/data/debian-12.csv
@@ -29,6 +29,7 @@ coduo,libstdc++5:i386
 codwaw
 col
 cs
+cs2
 cscz
 csgo
 css,libtinfo5:i386
@@ -64,7 +65,6 @@ kf
 kf2
 l4d
 l4d2
-lo
 mc,openjdk-17-jre
 mcb
 mh
diff --git a/lgsm/data/debian-9.csv b/lgsm/data/debian-9.csv
index e3143955f..c8aceef1b 100644
--- a/lgsm/data/debian-9.csv
+++ b/lgsm/data/debian-9.csv
@@ -29,6 +29,7 @@ coduo,libstdc++5:i386
 codwaw
 col
 cs
+cs2
 cscz
 csgo
 css,libtinfo5:i386
@@ -64,7 +65,6 @@ kf
 kf2
 l4d
 l4d2
-lo
 mc,openjdk-8-jre
 mcb
 mh
diff --git a/lgsm/data/gameicons/cs2-icon.png b/lgsm/data/gameicons/cs2-icon.png
new file mode 100644
index 0000000000000000000000000000000000000000..3cda210bb4f7e6fc29c4af21e013648f359b5664
GIT binary patch
literal 2397
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
P00000NkvXXu0mjfr_4_L

literal 0
HcmV?d00001

diff --git a/lgsm/data/gameicons/lo-icon.png b/lgsm/data/gameicons/lo-icon.png
deleted file mode 100644
index 17aa10b3176c55b836423d2df7a426763b75483d..0000000000000000000000000000000000000000
GIT binary patch
literal 0
HcmV?d00001

literal 2747
zcmZ{mX*kpi8^-?)vTJ0`u}n2+WUN`o-pG)>F+|A8klnFQh!G)6WI4%}YO-cuvKE@b
zG?}yz6*Bg1vX5mr`uKi$ujjg-`?~J?`F($qtu0M>xx}~t0N^!6A#INx@<$w?<9#5y
z^8DCXJq;}k0if<7_kkPRpYj&U)&c<T$N)fWJOJz+N3rt&5UK<Ki#Gv4`!N8B1QxW}
z=o}X(|GsL11djg9)6UYY<AgI1bv+mW_`dzo33gQG%j1we#MHu=eU1yv&n4BOKUHvi
zR$+=XM5Fq2bA4)Eu%Ue;cNF#yT?TQ~9H`0PmQ=j8T#m3n8JA-@R<v7PjQGh?!s6Ax
z!sn9Ejm+3<B^rK+%cWR%?FZ%(;vThrjmF8ErrjXC==A9zSjKxCb*6KLxyoFg!woMc
zB1fvOH|Q~s8Wg1NzFzC%?g*Y_)mqO50K#vi4K!65`Qn~|*#O881$?CZ$g3C&-uN*3
zYl;0^c7~^((@^uTJPt!S>1@G%N-B>Lq#hd}0cHUJB~?)BNi_x}msh-@$^r92w?u7t
z#IR1UbANbsTVkd*|H_qtv){F-6dnqNVqh+rl#~?D3Z)kYBSQv(GXR8_CBfSMq)i-$
zbz+le%BOpD=dh+vCAh6n{twgl3Jkde1_zW+@E6l{!FX^i5;@Ki3!XY)HD5L{(^BLm
zYCa=FL{H%@o6KZu-h_rMGk$RI=MdxaUsf60DV2D-Ux9c~r~47-s34Ba6JSG#8QwPb
z<`siX2VscuN*W)`XoOXm*&Q+a>79>&2Xl(p9|rShg|mNKi;Wt5%YyLeLmD7^wAe2Y
z&==SspmSzt<KIR!i*u)CHfP6?*<0;1ALbY8hF?x}{CS!0GT9dHtJqKCr9vKqb@=f+
z%ewbup=i=DMLwGqmIMd_9Dx3%%XmG361Pql1Fd$!u9X$<Lkr?M7DvxpUyHFK?FsHC
z+}Fb*$EtjBt6iw{6C8j8<Q&;a1OzgWwn^HkJRKKnD3Vn^-BIS<|2@C?XvlAY9$j(R
z6mBk8Gm^NX-9Hhbx0#;!k>oZc%^{?u%3ly83qm5Zi}SgAp2FP0xj{PZxT*9vVeCbQ
z3cXKVn$p6AFm6Sh|IT3+926B`m>;WUmDQ*kW?6u<a(9=5?kEdKMcbLw&tfBwpz>e=
z_4FnzZiKjUBZp?wLU>(8+EUZ7G`A9>zR9r9o`2^?IJpJZd>xoLwtn%hR~UngXE5r>
z-`C6$*Buom)+F0EeoCnM*;@&vYsBx^J<H~vQ^?D6mA6mywiX_q3s&9uxkk!H)!$sj
z25V*!LtgOanhwlJf7f8{wvepEDb*dKZRN~|QiX>#`=H6>LMiJM1i6(kxPA5DEB@P7
zU6khSD5hd>sbsZ&&?(pb=5C1?40|*o^b2R)uLsXP5H+yPJG<}zwTFCz9$vNSyJ?Zr
zX;Qhi>cYZRgu_hwP*;s5@!8A4(WBjxgNcCqoar@tmm6rOY%dUWY^tjp>5S%%D5twq
zUk}kSZD!dJyFiJAa!09e9=3iHZHGU&lGR-rRY#*EeZJ2;m*vCk#E_z940W?6cMhfd
z>nl!+^%Zh(X?VdmB_nUIPj)px<96X2;fFa)0<jJyD=Yi~|L^<ap9IjUXeTz_q1z3?
zIqG5leeEl*2Mt}n$#)o}aw@%BVE@N@fV}T0=5UiZHGlT>O|hUjZ-~Z&9t*F@VUyCn
z4!=Ixlf`Y44|HM{98&5chyKpx>)B<q%Xz;21?j?rIjup=ikQYmes!85jG*_6;q;?u
zKK9#QcSrmhhlo;=+4zBixG%rFjolhrpQ>9Hqu17RPel!^jtdp(e2rnEw?6s}VDj~}
zojNWxb9)Mr+FZZ2$~k?`O?@<$v6?1%cbn1@Zk3~&9PHgEMN7Dfr9*X?SXkTzl8aV-
z)`p+Cqlr}j^nKdH@#^Y!5>NW*T#?vBjOXTi|IPEgTUXlb_CxZG0$;tx$%q@fvlxsz
zRX%;yVAGKCBoQ6D+^$y^_lu;ePwFA00X`u%q8!(*PhIqXeE8cXrW@nqckpnhT7O5N
z%v&$M=_B~skVML=0aU(^zMmyOF8<iJk=Ejh`20S|{v0m1T25npy=c}h-y)O75~IlN
z?2E2Mv-|M%J-@lIvObIWGL?UCim>>;r66LVJSyahoGi<gWZ<nlo0nR8cI3?TY-NnB
z{y&;`NBlK6b)*e1yOX)4)Jm)O!F)^WYqF)w-T~f&n95J;&NtM<S4{)D*koi=Zc*o4
zJ5`t8h=DxdImvIeWaT40DmVeQ5s&SrqZ^$!$#+*%jL%E?i@!1{g%m0bX+8FLZbm+T
ztH1v7h*&}2vp6HHU=<eg!6iIP=z85z-MF(955_eRbAKEbOCC1H0tQ#zWdJl~yl9d1
zQ*PzJo8C~|x9V8iY<sD<XW@g?eni?P3D30HC`b=QSPjpKOdO0V8Vtt`5}52q-O)!b
za0?jrNxNhHc^M<nnFKC=ALt_}M{j*7u6aLvNn|HMsugyXH=w<-q+<A`Yw2GTH5Z2>
zrV#a#c1)Y-nI>-6Hmbk#cwpLy{_gml3HuPyTA?(<Nk_d5#|NkfsB&vl7<36W?;*cP
zZkiqQEI#c1y{$W2e^LF3fXCN7D0%$o?8;vej6j@w4Db5}jVQ;7z0y$6I}Ea0$3Cr2
z%fHpWwOf$-P5wek$=a<YGkRys;1e^*5)^HEZbu<;D48}pe>iYqt4l4q_XA&Qky8cY
z`j@<mk_?3QZrtmc)p-s5OtF6s=DQi=odn%i6_N>An0P@RcePv_ledq77a9GQrWtr8
zR)QzLP+f7kt-#J+0;45zL<=i4;E2u7{V{Z&mSyrtF$x|zw^i3~-?fEWD$4i$d5Tln
z7e)`o`oan<GYa3y)B}xGC{}z1KU%LUHLy-T3Oz!|qwolC&g%v#$Ci<Ws`PPX!4oWt
zh3&Mp`I(q8?un!PPbHOp&UtMr)y>PCNdvfmLeJB-&jih21VI&!vmHAio<5l%=GN>2
z{>!!PfxbOz*KC}1I=d>J2^XL|2x3x1!Yz&%nLQ_O@LrM|FakeI49<b$XgY{;Ar^?4
zN7x`Il3oDuv&e84QMg@CEaMm&4C-ZdlsP^3^5<v$h1ItHV#dNW`DJ<FE3Y}$Bv&XH
zI1%YVrBr3_wQ66du|5URV{^NYc`dYcpUf=e)Us6EX3@O0lqjX{I#HRLS?i^#>aanK
z_t(C56~@n>6nh5Db`H2RH!7e4;n<$+95K3Y#_dJpdrjeOfGqlT9azNdPZXwvr%RLt
z_2_Qb@MJJ3O_;q}zB;*n8kHu_qEamDXn*EfYWcQ%a-oTl4;+-FcM@C{`khzHP6XcD
z3@6eia`X}X`mf*YO?zf5I)B-a9u!3sYuF|_`oN?C$TRSiNaLBOn|2nYwy{UI+yjSI
zBEQDh%hf|tqlK_mIuY9+H7?Z<W`c@R?>QGMxP!p`|D-4{mYOYr$dlsZDh*&Gvl9R^
z`<++OoH+$)BnOMXC2Vw{Z$|l%)+2uK`S_8O4l#BJad!*BYTpXN9vh&dq@oH}R)Q<5
xqm?zZm9(@~)h;S2X)7rqy_+}w2k;AU_wvB~e?U!x&*~TeOpPs()kZht{sWEfB<}zK

diff --git a/lgsm/data/rhel-7.csv b/lgsm/data/rhel-7.csv
index ac272c917..9125bd093 100644
--- a/lgsm/data/rhel-7.csv
+++ b/lgsm/data/rhel-7.csv
@@ -29,6 +29,7 @@ coduo,compat-libstdc++-33.i686
 codwaw
 col
 cs
+cs2
 cscz
 csgo
 css,ncurses-libs.i686
@@ -64,7 +65,6 @@ kf
 kf2
 l4d
 l4d2
-lo
 mc,java-11-openjdk
 mcb,libnsl
 mh
diff --git a/lgsm/data/rhel-8.csv b/lgsm/data/rhel-8.csv
index ac4b7c36f..4142c3c82 100644
--- a/lgsm/data/rhel-8.csv
+++ b/lgsm/data/rhel-8.csv
@@ -29,6 +29,7 @@ coduo,compat-libstdc++-33.i686
 codwaw
 col
 cs
+cs2
 cscz
 csgo
 css,ncurses-libs.i686
@@ -64,7 +65,6 @@ kf
 kf2
 l4d
 l4d2
-lo
 mc,java-17-openjdk
 mcb,libnsl
 mh
diff --git a/lgsm/data/rhel-9.csv b/lgsm/data/rhel-9.csv
index 124322b62..0e9ff15e2 100644
--- a/lgsm/data/rhel-9.csv
+++ b/lgsm/data/rhel-9.csv
@@ -29,6 +29,7 @@ coduo,compat-libstdc++-33.i686
 codwaw
 col
 cs
+cs2
 cscz
 csgo
 css,ncurses-libs.i686
@@ -64,7 +65,6 @@ kf
 kf2
 l4d
 l4d2
-lo
 mc,java-17-openjdk
 mcb,libnsl
 mh
diff --git a/lgsm/data/rocky-8.csv b/lgsm/data/rocky-8.csv
index ac4b7c36f..4142c3c82 100644
--- a/lgsm/data/rocky-8.csv
+++ b/lgsm/data/rocky-8.csv
@@ -29,6 +29,7 @@ coduo,compat-libstdc++-33.i686
 codwaw
 col
 cs
+cs2
 cscz
 csgo
 css,ncurses-libs.i686
@@ -64,7 +65,6 @@ kf
 kf2
 l4d
 l4d2
-lo
 mc,java-17-openjdk
 mcb,libnsl
 mh
diff --git a/lgsm/data/rocky-9.csv b/lgsm/data/rocky-9.csv
index 124322b62..0e9ff15e2 100644
--- a/lgsm/data/rocky-9.csv
+++ b/lgsm/data/rocky-9.csv
@@ -29,6 +29,7 @@ coduo,compat-libstdc++-33.i686
 codwaw
 col
 cs
+cs2
 cscz
 csgo
 css,ncurses-libs.i686
@@ -64,7 +65,6 @@ kf
 kf2
 l4d
 l4d2
-lo
 mc,java-17-openjdk
 mcb,libnsl
 mh
diff --git a/lgsm/data/serverlist.csv b/lgsm/data/serverlist.csv
index 43b9dc426..094731373 100644
--- a/lgsm/data/serverlist.csv
+++ b/lgsm/data/serverlist.csv
@@ -28,6 +28,7 @@ coduo,coduoserver,Call of Duty: United Offensive,ubuntu-22.04
 codwaw,codwawserver,Call of Duty: World at War,ubuntu-22.04
 col,colserver,Colony Survival,ubuntu-22.04
 cs,csserver,Counter-Strike 1.6,ubuntu-22.04
+cs2,cs2server,Counter-Strike 2,ubuntu-22.04
 cscz,csczserver,Counter-Strike: Condition Zero,ubuntu-22.04
 csgo,csgoserver,Counter-Strike: Global Offensive,ubuntu-22.04
 css,cssserver,Counter-Strike: Source,ubuntu-22.04
diff --git a/lgsm/data/ubuntu-16.04.csv b/lgsm/data/ubuntu-16.04.csv
index fd1cd8460..37fc3114b 100644
--- a/lgsm/data/ubuntu-16.04.csv
+++ b/lgsm/data/ubuntu-16.04.csv
@@ -29,6 +29,7 @@ coduo,libstdc++5:i386
 codwaw
 col
 cs
+cs2
 cscz
 csgo
 css,libtinfo5:i386
@@ -64,7 +65,6 @@ kf
 kf2
 l4d
 l4d2
-lo
 mc,openjdk-8-jre
 mcb
 mh
diff --git a/lgsm/data/ubuntu-18.04.csv b/lgsm/data/ubuntu-18.04.csv
index 4b1c94518..0e9d67d03 100644
--- a/lgsm/data/ubuntu-18.04.csv
+++ b/lgsm/data/ubuntu-18.04.csv
@@ -29,6 +29,7 @@ coduo,libstdc++5:i386
 codwaw
 col
 cs
+cs2
 cscz
 csgo
 css,libtinfo5:i386
@@ -64,7 +65,6 @@ kf
 kf2
 l4d
 l4d2
-lo
 mc,openjdk-11-jre
 mcb
 mh
diff --git a/lgsm/data/ubuntu-20.04.csv b/lgsm/data/ubuntu-20.04.csv
index f50fb4c83..35d284786 100644
--- a/lgsm/data/ubuntu-20.04.csv
+++ b/lgsm/data/ubuntu-20.04.csv
@@ -29,6 +29,7 @@ coduo,libstdc++5:i386
 codwaw
 col
 cs
+cs2
 cscz
 csgo
 css,libtinfo5:i386
@@ -64,7 +65,6 @@ kf
 kf2
 l4d
 l4d2
-lo
 mc,openjdk-17-jre
 mcb
 mh
diff --git a/lgsm/data/ubuntu-22.04.csv b/lgsm/data/ubuntu-22.04.csv
index 8526a176b..1f57e9613 100644
--- a/lgsm/data/ubuntu-22.04.csv
+++ b/lgsm/data/ubuntu-22.04.csv
@@ -29,6 +29,7 @@ coduo,libstdc++5:i386
 codwaw
 col
 cs
+cs2
 cscz
 csgo
 css,libtinfo5:i386
@@ -64,7 +65,6 @@ kf
 kf2
 l4d
 l4d2
-lo
 mc,openjdk-17-jre
 mcb
 mh
diff --git a/lgsm/data/ubuntu-23.04.csv b/lgsm/data/ubuntu-23.04.csv
index 1b59e7431..dbfe82f9e 100644
--- a/lgsm/data/ubuntu-23.04.csv
+++ b/lgsm/data/ubuntu-23.04.csv
@@ -29,6 +29,7 @@ coduo,libstdc++5:i386
 codwaw
 col
 cs
+cs2
 cscz
 csgo
 css,libtinfo5:i386
@@ -64,7 +65,6 @@ kf
 kf2
 l4d
 l4d2
-lo
 mc,openjdk-17-jre
 mcb
 mh
diff --git a/lgsm/data/ubuntu-23.10.csv b/lgsm/data/ubuntu-23.10.csv
index 1b59e7431..dbfe82f9e 100644
--- a/lgsm/data/ubuntu-23.10.csv
+++ b/lgsm/data/ubuntu-23.10.csv
@@ -29,6 +29,7 @@ coduo,libstdc++5:i386
 codwaw
 col
 cs
+cs2
 cscz
 csgo
 css,libtinfo5:i386
@@ -64,7 +65,6 @@ kf
 kf2
 l4d
 l4d2
-lo
 mc,openjdk-17-jre
 mcb
 mh
diff --git a/lgsm/modules/alert.sh b/lgsm/modules/alert.sh
index 74822e94c..4a34207e9 100644
--- a/lgsm/modules/alert.sh
+++ b/lgsm/modules/alert.sh
@@ -18,11 +18,11 @@ fn_alert_log() {
 	fi
 
 	{
-		fn_info_message_head
-		fn_info_message_distro
-		fn_info_message_server_resource
-		fn_info_message_gameserver_resource
-		fn_info_message_gameserver
+		fn_info_messages_head
+		fn_info_messages_distro
+		fn_info_messages_server_resource
+		fn_info_messages_gameserver_resource
+		fn_info_messages_gameserver
 		fn_info_logs
 	} | sed -r "s/\x1B\[([0-9]{1,2}(;[0-9]{1,2})?)?[m|K]//g" | tee -a "${alertlog}" > /dev/null 2>&1
 }
diff --git a/lgsm/modules/check_system_dir.sh b/lgsm/modules/check_system_dir.sh
index 01c643748..2f57511fb 100644
--- a/lgsm/modules/check_system_dir.sh
+++ b/lgsm/modules/check_system_dir.sh
@@ -15,7 +15,7 @@ if [ ! -d "${serverfiles}" ]; then
 	core_exit.sh
 fi
 
-if [ ! -d "${systemdir}" ]; then
+if [ ! -d "${systemdir}" ] && [ -z "${CI}" ]; then
 	fn_print_fail_nl "Cannot access ${systemdir}: No such directory"
 	if [ -d "${lgsmlogdir}" ]; then
 		fn_script_log_fail "Cannot access ${systemdir}: No such directory."
diff --git a/lgsm/modules/command_details.sh b/lgsm/modules/command_details.sh
index d180b3b18..ad55b1241 100644
--- a/lgsm/modules/command_details.sh
+++ b/lgsm/modules/command_details.sh
@@ -23,20 +23,20 @@ if [ "${querymode}" == "2" ] || [ "${querymode}" == "3" ]; then
 		fi
 	done
 fi
-fn_info_message_distro
-fn_info_message_server_resource
-fn_info_message_gameserver_resource
-fn_info_message_gameserver
-fn_info_message_script
-fn_info_message_backup
+fn_info_messages_distro
+fn_info_messages_server_resource
+fn_info_messages_gameserver_resource
+fn_info_messages_gameserver
+fn_info_messages_script
+fn_info_messages_backup
 # Some game servers do not have parms.
 if [ "${shortname}" != "jc2" ] && [ "${shortname}" != "dst" ] && [ "${shortname}" != "pz" ] && [ "${engine}" != "renderware" ]; then
-	fn_info_message_commandlineparms
+	fn_info_messages_commandlineparms
 fi
-fn_info_message_ports_edit
-fn_info_message_ports
-fn_info_message_select_engine
-fn_info_message_statusbottom
+fn_info_messages_ports_edit
+fn_info_messages_ports
+fn_info_messages_select_engine
+fn_info_messages_statusbottom
 
 exitcode=0
 core_exit.sh
diff --git a/lgsm/modules/command_dev_query_raw.sh b/lgsm/modules/command_dev_query_raw.sh
index cf9e14858..50c07fd7b 100644
--- a/lgsm/modules/command_dev_query_raw.sh
+++ b/lgsm/modules/command_dev_query_raw.sh
@@ -185,7 +185,7 @@ fn_messages_separator
 echo -e ""
 echo -e "${lightgreen}SS Output${default}"
 fn_messages_separator
-fn_info_message_ports
+fn_info_messages_ports
 eval "${portcommand}"
 echo -e ""
 echo -e "${lightgreen}Query Port - Raw Output${default}"
diff --git a/lgsm/modules/command_postdetails.sh b/lgsm/modules/command_postdetails.sh
index 736c9ec27..3bfed78ed 100644
--- a/lgsm/modules/command_postdetails.sh
+++ b/lgsm/modules/command_postdetails.sh
@@ -42,20 +42,20 @@ else
 	done
 	touch "${postdetailslog}" || fn_bad_postdetailslog
 	{
-		fn_info_message_distro
-		fn_info_message_server_resource
-		fn_info_message_gameserver_resource
-		fn_info_message_gameserver
-		fn_info_message_script
-		fn_info_message_backup
+		fn_info_messages_distro
+		fn_info_messages_server_resource
+		fn_info_messages_gameserver_resource
+		fn_info_messages_gameserver
+		fn_info_messages_script
+		fn_info_messages_backup
 		# Some game servers do not have parms.
 		if [ "${shortname}" != "jc2" ] && [ "${shortname}" != "jc3" ] && [ "${shortname}" != "dst" ] && [ "${shortname}" != "pz" ] && [ "${engine}" != "renderware" ]; then
-			fn_info_message_commandlineparms
+			fn_info_messages_commandlineparms
 		fi
-		fn_info_message_ports_edit
-		fn_info_message_ports
-		fn_info_message_select_engine
-		fn_info_message_statusbottom
+		fn_info_messages_ports_edit
+		fn_info_messages_ports
+		fn_info_messages_select_engine
+		fn_info_messages_statusbottom
 	} | sed -r "s/\x1B\[([0-9]{1,2}(;[0-9]{1,2})?)?[m|K]//g" | tee -a "${postdetailslog}" > /dev/null 2>&1
 fi
 
diff --git a/lgsm/modules/command_stop.sh b/lgsm/modules/command_stop.sh
index 3e503a4f5..3d534317a 100644
--- a/lgsm/modules/command_stop.sh
+++ b/lgsm/modules/command_stop.sh
@@ -14,7 +14,7 @@ fn_firstcommand_set
 fn_stop_graceful_ctrlc() {
 	fn_print_dots "Graceful: CTRL+c"
 	fn_script_log_info "Graceful: CTRL+c"
-	# Sends quit.
+	# Sends CTRL+c.
 	tmux -L "${socketname}" send-keys -t "${sessionname}" C-c > /dev/null 2>&1
 	# Waits up to 30 seconds giving the server time to shutdown gracefuly.
 	for seconds in {1..30}; do
diff --git a/lgsm/modules/fix.sh b/lgsm/modules/fix.sh
index 9a4f5b779..2f8b5442a 100644
--- a/lgsm/modules/fix.sh
+++ b/lgsm/modules/fix.sh
@@ -53,12 +53,12 @@ fn_apply_fix() {
 }
 
 apply_pre_start_fix=(arma3 armar ark av bt bo csgo cmw dst hw ins nmrih onset pvr rust rw sdtd sfc sof2 squad st tf2 terraria ts3 mcb mta unt vh wurm zmr)
-apply_post_install_fix=(av kf kf2 lo ro samp ut2k4 ut ut3)
+apply_post_install_fix=(av kf kf2 ro samp ut2k4 ut ut3)
 
 # validate registered fixes for safe development
 for fix in "${apply_pre_start_fix[@]}" "${apply_post_install_fix[@]}"; do
 	if ! fn_exists_fix "${fix}"; then
-		fn_print_fail_nl "fix_${fix}.sh is registered but doesn't exist. Typo or did you miss to modify core_functions.sh?"
+		fn_print_fail_nl "fix_${fix}.sh is registered but doesn't exist. Typo or did you miss to modify core_modules.sh?"
 		exitcode=1
 		core_exit.sh
 	fi
diff --git a/lgsm/modules/info_game.sh b/lgsm/modules/info_game.sh
index c31a4171f..fd4598166 100644
--- a/lgsm/modules/info_game.sh
+++ b/lgsm/modules/info_game.sh
@@ -1132,6 +1132,26 @@ fn_info_game_col() {
 	steamport="${steamport:-"0"}"
 }
 
+# Config Type: Valve KeyValues
+# Comment: //
+# Example: hostname "SERVERNAME"
+# Filetype: cfg
+fn_info_game_cs2() {
+	if [ -f "${servercfgfullpath}" ]; then
+		fn_info_game_valve_keyvalues "servername" "hostname"
+	fi
+	# Steamport can be between 26901-26910 and is normally automatically set.
+	# Some servers might support -steamport parameter to set
+	if [ "${steamport}" == "0" ] || [ -v "${steamport}" ]; then
+		steamport="$(echo "${ssinfo}" | grep "${srcdslinuxpid}" | awk '{print $5}' | grep ":269" | cut -d ":" -f2)"
+	fi
+	defaultmap="${defaultmap:-"NOT SET"}"
+	maxplayers="${maxplayers:-"0"}"
+	port="${port:-"0"}"
+	queryport="${port:-"0"}"
+	servername="${servername:-"NOT SET"}"
+}
+
 # Config Type: ini
 # Parameters: true
 # Comment: ; or #
@@ -2252,6 +2272,8 @@ elif [ "${shortname}" == "codwaw" ]; then
 	fn_info_game_codwaw
 elif [ "${shortname}" == "col" ]; then
 	fn_info_game_col
+elif [ "${shortname}" == "cs2" ]; then
+	fn_info_game_cs2
 elif [ "${shortname}" == "ct" ]; then
 	fn_info_game_ct
 elif [ "${shortname}" == "dayz" ]; then
diff --git a/lgsm/modules/info_messages.sh b/lgsm/modules/info_messages.sh
index 4bd6a3c66..0e57690bf 100644
--- a/lgsm/modules/info_messages.sh
+++ b/lgsm/modules/info_messages.sh
@@ -8,7 +8,7 @@
 moduleselfname="$(basename "$(readlink -f "${BASH_SOURCE[0]}")")"
 
 # Removes the passwords form all but details.
-fn_info_message_password_strip() {
+fn_info_messages_password_strip() {
 	if [ "${commandname}" != "DETAILS" ]; then
 		if [ "${serverpassword}" ]; then
 			serverpassword="********"
@@ -46,7 +46,7 @@ fn_info_message_password_strip() {
 
 # Alert Summary
 # used with alertlog
-fn_info_message_head() {
+fn_info_messages_head() {
 	echo -e ""
 	echo -e "LinuxGSM Alert Summary"
 	fn_messages_separator
@@ -70,7 +70,7 @@ fn_info_message_head() {
 	echo -e "$(date)"
 }
 
-fn_info_message_distro() {
+fn_info_messages_distro() {
 	#
 	# Distro Details
 	# =================================
@@ -103,7 +103,7 @@ fn_info_message_distro() {
 	} | column -s $'\t' -t
 }
 
-fn_info_message_server_resource() {
+fn_info_messages_server_resource() {
 	#
 	# Server Resource
 	# =================================
@@ -169,7 +169,7 @@ fn_info_message_server_resource() {
 	} | column -s $'\t' -t
 }
 
-fn_info_message_gameserver_resource() {
+fn_info_messages_gameserver_resource() {
 	#
 	# Game Server Resource Usage
 	# =================================
@@ -212,7 +212,7 @@ fn_info_message_gameserver_resource() {
 	} | column -s $'\t' -t
 }
 
-fn_info_message_gameserver() {
+fn_info_messages_gameserver() {
 	#
 	# Counter-Strike: Global Offensive Server Details
 	# =================================
@@ -232,7 +232,7 @@ fn_info_message_gameserver() {
 
 	echo -e ""
 	echo -e "${bold}${lightgreen}${gamename} Server Details${default}"
-	fn_info_message_password_strip
+	fn_info_messages_password_strip
 	fn_messages_separator
 	{
 		# Server name
@@ -502,7 +502,7 @@ fn_info_message_gameserver() {
 	echo -e ""
 }
 
-fn_info_message_script() {
+fn_info_messages_script() {
 	# csgoserver Script Details
 	# =================================
 	# Script name:            csgoserver
@@ -601,7 +601,7 @@ fn_info_message_script() {
 	} | column -s $'\t' -t
 }
 
-fn_info_message_backup() {
+fn_info_messages_backup() {
 	#
 	# Backups
 	# =================================
@@ -633,7 +633,7 @@ fn_info_message_backup() {
 	fi
 }
 
-fn_info_message_commandlineparms() {
+fn_info_messages_commandlineparms() {
 	#
 	# Command-line Parameters
 	# =================================
@@ -641,7 +641,7 @@ fn_info_message_commandlineparms() {
 
 	echo -e ""
 	echo -e "${bold}${lightgreen}Command-line Parameters${default}"
-	fn_info_message_password_strip
+	fn_info_messages_password_strip
 	fn_messages_separator
 	if [ "${serverpassword}" == "NOT SET" ]; then
 		unset serverpassword
@@ -650,7 +650,7 @@ fn_info_message_commandlineparms() {
 	echo -e "${preexecutable} ${executable} ${startparameters}"
 }
 
-fn_info_message_ports_edit() {
+fn_info_messages_ports_edit() {
 	#
 	# Ports
 	# =================================
@@ -674,7 +674,7 @@ fn_info_message_ports_edit() {
 		fi
 	done
 	# engines/games that require editing the start parameters.
-	local ports_edit_array=("av" "ck" "col" "fctr" "goldsrc" "hcu" "hw" "iw3.0" "ioquake3" "qfusion" "rust" "scpsl" "scpslsm" "sol" "spark" "source" "unreal4" "arma3" "dayz" "unt" "vh")
+	local ports_edit_array=("av" "ck" "col" "cs2" "fctr" "goldsrc" "hcu" "hw" "iw3.0" "ioquake3" "qfusion" "rust" "scpsl" "scpslsm" "sol" "spark" "source" "unreal4" "arma3" "dayz" "unt" "vh")
 	for port_edit in "${ports_edit_array[@]}"; do
 		if [ "${engine}" == "${port_edit}" ] || [ "${gamename}" == "${port_edit}" ] || [ "${shortname}" == "${port_edit}" ]; then
 			startparameterslocation="${configdirserver}"
@@ -684,7 +684,7 @@ fn_info_message_ports_edit() {
 	echo -e ""
 }
 
-fn_info_message_ports() {
+fn_info_messages_ports() {
 	echo -e "${lightblue}Useful port diagnostic command:${default}"
 	if [ "${shortname}" == "armar" ]; then
 		portcommand="ss -tuplwn | grep enfMain"
@@ -708,7 +708,7 @@ fn_info_message_ports() {
 	echo -e ""
 }
 
-fn_info_message_statusbottom() {
+fn_info_messages_statusbottom() {
 	echo -e ""
 	if [ "${status}" == "0" ]; then
 		echo -e "${lightblue}Status:\t${red}STOPPED${default}"
@@ -783,7 +783,7 @@ fn_port() {
 	fi
 }
 
-fn_info_message_ac() {
+fn_info_messages_ac() {
 	{
 		fn_port "header"
 		fn_port "Game" port udp
@@ -793,7 +793,7 @@ fn_info_message_ac() {
 	} | column -s $'\t' -t
 }
 
-fn_info_message_ark() {
+fn_info_messages_ark() {
 	{
 		fn_port "header"
 		fn_port "Game" port udp
@@ -803,7 +803,7 @@ fn_info_message_ark() {
 	} | column -s $'\t' -t
 }
 
-fn_info_message_arma3() {
+fn_info_messages_arma3() {
 	{
 		fn_port "header"
 		fn_port "Game" port udp
@@ -815,7 +815,7 @@ fn_info_message_arma3() {
 	} | column -s $'\t' -t
 }
 
-fn_info_message_armar() {
+fn_info_messages_armar() {
 	{
 		fn_port "header"
 		fn_port "Game" port udp
@@ -824,7 +824,7 @@ fn_info_message_armar() {
 	} | column -s $'\t' -t
 }
 
-fn_info_message_av() {
+fn_info_messages_av() {
 	{
 		fn_port "header"
 		fn_port "Game" port udp
@@ -835,7 +835,7 @@ fn_info_message_av() {
 	} | column -s $'\t' -t
 }
 
-fn_info_message_bf1942() {
+fn_info_messages_bf1942() {
 	{
 		fn_port "header"
 		fn_port "Game" port udp
@@ -843,7 +843,7 @@ fn_info_message_bf1942() {
 	} | column -s $'\t' -t
 }
 
-fn_info_message_bfv() {
+fn_info_messages_bfv() {
 	{
 		fn_port "header"
 		fn_port "Game" port udp
@@ -851,7 +851,7 @@ fn_info_message_bfv() {
 	} | column -s $'\t' -t
 }
 
-fn_info_message_bo() {
+fn_info_messages_bo() {
 	{
 		fn_port "header"
 		fn_port "Game" port udp
@@ -859,7 +859,7 @@ fn_info_message_bo() {
 	} | column -s $'\t' -t
 }
 
-fn_info_message_bt() {
+fn_info_messages_bt() {
 	{
 		fn_port "header"
 		fn_port "Game" port udp
@@ -867,7 +867,7 @@ fn_info_message_bt() {
 	} | column -s $'\t' -t
 }
 
-fn_info_message_btl() {
+fn_info_messages_btl() {
 	{
 		fn_port "header"
 		fn_port "Game" port udp
@@ -893,8 +893,8 @@ fn_info_messages_ck() {
 	} | column -s $'\t' -t
 }
 
-fn_info_message_cmw() {
-	fn_info_message_password_strip
+fn_info_messages_cmw() {
+	fn_info_messages_password_strip
 	{
 		fn_port "header"
 		fn_port "Game" port udp
@@ -903,7 +903,7 @@ fn_info_message_cmw() {
 	} | column -s $'\t' -t
 }
 
-fn_info_message_cod() {
+fn_info_messages_cod() {
 	{
 		fn_port "header"
 		fn_port "Game" port udp
@@ -911,7 +911,7 @@ fn_info_message_cod() {
 	} | column -s $'\t' -t
 }
 
-fn_info_message_coduo() {
+fn_info_messages_coduo() {
 	{
 		fn_port "header"
 		fn_port "Game" port udp
@@ -919,7 +919,7 @@ fn_info_message_coduo() {
 	} | column -s $'\t' -t
 }
 
-fn_info_message_cod2() {
+fn_info_messages_cod2() {
 	{
 		fn_port "header"
 		fn_port "Game" port udp
@@ -927,7 +927,7 @@ fn_info_message_cod2() {
 	} | column -s $'\t' -t
 }
 
-fn_info_message_cod4() {
+fn_info_messages_cod4() {
 	{
 		fn_port "header"
 		fn_port "Game" port udp
@@ -935,7 +935,7 @@ fn_info_message_cod4() {
 	} | column -s $'\t' -t
 }
 
-fn_info_message_codwaw() {
+fn_info_messages_codwaw() {
 	{
 		fn_port "header"
 		fn_port "Game" port udp
@@ -943,7 +943,7 @@ fn_info_message_codwaw() {
 	} | column -s $'\t' -t
 }
 
-fn_info_message_col() {
+fn_info_messages_col() {
 	{
 		fn_port "header"
 		fn_port "Game" port udp
@@ -952,7 +952,15 @@ fn_info_message_col() {
 	} | column -s $'\t' -t
 }
 
-fn_info_message_csgo() {
+fn_info_messages_cs2() {
+	{
+		fn_port "header"
+		fn_port "Game" port udp
+		fn_port "Query" queryport tcp
+	} | column -s $'\t' -t
+}
+
+fn_info_messages_csgo() {
 	{
 		fn_port "header"
 		fn_port "Game" port udp
@@ -963,15 +971,15 @@ fn_info_message_csgo() {
 	} | column -s $'\t' -t
 }
 
-fn_info_message_ct() {
-	fn_info_message_password_strip
+fn_info_messages_ct() {
+	fn_info_messages_password_strip
 	{
 		fn_port "header"
 		fn_port "Game" port udp
 	} | column -s $'\t' -t
 }
 
-fn_info_message_dayz() {
+fn_info_messages_dayz() {
 	{
 		fn_port "header"
 		fn_port "Game" port udp
@@ -981,7 +989,7 @@ fn_info_message_dayz() {
 	} | column -s $'\t' -t
 }
 
-fn_info_message_dodr() {
+fn_info_messages_dodr() {
 	{
 		fn_port "header"
 		fn_port "Game" port udp
@@ -989,7 +997,7 @@ fn_info_message_dodr() {
 	} | column -s $'\t' -t
 }
 
-fn_info_message_dst() {
+fn_info_messages_dst() {
 	{
 		fn_port "header"
 		fn_port "Game: Server" port udp
@@ -999,7 +1007,7 @@ fn_info_message_dst() {
 	} | column -s $'\t' -t
 }
 
-fn_info_message_eco() {
+fn_info_messages_eco() {
 	{
 		fn_port "header"
 		fn_port "Game" port udp
@@ -1007,7 +1015,7 @@ fn_info_message_eco() {
 	} | column -s $'\t' -t
 }
 
-fn_info_message_etl() {
+fn_info_messages_etl() {
 	{
 		fn_port "header"
 		fn_port "Game" port udp
@@ -1015,7 +1023,7 @@ fn_info_message_etl() {
 	} | column -s $'\t' -t
 }
 
-fn_info_message_fctr() {
+fn_info_messages_fctr() {
 	{
 		fn_port "header"
 		fn_port "Game" port udp
@@ -1023,7 +1031,7 @@ fn_info_message_fctr() {
 	} | column -s $'\t' -t
 }
 
-fn_info_message_goldsrc() {
+fn_info_messages_goldsrc() {
 	{
 		fn_port "header"
 		fn_port "Game" port udp
@@ -1032,7 +1040,7 @@ fn_info_message_goldsrc() {
 	} | column -s $'\t' -t
 }
 
-fn_info_message_hcu() {
+fn_info_messages_hcu() {
 	{
 		fn_port "header"
 		fn_port "Game" port udp
@@ -1040,7 +1048,7 @@ fn_info_message_hcu() {
 	} | column -s $'\t' -t
 }
 
-fn_info_message_hw() {
+fn_info_messages_hw() {
 	{
 		fn_port "header"
 		fn_port "Game" port udp
@@ -1048,7 +1056,7 @@ fn_info_message_hw() {
 	} | column -s $'\t' -t
 }
 
-fn_info_message_ins() {
+fn_info_messages_ins() {
 	{
 		fn_port "header"
 		fn_port "Game" port udp
@@ -1059,7 +1067,7 @@ fn_info_message_ins() {
 	} | column -s $'\t' -t
 }
 
-fn_info_message_inss() {
+fn_info_messages_inss() {
 	{
 		fn_port "header"
 		fn_port "Game" port udp
@@ -1068,7 +1076,7 @@ fn_info_message_inss() {
 	} | column -s $'\t' -t
 }
 
-fn_info_message_jc2() {
+fn_info_messages_jc2() {
 	{
 		fn_port "header"
 		fn_port "Game" port udp
@@ -1076,7 +1084,7 @@ fn_info_message_jc2() {
 	} | column -s $'\t' -t
 }
 
-fn_info_message_jc3() {
+fn_info_messages_jc3() {
 	{
 		fn_port "header"
 		fn_port "Game" port udp
@@ -1086,14 +1094,14 @@ fn_info_message_jc3() {
 	} | column -s $'\t' -t
 }
 
-fn_info_message_jk2() {
+fn_info_messages_jk2() {
 	{
 		fn_port "header"
 		fn_port "Game" port udp
 	} | column -s $'\t' -t
 }
 
-fn_info_message_kf() {
+fn_info_messages_kf() {
 	{
 		fn_port "header"
 		fn_port "Game" port udp
@@ -1115,8 +1123,8 @@ fn_info_message_kf() {
 	} | column -s $'\t' -t
 }
 
-fn_info_message_kf2() {
-	fn_info_message_password_strip
+fn_info_messages_kf2() {
+	fn_info_messages_password_strip
 	{
 		fn_port "header"
 		fn_port "Game" port udp
@@ -1134,7 +1142,7 @@ fn_info_message_kf2() {
 	} | column -s $'\t' -t
 }
 
-fn_info_message_mc() {
+fn_info_messages_mc() {
 	{
 		fn_port "header"
 		fn_port "Game" port tcp
@@ -1143,7 +1151,7 @@ fn_info_message_mc() {
 	} | column -s $'\t' -t
 }
 
-fn_info_message_mcb() {
+fn_info_messages_mcb() {
 	{
 		fn_port "header"
 		fn_port "Game" port udp
@@ -1151,7 +1159,7 @@ fn_info_message_mcb() {
 	} | column -s $'\t' -t
 }
 
-fn_info_message_mh() {
+fn_info_messages_mh() {
 	{
 		fn_port "header"
 		fn_port "Game" port udp
@@ -1160,14 +1168,14 @@ fn_info_message_mh() {
 	} | column -s $'\t' -t
 }
 
-fn_info_message_mohaa() {
+fn_info_messages_mohaa() {
 	{
 		fn_port "header"
 		fn_port "Game" port udp
 	} | column -s $'\t' -t
 }
 
-fn_info_message_mom() {
+fn_info_messages_mom() {
 	{
 		fn_port "header"
 		fn_port "Game" port udp
@@ -1175,7 +1183,7 @@ fn_info_message_mom() {
 	} | column -s $'\t' -t
 }
 
-fn_info_message_mta() {
+fn_info_messages_mta() {
 	{
 		fn_port "header"
 		fn_port "Game" port udp
@@ -1186,14 +1194,14 @@ fn_info_message_mta() {
 	} | column -s $'\t' -t
 }
 
-fn_info_message_nec() {
+fn_info_messages_nec() {
 	{
 		fn_port "header"
 		fn_port "Game" port udp
 	} | column -s $'\t' -t
 }
 
-fn_info_message_ohd() {
+fn_info_messages_ohd() {
 	{
 		fn_port "header"
 		fn_port "Game" port udp
@@ -1202,7 +1210,7 @@ fn_info_message_ohd() {
 	} | column -s $'\t' -t
 }
 
-fn_info_message_onset() {
+fn_info_messages_onset() {
 	{
 		fn_port "header"
 		fn_port "Game" port udp
@@ -1211,7 +1219,7 @@ fn_info_message_onset() {
 	} | column -s $'\t' -t
 }
 
-fn_info_message_pc() {
+fn_info_messages_pc() {
 	{
 		fn_port "header"
 		fn_port "Game" port udp
@@ -1229,7 +1237,7 @@ fn_info_message_pc() {
 	} | column -s $'\t' -t
 }
 
-fn_info_message_pc2() {
+fn_info_messages_pc2() {
 	{
 		fn_port "header"
 		fn_port "Game" port udp
@@ -1238,7 +1246,7 @@ fn_info_message_pc2() {
 	} | column -s $'\t' -t
 }
 
-fn_info_message_ps() {
+fn_info_messages_ps() {
 	{
 		fn_port "header"
 		fn_port "Game" port udp
@@ -1247,7 +1255,7 @@ fn_info_message_ps() {
 	} | column -s $'\t' -t
 }
 
-fn_info_message_pvr() {
+fn_info_messages_pvr() {
 	{
 		fn_port "header"
 		fn_port "Game" port udp
@@ -1257,7 +1265,7 @@ fn_info_message_pvr() {
 	} | column -s $'\t' -t
 }
 
-fn_info_message_pz() {
+fn_info_messages_pz() {
 	{
 		fn_port "header"
 		fn_port "Game" port udp
@@ -1265,28 +1273,28 @@ fn_info_message_pz() {
 	} | column -s $'\t' -t
 }
 
-fn_info_message_qw() {
+fn_info_messages_qw() {
 	{
 		fn_port "header"
 		fn_port "Game" port udp
 	} | column -s $'\t' -t
 }
 
-fn_info_message_q2() {
+fn_info_messages_q2() {
 	{
 		fn_port "header"
 		fn_port "Game" port udp
 	} | column -s $'\t' -t
 }
 
-fn_info_message_q3() {
+fn_info_messages_q3() {
 	{
 		fn_port "header"
 		fn_port "Game" port udp
 	} | column -s $'\t' -t
 }
 
-fn_info_message_ql() {
+fn_info_messages_ql() {
 	{
 		fn_port "header"
 		fn_port "Game" port udp
@@ -1296,7 +1304,7 @@ fn_info_message_ql() {
 	} | column -s $'\t' -t
 }
 
-fn_info_message_ro() {
+fn_info_messages_ro() {
 	{
 		fn_port "header"
 		fn_port "Game" port udp
@@ -1317,14 +1325,14 @@ fn_info_message_ro() {
 	} | column -s $'\t' -t
 }
 
-fn_info_message_rtcw() {
+fn_info_messages_rtcw() {
 	{
 		fn_port "header"
 		fn_port "Game" port udp
 	} | column -s $'\t' -t
 }
 
-fn_info_message_rust() {
+fn_info_messages_rust() {
 	{
 		fn_port "header"
 		fn_port "Game" port udp
@@ -1334,7 +1342,7 @@ fn_info_message_rust() {
 	} | column -s $'\t' -t
 }
 
-fn_info_message_rw() {
+fn_info_messages_rw() {
 	{
 		fn_port "header"
 		fn_port "Game" port udp
@@ -1343,7 +1351,7 @@ fn_info_message_rw() {
 	} | column -s $'\t' -t
 }
 
-fn_info_message_samp() {
+fn_info_messages_samp() {
 	{
 		fn_port "header"
 		fn_port "Game" port udp
@@ -1351,7 +1359,7 @@ fn_info_message_samp() {
 	} | column -s $'\t' -t
 }
 
-fn_info_message_sb() {
+fn_info_messages_sb() {
 	{
 		fn_port "header"
 		fn_port "Game" port udp
@@ -1360,7 +1368,7 @@ fn_info_message_sb() {
 	} | column -s $'\t' -t
 }
 
-fn_info_message_sbots() {
+fn_info_messages_sbots() {
 	{
 		fn_port "header"
 		fn_port "Game" port udp
@@ -1368,15 +1376,15 @@ fn_info_message_sbots() {
 	} | column -s $'\t' -t
 }
 
-fn_info_message_scpsl() {
+fn_info_messages_scpsl() {
 	{
 		fn_port "header"
 		fn_port "Game" port tcp
 	} | column -s $'\t' -t
 }
 
-fn_info_message_sdtd() {
-	fn_info_message_password_strip
+fn_info_messages_sdtd() {
+	fn_info_messages_password_strip
 	{
 		fn_port "header"
 		fn_port "Game" port udp
@@ -1403,7 +1411,7 @@ fn_info_message_sdtd() {
 	} | column -s $'\t' -t
 }
 
-fn_info_message_sf() {
+fn_info_messages_sf() {
 	{
 		fn_port "header"
 		fn_port "Game" port udp
@@ -1412,7 +1420,7 @@ fn_info_message_sf() {
 	} | column -s $'\t' -t
 }
 
-fn_info_message_sof2() {
+fn_info_messages_sof2() {
 	{
 		fn_port "header"
 		fn_port "Game" port udp
@@ -1420,7 +1428,7 @@ fn_info_message_sof2() {
 	} | column -s $'\t' -t
 }
 
-fn_info_message_sol() {
+fn_info_messages_sol() {
 	{
 		fn_port "header"
 		fn_port "Game" port udp
@@ -1429,7 +1437,7 @@ fn_info_message_sol() {
 	} | column -s $'\t' -t
 }
 
-fn_info_message_prism3d() {
+fn_info_messages_prism3d() {
 	{
 		fn_port "header"
 		fn_port "Game" port udp
@@ -1437,7 +1445,7 @@ fn_info_message_prism3d() {
 	} | column -s $'\t' -t
 }
 
-fn_info_message_source() {
+fn_info_messages_source() {
 	{
 		fn_port "header"
 		fn_port "Game" port udp
@@ -1452,8 +1460,8 @@ fn_info_message_source() {
 	} | column -s $'\t' -t
 }
 
-fn_info_message_spark() {
-	fn_info_message_password_strip
+fn_info_messages_spark() {
+	fn_info_messages_password_strip
 	{
 		fn_port "header"
 		fn_port "Game" port udp
@@ -1470,7 +1478,7 @@ fn_info_message_spark() {
 	} | column -s $'\t' -t
 }
 
-fn_info_message_squad() {
+fn_info_messages_squad() {
 	{
 		fn_port "header"
 		fn_port "Game" port udp
@@ -1479,7 +1487,7 @@ fn_info_message_squad() {
 	} | column -s $'\t' -t
 }
 
-fn_info_message_st() {
+fn_info_messages_st() {
 	{
 		fn_port "header"
 		fn_port "Game" port udp
@@ -1487,7 +1495,7 @@ fn_info_message_st() {
 	} | column -s $'\t' -t
 }
 
-fn_info_message_ti() {
+fn_info_messages_ti() {
 	{
 		fn_port "header"
 		fn_port "Game" port udp
@@ -1496,7 +1504,7 @@ fn_info_message_ti() {
 	} | column -s $'\t' -t
 }
 
-fn_info_message_ts3() {
+fn_info_messages_ts3() {
 	{
 		fn_port "header"
 		fn_port "Voice" port udp
@@ -1509,7 +1517,7 @@ fn_info_message_ts3() {
 	} | column -s $'\t' -t
 }
 
-fn_info_message_tw() {
+fn_info_messages_tw() {
 	{
 		fn_port "header"
 		fn_port "Game" port udp
@@ -1517,7 +1525,7 @@ fn_info_message_tw() {
 	} | column -s $'\t' -t
 }
 
-fn_info_message_terraria() {
+fn_info_messages_terraria() {
 	{
 		fn_port "header"
 		fn_port "Game" port tcp
@@ -1525,7 +1533,7 @@ fn_info_message_terraria() {
 	} | column -s $'\t' -t
 }
 
-fn_info_message_tu() {
+fn_info_messages_tu() {
 	{
 		fn_port "header"
 		fn_port "Game" port udp
@@ -1534,7 +1542,7 @@ fn_info_message_tu() {
 	} | column -s $'\t' -t
 }
 
-fn_info_message_ut2k4() {
+fn_info_messages_ut2k4() {
 	{
 		fn_port "header"
 		fn_port "Game" port udp
@@ -1554,7 +1562,7 @@ fn_info_message_ut2k4() {
 	} | column -s $'\t' -t
 }
 
-fn_info_message_unreal() {
+fn_info_messages_unreal() {
 	{
 		fn_port "header"
 		fn_port "Game" port udp
@@ -1573,7 +1581,7 @@ fn_info_message_unreal() {
 	} | column -s $'\t' -t
 }
 
-fn_info_message_unt() {
+fn_info_messages_unt() {
 	{
 		fn_port "header"
 		fn_port "Game" port udp
@@ -1582,7 +1590,7 @@ fn_info_message_unt() {
 	} | column -s $'\t' -t
 }
 
-fn_info_message_ut() {
+fn_info_messages_ut() {
 	{
 		fn_port "header"
 		fn_port "Game" port udp
@@ -1590,8 +1598,8 @@ fn_info_message_ut() {
 	} | column -s $'\t' -t
 }
 
-fn_info_message_ut3() {
-	fn_info_message_password_strip
+fn_info_messages_ut3() {
+	fn_info_messages_password_strip
 	{
 		fn_port "header"
 		fn_port "Game" port udp
@@ -1609,7 +1617,7 @@ fn_info_message_ut3() {
 	} | column -s $'\t' -t
 }
 
-fn_info_message_vh() {
+fn_info_messages_vh() {
 	{
 		fn_port "header"
 		fn_port "Game" port udp
@@ -1617,21 +1625,21 @@ fn_info_message_vh() {
 	} | column -s $'\t' -t
 }
 
-fn_info_message_vints() {
+fn_info_messages_vints() {
 	{
 		fn_port "header"
 		fn_port "Game" port tcp
 	} | column -s $'\t' -t
 }
 
-fn_info_message_vpmc() {
+fn_info_messages_vpmc() {
 	{
 		fn_port "header"
 		fn_port "Game" port tcp
 	} | column -s $'\t' -t
 }
 
-fn_info_message_wet() {
+fn_info_messages_wet() {
 	{
 		fn_port "header"
 		fn_port "Game" port udp
@@ -1639,7 +1647,7 @@ fn_info_message_wet() {
 	} | column -s $'\t' -t
 }
 
-fn_info_message_wf() {
+fn_info_messages_wf() {
 	{
 		fn_port "header"
 		fn_port "Game" port udp
@@ -1647,7 +1655,7 @@ fn_info_message_wf() {
 	} | column -s $'\t' -t
 }
 
-fn_info_message_wurm() {
+fn_info_messages_wurm() {
 	{
 		fn_port "header"
 		fn_port "Game" port tcp
@@ -1657,7 +1665,7 @@ fn_info_message_wurm() {
 	} | column -s $'\t' -t
 }
 
-fn_info_message_stn() {
+fn_info_messages_stn() {
 	{
 		fn_port "header"
 		fn_port "Game" port udp
@@ -1665,186 +1673,188 @@ fn_info_message_stn() {
 	} | column -s $'\t' -t
 }
 
-fn_info_message_select_engine() {
+fn_info_messages_select_engine() {
 	# Display details depending on game or engine.
 	if [ "${shortname}" == "ac" ]; then
-		fn_info_message_ac
+		fn_info_messages_ac
 	elif [ "${shortname}" == "ark" ]; then
-		fn_info_message_ark
+		fn_info_messages_ark
 	elif [ "${shortname}" == "arma3" ]; then
-		fn_info_message_arma3
+		fn_info_messages_arma3
 	elif [ "${shortname}" == "armar" ]; then
-		fn_info_message_armar
+		fn_info_messages_armar
 	elif [ "${shortname}" == "av" ]; then
-		fn_info_message_av
+		fn_info_messages_av
 	elif [ "${shortname}" == "bf1942" ]; then
-		fn_info_message_bf1942
+		fn_info_messages_bf1942
 	elif [ "${shortname}" == "bfv" ]; then
-		fn_info_message_bfv
+		fn_info_messages_bfv
 	elif [ "${shortname}" == "bo" ]; then
-		fn_info_message_bo
+		fn_info_messages_bo
 	elif [ "${shortname}" == "bt" ]; then
-		fn_info_message_bt
+		fn_info_messages_bt
 	elif [ "${shortname}" == "btl" ]; then
-		fn_info_message_btl
+		fn_info_messages_btl
 	elif [ "${shortname}" == "cd" ]; then
 		fn_info_messages_cd
 	elif [ "${shortname}" == "ck" ]; then
 		fn_info_messages_ck
+	elif [ "${shortname}" == "cs2" ]; then
+		fn_info_messages_cs2
 	elif [ "${shortname}" == "csgo" ]; then
-		fn_info_message_csgo
+		fn_info_messages_csgo
 	elif [ "${shortname}" == "cmw" ]; then
-		fn_info_message_cmw
+		fn_info_messages_cmw
 	elif [ "${shortname}" == "cod" ]; then
-		fn_info_message_cod
+		fn_info_messages_cod
 	elif [ "${shortname}" == "coduo" ]; then
-		fn_info_message_coduo
+		fn_info_messages_coduo
 	elif [ "${shortname}" == "cod2" ]; then
-		fn_info_message_cod2
+		fn_info_messages_cod2
 	elif [ "${shortname}" == "cod4" ]; then
-		fn_info_message_cod4
+		fn_info_messages_cod4
 	elif [ "${shortname}" == "codwaw" ]; then
-		fn_info_message_codwaw
+		fn_info_messages_codwaw
 	elif [ "${shortname}" == "col" ]; then
-		fn_info_message_col
+		fn_info_messages_col
 	elif [ "${shortname}" == "ct" ]; then
-		fn_info_message_ct
+		fn_info_messages_ct
 	elif [ "${shortname}" == "dayz" ]; then
-		fn_info_message_dayz
+		fn_info_messages_dayz
 	elif [ "${shortname}" == "dodr" ]; then
-		fn_info_message_dodr
+		fn_info_messages_dodr
 	elif [ "${shortname}" == "dst" ]; then
-		fn_info_message_dst
+		fn_info_messages_dst
 	elif [ "${shortname}" == "eco" ]; then
-		fn_info_message_eco
+		fn_info_messages_eco
 	elif [ "${shortname}" == "etl" ]; then
-		fn_info_message_etl
+		fn_info_messages_etl
 	elif [ "${shortname}" == "fctr" ]; then
-		fn_info_message_fctr
+		fn_info_messages_fctr
 	elif [ "${shortname}" == "hcu" ]; then
-		fn_info_message_hcu
+		fn_info_messages_hcu
 	elif [ "${shortname}" == "hw" ]; then
-		fn_info_message_hw
+		fn_info_messages_hw
 	elif [ "${shortname}" == "ins" ]; then
-		fn_info_message_ins
+		fn_info_messages_ins
 	elif [ "${shortname}" == "inss" ]; then
-		fn_info_message_inss
+		fn_info_messages_inss
 	elif [ "${shortname}" == "jc2" ]; then
-		fn_info_message_jc2
+		fn_info_messages_jc2
 	elif [ "${shortname}" == "jc3" ]; then
-		fn_info_message_jc3
+		fn_info_messages_jc3
 	elif [ "${shortname}" == "jk2" ]; then
-		fn_info_message_jk2
+		fn_info_messages_jk2
 	elif [ "${shortname}" == "kf" ]; then
-		fn_info_message_kf
+		fn_info_messages_kf
 	elif [ "${shortname}" == "kf2" ]; then
-		fn_info_message_kf2
+		fn_info_messages_kf2
 	elif [ "${shortname}" == "mc" ] || [ "${shortname}" == "pmc" ] || [ "${shortname}" == "wmc" ]; then
-		fn_info_message_mc
+		fn_info_messages_mc
 	elif [ "${shortname}" == "mcb" ]; then
-		fn_info_message_mcb
+		fn_info_messages_mcb
 	elif [ "${shortname}" == "mh" ]; then
-		fn_info_message_mh
+		fn_info_messages_mh
 	elif [ "${shortname}" == "mohaa" ]; then
-		fn_info_message_mohaa
+		fn_info_messages_mohaa
 	elif [ "${shortname}" == "mom" ]; then
-		fn_info_message_mom
+		fn_info_messages_mom
 	elif [ "${shortname}" == "mta" ]; then
-		fn_info_message_mta
+		fn_info_messages_mta
 	elif [ "${shortname}" == "nec" ]; then
-		fn_info_message_nec
+		fn_info_messages_nec
 	elif [ "${shortname}" == "ohd" ]; then
-		fn_info_message_ohd
+		fn_info_messages_ohd
 	elif [ "${shortname}" == "onset" ]; then
-		fn_info_message_onset
+		fn_info_messages_onset
 	elif [ "${shortname}" == "pc" ]; then
-		fn_info_message_pc
+		fn_info_messages_pc
 	elif [ "${shortname}" == "pc2" ]; then
-		fn_info_message_pc2
+		fn_info_messages_pc2
 	elif [ "${shortname}" == "ps" ]; then
-		fn_info_message_ps
+		fn_info_messages_ps
 	elif [ "${shortname}" == "pvr" ]; then
-		fn_info_message_pvr
+		fn_info_messages_pvr
 	elif [ "${shortname}" == "pz" ]; then
-		fn_info_message_pz
+		fn_info_messages_pz
 	elif [ "${shortname}" == "q2" ]; then
-		fn_info_message_q2
+		fn_info_messages_q2
 	elif [ "${shortname}" == "q3" ]; then
-		fn_info_message_q3
+		fn_info_messages_q3
 	elif [ "${shortname}" == "ql" ]; then
-		fn_info_message_ql
+		fn_info_messages_ql
 	elif [ "${shortname}" == "qw" ]; then
-		fn_info_message_qw
+		fn_info_messages_qw
 	elif [ "${shortname}" == "ro" ]; then
-		fn_info_message_ro
+		fn_info_messages_ro
 	elif [ "${shortname}" == "rtcw" ]; then
-		fn_info_message_rtcw
+		fn_info_messages_rtcw
 	elif [ "${shortname}" == "samp" ]; then
-		fn_info_message_samp
+		fn_info_messages_samp
 	elif [ "${shortname}" == "sb" ]; then
-		fn_info_message_sb
+		fn_info_messages_sb
 	elif [ "${shortname}" == "sbots" ]; then
-		fn_info_message_sbots
+		fn_info_messages_sbots
 	elif [ "${shortname}" == "scpsl" ] || [ "${shortname}" == "scpslsm" ]; then
-		fn_info_message_scpsl
+		fn_info_messages_scpsl
 	elif [ "${shortname}" == "sdtd" ]; then
-		fn_info_message_sdtd
+		fn_info_messages_sdtd
 	elif [ "${shortname}" == "sf" ]; then
-		fn_info_message_sf
+		fn_info_messages_sf
 	elif [ "${shortname}" == "sof2" ]; then
-		fn_info_message_sof2
+		fn_info_messages_sof2
 	elif [ "${shortname}" == "sol" ]; then
-		fn_info_message_sol
+		fn_info_messages_sol
 	elif [ "${shortname}" == "squad" ]; then
-		fn_info_message_squad
+		fn_info_messages_squad
 	elif [ "${shortname}" == "st" ]; then
-		fn_info_message_st
+		fn_info_messages_st
 	elif [ "${shortname}" == "stn" ]; then
-		fn_info_message_stn
+		fn_info_messages_stn
 	elif [ "${shortname}" == "terraria" ]; then
-		fn_info_message_terraria
+		fn_info_messages_terraria
 	elif [ "${shortname}" == "ti" ]; then
-		fn_info_message_ti
+		fn_info_messages_ti
 	elif [ "${shortname}" == "ts3" ]; then
-		fn_info_message_ts3
+		fn_info_messages_ts3
 	elif [ "${shortname}" == "tu" ]; then
-		fn_info_message_tu
+		fn_info_messages_tu
 	elif [ "${shortname}" == "tw" ]; then
-		fn_info_message_tw
+		fn_info_messages_tw
 	elif [ "${shortname}" == "unt" ]; then
-		fn_info_message_unt
+		fn_info_messages_unt
 	elif [ "${shortname}" == "vh" ]; then
-		fn_info_message_vh
+		fn_info_messages_vh
 	elif [ "${shortname}" == "vints" ]; then
-		fn_info_message_vints
+		fn_info_messages_vints
 	elif [ "${shortname}" == "rust" ]; then
-		fn_info_message_rust
+		fn_info_messages_rust
 	elif [ "${shortname}" == "rw" ]; then
-		fn_info_message_rw
+		fn_info_messages_rw
 	elif [ "${shortname}" == "ut" ]; then
-		fn_info_message_ut
+		fn_info_messages_ut
 	elif [ "${shortname}" == "ut2k4" ]; then
-		fn_info_message_ut2k4
+		fn_info_messages_ut2k4
 	elif [ "${shortname}" == "ut3" ]; then
-		fn_info_message_ut3
+		fn_info_messages_ut3
 	elif [ "${shortname}" == "vpmc" ]; then
-		fn_info_message_vpmc
+		fn_info_messages_vpmc
 	elif [ "${shortname}" == "wet" ]; then
-		fn_info_message_wet
+		fn_info_messages_wet
 	elif [ "${shortname}" == "wf" ]; then
-		fn_info_message_wf
+		fn_info_messages_wf
 	elif [ "${shortname}" == "wurm" ]; then
-		fn_info_message_wurm
+		fn_info_messages_wurm
 	elif [ "${engine}" == "goldsrc" ]; then
-		fn_info_message_goldsrc
+		fn_info_messages_goldsrc
 	elif [ "${engine}" == "prism3d" ]; then
-		fn_info_message_prism3d
+		fn_info_messages_prism3d
 	elif [ "${engine}" == "source" ]; then
-		fn_info_message_source
+		fn_info_messages_source
 	elif [ "${engine}" == "spark" ]; then
-		fn_info_message_spark
+		fn_info_messages_spark
 	elif [ "${engine}" == "unreal" ]; then
-		fn_info_message_unreal
+		fn_info_messages_unreal
 	else
 		fn_print_error_nl "Unable to detect game server."
 	fi
diff --git a/lgsm/modules/install_config.sh b/lgsm/modules/install_config.sh
index a8d97e661..59bcd90f3 100644
--- a/lgsm/modules/install_config.sh
+++ b/lgsm/modules/install_config.sh
@@ -346,6 +346,12 @@ elif [ "${shortname}" == "cs" ]; then
 	fn_default_config_remote
 	fn_set_config_vars
 	fn_list_config_locations
+elif [ "${shortname}" == "cs2" ]; then
+	array_configs+=(server.cfg)
+	fn_fetch_default_config
+	fn_default_config_remote
+	fn_set_config_vars
+	fn_list_config_locations
 elif [ "${shortname}" == "cscz" ]; then
 	array_configs+=(server.cfg)
 	fn_fetch_default_config

From c51734f59548924f2aee749e19fbb33fd99f6b82 Mon Sep 17 00:00:00 2001
From: Daniel Gibbs <me@danielgibbs.co.uk>
Date: Sat, 28 Oct 2023 08:52:07 +0100
Subject: [PATCH 014/154] feat: monitor will now force an update if source
 servers request it

---
 lgsm/modules/alert.sh           | 15 ++++++++++++++-
 lgsm/modules/command_monitor.sh |  6 +++---
 2 files changed, 17 insertions(+), 4 deletions(-)

diff --git a/lgsm/modules/alert.sh b/lgsm/modules/alert.sh
index 4a34207e9..40288d234 100644
--- a/lgsm/modules/alert.sh
+++ b/lgsm/modules/alert.sh
@@ -107,9 +107,20 @@ fn_alert_update() {
 	alertcolourdec="52480"
 }
 
+fn_alert_update_request() {
+	fn_script_log_info "Sending alert: ${selfname} has requested an update and needs to be restarted."
+	alertaction="Updating"
+	alertemoji="🎉"
+	alertsound="1"
+	alertmessage="${selfname} has requested an update and needs to be restarted."
+	# Blue
+	alertcolourhex="#1e90ff"
+	alertcolourdec="2003199"
+}
+
 fn_alert_check_update() {
 	fn_script_log_info "Sending alert: ${gamename} update available: ${remotebuildversion}"
-	alertaction="Checked for Update"
+	alertaction="Update available"
 	alertemoji="🎉"
 	alertsound="1"
 	alertmessage="${gamename} update available: ${remotebuildversion}"
@@ -199,6 +210,8 @@ elif [ "${alert}" == "test" ]; then
 	fn_alert_test
 elif [ "${alert}" == "update" ]; then
 	fn_alert_update
+elif [ "${alert}" == "update-request" ]; then
+	fn_alert_update_request
 elif [ "${alert}" == "check-update" ]; then
 	fn_alert_check_update
 elif [ "${alert}" == "config" ]; then
diff --git a/lgsm/modules/command_monitor.sh b/lgsm/modules/command_monitor.sh
index 51a1e99bf..badc90510 100644
--- a/lgsm/modules/command_monitor.sh
+++ b/lgsm/modules/command_monitor.sh
@@ -153,10 +153,10 @@ fn_monitor_check_update_source() {
 			fn_script_log_info "Checking update: CHECKING"
 			fn_print_ok "Checking update: "
 			fn_print_ok_eol_nl
-			fn_script_log_info "Checking update: Monitor is restarting ${selfname} to apply update"
-			alert="update"
+			fn_script_log_info "Checking update: ${selfname} has requested an update and needs to be restarted"
+			alert="update-request"
 			alert.sh
-			command_restart.sh
+			command_update.sh
 			core_exit.sh
 		fi
 	fi

From c0742b24823670a539aae30b6ab802ee13146d46 Mon Sep 17 00:00:00 2001
From: Pierre Payen <payen.pierre@gmail.com>
Date: Sat, 28 Oct 2023 10:24:03 +0200
Subject: [PATCH 015/154] refactor: remove ansi sequence from creeol when
 ansi=off (#4352)

When using "ansi"="off", the escape sequence \033[K is still present and tools that input from lgsm will get thoses bytes.
This commit removes that.

One side-effect if two prints are done without a line feed and the second is shorter than the first, then some unwanted character could remain.
```
echo -en "${creeol}foo/bar"
echo -en "${creeol}foo"
```
* before : prints "foo"
* after: prints "foo/bar"
---
 lgsm/modules/core_messages.sh | 6 ++++--
 1 file changed, 4 insertions(+), 2 deletions(-)

diff --git a/lgsm/modules/core_messages.sh b/lgsm/modules/core_messages.sh
index 929e942be..6488c02bc 100644
--- a/lgsm/modules/core_messages.sh
+++ b/lgsm/modules/core_messages.sh
@@ -10,6 +10,8 @@ moduleselfname="$(basename "$(readlink -f "${BASH_SOURCE[0]}")")"
 # nl: new line: message is following by a new line.
 # eol: end of line: message is placed at the end of the current line.
 fn_ansi_loader() {
+	# carriage return.
+	creeol="\r"
 	if [ "${ansi}" != "off" ]; then
 		# echo colors
 		default="\e[0m"
@@ -29,9 +31,9 @@ fn_ansi_loader() {
 		darkgrey="\e[90m"
 		lightgrey="\e[37m"
 		white="\e[97m"
+  		# erase to end of line.
+		creeol+="\033[K"
 	fi
-	# carriage return & erase to end of line.
-	creeol="\r\033[K"
 }
 
 fn_sleep_time() {

From 35a535bfa1e6e4af4af20a642c90c55efc893b9c Mon Sep 17 00:00:00 2001
From: Renato <1917543+rainst@users.noreply.github.com>
Date: Sat, 28 Oct 2023 19:25:55 +1100
Subject: [PATCH 016/154] feat(vh): add an additional config string for valheim
 world modifiers (#4341)

* feat(vhserver): added additional config string for valheim world modifiers

* added instructions on how modifiers are stored in the save files and how to go back to default

* small typo

---------

Co-authored-by: Daniel Gibbs <me@danielgibbs.co.uk>
---
 .../config-lgsm/vhserver/_default.cfg         | 31 +++++++++++++++++--
 1 file changed, 29 insertions(+), 2 deletions(-)

diff --git a/lgsm/config-default/config-lgsm/vhserver/_default.cfg b/lgsm/config-default/config-lgsm/vhserver/_default.cfg
index 084adf50c..4e3d23923 100644
--- a/lgsm/config-default/config-lgsm/vhserver/_default.cfg
+++ b/lgsm/config-default/config-lgsm/vhserver/_default.cfg
@@ -22,11 +22,38 @@ backups="4"
 backupshort="7200"
 backuplong="43200"
 # If crossplay is empty, it's off. Fill with any text to make true
-# Crossplay is currently not working on Linux dedicated servers, so for now the default is false (emtpy)
+# Crossplay is currently not working on Linux dedicated servers, so for now the default is false (empty)
 crossplay=""
 
+# INSTRUCTIONS FOR WORLD MODIFIERS (from Valheim Dedicated Server Manual.pdf located in serverfiles)
+# World modifiers can only be set in the start parameters and can be a combination of the following
+# PRESETS:
+#   Setting a preset will overwrite any other previous modifiers.
+#   Command line parameter: -preset
+#   Valid values: normal, casual, easy, hard, hardcore, immersive, hammer.
+# MODIFIERS:
+#   This is set as a combination of key and value, if combined with a preset should be set after.
+#   Command line parameter: -modifier
+#   Valid keys and possible values:
+#   combat: veryeasy, easy, hard, veryhard
+#   deathPenalty: casual, veryeasy, easy, hard, hardcore
+#   resources: muchless, less, more, muchmore, most
+#   raids: none, muchless, less, more, muchmore
+#   portals: casual, hard, veryhard
+# KEYS:
+#   Sets a world modifier checkbox key.
+#   Command line parameter: -setkey
+#   Valid values: nobuildcost, playerevents, passivemobs, nomap
+# Example of a combination of modifiers where we set no raids, very hard portals and no map run:
+#   worldmodifiers="-modifier raids none -modifier portals veryhard -setkey nomap"
+# NOTE: removing world modifiers will NOT reset them to default. the modifiers are stored in the world save file (.fwl)
+#   To go back to default you need to launch the server with the following parameter at least once:
+#.  worldmodifiers="-preset normal"
+
+worldmodifiers=""
+
 ## Server Parameters | https://docs.linuxgsm.com/configuration/start-parameters#additional-parameters
-startparameters="-name '${servername}' -password ${serverpassword} -port ${port} -world ${worldname} -public ${public} -savedir '${savedir}' -logFile '${logFile}' -saveinterval ${saveinterval} -backups ${backups} -backupshort ${backupshort} -backuplong ${backuplong} ${crossplay:+-crossplay}"
+startparameters="-name '${servername}' -password ${serverpassword} -port ${port} -world ${worldname} -public ${public} -savedir '${savedir}' -saveinterval ${saveinterval} -backups ${backups} -backupshort ${backupshort} -backuplong ${backuplong}${logFile:+ -logFile '${logFile}'}${crossplay:+ -crossplay}${worldmodifiers:+ ${worldmodifiers}}"
 
 #### LinuxGSM Settings ####
 

From cfdfcc3d7f1bff6537718ef3e89844349e1e76be Mon Sep 17 00:00:00 2001
From: Daniel Gibbs <me@danielgibbs.co.uk>
Date: Sat, 28 Oct 2023 12:59:49 +0100
Subject: [PATCH 017/154] feat: dev-debug.log moved to /data/log if running in
 docker

---
 lgsm/modules/core_exit.sh | 2 ++
 linuxgsm.sh               | 6 +++++-
 2 files changed, 7 insertions(+), 1 deletion(-)

diff --git a/lgsm/modules/core_exit.sh b/lgsm/modules/core_exit.sh
index 496cde422..989a4c543 100644
--- a/lgsm/modules/core_exit.sh
+++ b/lgsm/modules/core_exit.sh
@@ -13,6 +13,8 @@ fn_exit_dev_debug() {
 		echo -e "${moduleselfname} exiting with code: ${exitcode}"
 		if [ -f "${rootdir}/dev-debug.log" ]; then
 			grep -a "modulefile=" "${rootdir}/dev-debug.log" | sed 's/modulefile=//g' > "${rootdir}/dev-debug-module-order.log"
+		elif [ -f "${lgsmlogdir}/dev-debug.log" ]; then
+			grep -a "modulefile=" "${lgsmlogdir}/dev-debug.log" | sed 's/modulefile=//g' > "${rootdir}/dev-debug-module-order.log"
 		fi
 	fi
 }
diff --git a/linuxgsm.sh b/linuxgsm.sh
index 395285c7b..9f3611fed 100755
--- a/linuxgsm.sh
+++ b/linuxgsm.sh
@@ -15,7 +15,11 @@
 
 # Debugging
 if [ -f ".dev-debug" ]; then
-	exec 5> dev-debug.log
+	if [ -f /.dockerenv ]; then
+		exec 5> /data/log/dev-debug.log
+	else
+		exec 5> dev-debug.log
+	fi
 	BASH_XTRACEFD="5"
 	set -x
 fi

From aedfa77001f758d034571896d434d36a03622d83 Mon Sep 17 00:00:00 2001
From: Daniel Gibbs <me@danielgibbs.co.uk>
Date: Sat, 28 Oct 2023 13:34:43 +0100
Subject: [PATCH 018/154] feat(monitor): check if details is running

---
 lgsm/modules/command_monitor.sh | 16 ++++++++++++++--
 1 file changed, 14 insertions(+), 2 deletions(-)

diff --git a/lgsm/modules/command_monitor.sh b/lgsm/modules/command_monitor.sh
index badc90510..5f1ff77f6 100644
--- a/lgsm/modules/command_monitor.sh
+++ b/lgsm/modules/command_monitor.sh
@@ -52,6 +52,17 @@ fn_monitor_check_debug() {
 	fi
 }
 
+fn_monitor_check_details() {
+	if [ "$(pgrep -fcx -u "${USER}" "/bin/bash ./${selfname} details")" != "0" ] || [ "$(pgrep -fcx -u "${USER}" "/bin/bash ./${selfname} dt")" != "0" ]; then
+		fn_print_dots "Checking details: "
+		fn_print_checking_eol
+		fn_print_info "Checking details: Details is running: "
+		fn_print_info_eol_nl
+		fn_script_log_pass "Checking details: Details is running"
+		core_exit.sh
+	fi
+}
+
 fn_monitor_check_starting() {
 	# Remove stale lockfile.
 	if [ -f "${lockdir}/${selfname}-starting.lock" ]; then
@@ -380,10 +391,11 @@ core_logs.sh
 info_game.sh
 
 # query pre-checks
-fn_monitor_check_update_source
-fn_monitor_check_update
+fn_monitor_check_details
 fn_monitor_check_backup
 fn_monitor_check_debug
+fn_monitor_check_update_source
+fn_monitor_check_update
 fn_monitor_check_monitoring
 fn_monitor_check_starting
 fn_monitor_check_stopping

From 67472a824fa1782396ca165871ba9d028e9c5985 Mon Sep 17 00:00:00 2001
From: Daniel Gibbs <me@danielgibbs.co.uk>
Date: Sun, 29 Oct 2023 21:27:21 +0000
Subject: [PATCH 019/154] feat(new server): The Front (#4359)

* add the front

* config

* appid

* config

* parameters

* params

* params

* ports

* update parameters

* verbose

* variable

* fix

* multihome

* update ip addressing

* add ip vars

* info

* add ft-icon

* add missing tf
---
 .../config-lgsm/tfserver/_default.cfg         | 202 ++++++++++++++++++
 lgsm/data/almalinux-8.csv                     |   1 +
 lgsm/data/almalinux-9.csv                     |   1 +
 lgsm/data/centos-7.csv                        |   1 +
 lgsm/data/centos-8.csv                        |   1 +
 lgsm/data/centos-9.csv                        |   1 +
 lgsm/data/debian-10.csv                       |   1 +
 lgsm/data/debian-11.csv                       |   1 +
 lgsm/data/debian-12.csv                       |   1 +
 lgsm/data/debian-9.csv                        |   1 +
 lgsm/data/gameicons/tf-icon.png               | Bin 0 -> 1828 bytes
 lgsm/data/rhel-7.csv                          |   1 +
 lgsm/data/rhel-8.csv                          |   1 +
 lgsm/data/rhel-9.csv                          |   1 +
 lgsm/data/rocky-8.csv                         |   1 +
 lgsm/data/rocky-9.csv                         |   1 +
 lgsm/data/serverlist.csv                      |   1 +
 lgsm/data/ubuntu-16.04.csv                    |   1 +
 lgsm/data/ubuntu-18.04.csv                    |   1 +
 lgsm/data/ubuntu-20.04.csv                    |   1 +
 lgsm/data/ubuntu-22.04.csv                    |   1 +
 lgsm/data/ubuntu-23.04.csv                    |   1 +
 lgsm/data/ubuntu-23.10.csv                    |   1 +
 lgsm/modules/command_dev_query_raw.sh         |  10 +
 lgsm/modules/info_game.sh                     |  20 ++
 lgsm/modules/info_messages.sh                 |  12 ++
 26 files changed, 265 insertions(+)
 create mode 100644 lgsm/config-default/config-lgsm/tfserver/_default.cfg
 create mode 100644 lgsm/data/gameicons/tf-icon.png

diff --git a/lgsm/config-default/config-lgsm/tfserver/_default.cfg b/lgsm/config-default/config-lgsm/tfserver/_default.cfg
new file mode 100644
index 000000000..b605365fe
--- /dev/null
+++ b/lgsm/config-default/config-lgsm/tfserver/_default.cfg
@@ -0,0 +1,202 @@
+##################################
+######## Default Settings ########
+##################################
+# DO NOT EDIT, ANY CHANGES WILL BE OVERWRITTEN!
+# Copy settings from here and use them in either:
+# common.cfg - applies settings to every instance.
+# [instance].cfg - applies settings to a specific instance.
+
+#### Game Server Settings ####
+
+## Predefined Parameters | https://docs.linuxgsm.com/configuration/start-parameters
+ip="0.0.0.0"
+port="5001"
+beaconport="5002"
+shutdownport="5003"
+queryport="27015"
+adminlabel="true" # Enable admin icon.
+allowsensitivewords="true"
+altsavedirectoryname="${defaultmap}"
+anticheat="true"
+damageself="true"
+damangeallies="true"
+gamemode="0" # 0 = PvP; 1 = PvE
+greenhand="true"
+maxplayers="40"
+maxqueuesize="50"
+queuevalidtime="120"
+saveinterval="300"
+serveradmins="" # Use 17-digit Steam IDs separated by commas to grant admin privileges to players.
+servername="LinuxGSM"
+serverpassword=""
+servertags="LinuxGSM"
+steamsocket="0" # Use Steam Socket. 0 = off; 1 = on. Use Steam Servers for network penetration. Enable this if you don't have a public IP but you want to allow players from outside your network to join your server. If disabled, only you and other players on your LAN can join. If you have a public IP, you do not need to enable this.
+
+## Server Parameters | https://docs.linuxgsm.com/configuration/start-parameters#additional-parameters
+startparameters="ProjectWar_Start?DedicatedServer?MaxPlayers=${maxplayers} -server -game -log -MultiHome=${ip} -Port=${port} -QueryPort=${queryport} -BeaconPort=${beaconport} -ShutDownServicePort=${shutdownport} -ConfigServerName='${selfname}' -OutIPAddress=${publicip} -ServerTags='${servertags}' -UseSteamSocket=${steamsocket} -UserDir='${serverfiles}/${selfname}' -ServerName='${servername}' -EnableParallelCharacterMovementTickFunction -EnableParallelCharacterTickFunction -UseDynamicPhysicsScene -Game.PhysicsVehicle=false -ansimalloc -Game.MaxFrameRate=35 -MaxQueueSize=${maxqueuesize} -QueueValidTime=${queuevalidtime} -QueueThreshold=${maxplayers} -ServerFightModeType=${gamemode} -IsCanSelfDamage=${damageself} -IsCanFriendDamage=${damageallies} -SaveWorldInterval=${saveinterval} -GMOverlapRatio=2 -GreenHand=${greenhand} -SensitiveWords=${allowsensitivewords} -UseACE=${anticheat} -ServerAdminAccounts='${serveradmins}' -IsShowGmTitle=${adminlabel} -ServerPassword='${serverpassword}'"
+
+#### LinuxGSM Settings ####
+
+## LinuxGSM Stats
+# Send useful stats to LinuxGSM developers.
+# https://docs.linuxgsm.com/configuration/linuxgsm-stats
+# (on|off)
+stats="off"
+
+## Notification Alerts
+# (on|off)
+
+# Display IP | https://docs.linuxgsm.com/alerts#display-ip
+displayip=""
+
+# More info | https://docs.linuxgsm.com/alerts#more-info
+postalert="off"
+
+# Alert on Start/Stop/Restart
+statusalert="off"
+
+# Discord Alerts | https://docs.linuxgsm.com/alerts/discord
+discordalert="off"
+discordwebhook="webhook"
+
+# Email Alerts | https://docs.linuxgsm.com/alerts/email
+emailalert="off"
+email="email@example.com"
+emailfrom=""
+
+# Gotify Alerts | https://docs.linuxgsm.com/alerts/gotify
+gotifyalert="off"
+gotifytoken="token"
+gotifywebhook="webhook"
+
+# IFTTT Alerts | https://docs.linuxgsm.com/alerts/ifttt
+iftttalert="off"
+ifttttoken="accesstoken"
+iftttevent="linuxgsm_alert"
+
+# Pushbullet Alerts | https://docs.linuxgsm.com/alerts/pushbullet
+pushbulletalert="off"
+pushbullettoken="accesstoken"
+channeltag=""
+
+# Pushover Alerts | https://docs.linuxgsm.com/alerts/pushover
+pushoveralert="off"
+pushovertoken="accesstoken"
+pushoveruserkey="userkey"
+
+# Rocket.Chat Alerts | https://docs.linuxgsm.com/alerts/rocket.chat
+rocketchatalert="off"
+rocketchatwebhook="webhook"
+
+# Slack Alerts | https://docs.linuxgsm.com/alerts/slack
+slackalert="off"
+slackwebhook="webhook"
+
+# Telegram Alerts | https://docs.linuxgsm.com/alerts/telegram
+# You can add a custom cURL string eg proxy (useful in Russia) in "curlcustomstring".
+# For example "--socks5 ipaddr:port" for socks5 proxy see more in "curl --help".
+telegramapi="api.telegram.org"
+telegramalert="off"
+telegramtoken="accesstoken"
+telegramchatid=""
+curlcustomstring=""
+
+## Updating | https://docs.linuxgsm.com/commands/update
+updateonstart="off"
+
+## Backup | https://docs.linuxgsm.com/commands/backup
+maxbackups="4"
+maxbackupdays="30"
+stoponbackup="on"
+
+## Logging | https://docs.linuxgsm.com/features/logging
+consolelogging="on"
+logdays="7"
+
+## Monitor | https://docs.linuxgsm.com/commands/monitor
+# Query delay time
+querydelay="5"
+
+## ANSI Colors | https://docs.linuxgsm.com/features/ansi-colors
+ansi="on"
+
+#### Advanced Settings ####
+
+## Message Display Time | https://docs.linuxgsm.com/features/message-display-time
+sleeptime="0.5"
+
+## SteamCMD Settings | https://docs.linuxgsm.com/steamcmd
+# Server appid
+appid="2334200"
+steamcmdforcewindows="no"
+# SteamCMD Branch | https://docs.linuxgsm.com/steamcmd/branch
+branch=""
+betapassword=""
+# Master Server | https://docs.linuxgsm.com/steamcmd/steam-master-server
+steammaster="true"
+
+## Stop Mode | https://docs.linuxgsm.com/features/stop-mode
+# 1: tmux kill
+# 2: CTRL+c
+# 3: quit
+# 4: quit 120s
+# 5: stop
+# 6: q
+# 7: exit
+# 8: 7 Days to Die
+# 9: GoldSrc
+# 10: Avorion
+# 11: end
+stopmode="2"
+
+## Query mode
+# 1: session only
+# 2: gamedig (gsquery fallback)
+# 3: gamedig
+# 4: gsquery
+# 5: tcp
+querymode="2"
+querytype="protocol-valve"
+
+## Console type
+consoleverbose="yes"
+consoleinteract="no"
+
+## Game Server Details
+# Do not edit
+gamename="The Front"
+engine="unreal4"
+glibc="2.17"
+
+#### Directories ####
+# Edit with care
+
+## Game Server Directories
+systemdir="${serverfiles}/ProjectWar"
+executabledir="${systemdir}/Binaries/Linux"
+executable="./TheFrontServer"
+servercfgdir="${systemdir}/Saved/Config/LinuxServer"
+servercfg="GameUserSettings.ini"
+servercfgdefault="GameUserSettings.ini"
+servercfgfullpath="${servercfgdir}/${servercfg}"
+
+## Backup Directory
+backupdir="${lgsmdir}/backup"
+
+## Logging Directories
+[ -n "${LGSM_LOGDIR}" ] && logdir="${LGSM_LOGDIR}" || logdir="${rootdir}/log"
+gamelogdir="${systemdir}/Saved/Logs"
+lgsmlogdir="${logdir}/script"
+consolelogdir="${logdir}/console"
+lgsmlog="${lgsmlogdir}/${selfname}-script.log"
+consolelog="${consolelogdir}/${selfname}-console.log"
+alertlog="${lgsmlogdir}/${selfname}-alert.log"
+postdetailslog="${lgsmlogdir}/${selfname}-postdetails.log"
+
+## Logs Naming
+lgsmlogdate="${lgsmlogdir}/${selfname}-script-$(date '+%Y-%m-%d-%H:%M:%S').log"
+consolelogdate="${consolelogdir}/${selfname}-console-$(date '+%Y-%m-%d-%H:%M:%S').log"
+
+## Log Parameters
+logtimestamp="off"
+logtimestampformat="%Y-%m-%d %H:%M:%S"
diff --git a/lgsm/data/almalinux-8.csv b/lgsm/data/almalinux-8.csv
index 4142c3c82..561b3c134 100644
--- a/lgsm/data/almalinux-8.csv
+++ b/lgsm/data/almalinux-8.csv
@@ -111,6 +111,7 @@ st,libxml2
 stn
 sven
 terraria
+tf
 tf2,libcurl.i686
 tfc
 ti
diff --git a/lgsm/data/almalinux-9.csv b/lgsm/data/almalinux-9.csv
index 0e9ff15e2..64a9e0645 100644
--- a/lgsm/data/almalinux-9.csv
+++ b/lgsm/data/almalinux-9.csv
@@ -111,6 +111,7 @@ st,libxml2
 stn
 sven
 terraria
+tf
 tf2,libcurl.i686
 tfc
 ti
diff --git a/lgsm/data/centos-7.csv b/lgsm/data/centos-7.csv
index 111bd9afa..a1b10095e 100644
--- a/lgsm/data/centos-7.csv
+++ b/lgsm/data/centos-7.csv
@@ -111,6 +111,7 @@ st,libxml2
 stn
 sven
 terraria
+tf
 tf2,libcurl.i686
 tfc
 ti
diff --git a/lgsm/data/centos-8.csv b/lgsm/data/centos-8.csv
index 4142c3c82..561b3c134 100644
--- a/lgsm/data/centos-8.csv
+++ b/lgsm/data/centos-8.csv
@@ -111,6 +111,7 @@ st,libxml2
 stn
 sven
 terraria
+tf
 tf2,libcurl.i686
 tfc
 ti
diff --git a/lgsm/data/centos-9.csv b/lgsm/data/centos-9.csv
index 0e9ff15e2..64a9e0645 100644
--- a/lgsm/data/centos-9.csv
+++ b/lgsm/data/centos-9.csv
@@ -111,6 +111,7 @@ st,libxml2
 stn
 sven
 terraria
+tf
 tf2,libcurl.i686
 tfc
 ti
diff --git a/lgsm/data/debian-10.csv b/lgsm/data/debian-10.csv
index 0e9d67d03..c890739c5 100644
--- a/lgsm/data/debian-10.csv
+++ b/lgsm/data/debian-10.csv
@@ -111,6 +111,7 @@ st,libxml2-utils
 stn
 sven,libssl1.1:i386,zlib1g:i386
 terraria
+tf
 tf2,libcurl4-gnutls-dev:i386
 tfc
 ti
diff --git a/lgsm/data/debian-11.csv b/lgsm/data/debian-11.csv
index 9a458349e..c265a1f4b 100644
--- a/lgsm/data/debian-11.csv
+++ b/lgsm/data/debian-11.csv
@@ -111,6 +111,7 @@ st,libxml2-utils
 stn
 sven,libssl1.1:i386,zlib1g:i386
 terraria
+tf
 tf2,libcurl4-gnutls-dev:i386
 tfc
 ti
diff --git a/lgsm/data/debian-12.csv b/lgsm/data/debian-12.csv
index d0e56cf46..00351bde8 100644
--- a/lgsm/data/debian-12.csv
+++ b/lgsm/data/debian-12.csv
@@ -111,6 +111,7 @@ st,libxml2-utils
 stn
 sven,libssl3:i386,zlib1g:i386
 terraria
+tf
 tf2,libcurl4-gnutls-dev:i386
 tfc
 ti
diff --git a/lgsm/data/debian-9.csv b/lgsm/data/debian-9.csv
index c8aceef1b..6fd3c21ee 100644
--- a/lgsm/data/debian-9.csv
+++ b/lgsm/data/debian-9.csv
@@ -111,6 +111,7 @@ st,libxml2-utils
 stn
 sven,libssl1.1:i386,zlib1g:i386
 terraria
+tf
 tf2,libcurl4-gnutls-dev:i386
 tfc
 ti
diff --git a/lgsm/data/gameicons/tf-icon.png b/lgsm/data/gameicons/tf-icon.png
new file mode 100644
index 0000000000000000000000000000000000000000..ace42ff5b9dd532e75da9d0337d550dcdf2b97d1
GIT binary patch
literal 1828
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
S>i=s10000<MNUMnLSTabo4QN@

literal 0
HcmV?d00001

diff --git a/lgsm/data/rhel-7.csv b/lgsm/data/rhel-7.csv
index 9125bd093..8a748cda7 100644
--- a/lgsm/data/rhel-7.csv
+++ b/lgsm/data/rhel-7.csv
@@ -111,6 +111,7 @@ st,libxml2
 stn
 sven
 terraria
+tf
 tf2,libcurl.i686
 tfc
 ti
diff --git a/lgsm/data/rhel-8.csv b/lgsm/data/rhel-8.csv
index 4142c3c82..561b3c134 100644
--- a/lgsm/data/rhel-8.csv
+++ b/lgsm/data/rhel-8.csv
@@ -111,6 +111,7 @@ st,libxml2
 stn
 sven
 terraria
+tf
 tf2,libcurl.i686
 tfc
 ti
diff --git a/lgsm/data/rhel-9.csv b/lgsm/data/rhel-9.csv
index 0e9ff15e2..64a9e0645 100644
--- a/lgsm/data/rhel-9.csv
+++ b/lgsm/data/rhel-9.csv
@@ -111,6 +111,7 @@ st,libxml2
 stn
 sven
 terraria
+tf
 tf2,libcurl.i686
 tfc
 ti
diff --git a/lgsm/data/rocky-8.csv b/lgsm/data/rocky-8.csv
index 4142c3c82..561b3c134 100644
--- a/lgsm/data/rocky-8.csv
+++ b/lgsm/data/rocky-8.csv
@@ -111,6 +111,7 @@ st,libxml2
 stn
 sven
 terraria
+tf
 tf2,libcurl.i686
 tfc
 ti
diff --git a/lgsm/data/rocky-9.csv b/lgsm/data/rocky-9.csv
index 0e9ff15e2..64a9e0645 100644
--- a/lgsm/data/rocky-9.csv
+++ b/lgsm/data/rocky-9.csv
@@ -111,6 +111,7 @@ st,libxml2
 stn
 sven
 terraria
+tf
 tf2,libcurl.i686
 tfc
 ti
diff --git a/lgsm/data/serverlist.csv b/lgsm/data/serverlist.csv
index 094731373..1dd6dda2c 100644
--- a/lgsm/data/serverlist.csv
+++ b/lgsm/data/serverlist.csv
@@ -110,6 +110,7 @@ st,stserver,Stationeers,ubuntu-22.04
 stn,stnserver,Survive the Nights,ubuntu-22.04
 sven,svenserver,Sven Co-op,ubuntu-20.04
 terraria,terrariaserver,Terraria,ubuntu-22.04
+tf,tfserver,The Front,ubuntu-22.04
 tf2,tf2server,Team Fortress 2,ubuntu-22.04
 tfc,tfcserver,Team Fortress Classic,ubuntu-22.04
 ti,tiserver,The Isle,ubuntu-22.04
diff --git a/lgsm/data/ubuntu-16.04.csv b/lgsm/data/ubuntu-16.04.csv
index 37fc3114b..e91bec26d 100644
--- a/lgsm/data/ubuntu-16.04.csv
+++ b/lgsm/data/ubuntu-16.04.csv
@@ -111,6 +111,7 @@ st,libxml2-utils
 stn
 sven,libssl1.1:i386,zlib1g:i386
 terraria
+tf
 tf2,libcurl4-gnutls-dev:i386
 tfc
 ti
diff --git a/lgsm/data/ubuntu-18.04.csv b/lgsm/data/ubuntu-18.04.csv
index 0e9d67d03..c890739c5 100644
--- a/lgsm/data/ubuntu-18.04.csv
+++ b/lgsm/data/ubuntu-18.04.csv
@@ -111,6 +111,7 @@ st,libxml2-utils
 stn
 sven,libssl1.1:i386,zlib1g:i386
 terraria
+tf
 tf2,libcurl4-gnutls-dev:i386
 tfc
 ti
diff --git a/lgsm/data/ubuntu-20.04.csv b/lgsm/data/ubuntu-20.04.csv
index 35d284786..e66eb7dc6 100644
--- a/lgsm/data/ubuntu-20.04.csv
+++ b/lgsm/data/ubuntu-20.04.csv
@@ -111,6 +111,7 @@ st,libxml2-utils
 stn
 sven,libssl1.1:i386,zlib1g:i386
 terraria
+tf
 tf2,libcurl4-gnutls-dev:i386
 tfc
 ti
diff --git a/lgsm/data/ubuntu-22.04.csv b/lgsm/data/ubuntu-22.04.csv
index 1f57e9613..ffc637ab7 100644
--- a/lgsm/data/ubuntu-22.04.csv
+++ b/lgsm/data/ubuntu-22.04.csv
@@ -111,6 +111,7 @@ st,libxml2-utils
 stn
 sven,libssl1.1:i386,zlib1g:i386
 terraria
+tf
 tf2,libcurl4-gnutls-dev:i386
 tfc
 ti
diff --git a/lgsm/data/ubuntu-23.04.csv b/lgsm/data/ubuntu-23.04.csv
index dbfe82f9e..65e17bf1b 100644
--- a/lgsm/data/ubuntu-23.04.csv
+++ b/lgsm/data/ubuntu-23.04.csv
@@ -111,6 +111,7 @@ st,libxml2-utils
 stn
 sven,libssl1.1:i386,zlib1g:i386
 terraria
+tf
 tf2,libcurl4-gnutls-dev:i386
 tfc
 ti
diff --git a/lgsm/data/ubuntu-23.10.csv b/lgsm/data/ubuntu-23.10.csv
index dbfe82f9e..65e17bf1b 100644
--- a/lgsm/data/ubuntu-23.10.csv
+++ b/lgsm/data/ubuntu-23.10.csv
@@ -111,6 +111,7 @@ st,libxml2-utils
 stn
 sven,libssl1.1:i386,zlib1g:i386
 terraria
+tf
 tf2,libcurl4-gnutls-dev:i386
 tfc
 ti
diff --git a/lgsm/modules/command_dev_query_raw.sh b/lgsm/modules/command_dev_query_raw.sh
index 50c07fd7b..2314d75b4 100644
--- a/lgsm/modules/command_dev_query_raw.sh
+++ b/lgsm/modules/command_dev_query_raw.sh
@@ -15,6 +15,16 @@ info_game.sh
 info_distro.sh
 info_messages.sh
 
+echo -e ""
+echo -e "${lightgreen}IP Addresses Variables${default}"
+fn_messages_separator
+echo -e ""
+echo -e "IP: ${ip}"
+echo -e "HTTP IP: ${httpip}"
+echo -e "Public IP: ${publicip}"
+echo -e "Telnet IP: ${telnetip}"
+echo -e "Display IP: ${displayip}"
+
 echo -e ""
 echo -e "${lightgreen}Query IP Addresses${default}"
 fn_messages_separator
diff --git a/lgsm/modules/info_game.sh b/lgsm/modules/info_game.sh
index fd4598166..c75f1c239 100644
--- a/lgsm/modules/info_game.sh
+++ b/lgsm/modules/info_game.sh
@@ -681,6 +681,24 @@ fn_info_game_stn() {
 	serverpassword="${serverpassword:-"NOT SET"}"
 }
 
+# Config Type: parameters
+# Parameters: true
+# Comment:
+# Example: -ServerName="SERVERNAME"
+# Filetype: parameters
+fn_info_game_tf() {
+	beaconport="${beaconport:-"0"}"
+	gamemode="${gamemode:-"NOT SET"}"
+	maxplayers="${maxplayers:-"0"}"
+	port="${port:-"0"}"
+	queryport="${queryport:-"0"}"
+	saveinterval="${saveinterval:-"0"}"
+	servername="${servername:-"NOT SET"}"
+	serverpassword="${serverpassword:-"NOT SET"}"
+	shutdownport="${shutdownport:-"0"}"
+
+}
+
 # Config Type: ini
 # Parameters: true
 # Comment: ; or #
@@ -2372,6 +2390,8 @@ elif [ "${shortname}" == "stn" ]; then
 	fn_info_game_stn
 elif [ "${shortname}" == "terraria" ]; then
 	fn_info_game_terraria
+elif [ "${shortname}" == "tf" ]; then
+	fn_info_game_tf
 elif [ "${shortname}" == "ti" ]; then
 	fn_info_game_ti
 elif [ "${shortname}" == "ts3" ]; then
diff --git a/lgsm/modules/info_messages.sh b/lgsm/modules/info_messages.sh
index 0e57690bf..0b928aa55 100644
--- a/lgsm/modules/info_messages.sh
+++ b/lgsm/modules/info_messages.sh
@@ -1542,6 +1542,16 @@ fn_info_messages_tu() {
 	} | column -s $'\t' -t
 }
 
+fn_info_messages_tf() {
+	{
+		fn_port "header"
+		fn_port "Game" port udp
+		fn_port "Query" queryport tcp
+		fn_port "Beacon" beaconport udp
+		fn_port "Shutdown" shutdownport tcp
+	} | column -s $'\t' -t
+}
+
 fn_info_messages_ut2k4() {
 	{
 		fn_port "header"
@@ -1813,6 +1823,8 @@ fn_info_messages_select_engine() {
 		fn_info_messages_stn
 	elif [ "${shortname}" == "terraria" ]; then
 		fn_info_messages_terraria
+	elif [ "${shortname}" == "tf" ]; then
+		fn_info_messages_tf
 	elif [ "${shortname}" == "ti" ]; then
 		fn_info_messages_ti
 	elif [ "${shortname}" == "ts3" ]; then

From 1a91b44d01736656c6f0df886063e3d041eedac0 Mon Sep 17 00:00:00 2001
From: Daniel Gibbs <me@danielgibbs.co.uk>
Date: Sun, 29 Oct 2023 21:35:42 +0000
Subject: [PATCH 020/154] Release v23.6.0

---
 lgsm/modules/core_modules.sh | 2 +-
 linuxgsm.sh                  | 2 +-
 2 files changed, 2 insertions(+), 2 deletions(-)

diff --git a/lgsm/modules/core_modules.sh b/lgsm/modules/core_modules.sh
index 3d989f346..e851340da 100644
--- a/lgsm/modules/core_modules.sh
+++ b/lgsm/modules/core_modules.sh
@@ -8,7 +8,7 @@
 
 moduleselfname="$(basename "$(readlink -f "${BASH_SOURCE[0]}")")"
 
-modulesversion="v23.5.3"
+modulesversion="v23.6.0"
 
 # Core
 
diff --git a/linuxgsm.sh b/linuxgsm.sh
index 9f3611fed..5eb822143 100755
--- a/linuxgsm.sh
+++ b/linuxgsm.sh
@@ -24,7 +24,7 @@ if [ -f ".dev-debug" ]; then
 	set -x
 fi
 
-version="v23.5.3"
+version="v23.6.0"
 shortname="core"
 gameservername="core"
 commandname="CORE"

From 64e8a50d0ba31c57cd968578cfc565dea28a0ad1 Mon Sep 17 00:00:00 2001
From: Daniel Gibbs <me@danielgibbs.co.uk>
Date: Sun, 29 Oct 2023 22:59:51 +0000
Subject: [PATCH 021/154] fix(tf): remove server configs

The Front only uses start parameters
---
 lgsm/config-default/config-lgsm/tfserver/_default.cfg | 4 ----
 1 file changed, 4 deletions(-)

diff --git a/lgsm/config-default/config-lgsm/tfserver/_default.cfg b/lgsm/config-default/config-lgsm/tfserver/_default.cfg
index b605365fe..86994d8e0 100644
--- a/lgsm/config-default/config-lgsm/tfserver/_default.cfg
+++ b/lgsm/config-default/config-lgsm/tfserver/_default.cfg
@@ -175,10 +175,6 @@ glibc="2.17"
 systemdir="${serverfiles}/ProjectWar"
 executabledir="${systemdir}/Binaries/Linux"
 executable="./TheFrontServer"
-servercfgdir="${systemdir}/Saved/Config/LinuxServer"
-servercfg="GameUserSettings.ini"
-servercfgdefault="GameUserSettings.ini"
-servercfgfullpath="${servercfgdir}/${servercfg}"
 
 ## Backup Directory
 backupdir="${lgsmdir}/backup"

From 8830bad9a891d3a46a7c010f323c3f76b450e24c Mon Sep 17 00:00:00 2001
From: Daniel Gibbs <me@danielgibbs.co.uk>
Date: Mon, 30 Oct 2023 21:05:32 +0000
Subject: [PATCH 022/154] Feature/stats change (#4363)

* feat: update unsupprted distros and add comments to info_distro

* remove tmux 1.6 code

* add java and tmux version and change ram to int

* tidy up ram requirements

used data gathered from analytics
---
 lgsm/modules/check_deps.sh                |   4 +-
 lgsm/modules/check_system_requirements.sh |  57 ++++---
 lgsm/modules/command_debug.sh             |   2 +-
 lgsm/modules/command_start.sh             |  46 ++----
 lgsm/modules/info_distro.sh               | 184 +++++++++++-----------
 lgsm/modules/info_messages.sh             |   8 +-
 lgsm/modules/info_stats.sh                |  18 ++-
 7 files changed, 154 insertions(+), 165 deletions(-)

diff --git a/lgsm/modules/check_deps.sh b/lgsm/modules/check_deps.sh
index 0f8304a18..b7b9f4758 100644
--- a/lgsm/modules/check_deps.sh
+++ b/lgsm/modules/check_deps.sh
@@ -349,8 +349,8 @@ fi
 # Will warn user if their distro is no longer supported by the vendor.
 if [ -n "${distrosupport}" ]; then
 	if [ "${distrosupport}" == "unsupported" ]; then
-		fn_print_warning_nl "${distroname} is no longer supported by the vendor. Upgrading is recommended."
-		fn_script_log_warn "${distroname} is no longer supported by the vendor. Upgrading is recommended."
+		fn_print_warning_nl "${distroname} is no longer supported by the vendor or LinuxGSM. Upgrading is recommended."
+		fn_script_log_warn "${distroname} is no longer supported by the vendor or LinuxGSM. Upgrading is recommended."
 	fi
 fi
 
diff --git a/lgsm/modules/check_system_requirements.sh b/lgsm/modules/check_system_requirements.sh
index 6932de4dc..bdf1a51c1 100644
--- a/lgsm/modules/check_system_requirements.sh
+++ b/lgsm/modules/check_system_requirements.sh
@@ -12,42 +12,57 @@ info_distro.sh
 # RAM requirements in megabytes for each game or engine.
 
 if [ "${shortname}" == "ark" ]; then
-	ramrequirementmb="4000"
-	ramrequirementgb="4"
+	ramrequirementgb="7"
+elif [ "${shortname}" == "arma3" ]; then
+	ramrequirementgb="2"
+elif [ "${shortname}" == "armar" ]; then
+	ramrequirementgb="3"
 elif [ "${shortname}" == "bt" ]; then
-	ramrequirementmb="1000"
 	ramrequirementgb="1"
-elif [ "${shortname}" == "mh" ]; then
-	ramrequirementmb="4000"
-	ramrequirementgb="4"
-elif [ "${shortname}" == "arma3" ]; then
-	ramrequirementmb="1000"
+elif [ "${shortname}" == "cc" ]; then
 	ramrequirementgb="1"
-elif [ "${shortname}" == "rust" ]; then
-	ramrequirementmb="4000"
+elif [ "${shortname}" == "dayz" ]; then
+	ramrequirementgb="5"
+elif [ "${shortname}" == "dodr" ]; then
+	ramrequirementgb="2"
+elif [ "${shortname}" == "hw" ]; then
+	ramrequirementgb="3"
+elif [ "${shortname}" == "mc" ]; then
+	ramrequirementgb="1"
+elif [ "${shortname}" == "pmc" ]; then
+	ramrequirementgb="2"
+elif [ "${shortname}" == "mh" ]; then
 	ramrequirementgb="4"
-elif [ "${shortname}" == "mc" ] || [ "${shortname}" == "pmc" ] || [ "${shortname}" == "wmc" ]; then
-	ramrequirementmb="1000"
+elif [ "${shortname}" == "ns2" ] || [ "${shortname}" == "ns2c" ]; then
 	ramrequirementgb="1"
 elif [ "${shortname}" == "ps" ]; then
-	ramrequirementmb="2000"
 	ramrequirementgb="2"
-elif [ "${shortname}" == "ns2" ] || [ "${shortname}" == "ns2c" ]; then
-	ramrequirementmb="1000"
+elif [ "${shortname}" == "pvr" ]; then
 	ramrequirementgb="1"
+elif [ "${shortname}" == "pz" ]; then
+	ramrequirementgb="3"
+elif [ "${shortname}" == "rust" ]; then
+	ramrequirementgb="9"
+elif [ "${shortname}" == "sdtd" ]; then
+	ramrequirementgb="4"
+elif [ "${shortname}" == "squad" ]; then
+	ramrequirementgb="2"
 elif [ "${shortname}" == "st" ]; then
-	ramrequirementmb="1000"
 	ramrequirementgb="1"
-elif [ "${shortname}" == "pvr" ]; then
-	ramrequirementmb="2000"
+elif [ "${shortname}" == "stn" ]; then
+	ramrequirementgb="3"
+elif [ "${shortname}" == "tu" ]; then
+	ramrequirementgb="2"
+elif [ "${shortname}" == "vh" ]; then
 	ramrequirementgb="2"
+else
+	ramrequirementgb="0.5"
 fi
 
 # If the game or engine has a minimum RAM Requirement, compare it to system's available RAM.
-if [ "${ramrequirementmb}" ]; then
-	if [ "${physmemtotalmb}" -lt "${ramrequirementmb}" ]; then
+if [ "${ramrequirementgb}" ]; then
+	if [ "${physmemtotalgb}" -lt "${ramrequirementgb}" ]; then
 		fn_print_dots "Checking RAM"
-		# Warn the user.
 		fn_print_warn_nl "Checking RAM: ${ramrequirementgb}G required, ${physmemtotal} available"
 		echo "* ${gamename} server may fail to run or experience poor performance."
 		fn_sleep_time_5
diff --git a/lgsm/modules/command_debug.sh b/lgsm/modules/command_debug.sh
index 495417c16..2e6c0e2e2 100644
--- a/lgsm/modules/command_debug.sh
+++ b/lgsm/modules/command_debug.sh
@@ -34,7 +34,7 @@ fn_print_header
 	echo -e "${lightblue}Architecture:\t\t${default}${arch}"
 	echo -e "${lightblue}Kernel:\t\t${default}${kernel}"
 	echo -e "${lightblue}Hostname:\t\t${default}${HOSTNAME}"
-	echo -e "${lightblue}tmux:\t\t${default}${tmuxv}"
+	echo -e "${lightblue}tmux:\t\t${default}${tmuxversion}"
 	echo -e "${lightblue}Avg Load:\t\t${default}${load}"
 	echo -e "${lightblue}Free Memory:\t\t${default}${physmemfree}"
 	echo -e "${lightblue}Free Disk:\t\t${default}${availspace}"
diff --git a/lgsm/modules/command_start.sh b/lgsm/modules/command_start.sh
index 345ede786..f38125a5e 100644
--- a/lgsm/modules/command_start.sh
+++ b/lgsm/modules/command_start.sh
@@ -73,47 +73,23 @@ fn_start_tmux() {
 	touch "${consolelog}"
 
 	# tmux compiled from source will return "master", therefore ignore it.
-	if [ "${tmuxv}" == "master" ]; then
+	if [ "${tmuxversion}" == "master" ]; then
 		fn_script_log "tmux version: master (user compiled)"
 		echo -e "tmux version: master (user compiled)" >> "${consolelog}"
-		if [ "${consolelogging}" == "on" ] || [ -z "${consolelogging}" ]; then
-			if [ "${logtimestamp}" == "on" ]; then
-				tmux -L "${socketname}" pipe-pane -o -t "${sessionname}" "exec bash -c \"cat | $addtimestamp\" >> '${consolelog}'"
-			else
-				tmux -L "${socketname}" pipe-pane -o -t "${sessionname}" "exec cat >> '${consolelog}'"
-			fi
-		fi
+	fi
 
-	elif [ -n "${tmuxv}" ]; then
-		# tmux pipe-pane not supported in tmux versions < 1.6.
-		if [ "${tmuxvdigit}" -lt "16" ]; then
-			echo -e "Console logging disabled: tmux => 1.6 required
-			https://linuxgsm.com/tmux-upgrade
-			Currently installed: $(tmux -V)" > "${consolelog}"
-
-		# Console logging disabled: Bug in tmux 1.8 breaks logging.
-		elif [ "${tmuxvdigit}" -eq "18" ]; then
-			echo -e "Console logging disabled: Bug in tmux 1.8 breaks logging
-			https://linuxgsm.com/tmux-upgrade
-			Currently installed: $(tmux -V)" > "${consolelog}"
-		# Console logging enable or not set.
-		elif [ "${consolelogging}" == "on" ] || [ -z "${consolelogging}" ]; then
-			if [ "${logtimestamp}" == "on" ]; then
-				tmux -L "${socketname}" pipe-pane -o -t "${sessionname}" "exec bash -c \"cat | $addtimestamp\" >> '${consolelog}'"
-			else
-				tmux -L "${socketname}" pipe-pane -o -t "${sessionname}" "exec cat >> '${consolelog}'"
-			fi
+	# Enable console logging.
+	if [ "${consolelogging}" == "on" ] || [ -z "${consolelogging}" ]; then
+		if [ "${logtimestamp}" == "on" ]; then
+			tmux -L "${socketname}" pipe-pane -o -t "${sessionname}" "exec bash -c \"cat | $addtimestamp\" >> '${consolelog}'"
+		else
+			tmux -L "${socketname}" pipe-pane -o -t "${sessionname}" "exec cat >> '${consolelog}'"
 		fi
 	else
-		echo -e "Unable to detect tmux version" >> "${consolelog}"
-		fn_script_log_warn "Unable to detect tmux version"
-	fi
-
-	# Console logging disabled.
-	if [ "${consolelogging}" == "off" ]; then
 		echo -e "Console logging disabled in settings" >> "${consolelog}"
-		fn_script_log_info "Console logging disabled by user"
+		fn_script_log_info "Console logging disabled in settings"
 	fi
+
 	fn_sleep_time_1
 
 	# If the server fails to start.
@@ -123,7 +99,7 @@ fn_start_tmux() {
 		fn_script_log_fail "Unable to start ${servername}"
 		if [ -s "${lgsmlogdir}/.${selfname}-tmux-error.tmp" ]; then
 			fn_print_fail_nl "Unable to start ${servername}: tmux error:"
-			fn_script_log_fail "Unable to start ${servername}: tmux error:"
+			fn_script_log_fail "Unable to start ${servername}: tmux error"
 			echo -e ""
 			echo -e "Command"
 			fn_messages_separator
diff --git a/lgsm/modules/info_distro.sh b/lgsm/modules/info_distro.sh
index a5607ef45..828946139 100644
--- a/lgsm/modules/info_distro.sh
+++ b/lgsm/modules/info_distro.sh
@@ -21,114 +21,107 @@ fi
 
 ## Distro
 # Returns architecture, kernel and distro/os.
-arch="$(uname -m)"
-kernel="$(uname -r)"
-
-# Distro Name - Ubuntu 16.04 LTS
-# Distro Version - 16.04
-# Distro ID - ubuntu
-# Distro Codename - xenial
+arch="$(uname -m)"   # Architecture e.g. x86_64
+kernel="$(uname -r)" # Kernel e.g. 2.6.32-042stab120.16
 
 # Gathers distro info from various sources filling in missing gaps.
 distro_info_array=(os-release lsb_release hostnamectl debian_version redhat-release)
 for distro_info in "${distro_info_array[@]}"; do
 	if [ -f "/etc/os-release" ] && [ "${distro_info}" == "os-release" ]; then
-		distroname="$(grep "PRETTY_NAME" /etc/os-release | awk -F\= '{gsub(/"/,"",$2);print $2}')"
-		distroversion="$(grep "VERSION_ID" /etc/os-release | awk -F\= '{gsub(/"/,"",$2);print $2}')"
-		# Special var for rhel like distros to removed point in number e.g 8.4 to just 8.
-		distroversionrh="$(sed -nr 's/^VERSION_ID="([0-9]*).+?"/\1/p' /etc/os-release)"
-		distroid="$(grep "ID=" /etc/os-release | grep -v _ID | awk -F\= '{gsub(/"/,"",$2);print $2}')"
-		distroidlike="$(grep "ID_LIKE=" /etc/os-release | grep -v _ID | awk -F\= '{gsub(/"/,"",$2);print $2}')"
-		distrocodename="$(grep "VERSION_CODENAME" /etc/os-release | awk -F\= '{gsub(/"/,"",$2);print $2}')"
+		distroname="$(grep "PRETTY_NAME" /etc/os-release | awk -F\= '{gsub(/"/,"",$2);print $2}')"   # e.g. Ubuntu 22.04.3 LTS
+		distroversion="$(grep "VERSION_ID" /etc/os-release | awk -F\= '{gsub(/"/,"",$2);print $2}')" # e.g. 22.04
+		# Special var for rhel like distros to remove point in number e.g 8.4 to just 8.
+		if [[ "${distroidlike}" == *"rhel"* ]] || [ "${distroid}" == "rhel" ]; then
+			distroversionrh="$(sed -nr 's/^VERSION_ID="([0-9]*).+?"/\1/p' /etc/os-release)" # e.g. 8
+		fi
+		distroid="$(grep "ID=" /etc/os-release | grep -v _ID | awk -F\= '{gsub(/"/,"",$2);print $2}')"          # e.g. ubuntu
+		distroidlike="$(grep "ID_LIKE=" /etc/os-release | grep -v _ID | awk -F\= '{gsub(/"/,"",$2);print $2}')" # e.g. debian
+		distrocodename="$(grep "VERSION_CODENAME" /etc/os-release | awk -F\= '{gsub(/"/,"",$2);print $2}')"     # e.g. jammy
 	elif [ "$(command -v lsb_release 2> /dev/null)" ] && [ "${distro_info}" == "lsb_release" ]; then
 		if [ -z "${distroname}" ]; then
-			distroname="$(lsb_release -sd)"
+			distroname="$(lsb_release -sd)" # e.g. Ubuntu 22.04.3 LTS
 		elif [ -z "${distroversion}" ]; then
-			distroversion="$(lsb_release -sr)"
+			distroversion="$(lsb_release -sr)" # e.g. 22.04
 		elif [ -z "${distroid}" ]; then
-			distroid="$(lsb_release -si)"
+			distroid="$(lsb_release -si)" # e.g. Ubuntu
 		elif [ -z "${distrocodename}" ]; then
-			distrocodename="$(lsb_release -sc)"
+			distrocodename="$(lsb_release -sc)" # e.g. jammy
 		fi
 	elif [ "$(command -v hostnamectl 2> /dev/null)" ] && [ "${distro_info}" == "hostnamectl" ]; then
 		if [ -z "${distroname}" ]; then
-			distroname="$(hostnamectl | grep "Operating System" | sed 's/Operating System: //g')"
+			distroname="$(hostnamectl | grep "Operating System" | sed 's/Operating System: //g')" # e.g. Ubuntu 22.04.3 LTS
 		fi
 	elif [ -f "/etc/debian_version" ] && [ "${distro_info}" == "debian_version" ]; then
 		if [ -z "${distroname}" ]; then
-			distroname="Debian $(cat /etc/debian_version)"
+			distroname="Debian $(cat /etc/debian_version)" # e.g. Debian bookworm/sid
 		elif [ -z "${distroversion}" ]; then
-			distroversion="$(cat /etc/debian_version)"
+			distroversion="$(cat /etc/debian_version)" # e.g. bookworm/sid
 		elif [ -z "${distroid}" ]; then
 			distroid="debian"
 		fi
 	elif [ -f "/etc/redhat-release" ] && [ "${distro_info}" == "redhat-release" ]; then
 		if [ -z "${distroname}" ]; then
-			distroname="$(cat /etc/redhat-release)"
+			distroname="$(cat /etc/redhat-release)" # e.g. Rocky Linux release 9.2 (Blue Onyx)
 		elif [ -z "${distroversion}" ]; then
-			distroversion="$(rpm -qa \*-release | grep -Ei "oracle|redhat|centos|fedora" | cut -d"-" -f3)"
+			distroversion="$(rpm -qa \*-release | grep -Ei "oracle|redhat|centos|fedora|rocky|alma" | cut -d"-" -f3)" # e.g. 9.2
 		elif [ -z "${distroid}" ]; then
-			distroid="$(awk '{print $1}' /etc/redhat-release)"
+			distroid="$(awk '{print $1}' /etc/redhat-release)" # e.g. Rocky
 		fi
 	fi
 done
 
 # Get virtual environment type.
 if [ "$(command -v systemd-detect-virt 2> /dev/null)" ]; then
-	virtualenvironment="$(systemd-detect-virt)"
+	virtualenvironment="$(systemd-detect-virt)" # e.g. kvm
 fi
 
-# Some RHEL based distros use 8.4 instead of just 8.
-if [[ "${distroidlike}" == *"rhel"* ]] || [ "${distroid}" == "rhel" ]; then
-	distroversioncsv="${distroversionrh}"
+# distroversioncsv is used for selecting the correct distro csv in data directory
+if [ -n "${distroversionrh}" ]; then
+	distroversioncsv="${distroversionrh}" # e.g. 8
 else
-	distroversioncsv="${distroversion}"
+	distroversioncsv="${distroversion}" # e.g. 22.04
 fi
 
 # Check if distro supported by distro vendor.
+# distro-info available in debian based distros.
 if [ "$(command -v distro-info 2> /dev/null)" ]; then
 	distrosunsupported="$(distro-info --unsupported)"
 	distrosunsupported_array=("${distrosunsupported}")
 	for distrounsupported in "${distrosunsupported_array[@]}"; do
 		if [ "${distrounsupported}" == "${distrocodename}" ]; then
-			distrosupport=unsupported
+			distrosupport="unsupported"
 			break
 		else
-			distrosupport=supported
+			distrosupport="supported"
 		fi
 	done
-else
-	distrosupport=unknown
+elif [[ "${distroidlike}" == *"rhel"* ]] || [ "${distroid}" == "rhel" ]; then
+	# RHEL/CentOS 7 EOL 2024-06-30. Will be unsupported after this date.
+	if [ "${distroversionrh}" -lt "8" ] && [ "$(date +%s)" -lt "1719705600" ]; then
+		distrosupport="unsupported"
+	else
+		distrosupport="supported"
+	fi
 fi
 
 ## Glibc version
-# e.g: 1.17
-glibcversion="$(ldd --version | sed -n '1s/.* //p')"
+glibcversion="$(ldd --version | sed -n '1s/.* //p')" # e.g: 2.17
 
 ## tmux version
-# e.g: tmux 1.6
-if [ ! "$(command -V tmux 2> /dev/null)" ]; then
-	tmuxv="${red}NOT INSTALLED!${default}"
-	tmuxvdigit="0"
-else
-	tmuxvdigit="$(tmux -V | sed "s/tmux //" | sed -n '1 p' | tr -cd '[:digit:]')"
-	if [ "${tmuxvdigit}" -lt "16" ]; then
-		tmuxv="$(tmux -V) (>= 1.6 required for console log)"
-	else
-		tmuxv="$(tmux -V)"
-	fi
+if [ "$(command -V tmux 2> /dev/null)" ]; then
+	tmuxversion="$(tmux -V | awk '{print $2}')" # e.g: tmux 3.3
 fi
 
 if [ "$(command -V java 2> /dev/null)" ]; then
-	javaversion="$(java -version 2>&1 | grep "version")"
+	javaversion="$(java -version 2>&1 | grep "version")" # e.g: openjdk version "17.0.8.1" 2023-08-24
 fi
 
 if [ "$(command -v mono 2> /dev/null)" ]; then
-	monoversion="$(mono --version 2>&1 | grep -Po '(?<=version )\d')"
+	monoversion="$(mono --version 2>&1 | grep -Po '(?<=version )\d')" # e.g: 6
 fi
 
 if [ "$(command -v dotnet 2> /dev/null)" ]; then
-	dotnetversion="$(dotnet --list-runtimes | grep -E 'Microsoft\.NETCore\.App' | awk '{print $2}')"
+	dotnetversion="$(dotnet --list-runtimes | grep -E 'Microsoft\.NETCore\.App' | awk '{print $2}')" # e.g: 6.0.0
 fi
 
 ## Uptime
@@ -141,16 +134,16 @@ days="$((uptime / 60 / 60 / 24))"
 ### Performance information
 
 ## Average server load
-load="$(uptime | awk -F 'load average: ' '{ print $2 }')"
+load="$(uptime | awk -F 'load average: ' '{ print $2 }')" # e.g 0.01, 0.05, 0.11
 
 ## CPU information
-cpumodel="$(awk -F: '/model name/ {name=$2} END {print name}' /proc/cpuinfo | sed 's/^[ \t]*//;s/[ \t]*$//')"
+cpumodel="$(awk -F: '/model name/ {name=$2} END {print name}' /proc/cpuinfo | sed 's/^[ \t]*//;s/[ \t]*$//')" # e.g Intel(R) Xeon(R) CPU E5-2676 v3 @ 2.40GHz
 cpucores="$(awk -F: '/model name/ {core++} END {print core}' /proc/cpuinfo)"
-cpufreqency="$(awk -F: '/cpu MHz/ {freq=$2} END {print freq}' /proc/cpuinfo | sed 's/^[ \t]*//;s/[ \t]*$//')"
+cpufreqency="$(awk -F: '/cpu MHz/ {freq=$2} END {print freq}' /proc/cpuinfo | sed 's/^[ \t]*//;s/[ \t]*$//')" # e.g 2394.503
 # CPU usage of the game server pid
 if [ -n "${gameserverpid}" ]; then
-	cpuused="$(ps --forest -o pcpu -g "${gameserverpid}" | awk '{s+=$1} END {print s}')"
-	cpuusedmhz="$(echo "${cpufreqency} * ${cpuused} / 100" | bc)"
+	cpuused="$(ps --forest -o pcpu -g "${gameserverpid}" | awk '{s+=$1} END {print s}')" # integer
+	cpuusedmhz="$(echo "${cpufreqency} * ${cpuused} / 100" | bc)"                        # integer
 fi
 
 ## Memory information
@@ -161,36 +154,35 @@ if [ "$(command -v numfmt 2> /dev/null)" ]; then
 	# Issue #2005 - Kernel 3.14+ contains MemAvailable which should be used. All others will be calculated.
 
 	# get the raw KB values of these fields.
-	physmemtotalkb="$(grep MemTotal /proc/meminfo | awk '{print $2}')"
-	physmemfreekb="$(grep ^MemFree /proc/meminfo | awk '{print $2}')"
-	physmembufferskb="$(grep ^Buffers /proc/meminfo | awk '{print $2}')"
-	physmemcachedkb="$(grep ^Cached /proc/meminfo | awk '{print $2}')"
-	physmemreclaimablekb="$(grep ^SReclaimable /proc/meminfo | awk '{print $2}')"
+	physmemtotalkb="$(grep MemTotal /proc/meminfo | awk '{print $2}')"            # integer
+	physmemfreekb="$(grep ^MemFree /proc/meminfo | awk '{print $2}')"             # integer
+	physmembufferskb="$(grep ^Buffers /proc/meminfo | awk '{print $2}')"          # integer
+	physmemcachedkb="$(grep ^Cached /proc/meminfo | awk '{print $2}')"            # integer
+	physmemreclaimablekb="$(grep ^SReclaimable /proc/meminfo | awk '{print $2}')" # integer
 
 	# check if MemAvailable Exists.
 	if grep -q ^MemAvailable /proc/meminfo; then
-		physmemactualfreekb="$(grep ^MemAvailable /proc/meminfo | awk '{print $2}')"
+		physmemactualfreekb="$(grep ^MemAvailable /proc/meminfo | awk '{print $2}')" # integer
 	else
-		physmemactualfreekb="$((physmemfreekb + physmembufferskb + physmemcachedkb))"
+		physmemactualfreekb="$((physmemfreekb + physmembufferskb + physmemcachedkb))" # integer
 	fi
 
 	# Available RAM and swap.
-	physmemtotalmb="$((physmemtotalkb / 1024))"
-	physmemtotal="$(numfmt --to=iec --from=iec --suffix=B "${physmemtotalkb}K")"
-	physmemfree="$(numfmt --to=iec --from=iec --suffix=B "${physmemactualfreekb}K")"
-	physmemused="$(numfmt --to=iec --from=iec --suffix=B "$((physmemtotalkb - physmemfreekb - physmembufferskb - physmemcachedkb - physmemreclaimablekb))K")"
-	physmemavailable="$(numfmt --to=iec --from=iec --suffix=B "${physmemactualfreekb}K")"
-	physmemcached="$(numfmt --to=iec --from=iec --suffix=B "$((physmemcachedkb + physmemreclaimablekb))K")"
-
-	swaptotal="$(numfmt --to=iec --from=iec --suffix=B "$(grep ^SwapTotal /proc/meminfo | awk '{print $2}')K")"
-	swapfree="$(numfmt --to=iec --from=iec --suffix=B "$(grep ^SwapFree /proc/meminfo | awk '{print $2}')K")"
-	swapused="$(numfmt --to=iec --from=iec --suffix=B "$(($(grep ^SwapTotal /proc/meminfo | awk '{print $2}') - $(grep ^SwapFree /proc/meminfo | awk '{print $2}')))K")"
+	physmemtotalmb="$(((physmemtotalkb + 512) / 1024))"                                                                                                       # integer                                                                                                     # integer
+	physmemtotalgb="$(((physmemtotalmb + 512) / 1024))"                                                                                                       # integer                                                                                                   # integer
+	physmemtotal="$(numfmt --to=iec --from=iec --suffix=B "${physmemtotalkb}K")"                                                                              # string
+	physmemfree="$(numfmt --to=iec --from=iec --suffix=B "${physmemactualfreekb}K")"                                                                          # string
+	physmemused="$(numfmt --to=iec --from=iec --suffix=B "$((physmemtotalkb - physmemfreekb - physmembufferskb - physmemcachedkb - physmemreclaimablekb))K")" # string
+	physmemavailable="$(numfmt --to=iec --from=iec --suffix=B "${physmemactualfreekb}K")"                                                                     # string
+	physmemcached="$(numfmt --to=iec --from=iec --suffix=B "$((physmemcachedkb + physmemreclaimablekb))K")"                                                   # string
+
+	swaptotal="$(numfmt --to=iec --from=iec --suffix=B "$(grep ^SwapTotal /proc/meminfo | awk '{print $2}')K")"                                                          # string
+	swapfree="$(numfmt --to=iec --from=iec --suffix=B "$(grep ^SwapFree /proc/meminfo | awk '{print $2}')K")"                                                            # string
+	swapused="$(numfmt --to=iec --from=iec --suffix=B "$(($(grep ^SwapTotal /proc/meminfo | awk '{print $2}') - $(grep ^SwapFree /proc/meminfo | awk '{print $2}')))K")" # string
 	# RAM usage of the game server pid
-	# MB
 	if [ "${gameserverpid}" ]; then
-		memused="$(ps --forest -o rss -g "${gameserverpid}" | awk '{s+=$1} END {print s}' | awk '{$1/=1024;printf "%.0f",$1}{print $2}')"
-		# %
-		pmemused="$(ps --forest -o %mem -g "${gameserverpid}" | awk '{s+=$1} END {print s}')"
+		memusedmb="$(ps --forest -o rss -g "${gameserverpid}" | awk '{s+=$1} END {print s}' | awk '{$1/=1024;printf "%.0f",$1}{print $2}')" # integer
+		memusedpct="$(ps --forest -o %mem -g "${gameserverpid}" | awk '{s+=$1} END {print s}')"                                             # integer
 	fi
 else
 	# Older distros will need to use free.
@@ -203,32 +195,32 @@ else
 	else
 		humanreadable="-h"
 	fi
-	physmemtotalmb="$(free -m | awk '/Mem:/ {print $2}')"
-	physmemtotal="$(free ${humanreadable} | awk '/Mem:/ {print $2}')"
-	physmemfree="$(free ${humanreadable} | awk '/Mem:/ {print $4}')"
-	physmemused="$(free ${humanreadable} | awk '/Mem:/ {print $3}')"
+	physmemtotalmb="$(free -m | awk '/Mem:/ {print $2}')"             # string
+	physmemtotal="$(free ${humanreadable} | awk '/Mem:/ {print $2}')" # string
+	physmemfree="$(free ${humanreadable} | awk '/Mem:/ {print $4}')"  # string
+	physmemused="$(free ${humanreadable} | awk '/Mem:/ {print $3}')"  # string
 
 	oldfree="$(free ${humanreadable} | awk '/cache:/')"
 	if [ "${oldfree}" ]; then
 		physmemavailable="n/a"
 		physmemcached="n/a"
 	else
-		physmemavailable="$(free ${humanreadable} | awk '/Mem:/ {print $7}')"
-		physmemcached="$(free ${humanreadable} | awk '/Mem:/ {print $6}')"
+		physmemavailable="$(free ${humanreadable} | awk '/Mem:/ {print $7}')" # string
+		physmemcached="$(free ${humanreadable} | awk '/Mem:/ {print $6}')"    # string
 	fi
 
-	swaptotal="$(free ${humanreadable} | awk '/Swap:/ {print $2}')"
-	swapused="$(free ${humanreadable} | awk '/Swap:/ {print $3}')"
-	swapfree="$(free ${humanreadable} | awk '/Swap:/ {print $4}')"
+	swaptotal="$(free ${humanreadable} | awk '/Swap:/ {print $2}')" # string
+	swapused="$(free ${humanreadable} | awk '/Swap:/ {print $3}')"  # string
+	swapfree="$(free ${humanreadable} | awk '/Swap:/ {print $4}')"  # string
 fi
 
 ### Disk information
 
 ## Available disk space on the partition.
-filesystem="$(LC_ALL=C df -hP "${rootdir}" | tail -n 1 | awk '{print $1}')"
-totalspace="$(LC_ALL=C df -hP "${rootdir}" | tail -n 1 | awk '{print $2}')"
-usedspace="$(LC_ALL=C df -hP "${rootdir}" | tail -n 1 | awk '{print $3}')"
-availspace="$(LC_ALL=C df -hP "${rootdir}" | tail -n 1 | awk '{print $4}')"
+filesystem="$(LC_ALL=C df -hP "${rootdir}" | tail -n 1 | awk '{print $1}')" # string e.g /dev/sda
+totalspace="$(LC_ALL=C df -hP "${rootdir}" | tail -n 1 | awk '{print $2}')" # string e.g 20G
+usedspace="$(LC_ALL=C df -hP "${rootdir}" | tail -n 1 | awk '{print $3}')"  # string e.g 15G
+availspace="$(LC_ALL=C df -hP "${rootdir}" | tail -n 1 | awk '{print $4}')" # string e.g 5G
 
 ## LinuxGSM used space total.
 rootdirdu="$(du -sh "${rootdir}" 2> /dev/null | awk '{print $1}')"
@@ -263,21 +255,21 @@ if [ -d "${backupdir}" ]; then
 	# If there are backups in backup dir.
 	if [ "$(find "${backupdir}" -name "*.tar.gz" | wc -l)" -ne "0" ]; then
 		# number of backups.
-		backupcount="$(find "${backupdir}"/*.tar.gz | wc -l)"
+		backupcount="$(find "${backupdir}"/*.tar.gz | wc -l)" # integer
 		# most recent backup.
-		lastbackup="$(ls -1t "${backupdir}"/*.tar.gz | head -1)"
+		lastbackup="$(ls -1t "${backupdir}"/*.tar.gz | head -1)" # string
 		# date of most recent backup.
-		lastbackupdate="$(date -r "${lastbackup}")"
+		lastbackupdate="$(date -r "${lastbackup}")" # string
 		# no of days since last backup.
-		lastbackupdaysago="$((($(date +'%s') - $(date -r "${lastbackup}" +'%s')) / 60 / 60 / 24))"
+		lastbackupdaysago="$((($(date +'%s') - $(date -r "${lastbackup}" +'%s')) / 60 / 60 / 24))" # integer
 		# size of most recent backup.
-		lastbackupsize="$(du -h "${lastbackup}" | awk '{print $1}')"
+		lastbackupsize="$(du -h "${lastbackup}" | awk '{print $1}')" # string
 	fi
 fi
 
 # Network Interface name
-netint=$(${ipcommand} -o addr | grep "${ip}" | awk '{print $2}')
-netlink=$(${ethtoolcommand} "${netint}" 2> /dev/null | grep Speed | awk '{print $2}')
+netint=$(${ipcommand} -o addr | grep "${ip}" | awk '{print $2}')                      # e.g eth0
+netlink=$(${ethtoolcommand} "${netint}" 2> /dev/null | grep Speed | awk '{print $2}') # e.g 1000Mb/s
 
 # Sets the SteamCMD glibc requirement if the game server requirement is less or not required.
 if [ "${appid}" ]; then
@@ -286,5 +278,5 @@ if [ "${appid}" ]; then
 	fi
 fi
 
-# Gather Port Info using ss
+# Gather Port Info using ss.
 ssinfo="$(ss -tuplwn)"
diff --git a/lgsm/modules/info_messages.sh b/lgsm/modules/info_messages.sh
index 0b928aa55..926165b28 100644
--- a/lgsm/modules/info_messages.sh
+++ b/lgsm/modules/info_messages.sh
@@ -95,7 +95,7 @@ fn_info_messages_distro() {
 		echo -e "${lightblue}Hostname:\t${default}${HOSTNAME}"
 		echo -e "${lightblue}Environment:\t${default}${virtualenvironment}"
 		echo -e "${lightblue}Uptime:\t${default}${days}d, ${hours}h, ${minutes}m"
-		echo -e "${lightblue}tmux:\t${default}${tmuxv}"
+		echo -e "${lightblue}tmux:\t${default}${tmuxversion}"
 		echo -e "${lightblue}glibc:\t${default}${glibcversion}"
 		if [ -n "${javaram}" ]; then
 			echo -e "${lightblue}Java:\t${default}${javaversion}"
@@ -191,10 +191,10 @@ fn_info_messages_gameserver_resource() {
 			else
 				echo -e "${lightblue}CPU Used:\t${red}unknown${default}"
 			fi
-			if [ -n "${memused}" ]; then
-				echo -e "${lightblue}Mem Used:\t${default}${pmemused}%\t${memused}MB${default}"
+			if [ -n "${memusedmb}" ]; then
+				echo -e "${lightblue}Mem Used:\t${default}${memusedpct}%\t${memusedmb}MB${default}"
 			else
-				echo -e "${lightblue}Mem Used:\t${default}${pmemused}\t${red}unknown${default}"
+				echo -e "${lightblue}Mem Used:\t${default}${memusedpct}\t${red}unknown${default}"
 			fi
 		else
 			echo -e "${lightblue}CPU Used:\t${default}0%${default}"
diff --git a/lgsm/modules/info_stats.sh b/lgsm/modules/info_stats.sh
index 8f0119532..dcc247b59 100644
--- a/lgsm/modules/info_stats.sh
+++ b/lgsm/modules/info_stats.sh
@@ -54,7 +54,10 @@ uuidhardware=$(cat "/etc/machine-id")
 # nearest 100Mhz.
 cpuusedmhzroundup="$(((cpuusedmhz + 99) / 100 * 100))"
 # nearest 100MB
-memusedroundup="$(((memused + 99) / 100 * 100))"
+memusedmbroundup="$(((memusedmb + 99) / 100 * 100))"
+
+# Convert any commas to dots.
+physmemtotal="${physmemtotal//,/.}"
 
 apisecret="A-OzP02TSMWt4_vHi6ZpUw"
 measurementid="G-0CR8V7EMT5"
@@ -66,22 +69,25 @@ payload="{
 		{
 		\"name\": \"LinuxGSM\",
 		\"params\": {
-			\"cpuusedmhzroundup\": \"${cpuusedmhzroundup}MHz\",
+			\"cpuusedmhzroundup\": \"${cpuusedmhzroundup}\",
 			\"diskused\": \"${serverfilesdu}\",
 			\"distro\": \"${distroname}\",
 			\"game\": \"${gamename}\",
-			\"memusedroundup\": \"${memusedroundup}MB\",
-			\"ramused\": \"${memusedroundup}MB\",
+			\"memusedmbroundup\": \"${memusedmbroundup}\",
+			\"ramused\": \"${memusedmbroundup}\",
 			\"servercpu\": \"${cpumodel} ${cpucores} cores\",
 			\"servercpufreq\": \"${cpufreqency} x${cpucores}\",
 			\"serverdisk\": \"${totalspace}\",
 			\"serverfilesdu\": \"${serverfilesdu}\",
 			\"serverram\": \"${physmemtotal}\",
+			\"serverramgb\": \"${physmemtotalgb}\",
 			\"uuidhardware\": \"${uuidhardware}\",
 			\"uuidinstall\": \"${uuidinstall}\",
 			\"uuidinstance\": \"${uuidinstance}\",
 			\"version\": \"${version}\",
-			\"virtualenvironment\": \"${virtualenvironment}\"
+			\"virtualenvironment\": \"${virtualenvironment}\",
+			\"tmuxversion\": \"${tmuxversion}\",
+			\"java\": \"${javaversion}\"
 			}
 		}
 	]
@@ -156,7 +162,7 @@ fn_script_log_info "* uuid-hardware: ${uuidhardware}"
 fn_script_log_info "* Game Name: ${gamename}"
 fn_script_log_info "* Distro Name: ${distroname}"
 fn_script_log_info "* Game Server CPU Used: ${cpuusedmhzroundup}MHz"
-fn_script_log_info "* Game Server RAM Used: ${memusedroundup}MB"
+fn_script_log_info "* Game Server RAM Used: ${memusedmbroundup}MB"
 fn_script_log_info "* Game Server Disk Used: ${serverfilesdu}"
 fn_script_log_info "* Server CPU Model: ${cpumodel}"
 fn_script_log_info "* Server CPU Frequency: ${cpufreqency}"

From 118bb7a229766606ccc4a0d701cf5959b83e470f Mon Sep 17 00:00:00 2001
From: Daniel Gibbs <me@danielgibbs.co.uk>
Date: Fri, 3 Nov 2023 21:26:28 +0000
Subject: [PATCH 023/154] feat(cs2): remove SteamCMD login credentials

The commit removes the SteamCMD login credentials from the default configuration file for Counter-Strike 2 server. Valve has removed the login requirement for cs2
---
 lgsm/config-default/config-lgsm/cs2server/_default.cfg | 4 ----
 1 file changed, 4 deletions(-)

diff --git a/lgsm/config-default/config-lgsm/cs2server/_default.cfg b/lgsm/config-default/config-lgsm/cs2server/_default.cfg
index 820f80379..9ccb7a459 100644
--- a/lgsm/config-default/config-lgsm/cs2server/_default.cfg
+++ b/lgsm/config-default/config-lgsm/cs2server/_default.cfg
@@ -8,10 +8,6 @@
 
 #### Game Server Settings ####
 
-## SteamCMD Login | https://docs.linuxgsm.com/steamcmd#steamcmd-login
-steamuser="username"
-steampass='password'
-
 ## Predefined Parameters | https://docs.linuxgsm.com/configuration/start-parameters
 # https://docs.linuxgsm.com/game-servers/counter-strike-2
 # [Game Modes]						gametype	gamemode	gamemodeflags	skirmishid	mapgroup (you can mix these across all Game Modes except Danger Zone, but use only one)

From dc74deadac27d7017618c8f99f866c22c1655f33 Mon Sep 17 00:00:00 2001
From: Daniel Gibbs <me@danielgibbs.co.uk>
Date: Fri, 3 Nov 2023 21:27:38 +0000
Subject: [PATCH 024/154] Release v23.6.1

---
 lgsm/modules/core_modules.sh | 2 +-
 linuxgsm.sh                  | 2 +-
 2 files changed, 2 insertions(+), 2 deletions(-)

diff --git a/lgsm/modules/core_modules.sh b/lgsm/modules/core_modules.sh
index e851340da..de08c1998 100644
--- a/lgsm/modules/core_modules.sh
+++ b/lgsm/modules/core_modules.sh
@@ -8,7 +8,7 @@
 
 moduleselfname="$(basename "$(readlink -f "${BASH_SOURCE[0]}")")"
 
-modulesversion="v23.6.0"
+modulesversion="v23.6.1"
 
 # Core
 
diff --git a/linuxgsm.sh b/linuxgsm.sh
index 5eb822143..748656bcf 100755
--- a/linuxgsm.sh
+++ b/linuxgsm.sh
@@ -24,7 +24,7 @@ if [ -f ".dev-debug" ]; then
 	set -x
 fi
 
-version="v23.6.0"
+version="v23.6.1"
 shortname="core"
 gameservername="core"
 commandname="CORE"

From 536c65cc5d820b936a2abfe6e988c0698ea6d956 Mon Sep 17 00:00:00 2001
From: Daniel Gibbs <me@danielgibbs.co.uk>
Date: Sun, 5 Nov 2023 14:50:13 +0000
Subject: [PATCH 025/154] fix: correct consoleverbose settings

---
 lgsm/config-default/config-lgsm/colserver/_default.cfg  | 2 +-
 lgsm/config-default/config-lgsm/ctserver/_default.cfg   | 2 +-
 lgsm/config-default/config-lgsm/hcuserver/_default.cfg  | 2 +-
 lgsm/config-default/config-lgsm/sampserver/_default.cfg | 4 ++--
 lgsm/config-default/config-lgsm/wurmserver/_default.cfg | 4 ++--
 5 files changed, 7 insertions(+), 7 deletions(-)

diff --git a/lgsm/config-default/config-lgsm/colserver/_default.cfg b/lgsm/config-default/config-lgsm/colserver/_default.cfg
index 63182f515..1c3b261e2 100644
--- a/lgsm/config-default/config-lgsm/colserver/_default.cfg
+++ b/lgsm/config-default/config-lgsm/colserver/_default.cfg
@@ -136,7 +136,7 @@ querymode="2"
 querytype="protocol-valve"
 
 ## Console type
-consoleverbose="no"
+consoleverbose="yes"
 consoleinteract="no"
 
 ## Game Server Details
diff --git a/lgsm/config-default/config-lgsm/ctserver/_default.cfg b/lgsm/config-default/config-lgsm/ctserver/_default.cfg
index 74bd230c7..ea1ae5229 100644
--- a/lgsm/config-default/config-lgsm/ctserver/_default.cfg
+++ b/lgsm/config-default/config-lgsm/ctserver/_default.cfg
@@ -135,7 +135,7 @@ querymode="1"
 querytype=""
 
 ## Console type
-consoleverbose="no"
+consoleverbose="yes"
 consoleinteract="yes"
 
 ## Game Server Details
diff --git a/lgsm/config-default/config-lgsm/hcuserver/_default.cfg b/lgsm/config-default/config-lgsm/hcuserver/_default.cfg
index 225482c69..af819305c 100644
--- a/lgsm/config-default/config-lgsm/hcuserver/_default.cfg
+++ b/lgsm/config-default/config-lgsm/hcuserver/_default.cfg
@@ -150,7 +150,7 @@ querymode="1"
 querytype=""
 
 ## Console type
-consoleverbose="no"
+consoleverbose="yes"
 consoleinteract="no"
 
 ## Game Server Details
diff --git a/lgsm/config-default/config-lgsm/sampserver/_default.cfg b/lgsm/config-default/config-lgsm/sampserver/_default.cfg
index 1dbeaaccf..510b9a689 100644
--- a/lgsm/config-default/config-lgsm/sampserver/_default.cfg
+++ b/lgsm/config-default/config-lgsm/sampserver/_default.cfg
@@ -126,8 +126,8 @@ querymode="3"
 querytype="samp"
 
 ## Console type
-consoleverbose=""
-consoleinteract=""
+consoleverbose="no"
+consoleinteract="no"
 
 ## Game Server Details
 # Do not edit
diff --git a/lgsm/config-default/config-lgsm/wurmserver/_default.cfg b/lgsm/config-default/config-lgsm/wurmserver/_default.cfg
index 5405be85a..b27783cf4 100644
--- a/lgsm/config-default/config-lgsm/wurmserver/_default.cfg
+++ b/lgsm/config-default/config-lgsm/wurmserver/_default.cfg
@@ -179,8 +179,8 @@ querymode="2"
 querytype="protocol-valve"
 
 ## Console type
-consoleverbose=""
-consoleinteract=""
+consoleverbose="yes"
+consoleinteract="no"
 
 ## Game Server Details
 # Do not edit

From 00cc5364aca273a4df3ffcc1c7c84b2125dfe3a6 Mon Sep 17 00:00:00 2001
From: Daniel Gibbs <me@danielgibbs.co.uk>
Date: Sun, 5 Nov 2023 21:28:20 +0000
Subject: [PATCH 026/154] fix(cs2): added some missing parameters

The start parameters are still a work in progress but I have added some key ones that are missing.
---
 lgsm/config-default/config-lgsm/cs2server/_default.cfg | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/lgsm/config-default/config-lgsm/cs2server/_default.cfg b/lgsm/config-default/config-lgsm/cs2server/_default.cfg
index 9ccb7a459..4eca78e35 100644
--- a/lgsm/config-default/config-lgsm/cs2server/_default.cfg
+++ b/lgsm/config-default/config-lgsm/cs2server/_default.cfg
@@ -44,7 +44,7 @@ tickrate="64"
 gslt=""
 
 ## Server Parameters | https://docs.linuxgsm.com/configuration/start-parameters#additional-parameters
-startparameters="-dedicated +sv_setsteamaccount ${gslt} +map ${defaultmap} +game_type 0 +game_mode 1 +sv_logfile 1 -serverlogging +exec ${selfname}.cfg"
+startparameters="-dedicated -ip ${ip} -port ${port} -maxplayers ${maxplayers} -tickrate ${tickrate} -serverlogging +sv_setsteamaccount ${gslt} +map ${defaultmap} +game_type ${gametype} +game_mode ${gamemode} +sv_game_mode_flags ${gamemodeflags} +sv_skirmish_id ${skirmishid} +sv_logfile 1 +exec ${selfname}.cfg"
 
 #### LinuxGSM Settings ####
 

From 8472ae5664a91d96ebb1cd40f60baa1ccf5d3042 Mon Sep 17 00:00:00 2001
From: Daniel Gibbs <me@danielgibbs.co.uk>
Date: Sun, 5 Nov 2023 21:28:50 +0000
Subject: [PATCH 027/154] Release v23.6.2

---
 lgsm/modules/core_modules.sh | 2 +-
 linuxgsm.sh                  | 2 +-
 2 files changed, 2 insertions(+), 2 deletions(-)

diff --git a/lgsm/modules/core_modules.sh b/lgsm/modules/core_modules.sh
index de08c1998..29249fb0b 100644
--- a/lgsm/modules/core_modules.sh
+++ b/lgsm/modules/core_modules.sh
@@ -8,7 +8,7 @@
 
 moduleselfname="$(basename "$(readlink -f "${BASH_SOURCE[0]}")")"
 
-modulesversion="v23.6.1"
+modulesversion="v23.6.2"
 
 # Core
 
diff --git a/linuxgsm.sh b/linuxgsm.sh
index 748656bcf..8e1d06235 100755
--- a/linuxgsm.sh
+++ b/linuxgsm.sh
@@ -24,7 +24,7 @@ if [ -f ".dev-debug" ]; then
 	set -x
 fi
 
-version="v23.6.1"
+version="v23.6.2"
 shortname="core"
 gameservername="core"
 commandname="CORE"

From 283e6257a0a3e1a343cb273538e8a93e410c15ee Mon Sep 17 00:00:00 2001
From: Daniel Gibbs <me@danielgibbs.co.uk>
Date: Mon, 13 Nov 2023 23:59:21 +0000
Subject: [PATCH 028/154] feat: Update UE4/UE5 parameters and configs (#4378)

* feat(ark): move rconport and maxplayers to config

* feat(sbots): removed ? from parameters

* feat(tu): shuffle parameters and use pascal case

* feat(mom): Pascal Case parameters

* add ohd configs

* re order

* sync with configs

* feat(btl): standardise configs and parameters to match other ue4 games

* standardise

* feat(sf): upgrade to ue5

* add ram requirements to satisfactory

* sf fix

* tidy up parameters

* update ark parameters

* minor changes

* updated the isle to UE5

* add game server docs

* move log

* tidy
---
 lgsm/config-default/config-lgsm/arkserver/_default.cfg   | 5 ++---
 lgsm/config-default/config-lgsm/btlserver/_default.cfg   | 6 +++---
 lgsm/config-default/config-lgsm/hcuserver/_default.cfg   | 2 +-
 lgsm/config-default/config-lgsm/inssserver/_default.cfg  | 6 +++---
 lgsm/config-default/config-lgsm/mhserver/_default.cfg    | 3 ++-
 lgsm/config-default/config-lgsm/momserver/_default.cfg   | 3 ++-
 lgsm/config-default/config-lgsm/ohdserver/_default.cfg   | 4 ++--
 lgsm/config-default/config-lgsm/onsetserver/_default.cfg | 1 +
 lgsm/config-default/config-lgsm/psserver/_default.cfg    | 6 +-----
 lgsm/config-default/config-lgsm/pvrserver/_default.cfg   | 5 +++--
 lgsm/config-default/config-lgsm/sbotsserver/_default.cfg | 2 +-
 lgsm/config-default/config-lgsm/sfserver/_default.cfg    | 7 ++++---
 lgsm/config-default/config-lgsm/squadserver/_default.cfg | 4 ++--
 lgsm/config-default/config-lgsm/tiserver/_default.cfg    | 3 ++-
 lgsm/config-default/config-lgsm/tuserver/_default.cfg    | 2 +-
 lgsm/config-default/config-lgsm/ut3server/_default.cfg   | 2 +-
 lgsm/modules/check_system_requirements.sh                | 2 ++
 lgsm/modules/info_game.sh                                | 2 ++
 lgsm/modules/info_messages.sh                            | 2 +-
 lgsm/modules/install_config.sh                           | 4 ++--
 20 files changed, 38 insertions(+), 33 deletions(-)

diff --git a/lgsm/config-default/config-lgsm/arkserver/_default.cfg b/lgsm/config-default/config-lgsm/arkserver/_default.cfg
index 7f38c974f..123749452 100644
--- a/lgsm/config-default/config-lgsm/arkserver/_default.cfg
+++ b/lgsm/config-default/config-lgsm/arkserver/_default.cfg
@@ -12,14 +12,13 @@
 ip="0.0.0.0"
 port="7777"
 queryport="27015"
-rconport="27020"
 # Default Map: TheIsland, Ragnarok, CrystalIsles, Aberration_P, ScorchedEarth_P, TheCenter, Extinction, Valguero_P, Genesis, Gen2
 defaultmap="TheIsland"
 altsavedirectoryname="${defaultmap}"
-maxplayers="70"
 
 ## Server Parameters | https://docs.linuxgsm.com/configuration/start-parameters#additional-parameters
-startparameters="${defaultmap}?AltSaveDirectoryName=${altsavedirectoryname}?listen?MultiHome=${ip}?MaxPlayers=${maxplayers}?QueryPort=${queryport}?RCONPort=${rconport}?Port=${port} -automanagedmods -crossplay -PublicIPForEpic=${publicip}"
+## Game Server Docs | https://ark.wiki.gg/wiki/Server_configuration
+startparameters="${defaultmap}?AltSaveDirectoryName=${altsavedirectoryname} -MultiHome=${ip} -Port=${port} -QueryPort=${queryport} -AutoManagedMods -Crossplay -PublicIPForEpic=${publicip} -log"
 
 #### LinuxGSM Settings ####
 
diff --git a/lgsm/config-default/config-lgsm/btlserver/_default.cfg b/lgsm/config-default/config-lgsm/btlserver/_default.cfg
index b6cf3da34..dcc49c61c 100644
--- a/lgsm/config-default/config-lgsm/btlserver/_default.cfg
+++ b/lgsm/config-default/config-lgsm/btlserver/_default.cfg
@@ -14,7 +14,7 @@ port="7777"
 queryport="7780"
 
 ## Server Parameters | https://docs.linuxgsm.com/configuration/start-parameters#additional-parameters
-startparameters="/Game/Maps/Final_Maps/Derailed?Game=/Script/ShooterGame.WartideGameMode?listen -log -broadcastip=\"${publicip}\" -PORT=${port} -QueryPort=${queryport} -defgameini=\"${servercfgfullpath}\""
+startparameters="-Port=${port} -QueryPort=${queryport} -BroadcastIp=${publicip} -log"
 
 #### LinuxGSM Settings ####
 
@@ -157,8 +157,8 @@ systemdir="${serverfiles}/Battalion"
 executabledir="${systemdir}/Binaries/Linux"
 executable="./BattalionServer-Linux-Shipping"
 servercfgdir="${systemdir}/Saved/Config/LinuxServer"
-servercfg="${selfname}.ini"
-servercfgdefault="DefaultGame.ini"
+servercfg="Game.ini"
+servercfgdefault="Game.ini"
 servercfgfullpath="${servercfgdir}/${servercfg}"
 
 ## Backup Directory
diff --git a/lgsm/config-default/config-lgsm/hcuserver/_default.cfg b/lgsm/config-default/config-lgsm/hcuserver/_default.cfg
index af819305c..67deef669 100644
--- a/lgsm/config-default/config-lgsm/hcuserver/_default.cfg
+++ b/lgsm/config-default/config-lgsm/hcuserver/_default.cfg
@@ -17,7 +17,7 @@ queryport="27015"
 servername="LinuxGSM"
 
 ## Server Parameters | https://docs.linuxgsm.com/configuration/start-parameters#additional-parameters
-startparameters="${defaultmap}?Difficulty=1?Game=DM?MapList=KidsBedroom,Playground,Garden,Hallway_Simple,Bathroom,Hallway_Hard,Attic_Daytime,Shed,ToyPalace,Kitchen,Garage?MaxPlayers=${maxplayers}?WeaponTypes=7?TimeLimit=600?ScoreLimit=30?Teamplay -ServerName='${servername}' -Port=${port} -QueryPort=${queryport} -NOCONSOLE -unattended"
+startparameters="${defaultmap}?MaxPlayers=${maxplayers} -ServerName='${servername}' -Port=${port} -QueryPort=${queryport}"
 
 ## Server Parameters for Plague mode
 #startparameters="${defaultmap}?Game=PL?MapList=KidsBedroom,Garden,Hallway_Simple,Attic_Daytime,Garage,Shed,Kitchen,Hallway_Hard,ToyPalace,Bathroom?MaxPlayers=${maxplayers}?WeaponTypes=7?TimeLimit=600 -ServerName='${servername}' -Port=${port} -QueryPort=${queryport} -NOCONSOLE -unattended"
diff --git a/lgsm/config-default/config-lgsm/inssserver/_default.cfg b/lgsm/config-default/config-lgsm/inssserver/_default.cfg
index 13addae47..8d14e79ea 100644
--- a/lgsm/config-default/config-lgsm/inssserver/_default.cfg
+++ b/lgsm/config-default/config-lgsm/inssserver/_default.cfg
@@ -15,8 +15,8 @@ queryport="27131"
 rconport="27015"
 rconpassword=""
 servername="LinuxGSM"
-defaultmap="Canyon"
-defaultscenario="Scenario_Crossing_Push_Security"
+defaultmap="Oilfield"
+defaultscenario="Scenario_Refinery_Push_Security"
 maxplayers="28"
 
 ## Game Server Login Token (GSLT): Optional
@@ -25,7 +25,7 @@ maxplayers="28"
 gslt=""
 
 ## Server Parameters | https://docs.linuxgsm.com/configuration/start-parameters#additional-parameters
-## Parameter Docs | https://mod.io/g/insurgencysandstorm/r/server-admin-guide
+## Game Server Docs | https://mod.io/g/insurgencysandstorm/r/server-admin-guide
 startparameters="${defaultmap}?Scenario=${defaultscenario}?MaxPlayers=${maxplayers} -Port=${port} -QueryPort=${queryport} -hostname='${servername}' -Rcon -RconPassword=${rconpassword} -RconListenPort=${rconport} -GSLTToken=${gslt} -log"
 
 #### LinuxGSM Settings ####
diff --git a/lgsm/config-default/config-lgsm/mhserver/_default.cfg b/lgsm/config-default/config-lgsm/mhserver/_default.cfg
index 846aed06e..399d7c96b 100644
--- a/lgsm/config-default/config-lgsm/mhserver/_default.cfg
+++ b/lgsm/config-default/config-lgsm/mhserver/_default.cfg
@@ -17,7 +17,8 @@ queryport="27015"
 defaultmap="FFA_ThePit"
 
 ## Server Parameters | https://docs.linuxgsm.com/configuration/start-parameters#additional-parameters
-startparameters="Mordhau ${defaultmap} -log -MultiHome=${ip} -Port=${port} -BeaconPort=${beaconport} -QueryPort=${queryport} -GameIni=${servercfgfullpath}"
+## Game Server Docs | https://mordhau.fandom.com/wiki/Dedicated_Server_Hosting_Guide
+startparameters="Mordhau ${defaultmap} -MultiHome=${ip} -Port=${port} -BeaconPort=${beaconport} -QueryPort=${queryport} -GameIni=${servercfgfullpath} -log"
 
 #### LinuxGSM Settings ####
 
diff --git a/lgsm/config-default/config-lgsm/momserver/_default.cfg b/lgsm/config-default/config-lgsm/momserver/_default.cfg
index c075067f5..e9b743c00 100644
--- a/lgsm/config-default/config-lgsm/momserver/_default.cfg
+++ b/lgsm/config-default/config-lgsm/momserver/_default.cfg
@@ -14,7 +14,8 @@ port="7777"
 beaconport="15000"
 
 ## Server Parameters | https://docs.linuxgsm.com/configuration/start-parameters#additional-parameters
-startparameters="-port="${port}" -beaconport="${beaconport}" -MULTIHOME="${ip}""
+## Game Server Docs | https://memoriesofmars.fandom.com/wiki/Dedicated_Servers
+startparameters="-MultiHome=${ip} -Port=${port} -BeaconPort=${beaconport} -log"
 
 #### LinuxGSM Settings ####
 
diff --git a/lgsm/config-default/config-lgsm/ohdserver/_default.cfg b/lgsm/config-default/config-lgsm/ohdserver/_default.cfg
index 58a42d3b3..9eaf0d4a5 100644
--- a/lgsm/config-default/config-lgsm/ohdserver/_default.cfg
+++ b/lgsm/config-default/config-lgsm/ohdserver/_default.cfg
@@ -12,14 +12,14 @@
 ip="0.0.0.0"
 port="7777"
 queryport="27005"
+rconport="7778"
 servername="LinuxGSM"
-serverpassword=""
 # Maps: risala, khafji_p, lamdong, montecassino, argonne
 defaultmap="AAS-TestMap"
 maxplayers="16"
 
 ## Server Parameters | https://docs.linuxgsm.com/configuration/start-parameters#additional-parameters
-startparameters="${defaultmap}?MaxPlayers=${maxplayers}?Password=${serverpassword} -Port=${port} -QueryPort=${queryport} -SteamServerName='${servername}' -log"
+startparameters="${defaultmap}?MaxPlayers=${maxplayers} -MultiHome=${ip} -Port=${port} -QueryPort=${queryport} -RconPort=${rconport} -SteamServerName='${servername}' -log"
 
 #### LinuxGSM Settings ####
 
diff --git a/lgsm/config-default/config-lgsm/onsetserver/_default.cfg b/lgsm/config-default/config-lgsm/onsetserver/_default.cfg
index b0f0d00bc..39fc4005c 100644
--- a/lgsm/config-default/config-lgsm/onsetserver/_default.cfg
+++ b/lgsm/config-default/config-lgsm/onsetserver/_default.cfg
@@ -9,6 +9,7 @@
 #### Game Server Settings ####
 
 ## Server Parameters | https://docs.linuxgsm.com/configuration/start-parameters#additional-parameters
+## Game Server Docs | https://dev.playonset.com/wiki/DedicatedServer
 startparameters="--config ${servercfgfullpath}"
 
 #### LinuxGSM Settings ####
diff --git a/lgsm/config-default/config-lgsm/psserver/_default.cfg b/lgsm/config-default/config-lgsm/psserver/_default.cfg
index 143a3349d..e41dee19c 100644
--- a/lgsm/config-default/config-lgsm/psserver/_default.cfg
+++ b/lgsm/config-default/config-lgsm/psserver/_default.cfg
@@ -10,15 +10,11 @@
 
 ## Predefined Parameters | https://docs.linuxgsm.com/configuration/start-parameters
 ip="0.0.0.0"
-maxplayers="40"
 port="10027"
 queryport="10037"
-randommap="NONE"
-reservedslots="0"
-tickrate="50"
 
 ## Server Parameters | https://docs.linuxgsm.com/configuration/start-parameters#additional-parameters
-startparameters="MULTIHOME=${ip} RANDOM=${randommap} Port=${port} QueryPort=${queryport} FIXEDMAXPLAYERS=${maxplayers} FIXEDMAXTICKRATE=${tickrate} NumReservedSlots=${reservedslots}"
+startparameters="-MultiHome=${ip} -Port=${port} -QueryPort=${queryport} -log"
 
 #### LinuxGSM Settings ####
 
diff --git a/lgsm/config-default/config-lgsm/pvrserver/_default.cfg b/lgsm/config-default/config-lgsm/pvrserver/_default.cfg
index c84064900..2cffabe71 100644
--- a/lgsm/config-default/config-lgsm/pvrserver/_default.cfg
+++ b/lgsm/config-default/config-lgsm/pvrserver/_default.cfg
@@ -17,7 +17,8 @@ defaultmap="datacenter"
 apikey=""
 
 ## Server Parameters | https://docs.linuxgsm.com/configuration/start-parameters#additional-parameters
-startparameters="Pavlov ${defaultmap} -log -MultiHome=${ip} -Port=${port} ApiKey=${apikey}"
+## Game Server Docs | http://pavlovwiki.com/index.php/Setting_up_a_dedicated_server
+startparameters="Pavlov ${defaultmap} -MultiHome=${ip} -Port=${port} ApiKey=${apikey} -log"
 
 #### LinuxGSM Settings ####
 
@@ -149,7 +150,7 @@ consoleinteract="no"
 ## Game Server Details
 # Do not edit
 gamename="Pavlov VR"
-engine="unreal4"
+engine="unreal5"
 glibc="2.17"
 
 #### Directories ####
diff --git a/lgsm/config-default/config-lgsm/sbotsserver/_default.cfg b/lgsm/config-default/config-lgsm/sbotsserver/_default.cfg
index ef33b7f9a..3c6e3412e 100644
--- a/lgsm/config-default/config-lgsm/sbotsserver/_default.cfg
+++ b/lgsm/config-default/config-lgsm/sbotsserver/_default.cfg
@@ -15,7 +15,7 @@ defaultmap="StationKappa"
 servername="LinuxGSM"
 
 ## Server Parameters | https://docs.linuxgsm.com/configuration/start-parameters#additional-parameters
-startparameters="Port=${port}?QueryPort=${queryport} -startup_map ${defaultmap} -server_name \"${servername}\""
+startparameters="-MultiHome=${ip} -Port=${port} -QueryPort=${queryport} -startup_map ${defaultmap} -server_name '${servername}'"
 
 #### LinuxGSM Settings ####
 
diff --git a/lgsm/config-default/config-lgsm/sfserver/_default.cfg b/lgsm/config-default/config-lgsm/sfserver/_default.cfg
index 4beb002f6..f889b4866 100644
--- a/lgsm/config-default/config-lgsm/sfserver/_default.cfg
+++ b/lgsm/config-default/config-lgsm/sfserver/_default.cfg
@@ -15,7 +15,8 @@ beaconport="15000"
 port="7777"
 
 ## Server Parameters | https://docs.linuxgsm.com/configuration/start-parameters#additional-parameters
-startparameters="FactoryGame -multihome=${ip} -ServerQueryPort=${queryport} -BeaconPort=${beaconport} -Port=${port} -log -unattended"
+## Game Server Docs | https://satisfactory.fandom.com/wiki/Dedicated_servers
+startparameters="FactoryGame -MultiHome=${ip} -Port=${port} -ServerQueryPort=${queryport} -BeaconPort=${beaconport} -log"
 
 #### LinuxGSM Settings ####
 
@@ -147,7 +148,7 @@ consoleinteract="no"
 ## Game Server Details
 # Do not edit
 gamename="Satisfactory"
-engine="unreal4"
+engine="unreal5"
 glibc="2.17"
 
 #### Directories ####
@@ -156,7 +157,7 @@ glibc="2.17"
 ## Game Server Directories
 systemdir="${serverfiles}/FactoryGame"
 executabledir="${serverfiles}/Engine/Binaries/Linux"
-executable="./UE4Server-Linux-Shipping"
+executable="./UnrealServer-Linux-Shipping"
 servercfgdir="${systemdir}/Saved/Config/LinuxServer"
 servercfg="GameUserSettings.ini"
 servercfgdefault="GameUserSettings.ini"
diff --git a/lgsm/config-default/config-lgsm/squadserver/_default.cfg b/lgsm/config-default/config-lgsm/squadserver/_default.cfg
index 424d81f32..09c0e94b1 100644
--- a/lgsm/config-default/config-lgsm/squadserver/_default.cfg
+++ b/lgsm/config-default/config-lgsm/squadserver/_default.cfg
@@ -11,10 +11,10 @@
 ## Predefined Parameters | https://docs.linuxgsm.com/configuration/start-parameters
 port="7787"
 queryport="27165"
-randommap="ALWAYS"
 
 ## Server Parameters | https://docs.linuxgsm.com/configuration/start-parameters#additional-parameters
-startparameters="MULTIHOME=${ip} RANDOM=${randommap} Port=${port} QueryPort=${queryport}"
+## Game Server Docs | https://squad.fandom.com/wiki/Dedicated_server
+startparameters="-MultiHome=${ip} -Port=${port} -QueryPort=${queryport}"
 
 #### LinuxGSM Settings ####
 
diff --git a/lgsm/config-default/config-lgsm/tiserver/_default.cfg b/lgsm/config-default/config-lgsm/tiserver/_default.cfg
index dd3e1dd90..3141983c9 100644
--- a/lgsm/config-default/config-lgsm/tiserver/_default.cfg
+++ b/lgsm/config-default/config-lgsm/tiserver/_default.cfg
@@ -14,6 +14,7 @@ port="7777"
 defaultmap="/Game/TheIsle/Maps/Game/Isla_Spiro/Isla_Spiro"
 
 ## Server Parameters | https://docs.linuxgsm.com/configuration/start-parameters#additional-parameters
+## Game Server Docs | https://isle.fandom.com/wiki/The_Isle_Server_Settings_and_Configuration
 startparameters="${defaultmap} -Port=${port} -log"
 
 #### LinuxGSM Settings ####
@@ -146,7 +147,7 @@ consoleinteract="no"
 ## Game Server Details
 # Do not edit
 gamename="The Isle"
-engine="unreal4"
+engine="unreal5"
 glibc="2.17"
 
 #### Directories ####
diff --git a/lgsm/config-default/config-lgsm/tuserver/_default.cfg b/lgsm/config-default/config-lgsm/tuserver/_default.cfg
index 086968e98..89c6712bd 100644
--- a/lgsm/config-default/config-lgsm/tuserver/_default.cfg
+++ b/lgsm/config-default/config-lgsm/tuserver/_default.cfg
@@ -19,7 +19,7 @@ queryport="27015"
 gslt=""
 
 ## Server Parameters | https://docs.linuxgsm.com/configuration/start-parameters#additional-parameters
-startparameters="-log -MultiHome=${ip} -Port=${port} -QueryPort=${queryport} -TowerServerINI=${selfname}.ini"
+startparameters="-MultiHome=${ip} -Port=${port} -QueryPort=${queryport} -TowerServerINI=${selfname}.ini -log"
 
 #### LinuxGSM Settings ####
 
diff --git a/lgsm/config-default/config-lgsm/ut3server/_default.cfg b/lgsm/config-default/config-lgsm/ut3server/_default.cfg
index cdadca663..4f0b6a3a0 100644
--- a/lgsm/config-default/config-lgsm/ut3server/_default.cfg
+++ b/lgsm/config-default/config-lgsm/ut3server/_default.cfg
@@ -29,7 +29,7 @@ gspassword=""
 
 ## Server Parameters | https://docs.linuxgsm.com/configuration/start-parameters#additional-parameters
 # List of game types and mutators: https://docs.linuxgsm.com/game-servers/unreal-tournament-3
-startparameters="server ${defaultmap}?Game=${game}?bIsDedicated=${isdedicated}?bIsLanMatch=${islanmatch}?bUsesStats=${usesstats}?bShouldAdvertise=${shouldadvertise}?PureServer=${pureserver}?bAllowJoinInProgress=${allowjoininprogress}?Mutator=${mutators}?ConfigSubDir=${selfname} -login=${gsusername} -password=${gspassword} -port=${port} -queryport=${queryport} -multihome=${ip} -nohomedir -unattended -log=${gamelog}"
+startparameters="server ${defaultmap}?Game=${game}?bIsDedicated=${isdedicated}?bIsLanMatch=${islanmatch}?bUsesStats=${usesstats}?bShouldAdvertise=${shouldadvertise}?PureServer=${pureserver}?bAllowJoinInProgress=${allowjoininprogress}?Mutator=${mutators}?ConfigSubDir=${selfname} -login=${gsusername} -password=${gspassword} -multihome=${ip} -port=${port} -queryport=${queryport} -nohomedir -unattended -log=${gamelog}"
 
 #### LinuxGSM Settings ####
 
diff --git a/lgsm/modules/check_system_requirements.sh b/lgsm/modules/check_system_requirements.sh
index bdf1a51c1..5ffd0c8af 100644
--- a/lgsm/modules/check_system_requirements.sh
+++ b/lgsm/modules/check_system_requirements.sh
@@ -45,6 +45,8 @@ elif [ "${shortname}" == "rust" ]; then
 	ramrequirementgb="9"
 elif [ "${shortname}" == "sdtd" ]; then
 	ramrequirementgb="4"
+elif [ "${shortname}" == "sf" ]; then
+	ramrequirementgb="12"
 elif [ "${shortname}" == "squad" ]; then
 	ramrequirementgb="2"
 elif [ "${shortname}" == "st" ]; then
diff --git a/lgsm/modules/info_game.sh b/lgsm/modules/info_game.sh
index c75f1c239..0365660a6 100644
--- a/lgsm/modules/info_game.sh
+++ b/lgsm/modules/info_game.sh
@@ -287,6 +287,8 @@ fn_info_game_ac() {
 fn_info_game_ark() {
 	if [ -f "${servercfgfullpath}" ]; then
 		fn_info_game_ini "adminpassword" "ServerAdminPassword"
+		fn_info_game_ini "maxplayers" "MaxPlayers"
+		fn_info_game_ini "rconport" "RCONPort"
 		fn_info_game_ini "servername" "SessionName"
 		fn_info_game_ini "serverpassword" "ServerPassword"
 	fi
diff --git a/lgsm/modules/info_messages.sh b/lgsm/modules/info_messages.sh
index 926165b28..abddf9fc6 100644
--- a/lgsm/modules/info_messages.sh
+++ b/lgsm/modules/info_messages.sh
@@ -674,7 +674,7 @@ fn_info_messages_ports_edit() {
 		fi
 	done
 	# engines/games that require editing the start parameters.
-	local ports_edit_array=("av" "ck" "col" "cs2" "fctr" "goldsrc" "hcu" "hw" "iw3.0" "ioquake3" "qfusion" "rust" "scpsl" "scpslsm" "sol" "spark" "source" "unreal4" "arma3" "dayz" "unt" "vh")
+	local ports_edit_array=("av" "ck" "col" "cs2" "fctr" "goldsrc" "hcu" "hw" "iw3.0" "ioquake3" "qfusion" "rust" "scpsl" "scpslsm" "sf" "sol" "spark" "source" "unreal4" "arma3" "dayz" "unt" "vh")
 	for port_edit in "${ports_edit_array[@]}"; do
 		if [ "${engine}" == "${port_edit}" ] || [ "${gamename}" == "${port_edit}" ] || [ "${shortname}" == "${port_edit}" ]; then
 			startparameterslocation="${configdirserver}"
diff --git a/lgsm/modules/install_config.sh b/lgsm/modules/install_config.sh
index 59bcd90f3..45773f63c 100644
--- a/lgsm/modules/install_config.sh
+++ b/lgsm/modules/install_config.sh
@@ -245,7 +245,7 @@ elif [ "${shortname}" == "bt" ]; then
 	fn_list_config_locations
 elif [ "${shortname}" == "btl" ]; then
 	fn_check_cfgdir
-	array_configs+=(DefaultGame.ini)
+	array_configs+=(Game.ini)
 	fn_fetch_default_config
 	fn_default_config_remote
 	fn_set_config_vars
@@ -484,7 +484,7 @@ elif [ "${shortname}" == "hldms" ]; then
 	fn_set_config_vars
 	fn_list_config_locations
 elif [ "${shortname}" == "ohd" ]; then
-	array_configs+=(Game.ini)
+	array_configs+=(Admins.cfg Engine.ini Game.ini MapCycle.cfg)
 	fn_fetch_default_config
 	fn_default_config_remote
 	fn_set_config_vars

From c17c41139b7c9c2f22fe64a8d0d713bcb15dcdfa Mon Sep 17 00:00:00 2001
From: Sascha Moser <28950736+xopez@users.noreply.github.com>
Date: Tue, 14 Nov 2023 01:01:08 +0100
Subject: [PATCH 029/154] fix(gmod): Remove authkey (#4370)

Fixes #4369
---
 lgsm/config-default/config-lgsm/gmodserver/_default.cfg | 4 +---
 1 file changed, 1 insertion(+), 3 deletions(-)

diff --git a/lgsm/config-default/config-lgsm/gmodserver/_default.cfg b/lgsm/config-default/config-lgsm/gmodserver/_default.cfg
index 869628e8c..01ea819f2 100644
--- a/lgsm/config-default/config-lgsm/gmodserver/_default.cfg
+++ b/lgsm/config-default/config-lgsm/gmodserver/_default.cfg
@@ -19,8 +19,6 @@ tickrate="66"
 gamemode="sandbox"
 
 ## Workshop Parameters | https://wiki.facepunch.com/gmod/Workshop_for_Dedicated_Servers
-# To get an API key visit - https://steamcommunity.com/dev/apikey
-wsapikey=""
 wscollectionid=""
 
 ## Game Server Login Token (GSLT): Optional
@@ -29,7 +27,7 @@ wscollectionid=""
 gslt=""
 
 ## Server Parameters | https://docs.linuxgsm.com/configuration/start-parameters#additional-parameters
-startparameters="-game garrysmod -strictportbind -ip ${ip} -port ${port} -tickrate ${tickrate} +host_workshop_collection ${wscollectionid} -authkey ${wsapikey} +clientport ${clientport} +tv_port ${sourcetvport} +gamemode ${gamemode} +map ${defaultmap} +sv_setsteamaccount ${gslt} +servercfgfile ${servercfg} -maxplayers ${maxplayers} -disableluarefresh"
+startparameters="-game garrysmod -strictportbind -ip ${ip} -port ${port} -tickrate ${tickrate} +host_workshop_collection ${wscollectionid} +clientport ${clientport} +tv_port ${sourcetvport} +gamemode ${gamemode} +map ${defaultmap} +sv_setsteamaccount ${gslt} +servercfgfile ${servercfg} -maxplayers ${maxplayers} -disableluarefresh"
 
 #### LinuxGSM Settings ####
 

From efb8426ada187527b09a3fd6d414c43b2fb57b92 Mon Sep 17 00:00:00 2001
From: chris3081 <chris@paradise.id.au>
Date: Tue, 14 Nov 2023 10:02:51 +1000
Subject: [PATCH 030/154] fix(vh): Change ValheimPlus repo and adjust fix_vh
 (#4373)

Change ValheimPlus repo and adjust fix_vh to remove unstripped_contrib folder and comment out all references in scripts to that directory.
---
 lgsm/modules/fix_vh.sh    | 6 ++++++
 lgsm/modules/mods_list.sh | 2 +-
 2 files changed, 7 insertions(+), 1 deletion(-)

diff --git a/lgsm/modules/fix_vh.sh b/lgsm/modules/fix_vh.sh
index c642a1a57..ff02eaddd 100644
--- a/lgsm/modules/fix_vh.sh
+++ b/lgsm/modules/fix_vh.sh
@@ -17,6 +17,12 @@ if [ -f "${modsinstalledlistfullpath}" ]; then
 			echo 'executable="./start_server_bepinex.sh"' >> "${configdirserver}/${selfname}.cfg"
 			executable="./start_server_bepinex.sh"
 		fi
+		if [ -d "${serverfiles}/unstripped_corlib" ]; then
+            rm -rf "${serverfiles}/unstripped_corlib"
+        fi
+        sed -i 's/^dllSearchPathOverride=unstripped_corlib/# &/' "${serverfiles}/doorstop_config.ini"
+    	sed -i 's/^export DOORSTOP_CORLIB_OVERRIDE_PATH="$BASEDIR\/unstripped_corlib"/# &/' "${serverfiles}/start_game_bepinex.sh"
+        sed -i 's/^export DOORSTOP_CORLIB_OVERRIDE_PATH="${VALHEIM_PLUS_PATH}\/unstripped_corlib"/# &/' "${serverfiles}/start_server_bepinex.sh"
 	fi
 	# special exports for BepInEx if installed
 	if grep -qE "^bepinexvh" "${modsinstalledlistfullpath}"; then
diff --git a/lgsm/modules/mods_list.sh b/lgsm/modules/mods_list.sh
index e093124e9..95ab63d99 100644
--- a/lgsm/modules/mods_list.sh
+++ b/lgsm/modules/mods_list.sh
@@ -200,7 +200,7 @@ mod_info_hwoxide=(MOD "hwoxide" "Oxide for Hurtworld" "${oxidehurtworldlatestlin
 mod_info_sdtdoxide=(MOD "sdtdoxide" "Oxide for 7 Days To Die" "${oxidesdtdlatestlink}" "Oxide.SevenDaysToDie.zip" "0" "LowercaseOff" "${systemdir}" "OVERWRITE" "ENGINES" "7 Days To Die;" "NOTGAMES" "https://umod.org/games/7-days-to-die" "Allows for the use of plugins")
 
 # ValheimPlus
-mod_info_valheimplus=(MOD "valheimplus" "Valheim PLUS" "${valeimpluslatestlink}" "ValheimPlus.tar.gz" "0" "LowercaseOff" "${systemdir}" "OVERWRITE" "ENGINES" "Valheim;" "NOTGAMES" "https://github.com/valheimPlus/ValheimPlus" "Mod to improve Valheim gameplay")
+mod_info_valheimplus=(MOD "valheimplus" "Valheim PLUS" "${valeimpluslatestlink}" "ValheimPlus.tar.gz" "0" "LowercaseOff" "${systemdir}" "OVERWRITE" "ENGINES" "Valheim;" "NOTGAMES" "https://github.com/Grantapher/ValheimPlus.git" "Mod to improve Valheim gameplay")
 
 # BepInEx Valheim
 mod_info_bepinexvh=(MOD "bepinexvh" "BepInEx Valheim" "${bepinexvhlatestlink}" "denikson-BepInExPack_Valheim.zip" "0" "LowercaseOff" "${systemdir}" "OVERWRITE" "ENGINES" "Valheim;" "NOTGAMES" "https://valheim.thunderstore.io/package/denikson/BepInExPack_Valheim/" "Unity / XNA game patcher and plugin framework")

From 38e309877759a0423b0ffe578e1e9653cbd75da6 Mon Sep 17 00:00:00 2001
From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com>
Date: Tue, 14 Nov 2023 00:03:13 +0000
Subject: [PATCH 031/154] build(deps): bump github/issue-labeler from 3.2 to
 3.3 (#4375)

Bumps [github/issue-labeler](https://github.com/github/issue-labeler) from 3.2 to 3.3.
- [Release notes](https://github.com/github/issue-labeler/releases)
- [Commits](https://github.com/github/issue-labeler/compare/v3.2...v3.3)

---
updated-dependencies:
- dependency-name: github/issue-labeler
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
---
 .github/workflows/labeler.yml | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/.github/workflows/labeler.yml b/.github/workflows/labeler.yml
index 44beca03d..24174fb22 100644
--- a/.github/workflows/labeler.yml
+++ b/.github/workflows/labeler.yml
@@ -14,7 +14,7 @@ jobs:
     runs-on: ubuntu-latest
     steps:
       - name: Issue Labeler
-        uses: github/issue-labeler@v3.2
+        uses: github/issue-labeler@v3.3
         with:
           repo-token: "${{ secrets.GITHUB_TOKEN }}"
           configuration-path: .github/labeler.yml

From f80a1b69fd5a914c942aa18f083ad510656af328 Mon Sep 17 00:00:00 2001
From: Phillip Birmingham <phillip@pjbsoftware.com>
Date: Fri, 17 Nov 2023 16:03:25 -0600
Subject: [PATCH 032/154] fix(arma3server): remove quotes from around mod list
 in Arma3 server command line (#4288)

* build(deps): bump github/issue-labeler from 3.1 to 3.2 (#4258)

Bumps [github/issue-labeler](https://github.com/github/issue-labeler) from 3.1 to 3.2.
- [Release notes](https://github.com/github/issue-labeler/releases)
- [Commits](https://github.com/github/issue-labeler/compare/v3.1...v3.2)

---
updated-dependencies:
- dependency-name: github/issue-labeler
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>

* remove quotes from around modlist

---------

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
---
 lgsm/config-default/config-lgsm/arma3server/_default.cfg | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/lgsm/config-default/config-lgsm/arma3server/_default.cfg b/lgsm/config-default/config-lgsm/arma3server/_default.cfg
index f89b751ed..f50bf8342 100644
--- a/lgsm/config-default/config-lgsm/arma3server/_default.cfg
+++ b/lgsm/config-default/config-lgsm/arma3server/_default.cfg
@@ -32,7 +32,7 @@ servermods=""
 bepath=""
 
 ## Server Parameters | https://docs.linuxgsm.com/configuration/start-parameters#additional-parameters
-startparameters="-ip=${ip} -port=${port} -cfg=${networkcfgfullpath} -config=${servercfgfullpath} -mod='${mods}' -servermod=${servermods} -bepath=${bepath} -autoinit -loadmissiontomemory"
+startparameters="-ip=${ip} -port=${port} -cfg=${networkcfgfullpath} -config=${servercfgfullpath} -mod=${mods} -servermod=${servermods} -bepath=${bepath} -autoinit -loadmissiontomemory"
 
 #### LinuxGSM Settings ####
 

From 8bc716b456ca34903979d55bf4999583d09c855f Mon Sep 17 00:00:00 2001
From: Daniel Gibbs <me@danielgibbs.co.uk>
Date: Wed, 22 Nov 2023 11:42:52 +0000
Subject: [PATCH 033/154] fix(ark): remove -log parameter as deprecated

---
 lgsm/config-default/config-lgsm/arkserver/_default.cfg | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/lgsm/config-default/config-lgsm/arkserver/_default.cfg b/lgsm/config-default/config-lgsm/arkserver/_default.cfg
index 123749452..73b251731 100644
--- a/lgsm/config-default/config-lgsm/arkserver/_default.cfg
+++ b/lgsm/config-default/config-lgsm/arkserver/_default.cfg
@@ -18,7 +18,7 @@ altsavedirectoryname="${defaultmap}"
 
 ## Server Parameters | https://docs.linuxgsm.com/configuration/start-parameters#additional-parameters
 ## Game Server Docs | https://ark.wiki.gg/wiki/Server_configuration
-startparameters="${defaultmap}?AltSaveDirectoryName=${altsavedirectoryname} -MultiHome=${ip} -Port=${port} -QueryPort=${queryport} -AutoManagedMods -Crossplay -PublicIPForEpic=${publicip} -log"
+startparameters="${defaultmap}?AltSaveDirectoryName=${altsavedirectoryname} -MultiHome=${ip} -Port=${port} -QueryPort=${queryport} -AutoManagedMods -Crossplay -PublicIPForEpic=${publicip}"
 
 #### LinuxGSM Settings ####
 

From c7aedf5a7782050a2c8124f03292683488085105 Mon Sep 17 00:00:00 2001
From: Daniel Gibbs <me@danielgibbs.co.uk>
Date: Wed, 22 Nov 2023 15:16:35 +0000
Subject: [PATCH 034/154]  fix(rust): add default-terminal setting for Oxide
 (#4383)

* fix(rust): add default-terminal setting for Oxide

This commit fixes issue #4268 by adding the line "set -g default-terminal "screen-256color"" to the ~/.tmux.conf file. This ensures compatibility with tmux version 3.3 or higher when running RustDedicated servers with Oxide.Rust.dll.

* add gamelog to start parameters
---
 .../config-lgsm/rustserver/_default.cfg        |  3 ++-
 lgsm/modules/fix_rust.sh                       | 18 ++++++++++++++++++
 2 files changed, 20 insertions(+), 1 deletion(-)

diff --git a/lgsm/config-default/config-lgsm/rustserver/_default.cfg b/lgsm/config-default/config-lgsm/rustserver/_default.cfg
index e04577792..2652bc597 100644
--- a/lgsm/config-default/config-lgsm/rustserver/_default.cfg
+++ b/lgsm/config-default/config-lgsm/rustserver/_default.cfg
@@ -28,7 +28,7 @@ saveinterval="300" # Auto-save in seconds.
 tickrate="30"      # default: 30, range: 15-100.
 
 ## Server Parameters | https://docs.linuxgsm.com/configuration/start-parameters#additional-parameters
-startparameters="-batchmode +app.listenip ${ip} +app.port ${appport} +server.ip ${ip} +server.port ${port} +server.queryport ${queryport} +server.tickrate ${tickrate} +server.hostname \"${servername}\" +server.identity \"${selfname}\" +server.gamemode ${gamemode} +server.level \"${serverlevel}\" +server.seed ${seed} +server.salt ${salt} +server.maxplayers ${maxplayers} +server.worldsize ${worldsize} +server.saveinterval ${saveinterval} +rcon.web ${rconweb} +rcon.ip ${ip} +rcon.port ${rconport} +rcon.password \"${rconpassword}\" -logfile"
+startparameters="-batchmode +app.listenip ${ip} +app.port ${appport} +server.ip ${ip} +server.port ${port} +server.queryport ${queryport} +server.tickrate ${tickrate} +server.hostname \"${servername}\" +server.identity \"${selfname}\" +server.gamemode ${gamemode} +server.level \"${serverlevel}\" +server.seed ${seed} +server.salt ${salt} +server.maxplayers ${maxplayers} +server.worldsize ${worldsize} +server.saveinterval ${saveinterval} +rcon.web ${rconweb} +rcon.ip ${ip} +rcon.port ${rconport} +rcon.password \"${rconpassword}\" -logfile ${gamelog}"
 
 #### LinuxGSM Settings ####
 
@@ -184,6 +184,7 @@ backupdir="${lgsmdir}/backup"
 gamelogdir="${logdir}/server"
 lgsmlogdir="${logdir}/script"
 consolelogdir="${logdir}/console"
+gamelog="${gamelogdir}/${selfname}-game.log"
 lgsmlog="${lgsmlogdir}/${selfname}-script.log"
 consolelog="${consolelogdir}/${selfname}-console.log"
 alertlog="${lgsmlogdir}/${selfname}-alert.log"
diff --git a/lgsm/modules/fix_rust.sh b/lgsm/modules/fix_rust.sh
index 6d4cebc01..809b5b1df 100644
--- a/lgsm/modules/fix_rust.sh
+++ b/lgsm/modules/fix_rust.sh
@@ -30,3 +30,21 @@ if [ -f "${serverfiles}/carbon/tools/environment.sh" ]; then
 	# shellcheck source=/dev/null
 	source "${serverfiles}/carbon/tools/environment.sh"
 fi
+
+# fix for #4268
+# insert set -g default-terminal "screen-256color" into ~/.tmux.conf
+if [ -f "${serverfiles}/RustDedicated_Data/Managed/Oxide.Rust.dll" ]; then
+	# tmux version is 3.3 or higher
+	tmuxvdigit="$(tmux -V | sed "s/tmux //" | sed -n '1 p' | tr -cd '[:digit:]')"
+	if [ "${tmuxvdigit}" -ge "33" ]; then
+		if [ ! -f "${HOME}/.tmux.conf" ]; then
+			touch "${HOME}/.tmux.conf"
+		fi
+		if ! grep -q "set -g default-terminal \"screen-256color\"" "${HOME}/.tmux.conf"; then
+			fixname="tmux screen-256color"
+			fn_fix_msg_start
+			echo "set -g default-terminal \"screen-256color\"" >> "${HOME}/.tmux.conf"
+			fn_fix_msg_end
+		fi
+	fi
+fi

From 2122a6b390b44c7cbacb3fa1fbcf3548b644eefd Mon Sep 17 00:00:00 2001
From: Daniel Gibbs <me@danielgibbs.co.uk>
Date: Wed, 22 Nov 2023 15:16:59 +0000
Subject: [PATCH 035/154] feat(backup): add tmpdir to backup exclusion (#4386)

---
 lgsm/modules/command_backup.sh | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/lgsm/modules/command_backup.sh b/lgsm/modules/command_backup.sh
index 55981e19e..e0ef3f0a1 100644
--- a/lgsm/modules/command_backup.sh
+++ b/lgsm/modules/command_backup.sh
@@ -126,7 +126,7 @@ fn_backup_compression() {
 		core_exit.sh
 	fi
 
-	tar -czf "${backupdir}/${backupname}.tar.gz" -C "${rootdir}" --exclude "${excludedir}" --exclude "${lockdir}" ./.
+	tar -czf "${backupdir}/${backupname}.tar.gz" -C "${rootdir}" --exclude "${excludedir}" --exclude "${lockdir}" --exclude "${tmpdir}" ./.
 	local exitcode=$?
 	if [ "${exitcode}" != 0 ]; then
 		fn_print_fail_eol

From dea17e9d9ade814a2f963cec49411685eeb53fc0 Mon Sep 17 00:00:00 2001
From: Daniel Gibbs <me@danielgibbs.co.uk>
Date: Fri, 24 Nov 2023 12:39:52 +0000
Subject: [PATCH 036/154] feat: add port command for DayZ server

This commit adds a new port command for the DayZ server in the info_messages.sh file. The port command is used to retrieve information about the DayZ server's ports using the "enfMain" keyword.
---
 lgsm/modules/info_messages.sh | 2 ++
 1 file changed, 2 insertions(+)

diff --git a/lgsm/modules/info_messages.sh b/lgsm/modules/info_messages.sh
index abddf9fc6..59d876fcc 100644
--- a/lgsm/modules/info_messages.sh
+++ b/lgsm/modules/info_messages.sh
@@ -692,6 +692,8 @@ fn_info_messages_ports() {
 		portcommand="ss -tuplwn | grep AvorionServer"
 	elif [ "${shortname}" == "bf1942" ]; then
 		portcommand="ss -tuplwn | grep bf1942_lnxded"
+	elif [ "${shortname}" == "dayz" ]; then
+		portcommand="ss -tuplwn | grep enfMain"
 	elif [ "${shortname}" == "mc" ] || [ "${shortname}" == "nec" ] || [ "${shortname}" == "pmc" ] || [ "${shortname}" == "vpmc" ] || [ "${shortname}" == "wmc" ]; then
 		portcommand="ss -tuplwn | grep java"
 	elif [ "${shortname}" == "terraria" ]; then

From e78a9dfbd79e122d5fda08a79d1a44184d08fd8a Mon Sep 17 00:00:00 2001
From: Daniel Gibbs <me@danielgibbs.co.uk>
Date: Fri, 24 Nov 2023 13:04:59 +0000
Subject: [PATCH 037/154] feat(dayz): enable Steam master server

Enables the Steam master server in the default configuration file for DayZ servers.
---
 lgsm/config-default/config-lgsm/dayzserver/_default.cfg | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/lgsm/config-default/config-lgsm/dayzserver/_default.cfg b/lgsm/config-default/config-lgsm/dayzserver/_default.cfg
index ed9e8783c..0d5bf5e3e 100644
--- a/lgsm/config-default/config-lgsm/dayzserver/_default.cfg
+++ b/lgsm/config-default/config-lgsm/dayzserver/_default.cfg
@@ -128,7 +128,7 @@ steamcmdforcewindows="no"
 branch=""
 betapassword=""
 # Master Server | https://docs.linuxgsm.com/steamcmd/steam-master-server
-steammaster="false"
+steammaster="true"
 
 ## Stop Mode | https://docs.linuxgsm.com/features/stop-mode
 # 1: tmux kill

From ef3114b5c083e5e444ebc177736c4a4ad20c1ea8 Mon Sep 17 00:00:00 2001
From: Daniel Gibbs <me@danielgibbs.co.uk>
Date: Sat, 25 Nov 2023 01:18:33 +0000
Subject: [PATCH 038/154] fix(nmrih): add if statements for symlink fixes

This commit fixes an issue where certain server files were missing. Symbolic links are now created for the following files if they do not already exist: vphysics.so, studiorender.so, soundemittersystem.so, shaderapiempty.so, scenefilecache.so, replay.so, and materialsystem.so.
---
 lgsm/modules/fix_nmrih.sh | 28 +++++++++++++++++++++-------
 1 file changed, 21 insertions(+), 7 deletions(-)

diff --git a/lgsm/modules/fix_nmrih.sh b/lgsm/modules/fix_nmrih.sh
index 83a5ad412..dfbb76d92 100644
--- a/lgsm/modules/fix_nmrih.sh
+++ b/lgsm/modules/fix_nmrih.sh
@@ -8,10 +8,24 @@
 
 moduleselfname="$(basename "$(readlink -f "${BASH_SOURCE[0]}")")"
 
-ln -s "${serverfiles}/bin/vphysics_srv.so" "${serverfiles}/bin/vphysics.so"
-ln -s "${serverfiles}/bin/studiorender_srv.so" "${serverfiles}/bin/studiorender.so"
-ln -s "${serverfiles}/bin/soundemittersystem_srv.so" "${serverfiles}/bin/soundemittersystem.so"
-ln -s "${serverfiles}/bin/shaderapiempty_srv.so" "${serverfiles}/bin/shaderapiempty.so"
-ln -s "${serverfiles}/bin/scenefilecache_srv.so" "${serverfiles}/bin/scenefilecache.so"
-ln -s "${serverfiles}/bin/replay_srv.so" "${serverfiles}/bin/replay.so"
-ln -s "${serverfiles}/bin/materialsystem_srv.so" "${serverfiles}/bin/materialsystem.so"
+if [ ! -f "${serverfiles}/bin/vphysics.so" ]; then
+	ln -s "${serverfiles}/bin/vphysics_srv.so" "${serverfiles}/bin/vphysics.so"
+fi
+if [ ! -f "${serverfiles}/bin/studiorender.so" ]; then
+	ln -s "${serverfiles}/bin/studiorender_srv.so" "${serverfiles}/bin/studiorender.so"
+fi
+if [ ! -f "${serverfiles}/bin/soundemittersystem.so" ]; then
+	ln -s "${serverfiles}/bin/soundemittersystem_srv.so" "${serverfiles}/bin/soundemittersystem.so"
+fi
+if [ ! -f "${serverfiles}/bin/shaderapiempty.so" ]; then
+	ln -s "${serverfiles}/bin/shaderapiempty_srv.so" "${serverfiles}/bin/shaderapiempty.so"
+fi
+if [ ! -f "${serverfiles}/bin/scenefilecache.so" ]; then
+	ln -s "${serverfiles}/bin/scenefilecache_srv.so" "${serverfiles}/bin/scenefilecache.so"
+fi
+if [ ! -f "${serverfiles}/bin/replay.so" ]; then
+	ln -s "${serverfiles}/bin/replay_srv.so" "${serverfiles}/bin/replay.so"
+fi
+if [ ! -f "${serverfiles}/bin/materialsystem.so" ]; then
+	ln -s "${serverfiles}/bin/materialsystem_srv.so" "${serverfiles}/bin/materialsystem.so"
+fi

From 6f811a5a19005b187fd7f7cc935c4a7bc7ab7215 Mon Sep 17 00:00:00 2001
From: Daniel Gibbs <me@danielgibbs.co.uk>
Date: Sat, 25 Nov 2023 21:19:23 +0000
Subject: [PATCH 039/154] fix: only run extra steamcmd command if using GitHub
 Actions

---
 lgsm/modules/core_steamcmd.sh | 4 +++-
 1 file changed, 3 insertions(+), 1 deletion(-)

diff --git a/lgsm/modules/core_steamcmd.sh b/lgsm/modules/core_steamcmd.sh
index e628e44b9..326fecf70 100644
--- a/lgsm/modules/core_steamcmd.sh
+++ b/lgsm/modules/core_steamcmd.sh
@@ -179,7 +179,9 @@ fn_update_steamcmd_remotebuild() {
 	fi
 
 	# added as was failing GitHub Actions test. Running SteamCMD twice seems to fix it.
-	${steamcmdcommand} +login "${steamuser}" "${steampass}" +app_info_update 1 +quit > /dev/null 2>&1
+	if [ "${CI}" ]; then
+		${steamcmdcommand} +login "${steamuser}" "${steampass}" +app_info_update 1 +quit > /dev/null 2>&1
+	fi
 	# password for branch not needed to check the buildid
 	remotebuildversion=$(${steamcmdcommand} +login "${steamuser}" "${steampass}" +app_info_update 1 +app_info_print "${appid}" +quit | sed -e '/"branches"/,/^}/!d' | sed -n "/\"${branch}\"/,/}/p" | grep -m 1 buildid | tr -cd '[:digit:]')
 

From 433444a1e7a5ea7baf4bd8023b80fdb4623d93d1 Mon Sep 17 00:00:00 2001
From: Daniel Gibbs <me@danielgibbs.co.uk>
Date: Sat, 25 Nov 2023 21:19:44 +0000
Subject: [PATCH 040/154] fix: word change

---
 lgsm/modules/core_getopt.sh | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/lgsm/modules/core_getopt.sh b/lgsm/modules/core_getopt.sh
index 1003839ea..685e1ce8b 100644
--- a/lgsm/modules/core_getopt.sh
+++ b/lgsm/modules/core_getopt.sh
@@ -22,7 +22,7 @@ cmd_update_linuxgsm=("ul;update-lgsm;uf;update-modules" "command_update_linuxgsm
 cmd_test_alert=("ta;test-alert" "command_test_alert.sh" "Send a test alert.")
 cmd_monitor=("m;monitor" "command_monitor.sh" "Check server status and restart if crashed.")
 cmd_skeleton=("sk;skeleton" "command_skeleton.sh" "Create a skeleton directory.")
-cmd_sponsor=("s;sponsor" "command_sponsor.sh" "Donation options.")
+cmd_sponsor=("s;sponsor" "command_sponsor.sh" "Sponsorship options.")
 cmd_send=("sd;send" "command_send.sh" "Send command to game server console.")
 # Console servers only.
 cmd_console=("c;console" "command_console.sh" "Access server console.")

From 9598fccdbd700426809a1bb9a02f8d7201c7aac4 Mon Sep 17 00:00:00 2001
From: Daniel Gibbs <me@danielgibbs.co.uk>
Date: Sat, 25 Nov 2023 22:00:06 +0000
Subject: [PATCH 041/154] fix(install): non-free is now correctly detected
 (#4390)

Debian has added non-free-firmware repo. This was being detected alongside non-free and causing issues with steamcmd installation. this fix ensures non-free is only detected.
---
 lgsm/modules/check_deps.sh | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/lgsm/modules/check_deps.sh b/lgsm/modules/check_deps.sh
index b7b9f4758..f92a60840 100644
--- a/lgsm/modules/check_deps.sh
+++ b/lgsm/modules/check_deps.sh
@@ -252,7 +252,7 @@ fn_deps_detector() {
 	elif [ "${deptocheck}" == "steamcmd" ] && [ -z "${appid}" ]; then
 		array_deps_required=("${array_deps_required[@]/steamcmd/}")
 		steamcmdstatus=1
-	elif [ "${deptocheck}" == "steamcmd" ] && [ "${distroid}" == "debian" ] && ! grep -qE "^deb .*non-free" /etc/apt/sources.list; then
+	elif [ "${deptocheck}" == "steamcmd" ] && [ "${distroid}" == "debian" ] && ! grep -qE '[^deb]+non-free([^-]|$)' /etc/apt/sources.list; then
 		array_deps_required=("${array_deps_required[@]/steamcmd/}")
 		steamcmdstatus=1
 	# Java: Added for users using Oracle JRE to bypass check.

From 3ebc5febbfeb156eded4f02e0ed9e37b05bf6fcb Mon Sep 17 00:00:00 2001
From: Daniel Gibbs <me@danielgibbs.co.uk>
Date: Sat, 25 Nov 2023 23:25:11 +0000
Subject: [PATCH 042/154] fix(kf): ensure newer steamclient.so is copied to
 serverfiles (#4391)

* master server true
* move samp fix to pre start
* bug
* fix(kf): ensure newer steamclient.so is copied to serverfiles
will allow KF Server to how in steam game server list
---
 .../config-lgsm/kfserver/_default.cfg         |   2 +-
 lgsm/modules/fix.sh                           |   4 +-
 lgsm/modules/fix_armar.sh                     |   2 +-
 lgsm/modules/fix_kf.sh                        | 129 ++++++++++++++----
 4 files changed, 109 insertions(+), 28 deletions(-)

diff --git a/lgsm/config-default/config-lgsm/kfserver/_default.cfg b/lgsm/config-default/config-lgsm/kfserver/_default.cfg
index 4aa128830..969c5c65c 100644
--- a/lgsm/config-default/config-lgsm/kfserver/_default.cfg
+++ b/lgsm/config-default/config-lgsm/kfserver/_default.cfg
@@ -121,7 +121,7 @@ steamcmdforcewindows="no"
 branch=""
 betapassword=""
 # Master Server | https://docs.linuxgsm.com/steamcmd/steam-master-server
-steammaster="false"
+steammaster="true"
 
 ## Stop Mode | https://docs.linuxgsm.com/features/stop-mode
 # 1: tmux kill
diff --git a/lgsm/modules/fix.sh b/lgsm/modules/fix.sh
index 2f8b5442a..280112728 100644
--- a/lgsm/modules/fix.sh
+++ b/lgsm/modules/fix.sh
@@ -52,8 +52,8 @@ fn_apply_fix() {
 	fi
 }
 
-apply_pre_start_fix=(arma3 armar ark av bt bo csgo cmw dst hw ins nmrih onset pvr rust rw sdtd sfc sof2 squad st tf2 terraria ts3 mcb mta unt vh wurm zmr)
-apply_post_install_fix=(av kf kf2 ro samp ut2k4 ut ut3)
+apply_pre_start_fix=(arma3 armar ark av bt bo csgo cmw dst hw ins kf nmrih onset pvr rust rw samp sdtd sfc sof2 squad st tf2 terraria ts3 mcb mta unt vh wurm zmr)
+apply_post_install_fix=(av kf kf2 ro ut2k4 ut ut3)
 
 # validate registered fixes for safe development
 for fix in "${apply_pre_start_fix[@]}" "${apply_post_install_fix[@]}"; do
diff --git a/lgsm/modules/fix_armar.sh b/lgsm/modules/fix_armar.sh
index 6b68c2a63..ae2c08f33 100755
--- a/lgsm/modules/fix_armar.sh
+++ b/lgsm/modules/fix_armar.sh
@@ -5,7 +5,7 @@
 # Website: https://linuxgsm.com
 # Description: Resolves issues with Arma Reforger.
 
-module_selfname="$(basename "$(readlink -f "${BASH_SOURCE[0]}")")"
+moduleselfname="$(basename "$(readlink -f "${BASH_SOURCE[0]}")")"
 
 # Fixes: Profile directory doesn't exist.
 # Issue Link: https://feedback.bistudio.com/T164845
diff --git a/lgsm/modules/fix_kf.sh b/lgsm/modules/fix_kf.sh
index 1bec47a4b..e38b5883a 100644
--- a/lgsm/modules/fix_kf.sh
+++ b/lgsm/modules/fix_kf.sh
@@ -7,30 +7,111 @@
 
 moduleselfname="$(basename "$(readlink -f "${BASH_SOURCE[0]}")")"
 
-echo -e "applying WebAdmin ROOst.css fix."
-echo -e "http://forums.tripwireinteractive.com/showpost.php?p=585435&postcount=13"
+# echo -e "applying WebAdmin ROOst.css fix."
+# echo -e "http://forums.tripwireinteractive.com/showpost.php?p=585435&postcount=13"
 sed -i 's/none}/none;/g' "${serverfiles}/Web/ServerAdmin/ROOst.css"
 sed -i 's/underline}/underline;/g' "${serverfiles}/Web/ServerAdmin/ROOst.css"
-fn_sleep_time
-echo -e "applying WebAdmin CharSet fix."
-echo -e "http://forums.tripwireinteractive.com/showpost.php?p=442340&postcount=1"
+# echo -e "applying WebAdmin CharSet fix."
+# echo -e "http://forums.tripwireinteractive.com/showpost.php?p=442340&postcount=1"
 sed -i 's/CharSet="iso-8859-1"/CharSet="utf-8"/g' "${systemdir}/UWeb.int"
-fn_sleep_time
-echo -e "applying server name fix."
-fn_sleep_time
-echo -e "forcing server restart..."
-fn_sleep_time
-exitbypass=1
-command_start.sh
-fn_firstcommand_reset
-fn_sleep_time_5
-exitbypass=1
-command_stop.sh
-fn_firstcommand_reset
-exitbypass=1
-command_start.sh
-fn_firstcommand_reset
-fn_sleep_time_5
-exitbypass=1
-command_stop.sh
-fn_firstcommand_reset
+
+# get md5sum of steamclient.so
+if [ -f "${serverfiles}/System/steamclient.so" ]; then
+	steamclientmd5=$(md5sum "${serverfiles}/System/steamclient.so" | awk '{print $1;}')
+fi
+#get md5sum of libtier0_s.so
+if [ -f "${serverfiles}/System/libtier0_s.so" ]; then
+	libtier0_smd5=$(md5sum "${serverfiles}/System/libtier0_s.so" | awk '{print $1;}')
+fi
+#get md5sum of libvstdlib_s.so
+if [ -f "${serverfiles}/System/libvstdlib_s.so" ]; then
+	libvstdlib_smd5=$(md5sum "${serverfiles}/System/libvstdlib_s.so" | awk '{print $1;}')
+fi
+
+# get md5sum of steamclient.so from steamcmd
+if [ -f "${HOME}/.steam/steamcmd/linux32/steamclient.so" ]; then
+	steamcmdsteamclientmd5=$(md5sum "${HOME}/.steam/steamcmd/linux32/steamclient.so" | awk '{print $1;}')
+elif [ -f "${steamcmddir}/linux32/steamclient.so" ]; then
+	steamcmdsteamclientmd5=$(md5sum "${steamcmddir}/linux32/steamclient.so" | awk '{print $1;}')
+elif [ -f "${HOME}/.local/share/Steam/steamcmd/linux32/steamclient.so" ]; then
+	steamcmdsteamclientmd5=$(md5sum "${HOME}/.local/share/Steam/steamcmd/linux32/steamclient.so" | awk '{print $1;}')
+fi
+
+# get md5sum of libtier0_s.so from steamcmd
+if [ -f "${HOME}/.steam/steamcmd/linux32/libtier0_s.so" ]; then
+	steamcmdlibtier0_smd5=$(md5sum "${HOME}/.steam/steamcmd/linux32/libtier0_s.so" | awk '{print $1;}')
+elif [ -f "${steamcmddir}/linux32/libtier0_s.so" ]; then
+	steamcmdlibtier0_smd5=$(md5sum "${steamcmddir}/linux32/libtier0_s.so" | awk '{print $1;}')
+elif [ -f "${HOME}/.local/share/Steam/steamcmd/linux32/libtier0_s.so" ]; then
+	steamcmdlibtier0_smd5=$(md5sum "${HOME}/.local/share/Steam/steamcmd/linux32/libtier0_s.so" | awk '{print $1;}')
+fi
+
+# get md5sum of libvstdlib_s.so from steamcmd
+if [ -f "${HOME}/.steam/steamcmd/linux32/libvstdlib_s.so" ]; then
+	steamcmdlibvstdlib_smd5=$(md5sum "${HOME}/.steam/steamcmd/linux32/libvstdlib_s.so" | awk '{print $1;}')
+elif [ -f "${steamcmddir}/linux32/libvstdlib_s.so" ]; then
+	steamcmdlibvstdlib_smd5=$(md5sum "${steamcmddir}/linux32/libvstdlib_s.so" | awk '{print $1;}')
+elif [ -f "${HOME}/.local/share/Steam/steamcmd/linux32/libvstdlib_s.so" ]; then
+	steamcmdlibvstdlib_smd5=$(md5sum "${HOME}/.local/share/Steam/steamcmd/linux32/libvstdlib_s.so" | awk '{print $1;}')
+fi
+
+if [ ! -f "${serverfiles}/System/steamclient.so" ] || [ "${steamcmdsteamclientmd5}" != "${steamclientmd5}" ]; then
+	fixname="steamclient.so x86"
+	fn_fix_msg_start
+	if [ -f "${HOME}/.steam/steamcmd/linux32/steamclient.so" ]; then
+		cp "${HOME}/.steam/steamcmd/linux32/steamclient.so" "${serverfiles}/System/steamclient.so"
+	elif [ -f "${steamcmddir}/linux32/steamclient.so" ]; then
+		cp "${steamcmddir}/linux32/steamclient.so" "${serverfiles}/System/steamclient.so"
+	elif [ -f "${HOME}/.local/share/Steam/steamcmd/linux32/steamclient.so" ]; then
+		cp "${HOME}/.local/share/Steam/steamcmd/linux32/steamclient.so" "${serverfiles}/System/steamclient.so"
+	fi
+	fn_fix_msg_end
+fi
+
+if [ ! -f "${serverfiles}/System/libtier0_s.so" ] || [ "${steamcmdlibtier0_smd5}" != "${libtier0_smd5}" ]; then
+	fixname="libtier0_s.so"
+	fn_fix_msg_start
+	if [ -f "${HOME}/.steam/steamcmd/linux32/libtier0_s.so" ]; then
+		cp "${HOME}/.steam/steamcmd/linux32/libtier0_s.so" "${serverfiles}/System/libtier0_s.so"
+	elif [ -f "${steamcmddir}/linux32/libtier0_s.so" ]; then
+		cp "${steamcmddir}/linux32/libtier0_s.so" "${serverfiles}/System/libtier0_s.so"
+	elif [ -f "${HOME}/.local/share/Steam/steamcmd/linux32/libtier0_s.so" ]; then
+		cp "${HOME}/.local/share/Steam/steamcmd/linux32/libtier0_s.so" "${serverfiles}/System/libtier0_s.so"
+	fi
+	fn_fix_msg_end
+fi
+
+if [ ! -f "${serverfiles}/System/libvstdlib_s.so" ] || [ "${steamcmdlibvstdlib_smd5}" != "${libvstdlib_smd5}" ]; then
+	fixname="libvstdlib_s.so"
+	fn_fix_msg_start
+	if [ -f "${HOME}/.steam/steamcmd/linux32/libvstdlib_s.so" ]; then
+		cp "${HOME}/.steam/steamcmd/linux32/libvstdlib_s.so" "${serverfiles}/System/libvstdlib_s.so"
+	elif [ -f "${steamcmddir}/linux32/libvstdlib_s.so" ]; then
+		cp "${steamcmddir}/linux32/libvstdlib_s.so" "${serverfiles}/System/libvstdlib_s.so"
+	elif [ -f "${HOME}/.local/share/Steam/steamcmd/linux32/libvstdlib_s.so" ]; then
+		cp "${HOME}/.local/share/Steam/steamcmd/linux32/libvstdlib_s.so" "${serverfiles}/System/libvstdlib_s.so"
+	fi
+	fn_fix_msg_end
+fi
+
+# if running install command
+if [ "${commandname}" == "INSTALL" ]; then
+	echo -e "applying server name fix."
+	fn_sleep_time
+	echo -e "forcing server restart..."
+	fn_sleep_time
+	exitbypass=1
+	command_start.sh
+	fn_firstcommand_reset
+	fn_sleep_time_5
+	exitbypass=1
+	command_stop.sh
+	fn_firstcommand_reset
+	exitbypass=1
+	command_start.sh
+	fn_firstcommand_reset
+	fn_sleep_time_5
+	exitbypass=1
+	command_stop.sh
+	fn_firstcommand_reset
+fi

From b59eeecb54a21f4db18e5fa4a90bf3ca54f0362a Mon Sep 17 00:00:00 2001
From: Daniel Gibbs <me@danielgibbs.co.uk>
Date: Sun, 26 Nov 2023 23:44:06 +0000
Subject: [PATCH 043/154] feat(ns2): update start parameters to add mod server
 (#4396)

also removed mod2 as no longer required as per NS2 dedi server docs
---
 lgsm/config-default/config-lgsm/ns2server/_default.cfg | 7 ++++---
 lgsm/modules/info_game.sh                              | 7 ++++---
 lgsm/modules/info_messages.sh                          | 1 +
 3 files changed, 9 insertions(+), 6 deletions(-)

diff --git a/lgsm/config-default/config-lgsm/ns2server/_default.cfg b/lgsm/config-default/config-lgsm/ns2server/_default.cfg
index 8cca4da81..c7c09c47d 100644
--- a/lgsm/config-default/config-lgsm/ns2server/_default.cfg
+++ b/lgsm/config-default/config-lgsm/ns2server/_default.cfg
@@ -13,18 +13,19 @@ ip="0.0.0.0"
 port="27015"
 defaultmap="ns2_summit"
 maxplayers="24"
+maxspectators="0"
 servername="LinuxGSM"
 httpuser="admin"
 httppassword="admin"
 httpport="8080"
-mods=""
+modserverport="27031"
 serverpassword=""
 # Add the following line to the parms if you want a private server. Ensuring
 # that the password variable above is not left empty.
-# -password \"${serverpassword}\"
+# -password '${serverpassword}'
 
 ## Server Parameters | https://docs.linuxgsm.com/configuration/start-parameters#additional-parameters
-startparameters="-name \"${servername}\" -port ${port} -webadmin -webdomain ${ip} -webuser ${httpuser} -webpassword \"${httppassword}\" -webport ${httpport} -map ${defaultmap} -limit ${maxplayers} -config_path \"${servercfgdir}\" -logdir \"${gamelogdir}\" -modstorage \"${modstoragedir}\" -mods2 \"${mods}\""
+startparameters="-name '${servername}' -port ${port} -webadmin -webdomain ${ip} -webuser ${httpuser} -webpassword '${httppassword}' -webport ${httpport} -startmodserver -modserverport ${modserverport} -map ${defaultmap} -limit ${maxplayers} -speclimit ${maxspectators} -config_path '${servercfgdir}' -logdir '${gamelogdir}' -modstorage '${modstoragedir}'"
 
 #### LinuxGSM Settings ####
 
diff --git a/lgsm/modules/info_game.sh b/lgsm/modules/info_game.sh
index 0365660a6..9f6bb7370 100644
--- a/lgsm/modules/info_game.sh
+++ b/lgsm/modules/info_game.sh
@@ -2033,14 +2033,15 @@ fn_info_game_source() {
 
 fn_info_game_spark() {
 	defaultmap="${defaultmap:-"NOT SET"}"
+	httppassword="${httppassword:-"NOT SET"}"
+	httpport="${httpport:-"0"}"
+	httpuser="${httpuser:-"NOT SET"}"
 	maxplayers="${maxplayers:-"0"}"
+	modserverport=${modserverport:-"0"}
 	port="${port:-"0"}"
 	queryport="$((port + 1))"
 	servername="${servername:-"NOT SET"}"
 	serverpassword="${serverpassword:-"NOT SET"}"
-	httpuser="${httpuser:-"NOT SET"}"
-	httppassword="${httppassword:-"NOT SET"}"
-	httpport="${httpport:-"0"}"
 }
 
 # Config Type: Custom (key-value pairs)
diff --git a/lgsm/modules/info_messages.sh b/lgsm/modules/info_messages.sh
index 59d876fcc..09dd4c2ad 100644
--- a/lgsm/modules/info_messages.sh
+++ b/lgsm/modules/info_messages.sh
@@ -1468,6 +1468,7 @@ fn_info_messages_spark() {
 		fn_port "header"
 		fn_port "Game" port udp
 		fn_port "Query" queryport udp
+		fn_port "Mod Server" modserverport tcp
 		fn_port "Web Interface" httpport tcp
 	} | column -s $'\t' -t
 	echo -e ""

From 3961a22430308891a330f44938f353d5586117ec Mon Sep 17 00:00:00 2001
From: Daniel Gibbs <me@danielgibbs.co.uk>
Date: Mon, 27 Nov 2023 00:03:23 +0000
Subject: [PATCH 044/154] fix(q3): mapcycle now working correctly

#3749
---
 lgsm/config-default/config-lgsm/q3server/_default.cfg | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/lgsm/config-default/config-lgsm/q3server/_default.cfg b/lgsm/config-default/config-lgsm/q3server/_default.cfg
index 534bf2429..0a54d2852 100644
--- a/lgsm/config-default/config-lgsm/q3server/_default.cfg
+++ b/lgsm/config-default/config-lgsm/q3server/_default.cfg
@@ -14,7 +14,7 @@ port="27960"
 defaultmap="q3dm17"
 
 ## Server Parameters | https://docs.linuxgsm.com/configuration/start-parameters#additional-parameters
-startparameters="+set sv_punkbuster 0 +set fs_basepath ${serverfiles} +set dedicated 2 +set com_hunkMegs 32 +set net_ip ${ip} +set net_port ${port} +exec ${servercfg} +map ${defaultmap}"
+startparameters="+set sv_punkbuster 0 +set fs_basepath ${serverfiles} +set dedicated 2 +set com_hunkMegs 32 +set net_ip ${ip} +set net_port ${port} +map ${defaultmap} +exec ${servercfg}"
 
 #### LinuxGSM Settings ####
 

From ddb61478f18dfdeb7a4bc7d0a8ee97232cd1e513 Mon Sep 17 00:00:00 2001
From: Daniel Gibbs <me@danielgibbs.co.uk>
Date: Mon, 27 Nov 2023 14:14:32 +0000
Subject: [PATCH 045/154] fix: move exec to end of parameters idtech

---
 lgsm/config-default/config-lgsm/cod2server/_default.cfg   | 2 +-
 lgsm/config-default/config-lgsm/cod4server/_default.cfg   | 2 +-
 lgsm/config-default/config-lgsm/codserver/_default.cfg    | 2 +-
 lgsm/config-default/config-lgsm/coduoserver/_default.cfg  | 2 +-
 lgsm/config-default/config-lgsm/codwawserver/_default.cfg | 2 +-
 lgsm/config-default/config-lgsm/jk2server/_default.cfg    | 2 +-
 lgsm/config-default/config-lgsm/mohaaserver/_default.cfg  | 2 +-
 7 files changed, 7 insertions(+), 7 deletions(-)

diff --git a/lgsm/config-default/config-lgsm/cod2server/_default.cfg b/lgsm/config-default/config-lgsm/cod2server/_default.cfg
index 95b76ae1e..98ea0afb7 100644
--- a/lgsm/config-default/config-lgsm/cod2server/_default.cfg
+++ b/lgsm/config-default/config-lgsm/cod2server/_default.cfg
@@ -15,7 +15,7 @@ defaultmap="mp_leningrad"
 maxplayers="20"
 
 ## Server Parameters | https://docs.linuxgsm.com/configuration/start-parameters#additional-parameters
-startparameters="+set sv_punkbuster 0 +set fs_basepath ${serverfiles} +set dedicated 2 +set net_ip ${ip} +set net_port ${port} +set sv_maxclients ${maxplayers} +exec ${servercfg} +map ${defaultmap}"
+startparameters="+set sv_punkbuster 0 +set fs_basepath ${serverfiles} +set dedicated 2 +set net_ip ${ip} +set net_port ${port} +set sv_maxclients ${maxplayers} +map ${defaultmap} +exec ${servercfg}"
 
 #### LinuxGSM Settings ####
 
diff --git a/lgsm/config-default/config-lgsm/cod4server/_default.cfg b/lgsm/config-default/config-lgsm/cod4server/_default.cfg
index a93237894..cde7e0113 100644
--- a/lgsm/config-default/config-lgsm/cod4server/_default.cfg
+++ b/lgsm/config-default/config-lgsm/cod4server/_default.cfg
@@ -15,7 +15,7 @@ defaultmap="mp_crossfire"
 maxplayers="32"
 
 ## Server Parameters | https://docs.linuxgsm.com/configuration/start-parameters#additional-parameters
-startparameters="+set sv_punkbuster 0 +set fs_basepath ${serverfiles} +set fs_homepath ${serverfiles} +set sv_authorizemode "-1" +set dedicated 2 +set net_ip ${ip} +set net_port ${port} +set sv_maxclients ${maxplayers} +exec ${servercfg} +map ${defaultmap}"
+startparameters="+set sv_punkbuster 0 +set fs_basepath ${serverfiles} +set fs_homepath ${serverfiles} +set sv_authorizemode "-1" +set dedicated 2 +set net_ip ${ip} +set net_port ${port} +set sv_maxclients ${maxplayers} +map ${defaultmap} +exec ${servercfg}"
 
 #### LinuxGSM Settings ####
 
diff --git a/lgsm/config-default/config-lgsm/codserver/_default.cfg b/lgsm/config-default/config-lgsm/codserver/_default.cfg
index 6263d79b6..1c0a0902c 100644
--- a/lgsm/config-default/config-lgsm/codserver/_default.cfg
+++ b/lgsm/config-default/config-lgsm/codserver/_default.cfg
@@ -15,7 +15,7 @@ defaultmap="mp_neuville"
 maxplayers="20"
 
 ## Server Parameters | https://docs.linuxgsm.com/configuration/start-parameters#additional-parameters
-startparameters="+set sv_punkbuster 0 +set fs_basepath ${serverfiles} +set dedicated 2 +set net_ip ${ip} +set net_port ${port} +set sv_maxclients ${maxplayers} +exec ${servercfg} +map ${defaultmap}"
+startparameters="+set sv_punkbuster 0 +set fs_basepath ${serverfiles} +set dedicated 2 +set net_ip ${ip} +set net_port ${port} +set sv_maxclients ${maxplayers} +map ${defaultmap} +exec ${servercfg}"
 
 #### LinuxGSM Settings ####
 
diff --git a/lgsm/config-default/config-lgsm/coduoserver/_default.cfg b/lgsm/config-default/config-lgsm/coduoserver/_default.cfg
index b7c6036b9..b3f89889f 100644
--- a/lgsm/config-default/config-lgsm/coduoserver/_default.cfg
+++ b/lgsm/config-default/config-lgsm/coduoserver/_default.cfg
@@ -15,7 +15,7 @@ defaultmap="mp_cassino"
 maxplayers="20"
 
 ## Server Parameters | https://docs.linuxgsm.com/configuration/start-parameters#additional-parameters
-startparameters="+set sv_punkbuster 0 +set fs_basepath ${serverfiles} +set dedicated 2 +set net_ip ${ip} +set net_port ${port} +set sv_maxclients ${maxplayers} +exec ${servercfg} +map ${defaultmap}"
+startparameters="+set sv_punkbuster 0 +set fs_basepath ${serverfiles} +set dedicated 2 +set net_ip ${ip} +set net_port ${port} +set sv_maxclients ${maxplayers} +map ${defaultmap} +exec ${servercfg}"
 
 #### LinuxGSM Settings ####
 
diff --git a/lgsm/config-default/config-lgsm/codwawserver/_default.cfg b/lgsm/config-default/config-lgsm/codwawserver/_default.cfg
index 0820475f1..e906fcf07 100644
--- a/lgsm/config-default/config-lgsm/codwawserver/_default.cfg
+++ b/lgsm/config-default/config-lgsm/codwawserver/_default.cfg
@@ -15,7 +15,7 @@ defaultmap="mp_castle"
 maxplayers="20"
 
 ## Server Parameters | https://docs.linuxgsm.com/configuration/start-parameters#additional-parameters
-startparameters="+set sv_punkbuster 0 +set fs_basepath ${serverfiles} +set dedicated 2 +set net_ip ${ip} +set net_port ${port} +set sv_maxclients ${maxplayers} +exec ${servercfg} +map ${defaultmap}"
+startparameters="+set sv_punkbuster 0 +set fs_basepath ${serverfiles} +set dedicated 2 +set net_ip ${ip} +set net_port ${port} +set sv_maxclients ${maxplayers} +map ${defaultmap} +exec ${servercfg}"
 
 #### LinuxGSM Settings ####
 
diff --git a/lgsm/config-default/config-lgsm/jk2server/_default.cfg b/lgsm/config-default/config-lgsm/jk2server/_default.cfg
index 4d49e4e7e..d14b052c2 100644
--- a/lgsm/config-default/config-lgsm/jk2server/_default.cfg
+++ b/lgsm/config-default/config-lgsm/jk2server/_default.cfg
@@ -18,7 +18,7 @@ port="27960"
 defaultmap="ffa_bespin"
 
 ## Server Parameters | https://docs.linuxgsm.com/configuration/start-parameters#additional-parameters
-startparameters="+set sv_punkbuster 0 +set fs_basepath ${serverfiles} +set net_ip ${ip} +set net_port ${port} +exec ${servercfg} +map ${defaultmap}"
+startparameters="+set sv_punkbuster 0 +set fs_basepath ${serverfiles} +set net_ip ${ip} +set net_port ${port} +map ${defaultmap} +exec ${servercfg}"
 
 #### LinuxGSM Settings ####
 
diff --git a/lgsm/config-default/config-lgsm/mohaaserver/_default.cfg b/lgsm/config-default/config-lgsm/mohaaserver/_default.cfg
index a457832cf..a53e55bfc 100644
--- a/lgsm/config-default/config-lgsm/mohaaserver/_default.cfg
+++ b/lgsm/config-default/config-lgsm/mohaaserver/_default.cfg
@@ -14,7 +14,7 @@ port="12203"
 defaultmap="dm/mohdm1"
 
 ## Server Parameters | https://docs.linuxgsm.com/configuration/start-parameters#additional-parameters
-startparameters="+set sv_punkbuster 0 +set fs_basepath ${serverfiles} +set fs_outputpath ${gamelogdir} +set dedicated 2 +set net_ip ${ip} +set net_port ${port} +exec ${servercfg} +map ${defaultmap}"
+startparameters="+set sv_punkbuster 0 +set fs_basepath ${serverfiles} +set fs_outputpath ${gamelogdir} +set dedicated 2 +set net_ip ${ip} +set net_port ${port} +map ${defaultmap} +exec ${servercfg} "
 
 #### LinuxGSM Settings ####
 

From 366701fe361b4869f14c7664cec373ed4ddf8eaf Mon Sep 17 00:00:00 2001
From: Daniel Gibbs <me@danielgibbs.co.uk>
Date: Wed, 29 Nov 2023 22:54:32 +0000
Subject: [PATCH 046/154] fix(ns2): adjusted player numbers for ranked

---
 lgsm/config-default/config-lgsm/ns2server/_default.cfg | 4 ++--
 1 file changed, 2 insertions(+), 2 deletions(-)

diff --git a/lgsm/config-default/config-lgsm/ns2server/_default.cfg b/lgsm/config-default/config-lgsm/ns2server/_default.cfg
index c7c09c47d..32d0bcb20 100644
--- a/lgsm/config-default/config-lgsm/ns2server/_default.cfg
+++ b/lgsm/config-default/config-lgsm/ns2server/_default.cfg
@@ -12,8 +12,8 @@
 ip="0.0.0.0"
 port="27015"
 defaultmap="ns2_summit"
-maxplayers="24"
-maxspectators="0"
+maxplayers="20"
+maxspectators="5"
 servername="LinuxGSM"
 httpuser="admin"
 httppassword="admin"

From 6a56a18b1ff370292a33e82faaabe3532705b15e Mon Sep 17 00:00:00 2001
From: Daniel Gibbs <me@danielgibbs.co.uk>
Date: Wed, 29 Nov 2023 23:01:59 +0000
Subject: [PATCH 047/154] feat: added more checks for insecure passwords

---
 .../config-lgsm/inssserver/_default.cfg               |  2 +-
 .../config-lgsm/ns2cserver/_default.cfg               |  2 +-
 .../config-default/config-lgsm/ns2server/_default.cfg |  2 +-
 .../config-lgsm/wurmserver/_default.cfg               |  2 +-
 lgsm/modules/check_config.sh                          | 11 +++++++++--
 lgsm/modules/info_game.sh                             |  9 +--------
 6 files changed, 14 insertions(+), 14 deletions(-)

diff --git a/lgsm/config-default/config-lgsm/inssserver/_default.cfg b/lgsm/config-default/config-lgsm/inssserver/_default.cfg
index 8d14e79ea..d4d485d68 100644
--- a/lgsm/config-default/config-lgsm/inssserver/_default.cfg
+++ b/lgsm/config-default/config-lgsm/inssserver/_default.cfg
@@ -13,7 +13,7 @@ ip="0.0.0.0"
 port="27102"
 queryport="27131"
 rconport="27015"
-rconpassword=""
+rconpassword="CHANGE_ME"
 servername="LinuxGSM"
 defaultmap="Oilfield"
 defaultscenario="Scenario_Refinery_Push_Security"
diff --git a/lgsm/config-default/config-lgsm/ns2cserver/_default.cfg b/lgsm/config-default/config-lgsm/ns2cserver/_default.cfg
index fb4686c1e..b285d8cb0 100644
--- a/lgsm/config-default/config-lgsm/ns2cserver/_default.cfg
+++ b/lgsm/config-default/config-lgsm/ns2cserver/_default.cfg
@@ -15,7 +15,7 @@ defaultmap="co_core"
 maxplayers="24"
 servername="LinuxGSM"
 httpuser="admin"
-httppassword="admin"
+httppassword="CHANGE_ME"
 httpport="8080"
 mods=""
 serverpassword=""
diff --git a/lgsm/config-default/config-lgsm/ns2server/_default.cfg b/lgsm/config-default/config-lgsm/ns2server/_default.cfg
index 32d0bcb20..41970a2f4 100644
--- a/lgsm/config-default/config-lgsm/ns2server/_default.cfg
+++ b/lgsm/config-default/config-lgsm/ns2server/_default.cfg
@@ -16,7 +16,7 @@ maxplayers="20"
 maxspectators="5"
 servername="LinuxGSM"
 httpuser="admin"
-httppassword="admin"
+httppassword="CHANGE_ME"
 httpport="8080"
 modserverport="27031"
 serverpassword=""
diff --git a/lgsm/config-default/config-lgsm/wurmserver/_default.cfg b/lgsm/config-default/config-lgsm/wurmserver/_default.cfg
index b27783cf4..901417aaf 100644
--- a/lgsm/config-default/config-lgsm/wurmserver/_default.cfg
+++ b/lgsm/config-default/config-lgsm/wurmserver/_default.cfg
@@ -27,7 +27,7 @@ homekingdom="4"
 
 # Unlocks the admin commands from within the game, that can be used to change
 # the gameplay settings of the server, such as skill gain rate and field growth time.
-adminpassword="ADMINPASSWORD"
+adminpassword="CHANGE_ME"
 
 # If true the server will follow the rules from the Epic servers in Wurm Online.
 # For instance it will use the skill curve.
diff --git a/lgsm/modules/check_config.sh b/lgsm/modules/check_config.sh
index 42892a191..d8bfb5008 100644
--- a/lgsm/modules/check_config.sh
+++ b/lgsm/modules/check_config.sh
@@ -19,8 +19,15 @@ if [ "${shortname}" == "rust" ] && [ -v rconpassword ] && [ -z "${rconpassword}"
 	fn_print_fail_nl "RCON password is not set"
 	fn_script_log_warn "RCON password is not set"
 elif [ -v rconpassword ] && [ "${rconpassword}" == "CHANGE_ME" ]; then
-	fn_print_warn_nl "Default RCON Password detected"
-	fn_script_log_warn "Default RCON Password detected"
+	fn_print_warn_nl "Default RCON password detected"
+	fn_script_log_warn "Default RCON password detected"
+elif [ -v httppassword ] && [ "${httppassword}" == "CHANGE_ME" ]; then
+	fn_print_warn_nl "Default Web password detected"
+	fn_script_log_warn "Default Web password detected"
+elif [ -v adminpassword ] && [ "${adminpassword}" == "CHANGE_ME" ]; then
+	fn_print_warn_nl "Default Admin password detected"
+	fn_script_log_warn "Default Admin password detected"
+
 fi
 
 if [ "${shortname}" == "vh" ] && [ -z "${serverpassword}" ]; then
diff --git a/lgsm/modules/info_game.sh b/lgsm/modules/info_game.sh
index 9f6bb7370..cfa0a5c05 100644
--- a/lgsm/modules/info_game.sh
+++ b/lgsm/modules/info_game.sh
@@ -1832,14 +1832,7 @@ fn_info_game_rw() {
 # example: hostname "SERVERNAME"
 # filetypes: cfg
 fn_info_game_samp() {
-	# Config
-	if [ ! -f "${servercfgfullpath}" ]; then
-		servername="unnamed server"
-		rconpassword="${unavailable}"
-		port="7777"
-		rconport="${port}"
-		maxplayers="50"
-	else
+	if [ -f "${servercfgfullpath}" ]; then
 		servername=$(grep "hostname" "${servercfgfullpath}" | sed -e 's/^[ \t]*//g' -e '/^\//d' -e 's/hostname//g' | tr -d '=\";,:' | sed -e 's/^[ \t]*//' -e 's/[ \t]*$//')
 		rconpassword=$(grep "rcon_password" "${servercfgfullpath}" | sed -e 's/^[ \t]*//g' -e '/^#/d' -e 's/^rcon_password//g' | tr -d '=\";,:' | sed -e 's/^[ \t]*//' -e 's/[ \t]*$//')
 		port=$(grep "port" "${servercfgfullpath}" | grep -v "#" | tr -cd '[:digit:]')

From ef6410efec1ffe2199bde982f7aea9d14da9338d Mon Sep 17 00:00:00 2001
From: Daniel Gibbs <me@danielgibbs.co.uk>
Date: Thu, 30 Nov 2023 21:00:29 +0000
Subject: [PATCH 048/154] feat: deprecate crafting dead

---
 .../config-lgsm/cdserver/_default.cfg         | 178 ------------------
 lgsm/data/serverlist.csv                      |   1 -
 lgsm/modules/info_messages.sh                 |   4 +-
 lgsm/modules/install_config.sh                |   6 -
 4 files changed, 1 insertion(+), 188 deletions(-)
 delete mode 100644 lgsm/config-default/config-lgsm/cdserver/_default.cfg

diff --git a/lgsm/config-default/config-lgsm/cdserver/_default.cfg b/lgsm/config-default/config-lgsm/cdserver/_default.cfg
deleted file mode 100644
index 28deeb6e6..000000000
--- a/lgsm/config-default/config-lgsm/cdserver/_default.cfg
+++ /dev/null
@@ -1,178 +0,0 @@
-##################################
-######## Default Settings ########
-##################################
-# DO NOT EDIT, ANY CHANGES WILL BE OVERWRITTEN!
-# Copy settings from here and use them in either:
-# common.cfg - applies settings to every instance.
-# [instance].cfg - applies settings to a specific instance.
-
-#### Game Server Settings ####
-
-## Server Parameters | https://docs.linuxgsm.com/configuration/start-parameters#additional-parameters
-startparameters="-batchmode -nographics"
-
-#### LinuxGSM Settings ####
-
-## LinuxGSM Stats
-# Send useful stats to LinuxGSM developers.
-# https://docs.linuxgsm.com/configuration/linuxgsm-stats
-# (on|off)
-stats="off"
-
-## Notification Alerts
-# (on|off)
-
-# Display IP | https://docs.linuxgsm.com/alerts#display-ip
-displayip=""
-
-# More info | https://docs.linuxgsm.com/alerts#more-info
-postalert="off"
-
-# Alert on Start/Stop/Restart
-statusalert="off"
-
-# Discord Alerts | https://docs.linuxgsm.com/alerts/discord
-discordalert="off"
-discordwebhook="webhook"
-
-# Email Alerts | https://docs.linuxgsm.com/alerts/email
-emailalert="off"
-email="email@example.com"
-emailfrom=""
-
-# Gotify Alerts | https://docs.linuxgsm.com/alerts/gotify
-gotifyalert="off"
-gotifytoken="token"
-gotifywebhook="webhook"
-
-# IFTTT Alerts | https://docs.linuxgsm.com/alerts/ifttt
-iftttalert="off"
-ifttttoken="accesstoken"
-iftttevent="linuxgsm_alert"
-
-# Pushbullet Alerts | https://docs.linuxgsm.com/alerts/pushbullet
-pushbulletalert="off"
-pushbullettoken="accesstoken"
-channeltag=""
-
-# Pushover Alerts | https://docs.linuxgsm.com/alerts/pushover
-pushoveralert="off"
-pushovertoken="accesstoken"
-pushoveruserkey="userkey"
-
-# Rocket.Chat Alerts | https://docs.linuxgsm.com/alerts/rocket.chat
-rocketchatalert="off"
-rocketchatwebhook="webhook"
-
-# Slack Alerts | https://docs.linuxgsm.com/alerts/slack
-slackalert="off"
-slackwebhook="webhook"
-
-# Telegram Alerts | https://docs.linuxgsm.com/alerts/telegram
-# You can add a custom cURL string eg proxy (useful in Russia) in "curlcustomstring".
-# For example "--socks5 ipaddr:port" for socks5 proxy see more in "curl --help".
-telegramapi="api.telegram.org"
-telegramalert="off"
-telegramtoken="accesstoken"
-telegramchatid=""
-curlcustomstring=""
-
-## Updating | https://docs.linuxgsm.com/commands/update
-updateonstart="off"
-
-## Backup | https://docs.linuxgsm.com/commands/backup
-maxbackups="4"
-maxbackupdays="30"
-stoponbackup="on"
-
-## Logging | https://docs.linuxgsm.com/features/logging
-consolelogging="on"
-logdays="7"
-
-## Monitor | https://docs.linuxgsm.com/commands/monitor
-# Query delay time
-querydelay="1"
-
-## ANSI Colors | https://docs.linuxgsm.com/features/ansi-colors
-ansi="on"
-
-#### Advanced Settings ####
-
-## Message Display Time | https://docs.linuxgsm.com/features/message-display-time
-sleeptime="0.5"
-
-## SteamCMD Settings | https://docs.linuxgsm.com/steamcmd
-# Server appid
-appid="685100"
-steamcmdforcewindows="no"
-# SteamCMD Branch | https://docs.linuxgsm.com/steamcmd/branch
-branch=""
-betapassword=""
-# Master Server | https://docs.linuxgsm.com/steamcmd/steam-master-server
-steammaster="false"
-
-## Stop Mode | https://docs.linuxgsm.com/features/stop-mode
-# 1: tmux kill
-# 2: CTRL+c
-# 3: quit
-# 4: quit 120s
-# 5: stop
-# 6: q
-# 7: exit
-# 8: 7 Days to Die
-# 9: GoldSrc
-# 10: Avorion
-# 11: end
-stopmode="2"
-
-## Query mode
-# 1: session only
-# 2: gamedig (gsquery fallback)
-# 3: gamedig
-# 4: gsquery
-# 5: tcp
-querymode="1"
-querytype=""
-
-## Console type
-consoleverbose="yes"
-consoleinteract="no"
-
-## Game Server Details
-# Do not edit
-gamename="Crafting Dead"
-engine="unity3d"
-glibc="2.15"
-
-#### Directories ####
-# Edit with care
-
-## Game Server Directories
-systemdir="${serverfiles}"
-executabledir="${serverfiles}"
-executable="./crafting_dead.x86_64"
-servercfgdir="${systemdir}"
-servercfg="properties.json"
-servercfgdefault="properties.json"
-servercfgfullpath="${servercfgdir}/${servercfg}"
-
-## Backup Directory
-backupdir="${lgsmdir}/backup"
-
-## Logging Directories
-[ -n "${LGSM_LOGDIR}" ] && logdir="${LGSM_LOGDIR}" || logdir="${rootdir}/log"
-gamelogdir="${systemdir}/logs"
-lgsmlogdir="${logdir}/script"
-consolelogdir="${logdir}/console"
-lgsmlog="${lgsmlogdir}/${selfname}-script.log"
-consolelog="${consolelogdir}/${selfname}-console.log"
-alertlog="${lgsmlogdir}/${selfname}-alert.log"
-postdetailslog="${lgsmlogdir}/${selfname}-postdetails.log"
-
-## Logs Naming
-lgsmlogdate="${lgsmlogdir}/${selfname}-script-$(date '+%Y-%m-%d-%H:%M:%S').log"
-consolelogdate="${consolelogdir}/${selfname}-console-$(date '+%Y-%m-%d-%H:%M:%S').log"
-
-## Log Parameters
-logtimestamp="off"
-logtimestampformat="%Y-%m-%d %H:%M:%S"
diff --git a/lgsm/data/serverlist.csv b/lgsm/data/serverlist.csv
index 1dd6dda2c..20ea2e6c7 100644
--- a/lgsm/data/serverlist.csv
+++ b/lgsm/data/serverlist.csv
@@ -18,7 +18,6 @@ bs,bsserver,Blade Symphony,ubuntu-22.04
 bt,btserver,Barotrauma,ubuntu-22.04
 btl,btlserver,BATTALION: Legacy,ubuntu-20.04
 cc,ccserver,Codename CURE,ubuntu-22.04
-cd,cdserver,Crafting Dead,ubuntu-22.04
 ck,ckserver,Core Keeper,ubuntu-22.04
 cmw,cmwserver,Chivalry: Medieval Warfare,ubuntu-22.04
 cod,codserver,Call of Duty,ubuntu-22.04
diff --git a/lgsm/modules/info_messages.sh b/lgsm/modules/info_messages.sh
index 09dd4c2ad..fe019da44 100644
--- a/lgsm/modules/info_messages.sh
+++ b/lgsm/modules/info_messages.sh
@@ -663,7 +663,7 @@ fn_info_messages_ports_edit() {
 
 	startparameterslocation="${red}UNKNOWN${default}"
 	# engines/games that require editing in the config file.
-	local ports_edit_array=("ac" "arma3" "armar" "bo" "bt" "cd" "ct" "dst" "eco" "idtech2" "idtech3" "idtech3_ql" "jc2" "jc3" "lwjgl2" "mcb" "nec" "pc" "pc2" "prism3d" "pz" "qw" "refractor" "renderware" "rw" "sb" "sdtd" "st" "stn" "ts3" "tw" "terraria" "unreal" "unreal2" "unreal3" "vints" "wurm")
+	local ports_edit_array=("ac" "arma3" "armar" "bo" "bt" "ct" "dst" "eco" "idtech2" "idtech3" "idtech3_ql" "jc2" "jc3" "lwjgl2" "mcb" "nec" "pc" "pc2" "prism3d" "pz" "qw" "refractor" "renderware" "rw" "sb" "sdtd" "st" "stn" "ts3" "tw" "terraria" "unreal" "unreal2" "unreal3" "vints" "wurm")
 	for port_edit in "${ports_edit_array[@]}"; do
 		if [ "${shortname}" == "ut3" ]; then
 			startparameterslocation="${servercfgdir}/UTWeb.ini"
@@ -1708,8 +1708,6 @@ fn_info_messages_select_engine() {
 		fn_info_messages_bt
 	elif [ "${shortname}" == "btl" ]; then
 		fn_info_messages_btl
-	elif [ "${shortname}" == "cd" ]; then
-		fn_info_messages_cd
 	elif [ "${shortname}" == "ck" ]; then
 		fn_info_messages_ck
 	elif [ "${shortname}" == "cs2" ]; then
diff --git a/lgsm/modules/install_config.sh b/lgsm/modules/install_config.sh
index 45773f63c..0e688b65d 100644
--- a/lgsm/modules/install_config.sh
+++ b/lgsm/modules/install_config.sh
@@ -286,12 +286,6 @@ elif [ "${shortname}" == "bmdm" ]; then
 	fn_default_config_remote
 	fn_set_config_vars
 	fn_list_config_locations
-elif [ "${shortname}" == "cd" ]; then
-	array_configs+=(properties.json)
-	fn_fetch_default_config
-	fn_default_config_remote
-	fn_set_config_vars
-	fn_list_config_locations
 elif [ "${shortname}" == "ck" ]; then
 	array_configs+=(ServerConfig.json)
 	fn_fetch_default_config

From 746c413314c3ab1790c42623c542919b388c2707 Mon Sep 17 00:00:00 2001
From: Daniel Gibbs <me@danielgibbs.co.uk>
Date: Thu, 30 Nov 2023 21:01:00 +0000
Subject: [PATCH 049/154] feat(ns2c): tidy parameters

---
 lgsm/config-default/config-lgsm/ns2cserver/_default.cfg | 2 +-
 lgsm/modules/info_game.sh                               | 2 --
 2 files changed, 1 insertion(+), 3 deletions(-)

diff --git a/lgsm/config-default/config-lgsm/ns2cserver/_default.cfg b/lgsm/config-default/config-lgsm/ns2cserver/_default.cfg
index b285d8cb0..5fa692c08 100644
--- a/lgsm/config-default/config-lgsm/ns2cserver/_default.cfg
+++ b/lgsm/config-default/config-lgsm/ns2cserver/_default.cfg
@@ -24,7 +24,7 @@ serverpassword=""
 # -password \"${serverpassword}\"
 
 ## Server Parameters | https://docs.linuxgsm.com/configuration/start-parameters#additional-parameters
-startparameters="-name \"${servername}\" -port ${port} -webadmin -webdomain ${ip} -webuser ${httpuser} -webpassword \"${httppassword}\" -webport ${httpport} -map ${defaultmap} -limit ${maxplayers} -config_path \"${servercfgdir}\" -modstorage \"${modstoragedir}\" -mods \"${mods}\""
+startparameters="-name '${servername}' -port ${port} -webadmin -webdomain ${ip} -webuser ${httpuser} -webpassword '${httppassword}' -webport ${httpport} -map ${defaultmap} -limit ${maxplayers} -config_path '${servercfgdir}' -modstorage '${modstoragedir}' -mods '${mods}'"
 
 #### LinuxGSM Settings ####
 
diff --git a/lgsm/modules/info_game.sh b/lgsm/modules/info_game.sh
index cfa0a5c05..d22570716 100644
--- a/lgsm/modules/info_game.sh
+++ b/lgsm/modules/info_game.sh
@@ -2268,8 +2268,6 @@ elif [ "${shortname}" == "bt" ]; then
 	fn_info_game_bt
 elif [ "${shortname}" == "btl" ]; then
 	fn_info_game_btl
-elif [ "${shortname}" == "cd" ]; then
-	fn_info_game_cd
 elif [ "${shortname}" == "ck" ]; then
 	fn_info_game_ck
 elif [ "${shortname}" == "cmw" ]; then

From 38079bac8418ae9c5b4bd20b62fac32a9e4daccc Mon Sep 17 00:00:00 2001
From: Daniel Gibbs <me@danielgibbs.co.uk>
Date: Thu, 30 Nov 2023 21:21:11 +0000
Subject: [PATCH 050/154] feat(new server): Quake 4 (#4398)

---
 .../config-lgsm/q4server/_default.cfg         | 186 ++++++++++++++++++
 lgsm/data/almalinux-8.csv                     |   1 +
 lgsm/data/almalinux-9.csv                     |   1 +
 lgsm/data/centos-7.csv                        |   1 +
 lgsm/data/centos-8.csv                        |   1 +
 lgsm/data/centos-9.csv                        |   1 +
 lgsm/data/debian-10.csv                       |   1 +
 lgsm/data/debian-11.csv                       |   1 +
 lgsm/data/debian-12.csv                       |   1 +
 lgsm/data/debian-9.csv                        |   1 +
 lgsm/data/gameicons/q4-icon.png               | Bin 0 -> 786 bytes
 lgsm/data/rhel-7.csv                          |   1 +
 lgsm/data/rhel-8.csv                          |   1 +
 lgsm/data/rhel-9.csv                          |   1 +
 lgsm/data/rocky-8.csv                         |   1 +
 lgsm/data/rocky-9.csv                         |   1 +
 lgsm/data/serverlist.csv                      |   1 +
 lgsm/data/ubuntu-16.04.csv                    |   1 +
 lgsm/data/ubuntu-18.04.csv                    |   1 +
 lgsm/data/ubuntu-20.04.csv                    |   1 +
 lgsm/data/ubuntu-22.04.csv                    |   1 +
 lgsm/data/ubuntu-23.04.csv                    |   1 +
 lgsm/data/ubuntu-23.10.csv                    |   1 +
 lgsm/modules/info_game.sh                     |  21 ++
 lgsm/modules/info_messages.sh                 |  14 ++
 lgsm/modules/install_config.sh                |   6 +
 lgsm/modules/install_server_files.sh          |   9 +-
 27 files changed, 256 insertions(+), 1 deletion(-)
 create mode 100644 lgsm/config-default/config-lgsm/q4server/_default.cfg
 create mode 100644 lgsm/data/gameicons/q4-icon.png

diff --git a/lgsm/config-default/config-lgsm/q4server/_default.cfg b/lgsm/config-default/config-lgsm/q4server/_default.cfg
new file mode 100644
index 000000000..ffd311e3c
--- /dev/null
+++ b/lgsm/config-default/config-lgsm/q4server/_default.cfg
@@ -0,0 +1,186 @@
+##################################
+######## Default Settings ########
+##################################
+# DO NOT EDIT, ANY CHANGES WILL BE OVERWRITTEN!
+# Copy settings from here and use them in either:
+# common.cfg - applies settings to every instance.
+# [instance].cfg - applies settings to a specific instance.
+
+#### Game Server Settings ####
+
+## SteamCMD Login | https://docs.linuxgsm.com/steamcmd#steamcmd-login
+steamuser="username"
+steampass='password'
+
+## Predefined Parameters | https://docs.linuxgsm.com/configuration/start-parameters
+port="28004"
+
+## Server Parameters | https://docs.linuxgsm.com/configuration/start-parameters#additional-parameters
+startparameters="+set sv_punkbuster 0 +set fs_basepath ${serverfiles} +set net_port ${port} +exec ${servercfg}"
+
+#### LinuxGSM Settings ####
+
+## LinuxGSM Stats
+# Send useful stats to LinuxGSM developers.
+# https://docs.linuxgsm.com/configuration/linuxgsm-stats
+# (on|off)
+stats="off"
+
+## Notification Alerts
+# (on|off)
+
+# Display IP | https://docs.linuxgsm.com/alerts#display-ip
+displayip=""
+
+# More info | https://docs.linuxgsm.com/alerts#more-info
+postalert="off"
+
+# Alert on Start/Stop/Restart
+statusalert="off"
+
+# Discord Alerts | https://docs.linuxgsm.com/alerts/discord
+discordalert="off"
+discordwebhook="webhook"
+
+# Email Alerts | https://docs.linuxgsm.com/alerts/email
+emailalert="off"
+email="email@example.com"
+emailfrom=""
+
+# Gotify Alerts | https://docs.linuxgsm.com/alerts/gotify
+gotifyalert="off"
+gotifytoken="token"
+gotifywebhook="webhook"
+
+# IFTTT Alerts | https://docs.linuxgsm.com/alerts/ifttt
+iftttalert="off"
+ifttttoken="accesstoken"
+iftttevent="linuxgsm_alert"
+
+# Pushbullet Alerts | https://docs.linuxgsm.com/alerts/pushbullet
+pushbulletalert="off"
+pushbullettoken="accesstoken"
+channeltag=""
+
+# Pushover Alerts | https://docs.linuxgsm.com/alerts/pushover
+pushoveralert="off"
+pushovertoken="accesstoken"
+pushoveruserkey="userkey"
+
+# Rocket.Chat Alerts | https://docs.linuxgsm.com/alerts/rocket.chat
+rocketchatalert="off"
+rocketchatwebhook="webhook"
+
+# Slack Alerts | https://docs.linuxgsm.com/alerts/slack
+slackalert="off"
+slackwebhook="webhook"
+
+# Telegram Alerts | https://docs.linuxgsm.com/alerts/telegram
+# You can add a custom cURL string eg proxy (useful in Russia) in "curlcustomstring".
+# For example "--socks5 ipaddr:port" for socks5 proxy see more in "curl --help".
+telegramapi="api.telegram.org"
+telegramalert="off"
+telegramtoken="accesstoken"
+telegramchatid=""
+curlcustomstring=""
+
+## Updating | https://docs.linuxgsm.com/commands/update
+updateonstart="off"
+
+## Backup | https://docs.linuxgsm.com/commands/backup
+maxbackups="4"
+maxbackupdays="30"
+stoponbackup="on"
+
+## Logging | https://docs.linuxgsm.com/features/logging
+consolelogging="on"
+logdays="7"
+
+## Monitor | https://docs.linuxgsm.com/commands/monitor
+# Query delay time
+querydelay="1"
+
+## ANSI Colors | https://docs.linuxgsm.com/features/ansi-colors
+ansi="on"
+
+#### Advanced Settings ####
+
+## Message Display Time | https://docs.linuxgsm.com/features/message-display-time
+sleeptime="0.5"
+
+## SteamCMD Settings | https://docs.linuxgsm.com/steamcmd
+# Server appid
+appid="2210"
+steamcmdforcewindows="yes"
+# SteamCMD Branch | https://docs.linuxgsm.com/steamcmd/branch
+branch=""
+betapassword=""
+# Master Server | https://docs.linuxgsm.com/steamcmd/steam-master-server
+steammaster="false"
+
+## Stop Mode | https://docs.linuxgsm.com/features/stop-mode
+# 1: tmux kill
+# 2: CTRL+c
+# 3: quit
+# 4: quit 120s
+# 5: stop
+# 6: q
+# 7: exit
+# 8: 7 Days to Die
+# 9: GoldSrc
+# 10: Avorion
+# 11: end
+stopmode="3"
+
+## Query mode
+# 1: session only
+# 2: gamedig (gsquery fallback)
+# 3: gamedig
+# 4: gsquery
+# 5: tcp
+querymode="2"
+querytype="quake4"
+
+## Console type
+consoleverbose="yes"
+consoleinteract="yes"
+
+## Game Server Details
+# Do not edit
+gamename="Quake 4"
+engine="idtech3_ql"
+glibc="2.15"
+
+#### Directories ####
+# Edit with care
+
+## Game Server Directories
+systemdir="${serverfiles}"
+executabledir="${serverfiles}"
+executable="./quake4-dedicated"
+servercfgdir="${systemdir}/q4base"
+servercfg="${selfname}.cfg"
+servercfgdefault="server.cfg"
+servercfgfullpath="${servercfgdir}/${servercfg}"
+
+## Backup Directory
+backupdir="${lgsmdir}/backup"
+
+## Logging Directories
+[ -n "${LGSM_LOGDIR}" ] && logdir="${LGSM_LOGDIR}" || logdir="${rootdir}/log"
+gamelogdir="${logdir}/server"
+lgsmlogdir="${logdir}/script"
+consolelogdir="${logdir}/console"
+gamelog="${gamelogdir}/${selfname}-game.log"
+lgsmlog="${lgsmlogdir}/${selfname}-script.log"
+consolelog="${consolelogdir}/${selfname}-console.log"
+alertlog="${lgsmlogdir}/${selfname}-alert.log"
+postdetailslog="${lgsmlogdir}/${selfname}-postdetails.log"
+
+## Logs Naming
+lgsmlogdate="${lgsmlogdir}/${selfname}-script-$(date '+%Y-%m-%d-%H:%M:%S').log"
+consolelogdate="${consolelogdir}/${selfname}-console-$(date '+%Y-%m-%d-%H:%M:%S').log"
+
+## Log Parameters
+logtimestamp="off"
+logtimestampformat="%Y-%m-%d %H:%M:%S"
diff --git a/lgsm/data/almalinux-8.csv b/lgsm/data/almalinux-8.csv
index 561b3c134..6427b1460 100644
--- a/lgsm/data/almalinux-8.csv
+++ b/lgsm/data/almalinux-8.csv
@@ -89,6 +89,7 @@ pvr,libcxx
 pz,java-11-openjdk rng-tools
 q2
 q3
+q4
 ql
 qw
 ricochet
diff --git a/lgsm/data/almalinux-9.csv b/lgsm/data/almalinux-9.csv
index 64a9e0645..2b6ea075d 100644
--- a/lgsm/data/almalinux-9.csv
+++ b/lgsm/data/almalinux-9.csv
@@ -89,6 +89,7 @@ pvr,libcxx
 pz,java-11-openjdk rng-tools
 q2
 q3
+q4
 ql
 qw
 ricochet
diff --git a/lgsm/data/centos-7.csv b/lgsm/data/centos-7.csv
index a1b10095e..2c876efc2 100644
--- a/lgsm/data/centos-7.csv
+++ b/lgsm/data/centos-7.csv
@@ -89,6 +89,7 @@ pvr,libcxx
 pz,java-11-openjdk rng-tools
 q2
 q3
+q4
 ql
 qw
 ricochet
diff --git a/lgsm/data/centos-8.csv b/lgsm/data/centos-8.csv
index 561b3c134..6427b1460 100644
--- a/lgsm/data/centos-8.csv
+++ b/lgsm/data/centos-8.csv
@@ -89,6 +89,7 @@ pvr,libcxx
 pz,java-11-openjdk rng-tools
 q2
 q3
+q4
 ql
 qw
 ricochet
diff --git a/lgsm/data/centos-9.csv b/lgsm/data/centos-9.csv
index 64a9e0645..2b6ea075d 100644
--- a/lgsm/data/centos-9.csv
+++ b/lgsm/data/centos-9.csv
@@ -89,6 +89,7 @@ pvr,libcxx
 pz,java-11-openjdk rng-tools
 q2
 q3
+q4
 ql
 qw
 ricochet
diff --git a/lgsm/data/debian-10.csv b/lgsm/data/debian-10.csv
index c890739c5..e7e81b75e 100644
--- a/lgsm/data/debian-10.csv
+++ b/lgsm/data/debian-10.csv
@@ -89,6 +89,7 @@ pvr,libc++1
 pz,openjdk-11-jre,rng-tools
 q2
 q3
+q4
 ql
 qw
 ricochet
diff --git a/lgsm/data/debian-11.csv b/lgsm/data/debian-11.csv
index c265a1f4b..a40fd1c7b 100644
--- a/lgsm/data/debian-11.csv
+++ b/lgsm/data/debian-11.csv
@@ -89,6 +89,7 @@ pvr,libc++1
 pz,openjdk-17-jre,rng-tools
 q2
 q3
+q4
 ql
 qw
 ricochet
diff --git a/lgsm/data/debian-12.csv b/lgsm/data/debian-12.csv
index 00351bde8..5141290ff 100644
--- a/lgsm/data/debian-12.csv
+++ b/lgsm/data/debian-12.csv
@@ -89,6 +89,7 @@ pvr,libc++1
 pz,openjdk-17-jre,rng-tools5
 q2
 q3
+q4
 ql
 qw
 ricochet
diff --git a/lgsm/data/debian-9.csv b/lgsm/data/debian-9.csv
index 6fd3c21ee..6deebf592 100644
--- a/lgsm/data/debian-9.csv
+++ b/lgsm/data/debian-9.csv
@@ -89,6 +89,7 @@ pvr,libc++1
 pz,openjdk-8-jre,rng-tools
 q2
 q3
+q4
 ql
 qw
 ricochet
diff --git a/lgsm/data/gameicons/q4-icon.png b/lgsm/data/gameicons/q4-icon.png
new file mode 100644
index 0000000000000000000000000000000000000000..dd4c2d7fa46d79571053be5e7b7df59fa20c09c3
GIT binary patch
literal 786
zcmV+t1MU2YP)<h;3K|Lk000e1NJLTq001BW001Be0{{R3M5Kzw00009a7bBm00001
z0000108b^v)&KwiW>8F2MF0Q*1_lcO4FCcX00RgC0s#vJ1Oov81pop700jUD82}I=
z0aIouXL~(7R0kI;0Vg^G9xwwjMGjeTB12OiV01T2Tq-(F3vGftM_m&b8WeesO?;C^
zP*F<|4ij5!K7Ec>E;bwVP8=Tq00L4;L_t(I%S}_;mg_1EGsb{TLheZ~(@s18|C3uz
zd)7MXOG<>0WI@k+N?C}R$6*#JDJWlt8ac60_<hoyQphAGN576np%jvBT_-aY0)k9a
zAu?&}A;wCSMWwFS<$R|=fKgUEZfo?V^9eSt`v?vNAP{M`8T=xu;RF=p<#s*snNrEB
z(xyI|nnHmC)c7%sP?;S7s=D4L5u=g{9^WDT1d8k`imENswc3B*6IRr=Wvy0900XHU
z^+ybf@a`y_BHb`_03`Qe(({|0ArpiH5Q=q|VK&6(E&zyq=Nj=daa`ej8b%8#L8odw
zc)5roG~qunWGU9hli?RKv2B^TK~hrQ`i^msbuW+#IRlQcuGL{<3l^`_Ztk*Gtg#jc
zAV1kJ++U!x-rSGH_Y_}?>kiIPl07QNb`hA1KP+)yB9Dhh=TX5pX2rtO`?d`6G52j`
zt_{9CclEds)wV_MmVM^_m|5nnUldaWKipCIwK(k?3m!uf60f(>ihuST0VqhbzN^%T
z?^R^pBTOSO`iu){V(0wY8;Z2I*0ySr3x*~hJ35dtCQx^EgveMcyFN(sM$xAghz#dT
zcZm;>`NVv3;^e27gc5k>o`dA{t%0x8*)g1lK&>bkemEs?gTd%Cix0%BQmg`CUa9<T
zXYd@*F#XD?eRs9fc%pM%&U@iKDgda(Hus-oJ~spax9NY2*Gu`eEN)Rx>3$8N7F%J8
z9A@&jVMh6+CwG$RuI}+mh|c|q+W*eD)AOD~2sumkQ3c$7TmbVmEav<3A1ulqYgKzI
Q5dZ)H07*qoM6N<$f}~SJ*8l(j

literal 0
HcmV?d00001

diff --git a/lgsm/data/rhel-7.csv b/lgsm/data/rhel-7.csv
index 8a748cda7..373992242 100644
--- a/lgsm/data/rhel-7.csv
+++ b/lgsm/data/rhel-7.csv
@@ -89,6 +89,7 @@ pvr,libcxx
 pz,java-11-openjdk rng-tools
 q2
 q3
+q4
 ql
 qw
 ricochet
diff --git a/lgsm/data/rhel-8.csv b/lgsm/data/rhel-8.csv
index 561b3c134..6427b1460 100644
--- a/lgsm/data/rhel-8.csv
+++ b/lgsm/data/rhel-8.csv
@@ -89,6 +89,7 @@ pvr,libcxx
 pz,java-11-openjdk rng-tools
 q2
 q3
+q4
 ql
 qw
 ricochet
diff --git a/lgsm/data/rhel-9.csv b/lgsm/data/rhel-9.csv
index 64a9e0645..2b6ea075d 100644
--- a/lgsm/data/rhel-9.csv
+++ b/lgsm/data/rhel-9.csv
@@ -89,6 +89,7 @@ pvr,libcxx
 pz,java-11-openjdk rng-tools
 q2
 q3
+q4
 ql
 qw
 ricochet
diff --git a/lgsm/data/rocky-8.csv b/lgsm/data/rocky-8.csv
index 561b3c134..6427b1460 100644
--- a/lgsm/data/rocky-8.csv
+++ b/lgsm/data/rocky-8.csv
@@ -89,6 +89,7 @@ pvr,libcxx
 pz,java-11-openjdk rng-tools
 q2
 q3
+q4
 ql
 qw
 ricochet
diff --git a/lgsm/data/rocky-9.csv b/lgsm/data/rocky-9.csv
index 64a9e0645..2b6ea075d 100644
--- a/lgsm/data/rocky-9.csv
+++ b/lgsm/data/rocky-9.csv
@@ -89,6 +89,7 @@ pvr,libcxx
 pz,java-11-openjdk rng-tools
 q2
 q3
+q4
 ql
 qw
 ricochet
diff --git a/lgsm/data/serverlist.csv b/lgsm/data/serverlist.csv
index 20ea2e6c7..16c1e812f 100644
--- a/lgsm/data/serverlist.csv
+++ b/lgsm/data/serverlist.csv
@@ -87,6 +87,7 @@ pvr,pvrserver,Pavlov VR,ubuntu-22.04
 pz,pzserver,Project Zomboid,ubuntu-22.04
 q2,q2server,Quake 2,ubuntu-22.04
 q3,q3server,Quake 3: Arena,ubuntu-22.04
+q4,q4server,Quake 4,ubuntu-22.04
 ql,qlserver,Quake Live,ubuntu-22.04
 qw,qwserver,Quake World,ubuntu-22.04
 ricochet,ricochetserver,Ricochet,ubuntu-22.04
diff --git a/lgsm/data/ubuntu-16.04.csv b/lgsm/data/ubuntu-16.04.csv
index e91bec26d..b2c62f49f 100644
--- a/lgsm/data/ubuntu-16.04.csv
+++ b/lgsm/data/ubuntu-16.04.csv
@@ -89,6 +89,7 @@ pvr,libc++1
 pz,openjdk-8-jre,rng-tools
 q2
 q3
+q4
 ql
 qw
 ricochet
diff --git a/lgsm/data/ubuntu-18.04.csv b/lgsm/data/ubuntu-18.04.csv
index c890739c5..e7e81b75e 100644
--- a/lgsm/data/ubuntu-18.04.csv
+++ b/lgsm/data/ubuntu-18.04.csv
@@ -89,6 +89,7 @@ pvr,libc++1
 pz,openjdk-11-jre,rng-tools
 q2
 q3
+q4
 ql
 qw
 ricochet
diff --git a/lgsm/data/ubuntu-20.04.csv b/lgsm/data/ubuntu-20.04.csv
index e66eb7dc6..e751ad7e3 100644
--- a/lgsm/data/ubuntu-20.04.csv
+++ b/lgsm/data/ubuntu-20.04.csv
@@ -89,6 +89,7 @@ pvr,libc++1
 pz,openjdk-17-jre,rng-tools
 q2
 q3
+q4
 ql
 qw
 ricochet
diff --git a/lgsm/data/ubuntu-22.04.csv b/lgsm/data/ubuntu-22.04.csv
index ffc637ab7..dfbe3f3e4 100644
--- a/lgsm/data/ubuntu-22.04.csv
+++ b/lgsm/data/ubuntu-22.04.csv
@@ -89,6 +89,7 @@ pvr,libc++1
 pz,openjdk-17-jre,rng-tools5
 q2
 q3
+q4
 ql
 qw
 ricochet
diff --git a/lgsm/data/ubuntu-23.04.csv b/lgsm/data/ubuntu-23.04.csv
index 65e17bf1b..24b6ef39e 100644
--- a/lgsm/data/ubuntu-23.04.csv
+++ b/lgsm/data/ubuntu-23.04.csv
@@ -89,6 +89,7 @@ pvr,libc++1
 pz,openjdk-17-jre,rng-tools5
 q2
 q3
+q4
 ql
 qw
 ricochet
diff --git a/lgsm/data/ubuntu-23.10.csv b/lgsm/data/ubuntu-23.10.csv
index 65e17bf1b..24b6ef39e 100644
--- a/lgsm/data/ubuntu-23.10.csv
+++ b/lgsm/data/ubuntu-23.10.csv
@@ -89,6 +89,7 @@ pvr,libc++1
 pz,openjdk-17-jre,rng-tools5
 q2
 q3
+q4
 ql
 qw
 ricochet
diff --git a/lgsm/modules/info_game.sh b/lgsm/modules/info_game.sh
index d22570716..81767408d 100644
--- a/lgsm/modules/info_game.sh
+++ b/lgsm/modules/info_game.sh
@@ -1685,6 +1685,25 @@ fn_info_game_q3() {
 	defaultmap="${defaultmap:-"NOT SET"}"
 }
 
+# Config Type: QuakeC
+# Comment: // or /* */
+# fn_info_game_quakec "SERVERNAME"
+# Filetype: cfg
+fn_info_game_q4() {
+	if [ -f "${servercfgfullpath}" ]; then
+		fn_info_game_quakec "maxplayers" "sv_maxclients"
+		fn_info_game_quakec "rconpassword" "net_serverRemoteConsolePassword"
+		fn_info_game_quakec "servername" "si_name"
+		fn_info_game_quakec "serverpassword" "g_password"
+	fi
+	maxplayers="${maxplayers:-"0"}"
+	rconpassword="${rconpassword:-"NOT SET"}"
+	servername="${servername:-"NOT SET"}"
+	port="${port:-"0"}"
+	queryport="${port}"
+	defaultmap="${defaultmap:-"NOT SET"}"
+}
+
 # Config Type: QuakeC
 # Comment: // or /* */
 # Example: set sv_hostname "SERVERNAME"
@@ -2346,6 +2365,8 @@ elif [ "${shortname}" == "q2" ]; then
 	fn_info_game_q2
 elif [ "${shortname}" == "q3" ]; then
 	fn_info_game_q3
+elif [ "${shortname}" == "q4" ]; then
+	fn_info_game_q4
 elif [ "${shortname}" == "ql" ]; then
 	fn_info_game_ql
 elif [ "${shortname}" == "qw" ]; then
diff --git a/lgsm/modules/info_messages.sh b/lgsm/modules/info_messages.sh
index fe019da44..1e3bfad4b 100644
--- a/lgsm/modules/info_messages.sh
+++ b/lgsm/modules/info_messages.sh
@@ -694,6 +694,8 @@ fn_info_messages_ports() {
 		portcommand="ss -tuplwn | grep bf1942_lnxded"
 	elif [ "${shortname}" == "dayz" ]; then
 		portcommand="ss -tuplwn | grep enfMain"
+	elif [ "${shortname}" == "q4" ]; then
+		portcommand="ss -tuplwn | grep q4ded.x86"
 	elif [ "${shortname}" == "mc" ] || [ "${shortname}" == "nec" ] || [ "${shortname}" == "pmc" ] || [ "${shortname}" == "vpmc" ] || [ "${shortname}" == "wmc" ]; then
 		portcommand="ss -tuplwn | grep java"
 	elif [ "${shortname}" == "terraria" ]; then
@@ -1286,6 +1288,7 @@ fn_info_messages_q2() {
 	{
 		fn_port "header"
 		fn_port "Game" port udp
+		fn_port "Query" queryport udp
 	} | column -s $'\t' -t
 }
 
@@ -1293,6 +1296,15 @@ fn_info_messages_q3() {
 	{
 		fn_port "header"
 		fn_port "Game" port udp
+		fn_port "Query" queryport udp
+	} | column -s $'\t' -t
+}
+
+fn_info_messages_q4() {
+	{
+		fn_port "header"
+		fn_port "Game" port udp
+		fn_port "Query" queryport udp
 	} | column -s $'\t' -t
 }
 
@@ -1792,6 +1804,8 @@ fn_info_messages_select_engine() {
 		fn_info_messages_q2
 	elif [ "${shortname}" == "q3" ]; then
 		fn_info_messages_q3
+	elif [ "${shortname}" == "q4" ]; then
+		fn_info_messages_q3
 	elif [ "${shortname}" == "ql" ]; then
 		fn_info_messages_ql
 	elif [ "${shortname}" == "qw" ]; then
diff --git a/lgsm/modules/install_config.sh b/lgsm/modules/install_config.sh
index 0e688b65d..a163243dc 100644
--- a/lgsm/modules/install_config.sh
+++ b/lgsm/modules/install_config.sh
@@ -634,6 +634,12 @@ elif [ "${shortname}" == "q2" ]; then
 	fn_set_config_vars
 	fn_list_config_locations
 elif [ "${shortname}" == "q3" ]; then
+	array_configs+=(server.cfg)
+	fn_fetch_default_configs
+	fn_default_config_remote
+	fn_set_config_vars
+	fn_list_config_locations
+elif [ "${shortname}" == "q4" ]; then
 	array_configs+=(server.cfg)
 	fn_fetch_default_config
 	fn_default_config_remote
diff --git a/lgsm/modules/install_server_files.sh b/lgsm/modules/install_server_files.sh
index 2763f470b..c5fe822ad 100644
--- a/lgsm/modules/install_server_files.sh
+++ b/lgsm/modules/install_server_files.sh
@@ -106,6 +106,13 @@ fn_install_server_files() {
 		chmodx="nochmodx" run="norun"
 		force="noforce"
 		md5="b0e26d8919fe9313fb9d8ded2360f3db"
+	elif [ "${shortname}" == "q4" ]; then
+		remote_fileurl="http://linuxgsm.download/Quake4/quake4-1.4.2-x86-linuxded.tar.xz"
+		local_filedir="${tmpdir}"
+		local_filename="quake4-1.4.2-x86-linuxded.tar.xz"
+		chmodx="nochmodx" run="norun"
+		force="noforce"
+		md5="afe30b44f23c8ae2ce6f0f464473d8ba"
 	elif [ "${shortname}" == "qw" ]; then
 		remote_fileurl="http://linuxgsm.download/QuakeWorld/nquake.server.linux.190506.full.tar.xz"
 		local_filedir="${tmpdir}"
@@ -240,7 +247,7 @@ elif [ "${shortname}" == "vints" ]; then
 elif [ "${shortname}" == "ut99" ]; then
 	fn_install_server_files
 	update_ut99.sh
-elif [ -z "${appid}" ] || [ "${shortname}" == "ahl" ] || [ "${shortname}" == "bb" ] || [ "${shortname}" == "ns" ] || [ "${shortname}" == "sfc" ] || [ "${shortname}" == "ts" ] || [ "${shortname}" == "vs" ] || [ "${shortname}" == "zmr" ]; then
+elif [ -z "${appid}" ] || [ "${shortname}" == "ahl" ] || [ "${shortname}" == "bb" ] || [ "${shortname}" == "q4" ] || [ "${shortname}" == "ns" ] || [ "${shortname}" == "sfc" ] || [ "${shortname}" == "ts" ] || [ "${shortname}" == "vs" ] || [ "${shortname}" == "zmr" ]; then
 	if [ "${shortname}" == "ut" ]; then
 		install_eula.sh
 	fi

From f28a4e56886504c67fc77278ec3361c70ca87021 Mon Sep 17 00:00:00 2001
From: Daniel Gibbs <me@danielgibbs.co.uk>
Date: Sun, 3 Dec 2023 00:08:53 +0000
Subject: [PATCH 051/154] fix(kf2): repair port parsing

---
 lgsm/modules/info_game.sh | 10 +++++-----
 1 file changed, 5 insertions(+), 5 deletions(-)

diff --git a/lgsm/modules/info_game.sh b/lgsm/modules/info_game.sh
index 81767408d..418949678 100644
--- a/lgsm/modules/info_game.sh
+++ b/lgsm/modules/info_game.sh
@@ -489,7 +489,7 @@ fn_info_game_kf() {
 	if [ -f "${servercfgfullpath}" ]; then
 		fn_info_game_ini "adminpassword" "AdminPassword"
 		fn_info_game_ini "httpenabled" "bEnabled"
-		fn_info_game_ini "httppassword" "httppasswordword"
+		fn_info_game_ini "httppassword" "AdminPassword"
 		fn_info_game_ini "httpport" "ListenPort"
 		fn_info_game_ini "httpuser" "AdminName"
 		fn_info_game_ini "lanport" "LANServerPort"
@@ -525,11 +525,11 @@ fn_info_game_kf2() {
 	if [ -f "${servercfgfullpath}" ]; then
 		fn_info_game_ini "adminpassword" "AdminPassword"
 		fn_info_game_ini "httpport" "ListenPort" "${servercfgdir}/KFWeb.ini"
-		fn_info_game_ini "port" "Port"
+		fn_info_game_ini "port" "Port" "${servercfgdir}/LinuxServer-KFEngine.ini"
 		fn_info_game_ini "servername" "ServerName"
 		fn_info_game_ini "serverpassword" "GamePassword"
-		fn_info_game_ini "httpenabled" "bEnabled"
-		fn_info_game_ini "httppassword" "httppasswordword"
+		fn_info_game_ini "httpenabled" "bEnabled" "${servercfgdir}/KFWeb.ini"
+		fn_info_game_ini "httppassword" "AdminPassword"
 	fi
 	adminpassword="${adminpassword:-"NOT SET"}"
 	defaultmap="${defaultmap:-"NOT SET"}"
@@ -1751,7 +1751,7 @@ fn_info_game_ro() {
 	if [ -f "${servercfgfullpath}" ]; then
 		fn_info_game_ini "adminpassword" "AdminPassword"
 		fn_info_game_ini "httpenabled" "bEnabled"
-		fn_info_game_ini "httppassword" "httppasswordword"
+		fn_info_game_ini "httppassword" "AdminPassword"
 		fn_info_game_ini "httpport" "ListenPort"
 		fn_info_game_ini "httpuser" "AdminName"
 		fn_info_game_ini "lanport" "LANServerPort"

From 5685ece4bc3dd2a1104388fd0fcf1388b636a219 Mon Sep 17 00:00:00 2001
From: Daniel Gibbs <me@danielgibbs.co.uk>
Date: Sun, 3 Dec 2023 19:56:54 +0000
Subject: [PATCH 052/154] deprecate cd

---
 lgsm/data/almalinux-8.csv       |   1 -
 lgsm/data/almalinux-9.csv       |   1 -
 lgsm/data/centos-7.csv          |   1 -
 lgsm/data/centos-8.csv          |   1 -
 lgsm/data/centos-9.csv          |   1 -
 lgsm/data/debian-10.csv         |   1 -
 lgsm/data/debian-11.csv         |   1 -
 lgsm/data/debian-12.csv         |   1 -
 lgsm/data/debian-9.csv          |   1 -
 lgsm/data/gameicons/cd-icon.png | Bin 2819 -> 0 bytes
 lgsm/data/rhel-7.csv            |   1 -
 lgsm/data/rhel-8.csv            |   1 -
 lgsm/data/rhel-9.csv            |   1 -
 lgsm/data/rocky-8.csv           |   1 -
 lgsm/data/rocky-9.csv           |   1 -
 lgsm/data/ubuntu-16.04.csv      |   1 -
 lgsm/data/ubuntu-18.04.csv      |   1 -
 lgsm/data/ubuntu-20.04.csv      |   1 -
 lgsm/data/ubuntu-22.04.csv      |   1 -
 lgsm/data/ubuntu-23.04.csv      |   1 -
 lgsm/data/ubuntu-23.10.csv      |   1 -
 21 files changed, 20 deletions(-)
 delete mode 100644 lgsm/data/gameicons/cd-icon.png

diff --git a/lgsm/data/almalinux-8.csv b/lgsm/data/almalinux-8.csv
index 6427b1460..dcfb14528 100644
--- a/lgsm/data/almalinux-8.csv
+++ b/lgsm/data/almalinux-8.csv
@@ -19,7 +19,6 @@ bs
 bt,libicu,dos2unix,libxml2
 btl
 cc
-cd
 ck,xorg-x11-server-Xvfb
 cmw
 cod,compat-libstdc++-33.i686
diff --git a/lgsm/data/almalinux-9.csv b/lgsm/data/almalinux-9.csv
index 2b6ea075d..bcd93857b 100644
--- a/lgsm/data/almalinux-9.csv
+++ b/lgsm/data/almalinux-9.csv
@@ -19,7 +19,6 @@ bs
 bt,libicu,dos2unix,libxml2
 btl
 cc
-cd
 ck,xorg-x11-server-Xvfb
 cmw
 cod,compat-libstdc++-33.i686
diff --git a/lgsm/data/centos-7.csv b/lgsm/data/centos-7.csv
index 2c876efc2..10500627e 100644
--- a/lgsm/data/centos-7.csv
+++ b/lgsm/data/centos-7.csv
@@ -19,7 +19,6 @@ bs
 bt,libicu,dos2unix,libxml2
 btl
 cc
-cd
 ck,xorg-x11-server-Xvfb
 cmw
 cod,compat-libstdc++-33.i686
diff --git a/lgsm/data/centos-8.csv b/lgsm/data/centos-8.csv
index 6427b1460..dcfb14528 100644
--- a/lgsm/data/centos-8.csv
+++ b/lgsm/data/centos-8.csv
@@ -19,7 +19,6 @@ bs
 bt,libicu,dos2unix,libxml2
 btl
 cc
-cd
 ck,xorg-x11-server-Xvfb
 cmw
 cod,compat-libstdc++-33.i686
diff --git a/lgsm/data/centos-9.csv b/lgsm/data/centos-9.csv
index 2b6ea075d..bcd93857b 100644
--- a/lgsm/data/centos-9.csv
+++ b/lgsm/data/centos-9.csv
@@ -19,7 +19,6 @@ bs
 bt,libicu,dos2unix,libxml2
 btl
 cc
-cd
 ck,xorg-x11-server-Xvfb
 cmw
 cod,compat-libstdc++-33.i686
diff --git a/lgsm/data/debian-10.csv b/lgsm/data/debian-10.csv
index e7e81b75e..b2c646f9f 100644
--- a/lgsm/data/debian-10.csv
+++ b/lgsm/data/debian-10.csv
@@ -19,7 +19,6 @@ bs
 bt,libicu-dev,dos2unix,libxml2-utils
 btl
 cc
-cd
 ck,xvfb,libxi6
 cmw
 cod,libstdc++5:i386
diff --git a/lgsm/data/debian-11.csv b/lgsm/data/debian-11.csv
index a40fd1c7b..70f0a3fbe 100644
--- a/lgsm/data/debian-11.csv
+++ b/lgsm/data/debian-11.csv
@@ -19,7 +19,6 @@ bs
 bt,libicu-dev,dos2unix,libxml2-utils
 btl
 cc
-cd
 ck,xvfb,libxi6
 cmw
 cod,libstdc++5:i386
diff --git a/lgsm/data/debian-12.csv b/lgsm/data/debian-12.csv
index 5141290ff..e3466158d 100644
--- a/lgsm/data/debian-12.csv
+++ b/lgsm/data/debian-12.csv
@@ -19,7 +19,6 @@ bs
 bt,libicu-dev,dos2unix,libxml2-utils
 btl
 cc
-cd
 ck,xvfb,libxi6
 cmw
 cod,libstdc++5:i386
diff --git a/lgsm/data/debian-9.csv b/lgsm/data/debian-9.csv
index 6deebf592..303bd51dc 100644
--- a/lgsm/data/debian-9.csv
+++ b/lgsm/data/debian-9.csv
@@ -19,7 +19,6 @@ bs
 bt,libicu-dev,dos2unix,libxml2-utils
 btl
 cc
-cd
 ck,xvfb,libxi6
 cmw
 cod,libstdc++5:i386
diff --git a/lgsm/data/gameicons/cd-icon.png b/lgsm/data/gameicons/cd-icon.png
deleted file mode 100644
index dddd49f7c40781aa78c47fbbdb28e6d889e41c2a..0000000000000000000000000000000000000000
GIT binary patch
literal 0
HcmV?d00001

literal 2819
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
Tt|?&kn>i?BOJt#uYs7y6+R9E?

diff --git a/lgsm/data/rhel-7.csv b/lgsm/data/rhel-7.csv
index 373992242..f0a068399 100644
--- a/lgsm/data/rhel-7.csv
+++ b/lgsm/data/rhel-7.csv
@@ -19,7 +19,6 @@ bs
 bt,libicu,dos2unix,libxml2
 btl
 cc
-cd
 ck,xorg-x11-server-Xvfb
 cmw
 cod,compat-libstdc++-33.i686
diff --git a/lgsm/data/rhel-8.csv b/lgsm/data/rhel-8.csv
index 6427b1460..dcfb14528 100644
--- a/lgsm/data/rhel-8.csv
+++ b/lgsm/data/rhel-8.csv
@@ -19,7 +19,6 @@ bs
 bt,libicu,dos2unix,libxml2
 btl
 cc
-cd
 ck,xorg-x11-server-Xvfb
 cmw
 cod,compat-libstdc++-33.i686
diff --git a/lgsm/data/rhel-9.csv b/lgsm/data/rhel-9.csv
index 2b6ea075d..bcd93857b 100644
--- a/lgsm/data/rhel-9.csv
+++ b/lgsm/data/rhel-9.csv
@@ -19,7 +19,6 @@ bs
 bt,libicu,dos2unix,libxml2
 btl
 cc
-cd
 ck,xorg-x11-server-Xvfb
 cmw
 cod,compat-libstdc++-33.i686
diff --git a/lgsm/data/rocky-8.csv b/lgsm/data/rocky-8.csv
index 6427b1460..dcfb14528 100644
--- a/lgsm/data/rocky-8.csv
+++ b/lgsm/data/rocky-8.csv
@@ -19,7 +19,6 @@ bs
 bt,libicu,dos2unix,libxml2
 btl
 cc
-cd
 ck,xorg-x11-server-Xvfb
 cmw
 cod,compat-libstdc++-33.i686
diff --git a/lgsm/data/rocky-9.csv b/lgsm/data/rocky-9.csv
index 2b6ea075d..bcd93857b 100644
--- a/lgsm/data/rocky-9.csv
+++ b/lgsm/data/rocky-9.csv
@@ -19,7 +19,6 @@ bs
 bt,libicu,dos2unix,libxml2
 btl
 cc
-cd
 ck,xorg-x11-server-Xvfb
 cmw
 cod,compat-libstdc++-33.i686
diff --git a/lgsm/data/ubuntu-16.04.csv b/lgsm/data/ubuntu-16.04.csv
index b2c62f49f..c8e10e48e 100644
--- a/lgsm/data/ubuntu-16.04.csv
+++ b/lgsm/data/ubuntu-16.04.csv
@@ -19,7 +19,6 @@ bs
 bt,libicu-dev,dos2unix,libxml2-utils
 btl
 cc
-cd
 ck,xvfb,libxi6
 cmw
 cod,libstdc++5:i386
diff --git a/lgsm/data/ubuntu-18.04.csv b/lgsm/data/ubuntu-18.04.csv
index e7e81b75e..b2c646f9f 100644
--- a/lgsm/data/ubuntu-18.04.csv
+++ b/lgsm/data/ubuntu-18.04.csv
@@ -19,7 +19,6 @@ bs
 bt,libicu-dev,dos2unix,libxml2-utils
 btl
 cc
-cd
 ck,xvfb,libxi6
 cmw
 cod,libstdc++5:i386
diff --git a/lgsm/data/ubuntu-20.04.csv b/lgsm/data/ubuntu-20.04.csv
index e751ad7e3..853b98f33 100644
--- a/lgsm/data/ubuntu-20.04.csv
+++ b/lgsm/data/ubuntu-20.04.csv
@@ -19,7 +19,6 @@ bs
 bt,libicu-dev,dos2unix,libxml2-utils
 btl
 cc
-cd
 ck,xvfb,libxi6
 cmw
 cod,libstdc++5:i386
diff --git a/lgsm/data/ubuntu-22.04.csv b/lgsm/data/ubuntu-22.04.csv
index dfbe3f3e4..d42afde49 100644
--- a/lgsm/data/ubuntu-22.04.csv
+++ b/lgsm/data/ubuntu-22.04.csv
@@ -19,7 +19,6 @@ bs
 bt,libicu-dev,dos2unix,libxml2-utils
 btl
 cc
-cd
 ck,xvfb,libxi6
 cmw
 cod,libstdc++5:i386
diff --git a/lgsm/data/ubuntu-23.04.csv b/lgsm/data/ubuntu-23.04.csv
index 24b6ef39e..ac4f05945 100644
--- a/lgsm/data/ubuntu-23.04.csv
+++ b/lgsm/data/ubuntu-23.04.csv
@@ -19,7 +19,6 @@ bs
 bt,libicu-dev,dos2unix,libxml2-utils
 btl
 cc
-cd
 ck,xvfb,libxi6
 cmw
 cod,libstdc++5:i386
diff --git a/lgsm/data/ubuntu-23.10.csv b/lgsm/data/ubuntu-23.10.csv
index 24b6ef39e..ac4f05945 100644
--- a/lgsm/data/ubuntu-23.10.csv
+++ b/lgsm/data/ubuntu-23.10.csv
@@ -19,7 +19,6 @@ bs
 bt,libicu-dev,dos2unix,libxml2-utils
 btl
 cc
-cd
 ck,xvfb,libxi6
 cmw
 cod,libstdc++5:i386

From cb5bca9573d6036b0c1535a01126a7333517688d Mon Sep 17 00:00:00 2001
From: Daniel Gibbs <me@danielgibbs.co.uk>
Date: Sun, 3 Dec 2023 20:17:03 +0000
Subject: [PATCH 053/154] lint

---
 lgsm/modules/fix_vh.sh      | 10 +++++-----
 lgsm/modules/info_distro.sh | 10 +++++-----
 2 files changed, 10 insertions(+), 10 deletions(-)

diff --git a/lgsm/modules/fix_vh.sh b/lgsm/modules/fix_vh.sh
index ff02eaddd..7c1455443 100644
--- a/lgsm/modules/fix_vh.sh
+++ b/lgsm/modules/fix_vh.sh
@@ -18,11 +18,11 @@ if [ -f "${modsinstalledlistfullpath}" ]; then
 			executable="./start_server_bepinex.sh"
 		fi
 		if [ -d "${serverfiles}/unstripped_corlib" ]; then
-            rm -rf "${serverfiles}/unstripped_corlib"
-        fi
-        sed -i 's/^dllSearchPathOverride=unstripped_corlib/# &/' "${serverfiles}/doorstop_config.ini"
-    	sed -i 's/^export DOORSTOP_CORLIB_OVERRIDE_PATH="$BASEDIR\/unstripped_corlib"/# &/' "${serverfiles}/start_game_bepinex.sh"
-        sed -i 's/^export DOORSTOP_CORLIB_OVERRIDE_PATH="${VALHEIM_PLUS_PATH}\/unstripped_corlib"/# &/' "${serverfiles}/start_server_bepinex.sh"
+			rm -rf "${serverfiles}/unstripped_corlib"
+		fi
+		sed -i "s/^dllSearchPathOverride=unstripped_corlib/# &/" "${serverfiles}/doorstop_config.ini"
+		sed -i "s/^export DOORSTOP_CORLIB_OVERRIDE_PATH="$BASEDIR\/unstripped_corlib"/# &/" "${serverfiles}/start_game_bepinex.sh"
+		sed -i "s/^export DOORSTOP_CORLIB_OVERRIDE_PATH="${VALHEIM_PLUS_PATH}\/unstripped_corlib"/# &/" "${serverfiles}/start_server_bepinex.sh"
 	fi
 	# special exports for BepInEx if installed
 	if grep -qE "^bepinexvh" "${modsinstalledlistfullpath}"; then
diff --git a/lgsm/modules/info_distro.sh b/lgsm/modules/info_distro.sh
index 828946139..cb832a87b 100644
--- a/lgsm/modules/info_distro.sh
+++ b/lgsm/modules/info_distro.sh
@@ -28,15 +28,15 @@ kernel="$(uname -r)" # Kernel e.g. 2.6.32-042stab120.16
 distro_info_array=(os-release lsb_release hostnamectl debian_version redhat-release)
 for distro_info in "${distro_info_array[@]}"; do
 	if [ -f "/etc/os-release" ] && [ "${distro_info}" == "os-release" ]; then
-		distroname="$(grep "PRETTY_NAME" /etc/os-release | awk -F\= '{gsub(/"/,"",$2);print $2}')"   # e.g. Ubuntu 22.04.3 LTS
-		distroversion="$(grep "VERSION_ID" /etc/os-release | awk -F\= '{gsub(/"/,"",$2);print $2}')" # e.g. 22.04
+		distroname="$(grep "PRETTY_NAME" /etc/os-release | awk -F= '{gsub(/"/,"",$2);print $2}')"   # e.g. Ubuntu 22.04.3 LTS
+		distroversion="$(grep "VERSION_ID" /etc/os-release | awk -F= '{gsub(/"/,"",$2);print $2}')" # e.g. 22.04
 		# Special var for rhel like distros to remove point in number e.g 8.4 to just 8.
 		if [[ "${distroidlike}" == *"rhel"* ]] || [ "${distroid}" == "rhel" ]; then
 			distroversionrh="$(sed -nr 's/^VERSION_ID="([0-9]*).+?"/\1/p' /etc/os-release)" # e.g. 8
 		fi
-		distroid="$(grep "ID=" /etc/os-release | grep -v _ID | awk -F\= '{gsub(/"/,"",$2);print $2}')"          # e.g. ubuntu
-		distroidlike="$(grep "ID_LIKE=" /etc/os-release | grep -v _ID | awk -F\= '{gsub(/"/,"",$2);print $2}')" # e.g. debian
-		distrocodename="$(grep "VERSION_CODENAME" /etc/os-release | awk -F\= '{gsub(/"/,"",$2);print $2}')"     # e.g. jammy
+		distroid="$(grep "ID=" /etc/os-release | grep -v _ID | awk -F= '{gsub(/"/,"",$2);print $2}')"          # e.g. ubuntu
+		distroidlike="$(grep "ID_LIKE=" /etc/os-release | grep -v _ID | awk -F= '{gsub(/"/,"",$2);print $2}')" # e.g. debian
+		distrocodename="$(grep "VERSION_CODENAME" /etc/os-release | awk -F= '{gsub(/"/,"",$2);print $2}')"     # e.g. jammy
 	elif [ "$(command -v lsb_release 2> /dev/null)" ] && [ "${distro_info}" == "lsb_release" ]; then
 		if [ -z "${distroname}" ]; then
 			distroname="$(lsb_release -sd)" # e.g. Ubuntu 22.04.3 LTS

From becff809317e7312085dc7eba35ecbe0afb57c7b Mon Sep 17 00:00:00 2001
From: Daniel Gibbs <me@danielgibbs.co.uk>
Date: Sun, 3 Dec 2023 20:28:30 +0000
Subject: [PATCH 054/154] Release v23.7.0

---
 lgsm/modules/core_modules.sh | 2 +-
 linuxgsm.sh                  | 2 +-
 2 files changed, 2 insertions(+), 2 deletions(-)

diff --git a/lgsm/modules/core_modules.sh b/lgsm/modules/core_modules.sh
index 29249fb0b..42bc04a72 100644
--- a/lgsm/modules/core_modules.sh
+++ b/lgsm/modules/core_modules.sh
@@ -8,7 +8,7 @@
 
 moduleselfname="$(basename "$(readlink -f "${BASH_SOURCE[0]}")")"
 
-modulesversion="v23.6.2"
+modulesversion="v23.7.0"
 
 # Core
 
diff --git a/linuxgsm.sh b/linuxgsm.sh
index 8e1d06235..73bcf638a 100755
--- a/linuxgsm.sh
+++ b/linuxgsm.sh
@@ -24,7 +24,7 @@ if [ -f ".dev-debug" ]; then
 	set -x
 fi
 
-version="v23.6.2"
+version="v23.7.0"
 shortname="core"
 gameservername="core"
 commandname="CORE"

From 4b4c55948ead55ffdc54fb3bee68b95977cf49ff Mon Sep 17 00:00:00 2001
From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com>
Date: Sun, 3 Dec 2023 20:33:21 +0000
Subject: [PATCH 055/154] build(deps): bump dessant/lock-threads from 4 to 5
 (#4380)

Bumps [dessant/lock-threads](https://github.com/dessant/lock-threads) from 4 to 5.
- [Release notes](https://github.com/dessant/lock-threads/releases)
- [Changelog](https://github.com/dessant/lock-threads/blob/main/CHANGELOG.md)
- [Commits](https://github.com/dessant/lock-threads/compare/v4...v5)

---
updated-dependencies:
- dependency-name: dessant/lock-threads
  dependency-type: direct:production
  update-type: version-update:semver-major
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
Co-authored-by: Daniel Gibbs <me@danielgibbs.co.uk>
---
 .github/workflows/lock.yml | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/.github/workflows/lock.yml b/.github/workflows/lock.yml
index 4883914f8..a4fdbf547 100644
--- a/.github/workflows/lock.yml
+++ b/.github/workflows/lock.yml
@@ -12,7 +12,7 @@ jobs:
     runs-on: ubuntu-latest
     steps:
       - name: Lock Threads
-        uses: dessant/lock-threads@v4
+        uses: dessant/lock-threads@v5
         with:
           github-token: ${{ secrets.GITHUB_TOKEN }}
           issue-comment: >

From 10b6807edcbb666b94f41cbfc62e7d9ec323fb09 Mon Sep 17 00:00:00 2001
From: Daniel Gibbs <me@danielgibbs.co.uk>
Date: Sun, 10 Dec 2023 20:02:05 +0000
Subject: [PATCH 056/154] fix: system requirements bug (#4407)

* fix: added missing variable physmemtotalgb

* fix: compare RAM requirement to system's available RAM

allow numbers with decimal points to be compared
---
 lgsm/modules/check_system_requirements.sh | 2 +-
 lgsm/modules/info_distro.sh               | 7 ++++---
 2 files changed, 5 insertions(+), 4 deletions(-)

diff --git a/lgsm/modules/check_system_requirements.sh b/lgsm/modules/check_system_requirements.sh
index 5ffd0c8af..0214cdc1a 100644
--- a/lgsm/modules/check_system_requirements.sh
+++ b/lgsm/modules/check_system_requirements.sh
@@ -63,7 +63,7 @@ fi
 
 # If the game or engine has a minimum RAM Requirement, compare it to system's available RAM.
 if [ "${ramrequirementgb}" ]; then
-	if [ "${physmemtotalgb}" -lt "${ramrequirementgb}" ]; then
+	if (($(echo "${physmemtotalgb} < ${ramrequirementgb}" | bc -l))); then
 		fn_print_dots "Checking RAM"
 		fn_print_warn_nl "Checking RAM: ${ramrequirementgb}G required, ${physmemtotal} available"
 		echo "* ${gamename} server may fail to run or experience poor performance."
diff --git a/lgsm/modules/info_distro.sh b/lgsm/modules/info_distro.sh
index cb832a87b..a4e3521f8 100644
--- a/lgsm/modules/info_distro.sh
+++ b/lgsm/modules/info_distro.sh
@@ -195,15 +195,16 @@ else
 	else
 		humanreadable="-h"
 	fi
-	physmemtotalmb="$(free -m | awk '/Mem:/ {print $2}')"             # string
+	physmemtotalmb="$(free -m | awk '/Mem:/ {print $2}')"             # integer
+	physmemtotalgb="$(free -m | awk '/Mem:/ {print $2}')"             # integer
 	physmemtotal="$(free ${humanreadable} | awk '/Mem:/ {print $2}')" # string
 	physmemfree="$(free ${humanreadable} | awk '/Mem:/ {print $4}')"  # string
 	physmemused="$(free ${humanreadable} | awk '/Mem:/ {print $3}')"  # string
 
 	oldfree="$(free ${humanreadable} | awk '/cache:/')"
 	if [ "${oldfree}" ]; then
-		physmemavailable="n/a"
-		physmemcached="n/a"
+		physmemavailable="n/a" # string
+		physmemcached="n/a"    # string
 	else
 		physmemavailable="$(free ${humanreadable} | awk '/Mem:/ {print $7}')" # string
 		physmemcached="$(free ${humanreadable} | awk '/Mem:/ {print $6}')"    # string

From 8bbb60202733683e945f14d6600969e1e0c3ba70 Mon Sep 17 00:00:00 2001
From: Daniel Gibbs <me@danielgibbs.co.uk>
Date: Sun, 10 Dec 2023 20:03:10 +0000
Subject: [PATCH 057/154] Release v23.7.1

---
 lgsm/modules/core_modules.sh | 2 +-
 linuxgsm.sh                  | 2 +-
 2 files changed, 2 insertions(+), 2 deletions(-)

diff --git a/lgsm/modules/core_modules.sh b/lgsm/modules/core_modules.sh
index 42bc04a72..5a0543b9c 100644
--- a/lgsm/modules/core_modules.sh
+++ b/lgsm/modules/core_modules.sh
@@ -8,7 +8,7 @@
 
 moduleselfname="$(basename "$(readlink -f "${BASH_SOURCE[0]}")")"
 
-modulesversion="v23.7.0"
+modulesversion="v23.7.1"
 
 # Core
 
diff --git a/linuxgsm.sh b/linuxgsm.sh
index 73bcf638a..e3286d4f2 100755
--- a/linuxgsm.sh
+++ b/linuxgsm.sh
@@ -24,7 +24,7 @@ if [ -f ".dev-debug" ]; then
 	set -x
 fi
 
-version="v23.7.0"
+version="v23.7.1"
 shortname="core"
 gameservername="core"
 commandname="CORE"

From b554c4eb211342b50986eba85d298c5a457ee287 Mon Sep 17 00:00:00 2001
From: Kalle <kalle@kandru.de>
Date: Fri, 19 Jan 2024 19:42:29 +0100
Subject: [PATCH 058/154] fix: quake2 and quake3 protocol query (#4410)

Co-authored-by: Kalle Minkner <info@kalleminkner.de>
---
 lgsm/modules/query_gsquery.py | 4 ++--
 1 file changed, 2 insertions(+), 2 deletions(-)

diff --git a/lgsm/modules/query_gsquery.py b/lgsm/modules/query_gsquery.py
index 9fbb6a254..8da93ada4 100644
--- a/lgsm/modules/query_gsquery.py
+++ b/lgsm/modules/query_gsquery.py
@@ -10,13 +10,13 @@ import argparse
 import socket
 import sys
 
-engine_types=('protocol-valve','protocol-quake3','protocol-quake3','protocol-gamespy1','protocol-unreal2','ut3','minecraft','minecraftbe','jc2mp','mumbleping','soldat','teeworlds')
+engine_types=('protocol-valve','protocol-quake2','protocol-quake3','protocol-gamespy1','protocol-unreal2','ut3','minecraft','minecraftbe','jc2mp','mumbleping','soldat','teeworlds')
 
 class gsquery:
     server_response_timeout = 2
     default_buffer_length = 1024
     sourcequery=('protocol-valve','avalanche3.0','barotrauma','madness','quakelive','realvirtuality','refractor','source','goldsrc','spark','starbound','unity3d','unreal4','wurm')
-    idtech2query=('protocol-quake3','idtech2','quake','iw2.0')
+    idtech2query=('protocol-quake2','idtech2','quake','iw2.0')
     idtech3query=('protocol-quake3','iw3.0','ioquake3','qfusion')
     minecraftquery=('minecraft','lwjgl2')
     minecraftbequery=('minecraftbe',)

From e53d2a27bf8c71a34f6d88b8363ae735b44e0359 Mon Sep 17 00:00:00 2001
From: Ryan Heath <Nosliwnayr@users.noreply.github.com>
Date: Fri, 19 Jan 2024 10:42:43 -0800
Subject: [PATCH 059/154] Fix valheimplus updateurl and typo (#4438)

---
 lgsm/modules/mods_list.sh | 4 ++--
 1 file changed, 2 insertions(+), 2 deletions(-)

diff --git a/lgsm/modules/mods_list.sh b/lgsm/modules/mods_list.sh
index 95ab63d99..bd6eaff24 100644
--- a/lgsm/modules/mods_list.sh
+++ b/lgsm/modules/mods_list.sh
@@ -97,7 +97,7 @@ oxiderustlatestlink=$(curl --connect-timeout 10 -sL https://api.github.com/repos
 oxidehurtworldlatestlink=$(curl --connect-timeout 10 -sL https://api.github.com/repos/OxideMod/Oxide.Hurtworld/releases/latest | jq -r '.assets[].browser_download_url')
 oxidesdtdlatestlink=$(curl --connect-timeout 10 -sL https://api.github.com/repos/OxideMod/Oxide.SevenDaysToDie/releases/latest | jq -r '.assets[]|select(.browser_download_url | contains("linux")) | .browser_download_url')
 # Valheim Plus
-valeimpluslatestlink=$(curl --connect-timeout 10 -sL https://api.github.com/repos/valheimPlus/ValheimPlus/releases/latest | jq -r '.assets[]|select(.browser_download_url | contains("UnixServer.tar.gz")) | .browser_download_url')
+valheimpluslatestlink=$(curl --connect-timeout 10 -sL https://api.github.com/repos/Grantapher/ValheimPlus/releases/latest | jq -r '.assets[]|select(.browser_download_url | contains("UnixServer.tar.gz")) | .browser_download_url')
 # Valheim BepInEx
 bepinexvhlatestlink=$(curl --connect-timeout 10 -sL "https://valheim.thunderstore.io/api/experimental/package/denikson/BepInExPack_Valheim/" -H "accept: application/json" | jq -r '.latest.download_url')
 
@@ -200,7 +200,7 @@ mod_info_hwoxide=(MOD "hwoxide" "Oxide for Hurtworld" "${oxidehurtworldlatestlin
 mod_info_sdtdoxide=(MOD "sdtdoxide" "Oxide for 7 Days To Die" "${oxidesdtdlatestlink}" "Oxide.SevenDaysToDie.zip" "0" "LowercaseOff" "${systemdir}" "OVERWRITE" "ENGINES" "7 Days To Die;" "NOTGAMES" "https://umod.org/games/7-days-to-die" "Allows for the use of plugins")
 
 # ValheimPlus
-mod_info_valheimplus=(MOD "valheimplus" "Valheim PLUS" "${valeimpluslatestlink}" "ValheimPlus.tar.gz" "0" "LowercaseOff" "${systemdir}" "OVERWRITE" "ENGINES" "Valheim;" "NOTGAMES" "https://github.com/Grantapher/ValheimPlus.git" "Mod to improve Valheim gameplay")
+mod_info_valheimplus=(MOD "valheimplus" "Valheim PLUS" "${valheimpluslatestlink}" "ValheimPlus.tar.gz" "0" "LowercaseOff" "${systemdir}" "OVERWRITE" "ENGINES" "Valheim;" "NOTGAMES" "https://github.com/Grantapher/ValheimPlus.git" "Mod to improve Valheim gameplay")
 
 # BepInEx Valheim
 mod_info_bepinexvh=(MOD "bepinexvh" "BepInEx Valheim" "${bepinexvhlatestlink}" "denikson-BepInExPack_Valheim.zip" "0" "LowercaseOff" "${systemdir}" "OVERWRITE" "ENGINES" "Valheim;" "NOTGAMES" "https://valheim.thunderstore.io/package/denikson/BepInExPack_Valheim/" "Unity / XNA game patcher and plugin framework")

From e2bdefdf9a66042329436ed9188b9529465d17bf Mon Sep 17 00:00:00 2001
From: Dessa <Dessa@gmake.de>
Date: Fri, 19 Jan 2024 19:43:43 +0100
Subject: [PATCH 060/154] chore: only run GitHub actions when on main account
 (#4433)

the most prominent case being update-copyright-years-in-license-file altering commit history in forks depending on configuration (sometimes these type of PRs just auto-merge on forks, creating a merge conflict when they sync their fork for preparing a PR)
additionally, some actions require secrets so they would fail anyway

Co-authored-by: Daniel Gibbs <me@danielgibbs.co.uk>
---
 .github/workflows/add-to-project.yml                         | 1 +
 .github/workflows/details-check.yml                          | 2 ++
 .github/workflows/git-sync.yml                               | 1 +
 .github/workflows/labeler.yml                                | 2 ++
 .github/workflows/lock.yml                                   | 1 +
 .github/workflows/potential-duplicates.yml                   | 1 +
 .github/workflows/serverlist-validate.yml                    | 1 +
 .github/workflows/trigger-docker-build.yml                   | 2 ++
 .github/workflows/update-check.yml                           | 1 +
 .github/workflows/update-copyright-years-in-license-file.yml | 1 +
 .github/workflows/version-check.yml                          | 1 +
 11 files changed, 14 insertions(+)

diff --git a/.github/workflows/add-to-project.yml b/.github/workflows/add-to-project.yml
index e429645bf..0ddccb572 100644
--- a/.github/workflows/add-to-project.yml
+++ b/.github/workflows/add-to-project.yml
@@ -7,6 +7,7 @@ on:
 
 jobs:
   add-to-project:
+    if: github.repository_owner == 'GameServerManagers'
     runs-on: ubuntu-latest
     steps:
       - name: Add to Project
diff --git a/.github/workflows/details-check.yml b/.github/workflows/details-check.yml
index ce9b45996..d940cfbc8 100644
--- a/.github/workflows/details-check.yml
+++ b/.github/workflows/details-check.yml
@@ -10,6 +10,7 @@ concurrency:
 
 jobs:
   create-matrix:
+    if: github.repository_owner == 'GameServerManagers'
     runs-on: ubuntu-latest
     outputs:
       matrix: ${{ steps.set-matrix.outputs.matrix }}
@@ -28,6 +29,7 @@ jobs:
           echo -n "matrix=${shortnamearray}" >> $GITHUB_OUTPUT
 
   details-check:
+    if: github.repository_owner == 'GameServerManagers'
     needs: create-matrix
     continue-on-error: true
     runs-on: ubuntu-latest
diff --git a/.github/workflows/git-sync.yml b/.github/workflows/git-sync.yml
index 42ddd42e5..2f223f370 100644
--- a/.github/workflows/git-sync.yml
+++ b/.github/workflows/git-sync.yml
@@ -9,6 +9,7 @@ on:
 
 jobs:
   gitHub-to-bitbucket:
+    if: github.repository_owner == 'GameServerManagers'
     runs-on: ubuntu-latest
     steps:
       - name: SSH Agent
diff --git a/.github/workflows/labeler.yml b/.github/workflows/labeler.yml
index 24174fb22..b8bf63084 100644
--- a/.github/workflows/labeler.yml
+++ b/.github/workflows/labeler.yml
@@ -11,6 +11,7 @@ permissions:
 
 jobs:
   issue-labeler:
+    if: github.repository_owner == 'GameServerManagers'
     runs-on: ubuntu-latest
     steps:
       - name: Issue Labeler
@@ -22,6 +23,7 @@ jobs:
           include-title: 1
 
   is-sponsor-label:
+    if: github.repository_owner == 'GameServerManagers'
     runs-on: ubuntu-latest
     steps:
       - name: Is Sponsor Label
diff --git a/.github/workflows/lock.yml b/.github/workflows/lock.yml
index a4fdbf547..ce00b840b 100644
--- a/.github/workflows/lock.yml
+++ b/.github/workflows/lock.yml
@@ -9,6 +9,7 @@ permissions:
 
 jobs:
   lock:
+    if: github.repository_owner == 'GameServerManagers'
     runs-on: ubuntu-latest
     steps:
       - name: Lock Threads
diff --git a/.github/workflows/potential-duplicates.yml b/.github/workflows/potential-duplicates.yml
index 3c7f4334c..ea0ba23fd 100644
--- a/.github/workflows/potential-duplicates.yml
+++ b/.github/workflows/potential-duplicates.yml
@@ -5,6 +5,7 @@ on:
       - opened
 jobs:
   potential-duplicates:
+    if: github.repository_owner == 'GameServerManagers'
     runs-on: ubuntu-latest
     steps:
       - name: Potential Duplicates
diff --git a/.github/workflows/serverlist-validate.yml b/.github/workflows/serverlist-validate.yml
index 931329571..f4a95a039 100644
--- a/.github/workflows/serverlist-validate.yml
+++ b/.github/workflows/serverlist-validate.yml
@@ -5,6 +5,7 @@ on:
 
 jobs:
   serverlist-validate:
+    if: github.repository_owner == 'GameServerManagers'
     runs-on: ubuntu-latest
     steps:
       - name: Checkout
diff --git a/.github/workflows/trigger-docker-build.yml b/.github/workflows/trigger-docker-build.yml
index 61ec91d39..ae66542de 100644
--- a/.github/workflows/trigger-docker-build.yml
+++ b/.github/workflows/trigger-docker-build.yml
@@ -6,6 +6,7 @@ on:
 
 jobs:
   trigger_build_docker-linuxgsm:
+    if: github.repository_owner == 'GameServerManagers'
     name: Trigger Build Docker LinuxGSM
     runs-on: ubuntu-latest
     steps:
@@ -18,6 +19,7 @@ jobs:
           workflow_file_name: docker-publish.yml
 
   trigger_build_docker-gameserver:
+    if: github.repository_owner == 'GameServerManagers'
     name: Trigger Build Docker GameServer
     needs: trigger_build_docker-linuxgsm
     runs-on: ubuntu-latest
diff --git a/.github/workflows/update-check.yml b/.github/workflows/update-check.yml
index dfbc7dd58..b93fb2c47 100644
--- a/.github/workflows/update-check.yml
+++ b/.github/workflows/update-check.yml
@@ -10,6 +10,7 @@ concurrency:
 
 jobs:
   update-check:
+    if: github.repository_owner == 'GameServerManagers'
     continue-on-error: true
     runs-on: ubuntu-latest
 
diff --git a/.github/workflows/update-copyright-years-in-license-file.yml b/.github/workflows/update-copyright-years-in-license-file.yml
index 2d6d3eeeb..3301c9cb7 100644
--- a/.github/workflows/update-copyright-years-in-license-file.yml
+++ b/.github/workflows/update-copyright-years-in-license-file.yml
@@ -6,6 +6,7 @@ on:
 
 jobs:
   update-license-year:
+    if: github.repository_owner == 'GameServerManagers'
     runs-on: ubuntu-latest
     steps:
       - name: Checkout
diff --git a/.github/workflows/version-check.yml b/.github/workflows/version-check.yml
index a66eaca14..cfa7615bd 100644
--- a/.github/workflows/version-check.yml
+++ b/.github/workflows/version-check.yml
@@ -7,6 +7,7 @@ permissions:
 
 jobs:
   version-Check:
+    if: github.repository_owner == 'GameServerManagers'
     runs-on: ubuntu-latest
     steps:
       - name: Checkout

From 2fff61f41a6ad0e0540d06db82e33c50b02a5145 Mon Sep 17 00:00:00 2001
From: Daniel Gibbs <me@danielgibbs.co.uk>
Date: Fri, 19 Jan 2024 18:44:34 +0000
Subject: [PATCH 061/154] feat(cs2): update parameters and add workshop support
 (#4405)

* feat(cs2): update config and parameter settings

* remove serverlogging

* add authkey for workshop

* add cs2 label
---
 .github/labeler.yml                           |  6 ++--
 .../config-lgsm/cs2server/_default.cfg        | 32 ++-----------------
 lgsm/modules/info_game.sh                     |  8 ++---
 3 files changed, 9 insertions(+), 37 deletions(-)

diff --git a/.github/labeler.yml b/.github/labeler.yml
index 3da0d47ee..34ffd66f1 100644
--- a/.github/labeler.yml
+++ b/.github/labeler.yml
@@ -74,6 +74,8 @@
   - "/(Barotrauma)/i"
 "game: Counter-Strike: Global Offensive":
   - "/(Counter-Strike: Global Offensive|CS:GO|csgo)/i"
+"game: Counter-Strike 2":
+  - "/(Counter-Strike 2|CS2)/i"
 "game: Counter-Strike: Source":
   - "/(Counter-Strike: Source|CS:S)/i"
 "game: Counter-Strike 1.6":
@@ -95,13 +97,13 @@
 "game: Left 4 Dead 2":
   - "/(Left 4 Dead 2|L4D2)/i"
 "game: Minecraft":
-  - "/(minecraft)((?!bedrock).)*$/i"
+  - "/(Minecraft)((?!bedrock).)*$/i"
 "game: Minecraft Bedrock":
   - "/(Bedrock)/i"
 "game: Mumble":
   - "/(Mumble)/i"
 "game: Project Zomboid":
-  - "/(Project Zomboid)/i"
+  - "/(Project Zomboid|PZ)/i"
 "game: Quake 3":
   - "/(Quake 3|Q3A|q3)/i"
 "game: Rising World":
diff --git a/lgsm/config-default/config-lgsm/cs2server/_default.cfg b/lgsm/config-default/config-lgsm/cs2server/_default.cfg
index 4eca78e35..84679da01 100644
--- a/lgsm/config-default/config-lgsm/cs2server/_default.cfg
+++ b/lgsm/config-default/config-lgsm/cs2server/_default.cfg
@@ -10,41 +10,13 @@
 
 ## Predefined Parameters | https://docs.linuxgsm.com/configuration/start-parameters
 # https://docs.linuxgsm.com/game-servers/counter-strike-2
-# [Game Modes]						gametype	gamemode	gamemodeflags	skirmishid	mapgroup (you can mix these across all Game Modes except Danger Zone, but use only one)
-# Arms Race							1			0			0				0			mg_armsrace
-# Boom! Headshot!					1			2			0				6			mg_skirmish_headshots
-# Classic Casual					0			0			0				0			mg_casualsigma, mg_casualdelta
-# Classic Competitive (Default)		0			1			0				0			mg_active, mg_reserves, mg_hostage, mg_de_dust2, ...
-# Classic Competitive (Short Match)	0			1			32				0			mg_active, mg_reserves, mg_hostage, mg_de_dust2, ...
-# Danger Zone						6			0			0				0			mg_dz_blacksite (map: dz_blacksite), mg_dz_sirocco (map: dz_sirocco)
-# Deathmatch (Default)				1			2			0				0			mg_deathmatch
-# Deathmatch (Free For All)			1			2			32				0			mg_deathmatch
-# Deathmatch (Team vs Team)			1			2			4				0			mg_deathmatch
-# Demolition						1			1			0				0			mg_demolition
-# Flying Scoutsman					0			0			0				3			mg_skirmish_flyingscoutsman
-# Hunter-Gatherers					1			2			0				7			mg_skirmish_huntergatherers
-# Retakes							0			0			0				12			mg_skirmish_retakes
-# Stab Stab Zap						0			0			0				1			mg_skirmish_stabstabzap
-# Trigger Discipline				0			0			0				4			mg_skirmish_triggerdiscipline
-# Wingman							0			2			0				0			mg_de_prime, mg_de_blagai, mg_de_vertigo, mg_de_inferno, mg_de_overpass, mg_de_cbble, mg_de_train, mg_de_shortnuke,	mg_de_shortdust, mg_de_lake
-gametype="0"
-gamemode="1"
-gamemodeflags="0"
-skirmishid="0"
-mapgroup="mg_active"
 ip="0.0.0.0"
 port="27015"
-defaultmap="de_dust2"
 maxplayers="16"
-tickrate="64"
-
-## Game Server Login Token (GSLT): Required
-# GSLT is required for running a public server.
-# More info: https://docs.linuxgsm.com/steamcmd/gslt
-gslt=""
+wsapikey=""
 
 ## Server Parameters | https://docs.linuxgsm.com/configuration/start-parameters#additional-parameters
-startparameters="-dedicated -ip ${ip} -port ${port} -maxplayers ${maxplayers} -tickrate ${tickrate} -serverlogging +sv_setsteamaccount ${gslt} +map ${defaultmap} +game_type ${gametype} +game_mode ${gamemode} +sv_game_mode_flags ${gamemodeflags} +sv_skirmish_id ${skirmishid} +sv_logfile 1 +exec ${selfname}.cfg"
+startparameters="-dedicated -ip ${ip} -port ${port} -maxplayers ${maxplayers} -authkey ${wsapikey} +exec ${selfname}.cfg"
 
 #### LinuxGSM Settings ####
 
diff --git a/lgsm/modules/info_game.sh b/lgsm/modules/info_game.sh
index 418949678..200e5fdad 100644
--- a/lgsm/modules/info_game.sh
+++ b/lgsm/modules/info_game.sh
@@ -1159,14 +1159,12 @@ fn_info_game_col() {
 fn_info_game_cs2() {
 	if [ -f "${servercfgfullpath}" ]; then
 		fn_info_game_valve_keyvalues "servername" "hostname"
-	fi
-	# Steamport can be between 26901-26910 and is normally automatically set.
-	# Some servers might support -steamport parameter to set
-	if [ "${steamport}" == "0" ] || [ -v "${steamport}" ]; then
-		steamport="$(echo "${ssinfo}" | grep "${srcdslinuxpid}" | awk '{print $5}' | grep ":269" | cut -d ":" -f2)"
+		fn_info_game_valve_keyvalues "defaultmap" "map"
+		fn_info_game_valve_keyvalues "password" "sv_password"
 	fi
 	defaultmap="${defaultmap:-"NOT SET"}"
 	maxplayers="${maxplayers:-"0"}"
+	password="${password:-"NOT SET"}"
 	port="${port:-"0"}"
 	queryport="${port:-"0"}"
 	servername="${servername:-"NOT SET"}"

From b58016d896c46e772e7c6da25b839cbda7c8a2c6 Mon Sep 17 00:00:00 2001
From: "github-actions[bot]"
 <41898282+github-actions[bot]@users.noreply.github.com>
Date: Fri, 19 Jan 2024 18:45:44 +0000
Subject: [PATCH 062/154] docs(license): update copyright year(s) (#4432)

Co-authored-by: Daniel Gibbs <me@danielgibbs.co.uk>
Co-authored-by: github-actions <github-actions@github.com>
---
 LICENSE.md | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/LICENSE.md b/LICENSE.md
index 12352eafa..344a8fb48 100644
--- a/LICENSE.md
+++ b/LICENSE.md
@@ -1,6 +1,6 @@
 # The MIT License (MIT)
 
-Copyright (c) 2012-2023 Daniel Gibbs
+Copyright (c) 2012-2024 Daniel Gibbs
 
 Permission is hereby granted, free of charge, to any person obtaining a copy
 of this software and associated documentation files (the "Software"), to deal

From ae3deee7a8a31e9c56936c688ba736f2ed664432 Mon Sep 17 00:00:00 2001
From: JuliusZet <github@julius-zitzmann.de>
Date: Fri, 19 Jan 2024 20:55:42 +0100
Subject: [PATCH 063/154] feat(rust): Add server browser tags to rustserver
 config (#4418)

---
 lgsm/config-default/config-lgsm/rustserver/_default.cfg | 3 ++-
 1 file changed, 2 insertions(+), 1 deletion(-)

diff --git a/lgsm/config-default/config-lgsm/rustserver/_default.cfg b/lgsm/config-default/config-lgsm/rustserver/_default.cfg
index 2652bc597..071d9d008 100644
--- a/lgsm/config-default/config-lgsm/rustserver/_default.cfg
+++ b/lgsm/config-default/config-lgsm/rustserver/_default.cfg
@@ -26,9 +26,10 @@ maxplayers="50"
 worldsize="3000"   # default: 3000, range: 1000-6000, map size in meters.
 saveinterval="300" # Auto-save in seconds.
 tickrate="30"      # default: 30, range: 15-100.
+tags=""            # values: monthly, biweekly, weekly, vanilla, hardcore, softcore, pve, roleplay, creative, minigame, training, battlefield, broyale, builds, NA, SA, EU, WA, EA, OC, AF ( Doc: https://wiki.facepunch.com/rust/server-browser-tags )
 
 ## Server Parameters | https://docs.linuxgsm.com/configuration/start-parameters#additional-parameters
-startparameters="-batchmode +app.listenip ${ip} +app.port ${appport} +server.ip ${ip} +server.port ${port} +server.queryport ${queryport} +server.tickrate ${tickrate} +server.hostname \"${servername}\" +server.identity \"${selfname}\" +server.gamemode ${gamemode} +server.level \"${serverlevel}\" +server.seed ${seed} +server.salt ${salt} +server.maxplayers ${maxplayers} +server.worldsize ${worldsize} +server.saveinterval ${saveinterval} +rcon.web ${rconweb} +rcon.ip ${ip} +rcon.port ${rconport} +rcon.password \"${rconpassword}\" -logfile ${gamelog}"
+startparameters="-batchmode +app.listenip ${ip} +app.port ${appport} +server.ip ${ip} +server.port ${port} +server.queryport ${queryport} +server.tickrate ${tickrate} +server.hostname \"${servername}\" +server.identity \"${selfname}\" +server.gamemode ${gamemode} +server.level \"${serverlevel}\" +server.seed ${seed} +server.salt ${salt} +server.maxplayers ${maxplayers} +server.worldsize ${worldsize} +server.saveinterval ${saveinterval} +rcon.web ${rconweb} +rcon.ip ${ip} +rcon.port ${rconport} +rcon.password \"${rconpassword}\" +server.tags ${tags} -logfile ${gamelog}"
 
 #### LinuxGSM Settings ####
 

From 9bad6cfea94b8afcd07326b898f8dc398f89339d Mon Sep 17 00:00:00 2001
From: Daniel Gibbs <me@danielgibbs.co.uk>
Date: Sun, 21 Jan 2024 20:54:19 +0000
Subject: [PATCH 064/154] feat(new server): Palworld (#4449)

* add palworld

* add palworld

* add palworld to ubuntu

* add server to serverlist

* rework _default.cfg for pwserver

* fix servercfgdir for palworld

* edit _default.cfg for pwserver

* first try info_game.sh

* debug info_game.sh

* update info_game.sh

* update info_game.sh

* update info_game.sh

* add package check for rhel, rocky, debian & ubuntu

* add details port info

* add details port change

* improve _default.cfg for pwserver

* improve _default.cfg for pwserver

* fix issues mentioned in pr

* change servername parameter for pwserver

* add: steamport var for Palworld

* fix: info_game for palworld

* change: load palworld settings from serverconfig file & change unknow port

* update ports info

* change to binary file from .sh

prevents issues with ss command

---------

Co-authored-by: Daniel Gibbs <me@danielgibbs.co.uk>
add palworld game icon

add missing pw
---
 .../config-lgsm/pwserver/_default.cfg         | 185 ++++++++++++++++++
 lgsm/data/almalinux-8.csv                     |   1 +
 lgsm/data/almalinux-9.csv                     |   1 +
 lgsm/data/centos-7.csv                        |   1 +
 lgsm/data/centos-8.csv                        |   1 +
 lgsm/data/centos-9.csv                        |   1 +
 lgsm/data/debian-10.csv                       |   5 +-
 lgsm/data/debian-11.csv                       |   1 +
 lgsm/data/debian-12.csv                       |   1 +
 lgsm/data/debian-9.csv                        |   1 +
 lgsm/data/gameicons/pw-icon.png               | Bin 0 -> 2829 bytes
 lgsm/data/rhel-7.csv                          |   1 +
 lgsm/data/rhel-8.csv                          |   1 +
 lgsm/data/rhel-9.csv                          |   1 +
 lgsm/data/rocky-8.csv                         |   1 +
 lgsm/data/rocky-9.csv                         |   1 +
 lgsm/data/serverlist.csv                      |   1 +
 lgsm/data/ubuntu-16.04.csv                    |   1 +
 lgsm/data/ubuntu-18.04.csv                    |   1 +
 lgsm/data/ubuntu-20.04.csv                    |   1 +
 lgsm/data/ubuntu-22.04.csv                    |   1 +
 lgsm/data/ubuntu-23.04.csv                    |   1 +
 lgsm/data/ubuntu-23.10.csv                    |   1 +
 lgsm/modules/info_game.sh                     |  14 ++
 lgsm/modules/info_messages.sh                 |  13 +-
 lgsm/modules/install_config.sh                |   6 +
 26 files changed, 240 insertions(+), 3 deletions(-)
 create mode 100644 lgsm/config-default/config-lgsm/pwserver/_default.cfg
 create mode 100644 lgsm/data/gameicons/pw-icon.png

diff --git a/lgsm/config-default/config-lgsm/pwserver/_default.cfg b/lgsm/config-default/config-lgsm/pwserver/_default.cfg
new file mode 100644
index 000000000..dffa99a0a
--- /dev/null
+++ b/lgsm/config-default/config-lgsm/pwserver/_default.cfg
@@ -0,0 +1,185 @@
+##################################
+######## Default Settings ########
+##################################
+# DO NOT EDIT, ANY CHANGES WILL BE OVERWRITTEN!
+# Copy settings from here and use them in either:
+# common.cfg - applies settings to every instance.
+# [instance].cfg - applies settings to a specific instance.
+
+#### Game Server Settings ####
+
+## Predefined Parameters | https://docs.linuxgsm.com/configuration/start-parameters
+servername="LinuxGSM"
+
+# Use game server config file to edit, used for port check script (workaround)
+port="8211"
+
+## Server Parameters | https://docs.linuxgsm.com/configuration/start-parameters#additional-parameters
+## Game Server Docs | https://tech.palworldgame.com/dedicated-server-guide#linux
+startparameters="EpicApp=PalServer -useperfthreads -NoAsyncLoadingThread -UseMultithreadForDS -servername='${servername}'"
+
+#### LinuxGSM Settings ####
+
+## LinuxGSM Stats
+# Send useful stats to LinuxGSM developers.
+# https://docs.linuxgsm.com/configuration/linuxgsm-stats
+# (on|off)
+stats="off"
+
+## Notification Alerts
+# (on|off)
+
+# Display IP | https://docs.linuxgsm.com/alerts#display-ip
+displayip=""
+
+# More info | https://docs.linuxgsm.com/alerts#more-info
+postalert="off"
+
+# Alert on Start/Stop/Restart
+statusalert="off"
+
+# Discord Alerts | https://docs.linuxgsm.com/alerts/discord
+discordalert="off"
+discordwebhook="webhook"
+
+# Email Alerts | https://docs.linuxgsm.com/alerts/email
+emailalert="off"
+email="email@example.com"
+emailfrom=""
+
+# Gotify Alerts | https://docs.linuxgsm.com/alerts/gotify
+gotifyalert="off"
+gotifytoken="token"
+gotifywebhook="webhook"
+
+# IFTTT Alerts | https://docs.linuxgsm.com/alerts/ifttt
+iftttalert="off"
+ifttttoken="accesstoken"
+iftttevent="linuxgsm_alert"
+
+# Pushbullet Alerts | https://docs.linuxgsm.com/alerts/pushbullet
+pushbulletalert="off"
+pushbullettoken="accesstoken"
+channeltag=""
+
+# Pushover Alerts | https://docs.linuxgsm.com/alerts/pushover
+pushoveralert="off"
+pushovertoken="accesstoken"
+pushoveruserkey="userkey"
+
+# Rocket.Chat Alerts | https://docs.linuxgsm.com/alerts/rocket.chat
+rocketchatalert="off"
+rocketchatwebhook="webhook"
+
+# Slack Alerts | https://docs.linuxgsm.com/alerts/slack
+slackalert="off"
+slackwebhook="webhook"
+
+# Telegram Alerts | https://docs.linuxgsm.com/alerts/telegram
+# You can add a custom cURL string eg proxy (useful in Russia) in "curlcustomstring".
+# For example "--socks5 ipaddr:port" for socks5 proxy see more in "curl --help".
+telegramapi="api.telegram.org"
+telegramalert="off"
+telegramtoken="accesstoken"
+telegramchatid=""
+curlcustomstring=""
+
+## Updating | https://docs.linuxgsm.com/commands/update
+updateonstart="off"
+
+## Backup | https://docs.linuxgsm.com/commands/backup
+maxbackups="4"
+maxbackupdays="30"
+stoponbackup="on"
+
+## Logging | https://docs.linuxgsm.com/features/logging
+consolelogging="on"
+logdays="7"
+
+## Monitor | https://docs.linuxgsm.com/commands/monitor
+# Query delay time
+querydelay="1"
+
+## ANSI Colors | https://docs.linuxgsm.com/features/ansi-colors
+ansi="on"
+
+#### Advanced Settings ####
+
+## Message Display Time | https://docs.linuxgsm.com/features/message-display-time
+sleeptime="0.5"
+
+## SteamCMD Settings | https://docs.linuxgsm.com/steamcmd
+# Server appid
+appid="2394010"
+steamcmdforcewindows="no"
+# SteamCMD Branch | https://docs.linuxgsm.com/steamcmd/branch
+branch=""
+betapassword=""
+# Master Server | https://docs.linuxgsm.com/steamcmd/steam-master-server
+steammaster="false"
+
+## Stop Mode | https://docs.linuxgsm.com/features/stop-mode
+# 1: tmux kill
+# 2: CTRL+c
+# 3: quit
+# 4: quit 120s
+# 5: stop
+# 6: q
+# 7: exit
+# 8: 7 Days to Die
+# 9: GoldSrc
+# 10: Avorion
+# 11: end
+stopmode="2"
+
+## Query mode
+# 1: session only
+# 2: gamedig (gsquery fallback)
+# 3: gamedig
+# 4: gsquery
+# 5: tcp
+querymode="1"
+querytype="1"
+
+## Console type
+consoleverbose="yes"
+consoleinteract="no"
+
+## Game Server Details
+# Do not edit
+gamename="Palworld"
+engine="unreal5"
+glibc="2.17"
+
+#### Directories ####
+# Edit with care
+
+## Game Server Directories
+systemdir="${serverfiles}/Pal"
+executabledir="${systemdir}/Engine/Binaries/Linux"
+executable="./PalServer-Linux"
+servercfgdir="${serverfiles}/Pal/Saved/Config/LinuxServer"
+servercfg="PalWorldSettings.ini"
+servercfgdefault="PalWorldSettings.ini"
+servercfgfullpath="${servercfgdir}/${servercfg}"
+
+## Backup Directory
+backupdir="${lgsmdir}/backup"
+
+## Logging Directories
+[ -n "${LGSM_LOGDIR}" ] && logdir="${LGSM_LOGDIR}" || logdir="${rootdir}/log"
+gamelogdir="${systemdir}/Saved/Logs"
+lgsmlogdir="${logdir}/script"
+consolelogdir="${logdir}/console"
+lgsmlog="${lgsmlogdir}/${selfname}-script.log"
+consolelog="${consolelogdir}/${selfname}-console.log"
+alertlog="${lgsmlogdir}/${selfname}-alert.log"
+postdetailslog="${lgsmlogdir}/${selfname}-postdetails.log"
+
+## Logs Naming
+lgsmlogdate="${lgsmlogdir}/${selfname}-script-$(date '+%Y-%m-%d-%H:%M:%S').log"
+consolelogdate="${consolelogdir}/${selfname}-console-$(date '+%Y-%m-%d-%H:%M:%S').log"
+
+## Log Parameters
+logtimestamp="off"
+logtimestampformat="%Y-%m-%d %H:%M:%S"
diff --git a/lgsm/data/almalinux-8.csv b/lgsm/data/almalinux-8.csv
index dcfb14528..53021ec30 100644
--- a/lgsm/data/almalinux-8.csv
+++ b/lgsm/data/almalinux-8.csv
@@ -85,6 +85,7 @@ pmc,java-17-openjdk
 ps,GConf2
 pvkii
 pvr,libcxx
+pw
 pz,java-11-openjdk rng-tools
 q2
 q3
diff --git a/lgsm/data/almalinux-9.csv b/lgsm/data/almalinux-9.csv
index bcd93857b..8f643487c 100644
--- a/lgsm/data/almalinux-9.csv
+++ b/lgsm/data/almalinux-9.csv
@@ -85,6 +85,7 @@ pmc,java-17-openjdk
 ps,GConf2
 pvkii
 pvr,libcxx
+pw
 pz,java-11-openjdk rng-tools
 q2
 q3
diff --git a/lgsm/data/centos-7.csv b/lgsm/data/centos-7.csv
index 10500627e..5315d8de0 100644
--- a/lgsm/data/centos-7.csv
+++ b/lgsm/data/centos-7.csv
@@ -85,6 +85,7 @@ pmc,java-11-openjdk
 ps,GConf2
 pvkii
 pvr,libcxx
+pw
 pz,java-11-openjdk rng-tools
 q2
 q3
diff --git a/lgsm/data/centos-8.csv b/lgsm/data/centos-8.csv
index dcfb14528..53021ec30 100644
--- a/lgsm/data/centos-8.csv
+++ b/lgsm/data/centos-8.csv
@@ -85,6 +85,7 @@ pmc,java-17-openjdk
 ps,GConf2
 pvkii
 pvr,libcxx
+pw
 pz,java-11-openjdk rng-tools
 q2
 q3
diff --git a/lgsm/data/centos-9.csv b/lgsm/data/centos-9.csv
index bcd93857b..8f643487c 100644
--- a/lgsm/data/centos-9.csv
+++ b/lgsm/data/centos-9.csv
@@ -85,6 +85,7 @@ pmc,java-17-openjdk
 ps,GConf2
 pvkii
 pvr,libcxx
+pw
 pz,java-11-openjdk rng-tools
 q2
 q3
diff --git a/lgsm/data/debian-10.csv b/lgsm/data/debian-10.csv
index b2c646f9f..a2d1ee665 100644
--- a/lgsm/data/debian-10.csv
+++ b/lgsm/data/debian-10.csv
@@ -1,8 +1,7 @@
-all,bc,binutils,bsdmainutils,bzip2,ca-certificates,cpio,curl,distro-info,file,gzip,hostname,jq,lib32gcc1,lib32stdc++6,netcat,python3,tar,tmux,unzip,util-linux,uuid-runtime,wget,xz-utils
-steamcmd,lib32gcc1,lib32stdc++6,libsdl2-2.0-0:i386,steamcmd
 ac
 ahl
 ahl2
+all,bc,binutils,bsdmainutils,bzip2,ca-certificates,cpio,curl,distro-info,file,gzip,hostname,jq,lib32gcc1,lib32stdc++6,netcat,python3,tar,tmux,unzip,util-linux,uuid-runtime,wget,xz-utils
 ark
 arma3
 armar,libcurl4
@@ -85,6 +84,7 @@ pmc,openjdk-11-jre
 ps,libgconf-2-4
 pvkii
 pvr,libc++1
+pw
 pz,openjdk-11-jre,rng-tools
 q2
 q3
@@ -108,6 +108,7 @@ sof2
 sol
 squad
 st,libxml2-utils
+steamcmd,lib32gcc1,lib32stdc++6,libsdl2-2.0-0:i386,steamcmd
 stn
 sven,libssl1.1:i386,zlib1g:i386
 terraria
diff --git a/lgsm/data/debian-11.csv b/lgsm/data/debian-11.csv
index 70f0a3fbe..bdf03879e 100644
--- a/lgsm/data/debian-11.csv
+++ b/lgsm/data/debian-11.csv
@@ -85,6 +85,7 @@ pmc,openjdk-17-jre
 ps,libgconf-2-4
 pvkii
 pvr,libc++1
+pw
 pz,openjdk-17-jre,rng-tools
 q2
 q3
diff --git a/lgsm/data/debian-12.csv b/lgsm/data/debian-12.csv
index e3466158d..cc884a6f8 100644
--- a/lgsm/data/debian-12.csv
+++ b/lgsm/data/debian-12.csv
@@ -85,6 +85,7 @@ pmc,openjdk-17-jre
 ps,libgconf-2-4
 pvkii
 pvr,libc++1
+pw
 pz,openjdk-17-jre,rng-tools5
 q2
 q3
diff --git a/lgsm/data/debian-9.csv b/lgsm/data/debian-9.csv
index 303bd51dc..ccefafcc2 100644
--- a/lgsm/data/debian-9.csv
+++ b/lgsm/data/debian-9.csv
@@ -85,6 +85,7 @@ pmc,openjdk-8-jre
 ps,libgconf-2-4
 pvkii
 pvr,libc++1
+pw
 pz,openjdk-8-jre,rng-tools
 q2
 q3
diff --git a/lgsm/data/gameicons/pw-icon.png b/lgsm/data/gameicons/pw-icon.png
new file mode 100644
index 0000000000000000000000000000000000000000..1772c3bd92758c6fd1e43f3eb55b168bbd571772
GIT binary patch
literal 2829
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
M9TV+JO}Dsz0Rk39s{jB1

literal 0
HcmV?d00001

diff --git a/lgsm/data/rhel-7.csv b/lgsm/data/rhel-7.csv
index f0a068399..14cc292ac 100644
--- a/lgsm/data/rhel-7.csv
+++ b/lgsm/data/rhel-7.csv
@@ -9,6 +9,7 @@ armar,libcurl,openssl11-libs
 ats
 av
 bb
+pw
 bb2,libcurl.i686
 bd
 bf1942,ncurses-libs.i686
diff --git a/lgsm/data/rhel-8.csv b/lgsm/data/rhel-8.csv
index dcfb14528..53021ec30 100644
--- a/lgsm/data/rhel-8.csv
+++ b/lgsm/data/rhel-8.csv
@@ -85,6 +85,7 @@ pmc,java-17-openjdk
 ps,GConf2
 pvkii
 pvr,libcxx
+pw
 pz,java-11-openjdk rng-tools
 q2
 q3
diff --git a/lgsm/data/rhel-9.csv b/lgsm/data/rhel-9.csv
index bcd93857b..8f643487c 100644
--- a/lgsm/data/rhel-9.csv
+++ b/lgsm/data/rhel-9.csv
@@ -85,6 +85,7 @@ pmc,java-17-openjdk
 ps,GConf2
 pvkii
 pvr,libcxx
+pw
 pz,java-11-openjdk rng-tools
 q2
 q3
diff --git a/lgsm/data/rocky-8.csv b/lgsm/data/rocky-8.csv
index dcfb14528..53021ec30 100644
--- a/lgsm/data/rocky-8.csv
+++ b/lgsm/data/rocky-8.csv
@@ -85,6 +85,7 @@ pmc,java-17-openjdk
 ps,GConf2
 pvkii
 pvr,libcxx
+pw
 pz,java-11-openjdk rng-tools
 q2
 q3
diff --git a/lgsm/data/rocky-9.csv b/lgsm/data/rocky-9.csv
index bcd93857b..8f643487c 100644
--- a/lgsm/data/rocky-9.csv
+++ b/lgsm/data/rocky-9.csv
@@ -85,6 +85,7 @@ pmc,java-17-openjdk
 ps,GConf2
 pvkii
 pvr,libcxx
+pw
 pz,java-11-openjdk rng-tools
 q2
 q3
diff --git a/lgsm/data/serverlist.csv b/lgsm/data/serverlist.csv
index 16c1e812f..841dcbf42 100644
--- a/lgsm/data/serverlist.csv
+++ b/lgsm/data/serverlist.csv
@@ -84,6 +84,7 @@ pmc,pmcserver,PaperMC,ubuntu-22.04
 ps,psserver,Post Scriptum,ubuntu-22.04
 pvkii,pvkiiserver,Pirates Vikings & Knights II,ubuntu-22.04
 pvr,pvrserver,Pavlov VR,ubuntu-22.04
+pw,pwserver,Palworld,ubuntu-22.04
 pz,pzserver,Project Zomboid,ubuntu-22.04
 q2,q2server,Quake 2,ubuntu-22.04
 q3,q3server,Quake 3: Arena,ubuntu-22.04
diff --git a/lgsm/data/ubuntu-16.04.csv b/lgsm/data/ubuntu-16.04.csv
index c8e10e48e..e50ea48c0 100644
--- a/lgsm/data/ubuntu-16.04.csv
+++ b/lgsm/data/ubuntu-16.04.csv
@@ -9,6 +9,7 @@ armar,libcurl4
 ats
 av
 bb
+pw
 bb2,libcurl4-gnutls-dev:i386
 bd
 bf1942,libncurses5:i386,libtinfo5:i386
diff --git a/lgsm/data/ubuntu-18.04.csv b/lgsm/data/ubuntu-18.04.csv
index b2c646f9f..5294e6757 100644
--- a/lgsm/data/ubuntu-18.04.csv
+++ b/lgsm/data/ubuntu-18.04.csv
@@ -8,6 +8,7 @@ arma3
 armar,libcurl4
 ats
 av
+pw
 bb
 bb2,libcurl4-gnutls-dev:i386
 bd
diff --git a/lgsm/data/ubuntu-20.04.csv b/lgsm/data/ubuntu-20.04.csv
index 853b98f33..f864b0d0a 100644
--- a/lgsm/data/ubuntu-20.04.csv
+++ b/lgsm/data/ubuntu-20.04.csv
@@ -85,6 +85,7 @@ pmc,openjdk-17-jre
 ps,libgconf-2-4
 pvkii
 pvr,libc++1
+pw
 pz,openjdk-17-jre,rng-tools
 q2
 q3
diff --git a/lgsm/data/ubuntu-22.04.csv b/lgsm/data/ubuntu-22.04.csv
index d42afde49..c010ac60a 100644
--- a/lgsm/data/ubuntu-22.04.csv
+++ b/lgsm/data/ubuntu-22.04.csv
@@ -85,6 +85,7 @@ pmc,openjdk-17-jre
 ps,libgconf-2-4
 pvkii
 pvr,libc++1
+pw
 pz,openjdk-17-jre,rng-tools5
 q2
 q3
diff --git a/lgsm/data/ubuntu-23.04.csv b/lgsm/data/ubuntu-23.04.csv
index ac4f05945..1a52e301e 100644
--- a/lgsm/data/ubuntu-23.04.csv
+++ b/lgsm/data/ubuntu-23.04.csv
@@ -85,6 +85,7 @@ pmc,openjdk-17-jre
 ps,libgconf-2-4
 pvkii
 pvr,libc++1
+pw
 pz,openjdk-17-jre,rng-tools5
 q2
 q3
diff --git a/lgsm/data/ubuntu-23.10.csv b/lgsm/data/ubuntu-23.10.csv
index ac4f05945..1a52e301e 100644
--- a/lgsm/data/ubuntu-23.10.csv
+++ b/lgsm/data/ubuntu-23.10.csv
@@ -85,6 +85,7 @@ pmc,openjdk-17-jre
 ps,libgconf-2-4
 pvkii
 pvr,libc++1
+pw
 pz,openjdk-17-jre,rng-tools5
 q2
 q3
diff --git a/lgsm/modules/info_game.sh b/lgsm/modules/info_game.sh
index 200e5fdad..f456fb0bf 100644
--- a/lgsm/modules/info_game.sh
+++ b/lgsm/modules/info_game.sh
@@ -613,6 +613,18 @@ fn_info_game_pvr() {
 	servername="${servername:-"NOT SET"}"
 }
 
+# Config Type: ini
+# Parameters: false
+# Comment: ; or #
+# Example: ServerName=SERVERNAME
+# Filetype: cfg
+fn_info_game_pw() {
+	servername="${servername:-"NOT SET"}"
+	port="${port:-"0"}"
+	steamport="27015"
+	unknownport="1985"
+}
+
 # Config Type: ini
 # Parameters: true
 # Comment: ; or #
@@ -2357,6 +2369,8 @@ elif [ "${shortname}" == "ps" ]; then
 	fn_info_game_ps
 elif [ "${shortname}" == "pvr" ]; then
 	fn_info_game_pvr
+elif [ "${shortname}" == "pw" ]; then
+	fn_info_game_pw
 elif [ "${shortname}" == "pz" ]; then
 	fn_info_game_pz
 elif [ "${shortname}" == "q2" ]; then
diff --git a/lgsm/modules/info_messages.sh b/lgsm/modules/info_messages.sh
index 1e3bfad4b..f619c964e 100644
--- a/lgsm/modules/info_messages.sh
+++ b/lgsm/modules/info_messages.sh
@@ -674,7 +674,7 @@ fn_info_messages_ports_edit() {
 		fi
 	done
 	# engines/games that require editing the start parameters.
-	local ports_edit_array=("av" "ck" "col" "cs2" "fctr" "goldsrc" "hcu" "hw" "iw3.0" "ioquake3" "qfusion" "rust" "scpsl" "scpslsm" "sf" "sol" "spark" "source" "unreal4" "arma3" "dayz" "unt" "vh")
+	local ports_edit_array=("av" "ck" "col" "cs2" "fctr" "goldsrc" "hcu" "hw" "iw3.0" "ioquake3" "pw" "qfusion" "rust" "scpsl" "scpslsm" "sf" "sol" "spark" "source" "unreal4" "arma3" "dayz" "unt" "vh")
 	for port_edit in "${ports_edit_array[@]}"; do
 		if [ "${engine}" == "${port_edit}" ] || [ "${gamename}" == "${port_edit}" ] || [ "${shortname}" == "${port_edit}" ]; then
 			startparameterslocation="${configdirserver}"
@@ -1269,6 +1269,15 @@ fn_info_messages_pvr() {
 	} | column -s $'\t' -t
 }
 
+fn_info_messages_pw() {
+	{
+		fn_port "header"
+		fn_port "Game" port udp
+		fn_port "Steam" steamport udp
+		fn_port "Unknown" unknownport tcp
+	} | column -s $'\t' -t
+}
+
 fn_info_messages_pz() {
 	{
 		fn_port "header"
@@ -1798,6 +1807,8 @@ fn_info_messages_select_engine() {
 		fn_info_messages_ps
 	elif [ "${shortname}" == "pvr" ]; then
 		fn_info_messages_pvr
+	elif [ "${shortname}" == "pw" ]; then
+		fn_info_messages_pw
 	elif [ "${shortname}" == "pz" ]; then
 		fn_info_messages_pz
 	elif [ "${shortname}" == "q2" ]; then
diff --git a/lgsm/modules/install_config.sh b/lgsm/modules/install_config.sh
index a163243dc..a5a049913 100644
--- a/lgsm/modules/install_config.sh
+++ b/lgsm/modules/install_config.sh
@@ -604,6 +604,12 @@ elif [ "${shortname}" == "pvkii" ]; then
 	fn_default_config_remote
 	fn_set_config_vars
 	fn_list_config_locations
+elif [ "${shortname}" == "pw" ]; then
+	array_configs+=(PalWorldSettings.ini)
+	fn_fetch_default_config
+	fn_default_config_remote
+	fn_set_config_vars
+	fn_list_config_locations
 elif [ "${shortname}" == "pz" ]; then
 	fn_check_cfgdir
 	array_configs+=(server.ini)

From 12b60d40e4b807adb16c440eb076d8267f14467d Mon Sep 17 00:00:00 2001
From: Daniel Gibbs <me@danielgibbs.co.uk>
Date: Sun, 21 Jan 2024 20:59:24 +0000
Subject: [PATCH 065/154] Release v24.1.0

---
 lgsm/modules/core_modules.sh | 2 +-
 linuxgsm.sh                  | 2 +-
 2 files changed, 2 insertions(+), 2 deletions(-)

diff --git a/lgsm/modules/core_modules.sh b/lgsm/modules/core_modules.sh
index 5a0543b9c..b557986f9 100644
--- a/lgsm/modules/core_modules.sh
+++ b/lgsm/modules/core_modules.sh
@@ -8,7 +8,7 @@
 
 moduleselfname="$(basename "$(readlink -f "${BASH_SOURCE[0]}")")"
 
-modulesversion="v23.7.1"
+modulesversion="v24.1.0"
 
 # Core
 
diff --git a/linuxgsm.sh b/linuxgsm.sh
index e3286d4f2..5cffc1fcb 100755
--- a/linuxgsm.sh
+++ b/linuxgsm.sh
@@ -24,7 +24,7 @@ if [ -f ".dev-debug" ]; then
 	set -x
 fi
 
-version="v23.7.1"
+version="v24.1.0"
 shortname="core"
 gameservername="core"
 commandname="CORE"

From cb2ced76d3b4d2c0ad51a8270f2360a03eebf80e Mon Sep 17 00:00:00 2001
From: Daniel Gibbs <me@danielgibbs.co.uk>
Date: Sun, 21 Jan 2024 21:29:29 +0000
Subject: [PATCH 066/154] fix(pw): correct executable location

---
 lgsm/config-default/config-lgsm/pwserver/_default.cfg | 4 ++--
 1 file changed, 2 insertions(+), 2 deletions(-)

diff --git a/lgsm/config-default/config-lgsm/pwserver/_default.cfg b/lgsm/config-default/config-lgsm/pwserver/_default.cfg
index dffa99a0a..b3990ca7a 100644
--- a/lgsm/config-default/config-lgsm/pwserver/_default.cfg
+++ b/lgsm/config-default/config-lgsm/pwserver/_default.cfg
@@ -156,8 +156,8 @@ glibc="2.17"
 
 ## Game Server Directories
 systemdir="${serverfiles}/Pal"
-executabledir="${systemdir}/Engine/Binaries/Linux"
-executable="./PalServer-Linux"
+executabledir="${systemdir}/Binaries/Linux/"
+executable="./PalServer-Linux-Test"
 servercfgdir="${serverfiles}/Pal/Saved/Config/LinuxServer"
 servercfg="PalWorldSettings.ini"
 servercfgdefault="PalWorldSettings.ini"

From 12e7a5589e847a21b5d14f215087f8d381d5af7a Mon Sep 17 00:00:00 2001
From: Daniel Gibbs <me@danielgibbs.co.uk>
Date: Sun, 21 Jan 2024 22:11:49 +0000
Subject: [PATCH 067/154] Release v21.4.1

---
 lgsm/modules/core_modules.sh | 2 +-
 linuxgsm.sh                  | 2 +-
 2 files changed, 2 insertions(+), 2 deletions(-)

diff --git a/lgsm/modules/core_modules.sh b/lgsm/modules/core_modules.sh
index b557986f9..7293d3720 100644
--- a/lgsm/modules/core_modules.sh
+++ b/lgsm/modules/core_modules.sh
@@ -8,7 +8,7 @@
 
 moduleselfname="$(basename "$(readlink -f "${BASH_SOURCE[0]}")")"
 
-modulesversion="v24.1.0"
+modulesversion="v24.1.1"
 
 # Core
 
diff --git a/linuxgsm.sh b/linuxgsm.sh
index 5cffc1fcb..d9ca99ada 100755
--- a/linuxgsm.sh
+++ b/linuxgsm.sh
@@ -24,7 +24,7 @@ if [ -f ".dev-debug" ]; then
 	set -x
 fi
 
-version="v24.1.0"
+version="v24.1.1"
 shortname="core"
 gameservername="core"
 commandname="CORE"

From 3464d334b403b387fd0aa0939bdea5babf438c08 Mon Sep 17 00:00:00 2001
From: Daniel Gibbs <me@danielgibbs.co.uk>
Date: Wed, 24 Jan 2024 16:57:42 +0000
Subject: [PATCH 068/154] fix: servername variable assignment for sf and unt

The servername variable was incorrectly assigned using the selfname variable instead of the correct servername variable. This has been fixed to ensure accurate information is displayed for each game type.
---
 lgsm/modules/info_game.sh | 4 ++--
 1 file changed, 2 insertions(+), 2 deletions(-)

diff --git a/lgsm/modules/info_game.sh b/lgsm/modules/info_game.sh
index f456fb0bf..da7c62991 100644
--- a/lgsm/modules/info_game.sh
+++ b/lgsm/modules/info_game.sh
@@ -1978,7 +1978,7 @@ fn_info_game_sdtd() {
 # Config Type: Parameters (with an ini)
 fn_info_game_sf() {
 	# Parameters
-	servername="${selfname:-"NOT SET"}"
+	servername="${servername:-"NOT SET"}"
 	port="${port:-"0"}"
 	queryport="${queryport:-"0"}"
 	beaconport="${beaconport:-"0"}"
@@ -2131,7 +2131,7 @@ fn_info_game_tw() {
 
 # Config Type: Parameters
 fn_info_game_unt() {
-	servername="${selfname:-"NOT SET"}"
+	servername="${servername:-"NOT SET"}"
 	port="${port:-"0"}"
 	queryport="${port}"
 	steamport="$((port + 1))"

From 78f4735a2ba203633ec36784e6470e0866c1cb53 Mon Sep 17 00:00:00 2001
From: Daniel Gibbs <me@danielgibbs.co.uk>
Date: Wed, 24 Jan 2024 20:18:46 +0000
Subject: [PATCH 069/154] fix(stats): servers with sessin only checking will
 now show in stats

game servers with session only checks were not showing up in stats. This includes the new Palworld server
---
 lgsm/modules/command_monitor.sh | 4 ++++
 1 file changed, 4 insertions(+)

diff --git a/lgsm/modules/command_monitor.sh b/lgsm/modules/command_monitor.sh
index 5f1ff77f6..a18154948 100644
--- a/lgsm/modules/command_monitor.sh
+++ b/lgsm/modules/command_monitor.sh
@@ -214,6 +214,10 @@ fn_monitor_check_session() {
 		fn_print_ok "Checking session: "
 		fn_print_ok_eol_nl
 		fn_script_log_pass "Checking session: OK"
+		# send LinuxGSM stats if monitor is OK.
+		if [ "${stats}" == "on" ] || [ "${stats}" == "y" ] && [ "${querymode}" == "1" ]; then
+			info_stats.sh
+		fi
 	else
 		fn_print_error "Checking session: "
 		fn_print_fail_eol_nl

From 08d7a8c87d895555200834501b2651119867a072 Mon Sep 17 00:00:00 2001
From: Daniel Gibbs <me@danielgibbs.co.uk>
Date: Wed, 24 Jan 2024 20:19:13 +0000
Subject: [PATCH 070/154] Release v24.1.2

---
 lgsm/modules/core_modules.sh | 2 +-
 linuxgsm.sh                  | 2 +-
 2 files changed, 2 insertions(+), 2 deletions(-)

diff --git a/lgsm/modules/core_modules.sh b/lgsm/modules/core_modules.sh
index 7293d3720..62f3d8f4e 100644
--- a/lgsm/modules/core_modules.sh
+++ b/lgsm/modules/core_modules.sh
@@ -8,7 +8,7 @@
 
 moduleselfname="$(basename "$(readlink -f "${BASH_SOURCE[0]}")")"
 
-modulesversion="v24.1.1"
+modulesversion="v24.1.2"
 
 # Core
 
diff --git a/linuxgsm.sh b/linuxgsm.sh
index d9ca99ada..844aca991 100755
--- a/linuxgsm.sh
+++ b/linuxgsm.sh
@@ -24,7 +24,7 @@ if [ -f ".dev-debug" ]; then
 	set -x
 fi
 
-version="v24.1.1"
+version="v24.1.2"
 shortname="core"
 gameservername="core"
 commandname="CORE"

From 64e9e8246214d50ef187f89750d4cb6d8572d9ad Mon Sep 17 00:00:00 2001
From: Armin <50357737+PlayMTL@users.noreply.github.com>
Date: Sun, 4 Feb 2024 21:07:49 +0100
Subject: [PATCH 071/154] feat(pw): port & steamport setting for palworld
 (#4479)

* fix: servername variable assignment for sf and unt

The servername variable was incorrectly assigned using the selfname variable instead of the correct servername variable. This has been fixed to ensure accurate information is displayed for each game type.

* add: port & steamport setting for palworld

---------

Co-authored-by: Daniel Gibbs <me@danielgibbs.co.uk>
---
 lgsm/config-default/config-lgsm/pwserver/_default.cfg | 5 +++--
 lgsm/modules/info_game.sh                             | 6 +++---
 2 files changed, 6 insertions(+), 5 deletions(-)

diff --git a/lgsm/config-default/config-lgsm/pwserver/_default.cfg b/lgsm/config-default/config-lgsm/pwserver/_default.cfg
index b3990ca7a..cd318aacc 100644
--- a/lgsm/config-default/config-lgsm/pwserver/_default.cfg
+++ b/lgsm/config-default/config-lgsm/pwserver/_default.cfg
@@ -11,12 +11,13 @@
 ## Predefined Parameters | https://docs.linuxgsm.com/configuration/start-parameters
 servername="LinuxGSM"
 
-# Use game server config file to edit, used for port check script (workaround)
+# For community servers (serverlist) you need to change these settings (publicip & publicport) in the gameserver config file aswell
 port="8211"
+steamport="27015"
 
 ## Server Parameters | https://docs.linuxgsm.com/configuration/start-parameters#additional-parameters
 ## Game Server Docs | https://tech.palworldgame.com/dedicated-server-guide#linux
-startparameters="EpicApp=PalServer -useperfthreads -NoAsyncLoadingThread -UseMultithreadForDS -servername='${servername}'"
+startparameters="EpicApp=PalServer -useperfthreads -NoAsyncLoadingThread -UseMultithreadForDS -servername='${servername}' -port='${port}' -queryport='${steamport}'"
 
 #### LinuxGSM Settings ####
 
diff --git a/lgsm/modules/info_game.sh b/lgsm/modules/info_game.sh
index f456fb0bf..c5c5e5d7a 100644
--- a/lgsm/modules/info_game.sh
+++ b/lgsm/modules/info_game.sh
@@ -621,7 +621,7 @@ fn_info_game_pvr() {
 fn_info_game_pw() {
 	servername="${servername:-"NOT SET"}"
 	port="${port:-"0"}"
-	steamport="27015"
+	steamport="${steamport:-"0"}"
 	unknownport="1985"
 }
 
@@ -1978,7 +1978,7 @@ fn_info_game_sdtd() {
 # Config Type: Parameters (with an ini)
 fn_info_game_sf() {
 	# Parameters
-	servername="${selfname:-"NOT SET"}"
+	servername="${servername:-"NOT SET"}"
 	port="${port:-"0"}"
 	queryport="${queryport:-"0"}"
 	beaconport="${beaconport:-"0"}"
@@ -2131,7 +2131,7 @@ fn_info_game_tw() {
 
 # Config Type: Parameters
 fn_info_game_unt() {
-	servername="${selfname:-"NOT SET"}"
+	servername="${servername:-"NOT SET"}"
 	port="${port:-"0"}"
 	queryport="${port}"
 	steamport="$((port + 1))"

From 8e9493b83c2e538c58ac71ff70ed6530aeed03f6 Mon Sep 17 00:00:00 2001
From: Awesomerly <Awesomerly@users.noreply.github.com>
Date: Sun, 4 Feb 2024 15:08:34 -0500
Subject: [PATCH 072/154] chore: update Stripper:Source to latest version
 (#4474)

* fix: servername variable assignment for sf and unt

The servername variable was incorrectly assigned using the selfname variable instead of the correct servername variable. This has been fixed to ensure accurate information is displayed for each game type.

* chore: update Stripper:Source to latest version

---------

Co-authored-by: Daniel Gibbs <me@danielgibbs.co.uk>
---
 lgsm/modules/mods_list.sh | 8 +++++++-
 1 file changed, 7 insertions(+), 1 deletion(-)

diff --git a/lgsm/modules/mods_list.sh b/lgsm/modules/mods_list.sh
index bd6eaff24..c9a316055 100644
--- a/lgsm/modules/mods_list.sh
+++ b/lgsm/modules/mods_list.sh
@@ -71,6 +71,12 @@ steamworksscrapeurl="https://users.alliedmods.net/~kyles/builds/SteamWorks"
 steamworkslatestfile=$(curl --connect-timeout 10 -sL ${steamworksscrapeurl} | grep -m 1 linux | cut -d '"' -f 4)
 steamworksdownloadurl="${steamworksscrapeurl}/${steamworkslatestfile}"
 steamworksurl="${steamworksdownloadurl}"
+# Stripper:Source
+stripperversion="1.2.2-git141"
+stripperlatestfile="stripper-${stripperversion}-linux.tar.gz"
+stripperdownloadurl="http://www.bailopan.net/stripper/snapshots/1.2/${stripperlatestfile}"
+stripperurl="${stripperdownloadurl}"
+
 # CS:GO Mods
 get5lastbuild=$(curl --connect-timeout 10 -sL https://api.github.com/repos/splewis/get5/releases/latest | jq '.assets[] |select(.browser_download_url | endswith(".tar.gz"))')
 get5latestfile=$(echo -e "${get5lastbuild}" | jq -r '.name')
@@ -149,7 +155,7 @@ mod_info_ts_amxx=(MOD "amxmodxts" "AMX Mod X: The Specialists" "${amxxtsurl}" "$
 mod_info_metamodsource=(MOD "metamodsource" "Metamod: Source" "${metamodsourceurl}" "${metamodsourcelatestfile}" "0" "LowercaseOff" "${systemdir}" "addons/metamod/metaplugins.ini;" "source;" "GAMES" "NOTGAMES" "https://www.sourcemm.net" "Plugins Framework")
 mod_info_sourcemod=(MOD "sourcemod" "SourceMod" "${sourcemodurl}" "${sourcemodlatestfile}" "0" "LowercaseOff" "${systemdir}" "cfg;addons/sourcemod/configs;" "source;" "GAMES" "NOTGAMES" "http://www.sourcemod.net" "Admin Features (requires Metamod: Source)")
 mod_info_steamworks=(MOD "steamworks" "SteamWorks" "${steamworksurl}" "${steamworkslatestfile}" "0" "LowercaseOff" "${systemdir}" "OVERWRITE" "ENGINES" "Counter-Strike: Global Offensive;" "NOTGAMES" "https://github.com/KyleSanderson/SteamWorks" "Exposing SteamWorks functions to SourcePawn")
-mod_info_stripper=(MOD "stripper" "Stripper Source" "http://www.bailopan.net/stripper/snapshots/1.2/stripper-1.2.2-git129-linux.tar.gz" "stripper-1.2.2-git129-linux.tar.gz" "0" "LowercaseOff" "${systemdir}" "addons/stripper/maps;" "ENGINES" "Counter-Strike: Global Offensive;Counter-Strike: Source;Day of Defeat: Source;Half Life: Deathmatch;Half Life 2: Deathmatch;Insurgency;Left 4 Dead;Left 4 Dead 2;Nuclear Dawn;Team Fortress 2;" "NOTGAMES" "http://www.bailopan.net/stripper/" "Add or remove objects from map (requires MetaMod)")
+mod_info_stripper=(MOD "stripper" "Stripper Source" "${stripperurl}" "${stripperlatestfile}" "0" "LowercaseOff" "${systemdir}" "addons/stripper/maps;" "ENGINES" "Counter-Strike: Global Offensive;Counter-Strike: Source;Day of Defeat: Source;Half Life: Deathmatch;Half Life 2: Deathmatch;Insurgency;Left 4 Dead;Left 4 Dead 2;Nuclear Dawn;Team Fortress 2;" "NOTGAMES" "http://www.bailopan.net/stripper/" "Add or remove objects from map (requires MetaMod)")
 
 # CS:GO Mods
 mod_info_gokz=(MOD "gokz" "GOKZ" "${gokzlatestlink}" "${gokzlatestfile}" "0" "LowercaseOff" "${systemdir}" "cfg;addons/sourcemod/configs;" "ENGINES" "Counter-Strike: Global Offensive;" "NOTGAMES" "https://github.com/KZGlobalTeam/gokz" "GOKZ ${gokzlatestversion} - Implements the KZ game mode (requires SourceMod and MetaMod)")

From f60025181641aa77b47d9c697abcba4c2a402734 Mon Sep 17 00:00:00 2001
From: Daniel Gibbs <me@danielgibbs.co.uk>
Date: Sun, 4 Feb 2024 20:13:54 +0000
Subject: [PATCH 073/154] chore: add branch filtering for workflow triggers

This commit adds branch filtering to the "Details Check" and "Update Check" workflows. Now, these workflows will only be triggered on the "develop" branch. This change ensures that the workflows are executed in a controlled environment and reduces unnecessary executions on other branches.
---
 .github/workflows/details-check.yml | 2 ++
 .github/workflows/update-check.yml  | 2 ++
 2 files changed, 4 insertions(+)

diff --git a/.github/workflows/details-check.yml b/.github/workflows/details-check.yml
index d940cfbc8..5c5448885 100644
--- a/.github/workflows/details-check.yml
+++ b/.github/workflows/details-check.yml
@@ -3,6 +3,8 @@ name: Details Check
 on:
   workflow_dispatch:
   push:
+    branches:
+      - develop
 
 concurrency:
   group: details-check-${{ github.ref_name }}
diff --git a/.github/workflows/update-check.yml b/.github/workflows/update-check.yml
index b93fb2c47..932e3ea2a 100644
--- a/.github/workflows/update-check.yml
+++ b/.github/workflows/update-check.yml
@@ -3,6 +3,8 @@ name: Update Check
 on:
   workflow_dispatch:
   push:
+    branches:
+      - develop
 
 concurrency:
   group: update-check-${{ github.ref_name }}

From 94849a1479a1a2f05ff4f130b15acb49dcaeb837 Mon Sep 17 00:00:00 2001
From: Daniel Gibbs <me@danielgibbs.co.uk>
Date: Sun, 4 Feb 2024 20:17:02 +0000
Subject: [PATCH 074/154] Release v24.1.3

---
 lgsm/modules/core_modules.sh | 2 +-
 linuxgsm.sh                  | 2 +-
 2 files changed, 2 insertions(+), 2 deletions(-)

diff --git a/lgsm/modules/core_modules.sh b/lgsm/modules/core_modules.sh
index 62f3d8f4e..1afac30c7 100644
--- a/lgsm/modules/core_modules.sh
+++ b/lgsm/modules/core_modules.sh
@@ -8,7 +8,7 @@
 
 moduleselfname="$(basename "$(readlink -f "${BASH_SOURCE[0]}")")"
 
-modulesversion="v24.1.2"
+modulesversion="v24.1.3"
 
 # Core
 
diff --git a/linuxgsm.sh b/linuxgsm.sh
index 844aca991..1072101a0 100755
--- a/linuxgsm.sh
+++ b/linuxgsm.sh
@@ -24,7 +24,7 @@ if [ -f ".dev-debug" ]; then
 	set -x
 fi
 
-version="v24.1.2"
+version="v24.1.3"
 shortname="core"
 gameservername="core"
 commandname="CORE"

From e997c94f7578cf552cecb9b8bd394054bc94fefb Mon Sep 17 00:00:00 2001
From: Daniel Gibbs <me@danielgibbs.co.uk>
Date: Sat, 10 Feb 2024 22:53:58 +0000
Subject: [PATCH 075/154] refactor: rename details-check-generate-matrix.sh

The commit renames the file `detals-check-generate-matrix.sh` to `details-check-generate-matrix.sh`. This change ensures consistency and improves clarity in the codebase.
---
 ...heck-generate-matrix.sh => details-check-generate-matrix.sh} | 0
 .github/workflows/details-check.yml                             | 2 +-
 2 files changed, 1 insertion(+), 1 deletion(-)
 rename .github/workflows/{detals-check-generate-matrix.sh => details-check-generate-matrix.sh} (100%)

diff --git a/.github/workflows/detals-check-generate-matrix.sh b/.github/workflows/details-check-generate-matrix.sh
similarity index 100%
rename from .github/workflows/detals-check-generate-matrix.sh
rename to .github/workflows/details-check-generate-matrix.sh
diff --git a/.github/workflows/details-check.yml b/.github/workflows/details-check.yml
index 5c5448885..2a04dc6ac 100644
--- a/.github/workflows/details-check.yml
+++ b/.github/workflows/details-check.yml
@@ -21,7 +21,7 @@ jobs:
         uses: actions/checkout@v4
 
       - name: Generate matrix with generate-matrix.sh
-        run: chmod +x .github/workflows/detals-check-generate-matrix.sh; .github/workflows/detals-check-generate-matrix.sh
+        run: chmod +x .github/workflows/details-check-generate-matrix.sh; .github/workflows/details-check-generate-matrix.sh
 
       - name: Set Matrix
         id: set-matrix

From 40a79bd19874b12276bd2d8f36d874a5a7622d55 Mon Sep 17 00:00:00 2001
From: Daniel Gibbs <me@danielgibbs.co.uk>
Date: Sun, 11 Feb 2024 01:20:19 +0000
Subject: [PATCH 076/154] fix(ti): update default map

The default map in the tiserver configuration file has been updated from "/Game/TheIsle/Maps/Game/Isla_Spiro/Isla_Spiro" to "/Game/TheIsle/Maps/Game/Gateway/Gateway". This change ensures that the server starts with the correct default map.
---
 lgsm/config-default/config-lgsm/tiserver/_default.cfg | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/lgsm/config-default/config-lgsm/tiserver/_default.cfg b/lgsm/config-default/config-lgsm/tiserver/_default.cfg
index 3141983c9..96a3726fd 100644
--- a/lgsm/config-default/config-lgsm/tiserver/_default.cfg
+++ b/lgsm/config-default/config-lgsm/tiserver/_default.cfg
@@ -11,7 +11,7 @@
 ## Predefined Parameters | https://docs.linuxgsm.com/configuration/start-parameters
 ip="0.0.0.0"
 port="7777"
-defaultmap="/Game/TheIsle/Maps/Game/Isla_Spiro/Isla_Spiro"
+defaultmap="/Game/TheIsle/Maps/Game/Gateway/Gateway"
 
 ## Server Parameters | https://docs.linuxgsm.com/configuration/start-parameters#additional-parameters
 ## Game Server Docs | https://isle.fandom.com/wiki/The_Isle_Server_Settings_and_Configuration

From 72e330b2bad3d6b4beb764ffa90fb69a82d7bc10 Mon Sep 17 00:00:00 2001
From: MicLieg <38057464+MicLieg@users.noreply.github.com>
Date: Wed, 21 Feb 2024 22:29:45 +0100
Subject: [PATCH 077/154] fix(check_deps): clarify to run the generated command
 as root (#4490)

* fix: servername variable assignment for sf and unt

The servername variable was incorrectly assigned using the selfname variable instead of the correct servername variable. This has been fixed to ensure accurate information is displayed for each game type.

* fix(check_deps): clarify to run the generated command as root

---------

Co-authored-by: Daniel Gibbs <me@danielgibbs.co.uk>
---
 lgsm/modules/check_deps.sh | 6 +++---
 1 file changed, 3 insertions(+), 3 deletions(-)

diff --git a/lgsm/modules/check_deps.sh b/lgsm/modules/check_deps.sh
index f92a60840..df5cb9478 100644
--- a/lgsm/modules/check_deps.sh
+++ b/lgsm/modules/check_deps.sh
@@ -204,11 +204,11 @@ fn_install_missing_deps() {
 		# If automatic dependency install is unavailable.
 		if [ "${autodepinstall}" != "0" ]; then
 			if [ "$(command -v apt 2> /dev/null)" ]; then
-				echo -e "${i386installcommand}sudo apt update; sudo apt install ${array_deps_missing[*]}"
+				echo -e " Run: '${green}${i386installcommand}sudo apt update; sudo apt install ${array_deps_missing[*]}${default}' as root to install missing dependencies."
 			elif [ "$(command -v dnf 2> /dev/null)" ]; then
-				echo -e "sudo dnf install ${array_deps_missing[*]}"
+				echo -e " Run: '${green}sudo dnf install ${array_deps_missing[*]}${default}' as root to install missing dependencies."
 			elif [ "$(command -v yum 2> /dev/null)" ]; then
-				echo -e "sudo yum install ${array_deps_missing[*]}"
+				echo -e " Run: '${green}sudo yum install ${array_deps_missing[*]}${default}' as root to install missing dependencies."
 			fi
 		fi
 

From ab3404c188d1286282d085bd4b064010fd0ff201 Mon Sep 17 00:00:00 2001
From: Antonin CLAUZIER <antonin@clauzier.dev>
Date: Thu, 22 Feb 2024 01:30:15 +0400
Subject: [PATCH 078/154] feat(dayz): switch appid to stable release (#4502)

* feat(dayzserver): switch appid to stable release

* feat(dayzserver): add steam login
---
 lgsm/config-default/config-lgsm/dayzserver/_default.cfg | 6 +++++-
 1 file changed, 5 insertions(+), 1 deletion(-)

diff --git a/lgsm/config-default/config-lgsm/dayzserver/_default.cfg b/lgsm/config-default/config-lgsm/dayzserver/_default.cfg
index 0d5bf5e3e..82901c2cd 100644
--- a/lgsm/config-default/config-lgsm/dayzserver/_default.cfg
+++ b/lgsm/config-default/config-lgsm/dayzserver/_default.cfg
@@ -8,6 +8,10 @@
 
 #### Game Server Settings ####
 
+## SteamCMD Login | https://docs.linuxgsm.com/steamcmd#steamcmd-login
+steamuser="username"
+steampass='password'
+
 ## Predefined Parameters | https://docs.linuxgsm.com/configuration/start-parameters
 ip="0.0.0.0"
 port="2302"
@@ -122,7 +126,7 @@ sleeptime="0.5"
 
 ## SteamCMD Settings | https://docs.linuxgsm.com/steamcmd
 # Server appid
-appid="1042420"
+appid="223350"
 steamcmdforcewindows="no"
 # SteamCMD Branch | https://docs.linuxgsm.com/steamcmd/branch
 branch=""

From e281f5a64bc2adfec52c9a4918450ad5d2605547 Mon Sep 17 00:00:00 2001
From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com>
Date: Wed, 21 Feb 2024 21:31:15 +0000
Subject: [PATCH 079/154] build(deps): bump webfactory/ssh-agent from 0.8.0 to
 0.9.0 (#4489)

Bumps [webfactory/ssh-agent](https://github.com/webfactory/ssh-agent) from 0.8.0 to 0.9.0.
- [Release notes](https://github.com/webfactory/ssh-agent/releases)
- [Changelog](https://github.com/webfactory/ssh-agent/blob/master/CHANGELOG.md)
- [Commits](https://github.com/webfactory/ssh-agent/compare/v0.8.0...v0.9.0)

---
updated-dependencies:
- dependency-name: webfactory/ssh-agent
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
---
 .github/workflows/git-sync.yml | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/.github/workflows/git-sync.yml b/.github/workflows/git-sync.yml
index 2f223f370..544ba6892 100644
--- a/.github/workflows/git-sync.yml
+++ b/.github/workflows/git-sync.yml
@@ -13,7 +13,7 @@ jobs:
     runs-on: ubuntu-latest
     steps:
       - name: SSH Agent
-        uses: webfactory/ssh-agent@v0.8.0
+        uses: webfactory/ssh-agent@v0.9.0
         with:
           ssh-private-key: ${{ secrets.BITBUCKET_SECRET }}
 

From 1528cba08d55c76fc667afb98279e7077d6a56d0 Mon Sep 17 00:00:00 2001
From: BertBrenner <42405825+BertBrenner@users.noreply.github.com>
Date: Wed, 21 Feb 2024 22:32:10 +0100
Subject: [PATCH 080/154] fix: distro.sh: line 100: [: : integer expression
 expected (#4486)

* fix: servername variable assignment for sf and unt

The servername variable was incorrectly assigned using the selfname variable instead of the correct servername variable. This has been fixed to ensure accurate information is displayed for each game type.

* [FIX] #4465

---------

Co-authored-by: Daniel Gibbs <me@danielgibbs.co.uk>
---
 lgsm/modules/info_distro.sh | 6 +++---
 1 file changed, 3 insertions(+), 3 deletions(-)

diff --git a/lgsm/modules/info_distro.sh b/lgsm/modules/info_distro.sh
index a4e3521f8..4465d6cdb 100644
--- a/lgsm/modules/info_distro.sh
+++ b/lgsm/modules/info_distro.sh
@@ -30,13 +30,13 @@ for distro_info in "${distro_info_array[@]}"; do
 	if [ -f "/etc/os-release" ] && [ "${distro_info}" == "os-release" ]; then
 		distroname="$(grep "PRETTY_NAME" /etc/os-release | awk -F= '{gsub(/"/,"",$2);print $2}')"   # e.g. Ubuntu 22.04.3 LTS
 		distroversion="$(grep "VERSION_ID" /etc/os-release | awk -F= '{gsub(/"/,"",$2);print $2}')" # e.g. 22.04
+		distroid="$(grep "ID=" /etc/os-release | grep -v _ID | awk -F= '{gsub(/"/,"",$2);print $2}')"          # e.g. ubuntu
+		distroidlike="$(grep "ID_LIKE=" /etc/os-release | grep -v _ID | awk -F= '{gsub(/"/,"",$2);print $2}')" # e.g. debian
+		distrocodename="$(grep "VERSION_CODENAME" /etc/os-release | awk -F= '{gsub(/"/,"",$2);print $2}')"     # e.g. jammy
 		# Special var for rhel like distros to remove point in number e.g 8.4 to just 8.
 		if [[ "${distroidlike}" == *"rhel"* ]] || [ "${distroid}" == "rhel" ]; then
 			distroversionrh="$(sed -nr 's/^VERSION_ID="([0-9]*).+?"/\1/p' /etc/os-release)" # e.g. 8
 		fi
-		distroid="$(grep "ID=" /etc/os-release | grep -v _ID | awk -F= '{gsub(/"/,"",$2);print $2}')"          # e.g. ubuntu
-		distroidlike="$(grep "ID_LIKE=" /etc/os-release | grep -v _ID | awk -F= '{gsub(/"/,"",$2);print $2}')" # e.g. debian
-		distrocodename="$(grep "VERSION_CODENAME" /etc/os-release | awk -F= '{gsub(/"/,"",$2);print $2}')"     # e.g. jammy
 	elif [ "$(command -v lsb_release 2> /dev/null)" ] && [ "${distro_info}" == "lsb_release" ]; then
 		if [ -z "${distroname}" ]; then
 			distroname="$(lsb_release -sd)" # e.g. Ubuntu 22.04.3 LTS

From e492e09fa69daef6ec27a12308b88638bdca924a Mon Sep 17 00:00:00 2001
From: Daniel Gibbs <me@danielgibbs.co.uk>
Date: Wed, 21 Feb 2024 21:34:03 +0000
Subject: [PATCH 081/154] Release v24.1.4

---
 lgsm/modules/core_modules.sh | 2 +-
 linuxgsm.sh                  | 2 +-
 2 files changed, 2 insertions(+), 2 deletions(-)

diff --git a/lgsm/modules/core_modules.sh b/lgsm/modules/core_modules.sh
index 1afac30c7..70a452127 100644
--- a/lgsm/modules/core_modules.sh
+++ b/lgsm/modules/core_modules.sh
@@ -8,7 +8,7 @@
 
 moduleselfname="$(basename "$(readlink -f "${BASH_SOURCE[0]}")")"
 
-modulesversion="v24.1.3"
+modulesversion="v24.1.4"
 
 # Core
 
diff --git a/linuxgsm.sh b/linuxgsm.sh
index 1072101a0..e3c663754 100755
--- a/linuxgsm.sh
+++ b/linuxgsm.sh
@@ -24,7 +24,7 @@ if [ -f ".dev-debug" ]; then
 	set -x
 fi
 
-version="v24.1.3"
+version="v24.1.4"
 shortname="core"
 gameservername="core"
 commandname="CORE"

From b5614f5cbfd1c41aa5bb3282273a996ed16ca626 Mon Sep 17 00:00:00 2001
From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com>
Date: Wed, 21 Feb 2024 21:40:54 +0000
Subject: [PATCH 082/154] build(deps): bump github/issue-labeler from 3.3 to
 3.4 (#4478)

Bumps [github/issue-labeler](https://github.com/github/issue-labeler) from 3.3 to 3.4.
- [Release notes](https://github.com/github/issue-labeler/releases)
- [Commits](https://github.com/github/issue-labeler/compare/v3.3...v3.4)

---
updated-dependencies:
- dependency-name: github/issue-labeler
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
---
 .github/workflows/labeler.yml | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/.github/workflows/labeler.yml b/.github/workflows/labeler.yml
index b8bf63084..4a946a861 100644
--- a/.github/workflows/labeler.yml
+++ b/.github/workflows/labeler.yml
@@ -15,7 +15,7 @@ jobs:
     runs-on: ubuntu-latest
     steps:
       - name: Issue Labeler
-        uses: github/issue-labeler@v3.3
+        uses: github/issue-labeler@v3.4
         with:
           repo-token: "${{ secrets.GITHUB_TOKEN }}"
           configuration-path: .github/labeler.yml

From 476ed02bec8da3d4fecb2e6bba956a298fe5e3f5 Mon Sep 17 00:00:00 2001
From: MicLieg <38057464+MicLieg@users.noreply.github.com>
Date: Mon, 26 Feb 2024 14:57:55 +0100
Subject: [PATCH 083/154] feat(backup): add parallel backup creation using pigz
 (#4509)

---
 lgsm/data/almalinux-8.csv      | 2 +-
 lgsm/data/almalinux-9.csv      | 2 +-
 lgsm/data/centos-7.csv         | 2 +-
 lgsm/data/centos-8.csv         | 2 +-
 lgsm/data/centos-9.csv         | 2 +-
 lgsm/data/debian-10.csv        | 2 +-
 lgsm/data/debian-11.csv        | 2 +-
 lgsm/data/debian-12.csv        | 2 +-
 lgsm/data/debian-9.csv         | 2 +-
 lgsm/data/rhel-7.csv           | 2 +-
 lgsm/data/rhel-8.csv           | 2 +-
 lgsm/data/rhel-9.csv           | 2 +-
 lgsm/data/rocky-8.csv          | 2 +-
 lgsm/data/rocky-9.csv          | 2 +-
 lgsm/data/ubuntu-16.04.csv     | 2 +-
 lgsm/data/ubuntu-18.04.csv     | 2 +-
 lgsm/data/ubuntu-20.04.csv     | 2 +-
 lgsm/data/ubuntu-22.04.csv     | 2 +-
 lgsm/data/ubuntu-23.04.csv     | 2 +-
 lgsm/data/ubuntu-23.10.csv     | 2 +-
 lgsm/modules/check.sh          | 2 +-
 lgsm/modules/command_backup.sh | 2 +-
 22 files changed, 22 insertions(+), 22 deletions(-)

diff --git a/lgsm/data/almalinux-8.csv b/lgsm/data/almalinux-8.csv
index 53021ec30..c156eb053 100644
--- a/lgsm/data/almalinux-8.csv
+++ b/lgsm/data/almalinux-8.csv
@@ -1,4 +1,4 @@
-all,bc,binutils,bzip2,cpio,curl,epel-release,file,glibc.i686,gzip,hostname,jq,libstdc++,libstdc++.i686,nmap-ncat,python36,tar,tmux,unzip,util-linux,wget,xz
+all,bc,binutils,bzip2,cpio,curl,epel-release,file,glibc.i686,gzip,hostname,jq,libstdc++,libstdc++.i686,nmap-ncat,pigz,python36,tar,tmux,unzip,util-linux,wget,xz
 steamcmd,glibc.i686,libstdc++.i686
 ac
 ahl
diff --git a/lgsm/data/almalinux-9.csv b/lgsm/data/almalinux-9.csv
index 8f643487c..faacfa915 100644
--- a/lgsm/data/almalinux-9.csv
+++ b/lgsm/data/almalinux-9.csv
@@ -1,4 +1,4 @@
-all,bc,binutils,bzip2,cpio,curl,epel-release,file,glibc.i686,gzip,hostname,jq,libstdc++,libstdc++.i686,nmap-ncat,python3,tar,tmux,unzip,util-linux,wget,xz
+all,bc,binutils,bzip2,cpio,curl,epel-release,file,glibc.i686,gzip,hostname,jq,libstdc++,libstdc++.i686,nmap-ncat,pigz,python3,tar,tmux,unzip,util-linux,wget,xz
 steamcmd,glibc.i686,libstdc++.i686
 ac
 ahl
diff --git a/lgsm/data/centos-7.csv b/lgsm/data/centos-7.csv
index 5315d8de0..84df6f5c6 100644
--- a/lgsm/data/centos-7.csv
+++ b/lgsm/data/centos-7.csv
@@ -1,4 +1,4 @@
-all,bc,binutils,bzip2,cpio,curl,epel-release,file,glibc.i686,gzip,hostname,jq,libstdc++,libstdc++.i686,nmap-ncat,python3,tar,tmux,unzip,util-linux,wget,xz
+all,bc,binutils,bzip2,cpio,curl,epel-release,file,glibc.i686,gzip,hostname,jq,libstdc++,libstdc++.i686,nmap-ncat,pigz,python3,tar,tmux,unzip,util-linux,wget,xz
 steamcmd,glibc.i686,libstdc++.i686
 ac
 ahl
diff --git a/lgsm/data/centos-8.csv b/lgsm/data/centos-8.csv
index 53021ec30..c156eb053 100644
--- a/lgsm/data/centos-8.csv
+++ b/lgsm/data/centos-8.csv
@@ -1,4 +1,4 @@
-all,bc,binutils,bzip2,cpio,curl,epel-release,file,glibc.i686,gzip,hostname,jq,libstdc++,libstdc++.i686,nmap-ncat,python36,tar,tmux,unzip,util-linux,wget,xz
+all,bc,binutils,bzip2,cpio,curl,epel-release,file,glibc.i686,gzip,hostname,jq,libstdc++,libstdc++.i686,nmap-ncat,pigz,python36,tar,tmux,unzip,util-linux,wget,xz
 steamcmd,glibc.i686,libstdc++.i686
 ac
 ahl
diff --git a/lgsm/data/centos-9.csv b/lgsm/data/centos-9.csv
index 8f643487c..faacfa915 100644
--- a/lgsm/data/centos-9.csv
+++ b/lgsm/data/centos-9.csv
@@ -1,4 +1,4 @@
-all,bc,binutils,bzip2,cpio,curl,epel-release,file,glibc.i686,gzip,hostname,jq,libstdc++,libstdc++.i686,nmap-ncat,python3,tar,tmux,unzip,util-linux,wget,xz
+all,bc,binutils,bzip2,cpio,curl,epel-release,file,glibc.i686,gzip,hostname,jq,libstdc++,libstdc++.i686,nmap-ncat,pigz,python3,tar,tmux,unzip,util-linux,wget,xz
 steamcmd,glibc.i686,libstdc++.i686
 ac
 ahl
diff --git a/lgsm/data/debian-10.csv b/lgsm/data/debian-10.csv
index a2d1ee665..5f7f5f261 100644
--- a/lgsm/data/debian-10.csv
+++ b/lgsm/data/debian-10.csv
@@ -1,7 +1,7 @@
 ac
 ahl
 ahl2
-all,bc,binutils,bsdmainutils,bzip2,ca-certificates,cpio,curl,distro-info,file,gzip,hostname,jq,lib32gcc1,lib32stdc++6,netcat,python3,tar,tmux,unzip,util-linux,uuid-runtime,wget,xz-utils
+all,bc,binutils,bsdmainutils,bzip2,ca-certificates,cpio,curl,distro-info,file,gzip,hostname,jq,lib32gcc1,lib32stdc++6,netcat,pigz,python3,tar,tmux,unzip,util-linux,uuid-runtime,wget,xz-utils
 ark
 arma3
 armar,libcurl4
diff --git a/lgsm/data/debian-11.csv b/lgsm/data/debian-11.csv
index bdf03879e..3ecedd538 100644
--- a/lgsm/data/debian-11.csv
+++ b/lgsm/data/debian-11.csv
@@ -1,4 +1,4 @@
-all,bc,binutils,bsdmainutils,bzip2,ca-certificates,cpio,curl,distro-info,file,gzip,hostname,jq,lib32gcc-s1,lib32stdc++6,netcat,python3,tar,tmux,unzip,util-linux,uuid-runtime,wget,xz-utils
+all,bc,binutils,bsdmainutils,bzip2,ca-certificates,cpio,curl,distro-info,file,gzip,hostname,jq,lib32gcc-s1,lib32stdc++6,netcat,pigz,python3,tar,tmux,unzip,util-linux,uuid-runtime,wget,xz-utils
 steamcmd,lib32gcc-s1,lib32stdc++6,libsdl2-2.0-0:i386,steamcmd
 ac
 ahl
diff --git a/lgsm/data/debian-12.csv b/lgsm/data/debian-12.csv
index cc884a6f8..0ff8b391d 100644
--- a/lgsm/data/debian-12.csv
+++ b/lgsm/data/debian-12.csv
@@ -1,4 +1,4 @@
-all,bc,binutils,bsdmainutils,bzip2,ca-certificates,cpio,curl,distro-info,file,gzip,hostname,jq,lib32gcc-s1,lib32stdc++6,netcat-openbsd,python3,tar,tmux,unzip,util-linux,uuid-runtime,wget,xz-utils
+all,bc,binutils,bsdmainutils,bzip2,ca-certificates,cpio,curl,distro-info,file,gzip,hostname,jq,lib32gcc-s1,lib32stdc++6,netcat-openbsd,pigz,python3,tar,tmux,unzip,util-linux,uuid-runtime,wget,xz-utils
 steamcmd,lib32gcc-s1,lib32stdc++6,libsdl2-2.0-0:i386,steamcmd
 ac
 ahl
diff --git a/lgsm/data/debian-9.csv b/lgsm/data/debian-9.csv
index ccefafcc2..cb5eea4a1 100644
--- a/lgsm/data/debian-9.csv
+++ b/lgsm/data/debian-9.csv
@@ -1,4 +1,4 @@
-all,bc,binutils,bsdmainutils,bzip2,ca-certificates,cpio,curl,distro-info,file,gzip,hostname,jq,lib32gcc1,lib32stdc++6,netcat,python3,tar,tmux,unzip,util-linux,wget,xz-utils
+all,bc,binutils,bsdmainutils,bzip2,ca-certificates,cpio,curl,distro-info,file,gzip,hostname,jq,lib32gcc1,lib32stdc++6,netcat,pigz,python3,tar,tmux,unzip,util-linux,wget,xz-utils
 steamcmd,lib32gcc1,lib32stdc++6,libsdl2-2.0-0:i386,steamcmd
 ac
 ahl
diff --git a/lgsm/data/rhel-7.csv b/lgsm/data/rhel-7.csv
index 14cc292ac..2b3be410d 100644
--- a/lgsm/data/rhel-7.csv
+++ b/lgsm/data/rhel-7.csv
@@ -1,4 +1,4 @@
-all,bc,binutils,bzip2,cpio,curl,epel-release,file,glibc.i686,gzip,hostname,jq,libstdc++,libstdc++.i686,nmap-ncat,python36,tar,tmux,unzip,util-linux,wget,xz
+all,bc,binutils,bzip2,cpio,curl,epel-release,file,glibc.i686,gzip,hostname,jq,libstdc++,libstdc++.i686,nmap-ncat,pigz,python36,tar,tmux,unzip,util-linux,wget,xz
 steamcmd,glibc.i686,libstdc++.i686
 ac
 ahl
diff --git a/lgsm/data/rhel-8.csv b/lgsm/data/rhel-8.csv
index 53021ec30..c156eb053 100644
--- a/lgsm/data/rhel-8.csv
+++ b/lgsm/data/rhel-8.csv
@@ -1,4 +1,4 @@
-all,bc,binutils,bzip2,cpio,curl,epel-release,file,glibc.i686,gzip,hostname,jq,libstdc++,libstdc++.i686,nmap-ncat,python36,tar,tmux,unzip,util-linux,wget,xz
+all,bc,binutils,bzip2,cpio,curl,epel-release,file,glibc.i686,gzip,hostname,jq,libstdc++,libstdc++.i686,nmap-ncat,pigz,python36,tar,tmux,unzip,util-linux,wget,xz
 steamcmd,glibc.i686,libstdc++.i686
 ac
 ahl
diff --git a/lgsm/data/rhel-9.csv b/lgsm/data/rhel-9.csv
index 8f643487c..faacfa915 100644
--- a/lgsm/data/rhel-9.csv
+++ b/lgsm/data/rhel-9.csv
@@ -1,4 +1,4 @@
-all,bc,binutils,bzip2,cpio,curl,epel-release,file,glibc.i686,gzip,hostname,jq,libstdc++,libstdc++.i686,nmap-ncat,python3,tar,tmux,unzip,util-linux,wget,xz
+all,bc,binutils,bzip2,cpio,curl,epel-release,file,glibc.i686,gzip,hostname,jq,libstdc++,libstdc++.i686,nmap-ncat,pigz,python3,tar,tmux,unzip,util-linux,wget,xz
 steamcmd,glibc.i686,libstdc++.i686
 ac
 ahl
diff --git a/lgsm/data/rocky-8.csv b/lgsm/data/rocky-8.csv
index 53021ec30..c156eb053 100644
--- a/lgsm/data/rocky-8.csv
+++ b/lgsm/data/rocky-8.csv
@@ -1,4 +1,4 @@
-all,bc,binutils,bzip2,cpio,curl,epel-release,file,glibc.i686,gzip,hostname,jq,libstdc++,libstdc++.i686,nmap-ncat,python36,tar,tmux,unzip,util-linux,wget,xz
+all,bc,binutils,bzip2,cpio,curl,epel-release,file,glibc.i686,gzip,hostname,jq,libstdc++,libstdc++.i686,nmap-ncat,pigz,python36,tar,tmux,unzip,util-linux,wget,xz
 steamcmd,glibc.i686,libstdc++.i686
 ac
 ahl
diff --git a/lgsm/data/rocky-9.csv b/lgsm/data/rocky-9.csv
index 8f643487c..faacfa915 100644
--- a/lgsm/data/rocky-9.csv
+++ b/lgsm/data/rocky-9.csv
@@ -1,4 +1,4 @@
-all,bc,binutils,bzip2,cpio,curl,epel-release,file,glibc.i686,gzip,hostname,jq,libstdc++,libstdc++.i686,nmap-ncat,python3,tar,tmux,unzip,util-linux,wget,xz
+all,bc,binutils,bzip2,cpio,curl,epel-release,file,glibc.i686,gzip,hostname,jq,libstdc++,libstdc++.i686,nmap-ncat,pigz,python3,tar,tmux,unzip,util-linux,wget,xz
 steamcmd,glibc.i686,libstdc++.i686
 ac
 ahl
diff --git a/lgsm/data/ubuntu-16.04.csv b/lgsm/data/ubuntu-16.04.csv
index e50ea48c0..9d88fde5c 100644
--- a/lgsm/data/ubuntu-16.04.csv
+++ b/lgsm/data/ubuntu-16.04.csv
@@ -1,4 +1,4 @@
-all,bc,binutils,bsdmainutils,bzip2,ca-certificates,cpio,curl,file,gzip,hostname,jq,lib32gcc1,lib32stdc++6,netcat,python3,tar,tmux,unzip,util-linux,uuid-runtime,wget,xz-utils
+all,bc,binutils,bsdmainutils,bzip2,ca-certificates,cpio,curl,file,gzip,hostname,jq,lib32gcc1,lib32stdc++6,netcat,pigz,python3,tar,tmux,unzip,util-linux,uuid-runtime,wget,xz-utils
 steamcmd,lib32gcc1,lib32stdc++6,libsdl2-2.0-0:i386,steamcmd
 ac
 ahl
diff --git a/lgsm/data/ubuntu-18.04.csv b/lgsm/data/ubuntu-18.04.csv
index 5294e6757..a0b809b05 100644
--- a/lgsm/data/ubuntu-18.04.csv
+++ b/lgsm/data/ubuntu-18.04.csv
@@ -1,4 +1,4 @@
-all,bc,binutils,bsdmainutils,bzip2,ca-certificates,cpio,curl,distro-info,file,gzip,hostname,jq,lib32gcc1,lib32stdc++6,netcat,python3,tar,tmux,unzip,util-linux,uuid-runtime,wget,xz-utils
+all,bc,binutils,bsdmainutils,bzip2,ca-certificates,cpio,curl,distro-info,file,gzip,hostname,jq,lib32gcc1,lib32stdc++6,netcat,pigz,python3,tar,tmux,unzip,util-linux,uuid-runtime,wget,xz-utils
 steamcmd,lib32gcc1,lib32stdc++6,libsdl2-2.0-0:i386,steamcmd
 ac
 ahl
diff --git a/lgsm/data/ubuntu-20.04.csv b/lgsm/data/ubuntu-20.04.csv
index f864b0d0a..092792fa3 100644
--- a/lgsm/data/ubuntu-20.04.csv
+++ b/lgsm/data/ubuntu-20.04.csv
@@ -1,4 +1,4 @@
-all,bc,binutils,bsdmainutils,bzip2,ca-certificates,cpio,curl,distro-info,file,gzip,hostname,jq,lib32gcc1,lib32stdc++6,netcat,python3,tar,tmux,unzip,util-linux,uuid-runtime,wget,xz-utils
+all,bc,binutils,bsdmainutils,bzip2,ca-certificates,cpio,curl,distro-info,file,gzip,hostname,jq,lib32gcc1,lib32stdc++6,netcat,pigz,python3,tar,tmux,unzip,util-linux,uuid-runtime,wget,xz-utils
 steamcmd,lib32gcc1,lib32stdc++6,libsdl2-2.0-0:i386,steamcmd
 ac
 ahl
diff --git a/lgsm/data/ubuntu-22.04.csv b/lgsm/data/ubuntu-22.04.csv
index c010ac60a..21bab16cb 100644
--- a/lgsm/data/ubuntu-22.04.csv
+++ b/lgsm/data/ubuntu-22.04.csv
@@ -1,4 +1,4 @@
-all,bc,binutils,bsdmainutils,bzip2,ca-certificates,cpio,curl,distro-info,file,gzip,hostname,jq,lib32gcc-s1,lib32stdc++6,netcat,python3,tar,tmux,unzip,util-linux,uuid-runtime,wget,xz-utils
+all,bc,binutils,bsdmainutils,bzip2,ca-certificates,cpio,curl,distro-info,file,gzip,hostname,jq,lib32gcc-s1,lib32stdc++6,netcat,pigz,python3,tar,tmux,unzip,util-linux,uuid-runtime,wget,xz-utils
 steamcmd,lib32gcc-s1,lib32stdc++6,libsdl2-2.0-0:i386,steamcmd
 ac
 ahl
diff --git a/lgsm/data/ubuntu-23.04.csv b/lgsm/data/ubuntu-23.04.csv
index 1a52e301e..a29f403d7 100644
--- a/lgsm/data/ubuntu-23.04.csv
+++ b/lgsm/data/ubuntu-23.04.csv
@@ -1,4 +1,4 @@
-all,bc,binutils,bsdmainutils,bzip2,ca-certificates,cpio,curl,distro-info,file,gzip,hostname,jq,lib32gcc-s1,lib32stdc++6,netcat-openbsd,python3,tar,tmux,unzip,util-linux,uuid-runtime,wget,xz-utils
+all,bc,binutils,bsdmainutils,bzip2,ca-certificates,cpio,curl,distro-info,file,gzip,hostname,jq,lib32gcc-s1,lib32stdc++6,netcat-openbsd,pigz,python3,tar,tmux,unzip,util-linux,uuid-runtime,wget,xz-utils
 steamcmd,lib32gcc-s1,lib32stdc++6,libsdl2-2.0-0:i386,steamcmd
 ac
 ahl
diff --git a/lgsm/data/ubuntu-23.10.csv b/lgsm/data/ubuntu-23.10.csv
index 1a52e301e..a29f403d7 100644
--- a/lgsm/data/ubuntu-23.10.csv
+++ b/lgsm/data/ubuntu-23.10.csv
@@ -1,4 +1,4 @@
-all,bc,binutils,bsdmainutils,bzip2,ca-certificates,cpio,curl,distro-info,file,gzip,hostname,jq,lib32gcc-s1,lib32stdc++6,netcat-openbsd,python3,tar,tmux,unzip,util-linux,uuid-runtime,wget,xz-utils
+all,bc,binutils,bsdmainutils,bzip2,ca-certificates,cpio,curl,distro-info,file,gzip,hostname,jq,lib32gcc-s1,lib32stdc++6,netcat-openbsd,pigz,python3,tar,tmux,unzip,util-linux,uuid-runtime,wget,xz-utils
 steamcmd,lib32gcc-s1,lib32stdc++6,libsdl2-2.0-0:i386,steamcmd
 ac
 ahl
diff --git a/lgsm/modules/check.sh b/lgsm/modules/check.sh
index 1b8796e47..66b44aec3 100644
--- a/lgsm/modules/check.sh
+++ b/lgsm/modules/check.sh
@@ -54,7 +54,7 @@ for allowed_command in "${allowed_commands_array[@]}"; do
 	fi
 done
 
-allowed_commands_array=(DEBUG START)
+allowed_commands_array=(BACKUP DEBUG START)
 for allowed_command in "${allowed_commands_array[@]}"; do
 	if [ "${allowed_command}" == "${commandname}" ]; then
 		check_deps.sh
diff --git a/lgsm/modules/command_backup.sh b/lgsm/modules/command_backup.sh
index e0ef3f0a1..a3e1bbe7f 100644
--- a/lgsm/modules/command_backup.sh
+++ b/lgsm/modules/command_backup.sh
@@ -126,7 +126,7 @@ fn_backup_compression() {
 		core_exit.sh
 	fi
 
-	tar -czf "${backupdir}/${backupname}.tar.gz" -C "${rootdir}" --exclude "${excludedir}" --exclude "${lockdir}" --exclude "${tmpdir}" ./.
+	tar --use-compress-program=pigz -cf "${backupdir}/${backupname}.tar.gz" -C "${rootdir}" --exclude "${excludedir}" --exclude "${lockdir}" --exclude "${tmpdir}" ./.
 	local exitcode=$?
 	if [ "${exitcode}" != 0 ]; then
 		fn_print_fail_eol

From fce9f65d6a27516308d60ec6c5bcedd24fe3ed43 Mon Sep 17 00:00:00 2001
From: Daniel Gibbs <me@danielgibbs.co.uk>
Date: Mon, 26 Feb 2024 15:55:12 +0000
Subject: [PATCH 084/154] feat(monitor): prepare for gamedig 5 (#4510)

* feat: gamedig 5

* install gamedig in lgsm dir if node exists

* and

* use local gamedig version

* local

* palworld

* pw query port

* mbe

* fix ro

system

system

a

* public ip

* jc2m

* fix(ti): update default map

The default map in the tiserver configuration file has been updated from "/Game/TheIsle/Maps/Game/Isla_Spiro/Isla_Spiro" to "/Game/TheIsle/Maps/Game/Gateway/Gateway". This change ensures that the server starts with the correct default map.

* fix: _default.cfg NOT SET

* download package.json and run npm install

* update samp

* disable query for squad

* correct name

* feat: update querymode and querytype in server configs

Changed querymode to 3 and set querytype to "eco" for ecoserver.
Updated querymode to 2 and changed querytype to "protocol-valve" for sdtdserver.

* feat: add new port command for bfv game

Added a new port command for the "bfv" game in the info_messages script.

* queryport eco

* add eco rconport

* adding message

* if node 16 or above

* rename to check_gamedig
---
 .../config-lgsm/ecoserver/_default.cfg        |   4 +-
 .../config-lgsm/jc2server/_default.cfg        |   2 +-
 .../config-lgsm/mcbserver/_default.cfg        |   2 +-
 .../config-lgsm/pwserver/_default.cfg         |   4 +-
 .../config-lgsm/sampserver/_default.cfg       |   2 +-
 .../config-lgsm/sdtdserver/_default.cfg       |   2 +-
 .../config-lgsm/squadserver/_default.cfg      |   4 +-
 lgsm/modules/check.sh                         |   7 +
 lgsm/modules/check_gamedig.sh                 |  15 +
 lgsm/modules/check_ip.sh                      |   8 +-
 lgsm/modules/command_dev_query_raw.sh         |   2 +-
 lgsm/modules/command_install.sh               |   3 +
 lgsm/modules/command_monitor.sh               |   2 +-
 lgsm/modules/command_update_linuxgsm.sh       |   1 +
 lgsm/modules/core_modules.sh                  |   5 +
 lgsm/modules/fix.sh                           |   2 +-
 lgsm/modules/fix_ro.sh                        | 134 +++-
 lgsm/modules/info_game.sh                     |   4 +
 lgsm/modules/info_messages.sh                 |   4 +
 lgsm/modules/query_gamedig.sh                 |  13 +-
 lgsm/modules/query_gsquery.py                 |  40 +-
 package-lock.json                             | 639 ++++++++++++++++++
 package.json                                  |   5 +-
 23 files changed, 839 insertions(+), 65 deletions(-)
 create mode 100644 lgsm/modules/check_gamedig.sh

diff --git a/lgsm/config-default/config-lgsm/ecoserver/_default.cfg b/lgsm/config-default/config-lgsm/ecoserver/_default.cfg
index 470b43d06..794a6ed69 100644
--- a/lgsm/config-default/config-lgsm/ecoserver/_default.cfg
+++ b/lgsm/config-default/config-lgsm/ecoserver/_default.cfg
@@ -131,8 +131,8 @@ stopmode="2"
 # 3: gamedig
 # 4: gsquery
 # 5: tcp
-querymode="1"
-querytype=""
+querymode="3"
+querytype="eco"
 
 ## Console type
 consoleverbose="yes"
diff --git a/lgsm/config-default/config-lgsm/jc2server/_default.cfg b/lgsm/config-default/config-lgsm/jc2server/_default.cfg
index caa40d93a..da9b4f40a 100644
--- a/lgsm/config-default/config-lgsm/jc2server/_default.cfg
+++ b/lgsm/config-default/config-lgsm/jc2server/_default.cfg
@@ -132,7 +132,7 @@ stopmode="2"
 # 4: gsquery
 # 5: tcp
 querymode="2"
-querytype="jc2mp"
+querytype="jc2m"
 
 ## Console type
 consoleverbose="yes"
diff --git a/lgsm/config-default/config-lgsm/mcbserver/_default.cfg b/lgsm/config-default/config-lgsm/mcbserver/_default.cfg
index 586575d10..db2bbf86d 100644
--- a/lgsm/config-default/config-lgsm/mcbserver/_default.cfg
+++ b/lgsm/config-default/config-lgsm/mcbserver/_default.cfg
@@ -125,7 +125,7 @@ stopmode="5"
 # 4: gsquery
 # 5: tcp
 querymode="2"
-querytype="minecraftbe"
+querytype="mbe"
 
 ## Console type
 consoleverbose="yes"
diff --git a/lgsm/config-default/config-lgsm/pwserver/_default.cfg b/lgsm/config-default/config-lgsm/pwserver/_default.cfg
index cd318aacc..eaf5d775c 100644
--- a/lgsm/config-default/config-lgsm/pwserver/_default.cfg
+++ b/lgsm/config-default/config-lgsm/pwserver/_default.cfg
@@ -139,8 +139,8 @@ stopmode="2"
 # 3: gamedig
 # 4: gsquery
 # 5: tcp
-querymode="1"
-querytype="1"
+querymode="3"
+querytype="palworld"
 
 ## Console type
 consoleverbose="yes"
diff --git a/lgsm/config-default/config-lgsm/sampserver/_default.cfg b/lgsm/config-default/config-lgsm/sampserver/_default.cfg
index 510b9a689..0888064ba 100644
--- a/lgsm/config-default/config-lgsm/sampserver/_default.cfg
+++ b/lgsm/config-default/config-lgsm/sampserver/_default.cfg
@@ -123,7 +123,7 @@ stopmode="2"
 # 4: gsquery
 # 5: tcp
 querymode="3"
-querytype="samp"
+querytype="gtasam"
 
 ## Console type
 consoleverbose="no"
diff --git a/lgsm/config-default/config-lgsm/sdtdserver/_default.cfg b/lgsm/config-default/config-lgsm/sdtdserver/_default.cfg
index 61cd85a8a..24cd2c0ac 100644
--- a/lgsm/config-default/config-lgsm/sdtdserver/_default.cfg
+++ b/lgsm/config-default/config-lgsm/sdtdserver/_default.cfg
@@ -134,7 +134,7 @@ stopmode="8"
 # 3: gamedig
 # 4: gsquery
 # 5: tcp
-querymode="5"
+querymode="2"
 querytype="protocol-valve"
 
 ## Console type
diff --git a/lgsm/config-default/config-lgsm/squadserver/_default.cfg b/lgsm/config-default/config-lgsm/squadserver/_default.cfg
index 09c0e94b1..55bc2bf44 100644
--- a/lgsm/config-default/config-lgsm/squadserver/_default.cfg
+++ b/lgsm/config-default/config-lgsm/squadserver/_default.cfg
@@ -136,8 +136,8 @@ stopmode="2"
 # 3: gamedig
 # 4: gsquery
 # 5: tcp
-querymode="2"
-querytype="protocol-valve"
+querymode="1"
+querytype=""
 
 ## Console type
 consoleverbose="yes"
diff --git a/lgsm/modules/check.sh b/lgsm/modules/check.sh
index 66b44aec3..2a63df3f3 100644
--- a/lgsm/modules/check.sh
+++ b/lgsm/modules/check.sh
@@ -99,3 +99,10 @@ for allowed_command in "${allowed_commands_array[@]}"; do
 		check_system_requirements.sh
 	fi
 done
+
+allowed_commands_array=(DETAILS MONITOR START STOP UPDATE VALIDATE POST-DETAILS)
+for allowed_command in "${allowed_commands_array[@]}"; do
+	if [ "${allowed_command}" == "${commandname}" ]; then
+		check_gamedig.sh
+	fi
+done
diff --git a/lgsm/modules/check_gamedig.sh b/lgsm/modules/check_gamedig.sh
new file mode 100644
index 000000000..4155e6a69
--- /dev/null
+++ b/lgsm/modules/check_gamedig.sh
@@ -0,0 +1,15 @@
+#!/bin/bash
+# LinuxGSM check_gamedig.sh module
+# Author: Daniel Gibbs
+# Contributors: http://linuxgsm.com/contrib
+# Website: https://linuxgsm.com
+# Description: Installs nodejs and gamedig
+
+if [ "$(command -v node)" ] && [ "$(node -v | cut -d 'v' -f 2 | cut -d '.' -f 1)" -ge 16 ] && [ ! -f "${lgsmdir}/node_modules/gamedig/bin/gamedig.js" ]; then
+	echo -e ""
+	echo -e "${bold}${lightyellow}Installing Gamedig${default}"
+	fn_script_log_info "Installing Gamedig"
+	cd "${lgsmdir}" || exit
+	wget -N --no-check-certificate "https://raw.githubusercontent.com/GameServerManagers/LinuxGSM/${githubbranch}/package.json"
+	npm install
+fi
diff --git a/lgsm/modules/check_ip.sh b/lgsm/modules/check_ip.sh
index 7671429cd..bf0418f74 100644
--- a/lgsm/modules/check_ip.sh
+++ b/lgsm/modules/check_ip.sh
@@ -38,25 +38,25 @@ function fn_is_valid_ip() {
 
 # If the IP variable has been set by user.
 if fn_is_valid_ip "${ip}"; then
-	queryips=("${ip}")
+	queryips=("${ip}" "${publicip}")
 	httpip=("${ip}")
 	telnetip=("${ip}")
 # If the game config has an IP set.
 elif fn_is_valid_ip "${configip}"; then
-	queryips=("${configip}")
+	queryips=("${configip}" "${publicip}")
 	ip="${configip}"
 	httpip=("${configip}")
 	telnetip=("${configip}")
 # If there is only 1 server IP address.
 # Some IP details can automatically use the one IP.
 elif [ "${#current_ips[@]}" == "1" ]; then
-	queryips=("127.0.0.1" "${current_ips[@]}")
+	queryips=("127.0.0.1" "${current_ips[@]}" "${publicip}")
 	ip="0.0.0.0"
 	httpip=("${current_ips[@]}")
 	telnetip=("${current_ips[@]}")
 # If no ip is set by the user and server has more than one IP.
 else
-	queryips=("127.0.0.1" "${current_ips[@]}")
+	queryips=("127.0.0.1" "${current_ips[@]}" "${publicip}")
 	ip="0.0.0.0"
 	httpip=("${ip}")
 	telnetip=("${ip}")
diff --git a/lgsm/modules/command_dev_query_raw.sh b/lgsm/modules/command_dev_query_raw.sh
index 2314d75b4..ae49a1b85 100644
--- a/lgsm/modules/command_dev_query_raw.sh
+++ b/lgsm/modules/command_dev_query_raw.sh
@@ -207,7 +207,7 @@ echo -e ""
 echo -e "${lightgreen}Gamedig Raw Output${default}"
 fn_messages_separator
 echo -e ""
-if [ ! "$(command -v gamedig 2> /dev/null)" ]; then
+if [ ! "$(command -v gamedig 2> /dev/null)" ] || [ ! -f "${lgsmdir}/node_modules/gamedig/bin/gamedig.js" ]; then
 	fn_print_failure_nl "gamedig not installed"
 fi
 if [ ! "$(command -v jq 2> /dev/null)" ]; then
diff --git a/lgsm/modules/command_install.sh b/lgsm/modules/command_install.sh
index e8cba7560..c3bf27c61 100644
--- a/lgsm/modules/command_install.sh
+++ b/lgsm/modules/command_install.sh
@@ -30,6 +30,9 @@ else
 		install_server_files.sh
 	fi
 
+	# Install gamedig
+	check_gamedig.sh
+
 	# Configuration.
 	install_config.sh
 	if [ -v gslt ]; then
diff --git a/lgsm/modules/command_monitor.sh b/lgsm/modules/command_monitor.sh
index a18154948..e9baf71e5 100644
--- a/lgsm/modules/command_monitor.sh
+++ b/lgsm/modules/command_monitor.sh
@@ -369,7 +369,7 @@ fn_monitor_loop() {
 	for querymethod in "${query_methods_array[@]}"; do
 		# Will check if gamedig is installed and bypass if not.
 		if [ "${querymethod}" == "gamedig" ]; then
-			if [ "$(command -v gamedig 2> /dev/null)" ] && [ "$(command -v jq 2> /dev/null)" ]; then
+			if [ "$(command -v gamedig 2> /dev/null)" ] || [ -f "${lgsmdir}/node_modules/gamedig/bin/gamedig.js" ] && [ "$(command -v jq 2> /dev/null)" ]; then
 				if [ -z "${monitorpass}" ]; then
 					fn_monitor_query
 				fi
diff --git a/lgsm/modules/command_update_linuxgsm.sh b/lgsm/modules/command_update_linuxgsm.sh
index 9cd66430c..d20204187 100644
--- a/lgsm/modules/command_update_linuxgsm.sh
+++ b/lgsm/modules/command_update_linuxgsm.sh
@@ -13,6 +13,7 @@ fn_firstcommand_set
 fn_print_dots ""
 check.sh
 info_distro.sh
+info_game.sh
 
 fn_script_log_info "Updating LinuxGSM"
 
diff --git a/lgsm/modules/core_modules.sh b/lgsm/modules/core_modules.sh
index 70a452127..9852268f0 100644
--- a/lgsm/modules/core_modules.sh
+++ b/lgsm/modules/core_modules.sh
@@ -714,6 +714,11 @@ install_factorio_save.sh() {
 	fn_fetch_module
 }
 
+check_gamedig.sh() {
+	modulefile="${FUNCNAME[0]}"
+	fn_fetch_module
+}
+
 install_dst_token.sh() {
 	modulefile="${FUNCNAME[0]}"
 	fn_fetch_module
diff --git a/lgsm/modules/fix.sh b/lgsm/modules/fix.sh
index 280112728..dbb8e3545 100644
--- a/lgsm/modules/fix.sh
+++ b/lgsm/modules/fix.sh
@@ -52,7 +52,7 @@ fn_apply_fix() {
 	fi
 }
 
-apply_pre_start_fix=(arma3 armar ark av bt bo csgo cmw dst hw ins kf nmrih onset pvr rust rw samp sdtd sfc sof2 squad st tf2 terraria ts3 mcb mta unt vh wurm zmr)
+apply_pre_start_fix=(arma3 armar ark av bt bo csgo cmw dst hw ins kf nmrih onset pvr ro rust rw samp sdtd sfc sof2 squad st tf2 terraria ts3 mcb mta unt vh wurm zmr)
 apply_post_install_fix=(av kf kf2 ro ut2k4 ut ut3)
 
 # validate registered fixes for safe development
diff --git a/lgsm/modules/fix_ro.sh b/lgsm/modules/fix_ro.sh
index 72864d699..21663a9ea 100644
--- a/lgsm/modules/fix_ro.sh
+++ b/lgsm/modules/fix_ro.sh
@@ -3,37 +3,115 @@
 # Author: Daniel Gibbs
 # Contributors: http://linuxgsm.com/contrib
 # Website: https://linuxgsm.com
-# Description: Resolves issues with Red Orchestra.
+# Description: Resolves issues with Red Orchestra: Ostfront 41-45.
 
 moduleselfname="$(basename "$(readlink -f "${BASH_SOURCE[0]}")")"
 
-echo -e "applying webinterface ROOst.css fix."
-echo -e "http://forums.tripwireinteractive.com/showpost.php?p=585435&postcount=13"
+# echo -e "applying WebAdmin ROOst.css fix."
+# echo -e "http://forums.tripwireinteractive.com/showpost.php?p=585435&postcount=13"
 sed -i 's/none}/none;/g' "${serverfiles}/Web/ServerAdmin/ROOst.css"
 sed -i 's/underline}/underline;/g' "${serverfiles}/Web/ServerAdmin/ROOst.css"
-fn_sleep_time
-echo -e "applying webinterface CharSet fix."
-echo -e "http://forums.tripwireinteractive.com/showpost.php?p=442340&postcount=1"
+# echo -e "applying WebAdmin CharSet fix."
+# echo -e "http://forums.tripwireinteractive.com/showpost.php?p=442340&postcount=1"
 sed -i 's/CharSet="iso-8859-1"/CharSet="utf-8"/g' "${systemdir}/uweb.int"
-fn_sleep_time
-echo -e "applying Steam AppID fix."
-sed -i 's/1210/1200/g' "${systemdir}/steam_appid.txt"
-fn_sleep_time
-echo -e "applying server name fix."
-fn_sleep_time
-echo -e "forcing server restart..."
-fn_sleep_time
-exitbypass=1
-command_start.sh
-fn_firstcommand_reset
-fn_sleep_time_5
-exitbypass=1
-command_stop.sh
-fn_firstcommand_reset
-exitbypass=1
-command_start.sh
-fn_firstcommand_reset
-fn_sleep_time_5
-exitbypass=1
-command_stop.sh
-fn_firstcommand_reset
+
+# get md5sum of steamclient.so
+if [ -f "${serverfiles}/system/steamclient.so" ]; then
+	steamclientmd5=$(md5sum "${serverfiles}/system/steamclient.so" | awk '{print $1;}')
+fi
+#get md5sum of libtier0_s.so
+if [ -f "${serverfiles}/system/libtier0_s.so" ]; then
+	libtier0_smd5=$(md5sum "${serverfiles}/system/libtier0_s.so" | awk '{print $1;}')
+fi
+#get md5sum of libvstdlib_s.so
+if [ -f "${serverfiles}/system/libvstdlib_s.so" ]; then
+	libvstdlib_smd5=$(md5sum "${serverfiles}/system/libvstdlib_s.so" | awk '{print $1;}')
+fi
+
+# get md5sum of steamclient.so from steamcmd
+if [ -f "${HOME}/.steam/steamcmd/linux32/steamclient.so" ]; then
+	steamcmdsteamclientmd5=$(md5sum "${HOME}/.steam/steamcmd/linux32/steamclient.so" | awk '{print $1;}')
+elif [ -f "${steamcmddir}/linux32/steamclient.so" ]; then
+	steamcmdsteamclientmd5=$(md5sum "${steamcmddir}/linux32/steamclient.so" | awk '{print $1;}')
+elif [ -f "${HOME}/.local/share/Steam/steamcmd/linux32/steamclient.so" ]; then
+	steamcmdsteamclientmd5=$(md5sum "${HOME}/.local/share/Steam/steamcmd/linux32/steamclient.so" | awk '{print $1;}')
+fi
+
+# get md5sum of libtier0_s.so from steamcmd
+if [ -f "${HOME}/.steam/steamcmd/linux32/libtier0_s.so" ]; then
+	steamcmdlibtier0_smd5=$(md5sum "${HOME}/.steam/steamcmd/linux32/libtier0_s.so" | awk '{print $1;}')
+elif [ -f "${steamcmddir}/linux32/libtier0_s.so" ]; then
+	steamcmdlibtier0_smd5=$(md5sum "${steamcmddir}/linux32/libtier0_s.so" | awk '{print $1;}')
+elif [ -f "${HOME}/.local/share/Steam/steamcmd/linux32/libtier0_s.so" ]; then
+	steamcmdlibtier0_smd5=$(md5sum "${HOME}/.local/share/Steam/steamcmd/linux32/libtier0_s.so" | awk '{print $1;}')
+fi
+
+# get md5sum of libvstdlib_s.so from steamcmd
+if [ -f "${HOME}/.steam/steamcmd/linux32/libvstdlib_s.so" ]; then
+	steamcmdlibvstdlib_smd5=$(md5sum "${HOME}/.steam/steamcmd/linux32/libvstdlib_s.so" | awk '{print $1;}')
+elif [ -f "${steamcmddir}/linux32/libvstdlib_s.so" ]; then
+	steamcmdlibvstdlib_smd5=$(md5sum "${steamcmddir}/linux32/libvstdlib_s.so" | awk '{print $1;}')
+elif [ -f "${HOME}/.local/share/Steam/steamcmd/linux32/libvstdlib_s.so" ]; then
+	steamcmdlibvstdlib_smd5=$(md5sum "${HOME}/.local/share/Steam/steamcmd/linux32/libvstdlib_s.so" | awk '{print $1;}')
+fi
+
+if [ ! -f "${serverfiles}/system/steamclient.so" ] || [ "${steamcmdsteamclientmd5}" != "${steamclientmd5}" ]; then
+	fixname="steamclient.so x86"
+	fn_fix_msg_start
+	if [ -f "${HOME}/.steam/steamcmd/linux32/steamclient.so" ]; then
+		cp "${HOME}/.steam/steamcmd/linux32/steamclient.so" "${serverfiles}/system/steamclient.so"
+	elif [ -f "${steamcmddir}/linux32/steamclient.so" ]; then
+		cp "${steamcmddir}/linux32/steamclient.so" "${serverfiles}/system/steamclient.so"
+	elif [ -f "${HOME}/.local/share/Steam/steamcmd/linux32/steamclient.so" ]; then
+		cp "${HOME}/.local/share/Steam/steamcmd/linux32/steamclient.so" "${serverfiles}/system/steamclient.so"
+	fi
+	fn_fix_msg_end
+fi
+
+if [ ! -f "${serverfiles}/system/libtier0_s.so" ] || [ "${steamcmdlibtier0_smd5}" != "${libtier0_smd5}" ]; then
+	fixname="libtier0_s.so"
+	fn_fix_msg_start
+	if [ -f "${HOME}/.steam/steamcmd/linux32/libtier0_s.so" ]; then
+		cp "${HOME}/.steam/steamcmd/linux32/libtier0_s.so" "${serverfiles}/system/libtier0_s.so"
+	elif [ -f "${steamcmddir}/linux32/libtier0_s.so" ]; then
+		cp "${steamcmddir}/linux32/libtier0_s.so" "${serverfiles}/system/libtier0_s.so"
+	elif [ -f "${HOME}/.local/share/Steam/steamcmd/linux32/libtier0_s.so" ]; then
+		cp "${HOME}/.local/share/Steam/steamcmd/linux32/libtier0_s.so" "${serverfiles}/system/libtier0_s.so"
+	fi
+	fn_fix_msg_end
+fi
+
+if [ ! -f "${serverfiles}/system/libvstdlib_s.so" ] || [ "${steamcmdlibvstdlib_smd5}" != "${libvstdlib_smd5}" ]; then
+	fixname="libvstdlib_s.so"
+	fn_fix_msg_start
+	if [ -f "${HOME}/.steam/steamcmd/linux32/libvstdlib_s.so" ]; then
+		cp "${HOME}/.steam/steamcmd/linux32/libvstdlib_s.so" "${serverfiles}/system/libvstdlib_s.so"
+	elif [ -f "${steamcmddir}/linux32/libvstdlib_s.so" ]; then
+		cp "${steamcmddir}/linux32/libvstdlib_s.so" "${serverfiles}/system/libvstdlib_s.so"
+	elif [ -f "${HOME}/.local/share/Steam/steamcmd/linux32/libvstdlib_s.so" ]; then
+		cp "${HOME}/.local/share/Steam/steamcmd/linux32/libvstdlib_s.so" "${serverfiles}/system/libvstdlib_s.so"
+	fi
+	fn_fix_msg_end
+fi
+
+# if running install command
+if [ "${commandname}" == "INSTALL" ]; then
+	echo -e "applying server name fix."
+	fn_sleep_time
+	echo -e "forcing server restart..."
+	fn_sleep_time
+	exitbypass=1
+	command_start.sh
+	fn_firstcommand_reset
+	fn_sleep_time_5
+	exitbypass=1
+	command_stop.sh
+	fn_firstcommand_reset
+	exitbypass=1
+	command_start.sh
+	fn_firstcommand_reset
+	fn_sleep_time_5
+	exitbypass=1
+	command_stop.sh
+	fn_firstcommand_reset
+fi
diff --git a/lgsm/modules/info_game.sh b/lgsm/modules/info_game.sh
index c5c5e5d7a..e943a9d91 100644
--- a/lgsm/modules/info_game.sh
+++ b/lgsm/modules/info_game.sh
@@ -621,6 +621,7 @@ fn_info_game_pvr() {
 fn_info_game_pw() {
 	servername="${servername:-"NOT SET"}"
 	port="${port:-"0"}"
+	queryport="${port:-"0"}"
 	steamport="${steamport:-"0"}"
 	unknownport="1985"
 }
@@ -1242,6 +1243,7 @@ fn_info_game_eco() {
 		fn_info_game_json "httpport" ".WebServerPort"
 		fn_info_game_json "maxplayers" ".MaxConnections"
 		fn_info_game_json "port" ".GameServerPort"
+		fn_info_game_json "rconport" ".RconServerPort"
 		fn_info_game_json "servername" ".Description"
 		fn_info_game_json "serverpassword" ".Password"
 		fn_info_game_json "tickrate" ".Rate"
@@ -1250,6 +1252,8 @@ fn_info_game_eco() {
 	httpport="${httpport:-"0"}"
 	maxplayers="${maxplayers:-"0"}"
 	port="${port:-"0"}"
+	queryport="${port:-"0"}"
+	rconport="${rconport:-"0"}"
 	servername="${servername:-"NOT SET"}"
 	serverpassword="${serverpassword:-"NOT SET"}"
 	tickrate="${tickrate:-"0"}"
diff --git a/lgsm/modules/info_messages.sh b/lgsm/modules/info_messages.sh
index f619c964e..c5d03919c 100644
--- a/lgsm/modules/info_messages.sh
+++ b/lgsm/modules/info_messages.sh
@@ -692,6 +692,8 @@ fn_info_messages_ports() {
 		portcommand="ss -tuplwn | grep AvorionServer"
 	elif [ "${shortname}" == "bf1942" ]; then
 		portcommand="ss -tuplwn | grep bf1942_lnxded"
+	elif [ "${shortname}" == "bfv" ]; then
+		portcommand="ss -tuplwn | grep bfv_linded"
 	elif [ "${shortname}" == "dayz" ]; then
 		portcommand="ss -tuplwn | grep enfMain"
 	elif [ "${shortname}" == "q4" ]; then
@@ -1015,7 +1017,9 @@ fn_info_messages_eco() {
 	{
 		fn_port "header"
 		fn_port "Game" port udp
+		fn_port "Query" queryport udp
 		fn_port "Web Interface" httpport tcp
+		fn_port "RCON" rconport tcp
 	} | column -s $'\t' -t
 }
 
diff --git a/lgsm/modules/query_gamedig.sh b/lgsm/modules/query_gamedig.sh
index 28f70a3b7..efac18d45 100644
--- a/lgsm/modules/query_gamedig.sh
+++ b/lgsm/modules/query_gamedig.sh
@@ -10,7 +10,14 @@ moduleselfname="$(basename "$(readlink -f "${BASH_SOURCE[0]}")")"
 # Default query status to failure. Will be changed to 0 if query is successful.
 querystatus="2"
 # Check if gamedig and jq are installed.
-if [ "$(command -v gamedig 2> /dev/null)" ] && [ "$(command -v jq 2> /dev/null)" ]; then
+
+if [ -f "${lgsmdir}/node_modules/gamedig/bin/gamedig.js" ]; then
+	gamedigbinary="${lgsmdir}/node_modules/gamedig/bin/gamedig.js"
+else
+	gamedigbinary="gamedig"
+fi
+
+if [ "$(command -v "${gamedigbinary}" 2> /dev/null)" ] && [ "$(command -v jq 2> /dev/null)" ]; then
 
 	# will bypass query if server offline.
 	check_status.sh
@@ -20,8 +27,8 @@ if [ "$(command -v gamedig 2> /dev/null)" ] && [ "$(command -v jq 2> /dev/null)"
 			queryport="${port}"
 		fi
 		# checks if query is working null = pass.
-		gamedigcmd=$(echo -e "gamedig --type \"${querytype}\" \"${queryip}:${queryport}\"|jq")
-		gamedigraw=$(gamedig --type "${querytype}" "${queryip}:${queryport}")
+		gamedigcmd=$(echo -e "${gamedigbinary} --type \"${querytype}\" \"${queryip}:${queryport}\"|jq")
+		gamedigraw=$(${gamedigbinary} --type "${querytype}" "${queryip}:${queryport}")
 		querystatus=$(echo "${gamedigraw}" | jq '.error|length')
 
 		if [ "${querytype}" == "teamspeak3" ]; then
diff --git a/lgsm/modules/query_gsquery.py b/lgsm/modules/query_gsquery.py
index 8da93ada4..788789f0a 100644
--- a/lgsm/modules/query_gsquery.py
+++ b/lgsm/modules/query_gsquery.py
@@ -10,23 +10,26 @@ import argparse
 import socket
 import sys
 
-engine_types=('protocol-valve','protocol-quake2','protocol-quake3','protocol-gamespy1','protocol-unreal2','ut3','minecraft','minecraftbe','jc2mp','mumbleping','soldat','teeworlds')
+engine_types = ('protocol-valve', 'protocol-quake2', 'protocol-quake3', 'protocol-gamespy1',
+                'protocol-unreal2', 'ut3', 'minecraft', 'minecraftbe', 'jc2m', 'mumbleping', 'soldat', 'teeworlds')
+
 
 class gsquery:
     server_response_timeout = 2
     default_buffer_length = 1024
-    sourcequery=('protocol-valve','avalanche3.0','barotrauma','madness','quakelive','realvirtuality','refractor','source','goldsrc','spark','starbound','unity3d','unreal4','wurm')
-    idtech2query=('protocol-quake2','idtech2','quake','iw2.0')
-    idtech3query=('protocol-quake3','iw3.0','ioquake3','qfusion')
-    minecraftquery=('minecraft','lwjgl2')
-    minecraftbequery=('minecraftbe',)
-    jc2mpquery=('jc2mp',)
-    mumblequery=('mumbleping',)
-    soldatquery=('soldat',)
-    twquery=('teeworlds',)
-    unrealquery=('protocol-gamespy1','unreal')
-    unreal2query=('protocol-unreal2','unreal2')
-    unreal3query=('ut3','unreal3')
+    sourcequery = ('protocol-valve', 'avalanche3.0', 'barotrauma', 'madness', 'quakelive', 'realvirtuality',
+                   'refractor', 'source', 'goldsrc', 'spark', 'starbound', 'unity3d', 'unreal4', 'wurm')
+    idtech2query = ('protocol-quake2', 'idtech2', 'quake', 'iw2.0')
+    idtech3query = ('protocol-quake3', 'iw3.0', 'ioquake3', 'qfusion')
+    minecraftquery = ('minecraft', 'lwjgl2')
+    minecraftbequery = ('minecraftbe',)
+    jc2mquery = ('jc2m',)
+    mumblequery = ('mumbleping',)
+    soldatquery = ('soldat',)
+    twquery = ('teeworlds',)
+    unrealquery = ('protocol-gamespy1', 'unreal')
+    unreal2query = ('protocol-unreal2', 'unreal2')
+    unreal3query = ('ut3', 'unreal3')
 
     def __init__(self, arguments):
         self.argument = arguments
@@ -37,7 +40,7 @@ class gsquery:
             self.query_prompt_string = b'\xff\xff\xff\xffstatus\x00'
         elif self.argument.engine in self.idtech3query:
             self.query_prompt_string = b'\xff\xff\xff\xffgetstatus'
-        elif self.argument.engine in self.jc2mpquery:
+        elif self.argument.engine in self.jc2mquery:
             self.query_prompt_string = b'\xFE\xFD\x09\x10\x20\x30\x40'
         elif self.argument.engine in self.minecraftquery:
             self.query_prompt_string = b'\xFE\xFD\x09\x3d\x54\x1f\x93'
@@ -48,7 +51,8 @@ class gsquery:
         elif self.argument.engine in self.soldatquery:
             self.query_prompt_string = b'\x69\x00'
         elif self.argument.engine in self.twquery:
-            self.query_prompt_string = b'\x04\x00\x00\xff\xff\xff\xff\x05' + bytearray(511)
+            self.query_prompt_string = b'\x04\x00\x00\xff\xff\xff\xff\x05' + \
+                bytearray(511)
         elif self.argument.engine in self.unrealquery:
             self.query_prompt_string = b'\x5C\x69\x6E\x66\x6F\x5C'
         elif self.argument.engine in self.unreal2query:
@@ -74,7 +78,8 @@ class gsquery:
         connection = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
         connection.settimeout(self.server_response_timeout)
         try:
-            self.connected = connection.connect((self.argument.address, int(self.argument.port)))
+            self.connected = connection.connect(
+                (self.argument.address, int(self.argument.port)))
         except socket.timeout:
             self.fatal_error('Request timed out', 1)
         except Exception:
@@ -95,6 +100,7 @@ class gsquery:
         else:
             self.exit_success(str(self.response))
 
+
 def parse_args():
     parser = argparse.ArgumentParser(
         description='Allows querying of various game servers.',
@@ -142,10 +148,12 @@ def parse_args():
     )
     return parser.parse_args()
 
+
 def main():
     arguments = parse_args()
     server = gsquery(arguments)
     server.responding()
 
+
 if __name__ == '__main__':
     main()
diff --git a/package-lock.json b/package-lock.json
index 669e4f59d..076a14533 100644
--- a/package-lock.json
+++ b/package-lock.json
@@ -6,17 +6,503 @@
     "": {
       "name": "linuxgsm",
       "license": "MIT",
+      "dependencies": {
+        "gamedig": "^5.0.0-beta.2"
+      },
       "devDependencies": {
         "prettier": "^3.0.3",
         "prettier-plugin-sh": "^0.13.1"
       }
     },
+    "node_modules/@sindresorhus/is": {
+      "version": "5.6.0",
+      "resolved": "https://registry.npmjs.org/@sindresorhus/is/-/is-5.6.0.tgz",
+      "integrity": "sha512-TV7t8GKYaJWsn00tFDqBw8+Uqmr8A0fRU1tvTQhyZzGv0sJCGRQL3JGMI3ucuKo3XIZdUP+Lx7/gh2t3lewy7g==",
+      "engines": {
+        "node": ">=14.16"
+      },
+      "funding": {
+        "url": "https://github.com/sindresorhus/is?sponsor=1"
+      }
+    },
+    "node_modules/@szmarczak/http-timer": {
+      "version": "5.0.1",
+      "resolved": "https://registry.npmjs.org/@szmarczak/http-timer/-/http-timer-5.0.1.tgz",
+      "integrity": "sha512-+PmQX0PiAYPMeVYe237LJAYvOMYW1j2rH5YROyS3b4CTVJum34HfRvKvAzozHAQG0TnHNdUfY9nCeUyRAs//cw==",
+      "dependencies": {
+        "defer-to-connect": "^2.0.1"
+      },
+      "engines": {
+        "node": ">=14.16"
+      }
+    },
+    "node_modules/@types/http-cache-semantics": {
+      "version": "4.0.4",
+      "resolved": "https://registry.npmjs.org/@types/http-cache-semantics/-/http-cache-semantics-4.0.4.tgz",
+      "integrity": "sha512-1m0bIFVc7eJWyve9S0RnuRgcQqF/Xd5QsUZAZeQFr1Q3/p9JWoQQEqmVy+DPTNpGXwhgIetAoYF8JSc33q29QA=="
+    },
+    "node_modules/any-promise": {
+      "version": "1.3.0",
+      "resolved": "https://registry.npmjs.org/any-promise/-/any-promise-1.3.0.tgz",
+      "integrity": "sha512-7UvmKalWRt1wgjL1RrGxoSJW/0QZFIegpeGvZG9kjp8vrRu55XTHbwnqq2GpXm9uLbcuhxm3IqX9OB4MZR1b2A=="
+    },
+    "node_modules/barse": {
+      "version": "0.4.3",
+      "resolved": "https://registry.npmjs.org/barse/-/barse-0.4.3.tgz",
+      "integrity": "sha512-UEpvriJqAn8zuVinYICuKoPttZy3XxXEoqX/V2uYAL4zzJRuNzCK3+20nAu3YUIa2U7G53kf90wfBIp9/A+Odw==",
+      "dependencies": {
+        "readable-stream": "~1.0.2"
+      }
+    },
+    "node_modules/boolbase": {
+      "version": "1.0.0",
+      "resolved": "https://registry.npmjs.org/boolbase/-/boolbase-1.0.0.tgz",
+      "integrity": "sha512-JZOSA7Mo9sNGB8+UjSgzdLtokWAky1zbztM3WRLCbZ70/3cTANmQmOdR7y2g+J0e2WXywy1yS468tY+IruqEww=="
+    },
+    "node_modules/cacheable-lookup": {
+      "version": "7.0.0",
+      "resolved": "https://registry.npmjs.org/cacheable-lookup/-/cacheable-lookup-7.0.0.tgz",
+      "integrity": "sha512-+qJyx4xiKra8mZrcwhjMRMUhD5NR1R8esPkzIYxX96JiecFoxAXFuz/GpR3+ev4PE1WamHip78wV0vcmPQtp8w==",
+      "engines": {
+        "node": ">=14.16"
+      }
+    },
+    "node_modules/cacheable-request": {
+      "version": "10.2.14",
+      "resolved": "https://registry.npmjs.org/cacheable-request/-/cacheable-request-10.2.14.tgz",
+      "integrity": "sha512-zkDT5WAF4hSSoUgyfg5tFIxz8XQK+25W/TLVojJTMKBaxevLBBtLxgqguAuVQB8PVW79FVjHcU+GJ9tVbDZ9mQ==",
+      "dependencies": {
+        "@types/http-cache-semantics": "^4.0.2",
+        "get-stream": "^6.0.1",
+        "http-cache-semantics": "^4.1.1",
+        "keyv": "^4.5.3",
+        "mimic-response": "^4.0.0",
+        "normalize-url": "^8.0.0",
+        "responselike": "^3.0.0"
+      },
+      "engines": {
+        "node": ">=14.16"
+      }
+    },
+    "node_modules/cheerio": {
+      "version": "1.0.0-rc.12",
+      "resolved": "https://registry.npmjs.org/cheerio/-/cheerio-1.0.0-rc.12.tgz",
+      "integrity": "sha512-VqR8m68vM46BNnuZ5NtnGBKIE/DfN0cRIzg9n40EIq9NOv90ayxLBXA8fXC5gquFRGJSTRqBq25Jt2ECLR431Q==",
+      "dependencies": {
+        "cheerio-select": "^2.1.0",
+        "dom-serializer": "^2.0.0",
+        "domhandler": "^5.0.3",
+        "domutils": "^3.0.1",
+        "htmlparser2": "^8.0.1",
+        "parse5": "^7.0.0",
+        "parse5-htmlparser2-tree-adapter": "^7.0.0"
+      },
+      "engines": {
+        "node": ">= 6"
+      },
+      "funding": {
+        "url": "https://github.com/cheeriojs/cheerio?sponsor=1"
+      }
+    },
+    "node_modules/cheerio-select": {
+      "version": "2.1.0",
+      "resolved": "https://registry.npmjs.org/cheerio-select/-/cheerio-select-2.1.0.tgz",
+      "integrity": "sha512-9v9kG0LvzrlcungtnJtpGNxY+fzECQKhK4EGJX2vByejiMX84MFNQw4UxPJl3bFbTMw+Dfs37XaIkCwTZfLh4g==",
+      "dependencies": {
+        "boolbase": "^1.0.0",
+        "css-select": "^5.1.0",
+        "css-what": "^6.1.0",
+        "domelementtype": "^2.3.0",
+        "domhandler": "^5.0.3",
+        "domutils": "^3.0.1"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/fb55"
+      }
+    },
+    "node_modules/commander": {
+      "version": "6.2.1",
+      "resolved": "https://registry.npmjs.org/commander/-/commander-6.2.1.tgz",
+      "integrity": "sha512-U7VdrJFnJgo4xjrHpTzu0yrHPGImdsmD95ZlgYSEajAn2JKzDhDTPG9kBTefmObL2w/ngeZnilk+OV9CG3d7UA==",
+      "engines": {
+        "node": ">= 6"
+      }
+    },
+    "node_modules/core-util-is": {
+      "version": "1.0.3",
+      "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.3.tgz",
+      "integrity": "sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ=="
+    },
+    "node_modules/css-select": {
+      "version": "5.1.0",
+      "resolved": "https://registry.npmjs.org/css-select/-/css-select-5.1.0.tgz",
+      "integrity": "sha512-nwoRF1rvRRnnCqqY7updORDsuqKzqYJ28+oSMaJMMgOauh3fvwHqMS7EZpIPqK8GL+g9mKxF1vP/ZjSeNjEVHg==",
+      "dependencies": {
+        "boolbase": "^1.0.0",
+        "css-what": "^6.1.0",
+        "domhandler": "^5.0.2",
+        "domutils": "^3.0.1",
+        "nth-check": "^2.0.1"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/fb55"
+      }
+    },
+    "node_modules/css-what": {
+      "version": "6.1.0",
+      "resolved": "https://registry.npmjs.org/css-what/-/css-what-6.1.0.tgz",
+      "integrity": "sha512-HTUrgRJ7r4dsZKU6GjmpfRK1O76h97Z8MfS1G0FozR+oF2kG6Vfe8JE6zwrkbxigziPHinCJ+gCPjA9EaBDtRw==",
+      "engines": {
+        "node": ">= 6"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/fb55"
+      }
+    },
+    "node_modules/decompress-response": {
+      "version": "6.0.0",
+      "resolved": "https://registry.npmjs.org/decompress-response/-/decompress-response-6.0.0.tgz",
+      "integrity": "sha512-aW35yZM6Bb/4oJlZncMH2LCoZtJXTRxES17vE3hoRiowU2kWHaJKFkSBDnDR+cm9J+9QhXmREyIfv0pji9ejCQ==",
+      "dependencies": {
+        "mimic-response": "^3.1.0"
+      },
+      "engines": {
+        "node": ">=10"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/sindresorhus"
+      }
+    },
+    "node_modules/decompress-response/node_modules/mimic-response": {
+      "version": "3.1.0",
+      "resolved": "https://registry.npmjs.org/mimic-response/-/mimic-response-3.1.0.tgz",
+      "integrity": "sha512-z0yWI+4FDrrweS8Zmt4Ej5HdJmky15+L2e6Wgn3+iK5fWzb6T3fhNFq2+MeTRb064c6Wr4N/wv0DzQTjNzHNGQ==",
+      "engines": {
+        "node": ">=10"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/sindresorhus"
+      }
+    },
+    "node_modules/defer-to-connect": {
+      "version": "2.0.1",
+      "resolved": "https://registry.npmjs.org/defer-to-connect/-/defer-to-connect-2.0.1.tgz",
+      "integrity": "sha512-4tvttepXG1VaYGrRibk5EwJd1t4udunSOVMdLSAL6mId1ix438oPwPZMALY41FCijukO1L0twNcGsdzS7dHgDg==",
+      "engines": {
+        "node": ">=10"
+      }
+    },
+    "node_modules/dom-serializer": {
+      "version": "2.0.0",
+      "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-2.0.0.tgz",
+      "integrity": "sha512-wIkAryiqt/nV5EQKqQpo3SToSOV9J0DnbJqwK7Wv/Trc92zIAYZ4FlMu+JPFW1DfGFt81ZTCGgDEabffXeLyJg==",
+      "dependencies": {
+        "domelementtype": "^2.3.0",
+        "domhandler": "^5.0.2",
+        "entities": "^4.2.0"
+      },
+      "funding": {
+        "url": "https://github.com/cheeriojs/dom-serializer?sponsor=1"
+      }
+    },
+    "node_modules/domelementtype": {
+      "version": "2.3.0",
+      "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-2.3.0.tgz",
+      "integrity": "sha512-OLETBj6w0OsagBwdXnPdN0cnMfF9opN69co+7ZrbfPGrdpPVNBUj02spi6B1N7wChLQiPn4CSH/zJvXw56gmHw==",
+      "funding": [
+        {
+          "type": "github",
+          "url": "https://github.com/sponsors/fb55"
+        }
+      ]
+    },
+    "node_modules/domhandler": {
+      "version": "5.0.3",
+      "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-5.0.3.tgz",
+      "integrity": "sha512-cgwlv/1iFQiFnU96XXgROh8xTeetsnJiDsTc7TYCLFd9+/WNkIqPTxiM/8pSd8VIrhXGTf1Ny1q1hquVqDJB5w==",
+      "dependencies": {
+        "domelementtype": "^2.3.0"
+      },
+      "engines": {
+        "node": ">= 4"
+      },
+      "funding": {
+        "url": "https://github.com/fb55/domhandler?sponsor=1"
+      }
+    },
+    "node_modules/domutils": {
+      "version": "3.1.0",
+      "resolved": "https://registry.npmjs.org/domutils/-/domutils-3.1.0.tgz",
+      "integrity": "sha512-H78uMmQtI2AhgDJjWeQmHwJJ2bLPD3GMmO7Zja/ZZh84wkm+4ut+IUnUdRa8uCGX88DiVx1j6FRe1XfxEgjEZA==",
+      "dependencies": {
+        "dom-serializer": "^2.0.0",
+        "domelementtype": "^2.3.0",
+        "domhandler": "^5.0.3"
+      },
+      "funding": {
+        "url": "https://github.com/fb55/domutils?sponsor=1"
+      }
+    },
+    "node_modules/entities": {
+      "version": "4.5.0",
+      "resolved": "https://registry.npmjs.org/entities/-/entities-4.5.0.tgz",
+      "integrity": "sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==",
+      "engines": {
+        "node": ">=0.12"
+      },
+      "funding": {
+        "url": "https://github.com/fb55/entities?sponsor=1"
+      }
+    },
+    "node_modules/event-to-promise": {
+      "version": "0.7.0",
+      "resolved": "https://registry.npmjs.org/event-to-promise/-/event-to-promise-0.7.0.tgz",
+      "integrity": "sha512-VOBBfyaADfe378ZzG0tgkzmsvzUyeU5arehrFzNRt5yaASUDshgctTwSrPI17ocAwR3+YftsxRClHF+GBKFByQ==",
+      "deprecated": "Use promise-toolbox/fromEvent instead"
+    },
+    "node_modules/form-data-encoder": {
+      "version": "2.1.4",
+      "resolved": "https://registry.npmjs.org/form-data-encoder/-/form-data-encoder-2.1.4.tgz",
+      "integrity": "sha512-yDYSgNMraqvnxiEXO4hi88+YZxaHC6QKzb5N84iRCTDeRO7ZALpir/lVmf/uXUhnwUr2O4HU8s/n6x+yNjQkHw==",
+      "engines": {
+        "node": ">= 14.17"
+      }
+    },
+    "node_modules/gamedig": {
+      "version": "5.0.0-beta.2",
+      "resolved": "https://registry.npmjs.org/gamedig/-/gamedig-5.0.0-beta.2.tgz",
+      "integrity": "sha512-YsHoGdb6rXyzdErakd9eSJvUAZCa8Hy+nQpiWZMps158wOovsH35Yrr/Y9wCvn1FDm6NJnHhQYkvtk3zhlmKWQ==",
+      "dependencies": {
+        "cheerio": "^1.0.0-rc.12",
+        "gbxremote": "^0.2.1",
+        "got": "^13.0.0",
+        "iconv-lite": "^0.6.3",
+        "long": "^5.2.3",
+        "minimist": "^1.2.8",
+        "punycode": "^2.3.0",
+        "seek-bzip": "^2.0.0",
+        "varint": "^6.0.0"
+      },
+      "bin": {
+        "gamedig": "bin/gamedig.js"
+      },
+      "engines": {
+        "node": ">=16.20.0"
+      }
+    },
+    "node_modules/gbxremote": {
+      "version": "0.2.1",
+      "resolved": "https://registry.npmjs.org/gbxremote/-/gbxremote-0.2.1.tgz",
+      "integrity": "sha512-SMehu6Y6ndq2Qgp9VxAb8Np3f+UUD+RWoW2SAMaxzGS96rWXyr4T1GGkecO0HHtxeH1m7pEh4FJWB8a/6aM2XQ==",
+      "dependencies": {
+        "any-promise": "^1.1.0",
+        "barse": "~0.4.2",
+        "event-to-promise": "^0.7.0",
+        "string-to-stream": "^1.0.1",
+        "xmlrpc": "^1.3.1"
+      },
+      "engines": {
+        "node": ">=0.10"
+      }
+    },
+    "node_modules/get-stream": {
+      "version": "6.0.1",
+      "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-6.0.1.tgz",
+      "integrity": "sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==",
+      "engines": {
+        "node": ">=10"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/sindresorhus"
+      }
+    },
+    "node_modules/got": {
+      "version": "13.0.0",
+      "resolved": "https://registry.npmjs.org/got/-/got-13.0.0.tgz",
+      "integrity": "sha512-XfBk1CxOOScDcMr9O1yKkNaQyy865NbYs+F7dr4H0LZMVgCj2Le59k6PqbNHoL5ToeaEQUYh6c6yMfVcc6SJxA==",
+      "dependencies": {
+        "@sindresorhus/is": "^5.2.0",
+        "@szmarczak/http-timer": "^5.0.1",
+        "cacheable-lookup": "^7.0.0",
+        "cacheable-request": "^10.2.8",
+        "decompress-response": "^6.0.0",
+        "form-data-encoder": "^2.1.2",
+        "get-stream": "^6.0.1",
+        "http2-wrapper": "^2.1.10",
+        "lowercase-keys": "^3.0.0",
+        "p-cancelable": "^3.0.0",
+        "responselike": "^3.0.0"
+      },
+      "engines": {
+        "node": ">=16"
+      },
+      "funding": {
+        "url": "https://github.com/sindresorhus/got?sponsor=1"
+      }
+    },
+    "node_modules/htmlparser2": {
+      "version": "8.0.2",
+      "resolved": "https://registry.npmjs.org/htmlparser2/-/htmlparser2-8.0.2.tgz",
+      "integrity": "sha512-GYdjWKDkbRLkZ5geuHs5NY1puJ+PXwP7+fHPRz06Eirsb9ugf6d8kkXav6ADhcODhFFPMIXyxkxSuMf3D6NCFA==",
+      "funding": [
+        "https://github.com/fb55/htmlparser2?sponsor=1",
+        {
+          "type": "github",
+          "url": "https://github.com/sponsors/fb55"
+        }
+      ],
+      "dependencies": {
+        "domelementtype": "^2.3.0",
+        "domhandler": "^5.0.3",
+        "domutils": "^3.0.1",
+        "entities": "^4.4.0"
+      }
+    },
+    "node_modules/http-cache-semantics": {
+      "version": "4.1.1",
+      "resolved": "https://registry.npmjs.org/http-cache-semantics/-/http-cache-semantics-4.1.1.tgz",
+      "integrity": "sha512-er295DKPVsV82j5kw1Gjt+ADA/XYHsajl82cGNQG2eyoPkvgUhX+nDIyelzhIWbbsXP39EHcI6l5tYs2FYqYXQ=="
+    },
+    "node_modules/http2-wrapper": {
+      "version": "2.2.1",
+      "resolved": "https://registry.npmjs.org/http2-wrapper/-/http2-wrapper-2.2.1.tgz",
+      "integrity": "sha512-V5nVw1PAOgfI3Lmeaj2Exmeg7fenjhRUgz1lPSezy1CuhPYbgQtbQj4jZfEAEMlaL+vupsvhjqCyjzob0yxsmQ==",
+      "dependencies": {
+        "quick-lru": "^5.1.1",
+        "resolve-alpn": "^1.2.0"
+      },
+      "engines": {
+        "node": ">=10.19.0"
+      }
+    },
+    "node_modules/iconv-lite": {
+      "version": "0.6.3",
+      "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.6.3.tgz",
+      "integrity": "sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==",
+      "dependencies": {
+        "safer-buffer": ">= 2.1.2 < 3.0.0"
+      },
+      "engines": {
+        "node": ">=0.10.0"
+      }
+    },
+    "node_modules/inherits": {
+      "version": "2.0.4",
+      "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz",
+      "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ=="
+    },
+    "node_modules/isarray": {
+      "version": "0.0.1",
+      "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz",
+      "integrity": "sha512-D2S+3GLxWH+uhrNEcoh/fnmYeP8E8/zHl644d/jdA0g2uyXvy3sb0qxotE+ne0LtccHknQzWwZEzhak7oJ0COQ=="
+    },
+    "node_modules/json-buffer": {
+      "version": "3.0.1",
+      "resolved": "https://registry.npmjs.org/json-buffer/-/json-buffer-3.0.1.tgz",
+      "integrity": "sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ=="
+    },
+    "node_modules/keyv": {
+      "version": "4.5.4",
+      "resolved": "https://registry.npmjs.org/keyv/-/keyv-4.5.4.tgz",
+      "integrity": "sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw==",
+      "dependencies": {
+        "json-buffer": "3.0.1"
+      }
+    },
+    "node_modules/long": {
+      "version": "5.2.3",
+      "resolved": "https://registry.npmjs.org/long/-/long-5.2.3.tgz",
+      "integrity": "sha512-lcHwpNoggQTObv5apGNCTdJrO69eHOZMi4BNC+rTLER8iHAqGrUVeLh/irVIM7zTw2bOXA8T6uNPeujwOLg/2Q=="
+    },
+    "node_modules/lowercase-keys": {
+      "version": "3.0.0",
+      "resolved": "https://registry.npmjs.org/lowercase-keys/-/lowercase-keys-3.0.0.tgz",
+      "integrity": "sha512-ozCC6gdQ+glXOQsveKD0YsDy8DSQFjDTz4zyzEHNV5+JP5D62LmfDZ6o1cycFx9ouG940M5dE8C8CTewdj2YWQ==",
+      "engines": {
+        "node": "^12.20.0 || ^14.13.1 || >=16.0.0"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/sindresorhus"
+      }
+    },
+    "node_modules/mimic-response": {
+      "version": "4.0.0",
+      "resolved": "https://registry.npmjs.org/mimic-response/-/mimic-response-4.0.0.tgz",
+      "integrity": "sha512-e5ISH9xMYU0DzrT+jl8q2ze9D6eWBto+I8CNpe+VI+K2J/F/k3PdkdTdz4wvGVH4NTpo+NRYTVIuMQEMMcsLqg==",
+      "engines": {
+        "node": "^12.20.0 || ^14.13.1 || >=16.0.0"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/sindresorhus"
+      }
+    },
+    "node_modules/minimist": {
+      "version": "1.2.8",
+      "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.8.tgz",
+      "integrity": "sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==",
+      "funding": {
+        "url": "https://github.com/sponsors/ljharb"
+      }
+    },
     "node_modules/mvdan-sh": {
       "version": "0.10.1",
       "resolved": "https://registry.npmjs.org/mvdan-sh/-/mvdan-sh-0.10.1.tgz",
       "integrity": "sha512-kMbrH0EObaKmK3nVRKUIIya1dpASHIEusM13S4V1ViHFuxuNxCo+arxoa6j/dbV22YBGjl7UKJm9QQKJ2Crzhg==",
       "dev": true
     },
+    "node_modules/normalize-url": {
+      "version": "8.0.0",
+      "resolved": "https://registry.npmjs.org/normalize-url/-/normalize-url-8.0.0.tgz",
+      "integrity": "sha512-uVFpKhj5MheNBJRTiMZ9pE/7hD1QTeEvugSJW/OmLzAp78PB5O6adfMNTvmfKhXBkvCzC+rqifWcVYpGFwTjnw==",
+      "engines": {
+        "node": ">=14.16"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/sindresorhus"
+      }
+    },
+    "node_modules/nth-check": {
+      "version": "2.1.1",
+      "resolved": "https://registry.npmjs.org/nth-check/-/nth-check-2.1.1.tgz",
+      "integrity": "sha512-lqjrjmaOoAnWfMmBPL+XNnynZh2+swxiX3WUE0s4yEHI6m+AwrK2UZOimIRl3X/4QctVqS8AiZjFqyOGrMXb/w==",
+      "dependencies": {
+        "boolbase": "^1.0.0"
+      },
+      "funding": {
+        "url": "https://github.com/fb55/nth-check?sponsor=1"
+      }
+    },
+    "node_modules/p-cancelable": {
+      "version": "3.0.0",
+      "resolved": "https://registry.npmjs.org/p-cancelable/-/p-cancelable-3.0.0.tgz",
+      "integrity": "sha512-mlVgR3PGuzlo0MmTdk4cXqXWlwQDLnONTAg6sm62XkMJEiRxN3GL3SffkYvqwonbkJBcrI7Uvv5Zh9yjvn2iUw==",
+      "engines": {
+        "node": ">=12.20"
+      }
+    },
+    "node_modules/parse5": {
+      "version": "7.1.2",
+      "resolved": "https://registry.npmjs.org/parse5/-/parse5-7.1.2.tgz",
+      "integrity": "sha512-Czj1WaSVpaoj0wbhMzLmWD69anp2WH7FXMB9n1Sy8/ZFF9jolSQVMu1Ij5WIyGmcBmhk7EOndpO4mIpihVqAXw==",
+      "dependencies": {
+        "entities": "^4.4.0"
+      },
+      "funding": {
+        "url": "https://github.com/inikulin/parse5?sponsor=1"
+      }
+    },
+    "node_modules/parse5-htmlparser2-tree-adapter": {
+      "version": "7.0.0",
+      "resolved": "https://registry.npmjs.org/parse5-htmlparser2-tree-adapter/-/parse5-htmlparser2-tree-adapter-7.0.0.tgz",
+      "integrity": "sha512-B77tOZrqqfUfnVcOrUvfdLbz4pu4RopLD/4vmu3HUPswwTA8OH0EMW9BlWR2B0RCoiZRAHEUu7IxeP1Pd1UU+g==",
+      "dependencies": {
+        "domhandler": "^5.0.2",
+        "parse5": "^7.0.0"
+      },
+      "funding": {
+        "url": "https://github.com/inikulin/parse5?sponsor=1"
+      }
+    },
     "node_modules/prettier": {
       "version": "3.0.3",
       "resolved": "https://registry.npmjs.org/prettier/-/prettier-3.0.3.tgz",
@@ -51,6 +537,87 @@
         "prettier": "^3.0.0"
       }
     },
+    "node_modules/process-nextick-args": {
+      "version": "2.0.1",
+      "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz",
+      "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag=="
+    },
+    "node_modules/punycode": {
+      "version": "2.3.1",
+      "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.1.tgz",
+      "integrity": "sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==",
+      "engines": {
+        "node": ">=6"
+      }
+    },
+    "node_modules/quick-lru": {
+      "version": "5.1.1",
+      "resolved": "https://registry.npmjs.org/quick-lru/-/quick-lru-5.1.1.tgz",
+      "integrity": "sha512-WuyALRjWPDGtt/wzJiadO5AXY+8hZ80hVpe6MyivgraREW751X3SbhRvG3eLKOYN+8VEvqLcf3wdnt44Z4S4SA==",
+      "engines": {
+        "node": ">=10"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/sindresorhus"
+      }
+    },
+    "node_modules/readable-stream": {
+      "version": "1.0.34",
+      "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.0.34.tgz",
+      "integrity": "sha512-ok1qVCJuRkNmvebYikljxJA/UEsKwLl2nI1OmaqAu4/UE+h0wKCHok4XkL/gvi39OacXvw59RJUOFUkDib2rHg==",
+      "dependencies": {
+        "core-util-is": "~1.0.0",
+        "inherits": "~2.0.1",
+        "isarray": "0.0.1",
+        "string_decoder": "~0.10.x"
+      }
+    },
+    "node_modules/resolve-alpn": {
+      "version": "1.2.1",
+      "resolved": "https://registry.npmjs.org/resolve-alpn/-/resolve-alpn-1.2.1.tgz",
+      "integrity": "sha512-0a1F4l73/ZFZOakJnQ3FvkJ2+gSTQWz/r2KE5OdDY0TxPm5h4GkqkWWfM47T7HsbnOtcJVEF4epCVy6u7Q3K+g=="
+    },
+    "node_modules/responselike": {
+      "version": "3.0.0",
+      "resolved": "https://registry.npmjs.org/responselike/-/responselike-3.0.0.tgz",
+      "integrity": "sha512-40yHxbNcl2+rzXvZuVkrYohathsSJlMTXKryG5y8uciHv1+xDLHQpgjG64JUO9nrEq2jGLH6IZ8BcZyw3wrweg==",
+      "dependencies": {
+        "lowercase-keys": "^3.0.0"
+      },
+      "engines": {
+        "node": ">=14.16"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/sindresorhus"
+      }
+    },
+    "node_modules/safe-buffer": {
+      "version": "5.1.2",
+      "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz",
+      "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g=="
+    },
+    "node_modules/safer-buffer": {
+      "version": "2.1.2",
+      "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz",
+      "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg=="
+    },
+    "node_modules/sax": {
+      "version": "1.2.4",
+      "resolved": "https://registry.npmjs.org/sax/-/sax-1.2.4.tgz",
+      "integrity": "sha512-NqVDv9TpANUjFm0N8uM5GxL36UgKi9/atZw+x7YFnQ8ckwFGKrl4xX4yWtrey3UJm5nP1kUbnYgLopqWNSRhWw=="
+    },
+    "node_modules/seek-bzip": {
+      "version": "2.0.0",
+      "resolved": "https://registry.npmjs.org/seek-bzip/-/seek-bzip-2.0.0.tgz",
+      "integrity": "sha512-SMguiTnYrhpLdk3PwfzHeotrcwi8bNV4iemL9tx9poR/yeaMYwB9VzR1w7b57DuWpuqR8n6oZboi0hj3AxZxQg==",
+      "dependencies": {
+        "commander": "^6.0.0"
+      },
+      "bin": {
+        "seek-bunzip": "bin/seek-bunzip",
+        "seek-table": "bin/seek-bzip-table"
+      }
+    },
     "node_modules/sh-syntax": {
       "version": "0.4.1",
       "resolved": "https://registry.npmjs.org/sh-syntax/-/sh-syntax-0.4.1.tgz",
@@ -66,11 +633,83 @@
         "url": "https://opencollective.com/unts"
       }
     },
+    "node_modules/string_decoder": {
+      "version": "0.10.31",
+      "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz",
+      "integrity": "sha512-ev2QzSzWPYmy9GuqfIVildA4OdcGLeFZQrq5ys6RtiuF+RQQiZWr8TZNyAcuVXyQRYfEO+MsoB/1BuQVhOJuoQ=="
+    },
+    "node_modules/string-to-stream": {
+      "version": "1.1.1",
+      "resolved": "https://registry.npmjs.org/string-to-stream/-/string-to-stream-1.1.1.tgz",
+      "integrity": "sha512-QySF2+3Rwq0SdO3s7BAp4x+c3qsClpPQ6abAmb0DGViiSBAkT5kL6JT2iyzEVP+T1SmzHrQD1TwlP9QAHCc+Sw==",
+      "dependencies": {
+        "inherits": "^2.0.1",
+        "readable-stream": "^2.1.0"
+      }
+    },
+    "node_modules/string-to-stream/node_modules/isarray": {
+      "version": "1.0.0",
+      "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz",
+      "integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ=="
+    },
+    "node_modules/string-to-stream/node_modules/readable-stream": {
+      "version": "2.3.8",
+      "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.8.tgz",
+      "integrity": "sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==",
+      "dependencies": {
+        "core-util-is": "~1.0.0",
+        "inherits": "~2.0.3",
+        "isarray": "~1.0.0",
+        "process-nextick-args": "~2.0.0",
+        "safe-buffer": "~5.1.1",
+        "string_decoder": "~1.1.1",
+        "util-deprecate": "~1.0.1"
+      }
+    },
+    "node_modules/string-to-stream/node_modules/string_decoder": {
+      "version": "1.1.1",
+      "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz",
+      "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==",
+      "dependencies": {
+        "safe-buffer": "~5.1.0"
+      }
+    },
     "node_modules/tslib": {
       "version": "2.6.2",
       "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.2.tgz",
       "integrity": "sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q==",
       "dev": true
+    },
+    "node_modules/util-deprecate": {
+      "version": "1.0.2",
+      "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz",
+      "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw=="
+    },
+    "node_modules/varint": {
+      "version": "6.0.0",
+      "resolved": "https://registry.npmjs.org/varint/-/varint-6.0.0.tgz",
+      "integrity": "sha512-cXEIW6cfr15lFv563k4GuVuW/fiwjknytD37jIOLSdSWuOI6WnO/oKwmP2FQTU2l01LP8/M5TSAJpzUaGe3uWg=="
+    },
+    "node_modules/xmlbuilder": {
+      "version": "8.2.2",
+      "resolved": "https://registry.npmjs.org/xmlbuilder/-/xmlbuilder-8.2.2.tgz",
+      "integrity": "sha512-eKRAFz04jghooy8muekqzo8uCSVNeyRedbuJrp0fovbLIi7wlsYtdUn3vBAAPq2Y3/0xMz2WMEUQ8yhVVO9Stw==",
+      "engines": {
+        "node": ">=4.0"
+      }
+    },
+    "node_modules/xmlrpc": {
+      "version": "1.3.2",
+      "resolved": "https://registry.npmjs.org/xmlrpc/-/xmlrpc-1.3.2.tgz",
+      "integrity": "sha512-jQf5gbrP6wvzN71fgkcPPkF4bF/Wyovd7Xdff8d6/ihxYmgETQYSuTc+Hl+tsh/jmgPLro/Aro48LMFlIyEKKQ==",
+      "dependencies": {
+        "sax": "1.2.x",
+        "xmlbuilder": "8.2.x"
+      },
+      "engines": {
+        "node": ">=0.8",
+        "npm": ">=1.0.0"
+      }
     }
   }
 }
diff --git a/package.json b/package.json
index 89bb70244..d4146ee20 100644
--- a/package.json
+++ b/package.json
@@ -20,5 +20,8 @@
   "bugs": {
     "url": "https://github.com/GameServerManagers/LinuxGSM/issues"
   },
-  "homepage": "https://github.com/GameServerManagers/LinuxGSM#readme"
+  "homepage": "https://github.com/GameServerManagers/LinuxGSM#readme",
+  "dependencies": {
+    "gamedig": "^5.0.0-beta.2"
+  }
 }

From 1f50055f5ac0e0bed0ea01f82f82ef4dca3deec2 Mon Sep 17 00:00:00 2001
From: Daniel Gibbs <me@danielgibbs.co.uk>
Date: Wed, 28 Feb 2024 22:05:42 +0000
Subject: [PATCH 085/154] feat: ignore .swp files when doing permissions check

a .swp file is a temp file created by vim. If a file is being edited by a non linuxgsm user then this could cause a permissions issue. Adding this exception to prevent this issue
---
 lgsm/modules/check_permissions.sh | 4 ++--
 1 file changed, 2 insertions(+), 2 deletions(-)

diff --git a/lgsm/modules/check_permissions.sh b/lgsm/modules/check_permissions.sh
index 572b403cc..31c64cd17 100644
--- a/lgsm/modules/check_permissions.sh
+++ b/lgsm/modules/check_permissions.sh
@@ -14,12 +14,12 @@ fn_check_ownership() {
 		fi
 	fi
 	if [ -d "${modulesdir}" ]; then
-		if [ "$(find "${modulesdir}" -not -user "$(whoami)" | wc -l)" -ne "0" ]; then
+		if [ "$(find "${modulesdir}" -not -name '*.swp' -not -user "$(whoami)" | wc -l)" -ne "0" ]; then
 			funcownissue=1
 		fi
 	fi
 	if [ -d "${serverfiles}" ]; then
-		if [ "$(find "${serverfiles}" -not -user "$(whoami)" | wc -l)" -ne "0" ]; then
+		if [ "$(find "${serverfiles}" -not -name '*.swp' -not -user "$(whoami)" | wc -l)" -ne "0" ]; then
 			filesownissue=1
 		fi
 	fi

From a2406a510c97b639dc20782d352855fbdc86fb12 Mon Sep 17 00:00:00 2001
From: Daniel Gibbs <me@danielgibbs.co.uk>
Date: Wed, 28 Feb 2024 23:15:12 +0000
Subject: [PATCH 086/154] fix(hw): correct start parameter for addadmin

---
 lgsm/config-default/config-lgsm/hwserver/_default.cfg | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/lgsm/config-default/config-lgsm/hwserver/_default.cfg b/lgsm/config-default/config-lgsm/hwserver/_default.cfg
index ea18f00cf..a353064c8 100644
--- a/lgsm/config-default/config-lgsm/hwserver/_default.cfg
+++ b/lgsm/config-default/config-lgsm/hwserver/_default.cfg
@@ -27,7 +27,7 @@ loadsave=""
 
 ## Server Parameters | https://docs.linuxgsm.com/configuration/start-parameters#additional-parameters
 # http://hurtworld.wikia.com/wiki/Hosting_A_Server
-startparameters="-batchmode -nographics -logfile ${gamelog} -exec \"host ${port} ${defaultmap} ${loadsave};queryport ${queryport};maxplayers ${maxplayers};servername ${servername};creativemode ${creativemode};${admins}\""
+startparameters="-batchmode -nographics -logfile ${gamelog} -exec \"host ${port} ${defaultmap} ${loadsave};queryport ${queryport};maxplayers ${maxplayers};servername ${servername};creativemode ${creativemode};addadmin ${admins}\""
 
 #### LinuxGSM Settings ####
 

From c5ca762655b0821adf3a19cacebb6390fabd4ff4 Mon Sep 17 00:00:00 2001
From: MicLieg <38057464+MicLieg@users.noreply.github.com>
Date: Sat, 2 Mar 2024 10:46:11 +0100
Subject: [PATCH 087/154] fix(pw): fix updated start parameters (#4516)

* fix(pw): fix updated  start parameters

* fix(pw): remove unneeded RCON parameters
---
 lgsm/config-default/config-lgsm/pwserver/_default.cfg | 4 ++--
 1 file changed, 2 insertions(+), 2 deletions(-)

diff --git a/lgsm/config-default/config-lgsm/pwserver/_default.cfg b/lgsm/config-default/config-lgsm/pwserver/_default.cfg
index eaf5d775c..03ad83d9e 100644
--- a/lgsm/config-default/config-lgsm/pwserver/_default.cfg
+++ b/lgsm/config-default/config-lgsm/pwserver/_default.cfg
@@ -16,8 +16,8 @@ port="8211"
 steamport="27015"
 
 ## Server Parameters | https://docs.linuxgsm.com/configuration/start-parameters#additional-parameters
-## Game Server Docs | https://tech.palworldgame.com/dedicated-server-guide#linux
-startparameters="EpicApp=PalServer -useperfthreads -NoAsyncLoadingThread -UseMultithreadForDS -servername='${servername}' -port='${port}' -queryport='${steamport}'"
+## Game Server Docs | https://tech.palworldgame.com/settings-and-operation/arguments
+startparameters="-publiclobby -useperfthreads -NoAsyncLoadingThread -UseMultithreadForDS -servername='${servername}' -port='${port}' -queryport='${steamport}'"
 
 #### LinuxGSM Settings ####
 

From cf5c6f9242c8ad882a1f173c04cc094f6c088df9 Mon Sep 17 00:00:00 2001
From: MicLieg <38057464+MicLieg@users.noreply.github.com>
Date: Sat, 2 Mar 2024 10:46:11 +0100
Subject: [PATCH 088/154] fix(pw): fix updated start parameters (#4516)

* fix(pw): fix updated  start parameters

* fix(pw): remove unneeded RCON parameters
---
 lgsm/config-default/config-lgsm/pwserver/_default.cfg | 4 ++--
 1 file changed, 2 insertions(+), 2 deletions(-)

diff --git a/lgsm/config-default/config-lgsm/pwserver/_default.cfg b/lgsm/config-default/config-lgsm/pwserver/_default.cfg
index cd318aacc..a463c4b4d 100644
--- a/lgsm/config-default/config-lgsm/pwserver/_default.cfg
+++ b/lgsm/config-default/config-lgsm/pwserver/_default.cfg
@@ -16,8 +16,8 @@ port="8211"
 steamport="27015"
 
 ## Server Parameters | https://docs.linuxgsm.com/configuration/start-parameters#additional-parameters
-## Game Server Docs | https://tech.palworldgame.com/dedicated-server-guide#linux
-startparameters="EpicApp=PalServer -useperfthreads -NoAsyncLoadingThread -UseMultithreadForDS -servername='${servername}' -port='${port}' -queryport='${steamport}'"
+## Game Server Docs | https://tech.palworldgame.com/settings-and-operation/arguments
+startparameters="-publiclobby -useperfthreads -NoAsyncLoadingThread -UseMultithreadForDS -servername='${servername}' -port='${port}' -queryport='${steamport}'"
 
 #### LinuxGSM Settings ####
 

From 77414e158225ec58e2fc34f5e8430f4e06e285ba Mon Sep 17 00:00:00 2001
From: Daniel Gibbs <me@danielgibbs.co.uk>
Date: Sat, 2 Mar 2024 09:51:01 +0000
Subject: [PATCH 089/154] Release v24.1.5

---
 lgsm/modules/core_modules.sh | 2 +-
 linuxgsm.sh                  | 2 +-
 2 files changed, 2 insertions(+), 2 deletions(-)

diff --git a/lgsm/modules/core_modules.sh b/lgsm/modules/core_modules.sh
index 70a452127..8f1516563 100644
--- a/lgsm/modules/core_modules.sh
+++ b/lgsm/modules/core_modules.sh
@@ -8,7 +8,7 @@
 
 moduleselfname="$(basename "$(readlink -f "${BASH_SOURCE[0]}")")"
 
-modulesversion="v24.1.4"
+modulesversion="v24.1.5"
 
 # Core
 
diff --git a/linuxgsm.sh b/linuxgsm.sh
index e3c663754..c68f19dc2 100755
--- a/linuxgsm.sh
+++ b/linuxgsm.sh
@@ -24,7 +24,7 @@ if [ -f ".dev-debug" ]; then
 	set -x
 fi
 
-version="v24.1.4"
+version="v24.1.5"
 shortname="core"
 gameservername="core"
 commandname="CORE"

From d7bb6d0f8fb783e5805e5c0835441da6378f87d0 Mon Sep 17 00:00:00 2001
From: MicLieg <38057464+MicLieg@users.noreply.github.com>
Date: Mon, 4 Mar 2024 15:59:22 +0100
Subject: [PATCH 090/154] fix(info_game): add ip query timeout and backup api
 (#4524)

---
 lgsm/modules/info_game.sh | 57 ++++++++++++++++++++++++++++-----------
 1 file changed, 42 insertions(+), 15 deletions(-)

diff --git a/lgsm/modules/info_game.sh b/lgsm/modules/info_game.sh
index e943a9d91..97f8da87e 100644
--- a/lgsm/modules/info_game.sh
+++ b/lgsm/modules/info_game.sh
@@ -2467,25 +2467,52 @@ fi
 # Cache public IP address for 24 hours
 if [ ! -f "${tmpdir}/publicip.json" ] || [ "$(find "${tmpdir}/publicip.json" -mmin +1440)" ]; then
 	apiurl="http://ip-api.com/json"
-	publicipresponse=$(curl -s "${apiurl}")
+	fn_script_log_info "Querying ${apiurl} for public IP address"
+
+	ipresponse=$(curl -s --max-time 3 "${apiurl}") # Attempt to query ip-api.com with a 3 second timeout
 	exitcode=$?
-	# if curl passes add publicip to publicip.json
-	if [ "${exitcode}" == "0" ]; then
-		fn_script_log_pass "Getting public IP address"
-		echo "${publicipresponse}" > "${tmpdir}/publicip.json"
-		publicip="$(jq -r '.query' "${tmpdir}/publicip.json")"
-		country="$(jq -r '.country' "${tmpdir}/publicip.json")"
-		countrycode="$(jq -r '.countryCode' "${tmpdir}/publicip.json")"
+
+	# Check if the first request was successfull
+	if [ "${exitcode}" -eq 0 ]; then
+		fn_script_log_pass "Queried ${apiurl} for public IP address"
+
+        # Parse and reformat the response
+        publicip="$(echo "${ipresponse}" | jq -r '.query')"
+        country="$(echo "${ipresponse}" | jq -r '.country')"
+        countrycode="$(echo "${ipresponse}" | jq -r '.countryCode')"
+        # Construct a universal JSON format
+        echo "{\"ip\":\"${publicip}\",\"country\":\"${country}\",\"countryCode\":\"${countrycode}\",\"apiurl\":\"${apiurl}\"}" > "${tmpdir}/publicip.json"
 	else
-		fn_script_log_warn "Unable to get public IP address"
-		publicip="NOT SET"
-		country="NOT SET"
-		countrycode="NOT SET"
+		# Fallback to myip.wtf if the initial request failed or timed out
+		apiurl="https://myip.wtf/json"
+		fn_script_log_pass "Querying ${apiurl} for public IP address"
+
+		ipresponse=$(curl -s --max-time 3 "${apiurl}") # Attempt to query myip.wtf with a 3 second timeout as a backup
+		exitcode=$?
+
+		# Check if the backup request was successfull
+		if [ "${exitcode}" -eq 0 ]; then
+			fn_script_log_pass "Queried ${apiurl} for public IP address"
+
+            # Parse and reformat the response from myip.wtf
+            publicip="$(echo "${ipresponse}" | jq -r '.YourFuckingIPAddress')"
+            country="$(echo "${ipresponse}" | jq -r '.YourFuckingCountry')"
+            countrycode="$(echo "${ipresponse}" | jq -r '.YourFuckingCountryCode')"
+            # Construct a universal JSON format
+            echo "{\"ip\":\"${publicip}\",\"country\":\"${country}\",\"countryCode\":\"${countrycode}\",\"apiurl\":\"${apiurl}\"}" > "${tmpdir}/publicip.json"
+		else
+			fn_script_log_error "Unable to get public IP address"
+			publicip="NOT SET"
+			country="NOT SET"
+			countrycode="NOT SET"
+		fi
 	fi
 else
-	publicip="$(jq -r '.query' "${tmpdir}/publicip.json")"
-	country="$(jq -r '.country' "${tmpdir}/publicip.json")"
-	countrycode="$(jq -r '.countryCode' "${tmpdir}/publicip.json")"
+	# Cached IP is still valid
+    fn_script_log_pass "Using cached IP as public IP address"
+    publicip="$(jq -r '.ip' "${tmpdir}/publicip.json")"
+    country="$(jq -r '.country' "${tmpdir}/publicip.json")"
+    countrycode="$(jq -r '.countryCode' "${tmpdir}/publicip.json")"
 fi
 
 # Alert IP address

From 181c84508df0d3d327d92aacd8e3cca3f1faee5f Mon Sep 17 00:00:00 2001
From: MicLieg <38057464+MicLieg@users.noreply.github.com>
Date: Fri, 8 Mar 2024 23:03:23 +0100
Subject: [PATCH 091/154] feat(alerts): add support for telegram thread/topic
 ids (#4526)

---
 lgsm/config-default/config-lgsm/acserver/_default.cfg       | 4 +++-
 lgsm/config-default/config-lgsm/ahl2server/_default.cfg     | 4 +++-
 lgsm/config-default/config-lgsm/ahlserver/_default.cfg      | 4 +++-
 lgsm/config-default/config-lgsm/arkserver/_default.cfg      | 4 +++-
 lgsm/config-default/config-lgsm/arma3server/_default.cfg    | 4 +++-
 lgsm/config-default/config-lgsm/armarserver/_default.cfg    | 4 +++-
 lgsm/config-default/config-lgsm/atsserver/_default.cfg      | 4 +++-
 lgsm/config-default/config-lgsm/avserver/_default.cfg       | 4 +++-
 lgsm/config-default/config-lgsm/bb2server/_default.cfg      | 4 +++-
 lgsm/config-default/config-lgsm/bbserver/_default.cfg       | 4 +++-
 lgsm/config-default/config-lgsm/bdserver/_default.cfg       | 4 +++-
 lgsm/config-default/config-lgsm/bf1942server/_default.cfg   | 4 +++-
 lgsm/config-default/config-lgsm/bfvserver/_default.cfg      | 4 +++-
 lgsm/config-default/config-lgsm/bmdmserver/_default.cfg     | 4 +++-
 lgsm/config-default/config-lgsm/boserver/_default.cfg       | 4 +++-
 lgsm/config-default/config-lgsm/bsserver/_default.cfg       | 4 +++-
 lgsm/config-default/config-lgsm/btlserver/_default.cfg      | 4 +++-
 lgsm/config-default/config-lgsm/btserver/_default.cfg       | 4 +++-
 lgsm/config-default/config-lgsm/ccserver/_default.cfg       | 4 +++-
 lgsm/config-default/config-lgsm/ckserver/_default.cfg       | 4 +++-
 lgsm/config-default/config-lgsm/cmwserver/_default.cfg      | 4 +++-
 lgsm/config-default/config-lgsm/cod2server/_default.cfg     | 4 +++-
 lgsm/config-default/config-lgsm/cod4server/_default.cfg     | 4 +++-
 lgsm/config-default/config-lgsm/codserver/_default.cfg      | 4 +++-
 lgsm/config-default/config-lgsm/coduoserver/_default.cfg    | 4 +++-
 lgsm/config-default/config-lgsm/codwawserver/_default.cfg   | 4 +++-
 lgsm/config-default/config-lgsm/colserver/_default.cfg      | 4 +++-
 lgsm/config-default/config-lgsm/cs2server/_default.cfg      | 4 +++-
 lgsm/config-default/config-lgsm/csczserver/_default.cfg     | 4 +++-
 lgsm/config-default/config-lgsm/csgoserver/_default.cfg     | 4 +++-
 lgsm/config-default/config-lgsm/csserver/_default.cfg       | 4 +++-
 lgsm/config-default/config-lgsm/cssserver/_default.cfg      | 4 +++-
 lgsm/config-default/config-lgsm/ctserver/_default.cfg       | 4 +++-
 lgsm/config-default/config-lgsm/dabserver/_default.cfg      | 4 +++-
 lgsm/config-default/config-lgsm/dayzserver/_default.cfg     | 4 +++-
 lgsm/config-default/config-lgsm/dmcserver/_default.cfg      | 4 +++-
 lgsm/config-default/config-lgsm/dodrserver/_default.cfg     | 4 +++-
 lgsm/config-default/config-lgsm/dodserver/_default.cfg      | 4 +++-
 lgsm/config-default/config-lgsm/dodsserver/_default.cfg     | 4 +++-
 lgsm/config-default/config-lgsm/doiserver/_default.cfg      | 4 +++-
 lgsm/config-default/config-lgsm/dstserver/_default.cfg      | 4 +++-
 lgsm/config-default/config-lgsm/dysserver/_default.cfg      | 4 +++-
 lgsm/config-default/config-lgsm/ecoserver/_default.cfg      | 4 +++-
 lgsm/config-default/config-lgsm/emserver/_default.cfg       | 4 +++-
 lgsm/config-default/config-lgsm/etlserver/_default.cfg      | 4 +++-
 lgsm/config-default/config-lgsm/ets2server/_default.cfg     | 4 +++-
 lgsm/config-default/config-lgsm/fctrserver/_default.cfg     | 4 +++-
 lgsm/config-default/config-lgsm/fofserver/_default.cfg      | 4 +++-
 lgsm/config-default/config-lgsm/gmodserver/_default.cfg     | 4 +++-
 lgsm/config-default/config-lgsm/hcuserver/_default.cfg      | 4 +++-
 lgsm/config-default/config-lgsm/hl2dmserver/_default.cfg    | 4 +++-
 lgsm/config-default/config-lgsm/hldmserver/_default.cfg     | 4 +++-
 lgsm/config-default/config-lgsm/hldmsserver/_default.cfg    | 4 +++-
 lgsm/config-default/config-lgsm/hwserver/_default.cfg       | 4 +++-
 lgsm/config-default/config-lgsm/insserver/_default.cfg      | 4 +++-
 lgsm/config-default/config-lgsm/inssserver/_default.cfg     | 4 +++-
 lgsm/config-default/config-lgsm/iosserver/_default.cfg      | 4 +++-
 lgsm/config-default/config-lgsm/jc2server/_default.cfg      | 4 +++-
 lgsm/config-default/config-lgsm/jc3server/_default.cfg      | 4 +++-
 lgsm/config-default/config-lgsm/jk2server/_default.cfg      | 4 +++-
 lgsm/config-default/config-lgsm/kf2server/_default.cfg      | 4 +++-
 lgsm/config-default/config-lgsm/kfserver/_default.cfg       | 4 +++-
 lgsm/config-default/config-lgsm/l4d2server/_default.cfg     | 4 +++-
 lgsm/config-default/config-lgsm/l4dserver/_default.cfg      | 4 +++-
 lgsm/config-default/config-lgsm/mcbserver/_default.cfg      | 4 +++-
 lgsm/config-default/config-lgsm/mcserver/_default.cfg       | 4 +++-
 lgsm/config-default/config-lgsm/mhserver/_default.cfg       | 4 +++-
 lgsm/config-default/config-lgsm/mohaaserver/_default.cfg    | 4 +++-
 lgsm/config-default/config-lgsm/momserver/_default.cfg      | 4 +++-
 lgsm/config-default/config-lgsm/mtaserver/_default.cfg      | 4 +++-
 lgsm/config-default/config-lgsm/ndserver/_default.cfg       | 4 +++-
 lgsm/config-default/config-lgsm/necserver/_default.cfg      | 4 +++-
 lgsm/config-default/config-lgsm/nmrihserver/_default.cfg    | 4 +++-
 lgsm/config-default/config-lgsm/ns2cserver/_default.cfg     | 4 +++-
 lgsm/config-default/config-lgsm/ns2server/_default.cfg      | 4 +++-
 lgsm/config-default/config-lgsm/nsserver/_default.cfg       | 4 +++-
 lgsm/config-default/config-lgsm/ohdserver/_default.cfg      | 4 +++-
 lgsm/config-default/config-lgsm/onsetserver/_default.cfg    | 4 +++-
 lgsm/config-default/config-lgsm/opforserver/_default.cfg    | 4 +++-
 lgsm/config-default/config-lgsm/pc2server/_default.cfg      | 4 +++-
 lgsm/config-default/config-lgsm/pcserver/_default.cfg       | 4 +++-
 lgsm/config-default/config-lgsm/pmcserver/_default.cfg      | 4 +++-
 lgsm/config-default/config-lgsm/psserver/_default.cfg       | 4 +++-
 lgsm/config-default/config-lgsm/pvkiiserver/_default.cfg    | 4 +++-
 lgsm/config-default/config-lgsm/pvrserver/_default.cfg      | 4 +++-
 lgsm/config-default/config-lgsm/pwserver/_default.cfg       | 4 +++-
 lgsm/config-default/config-lgsm/pzserver/_default.cfg       | 4 +++-
 lgsm/config-default/config-lgsm/q2server/_default.cfg       | 4 +++-
 lgsm/config-default/config-lgsm/q3server/_default.cfg       | 4 +++-
 lgsm/config-default/config-lgsm/q4server/_default.cfg       | 4 +++-
 lgsm/config-default/config-lgsm/qlserver/_default.cfg       | 4 +++-
 lgsm/config-default/config-lgsm/qwserver/_default.cfg       | 4 +++-
 lgsm/config-default/config-lgsm/ricochetserver/_default.cfg | 4 +++-
 lgsm/config-default/config-lgsm/roserver/_default.cfg       | 4 +++-
 lgsm/config-default/config-lgsm/rtcwserver/_default.cfg     | 4 +++-
 lgsm/config-default/config-lgsm/rustserver/_default.cfg     | 4 +++-
 lgsm/config-default/config-lgsm/rwserver/_default.cfg       | 4 +++-
 lgsm/config-default/config-lgsm/sampserver/_default.cfg     | 4 +++-
 lgsm/config-default/config-lgsm/sbotsserver/_default.cfg    | 4 +++-
 lgsm/config-default/config-lgsm/sbserver/_default.cfg       | 4 +++-
 lgsm/config-default/config-lgsm/scpslserver/_default.cfg    | 4 +++-
 lgsm/config-default/config-lgsm/scpslsmserver/_default.cfg  | 4 +++-
 lgsm/config-default/config-lgsm/sdtdserver/_default.cfg     | 4 +++-
 lgsm/config-default/config-lgsm/sfcserver/_default.cfg      | 4 +++-
 lgsm/config-default/config-lgsm/sfserver/_default.cfg       | 4 +++-
 lgsm/config-default/config-lgsm/sof2server/_default.cfg     | 4 +++-
 lgsm/config-default/config-lgsm/solserver/_default.cfg      | 4 +++-
 lgsm/config-default/config-lgsm/squadserver/_default.cfg    | 4 +++-
 lgsm/config-default/config-lgsm/stnserver/_default.cfg      | 4 +++-
 lgsm/config-default/config-lgsm/stserver/_default.cfg       | 4 +++-
 lgsm/config-default/config-lgsm/svenserver/_default.cfg     | 4 +++-
 lgsm/config-default/config-lgsm/terrariaserver/_default.cfg | 4 +++-
 lgsm/config-default/config-lgsm/tf2server/_default.cfg      | 4 +++-
 lgsm/config-default/config-lgsm/tfcserver/_default.cfg      | 4 +++-
 lgsm/config-default/config-lgsm/tfserver/_default.cfg       | 4 +++-
 lgsm/config-default/config-lgsm/tiserver/_default.cfg       | 4 +++-
 lgsm/config-default/config-lgsm/ts3server/_default.cfg      | 4 +++-
 lgsm/config-default/config-lgsm/tsserver/_default.cfg       | 4 +++-
 lgsm/config-default/config-lgsm/tuserver/_default.cfg       | 4 +++-
 lgsm/config-default/config-lgsm/twserver/_default.cfg       | 4 +++-
 lgsm/config-default/config-lgsm/untserver/_default.cfg      | 4 +++-
 lgsm/config-default/config-lgsm/ut2k4server/_default.cfg    | 4 +++-
 lgsm/config-default/config-lgsm/ut3server/_default.cfg      | 4 +++-
 lgsm/config-default/config-lgsm/ut99server/_default.cfg     | 4 +++-
 lgsm/config-default/config-lgsm/utserver/_default.cfg       | 4 +++-
 lgsm/config-default/config-lgsm/vhserver/_default.cfg       | 4 +++-
 lgsm/config-default/config-lgsm/vintsserver/_default.cfg    | 4 +++-
 lgsm/config-default/config-lgsm/vpmcserver/_default.cfg     | 4 +++-
 lgsm/config-default/config-lgsm/vsserver/_default.cfg       | 4 +++-
 lgsm/config-default/config-lgsm/wetserver/_default.cfg      | 4 +++-
 lgsm/config-default/config-lgsm/wfserver/_default.cfg       | 4 +++-
 lgsm/config-default/config-lgsm/wmcserver/_default.cfg      | 4 +++-
 lgsm/config-default/config-lgsm/wurmserver/_default.cfg     | 4 +++-
 lgsm/config-default/config-lgsm/zmrserver/_default.cfg      | 4 +++-
 lgsm/config-default/config-lgsm/zpsserver/_default.cfg      | 4 +++-
 lgsm/modules/alert_telegram.sh                              | 4 ++++
 136 files changed, 409 insertions(+), 135 deletions(-)

diff --git a/lgsm/config-default/config-lgsm/acserver/_default.cfg b/lgsm/config-default/config-lgsm/acserver/_default.cfg
index b3ad14caf..154f38c7b 100644
--- a/lgsm/config-default/config-lgsm/acserver/_default.cfg
+++ b/lgsm/config-default/config-lgsm/acserver/_default.cfg
@@ -74,11 +74,13 @@ slackwebhook="webhook"
 
 # Telegram Alerts | https://docs.linuxgsm.com/alerts/telegram
 # You can add a custom cURL string eg proxy (useful in Russia) in "curlcustomstring".
-# For example "--socks5 ipaddr:port" for socks5 proxy see more in "curl --help".
+# For example "--socks5 ipaddr:port" for socks5 proxy see more in "curl --help all".
 telegramapi="api.telegram.org"
 telegramalert="off"
 telegramtoken="accesstoken"
 telegramchatid=""
+telegramthreadid=""
+telegramsilentnotification="false"
 curlcustomstring=""
 
 ## Updating | https://docs.linuxgsm.com/commands/update
diff --git a/lgsm/config-default/config-lgsm/ahl2server/_default.cfg b/lgsm/config-default/config-lgsm/ahl2server/_default.cfg
index 086047093..a98c90701 100644
--- a/lgsm/config-default/config-lgsm/ahl2server/_default.cfg
+++ b/lgsm/config-default/config-lgsm/ahl2server/_default.cfg
@@ -82,11 +82,13 @@ slackwebhook="webhook"
 
 # Telegram Alerts | https://docs.linuxgsm.com/alerts/telegram
 # You can add a custom cURL string eg proxy (useful in Russia) in "curlcustomstring".
-# For example "--socks5 ipaddr:port" for socks5 proxy see more in "curl --help".
+# For example "--socks5 ipaddr:port" for socks5 proxy see more in "curl --help all".
 telegramapi="api.telegram.org"
 telegramalert="off"
 telegramtoken="accesstoken"
 telegramchatid=""
+telegramthreadid=""
+telegramsilentnotification="false"
 curlcustomstring=""
 
 ## Updating | https://docs.linuxgsm.com/commands/update
diff --git a/lgsm/config-default/config-lgsm/ahlserver/_default.cfg b/lgsm/config-default/config-lgsm/ahlserver/_default.cfg
index fb7725e1f..04cc2e6f9 100644
--- a/lgsm/config-default/config-lgsm/ahlserver/_default.cfg
+++ b/lgsm/config-default/config-lgsm/ahlserver/_default.cfg
@@ -77,11 +77,13 @@ slackwebhook="webhook"
 
 # Telegram Alerts | https://docs.linuxgsm.com/alerts/telegram
 # You can add a custom cURL string eg proxy (useful in Russia) in "curlcustomstring".
-# For example "--socks5 ipaddr:port" for socks5 proxy see more in "curl --help".
+# For example "--socks5 ipaddr:port" for socks5 proxy see more in "curl --help all".
 telegramapi="api.telegram.org"
 telegramalert="off"
 telegramtoken="accesstoken"
 telegramchatid=""
+telegramthreadid=""
+telegramsilentnotification="false"
 curlcustomstring=""
 
 ## Updating | https://docs.linuxgsm.com/commands/update
diff --git a/lgsm/config-default/config-lgsm/arkserver/_default.cfg b/lgsm/config-default/config-lgsm/arkserver/_default.cfg
index 73b251731..8680c1bad 100644
--- a/lgsm/config-default/config-lgsm/arkserver/_default.cfg
+++ b/lgsm/config-default/config-lgsm/arkserver/_default.cfg
@@ -79,11 +79,13 @@ slackwebhook="webhook"
 
 # Telegram Alerts | https://docs.linuxgsm.com/alerts/telegram
 # You can add a custom cURL string eg proxy (useful in Russia) in "curlcustomstring".
-# For example "--socks5 ipaddr:port" for socks5 proxy see more in "curl --help".
+# For example "--socks5 ipaddr:port" for socks5 proxy see more in "curl --help all".
 telegramapi="api.telegram.org"
 telegramalert="off"
 telegramtoken="accesstoken"
 telegramchatid=""
+telegramthreadid=""
+telegramsilentnotification="false"
 curlcustomstring=""
 
 ## Updating | https://docs.linuxgsm.com/commands/update
diff --git a/lgsm/config-default/config-lgsm/arma3server/_default.cfg b/lgsm/config-default/config-lgsm/arma3server/_default.cfg
index f50bf8342..b0918ef3c 100644
--- a/lgsm/config-default/config-lgsm/arma3server/_default.cfg
+++ b/lgsm/config-default/config-lgsm/arma3server/_default.cfg
@@ -93,11 +93,13 @@ slackwebhook="webhook"
 
 # Telegram Alerts | https://docs.linuxgsm.com/alerts/telegram
 # You can add a custom cURL string eg proxy (useful in Russia) in "curlcustomstring".
-# For example "--socks5 ipaddr:port" for socks5 proxy see more in "curl --help".
+# For example "--socks5 ipaddr:port" for socks5 proxy see more in "curl --help all".
 telegramapi="api.telegram.org"
 telegramalert="off"
 telegramtoken="accesstoken"
 telegramchatid=""
+telegramthreadid=""
+telegramsilentnotification="false"
 curlcustomstring=""
 
 ## Updating | https://docs.linuxgsm.com/commands/update
diff --git a/lgsm/config-default/config-lgsm/armarserver/_default.cfg b/lgsm/config-default/config-lgsm/armarserver/_default.cfg
index 3637f469b..61103d332 100644
--- a/lgsm/config-default/config-lgsm/armarserver/_default.cfg
+++ b/lgsm/config-default/config-lgsm/armarserver/_default.cfg
@@ -78,11 +78,13 @@ slackwebhook="webhook"
 
 # Telegram Alerts | https://docs.linuxgsm.com/alerts/telegram
 # You can add a custom cURL string eg proxy (useful in Russia) in "curlcustomstring".
-# For example "--socks5 ipaddr:port" for socks5 proxy see more in "curl --help".
+# For example "--socks5 ipaddr:port" for socks5 proxy see more in "curl --help all".
 telegramapi="api.telegram.org"
 telegramalert="off"
 telegramtoken="accesstoken"
 telegramchatid=""
+telegramthreadid=""
+telegramsilentnotification="false"
 curlcustomstring=""
 
 ## Updating | https://docs.linuxgsm.com/commands/update
diff --git a/lgsm/config-default/config-lgsm/atsserver/_default.cfg b/lgsm/config-default/config-lgsm/atsserver/_default.cfg
index 9d8125a31..f6d165098 100644
--- a/lgsm/config-default/config-lgsm/atsserver/_default.cfg
+++ b/lgsm/config-default/config-lgsm/atsserver/_default.cfg
@@ -70,11 +70,13 @@ slackwebhook="webhook"
 
 # Telegram Alerts | https://docs.linuxgsm.com/alerts/telegram
 # You can add a custom cURL string eg proxy (useful in Russia) in "curlcustomstring".
-# For example "--socks5 ipaddr:port" for socks5 proxy see more in "curl --help".
+# For example "--socks5 ipaddr:port" for socks5 proxy see more in "curl --help all".
 telegramapi="api.telegram.org"
 telegramalert="off"
 telegramtoken="accesstoken"
 telegramchatid=""
+telegramthreadid=""
+telegramsilentnotification="false"
 curlcustomstring=""
 
 ## Updating | https://docs.linuxgsm.com/commands/update
diff --git a/lgsm/config-default/config-lgsm/avserver/_default.cfg b/lgsm/config-default/config-lgsm/avserver/_default.cfg
index 5777198c8..7b225de1f 100644
--- a/lgsm/config-default/config-lgsm/avserver/_default.cfg
+++ b/lgsm/config-default/config-lgsm/avserver/_default.cfg
@@ -70,11 +70,13 @@ slackwebhook="webhook"
 
 # Telegram Alerts | https://docs.linuxgsm.com/alerts/telegram
 # You can add a custom cURL string eg proxy (useful in Russia) in "curlcustomstring".
-# For example "--socks5 ipaddr:port" for socks5 proxy see more in "curl --help".
+# For example "--socks5 ipaddr:port" for socks5 proxy see more in "curl --help all".
 telegramapi="api.telegram.org"
 telegramalert="off"
 telegramtoken="accesstoken"
 telegramchatid=""
+telegramthreadid=""
+telegramsilentnotification="false"
 curlcustomstring=""
 
 ## Updating | https://docs.linuxgsm.com/commands/update
diff --git a/lgsm/config-default/config-lgsm/bb2server/_default.cfg b/lgsm/config-default/config-lgsm/bb2server/_default.cfg
index c52c8c540..b9250cc5f 100644
--- a/lgsm/config-default/config-lgsm/bb2server/_default.cfg
+++ b/lgsm/config-default/config-lgsm/bb2server/_default.cfg
@@ -83,11 +83,13 @@ slackwebhook="webhook"
 
 # Telegram Alerts | https://docs.linuxgsm.com/alerts/telegram
 # You can add a custom cURL string eg proxy (useful in Russia) in "curlcustomstring".
-# For example "--socks5 ipaddr:port" for socks5 proxy see more in "curl --help".
+# For example "--socks5 ipaddr:port" for socks5 proxy see more in "curl --help all".
 telegramapi="api.telegram.org"
 telegramalert="off"
 telegramtoken="accesstoken"
 telegramchatid=""
+telegramthreadid=""
+telegramsilentnotification="false"
 curlcustomstring=""
 
 ## Updating | https://docs.linuxgsm.com/commands/update
diff --git a/lgsm/config-default/config-lgsm/bbserver/_default.cfg b/lgsm/config-default/config-lgsm/bbserver/_default.cfg
index 2cfabab9c..99262d8e3 100644
--- a/lgsm/config-default/config-lgsm/bbserver/_default.cfg
+++ b/lgsm/config-default/config-lgsm/bbserver/_default.cfg
@@ -77,11 +77,13 @@ slackwebhook="webhook"
 
 # Telegram Alerts | https://docs.linuxgsm.com/alerts/telegram
 # You can add a custom cURL string eg proxy (useful in Russia) in "curlcustomstring".
-# For example "--socks5 ipaddr:port" for socks5 proxy see more in "curl --help".
+# For example "--socks5 ipaddr:port" for socks5 proxy see more in "curl --help all".
 telegramapi="api.telegram.org"
 telegramalert="off"
 telegramtoken="accesstoken"
 telegramchatid=""
+telegramthreadid=""
+telegramsilentnotification="false"
 curlcustomstring=""
 
 ## Updating | https://docs.linuxgsm.com/commands/update
diff --git a/lgsm/config-default/config-lgsm/bdserver/_default.cfg b/lgsm/config-default/config-lgsm/bdserver/_default.cfg
index 674fabb10..3c1769fb3 100644
--- a/lgsm/config-default/config-lgsm/bdserver/_default.cfg
+++ b/lgsm/config-default/config-lgsm/bdserver/_default.cfg
@@ -77,11 +77,13 @@ slackwebhook="webhook"
 
 # Telegram Alerts | https://docs.linuxgsm.com/alerts/telegram
 # You can add a custom cURL string eg proxy (useful in Russia) in "curlcustomstring".
-# For example "--socks5 ipaddr:port" for socks5 proxy see more in "curl --help".
+# For example "--socks5 ipaddr:port" for socks5 proxy see more in "curl --help all".
 telegramapi="api.telegram.org"
 telegramalert="off"
 telegramtoken="accesstoken"
 telegramchatid=""
+telegramthreadid=""
+telegramsilentnotification="false"
 curlcustomstring=""
 
 ## Updating | https://docs.linuxgsm.com/commands/update
diff --git a/lgsm/config-default/config-lgsm/bf1942server/_default.cfg b/lgsm/config-default/config-lgsm/bf1942server/_default.cfg
index 5bd576b22..30e2f957a 100644
--- a/lgsm/config-default/config-lgsm/bf1942server/_default.cfg
+++ b/lgsm/config-default/config-lgsm/bf1942server/_default.cfg
@@ -70,11 +70,13 @@ slackwebhook="webhook"
 
 # Telegram Alerts | https://docs.linuxgsm.com/alerts/telegram
 # You can add a custom cURL string eg proxy (useful in Russia) in "curlcustomstring".
-# For example "--socks5 ipaddr:port" for socks5 proxy see more in "curl --help".
+# For example "--socks5 ipaddr:port" for socks5 proxy see more in "curl --help all".
 telegramapi="api.telegram.org"
 telegramalert="off"
 telegramtoken="accesstoken"
 telegramchatid=""
+telegramthreadid=""
+telegramsilentnotification="false"
 curlcustomstring=""
 
 ## Updating | https://docs.linuxgsm.com/commands/update
diff --git a/lgsm/config-default/config-lgsm/bfvserver/_default.cfg b/lgsm/config-default/config-lgsm/bfvserver/_default.cfg
index 66c4ef8fc..53aa36054 100644
--- a/lgsm/config-default/config-lgsm/bfvserver/_default.cfg
+++ b/lgsm/config-default/config-lgsm/bfvserver/_default.cfg
@@ -70,11 +70,13 @@ slackwebhook="webhook"
 
 # Telegram Alerts | https://docs.linuxgsm.com/alerts/telegram
 # You can add a custom cURL string eg proxy (useful in Russia) in "curlcustomstring".
-# For example "--socks5 ipaddr:port" for socks5 proxy see more in "curl --help".
+# For example "--socks5 ipaddr:port" for socks5 proxy see more in "curl --help all".
 telegramapi="api.telegram.org"
 telegramalert="off"
 telegramtoken="accesstoken"
 telegramchatid=""
+telegramthreadid=""
+telegramsilentnotification="false"
 curlcustomstring=""
 
 ## Updating | https://docs.linuxgsm.com/commands/update
diff --git a/lgsm/config-default/config-lgsm/bmdmserver/_default.cfg b/lgsm/config-default/config-lgsm/bmdmserver/_default.cfg
index dfe04bcd8..e353d57b0 100644
--- a/lgsm/config-default/config-lgsm/bmdmserver/_default.cfg
+++ b/lgsm/config-default/config-lgsm/bmdmserver/_default.cfg
@@ -83,11 +83,13 @@ slackwebhook="webhook"
 
 # Telegram Alerts | https://docs.linuxgsm.com/alerts/telegram
 # You can add a custom cURL string eg proxy (useful in Russia) in "curlcustomstring".
-# For example "--socks5 ipaddr:port" for socks5 proxy see more in "curl --help".
+# For example "--socks5 ipaddr:port" for socks5 proxy see more in "curl --help all".
 telegramapi="api.telegram.org"
 telegramalert="off"
 telegramtoken="accesstoken"
 telegramchatid=""
+telegramthreadid=""
+telegramsilentnotification="false"
 curlcustomstring=""
 
 ## Updating | https://docs.linuxgsm.com/commands/update
diff --git a/lgsm/config-default/config-lgsm/boserver/_default.cfg b/lgsm/config-default/config-lgsm/boserver/_default.cfg
index d6e2b4f4f..ae7912ab6 100644
--- a/lgsm/config-default/config-lgsm/boserver/_default.cfg
+++ b/lgsm/config-default/config-lgsm/boserver/_default.cfg
@@ -75,11 +75,13 @@ slackwebhook="webhook"
 
 # Telegram Alerts | https://docs.linuxgsm.com/alerts/telegram
 # You can add a custom cURL string eg proxy (useful in Russia) in "curlcustomstring".
-# For example "--socks5 ipaddr:port" for socks5 proxy see more in "curl --help".
+# For example "--socks5 ipaddr:port" for socks5 proxy see more in "curl --help all".
 telegramapi="api.telegram.org"
 telegramalert="off"
 telegramtoken="accesstoken"
 telegramchatid=""
+telegramthreadid=""
+telegramsilentnotification="false"
 curlcustomstring=""
 
 ## Updating | https://docs.linuxgsm.com/commands/update
diff --git a/lgsm/config-default/config-lgsm/bsserver/_default.cfg b/lgsm/config-default/config-lgsm/bsserver/_default.cfg
index b5f6017c0..d81cde16d 100644
--- a/lgsm/config-default/config-lgsm/bsserver/_default.cfg
+++ b/lgsm/config-default/config-lgsm/bsserver/_default.cfg
@@ -87,11 +87,13 @@ slackwebhook="webhook"
 
 # Telegram Alerts | https://docs.linuxgsm.com/alerts/telegram
 # You can add a custom cURL string eg proxy (useful in Russia) in "curlcustomstring".
-# For example "--socks5 ipaddr:port" for socks5 proxy see more in "curl --help".
+# For example "--socks5 ipaddr:port" for socks5 proxy see more in "curl --help all".
 telegramapi="api.telegram.org"
 telegramalert="off"
 telegramtoken="accesstoken"
 telegramchatid=""
+telegramthreadid=""
+telegramsilentnotification="false"
 curlcustomstring=""
 
 ## Updating | https://docs.linuxgsm.com/commands/update
diff --git a/lgsm/config-default/config-lgsm/btlserver/_default.cfg b/lgsm/config-default/config-lgsm/btlserver/_default.cfg
index dcc49c61c..28e8b95e3 100644
--- a/lgsm/config-default/config-lgsm/btlserver/_default.cfg
+++ b/lgsm/config-default/config-lgsm/btlserver/_default.cfg
@@ -75,11 +75,13 @@ slackwebhook="webhook"
 
 # Telegram Alerts | https://docs.linuxgsm.com/alerts/telegram
 # You can add a custom cURL string eg proxy (useful in Russia) in "curlcustomstring".
-# For example "--socks5 ipaddr:port" for socks5 proxy see more in "curl --help".
+# For example "--socks5 ipaddr:port" for socks5 proxy see more in "curl --help all".
 telegramapi="api.telegram.org"
 telegramalert="off"
 telegramtoken="accesstoken"
 telegramchatid=""
+telegramthreadid=""
+telegramsilentnotification="false"
 curlcustomstring=""
 
 ## Updating | https://docs.linuxgsm.com/commands/update
diff --git a/lgsm/config-default/config-lgsm/btserver/_default.cfg b/lgsm/config-default/config-lgsm/btserver/_default.cfg
index c02b8c6ca..71c02c3fc 100644
--- a/lgsm/config-default/config-lgsm/btserver/_default.cfg
+++ b/lgsm/config-default/config-lgsm/btserver/_default.cfg
@@ -70,11 +70,13 @@ slackwebhook="webhook"
 
 # Telegram Alerts | https://docs.linuxgsm.com/alerts/telegram
 # You can add a custom cURL string eg proxy (useful in Russia) in "curlcustomstring".
-# For example "--socks5 ipaddr:port" for socks5 proxy see more in "curl --help".
+# For example "--socks5 ipaddr:port" for socks5 proxy see more in "curl --help all".
 telegramapi="api.telegram.org"
 telegramalert="off"
 telegramtoken="accesstoken"
 telegramchatid=""
+telegramthreadid=""
+telegramsilentnotification="false"
 curlcustomstring=""
 
 ## Updating | https://docs.linuxgsm.com/commands/update
diff --git a/lgsm/config-default/config-lgsm/ccserver/_default.cfg b/lgsm/config-default/config-lgsm/ccserver/_default.cfg
index a8cd9f6d2..66847b410 100644
--- a/lgsm/config-default/config-lgsm/ccserver/_default.cfg
+++ b/lgsm/config-default/config-lgsm/ccserver/_default.cfg
@@ -78,11 +78,13 @@ slackwebhook="webhook"
 
 # Telegram Alerts | https://docs.linuxgsm.com/alerts/telegram
 # You can add a custom cURL string eg proxy (useful in Russia) in "curlcustomstring".
-# For example "--socks5 ipaddr:port" for socks5 proxy see more in "curl --help".
+# For example "--socks5 ipaddr:port" for socks5 proxy see more in "curl --help all".
 telegramapi="api.telegram.org"
 telegramalert="off"
 telegramtoken="accesstoken"
 telegramchatid=""
+telegramthreadid=""
+telegramsilentnotification="false"
 curlcustomstring=""
 
 ## Updating | https://docs.linuxgsm.com/commands/update
diff --git a/lgsm/config-default/config-lgsm/ckserver/_default.cfg b/lgsm/config-default/config-lgsm/ckserver/_default.cfg
index c662f3b04..f54d7cc7f 100644
--- a/lgsm/config-default/config-lgsm/ckserver/_default.cfg
+++ b/lgsm/config-default/config-lgsm/ckserver/_default.cfg
@@ -74,11 +74,13 @@ slackwebhook="webhook"
 
 # Telegram Alerts | https://docs.linuxgsm.com/alerts/telegram
 # You can add a custom cURL string eg proxy (useful in Russia) in "curlcustomstring".
-# For example "--socks5 ipaddr:port" for socks5 proxy see more in "curl --help".
+# For example "--socks5 ipaddr:port" for socks5 proxy see more in "curl --help all".
 telegramapi="api.telegram.org"
 telegramalert="off"
 telegramtoken="accesstoken"
 telegramchatid=""
+telegramthreadid=""
+telegramsilentnotification="false"
 curlcustomstring=""
 
 ## Updating | https://docs.linuxgsm.com/commands/update
diff --git a/lgsm/config-default/config-lgsm/cmwserver/_default.cfg b/lgsm/config-default/config-lgsm/cmwserver/_default.cfg
index 29df71d95..776b06a1d 100644
--- a/lgsm/config-default/config-lgsm/cmwserver/_default.cfg
+++ b/lgsm/config-default/config-lgsm/cmwserver/_default.cfg
@@ -76,11 +76,13 @@ slackwebhook="webhook"
 
 # Telegram Alerts | https://docs.linuxgsm.com/alerts/telegram
 # You can add a custom cURL string eg proxy (useful in Russia) in "curlcustomstring".
-# For example "--socks5 ipaddr:port" for socks5 proxy see more in "curl --help".
+# For example "--socks5 ipaddr:port" for socks5 proxy see more in "curl --help all".
 telegramapi="api.telegram.org"
 telegramalert="off"
 telegramtoken="accesstoken"
 telegramchatid=""
+telegramthreadid=""
+telegramsilentnotification="false"
 curlcustomstring=""
 
 ## Updating | https://docs.linuxgsm.com/commands/update
diff --git a/lgsm/config-default/config-lgsm/cod2server/_default.cfg b/lgsm/config-default/config-lgsm/cod2server/_default.cfg
index 98ea0afb7..9665a9ba8 100644
--- a/lgsm/config-default/config-lgsm/cod2server/_default.cfg
+++ b/lgsm/config-default/config-lgsm/cod2server/_default.cfg
@@ -76,11 +76,13 @@ slackwebhook="webhook"
 
 # Telegram Alerts | https://docs.linuxgsm.com/alerts/telegram
 # You can add a custom cURL string eg proxy (useful in Russia) in "curlcustomstring".
-# For example "--socks5 ipaddr:port" for socks5 proxy see more in "curl --help".
+# For example "--socks5 ipaddr:port" for socks5 proxy see more in "curl --help all".
 telegramapi="api.telegram.org"
 telegramalert="off"
 telegramtoken="accesstoken"
 telegramchatid=""
+telegramthreadid=""
+telegramsilentnotification="false"
 curlcustomstring=""
 
 ## Backup | https://docs.linuxgsm.com/commands/backup
diff --git a/lgsm/config-default/config-lgsm/cod4server/_default.cfg b/lgsm/config-default/config-lgsm/cod4server/_default.cfg
index cde7e0113..f9787c352 100644
--- a/lgsm/config-default/config-lgsm/cod4server/_default.cfg
+++ b/lgsm/config-default/config-lgsm/cod4server/_default.cfg
@@ -76,11 +76,13 @@ slackwebhook="webhook"
 
 # Telegram Alerts | https://docs.linuxgsm.com/alerts/telegram
 # You can add a custom cURL string eg proxy (useful in Russia) in "curlcustomstring".
-# For example "--socks5 ipaddr:port" for socks5 proxy see more in "curl --help".
+# For example "--socks5 ipaddr:port" for socks5 proxy see more in "curl --help all".
 telegramapi="api.telegram.org"
 telegramalert="off"
 telegramtoken="accesstoken"
 telegramchatid=""
+telegramthreadid=""
+telegramsilentnotification="false"
 curlcustomstring=""
 
 ## Backup | https://docs.linuxgsm.com/commands/backup
diff --git a/lgsm/config-default/config-lgsm/codserver/_default.cfg b/lgsm/config-default/config-lgsm/codserver/_default.cfg
index 1c0a0902c..8f1476ad3 100644
--- a/lgsm/config-default/config-lgsm/codserver/_default.cfg
+++ b/lgsm/config-default/config-lgsm/codserver/_default.cfg
@@ -76,11 +76,13 @@ slackwebhook="webhook"
 
 # Telegram Alerts | https://docs.linuxgsm.com/alerts/telegram
 # You can add a custom cURL string eg proxy (useful in Russia) in "curlcustomstring".
-# For example "--socks5 ipaddr:port" for socks5 proxy see more in "curl --help".
+# For example "--socks5 ipaddr:port" for socks5 proxy see more in "curl --help all".
 telegramapi="api.telegram.org"
 telegramalert="off"
 telegramtoken="accesstoken"
 telegramchatid=""
+telegramthreadid=""
+telegramsilentnotification="false"
 curlcustomstring=""
 
 ## Backup | https://docs.linuxgsm.com/commands/backup
diff --git a/lgsm/config-default/config-lgsm/coduoserver/_default.cfg b/lgsm/config-default/config-lgsm/coduoserver/_default.cfg
index b3f89889f..c405966d4 100644
--- a/lgsm/config-default/config-lgsm/coduoserver/_default.cfg
+++ b/lgsm/config-default/config-lgsm/coduoserver/_default.cfg
@@ -76,11 +76,13 @@ slackwebhook="webhook"
 
 # Telegram Alerts | https://docs.linuxgsm.com/alerts/telegram
 # You can add a custom cURL string eg proxy (useful in Russia) in "curlcustomstring".
-# For example "--socks5 ipaddr:port" for socks5 proxy see more in "curl --help".
+# For example "--socks5 ipaddr:port" for socks5 proxy see more in "curl --help all".
 telegramapi="api.telegram.org"
 telegramalert="off"
 telegramtoken="accesstoken"
 telegramchatid=""
+telegramthreadid=""
+telegramsilentnotification="false"
 curlcustomstring=""
 
 ## Backup | https://docs.linuxgsm.com/commands/backup
diff --git a/lgsm/config-default/config-lgsm/codwawserver/_default.cfg b/lgsm/config-default/config-lgsm/codwawserver/_default.cfg
index e906fcf07..ca0f002d3 100644
--- a/lgsm/config-default/config-lgsm/codwawserver/_default.cfg
+++ b/lgsm/config-default/config-lgsm/codwawserver/_default.cfg
@@ -76,11 +76,13 @@ slackwebhook="webhook"
 
 # Telegram Alerts | https://docs.linuxgsm.com/alerts/telegram
 # You can add a custom cURL string eg proxy (useful in Russia) in "curlcustomstring".
-# For example "--socks5 ipaddr:port" for socks5 proxy see more in "curl --help".
+# For example "--socks5 ipaddr:port" for socks5 proxy see more in "curl --help all".
 telegramapi="api.telegram.org"
 telegramalert="off"
 telegramtoken="accesstoken"
 telegramchatid=""
+telegramthreadid=""
+telegramsilentnotification="false"
 curlcustomstring=""
 
 ## Backup | https://docs.linuxgsm.com/commands/backup
diff --git a/lgsm/config-default/config-lgsm/colserver/_default.cfg b/lgsm/config-default/config-lgsm/colserver/_default.cfg
index 1c3b261e2..cd94e9b37 100644
--- a/lgsm/config-default/config-lgsm/colserver/_default.cfg
+++ b/lgsm/config-default/config-lgsm/colserver/_default.cfg
@@ -71,11 +71,13 @@ slackwebhook="webhook"
 
 # Telegram Alerts | https://docs.linuxgsm.com/alerts/telegram
 # You can add a custom cURL string eg proxy (useful in Russia) in "curlcustomstring".
-# For example "--socks5 ipaddr:port" for socks5 proxy see more in "curl --help".
+# For example "--socks5 ipaddr:port" for socks5 proxy see more in "curl --help all".
 telegramapi="api.telegram.org"
 telegramalert="off"
 telegramtoken="accesstoken"
 telegramchatid=""
+telegramthreadid=""
+telegramsilentnotification="false"
 curlcustomstring=""
 
 ## Updating | https://docs.linuxgsm.com/commands/update
diff --git a/lgsm/config-default/config-lgsm/cs2server/_default.cfg b/lgsm/config-default/config-lgsm/cs2server/_default.cfg
index 84679da01..a2df48244 100644
--- a/lgsm/config-default/config-lgsm/cs2server/_default.cfg
+++ b/lgsm/config-default/config-lgsm/cs2server/_default.cfg
@@ -77,11 +77,13 @@ slackwebhook="webhook"
 
 # Telegram Alerts | https://docs.linuxgsm.com/alerts/telegram
 # You can add a custom cURL string eg proxy (useful in Russia) in "curlcustomstring".
-# For example "--socks5 ipaddr:port" for socks5 proxy see more in "curl --help".
+# For example "--socks5 ipaddr:port" for socks5 proxy see more in "curl --help all".
 telegramapi="api.telegram.org"
 telegramalert="off"
 telegramtoken="accesstoken"
 telegramchatid=""
+telegramthreadid=""
+telegramsilentnotification="false"
 curlcustomstring=""
 
 ## Updating | https://docs.linuxgsm.com/commands/update
diff --git a/lgsm/config-default/config-lgsm/csczserver/_default.cfg b/lgsm/config-default/config-lgsm/csczserver/_default.cfg
index 11d0da197..29001a098 100644
--- a/lgsm/config-default/config-lgsm/csczserver/_default.cfg
+++ b/lgsm/config-default/config-lgsm/csczserver/_default.cfg
@@ -77,11 +77,13 @@ slackwebhook="webhook"
 
 # Telegram Alerts | https://docs.linuxgsm.com/alerts/telegram
 # You can add a custom cURL string eg proxy (useful in Russia) in "curlcustomstring".
-# For example "--socks5 ipaddr:port" for socks5 proxy see more in "curl --help".
+# For example "--socks5 ipaddr:port" for socks5 proxy see more in "curl --help all".
 telegramapi="api.telegram.org"
 telegramalert="off"
 telegramtoken="accesstoken"
 telegramchatid=""
+telegramthreadid=""
+telegramsilentnotification="false"
 curlcustomstring=""
 
 ## Updating | https://docs.linuxgsm.com/commands/update
diff --git a/lgsm/config-default/config-lgsm/csgoserver/_default.cfg b/lgsm/config-default/config-lgsm/csgoserver/_default.cfg
index 5efdd4942..29b3aea10 100644
--- a/lgsm/config-default/config-lgsm/csgoserver/_default.cfg
+++ b/lgsm/config-default/config-lgsm/csgoserver/_default.cfg
@@ -114,11 +114,13 @@ slackwebhook="webhook"
 
 # Telegram Alerts | https://docs.linuxgsm.com/alerts/telegram
 # You can add a custom cURL string eg proxy (useful in Russia) in "curlcustomstring".
-# For example "--socks5 ipaddr:port" for socks5 proxy see more in "curl --help".
+# For example "--socks5 ipaddr:port" for socks5 proxy see more in "curl --help all".
 telegramapi="api.telegram.org"
 telegramalert="off"
 telegramtoken="accesstoken"
 telegramchatid=""
+telegramthreadid=""
+telegramsilentnotification="false"
 curlcustomstring=""
 
 ## Updating | https://docs.linuxgsm.com/commands/update
diff --git a/lgsm/config-default/config-lgsm/csserver/_default.cfg b/lgsm/config-default/config-lgsm/csserver/_default.cfg
index 2e53616bd..266448e74 100644
--- a/lgsm/config-default/config-lgsm/csserver/_default.cfg
+++ b/lgsm/config-default/config-lgsm/csserver/_default.cfg
@@ -77,11 +77,13 @@ slackwebhook="webhook"
 
 # Telegram Alerts | https://docs.linuxgsm.com/alerts/telegram
 # You can add a custom cURL string eg proxy (useful in Russia) in "curlcustomstring".
-# For example "--socks5 ipaddr:port" for socks5 proxy see more in "curl --help".
+# For example "--socks5 ipaddr:port" for socks5 proxy see more in "curl --help all".
 telegramapi="api.telegram.org"
 telegramalert="off"
 telegramtoken="accesstoken"
 telegramchatid=""
+telegramthreadid=""
+telegramsilentnotification="false"
 curlcustomstring=""
 
 ## Updating | https://docs.linuxgsm.com/commands/update
diff --git a/lgsm/config-default/config-lgsm/cssserver/_default.cfg b/lgsm/config-default/config-lgsm/cssserver/_default.cfg
index 1af41c5fe..103c30897 100644
--- a/lgsm/config-default/config-lgsm/cssserver/_default.cfg
+++ b/lgsm/config-default/config-lgsm/cssserver/_default.cfg
@@ -83,11 +83,13 @@ slackwebhook="webhook"
 
 # Telegram Alerts | https://docs.linuxgsm.com/alerts/telegram
 # You can add a custom cURL string eg proxy (useful in Russia) in "curlcustomstring".
-# For example "--socks5 ipaddr:port" for socks5 proxy see more in "curl --help".
+# For example "--socks5 ipaddr:port" for socks5 proxy see more in "curl --help all".
 telegramapi="api.telegram.org"
 telegramalert="off"
 telegramtoken="accesstoken"
 telegramchatid=""
+telegramthreadid=""
+telegramsilentnotification="false"
 curlcustomstring=""
 
 ## Updating | https://docs.linuxgsm.com/commands/update
diff --git a/lgsm/config-default/config-lgsm/ctserver/_default.cfg b/lgsm/config-default/config-lgsm/ctserver/_default.cfg
index ea1ae5229..ac87d7516 100644
--- a/lgsm/config-default/config-lgsm/ctserver/_default.cfg
+++ b/lgsm/config-default/config-lgsm/ctserver/_default.cfg
@@ -70,11 +70,13 @@ slackwebhook="webhook"
 
 # Telegram Alerts | https://docs.linuxgsm.com/alerts/telegram
 # You can add a custom cURL string eg proxy (useful in Russia) in "curlcustomstring".
-# For example "--socks5 ipaddr:port" for socks5 proxy see more in "curl --help".
+# For example "--socks5 ipaddr:port" for socks5 proxy see more in "curl --help all".
 telegramapi="api.telegram.org"
 telegramalert="off"
 telegramtoken="accesstoken"
 telegramchatid=""
+telegramthreadid=""
+telegramsilentnotification="false"
 curlcustomstring=""
 
 ## Updating | https://docs.linuxgsm.com/commands/update
diff --git a/lgsm/config-default/config-lgsm/dabserver/_default.cfg b/lgsm/config-default/config-lgsm/dabserver/_default.cfg
index 62e3acf99..3d5015808 100644
--- a/lgsm/config-default/config-lgsm/dabserver/_default.cfg
+++ b/lgsm/config-default/config-lgsm/dabserver/_default.cfg
@@ -78,11 +78,13 @@ slackwebhook="webhook"
 
 # Telegram Alerts | https://docs.linuxgsm.com/alerts/telegram
 # You can add a custom cURL string eg proxy (useful in Russia) in "curlcustomstring".
-# For example "--socks5 ipaddr:port" for socks5 proxy see more in "curl --help".
+# For example "--socks5 ipaddr:port" for socks5 proxy see more in "curl --help all".
 telegramapi="api.telegram.org"
 telegramalert="off"
 telegramtoken="accesstoken"
 telegramchatid=""
+telegramthreadid=""
+telegramsilentnotification="false"
 curlcustomstring=""
 
 ## Updating | https://docs.linuxgsm.com/commands/update
diff --git a/lgsm/config-default/config-lgsm/dayzserver/_default.cfg b/lgsm/config-default/config-lgsm/dayzserver/_default.cfg
index 82901c2cd..f09d23c23 100644
--- a/lgsm/config-default/config-lgsm/dayzserver/_default.cfg
+++ b/lgsm/config-default/config-lgsm/dayzserver/_default.cfg
@@ -93,11 +93,13 @@ slackwebhook="webhook"
 
 # Telegram Alerts | https://docs.linuxgsm.com/alerts/telegram
 # You can add a custom cURL string eg proxy (useful in Russia) in "curlcustomstring".
-# For example "--socks5 ipaddr:port" for socks5 proxy see more in "curl --help".
+# For example "--socks5 ipaddr:port" for socks5 proxy see more in "curl --help all".
 telegramapi="api.telegram.org"
 telegramalert="off"
 telegramtoken="accesstoken"
 telegramchatid=""
+telegramthreadid=""
+telegramsilentnotification="false"
 curlcustomstring=""
 
 ## Updating | https://docs.linuxgsm.com/commands/update
diff --git a/lgsm/config-default/config-lgsm/dmcserver/_default.cfg b/lgsm/config-default/config-lgsm/dmcserver/_default.cfg
index 5f56a842c..3d74fca4d 100644
--- a/lgsm/config-default/config-lgsm/dmcserver/_default.cfg
+++ b/lgsm/config-default/config-lgsm/dmcserver/_default.cfg
@@ -77,11 +77,13 @@ slackwebhook="webhook"
 
 # Telegram Alerts | https://docs.linuxgsm.com/alerts/telegram
 # You can add a custom cURL string eg proxy (useful in Russia) in "curlcustomstring".
-# For example "--socks5 ipaddr:port" for socks5 proxy see more in "curl --help".
+# For example "--socks5 ipaddr:port" for socks5 proxy see more in "curl --help all".
 telegramapi="api.telegram.org"
 telegramalert="off"
 telegramtoken="accesstoken"
 telegramchatid=""
+telegramthreadid=""
+telegramsilentnotification="false"
 curlcustomstring=""
 
 ## Updating | https://docs.linuxgsm.com/commands/update
diff --git a/lgsm/config-default/config-lgsm/dodrserver/_default.cfg b/lgsm/config-default/config-lgsm/dodrserver/_default.cfg
index 555a1a007..0565b94e9 100644
--- a/lgsm/config-default/config-lgsm/dodrserver/_default.cfg
+++ b/lgsm/config-default/config-lgsm/dodrserver/_default.cfg
@@ -76,11 +76,13 @@ slackwebhook="webhook"
 
 # Telegram Alerts | https://docs.linuxgsm.com/alerts/telegram
 # You can add a custom cURL string eg proxy (useful in Russia) in "curlcustomstring".
-# For example "--socks5 ipaddr:port" for socks5 proxy see more in "curl --help".
+# For example "--socks5 ipaddr:port" for socks5 proxy see more in "curl --help all".
 telegramapi="api.telegram.org"
 telegramalert="off"
 telegramtoken="accesstoken"
 telegramchatid=""
+telegramthreadid=""
+telegramsilentnotification="false"
 curlcustomstring=""
 
 ## Updating | https://docs.linuxgsm.com/commands/update
diff --git a/lgsm/config-default/config-lgsm/dodserver/_default.cfg b/lgsm/config-default/config-lgsm/dodserver/_default.cfg
index 61700d621..e2419289a 100644
--- a/lgsm/config-default/config-lgsm/dodserver/_default.cfg
+++ b/lgsm/config-default/config-lgsm/dodserver/_default.cfg
@@ -77,11 +77,13 @@ slackwebhook="webhook"
 
 # Telegram Alerts | https://docs.linuxgsm.com/alerts/telegram
 # You can add a custom cURL string eg proxy (useful in Russia) in "curlcustomstring".
-# For example "--socks5 ipaddr:port" for socks5 proxy see more in "curl --help".
+# For example "--socks5 ipaddr:port" for socks5 proxy see more in "curl --help all".
 telegramapi="api.telegram.org"
 telegramalert="off"
 telegramtoken="accesstoken"
 telegramchatid=""
+telegramthreadid=""
+telegramsilentnotification="false"
 curlcustomstring=""
 
 ## Updating | https://docs.linuxgsm.com/commands/update
diff --git a/lgsm/config-default/config-lgsm/dodsserver/_default.cfg b/lgsm/config-default/config-lgsm/dodsserver/_default.cfg
index 390f87b70..b6973f0a7 100644
--- a/lgsm/config-default/config-lgsm/dodsserver/_default.cfg
+++ b/lgsm/config-default/config-lgsm/dodsserver/_default.cfg
@@ -78,11 +78,13 @@ slackwebhook="webhook"
 
 # Telegram Alerts | https://docs.linuxgsm.com/alerts/telegram
 # You can add a custom cURL string eg proxy (useful in Russia) in "curlcustomstring".
-# For example "--socks5 ipaddr:port" for socks5 proxy see more in "curl --help".
+# For example "--socks5 ipaddr:port" for socks5 proxy see more in "curl --help all".
 telegramapi="api.telegram.org"
 telegramalert="off"
 telegramtoken="accesstoken"
 telegramchatid=""
+telegramthreadid=""
+telegramsilentnotification="false"
 curlcustomstring=""
 
 ## Updating | https://docs.linuxgsm.com/commands/update
diff --git a/lgsm/config-default/config-lgsm/doiserver/_default.cfg b/lgsm/config-default/config-lgsm/doiserver/_default.cfg
index 6aa10ee9b..9a06b7b02 100644
--- a/lgsm/config-default/config-lgsm/doiserver/_default.cfg
+++ b/lgsm/config-default/config-lgsm/doiserver/_default.cfg
@@ -79,11 +79,13 @@ slackwebhook="webhook"
 
 # Telegram Alerts | https://docs.linuxgsm.com/alerts/telegram
 # You can add a custom cURL string eg proxy (useful in Russia) in "curlcustomstring".
-# For example "--socks5 ipaddr:port" for socks5 proxy see more in "curl --help".
+# For example "--socks5 ipaddr:port" for socks5 proxy see more in "curl --help all".
 telegramapi="api.telegram.org"
 telegramalert="off"
 telegramtoken="accesstoken"
 telegramchatid=""
+telegramthreadid=""
+telegramsilentnotification="false"
 curlcustomstring=""
 
 ## Updating | https://docs.linuxgsm.com/commands/update
diff --git a/lgsm/config-default/config-lgsm/dstserver/_default.cfg b/lgsm/config-default/config-lgsm/dstserver/_default.cfg
index d757ea732..2c8de8bd4 100644
--- a/lgsm/config-default/config-lgsm/dstserver/_default.cfg
+++ b/lgsm/config-default/config-lgsm/dstserver/_default.cfg
@@ -80,11 +80,13 @@ slackwebhook="webhook"
 
 # Telegram Alerts | https://docs.linuxgsm.com/alerts/telegram
 # You can add a custom cURL string eg proxy (useful in Russia) in "curlcustomstring".
-# For example "--socks5 ipaddr:port" for socks5 proxy see more in "curl --help".
+# For example "--socks5 ipaddr:port" for socks5 proxy see more in "curl --help all".
 telegramapi="api.telegram.org"
 telegramalert="off"
 telegramtoken="accesstoken"
 telegramchatid=""
+telegramthreadid=""
+telegramsilentnotification="false"
 curlcustomstring=""
 
 ## Updating | https://docs.linuxgsm.com/commands/update
diff --git a/lgsm/config-default/config-lgsm/dysserver/_default.cfg b/lgsm/config-default/config-lgsm/dysserver/_default.cfg
index eb1861c7d..fcb37c41a 100644
--- a/lgsm/config-default/config-lgsm/dysserver/_default.cfg
+++ b/lgsm/config-default/config-lgsm/dysserver/_default.cfg
@@ -83,11 +83,13 @@ slackwebhook="webhook"
 
 # Telegram Alerts | https://docs.linuxgsm.com/alerts/telegram
 # You can add a custom cURL string eg proxy (useful in Russia) in "curlcustomstring".
-# For example "--socks5 ipaddr:port" for socks5 proxy see more in "curl --help".
+# For example "--socks5 ipaddr:port" for socks5 proxy see more in "curl --help all".
 telegramapi="api.telegram.org"
 telegramalert="off"
 telegramtoken="accesstoken"
 telegramchatid=""
+telegramthreadid=""
+telegramsilentnotification="false"
 curlcustomstring=""
 
 ## Updating | https://docs.linuxgsm.com/commands/update
diff --git a/lgsm/config-default/config-lgsm/ecoserver/_default.cfg b/lgsm/config-default/config-lgsm/ecoserver/_default.cfg
index 794a6ed69..c08f37072 100644
--- a/lgsm/config-default/config-lgsm/ecoserver/_default.cfg
+++ b/lgsm/config-default/config-lgsm/ecoserver/_default.cfg
@@ -70,11 +70,13 @@ slackwebhook="webhook"
 
 # Telegram Alerts | https://docs.linuxgsm.com/alerts/telegram
 # You can add a custom cURL string eg proxy (useful in Russia) in "curlcustomstring".
-# For example "--socks5 ipaddr:port" for socks5 proxy see more in "curl --help".
+# For example "--socks5 ipaddr:port" for socks5 proxy see more in "curl --help all".
 telegramapi="api.telegram.org"
 telegramalert="off"
 telegramtoken="accesstoken"
 telegramchatid=""
+telegramthreadid=""
+telegramsilentnotification="false"
 curlcustomstring=""
 
 ## Updating | https://docs.linuxgsm.com/commands/update
diff --git a/lgsm/config-default/config-lgsm/emserver/_default.cfg b/lgsm/config-default/config-lgsm/emserver/_default.cfg
index 1610d0816..1762e5175 100644
--- a/lgsm/config-default/config-lgsm/emserver/_default.cfg
+++ b/lgsm/config-default/config-lgsm/emserver/_default.cfg
@@ -83,11 +83,13 @@ slackwebhook="webhook"
 
 # Telegram Alerts | https://docs.linuxgsm.com/alerts/telegram
 # You can add a custom cURL string eg proxy (useful in Russia) in "curlcustomstring".
-# For example "--socks5 ipaddr:port" for socks5 proxy see more in "curl --help".
+# For example "--socks5 ipaddr:port" for socks5 proxy see more in "curl --help all".
 telegramapi="api.telegram.org"
 telegramalert="off"
 telegramtoken="accesstoken"
 telegramchatid=""
+telegramthreadid=""
+telegramsilentnotification="false"
 curlcustomstring=""
 
 ## Updating | https://docs.linuxgsm.com/commands/update
diff --git a/lgsm/config-default/config-lgsm/etlserver/_default.cfg b/lgsm/config-default/config-lgsm/etlserver/_default.cfg
index 18d6d302f..11a408fb8 100644
--- a/lgsm/config-default/config-lgsm/etlserver/_default.cfg
+++ b/lgsm/config-default/config-lgsm/etlserver/_default.cfg
@@ -70,11 +70,13 @@ slackwebhook="webhook"
 
 # Telegram Alerts | https://docs.linuxgsm.com/alerts/telegram
 # You can add a custom cURL string eg proxy (useful in Russia) in "curlcustomstring".
-# For example "--socks5 ipaddr:port" for socks5 proxy see more in "curl --help".
+# For example "--socks5 ipaddr:port" for socks5 proxy see more in "curl --help all".
 telegramapi="api.telegram.org"
 telegramalert="off"
 telegramtoken="accesstoken"
 telegramchatid=""
+telegramthreadid=""
+telegramsilentnotification="false"
 curlcustomstring=""
 
 ## Backup | https://docs.linuxgsm.com/commands/backup
diff --git a/lgsm/config-default/config-lgsm/ets2server/_default.cfg b/lgsm/config-default/config-lgsm/ets2server/_default.cfg
index 24462bc45..6abe98fb3 100644
--- a/lgsm/config-default/config-lgsm/ets2server/_default.cfg
+++ b/lgsm/config-default/config-lgsm/ets2server/_default.cfg
@@ -70,11 +70,13 @@ slackwebhook="webhook"
 
 # Telegram Alerts | https://docs.linuxgsm.com/alerts/telegram
 # You can add a custom cURL string eg proxy (useful in Russia) in "curlcustomstring".
-# For example "--socks5 ipaddr:port" for socks5 proxy see more in "curl --help".
+# For example "--socks5 ipaddr:port" for socks5 proxy see more in "curl --help all".
 telegramapi="api.telegram.org"
 telegramalert="off"
 telegramtoken="accesstoken"
 telegramchatid=""
+telegramthreadid=""
+telegramsilentnotification="false"
 curlcustomstring=""
 
 ## Updating | https://docs.linuxgsm.com/commands/update
diff --git a/lgsm/config-default/config-lgsm/fctrserver/_default.cfg b/lgsm/config-default/config-lgsm/fctrserver/_default.cfg
index d77284d5e..284fafaec 100644
--- a/lgsm/config-default/config-lgsm/fctrserver/_default.cfg
+++ b/lgsm/config-default/config-lgsm/fctrserver/_default.cfg
@@ -77,11 +77,13 @@ slackwebhook="webhook"
 
 # Telegram Alerts | https://docs.linuxgsm.com/alerts/telegram
 # You can add a custom cURL string eg proxy (useful in Russia) in "curlcustomstring".
-# For example "--socks5 ipaddr:port" for socks5 proxy see more in "curl --help".
+# For example "--socks5 ipaddr:port" for socks5 proxy see more in "curl --help all".
 telegramapi="api.telegram.org"
 telegramalert="off"
 telegramtoken="accesstoken"
 telegramchatid=""
+telegramthreadid=""
+telegramsilentnotification="false"
 curlcustomstring=""
 
 ## Updating | https://docs.linuxgsm.com/commands/update
diff --git a/lgsm/config-default/config-lgsm/fofserver/_default.cfg b/lgsm/config-default/config-lgsm/fofserver/_default.cfg
index 1f7ef0168..7ce630310 100644
--- a/lgsm/config-default/config-lgsm/fofserver/_default.cfg
+++ b/lgsm/config-default/config-lgsm/fofserver/_default.cfg
@@ -78,11 +78,13 @@ slackwebhook="webhook"
 
 # Telegram Alerts | https://docs.linuxgsm.com/alerts/telegram
 # You can add a custom cURL string eg proxy (useful in Russia) in "curlcustomstring".
-# For example "--socks5 ipaddr:port" for socks5 proxy see more in "curl --help".
+# For example "--socks5 ipaddr:port" for socks5 proxy see more in "curl --help all".
 telegramapi="api.telegram.org"
 telegramalert="off"
 telegramtoken="accesstoken"
 telegramchatid=""
+telegramthreadid=""
+telegramsilentnotification="false"
 curlcustomstring=""
 
 ## Updating | https://docs.linuxgsm.com/commands/update
diff --git a/lgsm/config-default/config-lgsm/gmodserver/_default.cfg b/lgsm/config-default/config-lgsm/gmodserver/_default.cfg
index 01ea819f2..2cc683d20 100644
--- a/lgsm/config-default/config-lgsm/gmodserver/_default.cfg
+++ b/lgsm/config-default/config-lgsm/gmodserver/_default.cfg
@@ -88,11 +88,13 @@ slackwebhook="webhook"
 
 # Telegram Alerts | https://docs.linuxgsm.com/alerts/telegram
 # You can add a custom cURL string eg proxy (useful in Russia) in "curlcustomstring".
-# For example "--socks5 ipaddr:port" for socks5 proxy see more in "curl --help".
+# For example "--socks5 ipaddr:port" for socks5 proxy see more in "curl --help all".
 telegramapi="api.telegram.org"
 telegramalert="off"
 telegramtoken="accesstoken"
 telegramchatid=""
+telegramthreadid=""
+telegramsilentnotification="false"
 curlcustomstring=""
 
 ## Updating | https://docs.linuxgsm.com/commands/update
diff --git a/lgsm/config-default/config-lgsm/hcuserver/_default.cfg b/lgsm/config-default/config-lgsm/hcuserver/_default.cfg
index 67deef669..0925fe384 100644
--- a/lgsm/config-default/config-lgsm/hcuserver/_default.cfg
+++ b/lgsm/config-default/config-lgsm/hcuserver/_default.cfg
@@ -85,11 +85,13 @@ slackwebhook="webhook"
 
 # Telegram Alerts | https://docs.linuxgsm.com/alerts/telegram
 # You can add a custom cURL string eg proxy (useful in Russia) in "curlcustomstring".
-# For example "--socks5 ipaddr:port" for socks5 proxy see more in "curl --help".
+# For example "--socks5 ipaddr:port" for socks5 proxy see more in "curl --help all".
 telegramapi="api.telegram.org"
 telegramalert="off"
 telegramtoken="accesstoken"
 telegramchatid=""
+telegramthreadid=""
+telegramsilentnotification="false"
 curlcustomstring=""
 
 ## Updating | https://docs.linuxgsm.com/commands/update
diff --git a/lgsm/config-default/config-lgsm/hl2dmserver/_default.cfg b/lgsm/config-default/config-lgsm/hl2dmserver/_default.cfg
index cdbbfb168..c429a6c8e 100644
--- a/lgsm/config-default/config-lgsm/hl2dmserver/_default.cfg
+++ b/lgsm/config-default/config-lgsm/hl2dmserver/_default.cfg
@@ -78,11 +78,13 @@ slackwebhook="webhook"
 
 # Telegram Alerts | https://docs.linuxgsm.com/alerts/telegram
 # You can add a custom cURL string eg proxy (useful in Russia) in "curlcustomstring".
-# For example "--socks5 ipaddr:port" for socks5 proxy see more in "curl --help".
+# For example "--socks5 ipaddr:port" for socks5 proxy see more in "curl --help all".
 telegramapi="api.telegram.org"
 telegramalert="off"
 telegramtoken="accesstoken"
 telegramchatid=""
+telegramthreadid=""
+telegramsilentnotification="false"
 curlcustomstring=""
 
 ## Updating | https://docs.linuxgsm.com/commands/update
diff --git a/lgsm/config-default/config-lgsm/hldmserver/_default.cfg b/lgsm/config-default/config-lgsm/hldmserver/_default.cfg
index f69d56c34..3bddb128e 100644
--- a/lgsm/config-default/config-lgsm/hldmserver/_default.cfg
+++ b/lgsm/config-default/config-lgsm/hldmserver/_default.cfg
@@ -77,11 +77,13 @@ slackwebhook="webhook"
 
 # Telegram Alerts | https://docs.linuxgsm.com/alerts/telegram
 # You can add a custom cURL string eg proxy (useful in Russia) in "curlcustomstring".
-# For example "--socks5 ipaddr:port" for socks5 proxy see more in "curl --help".
+# For example "--socks5 ipaddr:port" for socks5 proxy see more in "curl --help all".
 telegramapi="api.telegram.org"
 telegramalert="off"
 telegramtoken="accesstoken"
 telegramchatid=""
+telegramthreadid=""
+telegramsilentnotification="false"
 curlcustomstring=""
 
 ## Updating | https://docs.linuxgsm.com/commands/update
diff --git a/lgsm/config-default/config-lgsm/hldmsserver/_default.cfg b/lgsm/config-default/config-lgsm/hldmsserver/_default.cfg
index 0baf4f955..74321c1f4 100644
--- a/lgsm/config-default/config-lgsm/hldmsserver/_default.cfg
+++ b/lgsm/config-default/config-lgsm/hldmsserver/_default.cfg
@@ -78,11 +78,13 @@ slackwebhook="webhook"
 
 # Telegram Alerts | https://docs.linuxgsm.com/alerts/telegram
 # You can add a custom cURL string eg proxy (useful in Russia) in "curlcustomstring".
-# For example "--socks5 ipaddr:port" for socks5 proxy see more in "curl --help".
+# For example "--socks5 ipaddr:port" for socks5 proxy see more in "curl --help all".
 telegramapi="api.telegram.org"
 telegramalert="off"
 telegramtoken="accesstoken"
 telegramchatid=""
+telegramthreadid=""
+telegramsilentnotification="false"
 curlcustomstring=""
 
 ## Updating | https://docs.linuxgsm.com/commands/update
diff --git a/lgsm/config-default/config-lgsm/hwserver/_default.cfg b/lgsm/config-default/config-lgsm/hwserver/_default.cfg
index a353064c8..7fe1a4969 100644
--- a/lgsm/config-default/config-lgsm/hwserver/_default.cfg
+++ b/lgsm/config-default/config-lgsm/hwserver/_default.cfg
@@ -88,11 +88,13 @@ slackwebhook="webhook"
 
 # Telegram Alerts | https://docs.linuxgsm.com/alerts/telegram
 # You can add a custom cURL string eg proxy (useful in Russia) in "curlcustomstring".
-# For example "--socks5 ipaddr:port" for socks5 proxy see more in "curl --help".
+# For example "--socks5 ipaddr:port" for socks5 proxy see more in "curl --help all".
 telegramapi="api.telegram.org"
 telegramalert="off"
 telegramtoken="accesstoken"
 telegramchatid=""
+telegramthreadid=""
+telegramsilentnotification="false"
 curlcustomstring=""
 
 ## Updating | https://docs.linuxgsm.com/commands/update
diff --git a/lgsm/config-default/config-lgsm/insserver/_default.cfg b/lgsm/config-default/config-lgsm/insserver/_default.cfg
index b41fb2491..cd1d13029 100644
--- a/lgsm/config-default/config-lgsm/insserver/_default.cfg
+++ b/lgsm/config-default/config-lgsm/insserver/_default.cfg
@@ -84,11 +84,13 @@ slackwebhook="webhook"
 
 # Telegram Alerts | https://docs.linuxgsm.com/alerts/telegram
 # You can add a custom cURL string eg proxy (useful in Russia) in "curlcustomstring".
-# For example "--socks5 ipaddr:port" for socks5 proxy see more in "curl --help".
+# For example "--socks5 ipaddr:port" for socks5 proxy see more in "curl --help all".
 telegramapi="api.telegram.org"
 telegramalert="off"
 telegramtoken="accesstoken"
 telegramchatid=""
+telegramthreadid=""
+telegramsilentnotification="false"
 curlcustomstring=""
 
 ## Updating | https://docs.linuxgsm.com/commands/update
diff --git a/lgsm/config-default/config-lgsm/inssserver/_default.cfg b/lgsm/config-default/config-lgsm/inssserver/_default.cfg
index d4d485d68..4049e5e11 100644
--- a/lgsm/config-default/config-lgsm/inssserver/_default.cfg
+++ b/lgsm/config-default/config-lgsm/inssserver/_default.cfg
@@ -87,11 +87,13 @@ slackwebhook="webhook"
 
 # Telegram Alerts | https://docs.linuxgsm.com/alerts/telegram
 # You can add a custom cURL string eg proxy (useful in Russia) in "curlcustomstring".
-# For example "--socks5 ipaddr:port" for socks5 proxy see more in "curl --help".
+# For example "--socks5 ipaddr:port" for socks5 proxy see more in "curl --help all".
 telegramapi="api.telegram.org"
 telegramalert="off"
 telegramtoken="accesstoken"
 telegramchatid=""
+telegramthreadid=""
+telegramsilentnotification="false"
 curlcustomstring=""
 
 ## Updating | https://docs.linuxgsm.com/commands/update
diff --git a/lgsm/config-default/config-lgsm/iosserver/_default.cfg b/lgsm/config-default/config-lgsm/iosserver/_default.cfg
index bcc35e483..ff6764d0b 100644
--- a/lgsm/config-default/config-lgsm/iosserver/_default.cfg
+++ b/lgsm/config-default/config-lgsm/iosserver/_default.cfg
@@ -78,11 +78,13 @@ slackwebhook="webhook"
 
 # Telegram Alerts | https://docs.linuxgsm.com/alerts/telegram
 # You can add a custom cURL string eg proxy (useful in Russia) in "curlcustomstring".
-# For example "--socks5 ipaddr:port" for socks5 proxy see more in "curl --help".
+# For example "--socks5 ipaddr:port" for socks5 proxy see more in "curl --help all".
 telegramapi="api.telegram.org"
 telegramalert="off"
 telegramtoken="accesstoken"
 telegramchatid=""
+telegramthreadid=""
+telegramsilentnotification="false"
 curlcustomstring=""
 
 ## Updating | https://docs.linuxgsm.com/commands/update
diff --git a/lgsm/config-default/config-lgsm/jc2server/_default.cfg b/lgsm/config-default/config-lgsm/jc2server/_default.cfg
index da9b4f40a..5a82bbad9 100644
--- a/lgsm/config-default/config-lgsm/jc2server/_default.cfg
+++ b/lgsm/config-default/config-lgsm/jc2server/_default.cfg
@@ -70,11 +70,13 @@ slackwebhook="webhook"
 
 # Telegram Alerts | https://docs.linuxgsm.com/alerts/telegram
 # You can add a custom cURL string eg proxy (useful in Russia) in "curlcustomstring".
-# For example "--socks5 ipaddr:port" for socks5 proxy see more in "curl --help".
+# For example "--socks5 ipaddr:port" for socks5 proxy see more in "curl --help all".
 telegramapi="api.telegram.org"
 telegramalert="off"
 telegramtoken="accesstoken"
 telegramchatid=""
+telegramthreadid=""
+telegramsilentnotification="false"
 curlcustomstring=""
 
 ## Updating | https://docs.linuxgsm.com/commands/update
diff --git a/lgsm/config-default/config-lgsm/jc3server/_default.cfg b/lgsm/config-default/config-lgsm/jc3server/_default.cfg
index 9c902f476..62d9cd4ab 100644
--- a/lgsm/config-default/config-lgsm/jc3server/_default.cfg
+++ b/lgsm/config-default/config-lgsm/jc3server/_default.cfg
@@ -70,11 +70,13 @@ slackwebhook="webhook"
 
 # Telegram Alerts | https://docs.linuxgsm.com/alerts/telegram
 # You can add a custom cURL string eg proxy (useful in Russia) in "curlcustomstring".
-# For example "--socks5 ipaddr:port" for socks5 proxy see more in "curl --help".
+# For example "--socks5 ipaddr:port" for socks5 proxy see more in "curl --help all".
 telegramapi="api.telegram.org"
 telegramalert="off"
 telegramtoken="accesstoken"
 telegramchatid=""
+telegramthreadid=""
+telegramsilentnotification="false"
 curlcustomstring=""
 
 ## Updating | https://docs.linuxgsm.com/commands/update
diff --git a/lgsm/config-default/config-lgsm/jk2server/_default.cfg b/lgsm/config-default/config-lgsm/jk2server/_default.cfg
index d14b052c2..f238c45fe 100644
--- a/lgsm/config-default/config-lgsm/jk2server/_default.cfg
+++ b/lgsm/config-default/config-lgsm/jk2server/_default.cfg
@@ -79,11 +79,13 @@ slackwebhook="webhook"
 
 # Telegram Alerts | https://docs.linuxgsm.com/alerts/telegram
 # You can add a custom cURL string eg proxy (useful in Russia) in "curlcustomstring".
-# For example "--socks5 ipaddr:port" for socks5 proxy see more in "curl --help".
+# For example "--socks5 ipaddr:port" for socks5 proxy see more in "curl --help all".
 telegramapi="api.telegram.org"
 telegramalert="off"
 telegramtoken="accesstoken"
 telegramchatid=""
+telegramthreadid=""
+telegramsilentnotification="false"
 curlcustomstring=""
 
 ## Updating | https://docs.linuxgsm.com/commands/update
diff --git a/lgsm/config-default/config-lgsm/kf2server/_default.cfg b/lgsm/config-default/config-lgsm/kf2server/_default.cfg
index 9ca4a096c..8f44458cd 100644
--- a/lgsm/config-default/config-lgsm/kf2server/_default.cfg
+++ b/lgsm/config-default/config-lgsm/kf2server/_default.cfg
@@ -76,11 +76,13 @@ slackwebhook="webhook"
 
 # Telegram Alerts | https://docs.linuxgsm.com/alerts/telegram
 # You can add a custom cURL string eg proxy (useful in Russia) in "curlcustomstring".
-# For example "--socks5 ipaddr:port" for socks5 proxy see more in "curl --help".
+# For example "--socks5 ipaddr:port" for socks5 proxy see more in "curl --help all".
 telegramapi="api.telegram.org"
 telegramalert="off"
 telegramtoken="accesstoken"
 telegramchatid=""
+telegramthreadid=""
+telegramsilentnotification="false"
 curlcustomstring=""
 
 ## Updating | https://docs.linuxgsm.com/commands/update
diff --git a/lgsm/config-default/config-lgsm/kfserver/_default.cfg b/lgsm/config-default/config-lgsm/kfserver/_default.cfg
index 969c5c65c..d9df57d3e 100644
--- a/lgsm/config-default/config-lgsm/kfserver/_default.cfg
+++ b/lgsm/config-default/config-lgsm/kfserver/_default.cfg
@@ -82,11 +82,13 @@ slackwebhook="webhook"
 
 # Telegram Alerts | https://docs.linuxgsm.com/alerts/telegram
 # You can add a custom cURL string eg proxy (useful in Russia) in "curlcustomstring".
-# For example "--socks5 ipaddr:port" for socks5 proxy see more in "curl --help".
+# For example "--socks5 ipaddr:port" for socks5 proxy see more in "curl --help all".
 telegramapi="api.telegram.org"
 telegramalert="off"
 telegramtoken="accesstoken"
 telegramchatid=""
+telegramthreadid=""
+telegramsilentnotification="false"
 curlcustomstring=""
 
 ## Updating | https://docs.linuxgsm.com/commands/update
diff --git a/lgsm/config-default/config-lgsm/l4d2server/_default.cfg b/lgsm/config-default/config-lgsm/l4d2server/_default.cfg
index 676a72360..a37ef4eb4 100644
--- a/lgsm/config-default/config-lgsm/l4d2server/_default.cfg
+++ b/lgsm/config-default/config-lgsm/l4d2server/_default.cfg
@@ -77,11 +77,13 @@ slackwebhook="webhook"
 
 # Telegram Alerts | https://docs.linuxgsm.com/alerts/telegram
 # You can add a custom cURL string eg proxy (useful in Russia) in "curlcustomstring".
-# For example "--socks5 ipaddr:port" for socks5 proxy see more in "curl --help".
+# For example "--socks5 ipaddr:port" for socks5 proxy see more in "curl --help all".
 telegramapi="api.telegram.org"
 telegramalert="off"
 telegramtoken="accesstoken"
 telegramchatid=""
+telegramthreadid=""
+telegramsilentnotification="false"
 curlcustomstring=""
 
 ## Updating | https://docs.linuxgsm.com/commands/update
diff --git a/lgsm/config-default/config-lgsm/l4dserver/_default.cfg b/lgsm/config-default/config-lgsm/l4dserver/_default.cfg
index cf1f641ec..dc22bc871 100644
--- a/lgsm/config-default/config-lgsm/l4dserver/_default.cfg
+++ b/lgsm/config-default/config-lgsm/l4dserver/_default.cfg
@@ -77,11 +77,13 @@ slackwebhook="webhook"
 
 # Telegram Alerts | https://docs.linuxgsm.com/alerts/telegram
 # You can add a custom cURL string eg proxy (useful in Russia) in "curlcustomstring".
-# For example "--socks5 ipaddr:port" for socks5 proxy see more in "curl --help".
+# For example "--socks5 ipaddr:port" for socks5 proxy see more in "curl --help all".
 telegramapi="api.telegram.org"
 telegramalert="off"
 telegramtoken="accesstoken"
 telegramchatid=""
+telegramthreadid=""
+telegramsilentnotification="false"
 curlcustomstring=""
 
 ## Updating | https://docs.linuxgsm.com/commands/update
diff --git a/lgsm/config-default/config-lgsm/mcbserver/_default.cfg b/lgsm/config-default/config-lgsm/mcbserver/_default.cfg
index db2bbf86d..d7171a3f6 100644
--- a/lgsm/config-default/config-lgsm/mcbserver/_default.cfg
+++ b/lgsm/config-default/config-lgsm/mcbserver/_default.cfg
@@ -73,11 +73,13 @@ slackwebhook="webhook"
 
 # Telegram Alerts | https://docs.linuxgsm.com/alerts/telegram
 # You can add a custom cURL string eg proxy (useful in Russia) in "curlcustomstring".
-# For example "--socks5 ipaddr:port" for socks5 proxy see more in "curl --help".
+# For example "--socks5 ipaddr:port" for socks5 proxy see more in "curl --help all".
 telegramapi="api.telegram.org"
 telegramalert="off"
 telegramtoken="accesstoken"
 telegramchatid=""
+telegramthreadid=""
+telegramsilentnotification="false"
 curlcustomstring=""
 
 ## Updating | https://docs.linuxgsm.com/commands/update
diff --git a/lgsm/config-default/config-lgsm/mcserver/_default.cfg b/lgsm/config-default/config-lgsm/mcserver/_default.cfg
index b6f923ade..1288fab95 100644
--- a/lgsm/config-default/config-lgsm/mcserver/_default.cfg
+++ b/lgsm/config-default/config-lgsm/mcserver/_default.cfg
@@ -79,11 +79,13 @@ slackwebhook="webhook"
 
 # Telegram Alerts | https://docs.linuxgsm.com/alerts/telegram
 # You can add a custom cURL string eg proxy (useful in Russia) in "curlcustomstring".
-# For example "--socks5 ipaddr:port" for socks5 proxy see more in "curl --help".
+# For example "--socks5 ipaddr:port" for socks5 proxy see more in "curl --help all".
 telegramapi="api.telegram.org"
 telegramalert="off"
 telegramtoken="accesstoken"
 telegramchatid=""
+telegramthreadid=""
+telegramsilentnotification="false"
 curlcustomstring=""
 
 ## Updating | https://docs.linuxgsm.com/commands/update
diff --git a/lgsm/config-default/config-lgsm/mhserver/_default.cfg b/lgsm/config-default/config-lgsm/mhserver/_default.cfg
index 399d7c96b..197440ab2 100644
--- a/lgsm/config-default/config-lgsm/mhserver/_default.cfg
+++ b/lgsm/config-default/config-lgsm/mhserver/_default.cfg
@@ -79,11 +79,13 @@ slackwebhook="webhook"
 
 # Telegram Alerts | https://docs.linuxgsm.com/alerts/telegram
 # You can add a custom cURL string eg proxy (useful in Russia) in "curlcustomstring".
-# For example "--socks5 ipaddr:port" for socks5 proxy see more in "curl --help".
+# For example "--socks5 ipaddr:port" for socks5 proxy see more in "curl --help all".
 telegramapi="api.telegram.org"
 telegramalert="off"
 telegramtoken="accesstoken"
 telegramchatid=""
+telegramthreadid=""
+telegramsilentnotification="false"
 curlcustomstring=""
 
 ## Updating | https://docs.linuxgsm.com/commands/update
diff --git a/lgsm/config-default/config-lgsm/mohaaserver/_default.cfg b/lgsm/config-default/config-lgsm/mohaaserver/_default.cfg
index a53e55bfc..dfd87335c 100644
--- a/lgsm/config-default/config-lgsm/mohaaserver/_default.cfg
+++ b/lgsm/config-default/config-lgsm/mohaaserver/_default.cfg
@@ -75,11 +75,13 @@ slackwebhook="webhook"
 
 # Telegram Alerts | https://docs.linuxgsm.com/alerts/telegram
 # You can add a custom cURL string eg proxy (useful in Russia) in "curlcustomstring".
-# For example "--socks5 ipaddr:port" for socks5 proxy see more in "curl --help".
+# For example "--socks5 ipaddr:port" for socks5 proxy see more in "curl --help all".
 telegramapi="api.telegram.org"
 telegramalert="off"
 telegramtoken="accesstoken"
 telegramchatid=""
+telegramthreadid=""
+telegramsilentnotification="false"
 curlcustomstring=""
 
 ## Backup | https://docs.linuxgsm.com/commands/backup
diff --git a/lgsm/config-default/config-lgsm/momserver/_default.cfg b/lgsm/config-default/config-lgsm/momserver/_default.cfg
index e9b743c00..5834670c9 100644
--- a/lgsm/config-default/config-lgsm/momserver/_default.cfg
+++ b/lgsm/config-default/config-lgsm/momserver/_default.cfg
@@ -76,11 +76,13 @@ slackwebhook="webhook"
 
 # Telegram Alerts | https://docs.linuxgsm.com/alerts/telegram
 # You can add a custom cURL string eg proxy (useful in Russia) in "curlcustomstring".
-# For example "--socks5 ipaddr:port" for socks5 proxy see more in "curl --help".
+# For example "--socks5 ipaddr:port" for socks5 proxy see more in "curl --help all".
 telegramapi="api.telegram.org"
 telegramalert="off"
 telegramtoken="accesstoken"
 telegramchatid=""
+telegramthreadid=""
+telegramsilentnotification="false"
 curlcustomstring=""
 
 ## Updating | https://docs.linuxgsm.com/commands/update
diff --git a/lgsm/config-default/config-lgsm/mtaserver/_default.cfg b/lgsm/config-default/config-lgsm/mtaserver/_default.cfg
index ff40ffa67..d1880ef89 100644
--- a/lgsm/config-default/config-lgsm/mtaserver/_default.cfg
+++ b/lgsm/config-default/config-lgsm/mtaserver/_default.cfg
@@ -73,11 +73,13 @@ slackwebhook="webhook"
 
 # Telegram Alerts | https://docs.linuxgsm.com/alerts/telegram
 # You can add a custom cURL string eg proxy (useful in Russia) in "curlcustomstring".
-# For example "--socks5 ipaddr:port" for socks5 proxy see more in "curl --help".
+# For example "--socks5 ipaddr:port" for socks5 proxy see more in "curl --help all".
 telegramapi="api.telegram.org"
 telegramalert="off"
 telegramtoken="accesstoken"
 telegramchatid=""
+telegramthreadid=""
+telegramsilentnotification="false"
 curlcustomstring=""
 
 ## Backup | https://docs.linuxgsm.com/commands/backup
diff --git a/lgsm/config-default/config-lgsm/ndserver/_default.cfg b/lgsm/config-default/config-lgsm/ndserver/_default.cfg
index fcf1caffb..249556af4 100644
--- a/lgsm/config-default/config-lgsm/ndserver/_default.cfg
+++ b/lgsm/config-default/config-lgsm/ndserver/_default.cfg
@@ -78,11 +78,13 @@ slackwebhook="webhook"
 
 # Telegram Alerts | https://docs.linuxgsm.com/alerts/telegram
 # You can add a custom cURL string eg proxy (useful in Russia) in "curlcustomstring".
-# For example "--socks5 ipaddr:port" for socks5 proxy see more in "curl --help".
+# For example "--socks5 ipaddr:port" for socks5 proxy see more in "curl --help all".
 telegramapi="api.telegram.org"
 telegramalert="off"
 telegramtoken="accesstoken"
 telegramchatid=""
+telegramthreadid=""
+telegramsilentnotification="false"
 curlcustomstring=""
 
 ## Updating | https://docs.linuxgsm.com/commands/update
diff --git a/lgsm/config-default/config-lgsm/necserver/_default.cfg b/lgsm/config-default/config-lgsm/necserver/_default.cfg
index 993572b34..8062f8d5f 100644
--- a/lgsm/config-default/config-lgsm/necserver/_default.cfg
+++ b/lgsm/config-default/config-lgsm/necserver/_default.cfg
@@ -73,11 +73,13 @@ slackwebhook="webhook"
 
 # Telegram Alerts | https://docs.linuxgsm.com/alerts/telegram
 # You can add a custom cURL string eg proxy (useful in Russia) in "curlcustomstring".
-# For example "--socks5 ipaddr:port" for socks5 proxy see more in "curl --help".
+# For example "--socks5 ipaddr:port" for socks5 proxy see more in "curl --help all".
 telegramapi="api.telegram.org"
 telegramalert="off"
 telegramtoken="accesstoken"
 telegramchatid=""
+telegramthreadid=""
+telegramsilentnotification="false"
 curlcustomstring=""
 
 ## Updating | https://docs.linuxgsm.com/commands/update
diff --git a/lgsm/config-default/config-lgsm/nmrihserver/_default.cfg b/lgsm/config-default/config-lgsm/nmrihserver/_default.cfg
index f3b740a3b..8757caa6c 100644
--- a/lgsm/config-default/config-lgsm/nmrihserver/_default.cfg
+++ b/lgsm/config-default/config-lgsm/nmrihserver/_default.cfg
@@ -83,11 +83,13 @@ slackwebhook="webhook"
 
 # Telegram Alerts | https://docs.linuxgsm.com/alerts/telegram
 # You can add a custom cURL string eg proxy (useful in Russia) in "curlcustomstring".
-# For example "--socks5 ipaddr:port" for socks5 proxy see more in "curl --help".
+# For example "--socks5 ipaddr:port" for socks5 proxy see more in "curl --help all".
 telegramapi="api.telegram.org"
 telegramalert="off"
 telegramtoken="accesstoken"
 telegramchatid=""
+telegramthreadid=""
+telegramsilentnotification="false"
 curlcustomstring=""
 
 ## Updating | https://docs.linuxgsm.com/commands/update
diff --git a/lgsm/config-default/config-lgsm/ns2cserver/_default.cfg b/lgsm/config-default/config-lgsm/ns2cserver/_default.cfg
index 5fa692c08..2f8f47af5 100644
--- a/lgsm/config-default/config-lgsm/ns2cserver/_default.cfg
+++ b/lgsm/config-default/config-lgsm/ns2cserver/_default.cfg
@@ -85,11 +85,13 @@ slackwebhook="webhook"
 
 # Telegram Alerts | https://docs.linuxgsm.com/alerts/telegram
 # You can add a custom cURL string eg proxy (useful in Russia) in "curlcustomstring".
-# For example "--socks5 ipaddr:port" for socks5 proxy see more in "curl --help".
+# For example "--socks5 ipaddr:port" for socks5 proxy see more in "curl --help all".
 telegramapi="api.telegram.org"
 telegramalert="off"
 telegramtoken="accesstoken"
 telegramchatid=""
+telegramthreadid=""
+telegramsilentnotification="false"
 curlcustomstring=""
 
 ## Updating | https://docs.linuxgsm.com/commands/update
diff --git a/lgsm/config-default/config-lgsm/ns2server/_default.cfg b/lgsm/config-default/config-lgsm/ns2server/_default.cfg
index 41970a2f4..9cec798da 100644
--- a/lgsm/config-default/config-lgsm/ns2server/_default.cfg
+++ b/lgsm/config-default/config-lgsm/ns2server/_default.cfg
@@ -86,11 +86,13 @@ slackwebhook="webhook"
 
 # Telegram Alerts | https://docs.linuxgsm.com/alerts/telegram
 # You can add a custom cURL string eg proxy (useful in Russia) in "curlcustomstring".
-# For example "--socks5 ipaddr:port" for socks5 proxy see more in "curl --help".
+# For example "--socks5 ipaddr:port" for socks5 proxy see more in "curl --help all".
 telegramapi="api.telegram.org"
 telegramalert="off"
 telegramtoken="accesstoken"
 telegramchatid=""
+telegramthreadid=""
+telegramsilentnotification="false"
 curlcustomstring=""
 
 ## Updating | https://docs.linuxgsm.com/commands/update
diff --git a/lgsm/config-default/config-lgsm/nsserver/_default.cfg b/lgsm/config-default/config-lgsm/nsserver/_default.cfg
index c207a0a10..367878519 100644
--- a/lgsm/config-default/config-lgsm/nsserver/_default.cfg
+++ b/lgsm/config-default/config-lgsm/nsserver/_default.cfg
@@ -77,11 +77,13 @@ slackwebhook="webhook"
 
 # Telegram Alerts | https://docs.linuxgsm.com/alerts/telegram
 # You can add a custom cURL string eg proxy (useful in Russia) in "curlcustomstring".
-# For example "--socks5 ipaddr:port" for socks5 proxy see more in "curl --help".
+# For example "--socks5 ipaddr:port" for socks5 proxy see more in "curl --help all".
 telegramapi="api.telegram.org"
 telegramalert="off"
 telegramtoken="accesstoken"
 telegramchatid=""
+telegramthreadid=""
+telegramsilentnotification="false"
 curlcustomstring=""
 
 ## Updating | https://docs.linuxgsm.com/commands/update
diff --git a/lgsm/config-default/config-lgsm/ohdserver/_default.cfg b/lgsm/config-default/config-lgsm/ohdserver/_default.cfg
index 9eaf0d4a5..26bc3a30c 100644
--- a/lgsm/config-default/config-lgsm/ohdserver/_default.cfg
+++ b/lgsm/config-default/config-lgsm/ohdserver/_default.cfg
@@ -80,11 +80,13 @@ slackwebhook="webhook"
 
 # Telegram Alerts | https://docs.linuxgsm.com/alerts/telegram
 # You can add a custom cURL string eg proxy (useful in Russia) in "curlcustomstring".
-# For example "--socks5 ipaddr:port" for socks5 proxy see more in "curl --help".
+# For example "--socks5 ipaddr:port" for socks5 proxy see more in "curl --help all".
 telegramapi="api.telegram.org"
 telegramalert="off"
 telegramtoken="accesstoken"
 telegramchatid=""
+telegramthreadid=""
+telegramsilentnotification="false"
 curlcustomstring=""
 
 ## Updating | https://docs.linuxgsm.com/commands/update
diff --git a/lgsm/config-default/config-lgsm/onsetserver/_default.cfg b/lgsm/config-default/config-lgsm/onsetserver/_default.cfg
index 39fc4005c..0103ef069 100644
--- a/lgsm/config-default/config-lgsm/onsetserver/_default.cfg
+++ b/lgsm/config-default/config-lgsm/onsetserver/_default.cfg
@@ -71,11 +71,13 @@ slackwebhook="webhook"
 
 # Telegram Alerts | https://docs.linuxgsm.com/alerts/telegram
 # You can add a custom cURL string eg proxy (useful in Russia) in "curlcustomstring".
-# For example "--socks5 ipaddr:port" for socks5 proxy see more in "curl --help".
+# For example "--socks5 ipaddr:port" for socks5 proxy see more in "curl --help all".
 telegramapi="api.telegram.org"
 telegramalert="off"
 telegramtoken="accesstoken"
 telegramchatid=""
+telegramthreadid=""
+telegramsilentnotification="false"
 curlcustomstring=""
 
 ## Updating | https://docs.linuxgsm.com/commands/update
diff --git a/lgsm/config-default/config-lgsm/opforserver/_default.cfg b/lgsm/config-default/config-lgsm/opforserver/_default.cfg
index 8ba202b14..93d00fc5c 100644
--- a/lgsm/config-default/config-lgsm/opforserver/_default.cfg
+++ b/lgsm/config-default/config-lgsm/opforserver/_default.cfg
@@ -77,11 +77,13 @@ slackwebhook="webhook"
 
 # Telegram Alerts | https://docs.linuxgsm.com/alerts/telegram
 # You can add a custom cURL string eg proxy (useful in Russia) in "curlcustomstring".
-# For example "--socks5 ipaddr:port" for socks5 proxy see more in "curl --help".
+# For example "--socks5 ipaddr:port" for socks5 proxy see more in "curl --help all".
 telegramapi="api.telegram.org"
 telegramalert="off"
 telegramtoken="accesstoken"
 telegramchatid=""
+telegramthreadid=""
+telegramsilentnotification="false"
 curlcustomstring=""
 
 ## Updating | https://docs.linuxgsm.com/commands/update
diff --git a/lgsm/config-default/config-lgsm/pc2server/_default.cfg b/lgsm/config-default/config-lgsm/pc2server/_default.cfg
index b55447802..d4e6ce1d6 100644
--- a/lgsm/config-default/config-lgsm/pc2server/_default.cfg
+++ b/lgsm/config-default/config-lgsm/pc2server/_default.cfg
@@ -74,11 +74,13 @@ slackwebhook="webhook"
 
 # Telegram Alerts | https://docs.linuxgsm.com/alerts/telegram
 # You can add a custom cURL string eg proxy (useful in Russia) in "curlcustomstring".
-# For example "--socks5 ipaddr:port" for socks5 proxy see more in "curl --help".
+# For example "--socks5 ipaddr:port" for socks5 proxy see more in "curl --help all".
 telegramapi="api.telegram.org"
 telegramalert="off"
 telegramtoken="accesstoken"
 telegramchatid=""
+telegramthreadid=""
+telegramsilentnotification="false"
 curlcustomstring=""
 
 ## Updating | https://docs.linuxgsm.com/commands/update
diff --git a/lgsm/config-default/config-lgsm/pcserver/_default.cfg b/lgsm/config-default/config-lgsm/pcserver/_default.cfg
index 2c1514488..c36dfaac6 100644
--- a/lgsm/config-default/config-lgsm/pcserver/_default.cfg
+++ b/lgsm/config-default/config-lgsm/pcserver/_default.cfg
@@ -70,11 +70,13 @@ slackwebhook="webhook"
 
 # Telegram Alerts | https://docs.linuxgsm.com/alerts/telegram
 # You can add a custom cURL string eg proxy (useful in Russia) in "curlcustomstring".
-# For example "--socks5 ipaddr:port" for socks5 proxy see more in "curl --help".
+# For example "--socks5 ipaddr:port" for socks5 proxy see more in "curl --help all".
 telegramapi="api.telegram.org"
 telegramalert="off"
 telegramtoken="accesstoken"
 telegramchatid=""
+telegramthreadid=""
+telegramsilentnotification="false"
 curlcustomstring=""
 
 ## Updating | https://docs.linuxgsm.com/commands/update
diff --git a/lgsm/config-default/config-lgsm/pmcserver/_default.cfg b/lgsm/config-default/config-lgsm/pmcserver/_default.cfg
index 57838ad98..74e0e7e18 100644
--- a/lgsm/config-default/config-lgsm/pmcserver/_default.cfg
+++ b/lgsm/config-default/config-lgsm/pmcserver/_default.cfg
@@ -77,11 +77,13 @@ slackwebhook="webhook"
 
 # Telegram Alerts | https://docs.linuxgsm.com/alerts/telegram
 # You can add a custom cURL string eg proxy (useful in Russia) in "curlcustomstring".
-# For example "--socks5 ipaddr:port" for socks5 proxy see more in "curl --help".
+# For example "--socks5 ipaddr:port" for socks5 proxy see more in "curl --help all".
 telegramapi="api.telegram.org"
 telegramalert="off"
 telegramtoken="accesstoken"
 telegramchatid=""
+telegramthreadid=""
+telegramsilentnotification="false"
 curlcustomstring=""
 
 ## Updating | https://docs.linuxgsm.com/commands/update
diff --git a/lgsm/config-default/config-lgsm/psserver/_default.cfg b/lgsm/config-default/config-lgsm/psserver/_default.cfg
index e41dee19c..80d991f94 100644
--- a/lgsm/config-default/config-lgsm/psserver/_default.cfg
+++ b/lgsm/config-default/config-lgsm/psserver/_default.cfg
@@ -75,11 +75,13 @@ slackwebhook="webhook"
 
 # Telegram Alerts | https://docs.linuxgsm.com/alerts/telegram
 # You can add a custom cURL string eg proxy (useful in Russia) in "curlcustomstring".
-# For example "--socks5 ipaddr:port" for socks5 proxy see more in "curl --help".
+# For example "--socks5 ipaddr:port" for socks5 proxy see more in "curl --help all".
 telegramapi="api.telegram.org"
 telegramalert="off"
 telegramtoken="accesstoken"
 telegramchatid=""
+telegramthreadid=""
+telegramsilentnotification="false"
 curlcustomstring=""
 
 ## Updating | https://docs.linuxgsm.com/commands/update
diff --git a/lgsm/config-default/config-lgsm/pvkiiserver/_default.cfg b/lgsm/config-default/config-lgsm/pvkiiserver/_default.cfg
index 0565f806a..1e2ca3660 100644
--- a/lgsm/config-default/config-lgsm/pvkiiserver/_default.cfg
+++ b/lgsm/config-default/config-lgsm/pvkiiserver/_default.cfg
@@ -78,11 +78,13 @@ slackwebhook="webhook"
 
 # Telegram Alerts | https://docs.linuxgsm.com/alerts/telegram
 # You can add a custom cURL string eg proxy (useful in Russia) in "curlcustomstring".
-# For example "--socks5 ipaddr:port" for socks5 proxy see more in "curl --help".
+# For example "--socks5 ipaddr:port" for socks5 proxy see more in "curl --help all".
 telegramapi="api.telegram.org"
 telegramalert="off"
 telegramtoken="accesstoken"
 telegramchatid=""
+telegramthreadid=""
+telegramsilentnotification="false"
 curlcustomstring=""
 
 ## Updating | https://docs.linuxgsm.com/commands/update
diff --git a/lgsm/config-default/config-lgsm/pvrserver/_default.cfg b/lgsm/config-default/config-lgsm/pvrserver/_default.cfg
index 2cffabe71..374da3dd1 100644
--- a/lgsm/config-default/config-lgsm/pvrserver/_default.cfg
+++ b/lgsm/config-default/config-lgsm/pvrserver/_default.cfg
@@ -79,11 +79,13 @@ slackwebhook="webhook"
 
 # Telegram Alerts | https://docs.linuxgsm.com/alerts/telegram
 # You can add a custom cURL string eg proxy (useful in Russia) in "curlcustomstring".
-# For example "--socks5 ipaddr:port" for socks5 proxy see more in "curl --help".
+# For example "--socks5 ipaddr:port" for socks5 proxy see more in "curl --help all".
 telegramapi="api.telegram.org"
 telegramalert="off"
 telegramtoken="accesstoken"
 telegramchatid=""
+telegramthreadid=""
+telegramsilentnotification="false"
 curlcustomstring=""
 
 ## Updating | https://docs.linuxgsm.com/commands/update
diff --git a/lgsm/config-default/config-lgsm/pwserver/_default.cfg b/lgsm/config-default/config-lgsm/pwserver/_default.cfg
index 03ad83d9e..e069ec1b1 100644
--- a/lgsm/config-default/config-lgsm/pwserver/_default.cfg
+++ b/lgsm/config-default/config-lgsm/pwserver/_default.cfg
@@ -78,11 +78,13 @@ slackwebhook="webhook"
 
 # Telegram Alerts | https://docs.linuxgsm.com/alerts/telegram
 # You can add a custom cURL string eg proxy (useful in Russia) in "curlcustomstring".
-# For example "--socks5 ipaddr:port" for socks5 proxy see more in "curl --help".
+# For example "--socks5 ipaddr:port" for socks5 proxy see more in "curl --help all".
 telegramapi="api.telegram.org"
 telegramalert="off"
 telegramtoken="accesstoken"
 telegramchatid=""
+telegramthreadid=""
+telegramsilentnotification="false"
 curlcustomstring=""
 
 ## Updating | https://docs.linuxgsm.com/commands/update
diff --git a/lgsm/config-default/config-lgsm/pzserver/_default.cfg b/lgsm/config-default/config-lgsm/pzserver/_default.cfg
index 5a34c04bc..f830d7cc4 100644
--- a/lgsm/config-default/config-lgsm/pzserver/_default.cfg
+++ b/lgsm/config-default/config-lgsm/pzserver/_default.cfg
@@ -74,11 +74,13 @@ slackwebhook="webhook"
 
 # Telegram Alerts | https://docs.linuxgsm.com/alerts/telegram
 # You can add a custom cURL string eg proxy (useful in Russia) in "curlcustomstring".
-# For example "--socks5 ipaddr:port" for socks5 proxy see more in "curl --help".
+# For example "--socks5 ipaddr:port" for socks5 proxy see more in "curl --help all".
 telegramapi="api.telegram.org"
 telegramalert="off"
 telegramtoken="accesstoken"
 telegramchatid=""
+telegramthreadid=""
+telegramsilentnotification="false"
 curlcustomstring=""
 
 ## Updating | https://docs.linuxgsm.com/commands/update
diff --git a/lgsm/config-default/config-lgsm/q2server/_default.cfg b/lgsm/config-default/config-lgsm/q2server/_default.cfg
index b92c36c38..79820d650 100644
--- a/lgsm/config-default/config-lgsm/q2server/_default.cfg
+++ b/lgsm/config-default/config-lgsm/q2server/_default.cfg
@@ -75,11 +75,13 @@ slackwebhook="webhook"
 
 # Telegram Alerts | https://docs.linuxgsm.com/alerts/telegram
 # You can add a custom cURL string eg proxy (useful in Russia) in "curlcustomstring".
-# For example "--socks5 ipaddr:port" for socks5 proxy see more in "curl --help".
+# For example "--socks5 ipaddr:port" for socks5 proxy see more in "curl --help all".
 telegramapi="api.telegram.org"
 telegramalert="off"
 telegramtoken="accesstoken"
 telegramchatid=""
+telegramthreadid=""
+telegramsilentnotification="false"
 curlcustomstring=""
 
 ## Backup | https://docs.linuxgsm.com/commands/backup
diff --git a/lgsm/config-default/config-lgsm/q3server/_default.cfg b/lgsm/config-default/config-lgsm/q3server/_default.cfg
index 0a54d2852..74b0d11f3 100644
--- a/lgsm/config-default/config-lgsm/q3server/_default.cfg
+++ b/lgsm/config-default/config-lgsm/q3server/_default.cfg
@@ -75,11 +75,13 @@ slackwebhook="webhook"
 
 # Telegram Alerts | https://docs.linuxgsm.com/alerts/telegram
 # You can add a custom cURL string eg proxy (useful in Russia) in "curlcustomstring".
-# For example "--socks5 ipaddr:port" for socks5 proxy see more in "curl --help".
+# For example "--socks5 ipaddr:port" for socks5 proxy see more in "curl --help all".
 telegramapi="api.telegram.org"
 telegramalert="off"
 telegramtoken="accesstoken"
 telegramchatid=""
+telegramthreadid=""
+telegramsilentnotification="false"
 curlcustomstring=""
 
 ## Backup | https://docs.linuxgsm.com/commands/backup
diff --git a/lgsm/config-default/config-lgsm/q4server/_default.cfg b/lgsm/config-default/config-lgsm/q4server/_default.cfg
index ffd311e3c..d07828e9f 100644
--- a/lgsm/config-default/config-lgsm/q4server/_default.cfg
+++ b/lgsm/config-default/config-lgsm/q4server/_default.cfg
@@ -77,11 +77,13 @@ slackwebhook="webhook"
 
 # Telegram Alerts | https://docs.linuxgsm.com/alerts/telegram
 # You can add a custom cURL string eg proxy (useful in Russia) in "curlcustomstring".
-# For example "--socks5 ipaddr:port" for socks5 proxy see more in "curl --help".
+# For example "--socks5 ipaddr:port" for socks5 proxy see more in "curl --help all".
 telegramapi="api.telegram.org"
 telegramalert="off"
 telegramtoken="accesstoken"
 telegramchatid=""
+telegramthreadid=""
+telegramsilentnotification="false"
 curlcustomstring=""
 
 ## Updating | https://docs.linuxgsm.com/commands/update
diff --git a/lgsm/config-default/config-lgsm/qlserver/_default.cfg b/lgsm/config-default/config-lgsm/qlserver/_default.cfg
index 5d5614a02..84631b765 100644
--- a/lgsm/config-default/config-lgsm/qlserver/_default.cfg
+++ b/lgsm/config-default/config-lgsm/qlserver/_default.cfg
@@ -70,11 +70,13 @@ slackwebhook="webhook"
 
 # Telegram Alerts | https://docs.linuxgsm.com/alerts/telegram
 # You can add a custom cURL string eg proxy (useful in Russia) in "curlcustomstring".
-# For example "--socks5 ipaddr:port" for socks5 proxy see more in "curl --help".
+# For example "--socks5 ipaddr:port" for socks5 proxy see more in "curl --help all".
 telegramapi="api.telegram.org"
 telegramalert="off"
 telegramtoken="accesstoken"
 telegramchatid=""
+telegramthreadid=""
+telegramsilentnotification="false"
 curlcustomstring=""
 
 ## Updating | https://docs.linuxgsm.com/commands/update
diff --git a/lgsm/config-default/config-lgsm/qwserver/_default.cfg b/lgsm/config-default/config-lgsm/qwserver/_default.cfg
index 63d554f27..620943c3e 100644
--- a/lgsm/config-default/config-lgsm/qwserver/_default.cfg
+++ b/lgsm/config-default/config-lgsm/qwserver/_default.cfg
@@ -74,11 +74,13 @@ slackwebhook="webhook"
 
 # Telegram Alerts | https://docs.linuxgsm.com/alerts/telegram
 # You can add a custom cURL string eg proxy (useful in Russia) in "curlcustomstring".
-# For example "--socks5 ipaddr:port" for socks5 proxy see more in "curl --help".
+# For example "--socks5 ipaddr:port" for socks5 proxy see more in "curl --help all".
 telegramapi="api.telegram.org"
 telegramalert="off"
 telegramtoken="accesstoken"
 telegramchatid=""
+telegramthreadid=""
+telegramsilentnotification="false"
 curlcustomstring=""
 
 ## Backup | https://docs.linuxgsm.com/commands/backup
diff --git a/lgsm/config-default/config-lgsm/ricochetserver/_default.cfg b/lgsm/config-default/config-lgsm/ricochetserver/_default.cfg
index 36845b0a2..bb1957de0 100644
--- a/lgsm/config-default/config-lgsm/ricochetserver/_default.cfg
+++ b/lgsm/config-default/config-lgsm/ricochetserver/_default.cfg
@@ -77,11 +77,13 @@ slackwebhook="webhook"
 
 # Telegram Alerts | https://docs.linuxgsm.com/alerts/telegram
 # You can add a custom cURL string eg proxy (useful in Russia) in "curlcustomstring".
-# For example "--socks5 ipaddr:port" for socks5 proxy see more in "curl --help".
+# For example "--socks5 ipaddr:port" for socks5 proxy see more in "curl --help all".
 telegramapi="api.telegram.org"
 telegramalert="off"
 telegramtoken="accesstoken"
 telegramchatid=""
+telegramthreadid=""
+telegramsilentnotification="false"
 curlcustomstring=""
 
 ## Updating | https://docs.linuxgsm.com/commands/update
diff --git a/lgsm/config-default/config-lgsm/roserver/_default.cfg b/lgsm/config-default/config-lgsm/roserver/_default.cfg
index 1a95add2a..c000f6181 100644
--- a/lgsm/config-default/config-lgsm/roserver/_default.cfg
+++ b/lgsm/config-default/config-lgsm/roserver/_default.cfg
@@ -78,11 +78,13 @@ slackwebhook="webhook"
 
 # Telegram Alerts | https://docs.linuxgsm.com/alerts/telegram
 # You can add a custom cURL string eg proxy (useful in Russia) in "curlcustomstring".
-# For example "--socks5 ipaddr:port" for socks5 proxy see more in "curl --help".
+# For example "--socks5 ipaddr:port" for socks5 proxy see more in "curl --help all".
 telegramapi="api.telegram.org"
 telegramalert="off"
 telegramtoken="accesstoken"
 telegramchatid=""
+telegramthreadid=""
+telegramsilentnotification="false"
 curlcustomstring=""
 
 ## Updating | https://docs.linuxgsm.com/commands/update
diff --git a/lgsm/config-default/config-lgsm/rtcwserver/_default.cfg b/lgsm/config-default/config-lgsm/rtcwserver/_default.cfg
index d62dcb048..9011bbced 100644
--- a/lgsm/config-default/config-lgsm/rtcwserver/_default.cfg
+++ b/lgsm/config-default/config-lgsm/rtcwserver/_default.cfg
@@ -75,11 +75,13 @@ slackwebhook="webhook"
 
 # Telegram Alerts | https://docs.linuxgsm.com/alerts/telegram
 # You can add a custom cURL string eg proxy (useful in Russia) in "curlcustomstring".
-# For example "--socks5 ipaddr:port" for socks5 proxy see more in "curl --help".
+# For example "--socks5 ipaddr:port" for socks5 proxy see more in "curl --help all".
 telegramapi="api.telegram.org"
 telegramalert="off"
 telegramtoken="accesstoken"
 telegramchatid=""
+telegramthreadid=""
+telegramsilentnotification="false"
 curlcustomstring=""
 
 ## Backup | https://docs.linuxgsm.com/commands/backup
diff --git a/lgsm/config-default/config-lgsm/rustserver/_default.cfg b/lgsm/config-default/config-lgsm/rustserver/_default.cfg
index 071d9d008..cf609a84c 100644
--- a/lgsm/config-default/config-lgsm/rustserver/_default.cfg
+++ b/lgsm/config-default/config-lgsm/rustserver/_default.cfg
@@ -90,11 +90,13 @@ slackwebhook="webhook"
 
 # Telegram Alerts | https://docs.linuxgsm.com/alerts/telegram
 # You can add a custom cURL string eg proxy (useful in Russia) in "curlcustomstring".
-# For example "--socks5 ipaddr:port" for socks5 proxy see more in "curl --help".
+# For example "--socks5 ipaddr:port" for socks5 proxy see more in "curl --help all".
 telegramapi="api.telegram.org"
 telegramalert="off"
 telegramtoken="accesstoken"
 telegramchatid=""
+telegramthreadid=""
+telegramsilentnotification="false"
 curlcustomstring=""
 
 ## Updating | https://docs.linuxgsm.com/commands/update
diff --git a/lgsm/config-default/config-lgsm/rwserver/_default.cfg b/lgsm/config-default/config-lgsm/rwserver/_default.cfg
index 9a798c66c..9523dd63b 100644
--- a/lgsm/config-default/config-lgsm/rwserver/_default.cfg
+++ b/lgsm/config-default/config-lgsm/rwserver/_default.cfg
@@ -70,11 +70,13 @@ slackwebhook="webhook"
 
 # Telegram Alerts | https://docs.linuxgsm.com/alerts/telegram
 # You can add a custom cURL string eg proxy (useful in Russia) in "curlcustomstring".
-# For example "--socks5 ipaddr:port" for socks5 proxy see more in "curl --help".
+# For example "--socks5 ipaddr:port" for socks5 proxy see more in "curl --help all".
 telegramapi="api.telegram.org"
 telegramalert="off"
 telegramtoken="accesstoken"
 telegramchatid=""
+telegramthreadid=""
+telegramsilentnotification="false"
 curlcustomstring=""
 
 ## Updating | https://docs.linuxgsm.com/commands/update
diff --git a/lgsm/config-default/config-lgsm/sampserver/_default.cfg b/lgsm/config-default/config-lgsm/sampserver/_default.cfg
index 0888064ba..870603bb0 100644
--- a/lgsm/config-default/config-lgsm/sampserver/_default.cfg
+++ b/lgsm/config-default/config-lgsm/sampserver/_default.cfg
@@ -74,11 +74,13 @@ slackwebhook="webhook"
 
 # Telegram Alerts | https://docs.linuxgsm.com/alerts/telegram
 # You can add a custom cURL string eg proxy (useful in Russia) in "curlcustomstring".
-# For example "--socks5 ipaddr:port" for socks5 proxy see more in "curl --help".
+# For example "--socks5 ipaddr:port" for socks5 proxy see more in "curl --help all".
 telegramapi="api.telegram.org"
 telegramalert="off"
 telegramtoken="accesstoken"
 telegramchatid=""
+telegramthreadid=""
+telegramsilentnotification="false"
 curlcustomstring=""
 
 ## Backup | https://docs.linuxgsm.com/commands/backup
diff --git a/lgsm/config-default/config-lgsm/sbotsserver/_default.cfg b/lgsm/config-default/config-lgsm/sbotsserver/_default.cfg
index 3c6e3412e..82d651ec3 100644
--- a/lgsm/config-default/config-lgsm/sbotsserver/_default.cfg
+++ b/lgsm/config-default/config-lgsm/sbotsserver/_default.cfg
@@ -76,11 +76,13 @@ slackwebhook="webhook"
 
 # Telegram Alerts | https://docs.linuxgsm.com/alerts/telegram
 # You can add a custom cURL string eg proxy (useful in Russia) in "curlcustomstring".
-# For example "--socks5 ipaddr:port" for socks5 proxy see more in "curl --help".
+# For example "--socks5 ipaddr:port" for socks5 proxy see more in "curl --help all".
 telegramapi="api.telegram.org"
 telegramalert="off"
 telegramtoken="accesstoken"
 telegramchatid=""
+telegramthreadid=""
+telegramsilentnotification="false"
 curlcustomstring=""
 
 ## Updating | https://docs.linuxgsm.com/commands/update
diff --git a/lgsm/config-default/config-lgsm/sbserver/_default.cfg b/lgsm/config-default/config-lgsm/sbserver/_default.cfg
index 6032abe06..3d06b4235 100644
--- a/lgsm/config-default/config-lgsm/sbserver/_default.cfg
+++ b/lgsm/config-default/config-lgsm/sbserver/_default.cfg
@@ -77,11 +77,13 @@ slackwebhook="webhook"
 
 # Telegram Alerts | https://docs.linuxgsm.com/alerts/telegram
 # You can add a custom cURL string eg proxy (useful in Russia) in "curlcustomstring".
-# For example "--socks5 ipaddr:port" for socks5 proxy see more in "curl --help".
+# For example "--socks5 ipaddr:port" for socks5 proxy see more in "curl --help all".
 telegramapi="api.telegram.org"
 telegramalert="off"
 telegramtoken="accesstoken"
 telegramchatid=""
+telegramthreadid=""
+telegramsilentnotification="false"
 curlcustomstring=""
 
 ## Updating | https://docs.linuxgsm.com/commands/update
diff --git a/lgsm/config-default/config-lgsm/scpslserver/_default.cfg b/lgsm/config-default/config-lgsm/scpslserver/_default.cfg
index f00574bd8..237bbebe3 100644
--- a/lgsm/config-default/config-lgsm/scpslserver/_default.cfg
+++ b/lgsm/config-default/config-lgsm/scpslserver/_default.cfg
@@ -75,11 +75,13 @@ slackwebhook="webhook"
 
 # Telegram Alerts | https://docs.linuxgsm.com/alerts/telegram
 # You can add a custom cURL string eg proxy (useful in Russia) in "curlcustomstring".
-# For example "--socks5 ipaddr:port" for socks5 proxy see more in "curl --help".
+# For example "--socks5 ipaddr:port" for socks5 proxy see more in "curl --help all".
 telegramapi="api.telegram.org"
 telegramalert="off"
 telegramtoken="accesstoken"
 telegramchatid=""
+telegramthreadid=""
+telegramsilentnotification="false"
 curlcustomstring=""
 
 ## Updating | https://docs.linuxgsm.com/commands/update
diff --git a/lgsm/config-default/config-lgsm/scpslsmserver/_default.cfg b/lgsm/config-default/config-lgsm/scpslsmserver/_default.cfg
index bb26d6ca6..e54814df2 100644
--- a/lgsm/config-default/config-lgsm/scpslsmserver/_default.cfg
+++ b/lgsm/config-default/config-lgsm/scpslsmserver/_default.cfg
@@ -75,11 +75,13 @@ slackwebhook="webhook"
 
 # Telegram Alerts | https://docs.linuxgsm.com/alerts/telegram
 # You can add a custom cURL string eg proxy (useful in Russia) in "curlcustomstring".
-# For example "--socks5 ipaddr:port" for socks5 proxy see more in "curl --help".
+# For example "--socks5 ipaddr:port" for socks5 proxy see more in "curl --help all".
 telegramapi="api.telegram.org"
 telegramalert="off"
 telegramtoken="accesstoken"
 telegramchatid=""
+telegramthreadid=""
+telegramsilentnotification="false"
 curlcustomstring=""
 
 ## Updating | https://docs.linuxgsm.com/commands/update
diff --git a/lgsm/config-default/config-lgsm/sdtdserver/_default.cfg b/lgsm/config-default/config-lgsm/sdtdserver/_default.cfg
index 24cd2c0ac..0a091dae4 100644
--- a/lgsm/config-default/config-lgsm/sdtdserver/_default.cfg
+++ b/lgsm/config-default/config-lgsm/sdtdserver/_default.cfg
@@ -73,11 +73,13 @@ slackwebhook="webhook"
 
 # Telegram Alerts | https://docs.linuxgsm.com/alerts/telegram
 # You can add a custom cURL string eg proxy (useful in Russia) in "curlcustomstring".
-# For example "--socks5 ipaddr:port" for socks5 proxy see more in "curl --help".
+# For example "--socks5 ipaddr:port" for socks5 proxy see more in "curl --help all".
 telegramapi="api.telegram.org"
 telegramalert="off"
 telegramtoken="accesstoken"
 telegramchatid=""
+telegramthreadid=""
+telegramsilentnotification="false"
 curlcustomstring=""
 
 ## Updating | https://docs.linuxgsm.com/commands/update
diff --git a/lgsm/config-default/config-lgsm/sfcserver/_default.cfg b/lgsm/config-default/config-lgsm/sfcserver/_default.cfg
index 40c5a0c18..831f92353 100644
--- a/lgsm/config-default/config-lgsm/sfcserver/_default.cfg
+++ b/lgsm/config-default/config-lgsm/sfcserver/_default.cfg
@@ -78,11 +78,13 @@ slackwebhook="webhook"
 
 # Telegram Alerts | https://docs.linuxgsm.com/alerts/telegram
 # You can add a custom cURL string eg proxy (useful in Russia) in "curlcustomstring".
-# For example "--socks5 ipaddr:port" for socks5 proxy see more in "curl --help".
+# For example "--socks5 ipaddr:port" for socks5 proxy see more in "curl --help all".
 telegramapi="api.telegram.org"
 telegramalert="off"
 telegramtoken="accesstoken"
 telegramchatid=""
+telegramthreadid=""
+telegramsilentnotification="false"
 curlcustomstring=""
 
 ## Updating | https://docs.linuxgsm.com/commands/update
diff --git a/lgsm/config-default/config-lgsm/sfserver/_default.cfg b/lgsm/config-default/config-lgsm/sfserver/_default.cfg
index f889b4866..65930bfc1 100644
--- a/lgsm/config-default/config-lgsm/sfserver/_default.cfg
+++ b/lgsm/config-default/config-lgsm/sfserver/_default.cfg
@@ -77,11 +77,13 @@ slackwebhook="webhook"
 
 # Telegram Alerts | https://docs.linuxgsm.com/alerts/telegram
 # You can add a custom cURL string eg proxy (useful in Russia) in "curlcustomstring".
-# For example "--socks5 ipaddr:port" for socks5 proxy see more in "curl --help".
+# For example "--socks5 ipaddr:port" for socks5 proxy see more in "curl --help all".
 telegramapi="api.telegram.org"
 telegramalert="off"
 telegramtoken="accesstoken"
 telegramchatid=""
+telegramthreadid=""
+telegramsilentnotification="false"
 curlcustomstring=""
 
 ## Updating | https://docs.linuxgsm.com/commands/update
diff --git a/lgsm/config-default/config-lgsm/sof2server/_default.cfg b/lgsm/config-default/config-lgsm/sof2server/_default.cfg
index 59fb8373b..e00afefa1 100644
--- a/lgsm/config-default/config-lgsm/sof2server/_default.cfg
+++ b/lgsm/config-default/config-lgsm/sof2server/_default.cfg
@@ -75,11 +75,13 @@ slackwebhook="webhook"
 
 # Telegram Alerts | https://docs.linuxgsm.com/alerts/telegram
 # You can add a custom cURL string eg proxy (useful in Russia) in "curlcustomstring".
-# For example "--socks5 ipaddr:port" for socks5 proxy see more in "curl --help".
+# For example "--socks5 ipaddr:port" for socks5 proxy see more in "curl --help all".
 telegramapi="api.telegram.org"
 telegramalert="off"
 telegramtoken="accesstoken"
 telegramchatid=""
+telegramthreadid=""
+telegramsilentnotification="false"
 curlcustomstring=""
 
 ## Backup | https://docs.linuxgsm.com/commands/backup
diff --git a/lgsm/config-default/config-lgsm/solserver/_default.cfg b/lgsm/config-default/config-lgsm/solserver/_default.cfg
index 601018529..8581104dd 100644
--- a/lgsm/config-default/config-lgsm/solserver/_default.cfg
+++ b/lgsm/config-default/config-lgsm/solserver/_default.cfg
@@ -74,11 +74,13 @@ slackwebhook="webhook"
 
 # Telegram Alerts | https://docs.linuxgsm.com/alerts/telegram
 # You can add a custom cURL string eg proxy (useful in Russia) in "curlcustomstring".
-# For example "--socks5 ipaddr:port" for socks5 proxy see more in "curl --help".
+# For example "--socks5 ipaddr:port" for socks5 proxy see more in "curl --help all".
 telegramapi="api.telegram.org"
 telegramalert="off"
 telegramtoken="accesstoken"
 telegramchatid=""
+telegramthreadid=""
+telegramsilentnotification="false"
 curlcustomstring=""
 
 ## Updating | https://docs.linuxgsm.com/commands/update
diff --git a/lgsm/config-default/config-lgsm/squadserver/_default.cfg b/lgsm/config-default/config-lgsm/squadserver/_default.cfg
index 55bc2bf44..99b91b538 100644
--- a/lgsm/config-default/config-lgsm/squadserver/_default.cfg
+++ b/lgsm/config-default/config-lgsm/squadserver/_default.cfg
@@ -75,11 +75,13 @@ slackwebhook="webhook"
 
 # Telegram Alerts | https://docs.linuxgsm.com/alerts/telegram
 # You can add a custom cURL string eg proxy (useful in Russia) in "curlcustomstring".
-# For example "--socks5 ipaddr:port" for socks5 proxy see more in "curl --help".
+# For example "--socks5 ipaddr:port" for socks5 proxy see more in "curl --help all".
 telegramapi="api.telegram.org"
 telegramalert="off"
 telegramtoken="accesstoken"
 telegramchatid=""
+telegramthreadid=""
+telegramsilentnotification="false"
 curlcustomstring=""
 
 ## Updating | https://docs.linuxgsm.com/commands/update
diff --git a/lgsm/config-default/config-lgsm/stnserver/_default.cfg b/lgsm/config-default/config-lgsm/stnserver/_default.cfg
index 7bf2d7234..70c7d290c 100644
--- a/lgsm/config-default/config-lgsm/stnserver/_default.cfg
+++ b/lgsm/config-default/config-lgsm/stnserver/_default.cfg
@@ -74,11 +74,13 @@ slackwebhook="webhook"
 
 # Telegram Alerts | https://docs.linuxgsm.com/alerts/telegram
 # You can add a custom cURL string eg proxy (useful in Russia) in "curlcustomstring".
-# For example "--socks5 ipaddr:port" for socks5 proxy see more in "curl --help".
+# For example "--socks5 ipaddr:port" for socks5 proxy see more in "curl --help all".
 telegramapi="api.telegram.org"
 telegramalert="off"
 telegramtoken="accesstoken"
 telegramchatid=""
+telegramthreadid=""
+telegramsilentnotification="false"
 curlcustomstring=""
 
 ## Updating | https://docs.linuxgsm.com/commands/update
diff --git a/lgsm/config-default/config-lgsm/stserver/_default.cfg b/lgsm/config-default/config-lgsm/stserver/_default.cfg
index e245c57c0..2f2fe0ed4 100644
--- a/lgsm/config-default/config-lgsm/stserver/_default.cfg
+++ b/lgsm/config-default/config-lgsm/stserver/_default.cfg
@@ -74,11 +74,13 @@ slackwebhook="webhook"
 
 # Telegram Alerts | https://docs.linuxgsm.com/alerts/telegram
 # You can add a custom cURL string eg proxy (useful in Russia) in "curlcustomstring".
-# For example "--socks5 ipaddr:port" for socks5 proxy see more in "curl --help".
+# For example "--socks5 ipaddr:port" for socks5 proxy see more in "curl --help all".
 telegramapi="api.telegram.org"
 telegramalert="off"
 telegramtoken="accesstoken"
 telegramchatid=""
+telegramthreadid=""
+telegramsilentnotification="false"
 curlcustomstring=""
 
 ## Updating | https://docs.linuxgsm.com/commands/update
diff --git a/lgsm/config-default/config-lgsm/svenserver/_default.cfg b/lgsm/config-default/config-lgsm/svenserver/_default.cfg
index 11822d1f1..4cd97c50e 100644
--- a/lgsm/config-default/config-lgsm/svenserver/_default.cfg
+++ b/lgsm/config-default/config-lgsm/svenserver/_default.cfg
@@ -77,11 +77,13 @@ slackwebhook="webhook"
 
 # Telegram Alerts | https://docs.linuxgsm.com/alerts/telegram
 # You can add a custom cURL string eg proxy (useful in Russia) in "curlcustomstring".
-# For example "--socks5 ipaddr:port" for socks5 proxy see more in "curl --help".
+# For example "--socks5 ipaddr:port" for socks5 proxy see more in "curl --help all".
 telegramapi="api.telegram.org"
 telegramalert="off"
 telegramtoken="accesstoken"
 telegramchatid=""
+telegramthreadid=""
+telegramsilentnotification="false"
 curlcustomstring=""
 
 ## Updating | https://docs.linuxgsm.com/commands/update
diff --git a/lgsm/config-default/config-lgsm/terrariaserver/_default.cfg b/lgsm/config-default/config-lgsm/terrariaserver/_default.cfg
index 0fc6a06b2..fc0d291c9 100644
--- a/lgsm/config-default/config-lgsm/terrariaserver/_default.cfg
+++ b/lgsm/config-default/config-lgsm/terrariaserver/_default.cfg
@@ -77,11 +77,13 @@ slackwebhook="webhook"
 
 # Telegram Alerts | https://docs.linuxgsm.com/alerts/telegram
 # You can add a custom cURL string eg proxy (useful in Russia) in "curlcustomstring".
-# For example "--socks5 ipaddr:port" for socks5 proxy see more in "curl --help".
+# For example "--socks5 ipaddr:port" for socks5 proxy see more in "curl --help all".
 telegramapi="api.telegram.org"
 telegramalert="off"
 telegramtoken="accesstoken"
 telegramchatid=""
+telegramthreadid=""
+telegramsilentnotification="false"
 curlcustomstring=""
 
 ## Updating | https://docs.linuxgsm.com/commands/update
diff --git a/lgsm/config-default/config-lgsm/tf2server/_default.cfg b/lgsm/config-default/config-lgsm/tf2server/_default.cfg
index 7d3164e0e..600249013 100644
--- a/lgsm/config-default/config-lgsm/tf2server/_default.cfg
+++ b/lgsm/config-default/config-lgsm/tf2server/_default.cfg
@@ -83,11 +83,13 @@ slackwebhook="webhook"
 
 # Telegram Alerts | https://docs.linuxgsm.com/alerts/telegram
 # You can add a custom cURL string eg proxy (useful in Russia) in "curlcustomstring".
-# For example "--socks5 ipaddr:port" for socks5 proxy see more in "curl --help".
+# For example "--socks5 ipaddr:port" for socks5 proxy see more in "curl --help all".
 telegramapi="api.telegram.org"
 telegramalert="off"
 telegramtoken="accesstoken"
 telegramchatid=""
+telegramthreadid=""
+telegramsilentnotification="false"
 curlcustomstring=""
 
 ## Updating | https://docs.linuxgsm.com/commands/update
diff --git a/lgsm/config-default/config-lgsm/tfcserver/_default.cfg b/lgsm/config-default/config-lgsm/tfcserver/_default.cfg
index 3334509a1..17787eef5 100644
--- a/lgsm/config-default/config-lgsm/tfcserver/_default.cfg
+++ b/lgsm/config-default/config-lgsm/tfcserver/_default.cfg
@@ -77,11 +77,13 @@ slackwebhook="webhook"
 
 # Telegram Alerts | https://docs.linuxgsm.com/alerts/telegram
 # You can add a custom cURL string eg proxy (useful in Russia) in "curlcustomstring".
-# For example "--socks5 ipaddr:port" for socks5 proxy see more in "curl --help".
+# For example "--socks5 ipaddr:port" for socks5 proxy see more in "curl --help all".
 telegramapi="api.telegram.org"
 telegramalert="off"
 telegramtoken="accesstoken"
 telegramchatid=""
+telegramthreadid=""
+telegramsilentnotification="false"
 curlcustomstring=""
 
 ## Updating | https://docs.linuxgsm.com/commands/update
diff --git a/lgsm/config-default/config-lgsm/tfserver/_default.cfg b/lgsm/config-default/config-lgsm/tfserver/_default.cfg
index 86994d8e0..c6d9842b3 100644
--- a/lgsm/config-default/config-lgsm/tfserver/_default.cfg
+++ b/lgsm/config-default/config-lgsm/tfserver/_default.cfg
@@ -94,11 +94,13 @@ slackwebhook="webhook"
 
 # Telegram Alerts | https://docs.linuxgsm.com/alerts/telegram
 # You can add a custom cURL string eg proxy (useful in Russia) in "curlcustomstring".
-# For example "--socks5 ipaddr:port" for socks5 proxy see more in "curl --help".
+# For example "--socks5 ipaddr:port" for socks5 proxy see more in "curl --help all".
 telegramapi="api.telegram.org"
 telegramalert="off"
 telegramtoken="accesstoken"
 telegramchatid=""
+telegramthreadid=""
+telegramsilentnotification="false"
 curlcustomstring=""
 
 ## Updating | https://docs.linuxgsm.com/commands/update
diff --git a/lgsm/config-default/config-lgsm/tiserver/_default.cfg b/lgsm/config-default/config-lgsm/tiserver/_default.cfg
index 96a3726fd..4090d85c9 100644
--- a/lgsm/config-default/config-lgsm/tiserver/_default.cfg
+++ b/lgsm/config-default/config-lgsm/tiserver/_default.cfg
@@ -76,11 +76,13 @@ slackwebhook="webhook"
 
 # Telegram Alerts | https://docs.linuxgsm.com/alerts/telegram
 # You can add a custom cURL string eg proxy (useful in Russia) in "curlcustomstring".
-# For example "--socks5 ipaddr:port" for socks5 proxy see more in "curl --help".
+# For example "--socks5 ipaddr:port" for socks5 proxy see more in "curl --help all".
 telegramapi="api.telegram.org"
 telegramalert="off"
 telegramtoken="accesstoken"
 telegramchatid=""
+telegramthreadid=""
+telegramsilentnotification="false"
 curlcustomstring=""
 
 ## Updating | https://docs.linuxgsm.com/commands/update
diff --git a/lgsm/config-default/config-lgsm/ts3server/_default.cfg b/lgsm/config-default/config-lgsm/ts3server/_default.cfg
index 36c0d2bae..d132d5c57 100644
--- a/lgsm/config-default/config-lgsm/ts3server/_default.cfg
+++ b/lgsm/config-default/config-lgsm/ts3server/_default.cfg
@@ -70,11 +70,13 @@ slackwebhook="webhook"
 
 # Telegram Alerts | https://docs.linuxgsm.com/alerts/telegram
 # You can add a custom cURL string eg proxy (useful in Russia) in "curlcustomstring".
-# For example "--socks5 ipaddr:port" for socks5 proxy see more in "curl --help".
+# For example "--socks5 ipaddr:port" for socks5 proxy see more in "curl --help all".
 telegramapi="api.telegram.org"
 telegramalert="off"
 telegramtoken="accesstoken"
 telegramchatid=""
+telegramthreadid=""
+telegramsilentnotification="false"
 curlcustomstring=""
 
 ## Updating | https://docs.linuxgsm.com/commands/update
diff --git a/lgsm/config-default/config-lgsm/tsserver/_default.cfg b/lgsm/config-default/config-lgsm/tsserver/_default.cfg
index 05189f90b..418727ae6 100644
--- a/lgsm/config-default/config-lgsm/tsserver/_default.cfg
+++ b/lgsm/config-default/config-lgsm/tsserver/_default.cfg
@@ -77,11 +77,13 @@ slackwebhook="webhook"
 
 # Telegram Alerts | https://docs.linuxgsm.com/alerts/telegram
 # You can add a custom cURL string eg proxy (useful in Russia) in "curlcustomstring".
-# For example "--socks5 ipaddr:port" for socks5 proxy see more in "curl --help".
+# For example "--socks5 ipaddr:port" for socks5 proxy see more in "curl --help all".
 telegramapi="api.telegram.org"
 telegramalert="off"
 telegramtoken="accesstoken"
 telegramchatid=""
+telegramthreadid=""
+telegramsilentnotification="false"
 curlcustomstring=""
 
 ## Updating | https://docs.linuxgsm.com/commands/update
diff --git a/lgsm/config-default/config-lgsm/tuserver/_default.cfg b/lgsm/config-default/config-lgsm/tuserver/_default.cfg
index 89c6712bd..ba22c5aa6 100644
--- a/lgsm/config-default/config-lgsm/tuserver/_default.cfg
+++ b/lgsm/config-default/config-lgsm/tuserver/_default.cfg
@@ -80,11 +80,13 @@ slackwebhook="webhook"
 
 # Telegram Alerts | https://docs.linuxgsm.com/alerts/telegram
 # You can add a custom cURL string eg proxy (useful in Russia) in "curlcustomstring".
-# For example "--socks5 ipaddr:port" for socks5 proxy see more in "curl --help".
+# For example "--socks5 ipaddr:port" for socks5 proxy see more in "curl --help all".
 telegramapi="api.telegram.org"
 telegramalert="off"
 telegramtoken="accesstoken"
 telegramchatid=""
+telegramthreadid=""
+telegramsilentnotification="false"
 curlcustomstring=""
 
 ## Updating | https://docs.linuxgsm.com/commands/update
diff --git a/lgsm/config-default/config-lgsm/twserver/_default.cfg b/lgsm/config-default/config-lgsm/twserver/_default.cfg
index 6f9c2adb6..4d47cb2d1 100644
--- a/lgsm/config-default/config-lgsm/twserver/_default.cfg
+++ b/lgsm/config-default/config-lgsm/twserver/_default.cfg
@@ -77,11 +77,13 @@ slackwebhook="webhook"
 
 # Telegram Alerts | https://docs.linuxgsm.com/alerts/telegram
 # You can add a custom cURL string eg proxy (useful in Russia) in "curlcustomstring".
-# For example "--socks5 ipaddr:port" for socks5 proxy see more in "curl --help".
+# For example "--socks5 ipaddr:port" for socks5 proxy see more in "curl --help all".
 telegramapi="api.telegram.org"
 telegramalert="off"
 telegramtoken="accesstoken"
 telegramchatid=""
+telegramthreadid=""
+telegramsilentnotification="false"
 curlcustomstring=""
 
 ## Updating | https://docs.linuxgsm.com/commands/update
diff --git a/lgsm/config-default/config-lgsm/untserver/_default.cfg b/lgsm/config-default/config-lgsm/untserver/_default.cfg
index e76aefba4..a556c1758 100644
--- a/lgsm/config-default/config-lgsm/untserver/_default.cfg
+++ b/lgsm/config-default/config-lgsm/untserver/_default.cfg
@@ -84,11 +84,13 @@ slackwebhook="webhook"
 
 # Telegram Alerts | https://docs.linuxgsm.com/alerts/telegram
 # You can add a custom cURL string eg proxy (useful in Russia) in "curlcustomstring".
-# For example "--socks5 ipaddr:port" for socks5 proxy see more in "curl --help".
+# For example "--socks5 ipaddr:port" for socks5 proxy see more in "curl --help all".
 telegramapi="api.telegram.org"
 telegramalert="off"
 telegramtoken="accesstoken"
 telegramchatid=""
+telegramthreadid=""
+telegramsilentnotification="false"
 curlcustomstring=""
 
 ## Updating | https://docs.linuxgsm.com/commands/update
diff --git a/lgsm/config-default/config-lgsm/ut2k4server/_default.cfg b/lgsm/config-default/config-lgsm/ut2k4server/_default.cfg
index 709b9855a..ef8fab731 100644
--- a/lgsm/config-default/config-lgsm/ut2k4server/_default.cfg
+++ b/lgsm/config-default/config-lgsm/ut2k4server/_default.cfg
@@ -74,11 +74,13 @@ slackwebhook="webhook"
 
 # Telegram Alerts | https://docs.linuxgsm.com/alerts/telegram
 # You can add a custom cURL string eg proxy (useful in Russia) in "curlcustomstring".
-# For example "--socks5 ipaddr:port" for socks5 proxy see more in "curl --help".
+# For example "--socks5 ipaddr:port" for socks5 proxy see more in "curl --help all".
 telegramapi="api.telegram.org"
 telegramalert="off"
 telegramtoken="accesstoken"
 telegramchatid=""
+telegramthreadid=""
+telegramsilentnotification="false"
 curlcustomstring=""
 
 ## Backup | https://docs.linuxgsm.com/commands/backup
diff --git a/lgsm/config-default/config-lgsm/ut3server/_default.cfg b/lgsm/config-default/config-lgsm/ut3server/_default.cfg
index 4f0b6a3a0..1088d1f0c 100644
--- a/lgsm/config-default/config-lgsm/ut3server/_default.cfg
+++ b/lgsm/config-default/config-lgsm/ut3server/_default.cfg
@@ -90,11 +90,13 @@ slackwebhook="webhook"
 
 # Telegram Alerts | https://docs.linuxgsm.com/alerts/telegram
 # You can add a custom cURL string eg proxy (useful in Russia) in "curlcustomstring".
-# For example "--socks5 ipaddr:port" for socks5 proxy see more in "curl --help".
+# For example "--socks5 ipaddr:port" for socks5 proxy see more in "curl --help all".
 telegramapi="api.telegram.org"
 telegramalert="off"
 telegramtoken="accesstoken"
 telegramchatid=""
+telegramthreadid=""
+telegramsilentnotification="false"
 curlcustomstring=""
 
 ## Backup | https://docs.linuxgsm.com/commands/backup
diff --git a/lgsm/config-default/config-lgsm/ut99server/_default.cfg b/lgsm/config-default/config-lgsm/ut99server/_default.cfg
index f4a3d8ecf..3343afc81 100644
--- a/lgsm/config-default/config-lgsm/ut99server/_default.cfg
+++ b/lgsm/config-default/config-lgsm/ut99server/_default.cfg
@@ -74,11 +74,13 @@ slackwebhook="webhook"
 
 # Telegram Alerts | https://docs.linuxgsm.com/alerts/telegram
 # You can add a custom cURL string eg proxy (useful in Russia) in "curlcustomstring".
-# For example "--socks5 ipaddr:port" for socks5 proxy see more in "curl --help".
+# For example "--socks5 ipaddr:port" for socks5 proxy see more in "curl --help all".
 telegramapi="api.telegram.org"
 telegramalert="off"
 telegramtoken="accesstoken"
 telegramchatid=""
+telegramthreadid=""
+telegramsilentnotification="false"
 curlcustomstring=""
 
 ## Backup | https://docs.linuxgsm.com/commands/backup
diff --git a/lgsm/config-default/config-lgsm/utserver/_default.cfg b/lgsm/config-default/config-lgsm/utserver/_default.cfg
index 0ffdd821f..299d2571a 100644
--- a/lgsm/config-default/config-lgsm/utserver/_default.cfg
+++ b/lgsm/config-default/config-lgsm/utserver/_default.cfg
@@ -78,11 +78,13 @@ slackwebhook="webhook"
 
 # Telegram Alerts | https://docs.linuxgsm.com/alerts/telegram
 # You can add a custom cURL string eg proxy (useful in Russia) in "curlcustomstring".
-# For example "--socks5 ipaddr:port" for socks5 proxy see more in "curl --help".
+# For example "--socks5 ipaddr:port" for socks5 proxy see more in "curl --help all".
 telegramapi="api.telegram.org"
 telegramalert="off"
 telegramtoken="accesstoken"
 telegramchatid=""
+telegramthreadid=""
+telegramsilentnotification="false"
 curlcustomstring=""
 
 ## Backup | https://docs.linuxgsm.com/commands/backup
diff --git a/lgsm/config-default/config-lgsm/vhserver/_default.cfg b/lgsm/config-default/config-lgsm/vhserver/_default.cfg
index 4e3d23923..355c70824 100644
--- a/lgsm/config-default/config-lgsm/vhserver/_default.cfg
+++ b/lgsm/config-default/config-lgsm/vhserver/_default.cfg
@@ -114,11 +114,13 @@ slackwebhook="webhook"
 
 # Telegram Alerts | https://docs.linuxgsm.com/alerts/telegram
 # You can add a custom cURL string eg proxy (useful in Russia) in "curlcustomstring".
-# For example "--socks5 ipaddr:port" for socks5 proxy see more in "curl --help".
+# For example "--socks5 ipaddr:port" for socks5 proxy see more in "curl --help all".
 telegramapi="api.telegram.org"
 telegramalert="off"
 telegramtoken="accesstoken"
 telegramchatid=""
+telegramthreadid=""
+telegramsilentnotification="false"
 curlcustomstring=""
 
 ## Updating | https://docs.linuxgsm.com/commands/update
diff --git a/lgsm/config-default/config-lgsm/vintsserver/_default.cfg b/lgsm/config-default/config-lgsm/vintsserver/_default.cfg
index 1b64ae29d..a3bc472c4 100644
--- a/lgsm/config-default/config-lgsm/vintsserver/_default.cfg
+++ b/lgsm/config-default/config-lgsm/vintsserver/_default.cfg
@@ -74,11 +74,13 @@ slackwebhook="webhook"
 
 # Telegram Alerts | https://docs.linuxgsm.com/alerts/telegram
 # You can add a custom cURL string eg proxy (useful in Russia) in "curlcustomstring".
-# For example "--socks5 ipaddr:port" for socks5 proxy see more in "curl --help".
+# For example "--socks5 ipaddr:port" for socks5 proxy see more in "curl --help all".
 telegramapi="api.telegram.org"
 telegramalert="off"
 telegramtoken="accesstoken"
 telegramchatid=""
+telegramthreadid=""
+telegramsilentnotification="false"
 curlcustomstring=""
 
 ## Updating | https://docs.linuxgsm.com/commands/update
diff --git a/lgsm/config-default/config-lgsm/vpmcserver/_default.cfg b/lgsm/config-default/config-lgsm/vpmcserver/_default.cfg
index 09d6bf93f..28bc1b2ea 100644
--- a/lgsm/config-default/config-lgsm/vpmcserver/_default.cfg
+++ b/lgsm/config-default/config-lgsm/vpmcserver/_default.cfg
@@ -77,11 +77,13 @@ slackwebhook="webhook"
 
 # Telegram Alerts | https://docs.linuxgsm.com/alerts/telegram
 # You can add a custom cURL string eg proxy (useful in Russia) in "curlcustomstring".
-# For example "--socks5 ipaddr:port" for socks5 proxy see more in "curl --help".
+# For example "--socks5 ipaddr:port" for socks5 proxy see more in "curl --help all".
 telegramapi="api.telegram.org"
 telegramalert="off"
 telegramtoken="accesstoken"
 telegramchatid=""
+telegramthreadid=""
+telegramsilentnotification="false"
 curlcustomstring=""
 
 ## Updating | https://docs.linuxgsm.com/commands/update
diff --git a/lgsm/config-default/config-lgsm/vsserver/_default.cfg b/lgsm/config-default/config-lgsm/vsserver/_default.cfg
index 0195393fd..c7976b384 100644
--- a/lgsm/config-default/config-lgsm/vsserver/_default.cfg
+++ b/lgsm/config-default/config-lgsm/vsserver/_default.cfg
@@ -77,11 +77,13 @@ slackwebhook="webhook"
 
 # Telegram Alerts | https://docs.linuxgsm.com/alerts/telegram
 # You can add a custom cURL string eg proxy (useful in Russia) in "curlcustomstring".
-# For example "--socks5 ipaddr:port" for socks5 proxy see more in "curl --help".
+# For example "--socks5 ipaddr:port" for socks5 proxy see more in "curl --help all".
 telegramapi="api.telegram.org"
 telegramalert="off"
 telegramtoken="accesstoken"
 telegramchatid=""
+telegramthreadid=""
+telegramsilentnotification="false"
 curlcustomstring=""
 
 ## Updating | https://docs.linuxgsm.com/commands/update
diff --git a/lgsm/config-default/config-lgsm/wetserver/_default.cfg b/lgsm/config-default/config-lgsm/wetserver/_default.cfg
index 4c3738909..b53a0674c 100644
--- a/lgsm/config-default/config-lgsm/wetserver/_default.cfg
+++ b/lgsm/config-default/config-lgsm/wetserver/_default.cfg
@@ -70,11 +70,13 @@ slackwebhook="webhook"
 
 # Telegram Alerts | https://docs.linuxgsm.com/alerts/telegram
 # You can add a custom cURL string eg proxy (useful in Russia) in "curlcustomstring".
-# For example "--socks5 ipaddr:port" for socks5 proxy see more in "curl --help".
+# For example "--socks5 ipaddr:port" for socks5 proxy see more in "curl --help all".
 telegramapi="api.telegram.org"
 telegramalert="off"
 telegramtoken="accesstoken"
 telegramchatid=""
+telegramthreadid=""
+telegramsilentnotification="false"
 curlcustomstring=""
 
 ## Backup | https://docs.linuxgsm.com/commands/backup
diff --git a/lgsm/config-default/config-lgsm/wfserver/_default.cfg b/lgsm/config-default/config-lgsm/wfserver/_default.cfg
index 80ff4ba96..fb7211c8c 100644
--- a/lgsm/config-default/config-lgsm/wfserver/_default.cfg
+++ b/lgsm/config-default/config-lgsm/wfserver/_default.cfg
@@ -75,11 +75,13 @@ slackwebhook="webhook"
 
 # Telegram Alerts | https://docs.linuxgsm.com/alerts/telegram
 # You can add a custom cURL string eg proxy (useful in Russia) in "curlcustomstring".
-# For example "--socks5 ipaddr:port" for socks5 proxy see more in "curl --help".
+# For example "--socks5 ipaddr:port" for socks5 proxy see more in "curl --help all".
 telegramapi="api.telegram.org"
 telegramalert="off"
 telegramtoken="accesstoken"
 telegramchatid=""
+telegramthreadid=""
+telegramsilentnotification="false"
 curlcustomstring=""
 
 ## Updating | https://docs.linuxgsm.com/commands/update
diff --git a/lgsm/config-default/config-lgsm/wmcserver/_default.cfg b/lgsm/config-default/config-lgsm/wmcserver/_default.cfg
index f38976d6e..c9a0a5d52 100644
--- a/lgsm/config-default/config-lgsm/wmcserver/_default.cfg
+++ b/lgsm/config-default/config-lgsm/wmcserver/_default.cfg
@@ -77,11 +77,13 @@ slackwebhook="webhook"
 
 # Telegram Alerts | https://docs.linuxgsm.com/alerts/telegram
 # You can add a custom cURL string eg proxy (useful in Russia) in "curlcustomstring".
-# For example "--socks5 ipaddr:port" for socks5 proxy see more in "curl --help".
+# For example "--socks5 ipaddr:port" for socks5 proxy see more in "curl --help all".
 telegramapi="api.telegram.org"
 telegramalert="off"
 telegramtoken="accesstoken"
 telegramchatid=""
+telegramthreadid=""
+telegramsilentnotification="false"
 curlcustomstring=""
 
 ## Updating | https://docs.linuxgsm.com/commands/update
diff --git a/lgsm/config-default/config-lgsm/wurmserver/_default.cfg b/lgsm/config-default/config-lgsm/wurmserver/_default.cfg
index 901417aaf..0141e7d7e 100644
--- a/lgsm/config-default/config-lgsm/wurmserver/_default.cfg
+++ b/lgsm/config-default/config-lgsm/wurmserver/_default.cfg
@@ -114,11 +114,13 @@ slackwebhook="webhook"
 
 # Telegram Alerts | https://docs.linuxgsm.com/alerts/telegram
 # You can add a custom cURL string eg proxy (useful in Russia) in "curlcustomstring".
-# For example "--socks5 ipaddr:port" for socks5 proxy see more in "curl --help".
+# For example "--socks5 ipaddr:port" for socks5 proxy see more in "curl --help all".
 telegramapi="api.telegram.org"
 telegramalert="off"
 telegramtoken="accesstoken"
 telegramchatid=""
+telegramthreadid=""
+telegramsilentnotification="false"
 curlcustomstring=""
 
 ## Updating | https://docs.linuxgsm.com/commands/update
diff --git a/lgsm/config-default/config-lgsm/zmrserver/_default.cfg b/lgsm/config-default/config-lgsm/zmrserver/_default.cfg
index 1bcd5d4a7..391d83baf 100644
--- a/lgsm/config-default/config-lgsm/zmrserver/_default.cfg
+++ b/lgsm/config-default/config-lgsm/zmrserver/_default.cfg
@@ -78,11 +78,13 @@ slackwebhook="webhook"
 
 # Telegram Alerts | https://docs.linuxgsm.com/alerts/telegram
 # You can add a custom cURL string eg proxy (useful in Russia) in "curlcustomstring".
-# For example "--socks5 ipaddr:port" for socks5 proxy see more in "curl --help".
+# For example "--socks5 ipaddr:port" for socks5 proxy see more in "curl --help all".
 telegramapi="api.telegram.org"
 telegramalert="off"
 telegramtoken="accesstoken"
 telegramchatid=""
+telegramthreadid=""
+telegramsilentnotification="false"
 curlcustomstring=""
 
 ## Updating | https://docs.linuxgsm.com/commands/update
diff --git a/lgsm/config-default/config-lgsm/zpsserver/_default.cfg b/lgsm/config-default/config-lgsm/zpsserver/_default.cfg
index f4497786b..b5a7b3b93 100644
--- a/lgsm/config-default/config-lgsm/zpsserver/_default.cfg
+++ b/lgsm/config-default/config-lgsm/zpsserver/_default.cfg
@@ -83,11 +83,13 @@ slackwebhook="webhook"
 
 # Telegram Alerts | https://docs.linuxgsm.com/alerts/telegram
 # You can add a custom cURL string eg proxy (useful in Russia) in "curlcustomstring".
-# For example "--socks5 ipaddr:port" for socks5 proxy see more in "curl --help".
+# For example "--socks5 ipaddr:port" for socks5 proxy see more in "curl --help all".
 telegramapi="api.telegram.org"
 telegramalert="off"
 telegramtoken="accesstoken"
 telegramchatid=""
+telegramthreadid=""
+telegramsilentnotification="false"
 curlcustomstring=""
 
 ## Updating | https://docs.linuxgsm.com/commands/update
diff --git a/lgsm/modules/alert_telegram.sh b/lgsm/modules/alert_telegram.sh
index 3b3ec9912..6f6426cb1 100644
--- a/lgsm/modules/alert_telegram.sh
+++ b/lgsm/modules/alert_telegram.sh
@@ -11,7 +11,9 @@ jsoninfo=$(
 	cat << EOF
 {
 	"chat_id": "${telegramchatid}",
+	"message_thread_id": "${telegramthreadid}",
 	"parse_mode": "HTML",
+	"disable_notification": "${telegramdisablenotification}",
 	"text": "<b>${alerttitle}</b>\n\n<b>Server name</b>\n${servername}\n\n<b>Information</b>\n${alertmessage}\n\n<b>Game</b>\n${gamename}\n\n<b>Server IP</b>\n${alertip}:${port}\n\n<b>Hostname</b>\n${HOSTNAME}\n\n<b>More info</b>\n<a href='${alerturl}'>${alerturl}</a>\n\n<b>Server Time</b>\n$(date)",
 	"disable_web_page_preview": "yes"
 }
@@ -22,7 +24,9 @@ jsonnoinfo=$(
 	cat << EOF
 {
 	"chat_id": "${telegramchatid}",
+	"message_thread_id": "${telegramthreadid}",
 	"parse_mode": "HTML",
+	"disable_notification": "${telegramdisablenotification}",
 	"text": "<b>${alerttitle}</b>\n\n<b>Server name</b>\n${servername}\n\n<b>Information</b>\n${alertmessage}\n\n<b>Game</b>\n${gamename}\n\n<b>Server IP</b>\n${alertip}:${port}\n\n<b>Hostname</b>\n${HOSTNAME}\n\n<b>Server Time</b>\n$(date)",
 	"disable_web_page_preview": "yes"
 }

From 9b62bdeb666766c4e0a6a061dd52cef9e0a2e1cd Mon Sep 17 00:00:00 2001
From: MicLieg <38057464+MicLieg@users.noreply.github.com>
Date: Sat, 9 Mar 2024 12:40:52 +0100
Subject: [PATCH 092/154] feat(dev): add new developer command for parsing
 distro details (#4523)

* feat(dev): add new developer command for parsing distro details

* Updated details-check action to match new command name
---
 .github/workflows/details-check.yml           |   2 +-
 lgsm/modules/command_dev_details.sh           |  98 -----------
 .../command_dev_parse_distro_details.sh       | 114 +++++++++++++
 .../modules/command_dev_parse_game_details.sh | 160 ++++++++++++++++++
 lgsm/modules/core_getopt.sh                   |   5 +-
 lgsm/modules/core_modules.sh                  |   7 +-
 6 files changed, 284 insertions(+), 102 deletions(-)
 delete mode 100644 lgsm/modules/command_dev_details.sh
 create mode 100644 lgsm/modules/command_dev_parse_distro_details.sh
 create mode 100644 lgsm/modules/command_dev_parse_game_details.sh

diff --git a/.github/workflows/details-check.yml b/.github/workflows/details-check.yml
index 2a04dc6ac..748a77991 100644
--- a/.github/workflows/details-check.yml
+++ b/.github/workflows/details-check.yml
@@ -83,7 +83,7 @@ jobs:
         run: LGSM_GITHUBBRANCH="${GITHUB_REF#refs/heads/}" ./${{ matrix.shortname }}server details
 
       - name: Detect details
-        run: LGSM_GITHUBBRANCH="${GITHUB_REF#refs/heads/}" ./${{ matrix.shortname }}server detect-details
+        run: LGSM_GITHUBBRANCH="${GITHUB_REF#refs/heads/}" ./${{ matrix.shortname }}server parse-game-details
 
       - name: Query Raw
         run: LGSM_GITHUBBRANCH="${GITHUB_REF#refs/heads/}" ./${{ matrix.shortname }}server query-raw
diff --git a/lgsm/modules/command_dev_details.sh b/lgsm/modules/command_dev_details.sh
deleted file mode 100644
index 93dae77bc..000000000
--- a/lgsm/modules/command_dev_details.sh
+++ /dev/null
@@ -1,98 +0,0 @@
-#!/bin/bash
-# LinuxGSM command_dev_debug.sh module
-# Author: Daniel Gibbs
-# Contributors: http://linuxgsm.com/contrib
-# Website: https://linuxgsm.com
-# Description: Dev only: Enables debugging log to be saved to dev-debug.log.
-
-if [ -f "config" ]; then
-	servercfgfullpath="config"
-fi
-if [ -f "clusterconfig" ]; then
-	clustercfgfullpath="clusterconfig"
-fi
-
-info_game.sh
-
-carriagereturn=$(file -b "${servercfgfullpath}" | grep -q CRLF && echo "${red}CRLF${default}" || echo "${lightgreen}LF${default}")
-
-echo -e ""
-echo -e "${bold}${lightgreen}Server Details${default}"
-fn_messages_separator
-
-echo -e ""
-echo -e "Game: ${gamename}"
-echo -e "Config type: ${configtype}"
-echo -e "Config file: ${servercfgfullpath}"
-if [ -f "${clustercfgfullpath}" ]; then
-	echo -e "Cluster config file: ${clustercfgfullpath}"
-fi
-echo -e "Carriage Return: ${carriagereturn}"
-
-# Create an associative array of the server details.
-declare -A server_details=(
-	['Admin Password']="${adminpassword}"
-	['API Port']="${apiport}"
-	['Cave']="${cave}"
-	['Cluster']="${cluster}"
-	['Config IP']="${configip}"
-	['Default Map']="${defaultmap}"
-	['Game Mode']="${gamemode}"
-	['Game Type']="${gametype}"
-	['HTTP Enabled']="${httpenabled}"
-	['HTTP IP']="${httpip}"
-	['HTTP Password']="${httppassword}"
-	['HTTP Port']="${httpport}"
-	['HTTP User']="${httpuser}"
-	['Internet IP']="${publicip}"
-	['LAN Port']="${lanport}"
-	['Master Port']="${masterport}"
-	['Master']="${master}"
-	['Maxplayers']="${maxplayers}"
-	['OldQueryPortNumber']="${oldqueryportnumber}"
-	['Port']="${port}"
-	['Query Port']="${queryport}"
-	['RCON Enabled']="${rconenabled}"
-	['RCON Password']="${rconpassword}"
-	['RCON Port']="${rconport}"
-	['Reserved Slots']="${reservedslots}"
-	['Server IP']="${ip}"
-	['Server Password']="${serverpassword}"
-	['Servername']="${servername}"
-	['Shard']="${shard}"
-	['Sharding']="${sharding}"
-	['Steam Auth Port']="${steamauthport}"
-	['Telnet Enabled']="${telnetenabled}"
-	['Telnet IP']="${telnetip}"
-	['Telnet Password']="${telnetpassword}"
-	['Telnet Port']="${telnetport}"
-	['Tickrate']="${tickrate}"
-	['World Name']="${worldname}"
-	['World Type']="${worldtype}"
-)
-
-# Initialize a variable to keep track of missing server details.
-missing_details=""
-
-# Loop through the server details and output them.
-echo -e ""
-echo -e "${bold}${lightgreen}Available Server Details${default}"
-fn_messages_separator
-for key in "${!server_details[@]}"; do
-	value=${server_details[$key]}
-	if [ -z "$value" ]; then
-		missing_details+="\n${key}"
-	else
-		echo -e "$key: $value "
-	fi
-done
-
-# Output the missing server details if there are any.
-if [ -n "$missing_details" ]; then
-	echo -e ""
-	echo -e "${lightgreen}Missing Server Details${default}"
-	fn_messages_separator
-	echo -e "${missing_details}"
-fi
-
-core_exit.sh
diff --git a/lgsm/modules/command_dev_parse_distro_details.sh b/lgsm/modules/command_dev_parse_distro_details.sh
new file mode 100644
index 000000000..ca2bfd9ed
--- /dev/null
+++ b/lgsm/modules/command_dev_parse_distro_details.sh
@@ -0,0 +1,114 @@
+#!/bin/bash
+# LinuxGSM command_dev_parse_distro_details.sh module
+# Author: Daniel Gibbs
+# Contributors: http://linuxgsm.com/contrib
+# Website: https://linuxgsm.com
+# Description: Display parsed distro details.
+
+check_ip.sh
+check_status.sh
+info_distro.sh
+
+# Create an associative array of the server details.
+declare -A server_details=(
+	['.NET Version']="${dotnetversion}"
+	['Arch']="${arch}"
+	['Backup Count']="${backupcount}"
+	['Backup Last Date']="${lastbackupdate}"
+	['Backup Last Days Ago']="${lastbackupdaysago}"
+	['Backup Last Size']="${lastbackupsize}"
+	['Backup Last']="${lastbackup}"
+	['CPU Average Load']="${load}"
+	['CPU Cores']="${cpucores}"
+	['CPU Frequency']="${cpufreqency}"
+	['CPU Model']="${cpumodel}"
+	['Distro Codename']="${distrocodename}"
+	['Distro ID Like']="${distroidlike}"
+	['Distro ID']="${distroid}"
+	['Distro Kernel']="${kernel}"
+	['Distro Name']="${distroname}"
+	['Distro Version CSV']="${distroversioncsv}"
+	['Distro Version RH']="${distroversionrh}"
+	['Distro Version']="${distroversion}"
+	['Distro-Info Support']="${distrosupport}"
+	['File System']="${filesystem}"
+	['Game Server PID']="${gameserverpid}"
+	['Gameserver CPU Used MHz']="${cpuusedmhz}"
+	['Gameserver CPU Used']="${cpuused}"
+	['Gameserver Mem Used MB']="${memusedmb}"
+	['Gameserver Mem Used Pct']="${memusedpct}"
+	['GLIBC Version']="${glibcversion}"
+	['GLIBC']="${glibc}"
+	['HLDS Linux PID']="${hldslinuxpid}"
+	['Java Version']="${javaversion}"
+	['Mono Version']="${monoversion}"
+	['Network Interface']="${netint}"
+	['Network Link Speed']="${netlink}"
+	['Old Free']="${oldfree}"
+	['Phys Mem Available']="${physmemavailable}"
+	['Phys Mem Buffers KB']="${physmembufferskb}"
+	['Phys Mem Cached']="${physmemcached}"
+	['Phys Mem Free']="${physmemfree}"
+	['Phys Mem Reclaimable KB']="${physmemreclaimablekb}"
+	['Phys Mem Total GB']="${physmemtotalgb}"
+	['Phys Mem Used']="${physmemused}"
+	['Size Backup Dir']="${backupdirdu}"
+	['Size Root Dir ']="${rootdirdu}"
+	['Size Root Dir Excl. Backup']="${rootdirduexbackup}"
+	['Size Serverfiles']="${serverfilesdu}"
+	['SRCDS Linux PID']="${srcdslinuxpid}"
+	['Storage Available']="${availspace}"
+	['Storage Total']="${totalspace}"
+	['Storage Used']="${usedspace}"
+	['Swap Free']="${swapfree}"
+	['Swap Total']="${swaptotal}"
+	['Swap Used']="${swapused}"
+	['Tmux Version']="${tmuxversion}"
+	['Uptime Days']="${days}"
+	['Uptime Hours']="${hours}"
+	['Uptime Minutes']="${minutes}"
+	['Uptime Total Seconds']="${uptime}"
+	['Virtual Environment']="${virtualenvironment}"
+	# ['Distro Info Array']="${distro_info_array}"
+	# ['Distros Unsupported Array']="${distrosunsupported_array}"
+	# ['Distros Unsupported']="${distrosunsupported}"
+	# ['Human Readable']="${humanreadable}"
+	# ['Phys Mem Actual Free KB']="${physmemactualfreekb}"
+	# ['Phys Mem Cached KB']="${physmemcachedkb}"
+	# ['Phys Mem Free KB']="${physmemfreekb}"
+	# ['Phys Mem Total KB']="${physmemtotalkb}"
+	# ['Phys Mem Total MB']="${physmemtotalmb}"
+	# ['SS Info']="${ssinfo}"
+)
+
+# Initialize variables to keep track of available and missing distro details.
+available_details=""
+missing_details=""
+
+# Loop through the distro details and store them.
+for key in "${!server_details[@]}"; do
+    value=${server_details[$key]}
+	if [ -n "$value" ]; then
+		available_details+="${lightblue}${key}: ${default}${value}\n"
+	else
+		missing_details+="${key}\n"
+	fi
+done
+
+# Sort and output the available distro details.
+if [ -n "$available_details" ]; then
+    echo -e ""
+    echo -e "${bold}${lightgreen}Available Distro Details${default}"
+    fn_messages_separator
+    echo -e "${available_details}" | sort
+fi
+
+# Sort and output the missing distro details.
+if [ -n "$missing_details" ]; then
+    echo -e ""
+    echo -e "${lightgreen}Missing or unsupported Distro Details${default}"
+    fn_messages_separator
+    echo -e "${missing_details}" | sort
+fi
+
+core_exit.sh
diff --git a/lgsm/modules/command_dev_parse_game_details.sh b/lgsm/modules/command_dev_parse_game_details.sh
new file mode 100644
index 000000000..f5d6d697d
--- /dev/null
+++ b/lgsm/modules/command_dev_parse_game_details.sh
@@ -0,0 +1,160 @@
+#!/bin/bash
+# LinuxGSM command_dev_parse_game_details.sh module
+# Author: Daniel Gibbs
+# Contributors: http://linuxgsm.com/contrib
+# Website: https://linuxgsm.com
+# Description: Display parsed gameserver details.
+
+if [ -f "config" ]; then
+	servercfgfullpath="config"
+fi
+if [ -f "clusterconfig" ]; then
+	clustercfgfullpath="clusterconfig"
+fi
+
+info_game.sh
+
+carriagereturn=$(file -b "${servercfgfullpath}" | grep -q CRLF && echo "${red}CRLF${default}" || echo "${lightgreen}LF${default}")
+
+echo -e ""
+echo -e "${bold}${lightgreen}Server Details${default}"
+fn_messages_separator
+
+echo -e ""
+echo -e "${lightblue}Game: ${default}${gamename}"
+echo -e "${lightblue}Config type: ${default}${configtype}"
+echo -e "${lightblue}Config file: ${default}${servercfgfullpath}"
+if [ -f "${clustercfgfullpath}" ]; then
+	echo -e "${lightblue}Cluster config file: ${default}${clustercfgfullpath}"
+fi
+echo -e "${lightblue}Carriage Return: ${default}${carriagereturn}"
+
+# Create an associative array of the server details.
+declare -A server_details=(
+	['Admin Password']="${adminpassword}"
+	['Alert IP']="${alertip}"
+	['API Port']="${apiport}"
+	['App Port']="${appport}"
+	['ASE']="${ase}"
+	['Auth Token']="${authtoken}"
+	['BattleEye Port']="${battleeyeport}"
+	['Beacon Port']="${beaconport}"
+	['Cave']="${cave}"
+	['Client Port']="${clientport}"
+	['Cluster']="${cluster}"
+	['Config IP']="${configip}"
+	['Creative Mode']="${creativemode}"
+	['Custom Level URL']="${customlevelurl}"
+	['DB Plugin']="${dbplugin}"
+	['Default Map']="${defaultmap}"
+	['Default Scenario']="${defaultscenario}"
+	['Display Master Server']="${displaymasterserver}"
+	['Epic Settings']="${epicsettings}"
+	['File Port']="${fileport}"
+	['Files Port']="${filesport}"
+	['Game Mode']="${gamemode}"
+	['Game Type']="${gametype}"
+	['Home Kingdom']="${homekingdom}"
+	['Home Server']="${homeserver}"
+	['HTTP Enabled']="${httpenabled}"
+	['HTTP IP']="${httpip}"
+	['HTTP Password']="${httppassword}"
+	['HTTP Port']="${httpport}"
+	['HTTP User']="${httpuser}"
+	['Internet IP']="${publicip}"
+	['LAN Port']="${lanport}"
+	['Login Server']="${loginserver}"
+	['Master Port']="${masterport}"
+	['Master Server']="${masterserver}"
+	['Master']="${master}"
+	['Max Players']="${maxplayers}"
+	['Mod Server Port']="${modserverport}"
+	['OldQueryPortNumber']="${oldqueryportnumber}"
+	['Password']="${password}"
+	['Port 401']="${port401}"
+	['Port IPv6']="${portipv6}"
+	['Port']="${port}"
+	['Query Enabled']="${queryenabled}"
+	['Query HTTP Port']="${queryhttpport}"
+	['Query HTTPS Port']="${queryhttpsport}"
+	['Query Mode']="${querymode}"
+	['Query Port GS']="${queryportgs}"
+	['Query Port']="${queryport}"
+	['Query SSH Port']="${querysshport}"
+	['Queue Enabled']="${queueenabled}"
+	['Queue Port']="${queueport}"
+	['Random Map']="${randommap}"
+	['Raw Port']="${rawport}"
+	['RC Password']="${rcpassword}"
+	['RCON Enabled']="${rconenabled}"
+	['RCON Password']="${rconpassword}"
+	['RCON Port']="${rconport}"
+	['RCON Web']="${rconweb}"
+	['Reserved Slots']="${reservedslots}"
+	['RMI Port']="${rmiport}"
+	['RMI Reg Port']="${rmiregport}"
+	['Salt']="${salt}"
+	['Save Game Interval']="${savegameinterval}"
+	['Save Interval']="${saveinterval}"
+	['Secondary Port']="${port3}"
+	['Seed']="${seed}"
+	['Server Description']="${serverdescription}"
+	['Server IP']="${ip}"
+	['Server Level']="${serverlevel}"
+	['Server Name']="${servername}"
+	['Server Password Enabled']="${serverpasswordenabled}"
+	['Server Password']="${serverpassword}"
+	['Server Version']="${serverversion}"
+	['Shard']="${shard}"
+	['Sharding']="${sharding}"
+	['Shutdown Port']="${shutdownport}"
+	['Stats Port']="${statsport}"
+	['Steam Auth Port']="${steamauthport}"
+	['Steam Port']="${steamport}"
+	['Steamworks Port']="${steamworksport}"
+	['Telnet Enabled']="${telnetenabled}"
+	['Telnet IP']="${telnetip}"
+	['Telnet Password']="${telnetpass}"
+	['Telnet Password']="${telnetpassword}"
+	['Telnet Port']="${telnetport}"
+	['Tickrate']="${tickrate}"
+	['Unknown Port']="${unknownport}"
+	['Version Count']="${versioncount}"
+	['Voice Port']="${voiceport}"
+	['Voice Unused Port']="${voiceunusedport}"
+	['World Name']="${worldname}"
+	['World Size']="${worldsize}"
+	['World Type']="${worldtype}"
+)
+
+# Initialize variables to keep track of available and missing server details.
+available_details=""
+missing_details=""
+
+# Loop through the server details and store them.
+for key in "${!server_details[@]}"; do
+    value=${server_details[$key]}
+	if [ -n "$value" ]; then
+		available_details+="${lightblue}${key}: ${default}${value}\n"
+	else
+		missing_details+="${key}\n"
+	fi
+done
+
+# Sort and output the available distro details.
+if [ -n "$available_details" ]; then
+	echo -e ""
+    echo -e "${bold}${lightgreen}Available Distro Details${default}"
+    fn_messages_separator
+    echo -e "${available_details}" | sort
+fi
+
+# Output the missing server details if there are any.
+if [ -n "$missing_details" ]; then
+	echo -e ""
+	echo -e "${lightgreen}Missing or unsupported Server Details${default}"
+	fn_messages_separator
+	echo -e "${missing_details}" | sort
+fi
+
+core_exit.sh
diff --git a/lgsm/modules/core_getopt.sh b/lgsm/modules/core_getopt.sh
index 685e1ce8b..cd3e57cb5 100644
--- a/lgsm/modules/core_getopt.sh
+++ b/lgsm/modules/core_getopt.sh
@@ -50,7 +50,8 @@ cmd_install_squad_license=("li;license" "install_squad_license.sh" "Add your Squ
 cmd_fastdl=("fd;fastdl" "command_fastdl.sh" "Build a FastDL directory.")
 # Dev commands.
 cmd_dev_debug=("dev;developer" "command_dev_debug.sh" "Enable developer Mode.")
-cmd_dev_details=("ddt;detect-details" "command_dev_details.sh" "Display parsed details.")
+cmd_dev_parse_game_details=("pgd;parse-game-details" "command_dev_parse_game_details.sh" "Display parsed gameserver details.")
+cmd_dev_parse_distro_details=("pdd;parse-distro-details" "command_dev_parse_distro_details.sh" "Display parsed distro details.")
 cmd_dev_detect_deps=("dd;detect-deps" "command_dev_detect_deps.sh" "Detect required dependencies.")
 cmd_dev_detect_glibc=("dg;detect-glibc" "command_dev_detect_glibc.sh" "Detect required glibc.")
 cmd_dev_detect_ldd=("dl;detect-ldd" "command_dev_detect_ldd.sh" "Detect required dynamic dependencies.")
@@ -146,7 +147,7 @@ currentopt+=("${cmd_install[@]}" "${cmd_auto_install[@]}")
 ## Developer commands.
 currentopt+=("${cmd_dev_debug[@]}")
 if [ -f ".dev-debug" ]; then
-	currentopt+=("${cmd_dev_details[@]}" "${cmd_dev_detect_deps[@]}" "${cmd_dev_detect_glibc[@]}" "${cmd_dev_detect_ldd[@]}" "${cmd_dev_query_raw[@]}" "${cmd_dev_clear_modules[@]}")
+	currentopt+=("${cmd_dev_parse_game_details[@]}" "${cmd_dev_parse_distro_details[@]}" "${cmd_dev_detect_deps[@]}" "${cmd_dev_detect_glibc[@]}" "${cmd_dev_detect_ldd[@]}" "${cmd_dev_query_raw[@]}" "${cmd_dev_clear_modules[@]}")
 fi
 
 ## Sponsor.
diff --git a/lgsm/modules/core_modules.sh b/lgsm/modules/core_modules.sh
index e1621f014..7ea0402e3 100644
--- a/lgsm/modules/core_modules.sh
+++ b/lgsm/modules/core_modules.sh
@@ -299,7 +299,12 @@ command_dev_debug.sh() {
 	fn_fetch_module
 }
 
-command_dev_details.sh() {
+command_dev_parse_game_details.sh() {
+	modulefile="${FUNCNAME[0]}"
+	fn_fetch_module
+}
+
+command_dev_parse_distro_details.sh() {
 	modulefile="${FUNCNAME[0]}"
 	fn_fetch_module
 }

From 7cc5b6b520d527a09d1eb08359e4545dcdc0ef3c Mon Sep 17 00:00:00 2001
From: Cristopfer Luis <ocristopfer@gmail.com>
Date: Thu, 14 Mar 2024 12:38:01 -0300
Subject: [PATCH 093/154] feat(new server): humanitz (#4518)

* feat: add config for humanitz

* fix: pending changes required

* fix: install config

* bug

---------

Co-authored-by: Daniel Gibbs <me@danielgibbs.co.uk>
---
 .../config-lgsm/hzserver/_default.cfg         | 184 ++++++++++++++++++
 lgsm/data/almalinux-8.csv                     |   1 +
 lgsm/data/almalinux-9.csv                     |   1 +
 lgsm/data/centos-7.csv                        |   1 +
 lgsm/data/centos-8.csv                        |   1 +
 lgsm/data/centos-9.csv                        |   1 +
 lgsm/data/debian-10.csv                       |   1 +
 lgsm/data/debian-11.csv                       |   1 +
 lgsm/data/debian-12.csv                       |   1 +
 lgsm/data/debian-9.csv                        |   1 +
 lgsm/data/rhel-7.csv                          |   1 +
 lgsm/data/rhel-8.csv                          |   1 +
 lgsm/data/rhel-9.csv                          |   1 +
 lgsm/data/rocky-8.csv                         |   1 +
 lgsm/data/rocky-9.csv                         |   1 +
 lgsm/data/serverlist.csv                      |   1 +
 lgsm/data/ubuntu-16.04.csv                    |   1 +
 lgsm/data/ubuntu-18.04.csv                    |   1 +
 lgsm/data/ubuntu-20.04.csv                    |   1 +
 lgsm/data/ubuntu-22.04.csv                    |   1 +
 lgsm/data/ubuntu-23.04.csv                    |   1 +
 lgsm/data/ubuntu-23.10.csv                    |   1 +
 lgsm/modules/info_game.sh                     |  19 ++
 lgsm/modules/info_messages.sh                 |  11 ++
 lgsm/modules/install_config.sh                |   3 +
 25 files changed, 238 insertions(+)
 create mode 100644 lgsm/config-default/config-lgsm/hzserver/_default.cfg

diff --git a/lgsm/config-default/config-lgsm/hzserver/_default.cfg b/lgsm/config-default/config-lgsm/hzserver/_default.cfg
new file mode 100644
index 000000000..b610594e7
--- /dev/null
+++ b/lgsm/config-default/config-lgsm/hzserver/_default.cfg
@@ -0,0 +1,184 @@
+##################################
+######## Default Settings ########
+##################################
+# DO NOT EDIT, ANY CHANGES WILL BE OVERWRITTEN!
+# Copy settings from here and use them in either:
+# common.cfg - applies settings to every instance.
+# [instance].cfg - applies settings to a specific instance.
+
+#### Game Server Settings ####
+
+## Predefined Parameters | https://docs.linuxgsm.com/configuration/start-parameters
+ip="0.0.0.0"
+port="7777"
+queryport="27015"
+servername="LinuxGSM"
+
+## Server Parameters | https://docs.linuxgsm.com/configuration/start-parameters#additional-parameters
+startparameters="-log -port=${port} -queryport=${queryport} -steamservername=${servername}"
+
+#### LinuxGSM Settings ####
+
+## LinuxGSM Stats
+# Send useful stats to LinuxGSM developers.
+# https://docs.linuxgsm.com/configuration/linuxgsm-stats
+# (on|off)
+stats="off"
+
+## Notification Alerts
+# (on|off)
+
+# Display IP | https://docs.linuxgsm.com/alerts#display-ip
+displayip=""
+
+# More info | https://docs.linuxgsm.com/alerts#more-info
+postalert="off"
+
+# Alert on Start/Stop/Restart
+statusalert="off"
+
+# Discord Alerts | https://docs.linuxgsm.com/alerts/discord
+discordalert="off"
+discordwebhook="webhook"
+
+# Email Alerts | https://docs.linuxgsm.com/alerts/email
+emailalert="off"
+email="email@example.com"
+emailfrom=""
+
+# Gotify Alerts | https://docs.linuxgsm.com/alerts/gotify
+gotifyalert="off"
+gotifytoken="token"
+gotifywebhook="webhook"
+
+# IFTTT Alerts | https://docs.linuxgsm.com/alerts/ifttt
+iftttalert="off"
+ifttttoken="accesstoken"
+iftttevent="linuxgsm_alert"
+
+# Pushbullet Alerts | https://docs.linuxgsm.com/alerts/pushbullet
+pushbulletalert="off"
+pushbullettoken="accesstoken"
+channeltag=""
+
+# Pushover Alerts | https://docs.linuxgsm.com/alerts/pushover
+pushoveralert="off"
+pushovertoken="accesstoken"
+pushoveruserkey="userkey"
+
+# Rocket.Chat Alerts | https://docs.linuxgsm.com/alerts/rocket.chat
+rocketchatalert="off"
+rocketchatwebhook="webhook"
+
+# Slack Alerts | https://docs.linuxgsm.com/alerts/slack
+slackalert="off"
+slackwebhook="webhook"
+
+# Telegram Alerts | https://docs.linuxgsm.com/alerts/telegram
+# You can add a custom cURL string eg proxy (useful in Russia) in "curlcustomstring".
+# For example "--socks5 ipaddr:port" for socks5 proxy see more in "curl --help".
+telegramapi="api.telegram.org"
+telegramalert="off"
+telegramtoken="accesstoken"
+telegramchatid=""
+curlcustomstring=""
+
+## Updating | https://docs.linuxgsm.com/commands/update
+updateonstart="off"
+
+## Backup | https://docs.linuxgsm.com/commands/backup
+maxbackups="4"
+maxbackupdays="30"
+stoponbackup="on"
+
+## Logging | https://docs.linuxgsm.com/features/logging
+consolelogging="on"
+logdays="7"
+
+## Monitor | https://docs.linuxgsm.com/commands/monitor
+# Query delay time
+querydelay="5"
+
+## ANSI Colors | https://docs.linuxgsm.com/features/ansi-colors
+ansi="on"
+
+#### Advanced Settings ####
+
+## Message Display Time | https://docs.linuxgsm.com/features/message-display-time
+sleeptime="0.5"
+
+## SteamCMD Settings | https://docs.linuxgsm.com/steamcmd
+# Server appid
+appid="2728330"
+steamcmdforcewindows="no"
+# SteamCMD Branch | https://docs.linuxgsm.com/steamcmd/branch
+branch="linuxbranch"
+betapassword=""
+# Master Server | https://docs.linuxgsm.com/steamcmd/steam-master-server
+steammaster="true"
+
+## Stop Mode | https://docs.linuxgsm.com/features/stop-mode
+# 1: tmux kill
+# 2: CTRL+c
+# 3: quit
+# 4: quit 120s
+# 5: stop
+# 6: q
+# 7: exit
+# 8: 7 Days to Die
+# 9: GoldSrc
+# 10: Avorion
+# 11: end
+stopmode="2"
+
+## Query mode
+# 1: session only
+# 2: gamedig (gsquery fallback)
+# 3: gamedig
+# 4: gsquery
+# 5: tcp
+querymode="2"
+querytype="protocol-valve"
+
+## Console type
+consoleverbose="no"
+consoleinteract="no"
+
+## Game Server Details
+# Do not edit
+gamename="HumanitZ"
+engine="unreal4"
+glibc="2.17"
+
+#### Directories ####
+# Edit with care
+
+## Game Server Directories
+systemdir="${serverfiles}/TSSGame"
+executabledir="${systemdir}/Binaries/Linux"
+executable="./TSSGameServer-Linux-Shipping"
+servercfgdir="${systemdir}/Saved/Config/LinuxServer"
+servercfg="GameUserSettings.ini"
+servercfgdefault="GameUserSettings.ini"
+servercfgfullpath="${servercfgdir}/${servercfg}"
+
+## Backup Directory
+backupdir="${lgsmdir}/backup"
+
+## Logging Directories
+[ -n "${LGSM_LOGDIR}" ] && logdir="${LGSM_LOGDIR}" || logdir="${rootdir}/log"
+gamelogdir="${systemdir}/Saved/Logs"
+lgsmlogdir="${logdir}/script"
+consolelogdir="${logdir}/console"
+lgsmlog="${lgsmlogdir}/${selfname}-script.log"
+consolelog="${consolelogdir}/${selfname}-console.log"
+alertlog="${lgsmlogdir}/${selfname}-alert.log"
+postdetailslog="${lgsmlogdir}/${selfname}-postdetails.log"
+
+## Logs Naming
+lgsmlogdate="${lgsmlogdir}/${selfname}-script-$(date '+%Y-%m-%d-%H:%M:%S').log"
+consolelogdate="${consolelogdir}/${selfname}-console-$(date '+%Y-%m-%d-%H:%M:%S').log"
+
+## Log Parameters
+logtimestamp="off"
+logtimestampformat="%Y-%m-%d %H:%M:%S"
diff --git a/lgsm/data/almalinux-8.csv b/lgsm/data/almalinux-8.csv
index c156eb053..e73fcfaa0 100644
--- a/lgsm/data/almalinux-8.csv
+++ b/lgsm/data/almalinux-8.csv
@@ -54,6 +54,7 @@ hl2dm
 hldm
 hldms
 hw,zlib-devel
+hz
 ins
 inss
 ios
diff --git a/lgsm/data/almalinux-9.csv b/lgsm/data/almalinux-9.csv
index faacfa915..f5b5b5fc5 100644
--- a/lgsm/data/almalinux-9.csv
+++ b/lgsm/data/almalinux-9.csv
@@ -54,6 +54,7 @@ hl2dm
 hldm
 hldms
 hw,zlib-devel
+hz
 ins
 inss
 ios
diff --git a/lgsm/data/centos-7.csv b/lgsm/data/centos-7.csv
index 84df6f5c6..a80043346 100644
--- a/lgsm/data/centos-7.csv
+++ b/lgsm/data/centos-7.csv
@@ -54,6 +54,7 @@ hl2dm
 hldm
 hldms
 hw,zlib-devel
+hz
 ins
 inss
 ios
diff --git a/lgsm/data/centos-8.csv b/lgsm/data/centos-8.csv
index c156eb053..e73fcfaa0 100644
--- a/lgsm/data/centos-8.csv
+++ b/lgsm/data/centos-8.csv
@@ -54,6 +54,7 @@ hl2dm
 hldm
 hldms
 hw,zlib-devel
+hz
 ins
 inss
 ios
diff --git a/lgsm/data/centos-9.csv b/lgsm/data/centos-9.csv
index faacfa915..f5b5b5fc5 100644
--- a/lgsm/data/centos-9.csv
+++ b/lgsm/data/centos-9.csv
@@ -54,6 +54,7 @@ hl2dm
 hldm
 hldms
 hw,zlib-devel
+hz
 ins
 inss
 ios
diff --git a/lgsm/data/debian-10.csv b/lgsm/data/debian-10.csv
index 5f7f5f261..f5d63b026 100644
--- a/lgsm/data/debian-10.csv
+++ b/lgsm/data/debian-10.csv
@@ -53,6 +53,7 @@ hl2dm
 hldm
 hldms
 hw,lib32z1
+hz
 ins
 inss
 ios
diff --git a/lgsm/data/debian-11.csv b/lgsm/data/debian-11.csv
index 3ecedd538..97f5b978d 100644
--- a/lgsm/data/debian-11.csv
+++ b/lgsm/data/debian-11.csv
@@ -54,6 +54,7 @@ hl2dm
 hldm
 hldms
 hw,lib32z1
+hz
 ins
 inss
 ios
diff --git a/lgsm/data/debian-12.csv b/lgsm/data/debian-12.csv
index 0ff8b391d..e54d9b12b 100644
--- a/lgsm/data/debian-12.csv
+++ b/lgsm/data/debian-12.csv
@@ -54,6 +54,7 @@ hl2dm
 hldm
 hldms
 hw,lib32z1
+hz
 ins
 inss
 ios
diff --git a/lgsm/data/debian-9.csv b/lgsm/data/debian-9.csv
index cb5eea4a1..87b6dad91 100644
--- a/lgsm/data/debian-9.csv
+++ b/lgsm/data/debian-9.csv
@@ -54,6 +54,7 @@ hl2dm
 hldm
 hldms
 hw,lib32z1
+hz
 ins
 inss
 ios
diff --git a/lgsm/data/rhel-7.csv b/lgsm/data/rhel-7.csv
index 2b3be410d..3ecff6183 100644
--- a/lgsm/data/rhel-7.csv
+++ b/lgsm/data/rhel-7.csv
@@ -55,6 +55,7 @@ hl2dm
 hldm
 hldms
 hw,zlib-devel
+hz
 ins
 inss
 ios
diff --git a/lgsm/data/rhel-8.csv b/lgsm/data/rhel-8.csv
index c156eb053..e73fcfaa0 100644
--- a/lgsm/data/rhel-8.csv
+++ b/lgsm/data/rhel-8.csv
@@ -54,6 +54,7 @@ hl2dm
 hldm
 hldms
 hw,zlib-devel
+hz
 ins
 inss
 ios
diff --git a/lgsm/data/rhel-9.csv b/lgsm/data/rhel-9.csv
index faacfa915..f5b5b5fc5 100644
--- a/lgsm/data/rhel-9.csv
+++ b/lgsm/data/rhel-9.csv
@@ -54,6 +54,7 @@ hl2dm
 hldm
 hldms
 hw,zlib-devel
+hz
 ins
 inss
 ios
diff --git a/lgsm/data/rocky-8.csv b/lgsm/data/rocky-8.csv
index c156eb053..e73fcfaa0 100644
--- a/lgsm/data/rocky-8.csv
+++ b/lgsm/data/rocky-8.csv
@@ -54,6 +54,7 @@ hl2dm
 hldm
 hldms
 hw,zlib-devel
+hz
 ins
 inss
 ios
diff --git a/lgsm/data/rocky-9.csv b/lgsm/data/rocky-9.csv
index faacfa915..f5b5b5fc5 100644
--- a/lgsm/data/rocky-9.csv
+++ b/lgsm/data/rocky-9.csv
@@ -54,6 +54,7 @@ hl2dm
 hldm
 hldms
 hw,zlib-devel
+hz
 ins
 inss
 ios
diff --git a/lgsm/data/serverlist.csv b/lgsm/data/serverlist.csv
index 841dcbf42..ae270f965 100644
--- a/lgsm/data/serverlist.csv
+++ b/lgsm/data/serverlist.csv
@@ -53,6 +53,7 @@ hl2dm,hl2dmserver,Half-Life 2: Deathmatch,ubuntu-22.04
 hldm,hldmserver,Half-Life: Deathmatch,ubuntu-22.04
 hldms,hldmsserver,Half-Life Deathmatch: Source,ubuntu-22.04
 hw,hwserver,Hurtworld,ubuntu-22.04
+hz,hzserver,Humanitz,ubuntu-22.04
 ins,insserver,Insurgency,ubuntu-22.04
 inss,inssserver,Insurgency: Sandstorm,ubuntu-22.04
 ios,iosserver,IOSoccer,ubuntu-22.04
diff --git a/lgsm/data/ubuntu-16.04.csv b/lgsm/data/ubuntu-16.04.csv
index 9d88fde5c..41dbd0bc5 100644
--- a/lgsm/data/ubuntu-16.04.csv
+++ b/lgsm/data/ubuntu-16.04.csv
@@ -55,6 +55,7 @@ hl2dm
 hldm
 hldms
 hw,lib32z1
+hz
 ins
 inss
 ios
diff --git a/lgsm/data/ubuntu-18.04.csv b/lgsm/data/ubuntu-18.04.csv
index a0b809b05..469c66705 100644
--- a/lgsm/data/ubuntu-18.04.csv
+++ b/lgsm/data/ubuntu-18.04.csv
@@ -55,6 +55,7 @@ hl2dm
 hldm
 hldms
 hw,lib32z1
+hz
 ins
 inss
 ios
diff --git a/lgsm/data/ubuntu-20.04.csv b/lgsm/data/ubuntu-20.04.csv
index 092792fa3..4a41435c2 100644
--- a/lgsm/data/ubuntu-20.04.csv
+++ b/lgsm/data/ubuntu-20.04.csv
@@ -54,6 +54,7 @@ hl2dm
 hldm
 hldms
 hw,lib32z1
+hz
 ins
 inss
 ios
diff --git a/lgsm/data/ubuntu-22.04.csv b/lgsm/data/ubuntu-22.04.csv
index 21bab16cb..323b82a08 100644
--- a/lgsm/data/ubuntu-22.04.csv
+++ b/lgsm/data/ubuntu-22.04.csv
@@ -54,6 +54,7 @@ hl2dm
 hldm
 hldms
 hw,lib32z1
+hz
 ins
 inss
 ios
diff --git a/lgsm/data/ubuntu-23.04.csv b/lgsm/data/ubuntu-23.04.csv
index a29f403d7..e249a2968 100644
--- a/lgsm/data/ubuntu-23.04.csv
+++ b/lgsm/data/ubuntu-23.04.csv
@@ -54,6 +54,7 @@ hl2dm
 hldm
 hldms
 hw,lib32z1
+hz
 ins
 inss
 ios
diff --git a/lgsm/data/ubuntu-23.10.csv b/lgsm/data/ubuntu-23.10.csv
index a29f403d7..e249a2968 100644
--- a/lgsm/data/ubuntu-23.10.csv
+++ b/lgsm/data/ubuntu-23.10.csv
@@ -54,6 +54,7 @@ hl2dm
 hldm
 hldms
 hw,lib32z1
+hz
 ins
 inss
 ios
diff --git a/lgsm/modules/info_game.sh b/lgsm/modules/info_game.sh
index 97f8da87e..0725845a0 100644
--- a/lgsm/modules/info_game.sh
+++ b/lgsm/modules/info_game.sh
@@ -1328,6 +1328,23 @@ fn_info_game_hw() {
 	creativemode="${creativemode:-"NOT SET"}"
 }
 
+# Config Type: ini
+# Parameters: true
+# Comment: ; or #
+# Example: ServerName=SERVERNAME
+# Filetype: ini
+fn_info_game_hz() {
+	if [ -f "${servercfgfullpath}" ]; then
+		fn_info_game_ini "adminpassword" "AdminPassword"
+		fn_info_game_ini "servername" "ServerName"
+	fi
+	adminpass="${adminpassword:-"NOT SET"}"
+	port="${port:-"0"}"
+	queryport="${queryport:-"0"}"
+	rconport="$((port + 2))"
+	servername="${servername:-"NOT SET"}"
+}
+
 # Config Type: parameters
 # Parameters: true
 # Comment:
@@ -2335,6 +2352,8 @@ elif [ "${shortname}" == "fctr" ]; then
 	fn_info_game_fctr
 elif [ "${shortname}" == "hw" ]; then
 	fn_info_game_hw
+elif [ "${shortname}" == "hz" ]; then
+	fn_info_game_hz
 elif [ "${shortname}" == "inss" ]; then
 	fn_info_game_inss
 elif [ "${shortname}" == "jc2" ]; then
diff --git a/lgsm/modules/info_messages.sh b/lgsm/modules/info_messages.sh
index c5d03919c..a1e8f52ac 100644
--- a/lgsm/modules/info_messages.sh
+++ b/lgsm/modules/info_messages.sh
@@ -1064,6 +1064,15 @@ fn_info_messages_hw() {
 	} | column -s $'\t' -t
 }
 
+fn_info_messages_hz() {
+	{
+		fn_port "header"
+		fn_port "Game" port udp
+		fn_port "Query" queryport udp
+		fn_port "RCON" rconport tcp
+	} | column -s $'\t' -t
+}
+
 fn_info_messages_ins() {
 	{
 		fn_port "header"
@@ -1771,6 +1780,8 @@ fn_info_messages_select_engine() {
 		fn_info_messages_hcu
 	elif [ "${shortname}" == "hw" ]; then
 		fn_info_messages_hw
+	elif [ "${shortname}" == "hz" ]; then
+		fn_info_messages_hz
 	elif [ "${shortname}" == "ins" ]; then
 		fn_info_messages_ins
 	elif [ "${shortname}" == "inss" ]; then
diff --git a/lgsm/modules/install_config.sh b/lgsm/modules/install_config.sh
index a5a049913..9b3146770 100644
--- a/lgsm/modules/install_config.sh
+++ b/lgsm/modules/install_config.sh
@@ -495,6 +495,9 @@ elif [ "${shortname}" == "hl2dm" ]; then
 	fn_default_config_remote
 	fn_set_config_vars
 	fn_list_config_locations
+elif [ "${shortname}" == "hz" ]; then
+	# Config is generated on first run
+	:
 elif [ "${shortname}" == "ins" ]; then
 	array_configs+=(server.cfg)
 	fn_fetch_default_config

From 9d489d56dc9028b54d6d09fa1a2a2d274be76a10 Mon Sep 17 00:00:00 2001
From: Josh Gelman <Gelmo@users.noreply.github.com>
Date: Sat, 23 Mar 2024 05:01:23 -0600
Subject: [PATCH 094/154] fear(wf): Update Warfork path (#4541)

As of the latest update on Steam, the installation directory for Linux has been moved out of `Warfork.app/Contents/Resources/`

Co-authored-by: Daniel Gibbs <me@danielgibbs.co.uk>
---
 lgsm/config-default/config-lgsm/wfserver/_default.cfg | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/lgsm/config-default/config-lgsm/wfserver/_default.cfg b/lgsm/config-default/config-lgsm/wfserver/_default.cfg
index fb7211c8c..d59790ca5 100644
--- a/lgsm/config-default/config-lgsm/wfserver/_default.cfg
+++ b/lgsm/config-default/config-lgsm/wfserver/_default.cfg
@@ -156,7 +156,7 @@ glibc="2.15"
 # Edit with care
 
 ## Game Server Directories
-systemdir="${serverfiles}/Warfork.app/Contents/Resources"
+systemdir="${serverfiles}"
 executabledir="${systemdir}"
 executable="./wf_server.x86_64"
 servercfgdir="${systemdir}/basewf"

From 4fdf1f1af81e8549693759a6229279210c107204 Mon Sep 17 00:00:00 2001
From: Cristopfer Luis <ocristopfer@gmail.com>
Date: Sat, 23 Mar 2024 08:01:57 -0300
Subject: [PATCH 095/154] fix: add humanitz icon (#4536)

---
 lgsm/data/gameicons/hz-icon.png | Bin 0 -> 2783 bytes
 1 file changed, 0 insertions(+), 0 deletions(-)
 create mode 100644 lgsm/data/gameicons/hz-icon.png

diff --git a/lgsm/data/gameicons/hz-icon.png b/lgsm/data/gameicons/hz-icon.png
new file mode 100644
index 0000000000000000000000000000000000000000..7d2428669491e34cccea37d2311a988dac7027aa
GIT binary patch
literal 2783
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

literal 0
HcmV?d00001


From a6b8143be9adffd169828d63dec1e04acf1f7158 Mon Sep 17 00:00:00 2001
From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com>
Date: Sat, 23 Mar 2024 11:02:24 +0000
Subject: [PATCH 096/154] build(deps): bump actions/add-to-project from 0.5.0
 to 0.6.1 (#4538)

Bumps [actions/add-to-project](https://github.com/actions/add-to-project) from 0.5.0 to 0.6.1.
- [Release notes](https://github.com/actions/add-to-project/releases)
- [Commits](https://github.com/actions/add-to-project/compare/v0.5.0...v0.6.1)

---
updated-dependencies:
- dependency-name: actions/add-to-project
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: Daniel Gibbs <me@danielgibbs.co.uk>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
---
 .github/workflows/add-to-project.yml | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/.github/workflows/add-to-project.yml b/.github/workflows/add-to-project.yml
index 0ddccb572..ac2514b1d 100644
--- a/.github/workflows/add-to-project.yml
+++ b/.github/workflows/add-to-project.yml
@@ -11,7 +11,7 @@ jobs:
     runs-on: ubuntu-latest
     steps:
       - name: Add to Project
-        uses: actions/add-to-project@v0.5.0
+        uses: actions/add-to-project@v0.6.1
         with:
           project-url: https://github.com/orgs/GameServerManagers/projects/11
           github-token: ${{ secrets.ADD_TO_PROJECT_PAT }}

From 57ebe2063572c1c160acef3ff86c3c921f45799e Mon Sep 17 00:00:00 2001
From: MicLieg <38057464+MicLieg@users.noreply.github.com>
Date: Sat, 23 Mar 2024 12:02:58 +0100
Subject: [PATCH 097/154] fix(parse-details): change heading of output & add
 hint for creating new variables (#4531)

* Added hint for new variables

* Fixed heading of output
---
 lgsm/modules/command_dev_parse_game_details.sh | 4 ++--
 lgsm/modules/info_distro.sh                    | 1 +
 lgsm/modules/info_game.sh                      | 1 +
 3 files changed, 4 insertions(+), 2 deletions(-)

diff --git a/lgsm/modules/command_dev_parse_game_details.sh b/lgsm/modules/command_dev_parse_game_details.sh
index f5d6d697d..4dcf33c2a 100644
--- a/lgsm/modules/command_dev_parse_game_details.sh
+++ b/lgsm/modules/command_dev_parse_game_details.sh
@@ -144,7 +144,7 @@ done
 # Sort and output the available distro details.
 if [ -n "$available_details" ]; then
 	echo -e ""
-    echo -e "${bold}${lightgreen}Available Distro Details${default}"
+    echo -e "${bold}${lightgreen}Available Gameserver Details${default}"
     fn_messages_separator
     echo -e "${available_details}" | sort
 fi
@@ -152,7 +152,7 @@ fi
 # Output the missing server details if there are any.
 if [ -n "$missing_details" ]; then
 	echo -e ""
-	echo -e "${lightgreen}Missing or unsupported Server Details${default}"
+	echo -e "${lightgreen}Missing or unsupported Gameserver Details${default}"
 	fn_messages_separator
 	echo -e "${missing_details}" | sort
 fi
diff --git a/lgsm/modules/info_distro.sh b/lgsm/modules/info_distro.sh
index 4465d6cdb..adcdb759b 100644
--- a/lgsm/modules/info_distro.sh
+++ b/lgsm/modules/info_distro.sh
@@ -5,6 +5,7 @@
 # Website: https://linuxgsm.com
 # Description: Variables providing useful info on the Operating System such as disk and performace info.
 # Used for command_details.sh, command_debug.sh and alert.sh.
+# !Note: When adding variables to this script, ensure that they are also added to the command_dev_parse_distro_details.sh script.
 
 moduleselfname="$(basename "$(readlink -f "${BASH_SOURCE[0]}")")"
 
diff --git a/lgsm/modules/info_game.sh b/lgsm/modules/info_game.sh
index 0725845a0..497a65f22 100644
--- a/lgsm/modules/info_game.sh
+++ b/lgsm/modules/info_game.sh
@@ -4,6 +4,7 @@
 # Contributors: http://linuxgsm.com/contrib
 # Website: https://linuxgsm.com
 # Description: Gathers various game server information.
+# !Note: When adding variables to this script, ensure that they are also added to the command_dev_parse_game_details.sh script.
 
 # shellcheck disable=SC2317
 moduleselfname="$(basename "$(readlink -f "${BASH_SOURCE[0]}")")"

From 06d9eda27fba2c63d1139aa04c5afa634ed0892e Mon Sep 17 00:00:00 2001
From: Silje Ljosland Bakke <siljelb@users.noreply.github.com>
Date: Thu, 4 Apr 2024 11:37:28 +0200
Subject: [PATCH 098/154] fix(vh): update bepinexvh url to new url #4547
 (#4548)

---
 lgsm/modules/mods_list.sh | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/lgsm/modules/mods_list.sh b/lgsm/modules/mods_list.sh
index c9a316055..c13565004 100644
--- a/lgsm/modules/mods_list.sh
+++ b/lgsm/modules/mods_list.sh
@@ -105,7 +105,7 @@ oxidesdtdlatestlink=$(curl --connect-timeout 10 -sL https://api.github.com/repos
 # Valheim Plus
 valheimpluslatestlink=$(curl --connect-timeout 10 -sL https://api.github.com/repos/Grantapher/ValheimPlus/releases/latest | jq -r '.assets[]|select(.browser_download_url | contains("UnixServer.tar.gz")) | .browser_download_url')
 # Valheim BepInEx
-bepinexvhlatestlink=$(curl --connect-timeout 10 -sL "https://valheim.thunderstore.io/api/experimental/package/denikson/BepInExPack_Valheim/" -H "accept: application/json" | jq -r '.latest.download_url')
+bepinexvhlatestlink=$(curl --connect-timeout 10 -sL "https://thunderstore.io/api/experimental/package/denikson/BepInExPack_Valheim/" -H "accept: application/json" | jq -r '.latest.download_url')
 
 # Define mods information (required)
 

From a2df0c49e98e690bb0cbd60517cf714ccfa7e674 Mon Sep 17 00:00:00 2001
From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com>
Date: Thu, 4 Apr 2024 10:39:31 +0100
Subject: [PATCH 099/154] build(deps): bump actions/add-to-project from 0.5.0
 to 1.0.0 (#4546)

Bumps [actions/add-to-project](https://github.com/actions/add-to-project) from 0.5.0 to 1.0.0.
- [Release notes](https://github.com/actions/add-to-project/releases)
- [Commits](https://github.com/actions/add-to-project/compare/v0.5.0...v1.0.0)

---
updated-dependencies:
- dependency-name: actions/add-to-project
  dependency-type: direct:production
  update-type: version-update:semver-major
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: Daniel Gibbs <me@danielgibbs.co.uk>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
---
 .github/workflows/add-to-project.yml | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/.github/workflows/add-to-project.yml b/.github/workflows/add-to-project.yml
index ac2514b1d..e6f6ee9be 100644
--- a/.github/workflows/add-to-project.yml
+++ b/.github/workflows/add-to-project.yml
@@ -11,7 +11,7 @@ jobs:
     runs-on: ubuntu-latest
     steps:
       - name: Add to Project
-        uses: actions/add-to-project@v0.6.1
+        uses: actions/add-to-project@v1.0.0
         with:
           project-url: https://github.com/orgs/GameServerManagers/projects/11
           github-token: ${{ secrets.ADD_TO_PROJECT_PAT }}

From 95c34edaf2c28624eaf681cf31d275a4e71db379 Mon Sep 17 00:00:00 2001
From: Daniel Gibbs <me@danielgibbs.co.uk>
Date: Thu, 4 Apr 2024 10:46:59 +0100
Subject: [PATCH 100/154] fix(pw): change query mode to check only

---
 lgsm/config-default/config-lgsm/pwserver/_default.cfg | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/lgsm/config-default/config-lgsm/pwserver/_default.cfg b/lgsm/config-default/config-lgsm/pwserver/_default.cfg
index e069ec1b1..62429fec8 100644
--- a/lgsm/config-default/config-lgsm/pwserver/_default.cfg
+++ b/lgsm/config-default/config-lgsm/pwserver/_default.cfg
@@ -141,7 +141,7 @@ stopmode="2"
 # 3: gamedig
 # 4: gsquery
 # 5: tcp
-querymode="3"
+querymode="1"
 querytype="palworld"
 
 ## Console type

From 1387ee0dfdf837a677eedba898831fc576e15f28 Mon Sep 17 00:00:00 2001
From: Daniel Gibbs <me@danielgibbs.co.uk>
Date: Thu, 4 Apr 2024 10:53:56 +0100
Subject: [PATCH 101/154] fix(vh): update binary name (#4551)

---
 lgsm/config-default/config-lgsm/pwserver/_default.cfg | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/lgsm/config-default/config-lgsm/pwserver/_default.cfg b/lgsm/config-default/config-lgsm/pwserver/_default.cfg
index 62429fec8..5e848264e 100644
--- a/lgsm/config-default/config-lgsm/pwserver/_default.cfg
+++ b/lgsm/config-default/config-lgsm/pwserver/_default.cfg
@@ -160,7 +160,7 @@ glibc="2.17"
 ## Game Server Directories
 systemdir="${serverfiles}/Pal"
 executabledir="${systemdir}/Binaries/Linux/"
-executable="./PalServer-Linux-Test"
+executable="./PalServer-Linux-Shipping"
 servercfgdir="${serverfiles}/Pal/Saved/Config/LinuxServer"
 servercfg="PalWorldSettings.ini"
 servercfgdefault="PalWorldSettings.ini"

From f439fa213e391d687a62384ae8c7e3995463e070 Mon Sep 17 00:00:00 2001
From: Daniel Gibbs <me@danielgibbs.co.uk>
Date: Thu, 4 Apr 2024 11:02:01 +0100
Subject: [PATCH 102/154] Release v24.2.0

---
 lgsm/modules/core_modules.sh | 2 +-
 linuxgsm.sh                  | 2 +-
 2 files changed, 2 insertions(+), 2 deletions(-)

diff --git a/lgsm/modules/core_modules.sh b/lgsm/modules/core_modules.sh
index 7ea0402e3..6fda8c2ca 100644
--- a/lgsm/modules/core_modules.sh
+++ b/lgsm/modules/core_modules.sh
@@ -8,7 +8,7 @@
 
 moduleselfname="$(basename "$(readlink -f "${BASH_SOURCE[0]}")")"
 
-modulesversion="v24.1.5"
+modulesversion="v24.2.0"
 
 # Core
 
diff --git a/linuxgsm.sh b/linuxgsm.sh
index c68f19dc2..23ca9f88f 100755
--- a/linuxgsm.sh
+++ b/linuxgsm.sh
@@ -24,7 +24,7 @@ if [ -f ".dev-debug" ]; then
 	set -x
 fi
 
-version="v24.1.5"
+version="v24.2.0"
 shortname="core"
 gameservername="core"
 commandname="CORE"

From dc6cbcea5025ab8bd47a69fab1af76be7c26d68e Mon Sep 17 00:00:00 2001
From: MicLieg <38057464+MicLieg@users.noreply.github.com>
Date: Sun, 5 May 2024 22:55:52 +0200
Subject: [PATCH 103/154] fix(mcserver): change required jdk to 21 (#4562)

* fix(mcserver): change required jdk to 21

* update java on other distros

---------

Co-authored-by: Daniel Gibbs <me@danielgibbs.co.uk>
---
 lgsm/data/almalinux-8.csv  |  8 ++++----
 lgsm/data/almalinux-9.csv  | 12 ++++++------
 lgsm/data/centos-7.csv     |  2 +-
 lgsm/data/centos-8.csv     |  2 +-
 lgsm/data/centos-9.csv     |  4 ++--
 lgsm/data/rhel-8.csv       | 12 ++++++------
 lgsm/data/rhel-9.csv       | 12 ++++++------
 lgsm/data/rocky-8.csv      | 12 ++++++------
 lgsm/data/rocky-9.csv      | 12 ++++++------
 lgsm/data/ubuntu-20.04.csv | 10 +++++-----
 lgsm/data/ubuntu-22.04.csv | 12 ++++++------
 lgsm/data/ubuntu-23.04.csv |  2 +-
 lgsm/data/ubuntu-23.10.csv |  2 +-
 13 files changed, 51 insertions(+), 51 deletions(-)

diff --git a/lgsm/data/almalinux-8.csv b/lgsm/data/almalinux-8.csv
index e73fcfaa0..4d6c05ca5 100644
--- a/lgsm/data/almalinux-8.csv
+++ b/lgsm/data/almalinux-8.csv
@@ -65,7 +65,7 @@ kf
 kf2
 l4d
 l4d2
-mc,java-17-openjdk
+mc,java-21-openjdk
 mcb,libnsl
 mh
 mohaa,compat-libstdc++-33.i686
@@ -82,7 +82,7 @@ onset,mariadb-connector-c
 opfor
 pc
 pc2
-pmc,java-17-openjdk
+pmc,java-21-openjdk
 ps,GConf2
 pvkii
 pvr,libcxx
@@ -128,11 +128,11 @@ ut3
 ut99
 vh,glibc-devel
 vints,aspnetcore-runtime-7.0
-vpmc,java-17-openjdk
+vpmc,java-21-openjdk
 vs
 wet
 wf
-wmc,java-17-openjdk
+wmc,java-21-openjdk
 wurm,xorg-x11-server-Xvfb
 zmr,ncurses-libs.i686
 zps,ncurses-libs.i686
diff --git a/lgsm/data/almalinux-9.csv b/lgsm/data/almalinux-9.csv
index f5b5b5fc5..2cdd36575 100644
--- a/lgsm/data/almalinux-9.csv
+++ b/lgsm/data/almalinux-9.csv
@@ -65,7 +65,7 @@ kf
 kf2
 l4d
 l4d2
-mc,java-17-openjdk
+mc,java-21-openjdk
 mcb,libnsl
 mh
 mohaa,compat-libstdc++-33.i686
@@ -82,12 +82,12 @@ onset,mariadb-connector-c
 opfor
 pc
 pc2
-pmc,java-17-openjdk
+pmc,java-21-openjdk
 ps,GConf2
 pvkii
 pvr,libcxx
 pw
-pz,java-11-openjdk rng-tools
+pz,java-21-openjdk rng-tools
 q2
 q3
 q4
@@ -97,7 +97,7 @@ ricochet
 ro
 rtcw
 rust,zlib-devel
-rw,java-11-openjdk
+rw,java-21-openjdk
 samp
 sb
 sbots
@@ -128,11 +128,11 @@ ut3
 ut99
 vh,glibc-devel
 vints,aspnetcore-runtime-7.0
-vpmc,java-17-openjdk
+vpmc,java-21-openjdk
 vs
 wet
 wf
-wmc,java-17-openjdk
+wmc,java-21-openjdk
 wurm,xorg-x11-server-Xvfb
 zmr,ncurses-libs.i686
 zps,ncurses-libs.i686
diff --git a/lgsm/data/centos-7.csv b/lgsm/data/centos-7.csv
index a80043346..df7422526 100644
--- a/lgsm/data/centos-7.csv
+++ b/lgsm/data/centos-7.csv
@@ -65,7 +65,7 @@ kf
 kf2
 l4d
 l4d2
-mc,java-11-openjdk
+mc,java-21-openjdk
 mcb,libnsl
 mh
 mohaa,compat-libstdc++-33.i686
diff --git a/lgsm/data/centos-8.csv b/lgsm/data/centos-8.csv
index e73fcfaa0..831bc38e9 100644
--- a/lgsm/data/centos-8.csv
+++ b/lgsm/data/centos-8.csv
@@ -65,7 +65,7 @@ kf
 kf2
 l4d
 l4d2
-mc,java-17-openjdk
+mc,java-21-openjdk
 mcb,libnsl
 mh
 mohaa,compat-libstdc++-33.i686
diff --git a/lgsm/data/centos-9.csv b/lgsm/data/centos-9.csv
index f5b5b5fc5..4d49ee66e 100644
--- a/lgsm/data/centos-9.csv
+++ b/lgsm/data/centos-9.csv
@@ -87,7 +87,7 @@ ps,GConf2
 pvkii
 pvr,libcxx
 pw
-pz,java-11-openjdk rng-tools
+pz,java-21-openjdk rng-tools
 q2
 q3
 q4
@@ -97,7 +97,7 @@ ricochet
 ro
 rtcw
 rust,zlib-devel
-rw,java-11-openjdk
+rw,java-21-openjdk
 samp
 sb
 sbots
diff --git a/lgsm/data/rhel-8.csv b/lgsm/data/rhel-8.csv
index e73fcfaa0..a378694b2 100644
--- a/lgsm/data/rhel-8.csv
+++ b/lgsm/data/rhel-8.csv
@@ -65,7 +65,7 @@ kf
 kf2
 l4d
 l4d2
-mc,java-17-openjdk
+mc,java-21-openjdk
 mcb,libnsl
 mh
 mohaa,compat-libstdc++-33.i686
@@ -82,12 +82,12 @@ onset,mariadb-connector-c
 opfor
 pc
 pc2
-pmc,java-17-openjdk
+pmc,java-21-openjdk
 ps,GConf2
 pvkii
 pvr,libcxx
 pw
-pz,java-11-openjdk rng-tools
+pz,java-21-openjdk rng-tools
 q2
 q3
 q4
@@ -97,7 +97,7 @@ ricochet
 ro
 rtcw
 rust,zlib-devel
-rw,java-11-openjdk
+rw,java-21-openjdk
 samp
 sb
 sbots
@@ -128,11 +128,11 @@ ut3
 ut99
 vh,glibc-devel
 vints,aspnetcore-runtime-7.0
-vpmc,java-17-openjdk
+vpmc,java-21-openjdk
 vs
 wet
 wf
-wmc,java-17-openjdk
+wmc,java-21-openjdk
 wurm,xorg-x11-server-Xvfb
 zmr,ncurses-libs.i686
 zps,ncurses-libs.i686
diff --git a/lgsm/data/rhel-9.csv b/lgsm/data/rhel-9.csv
index f5b5b5fc5..2cdd36575 100644
--- a/lgsm/data/rhel-9.csv
+++ b/lgsm/data/rhel-9.csv
@@ -65,7 +65,7 @@ kf
 kf2
 l4d
 l4d2
-mc,java-17-openjdk
+mc,java-21-openjdk
 mcb,libnsl
 mh
 mohaa,compat-libstdc++-33.i686
@@ -82,12 +82,12 @@ onset,mariadb-connector-c
 opfor
 pc
 pc2
-pmc,java-17-openjdk
+pmc,java-21-openjdk
 ps,GConf2
 pvkii
 pvr,libcxx
 pw
-pz,java-11-openjdk rng-tools
+pz,java-21-openjdk rng-tools
 q2
 q3
 q4
@@ -97,7 +97,7 @@ ricochet
 ro
 rtcw
 rust,zlib-devel
-rw,java-11-openjdk
+rw,java-21-openjdk
 samp
 sb
 sbots
@@ -128,11 +128,11 @@ ut3
 ut99
 vh,glibc-devel
 vints,aspnetcore-runtime-7.0
-vpmc,java-17-openjdk
+vpmc,java-21-openjdk
 vs
 wet
 wf
-wmc,java-17-openjdk
+wmc,java-21-openjdk
 wurm,xorg-x11-server-Xvfb
 zmr,ncurses-libs.i686
 zps,ncurses-libs.i686
diff --git a/lgsm/data/rocky-8.csv b/lgsm/data/rocky-8.csv
index e73fcfaa0..a378694b2 100644
--- a/lgsm/data/rocky-8.csv
+++ b/lgsm/data/rocky-8.csv
@@ -65,7 +65,7 @@ kf
 kf2
 l4d
 l4d2
-mc,java-17-openjdk
+mc,java-21-openjdk
 mcb,libnsl
 mh
 mohaa,compat-libstdc++-33.i686
@@ -82,12 +82,12 @@ onset,mariadb-connector-c
 opfor
 pc
 pc2
-pmc,java-17-openjdk
+pmc,java-21-openjdk
 ps,GConf2
 pvkii
 pvr,libcxx
 pw
-pz,java-11-openjdk rng-tools
+pz,java-21-openjdk rng-tools
 q2
 q3
 q4
@@ -97,7 +97,7 @@ ricochet
 ro
 rtcw
 rust,zlib-devel
-rw,java-11-openjdk
+rw,java-21-openjdk
 samp
 sb
 sbots
@@ -128,11 +128,11 @@ ut3
 ut99
 vh,glibc-devel
 vints,aspnetcore-runtime-7.0
-vpmc,java-17-openjdk
+vpmc,java-21-openjdk
 vs
 wet
 wf
-wmc,java-17-openjdk
+wmc,java-21-openjdk
 wurm,xorg-x11-server-Xvfb
 zmr,ncurses-libs.i686
 zps,ncurses-libs.i686
diff --git a/lgsm/data/rocky-9.csv b/lgsm/data/rocky-9.csv
index f5b5b5fc5..2cdd36575 100644
--- a/lgsm/data/rocky-9.csv
+++ b/lgsm/data/rocky-9.csv
@@ -65,7 +65,7 @@ kf
 kf2
 l4d
 l4d2
-mc,java-17-openjdk
+mc,java-21-openjdk
 mcb,libnsl
 mh
 mohaa,compat-libstdc++-33.i686
@@ -82,12 +82,12 @@ onset,mariadb-connector-c
 opfor
 pc
 pc2
-pmc,java-17-openjdk
+pmc,java-21-openjdk
 ps,GConf2
 pvkii
 pvr,libcxx
 pw
-pz,java-11-openjdk rng-tools
+pz,java-21-openjdk rng-tools
 q2
 q3
 q4
@@ -97,7 +97,7 @@ ricochet
 ro
 rtcw
 rust,zlib-devel
-rw,java-11-openjdk
+rw,java-21-openjdk
 samp
 sb
 sbots
@@ -128,11 +128,11 @@ ut3
 ut99
 vh,glibc-devel
 vints,aspnetcore-runtime-7.0
-vpmc,java-17-openjdk
+vpmc,java-21-openjdk
 vs
 wet
 wf
-wmc,java-17-openjdk
+wmc,java-21-openjdk
 wurm,xorg-x11-server-Xvfb
 zmr,ncurses-libs.i686
 zps,ncurses-libs.i686
diff --git a/lgsm/data/ubuntu-20.04.csv b/lgsm/data/ubuntu-20.04.csv
index 4a41435c2..8d4cc6e52 100644
--- a/lgsm/data/ubuntu-20.04.csv
+++ b/lgsm/data/ubuntu-20.04.csv
@@ -65,7 +65,7 @@ kf
 kf2
 l4d
 l4d2
-mc,openjdk-17-jre
+mc,openjdk-21-jre
 mcb
 mh
 mohaa,libstdc++5:i386
@@ -82,12 +82,12 @@ onset,libmariadb-dev
 opfor
 pc
 pc2
-pmc,openjdk-17-jre
+pmc,openjdk-21-jre
 ps,libgconf-2-4
 pvkii
 pvr,libc++1
 pw
-pz,openjdk-17-jre,rng-tools
+pz,openjdk-21-jre,rng-tools
 q2
 q3
 q4
@@ -97,7 +97,7 @@ ricochet
 ro
 rtcw
 rust,lib32z1
-rw,openjdk-17-jre
+rw,openjdk-21-jre
 samp
 sb
 sbots
@@ -132,7 +132,7 @@ vpmc,openjdk-11-jre
 vs
 wet
 wf
-wmc,openjdk-17-jre
+wmc,openjdk-21-jre
 wurm,xvfb
 zmr,libtinfo5:i386
 zps,libtinfo5:i386
diff --git a/lgsm/data/ubuntu-22.04.csv b/lgsm/data/ubuntu-22.04.csv
index 323b82a08..67d28b5e9 100644
--- a/lgsm/data/ubuntu-22.04.csv
+++ b/lgsm/data/ubuntu-22.04.csv
@@ -65,7 +65,7 @@ kf
 kf2
 l4d
 l4d2
-mc,openjdk-17-jre
+mc,openjdk-21-jre
 mcb
 mh
 mohaa,libstdc++5:i386
@@ -82,12 +82,12 @@ onset,libmariadb-dev
 opfor
 pc
 pc2
-pmc,openjdk-17-jre
+pmc,openjdk-21-jre
 ps,libgconf-2-4
 pvkii
 pvr,libc++1
 pw
-pz,openjdk-17-jre,rng-tools5
+pz,openjdk-21-jre,rng-tools5
 q2
 q3
 q4
@@ -97,7 +97,7 @@ ricochet
 ro
 rtcw
 rust,lib32z1
-rw,openjdk-17-jre
+rw,openjdk-21-jre
 samp
 sb
 sbots
@@ -128,11 +128,11 @@ ut3
 ut99
 vh,libc6-dev
 vints,aspnetcore-runtime-7.0
-vpmc,openjdk-17-jre
+vpmc,openjdk-21-jre
 vs
 wet
 wf
-wmc,openjdk-17-jre
+wmc,openjdk-21-jre
 wurm,xvfb
 zmr,libtinfo5:i386
 zps,libtinfo5:i386
diff --git a/lgsm/data/ubuntu-23.04.csv b/lgsm/data/ubuntu-23.04.csv
index e249a2968..8b2246402 100644
--- a/lgsm/data/ubuntu-23.04.csv
+++ b/lgsm/data/ubuntu-23.04.csv
@@ -65,7 +65,7 @@ kf
 kf2
 l4d
 l4d2
-mc,openjdk-17-jre
+mc,openjdk-21-jre
 mcb
 mh
 mohaa,libstdc++5:i386
diff --git a/lgsm/data/ubuntu-23.10.csv b/lgsm/data/ubuntu-23.10.csv
index e249a2968..8b2246402 100644
--- a/lgsm/data/ubuntu-23.10.csv
+++ b/lgsm/data/ubuntu-23.10.csv
@@ -65,7 +65,7 @@ kf
 kf2
 l4d
 l4d2
-mc,openjdk-17-jre
+mc,openjdk-21-jre
 mcb
 mh
 mohaa,libstdc++5:i386

From 1c596972ff77d5de40e0a60f6f8459547ebcbf6a Mon Sep 17 00:00:00 2001
From: BertBrenner <42405825+BertBrenner@users.noreply.github.com>
Date: Sun, 5 May 2024 22:56:07 +0200
Subject: [PATCH 104/154] Update update_mc.sh (#4563)

If the executable variable is modified, fn_update_dl does not update minecraft_server.jar and which is used in fn_update_localbuild.

In addition this creates a problem if a alternative executable is used to launch minecraft by overwriting it.

Co-authored-by: Daniel Gibbs <me@danielgibbs.co.uk>
---
 lgsm/modules/update_mc.sh | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/lgsm/modules/update_mc.sh b/lgsm/modules/update_mc.sh
index 4a0bdde37..40038ddeb 100644
--- a/lgsm/modules/update_mc.sh
+++ b/lgsm/modules/update_mc.sh
@@ -10,7 +10,7 @@ moduleselfname="$(basename "$(readlink -f "${BASH_SOURCE[0]}")")"
 fn_update_dl() {
 	# Download and extract files to serverfiles.
 	fn_fetch_file "${remotebuildurl}" "" "" "" "${tmpdir}" "${remotebuildfilename}" "chmodx" "norun" "noforce" "nohash"
-	cp -f "${tmpdir}/${remotebuildfilename}" "${serverfiles}/${executable#./}"
+	cp -f "${tmpdir}/${remotebuildfilename}" "${serverfiles}/minecraft_server.jar"
 	fn_clear_tmp
 }
 

From c89cc62bb65b4b041919df8fdfc571df6b5c330f Mon Sep 17 00:00:00 2001
From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com>
Date: Sun, 5 May 2024 21:56:23 +0100
Subject: [PATCH 105/154] build(deps): bump actions/add-to-project from 1.0.0
 to 1.0.1 (#4558)

Bumps [actions/add-to-project](https://github.com/actions/add-to-project) from 1.0.0 to 1.0.1.
- [Release notes](https://github.com/actions/add-to-project/releases)
- [Commits](https://github.com/actions/add-to-project/compare/v1.0.0...v1.0.1)

---
updated-dependencies:
- dependency-name: actions/add-to-project
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
---
 .github/workflows/add-to-project.yml | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/.github/workflows/add-to-project.yml b/.github/workflows/add-to-project.yml
index e6f6ee9be..fb092b649 100644
--- a/.github/workflows/add-to-project.yml
+++ b/.github/workflows/add-to-project.yml
@@ -11,7 +11,7 @@ jobs:
     runs-on: ubuntu-latest
     steps:
       - name: Add to Project
-        uses: actions/add-to-project@v1.0.0
+        uses: actions/add-to-project@v1.0.1
         with:
           project-url: https://github.com/orgs/GameServerManagers/projects/11
           github-token: ${{ secrets.ADD_TO_PROJECT_PAT }}

From 3da072cae4a8e6a96b69c39ca6fbe6e992b48663 Mon Sep 17 00:00:00 2001
From: Daniel Gibbs <me@danielgibbs.co.uk>
Date: Sun, 5 May 2024 21:57:16 +0100
Subject: [PATCH 106/154] Release v24.2.1

---
 lgsm/modules/core_modules.sh | 2 +-
 linuxgsm.sh                  | 2 +-
 2 files changed, 2 insertions(+), 2 deletions(-)

diff --git a/lgsm/modules/core_modules.sh b/lgsm/modules/core_modules.sh
index 6fda8c2ca..f083a4893 100644
--- a/lgsm/modules/core_modules.sh
+++ b/lgsm/modules/core_modules.sh
@@ -8,7 +8,7 @@
 
 moduleselfname="$(basename "$(readlink -f "${BASH_SOURCE[0]}")")"
 
-modulesversion="v24.2.0"
+modulesversion="v24.2.1"
 
 # Core
 
diff --git a/linuxgsm.sh b/linuxgsm.sh
index 23ca9f88f..8db9a57c9 100755
--- a/linuxgsm.sh
+++ b/linuxgsm.sh
@@ -24,7 +24,7 @@ if [ -f ".dev-debug" ]; then
 	set -x
 fi
 
-version="v24.2.0"
+version="v24.2.1"
 shortname="core"
 gameservername="core"
 commandname="CORE"

From 0b8a2237232d1948ebb49216bd17fadf687247e9 Mon Sep 17 00:00:00 2001
From: Daniel Gibbs <me@danielgibbs.co.uk>
Date: Sun, 5 May 2024 23:32:04 +0100
Subject: [PATCH 107/154] feat(deps): add Ubuntu 24.04

---
 lgsm/data/ubuntu-23.04.csv |  10 +--
 lgsm/data/ubuntu-23.10.csv |  10 +--
 lgsm/data/ubuntu-24.04.csv | 138 +++++++++++++++++++++++++++++++++++++
 3 files changed, 148 insertions(+), 10 deletions(-)
 create mode 100644 lgsm/data/ubuntu-24.04.csv

diff --git a/lgsm/data/ubuntu-23.04.csv b/lgsm/data/ubuntu-23.04.csv
index 8b2246402..1b50ed7ef 100644
--- a/lgsm/data/ubuntu-23.04.csv
+++ b/lgsm/data/ubuntu-23.04.csv
@@ -82,12 +82,12 @@ onset,libmariadb-dev
 opfor
 pc
 pc2
-pmc,openjdk-17-jre
+pmc,openjdk-21-jre
 ps,libgconf-2-4
 pvkii
 pvr,libc++1
 pw
-pz,openjdk-17-jre,rng-tools5
+pz,openjdk-21-jre,rng-tools5
 q2
 q3
 q4
@@ -97,7 +97,7 @@ ricochet
 ro
 rtcw
 rust,lib32z1
-rw,openjdk-17-jre
+rw,openjdk-21-jre
 samp
 sb
 sbots
@@ -128,11 +128,11 @@ ut3
 ut99
 vh,libc6-dev
 vints,aspnetcore-runtime-7.0
-vpmc,openjdk-17-jre
+vpmc,openjdk-21-jre
 vs
 wet
 wf
-wmc,openjdk-17-jre
+wmc,openjdk-21-jre
 wurm,xvfb
 zmr,libtinfo5:i386
 zps,libtinfo5:i386
diff --git a/lgsm/data/ubuntu-23.10.csv b/lgsm/data/ubuntu-23.10.csv
index 8b2246402..1b50ed7ef 100644
--- a/lgsm/data/ubuntu-23.10.csv
+++ b/lgsm/data/ubuntu-23.10.csv
@@ -82,12 +82,12 @@ onset,libmariadb-dev
 opfor
 pc
 pc2
-pmc,openjdk-17-jre
+pmc,openjdk-21-jre
 ps,libgconf-2-4
 pvkii
 pvr,libc++1
 pw
-pz,openjdk-17-jre,rng-tools5
+pz,openjdk-21-jre,rng-tools5
 q2
 q3
 q4
@@ -97,7 +97,7 @@ ricochet
 ro
 rtcw
 rust,lib32z1
-rw,openjdk-17-jre
+rw,openjdk-21-jre
 samp
 sb
 sbots
@@ -128,11 +128,11 @@ ut3
 ut99
 vh,libc6-dev
 vints,aspnetcore-runtime-7.0
-vpmc,openjdk-17-jre
+vpmc,openjdk-21-jre
 vs
 wet
 wf
-wmc,openjdk-17-jre
+wmc,openjdk-21-jre
 wurm,xvfb
 zmr,libtinfo5:i386
 zps,libtinfo5:i386
diff --git a/lgsm/data/ubuntu-24.04.csv b/lgsm/data/ubuntu-24.04.csv
new file mode 100644
index 000000000..1b50ed7ef
--- /dev/null
+++ b/lgsm/data/ubuntu-24.04.csv
@@ -0,0 +1,138 @@
+all,bc,binutils,bsdmainutils,bzip2,ca-certificates,cpio,curl,distro-info,file,gzip,hostname,jq,lib32gcc-s1,lib32stdc++6,netcat-openbsd,pigz,python3,tar,tmux,unzip,util-linux,uuid-runtime,wget,xz-utils
+steamcmd,lib32gcc-s1,lib32stdc++6,libsdl2-2.0-0:i386,steamcmd
+ac
+ahl
+ahl2
+ark
+arma3
+armar,libcurl4
+ats
+av
+bb
+bb2,libcurl4-gnutls-dev:i386
+bd
+bf1942,libncurses5:i386,libtinfo5:i386
+bfv,libncurses5:i386,libstdc++5:i386
+bmdm,libncurses5:i386
+bo
+bs
+bt,libicu-dev,dos2unix,libxml2-utils
+btl
+cc
+ck,xvfb,libxi6
+cmw
+cod,libstdc++5:i386
+cod2,libstdc++5:i386
+cod4
+coduo,libstdc++5:i386
+codwaw
+col
+cs
+cs2
+cscz
+csgo
+css,libtinfo5:i386
+ct
+dab
+dayz
+dmc
+dod
+dodr
+dods
+doi
+dst,libcurl4-gnutls-dev:i386
+dys
+eco,libgdiplus
+em
+etl
+ets2
+fctr
+fof
+gmod,libtinfo5:i386
+hcu
+hl2dm
+hldm
+hldms
+hw,lib32z1
+hz
+ins
+inss
+ios
+jc2
+jc3
+jk2
+kf
+kf2
+l4d
+l4d2
+mc,openjdk-21-jre
+mcb
+mh
+mohaa,libstdc++5:i386
+mom
+mta,libncursesw5,libxml2-utils
+nd
+nec
+nmrih,libtinfo5:i386
+ns
+ns2,speex,libtbb2
+ns2c,speex:i386,libtbb2
+ohd
+onset,libmariadb-dev
+opfor
+pc
+pc2
+pmc,openjdk-21-jre
+ps,libgconf-2-4
+pvkii
+pvr,libc++1
+pw
+pz,openjdk-21-jre,rng-tools5
+q2
+q3
+q4
+ql
+qw
+ricochet
+ro
+rtcw
+rust,lib32z1
+rw,openjdk-21-jre
+samp
+sb
+sbots
+scpsl,mono-complete
+scpslsm,mono-complete
+sdtd,telnet,expect,libxml2-utils
+sf
+sfc,libtinfo5:i386
+sof2
+sol
+squad
+st,libxml2-utils
+stn
+sven,libssl1.1:i386,zlib1g:i386
+terraria
+tf
+tf2,libcurl4-gnutls-dev:i386
+tfc
+ti
+ts
+ts3
+tu
+tw
+unt
+ut
+ut2k4
+ut3
+ut99
+vh,libc6-dev
+vints,aspnetcore-runtime-7.0
+vpmc,openjdk-21-jre
+vs
+wet
+wf
+wmc,openjdk-21-jre
+wurm,xvfb
+zmr,libtinfo5:i386
+zps,libtinfo5:i386

From a2bea8d7915de2a9fb88d35dce2a1d696471fb28 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Maciej=20G=C5=82owacki?=
 <2972266+glowacki-dev@users.noreply.github.com>
Date: Wed, 22 May 2024 23:16:33 +0200
Subject: [PATCH 108/154] feat(vhserver): enable crossplay support (#4544)

* Install valheim dependencies for crossplay on Ubuntu

* Setup minimal required dependencies for valheim crossplay

* will set crossplay to default on and add instance id

* add ubuntu 24.04

---------

Co-authored-by: Daniel Gibbs <me@danielgibbs.co.uk>
---
 lgsm/config-default/config-lgsm/vhserver/_default.cfg | 6 ++----
 lgsm/data/almalinux-8.csv                             | 2 +-
 lgsm/data/almalinux-9.csv                             | 2 +-
 lgsm/data/centos-7.csv                                | 2 +-
 lgsm/data/centos-8.csv                                | 2 +-
 lgsm/data/centos-9.csv                                | 2 +-
 lgsm/data/debian-10.csv                               | 2 +-
 lgsm/data/debian-11.csv                               | 2 +-
 lgsm/data/debian-12.csv                               | 2 +-
 lgsm/data/debian-9.csv                                | 2 +-
 lgsm/data/rhel-7.csv                                  | 2 +-
 lgsm/data/rhel-8.csv                                  | 2 +-
 lgsm/data/rhel-9.csv                                  | 2 +-
 lgsm/data/rocky-8.csv                                 | 2 +-
 lgsm/data/rocky-9.csv                                 | 2 +-
 lgsm/data/ubuntu-16.04.csv                            | 2 +-
 lgsm/data/ubuntu-18.04.csv                            | 2 +-
 lgsm/data/ubuntu-20.04.csv                            | 2 +-
 lgsm/data/ubuntu-22.04.csv                            | 2 +-
 lgsm/data/ubuntu-23.04.csv                            | 2 +-
 lgsm/data/ubuntu-23.10.csv                            | 2 +-
 lgsm/data/ubuntu-24.04.csv                            | 2 +-
 22 files changed, 23 insertions(+), 25 deletions(-)

diff --git a/lgsm/config-default/config-lgsm/vhserver/_default.cfg b/lgsm/config-default/config-lgsm/vhserver/_default.cfg
index 355c70824..8950435e8 100644
--- a/lgsm/config-default/config-lgsm/vhserver/_default.cfg
+++ b/lgsm/config-default/config-lgsm/vhserver/_default.cfg
@@ -21,9 +21,7 @@ saveinterval="1800"
 backups="4"
 backupshort="7200"
 backuplong="43200"
-# If crossplay is empty, it's off. Fill with any text to make true
-# Crossplay is currently not working on Linux dedicated servers, so for now the default is false (empty)
-crossplay=""
+instanceid="1"
 
 # INSTRUCTIONS FOR WORLD MODIFIERS (from Valheim Dedicated Server Manual.pdf located in serverfiles)
 # World modifiers can only be set in the start parameters and can be a combination of the following
@@ -53,7 +51,7 @@ crossplay=""
 worldmodifiers=""
 
 ## Server Parameters | https://docs.linuxgsm.com/configuration/start-parameters#additional-parameters
-startparameters="-name '${servername}' -password ${serverpassword} -port ${port} -world ${worldname} -public ${public} -savedir '${savedir}' -saveinterval ${saveinterval} -backups ${backups} -backupshort ${backupshort} -backuplong ${backuplong}${logFile:+ -logFile '${logFile}'}${crossplay:+ -crossplay}${worldmodifiers:+ ${worldmodifiers}}"
+startparameters="-name '${servername}' -password ${serverpassword} -port ${port} -world ${worldname} -public ${public} -savedir '${savedir}' -saveinterval ${saveinterval} -backups ${backups} -backupshort ${backupshort} -backuplong ${backuplong} -crossplay -instanceid ${instanceid} ${logFile:+ -logFile '${logFile}'} ${worldmodifiers:+ ${worldmodifiers}}"
 
 #### LinuxGSM Settings ####
 
diff --git a/lgsm/data/almalinux-8.csv b/lgsm/data/almalinux-8.csv
index 4d6c05ca5..e1b0426b6 100644
--- a/lgsm/data/almalinux-8.csv
+++ b/lgsm/data/almalinux-8.csv
@@ -126,7 +126,7 @@ ut
 ut2k4
 ut3
 ut99
-vh,glibc-devel
+vh,glibc-devel,libatomic,pulseaudio-libs-devel
 vints,aspnetcore-runtime-7.0
 vpmc,java-21-openjdk
 vs
diff --git a/lgsm/data/almalinux-9.csv b/lgsm/data/almalinux-9.csv
index 2cdd36575..22846b263 100644
--- a/lgsm/data/almalinux-9.csv
+++ b/lgsm/data/almalinux-9.csv
@@ -126,7 +126,7 @@ ut
 ut2k4
 ut3
 ut99
-vh,glibc-devel
+vh,glibc-devel,libatomic,pulseaudio-libs-devel
 vints,aspnetcore-runtime-7.0
 vpmc,java-21-openjdk
 vs
diff --git a/lgsm/data/centos-7.csv b/lgsm/data/centos-7.csv
index df7422526..f583249fa 100644
--- a/lgsm/data/centos-7.csv
+++ b/lgsm/data/centos-7.csv
@@ -126,7 +126,7 @@ ut
 ut2k4
 ut3
 ut99
-vh,glibc-devel
+vh,glibc-devel,libatomic,pulseaudio-libs-devel
 vints,aspnetcore-runtime-7.0
 vpmc,java-11-openjdk
 vs
diff --git a/lgsm/data/centos-8.csv b/lgsm/data/centos-8.csv
index 831bc38e9..82fab1912 100644
--- a/lgsm/data/centos-8.csv
+++ b/lgsm/data/centos-8.csv
@@ -126,7 +126,7 @@ ut
 ut2k4
 ut3
 ut99
-vh,glibc-devel
+vh,glibc-devel,libatomic,pulseaudio-libs-devel
 vints,aspnetcore-runtime-7.0
 vpmc,java-17-openjdk
 vs
diff --git a/lgsm/data/centos-9.csv b/lgsm/data/centos-9.csv
index 4d49ee66e..e9326e0d7 100644
--- a/lgsm/data/centos-9.csv
+++ b/lgsm/data/centos-9.csv
@@ -126,7 +126,7 @@ ut
 ut2k4
 ut3
 ut99
-vh,glibc-devel
+vh,glibc-devel,libatomic,pulseaudio-libs-devel
 vints,aspnetcore-runtime-7.0
 vpmc,java-17-openjdk
 vs
diff --git a/lgsm/data/debian-10.csv b/lgsm/data/debian-10.csv
index f5d63b026..f43907e44 100644
--- a/lgsm/data/debian-10.csv
+++ b/lgsm/data/debian-10.csv
@@ -126,7 +126,7 @@ ut
 ut2k4
 ut3
 ut99
-vh,libc6-dev
+vh,libc6-dev,libatomic1,libpulse-dev
 vints,aspnetcore-runtime-7.0
 vpmc,openjdk-11-jre
 vs
diff --git a/lgsm/data/debian-11.csv b/lgsm/data/debian-11.csv
index 97f5b978d..e064d5b6c 100644
--- a/lgsm/data/debian-11.csv
+++ b/lgsm/data/debian-11.csv
@@ -126,7 +126,7 @@ ut
 ut2k4
 ut3
 ut99
-vh,libc6-dev
+vh,libc6-dev,libatomic1,libpulse-dev
 vints,aspnetcore-runtime-7.0
 vpmc,openjdk-11-jre
 vs
diff --git a/lgsm/data/debian-12.csv b/lgsm/data/debian-12.csv
index e54d9b12b..7964d24f9 100644
--- a/lgsm/data/debian-12.csv
+++ b/lgsm/data/debian-12.csv
@@ -126,7 +126,7 @@ ut
 ut2k4
 ut3
 ut99
-vh,libc6-dev
+vh,libc6-dev,libatomic1,libpulse-dev
 vints,aspnetcore-runtime-7.0
 vpmc,openjdk-17-jre
 vs
diff --git a/lgsm/data/debian-9.csv b/lgsm/data/debian-9.csv
index 87b6dad91..573b75b8c 100644
--- a/lgsm/data/debian-9.csv
+++ b/lgsm/data/debian-9.csv
@@ -126,7 +126,7 @@ ut
 ut2k4
 ut3
 ut99
-vh,libc6-dev
+vh,libc6-dev,libatomic1,libpulse-dev
 vints,aspnetcore-runtime-7.0
 vpmc,openjdk-8-jre
 vs
diff --git a/lgsm/data/rhel-7.csv b/lgsm/data/rhel-7.csv
index 3ecff6183..9ff890dc6 100644
--- a/lgsm/data/rhel-7.csv
+++ b/lgsm/data/rhel-7.csv
@@ -126,7 +126,7 @@ ut
 ut2k4
 ut3
 ut99
-vh,glibc-devel
+vh,glibc-devel,libatomic,pulseaudio-libs-devel
 vints,aspnetcore-runtime-7.0
 vpmc,java-11-openjdk
 vs
diff --git a/lgsm/data/rhel-8.csv b/lgsm/data/rhel-8.csv
index a378694b2..a6e67c2b3 100644
--- a/lgsm/data/rhel-8.csv
+++ b/lgsm/data/rhel-8.csv
@@ -126,7 +126,7 @@ ut
 ut2k4
 ut3
 ut99
-vh,glibc-devel
+vh,glibc-devel,libatomic,pulseaudio-libs-devel
 vints,aspnetcore-runtime-7.0
 vpmc,java-21-openjdk
 vs
diff --git a/lgsm/data/rhel-9.csv b/lgsm/data/rhel-9.csv
index 2cdd36575..22846b263 100644
--- a/lgsm/data/rhel-9.csv
+++ b/lgsm/data/rhel-9.csv
@@ -126,7 +126,7 @@ ut
 ut2k4
 ut3
 ut99
-vh,glibc-devel
+vh,glibc-devel,libatomic,pulseaudio-libs-devel
 vints,aspnetcore-runtime-7.0
 vpmc,java-21-openjdk
 vs
diff --git a/lgsm/data/rocky-8.csv b/lgsm/data/rocky-8.csv
index a378694b2..a6e67c2b3 100644
--- a/lgsm/data/rocky-8.csv
+++ b/lgsm/data/rocky-8.csv
@@ -126,7 +126,7 @@ ut
 ut2k4
 ut3
 ut99
-vh,glibc-devel
+vh,glibc-devel,libatomic,pulseaudio-libs-devel
 vints,aspnetcore-runtime-7.0
 vpmc,java-21-openjdk
 vs
diff --git a/lgsm/data/rocky-9.csv b/lgsm/data/rocky-9.csv
index 2cdd36575..22846b263 100644
--- a/lgsm/data/rocky-9.csv
+++ b/lgsm/data/rocky-9.csv
@@ -126,7 +126,7 @@ ut
 ut2k4
 ut3
 ut99
-vh,glibc-devel
+vh,glibc-devel,libatomic,pulseaudio-libs-devel
 vints,aspnetcore-runtime-7.0
 vpmc,java-21-openjdk
 vs
diff --git a/lgsm/data/ubuntu-16.04.csv b/lgsm/data/ubuntu-16.04.csv
index 41dbd0bc5..1f81cc6bd 100644
--- a/lgsm/data/ubuntu-16.04.csv
+++ b/lgsm/data/ubuntu-16.04.csv
@@ -126,7 +126,7 @@ ut
 ut2k4
 ut3
 ut99
-vh,libc6-dev
+vh,libc6-dev,libatomic1,libpulse-dev
 vints,aspnetcore-runtime-7.0
 vpmc,openjdk-8-jre
 vs
diff --git a/lgsm/data/ubuntu-18.04.csv b/lgsm/data/ubuntu-18.04.csv
index 469c66705..20e6bd819 100644
--- a/lgsm/data/ubuntu-18.04.csv
+++ b/lgsm/data/ubuntu-18.04.csv
@@ -126,7 +126,7 @@ ut
 ut2k4
 ut3
 ut99
-vh,libc6-dev
+vh,libc6-dev,libatomic1,libpulse-dev
 vints,aspnetcore-runtime-7.0
 vpmc,openjdk-11-jre
 vs
diff --git a/lgsm/data/ubuntu-20.04.csv b/lgsm/data/ubuntu-20.04.csv
index 8d4cc6e52..69469c810 100644
--- a/lgsm/data/ubuntu-20.04.csv
+++ b/lgsm/data/ubuntu-20.04.csv
@@ -126,7 +126,7 @@ ut
 ut2k4
 ut3
 ut99
-vh,libc6-dev
+vh,libc6-dev,libatomic1,libpulse-dev
 vints,aspnetcore-runtime-7.0
 vpmc,openjdk-11-jre
 vs
diff --git a/lgsm/data/ubuntu-22.04.csv b/lgsm/data/ubuntu-22.04.csv
index 67d28b5e9..ab0823f15 100644
--- a/lgsm/data/ubuntu-22.04.csv
+++ b/lgsm/data/ubuntu-22.04.csv
@@ -126,7 +126,7 @@ ut
 ut2k4
 ut3
 ut99
-vh,libc6-dev
+vh,libc6-dev,libatomic1,libpulse-dev
 vints,aspnetcore-runtime-7.0
 vpmc,openjdk-21-jre
 vs
diff --git a/lgsm/data/ubuntu-23.04.csv b/lgsm/data/ubuntu-23.04.csv
index 1b50ed7ef..63597d987 100644
--- a/lgsm/data/ubuntu-23.04.csv
+++ b/lgsm/data/ubuntu-23.04.csv
@@ -126,7 +126,7 @@ ut
 ut2k4
 ut3
 ut99
-vh,libc6-dev
+vh,libc6-dev,libatomic1,libpulse-dev
 vints,aspnetcore-runtime-7.0
 vpmc,openjdk-21-jre
 vs
diff --git a/lgsm/data/ubuntu-23.10.csv b/lgsm/data/ubuntu-23.10.csv
index 1b50ed7ef..63597d987 100644
--- a/lgsm/data/ubuntu-23.10.csv
+++ b/lgsm/data/ubuntu-23.10.csv
@@ -126,7 +126,7 @@ ut
 ut2k4
 ut3
 ut99
-vh,libc6-dev
+vh,libc6-dev,libatomic1,libpulse-dev
 vints,aspnetcore-runtime-7.0
 vpmc,openjdk-21-jre
 vs
diff --git a/lgsm/data/ubuntu-24.04.csv b/lgsm/data/ubuntu-24.04.csv
index 1b50ed7ef..63597d987 100644
--- a/lgsm/data/ubuntu-24.04.csv
+++ b/lgsm/data/ubuntu-24.04.csv
@@ -126,7 +126,7 @@ ut
 ut2k4
 ut3
 ut99
-vh,libc6-dev
+vh,libc6-dev,libatomic1,libpulse-dev
 vints,aspnetcore-runtime-7.0
 vpmc,openjdk-21-jre
 vs

From 685cca9c58cf207324d538728727c01fab33cb0c Mon Sep 17 00:00:00 2001
From: Daniel Gibbs <me@danielgibbs.co.uk>
Date: Tue, 11 Jun 2024 16:18:53 +0100
Subject: [PATCH 109/154] feat: change curl default timeout to 3 seconds
 (#4592)

adjusted to 3 seconds from 10 for a timeout
---
 lgsm/modules/alert_discord.sh           |  7 ++++-
 lgsm/modules/alert_gotify.sh            |  2 +-
 lgsm/modules/alert_ifttt.sh             |  2 +-
 lgsm/modules/alert_pushbullet.sh        |  2 +-
 lgsm/modules/alert_pushover.sh          |  4 +--
 lgsm/modules/alert_rocketchat.sh        |  2 +-
 lgsm/modules/alert_slack.sh             |  2 +-
 lgsm/modules/alert_telegram.sh          |  2 +-
 lgsm/modules/command_update_linuxgsm.sh | 36 ++++++++++++-------------
 lgsm/modules/core_dl.sh                 |  2 +-
 lgsm/modules/core_github.sh             |  2 +-
 lgsm/modules/info_game.sh               | 36 ++++++++++++-------------
 lgsm/modules/mods_list.sh               | 24 ++++++++---------
 linuxgsm.sh                             |  2 +-
 14 files changed, 65 insertions(+), 60 deletions(-)

diff --git a/lgsm/modules/alert_discord.sh b/lgsm/modules/alert_discord.sh
index 54cf8a348..2b2ecf21b 100644
--- a/lgsm/modules/alert_discord.sh
+++ b/lgsm/modules/alert_discord.sh
@@ -118,6 +118,11 @@ jsonnoinfo=$(
                     "value": "${HOSTNAME}",
                     "inline": true
                 },
+                {
+                    "name": "Is my Game Server Online?",
+                    "value": "https://ismygameserver.online/${querytype}/${alertip}:${queryport}",
+                    "inline": true
+                },
                 {
                     "name": "Server Time",
                     "value": "$(date)",
@@ -142,7 +147,7 @@ else
 	json="${jsoninfo}"
 fi
 
-discordsend=$(curl --connect-timeout 10 -sSL -H "Content-Type: application/json" -X POST -d "$(echo -n "${json}" | jq -c .)" "${discordwebhook}")
+discordsend=$(curl --connect-timeout 3 -sSL -H "Content-Type: application/json" -X POST -d "$(echo -n "${json}" | jq -c .)" "${discordwebhook}")
 
 if [ -n "${discordsend}" ]; then
 	fn_print_fail_nl "Sending Discord alert: ${discordsend}"
diff --git a/lgsm/modules/alert_gotify.sh b/lgsm/modules/alert_gotify.sh
index 2ab6e9eb7..8f1d31e91 100644
--- a/lgsm/modules/alert_gotify.sh
+++ b/lgsm/modules/alert_gotify.sh
@@ -34,7 +34,7 @@ else
 fi
 
 fn_print_dots "Sending Gotify alert"
-gotifysend=$(curl --connect-timeout 10 -sSL "${gotifywebhook}/message"?token="${gotifytoken}" -H "Content-Type: application/json" -X POST -d "$(echo -n "${json}" | jq -c .)")
+gotifysend=$(curl --connect-timeout 3 -sSL "${gotifywebhook}/message"?token="${gotifytoken}" -H "Content-Type: application/json" -X POST -d "$(echo -n "${json}" | jq -c .)")
 
 if [ -n "${gotifysend}" ]; then
 	fn_print_ok_nl "Sending Gotify alert"
diff --git a/lgsm/modules/alert_ifttt.sh b/lgsm/modules/alert_ifttt.sh
index 77932569b..cbd740ec5 100644
--- a/lgsm/modules/alert_ifttt.sh
+++ b/lgsm/modules/alert_ifttt.sh
@@ -34,7 +34,7 @@ else
 fi
 
 fn_print_dots "Sending IFTTT alert"
-iftttsend=$(curl --connect-timeout 10 -sSL -H "Content-Type: application/json" -X POST -d "$(echo -n "${json}" | jq -c .)" "https://maker.ifttt.com/trigger/${iftttevent}/with/key/${ifttttoken}" | grep "Bad Request")
+iftttsend=$(curl --connect-timeout 3 -sSL -H "Content-Type: application/json" -X POST -d "$(echo -n "${json}" | jq -c .)" "https://maker.ifttt.com/trigger/${iftttevent}/with/key/${ifttttoken}" | grep "Bad Request")
 
 if [ -n "${iftttsend}" ]; then
 	fn_print_fail_nl "Sending IFTTT alert: ${pushbulletsend}"
diff --git a/lgsm/modules/alert_pushbullet.sh b/lgsm/modules/alert_pushbullet.sh
index dedd43268..5ed3853f6 100644
--- a/lgsm/modules/alert_pushbullet.sh
+++ b/lgsm/modules/alert_pushbullet.sh
@@ -36,7 +36,7 @@ else
 fi
 
 fn_print_dots "Sending Pushbullet alert"
-pushbulletsend=$(curl --connect-timeout 10 -sSL -H "Access-Token: ${pushbullettoken}" -H "Content-Type: application/json" -X POST -d "$(echo -n "${json}" | jq -c .)" "https://api.pushbullet.com/v2/pushes" | grep "error_code")
+pushbulletsend=$(curl --connect-timeout 3 -sSL -H "Access-Token: ${pushbullettoken}" -H "Content-Type: application/json" -X POST -d "$(echo -n "${json}" | jq -c .)" "https://api.pushbullet.com/v2/pushes" | grep "error_code")
 
 if [ -n "${pushbulletsend}" ]; then
 	fn_print_fail_nl "Sending Pushbullet alert: ${pushbulletsend}"
diff --git a/lgsm/modules/alert_pushover.sh b/lgsm/modules/alert_pushover.sh
index c436a4a91..22180d503 100644
--- a/lgsm/modules/alert_pushover.sh
+++ b/lgsm/modules/alert_pushover.sh
@@ -23,9 +23,9 @@ else
 fi
 
 if [ -z "${alerturl}" ]; then
-	pushoversend=$(curl --connect-timeout 10 -sS -F token="${pushovertoken}" -F user="${pushoveruserkey}" -F html="1" -F sound="${alertsound}" -F priority="${alertpriority}" -F title="${alerttitle}" -F message=" <b>Server name</b><br>${servername}<br><br><b>Information</b><br>${alertmessage}<br><br><b>Game</b><br>${gamename}<br><br><b>Server IP</b><br>${alertip}:${port}<br><br><b>Hostname</b><br>${HOSTNAME}<br><br>Server Time<br>$(date)" "https://api.pushover.net/1/messages.json" | grep errors)
+	pushoversend=$(curl --connect-timeout 3 -sS -F token="${pushovertoken}" -F user="${pushoveruserkey}" -F html="1" -F sound="${alertsound}" -F priority="${alertpriority}" -F title="${alerttitle}" -F message=" <b>Server name</b><br>${servername}<br><br><b>Information</b><br>${alertmessage}<br><br><b>Game</b><br>${gamename}<br><br><b>Server IP</b><br>${alertip}:${port}<br><br><b>Hostname</b><br>${HOSTNAME}<br><br>Server Time<br>$(date)" "https://api.pushover.net/1/messages.json" | grep errors)
 else
-	pushoversend=$(curl --connect-timeout 10 -sS -F token="${pushovertoken}" -F user="${pushoveruserkey}" -F html="1" -F sound="${alertsound}" -F priority="${alertpriority}" -F title="${alerttitle}" -F message=" <b>Server name</b><br>${servername}<br><br><b>Information</b><br>${alertmessage}<br><br><b>Game</b><br>${gamename}<br><br><b>Server IP</b><br>${alertip}:${port}<br><br><b>Hostname</b><br>${HOSTNAME}<br><br><b>More info</b><br><a href='${alerturl}'>${alerturl}</a><br><br>Server Time<br>$(date)" "https://api.pushover.net/1/messages.json" | grep errors)
+	pushoversend=$(curl --connect-timeout 3 -sS -F token="${pushovertoken}" -F user="${pushoveruserkey}" -F html="1" -F sound="${alertsound}" -F priority="${alertpriority}" -F title="${alerttitle}" -F message=" <b>Server name</b><br>${servername}<br><br><b>Information</b><br>${alertmessage}<br><br><b>Game</b><br>${gamename}<br><br><b>Server IP</b><br>${alertip}:${port}<br><br><b>Hostname</b><br>${HOSTNAME}<br><br><b>More info</b><br><a href='${alerturl}'>${alerturl}</a><br><br>Server Time<br>$(date)" "https://api.pushover.net/1/messages.json" | grep errors)
 fi
 
 if [ -n "${pushoversend}" ]; then
diff --git a/lgsm/modules/alert_rocketchat.sh b/lgsm/modules/alert_rocketchat.sh
index 329111494..910722804 100644
--- a/lgsm/modules/alert_rocketchat.sh
+++ b/lgsm/modules/alert_rocketchat.sh
@@ -123,7 +123,7 @@ else
 fi
 
 fn_print_dots "Sending Rocketchat alert"
-rocketchatsend=$(curl --connect-timeout 10 -sSL -H "Content-Type: application/json" -X POST -d "$(echo -n "${json}" | jq -c .)" "${rocketchatwebhook}")
+rocketchatsend=$(curl --connect-timeout 3 -sSL -H "Content-Type: application/json" -X POST -d "$(echo -n "${json}" | jq -c .)" "${rocketchatwebhook}")
 
 if [ -n "${rocketchatsend}" ]; then
 	fn_print_ok_nl "Sending Rocketchat alert"
diff --git a/lgsm/modules/alert_slack.sh b/lgsm/modules/alert_slack.sh
index 728a564e0..b74f98dec 100644
--- a/lgsm/modules/alert_slack.sh
+++ b/lgsm/modules/alert_slack.sh
@@ -182,7 +182,7 @@ fi
 
 fn_print_dots "Sending Slack alert"
 
-slacksend=$(curl --connect-timeout 10 -sSL -H "Content-Type: application/json" -X POST -d "$(echo -n "${json}" | jq -c .)" "${slackwebhook}")
+slacksend=$(curl --connect-timeout 3 -sSL -H "Content-Type: application/json" -X POST -d "$(echo -n "${json}" | jq -c .)" "${slackwebhook}")
 
 if [ "${slacksend}" == "ok" ]; then
 	fn_print_ok_nl "Sending Slack alert"
diff --git a/lgsm/modules/alert_telegram.sh b/lgsm/modules/alert_telegram.sh
index 6f6426cb1..98e1a980b 100644
--- a/lgsm/modules/alert_telegram.sh
+++ b/lgsm/modules/alert_telegram.sh
@@ -40,7 +40,7 @@ else
 fi
 
 fn_print_dots "Sending Telegram alert"
-telegramsend=$(curl --connect-timeout 10 -sSL -H "Content-Type: application/json" -X POST -d "$(echo -n "${json}" | jq -c .)" ${curlcustomstring} "https://${telegramapi}/bot${telegramtoken}/sendMessage" | grep "error_code")
+telegramsend=$(curl --connect-timeout 3 -sSL -H "Content-Type: application/json" -X POST -d "$(echo -n "${json}" | jq -c .)" ${curlcustomstring} "https://${telegramapi}/bot${telegramtoken}/sendMessage" | grep "error_code")
 
 if [ -n "${telegramsend}" ]; then
 	fn_print_fail_nl "Sending Telegram alert: ${telegramsend}"
diff --git a/lgsm/modules/command_update_linuxgsm.sh b/lgsm/modules/command_update_linuxgsm.sh
index d20204187..43827a672 100644
--- a/lgsm/modules/command_update_linuxgsm.sh
+++ b/lgsm/modules/command_update_linuxgsm.sh
@@ -20,9 +20,9 @@ fn_script_log_info "Updating LinuxGSM"
 fn_print_dots "Selecting repo"
 fn_script_log_info "Selecting repo"
 # Select remotereponame
-curl --connect-timeout 10 -IsfL "https://raw.githubusercontent.com/${githubuser}/${githubrepo}/${githubbranch}/linuxgsm.sh" 1> /dev/null
+curl --connect-timeout 3 -IsfL "https://raw.githubusercontent.com/${githubuser}/${githubrepo}/${githubbranch}/linuxgsm.sh" 1> /dev/null
 if [ $? != "0" ]; then
-	curl --connect-timeout 10 -IsfL "https://bitbucket.org/${githubuser}/${githubrepo}/raw/${githubbranch}/linuxgsm.sh" 1> /dev/null
+	curl --connect-timeout 3 -IsfL "https://bitbucket.org/${githubuser}/${githubrepo}/raw/${githubbranch}/linuxgsm.sh" 1> /dev/null
 	if [ $? != "0" ]; then
 		fn_print_fail_nl "Selecting repo: Unable to to access GitHub or Bitbucket repositories"
 		fn_script_log_fail "Selecting repo: Unable to to access GitHub or Bitbucket repositories"
@@ -39,9 +39,9 @@ fi
 # Check linuxsm.sh
 echo -en "checking ${remotereponame} linuxgsm.sh...\c"
 if [ "${remotereponame}" == "GitHub" ]; then
-	curl --connect-timeout 10 -IsfL "https://raw.githubusercontent.com/${githubuser}/${githubrepo}/${githubbranch}/linuxgsm.sh" 1> /dev/null
+	curl --connect-timeout 3 -IsfL "https://raw.githubusercontent.com/${githubuser}/${githubrepo}/${githubbranch}/linuxgsm.sh" 1> /dev/null
 else
-	curl --connect-timeout 10 -IsfL "https://bitbucket.org/${githubuser}/${githubrepo}/raw/${githubbranch}/linuxgsm.sh" 1> /dev/null
+	curl --connect-timeout 3 -IsfL "https://bitbucket.org/${githubuser}/${githubrepo}/raw/${githubbranch}/linuxgsm.sh" 1> /dev/null
 fi
 if [ $? != "0" ]; then
 	fn_print_fail_eol_nl
@@ -51,9 +51,9 @@ if [ $? != "0" ]; then
 fi
 
 if [ "${remotereponame}" == "GitHub" ]; then
-	tmp_script_diff=$(diff "${tmpdir}/linuxgsm.sh" <(curl --connect-timeout 10 -s "https://raw.githubusercontent.com/${githubuser}/${githubrepo}/${githubbranch}/linuxgsm.sh"))
+	tmp_script_diff=$(diff "${tmpdir}/linuxgsm.sh" <(curl --connect-timeout 3 -s "https://raw.githubusercontent.com/${githubuser}/${githubrepo}/${githubbranch}/linuxgsm.sh"))
 else
-	tmp_script_diff=$(diff "${tmpdir}/linuxgsm.sh" <(curl --connect-timeout 10 -s "https://bitbucket.org/${githubuser}/${githubrepo}/raw/${githubbranch}/linuxgsm.sh"))
+	tmp_script_diff=$(diff "${tmpdir}/linuxgsm.sh" <(curl --connect-timeout 3 -s "https://bitbucket.org/${githubuser}/${githubrepo}/raw/${githubbranch}/linuxgsm.sh"))
 fi
 
 if [ "${tmp_script_diff}" != "" ]; then
@@ -119,9 +119,9 @@ fi
 echo -en "checking ${remotereponame} config _default.cfg...\c"
 fn_script_log_info "Checking ${remotereponame} config _default.cfg"
 if [ "${remotereponame}" == "GitHub" ]; then
-	curl --connect-timeout 10 -IsfL "https://raw.githubusercontent.com/${githubuser}/${githubrepo}/${githubbranch}/lgsm/config-default/config-lgsm/${gameservername}/_default.cfg" 1> /dev/null
+	curl --connect-timeout 3 -IsfL "https://raw.githubusercontent.com/${githubuser}/${githubrepo}/${githubbranch}/lgsm/config-default/config-lgsm/${gameservername}/_default.cfg" 1> /dev/null
 else
-	curl --connect-timeout 10 -IsfL "https://bitbucket.org/${githubuser}/${githubrepo}/raw/${githubbranch}/lgsm/config-default/config-lgsm/${gameservername}/_default.cfg" 1> /dev/null
+	curl --connect-timeout 3 -IsfL "https://bitbucket.org/${githubuser}/${githubrepo}/raw/${githubbranch}/lgsm/config-default/config-lgsm/${gameservername}/_default.cfg" 1> /dev/null
 fi
 if [ $? != "0" ]; then
 	fn_print_fail_eol_nl
@@ -131,9 +131,9 @@ if [ $? != "0" ]; then
 fi
 
 if [ "${remotereponame}" == "GitHub" ]; then
-	config_file_diff=$(diff "${configdirdefault}/config-lgsm/${gameservername}/_default.cfg" <(curl --connect-timeout 10 -s "https://raw.githubusercontent.com/${githubuser}/${githubrepo}/${githubbranch}/lgsm/config-default/config-lgsm/${gameservername}/_default.cfg"))
+	config_file_diff=$(diff "${configdirdefault}/config-lgsm/${gameservername}/_default.cfg" <(curl --connect-timeout 3 -s "https://raw.githubusercontent.com/${githubuser}/${githubrepo}/${githubbranch}/lgsm/config-default/config-lgsm/${gameservername}/_default.cfg"))
 else
-	config_file_diff=$(diff "${configdirdefault}/config-lgsm/${gameservername}/_default.cfg" <(curl --connect-timeout 10 -s "https://bitbucket.org/${githubuser}/${githubrepo}/raw/${githubbranch}/lgsm/config-default/config-lgsm/${gameservername}/_default.cfg"))
+	config_file_diff=$(diff "${configdirdefault}/config-lgsm/${gameservername}/_default.cfg" <(curl --connect-timeout 3 -s "https://bitbucket.org/${githubuser}/${githubrepo}/raw/${githubbranch}/lgsm/config-default/config-lgsm/${gameservername}/_default.cfg"))
 fi
 
 if [ "${config_file_diff}" != "" ]; then
@@ -153,9 +153,9 @@ if [ -f "${datadir}/${distroid}-${distroversioncsv}.csv" ]; then
 	echo -en "checking ${remotereponame} config ${distroid}-${distroversioncsv}.csv...\c"
 	fn_script_log_info "Checking ${remotereponame} ${distroid}-${distroversioncsv}.csv"
 	if [ "${remotereponame}" == "GitHub" ]; then
-		curl --connect-timeout 10 -IsfL "https://raw.githubusercontent.com/${githubuser}/${githubrepo}/${githubbranch}/lgsm/data/${distroid}-${distroversioncsv}.csv" 1> /dev/null
+		curl --connect-timeout 3 -IsfL "https://raw.githubusercontent.com/${githubuser}/${githubrepo}/${githubbranch}/lgsm/data/${distroid}-${distroversioncsv}.csv" 1> /dev/null
 	else
-		curl --connect-timeout 10 -IsfL "https://bitbucket.org/${githubuser}/${githubrepo}/raw/${githubbranch}/lgsm/data/${distroid}-${distroversioncsv}.csv" 1> /dev/null
+		curl --connect-timeout 3 -IsfL "https://bitbucket.org/${githubuser}/${githubrepo}/raw/${githubbranch}/lgsm/data/${distroid}-${distroversioncsv}.csv" 1> /dev/null
 	fi
 	if [ $? != "0" ]; then
 		fn_print_fail_eol_nl
@@ -165,9 +165,9 @@ if [ -f "${datadir}/${distroid}-${distroversioncsv}.csv" ]; then
 	fi
 
 	if [ "${remotereponame}" == "GitHub" ]; then
-		config_file_diff=$(diff "${datadir}/${distroid}-${distroversioncsv}.csv" <(curl --connect-timeout 10 -s "https://raw.githubusercontent.com/${githubuser}/${githubrepo}/${githubbranch}/lgsm/data/${distroid}-${distroversioncsv}.csv"))
+		config_file_diff=$(diff "${datadir}/${distroid}-${distroversioncsv}.csv" <(curl --connect-timeout 3 -s "https://raw.githubusercontent.com/${githubuser}/${githubrepo}/${githubbranch}/lgsm/data/${distroid}-${distroversioncsv}.csv"))
 	else
-		config_file_diff=$(diff "${datadir}/${distroid}-${distroversioncsv}.csv" <(curl --connect-timeout 10 -s "https://bitbucket.org/${githubuser}/${githubrepo}/raw/${githubbranch}/lgsm/data/${distroid}-${distroversioncsv}.csv"))
+		config_file_diff=$(diff "${datadir}/${distroid}-${distroversioncsv}.csv" <(curl --connect-timeout 3 -s "https://bitbucket.org/${githubuser}/${githubrepo}/raw/${githubbranch}/lgsm/data/${distroid}-${distroversioncsv}.csv"))
 	fi
 
 	if [ "${config_file_diff}" != "" ]; then
@@ -191,9 +191,9 @@ if [ -n "${modulesdir}" ]; then
 				echo -en "checking ${remotereponame} module ${modulefile}...\c"
 				github_file_url_dir="lgsm/modules"
 				if [ "${remotereponame}" == "GitHub" ]; then
-					curl --connect-timeout 10 -IsfL "https://raw.githubusercontent.com/${githubuser}/${githubrepo}/${githubbranch}/${github_file_url_dir}/${modulefile}" 1> /dev/null
+					curl --connect-timeout 3 -IsfL "https://raw.githubusercontent.com/${githubuser}/${githubrepo}/${githubbranch}/${github_file_url_dir}/${modulefile}" 1> /dev/null
 				else
-					curl --connect-timeout 10 -IsfL "https://bitbucket.org/${githubuser}/${githubrepo}/raw/${githubbranch}/${github_file_url_dir}/${modulefile}" 1> /dev/null
+					curl --connect-timeout 3 -IsfL "https://bitbucket.org/${githubuser}/${githubrepo}/raw/${githubbranch}/${github_file_url_dir}/${modulefile}" 1> /dev/null
 				fi
 				if [ $? != 0 ]; then
 					fn_print_error_eol_nl
@@ -210,9 +210,9 @@ if [ -n "${modulesdir}" ]; then
 				else
 					# compare file
 					if [ "${remotereponame}" == "GitHub" ]; then
-						module_file_diff=$(diff "${modulesdir}/${modulefile}" <(curl --connect-timeout 10 -s "https://raw.githubusercontent.com/${githubuser}/${githubrepo}/${githubbranch}/${github_file_url_dir}/${modulefile}"))
+						module_file_diff=$(diff "${modulesdir}/${modulefile}" <(curl --connect-timeout 3 -s "https://raw.githubusercontent.com/${githubuser}/${githubrepo}/${githubbranch}/${github_file_url_dir}/${modulefile}"))
 					else
-						module_file_diff=$(diff "${modulesdir}/${modulefile}" <(curl --connect-timeout 10 -s "https://bitbucket.org/${githubuser}/${githubrepo}/raw/${githubbranch}/${github_file_url_dir}/${modulefile}"))
+						module_file_diff=$(diff "${modulesdir}/${modulefile}" <(curl --connect-timeout 3 -s "https://bitbucket.org/${githubuser}/${githubrepo}/raw/${githubbranch}/${github_file_url_dir}/${modulefile}"))
 					fi
 
 					# results
diff --git a/lgsm/modules/core_dl.sh b/lgsm/modules/core_dl.sh
index caca0fc58..89a63eb8b 100644
--- a/lgsm/modules/core_dl.sh
+++ b/lgsm/modules/core_dl.sh
@@ -390,7 +390,7 @@ fn_fetch_file() {
 			fi
 			# Trap will remove part downloaded files if canceled.
 			trap fn_fetch_trap INT
-			curlcmd=(curl --connect-timeout 10 --fail -L -o "${local_filedir}/${local_filename}" --retry 2)
+			curlcmd=(curl --connect-timeout 3 --fail -L -o "${local_filedir}/${local_filename}" --retry 2)
 
 			# if is large file show progress, else be silent
 			local exitcode=""
diff --git a/lgsm/modules/core_github.sh b/lgsm/modules/core_github.sh
index 7290f9bdf..402ee078c 100644
--- a/lgsm/modules/core_github.sh
+++ b/lgsm/modules/core_github.sh
@@ -23,7 +23,7 @@ fn_github_get_latest_release_version() {
 	local githubreleaserepo="${2}"
 	local githublatestreleaseurl="${github_api}/repos/${githubreleaseuser}/${githubreleaserepo}/releases/latest"
 
-	githubreleaseversion=$(curl -s --connect-timeout 10 "${githublatestreleaseurl}" | jq '.tag_name')
+	githubreleaseversion=$(curl -s --connect-timeout 3 "${githublatestreleaseurl}" | jq '.tag_name')
 
 	# error if no version is there
 	if [ -z "${githubreleaseversion}" ]; then
diff --git a/lgsm/modules/info_game.sh b/lgsm/modules/info_game.sh
index 497a65f22..56ae055e4 100644
--- a/lgsm/modules/info_game.sh
+++ b/lgsm/modules/info_game.sh
@@ -2496,12 +2496,12 @@ if [ ! -f "${tmpdir}/publicip.json" ] || [ "$(find "${tmpdir}/publicip.json" -mm
 	if [ "${exitcode}" -eq 0 ]; then
 		fn_script_log_pass "Queried ${apiurl} for public IP address"
 
-        # Parse and reformat the response
-        publicip="$(echo "${ipresponse}" | jq -r '.query')"
-        country="$(echo "${ipresponse}" | jq -r '.country')"
-        countrycode="$(echo "${ipresponse}" | jq -r '.countryCode')"
-        # Construct a universal JSON format
-        echo "{\"ip\":\"${publicip}\",\"country\":\"${country}\",\"countryCode\":\"${countrycode}\",\"apiurl\":\"${apiurl}\"}" > "${tmpdir}/publicip.json"
+		# Parse and reformat the response
+		publicip="$(echo "${ipresponse}" | jq -r '.query')"
+		country="$(echo "${ipresponse}" | jq -r '.country')"
+		countrycode="$(echo "${ipresponse}" | jq -r '.countryCode')"
+		# Construct a universal JSON format
+		echo "{\"ip\":\"${publicip}\",\"country\":\"${country}\",\"countryCode\":\"${countrycode}\",\"apiurl\":\"${apiurl}\"}" > "${tmpdir}/publicip.json"
 	else
 		# Fallback to myip.wtf if the initial request failed or timed out
 		apiurl="https://myip.wtf/json"
@@ -2514,12 +2514,12 @@ if [ ! -f "${tmpdir}/publicip.json" ] || [ "$(find "${tmpdir}/publicip.json" -mm
 		if [ "${exitcode}" -eq 0 ]; then
 			fn_script_log_pass "Queried ${apiurl} for public IP address"
 
-            # Parse and reformat the response from myip.wtf
-            publicip="$(echo "${ipresponse}" | jq -r '.YourFuckingIPAddress')"
-            country="$(echo "${ipresponse}" | jq -r '.YourFuckingCountry')"
-            countrycode="$(echo "${ipresponse}" | jq -r '.YourFuckingCountryCode')"
-            # Construct a universal JSON format
-            echo "{\"ip\":\"${publicip}\",\"country\":\"${country}\",\"countryCode\":\"${countrycode}\",\"apiurl\":\"${apiurl}\"}" > "${tmpdir}/publicip.json"
+			# Parse and reformat the response from myip.wtf
+			publicip="$(echo "${ipresponse}" | jq -r '.YourFuckingIPAddress')"
+			country="$(echo "${ipresponse}" | jq -r '.YourFuckingCountry')"
+			countrycode="$(echo "${ipresponse}" | jq -r '.YourFuckingCountryCode')"
+			# Construct a universal JSON format
+			echo "{\"ip\":\"${publicip}\",\"country\":\"${country}\",\"countryCode\":\"${countrycode}\",\"apiurl\":\"${apiurl}\"}" > "${tmpdir}/publicip.json"
 		else
 			fn_script_log_error "Unable to get public IP address"
 			publicip="NOT SET"
@@ -2529,10 +2529,10 @@ if [ ! -f "${tmpdir}/publicip.json" ] || [ "$(find "${tmpdir}/publicip.json" -mm
 	fi
 else
 	# Cached IP is still valid
-    fn_script_log_pass "Using cached IP as public IP address"
-    publicip="$(jq -r '.ip' "${tmpdir}/publicip.json")"
-    country="$(jq -r '.country' "${tmpdir}/publicip.json")"
-    countrycode="$(jq -r '.countryCode' "${tmpdir}/publicip.json")"
+	fn_script_log_pass "Using cached IP as public IP address"
+	publicip="$(jq -r '.ip' "${tmpdir}/publicip.json")"
+	country="$(jq -r '.country' "${tmpdir}/publicip.json")"
+	countrycode="$(jq -r '.countryCode' "${tmpdir}/publicip.json")"
 fi
 
 # Alert IP address
@@ -2559,11 +2559,11 @@ if [ -z "${displaymasterserver}" ]; then
 		if [ -n "${ip}" ] && [ -n "${port}" ]; then
 			if [ "${steammaster}" == "true" ] || [ "${commandname}" == "DEV-QUERY-RAW" ]; then
 				# Query external IP first as most liky to succeed.
-				masterserver="$(curl --connect-timeout 10 -m 3 -s "https://api.steampowered.com/ISteamApps/GetServersAtAddress/v0001?addr=${publicip}&format=json" | jq --arg port "${port}" --arg queryport "${queryport}" --arg port3 "${port3}" 'if .response.servers != null then .response.servers[] | select((.gameport == ($port|tonumber) or .gameport == ($queryport|tonumber) or .gameport == ($port3|tonumber))) | .addr else empty end' | wc -l 2> /dev/null)"
+				masterserver="$(curl --connect-timeout 3 -m 3 -s "https://api.steampowered.com/ISteamApps/GetServersAtAddress/v0001?addr=${publicip}&format=json" | jq --arg port "${port}" --arg queryport "${queryport}" --arg port3 "${port3}" 'if .response.servers != null then .response.servers[] | select((.gameport == ($port|tonumber) or .gameport == ($queryport|tonumber) or .gameport == ($port3|tonumber))) | .addr else empty end' | wc -l 2> /dev/null)"
 				if [ "${masterserver}" == "0" ]; then
 					# Loop though server IP addresses if external IP fails.
 					for queryip in "${queryips[@]}"; do
-						masterserver="$(curl --connect-timeout 10 -m 3 -s "https://api.steampowered.com/ISteamApps/GetServersAtAddress/v0001?addr=${queryip}&format=json" | jq --arg port "${port}" --arg queryport "${queryport}" --arg port3 "${port3}" 'if .response.servers != null then .response.servers[] | select((.gameport == ($port|tonumber) or .gameport == ($queryport|tonumber) or .gameport == ($port3|tonumber))) | .addr else empty end' | wc -l 2> /dev/null)"
+						masterserver="$(curl --connect-timeout 3 -m 3 -s "https://api.steampowered.com/ISteamApps/GetServersAtAddress/v0001?addr=${queryip}&format=json" | jq --arg port "${port}" --arg queryport "${queryport}" --arg port3 "${port3}" 'if .response.servers != null then .response.servers[] | select((.gameport == ($port|tonumber) or .gameport == ($queryport|tonumber) or .gameport == ($port3|tonumber))) | .addr else empty end' | wc -l 2> /dev/null)"
 					done
 				fi
 				if [ "${masterserver}" == "0" ]; then
diff --git a/lgsm/modules/mods_list.sh b/lgsm/modules/mods_list.sh
index c13565004..ca320e468 100644
--- a/lgsm/modules/mods_list.sh
+++ b/lgsm/modules/mods_list.sh
@@ -68,7 +68,7 @@ sourcemoddownloadurl="https://www.sourcemod.net/latest.php?os=linux&version=${so
 sourcemodurl="${sourcemoddownloadurl}"
 # Steamworks
 steamworksscrapeurl="https://users.alliedmods.net/~kyles/builds/SteamWorks"
-steamworkslatestfile=$(curl --connect-timeout 10 -sL ${steamworksscrapeurl} | grep -m 1 linux | cut -d '"' -f 4)
+steamworkslatestfile=$(curl --connect-timeout 3 -sL ${steamworksscrapeurl} | grep -m 1 linux | cut -d '"' -f 4)
 steamworksdownloadurl="${steamworksscrapeurl}/${steamworkslatestfile}"
 steamworksurl="${steamworksdownloadurl}"
 # Stripper:Source
@@ -78,34 +78,34 @@ stripperdownloadurl="http://www.bailopan.net/stripper/snapshots/1.2/${stripperla
 stripperurl="${stripperdownloadurl}"
 
 # CS:GO Mods
-get5lastbuild=$(curl --connect-timeout 10 -sL https://api.github.com/repos/splewis/get5/releases/latest | jq '.assets[] |select(.browser_download_url | endswith(".tar.gz"))')
+get5lastbuild=$(curl --connect-timeout 3 -sL https://api.github.com/repos/splewis/get5/releases/latest | jq '.assets[] |select(.browser_download_url | endswith(".tar.gz"))')
 get5latestfile=$(echo -e "${get5lastbuild}" | jq -r '.name')
 get5latestfilelink=$(echo -e "${get5lastbuild}" | jq -r '.browser_download_url')
-csgopracticelatest=$(curl --connect-timeout 10 -sL https://api.github.com/repos/splewis/csgo-practice-mode/releases/latest | jq '.assets[]')
+csgopracticelatest=$(curl --connect-timeout 3 -sL https://api.github.com/repos/splewis/csgo-practice-mode/releases/latest | jq '.assets[]')
 csgopracticelatestfile=$(echo -e "${csgopracticelatest}" | jq -r '.name')
 csgopracticelatestlink=$(echo -e "${csgopracticelatest}" | jq -r '.browser_download_url')
-csgopuglatest=$(curl --connect-timeout 10 -sL https://api.github.com/repos/splewis/csgo-pug-setup/releases/latest | jq '.assets[]')
+csgopuglatest=$(curl --connect-timeout 3 -sL https://api.github.com/repos/splewis/csgo-pug-setup/releases/latest | jq '.assets[]')
 csgopuglatestfile=$(echo -e "${csgopuglatest}" | jq -r '.name')
 csgopuglatestlink=$(echo -e "${csgopuglatest}" | jq -r '.browser_download_url')
-gokzlatestversion=$(curl --connect-timeout 10 -s https://api.github.com/repos/KZGlobalTeam/gokz/releases/latest | grep "tag_name" | cut -d : -f 2,3 | sed -E 's/.*"([^"]+)".*/\1/')
+gokzlatestversion=$(curl --connect-timeout 3 -s https://api.github.com/repos/KZGlobalTeam/gokz/releases/latest | grep "tag_name" | cut -d : -f 2,3 | sed -E 's/.*"([^"]+)".*/\1/')
 gokzlatestfile="GOKZ-v${gokzlatestversion}.zip"
 gokzlatestlink="https://github.com/KZGlobalTeam/gokz/releases/download/${gokzlatestversion}/${gokzlatestfile}"
-movementapilatestversion=$(curl --connect-timeout 10 -s https://api.github.com/repos/danzayau/MovementAPI/releases/latest | grep "tag_name" | cut -d : -f 2,3 | sed -E 's/.*"([^"]+)".*/\1/')
+movementapilatestversion=$(curl --connect-timeout 3 -s https://api.github.com/repos/danzayau/MovementAPI/releases/latest | grep "tag_name" | cut -d : -f 2,3 | sed -E 's/.*"([^"]+)".*/\1/')
 movementapilatestfile="MovementAPI-v${movementapilatestversion}.zip"
 movementapilatestlink="https://github.com/danzayau/MovementAPI/releases/download/${movementapilatestversion}/${movementapilatestfile}"
 
 # Rust
 carbonrustapilatestfile="Carbon.Linux.Release.tar.gz"
-carbonrustlatestlink=$(curl --connect-timeout 10 -sL https://api.github.com/repos/CarbonCommunity/Carbon.Core/releases/tags/production_build | jq -r '.assets[]|select(.name == "Carbon.Linux.Release.tar.gz") | .browser_download_url')
+carbonrustlatestlink=$(curl --connect-timeout 3 -sL https://api.github.com/repos/CarbonCommunity/Carbon.Core/releases/tags/production_build | jq -r '.assets[]|select(.name == "Carbon.Linux.Release.tar.gz") | .browser_download_url')
 
 # Oxide
-oxiderustlatestlink=$(curl --connect-timeout 10 -sL https://api.github.com/repos/OxideMod/Oxide.Rust/releases/latest | jq -r '.assets[]|select(.browser_download_url | contains("linux")) | .browser_download_url')
-oxidehurtworldlatestlink=$(curl --connect-timeout 10 -sL https://api.github.com/repos/OxideMod/Oxide.Hurtworld/releases/latest | jq -r '.assets[].browser_download_url')
-oxidesdtdlatestlink=$(curl --connect-timeout 10 -sL https://api.github.com/repos/OxideMod/Oxide.SevenDaysToDie/releases/latest | jq -r '.assets[]|select(.browser_download_url | contains("linux")) | .browser_download_url')
+oxiderustlatestlink=$(curl --connect-timeout 3 -sL https://api.github.com/repos/OxideMod/Oxide.Rust/releases/latest | jq -r '.assets[]|select(.browser_download_url | contains("linux")) | .browser_download_url')
+oxidehurtworldlatestlink=$(curl --connect-timeout 3 -sL https://api.github.com/repos/OxideMod/Oxide.Hurtworld/releases/latest | jq -r '.assets[].browser_download_url')
+oxidesdtdlatestlink=$(curl --connect-timeout 3 -sL https://api.github.com/repos/OxideMod/Oxide.SevenDaysToDie/releases/latest | jq -r '.assets[]|select(.browser_download_url | contains("linux")) | .browser_download_url')
 # Valheim Plus
-valheimpluslatestlink=$(curl --connect-timeout 10 -sL https://api.github.com/repos/Grantapher/ValheimPlus/releases/latest | jq -r '.assets[]|select(.browser_download_url | contains("UnixServer.tar.gz")) | .browser_download_url')
+valheimpluslatestlink=$(curl --connect-timeout 3 -sL https://api.github.com/repos/Grantapher/ValheimPlus/releases/latest | jq -r '.assets[]|select(.browser_download_url | contains("UnixServer.tar.gz")) | .browser_download_url')
 # Valheim BepInEx
-bepinexvhlatestlink=$(curl --connect-timeout 10 -sL "https://thunderstore.io/api/experimental/package/denikson/BepInExPack_Valheim/" -H "accept: application/json" | jq -r '.latest.download_url')
+bepinexvhlatestlink=$(curl --connect-timeout 3 -sL "https://thunderstore.io/api/experimental/package/denikson/BepInExPack_Valheim/" -H "accept: application/json" | jq -r '.latest.download_url')
 
 # Define mods information (required)
 
diff --git a/linuxgsm.sh b/linuxgsm.sh
index 8db9a57c9..6639e341f 100755
--- a/linuxgsm.sh
+++ b/linuxgsm.sh
@@ -111,7 +111,7 @@ fn_bootstrap_fetch_file() {
 			# Larger files show a progress bar.
 
 			echo -en "fetching ${fileurl_name} ${local_filename}...\c"
-			curlcmd=$(curl --connect-timeout 10 -s --fail -L -o "${local_filedir}/${local_filename}" "${fileurl}" 2>&1)
+			curlcmd=$(curl --connect-timeout 3 -s --fail -L -o "${local_filedir}/${local_filename}" "${fileurl}" 2>&1)
 
 			local exitcode=$?
 

From 88f8890229d7243c2bf391503d0f3a5aba4f99d6 Mon Sep 17 00:00:00 2001
From: Daniel Gibbs <me@danielgibbs.co.uk>
Date: Thu, 13 Jun 2024 11:45:06 +0100
Subject: [PATCH 110/154] feat: deprecate Memories of Mars (#4593)

---
 lgsm/data/almalinux-8.csv      |  1 -
 lgsm/data/almalinux-9.csv      |  1 -
 lgsm/data/centos-7.csv         |  1 -
 lgsm/data/centos-8.csv         |  1 -
 lgsm/data/centos-9.csv         |  1 -
 lgsm/data/debian-10.csv        |  1 -
 lgsm/data/debian-11.csv        |  1 -
 lgsm/data/debian-12.csv        |  1 -
 lgsm/data/debian-9.csv         |  1 -
 lgsm/data/rhel-7.csv           |  1 -
 lgsm/data/rhel-8.csv           |  1 -
 lgsm/data/rhel-9.csv           |  1 -
 lgsm/data/rocky-8.csv          |  1 -
 lgsm/data/rocky-9.csv          |  1 -
 lgsm/data/serverlist.csv       |  1 -
 lgsm/data/ubuntu-16.04.csv     |  1 -
 lgsm/data/ubuntu-18.04.csv     |  1 -
 lgsm/data/ubuntu-20.04.csv     |  1 -
 lgsm/data/ubuntu-22.04.csv     |  1 -
 lgsm/data/ubuntu-23.04.csv     |  1 -
 lgsm/data/ubuntu-23.10.csv     |  1 -
 lgsm/data/ubuntu-24.04.csv     |  1 -
 lgsm/modules/info_game.sh      | 20 --------------------
 lgsm/modules/info_messages.sh  | 10 ----------
 lgsm/modules/install_config.sh |  6 ------
 25 files changed, 58 deletions(-)

diff --git a/lgsm/data/almalinux-8.csv b/lgsm/data/almalinux-8.csv
index e1b0426b6..ab8d75b6a 100644
--- a/lgsm/data/almalinux-8.csv
+++ b/lgsm/data/almalinux-8.csv
@@ -69,7 +69,6 @@ mc,java-21-openjdk
 mcb,libnsl
 mh
 mohaa,compat-libstdc++-33.i686
-mom
 mta,ncurses-compat-libs,libxml2
 nd
 nec
diff --git a/lgsm/data/almalinux-9.csv b/lgsm/data/almalinux-9.csv
index 22846b263..e4fb83e3b 100644
--- a/lgsm/data/almalinux-9.csv
+++ b/lgsm/data/almalinux-9.csv
@@ -69,7 +69,6 @@ mc,java-21-openjdk
 mcb,libnsl
 mh
 mohaa,compat-libstdc++-33.i686
-mom
 mta,ncurses-compat-libs,libxml2
 nd
 nec
diff --git a/lgsm/data/centos-7.csv b/lgsm/data/centos-7.csv
index f583249fa..0e04e3c74 100644
--- a/lgsm/data/centos-7.csv
+++ b/lgsm/data/centos-7.csv
@@ -69,7 +69,6 @@ mc,java-21-openjdk
 mcb,libnsl
 mh
 mohaa,compat-libstdc++-33.i686
-mom
 mta,ncurses-libs,libxml2
 nd
 nec
diff --git a/lgsm/data/centos-8.csv b/lgsm/data/centos-8.csv
index 82fab1912..c07bf66d0 100644
--- a/lgsm/data/centos-8.csv
+++ b/lgsm/data/centos-8.csv
@@ -69,7 +69,6 @@ mc,java-21-openjdk
 mcb,libnsl
 mh
 mohaa,compat-libstdc++-33.i686
-mom
 mta,ncurses-compat-libs,libxml2
 nd
 nec
diff --git a/lgsm/data/centos-9.csv b/lgsm/data/centos-9.csv
index e9326e0d7..c919a160b 100644
--- a/lgsm/data/centos-9.csv
+++ b/lgsm/data/centos-9.csv
@@ -69,7 +69,6 @@ mc,java-17-openjdk
 mcb,libnsl
 mh
 mohaa,compat-libstdc++-33.i686
-mom
 mta,ncurses-compat-libs,libxml2
 nd
 nec
diff --git a/lgsm/data/debian-10.csv b/lgsm/data/debian-10.csv
index f43907e44..1892d9f9f 100644
--- a/lgsm/data/debian-10.csv
+++ b/lgsm/data/debian-10.csv
@@ -68,7 +68,6 @@ mc,openjdk-11-jre
 mcb
 mh
 mohaa,libstdc++5:i386
-mom
 mta,libncursesw5,libxml2-utils
 nd
 nec
diff --git a/lgsm/data/debian-11.csv b/lgsm/data/debian-11.csv
index e064d5b6c..9a37307c0 100644
--- a/lgsm/data/debian-11.csv
+++ b/lgsm/data/debian-11.csv
@@ -69,7 +69,6 @@ mc,openjdk-17-jre
 mcb
 mh
 mohaa,libstdc++5:i386
-mom
 mta,libncursesw5,libxml2-utils
 nd
 nec
diff --git a/lgsm/data/debian-12.csv b/lgsm/data/debian-12.csv
index 7964d24f9..8835871ee 100644
--- a/lgsm/data/debian-12.csv
+++ b/lgsm/data/debian-12.csv
@@ -69,7 +69,6 @@ mc,openjdk-17-jre
 mcb
 mh
 mohaa,libstdc++5:i386
-mom
 mta,libncursesw5,libxml2-utils
 nd
 nec
diff --git a/lgsm/data/debian-9.csv b/lgsm/data/debian-9.csv
index 573b75b8c..c202924de 100644
--- a/lgsm/data/debian-9.csv
+++ b/lgsm/data/debian-9.csv
@@ -69,7 +69,6 @@ mc,openjdk-8-jre
 mcb
 mh
 mohaa,libstdc++5:i386
-mom
 mta,libncursesw5,libxml2-utils
 nd
 nec
diff --git a/lgsm/data/rhel-7.csv b/lgsm/data/rhel-7.csv
index 9ff890dc6..0546d8eb1 100644
--- a/lgsm/data/rhel-7.csv
+++ b/lgsm/data/rhel-7.csv
@@ -70,7 +70,6 @@ mc,java-11-openjdk
 mcb,libnsl
 mh
 mohaa,compat-libstdc++-33.i686
-mom
 mta,ncurses-libs,libxml2
 nd
 nec
diff --git a/lgsm/data/rhel-8.csv b/lgsm/data/rhel-8.csv
index a6e67c2b3..bbfb982f0 100644
--- a/lgsm/data/rhel-8.csv
+++ b/lgsm/data/rhel-8.csv
@@ -69,7 +69,6 @@ mc,java-21-openjdk
 mcb,libnsl
 mh
 mohaa,compat-libstdc++-33.i686
-mom
 mta,ncurses-compat-libs,libxml2
 nd
 nec
diff --git a/lgsm/data/rhel-9.csv b/lgsm/data/rhel-9.csv
index 22846b263..e4fb83e3b 100644
--- a/lgsm/data/rhel-9.csv
+++ b/lgsm/data/rhel-9.csv
@@ -69,7 +69,6 @@ mc,java-21-openjdk
 mcb,libnsl
 mh
 mohaa,compat-libstdc++-33.i686
-mom
 mta,ncurses-compat-libs,libxml2
 nd
 nec
diff --git a/lgsm/data/rocky-8.csv b/lgsm/data/rocky-8.csv
index a6e67c2b3..bbfb982f0 100644
--- a/lgsm/data/rocky-8.csv
+++ b/lgsm/data/rocky-8.csv
@@ -69,7 +69,6 @@ mc,java-21-openjdk
 mcb,libnsl
 mh
 mohaa,compat-libstdc++-33.i686
-mom
 mta,ncurses-compat-libs,libxml2
 nd
 nec
diff --git a/lgsm/data/rocky-9.csv b/lgsm/data/rocky-9.csv
index 22846b263..e4fb83e3b 100644
--- a/lgsm/data/rocky-9.csv
+++ b/lgsm/data/rocky-9.csv
@@ -69,7 +69,6 @@ mc,java-21-openjdk
 mcb,libnsl
 mh
 mohaa,compat-libstdc++-33.i686
-mom
 mta,ncurses-compat-libs,libxml2
 nd
 nec
diff --git a/lgsm/data/serverlist.csv b/lgsm/data/serverlist.csv
index ae270f965..23e126627 100644
--- a/lgsm/data/serverlist.csv
+++ b/lgsm/data/serverlist.csv
@@ -68,7 +68,6 @@ mc,mcserver,Minecraft,ubuntu-22.04
 mcb,mcbserver,Minecraft Bedrock,ubuntu-22.04
 mh,mhserver,MORDHAU,ubuntu-22.04
 mohaa,mohaaserver,Medal of Honor: Allied Assault,ubuntu-22.04
-mom,momserver,Memories of Mars,ubuntu-22.04
 mta,mtaserver,Multi Theft Auto,ubuntu-22.04
 nd,ndserver,Nuclear Dawn,ubuntu-22.04
 nec,necserver,Necesse,ubuntu-22.04
diff --git a/lgsm/data/ubuntu-16.04.csv b/lgsm/data/ubuntu-16.04.csv
index 1f81cc6bd..cf6a20220 100644
--- a/lgsm/data/ubuntu-16.04.csv
+++ b/lgsm/data/ubuntu-16.04.csv
@@ -70,7 +70,6 @@ mc,openjdk-8-jre
 mcb
 mh
 mohaa,libstdc++5:i386
-mom
 mta
 nd
 nec
diff --git a/lgsm/data/ubuntu-18.04.csv b/lgsm/data/ubuntu-18.04.csv
index 20e6bd819..6f7dcbe18 100644
--- a/lgsm/data/ubuntu-18.04.csv
+++ b/lgsm/data/ubuntu-18.04.csv
@@ -70,7 +70,6 @@ mc,openjdk-11-jre
 mcb
 mh
 mohaa,libstdc++5:i386
-mom
 mta,libncursesw5,libxml2-utils
 nd
 nec
diff --git a/lgsm/data/ubuntu-20.04.csv b/lgsm/data/ubuntu-20.04.csv
index 69469c810..98ba275f9 100644
--- a/lgsm/data/ubuntu-20.04.csv
+++ b/lgsm/data/ubuntu-20.04.csv
@@ -69,7 +69,6 @@ mc,openjdk-21-jre
 mcb
 mh
 mohaa,libstdc++5:i386
-mom
 mta,libncursesw5,libxml2-utils
 nd
 nec
diff --git a/lgsm/data/ubuntu-22.04.csv b/lgsm/data/ubuntu-22.04.csv
index ab0823f15..9bc8f7ad1 100644
--- a/lgsm/data/ubuntu-22.04.csv
+++ b/lgsm/data/ubuntu-22.04.csv
@@ -69,7 +69,6 @@ mc,openjdk-21-jre
 mcb
 mh
 mohaa,libstdc++5:i386
-mom
 mta,libncursesw5,libxml2-utils
 nd
 nec
diff --git a/lgsm/data/ubuntu-23.04.csv b/lgsm/data/ubuntu-23.04.csv
index 63597d987..e6d0c2962 100644
--- a/lgsm/data/ubuntu-23.04.csv
+++ b/lgsm/data/ubuntu-23.04.csv
@@ -69,7 +69,6 @@ mc,openjdk-21-jre
 mcb
 mh
 mohaa,libstdc++5:i386
-mom
 mta,libncursesw5,libxml2-utils
 nd
 nec
diff --git a/lgsm/data/ubuntu-23.10.csv b/lgsm/data/ubuntu-23.10.csv
index 63597d987..e6d0c2962 100644
--- a/lgsm/data/ubuntu-23.10.csv
+++ b/lgsm/data/ubuntu-23.10.csv
@@ -69,7 +69,6 @@ mc,openjdk-21-jre
 mcb
 mh
 mohaa,libstdc++5:i386
-mom
 mta,libncursesw5,libxml2-utils
 nd
 nec
diff --git a/lgsm/data/ubuntu-24.04.csv b/lgsm/data/ubuntu-24.04.csv
index 63597d987..e6d0c2962 100644
--- a/lgsm/data/ubuntu-24.04.csv
+++ b/lgsm/data/ubuntu-24.04.csv
@@ -69,7 +69,6 @@ mc,openjdk-21-jre
 mcb
 mh
 mohaa,libstdc++5:i386
-mom
 mta,libncursesw5,libxml2-utils
 nd
 nec
diff --git a/lgsm/modules/info_game.sh b/lgsm/modules/info_game.sh
index 56ae055e4..007187ab8 100644
--- a/lgsm/modules/info_game.sh
+++ b/lgsm/modules/info_game.sh
@@ -1510,24 +1510,6 @@ fn_info_game_mohaa() {
 	serverpassword="${serverpassword:-"NOT SET"}"
 }
 
-# Config Type: json
-# Parameters: true
-# Comment: // or /* */
-fn_info_game_mom() {
-	if [ -f "${servercfgfullpath}" ]; then
-		fn_info_game_json "defaultmap" ".MapName"
-		fn_info_game_json "maxplayers" ".MaxPlayers"
-		fn_info_game_json "servername" ".ServerName"
-		fn_info_game_json "serverpassword" ".ServerPassword"
-	fi
-	beaconport="${beaconport:-"0"}"
-	defaultmap="${defaultmap:-"NOT SET"}"
-	maxplayers="${maxplayers:-"0"}"
-	port="${port:-"0"}"
-	servername="${servername:-"NOT SET"}"
-	serverpassword="${serverpassword:-"NOT SET"}"
-}
-
 # Config Type: xml
 # Comment: <!-- -->
 # Example: <servername>Default MTA Server</servername>
@@ -2375,8 +2357,6 @@ elif [ "${shortname}" == "mh" ]; then
 	fn_info_game_mh
 elif [ "${shortname}" == "mohaa" ]; then
 	fn_info_game_mohaa
-elif [ "${shortname}" == "mom" ]; then
-	fn_info_game_mom
 elif [ "${shortname}" == "mta" ]; then
 	fn_info_game_mta
 elif [ "${shortname}" == "nec" ]; then
diff --git a/lgsm/modules/info_messages.sh b/lgsm/modules/info_messages.sh
index a1e8f52ac..a5f25bc74 100644
--- a/lgsm/modules/info_messages.sh
+++ b/lgsm/modules/info_messages.sh
@@ -1192,14 +1192,6 @@ fn_info_messages_mohaa() {
 	} | column -s $'\t' -t
 }
 
-fn_info_messages_mom() {
-	{
-		fn_port "header"
-		fn_port "Game" port udp
-		fn_port "Beacon" beaconport udp
-	} | column -s $'\t' -t
-}
-
 fn_info_messages_mta() {
 	{
 		fn_port "header"
@@ -1804,8 +1796,6 @@ fn_info_messages_select_engine() {
 		fn_info_messages_mh
 	elif [ "${shortname}" == "mohaa" ]; then
 		fn_info_messages_mohaa
-	elif [ "${shortname}" == "mom" ]; then
-		fn_info_messages_mom
 	elif [ "${shortname}" == "mta" ]; then
 		fn_info_messages_mta
 	elif [ "${shortname}" == "nec" ]; then
diff --git a/lgsm/modules/install_config.sh b/lgsm/modules/install_config.sh
index 9b3146770..eea590f9e 100644
--- a/lgsm/modules/install_config.sh
+++ b/lgsm/modules/install_config.sh
@@ -589,12 +589,6 @@ elif [ "${shortname}" == "mta" ]; then
 	fn_fetch_default_config
 	fn_default_config_remote
 	fn_list_config_locations
-elif [ "${shotname}" == "mom" ]; then
-	array_configs+=(DedicatedServerConfig.cfg)
-	fn_fetch_default_config
-	fn_default_config_remote
-	fn_set_config_vars
-	fn_list_config_locations
 elif [ "${shortname}" == "pvr" ]; then
 	fn_check_cfgdir
 	array_configs+=(Game.ini)

From 164f9507f84e9856408bef75411ef893f7d36cc0 Mon Sep 17 00:00:00 2001
From: Daniel Gibbs <me@danielgibbs.co.uk>
Date: Thu, 13 Jun 2024 14:13:29 +0100
Subject: [PATCH 111/154] feat: add debian 13

---
 lgsm/data/debian-13.csv | 137 ++++++++++++++++++++++++++++++++++++++++
 1 file changed, 137 insertions(+)
 create mode 100644 lgsm/data/debian-13.csv

diff --git a/lgsm/data/debian-13.csv b/lgsm/data/debian-13.csv
new file mode 100644
index 000000000..6d16deb9f
--- /dev/null
+++ b/lgsm/data/debian-13.csv
@@ -0,0 +1,137 @@
+all,bc,binutils,bsdmainutils,bzip2,ca-certificates,cpio,curl,distro-info,file,gzip,hostname,jq,lib32gcc-s1,lib32stdc++6,netcat-openbsd,pigz,python3,tar,tmux,unzip,util-linux,uuid-runtime,wget,xz-utils
+steamcmd,lib32gcc-s1,lib32stdc++6,libsdl2-2.0-0:i386,steamcmd
+ac
+ahl
+ahl2
+ark
+arma3
+armar,libcurl4
+ats
+av
+bb
+bb2,libcurl4-gnutls-dev:i386
+bd
+bf1942,libncurses5:i386,libtinfo5:i386
+bfv,libncurses5:i386,libstdc++5:i386
+bmdm,libncurses5:i386
+bo
+bs
+bt,libicu-dev,dos2unix,libxml2-utils
+btl
+cc
+ck,xvfb,libxi6
+cmw
+cod,libstdc++5:i386
+cod2,libstdc++5:i386
+cod4
+coduo,libstdc++5:i386
+codwaw
+col
+cs
+cs2
+cscz
+csgo
+css,libtinfo5:i386
+ct
+dab
+dayz
+dmc
+dod
+dodr
+dods
+doi
+dst,libcurl4-gnutls-dev:i386
+dys
+eco,libgdiplus
+em
+etl
+ets2
+fctr
+fof
+gmod,libtinfo5:i386
+hcu
+hl2dm
+hldm
+hldms
+hw,lib32z1
+hz
+ins
+inss
+ios
+jc2
+jc3
+jk2
+kf
+kf2
+l4d
+l4d2
+mc,openjdk-22-jre
+mcb
+mh
+mohaa,libstdc++5:i386
+mta,libncursesw5,libxml2-utils
+nd
+nec
+nmrih,libtinfo5:i386
+ns
+ns2,speex,libtbb12
+ns2c,speex:i386,libtbb12
+ohd
+onset,libmariadb-dev
+opfor
+pc
+pc2
+pmc,openjdk-22-jre
+ps,libgconf-2-4
+pvkii
+pvr,libc++1
+pw
+pz,openjdk-22-jre,rng-tools5
+q2
+q3
+q4
+ql
+qw
+ricochet
+ro
+rtcw
+rust,lib32z1
+rw,openjdk-22-jre
+samp
+sb
+sbots
+scpsl,mono-complete
+scpslsm,mono-complete
+sdtd,telnet,expect,libxml2-utils
+sf
+sfc,libtinfo5:i386
+sof2
+sol
+squad
+st,libxml2-utils
+stn
+sven,libssl3:i386,zlib1g:i386
+terraria
+tf
+tf2,libcurl4-gnutls-dev:i386
+tfc
+ti
+ts
+ts3
+tu
+tw
+unt
+ut
+ut2k4
+ut3
+ut99
+vh,libc6-dev,libatomic1,libpulse-dev
+vints,aspnetcore-runtime-7.0
+vpmc,openjdk-21-jre
+vs
+wet
+wf
+wmc,openjdk21-jre
+wurm,xvfb
+zmr,libtinfo5:i386
+zps,libtinfo5:i386

From 0e7314d26ae9914a8af003cac3a0dbdc85af98fa Mon Sep 17 00:00:00 2001
From: Daniel Gibbs <me@danielgibbs.co.uk>
Date: Sat, 15 Jun 2024 22:34:12 +0100
Subject: [PATCH 112/154] fix missing serverpassword detail (#4596)

---
 lgsm/modules/command_dev_parse_game_details.sh | 10 ++++------
 lgsm/modules/info_game.sh                      |  6 +++---
 2 files changed, 7 insertions(+), 9 deletions(-)

diff --git a/lgsm/modules/command_dev_parse_game_details.sh b/lgsm/modules/command_dev_parse_game_details.sh
index 4dcf33c2a..2bb01e436 100644
--- a/lgsm/modules/command_dev_parse_game_details.sh
+++ b/lgsm/modules/command_dev_parse_game_details.sh
@@ -70,7 +70,6 @@ declare -A server_details=(
 	['Max Players']="${maxplayers}"
 	['Mod Server Port']="${modserverport}"
 	['OldQueryPortNumber']="${oldqueryportnumber}"
-	['Password']="${password}"
 	['Port 401']="${port401}"
 	['Port IPv6']="${portipv6}"
 	['Port']="${port}"
@@ -85,7 +84,6 @@ declare -A server_details=(
 	['Queue Port']="${queueport}"
 	['Random Map']="${randommap}"
 	['Raw Port']="${rawport}"
-	['RC Password']="${rcpassword}"
 	['RCON Enabled']="${rconenabled}"
 	['RCON Password']="${rconpassword}"
 	['RCON Port']="${rconport}"
@@ -133,7 +131,7 @@ missing_details=""
 
 # Loop through the server details and store them.
 for key in "${!server_details[@]}"; do
-    value=${server_details[$key]}
+	value=${server_details[$key]}
 	if [ -n "$value" ]; then
 		available_details+="${lightblue}${key}: ${default}${value}\n"
 	else
@@ -144,9 +142,9 @@ done
 # Sort and output the available distro details.
 if [ -n "$available_details" ]; then
 	echo -e ""
-    echo -e "${bold}${lightgreen}Available Gameserver Details${default}"
-    fn_messages_separator
-    echo -e "${available_details}" | sort
+	echo -e "${bold}${lightgreen}Available Gameserver Details${default}"
+	fn_messages_separator
+	echo -e "${available_details}" | sort
 fi
 
 # Output the missing server details if there are any.
diff --git a/lgsm/modules/info_game.sh b/lgsm/modules/info_game.sh
index 007187ab8..f4caa5a7f 100644
--- a/lgsm/modules/info_game.sh
+++ b/lgsm/modules/info_game.sh
@@ -1160,7 +1160,7 @@ fn_info_game_col() {
 	maxplayers="${maxplayers:-"0"}"
 	port="${port:-"0"}"
 	queryport="${port:-"0"}"
-	rcpassword="${rconpassword:-"NOT SET"}"
+	rconpassword="${rconpassword:-"NOT SET"}"
 	servername="${servername:-"NOT SET"}"
 	serverpassword="${serverpassword:-"NOT SET"}"
 	steamport="${steamport:-"0"}"
@@ -1174,11 +1174,11 @@ fn_info_game_cs2() {
 	if [ -f "${servercfgfullpath}" ]; then
 		fn_info_game_valve_keyvalues "servername" "hostname"
 		fn_info_game_valve_keyvalues "defaultmap" "map"
-		fn_info_game_valve_keyvalues "password" "sv_password"
+		fn_info_game_valve_keyvalues "serverpassword" "sv_password"
 	fi
 	defaultmap="${defaultmap:-"NOT SET"}"
 	maxplayers="${maxplayers:-"0"}"
-	password="${password:-"NOT SET"}"
+	serverpassword="${serverpassword:-"NOT SET"}"
 	port="${port:-"0"}"
 	queryport="${port:-"0"}"
 	servername="${servername:-"NOT SET"}"

From 493a3a82fa8e5a9cf7796c0fb3a839ca2da49ca3 Mon Sep 17 00:00:00 2001
From: Thomas S <intel44@users.noreply.github.com>
Date: Sun, 16 Jun 2024 20:18:00 +0200
Subject: [PATCH 113/154] feat(newserver): soulmask (#4590)

* feat: reference new smserver

* feat: add default config

* feat: add stop command using telnet

* fix: remove duplicate unused telnetpassword var

* feat: add soulmask to config & info functions

* fix: remove ini config for now

* fix: startparameter initialization fix

* feat: remove pve fixed param in startparameters

* fix: update default gamelogdir

* fix: handle telnet response during stop process

* add sm fix

* add fix_sm.sh

* add ss command

* and

* add memory requirements

* adjust start parameters

* remove telnetpassword

* add backup interval

a

* comments

* rename variables to telnetpassword

* var name change

---------

Co-authored-by: Daniel Gibbs <me@danielgibbs.co.uk>
---
 .../config-lgsm/smserver/_default.cfg         | 189 ++++++++++++++++++
 .../config-lgsm/tfserver/_default.cfg         |   2 +-
 .../config-lgsm/vhserver/_default.cfg         |   5 +-
 lgsm/data/almalinux-8.csv                     |   1 +
 lgsm/data/almalinux-9.csv                     |   1 +
 lgsm/data/centos-7.csv                        |   1 +
 lgsm/data/centos-8.csv                        |   1 +
 lgsm/data/centos-9.csv                        |   1 +
 lgsm/data/debian-10.csv                       |   1 +
 lgsm/data/debian-11.csv                       |   1 +
 lgsm/data/debian-12.csv                       |   1 +
 lgsm/data/debian-9.csv                        |   1 +
 lgsm/data/rhel-7.csv                          |   1 +
 lgsm/data/rhel-8.csv                          |   1 +
 lgsm/data/rhel-9.csv                          |   1 +
 lgsm/data/rocky-8.csv                         |   1 +
 lgsm/data/rocky-9.csv                         |   1 +
 lgsm/data/serverlist.csv                      |   1 +
 lgsm/data/ubuntu-16.04.csv                    |   1 +
 lgsm/data/ubuntu-18.04.csv                    |   1 +
 lgsm/data/ubuntu-20.04.csv                    |   1 +
 lgsm/data/ubuntu-22.04.csv                    |   1 +
 lgsm/data/ubuntu-23.04.csv                    |   1 +
 lgsm/data/ubuntu-23.10.csv                    |   1 +
 lgsm/data/ubuntu-24.04.csv                    |   1 +
 lgsm/modules/check_system_requirements.sh     |   4 +-
 .../modules/command_dev_parse_game_details.sh |   1 -
 lgsm/modules/command_dev_query_raw.sh         |   2 +-
 lgsm/modules/command_stop.sh                  | 107 +++++++++-
 lgsm/modules/core_modules.sh                  |   5 +
 lgsm/modules/fix.sh                           |   2 +-
 lgsm/modules/fix_sm.sh                        |  10 +
 lgsm/modules/info_game.sh                     |  17 +-
 lgsm/modules/info_messages.sh                 |  32 ++-
 lgsm/modules/install_config.sh                |   3 +
 35 files changed, 381 insertions(+), 20 deletions(-)
 create mode 100644 lgsm/config-default/config-lgsm/smserver/_default.cfg
 create mode 100644 lgsm/modules/fix_sm.sh

diff --git a/lgsm/config-default/config-lgsm/smserver/_default.cfg b/lgsm/config-default/config-lgsm/smserver/_default.cfg
new file mode 100644
index 000000000..306179b9c
--- /dev/null
+++ b/lgsm/config-default/config-lgsm/smserver/_default.cfg
@@ -0,0 +1,189 @@
+##################################
+######## Default Settings ########
+##################################
+# DO NOT EDIT, ANY CHANGES WILL BE OVERWRITTEN!
+# Copy settings from here and use them in either:
+# common.cfg - applies settings to every instance.
+# [instance].cfg - applies settings to a specific instance.
+
+#### Game Server Settings ####
+
+## Predefined Parameters | https://docs.linuxgsm.com/configuration/start-parameters
+servername="LinuxGSM"
+serverpassword=""
+adminpassword=""
+port="8777"
+queryport="27015"
+telnetport="18888"
+maxplayers="50"
+backupinterval="15"  # Backup interval in minutes.
+defaultmap="Level01_Main"
+
+## Server Parameters | https://docs.linuxgsm.com/configuration/start-parameters#additional-parameters
+startparameters="WS ${defaultmap} -MultiHome=${ip} -Port=${port} -EchoPort=${telnetport} -QueryPort=${queryport} -SteamServerName='${servername}' -PSW='${serverpassword}' -adminpsw='${adminpassword}' -MaxPlayers=${maxplayers} -initbackup -backupinterval=${backupinterval} -UTF8Output -forcepassthrough -log"
+
+#### LinuxGSM Settings ####
+
+## LinuxGSM Stats
+# Send useful stats to LinuxGSM developers.
+# https://docs.linuxgsm.com/configuration/linuxgsm-stats
+# (on|off)
+stats="off"
+
+## Notification Alerts
+# (on|off)
+
+# Display IP | https://docs.linuxgsm.com/alerts#display-ip
+displayip=""
+
+# More info | https://docs.linuxgsm.com/alerts#more-info
+postalert="off"
+
+# Alert on Start/Stop/Restart
+statusalert="off"
+
+# Discord Alerts | https://docs.linuxgsm.com/alerts/discord
+discordalert="off"
+discordwebhook="webhook"
+
+# Email Alerts | https://docs.linuxgsm.com/alerts/email
+emailalert="off"
+email="email@example.com"
+emailfrom=""
+
+# Gotify Alerts | https://docs.linuxgsm.com/alerts/gotify
+gotifyalert="off"
+gotifytoken="token"
+gotifywebhook="webhook"
+
+# IFTTT Alerts | https://docs.linuxgsm.com/alerts/ifttt
+iftttalert="off"
+ifttttoken="accesstoken"
+iftttevent="linuxgsm_alert"
+
+# Pushbullet Alerts | https://docs.linuxgsm.com/alerts/pushbullet
+pushbulletalert="off"
+pushbullettoken="accesstoken"
+channeltag=""
+
+# Pushover Alerts | https://docs.linuxgsm.com/alerts/pushover
+pushoveralert="off"
+pushovertoken="accesstoken"
+pushoveruserkey="userkey"
+
+# Rocket.Chat Alerts | https://docs.linuxgsm.com/alerts/rocket.chat
+rocketchatalert="off"
+rocketchatwebhook="webhook"
+
+# Slack Alerts | https://docs.linuxgsm.com/alerts/slack
+slackalert="off"
+slackwebhook="webhook"
+
+# Telegram Alerts | https://docs.linuxgsm.com/alerts/telegram
+# You can add a custom cURL string eg proxy (useful in Russia) in "curlcustomstring".
+# For example "--socks5 ipaddr:port" for socks5 proxy see more in "curl --help all".
+telegramapi="api.telegram.org"
+telegramalert="off"
+telegramtoken="accesstoken"
+telegramchatid=""
+telegramthreadid=""
+telegramsilentnotification="false"
+curlcustomstring=""
+
+## Updating | https://docs.linuxgsm.com/commands/update
+updateonstart="off"
+
+## Backup | https://docs.linuxgsm.com/commands/backup
+maxbackups="4"
+maxbackupdays="30"
+stoponbackup="on"
+
+## Logging | https://docs.linuxgsm.com/features/logging
+consolelogging="on"
+logdays="7"
+
+## Monitor | https://docs.linuxgsm.com/commands/monitor
+# Query delay time
+querydelay="5"
+
+## ANSI Colors | https://docs.linuxgsm.com/features/ansi-colors
+ansi="on"
+
+#### Advanced Settings ####
+
+## Message Display Time | https://docs.linuxgsm.com/features/message-display-time
+sleeptime="0.5"
+
+## SteamCMD Settings | https://docs.linuxgsm.com/steamcmd
+# Server appid
+appid="3017300"
+steamcmdforcewindows="no"
+# SteamCMD Branch | https://docs.linuxgsm.com/steamcmd/branch
+branch=""
+betapassword=""
+# Master Server | https://docs.linuxgsm.com/steamcmd/steam-master-server
+steammaster="true"
+
+## Stop Mode | https://docs.linuxgsm.com/features/stop-mode
+# 1: tmux kill
+# 2: CTRL+c
+# 3: quit
+# 4: quit 120s
+# 5: stop
+# 6: q
+# 7: exit
+# 8: 7 Days to Die
+# 9: GoldSrc
+# 10: Avorion
+# 11: end
+# 12: shutdown
+# 13: soulmask
+stopmode="13"
+
+## Query mode
+# 1: session only
+# 2: gamedig (gsquery fallback)
+# 3: gamedig
+# 4: gsquery
+# 5: tcp
+querymode="2"
+querytype="protocol-valve"
+
+## Console type
+consoleverbose="yes"
+consoleinteract="no"
+
+## Game Server Details
+# Do not edit
+gamename="Soulmask"
+engine="unreal4"
+glibc="2.17"
+
+#### Directories ####
+# Edit with care
+
+## Game Server Directories
+systemdir="${serverfiles}/WS"
+executabledir="${systemdir}/Binaries/Linux"
+executable="./WSServer-Linux-Shipping"
+
+## Backup Directory
+backupdir="${lgsmdir}/backup"
+
+## Logging Directories
+[ -n "${LGSM_LOGDIR}" ] && logdir="${LGSM_LOGDIR}" || logdir="${rootdir}/log"
+gamelogdir="${systemdir}/WS/Saved/Logs"
+lgsmlogdir="${logdir}/script"
+consolelogdir="${logdir}/console"
+lgsmlog="${lgsmlogdir}/${selfname}-script.log"
+consolelog="${consolelogdir}/${selfname}-console.log"
+alertlog="${lgsmlogdir}/${selfname}-alert.log"
+postdetailslog="${lgsmlogdir}/${selfname}-postdetails.log"
+
+## Logs Naming
+lgsmlogdate="${lgsmlogdir}/${selfname}-script-$(date '+%Y-%m-%d-%H:%M:%S').log"
+consolelogdate="${consolelogdir}/${selfname}-console-$(date '+%Y-%m-%d-%H:%M:%S').log"
+
+## Log Parameters
+logtimestamp="off"
+logtimestampformat="%Y-%m-%d %H:%M:%S"
diff --git a/lgsm/config-default/config-lgsm/tfserver/_default.cfg b/lgsm/config-default/config-lgsm/tfserver/_default.cfg
index c6d9842b3..fbce96a44 100644
--- a/lgsm/config-default/config-lgsm/tfserver/_default.cfg
+++ b/lgsm/config-default/config-lgsm/tfserver/_default.cfg
@@ -25,7 +25,7 @@ greenhand="true"
 maxplayers="40"
 maxqueuesize="50"
 queuevalidtime="120"
-saveinterval="300"
+saveinterval="300" # Auto-save in seconds.
 serveradmins="" # Use 17-digit Steam IDs separated by commas to grant admin privileges to players.
 servername="LinuxGSM"
 serverpassword=""
diff --git a/lgsm/config-default/config-lgsm/vhserver/_default.cfg b/lgsm/config-default/config-lgsm/vhserver/_default.cfg
index 8950435e8..b027d0fca 100644
--- a/lgsm/config-default/config-lgsm/vhserver/_default.cfg
+++ b/lgsm/config-default/config-lgsm/vhserver/_default.cfg
@@ -10,14 +10,13 @@
 
 ## Predefined Parameters | https://docs.linuxgsm.com/configuration/start-parameters
 servername="LinuxGSM"
-# Minimum password length is 5.
-serverpassword=""
+serverpassword="" # Minimum password length is 5.
 port="2456"
 worldname="${selfname}"
 public="1"
 savedir="$HOME/.config/unity3d/IronGate/Valheim"
 logFile=""
-saveinterval="1800"
+saveinterval="1800" # Auto-save in seconds.
 backups="4"
 backupshort="7200"
 backuplong="43200"
diff --git a/lgsm/data/almalinux-8.csv b/lgsm/data/almalinux-8.csv
index ab8d75b6a..204242144 100644
--- a/lgsm/data/almalinux-8.csv
+++ b/lgsm/data/almalinux-8.csv
@@ -105,6 +105,7 @@ scpslsm
 sdtd,telnet,expect,libxml2
 sf
 sfc,ncurses-libs.i686
+sm,telnet,expect
 sof2
 sol
 squad
diff --git a/lgsm/data/almalinux-9.csv b/lgsm/data/almalinux-9.csv
index e4fb83e3b..02f21426c 100644
--- a/lgsm/data/almalinux-9.csv
+++ b/lgsm/data/almalinux-9.csv
@@ -105,6 +105,7 @@ scpslsm
 sdtd,telnet,expect,libxml2
 sf
 sfc,ncurses-libs.i686
+sm,telnet,expect
 sof2
 sol
 squad
diff --git a/lgsm/data/centos-7.csv b/lgsm/data/centos-7.csv
index 0e04e3c74..a536c9c0f 100644
--- a/lgsm/data/centos-7.csv
+++ b/lgsm/data/centos-7.csv
@@ -105,6 +105,7 @@ scpslsm
 sdtd,telnet,expect,libxml2
 sf
 sfc,ncurses-libs.i686
+sm,telnet,expect
 sof2
 sol
 squad
diff --git a/lgsm/data/centos-8.csv b/lgsm/data/centos-8.csv
index c07bf66d0..d4d008fd4 100644
--- a/lgsm/data/centos-8.csv
+++ b/lgsm/data/centos-8.csv
@@ -105,6 +105,7 @@ scpslsm
 sdtd,telnet,expect,libxml2
 sf
 sfc,ncurses-libs.i686
+sm,telnet,expect
 sof2
 sol
 squad
diff --git a/lgsm/data/centos-9.csv b/lgsm/data/centos-9.csv
index c919a160b..574401733 100644
--- a/lgsm/data/centos-9.csv
+++ b/lgsm/data/centos-9.csv
@@ -105,6 +105,7 @@ scpslsm
 sdtd,telnet,expect,libxml2
 sf
 sfc,ncurses-libs.i686
+sm,telnet,expect
 sof2
 sol
 squad
diff --git a/lgsm/data/debian-10.csv b/lgsm/data/debian-10.csv
index 1892d9f9f..6b1a843bb 100644
--- a/lgsm/data/debian-10.csv
+++ b/lgsm/data/debian-10.csv
@@ -104,6 +104,7 @@ scpslsm,mono-complete
 sdtd,telnet,expect,libxml2-utils
 sf
 sfc,libtinfo5:i386
+sm,telnet,expect
 sof2
 sol
 squad
diff --git a/lgsm/data/debian-11.csv b/lgsm/data/debian-11.csv
index 9a37307c0..60a46f55d 100644
--- a/lgsm/data/debian-11.csv
+++ b/lgsm/data/debian-11.csv
@@ -105,6 +105,7 @@ scpslsm,mono-complete
 sdtd,telnet,expect,libxml2-utils
 sf
 sfc,libtinfo5:i386
+sm,telnet,expect
 sof2
 sol
 squad
diff --git a/lgsm/data/debian-12.csv b/lgsm/data/debian-12.csv
index 8835871ee..0fd50f2d7 100644
--- a/lgsm/data/debian-12.csv
+++ b/lgsm/data/debian-12.csv
@@ -105,6 +105,7 @@ scpslsm,mono-complete
 sdtd,telnet,expect,libxml2-utils
 sf
 sfc,libtinfo5:i386
+sm,telnet,expect
 sof2
 sol
 squad
diff --git a/lgsm/data/debian-9.csv b/lgsm/data/debian-9.csv
index c202924de..174bd8e16 100644
--- a/lgsm/data/debian-9.csv
+++ b/lgsm/data/debian-9.csv
@@ -105,6 +105,7 @@ scpslsm,mono-complete
 sdtd,telnet,expect,libxml2-utils
 sf
 sfc,libtinfo5:i386
+sm,telnet,expect
 sof2
 sol
 squad
diff --git a/lgsm/data/rhel-7.csv b/lgsm/data/rhel-7.csv
index 0546d8eb1..8854649ad 100644
--- a/lgsm/data/rhel-7.csv
+++ b/lgsm/data/rhel-7.csv
@@ -105,6 +105,7 @@ scpslsm
 sdtd,telnet,expect,libxml2
 sf
 sfc,ncurses-libs.i686
+sm,telnet,expect
 sof2
 sol
 squad
diff --git a/lgsm/data/rhel-8.csv b/lgsm/data/rhel-8.csv
index bbfb982f0..7dd334f38 100644
--- a/lgsm/data/rhel-8.csv
+++ b/lgsm/data/rhel-8.csv
@@ -105,6 +105,7 @@ scpslsm
 sdtd,telnet,expect,libxml2
 sf
 sfc,ncurses-libs.i686
+sm,telnet,expect
 sof2
 sol
 squad
diff --git a/lgsm/data/rhel-9.csv b/lgsm/data/rhel-9.csv
index e4fb83e3b..02f21426c 100644
--- a/lgsm/data/rhel-9.csv
+++ b/lgsm/data/rhel-9.csv
@@ -105,6 +105,7 @@ scpslsm
 sdtd,telnet,expect,libxml2
 sf
 sfc,ncurses-libs.i686
+sm,telnet,expect
 sof2
 sol
 squad
diff --git a/lgsm/data/rocky-8.csv b/lgsm/data/rocky-8.csv
index bbfb982f0..7dd334f38 100644
--- a/lgsm/data/rocky-8.csv
+++ b/lgsm/data/rocky-8.csv
@@ -105,6 +105,7 @@ scpslsm
 sdtd,telnet,expect,libxml2
 sf
 sfc,ncurses-libs.i686
+sm,telnet,expect
 sof2
 sol
 squad
diff --git a/lgsm/data/rocky-9.csv b/lgsm/data/rocky-9.csv
index e4fb83e3b..02f21426c 100644
--- a/lgsm/data/rocky-9.csv
+++ b/lgsm/data/rocky-9.csv
@@ -105,6 +105,7 @@ scpslsm
 sdtd,telnet,expect,libxml2
 sf
 sfc,ncurses-libs.i686
+sm,telnet,expect
 sof2
 sol
 squad
diff --git a/lgsm/data/serverlist.csv b/lgsm/data/serverlist.csv
index 23e126627..7d2173321 100644
--- a/lgsm/data/serverlist.csv
+++ b/lgsm/data/serverlist.csv
@@ -104,6 +104,7 @@ scpslsm,scpslsmserver,SCP: Secret Laboratory ServerMod,ubuntu-22.04
 sdtd,sdtdserver,7 Days to Die,ubuntu-22.04
 sf,sfserver,Satisfactory,ubuntu-22.04
 sfc,sfcserver,SourceForts Classic,ubuntu-22.04
+sm,smserver,Soulmask,ubuntu-22.04
 sof2,sof2server,Soldier Of Fortune 2: Gold Edition,ubuntu-22.04
 sol,solserver,Soldat,ubuntu-22.04
 squad,squadserver,Squad,ubuntu-22.04
diff --git a/lgsm/data/ubuntu-16.04.csv b/lgsm/data/ubuntu-16.04.csv
index cf6a20220..1f359ab9d 100644
--- a/lgsm/data/ubuntu-16.04.csv
+++ b/lgsm/data/ubuntu-16.04.csv
@@ -105,6 +105,7 @@ scpslsm,mono-complete
 sdtd,telnet,expect,libxml2-utils
 sf
 sfc,libtinfo5:i386
+sm,telnet,expect
 sof2
 sol
 squad
diff --git a/lgsm/data/ubuntu-18.04.csv b/lgsm/data/ubuntu-18.04.csv
index 6f7dcbe18..cccd53dc7 100644
--- a/lgsm/data/ubuntu-18.04.csv
+++ b/lgsm/data/ubuntu-18.04.csv
@@ -105,6 +105,7 @@ scpslsm,mono-complete
 sdtd,telnet,expect,libxml2-utils
 sf
 sfc,libtinfo5:i386
+sm,telnet,expect
 sof2
 sol
 squad
diff --git a/lgsm/data/ubuntu-20.04.csv b/lgsm/data/ubuntu-20.04.csv
index 98ba275f9..4c0cae0a8 100644
--- a/lgsm/data/ubuntu-20.04.csv
+++ b/lgsm/data/ubuntu-20.04.csv
@@ -105,6 +105,7 @@ scpslsm,mono-complete
 sdtd,telnet,expect,libxml2-utils
 sf
 sfc,libtinfo5:i386
+sm,telnet,expect
 sof2
 sol
 squad
diff --git a/lgsm/data/ubuntu-22.04.csv b/lgsm/data/ubuntu-22.04.csv
index 9bc8f7ad1..b0f896fae 100644
--- a/lgsm/data/ubuntu-22.04.csv
+++ b/lgsm/data/ubuntu-22.04.csv
@@ -105,6 +105,7 @@ scpslsm,mono-complete
 sdtd,telnet,expect,libxml2-utils
 sf
 sfc,libtinfo5:i386
+sm,telnet,expect
 sof2
 sol
 squad
diff --git a/lgsm/data/ubuntu-23.04.csv b/lgsm/data/ubuntu-23.04.csv
index e6d0c2962..7ad90039b 100644
--- a/lgsm/data/ubuntu-23.04.csv
+++ b/lgsm/data/ubuntu-23.04.csv
@@ -105,6 +105,7 @@ scpslsm,mono-complete
 sdtd,telnet,expect,libxml2-utils
 sf
 sfc,libtinfo5:i386
+sm,telnet,expect
 sof2
 sol
 squad
diff --git a/lgsm/data/ubuntu-23.10.csv b/lgsm/data/ubuntu-23.10.csv
index e6d0c2962..7ad90039b 100644
--- a/lgsm/data/ubuntu-23.10.csv
+++ b/lgsm/data/ubuntu-23.10.csv
@@ -105,6 +105,7 @@ scpslsm,mono-complete
 sdtd,telnet,expect,libxml2-utils
 sf
 sfc,libtinfo5:i386
+sm,telnet,expect
 sof2
 sol
 squad
diff --git a/lgsm/data/ubuntu-24.04.csv b/lgsm/data/ubuntu-24.04.csv
index e6d0c2962..7ad90039b 100644
--- a/lgsm/data/ubuntu-24.04.csv
+++ b/lgsm/data/ubuntu-24.04.csv
@@ -105,6 +105,7 @@ scpslsm,mono-complete
 sdtd,telnet,expect,libxml2-utils
 sf
 sfc,libtinfo5:i386
+sm,telnet,expect
 sof2
 sol
 squad
diff --git a/lgsm/modules/check_system_requirements.sh b/lgsm/modules/check_system_requirements.sh
index 0214cdc1a..d25954427 100644
--- a/lgsm/modules/check_system_requirements.sh
+++ b/lgsm/modules/check_system_requirements.sh
@@ -9,7 +9,7 @@ moduleselfname="$(basename "$(readlink -f "${BASH_SOURCE[0]}")")"
 
 info_distro.sh
 
-# RAM requirements in megabytes for each game or engine.
+# RAM requirements in gigabytes for each game or engine.
 
 if [ "${shortname}" == "ark" ]; then
 	ramrequirementgb="7"
@@ -49,6 +49,8 @@ elif [ "${shortname}" == "sf" ]; then
 	ramrequirementgb="12"
 elif [ "${shortname}" == "squad" ]; then
 	ramrequirementgb="2"
+elif [ "${shortname}" == "sm" ]; then
+	ramrequirementgb="10"
 elif [ "${shortname}" == "st" ]; then
 	ramrequirementgb="1"
 elif [ "${shortname}" == "stn" ]; then
diff --git a/lgsm/modules/command_dev_parse_game_details.sh b/lgsm/modules/command_dev_parse_game_details.sh
index 2bb01e436..2e22aa7ae 100644
--- a/lgsm/modules/command_dev_parse_game_details.sh
+++ b/lgsm/modules/command_dev_parse_game_details.sh
@@ -112,7 +112,6 @@ declare -A server_details=(
 	['Steamworks Port']="${steamworksport}"
 	['Telnet Enabled']="${telnetenabled}"
 	['Telnet IP']="${telnetip}"
-	['Telnet Password']="${telnetpass}"
 	['Telnet Password']="${telnetpassword}"
 	['Telnet Port']="${telnetport}"
 	['Tickrate']="${tickrate}"
diff --git a/lgsm/modules/command_dev_query_raw.sh b/lgsm/modules/command_dev_query_raw.sh
index ae49a1b85..39f4787d3 100644
--- a/lgsm/modules/command_dev_query_raw.sh
+++ b/lgsm/modules/command_dev_query_raw.sh
@@ -207,7 +207,7 @@ echo -e ""
 echo -e "${lightgreen}Gamedig Raw Output${default}"
 fn_messages_separator
 echo -e ""
-if [ ! "$(command -v gamedig 2> /dev/null)" ] || [ ! -f "${lgsmdir}/node_modules/gamedig/bin/gamedig.js" ]; then
+if [ ! "$(command -v gamedig 2> /dev/null)" ] && [ ! -f "${lgsmdir}/node_modules/gamedig/bin/gamedig.js" ]; then
 	fn_print_failure_nl "gamedig not installed"
 fi
 if [ ! "$(command -v jq 2> /dev/null)" ]; then
diff --git a/lgsm/modules/command_stop.sh b/lgsm/modules/command_stop.sh
index 3d534317a..7783cc94f 100644
--- a/lgsm/modules/command_stop.sh
+++ b/lgsm/modules/command_stop.sh
@@ -96,8 +96,8 @@ fn_stop_graceful_goldsrc() {
 
 # telnet command for sdtd graceful shutdown.
 fn_stop_graceful_sdtd_telnet() {
-	if [ -z "${telnetpass}" ] || [ "${telnetpass}" == "NOT SET" ]; then
-		sdtd_telnet_shutdown=$(expect -c '
+	if [ -z "${telnetpassword}" ] || [ "${telnetpassword}" == "NOT SET" ]; then
+		sdtdtelnetshutdown=$(expect -c '
 		proc abort {} {
 			puts "Timeout or EOF\n"
 			exit 1
@@ -111,14 +111,14 @@ fn_stop_graceful_sdtd_telnet() {
 		puts "Completed.\n"
 		')
 	else
-		sdtd_telnet_shutdown=$(expect -c '
+		sdtdtelnetshutdown=$(expect -c '
 		proc abort {} {
 			puts "Timeout or EOF\n"
 			exit 1
 		}
 		spawn telnet '"${telnetip}"' '"${telnetport}"'
 		expect {
-			"password:"     { send "'"${telnetpass}"'\r" }
+			"password:"     { send "'"${telnetpassword}"'\r" }
 			default         abort
 		}
 		expect {
@@ -143,8 +143,8 @@ fn_stop_graceful_sdtd() {
 			fn_print_dots "Graceful: telnet: ${telnetip}:${telnetport}"
 			fn_script_log_info "Graceful: telnet: ${telnetip}:${telnetport}"
 			fn_stop_graceful_sdtd_telnet
-			completed=$(echo -en "\n ${sdtd_telnet_shutdown}" | grep "Completed.")
-			refused=$(echo -en "\n ${sdtd_telnet_shutdown}" | grep "Timeout or EOF")
+			completed=$(echo -en "\n ${sdtdtelnetshutdown}" | grep "Completed.")
+			refused=$(echo -en "\n ${sdtdtelnetshutdown}" | grep "Timeout or EOF")
 			if [ "${refused}" ]; then
 				fn_print_error "Graceful: telnet: ${telnetip}:${telnetport} : "
 				fn_print_fail_eol_nl
@@ -159,7 +159,7 @@ fn_stop_graceful_sdtd() {
 		if [ "${completed}" ]; then
 			for seconds in {1..30}; do
 				fn_stop_graceful_sdtd_telnet
-				refused=$(echo -en "\n ${sdtd_telnet_shutdown}" | grep "Timeout or EOF")
+				refused=$(echo -en "\n ${sdtdtelnetshutdown}" | grep "Timeout or EOF")
 				if [ "${refused}" ]; then
 					fn_print_ok "Graceful: telnet: ${telnetip}:${telnetport} : "
 					fn_print_ok_eol_nl
@@ -185,7 +185,7 @@ fn_stop_graceful_sdtd() {
 			fi
 			echo -en "\n" | tee -a "${lgsmlog}"
 			echo -en "Telnet output:" | tee -a "${lgsmlog}"
-			echo -en "\n ${sdtd_telnet_shutdown}" | tee -a "${lgsmlog}"
+			echo -en "\n ${sdtdtelnetshutdown}" | tee -a "${lgsmlog}"
 			echo -en "\n\n" | tee -a "${lgsmlog}"
 		fi
 	else
@@ -195,6 +195,95 @@ fn_stop_graceful_sdtd() {
 	fi
 }
 
+# Attempts graceful shutdown of Soulmask using telnet.
+fn_stop_graceful_sm() {
+	fn_print_dots "Graceful: telnet"
+	fn_script_log_info "Graceful: telnet"
+	if [ "${telnetenabled}" == "false" ]; then
+		fn_print_info_nl "Graceful: telnet: DISABLED: Enable in ${servercfg}"
+	elif [ "$(command -v expect 2> /dev/null)" ]; then
+		# Tries to shutdown with both localhost and server IP.
+		for telnetip in 127.0.0.1 ${ip}; do
+			fn_print_dots "Graceful: telnet: ${telnetip}:${telnetport}"
+			fn_script_log_info "Graceful: telnet: ${telnetip}:${telnetport}"
+			fn_stop_graceful_sm_telnet
+			completed=$(echo -en "\n ${smtelnetshutdown}" | grep "Completed.")
+			refused=$(echo -en "\n ${smtelnetshutdown}" | grep "Timeout or EOF")
+			if [ "${refused}" ]; then
+				fn_print_error "Graceful: telnet: ${telnetip}:${telnetport} : "
+				fn_print_fail_eol_nl
+				fn_script_log_error "Graceful: telnet:  ${telnetip}:${telnetport} : FAIL"
+			elif [ "${completed}" ]; then
+				break
+			fi
+		done
+
+		# If telnet shutdown was successful will use telnet again to check
+		# the connection has closed, confirming that the tmux session can now be killed.
+		if [ "${completed}" ]; then
+			for seconds in {1..30}; do
+				fn_stop_graceful_sm_telnet
+				refused=$(echo -en "\n ${smtelnetshutdown}" | grep "Timeout or EOF")
+				if [ "${refused}" ]; then
+					fn_print_ok "Graceful: telnet: ${telnetip}:${telnetport} : "
+					fn_print_ok_eol_nl
+					fn_script_log_pass "Graceful: telnet: ${telnetip}:${telnetport} : ${seconds} seconds"
+					if [ "${statusalert}" == "on" ] && [ "${firstcommandname}" == "STOP" ]; then
+						alert="stopped"
+						alert.sh
+					fi
+					break
+				fi
+				fn_sleep_time_1
+				fn_print_dots "Graceful: telnet: ${seconds}"
+			done
+		# If telnet shutdown fails, show it and stop
+		else
+			if [ "${refused}" ]; then
+				fn_print_error "Graceful: telnet: "
+				fn_print_fail_eol_nl
+				fn_script_log_error "Graceful: telnet: ${telnetip}:${telnetport} : FAIL"
+			else
+				fn_print_error_nl "Graceful: telnet: Unknown error"
+				fn_script_log_error "Graceful: telnet: Unknown error"
+			fi
+			echo -en "\n" | tee -a "${lgsmlog}"
+			echo -en "Telnet output:" | tee -a "${lgsmlog}"
+			echo -en "\n ${smtelnetshutdown}" | tee -a "${lgsmlog}"
+			echo -en "\n\n" | tee -a "${lgsmlog}"
+		fi
+	else
+		fn_print_warn "Graceful: telnet: expect not installed: "
+		fn_print_fail_eol_nl
+		fn_script_log_warn "Graceful: telnet: expect not installed: FAIL"
+	fi
+}
+
+# telnet command for soulmask graceful shutdown.
+fn_stop_graceful_sm_telnet() {
+	smtelnetshutdown=$(expect -c '
+		proc abort {} {
+			puts "Timeout or EOF\n"
+			exit 1
+		}
+		spawn telnet '"${telnetip}"' '"${telnetport}"'
+		expect {
+			"Hello:"	{ send "saveworld 1\r" }
+			default	abort
+		}
+		expect {
+			"the world is saved."	{ send "quit 1\r" }
+			default	abort
+		}
+		expect {
+			"World is closing..."	{}
+			default	abort
+		}
+		expect { eof }
+		puts "Completed.\n"
+	')
+}
+
 # Attempts graceful shutdown by sending /save /stop.
 fn_stop_graceful_avorion() {
 	fn_print_dots "Graceful: /save /stop"
@@ -253,6 +342,8 @@ fn_stop_graceful_select() {
 		fn_stop_graceful_cmd "end" 30
 	elif [ "${stopmode}" == "12" ]; then
 		fn_stop_graceful_cmd "shutdown" 30
+	elif [ "${stopmode}" == "13" ]; then
+		fn_stop_graceful_sm
 	fi
 }
 
diff --git a/lgsm/modules/core_modules.sh b/lgsm/modules/core_modules.sh
index f083a4893..6a5bcc662 100644
--- a/lgsm/modules/core_modules.sh
+++ b/lgsm/modules/core_modules.sh
@@ -446,6 +446,11 @@ fix_sfc.sh() {
 	fn_fetch_module
 }
 
+fix_sm.sh() {
+	modulefile="${FUNCNAME[0]}"
+	fn_fetch_module
+}
+
 fix_st.sh() {
 	modulefile="${FUNCNAME[0]}"
 	fn_fetch_module
diff --git a/lgsm/modules/fix.sh b/lgsm/modules/fix.sh
index dbb8e3545..e6e00465d 100644
--- a/lgsm/modules/fix.sh
+++ b/lgsm/modules/fix.sh
@@ -52,7 +52,7 @@ fn_apply_fix() {
 	fi
 }
 
-apply_pre_start_fix=(arma3 armar ark av bt bo csgo cmw dst hw ins kf nmrih onset pvr ro rust rw samp sdtd sfc sof2 squad st tf2 terraria ts3 mcb mta unt vh wurm zmr)
+apply_pre_start_fix=(arma3 armar ark av bt bo csgo cmw dst hw ins kf nmrih onset pvr ro rust rw samp sdtd sfc sm sof2 squad st tf2 terraria ts3 mcb mta unt vh wurm zmr)
 apply_post_install_fix=(av kf kf2 ro ut2k4 ut ut3)
 
 # validate registered fixes for safe development
diff --git a/lgsm/modules/fix_sm.sh b/lgsm/modules/fix_sm.sh
new file mode 100644
index 000000000..1d72a48bf
--- /dev/null
+++ b/lgsm/modules/fix_sm.sh
@@ -0,0 +1,10 @@
+#!/bin/bash
+# LinuxGSM fix_sm.sh module
+# Author: Daniel Gibbs
+# Contributors: http://linuxgsm.com/contrib
+# Website: https://linuxgsm.com
+# Description: Resolves issues with Unturned.
+
+moduleselfname="$(basename "$(readlink -f "${BASH_SOURCE[0]}")")"
+
+export LD_LIBRARY_PATH="$LD_LIBRARY_PATH:${serverfiles}:${serverfiles}/linux64"
diff --git a/lgsm/modules/info_game.sh b/lgsm/modules/info_game.sh
index f4caa5a7f..0f38ea250 100644
--- a/lgsm/modules/info_game.sh
+++ b/lgsm/modules/info_game.sh
@@ -1970,7 +1970,7 @@ fn_info_game_sdtd() {
 	telnetenabled="${telnetenabled:-"NOT SET"}"
 	# Telnet IP will be localhost if no password is set
 	# check_ip will set the IP first. This will overwrite it.
-	if [ -z "${telnetpass}" ]; then
+	if [ -z "${telnetpassword}" ]; then
 		telnetip="127.0.0.1"
 	fi
 	telnetpass="${telnetpass:-"NOT SET"}"
@@ -1988,6 +1988,19 @@ fn_info_game_sf() {
 	beaconport="${beaconport:-"0"}"
 }
 
+# Config Type: Parameters (with an ini)
+fn_info_game_sm() {
+	servername="${servername:-"NOT SET"}"
+	adminpassword="${adminpassword:-"NOT SET"}"
+	port="${port:-"0"}"
+	queryport="${queryport:-"0"}"
+	maxplayers="${maxplayers:-"0"}"
+	# telnet config
+	telnetenabled=true
+	telnetip="127.0.0.1"
+	telnetport="${telnetport:-"0"}"
+}
+
 # Config Type: QuakeC
 # Comment: // or /* */
 # Example: set sv_hostname "SERVERNAME"
@@ -2407,6 +2420,8 @@ elif [ "${shortname}" == "sdtd" ]; then
 	fn_info_game_sdtd
 elif [ "${shortname}" == "sf" ]; then
 	fn_info_game_sf
+elif [ "${shortname}" == "sm" ]; then
+	fn_info_game_sm
 elif [ "${shortname}" == "sof2" ]; then
 	fn_info_game_sof2
 elif [ "${shortname}" == "sol" ]; then
diff --git a/lgsm/modules/info_messages.sh b/lgsm/modules/info_messages.sh
index a5f25bc74..9bab0cbb7 100644
--- a/lgsm/modules/info_messages.sh
+++ b/lgsm/modules/info_messages.sh
@@ -30,8 +30,8 @@ fn_info_messages_password_strip() {
 			httppassword="********"
 		fi
 
-		if [ "${telnetpass}" ]; then
-			telnetpass="********"
+		if [ "${telnetpassword}" ]; then
+			telnetpassword="********"
 		fi
 
 		if [ "${wsapikey}" ]; then
@@ -483,6 +483,11 @@ fn_info_messages_gameserver() {
 			echo -e "${lightblue}Version Count:\t${default}${versioncount}"
 		fi
 
+		# backupinterval (Soulmask)
+		if [ -n "${backupinterval}" ]; then
+			echo -e "${lightblue}Backup Interval:\t${default}${backupinterval}"
+		fi
+
 		# Listed on Master server
 		if [ -n "${displaymasterserver}" ]; then
 			if [ "${displaymasterserver}" == "true" ]; then
@@ -702,6 +707,8 @@ fn_info_messages_ports() {
 		portcommand="ss -tuplwn | grep java"
 	elif [ "${shortname}" == "terraria" ]; then
 		portcommand="ss -tuplwn | grep Main"
+	elif [ "${shortname}" == "sm" ]; then
+		portcommand="ss -tuplwn | grep WSServer-Linux"
 	elif [ "${engine}" == "source" ]; then
 		portcommand="ss -tuplwn | grep srcds_linux"
 	elif [ "${engine}" == "goldsrc" ]; then
@@ -1435,7 +1442,7 @@ fn_info_messages_sdtd() {
 	{
 		echo -e "${lightblue}Telnet enabled:\t${default}${telnetenabled}"
 		echo -e "${lightblue}Telnet address:\t${default}${telnetip} ${telnetport}"
-		echo -e "${lightblue}Telnet password:\t${default}${telnetpass}"
+		echo -e "${lightblue}Telnet password:\t${default}${telnetpassword}"
 	} | column -s $'\t' -t
 }
 
@@ -1448,6 +1455,23 @@ fn_info_messages_sf() {
 	} | column -s $'\t' -t
 }
 
+fn_info_messages_sm() {
+	fn_info_messages_password_strip
+	{
+		fn_port "header"
+		fn_port "Game" port udp
+		fn_port "Query" queryport udp
+		fn_port "Telnet" telnetport tcp
+	} | column -s $'\t' -t
+	echo -e ""
+	echo -e "${bold}${lightgreen}${gamename} Telnet${default}"
+	fn_messages_separator
+	{
+		echo -e "${lightblue}Telnet enabled:\t${default}${telnetenabled}"
+		echo -e "${lightblue}Telnet address:\t${default}${telnetip} ${telnetport}"
+	} | column -s $'\t' -t
+}
+
 fn_info_messages_sof2() {
 	{
 		fn_port "header"
@@ -1842,6 +1866,8 @@ fn_info_messages_select_engine() {
 		fn_info_messages_sdtd
 	elif [ "${shortname}" == "sf" ]; then
 		fn_info_messages_sf
+	elif [ "${shortname}" == "sm" ]; then
+		fn_info_messages_sm
 	elif [ "${shortname}" == "sof2" ]; then
 		fn_info_messages_sof2
 	elif [ "${shortname}" == "sol" ]; then
diff --git a/lgsm/modules/install_config.sh b/lgsm/modules/install_config.sh
index eea590f9e..22843c7b0 100644
--- a/lgsm/modules/install_config.sh
+++ b/lgsm/modules/install_config.sh
@@ -695,6 +695,9 @@ elif [ "${shortname}" == "sf" ]; then
 	fn_default_config_remote
 	fn_set_config_vars
 	fn_list_config_locations
+elif [ "${shortname}" == "sm" ]; then
+	fn_default_config_local
+	fn_list_config_locations
 elif [ "${shortname}" == "sol" ]; then
 	array_configs+=(soldat.ini)
 	fn_fetch_default_config

From 5ed5b802763d7b9f900dd816466e41a404f36ea1 Mon Sep 17 00:00:00 2001
From: Daniel Gibbs <me@danielgibbs.co.uk>
Date: Sun, 11 Aug 2024 18:23:24 +0100
Subject: [PATCH 114/154] fix(gamedig): Update gamedig version to resolve a bug
 #4624

---
 package.json | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/package.json b/package.json
index d4146ee20..e40e99e55 100644
--- a/package.json
+++ b/package.json
@@ -22,6 +22,6 @@
   },
   "homepage": "https://github.com/GameServerManagers/LinuxGSM#readme",
   "dependencies": {
-    "gamedig": "^5.0.0-beta.2"
+    "gamedig": "^5.1.1"
   }
 }

From ac208c7a056a0a96433fdac8973a400e28b80de0 Mon Sep 17 00:00:00 2001
From: Daniel Gibbs <me@danielgibbs.co.uk>
Date: Sun, 11 Aug 2024 18:27:03 +0100
Subject: [PATCH 115/154] Release v24.2.2

---
 lgsm/modules/core_modules.sh | 2 +-
 linuxgsm.sh                  | 2 +-
 2 files changed, 2 insertions(+), 2 deletions(-)

diff --git a/lgsm/modules/core_modules.sh b/lgsm/modules/core_modules.sh
index f083a4893..730fe58b7 100644
--- a/lgsm/modules/core_modules.sh
+++ b/lgsm/modules/core_modules.sh
@@ -8,7 +8,7 @@
 
 moduleselfname="$(basename "$(readlink -f "${BASH_SOURCE[0]}")")"
 
-modulesversion="v24.2.1"
+modulesversion="v24.2.2"
 
 # Core
 
diff --git a/linuxgsm.sh b/linuxgsm.sh
index 8db9a57c9..bafc8a3a0 100755
--- a/linuxgsm.sh
+++ b/linuxgsm.sh
@@ -24,7 +24,7 @@ if [ -f ".dev-debug" ]; then
 	set -x
 fi
 
-version="v24.2.1"
+version="v24.2.2"
 shortname="core"
 gameservername="core"
 commandname="CORE"

From d86bec9acf931932721c52cafbedd29d80ea351c Mon Sep 17 00:00:00 2001
From: Daniel Gibbs <me@danielgibbs.co.uk>
Date: Sun, 11 Aug 2024 19:32:55 +0100
Subject: [PATCH 116/154] fix(mcb): timestamp disabled for MCB as breaks update
 check

---
 lgsm/modules/command_start.sh | 3 ++-
 1 file changed, 2 insertions(+), 1 deletion(-)

diff --git a/lgsm/modules/command_start.sh b/lgsm/modules/command_start.sh
index f38125a5e..cca044518 100644
--- a/lgsm/modules/command_start.sh
+++ b/lgsm/modules/command_start.sh
@@ -80,7 +80,8 @@ fn_start_tmux() {
 
 	# Enable console logging.
 	if [ "${consolelogging}" == "on" ] || [ -z "${consolelogging}" ]; then
-		if [ "${logtimestamp}" == "on" ]; then
+		# timestamp will break mcb update check.
+		if [ "${logtimestamp}" == "on" ] && [ "${shortname}" != "mcb" ]; then
 			tmux -L "${socketname}" pipe-pane -o -t "${sessionname}" "exec bash -c \"cat | $addtimestamp\" >> '${consolelog}'"
 		else
 			tmux -L "${socketname}" pipe-pane -o -t "${sessionname}" "exec cat >> '${consolelog}'"

From a7a8e381526a81b60d855fffc575d42ccb382a05 Mon Sep 17 00:00:00 2001
From: Daniel Gibbs <me@danielgibbs.co.uk>
Date: Mon, 12 Aug 2024 14:07:01 +0100
Subject: [PATCH 117/154] fix(gamedig): ensure that node modules are valid

---
 lgsm/modules/check_gamedig.sh | 6 +++++-
 1 file changed, 5 insertions(+), 1 deletion(-)

diff --git a/lgsm/modules/check_gamedig.sh b/lgsm/modules/check_gamedig.sh
index 4155e6a69..8abc0b759 100644
--- a/lgsm/modules/check_gamedig.sh
+++ b/lgsm/modules/check_gamedig.sh
@@ -10,6 +10,10 @@ if [ "$(command -v node)" ] && [ "$(node -v | cut -d 'v' -f 2 | cut -d '.' -f 1)
 	echo -e "${bold}${lightyellow}Installing Gamedig${default}"
 	fn_script_log_info "Installing Gamedig"
 	cd "${lgsmdir}" || exit
-	wget -N --no-check-certificate "https://raw.githubusercontent.com/GameServerManagers/LinuxGSM/${githubbranch}/package.json"
+	curl -L -o package.json "https://raw.githubusercontent.com/GameServerManagers/LinuxGSM/${githubbranch}/package.json"
 	npm install
+elif [ "$(command -v node)" ] && [ "$(node -v | cut -d 'v' -f 2 | cut -d '.' -f 1)" -ge 16 ]; then
+	cd "${lgsmdir}" || exit
+	curl -s -L -o package.json "https://raw.githubusercontent.com/GameServerManagers/LinuxGSM/${githubbranch}/package.json"
+	npm update > /dev/null 2>&1
 fi

From 23b342296c31a65f971ad2c562154a0519650214 Mon Sep 17 00:00:00 2001
From: Daniel Gibbs <me@danielgibbs.co.uk>
Date: Mon, 12 Aug 2024 14:23:50 +0100
Subject: [PATCH 118/154] Release v24.2.3

---
 lgsm/modules/core_modules.sh | 2 +-
 linuxgsm.sh                  | 2 +-
 2 files changed, 2 insertions(+), 2 deletions(-)

diff --git a/lgsm/modules/core_modules.sh b/lgsm/modules/core_modules.sh
index 730fe58b7..dbcec4f6f 100644
--- a/lgsm/modules/core_modules.sh
+++ b/lgsm/modules/core_modules.sh
@@ -8,7 +8,7 @@
 
 moduleselfname="$(basename "$(readlink -f "${BASH_SOURCE[0]}")")"
 
-modulesversion="v24.2.2"
+modulesversion="v24.2.3"
 
 # Core
 
diff --git a/linuxgsm.sh b/linuxgsm.sh
index bafc8a3a0..eafb87406 100755
--- a/linuxgsm.sh
+++ b/linuxgsm.sh
@@ -24,7 +24,7 @@ if [ -f ".dev-debug" ]; then
 	set -x
 fi
 
-version="v24.2.2"
+version="v24.2.3"
 shortname="core"
 gameservername="core"
 commandname="CORE"

From 182c6730725d2e6a6b3512ff82efe55515ce435c Mon Sep 17 00:00:00 2001
From: Daniel Gibbs <me@danielgibbs.co.uk>
Date: Mon, 12 Aug 2024 16:20:38 +0100
Subject: [PATCH 119/154] fix(samp): update samp url

---
 lgsm/modules/install_server_files.sh | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/lgsm/modules/install_server_files.sh b/lgsm/modules/install_server_files.sh
index c5fe822ad..7ebac259f 100644
--- a/lgsm/modules/install_server_files.sh
+++ b/lgsm/modules/install_server_files.sh
@@ -191,7 +191,7 @@ fn_install_server_files() {
 		force="noforce"
 		md5="581a333cc7eacda2f56d5a00fe11eafa"
 	elif [ "${shortname}" == "samp" ]; then
-		remote_fileurl="https://files.sa-mp.com/samp037svr_R2-1.tar.gz"
+		remote_fileurl="https://files.samp-sc.com/samp037svr_R2-1.tar.gz"
 		local_filedir="${tmpdir}"
 		local_filename="samp037svr_R2-1.tar.gz"
 		chmodx="nochmodx" run="norun"

From e060865aefc510aeb75539302891072bfc0d81c2 Mon Sep 17 00:00:00 2001
From: Daniel Gibbs <me@danielgibbs.co.uk>
Date: Mon, 12 Aug 2024 22:56:20 +0100
Subject: [PATCH 120/154] feat(dev): add nocache if dev-debug is enabled
 (#4597)

---
 lgsm/modules/command_update_linuxgsm.sh | 43 ++++++++++++++-----------
 1 file changed, 25 insertions(+), 18 deletions(-)

diff --git a/lgsm/modules/command_update_linuxgsm.sh b/lgsm/modules/command_update_linuxgsm.sh
index 43827a672..4358b626c 100644
--- a/lgsm/modules/command_update_linuxgsm.sh
+++ b/lgsm/modules/command_update_linuxgsm.sh
@@ -15,14 +15,21 @@ check.sh
 info_distro.sh
 info_game.sh
 
+# Prevent github from using a cached version of the file if dev-debug is enabled.
+if [ -f "${rootdir}/.dev-debug" ]; then
+	nocache="-H \"Cache-Control: no-cache\" -H \"Pragma: no-cache\""
+fi
+
 fn_script_log_info "Updating LinuxGSM"
 
 fn_print_dots "Selecting repo"
 fn_script_log_info "Selecting repo"
 # Select remotereponame
-curl --connect-timeout 3 -IsfL "https://raw.githubusercontent.com/${githubuser}/${githubrepo}/${githubbranch}/linuxgsm.sh" 1> /dev/null
+
+curl ${nocache} --connect-timeout 3 -IsfL "https://raw.githubusercontent.com/${githubuser}/${githubrepo}/${githubbranch}/linuxgsm.sh" 1> /dev/null
+
 if [ $? != "0" ]; then
-	curl --connect-timeout 3 -IsfL "https://bitbucket.org/${githubuser}/${githubrepo}/raw/${githubbranch}/linuxgsm.sh" 1> /dev/null
+	curl curl ${nocache} --connect-timeout 3 -IsfL "https://bitbucket.org/${githubuser}/${githubrepo}/raw/${githubbranch}/linuxgsm.sh" 1> /dev/null
 	if [ $? != "0" ]; then
 		fn_print_fail_nl "Selecting repo: Unable to to access GitHub or Bitbucket repositories"
 		fn_script_log_fail "Selecting repo: Unable to to access GitHub or Bitbucket repositories"
@@ -39,9 +46,9 @@ fi
 # Check linuxsm.sh
 echo -en "checking ${remotereponame} linuxgsm.sh...\c"
 if [ "${remotereponame}" == "GitHub" ]; then
-	curl --connect-timeout 3 -IsfL "https://raw.githubusercontent.com/${githubuser}/${githubrepo}/${githubbranch}/linuxgsm.sh" 1> /dev/null
+	curl ${nocache} --connect-timeout 3 -IsfL "https://raw.githubusercontent.com/${githubuser}/${githubrepo}/${githubbranch}/linuxgsm.sh" 1> /dev/null
 else
-	curl --connect-timeout 3 -IsfL "https://bitbucket.org/${githubuser}/${githubrepo}/raw/${githubbranch}/linuxgsm.sh" 1> /dev/null
+	curl ${nocache} --connect-timeout 3 -IsfL "https://bitbucket.org/${githubuser}/${githubrepo}/raw/${githubbranch}/linuxgsm.sh" 1> /dev/null
 fi
 if [ $? != "0" ]; then
 	fn_print_fail_eol_nl
@@ -51,9 +58,9 @@ if [ $? != "0" ]; then
 fi
 
 if [ "${remotereponame}" == "GitHub" ]; then
-	tmp_script_diff=$(diff "${tmpdir}/linuxgsm.sh" <(curl --connect-timeout 3 -s "https://raw.githubusercontent.com/${githubuser}/${githubrepo}/${githubbranch}/linuxgsm.sh"))
+	tmp_script_diff=$(diff "${tmpdir}/linuxgsm.sh" <(curl ${nocache} --connect-timeout 3 -s "https://raw.githubusercontent.com/${githubuser}/${githubrepo}/${githubbranch}/linuxgsm.sh"))
 else
-	tmp_script_diff=$(diff "${tmpdir}/linuxgsm.sh" <(curl --connect-timeout 3 -s "https://bitbucket.org/${githubuser}/${githubrepo}/raw/${githubbranch}/linuxgsm.sh"))
+	tmp_script_diff=$(diff "${tmpdir}/linuxgsm.sh" <(curl ${nocache} --connect-timeout 3 -s "https://bitbucket.org/${githubuser}/${githubrepo}/raw/${githubbranch}/linuxgsm.sh"))
 fi
 
 if [ "${tmp_script_diff}" != "" ]; then
@@ -119,9 +126,9 @@ fi
 echo -en "checking ${remotereponame} config _default.cfg...\c"
 fn_script_log_info "Checking ${remotereponame} config _default.cfg"
 if [ "${remotereponame}" == "GitHub" ]; then
-	curl --connect-timeout 3 -IsfL "https://raw.githubusercontent.com/${githubuser}/${githubrepo}/${githubbranch}/lgsm/config-default/config-lgsm/${gameservername}/_default.cfg" 1> /dev/null
+	curl ${nocache} --connect-timeout 3 -IsfL "https://raw.githubusercontent.com/${githubuser}/${githubrepo}/${githubbranch}/lgsm/config-default/config-lgsm/${gameservername}/_default.cfg" 1> /dev/null
 else
-	curl --connect-timeout 3 -IsfL "https://bitbucket.org/${githubuser}/${githubrepo}/raw/${githubbranch}/lgsm/config-default/config-lgsm/${gameservername}/_default.cfg" 1> /dev/null
+	curl ${nocache} --connect-timeout 3 -IsfL "https://bitbucket.org/${githubuser}/${githubrepo}/raw/${githubbranch}/lgsm/config-default/config-lgsm/${gameservername}/_default.cfg" 1> /dev/null
 fi
 if [ $? != "0" ]; then
 	fn_print_fail_eol_nl
@@ -131,9 +138,9 @@ if [ $? != "0" ]; then
 fi
 
 if [ "${remotereponame}" == "GitHub" ]; then
-	config_file_diff=$(diff "${configdirdefault}/config-lgsm/${gameservername}/_default.cfg" <(curl --connect-timeout 3 -s "https://raw.githubusercontent.com/${githubuser}/${githubrepo}/${githubbranch}/lgsm/config-default/config-lgsm/${gameservername}/_default.cfg"))
+	config_file_diff=$(diff "${configdirdefault}/config-lgsm/${gameservername}/_default.cfg" <(curl ${nocache} --connect-timeout 3 -s "https://raw.githubusercontent.com/${githubuser}/${githubrepo}/${githubbranch}/lgsm/config-default/config-lgsm/${gameservername}/_default.cfg"))
 else
-	config_file_diff=$(diff "${configdirdefault}/config-lgsm/${gameservername}/_default.cfg" <(curl --connect-timeout 3 -s "https://bitbucket.org/${githubuser}/${githubrepo}/raw/${githubbranch}/lgsm/config-default/config-lgsm/${gameservername}/_default.cfg"))
+	config_file_diff=$(diff "${configdirdefault}/config-lgsm/${gameservername}/_default.cfg" <(curl ${nocache} --connect-timeout 3 -s "https://bitbucket.org/${githubuser}/${githubrepo}/raw/${githubbranch}/lgsm/config-default/config-lgsm/${gameservername}/_default.cfg"))
 fi
 
 if [ "${config_file_diff}" != "" ]; then
@@ -153,9 +160,9 @@ if [ -f "${datadir}/${distroid}-${distroversioncsv}.csv" ]; then
 	echo -en "checking ${remotereponame} config ${distroid}-${distroversioncsv}.csv...\c"
 	fn_script_log_info "Checking ${remotereponame} ${distroid}-${distroversioncsv}.csv"
 	if [ "${remotereponame}" == "GitHub" ]; then
-		curl --connect-timeout 3 -IsfL "https://raw.githubusercontent.com/${githubuser}/${githubrepo}/${githubbranch}/lgsm/data/${distroid}-${distroversioncsv}.csv" 1> /dev/null
+		curl ${nocache} --connect-timeout 3 -IsfL "https://raw.githubusercontent.com/${githubuser}/${githubrepo}/${githubbranch}/lgsm/data/${distroid}-${distroversioncsv}.csv" 1> /dev/null
 	else
-		curl --connect-timeout 3 -IsfL "https://bitbucket.org/${githubuser}/${githubrepo}/raw/${githubbranch}/lgsm/data/${distroid}-${distroversioncsv}.csv" 1> /dev/null
+		curl ${nocache} --connect-timeout 3 -IsfL "https://bitbucket.org/${githubuser}/${githubrepo}/raw/${githubbranch}/lgsm/data/${distroid}-${distroversioncsv}.csv" 1> /dev/null
 	fi
 	if [ $? != "0" ]; then
 		fn_print_fail_eol_nl
@@ -165,9 +172,9 @@ if [ -f "${datadir}/${distroid}-${distroversioncsv}.csv" ]; then
 	fi
 
 	if [ "${remotereponame}" == "GitHub" ]; then
-		config_file_diff=$(diff "${datadir}/${distroid}-${distroversioncsv}.csv" <(curl --connect-timeout 3 -s "https://raw.githubusercontent.com/${githubuser}/${githubrepo}/${githubbranch}/lgsm/data/${distroid}-${distroversioncsv}.csv"))
+		config_file_diff=$(diff "${datadir}/${distroid}-${distroversioncsv}.csv" <(curl ${nocache} --connect-timeout 3 -s "https://raw.githubusercontent.com/${githubuser}/${githubrepo}/${githubbranch}/lgsm/data/${distroid}-${distroversioncsv}.csv"))
 	else
-		config_file_diff=$(diff "${datadir}/${distroid}-${distroversioncsv}.csv" <(curl --connect-timeout 3 -s "https://bitbucket.org/${githubuser}/${githubrepo}/raw/${githubbranch}/lgsm/data/${distroid}-${distroversioncsv}.csv"))
+		config_file_diff=$(diff "${datadir}/${distroid}-${distroversioncsv}.csv" <(curl ${nocache} --connect-timeout 3 -s "https://bitbucket.org/${githubuser}/${githubrepo}/raw/${githubbranch}/lgsm/data/${distroid}-${distroversioncsv}.csv"))
 	fi
 
 	if [ "${config_file_diff}" != "" ]; then
@@ -191,9 +198,9 @@ if [ -n "${modulesdir}" ]; then
 				echo -en "checking ${remotereponame} module ${modulefile}...\c"
 				github_file_url_dir="lgsm/modules"
 				if [ "${remotereponame}" == "GitHub" ]; then
-					curl --connect-timeout 3 -IsfL "https://raw.githubusercontent.com/${githubuser}/${githubrepo}/${githubbranch}/${github_file_url_dir}/${modulefile}" 1> /dev/null
+					curl ${nocache} --connect-timeout 3 -IsfL "https://raw.githubusercontent.com/${githubuser}/${githubrepo}/${githubbranch}/${github_file_url_dir}/${modulefile}" 1> /dev/null
 				else
-					curl --connect-timeout 3 -IsfL "https://bitbucket.org/${githubuser}/${githubrepo}/raw/${githubbranch}/${github_file_url_dir}/${modulefile}" 1> /dev/null
+					curl ${nocache} --connect-timeout 3 -IsfL "https://bitbucket.org/${githubuser}/${githubrepo}/raw/${githubbranch}/${github_file_url_dir}/${modulefile}" 1> /dev/null
 				fi
 				if [ $? != 0 ]; then
 					fn_print_error_eol_nl
@@ -210,9 +217,9 @@ if [ -n "${modulesdir}" ]; then
 				else
 					# compare file
 					if [ "${remotereponame}" == "GitHub" ]; then
-						module_file_diff=$(diff "${modulesdir}/${modulefile}" <(curl --connect-timeout 3 -s "https://raw.githubusercontent.com/${githubuser}/${githubrepo}/${githubbranch}/${github_file_url_dir}/${modulefile}"))
+						module_file_diff=$(diff "${modulesdir}/${modulefile}" <(curl ${nocache} --connect-timeout 3 -s "https://raw.githubusercontent.com/${githubuser}/${githubrepo}/${githubbranch}/${github_file_url_dir}/${modulefile}"))
 					else
-						module_file_diff=$(diff "${modulesdir}/${modulefile}" <(curl --connect-timeout 3 -s "https://bitbucket.org/${githubuser}/${githubrepo}/raw/${githubbranch}/${github_file_url_dir}/${modulefile}"))
+						module_file_diff=$(diff "${modulesdir}/${modulefile}" <(curl ${nocache} --connect-timeout 3 -s "https://bitbucket.org/${githubuser}/${githubrepo}/raw/${githubbranch}/${github_file_url_dir}/${modulefile}"))
 					fi
 
 					# results

From 7ece812c8c7a97f1248148ab59526ab9f377830e Mon Sep 17 00:00:00 2001
From: Daniel Gibbs <me@danielgibbs.co.uk>
Date: Mon, 12 Aug 2024 23:04:48 +0100
Subject: [PATCH 121/154] refactor: refactor check_permissions.sh (#4626)

Refactored the code in check_permissions.sh to improve readability and maintainability. Made changes to variable names for clarity and removed unnecessary comments. Also, refactored the fn_sys_perm_errors_detect function name for consistency.
---
 lgsm/modules/check_permissions.sh | 29 +++++++++++++++++++----------
 1 file changed, 19 insertions(+), 10 deletions(-)

diff --git a/lgsm/modules/check_permissions.sh b/lgsm/modules/check_permissions.sh
index 31c64cd17..3ee404ba9 100644
--- a/lgsm/modules/check_permissions.sh
+++ b/lgsm/modules/check_permissions.sh
@@ -13,6 +13,11 @@ fn_check_ownership() {
 			selfownissue=1
 		fi
 	fi
+	if [ -d "${lgsmdir}" ]; then
+		if [ "$(find "${lgsmdir}" -not -user "$(whoami)" | wc -l)" -ne "0" ]; then
+			lgsmownissue=1
+		fi
+	fi
 	if [ -d "${modulesdir}" ]; then
 		if [ "$(find "${modulesdir}" -not -name '*.swp' -not -user "$(whoami)" | wc -l)" -ne "0" ]; then
 			funcownissue=1
@@ -23,18 +28,18 @@ fn_check_ownership() {
 			filesownissue=1
 		fi
 	fi
-	if [ "${selfownissue}" == "1" ] || [ "${funcownissue}" == "1" ] || [ "${filesownissue}" == "1" ]; then
+	if [ "${selfownissue}" == "1" ] || [ "${lgsmownissue}" == "1" ] || [ "${filesownissue}" == "1" ]; then
 		fn_print_fail_nl "Ownership issues found"
 		fn_script_log_fail "Ownership issues found"
 		fn_print_information_nl "The current user ($(whoami)) does not have ownership of the following files:"
 		fn_script_log_info "The current user ($(whoami)) does not have ownership of the following files:"
 		{
-			echo -e "User\tGroup\tFile\n"
+			echo -en "User\tGroup\tFile:"
 			if [ "${selfownissue}" == "1" ]; then
 				find "${rootdir}/${selfname}" -not -user "$(whoami)" -printf "%u\t%g\t%p\n"
 			fi
-			if [ "${funcownissue}" == "1" ]; then
-				find "${modulesdir}" -not -user "$(whoami)" -printf "%u\t%g\t%p\n"
+			if [ "${lgsmownissue}" == "1" ]; then
+				find "${lgsmdir}" -not -user "$(whoami)" -printf "%u\t%g\t%p\n"
 			fi
 			if [ "${filesownissue}" == "1" ]; then
 				find "${serverfiles}" -not -user "$(whoami)" -printf "%u\t%g\t%p\n"
@@ -53,15 +58,18 @@ fn_check_ownership() {
 }
 
 fn_check_permissions() {
+	# Check modules files are executable.
 	if [ -d "${modulesdir}" ]; then
-		if [ "$(find "${modulesdir}" -type f -not -executable | wc -l)" -ne "0" ]; then
+		findnotexecutable="$(find "${modulesdir}" -type f -not -executable)"
+		findnotexecutablewc="$(echo "${findnotexecutable}" | wc -l)"
+		if [ "${findnotexecutablewc}" -ne "0" ]; then
 			fn_print_fail_nl "Permissions issues found"
 			fn_script_log_fail "Permissions issues found"
 			fn_print_information_nl "The following files are not executable:"
 			fn_script_log_info "The following files are not executable:"
 			{
-				echo -e "File\n"
-				find "${modulesdir}" -type f -not -executable -printf "%p\n"
+				echo -en "File:"
+				echo -en "${findnotexecutable}"
 			} | column -s $'\t' -t | tee -a "${lgsmlog}"
 			if [ "${monitorflag}" == 1 ]; then
 				alert="permissions"
@@ -72,8 +80,8 @@ fn_check_permissions() {
 	fi
 
 	# Check rootdir permissions.
-	if [ "${rootdir}" ]; then
-		# Get permission numbers on directory under the form 775.
+	if [ -d "${rootdir}" ]; then
+		# Get permission numbers on directory should return 775.
 		rootdirperm=$(stat -c %a "${rootdir}")
 		# Grab the first and second digit for user and group permission.
 		userrootdirperm="${rootdirperm:0:1}"
@@ -92,6 +100,7 @@ fn_check_permissions() {
 			core_exit.sh
 		fi
 	fi
+
 	# Check if executable is executable and attempt to fix it.
 	# First get executable name.
 	execname=$(basename "${executable}")
@@ -141,7 +150,7 @@ fn_check_permissions() {
 	fi
 }
 
-## The following fn_sys_perm_* modules checks for permission errors in /sys directory.
+## The following fn_sys_perm_* function checks for permission errors in /sys directory.
 
 # Checks for permission errors in /sys directory.
 fn_sys_perm_errors_detect() {

From c8f36ff2afbc357335c309c61ddc473ecb6a6fdd Mon Sep 17 00:00:00 2001
From: Daniel Gibbs <me@danielgibbs.co.uk>
Date: Mon, 12 Aug 2024 23:06:35 +0100
Subject: [PATCH 122/154] add missing sm-icon.png

---
 lgsm/data/gameicons/sm-icon.png | Bin 0 -> 764 bytes
 1 file changed, 0 insertions(+), 0 deletions(-)
 create mode 100644 lgsm/data/gameicons/sm-icon.png

diff --git a/lgsm/data/gameicons/sm-icon.png b/lgsm/data/gameicons/sm-icon.png
new file mode 100644
index 0000000000000000000000000000000000000000..7948e002d650275f90ef0ef1ea5db87b14bbdb2c
GIT binary patch
literal 764
zcmex=<NpH&0WUXCHwH#VCI(d?WcYuZ!I^=Lg_Vt!g^i7sjh&s1gG+#mi<6T}gpZ#`
zKwLyZLR>^lOiET&UP@Y7ModgWM?qOlT~kX_QeM|USHnP6LsJ7}2qQZ?I~NC+Fc+7w
zhLo6;2Fc+60R}-11_cHMW=16jCP7AKLB{__7$g`Nm>C%vkO0uF>>NNDEdd55CMHH^
zW)?<Ph%_S;GYhMr5QDHHo1r7Sh^SJcQD9-wM35<r=%z3*F*C9NWn=|GETAmh24KiA
z3kk9)Iu`!F#lQoUU=m~&WUyy=TCun?)#H&{rA%vR;3m&+45f+gFaL#qnwp)OWSTTh
za#`6EOZ8086y=A1_^;pp#(sOzzd7rd+sjrweIk^SlGGU$#cw6?g<rKK;l%Cx6Zg$b
zUHdF;y{MLHk@=!cp;|XeCYTiEtXeT~YUSJ<rkWQMJY|b+W@l@^{uU`vyv#G@uVx<i
z=ffVgM+}dOEIcSzxk9o2c1mx(tiP3!werfa;6)r4+1CnlCjEZwn;r5lY(2Mm-6^-X
zcWXZ;o(<jc<KxB;CLBLqUweG?zG?A1WTwAZYt|me@ZXb;Otb!JYg)E#(}fh73)AXd
zj4JC7{aVl4bZp6`o2&0mdVhx_YEy%I^O5(}-(KEYdveo^-=7{92_~PJc%C6c*-vAM
zTr~g5ZS3c^@BP}9^r^hiY~N$)tgOu+HP5MOc}-kofAHn;Rko4ES4<5#bEeK~O$^yJ
zms3Rk%KYbXfBnwOY@H>awse6$&vxPS{hr>B*US)IlIh@af9Iy-Gm`F1KPWF}x^LOO
z#b;|>xhy@VoQ;gMeiZj`!usaT3*WArm{eR8aQsOE<C1BYR;`})ueXThKf~b*lHA`m
c374-s_xbeNqT<b$!yUsfHb-%N@c(}k06}~X;Q#;t

literal 0
HcmV?d00001


From f7116ca97f27b214152cfc2c21209ac36ba375e7 Mon Sep 17 00:00:00 2001
From: Daniel Gibbs <me@danielgibbs.co.uk>
Date: Tue, 13 Aug 2024 23:02:26 +0100
Subject: [PATCH 123/154] fix permissions bug

---
 lgsm/modules/check_permissions.sh | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/lgsm/modules/check_permissions.sh b/lgsm/modules/check_permissions.sh
index 3ee404ba9..d2cd5890c 100644
--- a/lgsm/modules/check_permissions.sh
+++ b/lgsm/modules/check_permissions.sh
@@ -61,7 +61,7 @@ fn_check_permissions() {
 	# Check modules files are executable.
 	if [ -d "${modulesdir}" ]; then
 		findnotexecutable="$(find "${modulesdir}" -type f -not -executable)"
-		findnotexecutablewc="$(echo "${findnotexecutable}" | wc -l)"
+		findnotexecutablewc="$(find "${modulesdir}" -type f -not -executable | wc -l)"
 		if [ "${findnotexecutablewc}" -ne "0" ]; then
 			fn_print_fail_nl "Permissions issues found"
 			fn_script_log_fail "Permissions issues found"

From eef84ba903da3a21b2a029636e3b758b8cd787ec Mon Sep 17 00:00:00 2001
From: Daniel Gibbs <me@danielgibbs.co.uk>
Date: Tue, 13 Aug 2024 23:17:34 +0100
Subject: [PATCH 124/154] feat: add ismygameserver.online to discord alerts

---
 lgsm/modules/alert_discord.sh | 5 +++++
 1 file changed, 5 insertions(+)

diff --git a/lgsm/modules/alert_discord.sh b/lgsm/modules/alert_discord.sh
index 2b2ecf21b..c98bef765 100644
--- a/lgsm/modules/alert_discord.sh
+++ b/lgsm/modules/alert_discord.sh
@@ -51,6 +51,11 @@ jsoninfo=$(
                     "name": "Hostname",
                     "value": "${HOSTNAME}",
                     "inline": true
+                },
+                {
+                    "name": "Is my Game Server Online?",
+                    "value": "https://ismygameserver.online/${querytype}/${alertip}:${queryport}",
+                    "inline": true
                 },
 				{
 					"name": "More info",

From ce27b7301b6701db1b082c120eaab0f93f033d32 Mon Sep 17 00:00:00 2001
From: Stephan Schaffner <chaos_bloated856@memehorst.de>
Date: Wed, 28 Aug 2024 22:32:38 +0200
Subject: [PATCH 125/154] feat(newserver): add Xonotic (#4633)

* Adding default_cfg and Distro Requirements

* Adding Shellscripts for Xonotic

* Fixing serverlist.csv

* Fixing again serverlist.csv

* Fixed Typo

* Changing Shortname to XNT

* Fixing missed _default.cfg change

* Fixing _default.cfg

* Updating Modules and Server installation

* Updating paths and install script

* Fixing install Scripts Issues

* Update info_game.sh

* Updating Game Info Curling

* fix bug with npm download of gamedig on branches

* styling fix

* move to fix

* typo

* bug

* add missing details

* edit using config

* add missing servercfgfullpath

* bug

* config settings update

* update cp command based off warn message

* fix dir

* update dirs

* fix exit code

* fix dir install

* remove -v

* update settings

* update info game

* update config type

* fix dir

* update config parsing

* change to remove config

* add server.cfg

* remove serverconfigdefault

* add new default

* move to use an updater

* send key to update function

* typo

* change extract location

* update directory location

* filename fix

* update dirs

* fix extraction

* creatre datadir if missing

* consoleinteract yes

* lint

---------

Co-authored-by: Stephan Schaffner <stephan.schaffner@check24.de>
Co-authored-by: Daniel Gibbs <me@danielgibbs.co.uk>
---
 .../config-lgsm/xntserver/_default.cfg        | 171 +++++++++++++++++
 lgsm/data/almalinux-8.csv                     |   1 +
 lgsm/data/almalinux-9.csv                     |   1 +
 lgsm/data/centos-7.csv                        |   1 +
 lgsm/data/centos-8.csv                        |   1 +
 lgsm/data/centos-9.csv                        |   1 +
 lgsm/data/debian-10.csv                       |   1 +
 lgsm/data/debian-11.csv                       |   1 +
 lgsm/data/debian-12.csv                       |   1 +
 lgsm/data/debian-13.csv                       |   1 +
 lgsm/data/debian-9.csv                        |   1 +
 lgsm/data/rhel-7.csv                          |   1 +
 lgsm/data/rhel-8.csv                          |   1 +
 lgsm/data/rhel-9.csv                          |   1 +
 lgsm/data/rocky-8.csv                         |   1 +
 lgsm/data/rocky-9.csv                         |   1 +
 lgsm/data/serverlist.csv                      |   1 +
 lgsm/data/ubuntu-16.04.csv                    |   1 +
 lgsm/data/ubuntu-18.04.csv                    |   1 +
 lgsm/data/ubuntu-20.04.csv                    |   1 +
 lgsm/data/ubuntu-22.04.csv                    |   1 +
 lgsm/data/ubuntu-23.04.csv                    |   1 +
 lgsm/data/ubuntu-23.10.csv                    |   1 +
 lgsm/data/ubuntu-24.04.csv                    |   1 +
 lgsm/modules/check_gamedig.sh                 |   4 +-
 lgsm/modules/command_update.sh                |   2 +
 lgsm/modules/core_dl.sh                       |   5 +-
 lgsm/modules/core_modules.sh                  |  15 ++
 lgsm/modules/fix.sh                           |   2 +-
 lgsm/modules/fix_xnt.sh                       |  13 ++
 lgsm/modules/info_game.sh                     |  19 ++
 lgsm/modules/info_messages.sh                 |  14 +-
 lgsm/modules/install_config.sh                |  30 ++-
 lgsm/modules/install_server_files.sh          |  86 ++++++---
 lgsm/modules/update_xnt.sh                    | 173 ++++++++++++++++++
 35 files changed, 515 insertions(+), 42 deletions(-)
 create mode 100644 lgsm/config-default/config-lgsm/xntserver/_default.cfg
 create mode 100644 lgsm/modules/fix_xnt.sh
 create mode 100644 lgsm/modules/update_xnt.sh

diff --git a/lgsm/config-default/config-lgsm/xntserver/_default.cfg b/lgsm/config-default/config-lgsm/xntserver/_default.cfg
new file mode 100644
index 000000000..402e6188f
--- /dev/null
+++ b/lgsm/config-default/config-lgsm/xntserver/_default.cfg
@@ -0,0 +1,171 @@
+##################################
+######## Default Settings ########
+##################################
+# DO NOT EDIT, ANY CHANGES WILL BE OVERWRITTEN!
+# Copy settings from here and use them in either:
+# common.cfg - applies settings to every instance.
+# [instance].cfg - applies settings to a specific instance.
+
+#### Game Server Settings ####
+
+## Predefined Parameters | https://docs.linuxgsm.com/configuration/start-parameters
+
+## Server Parameters | https://docs.linuxgsm.com/configuration/start-parameters#additional-parameters
+startparameters="-userdir ${systemdir}/${selfname}"
+
+#### LinuxGSM Settings ####
+
+## LinuxGSM Stats
+# Send useful stats to LinuxGSM developers.
+# https://docs.linuxgsm.com/configuration/linuxgsm-stats
+# (on|off)
+stats="off"
+
+## Notification Alerts
+# (on|off)
+
+# Display IP | https://docs.linuxgsm.com/alerts#display-ip
+displayip=""
+
+# More info | https://docs.linuxgsm.com/alerts#more-info
+postalert="off"
+
+# Alert on Start/Stop/Restart
+statusalert="off"
+
+# Discord Alerts | https://docs.linuxgsm.com/alerts/discord
+discordalert="off"
+discordwebhook="webhook"
+
+# Email Alerts | https://docs.linuxgsm.com/alerts/email
+emailalert="off"
+email="email@example.com"
+emailfrom=""
+
+# Gotify Alerts | https://docs.linuxgsm.com/alerts/gotify
+gotifyalert="off"
+gotifytoken="token"
+gotifywebhook="webhook"
+
+# IFTTT Alerts | https://docs.linuxgsm.com/alerts/ifttt
+iftttalert="off"
+ifttttoken="accesstoken"
+iftttevent="linuxgsm_alert"
+
+# Pushbullet Alerts | https://docs.linuxgsm.com/alerts/pushbullet
+pushbulletalert="off"
+pushbullettoken="accesstoken"
+channeltag=""
+
+# Pushover Alerts | https://docs.linuxgsm.com/alerts/pushover
+pushoveralert="off"
+pushovertoken="accesstoken"
+pushoveruserkey="userkey"
+
+# Rocket.Chat Alerts | https://docs.linuxgsm.com/alerts/rocket.chat
+rocketchatalert="off"
+rocketchatwebhook="webhook"
+
+# Slack Alerts | https://docs.linuxgsm.com/alerts/slack
+slackalert="off"
+slackwebhook="webhook"
+
+# Telegram Alerts | https://docs.linuxgsm.com/alerts/telegram
+# You can add a custom cURL string eg proxy (useful in Russia) in "curlcustomstring".
+# For example "--socks5 ipaddr:port" for socks5 proxy see more in "curl --help all".
+telegramapi="api.telegram.org"
+telegramalert="off"
+telegramtoken="accesstoken"
+telegramchatid=""
+telegramthreadid=""
+telegramsilentnotification="false"
+curlcustomstring=""
+
+## Backup | https://docs.linuxgsm.com/commands/backup
+maxbackups="4"
+maxbackupdays="30"
+stoponbackup="on"
+
+## Logging | https://docs.linuxgsm.com/features/logging
+consolelogging="on"
+logdays="7"
+
+## Monitor | https://docs.linuxgsm.com/commands/monitor
+# Query delay time
+querydelay="1"
+
+## ANSI Colors | https://docs.linuxgsm.com/features/ansi-colors
+ansi="on"
+
+#### Advanced Settings ####
+
+## Message Display Time | https://docs.linuxgsm.com/features/message-display-time
+sleeptime="0.5"
+
+## Stop Mode | https://docs.linuxgsm.com/features/stop-mode
+# 1: tmux kill
+# 2: CTRL+c
+# 3: quit
+# 4: quit 120s
+# 5: stop
+# 6: q
+# 7: exit
+# 8: 7 Days to Die
+# 9: GoldSrc
+# 10: Avorion
+# 11: end
+stopmode="2"
+
+## Query mode
+# 1: session only
+# 2: gamedig (gsquery fallback)
+# 3: gamedig
+# 4: gsquery
+# 5: tcp
+querymode="3"
+querytype="xonotic"
+
+## Console type
+consoleverbose="yes"
+consoleinteract="yes"
+
+## Game Server Details
+# Do not edit
+gamename="Xonotic"
+engine="unreal3"
+glibc="2.29"
+
+#### Directories ####
+# Edit with care
+
+## Game Server Directories
+systemdir="${serverfiles}"
+executabledir="${systemdir}"
+executable="./xonotic-linux64-dedicated"
+servercfgdir="${systemdir}/${selfname}/data"
+servercfg="server.cfg"
+servercfgdefault="${systemdir}/server.cfg"
+servercfgfullpath="${servercfgdir}/${servercfg}"
+
+## Backup Directory
+backupdir="${lgsmdir}/backup"
+
+## Logging Directories
+[ -n "${LGSM_LOGDIR}" ] && logdir="${LGSM_LOGDIR}" || logdir="${rootdir}/log"
+gamelogdir="${logdir}/server"
+lgsmlogdir="${logdir}/script"
+consolelogdir="${logdir}/console"
+gamelog="${gamelogdir}/${selfname}-game.log"
+lgsmlog="${lgsmlogdir}/${selfname}-script.log"
+consolelog="${consolelogdir}/${selfname}-console.log"
+alertlog="${lgsmlogdir}/${selfname}-alert.log"
+postdetailslog="${lgsmlogdir}/${selfname}-postdetails.log"
+
+## Logs Naming
+lgsmlogdate="${lgsmlogdir}/${selfname}-script-$(date '+%Y-%m-%d-%H:%M:%S').log"
+consolelogdate="${consolelogdir}/${selfname}-console-$(date '+%Y-%m-%d-%H:%M:%S').log"
+gamelogdate="${gamelogdir}/${selfname}-game-$(date '+%Y-%m-%d-%H:%M:%S').log"
+
+## Log Parameters
+logtimestamp="off"
+logtimestampformat="%Y-%m-%d %H:%M:%S"
diff --git a/lgsm/data/almalinux-8.csv b/lgsm/data/almalinux-8.csv
index 204242144..d4d2456bd 100644
--- a/lgsm/data/almalinux-8.csv
+++ b/lgsm/data/almalinux-8.csv
@@ -134,5 +134,6 @@ wet
 wf
 wmc,java-21-openjdk
 wurm,xorg-x11-server-Xvfb
+xnt
 zmr,ncurses-libs.i686
 zps,ncurses-libs.i686
diff --git a/lgsm/data/almalinux-9.csv b/lgsm/data/almalinux-9.csv
index 02f21426c..7dae6338e 100644
--- a/lgsm/data/almalinux-9.csv
+++ b/lgsm/data/almalinux-9.csv
@@ -134,5 +134,6 @@ wet
 wf
 wmc,java-21-openjdk
 wurm,xorg-x11-server-Xvfb
+xnt
 zmr,ncurses-libs.i686
 zps,ncurses-libs.i686
diff --git a/lgsm/data/centos-7.csv b/lgsm/data/centos-7.csv
index a536c9c0f..266b358ba 100644
--- a/lgsm/data/centos-7.csv
+++ b/lgsm/data/centos-7.csv
@@ -134,5 +134,6 @@ wet
 wf
 wmc,java-11-openjdk
 wurm,xorg-x11-server-Xvfb
+xnt
 zmr,ncurses-libs.i686
 zps,ncurses-libs.i686
diff --git a/lgsm/data/centos-8.csv b/lgsm/data/centos-8.csv
index d4d008fd4..bd5b72c33 100644
--- a/lgsm/data/centos-8.csv
+++ b/lgsm/data/centos-8.csv
@@ -134,5 +134,6 @@ wet
 wf
 wmc,java-17-openjdk
 wurm,xorg-x11-server-Xvfb
+xnt
 zmr,ncurses-libs.i686
 zps,ncurses-libs.i686
diff --git a/lgsm/data/centos-9.csv b/lgsm/data/centos-9.csv
index 574401733..893f3698c 100644
--- a/lgsm/data/centos-9.csv
+++ b/lgsm/data/centos-9.csv
@@ -134,5 +134,6 @@ wet
 wf
 wmc,java-17-openjdk
 wurm,xorg-x11-server-Xvfb
+xnt
 zmr,ncurses-libs.i686
 zps,ncurses-libs.i686
diff --git a/lgsm/data/debian-10.csv b/lgsm/data/debian-10.csv
index 6b1a843bb..6bfa1dae4 100644
--- a/lgsm/data/debian-10.csv
+++ b/lgsm/data/debian-10.csv
@@ -134,5 +134,6 @@ wet
 wf
 wmc,openjdk-11-jre
 wurm,xvfb
+xnt
 zmr,libtinfo5:i386
 zps,libtinfo5:i386
diff --git a/lgsm/data/debian-11.csv b/lgsm/data/debian-11.csv
index 60a46f55d..5441a69b4 100644
--- a/lgsm/data/debian-11.csv
+++ b/lgsm/data/debian-11.csv
@@ -134,5 +134,6 @@ wet
 wf
 wmc,openjdk-17-jre
 wurm,xvfb
+xnt
 zmr,libtinfo5:i386
 zps,libtinfo5:i386
diff --git a/lgsm/data/debian-12.csv b/lgsm/data/debian-12.csv
index 0fd50f2d7..1c0a39930 100644
--- a/lgsm/data/debian-12.csv
+++ b/lgsm/data/debian-12.csv
@@ -134,5 +134,6 @@ wet
 wf
 wmc,openjdk-17-jre
 wurm,xvfb
+xnt
 zmr,libtinfo5:i386
 zps,libtinfo5:i386
diff --git a/lgsm/data/debian-13.csv b/lgsm/data/debian-13.csv
index 6d16deb9f..af262abb6 100644
--- a/lgsm/data/debian-13.csv
+++ b/lgsm/data/debian-13.csv
@@ -133,5 +133,6 @@ wet
 wf
 wmc,openjdk21-jre
 wurm,xvfb
+xnt
 zmr,libtinfo5:i386
 zps,libtinfo5:i386
diff --git a/lgsm/data/debian-9.csv b/lgsm/data/debian-9.csv
index 174bd8e16..4e54ac241 100644
--- a/lgsm/data/debian-9.csv
+++ b/lgsm/data/debian-9.csv
@@ -134,5 +134,6 @@ wet
 wf
 wmc,openjdk-8-jre
 wurm,xvfb
+xnt
 zmr,libtinfo5:i386
 zps,libtinfo5:i386
diff --git a/lgsm/data/rhel-7.csv b/lgsm/data/rhel-7.csv
index 8854649ad..7800136bb 100644
--- a/lgsm/data/rhel-7.csv
+++ b/lgsm/data/rhel-7.csv
@@ -134,5 +134,6 @@ wet
 wf
 wmc,java-11-openjdk
 wurm,xorg-x11-server-Xvfb
+xnt
 zmr,ncurses-libs.i686
 zps,ncurses-libs.i686
diff --git a/lgsm/data/rhel-8.csv b/lgsm/data/rhel-8.csv
index 7dd334f38..f8bb1d492 100644
--- a/lgsm/data/rhel-8.csv
+++ b/lgsm/data/rhel-8.csv
@@ -134,5 +134,6 @@ wet
 wf
 wmc,java-21-openjdk
 wurm,xorg-x11-server-Xvfb
+xnt
 zmr,ncurses-libs.i686
 zps,ncurses-libs.i686
diff --git a/lgsm/data/rhel-9.csv b/lgsm/data/rhel-9.csv
index 02f21426c..7dae6338e 100644
--- a/lgsm/data/rhel-9.csv
+++ b/lgsm/data/rhel-9.csv
@@ -134,5 +134,6 @@ wet
 wf
 wmc,java-21-openjdk
 wurm,xorg-x11-server-Xvfb
+xnt
 zmr,ncurses-libs.i686
 zps,ncurses-libs.i686
diff --git a/lgsm/data/rocky-8.csv b/lgsm/data/rocky-8.csv
index 7dd334f38..f8bb1d492 100644
--- a/lgsm/data/rocky-8.csv
+++ b/lgsm/data/rocky-8.csv
@@ -134,5 +134,6 @@ wet
 wf
 wmc,java-21-openjdk
 wurm,xorg-x11-server-Xvfb
+xnt
 zmr,ncurses-libs.i686
 zps,ncurses-libs.i686
diff --git a/lgsm/data/rocky-9.csv b/lgsm/data/rocky-9.csv
index 02f21426c..7dae6338e 100644
--- a/lgsm/data/rocky-9.csv
+++ b/lgsm/data/rocky-9.csv
@@ -134,5 +134,6 @@ wet
 wf
 wmc,java-21-openjdk
 wurm,xorg-x11-server-Xvfb
+xnt
 zmr,ncurses-libs.i686
 zps,ncurses-libs.i686
diff --git a/lgsm/data/serverlist.csv b/lgsm/data/serverlist.csv
index 7d2173321..8b408f84f 100644
--- a/lgsm/data/serverlist.csv
+++ b/lgsm/data/serverlist.csv
@@ -133,5 +133,6 @@ wet,wetserver,Wolfenstein: Enemy Territory,ubuntu-22.04
 wf,wfserver,Warfork,ubuntu-22.04
 wmc,wmcserver,WaterfallMC,ubuntu-22.04
 wurm,wurmserver,Wurm Unlimited,ubuntu-22.04
+xnt,xntserver,Xonotic,ubuntu-22.04
 zmr,zmrserver,Zombie Master: Reborn,ubuntu-22.04
 zps,zpsserver,Zombie Panic! Source,ubuntu-22.04
diff --git a/lgsm/data/ubuntu-16.04.csv b/lgsm/data/ubuntu-16.04.csv
index 1f359ab9d..51f769c1a 100644
--- a/lgsm/data/ubuntu-16.04.csv
+++ b/lgsm/data/ubuntu-16.04.csv
@@ -134,5 +134,6 @@ wet
 wf
 wmc,openjdk-8-jre
 wurm,xvfb
+xnt
 zmr,libtinfo5:i386
 zps,libtinfo5:i386
diff --git a/lgsm/data/ubuntu-18.04.csv b/lgsm/data/ubuntu-18.04.csv
index cccd53dc7..7ca2d86c6 100644
--- a/lgsm/data/ubuntu-18.04.csv
+++ b/lgsm/data/ubuntu-18.04.csv
@@ -134,5 +134,6 @@ wet
 wf
 wmc,openjdk-11-jre
 wurm,xvfb
+xnt
 zmr,libtinfo5:i386
 zps,libtinfo5:i386
diff --git a/lgsm/data/ubuntu-20.04.csv b/lgsm/data/ubuntu-20.04.csv
index 4c0cae0a8..f16d8b3be 100644
--- a/lgsm/data/ubuntu-20.04.csv
+++ b/lgsm/data/ubuntu-20.04.csv
@@ -134,5 +134,6 @@ wet
 wf
 wmc,openjdk-21-jre
 wurm,xvfb
+xnt
 zmr,libtinfo5:i386
 zps,libtinfo5:i386
diff --git a/lgsm/data/ubuntu-22.04.csv b/lgsm/data/ubuntu-22.04.csv
index b0f896fae..e84f4dddd 100644
--- a/lgsm/data/ubuntu-22.04.csv
+++ b/lgsm/data/ubuntu-22.04.csv
@@ -134,5 +134,6 @@ wet
 wf
 wmc,openjdk-21-jre
 wurm,xvfb
+xnt
 zmr,libtinfo5:i386
 zps,libtinfo5:i386
diff --git a/lgsm/data/ubuntu-23.04.csv b/lgsm/data/ubuntu-23.04.csv
index 7ad90039b..c0135abd7 100644
--- a/lgsm/data/ubuntu-23.04.csv
+++ b/lgsm/data/ubuntu-23.04.csv
@@ -134,5 +134,6 @@ wet
 wf
 wmc,openjdk-21-jre
 wurm,xvfb
+xnt
 zmr,libtinfo5:i386
 zps,libtinfo5:i386
diff --git a/lgsm/data/ubuntu-23.10.csv b/lgsm/data/ubuntu-23.10.csv
index 7ad90039b..c0135abd7 100644
--- a/lgsm/data/ubuntu-23.10.csv
+++ b/lgsm/data/ubuntu-23.10.csv
@@ -134,5 +134,6 @@ wet
 wf
 wmc,openjdk-21-jre
 wurm,xvfb
+xnt
 zmr,libtinfo5:i386
 zps,libtinfo5:i386
diff --git a/lgsm/data/ubuntu-24.04.csv b/lgsm/data/ubuntu-24.04.csv
index 7ad90039b..c0135abd7 100644
--- a/lgsm/data/ubuntu-24.04.csv
+++ b/lgsm/data/ubuntu-24.04.csv
@@ -134,5 +134,6 @@ wet
 wf
 wmc,openjdk-21-jre
 wurm,xvfb
+xnt
 zmr,libtinfo5:i386
 zps,libtinfo5:i386
diff --git a/lgsm/modules/check_gamedig.sh b/lgsm/modules/check_gamedig.sh
index 8abc0b759..61149d567 100644
--- a/lgsm/modules/check_gamedig.sh
+++ b/lgsm/modules/check_gamedig.sh
@@ -10,10 +10,10 @@ if [ "$(command -v node)" ] && [ "$(node -v | cut -d 'v' -f 2 | cut -d '.' -f 1)
 	echo -e "${bold}${lightyellow}Installing Gamedig${default}"
 	fn_script_log_info "Installing Gamedig"
 	cd "${lgsmdir}" || exit
-	curl -L -o package.json "https://raw.githubusercontent.com/GameServerManagers/LinuxGSM/${githubbranch}/package.json"
+	curl -L -o package.json "https://raw.githubusercontent.com/${githubuser}/${githubrepo}/${githubbranch}/package.json"
 	npm install
 elif [ "$(command -v node)" ] && [ "$(node -v | cut -d 'v' -f 2 | cut -d '.' -f 1)" -ge 16 ]; then
 	cd "${lgsmdir}" || exit
-	curl -s -L -o package.json "https://raw.githubusercontent.com/GameServerManagers/LinuxGSM/${githubbranch}/package.json"
+	curl -s -L -o package.json "https://raw.githubusercontent.com/${githubuser}/${githubrepo}/${githubbranch}/package.json"
 	npm update > /dev/null 2>&1
 fi
diff --git a/lgsm/modules/command_update.sh b/lgsm/modules/command_update.sh
index e1fcec97f..a579cfe8e 100644
--- a/lgsm/modules/command_update.sh
+++ b/lgsm/modules/command_update.sh
@@ -33,6 +33,8 @@ elif [ "${shortname}" == "vints" ]; then
 	update_vints.sh
 elif [ "${shortname}" == "ut99" ]; then
 	update_ut99.sh
+elif [ "${shortname}" == "xnt" ]; then
+	update_xnt.sh
 else
 	update_steamcmd.sh
 fi
diff --git a/lgsm/modules/core_dl.sh b/lgsm/modules/core_dl.sh
index 89a63eb8b..908c90f38 100644
--- a/lgsm/modules/core_dl.sh
+++ b/lgsm/modules/core_dl.sh
@@ -251,7 +251,10 @@ fn_dl_extract() {
 		fi
 	elif [ "${mime}" == "application/zip" ]; then
 		if [ -n "${extractsrc}" ]; then
-			extractcmd=$(unzip -qoj -d "${extractdest}" "${local_filedir}/${local_filename}" "${extractsrc}"/*)
+			temp_extractdir="${tmpdir}/Xonotic"
+			extractcmd=$(unzip -qo "${local_filedir}/${local_filename}" "${extractsrc}/*" -d "${temp_extractdir}")
+			find "${temp_extractdir}/${extractsrc}" -mindepth 1 -maxdepth 1 -exec mv -t "${extractdest}" {} +
+			rm -rf "${temp_extractdir}"
 		else
 			extractcmd=$(unzip -qo -d "${extractdest}" "${local_filedir}/${local_filename}")
 		fi
diff --git a/lgsm/modules/core_modules.sh b/lgsm/modules/core_modules.sh
index 3cf0cd8e6..dad8dddf5 100644
--- a/lgsm/modules/core_modules.sh
+++ b/lgsm/modules/core_modules.sh
@@ -531,6 +531,11 @@ fix_wurm.sh() {
 	fn_fetch_module
 }
 
+fix_xnt.sh() {
+	modulefile="${FUNCNAME[0]}"
+	fn_fetch_module
+}
+
 fix_zmr.sh() {
 	modulefile="${FUNCNAME[0]}"
 	fn_fetch_module
@@ -695,6 +700,11 @@ update_ut99.sh() {
 	fn_fetch_module
 }
 
+update_xnt.sh() {
+	modulefile="${FUNCNAME[0]}"
+	fn_fetch_module
+}
+
 fn_update_modules.sh() {
 	modulefile="${FUNCNAME[0]}"
 	fn_fetch_module
@@ -821,6 +831,11 @@ if [ ! -d "${lockdir}" ]; then
 	mkdir -p "${lockdir}"
 fi
 
+# Creates data dir if missing
+if [ ! -d "${datadir}" ]; then
+	mkdir -p "${datadir}"
+fi
+
 # if $USER id missing set to whoami
 if [ -z "${USER}" ]; then
 	USER="$(whoami)"
diff --git a/lgsm/modules/fix.sh b/lgsm/modules/fix.sh
index e6e00465d..6335659f1 100644
--- a/lgsm/modules/fix.sh
+++ b/lgsm/modules/fix.sh
@@ -52,7 +52,7 @@ fn_apply_fix() {
 	fi
 }
 
-apply_pre_start_fix=(arma3 armar ark av bt bo csgo cmw dst hw ins kf nmrih onset pvr ro rust rw samp sdtd sfc sm sof2 squad st tf2 terraria ts3 mcb mta unt vh wurm zmr)
+apply_pre_start_fix=(arma3 armar ark av bt bo csgo cmw dst hw ins kf nmrih onset pvr ro rust rw samp sdtd sfc sm sof2 squad st tf2 terraria ts3 mcb mta unt vh wurm xnt zmr)
 apply_post_install_fix=(av kf kf2 ro ut2k4 ut ut3)
 
 # validate registered fixes for safe development
diff --git a/lgsm/modules/fix_xnt.sh b/lgsm/modules/fix_xnt.sh
new file mode 100644
index 000000000..218b99a66
--- /dev/null
+++ b/lgsm/modules/fix_xnt.sh
@@ -0,0 +1,13 @@
+#!/bin/bash
+# LinuxGSM fix_xnt.sh module
+# Author: Daniel Gibbs
+# Contributors: http://linuxgsm.com/contrib
+# Website: https://linuxgsm.com
+# Description: Install Xonotic Default Config
+
+moduleselfname="$(basename "$(readlink -f "${BASH_SOURCE[0]}")")"
+
+# Create the directory if it doesn't exist
+if [ ! -d "${systemdir}/${selfname}/data" ]; then
+	mkdir -p "${systemdir}/${selfname}/data"
+fi
diff --git a/lgsm/modules/info_game.sh b/lgsm/modules/info_game.sh
index 0f38ea250..d56d4fbff 100644
--- a/lgsm/modules/info_game.sh
+++ b/lgsm/modules/info_game.sh
@@ -2242,6 +2242,23 @@ fn_info_game_wf() {
 	servername="${servername:-"NOT SET"}"
 }
 
+# Config Type: QuakeC
+# Comment: //
+# Filetype: cfg
+fn_info_game_xnt() {
+	if [ -f "${servercfgfullpath}" ]; then
+		fn_info_game_keyvalue_pairs_space "maxplayers" "maxplayers"
+		fn_info_game_keyvalue_pairs_space "port" "port"
+		fn_info_game_keyvalue_pairs_space "rconpassword" "rcon_password"
+		fn_info_game_keyvalue_pairs_space "servername" "hostname"
+	fi
+	maxplayers="${maxplayers:-"8"}"
+	port="${port:-"0"}"
+	queryport="${port}"
+	rconpassword="${rconpassword:-"NOT SET"}"
+	servername="${servername:-"NOT SET"}"
+}
+
 fn_info_game_wmc() {
 	if [ ! -f "${servercfgfullpath}" ]; then
 		servername="${unavailable}"
@@ -2476,6 +2493,8 @@ elif [ "${engine}" == "source" ] || [ "${engine}" == "goldsrc" ]; then
 	fn_info_game_source
 elif [ "${engine}" == "unreal2" ]; then
 	fn_info_game_unreal2
+elif [ "${shortname}" == "xnt" ]; then
+	fn_info_game_xnt
 fi
 
 # Public IP address
diff --git a/lgsm/modules/info_messages.sh b/lgsm/modules/info_messages.sh
index 9bab0cbb7..0bc444e5e 100644
--- a/lgsm/modules/info_messages.sh
+++ b/lgsm/modules/info_messages.sh
@@ -668,7 +668,7 @@ fn_info_messages_ports_edit() {
 
 	startparameterslocation="${red}UNKNOWN${default}"
 	# engines/games that require editing in the config file.
-	local ports_edit_array=("ac" "arma3" "armar" "bo" "bt" "ct" "dst" "eco" "idtech2" "idtech3" "idtech3_ql" "jc2" "jc3" "lwjgl2" "mcb" "nec" "pc" "pc2" "prism3d" "pz" "qw" "refractor" "renderware" "rw" "sb" "sdtd" "st" "stn" "ts3" "tw" "terraria" "unreal" "unreal2" "unreal3" "vints" "wurm")
+	local ports_edit_array=("ac" "arma3" "armar" "bo" "bt" "ct" "dst" "eco" "idtech2" "idtech3" "idtech3_ql" "jc2" "jc3" "lwjgl2" "mcb" "nec" "pc" "pc2" "prism3d" "pz" "qw" "refractor" "renderware" "rw" "sb" "sdtd" "st" "stn" "ts3" "tw" "terraria" "unreal" "unreal2" "unreal3" "vints" "xnt" "wurm")
 	for port_edit in "${ports_edit_array[@]}"; do
 		if [ "${shortname}" == "ut3" ]; then
 			startparameterslocation="${servercfgdir}/UTWeb.ini"
@@ -1548,6 +1548,14 @@ fn_info_messages_st() {
 	} | column -s $'\t' -t
 }
 
+fn_info_messages_stn() {
+	{
+		fn_port "header"
+		fn_port "Game" port udp
+		fn_port "Query" queryport udp
+	} | column -s $'\t' -t
+}
+
 fn_info_messages_ti() {
 	{
 		fn_port "header"
@@ -1728,7 +1736,7 @@ fn_info_messages_wurm() {
 	} | column -s $'\t' -t
 }
 
-fn_info_messages_stn() {
+fn_info_messages_xnt() {
 	{
 		fn_port "header"
 		fn_port "Game" port udp
@@ -1914,6 +1922,8 @@ fn_info_messages_select_engine() {
 		fn_info_messages_wf
 	elif [ "${shortname}" == "wurm" ]; then
 		fn_info_messages_wurm
+	elif [ "${shortname}" == "xnt" ]; then
+		fn_info_messages_xnt
 	elif [ "${engine}" == "goldsrc" ]; then
 		fn_info_messages_goldsrc
 	elif [ "${engine}" == "prism3d" ]; then
diff --git a/lgsm/modules/install_config.sh b/lgsm/modules/install_config.sh
index 22843c7b0..96ae70654 100644
--- a/lgsm/modules/install_config.sh
+++ b/lgsm/modules/install_config.sh
@@ -41,15 +41,15 @@ fn_default_config_remote() {
 		fn_script_log_info "Copying ${servercfg} config file."
 		if [ "${config}" == "${servercfgdefault}" ]; then
 			mkdir -p "${servercfgdir}"
-			cp -nv "${lgsmdir}/config-default/config-game/${config}" "${servercfgfullpath}"
+			cp -v --update=none "${lgsmdir}/config-default/config-game/${config}" "${servercfgfullpath}"
 		elif [ "${shortname}" == "arma3" ] && [ "${config}" == "${networkcfgdefault}" ]; then
 			mkdir -p "${servercfgdir}"
-			cp -nv "${lgsmdir}/config-default/config-game/${config}" "${networkcfgfullpath}"
+			cp -v --update=none "${lgsmdir}/config-default/config-game/${config}" "${networkcfgfullpath}"
 		elif [ "${shortname}" == "dst" ] && [ "${config}" == "${clustercfgdefault}" ]; then
-			cp -nv "${lgsmdir}/config-default/config-game/${clustercfgdefault}" "${clustercfgfullpath}"
+			cp -v --update=none "${lgsmdir}/config-default/config-game/${clustercfgdefault}" "${clustercfgfullpath}"
 		else
 			mkdir -p "${servercfgdir}"
-			cp -nv "${lgsmdir}/config-default/config-game/${config}" "${servercfgdir}/${config}"
+			cp -v --update=none "${lgsmdir}/config-default/config-game/${config}" "${servercfgdir}/${config}"
 		fi
 	done
 	fn_sleep_time
@@ -62,14 +62,21 @@ fn_default_config_local() {
 	fn_messages_separator
 	echo -e "Copying default configs."
 	fn_check_cfgdir
-	echo -en "copying config file [ ${italic}${servercfgdefault}${default} ]"
-	cp -n "${servercfgdir}/${servercfgdefault}" "${servercfgfullpath}"
+
+	# Check if the directory for ${servercfgfullpath} exists, if not, create it
+	if [ ! -d "$(dirname "${servercfgfullpath}")" ]; then
+		mkdir -p "$(dirname "${servercfgfullpath}")"
+	fi
+
+	echo -en "copying config file [ ${italic}${servercfgdefault}${default} ]: "
+	cp --update=none "${servercfgdir}/${servercfgdefault}" "${servercfgfullpath}"
+	exitcode=$?
 	if [ "${exitcode}" != 0 ]; then
 		fn_print_fail_eol
-		fn_script_log_fail "copying config file [ ${servercfgdefault} ]"
+		fn_script_log_fail "copying config file [ ${servercfgdefault} ]: "
 	else
 		fn_print_ok_eol
-		fn_script_log_pass "copying config file [ ${servercfgdefault} ]"
+		fn_script_log_pass "copying config file [ ${servercfgdefault} ]: "
 	fi
 }
 
@@ -835,6 +842,13 @@ elif [ "${shortname}" == "wmc" ]; then
 	fn_fetch_default_config
 	fn_default_config_remote
 	fn_set_config_vars
+	fn_list_config_locations
+elif [ "${shortname}" == "xnt" ]; then
+	array_configs+=(server.cfg)
+	fn_fetch_default_config
+	fn_default_config_remote
+	fn_set_config_vars
+	fn_list_config_locations
 elif [ "${shortname}" == "wurm" ]; then
 	array_configs+=(server.cfg)
 	fn_fetch_default_config
diff --git a/lgsm/modules/install_server_files.sh b/lgsm/modules/install_server_files.sh
index 7ebac259f..57ce58ca7 100644
--- a/lgsm/modules/install_server_files.sh
+++ b/lgsm/modules/install_server_files.sh
@@ -12,196 +12,224 @@ fn_install_server_files() {
 		remote_fileurl="http://linuxgsm.download/ActionHalfLife/action_halflife-1.0.tar.xz"
 		local_filedir="${tmpdir}"
 		local_filename="action_halflife-1.0.tar.xz"
-		chmodx="nochmodx" run="norun"
+		chmodx="nochmodx"
+		run="norun"
 		force="noforce"
 		md5="61d7b79fd714888b6d65944fdaafa94a"
 	elif [ "${shortname}" == "bf1942" ]; then
 		remote_fileurl="http://linuxgsm.download/BattleField1942/bf1942_lnxded-1.61-hacked-to-1.612.full.tar.xz"
 		local_filedir="${tmpdir}"
 		local_filename="bf1942_lnxded-1.61-hacked-to-1.612.full.tar.xz"
-		chmodx="nochmodx" run="norun"
+		chmodx="nochmodx"
+		run="norun"
 		force="noforce"
 		md5="4223bf4ed85f5162c24b2cba51249b9e"
 	elif [ "${shortname}" == "bfv" ]; then
 		remote_fileurl="http://linuxgsm.download/BattlefieldVietnam/bfv_linded-v1.21-20041207_patch.tar.xz"
 		local_filedir="${tmpdir}"
 		local_filename="bfv_linded-v1.21-20041207_patch.tar.xz"
-		chmodx="nochmodx" run="norun"
+		chmodx="nochmodx"
+		run="norun"
 		force="noforce"
 		md5="e3b4962cdd9d41e23c6fed65101bccde"
 	elif [ "${shortname}" == "bb" ]; then
 		remote_fileurl="http://linuxgsm.download/BrainBread/brainbread-v1.2-linuxserver.tar.xz"
 		local_filedir="${tmpdir}"
 		local_filename="brainbread-v1.2-linuxserver.tar.xz"
-		chmodx="nochmodx" run="norun"
+		chmodx="nochmodx"
+		run="norun"
 		force="noforce"
 		md5="55f227183b736397806d5b6db6143f15"
 	elif [ "${shortname}" == "cod" ]; then
 		remote_fileurl="http://linuxgsm.download/CallOfDuty/cod-lnxded-1.5b-full.tar.xz"
 		local_filedir="${tmpdir}"
 		local_filename="cod-lnxded-1.5-large.tar.xz"
-		chmodx="nochmodx" run="norun"
+		chmodx="nochmodx"
+		run="norun"
 		force="noforce"
 		md5="ee0ad1ccbfa1fd27fde01a4a431a5c2f"
 	elif [ "${shortname}" == "coduo" ]; then
 		remote_fileurl="http://linuxgsm.download/CallOfDutyUnitedOffensive/coduo-lnxded-1.51b-full.tar.xz"
 		local_filedir="${tmpdir}"
 		local_filename="coduo-lnxded-1.51b-full.tar.xz"
-		chmodx="nochmodx" run="norun"
+		chmodx="nochmodx"
+		run="norun"
 		force="noforce"
 		md5="35cabccd67adcda44aaebc59405915b9"
 	elif [ "${shortname}" == "cod2" ]; then
 		remote_fileurl="http://linuxgsm.download/CallOfDuty2/cod2-lnxded-1.3-full.tar.xz"
 		local_filedir="${tmpdir}"
 		local_filename="cod2-lnxded-1.3-full.tar.xz"
-		chmodx="nochmodx" run="norun"
+		chmodx="nochmodx"
+		run="norun"
 		force="noforce"
 		md5="b8c4c611f01627dd43348e78478a3d41"
 	elif [ "${shortname}" == "cod4" ]; then
 		remote_fileurl="http://linuxgsm.download/CallOfDuty4/cod4x18_lnxded.tar.xz"
 		local_filedir="${tmpdir}"
 		local_filename="cod4x18_lnxded.tar.xz"
-		chmodx="nochmodx" run="norun"
+		chmodx="nochmodx"
+		run="norun"
 		force="noforce"
 		md5="d255b59b9756d7dbead67718208512ee"
 	elif [ "${shortname}" == "codwaw" ]; then
 		remote_fileurl="http://linuxgsm.download/CallOfDutyWorldAtWar/codwaw-lnxded-1.7-full.tar.xz"
 		local_filedir="${tmpdir}"
 		local_filename="codwaw-lnxded-1.7-full.tar.xz"
-		chmodx="nochmodx" run="norun"
+		chmodx="nochmodx"
+		run="norun"
 		force="noforce"
 		md5="2c6be1bb66ea631b9b2e7ae6216c6680"
 	elif [ "${shortname}" == "etl" ]; then
 		remote_fileurl="http://linuxgsm.download/WolfensteinEnemyTerritory/etlegacy-v2.78.1-i386-et-260b.tar.xz"
 		local_filedir="${tmpdir}"
 		local_filename="etlegacy-v2.78.1-i386-et-260b.tar.xz"
-		chmodx="nochmodx" run="norun"
+		chmodx="nochmodx"
+		run="norun"
 		force="noforce"
 		md5="7c08b52cb09b30eadb98ea05ef780fc7"
 	elif [ "${shortname}" == "mohaa" ]; then
 		remote_fileurl="http://linuxgsm.download/MedalofHonorAlliedAssault/moh_revival_v1.12_RC3.5.1.tar.xz"
 		local_filedir="${tmpdir}"
 		local_filename="moh_revival_v1.12_RC3.5.1.tar.xz"
-		chmodx="nochmodx" run="norun"
+		chmodx="nochmodx"
+		run="norun"
 		force="noforce"
 		md5="7c664538999252eeaf2b6d9949416480"
 	elif [ "${shortname}" == "ns" ]; then
 		remote_fileurl="http://linuxgsm.download/NaturalSelection/ns_dedicated_server_v32.tar.xz"
 		local_filedir="${tmpdir}"
 		local_filename="ns_dedicated_server_v32.tar.xz"
-		chmodx="nochmodx" run="norun"
+		chmodx="nochmodx"
+		run="norun"
 		force="noforce"
 		md5="23ec3cadd93d8bb1c475bad5b9cce370"
 	elif [ "${shortname}" == "q2" ]; then
 		remote_fileurl="http://linuxgsm.download/Quake2/quake2-3.20-glibc-i386-full-linux2.0.tar.xz"
 		local_filedir="${tmpdir}"
 		local_filename="quake2-3.20-glibc-i386-full-linux2.0.tar.xz"
-		chmodx="nochmodx" run="norun"
+		chmodx="nochmodx"
+		run="norun"
 		force="noforce"
 		md5="2908164a32d4808bb720f2161f6b0c82"
 	elif [ "${shortname}" == "q3" ]; then
 		remote_fileurl="http://linuxgsm.download/Quake3/quake3-1.32c-x86-full-linux.tar.xz"
 		local_filedir="${tmpdir}"
 		local_filename="quake3-1.32c-x86-full-linux.tar.xz"
-		chmodx="nochmodx" run="norun"
+		chmodx="nochmodx"
+		run="norun"
 		force="noforce"
 		md5="b0e26d8919fe9313fb9d8ded2360f3db"
 	elif [ "${shortname}" == "q4" ]; then
 		remote_fileurl="http://linuxgsm.download/Quake4/quake4-1.4.2-x86-linuxded.tar.xz"
 		local_filedir="${tmpdir}"
 		local_filename="quake4-1.4.2-x86-linuxded.tar.xz"
-		chmodx="nochmodx" run="norun"
+		chmodx="nochmodx"
+		run="norun"
 		force="noforce"
 		md5="afe30b44f23c8ae2ce6f0f464473d8ba"
 	elif [ "${shortname}" == "qw" ]; then
 		remote_fileurl="http://linuxgsm.download/QuakeWorld/nquake.server.linux.190506.full.tar.xz"
 		local_filedir="${tmpdir}"
 		local_filename="nquake.server.linux.190506.full.tar.xz"
-		chmodx="nochmodx" run="norun"
+		chmodx="nochmodx"
+		run="norun"
 		force="noforce"
 		md5="82055b7d973206c13a606db8ba288d03"
 	elif [ "${shortname}" == "rtcw" ]; then
 		remote_fileurl="http://linuxgsm.download/ReturnToCastleWolfenstein/iortcw-1.51c-x86_64-server-linux-20190507.tar.xz"
 		local_filedir="${tmpdir}"
 		local_filename="iortcw-1.51c-x86_64-server-linux-20190507.tar.xz"
-		chmodx="nochmodx" run="norun"
+		chmodx="nochmodx"
+		run="norun"
 		force="noforce"
 		md5="df6ff664d37dd0d22787848bdb3cac5f"
 	elif [ "${shortname}" == "sfc" ]; then
 		remote_fileurl="http://linuxgsm.download/SourceFortsClassic/SFClassic-1.0-RC7-fix.tar.xz"
 		local_filedir="${tmpdir}"
 		local_filename="SFClassic-1.0-RC7-fix.tar.xz"
-		chmodx="nochmodx" run="norun"
+		chmodx="nochmodx"
+		run="norun"
 		force="noforce"
 		md5="70077137185700e28fe6bbb6021d12bc"
 	elif [ "${shortname}" == "sof2" ]; then
 		remote_fileurl="http://linuxgsm.download/SoldierOfFortune2/sof2gold-1.03.tar.xz"
 		local_filedir="${tmpdir}"
 		local_filename="sof2gold-1.03.tar.xz"
-		chmodx="nochmodx" run="norun"
+		chmodx="nochmodx"
+		run="norun"
 		force="noforce"
 		md5="201e23bab04207d00ce813d001c483d9"
 	elif [ "${shortname}" == "ts" ]; then
 		remote_fileurl="http://linuxgsm.download/TheSpecialists/ts-3-linux-final.tar.xz"
 		local_filedir="${tmpdir}"
 		local_filename="ts-3-linux-final.tar.xz"
-		chmodx="nochmodx" run="norun"
+		chmodx="nochmodx"
+		run="norun"
 		force="noforce"
 		md5="3c66ecff6e3644f7ac88015732a0fb93"
 	elif [ "${shortname}" == "ut2k4" ]; then
 		remote_fileurl="http://linuxgsm.download/UnrealTournament2004/ut2004-server-3369-3-ultimate-linux.tar.xz"
 		local_filedir="${tmpdir}"
 		local_filename="ut2004-server-3369-3-ultimate-linux.tar.xz"
-		chmodx="nochmodx" run="norun"
+		chmodx="nochmodx"
+		run="norun"
 		force="noforce"
 		md5="9fceaab68554749f4b45be66613b9a15"
 	elif [ "${shortname}" == "ut99" ]; then
 		remote_fileurl="http://linuxgsm.download/UnrealTournament99/ut99-server-469b-ultimate-linux.tar.xz"
 		local_filedir="${tmpdir}"
 		local_filename="ut99-server-469b-ultimate-linux.tar.xz"
-		chmodx="nochmodx" run="norun"
+		chmodx="nochmodx"
+		run="norun"
 		force="noforce"
 		md5="dba3f1122a5e60ee45ece7422fcf78f5"
 	elif [ "${shortname}" == "ut" ]; then
 		remote_fileurl="http://linuxgsm.download/UnrealTournament/UnrealTournament-Server-XAN-3525360-Linux.tar.xz"
 		local_filedir="${tmpdir}"
 		local_filename="UnrealTournament-Server-XAN-3525360-Linux.tar.xz"
-		chmodx="noexecute" run="norun"
+		chmodx="noexecute"
+		run="norun"
 		force="noforce"
 		md5="41dd92015713a78211eaccf503b72393"
 	elif [ "${shortname}" == "ut3" ]; then
 		remote_fileurl="http://linuxgsm.download/UnrealTournament3/UT3-linux-server-2.1.tar.xz"
 		local_filedir="${tmpdir}"
 		local_filename="UT3-linux-server-2.1.tar.xz"
-		chmodx="nochmodx" run="norun"
+		chmodx="nochmodx"
+		run="norun"
 		force="noforce"
 		md5="8876cca61e3f83ea08db25208bde6ac6"
 	elif [ "${shortname}" == "vs" ]; then
 		remote_fileurl="http://linuxgsm.download/VampireSlayer/vs_l-6.0_full.tar.xz"
 		local_filedir="${tmpdir}"
 		local_filename="vs_l-6.0_full.tar.xz"
-		chmodx="nochmodx" run="norun"
+		chmodx="nochmodx"
+		run="norun"
 		force="noforce"
 		md5="b322f79e0abd31847493c52acf802667"
 	elif [ "${shortname}" == "wet" ]; then
 		remote_fileurl="http://linuxgsm.download/WolfensteinEnemyTerritory/enemy-territory.260b.tar.xz"
 		local_filedir="${tmpdir}"
 		local_filename="enemy-territory.260b.tar.xz"
-		chmodx="nochmodx" run="norun"
+		chmodx="nochmodx"
+		run="norun"
 		force="noforce"
 		md5="581a333cc7eacda2f56d5a00fe11eafa"
 	elif [ "${shortname}" == "samp" ]; then
 		remote_fileurl="https://files.samp-sc.com/samp037svr_R2-1.tar.gz"
 		local_filedir="${tmpdir}"
 		local_filename="samp037svr_R2-1.tar.gz"
-		chmodx="nochmodx" run="norun"
+		chmodx="nochmodx"
+		run="norun"
 		force="noforce"
 		md5="93705e165550c97484678236749198a4"
 	elif [ "${shortname}" == "zmr" ]; then
 		remote_fileurl="http://linuxgsm.download/ZombieMasterReborn/zombie_master_reborn_b6_1.tar.xz"
 		local_filedir="${tmpdir}"
 		local_filename="zombie_master_reborn_b6_1.tar.xz"
-		chmodx="nochmodx" run="norun"
+		chmodx="nochmodx"
+		run="norun"
 		force="noforce"
 		md5="0188ae86dbc9376f11ae3032dba2d665"
 	else
@@ -247,6 +275,8 @@ elif [ "${shortname}" == "vints" ]; then
 elif [ "${shortname}" == "ut99" ]; then
 	fn_install_server_files
 	update_ut99.sh
+elif [ "${shortname}" == "xnt" ]; then
+	update_xnt.sh
 elif [ -z "${appid}" ] || [ "${shortname}" == "ahl" ] || [ "${shortname}" == "bb" ] || [ "${shortname}" == "q4" ] || [ "${shortname}" == "ns" ] || [ "${shortname}" == "sfc" ] || [ "${shortname}" == "ts" ] || [ "${shortname}" == "vs" ] || [ "${shortname}" == "zmr" ]; then
 	if [ "${shortname}" == "ut" ]; then
 		install_eula.sh
diff --git a/lgsm/modules/update_xnt.sh b/lgsm/modules/update_xnt.sh
new file mode 100644
index 000000000..d935e3989
--- /dev/null
+++ b/lgsm/modules/update_xnt.sh
@@ -0,0 +1,173 @@
+#!/bin/bash
+# LinuxGSM command_ut99.sh module
+# Author: Daniel Gibbs
+# Contributors: http://linuxgsm.com/contrib
+# Website: https://linuxgsm.com
+# Description: Handles updating of Unreal Tournament 99 servers.
+
+module_selfname="$(basename "$(readlink -f "${BASH_SOURCE[0]}")")"
+
+fn_update_dl() {
+	# Download and extract files to serverfiles.
+	fn_fetch_file "${remotebuildurl}" "" "" "" "${tmpdir}" "${remotebuildfilename}" "nochmodx" "norun" "force" "${remotebuildhash}"
+	fn_dl_extract "${tmpdir}" "${remotebuildfilename}" "${serverfiles}" "Xonotic"
+	fn_clear_tmp
+}
+
+fn_update_localbuild() {
+	# Gets local build info.
+	fn_print_dots "Checking local build: ${remotelocation}"
+
+	# Send version command to Xonotic server.
+	tmux -L "${socketname}" send-keys -t "${sessionname}" "version\r" > /dev/null 2>&1
+	fn_sleep_time_1
+
+	# Uses log file to get local build.
+	localbuild=$(grep "SVQC version: xonotic-v" "${consolelogdir}"/* 2> /dev/null | tail -1 | sed 's/.*SVQC version: \(xonotic-v[0-9.]*\).*/\1/' | tr -d '\000-\011\013-\037')
+	if [ -z "${localbuild}" ]; then
+		fn_print_error "Checking local build: ${remotelocation}: missing local build info"
+		fn_script_log_error "Missing local build info"
+		fn_script_log_error "Set localbuild to 0"
+		localbuild="0"
+	else
+		fn_print_ok "Checking local build: ${remotelocation}"
+		fn_script_log_pass "Checking local build"
+	fi
+}
+
+fn_update_remotebuild() {
+	# Get remote build info.
+	apiurl="https://api.github.com/repos/xonotic/xonotic/tags"
+	remotebuildresponse=$(curl -s "${apiurl}")
+	remotebuildtag=$(echo "${remotebuildresponse}" | jq -r '.[0].name')
+	remotebuildfilename=$(echo "${remotebuildtag}" | tr -d 'v')
+	remotebuildfilename="${remotebuildfilename}.zip"
+	remotebuildurl="https://dl.xonotic.org/${remotebuildfilename}"
+
+	remotebuildversion="${remotebuildtag}"
+
+	if [ "${firstcommandname}" != "INSTALL" ]; then
+		fn_print_dots "Checking remote build: ${remotelocation}"
+		# Checks if remotebuildversion variable has been set.
+		if [ -z "${remotebuildversion}" ] || [ "${remotebuildversion}" == "null" ]; then
+			fn_print_fail "Checking remote build: ${remotelocation}"
+			fn_script_log_fail "Checking remote build"
+			core_exit.sh
+		else
+			fn_print_ok "Checking remote build: ${remotelocation}"
+			fn_script_log_pass "Checking remote build"
+		fi
+	else
+		# Checks if remotebuild variable has been set.
+		if [ -z "${remotebuildversion}" ] || [ "${remotebuildversion}" == "null" ]; then
+			fn_print_failure "Unable to get remote build"
+			fn_script_log_fail "Unable to get remote build"
+			core_exit.sh
+		fi
+	fi
+}
+
+fn_update_compare() {
+	fn_print_dots "Checking for update: ${remotelocation}"
+	# Update has been found or force update.
+	if [ "${localbuild}" != "${remotebuildversion}" ] || [ "${forceupdate}" == "1" ]; then
+		# Create update lockfile.
+		date '+%s' > "${lockdir:?}/update.lock"
+		fn_print_ok_nl "Checking for update: ${remotelocation}"
+		echo -en "\n"
+		echo -e "Update available"
+		echo -e "* Local build: ${red}${localbuild}${default}"
+		echo -e "* Remote build: ${green}${remotebuildversion}${default}"
+		if [ -n "${branch}" ]; then
+			echo -e "* Branch: ${branch}"
+		fi
+		if [ -f "${rootdir}/.dev-debug" ]; then
+			echo -e "Remote build info"
+			echo -e "* apiurl: ${apiurl}"
+			echo -e "* remotebuildfilename: ${remotebuildfilename}"
+			echo -e "* remotebuildurl: ${remotebuildurl}"
+			echo -e "* remotebuildversion: ${remotebuildversion}"
+		fi
+		echo -en "\n"
+		fn_script_log_info "Update available"
+		fn_script_log_info "Local build: ${localbuild}"
+		fn_script_log_info "Remote build: ${remotebuildversion}"
+		if [ -n "${branch}" ]; then
+			fn_script_log_info "Branch: ${branch}"
+		fi
+		fn_script_log_info "${localbuild} > ${remotebuildversion}"
+
+		if [ "${commandname}" == "UPDATE" ]; then
+			date +%s > "${lockdir}/last-updated.lock"
+			unset updateonstart
+			check_status.sh
+			# If server stopped.
+			if [ "${status}" == "0" ]; then
+				fn_update_dl
+				if [ "${localbuild}" == "0" ]; then
+					exitbypass=1
+					command_start.sh
+					fn_firstcommand_reset
+					exitbypass=1
+					fn_sleep_time_5
+					command_stop.sh
+					fn_firstcommand_reset
+				fi
+			# If server started.
+			else
+				fn_print_restart_warning
+				exitbypass=1
+				command_stop.sh
+				fn_firstcommand_reset
+				exitbypass=1
+				fn_update_dl
+				exitbypass=1
+				command_start.sh
+				fn_firstcommand_reset
+			fi
+			unset exitbypass
+			alert="update"
+		elif [ "${commandname}" == "CHECK-UPDATE" ]; then
+			alert="check-update"
+		fi
+		alert.sh
+	else
+		fn_print_ok_nl "Checking for update: ${remotelocation}"
+		echo -en "\n"
+		echo -e "No update available"
+		echo -e "* Local build: ${green}${localbuild}${default}"
+		echo -e "* Remote build: ${green}${remotebuildversion}${default}"
+		if [ -n "${branch}" ]; then
+			echo -e "* Branch: ${branch}"
+		fi
+		echo -en "\n"
+		fn_script_log_info "No update available"
+		fn_script_log_info "Local build: ${localbuild}"
+		fn_script_log_info "Remote build: ${remotebuildversion}"
+		if [ -n "${branch}" ]; then
+			fn_script_log_info "Branch: ${branch}"
+		fi
+		if [ -f "${rootdir}/.dev-debug" ]; then
+			echo -e "Remote build info"
+			echo -e "* apiurl: ${apiurl}"
+			echo -e "* remotebuildfilename: ${remotebuildfilename}"
+			echo -e "* remotebuildurl: ${remotebuildurl}"
+			echo -e "* remotebuildversion: ${remotebuildversion}"
+		fi
+	fi
+}
+
+# The location where the builds are checked and downloaded.
+remotelocation="github.com"
+
+if [ "${firstcommandname}" == "INSTALL" ]; then
+	fn_update_remotebuild
+	fn_update_dl
+else
+	fn_print_dots "Checking for update"
+	fn_print_dots "Checking for update: ${remotelocation}"
+	fn_script_log_info "Checking for update: ${remotelocation}"
+	fn_update_localbuild
+	fn_update_remotebuild
+	fn_update_compare
+fi

From b4299ef1667318d05171a9a66aed2b232ca98d13 Mon Sep 17 00:00:00 2001
From: Daniel Gibbs <me@danielgibbs.co.uk>
Date: Thu, 29 Aug 2024 14:45:49 +0100
Subject: [PATCH 126/154] feat: delete download of tar files when installed
 (#4458)

this will clear the tmp directory when a server it downloaded
---
 lgsm/modules/install_server_files.sh | 1 +
 1 file changed, 1 insertion(+)

diff --git a/lgsm/modules/install_server_files.sh b/lgsm/modules/install_server_files.sh
index 57ce58ca7..7d773ce9f 100644
--- a/lgsm/modules/install_server_files.sh
+++ b/lgsm/modules/install_server_files.sh
@@ -238,6 +238,7 @@ fn_install_server_files() {
 	fi
 	fn_fetch_file "${remote_fileurl}" "" "" "" "${local_filedir}" "${local_filename}" "${chmodx}" "${run}" "${forcedl}" "${md5}"
 	fn_dl_extract "${local_filedir}" "${local_filename}" "${serverfiles}"
+	fn_clear_tmp
 }
 
 echo -e ""

From 02223a5206da02d69b19f5d27f8a1bde70191810 Mon Sep 17 00:00:00 2001
From: Daniel Gibbs <me@danielgibbs.co.uk>
Date: Thu, 29 Aug 2024 21:22:25 +0100
Subject: [PATCH 127/154] fix(restart): prevent restart from running if checks
 fail (4278)

---
 lgsm/modules/command_restart.sh | 1 +
 1 file changed, 1 insertion(+)

diff --git a/lgsm/modules/command_restart.sh b/lgsm/modules/command_restart.sh
index ed60a5555..457d1d17f 100644
--- a/lgsm/modules/command_restart.sh
+++ b/lgsm/modules/command_restart.sh
@@ -10,6 +10,7 @@ commandaction="Restarting"
 moduleselfname="$(basename "$(readlink -f "${BASH_SOURCE[0]}")")"
 fn_firstcommand_set
 
+check.sh
 info_game.sh
 exitbypass=1
 command_stop.sh

From d9d82a1a1230fb096dff5f1b0609bde397aa1806 Mon Sep 17 00:00:00 2001
From: Daniel Gibbs <me@danielgibbs.co.uk>
Date: Sun, 1 Sep 2024 22:07:58 +0100
Subject: [PATCH 128/154] feat(permissions): Attempt to fix non executable
 files issue

---
 lgsm/modules/check_permissions.sh | 24 ++++++++++++++++++++----
 1 file changed, 20 insertions(+), 4 deletions(-)

diff --git a/lgsm/modules/check_permissions.sh b/lgsm/modules/check_permissions.sh
index d2cd5890c..44c527bfb 100644
--- a/lgsm/modules/check_permissions.sh
+++ b/lgsm/modules/check_permissions.sh
@@ -71,11 +71,27 @@ fn_check_permissions() {
 				echo -en "File:"
 				echo -en "${findnotexecutable}"
 			} | column -s $'\t' -t | tee -a "${lgsmlog}"
-			if [ "${monitorflag}" == 1 ]; then
-				alert="permissions"
-				alert.sh
+
+			# Attempt to make the files executable
+			fn_print_information_nl "Attempting to fix permissions issues"
+			fn_script_log_info "Attempting to fix permissions issues"
+			echo "${findnotexecutable}" | xargs chmod +x
+
+			# Re-check if there are still non-executable files
+			findnotexecutable="$(find "${modulesdir}" -type f -not -executable)"
+			findnotexecutablewc="$(find "${modulesdir}" -type f -not -executable | wc -l)"
+			if [ "${findnotexecutablewc}" -ne "0" ]; then
+				fn_print_fail_nl "Failed to resolve permissions issues"
+				fn_script_log_fail "Failed to resolve permissions issues"
+				if [ "${monitorflag}" == 1 ]; then
+					alert="permissions"
+					alert.sh
+				fi
+				core_exit.sh
+			else
+				fn_print_ok_nl "Permissions issues resolved"
+				fn_script_log_pass "Permissions issues resolved"
 			fi
-			core_exit.sh
 		fi
 	fi
 

From d14252017db994494ed6e594503b0f5229fa8df5 Mon Sep 17 00:00:00 2001
From: Daniel Gibbs <me@danielgibbs.co.uk>
Date: Tue, 10 Sep 2024 21:04:11 +0100
Subject: [PATCH 129/154] fix(sf): Update Satisfactory executable (#4643)

change: remove MultiHome Parameter for sfserver
removed temporary fix with sf 1 release

Co-authored-by: Armin <50357737+PlayMTL@users.noreply.github.com>
---
 lgsm/config-default/config-lgsm/sfserver/_default.cfg | 4 ++--
 lgsm/modules/check_executable.sh                      | 7 -------
 2 files changed, 2 insertions(+), 9 deletions(-)

diff --git a/lgsm/config-default/config-lgsm/sfserver/_default.cfg b/lgsm/config-default/config-lgsm/sfserver/_default.cfg
index 65930bfc1..d6ce41d82 100644
--- a/lgsm/config-default/config-lgsm/sfserver/_default.cfg
+++ b/lgsm/config-default/config-lgsm/sfserver/_default.cfg
@@ -16,7 +16,7 @@ port="7777"
 
 ## Server Parameters | https://docs.linuxgsm.com/configuration/start-parameters#additional-parameters
 ## Game Server Docs | https://satisfactory.fandom.com/wiki/Dedicated_servers
-startparameters="FactoryGame -MultiHome=${ip} -Port=${port} -ServerQueryPort=${queryport} -BeaconPort=${beaconport} -log"
+startparameters="FactoryGame -Port=${port} -ServerQueryPort=${queryport} -BeaconPort=${beaconport} -log"
 
 #### LinuxGSM Settings ####
 
@@ -159,7 +159,7 @@ glibc="2.17"
 ## Game Server Directories
 systemdir="${serverfiles}/FactoryGame"
 executabledir="${serverfiles}/Engine/Binaries/Linux"
-executable="./UnrealServer-Linux-Shipping"
+executable="./FactoryServer-Linux-Shipping"
 servercfgdir="${systemdir}/Saved/Config/LinuxServer"
 servercfg="GameUserSettings.ini"
 servercfgdefault="GameUserSettings.ini"
diff --git a/lgsm/modules/check_executable.sh b/lgsm/modules/check_executable.sh
index 91db68f1a..e7214ac33 100644
--- a/lgsm/modules/check_executable.sh
+++ b/lgsm/modules/check_executable.sh
@@ -7,13 +7,6 @@
 
 moduleselfname="$(basename "$(readlink -f "${BASH_SOURCE[0]}")")"
 
-# #4241 temporary fix for Satisfactory for upgrade betweern Update 7 & Update 8 - remove this once update 8 is released
-if [ "${shortname}" == "sf" ]; then
-	if [ ! -f "${serverfiles}/Engine/Binaries/Linux/UE4Server-Linux-Shipping" ]; then
-		ln -s "${serverfiles}/Engine/Binaries/Linux/UnrealServer-Linux-Shipping" "${serverfiles}/Engine/Binaries/Linux/UE4Server-Linux-Shipping"
-	fi
-fi
-
 # Check if executable exists
 execname=$(basename "${executable}")
 if [ ! -f "${executabledir}/${execname}" ]; then

From 0729d39ab887426c1a7d83ee544b3716e5971ec4 Mon Sep 17 00:00:00 2001
From: Daniel Gibbs <me@danielgibbs.co.uk>
Date: Tue, 10 Sep 2024 21:07:29 +0100
Subject: [PATCH 130/154] Release v24.2.4

---
 lgsm/modules/core_modules.sh | 2 +-
 linuxgsm.sh                  | 2 +-
 2 files changed, 2 insertions(+), 2 deletions(-)

diff --git a/lgsm/modules/core_modules.sh b/lgsm/modules/core_modules.sh
index dbcec4f6f..a56a88eea 100644
--- a/lgsm/modules/core_modules.sh
+++ b/lgsm/modules/core_modules.sh
@@ -8,7 +8,7 @@
 
 moduleselfname="$(basename "$(readlink -f "${BASH_SOURCE[0]}")")"
 
-modulesversion="v24.2.3"
+modulesversion="v24.2.4"
 
 # Core
 
diff --git a/linuxgsm.sh b/linuxgsm.sh
index eafb87406..4226415b6 100755
--- a/linuxgsm.sh
+++ b/linuxgsm.sh
@@ -24,7 +24,7 @@ if [ -f ".dev-debug" ]; then
 	set -x
 fi
 
-version="v24.2.3"
+version="v24.2.4"
 shortname="core"
 gameservername="core"
 commandname="CORE"

From ee8d30f7060818ad430ac9e4b30e1d61369a5d21 Mon Sep 17 00:00:00 2001
From: Daniel Gibbs <me@danielgibbs.co.uk>
Date: Mon, 16 Sep 2024 22:43:44 +0100
Subject: [PATCH 131/154] feat(ro): Migrate to using valve query by default

---
 .../config-lgsm/roserver/_default.cfg         |  2 +-
 .../modules/command_dev_parse_game_details.sh |  8 ++---
 lgsm/modules/core_messages.sh                 |  2 +-
 lgsm/modules/info_game.sh                     | 36 +++++++++----------
 lgsm/modules/info_messages.sh                 | 19 +++++-----
 5 files changed, 33 insertions(+), 34 deletions(-)

diff --git a/lgsm/config-default/config-lgsm/roserver/_default.cfg b/lgsm/config-default/config-lgsm/roserver/_default.cfg
index c000f6181..0af49a0d4 100644
--- a/lgsm/config-default/config-lgsm/roserver/_default.cfg
+++ b/lgsm/config-default/config-lgsm/roserver/_default.cfg
@@ -142,7 +142,7 @@ stopmode="2"
 # 4: gsquery
 # 5: tcp
 querymode="2"
-querytype="protocol-unreal2"
+querytype="protocol-valve"
 
 ## Console type
 consoleverbose="yes"
diff --git a/lgsm/modules/command_dev_parse_game_details.sh b/lgsm/modules/command_dev_parse_game_details.sh
index 2e22aa7ae..5938f817d 100644
--- a/lgsm/modules/command_dev_parse_game_details.sh
+++ b/lgsm/modules/command_dev_parse_game_details.sh
@@ -74,12 +74,12 @@ declare -A server_details=(
 	['Port IPv6']="${portipv6}"
 	['Port']="${port}"
 	['Query Enabled']="${queryenabled}"
-	['Query HTTP Port']="${queryhttpport}"
-	['Query HTTPS Port']="${queryhttpsport}"
+	['Query HTTP Port']="${httpqueryport}"
+	['Query HTTPS Port']="${httpsqueryport}"
 	['Query Mode']="${querymode}"
-	['Query Port GS']="${queryportgs}"
+	['Query Port GS']="${gamespyqueryport}"
 	['Query Port']="${queryport}"
-	['Query SSH Port']="${querysshport}"
+	['Query SSH Port']="${sshqueryport}"
 	['Queue Enabled']="${queueenabled}"
 	['Queue Port']="${queueport}"
 	['Random Map']="${randommap}"
diff --git a/lgsm/modules/core_messages.sh b/lgsm/modules/core_messages.sh
index 6488c02bc..52129dc4b 100644
--- a/lgsm/modules/core_messages.sh
+++ b/lgsm/modules/core_messages.sh
@@ -31,7 +31,7 @@ fn_ansi_loader() {
 		darkgrey="\e[90m"
 		lightgrey="\e[37m"
 		white="\e[97m"
-  		# erase to end of line.
+		# erase to end of line.
 		creeol+="\033[K"
 	fi
 }
diff --git a/lgsm/modules/info_game.sh b/lgsm/modules/info_game.sh
index d56d4fbff..5875627ca 100644
--- a/lgsm/modules/info_game.sh
+++ b/lgsm/modules/info_game.sh
@@ -496,7 +496,7 @@ fn_info_game_kf() {
 		fn_info_game_ini "lanport" "LANServerPort"
 		fn_info_game_ini "maxplayers" "MaxPlayers"
 		fn_info_game_ini "port" "Port"
-		fn_info_game_ini "queryportgs" "QueryPort"
+		fn_info_game_ini "gamespyqueryport" "QueryPort"
 		fn_info_game_ini "servername" "ServerName"
 		fn_info_game_ini "serverpassword" "GamePassword"
 	fi
@@ -510,7 +510,7 @@ fn_info_game_kf() {
 	maxplayers="${maxplayers:-"0"}"
 	port="${port:-"0"}"
 	queryport="$((port + 1))"
-	queryportgs="${queryportgs:-"0"}"
+	gamespyqueryport="${gamespyqueryport:-"0"}"
 	servername="${servername:-"NOT SET"}"
 	serverpassword="${serverpassword:-"NOT SET"}"
 	steamport="28852"
@@ -754,19 +754,19 @@ fn_info_game_ts3() {
 		fn_info_game_ini "dbplugin" "dbplugin"
 		fn_info_game_ini "fileport" "filetransfer_port"
 		fn_info_game_ini "port" "default_voice_port"
-		fn_info_game_ini "queryhttpport" "query_http_port"
-		fn_info_game_ini "queryhttpsport" "query_https_port"
+		fn_info_game_ini "httpqueryport" "query_http_port"
+		fn_info_game_ini "httpsqueryport" "query_https_port"
 		fn_info_game_ini "queryport" "query_port"
-		fn_info_game_ini "querysshport" "query_ssh_port"
+		fn_info_game_ini "sshqueryport" "query_ssh_port"
 	fi
 	configip="${configip:-"0.0.0.0"}"
 	dbplugin="${dbplugin:-"NOT SET"}"
 	fileport="${fileport:-"0"}"
 	port="${port:-"0"}"
-	queryhttpport="${queryhttpport:-"0"}"
-	queryhttpsport="${queryhttpsport:-"0"}"
+	httpqueryport="${httpqueryport:-"0"}"
+	httpsqueryport="${httpsqueryport:-"0"}"
 	queryport="${queryport:-"0"}"
-	querysshport="${querysshport:-"0"}"
+	sshqueryport="${sshqueryport:-"0"}"
 	telnetport="${queryport}"
 }
 
@@ -797,7 +797,7 @@ fn_info_game_ut99() {
 		fn_info_game_ini "adminpassword" "AdminPassword"
 		fn_info_game_ini "beaconport" "ServerBeaconPort"
 		fn_info_game_ini "port" "Port"
-		fn_info_game_ini "queryportgs" "OldQueryPortNumber"
+		fn_info_game_ini "gamespyqueryport" "OldQueryPortNumber"
 		fn_info_game_ini "servername" "ServerName"
 		fn_info_game_ini "serverpassword" "GamePassword"
 		fn_info_game_ini "httpenabled" "bEnabled"
@@ -811,7 +811,7 @@ fn_info_game_ut99() {
 	httpport="${httpport:-"0"}"
 	port="${port:-"0"}"
 	queryport="$((port + 1))"
-	queryportgs="${queryportgs:-"0"}"
+	gamespyqueryport="${gamespyqueryport:-"0"}"
 	servername="${servername:-"NOT SET"}"
 	serverpassword="${serverpassword:-"NOT SET"}"
 	httpenabled="${httpenabled:-"0"}"
@@ -857,7 +857,7 @@ fn_info_game_unreal2() {
 		fn_info_game_ini "adminpassword" "AdminPassword"
 		fn_info_game_ini "httpport" "ListenPort"
 		fn_info_game_ini "port" "Port"
-		fn_info_game_ini "queryportgs" "OldQueryPortNumber"
+		fn_info_game_ini "gamespyqueryport" "OldQueryPortNumber"
 		fn_info_game_ini "servername" "ServerName"
 		fn_info_game_ini "serverpassword" "GamePassword"
 		fn_info_game_ini "httpenabled" "bEnabled"
@@ -868,7 +868,7 @@ fn_info_game_unreal2() {
 	httpport="${httpport:-"0"}"
 	port="${port:-"0"}"
 	queryport="$((port + 1))"
-	queryportgs="${queryportgs:-"0"}"
+	gamespyqueryport="${gamespyqueryport:-"0"}"
 	servername="${servername:-"NOT SET"}"
 	serverpassword="${serverpassword:-"NOT SET"}"
 	httpenabled="${httpenabled:-"0"}"
@@ -902,7 +902,7 @@ fn_info_game_ut2k4() {
 		fn_info_game_ini "httpport" "ListenPort"
 		fn_info_game_ini "lanport" "LANServerPort"
 		fn_info_game_ini "port" "Port"
-		fn_info_game_ini "queryportgs" "OldQueryPortNumber"
+		fn_info_game_ini "gamespyqueryport" "OldQueryPortNumber"
 		fn_info_game_ini "servername" "ServerName"
 		fn_info_game_ini "serverpassword" "GamePassword"
 		fn_info_game_ini "httpenabled" "bEnabled"
@@ -914,7 +914,7 @@ fn_info_game_ut2k4() {
 	lanport="${lanport:-"0"}"
 	port="${port:-"0"}"
 	queryport="$((port + 1))"
-	queryportgs="${queryportgs:-"0"}"
+	gamespyqueryport="${gamespyqueryport:-"0"}"
 	servername="${servername:-"NOT SET"}"
 	serverpassword="${serverpassword:-"NOT SET"}"
 	httpenabled="${httpenabled:-"0"}"
@@ -1771,7 +1771,6 @@ fn_info_game_ro() {
 		fn_info_game_ini "lanport" "LANServerPort"
 		fn_info_game_ini "maxplayers" "MaxPlayers"
 		fn_info_game_ini "port" "Port"
-		fn_info_game_ini "queryportgs" "QueryPort"
 		fn_info_game_ini "servername" "ServerName"
 		fn_info_game_ini "serverpassword" "GamePassword"
 	fi
@@ -1784,12 +1783,11 @@ fn_info_game_ro() {
 	lanport="${lanport:-"0"}"
 	maxplayers="${maxplayers:-"0"}"
 	port="${port:-"0"}"
-	queryport="$((port + 1))"
-	queryportgs="${queryportgs:-"0"}"
+	queryport=$((28902 + (port - 7757))) # Valve Query Port
 	servername="${servername:-"NOT SET"}"
 	serverpassword="${serverpassword:-"NOT SET"}"
-	steamport="28902"
-	steamworksport="20610"
+	steamport="20610"
+	unreal2queryport="$((port + 1))" # Unreal2 Query Port
 }
 
 # Config Type: QuakeC
diff --git a/lgsm/modules/info_messages.sh b/lgsm/modules/info_messages.sh
index 0bc444e5e..94c192361 100644
--- a/lgsm/modules/info_messages.sh
+++ b/lgsm/modules/info_messages.sh
@@ -832,7 +832,7 @@ fn_info_messages_armar() {
 	{
 		fn_port "header"
 		fn_port "Game" port udp
-		fn_port "Steam Query" queryport udp
+		fn_port "Query" queryport udp
 		fn_port "BattleEye" battleeyeport tcp
 	} | column -s $'\t' -t
 }
@@ -1130,7 +1130,7 @@ fn_info_messages_kf() {
 		fn_port "header"
 		fn_port "Game" port udp
 		fn_port "Query" queryport udp
-		fn_port "Query (GameSpy)" queryportgs udp
+		fn_port "Query (GameSpy)" gamespyqueryport udp
 		fn_port "Web Interface" httpport tcp
 		fn_port "LAN" lanport udp
 		fn_port "Steamworks P2P" steamworksport udp
@@ -1343,11 +1343,12 @@ fn_info_messages_ro() {
 	{
 		fn_port "header"
 		fn_port "Game" port udp
-		fn_port "Query" queryport udp
+		fn_port "Query - Steam" queryport udp
+		fn_port "Query - Unreal 2" unreal2queryport udp
 		fn_port "Web Interface" httpport tcp
 		fn_port "LAN" lanport udp
-		fn_port "Steamworks P2P" steamworksport udp
 		fn_port "Steam" steamport udp
+
 	} | column -s $'\t' -t
 	echo -e ""
 	echo -e "${bold}${lightgreen}${servername} Web Interface${default}"
@@ -1504,7 +1505,7 @@ fn_info_messages_source() {
 		fn_port "Query" queryport tcp
 		fn_port "RCON" rconport tcp
 		fn_port "SourceTV" sourcetvport udp
-		# Will not show if unaviable
+		# Will not show if unavailable
 		if [ "${steamport}" == "0" ] || [ -v "${steamport}" ]; then
 			fn_port "Steam" steamport udp
 		fi
@@ -1570,9 +1571,9 @@ fn_info_messages_ts3() {
 		fn_port "header"
 		fn_port "Voice" port udp
 		fn_port "Query" queryport tcp
-		fn_port "Query (SSH)" querysshport tcp
-		fn_port "Query (http)" queryhttpport tcp
-		fn_port "Query (https)" queryhttpsport tcp
+		fn_port "Query (SSH)" sshqueryport tcp
+		fn_port "Query (http)" httpqueryport tcp
+		fn_port "Query (https)" httpsqueryport tcp
 		fn_port "File Transfer" fileport tcp
 		fn_port "Telnet" telnetport tcp
 	} | column -s $'\t' -t
@@ -1618,7 +1619,7 @@ fn_info_messages_ut2k4() {
 		fn_port "header"
 		fn_port "Game" port udp
 		fn_port "Query" queryport udp
-		fn_port "Query (GameSpy)" queryportgs udp
+		fn_port "Query (GameSpy)" gamespyqueryport udp
 		fn_port "Web Interface" httpport tcp
 		fn_port "LAN" lanport udp
 	} | column -s $'\t' -t

From 8032eca4b1ea17fb40efb7ada9617eafb4a5fd15 Mon Sep 17 00:00:00 2001
From: Daniel Gibbs <me@danielgibbs.co.uk>
Date: Sat, 21 Sep 2024 23:22:07 +0100
Subject: [PATCH 132/154] feat(kf): Migrate to using valve query

---
 .../config-lgsm/kfserver/_default.cfg             |  2 +-
 lgsm/modules/info_game.sh                         | 15 ++++++++++-----
 lgsm/modules/info_messages.sh                     |  6 +++---
 3 files changed, 14 insertions(+), 9 deletions(-)

diff --git a/lgsm/config-default/config-lgsm/kfserver/_default.cfg b/lgsm/config-default/config-lgsm/kfserver/_default.cfg
index d9df57d3e..222ba9979 100644
--- a/lgsm/config-default/config-lgsm/kfserver/_default.cfg
+++ b/lgsm/config-default/config-lgsm/kfserver/_default.cfg
@@ -146,7 +146,7 @@ stopmode="2"
 # 4: gsquery
 # 5: tcp
 querymode="2"
-querytype="protocol-unreal2"
+querytype="protocol-valve"
 
 ## Console type
 consoleverbose="yes"
diff --git a/lgsm/modules/info_game.sh b/lgsm/modules/info_game.sh
index 5875627ca..8496f078f 100644
--- a/lgsm/modules/info_game.sh
+++ b/lgsm/modules/info_game.sh
@@ -496,12 +496,13 @@ fn_info_game_kf() {
 		fn_info_game_ini "lanport" "LANServerPort"
 		fn_info_game_ini "maxplayers" "MaxPlayers"
 		fn_info_game_ini "port" "Port"
-		fn_info_game_ini "gamespyqueryport" "QueryPort"
+		fn_info_game_ini "gamespyqueryport" "OldQueryPortNumber"
 		fn_info_game_ini "servername" "ServerName"
 		fn_info_game_ini "serverpassword" "GamePassword"
 	fi
 	adminpassword="${adminpassword:-"NOT SET"}"
 	defaultmap="${defaultmap:-"NOT SET"}"
+	gamespyqueryport="${gamespyqueryport:-"0"}" # Gamespy Query Port
 	httpenabled="${httpenabled:-"NOT SET"}"
 	httppassword="${adminpassword}"
 	httpport="${httpport:-"0"}"
@@ -509,12 +510,11 @@ fn_info_game_kf() {
 	lanport="${lanport:-"0"}"
 	maxplayers="${maxplayers:-"0"}"
 	port="${port:-"0"}"
-	queryport="$((port + 1))"
-	gamespyqueryport="${gamespyqueryport:-"0"}"
+	queryport=$((28902 + (port - 7757))) # Valve Query Port
 	servername="${servername:-"NOT SET"}"
 	serverpassword="${serverpassword:-"NOT SET"}"
-	steamport="28852"
-	steamworksport="20560"
+	steamport="20610"
+	unreal2queryport="$((port + 1))" # Unreal2 Query Port
 }
 
 # Config Type: ini
@@ -1761,6 +1761,11 @@ fn_info_game_qw() {
 	servername="${servername:-"NOT SET"}"
 }
 
+# Config Type: ini
+# Parameters: true
+# Comment: ; or #
+# Example: ServerName=SERVERNAME
+# Filetype: ini
 fn_info_game_ro() {
 	if [ -f "${servercfgfullpath}" ]; then
 		fn_info_game_ini "adminpassword" "AdminPassword"
diff --git a/lgsm/modules/info_messages.sh b/lgsm/modules/info_messages.sh
index 94c192361..b3fb5f47d 100644
--- a/lgsm/modules/info_messages.sh
+++ b/lgsm/modules/info_messages.sh
@@ -1129,11 +1129,11 @@ fn_info_messages_kf() {
 	{
 		fn_port "header"
 		fn_port "Game" port udp
-		fn_port "Query" queryport udp
-		fn_port "Query (GameSpy)" gamespyqueryport udp
+		fn_port "Query - Steam" queryport udp
+		fn_port "Query - Unreal 2" unreal2queryport udp
+		fn_port "Query - Gamespy" gamespyqueryport udp
 		fn_port "Web Interface" httpport tcp
 		fn_port "LAN" lanport udp
-		fn_port "Steamworks P2P" steamworksport udp
 		fn_port "Steam" steamport udp
 	} | column -s $'\t' -t
 	echo -e ""

From 93ecefbc42a81b9902ccfa8e66d3a6941d03c66d Mon Sep 17 00:00:00 2001
From: Daniel Gibbs <me@danielgibbs.co.uk>
Date: Sat, 21 Sep 2024 23:35:34 +0100
Subject: [PATCH 133/154] feat(ut2k4): Update details to match other unreal 2
 servers

---
 lgsm/modules/info_messages.sh | 4 ++--
 1 file changed, 2 insertions(+), 2 deletions(-)

diff --git a/lgsm/modules/info_messages.sh b/lgsm/modules/info_messages.sh
index b3fb5f47d..7f40c8312 100644
--- a/lgsm/modules/info_messages.sh
+++ b/lgsm/modules/info_messages.sh
@@ -1618,8 +1618,8 @@ fn_info_messages_ut2k4() {
 	{
 		fn_port "header"
 		fn_port "Game" port udp
-		fn_port "Query" queryport udp
-		fn_port "Query (GameSpy)" gamespyqueryport udp
+		fn_port "Query - Unreal 2" queryport udp
+		fn_port "Query - Gamespy" gamespyqueryport udp
 		fn_port "Web Interface" httpport tcp
 		fn_port "LAN" lanport udp
 	} | column -s $'\t' -t

From fdde2de54a0ab8ebe1cbcf31d99122376414c1fd Mon Sep 17 00:00:00 2001
From: Daniel Gibbs <me@danielgibbs.co.uk>
Date: Sun, 22 Sep 2024 10:41:30 +0100
Subject: [PATCH 134/154] chore: update distro versions

---
 .github/ISSUE_TEMPLATE/bug_report.yml      | 6 +-----
 .github/ISSUE_TEMPLATE/feature_request.yml | 6 +-----
 2 files changed, 2 insertions(+), 10 deletions(-)

diff --git a/.github/ISSUE_TEMPLATE/bug_report.yml b/.github/ISSUE_TEMPLATE/bug_report.yml
index 2b339d122..e9f2d000b 100644
--- a/.github/ISSUE_TEMPLATE/bug_report.yml
+++ b/.github/ISSUE_TEMPLATE/bug_report.yml
@@ -30,17 +30,13 @@ body:
       label: Linux distro
       multiple: true
       options:
+        - Ubuntu 24.04
         - Ubuntu 22.04
         - Ubuntu 20.04
-        - Ubuntu 18.04
-        - Ubuntu 16.04
         - Debian 12
         - Debian 11
-        - Debian 10
-        - Debian 9
         - RedHat 9
         - RedHat 8
-        - RedHat 7
         - Other
     validations:
       required: true
diff --git a/.github/ISSUE_TEMPLATE/feature_request.yml b/.github/ISSUE_TEMPLATE/feature_request.yml
index 45aced3d1..f1a8ccaf6 100644
--- a/.github/ISSUE_TEMPLATE/feature_request.yml
+++ b/.github/ISSUE_TEMPLATE/feature_request.yml
@@ -30,17 +30,13 @@ body:
       label: Linux distro
       multiple: true
       options:
+        - Ubuntu 24.04
         - Ubuntu 22.04
         - Ubuntu 20.04
-        - Ubuntu 18.04
-        - Ubuntu 16.04
         - Debian 12
         - Debian 11
-        - Debian 10
-        - Debian 9
         - RedHat 9
         - RedHat 8
-        - RedHat 7
         - Other
     validations:
       required: false

From f5369ca901ac68df8d32e51d2b256a9744e36750 Mon Sep 17 00:00:00 2001
From: Daniel Gibbs <me@danielgibbs.co.uk>
Date: Sun, 22 Sep 2024 10:44:41 +0100
Subject: [PATCH 135/154] fix: Change http to https in comment

---
 lgsm/modules/alert.sh                         |  2 +-
 lgsm/modules/alert_discord.sh                 |  2 +-
 lgsm/modules/alert_email.sh                   |  2 +-
 lgsm/modules/alert_gotify.sh                  |  2 +-
 lgsm/modules/alert_ifttt.sh                   |  2 +-
 lgsm/modules/alert_pushbullet.sh              |  2 +-
 lgsm/modules/alert_pushover.sh                |  2 +-
 lgsm/modules/alert_rocketchat.sh              |  2 +-
 lgsm/modules/alert_slack.sh                   |  2 +-
 lgsm/modules/alert_telegram.sh                |  2 +-
 lgsm/modules/check.sh                         |  2 +-
 lgsm/modules/check_config.sh                  |  2 +-
 lgsm/modules/check_deps.sh                    |  2 +-
 lgsm/modules/check_executable.sh              |  2 +-
 lgsm/modules/check_gamedig.sh                 |  2 +-
 lgsm/modules/check_glibc.sh                   |  2 +-
 lgsm/modules/check_ip.sh                      |  2 +-
 lgsm/modules/check_last_update.sh             |  2 +-
 lgsm/modules/check_logs.sh                    |  2 +-
 lgsm/modules/check_permissions.sh             |  2 +-
 lgsm/modules/check_root.sh                    |  2 +-
 lgsm/modules/check_status.sh                  |  2 +-
 lgsm/modules/check_steamcmd.sh                |  2 +-
 lgsm/modules/check_system_dir.sh              |  2 +-
 lgsm/modules/check_system_requirements.sh     |  2 +-
 lgsm/modules/check_tmuxception.sh             |  2 +-
 lgsm/modules/check_version.sh                 |  2 +-
 lgsm/modules/command_backup.sh                |  2 +-
 lgsm/modules/command_check_update.sh          |  2 +-
 lgsm/modules/command_console.sh               |  2 +-
 lgsm/modules/command_debug.sh                 |  2 +-
 lgsm/modules/command_details.sh               |  2 +-
 lgsm/modules/command_dev_clear_modules.sh     |  2 +-
 lgsm/modules/command_dev_debug.sh             |  2 +-
 lgsm/modules/command_dev_detect_deps.sh       |  2 +-
 lgsm/modules/command_dev_detect_glibc.sh      |  2 +-
 lgsm/modules/command_dev_detect_ldd.sh        |  2 +-
 .../command_dev_parse_distro_details.sh       | 20 +++++++++----------
 .../modules/command_dev_parse_game_details.sh |  2 +-
 lgsm/modules/command_dev_query_raw.sh         |  2 +-
 lgsm/modules/command_fastdl.sh                |  2 +-
 lgsm/modules/command_install.sh               |  2 +-
 lgsm/modules/command_install_resources_mta.sh |  2 +-
 lgsm/modules/command_mods_install.sh          |  2 +-
 lgsm/modules/command_mods_remove.sh           |  2 +-
 lgsm/modules/command_mods_update.sh           |  2 +-
 lgsm/modules/command_monitor.sh               |  2 +-
 lgsm/modules/command_postdetails.sh           |  2 +-
 lgsm/modules/command_restart.sh               |  2 +-
 lgsm/modules/command_send.sh                  |  2 +-
 lgsm/modules/command_skeleton.sh              |  2 +-
 lgsm/modules/command_sponsor.sh               |  2 +-
 lgsm/modules/command_start.sh                 |  2 +-
 lgsm/modules/command_stop.sh                  |  2 +-
 lgsm/modules/command_test_alert.sh            |  2 +-
 lgsm/modules/command_ts3_server_pass.sh       |  2 +-
 lgsm/modules/command_update.sh                |  2 +-
 lgsm/modules/command_update_linuxgsm.sh       |  2 +-
 lgsm/modules/command_validate.sh              |  2 +-
 lgsm/modules/command_wipe.sh                  |  2 +-
 lgsm/modules/compress_unreal2_maps.sh         |  2 +-
 lgsm/modules/compress_ut99_maps.sh            |  2 +-
 lgsm/modules/core_dl.sh                       |  2 +-
 lgsm/modules/core_exit.sh                     |  2 +-
 lgsm/modules/core_getopt.sh                   |  2 +-
 lgsm/modules/core_github.sh                   |  2 +-
 lgsm/modules/core_legacy.sh                   |  2 +-
 lgsm/modules/core_logs.sh                     |  2 +-
 lgsm/modules/core_messages.sh                 |  2 +-
 lgsm/modules/core_modules.sh                  |  2 +-
 lgsm/modules/core_steamcmd.sh                 |  2 +-
 lgsm/modules/core_trap.sh                     |  2 +-
 lgsm/modules/fix.sh                           |  2 +-
 lgsm/modules/fix_ark.sh                       |  2 +-
 lgsm/modules/fix_arma3.sh                     |  2 +-
 lgsm/modules/fix_armar.sh                     |  2 +-
 lgsm/modules/fix_av.sh                        |  2 +-
 lgsm/modules/fix_bo.sh                        |  2 +-
 lgsm/modules/fix_bt.sh                        |  2 +-
 lgsm/modules/fix_cmw.sh                       |  2 +-
 lgsm/modules/fix_csgo.sh                      |  2 +-
 lgsm/modules/fix_dst.sh                       |  2 +-
 lgsm/modules/fix_hw.sh                        |  2 +-
 lgsm/modules/fix_ins.sh                       |  2 +-
 lgsm/modules/fix_kf.sh                        |  2 +-
 lgsm/modules/fix_kf2.sh                       |  2 +-
 lgsm/modules/fix_mcb.sh                       |  2 +-
 lgsm/modules/fix_mta.sh                       |  2 +-
 lgsm/modules/fix_nmrih.sh                     |  2 +-
 lgsm/modules/fix_onset.sh                     |  2 +-
 lgsm/modules/fix_pvr.sh                       |  2 +-
 lgsm/modules/fix_ro.sh                        |  2 +-
 lgsm/modules/fix_rust.sh                      |  2 +-
 lgsm/modules/fix_rw.sh                        |  2 +-
 lgsm/modules/fix_samp.sh                      |  2 +-
 lgsm/modules/fix_sdtd.sh                      |  2 +-
 lgsm/modules/fix_sfc.sh                       |  2 +-
 lgsm/modules/fix_sm.sh                        |  2 +-
 lgsm/modules/fix_sof2.sh                      |  2 +-
 lgsm/modules/fix_squad.sh                     |  2 +-
 lgsm/modules/fix_st.sh                        |  2 +-
 lgsm/modules/fix_steamcmd.sh                  |  2 +-
 lgsm/modules/fix_terraria.sh                  |  2 +-
 lgsm/modules/fix_tf2.sh                       |  2 +-
 lgsm/modules/fix_ts3.sh                       |  2 +-
 lgsm/modules/fix_unt.sh                       |  2 +-
 lgsm/modules/fix_ut.sh                        |  2 +-
 lgsm/modules/fix_ut2k4.sh                     |  2 +-
 lgsm/modules/fix_ut3.sh                       |  2 +-
 lgsm/modules/fix_wurm.sh                      |  2 +-
 lgsm/modules/fix_xnt.sh                       |  2 +-
 lgsm/modules/fix_zmr.sh                       |  2 +-
 lgsm/modules/info_distro.sh                   |  6 +++---
 lgsm/modules/info_game.sh                     |  2 +-
 lgsm/modules/info_messages.sh                 |  2 +-
 lgsm/modules/info_stats.sh                    |  2 +-
 lgsm/modules/install_complete.sh              |  2 +-
 lgsm/modules/install_config.sh                |  2 +-
 lgsm/modules/install_dst_token.sh             |  2 +-
 lgsm/modules/install_eula.sh                  |  2 +-
 lgsm/modules/install_factorio_save.sh         |  2 +-
 lgsm/modules/install_gslt.sh                  |  2 +-
 lgsm/modules/install_header.sh                |  2 +-
 lgsm/modules/install_logs.sh                  |  2 +-
 lgsm/modules/install_mta_resources.sh         |  2 +-
 lgsm/modules/install_retry.sh                 |  2 +-
 lgsm/modules/install_server_dir.sh            |  2 +-
 lgsm/modules/install_server_files.sh          |  2 +-
 lgsm/modules/install_squad_license.sh         |  2 +-
 lgsm/modules/install_stats.sh                 |  2 +-
 lgsm/modules/install_steamcmd.sh              |  2 +-
 lgsm/modules/install_ts3db.sh                 |  2 +-
 lgsm/modules/install_ut2k4_key.sh             |  2 +-
 lgsm/modules/mods_core.sh                     |  2 +-
 lgsm/modules/mods_list.sh                     |  2 +-
 lgsm/modules/query_gamedig.sh                 |  2 +-
 lgsm/modules/query_gsquery.py                 |  2 +-
 lgsm/modules/update_fctr.sh                   |  2 +-
 lgsm/modules/update_jk2.sh                    |  2 +-
 lgsm/modules/update_mc.sh                     |  2 +-
 lgsm/modules/update_mcb.sh                    |  2 +-
 lgsm/modules/update_mta.sh                    |  2 +-
 lgsm/modules/update_pmc.sh                    |  2 +-
 lgsm/modules/update_steamcmd.sh               |  2 +-
 lgsm/modules/update_ts3.sh                    |  2 +-
 lgsm/modules/update_ut99.sh                   |  2 +-
 lgsm/modules/update_vints.sh                  |  2 +-
 lgsm/modules/update_xnt.sh                    |  2 +-
 148 files changed, 159 insertions(+), 159 deletions(-)

diff --git a/lgsm/modules/alert.sh b/lgsm/modules/alert.sh
index 40288d234..f2698e3b7 100644
--- a/lgsm/modules/alert.sh
+++ b/lgsm/modules/alert.sh
@@ -1,7 +1,7 @@
 #!/bin/bash
 # LinuxGSM alert.sh module
 # Author: Daniel Gibbs
-# Contributors: http://linuxgsm.com/contrib
+# Contributors: https://linuxgsm.com/contrib
 # Website: https://linuxgsm.com
 # Description: Overall module for managing alerts.
 
diff --git a/lgsm/modules/alert_discord.sh b/lgsm/modules/alert_discord.sh
index c98bef765..a447c498a 100644
--- a/lgsm/modules/alert_discord.sh
+++ b/lgsm/modules/alert_discord.sh
@@ -1,7 +1,7 @@
 #!/bin/bash
 # LinuxGSM alert_discord.sh module
 # Author: Daniel Gibbs
-# Contributors: http://linuxgsm.com/contrib
+# Contributors: https://linuxgsm.com/contrib
 # Website: https://linuxgsm.com
 # Description: Sends Discord alert.
 
diff --git a/lgsm/modules/alert_email.sh b/lgsm/modules/alert_email.sh
index 6833d9670..ca9db1bc4 100644
--- a/lgsm/modules/alert_email.sh
+++ b/lgsm/modules/alert_email.sh
@@ -1,7 +1,7 @@
 #!/bin/bash
 # LinuxGSM alert_email.sh module
 # Author: Daniel Gibbs
-# Contributors: http://linuxgsm.com/contrib
+# Contributors: https://linuxgsm.com/contrib
 # Website: https://linuxgsm.com
 # Description: Sends email alert.
 
diff --git a/lgsm/modules/alert_gotify.sh b/lgsm/modules/alert_gotify.sh
index 8f1d31e91..724ff1d79 100644
--- a/lgsm/modules/alert_gotify.sh
+++ b/lgsm/modules/alert_gotify.sh
@@ -1,7 +1,7 @@
 #!/bin/bash
 # LinuxGSM alert_gotify.sh module
 # Author: Daniel Gibbs
-# Contributors: http://linuxgsm.com/contrib
+# Contributors: https://linuxgsm.com/contrib
 # Website: https://linuxgsm.com
 # Description: Sends Gotify alert.
 
diff --git a/lgsm/modules/alert_ifttt.sh b/lgsm/modules/alert_ifttt.sh
index cbd740ec5..ca1c005d0 100644
--- a/lgsm/modules/alert_ifttt.sh
+++ b/lgsm/modules/alert_ifttt.sh
@@ -1,7 +1,7 @@
 #!/bin/bash
 # LinuxGSM alert_ifttt.sh module
 # Author: Daniel Gibbs
-# Contributors: http://linuxgsm.com/contrib
+# Contributors: https://linuxgsm.com/contrib
 # Website: https://linuxgsm.com
 # Description: Sends IFTTT alert.
 
diff --git a/lgsm/modules/alert_pushbullet.sh b/lgsm/modules/alert_pushbullet.sh
index 5ed3853f6..4b96a1f9f 100644
--- a/lgsm/modules/alert_pushbullet.sh
+++ b/lgsm/modules/alert_pushbullet.sh
@@ -1,7 +1,7 @@
 #!/bin/bash
 # LinuxGSM alert_pushbullet.sh module
 # Author: Daniel Gibbs
-# Contributors: http://linuxgsm.com/contrib
+# Contributors: https://linuxgsm.com/contrib
 # Website: https://linuxgsm.com
 # Description: Sends Pushbullet Messenger alert.
 
diff --git a/lgsm/modules/alert_pushover.sh b/lgsm/modules/alert_pushover.sh
index 22180d503..dc488026a 100644
--- a/lgsm/modules/alert_pushover.sh
+++ b/lgsm/modules/alert_pushover.sh
@@ -1,7 +1,7 @@
 #!/bin/bash
 # LinuxGSM alert_pushover.sh module
 # Author: Daniel Gibbs
-# Contributors: http://linuxgsm.com/contrib
+# Contributors: https://linuxgsm.com/contrib
 # Website: https://linuxgsm.com
 # Description: Sends Pushover alert.
 
diff --git a/lgsm/modules/alert_rocketchat.sh b/lgsm/modules/alert_rocketchat.sh
index 910722804..bff2c6a0b 100644
--- a/lgsm/modules/alert_rocketchat.sh
+++ b/lgsm/modules/alert_rocketchat.sh
@@ -1,7 +1,7 @@
 #!/bin/bash
 # LinuxGSM alert_rocketchat.sh module
 # Author: Daniel Gibbs
-# Contributors: http://linuxgsm.com/contrib
+# Contributors: https://linuxgsm.com/contrib
 # Website: https://linuxgsm.com
 # Description: Sends Rocketchat alert.
 
diff --git a/lgsm/modules/alert_slack.sh b/lgsm/modules/alert_slack.sh
index b74f98dec..58dc54772 100644
--- a/lgsm/modules/alert_slack.sh
+++ b/lgsm/modules/alert_slack.sh
@@ -1,7 +1,7 @@
 #!/bin/bash
 # LinuxGSM alert_slack.sh module
 # Author: Daniel Gibbs
-# Contributors: http://linuxgsm.com/contrib
+# Contributors: https://linuxgsm.com/contrib
 # Website: https://linuxgsm.com
 # Description: Sends Slack alert.
 
diff --git a/lgsm/modules/alert_telegram.sh b/lgsm/modules/alert_telegram.sh
index 98e1a980b..2e719dba7 100644
--- a/lgsm/modules/alert_telegram.sh
+++ b/lgsm/modules/alert_telegram.sh
@@ -1,7 +1,7 @@
 #!/bin/bash
 # LinuxGSM alert_telegram.sh module
 # Author: Daniel Gibbs
-# Contributors: http://linuxgsm.com/contrib
+# Contributors: https://linuxgsm.com/contrib
 # Website: https://linuxgsm.com
 # Description: Sends Telegram Messenger alert.
 
diff --git a/lgsm/modules/check.sh b/lgsm/modules/check.sh
index 2a63df3f3..7601898a9 100644
--- a/lgsm/modules/check.sh
+++ b/lgsm/modules/check.sh
@@ -1,7 +1,7 @@
 #!/bin/bash
 # LinuxGSM check.sh module
 # Author: Daniel Gibbs
-# Contributors: http://linuxgsm.com/contrib
+# Contributors: https://linuxgsm.com/contrib
 # Website: https://linuxgsm.com
 # Description: Overall module for managing checks.
 # Runs checks that will either halt on or fix an issue.
diff --git a/lgsm/modules/check_config.sh b/lgsm/modules/check_config.sh
index d8bfb5008..24bc1c37f 100644
--- a/lgsm/modules/check_config.sh
+++ b/lgsm/modules/check_config.sh
@@ -1,7 +1,7 @@
 #!/bin/bash
 # LinuxGSM check_config.sh module
 # Author: Daniel Gibbs
-# Contributors: http://linuxgsm.com/contrib
+# Contributors: https://linuxgsm.com/contrib
 # Website: https://linuxgsm.com
 # Description: Checks if the server config is missing and warns the user if needed.
 
diff --git a/lgsm/modules/check_deps.sh b/lgsm/modules/check_deps.sh
index df5cb9478..35145a11d 100644
--- a/lgsm/modules/check_deps.sh
+++ b/lgsm/modules/check_deps.sh
@@ -1,7 +1,7 @@
 #!/bin/bash
 # LinuxGSM check_deps.sh module
 # Author: Daniel Gibbs
-# Contributors: http://linuxgsm.com/contrib
+# Contributors: https://linuxgsm.com/contrib
 # Website: https://linuxgsm.com
 # Description: Checks and installs missing dependencies.
 
diff --git a/lgsm/modules/check_executable.sh b/lgsm/modules/check_executable.sh
index e7214ac33..5959c61aa 100644
--- a/lgsm/modules/check_executable.sh
+++ b/lgsm/modules/check_executable.sh
@@ -1,7 +1,7 @@
 #!/bin/bash
 # LinuxGSM check_executable.sh module
 # Author: Daniel Gibbs
-# Contributors: http://linuxgsm.com/contrib
+# Contributors: https://linuxgsm.com/contrib
 # Website: https://linuxgsm.com
 # Description: Checks if server executable exists.
 
diff --git a/lgsm/modules/check_gamedig.sh b/lgsm/modules/check_gamedig.sh
index 61149d567..b1913cf87 100644
--- a/lgsm/modules/check_gamedig.sh
+++ b/lgsm/modules/check_gamedig.sh
@@ -1,7 +1,7 @@
 #!/bin/bash
 # LinuxGSM check_gamedig.sh module
 # Author: Daniel Gibbs
-# Contributors: http://linuxgsm.com/contrib
+# Contributors: https://linuxgsm.com/contrib
 # Website: https://linuxgsm.com
 # Description: Installs nodejs and gamedig
 
diff --git a/lgsm/modules/check_glibc.sh b/lgsm/modules/check_glibc.sh
index 9da491bce..8b3d00658 100644
--- a/lgsm/modules/check_glibc.sh
+++ b/lgsm/modules/check_glibc.sh
@@ -1,7 +1,7 @@
 #!/bin/bash
 # LinuxGSM check_glibc.sh module
 # Author: Daniel Gibbs
-# Contributors: http://linuxgsm.com/contrib
+# Contributors: https://linuxgsm.com/contrib
 # Website: https://linuxgsm.com
 # Description: Checks if the server has the correct Glibc version.
 
diff --git a/lgsm/modules/check_ip.sh b/lgsm/modules/check_ip.sh
index bf0418f74..8f943c568 100644
--- a/lgsm/modules/check_ip.sh
+++ b/lgsm/modules/check_ip.sh
@@ -1,7 +1,7 @@
 #!/bin/bash
 # LinuxGSM check_ip.sh module
 # Author: Daniel Gibbs
-# Contributors: http://linuxgsm.com/contrib
+# Contributors: https://linuxgsm.com/contrib
 # Website: https://linuxgsm.com
 # Description: Automatically identifies the server interface IP.
 # If multiple interfaces are detected the user will need to manually set using ip="0.0.0.0".
diff --git a/lgsm/modules/check_last_update.sh b/lgsm/modules/check_last_update.sh
index 166d80a17..2686c6507 100644
--- a/lgsm/modules/check_last_update.sh
+++ b/lgsm/modules/check_last_update.sh
@@ -1,7 +1,7 @@
 #!/bin/bash
 # LinuxGSM check_last_update.sh module
 # Author: Daniel Gibbs
-# Contributors: http://linuxgsm.com/contrib
+# Contributors: https://linuxgsm.com/contrib
 # Website: https://linuxgsm.com
 # Description: Checks Lockfile to see when last update happened.
 # Will reboot server if instance not rebooted since update.
diff --git a/lgsm/modules/check_logs.sh b/lgsm/modules/check_logs.sh
index 036eea5e4..5e2d66c35 100644
--- a/lgsm/modules/check_logs.sh
+++ b/lgsm/modules/check_logs.sh
@@ -1,7 +1,7 @@
 #!/bin/bash
 # LinuxGSM check_logs.sh module
 # Author: Daniel Gibbs
-# Contributors: http://linuxgsm.com/contrib
+# Contributors: https://linuxgsm.com/contrib
 # Website: https://linuxgsm.com
 # Description: Checks if log files exist.
 
diff --git a/lgsm/modules/check_permissions.sh b/lgsm/modules/check_permissions.sh
index 44c527bfb..9ed1bb65e 100644
--- a/lgsm/modules/check_permissions.sh
+++ b/lgsm/modules/check_permissions.sh
@@ -1,7 +1,7 @@
 #!/bin/bash
 # LinuxGSM check_permissions.sh
 # Author: Daniel Gibbs
-# Contributors: http://linuxgsm.com/contrib
+# Contributors: https://linuxgsm.com/contrib
 # Website: https://linuxgsm.com
 # Description: Checks ownership & permissions of scripts, files and directories.
 
diff --git a/lgsm/modules/check_root.sh b/lgsm/modules/check_root.sh
index 8fe20764c..47825ddc9 100644
--- a/lgsm/modules/check_root.sh
+++ b/lgsm/modules/check_root.sh
@@ -1,7 +1,7 @@
 #!/bin/bash
 # LinuxGSM check_root.sh module
 # Author: Daniel Gibbs
-# Contributors: http://linuxgsm.com/contrib
+# Contributors: https://linuxgsm.com/contrib
 # Website: https://linuxgsm.com
 # Description: Checks if the user tried to run the script as root.
 
diff --git a/lgsm/modules/check_status.sh b/lgsm/modules/check_status.sh
index 906675e81..e017b89ec 100644
--- a/lgsm/modules/check_status.sh
+++ b/lgsm/modules/check_status.sh
@@ -1,7 +1,7 @@
 #!/bin/bash
 # LinuxGSM check_status.sh module
 # Author: Daniel Gibbs
-# Contributors: http://linuxgsm.com/contrib
+# Contributors: https://linuxgsm.com/contrib
 # Website: https://linuxgsm.com
 # Description: Checks the process status of the server. Either online or offline.
 
diff --git a/lgsm/modules/check_steamcmd.sh b/lgsm/modules/check_steamcmd.sh
index 5d14bb21f..0e7f5ce6c 100644
--- a/lgsm/modules/check_steamcmd.sh
+++ b/lgsm/modules/check_steamcmd.sh
@@ -1,7 +1,7 @@
 #!/bin/bash
 # LinuxGSM check_steamcmd.sh module
 # Author: Daniel Gibbs
-# Contributors: http://linuxgsm.com/contrib
+# Contributors: https://linuxgsm.com/contrib
 # Website: https://linuxgsm.com
 # Description: Checks if SteamCMD is installed correctly.
 
diff --git a/lgsm/modules/check_system_dir.sh b/lgsm/modules/check_system_dir.sh
index 2f57511fb..2b646835d 100644
--- a/lgsm/modules/check_system_dir.sh
+++ b/lgsm/modules/check_system_dir.sh
@@ -1,7 +1,7 @@
 #!/bin/bash
 # LinuxGSM check_system_dir.sh module
 # Author: Daniel Gibbs
-# Contributors: http://linuxgsm.com/contrib
+# Contributors: https://linuxgsm.com/contrib
 # Website: https://linuxgsm.com
 # Description: Checks if systemdir/serverfiles is accessible.
 
diff --git a/lgsm/modules/check_system_requirements.sh b/lgsm/modules/check_system_requirements.sh
index d25954427..a7314a0d8 100644
--- a/lgsm/modules/check_system_requirements.sh
+++ b/lgsm/modules/check_system_requirements.sh
@@ -1,7 +1,7 @@
 #!/bin/bash
 # LinuxGSM check_system_requirements.sh
 # Author: Daniel Gibbs
-# Contributors: http://linuxgsm.com/contrib
+# Contributors: https://linuxgsm.com/contrib
 # Website: https://linuxgsm.com
 # Description: Checks RAM requirements.
 
diff --git a/lgsm/modules/check_tmuxception.sh b/lgsm/modules/check_tmuxception.sh
index 8f1f94c73..fa0748c8b 100644
--- a/lgsm/modules/check_tmuxception.sh
+++ b/lgsm/modules/check_tmuxception.sh
@@ -1,7 +1,7 @@
 #!/bin/bash
 # LinuxGSM check_config.sh module
 # Author: Daniel Gibbs
-# Contributors: http://linuxgsm.com/contrib
+# Contributors: https://linuxgsm.com/contrib
 # Website: https://linuxgsm.com
 # Description: Checks if run from tmux or screen.
 
diff --git a/lgsm/modules/check_version.sh b/lgsm/modules/check_version.sh
index 5369fd832..b1e7f5584 100644
--- a/lgsm/modules/check_version.sh
+++ b/lgsm/modules/check_version.sh
@@ -1,7 +1,7 @@
 #!/bin/bash
 # LinuxGSM command_version.sh module
 # Author: Daniel Gibbs
-# Contributors: http://linuxgsm.com/contrib
+# Contributors: https://linuxgsm.com/contrib
 # Website: https://linuxgsm.com
 # Description: Will run update-lgsm if gameserver.sh and modules version does not match
 # this will allow gameserver.sh to update - useful for multi instance servers.
diff --git a/lgsm/modules/command_backup.sh b/lgsm/modules/command_backup.sh
index a3e1bbe7f..6bbc07f02 100644
--- a/lgsm/modules/command_backup.sh
+++ b/lgsm/modules/command_backup.sh
@@ -1,7 +1,7 @@
 #!/bin/bash
 # LinuxGSM command_backup.sh module
 # Author: Daniel Gibbs
-# Contributors: http://linuxgsm.com/contrib
+# Contributors: https://linuxgsm.com/contrib
 # Website: https://linuxgsm.com
 # Description: Creates a .tar.gz file in the backup directory.
 
diff --git a/lgsm/modules/command_check_update.sh b/lgsm/modules/command_check_update.sh
index 2e6855f7c..ee4c8ccb3 100644
--- a/lgsm/modules/command_check_update.sh
+++ b/lgsm/modules/command_check_update.sh
@@ -1,7 +1,7 @@
 #!/bin/bash
 # LinuxGSM command_check_update.sh module
 # Author: Daniel Gibbs
-# Contributors: http://linuxgsm.com/contrib
+# Contributors: https://linuxgsm.com/contrib
 # Website: https://linuxgsm.com
 # Description: Handles updating of servers.
 
diff --git a/lgsm/modules/command_console.sh b/lgsm/modules/command_console.sh
index a5d49d7f2..aa17e839e 100644
--- a/lgsm/modules/command_console.sh
+++ b/lgsm/modules/command_console.sh
@@ -1,7 +1,7 @@
 #!/bin/bash
 # LinuxGSM command_console.sh module
 # Author: Daniel Gibbs
-# Contributors: http://linuxgsm.com/contrib
+# Contributors: https://linuxgsm.com/contrib
 # Website: https://linuxgsm.com
 # Description: Gives access to the server tmux console.
 
diff --git a/lgsm/modules/command_debug.sh b/lgsm/modules/command_debug.sh
index 2e6c0e2e2..b5f2dabac 100644
--- a/lgsm/modules/command_debug.sh
+++ b/lgsm/modules/command_debug.sh
@@ -1,7 +1,7 @@
 #!/bin/bash
 # LinuxGSM command_debug.sh module
 # Author: Daniel Gibbs
-# Contributors: http://linuxgsm.com/contrib
+# Contributors: https://linuxgsm.com/contrib
 # Website: https://linuxgsm.com
 # Description: Runs the server without tmux and directly from the terminal.
 
diff --git a/lgsm/modules/command_details.sh b/lgsm/modules/command_details.sh
index ad55b1241..2800e5123 100644
--- a/lgsm/modules/command_details.sh
+++ b/lgsm/modules/command_details.sh
@@ -1,7 +1,7 @@
 #!/bin/bash
 # LinuxGSM command_details.sh module
 # Author: Daniel Gibbs
-# Contributors: http://linuxgsm.com/contrib
+# Contributors: https://linuxgsm.com/contrib
 # Website: https://linuxgsm.com
 # Description: Displays server information.
 
diff --git a/lgsm/modules/command_dev_clear_modules.sh b/lgsm/modules/command_dev_clear_modules.sh
index bf19b2578..e2e80164f 100644
--- a/lgsm/modules/command_dev_clear_modules.sh
+++ b/lgsm/modules/command_dev_clear_modules.sh
@@ -1,7 +1,7 @@
 #!/bin/bash
 # LinuxGSM command_dev_clear_modules.sh module
 # Author: Daniel Gibbs
-# Contributors: http://linuxgsm.com/contrib
+# Contributors: https://linuxgsm.com/contrib
 # Website: https://linuxgsm.com
 # Description: Deletes the contents of the modules dir.
 
diff --git a/lgsm/modules/command_dev_debug.sh b/lgsm/modules/command_dev_debug.sh
index eb0356985..3226fc186 100644
--- a/lgsm/modules/command_dev_debug.sh
+++ b/lgsm/modules/command_dev_debug.sh
@@ -1,7 +1,7 @@
 #!/bin/bash
 # LinuxGSM command_dev_debug.sh module
 # Author: Daniel Gibbs
-# Contributors: http://linuxgsm.com/contrib
+# Contributors: https://linuxgsm.com/contrib
 # Website: https://linuxgsm.com
 # Description: Dev only: Enables debugging log to be saved to dev-debug.log.
 
diff --git a/lgsm/modules/command_dev_detect_deps.sh b/lgsm/modules/command_dev_detect_deps.sh
index 6215fb897..fead2c285 100644
--- a/lgsm/modules/command_dev_detect_deps.sh
+++ b/lgsm/modules/command_dev_detect_deps.sh
@@ -1,7 +1,7 @@
 #!/bin/bash
 # LinuxGSM command_dev_detect_deps.sh module
 # Author: Daniel Gibbs
-# Contributors: http://linuxgsm.com/contrib
+# Contributors: https://linuxgsm.com/contrib
 # Website: https://linuxgsm.com
 # Description: Detects dependencies the server binary requires.
 
diff --git a/lgsm/modules/command_dev_detect_glibc.sh b/lgsm/modules/command_dev_detect_glibc.sh
index 214adc88e..6326cf5cb 100644
--- a/lgsm/modules/command_dev_detect_glibc.sh
+++ b/lgsm/modules/command_dev_detect_glibc.sh
@@ -1,7 +1,7 @@
 #!/bin/bash
 # LinuxGSM command_dev_detect_glibc.sh module
 # Author: Daniel Gibbs
-# Contributors: http://linuxgsm.com/contrib
+# Contributors: https://linuxgsm.com/contrib
 # Website: https://linuxgsm.com
 # Description: Automatically detects the version of GLIBC that is required.
 # Can check a file or directory recursively.
diff --git a/lgsm/modules/command_dev_detect_ldd.sh b/lgsm/modules/command_dev_detect_ldd.sh
index af41bb522..9d0bf5148 100644
--- a/lgsm/modules/command_dev_detect_ldd.sh
+++ b/lgsm/modules/command_dev_detect_ldd.sh
@@ -1,7 +1,7 @@
 #!/bin/bash
 # LinuxGSM command_dev_detect_ldd.sh module
 # Author: Daniel Gibbs
-# Contributors: http://linuxgsm.com/contrib
+# Contributors: https://linuxgsm.com/contrib
 # Website: https://linuxgsm.com
 # Description: Automatically detects required deps using ldd.
 # Can check a file or directory recursively.
diff --git a/lgsm/modules/command_dev_parse_distro_details.sh b/lgsm/modules/command_dev_parse_distro_details.sh
index ca2bfd9ed..f80c909ad 100644
--- a/lgsm/modules/command_dev_parse_distro_details.sh
+++ b/lgsm/modules/command_dev_parse_distro_details.sh
@@ -1,7 +1,7 @@
 #!/bin/bash
 # LinuxGSM command_dev_parse_distro_details.sh module
 # Author: Daniel Gibbs
-# Contributors: http://linuxgsm.com/contrib
+# Contributors: https://linuxgsm.com/contrib
 # Website: https://linuxgsm.com
 # Description: Display parsed distro details.
 
@@ -87,7 +87,7 @@ missing_details=""
 
 # Loop through the distro details and store them.
 for key in "${!server_details[@]}"; do
-    value=${server_details[$key]}
+	value=${server_details[$key]}
 	if [ -n "$value" ]; then
 		available_details+="${lightblue}${key}: ${default}${value}\n"
 	else
@@ -97,18 +97,18 @@ done
 
 # Sort and output the available distro details.
 if [ -n "$available_details" ]; then
-    echo -e ""
-    echo -e "${bold}${lightgreen}Available Distro Details${default}"
-    fn_messages_separator
-    echo -e "${available_details}" | sort
+	echo -e ""
+	echo -e "${bold}${lightgreen}Available Distro Details${default}"
+	fn_messages_separator
+	echo -e "${available_details}" | sort
 fi
 
 # Sort and output the missing distro details.
 if [ -n "$missing_details" ]; then
-    echo -e ""
-    echo -e "${lightgreen}Missing or unsupported Distro Details${default}"
-    fn_messages_separator
-    echo -e "${missing_details}" | sort
+	echo -e ""
+	echo -e "${lightgreen}Missing or unsupported Distro Details${default}"
+	fn_messages_separator
+	echo -e "${missing_details}" | sort
 fi
 
 core_exit.sh
diff --git a/lgsm/modules/command_dev_parse_game_details.sh b/lgsm/modules/command_dev_parse_game_details.sh
index 5938f817d..87284904c 100644
--- a/lgsm/modules/command_dev_parse_game_details.sh
+++ b/lgsm/modules/command_dev_parse_game_details.sh
@@ -1,7 +1,7 @@
 #!/bin/bash
 # LinuxGSM command_dev_parse_game_details.sh module
 # Author: Daniel Gibbs
-# Contributors: http://linuxgsm.com/contrib
+# Contributors: https://linuxgsm.com/contrib
 # Website: https://linuxgsm.com
 # Description: Display parsed gameserver details.
 
diff --git a/lgsm/modules/command_dev_query_raw.sh b/lgsm/modules/command_dev_query_raw.sh
index 39f4787d3..345298941 100644
--- a/lgsm/modules/command_dev_query_raw.sh
+++ b/lgsm/modules/command_dev_query_raw.sh
@@ -1,7 +1,7 @@
 #!/bin/bash
 # LinuxGSM command_dev_query_raw.sh module
 # Author: Daniel Gibbs
-# Contributors: http://linuxgsm.com/contrib
+# Contributors: https://linuxgsm.com/contrib
 # Website: https://linuxgsm.com
 # Description: Raw gamedig output of the server.
 
diff --git a/lgsm/modules/command_fastdl.sh b/lgsm/modules/command_fastdl.sh
index c1c667797..4e9378945 100644
--- a/lgsm/modules/command_fastdl.sh
+++ b/lgsm/modules/command_fastdl.sh
@@ -1,7 +1,7 @@
 #!/bin/bash
 # LinuxGSM command_fastdl.sh module
 # Author: Daniel Gibbs
-# Contributors: http://linuxgsm.com/contrib
+# Contributors: https://linuxgsm.com/contrib
 # Website: https://linuxgsm.com
 # Description: Creates a FastDL directory.
 
diff --git a/lgsm/modules/command_install.sh b/lgsm/modules/command_install.sh
index c3bf27c61..8dc9a77df 100644
--- a/lgsm/modules/command_install.sh
+++ b/lgsm/modules/command_install.sh
@@ -1,7 +1,7 @@
 #!/bin/bash
 # LinuxGSM command_install.sh module
 # Author: Daniel Gibbs
-# Contributors: http://linuxgsm.com/contrib
+# Contributors: https://linuxgsm.com/contrib
 # Website: https://linuxgsm.com
 # Description: Overall module for the installer.
 
diff --git a/lgsm/modules/command_install_resources_mta.sh b/lgsm/modules/command_install_resources_mta.sh
index 31a9165fd..aecda1452 100644
--- a/lgsm/modules/command_install_resources_mta.sh
+++ b/lgsm/modules/command_install_resources_mta.sh
@@ -1,7 +1,7 @@
 #!/bin/bash
 # LinuxGSM command_install_resources_mta.sh module
 # Author: Daniel Gibbs
-# Contributors: http://linuxgsm.com/contrib
+# Contributors: https://linuxgsm.com/contrib
 # Website: https://linuxgsm.com
 # Description: Installs the default resources for Multi Theft Auto.
 
diff --git a/lgsm/modules/command_mods_install.sh b/lgsm/modules/command_mods_install.sh
index 19de72ab0..d1b3fb67a 100644
--- a/lgsm/modules/command_mods_install.sh
+++ b/lgsm/modules/command_mods_install.sh
@@ -1,7 +1,7 @@
 #!/bin/bash
 # LinuxGSM command_mods_install.sh module
 # Author: Daniel Gibbs
-# Contributors: http://linuxgsm.com/contrib
+# Contributors: https://linuxgsm.com/contrib
 # Website: https://linuxgsm.com
 # Description: List and installs available mods along with mods_list.sh and mods_core.sh.
 
diff --git a/lgsm/modules/command_mods_remove.sh b/lgsm/modules/command_mods_remove.sh
index 5f70ac389..412e07546 100644
--- a/lgsm/modules/command_mods_remove.sh
+++ b/lgsm/modules/command_mods_remove.sh
@@ -1,7 +1,7 @@
 #!/bin/bash
 # LinuxGSM command_mods_uninstall.sh module
 # Author: Daniel Gibbs
-# Contributors: http://linuxgsm.com/contrib
+# Contributors: https://linuxgsm.com/contrib
 # Website: https://linuxgsm.com
 # Description: Uninstall mods along with mods_list.sh and mods_core.sh.
 
diff --git a/lgsm/modules/command_mods_update.sh b/lgsm/modules/command_mods_update.sh
index cd5c3b03f..ca81dd947 100644
--- a/lgsm/modules/command_mods_update.sh
+++ b/lgsm/modules/command_mods_update.sh
@@ -1,7 +1,7 @@
 #!/bin/bash
 # LinuxGSM command_mods_update.sh module
 # Author: Daniel Gibbs
-# Contributors: http://linuxgsm.com/contrib
+# Contributors: https://linuxgsm.com/contrib
 # Website: https://linuxgsm.com
 # Description: Updates installed mods along with mods_list.sh and mods_core.sh.
 
diff --git a/lgsm/modules/command_monitor.sh b/lgsm/modules/command_monitor.sh
index e9baf71e5..a9691fb98 100644
--- a/lgsm/modules/command_monitor.sh
+++ b/lgsm/modules/command_monitor.sh
@@ -1,7 +1,7 @@
 #!/bin/bash
 # LinuxGSM command_monitor.sh module
 # Author: Daniel Gibbs
-# Contributors: http://linuxgsm.com/contrib
+# Contributors: https://linuxgsm.com/contrib
 # Website: https://linuxgsm.com
 # Description: Monitors server by checking for running processes
 # then passes to gamedig and gsquery.
diff --git a/lgsm/modules/command_postdetails.sh b/lgsm/modules/command_postdetails.sh
index 3bfed78ed..6626d51a7 100644
--- a/lgsm/modules/command_postdetails.sh
+++ b/lgsm/modules/command_postdetails.sh
@@ -1,7 +1,7 @@
 #!/bin/bash
 # LinuxGSM command_postdetails.sh module
 # Author: Daniel Gibbs
-# Contributors: http://linuxgsm.com/contrib
+# Contributors: https://linuxgsm.com/contrib
 # Website: https://linuxgsm.com
 # Description: Strips sensitive information out of Details output.
 
diff --git a/lgsm/modules/command_restart.sh b/lgsm/modules/command_restart.sh
index 457d1d17f..0a7f9b5f0 100644
--- a/lgsm/modules/command_restart.sh
+++ b/lgsm/modules/command_restart.sh
@@ -1,7 +1,7 @@
 #!/bin/bash
 # LinuxGSM command_restart.sh module
 # Author: Daniel Gibbs
-# Contributors: http://linuxgsm.com/contrib
+# Contributors: https://linuxgsm.com/contrib
 # Website: https://linuxgsm.com
 # Description: Restarts the server.
 
diff --git a/lgsm/modules/command_send.sh b/lgsm/modules/command_send.sh
index cf6a9f08a..e31452707 100644
--- a/lgsm/modules/command_send.sh
+++ b/lgsm/modules/command_send.sh
@@ -1,7 +1,7 @@
 #!/bin/bash
 # LinuxGSM command_send.sh module
 # Author: Daniel Gibbs
-# Contributors: http://linuxgsm.com/contrib
+# Contributors: https://linuxgsm.com/contrib
 # Website: https://linuxgsm.com
 # Description: Send command to the server tmux console.
 
diff --git a/lgsm/modules/command_skeleton.sh b/lgsm/modules/command_skeleton.sh
index 48a6bd187..ca32610e9 100644
--- a/lgsm/modules/command_skeleton.sh
+++ b/lgsm/modules/command_skeleton.sh
@@ -1,7 +1,7 @@
 #!/bin/bash
 # LinuxGSM command_skeleton.sh module
 # Author: Daniel Gibbs
-# Contributors: http://linuxgsm.com/contrib
+# Contributors: https://linuxgsm.com/contrib
 # Website: https://linuxgsm.com
 # Description: Creates an copy of a game servers directorys.
 
diff --git a/lgsm/modules/command_sponsor.sh b/lgsm/modules/command_sponsor.sh
index ea49a3099..e7aeeda95 100755
--- a/lgsm/modules/command_sponsor.sh
+++ b/lgsm/modules/command_sponsor.sh
@@ -1,7 +1,7 @@
 #!/bin/bash
 # LinuxGSM command_sponsor.sh module
 # Author: Daniel Gibbs
-# Contributors: http://linuxgsm.com/contrib
+# Contributors: https://linuxgsm.com/contrib
 # Website: https://linuxgsm.com
 # Description: Shows ways to sponsor.
 
diff --git a/lgsm/modules/command_start.sh b/lgsm/modules/command_start.sh
index cca044518..c2be7ed2f 100644
--- a/lgsm/modules/command_start.sh
+++ b/lgsm/modules/command_start.sh
@@ -1,7 +1,7 @@
 #!/bin/bash
 # LinuxGSM command_start.sh module
 # Author: Daniel Gibbs
-# Contributors: http://linuxgsm.com/contrib
+# Contributors: https://linuxgsm.com/contrib
 # Website: https://linuxgsm.com
 # Description: Starts the server.
 
diff --git a/lgsm/modules/command_stop.sh b/lgsm/modules/command_stop.sh
index 7783cc94f..84f5998cd 100644
--- a/lgsm/modules/command_stop.sh
+++ b/lgsm/modules/command_stop.sh
@@ -1,7 +1,7 @@
 #!/bin/bash
 # LinuxGSM command_stop.sh module
 # Author: Daniel Gibbs
-# Contributors: http://linuxgsm.com/contrib
+# Contributors: https://linuxgsm.com/contrib
 # Website: https://linuxgsm.com
 # Description: Stops the server.
 
diff --git a/lgsm/modules/command_test_alert.sh b/lgsm/modules/command_test_alert.sh
index 15f481391..becb365a3 100644
--- a/lgsm/modules/command_test_alert.sh
+++ b/lgsm/modules/command_test_alert.sh
@@ -1,7 +1,7 @@
 #!/bin/bash
 # LinuxGSM command_test_alert.sh module
 # Author: Daniel Gibbs
-# Contributors: http://linuxgsm.com/contrib
+# Contributors: https://linuxgsm.com/contrib
 # Website: https://linuxgsm.com
 # Description: Sends a test alert.
 
diff --git a/lgsm/modules/command_ts3_server_pass.sh b/lgsm/modules/command_ts3_server_pass.sh
index 0223a877c..807d025b7 100644
--- a/lgsm/modules/command_ts3_server_pass.sh
+++ b/lgsm/modules/command_ts3_server_pass.sh
@@ -1,7 +1,7 @@
 #!/bin/bash
 # LinuxGSM command_ts3_server_pass.sh module
 # Author: Daniel Gibbs
-# Contributors: http://linuxgsm.com/contrib
+# Contributors: https://linuxgsm.com/contrib
 # Website: https://linuxgsm.com
 # Description: Changes TS3 serveradmin password.
 
diff --git a/lgsm/modules/command_update.sh b/lgsm/modules/command_update.sh
index a579cfe8e..6bb30a4c8 100644
--- a/lgsm/modules/command_update.sh
+++ b/lgsm/modules/command_update.sh
@@ -1,7 +1,7 @@
 #!/bin/bash
 # LinuxGSM command_update.sh module
 # Author: Daniel Gibbs
-# Contributors: http://linuxgsm.com/contrib
+# Contributors: https://linuxgsm.com/contrib
 # Website: https://linuxgsm.com
 # Description: Handles updating of servers.
 
diff --git a/lgsm/modules/command_update_linuxgsm.sh b/lgsm/modules/command_update_linuxgsm.sh
index 4358b626c..e6e5e711d 100644
--- a/lgsm/modules/command_update_linuxgsm.sh
+++ b/lgsm/modules/command_update_linuxgsm.sh
@@ -1,7 +1,7 @@
 #!/bin/bash
 # LinuxGSM command_update_linuxgsm.sh module
 # Author: Daniel Gibbs
-# Contributors: http://linuxgsm.com/contrib
+# Contributors: https://linuxgsm.com/contrib
 # Website: https://linuxgsm.com
 # Description: Deletes the modules dir to allow re-downloading of modules from GitHub.
 
diff --git a/lgsm/modules/command_validate.sh b/lgsm/modules/command_validate.sh
index d3511d7bb..e35749924 100644
--- a/lgsm/modules/command_validate.sh
+++ b/lgsm/modules/command_validate.sh
@@ -1,7 +1,7 @@
 #!/bin/bash
 # LinuxGSM command_validate.sh module
 # Author: Daniel Gibbs
-# Contributors: http://linuxgsm.com/contrib
+# Contributors: https://linuxgsm.com/contrib
 # Website: https://linuxgsm.com
 # Description: Runs a server validation.
 
diff --git a/lgsm/modules/command_wipe.sh b/lgsm/modules/command_wipe.sh
index 378dae0ec..daf9270e6 100644
--- a/lgsm/modules/command_wipe.sh
+++ b/lgsm/modules/command_wipe.sh
@@ -1,7 +1,7 @@
 #!/bin/bash
 # LinuxGSM command_backup.sh module
 # Author: Daniel Gibbs
-# Contributors: http://linuxgsm.com/contrib
+# Contributors: https://linuxgsm.com/contrib
 # Website: https://linuxgsm.com
 # Description: Wipes server data, useful after updates for some games like Rust.
 
diff --git a/lgsm/modules/compress_unreal2_maps.sh b/lgsm/modules/compress_unreal2_maps.sh
index f67ac7010..4469aca40 100644
--- a/lgsm/modules/compress_unreal2_maps.sh
+++ b/lgsm/modules/compress_unreal2_maps.sh
@@ -1,7 +1,7 @@
 #!/bin/bash
 # LinuxGSM compress_unreal2_maps.sh module
 # Author: Daniel Gibbs
-# Contributors: http://linuxgsm.com/contrib
+# Contributors: https://linuxgsm.com/contrib
 # Website: https://linuxgsm.com
 # Description: Compresses unreal maps.
 
diff --git a/lgsm/modules/compress_ut99_maps.sh b/lgsm/modules/compress_ut99_maps.sh
index 51bbd386a..23a93b3b7 100644
--- a/lgsm/modules/compress_ut99_maps.sh
+++ b/lgsm/modules/compress_ut99_maps.sh
@@ -1,7 +1,7 @@
 #!/bin/bash
 # LinuxGSM compress_ut99_maps.sh module
 # Author: Daniel Gibbs
-# Contributors: http://linuxgsm.com/contrib
+# Contributors: https://linuxgsm.com/contrib
 # Website: https://linuxgsm.com
 # Description: Compresses unreal maps.
 
diff --git a/lgsm/modules/core_dl.sh b/lgsm/modules/core_dl.sh
index 908c90f38..dde24d9da 100644
--- a/lgsm/modules/core_dl.sh
+++ b/lgsm/modules/core_dl.sh
@@ -1,7 +1,7 @@
 #!/bin/bash
 # LinuxGSM core_dl.sh module
 # Author: Daniel Gibbs
-# Contributors: http://linuxgsm.com/contrib
+# Contributors: https://linuxgsm.com/contrib
 # Website: https://linuxgsm.com
 # Description: Deals with all downloads for LinuxGSM.
 
diff --git a/lgsm/modules/core_exit.sh b/lgsm/modules/core_exit.sh
index 989a4c543..fd7645462 100644
--- a/lgsm/modules/core_exit.sh
+++ b/lgsm/modules/core_exit.sh
@@ -1,7 +1,7 @@
 #!/bin/bash
 # LinuxGSM core_exit.sh module
 # Author: Daniel Gibbs
-# Contributors: http://linuxgsm.com/contrib
+# Contributors: https://linuxgsm.com/contrib
 # Website: https://linuxgsm.com
 # Description: Handles exiting of LinuxGSM by running and reporting an exit code.
 
diff --git a/lgsm/modules/core_getopt.sh b/lgsm/modules/core_getopt.sh
index cd3e57cb5..688dcdc9c 100644
--- a/lgsm/modules/core_getopt.sh
+++ b/lgsm/modules/core_getopt.sh
@@ -1,7 +1,7 @@
 #!/bin/bash
 # LinuxGSM core_getopt.sh module
 # Author: Daniel Gibbs
-# Contributors: http://linuxgsm.com/contrib
+# Contributors: https://linuxgsm.com/contrib
 # Website: https://linuxgsm.com
 # Description: getopt arguments.
 
diff --git a/lgsm/modules/core_github.sh b/lgsm/modules/core_github.sh
index 402ee078c..3b3a96c0f 100644
--- a/lgsm/modules/core_github.sh
+++ b/lgsm/modules/core_github.sh
@@ -1,7 +1,7 @@
 #!/bin/bash
 # LinuxGSM core_github.sh module
 # Author: Daniel Gibbs
-# Contributors: http://linuxgsm.com/contrib
+# Contributors: https://linuxgsm.com/contrib
 # Website: https://linuxgsm.com
 # Description: core module file for updates via github
 
diff --git a/lgsm/modules/core_legacy.sh b/lgsm/modules/core_legacy.sh
index cf11e3a54..4c9a55c39 100644
--- a/lgsm/modules/core_legacy.sh
+++ b/lgsm/modules/core_legacy.sh
@@ -1,7 +1,7 @@
 #!/bin/bash
 # LinuxGSM core_legacy.sh module
 # Author: Daniel Gibbs
-# Contributors: http://linuxgsm.com/contrib
+# Contributors: https://linuxgsm.com/contrib
 # Website: https://linuxgsm.com
 # Description: Code for backwards compatability with older versions of LinuxGSM.
 
diff --git a/lgsm/modules/core_logs.sh b/lgsm/modules/core_logs.sh
index 3166041ae..7b435b563 100644
--- a/lgsm/modules/core_logs.sh
+++ b/lgsm/modules/core_logs.sh
@@ -1,7 +1,7 @@
 #!/bin/bash
 # LinuxGSM core_logs.sh module
 # Author: Daniel Gibbs
-# Contributors: http://linuxgsm.com/contrib
+# Contributors: https://linuxgsm.com/contrib
 # Website: https://linuxgsm.com
 # Description: Acts as a log rotator, removing old logs.
 
diff --git a/lgsm/modules/core_messages.sh b/lgsm/modules/core_messages.sh
index 52129dc4b..80ef293d8 100644
--- a/lgsm/modules/core_messages.sh
+++ b/lgsm/modules/core_messages.sh
@@ -1,7 +1,7 @@
 #!/bin/bash
 # LinuxGSM core_messages.sh module
 # Author: Daniel Gibbs
-# Contributors: http://linuxgsm.com/contrib
+# Contributors: https://linuxgsm.com/contrib
 # Website: https://linuxgsm.com
 # Description: Defines on-screen messages such as [  OK  ] and how script logs look.
 
diff --git a/lgsm/modules/core_modules.sh b/lgsm/modules/core_modules.sh
index abd9fe423..7726559cc 100644
--- a/lgsm/modules/core_modules.sh
+++ b/lgsm/modules/core_modules.sh
@@ -1,7 +1,7 @@
 #!/bin/bash
 # LinuxGSM core_modules.sh module
 # Author: Daniel Gibbs
-# Contributors: http://linuxgsm.com/contrib
+# Contributors: https://linuxgsm.com/contrib
 # Website: https://linuxgsm.com
 # Description: Defines all modules to allow download and execution of modules using fn_fetch_module.
 # This module is called first before any other module. Without this file other modules will not load.
diff --git a/lgsm/modules/core_steamcmd.sh b/lgsm/modules/core_steamcmd.sh
index 326fecf70..552ff1905 100644
--- a/lgsm/modules/core_steamcmd.sh
+++ b/lgsm/modules/core_steamcmd.sh
@@ -1,7 +1,7 @@
 #!/bin/bash
 # LinuxGSM core_steamcmd.sh module
 # Author: Daniel Gibbs
-# Contributors: http://linuxgsm.com/contrib
+# Contributors: https://linuxgsm.com/contrib
 # Website: https://linuxgsm.com
 # Description: Core modules for SteamCMD
 
diff --git a/lgsm/modules/core_trap.sh b/lgsm/modules/core_trap.sh
index ea6fce869..4b66b3937 100644
--- a/lgsm/modules/core_trap.sh
+++ b/lgsm/modules/core_trap.sh
@@ -1,7 +1,7 @@
 #!/bin/bash
 # LinuxGSM core_trap.sh module
 # Author: Daniel Gibbs
-# Contributors: http://linuxgsm.com/contrib
+# Contributors: https://linuxgsm.com/contrib
 # Website: https://linuxgsm.com
 # Description: Handles CTRL-C trap to give an exit code.
 
diff --git a/lgsm/modules/fix.sh b/lgsm/modules/fix.sh
index 6335659f1..f9628a335 100644
--- a/lgsm/modules/fix.sh
+++ b/lgsm/modules/fix.sh
@@ -1,7 +1,7 @@
 #!/bin/bash
 # LinuxGSM fix.sh module
 # Author: Daniel Gibbs
-# Contributors: http://linuxgsm.com/contrib
+# Contributors: https://linuxgsm.com/contrib
 # Website: https://linuxgsm.com
 # Description: Overall module for managing fixes.
 # Runs modules that will fix an issue.
diff --git a/lgsm/modules/fix_ark.sh b/lgsm/modules/fix_ark.sh
index 03e53380f..366d137dd 100644
--- a/lgsm/modules/fix_ark.sh
+++ b/lgsm/modules/fix_ark.sh
@@ -1,7 +1,7 @@
 #!/bin/bash
 # LinuxGSM fix_ark.sh module
 # Author: Daniel Gibbs
-# Contributors: http://linuxgsm.com/contrib
+# Contributors: https://linuxgsm.com/contrib
 # Website: https://linuxgsm.com
 # Description: Resolves issues with ARK: Survival Evolved.
 
diff --git a/lgsm/modules/fix_arma3.sh b/lgsm/modules/fix_arma3.sh
index b415b81d6..66f5ebe5d 100644
--- a/lgsm/modules/fix_arma3.sh
+++ b/lgsm/modules/fix_arma3.sh
@@ -1,7 +1,7 @@
 #!/bin/bash
 # LinuxGSM fix_arma3.sh module
 # Author: Daniel Gibbs
-# Contributors: http://linuxgsm.com/contrib
+# Contributors: https://linuxgsm.com/contrib
 # Website: https://linuxgsm.com
 # Description: Resolves issues with ARMA3.
 
diff --git a/lgsm/modules/fix_armar.sh b/lgsm/modules/fix_armar.sh
index ae2c08f33..c2bb8fbdb 100755
--- a/lgsm/modules/fix_armar.sh
+++ b/lgsm/modules/fix_armar.sh
@@ -1,7 +1,7 @@
 #!/bin/bash
 # LinuxGSM fix_armar.sh module
 # Author: Daniel Gibbs
-# Contributors: http://linuxgsm.com/contrib
+# Contributors: https://linuxgsm.com/contrib
 # Website: https://linuxgsm.com
 # Description: Resolves issues with Arma Reforger.
 
diff --git a/lgsm/modules/fix_av.sh b/lgsm/modules/fix_av.sh
index bfff59af6..ea225810c 100644
--- a/lgsm/modules/fix_av.sh
+++ b/lgsm/modules/fix_av.sh
@@ -1,7 +1,7 @@
 #!/bin/bash
 # LinuxGSM fix_av.sh module
 # Author: Daniel Gibbs
-# Contributors: http://linuxgsm.com/contrib
+# Contributors: https://linuxgsm.com/contrib
 # Website: https://linuxgsm.com
 # Description: Resolves issues with Avorion.
 
diff --git a/lgsm/modules/fix_bo.sh b/lgsm/modules/fix_bo.sh
index 24e76874e..5d74f27de 100644
--- a/lgsm/modules/fix_bo.sh
+++ b/lgsm/modules/fix_bo.sh
@@ -1,7 +1,7 @@
 #!/bin/bash
 # LinuxGSM fix_hw.sh module
 # Author: Daniel Gibbs
-# Contributors: http://linuxgsm.com/contrib
+# Contributors: https://linuxgsm.com/contrib
 # Website: https://linuxgsm.com
 # Description: Resolves issues with Ballistic Overkill.
 
diff --git a/lgsm/modules/fix_bt.sh b/lgsm/modules/fix_bt.sh
index 4d837a1ba..51fc3d505 100755
--- a/lgsm/modules/fix_bt.sh
+++ b/lgsm/modules/fix_bt.sh
@@ -1,7 +1,7 @@
 #!/bin/bash
 # LinuxGSM fix_bt.sh module
 # Author: Daniel Gibbs
-# Contributors: http://linuxgsm.com/contrib
+# Contributors: https://linuxgsm.com/contrib
 # Website: https://linuxgsm.com
 # Description: Resolves issues with Barotrauma.
 
diff --git a/lgsm/modules/fix_cmw.sh b/lgsm/modules/fix_cmw.sh
index a57c6c8cb..413bfbc33 100644
--- a/lgsm/modules/fix_cmw.sh
+++ b/lgsm/modules/fix_cmw.sh
@@ -1,7 +1,7 @@
 #!/bin/bash
 # LinuxGSM fix_cmw.sh module
 # Author: Daniel Gibbs
-# Contributors: http://linuxgsm.com/contrib
+# Contributors: https://linuxgsm.com/contrib
 # Website: https://linuxgsm.com
 # Description: Resolves issues with Chivalry: Medieval Warfare.
 
diff --git a/lgsm/modules/fix_csgo.sh b/lgsm/modules/fix_csgo.sh
index ea858ee3c..8f5550ab5 100644
--- a/lgsm/modules/fix_csgo.sh
+++ b/lgsm/modules/fix_csgo.sh
@@ -1,7 +1,7 @@
 #!/bin/bash
 # LinuxGSM fix_csgo.sh module
 # Author: Daniel Gibbs
-# Contributors: http://linuxgsm.com/contrib
+# Contributors: https://linuxgsm.com/contrib
 # Website: https://linuxgsm.com
 # Description: Resolves issues with Counter-Strike: Global Offensive.
 
diff --git a/lgsm/modules/fix_dst.sh b/lgsm/modules/fix_dst.sh
index ff963d342..2848fa5bb 100644
--- a/lgsm/modules/fix_dst.sh
+++ b/lgsm/modules/fix_dst.sh
@@ -1,7 +1,7 @@
 #!/bin/bash
 # LinuxGSM fix_dst.sh module
 # Author: Daniel Gibbs
-# Contributors: http://linuxgsm.com/contrib
+# Contributors: https://linuxgsm.com/contrib
 # Website: https://linuxgsm.com
 # Description: Resolves issues with Don't Starve Together.
 
diff --git a/lgsm/modules/fix_hw.sh b/lgsm/modules/fix_hw.sh
index 0e70b7195..c7d209bb6 100644
--- a/lgsm/modules/fix_hw.sh
+++ b/lgsm/modules/fix_hw.sh
@@ -1,7 +1,7 @@
 #!/bin/bash
 # LinuxGSM fix_hw.sh module
 # Author: Daniel Gibbs
-# Contributors: http://linuxgsm.com/contrib
+# Contributors: https://linuxgsm.com/contrib
 # Website: https://linuxgsm.com
 # Description: Resolves issues with Hurtworld.
 
diff --git a/lgsm/modules/fix_ins.sh b/lgsm/modules/fix_ins.sh
index cc79e3685..1d1423c6b 100644
--- a/lgsm/modules/fix_ins.sh
+++ b/lgsm/modules/fix_ins.sh
@@ -1,7 +1,7 @@
 #!/bin/bash
 # LinuxGSM fix_ins.sh module
 # Author: Daniel Gibbs
-# Contributors: http://linuxgsm.com/contrib
+# Contributors: https://linuxgsm.com/contrib
 # Website: https://linuxgsm.com
 # Description: Resolves issues with Insurgency.
 
diff --git a/lgsm/modules/fix_kf.sh b/lgsm/modules/fix_kf.sh
index e38b5883a..00b99e06c 100644
--- a/lgsm/modules/fix_kf.sh
+++ b/lgsm/modules/fix_kf.sh
@@ -1,7 +1,7 @@
 #!/bin/bash
 # LinuxGSM fix_kf.sh module
 # Author: Daniel Gibbs
-# Contributors: http://linuxgsm.com/contrib
+# Contributors: https://linuxgsm.com/contrib
 # Website: https://linuxgsm.com
 # Description: Resolves issues with Killing Floor.
 
diff --git a/lgsm/modules/fix_kf2.sh b/lgsm/modules/fix_kf2.sh
index cb4707414..495e9d70e 100644
--- a/lgsm/modules/fix_kf2.sh
+++ b/lgsm/modules/fix_kf2.sh
@@ -1,7 +1,7 @@
 #!/bin/bash
 # LinuxGSM fix_kf2.sh module
 # Author: Daniel Gibbs
-# Contributors: http://linuxgsm.com/contrib
+# Contributors: https://linuxgsm.com/contrib
 # Website: https://linuxgsm.com
 # Description: Resolves issues with Killing Floor 2.
 
diff --git a/lgsm/modules/fix_mcb.sh b/lgsm/modules/fix_mcb.sh
index 1e95bb4a8..bc84d84e1 100644
--- a/lgsm/modules/fix_mcb.sh
+++ b/lgsm/modules/fix_mcb.sh
@@ -1,7 +1,7 @@
 #!/bin/bash
 # LinuxGSM fix_mcb.sh module
 # Author: Daniel Gibbs
-# Contributors: http://linuxgsm.com/contrib
+# Contributors: https://linuxgsm.com/contrib
 # Website: https://linuxgsm.com
 # Description: Resolves various issues with Minecraft Bedrock.
 
diff --git a/lgsm/modules/fix_mta.sh b/lgsm/modules/fix_mta.sh
index 4e533eb51..2fff69691 100644
--- a/lgsm/modules/fix_mta.sh
+++ b/lgsm/modules/fix_mta.sh
@@ -1,7 +1,7 @@
 #!/bin/bash
 # LinuxGSM fix_mta.sh module
 # Author: Daniel Gibbs
-# Contributors: http://linuxgsm.com/contrib
+# Contributors: https://linuxgsm.com/contrib
 # Website: https://linuxgsm.com
 # Description: Resolves various issues with Multi Theft Auto.
 
diff --git a/lgsm/modules/fix_nmrih.sh b/lgsm/modules/fix_nmrih.sh
index dfbb76d92..4eb76c24e 100644
--- a/lgsm/modules/fix_nmrih.sh
+++ b/lgsm/modules/fix_nmrih.sh
@@ -1,7 +1,7 @@
 #!/bin/bash
 # LinuxGSM fix_nmrih.sh module
 # Author: Daniel Gibbs
-# Contributors: http://linuxgsm.com/contrib
+# Contributors: https://linuxgsm.com/contrib
 # Website: https://linuxgsm.com
 # Description: Create symlinks for renamed No More Room In Hell serverfiles.
 # Solution from Steam Community post: https://steamcommunity.com/app/224260/discussions/2/1732089092441769414/
diff --git a/lgsm/modules/fix_onset.sh b/lgsm/modules/fix_onset.sh
index 7d644ef7b..6430e5d6b 100644
--- a/lgsm/modules/fix_onset.sh
+++ b/lgsm/modules/fix_onset.sh
@@ -1,7 +1,7 @@
 #!/bin/bash
 # LinuxGSM fix_onset.sh module
 # Author: Daniel Gibbs
-# Contributors: http://linuxgsm.com/contrib
+# Contributors: https://linuxgsm.com/contrib
 # Website: https://linuxgsm.com
 # Description: Resolves various issues with Onset.
 
diff --git a/lgsm/modules/fix_pvr.sh b/lgsm/modules/fix_pvr.sh
index 6d8727e33..e4409bc37 100644
--- a/lgsm/modules/fix_pvr.sh
+++ b/lgsm/modules/fix_pvr.sh
@@ -1,7 +1,7 @@
 #!/bin/bash
 # LinuxGSM fix_pvr.sh module
 # Author: Daniel Gibbs
-# Contributors: http://linuxgsm.com/contrib
+# Contributors: https://linuxgsm.com/contrib
 # Website: https://linuxgsm.com
 # Description: Resolves various issues with Pavlov VR.
 
diff --git a/lgsm/modules/fix_ro.sh b/lgsm/modules/fix_ro.sh
index 21663a9ea..8b9bee442 100644
--- a/lgsm/modules/fix_ro.sh
+++ b/lgsm/modules/fix_ro.sh
@@ -1,7 +1,7 @@
 #!/bin/bash
 # LinuxGSM fix_ro.sh module
 # Author: Daniel Gibbs
-# Contributors: http://linuxgsm.com/contrib
+# Contributors: https://linuxgsm.com/contrib
 # Website: https://linuxgsm.com
 # Description: Resolves issues with Red Orchestra: Ostfront 41-45.
 
diff --git a/lgsm/modules/fix_rust.sh b/lgsm/modules/fix_rust.sh
index 809b5b1df..af995a2fa 100644
--- a/lgsm/modules/fix_rust.sh
+++ b/lgsm/modules/fix_rust.sh
@@ -1,7 +1,7 @@
 #!/bin/bash
 # LinuxGSM fix_rust.sh module
 # Author: Daniel Gibbs
-# Contributors: http://linuxgsm.com/contrib
+# Contributors: https://linuxgsm.com/contrib
 # Website: https://linuxgsm.com
 # Description: Resolves issues with Rust.
 
diff --git a/lgsm/modules/fix_rw.sh b/lgsm/modules/fix_rw.sh
index 17acf4def..dee15dedb 100644
--- a/lgsm/modules/fix_rw.sh
+++ b/lgsm/modules/fix_rw.sh
@@ -1,7 +1,7 @@
 #!/bin/bash
 # LinuxGSM fix_rw.sh module
 # Author: Daniel Gibbs
-# Contributors: http://linuxgsm.com/contrib
+# Contributors: https://linuxgsm.com/contrib
 # Website: https://linuxgsm.com
 # Description: Resolves issues with Rising World.
 
diff --git a/lgsm/modules/fix_samp.sh b/lgsm/modules/fix_samp.sh
index 0b5d0ab22..e193485d7 100644
--- a/lgsm/modules/fix_samp.sh
+++ b/lgsm/modules/fix_samp.sh
@@ -1,7 +1,7 @@
 #!/bin/bash
 # LinuxGSM fix_sfc.sh module
 # Author: Daniel Gibbs
-# Contributors: http://linuxgsm.com/contrib
+# Contributors: https://linuxgsm.com/contrib
 # Website: https://linuxgsm.com
 # Description: Resolves issue that the default rcon password is not changed.
 
diff --git a/lgsm/modules/fix_sdtd.sh b/lgsm/modules/fix_sdtd.sh
index 7988b0d67..2b4620687 100644
--- a/lgsm/modules/fix_sdtd.sh
+++ b/lgsm/modules/fix_sdtd.sh
@@ -1,7 +1,7 @@
 #!/bin/bash
 # LinuxGSM fix_sdtd.sh module
 # Author: Daniel Gibbs
-# Contributors: http://linuxgsm.com/contrib
+# Contributors: https://linuxgsm.com/contrib
 # Website: https://linuxgsm.com
 # Description: Resolves issues with 7 Days to Die.
 
diff --git a/lgsm/modules/fix_sfc.sh b/lgsm/modules/fix_sfc.sh
index 308f74b24..70e5d0484 100644
--- a/lgsm/modules/fix_sfc.sh
+++ b/lgsm/modules/fix_sfc.sh
@@ -1,7 +1,7 @@
 #!/bin/bash
 # LinuxGSM fix_sfc.sh module
 # Author: Daniel Gibbs
-# Contributors: http://linuxgsm.com/contrib
+# Contributors: https://linuxgsm.com/contrib
 # Website: https://linuxgsm.com
 # Description: Resolves issues with Source Forts Classic.
 
diff --git a/lgsm/modules/fix_sm.sh b/lgsm/modules/fix_sm.sh
index 1d72a48bf..d75ca8c78 100644
--- a/lgsm/modules/fix_sm.sh
+++ b/lgsm/modules/fix_sm.sh
@@ -1,7 +1,7 @@
 #!/bin/bash
 # LinuxGSM fix_sm.sh module
 # Author: Daniel Gibbs
-# Contributors: http://linuxgsm.com/contrib
+# Contributors: https://linuxgsm.com/contrib
 # Website: https://linuxgsm.com
 # Description: Resolves issues with Unturned.
 
diff --git a/lgsm/modules/fix_sof2.sh b/lgsm/modules/fix_sof2.sh
index 4e5b13624..45e3b299c 100644
--- a/lgsm/modules/fix_sof2.sh
+++ b/lgsm/modules/fix_sof2.sh
@@ -1,7 +1,7 @@
 #!/bin/bash
 # LinuxGSM fix_rust.sh module
 # Author: Daniel Gibbs
-# Contributors: http://linuxgsm.com/contrib
+# Contributors: https://linuxgsm.com/contrib
 # Website: https://linuxgsm.com
 # Description: Resolves issues with Soldier of Fortune 2.
 
diff --git a/lgsm/modules/fix_squad.sh b/lgsm/modules/fix_squad.sh
index 2fec57f0e..b9ee76a8d 100644
--- a/lgsm/modules/fix_squad.sh
+++ b/lgsm/modules/fix_squad.sh
@@ -1,7 +1,7 @@
 #!/bin/bash
 # LinuxGSM fix_squad.sh module
 # Author: Daniel Gibbs
-# Contributors: http://linuxgsm.com/contrib
+# Contributors: https://linuxgsm.com/contrib
 # Website: https://linuxgsm.com
 # Description: Resolves issues with Squad.
 
diff --git a/lgsm/modules/fix_st.sh b/lgsm/modules/fix_st.sh
index 4d100c6fc..bbd9890bd 100644
--- a/lgsm/modules/fix_st.sh
+++ b/lgsm/modules/fix_st.sh
@@ -1,7 +1,7 @@
 #!/bin/bash
 # LinuxGSM fix_rust.sh module
 # Author: Daniel Gibbs
-# Contributors: http://linuxgsm.com/contrib
+# Contributors: https://linuxgsm.com/contrib
 # Website: https://linuxgsm.com
 # Description: Resolves issues with Stationeers.
 
diff --git a/lgsm/modules/fix_steamcmd.sh b/lgsm/modules/fix_steamcmd.sh
index 2a2076072..0ba5c85b2 100644
--- a/lgsm/modules/fix_steamcmd.sh
+++ b/lgsm/modules/fix_steamcmd.sh
@@ -1,7 +1,7 @@
 #!/bin/bash
 # LinuxGSM fix_steamcmd.sh module
 # Author: Daniel Gibbs
-# Contributors: http://linuxgsm.com/contrib
+# Contributors: https://linuxgsm.com/contrib
 # Website: https://linuxgsm.com
 # Description: Resolves issues with SteamCMD.
 
diff --git a/lgsm/modules/fix_terraria.sh b/lgsm/modules/fix_terraria.sh
index dc734b6fd..0d45e257f 100644
--- a/lgsm/modules/fix_terraria.sh
+++ b/lgsm/modules/fix_terraria.sh
@@ -1,7 +1,7 @@
 #!/bin/bash
 # LinuxGSM fix_terraria.sh module
 # Author: Daniel Gibbs
-# Contributors: http://linuxgsm.com/contrib
+# Contributors: https://linuxgsm.com/contrib
 # Website: https://linuxgsm.com
 # Description: Resolves issues with Terraria.
 
diff --git a/lgsm/modules/fix_tf2.sh b/lgsm/modules/fix_tf2.sh
index fe7de8278..105026488 100644
--- a/lgsm/modules/fix_tf2.sh
+++ b/lgsm/modules/fix_tf2.sh
@@ -1,7 +1,7 @@
 #!/bin/bash
 # LinuxGSM fix_tf2.sh module
 # Author: Daniel Gibbs
-# Contributors: http://linuxgsm.com/contrib
+# Contributors: https://linuxgsm.com/contrib
 # Website: https://linuxgsm.com
 # Description: Resolves issues with Team Fortress 2.
 
diff --git a/lgsm/modules/fix_ts3.sh b/lgsm/modules/fix_ts3.sh
index 5c80aa15e..0f081cb37 100644
--- a/lgsm/modules/fix_ts3.sh
+++ b/lgsm/modules/fix_ts3.sh
@@ -1,7 +1,7 @@
 #!/bin/bash
 # LinuxGSM fix_ts3.sh module
 # Author: Daniel Gibbs
-# Contributors: http://linuxgsm.com/contrib
+# Contributors: https://linuxgsm.com/contrib
 # Website: https://linuxgsm.com
 # Description: Resolves issues with Teamspeak 3.
 
diff --git a/lgsm/modules/fix_unt.sh b/lgsm/modules/fix_unt.sh
index 9afdce337..dbe64ffd6 100644
--- a/lgsm/modules/fix_unt.sh
+++ b/lgsm/modules/fix_unt.sh
@@ -1,7 +1,7 @@
 #!/bin/bash
 # LinuxGSM fix_rust.sh module
 # Author: Daniel Gibbs
-# Contributors: http://linuxgsm.com/contrib
+# Contributors: https://linuxgsm.com/contrib
 # Website: https://linuxgsm.com
 # Description: Resolves issues with Unturned.
 
diff --git a/lgsm/modules/fix_ut.sh b/lgsm/modules/fix_ut.sh
index ded65ddad..3da5c068c 100644
--- a/lgsm/modules/fix_ut.sh
+++ b/lgsm/modules/fix_ut.sh
@@ -1,7 +1,7 @@
 #!/bin/bash
 # LinuxGSM fix_ut.sh module
 # Author: Daniel Gibbs
-# Contributors: http://linuxgsm.com/contrib
+# Contributors: https://linuxgsm.com/contrib
 # Website: https://linuxgsm.com
 # Description: Resolves issues with Unreal Tournament.
 
diff --git a/lgsm/modules/fix_ut2k4.sh b/lgsm/modules/fix_ut2k4.sh
index 5da1eee12..4b9d35011 100644
--- a/lgsm/modules/fix_ut2k4.sh
+++ b/lgsm/modules/fix_ut2k4.sh
@@ -1,7 +1,7 @@
 #!/bin/bash
 # LinuxGSM fix_ut2k4.sh module
 # Author: Daniel Gibbs
-# Contributors: http://linuxgsm.com/contrib
+# Contributors: https://linuxgsm.com/contrib
 # Website: https://linuxgsm.com
 # Description: Resolves issues with Unreal Tournament 2004.
 
diff --git a/lgsm/modules/fix_ut3.sh b/lgsm/modules/fix_ut3.sh
index 386833efc..aa5c5e464 100644
--- a/lgsm/modules/fix_ut3.sh
+++ b/lgsm/modules/fix_ut3.sh
@@ -1,7 +1,7 @@
 #!/bin/bash
 # LinuxGSM fix_ut2.sh module
 # Author: Daniel Gibbs
-# Contributors: http://linuxgsm.com/contrib
+# Contributors: https://linuxgsm.com/contrib
 # Website: https://linuxgsm.com
 # Description: Resolves issues with Unreal Tournament 3.
 
diff --git a/lgsm/modules/fix_wurm.sh b/lgsm/modules/fix_wurm.sh
index b6f5762f5..6f17ccd76 100644
--- a/lgsm/modules/fix_wurm.sh
+++ b/lgsm/modules/fix_wurm.sh
@@ -1,7 +1,7 @@
 #!/bin/bash
 # LinuxGSM fix_wurm.sh module
 # Author: Daniel Gibbs
-# Contributors: http://linuxgsm.com/contrib
+# Contributors: https://linuxgsm.com/contrib
 # Website: https://linuxgsm.com
 # Description: Resolves issues with Wurm Unlimited.
 
diff --git a/lgsm/modules/fix_xnt.sh b/lgsm/modules/fix_xnt.sh
index 218b99a66..44b51c5de 100644
--- a/lgsm/modules/fix_xnt.sh
+++ b/lgsm/modules/fix_xnt.sh
@@ -1,7 +1,7 @@
 #!/bin/bash
 # LinuxGSM fix_xnt.sh module
 # Author: Daniel Gibbs
-# Contributors: http://linuxgsm.com/contrib
+# Contributors: https://linuxgsm.com/contrib
 # Website: https://linuxgsm.com
 # Description: Install Xonotic Default Config
 
diff --git a/lgsm/modules/fix_zmr.sh b/lgsm/modules/fix_zmr.sh
index a88d82f34..5b42eeccf 100644
--- a/lgsm/modules/fix_zmr.sh
+++ b/lgsm/modules/fix_zmr.sh
@@ -1,7 +1,7 @@
 #!/bin/bash
 # LinuxGSM fix_sfc.sh module
 # Author: Daniel Gibbs
-# Contributors: http://linuxgsm.com/contrib
+# Contributors: https://linuxgsm.com/contrib
 # Website: https://linuxgsm.com
 # Description: Resolves issues with Zombie Master: Reborn.
 
diff --git a/lgsm/modules/info_distro.sh b/lgsm/modules/info_distro.sh
index adcdb759b..0813554dc 100644
--- a/lgsm/modules/info_distro.sh
+++ b/lgsm/modules/info_distro.sh
@@ -1,7 +1,7 @@
 #!/bin/bash
 # LinuxGSM info_distro.sh module
 # Author: Daniel Gibbs
-# Contributors: http://linuxgsm.com/contrib
+# Contributors: https://linuxgsm.com/contrib
 # Website: https://linuxgsm.com
 # Description: Variables providing useful info on the Operating System such as disk and performace info.
 # Used for command_details.sh, command_debug.sh and alert.sh.
@@ -29,8 +29,8 @@ kernel="$(uname -r)" # Kernel e.g. 2.6.32-042stab120.16
 distro_info_array=(os-release lsb_release hostnamectl debian_version redhat-release)
 for distro_info in "${distro_info_array[@]}"; do
 	if [ -f "/etc/os-release" ] && [ "${distro_info}" == "os-release" ]; then
-		distroname="$(grep "PRETTY_NAME" /etc/os-release | awk -F= '{gsub(/"/,"",$2);print $2}')"   # e.g. Ubuntu 22.04.3 LTS
-		distroversion="$(grep "VERSION_ID" /etc/os-release | awk -F= '{gsub(/"/,"",$2);print $2}')" # e.g. 22.04
+		distroname="$(grep "PRETTY_NAME" /etc/os-release | awk -F= '{gsub(/"/,"",$2);print $2}')"              # e.g. Ubuntu 22.04.3 LTS
+		distroversion="$(grep "VERSION_ID" /etc/os-release | awk -F= '{gsub(/"/,"",$2);print $2}')"            # e.g. 22.04
 		distroid="$(grep "ID=" /etc/os-release | grep -v _ID | awk -F= '{gsub(/"/,"",$2);print $2}')"          # e.g. ubuntu
 		distroidlike="$(grep "ID_LIKE=" /etc/os-release | grep -v _ID | awk -F= '{gsub(/"/,"",$2);print $2}')" # e.g. debian
 		distrocodename="$(grep "VERSION_CODENAME" /etc/os-release | awk -F= '{gsub(/"/,"",$2);print $2}')"     # e.g. jammy
diff --git a/lgsm/modules/info_game.sh b/lgsm/modules/info_game.sh
index 8496f078f..a9d9834b0 100644
--- a/lgsm/modules/info_game.sh
+++ b/lgsm/modules/info_game.sh
@@ -1,7 +1,7 @@
 #!/bin/bash
 # LinuxGSM info_game.sh module
 # Author: Daniel Gibbs
-# Contributors: http://linuxgsm.com/contrib
+# Contributors: https://linuxgsm.com/contrib
 # Website: https://linuxgsm.com
 # Description: Gathers various game server information.
 # !Note: When adding variables to this script, ensure that they are also added to the command_dev_parse_game_details.sh script.
diff --git a/lgsm/modules/info_messages.sh b/lgsm/modules/info_messages.sh
index 7f40c8312..ff4b5d870 100644
--- a/lgsm/modules/info_messages.sh
+++ b/lgsm/modules/info_messages.sh
@@ -1,7 +1,7 @@
 #!/bin/bash
 # LinuxGSM info_messages.sh module
 # Author: Daniel Gibbs
-# Contributors: http://linuxgsm.com/contrib
+# Contributors: https://linuxgsm.com/contrib
 # Website: https://linuxgsm.com
 # Description: Defines server info messages for details and alerts.
 
diff --git a/lgsm/modules/info_stats.sh b/lgsm/modules/info_stats.sh
index dcc247b59..c8a96552a 100644
--- a/lgsm/modules/info_stats.sh
+++ b/lgsm/modules/info_stats.sh
@@ -1,7 +1,7 @@
 #!/bin/bash
 # LinuxGSM info_stats.sh module
 # Author: Daniel Gibbs
-# Contributors: http://linuxgsm.com/contrib
+# Contributors: https://linuxgsm.com/contrib
 # Website: https://linuxgsm.com
 # Description: Collect optional Stats sent to LinuxGSM project.
 # Uses Google analytics.
diff --git a/lgsm/modules/install_complete.sh b/lgsm/modules/install_complete.sh
index 5a9873067..0ee01954a 100644
--- a/lgsm/modules/install_complete.sh
+++ b/lgsm/modules/install_complete.sh
@@ -1,7 +1,7 @@
 #!/bin/bash
 # LinuxGSM install_complete.sh module
 # Author: Daniel Gibbs
-# Contributors: http://linuxgsm.com/contrib
+# Contributors: https://linuxgsm.com/contrib
 # Website: https://linuxgsm.com
 # Description: Prints installation completion message and hints.
 
diff --git a/lgsm/modules/install_config.sh b/lgsm/modules/install_config.sh
index 96ae70654..1517812c1 100644
--- a/lgsm/modules/install_config.sh
+++ b/lgsm/modules/install_config.sh
@@ -1,7 +1,7 @@
 #!/bin/bash
 # LinuxGSM install_config.sh module
 # Author: Daniel Gibbs
-# Contributors: http://linuxgsm.com/contrib
+# Contributors: https://linuxgsm.com/contrib
 # Website: https://linuxgsm.com
 # Description: Creates default server configs.
 
diff --git a/lgsm/modules/install_dst_token.sh b/lgsm/modules/install_dst_token.sh
index 89ec00a90..fd0b4727b 100644
--- a/lgsm/modules/install_dst_token.sh
+++ b/lgsm/modules/install_dst_token.sh
@@ -1,7 +1,7 @@
 #!/bin/bash
 # LinuxGSM install_dst_token.sh module
 # Author: Daniel Gibbs
-# Contributors: http://linuxgsm.com/contrib
+# Contributors: https://linuxgsm.com/contrib
 # Website: https://linuxgsm.com
 # Description: Configures Don't Starve Together cluster with given token.
 
diff --git a/lgsm/modules/install_eula.sh b/lgsm/modules/install_eula.sh
index 7f7f95f35..272ff205a 100644
--- a/lgsm/modules/install_eula.sh
+++ b/lgsm/modules/install_eula.sh
@@ -1,7 +1,7 @@
 #!/bin/bash
 # LinuxGSM install_eula.sh module
 # Author: Daniel Gibbs
-# Contributors: http://linuxgsm.com/contrib
+# Contributors: https://linuxgsm.com/contrib
 # Website: https://linuxgsm.com
 # Description: Gets user to accept the EULA.
 
diff --git a/lgsm/modules/install_factorio_save.sh b/lgsm/modules/install_factorio_save.sh
index 589a9d8ed..5dfb4758c 100644
--- a/lgsm/modules/install_factorio_save.sh
+++ b/lgsm/modules/install_factorio_save.sh
@@ -1,7 +1,7 @@
 #!/bin/bash
 # LinuxGSM install_factorio_save.sh module
 # Author: Daniel Gibbs
-# Contributors: http://linuxgsm.com/contrib
+# Contributors: https://linuxgsm.com/contrib
 # Website: https://linuxgsm.com
 # Description: Creates the initial save file for Factorio.
 
diff --git a/lgsm/modules/install_gslt.sh b/lgsm/modules/install_gslt.sh
index aa8d89d33..960b1e20c 100644
--- a/lgsm/modules/install_gslt.sh
+++ b/lgsm/modules/install_gslt.sh
@@ -1,7 +1,7 @@
 #!/bin/bash
 # LinuxGSM install_gslt.sh module
 # Author: Daniel Gibbs
-# Contributors: http://linuxgsm.com/contrib
+# Contributors: https://linuxgsm.com/contrib
 # Website: https://linuxgsm.com
 # Description: Configures GSLT.
 
diff --git a/lgsm/modules/install_header.sh b/lgsm/modules/install_header.sh
index a7f1f9ddb..8fad78d2c 100644
--- a/lgsm/modules/install_header.sh
+++ b/lgsm/modules/install_header.sh
@@ -1,7 +1,7 @@
 #!/bin/bash
 # LinuxGSM install_header.sh module
 # Author: Daniel Gibbs
-# Contributors: http://linuxgsm.com/contrib
+# Contributors: https://linuxgsm.com/contrib
 # Website: https://linuxgsm.com
 # Description: Prints installation header.
 
diff --git a/lgsm/modules/install_logs.sh b/lgsm/modules/install_logs.sh
index 294bc1e46..3e522a082 100644
--- a/lgsm/modules/install_logs.sh
+++ b/lgsm/modules/install_logs.sh
@@ -1,7 +1,7 @@
 #!/bin/bash
 # LinuxGSM install_logs.sh module
 # Author: Daniel Gibbs
-# Contributors: http://linuxgsm.com/contrib
+# Contributors: https://linuxgsm.com/contrib
 # Website: https://linuxgsm.com
 # Description: Creates log directories.
 
diff --git a/lgsm/modules/install_mta_resources.sh b/lgsm/modules/install_mta_resources.sh
index bafdbdbf1..f13c39abd 100644
--- a/lgsm/modules/install_mta_resources.sh
+++ b/lgsm/modules/install_mta_resources.sh
@@ -1,7 +1,7 @@
 #!/bin/bash
 # LinuxGSM install_mta_resources.sh module
 # Author: Daniel Gibbs
-# Contributors: http://linuxgsm.com/contrib
+# Contributors: https://linuxgsm.com/contrib
 # Website: https://linuxgsm.com
 # Description: Installs the libmysqlclient for database functions on the server and optionally installs default resources required to run the server.
 
diff --git a/lgsm/modules/install_retry.sh b/lgsm/modules/install_retry.sh
index 1fc4bf36a..71417a73f 100644
--- a/lgsm/modules/install_retry.sh
+++ b/lgsm/modules/install_retry.sh
@@ -1,7 +1,7 @@
 #!/bin/bash
 # LinuxGSM install_retry.sh module
 # Author: Daniel Gibbs
-# Contributors: http://linuxgsm.com/contrib
+# Contributors: https://linuxgsm.com/contrib
 # Website: https://linuxgsm.com
 # Description: Asks for installation retry after failure.
 
diff --git a/lgsm/modules/install_server_dir.sh b/lgsm/modules/install_server_dir.sh
index 0703e0c54..2922f397a 100644
--- a/lgsm/modules/install_server_dir.sh
+++ b/lgsm/modules/install_server_dir.sh
@@ -1,7 +1,7 @@
 #!/bin/bash
 # LinuxGSM install_server_dir.sh module
 # Author: Daniel Gibbs
-# Contributors: http://linuxgsm.com/contrib
+# Contributors: https://linuxgsm.com/contrib
 # Website: https://linuxgsm.com
 # Description: Creates the server directory.
 
diff --git a/lgsm/modules/install_server_files.sh b/lgsm/modules/install_server_files.sh
index 7d773ce9f..33043d8b6 100644
--- a/lgsm/modules/install_server_files.sh
+++ b/lgsm/modules/install_server_files.sh
@@ -1,7 +1,7 @@
 #!/bin/bash
 # LinuxGSM install_server_files.sh module
 # Author: Daniel Gibbs
-# Contributors: http://linuxgsm.com/contrib
+# Contributors: https://linuxgsm.com/contrib
 # Website: https://linuxgsm.com
 # Description: Installs server files.
 
diff --git a/lgsm/modules/install_squad_license.sh b/lgsm/modules/install_squad_license.sh
index 28f4456a5..0bb71c4a8 100644
--- a/lgsm/modules/install_squad_license.sh
+++ b/lgsm/modules/install_squad_license.sh
@@ -1,7 +1,7 @@
 #!/bin/bash
 # LinuxGSM install_squad_license.sh module
 # Author: Daniel Gibbs
-# Contributors: http://linuxgsm.com/contrib
+# Contributors: https://linuxgsm.com/contrib
 # Website: https://linuxgsm.com
 # Description: Configures the Squad server's license.
 
diff --git a/lgsm/modules/install_stats.sh b/lgsm/modules/install_stats.sh
index 40a13434d..fa43c280f 100644
--- a/lgsm/modules/install_stats.sh
+++ b/lgsm/modules/install_stats.sh
@@ -1,7 +1,7 @@
 #!/bin/bash
 # LinuxGSM install_stats.sh module
 # Author: Daniel Gibbs
-# Contributors: http://linuxgsm.com/contrib
+# Contributors: https://linuxgsm.com/contrib
 # Website: https://linuxgsm.com
 # Description: Enabled LinuxGSM Stats.
 
diff --git a/lgsm/modules/install_steamcmd.sh b/lgsm/modules/install_steamcmd.sh
index 50599ebd5..475544a6a 100644
--- a/lgsm/modules/install_steamcmd.sh
+++ b/lgsm/modules/install_steamcmd.sh
@@ -1,7 +1,7 @@
 #!/bin/bash
 # LinuxGSM install_steamcmd.sh module
 # Author: Daniel Gibbs
-# Contributors: http://linuxgsm.com/contrib
+# Contributors: https://linuxgsm.com/contrib
 # Website: https://linuxgsm.com
 # Description: Downloads SteamCMD on install.
 
diff --git a/lgsm/modules/install_ts3db.sh b/lgsm/modules/install_ts3db.sh
index 464bd686a..c8f90a9cf 100644
--- a/lgsm/modules/install_ts3db.sh
+++ b/lgsm/modules/install_ts3db.sh
@@ -1,7 +1,7 @@
 #!/bin/bash
 # LinuxGSM install_ts3db.sh module
 # Author: Daniel Gibbs
-# Contributors: http://linuxgsm.com/contrib
+# Contributors: https://linuxgsm.com/contrib
 # Website: https://linuxgsm.com
 # Description: Installs the database server MariaDB for TeamSpeak 3.
 
diff --git a/lgsm/modules/install_ut2k4_key.sh b/lgsm/modules/install_ut2k4_key.sh
index 6fbd2a838..7ffbba20c 100644
--- a/lgsm/modules/install_ut2k4_key.sh
+++ b/lgsm/modules/install_ut2k4_key.sh
@@ -1,7 +1,7 @@
 #!/bin/bash
 # LinuxGSM install_ut2k4_key.sh module
 # Author: Daniel Gibbs
-# Contributors: http://linuxgsm.com/contrib
+# Contributors: https://linuxgsm.com/contrib
 # Website: https://linuxgsm.com
 # Description: Activates ut2k4 server with given key.
 
diff --git a/lgsm/modules/mods_core.sh b/lgsm/modules/mods_core.sh
index 1b85a95b3..aa24d903f 100644
--- a/lgsm/modules/mods_core.sh
+++ b/lgsm/modules/mods_core.sh
@@ -1,7 +1,7 @@
 #!/bin/bash
 # LinuxGSM command_mods_install.sh module
 # Author: Daniel Gibbs
-# Contributors: http://linuxgsm.com/contrib
+# Contributors: https://linuxgsm.com/contrib
 # Website: https://linuxgsm.com
 # Description: Core modules for mods list/install/update/remove
 
diff --git a/lgsm/modules/mods_list.sh b/lgsm/modules/mods_list.sh
index ca320e468..d6622d1b2 100644
--- a/lgsm/modules/mods_list.sh
+++ b/lgsm/modules/mods_list.sh
@@ -1,7 +1,7 @@
 #!/bin/bash
 # LinuxGSM mods_list.sh module
 # Author: Daniel Gibbs
-# Contributors: http://linuxgsm.com/contrib
+# Contributors: https://linuxgsm.com/contrib
 # Website: https://linuxgsm.com
 # Description: Lists and defines available mods for LinuxGSM supported servers; works along with mods_core.sh.
 # Usage: To add a mod, you need to add an array variable following the guide to set proper values;
diff --git a/lgsm/modules/query_gamedig.sh b/lgsm/modules/query_gamedig.sh
index efac18d45..f370fae97 100644
--- a/lgsm/modules/query_gamedig.sh
+++ b/lgsm/modules/query_gamedig.sh
@@ -1,7 +1,7 @@
 #!/bin/bash
 # LinuxGSM query_gamedig.sh module
 # Author: Daniel Gibbs
-# Contributors: http://linuxgsm.com/contrib
+# Contributors: https://linuxgsm.com/contrib
 # Website: https://linuxgsm.com
 # Description: Querys a gameserver using node-gamedig.
 # https://github.com/gamedig/node-gamedig
diff --git a/lgsm/modules/query_gsquery.py b/lgsm/modules/query_gsquery.py
index 788789f0a..ecdf8165c 100644
--- a/lgsm/modules/query_gsquery.py
+++ b/lgsm/modules/query_gsquery.py
@@ -2,7 +2,7 @@
 # -*- coding: utf-8 -*-
 # LinuxGSM query_gsquery.py module
 # Author: Daniel Gibbs
-# Contributors: http://linuxgsm.com/contrib
+# Contributors: https://linuxgsm.com/contrib
 # Website: https://linuxgsm.com
 # Description: Allows querying of various game servers.
 
diff --git a/lgsm/modules/update_fctr.sh b/lgsm/modules/update_fctr.sh
index 8fb78ede3..b64812319 100644
--- a/lgsm/modules/update_fctr.sh
+++ b/lgsm/modules/update_fctr.sh
@@ -1,7 +1,7 @@
 #!/bin/bash
 # LinuxGSM update_fctr.sh module
 # Author: Daniel Gibbs
-# Contributors: http://linuxgsm.com/contrib
+# Contributors: https://linuxgsm.com/contrib
 # Website: https://linuxgsm.com
 # Description: Handles updating of Factorio servers.
 
diff --git a/lgsm/modules/update_jk2.sh b/lgsm/modules/update_jk2.sh
index e2715c01c..ed4886a48 100644
--- a/lgsm/modules/update_jk2.sh
+++ b/lgsm/modules/update_jk2.sh
@@ -1,7 +1,7 @@
 #!/bin/bash
 # LinuxGSM update_jk2.sh module
 # Author: Daniel Gibbs
-# Contributors: http://linuxgsm.com/contrib
+# Contributors: https://linuxgsm.com/contrib
 # Website: https://linuxgsm.com
 # Description: Handles updating of Jedi Knight 2 servers.
 
diff --git a/lgsm/modules/update_mc.sh b/lgsm/modules/update_mc.sh
index 40038ddeb..6ece44da4 100644
--- a/lgsm/modules/update_mc.sh
+++ b/lgsm/modules/update_mc.sh
@@ -1,7 +1,7 @@
 #!/bin/bash
 # LinuxGSM update_mc.sh module
 # Author: Daniel Gibbs
-# Contributors: http://linuxgsm.com/contrib
+# Contributors: https://linuxgsm.com/contrib
 # Website: https://linuxgsm.com
 # Description: Handles updating of Minecraft: Java Edition servers.
 
diff --git a/lgsm/modules/update_mcb.sh b/lgsm/modules/update_mcb.sh
index 7bd273d66..55b3586fd 100644
--- a/lgsm/modules/update_mcb.sh
+++ b/lgsm/modules/update_mcb.sh
@@ -1,7 +1,7 @@
 #!/bin/bash
 # LinuxGSM update_mcb.sh module
 # Author: Daniel Gibbs
-# Contributors: http://linuxgsm.com/contrib
+# Contributors: https://linuxgsm.com/contrib
 # Website: https://linuxgsm.com
 # Description: Handles updating of Minecraft Bedrock servers.
 
diff --git a/lgsm/modules/update_mta.sh b/lgsm/modules/update_mta.sh
index c6f7dfcb0..b93dc9af1 100644
--- a/lgsm/modules/update_mta.sh
+++ b/lgsm/modules/update_mta.sh
@@ -1,7 +1,7 @@
 #!/bin/bash
 # LinuxGSM update_mta.sh module
 # Author: Daniel Gibbs
-# Contributors: http://linuxgsm.com/contrib
+# Contributors: https://linuxgsm.com/contrib
 # Website: https://linuxgsm.com
 # Description: Handles updating of Multi Theft Auto servers.
 
diff --git a/lgsm/modules/update_pmc.sh b/lgsm/modules/update_pmc.sh
index 5d44bee21..b3c7d0dc2 100644
--- a/lgsm/modules/update_pmc.sh
+++ b/lgsm/modules/update_pmc.sh
@@ -1,7 +1,7 @@
 #!/bin/bash
 # LinuxGSM update_pmc.sh module
 # Author: Daniel Gibbs
-# Contributors: http://linuxgsm.com/contrib
+# Contributors: https://linuxgsm.com/contrib
 # Website: https://linuxgsm.com
 # Description: Handles updating of PaperMC and Waterfall servers.
 
diff --git a/lgsm/modules/update_steamcmd.sh b/lgsm/modules/update_steamcmd.sh
index 20a85ab93..ccc8d6b36 100644
--- a/lgsm/modules/update_steamcmd.sh
+++ b/lgsm/modules/update_steamcmd.sh
@@ -1,7 +1,7 @@
 #!/bin/bash
 # LinuxGSM update_steamcmd.sh module
 # Author: Daniel Gibbs
-# Contributors: http://linuxgsm.com/contrib
+# Contributors: https://linuxgsm.com/contrib
 # Website: https://linuxgsm.com
 # Description: Handles updating using SteamCMD.
 
diff --git a/lgsm/modules/update_ts3.sh b/lgsm/modules/update_ts3.sh
index 1fa77f428..30ddf2801 100644
--- a/lgsm/modules/update_ts3.sh
+++ b/lgsm/modules/update_ts3.sh
@@ -1,7 +1,7 @@
 #!/bin/bash
 # LinuxGSM command_ts3.sh module
 # Author: Daniel Gibbs
-# Contributors: http://linuxgsm.com/contrib
+# Contributors: https://linuxgsm.com/contrib
 # Website: https://linuxgsm.com
 # Description: Handles updating of Teamspeak 3 servers.
 
diff --git a/lgsm/modules/update_ut99.sh b/lgsm/modules/update_ut99.sh
index 6d0be1941..cb74ec3b7 100644
--- a/lgsm/modules/update_ut99.sh
+++ b/lgsm/modules/update_ut99.sh
@@ -1,7 +1,7 @@
 #!/bin/bash
 # LinuxGSM command_ut99.sh module
 # Author: Daniel Gibbs
-# Contributors: http://linuxgsm.com/contrib
+# Contributors: https://linuxgsm.com/contrib
 # Website: https://linuxgsm.com
 # Description: Handles updating of Unreal Tournament 99 servers.
 
diff --git a/lgsm/modules/update_vints.sh b/lgsm/modules/update_vints.sh
index 403917e0c..2f7f857a1 100644
--- a/lgsm/modules/update_vints.sh
+++ b/lgsm/modules/update_vints.sh
@@ -1,7 +1,7 @@
 #!/bin/bash
 # LinuxGSM update_vints.sh module
 # Author: Daniel Gibbs
-# Contributors: http://linuxgsm.com/contrib
+# Contributors: https://linuxgsm.com/contrib
 # Website: https://linuxgsm.com
 # Description: Handles updating of Vintage Story servers.
 
diff --git a/lgsm/modules/update_xnt.sh b/lgsm/modules/update_xnt.sh
index d935e3989..f2cdbe324 100644
--- a/lgsm/modules/update_xnt.sh
+++ b/lgsm/modules/update_xnt.sh
@@ -1,7 +1,7 @@
 #!/bin/bash
 # LinuxGSM command_ut99.sh module
 # Author: Daniel Gibbs
-# Contributors: http://linuxgsm.com/contrib
+# Contributors: https://linuxgsm.com/contrib
 # Website: https://linuxgsm.com
 # Description: Handles updating of Unreal Tournament 99 servers.
 

From 4446e79d78b655d79db4d9d0333753af391d00b3 Mon Sep 17 00:00:00 2001
From: Daniel Gibbs <me@danielgibbs.co.uk>
Date: Sun, 22 Sep 2024 21:58:44 +0100
Subject: [PATCH 136/154] feat(ut3): Update the UT3 archive to have OpenSpy fix
 (#4657)

---
 lgsm/config-default/config-lgsm/ut3server/_default.cfg | 4 ++--
 lgsm/modules/install_server_files.sh                   | 6 +++---
 2 files changed, 5 insertions(+), 5 deletions(-)

diff --git a/lgsm/config-default/config-lgsm/ut3server/_default.cfg b/lgsm/config-default/config-lgsm/ut3server/_default.cfg
index 1088d1f0c..22817e40c 100644
--- a/lgsm/config-default/config-lgsm/ut3server/_default.cfg
+++ b/lgsm/config-default/config-lgsm/ut3server/_default.cfg
@@ -22,8 +22,8 @@ usesstats="false"
 shouldadvertise="true"
 pureserver="1"
 allowjoininprogress="true"
-# Required: GameSpy Username and password
-# https://docs.linuxgsm.com/game-servers/unreal-tournament-3#server-gamespy-login
+# Required: OpenSpy Username and password
+# https://docs.linuxgsm.com/game-servers/unreal-tournament-3#server-openspy-login
 gsusername=""
 gspassword=""
 
diff --git a/lgsm/modules/install_server_files.sh b/lgsm/modules/install_server_files.sh
index 33043d8b6..baa18aef7 100644
--- a/lgsm/modules/install_server_files.sh
+++ b/lgsm/modules/install_server_files.sh
@@ -193,13 +193,13 @@ fn_install_server_files() {
 		force="noforce"
 		md5="41dd92015713a78211eaccf503b72393"
 	elif [ "${shortname}" == "ut3" ]; then
-		remote_fileurl="http://linuxgsm.download/UnrealTournament3/UT3-linux-server-2.1.tar.xz"
+		remote_fileurl="http://linuxgsm.download/UnrealTournament3/UT3-linux-server-2.1-openspy.tar.xz"
 		local_filedir="${tmpdir}"
-		local_filename="UT3-linux-server-2.1.tar.xz"
+		local_filename="UT3-linux-server-2.1-openspy.tar.xz"
 		chmodx="nochmodx"
 		run="norun"
 		force="noforce"
-		md5="8876cca61e3f83ea08db25208bde6ac6"
+		md5="f60b745613a8676666eb6a2450cbdc8e"
 	elif [ "${shortname}" == "vs" ]; then
 		remote_fileurl="http://linuxgsm.download/VampireSlayer/vs_l-6.0_full.tar.xz"
 		local_filedir="${tmpdir}"

From 2651c31695896ee577aaa82e1eb3e76c8977fe6d Mon Sep 17 00:00:00 2001
From: Daniel Gibbs <me@danielgibbs.co.uk>
Date: Sun, 22 Sep 2024 22:06:12 +0100
Subject: [PATCH 137/154] add xnt icon

---
 lgsm/data/gameicons/xnt-icon.png | Bin 0 -> 6828 bytes
 1 file changed, 0 insertions(+), 0 deletions(-)
 create mode 100644 lgsm/data/gameicons/xnt-icon.png

diff --git a/lgsm/data/gameicons/xnt-icon.png b/lgsm/data/gameicons/xnt-icon.png
new file mode 100644
index 0000000000000000000000000000000000000000..f230eb407b9b936e571746c6ccf36baaacea2e3c
GIT binary patch
literal 6828
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

literal 0
HcmV?d00001


From 6849815acd53de6216bed470215f5de7cdce89e6 Mon Sep 17 00:00:00 2001
From: Daniel Gibbs <me@danielgibbs.co.uk>
Date: Sun, 22 Sep 2024 22:10:40 +0100
Subject: [PATCH 138/154] add missing sm

---
 lgsm/data/debian-13.csv | 1 +
 1 file changed, 1 insertion(+)

diff --git a/lgsm/data/debian-13.csv b/lgsm/data/debian-13.csv
index af262abb6..5ddb19405 100644
--- a/lgsm/data/debian-13.csv
+++ b/lgsm/data/debian-13.csv
@@ -105,6 +105,7 @@ scpslsm,mono-complete
 sdtd,telnet,expect,libxml2-utils
 sf
 sfc,libtinfo5:i386
+sm,telnet,expect
 sof2
 sol
 squad

From 5ebeb1379b9c5a9340fb70c04fa9c558dc324abc Mon Sep 17 00:00:00 2001
From: Daniel Gibbs <me@danielgibbs.co.uk>
Date: Sun, 22 Sep 2024 22:12:50 +0100
Subject: [PATCH 139/154] remove mom icon

---
 lgsm/data/gameicons/mom-icon.png | Bin 3025 -> 0 bytes
 1 file changed, 0 insertions(+), 0 deletions(-)
 delete mode 100644 lgsm/data/gameicons/mom-icon.png

diff --git a/lgsm/data/gameicons/mom-icon.png b/lgsm/data/gameicons/mom-icon.png
deleted file mode 100644
index 317b6010a9e19865cb56eb507aef10d03ce9ece6..0000000000000000000000000000000000000000
GIT binary patch
literal 0
HcmV?d00001

literal 3025
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
TH8&1V00000NkvXXu0mjfy342o


From e9f6836aa15ea5cb0d6633ae7b5a25191ec3ff54 Mon Sep 17 00:00:00 2001
From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com>
Date: Sun, 22 Sep 2024 22:14:11 +0100
Subject: [PATCH 140/154] build(deps): bump actions/add-to-project from 1.0.1
 to 1.0.2 (#4603)

Bumps [actions/add-to-project](https://github.com/actions/add-to-project) from 1.0.1 to 1.0.2.
- [Release notes](https://github.com/actions/add-to-project/releases)
- [Commits](https://github.com/actions/add-to-project/compare/v1.0.1...v1.0.2)

---
updated-dependencies:
- dependency-name: actions/add-to-project
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
---
 .github/workflows/add-to-project.yml | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/.github/workflows/add-to-project.yml b/.github/workflows/add-to-project.yml
index fb092b649..e0b06990f 100644
--- a/.github/workflows/add-to-project.yml
+++ b/.github/workflows/add-to-project.yml
@@ -11,7 +11,7 @@ jobs:
     runs-on: ubuntu-latest
     steps:
       - name: Add to Project
-        uses: actions/add-to-project@v1.0.1
+        uses: actions/add-to-project@v1.0.2
         with:
           project-url: https://github.com/orgs/GameServerManagers/projects/11
           github-token: ${{ secrets.ADD_TO_PROJECT_PAT }}

From 608a2fb3c33e65387840c7c66d06f830fe87975d Mon Sep 17 00:00:00 2001
From: Daniel Gibbs <me@danielgibbs.co.uk>
Date: Sun, 22 Sep 2024 22:26:36 +0100
Subject: [PATCH 141/154] Release v24.3.0

---
 lgsm/modules/core_modules.sh | 2 +-
 linuxgsm.sh                  | 2 +-
 2 files changed, 2 insertions(+), 2 deletions(-)

diff --git a/lgsm/modules/core_modules.sh b/lgsm/modules/core_modules.sh
index 7726559cc..10f6e0990 100644
--- a/lgsm/modules/core_modules.sh
+++ b/lgsm/modules/core_modules.sh
@@ -8,7 +8,7 @@
 
 moduleselfname="$(basename "$(readlink -f "${BASH_SOURCE[0]}")")"
 
-modulesversion="v24.2.4"
+modulesversion="v24.3.0"
 
 # Core
 
diff --git a/linuxgsm.sh b/linuxgsm.sh
index 0bb918c0d..8c83cdc58 100755
--- a/linuxgsm.sh
+++ b/linuxgsm.sh
@@ -24,7 +24,7 @@ if [ -f ".dev-debug" ]; then
 	set -x
 fi
 
-version="v24.2.4"
+version="v24.3.0"
 shortname="core"
 gameservername="core"
 commandname="CORE"

From 3fadfac2d18b2785b86c9e39df7a1cb2bccb3dfc Mon Sep 17 00:00:00 2001
From: Daniel Gibbs <me@danielgibbs.co.uk>
Date: Sun, 22 Sep 2024 22:32:57 +0100
Subject: [PATCH 142/154] remove code that is not ready

---
 lgsm/modules/alert_discord.sh | 10 ----------
 1 file changed, 10 deletions(-)

diff --git a/lgsm/modules/alert_discord.sh b/lgsm/modules/alert_discord.sh
index a447c498a..93eda8d5b 100644
--- a/lgsm/modules/alert_discord.sh
+++ b/lgsm/modules/alert_discord.sh
@@ -51,11 +51,6 @@ jsoninfo=$(
                     "name": "Hostname",
                     "value": "${HOSTNAME}",
                     "inline": true
-                },
-                {
-                    "name": "Is my Game Server Online?",
-                    "value": "https://ismygameserver.online/${querytype}/${alertip}:${queryport}",
-                    "inline": true
                 },
 				{
 					"name": "More info",
@@ -123,11 +118,6 @@ jsonnoinfo=$(
                     "value": "${HOSTNAME}",
                     "inline": true
                 },
-                {
-                    "name": "Is my Game Server Online?",
-                    "value": "https://ismygameserver.online/${querytype}/${alertip}:${queryport}",
-                    "inline": true
-                },
                 {
                     "name": "Server Time",
                     "value": "$(date)",

From d2bb7d1af654e828af7c6b2c698a86b992ac9754 Mon Sep 17 00:00:00 2001
From: Daniel Gibbs <me@danielgibbs.co.uk>
Date: Sun, 22 Sep 2024 22:38:01 +0100
Subject: [PATCH 143/154] fix: add check for npm

---
 lgsm/modules/check_gamedig.sh | 4 ++--
 1 file changed, 2 insertions(+), 2 deletions(-)

diff --git a/lgsm/modules/check_gamedig.sh b/lgsm/modules/check_gamedig.sh
index b1913cf87..70aeea41b 100644
--- a/lgsm/modules/check_gamedig.sh
+++ b/lgsm/modules/check_gamedig.sh
@@ -5,14 +5,14 @@
 # Website: https://linuxgsm.com
 # Description: Installs nodejs and gamedig
 
-if [ "$(command -v node)" ] && [ "$(node -v | cut -d 'v' -f 2 | cut -d '.' -f 1)" -ge 16 ] && [ ! -f "${lgsmdir}/node_modules/gamedig/bin/gamedig.js" ]; then
+if [ "$(command -v node)" ] && [ "$(command -v npm)" ] && [ "$(node -v | cut -d 'v' -f 2 | cut -d '.' -f 1)" -ge 16 ] && [ ! -f "${lgsmdir}/node_modules/gamedig/bin/gamedig.js" ]; then
 	echo -e ""
 	echo -e "${bold}${lightyellow}Installing Gamedig${default}"
 	fn_script_log_info "Installing Gamedig"
 	cd "${lgsmdir}" || exit
 	curl -L -o package.json "https://raw.githubusercontent.com/${githubuser}/${githubrepo}/${githubbranch}/package.json"
 	npm install
-elif [ "$(command -v node)" ] && [ "$(node -v | cut -d 'v' -f 2 | cut -d '.' -f 1)" -ge 16 ]; then
+elif [ "$(command -v node)" ] && [ "$(command -v npm)" ] && [ "$(node -v | cut -d 'v' -f 2 | cut -d '.' -f 1)" -ge 16 ]; then
 	cd "${lgsmdir}" || exit
 	curl -s -L -o package.json "https://raw.githubusercontent.com/${githubuser}/${githubrepo}/${githubbranch}/package.json"
 	npm update > /dev/null 2>&1

From b510672e251f0fe03dd899b217eed8d85ec4dee6 Mon Sep 17 00:00:00 2001
From: Daniel Gibbs <me@danielgibbs.co.uk>
Date: Sun, 22 Sep 2024 22:50:37 +0100
Subject: [PATCH 144/154] revert cp change

---
 lgsm/modules/install_config.sh | 8 ++++----
 1 file changed, 4 insertions(+), 4 deletions(-)

diff --git a/lgsm/modules/install_config.sh b/lgsm/modules/install_config.sh
index 1517812c1..f4005c6f8 100644
--- a/lgsm/modules/install_config.sh
+++ b/lgsm/modules/install_config.sh
@@ -41,15 +41,15 @@ fn_default_config_remote() {
 		fn_script_log_info "Copying ${servercfg} config file."
 		if [ "${config}" == "${servercfgdefault}" ]; then
 			mkdir -p "${servercfgdir}"
-			cp -v --update=none "${lgsmdir}/config-default/config-game/${config}" "${servercfgfullpath}"
+			cp -nv "${lgsmdir}/config-default/config-game/${config}" "${servercfgfullpath}"
 		elif [ "${shortname}" == "arma3" ] && [ "${config}" == "${networkcfgdefault}" ]; then
 			mkdir -p "${servercfgdir}"
-			cp -v --update=none "${lgsmdir}/config-default/config-game/${config}" "${networkcfgfullpath}"
+			cp -nv "${lgsmdir}/config-default/config-game/${config}" "${networkcfgfullpath}"
 		elif [ "${shortname}" == "dst" ] && [ "${config}" == "${clustercfgdefault}" ]; then
-			cp -v --update=none "${lgsmdir}/config-default/config-game/${clustercfgdefault}" "${clustercfgfullpath}"
+			cp -nv "${lgsmdir}/config-default/config-game/${clustercfgdefault}" "${clustercfgfullpath}"
 		else
 			mkdir -p "${servercfgdir}"
-			cp -v --update=none "${lgsmdir}/config-default/config-game/${config}" "${servercfgdir}/${config}"
+			cp -nv "${lgsmdir}/config-default/config-game/${config}" "${servercfgdir}/${config}"
 		fi
 	done
 	fn_sleep_time

From aa4e4d9f947fbd13f13caa132828a9821dfdd95f Mon Sep 17 00:00:00 2001
From: Daniel Gibbs <me@danielgibbs.co.uk>
Date: Mon, 23 Sep 2024 23:31:24 +0100
Subject: [PATCH 145/154] chore: update gamedig version v5.1.3

---
 package.json | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/package.json b/package.json
index e40e99e55..7fa277dcc 100644
--- a/package.json
+++ b/package.json
@@ -22,6 +22,6 @@
   },
   "homepage": "https://github.com/GameServerManagers/LinuxGSM#readme",
   "dependencies": {
-    "gamedig": "^5.1.1"
+    "gamedig": "^5.1.3"
   }
 }

From 975511fcd4be720530d2174494b116d0625f69e7 Mon Sep 17 00:00:00 2001
From: Daniel Gibbs <me@danielgibbs.co.uk>
Date: Mon, 23 Sep 2024 23:57:25 +0100
Subject: [PATCH 146/154] fix: ensure lgsm/data refers to datadir variable

---
 .../details-check-generate-matrix.sh          |  2 +-
 .../serverlist-validate-game-icons.sh         |  2 +-
 .github/workflows/serverlist-validate.sh      |  4 +-
 lgsm/modules/alert.sh                         |  2 +-
 lgsm/modules/alert_discord.sh                 | 12 +--
 lgsm/modules/alert_rocketchat.sh              |  4 +-
 lgsm/modules/alert_slack.sh                   |  4 +-
 lgsm/modules/check_deps.sh                    |  4 +-
 lgsm/modules/command_update_linuxgsm.sh       | 10 +--
 lgsm/modules/core_steamcmd.sh                 | 90 +++++++++----------
 lgsm/modules/info_stats.sh                    |  4 +-
 lgsm/modules/mods_core.sh                     |  2 +-
 linuxgsm.sh                                   |  2 +-
 13 files changed, 71 insertions(+), 71 deletions(-)

diff --git a/.github/workflows/details-check-generate-matrix.sh b/.github/workflows/details-check-generate-matrix.sh
index bba9e8d5d..1f4bc1d53 100755
--- a/.github/workflows/details-check-generate-matrix.sh
+++ b/.github/workflows/details-check-generate-matrix.sh
@@ -1,6 +1,6 @@
 #!/bin/bash
 
-curl "https://raw.githubusercontent.com/GameServerManagers/LinuxGSM/${GITHUB_REF#refs/heads/}/lgsm/data/serverlist.csv" | grep -v '^[[:blank:]]*$' > serverlist.csv
+curl "https://raw.githubusercontent.com/GameServerManagers/LinuxGSM/${GITHUB_REF#refs/heads/}/${datadir}/serverlist.csv" | grep -v '^[[:blank:]]*$' > serverlist.csv
 
 echo -n "{" > "shortnamearray.json"
 echo -n "\"include\":[" >> "shortnamearray.json"
diff --git a/.github/workflows/serverlist-validate-game-icons.sh b/.github/workflows/serverlist-validate-game-icons.sh
index ca41892c9..2fdb0ff8f 100755
--- a/.github/workflows/serverlist-validate-game-icons.sh
+++ b/.github/workflows/serverlist-validate-game-icons.sh
@@ -1,6 +1,6 @@
 #!/bin/bash
 
-cd "lgsm/data" || exit
+cd "${datadir}" || exit
 
 echo ""
 echo "Checking that all the game servers listed in serverlist.csv have a shortname-icon.png file"
diff --git a/.github/workflows/serverlist-validate.sh b/.github/workflows/serverlist-validate.sh
index 0c7634018..7d931372d 100755
--- a/.github/workflows/serverlist-validate.sh
+++ b/.github/workflows/serverlist-validate.sh
@@ -2,7 +2,7 @@
 echo "Checking that all the game servers are listed in all csv files"
 echo "this check will ensure serverlist.csv has the same number of lines (-2 lines) as the other csv files"
 # count the number of lines in the serverlist.csv
-cd "lgsm/data" || exit
+cd "${datadir}" || exit
 serverlistcount="$(tail -n +2 serverlist.csv | wc -l)"
 echo "serverlistcount: $serverlistcount"
 # get list of all csv files starting with ubunutu debian centos
@@ -19,7 +19,7 @@ for csv in $csvlist; do
 	fi
 done
 
-# Compare all game servers listed in serverlist.csv to $shortname-icon.png files in lgsm/data/gameicons
+# Compare all game servers listed in serverlist.csv to $shortname-icon.png files in ${datadir}/gameicons
 # if the game server is listed in serverlist.csv then it will have a $shortname-icon.png file
 
 # loop though shortname in serverlist.csv
diff --git a/lgsm/modules/alert.sh b/lgsm/modules/alert.sh
index f2698e3b7..814799e80 100644
--- a/lgsm/modules/alert.sh
+++ b/lgsm/modules/alert.sh
@@ -198,7 +198,7 @@ fn_alert_info() {
 }
 
 # Images
-alerticon="https://raw.githubusercontent.com/${githubuser}/${githubrepo}/${githubbranch}/lgsm/data/gameicons/${shortname}-icon.png"
+alerticon="https://raw.githubusercontent.com/${githubuser}/${githubrepo}/${githubbranch}/${datadir}/gameicons/${shortname}-icon.png"
 
 if [ "${alert}" == "permissions" ]; then
 	fn_alert_permissions
diff --git a/lgsm/modules/alert_discord.sh b/lgsm/modules/alert_discord.sh
index 93eda8d5b..6f362b4f7 100644
--- a/lgsm/modules/alert_discord.sh
+++ b/lgsm/modules/alert_discord.sh
@@ -11,14 +11,14 @@ jsoninfo=$(
 	cat << EOF
 {
     "username": "LinuxGSM",
-    "avatar_url": "https://raw.githubusercontent.com/${githubuser}/${githubrepo}/${githubbranch}/lgsm/data/alert_discord_logo.jpg",
+    "avatar_url": "https://raw.githubusercontent.com/${githubuser}/${githubrepo}/${githubbranch}/${datadir}/alert_discord_logo.jpg",
     "file": "content",
     "embeds": [
         {
             "author": {
                 "name": "LinuxGSM Alert",
                 "url": "",
-                "icon_url": "https://raw.githubusercontent.com/${githubuser}/${githubrepo}/${githubbranch}/lgsm/data/alert_discord_logo.jpg"
+                "icon_url": "https://raw.githubusercontent.com/${githubuser}/${githubrepo}/${githubbranch}/${datadir}/alert_discord_logo.jpg"
             },
             "title": "${alerttitle}",
             "url": "",
@@ -64,7 +64,7 @@ jsoninfo=$(
                 }
             ],
             "footer": {
-				"icon_url": "https://raw.githubusercontent.com/${githubuser}/${githubrepo}/${githubbranch}/lgsm/data/alert_discord_logo.jpg",
+				"icon_url": "https://raw.githubusercontent.com/${githubuser}/${githubrepo}/${githubbranch}/${datadir}/alert_discord_logo.jpg",
                 "text": "Sent by LinuxGSM ${version}"
             }
         }
@@ -77,14 +77,14 @@ jsonnoinfo=$(
 	cat << EOF
 {
     "username": "LinuxGSM",
-    "avatar_url": "https://raw.githubusercontent.com/${githubuser}/${githubrepo}/${githubbranch}/lgsm/data/alert_discord_logo.jpg",
+    "avatar_url": "https://raw.githubusercontent.com/${githubuser}/${githubrepo}/${githubbranch}/${datadir}/alert_discord_logo.jpg",
     "file": "content",
     "embeds": [
         {
             "author": {
                 "name": "LinuxGSM Alert",
                 "url": "",
-                "icon_url": "https://raw.githubusercontent.com/${githubuser}/${githubrepo}/${githubbranch}/lgsm/data/alert_discord_logo.jpg"
+                "icon_url": "https://raw.githubusercontent.com/${githubuser}/${githubrepo}/${githubbranch}/${datadir}/alert_discord_logo.jpg"
             },
             "title": "${alerttitle}",
             "url": "",
@@ -125,7 +125,7 @@ jsonnoinfo=$(
                 }
             ],
             "footer": {
-				"icon_url": "https://raw.githubusercontent.com/${githubuser}/${githubrepo}/${githubbranch}/lgsm/data/alert_discord_logo.jpg",
+				"icon_url": "https://raw.githubusercontent.com/${githubuser}/${githubrepo}/${githubbranch}/${datadir}/alert_discord_logo.jpg",
                 "text": "Sent by LinuxGSM ${version}"
             }
         }
diff --git a/lgsm/modules/alert_rocketchat.sh b/lgsm/modules/alert_rocketchat.sh
index bff2c6a0b..d0077c5f9 100644
--- a/lgsm/modules/alert_rocketchat.sh
+++ b/lgsm/modules/alert_rocketchat.sh
@@ -18,7 +18,7 @@ jsoninfo=$(
 			"color": "${alertcolourhex}",
 			"author_name": "LinuxGSM Alert",
 			"author_link": "https://linuxgsm.com",
-			"author_icon": "https://raw.githubusercontent.com/${githubuser}/${githubrepo}/${githubbranch}/lgsm/data/alert_discord_logo.jpg",
+			"author_icon": "https://raw.githubusercontent.com/${githubuser}/${githubrepo}/${githubbranch}/${datadir}/alert_discord_logo.jpg",
 			"thumb_url": "${alerticon}",
 			"text": "",
 			"fields": [
@@ -75,7 +75,7 @@ jsonnoinfo=$(
 			"color": "${alertcolourhex}",
 			"author_name": "LinuxGSM Alert",
 			"author_link": "https://linuxgsm.com",
-			"author_icon": "https://raw.githubusercontent.com/${githubuser}/${githubrepo}/${githubbranch}/lgsm/data/alert_discord_logo.jpg",
+			"author_icon": "https://raw.githubusercontent.com/${githubuser}/${githubrepo}/${githubbranch}/${datadir}/alert_discord_logo.jpg",
 			"thumb_url": "${alerticon}",
 			"text": "",
 			"fields": [
diff --git a/lgsm/modules/alert_slack.sh b/lgsm/modules/alert_slack.sh
index 58dc54772..f6c6e503c 100644
--- a/lgsm/modules/alert_slack.sh
+++ b/lgsm/modules/alert_slack.sh
@@ -70,7 +70,7 @@ jsonnoinfo=$(
 					"elements": [
 						{
 							"type": "image",
-							"image_url": "https://raw.githubusercontent.com/${githubuser}/${githubrepo}/${githubbranch}/lgsm/data/alert_discord_logo.jpg",
+							"image_url": "https://raw.githubusercontent.com/${githubuser}/${githubrepo}/${githubbranch}/${datadir}/alert_discord_logo.jpg",
 							"alt_text": "LinuxGSM icon"
 						},
 						{
@@ -157,7 +157,7 @@ jsoninfo=$(
 					"elements": [
 						{
 							"type": "image",
-							"image_url": "https://raw.githubusercontent.com/${githubuser}/${githubrepo}/${githubbranch}/lgsm/data/alert_discord_logo.jpg",
+							"image_url": "https://raw.githubusercontent.com/${githubuser}/${githubrepo}/${githubbranch}/${datadir}/alert_discord_logo.jpg",
 							"alt_text": "LinuxGSM icon"
 						},
 						{
diff --git a/lgsm/modules/check_deps.sh b/lgsm/modules/check_deps.sh
index 35145a11d..67e0c8ba7 100644
--- a/lgsm/modules/check_deps.sh
+++ b/lgsm/modules/check_deps.sh
@@ -358,9 +358,9 @@ info_distro.sh
 
 if [ ! -f "${tmpdir}/dependency-no-check.tmp" ] && [ ! -f "${datadir}/${distroid}-${distroversioncsv}.csv" ]; then
 	# Check that the distro dependency csv file exists.
-	fn_check_file_github "lgsm/data" "${distroid}-${distroversioncsv}.csv"
+	fn_check_file_github "${datadir}" "${distroid}-${distroversioncsv}.csv"
 	if [ -n "${checkflag}" ] && [ "${checkflag}" == "0" ]; then
-		fn_fetch_file_github "lgsm/data" "${distroid}-${distroversioncsv}.csv" "lgsm/data" "chmodx" "norun" "noforce" "nohash"
+		fn_fetch_file_github "${datadir}" "${distroid}-${distroversioncsv}.csv" "${datadir}" "chmodx" "norun" "noforce" "nohash"
 	fi
 fi
 
diff --git a/lgsm/modules/command_update_linuxgsm.sh b/lgsm/modules/command_update_linuxgsm.sh
index e6e5e711d..27adf9b71 100644
--- a/lgsm/modules/command_update_linuxgsm.sh
+++ b/lgsm/modules/command_update_linuxgsm.sh
@@ -160,9 +160,9 @@ if [ -f "${datadir}/${distroid}-${distroversioncsv}.csv" ]; then
 	echo -en "checking ${remotereponame} config ${distroid}-${distroversioncsv}.csv...\c"
 	fn_script_log_info "Checking ${remotereponame} ${distroid}-${distroversioncsv}.csv"
 	if [ "${remotereponame}" == "GitHub" ]; then
-		curl ${nocache} --connect-timeout 3 -IsfL "https://raw.githubusercontent.com/${githubuser}/${githubrepo}/${githubbranch}/lgsm/data/${distroid}-${distroversioncsv}.csv" 1> /dev/null
+		curl ${nocache} --connect-timeout 3 -IsfL "https://raw.githubusercontent.com/${githubuser}/${githubrepo}/${githubbranch}/${datadir}/${distroid}-${distroversioncsv}.csv" 1> /dev/null
 	else
-		curl ${nocache} --connect-timeout 3 -IsfL "https://bitbucket.org/${githubuser}/${githubrepo}/raw/${githubbranch}/lgsm/data/${distroid}-${distroversioncsv}.csv" 1> /dev/null
+		curl ${nocache} --connect-timeout 3 -IsfL "https://bitbucket.org/${githubuser}/${githubrepo}/raw/${githubbranch}/${datadir}/${distroid}-${distroversioncsv}.csv" 1> /dev/null
 	fi
 	if [ $? != "0" ]; then
 		fn_print_fail_eol_nl
@@ -172,16 +172,16 @@ if [ -f "${datadir}/${distroid}-${distroversioncsv}.csv" ]; then
 	fi
 
 	if [ "${remotereponame}" == "GitHub" ]; then
-		config_file_diff=$(diff "${datadir}/${distroid}-${distroversioncsv}.csv" <(curl ${nocache} --connect-timeout 3 -s "https://raw.githubusercontent.com/${githubuser}/${githubrepo}/${githubbranch}/lgsm/data/${distroid}-${distroversioncsv}.csv"))
+		config_file_diff=$(diff "${datadir}/${distroid}-${distroversioncsv}.csv" <(curl ${nocache} --connect-timeout 3 -s "https://raw.githubusercontent.com/${githubuser}/${githubrepo}/${githubbranch}/${datadir}/${distroid}-${distroversioncsv}.csv"))
 	else
-		config_file_diff=$(diff "${datadir}/${distroid}-${distroversioncsv}.csv" <(curl ${nocache} --connect-timeout 3 -s "https://bitbucket.org/${githubuser}/${githubrepo}/raw/${githubbranch}/lgsm/data/${distroid}-${distroversioncsv}.csv"))
+		config_file_diff=$(diff "${datadir}/${distroid}-${distroversioncsv}.csv" <(curl ${nocache} --connect-timeout 3 -s "https://bitbucket.org/${githubuser}/${githubrepo}/raw/${githubbranch}/${datadir}/${distroid}-${distroversioncsv}.csv"))
 	fi
 
 	if [ "${config_file_diff}" != "" ]; then
 		fn_print_update_eol_nl
 		fn_script_log_update "Checking ${remotereponame} ${distroid}-${distroversioncsv}.csv"
 		rm -f "${datadir:?}/${distroid}-${distroversioncsv}.csv"
-		fn_fetch_file_github "lgsm/data" "${distroid}-${distroversioncsv}.csv" "${datadir}" "nochmodx" "norun" "noforce" "nohash"
+		fn_fetch_file_github "${datadir}" "${distroid}-${distroversioncsv}.csv" "${datadir}" "nochmodx" "norun" "noforce" "nohash"
 	else
 		fn_print_ok_eol_nl
 		fn_script_log_pass "Checking ${remotereponame} ${distroid}-${distroversioncsv}.csv"
diff --git a/lgsm/modules/core_steamcmd.sh b/lgsm/modules/core_steamcmd.sh
index 552ff1905..e08c921dd 100644
--- a/lgsm/modules/core_steamcmd.sh
+++ b/lgsm/modules/core_steamcmd.sh
@@ -364,63 +364,63 @@ fn_check_steamcmd_appmanifest() {
 			fn_print_info_nl "Forcing update to correct issue"
 			fn_script_log_info "Forcing update to correct issue"
 			if [ "${shortname}" == "ahl" ]; then
-				fn_fetch_file_github "lgsm/data/appmanifest/${shortname}" "appmanifest_90.acf" "${serverfiles}/steamapps" "nochmodx" "norun" "noforce" "nohash"
-				fn_fetch_file_github "lgsm/data/appmanifest/${shortname}" "appmanifest_10.acf" "${serverfiles}/steamapps" "nochmodx" "norun" "noforce" "nohash"
-				fn_fetch_file_github "lgsm/data/appmanifest/${shortname}" "appmanifest_70.acf" "${serverfiles}/steamapps" "nochmodx" "norun" "noforce" "nohash"
+				fn_fetch_file_github "${datadir}/appmanifest/${shortname}" "appmanifest_90.acf" "${serverfiles}/steamapps" "nochmodx" "norun" "noforce" "nohash"
+				fn_fetch_file_github "${datadir}/appmanifest/${shortname}" "appmanifest_10.acf" "${serverfiles}/steamapps" "nochmodx" "norun" "noforce" "nohash"
+				fn_fetch_file_github "${datadir}/appmanifest/${shortname}" "appmanifest_70.acf" "${serverfiles}/steamapps" "nochmodx" "norun" "noforce" "nohash"
 			elif [ "${shortname}" == "bb" ]; then
-				fn_fetch_file_github "lgsm/data/appmanifest/${shortname}" "appmanifest_90.acf" "${serverfiles}/steamapps" "nochmodx" "norun" "noforce" "nohash"
-				fn_fetch_file_github "lgsm/data/appmanifest/${shortname}" "appmanifest_10.acf" "${serverfiles}/steamapps" "nochmodx" "norun" "noforce" "nohash"
-				fn_fetch_file_github "lgsm/data/appmanifest/${shortname}" "appmanifest_70.acf" "${serverfiles}/steamapps" "nochmodx" "norun" "noforce" "nohash"
+				fn_fetch_file_github "${datadir}/appmanifest/${shortname}" "appmanifest_90.acf" "${serverfiles}/steamapps" "nochmodx" "norun" "noforce" "nohash"
+				fn_fetch_file_github "${datadir}/appmanifest/${shortname}" "appmanifest_10.acf" "${serverfiles}/steamapps" "nochmodx" "norun" "noforce" "nohash"
+				fn_fetch_file_github "${datadir}/appmanifest/${shortname}" "appmanifest_70.acf" "${serverfiles}/steamapps" "nochmodx" "norun" "noforce" "nohash"
 			elif [ "${shortname}" == "cscz" ]; then
-				fn_fetch_file_github "lgsm/data/appmanifest/${shortname}" "appmanifest_90.acf" "${serverfiles}/steamapps" "nochmodx" "norun" "noforce" "nohash"
-				fn_fetch_file_github "lgsm/data/appmanifest/${shortname}" "appmanifest_10.acf" "${serverfiles}/steamapps" "nochmodx" "norun" "noforce" "nohash"
-				fn_fetch_file_github "lgsm/data/appmanifest/${shortname}" "appmanifest_70.acf" "${serverfiles}/steamapps" "nochmodx" "norun" "noforce" "nohash"
-				fn_fetch_file_github "lgsm/data/appmanifest/${shortname}" "appmanifest_80.acf" "${serverfiles}/steamapps" "nochmodx" "norun" "noforce" "nohash"
+				fn_fetch_file_github "${datadir}/appmanifest/${shortname}" "appmanifest_90.acf" "${serverfiles}/steamapps" "nochmodx" "norun" "noforce" "nohash"
+				fn_fetch_file_github "${datadir}/appmanifest/${shortname}" "appmanifest_10.acf" "${serverfiles}/steamapps" "nochmodx" "norun" "noforce" "nohash"
+				fn_fetch_file_github "${datadir}/appmanifest/${shortname}" "appmanifest_70.acf" "${serverfiles}/steamapps" "nochmodx" "norun" "noforce" "nohash"
+				fn_fetch_file_github "${datadir}/appmanifest/${shortname}" "appmanifest_80.acf" "${serverfiles}/steamapps" "nochmodx" "norun" "noforce" "nohash"
 			elif [ "${shortname}" == "css" ]; then
-				fn_fetch_file_github "lgsm/data/appmanifest/${shortname}" "appmanifest_90.acf" "${serverfiles}/steamapps" "nochmodx" "norun" "noforce" "nohash"
-				fn_fetch_file_github "lgsm/data/appmanifest/${shortname}" "appmanifest_10.acf" "${serverfiles}/steamapps" "nochmodx" "norun" "noforce" "nohash"
-				fn_fetch_file_github "lgsm/data/appmanifest/${shortname}" "appmanifest_70.acf" "${serverfiles}/steamapps" "nochmodx" "norun" "noforce" "nohash"
+				fn_fetch_file_github "${datadir}/appmanifest/${shortname}" "appmanifest_90.acf" "${serverfiles}/steamapps" "nochmodx" "norun" "noforce" "nohash"
+				fn_fetch_file_github "${datadir}/appmanifest/${shortname}" "appmanifest_10.acf" "${serverfiles}/steamapps" "nochmodx" "norun" "noforce" "nohash"
+				fn_fetch_file_github "${datadir}/appmanifest/${shortname}" "appmanifest_70.acf" "${serverfiles}/steamapps" "nochmodx" "norun" "noforce" "nohash"
 			elif [ "${shortname}" == "dmc" ]; then
-				fn_fetch_file_github "lgsm/data/appmanifest/${shortname}" "appmanifest_90.acf" "${serverfiles}/steamapps" "nochmodx" "norun" "noforce" "nohash"
-				fn_fetch_file_github "lgsm/data/appmanifest/${shortname}" "appmanifest_10.acf" "${serverfiles}/steamapps" "nochmodx" "norun" "noforce" "nohash"
-				fn_fetch_file_github "lgsm/data/appmanifest/${shortname}" "appmanifest_40.acf" "${serverfiles}/steamapps" "nochmodx" "norun" "noforce" "nohash"
-				fn_fetch_file_github "lgsm/data/appmanifest/${shortname}" "appmanifest_70.acf" "${serverfiles}/steamapps" "nochmodx" "norun" "noforce" "nohash"
+				fn_fetch_file_github "${datadir}/appmanifest/${shortname}" "appmanifest_90.acf" "${serverfiles}/steamapps" "nochmodx" "norun" "noforce" "nohash"
+				fn_fetch_file_github "${datadir}/appmanifest/${shortname}" "appmanifest_10.acf" "${serverfiles}/steamapps" "nochmodx" "norun" "noforce" "nohash"
+				fn_fetch_file_github "${datadir}/appmanifest/${shortname}" "appmanifest_40.acf" "${serverfiles}/steamapps" "nochmodx" "norun" "noforce" "nohash"
+				fn_fetch_file_github "${datadir}/appmanifest/${shortname}" "appmanifest_70.acf" "${serverfiles}/steamapps" "nochmodx" "norun" "noforce" "nohash"
 			elif [ "${shortname}" == "dod" ]; then
-				fn_fetch_file_github "lgsm/data/appmanifest/${shortname}" "appmanifest_90.acf" "${serverfiles}/steamapps" "nochmodx" "norun" "noforce" "nohash"
-				fn_fetch_file_github "lgsm/data/appmanifest/${shortname}" "appmanifest_10.acf" "${serverfiles}/steamapps" "nochmodx" "norun" "noforce" "nohash"
-				fn_fetch_file_github "lgsm/data/appmanifest/${shortname}" "appmanifest_30.acf" "${serverfiles}/steamapps" "nochmodx" "norun" "noforce" "nohash"
-				fn_fetch_file_github "lgsm/data/appmanifest/${shortname}" "appmanifest_70.acf" "${serverfiles}/steamapps" "nochmodx" "norun" "noforce" "nohash"
+				fn_fetch_file_github "${datadir}/appmanifest/${shortname}" "appmanifest_90.acf" "${serverfiles}/steamapps" "nochmodx" "norun" "noforce" "nohash"
+				fn_fetch_file_github "${datadir}/appmanifest/${shortname}" "appmanifest_10.acf" "${serverfiles}/steamapps" "nochmodx" "norun" "noforce" "nohash"
+				fn_fetch_file_github "${datadir}/appmanifest/${shortname}" "appmanifest_30.acf" "${serverfiles}/steamapps" "nochmodx" "norun" "noforce" "nohash"
+				fn_fetch_file_github "${datadir}/appmanifest/${shortname}" "appmanifest_70.acf" "${serverfiles}/steamapps" "nochmodx" "norun" "noforce" "nohash"
 			elif [ "${shortname}" == "hldm" ]; then
-				fn_fetch_file_github "lgsm/data/appmanifest/${shortname}" "appmanifest_90.acf" "${serverfiles}/steamapps" "nochmodx" "norun" "noforce" "nohash"
-				fn_fetch_file_github "lgsm/data/appmanifest/${shortname}" "appmanifest_10.acf" "${serverfiles}/steamapps" "nochmodx" "norun" "noforce" "nohash"
-				fn_fetch_file_github "lgsm/data/appmanifest/${shortname}" "appmanifest_70.acf" "${serverfiles}/steamapps" "nochmodx" "norun" "noforce" "nohash"
+				fn_fetch_file_github "${datadir}/appmanifest/${shortname}" "appmanifest_90.acf" "${serverfiles}/steamapps" "nochmodx" "norun" "noforce" "nohash"
+				fn_fetch_file_github "${datadir}/appmanifest/${shortname}" "appmanifest_10.acf" "${serverfiles}/steamapps" "nochmodx" "norun" "noforce" "nohash"
+				fn_fetch_file_github "${datadir}/appmanifest/${shortname}" "appmanifest_70.acf" "${serverfiles}/steamapps" "nochmodx" "norun" "noforce" "nohash"
 			elif [ "${shortname}" == "ns" ]; then
-				fn_fetch_file_github "lgsm/data/appmanifest/${shortname}" "appmanifest_90.acf" "${serverfiles}/steamapps" "nochmodx" "norun" "noforce" "nohash"
-				fn_fetch_file_github "lgsm/data/appmanifest/${shortname}" "appmanifest_10.acf" "${serverfiles}/steamapps" "nochmodx" "norun" "noforce" "nohash"
-				fn_fetch_file_github "lgsm/data/appmanifest/${shortname}" "appmanifest_70.acf" "${serverfiles}/steamapps" "nochmodx" "norun" "noforce" "nohash"
+				fn_fetch_file_github "${datadir}/appmanifest/${shortname}" "appmanifest_90.acf" "${serverfiles}/steamapps" "nochmodx" "norun" "noforce" "nohash"
+				fn_fetch_file_github "${datadir}/appmanifest/${shortname}" "appmanifest_10.acf" "${serverfiles}/steamapps" "nochmodx" "norun" "noforce" "nohash"
+				fn_fetch_file_github "${datadir}/appmanifest/${shortname}" "appmanifest_70.acf" "${serverfiles}/steamapps" "nochmodx" "norun" "noforce" "nohash"
 			elif [ "${shortname}" == "opfor" ]; then
-				fn_fetch_file_github "lgsm/data/appmanifest/${shortname}" "appmanifest_90.acf" "${serverfiles}/steamapps" "nochmodx" "norun" "noforce" "nohash"
-				fn_fetch_file_github "lgsm/data/appmanifest/${shortname}" "appmanifest_10.acf" "${serverfiles}/steamapps" "nochmodx" "norun" "noforce" "nohash"
-				fn_fetch_file_github "lgsm/data/appmanifest/${shortname}" "appmanifest_50.acf" "${serverfiles}/steamapps" "nochmodx" "norun" "noforce" "nohash"
-				fn_fetch_file_github "lgsm/data/appmanifest/${shortname}" "appmanifest_70.acf" "${serverfiles}/steamapps" "nochmodx" "norun" "noforce" "nohash"
+				fn_fetch_file_github "${datadir}/appmanifest/${shortname}" "appmanifest_90.acf" "${serverfiles}/steamapps" "nochmodx" "norun" "noforce" "nohash"
+				fn_fetch_file_github "${datadir}/appmanifest/${shortname}" "appmanifest_10.acf" "${serverfiles}/steamapps" "nochmodx" "norun" "noforce" "nohash"
+				fn_fetch_file_github "${datadir}/appmanifest/${shortname}" "appmanifest_50.acf" "${serverfiles}/steamapps" "nochmodx" "norun" "noforce" "nohash"
+				fn_fetch_file_github "${datadir}/appmanifest/${shortname}" "appmanifest_70.acf" "${serverfiles}/steamapps" "nochmodx" "norun" "noforce" "nohash"
 			elif [ "${shortname}" == "ricochet" ]; then
-				fn_fetch_file_github "lgsm/data/appmanifest/${shortname}" "appmanifest_90.acf" "${serverfiles}/steamapps" "nochmodx" "norun" "noforce" "nohash"
-				fn_fetch_file_github "lgsm/data/appmanifest/${shortname}" "appmanifest_10.acf" "${serverfiles}/steamapps" "nochmodx" "norun" "noforce" "nohash"
-				fn_fetch_file_github "lgsm/data/appmanifest/${shortname}" "appmanifest_60.acf" "${serverfiles}/steamapps" "nochmodx" "norun" "noforce" "nohash"
-				fn_fetch_file_github "lgsm/data/appmanifest/${shortname}" "appmanifest_70.acf" "${serverfiles}/steamapps" "nochmodx" "norun" "noforce" "nohash"
+				fn_fetch_file_github "${datadir}/appmanifest/${shortname}" "appmanifest_90.acf" "${serverfiles}/steamapps" "nochmodx" "norun" "noforce" "nohash"
+				fn_fetch_file_github "${datadir}/appmanifest/${shortname}" "appmanifest_10.acf" "${serverfiles}/steamapps" "nochmodx" "norun" "noforce" "nohash"
+				fn_fetch_file_github "${datadir}/appmanifest/${shortname}" "appmanifest_60.acf" "${serverfiles}/steamapps" "nochmodx" "norun" "noforce" "nohash"
+				fn_fetch_file_github "${datadir}/appmanifest/${shortname}" "appmanifest_70.acf" "${serverfiles}/steamapps" "nochmodx" "norun" "noforce" "nohash"
 			elif [ "${shortname}" == "tfc" ]; then
-				fn_fetch_file_github "lgsm/data/appmanifest/${shortname}" "appmanifest_90.acf" "${serverfiles}/steamapps" "nochmodx" "norun" "noforce" "nohash"
-				fn_fetch_file_github "lgsm/data/appmanifest/${shortname}" "appmanifest_10.acf" "${serverfiles}/steamapps" "nochmodx" "norun" "noforce" "nohash"
-				fn_fetch_file_github "lgsm/data/appmanifest/${shortname}" "appmanifest_20.acf" "${serverfiles}/steamapps" "nochmodx" "norun" "noforce" "nohash"
-				fn_fetch_file_github "lgsm/data/appmanifest/${shortname}" "appmanifest_70.acf" "${serverfiles}/steamapps" "nochmodx" "norun" "noforce" "nohash"
+				fn_fetch_file_github "${datadir}/appmanifest/${shortname}" "appmanifest_90.acf" "${serverfiles}/steamapps" "nochmodx" "norun" "noforce" "nohash"
+				fn_fetch_file_github "${datadir}/appmanifest/${shortname}" "appmanifest_10.acf" "${serverfiles}/steamapps" "nochmodx" "norun" "noforce" "nohash"
+				fn_fetch_file_github "${datadir}/appmanifest/${shortname}" "appmanifest_20.acf" "${serverfiles}/steamapps" "nochmodx" "norun" "noforce" "nohash"
+				fn_fetch_file_github "${datadir}/appmanifest/${shortname}" "appmanifest_70.acf" "${serverfiles}/steamapps" "nochmodx" "norun" "noforce" "nohash"
 			elif [ "${shortname}" == "ts" ]; then
-				fn_fetch_file_github "lgsm/data/appmanifest/${shortname}" "appmanifest_90.acf" "${serverfiles}/steamapps" "nochmodx" "norun" "noforce" "nohash"
-				fn_fetch_file_github "lgsm/data/appmanifest/${shortname}" "appmanifest_10.acf" "${serverfiles}/steamapps" "nochmodx" "norun" "noforce" "nohash"
-				fn_fetch_file_github "lgsm/data/appmanifest/${shortname}" "appmanifest_70.acf" "${serverfiles}/steamapps" "nochmodx" "norun" "noforce" "nohash"
+				fn_fetch_file_github "${datadir}/appmanifest/${shortname}" "appmanifest_90.acf" "${serverfiles}/steamapps" "nochmodx" "norun" "noforce" "nohash"
+				fn_fetch_file_github "${datadir}/appmanifest/${shortname}" "appmanifest_10.acf" "${serverfiles}/steamapps" "nochmodx" "norun" "noforce" "nohash"
+				fn_fetch_file_github "${datadir}/appmanifest/${shortname}" "appmanifest_70.acf" "${serverfiles}/steamapps" "nochmodx" "norun" "noforce" "nohash"
 			elif [ "${shortname}" == "vs" ]; then
-				fn_fetch_file_github "lgsm/data/appmanifest/${shortname}" "appmanifest_90.acf" "${serverfiles}/steamapps" "nochmodx" "norun" "noforce" "nohash"
-				fn_fetch_file_github "lgsm/data/appmanifest/${shortname}" "appmanifest_10.acf" "${serverfiles}/steamapps" "nochmodx" "norun" "noforce" "nohash"
-				fn_fetch_file_github "lgsm/data/appmanifest/${shortname}" "appmanifest_70.acf" "${serverfiles}/steamapps" "nochmodx" "norun" "noforce" "nohash"
+				fn_fetch_file_github "${datadir}/appmanifest/${shortname}" "appmanifest_90.acf" "${serverfiles}/steamapps" "nochmodx" "norun" "noforce" "nohash"
+				fn_fetch_file_github "${datadir}/appmanifest/${shortname}" "appmanifest_10.acf" "${serverfiles}/steamapps" "nochmodx" "norun" "noforce" "nohash"
+				fn_fetch_file_github "${datadir}/appmanifest/${shortname}" "appmanifest_70.acf" "${serverfiles}/steamapps" "nochmodx" "norun" "noforce" "nohash"
 			fi
 			fn_dl_steamcmd
 		fi
diff --git a/lgsm/modules/info_stats.sh b/lgsm/modules/info_stats.sh
index c8a96552a..b995d0e3b 100644
--- a/lgsm/modules/info_stats.sh
+++ b/lgsm/modules/info_stats.sh
@@ -23,10 +23,10 @@ fi
 if [ ! -f "${datadir}/uuid-${selfname}.txt" ] || [ ! -f "${datadir}/uuid-install.txt" ]; then
 	# download dictionary words
 	if [ ! -f "${datadir}/name-left.csv" ]; then
-		fn_fetch_file_github "lgsm/data" "name-left.csv" "${datadir}" "nochmodx" "norun" "forcedl" "nohash"
+		fn_fetch_file_github "${datadir}" "name-left.csv" "${datadir}" "nochmodx" "norun" "forcedl" "nohash"
 	fi
 	if [ ! -f "${datadir}/name-right.csv" ]; then
-		fn_fetch_file_github "lgsm/data" "name-right.csv" "${datadir}" "nochmodx" "norun" "forcedl" "nohash"
+		fn_fetch_file_github "${datadir}" "name-right.csv" "${datadir}" "nochmodx" "norun" "forcedl" "nohash"
 	fi
 
 	# generate instance uuid
diff --git a/lgsm/modules/mods_core.sh b/lgsm/modules/mods_core.sh
index aa24d903f..47bef26f7 100644
--- a/lgsm/modules/mods_core.sh
+++ b/lgsm/modules/mods_core.sh
@@ -412,7 +412,7 @@ fn_create_mods_dir() {
 		fi
 	fi
 
-	# Create lgsm/data/${modsinstalledlist}.
+	# Create ${datadir}/${modsinstalledlist}.
 	if [ ! -f "${modsinstalledlistfullpath}" ]; then
 		touch "${modsinstalledlistfullpath}"
 		fn_script_log_info "Created ${modsinstalledlistfullpath}"
diff --git a/linuxgsm.sh b/linuxgsm.sh
index 8c83cdc58..047678875 100755
--- a/linuxgsm.sh
+++ b/linuxgsm.sh
@@ -345,7 +345,7 @@ fi
 # LinuxGSM installer mode.
 if [ "${shortname}" == "core" ]; then
 	# Download the latest serverlist. This is the complete list of all supported servers.
-	fn_bootstrap_fetch_file_github "lgsm/data" "serverlist.csv" "${datadir}" "nochmodx" "norun" "forcedl" "nomd5"
+	fn_bootstrap_fetch_file_github "${datadir}" "serverlist.csv" "${datadir}" "nochmodx" "norun" "forcedl" "nomd5"
 	if [ ! -f "${serverlist}" ]; then
 		echo -e "[ FAIL ] serverlist.csv could not be loaded."
 		exit 1

From 56e422be452ef31e5d7a50dc5d86e945642d3afb Mon Sep 17 00:00:00 2001
From: Daniel Gibbs <me@danielgibbs.co.uk>
Date: Tue, 24 Sep 2024 22:06:20 +0100
Subject: [PATCH 147/154] feat: upgrade docker containers to ubuntu 24.04
 (#4669)

---
 lgsm/data/serverlist.csv | 268 +++++++++++++++++++--------------------
 1 file changed, 134 insertions(+), 134 deletions(-)

diff --git a/lgsm/data/serverlist.csv b/lgsm/data/serverlist.csv
index 8b408f84f..0f350b55d 100644
--- a/lgsm/data/serverlist.csv
+++ b/lgsm/data/serverlist.csv
@@ -1,138 +1,138 @@
 shortname,gameservername,gamename,os
-ac,acserver,Assetto Corsa,ubuntu-22.04
-ahl,ahlserver,Action Half-Life,ubuntu-22.04
-ahl2,ahl2server,Action: Source,ubuntu-20.04
-ark,arkserver,ARK: Survival Evolved,ubuntu-22.04
-arma3,arma3server,ARMA 3,ubuntu-22.04
-armar,armarserver,Arma Reforger,ubuntu-20.04
-ats,atsserver,American Truck Simulator,ubuntu-22.04
-av,avserver,Avorion,ubuntu-22.04
-bb,bbserver,BrainBread,ubuntu-22.04
-bb2,bb2server,BrainBread 2,ubuntu-22.04
-bd,bdserver,Base Defense,ubuntu-22.04
-bf1942,bf1942server,Battlefield 1942,ubuntu-22.04
-bfv,bfvserver,Battlefield: Vietnam,ubuntu-22.04
-bmdm,bmdmserver,Black Mesa: Deathmatch,ubuntu-22.04
-bo,boserver,Ballistic Overkill,ubuntu-22.04
-bs,bsserver,Blade Symphony,ubuntu-22.04
-bt,btserver,Barotrauma,ubuntu-22.04
+ac,acserver,Assetto Corsa,ubuntu-24.04
+ahl,ahlserver,Action Half-Life,ubuntu-24.04
+ahl2,ahl2server,Action: Source,ubuntu-24.04
+ark,arkserver,ARK: Survival Evolved,ubuntu-24.04
+arma3,arma3server,ARMA 3,ubuntu-24.04
+armar,armarserver,Arma Reforger,ubuntu-24.04
+ats,atsserver,American Truck Simulator,ubuntu-24.04
+av,avserver,Avorion,ubuntu-24.04
+bb,bbserver,BrainBread,ubuntu-24.04
+bb2,bb2server,BrainBread 2,ubuntu-24.04
+bd,bdserver,Base Defense,ubuntu-24.04
+bf1942,bf1942server,Battlefield 1942,ubuntu-24.04
+bfv,bfvserver,Battlefield: Vietnam,ubuntu-24.04
+bmdm,bmdmserver,Black Mesa: Deathmatch,ubuntu-24.04
+bo,boserver,Ballistic Overkill,ubuntu-24.04
+bs,bsserver,Blade Symphony,ubuntu-24.04
+bt,btserver,Barotrauma,ubuntu-24.04
 btl,btlserver,BATTALION: Legacy,ubuntu-20.04
-cc,ccserver,Codename CURE,ubuntu-22.04
-ck,ckserver,Core Keeper,ubuntu-22.04
-cmw,cmwserver,Chivalry: Medieval Warfare,ubuntu-22.04
-cod,codserver,Call of Duty,ubuntu-22.04
-cod2,cod2server,Call of Duty 2,ubuntu-22.04
-cod4,cod4server,Call of Duty 4,ubuntu-22.04
-coduo,coduoserver,Call of Duty: United Offensive,ubuntu-22.04
-codwaw,codwawserver,Call of Duty: World at War,ubuntu-22.04
-col,colserver,Colony Survival,ubuntu-22.04
-cs,csserver,Counter-Strike 1.6,ubuntu-22.04
-cs2,cs2server,Counter-Strike 2,ubuntu-22.04
-cscz,csczserver,Counter-Strike: Condition Zero,ubuntu-22.04
-csgo,csgoserver,Counter-Strike: Global Offensive,ubuntu-22.04
-css,cssserver,Counter-Strike: Source,ubuntu-22.04
-ct,ctserver,Craftopia,ubuntu-22.04
-dab,dabserver,Double Action: Boogaloo,ubuntu-22.04
-dayz,dayzserver,DayZ,ubuntu-22.04
-dmc,dmcserver,Deathmatch Classic,ubuntu-22.04
-dod,dodserver,Day of Defeat,ubuntu-22.04
-dodr,dodrserver,Day of Dragons,ubuntu-22.04
-dods,dodsserver,Day of Defeat: Source,ubuntu-22.04
-doi,doiserver,Day of Infamy,ubuntu-22.04
-dst,dstserver,Don't Starve Together,ubuntu-22.04
-dys,dysserver,Dystopia,ubuntu-22.04
-eco,ecoserver,Eco,ubuntu-22.04
-em,emserver,Empires Mod,ubuntu-22.04
-etl,etlserver,ET: Legacy,ubuntu-22.04
-ets2,ets2server,Euro Truck Simulator 2,ubuntu-22.04
-fctr,fctrserver,Factorio,ubuntu-22.04
-fof,fofserver,Fistful of Frags,ubuntu-22.04
-gmod,gmodserver,Garrys Mod,ubuntu-22.04
-hcu,hcuserver,HYPERCHARGE: Unboxed,ubuntu-22.04
-hl2dm,hl2dmserver,Half-Life 2: Deathmatch,ubuntu-22.04
-hldm,hldmserver,Half-Life: Deathmatch,ubuntu-22.04
-hldms,hldmsserver,Half-Life Deathmatch: Source,ubuntu-22.04
-hw,hwserver,Hurtworld,ubuntu-22.04
-hz,hzserver,Humanitz,ubuntu-22.04
-ins,insserver,Insurgency,ubuntu-22.04
-inss,inssserver,Insurgency: Sandstorm,ubuntu-22.04
-ios,iosserver,IOSoccer,ubuntu-22.04
-jc2,jc2server,Just Cause 2,ubuntu-22.04
-jc3,jc3server,Just Cause 3,ubuntu-22.04
-jk2,jk2server,Jedi Knight II: Jedi Outcast,ubuntu-22.04
-kf,kfserver,Killing Floor,ubuntu-22.04
-kf2,kf2server,Killing Floor 2,ubuntu-22.04
-l4d,l4dserver,Left 4 Dead,ubuntu-22.04
-l4d2,l4d2server,Left 4 Dead 2,ubuntu-22.04
-mc,mcserver,Minecraft,ubuntu-22.04
-mcb,mcbserver,Minecraft Bedrock,ubuntu-22.04
-mh,mhserver,MORDHAU,ubuntu-22.04
-mohaa,mohaaserver,Medal of Honor: Allied Assault,ubuntu-22.04
-mta,mtaserver,Multi Theft Auto,ubuntu-22.04
-nd,ndserver,Nuclear Dawn,ubuntu-22.04
-nec,necserver,Necesse,ubuntu-22.04
-nmrih,nmrihserver,No More Room in Hell,ubuntu-22.04
-ns,nsserver,Natural Selection,ubuntu-22.04
-ns2,ns2server,Natural Selection 2,ubuntu-22.04
-ns2c,ns2cserver,NS2: Combat,ubuntu-22.04
-ohd,ohdserver,Operation: Harsh Doorstop,ubuntu-22.04
+cc,ccserver,Codename CURE,ubuntu-24.04
+ck,ckserver,Core Keeper,ubuntu-24.04
+cmw,cmwserver,Chivalry: Medieval Warfare,ubuntu-24.04
+cod,codserver,Call of Duty,ubuntu-24.04
+cod2,cod2server,Call of Duty 2,ubuntu-24.04
+cod4,cod4server,Call of Duty 4,ubuntu-24.04
+coduo,coduoserver,Call of Duty: United Offensive,ubuntu-24.04
+codwaw,codwawserver,Call of Duty: World at War,ubuntu-24.04
+col,colserver,Colony Survival,ubuntu-24.04
+cs,csserver,Counter-Strike 1.6,ubuntu-24.04
+cs2,cs2server,Counter-Strike 2,ubuntu-24.04
+cscz,csczserver,Counter-Strike: Condition Zero,ubuntu-24.04
+csgo,csgoserver,Counter-Strike: Global Offensive,ubuntu-24.04
+css,cssserver,Counter-Strike: Source,ubuntu-24.04
+ct,ctserver,Craftopia,ubuntu-24.04
+dab,dabserver,Double Action: Boogaloo,ubuntu-24.04
+dayz,dayzserver,DayZ,ubuntu-24.04
+dmc,dmcserver,Deathmatch Classic,ubuntu-24.04
+dod,dodserver,Day of Defeat,ubuntu-24.04
+dodr,dodrserver,Day of Dragons,ubuntu-24.04
+dods,dodsserver,Day of Defeat: Source,ubuntu-24.04
+doi,doiserver,Day of Infamy,ubuntu-24.04
+dst,dstserver,Don't Starve Together,ubuntu-24.04
+dys,dysserver,Dystopia,ubuntu-24.04
+eco,ecoserver,Eco,ubuntu-24.04
+em,emserver,Empires Mod,ubuntu-24.04
+etl,etlserver,ET: Legacy,ubuntu-24.04
+ets2,ets2server,Euro Truck Simulator 2,ubuntu-24.04
+fctr,fctrserver,Factorio,ubuntu-24.04
+fof,fofserver,Fistful of Frags,ubuntu-24.04
+gmod,gmodserver,Garrys Mod,ubuntu-24.04
+hcu,hcuserver,HYPERCHARGE: Unboxed,ubuntu-24.04
+hl2dm,hl2dmserver,Half-Life 2: Deathmatch,ubuntu-24.04
+hldm,hldmserver,Half-Life: Deathmatch,ubuntu-24.04
+hldms,hldmsserver,Half-Life Deathmatch: Source,ubuntu-24.04
+hw,hwserver,Hurtworld,ubuntu-24.04
+hz,hzserver,Humanitz,ubuntu-24.04
+ins,insserver,Insurgency,ubuntu-24.04
+inss,inssserver,Insurgency: Sandstorm,ubuntu-24.04
+ios,iosserver,IOSoccer,ubuntu-24.04
+jc2,jc2server,Just Cause 2,ubuntu-24.04
+jc3,jc3server,Just Cause 3,ubuntu-24.04
+jk2,jk2server,Jedi Knight II: Jedi Outcast,ubuntu-24.04
+kf,kfserver,Killing Floor,ubuntu-24.04
+kf2,kf2server,Killing Floor 2,ubuntu-24.04
+l4d,l4dserver,Left 4 Dead,ubuntu-24.04
+l4d2,l4d2server,Left 4 Dead 2,ubuntu-24.04
+mc,mcserver,Minecraft,ubuntu-24.04
+mcb,mcbserver,Minecraft Bedrock,ubuntu-24.04
+mh,mhserver,MORDHAU,ubuntu-24.04
+mohaa,mohaaserver,Medal of Honor: Allied Assault,ubuntu-24.04
+mta,mtaserver,Multi Theft Auto,ubuntu-24.04
+nd,ndserver,Nuclear Dawn,ubuntu-24.04
+nec,necserver,Necesse,ubuntu-24.04
+nmrih,nmrihserver,No More Room in Hell,ubuntu-24.04
+ns,nsserver,Natural Selection,ubuntu-24.04
+ns2,ns2server,Natural Selection 2,ubuntu-24.04
+ns2c,ns2cserver,NS2: Combat,ubuntu-24.04
+ohd,ohdserver,Operation: Harsh Doorstop,ubuntu-24.04
 onset,onsetserver,Onset,ubuntu-20.04
-opfor,opforserver,Opposing Force,ubuntu-22.04
-pc,pcserver,Project Cars,ubuntu-22.04
-pc2,pc2server,Project Cars 2,ubuntu-22.04
-pmc,pmcserver,PaperMC,ubuntu-22.04
-ps,psserver,Post Scriptum,ubuntu-22.04
-pvkii,pvkiiserver,Pirates Vikings & Knights II,ubuntu-22.04
-pvr,pvrserver,Pavlov VR,ubuntu-22.04
-pw,pwserver,Palworld,ubuntu-22.04
-pz,pzserver,Project Zomboid,ubuntu-22.04
-q2,q2server,Quake 2,ubuntu-22.04
-q3,q3server,Quake 3: Arena,ubuntu-22.04
-q4,q4server,Quake 4,ubuntu-22.04
-ql,qlserver,Quake Live,ubuntu-22.04
-qw,qwserver,Quake World,ubuntu-22.04
-ricochet,ricochetserver,Ricochet,ubuntu-22.04
-ro,roserver,Red Orchestra: Ostfront 41-45,ubuntu-22.04
-rtcw,rtcwserver,Return to Castle Wolfenstein,ubuntu-22.04
-rust,rustserver,Rust,ubuntu-22.04
-rw,rwserver,Rising World,ubuntu-22.04
-samp,sampserver,San Andreas Multiplayer,ubuntu-22.04
-sb,sbserver,Starbound,ubuntu-22.04
-sbots,sbotsserver,StickyBots,ubuntu-22.04
-scpsl,scpslserver,SCP: Secret Laboratory,ubuntu-22.04
-scpslsm,scpslsmserver,SCP: Secret Laboratory ServerMod,ubuntu-22.04
-sdtd,sdtdserver,7 Days to Die,ubuntu-22.04
-sf,sfserver,Satisfactory,ubuntu-22.04
-sfc,sfcserver,SourceForts Classic,ubuntu-22.04
-sm,smserver,Soulmask,ubuntu-22.04
-sof2,sof2server,Soldier Of Fortune 2: Gold Edition,ubuntu-22.04
-sol,solserver,Soldat,ubuntu-22.04
-squad,squadserver,Squad,ubuntu-22.04
-st,stserver,Stationeers,ubuntu-22.04
-stn,stnserver,Survive the Nights,ubuntu-22.04
+opfor,opforserver,Opposing Force,ubuntu-24.04
+pc,pcserver,Project Cars,ubuntu-24.04
+pc2,pc2server,Project Cars 2,ubuntu-24.04
+pmc,pmcserver,PaperMC,ubuntu-24.04
+ps,psserver,Post Scriptum,ubuntu-24.04
+pvkii,pvkiiserver,Pirates Vikings & Knights II,ubuntu-24.04
+pvr,pvrserver,Pavlov VR,ubuntu-24.04
+pw,pwserver,Palworld,ubuntu-24.04
+pz,pzserver,Project Zomboid,ubuntu-24.04
+q2,q2server,Quake 2,ubuntu-24.04
+q3,q3server,Quake 3: Arena,ubuntu-24.04
+q4,q4server,Quake 4,ubuntu-24.04
+ql,qlserver,Quake Live,ubuntu-24.04
+qw,qwserver,Quake World,ubuntu-24.04
+ricochet,ricochetserver,Ricochet,ubuntu-24.04
+ro,roserver,Red Orchestra: Ostfront 41-45,ubuntu-24.04
+rtcw,rtcwserver,Return to Castle Wolfenstein,ubuntu-24.04
+rust,rustserver,Rust,ubuntu-24.04
+rw,rwserver,Rising World,ubuntu-24.04
+samp,sampserver,San Andreas Multiplayer,ubuntu-24.04
+sb,sbserver,Starbound,ubuntu-24.04
+sbots,sbotsserver,StickyBots,ubuntu-24.04
+scpsl,scpslserver,SCP: Secret Laboratory,ubuntu-24.04
+scpslsm,scpslsmserver,SCP: Secret Laboratory ServerMod,ubuntu-24.04
+sdtd,sdtdserver,7 Days to Die,ubuntu-24.04
+sf,sfserver,Satisfactory,ubuntu-24.04
+sfc,sfcserver,SourceForts Classic,ubuntu-24.04
+sm,smserver,Soulmask,ubuntu-24.04
+sof2,sof2server,Soldier Of Fortune 2: Gold Edition,ubuntu-24.04
+sol,solserver,Soldat,ubuntu-24.04
+squad,squadserver,Squad,ubuntu-24.04
+st,stserver,Stationeers,ubuntu-24.04
+stn,stnserver,Survive the Nights,ubuntu-24.04
 sven,svenserver,Sven Co-op,ubuntu-20.04
-terraria,terrariaserver,Terraria,ubuntu-22.04
-tf,tfserver,The Front,ubuntu-22.04
-tf2,tf2server,Team Fortress 2,ubuntu-22.04
-tfc,tfcserver,Team Fortress Classic,ubuntu-22.04
-ti,tiserver,The Isle,ubuntu-22.04
-ts,tsserver,The Specialists,ubuntu-22.04
-ts3,ts3server,Teamspeak 3,ubuntu-22.04
-tu,tuserver,Tower Unite,ubuntu-22.04
-tw,twserver,Teeworlds,ubuntu-22.04
-unt,untserver,Unturned,ubuntu-22.04
-ut,utserver,Unreal Tournament,ubuntu-22.04
-ut2k4,ut2k4server,Unreal Tournament 2004,ubuntu-22.04
-ut3,ut3server,Unreal Tournament 3,ubuntu-22.04
-ut99,ut99server,Unreal Tournament 99,ubuntu-22.04
-vh,vhserver,Valheim,ubuntu-22.04
-vints,vintsserver,Vintage Story,ubuntu-22.04
-vpmc,vpmcserver,Velocity Proxy MC,ubuntu-22.04
-vs,vsserver,Vampire Slayer,ubuntu-22.04
-wet,wetserver,Wolfenstein: Enemy Territory,ubuntu-22.04
-wf,wfserver,Warfork,ubuntu-22.04
-wmc,wmcserver,WaterfallMC,ubuntu-22.04
-wurm,wurmserver,Wurm Unlimited,ubuntu-22.04
-xnt,xntserver,Xonotic,ubuntu-22.04
-zmr,zmrserver,Zombie Master: Reborn,ubuntu-22.04
-zps,zpsserver,Zombie Panic! Source,ubuntu-22.04
+terraria,terrariaserver,Terraria,ubuntu-24.04
+tf,tfserver,The Front,ubuntu-24.04
+tf2,tf2server,Team Fortress 2,ubuntu-24.04
+tfc,tfcserver,Team Fortress Classic,ubuntu-24.04
+ti,tiserver,The Isle,ubuntu-24.04
+ts,tsserver,The Specialists,ubuntu-24.04
+ts3,ts3server,Teamspeak 3,ubuntu-24.04
+tu,tuserver,Tower Unite,ubuntu-24.04
+tw,twserver,Teeworlds,ubuntu-24.04
+unt,untserver,Unturned,ubuntu-24.04
+ut,utserver,Unreal Tournament,ubuntu-24.04
+ut2k4,ut2k4server,Unreal Tournament 2004,ubuntu-24.04
+ut3,ut3server,Unreal Tournament 3,ubuntu-24.04
+ut99,ut99server,Unreal Tournament 99,ubuntu-24.04
+vh,vhserver,Valheim,ubuntu-24.04
+vints,vintsserver,Vintage Story,ubuntu-24.04
+vpmc,vpmcserver,Velocity Proxy MC,ubuntu-24.04
+vs,vsserver,Vampire Slayer,ubuntu-24.04
+wet,wetserver,Wolfenstein: Enemy Territory,ubuntu-24.04
+wf,wfserver,Warfork,ubuntu-24.04
+wmc,wmcserver,WaterfallMC,ubuntu-24.04
+wurm,wurmserver,Wurm Unlimited,ubuntu-24.04
+xnt,xntserver,Xonotic,ubuntu-24.04
+zmr,zmrserver,Zombie Master: Reborn,ubuntu-24.04
+zps,zpsserver,Zombie Panic! Source,ubuntu-24.04

From 72bb39ec049331adb9648bd74eb902858e5583ce Mon Sep 17 00:00:00 2001
From: Daniel Gibbs <me@danielgibbs.co.uk>
Date: Tue, 24 Sep 2024 22:38:44 +0100
Subject: [PATCH 148/154] fix: revert urls to correct data dir

---
 .github/workflows/details-check-generate-matrix.sh |  2 +-
 lgsm/modules/alert.sh                              |  2 +-
 lgsm/modules/alert_discord.sh                      | 12 ++++++------
 lgsm/modules/alert_rocketchat.sh                   |  4 ++--
 lgsm/modules/alert_slack.sh                        |  4 ++--
 lgsm/modules/check_deps.sh                         |  4 ++--
 lgsm/modules/command_update_linuxgsm.sh            |  8 ++++----
 7 files changed, 18 insertions(+), 18 deletions(-)

diff --git a/.github/workflows/details-check-generate-matrix.sh b/.github/workflows/details-check-generate-matrix.sh
index 1f4bc1d53..bba9e8d5d 100755
--- a/.github/workflows/details-check-generate-matrix.sh
+++ b/.github/workflows/details-check-generate-matrix.sh
@@ -1,6 +1,6 @@
 #!/bin/bash
 
-curl "https://raw.githubusercontent.com/GameServerManagers/LinuxGSM/${GITHUB_REF#refs/heads/}/${datadir}/serverlist.csv" | grep -v '^[[:blank:]]*$' > serverlist.csv
+curl "https://raw.githubusercontent.com/GameServerManagers/LinuxGSM/${GITHUB_REF#refs/heads/}/lgsm/data/serverlist.csv" | grep -v '^[[:blank:]]*$' > serverlist.csv
 
 echo -n "{" > "shortnamearray.json"
 echo -n "\"include\":[" >> "shortnamearray.json"
diff --git a/lgsm/modules/alert.sh b/lgsm/modules/alert.sh
index 814799e80..f2698e3b7 100644
--- a/lgsm/modules/alert.sh
+++ b/lgsm/modules/alert.sh
@@ -198,7 +198,7 @@ fn_alert_info() {
 }
 
 # Images
-alerticon="https://raw.githubusercontent.com/${githubuser}/${githubrepo}/${githubbranch}/${datadir}/gameicons/${shortname}-icon.png"
+alerticon="https://raw.githubusercontent.com/${githubuser}/${githubrepo}/${githubbranch}/lgsm/data/gameicons/${shortname}-icon.png"
 
 if [ "${alert}" == "permissions" ]; then
 	fn_alert_permissions
diff --git a/lgsm/modules/alert_discord.sh b/lgsm/modules/alert_discord.sh
index 6f362b4f7..93eda8d5b 100644
--- a/lgsm/modules/alert_discord.sh
+++ b/lgsm/modules/alert_discord.sh
@@ -11,14 +11,14 @@ jsoninfo=$(
 	cat << EOF
 {
     "username": "LinuxGSM",
-    "avatar_url": "https://raw.githubusercontent.com/${githubuser}/${githubrepo}/${githubbranch}/${datadir}/alert_discord_logo.jpg",
+    "avatar_url": "https://raw.githubusercontent.com/${githubuser}/${githubrepo}/${githubbranch}/lgsm/data/alert_discord_logo.jpg",
     "file": "content",
     "embeds": [
         {
             "author": {
                 "name": "LinuxGSM Alert",
                 "url": "",
-                "icon_url": "https://raw.githubusercontent.com/${githubuser}/${githubrepo}/${githubbranch}/${datadir}/alert_discord_logo.jpg"
+                "icon_url": "https://raw.githubusercontent.com/${githubuser}/${githubrepo}/${githubbranch}/lgsm/data/alert_discord_logo.jpg"
             },
             "title": "${alerttitle}",
             "url": "",
@@ -64,7 +64,7 @@ jsoninfo=$(
                 }
             ],
             "footer": {
-				"icon_url": "https://raw.githubusercontent.com/${githubuser}/${githubrepo}/${githubbranch}/${datadir}/alert_discord_logo.jpg",
+				"icon_url": "https://raw.githubusercontent.com/${githubuser}/${githubrepo}/${githubbranch}/lgsm/data/alert_discord_logo.jpg",
                 "text": "Sent by LinuxGSM ${version}"
             }
         }
@@ -77,14 +77,14 @@ jsonnoinfo=$(
 	cat << EOF
 {
     "username": "LinuxGSM",
-    "avatar_url": "https://raw.githubusercontent.com/${githubuser}/${githubrepo}/${githubbranch}/${datadir}/alert_discord_logo.jpg",
+    "avatar_url": "https://raw.githubusercontent.com/${githubuser}/${githubrepo}/${githubbranch}/lgsm/data/alert_discord_logo.jpg",
     "file": "content",
     "embeds": [
         {
             "author": {
                 "name": "LinuxGSM Alert",
                 "url": "",
-                "icon_url": "https://raw.githubusercontent.com/${githubuser}/${githubrepo}/${githubbranch}/${datadir}/alert_discord_logo.jpg"
+                "icon_url": "https://raw.githubusercontent.com/${githubuser}/${githubrepo}/${githubbranch}/lgsm/data/alert_discord_logo.jpg"
             },
             "title": "${alerttitle}",
             "url": "",
@@ -125,7 +125,7 @@ jsonnoinfo=$(
                 }
             ],
             "footer": {
-				"icon_url": "https://raw.githubusercontent.com/${githubuser}/${githubrepo}/${githubbranch}/${datadir}/alert_discord_logo.jpg",
+				"icon_url": "https://raw.githubusercontent.com/${githubuser}/${githubrepo}/${githubbranch}/lgsm/data/alert_discord_logo.jpg",
                 "text": "Sent by LinuxGSM ${version}"
             }
         }
diff --git a/lgsm/modules/alert_rocketchat.sh b/lgsm/modules/alert_rocketchat.sh
index d0077c5f9..bff2c6a0b 100644
--- a/lgsm/modules/alert_rocketchat.sh
+++ b/lgsm/modules/alert_rocketchat.sh
@@ -18,7 +18,7 @@ jsoninfo=$(
 			"color": "${alertcolourhex}",
 			"author_name": "LinuxGSM Alert",
 			"author_link": "https://linuxgsm.com",
-			"author_icon": "https://raw.githubusercontent.com/${githubuser}/${githubrepo}/${githubbranch}/${datadir}/alert_discord_logo.jpg",
+			"author_icon": "https://raw.githubusercontent.com/${githubuser}/${githubrepo}/${githubbranch}/lgsm/data/alert_discord_logo.jpg",
 			"thumb_url": "${alerticon}",
 			"text": "",
 			"fields": [
@@ -75,7 +75,7 @@ jsonnoinfo=$(
 			"color": "${alertcolourhex}",
 			"author_name": "LinuxGSM Alert",
 			"author_link": "https://linuxgsm.com",
-			"author_icon": "https://raw.githubusercontent.com/${githubuser}/${githubrepo}/${githubbranch}/${datadir}/alert_discord_logo.jpg",
+			"author_icon": "https://raw.githubusercontent.com/${githubuser}/${githubrepo}/${githubbranch}/lgsm/data/alert_discord_logo.jpg",
 			"thumb_url": "${alerticon}",
 			"text": "",
 			"fields": [
diff --git a/lgsm/modules/alert_slack.sh b/lgsm/modules/alert_slack.sh
index f6c6e503c..58dc54772 100644
--- a/lgsm/modules/alert_slack.sh
+++ b/lgsm/modules/alert_slack.sh
@@ -70,7 +70,7 @@ jsonnoinfo=$(
 					"elements": [
 						{
 							"type": "image",
-							"image_url": "https://raw.githubusercontent.com/${githubuser}/${githubrepo}/${githubbranch}/${datadir}/alert_discord_logo.jpg",
+							"image_url": "https://raw.githubusercontent.com/${githubuser}/${githubrepo}/${githubbranch}/lgsm/data/alert_discord_logo.jpg",
 							"alt_text": "LinuxGSM icon"
 						},
 						{
@@ -157,7 +157,7 @@ jsoninfo=$(
 					"elements": [
 						{
 							"type": "image",
-							"image_url": "https://raw.githubusercontent.com/${githubuser}/${githubrepo}/${githubbranch}/${datadir}/alert_discord_logo.jpg",
+							"image_url": "https://raw.githubusercontent.com/${githubuser}/${githubrepo}/${githubbranch}/lgsm/data/alert_discord_logo.jpg",
 							"alt_text": "LinuxGSM icon"
 						},
 						{
diff --git a/lgsm/modules/check_deps.sh b/lgsm/modules/check_deps.sh
index 67e0c8ba7..ea4e82b81 100644
--- a/lgsm/modules/check_deps.sh
+++ b/lgsm/modules/check_deps.sh
@@ -358,9 +358,9 @@ info_distro.sh
 
 if [ ! -f "${tmpdir}/dependency-no-check.tmp" ] && [ ! -f "${datadir}/${distroid}-${distroversioncsv}.csv" ]; then
 	# Check that the distro dependency csv file exists.
-	fn_check_file_github "${datadir}" "${distroid}-${distroversioncsv}.csv"
+	fn_check_file_github "lgsm/data" "${distroid}-${distroversioncsv}.csv"
 	if [ -n "${checkflag}" ] && [ "${checkflag}" == "0" ]; then
-		fn_fetch_file_github "${datadir}" "${distroid}-${distroversioncsv}.csv" "${datadir}" "chmodx" "norun" "noforce" "nohash"
+		fn_fetch_file_github "lgsm/data" "${distroid}-${distroversioncsv}.csv" "${datadir}" "chmodx" "norun" "noforce" "nohash"
 	fi
 fi
 
diff --git a/lgsm/modules/command_update_linuxgsm.sh b/lgsm/modules/command_update_linuxgsm.sh
index 27adf9b71..eb4226ab8 100644
--- a/lgsm/modules/command_update_linuxgsm.sh
+++ b/lgsm/modules/command_update_linuxgsm.sh
@@ -160,9 +160,9 @@ if [ -f "${datadir}/${distroid}-${distroversioncsv}.csv" ]; then
 	echo -en "checking ${remotereponame} config ${distroid}-${distroversioncsv}.csv...\c"
 	fn_script_log_info "Checking ${remotereponame} ${distroid}-${distroversioncsv}.csv"
 	if [ "${remotereponame}" == "GitHub" ]; then
-		curl ${nocache} --connect-timeout 3 -IsfL "https://raw.githubusercontent.com/${githubuser}/${githubrepo}/${githubbranch}/${datadir}/${distroid}-${distroversioncsv}.csv" 1> /dev/null
+		curl ${nocache} --connect-timeout 3 -IsfL "https://raw.githubusercontent.com/${githubuser}/${githubrepo}/${githubbranch}/lgsm/data/${distroid}-${distroversioncsv}.csv" 1> /dev/null
 	else
-		curl ${nocache} --connect-timeout 3 -IsfL "https://bitbucket.org/${githubuser}/${githubrepo}/raw/${githubbranch}/${datadir}/${distroid}-${distroversioncsv}.csv" 1> /dev/null
+		curl ${nocache} --connect-timeout 3 -IsfL "https://bitbucket.org/${githubuser}/${githubrepo}/raw/${githubbranch}/lgsm/data/${distroid}-${distroversioncsv}.csv" 1> /dev/null
 	fi
 	if [ $? != "0" ]; then
 		fn_print_fail_eol_nl
@@ -172,9 +172,9 @@ if [ -f "${datadir}/${distroid}-${distroversioncsv}.csv" ]; then
 	fi
 
 	if [ "${remotereponame}" == "GitHub" ]; then
-		config_file_diff=$(diff "${datadir}/${distroid}-${distroversioncsv}.csv" <(curl ${nocache} --connect-timeout 3 -s "https://raw.githubusercontent.com/${githubuser}/${githubrepo}/${githubbranch}/${datadir}/${distroid}-${distroversioncsv}.csv"))
+		config_file_diff=$(diff "${datadir}/${distroid}-${distroversioncsv}.csv" <(curl ${nocache} --connect-timeout 3 -s "https://raw.githubusercontent.com/${githubuser}/${githubrepo}/${githubbranch}/lgsm/data/${distroid}-${distroversioncsv}.csv"))
 	else
-		config_file_diff=$(diff "${datadir}/${distroid}-${distroversioncsv}.csv" <(curl ${nocache} --connect-timeout 3 -s "https://bitbucket.org/${githubuser}/${githubrepo}/raw/${githubbranch}/${datadir}/${distroid}-${distroversioncsv}.csv"))
+		config_file_diff=$(diff "${datadir}/${distroid}-${distroversioncsv}.csv" <(curl ${nocache} --connect-timeout 3 -s "https://bitbucket.org/${githubuser}/${githubrepo}/raw/${githubbranch}/lgsm/data/${distroid}-${distroversioncsv}.csv"))
 	fi
 
 	if [ "${config_file_diff}" != "" ]; then

From 108dd27c3280ea164e52e3111a17ad6e0b163080 Mon Sep 17 00:00:00 2001
From: Daniel Gibbs <me@danielgibbs.co.uk>
Date: Tue, 24 Sep 2024 23:38:13 +0100
Subject: [PATCH 149/154] feat: add arch check to prevent arm devices from
 working as not supported

---
 lgsm/modules/check_system_requirements.sh | 6 +++++-
 1 file changed, 5 insertions(+), 1 deletion(-)

diff --git a/lgsm/modules/check_system_requirements.sh b/lgsm/modules/check_system_requirements.sh
index a7314a0d8..7dd0551a5 100644
--- a/lgsm/modules/check_system_requirements.sh
+++ b/lgsm/modules/check_system_requirements.sh
@@ -9,7 +9,11 @@ moduleselfname="$(basename "$(readlink -f "${BASH_SOURCE[0]}")")"
 
 info_distro.sh
 
-# RAM requirements in gigabytes for each game or engine.
+if [[ "${arch}" != "x86_64" && "${arch}" != "i386" && "${arch}" != "i686" ]]; then
+	echo -e "${red}Error: Only x86 type architectures are supported. Detected architecture: ${arch}${default}"
+	fn_script_log_error "Only x86 type architectures are supported. Detected architecture: ${arch}"
+	core_exit.sh
+fi
 
 if [ "${shortname}" == "ark" ]; then
 	ramrequirementgb="7"

From 5c31f3344624998b022d54140cbbb6f226240165 Mon Sep 17 00:00:00 2001
From: Daniel Gibbs <me@danielgibbs.co.uk>
Date: Wed, 25 Sep 2024 11:37:16 +0100
Subject: [PATCH 150/154] fix: change exitcode to 0 if dependency install was
 successful

---
 lgsm/modules/check_deps.sh | 3 ++-
 1 file changed, 2 insertions(+), 1 deletion(-)

diff --git a/lgsm/modules/check_deps.sh b/lgsm/modules/check_deps.sh
index ea4e82b81..d7df071d3 100644
--- a/lgsm/modules/check_deps.sh
+++ b/lgsm/modules/check_deps.sh
@@ -195,9 +195,10 @@ fn_install_missing_deps() {
 			fi
 			autodepinstall="$?"
 
-			# If auto install passes remove steamcmd install failure.
+			# If auto install passes, remove steamcmd install failure and set exit code to 0.
 			if [ "${autodepinstall}" == "0" ]; then
 				unset steamcmdfail
+				exitcode=0
 			fi
 		fi
 

From d4ffe395051d35ff8283d4bbfee3c9e05d1c42b8 Mon Sep 17 00:00:00 2001
From: Armin <50357737+PlayMTL@users.noreply.github.com>
Date: Sat, 28 Sep 2024 14:16:03 +0200
Subject: [PATCH 151/154] fix(mcbserver): Wrong download url for serverfiles
 (#4675)

* fix(mcbserver): update download url

* change(core_dl/fn_fetch_file): add useragent to fix mcbedrock download
---
 lgsm/modules/core_dl.sh    | 2 +-
 lgsm/modules/update_mcb.sh | 4 ++--
 2 files changed, 3 insertions(+), 3 deletions(-)

diff --git a/lgsm/modules/core_dl.sh b/lgsm/modules/core_dl.sh
index dde24d9da..68d0cf576 100644
--- a/lgsm/modules/core_dl.sh
+++ b/lgsm/modules/core_dl.sh
@@ -393,7 +393,7 @@ fn_fetch_file() {
 			fi
 			# Trap will remove part downloaded files if canceled.
 			trap fn_fetch_trap INT
-			curlcmd=(curl --connect-timeout 3 --fail -L -o "${local_filedir}/${local_filename}" --retry 2)
+			curlcmd=(curl --connect-timeout 3 --fail -L -o "${local_filedir}/${local_filename}" --retry 2 -A "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/90.0.${randomint}.212 Safari/537.36")
 
 			# if is large file show progress, else be silent
 			local exitcode=""
diff --git a/lgsm/modules/update_mcb.sh b/lgsm/modules/update_mcb.sh
index 55b3586fd..65ebc2546 100644
--- a/lgsm/modules/update_mcb.sh
+++ b/lgsm/modules/update_mcb.sh
@@ -53,11 +53,11 @@ fn_update_remotebuild() {
 	randomint=$(tr -dc 0-9 < /dev/urandom 2> /dev/null | head -c 4 | xargs)
 	# Get remote build info.
 	if [ "${mcversion}" == "latest" ]; then
-		remotebuildversion=$(curl -H "Accept-Encoding: identity" -H "Accept-Language: en" -Ls -A "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/90.0.${randomint}.212 Safari/537.36" "https://www.minecraft.net/en-us/download/server/bedrock/" | grep -o 'https://minecraft.azureedge.net/bin-linux/[^"]*' | sed 's/.*\///' | grep -Eo "[.0-9]+[0-9]")
+		remotebuildversion=$(curl -H "Accept-Encoding: identity" -H "Accept-Language: en" -Ls -A "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/90.0.${randomint}.212 Safari/537.36" "https://www.minecraft.net/en-us/download/server/bedrock/" | grep -o 'https://www.minecraft.net/bedrockdedicatedserver/bin-linux/[^"]*' | sed 's/.*\///' | grep -Eo "[.0-9]+[0-9]")
 	else
 		remotebuildversion="${mcversion}"
 	fi
-	remotebuildurl="https://minecraft.azureedge.net/bin-linux/bedrock-server-${remotebuildversion}.zip"
+	remotebuildurl="https://www.minecraft.net/bedrockdedicatedserver/bin-linux/bedrock-server-${remotebuildversion}.zip"
 
 	if [ "${firstcommandname}" != "INSTALL" ]; then
 		fn_print_dots "Checking remote build: ${remotelocation}"

From 764032b0502fc5f859ef684b6afcfc80daa19be5 Mon Sep 17 00:00:00 2001
From: Daniel Gibbs <me@danielgibbs.co.uk>
Date: Sat, 28 Sep 2024 13:20:31 +0100
Subject: [PATCH 152/154] Release v24.3.1

---
 lgsm/modules/core_modules.sh | 2 +-
 linuxgsm.sh                  | 2 +-
 2 files changed, 2 insertions(+), 2 deletions(-)

diff --git a/lgsm/modules/core_modules.sh b/lgsm/modules/core_modules.sh
index 10f6e0990..d040cf942 100644
--- a/lgsm/modules/core_modules.sh
+++ b/lgsm/modules/core_modules.sh
@@ -8,7 +8,7 @@
 
 moduleselfname="$(basename "$(readlink -f "${BASH_SOURCE[0]}")")"
 
-modulesversion="v24.3.0"
+modulesversion="v24.3.1"
 
 # Core
 
diff --git a/linuxgsm.sh b/linuxgsm.sh
index 8c83cdc58..b30ed57e8 100755
--- a/linuxgsm.sh
+++ b/linuxgsm.sh
@@ -24,7 +24,7 @@ if [ -f ".dev-debug" ]; then
 	set -x
 fi
 
-version="v24.3.0"
+version="v24.3.1"
 shortname="core"
 gameservername="core"
 commandname="CORE"

From 3335ca53a052caae4e637934fd0e7e708110d159 Mon Sep 17 00:00:00 2001
From: Daniel Gibbs <me@danielgibbs.co.uk>
Date: Sat, 28 Sep 2024 13:55:10 +0100
Subject: [PATCH 153/154] fix: datadir bug

---
 linuxgsm.sh | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/linuxgsm.sh b/linuxgsm.sh
index c02d3f849..b30ed57e8 100755
--- a/linuxgsm.sh
+++ b/linuxgsm.sh
@@ -345,7 +345,7 @@ fi
 # LinuxGSM installer mode.
 if [ "${shortname}" == "core" ]; then
 	# Download the latest serverlist. This is the complete list of all supported servers.
-	fn_bootstrap_fetch_file_github "${datadir}" "serverlist.csv" "${datadir}" "nochmodx" "norun" "forcedl" "nomd5"
+	fn_bootstrap_fetch_file_github "lgsm/data" "serverlist.csv" "${datadir}" "nochmodx" "norun" "forcedl" "nomd5"
 	if [ ! -f "${serverlist}" ]; then
 		echo -e "[ FAIL ] serverlist.csv could not be loaded."
 		exit 1

From e5fabecdad2f0d2e1f1cd6a295288eac12d4f8c0 Mon Sep 17 00:00:00 2001
From: Emmanuel Ferdman <emmanuelferdman@gmail.com>
Date: Sat, 28 Sep 2024 23:35:41 +0300
Subject: [PATCH 154/154] fix: update license reference (#4678)

Signed-off-by: Emmanuel Ferdman <emmanuelferdman@gmail.com>
---
 README.md | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/README.md b/README.md
index db89b8548..4075a4e3d 100644
--- a/README.md
+++ b/README.md
@@ -4,7 +4,7 @@
 	<a href="https://bitbucket.org/GameServerManagers/linuxgsm"><img alt="GitHub Workflow Status" src="https://img.shields.io/github/actions/workflow/status/GameServerManagers/LinuxGSM/git-sync.yml?color=0052CC&logo=bitbucket&style=flat-square"></a>
 	<a href="https://linuxgsm.com/discord"><img alt="Discord" src="https://img.shields.io/discord/127498813903601664?color=5865F2&label=%20&logo=discord&logoColor=ffffff&style=flat-square"></a>
 	<a href="https://developer.valvesoftware.com/wiki/SteamCMD"><img src="https://img.shields.io/badge/SteamCMD-000000?style=flat-square&amp;logo=Steam&amp;logoColor=white" alt="SteamCMD"></a>
-	<a href="https://github.com/GameServerManagers/LinuxGSM/blob/main/LICENSE"><img src="https://img.shields.io/github/license/gameservermanagers/LinuxGSM?style=flat-square" alt="MIT License"></a>
+	<a href="https://github.com/GameServerManagers/LinuxGSM/blob/master/LICENSE.md"><img src="https://img.shields.io/github/license/gameservermanagers/LinuxGSM?style=flat-square" alt="MIT License"></a>
 </p>
 
 [LinuxGSM](https://linuxgsm.com) is the command-line tool for quick, simple deployment and management of Linux dedicated game servers.