Пример #1
0
 def getLoginUserInfor(self):
     '''
     获取当前登录用户信息
     :return:
     '''
     return {
         'email': ensureString(self.get_secure_cookie(self.USER_SESSION_LOGIN_EMAIL)),
         'name': ensureString(self.get_secure_cookie(self.USER_SESSION_LOGIN_NAME)),
         'id': ensureString(self.get_secure_cookie(self.USER_SESSION_LOGIN_ID)),
         'cid': ensureString(self.get_secure_cookie(self.USER_SESSION_COMPANY_ID))
     }
Пример #2
0
 def on_connection_close(self):
     sess_id = ensureString(self.getHornerUUID())
     liveRequest = self.application.live_request_list.findLiveRequest(sess_id)
     close_evt_dispather = Dispatcher(Dispatcher.genEndEventPacket(liveRequest.cid), self)
     evt_handler = close_evt_dispather.getHandler(LiveRequest.TYPE_WEBSOCKET)
     evt_handler.run()
     self.onTalkDisconnected()
Пример #3
0
 def getGeoInfor(self):
     raw_geo_string = self.get_secure_cookie(self.USER_SESSION_GEO_INFO)
     geo_info = {}
     if raw_geo_string is not None:
         try:
             geo_info = json.loads(ensureString(raw_geo_string))
         except Exception as e:
             HornerFileLogging.getLogger().error(str(e))
     return geo_info
Пример #4
0
 def _loadRoom(self):
     '''
     加载聊天室房间
     :param room_id:
     :return:
     '''
     horner_gear_handler = HornerGear().getHandler()
     if horner_gear_handler.exists(self.currentRoomKey()):
         self._loadSuccess = True
         self.ParticipantList = [ensureString(_talker) for _talker in horner_gear_handler.smembers(self.room_key)]
Пример #5
0
 def sendmessage(self, live_request_list, uuid, msg):
     '''
     向某个资源发送消息
     :param uuid:
     :param msg:
     :return: None
     '''
     uuid = ensureString(uuid)
     _recver = live_request_list.findLiveRequest(uuid)
     if _recver is not None:
         _recver.writeMessage(msg)
Пример #6
0
 def get(self, *args, **kwargs):
     self.setHornerUUID()
     user_info = self.getLoginUserInfor()
     ws_protocol = 'wss' if self.service_over_ssl() else 'ws'
     self.render("service/chat_index.html",
                 hhost="%s://%s/customservice/ws" % (ws_protocol, self.request.host),
                 comet_url="%s://%s/customservice/comet" % (self.get_protocol(), self.request.host),
                 user_info=user_info,
                 custom_demo_url="%s://%s/service/visitor?companyid=%s&appid=1&userid=%d" %
                                 (self.get_protocol(), self.request.host, ensureString(user_info['cid']), randint(1, 999))
                 )
Пример #7
0
    def __init__(self, conn_type, package, request):
        self._conn_type = conn_type
        self._package = package
        self._request = request
        self.application = request.application
        self.live_request_list = self.application.getLiveRequestHandlerList()

        self.company_id = self._package.get('cid')
        self.sess_id = ensureString(self._request.getHornerUUID())
        self.client_infor = self._request.loadClientInfor()
        self.role = LiveRequest.ROLE_VISITOR if self.client_infor['login_id'] is None else LiveRequest.ROLE_CUSTOM_SERVER
        self.live_request = LiveRequest(self.company_id, self.sess_id, self._request, self._conn_type, self.role)
Пример #8
0
 def broadcast(self, live_request_list, msg, exclude_uuids=[]):
     '''
     房间内广播消息
     :param live_request_list: CustomRequestsLiveList 全局活跃liveRequest列表
     :param msg: string 消息内容
     :param exclude_uuids: list 需要排除的接收者
     :return: None
     '''
     for _p in self.ParticipantList:
         _p = ensureString(_p)
         _recver = None if _p in exclude_uuids else live_request_list.findLiveRequest(_p)
         if _recver is not None:
             _recver.writeMessage(msg)
Пример #9
0
 def addLiveRequest(self, live_request):
     """
     添加活跃请求对象
     :param request: LiveRequest
     :return: string uuid
     """
     _uuid = ensureString(live_request.uuid)
     if (LiveRequest.TYPE_WEBSOCKET == live_request.type):
         if _uuid not in self._live_request_list:
             self._live_request_list.setdefault(_uuid, live_request)
             self._addCompanyHall(live_request)
     else:
         self._live_request_list.setdefault(_uuid, live_request)
         self._addCompanyHall(live_request)
     return live_request.uuid
Пример #10
0
 def removeLiveSession(self, session_id):
     '''
     将会话移除
     :param session_id:
     :return: int 移除链接的个数
     '''
     remove_cnt = 0
     _cache_handler = self.getHandler()
     _kl = _cache_handler.keys("%s:*" % (CacheKeys.COMPANY_KEY))
     for _ck in _kl:
         if _cache_handler.sismember(_ck, ensureBytes(session_id)):
             # call function to remove session in skill sortedset
             self._removeLiveSessionFromSkillGroup(ensureString(_ck).split(":")[1], ensureString(session_id))
             _cache_handler.srem(_ck, session_id)
             remove_cnt += 1
             break
