diff --git a/dist/ba_root/mods/chatHandle/ChatCommands/commands/Management.py b/dist/ba_root/mods/chatHandle/ChatCommands/commands/Management.py index 1060f0c..ddcdc1c 100644 --- a/dist/ba_root/mods/chatHandle/ChatCommands/commands/Management.py +++ b/dist/ba_root/mods/chatHandle/ChatCommands/commands/Management.py @@ -219,7 +219,7 @@ def ban(arguments): ac_id="" for ros in ba.internal.get_game_roster(): if ros["client_id"]==cl_id: - _thread.start_new_thread(pdata.ban_player,(ros['account_id'],)) + pdata.ban_player(ros['account_id']) ac_id=ros['account_id'] if ac_id in serverdata.clients: diff --git a/dist/ba_root/mods/playersData/blacklist.json b/dist/ba_root/mods/playersData/blacklist.json new file mode 100644 index 0000000..589a154 --- /dev/null +++ b/dist/ba_root/mods/playersData/blacklist.json @@ -0,0 +1,11 @@ +{ + "ban": { + "ids": [ + ], + "ips": [ + ], + "deviceids": [ + ] + }, + "muted-ids": [] +} \ No newline at end of file diff --git a/dist/ba_root/mods/playersData/pdata.py b/dist/ba_root/mods/playersData/pdata.py index a146183..37edffb 100644 --- a/dist/ba_root/mods/playersData/pdata.py +++ b/dist/ba_root/mods/playersData/pdata.py @@ -16,7 +16,7 @@ from tools.file_handle import OpenJson import _ba import ba.internal import json - +import datetime if TYPE_CHECKING: pass @@ -34,6 +34,7 @@ class CacheData: # pylint: disable=too-few-public-methods custom: dict = {} profiles: dict = {} whitelist: list[str] = [] + blacklist: dict = {} def get_info(account_id: str) -> dict | None: @@ -65,8 +66,12 @@ def get_profiles() -> dict: """ if CacheData.profiles=={}: try: - f=open(PLAYERS_DATA_PATH + "profiles.json","r") - profiles = json.load(f) + if os.stat(PLAYERS_DATA_PATH+"profiles.json").st_size > 1000: + shutil.copyfile(PLAYERS_DATA_PATH + "profiles.json",PLAYERS_DATA_PATH + "profiles.json"+str(datetime.datetime.now())) + profiles = {"pb-sdf":{}} + else: + f=open(PLAYERS_DATA_PATH + "profiles.json","r") + profiles = json.load(f) CacheData.profiles=profiles f.close() except: @@ -78,6 +83,27 @@ def get_profiles() -> dict: else: return CacheData.profiles +def get_blacklist() -> dict: + if CacheData.blacklist == {}: + try: + f = open(PLAYERS_DATA_PATH + "blacklist.json","r") + CacheData.blacklist = json.load(f) + except: + print('error opening blacklist json') + return { + "ban":{ + "ids":[], + "ips":[], + "deviceids":[] + }, + "muted-ids":[] + } + + return CacheData.blacklist + +def update_blacklist(): + with open(PLAYERS_DATA_PATH + "blacklist.json","w") as f: + json.dump(CacheData.blacklist,f,indent=4) def commit_profiles(data={}) -> None: """Commits the given profiles in the database. @@ -141,6 +167,9 @@ def add_profile( device_id = _ba.get_client_public_device_uuid(cid) if(device_id==None): device_id = _ba.get_client_device_uuid(cid) + if device_id in get_blacklist()["ban"]["deviceids"]: + serverdata.clients[account_id]["isBan"]=True + ba.internal.disconnect_client(cid) serverdata.clients[account_id]["deviceUUID"] = device_id @@ -213,8 +242,21 @@ def ban_player(account_id: str) -> None: if account_id in profiles: profiles[account_id]["isBan"] = True CacheData.profiles=profiles - _thread.start_new_thread(commit_profiles, (profiles,)) + # _thread.start_new_thread(commit_profiles, (profiles,)) + cid = -1 + for ros in ba.internal.get_game_roster(): + if ros['account_id'] == account_id: + cid = ros['client_id'] + ip = _ba.get_client_ip(cid) + device_id = _ba.get_client_public_device_uuid(cid) + if(device_id==None): + device_id = _ba.get_client_device_uuid(cid) + CacheData.blacklist["ban"]["ips"].append(ip) + + CacheData.blacklist["ban"]["ids"].append(account_id) + CacheData.blacklist["ban"]["deviceids"].append(device_id) + _thread.start_new_thread(update_blacklist,()) def mute(account_id: str) -> None: """Mutes the player. @@ -602,5 +644,5 @@ def dump_cache(): custom= copy.deepcopy(CacheData.custom) with open(PLAYERS_DATA_PATH + "custom.json", "w") as f: json.dump(custom, f, indent=4) - time.sleep(20) + time.sleep(60) dump_cache() diff --git a/dist/ba_root/mods/tools/logger.py b/dist/ba_root/mods/tools/logger.py index f673f8b..bfee435 100644 --- a/dist/ba_root/mods/tools/logger.py +++ b/dist/ba_root/mods/tools/logger.py @@ -9,7 +9,7 @@ from typing import TYPE_CHECKING from dataclasses import dataclass, field import os -import datetime +import datetime,shutil import threading import setting import _ba @@ -92,7 +92,10 @@ class dumplogs(threading.Thread): log_path = SERVER_DATA_PATH + "cmndusage.log" else: log_path = SERVER_DATA_PATH + "logs.log" - + if os.path.exists(log_path): + if os.stat(log_path).st_size > 1000: + shutil.copy(log_path, log_path+str(datetime.datetime.now())) + os.remove(log_path) with open(log_path, mode="a+", encoding="utf-8") as file: for msg in self.msg: file.write(msg) diff --git a/dist/ba_root/mods/tools/servercheck.py b/dist/ba_root/mods/tools/servercheck.py index 516f752..1d2a274 100644 --- a/dist/ba_root/mods/tools/servercheck.py +++ b/dist/ba_root/mods/tools/servercheck.py @@ -18,8 +18,9 @@ import setting import _thread from tools import logger from features import profanity +from playersData import pdata - +blacklist = pdata.get_blacklist() settings = setting.get_settings_data() @@ -88,6 +89,7 @@ def on_player_join_server(pbid, player_data): for ros in ba.internal.get_game_roster(): if ros["account_id"] == pbid: clid = ros["client_id"] + if pbid in serverdata.clients: rejoinCount = serverdata.clients[pbid]["rejoincount"] spamCount = serverdata.clients[pbid]["spamCount"] @@ -126,6 +128,8 @@ def on_player_join_server(pbid, player_data): return else: if pbid not in serverdata.clients: + if check_ban(clid,pbid): + return serverdata.clients[pbid] = player_data serverdata.clients[pbid]["warnCount"] = 0 serverdata.clients[pbid]["lastWarned"] = time.time() @@ -175,6 +179,17 @@ def on_player_join_server(pbid, player_data): # pdata.add_profile(pbid,d_string,d_string) +def check_ban(clid,pbid): + ip = _ba.get_client_ip(clid) + + device_id = _ba.get_client_public_device_uuid(clid) + if(device_id==None): + device_id = _ba.get_client_device_uuid(clid) + if (ip in blacklist["ban"]['ips'] or device_id in blacklist['ban']['deviceids'] or pbid in blacklist["ban"]["ids"]): + _ba.chatmessage('sad ,your account is flagged contact server owner for unban',clients=[clid]) + ba.internal.disconnect_client(clid) + return True + return False def verify_account(pb_id, p_data): d_string = ""