Exemplo n.º 1
0
    def patch(self, union_id):
        proxy = DataProxy()
        proxy.search("unionseason", union_id)
        proxy.search_by_index("unionbattle", "union_id", union_id)
        proxy.execute(asyn=False)

        season = proxy.get_result("unionseason", union_id)
        for battle in proxy.get_all_result("unionbattle"):
            if battle.index == season.current_battle_index:
                return battle.stage

        raise Exception("union data error")
Exemplo n.º 2
0
    def _pre_select_pvp_rival(self, proxy):
        """初步选择对手
        在可选区间内,初步随机选择 X 名对手
        通常情况下,X > 1,为了避免选择到的对手不合适而需要重新请求
        Args:
            proxy[DataProxy]
        """
        cache_proxy = DataProxy()

        exit_rivals = []
        least_count = 3 #初步选择3人
        for rival in self._pvp_players:
            total_count = proxy.get_rank_score_count(
                    "guard", "score", rival.score_min, rival.score_max)

            if total_count <= 0:
                #对应的区间范围内无合适的 PVP 对手,退化为 PVE
                logger.warning("Invalid rival score range[id=%d][%d-%d]" %
                        (rival.id, rival.score_min, rival.score_max))
                exit_rivals.append(rival)

            random.seed()
            count = min(least_count, total_count)
            offset = random.randint(0, total_count - count)
            rival.set_pvp_filter_range(offset, count)
            cache_proxy.search_by_rank_score("guard", "score",
                    rival.score_min, rival.score_max, rival.offset, rival.count)

        #退化成 PVE 对手
        for rival in exit_rivals:
            self._pvp_convert_to_pve(rival)

        defer = cache_proxy.execute()
        return defer
Exemplo n.º 3
0
    def _calc_result(self, pre_proxy):
        self.user = pre_proxy.get_result("user", self.user_id)
        self.battle_score = pre_proxy.get_result("battle_score", self.user_id)
        self.union = pre_proxy.get_result("union", self.user_id)
        self.technologys = pre_proxy.get_all_result("technology")

        #过滤 team
        teams_id = self.battle_score.get_powerful_teams_id()
        self.teams = []
        teams = pre_proxy.get_all_result("team")
        for team in teams:
            if team.id in teams_id:
                self.teams.append(team)

        #查询 heroes
        heroes_id = []
        for team in self.teams:
            heroes_id.extend(team.get_heroes())

        proxy = DataProxy()
        for hero_id in heroes_id:
            proxy.search("hero", hero_id)

        defer = proxy.execute()
        defer.addCallback(self._calc_detail_result)
        return defer
Exemplo n.º 4
0
    def _calc_season_result(self, pre_proxy, req, union_min, union_max,
                            indiv_min, indiv_max, timer):

        seasons = []
        users = []

        for i, union_info in enumerate(
                pre_proxy.get_rank_result("unionseason", "score", union_min,
                                          union_max)):
            seasons.append(union_info)

        for i, indiv_info in enumerate(
                pre_proxy.get_rank_result("union", "season_score", indiv_min,
                                          indiv_max)):
            users.append(indiv_info)

        #查询联盟信息
        proxy = DataProxy()
        for union_info in seasons:
            proxy.search("unionunion", union_info.union_id)
            proxy.search_by_index("unionmember", "union_id",
                                  union_info.union_id)
        for indiv_info in users:
            proxy.search("user", indiv_info.user_id)
        defer = proxy.execute()
        defer.addCallback(self._calc_season_ranking_result, req, seasons,
                          users, timer)
        return defer
Exemplo n.º 5
0
    def _set_pvp_rival_guard(self, proxy, rival_user_id, rival):
        """
        """
        guards = proxy.get_all_result("guard")
        
        rival_guard = None
        for guard in guards:
            if guard.user_id == rival_user_id:
             #一个玩家目前只对应一个guard
                rival_guard = guard
                break
        
        #if rival_guard is None:
        #    rival.clear()  #该玩家不存在或没有guard信息

        rival.set_pvp_enemy_guard(rival_guard)
        if rival_guard == None:
            rival.rival_id = rival_user_id
        rival.is_rob = True

        cache_proxy = DataProxy()
        #查询 user, technology, hero, resource, defense 表
        cache_proxy.search("user", rival.rival_id)
        cache_proxy.search("union", rival.rival_id)
        cache_proxy.search_by_index("technology", "user_id", rival.rival_id)
        heroes_id = rival.get_heroes_id()
        for hero_id in heroes_id:
            if hero_id != 0:
                cache_proxy.search("hero", hero_id)
        if rival.is_rob:
            cache_proxy.search("resource", rival.rival_id)
            cache_proxy.search("defense", rival.defense_id)

        defer = cache_proxy.execute()
        return defer
