Пример #1
0
    def test_wash(self):
        skills = SkillManager(1, 1).get_staff_skills(self.staff_id)
        new_skills = {}
        for k, v in skills.iteritems():
            if v['locked'] == 1:
                new_skills[k] = v

        cost = ConfigSkillWashCost.get_cost(len(new_skills))
        if cost.get('gold', 0):
            key = 'club.gold'
            span = cost['gold']
        else:
            key = 'club.diamond'
            span = cost['diamond']

        MongoCharacter.db(1).update_one(
            {'_id': 1},
            {'$set': {key: -span}}
        )

        SkillManager(1, 1).wash(self.staff_id)

        club = MongoCharacter.db(1).find_one(
            {'_id': 1},
            {'club': 1}
        )

        if key == 'club.diamond':
            assert club['club']['diamond'] == 0
        else:
            assert club['club']['gold'] == 0
Пример #2
0
 def update(self, gold=0, diamond=0):
     MongoCharacter.db(self.server_id).update_one(
         {'_id': self.char_id},
         {'$set': {
             'club.gold': gold,
             'club.diamond': diamond,
         }}
     )
Пример #3
0
    def create(cls, server_id, char_id, club_name, club_flag):
        from core.staff import StaffManger
        from core.formation import Formation
        from core.mail import MailManager
        from apps.config.models import Mail as ModelMail

        doc = MongoCharacter.document()
        doc['_id'] = char_id
        doc['create_at'] = arrow.utcnow().timestamp

        doc['name'] = club_name
        doc['flag'] = club_flag
        doc['gold'] = CHAR_INIT_GOLD
        doc['diamond'] = CHAR_INIT_DIAMOND
        doc['crystal'] = CHAR_INIT_CRYSTAL
        doc['gas'] = CHAR_INIT_GAS

        sm = StaffManger(server_id, char_id)

        formation_init_data = []
        for staff_id, unit_id in CHAR_INIT_STAFFS:
            uid = sm.add(staff_id, send_notify=False, trig_signal=False)
            formation_init_data.append((uid, unit_id))

        fm = Formation(server_id, char_id)
        fm.initialize(formation_init_data)

        MongoCharacter.db(server_id).insert_one(doc)

        # add welfare mail
        start_time = get_start_time_of_today()
        condition = Q(send_at__gte=start_time.format("YYYY-MM-DD HH:mm:ssZ")) &\
                    Q(send_at__lte=arrow.utcnow().format("YYYY-MM-DD HH:mm:ssZ"))
        mails = ModelMail.objects.filter(condition)

        m = MailManager(server_id, char_id)
        for m_obj in mails:
            if not m_obj.welfare:
                continue

            ok = False
            if m_obj.condition_type == 1:
                ok = True
            elif m_obj.condition_type == 2 and server_id in m_obj.get_parsed_condition_value():
                ok = True
            elif m_obj.condition_type == 3 and server_id not in m_obj.get_parsed_condition_value():
                ok = True

            if not ok:
                continue

            if m_obj.items:
                rc = ResourceClassification.classify(m_obj.get_parsed_items())
                attachment = rc.to_json()
            else:
                attachment = ""

            m.add(m_obj.title, m_obj.content, attachment=attachment, send_notify=False)
Пример #4
0
 def test_start_in_exping(self):
     MongoCharacter.db(1).update_one({'_id': 1}, {'$set': {'club.gold': 1000000}})
     TrainingExp(1, 1).start(1, self.staff_id)
     try:
         TrainingShop(1, 1).start(1, self.staff_id)
     except GameException as e:
         assert e.error_id == ConfigErrorMessage.get_error_id("TRAINING_DOING_EXP")
     else:
         raise Exception('Error')
Пример #5
0
def set_start_needed(training_id):
    conf = ConfigTrainingProperty.get(training_id)
    BagItem(1, 1).add(conf.need_items)

    if conf.cost_type == 1:
        needs = {'club.gold': conf.cost_value}
    else:
        needs = {'club.diamond': conf.cost_value}

    MongoCharacter.db(1).update_one({'_id': 1}, {'$set': needs}, upsert=True)
