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)) }
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()
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
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)]
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)
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)) )
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)
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)
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
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
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()
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
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 }
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