Exemplo n.º 6
0
    def _calc_union_season_battle_post(self, pre_proxy, data, req, timer):
        union = data.union.get(True)

        rankings = {}

        #获得己方联盟的排名
        if union.is_belong_to_union():
            own_ranking = pre_proxy.get_ranking("unionseason", "score",
                                                union.union_id)
            own_season = pre_proxy.get_result("unionseason", union.union_id)
            rankings[own_ranking] = own_season

        results = pre_proxy.get_rank_result("unionseason", "score",
                                            req.start_index - 1,
                                            req.end_index - 1)
        for i, season in enumerate(results):
            rankings[i] = season

        #查询联盟信息
        proxy = DataProxy()
        for index in rankings:
            proxy.search("unionunion", rankings[index].union_id)
        defer = proxy.execute()
        defer.addCallback(self._calc_union_season_battle_result, rankings,
                          data, req, timer)
        return defer
Exemplo n.º 7
0
    def load_from_cache(self, id):
        """从 cache 中载入联盟数据
        Args:
            id[int]: 联盟 id
        """
        self.id = id
        proxy = DataProxy()

        proxy.search("unionunion", id)
        proxy.search_by_index("unionmember", "union_id", id)
        proxy.search_by_index("unionapplication", "union_id", id)
        proxy.search_by_index("unionaid", "union_id", id)

        proxy.search("unionseason", id)
        proxy.search_by_index("unionbattle", "union_id", id)
        proxy.search_by_index("unionbattle_node", "union_id", id)
        proxy.search_by_index("unionbattle_record", "union_id", id)

        proxy.search_by_index("uniondonatebox", "union_id", id)
        proxy.search_by_index("uniondonaterecord", "union_id", id)

        proxy.search_by_index("unionboss", "union_id", id)

        defer = proxy.execute()
        defer.addCallback(self._post_load)
        return defer
Exemplo n.º 8
0
    def _try_forward_season_for_user_not_belong_to_union(self):
        """让不属于任何联盟的玩家,且参加过上个赛季联盟战争的玩家,进入下一个赛季
        """
        users = []

        flag = True
        begin = 0
        gap = 50
        while flag:
            proxy = DataProxy()
            proxy.search_by_rank("union", "season_score", begin, begin + gap)
            defer = proxy.execute()

            for i, indiv_info in enumerate(
                    proxy.get_rank_result("union", "season_score", begin,
                                          begin + gap)):
                if indiv_info.season_score > 0:
                    if indiv_info.user_id not in users:
                        users.append(indiv_info.user_id)
                else:
                    flag = False
                    break

            begin += gap

        for user_id in users:
            req = internal_pb2.UnionBattleForwardReq()
            defer = GlobalObject().root.callChild(
                "portal", "forward_union_battle_season_forward", user_id,
                req.SerializeToString())
            defer.addCallback(
                self._check_forward_season_for_user_not_belong_to_union)
Exemplo n.º 9
0
    def _calc_accept_friend(self, data, req, timer):

        proxy = DataProxy()
        proxy.search("user", req.friend_id)
        defer = proxy.execute()
        defer.addCallback(self._calc_accept_friend_info, data, req, timer)
        return defer
Exemplo n.º 10
0
 def match(self, now):
     proxy = DataProxy()
     proxy.search_by_rank("unionunion", "recent_prosperity",
                          self.RANK_START, self.RANK_STOP)
     defer = proxy.execute()
     defer.addCallback(self._calc_result)
     return defer
Exemplo n.º 11
0
    def _calc_query_melee_ranking(self, proxy, user_id, scores_range, req,
                                  timer):
        cache_proxy = DataProxy()
        self_arena = proxy.get_result("melee", user_id)
        self_ranking = proxy.get_ranking("melee", "score", user_id) + 1
        cache_proxy.search("user", user_id)

        all_arenas = {}
        all_arenas_rank = {}
        player_rankings = {}
        for range in scores_range:
            arena_list = proxy.get_rank_score_result("melee", "score",
                                                     range[0], range[1], 0,
                                                     MELEE_COUNT)

            #按照积分先排序
            arena_list.sort(lambda x, y: cmp(ArenaInfo.get_real_score(
                x.score), ArenaInfo.get_real_score(y.score)),
                            reverse=True)

            arena_rank = 1
            for arena in arena_list:
                all_arenas[arena.user_id] = arena
                all_arenas_rank[arena.user_id] = arena_rank
                arena_rank = arena_rank + 1
                cache_proxy.search("user", arena.user_id)

        defer = cache_proxy.execute()
        defer.addCallback(self._query_melee_ranking_succeed, user_id,
                          self_arena, self_ranking, all_arenas,
                          all_arenas_rank, req, timer)
        return defer