Пример #6
0
    def send(self, to_id, content):
        # 聊天
        to_id = int(to_id)
        target_doc = MongoCharacter.db(self.server_id).find_one({'_id': to_id}, {'_id': 1})
        if not target_doc:
            raise GameException(ConfigErrorMessage.get_error_id("CHAR_NOT_EXIST"))

        self_doc = MongoCharacter.db(self.server_id).find_one({'_id': self.char_id}, {'name': 1})

        title = u"来自 {0} 的邮件".format(self_doc['name'])
        MailManager(self.server_id, to_id).add(title, content, from_id=self.char_id)
Пример #7
0
 def test_start_gold_not_enough(self):
     MongoCharacter.db(1).update_one(
         {'_id': 1},
         {'$set': {'club.gold': 0}}
     )
     MongoTrainingExp.db(1).delete_one({'_id': 1})
     try:
         TrainingExp(1, 1).start(1, int(self.staff_id))
     except GameException as e:
         assert e.error_id == ConfigErrorMessage.get_error_id("GOLD_NOT_ENOUGH")
     else:
         raise Exception('error')
Пример #8
0
 def test_start_in_exping(self):
     MongoCharacter.db(1).update_one({'_id': 1},
                                     {'$set': {
                                         'club.gold': 1000000
                                     }})
     TrainingExp(1, 1).start(1, self.staff_id)
     try:
         TrainingShop(1, 1).start(1, self.staff_id)
     except GameException as e:
         assert e.error_id == ConfigErrorMessage.get_error_id(
             "TRAINING_DOING_EXP")
     else:
         raise Exception('Error')
Пример #9
0
    def test_speedup(self):
        TrainingBroadcast(1, 1).start(1, self.staff_id)
        import formula
        diamonds = formula.training_speedup_need_diamond(BROADCAST_TOTAL_SECONDS)
        MongoCharacter.db(1).update_one(
            {'_id': 1},
            {'$set': {'club.diamond': diamonds}},
            upsert=True
        )
        TrainingBroadcast(1, 1).speedup(1)

        data = MongoTrainingBroadcast.db(1).find_one({'_id': 1}, {'slots.{0}'.format(1): 1})
        assert data['slots'][str(1)]['gold'] > -1
Пример #10
0
def set_start_needed(training_id):
    conf = ConfigTrainingProperty.get(training_id)
    BagItem(1, 1).add(conf.need_items)

    if conf.cost_type == 1:
        needs = {'club.gold': conf.cost_value}
    else:
        needs = {'club.diamond': conf.cost_value}

    MongoCharacter.db(1).update_one(
        {'_id': 1},
        {'$set': needs},
        upsert=True
    )
Пример #11
0
    def test_speedup(self):
        TrainingBroadcast(1, 1).start(1, self.staff_id)
        import formula
        diamonds = formula.training_speedup_need_diamond(
            BROADCAST_TOTAL_SECONDS)
        MongoCharacter.db(1).update_one({'_id': 1},
                                        {'$set': {
                                            'club.diamond': diamonds
                                        }},
                                        upsert=True)
        TrainingBroadcast(1, 1).speedup(1)

        data = MongoTrainingBroadcast.db(1).find_one(
            {'_id': 1}, {'slots.{0}'.format(1): 1})
        assert data['slots'][str(1)]['gold'] > -1
Пример #12
0
        def _query_real(_level_low, _level_high):
            _skip_char_ids = [_s['id'] for _s in self.doc['search']]
            _skip_char_ids.append(self.char_id)

            _condition = {
                '$and': [{
                    '_id': {
                        '$nin': _skip_char_ids
                    }
                }, {
                    'level': {
                        '$gte': _level_low
                    }
                }, {
                    'level': {
                        '$lte': _level_high
                    }
                }]
            }

            _docs = MongoCharacter.db(self.server_id).find(
                _condition, {'_id': 1})
            _ids = []
            for _doc in _docs:
                _ids.append(_doc['_id'])

            return _ids
