mirror of
https://gitlab.com/crafty-controller/crafty-4.git
synced 2024-08-30 18:23:09 +00:00
Merge branch 'dev' into merge/api-v2
This commit is contained in:
commit
559a345f25
@ -6,7 +6,7 @@ docker-compose.yml
|
|||||||
|
|
||||||
# git & gitlab related
|
# git & gitlab related
|
||||||
.git/
|
.git/
|
||||||
.github/
|
.gitlab/
|
||||||
.gitignore
|
.gitignore
|
||||||
.gitlab-ci.yml
|
.gitlab-ci.yml
|
||||||
|
|
||||||
|
89
.github/workflows/docker-build.yml
vendored
89
.github/workflows/docker-build.yml
vendored
@ -1,89 +0,0 @@
|
|||||||
# yamllint disable rule:line-length
|
|
||||||
---
|
|
||||||
name: Build Docker Images
|
|
||||||
|
|
||||||
on: # yamllint disable-line rule:truthy
|
|
||||||
push:
|
|
||||||
branches:
|
|
||||||
- master
|
|
||||||
- dev
|
|
||||||
workflow_dispatch:
|
|
||||||
|
|
||||||
jobs:
|
|
||||||
build:
|
|
||||||
name: Build Docker Images
|
|
||||||
runs-on: ubuntu-latest
|
|
||||||
outputs:
|
|
||||||
date: ${{ steps.date.outputs.date }}
|
|
||||||
tag: ${{ steps.branch.outputs.tag }}
|
|
||||||
version: ${{ steps.version.outputs.version }}
|
|
||||||
|
|
||||||
steps:
|
|
||||||
- name: Check out repository
|
|
||||||
uses: actions/checkout@v2
|
|
||||||
|
|
||||||
- name: Set up QEMU
|
|
||||||
id: qemu
|
|
||||||
uses: docker/setup-qemu-action@v1
|
|
||||||
with:
|
|
||||||
image: tonistiigi/binfmt:latest
|
|
||||||
platforms: all
|
|
||||||
|
|
||||||
- name: Set up Docker Buildx
|
|
||||||
id: buildx
|
|
||||||
uses: docker/setup-buildx-action@v1
|
|
||||||
|
|
||||||
- name: Log in to GitHub Container Registry
|
|
||||||
if: github.event_name != 'pull_request'
|
|
||||||
uses: docker/login-action@v1
|
|
||||||
with:
|
|
||||||
registry: ghcr.io
|
|
||||||
username: ${{ github.actor }}
|
|
||||||
password: ${{ secrets.GHCR_PAT }}
|
|
||||||
|
|
||||||
# - name: Login to Docker Hub
|
|
||||||
# if: github.event_name != 'pull_request'
|
|
||||||
# uses: docker/login-action@v1
|
|
||||||
# with:
|
|
||||||
# username: ${{ secrets.DOCKER_USERNAME }}
|
|
||||||
# password: ${{ secrets.DOCKER_PASSWORD }}
|
|
||||||
|
|
||||||
- name: Get current date
|
|
||||||
id: date
|
|
||||||
run: echo "::set-output name=date::$(date +"%Y-%m-%dT%H:%M:%SZ")"
|
|
||||||
|
|
||||||
- name: Get Crafty version
|
|
||||||
id: version
|
|
||||||
run: |
|
|
||||||
MAJOR=$(cat app/config/version.json | jq '.major' )
|
|
||||||
MINOR=$(cat app/config/version.json | jq '.minor' )
|
|
||||||
SUB=$(cat app/config/version.json | jq '.sub' )
|
|
||||||
META=$(cat app/config/version.json | jq -r '.meta' )
|
|
||||||
echo "::set-output name=version::$MAJOR.$MINOR.$SUB-$META"
|
|
||||||
|
|
||||||
- name: Get branch tag
|
|
||||||
id: branch
|
|
||||||
run: |
|
|
||||||
if [[ "${{ github.ref }}" == "refs/heads/master" ]]; then
|
|
||||||
echo "::set-output name=tag::latest"
|
|
||||||
else
|
|
||||||
echo "::set-output name=tag::$(echo "${{ github.ref }}" | sed -e 's/refs\/heads\///g')"
|
|
||||||
fi
|
|
||||||
|
|
||||||
- name: Build and push Docker image
|
|
||||||
uses: docker/build-push-action@v2
|
|
||||||
with:
|
|
||||||
context: .
|
|
||||||
file: ./Dockerfile
|
|
||||||
platforms: linux/arm64,linux/amd64
|
|
||||||
push: ${{ github.event_name != 'pull_request' }}
|
|
||||||
cache-from: type=registry,ref=${{ github.repository }}:${{ steps.branch.outputs.tag }}
|
|
||||||
cache-to: type=inline
|
|
||||||
build-args: |
|
|
||||||
BUILD_DATE=${{ steps.date.outputs.date }}
|
|
||||||
BUILD_REF=${{ github.sha }}
|
|
||||||
CRAFTY_VER=${{ steps.version.outputs.version }}
|
|
||||||
tags: |
|
|
||||||
ghcr.io/${{ github.repository }}:${{ steps.branch.outputs.tag }}
|
|
||||||
|
|
||||||
# {{ GITHUB_REPOSITORY }}:${{ steps.branch.outputs.tag }}
|
|
37
.github/workflows/lint.yml
vendored
37
.github/workflows/lint.yml
vendored
@ -1,37 +0,0 @@
|
|||||||
# yamllint disable rule:line-length
|
|
||||||
---
|
|
||||||
name: Lint
|
|
||||||
|
|
||||||
on: [push, pull_request] # yamllint disable-line rule:truthy
|
|
||||||
|
|
||||||
jobs:
|
|
||||||
lint:
|
|
||||||
name: Lint
|
|
||||||
runs-on: ubuntu-latest
|
|
||||||
|
|
||||||
steps:
|
|
||||||
- name: Checkout
|
|
||||||
uses: actions/checkout@v3
|
|
||||||
|
|
||||||
- name: Set up Python
|
|
||||||
uses: actions/setup-python@v3
|
|
||||||
with:
|
|
||||||
python-version: "3.9"
|
|
||||||
cache: "pip"
|
|
||||||
|
|
||||||
- name: Install dependencies
|
|
||||||
run: |
|
|
||||||
python -m pip install --upgrade pip
|
|
||||||
pip install pylint black yamllint
|
|
||||||
if [ -f requirements.txt ]; then pip install -r requirements.txt; fi
|
|
||||||
|
|
||||||
- name: Run pylint
|
|
||||||
run: |
|
|
||||||
pylint --output-format=text $(find -type f -name "*.py" ! -path "**/.venv/**" ! -path "**/app/migrations/**") | tee /tmp/pylint.txt
|
|
||||||
echo "pylint score: $(cat /tmp/pylint.txt | grep -oP 'Your code has been rated at \K[0-9]*\.?[0-9]*')"
|
|
||||||
|
|
||||||
- name: Run black
|
|
||||||
run: black --check --diff .
|
|
||||||
|
|
||||||
- name: Lint YAML files
|
|
||||||
run: yamllint .
|
|
@ -68,6 +68,6 @@ LABEL \
|
|||||||
org.opencontainers.image.description="A Game Server Control Panel / Launcher" \
|
org.opencontainers.image.description="A Game Server Control Panel / Launcher" \
|
||||||
org.opencontainers.image.url="https://craftycontrol.com/" \
|
org.opencontainers.image.url="https://craftycontrol.com/" \
|
||||||
org.opencontainers.image.documentation="https://wiki.craftycontrol.com/" \
|
org.opencontainers.image.documentation="https://wiki.craftycontrol.com/" \
|
||||||
org.opencontainers.image.source="https://github.com/arcadia-technology/crafty-4" \
|
org.opencontainers.image.source="https://gitlab.com/crafty-controller/crafty-4" \
|
||||||
org.opencontainers.image.vendor="Arcadia Technology, LLC." \
|
org.opencontainers.image.vendor="Arcadia Technology, LLC." \
|
||||||
org.opencontainers.image.licenses=""
|
org.opencontainers.image.licenses="GPL-3.0"
|
||||||
|
18
README.md
18
README.md
@ -2,9 +2,9 @@
|
|||||||
|
|
||||||
[](https://github.com/psf/black)
|
[](https://github.com/psf/black)
|
||||||
[](https://www.python.org)
|
[](https://www.python.org)
|
||||||
[](https://github.com/arcadia-technology/crafty-4)
|
[](https://gitlab.com/crafty-controller/crafty-4)
|
||||||
[](https://github.com/arcadia-technology/crafty-4)
|
[](https://gitlab.com/crafty-controller/crafty-4)
|
||||||
[](https://github.com/arcadia-technology/crafty-4/actions/workflows/docker-build.yml)
|
[](https://gitlab.com/crafty-controller/crafty-4/-/commits/master)
|
||||||
|
|
||||||
# Crafty Controller 4.0.0-beta
|
# Crafty Controller 4.0.0-beta
|
||||||
> Python based Control Panel for your Minecraft Server
|
> Python based Control Panel for your Minecraft Server
|
||||||
@ -23,7 +23,7 @@ Project Homepage - https://craftycontrol.com
|
|||||||
|
|
||||||
Discord Server - https://discord.gg/9VJPhCE
|
Discord Server - https://discord.gg/9VJPhCE
|
||||||
|
|
||||||
Git Repository - https://github.com/arcadia-technology/crafty-4
|
Git Repository - https://gitlab.com/crafty-controller/crafty-4
|
||||||
|
|
||||||
<br>
|
<br>
|
||||||
|
|
||||||
@ -55,11 +55,11 @@ As the Dockerfile uses the permission structure of `crafty:root` **internally**
|
|||||||
### - Using the registry image 🌎
|
### - Using the registry image 🌎
|
||||||
The provided image supports both `arm64` and `amd64` out the box, if you have issues though you can build it yourself with the `compose` file in `docker/`.
|
The provided image supports both `arm64` and `amd64` out the box, if you have issues though you can build it yourself with the `compose` file in `docker/`.
|
||||||
|
|
||||||
The image is located at: `ghcr.io/arcadia-technology/crafty-4:latest`
|
The image is located at: `registry.gitlab.com/crafty-controller/crafty-4:latest`
|
||||||
| Branch | Status |
|
| Branch | Status |
|
||||||
| ----------------- | ------------------------------------------------------------------ |
|
| ----------------- | ------------------------------------------------------------------ |
|
||||||
| :latest | [](https://github.com/arcadia-technology/crafty-4/actions/workflows/docker-build.yml) |
|
| :latest | [](https://gitlab.com/crafty-controller/crafty-4/-/commits/master) |
|
||||||
| :dev | [](https://github.com/arcadia-technology/crafty-4/actions/workflows/docker-build.yml) |
|
| :dev | [](https://gitlab.com/crafty-controller/crafty-4/-/commits/dev)
|
||||||
|
|
||||||
<br>
|
<br>
|
||||||
|
|
||||||
@ -76,7 +76,7 @@ version: '3'
|
|||||||
services:
|
services:
|
||||||
crafty:
|
crafty:
|
||||||
container_name: crafty_container
|
container_name: crafty_container
|
||||||
image: ghcr.io/arcadia-technology/crafty-4:latest
|
image: registry.gitlab.com/crafty-controller/crafty-4:latest
|
||||||
restart: always
|
restart: always
|
||||||
environment:
|
environment:
|
||||||
- TZ=Etc/UTC
|
- TZ=Etc/UTC
|
||||||
@ -115,7 +115,7 @@ $ docker run \
|
|||||||
-v "/$(pwd)/docker/servers:/crafty/servers" \
|
-v "/$(pwd)/docker/servers:/crafty/servers" \
|
||||||
-v "/$(pwd)/docker/config:/crafty/app/config" \
|
-v "/$(pwd)/docker/config:/crafty/app/config" \
|
||||||
-v "/$(pwd)/docker/import:/crafty/import" \
|
-v "/$(pwd)/docker/import:/crafty/import" \
|
||||||
ghcr.io/arcadia-technology/crafty-4:latest
|
registry.gitlab.com/crafty-controller/crafty-4:latest
|
||||||
```
|
```
|
||||||
|
|
||||||
### **Building from the cloned repository:**
|
### **Building from the cloned repository:**
|
||||||
|
@ -7,6 +7,7 @@ from app.classes.models.server_permissions import (
|
|||||||
from app.classes.models.users import HelperUsers, ApiKeys
|
from app.classes.models.users import HelperUsers, ApiKeys
|
||||||
from app.classes.models.roles import HelperRoles
|
from app.classes.models.roles import HelperRoles
|
||||||
from app.classes.models.servers import HelperServers
|
from app.classes.models.servers import HelperServers
|
||||||
|
from app.classes.models.server_stats import HelperServerStats
|
||||||
from app.classes.shared.main_models import DatabaseShortcuts
|
from app.classes.shared.main_models import DatabaseShortcuts
|
||||||
|
|
||||||
logger = logging.getLogger(__name__)
|
logger = logging.getLogger(__name__)
|
||||||
@ -111,7 +112,7 @@ class ServerPermsController:
|
|||||||
)
|
)
|
||||||
|
|
||||||
for server in authorized_servers:
|
for server in authorized_servers:
|
||||||
latest = HelperServers.get_latest_server_stats(server.get("server_id"))
|
latest = HelperServerStats.get_latest_server_stats(server.get("server_id"))
|
||||||
server_data.append(
|
server_data.append(
|
||||||
{
|
{
|
||||||
"server_data": server,
|
"server_data": server,
|
||||||
|
@ -5,6 +5,7 @@ import typing as t
|
|||||||
|
|
||||||
from app.classes.controllers.roles_controller import RolesController
|
from app.classes.controllers.roles_controller import RolesController
|
||||||
from app.classes.models.servers import HelperServers
|
from app.classes.models.servers import HelperServers
|
||||||
|
from app.classes.models.server_stats import HelperServerStats
|
||||||
from app.classes.models.users import HelperUsers, ApiKeys
|
from app.classes.models.users import HelperUsers, ApiKeys
|
||||||
from app.classes.models.server_permissions import (
|
from app.classes.models.server_permissions import (
|
||||||
PermissionsServers,
|
PermissionsServers,
|
||||||
@ -82,15 +83,15 @@ class ServersController:
|
|||||||
|
|
||||||
@staticmethod
|
@staticmethod
|
||||||
def set_download(server_id):
|
def set_download(server_id):
|
||||||
return HelperServers.set_download(server_id)
|
return HelperServerStats.set_download(server_id)
|
||||||
|
|
||||||
@staticmethod
|
@staticmethod
|
||||||
def finish_download(server_id):
|
def finish_download(server_id):
|
||||||
return HelperServers.finish_download(server_id)
|
return HelperServerStats.finish_download(server_id)
|
||||||
|
|
||||||
@staticmethod
|
@staticmethod
|
||||||
def get_download_status(server_id):
|
def get_download_status(server_id):
|
||||||
return HelperServers.get_download_status(server_id)
|
return HelperServerStats.get_download_status(server_id)
|
||||||
|
|
||||||
def remove_server(self, server_id):
|
def remove_server(self, server_id):
|
||||||
roles_list = PermissionsServers.get_roles_from_server(server_id)
|
roles_list = PermissionsServers.get_roles_from_server(server_id)
|
||||||
@ -142,7 +143,7 @@ class ServersController:
|
|||||||
|
|
||||||
@staticmethod
|
@staticmethod
|
||||||
def get_all_servers_stats():
|
def get_all_servers_stats():
|
||||||
return HelperServers.get_all_servers_stats()
|
return HelperServerStats.get_all_servers_stats()
|
||||||
|
|
||||||
@staticmethod
|
@staticmethod
|
||||||
def get_authorized_servers_stats_api_key(api_key: ApiKeys):
|
def get_authorized_servers_stats_api_key(api_key: ApiKeys):
|
||||||
@ -152,7 +153,7 @@ class ServersController:
|
|||||||
)
|
)
|
||||||
|
|
||||||
for server in authorized_servers:
|
for server in authorized_servers:
|
||||||
latest = HelperServers.get_latest_server_stats(server.get("server_id"))
|
latest = HelperServerStats.get_latest_server_stats(server.get("server_id"))
|
||||||
key_permissions = PermissionsServers.get_api_key_permissions_list(
|
key_permissions = PermissionsServers.get_api_key_permissions_list(
|
||||||
api_key, server.get("server_id")
|
api_key, server.get("server_id")
|
||||||
)
|
)
|
||||||
@ -175,7 +176,7 @@ class ServersController:
|
|||||||
authorized_servers = ServersController.get_authorized_servers(user_id)
|
authorized_servers = ServersController.get_authorized_servers(user_id)
|
||||||
|
|
||||||
for server in authorized_servers:
|
for server in authorized_servers:
|
||||||
latest = HelperServers.get_latest_server_stats(server.get("server_id"))
|
latest = HelperServerStats.get_latest_server_stats(server.get("server_id"))
|
||||||
# TODO
|
# TODO
|
||||||
user_permissions = PermissionsServers.get_user_id_permissions_list(
|
user_permissions = PermissionsServers.get_user_id_permissions_list(
|
||||||
user_id, server.get("server_id")
|
user_id, server.get("server_id")
|
||||||
@ -203,11 +204,11 @@ class ServersController:
|
|||||||
# **********************************************************************************
|
# **********************************************************************************
|
||||||
@staticmethod
|
@staticmethod
|
||||||
def get_server_stats_by_id(server_id):
|
def get_server_stats_by_id(server_id):
|
||||||
return HelperServers.get_server_stats_by_id(server_id)
|
return HelperServerStats.get_server_stats_by_id(server_id)
|
||||||
|
|
||||||
@staticmethod
|
@staticmethod
|
||||||
def server_id_exists(server_id):
|
def server_id_exists(server_id):
|
||||||
return HelperServers.server_id_exists(server_id)
|
return HelperServerStats.server_id_exists(server_id)
|
||||||
|
|
||||||
@staticmethod
|
@staticmethod
|
||||||
def get_server_type_by_id(server_id):
|
def get_server_type_by_id(server_id):
|
||||||
@ -226,7 +227,7 @@ class ServersController:
|
|||||||
|
|
||||||
@staticmethod
|
@staticmethod
|
||||||
def is_crashed(server_id):
|
def is_crashed(server_id):
|
||||||
return HelperServers.is_crashed(server_id)
|
return HelperServerStats.is_crashed(server_id)
|
||||||
|
|
||||||
@staticmethod
|
@staticmethod
|
||||||
def server_id_authorized_api_key(server_id: str, api_key: ApiKeys) -> bool:
|
def server_id_authorized_api_key(server_id: str, api_key: ApiKeys) -> bool:
|
||||||
@ -235,34 +236,36 @@ class ServersController:
|
|||||||
# There is no view server permission
|
# There is no view server permission
|
||||||
# permission_helper.both_have_perm(api_key)
|
# permission_helper.both_have_perm(api_key)
|
||||||
|
|
||||||
def set_update(self, server_id, value):
|
@staticmethod
|
||||||
return self.servers_helper.set_update(server_id, value)
|
def set_update(server_id, value):
|
||||||
|
return HelperServerStats.set_update(server_id, value)
|
||||||
|
|
||||||
@staticmethod
|
@staticmethod
|
||||||
def get_ttl_without_player(server_id):
|
def get_ttl_without_player(server_id):
|
||||||
return HelperServers.get_ttl_without_player(server_id)
|
return HelperServerStats.get_ttl_without_player(server_id)
|
||||||
|
|
||||||
@staticmethod
|
@staticmethod
|
||||||
def can_stop_no_players(server_id, time_limit):
|
def can_stop_no_players(server_id, time_limit):
|
||||||
return HelperServers.can_stop_no_players(server_id, time_limit)
|
return HelperServerStats.can_stop_no_players(server_id, time_limit)
|
||||||
|
|
||||||
def set_waiting_start(self, server_id, value):
|
@staticmethod
|
||||||
self.servers_helper.set_waiting_start(server_id, value)
|
def set_waiting_start(server_id, value):
|
||||||
|
HelperServerStats.set_waiting_start(server_id, value)
|
||||||
|
|
||||||
@staticmethod
|
@staticmethod
|
||||||
def get_waiting_start(server_id):
|
def get_waiting_start(server_id):
|
||||||
return HelperServers.get_waiting_start(server_id)
|
return HelperServerStats.get_waiting_start(server_id)
|
||||||
|
|
||||||
@staticmethod
|
@staticmethod
|
||||||
def get_update_status(server_id):
|
def get_update_status(server_id):
|
||||||
return HelperServers.get_update_status(server_id)
|
return HelperServerStats.get_update_status(server_id)
|
||||||
|
|
||||||
# **********************************************************************************
|
# **********************************************************************************
|
||||||
# Servers Helpers Methods
|
# Servers Helpers Methods
|
||||||
# **********************************************************************************
|
# **********************************************************************************
|
||||||
@staticmethod
|
@staticmethod
|
||||||
def get_banned_players(server_id):
|
def get_banned_players(server_id):
|
||||||
stats = HelperServers.get_server_stats_by_id(server_id)
|
stats = HelperServerStats.get_server_stats_by_id(server_id)
|
||||||
server_path = stats["server_id"]["path"]
|
server_path = stats["server_id"]["path"]
|
||||||
path = os.path.join(server_path, "banned-players.json")
|
path = os.path.join(server_path, "banned-players.json")
|
||||||
|
|
||||||
|
@ -210,36 +210,9 @@ class Stats:
|
|||||||
}
|
}
|
||||||
).execute()
|
).execute()
|
||||||
|
|
||||||
# server_stats = stats_to_send.get("servers")
|
|
||||||
# for server in server_stats:
|
|
||||||
# Server_Stats.insert(
|
|
||||||
# {
|
|
||||||
# Server_Stats.server_id: server.get("id", 0),
|
|
||||||
# Server_Stats.started: server.get("started", ""),
|
|
||||||
# Server_Stats.running: server.get("running", False),
|
|
||||||
# Server_Stats.cpu: server.get("cpu", 0),
|
|
||||||
# Server_Stats.mem: server.get("mem", 0),
|
|
||||||
# Server_Stats.mem_percent: server.get("mem_percent", 0),
|
|
||||||
# Server_Stats.world_name: server.get("world_name", ""),
|
|
||||||
# Server_Stats.world_size: server.get("world_size", ""),
|
|
||||||
# Server_Stats.server_port: server.get("server_port", ""),
|
|
||||||
# Server_Stats.int_ping_results: server.get(
|
|
||||||
# "int_ping_results", False
|
|
||||||
# ),
|
|
||||||
# Server_Stats.online: server.get("online", False),
|
|
||||||
# Server_Stats.max: server.get("max", False),
|
|
||||||
# Server_Stats.players: server.get("players", False),
|
|
||||||
# Server_Stats.desc: server.get("desc", False),
|
|
||||||
# Server_Stats.version: server.get("version", False),
|
|
||||||
# }
|
|
||||||
# ).execute()
|
|
||||||
|
|
||||||
# delete old data
|
# delete old data
|
||||||
max_age = self.helper.get_setting("history_max_age")
|
max_age = self.helper.get_setting("history_max_age")
|
||||||
now = datetime.datetime.now()
|
now = datetime.datetime.now()
|
||||||
last_week = now.day - max_age
|
last_week = now.day - max_age
|
||||||
|
|
||||||
HostStats.delete().where(HostStats.time < last_week).execute()
|
HostStats.delete().where(HostStats.time < last_week).execute()
|
||||||
|
|
||||||
|
|
||||||
# Server_Stats.delete().where(Server_Stats.created < last_week).execute()
|
|
||||||
|
355
app/classes/models/server_stats.py
Normal file
355
app/classes/models/server_stats.py
Normal file
@ -0,0 +1,355 @@
|
|||||||
|
import os
|
||||||
|
import logging
|
||||||
|
import datetime
|
||||||
|
|
||||||
|
from app.classes.models.servers import Servers, HelperServers
|
||||||
|
from app.classes.shared.helpers import Helpers
|
||||||
|
from app.classes.shared.main_models import DatabaseShortcuts
|
||||||
|
from app.classes.shared.migration import MigrationManager
|
||||||
|
|
||||||
|
try:
|
||||||
|
from peewee import (
|
||||||
|
SqliteDatabase,
|
||||||
|
Model,
|
||||||
|
DatabaseProxy,
|
||||||
|
ForeignKeyField,
|
||||||
|
CharField,
|
||||||
|
AutoField,
|
||||||
|
DateTimeField,
|
||||||
|
BooleanField,
|
||||||
|
IntegerField,
|
||||||
|
FloatField,
|
||||||
|
)
|
||||||
|
|
||||||
|
except ModuleNotFoundError as e:
|
||||||
|
Helpers.auto_installer_fix(e)
|
||||||
|
|
||||||
|
logger = logging.getLogger(__name__)
|
||||||
|
peewee_logger = logging.getLogger("peewee")
|
||||||
|
peewee_logger.setLevel(logging.INFO)
|
||||||
|
database_stats_proxy = DatabaseProxy()
|
||||||
|
|
||||||
|
|
||||||
|
# **********************************************************************************
|
||||||
|
# Servers Stats Class
|
||||||
|
# **********************************************************************************
|
||||||
|
class ServerStats(Model):
|
||||||
|
stats_id = AutoField()
|
||||||
|
created = DateTimeField(default=datetime.datetime.now)
|
||||||
|
server_id = ForeignKeyField(Servers, backref="server", index=True)
|
||||||
|
started = CharField(default="")
|
||||||
|
running = BooleanField(default=False)
|
||||||
|
cpu = FloatField(default=0)
|
||||||
|
mem = FloatField(default=0)
|
||||||
|
mem_percent = FloatField(default=0)
|
||||||
|
world_name = CharField(default="")
|
||||||
|
world_size = CharField(default="")
|
||||||
|
server_port = IntegerField(default=25565)
|
||||||
|
int_ping_results = CharField(default="")
|
||||||
|
online = IntegerField(default=0)
|
||||||
|
max = IntegerField(default=0)
|
||||||
|
players = CharField(default="")
|
||||||
|
desc = CharField(default="Unable to Connect")
|
||||||
|
version = CharField(default="")
|
||||||
|
updating = BooleanField(default=False)
|
||||||
|
waiting_start = BooleanField(default=False)
|
||||||
|
first_run = BooleanField(default=True)
|
||||||
|
crashed = BooleanField(default=False)
|
||||||
|
downloading = BooleanField(default=False)
|
||||||
|
|
||||||
|
class Meta:
|
||||||
|
table_name = "server_stats"
|
||||||
|
database = database_stats_proxy
|
||||||
|
|
||||||
|
|
||||||
|
# **********************************************************************************
|
||||||
|
# Servers_Stats Methods
|
||||||
|
# **********************************************************************************
|
||||||
|
class HelperServerStats:
|
||||||
|
def __init__(self, database):
|
||||||
|
self.database = database
|
||||||
|
|
||||||
|
@staticmethod
|
||||||
|
def init_database(server_id):
|
||||||
|
try:
|
||||||
|
server = HelperServers.get_server_data_by_id(server_id)
|
||||||
|
db_folder = os.path.join(f"{server['path']}", "db_stats")
|
||||||
|
db_file = os.path.join(
|
||||||
|
db_folder,
|
||||||
|
f"{server['server_name']}" + ".sqlite",
|
||||||
|
)
|
||||||
|
database = SqliteDatabase(
|
||||||
|
db_file, pragmas={"journal_mode": "wal", "cache_size": -1024 * 10}
|
||||||
|
)
|
||||||
|
if not os.path.exists(db_file):
|
||||||
|
try:
|
||||||
|
os.mkdir(db_folder)
|
||||||
|
except Exception as ex:
|
||||||
|
logger.warning(
|
||||||
|
f"Error try to create the db_stats folder for server : {ex}"
|
||||||
|
)
|
||||||
|
helper_stats = Helpers()
|
||||||
|
helper_stats.migration_dir = os.path.join(
|
||||||
|
f"{helper_stats.migration_dir}", "stats"
|
||||||
|
)
|
||||||
|
helper_stats.db_path = db_file
|
||||||
|
database_stats_proxy.initialize(database)
|
||||||
|
migration_manager = MigrationManager(database, helper_stats)
|
||||||
|
migration_manager.up() # Automatically runs migrations
|
||||||
|
database_stats_proxy.initialize(database)
|
||||||
|
except Exception as ex:
|
||||||
|
logger.warning(
|
||||||
|
f"Error try to look for the db_stats files for server : {ex}"
|
||||||
|
)
|
||||||
|
|
||||||
|
@staticmethod
|
||||||
|
def select_database(server_id):
|
||||||
|
try:
|
||||||
|
server = HelperServers.get_server_data_by_id(server_id)
|
||||||
|
db_file = os.path.join(
|
||||||
|
f"{server['path']}",
|
||||||
|
"db_stats",
|
||||||
|
f"{server['server_name']}" + ".sqlite",
|
||||||
|
)
|
||||||
|
database = SqliteDatabase(
|
||||||
|
db_file, pragmas={"journal_mode": "wal", "cache_size": -1024 * 10}
|
||||||
|
)
|
||||||
|
database_stats_proxy.initialize(database)
|
||||||
|
except Exception as ex:
|
||||||
|
logger.warning(
|
||||||
|
f"Error try to look for the db_stats files for server : {ex}"
|
||||||
|
)
|
||||||
|
|
||||||
|
@staticmethod
|
||||||
|
def get_all_servers_stats():
|
||||||
|
servers = HelperServers.get_all_defined_servers()
|
||||||
|
server_data = []
|
||||||
|
try:
|
||||||
|
for s in servers:
|
||||||
|
HelperServerStats.select_database(s.get("server_id"))
|
||||||
|
latest = (
|
||||||
|
ServerStats.select()
|
||||||
|
.where(ServerStats.server_id == s.get("server_id"))
|
||||||
|
.order_by(ServerStats.created.desc())
|
||||||
|
.limit(1)
|
||||||
|
)
|
||||||
|
server_data.append(
|
||||||
|
{
|
||||||
|
"server_data": s,
|
||||||
|
"stats": DatabaseShortcuts.return_rows(latest)[0],
|
||||||
|
"user_command_permission": True,
|
||||||
|
}
|
||||||
|
)
|
||||||
|
except IndexError as ex:
|
||||||
|
logger.error(
|
||||||
|
f"Stats collection failed with error: {ex}. Was a server just created?"
|
||||||
|
)
|
||||||
|
return server_data
|
||||||
|
|
||||||
|
@staticmethod
|
||||||
|
def insert_server_stats(server):
|
||||||
|
server_id = server.get("id", 0)
|
||||||
|
HelperServerStats.select_database(server_id)
|
||||||
|
|
||||||
|
if server_id == 0:
|
||||||
|
logger.warning("Stats saving failed with error: Server unknown (id = 0)")
|
||||||
|
return
|
||||||
|
|
||||||
|
ServerStats.insert(
|
||||||
|
{
|
||||||
|
ServerStats.server_id: server.get("id", 0),
|
||||||
|
ServerStats.started: server.get("started", ""),
|
||||||
|
ServerStats.running: server.get("running", False),
|
||||||
|
ServerStats.cpu: server.get("cpu", 0),
|
||||||
|
ServerStats.mem: server.get("mem", 0),
|
||||||
|
ServerStats.mem_percent: server.get("mem_percent", 0),
|
||||||
|
ServerStats.world_name: server.get("world_name", ""),
|
||||||
|
ServerStats.world_size: server.get("world_size", ""),
|
||||||
|
ServerStats.server_port: server.get("server_port", ""),
|
||||||
|
ServerStats.int_ping_results: server.get("int_ping_results", False),
|
||||||
|
ServerStats.online: server.get("online", False),
|
||||||
|
ServerStats.max: server.get("max", False),
|
||||||
|
ServerStats.players: server.get("players", False),
|
||||||
|
ServerStats.desc: server.get("desc", False),
|
||||||
|
ServerStats.version: server.get("version", False),
|
||||||
|
}
|
||||||
|
).execute()
|
||||||
|
|
||||||
|
@staticmethod
|
||||||
|
def remove_old_stats(server_id, last_week):
|
||||||
|
HelperServerStats.select_database(server_id)
|
||||||
|
ServerStats.delete().where(ServerStats.created < last_week).execute()
|
||||||
|
|
||||||
|
@staticmethod
|
||||||
|
def get_latest_server_stats(server_id):
|
||||||
|
HelperServerStats.select_database(server_id)
|
||||||
|
return (
|
||||||
|
ServerStats.select()
|
||||||
|
.where(ServerStats.server_id == server_id)
|
||||||
|
.order_by(ServerStats.created.desc())
|
||||||
|
.limit(1)
|
||||||
|
)
|
||||||
|
|
||||||
|
@staticmethod
|
||||||
|
def get_server_stats_by_id(server_id):
|
||||||
|
HelperServerStats.select_database(server_id)
|
||||||
|
stats = (
|
||||||
|
ServerStats.select()
|
||||||
|
.where(ServerStats.server_id == server_id)
|
||||||
|
.order_by(ServerStats.created.desc())
|
||||||
|
.limit(1)
|
||||||
|
)
|
||||||
|
return DatabaseShortcuts.return_rows(stats)[0]
|
||||||
|
|
||||||
|
@staticmethod
|
||||||
|
def server_id_exists(server_id):
|
||||||
|
HelperServerStats.select_database(server_id)
|
||||||
|
if not HelperServers.get_server_data_by_id(server_id):
|
||||||
|
return False
|
||||||
|
return True
|
||||||
|
|
||||||
|
@staticmethod
|
||||||
|
def sever_crashed(server_id):
|
||||||
|
HelperServerStats.select_database(server_id)
|
||||||
|
with database_stats_proxy.atomic():
|
||||||
|
ServerStats.update(crashed=True).where(
|
||||||
|
ServerStats.server_id == server_id
|
||||||
|
).execute()
|
||||||
|
|
||||||
|
@staticmethod
|
||||||
|
def set_download(server_id):
|
||||||
|
HelperServerStats.select_database(server_id)
|
||||||
|
with database_stats_proxy.atomic():
|
||||||
|
ServerStats.update(downloading=True).where(
|
||||||
|
ServerStats.server_id == server_id
|
||||||
|
).execute()
|
||||||
|
|
||||||
|
@staticmethod
|
||||||
|
def finish_download(server_id):
|
||||||
|
HelperServerStats.select_database(server_id)
|
||||||
|
with database_stats_proxy.atomic():
|
||||||
|
ServerStats.update(downloading=False).where(
|
||||||
|
ServerStats.server_id == server_id
|
||||||
|
).execute()
|
||||||
|
|
||||||
|
@staticmethod
|
||||||
|
def get_download_status(server_id):
|
||||||
|
HelperServerStats.select_database(server_id)
|
||||||
|
download_status = (
|
||||||
|
ServerStats.select().where(ServerStats.server_id == server_id).get()
|
||||||
|
)
|
||||||
|
return download_status.downloading
|
||||||
|
|
||||||
|
@staticmethod
|
||||||
|
def server_crash_reset(server_id):
|
||||||
|
if server_id is None:
|
||||||
|
return
|
||||||
|
|
||||||
|
HelperServerStats.select_database(server_id)
|
||||||
|
with database_stats_proxy.atomic():
|
||||||
|
ServerStats.update(crashed=False).where(
|
||||||
|
ServerStats.server_id == server_id
|
||||||
|
).execute()
|
||||||
|
|
||||||
|
@staticmethod
|
||||||
|
def is_crashed(server_id):
|
||||||
|
HelperServerStats.select_database(server_id)
|
||||||
|
svr = ServerStats.select().where(ServerStats.server_id == server_id).get()
|
||||||
|
# pylint: disable=singleton-comparison
|
||||||
|
if svr.crashed == True:
|
||||||
|
return True
|
||||||
|
else:
|
||||||
|
return False
|
||||||
|
|
||||||
|
@staticmethod
|
||||||
|
def set_update(server_id, value):
|
||||||
|
if server_id is None:
|
||||||
|
return
|
||||||
|
|
||||||
|
HelperServerStats.select_database(server_id)
|
||||||
|
try:
|
||||||
|
# Checks if server even exists
|
||||||
|
ServerStats.select().where(ServerStats.server_id == server_id)
|
||||||
|
except Exception as ex:
|
||||||
|
logger.error(f"Database entry not found! {ex}")
|
||||||
|
with database_stats_proxy.atomic():
|
||||||
|
ServerStats.update(updating=value).where(
|
||||||
|
ServerStats.server_id == server_id
|
||||||
|
).execute()
|
||||||
|
|
||||||
|
@staticmethod
|
||||||
|
def get_update_status(server_id):
|
||||||
|
HelperServerStats.select_database(server_id)
|
||||||
|
update_status = (
|
||||||
|
ServerStats.select().where(ServerStats.server_id == server_id).get()
|
||||||
|
)
|
||||||
|
return update_status.updating
|
||||||
|
|
||||||
|
@staticmethod
|
||||||
|
def set_first_run(server_id):
|
||||||
|
HelperServerStats.select_database(server_id)
|
||||||
|
# Sets first run to false
|
||||||
|
try:
|
||||||
|
# Checks if server even exists
|
||||||
|
ServerStats.select().where(ServerStats.server_id == server_id)
|
||||||
|
except Exception as ex:
|
||||||
|
logger.error(f"Database entry not found! {ex}")
|
||||||
|
return
|
||||||
|
with database_stats_proxy.atomic():
|
||||||
|
ServerStats.update(first_run=False).where(
|
||||||
|
ServerStats.server_id == server_id
|
||||||
|
).execute()
|
||||||
|
|
||||||
|
@staticmethod
|
||||||
|
def get_first_run(server_id):
|
||||||
|
HelperServerStats.select_database(server_id)
|
||||||
|
first_run = ServerStats.select().where(ServerStats.server_id == server_id).get()
|
||||||
|
return first_run.first_run
|
||||||
|
|
||||||
|
@staticmethod
|
||||||
|
def get_ttl_without_player(server_id):
|
||||||
|
HelperServerStats.select_database(server_id)
|
||||||
|
last_stat = (
|
||||||
|
ServerStats.select()
|
||||||
|
.where(ServerStats.server_id == server_id)
|
||||||
|
.order_by(ServerStats.created.desc())
|
||||||
|
.first()
|
||||||
|
)
|
||||||
|
last_stat_with_player = (
|
||||||
|
ServerStats.select()
|
||||||
|
.where(ServerStats.server_id == server_id)
|
||||||
|
.where(ServerStats.online > 0)
|
||||||
|
.order_by(ServerStats.created.desc())
|
||||||
|
.first()
|
||||||
|
)
|
||||||
|
return last_stat.created - last_stat_with_player.created
|
||||||
|
|
||||||
|
@staticmethod
|
||||||
|
def can_stop_no_players(server_id, time_limit):
|
||||||
|
HelperServerStats.select_database(server_id)
|
||||||
|
can = False
|
||||||
|
ttl_no_players = HelperServerStats.get_ttl_without_player(server_id)
|
||||||
|
if (time_limit == -1) or (ttl_no_players > time_limit):
|
||||||
|
can = True
|
||||||
|
return can
|
||||||
|
|
||||||
|
@staticmethod
|
||||||
|
def set_waiting_start(server_id, value):
|
||||||
|
HelperServerStats.select_database(server_id)
|
||||||
|
try:
|
||||||
|
# Checks if server even exists
|
||||||
|
ServerStats.select().where(ServerStats.server_id == server_id)
|
||||||
|
except Exception as ex:
|
||||||
|
logger.error(f"Database entry not found! {ex}")
|
||||||
|
with database_stats_proxy.atomic():
|
||||||
|
ServerStats.update(waiting_start=value).where(
|
||||||
|
ServerStats.server_id == server_id
|
||||||
|
).execute()
|
||||||
|
|
||||||
|
@staticmethod
|
||||||
|
def get_waiting_start(server_id):
|
||||||
|
HelperServerStats.select_database(server_id)
|
||||||
|
waiting_start = (
|
||||||
|
ServerStats.select().where(ServerStats.server_id == server_id).get()
|
||||||
|
)
|
||||||
|
return waiting_start.waiting_start
|
@ -2,13 +2,11 @@ import logging
|
|||||||
import datetime
|
import datetime
|
||||||
import typing as t
|
import typing as t
|
||||||
from peewee import (
|
from peewee import (
|
||||||
ForeignKeyField,
|
|
||||||
CharField,
|
CharField,
|
||||||
AutoField,
|
AutoField,
|
||||||
DateTimeField,
|
DateTimeField,
|
||||||
BooleanField,
|
BooleanField,
|
||||||
IntegerField,
|
IntegerField,
|
||||||
FloatField,
|
|
||||||
)
|
)
|
||||||
from playhouse.shortcuts import model_to_dict
|
from playhouse.shortcuts import model_to_dict
|
||||||
|
|
||||||
@ -44,37 +42,6 @@ class Servers(BaseModel):
|
|||||||
table_name = "servers"
|
table_name = "servers"
|
||||||
|
|
||||||
|
|
||||||
# **********************************************************************************
|
|
||||||
# Servers Stats Class
|
|
||||||
# **********************************************************************************
|
|
||||||
class ServerStats(BaseModel):
|
|
||||||
stats_id = AutoField()
|
|
||||||
created = DateTimeField(default=datetime.datetime.now)
|
|
||||||
server_id = ForeignKeyField(Servers, backref="server", index=True)
|
|
||||||
started = CharField(default="")
|
|
||||||
running = BooleanField(default=False)
|
|
||||||
cpu = FloatField(default=0)
|
|
||||||
mem = FloatField(default=0)
|
|
||||||
mem_percent = FloatField(default=0)
|
|
||||||
world_name = CharField(default="")
|
|
||||||
world_size = CharField(default="")
|
|
||||||
server_port = IntegerField(default=25565)
|
|
||||||
int_ping_results = CharField(default="")
|
|
||||||
online = IntegerField(default=0)
|
|
||||||
max = IntegerField(default=0)
|
|
||||||
players = CharField(default="")
|
|
||||||
desc = CharField(default="Unable to Connect")
|
|
||||||
version = CharField(default="")
|
|
||||||
updating = BooleanField(default=False)
|
|
||||||
waiting_start = BooleanField(default=False)
|
|
||||||
first_run = BooleanField(default=True)
|
|
||||||
crashed = BooleanField(default=False)
|
|
||||||
downloading = BooleanField(default=False)
|
|
||||||
|
|
||||||
class Meta:
|
|
||||||
table_name = "server_stats"
|
|
||||||
|
|
||||||
|
|
||||||
# **********************************************************************************
|
# **********************************************************************************
|
||||||
# Servers Class
|
# Servers Class
|
||||||
# **********************************************************************************
|
# **********************************************************************************
|
||||||
@ -194,31 +161,6 @@ class HelperServers:
|
|||||||
def get_all_server_ids() -> t.List[int]:
|
def get_all_server_ids() -> t.List[int]:
|
||||||
return [server.server_id for server in Servers.select(Servers.server_id)]
|
return [server.server_id for server in Servers.select(Servers.server_id)]
|
||||||
|
|
||||||
@staticmethod
|
|
||||||
def get_all_servers_stats():
|
|
||||||
servers = HelperServers.get_all_defined_servers()
|
|
||||||
server_data = []
|
|
||||||
try:
|
|
||||||
for s in servers:
|
|
||||||
latest = (
|
|
||||||
ServerStats.select()
|
|
||||||
.where(ServerStats.server_id == s.get("server_id"))
|
|
||||||
.order_by(ServerStats.created.desc())
|
|
||||||
.limit(1)
|
|
||||||
)
|
|
||||||
server_data.append(
|
|
||||||
{
|
|
||||||
"server_data": s,
|
|
||||||
"stats": DatabaseShortcuts.return_rows(latest)[0],
|
|
||||||
"user_command_permission": True,
|
|
||||||
}
|
|
||||||
)
|
|
||||||
except IndexError as ex:
|
|
||||||
logger.error(
|
|
||||||
f"Stats collection failed with error: {ex}. Was a server just created?"
|
|
||||||
)
|
|
||||||
return server_data
|
|
||||||
|
|
||||||
@staticmethod
|
@staticmethod
|
||||||
def get_server_friendly_name(server_id):
|
def get_server_friendly_name(server_id):
|
||||||
server_data = HelperServers.get_server_data_by_id(server_id)
|
server_data = HelperServers.get_server_data_by_id(server_id)
|
||||||
@ -227,149 +169,3 @@ class HelperServers:
|
|||||||
f"with ID: {server_data.get('server_id', 0)}"
|
f"with ID: {server_data.get('server_id', 0)}"
|
||||||
)
|
)
|
||||||
return friendly_name
|
return friendly_name
|
||||||
|
|
||||||
# **********************************************************************************
|
|
||||||
# Servers_Stats Methods
|
|
||||||
# **********************************************************************************
|
|
||||||
@staticmethod
|
|
||||||
def get_latest_server_stats(server_id):
|
|
||||||
return (
|
|
||||||
ServerStats.select()
|
|
||||||
.where(ServerStats.server_id == server_id)
|
|
||||||
.order_by(ServerStats.created.desc())
|
|
||||||
.limit(1)
|
|
||||||
)
|
|
||||||
|
|
||||||
@staticmethod
|
|
||||||
def get_server_stats_by_id(server_id):
|
|
||||||
stats = (
|
|
||||||
ServerStats.select()
|
|
||||||
.where(ServerStats.server_id == server_id)
|
|
||||||
.order_by(ServerStats.created.desc())
|
|
||||||
.limit(1)
|
|
||||||
)
|
|
||||||
return DatabaseShortcuts.return_rows(stats)[0]
|
|
||||||
|
|
||||||
@staticmethod
|
|
||||||
def server_id_exists(server_id):
|
|
||||||
if not HelperServers.get_server_data_by_id(server_id):
|
|
||||||
return False
|
|
||||||
return True
|
|
||||||
|
|
||||||
@staticmethod
|
|
||||||
def sever_crashed(server_id):
|
|
||||||
ServerStats.update(crashed=True).where(
|
|
||||||
ServerStats.server_id == server_id
|
|
||||||
).execute()
|
|
||||||
|
|
||||||
@staticmethod
|
|
||||||
def set_download(server_id):
|
|
||||||
ServerStats.update(downloading=True).where(
|
|
||||||
ServerStats.server_id == server_id
|
|
||||||
).execute()
|
|
||||||
|
|
||||||
@staticmethod
|
|
||||||
def finish_download(server_id):
|
|
||||||
ServerStats.update(downloading=False).where(
|
|
||||||
ServerStats.server_id == server_id
|
|
||||||
).execute()
|
|
||||||
|
|
||||||
@staticmethod
|
|
||||||
def get_download_status(server_id):
|
|
||||||
download_status = (
|
|
||||||
ServerStats.select().where(ServerStats.server_id == server_id).get()
|
|
||||||
)
|
|
||||||
return download_status.downloading
|
|
||||||
|
|
||||||
@staticmethod
|
|
||||||
def server_crash_reset(server_id):
|
|
||||||
ServerStats.update(crashed=False).where(
|
|
||||||
ServerStats.server_id == server_id
|
|
||||||
).execute()
|
|
||||||
|
|
||||||
@staticmethod
|
|
||||||
def is_crashed(server_id):
|
|
||||||
svr = ServerStats.select().where(ServerStats.server_id == server_id).get()
|
|
||||||
if svr.crashed is True:
|
|
||||||
return True
|
|
||||||
else:
|
|
||||||
return False
|
|
||||||
|
|
||||||
@staticmethod
|
|
||||||
def set_update(server_id, value):
|
|
||||||
try:
|
|
||||||
# Checks if server even exists
|
|
||||||
ServerStats.select().where(ServerStats.server_id == server_id)
|
|
||||||
except Exception as ex:
|
|
||||||
logger.error(f"Database entry not found! {ex}")
|
|
||||||
ServerStats.update(updating=value).where(
|
|
||||||
ServerStats.server_id == server_id
|
|
||||||
).execute()
|
|
||||||
|
|
||||||
@staticmethod
|
|
||||||
def get_update_status(server_id):
|
|
||||||
update_status = (
|
|
||||||
ServerStats.select().where(ServerStats.server_id == server_id).get()
|
|
||||||
)
|
|
||||||
return update_status.updating
|
|
||||||
|
|
||||||
@staticmethod
|
|
||||||
def set_first_run(server_id):
|
|
||||||
# Sets first run to false
|
|
||||||
try:
|
|
||||||
# Checks if server even exists
|
|
||||||
ServerStats.select().where(ServerStats.server_id == server_id)
|
|
||||||
except Exception as ex:
|
|
||||||
logger.error(f"Database entry not found! {ex}")
|
|
||||||
return
|
|
||||||
ServerStats.update(first_run=False).where(
|
|
||||||
ServerStats.server_id == server_id
|
|
||||||
).execute()
|
|
||||||
|
|
||||||
@staticmethod
|
|
||||||
def get_first_run(server_id):
|
|
||||||
first_run = ServerStats.select().where(ServerStats.server_id == server_id).get()
|
|
||||||
return first_run.first_run
|
|
||||||
|
|
||||||
@staticmethod
|
|
||||||
def get_ttl_without_player(server_id):
|
|
||||||
last_stat = (
|
|
||||||
ServerStats.select()
|
|
||||||
.where(ServerStats.server_id == server_id)
|
|
||||||
.order_by(ServerStats.created.desc())
|
|
||||||
.first()
|
|
||||||
)
|
|
||||||
last_stat_with_player = (
|
|
||||||
ServerStats.select()
|
|
||||||
.where(ServerStats.server_id == server_id)
|
|
||||||
.where(ServerStats.online > 0)
|
|
||||||
.order_by(ServerStats.created.desc())
|
|
||||||
.first()
|
|
||||||
)
|
|
||||||
return last_stat.created - last_stat_with_player.created
|
|
||||||
|
|
||||||
@staticmethod
|
|
||||||
def can_stop_no_players(server_id, time_limit):
|
|
||||||
can = False
|
|
||||||
ttl_no_players = HelperServers.get_ttl_without_player(server_id)
|
|
||||||
if (time_limit == -1) or (ttl_no_players > time_limit):
|
|
||||||
can = True
|
|
||||||
return can
|
|
||||||
|
|
||||||
@staticmethod
|
|
||||||
def set_waiting_start(server_id, value):
|
|
||||||
try:
|
|
||||||
# Checks if server even exists
|
|
||||||
ServerStats.select().where(ServerStats.server_id == server_id)
|
|
||||||
except Exception as ex:
|
|
||||||
logger.error(f"Database entry not found! {ex}")
|
|
||||||
ServerStats.update(waiting_start=value).where(
|
|
||||||
ServerStats.server_id == server_id
|
|
||||||
).execute()
|
|
||||||
|
|
||||||
@staticmethod
|
|
||||||
def get_waiting_start(server_id):
|
|
||||||
waiting_start = (
|
|
||||||
ServerStats.select().where(ServerStats.server_id == server_id).get()
|
|
||||||
)
|
|
||||||
return waiting_start.waiting_start
|
|
||||||
|
@ -825,8 +825,8 @@ class Helpers:
|
|||||||
output += f"""<li class="tree-item" data-path="{dpath}">
|
output += f"""<li class="tree-item" data-path="{dpath}">
|
||||||
\n<div id="{dpath}" data-path="{dpath}" data-name="{filename}" class="tree-caret tree-ctx-item tree-folder">
|
\n<div id="{dpath}" data-path="{dpath}" data-name="{filename}" class="tree-caret tree-ctx-item tree-folder">
|
||||||
<span id="{dpath}span" class="files-tree-title" data-path="{dpath}" data-name="{filename}" onclick="getDirView(event)">
|
<span id="{dpath}span" class="files-tree-title" data-path="{dpath}" data-name="{filename}" onclick="getDirView(event)">
|
||||||
<i class="far fa-folder"></i>
|
<i style="color: #8862e0;" class="far fa-folder"></i>
|
||||||
<i class="far fa-folder-open"></i>
|
<i style="color: #8862e0;" class="far fa-folder-open"></i>
|
||||||
{filename}
|
{filename}
|
||||||
</span>
|
</span>
|
||||||
</div><li>
|
</div><li>
|
||||||
@ -834,7 +834,7 @@ class Helpers:
|
|||||||
else:
|
else:
|
||||||
if filename != "crafty_managed.txt":
|
if filename != "crafty_managed.txt":
|
||||||
output += f"""<li
|
output += f"""<li
|
||||||
class="tree-nested d-block tree-ctx-item tree-file tree-item"
|
class="d-block tree-ctx-item tree-file tree-item"
|
||||||
data-path="{dpath}"
|
data-path="{dpath}"
|
||||||
data-name="{filename}"
|
data-name="{filename}"
|
||||||
onclick="clickOnFile(event)"><span style="margin-right: 6px;">
|
onclick="clickOnFile(event)"><span style="margin-right: 6px;">
|
||||||
@ -863,15 +863,15 @@ class Helpers:
|
|||||||
output += f"""<li class="tree-item" data-path="{dpath}">
|
output += f"""<li class="tree-item" data-path="{dpath}">
|
||||||
\n<div id="{dpath}" data-path="{dpath}" data-name="{filename}" class="tree-caret tree-ctx-item tree-folder">
|
\n<div id="{dpath}" data-path="{dpath}" data-name="{filename}" class="tree-caret tree-ctx-item tree-folder">
|
||||||
<span id="{dpath}span" class="files-tree-title" data-path="{dpath}" data-name="{filename}" onclick="getDirView(event)">
|
<span id="{dpath}span" class="files-tree-title" data-path="{dpath}" data-name="{filename}" onclick="getDirView(event)">
|
||||||
<i class="far fa-folder"></i>
|
<i style="color: #8862e0;" class="far fa-folder"></i>
|
||||||
<i class="far fa-folder-open"></i>
|
<i style="color: #8862e0;" class="far fa-folder-open"></i>
|
||||||
{filename}
|
{filename}
|
||||||
</span>
|
</span>
|
||||||
</div><li>"""
|
</div><li>"""
|
||||||
else:
|
else:
|
||||||
if filename != "crafty_managed.txt":
|
if filename != "crafty_managed.txt":
|
||||||
output += f"""<li
|
output += f"""<li
|
||||||
class="tree-nested d-block tree-ctx-item tree-file tree-item"
|
class="d-block tree-ctx-item tree-file tree-item"
|
||||||
data-path="{dpath}"
|
data-path="{dpath}"
|
||||||
data-name="{filename}"
|
data-name="{filename}"
|
||||||
onclick="clickOnFile(event)"><span style="margin-right: 6px;">
|
onclick="clickOnFile(event)"><span style="margin-right: 6px;">
|
||||||
@ -893,8 +893,8 @@ class Helpers:
|
|||||||
\n<div id="{dpath}" data-path="{dpath}" data-name="{filename}" class="tree-caret tree-ctx-item tree-folder">
|
\n<div id="{dpath}" data-path="{dpath}" data-name="{filename}" class="tree-caret tree-ctx-item tree-folder">
|
||||||
<input type="radio" name="root_path" value="{dpath}">
|
<input type="radio" name="root_path" value="{dpath}">
|
||||||
<span id="{dpath}span" class="files-tree-title" data-path="{dpath}" data-name="{filename}" onclick="getDirView(event)">
|
<span id="{dpath}span" class="files-tree-title" data-path="{dpath}" data-name="{filename}" onclick="getDirView(event)">
|
||||||
<i class="far fa-folder"></i>
|
<i style="color: #8862e0;" class="far fa-folder"></i>
|
||||||
<i class="far fa-folder-open"></i>
|
<i style="color: #8862e0;" class="far fa-folder-open"></i>
|
||||||
{filename}
|
{filename}
|
||||||
</span>
|
</span>
|
||||||
</input></div><li>
|
</input></div><li>
|
||||||
@ -915,8 +915,8 @@ class Helpers:
|
|||||||
\n<div id="{dpath}" data-path="{dpath}" data-name="{filename}" class="tree-caret tree-ctx-item tree-folder">
|
\n<div id="{dpath}" data-path="{dpath}" data-name="{filename}" class="tree-caret tree-ctx-item tree-folder">
|
||||||
<input type="radio" name="root_path" value="{dpath}">
|
<input type="radio" name="root_path" value="{dpath}">
|
||||||
<span id="{dpath}span" class="files-tree-title" data-path="{dpath}" data-name="{filename}" onclick="getDirView(event)">
|
<span id="{dpath}span" class="files-tree-title" data-path="{dpath}" data-name="{filename}" onclick="getDirView(event)">
|
||||||
<i class="far fa-folder"></i>
|
<i style="color: #8862e0;" class="far fa-folder"></i>
|
||||||
<i class="far fa-folder-open"></i>
|
<i style="color: #8862e0;" class="far fa-folder-open"></i>
|
||||||
{filename}
|
{filename}
|
||||||
</span>
|
</span>
|
||||||
</input></div><li>"""
|
</input></div><li>"""
|
||||||
|
@ -988,6 +988,7 @@ class Controller:
|
|||||||
Console.info(f"Deleting Server: ID {server_id} | Name: {server_name} ")
|
Console.info(f"Deleting Server: ID {server_id} | Name: {server_name} ")
|
||||||
|
|
||||||
srv_obj = server["server_obj"]
|
srv_obj = server["server_obj"]
|
||||||
|
srv_obj.server_scheduler.shutdown()
|
||||||
running = srv_obj.check_running()
|
running = srv_obj.check_running()
|
||||||
|
|
||||||
if running:
|
if running:
|
||||||
|
@ -17,7 +17,8 @@ from apscheduler.schedulers.background import BackgroundScheduler
|
|||||||
|
|
||||||
from app.classes.minecraft.stats import Stats
|
from app.classes.minecraft.stats import Stats
|
||||||
from app.classes.minecraft.mc_ping import ping, ping_bedrock
|
from app.classes.minecraft.mc_ping import ping, ping_bedrock
|
||||||
from app.classes.models.servers import ServerStats, HelperServers
|
from app.classes.models.servers import HelperServers
|
||||||
|
from app.classes.models.server_stats import HelperServerStats
|
||||||
from app.classes.models.management import HelpersManagement
|
from app.classes.models.management import HelpersManagement
|
||||||
from app.classes.models.users import HelperUsers
|
from app.classes.models.users import HelperUsers
|
||||||
from app.classes.models.server_permissions import PermissionsServers
|
from app.classes.models.server_permissions import PermissionsServers
|
||||||
@ -118,8 +119,8 @@ class Server:
|
|||||||
)
|
)
|
||||||
self.is_backingup = False
|
self.is_backingup = False
|
||||||
# Reset crash and update at initialization
|
# Reset crash and update at initialization
|
||||||
HelperServers.server_crash_reset(self.server_id)
|
HelperServerStats.server_crash_reset(self.server_id)
|
||||||
HelperServers.set_update(self.server_id, False)
|
HelperServerStats.set_update(self.server_id, False)
|
||||||
|
|
||||||
# **********************************************************************************
|
# **********************************************************************************
|
||||||
# Minecraft Server Management
|
# Minecraft Server Management
|
||||||
@ -142,6 +143,7 @@ class Server:
|
|||||||
self.name = server_name
|
self.name = server_name
|
||||||
self.settings = server_data_obj
|
self.settings = server_data_obj
|
||||||
|
|
||||||
|
HelperServerStats.init_database(server_id)
|
||||||
self.record_server_stats()
|
self.record_server_stats()
|
||||||
|
|
||||||
# build our server run command
|
# build our server run command
|
||||||
@ -163,7 +165,7 @@ class Server:
|
|||||||
Console.info(f"Starting server ID: {self.server_id} - {self.name}")
|
Console.info(f"Starting server ID: {self.server_id} - {self.name}")
|
||||||
logger.info(f"Starting server ID: {self.server_id} - {self.name}")
|
logger.info(f"Starting server ID: {self.server_id} - {self.name}")
|
||||||
# Sets waiting start to false since we're attempting to start the server.
|
# Sets waiting start to false since we're attempting to start the server.
|
||||||
HelperServers.set_waiting_start(self.server_id, False)
|
HelperServerStats.set_waiting_start(self.server_id, False)
|
||||||
self.run_threaded_server(None)
|
self.run_threaded_server(None)
|
||||||
|
|
||||||
# remove the scheduled job since it's ran
|
# remove the scheduled job since it's ran
|
||||||
@ -230,7 +232,7 @@ class Server:
|
|||||||
else:
|
else:
|
||||||
user_lang = HelperUsers.get_user_lang_by_id(user_id)
|
user_lang = HelperUsers.get_user_lang_by_id(user_id)
|
||||||
|
|
||||||
if HelperServers.get_download_status(self.server_id):
|
if HelperServerStats.get_download_status(self.server_id):
|
||||||
if user_id:
|
if user_id:
|
||||||
self.helper.websocket_helper.broadcast_user(
|
self.helper.websocket_helper.broadcast_user(
|
||||||
user_id,
|
user_id,
|
||||||
@ -413,7 +415,7 @@ class Server:
|
|||||||
).start()
|
).start()
|
||||||
|
|
||||||
self.is_crashed = False
|
self.is_crashed = False
|
||||||
HelperServers.server_crash_reset(self.server_id)
|
HelperServerStats.server_crash_reset(self.server_id)
|
||||||
|
|
||||||
self.start_time = str(datetime.datetime.utcnow().strftime("%Y-%m-%d %H:%M:%S"))
|
self.start_time = str(datetime.datetime.utcnow().strftime("%Y-%m-%d %H:%M:%S"))
|
||||||
|
|
||||||
@ -421,7 +423,7 @@ class Server:
|
|||||||
logger.info(f"Server {self.name} running with PID {self.process.pid}")
|
logger.info(f"Server {self.name} running with PID {self.process.pid}")
|
||||||
Console.info(f"Server {self.name} running with PID {self.process.pid}")
|
Console.info(f"Server {self.name} running with PID {self.process.pid}")
|
||||||
self.is_crashed = False
|
self.is_crashed = False
|
||||||
HelperServers.server_crash_reset(self.server_id)
|
HelperServerStats.server_crash_reset(self.server_id)
|
||||||
self.record_server_stats()
|
self.record_server_stats()
|
||||||
check_internet_thread = threading.Thread(
|
check_internet_thread = threading.Thread(
|
||||||
target=self.check_internet_thread,
|
target=self.check_internet_thread,
|
||||||
@ -434,11 +436,11 @@ class Server:
|
|||||||
)
|
)
|
||||||
check_internet_thread.start()
|
check_internet_thread.start()
|
||||||
# Checks if this is the servers first run.
|
# Checks if this is the servers first run.
|
||||||
if HelperServers.get_first_run(self.server_id):
|
if HelperServerStats.get_first_run(self.server_id):
|
||||||
HelperServers.set_first_run(self.server_id)
|
HelperServerStats.set_first_run(self.server_id)
|
||||||
loc_server_port = HelperServers.get_server_stats_by_id(self.server_id)[
|
loc_server_port = HelperServerStats.get_server_stats_by_id(
|
||||||
"server_port"
|
self.server_id
|
||||||
]
|
)["server_port"]
|
||||||
# Sends port reminder message.
|
# Sends port reminder message.
|
||||||
self.helper.websocket_helper.broadcast_user(
|
self.helper.websocket_helper.broadcast_user(
|
||||||
user_id,
|
user_id,
|
||||||
@ -718,7 +720,7 @@ class Server:
|
|||||||
self.server_scheduler.remove_job("c_" + str(self.server_id))
|
self.server_scheduler.remove_job("c_" + str(self.server_id))
|
||||||
return
|
return
|
||||||
|
|
||||||
HelperServers.sever_crashed(self.server_id)
|
HelperServerStats.sever_crashed(self.server_id)
|
||||||
# if we haven't tried to restart more 3 or more times
|
# if we haven't tried to restart more 3 or more times
|
||||||
if self.restart_count <= 3:
|
if self.restart_count <= 3:
|
||||||
|
|
||||||
@ -742,7 +744,7 @@ class Server:
|
|||||||
|
|
||||||
self.restart_count = 0
|
self.restart_count = 0
|
||||||
self.is_crashed = True
|
self.is_crashed = True
|
||||||
HelperServers.sever_crashed(self.server_id)
|
HelperServerStats.sever_crashed(self.server_id)
|
||||||
|
|
||||||
# cancel the watcher task
|
# cancel the watcher task
|
||||||
self.server_scheduler.remove_job("c_" + str(self.server_id))
|
self.server_scheduler.remove_job("c_" + str(self.server_id))
|
||||||
@ -972,7 +974,7 @@ class Server:
|
|||||||
return []
|
return []
|
||||||
|
|
||||||
def jar_update(self):
|
def jar_update(self):
|
||||||
HelperServers.set_update(self.server_id, True)
|
HelperServerStats.set_update(self.server_id, True)
|
||||||
update_thread = threading.Thread(
|
update_thread = threading.Thread(
|
||||||
target=self.a_jar_update, daemon=True, name=f"exe_update_{self.name}"
|
target=self.a_jar_update, daemon=True, name=f"exe_update_{self.name}"
|
||||||
)
|
)
|
||||||
@ -980,7 +982,7 @@ class Server:
|
|||||||
|
|
||||||
def check_update(self):
|
def check_update(self):
|
||||||
|
|
||||||
if HelperServers.get_server_stats_by_id(self.server_id)["updating"]:
|
if HelperServerStats.get_server_stats_by_id(self.server_id)["updating"]:
|
||||||
return True
|
return True
|
||||||
else:
|
else:
|
||||||
return False
|
return False
|
||||||
@ -1053,11 +1055,11 @@ class Server:
|
|||||||
self.settings["executable_update_url"], current_executable
|
self.settings["executable_update_url"], current_executable
|
||||||
)
|
)
|
||||||
|
|
||||||
while HelperServers.get_server_stats_by_id(self.server_id)["updating"]:
|
while HelperServerStats.get_server_stats_by_id(self.server_id)["updating"]:
|
||||||
if downloaded and not self.is_backingup:
|
if downloaded and not self.is_backingup:
|
||||||
logger.info("Executable updated successfully. Starting Server")
|
logger.info("Executable updated successfully. Starting Server")
|
||||||
|
|
||||||
HelperServers.set_update(self.server_id, False)
|
HelperServerStats.set_update(self.server_id, False)
|
||||||
if len(self.helper.websocket_helper.clients) > 0:
|
if len(self.helper.websocket_helper.clients) > 0:
|
||||||
# There are clients
|
# There are clients
|
||||||
self.check_update()
|
self.check_update()
|
||||||
@ -1453,29 +1455,11 @@ class Server:
|
|||||||
def record_server_stats(self):
|
def record_server_stats(self):
|
||||||
|
|
||||||
server = self.get_servers_stats()
|
server = self.get_servers_stats()
|
||||||
ServerStats.insert(
|
HelperServerStats.insert_server_stats(server)
|
||||||
{
|
|
||||||
ServerStats.server_id: server.get("id", 0),
|
|
||||||
ServerStats.started: server.get("started", ""),
|
|
||||||
ServerStats.running: server.get("running", False),
|
|
||||||
ServerStats.cpu: server.get("cpu", 0),
|
|
||||||
ServerStats.mem: server.get("mem", 0),
|
|
||||||
ServerStats.mem_percent: server.get("mem_percent", 0),
|
|
||||||
ServerStats.world_name: server.get("world_name", ""),
|
|
||||||
ServerStats.world_size: server.get("world_size", ""),
|
|
||||||
ServerStats.server_port: server.get("server_port", ""),
|
|
||||||
ServerStats.int_ping_results: server.get("int_ping_results", False),
|
|
||||||
ServerStats.online: server.get("online", False),
|
|
||||||
ServerStats.max: server.get("max", False),
|
|
||||||
ServerStats.players: server.get("players", False),
|
|
||||||
ServerStats.desc: server.get("desc", False),
|
|
||||||
ServerStats.version: server.get("version", False),
|
|
||||||
}
|
|
||||||
).execute()
|
|
||||||
|
|
||||||
# delete old data
|
# delete old data
|
||||||
max_age = self.helper.get_setting("history_max_age")
|
max_age = self.helper.get_setting("history_max_age")
|
||||||
now = datetime.datetime.now()
|
now = datetime.datetime.now()
|
||||||
last_week = now.day - max_age
|
last_week = now.day - max_age
|
||||||
|
|
||||||
ServerStats.delete().where(ServerStats.created < last_week).execute()
|
HelperServerStats.remove_old_stats(server.get("id", 0), last_week)
|
||||||
|
@ -70,9 +70,7 @@ class AjaxHandler(BaseHandler):
|
|||||||
|
|
||||||
for line in data:
|
for line in data:
|
||||||
try:
|
try:
|
||||||
line = re.sub(
|
line = re.sub("(\033\\[(0;)?[0-9]*[A-z]?(;[0-9])?m?)", "", line)
|
||||||
"(\033\\[(0;)?[0-9]*[A-z]?(;[0-9])?m?)|(> )", "", line
|
|
||||||
)
|
|
||||||
line = re.sub("[A-z]{2}\b\b", "", line)
|
line = re.sub("[A-z]{2}\b\b", "", line)
|
||||||
line = self.helper.log_colors(html.escape(line))
|
line = self.helper.log_colors(html.escape(line))
|
||||||
self.write(f"{line}<br />")
|
self.write(f"{line}<br />")
|
||||||
@ -136,15 +134,15 @@ class AjaxHandler(BaseHandler):
|
|||||||
\n<div id="{dpath}" data-path="{dpath}" data-name="{filename}" class="tree-caret tree-ctx-item tree-folder">
|
\n<div id="{dpath}" data-path="{dpath}" data-name="{filename}" class="tree-caret tree-ctx-item tree-folder">
|
||||||
<input type="checkbox" class="checkBoxClass" name="root_path" value="{dpath}" checked>
|
<input type="checkbox" class="checkBoxClass" name="root_path" value="{dpath}" checked>
|
||||||
<span id="{dpath}span" class="files-tree-title" data-path="{dpath}" data-name="{filename}" onclick="getDirView(event)">
|
<span id="{dpath}span" class="files-tree-title" data-path="{dpath}" data-name="{filename}" onclick="getDirView(event)">
|
||||||
<i class="far fa-folder"></i>
|
<i style="color: #8862e0;" class="far fa-folder"></i>
|
||||||
<i class="far fa-folder-open"></i>
|
<i style="color: #8862e0;" class="far fa-folder-open"></i>
|
||||||
<strong>{filename}</strong>
|
<strong>{filename}</strong>
|
||||||
</span>
|
</span>
|
||||||
</input></div><li>
|
</input></div><li>
|
||||||
\n"""
|
\n"""
|
||||||
else:
|
else:
|
||||||
output += f"""<li
|
output += f"""<li
|
||||||
class="tree-nested d-block tree-ctx-item tree-file"
|
class="d-block tree-ctx-item tree-file"
|
||||||
data-path="{dpath}"
|
data-path="{dpath}"
|
||||||
data-name="{filename}"
|
data-name="{filename}"
|
||||||
onclick=""><input type='checkbox' class="checkBoxClass" name='root_path' value="{dpath}" checked><span style="margin-right: 6px;">
|
onclick=""><input type='checkbox' class="checkBoxClass" name='root_path' value="{dpath}" checked><span style="margin-right: 6px;">
|
||||||
@ -156,15 +154,15 @@ class AjaxHandler(BaseHandler):
|
|||||||
\n<div id="{dpath}" data-path="{dpath}" data-name="{filename}" class="tree-caret tree-ctx-item tree-folder">
|
\n<div id="{dpath}" data-path="{dpath}" data-name="{filename}" class="tree-caret tree-ctx-item tree-folder">
|
||||||
<input type="checkbox" class="checkBoxClass" name="root_path" value="{dpath}">
|
<input type="checkbox" class="checkBoxClass" name="root_path" value="{dpath}">
|
||||||
<span id="{dpath}span" class="files-tree-title" data-path="{dpath}" data-name="{filename}" onclick="getDirView(event)">
|
<span id="{dpath}span" class="files-tree-title" data-path="{dpath}" data-name="{filename}" onclick="getDirView(event)">
|
||||||
<i class="far fa-folder"></i>
|
<i style="color: #8862e0;" class="far fa-folder"></i>
|
||||||
<i class="far fa-folder-open"></i>
|
<i style="color: #8862e0;" class="far fa-folder-open"></i>
|
||||||
<strong>{filename}</strong>
|
<strong>{filename}</strong>
|
||||||
</span>
|
</span>
|
||||||
</input></div><li>
|
</input></div><li>
|
||||||
\n"""
|
\n"""
|
||||||
else:
|
else:
|
||||||
output += f"""<li
|
output += f"""<li
|
||||||
class="tree-nested d-block tree-ctx-item tree-file"
|
class="d-block tree-ctx-item tree-file"
|
||||||
data-path="{dpath}"
|
data-path="{dpath}"
|
||||||
data-name="{filename}"
|
data-name="{filename}"
|
||||||
onclick=""><input type='checkbox' class="checkBoxClass" name='root_path' value="{dpath}">
|
onclick=""><input type='checkbox' class="checkBoxClass" name='root_path' value="{dpath}">
|
||||||
@ -200,7 +198,7 @@ class AjaxHandler(BaseHandler):
|
|||||||
if os.path.isdir(rel):
|
if os.path.isdir(rel):
|
||||||
output += f"""<li class="tree-item" data-path="{dpath}">
|
output += f"""<li class="tree-item" data-path="{dpath}">
|
||||||
\n<div id="{dpath}" data-path="{dpath}" data-name="{filename}" class="tree-caret tree-ctx-item tree-folder">
|
\n<div id="{dpath}" data-path="{dpath}" data-name="{filename}" class="tree-caret tree-ctx-item tree-folder">
|
||||||
<input type="checkbox" name="root_path" value="{dpath}">
|
<input type="checkbox" name="root_path" value="{dpath}" checked>
|
||||||
<span id="{dpath}span" class="files-tree-title" data-path="{dpath}" data-name="{filename}" onclick="getDirView(event)">
|
<span id="{dpath}span" class="files-tree-title" data-path="{dpath}" data-name="{filename}" onclick="getDirView(event)">
|
||||||
<i class="far fa-folder"></i>
|
<i class="far fa-folder"></i>
|
||||||
<i class="far fa-folder-open"></i>
|
<i class="far fa-folder-open"></i>
|
||||||
@ -212,7 +210,7 @@ class AjaxHandler(BaseHandler):
|
|||||||
class="tree-item tree-nested d-block tree-ctx-item tree-file"
|
class="tree-item tree-nested d-block tree-ctx-item tree-file"
|
||||||
data-path="{dpath}"
|
data-path="{dpath}"
|
||||||
data-name="{filename}"
|
data-name="{filename}"
|
||||||
onclick=""><input type='checkbox' name='root_path' value='{dpath}'><span style="margin-right: 6px;">
|
onclick=""><input type='checkbox' name='root_path' value='{dpath}' checked><span style="margin-right: 6px;">
|
||||||
<i class="far fa-file"></i></span></input>{filename}</li>"""
|
<i class="far fa-file"></i></span></input>{filename}</li>"""
|
||||||
|
|
||||||
else:
|
else:
|
||||||
|
@ -1,6 +1,6 @@
|
|||||||
import logging
|
import logging
|
||||||
from playhouse.shortcuts import model_to_dict
|
from playhouse.shortcuts import model_to_dict
|
||||||
from app.classes.models.servers import HelperServers
|
from app.classes.models.server_stats import HelperServerStats
|
||||||
from app.classes.web.base_api_handler import BaseApiHandler
|
from app.classes.web.base_api_handler import BaseApiHandler
|
||||||
|
|
||||||
|
|
||||||
@ -22,7 +22,7 @@ class ApiServersServerStatsHandler(BaseApiHandler):
|
|||||||
{
|
{
|
||||||
"status": "ok",
|
"status": "ok",
|
||||||
"data": model_to_dict(
|
"data": model_to_dict(
|
||||||
HelperServers.get_latest_server_stats(server_id)[0]
|
HelperServerStats.get_latest_server_stats(server_id)[0]
|
||||||
),
|
),
|
||||||
},
|
},
|
||||||
)
|
)
|
||||||
|
@ -5,39 +5,60 @@
|
|||||||
<div class="row">
|
<div class="row">
|
||||||
<div class="col-sm-4 mr-2">
|
<div class="col-sm-4 mr-2">
|
||||||
{% if data['server_stats']['running'] %}
|
{% if data['server_stats']['running'] %}
|
||||||
<b>{{ translate('serverStats', 'serverStatus', data['lang']) }}:</b> <span id="status" class="text-success">{{ translate('serverStats', 'online', data['lang']) }}</span><br />
|
<b>{{ translate('serverStats', 'serverStatus', data['lang']) }}:</b> <span id="status"
|
||||||
<b>{{ translate('serverStats', 'serverStarted', data['lang']) }}:</b> <span id="started">{{ data['server_stats']['started'] }}</span><br />
|
class="text-success">{{ translate('serverStats', 'online', data['lang']) }}</span><br />
|
||||||
<b>{{ translate('serverStats', 'serverUptime', data['lang']) }}:</b> <span id="uptime">{{ translate('serverStats', 'errorCalculatingUptime', data['lang']) }}</span>
|
<b>{{ translate('serverStats', 'serverStarted', data['lang']) }}:</b> <span id="started">{{
|
||||||
|
data['server_stats']['started'] }}</span><br />
|
||||||
|
<b>{{ translate('serverStats', 'serverUptime', data['lang']) }}:</b> <span id="uptime">{{
|
||||||
|
translate('serverStats', 'errorCalculatingUptime', data['lang']) }}</span>
|
||||||
{% elif data['server_stats']['crashed'] %}
|
{% elif data['server_stats']['crashed'] %}
|
||||||
<b>{{ translate('serverStats', 'serverStatus', data['lang']) }}:</b> <span id="status" class="text-danger"> <i class="fas fa-exclamation-triangle"></i> {{ translate('dashboard', 'crashed', data['lang']) }}</span><br />
|
<b>{{ translate('serverStats', 'serverStatus', data['lang']) }}:</b> <span id="status" class="text-danger">
|
||||||
<b>{{ translate('serverStats', 'serverStarted', data['lang']) }}:</b> <span id="started" class="text-danger"> <i class="fas fa-exclamation-triangle"></i> {{ translate('dashboard', 'crashed', data['lang']) }}</span><br />
|
<i class="fas fa-exclamation-triangle"></i> {{ translate('dashboard', 'crashed', data['lang'])
|
||||||
<b>{{ translate('serverStats', 'serverUptime', data['lang']) }}:</b> <span id="uptime" class="text-danger"> <i class="fas fa-exclamation-triangle"></i> {{ translate('dashboard', 'crashed', data['lang']) }}</span>
|
}}</span><br />
|
||||||
|
<b>{{ translate('serverStats', 'serverStarted', data['lang']) }}:</b> <span id="started"
|
||||||
|
class="text-danger"> <i class="fas fa-exclamation-triangle"></i> {{ translate('dashboard', 'crashed',
|
||||||
|
data['lang']) }}</span><br />
|
||||||
|
<b>{{ translate('serverStats', 'serverUptime', data['lang']) }}:</b> <span id="uptime" class="text-danger">
|
||||||
|
<i class="fas fa-exclamation-triangle"></i> {{ translate('dashboard', 'crashed', data['lang']) }}</span>
|
||||||
{% else %}
|
{% else %}
|
||||||
<b>{{ translate('serverStats', 'serverStatus', data['lang']) }}:</b> <span id="status" class="text-warning">{{ translate('serverStats', 'offline', data['lang']) }}</span><br />
|
<b>{{ translate('serverStats', 'serverStatus', data['lang']) }}:</b> <span id="status"
|
||||||
<b>{{ translate('serverStats', 'serverStarted', data['lang']) }}:</b> <span id="started" class="text-warning">{{ translate('serverStats', 'offline', data['lang']) }}</span><br />
|
class="text-warning">{{ translate('serverStats', 'offline', data['lang']) }}</span><br />
|
||||||
<b>{{ translate('serverStats', 'serverUptime', data['lang']) }}:</b> <span id="uptime" class="text-warning">{{ translate('serverStats', 'offline', data['lang']) }}</span>
|
<b>{{ translate('serverStats', 'serverStarted', data['lang']) }}:</b> <span id="started"
|
||||||
|
class="text-warning">{{ translate('serverStats', 'offline', data['lang']) }}</span><br />
|
||||||
|
<b>{{ translate('serverStats', 'serverUptime', data['lang']) }}:</b> <span id="uptime"
|
||||||
|
class="text-warning">{{ translate('serverStats', 'offline', data['lang']) }}</span>
|
||||||
{% end %}
|
{% end %}
|
||||||
<br>
|
<br>
|
||||||
<b>{{ translate('serverStats', 'serverTimeZone', data['lang']) }}:</b> <span class="text-info">{{ data['serverTZ'] }}</span>
|
<b>{{ translate('serverStats', 'serverTimeZone', data['lang']) }}:</b> <span class="text-info">{{
|
||||||
|
data['serverTZ'] }}</span>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<div class="col-sm-3 mr-2">
|
<div class="col-sm-3 mr-2">
|
||||||
<b>{{ translate('serverStats', 'cpuUsage', data['lang']) }}:</b> <span id="cpu">{{ data['server_stats']['cpu'] }}%</span> <br />
|
<b>{{ translate('serverStats', 'cpuUsage', data['lang']) }}:</b> <span id="cpu">{{
|
||||||
<b>{{ translate('serverStats', 'memUsage', data['lang']) }}:</b> <span id="mem" >{{ data['server_stats']['mem'] }}</span> <br />
|
data['server_stats']['cpu'] }}%</span> <br />
|
||||||
|
<b>{{ translate('serverStats', 'memUsage', data['lang']) }}:</b> <span id="mem">{{
|
||||||
|
data['server_stats']['mem'] }}</span> <br />
|
||||||
{% if data['server_stats']['int_ping_results'] %}
|
{% if data['server_stats']['int_ping_results'] %}
|
||||||
<b>{{ translate('serverStats', 'players', data['lang']) }}:</b> <span id="players" >{{ data['server_stats']['online'] }} / {{ data['server_stats']['max'] }}</span><br />
|
<b>{{ translate('serverStats', 'players', data['lang']) }}:</b> <span id="players">{{
|
||||||
|
data['server_stats']['online'] }} / {{ data['server_stats']['max'] }}</span><br />
|
||||||
{% else %}
|
{% else %}
|
||||||
<b>{{ translate('serverStats', 'players', data['lang']) }}:</b> <span id="players" >0/0</span><br />
|
<b>{{ translate('serverStats', 'players', data['lang']) }}:</b> <span id="players">0/0</span><br />
|
||||||
{% end %}
|
{% end %}
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<div class="col-sm-3 mr-2">
|
<div class="col-sm-3 mr-2">
|
||||||
{% if data['server_stats']['version'] != 'False' %}
|
{% if data['server_stats']['version'] != 'False' %}
|
||||||
<b>{{ translate('serverStats', 'version', data['lang']) }}:</b> <span id="version">{{ data['server_stats']['version'] }}</span><br />
|
<b>{{ translate('serverStats', 'version', data['lang']) }}:</b> <span id="version">{{
|
||||||
<b>{{ translate('serverStats', 'description', data['lang']) }}:</b> <span id="input_motd" style="max-width: 10px; max-height: 10px" class="input_motd">{{ data['server_stats']['desc'] }}</span> <br />
|
data['server_stats']['version'] }}</span><br />
|
||||||
|
<b>{{ translate('serverStats', 'description', data['lang']) }}:</b> <span id="input_motd"
|
||||||
|
style="max-width: 10px; max-height: 10px" class="input_motd">{{ data['server_stats']['desc'] }}</span>
|
||||||
|
<br />
|
||||||
{% else %}
|
{% else %}
|
||||||
<b>{{ translate('serverStats', 'version', data['lang']) }}:</b> <span id="version">{{ translate('serverStats', 'unableToConnect', data['lang']) }}</span> <br />
|
<b>{{ translate('serverStats', 'version', data['lang']) }}:</b> <span id="version">{{
|
||||||
<b>{{ translate('serverStats', 'description', data['lang']) }}:</b> <span style="max-width: 10px; max-height: 10px" id="input_motd" class="input_motd">{{ translate('serverStats', 'unableToConnect', data['lang']) }}</span> <br />
|
translate('serverStats', 'unableToConnect', data['lang']) }}</span> <br />
|
||||||
|
<b>{{ translate('serverStats', 'description', data['lang']) }}:</b> <span
|
||||||
|
style="max-width: 10px; max-height: 10px" id="input_motd" class="input_motd">{{ translate('serverStats',
|
||||||
|
'unableToConnect', data['lang']) }}</span> <br />
|
||||||
{% end %}
|
{% end %}
|
||||||
<b>Server Type: <span class="text-info">{{data['server_stats']['server_type']}}</span></b>
|
<b>Server Type: <span class="text-info">{{data['server_stats']['server_type']}}</span></b>
|
||||||
|
|
||||||
@ -64,6 +85,15 @@
|
|||||||
seconds: duration._data.seconds
|
seconds: duration._data.seconds
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (Math.round(duration._data.days)) {
|
||||||
|
obj = {
|
||||||
|
days: Math.round(duration._data.days),
|
||||||
|
hours: Math.round(duration._data.hours -= duration._data.days * 24),
|
||||||
|
minutes: duration._data.minutes,
|
||||||
|
seconds: duration._data.seconds
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
output = Object.entries(obj)
|
output = Object.entries(obj)
|
||||||
.map(([type, num]) => {
|
.map(([type, num]) => {
|
||||||
// make them strings
|
// make them strings
|
||||||
@ -135,9 +165,9 @@
|
|||||||
server_input_motd = document.getElementById('input_motd');
|
server_input_motd = document.getElementById('input_motd');
|
||||||
|
|
||||||
/* TODO Update each element */
|
/* TODO Update each element */
|
||||||
if (server.running){
|
if (server.running) {
|
||||||
server_status.setAttribute("class", "text-success");
|
server_status.setAttribute("class", "text-success");
|
||||||
server_status.innerHTML = `{{ translate('serverStats', 'online', data['lang']) }}`;
|
server_status.innerHTML = `{{ translate('serverStats', 'online', data['lang']) }}`;
|
||||||
|
|
||||||
startedUTC = server.started;
|
startedUTC = server.started;
|
||||||
startedUTC = moment.utc(startedUTC, 'YYYY-MM-DD HH:mm:ss');
|
startedUTC = moment.utc(startedUTC, 'YYYY-MM-DD HH:mm:ss');
|
||||||
@ -156,9 +186,8 @@
|
|||||||
uptimeLoop = setInterval(calculateUptime, 1000);
|
uptimeLoop = setInterval(calculateUptime, 1000);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else
|
else {
|
||||||
{
|
if (server.crashed) {
|
||||||
if (server.crashed){
|
|
||||||
server_status.setAttribute("class", "text-danger");
|
server_status.setAttribute("class", "text-danger");
|
||||||
server_status.innerHTML = `<i class="fas fa-exclamation-triangle"></i> {{ translate('dashboard', 'crashed', data['lang']) }}`;
|
server_status.innerHTML = `<i class="fas fa-exclamation-triangle"></i> {{ translate('dashboard', 'crashed', data['lang']) }}`;
|
||||||
server_started.setAttribute("class", "text-danger");
|
server_started.setAttribute("class", "text-danger");
|
||||||
@ -167,37 +196,33 @@
|
|||||||
uptimeLoop = null;
|
uptimeLoop = null;
|
||||||
server_uptime.setAttribute("class", "text-danger");
|
server_uptime.setAttribute("class", "text-danger");
|
||||||
server_uptime.innerHTML = `<i class="fas fa-exclamation-triangle"></i> {{ translate('dashboard', 'crashed', data['lang']) }}`;
|
server_uptime.innerHTML = `<i class="fas fa-exclamation-triangle"></i> {{ translate('dashboard', 'crashed', data['lang']) }}`;
|
||||||
}else{
|
} else {
|
||||||
server_status.setAttribute("class", "text-warning");
|
server_status.setAttribute("class", "text-warning");
|
||||||
server_status.innerHTML = `{{ translate('serverStats', 'offline', data['lang']) }}`;
|
server_status.innerHTML = `{{ translate('serverStats', 'offline', data['lang']) }}`;
|
||||||
server_started.setAttribute("class", "text-warning");
|
server_started.setAttribute("class", "text-warning");
|
||||||
server_started.innerHTML = `{{ translate('serverStats', 'offline', data['lang']) }}`;
|
server_started.innerHTML = `{{ translate('serverStats', 'offline', data['lang']) }}`;
|
||||||
clearInterval(uptimeLoop);
|
clearInterval(uptimeLoop);
|
||||||
uptimeLoop = null;
|
uptimeLoop = null;
|
||||||
server_uptime.setAttribute("class", "text-warning");
|
server_uptime.setAttribute("class", "text-warning");
|
||||||
server_uptime.innerHTML = `{{ translate('serverStats', 'offline', data['lang']) }}`;
|
server_uptime.innerHTML = `{{ translate('serverStats', 'offline', data['lang']) }}`;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
server_cpu.innerHTML = server.cpu + ` %`;
|
server_cpu.innerHTML = server.cpu + ` %`;
|
||||||
server_mem.innerHTML = server.mem;
|
server_mem.innerHTML = server.mem;
|
||||||
|
|
||||||
if (server.int_ping_results)
|
if (server.int_ping_results) {
|
||||||
{
|
|
||||||
server_players.innerHTML = server.online + `/` + server.max;
|
server_players.innerHTML = server.online + `/` + server.max;
|
||||||
}
|
}
|
||||||
else
|
else {
|
||||||
{
|
|
||||||
server_players.innerHTML = `0/0`;
|
server_players.innerHTML = `0/0`;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (server.version)
|
if (server.version) {
|
||||||
{
|
|
||||||
server_version.innerHTML = server.version;
|
server_version.innerHTML = server.version;
|
||||||
server_input_motd.innerHTML = server.desc;
|
server_input_motd.innerHTML = server.desc;
|
||||||
}
|
}
|
||||||
else
|
else {
|
||||||
{
|
|
||||||
server_version.innerHTML = `{{ translate('serverStats', 'unableToConnect', data['lang']) }}`;
|
server_version.innerHTML = `{{ translate('serverStats', 'unableToConnect', data['lang']) }}`;
|
||||||
server_input_motd.innerHTML = `{{ translate('serverStats', 'unableToConnect', data['lang']) }}`;
|
server_input_motd.innerHTML = `{{ translate('serverStats', 'unableToConnect', data['lang']) }}`;
|
||||||
}
|
}
|
||||||
|
@ -39,12 +39,15 @@
|
|||||||
<noscript>
|
<noscript>
|
||||||
{{ translate('serverFiles', 'noscript', data['lang']) }}
|
{{ translate('serverFiles', 'noscript', data['lang']) }}
|
||||||
</noscript>
|
</noscript>
|
||||||
<div id="files-tree-nav" class="overlay">
|
<div id="files-tree-nav" class="overlay" style="background-color: #9f9daf !important;">
|
||||||
|
|
||||||
<!-- Button to close the overlay navigation -->
|
<!-- Button to close the overlay navigation -->
|
||||||
|
|
||||||
<!-- Overlay content -->
|
<!-- Overlay content -->
|
||||||
<div id="files-tree-nav-content" class="overlay-content">
|
<div id="files-tree-nav-content" class="overlay-content" style="background-color: #9f9daf;">
|
||||||
|
<h4 id="context-title" style="color:#4b00ff; text-align: center; padding: 3px;">
|
||||||
|
</h4>
|
||||||
|
<p style="width: 90%; border-bottom: 2px solid black; margin:0 auto;"></p>
|
||||||
<a onclick="createFileE(event)" href="javascript:void(0)" id="createFile" href="#">{{
|
<a onclick="createFileE(event)" href="javascript:void(0)" id="createFile" href="#">{{
|
||||||
translate('serverFiles', 'createFile', data['lang']) }}</a>
|
translate('serverFiles', 'createFile', data['lang']) }}</a>
|
||||||
<a onclick="createDirE(event)" href="javascript:void(0)" id="createDir" href="#">{{
|
<a onclick="createDirE(event)" href="javascript:void(0)" id="createDir" href="#">{{
|
||||||
@ -72,7 +75,7 @@
|
|||||||
.overlay {
|
.overlay {
|
||||||
display: none;
|
display: none;
|
||||||
flex-direction: column;
|
flex-direction: column;
|
||||||
background-color: #fff;
|
background-color: #9f9daf;
|
||||||
border-radius: 10px;
|
border-radius: 10px;
|
||||||
box-shadow: 0 10px 20px rgb(64 64 64 / 5%);
|
box-shadow: 0 10px 20px rgb(64 64 64 / 5%);
|
||||||
padding: 10px 0;
|
padding: 10px 0;
|
||||||
@ -97,7 +100,7 @@
|
|||||||
.overlay-content {
|
.overlay-content {
|
||||||
display: flex;
|
display: flex;
|
||||||
flex-direction: column;
|
flex-direction: column;
|
||||||
background-color: #fff;
|
background-color: #9f9daf;
|
||||||
border-radius: 10px;
|
border-radius: 10px;
|
||||||
box-shadow: 0 10px 20px rgb(64 64 64 / 5%);
|
box-shadow: 0 10px 20px rgb(64 64 64 / 5%);
|
||||||
padding: 10px 0;
|
padding: 10px 0;
|
||||||
@ -125,7 +128,7 @@
|
|||||||
/* When you mouse over the navigation links, change their color */
|
/* When you mouse over the navigation links, change their color */
|
||||||
.overlay a:hover,
|
.overlay a:hover,
|
||||||
.overlay a:focus {
|
.overlay a:focus {
|
||||||
background: #f1f3f7;
|
background: grey;
|
||||||
color: #4b00ff;
|
color: #4b00ff;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -445,6 +448,9 @@
|
|||||||
e.stopImmediatePropagation();
|
e.stopImmediatePropagation();
|
||||||
var ctxmenuPath = e.target.getAttribute('data-path');
|
var ctxmenuPath = e.target.getAttribute('data-path');
|
||||||
var ctxmenuName = e.target.getAttribute('data-name');
|
var ctxmenuName = e.target.getAttribute('data-name');
|
||||||
|
|
||||||
|
document.getElementById('context-title').innerHTML = ctxmenuName;
|
||||||
|
console.log(ctxmenuName);
|
||||||
if (!ctxmenuPath) {
|
if (!ctxmenuPath) {
|
||||||
console.log({ 'event.target': e.target, ctxmenuPath });
|
console.log({ 'event.target': e.target, ctxmenuPath });
|
||||||
return;
|
return;
|
||||||
@ -926,6 +932,9 @@
|
|||||||
$('#deleteDir').toggle(isDir);
|
$('#deleteDir').toggle(isDir);
|
||||||
$('#upload').toggle(isDir);
|
$('#upload').toggle(isDir);
|
||||||
|
|
||||||
|
document.getElementById('context-title').innerHTML = ctxmenuName;
|
||||||
|
console.log(ctxmenuName);
|
||||||
|
|
||||||
var isFile = event.target.classList.contains('tree-file');
|
var isFile = event.target.classList.contains('tree-file');
|
||||||
$('#deleteFile').toggle(isFile);
|
$('#deleteFile').toggle(isFile);
|
||||||
$('#downloadFile').toggle(isFile);
|
$('#downloadFile').toggle(isFile);
|
||||||
|
42
app/migrations/stats/20220427_init.py
Normal file
42
app/migrations/stats/20220427_init.py
Normal file
@ -0,0 +1,42 @@
|
|||||||
|
import peewee
|
||||||
|
import datetime
|
||||||
|
|
||||||
|
from app.classes.models.servers import Servers
|
||||||
|
|
||||||
|
|
||||||
|
def migrate(migrator, database, **kwargs):
|
||||||
|
db = database
|
||||||
|
|
||||||
|
class ServerStats(peewee.Model):
|
||||||
|
stats_id = peewee.AutoField()
|
||||||
|
created = peewee.DateTimeField(default=datetime.datetime.now)
|
||||||
|
server_id = peewee.ForeignKeyField(Servers, backref="server", index=True)
|
||||||
|
started = peewee.CharField(default="")
|
||||||
|
running = peewee.BooleanField(default=False)
|
||||||
|
cpu = peewee.FloatField(default=0)
|
||||||
|
mem = peewee.FloatField(default=0)
|
||||||
|
mem_percent = peewee.FloatField(default=0)
|
||||||
|
world_name = peewee.CharField(default="")
|
||||||
|
world_size = peewee.CharField(default="")
|
||||||
|
server_port = peewee.IntegerField(default=25565)
|
||||||
|
int_ping_results = peewee.CharField(default="")
|
||||||
|
online = peewee.IntegerField(default=0)
|
||||||
|
max = peewee.IntegerField(default=0)
|
||||||
|
players = peewee.CharField(default="")
|
||||||
|
desc = peewee.CharField(default="Unable to Connect")
|
||||||
|
version = peewee.CharField(default="")
|
||||||
|
updating = peewee.BooleanField(default=False)
|
||||||
|
waiting_start = peewee.BooleanField(default=False)
|
||||||
|
first_run = peewee.BooleanField(default=True)
|
||||||
|
crashed = peewee.BooleanField(default=False)
|
||||||
|
downloading = peewee.BooleanField(default=False)
|
||||||
|
|
||||||
|
class Meta:
|
||||||
|
table_name = "server_stats"
|
||||||
|
database = db
|
||||||
|
|
||||||
|
migrator.create_table(ServerStats)
|
||||||
|
|
||||||
|
|
||||||
|
def rollback(migrator, database, **kwargs):
|
||||||
|
migrator.drop_table("server_stats")
|
532
app/translations/it_IT.json
Normal file
532
app/translations/it_IT.json
Normal file
@ -0,0 +1,532 @@
|
|||||||
|
{
|
||||||
|
"404": {
|
||||||
|
"contact": "Contatta il supporto di Crafty Control tramite Discord",
|
||||||
|
"unableToFind": "Non siamo riusciti a trovare la pagina che cercavi. Per favore prova di nuovo, oppure torna indietro e riprova.",
|
||||||
|
"notFound": "Pagina non trovata"
|
||||||
|
},
|
||||||
|
"accessDenied": {
|
||||||
|
"accessDenied": "Accesso negato",
|
||||||
|
"contact": "Contatta il supporto di Crafty Control tramite Discord",
|
||||||
|
"contactAdmin": "Contatta l'amministratore del tuo server per l'accesso a questa risorsa, o se pensi tu debba aver accesso a questa risorsa, contatta il supporto tecnico.",
|
||||||
|
"noAccess": "Non hai accesso a questa risorsa"
|
||||||
|
},
|
||||||
|
"apiKeys": {
|
||||||
|
"apiKeys": "Chiavi API",
|
||||||
|
"auth": "Autorizzato? ",
|
||||||
|
"buttons": "Pulsanti",
|
||||||
|
"config": "Configura",
|
||||||
|
"crafty": "Crafty: ",
|
||||||
|
"created": "Creato",
|
||||||
|
"createNew": "Crea un nuovo Token API",
|
||||||
|
"deleteKeyConfirmation": "Vuoi cancellare questa chiave API? Non puoi tornare indietro.",
|
||||||
|
"deleteKeyConfirmationTitle": "Rimuovere la chiave API ${keyId}?",
|
||||||
|
"getToken": "Prendi un Token",
|
||||||
|
"name": "Nome",
|
||||||
|
"nameDesc": "Come desideri chiamare questo Token API? ",
|
||||||
|
"no": "No",
|
||||||
|
"pageTitle": "Modifica le chiavi API degli utenti",
|
||||||
|
"permName": "Nome Permesso",
|
||||||
|
"perms": "Permessi",
|
||||||
|
"server": "Server: ",
|
||||||
|
"superUser": "Super User",
|
||||||
|
"yes": "Sì"
|
||||||
|
},
|
||||||
|
"base": {
|
||||||
|
"doesNotWorkWithoutJavascript": "<strong>Avviso: </strong>Crafty non funziona a dovere se JavaScript è disabilitato!"
|
||||||
|
},
|
||||||
|
"credits": {
|
||||||
|
"developmentTeam": "Squadra di Svuluppo",
|
||||||
|
"hugeDesc": "Un enorme",
|
||||||
|
"pageDescription": "Senza queste persone, non avremmo Crafty",
|
||||||
|
"pageTitle": "Crediti",
|
||||||
|
"patreonDesc": "ai nostri supporter di Patreon!",
|
||||||
|
"patreonLevel": "Livello",
|
||||||
|
"patreonName": "Nome",
|
||||||
|
"patreonOther": "Altro",
|
||||||
|
"patreonSupporter": "Supporter Patreon",
|
||||||
|
"patreonUpdate": "Ultimo aggiornamento:",
|
||||||
|
"retiredStaff": "Staff ritirato",
|
||||||
|
"supportTeam": "Squadra di supporto e documentazione",
|
||||||
|
"thankYou": "GRAZIE",
|
||||||
|
"translationDesc": "alla nostra community di traduttori!",
|
||||||
|
"translationName": "Nome",
|
||||||
|
"translationTitle": "Traduttore in lingua",
|
||||||
|
"translator": "Traduttori"
|
||||||
|
},
|
||||||
|
"dashboard": {
|
||||||
|
"dashboard": "Pannello di Controllo",
|
||||||
|
"memUsage": "Utilizzo della memoria",
|
||||||
|
"cpuUsage": "Utilizzo del Processore",
|
||||||
|
"host": "Host",
|
||||||
|
"players": "Giocatori",
|
||||||
|
"backups": "Backups",
|
||||||
|
"newServer": "Crea un Nuovo Server",
|
||||||
|
"allServers": "Tutti i Server",
|
||||||
|
"server": "Server",
|
||||||
|
"actions": "Azioni",
|
||||||
|
"size": "Dimensioni della Cartella del Server",
|
||||||
|
"motd": "MOTD",
|
||||||
|
"version": "Versione",
|
||||||
|
"status": "Stato",
|
||||||
|
"online": "Online",
|
||||||
|
"offline": "Offline",
|
||||||
|
"lastBackup": "Ultimo:",
|
||||||
|
"nextBackup": "Prossimo:",
|
||||||
|
"servers": "Servers",
|
||||||
|
"cannotSeeOnMobile": "Non vedi nulla da mobile?",
|
||||||
|
"cannotSee": "Non vedi qualcosa?",
|
||||||
|
"cannotSeeOnMobile2": "Prova a scorrere la tabella orizzontalmente.",
|
||||||
|
"max": "Massimo",
|
||||||
|
"avg": "Media",
|
||||||
|
"bePatientStart": "Per favore sii paziente mentre avviamo il server.<br /> Questa schermata si aggiornerà a breveThis screen will refresh in a moment",
|
||||||
|
"bePatientStop": "Per favore sii paziente while we stop the server.<br /> Questa schermata si aggiornerà a breve",
|
||||||
|
"bePatientRestart": "Per favore sii paziente mentre riavviamo il server.<br /> Questa schermata si aggiornerà a breve",
|
||||||
|
"bePatientClone": "Per favore sii paziente mentre cloniamo il server.<br /> Questa schermata si aggiornerà a breve",
|
||||||
|
"sendingCommand": "Invio il tuo comando",
|
||||||
|
"cpuCurFreq": "Velocità attuale CPU",
|
||||||
|
"cpuMaxFreq": "Velocità massima CPU",
|
||||||
|
"cpuCores": "CPU Cores",
|
||||||
|
"start": "Start",
|
||||||
|
"stop": "Stop",
|
||||||
|
"clone": "Clona",
|
||||||
|
"kill": "Termina il Processo",
|
||||||
|
"restart": "Riavvia",
|
||||||
|
"killing": "Terminando il processo...",
|
||||||
|
"starting": "Avvio ritardato",
|
||||||
|
"delay-explained": "Il servizio/agente è stato avviato di recente e sta ritardando l'avvio del server di Minecraft",
|
||||||
|
"no-servers": "Attualmente non ci sono server. Per cominciare, cliccalick",
|
||||||
|
"welcome": "Benvenuto su Crafty Controller",
|
||||||
|
"crashed": "Crashato"
|
||||||
|
},
|
||||||
|
"datatables": {
|
||||||
|
"i18n": {
|
||||||
|
"decimal": "",
|
||||||
|
"emptyTable": "Nessun dato disponibile nella tabella",
|
||||||
|
"info": "Mostro da _START_ a _END_ di _TOTAL_ record",
|
||||||
|
"infoEmpty": "Mostro da 0 a 0 di 0 record",
|
||||||
|
"infoFiltered": "(filtrato da _MAX_ record totali)",
|
||||||
|
"infoPostFix": "",
|
||||||
|
"thousands": ",",
|
||||||
|
"lengthMenu": "Mostra _MENU_ record",
|
||||||
|
"loadingRecords": "Carico...",
|
||||||
|
"processing": "Calcolo...",
|
||||||
|
"search": "Cerca:",
|
||||||
|
"zeroRecords": "Nessun record corrispondente trovato",
|
||||||
|
"paginate": {
|
||||||
|
"first": "Prima",
|
||||||
|
"last": "Ultima",
|
||||||
|
"next": "Prossima",
|
||||||
|
"previous": "Precedente"
|
||||||
|
},
|
||||||
|
"aria": {
|
||||||
|
"sortAscending": ": attiva per ordinare le colonne in modo ascendente",
|
||||||
|
"sortDescending": ": attiva per ordinare le colonne in modo discendente"
|
||||||
|
},
|
||||||
|
"buttons": {
|
||||||
|
"collection": "Collection <span class='ui-button-icon-primary ui-icon ui-icon-triangle-1-s'\/>",
|
||||||
|
"colvis": "Visibilità colonne",
|
||||||
|
"colvisRestore": "Ripristina visibilità",
|
||||||
|
"copy": "Copy",
|
||||||
|
"copyKeys": "Premi ctrl or u2318 + C per copiare i dati della tabella negli appunti di sistema.<br><br>Per cancellare, clicca questo messaggio o premi esc.",
|
||||||
|
"copySuccess": {
|
||||||
|
"1": "Copiata 1 riga negli appunti",
|
||||||
|
"_": "Copiate %d righe negli appunti"
|
||||||
|
},
|
||||||
|
"copyTitle": "Copia negli appunti di sistema",
|
||||||
|
"csv": "CSV",
|
||||||
|
"excel": "Excel",
|
||||||
|
"pageLength": {
|
||||||
|
"-1": "Mostra tutte le righe",
|
||||||
|
"1": "Mostra 1 riga",
|
||||||
|
"_": "Mostra %d righe"
|
||||||
|
},
|
||||||
|
"pdf": "PDF",
|
||||||
|
"print": "Stampa"
|
||||||
|
},
|
||||||
|
"select": {
|
||||||
|
"rows": {
|
||||||
|
"0": "Clicca su una riga per selezionarla",
|
||||||
|
"1": "%d riga selezionata",
|
||||||
|
"_": "%d righe selezionate"
|
||||||
|
},
|
||||||
|
"cells": {
|
||||||
|
"0": "Clicca su una cella per selezionarla",
|
||||||
|
"1": "%d cella selezionata",
|
||||||
|
"_": "%d celle selezionate"
|
||||||
|
},
|
||||||
|
"columns": {
|
||||||
|
"0": "Clicca su una colonna per selezionarla",
|
||||||
|
"1": "%d colonna selezionata",
|
||||||
|
"_": "%d colonne selezionate"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"error": {
|
||||||
|
"contact": "Contact Crafty Control Support via Discord",
|
||||||
|
"embarassing": "Oh my, well, this is embarrassing.",
|
||||||
|
"error": "Error!",
|
||||||
|
"eulaAgree": "Do you agree?",
|
||||||
|
"eulaMsg": "You must agree to the EULA. A copy of the Mojang EULA is linked under this message.",
|
||||||
|
"eulaTitle": "Agree To EULA",
|
||||||
|
"hereIsTheError": "Here is the error",
|
||||||
|
"internet": "We have detected the machine running Crafty has no connection to the internet. Client connections to the server may be limited.",
|
||||||
|
"no-file": "We can't seem to locate the requested file. Double check the path. Does Crafty have proper permissions?",
|
||||||
|
"noJava": "Server {} failed to start with error code: We have detected Java is not installed. Please install java then start the server.",
|
||||||
|
"not-downloaded": "We can't seem to find your executable file. Has it finished downloading? Are the permissions set to executable?",
|
||||||
|
"portReminder": "We have detected this is the first time {} has been run. Make sure to forward port {} through your router/firewall to make this remotely accessible from the internet.",
|
||||||
|
"start-error": "Server {} failed to start with error code: {}",
|
||||||
|
"terribleFailure": "What a Terrible Failure!"
|
||||||
|
},
|
||||||
|
"footer": {
|
||||||
|
"allRightsReserved": "Tutti i diritti Riservati",
|
||||||
|
"copyright": "Copyright",
|
||||||
|
"version": "Versione"
|
||||||
|
},
|
||||||
|
"login": {
|
||||||
|
"forgotPassword": "Password dimenticata",
|
||||||
|
"login": "Accedi",
|
||||||
|
"password": "Password",
|
||||||
|
"username": "Nome utente"
|
||||||
|
},
|
||||||
|
"notify": {
|
||||||
|
"activityLog": "Registri di Attività",
|
||||||
|
"backupComplete": "Il Backup per il server {} è stato completato correttamente",
|
||||||
|
"backupStarted": "Il Backup per il server {} è cominciato",
|
||||||
|
"downloadLogs": "Scaricare i registri di Supporto?",
|
||||||
|
"finishedPreparing": "Abbiamo finito di preparare i tuoi registri di supporto.Per favore clicca Scarica per scaricarli",
|
||||||
|
"logout": "Disconnessione",
|
||||||
|
"preparingLogs": "Per favore aspetta mentre prepariamo i tuoi registri... Ti invieremo una notifica quando saranno pronti. Potrebbe volerci un po' per installazioni grosse.",
|
||||||
|
"supportLogs": "Registri di supporto"
|
||||||
|
},
|
||||||
|
"panelConfig": {
|
||||||
|
"adminControls": "Controllo admin",
|
||||||
|
"allowedServers": "Server permessi",
|
||||||
|
"assignedRoles": "Ruoli assegnati",
|
||||||
|
"cancel": "Cancella",
|
||||||
|
"clearComms": "Pulisci i comandi non eseguiti",
|
||||||
|
"delete": "Elimina",
|
||||||
|
"edit": "Modifica",
|
||||||
|
"enabled": "Abilitato",
|
||||||
|
"newRole": "Aggiungi nuovo ruolo",
|
||||||
|
"newUser": "Aggiungi nuovo utente",
|
||||||
|
"pageTitle": "Configurazioni del pannello",
|
||||||
|
"role": "Ruolo",
|
||||||
|
"roles": "Ruoli",
|
||||||
|
"roleUsers": "Utenti del ruolo",
|
||||||
|
"save": "Salva",
|
||||||
|
"superConfirm": "Procedi solo se vuoi che questo utente abbia accesso a TUTTO (tutti gli utenti, server, impostazioni del pannello, ecc...). Può anche revocare i tuoi poteri da superuser.",
|
||||||
|
"superConfirmTitle": "Abilitare lo superuser? Sei sicuro?",
|
||||||
|
"user": "Utente",
|
||||||
|
"users": "Utenti"
|
||||||
|
},
|
||||||
|
"rolesConfig": {
|
||||||
|
"config": "Configura ruolo",
|
||||||
|
"configDesc": "Qui è dove puoi modificare la configurazione del ruolo",
|
||||||
|
"configUpdate": "Ultimo aggiornamento: ",
|
||||||
|
"created": "Creato il: ",
|
||||||
|
"delRole": "Elimina ruolo",
|
||||||
|
"doesNotExist": "Non puoi eliminare qualcosa che ancora non esiste",
|
||||||
|
"pageTitle": "Modifica ruolo",
|
||||||
|
"pageTitleNew": "Nuovo ruolo",
|
||||||
|
"permAccess": "Abilitato?",
|
||||||
|
"permName": "Nome permesso",
|
||||||
|
"permsServer": "Permessi che questo ruolo ha per questi specifici server",
|
||||||
|
"roleConfigArea": "Area di configurazione del ruolo",
|
||||||
|
"roleDesc": "Come vorresti chiamare questo ruolo?",
|
||||||
|
"roleName": "Nome del ruolo: ",
|
||||||
|
"rolePerms": "Permessi del ruolo",
|
||||||
|
"roleServers": "Server abilitati",
|
||||||
|
"roleTitle": "Impostazioni del ruolo",
|
||||||
|
"roleUserName": "Nome Utente",
|
||||||
|
"roleUsers": "Utenti con il ruolo: ",
|
||||||
|
"serverAccess": "Abilitato?",
|
||||||
|
"serverName": "Nome del Server",
|
||||||
|
"serversDesc": "Server a cui questo ruolo è consentito l'accesso"
|
||||||
|
},
|
||||||
|
"serverBackups": {
|
||||||
|
"backupAtMidnight": "Auto-backup a mezzanotte?",
|
||||||
|
"backupNow": "Effettua il Backup Ora!",
|
||||||
|
"backupTask": "Un'azione di backup è cominciata.",
|
||||||
|
"cancel": "Cancella",
|
||||||
|
"clickExclude": "Clicca per selezionare le esclusioni",
|
||||||
|
"compress": "Comprimi backup",
|
||||||
|
"confirm": "Conferma",
|
||||||
|
"confirmDelete": "Vuoi eliminare questo backup? Non puoi tornare indietro.",
|
||||||
|
"confirmRestore": "Sei sicuro di voler ripristinare qeusto backup? Tutti i file correnti verranno sovrascritti allo stato di backup e saranno irrecuperabili.",
|
||||||
|
"currentBackups": "Backup attuali",
|
||||||
|
"delete": "Elimina",
|
||||||
|
"destroyBackup": "Distruggere il backup \" + file_to_del + \"?",
|
||||||
|
"download": "Scarica",
|
||||||
|
"excludedBackups": "Percorsi esclusi: ",
|
||||||
|
"excludedChoose": "Scegli i percorsi che desideri escludere dai tuoi backups",
|
||||||
|
"exclusionsTitle": "Fai un backup delle esclusioni",
|
||||||
|
"maxBackups": "Backup massimi",
|
||||||
|
"maxBackupsDesc": "Crafty non memorizzerà più di N backup, cancellando quelli più vecchi (inserisci 0 per mantenerli tutti)",
|
||||||
|
"options": "Opzioni",
|
||||||
|
"path": "Percorso",
|
||||||
|
"restore": "Ripristina",
|
||||||
|
"restoring": "Ripristinando il backup. Potrebber volerci un momento. Per favore sii paziente.",
|
||||||
|
"save": "Salva",
|
||||||
|
"size": "Dimensioni",
|
||||||
|
"storageLocation": "Percorso di memorizzazione",
|
||||||
|
"storageLocationDesc": "Dove vuoi memorizzare i backup?"
|
||||||
|
},
|
||||||
|
"serverConfig": {
|
||||||
|
"bePatientDelete": "Per favore sii paziente mentre rimuoviamo il tuo server dal pannello di Crafty. Questa schermata si chiuderà in pochi istanti.",
|
||||||
|
"bePatientDeleteFiles": "Per favore sii paziente mentre rimuoviamo il tuo server dal pannello di Crafty e cancelliamo tutti i files. Questa schermata si chiuderà in pochi istanti.",
|
||||||
|
"bePatientUpdate": "Per favore sii paziente mentre aggiorniamo il server. I tempi di download possono variare dalla tua velocità di internet.<br /> Questa schermata si aggiornerà a breve",
|
||||||
|
"cancel": "Cancella",
|
||||||
|
"crashTime": "Crash Timeout",
|
||||||
|
"crashTimeDesc": "Quanto dobbiamo aspettare per considerare il tuo server crashato per colpa di un timeout?",
|
||||||
|
"deleteFilesQuestion": "Eliminare i file del server dalla macchina?",
|
||||||
|
"deleteFilesQuestionMessage": "Vuoi che crafty cancelli tutti i file del server dalla macchina? <br><br><strong>Questo include i backup del server.</strong>",
|
||||||
|
"deleteServer": "Eliminare il server",
|
||||||
|
"deleteServerQuestion": "Eliminare il server?",
|
||||||
|
"deleteServerQuestionMessage": "Sei sicuro di voler eliminare questo server? Dopo la conferma non puoi tornare indietro...",
|
||||||
|
"exeUpdateURL": "URL di aggiornamento dell'eseguibile del server",
|
||||||
|
"exeUpdateURLDesc": "URL di download diretto per gli aggiornamenti del server.",
|
||||||
|
"noDelete": "No, torna indietro",
|
||||||
|
"noDeleteFiles": "No, eliminalo dal pannello di controllo e basta",
|
||||||
|
"removeOldLogsAfter": "Rimuovi i registri vecchi dopo",
|
||||||
|
"removeOldLogsAfterDesc": "Di quanti giorni dovrà essere vecchio un registro per essere cancellato (inserendo 0 non verranno cancellati)",
|
||||||
|
"save": "Salva",
|
||||||
|
"sendingDelete": "Elimino il server",
|
||||||
|
"sendingRequest": "Invio la tua richiesta...",
|
||||||
|
"serverAutoStart": "Avvio automatico del server",
|
||||||
|
"serverAutostartDelay": "Ritardo d'avvio automatico",
|
||||||
|
"serverAutostartDelayDesc": "Ritardo in secondi per l'avvio automatico (se abilitato qui sotto)",
|
||||||
|
"serverCrashDetection": "Rilevamento dei crash del Server",
|
||||||
|
"serverExecutable": "Eseguibile del server",
|
||||||
|
"serverExecutableDesc": "il file Eseguibile del server",
|
||||||
|
"serverExecutionCommand": "Comando d'esecuzione del server",
|
||||||
|
"serverExecutionCommandDesc": "Quello che verrà lanciato in un terminale nascosto",
|
||||||
|
"serverIP": "IP del server",
|
||||||
|
"serverIPDesc": "L'IP a cui Crafty si dovrà collegare per le statistiche (Prova un IP reale se 127.0.0.1 causa problemi)",
|
||||||
|
"serverLogLocation": "Percorso dei Registri",
|
||||||
|
"serverLogLocationDesc": "Percorso assoluto dei file di Registro",
|
||||||
|
"serverName": "Nome del Server",
|
||||||
|
"serverNameDesc": "Come desideri chiamare questo Server",
|
||||||
|
"serverPath": "Cartella operativa del server",
|
||||||
|
"serverPathDesc": "Percorso assoluto completo (non includere l'eseguibile)",
|
||||||
|
"serverPort": "Porta del server",
|
||||||
|
"serverPortDesc": "La Porta a cui Crafty si dovrà collegare per le statistiche",
|
||||||
|
"serverStopCommand": "Comando d'arresto del server",
|
||||||
|
"serverStopCommandDesc": "Comando inviato al server per l'arresto",
|
||||||
|
"stopBeforeDeleting": "Per favore arresta il server prima di eliminarlo",
|
||||||
|
"update": "Aggiorna l'eseguibile",
|
||||||
|
"yesDelete": "Sì, elimina",
|
||||||
|
"yesDeleteFiles": "Sì, elimina i files"
|
||||||
|
},
|
||||||
|
"serverConfigHelp": {
|
||||||
|
"desc": "Qui è dove puoi cambiare la configurazione del tuo server",
|
||||||
|
"perms": [
|
||||||
|
"Raccomandiamo di <code>NON</code> cambiare il percorso di un server gestito da Crafty.",
|
||||||
|
"Modificare il percorso <code>POTREBBE</code> rompere cose, specialmente su sistemi operativi Linux, dove i permessi dei file sono più stringenti.",
|
||||||
|
"<br /><br/>",
|
||||||
|
"Se senti di dover cambiare la posizione di un server, puoi farlo, ma dovrai dare all'utente \"crafty\" i permessi di leggere e scrivere nel nuovo percorso.",
|
||||||
|
"<br />",
|
||||||
|
"<br />",
|
||||||
|
"Su Linux puoi farlo con questi comandi:<br />",
|
||||||
|
"<code>",
|
||||||
|
" sudo chown crafty:crafty /path/to/your/server -R<br />",
|
||||||
|
" sudo chmod 2775 /path/to/your/server -R<br />",
|
||||||
|
"</code>"
|
||||||
|
],
|
||||||
|
"title": "Area di configurazione del server"
|
||||||
|
},
|
||||||
|
"serverDetails": {
|
||||||
|
"backup": "Backup",
|
||||||
|
"config": "Configura",
|
||||||
|
"files": "Files",
|
||||||
|
"logs": "Registri",
|
||||||
|
"playerControls": "Gestisci i giocatori",
|
||||||
|
"schedule": "Programma",
|
||||||
|
"serverDetails": "Dettagli del Server",
|
||||||
|
"terminal": "Terminale"
|
||||||
|
},
|
||||||
|
"serverFiles": {
|
||||||
|
"clickUpload": "Clicca qui per selezionare i file",
|
||||||
|
"close": "Chiudi",
|
||||||
|
"createDir": "Crea Cartella",
|
||||||
|
"createDirQuestion": "Che nome vuoi dare alla nuova cartella?",
|
||||||
|
"createFile": "Crea file",
|
||||||
|
"createFileQuestion": "Che nome vuoi dare al nuovo file?",
|
||||||
|
"default": "Default",
|
||||||
|
"delete": "Elimina",
|
||||||
|
"deleteItemQuestion": "Sei sicuro di voler eliminare \" + name + \"?",
|
||||||
|
"deleteItemQuestionMessage": "Stai eliminando \\\"\" + path + \"\\\"!<br/><br/>Questa azione è irreversible e sarà perso per sempre!",
|
||||||
|
"download": "Scarica",
|
||||||
|
"editingFile": "Modificando i files",
|
||||||
|
"error": "Si è verificato un errore nel recuperare i files",
|
||||||
|
"fileReadError": "Errore nella lettura del file",
|
||||||
|
"files": "Files",
|
||||||
|
"keybindings": "Scorciatoie da tastiera",
|
||||||
|
"loadingRecords": "Caricando i files...",
|
||||||
|
"noDelete": "No",
|
||||||
|
"noscript": "Il gestore file non funziona senza JavaScript",
|
||||||
|
"rename": "Rinomina",
|
||||||
|
"renameItemQuestion": "Quale sarà il nuovo nome?",
|
||||||
|
"save": "Salva",
|
||||||
|
"stayHere": "NON ABBANDONARE QUESTA PAGINA!",
|
||||||
|
"unsupportedLanguage": "Avviso: Questo non è un tipo di file supportato",
|
||||||
|
"unzip": "Scompatta",
|
||||||
|
"upload": "Carica",
|
||||||
|
"uploadTitle": "Carica i Files su: ",
|
||||||
|
"waitUpload": "Per favore aspetta mentre carichiamo i tuoi files... Potrebbe volerci un momento.",
|
||||||
|
"yesDelete": "Sì, conosco le conseguenze"
|
||||||
|
},
|
||||||
|
"serverPlayerManagement": {
|
||||||
|
"bannedPlayers": "Giocatori Banditi",
|
||||||
|
"loadingBannedPlayers": "Carico i giocatori banditi",
|
||||||
|
"players": "Giocatori"
|
||||||
|
},
|
||||||
|
"serverScheduleConfig": {
|
||||||
|
"backup": "Fai un Backup del Server",
|
||||||
|
"basic": "Basic",
|
||||||
|
"children": "Azioni figlie legate a questa: ",
|
||||||
|
"command": "Comando",
|
||||||
|
"command-explain": "Quale comando vuoi che eseguiamo? Non includere la '/'",
|
||||||
|
"cron": "Cron",
|
||||||
|
"cron-explain": "Inserisci la stringa CRON",
|
||||||
|
"custom": "Comando personalizzato",
|
||||||
|
"days": "Giorni",
|
||||||
|
"enabled": "Abilitata",
|
||||||
|
"hours": "Ore",
|
||||||
|
"interval": "Intervallo",
|
||||||
|
"interval-explain": "Ogni quanto vuoi che questa azione venga eseguita?",
|
||||||
|
"minutes": "Minuti",
|
||||||
|
"offset": "Offset di ritardo",
|
||||||
|
"offset-explain": "Quanto dobbiamo aspettare prima di eseguire questo dopo aver eseguito la prima azione? (Secondi)",
|
||||||
|
"one-time": "Elimina dopo l'esecuzione",
|
||||||
|
"parent": "Seleziona un'azione programmata padre",
|
||||||
|
"parent-explain": "Quale azione dovrebbe far eseguire questa?",
|
||||||
|
"reaction": "Reazione",
|
||||||
|
"restart": "Riavvia il Server",
|
||||||
|
"start": "Avvia il server",
|
||||||
|
"stop": "Arresta il Server",
|
||||||
|
"time": "Orario",
|
||||||
|
"time-explain": "A che ora vuoi eseguire la tua azione programmata?"
|
||||||
|
},
|
||||||
|
"serverSchedules": {
|
||||||
|
"areYouSure": "Eliminare l'azione programmata?",
|
||||||
|
"cancel": "Cancella",
|
||||||
|
"cannotSee": "Non vedi tutto?",
|
||||||
|
"cannotSeeOnMobile": "Prova a cliccare su un'azione programmata per tutti i dettagli.",
|
||||||
|
"confirm": "Conferma",
|
||||||
|
"confirmDelete": "Vuoi eliminare l'azione programmata? Non puoi tornare indietro."
|
||||||
|
},
|
||||||
|
"serverStats": {
|
||||||
|
"cpuUsage": "Utilizzo del Processore",
|
||||||
|
"description": "Descrizione",
|
||||||
|
"errorCalculatingUptime": "Errore nel calcolo dei tempi di operazione",
|
||||||
|
"memUsage": "Utilizzo della memoria",
|
||||||
|
"offline": "Offline",
|
||||||
|
"online": "Online",
|
||||||
|
"players": "Giocatori",
|
||||||
|
"serverStarted": "Server Avviato",
|
||||||
|
"serverStatus": "Stato del Server",
|
||||||
|
"serverTime": "UTC Time",
|
||||||
|
"serverTimeZone": "Timezone del Server",
|
||||||
|
"serverUptime": "Tempo di operazione del Server",
|
||||||
|
"starting": "Avvio ritardato",
|
||||||
|
"unableToConnect": "Impossibile connettersi",
|
||||||
|
"version": "Versione"
|
||||||
|
},
|
||||||
|
"serverTerm": {
|
||||||
|
"commandInput": "Inserisci il comando",
|
||||||
|
"delay-explained": "Il servizio/agente è stato avviato di recente e sta ritardando l'avvio del server di Minecraft",
|
||||||
|
"downloading": "Scaricando...",
|
||||||
|
"restart": "Riavvia",
|
||||||
|
"sendCommand": "Invia il comando",
|
||||||
|
"start": "Avvia",
|
||||||
|
"starting": "Avvio ritardato",
|
||||||
|
"stop": "Ferma",
|
||||||
|
"stopScroll": "Ferma lo scorrimento automatico",
|
||||||
|
"updating": "Aggiornando..."
|
||||||
|
},
|
||||||
|
"serverWizard": {
|
||||||
|
"absoluteServerPath": "Percorso Assoluto al tuo Server",
|
||||||
|
"absoluteZipPath": "Percorso Assoluto del Server",
|
||||||
|
"addRole": "Aggiungi il Server a Ruoli Esistenti",
|
||||||
|
"autoCreate": "Se non sono selezionati, Crafty ne creerà per te!",
|
||||||
|
"bePatient": "Per favore attendi mentre ' + (importing ? 'importiamo' : 'scarichiamo') + ' il Server",
|
||||||
|
"buildServer": "Compila il Server!",
|
||||||
|
"clickRoot": "Clicca qui per selezionare la Directory Radice",
|
||||||
|
"close": "Chiudi",
|
||||||
|
"defaultPort": "25565 default",
|
||||||
|
"downloading": "Scaricando il Server...",
|
||||||
|
"explainRoot": "Per favore clicca il pulsante qui sotto per selezionare la cartella radice del server all'interno dell'archivio",
|
||||||
|
"importing": "Importando il Server...",
|
||||||
|
"importServer": "Importa un Server Esistente",
|
||||||
|
"importServerButton": "Importa Server!",
|
||||||
|
"importZip": "Importa da un File Zip",
|
||||||
|
"maxMem": "Memoria Massima",
|
||||||
|
"minMem": "Memoria minima",
|
||||||
|
"myNewServer": "Il mio nuovo Server",
|
||||||
|
"newServer": "Crea un Nuovo Server",
|
||||||
|
"quickSettings": "Impostazioni Rapide",
|
||||||
|
"quickSettingsDescription": "Non ti preoccupare, puoi cambiarle più tardi",
|
||||||
|
"resetForm": "Reset Form",
|
||||||
|
"save": "Salva",
|
||||||
|
"selectRole": "Seleziona i Ruoli",
|
||||||
|
"selectRoot": "Seleziona la directory radice dell'archivio",
|
||||||
|
"selectType": "Seleziona un Tipo",
|
||||||
|
"selectVersion": "Seleziona una versione",
|
||||||
|
"selectZipDir": "Seleziona il percorso in memoria in cui scompatteremo i file",
|
||||||
|
"serverJar": "File eseguibile del Server",
|
||||||
|
"serverName": "Nome Server",
|
||||||
|
"serverPath": "Percorso del Server",
|
||||||
|
"serverPort": "Porta del Server",
|
||||||
|
"serverType": "Tipo di Server",
|
||||||
|
"serverVersion": "Versione del Server",
|
||||||
|
"sizeInGB": "Dimensione in GB",
|
||||||
|
"zipPath": "Percorso del Server"
|
||||||
|
},
|
||||||
|
"sidebar": {
|
||||||
|
"contribute": "Contribuisci",
|
||||||
|
"credits": "Crediti",
|
||||||
|
"dashboard": "Pannello di controllo",
|
||||||
|
"documentation": "Documentazione",
|
||||||
|
"navigation": "Navigazione",
|
||||||
|
"newServer": "Crea un Nuovo Server",
|
||||||
|
"servers": "Servers"
|
||||||
|
},
|
||||||
|
"userConfig": {
|
||||||
|
"apiKey": "Chiavi API",
|
||||||
|
"auth": "Autorizzato? ",
|
||||||
|
"config": "Configura",
|
||||||
|
"configArea": "Area di configurazione utente",
|
||||||
|
"configAreaDesc": "Qui è dove modifichi tutte le impostazioni utente",
|
||||||
|
"confirmDelete": "Sei sicuro di voler eliminare qeusto utente? Quest'azione è irreversibile.",
|
||||||
|
"craftyPermDesc": "I permessi Crafty che questo utente possiede ",
|
||||||
|
"craftyPerms": "Permessi di Crafty: ",
|
||||||
|
"created": "Creato il: ",
|
||||||
|
"deleteUser": "Elimina Utente: ",
|
||||||
|
"deleteUserB": "Elimina Utente",
|
||||||
|
"delSuper": "Non puoi eliminare uno superuser",
|
||||||
|
"enabled": "Abilitato",
|
||||||
|
"gravDesc": "Questa email è solamente per l'uso di Gravatar™. Crafty non userà l'email in alcuna circostanza, se non per associare il Gravatar™",
|
||||||
|
"gravEmail": "Gravatar™ Email",
|
||||||
|
"lastIP": "Ultimo indirizzo IP: ",
|
||||||
|
"lastLogin": "Ultimo accesso: ",
|
||||||
|
"lastUpdate": "Ultimo aggiornamento: ",
|
||||||
|
"leaveBlank": "Per modificare l'utente senza cambiare la passowrd, lascia il campo in bianco.",
|
||||||
|
"member": "È membro?",
|
||||||
|
"notExist": "Non puoi eliminare qualcosa che non esiste!",
|
||||||
|
"pageTitle": "Modifica Utente",
|
||||||
|
"pageTitleNew": "Crea Utente",
|
||||||
|
"password": "Password",
|
||||||
|
"permName": "Nome del Permesso",
|
||||||
|
"repeat": "Ripeti la Password",
|
||||||
|
"roleName": "Nome del ruolo",
|
||||||
|
"super": "Super User",
|
||||||
|
"userLang": "Linguaggio dell'utente",
|
||||||
|
"userName": "Nome utente",
|
||||||
|
"userNameDesc": "Come vuoi chiamare questo utente?",
|
||||||
|
"userRoles": "Ruoli dell'utente",
|
||||||
|
"userRolesDesc": "Ruoli di cui l'utente fa parte.",
|
||||||
|
"userSettings": "Impostazioni Utente",
|
||||||
|
"uses": "Numero di usi permessi (-1==Nessun limite)"
|
||||||
|
}
|
||||||
|
}
|
@ -1,347 +0,0 @@
|
|||||||
{
|
|
||||||
"404": {
|
|
||||||
"contact": "Contatta l'assistenza di Crafty Controller su Discord!",
|
|
||||||
"notFound": "Pagina non trovata",
|
|
||||||
"unableToFind": "We were unable to find the page you are looking for. Please try again, or go back and refresh."
|
|
||||||
},
|
|
||||||
"accessDenied": {
|
|
||||||
"accessDenied": "Accesso negato",
|
|
||||||
"contact": "Contatta il supporto di Crafty Control tramite Discord",
|
|
||||||
"contactAdmin": "Contatta l'amministratore del tuo server per accedere a questa risorsa, o, se pensi tu debba avere accesso a tale risorsa, contatta il supporto.",
|
|
||||||
"noAccess": "Non hai accesso a questa risorsa"
|
|
||||||
},
|
|
||||||
"base": {
|
|
||||||
"doesNotWorkWithoutJavascript": "<strong>Warning: </strong>Crafty doesn't work properly when JavaScript isn't enabled!"
|
|
||||||
},
|
|
||||||
"dashboard": {
|
|
||||||
"actions": "Azioni",
|
|
||||||
"allServers": "Tutti i Servers",
|
|
||||||
"avg": "Media",
|
|
||||||
"backups": "Backups",
|
|
||||||
"bePatientClone": "Per favore sii paziente mentre cloniamo il server.<br /> Questa schermata si aggiornerà in un momento",
|
|
||||||
"bePatientRestart": "Per favore sii paziente mentre riavviamo il server.<br /> Questa schermata si aggiornerà in un momento",
|
|
||||||
"bePatientStart": "Per favore sii paziente mentre accendiamo il server.<br /> Questa schermata si aggiornerà in un momento",
|
|
||||||
"bePatientStop": "Per favore sii paziente mentre spegniamo il server.<br /> Questa schermata si aggiornerà in un momento",
|
|
||||||
"cannotSee": "Non vedi nulla?",
|
|
||||||
"cannotSeeOnMobile": "Non vedi nulla da mobile?",
|
|
||||||
"cannotSeeOnMobile2": "Prova a scorrere sulla tabella lateralmente.",
|
|
||||||
"clone": "Clona",
|
|
||||||
"cpuCores": "Core della CPU",
|
|
||||||
"cpuCurFreq": "Frequenza Attuale della CPU",
|
|
||||||
"cpuMaxFreq": "Frequenza Massima della CPU",
|
|
||||||
"cpuUsage": "Uso della CPU",
|
|
||||||
"dashboard": "Dashboard",
|
|
||||||
"delay-explained": "Il servizio è partito di recente e sta ritardando l'avvio dell'istanza del Server di Minecraft",
|
|
||||||
"host": "Host",
|
|
||||||
"kill": "Termina il processo",
|
|
||||||
"killing": "Terminando il processo...",
|
|
||||||
"lastBackup": "Ultimo:",
|
|
||||||
"max": "Massimo",
|
|
||||||
"memUsage": "Uso della Memoria",
|
|
||||||
"motd": "Slogan",
|
|
||||||
"newServer": "Crea un nuovo Server",
|
|
||||||
"nextBackup": "Prossimo:",
|
|
||||||
"no-servers": "Attualmente non ci sono server. Per cominciare, clicca",
|
|
||||||
"offline": "Offline",
|
|
||||||
"online": "Online",
|
|
||||||
"players": "Giocatori",
|
|
||||||
"restart": "Riavvia",
|
|
||||||
"sendingCommand": "Inviando il tuo comando",
|
|
||||||
"server": "Server",
|
|
||||||
"servers": "Server",
|
|
||||||
"start": "Avvia",
|
|
||||||
"starting": "Avvio ritardato",
|
|
||||||
"status": "Stato",
|
|
||||||
"stop": "Ferma",
|
|
||||||
"version": "Versione",
|
|
||||||
"welcome": "Benvenuto su Crafty Controller",
|
|
||||||
"world": "Mondo"
|
|
||||||
},
|
|
||||||
"datatables": {
|
|
||||||
"i18n": {
|
|
||||||
"aria": {
|
|
||||||
"sortAscending": ": attiva per ordinare le colonne in modo ascendente",
|
|
||||||
"sortDescending": ": attiva per ordinare le colonne in modo discendente"
|
|
||||||
},
|
|
||||||
"buttons": {
|
|
||||||
"collection": "Collezione <span class='ui-button-icon-primary ui-icon ui-icon-triangle-1-s'/>",
|
|
||||||
"colvis": "Visibilità della colonna",
|
|
||||||
"colvisRestore": "Ripristina Visibilità",
|
|
||||||
"copy": "Copia",
|
|
||||||
"copyKeys": "Premi Ctrl o u2318 + C per copiare i dati della tabella negli appunti di sistema.<br><br> Per cancellare, clicca questo messaggio o premi ESC.",
|
|
||||||
"copySuccess": {
|
|
||||||
"1": "Copiata 1 riga negli appunti",
|
|
||||||
"_": "Copiate %d righe negli appunti"
|
|
||||||
},
|
|
||||||
"copyTitle": "Copia negli appunti",
|
|
||||||
"csv": "CSV",
|
|
||||||
"excel": "Excel",
|
|
||||||
"pageLength": {
|
|
||||||
"1": "Mostra 1 riga",
|
|
||||||
"-1": "Mostra tutte le righe",
|
|
||||||
"_": "Mostra %d righe"
|
|
||||||
},
|
|
||||||
"pdf": "PDF",
|
|
||||||
"print": "Print"
|
|
||||||
},
|
|
||||||
"decimal": "",
|
|
||||||
"emptyTable": "Nessun dato disponibile nella tabella",
|
|
||||||
"info": "Visualizzando da _START_ fino a _END_ di _TOTAL_ voci",
|
|
||||||
"infoEmpty": "Visualizzando da 0 fino a 0 di 0 voci",
|
|
||||||
"infoFiltered": "(Filtrato da_MAX_ voci totali)",
|
|
||||||
"infoPostFix": "",
|
|
||||||
"lengthMenu": "Mostra le voci di _MENU_ ",
|
|
||||||
"loadingRecords": "Caricamento...",
|
|
||||||
"paginate": {
|
|
||||||
"first": "Primo",
|
|
||||||
"last": "Ultimo",
|
|
||||||
"next": "Prossima",
|
|
||||||
"previous": "Precedente"
|
|
||||||
},
|
|
||||||
"processing": "Caricamento...",
|
|
||||||
"search": "Cerca:",
|
|
||||||
"select": {
|
|
||||||
"cells": {
|
|
||||||
"0": "Click on a cel to select it",
|
|
||||||
"1": "%d cell selected",
|
|
||||||
"_": "%d cells selected"
|
|
||||||
},
|
|
||||||
"columns": {
|
|
||||||
"0": "Click on a column to select it",
|
|
||||||
"1": "%d column selected",
|
|
||||||
"_": "%d columns selected"
|
|
||||||
},
|
|
||||||
"rows": {
|
|
||||||
"0": "Click on a row to select it",
|
|
||||||
"1": "%d row selected",
|
|
||||||
"_": "%d rows selected"
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"thousands": ",",
|
|
||||||
"zeroRecords": "Nessuna voce corrispondente trovata"
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"error": {
|
|
||||||
"closedPort": "Ci siamo accorti che la porta {} potrebbe non essere aperta, o un firewall potrebbe tenerla chiusa. Le connessioni remote al server potrebbero essere limitate.",
|
|
||||||
"contact": "Contatta l'assistenza di Crafty Controller su Discord!",
|
|
||||||
"embarassing": "Oh mamma, beh, questo è imbarazzante.",
|
|
||||||
"error": "Errore!",
|
|
||||||
"eulaAgree": "Accetti l'EULA?",
|
|
||||||
"eulaMsg": "Devi accettare l'EULA. Una copia dell'EULA di Mojang è allegata sotto questo messaggio.",
|
|
||||||
"eulaTitle": "Accetta il Contratto con l'Utente Finale",
|
|
||||||
"hereIsTheError": "Ecco l'errore",
|
|
||||||
"internet": "Ci siamo accorti che il server che fa girare Crafty non ha connessione a internet. Le connessioni dei Client potrebbero essere limitate.",
|
|
||||||
"start-error": "Il server {} non è partito, con codice errore: {}",
|
|
||||||
"terribleFailure": "Che crash epico!"
|
|
||||||
},
|
|
||||||
"footer": {
|
|
||||||
"allRightsReserved": "Tutti i diritti riservati",
|
|
||||||
"copyright": "Copyright",
|
|
||||||
"version": "Versione"
|
|
||||||
},
|
|
||||||
"login": {
|
|
||||||
"forgotPassword": "Password dimenticata",
|
|
||||||
"login": "Log In",
|
|
||||||
"password": "Password",
|
|
||||||
"username": "Nome utente"
|
|
||||||
},
|
|
||||||
"panelConfig": {
|
|
||||||
"cancel": "Cancella",
|
|
||||||
"delete": "Elimina",
|
|
||||||
"save": "Salva"
|
|
||||||
},
|
|
||||||
"serverBackups": {
|
|
||||||
"backupAtMidnight": "Backup automatico a mezzanotte?",
|
|
||||||
"backupNow": "Fai un Backup ora!",
|
|
||||||
"backupTask": "È cominciato un processo di backup.",
|
|
||||||
"cancel": "Cancella",
|
|
||||||
"confirm": "Conferma",
|
|
||||||
"confirmDelete": "Vuoi cancellare questo Backup? Questa azione non è annullabile.",
|
|
||||||
"currentBackups": "Backup attuali",
|
|
||||||
"delete": "Cancella",
|
|
||||||
"destroyBackup": "Cancellare backup \" + file_to_del + \"?",
|
|
||||||
"download": "Download",
|
|
||||||
"maxBackups": "Backup massimi",
|
|
||||||
"maxBackupsDesc": "Crafty non immagazzinerà più di N backup, cancellerà quelli più vecchi (inserisci 0 per mantenerli tutti)",
|
|
||||||
"options": "Opzioni",
|
|
||||||
"path": "Percorso",
|
|
||||||
"save": "Salva",
|
|
||||||
"size": "Dimensione",
|
|
||||||
"storageLocation": "Percorso del backup",
|
|
||||||
"storageLocationDesc": "Dove vuoi memorizzare i backup?"
|
|
||||||
},
|
|
||||||
"serverConfig": {
|
|
||||||
"bePatientDelete": "Per favore sii paziente mentre rimuoviamo il server dal pannello. Questa schermata si aggiornerà in un momento.",
|
|
||||||
"bePatientDeleteFiles": "Per favore sii paziente mentre rimuoviamo il server dal pannello ed eliminiamo i file. Questa schermata sparirà in un momento.",
|
|
||||||
"bePatientUpdate": "Per favore sii paziente mentre aggiorniamo il server. I tempi di scaricamento possono variare in base alla tua velocità di Internet.<br /> Questa schermata si aggiornerà in un momento.",
|
|
||||||
"cancel": "Cancella",
|
|
||||||
"deleteFilesQuestion": "Eliminare i file del Server dalla macchina?",
|
|
||||||
"deleteFilesQuestionMessage": "Vorresti che Crafty eliminasse tutti i file del Server dalla macchina Host?",
|
|
||||||
"deleteServer": "Elimina Server",
|
|
||||||
"deleteServerQuestion": "Eliminare il Server?",
|
|
||||||
"deleteServerQuestionMessage": "Sei sicuro di voler eliminare questo server? Dopo la conferma non si può tornare indietro...",
|
|
||||||
"exeUpdateURL": "URL per gli aggiornamenti dell'Eseguibile del Server",
|
|
||||||
"exeUpdateURLDesc": "URL Diretto per il download di aggiornamenti.",
|
|
||||||
"noDelete": "No, torna indietro",
|
|
||||||
"noDeleteFiles": "No, rimuovili dal pannello e basta",
|
|
||||||
"removeOldLogsAfter": "Rimuovi log più vecchi di ",
|
|
||||||
"removeOldLogsAfterDesc": "Di quanti giorni dovrebbe essere vecchio un log per essere cancellato (0 per non cancellarne)",
|
|
||||||
"save": "Salva",
|
|
||||||
"sendingDelete": "Eliminando il Server",
|
|
||||||
"sendingRequest": "Invio la tua richiesta...",
|
|
||||||
"serverAutoStart": "Avvio automatico del Server",
|
|
||||||
"serverAutostartDelay": "Ritardo Automatico dell'Avvio",
|
|
||||||
"serverAutostartDelayDesc": "Il ritardo per far partire il server (Se abilitato più sotto)",
|
|
||||||
"serverCrashDetection": "Rilevamento dei Crash del Server",
|
|
||||||
"serverExecutable": "Eseguibile del Server",
|
|
||||||
"serverExecutableDesc": "Il file Eseguibile del server",
|
|
||||||
"serverExecutionCommand": "Comando di Esecuzione del Server",
|
|
||||||
"serverExecutionCommandDesc": "Quello che verrà eseguito in un terminale nascosto",
|
|
||||||
"serverIP": "Server IP",
|
|
||||||
"serverIPDesc": "L'IP a cui Crafty dovrebbe connettersi per le statistiche (Prova un IP reale piuttosto di 127.0.0.1 se hai qualche problema)",
|
|
||||||
"serverLogLocation": "Posizione del Log del Server",
|
|
||||||
"serverLogLocationDesc": "Percorso Assoluto per Intero del File di Log",
|
|
||||||
"serverName": "Nome del Server",
|
|
||||||
"serverNameDesc": "Come vorresti chiamare questo server",
|
|
||||||
"serverPath": "Cartella di Operazioni del Server",
|
|
||||||
"serverPathDesc": "Percorso Assoluto per Intero (Escludendo l'eseguibile)",
|
|
||||||
"serverPort": "Porta del Server",
|
|
||||||
"serverPortDesc": "La Porta a cui Crafty dovrebbe connettersi per le statistiche",
|
|
||||||
"serverStopCommand": "Comando per terminare il server",
|
|
||||||
"serverStopCommandDesc": "Comando da inviare al server per fermarlo",
|
|
||||||
"stopBeforeDeleting": "Per favore ferma il Server prima di eliminarlo",
|
|
||||||
"update": "Aggiorna l'Eseguibile",
|
|
||||||
"yesDelete": "Sì, eliminalo",
|
|
||||||
"yesDeleteFiles": "Sì, cancella i file"
|
|
||||||
},
|
|
||||||
"serverConfigHelp": {
|
|
||||||
"desc": "Qui è dove puoi cambiare la configurazione del tuo Server",
|
|
||||||
"perms": [
|
|
||||||
"È raccomandabile <code>NON</code> cambiare i percorsi di un Server gestito da Crafty.",
|
|
||||||
"Cambiare i percorsi <code>PUO'</code> rompere cose, specialmente su sistemi tipo Linux dove i permessi dei file sono più restrittivi.",
|
|
||||||
"<br /><br/>",
|
|
||||||
"Se credi di dover cambiare il percorso di un server puoi farlo, a patto di dare all'utente \"crafty\" i permessi di leggere e scrivere nel percorso del server.",
|
|
||||||
"<br />",
|
|
||||||
"<br />",
|
|
||||||
"Su Linux questa operazione si esegue con questi comandi:<br />",
|
|
||||||
"<code>",
|
|
||||||
" sudo chown crafty:crafty /percorso/al/tuo/server -R<br />",
|
|
||||||
" sudo chmod 2775 /percorso/al/tuo/server -R<br />",
|
|
||||||
"</code>"
|
|
||||||
],
|
|
||||||
"title": "Area di Configurazione del Server"
|
|
||||||
},
|
|
||||||
"serverDetails": {
|
|
||||||
"backup": "Backup",
|
|
||||||
"config": "Config",
|
|
||||||
"files": "Files",
|
|
||||||
"logs": "Logs",
|
|
||||||
"playerControls": "Player Management",
|
|
||||||
"schedule": "Pianifica",
|
|
||||||
"serverDetails": "Dettagli del Server",
|
|
||||||
"terminal": "Terminale"
|
|
||||||
},
|
|
||||||
"serverFiles": {
|
|
||||||
"clickUpload": "Clicca qui per selezionare i tuoi file",
|
|
||||||
"close": "Chiudi",
|
|
||||||
"createDir": "Crea Cartella",
|
|
||||||
"createDirQuestion": "Che nome vuoi dare alla nuova cartella?",
|
|
||||||
"createFile": "Crea file",
|
|
||||||
"createFileQuestion": "Che nome vuoi dare al nuovo file?",
|
|
||||||
"default": "Default",
|
|
||||||
"delete": "Cancella",
|
|
||||||
"deleteItemQuestion": "Sei sicuro di voler eliminare \" + name + \"?",
|
|
||||||
"deleteItemQuestionMessage": "Stai eliminando \\\"\" + path + \"\\\"!<br/><br/>Questa azione è irreversibile e non potrai tornare indietro!",
|
|
||||||
"download": "Scarica",
|
|
||||||
"editingFile": "Modificare file",
|
|
||||||
"error": "Errore nel recuperare files",
|
|
||||||
"fileReadError": "Errore nel leggere i file",
|
|
||||||
"files": "Files",
|
|
||||||
"keybindings": "Combinazioni di tasti",
|
|
||||||
"noDelete": "No",
|
|
||||||
"noscript": "Il File Manager non funziona senza JavaScript",
|
|
||||||
"rename": "Rinomina",
|
|
||||||
"renameItemQuestion": "Qual è il nuovo nome?",
|
|
||||||
"save": "Salva",
|
|
||||||
"stayHere": "NON ABBANDONARE QUESTA PAGINA!",
|
|
||||||
"unsupportedLanguage": "Attenzione: Questo non è un tipo di file supportato",
|
|
||||||
"unzip": "Estrai",
|
|
||||||
"upload": "Carica",
|
|
||||||
"uploadTitle": "Carica i file: ",
|
|
||||||
"waitUpload": "Per favore attendi mentre carichiamo i tuoi file... Potrebbe volerci un po' di tempo.",
|
|
||||||
"yesDelete": "Sì, capisco le conseguenze"
|
|
||||||
},
|
|
||||||
"serverPlayerManagement": {
|
|
||||||
"bannedPlayers": "Giocatori Bannati",
|
|
||||||
"loadingBannedPlayers": "Carico i Giocatori Bannati",
|
|
||||||
"players": "Giocatori"
|
|
||||||
},
|
|
||||||
"serverStats": {
|
|
||||||
"cpuUsage": "Utilizzo della CPU",
|
|
||||||
"description": "Descrizione",
|
|
||||||
"errorCalculatingUptime": "Errore nel calcolare il periodo di esecuzione del server",
|
|
||||||
"memUsage": "Utilizzo della Memoria",
|
|
||||||
"offline": "Offline",
|
|
||||||
"online": "Online",
|
|
||||||
"players": "Giocatori",
|
|
||||||
"serverStarted": "Server Avviato",
|
|
||||||
"serverStatus": "Stato del server",
|
|
||||||
"serverTime": "Zona UTC",
|
|
||||||
"serverUptime": "Tempo di esecuzione",
|
|
||||||
"starting": "Avvio ritardato",
|
|
||||||
"unableToConnect": "Non riesco a connettermi",
|
|
||||||
"version": "Versione"
|
|
||||||
},
|
|
||||||
"serverTerm": {
|
|
||||||
"commandInput": "Inserisci il tuo comando",
|
|
||||||
"delay-explained": "Il servizio è partito di recente e sta ritardando l'avvio dell'istanza del Server di Minecraft",
|
|
||||||
"restart": "Riavvia",
|
|
||||||
"sendCommand": "Invia il comando",
|
|
||||||
"start": "Avvia",
|
|
||||||
"starting": "Avvio ritardato",
|
|
||||||
"stop": "Ferma",
|
|
||||||
"stopScroll": "Ferma lo scorrimento automatico",
|
|
||||||
"updating": "Aggiornando..."
|
|
||||||
},
|
|
||||||
"serverWizard": {
|
|
||||||
"absoluteServerPath": "Percorso assoluto del server",
|
|
||||||
"absoluteZipPath": "Percorso assoluto del tuo Server in Zip",
|
|
||||||
"addRole": "Aggiungi il Server a Ruoli Esistenti",
|
|
||||||
"autoCreate": "Se non sono selezionati, Crafty ne creerà uno!",
|
|
||||||
"bePatient": "Per favore sii paziente mentre ' + (importing ? 'importiamo' : 'scarichiamo') + ' il server",
|
|
||||||
"buildServer": "Costruisci il Server!",
|
|
||||||
"defaultPort": "25565 default",
|
|
||||||
"downloading": "Scaricando il Server...",
|
|
||||||
"importing": "Importando il Server...",
|
|
||||||
"importServer": "Importa un Server esistente",
|
|
||||||
"importServerButton": "Importa Server!",
|
|
||||||
"importZip": "Importa da un file Zip",
|
|
||||||
"maxMem": "Memoria Massima",
|
|
||||||
"minMem": "Memoria Minima",
|
|
||||||
"myNewServer": "Il mio nuovo server",
|
|
||||||
"newServer": "Crea un nuovo Server",
|
|
||||||
"quickSettings": "Impostazioni rapide",
|
|
||||||
"quickSettingsDescription": "Non preoccuparti, puoi cambiare queste impostazioni in seguito",
|
|
||||||
"resetForm": "Ripulisci il form",
|
|
||||||
"selectRole": "Seleziona il o i ruoli",
|
|
||||||
"selectType": "Seleziona un tipo",
|
|
||||||
"selectVersion": "Seleziona un Server",
|
|
||||||
"serverJar": "JarFile del server",
|
|
||||||
"serverName": "Nome Server",
|
|
||||||
"serverPath": "Percorso del Server",
|
|
||||||
"serverPort": "Porta del Server",
|
|
||||||
"serverType": "Tipo di Server",
|
|
||||||
"serverVersion": "Versione Server",
|
|
||||||
"sizeInGB": "Dimensione in GB",
|
|
||||||
"zipPath": "Percorso Server"
|
|
||||||
},
|
|
||||||
"sidebar": {
|
|
||||||
"contribute": "Contribuisci",
|
|
||||||
"credits": "Crediti",
|
|
||||||
"dashboard": "Dashboard",
|
|
||||||
"documentation": "Documentazione",
|
|
||||||
"navigation": "Navigazione",
|
|
||||||
"newServer": "Crea un nuovo Server",
|
|
||||||
"servers": "Servers"
|
|
||||||
}
|
|
||||||
}
|
|
@ -34,9 +34,9 @@
|
|||||||
RewriteCond %{HTTP:Connection} upgrade [NC]
|
RewriteCond %{HTTP:Connection} upgrade [NC]
|
||||||
RewriteRule .* "wss://127.0.0.1:8443%{REQUEST_URI}" [P]
|
RewriteRule .* "wss://127.0.0.1:8443%{REQUEST_URI}" [P]
|
||||||
|
|
||||||
SSLCertificateFile /var/opt/minecraft/crafty-commander/app/config/web/certs/commander.cert.pem
|
SSLCertificateFile /var/opt/minecraft/crafty4/app/config/web/certs/commander.cert.pem
|
||||||
|
|
||||||
SSLCertificateKeyFile /var/opt/minecraft/crafty-commander/app/config/web/certs/commander.key.pem
|
SSLCertificateKeyFile /var/opt/minecraft/crafty4/app/config/web/certs/commander.key.pem
|
||||||
|
|
||||||
ProxyPass / https://127.0.0.1:8443/
|
ProxyPass / https://127.0.0.1:8443/
|
||||||
ProxyPassReverse / https://127.0.0.1:8443/
|
ProxyPassReverse / https://127.0.0.1:8443/
|
||||||
|
2
main.py
2
main.py
@ -130,7 +130,7 @@ if __name__ == "__main__":
|
|||||||
else:
|
else:
|
||||||
Console.debug("Existing install detected")
|
Console.debug("Existing install detected")
|
||||||
|
|
||||||
# now the tables are created, we can load the tasks_manger and server controller
|
# now the tables are created, we can load the tasks_manager and server controller
|
||||||
controller = Controller(database, helper)
|
controller = Controller(database, helper)
|
||||||
tasks_manager = TasksManager(helper, controller)
|
tasks_manager = TasksManager(helper, controller)
|
||||||
tasks_manager.start_webserver()
|
tasks_manager.start_webserver()
|
||||||
|
Loading…
x
Reference in New Issue
Block a user