Exemplo n.º 12
0
 def match(self):
     """进行匹配
     """
     proxy = DataProxy()
     proxy.get_all("user", "id")
     defer = proxy.execute()
     defer.addCallback(self._calc_result)
     return defer
Exemplo n.º 13
0
def update_last_user_level():
    """更新第50名用户的等级"""
    proxy = DataProxy()
    proxy.search_by_rank("battle_score", "score", 0, 49)

    defer = proxy.execute()
    defer.addCallback(_update_last_user_level_rank)
    return defer
Exemplo n.º 14
0
    def _calc_chat_friend(self, data, req, timer):

        logger.notice("TEXT = %s" % req.content)
        proxy = DataProxy()
        proxy.search("user", req.friend_id)
        defer = proxy.execute()
        defer.addCallback(self._calc_chat_friend_info, data, req, timer)
        return defer
Exemplo n.º 15
0
 def match(self, now):
     """进行推荐
     """
     proxy = DataProxy()
     proxy.get_all("unionunion", "id")
     defer = proxy.execute()
     defer.addCallback(self._calc_result, now)
     return defer
Exemplo n.º 16
0
    def match(self, data, city_id):
        """进行匹配
        """
        proxy = DataProxy()
        proxy.search("unitcity", city_id)

        defer = proxy.execute()
        defer.addCallback(self._calc_result, city_id)
        return defer
Exemplo n.º 17
0
 def query_specify_user(self, str_list, rival):
     """字符串查询匹配
     """
     proxy = DataProxy()
     proxy.get_all("user", "id")
     defer = proxy.execute()
     defer.addCallback(self._calc_query_specify_user_result, str_list)
     defer.addCallback(self._query_user_info, rival)
     return defer
Exemplo n.º 18
0
    def get_ranking(self, union_id, user_id):
        """查询联盟赛季排名
        """
        self.union_id = union_id
        self.user_id = user_id

        proxy = DataProxy()
        proxy.search_ranking("unionseason", "score", union_id)
        proxy.search_ranking("union", "season_score", user_id)
        proxy.execute(asyn=False)
        self.union_ranking = proxy.get_ranking("unionseason", "score",
                                               union_id)
        self.individual_ranking = proxy.get_ranking("union", "season_score",
                                                    user_id)

        print self.union_ranking
        print self.individual_ranking
        return (self.union_ranking, self.individual_ranking)
Exemplo n.º 19
0
 def _calc_approve(self, data, req, timer):
     """审批
     """
     #判断目标用户是否存在
     proxy = DataProxy()
     proxy.search("user", req.target_user_id)
     defer = proxy.execute()
     defer.addCallback(self._calc_approve_query, data, req, timer)
     return defer
Exemplo n.º 20
0
    def _collect(self, pre_proxy):
        """收集信息
        """
        proxy = DataProxy()

        for union in pre_proxy.get_all_result("unionunion"):
            proxy.search("unionseason", union.id)
        defer = proxy.execute()
        defer.addCallback(self._calc_result)
        return defer
Exemplo n.º 21
0
    def match(self):
        """进行匹配
        """
        proxy = DataProxy()

        for user_id in self.ids:
            proxy.search("user", user_id)

        defer = proxy.execute()
        defer.addCallback(self._calc_result)
        return defer
Exemplo n.º 22
0
    def search(self, unions):
        """查询联盟战争中的玩家信息
        """
        self.unions = unions

        proxy = DataProxy()
        for union_id in self.unions:
            proxy.search_by_index("unionmember", "union_id", union_id)
        defer = proxy.execute()
        defer.addCallback(self._calc_result)
        return defer
