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-dev"] coll_phone = db_base["phone"] coll_userkey = db_base['userkey'] coll_phone.insert_one({"test": "Jopa"}) coll_userkey.insert_one({"test": "Jopa 2"}) # 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-dev') 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], "uuid": srcJson['uuid']} finally: coll_phone.insert_one(insDict) tmpIncoming.pop(srcJson['uuid']) try: insUserKey = {'userkey': srcJson['userkey']} 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': {'$regex': srcJson['to']}}, {'status': 1}}]}, {'$set': {'status': 2, 'callid': srcJson['uuid']}}) coll_phone.update_one({'$and': [{'client': {'$regex': srcJson['to']}}, {'status': 1}]}, {'$set': {'status': 2, 'callid': srcJson['uuid']}}) if srcJson['state'] == 'HANGUP': try: # Проверяем заполнено ли поле recordURL, если нет то меняем статус на 4 if len(srcJson['recordUrl']) > 4: print(srcJson['uuid'], srcJson['recordUrl']) coll_phone.update_one({'callid':srcJson['uuid']}, {'$set': {'recordUrl': srcJson['recordUrl'], 'status': 2}}) else: print(srcJson['uuid']) coll_phone.update_one({'callid':srcJson['uuid']}, {'$set': {'status': 4}}) except Exception as e: print(e) except Exception as e: print(e.with_traceback) print(e) exit() channel.basic_consume( queue='incoming-dev', on_message_callback=callback, auto_ack=False) 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)