add morj command

This commit is contained in:
bakatrouble 2019-09-06 15:08:11 +03:00
parent 8d564fb31b
commit 2ee5d9fe6d
4 changed files with 132 additions and 0 deletions

BIN
CenturyGothicBold.ttf Normal file

Binary file not shown.

BIN
MORJ.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 179 KiB

12
main.py
View File

@ -1,6 +1,7 @@
#!/usr/bin/env python3 #!/usr/bin/env python3
import logging import logging
import os
import traceback import traceback
from datetime import datetime, timedelta from datetime import datetime, timedelta
from html import escape from html import escape
@ -8,6 +9,7 @@ from queue import Queue, Empty
from time import sleep from time import sleep
from threading import Thread from threading import Thread
from typing import Dict, List from typing import Dict, List
from uuid import uuid4
import sentry_sdk import sentry_sdk
from telegram.error import Unauthorized, TelegramError from telegram.error import Unauthorized, TelegramError
@ -17,6 +19,7 @@ from telegram import Message, Update, Bot, InlineKeyboardMarkup, InlineKeyboardB
from config import BOT_TOKEN, SENTRY_DSN, MANAGEMENT_CHAT, DEBUG from config import BOT_TOKEN, SENTRY_DSN, MANAGEMENT_CHAT, DEBUG
from db import get_conn, Subscriber, PersistentMapping, commit from db import get_conn, Subscriber, PersistentMapping, commit
from morj import draw_morj
from send_users_list import send_users_list from send_users_list import send_users_list
@ -232,6 +235,14 @@ def users_list(bot: Bot, update: Update):
update.effective_message.reply_text('\n'.join(messages[i:i+40]), parse_mode='html') update.effective_message.reply_text('\n'.join(messages[i:i+40]), parse_mode='html')
def morj(bot: Bot, update: Update):
text = update.effective_message.text[5:]
fname = '/tmp/morj{}.png'.format(uuid4())
draw_morj(text, fname)
update.effective_message.reply_document(open(fname, 'rb'))
os.unlink(fname)
def _process_message(bot: Bot, m: Message): def _process_message(bot: Bot, m: Message):
if m.sticker or m.animation: if m.sticker or m.animation:
delta = datetime.now() - conn.root.last_media delta = datetime.now() - conn.root.last_media
@ -363,6 +374,7 @@ if __name__ == '__main__':
updater.dispatcher.add_handler(CommandHandler('remove', remove_user, Filters.chat(MANAGEMENT_CHAT), pass_args=True)) updater.dispatcher.add_handler(CommandHandler('remove', remove_user, Filters.chat(MANAGEMENT_CHAT), pass_args=True))
updater.dispatcher.add_handler(CallbackQueryHandler(remove_user, pattern=r'^remove (\d+)$', pass_groups=True)) updater.dispatcher.add_handler(CallbackQueryHandler(remove_user, pattern=r'^remove (\d+)$', pass_groups=True))
updater.dispatcher.add_handler(CommandHandler('users', users_list, Filters.private)) updater.dispatcher.add_handler(CommandHandler('users', users_list, Filters.private))
updater.dispatcher.add_handler(CommandHandler('morj', morj))
updater.dispatcher.add_handler(MessageHandler(Filters.private, msg)) updater.dispatcher.add_handler(MessageHandler(Filters.private, msg))
updater.start_polling() updater.start_polling()

120
morj.py Normal file
View File

