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 global process_status #В этом файле содержится только то, что запускает конкретный обработчик # botname="open_strequest_assigned" botname="open_template_bot" 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"] #тут хранится список jid, кому бот может отправлять сообщения в результате обработки заявки proceed_to=["test1@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()#отправитель сообщения #user = mess.getNode()#только jid #example json to object user if text is not None: """ example json { "name":"Cristian", "address": { "street":"Sesame", "number":122 } } """ #нужна проверка, данный обработчик вообще должен от данного отправителя получать сообщения или нет. Подсказка ниже print (str(user).split("/")[0]) if (str(user).split("/")[0]) in listen_to: print(text) print(mess) if text is not None: orderObj = jsreq.jsonToUser(text) print (orderObj) tasklist.append(orderObj) process_status.append(0) bot.bot_log(str(datetime.now())+" Поступивший заказ успешно добавлен в очередь обработки\n") def open_bot_template_wait(period, i): bot.bot_log(botname+" "+str(datetime.now())+" "+"Заказ ожидает\n") time.sleep(period) #тут надо искать не по порядковому номеру, а по контенту или передавать указатель на элемент, так как длина списка может измениться по ходу обработки, но надо менять именно в исходном списке tasklist[i].address.number=123 process_status[i]=0 def open_bot_template(): #print("Тут описывается работа со списком задач в данном статусе") for i in range(len(tasklist)): #проверяем элемент tasklist[i] bot.bot_log(botname + " " + datetime.now().strftime('%Y-%m-%d') + " " + str(i) + " " + "Заказ в очереди на обработке\n") print ("TASKLIST", tasklist[i], process_status[i]) #если много циклов с процессом ничего не происходит - это неправильно и отдаем заказ на обработку по форсмажору if (process_status[i]>idle_value): bot.proceed_status(proceed_to[1],tasklist[i]) del tasklist[i] del process_status[i] bot.bot_log(botname+" "+str(datetime.now())+" "+str(i)+" "+"Заказ передан обработчику форс-мажоров по количеству попыток\n") continue #пропускаем обработку, если процесс еще не готов и инкрементируем счетчик попыток if (process_status[i]>0): process_status[i] +=1 bot.bot_log(botname+" "+str(datetime.now())+" "+str(i)+" "+"Заказ оставлен в очереди\n") continue if (process_status[i]==0): print ("Proceeding started") #example of function that should be run each time process is ready bot.fake_api_call(tasklist[i].name) if (tasklist[i].address.number==122): #function that need to be run as thread #open_bot_template_wait(5,i) t1=threading.Thread(target=open_bot_template_wait, args=(5,i)) t1.start() process_status[i] +=1 continue if (tasklist[i].address.number>130): t2=threading.Thread(target=open_bot_template_wait, args=(15,i)) t2.start() print("Заказ оставлен в очереди\n") bot.bot_log(botname+" "+str(datetime.now())+" "+str(i)+" "+"Заказ оставлен в очереди\n") #common way to proceed order bot.proceed_status(proceed_to[0],tasklist[i]) del tasklist[i] del process_status[i] bot.bot_log(botname+" "+str(datetime.now())+" "+str(i)+" "+"Заказ успешно обработан и удален из очереди\n") print("Заказ успешно обработан и удален из очереди\n") print (tasklist) else: print("Заказ оставлен в очереди\n") bot.bot_log(botname+" "+str(datetime.now())+" "+str(i)+" "+"Заказ оставлен в очереди\n") #Авторизация и запуск бота #пустой список заказов tasklist = [] #список статусов обработки заказов process_status = [] bot = JabberBot(JID, PASSWORD, PORT) #загружаем список заказов для обработки из базы (по идее, сюда попадаем в случае первого запуска или перезапуска) bot.fake_api_call("Получаем список заказов по названию бота-обработчика") bot.register_handler('message', message_handler) bot.start(open_bot_template)