fixed blocks loading from last line in logs and added resilience

This commit is contained in:
Alexander 2024-08-24 16:11:48 -04:00
parent 639d60cdcf
commit 31e13633ae

110
main.py
View file

@ -1,11 +1,14 @@
import asyncio import asyncio
import json import json
import re import re
import sys
import time
import warnings import warnings
from datetime import datetime, timezone from datetime import datetime, timezone
from json import JSONDecodeError from json import JSONDecodeError
from web3 import Web3 from web3 import Web3
from web3.exceptions import BlockNotFound
from web3_multi_provider import FallbackProvider from web3_multi_provider import FallbackProvider
from common import * from common import *
@ -46,24 +49,33 @@ def load_chat(latest_block):
}) })
loop = asyncio.new_event_loop() loop = asyncio.new_event_loop()
asyncio.set_event_loop(loop) asyncio.set_event_loop(loop)
while True: asyncio.run(keep_chat_updated(event_filter, 2))
try:
asyncio.run(keep_chat_updated(event_filter, 2))
except KeyboardInterrupt:
break
def output_line(log): def output_line(event):
try: try:
tx_receipt = web3.eth.get_transaction_receipt(log.transactionHash) tx_receipt = web3.eth.get_transaction_receipt(event.transactionHash)
decoded_data = log_contract.events.LogEvent().process_receipt(tx_receipt) decoded_data = log_contract.events.LogEvent().process_receipt(tx_receipt)
except Exception as e: except Exception as e:
logging.error(e)
return return
if decoded_data[0]['args']['Aura'] and decoded_data[0]['args']['Soul']: if decoded_data[0]['args']['Aura'] and decoded_data[0]['args']['Soul']:
# get the block and save it to cache # get the block and save it to cache
block_number = tx_receipt['blockNumber'] block_number = tx_receipt['blockNumber']
if block_number not in block_cache: if block_number not in block_cache:
block_cache[block_number] = web3.eth.get_block(block_number) attempts = 3
block_cache[block_number] = None
while attempts > 0:
try:
block_cache[block_number] = web3.eth.get_block(block_number)
except BlockNotFound:
attempts = attempts - 1
time.sleep(3)
continue
else:
break
if not block_cache[block_number]:
raise Exception("Could not get block {}".format(block_number))
# log the message and output to console # log the message and output to console
message = "{}:{} {}".format(decoded_data[0]['args']['Soul'], decoded_data[0]['args']['Aura'], decoded_data[0]['args']['LogLine']) message = "{}:{} {}".format(decoded_data[0]['args']['Soul'], decoded_data[0]['args']['Aura'], decoded_data[0]['args']['LogLine'])
@ -78,41 +90,51 @@ def output_line(log):
if __name__ == '__main__': if __name__ == '__main__':
# create the log and rooms folder if it doesn't exist while True:
os.makedirs("{}/logs/".format(os.getenv('DATA_FOLDER')), exist_ok=True) try:
os.makedirs("{}/rooms/".format(os.getenv('DATA_FOLDER')), exist_ok=True) os.system('clear')
# create the log and rooms folder if it doesn't exist
os.makedirs("{}/logs/".format(os.getenv('DATA_FOLDER')), exist_ok=True)
os.makedirs("{}/rooms/".format(os.getenv('DATA_FOLDER')), exist_ok=True)
# create the rooms file if it doesn't exist # create the rooms file if it doesn't exist
try: try:
room = json.load(open(room_file := "{}/rooms/{}.json".format(os.getenv('DATA_FOLDER'), os.getenv('CHANNEL_NAME')), 'r')) # TODO: change this to target an address room = json.load(open(room_file := "{}/rooms/{}.json".format(os.getenv('DATA_FOLDER'), os.getenv('CHANNEL_NAME')), 'r')) # TODO: change this to target an address
except (JSONDecodeError, FileNotFoundError): except (JSONDecodeError, FileNotFoundError):
room = { room = {
"label": os.getenv('CHANNEL_NAME'), "label": os.getenv('CHANNEL_NAME'),
"last_block": 0, "last_block": 0,
"preloaded": False, "preloaded": False,
} }
open(room_file, 'w').write(json.dumps(room)) open(room_file, 'w').write(json.dumps(room))
log_file = "{}/logs/{}.log".format(os.getenv('DATA_FOLDER'), "VOID") log_file = "{}/logs/{}.log".format(os.getenv('DATA_FOLDER'), "VOID")
# grab the entire log if the log file doesn't exist # grab the entire log if the log file doesn't exist
if not room['preloaded']: latest_block = web3.eth.get_block('latest')
if os.path.exists(log_file): if not room['preloaded']:
os.remove(log_file) if os.path.exists(log_file):
latest_block = web3.eth.get_block('latest') os.remove(log_file)
block_cache[latest_block.number] = latest_block block_cache[latest_block.number] = latest_block
start_block_number = os.getenv('START_BLOCK') start_block_number = os.getenv('START_BLOCK')
preload_chat(start_block_number, latest_block.number) preload_chat(start_block_number, latest_block.number)
room['preloaded'] = True room['preloaded'] = True
room['last_block'] = latest_block.number room['last_block'] = latest_block.number
else:
# print past log to console
logs = read_file_to_list(log_file)
for i, log in enumerate(logs):
if os.getenv('SHOW_AURA_AND_SOUL') != '0':
print(log)
else: else:
match = re.match(r'^.*( [\d]+:[\d]+) .*$', log) # print past log to console
if match: logs = read_file_to_list(log_file)
print(log.replace(match.group(1), '')) for i, log in enumerate(logs):
open(room_file, 'w').write(json.dumps(room)) if os.getenv('SHOW_AURA_AND_SOUL') != '0':
# check for new messages print(log)
load_chat(room['last_block']) else:
match = re.match(r'^.*( [\d]+:[\d]+) .*$', log)
if match:
print(log.replace(match.group(1), ''))
preload_chat(room['last_block'], latest_block.number)
room['last_block'] = latest_block.number
open(room_file, 'w').write(json.dumps(room))
# check for new messages
load_chat(room['last_block'])
except KeyboardInterrupt:
break
except Exception as e:
time.sleep(3)
logging.error(e)