def checkBattleEventUser(self, do_check_opening=True, do_check_battle_open=True, do_check_regist=True, do_check_loginbonus=True, do_check_emergency=True): """ユーザーチェック. """ model_mgr = self.getModelMgr() if do_check_opening: uid = self.getViewerPlayer().id cur_eventmaster = self.getCurrentBattleEvent(quiet=True) if cur_eventmaster: if BackendApi.check_battleevent_lead_opening(model_mgr, uid, cur_eventmaster.id, using=settings.DB_READONLY): # オープニングを見ていない. url = UrlMaker.battleevent_opening() self.appRedirect(self.makeAppLinkUrlRedirect(url)) return False config = BackendApi.get_current_battleeventconfig(model_mgr, using=settings.DB_READONLY) is_battleopen = self.isBattleOpen() if do_check_battle_open and not is_battleopen: # バトルが閉じている. url = UrlMaker.battleevent_top(config.mid) self.appRedirect(self.makeAppLinkUrlRedirect(url)) return False elif do_check_emergency and config.is_emergency: # 緊急停止. url = UrlMaker.battleevent_top(config.mid) self.appRedirect(self.makeAppLinkUrlRedirect(url)) return False else: cur_group = self.getCurrentBattleGroup(do_search_log=not is_battleopen) if do_check_regist and cur_group is None: # イベントに参加していない. if is_battleopen: url = UrlMaker.battleevent_regist() else: url = UrlMaker.battleevent_top(config.mid) self.appRedirect(self.makeAppLinkUrlRedirect(url)) return False elif do_check_loginbonus: rankrecord = self.getCurrentBattleRankRecord() if rankrecord and rankrecord.isNeedUpdate(config): url = UrlMaker.battleevent_loginbonus() self.appRedirect(self.makeAppLinkUrlRedirect(url)) return False return True
class Handler(BattleEventBaseHandler): """バトルイベント参加. バトル公開中だけ受け付ける. バトル公開中にグループに所属していないユーザーが対象. 合コンイベントの時は登録ページ. """ @classmethod def getViewerPlayerClassList(cls): return [PlayerExp] def process(self): eventmaster = self.getCurrentBattleEvent() if not self.checkBattleEventUser(do_check_regist=False, do_check_loginbonus=False): return if eventmaster.is_goukon: self.__procGoukon(eventmaster) else: self.__procNormal(eventmaster) def __procGoukon(self, eventmaster): """合コンバトルイベント. """ model_mgr = self.getModelMgr() eventid = eventmaster.id basetime = DateTimeUtil.toLoginTime(OSAUtil.get_now()) cdate = datetime.date(basetime.year, basetime.month, basetime.day) cur_group = self.getCurrentBattleGroup(do_search_log=False) # 設定済みの場合はイベントTOPへリダイレクト. if cur_group and cur_group.cdate == cdate: url = UrlMaker.battleevent_top(eventmaster.id) self.appRedirect(self.makeAppLinkUrlRedirect(url)) return # 最大ランク. config = BackendApi.get_current_battleeventconfig( model_mgr, using=settings.DB_READONLY) # 公開中のランク. rankmaster_list = BackendApi.get_battleevent_rankmaster_by_eventid( model_mgr, eventid, using=settings.DB_READONLY) rankmaster_list.sort(key=lambda x: x.rank) # 未設定で引数がある場合は書き込み. rank = str(self.request.get(Defines.URLQUERY_ID)) if rank.isdigit(): rank = int(rank) # ランクの公開確認. target_rankmaster = None for rankmaster in rankmaster_list: if rankmaster.rank == rank: target_rankmaster = rankmaster break if target_rankmaster: # 登録書き込み. v_player = self.getViewerPlayer() uid = v_player.id try: db_util.run_in_transaction(self.tr_write, config, eventmaster, uid, v_player.level, rankmaster_list, rank).write_end() except CabaretError, err: if err.code == CabaretError.Code.ALREADY_RECEIVED: pass elif settings_sub.IS_DEV: raise else: url = UrlMaker.mypage() self.appRedirect(self.makeAppLinkUrlRedirect(url)) return # 書き込み後はイベントTOPへ. url = UrlMaker.battleevent_top(eventmaster.id) self.appRedirect(self.makeAppLinkUrlRedirect(url)) return # 未設定で引数がない場合は選択ページ. # イベント情報. self.html_param['battleevent'] = Objects.battleevent(self, eventmaster) # 各ランクの情報. obj_rank_list = [] rankmaster_list.sort(key=lambda x: x.rank, reverse=True) for rankmaster in rankmaster_list: obj_rank = BackendApi.make_battleevent_rank_selectobj( self, rankmaster) obj_rank_list.append(obj_rank) self.html_param['battleevent_rank_select'] = obj_rank_list # 書き込み実行URL. url = UrlMaker.battleevent_regist() self.html_param['url_do'] = self.makeAppLinkUrl(url) self.putEventTopic(eventmaster.id) self.writeAppHtml('gcevent/start')