Works well enough to start framing into an API for front-end dev for now.
This commit is contained in:
parent
bde9746c88
commit
df8f0b3067
48
lib/entrances.py
Normal file
48
lib/entrances.py
Normal file
@ -0,0 +1,48 @@
|
|||||||
|
#!/usr/bin/python
|
||||||
|
|
||||||
|
import logging
|
||||||
|
import re
|
||||||
|
|
||||||
|
|
||||||
|
def import_entrances(spoiler_log='/home/alice/Games/steam/steamapps/compatdata/553420/pfx/drive_c/users/steamuser/AppData/LocalLow/Andrew Shouldice/Secret Legend/Randomizer/Spoiler.log'):
|
||||||
|
"""A function to import the entrance mappings from the user's spoiler log.
|
||||||
|
|
||||||
|
Args:
|
||||||
|
spoiler_log (str, optional): The filepath of the spoiler log. Defaults to '/home/alice/Games/steam/steamapps/compatdata/553420/pfx/drive_c/users/steamuser/AppData/LocalLow/Andrew Shouldice/Secret Legend/Randomizer/Spoiler.log'.
|
||||||
|
"""
|
||||||
|
|
||||||
|
try:
|
||||||
|
with open(spoiler_log, 'r') as f:
|
||||||
|
spoiler_text = f.read()
|
||||||
|
entrances_map = re.findall('\s+- (.+) -- (.+)\n', spoiler_text)
|
||||||
|
# logging.debug(entrances_map)
|
||||||
|
except:
|
||||||
|
logging.error(f'Could not find spoiler log from path: {spoiler_log}')
|
||||||
|
return
|
||||||
|
|
||||||
|
return dict(entrances_map)
|
||||||
|
|
||||||
|
|
||||||
|
def log_entrances(e):
|
||||||
|
"""A debug function to ensure entrance parsing has been done successfully.
|
||||||
|
"""
|
||||||
|
|
||||||
|
for l in e:
|
||||||
|
logging.debug(f'{l[0]} <---> {l[1]}')
|
||||||
|
|
||||||
|
|
||||||
|
def check_mapped_entrances(new_entrances, entrances_map):
|
||||||
|
"""A function to check off when a new entrance pair has been visited and validate it with the spoiler log.
|
||||||
|
|
||||||
|
Args:
|
||||||
|
new_entrances (tuple): A pairing of two strings containing the entrance names.
|
||||||
|
entrances_map (dict): An imported dictionary mapping the entrances as listed in the spoiler log.
|
||||||
|
"""
|
||||||
|
if new_entrances[0] in entrances_map.keys():
|
||||||
|
logging.debug(f'Validated that {new_entrances[0]} connects to {new_entrances[1]}')
|
||||||
|
elif new_entrances[1] in entrances_map.keys():
|
||||||
|
logging.debug(f'Validated that {new_entrances[1]} connects to {new_entrances[0]}')
|
||||||
|
else:
|
||||||
|
logging.warn(f'No connection in spoiler log between {new_entrances[0]} and {new_entrances[1]}')
|
||||||
|
return False
|
||||||
|
return True
|
53
lib/saves.py
Normal file
53
lib/saves.py
Normal file
@ -0,0 +1,53 @@
|
|||||||
|
import logging
|
||||||
|
import glob
|
||||||
|
import os
|
||||||
|
import re
|
||||||
|
# from collections import deque
|
||||||
|
|
||||||
|
|
||||||
|
def get_current_save_filename(saves_dir='/home/alice/Games/steam/steamapps/compatdata/553420/pfx/drive_c/users/steamuser/AppData/LocalLow/Andrew Shouldice/Secret Legend/SAVES'):
|
||||||
|
"""Get the last modified save file in the saves directory.
|
||||||
|
|
||||||
|
Args:
|
||||||
|
saves_dir (str, optional): Path to the saves directory. Defaults to '/home/alice/Games/steam/steamapps/compatdata/553420/pfx/drive_c/users/steamuser/AppData/LocalLow/Andrew Shouldice/Secret Legend/SAVES'.
|
||||||
|
"""
|
||||||
|
|
||||||
|
try:
|
||||||
|
list_files = glob.glob(f'{saves_dir}/*.tunic')
|
||||||
|
except:
|
||||||
|
logging.error(
|
||||||
|
f'Something went wrong in looking for the saves directory at {saves_dir}')
|
||||||
|
|
||||||
|
try:
|
||||||
|
latest_save_path = max(list_files, key=os.path.getmtime)
|
||||||
|
except:
|
||||||
|
logging.warn('A save file was deleted.')
|
||||||
|
return
|
||||||
|
|
||||||
|
try:
|
||||||
|
latest_save_filename = re.search(
|
||||||
|
'([0-9]*)[a-z-]*~([0-9]*)\.tunic', latest_save_path)
|
||||||
|
except:
|
||||||
|
logging.error(f'Cannot perform regex successfully on save path: {latest_save_path}')
|
||||||
|
return
|
||||||
|
|
||||||
|
if latest_save_filename != None:
|
||||||
|
return (latest_save_filename[0], latest_save_filename[1])
|
||||||
|
return (None, None)
|
||||||
|
|
||||||
|
|
||||||
|
def get_visited_entrances(save_filename, saves_dir='/home/alice/Games/steam/steamapps/compatdata/553420/pfx/drive_c/users/steamuser/AppData/LocalLow/Andrew Shouldice/Secret Legend/SAVES'):
|
||||||
|
try:
|
||||||
|
with open(f'{saves_dir}/{save_filename}', 'r') as save:
|
||||||
|
save_file_text = save.read()
|
||||||
|
try:
|
||||||
|
save_entrances = re.findall('portal (.*)\|1\n', save_file_text)
|
||||||
|
except:
|
||||||
|
logging.error(
|
||||||
|
f'Unable to perform findall successfully on {save_filename}')
|
||||||
|
return
|
||||||
|
except:
|
||||||
|
logging.error(f'Could not find save file from path: {save_filename}')
|
||||||
|
return
|
||||||
|
|
||||||
|
return save_entrances
|
46
main.py
Executable file
46
main.py
Executable file
@ -0,0 +1,46 @@
|
|||||||
|
#!/usr/bin/python
|
||||||
|
|
||||||
|
import logging
|
||||||
|
from time import sleep
|
||||||
|
from lib import entrances as e
|
||||||
|
from lib import saves as s
|
||||||
|
|
||||||
|
# Set up a default logger, later this should be changed to default only errors.
|
||||||
|
logging.basicConfig(level=logging.DEBUG)
|
||||||
|
|
||||||
|
entrances_map = e.import_entrances()
|
||||||
|
visited_entrances = None
|
||||||
|
save_filename = ''
|
||||||
|
save = ''
|
||||||
|
|
||||||
|
# Make this an optional command based on CLI flags
|
||||||
|
# e.log_entrances(entrances_map)
|
||||||
|
|
||||||
|
while (True):
|
||||||
|
current_save_filename, current_save = s.get_current_save_filename()
|
||||||
|
if (current_save != save):
|
||||||
|
save = current_save
|
||||||
|
logging.debug(f'Updated current save to: {current_save}')
|
||||||
|
visited_entrances = None
|
||||||
|
logging.debug(f'Re-initializing visited entrances.')
|
||||||
|
if (current_save_filename != save_filename):
|
||||||
|
save_filename = current_save_filename
|
||||||
|
logging.debug(f'Updated latest save filename to: {save_filename}')
|
||||||
|
try:
|
||||||
|
updated_visited_entrances = s.get_visited_entrances(save_filename)
|
||||||
|
except:
|
||||||
|
logging.error(
|
||||||
|
f'Could not get visited entrances from save file at {save_filename}')
|
||||||
|
if (visited_entrances != updated_visited_entrances):
|
||||||
|
if (visited_entrances != None):
|
||||||
|
new_entrances = [
|
||||||
|
x for x in updated_visited_entrances if x not in visited_entrances]
|
||||||
|
logging.debug(new_entrances)
|
||||||
|
if (e.check_mapped_entrances(new_entrances, entrances_map)):
|
||||||
|
visited_entrances = updated_visited_entrances
|
||||||
|
logging.debug(
|
||||||
|
f'Updated visited entrances to: {visited_entrances}')
|
||||||
|
else:
|
||||||
|
visited_entrances = updated_visited_entrances
|
||||||
|
logging.debug(f'Updated visited entrances to: {visited_entrances}')
|
||||||
|
sleep(1)
|
@ -0,0 +1,22 @@
|
|||||||
|
annotated-types==0.6.0
|
||||||
|
anyio==4.3.0
|
||||||
|
autopep8==2.0.4
|
||||||
|
click==8.1.7
|
||||||
|
fastapi==0.110.0
|
||||||
|
h11==0.14.0
|
||||||
|
httptools==0.6.1
|
||||||
|
idna==3.6
|
||||||
|
numpy==1.26.4
|
||||||
|
pyarrow==15.0.0
|
||||||
|
pycodestyle==2.11.1
|
||||||
|
pydantic==2.6.3
|
||||||
|
pydantic_core==2.16.3
|
||||||
|
python-dotenv==1.0.1
|
||||||
|
PyYAML==6.0.1
|
||||||
|
sniffio==1.3.1
|
||||||
|
starlette==0.36.3
|
||||||
|
typing_extensions==4.10.0
|
||||||
|
uvicorn==0.27.1
|
||||||
|
uvloop==0.19.0
|
||||||
|
watchfiles==0.21.0
|
||||||
|
websockets==12.0
|
25
start.py
25
start.py
@ -1,25 +0,0 @@
|
|||||||
#!/usr/bin/python
|
|
||||||
|
|
||||||
import logging
|
|
||||||
import re
|
|
||||||
|
|
||||||
log = logging.getLogger(__name__)
|
|
||||||
entrances_map = ''
|
|
||||||
|
|
||||||
|
|
||||||
def import_entrances(spoiler_log='/home/alice/Games/steam/steamapps/compatdata/553420/pfx/drive_c/users/steamuser/AppData/LocalLow/Andrew Shouldice/Secret Legend/Randomizer/Spoiler.log'):
|
|
||||||
"""A function to import the entrance mappings from the user's spoiler log.
|
|
||||||
|
|
||||||
Args:
|
|
||||||
spoiler_log (str, optional): The filepath of the spoiler log. Defaults to '/home/alice/Games/steam/steamapps/compatdata/553420/pfx/drive_c/users/steamuser/AppData/LocalLow/Andrew Shouldice/Secret Legend/Randomizer/Spoiler.log'.
|
|
||||||
"""
|
|
||||||
|
|
||||||
try:
|
|
||||||
with open(spoiler_log, 'r') as f:
|
|
||||||
spoiler_text = f.read()
|
|
||||||
entrances_map = re.findall('\s+- (.+) -- (.+)\n', spoiler_text)
|
|
||||||
except:
|
|
||||||
print(f'Could not find spoiler log from path: {spoiler_log}')
|
|
||||||
|
|
||||||
for l in entrances_map:
|
|
||||||
print(f'{l[0]} <---> {l[1]}')
|
|
Loading…
Reference in New Issue
Block a user