actions.py 6.3 KB

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