Пример #13
0
        def query(level_range):
            if level_range is not None:
                min_level = level - level_range
                if min_level < 1:
                    min_level = 1

                max_level = level + level_range

                condition = {
                    '$and': [{
                        'level': {
                            '$gte': min_level
                        }
                    }, {
                        'level': {
                            '$lte': max_level
                        }
                    }]
                }
            else:
                condition = {}

            other_doc = MongoCharacter.db(self.server_id).find(
                condition, {'_id': 1})

            _candidate_ids = []
            for d in other_doc:
                if d['_id'] != self.char_id and str(
                        d['_id']) not in friend_doc['friends']:
                    _candidate_ids.append(d['_id'])

            return _candidate_ids
Пример #14
0
    def add(self, name):
        doc = MongoCharacter.db(self.server_id).find_one({'name': name}, {'_id': 1})
        if not doc:
            raise GameException(ConfigErrorMessage.get_error_id("CHAR_NOT_EXIST"))

        char_id = doc['_id']
        key = 'friends.{0}'.format(char_id)

        doc = MongoFriend.db(self.server_id).find_one({'_id': self.char_id}, {key: 1})
        status = doc['friends'].get(str(char_id), FRIEND_STATUS_NOT)

        if status == FRIEND_STATUS_OK:
            raise GameException(ConfigErrorMessage.get_error_id("FRIEND_ALREADY_IS_FRIEND"))

        if status == FRIEND_STATUS_PEER_CONFIRM:
            raise GameException(ConfigErrorMessage.get_error_id("FRIEND_ADD_REQUEST_ALREADY_SENT"))

        if status == FRIEND_STATUS_SELF_CONFIRM:
            # 要添加的是,需要自己确认的,也就是对方也想添加我。那么就直接成为好友
            self.accept(char_id, verify=False)
            return

        MongoFriend.db(self.server_id).update_one(
            {'_id': self.char_id},
            {'$set': {key: FRIEND_STATUS_PEER_CONFIRM}}
        )

        self.send_notify(ids=[char_id])
        FriendManager(self.server_id, char_id).someone_add_me(self.char_id)
Пример #15
0
    def __init__(self, server_id, char_id, load_staffs=True):
        super(Club, self).__init__()

        self.server_id = server_id
        self.char_id = char_id

        doc = MongoCharacter.db(self.server_id).find_one({'_id': self.char_id})
        assert doc is not None, "can not find char_id: {0}".format(self.char_id)

        self.id = self.char_id  # 玩家ID
        self.name = doc['name']  # 俱乐部名
        self.flag = doc['flag']  # 俱乐部旗帜
        self.level = doc['level']  # 俱乐部等级
        self.exp = doc['exp']
        self.gold = doc['gold']  # 游戏币
        self.diamond = doc['diamond']  # 钻石
        self.renown = doc['renown']

        self.crystal = doc['crystal']
        self.gas = doc['gas']

        self.last_login = doc['last_login']
        self.create_at = doc['create_at']

        if load_staffs:
            self.load_staffs()
Пример #16
0
    def test_get_reward(self):
        TrainingBroadcast(1, 1).start(1, int(self.staff_id))
        TrainingBroadcast(1, 1).callback(1)
        TrainingBroadcast(1, 1).get_reward(1)

        data = MongoCharacter.db(1).find_one({'_id': 1}, {'club.gold'.format(self.staff_id): 1})
        assert data['club']['gold'] > 0
Пример #17
0
def get_club_property(server_id, char_id, key, default_value=0):
    doc = MongoCharacter.db(server_id).find_one(
        {'_id': char_id},
        {key: 1}
    )

    return doc.get(key, default_value)
Пример #18
0
    def query_char_ids(cls, server_id, min_level=None, login_range=None):
        # 根据各种条件查询
        result_list = []

        if min_level:
            docs = MongoCharacter.db(server_id).find({'level': {'$gte': min_level}}, {'_id': 1})
            char_ids_1 = [d['_id'] for d in docs]

            result_list.append(char_ids_1)

        if login_range:
            condition = {'$and': [
                {'timestamp': {'$gte': login_range[0]}},
                {'timestamp': {'$lte': login_range[1]}}
            ]}

            char_ids_2 = MongoCharacterLoginLog.db(server_id).distinct(
                'char_id',
                condition
            )

            result_list.append(char_ids_2)

        if not result_list:
            raise RuntimeError("Club.query_char_ids with no condition")

        result = set(result_list[0])
        for i in range(1, len(result_list)):
            result &= set(result_list[i])

        return list(result)
