open_access_request_pending.py 8.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219
  1. import hashlib
  2. from datetime import datetime
  3. import config
  4. import logging
  5. from core.JabberBot import JabberBot
  6. from slixmpp.stanza import Message
  7. import jsonAndRequest as jsreq
  8. from time import sleep
  9. from core.lib import run_process
  10. from classes.Ticket import Ticket
  11. from typing import List
  12. from concurrent.futures import ThreadPoolExecutor
  13. from core.SystemdKiller import SystemdKiller
  14. from core.utils import get_init_data
  15. botname = "open_access_request_pending"
  16. operating_status = 320
  17. JID = botname + "@" + config.JSERVER
  18. PORT = config.PORT
  19. PASSWORD = hashlib.md5((botname + config.PASSWORD).encode('utf-8')).hexdigest()
  20. bot = JabberBot(JID, PASSWORD)
  21. # таким образом хранится список jid, от которых можно получать сообщения этому боту
  22. listen_to = [
  23. "test@ej.sharix-app.org",
  24. "open_template_bot@ej.sharix-app.org"
  25. ]
  26. # тут хранится список jid, кому бот может отправлять сообщения в результате обработки заявки
  27. proceed_to = [
  28. JID,
  29. "open_st_request_declined@ej.sharix-app.org",
  30. "open_service_request_forcemajeure@ej.sharix-app.org"
  31. ]
  32. INTERVAL_ATTEMPTS = 3
  33. # INTERVAL_TIME = 30 * 60 # 30 минут в секундах
  34. INTERVAL_TIME = 5 # Для проверки
  35. TEMP_TICKETS: List[Ticket] = []
  36. ID_TICKETS_FOR_REMOVE: List[int] = []
  37. def message_handler(msg: Message):
  38. """Обработчик входящих сообщений"""
  39. if msg['type'] in ('chat', 'normal'):
  40. text = msg['body'] # текст сообщения боту
  41. sender = msg['from'] # отправитель сообщения
  42. sender_name = str(sender).split("/")[0]
  43. if sender_name in listen_to:
  44. if text is not None:
  45. logging.info(f"Сообщение получено")
  46. # match ACTION:
  47. # case "add_ticket":
  48. # match sender_name:
  49. # case "open_*_request_*":
  50. # TEMP_TICKETS.append(ticket)
  51. # case "remove_ticket":
  52. # ID_TICKETS_FOR_REMOVE.append(id)
  53. def start_handler():
  54. """Событие запуска обработчика."""
  55. logging.info(">>>>> %s |---| %s <<<<<", JID, PASSWORD)
  56. tickets: List[Ticket] = get_init_data(operating_status)
  57. with ThreadPoolExecutor() as executor:
  58. killer = SystemdKiller()
  59. while not killer.exit_event.is_set():
  60. # Получение тикетов от других обработчиков
  61. tickets += TEMP_TICKETS
  62. TEMP_TICKETS.clear()
  63. # Фильтрация тикетов от лишних id
  64. tickets = [ticket for ticket in tickets if ticket.id not in ID_TICKETS_FOR_REMOVE]
  65. ID_TICKETS_FOR_REMOVE.clear()
  66. # Параллельная обработка всех тикетов
  67. processed = list(executor.map(run_process(interval_attempts_unlimited, processing), tickets))
  68. # Фильтрация тикетов
  69. tickets = [t for t in processed if t is not None]
  70. logging.debug(tickets)
  71. logging.debug("Sleep")
  72. killer.exit_event.wait(timeout=INTERVAL_TIME)
  73. # START CUSTOM FUNCTIONS
  74. def interval_attempts_unlimited(ticket: Ticket) -> None:
  75. logging.debug(f"Лимит попыток обработки тикета {ticket.id} исчерпан")
  76. # db.changestatus
  77. # bot.send_message(JID, f"Сообщение отправлено {JID}: {datetime.now()}")
  78. # bot message:
  79. # {
  80. # "action": "add_ticket"
  81. # "ticket_id": 0
  82. # "ticket_list_id": 0
  83. # }
  84. def processing(ticket: Ticket) -> None:
  85. logging.debug(f"Начало обработки тикета {ticket.id}")
  86. message = f"Тикет {ticket.id} ожидает решения"
  87. send_notification_to_admins(ticket, message)
  88. bot.send_message(ticket.assigned_to, message)
  89. logging.debug(f"Конец обработки тикета {ticket.id}")
  90. def send_notification_to_admins(ticket: Ticket, admins: List[str], message: str) -> None:
  91. """Отправка уведомления администратору о новом тикете."""
  92. for admin in admins:
  93. bot.send_message(admin, message)
  94. logging.info(f"Уведомление отправлено администраторам: {ticket.id}")
  95. # def get_token():
  96. # return jsreq.requestGetToken(botname, PASSWORD, config.API_URL + "/auth/token/login/")
  97. # def set_tasklist(token):
  98. # global tasklist
  99. # tasklist = []
  100. # tasklist = jsreq.requestGetList(token, config.API_URL + "/tickets/api/tickets/?list_id=10")
  101. # END CUSTOM FUNCTIONS
  102. # ---------------------------------------
  103. # ---------------------------------------
  104. # ---------------------------------------
  105. # ---------------------------------------
  106. # ---------------------------------------
  107. # # обработчик входящих сообщений
  108. # def message_handler(conn, mess):
  109. # text = mess.getBody() # текст сообщения боту
  110. # user = mess.getFrom() # отправитель сообщения
  111. # print(str(user).split("/")[0])
  112. # if (str(user).split("/")[0]) in listen_to:
  113. # print(text)
  114. # print(mess)
  115. # if text is not None:
  116. # orderObj = jsreq.jsonToOrderTicket(text)
  117. # print(orderObj)
  118. # tasklist.append(orderObj)
  119. # bot.bot_log(str(datetime.now()) + " Поступивший заказ успешно добавлен в очередь обработки\n")
  120. # def open_access_request_pending_wait(period, localtask):
  121. # bot.bot_log(botname + " " + str(datetime.now()) + " " + "Заказ ожидает\n")
  122. # time.sleep(period)
  123. # # ВАЖНО! Надо скорее всего через API редактировать заказ, иначе возможна потеря данных
  124. # localtask.title = localtask.title + "1"
  125. # # обязательно данный обработчик должен заканчиваться передачей заказа куда-то на обработку дальше - обратно или другому, иначе оно потеряется
  126. # bot.proceed_status(proceed_to[1], localtask)
  127. # bot.bot_log(botname + " " + str(datetime.now()) + " " + "Заказ перенаправлен\n")
  128. # def open_access_request_pending_process(localtask):
  129. # bot.bot_log(botname + " " + str(datetime.now()) + " " + "Заказ в обработчике\n")
  130. # push_notifications(localtask)
  131. # open_access_request_pending_wait(100, localtask)
  132. # # Пока не уверен
  133. # def push_notifications(localtask):
  134. # # Отправка уведомлений
  135. # # ...
  136. # return True
  137. # def open_access_request_pending():
  138. # while (len(tasklist)):
  139. # localtask = tasklist.pop(0)
  140. # bot.bot_log(botname + " " + datetime.now().strftime('%Y-%m-%d') + " " + "Заказ в очереди на обработке\n")
  141. # print("EACH TASKLIST", tasklist)
  142. # if (localtask.status != operating_status):
  143. # bot.proceed_status(proceed_to[-1], localtask)
  144. # bot.bot_log(botname + " " + str(datetime.now()) + " " + "Заказ не по адресу, перенаправляем на форсмажор\n")
  145. # continue
  146. # # if (localtask.title!="10"):
  147. # # t1=threading.Thread(target=open_service_request_booked_wait, args=(5,localtask))
  148. # # t1.start()
  149. # # if (localtask.title=="101"):
  150. # # t1=threading.Thread(target=open_service_request_booked_process, args=(10,localtask))
  151. # # t1.start()
  152. # t1 = threading.Thread(target=open_access_request_pending_process, args=(localtask))
  153. # t1.start()
  154. # # если никакие обработчики не подошли - отправляем обратно в очередь
  155. # bot.proceed_status(proceed_to[0], localtask)
  156. # print("Заказ возвращен в очередь\n")
  157. # print(tasklist)
  158. # # пустой список заказов