Bombsquad-Ballistica-Modded.../dist/ba_root/mods/tools/logger.py

166 lines
4.3 KiB
Python
Raw Normal View History

2022-02-15 09:13:45 +05:30
"""Module to Keeps the log of multiple things."""
2022-06-30 00:37:05 +05:30
# ba_meta require api 7
2022-02-15 09:13:45 +05:30
# (see https://ballistica.net/wiki/meta-tag-system)
from __future__ import annotations
2023-04-01 23:46:45 +05:30
import requests
import time
import json
2022-02-15 09:13:45 +05:30
from typing import TYPE_CHECKING
from dataclasses import dataclass, field
import os
2023-04-01 23:46:45 +05:30
import datetime
import shutil
2021-10-23 15:57:59 +05:30
import threading
2021-12-29 13:23:22 +05:30
import setting
2022-02-15 09:13:45 +05:30
import _ba
import fcntl
2022-02-15 09:13:45 +05:30
if TYPE_CHECKING:
pass
2021-10-23 15:57:59 +05:30
2022-02-15 09:13:45 +05:30
SETTINGS = setting.get_settings_data()
SERVER_DATA_PATH = os.path.join(
_ba.env()["python_directory_user"], "serverData" + os.sep
)
2021-10-23 15:57:59 +05:30
2022-02-15 09:13:45 +05:30
if SETTINGS["discordbot"]["enable"]:
from features import discord_bot
2023-04-01 23:46:45 +05:30
WEBHOOK_URL = SETTINGS["discordWebHook"]["webhookURL"]
2022-02-15 09:13:45 +05:30
@dataclass
class RecentLogs:
"""Saves the recent logs."""
chats: list[str] = field(default_factory=list)
joinlog: list[str] = field(default_factory=list)
cmndlog: list[str] = field(default_factory=list)
misclogs: list[str] = field(default_factory=list)
2023-04-01 23:46:45 +05:30
2022-03-06 14:56:29 +05:30
logs = RecentLogs()
2023-04-01 23:46:45 +05:30
webhook_queue = []
2022-02-15 09:13:45 +05:30
def log(msg: str, mtype: str = "sys") -> None:
"""Cache and dumps the log."""
2022-02-15 09:13:45 +05:30
if SETTINGS["discordbot"]["enable"]:
message = msg.replace("||", "|")
discord_bot.push_log("***" + mtype + ":***" + message)
current_time = datetime.datetime.now().strftime("%Y-%m-%d %H:%M:%S")
2022-02-15 09:13:45 +05:30
msg = f"{current_time} + : {msg} \n"
2023-04-01 23:46:45 +05:30
if SETTINGS["discordWebHook"]["enable"]:
webhook_queue.append(msg.replace("||", "|"))
2022-02-15 09:13:45 +05:30
if mtype == "chat":
logs.chats.append(msg)
if len(logs.chats) > 10:
dumplogs(logs.chats, "chat").start()
logs.chats = []
2022-02-15 09:13:45 +05:30
elif mtype == "playerjoin":
logs.joinlog.append(msg)
if len(logs.joinlog) > 3:
dumplogs(logs.joinlog, "joinlog").start()
logs.joinlog = []
elif mtype == "chatcmd":
logs.cmndlog.append(msg)
if len(logs.cmndlog) > 3:
dumplogs(logs.cmndlog, "cmndlog").start()
logs.cmndlog = []
else:
logs.misclogs.append(msg)
if len(logs.misclogs) > 5:
dumplogs(logs.misclogs, "sys").start()
logs.misclogs = []
class dumplogs(threading.Thread):
"""Dumps the logs in the server data."""
def __init__(self, msg, mtype="sys"):
super().__init__()
self.msg = msg
self.type = mtype
def run(self):
if self.type == "chat":
log_path = SERVER_DATA_PATH + "Chat Logs.log"
elif self.type == "joinlog":
log_path = SERVER_DATA_PATH + "joining.log"
elif self.type == "cmndlog":
log_path = SERVER_DATA_PATH + "cmndusage.log"
else:
log_path = SERVER_DATA_PATH + "systemlogs.log"
2022-12-04 14:36:54 +05:30
if os.path.exists(log_path):
2022-12-14 21:58:44 +05:30
if os.stat(log_path).st_size > 1000000:
self.copy_file(
log_path, log_path+str(datetime.datetime.now().strftime("%Y-%m-%d %H:%M:%S")))
self.write_file(log_path, self.msg)
def write_file(self, file_path, data):
file = open(file_path, "a+", encoding="utf-8")
fcntl.flock(file.fileno(), fcntl.LOCK_EX)
try:
for msg in data:
2022-02-15 09:13:45 +05:30
file.write(msg)
finally:
fcntl.flock(file.fileno(), fcntl.LOCK_UN)
file.close()
def copy_file(self, file_path, dest_path):
lock_file = open(file_path, "r")
fcntl.flock(lock_file.fileno(), fcntl.LOCK_EX | fcntl.LOCK_NB)
try:
shutil.copy(file_path, dest_path)
except Exception as e:
print("Error occurred while copying file:", str(e))
finally:
fcntl.flock(lock_file.fileno(), fcntl.LOCK_UN)
lock_file.close()
os.remove(lock_file)
2023-04-01 23:46:45 +05:30
def send_webhook_message():
global webhook_queue
msg = None
for msg_ in webhook_queue:
msg = msg_ + "\n"
webhook_queue = []
if msg:
payload = {
"content": msg,
"username": _ba.app.server._config.party_name
}
headers = {
"Content-Type": "application/json"
}
response = requests.post(
WEBHOOK_URL, data=json.dumps(payload), headers=headers)
def schedule_webhook():
while True:
send_webhook_message()
time.sleep(8)
if SETTINGS["discordWebHook"]["enable"]:
thread = threading.Thread(target=schedule_webhook)
thread.start()