fixed blocks loading from last line in logs and added resilience
This commit is contained in:
parent
639d60cdcf
commit
31e13633ae
1 changed files with 66 additions and 44 deletions
110
main.py
110
main.py
|
|
@ -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)
|
||||||
|
|
|
||||||
Loading…
Reference in a new issue