From 35c8dc6f70c1f745dd5cb661444e30041db1a75b Mon Sep 17 00:00:00 2001 From: SpudGunMan Date: Fri, 10 Oct 2025 00:36:22 -0700 Subject: [PATCH] resetLeaderboard --- mesh_bot.py | 2 +- modules/system.py | 73 ++++++++++++++++++++++------------------------- 2 files changed, 35 insertions(+), 40 deletions(-) diff --git a/mesh_bot.py b/mesh_bot.py index 5b5cf52..51b2745 100755 --- a/mesh_bot.py +++ b/mesh_bot.py @@ -63,7 +63,7 @@ def auto_response(message, snr, rssi, hop, pkiStatus, message_from_id, channel_n "howfar": lambda: handle_howfar(message, message_from_id, deviceID, isDM), "howtall": lambda: handle_howtall(message, message_from_id, deviceID, isDM), "joke": lambda: tell_joke(message_from_id), - "leaderboard": lambda: get_mesh_leaderboard(), + "leaderboard": lambda: get_mesh_leaderboard(message, message_from_id, deviceID), "lemonstand": lambda: handleLemonade(message, message_from_id, deviceID), "lheard": lambda: handle_lheard(message, message_from_id, deviceID, isDM), "mastermind": lambda: handleMmind(message, message_from_id, deviceID), diff --git a/modules/system.py b/modules/system.py index ec7d801..6f4f275 100644 --- a/modules/system.py +++ b/modules/system.py @@ -1059,25 +1059,28 @@ def displayNodeTelemetry(nodeID=0, rxNode=0, userRequested=False): return dataResponse positionMetadata = {} +meshLeaderboard = {} +def initializeMeshLeaderboard(): + global meshLeaderboard + # Leaderboard for tracking extreme metrics, if changed update loadLeaderboard + meshLeaderboard = { + 'lowestBattery': {'nodeID': None, 'value': 101, 'timestamp': 0}, # đŸĒĢ + 'longestUptime': {'nodeID': None, 'value': 0, 'timestamp': 0}, # đŸ•°ī¸ + 'fastestSpeed': {'nodeID': None, 'value': 0, 'timestamp': 0}, # 🚓 + 'highestAltitude': {'nodeID': None, 'value': 0, 'timestamp': 0}, # 🚀 + 'coldestTemp': {'nodeID': None, 'value': 999, 'timestamp': 0}, # đŸĨļ + 'hottestTemp': {'nodeID': None, 'value': -999, 'timestamp': 0}, # đŸĨĩ + 'worstAirQuality': {'nodeID': None, 'value': 0, 'timestamp': 0}, # 💨 + 'mostMessages': {'nodeID': None, 'value': 0, 'timestamp': 0}, # đŸ’Ŧ + 'highestDBm': {'nodeID': None, 'value': -999, 'timestamp': 0}, # đŸ“ļ + 'weakestDBm': {'nodeID': None, 'value': 999, 'timestamp': 0}, # đŸ“ļ + 'mostReactions': {'nodeID': None, 'value': 0, 'timestamp': 0}, # â¤ī¸ + 'adminPackets': [], # 🚨 + 'tunnelPackets': [], # 🚨 + 'audioPackets': [], # â˜Žī¸ + 'simulatorPackets': [] # 🤖 + } -# Leaderboard for tracking extreme metrics, if changed update loadLeaderboard -meshLeaderboard = { - 'lowestBattery': {'nodeID': None, 'value': 101, 'timestamp': 0}, # đŸĒĢ - 'longestUptime': {'nodeID': None, 'value': 0, 'timestamp': 0}, # đŸ•°ī¸ - 'fastestSpeed': {'nodeID': None, 'value': 0, 'timestamp': 0}, # 🚓 - 'highestAltitude': {'nodeID': None, 'value': 0, 'timestamp': 0}, # 🚀 - 'coldestTemp': {'nodeID': None, 'value': 999, 'timestamp': 0}, # đŸĨļ - 'hottestTemp': {'nodeID': None, 'value': -999, 'timestamp': 0}, # đŸĨĩ - 'worstAirQuality': {'nodeID': None, 'value': 0, 'timestamp': 0}, # 💨 - 'mostMessages': {'nodeID': None, 'value': 0, 'timestamp': 0}, # đŸ’Ŧ - 'highestDBm': {'nodeID': None, 'value': -999, 'timestamp': 0}, # đŸ“ļ - 'weakestDBm': {'nodeID': None, 'value': 999, 'timestamp': 0}, # đŸ“ļ - 'mostReactions': {'nodeID': None, 'value': 0, 'timestamp': 0}, # â¤ī¸ - 'adminPackets': [], # 🚨 - 'tunnelPackets': [], # 🚨 - 'audioPackets': [], # â˜Žī¸ - 'simulatorPackets': [] # 🤖 -} def consumeMetadata(packet, rxNode=0, channel=-1): global positionMetadata, telemetryData, meshLeaderboard uptime = battery = temp = iaq = nodeID = 0 @@ -1431,41 +1434,33 @@ def saveLeaderboard(): logger.warning(f"System: Error saving Mesh Leaderboard: {e}") def loadLeaderboard(): - # load the meshLeaderboard from a pickle file global meshLeaderboard try: with open('data/leaderboard.pkl', 'rb') as f: meshLeaderboard = pickle.load(f) + # Ensure all keys from the default exist + defaults = {} + initializeMeshLeaderboard() + defaults.update(meshLeaderboard) # loaded values overwrite defaults + meshLeaderboard = defaults if logMetaStats: logger.debug("System: Mesh Leaderboard loaded from leaderboard.pkl") - # Ensure leaderboard keys exist (for versioning/migrations) - if 'mostMessages' not in meshLeaderboard: - meshLeaderboard['mostMessages'] = {'nodeID': None, 'value': 0, 'timestamp': 0} - if 'highestDBm' not in meshLeaderboard: - meshLeaderboard['highestDBm'] = {'nodeID': None, 'value': -999, 'timestamp': 0} - if 'weakestDBm' not in meshLeaderboard: - meshLeaderboard['weakestDBm'] = {'nodeID': None, 'value': 999, 'timestamp': 0} except FileNotFoundError: if logMetaStats: logger.debug("System: No existing Mesh Leaderboard found, starting fresh") + initializeMeshLeaderboard() except Exception as e: logger.warning(f"System: Error loading Mesh Leaderboard: {e}") - # Ensure 'mostMessages' exists (versioning issues) - if 'mostMessages' not in meshLeaderboard: - meshLeaderboard['mostMessages'] = {'nodeID': None, 'value': 0, 'timestamp': 0} - # Ensure 'highestDBm' exists (versioning issues) - if 'highestDBm' not in meshLeaderboard: - meshLeaderboard['highestDBm'] = {'nodeID': None, 'value': -999, 'timestamp': 0} - # Ensure 'weakestDBm' exists (versioning issues) - if 'weakestDBm' not in meshLeaderboard: - meshLeaderboard['weakestDBm'] = {'nodeID': None, 'value': 999, 'timestamp': 0} - -def get_mesh_leaderboard(): + initializeMeshLeaderboard() +def get_mesh_leaderboard(msg, fromID, deviceID): """Get formatted leaderboard of extreme mesh metrics""" global meshLeaderboard - result = "📊 Leaderboard 📊\n" - + + if "reset" in msg.lower() and str(fromID) in bbs_admin_list: + initializeMeshLeaderboard() + return "✅ Leaderboard has been reset.\n" + # Lowest battery if meshLeaderboard['lowestBattery']['nodeID']: nodeID = meshLeaderboard['lowestBattery']['nodeID']