st_request_in_process.py 3.8 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586
  1. import hashlib
  2. import threading
  3. import time
  4. from datetime import datetime
  5. import config
  6. import jsonAndRequest as jsreq
  7. global ticketlist
  8. botname = "st_request_wontfix"
  9. JID = botname + "@" + config.JSERVER
  10. PORT = config.PORT
  11. PASSWORD = hashlib.md5((botname + config.PASSWORD).encode('utf-8')).hexdigest()
  12. listen_to = ["st_request_wontfix@ej.sharix-app.org"]
  13. proceed_to = ["numbers"]
  14. # Новые параметры
  15. INFINITE_TIMEOUT = -1 # Бесконечный таймаут
  16. DEFAULT_REMINDER_INTERVAL = 30 * 60 # 30 минут в секундах
  17. MAX_REMINDERS = 3 # Максимальное количество напоминаний
  18. def send_reminder(user, ticket):
  19. message = f"Напоминание: необходимо принять решение по тикету {ticket.id}"
  20. # Здесь должен быть код для отправки сообщения пользователю
  21. print(f"Отправлено напоминание пользователю {user} о тикете {ticket.id}")
  22. def send_wontfix_notification(user, ticket):
  23. message = f"Уведомление: тикет {ticket.id} был отмечен как WONTFIX из-за отсутствия действий"
  24. # Здесь должен быть код для отправки сообщения пользователю
  25. print(f"Отправлено уведомление пользователю {user} о WONTFIX для тикета {ticket.id}")
  26. def process_in_progress_ticket(ticket, timeout, reminder_interval):
  27. start_time = datetime.now()
  28. reminders_sent = 0
  29. while True:
  30. current_time = datetime.now()
  31. time_in_progress = (current_time - start_time).total_seconds()
  32. if timeout != INFINITE_TIMEOUT and time_in_progress > timeout:
  33. # Превышен таймаут, меняем статус на WONTFIX
  34. jsreq.requestPatchTicketUser(token, config.API_URL + f"tickets/api/ticket/{ticket.id}/",
  35. {"status": "WONTFIX"})
  36. send_wontfix_notification(ticket.assigned_to, ticket)
  37. break
  38. if time_in_progress >= (reminders_sent + 1) * reminder_interval:
  39. send_reminder(ticket.assigned_to, ticket)
  40. reminders_sent += 1
  41. if reminders_sent >= MAX_REMINDERS:
  42. # Превышено максимальное количество напоминаний
  43. jsreq.requestPatchTicketUser(token, config.API_URL + f"tickets/api/ticket/{ticket.id}/",
  44. {"status": "WONTFIX"})
  45. send_wontfix_notification(ticket.assigned_to, ticket)
  46. break
  47. # Проверяем, не изменился ли статус тикета
  48. updated_ticket_list = jsreq.requestGetTicket_user(token, config.API_URL + f"tickets/api/ticket/{ticket.id}/")
  49. if updated_ticket_list and updated_ticket_list[0].status != "IN PROCESS":
  50. break
  51. time.sleep(60) # Проверяем каждую минуту
  52. def status_changer():
  53. while True:
  54. ticketlist = jsreq.requestGetList(token, config.API_URL + "tickets/api/ticket_list/")
  55. for ticket in ticketlist:
  56. if ticket.status == "IN PROCESS":
  57. bot.bot_log(f"{botname} {datetime.now().strftime('%Y-%m-%d')} Тикет {ticket.id} в обработке\n")
  58. t1 = threading.Thread(target=process_in_progress_ticket,
  59. args=(ticket, INFINITE_TIMEOUT, DEFAULT_REMINDER_INTERVAL))
  60. t1.start()
  61. time.sleep(300) # Обновляем ticketlist каждые 5 минут
  62. # Инициализация и запуск бота
  63. token = jsreq.requestGetToken(config.API_URL + "api/v1/auth/token/login/")
  64. bot = JabberBot(JID, PASSWORD, PORT)
  65. bot.start(status_changer)