Add callbacks to method calls

This commit is contained in:
Andrew 2023-09-28 17:18:07 -04:00
parent bd1b67e83b
commit 5cdf114fd5

View File

@ -12,6 +12,7 @@ import html
import urllib.request
import glob
import json
from functools import wraps
from zoneinfo import ZoneInfo
@ -25,7 +26,7 @@ from app.classes.minecraft.stats import Stats
from app.classes.minecraft.mc_ping import ping, ping_bedrock
from app.classes.models.servers import HelperServers, Servers
from app.classes.models.server_stats import HelperServerStats
from app.classes.models.management import HelpersManagement
from app.classes.models.management import HelpersManagement, HelpersWebhooks
from app.classes.models.users import HelperUsers
from app.classes.models.server_permissions import PermissionsServers
from app.classes.shared.console import Console
@ -33,6 +34,7 @@ from app.classes.shared.helpers import Helpers
from app.classes.shared.file_helpers import FileHelpers
from app.classes.shared.null_writer import NullWriter
from app.classes.shared.websocket_manager import WebSocketManager
from app.classes.web.webhooks.webhook_factory import WebhookFactory
with redirect_stderr(NullWriter()):
import psutil
@ -165,6 +167,38 @@ class ServerInstance:
self.stats_helper.server_crash_reset()
self.stats_helper.set_update(False)
@staticmethod
def callback(called_func):
@wraps(called_func)
def wrapper(*args, **kwargs):
res = None
try:
res = called_func(*args, **kwargs)
finally:
events = WebhookFactory.get_monitored_events()
if called_func.__name__ in events:
server_webhooks = HelpersWebhooks.get_webhooks_by_server(
args[0].server_id, True
)
for swebhook in server_webhooks:
if called_func.__name__ in str(swebhook.trigger).split(","):
webhook = HelpersWebhooks.get_webhook_by_id(swebhook.id)
webhook_provider = WebhookFactory.create_provider(
webhook["webhook_type"]
)
if res is not False:
webhook_provider.send(
server_name=args[0].name,
title=webhook["name"],
url=webhook["url"],
message=webhook["body"],
# color=webhook["color"],
# TODO implement frontend color picker
)
return res
return wrapper
# **********************************************************************************
# Minecraft Server Management
# **********************************************************************************
@ -332,6 +366,7 @@ class ServerInstance:
logger.critical(f"Unable to write/access {self.server_path}")
Console.critical(f"Unable to write/access {self.server_path}")
@callback
def start_server(self, user_id, forge_install=False):
if not user_id:
user_lang = self.helper.get_setting("language")
@ -775,6 +810,7 @@ class ServerInstance:
if self.server_thread:
self.server_thread.join()
@callback
def stop_server(self):
running = self.check_running()
if not running:
@ -882,6 +918,7 @@ class ServerInstance:
self.last_rc = poll
return False
@callback
def send_command(self, command):
if not self.check_running() and command.lower() != "start":
logger.warning(f'Server not running, unable to send command "{command}"')
@ -894,6 +931,7 @@ class ServerInstance:
self.process.stdin.flush()
return True
@callback
def crash_detected(self, name):
# clear the old scheduled watcher task
self.server_scheduler.remove_job(f"c_{self.server_id}")
@ -927,6 +965,7 @@ class ServerInstance:
)
return False
@callback
def kill(self):
logger.info(f"Terminating server {self.server_id} and all child processes")
try:
@ -1015,6 +1054,7 @@ class ServerInstance:
f.write("eula=true")
self.run_threaded_server(user_id)
@callback
def backup_server(self):
if self.settings["backup_path"] == "":
logger.critical("Backup path is None. Canceling Backup!")
@ -1229,6 +1269,7 @@ class ServerInstance:
if f["path"].endswith(".zip")
]
@callback
def jar_update(self):
self.stats_helper.set_update(True)
update_thread = threading.Thread(