def processInvitees(self, enterParam, note, invitees, userId, gameId): ''' 邀请好友牌桌游戏 invitees - 被邀请者 ''' if not invitees: return uds = userdata.getAttrs(userId, ['name']) # 检查是否在线 for invitee in invitees: # invitee - 被邀请者 state = onlinedata.getOnlineState(invitee) if state: # 在线,则进行下一步操作 ids = userdata.getAttrs(invitee, ['name']) _, clientVer, _, _ = sessiondata.getClientIdInfo(invitee) if clientVer < 3.77: # 版本号小于3.77,则提示升级 TodoTaskHelper.sendTodoTask(gameId, invitee, TodoTaskPopTip(note + ' 请升级至新版本与好友 ' + uds[0] + ' 一起玩耍!')) TodoTaskHelper.sendTodoTask(gameId, userId, TodoTaskPopTip('您的好友 ' + ids[0] + ' 版本较低,提醒他升级到最新版本一起玩耍吧!')) else: # 判断是否在同一牌桌上 if self.isInSameTable(userId, invitee): TodoTaskHelper.sendTodoTask(gameId, userId, TodoTaskPopTip('您的好友 ' + ids[0] + ' 正在跟您一起游戏呢')) else: # 版本号大于3.77,则发送邀请 TodoTaskHelper.sendTodoTask(gameId, invitee, TodoTaskInviteToGame(userId, note, enterParam)) else: TodoTaskHelper.sendTodoTask(gameId, userId, TodoTaskPopTip('您的好友当前不在线')) ftlog.debug('您的好友当前不在线')
def _getThirdPartyUserInfo(userId): ''' 取得用户的基本账户的信息 玩家昵称 玩家id 钻石数量 金币数量 奖券数量 魅力值 vip等级 ''' userdata.checkUserData(userId) ukeys = [UserDataSchema.NAME, UserDataSchema.SEX, UserDataSchema.DIAMOND, UserDataSchema.CHIP, UserDataSchema.COUPON, UserDataSchema.CHARM, UserDataSchema.PURL, UserDataSchema.CREATETIME] udataDb = userdata.getAttrs(userId, ukeys) udata = dict(zip(ukeys, udataDb)) # vip信息 udata['vipInfo'] = hallvip.userVipSystem.getVipInfo(userId) # 游戏信息 clientId = sessiondata.getClientId(userId) gameInfo = hallaccount.getGameInfo(userId, clientId) udata['gameInfo'] = gameInfo.get('dashifen', {}) return udata
def getUserNameAndPic(cls, userId): name, pic = userdata.getAttrs(userId, ['name', 'purl']) if not name or name == '': name = str(userId) if not pic: pic = '' return name, pic
def encodeReplayForWonderful(cls, userId, replay): seats = [] for seat in replay.details.get('seats'): name = seat.get('name', '') headUrl = seat.get('headUrl', '') if not name or not headUrl: nowName, nowHeadUrl = userdata.getAttrs(seat.get('uid'), ['name', 'purl']) if not name: name = nowName if not headUrl: headUrl = nowHeadUrl seats.append({ 'uid':seat.get('uid'), 'name':strutil.ensureString(name, ''), 'img':strutil.ensureString(headUrl, '') }) return { 'id':replay.videoId, 'name':replay.roomName, 'mark':'', 'desc':cls.buildDesc(replay), 'views':replay.viewsCount, 'time':replay.timestamp, 'dizhuwin':replay.details.get('dizhuWin'), 'dizhu':replay.details.get('dizhu'), 'owner':replay.userId, 'url':'', 'seats':seats }
def getUserNameAndPic(cls, userId): name, pic = userdata.getAttrs(userId, ['name', 'purl']) if not name or name == '': name = str(userId) if not pic: pic = '' return name, pic
def _getRanking(self, rankingDefine, timestamp): rankingList = hallranking.rankingSystem.getTopN( rankingDefine.rankingId, rankingDefine.totalN, timestamp) if not rankingList: return None rankDatas = [] for index, user in enumerate(rankingList.rankingUserList): if index >= rankingDefine.topN: break name, purl = userdata.getAttrs(user.userId, ['name', 'purl']) detail = {} detail['name'] = str(name) if name else '' detail['headUrl'] = str(purl) if purl else '' detail['rankValue'] = self._filterScore(user.score) rankDatas.append({ 'rank': user.rank + 1, 'rankPic': rankingList.rankingDefine.getPicByRank(user.rank), 'userId': user.userId, 'detail': detail, }) return (rankingList, timestamp, { 'rankId': rankingDefine.rankingId, 'issueNum': rankingList.issueNumber, 'name': rankingList.rankingDefine.name, 'desc': rankingList.rankingDefine.desc, 'rankInfo': rankingList.rankingDefine.outRankDesc, 'type': rankingList.rankingDefine.rankingType, 'rankDatas': rankDatas })
def _getThirdPartyUserInfo(userId): ''' 取得用户的基本账户的信息 玩家昵称 玩家id 钻石数量 金币数量 奖券数量 魅力值 vip等级 ''' userdata.checkUserData(userId) ukeys = [ UserDataSchema.NAME, UserDataSchema.SEX, UserDataSchema.DIAMOND, UserDataSchema.CHIP, UserDataSchema.COUPON, UserDataSchema.CHARM, UserDataSchema.PURL, UserDataSchema.CREATETIME ] udataDb = userdata.getAttrs(userId, ukeys) udata = dict(zip(ukeys, udataDb)) # vip信息 udata['vipInfo'] = hallvip.userVipSystem.getVipInfo(userId) # 游戏信息 clientId = sessiondata.getClientId(userId) gameInfo = hallaccount.getGameInfo(userId, clientId) udata['gameInfo'] = gameInfo.get('dashifen', {}) return udata
def getUserHeadUrl(userId, clientId, purl=None, beauty=None): ''' 取得当前的用户的头像 取得当前的用户是否是美女认证账户 ''' # 自定义头像, 美女认证 if purl == None: purl, beauty = userdata.getAttrs(userId, ['purl', 'beauty']) if purl: purl = unicode(purl) else: purl = '' purl = _filter360QihuImage(userId, clientId, purl) if isinstance(purl, (str, unicode)): if (purl.find('http://') < 0) and (purl.find('https://') < 0): purl = '' if purl == '' or purl == None: heads = getUserHeadPics(clientId) purl = random.choice(heads) userdata.setAttr(userId, 'purl', purl) isBeauty = False if beauty: isBeauty = True if (beauty & 1) != 0 else False return purl, isBeauty
def queryEnvelope(self): info = {} info['envelopeId'] = self.id info['contents'] = self.contents info['receiver'] = [] receivers = daobase.executeMixCmd('LRANGE', self.dbPrefix + self.id + self.RECEIVER, 0, -1) if receivers: for receiverJson in receivers: receiver = json.loads(receiverJson) # 补充昵称/头像/金币信息 userId = receiver['userId'] chip, name, purl = pkuserdata.getAttrs(userId, ['chip', 'name', 'purl']) if chip and name and purl: if ftlog.is_debug(): ftlog.debug('TYRedEnvelope.queryEnvelope receiver userId:', userId, ' chip:', chip, ' name:', name, ' purl:', purl) receiver['chip'] = chip receiver['name'] = name receiver['purl'] = purl info['receiver'].append(receiver) if ftlog.is_debug(): ftlog.debug('TYRedEnvelope.queryEnvelope info:', info) return info
def getUserInfo(userId, gameId, clientId): ''' 取得用户的基本账户的信息 ''' ukeys = ['email', 'pdevid', 'mdevid', 'isbind', 'snsId', 'name', 'source', 'diamond', 'address', 'sex', 'state', 'payCount', 'snsinfo', 'vip', 'dayang', 'idcardno', 'phonenumber', 'truename', 'detect_phonenumber', 'lang', 'country', "signature", "set_name_sum", "coupon", 'purl', 'beauty', 'charm', 'password', 'bindMobile'] udataDb = userdata.getAttrs(userId, ukeys) udata = dict(zip(ukeys, udataDb)) udata['coin'] = udata['diamond'] # 数据补丁: 再把diamond转换到coin返回, 老版本用的是coin udata['chip'] = userchip.getChip(userId) # 头像相关 purl, isbeauty = getUserHeadUrl(userId, clientId, udata['purl'], udata['beauty']) udata['purl'] = purl udata['isBeauty'] = isbeauty # vip信息 udata['vipInfo'] = hallvip.userVipSystem.getVipInfo(userId) # 江湖救急次数 udata['assistance'] = { 'count': hallvip.userVipSystem.getAssistanceCount(gameId, userId), 'limit': hallvip.vipSystem.getAssistanceChipUpperLimit() } userdata.updateUserGameDataAuthorTime(userId, gameId) return udata
def _getRanking(self, rankingDefine, timestamp): rankingList = hallranking.rankingSystem.getTopN(rankingDefine.rankingId, rankingDefine.totalN, timestamp) if not rankingList: return None rankDatas = [] for index, user in enumerate(rankingList.rankingUserList): if index >= rankingDefine.topN: break name, purl = userdata.getAttrs(user.userId, ['name', 'purl']) detail = {} detail['name'] = str(name) if name else '' detail['headUrl'] = str(purl) if purl else '' detail['rankValue'] = self._filterScore(user.score) rankDatas.append({ 'rank': user.rank + 1, 'rankPic': rankingList.rankingDefine.getPicByRank(user.rank), 'userId': user.userId, 'detail': detail, }) return (rankingList, timestamp, { 'rankId': rankingDefine.rankingId, 'issueNum': rankingList.issueNumber, 'name': rankingList.rankingDefine.name, 'desc': rankingList.rankingDefine.desc, 'rankInfo': rankingList.rankingDefine.outRankDesc, 'type': rankingList.rankingDefine.rankingType, 'rankDatas': rankDatas })
def isUserEnabledGps(userId): """用户是否开启了gps, 有geo坐标数据就认为是已经开启 """ lat1, lon1 = userdata.getAttrs(userId, ["geoLat", "geoLon"]) ftlog.debug("util.isUserEnabledGps userId", userId, "lat", lat1, "lon1", lon1) return lat1 and lon1
def getWorshipRank(cls): """ 获取排行榜 """ currentTimestamp = pktimestamp.getCurrentTimestamp() key = buildUserCostKey() first_updated_at = daobase.executeRePlayCmd('hget', key, 'first_updated_at') or currentTimestamp if pktimestamp.is_same_day(currentTimestamp, first_updated_at): ret = [] key = buildWorshipRankKey() datas = daobase.executeRePlayCmd('zrevrange', key, 0, -1, 'withscores') if datas: for i in xrange(len(datas) / 2): userId = int(datas[i * 2]) chip = int(datas[i * 2 + 1]) userName, purl = userdata.getAttrs(userId, ['name', 'purl']) ret.append({'nickname': str(userName), 'img': purl, 'userId': userId, 'chip': chip, 'rank': i+1}) return ret else: key = buildUserCostKey() clearUserCost() clearRankList() daobase.executeRePlayCmd('hset', key, 'first_updated_at', currentTimestamp) ftlog.info('WorshipHelper.getWorshipRank first_updated_at=', first_updated_at) return []
def friendInfo(cls, friend, prize, index, clientId): userdata.checkUserData(friend["userId"]) coupon = 0 if (index + 1) % 5 == 0: coupon = prize["COUPON"] result = { "prizeInfo": { "prize": [{ "name": "CHIP", "count": prize["CHIP"] }, { "name": "COUPON", "count": coupon }], "state": friend["state"] } } uds = userdata.getAttrs(friend["userId"], ['purl', 'name', 'chip']) friendInfo = { "userId": friend["userId"], "headUrl": uds[0], "name": uds[1], "chip": uds[2], "dashifen": cls.getDaShiFenPic(friend["userId"], clientId) } result['friendInfo'] = friendInfo return result
def queryEnvelope(self): info = {} info['envelopeId'] = self.id info['contents'] = self.contents info['receiver'] = [] receivers = daobase.executeMixCmd( 'LRANGE', self.dbPrefix + self.id + self.RECEIVER, 0, -1) if receivers: for receiverJson in receivers: receiver = json.loads(receiverJson) # 补充昵称/头像/金币信息 userId = receiver['userId'] chip, name, purl = pkuserdata.getAttrs( userId, ['chip', 'name', 'purl']) if chip and name and purl: if ftlog.is_debug(): ftlog.debug( 'TYRedEnvelope.queryEnvelope receiver userId:', userId, ' chip:', chip, ' name:', name, ' purl:', purl) receiver['chip'] = chip receiver['name'] = name receiver['purl'] = purl info['receiver'].append(receiver) if ftlog.is_debug(): ftlog.debug('TYRedEnvelope.queryEnvelope info:', info) return info
def getNickname(cls, userId): ''' 获得指定UserId玩家的昵称 ''' l = userdata.getAttrs(userId, ['name']) if l: return l[0] return ''
def getUData(self, userId): if userId not in self.udatas: udata = userdata.getAttrs(userId, ['name', 'purl']) photo = gamedata.getGameAttr(userId, self.gameId, 'photo') udata.append(photo) self.udatas[userId] = udata return udata return self.udatas[userId]
def getUData(self, userId): if userId not in self.udatas: udata = userdata.getAttrs(userId, ['name', 'purl']) photo = gamedata.getGameAttr(userId, self.gameId, 'photo') udata.append(photo) self.udatas[userId] = udata return udata return self.udatas[userId]
def _processUserShareLoginEventImpl(evt): clientId = sessiondata.getClientId(evt.shareUserId) actList = ActivityWxHelper.getActivityList(evt.shareUserId, clientId) if ftlog.is_debug(): ftlog.debug('activity_wx_share_charm._processUserShareLoginEventImpl', 'userId=', evt.userId, 'shareUserId=', evt.shareUserId, 'actList=', actList) for act in actList: if act['typeId'] == ActivityWxShareCharm.TYPE_ID: actId = act['actId'] actInstance = ActivityWxHelper.findActivity(actId) if actInstance: if ftlog.is_debug(): ftlog.debug( 'activity_wx_share_charm._processUserShareLoginEventImpl', 'userId=', evt.userId, 'shareUserId=', evt.shareUserId, 'actInstance=', actInstance) # 判断用户是否已经帮助过别人了 timestamp = pktimestamp.getCurrentTimestamp() userData = UserShareCharmData(evt.userId).loadUserData(actId) saveUserData = False if not pktimestamp.is_same_day(userData.timestamp, timestamp): userData.timestamp = timestamp userData.isShareLogin = 0 saveUserData = True if userData.isShareLogin == 0: # 获取当前期号 shareUserData = UserShareCharmData( evt.shareUserId).loadUserData(actId) currentIssue = calculateCurrentIssue( actInstance.settleDayOrWeek) # 增加魅力值 totalCount = shareUserData.increaseCharm(currentIssue, 1) shareUserData.saveUserData(actId) # 插入排行榜 insertRankList(actId, currentIssue, evt.shareUserId, totalCount, actInstance.maxRankNum) # 更新帮助用户信息 userData.isShareLogin = 1 saveUserData = True if saveUserData: userData.saveUserData(actId) name, _ = userdata.getAttrs(evt.shareUserId, ['name', 'purl']) mo = MsgPack() mo.setCmd('act_wx') mo.setResult('action', 'share_charm_login') mo.setResult('loginMsg', '感谢您帮助【%s】增加1点魅力值哦~' % name) router.sendToUser(mo, evt.userId) if ftlog.is_debug(): ftlog.debug( 'activity_wx_share_charm._processUserShareLoginEventImpl', 'userId=', evt.userId, 'shareUserId=', evt.shareUserId, 'mo=', mo)
def getRankList(self, userId): ranks = [] score = 0 rank = 0 rewards = [] ownPlayer = [player for player in self.matchMaster.rankList if player.userId == userId] if ownPlayer: player = ownPlayer[0] score = player.score rank = player.rank rankRewards = self._getRewards(player.rank) if rankRewards: rewards = TimeMatch.buildRewards(rankRewards) name = util.getNickname(userId) sex, avatar = userdata.getAttrs(userId, ["sex", "purl"]) ranks.append({ "userId": userId, "name": name, "sex": sex, "score": score, "rank": rank, "avatar": avatar, "vip": util.getVipShowLevel(userId), "rewards": rewards }) if not self.matchMaster.rankListCache: for player in self.matchMaster.rankList[:50]: name = util.getNickname(player.userId) sex, avatar = userdata.getAttrs(player.userId, ["sex", "purl"]) rankRewards = self._getRewards(player.rank) rewards = [] if rankRewards: rewards = TimeMatch.buildRewards(rankRewards) self.matchMaster.rankListCache.append({ "userId": player.userId, "name": name, "sex": sex, "score": player.score, "rank": player.rank, "avatar": avatar, "vip": util.getVipShowLevel(player.userId), "rewards": rewards }) ranks.extend(self.matchMaster.rankListCache) return ranks
def getConfigForClient(self, gameId, userId, clientId): clientconf = copy.deepcopy(self._clientConf) config = clientconf['config'] name, purl = userdata.getAttrs(userId, [UserDataSchema.NAME, UserDataSchema.PURL]) purl, _ = halluser.getUserHeadUrl(userId, clientId, purl) replace_dict = {'code': userId, 'name': name, 'image': purl} self._fill_button_todotask(userId, config, 'button_friend', replace_dict) self._fill_button_todotask(userId, config, 'button_moments', replace_dict) return clientconf
def tryRename(gameId, userId, newName): consumeCount = 0 oldName, setNameSum = userdata.getAttrs(userId, ['name', 'set_name_sum']) if ftlog.is_debug(): ftlog.info( 'hallrename.tryRename gameId=', gameId, 'setNameSum=', setNameSum, 'userId=', userId, 'oldName=', oldName, 'newName=', newName, ) if oldName == newName: if ftlog.is_debug(): ftlog.info('hallrename.tryRename gameId=', gameId, 'userId=', userId, 'name not changed !') return -3, 'not changed' setNameSum = userdata.incrAttr(userId, 'set_name_sum', 1) if setNameSum > 1: # 消耗一个改名卡 timestamp = pktimestamp.getCurrentTimestamp() userAssets = hallitem.itemSystem.loadUserAssets(userId) _, consumeCount, final = userAssets.consumeAsset( gameId, hallitem.ASSET_RENAME_CARD_KIND_ID, 1, timestamp, 'USER_RENAME', 0) if consumeCount < 1: if ftlog.is_debug(): ftlog.info('hallrename.tryRename gameId=', gameId, 'userId=', userId, 'no rename card !') return -2, 'no rename card' ftlog.info('hallrename.tryRename gameId=', gameId, 'userId=', userId, 'newName=', newName, 'consumeCount=', consumeCount, 'setNameSum=', setNameSum, 'final=', final) code, info = _rename(gameId, userId, newName) if code != 0 and consumeCount > 0: # 改名失败,退回改名卡 userAssets = hallitem.itemSystem.loadUserAssets(userId) _, addCount, final = userAssets.addAsset( gameId, hallitem.ASSET_RENAME_CARD_KIND_ID, 1, timestamp, 'USER_RENAME', 0) ftlog.info('hallrename.tryRename rollback gameId=', gameId, 'userId=', userId, 'newName=', newName, 'addCount=', addCount, 'setNameSum=', setNameSum, 'final=', final) if code != 0 and setNameSum == 1: # 第一次修改失败,退回 userdata.incrAttr(userId, 'set_name_sum', -1) datachangenotify.sendDataChangeNotify(gameId, userId, ['item', 'udata']) return code, info
def getRankRewardList(self, userId): ''' 获取奖励排行榜 ''' ret = [] for rankReward in self.rankRewards: nickname, purl, count = '', '', 0 startRankUserIdList = getRankList( self.actId, calculateCurrentIssue(self.settleDayOrWeek), rankReward.startRank - 1, rankReward.startRank - 1) if startRankUserIdList: startRankUserId = startRankUserIdList[0] userdata.checkUserData(startRankUserId) nickname, purl = userdata.getAttrs(startRankUserId, ['name', 'purl']) issue = calculateCurrentIssue(self.settleDayOrWeek) userData = UserShareCharmData(startRankUserId).loadUserData( self.actId) issueData = userData.getIssueData(issue) count = issueData.count if issueData else 0 ret.append({ 'startRank': rankReward.startRank, 'endRank': rankReward.endRank, 'rewardDesc': rankReward.rewardDesc, 'rewardPic': rankReward.rewardPic, 'userInfo': { 'name': nickname, 'purl': purl, 'count': count } }) currentIssue = calculateCurrentIssue(self.settleDayOrWeek) lastIssue = calculateLastIssue(self.settleDayOrWeek) rank = getUserRealRank(userId, self.actId, currentIssue) count = UserShareCharmData(userId).loadUserData( self.actId).getCharmCount(currentIssue) lastRank = getUserRealRank(userId, self.actId, lastIssue) lastCount = UserShareCharmData(userId).loadUserData( self.actId).getCharmCount(lastIssue) retRes = { 'userInfo': { 'rank': rank, 'count': count, 'lastRank': lastRank, 'lastCount': lastCount }, 'rankList': ret, 'startDate': calculateCurrentIssue(self.settleDayOrWeek), 'endDate': calculateEndDayStr(self.settleDayOrWeek) } if ftlog.is_debug(): ftlog.debug('ActivityWxShareCharm.getRankRewardList', 'retRes=', retRes) return retRes
def processInvitees(self, enterParam, note, invitees, userId, gameId): ''' 邀请好友牌桌游戏 invitees - 被邀请者 ''' if not invitees: return uds = userdata.getAttrs(userId, ['name']) # 检查是否在线 for invitee in invitees: # invitee - 被邀请者 state = onlinedata.getOnlineState(invitee) if state: # 在线,则进行下一步操作 ids = userdata.getAttrs(invitee, ['name']) _, clientVer, _, _ = sessiondata.getClientIdInfo(invitee) if clientVer < 3.77: # 版本号小于3.77,则提示升级 TodoTaskHelper.sendTodoTask( gameId, invitee, TodoTaskPopTip(note + ' 请升级至新版本与好友 ' + uds[0] + ' 一起玩耍!')) TodoTaskHelper.sendTodoTask( gameId, userId, TodoTaskPopTip('您的好友 ' + ids[0] + ' 版本较低,提醒他升级到最新版本一起玩耍吧!')) else: # 判断是否在同一牌桌上 if self.isInSameTable(userId, invitee): TodoTaskHelper.sendTodoTask( gameId, userId, TodoTaskPopTip('您的好友 ' + ids[0] + ' 正在跟您一起游戏呢')) else: # 版本号大于3.77,则发送邀请 TodoTaskHelper.sendTodoTask( gameId, invitee, TodoTaskInviteToGame(userId, note, enterParam)) else: TodoTaskHelper.sendTodoTask(gameId, userId, TodoTaskPopTip('您的好友当前不在线')) ftlog.debug('您的好友当前不在线')
def loadStatus(self, userId): try: firstDailyCheckin, lastDailyCheckin = pkuserdata.getAttrs(userId, ['firstDailyCheckin', 'lastDailyCheckin']) if ftlog.is_debug(): ftlog.debug('TYDailyCheckinDao.loadStatus userId=', userId, 'firstDailyCheckin=', firstDailyCheckin, 'lastDailyCheckin=', lastDailyCheckin) if firstDailyCheckin and lastDailyCheckin: return TYDailyCheckinStatus(int(firstDailyCheckin), int(lastDailyCheckin)) except: ftlog.error() return None
def getConfigForClient(self, gameId, userId, clientId): clientconf = copy.deepcopy(self._clientConf) config = clientconf['config'] name, purl = userdata.getAttrs( userId, [UserDataSchema.NAME, UserDataSchema.PURL]) purl, _ = halluser.getUserHeadUrl(userId, clientId, purl) replace_dict = {'code': userId, 'name': name, 'image': purl} self._fill_button_todotask(userId, config, 'button_friend', replace_dict) self._fill_button_todotask(userId, config, 'button_moments', replace_dict) return clientconf
def getGeoDistance(userId1, userId2): '''计算两个玩家距离 单位:米 无法测量时返回-1 ''' lat1, lon1 = userdata.getAttrs(userId1, ["geoLat", "geoLon"]) lat2, lon2 = userdata.getAttrs(userId2, ["geoLat", "geoLon"]) if not lat1 or not lat2: return -1 if abs(lat1) < 1e-100 or abs(lat2) < 1e-100: return -1 geoint1 = geohash.encode(lat1, lon1) geoint2 = geohash.encode(lat2, lon2) dist = -1 try: dist = geohash.get_distance(geoint1, geoint2) except Exception, e: ftlog.error("getGeoDistance, |lat1, lon1, lat2, lon2, geoint1, geoint2:", lat1, lon1, lat2, lon2, geoint1, geoint2, e)
def getGeoDistance(userId1, userId2): '''计算两个玩家距离 单位:米 无法测量时返回-1 ''' lat1, lon1 = userdata.getAttrs(userId1, ["geoLat", "geoLon"]) lat2, lon2 = userdata.getAttrs(userId2, ["geoLat", "geoLon"]) if not lat1 or not lat2: return -1 if abs(lat1) < 1e-100 or abs(lat2) < 1e-100: return -1 geoint1 = geohash.encode(lat1, lon1) geoint2 = geohash.encode(lat2, lon2) dist = -1 try: dist = geohash.get_distance(geoint1, geoint2) except Exception, e: ftlog.error( "getGeoDistance, |lat1, lon1, lat2, lon2, geoint1, geoint2:", lat1, lon1, lat2, lon2, geoint1, geoint2, e)
def _adjustStatus(status): try: bindMobile, createTimeStr = userdata.getAttrs(status.userId, ['bindMobile', 'createTime']) status._isBindMobile = True if bindMobile else False status._registerTime = pktimestamp.timestrToTimestamp(createTimeStr, '%Y-%m-%d %H:%M:%S.%f') if status.inviteeMap: sl = sorted(status.inviteeMap.values(), key=lambda invitee: invitee.index) removeList = sl[MAX_INVITEE:] for invitee in removeList: del status.inviteeMap[invitee.userId] except: ftlog.error('neituiguang._adjustStatus userId=', status.userId) return status
def _onOpenItemEvent(event): # TYOpenItemEvent(gameId, userBag.userId, item, assetItemList) if _scoreRankConf.closed: return userName = userdata.getAttrs(event.userId, ['name'])[0] boxName = event.item.itemKind.displayName for assetItemTuple in event.gotAssetList: # 0 - assetItem, 1 - count, 2 - final assetItem = assetItemTuple[0] if assetItem.kindId in _scoreRankConf.ledItems: # 冠军发送Led通知所有其他玩家 ledText = dizhuled._mk_open_box_rich_text(userName, boxName, assetItem.displayName) LedUtil.sendLed(ledText, 'global')
def loadStatus(self, userId): try: firstDailyCheckin, lastDailyCheckin = pkuserdata.getAttrs( userId, ['firstDailyCheckin', 'lastDailyCheckin']) if ftlog.is_debug(): ftlog.debug('TYDailyCheckinDao.loadStatus userId=', userId, 'firstDailyCheckin=', firstDailyCheckin, 'lastDailyCheckin=', lastDailyCheckin) if firstDailyCheckin and lastDailyCheckin: return TYDailyCheckinStatus(int(firstDailyCheckin), int(lastDailyCheckin)) except: ftlog.error() return None
def _onChargeNotify(self, event): # charge 充值增加积分 按照商品标价(钻石)来增加积分 isOpen = self.checkActivityActive(event.userId) if not isOpen: return diamonds = int(event.diamonds) if ftlog.is_debug(): ftlog.debug('ActivityScoreRanking _onChargeNotify userId=', event.userId, 'rmb=', event.rmbs, 'productId=', event.productId, 'diamonds=', diamonds) todayIssueNum = calcDailyIssueNum() totalIssueNum = self._issueNum chargeConf = self._scoreUpWay.get('charge') userData = loadOrCreateUserData(event.userId, self.actId, todayIssueNum) scoreDelta = int(round(chargeConf.exchangeRate * diamonds / 10)) scoreDelta = min(scoreDelta, chargeConf.maxScore - userData.chargeScore) name, _ = userdata.getAttrs(event.userId, ['name', 'purl']) # 保存日榜玩家信息 userData.chargeScore += scoreDelta userData.score += scoreDelta userData.name = '' if name is None else str(name) if self._dibaoScore: if userData.score >= self._dibaoScore and userData.dibaoStu == RewardState.ST_NO_REWARD: userData.dibaoStu = RewardState.ST_HAS_REWARD saveUserData(userData) insertRankList(self.actId, todayIssueNum, event.userId, userData.score, self.rewardLimit) # 保存总榜玩家信息 totalUserData = loadOrCreateUserData(event.userId, self.actId, totalIssueNum) totalUserData.score += scoreDelta totalUserData.name = '' if name is None else str(name) saveUserData(totalUserData) insertRankList(self.actId, totalIssueNum, event.userId, totalUserData.score, self.rewardLimit) ftlog.info('ActivityScoreRanking _onChargeNotify', 'userId=', event.userId, 'diamonds=', diamonds, 'scoreDelta=', scoreDelta, 'today.score=', userData.score, 'total.score=', totalUserData.score)
def processInviteAnswser(self, inviter, answer, userId, gameId): ''' 对邀请游戏的应答 userId - 当前用户 inviter - 邀请者 向邀请者发送回应 ''' uds = userdata.getAttrs(userId, ['name']) response = '' if answer: response = '您的好友 ' + uds[0] + ' 同意了您的游戏邀请' else: response = '您的好友 ' + uds[0] + ' 拒绝了您的游戏邀请' TodoTaskHelper.sendTodoTask(gameId, inviter, TodoTaskPopTip(response))
def processInviteAnswser(self, inviter, answer, userId, gameId): ''' 对邀请游戏的应答 userId - 当前用户 inviter - 邀请者 向邀请者发送回应 ''' uds = userdata.getAttrs(userId, ['name']) response = '' if answer: response = '您的好友 ' + uds[0] + ' 同意了您的游戏邀请' else: response = '您的好友 ' + uds[0] + ' 拒绝了您的游戏邀请' TodoTaskHelper.sendTodoTask(gameId, inviter, TodoTaskPopTip(response))
def getUserInfo(self, userId): curTime = int(time.time()) # 存储的额外数据太多了清理一下 if len(self.userInfoMap) >= 200: self.userInfoMap.clear() self.userInfoCacheTime.clear() # 没有数据或缓存时间过长重新获取数据. if self.userInfoMap.get( userId, None) is None or curTime - self.userInfoCacheTime.get( userId, 0) >= 60: name = util.getNickname(userId) sex, purl = userdata.getAttrs(userId, ["sex", "purl"]) self.userInfoMap[userId] = (name, sex, purl) self.userInfoCacheTime[userId] = curTime return self.userInfoMap.get(userId)
def _processEvent(self, event, timestamp): # if isinstance(event, EventUserLogin): lastAuthTime, authTime = userdata.getAttrs(event.userId, ['lastAuthorTime', 'authorTime']) if lastAuthTime and authTime: try: if pktimestamp.getTimeStrDiff(lastAuthTime, authTime) >= self.kind.nBackDays * 86400: self.finishTime = timestamp self.gainTime = 0 return True except: ftlog.error('YYBBackGiftStatus._processEvent', 'userId=', event.userId, 'times=', [lastAuthTime, authTime]) return False return False
def getHelpMsg(cls, helpUserId): ''' 助力信息 ''' seconds = _treasureChestTotalConf.treasureChest.helpShortenSeconds userdata.checkUserData(helpUserId) name, _ = userdata.getAttrs(helpUserId, ['name', 'purl']) if seconds < 60: helpMsg = '感谢您帮助【%s】减少%s秒的开宝箱时间~' % (name, seconds) else: minutes = seconds / 60 leftSecond = seconds % 60 if leftSecond == 0: helpMsg = '感谢您帮助【%s】减少%s分钟的开宝箱时间~' % (name, minutes) else: helpMsg = '感谢您帮助【%s】减少%s分钟%s秒的开宝箱时间~' % (name, minutes, leftSecond) return helpMsg
def addUserScoreByGiftBox(userId, rankId, scoreDelta, issueNum=None): # 礼包增加积分的接口 issueNum = calcIssueNum() if not issueNum else issueNum userData = loadOrCreateUserData(userId, rankId, issueNum) userData.score += scoreDelta name, purl = userdata.getAttrs(userId, ['name', 'purl']) userData.name = '' if name is None else str(name) userData.purl = '' if purl is None else str(purl) rankingDefine = _scoreRankConf.findRankingDefine(rankId) ret = False if rankingDefine: updateUserData(userData, rankingDefine.rankLimit) ret = True ftlog.info('addUserScoreByGiftBox userId=', userId, 'rankId=', rankId, 'scoreDelta=', scoreDelta, 'issueNum=', issueNum, 'ret=', ret) return ret
def loadSubMemberStatus(userId): isYouyifuVipUser, youyifuVipMsg = userdata.getAttrs(userId, ['isYouyifuVipUser', 'youyifuVipMsg']) isSub = isYouyifuVipUser == 1 if ftlog.is_debug(): ftlog.debug('hallsubmember.loadSubMemberStatus userId=', userId, 'isYouyifuVipUser='******'youyifuVipMsg=', youyifuVipMsg) youyifuVipMsg = str(youyifuVipMsg) if youyifuVipMsg is not None else None nowDT = datetime.now() status = _loadSubMemberStatus(userId) status.isSub = isSub status.unsubDesc = youyifuVipMsg if status.isSub and not status.subDT: status.subDT = nowDT _adjustExpiresDT(status, nowDT) return status
def _adjustStatus(status): try: bindMobile, createTimeStr = userdata.getAttrs( status.userId, ['bindMobile', 'createTime']) status._isBindMobile = True if bindMobile else False status._registerTime = pktimestamp.timestrToTimestamp( createTimeStr, '%Y-%m-%d %H:%M:%S.%f') if status.inviteeMap: sl = sorted(status.inviteeMap.values(), key=lambda invitee: invitee.index) removeList = sl[MAX_INVITEE:] for invitee in removeList: del status.inviteeMap[invitee.userId] except: ftlog.error('neituiguang._adjustStatus userId=', status.userId) return status
def initInfo(self): '''从redis或session里初始化player的数据 ''' if ftlog.is_debug(): ftlog.debug("<< |userId, tableId, seatId:", self.userId, self.table.tableId, self.seatId, caller=self) self._clear() self.name, self.sex, self.purl = userdata.getAttrs(self.userId, ['name', 'sex', 'purl']) # self.purl = unicode(self.purl) # self.ip = sessiondata.getClientIp(self.userId) # gdata_fields = [] # () = gamedata.getGameAttrs(self.userId, self.table.gameId, gdata_fields) if ftlog.is_debug(): ftlog.debug(">> |userId, tableId, seatId:", self.userId, self.table.tableId, self.seatId, caller=self)
def friendInfo(cls, friend, prize, index, clientId): userdata.checkUserData(friend["userId"]) coupon = 0 if (index + 1) % 5 == 0: coupon = prize["COUPON"] result = {"prizeInfo": { "prize": [{"name": "CHIP", "count": prize["CHIP"]}, {"name": "COUPON", "count": coupon}], "state": friend["state"] }} uds = userdata.getAttrs(friend["userId"], ['purl', 'name', 'chip']) friendInfo = { "userId": friend["userId"], "headUrl": uds[0], "name": uds[1], "chip": uds[2], "dashifen": cls.getDaShiFenPic(friend["userId"], clientId) } result['friendInfo'] = friendInfo return result
def _doTableGmGetTableDetail(self, gameId, roomId, tableId, token): '''获取牌桌信息''' room = gdata.rooms()[roomId] # shadow roomId table = room.maptable[tableId] ftlog.info('GM._doTableGmGetTableDetail << |', 'roomId, tableId, token:', roomId, tableId, token) players = [] for player in table.players: if player.userId > 0: userVip = hallvip.userVipSystem.getUserVip(player.userId) vipLevel = (userVip and userVip.vipLevel and userVip.vipLevel.level) or 0 createTime, chargeTotal, ip = userdata.getAttrs(player.userId, ['createTime', 'chargeTotal', 'sessionClientIP']) playerInfo = { 'seatId': player.seatId, 'purl': player.purl, 'name': player.name, 'userId': player.userId, 'holeCards': player.holeCards, 'cardtype': player.cardtype, 'cardOrder': player.order, 'bet': player.bet, 'userChips': player.userChips, 'tableChips': player.tableChips, 'sharkLevel': player.sharkLevel, 'vipLevel': vipLevel, 'chargeTotal': chargeTotal, 'createTime': createTime, 'ip': ip, 'localPic': player.localPic, } if not token: del playerInfo['holeCards'] del playerInfo['cardtype'] del playerInfo['cardOrder'] players.append(playerInfo) obs = [] for userId in table.observers.keys(): userVip = hallvip.userVipSystem.getUserVip(userId) vipLevel = (userVip and userVip.vipLevel and userVip.vipLevel.level) or 0 name, chip = userdata.getAttrs(userId, ['name', 'chip']) ob = { 'userId': userId, 'name': name, 'chip': chip, } obs.append(ob) tableDetail = { 'tableId': table.tableId, 'cards': table.gamePlay.sharedCards, 'players': players, 'obs': obs, } if getattr(table, 'creatorId', 0): tableDetail['主播'] = userdata.getAttr(table.creatorId, 'name') tableDetail['主播id'] = table.creatorId if not token: del tableDetail['cards'] return tableDetail
def isColdUser(userId): '''判断是否冷用户''' userdatas = userdata.getAttrs(userId, ['userId', 'createTime', 'name']) return None in userdatas
def doQuickStart(self, msg): userId = msg.getParam('userId') tableId = msg.getParam('tableId') shadowRoomId = msg.getParam('shadowRoomId') clientId = msg.getParam('clientId') ftlog.info('TYRelaxationMatchRoom.doQuickStart', 'userId=', userId, 'tableId=', tableId, 'shadowRoomId=', shadowRoomId, 'clientId=', clientId) # 先判断比赛是否已经开始 if self.match.state != MatchRelaxation.ST_START: mq = MsgPack() mq.setCmd('quick_start') mq.setResult('userId', userId) mq.setResult('gameId', self.gameId) mq.setResult('roomId', 0) mq.setResult('tableId', 0) mq.setResult('isMatch', 1) mq.setResult('seatId', 0) mq.setResult('reason', u'比赛还未开始!') # 发送用户的quick_start router.sendToUser(mq, userId) return # 从playerMap里取得玩家对象, 没有就创建 player = self.match.findPlayer(userId) maxPlayCount = self.match.matchConf.start.maxPlayCount isNewPlayer = False if not player: isNewPlayer = True player = Player(userId) _, userName = userdata.getAttrs(userId, ['sessionClientId', 'name']) player.fillUserInfo(userName, clientId) self.match.addPlayer(player) elif player.playCount >= maxPlayCount: mq = MsgPack() mq.setCmd('quick_start') mq.setResult('userId', userId) mq.setResult('gameId', self.gameId) mq.setResult('roomId', 0) mq.setResult('tableId', 0) mq.setResult('isMatch', 1) mq.setResult('seatId', 0) mq.setResult('reason', u'你的比赛局数已超过上限') # 发送用户的quick_start router.sendToUser(mq, userId) return # 开始分配桌子 table = self.match.tableManager.getTableSitdown(player) if table: # 发送通知发送quck_start self.match.onPlayerSitdown(player, table, isNewPlayer) self.match.tableController.notifyTableSendQuickStart(table, player) else: mq = MsgPack() mq.setCmd('quick_start') mq.setResult('userId', userId) mq.setResult('gameId', self.gameId) mq.setResult('roomId', 0) mq.setResult('tableId', 0) mq.setResult('isMatch', 1) mq.setResult('seatId', 0) mq.setResult('reason', u'比赛桌位已满,请稍后再试') # 发送用户的quick_start router.sendToUser(mq, userId) return
def isUserEnabledGps(userId): """用户是否开启了gps, 有geo坐标数据就认为是已经开启 """ lat1, lon1 = userdata.getAttrs(userId, ["geoLat", "geoLon"]) ftlog.debug("util.isUserEnabledGps userId", userId, "lat", lat1, "lon1", lon1) return lat1 and lon1
def doQueryInviteInfo(self, gameId, userId, clientId): """ 查询邀请信息 上行: { "cmd": "game", "params": { "action": "query_invite_info", "gameId": 9999, "userId": 10323, "clientId": "IOS_3.9001_weixin.weixinPay,alipay.0-hall710.yitiao.ioshrbmj" } } 下行: { "cmd": "game", "result": { "action": "query_invite_info", "state": 1, "gameId": 9999, "bindUserId": 123456, "bindName": "123456", "bindPic": "", "rewardState": 0, "bindRewardCount": 12, "totalReward": 0, "inviteeList": [], "gotoInfo": { "title": "\\u4f53\\u9a8c\\u6e38\\u620f\\u9001\\u623f\\u5361\\u5566", "desc": "", "url": "http://www.shediao.com/youle/gamelist.html" }, "inviteShare": { "title": "\\u53ef\\u4ee5\\u548c\\u4eb2\\u53cb\\u4e00\\u8d77\\u6e38\\u620f\\u7684\\u9ebb\\u5c06", "desc": "\\u73a9\\u81ea\\u5efa\\u684c\\u672c\\u5730\\u9ebb\\u5c06\\uff0c\\u62a5\\u6211ID(10323)\\u5c31\\u9886\\u53d612\\u5f20\\u623f\\u5361", "url": "http://www.shediao.com/youle/gamelist.html" } } } """ timestamp = pktimestamp.getCurrentTimestamp() mo = MsgPack() mo.setCmd('game') mo.setResult('action', 'query_invite_info') status = hall_simple_invite.loadStatus(userId, timestamp) # 是否已填写了邀请人 state = self.translateState(status) mo.setResult('state', state) mo.setResult('gameId', gameId) # 已绑定了邀请人 if state == 1 and status.inviter: bindUserId = status.inviter mo.setResult('bindUserId', bindUserId) name, pic = userdata.getAttrs(bindUserId, ['name', 'purl']) if not name or name == '': name = str(bindUserId) if not pic: pic = '' mo.setResult('bindName', name) mo.setResult('bindPic', pic) mo.setResult('rewardState', status.getRewardState(userId, gameId, clientId)) # 绑定奖励数 conf = hall_simple_invite.getSimpleInviteConf(userId, gameId, clientId) if not conf: ftlog.error('ClentId:', clientId, ' has no hall_simple_invite config, please check!!!') return if conf.inviteRewardItem: mo.setResult('bindRewardCount', conf.inviteRewardItem.count) userList, count = self.getInviteesRewardInfo(status, Invitation.STATE_REWARDED, clientId) # 自己绑定获取的 if status.rewardState == Invitation.STATE_REWARDED: count += 1 # 总奖励数 mo.setResult('totalReward', count * conf.inviteRewardItem.count) mo.setResult('inviteeList', userList) # 去邀请信息 goto = {} goto['title'] = conf.gotoTitle goto['desc'] = conf.gotoDesc goto['url'] = conf.gotoUrl mo.setResult('gotoInfo', goto) inviteShare = {} inviteShare['title'] = conf.inviteTitle inviteShare['desc'] = strutil.replaceParams(conf.inviteDesc, {'rewardContent': str(userId)}) inviteShare['url'] = conf.inviteUrl mo.setResult('inviteShare', inviteShare) router.sendToUser(mo, userId)