open_access_request_pending.py 7.1 KB

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