From 6fe87b6ea10dd9c426fbd48064a5666721a5378e Mon Sep 17 00:00:00 2001 From: Andrea Date: Thu, 18 Jan 2024 01:03:48 +0100 Subject: [PATCH] [wip3] Room preview generation + OpenGraph tags --- .gitignore | 2 + config.example.py | 6 ++ .../pt-serif-caption-latin-400-normal.ttf | Bin 0 -> 24564 bytes room.py | 79 +++++++++++++----- tpl/base.html | 1 + tpl/view_room.html | 20 +++++ tpl/welcome.html | 9 ++ 7 files changed, 96 insertions(+), 21 deletions(-) create mode 100644 res/font/pt-serif-caption-latin-400-normal.ttf create mode 100644 tpl/view_room.html diff --git a/.gitignore b/.gitignore index 17840cc..e2b56cd 100644 --- a/.gitignore +++ b/.gitignore @@ -154,6 +154,8 @@ cython_debug/ res/propic/propic_* +res/rooms/* + # PyCharm # JetBrains specific template is maintained in a separate JetBrains.gitignore that can # be found at https://github.com/github/gitignore/blob/main/Global/JetBrains.gitignore diff --git a/config.example.py b/config.example.py index d2b3985..c39f559 100644 --- a/config.example.py +++ b/config.example.py @@ -86,6 +86,12 @@ CATEGORIES_LIST_MAP = { 'rooms': [], 'dailys': [] } + +SPONSORSHIP_COLOR_MAP = { + 'super': (251, 140, 0), + 'normal': (142, 36, 170) +} + # Create a bunch of "room" items which will get added to the order once somebody gets a room. # Map item_name -> room capacity ROOM_CAPACITY_MAP = { diff --git a/res/font/pt-serif-caption-latin-400-normal.ttf b/res/font/pt-serif-caption-latin-400-normal.ttf new file mode 100644 index 0000000000000000000000000000000000000000..7dcd79e90a2d42370e8332c7083c68eb79d7c52c GIT binary patch literal 24564 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") @@ -139,7 +141,7 @@ async def kick_member(request, code, order: Order): await order.send_answers() await to_kick.send_answers() - + remove_room_preview (order.code) return redirect('/manage/welcome') @bp.route("/renew_secret") @@ -286,7 +288,7 @@ async def rename_room(request, order: Order): await order.edit_answer("room_name", name) await order.send_answers() - + remove_room_preview (order.code) return redirect('/manage/welcome') @bp.route("/confirm") @@ -358,23 +360,59 @@ async def confirm_room(request, order: Order, quotas: Quotas): async def get_room (request, code): order_data = await request.app.ctx.om.get_order(code=code) if not order_data or not order_data.room_owner: return None - members_map = [] + members_map = [{'name': order_data.name, 'propic': order_data.propic, 'sponsorship': order_data.sponsorship}] for member_code in order_data.room_members: + if member_code == order_data.code: continue member_order = await request.app.ctx.om.get_order(code=member_code) if not member_order: continue members_map.append ({'name': member_order.name, 'propic': member_order.propic, 'sponsorship': member_order.sponsorship}) - return {'name': order_data.room_name, 'members': members_map} + return {'name': order_data.room_name, + 'confirmed': order_data.room_confirmed, + 'capacity': order_data.room_person_no, + 'members': members_map} -async def generate_image(request, code): +async def get_room_with_order (request, code): + order_data = await request.app.ctx.om.get_order(code=code) + if not order_data or not order_data.room_owner: return None + +def remove_room_preview(code): + preview_file = f"res/rooms/{code}.jpg" + try: + if os.path.exists(preview_file): os.remove(preview_file) + except Exception as ex: + if (EXTRA_PRINTS): print(ex) + +async def generate_room_preview(request, code, room_data): + font_path = f'res/font/pt-serif-caption-latin-400-normal.ttf' + main_fill = (16, 149, 193) jobs.append(code) try: - room_data = await get_room(request, code) - - return room_data - except Exception: - # Remove fault job - if len(jobs) > 0: jobs.pop() - raise exceptions.SanicException("Could not get that room's data at the moment. Try again, later.", status_code=500) + room_data = await get_room(request, code) if not room_data else room_data + width = 230 * int(room_data['capacity']) + 130 + font = ImageFont.truetype(font_path, 20) + with Image.new('RGB', (width, 270), (17, 25, 31)) as to_save: + i_draw = ImageDraw.Draw(to_save) + # Draw room's name + room_name_len = i_draw.textlength(room_data['name'], font) + i_draw.text((((width / 2) - room_name_len / 2), 10), room_data['name'], font=font, fill=main_fill) + # Draw members + for m in range (room_data['capacity']): + member = room_data['members'][m] if m < len(room_data['members']) else { 'name': 'Empty', 'propic': '../new.png', 'sponsorship': None } + font = ImageFont.truetype(font_path, 20) + with Image.open(f'res/propic/{member['propic'] or 'default.png'}') as to_add: + to_save.paste(to_add.resize ((180, 180)), (90 + (230 * m), 45)) + name_len = i_draw.textlength(str(member['name']), font) + calc_size = 0 + if name_len > 180: + calc_size = 180 * 20 / name_len if name_len > 180 else 20 + font = ImageFont.truetype(font_path, calc_size) + name_len = i_draw.textlength(str(member['name']), font) + name_loc = ((90 + (230 * m)) + (90 - name_len / 2), 235 + (calc_size/2)) + name_color = SPONSORSHIP_COLOR_MAP[member['sponsorship']] if member['sponsorship'] in SPONSORSHIP_COLOR_MAP.keys() else main_fill + i_draw.text(name_loc, str(member['name']), font=font, fill=name_color) + to_save.save(f'res/rooms/{code}.jpg', 'JPEG') + except Exception as err: + if EXTRA_PRINTS: print(err) finally: # Remove fault job if len(jobs) > 0: jobs.pop() @@ -383,12 +421,11 @@ async def generate_image(request, code): @bp.route("/view/") async def get_view(request, code): - if code in jobs: - raise exceptions.SanicException("The room's preview is being generated... Wait a little longer", status_code=409) room_file_name = f"res/rooms/{code}.jpg" - - if not os.path.exists(room_file_name): - await generate_image(request, code) - tpl = request.app.ctx.tpl.get_template('viewRoom.html') - return html(tpl.render(imgPath=room_file_name)) + room_data = await get_room(request, code) + + if not os.path.exists(room_file_name) and code not in jobs: + await generate_room_preview(request, code, room_data) + tpl = request.app.ctx.tpl.get_template('view_room.html') + return html(tpl.render(preview=room_file_name, room_data=room_data)) \ No newline at end of file diff --git a/tpl/base.html b/tpl/base.html index b2679c6..b2e464f 100644 --- a/tpl/base.html +++ b/tpl/base.html @@ -1,6 +1,7 @@ + {% block head %}{% endblock %} {% block title %}{% endblock %} diff --git a/tpl/view_room.html b/tpl/view_room.html new file mode 100644 index 0000000..cefb8ac --- /dev/null +++ b/tpl/view_room.html @@ -0,0 +1,20 @@ +{% extends "base.html" %} +{% block title %}{{room_data['name']}}{% endblock %} +{% block head %} + + + + +{% endblock %} +{% block main %} +

+
+ + + + +
+
+ +{% endblock %} diff --git a/tpl/welcome.html b/tpl/welcome.html index 33fe5fb..fcca3d9 100644 --- a/tpl/welcome.html +++ b/tpl/welcome.html @@ -1,5 +1,14 @@ {% extends "base.html" %} {% block title %}{{order.name}}'s Booking{% endblock %} +{% block head %} + + + + + + + +{% endblock %} {% block main %}