NexusDashboard/app/main.py
2022-02-11 21:08:06 -06:00

78 lines
2.3 KiB
Python

from flask import render_template, Blueprint, redirect, request, send_from_directory, make_response, send_file
from flask_user import login_required, current_user
import json, glob, os
from wand import image
from app.models import Account, AccountInvitation, CharacterInfo
from app.schemas import AccountSchema, CharacterInfoSchema
from app.luclient import query_cdclient
from app import gm_level
main_blueprint = Blueprint('main', __name__)
account_schema = AccountSchema()
char_info_schema = CharacterInfoSchema()
@main_blueprint.route('/', methods=['GET'])
def index():
"""Home/Index Page"""
if current_user.is_authenticated:
account_data = Account.query.filter(Account.id == current_user.id).first()
return render_template(
'main/index.html.j2',
account_data=account_data
)
else:
return render_template('main/index.html.j2')
@main_blueprint.route('/about')
def about():
"""About Page"""
return render_template('main/about.html.j2')
@main_blueprint.route('/favicon.ico')
def favicon():
return send_from_directory(
'static/logo/',
'favicon.ico',
mimetype='image/vnd.microsoft.icon'
)
@main_blueprint.route('/logs')
@gm_level(9)
def logs():
with open('nexus_dashboard.log', 'r') as file:
logs = tail(file, 100)
return render_template('main/logs.html.j2', logs=logs)
def tail( f, lines=20 ):
total_lines_wanted = lines
BLOCK_SIZE = 1024
f.seek(0, 2)
block_end_byte = f.tell()
lines_to_go = total_lines_wanted
block_number = -1
blocks = [] # blocks of size BLOCK_SIZE, in reverse order starting
# from the end of the file
while lines_to_go > 0 and block_end_byte > 0:
if (block_end_byte - BLOCK_SIZE > 0):
# read the last block we haven't yet read
f.seek(block_number*BLOCK_SIZE, 2)
blocks.append(f.read(BLOCK_SIZE))
else:
# file too small, start from begining
f.seek(0,0)
# only read what was not read
blocks.append(f.read(block_end_byte))
lines_found = blocks[-1].count('\n')
lines_to_go -= lines_found
block_end_byte -= BLOCK_SIZE
block_number -= 1
all_read_text = ''.join(reversed(blocks))
return '</br>'.join(all_read_text.splitlines()[-total_lines_wanted:])