Exemplo n.º 23
0
    def _filter_pvp_rival(self, proxy):
        """筛选出合适的对手
        筛选掉不合法的对手(比如重复的对手)
        """
        exit_rivals = []
        for rival in self._pvp_players:
            candidate = []
            guard_list = proxy.get_rank_score_result("guard", "score",
                                                     rival.score_min,
                                                     rival.score_max,
                                                     rival.offset, rival.count)
            for guard in guard_list:
                if guard.user_id not in self._invalid:
                    logger.debug("Candidate[user id=%d]" % guard.user_id)
                    candidate.append(guard)

            #如果可选对手为空,退化为 PVE
            if len(candidate) == 0:
                logger.warning(
                    "Bad luck for no candidate[id=%d][%d-%d][%d,%d]" %
                    (rival.id, rival.score_min, rival.score_max, rival.offset,
                     rival.count))
                exit_rivals.append(rival)
                continue

            #随机选择
            random.seed()
            rival_guard = random.sample(candidate, 1)[0]
            rival.set_pvp_enemy_guard(rival_guard)

            self._invalid.append(rival.rival_id)  #不能匹配到重复的敌人
            logger.debug("Add invalid user[user id=%d]" % rival.rival_id)

        #退化成 PVE 对手
        for rival in exit_rivals:
            self._pvp_convert_to_pve(rival)

        cache_proxy = DataProxy()

        #查询 user, technology, hero, resource, defense 表
        for rival in self._pvp_players:
            cache_proxy.search("user", rival.rival_id)
            cache_proxy.search_by_index("technology", "user_id",
                                        rival.rival_id)
            heroes_id = rival.get_heroes_id()
            for hero_id in heroes_id:
                if hero_id != 0:
                    cache_proxy.search("hero", hero_id)
            if rival.is_rob:
                cache_proxy.search("resource", rival.rival_id)
                cache_proxy.search("defense", rival.defense_id)

        defer = cache_proxy.execute()
        return defer
Exemplo n.º 24
0
    def get_all(self, name, field_name):
        """获取字段所有值
        """
        self.name = name
        self.field_name = field_name
        proxy = DataProxy()
        proxy.get_all_values(self.name, self.field_name)

        defer = proxy.execute()
        defer.addCallback(self._calc_result)
        return defer
Exemplo n.º 25
0
    def check(self, name, field_name, field_value):
        """检查字段值是否重复
        """
        self.name = name
        self.field_name = field_name
        self.field_value = field_value
        proxy = DataProxy()
        proxy.is_value_exist(self.name, self.field_name, self.field_value)

        defer = proxy.execute()
        defer.addCallback(self._calc_result)
        return defer
Exemplo n.º 26
0
    def _calc_result(self, pre_proxy):
        self.members = {}
        for member in pre_proxy.get_all_result("unionmember"):
            if member.is_join_battle:
                self.members[member.user_id] = member

        proxy = DataProxy()
        for user_id in self.members:
            proxy.search("user", user_id)
        defer = proxy.execute()
        defer.addCallback(self._calc_detail_result)
        return defer
Exemplo n.º 27
0
    def match(self):
        """查询玩家信息、战力信息
        """
        proxy = DataProxy()
        for user_id in self.ids:
            proxy.search("user", user_id)
            proxy.search("battle_score", user_id)
            proxy.search("union", user_id)

        defer = proxy.execute()
        defer.addCallback(self._calc_result)
        return defer
Exemplo n.º 28
0
 def match(self):
     """匹配
     1 筛选所有符合参战条件的联盟
     2 优先匹配联盟匹配隐藏积分相同的队伍
     # 3 优先匹配联盟成员人数接近的联盟
     # 4 优先匹配平均等级接近的联盟
     5 尽量不匹配上次的对手
     """
     proxy = DataProxy()
     proxy.get_all("unionunion", "id")
     defer = proxy.execute()
     defer.addCallback(self._collect)
     return defer
Exemplo n.º 29
0
def _update_last_user_level_rank(proxy):
    results = proxy.get_rank_result("battle_score", "score", 0, 49)
    if len(results) == 0:
        MissionPool.update_last_user_level(0)
        return 0

    last_user_id = results[len(results) - 1].user_id
    proxy = DataProxy()
    proxy.search("user", last_user_id)

    defer = proxy.execute()
    defer.addCallback(_update_last_user_level_result, last_user_id)
    return defer
Exemplo n.º 30
0
    def commit(self, right):
        """确认修改
        将自身的数据修改到和 right 一致,并同步到 DB 中
        """
        proxy = DataProxy()

        for field_name in self.__slots__:
            lfield = getattr(self, field_name)
            rfield = getattr(right, field_name)
            lfield.commit(rfield, proxy)

        defer = proxy.execute()
        defer.addCallback(self._check_commit)
        return defer