mirror of
https://gitlab.com/crafty-controller/crafty-4.git
synced 2024-08-30 18:23:09 +00:00
Merge branch 'dev' into bugfix/unicode-terminal
This commit is contained in:
commit
94a63767f7
10
CHANGELOG.md
10
CHANGELOG.md
@ -1,11 +1,15 @@
|
|||||||
# Changelog
|
# Changelog
|
||||||
## --- [4.2.3] - 2023/TBD
|
## --- [4.2.3] - 2023/TBD
|
||||||
### New features
|
### New features
|
||||||
TBD
|
- Use Papermc Group's API for `paper` & `folia` builds in server builder ([Merge Request](https://gitlab.com/crafty-controller/crafty-4/-/merge_requests/688))
|
||||||
|
- Allow omission of player count from Dashboard (e.g. for proxy servers) ([Merge Request](https://gitlab.com/crafty-controller/crafty-4/-/merge_requests/692))
|
||||||
### Bug fixes
|
### Bug fixes
|
||||||
TBD
|
- Fix bukkit and downstream fork MOTD crash ([Merge Request](https://gitlab.com/crafty-controller/crafty-4/-/merge_requests/686))
|
||||||
|
- Fix bug where invalid server Id leads to stack ([Merge Request](https://gitlab.com/crafty-controller/crafty-4/-/merge_requests/690))
|
||||||
|
- Fix indent on public status check box ([Merge Request](https://gitlab.com/crafty-controller/crafty-4/-/merge_requests/691))
|
||||||
### Tweaks
|
### Tweaks
|
||||||
TBD
|
- Refactor Forge server initialisation flow for newer versions ([Merge Request](https://gitlab.com/crafty-controller/crafty-4/-/merge_requests/687))
|
||||||
|
- Remove scroll bars from player management ([Merge Request](https://gitlab.com/crafty-controller/crafty-4/-/merge_requests/693))
|
||||||
### Lang
|
### Lang
|
||||||
TBD
|
TBD
|
||||||
<br><br>
|
<br><br>
|
||||||
|
@ -462,7 +462,10 @@ class ServersController(metaclass=Singleton):
|
|||||||
|
|
||||||
@staticmethod
|
@staticmethod
|
||||||
def server_id_exists(server_id):
|
def server_id_exists(server_id):
|
||||||
|
try:
|
||||||
srv = ServersController().get_server_instance_by_id(server_id)
|
srv = ServersController().get_server_instance_by_id(server_id)
|
||||||
|
except ValueError:
|
||||||
|
return False
|
||||||
return srv.stats_helper.server_id_exists()
|
return srv.stats_helper.server_id_exists()
|
||||||
|
|
||||||
@staticmethod
|
@staticmethod
|
||||||
|
@ -12,6 +12,7 @@ from app.classes.minecraft.bedrock_ping import BedrockPing
|
|||||||
from app.classes.shared.console import Console
|
from app.classes.shared.console import Console
|
||||||
|
|
||||||
logger = logging.getLogger(__name__)
|
logger = logging.getLogger(__name__)
|
||||||
|
MOTD_CODES = ["bold", "italic", "underlined", "strikethrough"]
|
||||||
|
|
||||||
|
|
||||||
class Server:
|
class Server:
|
||||||
@ -34,18 +35,19 @@ class Server:
|
|||||||
lines = []
|
lines = []
|
||||||
|
|
||||||
description = self.description
|
description = self.description
|
||||||
|
if "text" in description.keys():
|
||||||
|
lines.append(description["text"])
|
||||||
if "extra" in description.keys():
|
if "extra" in description.keys():
|
||||||
|
if isinstance(description["extra"], list):
|
||||||
for e in description["extra"]:
|
for e in description["extra"]:
|
||||||
|
if not isinstance(e, dict):
|
||||||
|
lines.append(e)
|
||||||
|
continue
|
||||||
# Conversion format code needed only for Java Version
|
# Conversion format code needed only for Java Version
|
||||||
lines.append(get_code_format("reset"))
|
lines.append(get_code_format("reset"))
|
||||||
if "bold" in e.keys():
|
for item in MOTD_CODES:
|
||||||
lines.append(get_code_format("bold"))
|
if e.get(item, False):
|
||||||
if "italic" in e.keys():
|
lines.append(get_code_format(item))
|
||||||
lines.append(get_code_format("italic"))
|
|
||||||
if "underlined" in e.keys():
|
|
||||||
lines.append(get_code_format("underlined"))
|
|
||||||
if "strikethrough" in e.keys():
|
|
||||||
lines.append(get_code_format("strikethrough"))
|
|
||||||
if "color" in e.keys():
|
if "color" in e.keys():
|
||||||
lines.append(get_code_format(e["color"]))
|
lines.append(get_code_format(e["color"]))
|
||||||
# Then append the text
|
# Then append the text
|
||||||
|
@ -11,12 +11,18 @@ from app.classes.models.server_permissions import PermissionsServers
|
|||||||
from app.classes.shared.websocket_manager import WebSocketManager
|
from app.classes.shared.websocket_manager import WebSocketManager
|
||||||
|
|
||||||
logger = logging.getLogger(__name__)
|
logger = logging.getLogger(__name__)
|
||||||
|
PAPERJARS = ["paper", "folia"]
|
||||||
|
|
||||||
|
|
||||||
class ServerJars:
|
class ServerJars:
|
||||||
def __init__(self, helper):
|
def __init__(self, helper):
|
||||||
self.helper = helper
|
self.helper = helper
|
||||||
self.base_url = "https://serverjars.com"
|
self.base_url = "https://serverjars.com"
|
||||||
|
self.paper_base = "https://api.papermc.io"
|
||||||
|
|
||||||
|
@staticmethod
|
||||||
|
def get_paper_jars():
|
||||||
|
return PAPERJARS
|
||||||
|
|
||||||
def _get_api_result(self, call_url: str):
|
def _get_api_result(self, call_url: str):
|
||||||
full_url = f"{self.base_url}{call_url}"
|
full_url = f"{self.base_url}{call_url}"
|
||||||
@ -38,6 +44,40 @@ class ServerJars:
|
|||||||
|
|
||||||
return api_response
|
return api_response
|
||||||
|
|
||||||
|
def get_paper_versions(self, project):
|
||||||
|
try:
|
||||||
|
response = requests.get(
|
||||||
|
f"{self.paper_base}/v2/projects/{project}/", timeout=2
|
||||||
|
)
|
||||||
|
response.raise_for_status()
|
||||||
|
api_data = json.loads(response.content)
|
||||||
|
except Exception as e:
|
||||||
|
logger.error(
|
||||||
|
f"Unable to load https://api.papermc.io/v2/projects/{project}/"
|
||||||
|
f"api due to error: {e}"
|
||||||
|
)
|
||||||
|
return {}
|
||||||
|
versions = api_data.get("versions", [])
|
||||||
|
versions.reverse()
|
||||||
|
return versions
|
||||||
|
|
||||||
|
def get_paper_build(self, project, version):
|
||||||
|
try:
|
||||||
|
response = requests.get(
|
||||||
|
f"{self.paper_base}/v2/projects/{project}/versions/{version}/builds/",
|
||||||
|
timeout=2,
|
||||||
|
)
|
||||||
|
response.raise_for_status()
|
||||||
|
api_data = json.loads(response.content)
|
||||||
|
except Exception as e:
|
||||||
|
logger.error(
|
||||||
|
f"Unable to load https://api.papermc.io/v2/projects/{project}/"
|
||||||
|
f"api due to error: {e}"
|
||||||
|
)
|
||||||
|
return {}
|
||||||
|
build = api_data.get("builds", [])[-1]
|
||||||
|
return build
|
||||||
|
|
||||||
def _read_cache(self):
|
def _read_cache(self):
|
||||||
cache_file = self.helper.serverjar_cache
|
cache_file = self.helper.serverjar_cache
|
||||||
cache = {}
|
cache = {}
|
||||||
@ -95,6 +135,8 @@ class ServerJars:
|
|||||||
for j in data["types"].get(s):
|
for j in data["types"].get(s):
|
||||||
versions = self._get_jar_details(j, s)
|
versions = self._get_jar_details(j, s)
|
||||||
data["types"][s].update({j: versions})
|
data["types"][s].update({j: versions})
|
||||||
|
for item in PAPERJARS:
|
||||||
|
data["types"]["servers"][item] = self.get_paper_versions(item)
|
||||||
# save our cache
|
# save our cache
|
||||||
try:
|
try:
|
||||||
with open(cache_file, "w", encoding="utf-8") as f:
|
with open(cache_file, "w", encoding="utf-8") as f:
|
||||||
@ -133,6 +175,8 @@ class ServerJars:
|
|||||||
for j in data["types"].get(s):
|
for j in data["types"].get(s):
|
||||||
versions = self._get_jar_details(j, s)
|
versions = self._get_jar_details(j, s)
|
||||||
data["types"][s].update({j: versions})
|
data["types"][s].update({j: versions})
|
||||||
|
for item in PAPERJARS:
|
||||||
|
data["types"]["servers"][item] = self.get_paper_versions(item)
|
||||||
# save our cache
|
# save our cache
|
||||||
try:
|
try:
|
||||||
with open(cache_file, "w", encoding="utf-8") as f:
|
with open(cache_file, "w", encoding="utf-8") as f:
|
||||||
@ -171,7 +215,17 @@ class ServerJars:
|
|||||||
def a_download_jar(self, jar, server, version, path, server_id):
|
def a_download_jar(self, jar, server, version, path, server_id):
|
||||||
# delaying download for server register to finish
|
# delaying download for server register to finish
|
||||||
time.sleep(3)
|
time.sleep(3)
|
||||||
|
if server not in PAPERJARS:
|
||||||
fetch_url = f"{self.base_url}/api/fetchJar/{jar}/{server}/{version}"
|
fetch_url = f"{self.base_url}/api/fetchJar/{jar}/{server}/{version}"
|
||||||
|
else:
|
||||||
|
build = self.get_paper_build(server, version).get("build", None)
|
||||||
|
if not build:
|
||||||
|
return
|
||||||
|
fetch_url = (
|
||||||
|
f"{self.paper_base}/v2/projects"
|
||||||
|
f"/{server}/versions/{version}/builds/{build}/downloads/"
|
||||||
|
f"{server}-{version}-{build}.jar"
|
||||||
|
)
|
||||||
server_users = PermissionsServers.get_server_user_list(server_id)
|
server_users = PermissionsServers.get_server_user_list(server_id)
|
||||||
|
|
||||||
# We need to make sure the server is registered before
|
# We need to make sure the server is registered before
|
||||||
|
@ -42,6 +42,7 @@ class Servers(BaseModel):
|
|||||||
created_by = IntegerField(default=-100)
|
created_by = IntegerField(default=-100)
|
||||||
shutdown_timeout = IntegerField(default=60)
|
shutdown_timeout = IntegerField(default=60)
|
||||||
ignored_exits = CharField(default="0")
|
ignored_exits = CharField(default="0")
|
||||||
|
count_players = BooleanField(default=True)
|
||||||
|
|
||||||
class Meta:
|
class Meta:
|
||||||
table_name = "servers"
|
table_name = "servers"
|
||||||
|
@ -536,10 +536,14 @@ class Controller:
|
|||||||
if data["create_type"] == "minecraft_java":
|
if data["create_type"] == "minecraft_java":
|
||||||
if root_create_data["create_type"] == "download_jar":
|
if root_create_data["create_type"] == "download_jar":
|
||||||
# modded update urls from server jars will only update the installer
|
# modded update urls from server jars will only update the installer
|
||||||
if create_data["category"] != "modded":
|
if (
|
||||||
|
create_data["category"] != "modded"
|
||||||
|
and create_data["type"] not in ServerJars.get_paper_jars()
|
||||||
|
):
|
||||||
server_obj = self.servers.get_server_obj(new_server_id)
|
server_obj = self.servers.get_server_obj(new_server_id)
|
||||||
url = (
|
url = (
|
||||||
f"https://serverjars.com/api/fetchJar/{create_data['category']}"
|
"https://serverjars.com/api/fetchJar/"
|
||||||
|
f"{create_data['category']}"
|
||||||
f"/{create_data['type']}/{create_data['version']}"
|
f"/{create_data['type']}/{create_data['version']}"
|
||||||
)
|
)
|
||||||
server_obj.executable_update_url = url
|
server_obj.executable_update_url = url
|
||||||
|
@ -44,6 +44,7 @@ with redirect_stderr(NullWriter()):
|
|||||||
from psutil import NoSuchProcess
|
from psutil import NoSuchProcess
|
||||||
|
|
||||||
logger = logging.getLogger(__name__)
|
logger = logging.getLogger(__name__)
|
||||||
|
SUCCESSMSG = "SUCCESS! Forge install completed"
|
||||||
|
|
||||||
|
|
||||||
def callback(called_func):
|
def callback(called_func):
|
||||||
@ -727,10 +728,11 @@ class ServerInstance:
|
|||||||
f' -jar "{file_name}" nogui'
|
f' -jar "{file_name}" nogui'
|
||||||
)
|
)
|
||||||
server_obj.execution_command = execution_command
|
server_obj.execution_command = execution_command
|
||||||
Console.debug("SUCCESS! Forge install completed")
|
Console.debug(SUCCESSMSG)
|
||||||
|
|
||||||
else:
|
elif version_major <= 1 and version_minor < 20:
|
||||||
# NEW VERSION >= 1.17
|
# NEW VERSION >= 1.17 and <= 1.20
|
||||||
|
# (no jar file in server dir, only run.bat and run.sh)
|
||||||
|
|
||||||
run_file_path = ""
|
run_file_path = ""
|
||||||
if self.helper.is_os_windows():
|
if self.helper.is_os_windows():
|
||||||
@ -774,7 +776,38 @@ class ServerInstance:
|
|||||||
f" {server_command[4]}"
|
f" {server_command[4]}"
|
||||||
)
|
)
|
||||||
server_obj.execution_command = execution_command
|
server_obj.execution_command = execution_command
|
||||||
Console.debug("SUCCESS! Forge install completed")
|
Console.debug(SUCCESSMSG)
|
||||||
|
else:
|
||||||
|
# NEW VERSION >= 1.20
|
||||||
|
# (executable jar is back in server dir)
|
||||||
|
|
||||||
|
# Retrieving the executable jar filename
|
||||||
|
file_path = glob.glob(
|
||||||
|
f"{server_obj.path}/forge-{version[0][0]}*.jar"
|
||||||
|
)[0]
|
||||||
|
file_name = re.findall(
|
||||||
|
r"(forge-[\-0-9.]+-shim.jar)",
|
||||||
|
file_path,
|
||||||
|
)[0]
|
||||||
|
|
||||||
|
# Let's set the proper server executable
|
||||||
|
server_obj.executable = os.path.join(file_name)
|
||||||
|
|
||||||
|
# Get memory values
|
||||||
|
memory_values = re.findall(
|
||||||
|
r"-Xms([A-Z0-9\.]+) -Xmx([A-Z0-9\.]+)",
|
||||||
|
server_obj.execution_command,
|
||||||
|
)
|
||||||
|
|
||||||
|
# Now lets set up the new run command.
|
||||||
|
# This is based off the run.sh/bat that
|
||||||
|
# Forge uses in 1.17 and <
|
||||||
|
execution_command = (
|
||||||
|
f"java -Xms{memory_values[0][0]} -Xmx{memory_values[0][1]}"
|
||||||
|
f' -jar "{file_name}" nogui'
|
||||||
|
)
|
||||||
|
server_obj.execution_command = execution_command
|
||||||
|
Console.debug(SUCCESSMSG)
|
||||||
except:
|
except:
|
||||||
logger.debug("Could not find run file.")
|
logger.debug("Could not find run file.")
|
||||||
# TODO Use regex to get version and rebuild simple execution
|
# TODO Use regex to get version and rebuild simple execution
|
||||||
@ -1564,6 +1597,7 @@ class ServerInstance:
|
|||||||
"version": raw_ping_result.get("version"),
|
"version": raw_ping_result.get("version"),
|
||||||
"icon": raw_ping_result.get("icon"),
|
"icon": raw_ping_result.get("icon"),
|
||||||
"crashed": self.is_crashed,
|
"crashed": self.is_crashed,
|
||||||
|
"count_players": self.server_object.count_players,
|
||||||
}
|
}
|
||||||
)
|
)
|
||||||
|
|
||||||
|
@ -29,6 +29,7 @@ server_patch_schema = {
|
|||||||
"logs_delete_after": {"type": "integer", "minimum": 0},
|
"logs_delete_after": {"type": "integer", "minimum": 0},
|
||||||
"ignored_exits": {"type": "string"},
|
"ignored_exits": {"type": "string"},
|
||||||
"show_status": {"type": "boolean"},
|
"show_status": {"type": "boolean"},
|
||||||
|
"count_players": {"type": "boolean"},
|
||||||
},
|
},
|
||||||
"additionalProperties": False,
|
"additionalProperties": False,
|
||||||
"minProperties": 1,
|
"minProperties": 1,
|
||||||
@ -46,6 +47,7 @@ basic_server_patch_schema = {
|
|||||||
"shutdown_timeout": {"type": "integer"},
|
"shutdown_timeout": {"type": "integer"},
|
||||||
"logs_delete_after": {"type": "integer", "minimum": 0},
|
"logs_delete_after": {"type": "integer", "minimum": 0},
|
||||||
"ignored_exits": {"type": "string"},
|
"ignored_exits": {"type": "string"},
|
||||||
|
"count_players": {"type": "boolean"},
|
||||||
},
|
},
|
||||||
"additionalProperties": False,
|
"additionalProperties": False,
|
||||||
"minProperties": 1,
|
"minProperties": 1,
|
||||||
|
@ -315,7 +315,7 @@
|
|||||||
<br />
|
<br />
|
||||||
<br />
|
<br />
|
||||||
</td>
|
</td>
|
||||||
<span class="server-player-totals" id="server_players_{{server['server_data']['server_id']}}" data-players="{{ server['stats']['online']}}" data-max="{{ server['stats']['max'] }}"></span>
|
<span class="server-player-totals" id="server_players_{{server['server_data']['server_id']}}" data-serverId="{{server['server_data']['server_id']}}" data-players="{{ server['stats']['online']}}" data-max="{{ server['stats']['max'] }}" data-count="{{server['server_data']['count_players']}}"></span>
|
||||||
</tr>
|
</tr>
|
||||||
{% end %}
|
{% end %}
|
||||||
</div>
|
</div>
|
||||||
@ -554,6 +554,9 @@
|
|||||||
display: none;
|
display: none;
|
||||||
/* for Chrome, Safari, and Opera */
|
/* for Chrome, Safari, and Opera */
|
||||||
}
|
}
|
||||||
|
.gray {
|
||||||
|
color: gray !important;
|
||||||
|
}
|
||||||
</style>
|
</style>
|
||||||
|
|
||||||
|
|
||||||
@ -724,14 +727,19 @@
|
|||||||
|
|
||||||
server_players.setAttribute('data-players', server.online);
|
server_players.setAttribute('data-players', server.online);
|
||||||
server_players.setAttribute('data-max', server.max);
|
server_players.setAttribute('data-max', server.max);
|
||||||
|
server_players.setAttribute('data-count', server.count_players)
|
||||||
let servers = Array.from(document.getElementsByClassName("server-player-totals"));
|
let servers = Array.from(document.getElementsByClassName("server-player-totals"));
|
||||||
let all_total_players = 0;
|
let all_total_players = 0;
|
||||||
let all_total_max_players = 0;
|
let all_total_max_players = 0;
|
||||||
|
|
||||||
servers.forEach(server => {
|
servers.forEach(server => {
|
||||||
try {
|
try {
|
||||||
|
console.log(`#server_desc_${server.getAttribute("data-serverId")}`)
|
||||||
|
$(`#server_desc_${server.getAttribute("data-serverId")}`).toggleClass("gray", server.getAttribute('data-count') === 'false')
|
||||||
|
if (server.getAttribute('data-count') === 'true'){
|
||||||
all_total_players += parseInt(server.getAttribute('data-players'));
|
all_total_players += parseInt(server.getAttribute('data-players'));
|
||||||
all_total_max_players += parseInt(server.getAttribute('data-max'));
|
all_total_max_players += parseInt(server.getAttribute('data-max'));
|
||||||
|
}
|
||||||
} catch {
|
} catch {
|
||||||
console.log("Player totals are not of type int");
|
console.log("Player totals are not of type int");
|
||||||
}
|
}
|
||||||
|
@ -11,13 +11,13 @@
|
|||||||
<tbody id="player-body">
|
<tbody id="player-body">
|
||||||
{% for player in data['cached_players'] %}
|
{% for player in data['cached_players'] %}
|
||||||
<tr id="playerItem-{{ player['name'] }}" class="playerItem--" style="text-align: center;">
|
<tr id="playerItem-{{ player['name'] }}" class="playerItem--" style="text-align: center;">
|
||||||
<td>
|
<td class="no-scroll" style="overflow: scroll;">
|
||||||
<strong> {{ player['name'] }}</strong>
|
<strong> {{ player['name'] }}</strong>
|
||||||
</td>
|
</td>
|
||||||
{% if player['status'] == 'Online' %}
|
{% if player['status'] == 'Online' %}
|
||||||
<td style="overflow: scroll;"><span class="text-success"><i class="fas fa-signal"></i> {{ player['status'] }}</span></td>
|
<td class="no-scroll" style="overflow: scroll;"><span class="text-success"><i class="fas fa-signal"></i> {{ player['status'] }}</span></td>
|
||||||
{% elif player['status'] == 'Offline' %}
|
{% elif player['status'] == 'Offline' %}
|
||||||
<td><span class="text-warning"><i class="fa-regular fa-circle-xmark"></i><span class="offline-status"> {{ player['status'] }}</span><span class="conn-break"> Last connection :<br> {{ player['last_seen'] }}</span></span></td>
|
<td class="no-scroll" style="overflow: scroll;"><span class="text-warning"><i class="fa-regular fa-circle-xmark"></i><span class="offline-status"> {{ player['status'] }}</span><span class="conn-break"> Last connection :<br> {{ player['last_seen'] }}</span></span></td>
|
||||||
{% end %}
|
{% end %}
|
||||||
<td class="buttons" style="text-align: center;">
|
<td class="buttons" style="text-align: center;">
|
||||||
{% if data['server_stats']['running'] %}
|
{% if data['server_stats']['running'] %}
|
||||||
|
@ -188,6 +188,17 @@
|
|||||||
{% end %}
|
{% end %}
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
<div class="form-group">
|
||||||
|
<div class="custom-control custom-switch">
|
||||||
|
{% if data['server_stats']['server_id']['count_players'] %}
|
||||||
|
<input type="checkbox" class="custom-control-input" id="count_players" name="count_players" checked="" value="1">
|
||||||
|
<label class="custom-control-label" for="count_players"> {{ translate('serverConfig', 'countPlayers', data['lang']) }}</label>
|
||||||
|
{% else %}
|
||||||
|
<input type="checkbox" class="custom-control-input" id="count_players" name="count_players" value="1">
|
||||||
|
<label class="custom-control-label" for="count_players"> {{ translate('serverConfig', 'countPlayers', data['lang']) }}</label>
|
||||||
|
{% end %}
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
<div class="form-group">
|
<div class="form-group">
|
||||||
<div class="custom-control custom-switch">
|
<div class="custom-control custom-switch">
|
||||||
{% if data['super_user'] %}
|
{% if data['super_user'] %}
|
||||||
@ -195,7 +206,7 @@
|
|||||||
<input type="checkbox" class="custom-control-input" id="show_status" name="show_status" checked="" value="1">
|
<input type="checkbox" class="custom-control-input" id="show_status" name="show_status" checked="" value="1">
|
||||||
<label class="custom-control-label" for="show_status"> {{ translate('serverConfig', 'showStatus', data['lang']) }}</label>
|
<label class="custom-control-label" for="show_status"> {{ translate('serverConfig', 'showStatus', data['lang']) }}</label>
|
||||||
{% else %}
|
{% else %}
|
||||||
<input type="checkbox" class="custom-control-input" id="show_status" name="show_status" value="1">
|
<input type="checkbox" class="custom-control-input" id="show_status" name="show_status" value="1">
|
||||||
<label class="custom-control-label" for="show_status"> {{ translate('serverConfig', 'showStatus', data['lang']) }}</label>
|
<label class="custom-control-label" for="show_status"> {{ translate('serverConfig', 'showStatus', data['lang']) }}</label>
|
||||||
{% end %}
|
{% end %}
|
||||||
{% end %}
|
{% end %}
|
||||||
@ -559,6 +570,7 @@
|
|||||||
formDataObject.show_status = $("#show_status").prop('checked');
|
formDataObject.show_status = $("#show_status").prop('checked');
|
||||||
formDataObject.crash_detection = $("#crash_detection").prop('checked');
|
formDataObject.crash_detection = $("#crash_detection").prop('checked');
|
||||||
formDataObject.auto_start = $("#auto_start").prop('checked');
|
formDataObject.auto_start = $("#auto_start").prop('checked');
|
||||||
|
formDataObject.count_players = $("#count_players").prop('checked');
|
||||||
console.log(formDataObject);
|
console.log(formDataObject);
|
||||||
// Format the plain form data as JSON
|
// Format the plain form data as JSON
|
||||||
let formDataJsonString = JSON.stringify(formDataObject, replacer);
|
let formDataJsonString = JSON.stringify(formDataObject, replacer);
|
||||||
|
16
app/migrations/20231229_player_count.py
Normal file
16
app/migrations/20231229_player_count.py
Normal file
@ -0,0 +1,16 @@
|
|||||||
|
# Generated by database migrator
|
||||||
|
import peewee
|
||||||
|
|
||||||
|
|
||||||
|
def migrate(migrator, database, **kwargs):
|
||||||
|
migrator.add_columns("servers", count_players=peewee.BooleanField(default=True))
|
||||||
|
"""
|
||||||
|
Write your migrations here.
|
||||||
|
"""
|
||||||
|
|
||||||
|
|
||||||
|
def rollback(migrator, database, **kwargs):
|
||||||
|
migrator.drop_columns("servers", ["count_players"])
|
||||||
|
"""
|
||||||
|
Write your rollback migrations here.
|
||||||
|
"""
|
@ -377,7 +377,8 @@
|
|||||||
"timeoutExplain2": "command before it forces the process down.",
|
"timeoutExplain2": "command before it forces the process down.",
|
||||||
"update": "Update Executable",
|
"update": "Update Executable",
|
||||||
"yesDelete": "Yes, delete",
|
"yesDelete": "Yes, delete",
|
||||||
"yesDeleteFiles": "Yes, delete files"
|
"yesDeleteFiles": "Yes, delete files",
|
||||||
|
"countPlayers": "Include server in total player count"
|
||||||
},
|
},
|
||||||
"serverConfigHelp": {
|
"serverConfigHelp": {
|
||||||
"desc": "Here is where you can change the configuration of your server",
|
"desc": "Here is where you can change the configuration of your server",
|
||||||
|
Loading…
Reference in New Issue
Block a user