@ -0,0 +1,120 @@
#!/usr/bin/env python
# coding: utf-8
# Copyright 2011 Álvaro Justen [alvarojusten at gmail dot com]
# License: GPL <http://www.gnu.org/copyleft/gpl.html>
from PIL import Image, ImageDraw, ImageFont
FONT_FILE = 'CenturyGothicBold.ttf'
BG = 'MORJ.png'
class ImageText(object):
def __init__(self, filename_or_size, mode='RGBA', background=(0, 0, 0, 0),
encoding='utf8'):
if isinstance(filename_or_size, str):
self.filename = filename_or_size
self.image = Image.open(self.filename)
self.size = self.image.size
elif isinstance(filename_or_size, (list, tuple)):
self.size = filename_or_size
self.image = Image.new(mode, self.size, color=background)
self.filename = None
self.draw = ImageDraw.Draw(self.image)
self.encoding = encoding
def save(self, filename=None):
self.image.save(filename or self.filename)
def get_font_size(self, text, font, max_width=None, max_height=None):
if max_width is None and max_height is None:
raise ValueError('You need to pass max_width or max_height')
font_size = 1
text_size = self.get_text_size(font, font_size, text)
if (max_width is not None and text_size[0] > max_width) or \
(max_height is not None and text_size[1] > max_height):
raise ValueError("Text can't be filled in only (%dpx, %dpx)" % text_size)
while True:
if (max_width is not None and text_size[0] >= max_width) or \
(max_height is not None and text_size[1] >= max_height):
return font_size - 1
font_size += 1
text_size = self.get_text_size(font, font_size, text)
def write_text(self, position, text, font_filename, font_size=11, color=(0, 0, 0), max_width=None, max_height=None):
x, y = position
if font_size == 'fill' and \
(max_width is not None or max_height is not None):
font_size = self.get_font_size(text, font_filename, max_width, max_height)
text_size = self.get_text_size(font_filename, font_size, text)
font = ImageFont.truetype(font_filename, font_size)
if x == 'center':
x = (self.size[0] - text_size[0]) / 2
if y == 'center':
y = (self.size[1] - text_size[1]) / 2
self.draw.text((x, y), text, font=font, fill=color)
return text_size
def get_text_size(self, font_filename, font_size, text):
font = ImageFont.truetype(font_filename, font_size)
return font.getsize(text)
def write_text_box(self, position, text, box_width, font_filename, font_size=11, color=(0, 0, 0), place='left',
justify_last_line=False):
x, y = position
lines = []
line = []
text_height = 0
text_lines = text.split('\n')
for text_line in text_lines:
words = text_line.split(' ')
for word in words:
new_line = ' '.join(line + [word])
size = self.get_text_size(font_filename, font_size, new_line)
text_height = size[1]
if size[0] <= box_width:
line.append(word)
else:
lines.append(line)
line = [word]
if line:
lines.append(line)
line = []
lines = [' '.join(line) for line in lines if line]
height = y
for index, line in enumerate(lines):
height += text_height
if place == 'left':
self.write_text((x, height), line, font_filename, font_size, color)
elif place == 'right':
total_size = self.get_text_size(font_filename, font_size, line)
x_left = x + box_width - total_size[0]
self.write_text((x_left, height), line, font_filename, font_size, color)
elif place == 'center':
total_size = self.get_text_size(font_filename, font_size, line)
x_left = int(x + ((box_width - total_size[0]) / 2))
self.write_text((x_left, height), line, font_filename, font_size, color)
elif place == 'justify':
words = line.split()
if (index == len(lines) - 1 and not justify_last_line) or len(words) == 1:
self.write_text((x, height), line, font_filename, font_size, color)
continue
line_without_spaces = ''.join(words)
total_size = self.get_text_size(font_filename, font_size, line_without_spaces)
space_width = (box_width - total_size[0]) / (len(words) - 1.0)
start_x = x
for word in words[:-1]:
self.write_text((start_x, height), word, font_filename, font_size, color)
word_size = self.get_text_size(font_filename, font_size, word)
start_x += word_size[0] + space_width
last_word_size = self.get_text_size(font_filename, font_size, words[-1])
last_word_x = x + box_width - last_word_size[0]
self.write_text((last_word_x, height), words[-1], font_filename, font_size, color)
return box_width, height - y
def draw_morj(text, filename):
img = ImageText(BG)
img.write_text_box((67, 70), text, box_width=800, font_filename=FONT_FILE, font_size=40, color=(255, 255, 255))
img.save(filename)