Пример #19
0
    def add(self, name):
        doc = MongoCharacter.db(self.server_id).find_one({'name': name},
                                                         {'_id': 1})
        if not doc:
            raise GameException(
                ConfigErrorMessage.get_error_id("CHAR_NOT_EXIST"))

        char_id = doc['_id']
        key = 'friends.{0}'.format(char_id)

        doc = MongoFriend.db(self.server_id).find_one({'_id': self.char_id},
                                                      {key: 1})
        status = doc['friends'].get(str(char_id), FRIEND_STATUS_NOT)

        if status == FRIEND_STATUS_OK:
            raise GameException(
                ConfigErrorMessage.get_error_id("FRIEND_ALREADY_IS_FRIEND"))

        if status == FRIEND_STATUS_PEER_CONFIRM:
            raise GameException(
                ConfigErrorMessage.get_error_id(
                    "FRIEND_ADD_REQUEST_ALREADY_SENT"))

        if status == FRIEND_STATUS_SELF_CONFIRM:
            # 要添加的是,需要自己确认的,也就是对方也想添加我。那么就直接成为好友
            self.accept(char_id, verify=False)
            return

        MongoFriend.db(self.server_id).update_one(
            {'_id': self.char_id}, {'$set': {
                key: FRIEND_STATUS_PEER_CONFIRM
            }})

        self.send_notify(ids=[char_id])
        FriendManager(self.server_id, char_id).someone_add_me(self.char_id)
Пример #20
0
        def query(level_range):
            if level_range is not None:
                min_level = level - level_range
                if min_level < 1:
                    min_level = 1

                max_level = level + level_range

                condition = {
                    '$and': [
                        {'level': {'$gte': min_level}},
                        {'level': {'$lte': max_level}}
                    ]
                }
            else:
                condition = {}

            other_doc = MongoCharacter.db(self.server_id).find(
                condition,
                {'_id': 1}
            )

            _candidate_ids = []
            for d in other_doc:
                if d['_id'] != self.char_id and str(d['_id']) not in friend_doc['friends']:
                    _candidate_ids.append(d['_id'])

            return _candidate_ids
Пример #21
0
    def test_speedup(self):
        training_id = get_one_available_training(1)

        for i in range(PROPERTY_TRAINING_SLOTS_AMOUNT):
            set_start_needed(training_id)
            TrainingProperty(1, 1).start(self.staff_id, training_id)

        import formula
        need_diamond = formula.training_speedup_need_diamond(ConfigTrainingProperty.get(training_id).minutes * 60)

        MongoCharacter.db(1).update_one(
            {'_id': 1},
            {'$set': {'club.diamond': need_diamond}},
            upsert=True
        )
        TrainingProperty(1, 1).speedup(self.staff_id, 1)
Пример #22
0
    def test_speedup(self):
        training_id = get_one_available_training(1)

        for i in range(PROPERTY_TRAINING_SLOTS_AMOUNT):
            set_start_needed(training_id)
            TrainingProperty(1, 1).start(self.staff_id, training_id)

        import formula
        need_diamond = formula.training_speedup_need_diamond(
            ConfigTrainingProperty.get(training_id).minutes * 60)

        MongoCharacter.db(1).update_one(
            {'_id': 1}, {'$set': {
                'club.diamond': need_diamond
            }}, upsert=True)
        TrainingProperty(1, 1).speedup(self.staff_id, 1)
Пример #23
0
    def create_days(cls, server_id, char_id):
        # 从创建到现在是第几天。 从1开始
        doc = MongoCharacter.db(server_id).find_one(
            {'_id': char_id},
            {'create_at': 1}
        )

        return days_passed(doc['create_at'])
Пример #24
0
    def test_start(self):
        MongoTrainingExp.db(1).delete_one({'_id': 1})
        TrainingExp(1, 1).start(1, int(self.staff_id))

        data = MongoTrainingExp.db(1).find_one({'_id': 1}, {'slots.{0}'.format(1): 1})
        assert data['slots']['1']['staff_id'] == int(self.staff_id)
        gold = MongoCharacter.db(1).find_one({'_id': 1}, {'club.gold': 1})
        assert gold['club']['gold'] == 0
