|
@@ -0,0 +1,176 @@
|
|
|
|
+import requests
|
|
|
|
+import xmpp
|
|
|
|
+from xmpp import cli
|
|
|
|
+import config
|
|
|
|
+from BotClass import JabberBot
|
|
|
|
+import json
|
|
|
|
+#раскомментировать, когда перейдем на разные пароли
|
|
|
|
+import hashlib
|
|
|
|
+from datetime import datetime
|
|
|
|
+
|
|
|
|
+import time
|
|
|
|
+import threading
|
|
|
|
+
|
|
|
|
+#test
|
|
|
|
+import jsonAndRequest as jsreq
|
|
|
|
+
|
|
|
|
+global tasklist
|
|
|
|
+
|
|
|
|
+botname="open_servicerequest_booked"
|
|
|
|
+# Пока не знаю какой
|
|
|
|
+operating_status=210
|
|
|
|
+JID=botname+"@"+config.JSERVER
|
|
|
|
+PORT=config.PORT
|
|
|
|
+
|
|
|
|
+PASSWORD=hashlib.md5((botname+config.PASSWORD).encode('utf-8')).hexdigest()
|
|
|
|
+
|
|
|
|
+print(JID, PASSWORD)
|
|
|
|
+
|
|
|
|
+#таким образом хранится список jid, от которых можно получать сообщения этому боту
|
|
|
|
+listen_to=["test@ej.sharix-app.org", "open_template_bot@ej.sharix-app.org"]
|
|
|
|
+
|
|
|
|
+#тут хранится список jid, кому бот может отправлять сообщения в результате обработки заявки
|
|
|
|
+proceed_to=["open_servicerequest_assigned@ej.sharix-app.org", "open_servicerequest_pending@ej.sharix-app.org", "open_servicerequest_forcemajeure@ej.sharix-app.org"]
|
|
|
|
+
|
|
|
|
+#максимальное значение попыток обработать заказ
|
|
|
|
+idle_value=10
|
|
|
|
+
|
|
|
|
+# обработчик входящих сообщений
|
|
|
|
+def message_handler(conn, mess):
|
|
|
|
+ text = mess.getBody()#текст сообщения боту
|
|
|
|
+ user = mess.getFrom()#отправитель сообщения
|
|
|
|
+
|
|
|
|
+ print (str(user).split("/")[0])
|
|
|
|
+ if (str(user).split("/")[0]) in listen_to:
|
|
|
|
+ print(text)
|
|
|
|
+ print(mess)
|
|
|
|
+
|
|
|
|
+ if text is not None:
|
|
|
|
+ orderObj = jsreq.jsonToOrderTicket(text)
|
|
|
|
+ print (orderObj)
|
|
|
|
+ tasklist.append(orderObj)
|
|
|
|
+ bot.bot_log(str(datetime.now())+" Поступивший заказ успешно добавлен в очередь обработки\n")
|
|
|
|
+
|
|
|
|
+def open_servicerequest_booked_wait(period,localtask):
|
|
|
|
+ bot.bot_log(botname+" "+str(datetime.now())+" "+"Заказ ожидает\n")
|
|
|
|
+ time.sleep(period)
|
|
|
|
+
|
|
|
|
+ #ВАЖНО! Надо скорее всего через API редактировать заказ, иначе возможна потеря данных
|
|
|
|
+ localtask.title=localtask.title+"1"
|
|
|
|
+
|
|
|
|
+ #обязательно данный обработчик должен заканчиваться передачей заказа куда-то на обработку дальше - обратно или другому, иначе оно потеряется
|
|
|
|
+ bot.proceed_status(proceed_to[0],localtask)
|
|
|
|
+ bot.bot_log(botname+" "+str(datetime.now())+" "+"Заказ подождал и возвращен в очередь\n")
|
|
|
|
+
|
|
|
|
+def open_servicerequest_booked_process(localtask):
|
|
|
|
+ bot.bot_log(botname+" "+str(datetime.now())+" "+"Заказ в обработчике\n")
|
|
|
|
+
|
|
|
|
+ order = jsreq.jsonToOrder(localtask)
|
|
|
|
+ #Пока заглушка
|
|
|
|
+ balance = get_balance(order.client_id)
|
|
|
|
+
|
|
|
|
+ # Какой тип цены лучше использовать?
|
|
|
|
+ price = order.real_price
|
|
|
|
+
|
|
|
|
+ if balance > price:
|
|
|
|
+ #Заказ на основного водителя?
|
|
|
|
+ if order.provider:
|
|
|
|
+ bot.proceed_status(proceed_to[1], localtask)
|
|
|
|
+ bot.bot_log(botname + " " + str(datetime.now()) + " " + "Заказ успешно обработан\n")
|
|
|
|
+ else:
|
|
|
|
+ # Проверка срочности заказа
|
|
|
|
+ if True:
|
|
|
|
+ #Заглушка назначение исполнителя системой
|
|
|
|
+ if set_provider(order.ticket, order.provider) == "success":
|
|
|
|
+ bot.proceed_status(proceed_to[0], localtask)
|
|
|
|
+ else:
|
|
|
|
+ bot.bot_log(botname+" "+str(datetime.now())+" "+"Ошибка назначения исполнителя\n")
|
|
|
|
+ else:
|
|
|
|
+ bot.proceed_status(proceed_to[1], localtask)
|
|
|
|
+
|
|
|
|
+ bot.bot_log(botname + " " + str(datetime.now()) + " " + "Заказ успешно обработан\n")
|
|
|
|
+ else:
|
|
|
|
+ # Заглушка получения оплаты от клиента
|
|
|
|
+ pass
|
|
|
|
+
|
|
|
|
+def get_balance(client):
|
|
|
|
+ headers = {'Authorization': f'Token {token}'}
|
|
|
|
+ # Передаем id пользователя и получаем его баланс
|
|
|
|
+ response = requests.get(config.API_URL+f"/api/example/{client}", headers=headers)
|
|
|
|
+ print(response.json())
|
|
|
|
+ ordertext=response.json()
|
|
|
|
+
|
|
|
|
+ if not ordertext:
|
|
|
|
+ print("Empty array")
|
|
|
|
+ else:
|
|
|
|
+ print(ordertext[0], "PROCESSING")
|
|
|
|
+ try:
|
|
|
|
+ balance = ordertext[0].get('balance')
|
|
|
|
+ return balance
|
|
|
|
+ except Exception as ex:
|
|
|
|
+ print(ex)
|
|
|
|
+
|
|
|
|
+def set_provider(ticket, provider):
|
|
|
|
+ headers = {'Authorization': f'Token {token}'}
|
|
|
|
+ data = {'ticket': ticket,
|
|
|
|
+ 'provider': provider}
|
|
|
|
+ response = requests.post(config.API_URL+f"/api/example/set-provider", headers=headers, data=data)
|
|
|
|
+ print(response.json())
|
|
|
|
+ ordertext=response.json()
|
|
|
|
+
|
|
|
|
+ if not ordertext:
|
|
|
|
+ print("Empty array")
|
|
|
|
+ else:
|
|
|
|
+ print(ordertext[0], "PROCESSING")
|
|
|
|
+ try:
|
|
|
|
+ message = ordertext[0].get('message')
|
|
|
|
+ return message
|
|
|
|
+ except Exception as ex:
|
|
|
|
+ print(ex)
|
|
|
|
+
|
|
|
|
+def open_servicerequest_booked():
|
|
|
|
+ while (len(tasklist)):
|
|
|
|
+ localtask=tasklist.pop(0)
|
|
|
|
+ bot.bot_log(botname + " " + datetime.now().strftime('%Y-%m-%d') + " "+ "Заказ в очереди на обработке\n")
|
|
|
|
+ print("EACH TASKLIST", tasklist)
|
|
|
|
+
|
|
|
|
+ if (localtask.status!=operating_status):
|
|
|
|
+ bot.proceed_status(proceed_to[-1],localtask)
|
|
|
|
+ bot.bot_log(botname+" "+str(datetime.now())+" "+"Заказ не по адресу, перенаправляем на форсмажор\n")
|
|
|
|
+ continue
|
|
|
|
+
|
|
|
|
+ # if (localtask.title!="10"):
|
|
|
|
+ # t1=threading.Thread(target=open_servicerequest_booked_wait, args=(5,localtask))
|
|
|
|
+ # t1.start()
|
|
|
|
+
|
|
|
|
+ # if (localtask.title=="101"):
|
|
|
|
+ # t1=threading.Thread(target=open_servicerequest_booked_process, args=(10,localtask))
|
|
|
|
+ # t1.start()
|
|
|
|
+
|
|
|
|
+ #Пока так
|
|
|
|
+ open_servicerequest_booked_process(localtask)
|
|
|
|
+
|
|
|
|
+ #если никакие обработчики не подошли - отправляем обратно в очередь
|
|
|
|
+ bot.proceed_status(proceed_to[0],localtask)
|
|
|
|
+ print("Заказ возвращен в очередь\n")
|
|
|
|
+ print(tasklist)
|
|
|
|
+
|
|
|
|
+#Авторизация и запуск бота
|
|
|
|
+
|
|
|
|
+#пустой список заказов
|
|
|
|
+tasklist = []
|
|
|
|
+
|
|
|
|
+#надо инициализировать tasklist при запуске из API
|
|
|
|
+token = jsreq.requestGetToken(botname, PASSWORD, config.API_URL+"/auth/token/login/")
|
|
|
|
+
|
|
|
|
+#ВАЖНО! Надо еще фильтровать список по статусу обработки заявки
|
|
|
|
+tasklist=jsreq.requestGetList(token, config.API_URL+"/tickets/api/tickets/?list_id=10")
|
|
|
|
+print (len(tasklist))
|
|
|
|
+
|
|
|
|
+bot = JabberBot(JID, PASSWORD, PORT)
|
|
|
|
+
|
|
|
|
+bot.register_handler('message', message_handler)
|
|
|
|
+bot.start(open_servicerequest_booked)
|
|
|
|
+
|
|
|
|
+
|
|
|
|
+
|