open_access_request_pending.py 7.3 KB

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