Merge pull request #22 from DarkflameUniverse/character-rescue

Character rescue
This commit is contained in:
Aaron Kimbrell 2022-02-20 08:39:03 -06:00 committed by GitHub
commit 6303a86778
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
8 changed files with 116 additions and 7 deletions

View File

@ -5,8 +5,12 @@ from datatables import ColumnDT, DataTables
import datetime, time import datetime, time
from app.models import CharacterInfo, CharacterXML, Account, db from app.models import CharacterInfo, CharacterXML, Account, db
from app.schemas import CharacterInfoSchema from app.schemas import CharacterInfoSchema
from app.forms import RescueForm
from app import gm_level, log_audit from app import gm_level, log_audit
from app.luclient import translate_from_locale
import xmltodict import xmltodict
import xml.etree.ElementTree as ET
character_blueprint = Blueprint('characters', __name__) character_blueprint = Blueprint('characters', __name__)
@ -92,7 +96,6 @@ def view(id):
@character_blueprint.route('/view_xml/<id>', methods=['GET']) @character_blueprint.route('/view_xml/<id>', methods=['GET'])
@login_required @login_required
@gm_level(9)
def view_xml(id): def view_xml(id):
character_data = CharacterInfo.query.filter(CharacterInfo.id == id).first() character_data = CharacterInfo.query.filter(CharacterInfo.id == id).first()
@ -101,6 +104,11 @@ def view_xml(id):
abort(404) abort(404)
return return
if current_user.gm_level < 3:
if character_data.account_id and character_data.account_id != current_user.id:
abort(403)
return
character_xml = CharacterXML.query.filter( character_xml = CharacterXML.query.filter(
CharacterXML.id==id CharacterXML.id==id
).first().xml_data ).first().xml_data
@ -111,7 +119,6 @@ def view_xml(id):
@character_blueprint.route('/get_xml/<id>', methods=['GET']) @character_blueprint.route('/get_xml/<id>', methods=['GET'])
@login_required @login_required
@gm_level(9)
def get_xml(id): def get_xml(id):
character_data = CharacterInfo.query.filter(CharacterInfo.id == id).first() character_data = CharacterInfo.query.filter(CharacterInfo.id == id).first()
@ -119,6 +126,10 @@ def get_xml(id):
if character_data == {}: if character_data == {}:
abort(404) abort(404)
return return
if current_user.gm_level < 3:
if character_data.account_id and character_data.account_id != current_user.id:
abort(403)
return
character_xml = CharacterXML.query.filter( character_xml = CharacterXML.query.filter(
CharacterXML.id==id CharacterXML.id==id
@ -158,6 +169,42 @@ def restrict(id, bit):
return redirect(request.referrer if request.referrer else url_for("main.index")) return redirect(request.referrer if request.referrer else url_for("main.index"))
@character_blueprint.route('/rescue/<id>', methods=['GET', 'POST'])
@login_required
@gm_level(3)
def rescue(id):
form = RescueForm()
character_data = CharacterXML.query.filter(
CharacterXML.id==id
).first()
character_xml = ET.XML(character_data.xml_data)
for zone in character_xml.findall('.//r'):
if int(zone.attrib["w"]) % 100 == 0:
form.save_world.choices.append(
(
zone.attrib["w"],
translate_from_locale(f"ZoneTable_{zone.attrib['w']}_DisplayDescription")
)
)
if form.validate_on_submit():
new_zone = character_xml.find(f'.//r[@w="{form.save_world.data}"]')
char = character_xml.find(".//char")
char.attrib["lzx"] = new_zone.attrib["x"]
char.attrib["lzy"] = new_zone.attrib["y"]
char.attrib["lzz"] = new_zone.attrib["z"]
char.attrib["lwid"] = form.save_world.data
character_data.xml_data = ET.tostring(character_xml)
character_data.save()
return redirect(url_for('characters.view', id=id))
return render_template("character/rescue.html.j2", form=form)
@character_blueprint.route('/get/<status>', methods=['GET']) @character_blueprint.route('/get/<status>', methods=['GET'])
@login_required @login_required
@gm_level(3) @gm_level(3)

View File

@ -171,3 +171,17 @@ class SendMailForm(FlaskForm):
) )
submit = SubmitField('Submit') submit = SubmitField('Submit')
class RescueForm(FlaskForm):
save_world = SelectField(
'Move to:',
coerce=str,
choices=[
("",""),
],
validators=[validators.DataRequired()]
)
submit = SubmitField('Submit')

View File

