mirror of
https://github.com/chatmail/relay.git
synced 2026-05-10 16:04:37 +00:00
* create a wwwdev.sh entry point for developing the web part * rename script * fix README * add a note * don't depend on deltachat python package * avoid bailing out on jinja2 errors, and provide file-url for instant clickability * in webdev mode make page auto-refresh every 3 seconds
88 lines
2.3 KiB
Python
88 lines
2.3 KiB
Python
import importlib
|
|
import qrcode
|
|
import os
|
|
from PIL import ImageFont, ImageDraw, Image
|
|
import io
|
|
|
|
|
|
def gen_qr_png_data(maildomain):
|
|
url = f"DCACCOUNT:https://{maildomain}/cgi-bin/newemail.py"
|
|
image = gen_qr(maildomain, url)
|
|
temp = io.BytesIO()
|
|
image.save(temp, format="png")
|
|
temp.seek(0)
|
|
return temp
|
|
|
|
|
|
def gen_qr(maildomain, url):
|
|
# taken and modified from
|
|
# https://github.com/deltachat/mailadm/blob/master/src/mailadm/gen_qr.py
|
|
|
|
# info = f"{maildomain} invite code"
|
|
info = ""
|
|
|
|
# load QR code
|
|
qr = qrcode.QRCode(
|
|
version=1,
|
|
error_correction=qrcode.constants.ERROR_CORRECT_H,
|
|
box_size=1,
|
|
border=1,
|
|
)
|
|
qr.add_data(url)
|
|
qr.make(fit=True)
|
|
qr_img = qr.make_image(fill_color="black", back_color="white")
|
|
|
|
# paint all elements
|
|
ttf_path = str(
|
|
importlib.resources.files(__package__).joinpath("data/opensans-regular.ttf")
|
|
)
|
|
logo_red_path = str(
|
|
importlib.resources.files(__package__).joinpath("data/delta-chat-bw.png")
|
|
)
|
|
|
|
assert os.path.exists(ttf_path), ttf_path
|
|
font_size = 16
|
|
font = ImageFont.truetype(font=ttf_path, size=font_size)
|
|
|
|
num_lines = ((info).count("\n") + 1) if info else 0
|
|
|
|
size = width = 384
|
|
qr_padding = 6
|
|
text_height = font_size * num_lines
|
|
height = size + text_height
|
|
|
|
image = Image.new("RGBA", (width, height), "white")
|
|
qr_final_size = width
|
|
|
|
if num_lines:
|
|
draw = ImageDraw.Draw(image)
|
|
|
|
# draw text
|
|
if hasattr(font, "getsize"):
|
|
info_pos = (width - font.getsize(info.strip())[0]) // 2
|
|
else:
|
|
info_pos = (width - font.getbbox(info.strip())[3]) // 2
|
|
|
|
draw.multiline_text(
|
|
(info_pos, size - qr_padding // 2),
|
|
info,
|
|
font=font,
|
|
fill="black",
|
|
align="right",
|
|
)
|
|
|
|
# paste QR code
|
|
image.paste(
|
|
qr_img.resize((qr_final_size, qr_final_size), resample=Image.NEAREST),
|
|
(qr_padding, qr_padding),
|
|
)
|
|
|
|
# background delta logo
|
|
logo2_img = Image.open(logo_red_path)
|
|
logo2_width = int(size / 6)
|
|
logo2 = logo2_img.resize((logo2_width, logo2_width), resample=Image.NEAREST)
|
|
pos = int((size / 2) - (logo2_width / 2))
|
|
image.paste(logo2, (pos, pos), mask=logo2)
|
|
|
|
return image
|