|
@@ -2,15 +2,16 @@ import hashlib
|
|
|
from datetime import datetime
|
|
|
import config
|
|
|
import logging
|
|
|
-from utils.JabberBot import JabberBot
|
|
|
+from core.JabberBot import JabberBot
|
|
|
from slixmpp.stanza import Message
|
|
|
import jsonAndRequest as jsreq
|
|
|
from time import sleep
|
|
|
-from lib import run_process
|
|
|
+from core.lib import run_process
|
|
|
from classes.Ticket import Ticket
|
|
|
from typing import List
|
|
|
from concurrent.futures import ThreadPoolExecutor
|
|
|
-from utils.SystemdKiller import SystemdKiller
|
|
|
+from core.SystemdKiller import SystemdKiller
|
|
|
+from core.utils import get_init_data
|
|
|
|
|
|
botname = "open_access_request_pending"
|
|
|
operating_status = 320
|
|
@@ -38,6 +39,9 @@ INTERVAL_ATTEMPTS = 3
|
|
|
# INTERVAL_TIME = 30 * 60 # 30 минут в секундах
|
|
|
INTERVAL_TIME = 5 # Для проверки
|
|
|
|
|
|
+TEMP_TICKETS: List[Ticket] = []
|
|
|
+ID_TICKETS_FOR_REMOVE: List[int] = []
|
|
|
+
|
|
|
def message_handler(msg: Message):
|
|
|
"""Обработчик входящих сообщений"""
|
|
|
|
|
@@ -45,21 +49,39 @@ def message_handler(msg: Message):
|
|
|
text = msg['body'] # текст сообщения боту
|
|
|
sender = msg['from'] # отправитель сообщения
|
|
|
|
|
|
- if (str(sender).split("/")[0]) in listen_to:
|
|
|
+ sender_name = str(sender).split("/")[0]
|
|
|
+ if sender_name in listen_to:
|
|
|
if text is not None:
|
|
|
logging.info(f"Сообщение получено")
|
|
|
|
|
|
+ # match ACTION:
|
|
|
+ # case "add_ticket":
|
|
|
+ # match sender_name:
|
|
|
+ # case "open_*_request_*":
|
|
|
+ # TEMP_TICKETS.append(ticket)
|
|
|
+ # case "remove_ticket":
|
|
|
+ # ID_TICKETS_FOR_REMOVE.append(id)
|
|
|
+
|
|
|
+
|
|
|
def start_handler():
|
|
|
"""Событие запуска обработчика."""
|
|
|
|
|
|
logging.info(">>>>> %s |---| %s <<<<<", JID, PASSWORD)
|
|
|
|
|
|
- tickets: List[Ticket] = get_fake_data()
|
|
|
+ tickets: List[Ticket] = get_init_data(operating_status)
|
|
|
|
|
|
with ThreadPoolExecutor() as executor:
|
|
|
killer = SystemdKiller()
|
|
|
|
|
|
while not killer.exit_event.is_set():
|
|
|
+ # Получение тикетов от других обработчиков
|
|
|
+ tickets += TEMP_TICKETS
|
|
|
+ TEMP_TICKETS.clear()
|
|
|
+
|
|
|
+ # Фильтрация тикетов от лишних id
|
|
|
+ tickets = [ticket for ticket in tickets if ticket.id not in ID_TICKETS_FOR_REMOVE]
|
|
|
+ ID_TICKETS_FOR_REMOVE.clear()
|
|
|
+
|
|
|
# Параллельная обработка всех тикетов
|
|
|
processed = list(executor.map(run_process(interval_attempts_unlimited, processing), tickets))
|
|
|
|
|
@@ -73,7 +95,7 @@ def start_handler():
|
|
|
|
|
|
# START CUSTOM FUNCTIONS
|
|
|
|
|
|
-def interval_attempts_unlimited(ticket):
|
|
|
+def interval_attempts_unlimited(ticket: Ticket) -> None:
|
|
|
logging.debug(f"Лимит попыток обработки тикета {ticket.id} исчерпан")
|
|
|
|
|
|
# db.changestatus
|
|
@@ -86,23 +108,22 @@ def interval_attempts_unlimited(ticket):
|
|
|
# }
|
|
|
|
|
|
|
|
|
-def processing(ticket):
|
|
|
+def processing(ticket: Ticket) -> None:
|
|
|
logging.debug(f"Начало обработки тикета {ticket.id}")
|
|
|
|
|
|
- # Do something
|
|
|
+ message = f"Тикет {ticket.id} ожидает решения"
|
|
|
+
|
|
|
+ send_notification_to_admins(ticket, message)
|
|
|
+ bot.send_message(ticket.assigned_to, message)
|
|
|
|
|
|
logging.debug(f"Конец обработки тикета {ticket.id}")
|
|
|
|
|
|
|
|
|
-def get_fake_data() -> List[Ticket]:
|
|
|
- return [
|
|
|
- Ticket(0, "t", 0,0,0,0,0,0,0,0,0,"note",INTERVAL_ATTEMPTS - 2),
|
|
|
- Ticket(1, "t", 0,1,0,0,0,0,0,0,0,"note",INTERVAL_ATTEMPTS + 1),
|
|
|
- Ticket(2, "t", 0,2,0,0,0,0,0,0,0,"note",INTERVAL_ATTEMPTS - 1),
|
|
|
- Ticket(3, "t", 0,3,0,0,0,0,0,0,0,"note",INTERVAL_ATTEMPTS + 2),
|
|
|
- Ticket(4, "t", 0,4,0,0,0,0,0,0,0,"note",INTERVAL_ATTEMPTS + 1),
|
|
|
- Ticket(5, "t", 0,5,0,0,0,0,0,0,0,"note",INTERVAL_ATTEMPTS - 1),
|
|
|
- ]
|
|
|
+def send_notification_to_admins(ticket: Ticket, admins: List[str], message: str) -> None:
|
|
|
+ """Отправка уведомления администратору о новом тикете."""
|
|
|
+ for admin in admins:
|
|
|
+ bot.send_message(admin, message)
|
|
|
+ logging.info(f"Уведомление отправлено администраторам: {ticket.id}")
|
|
|
|
|
|
# def get_token():
|
|
|
# return jsreq.requestGetToken(botname, PASSWORD, config.API_URL + "/auth/token/login/")
|