utils.py 2.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105
  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_user_name(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. return full_name
  48. def get_link_to_user(user):
  49. full_name = get_user_name(user)
  50. if user.username:
  51. return f'[{full_name}](@{user.username})'
  52. return f'[{full_name}](tg://user?id={user.id})'
  53. def is_valid_name(name):
  54. return name.isidentifier()
  55. def make_temporary_filename(ext):
  56. uid = uuid4().hex
  57. return f'tmp_{uid}.{ext}'
  58. def parse_kind(kind):
  59. kind = int(kind)
  60. if kind < 0 or kind > 2:
  61. raise ValueError
  62. return kind
  63. # Bruh?
  64. def get_word_kind(number):
  65. if number == 0 or 5 <= number <= 20:
  66. return WordKind.SECOND
  67. last_digit = number % 10
  68. if last_digit == 0:
  69. return WordKind.SECOND
  70. if last_digit == 1:
  71. return WordKind.FIRST
  72. if 5 <= last_digit <= 9:
  73. return WordKind.SECOND
  74. return WordKind.THIRD