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