def checkOpponentId(self, oid, revengeid=None, do_redirect=True, args=None): """対戦出来る相手なのかチェック. """ model_mgr = self.getModelMgr() v_player = self.getViewerPlayer() uid = v_player.id eventid = self.getCurrentBattleEvent().id oidlist = None if revengeid: revenge = BackendApi.get_battleevent_revenge(model_mgr, revengeid, using=settings.DB_READONLY) if revenge and uid == revenge.uid: oidlist = [revenge.oid] else: eventmaster = self.getCurrentBattleEvent() oidlist = BackendApi.get_battleevent_opponentidlist(model_mgr, eventmaster.id, uid, using=settings.DB_READONLY) if BackendApi._check_is_rival_strings(oid, eventid, args): if oid in oidlist: oidlist.remove(oid) oidlist.insert(0, oid) elif oid: oidlist[0] = oid oidlist = BackendApi.filter_battleevent_opplist_by_battletime(model_mgr, uid, oidlist, using=settings.DB_READONLY) if oidlist and oid in oidlist: return True else: if do_redirect: target = 'revenge' if revengeid else 'lv' url = UrlMaker.battleevent_opplist(target) self.appRedirect(self.makeAppLinkUrlRedirect(url)) return False
def process(self): eventmaster = self.getCurrentBattleEvent() if not self.checkBattleEventUser(): return args = self.getUrlArgs('/battleeventbattledo/') confirmkey = urllib.unquote(args.get(0) or '') oid = args.getInt(1) rival_index = BackendApi._check_is_rival_strings(oid, eventmaster.id, args) rival_key = BackendApi.get_rival_key(oid, eventmaster.id, args) if rival_key and rival_index == 3: revengeid = args.getInt(2) elif not rival_key: revengeid = args.getInt(2) else: revengeid = None rival_key = BackendApi.get_rival_key(oid, eventmaster.id, args) now = OSAUtil.get_now() v_player = self.getViewerPlayer() uid = v_player.id o_player = None if oid: o_player = BackendApi.get_player(self, oid, [PlayerFriend, PlayerExp], using=settings.DB_READONLY) if not o_player: url = UrlMaker.battleevent_opplist() self.appRedirect(self.makeAppLinkUrlRedirect(url)) return elif not self.checkOpponentId(oid, revengeid, args=args): # 対戦できない相手. return model_mgr = self.getModelMgr() #piecedata = None if v_player.req_confirmkey == confirmkey: self.addloginfo(u'req_confirmkey==confirmkey') # 正しいリクエスト. # お互いのカード. v_deck = BackendApi.get_deck(v_player.id, model_mgr, using=settings.DB_READONLY) o_deck = BackendApi.get_deck(o_player.id, model_mgr, using=settings.DB_READONLY) v_deck_cardlist = BackendApi.get_cards(v_deck.to_array(), model_mgr, using=settings.DB_READONLY) o_deck_cardlist = BackendApi.get_cards(o_deck.to_array(), model_mgr, using=settings.DB_READONLY) self.addloginfo(u'get deck') # 現在の称号. titlemaster = BackendApi.get_current_title_master(model_mgr, v_player.id, now, using=settings.DB_READONLY) battleevent_power_up = titlemaster.battleevent_power_up if titlemaster else 0 # 計算. rand = AppRandom() data = BackendApi.battle(v_player, v_deck_cardlist, o_player, o_deck_cardlist, rand, eventmaster=eventmaster, title_effect=battleevent_power_up) self.addloginfo(u'battle') v_deck_cardidlist = v_deck.to_array() o_deck_cardidlist = o_deck.to_array() eventrankmaster = self.getCurrentBattleRankMaster() v_rankrecord = self.getCurrentBattleRankRecord() o_rankrecord = BackendApi.get_battleevent_rankrecord(model_mgr, eventmaster.id, oid, using=settings.DB_READONLY) o_eventrankmaster = None if o_rankrecord: config = BackendApi.get_current_battleeventconfig(model_mgr, using=settings.DB_READONLY) o_eventrankmaster = BackendApi.get_battleevent_rankmaster(model_mgr, eventmaster.id, o_rankrecord.getRank(config), using=settings.DB_READONLY) self.addloginfo(u'get rankrecord') # グループ内順位. group = self.getCurrentBattleGroup() grouprankdata = BackendApi.make_battleevent_grouprankingdata(self, group, v_rankrecord.uid, now, using=settings.DB_READONLY, do_get_name=False) grouprank = grouprankdata['rank'] if grouprankdata else -1 is_worst = grouprankdata['worst'] if grouprankdata else False self.addloginfo(u'make rankdata') # piecedata = self.present_piece(model_mgr, uid, eventmaster.id, data[0]['is_win'], rival_key) try: model_mgr = db_util.run_in_transaction(self.tr_write, eventmaster, eventrankmaster, o_eventrankmaster, uid, oid, v_deck_cardidlist, o_deck_cardidlist, data, grouprank, is_worst, revengeid, confirmkey, now, rival_key) self.addloginfo(u'write') model_mgr.write_end() self.addloginfo(u'write end') except CabaretError, err: if err.code == CabaretError.Code.ALREADY_RECEIVED: pass elif settings_sub.IS_LOCAL: raise err else: url = self.makeAppLinkUrlRedirect(UrlMaker.battleevent_opplist()) self.appRedirect(url) return
def process(self): eventmaster = self.getCurrentBattleEvent() if not self.checkBattleEventUser(): return args = self.getUrlArgs('/battleeventbattlepre/') oid = args.getInt(0) rival_index = BackendApi._check_is_rival_strings( oid, eventmaster.id, args) rival_key = BackendApi.get_rival_key(oid, eventmaster.id, args) if rival_key and rival_index == 2: revengeid = args.getInt(1) elif not rival_key: revengeid = args.getInt(1) else: revengeid = None v_player = self.getViewerPlayer() uid = v_player.id obj_v_player = None obj_o_player = None if oid: o_player = BackendApi.get_player(self, oid, [PlayerFriend, PlayerExp], using=settings.DB_READONLY) if o_player: tmp = self.getObjPlayerList([o_player, v_player]) for obj_player in tmp: if obj_player['id'] == oid: obj_o_player = obj_player elif obj_player['id'] == uid: obj_v_player = obj_player if tmp: obj_o_player = tmp[0] is_battle_ok = True if not obj_o_player: url = UrlMaker.battleevent_opplist() self.appRedirect(self.makeAppLinkUrlRedirect(url)) return elif not self.checkOpponentId( oid, revengeid, do_redirect=revengeid, args=args): # 対戦できない相手. if revengeid: return is_battle_ok = False obj_o_player['is_battle_ok'] = is_battle_ok self.setFromPage(Defines.FromPages.BATTLEEVENTPRE, [oid, revengeid, rival_key]) # バトルイベント. self.html_param['battleevent'] = Objects.battleevent(self, eventmaster) # 各プレイヤーの情報. self.html_param['player'] = obj_v_player self.html_param['o_player'] = obj_o_player # ランク情報. rankrecord = self.getCurrentBattleRankRecord() obj_rankrecord = self.makeRankRecordObj(rankrecord) self.html_param['battleevent_rank'] = obj_rankrecord # 回復への導線. BackendApi.put_bprecover_uselead_info(self) # バトル開始URL. url = UrlMaker.battleevent_battledo(v_player.req_confirmkey, oid, revengeid, rival_key=rival_key) self.html_param['url_battle_do'] = self.makeAppLinkUrl(url) # 相手変更URL. target = 'revenge' if revengeid else 'lv' url = UrlMaker.battleevent_opplist(target) self.html_param['url_battle_oppselect'] = self.makeAppLinkUrl(url) # 書き込み. if eventmaster.is_goukon: self.writeAppHtml('gcevent/battleselect') else: self.writeAppHtml('btevent/battleselect')