mkt-phone/worker/app.py

128 lines
5.7 KiB
Python

import pika
import sys
import os
import json
import datetime
import requests
from pymongo import MongoClient
db_connection = MongoClient("mongodb://mongodb:Cc03Wz5XX3iI3uY3@mongo")
db_base = db_connection["phone"]
coll_phone = db_base["phone"]
coll_userkey = db_base['userkey']
#def sendMessage(dt, num):
# token = "2035324623:AAGACtvZ551m9V--yTYF9cFuegGejylSsLg"
# chat_id = "-1001941363918"
# message = "*" + num + "* - " + dt
# send_text = 'https://api.telegram.org/bot' + token + '/sendMessage?chat_id=' + chat_id + '&parse_mode=Markdown&text=' + message
# response = requests.get(send_text)
# return response
# Stats:
# 0 - ответили
# 1 - не приняли
# 2 - перезвонили успешно
def main():
connection = pika.BlockingConnection(pika.ConnectionParameters(
'rabbitmq', 5672, 'mkt', pika.PlainCredentials('rabbit', 'mrl2X0jwnYuCCiKFTshG7WKyOAhfDo')))
channel = connection.channel()
channel.queue_declare(queue='incoming')
tmpIncoming = {}
# tmpExternal = {}
def callback(ch, method, properties, body: bytearray):
try:
# Парсим строку
srcJson = json.loads(str(body.decode('utf-8')).replace("\'", "\""))
srcJson["time"] = datetime.datetime.fromtimestamp(
srcJson["time"]).strftime('%Y-%m-%d %H:%M:%S')
# Определяем направление соединения
if srcJson['direction'] == 'incoming':
# Определяем начальный статус
if srcJson['state'] == 'START':
# Создаем переменную. Ответ = false, можно закрывать = false, Приоритетная линия
if srcJson['to'] == '83912051045':
tmpIncoming[srcJson['uuid']] = [False, False, True]
else:
tmpIncoming[srcJson['uuid']] = [False, False, False]
# Обновление статуса при входящем звонке
coll_phone.delete_one({'$and': [{'client': srcJson['from']}, {'status': 1}]})
if srcJson['state'] == 'ANSWER' and srcJson['uuid'] in tmpIncoming:
tmpIncoming[srcJson['uuid']][0] = True
if srcJson['state'] == 'END' and srcJson['uuid'] in tmpIncoming:
tmpIncoming[srcJson['uuid']][1] = True
if srcJson['state'] == 'HANGUP' and srcJson['uuid'] in tmpIncoming and tmpIncoming[srcJson['uuid']][1] == True:
try:
srcJson['callstatus']
insDict = {"client": srcJson['from'], "time": srcJson['time'], "status": 0,
"recordUrl": srcJson["recordUrl"], "duration": srcJson["duration"], "important": tmpIncoming[srcJson['uuid']][2]}
except Exception as e:
print(e)
insDict = {
"client": srcJson['from'], "time": srcJson['time'], "status": 1, "important": tmpIncoming[srcJson['uuid']][2]}
#sendMessage(srcJson['time'], srcJson['from'])
finally:
print(insDict)
coll_phone.insert_one(insDict)
tmpIncoming.pop(srcJson['uuid'])
try:
insUserKey = {'userkey': srcJson['userkey']}
print(insUserKey)
print(srcJson['to'])
coll_userkey.update_one(
filter={
'operator': srcJson['to'],
},
update={
'$set': insUserKey,
},
upsert=True
)
except Exception as e:
print(e)
if srcJson['direction'] == 'external':
# coll_phone.update_one({'$and': [{'client': srcJson['to']}, {'status': 1}]}, {
# '$set': {'status': 2}})
#r = coll_phone.update_one({'$and': [{'client': {'$regex': srcJson['to']}}, {'status': 1}]}, {'$set': {'status': 2, 'callid': srcJson['uuid']}})
r = coll_phone.update_one({'$and': [{'client': {'$regex': srcJson['to']}}, {'status': {'$in': [1,4]}}]}, {'$set': {'status': 2, 'callid': srcJson['uuid']}})
if srcJson['state'] == 'HANGUP':
try:
# Проверяем заполнено ли поле recordURL, если нет то меняем статус на 4
if len(srcJson['recordUrl']) > 4:
coll_phone.update_one({'callid':srcJson['uuid']}, {'$set': {'recordUrl': srcJson['recordUrl']}})
else:
coll_phone.update_one({'callid':srcJson['uuid']}, {'$set': {'status': 4}})
except Exception as e:
print(e)
print(r)
except Exception as e:
print(e.with_traceback)
print(e)
# print(None)
exit()
channel.basic_consume(
queue='incoming', on_message_callback=callback, auto_ack=True)
print(' [*] Waiting for messages. To exit press CTRL+C')
channel.start_consuming()
if __name__ == '__main__':
try:
main()
except KeyboardInterrupt:
print('Interrupted')
try:
sys.exit(0)
except SystemExit:
os._exit(0)