actions.py 3.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139
  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
  9. from utils import is_valid_name
  10. from config import config
  11. async def is_admin(bot, user):
  12. admin = await bot.get_entity(config.ADMIN)
  13. if user.id == admin.id:
  14. return True
  15. admin = await Admin.filter(user_id=user.id)
  16. if admin:
  17. return True
  18. return False
  19. async def add_admin(user):
  20. await Admin(user_id=user.id).save()
  21. async def delete_admin(user):
  22. admin = await Admin.filter(user_id=user.id).first()
  23. if not admin:
  24. raise IndexError
  25. await admin.delete()
  26. async def create_action(name, template, kind):
  27. if not is_valid_name(name):
  28. raise SyntaxError
  29. await Action(name=name, template=template, kind=kind).save()
  30. async def find_action(name):
  31. if not is_valid_name(name):
  32. raise SyntaxError
  33. return await Action.filter(name=name).first()
  34. async def delete_action(name):
  35. action = await find_action(name)
  36. if not action:
  37. raise NameError
  38. gifs = await action.gifs.all()
  39. for gif in gifs:
  40. await gif.delete()
  41. await action.delete()
  42. async def add_gif(action, file_id):
  43. await Gif(action=action, file_id=file_id).save()
  44. async def get_random_gif(action):
  45. return await action.gifs.all().annotate(order=Random()).order_by('order').first()
  46. async def create_new_pack(bot, sticker):
  47. last_pack = await StickerPack.all().order_by('-id').first()
  48. set_id = last_pack.id + 1 if last_pack else 1
  49. user = await bot.get_entity(config.USER)
  50. me = await bot.get_me()
  51. bot_username = me.username
  52. pack = await bot(CreateStickerSetRequest(
  53. user_id=user.id,
  54. title=f'Messages #{set_id}.',
  55. short_name=f'messages{set_id}_by_{bot_username}',
  56. stickers=[sticker]
  57. ))
  58. sid = pack.set.id
  59. hash = pack.set.access_hash
  60. await StickerPack(
  61. short_name=pack.set.short_name,
  62. sid=sid,
  63. hash=hash
  64. ).save()
  65. return pack
  66. async def get_current_pack(bot):
  67. pack = await StickerPack.all().order_by('-id').first()
  68. if not pack or pack.stickers_count == 119:
  69. return None
  70. return pack
  71. async def add_sticker(bot, file, emoji):
  72. file = await bot.upload_file(file)
  73. file = InputMediaUploadedDocument(file, 'image/png', [])
  74. file = await bot(UploadMediaRequest(InputPeerSelf(), file))
  75. file = get_input_document(file)
  76. sticker = InputStickerSetItem(document=file, emoji=emoji)
  77. pack = await get_current_pack(bot)
  78. if not pack:
  79. pack = await create_new_pack(bot, sticker)
  80. else:
  81. await StickerPack.filter(id=pack.id).update(stickers_count=F('stickers_count') + 1)
  82. pack = await bot(AddStickerToSetRequest(
  83. stickerset=InputStickerSetID(
  84. id=pack.sid,
  85. access_hash=pack.hash
  86. ),
  87. sticker=sticker
  88. ))
  89. return get_input_document(pack.documents[-1])
  90. async def get_birthdays(peer_id):
  91. return await BirthDay.filter(peer_id=peer_id).all()
  92. async def add_or_update_birthday(peer_id, user, date):
  93. birthday = await BirthDay.filter(peer_id=peer_id, user_id=user.id).first()
  94. if birthday:
  95. await BirthDay.filter(id=birthday.id).update(date=date)
  96. return False
  97. await BirthDay(
  98. peer_id=peer_id,
  99. user_id=user.id,
  100. date=date
  101. ).save()
  102. return True