Passed
Push — master ( 969ff2...22931c )
by Anas
05:15
created

modules.merch.make_merch()   A

Complexity

Conditions 1

Size

Total Lines 31
Code Lines 23

Duplication

Lines 0
Ratio 0 %

Importance

Changes 0
Metric Value
cc 1
eloc 23
nop 4
dl 0
loc 31
rs 9.328
c 0
b 0
f 0
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)
0 ignored issues
show
Comprehensibility Best Practice introduced by
The variable path does not seem to be defined.
Loading history...
42
    except:
43
        update.message.reply_text("I can't get the image! :(")
44
        return
45
    if extension not in extensions:
0 ignored issues
show
Comprehensibility Best Practice introduced by
The variable extensions does not seem to be defined.
Loading history...
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())
0 ignored issues
show
Comprehensibility Best Practice introduced by
The variable templates_dict does not seem to be defined.
Loading history...
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"])
0 ignored issues
show
Comprehensibility Best Practice introduced by
The variable templates_path does not seem to be defined.
Loading history...
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)
0 ignored issues
show
Comprehensibility Best Practice introduced by
The variable token does not seem to be defined.
Loading history...
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")
0 ignored issues
show
Comprehensibility Best Practice introduced by
The variable resources_path does not seem to be defined.
Loading history...
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