st_request_in_process.py 3.8 KB

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