def _getSurpassTarget(self): """ 获取要超越的玩家数据 """ timestamp = pktimestamp.getCurrentTimestamp() rankClass = RankingBase(self.userId, RankType.TodayGrandPrix, RankDefineIndex.GrandPrix, clientId=None, httpRequest=False) if rankClass: rankingList = rankClass.getTopNRankUsers(timestamp) surpassTarget = config.getGrandPrixConf( "surpassTarget") # [100、80、... 3、2、1] masterSurpassTargets = [] for rank in surpassTarget: idx = rank - 1 if 0 <= idx < len(rankingList.rankingUserList): player = rankingList.rankingUserList[idx] name = util.getNickname(player.userId) avatar = userdata.getAttr(player.userId, "purl") masterSurpassTargets.append({ "userId": player.userId, "name": name, "score": player.score, "rank": player.rank + 1, "avatar": avatar }) self._rankListCache = masterSurpassTargets
def _sendMailBySender(senderUserId, receiverUserId, type, reward=None, desc=None, title=None): """ 添加邮件到发件人发件箱 :param senderUserId: 发件人 :param receiverUserId: 收件人 :param type: 邮件类型 :param reward: 附件奖励 :param desc: 邮件内容 :param title: 标题 """ curTime = int(time.time()) desc = desc or "" reward = reward or [] title = title or "" mailOutId = gamedata.incrGameAttr(senderUserId, FISH_GAMEID, GameData.outMailId, 1) mailOutInfos = gamedata.getGameAttrJson(senderUserId, FISH_GAMEID, GameData.outMailInfos, []) receiverUserName = util.getNickname(receiverUserId) mailOutInfos.insert(0, { "id": mailOutId, "userId": receiverUserId, "time": curTime, "name": receiverUserName, "reward": reward, "type": type, "desc": desc, "title": title }) mailOutInfos = _removeOutMailExpData(mailOutInfos, MAX_OUT_MAIL_COUNT) gamedata.setGameAttr(senderUserId, FISH_GAMEID, GameData.outMailInfos, json.dumps(mailOutInfos)) if type == MailRewardType.Present: lang = util.getLanguage(senderUserId) message = config.getMultiLangTextConf("ID_PRESENT_TO_OTHER_MSG", lang=lang) message = message.format(receiverUserName, receiverUserId, util.buildRewardsDesc(reward, lang)) GameMsg.sendPrivate(FISH_GAMEID, senderUserId, 0, message)
def sendGrandPrizeReward(roomId, tableId, userId, fId, coinCount, level, seatId, fpMultiple): """ 发放巨奖奖励 """ try: rewards = [{"name": config.CHIP_KINDID, "count": coinCount}] room = gdata.rooms()[roomId] table = room.maptable[tableId] player = table.getPlayer(userId) msg = MsgPack() msg.setCmd("getGrandPrizeRewards") msg.setResult("gameId", FISH_GAMEID) msg.setResult("userId", userId) msg.setResult("fId", fId) msg.setResult("rewards", rewards) msg.setResult("level", level) msg.setResult("seatId", seatId) msg.setResult("fpMultiple", fpMultiple) GameMsg.sendMsg(msg, table.getBroadcastUids()) if player: for bigRoomId in config.getGrandPrizeConf().get("roomIds", []): player.fireCost[str(bigRoomId)] = 0 name = player.name player.addTableChip(coinCount, "BI_NFISH_GRAND_PRIZE") player.totalGainChip += coinCount # 深海巨奖触发幸运降临 table.checkBigPrize(player, coinCount // fpMultiple, coinCount, fpMultiple, isGrandPriz=True) else: from poker.entity.dao import gamedata from newfish.entity.redis_keys import GameData fireCost = gamedata.getGameAttrJson(userId, FISH_GAMEID, GameData.fireCost, {}) for bigRoomId in config.getGrandPrizeConf().get("roomIds", []): fireCost[str(bigRoomId)] = 0 gamedata.setGameAttr(userId, FISH_GAMEID, GameData.fireCost, json.dumps(fireCost)) name = util.getNickname(userId) util.addRewards(userId, rewards, "BI_NFISH_GRAND_PRIZE", roomId) leds = [ "ID_LED_GRAND_PRIZE_1", "ID_LED_GRAND_PRIZE_2", "ID_LED_GRAND_PRIZE_3" ] if len(leds) > level >= 0: lang = util.getLanguage(userId) msg = config.getMultiLangTextConf(leds[level], lang=lang) % \ (name, config.getMultiLangTextConf(table.runConfig.title, lang=lang), util.formatScore(coinCount, lang=lang)) user_rpc.sendLed(FISH_GAMEID, msg, id=leds[level], lang=lang) except Exception as e: ftlog.error("sendGrandPrizeReward", roomId, tableId, userId, fId, coinCount, traceback.format_exc()) return 0
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 getShareTaskInfo(userId): """ 获取分享有礼信息 """ shareGroupIds = weakdata.getDayFishData(userId, "shareGroupIds", []) shareGroupTotalCount = config.getCommonValueByKey("shareGroupTotalCount") shareGroupCurrentCount = min(len(shareGroupIds), shareGroupTotalCount) groupTask = { "taskId": 0, "progress": [shareGroupCurrentCount, shareGroupTotalCount], # 分享群数/总数 "rewards": config.getCommonValueByKey("shareGroupRewards"), "state": weakdata.getDayFishData(userId, "shareGroupReward", 0) } if groupTask["state"] == 0 or util.isVersionLimit(userId): module_tip.cancelModuleTipEvent(userId, "invite", 0) inviteTasks = [] inviteList = refreshInviteData(userId) for _, inviteData in enumerate(inviteList): name = util.getNickname(inviteData["userId"]) avatar = userdata.getAttr(inviteData["userId"], "purl") if inviteData.get("isAppUser", 0) == 1: continue if inviteData.get("isNewUser"): rewards = config.getCommonValueByKey("newUserInviteFriendRewards") else: rewards = config.getCommonValueByKey("inviteFriendRewards") task = { "taskId": inviteData["inviteId"], "name": name, "avatar": avatar, "vip": hallvip.userVipSystem.getUserVip(userId).vipLevel.level, "state": 2 if inviteData.get("receiveTime") else 1, "rewards": rewards } inviteTasks.append(task) inviteCount = weakdata.getDayFishData(userId, "inviteCount", 0) inviteTotalCount = config.getCommonValueByKey("inviteLimitCount", 99999) inviteCount = min(inviteCount, inviteTotalCount) friendTask = { "progress": [inviteCount, inviteTotalCount], "rewards": config.getCommonValueByKey("inviteFriendRewards"), "newUserRewards": config.getCommonValueByKey("newUserInviteFriendRewards"), "tasks": inviteTasks } message = MsgPack() message.setCmd("share_task_info") message.setResult("gameId", FISH_GAMEID) message.setResult("userId", userId) if not util.isVersionLimit(userId): message.setResult("groupTask", groupTask) message.setResult("friendTask", friendTask) router.sendToUser(message, userId)
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 addOneHistory(userId, otherUserId, type, ftId, rewards=None): ftlog.debug("addOneHistory->", userId, otherUserId, type, rewards) curTime = int(time.time()) desc = "" rewards = rewards or [] otherUserId = otherUserId or 0 # 添加对战详情到发件人发件箱 if userId > 10000: otherUserName = "" if otherUserId: otherUserName = util.getNickname(otherUserId) # if type == HistoryType.CreatRoom: # if rewards: # desc = u"创建了奖励为%s的竞技房间" % (getRewardDesc(rewards)) # else: # desc = "创建了竞技房间" # elif type == HistoryType.Unbind: # if rewards: # desc = u"解散了奖励为%s的竞技房间" % (getRewardDesc(rewards)) # else: # desc = "解散了房间" # elif type == HistoryType.Win: # if rewards: # desc = u"在和%s(账号:%d)的竞技中获得第1名,赢了%s" % (otherUserName, otherId, getRewardDesc(rewards)) # else: # desc = u"在和%s(账号:%d)的竞技中获得第1名" % (otherUserName, otherId) # elif type == HistoryType.Lose: # desc = u"在和%s(账号:%d)的竞技中获得第2名" % (otherUserName, otherId) historyId = gamedata.incrGameAttr(userId, FISH_GAMEID, GameData.fightHistoryId, 1) historyInfos = gamedata.getGameAttrJson(userId, FISH_GAMEID, GameData.fightHistory, []) historyInfos.append({ "id": historyId, "userId": otherUserId, "time": curTime, "name": otherUserName, "reward": rewards, "type": type, "ftId": ftId, "desc": desc }) historyInfos = _removeHistoryExpData(historyInfos, 50) gamedata.setGameAttr(userId, FISH_GAMEID, GameData.fightHistory, json.dumps(historyInfos))
def notifyInspireInfo(roomId, teamId, ratio, remainTime, purchaserUid, interval, lv): """ 通知购买鼓舞礼包 """ room = gdata.rooms()[roomId] ftlog.debug("notifyInspireInfo, ", roomId, teamId, ratio, remainTime, room.maptable.keys() if room else []) # for table in room.maptable.values(): # if table.playersNum: # table.notifyInspireInfo(teamId, ratio, remainTime) name = util.getNickname(purchaserUid) avatar = userdata.getAttr(purchaserUid, "purl") ledTxt = {} from newfish.entity.fishactivity import competition_activity mo = MsgPack() mo.setCmd("comp_act_notify") mo.setResult("gameId", FISH_GAMEID) mo.setResult("teamId", teamId) mo.setResult("teamInspireBuf", (ratio, remainTime, lv)) actState, actStateRemainTime = competition_activity._getCompStateAndRemainTime( ) mo.setResult("actState", actState) mo.setResult("actStateRemainTime", actStateRemainTime) mo.setResult("avatar", avatar) mo.setResult("name", name) mo.setResult("interval", interval) for lang in util.getAllLanguage(): teamName = config.getMultiLangTextConf("ID_COMPACT_TEAM_%d" % (teamId + 1), lang=lang) led = config.getMultiLangTextConf("ID_COMPACT_LED", lang=lang).format( name, teamName, interval) ledTxt[lang] = led for _uid in room._allPlayerDict.keys(): if competition_activity._getCompTeamId(_uid) == teamId: lang = util.getLanguage(_uid) mo.setResult("led", ledTxt.get(lang, "")) GameMsg.sendMsg(mo, _uid) ftlog.debug("notifyInspireInfo, userId =", _uid, "teamId =", teamId, "mo =", mo) return 1
def sendMailToReceiver(senderUserId, receiverUserId, type, reward=None, desc=None, title=None): """ 添加邮件到收件人收件箱 :param senderUserId: 发件人 :param receiverUserId: 收件人 :param type: 邮件类型 :param reward: 附件奖励 :param desc: 邮件内容 :param title: 标题 """ curTime = int(time.time()) desc = desc or "" reward = reward or [] title = title or "" mailSendId = gamedata.incrGameAttr(receiverUserId, FISH_GAMEID, GameData.mailId, 1) # 邮件的有效期 mailSenderType = MailSenderType.MT_SYS if senderUserId == config.ROBOT_MAX_USER_ID else MailSenderType.MT_USERS expireTs = curTime + _getMailExpireTime(mailSenderType) # 邮件数据存储key(系统邮件、玩家邮件) mailKey = GameData.mailInfos if senderUserId == config.ROBOT_MAX_USER_ID else GameData.userMailInfos mailInfos = gamedata.getGameAttrJson(receiverUserId, FISH_GAMEID, mailKey, []) senderUserName = util.getNickname(senderUserId) mailInfos.insert(0, { "id": mailSendId, "userId": senderUserId, "time": curTime, "expireTime": expireTs, "name": senderUserName, "reward": reward, "type": type, "desc": desc, "state": MailState.Default, "title": title }) mailInfos = _removeMailExpData(mailInfos, MAIL_DISPLAY_COUNT) gamedata.setGameAttr(receiverUserId, FISH_GAMEID, mailKey, json.dumps(mailInfos)) _dealTips(receiverUserId, mailInfos, mailSenderType) if type == MailRewardType.Present: lang = util.getLanguage(receiverUserId) message = config.getMultiLangTextConf("ID_ACCEPT_PRESENT_MSG", lang=lang) message = message.format(senderUserName, senderUserId, util.buildRewardsDesc(reward, lang)) GameMsg.sendPrivate(FISH_GAMEID, receiverUserId, 0, message)
def sendUserNewLed(userId, clientId): """发送新手Led""" import random from hall.entity import hallranking import time from newfish.entity.config import FISH_GAMEID from poker.entity.dao import gamedata from newfish.entity.redis_keys import GameData from newfish.entity import util if gamedata.getGameAttrInt(userId, FISH_GAMEID, GameData.hasSendUserNewLed) == 0: lang = util.getLanguage(userId, clientId) names = config.getRobotConf("names") name = random.choice(names) msg_1 = config.getMultiLangTextConf("ID_LED_NEWBIE_TASK_1", lang=lang) % name msg_3 = config.getMultiLangTextConf("ID_LED_NEWBIE_TASK_4", lang=lang) % name msg_4 = config.getMultiLangTextConf("ID_LED_NEWBIE_TASK_6", lang=lang) % name msg_5 = config.getMultiLangTextConf("ID_LED_NEWBIE_TASK_7", lang=lang) % name rankingList = hallranking.rankingSystem.getTopN( config.RANK_MATCH_WZZB, 1, int(time.time())) if rankingList and len(rankingList.rankingUserList) > 0: user = rankingList.rankingUserList[0] name = util.getNickname(user.userId) msg_2 = config.getMultiLangTextConf("ID_LED_NEWBIE_TASK_2", lang=lang) % name mo = MsgPack() mo.setCmd("sendUserNewLed") mo.setResult("gameId", FISH_GAMEID) mo.setResult("userId", userId) mo.setResult("msg_1", msg_1) mo.setResult("msg_2", msg_2) mo.setResult("msg_3", msg_3) mo.setResult("msg_4", msg_4) mo.setResult("msg_5", msg_5) router.sendToUser(mo, userId) gamedata.setGameAttr(userId, FISH_GAMEID, GameData.hasSendUserNewLed, json.dumps(1))
def doGetUserInfo(userId, otherUserId, kindId): """ :param kindId: 赠送的道具ID """ userdata.checkUserData(otherUserId) name = util.getNickname(otherUserId) sex, purl, charm = userdata.getAttrs(otherUserId, ["sex", "purl", "charm"]) vipLv = util.getVipShowLevel(otherUserId) level = util.getUserValidCheckLevel(otherUserId) honors = honor_system.getHonorList(otherUserId) _, leftReceiveCount = _isCanReceiveFromOther(otherUserId, kindId) code = 0 if name is None or name == "" or not level or level == 0: code = 1 if otherUserId in config.getPublic("banGiftList", []): code = 1 name = str(name) if name else "" message = MsgPack() message.setCmd("fishUserInfo") message.setResult("gameId", FISH_GAMEID) message.setResult("userId", userId) if code == 0: userInfos = { "userId": otherUserId, "name": name, "sex": sex, "purl": purl, "level": level, "vipLv": vipLv, "charm": charm, "honors": honors, "leftReceiveCount": leftReceiveCount } message.setResult("userInfos", userInfos) message.setResult("code", code) router.sendToUser(message, userId)
def getGameInfo(userId, clientId): """ 获取玩家的游戏数据 """ from newfish.entity import user_system ukeys = getInitDataKeys() uvals = gamedata.getGameAttrs(userId, FISH_GAMEID, ukeys) uvals = list(uvals) values = getInitDataValues() for x in xrange(len(uvals)): if uvals[x] is None: uvals[x] = values[x] gdata = dict(zip(ukeys, uvals)) gdata["name"] = util.getNickname(userId) gdata["userGuideStep"] = gamedata.getGameAttrJson(userId, FISH_GAMEID, GameData.userGuideStep, []) redState = gamedata.getGameAttrInt(userId, FISH_GAMEID, GameData.redState) gdata["redState"] = redState gdata["giftState"] = newbie_7days_gift.checkNewbie7DaysGiftState( userId, redState) # 是否可以领取启航礼包(1:是 0:否) # gdata["sailGiftState"] = 1 if gift_system.SailGift(userId, clientId).getGiftInfo() else 0 gdata["surpriseGift"] = weakdata.getDayFishData(userId, GameData.surpriseGift, 0) gdata["exchangeCount"] = gamedata.getGameAttrInt(userId, FISH_GAMEID, GameData.exchangeCount) gdata["nowServerTime"] = time.time() gdata["isAdult"] = user_system.isAdult(userId) # 是否为v2版本老玩家(1:是 0:否) isOldPlayerV2 = gamedata.getGameAttr(userId, FISH_GAMEID, GameData.isOldPlayerV2) if isOldPlayerV2 is None: isOldPlayerV2 = 0 clientVersion = gamedata.getGameAttr(userId, FISH_GAMEID, GameData.clientVersion) if redState: isOldPlayerV2 = 1 elif clientVersion and StrictVersion( str(clientVersion)) < StrictVersion("3.0.0"): isOldPlayerV2 = 1 gamedata.setGameAttr(userId, FISH_GAMEID, GameData.redState, 1) gamedata.setGameAttr(userId, FISH_GAMEID, GameData.isOldPlayerV2, isOldPlayerV2) v2DataTov3Data(userId, clientId) gdata["isOldPlayerV2"] = isOldPlayerV2 # 当前技能页面显示的模式,老玩家默认为经典模式(0:经典 1:千炮) skillMode = gamedata.getGameAttr(userId, FISH_GAMEID, GameData.skillMode) if skillMode is None: skillMode = config.CLASSIC_MODE if isOldPlayerV2 else config.MULTIPLE_MODE gamedata.setGameAttr(userId, FISH_GAMEID, GameData.skillMode, skillMode) gdata["skillMode"] = skillMode # 当前炮台页显示的模式,老玩家默认为经典模式(0:经典 1:千炮) gunMode = gamedata.getGameAttr(userId, FISH_GAMEID, GameData.gunMode) if gunMode is None: gunMode = config.CLASSIC_MODE if isOldPlayerV2 else config.MULTIPLE_MODE gamedata.setGameAttr(userId, FISH_GAMEID, GameData.gunMode, gunMode) gdata["gunMode"] = gunMode exp, level = gamedata.getGameAttrs(userId, FISH_GAMEID, [GameData.exp, GameData.level]) exp = exp or 0 level = level or 1 _, expPct = util.getUserLevelExpData(userId, level, exp) gdata["level"] = level gdata["expPct"] = expPct return gdata