modules.py 4.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160
  1. """
  2. Класс контекста сообщения.
  3. Класс события нового сообщения
  4. Author: Milinuri Nirvalen
  5. """
  6. from .ui import Logger
  7. import time
  8. class Context:
  9. def __init__(self, app, backend=None, event={}):
  10. '''вспомогательный класс для вызываемых функций
  11. :param app: экземпляр Чио
  12. :optional param backend: экземпляр движка
  13. :optional param event: экземпляр события'''
  14. self.app = app
  15. self.backend = backend
  16. self.event = event
  17. # описание времени
  18. self.now = self.event.get('date', int(time.time()))
  19. self.minutes = round(self.now/60)*60
  20. self.strtime = time.ctime(self.now)
  21. async def message(self, message, **params):
  22. '''функция отправки сообщения
  23. :param message: текст сообщения
  24. :param **params: дополнительные передоваемые переметры
  25. :return: API ответ'''
  26. # если не указана точка назначения --> id чата из события
  27. if 'peer_id' not in params:
  28. params['peer_id'] = self.event.get('to.id')
  29. return await self.backend.message(self.event, message, **params)
  30. async def request(self, method, **params):
  31. '''отправка API запроса
  32. : param method : названия API метода
  33. : param **params : дополнительно передаваемые перемтры
  34. : return : {"error":bool:, "response":dict}'''
  35. return await self.backend.request(method, **params)
  36. async def upload_photo(self, file=None, b=None, peer_id=None):
  37. '''метод загрузки фотографии
  38. : param file : путь до файла
  39. : param b : bytes переменная изображения
  40. : param peer_id : точка назначения
  41. : return : API ответ'''
  42. return await self.backend.upload_photo(file, b, peer_id)
  43. class Event:
  44. __slots__ = ("model")
  45. def __init__(self, model={}):
  46. """класс события
  47. :optional param model: словарь своей модели события"""
  48. self.model = model or {
  49. 'from':{
  50. 'id':0,
  51. 'is_mechanism':False,
  52. 'first_name':'',
  53. 'last_name':'',
  54. 'username':'',
  55. 'is_admin':False,
  56. },
  57. 'to':{
  58. 'is_chat':False,
  59. 'id':0,
  60. 'is_admin':False},
  61. 'id':0,
  62. 'level':1,
  63. 'attachs':[],
  64. 'reply':{},
  65. 'date':0,
  66. 'text':'',
  67. 'action':{},
  68. 'raw':None}
  69. def get(self, param, value=None):
  70. '''метод получения параметра модели
  71. пример:
  72. get("a.b") = event.model["a"]["b"]
  73. :param param: название переметра 1.2.3
  74. :optional param value: возвращаемое значени при отцуцтвии параметра
  75. :return: например 1.2, значение 2, если не найдено, 1 или value'''
  76. params = param.split('.')
  77. temp = self.model.get(params[0])
  78. for p in params[1:]:
  79. if type(temp) == dict:
  80. temp = temp.get(p)
  81. return temp or value
  82. def merge(self, target, model=None):
  83. '''метод совмещения словаря с self.model
  84. :param target: словарь, который необходимо совместить
  85. :optional param model: начальный словарь для совмещения, или self.model'''
  86. if not model:
  87. model = self.model
  88. for k, v in target.items():
  89. if k in model:
  90. if type(v) == dict and type(model[k]) == dict:
  91. self.merge(v, model[k])
  92. model[k] = v
  93. def replaceParam(self, index, key, value):
  94. '''метод замены параметра словаря
  95. пример:
  96. get("a.b", c) = indexl["a"]["b"] = c
  97. :param index: словарь, для которого необходимо произвести изменения
  98. :param key: ключи словаря 1.2.3
  99. :param value: значени для замены
  100. :return: изменённый словарь'''
  101. if isinstance(key, str):
  102. keys = key.split('.')
  103. else:
  104. keys = key
  105. for x in keys:
  106. keys.pop(0)
  107. if x not in index:
  108. if keys:
  109. index[x] = {}
  110. else:
  111. index[x] = value
  112. if keys:
  113. index[x] = self.replaceParam(index[x], keys, value)
  114. else:
  115. index[x] = value
  116. return index
  117. def set(self, param, arg):
  118. '''обёртка метода replaceParam для self.model
  119. :param param: ключи словаря 1.2.3
  120. :param value: значени для замены'''
  121. self.model = self.replaceParam(self.model, param, arg)