Пример #25
0
    def test_speedup(self):
        TrainingExp(1, 1).start(1, int(self.staff_id))
        TrainingExp(1, 1).speedup(1)

        data = MongoTrainingExp.db(1).find_one({'_id': 1}, {'slots.{0}'.format(1): 1})
        assert data['slots'][str(1)]['exp'] >= -1
        gold = MongoCharacter.db(1).find_one({'_id': 1}, {'club.gold': 1})
        assert gold['club']['gold'] == 0
Пример #26
0
    def test_get_reward(self):
        TrainingBroadcast(1, 1).start(1, int(self.staff_id))
        TrainingBroadcast(1, 1).callback(1)
        TrainingBroadcast(1, 1).get_reward(1)

        data = MongoCharacter.db(1).find_one(
            {'_id': 1}, {'club.gold'.format(self.staff_id): 1})
        assert data['club']['gold'] > 0
Пример #27
0
    def test_join_cup(self):
        """
        测试时注意修改报名时间
        """
        Cup(self.server_id, self.char_id).join_cup()

        doc = MongoCharacter.db(self.server_id).find_one({'_id': self.char_id}, {'in_cup': 1})
        assert doc['in_cup']
Пример #28
0
    def test_upgrade_speedup(self):
        skills = SkillManager(1, 1).get_staff_skills(self.staff_id)
        skill_id = random.choice(skills.keys())
        config = ConfigSkill.get(int(skill_id))

        need_id, need_amount = config.get_upgrade_needs(skills[str(skill_id)]['level']+1)
        BagTrainingSkill(1, 1).add([(need_id, need_amount)])

        MongoCharacter.db(1).update_one(
            {'_id': 1},
            {'$set': {'club.diamond': 10000}}
        )

        SkillManager(1, 1).upgrade(self.staff_id, int(skill_id))
        SkillManager(1, 1).upgrade_speedup(self.staff_id, int(skill_id))

        skills_after = SkillManager(1, 1).get_staff_skills(self.staff_id)
        assert skills_after[str(skill_id)]['level'] == skills[str(skill_id)]['level']+1
Пример #29
0
    def test_wash_with_lock(self):
        skills = SkillManager(1, 1).get_staff_skills(self.staff_id)
        sid = random.choice(skills.keys())

        SkillManager(1, 1).lock_toggle(self.staff_id, int(sid))
        cost = ConfigSkillWashCost.get_cost(1)

        MongoCharacter.db(1).update_one(
            {'_id': 1},
            {'$set': {'club.diamond': abs(cost['diamond'])}}
        )

        SkillManager(1, 1).wash(self.staff_id)

        new_skills = SkillManager(1, 1).get_staff_skills(self.staff_id)
        print 'new_skills:', new_skills.keys()
        print 'old_skills:', skills.keys()
        assert sid in new_skills
Пример #30
0
def setup():
    import os
    os.environ['DIANJING_TEST'] = '1'

    import dianjing.wsgi

    teardown()

    from core.mongo import MongoCharacter
    from core.character import Character
    Character.create(1, 1, "one", "club_one", 1)
    MongoCharacter.db(1).update_one(
        {'_id': 1},
        {'$set': {
            'club.gold': 0,
            'club.diamond': 0
        }}
    )
Пример #31
0
    def days_since_last_login(cls, server_id, char_id):
        # 从最近一次登陆 到现在已经过了多少天
        doc = MongoCharacter.db(server_id).find_one(
            {'_id': char_id},
            {'last_login': 1}
        )

        last_login = arrow.get(doc['last_login']).to(settings.TIME_ZONE)
        now = arrow.utcnow().to(settings.TIME_ZONE)
        days = (now.date() - last_login.date()).days
        return days
Пример #32
0
def batch_get_club_property(server_id, ids, key, default_value=0):
    docs = MongoCharacter.db(server_id).find(
        {'_id': {'$in': ids}},
        {key: 1}
    )

    result = {}
    for doc in docs:
        result[doc['_id']] = doc.get(key, default_value)

    return result
