tunic-tracker-redux/tunictracker/tracker/views.py
2024-03-14 01:05:15 -05:00

147 lines
5.1 KiB
Python

from django.shortcuts import render
from django.http import HttpResponse, HttpResponseRedirect
from django.template import loader
from json import loads, dumps
from math import floor
import requests
from .forms import ServerAddressForm, BackendFilepathForm
import logging
# Create your views here.
# Debug and defaults.
defaults = {
'listen_address': 'http://localhost:8000/',
'backend_filepath': '',
'backend_filepath_updated': False,
}
# logging.basicConfig(encoding='utf-8', level=logging.DEBUG)
def session_key(session, key):
if key not in session.keys():
session[key] = defaults[key]
# TODO: consider serializing user sessions for debugging in the future.
logging.info(
f'Session {key} set to: {session[key]}')
return session[key]
def index(request):
request_data = None
listen_address = session_key(request.session, 'listen_address')
backend_filepath = session_key(request.session, 'backend_filepath')
try:
request_data = requests.get(
f'{listen_address}spoiler', timeout=5, verify=True).text
if (loads(request_data)['Scenes'] == None):
with open('empty_spoiler.json', 'r') as t:
try:
request_data = t.read()
except:
return
except:
with open('empty_spoiler.json', 'r') as t:
try:
tracker_output = loads(t.read())
except:
return
try:
tracker_output = loads(request_data)
except:
with open('empty_spoiler.json', 'r') as t:
try:
tracker_output = loads(t.read())
except:
return
with open('tracker/static/tracker/data/holy_cross_codes.json', 'r') as t:
try:
temp_codes = loads(t.read())
cross_codes = {x: {k: l.replace('U', '⬆️').replace('D', '⬇️').replace('L', '⬅️').replace(
'R', '➡️').strip() for k, l in temp_codes[x].items()} for x in temp_codes.keys()}
except:
return
tracker_debug = tracker_output['Debug']
tracker_totals = tracker_output['Totals']
tracker_current_scene = tracker_output['Current']['Scene']
tracker_current_scene_data = tracker_output['Scenes'][tracker_current_scene]
tracker_scenes = tracker_output['Scenes']
entered_codes = tracker_output['Codes']
try:
tracker_codes = cross_codes
for scene in entered_codes:
for k, v in cross_codes[scene].items():
tracker_codes[scene][k] = (
v, entered_codes[scene][k])
except Exception as e:
current_cross_codes = {}
# print(e)
template = loader.get_template('tracker/index.html')
server_address_form = ServerAddressForm()
server_address_form.fields['server_address_form'].initial = listen_address
backend_filepath_form = BackendFilepathForm()
backend_filepath_form.fields['backend_filepath_form'].initial = backend_filepath
logging.info(tracker_scenes)
context = {
'backend_filepath': backend_filepath,
'server_address': listen_address,
# 'is_hidden': is_hidden,
'debug': tracker_debug,
'default_codes': cross_codes['Default'],
'tracked_codes': tracker_codes,
'totals': tracker_totals,
'scenes': tracker_scenes,
'current_scene': {
'title': tracker_current_scene,
'data': tracker_current_scene_data
},
'server_address_form': server_address_form,
'backend_filepath_form': backend_filepath_form
}
return HttpResponse(template.render(context, request))
def get_address(request):
if request.method == 'GET':
session_key(request.session, 'backend_filepath_updated')
return HttpResponse(dumps({'listen_address': request.session['listen_address'], 'backend_filepath_updated': request.session['backend_filepath_updated']}), content_type="application/json")
else:
return render(request, 'tracker/index.html')
def set_address(request):
if request.method == 'POST':
form = ServerAddressForm(request.POST)
if form.is_valid():
request.session['listen_address'] = form.cleaned_data['server_address_form']
return HttpResponseRedirect('/')
else:
form = ServerAddressForm()
return render(request, 'tracker/index.html', {'server_address_form': form})
def set_settings(request):
if request.method == 'POST':
form = BackendFilepathForm(request.POST)
if form.is_valid():
request.session['backend_filepath'] = form.cleaned_data['backend_filepath_form']
request.session['backend_filepath_updated'] = True
return HttpResponseRedirect('/')
else:
form = BackendFilepathForm()
return render(request, 'tracker/index.html', {'backend_filepath_form': form})
def get_settings(request):
if request.method == 'GET':
request.session['backend_filepath_updated'] = False
return HttpResponse(dumps(request.session['backend_filepath']), content_type="application/json")
else:
return render(request, 'tracker/index.html')