commands.py 5.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218
  1. from sys import executable
  2. from asyncio import create_subprocess_shell
  3. from asyncio.subprocess import PIPE
  4. from ujson import dumps
  5. from tortoise.exceptions import IntegrityError
  6. from telethon.utils import get_display_name
  7. from aiofiles.os import remove
  8. from emoji import is_emoji
  9. from actions import (
  10. find_action,
  11. create_action,
  12. delete_action,
  13. add_gif,
  14. add_sticker,
  15. assign_color,
  16. add_admin,
  17. delete_admin
  18. )
  19. from utils import make_temporary_filename, parse_kind
  20. class Handler:
  21. def __init__(self, handler, is_restricted=False):
  22. self.handler = handler
  23. self.is_restricted = is_restricted
  24. async def newadmin_handler(bot, event, command):
  25. if command.argc < 1:
  26. await event.reply('Пожалуйста, укажите пользователя!')
  27. return
  28. try:
  29. target = await bot.get_entity(command.args[0])
  30. except ValueError:
  31. await event.reply('Недопустимое имя пользователя!')
  32. return
  33. try:
  34. await add_admin(target)
  35. except IntegrityError:
  36. await event.reply('Данный пользователь уже является администратором!')
  37. return
  38. await event.reply('Готово!~~')
  39. async def deladmin_handler(bot, event, command):
  40. if command.argc < 1:
  41. await event.reply('Пожалуйста, укажите пользователя!')
  42. return
  43. try:
  44. target = await bot.get_entity(command.args[0])
  45. except ValueError:
  46. await event.reply('Недопустимое имя пользователя!')
  47. return
  48. try:
  49. await delete_admin(target)
  50. except IndexError:
  51. await event.reply('Данный пользователь не является администратором!')
  52. return
  53. await event.reply('Готово!~~')
  54. async def newaction_handler(bot, event, command):
  55. if command.argc < 3:
  56. await event.reply('Пожалуйста, укажите тип, имя и шаблон действия!')
  57. return
  58. try:
  59. kind = parse_kind(command.args[0])
  60. except ValueError:
  61. await event.reply('Неверный тип действия!!!')
  62. return
  63. try:
  64. await create_action(command.args[1], ' '.join(command.args[2:]), kind)
  65. except SyntaxError:
  66. await event.reply('Недопустимое имя действия!!!')
  67. return
  68. except IntegrityError:
  69. await event.reply('Действие с таким названием уже существует!')
  70. return
  71. await event.reply('Действие создано!')
  72. async def delaction_handler(bot, event, command):
  73. if command.argc < 1:
  74. await event.reply('Пожалуйста, укажите имя действия!')
  75. return
  76. try:
  77. await delete_action(command.args[0])
  78. except SyntaxError:
  79. await event.reply('Недопустимое имя действия!!!')
  80. return
  81. except NameError:
  82. await event.reply('Действия с таким названием не существует!')
  83. return
  84. await event.reply('Действие удалено!')
  85. async def addgif_handler(bot, event, command):
  86. if command.argc < 1:
  87. await event.reply('Пожалуйста, укажите имя действия!')
  88. return
  89. gif = await event.get_reply_message()
  90. if not gif or not gif.gif:
  91. await event.reply('Пожалуйста, добавьте GIF!')
  92. return
  93. try:
  94. action = await find_action(command.args[0])
  95. await add_gif(action, gif.file.id)
  96. except SyntaxError:
  97. await event.reply('Недопустимое имя действия!!!')
  98. return
  99. except NameError:
  100. await event.reply('Нет такого действия!')
  101. return
  102. await event.reply('Готово!~~')
  103. # Very, very, VERY evil code...
  104. async def make_message_shot(bot, message):
  105. proc = await create_subprocess_shell(
  106. f'{executable} makeshot.py',
  107. stdin=PIPE
  108. )
  109. output_path = make_temporary_filename('png')
  110. avatar_path = make_temporary_filename('png')
  111. if message.sender is None:
  112. await bot.download_profile_photo(message.peer_id.channel_id, file=avatar_path)
  113. full_name = await bot.get_entity(message.peer_id.channel_id)
  114. full_name = full_name.title
  115. else:
  116. await bot.download_profile_photo(message.sender, file=avatar_path)
  117. full_name = get_display_name(message.sender)
  118. data = dumps({
  119. 'output_path': output_path,
  120. 'avatar_path': avatar_path,
  121. 'username': full_name if full_name else message.sender.username,
  122. 'username_color': await assign_color(message.sender.id if message.sender else message.peer_id.channel_id),
  123. 'text': message.text
  124. }).encode('UTF-8')
  125. await proc.communicate(input=data)
  126. await remove(avatar_path)
  127. return output_path
  128. async def save_handler(bot, event, command):
  129. message = await event.get_reply_message()
  130. if not message:
  131. await event.reply('Пожалуйста, укажите сообщение для сохранения!')
  132. return
  133. emoji = '⚡'
  134. if command.argc >= 1:
  135. emoji = command.args[0]
  136. if len(emoji) not in range(1, 6)\
  137. or not all(map(is_emoji, emoji)):
  138. await event.reply('Указан некорректный эмодзи!!!')
  139. return
  140. path = await make_message_shot(bot, message)
  141. return
  142. try:
  143. file = await add_sticker(bot, path, emoji)
  144. await bot.send_file(
  145. message.peer_id,
  146. file=file,
  147. reply_to=message
  148. )
  149. finally:
  150. await remove(path)
  151. COMMANDS = {
  152. 'newadmin': Handler(newadmin_handler, is_restricted=True),
  153. 'deladmin': Handler(deladmin_handler, is_restricted=True),
  154. 'newaction': Handler(newaction_handler, is_restricted=True),
  155. 'delaction': Handler(delaction_handler, is_restricted=True),
  156. 'addgif': Handler(addgif_handler, is_restricted=True),
  157. 'save': Handler(save_handler)
  158. }