utils.py 1.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100
  1. from uuid import uuid4
  2. from enum import IntEnum
  3. from collections import namedtuple
  4. from telethon.utils import get_display_name
  5. Command = namedtuple(
  6. 'Command',
  7. 'name argc args args_string'
  8. )
  9. class Kind(IntEnum):
  10. CANNOT_APPLY_TO_SELF = 0
  11. CAN_APPLY_TO_SELF = 1
  12. NO_TARGET = 2
  13. class WordKind(IntEnum):
  14. FIRST = 0 # «год» / «день».
  15. SECOND = 1 # «лет» / «дней».
  16. THIRD = 2 # «года» / «дня».
  17. WORDS_TABLE = {
  18. 'год': ('год', 'лет', 'года'),
  19. 'день': ('день', 'дней', 'дня')
  20. }
  21. def parse_command(text):
  22. text = text.strip()
  23. if not text.startswith('/'):
  24. raise ValueError
  25. text = text.split(' ')
  26. if len(text) < 1:
  27. raise ValueError
  28. command = text[0][1:].lower()
  29. if '@' in command:
  30. command = command.split('@')
  31. command = command[0]
  32. args = text[1:]
  33. argc = len(args)
  34. args_string = ' '.join(args)
  35. return Command(
  36. name=command,
  37. argc=argc,
  38. args=args,
  39. args_string=args_string
  40. )
  41. def get_link_to_user(user):
  42. full_name = get_display_name(user)
  43. if not full_name:
  44. full_name = user.username
  45. if not full_name:
  46. full_name = '?'
  47. if user.username:
  48. return f'[{full_name}](@{user.username})'
  49. return f'[{full_name}](tg://user?id={user.id})'
  50. def is_valid_name(name):
  51. return name.isidentifier()
  52. def make_temporary_filename(ext):
  53. uid = uuid4().hex
  54. return f'tmp_{uid}.{ext}'
  55. def parse_kind(kind):
  56. kind = int(kind)
  57. if kind < 0 or kind > 2:
  58. raise ValueError
  59. return kind
  60. # Bruh?
  61. def get_word_kind(number):
  62. if number == 0 or 5 <= number <= 20:
  63. return WordKind.SECOND
  64. last_digit = number % 10
  65. if last_digit == 0:
  66. return WordKind.SECOND
  67. if last_digit == 1:
  68. return WordKind.FIRST
  69. if 5 <= last_digit <= 9:
  70. return WordKind.SECOND
  71. return WordKind.THIRD