Пример #33
0
    def set_login(self):
        from django.db.models import F
        from apps.character.models import Character as ModelCharacter

        now = arrow.utcnow()
        ModelCharacter.objects.filter(id=self.char_id).update(
            last_login=now.format("YYYY-MM-DD HH:mm:ssZ"),
            login_times=F('login_times') + 1,
        )
        MongoCharacter.db(self.server_id).update_one(
            {'_id': self.char_id},
            {'$set': {'last_login': now.timestamp}}
        )

        login_doc = MongoCharacterLoginLog.document()
        login_doc['_id'] = make_string_id()
        login_doc['char_id'] = self.char_id
        login_doc['timestamp'] = now.timestamp

        MongoCharacterLoginLog.db(self.server_id).insert_one(login_doc)
Пример #34
0
    def get_candidates(self):
        char_doc = MongoCharacter.db(self.server_id).find_one(
            {'_id': self.char_id}, {'level': 1})

        level = char_doc['level']

        friend_doc = MongoFriend.db(self.server_id).find_one(
            {'_id': self.char_id})

        def query(level_range):
            if level_range is not None:
                min_level = level - level_range
                if min_level < 1:
                    min_level = 1

                max_level = level + level_range

                condition = {
                    '$and': [{
                        'level': {
                            '$gte': min_level
                        }
                    }, {
                        'level': {
                            '$lte': max_level
                        }
                    }]
                }
            else:
                condition = {}

            other_doc = MongoCharacter.db(self.server_id).find(
                condition, {'_id': 1})

            _candidate_ids = []
            for d in other_doc:
                if d['_id'] != self.char_id and str(
                        d['_id']) not in friend_doc['friends']:
                    _candidate_ids.append(d['_id'])

            return _candidate_ids

        candidate_ids = query(10)
        if len(candidate_ids) < FRIEND_CANDIDATES_AMOUNT:
            candidate_ids = query(30)
            if len(candidate_ids) < FRIEND_CANDIDATES_AMOUNT:
                candidate_ids = query(None)

        if len(candidate_ids) > FRIEND_CANDIDATES_AMOUNT:
            candidate_ids = random.sample(candidate_ids,
                                          FRIEND_CANDIDATES_AMOUNT)

        return candidate_ids
Пример #35
0
    def get_recent_login_char_ids(cls, server_id, recent_days=14, other_conditions=None):
        day_limit = arrow.utcnow().replace(days=-recent_days)
        timestamp = day_limit.timestamp

        condition = {'last_login': {'$gte': timestamp}}
        if other_conditions:
            condition = [condition]
            condition.extend(other_conditions)
            condition = {'$and': condition}

        doc = MongoCharacter.db(server_id).find(condition, {'_id': 1})
        for d in doc:
            yield d['_id']
Пример #36
0
def get_total_property(server_id, key):
    q = MongoCharacter.db(server_id).aggregate([
        {'$group': {
            '_id': 'null',
            'total': {'$sum': '$' + key}
        }}
    ])

    q = list(q)
    if not q:
        return 0

    return q[0]['total']
Пример #37
0
    def get_candidates(self):
        char_doc = MongoCharacter.db(self.server_id).find_one(
            {'_id': self.char_id},
            {'level': 1}
        )

        level = char_doc['level']

        friend_doc = MongoFriend.db(self.server_id).find_one(
            {'_id': self.char_id}
        )

        def query(level_range):
            if level_range is not None:
                min_level = level - level_range
                if min_level < 1:
                    min_level = 1

                max_level = level + level_range

                condition = {
                    '$and': [
                        {'level': {'$gte': min_level}},
                        {'level': {'$lte': max_level}}
                    ]
                }
            else:
                condition = {}

            other_doc = MongoCharacter.db(self.server_id).find(
                condition,
                {'_id': 1}
            )

            _candidate_ids = []
            for d in other_doc:
                if d['_id'] != self.char_id and str(d['_id']) not in friend_doc['friends']:
                    _candidate_ids.append(d['_id'])

            return _candidate_ids

        candidate_ids = query(10)
        if len(candidate_ids) < FRIEND_CANDIDATES_AMOUNT:
            candidate_ids = query(30)
            if len(candidate_ids) < FRIEND_CANDIDATES_AMOUNT:
                candidate_ids = query(None)

        if len(candidate_ids) > FRIEND_CANDIDATES_AMOUNT:
            candidate_ids = random.sample(candidate_ids, FRIEND_CANDIDATES_AMOUNT)

        return candidate_ids
