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

36
main.py
View file

@ -1,11 +1,14 @@
import asyncio
import json
import re
import sys
import time
import warnings
from datetime import datetime, timezone
from json import JSONDecodeError
from web3 import Web3
from web3.exceptions import BlockNotFound
from web3_multi_provider import FallbackProvider
from common import *
@ -46,24 +49,33 @@ def load_chat(latest_block):
})
loop = asyncio.new_event_loop()
asyncio.set_event_loop(loop)
while True:
try:
asyncio.run(keep_chat_updated(event_filter, 2))
except KeyboardInterrupt:
break
def output_line(log):
def output_line(event):
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)
except Exception as e:
logging.error(e)
return
if decoded_data[0]['args']['Aura'] and decoded_data[0]['args']['Soul']:
# get the block and save it to cache
block_number = tx_receipt['blockNumber']
if block_number not in block_cache:
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
message = "{}:{} {}".format(decoded_data[0]['args']['Soul'], decoded_data[0]['args']['Aura'], decoded_data[0]['args']['LogLine'])
@ -78,6 +90,9 @@ def output_line(log):
if __name__ == '__main__':
while True:
try:
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)
@ -94,10 +109,10 @@ if __name__ == '__main__':
open(room_file, 'w').write(json.dumps(room))
log_file = "{}/logs/{}.log".format(os.getenv('DATA_FOLDER'), "VOID")
# grab the entire log if the log file doesn't exist
latest_block = web3.eth.get_block('latest')
if not room['preloaded']:
if os.path.exists(log_file):
os.remove(log_file)
latest_block = web3.eth.get_block('latest')
block_cache[latest_block.number] = latest_block
start_block_number = os.getenv('START_BLOCK')
preload_chat(start_block_number, latest_block.number)
@ -113,6 +128,13 @@ if __name__ == '__main__':
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)