#!/usr/bin/env python
# -*- coding: utf-8 -*-
"""
Contact : 191715030@qq.com
Author  : shenshuo
Date    : 2018/10/26
Desc    : 订阅redis的消息,写入数据库
"""
import json
import redis
from websdk.db_context import DBContext
from models.admin import OperationRecord
from websdk.consts import const


class RedisSubscriber:
    """
    Redis频道订阅类
    """

    def __init__(self, channel='gw', **settings):
        ### 订阅日志使用默认redis 如果有需求 请自行修改配置
        redis_info = settings.get(const.REDIS_CONFIG_ITEM, None).get(const.DEFAULT_RD_KEY, None)
        if not redis_info:
            exit('not redis')
        self.pool = redis.ConnectionPool(host=redis_info.get(const.RD_HOST_KEY),
                                         port=redis_info.get(const.RD_PORT_KEY, 6379),
                                         db=redis_info.get(const.RD_DB_KEY, 0),
                                         password=redis_info.get(const.RD_PASSWORD_KEY, None))
        self.conn = redis.StrictRedis(connection_pool=self.pool)
        self.channel = channel  # 定义频道名称
        self.__settings = settings

    def start_server(self):
        pub = self.conn.pubsub()
        pub.subscribe(self.channel)  # 同时订阅多个频道,要用psubscribe
        try:
            with DBContext('w', None, True, **self.__settings) as session:
                for item in pub.listen():
                    if item['type'] == 'message':
                        data = json.loads(item['data'].decode())
                        # print(data)
                        if data.get('data'):
                            body_data = str(data.get('data'))
                        else:
                            body_data = ''
                        if data.get('login_ip'):
                            login_ip = data.get('login_ip').split(',')[0]
                        else:
                            login_ip = ''
                        uri = data.get('uri').split('?')[0] if len(data.get('uri').split('?')) > 1 else data.get('uri')
                        session.add(OperationRecord(username=data.get('username'), nickname=data.get('nickname'),
                                                    login_ip=login_ip, method=data.get('method'),uri=uri,
                                                    data=body_data, ctime=data.get('time')))
                        session.commit()
                    if item['data'] == 'over':
                        break
            pub.unsubscribe('spub')

        except KeyboardInterrupt:
            pub.unsubscribe('spub')