|
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
|
|
|
|