Пример #38
0
    def setup_class(cls):
        MongoCharacter.db(1).update_one({'_id': 1},
                                        {'$set': {
                                            'club.level': 10
                                        }})

        doc = MongoStaff.db(1).find_one({'_id': 1}, {'staffs': 1})
        staff_ids = random.sample(ConfigStaff.INSTANCES.keys(), 15)
        for i in staff_ids:
            if str(i) not in doc['staffs']:
                StaffManger(1, 1).add(i)

        match_staff_ids = []
        for k in doc['staffs'].keys():
            match_staff_ids.append(int(k))

        for staff_id in staff_ids:
            if staff_id not in match_staff_ids:
                match_staff_ids.append(staff_id)

        Club(1, 1).set_match_staffs(random.sample(match_staff_ids, 10))

        LeagueGame.new(1)
Пример #39
0
    def setup_class(cls):
        MongoCharacter.db(1).update_one(
            {'_id': 1},
            {'$set': {'club.level': 10}}
        )

        doc = MongoStaff.db(1).find_one({'_id': 1}, {'staffs': 1})
        staff_ids = random.sample(ConfigStaff.INSTANCES.keys(), 15)
        for i in staff_ids:
            if str(i) not in doc['staffs']:
                StaffManger(1, 1).add(i)

        match_staff_ids = []
        for k in doc['staffs'].keys():
            match_staff_ids.append(int(k))

        for staff_id in staff_ids:
            if staff_id not in match_staff_ids:
                match_staff_ids.append(staff_id)

        Club(1, 1).set_match_staffs(random.sample(match_staff_ids, 10))

        LeagueGame.new(1)
Пример #40
0
        def _query_real(_level_low, _level_high):
            _skip_char_ids = [_s['id'] for _s in self.doc['search']]
            _skip_char_ids.append(self.char_id)

            _condition = {'$and': [
                {'_id': {'$nin': _skip_char_ids}},
                {'level': {'$gte': _level_low}},
                {'level': {'$lte': _level_high}}
            ]}

            _docs = MongoCharacter.db(self.server_id).find(_condition, {'_id': 1})
            _ids = []
            for _doc in _docs:
                _ids.append(_doc['_id'])

            return _ids
Пример #41
0
    def find_applied_clubs(cls, server_id):
        docs = MongoChampionship.db(server_id).find({'applied': True},
                                                    {'_id': 1})

        club_ids = [doc['_id'] for doc in docs]
        club_ids = set(club_ids)

        vip_ids = VIP.query_char_ids(server_id, min_level=AUTO_APPLY_VIP_LEVEL)

        if vip_ids:
            club_docs = MongoCharacter.db(server_id).find(
                {'_id': {
                    '$in': vip_ids
                }}, {'level': 1})

            for doc in club_docs:
                if doc['level'] >= APPLY_CLUB_LEVEL_LIMIT:
                    club_ids.add(doc['_id'])

        return list(club_ids)
