from .Handlers import handlemsg, handlemsg_all, send, clientid_to_myself, sendchat from playersData import pdata # from tools.whitelist import add_to_white_list, add_commit_to_logs from serverData import serverdata import ba,os,json from datetime import datetime, timedelta import _ba import time import setting import ba.internal import _thread import set import roles import random from stats import mystats from bastd.gameutils import SharedObjects from tools import playlist from tools import logger, mongo import set import json Commands = ['cjt', 'checkjointime', 'shop', 'donate','removepaideffect'] CommandAliases = ['give', 'buy', 'cts', 'stc', 'rpe', 'bsc', 'bombsquad-card', 'claim'] BANK_PATH = _ba.env().get("python_directory_user", "") + "/bank.json" base_path = os.path.join(_ba.env()['python_directory_user'], "stats" + os.sep) statsfile = base_path + 'stats.json' python_path = _ba.env()["python_directory_user"] tic = u'\U0001FA99' def CoinCommands(command, arguments, clientid, accountid): """ Checks The Command And Run Function Parameters: command : str arguments : str clientid : int accountid : int Returns: None """ if command == 'shop': shop(arguments, clientid) elif command in ['scoretocash', 'stc']: stc(arguments, clientid, accountid) elif command in ['cashtoscore', 'cts']: cts(arguments, clientid, accountid) elif command in ['donate', 'give']: donate(arguments, clientid, accountid) elif command == 'buy': buy(arguments, clientid, accountid) elif command == 'claim': claim_ticket(arguments, clientid, accountid) elif command in ['rpe', 'removepaideffect']: rpe(arguments, clientid, accountid) elif command in ['cjt', 'checkjointime']: check_claim_time(arguments, clientid, accountid) elif command in ['bsc', 'bombsquad-card']: bombsquad_card(clientid, accountid) def getcoins(accountid: str): with open(BANK_PATH, 'r') as f: coins = json.loads(f.read()) if accountid in coins: return coins[accountid] def getstats(): f = open(statsfile, 'r') return json.loads(f.read()) def addcoins(accountid: str, amount: int): if os.path.exists(BANK_PATH): with open(BANK_PATH) as f: bank = json.loads(f.read()) else: bank = {} if accountid not in bank: bank[accountid] = 0 bank[accountid] += amount with open(BANK_PATH, 'w') as f: f.write(json.dumps(bank)) if amount > 0: ba.playsound(ba.getsound("cashRegister")) print('Transaction successful') def addcoin(accountid: str, amount: int): if os.path.exists(BANK_PATH): with open(BANK_PATH) as f: bank = json.loads(f.read()) else: bank = {} if accountid not in bank: bank[accountid] = 0 bank[accountid] += amount with open(BANK_PATH, 'w') as f: f.write(json.dumps(bank)) if amount > 0: print('Transaction successful') def shop(arguments, clientid): players = _ba.get_foreground_host_activity().players player = _ba.get_foreground_host_activity() a = arguments with ba.Context(player): string = '==You can buy following items==\n' if a == []: send("Usage: /shop commands, /shop effects and /shop tag", clientid) elif a[0].startswith('effects'): for x in set.availableeffects: string += f"{x} ---- {tic}{str(set.availableeffects[x])} ---- for 1 day\n" send(string, clientid) elif a[0].startswith('commands'): separator = ' ' for x in set.availablecommands: string += f"{x}----{tic}{str(set.availablecommands[x])}{separator}" if separator == ' ': separator = '\n' else: separator = ' ' ba.screenmessage(string, transient=True, color=(1, 1, 1), clients=[clientid]) else: send("Usage: /shop commands or /shop effects", clientid) def check_claim_time(arguments, clientid, accountid): customers = pdata.get_custom()['coin_claim'] if accountid in customers: if customers: expiry = datetime.strptime(customers[accountid]['expiry'], '%d-%m-%Y %H:%M:%S') remaining_time_seconds = int((expiry - datetime.now()).total_seconds()) # Calculate hours, minutes, and seconds hours = remaining_time_seconds // 3600 minutes = (remaining_time_seconds % 3600) // 60 seconds = remaining_time_seconds % 60 send(f"Time remaining until your next join coin claim: {hours}:{minutes}:{seconds}", clientid) def stc(arguments, clientid, accountid): players = _ba.get_foreground_host_activity().players player = _ba.get_foreground_host_activity() a = arguments with ba.Context(player): try: score = int(a[0]) stats = mystats.get_all_stats() havescore = stats[accountid]['scores'] if havescore < score: send(f"Not enough scores to perform the transaction", clientid) send(f"You have {havescore} Score only....", clientid) elif score < 500: send(f"You can only convert more than 500 scores", clientid) else: stats[accountid]['scores'] -= score mystats.dump_stats(stats) equivalentCoins = int(score / 5 * 0.9) addcoins(accountid, equivalentCoins) ba.screenmessage('Transaction Successful', color=(0,1,0)) _ba.chatmessage(f"{str(equivalentCoins)}{tic} added to your account. [10% transaction fee deducted]") mystats.refreshStats() except: send("Usage: /scoretocash or stc amount_of_score", clientid) def donate(arguments, clientid, accountid): players = _ba.get_foreground_host_activity().players player = _ba.get_foreground_host_activity() session = ba.internal.get_foreground_host_session() a = arguments with ba.Context(player): try: if len(a) < 2: ba.screenmessage("Usage: /donate [amount] [clientid of player]", transient=True, clients=[clientid]) else: havecoins = getcoins(accountid) transfer = int(a[0]) if transfer < 100: send(f"You can only transfer more than 100{tic}.", clientid) return sendersID = accountid receiversID = None for i in session.sessionplayers: if i.inputdevice.client_id == int(a[1]): receiversID = i.get_v1_account_id() pname = i.getname(full=True, icon=True) if i.inputdevice.client_id == clientid: name = i.getname(full=True, icon=True) if None not in [sendersID, receiversID]: if sendersID == receiversID: send(f"You can't transfer to your own account", clientid) elif getcoins(sendersID) < transfer: send(f"Not enough {tic}tickets to perform the transaction", clientid) send(f"You have {havecoins}{tic} only....", clientid) else: addcoins(sendersID, transfer * -1) addcoins(receiversID, transfer) ba.playsound(ba.getsound("cashRegister")) ba.screenmessage(f'Transaction Successful', color=(0,1,0)) _ba.chatmessage(f"Successfully transfered {transfer}{tic} into {pname}'s account.") else: send(f"player not found", clientid) except Exception as e: print(f"An error occurred: {e}") ba.screenmessage('An error occurred. Check the console for details.', transient=True, clients=[clientid]) def cts(arguments, clientid, accountid): players = _ba.get_foreground_host_activity().players player = _ba.get_foreground_host_activity() a = arguments with ba.Context(player): try: coins = int(a[0]) havecoins = getcoins(accountid) if havecoins < coins: send(f"Not enough {tic}tickets to perform the transaction", clientid) send(f"You have {havecoins}{tic} only....", clientid) elif coins < 100: send(f"You can only convert more than 100{tic}", clientid) else: addcoins(accountid, coins * -1) stats = mystats.get_all_stats() equivalentScore = int(coins * 5 * 0.9) stats[accountid]['scores'] += equivalentScore ba.playsound(ba.getsound("cashRegister")) ba.screenmessage(f'Transaction Successful', color=(0,1,0)) mystats.dump_stats(stats) _ba.chatmessage(f"{str(equivalentScore)} scores added to your account stats. [10% transaction fee deducted]") mystats.refreshStats() except: send("Usage: /cashtoscore or cts amount_of_cash", clientid) def buy(arguments, clientid, accountid): global effectCustomers players = _ba.get_foreground_host_activity().players player = _ba.get_foreground_host_activity() a = arguments with ba.Context(player): if a == []: _ba.chatmessage('Usage: /buy item_name') elif a[0] in set.availableeffects: effect = a[0] costofeffect = set.availableeffects[effect] havecoins = getcoins(accountid) if havecoins >= costofeffect: customers = pdata.get_custom()['paideffects'] if accountid not in customers: expiry = datetime.now() + timedelta(days=1) customers[accountid] = {'effect': effect, 'expiry': expiry.strftime('%d-%m-%Y %H:%M:%S')} addcoins(accountid, costofeffect * -1) _ba.chatmessage(f"Success! That cost you {str(costofeffect)}{tic}") else: activeeffect = customers[accountid]['effect'] till = customers[accountid]['expiry'] send(f"You already have {activeeffect} effect active\nTill = {till}", clientid) else: send(f"You need {str(costofeffect)}{tic} for that, You have {str(havecoins)}{tic} only.", clientid) else: send(f"invalid item, try using '/shop effects", clientid) def rpe(arguments, clientid, accountid): try: custom = pdata.get_custom()['paideffects'] aeffect = custom[accountid]['effect'] session = ba.internal.get_foreground_host_session() pdata.remove_paid_effect(accountid) send(f"paid {aeffect} effect have been removed Successfully", clientid) except: return def claim_ticket(arguments, clientid, accountid): players = _ba.get_foreground_host_activity().players player = _ba.get_foreground_host_activity() session = ba.internal.get_foreground_host_session() if arguments == [] or arguments == ['']: with ba.Context(player): customers = pdata.get_custom()['ticketclaimed'] for i in session.sessionplayers: if i.inputdevice.client_id == clientid: name = i.getname(full=True, icon=True) if accountid not in customers: expiry = datetime.now() + timedelta(seconds=1) customers[accountid] = {'name': name, 'expiry': expiry.strftime('%d-%m-%Y %H:%M:%S')} coin_claim = 50 addcoins(accountid, coin_claim) _ba.chatmessage(f"Successfully added {coin_claim}{tic} into {name}'s account..") else: till = customers[accountid]['expiry'] send(f"Hey, you've already claimed your reward.\nNext chance: {till}", clientid) # Function to check credit card details by player ID def check_credit_card_by_pbid(accountid): card_data = mongo.collection.find_one({"player_id": accountid}) if card_data: return card_data else: return None # Function to handle the /cc command def bombsquad_card(clientid, accountid): card_data = check_credit_card_by_pbid(accountid) if card_data: message = ( f"Credit card details found:\n" f"Player ID: {card_data['player_id']}\n" f"Player Name: {card_data['player_name']}\n" f"Main Bs Number: {card_data['main_bs_number']}\n" ) send(message, clientid) else: send(f"No Main Bs Number details found for player ID: {pbid}", clientid)