Browse Source

Fix: newlines in citations & message deletion.

txlyre 3 years ago
parent
commit
9eb740ed76
4 changed files with 179 additions and 3 deletions
  1. 1 1
      makeshot.py
  2. 82 0
      makeshot.py.bak
  3. 5 2
      openkriemy.py
  4. 91 0
      openkriemy.py.bak

+ 1 - 1
makeshot.py

@@ -24,7 +24,7 @@ username = data['username']
 username_color = data['username_color']
 text = data['text']
 
-username = shorten(username, width=15)
+username = shorten(username, width=15, replace_whitespace=False)
 text = fill(text, width=30)
 
 username = demojize(username)

+ 82 - 0
makeshot.py.bak

@@ -0,0 +1,82 @@
+from sys import stdin
+from textwrap import fill, shorten
+
+from ujson import loads
+from PIL import Image, ImageDraw, ImageFont
+from emoji import demojize
+
+COLORS = [
+  (0xee, 0x49, 0x28),
+  (0x41, 0xa9, 0x03),
+  (0xe0, 0x96, 0x02),
+  (0x0f, 0x94, 0xed),
+  (0x8f, 0x3b, 0xf7),
+  (0xfc, 0x43, 0x80),
+  (0x00, 0xa1, 0xc4),
+  (0xeb, 0x70, 0x02)
+]
+
+data = loads(stdin.read())
+
+output_path = data['output_path']
+avatar_path = data['avatar_path']
+username = data['username']
+username_color = data['username_color']
+text = data['text']
+
+username = shorten(username, width=15)
+text = fill(text, width=30)
+
+username = demojize(username)
+text = demojize(text)
+
+margin = 24
+hpadding = 18
+vpadding = 14
+avatar_padding = 12
+avatar_dim = 64
+
+font = ImageFont.truetype('./resources/fonts/OpenSans-Regular.ttf', 24)
+username_font = ImageFont.truetype('./resources/fonts/OpenSans-Bold.ttf', 22)
+tail = Image.open('./resources/tail.png')
+mask = Image.new('L', (avatar_dim * 3, avatar_dim * 3), 0)
+draw = ImageDraw.Draw(mask) 
+draw.ellipse((0, 0, avatar_dim * 3, avatar_dim * 3), fill=255)
+mask = mask.resize((avatar_dim, avatar_dim), Image.ANTIALIAS)
+tail_width, tail_height = tail.size
+
+avatar_width = avatar_dim + avatar_padding
+avatar_height = avatar_dim
+
+avatar = Image.open(avatar_path)
+avatar = avatar.resize((avatar_dim, avatar_dim))
+avatar.putalpha(mask)
+
+username_width, username_height = username_font.getsize(username)
+text_width, text_height = font.getsize_multiline(text)
+
+image_width = avatar_width + text_width + username_width + margin*2 + hpadding*2
+image_height = text_height + username_height + margin*2 + vpadding*2
+
+message = Image.new('RGBA', (image_width, image_height))
+message.paste(avatar, (margin, image_height - margin - avatar_height + 2), avatar)
+
+x1 = margin + avatar_dim + avatar_padding
+y1 = margin
+x2 = x1 + text_width + username_width + hpadding*2
+y2 = y1 + text_height + username_height + vpadding*2
+
+draw = ImageDraw.Draw(message)
+draw.rounded_rectangle((x1, y1, x2, y2), fill=(43, 43, 43), radius=7)
+draw.text((margin + avatar_width + hpadding, margin + vpadding/2), username, font=username_font, fill=COLORS[username_color])
+draw.multiline_text((margin + avatar_width + hpadding, margin + username_height + vpadding), text, font=font)
+
+message.paste(tail, (margin + avatar_width - tail_width + 8, image_height - margin - tail_height + 1), tail)
+
+ratio = image_width / image_height
+new_width = 512 if image_width >= image_height else min(int(512 / ratio), 512)
+new_height = 512 if image_height >= image_width else min(int(512 / ratio), 512)
+
+message = message.resize((new_width, new_height))
+
+message.save(output_path)

+ 5 - 2
openkriemy.py

@@ -66,8 +66,11 @@ async def on_message(event):
 
     return 
     
-  await event.delete()
-  
+  try:
+    await event.delete()
+  except:
+    pass
+    
   text = action.template.format(**{
     'initiator': get_link_to_user(event.sender),
     'target': get_link_to_user(target)

+ 91 - 0
openkriemy.py.bak

@@ -0,0 +1,91 @@
+from asyncio import run
+
+from telethon import TelegramClient
+from telethon.events import NewMessage
+from telethon.utils import resolve_bot_file_id
+
+from utils import parse_command, get_link_to_user
+from config import config
+from db import init_db
+from actions import (
+  find_action, 
+  get_random_gif,
+  is_admin
+)
+from commands import COMMANDS
+
+bot = TelegramClient(
+  'openkriemy', 
+  config.API_ID, 
+  config.API_HASH
+).start(bot_token=config.API_TOKEN)
+ 
[email protected](NewMessage)
+async def on_message(event):
+  try:
+    command = parse_command(event.text)
+  except ValueError:
+    return
+
+  handler = COMMANDS.get(command.name, None)
+
+  if handler:
+    if handler.is_restricted\
+   and not await is_admin(bot, event.sender):
+      await event.reply('К сожалению, данная команда Вам недоступна.')
+    else:
+      await handler.handler(bot, event, command)
+
+    return
+     
+  try:
+    action = await find_action(command.name)
+  except SyntaxError:
+    return
+
+  if not action:
+    return
+
+  reply_to = None
+  target = await event.get_reply_message()
+
+  if not target:
+    try:
+      target = await bot.get_entity(command.args[0])
+    except (ValueError, IndexError):
+      await event.reply('Это действие нужно применить на кого-то!')
+
+      return 
+  else:
+    reply_to = target
+    target = target.sender
+
+  if target.id == event.sender.id\
+ and not action.can_apply_to_self:
+    await event.reply('Данное действие нельзя применять к самому себе...')
+
+    return 
+    
+  await event.delete()
+  
+  text = action.template.format(**{
+    'initiator': get_link_to_user(event.sender),
+    'target': get_link_to_user(target)
+  })
+  
+  gif = await get_random_gif(action)
+
+  if gif:
+    gif = resolve_bot_file_id(gif.file_id)
+
+  await bot.send_message(
+    event.peer_id,
+    message=text,
+    file=gif,
+    reply_to=reply_to
+  )
+  
+with bot:
+  bot.loop.run_until_complete(init_db())
+  bot.start()
+  bot.run_until_disconnected()