Пример #11
0
    def quitFromAllTalkRoom(self):
        '''
        从所有聊天室中退出
        '''
        horner_gear_handler = HornerGear().getHandler()
        talk_room_wildcard_label = "%s:%s:*" % (CacheKeys.CHATROOM_KEY, self.company_id)
        _same_company_rooms = horner_gear_handler.keys(talk_room_wildcard_label)
        for _room_id in _same_company_rooms:
            _regular_room_name = ensureString(_room_id).split(':')
            if 3 == len(_regular_room_name):
                _check_room = Chatroom(self.company_id, _regular_room_name[2])
                if _check_room.isLoadSuccess():
                    _check_room.removeRequestUuid(self.sess_id)
                    if (1 == _check_room.cntParticipates()):
                        _check_room.closeRoomNotice(self.application.getLiveRequestHandlerList())

        # 从公司大厅中删除
        self._quitFromHall()
Пример #12
0
    def allPaticipatedRoom(company_id, sess_id):
        '''
        列出所有参与进的聊天室
        :param comnay_id:
        :param sess_id:
        :return: list
        '''
        ret_room_id_list = []
        match_key = "%s:%s:*" % (CacheKeys.CHATROOM_KEY, company_id)
        horner_gear_handler = HornerGear().getHandler()
        room_list = horner_gear_handler.keys(match_key)
        for _room_label in room_list:
            _regular_room_name = ensureString(_room_label).split(':')
            if (3 == len(_regular_room_name)):
                _room_key = Chatroom.getRoomKey(company_id, _regular_room_name[2])
                if (horner_gear_handler.sismember(_room_key, sess_id)):
                    ret_room_id_list.append(_regular_room_name[2])

        return ret_room_id_list
Пример #13
0
 def doParse(self, sInformation):
     try:
         geo_information = json.loads(ensureString(sInformation))
         if isinstance(geo_information, dict) and (0 == geo_information.get('status', -1)):
             _address = geo_information.get('address', '')
             _address_content = geo_information.get('content', {})
             if isinstance(_address_content, dict):
                 _address_detail = _address_content.get('address_detail', '')
                 if isinstance(_address_detail, dict):
                     if isinstance(_address_detail, dict):
                         self.province = _address_detail.get('province', '')
                         self.city = _address_detail.get('city', '')
             _address_code_array = _address.split('|')
             self.net_catalog = _address_code_array[4] if 5 < len(_address_code_array) else ''
     except Exception as e:
         HornerFileLogging.getLogger().error(str(e))
     return {
         'net': self.net_catalog,
         'province': self.province,
         'city': self.city
     }
Пример #14
0
    def run(self):
        horner_gear = HornerGear()
        if self.sameUUID(self.sess_id):
            # 客户端UUID冲突
            err_noticer = ConchResponseNoticer(HornerPacketHandler.COMMUNICATION_RESPONSE, ConchResponseNoticer.ERR_CONFLICTION_UUID)
            err_noticer.setErrorID(ConchResponseNoticer.ERR_CONFLICTION_UUID)
            return err_noticer
        else:
            _noticer = ConchBeginEventNoticer(HornerPacketHandler.COMMUNICATION_EVENT, HornerPacketHandler.EVT_CMD_CONNECTION)
            _noticer.setSessId(self.live_request.getUUID())
            if self.live_request.isCustomService():
                # 当前用户会话是客服人员
                horner_gear.addLiveSessionToCompany(self.company_id, self.live_request.getUUID())
                _noticer.changeSuccess()
            else:
                # 客户进入对话,选择客服并创建聊天室
                _noticer.setIsVisitor()
                group_id = self._package.get('gid')
                if group_id is None: group_id = 'default'
                custom_service_id = horner_gear.choiceCustomServicer(self.company_id, self._package.get('gid'))
                if (custom_service_id is not None):
                    custom_service_id = ensureString(custom_service_id)
                    c_room_id = Chatroom.createChatRoom(self.company_id, custom_service_id)
                    if c_room_id is not None:
                        room = Chatroom(self.company_id, c_room_id)
                        if room.isLoadSuccess():
                            room.addRequestUuid(self.live_request.getUUID())
                            horner_gear.addLiveSessionToCompany(self.company_id, self.live_request.getUUID())
                            _noticer.setRoomId(c_room_id)
                            # 通知客服有新对话房间建立
                            self._notice_room_created(custom_service_id, c_room_id, self.client_infor)
                            # 房间广播新人加入事件
                            self._notice_room_joined(c_room_id, self.client_infor)
                            _noticer.changeSuccess()
                else:
                    _noticer.setMessage('没有客服人员在线,前端改留言板服务!')

            return _noticer