@ -25,7 +25,6 @@ def send():
form = SendMailForm() form = SendMailForm()
if request.method == "POST": if request.method == "POST":
# if form.validate_on_submit():
if form.attachment.data != "0" and form.attachment_count.data == 0: if form.attachment.data != "0" and form.attachment_count.data == 0:
form.attachment_count.data = 1 form.attachment_count.data = 1
if form.recipient.data == "0": if form.recipient.data == "0":

View File

@ -1,11 +1,11 @@
{% extends 'base.html.j2' %} {% extends 'base.html.j2' %}
{% block title %} {% block title %}
Account Management Character Management
{% endblock title %} {% endblock title %}
{% block content_before %} {% block content_before %}
Account Management Character Management
{% endblock content_before %} {% endblock content_before %}
{% block content %} {% block content %}

View File

@ -0,0 +1,21 @@
{% extends 'base.html.j2' %}
{% block title %}
Character Rescue
{% endblock title %}
{% block content_before %}
Character Rescue
{% endblock content_before %}
{% block content %}
<form method=post>
{{ form.csrf_token }}
<div class="card shadow-sm mx-auto pb-3 bg-dark border-primary" style="width: 20rem;">
<div class="card-body">
{{ helper.render_field(form.save_world) }}
{{ helper.render_submit_field(form.submit) }}
</div>
</div>
</form>
{% endblock %}

View File

@ -52,6 +52,24 @@
</div> </div>
{% else %} {% else %}
<br/> <br/>
<div class="row">
<div class="col text-center">
<a role="button" class="btn btn-primary btn-block"
href='{{ url_for('characters.view_xml', id=character.id) }}'>
View XML
</a>
</div>
</div>
<br/>
<div class="row">
<div class="col text-center">
<a role="button" class="btn btn-primary btn-block"
href='{{ url_for('characters.get_xml', id=character.id) }}'>
Download XML
</a>
</div>
</div>
<br/>
<div class="row"> <div class="row">
<div class="col text-center"> <div class="col text-center">
<a role="button" class="btn btn-primary btn-block" <a role="button" class="btn btn-primary btn-block"
@ -62,7 +80,7 @@
</div> </div>
{% endif %} {% endif %}
{% if current_user.id != character.account_id and current_user.gm_level > 2 %} {% if current_user.gm_level > 2 %}
<hr class="bg-primary"/> <hr class="bg-primary"/>
<div class="row"> <div class="row">
<div class="col text-center"> <div class="col text-center">
@ -83,6 +101,10 @@
</a> </a>
{% endif %} {% endif %}
<a role="button" class="btn btn-warning btn-block"
href='{{ url_for('characters.rescue', id=character.id) }}'>
Rescue
</a>
<a role="button" class="btn btn-primary btn-block" <a role="button" class="btn btn-primary btn-block"
href='{{ url_for('characters.restrict', id=character.id, bit=4) }}'> href='{{ url_for('characters.restrict', id=character.id, bit=4) }}'>
{% if character.permission_map|check_perm_map(4) %}Unrestrict{% else %}Restrict{% endif %} Trade {% if character.permission_map|check_perm_map(4) %}Unrestrict{% else %}Restrict{% endif %} Trade

View File

@ -19,7 +19,7 @@
<div class="row"> <div class="row">
<div class="col text-center"> <div class="col text-center">
{% set parsed_lzid = character_json.obj.char.attr_lzid|parse_lzid %} {% set parsed_lzid = character_json.obj.char.attr_lzid|parse_lzid %}
Zone: {{ parsed_lzid[0]|get_zone_name }}<br> Zone: {{ character_json.obj.char.attr_lwid|get_zone_name }}<br>
Zone Instance: {{ parsed_lzid[1] }}<br> Zone Instance: {{ parsed_lzid[1] }}<br>
Zone Clone: {{ parsed_lzid[2] }}<br> Zone Clone: {{ parsed_lzid[2] }}<br>
</div> </div>

View File

@ -3,5 +3,11 @@
# unzip brickdb from client to the right places # unzip brickdb from client to the right places
unzip -n -q /app/luclient/res/brickdb.zip -d app/luclient/res/ unzip -n -q /app/luclient/res/brickdb.zip -d app/luclient/res/
# TODO: preconvert images options
# TODO: preconvery models options
# update the DB
flask db upgrade flask db upgrade
# RUNNNNNNNNNNNNN
gunicorn -b :8000 -w 4 wsgi:app gunicorn -b :8000 -w 4 wsgi:app