actions.py 5.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225
  1. from random import randint
  2. from tortoise.contrib.postgres.functions import Random
  3. from telethon.utils import get_input_document
  4. from telethon.tl.functions.stickers import CreateStickerSetRequest, AddStickerToSetRequest
  5. from telethon.tl.functions.messages import UploadMediaRequest, GetStickerSetRequest
  6. from telethon.tl.types import InputStickerSetID, InputStickerSetShortName, InputStickerSetItem, InputMediaUploadedDocument, InputPeerSelf
  7. from tortoise.expressions import F
  8. from models import Action, Gif, StickerPack, Admin, BirthDay, VPNServer, AllowedChat
  9. from utils import (
  10. is_valid_name,
  11. is_valid_ip
  12. )
  13. from config import config
  14. async def is_admin(bot, user):
  15. admin = await bot.get_entity(config.ADMIN)
  16. if user.id == admin.id:
  17. return True
  18. admin = await Admin.filter(user_id=user.id)
  19. if admin:
  20. return True
  21. return False
  22. async def add_admin(user):
  23. await Admin(user_id=user.id).save()
  24. async def delete_admin(user):
  25. admin = await Admin.filter(user_id=user.id).first()
  26. if not admin:
  27. raise IndexError
  28. await admin.delete()
  29. async def create_action(name, template, kind):
  30. if not is_valid_name(name):
  31. raise SyntaxError
  32. await Action(name=name, template=template, kind=kind).save()
  33. async def find_action(name):
  34. if not is_valid_name(name):
  35. raise SyntaxError
  36. return await Action.filter(name=name).first()
  37. async def delete_action(name):
  38. action = await find_action(name)
  39. if not action:
  40. raise NameError
  41. gifs = await action.gifs.all()
  42. for gif in gifs:
  43. await gif.delete()
  44. await action.delete()
  45. async def add_gif(action, file_id):
  46. await Gif(action=action, file_id=file_id).save()
  47. async def get_random_gif(action):
  48. return await action.gifs.all().annotate(order=Random()).order_by('order').first()
  49. async def create_new_pack(bot, sticker):
  50. last_pack = await StickerPack.all().order_by('-id').first()
  51. set_id = last_pack.id + 1 if last_pack else 1
  52. user = await bot.get_entity(config.USER)
  53. me = await bot.get_me()
  54. bot_username = me.username
  55. pack = await bot(CreateStickerSetRequest(
  56. user_id=user.id,
  57. title=f'Messages #{set_id}.',
  58. short_name=f'messages{set_id}_by_{bot_username}',
  59. stickers=[sticker]
  60. ))
  61. sid = pack.set.id
  62. hash = pack.set.access_hash
  63. await StickerPack(
  64. short_name=pack.set.short_name,
  65. sid=sid,
  66. hash=hash
  67. ).save()
  68. return pack
  69. async def get_current_pack(bot):
  70. pack = await StickerPack.all().order_by('-id').first()
  71. if not pack or pack.stickers_count == 119:
  72. return None
  73. return pack
  74. async def add_sticker(bot, file, emoji):
  75. file = await bot.upload_file(file)
  76. file = InputMediaUploadedDocument(file, 'image/png', [])
  77. file = await bot(UploadMediaRequest(InputPeerSelf(), file))
  78. file = get_input_document(file)
  79. sticker = InputStickerSetItem(document=file, emoji=emoji)
  80. pack = await get_current_pack(bot)
  81. if not pack:
  82. pack = await create_new_pack(bot, sticker)
  83. else:
  84. await StickerPack.filter(id=pack.id).update(stickers_count=F('stickers_count') + 1)
  85. pack = await bot(AddStickerToSetRequest(
  86. stickerset=InputStickerSetID(
  87. id=pack.sid,
  88. access_hash=pack.hash
  89. ),
  90. sticker=sticker
  91. ))
  92. return get_input_document(pack.documents[-1])
  93. async def get_birthdays(peer_id):
  94. return await BirthDay.filter(peer_id=peer_id).all()
  95. async def add_or_update_birthday(peer_id, user, date):
  96. birthday = await BirthDay.filter(peer_id=peer_id, user_id=user.id).first()
  97. if birthday:
  98. await BirthDay.filter(id=birthday.id).update(date=date)
  99. return False
  100. await BirthDay(
  101. peer_id=peer_id,
  102. user_id=user.id,
  103. date=date
  104. ).save()
  105. return True
  106. async def get_all_birthdays():
  107. return await BirthDay.all()
  108. async def add_server(name, ip):
  109. if not is_valid_ip(ip):
  110. raise ValueError
  111. await VPNServer(
  112. name=name,
  113. ip=ip
  114. ).save()
  115. async def add_server(name, ip):
  116. if not is_valid_name(name):
  117. raise SyntaxError
  118. if not is_valid_ip(ip):
  119. raise ValueError
  120. await VPNServer(
  121. name=name,
  122. ip=ip
  123. ).save()
  124. async def delete_server(name):
  125. if not is_valid_name(name):
  126. raise SyntaxError
  127. server = await VPNServer.filter(
  128. name=name
  129. ).first()
  130. if not server:
  131. raise IndexError
  132. await server.delete()
  133. async def list_servers():
  134. servers = await VPNServer.all()
  135. if not servers:
  136. return '*пусто*'
  137. return ', '.join(
  138. map(
  139. lambda server: server.name,
  140. servers
  141. )
  142. )
  143. async def get_server_ip(name):
  144. if not is_valid_name(name):
  145. raise SyntaxError
  146. server = await VPNServer.filter(
  147. name=name
  148. ).first()
  149. if not server:
  150. raise IndexError
  151. return server.ip
  152. async def add_allowed(peer_id):
  153. await AllowedChat(
  154. peer_id=peer_id
  155. ).create()
  156. async def delete_allowed(peer_id):
  157. chat = await AllowedChat.filter(
  158. peer_id=peer_id
  159. ).first()
  160. if not chat:
  161. raise IndexError
  162. await chat.delete()
  163. async def is_allowed(peer_id):
  164. return await AllowedChat.filter(
  165. peer_id=peer_id
  166. ).exists()