1
|
|
|
#!/usr/bin/python |
2
|
|
|
# -*- coding: utf-8 -*- |
3
|
|
|
from modules.utils import Caption_Filter, get_param, get_image, send_image |
4
|
|
|
from telegram.ext import PrefixHandler, MessageHandler |
5
|
|
|
from PIL import Image, ImageChops, ImageOps, ImageDraw |
6
|
|
|
from modules.logging import logging_decorator |
7
|
|
|
from telegram.ext.dispatcher import run_async |
8
|
|
|
from telegram import ChatAction |
9
|
|
|
from datetime import datetime |
10
|
|
|
from itertools import chain |
11
|
|
|
import random |
12
|
|
|
import requests |
13
|
|
|
import json |
14
|
|
|
import yaml |
15
|
|
|
import os |
16
|
|
|
|
17
|
|
|
bleed = 100 |
18
|
|
|
|
19
|
|
|
|
20
|
|
|
def module_init(gd): |
21
|
|
|
global path, resources_path, templates_dict, templates_path, token, extensions |
22
|
|
|
path = gd.config["path"] |
23
|
|
|
extensions = gd.config["extensions"] |
24
|
|
|
resources_path = gd.config["resources_path"] |
25
|
|
|
templates_path = resources_path+"templates/" |
26
|
|
|
token = gd.full_config["keys"]["telegram_token"] |
27
|
|
|
commands = gd.config["commands"] |
28
|
|
|
for command in commands: |
29
|
|
|
caption_filter = Caption_Filter("/"+command) |
30
|
|
|
gd.dp.add_handler(MessageHandler(caption_filter, merch)) |
31
|
|
|
gd.dp.add_handler(PrefixHandler("/", command, merch)) |
32
|
|
|
with open(resources_path+"templates.yml", "r") as f: |
33
|
|
|
templates_dict = yaml.load(f, Loader=yaml.SafeLoader) |
34
|
|
|
|
35
|
|
|
|
36
|
|
|
@run_async |
37
|
|
|
@logging_decorator("merch") |
38
|
|
|
def merch(update, context): |
39
|
|
|
filename = datetime.now().strftime("%d%m%y-%H%M%S%f") |
40
|
|
|
try: |
41
|
|
|
extension = get_image(update, context, path, filename) |
|
|
|
|
42
|
|
|
except: |
43
|
|
|
update.message.reply_text("I can't get the image! :(") |
44
|
|
|
return |
45
|
|
|
if extension not in extensions: |
|
|
|
|
46
|
|
|
update.message.reply_text("Unsupported file") |
47
|
|
|
return False |
48
|
|
|
update.message.chat.send_action(ChatAction.UPLOAD_PHOTO) |
49
|
|
|
templates_list = list(templates_dict.keys()) |
|
|
|
|
50
|
|
|
|
51
|
|
|
if len(context.args)>0: |
52
|
|
|
if context.args[0] in templates_list: |
53
|
|
|
amount = 1 |
54
|
|
|
template = True |
55
|
|
|
else: |
56
|
|
|
amount = get_param(update, 1, 1, 10) |
57
|
|
|
template = False |
58
|
|
|
else: |
59
|
|
|
amount = get_param(update, 1, 1, 10) |
60
|
|
|
template = False |
61
|
|
|
|
62
|
|
|
image = path+filename+extension |
63
|
|
|
photos = [] |
64
|
|
|
upload_files = [] |
65
|
|
|
for i in range(amount): |
66
|
|
|
if template is True: |
67
|
|
|
product = context.args[0] |
68
|
|
|
else: |
69
|
|
|
product = random.choice(templates_list) |
70
|
|
|
templates_list.remove(product) |
71
|
|
|
result_image = make_merch(image, templates_path, templates_dict[product], templates_dict[product]["offset"]) |
|
|
|
|
72
|
|
|
result_image.save(path+"merch"+str(i)+".jpg") |
73
|
|
|
|
74
|
|
|
image_to_attach = "merch"+str(i)+".jpg" |
75
|
|
|
attach_name = "".join(random.choice("abcdef1234567890") for x in range(16)) |
76
|
|
|
photos.append({"type": "photo", "media": "attach://" + attach_name}) |
77
|
|
|
upload_files.append((attach_name, (image_to_attach, open(path+image_to_attach, "rb")))) |
78
|
|
|
|
79
|
|
|
requests.post("https://api.telegram.org/bot"+token+"/sendMediaGroup", params={"chat_id": update.message.chat.id, "media": json.dumps(photos)}, files=upload_files, timeout=120) |
|
|
|
|
80
|
|
|
os.remove(path+filename+extension) |
81
|
|
|
return amount |
82
|
|
|
|
83
|
|
|
|
84
|
|
|
def make_merch(image_to_print, templates_path, template, offset=(0,0)): |
85
|
|
|
source = Image.open(templates_path + template["img"]) |
86
|
|
|
source = source.convert("RGBA") |
87
|
|
|
width, height = source.size |
88
|
|
|
long_side = max(source.size) |
89
|
|
|
|
90
|
|
|
mask = Image.open(templates_path + template["mask"]) |
91
|
|
|
mask = mask.convert("RGBA") |
92
|
|
|
|
93
|
|
|
decal = Image.open(image_to_print) |
94
|
|
|
decal = ImageOps.fit(decal, mask.size, Image.LANCZOS) |
95
|
|
|
decal = decal.convert("RGBA") |
96
|
|
|
|
97
|
|
|
bg = Image.open(resources_path+"background.jpg") |
|
|
|
|
98
|
|
|
bg = ImageOps.fit(bg, (long_side+bleed, long_side+bleed), Image.LANCZOS) |
99
|
|
|
|
100
|
|
|
cutout = ImageChops.multiply(decal, mask) |
101
|
|
|
|
102
|
|
|
transparent_canvas = Image.new('RGBA', bg.size, color=(0, 0, 0, 0)) |
103
|
|
|
transparent_canvas.paste(cutout, offset, cutout) |
104
|
|
|
offset_decal = transparent_canvas |
105
|
|
|
|
106
|
|
|
displaced = ImageChops.multiply(offset_decal, source) |
107
|
|
|
product = ImageChops.composite(displaced, source, displaced) |
108
|
|
|
bg.paste(product, ((bg.width-width)//2, (bg.height-height)//2), product) |
109
|
|
|
|
110
|
|
|
watermark = Image.open(resources_path+"watermark.png").convert("RGBA") |
111
|
|
|
bg.paste(watermark, (20, bg.height-watermark.height-20), watermark) |
112
|
|
|
|
113
|
|
|
final = bg.convert("RGB") |
114
|
|
|
return final |
115
|
|
|
|