diff --git a/mesh_bot.py b/mesh_bot.py index f097652..9723a14 100755 --- a/mesh_bot.py +++ b/mesh_bot.py @@ -603,8 +603,10 @@ def handle_llm(message_from_id, channel_number, deviceID, message, publicChannel llmTotalRuntime.append(end - start) return response + def handleDopeWars(message, nodeID, rxNode): - global dwPlayerTracker, dwHighScore + from modules.settings import dwPlayerTracker + global dwHighScore # Find player in tracker player = next((p for p in dwPlayerTracker if p.get('userID') == nodeID), None) @@ -656,7 +658,8 @@ def handle_gTnW(chess = False): return response[selected_index] def handleLemonade(message, nodeID, deviceID): - global lemonadeTracker, lemonadeCups, lemonadeLemons, lemonadeSugar, lemonadeWeeks, lemonadeScore, lemon_starting_cash, lemon_total_weeks + from modules.settings import lemonadeTracker + global lemonadeCups, lemonadeLemons, lemonadeSugar, lemonadeWeeks, lemonadeScore, lemon_starting_cash, lemon_total_weeks msg = "" def create_player(nodeID): @@ -703,7 +706,7 @@ def handleLemonade(message, nodeID, deviceID): return msg def handleBlackJack(message, nodeID, deviceID): - global jackTracker + from modules.settings import jackTracker msg = "" # Find player in tracker @@ -719,9 +722,23 @@ def handleBlackJack(message, nodeID, deviceID): # Create new player if not found if not player and nodeID != 0: logger.debug(f"System: BlackJack: New Player {nodeID}") - jackTracker.append({'nodeID': nodeID, 'cmd': 'new', 'last_played': time.time()}) - msg += "Welcome to 🃏BlackJack🃏!\n" + # create new player + jackTracker.append({ + 'nodeID': nodeID, + 'bet': 0, + 'cash': 100, # starting cash + 'gameStats': {'p_win': 0, 'd_win': 0, 'draw': 0}, + 'p_cards': [], + 'd_cards': [], + 'p_hand': [], + 'd_hand': [], + 'next_card': [], + 'last_played': time.time(), + 'cmd': 'new' + }) + msg += f"Welcome to 🃏BlackJack🃏!\n (H)it,(S)tand,(F)orfit,(D)ouble,(R)esend,(L)eave table" # Show high score if available + highScore = 0 highScore = loadHSJack() if highScore and highScore.get('nodeID', 0) != 0: nodeName = get_name_from_number(highScore['nodeID']) @@ -734,12 +751,18 @@ def handleBlackJack(message, nodeID, deviceID): if player: player['last_played'] = time.time() + # get player's last command from tracker if not new player + last_cmd = "" + for i in range(len(jackTracker)): + if jackTracker[i]['nodeID'] == nodeID: + last_cmd = jackTracker[i]['cmd'] + # Play BlackJack - msg += playBlackJack(nodeID=nodeID, message=message) + msg += playBlackJack(nodeID=nodeID, message=message, last_cmd=last_cmd) return msg def handleVideoPoker(message, nodeID, deviceID): - global vpTracker + from modules.settings import vpTracker msg = "" # Find player in tracker @@ -774,7 +797,7 @@ def handleVideoPoker(message, nodeID, deviceID): return msg def handleMmind(message, nodeID, deviceID): - global mindTracker + from modules.settings import mindTracker msg = '' if "end" in message.lower() or message.lower().startswith("e"): @@ -818,7 +841,7 @@ def handleMmind(message, nodeID, deviceID): return msg def handleGolf(message, nodeID, deviceID): - global golfTracker + from modules.settings import golfTracker msg = '' # get player's last command from tracker if not new player @@ -866,7 +889,7 @@ def handleGolf(message, nodeID, deviceID): return msg def handleHangman(message, nodeID, deviceID): - global hangmanTracker + from modules.settings import hangmanTracker index = 0 msg = '' for i in range(len(hangmanTracker)): @@ -892,7 +915,7 @@ def handleHangman(message, nodeID, deviceID): return msg def handleHamtest(message, nodeID, deviceID): - global hamtestTracker + from modules.settings import hamtestTracker index = 0 msg = '' response = message.split(' ') @@ -925,7 +948,7 @@ def handleHamtest(message, nodeID, deviceID): return msg def handleTicTacToe(message, nodeID, deviceID): - global tictactoeTracker + from modules.settings import tictactoeTracker index = 0 msg = '' @@ -1013,7 +1036,8 @@ def quizHandler(message, nodeID, deviceID): return "🧠Please provide an answer or command, or send q: ?" def surveyHandler(message, nodeID, deviceID): - global surveyTracker + from modules.settings import surveyTracker + user_id = nodeID location = get_node_location(nodeID, deviceID) msg = '' # Normalize and parse the command @@ -1497,6 +1521,7 @@ def onReceive(packet, interface): message_bytes = packet['decoded']['payload'] message_string = message_bytes.decode('utf-8') via_mqtt = packet['decoded'].get('viaMqtt', False) + transport_mechanism = packet['decoded'].get('transport_mechanism', 'unknown') rx_time = packet['decoded'].get('rxTime', time.time()) # check if the packet is from us @@ -1545,7 +1570,7 @@ def onReceive(packet, interface): if hop_start == hop_limit: hop = "Direct" hop_count = 0 - elif hop_start == 0 and hop_limit > 0 or via_mqtt: + elif hop_start == 0 and hop_limit > 0 or via_mqtt or transport_mechanism == "TRANSPORT_MQTT": hop = "MQTT" hop_count = 0 else: diff --git a/modules/games/blackjack.py b/modules/games/blackjack.py index b378c91..5170e2c 100644 --- a/modules/games/blackjack.py +++ b/modules/games/blackjack.py @@ -7,6 +7,7 @@ import time import pickle jack_starting_cash = 100 # Replace 100 with your desired starting cash value +from modules.settings import jackTracker SUITS = ("♥️", "♦️", "♠️", "♣️") RANKS = ( @@ -240,7 +241,7 @@ def loadHSJack(): pickle.dump(highScore, file) return 0 -def playBlackJack(nodeID, message): +def playBlackJack(nodeID, message, last_cmd=None): # Initalize the Game msg, last_cmd = '', None blackJack = False @@ -283,7 +284,7 @@ def playBlackJack(nodeID, message): jackTracker.append({'nodeID': nodeID, 'cmd': 'new', 'last_played': time.time(), 'cash': jack_starting_cash,\ 'bet': 0, 'gameStats': {'p_win': p_win, 'd_win': d_win, 'draw': draw}, 'p_cards':p_cards, 'd_cards':d_cards, 'p_hand':p_hand.cards, 'd_hand':d_hand.cards, 'next_card':next_card}) return f"You have {p_chips.total} chips. Whats your bet?" - return '' + return "Error: Player not found." if getLastCmdJack(nodeID) == "new": # Place Bet @@ -296,18 +297,20 @@ def playBlackJack(nodeID, message): #resend the hand msg += show_some(p_cards, d_cards, p_hand) return msg + elif message.lower() == "blackjack": + return f"\nTo place a bet, enter the amount you wish to wager." else: try: bet_money = int(message) except ValueError: - return "Invalid Bet, please enter a valid number." + return f"\nInvalid Bet, please enter a valid number." if bet_money <= p_chips.total and bet_money >= 1: p_chips.bet = bet_money else: - return f"Invalid Bet, the maximum bet you can place is {p_chips.total} and the minimum bet is 1." + return f"\nInvalid Bet, the maximum bet you can place is {p_chips.total} and the minimum bet is 1." except ValueError: - return f"Invalid Bet, the maximum bet, {p_chips.total}" + return f"\nInvalid Bet, the maximum bet, {p_chips.total}" # Show the cards msg += show_some(p_cards, d_cards, p_hand) diff --git a/modules/games/dopewar.py b/modules/games/dopewar.py index 43fc3cc..8537275 100644 --- a/modules/games/dopewar.py +++ b/modules/games/dopewar.py @@ -14,6 +14,7 @@ dwInventoryDb = [{'userID': 1234567890, 'inventory': 0, 'priceList': [], 'amount dwCashDb = [{'userID': 1234567890, 'cash': starting_cash},] dwGameDayDb = [{'userID': 1234567890, 'day': 0},] dwLocationDb = [{'userID': 1234567890, 'location': 'USA', 'loc_choice': 0},] +from modules.settings import dwPlayerTracker # high score is saved in a pickle file dwHighScore = {} diff --git a/modules/games/golfsim.py b/modules/games/golfsim.py index 6ce3e3d..214acc8 100644 --- a/modules/games/golfsim.py +++ b/modules/games/golfsim.py @@ -26,6 +26,7 @@ par4_5_range = par4_range + par5_range # Player setup playingHole = False +from modules.settings import golfTracker # Club functions def hit_driver(): @@ -123,7 +124,6 @@ def getHighScoreGolf(nodeID, strokes, par): # Main game loop def playGolf(nodeID, message, finishedHole=False, last_cmd=''): msg = '' - global golfTracker # Course setup par3_count = 0 par4_count = 0 diff --git a/modules/games/lemonade.py b/modules/games/lemonade.py index 5f77c56..370d6b9 100644 --- a/modules/games/lemonade.py +++ b/modules/games/lemonade.py @@ -23,6 +23,7 @@ lemonadeLemons = [{'nodeID': 0, 'cost': 4.00, 'count': 8, 'min': 2.00, 'unit': 0 lemonadeSugar = [{'nodeID': 0, 'cost': 3.00, 'count': 15, 'min': 1.50, 'unit': 0.00}] lemonadeWeeks = [{'nodeID': 0, 'current': 1, 'total': lemon_total_weeks, 'sales': 99, 'potential': 0, 'unit': 0.00, 'price': 0.00, 'total_sales': 0}] lemonadeScore = [{'nodeID': 0, 'value': 0.00, 'total': 0.00}] +from modules.settings import lemonadeTracker def get_sales_amount(potential, unit, price): """Gets the sales amount. diff --git a/modules/games/mmind.py b/modules/games/mmind.py index 6aac7bd..2c8da5d 100644 --- a/modules/games/mmind.py +++ b/modules/games/mmind.py @@ -5,7 +5,7 @@ import random import time import pickle from modules.log import * - +from modules.settings import mindTracker def chooseDifficultyMMind(message): usrInput = message.lower() msg = '' diff --git a/modules/games/videopoker.py b/modules/games/videopoker.py index 41f2e6f..0dfec3d 100644 --- a/modules/games/videopoker.py +++ b/modules/games/videopoker.py @@ -6,7 +6,7 @@ import pickle from modules.log import * vpStartingCash = 20 - +from modules.settings import vpTracker # Define the Card class class CardVP: diff --git a/modules/settings.py b/modules/settings.py index 3342154..981cfa7 100644 --- a/modules/settings.py +++ b/modules/settings.py @@ -28,11 +28,23 @@ wiki_return_limit = 3 # limit the number of sentences returned off the first par GAMEDELAY = 28800 # 8 hours in seconds for game mode holdoff cmdHistory = [] # list to hold the last commands seenNodes = [] # list to hold the last seen nodes -surveyTracker, tictactoeTracker, hamtestTracker, hangmanTracker, golfTracker, mastermindTracker, vpTracker, blackjackTracker, lemonadeTracker, dwPlayerTracker, jackTracker = [], [], [], [], [], [], [], [], [], [], [] # game trackers cmdHistory = [] # list to hold the command history for lheard and history commands msg_history = [] # list to hold the message history for the messages command max_bytes = 200 # Meshtastic has ~237 byte limit, use conservative 200 bytes for message content voxMsgQueue = [] # queue for VOX detected messages +# Game trackers +surveyTracker = [] # Survey game tracker +tictactoeTracker = [] # TicTacToe game tracker +hamtestTracker = [] # Ham radio test tracker +hangmanTracker = [] # Hangman game tracker +golfTracker = [] # GolfSim game tracker +mastermindTracker = [] # Mastermind game tracker +vpTracker = [] # Video Poker game tracker +jackTracker = [] # Blackjack game tracker +lemonadeTracker = [] # Lemonade Stand game tracker +dwPlayerTracker = [] # DopeWars player tracker +jackTracker = [] # Jack game tracker +mindTracker = [] # Mastermind (mmind) game tracker # Read the config file, if it does not exist, create basic config file config = configparser.ConfigParser()