Advertisement
Guest User

Untitled

a guest
Jun 22nd, 2018
70
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 4.00 KB | None | 0 0
  1. def __init__(self, *commands, prefixes=None, strict=False):
  2. """Answers with image containing stylish quote."""
  3.  
  4. if not commands:
  5. commands = ("цитата",)
  6.  
  7. super().__init__(*commands, prefixes=prefixes, strict=strict)
  8.  
  9. self.q = Image.open(self.get_path("q.png")).resize((40, 40), Image.LANCZOS)
  10. self.qf = self.q.copy().transpose(Image.FLIP_LEFT_RIGHT).transpose(Image.FLIP_TOP_BOTTOM)
  11.  
  12. self.f = ImageFont.truetype(self.get_path("font.ttf"), 24)
  13. self.fs = ImageFont.truetype(self.get_path("font.ttf"), 16)
  14. self.fss = ImageFont.truetype(self.get_path("font.ttf"), 15)
  15.  
  16. example = self.command_example()
  17. self.description = [f"💬 {example} [титул] - перешлите сообщение и укажите титул (по желанию) и "
  18. "получите цитату!"]
  19.  
  20. def make_image(self, img, text, name, last_name, timestamp, otext):
  21. rsize = (700, 400)
  22.  
  23. res = Image.open(self.get_path("/default.jpg")).convert('RGBA')
  24. res.paste(img, (25, 100))
  25.  
  26. tex = Image.new("RGBA", (rsize), (0, 0, 0, 0))
  27. draw = ImageDraw.Draw(tex)
  28.  
  29. if len(text) > 70:
  30. font = self.fss
  31. else:
  32. font = self.f
  33.  
  34. sidth = int(draw.textsize(" ", font=font)[0])
  35.  
  36. width, height = 0, 0
  37. new_text = ""
  38.  
  39. for line in text.splitlines():
  40. for word in line.split():
  41. word_width = len(word) * sidth
  42.  
  43. if width + word_width >= rsize[0] - 340:
  44. width = 0
  45. new_text += "n"
  46.  
  47. width += sidth + word_width
  48. new_text += word + " "
  49.  
  50. width = 0
  51. new_text += "n"
  52.  
  53. new_text = new_text[:-1]
  54.  
  55. width, height = draw.multiline_textsize(new_text, font=font)
  56. draw.multiline_text((0, 0), new_text, font=font)
  57.  
  58. y = rsize[1] // 2 - height // 2
  59. x = 300 + (rsize[0] - 370 - width) // 2
  60.  
  61. res.paste(tex, (x, y))
  62.  
  63. if y <= 10:
  64. return "Не получилось... простите."
  65.  
  66. if height < 210:
  67. height = 210
  68. y = rsize[1] // 2 - height // 2
  69.  
  70. res.paste(self.q, (240, y))
  71. res.paste(self.qf, (rsize[0] - 65, y + height - 40))
  72.  
  73. draw = ImageDraw.Draw(res)
  74. draw.multiline_text((25, 310), f"© {name} {last_name}{' - ' + otext if otext else ''}"
  75. f"n@ {timestamp_to_date(timestamp)}", font=self.fs)
  76.  
  77. buff = io.BytesIO()
  78. res.save(buff, format='png')
  79.  
  80. return buff.getvalue()
  81.  
  82. async def process_message(self, msg):
  83. command, otext = self.parse_message(msg)
  84.  
  85. i, url, name, last_name, timestamp = None, None, None, None, None
  86.  
  87. for m in traverse(await msg.get_full_forwarded()):
  88. if m.full_text:
  89. if i == m.true_user_id:
  90. text += "n" + m.full_text
  91. continue
  92. elif i is not None:
  93. break
  94.  
  95. i = m.true_user_id
  96. timestamp = m.timestamp
  97.  
  98. u = await self.api.users.get(user_ids=i, fields="photo_max")
  99. if not u:
  100. continue
  101.  
  102. u = u[0]
  103.  
  104. url = u["photo_max"]
  105. name = u["first_name"]
  106. last_name = u["last_name"]
  107.  
  108. text = m.full_text
  109. else:
  110. if i is None:
  111. return await msg.answer("Нечего цитировать!")
  112.  
  113. async with aiohttp.ClientSession() as sess:
  114. async with sess.get(url) as response:
  115. img = Image.open(io.BytesIO(await response.read())).convert('RGBA')
  116. img = img.resize((200, 200))
  117. ll_size = (1000, 100,)
  118. mask = Image.new('L', ll_size, 0)
  119. draw = ImageDraw.Draw(mask)
  120. draw.ellipse((0, 0) + ll_size, fill=255)
  121.  
  122. mask = ImageOps.fit(mask, img.size, method=Image.BITCUBIC, centering=(0.5, 0.5))
  123. img.putalpha(mask)
  124.  
  125. result = await self.run_in_executor(self.make_image, img, text, name, last_name, timestamp, otext)
  126.  
  127. if isinstance(result, str):
  128. return await msg.answer(result)
  129.  
  130. attachment = await upload_photo(self.api, result, msg.user_id)
  131.  
  132. return await msg.answer(attachment=str(attachment))
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement