def _calc_respond(self, data, req, timer): """援助 """ if not data.is_valid(): #联盟不存在 res = self._pack_respond_response_invalid(union_pb2.UNION_NOT_MATCHED) return self._respond_succeed(data, req, res, timer) member = member_business.find_member(data, req.user_id) target_member = member_business.find_member(data, req.target_user_id) if member is None: res = self._pack_respond_response_invalid(union_pb2.UNION_MEMBER_INVALID) elif target_member is None: res = self._pack_respond_response_invalid(union_pb2.UNION_AID_INVALID) else: aid = aid_business.respond_aid( data, member, target_member, req.item_basic_id, timer.now) if aid is None: res = self._pack_respond_response_invalid(union_pb2.UNION_AID_INVALID) else: res = self._pack_respond_response(aid, req.user_id) defer = DataBase().commit(data) defer.addCallback(self._respond_succeed, req, res, timer) return defer
def _calc_query_boss_reward(self, data, req, timer): res = internal_union_pb2.InternalUnionBossBossRewardRes() res.status = 0 member = member_business.find_member(data, req.user_id) union = data.union.get() if member is None: res.ret = union_pb2.UNION_NOT_MATCHED return self._query_boss_reward_succeed(data, req, res, timer) boss_id = union.get_bosses_id()[req.boss_step] boss = boss_business.get_union_boss(data, boss_id) if boss is None: raise Exception("Boss is None[boss_id=%d]" % boss_id) reward_record = boss.get_reward_record() res.box.id = req.boss_step for user_id, user_name, icon_id, item_id, item_num, time in reward_record: member = res.box.members.add() member.user_id = user_id member.name = user_name member.headIconId = icon_id member.item_id = item_id member.item_num = item_num member.passedTime = timer.now - time return self._query_boss_reward_succeed(data, req, res, timer)
def _calc_query(self, data, req, timer, force): """ """ if not data.is_valid(): #联盟不存在 res = self._pack_invalid_query_response( union_pb2.UNION_NOT_MATCHED) return self._query_succeed(data, req, res, timer) #检查是否是联盟成员 member = member_business.find_member(data, req.user_id) if member is None: #玩家已经不属于此联盟 if force: res = self._pack_query_response(data, req.user_id, timer) else: res = self._pack_invalid_query_response( union_pb2.UNION_NOT_MATCHED) elif member.is_leader() or member.is_vice_leader(): #盟主和副盟主 member_business.delete_not_available_application(data, timer.now) res = self._pack_query_response(data, req.user_id, timer, True) else: #普通成员 res = self._pack_query_response(data, req.user_id, timer) defer = DataBase().commit(data) defer.addCallback(self._query_succeed, req, res, timer) return defer
def _kickout(self, data, member, target_user_id, timer): """踢人 """ target_member = member_business.find_member(data, target_user_id) if target_member is None: logger.debug("User is not belong to union") return self._pack_manage_response(union_pb2.UNION_MEMBER_INVALID) if member.user_id == target_user_id: #任何人都不能踢自己 logger.debug("User is not belong to union") return self._pack_manage_response(union_pb2.UNION_NO_AUTH) elif member.is_normal_member(): #成员不能踢人 return self._pack_manage_response(union_pb2.UNION_NO_AUTH) elif member.is_vice_leader() and not target_member.is_normal_member(): #副盟主只可以踢成员 return self._pack_manage_response(union_pb2.UNION_NO_AUTH) union = data.union.get() member_business.leave_union(data, target_member) app_req = internal_union_pb2.InternalUnionOperateReq() app_req.operator_user_id = member.user_id app_req.union_name = union.get_readable_name() app_req.union_id = union.id defer = GlobalObject().remote['app'].callRemote( "been_kickout_from_union", target_user_id, app_req.SerializeToString()) defer.addCallback(self._post_kickout, data, timer) return defer
def _calc_start(self, data, req, timer): res = internal_union_pb2.InternalStartUnionDonateRes() res.status = 0 if not data.is_valid(): res.ret = union_pb2.UNION_NOT_MATCHED return self._start_succeed(data, req, res, timer) member = member_business.find_member(data, req.user_id) if member is None: res.ret = union_pb2.UNION_NOT_MATCHED return self._start_succeed(data, req, res, timer) if not donate_business.is_able_to_start_donate(data, req.box_id, timer): res.ret = union_pb2.UNION_DONATE_BOX_INVALID else: (honor, donate_box) = donate_business.start_donate( data, req.box_id, req.user_id, req.user_name, req.donate_type, timer) res.ret = union_pb2.UNION_OK res.honor = honor pack.pack_donate_box_info(data, req.user_id, donate_box, res.box_info, timer) donate_records = donate_business.get_donate_records(data) for donate_record in donate_records: pack.pack_donate_record_info(donate_record, res.donate_records.add()) defer = DataBase().commit(data) defer.addCallback(self._start_succeed, req, res, timer) return defer
def _calc_refresh(self, data, req, timer): res = internal_union_pb2.InternalRefreshBoxRes() res.status = 0 if not data.is_valid(): res.ret = union_pb2.UNION_NOT_MATCHED return self._refresh_succeed(data, req, res, timer) member = member_business.find_member(data, req.user_id) if member is None: res.ret = union_pb2.UNION_NOT_MATCHED return self._refresh_succeed(data, req, res, timer) ret = donate_business.is_able_to_refresh_donate_box( data, req.box_id, req.user_id, timer) if ret != 0: res.ret = ret else: new_donate_box = donate_business.refresh_donate_box( data, req.box_id, timer) res.ret = union_pb2.UNION_OK pack.pack_donate_box_info(data, req.user_id, new_donate_box, res.box_info, timer) defer = DataBase().commit(data) defer.addCallback(self._refresh_succeed, req, res, timer) return defer
def _calc_query(self, data, req, timer): if not data.is_valid(): res = internal_union_pb2.InternalQueryUnionDonateRes() res.status = 0 res.ret = union_pb2.UNION_NOT_MATCHED return self._query_succeed(data, req, res, timer) member = member_business.find_member(data, req.user_id) if member is None: res = internal_union_pb2.InternalQueryUnionDonateRes() res.status = 0 res.ret = union_pb2.UNION_NOT_MATCHED else: donate_business.auto_refresh_donate_boxes(data, timer) res = internal_union_pb2.InternalQueryUnionDonateRes() res.status = 0 res.ret = union_pb2.UNION_OK donate_boxes = data.donate_box_list.get_all(True) for donate_box in donate_boxes: pack.pack_donate_box_info(data, req.user_id, donate_box, res.boxes_info.add(), timer) donate_records = donate_business.get_donate_records(data) for donate_record in donate_records: pack.pack_donate_record_info(donate_record, res.donate_records.add()) defer = DataBase().commit(data) defer.addCallback(self._query_succeed, req, res, timer) return defer
def _calc_approve(self, data, req, timer): """审批 """ if not data.is_valid(): #联盟不存在 res = self._pack_approve_response(union_pb2.UNION_NOT_MATCHED) return self._approve_succeed(data, req, res, timer) member = member_business.find_member(data, req.user_id) target_member = member_business.find_member(data, req.target_user_id) application = member_business.find_application(data, req.target_user_id, timer.now) if member is None: res = self._pack_approve_response(union_pb2.UNION_NOT_MATCHED) elif member.is_normal_member(): #普通成员没有权限 res = self._pack_approve_response(union_pb2.UNION_NO_AUTH) elif target_member is not None: #待审批玩家已经加入联盟 res = self._pack_approve_response(union_pb2.UNION_OK) elif application is None: #申请已经失效 res = self._pack_approve_response( union_pb2.UNION_APPLICATION_INVALID) elif not req.agree: #拒绝申请 member_business.disagree_application(data, application) res = self._pack_approve_response(union_pb2.UNION_OK) elif req.agree: #同意申请 union = data.union.get() if union.is_member_full(): #已满员,拒绝申请 member_business.disagree_application(data, application) res = self._pack_approve_response( union_pb2.UNION_APPLICATION_INVALID) else: return self._accept(data, member, application, req, timer) defer = DataBase().commit(data) defer.addCallback(self._approve_succeed, req, res, timer) return defer
def _calc_join(self, data, req, timer): """加入 """ if not data.is_valid(): #联盟不存在 res = self._pack_join_response_invalid( union_pb2.UNION_JOIN_INVALID) return self._join_succeed(data, req, res, timer) member = member_business.find_member(data, req.user_id) if member is not None: #已经加入此联盟 logger.debug("User is belong to union") res = self._pack_join_response(data, req.user_id, timer) else: union = data.union.get() if union.is_member_full(): #联盟已满员 logger.debug("Union is full") res = self._pack_join_response_invalid( union_pb2.UNION_JOIN_FULL) elif req.user_level < union.join_level_limit: #玩家等级不满足要求 logger.debug("User level is not satisfy") res = self._pack_join_response_invalid( union_pb2.UNION_JOIN_LEVEL_ERROR) elif union.join_status == union.JOIN_STATUS_DISABLE: #不允许加入 logger.debug("Union is disable join") res = self._pack_join_response_invalid( union_pb2.UNION_JOIN_INVALID) elif union.join_status == union.JOIN_STATUS_VERIFY: #需要验证,添加申请 logger.debug("Add join application") member_business.add_application( data, req.user_id, req.user_name, req.user_icon_id, req.user_level, req.user_battle_score, timer.now) res = self._pack_join_response_invalid( union_pb2.UNION_JOIN_WAIT_VERIFY) else: #允许加入,添加成员 if member_business.join_union(data, req.user_id, timer.now): res = self._pack_join_response(data, req.user_id, timer) else: res = self._pack_join_response_invalid( union_pb2.UNION_JOIN_INVALID) defer = DataBase().commit(data) defer.addCallback(self._join_succeed, req, res, timer) return defer
def is_able_to_initiate_donate(union_data, user_id, box_id, timer): """是否可以发起捐献""" member = member_business.find_member(union_data, user_id) donate_box = get_donate_box(union_data, box_id, True) if donate_box is None: return union_pb2.UNION_DONATE_BOX_INVALID is_leader = member.position != UnionMemberInfo.POSITION_MEMBER is_box_status = donate_box.get_status(timer.now) == UnionDonateBox.IDLE if not is_leader: return union_pb2.UNION_NO_AUTH if not is_box_status: return union_pb2.UNION_DONATE_BOX_INVALID return 0
def _calc_query(self, data, req, timer): res = internal_union_pb2.InternalQueryUnionBossRes() res.status = 0 res.ret = union_pb2.UNION_OK member = member_business.find_member(data, req.user_id) if member is None: res.ret = union_pb2.UNION_NOT_MATCHED return self._query_succeed(data, req, res, timer) boss_business.try_change_unionboss(data, timer.now) boss_business.try_reset_unionboss(data, timer.now) union = data.union.get(True) res.last_update_time = union.boss_last_update_time bosses_id = union.get_bosses_id() for boss_id in bosses_id: res.bosses_id.append(boss_id) boss_id = union.get_attacking_unionboss() if boss_id != 0: attack_boss = boss_business.get_union_boss(data, boss_id, True) res.attack_id = attack_boss.boss_id res.attack_soldier_num = attack_boss.current_soldier_num res.attack_total_soldier_num = attack_boss.total_soldier_num for step, boss_id in enumerate(bosses_id): box = res.boxes.add() boss = boss_business.get_union_boss(data, boss_id, True) if boss.status != UnionBossInfo.KILLED: box.id = -1 continue box.id = step reward_record = boss.get_reward_record() for user_id, user_name, icon_id, item_id, item_num, time in reward_record: member = box.members.add() member.user_id = user_id member.name = user_name member.headIconId = icon_id member.item_id = item_id member.item_num = item_num member.passedTime = timer.now - time defer = DataBase().commit(data) defer.addCallback(self._query_succeed, req, res, timer) return defer
def _calc_query(self, data, req, timer): """查询 """ if not data.is_valid(): #联盟不存在 res = self._pack_query_response_invalid(union_pb2.UNION_NOT_MATCHED) return self._query_succeed(data, req, res, timer) member = member_business.find_member(data, req.user_id) if member is None: res = self._pack_query_response_invalid(union_pb2.UNION_MEMBER_INVALID) else: res = self._pack_query_response(data, req.user_id, timer) defer = DataBase().commit(data) defer.addCallback(self._query_succeed, req, res, timer) return defer
def _calc_add_honor(self, data, req, timer): if not data.is_valid(): #联盟不存在 res = self._pack_add_honor_response(union_pb2.UNION_NOT_MATCHED) return self._add_honor_succeed(data, req, res, timer) member = member_business.find_member(data, req.user_id) if member is None: #已经不在此联盟中 logger.debug("User is not belong to union") res = self._pack_add_honor_response(union_pb2.UNION_NOT_MATCHED) else: member.gain_honor(req.honor) res = self._pack_add_honor_response(union_pb2.UNION_OK) defer = DataBase().commit(data) defer.addCallback(self._add_honor_succeed, req, res, timer) return defer
def _calc_manage(self, data, req, timer): if not data.is_valid(): #联盟不存在 res = self._pack_manage_response(union_pb2.UNION_NOT_MATCHED) return self._manage_succeed(data, req, res, timer) member = member_business.find_member(data, req.user_id) if member is None: if req.op == union_pb2.ManageUnionReq.DISMISSFORCE: self._pack_manage_response(union_pb2.UNION_OK) else: #玩家已经不属于联盟 logger.warning("Member is not exist") res = self._pack_manage_response(union_pb2.UNION_NOT_MATCHED) defer = DataBase().commit(data) defer.addCallback(self._manage_succeed, req, res, timer) return defer defer = Deferred() if req.op == union_pb2.ManageUnionReq.KICKOUT: defer.addCallback(self._kickout, member, req.target_user_id, timer) elif req.op == union_pb2.ManageUnionReq.PROMOTION: defer.addCallback(self._promotion, member, req.target_user_id, timer) elif req.op == union_pb2.ManageUnionReq.DEMOTION: defer.addCallback(self._demotion, member, req.target_user_id, timer) elif req.op == union_pb2.ManageUnionReq.DEMISE: defer.addCallback(self._demise, member, req.target_user_id, timer) elif req.op == union_pb2.ManageUnionReq.DISMISS: defer.addCallback(self._dismiss, member, timer) elif req.op == union_pb2.ManageUnionReq.DISMISSFORCE: defer.addCallback(self._dismiss, member, timer, True) elif req.op == union_pb2.ManageUnionReq.EXIT: defer.addCallback(self._exit, member, timer) else: raise Exception("Invalid operation[op=%d]" % req.op) defer.addCallback(self._post_manage, data, req, timer) defer.callback(data) return defer
def _calc_start_chat(self, data, req, timer): """ """ if not data.is_valid(): #联盟不存在 res = self._pack_invalid_start_chat_response( union_pb2.UNION_NOT_MATCHED) return self._start_chat_succeed(data, req, res, timer) #检查是否是联盟成员 member = member_business.find_member(data, req.user_id) if member is None: #玩家已经不属于此联盟 res = self._pack_invalid_start_chat_response( union_pb2.UNION_NOT_MATCHED) else: #普通成员 res = self._pack_start_chat_response(data) defer = DataBase().commit(data) defer.addCallback(self._start_chat_succeed, req, res, timer) return defer
def _calc_finish(self, data, req, timer): """结束 """ if not data.is_valid(): #联盟不存在 res = self._pack_finish_response_invalid(union_pb2.UNION_NOT_MATCHED) return self._finish_succeed(data, req, res, timer) member = member_business.find_member(data, req.user_id) if member is None: res = self._pack_finish_response_invalid(union_pb2.UNION_MEMBER_INVALID) else: aid = aid_business.finish_aid(data, req.user_id, timer.now) if aid is None: raise Exception("Finish union aid failed") res = self._pack_finish_response(aid, req.user_id) defer = DataBase().commit(data) defer.addCallback(self._finish_succeed, req, res, timer) return defer
def start_donate(union_data, box_id, user_id, user_name, donate_tpye, timer): """进行捐献""" (probability, honor, prosperity, progress) = get_donate_info_by_grade(box_id, donate_tpye) donate_box = get_donate_box(union_data, box_id) member = member_business.find_member(union_data, user_id) union = union_data.union.get() donate_box.gain_donate_progress(progress, timer.now) member.gain_honor(honor) union.gain_prosperity(prosperity, timer.now) #如果这次捐献导致宝箱捐满,就生成一个新宝箱 if donate_box.get_status(timer.now) == UnionDonateBox.UNLOCKED: new_donate_box = create_new_donate_box(union_data) add_donate_box(union_data, new_donate_box) add_donate_record( union_data, user_id, user_name, box_id, donate_tpye, honor, progress, prosperity) return honor, donate_box
def _do_calc_update(self, is_name_exist, data, req, timer): """更新 """ member = member_business.find_member(data, req.user_id) if member is None: #玩家已经不属于此联盟 res = self._pack_invalid_query_response( union_pb2.UNION_NOT_MATCHED) elif is_name_exist: #名字重复 logger.debug("Union name is conflict[name=%s]" % req.name) res = self._pack_invalid_query_response( union_pb2.UNION_NAME_CONFLICT) else: name = None icon_id = None need_level = None join_status = None announcement = None if req.HasField("name"): name = req.name if req.HasField("icon_id"): icon_id = req.icon_id if req.HasField("need_level"): need_level = req.need_level if req.HasField("join_status"): join_status = req.join_status if req.HasField("announcement"): announcement = req.announcement if union_business.update_union(data, member, name, icon_id, need_level, join_status, announcement): res = self._pack_query_response(data, req.user_id, timer, True) else: res = self._pack_invalid_query_response( union_pb2.UNION_NO_AUTH) defer = DataBase().commit(data) defer.addCallback(self._update_succeed, req, res, timer) return defer
def _demise(self, data, member, target_user_id, timer): """转让盟主 """ target_member = member_business.find_member(data, target_user_id) if target_member is None: return self._pack_manage_response(union_pb2.UNION_MEMBER_INVALID) if not member.is_leader() or member.user_id == target_user_id: #只有盟主可以操作,不能操作自己 return self._pack_manage_response(union_pb2.UNION_NO_AUTH) member_business.demise_leader(data, member, target_member) union = data.union.get(True) notice_content = data_loader.ServerDescKeyInfo_dict[ "union_promote_leader"].value.encode("utf-8") notice_content = notice_content.replace("@union_name", union.get_readable_name()) notice_content = notice_content.replace("@union_id", str(union.id)) self._manage_notice(target_user_id, notice_content) return self._pack_manage_response(union_pb2.UNION_OK)
def is_able_to_refresh_donate_box(union_data, box_id, user_id, timer): """是否可以刷新捐献箱""" member = member_business.find_member(union_data, user_id) donate_box = get_donate_box(union_data, box_id) if donate_box is None: return union_pb2.UNION_DONATE_BOX_INVALID if member is None: is_leader = False else: is_leader = member.position != UnionMemberInfo.POSITION_MEMBER is_box_status = donate_box.get_status(timer.now) == UnionDonateBox.IDLE is_refresh = donate_box.is_refresh(union_data, timer.now) if not is_leader: return union_pb2.UNION_NO_AUTH if not is_box_status: return union_pb2.UNION_DONATE_BOX_INVALID if not is_refresh: return union_pb2.UNION_DONATE_NO_CONDITION return 0
def _calc_boss_reward(self, data, req, timer): res = internal_union_pb2.InternalUnionBossBossRewardRes() res.status = 0 union = data.union.get() member = member_business.find_member(data, req.user_id) if member is None: res.ret = union_pb2.UNION_NOT_MATCHED return self._boss_reward_succeed(data, req, res, timer) boss_id = union.get_bosses_id()[req.boss_step] boss = boss_business.get_union_boss(data, boss_id) if boss is None: raise Exception("Boss is None[boss_id=%d]" % boss_id) if boss_business.is_able_to_accept_boss_reward(data, member, boss): logger.debug( "Accept boss box reward[union_id=%d][user_id=%d][boss_id=%d]" % (data.id, member.user_id, boss_id)) boss_business.accept_boss_reward(data, req.user_id, req.user_name, req.icon_id, boss, timer.now) else: logger.debug( "Query boss box reward[union_id=%d][user_id=%d][boss_id=%d]" % (data.id, member.user_id, boss_id)) reward_record = boss.get_reward_record() res.box.id = req.boss_step for user_id, user_name, icon_id, item_id, item_num, time in reward_record: member = res.box.members.add() member.user_id = user_id member.name = user_name member.headIconId = icon_id member.item_id = item_id member.item_num = item_num member.passedTime = timer.now - time defer = DataBase().commit(data) defer.addCallback(self._boss_reward_succeed, req, res, timer) return defer
def _pack_join_response(self, data, user_id, timer): res = internal_union_pb2.InternalQueryUnionRes() res.status = 0 res.ret = union_pb2.UNION_OK union = data.union.get(True) pack.pack_union_info(union, res.union) for member in data.member_list.get_all(True): pack.pack_member_info(member, res.union.members.add()) for aid in data.aid_list.get_all(True): if aid.is_active_for(data.id, timer.now): pack.pack_aid_info(aid, res.union.aids.add(), user_id, timer.now) #战争基础信息 season = data.season.get(True) battle = battle_business.update_battle(data, timer.now) pack.pack_battle_info(union, season, battle, res.union.battle, timer.now) #个人数据 member = member_business.find_member(data, user_id) pack.pack_battle_individual_info(member, res.union.battle.user) #己方防守地图信息 nodes = battle_business.get_battle_map(data) pack.pack_battle_map_info(union, season, battle, nodes, res.union.battle.own_map, timer.now) #战斗记录 records = data.battle_record_list.get_all(True) for record in records: pack.pack_battle_record_info(record, res.union.battle.records.add(), timer.now) return res
def _calc_reward(self, data, req, timer): res = internal_union_pb2.InternalGetBoxRewardRes() res.status = 0 if not data.is_valid(): res.ret = union_pb2.UNION_NOT_MATCHED return self._reward_succeed(data, req, res, timer) member = member_business.find_member(data, req.user_id) if member is None: res.ret = union_pb2.UNION_NOT_MATCHED return self._reward_succeed(data, req, res, timer) if not donate_business.is_able_to_reward_donate_box( data, req.box_id, timer): res.ret = union_pb2.UNION_DONATE_NO_CONDITION else: res.ret = union_pb2.UNION_OK pack.pack_donate_reward_info( UnionDonateBox.get_reward_item_list(req.box_id), UnionDonateBox.get_reward_resource_list(req.box_id), res.reward) defer = DataBase().commit(data) defer.addCallback(self._reward_succeed, req, res, timer) return defer
def _pack_query_response(self, data, user_id, timer, enable_application=False): """打包结果 Args: data: 联盟数据 user_id: 玩家 user id enable_application: 是否需要打包申请(盟主和副盟主有权处理) """ res = internal_union_pb2.InternalQueryUnionRes() res.status = 0 res.ret = union_pb2.UNION_OK union = data.union.get(True) pack.pack_union_info(union, res.union) for member in data.member_list.get_all(True): pack.pack_member_info(member, res.union.members.add()) if enable_application: for application in data.application_list.get_all(True): if application.is_available(timer.now): pack.pack_application_info(application, res.union.applications.add()) for aid in data.aid_list.get_all(True): if aid.is_active_for(user_id, timer.now): if aid.user_id == user_id: pack.pack_aid_info(aid, res.union.aid_own, user_id, timer.now) else: pack.pack_aid_info(aid, res.union.aids.add(), user_id, timer.now) #战争基础信息 season = data.season.get(True) battle = battle_business.update_battle(data, timer.now) pack.pack_battle_info(union, season, battle, res.union.battle, timer.now) #个人数据 member = member_business.find_member(data, user_id) if member is not None: pack.pack_battle_individual_info(member, res.union.battle.user) #己方防守地图信息 nodes = battle_business.get_battle_map(data) pack.pack_battle_map_info(union, season, battle, nodes, res.union.battle.own_map, timer.now) #战斗记录 records = data.battle_record_list.get_all(True) for record in records: pack.pack_battle_record_info(record, res.union.battle.records.add(), timer.now) #联盟捐献信息 donate_boxes = data.donate_box_list.get_all(True) for donate_box in donate_boxes: if donate_box.status != UnionDonateBox.NULL: pack.pack_donate_box_info(data, user_id, donate_box, res.boxes_info.add(), timer) donate_records = donate_business.get_donate_records(data) for donate_record in donate_records: pack.pack_donate_record_info(donate_record, res.donate_records.add()) return res
def _calc_sync(self, data, req, timer): res = internal_union_pb2.InternalSyncBossRes() res.status = 0 member = member_business.find_member(data, req.user_id) if member is None: res.ret = union_pb2.UNION_NOT_MATCHED return self._sync_succeed(data, req, res, timer) union = data.union.get() bosses_id = union.get_bosses_id() status = None boss_id = None boss_step = None now_boss_step = None total_soldier_num = None current_soldier_num = None if req.HasField("boss_step"): assert not req.HasField("boss_id") if req.boss_step < 0 or req.boss_step > len(bosses_id) - 1: res.ret = union_pb2.UNION_BOSS_INACTIVE return self._sync_succeed(data, req, res, timer) boss_id = bosses_id[req.boss_step] boss_step = req.boss_step boss = boss_business.get_union_boss(data, boss_id) if req.HasField("boss_id"): assert not req.HasField("boss_step") boss_id = req.boss_id boss_step = bosses_id.index(boss_id) boss = boss_business.get_union_boss(data, boss_id) if req.HasField("kill_addition"): assert req.HasField("user_name") assert req.HasField("boss_id") or req.HasField("boss_step") assert boss_id is not None boss = boss_business.get_union_boss(data, boss_id) if boss.is_able_to_attack(): boss_business.attack_boss(data, boss, req.kill_addition, req.user_id, req.user_name) now_boss_step = union.boss_step status = boss.status total_soldier_num = boss.total_soldier_num current_soldier_num = boss.current_soldier_num res.ret = union_pb2.UNION_OK res.boss_step = boss_step res.now_boss_step = now_boss_step res.boss_id = boss_id res.boss_status = status res.total_soldier_num = total_soldier_num res.current_soldier_num = current_soldier_num defer = DataBase().commit(data) defer.addCallback(self._sync_succeed, req, res, timer) return defer