Пример #42
0
    def command(self, tp, data):
        from core.challenge import Challenge

        if tp == ChatSendRequest.ADD_ITEM:
            items = []
            try:
                for x in data.split(';'):
                    if not x or x == '\n' or x == '\r\n':
                        continue

                    _id, _amount = x.split(',')
                    items.append((int(_id), int(_amount)))

                resource_classified = ResourceClassification.classify(items)
                for _id, _amount in resource_classified.staff:
                    # GM命令可能会添加大量的staff, 这是错误情况
                    assert _amount < 1000
            except:
                raise GameException(ConfigErrorMessage.get_error_id("BAD_MESSAGE"))

            resource_classified.add(self.server_id, self.char_id, message="Chat.command")

        elif tp == ChatSendRequest.SET_MONEY:
            setter = {}
            for x in data.split(";"):
                _id, _amount = x.split(',')
                name = item_id_to_money_text(int(_id))

                setter[name] = int(_amount)

            MongoCharacter.db(self.server_id).update_one(
                {'_id': self.char_id},
                {'$set': setter}
            )

            Club(self.server_id, self.char_id).send_notify()

        elif tp == ChatSendRequest.SET_CLUB_LEVEL:
            try:
                level = int(data)
            except ValueError:
                raise GameException(ConfigErrorMessage.get_error_id("BAD_MESSAGE"))

            MongoCharacter.db(self.server_id).update_one(
                {'_id': self.char_id},
                {'$set': {
                    'level': level
                }}
            )

            Club(self.server_id, self.char_id).send_notify()
        elif tp == ChatSendRequest.OPEN_ALL_CHALLENGE:
            Challenge(self.server_id, self.char_id).open_all()
        elif tp == ChatSendRequest.TEST_PURCHASE:
            try:
                goods_id = int(data)
            except ValueError:
                raise GameException(ConfigErrorMessage.get_error_id("BAD_MESSAGE"))

            Purchase(self.server_id, self.char_id).send_reward(goods_id)

        else:
            raise GameException(ConfigErrorMessage.get_error_id("BAD_MESSAGE"))
Пример #43
0
    def normal_chat(self, channel, text):
        from tasks import world

        char_doc = MongoCharacter.db(self.server_id).find_one(
            {'_id': self.char_id},
            {'name': 1, 'vip': 1, 'level': 1}
        )

        union_id = 0
        if channel == CHAT_CHANNEL_PUBLIC:
            if char_doc['level'] < GlobalConfig.value("CHAT_LEVEL_LIMIT"):
                raise GameException(ConfigErrorMessage.get_error_id("CHAT_LEVEL_NOT_ENOUGH"))

            if ChatCD(self.server_id, self.char_id).get_cd_seconds():
                raise GameException(ConfigErrorMessage.get_error_id("CHAT_TOO_FAST"))

            if len(text) > CHAT_MAX_SIZE:
                raise GameException(ConfigErrorMessage.get_error_id("CHAT_TOO_LARGE"))

            ChatCD(self.server_id, self.char_id).set(GlobalConfig.value("CHAT_CD"))

        elif channel == CHAT_CHANNEL_UNION:
            union_id = Union(self.server_id, self.char_id).get_joined_union_id()
            if not union_id:
                raise GameException(ConfigErrorMessage.get_error_id("UNION_CHAT_NO_UNION"))
        else:
            raise GameException(ConfigErrorMessage.get_error_id("BAD_MESSAGE"))

        # 创建一个消息
        msg = ChatMessage()
        msg.channel = channel
        msg.club.id = str(self.char_id)
        msg.club.name = char_doc['name']
        msg.club.vip = VIP(self.server_id, self.char_id).level
        msg.msg = text
        data = base64.b64encode(msg.SerializeToString())

        # 立即通知自己
        notify = ChatNotify()
        notify.act = ACT_UPDATE
        notify_msg = notify.msgs.add()
        notify_msg.MergeFrom(msg)

        notify_bin = MessageFactory.pack(notify)
        MessagePipe(self.char_id).put(data=notify_bin)

        # 放入公共空间,让后面登陆的人都能看到
        # 等于离线消息
        if channel == CHAT_CHANNEL_PUBLIC:
            CommonPublicChat(self.server_id).push(data, slice_amount=20)
            # 给其他人广播通知
            arg = {
                'server_id': self.server_id,
                'exclude_chars': [self.char_id],
                'data': MessageFactory.pack(notify)
            }

            payload = cPickle.dumps(arg)
            world.broadcast(payload=payload)
        else:
            CommonUnionChat(self.server_id, union_id).push(data, slice_amount=20)
            arg = {
                'server_id': self.server_id,
                'exclude_chars': [self.char_id],
                'data': MessageFactory.pack(notify),
                'char_id': self.char_id
            }

            payload = cPickle.dumps(arg)
            world.broadcast_union_chat(payload=payload)

        chat_signal.send(
            sender=None,
            server_id=self.server_id,
            char_id=self.char_id
        )