woahLottaRefactoring

This commit is contained in:
SpudGunMan
2024-10-05 20:08:33 -07:00
parent 34077c6818
commit 726cd7d4d2
14 changed files with 330 additions and 286 deletions
View File
+21 -21
View File
@@ -4,65 +4,65 @@ import pickle # pip install pickle
# load the bbs messages from the database file
try:
with open('../bbsdb.pkl', 'rb') as f:
with open('../data/bbsdb.pkl', 'rb') as f:
bbs_messages = pickle.load(f)
except Exception as e:
try:
with open('bbsdb.pkl', 'rb') as f:
with open('data/bbsdb.pkl', 'rb') as f:
bbs_messages = pickle.load(f)
except Exception as e:
bbs_messages = "System: bbsdb.pkl not found"
bbs_messages = "System: data/bbsdb.pkl not found"
try:
with open('../bbsdm.pkl', 'rb') as f:
with open('../data/bbsdm.pkll', 'rb') as f:
bbs_dm = pickle.load(f)
except Exception as e:
try:
with open('bbsdm.pkl', 'rb') as f:
with open('data/bbsdm.pkll', 'rb') as f:
bbs_dm = pickle.load(f)
except Exception as e:
bbs_dm = "System: bbsdm.pkl not found"
bbs_dm = "System: data/bbsdm.pkll not found"
# Game HS tables
try:
with open('../lemonade_hs.pkl', 'rb') as f:
with open('../data/lemonstand.pkl', 'rb') as f:
lemon_score = pickle.load(f)
except Exception as e:
try:
with open('lemonade_hs.pkl', 'rb') as f:
with open('data/lemonstand.pkl', 'rb') as f:
lemon_score = pickle.load(f)
except Exception as e:
lemon_score = "System: lemonade_hs.pkl not found"
lemon_score = "System: data/lemonstand.pkl not found"
try:
with open('../dopewar_hs.pkl', 'rb') as f:
with open('../data/dopewar_hs.pkl', 'rb') as f:
dopewar_score = pickle.load(f)
except Exception as e:
try:
with open('dopewar_hs.pkl', 'rb') as f:
with open('data/dopewar_hs.pkl', 'rb') as f:
dopewar_score = pickle.load(f)
except Exception as e:
dopewar_score = "System: dopewar_hs.pkl not found"
dopewar_score = "System: data/dopewar_hs.pkl not found"
try:
with open('../blackjack_hs.pkl', 'rb') as f:
with open('../data/blackjack_hs.pkl', 'rb') as f:
blackjack_score = pickle.load(f)
except Exception as e:
try:
with open('blackjack_hs.pkl', 'rb') as f:
with open('data/blackjack_hs.pkl', 'rb') as f:
blackjack_score = pickle.load(f)
except Exception as e:
blackjack_score = "System: blackjack_hs.pkl not found"
blackjack_score = "System: data/blackjack_hs.pkl not found"
try:
with open('../videopoker_hs.pkl', 'rb') as f:
with open('../data/videopoker_hs.pkl', 'rb') as f:
videopoker_score = pickle.load(f)
except Exception as e:
try:
with open('videopoker_hs.pkl', 'rb') as f:
with open('data/videopoker_hs.pkl', 'rb') as f:
videopoker_score = pickle.load(f)
except Exception as e:
videopoker_score = "System: videopoker_hs.pkl not found"
videopoker_score = "System: data/videopoker_hs.pkl not found"
try:
with open('../mmind_hs.pkl', 'rb') as f:
@@ -75,14 +75,14 @@ except Exception as e:
mmind_score = "System: mmind_hs.pkl not found"
try:
with open('../golfsim_hs.pkl', 'rb') as f:
with open('../data/golfsim_hs.pkl', 'rb') as f:
golfsim_score = pickle.load(f)
except Exception as e:
try:
with open('golfsim_hs.pkl', 'rb') as f:
with open('data/golfsim_hs.pkl', 'rb') as f:
golfsim_score = pickle.load(f)
except Exception as e:
golfsim_score = "System: golfsim_hs.pkl not found"
golfsim_score = "System: data/golfsim_hs.pkl not found"
print ("\n Meshing-Around Database Admin Tool\n")
+69 -37
View File
@@ -336,62 +336,94 @@ def get_database_info():
# Get the database information
try:
with open('../lemonade_hs.pkl', 'rb') as f:
with open(os.path.join(os.path.dirname(os.path.realpath(__file__)), '..', 'data', 'lemonstand.pkl'), 'rb') as f:
lemon_score = pickle.load(f)
f.close()
except Exception as e:
print(f"Error with database: {str(e)}")
lemon_score = 'no data'
pass
with open('../dopewar_hs.pkl', 'rb') as f:
try:
with open(os.path.join(os.path.dirname(os.path.realpath(__file__)), '..', 'data', 'dopewar.pkl'), 'rb') as f:
dopewar_score = pickle.load(f)
f.close()
except Exception as e:
print(f"Error with database: {str(e)}")
dopewar_score = 'no data'
pass
with open('../blackjack_hs.pkl', 'rb') as f:
try:
with open(os.path.join(os.path.dirname(os.path.realpath(__file__)), '..', 'data', 'blackjack.pkl'), 'rb') as f:
blackjack_score = pickle.load(f)
f.close()
except Exception as e:
print(f"Error with database: {str(e)}")
blackjack_score = 'no data'
pass
with open('../videopoker_hs.pkl', 'rb') as f:
try:
with open(os.path.join(os.path.dirname(os.path.realpath(__file__)), '..', 'data', 'videopoker.pkl'), 'rb') as f:
videopoker_score = pickle.load(f)
f.close()
except Exception as e:
print(f"Error with database: {str(e)}")
videopoker_score = 'no data'
pass
with open('../mmind_hs.pkl', 'rb') as f:
try:
with open(os.path.join(os.path.dirname(os.path.realpath(__file__)), '..', 'data', 'mmind.pkl'), 'rb') as f:
mmind_score = pickle.load(f)
f.close()
with open('../golfsim_hs.pkl', 'rb') as f:
except Exception as e:
print(f"Error with database: {str(e)}")
mmind_score = 'no data'
try:
with open(os.path.join(os.path.dirname(os.path.realpath(__file__)), '..', 'data', 'golfsim.pkl'), 'rb') as f:
golfsim_score = pickle.load(f)
f.close()
except Exception as e:
print(f"Error with database: {str(e)}")
golfsim_score = 'no data'
pass
with open('../bbsdm.pkl', 'rb') as f:
bbsdm = pickle.load(f)
f.close()
with open('../bbsdb.pkl', 'rb') as f:
# Get the BBSdb and BBSdm
try:
with open(os.path.join(os.path.dirname(os.path.realpath(__file__)), '..', 'data', 'bbsdb.pkl'), 'rb') as f:
bbsdb = pickle.load(f)
f.close()
except Exception as e:
print(f"Error with database: {str(e)}")
bbsdb = []
pass
# pretty print the bbsdb
prettyBBSdb = ""
try:
for i in range(len(bbsdb)):
prettyBBSdb += f'<li>{bbsdb[i]}</li>'
except Exception as e:
print(f"Error with database: {str(e)}")
pass
# pretty print the bbsdm
prettyBBSdm = ""
try:
for i in range(len(bbsdm)):
prettyBBSdm += f'<li>{bbsdm[i]}</li>'
except Exception as e:
print(f"Error with database: {str(e)}")
pass
try:
with open(os.path.join(os.path.dirname(os.path.realpath(__file__)), '..', 'data', 'bbsdm.pkl'), 'rb') as f:
bbsdm = pickle.load(f)
except Exception as e:
print(f"Error with database: {str(e)}")
bbsdm = []
pass
# pretty print the bbsdb
prettyBBSdb = ""
try:
for i in range(len(bbsdb)):
prettyBBSdb += f'<li>{bbsdb[i]}</li>'
except Exception as e:
print(f"Error with database: {str(e)}")
pass
# pretty print the bbsdm
prettyBBSdm = ""
try:
for i in range(len(bbsdm)):
prettyBBSdm += f'<li>{bbsdm[i]}</li>'
except Exception as e:
print(f"Error with database: {str(e)}")
pass
if 'no data' in [lemon_score, dopewar_score, blackjack_score, videopoker_score, mmind_score, golfsim_score]:
database = "Error(s) Detected"
else:
database = " Online"
return {
'database': "Connected",
'database': database,
"bbsdb": prettyBBSdb,
"bbsdm": prettyBBSdm,
'lemon_score': lemon_score,
+69 -37
View File
@@ -345,62 +345,94 @@ def get_database_info():
# Get the database information
try:
with open('../lemonade_hs.pkl', 'rb') as f:
with open(os.path.join(os.path.dirname(os.path.realpath(__file__)), '..', 'data', 'lemonstand.pkl'), 'rb') as f:
lemon_score = pickle.load(f)
f.close()
except Exception as e:
print(f"Error with database: {str(e)}")
lemon_score = 'no data'
pass
with open('../dopewar_hs.pkl', 'rb') as f:
try:
with open(os.path.join(os.path.dirname(os.path.realpath(__file__)), '..', 'data', 'dopewar.pkl'), 'rb') as f:
dopewar_score = pickle.load(f)
f.close()
except Exception as e:
print(f"Error with database: {str(e)}")
dopewar_score = 'no data'
pass
with open('../blackjack_hs.pkl', 'rb') as f:
try:
with open(os.path.join(os.path.dirname(os.path.realpath(__file__)), '..', 'data', 'blackjack.pkl'), 'rb') as f:
blackjack_score = pickle.load(f)
f.close()
except Exception as e:
print(f"Error with database: {str(e)}")
blackjack_score = 'no data'
pass
with open('../videopoker_hs.pkl', 'rb') as f:
try:
with open(os.path.join(os.path.dirname(os.path.realpath(__file__)), '..', 'data', 'videopoker.pkl'), 'rb') as f:
videopoker_score = pickle.load(f)
f.close()
except Exception as e:
print(f"Error with database: {str(e)}")
videopoker_score = 'no data'
pass
with open('../mmind_hs.pkl', 'rb') as f:
try:
with open(os.path.join(os.path.dirname(os.path.realpath(__file__)), '..', 'data', 'mmind.pkl'), 'rb') as f:
mmind_score = pickle.load(f)
f.close()
with open('../golfsim_hs.pkl', 'rb') as f:
except Exception as e:
print(f"Error with database: {str(e)}")
mmind_score = 'no data'
try:
with open(os.path.join(os.path.dirname(os.path.realpath(__file__)), '..', 'data', 'golfsim.pkl'), 'rb') as f:
golfsim_score = pickle.load(f)
f.close()
except Exception as e:
print(f"Error with database: {str(e)}")
golfsim_score = 'no data'
pass
with open('../bbsdm.pkl', 'rb') as f:
bbsdm = pickle.load(f)
f.close()
with open('../bbsdb.pkl', 'rb') as f:
# Get the BBSdb and BBSdm
try:
with open(os.path.join(os.path.dirname(os.path.realpath(__file__)), '..', 'data', 'bbsdb.pkl'), 'rb') as f:
bbsdb = pickle.load(f)
f.close()
except Exception as e:
print(f"Error with database: {str(e)}")
bbsdb = []
pass
# pretty print the bbsdb
prettyBBSdb = ""
try:
for i in range(len(bbsdb)):
prettyBBSdb += f'<li>{bbsdb[i]}</li>'
except Exception as e:
print(f"Error with database: {str(e)}")
pass
# pretty print the bbsdm
prettyBBSdm = ""
try:
for i in range(len(bbsdm)):
prettyBBSdm += f'<li>{bbsdm[i]}</li>'
except Exception as e:
print(f"Error with database: {str(e)}")
pass
try:
with open(os.path.join(os.path.dirname(os.path.realpath(__file__)), '..', 'data', 'bbsdm.pkl'), 'rb') as f:
bbsdm = pickle.load(f)
except Exception as e:
print(f"Error with database: {str(e)}")
bbsdm = []
pass
# pretty print the bbsdb
prettyBBSdb = ""
try:
for i in range(len(bbsdb)):
prettyBBSdb += f'<li>{bbsdb[i]}</li>'
except Exception as e:
print(f"Error with database: {str(e)}")
pass
# pretty print the bbsdm
prettyBBSdm = ""
try:
for i in range(len(bbsdm)):
prettyBBSdm += f'<li>{bbsdm[i]}</li>'
except Exception as e:
print(f"Error with database: {str(e)}")
pass
if 'no data' in [lemon_score, dopewar_score, blackjack_score, videopoker_score, mmind_score, golfsim_score]:
database = "Error(s) Detected"
else:
database = " Online"
return {
'database': "Connected",
'database': database,
"bbsdb": prettyBBSdb,
"bbsdm": prettyBBSdm,
'lemon_score': lemon_score,
+10 -37
View File
@@ -652,46 +652,19 @@ def handle_lheard(message, nodeid, deviceID, isDM):
if "?" in message and isDM:
return message.split("?")[0].title() + " command returns a list of the nodes that have been heard recently"
else:
# display last heard nodes add to response
bot_response = str(get_node_list(1))
# gather telemetry
chutil1 = round(interface1.nodes.get(decimal_to_hex(myNodeNum1), {}).get("deviceMetrics", {}).get("channelUtilization", 0), 1)
airUtilTx = round(interface1.nodes.get(decimal_to_hex(myNodeNum1), {}).get("deviceMetrics", {}).get("airUtilTx", 0), 1)
uptimeSeconds = interface1.nodes.get(decimal_to_hex(myNodeNum1), {}).get("deviceMetrics", {}).get("uptimeSeconds", 0)
batteryLevel = interface1.nodes.get(decimal_to_hex(myNodeNum1), {}).get("deviceMetrics", {}).get("batteryLevel", 0)
voltage = interface1.nodes.get(decimal_to_hex(myNodeNum1), {}).get("deviceMetrics", {}).get("voltage", 0)
if interface2_enabled:
bot_response += "P2:\n" + str(get_node_list(2))
chutil2 = round(interface2.nodes.get(decimal_to_hex(myNodeNum2), {}).get("deviceMetrics", {}).get("channelUtilization", 0), 1)
airUtilTx2 = round(interface2.nodes.get(decimal_to_hex(myNodeNum2), {}).get("deviceMetrics", {}).get("airUtilTx", 0), 1)
uptimeSeconds2 = interface2.nodes.get(decimal_to_hex(myNodeNum2), {}).get("deviceMetrics", {}).get("uptimeSeconds", 0)
batteryLevel2 = interface2.nodes.get(decimal_to_hex(myNodeNum2), {}).get("deviceMetrics", {}).get("batteryLevel", 0)
voltage2 = interface2.nodes.get(decimal_to_hex(myNodeNum2), {}).get("deviceMetrics", {}).get("voltage", 0)
else:
chutil2, airUtilTx2, uptimeSeconds2, batteryLevel2, voltage2 = 0, 0, 0, 0, 0
# add the channel utilization and airUtilTx to the bot response
bot_response += "\nUse/Tx " + str(chutil1) + "%" + "/" + str(airUtilTx) + "%"
if interface2_enabled:
bot_response += " P2:" + str(chutil2) + "%" + "/" + str(airUtilTx2) + "%"
# convert uptime to minutes, hours, or days
uptimeSeconds = getPrettyTime(uptimeSeconds)
uptimeSeconds2 = getPrettyTime(uptimeSeconds2)
# add uptime and battery info to the bot response
bot_response += "\nUptime:" + str(uptimeSeconds)
if interface2_enabled:
bot_response += f" P2:" + {uptimeSeconds2}
# add battery info to the bot response
emji = "🔌" if batteryLevel == 101 else "🪫" if batteryLevel < 10 else "🔋"
emji2 = "🔌" if batteryLevel2 == 101 else "🪫" if batteryLevel2 < 10 else "🔋"
if not batteryLevel == 101:
bot_response += f" {emji}{batteryLevel}% Volt:{voltage}"
if interface2_enabled and not batteryLevel2 == 101:
bot_response += f" P2:{emji2}{batteryLevel2}% Volt:{voltage2}"
# display last heard nodes add to response
bot_response = "Last Heard\n"
bot_response += str(get_node_list(1))
# show last users of the bot with the cmdHistory list
history = handle_history(message, nodeid, deviceID, isDM, lheard=True)
if history:
bot_response += f'\n{history}'
bot_response += f'LastSeen\n{history}'
else:
# trim the last \n
bot_response = bot_response[:-1]
# bot_response += getNodeTelemetry(deviceID)
return bot_response
def handle_history(message, nodeid, deviceID, isDM, lheard=False):
+10 -10
View File
@@ -14,19 +14,19 @@ def load_bbsdb():
global bbs_messages
# load the bbs messages from the database file
try:
with open('bbsdb.pkl', 'rb') as f:
with open('data/bbsdb.pkl', 'rb') as f:
bbs_messages = pickle.load(f)
except Exception as e:
bbs_messages = [[1, "Welcome to meshBBS", "Welcome to the BBS, please post a message!",0]]
logger.debug("System: Creating new bbsdb.pkl")
with open('bbsdb.pkl', 'wb') as f:
logger.debug("System: Creating new data/bbsdb.pkl")
with open('data/bbsdb.pkl', 'wb') as f:
pickle.dump(bbs_messages, f)
def save_bbsdb():
global bbs_messages
# save the bbs messages to the database file
logger.debug("System: Saving bbsdb.pkl")
with open('bbsdb.pkl', 'wb') as f:
logger.debug("System: Saving data/bbsdb.pkl")
with open('data/bbsdb.pkl', 'wb') as f:
pickle.dump(bbs_messages, f)
def bbs_help():
@@ -100,20 +100,20 @@ def bbs_read_message(messageID = 0):
def save_bbsdm():
global bbs_dm
# save the bbs messages to the database file
logger.debug("System: Saving Updated BBS Direct Messages bbsdm.pkl")
with open('bbsdm.pkl', 'wb') as f:
logger.debug("System: Saving Updated BBS Direct Messages data/bbsdm.pkll")
with open('data/bbsdm.pkll', 'wb') as f:
pickle.dump(bbs_dm, f)
def load_bbsdm():
global bbs_dm
# load the bbs messages from the database file
try:
with open('bbsdm.pkl', 'rb') as f:
with open('data/bbsdm.pkll', 'rb') as f:
bbs_dm = pickle.load(f)
except:
bbs_dm = [[1234567890, "Message", 1234567890]]
logger.debug("System: Creating new bbsdm.pkl")
with open('bbsdm.pkl', 'wb') as f:
logger.debug("System: Creating new data/bbsdm.pkll")
with open('data/bbsdm.pkll', 'wb') as f:
pickle.dump(bbs_dm, f)
def bbs_post_dm(toNode, message, fromNode):
+6 -6
View File
@@ -210,22 +210,22 @@ def saveHSJack(nodeID, highScore):
# Save the game state to pickle
highScore = {'nodeID': nodeID, 'highScore': highScore}
try:
with open('blackjack_hs.pkl', 'wb') as file:
with open('data/blackjack_hs.pkl', 'wb') as file:
pickle.dump(highScore, file)
except FileNotFoundError:
logger.debug("System: BlackJack: Creating new blackjack_hs.pkl file")
with open('blackjack_hs.pkl', 'wb') as file:
logger.debug("System: BlackJack: Creating new data/blackjack_hs.pkl file")
with open('data/blackjack_hs.pkl', 'wb') as file:
pickle.dump(highScore, file)
def loadHSJack():
try:
with open('blackjack_hs.pkl', 'rb') as file:
with open('data/blackjack_hs.pkl', 'rb') as file:
highScore = pickle.load(file)
return highScore
except FileNotFoundError:
logger.debug("System: BlackJack: Creating new blackjack_hs.pkl file")
logger.debug("System: BlackJack: Creating new data/blackjack_hs.pkl file")
highScore = {'nodeID': 0, 'highScore': 0}
with open('blackjack_hs.pkl', 'wb') as file:
with open('data/blackjack_hs.pkl', 'wb') as file:
pickle.dump(highScore, file)
return 0
+3 -3
View File
@@ -390,7 +390,7 @@ def endGameDw(nodeID):
# checks if the player's score is higher than the high score and writes a new high score if it is
if cash > dwHighScore.get('cash'):
dwHighScore = ({'userID': nodeID, 'cash': round(cash, 2)})
with open('dopewar_hs.pkl', 'wb') as file:
with open('data/dopewar_hs.pkl', 'wb') as file:
pickle.dump(dwHighScore, file)
msg = "You finished with $" + str(cash) + " and beat the high score!🎉💰"
return msg
@@ -409,14 +409,14 @@ def getHighScoreDw():
global dwHighScore
# Load high score table
try:
with open('dopewar_hs.pkl', 'rb') as file:
with open('data/dopewar_hs.pkl', 'rb') as file:
dwHighScore = pickle.load(file)
except FileNotFoundError:
logger.debug("System: DopeWars: No high score table found")
# high score pickle file is a touple of the nodeID and the high score
dwHighScore = ({"userID": 4258675309, "cash": 100})
# write a new high score file if one is not found
with open('dopewar_hs.pkl', 'wb') as file:
with open('data/dopewar_hs.pkl', 'wb') as file:
pickle.dump(dwHighScore, file)
return dwHighScore
+3 -3
View File
@@ -102,12 +102,12 @@ def getScorecardGolf(scorecard):
def getHighScoreGolf(nodeID, strokes, par):
# check if player is in high score list
try:
with open('golfsim_hs.pkl', 'rb') as f:
with open('data/golfsim_hs.pkl', 'rb') as f:
golfHighScore = pickle.load(f)
except:
logger.debug("System: GolfSim: High Score file not found.")
golfHighScore = [{'nodeID': nodeID, 'strokes': strokes, 'par': par}]
with open('golfsim_hs.pkl', 'wb') as f:
with open('data/golfsim_hs.pkl', 'wb') as f:
pickle.dump(golfHighScore, f)
if strokes < golfHighScore[0]['strokes']:
@@ -115,7 +115,7 @@ def getHighScoreGolf(nodeID, strokes, par):
golfHighScore[0]['nodeID'] = nodeID
golfHighScore[0]['strokes'] = strokes
golfHighScore[0]['par'] = par
with open('golfsim_hs.pkl', 'wb') as f:
with open('data/golfsim_hs.pkl', 'wb') as f:
pickle.dump(golfHighScore, f)
return golfHighScore
+3 -3
View File
@@ -41,12 +41,12 @@ def getHighScoreLemon():
high_score = {"userID": 0, "cash": 0, "success": 0}
# Load high score table
try:
with open('lemonade_hs.pkl', 'rb') as file:
with open('data/lemonstand.pkl', 'rb') as file:
high_score = pickle.load(file)
except FileNotFoundError:
logger.debug("System: Lemonade: No high score table found")
# write a new high score file if one is not found
with open('lemonade_hs.pkl', 'wb') as file:
with open('data/lemonstand.pkl', 'wb') as file:
pickle.dump(high_score, file)
return high_score
@@ -548,7 +548,7 @@ def start_lemonade(nodeID, message, celsius=False):
high_score['cash'] = inventory.cash
high_score['success'] = success
high_score['userID'] = nodeID
with open('lemonade_hs.pkl', 'wb') as file:
with open('data/lemonstand.pkl', 'wb') as file:
pickle.dump(high_score, file)
endGame(nodeID)
+1 -1
View File
@@ -248,7 +248,7 @@ def playGameMMind(diff, secret_code, turn_count, nodeID, message):
if high_score != 0:
msg += f"\n🏆 High Score:{high_score[0]['turns']} turns, Difficulty:{high_score[0]['diff'].upper()}"
msg += "\nWould you like to play again?\n(N)ormal, (H)ard, e(X)pert?"
msg += "\nWould you like to play again?\n(N)ormal, (H)ard, e(X)pert (E)nd?"
# reset turn count in tracker
for i in range(len(mindTracker)):
if mindTracker[i]['nodeID'] == nodeID:
+6 -6
View File
@@ -276,23 +276,23 @@ def saveHSVp(nodeID, highScore):
# Save the game high_score to pickle
highScore = {'nodeID': nodeID, 'highScore': highScore}
try:
with open('videopoker_hs.pkl', 'wb') as file:
with open('data/videopoker_hs.pkl', 'wb') as file:
pickle.dump(highScore, file)
except FileNotFoundError:
logger.debug("System: BlackJack: Creating new videopoker_hs.pkl file")
with open('videopoker_hs.pkl', 'wb') as file:
logger.debug("System: BlackJack: Creating new data/videopoker_hs.pkl file")
with open('data/videopoker_hs.pkl', 'wb') as file:
pickle.dump(highScore, file)
def loadHSVp():
# Load the game high_score from pickle
try:
with open('videopoker_hs.pkl', 'rb') as file:
with open('data/videopoker_hs.pkl', 'rb') as file:
highScore = pickle.load(file)
return highScore
except FileNotFoundError:
logger.debug("System: VideoPoker: Creating new videopoker_hs.pkl file")
logger.debug("System: VideoPoker: Creating new data/videopoker_hs.pkl file")
highScore = {'nodeID': 0, 'highScore': 0}
with open('videopoker_hs.pkl', 'wb') as file:
with open('data/videopoker_hs.pkl', 'wb') as file:
pickle.dump(highScore, file)
return 0
+2 -2
View File
@@ -55,7 +55,7 @@ if 'location' not in config:
config.write(open(config_file, 'w'))
if 'bbs' not in config:
config['bbs'] = {'enabled': 'False', 'bbsdb': 'bbsdb.pkl', 'bbs_ban_list': '', 'bbs_admin_list': ''}
config['bbs'] = {'enabled': 'False', 'bbsdb': 'data/bbsdb.pkl', 'bbs_ban_list': '', 'bbs_admin_list': ''}
config.write(open(config_file, 'w'))
if 'repeater' not in config:
@@ -134,7 +134,7 @@ try:
# bbs
bbs_enabled = config['bbs'].getboolean('enabled', False)
bbsdb = config['bbs'].get('bbsdb', 'bbsdb.pkl')
bbsdb = config['bbs'].get('bbsdb', 'data/bbsdb.pkl')
bbs_ban_list = config['bbs'].get('bbs_ban_list', '').split(',')
bbs_admin_list = config['bbs'].get('bbs_admin_list', '').split(',')
+127 -120
View File
@@ -643,6 +643,85 @@ def messageTrap(msg):
return True
return False
def getNodeFirmware(nodeID=0, nodeInt=1):
# get the firmware version of the node
# this is a workaround because .localNode.getMetadata spits out a lot of debug info which cant be suppressed
# Create a StringIO object to capture the
if nodeInt == 1:
output_capture = io.StringIO()
with contextlib.redirect_stdout(output_capture):
interface1.localNode.getMetadata()
console_output = output_capture.getvalue()
if "firmware_version" in console_output:
fwVer = console_output.split("firmware_version: ")[1].split("\n")[0]
elif nodeInt == 2:
output_capture = io.StringIO()
with contextlib.redirect_stdout(output_capture):
interface2.localNode.getMetadata()
console_output = output_capture.getvalue()
if "firmware_version" in console_output:
fwVer = console_output.split("firmware_version: ")[1].split("\n")[0]
else:
return -1
return fwVer
def getNodeTelemetry(nodeID=0, nodeInt=1):
dataResponse = ""
# get the telemetry data for a node
if nodeInt == 1:
chutil = round(interface1.nodes.get(decimal_to_hex(myNodeNum1), {}).get("deviceMetrics", {}).get("channelUtilization", 0), 1)
airUtilTx = round(interface1.nodes.get(decimal_to_hex(myNodeNum1), {}).get("deviceMetrics", {}).get("airUtilTx", 0), 1)
uptimeSeconds = interface1.nodes.get(decimal_to_hex(myNodeNum1), {}).get("deviceMetrics", {}).get("uptimeSeconds", 0)
batteryLevel = interface1.nodes.get(decimal_to_hex(myNodeNum1), {}).get("deviceMetrics", {}).get("batteryLevel", 0)
voltage = interface1.nodes.get(decimal_to_hex(myNodeNum1), {}).get("deviceMetrics", {}).get("voltage", 0)
elif nodeInt == 2:
chutil = round(interface2.nodes.get(decimal_to_hex(myNodeNum2), {}).get("deviceMetrics", {}).get("channelUtilization", 0), 1)
airUtilTx = round(interface2.nodes.get(decimal_to_hex(myNodeNum2), {}).get("deviceMetrics", {}).get("airUtilTx", 0), 1)
uptimeSeconds = interface2.nodes.get(decimal_to_hex(myNodeNum2), {}).get("deviceMetrics", {}).get("uptimeSeconds", 0)
batteryLevel = interface2.nodes.get(decimal_to_hex(myNodeNum2), {}).get("deviceMetrics", {}).get("batteryLevel", 0)
voltage = interface2.nodes.get(decimal_to_hex(myNodeNum2), {}).get("deviceMetrics", {}).get("voltage", 0)
else:
return -1
# Channel utilization and airUtilTx
dataResponse += " ChUse/Tx " + str(chutil) + "%" + "/" + str(airUtilTx) + "%" + " "
# Uptime
uptimeSeconds = getPrettyTime(uptimeSeconds)
dataResponse += " Uptime:" + str(uptimeSeconds)
# add battery info to the response
emji = "🔌" if batteryLevel == 101 else "🪫" if batteryLevel < 10 else "🔋"
if batteryLevel == 101:
dataResponse += f" {emji}Volt:{voltage}"
else:
dataResponse += f" {emji}{batteryLevel}% Volt:{voltage}"
return dataResponse
def handleMultiPing(nodeID=0, deviceID=1):
global multiPingList
if len(multiPingList) > 1:
mPlCpy = multiPingList.copy()
for i in range(len(mPlCpy)):
message_id_from = mPlCpy[i]['message_from_id']
count = mPlCpy[i]['count']
type = mPlCpy[i]['type']
deviceID = mPlCpy[i]['deviceID']
if count > 1 and deviceID == 1:
count -= 1
# update count in the list
multiPingList[i]['count'] = count
send_message(f"🔂{count} {type}", publicChannel, message_id_from, 1)
if count < 2:
# remove the item from the list
for j in range(len(multiPingList)):
if multiPingList[j]['message_from_id'] == message_id_from:
multiPingList.pop(j)
break
def exit_handler():
# Close the interface and save the BBS messages
logger.debug(f"System: Closing Autoresponder")
@@ -721,7 +800,6 @@ async def retry_interface(nodeID=1):
except Exception as e:
logger.error(f"System: closing interface2: {e}")
logger.debug(f"System: Retrying interface in 15 seconds")
if max_retry_count1 == 0:
logger.critical(f"System: Max retry count reached for interface1")
@@ -763,84 +841,56 @@ async def retry_interface(nodeID=1):
except Exception as e:
logger.error(f"System: opening interface2: {e}")
async def watchdog():
global retry_int1, retry_int2, multiPingList, int1_version, int2_version
int1_version = ''
int2_version = ''
if sentry_enabled:
async def handleSentinel(deviceID=1, loop=0):
# Locate Closest Nodes and report them to a secure channel
# async function for possibly demanding back location data
sentry_loop = loop
lastSpotted = ""
enemySpotted = ""
try:
closest_nodes = get_closest_nodes(deviceID)
if closest_nodes != ERROR_FETCHING_DATA:
if closest_nodes[0]['id'] is not None:
enemySpotted = get_name_from_number(closest_nodes[0]['id'], 'long', 1)
enemySpotted += ", " + get_name_from_number(closest_nodes[0]['id'], 'short', 1)
enemySpotted += ", " + str(closest_nodes[0]['id'])
enemySpotted += ", " + decimal_to_hex(closest_nodes[0]['id'])
enemySpotted += f" at {closest_nodes[0]['distance']}m"
except Exception as e:
pass
if sentry_loop >= sentry_holdoff and lastSpotted != enemySpotted:
logger.warning(f"System: {enemySpotted} is close to your location on Interface1")
send_message(f"Sentry1: {enemySpotted}", secure_channel, 0, deviceID)
sentry_loop = 0
lastSpotted = ""
enemySpotted = ""
sentry_loop2 = 0
lastSpotted2 = ""
enemySpotted2 = ""
# watchdog for connection to the interface
lastSpotted = enemySpotted
else:
sentry_loop += 1
async def watchdog():
global retry_int1, retry_int2, int1Data, int2Data
while True:
await asyncio.sleep(20)
#print(f"MeshBot System: watchdog running\r", end="")
if interface1 is not None and not retry_int1:
# getmetadata request to check if the interface is still connected
# getting firmware is a heartbeat to check if the interface is still connected
try:
# this is a workaround because .localNode.getMetadata spits out a lot of debug info which cant be suppressed
# Create a StringIO object to capture the output
output_capture = io.StringIO()
with contextlib.redirect_stdout(output_capture):
interface1.localNode.getMetadata()
console_output = output_capture.getvalue()
if "firmware_version" in console_output and int1_version == '':
int1_version = console_output.split("firmware_version: ")[1].split("\n")[0]
logger.debug(f"System: Interface1 Node Firmware: {int1_version}")
firmware = getNodeFirmware(0, 1)
except Exception as e:
logger.error(f"System: communicating with interface1, trying to reconnect: {e}")
retry_int1 = True
# Locate Closest Nodes and report them to a secure channel
if sentry_enabled:
try:
closest_nodes1 = get_closest_nodes(1)
if closest_nodes1 != ERROR_FETCHING_DATA:
if closest_nodes1[0]['id'] is not None:
enemySpotted = get_name_from_number(closest_nodes1[0]['id'], 'long', 1)
enemySpotted += ", " + get_name_from_number(closest_nodes1[0]['id'], 'short', 1)
enemySpotted += ", " + str(closest_nodes1[0]['id'])
enemySpotted += ", " + decimal_to_hex(closest_nodes1[0]['id'])
enemySpotted += f" at {closest_nodes1[0]['distance']}m"
except Exception as e:
pass
if sentry_loop >= sentry_holdoff and lastSpotted != enemySpotted:
logger.warning(f"System: {enemySpotted} is close to your location on Interface1")
send_message(f"Sentry1: {enemySpotted}", secure_channel, 0, 1)
if interface2_enabled:
await asyncio.sleep(1.5)
send_message(f"Sentry1: {enemySpotted}", secure_channel, 0, 2)
sentry_loop = 0
lastSpotted = enemySpotted
else:
sentry_loop += 1
# multiPing handler
if len(multiPingList) > 1:
mPlCpy = multiPingList.copy()
for i in range(len(mPlCpy)):
message_id_from = mPlCpy[i]['message_from_id']
count = mPlCpy[i]['count']
type = mPlCpy[i]['type']
deviceID = mPlCpy[i]['deviceID']
if not retry_int1:
# Locate Closest Nodes and report them to a secure channel
if sentry_enabled:
await handleSentinel(1)
if count > 1 and deviceID == 1:
count -= 1
# update count in the list
multiPingList[i]['count'] = count
# multiPing handler
handleMultiPing(0,1)
send_message(f"🔂{count} {type}", publicChannel, message_id_from, 1)
if count < 2:
# remove the item from the list
for j in range(len(multiPingList)):
if multiPingList[j]['message_from_id'] == message_id_from:
multiPingList.pop(j)
break
# status data
int1Data = f" int1:{firmware}, Nodes:{len(interface1.nodes)}, Telemetry:{getNodeTelemetry(0, 1)}"
if retry_int1:
try:
@@ -850,66 +900,23 @@ async def watchdog():
if interface2_enabled:
if interface2 is not None and not retry_int2:
# getting firmware is a heartbeat to check if the interface is still connected
try:
# this is a workaround because .localNode.getMetadata spits out a lot of debug info which cant be suppressed
# Create a StringIO object to capture the output
output_capture = io.StringIO()
with contextlib.redirect_stdout(output_capture):
interface2.localNode.getMetadata()
console_output = output_capture.getvalue()
if "firmware_version" in console_output and int2_version == '':
int2_version = console_output.split("firmware_version: ")[1].split("\n")[0]
logger.debug(f"System: Interface2 Node Firmware: {int2_version}")
firmware2 = getNodeFirmware(0, 1)
except Exception as e:
logger.error(f"System: communicating with interface2, trying to reconnect: {e}")
logger.error(f"System: communicating with interface1, trying to reconnect: {e}")
retry_int2 = True
# Locate Closest Nodes and report them to a secure channel
if sentry_enabled:
try:
closest_nodes2 = get_closest_nodes(2)
if closest_nodes2 != ERROR_FETCHING_DATA:
if closest_nodes2[0]['id'] is not None:
enemySpotted2 = get_name_from_number(closest_nodes2[0]['id'], 'long', 2)
enemySpotted2 += ", " + get_name_from_number(closest_nodes2[0]['id'], 'short', 2)
enemySpotted2 += ", " + str(closest_nodes2[0]['id'])
enemySpotted2 += ", " + decimal_to_hex(closest_nodes2[0]['id'])
enemySpotted2 += f" at {closest_nodes2[0]['distance']}m"
except Exception as e:
pass
if sentry_loop2 >= sentry_holdoff and lastSpotted2 != enemySpotted2:
logger.warning(f"System: {enemySpotted2} is close to your location on Interface2")
# send to secure channel on both interfaces
send_message(f"Sentry2: {enemySpotted2}", secure_channel, 0, 1)
await asyncio.sleep(1.5)
send_message(f"Sentry2: {enemySpotted2}", secure_channel, 0, 2)
sentry_loop2 = 0
lastSpotted2 = enemySpotted2
else:
sentry_loop2 += 1
# multiPing handler
if len(multiPingList) > 1:
mPlCpy = multiPingList.copy()
for i in range(len(mPlCpy)):
message_id_from = mPlCpy[i]['message_from_id']
count = mPlCpy[i]['count']
type = mPlCpy[i]['type']
deviceID = mPlCpy[i]['deviceID']
if not retry_int2:
# Locate Closest Nodes and report them to a secure channel
if sentry_enabled:
handleSentinel(2)
if count > 1 and deviceID == 2:
count -= 1
# update count in the list
multiPingList[i]['count'] = count
# multiPing handler
handleMultiPing(0,2)
send_message(f"🔂{count} {type}", publicChannel, message_id_from, 2)
if count < 2:
# remove the item from the list
for j in range(len(multiPingList)):
if multiPingList[j]['message_from_id'] == message_id_from:
multiPingList.pop(j)
break
# status data
int2Data = f" int2:{firmware2}, Nodes:{len(interface2.nodes)}, Telemetry:{getNodeTelemetry(0, 2)}"
if retry_int2:
try: