def procYesno(self, v_player, args): """申請確認. """ try: # 相手のID. fid = int(args.get(1)) except: raise CabaretError(u'引数が想定外です', CabaretError.Code.ILLEGAL_ARGS) playerlist = self.getObjPlayerList([fid]) if len(playerlist) == 0: raise CabaretError(u'存在しないプレイヤーです', CabaretError.Code.NOT_DATA) player = playerlist[0] url = UrlMaker.friendrequest_do() url = OSAUtil.addQuery(url, Defines.URLQUERY_USERID, fid) player['url_friendrequest_send'] = self.makeAppLinkUrl(url) self.html_param['player'] = player #フレンド検索URL. lvgrp = int(Defines.LevelGroup.LV01_09) url = OSAUtil.addQuery(UrlMaker.friendsearch(), Defines.URLQUERY_LEVELGROUP, lvgrp) self.html_param['url_search'] = self.makeAppLinkUrl(url) self.writeAppHtml('friend/sendyesno')
def process(self): req_args = self.getUrlArgs('/tradeshopdo/') try: itemmid = int(req_args.get(0)) confirmkey = urllib.unquote(req_args.get(1)) num = int(self.request.get(Defines.URLQUERY_NUMBER, None)) except: raise CabaretError(u'リクエストが正しくありません', CabaretError.Code.ILLEGAL_ARGS) model_mgr = self.getModelMgr() tradeshopmaster = BackendApi.get_current_tradeshopmaster(model_mgr, using=settings.DB_READONLY) if tradeshopmaster is None: raise CabaretError(u'交換所のマスターデータが見つかりません', CabaretError.Code.ILLEGAL_ARGS) v_player = self.getViewerPlayer() try: model_mgr = db_util.run_in_transaction(self.tr_write, v_player.id, itemmid, confirmkey, num) model_mgr.write_end() except CabaretError, err: if settings_sub.IS_LOCAL: raise elif err.code == CabaretError.Code.ALREADY_RECEIVED: pass else: url = UrlMaker.tradeshopyesno(itemmid) self.appRedirect(self.makeAppLinkUrlRedirect(url)) return
def processNormal(self, target): """通常設定. """ try: # 選択したカード. cardid = int(self.request.get(Defines.URLQUERY_CARD)) # 設定する場所. idx = int(self.request.get(Defines.URLQUERY_INDEX)) except: raise CabaretError(u'引数が想定外です', CabaretError.Code.ILLEGAL_ARGS) v_player = self.getViewerPlayer() model_mgr = self.getModelMgr() uid = v_player.id if target == 'raid': # レイド. deck = BackendApi.get_raid_deck(uid, model_mgr, using=settings.DB_READONLY) else: deck = BackendApi.get_deck(uid, model_mgr, using=settings.DB_READONLY) # デッキ. cardidlist = deck.to_array() if idx == -1: # デッキから指定のカードを外す. if deck.leader == cardid: raise CabaretError(u'No.1は外せません', CabaretError.Code.ILLEGAL_ARGS) elif cardid in cardidlist: cardidlist.remove(cardid) else: # 設定済み. return else: idx = min(max(0, idx), len(cardidlist)) if cardid in cardidlist: if idx < len(cardidlist): if cardidlist[idx] == cardid: # 設定済み. return else: # 入れ替え. cardidlist[cardidlist.index(cardid)] = cardidlist[idx] cardidlist[idx] = cardid else: # 削除して末尾に追加. cardidlist.remove(cardid) cardidlist.append(cardid) else: if idx < len(cardidlist): cardidlist[idx] = cardid else: # 末尾に追加. cardidlist.append(cardid) # 書き込み. if target == 'raid': wrote_model_mgr = db_util.run_in_transaction(Handler.tr_write_raid, v_player, cardidlist) else: wrote_model_mgr = db_util.run_in_transaction(Handler.tr_write, v_player, cardidlist) wrote_model_mgr.write_end()
def process(self): v_player = self.getViewerPlayer() model_mgr = self.getModelMgr() try: str_cardidlist = self.request.get(Defines.URLQUERY_CARD, None) cardidlist = [ int(str_cardid) for str_cardid in str_cardidlist.split(',') ] if len(cardidlist) == 0: raise confirmkey = urllib.unquote( self.getUrlArgs('/transferdo/').get(0) or '') except: raise CabaretError(u'不正なアクセスです', CabaretError.Code.ILLEGAL_ARGS) cardidlist = list(set(cardidlist)) cardlist = model_mgr.get_models(Card, cardidlist, False, using=settings.DB_DEFAULT) if len(cardlist) != len(cardidlist): raise CabaretError(u'キャストが見つかりませんでした', CabaretError.Code.NOT_DATA) try: wrote_model_mgr = db_util.run_in_transaction( Handler.tr_write, v_player.id, cardidlist, confirmkey) wrote_model_mgr.write_end() except CabaretError, err: if err.code == CabaretError.Code.ALREADY_RECEIVED: pass else: raise
def process(self): args = self.getUrlArgs('/sceventfever/') try: stageid = int(args.get(0)) scoutkey = urllib.unquote(args.get(1)) except: raise CabaretError(u'引数が想定外です', CabaretError.Code.ILLEGAL_ARGS) v_player = self.getViewerPlayer() model_mgr = self.getModelMgr() using = settings.DB_READONLY eventmaster = BackendApi.get_current_scouteventmaster(model_mgr, using=using) if eventmaster is None: raise CabaretError(u'Event Closed.', CabaretError.Code.EVENT_CLOSED) mid = eventmaster.id # 進行情報. playdata = BackendApi.get_event_playdata(model_mgr, mid, v_player.id, using) if playdata is None or playdata.alreadykey != scoutkey: if settings_sub.IS_LOCAL: raise CabaretError(u'キーが正しくありません %s vs %s' % (playdata.alreadykey if playdata else 'None', scoutkey)) url = self.makeAppLinkUrlRedirect(UrlMaker.scoutevent()) self.appRedirect(url) return eventlist = playdata.result.get('event', []) if eventlist: # ここで必要なのははじめの1件. event = eventlist[0] else: # なにも起きなかった. event = ScoutEventNone.create() eventKind = event.get_type() backUrl = None # イベント毎の設定. if playdata.result.get('lovetime_start'): # 逢引タイム演出 backUrl = UrlMaker.scouteventlovetime(stageid, scoutkey) elif eventKind in (Defines.ScoutEventType.LEVELUP, Defines.ScoutEventType.COMPLETE, Defines.ScoutEventType.HAPPENING): # 結果表示へ. backUrl = UrlMaker.scouteventresultanim(stageid, scoutkey, 0) # 結果表示へ. backUrl = backUrl or UrlMaker.scouteventresult(stageid, scoutkey) if playdata.result.get('feverstart'): # フィーバー演出. self.__swf_params = {} self.__swf_params['backUrl'] = self.makeAppLinkUrl(backUrl) #self.__swf_params['statusText'] = u'XXXXXXXX' self.appRedirectToEffect('scoutevent/fever2/effect.html', self.__swf_params) else: # 演出不要. self.appRedirect(self.makeAppLinkUrlRedirect(backUrl)) return
def procYesno(self, v_player, fid, accept): """承認・拒否確認. """ model_mgr = self.getModelMgr() uid = v_player.id if not BackendApi.check_friendrequest_receive( uid, fid, model_mgr, using=settings.DB_READONLY): raise CabaretError(u'フレンド申請を受け取っていません', CabaretError.Code.NOT_DATA) playerlist = self.getObjPlayerList([fid]) if len(playerlist) == 0: raise CabaretError(u'存在しないプレイヤーです', CabaretError.Code.NOT_DATA) player = playerlist[0] self.html_param['player'] = playerlist[0] if accept: player['url_friendrequest_accept'] = self.makeAppLinkUrl( UrlMaker.friendreceive_do(fid, True)) self.writeAppHtml('friend/acceptyesno') else: player['url_friendrequest_veto'] = self.makeAppLinkUrl( UrlMaker.friendreceive_do(fid, False)) self.writeAppHtml('friend/vetoyesno')
def tr_write_pc(name, mp4_name, filepath, weblist, edittime=None): """マスターデータ書き込み(PC用). """ model_mgr = ModelRequestMgr() exists_masterdata = PcMoviePlayList.getValues( ['id'], filters={'filename': mp4_name}) if exists_masterdata: master = PcMoviePlayList.getByKeyForUpdate(exists_masterdata.id) else: master = PcMoviePlayList() master.filename = mp4_name master.name = name master.edittime = edittime or OSAUtil.get_now() model_mgr.set_save(master) model_mgr.write_all() if settings_sub_props.ENVIRONMENT_TYPE != settings_sub_props.EnvironmentType.MANAGER: errlog = MovieUtil.distribute_wowza(master.filename) if errlog: raise CabaretError(errlog) if weblist: errlog = MovieUtil.distribute_pc(master.filename, weblist, settings_sub.SERVER_PASS) if errlog: raise CabaretError(errlog) return model_mgr
def process(self): args = self.getUrlArgs('/scoutcardgetresult/') try: scoutid = int(args.get(0)) except: raise CabaretError(u'引数が想定外です', CabaretError.Code.ILLEGAL_ARGS) v_player = self.getViewerPlayer() model_mgr = self.getModelMgr() using = settings.DB_READONLY # 進行情報. playdata = BackendApi.get_scoutprogress(model_mgr, v_player.id, [scoutid], using=using).get(scoutid, None) target_event = BackendApi.find_scout_event(playdata, Defines.ScoutEventType.GET_CARD) if target_event is None: if settings_sub.IS_LOCAL: raise CabaretError(u'女の子を発見していません') url = self.makeAppLinkUrlRedirect(UrlMaker.scout()) self.appRedirect(url) return elif not target_event.is_received: if settings_sub.IS_LOCAL: raise CabaretError(u'まだ女の子をスカウトしていません') url = self.makeAppLinkUrlRedirect(UrlMaker.scoutresult(scoutid, playdata.alreadykey)) self.appRedirect(url) return # プレイヤー. self.html_param['player'] = Objects.player(self, v_player) # 獲得したカード. cardmaster = BackendApi.get_cardmasters([target_event.card], arg_model_mgr=model_mgr, using=using).get(target_event.card) card = BackendApi.create_card_by_master(cardmaster) cardset = CardSet(card, cardmaster) self.html_param['card'] = Objects.card(self, cardset, is_new=target_event.is_new) # スカウト. arr = BackendApi.get_scouts(model_mgr, [scoutid], using=using) scoutmaster = arr[0] if arr else None self.html_param['scout'] = self.makeScoutObj(scoutmaster, playdata) # スカウト結果. resultlist = playdata.result.get('result', []) self.html_param['scoutresultinfo'] = BackendApi.make_scoutresult_info(resultlist) # レイドイベント. BackendApi.put_raidevent_champagnedata(self, v_player.id) if target_event.is_success: if target_event.autosell: # 自動退店. self.html_param['autosell'] = target_event.autosell self.html_param['_gold_add'] = target_event.sellprice self.html_param['_ckt'] = getattr(target_event, 'sellprice_treasure', 0) self.writeAppHtml('scout/cardgetresult_success') else: self.writeAppHtml('scout/cardgetresult_failed')
def process(self): model_mgr = self.getModelMgr() battleplayer = self.getBattlePlayer() if battleplayer is None or battleplayer.opponent == 0: # 対戦相手設定へ. raise CabaretError(u'対戦相手を設定してください', CabaretError.Code.NOT_DATA) rankmaster = self.getBattleRankMaster() obj_list = self.getObjPlayerListByID([battleplayer.opponent]) if not obj_list: # 対戦相手が削除された. raise CabaretError(u'対戦相手が見つかりませんでした.再設定してください.', CabaretError.Code.NOT_DATA) # 対戦相手. self.json_result_param['player'] = obj_list[0] # 残り対戦相手変更回数. opponent_change_restnum = BackendApi.get_battle_opponent_change_restcnt( model_mgr, battleplayer, rankmaster, using=settings.DB_READONLY) self.json_result_param[ 'opponent_change_restnum'] = opponent_change_restnum # 実行用のキー. self.json_result_param['battlekey'] = battleplayer.result self.writeAppJson()
def procGetCard(self, mid, stagemaster, playdata, event): """カード獲得. """ if event.is_received: # 終了済み. if settings_sub.IS_LOCAL: raise CabaretError(u'判定済みです', CabaretError.Code.ALREADY_RECEIVED) self.appRedirect(self.makeAppLinkUrlRedirect(UrlMaker.scouteventcardgetresult(stagemaster.id))) return model_mgr = self.getModelMgr() # 獲得したカード. cardid = event.card cardmaster = BackendApi.get_cardmasters([cardid], model_mgr, using=settings.DB_READONLY).get(cardid) if cardmaster is None: raise CabaretError(u'一度公開されたキャストが非公開にされました.危険です.', CabaretError.Code.INVALID_MASTERDATA) card = BackendApi.create_card_by_master(cardmaster) self.html_param['card'] = Objects.card(self, CardSet(card, cardmaster), is_new=event.is_new) self.html_param['silhouette'] = event.silhouette # 獲得判定へ飛ぶ. url = UrlMaker.scouteventcardget(stagemaster.id) self.html_param['url_exec'] = self.makeAppLinkUrl(url) # アイテム. BackendApi.put_scoutcard_uselead_info(self, UrlMaker.scouteventcardget(stagemaster.id)) self.html_param['num_key'] = Defines.URLQUERY_NUMBER self.writeScoutEventHTML('cardget', self.eventmaster)
def process(self): v_player = self.getViewerPlayer() args = self.getUrlArgs('/raidfriendselect/') ope = args.get(0) raidid = '%s' % args.get(1) if not BackendApi.raid_is_can_callfriend(v_player.id): self.redirectWithError( CabaretError(u'まだキャストを呼べません', CabaretError.Code.NOT_ENOUGH)) return elif not raidid.isdigit(): self.redirectWithError( CabaretError(u'レイドが指定されていません', CabaretError.Code.ILLEGAL_ARGS)) return raidid = int(raidid) table = { 'list': self.procList, 'set': self.procSet, } func = table.get(ope) if not func: self.redirectWithError( CabaretError(u'不正なアクセスです', CabaretError.Code.ILLEGAL_ARGS)) return func(args, raidid)
def process(self): v_player = self.getViewerPlayer() model_mgr = self.getModelMgr() args = self.getUrlArgs('/transferreturn/') try: num = int(self.request.get(Defines.URLQUERY_NUMBER, None)) mid = args.getInt(0) confirmkey = urllib.unquote(args.get(1) or '') except: raise CabaretError(u'不正なアクセスです.', CabaretError.Code.ILLEGAL_ARGS) cardmaster = BackendApi.get_cardmasters( [mid], model_mgr, using=settings.DB_READONLY).get(mid) if cardmaster is None or not CardUtil.checkStockableMaster( cardmaster, raise_on_error=True): raise CabaretError(u'不正なアクセスです', CabaretError.Code.ILLEGAL_ARGS) try: wrote_model_mgr = db_util.run_in_transaction( Handler.tr_write, v_player.id, cardmaster, num, confirmkey) wrote_model_mgr.write_end() except CabaretError, err: if err.code == CabaretError.Code.ALREADY_RECEIVED: pass elif err.code in (CabaretError.Code.OVER_LIMIT, CabaretError.Code.NOT_ENOUGH): # 枠がいっぱいまたはストックが足りない. url = UrlMaker.albumdetail(cardmaster.album) url = OSAUtil.addQuery(url, Defines.URLQUERY_ERROR, err.code) self.appRedirect(self.makeAppLinkUrlRedirect(url)) return else: raise
def process(self): v_player = self.getViewerPlayer() happeningraidset = self.getHappeningRaidSet() if happeningraidset is None or not happeningraidset.happening.happening.is_boss_appeared( ): if settings_sub.IS_LOCAL: raise CabaretError(u'レイドが発生していない') url = self.makeAppLinkUrlRedirect(UrlMaker.happening()) self.appRedirect(url) return # レイド情報. raidboss = happeningraidset.raidboss if raidboss is None: raise CabaretError(u'レイド情報がありません', CabaretError.Code.UNKNOWN) elif not raidboss.raid.helpflag: to_other = self.request.get(Defines.URLQUERY_FLAG) == "1" try: model_mgr = db_util.run_in_transaction(self.tr_write, v_player.id, to_other) model_mgr.write_end() except CabaretError: if settings_sub.IS_LOCAL: raise url = self.makeAppLinkUrlRedirect( self.makeLinkRaidBattlePre(happeningraidset)) self.appRedirect(url)
def process(self): args = self.getUrlArgs('/compositiondo/') try: if settings_sub.IS_BENCH: requestkey = OSAUtil.makeSessionID() else: self.__baseid = int(args.get(0)) self.__materialidlist = self.getMaterialIdList() requestkey = urllib.unquote(args.get(1)) except: raise CabaretError(u'引数が想定外です', CabaretError.Code.ILLEGAL_ARGS) v_player = self.getViewerPlayer() try: model_mgr = db_util.run_in_transaction(Handler.tr_write, v_player.id, self.__baseid, self.__materialidlist, requestkey) model_mgr.write_end() except CabaretError, e: if e.code == CabaretError.Code.ALREADY_RECEIVED: pass else: if settings_sub.IS_LOCAL: raise CabaretError(u'合成できませんでした.%s' % CabaretError.getCodeString(e.code)) url = UrlMaker.composition() self.appRedirect(self.makeAppLinkUrlRedirect(url)) return
def process(self): model_mgr = self.getModelMgr() using = settings.DB_READONLY args = self.getUrlArgs('/panelmissionanim/') panel = args.getInt(0) # パネルのマスターデータ. panelmaster = None if panel: panelmaster = BackendApi.get_panelmission_panelmaster(model_mgr, panel, using=using) if panelmaster is None: raise CabaretError(u'存在しないパネルです', CabaretError.Code.ILLEGAL_ARGS) v_player = self.getViewerPlayer() uid = v_player.id # 進行情報. panelplaydata = BackendApi.get_panelmission_data(model_mgr, uid, panel, using=using, get_instance=False) if panelplaydata is None: raise CabaretError(u'未プレイのパネルです', CabaretError.Code.ILLEGAL_ARGS) dataUrl = self.makeAppLinkUrlEffectParamGet('panelmission/%d' % panelmaster.id) self.appRedirectToEffect2('%s/effect2.html' % panelmaster.effectname, dataUrl)
def __reflect_ap_base(self, ap_column_name): """行動力を反映. 時間と共に増えてゆく. """ playerap = self.getModel(PlayerAp) if playerap is None: raise CabaretError(u'行動力を操作するときはPlayerApとPlayerFriendをロードしてください.') AP_CNAME = ap_column_name AP_TIME_CNAME = PlayerAp.AP_TIME_COLUMN_BASE % ap_column_name AP_RECOVE_TIME = PlayerAp.AP_RECOVE_TIME_TABLE.get(AP_CNAME, None) if AP_RECOVE_TIME is None: raise CabaretError(u'undfined AP_RECOVE_TIME:%s' % AP_CNAME) now = OSAUtil.get_now() ap = getattr(playerap, AP_CNAME) ap_time = getattr(playerap, AP_TIME_CNAME) ap_max = self.__get_ap_max(ap_column_name) delta = now - ap_time diff_sec = delta.days * 86400 + delta.seconds reduce_v = diff_sec / AP_RECOVE_TIME # 増やす量. wrote_ap = min(ap_max, max(0, ap + reduce_v)) setattr(playerap, AP_CNAME, wrote_ap) reduce_real = wrote_ap - ap # 実際に増えた量. if wrote_ap == ap_max: setattr(playerap, AP_TIME_CNAME, now) else: add_sec = AP_RECOVE_TIME * reduce_real setattr(playerap, AP_TIME_CNAME, ap_time + datetime.timedelta(seconds=add_sec))
def process(self): happeningset = self.getHappening() if happeningset is None: if settings_sub.IS_LOCAL: raise CabaretError(u'ハプニングが見つかりません') url = UrlMaker.happening() self.appRedirect(self.makeAppLinkUrlRedirect(url)) return elif happeningset.happening.is_end( ) or happeningset.happening.is_cleared(): # 終了済み. if settings_sub.IS_LOCAL: raise CabaretError(u'終了済みです') url = UrlMaker.happeningend(happeningset.happening.id) self.appRedirect(self.makeAppLinkUrlRedirect(url)) return args = self.getUrlArgs('/happeningcancel/') procname = args.get(0) table = { 'yesno': self.procYesno, 'do': self.procDo, } func = table.get(procname) if func: func() else: raise CabaretError(u'不正なアクセスです', CabaretError.Code.ILLEGAL_ARGS)
def process(self): args = self.getUrlArgs('/sceventcardget/') try: stageid = int(args.get(0)) itemid = int(self.request.get(Defines.URLQUERY_ID, 0)) usenum = int(self.request.get(Defines.URLQUERY_NUMBER, 0)) if not (0 <= usenum): raise except: raise CabaretError(u'引数が想定外です', CabaretError.Code.ILLEGAL_ARGS) v_player = self.getViewerPlayer() model_mgr = self.getModelMgr() using = settings.DB_READONLY eventmaster = BackendApi.get_current_scouteventmaster(model_mgr, using=using) if eventmaster is None: raise CabaretError(u'Event Closed.', CabaretError.Code.EVENT_CLOSED) mid = eventmaster.id # アイテムの確認. itemmaster = None if itemid: if not itemid in Defines.ItemEffect.SCOUT_CARD_ITEMS: if settings_sub.IS_LOCAL: raise CabaretError(u'使用できないアイテムです') playdata = BackendApi.get_event_playdata( model_mgr, mid, v_player.id, using) if playdata: url = UrlMaker.scouteventresult(stageid, playdata.alreadykey) self.appRedirect(self.makeAppLinkUrlRedirect(url)) else: self.redirectToTop() return itemmaster = BackendApi.get_itemmaster(model_mgr, itemid, using=settings.DB_READONLY) if itemmaster is None: raise CabaretError(u'アイテムが見つかりません', CabaretError.Code.INVALID_MASTERDATA) playerconfigdata = BackendApi.get_playerconfigdata(v_player.id) try: model_mgr = db_util.run_in_transaction( Handler.tr_write, mid, v_player.id, stageid, itemmaster, usenum, playerconfigdata.autosell_rarity) model_mgr.write_end() except CabaretError, err: if settings_sub.IS_LOCAL: raise elif err.code == CabaretError.Code.ALREADY_RECEIVED: # 判定済み. pass else: raise
def procSet(self, args, raidid): fid = str(args.get(2)) if not fid.isdigit(): self.redirectWithError( CabaretError(u'フレンドを設定できません', CabaretError.Code.ILLEGAL_ARGS)) return fid = int(fid) model_mgr = self.getModelMgr() v_player = self.getViewerPlayer() leader = BackendApi.get_leaders([fid], arg_model_mgr=model_mgr, using=settings.DB_READONLY).get(fid) if leader is None: self.redirectWithError( CabaretError(u'存在しないユーザーです', CabaretError.Code.NOT_DATA)) return BackendApi.save_raidhelpcard(model_mgr, v_player.id, raidid, leader, using=settings.DB_READONLY) url = UrlMaker.happening() self.appRedirect(self.makeAppLinkUrlRedirect(url, add_frompage=False))
def update(self, fields=None): """update専用. """ if self.key() == CantReadField: raise CabaretError('primaly key is invalid.') using = settings.DB_DEFAULT if fields is None: # 全てupdate. self.save(force_insert=False, force_update=True, using=using) else: # 更新するデータ. update_data = {} try: # プライマリキー. name = self.get_primarykey_column() primary_filter = {name: getattr(self, name)} for name in fields: value = getattr(self, name) update_data[name] = value except AttributeError: # そんなカラムないよ!!. raise CabaretError('%s object doesnt have attribute name=%s' % (self.__class__.__name__, name)) # 中でリトライする. self.__class__.all(using=using).filter(**primary_filter).update( **update_data)
def checkUser(self): # 署名の検証を行う. #self.osa_util.checkOAuth() if settings_sub.IS_LOCAL: return try: if self.request.django_request.META.has_key('HTTP_AUTHORIZATION'): oauth_params = self.request.django_request.META['HTTP_AUTHORIZATION'] headers = {} headers.update(self.request.django_request.META) headers['Authorization'] = oauth_params oauth_request = oauth.OAuthRequest.from_request( self.request.method, self.request.url, headers = headers, query_string = self.request.query_string ) sig = oauth_request.get_parameter('oauth_signature') sig_build = oauth.OAuthSignatureMethod_HMAC_SHA1().build_signature(oauth_request, self.osa_util.consumer, None) self.osa_util.logger.trace('sig :' + sig) self.osa_util.logger.trace('sig_build:' + sig_build) if sig == sig_build: self.osa_util.logger.trace('sig_check_ok?:True') else: self.osa_util.logger.trace('sig_check_ok?:False') raise oauth.OAuthError('sig check error!!') else: raise CabaretError(u'署名を確認できません') except: raise CabaretError(u'署名を確認できません')
def process(self): req_args = self.getUrlArgs('/tradeshopyesno/') v_player = self.getViewerPlayer() try: itemmid = int(req_args.get(0)) num = int(self.request.get(Defines.URLQUERY_NUMBER, None)) except: raise CabaretError(u'リクエストが正しくありません', CabaretError.Code.ILLEGAL_ARGS) model_mgr = self.getModelMgr() tradeshopmaster = BackendApi.get_current_tradeshopmaster( model_mgr, using=settings.DB_READONLY) if (itemmid is None) or ( itemmid not in tradeshopmaster.trade_shop_item_master_ids): raise CabaretError(u'アイテムの選択が不正です', CabaretError.Code.ILLEGAL_ARGS) tradeshopitemmaster = BackendApi.get_tradeshopitemmaster( model_mgr, itemmid, using=settings.DB_READONLY) url = OSAUtil.addQuery( UrlMaker.tradeshopdo(itemmid, v_player.req_confirmkey), Defines.URLQUERY_NUMBER, num) obj_item = self.get_itemdata(tradeshopitemmaster) obj_item['next_url'] = self.makeAppLinkUrl(url) self.html_param['usenum'] = num self.html_param['item'] = obj_item self.html_param['user_point'] = v_player.point self.writeAppHtml('tradeshop/yesno')
def run_in_transaction_custom_retries(retry, function, *args, **kwargs): MYSQL_WAIT_MAX = 3 count = retry start_time = OSAUtil.get_now() while True: try: return transaction_sub(function, *args, **kwargs) except AppError: # apperrorは意図的に出しているからスルー. raise except CabaretError: # apperrorは意図的に出しているからスルー. raise except TimeoutError: # db接続タイムアウト. raise except OperationalError: # mysqlの接続等のエラー. now = OSAUtil.get_now() dif = now - start_time if dif.seconds < MYSQL_WAIT_MAX: time.sleep(0.1) else: info = sys.exc_info() trace = CabaretError.makeErrorTraceString(info) raise CabaretError(trace, CabaretError.Code.TOO_MANY_TRANSACTION) except: if count <= 0: raise count -= 1 time.sleep(0.01)
def process(self): args = self.getUrlArgs('/treasuregetcomplete/') midlist = None try: str_idlist = self.request.get(Defines.URLQUERY_ID) ttype = int(args.get(0)) if str_idlist: midlist = [int(str_getid) for str_getid in str_idlist.split(',') if str_getid] else: midlist = [int(args.get(1))] if not Defines.TreasureType.NAMES.has_key(ttype) or not midlist or Defines.TreasureType.POOL_LIMIT[ttype] < len(midlist): raise CabaretError() except: raise CabaretError(u'リクエストが正しくありません', CabaretError.Code.ILLEGAL_ARGS) model_mgr = self.getModelMgr() # 宝箱のデータ treasuremaster_dict = BackendApi.get_treasuremaster_dict(model_mgr, ttype, midlist, using=settings.DB_READONLY) obj_treasure_list = [] infos = {} for mid in midlist: treasuremaster = treasuremaster_dict.get(mid) if treasuremaster is None: raise CabaretError(u'宝箱のマスターデータが存在しません', CabaretError.Code.NOT_DATA) if not infos.has_key(mid): infos[mid] = BackendApi.make_treasureiteminfo_list(self, [treasuremaster])[0] obj_treasure_list.append(infos[mid]) self.html_param['treasure_get_data_list'] = obj_treasure_list # 持っている宝箱. self.putTreasureListParams(ttype, do_check_all=False, using=settings.DB_DEFAULT) self.writeAppHtml('treasure/opend')
def process(self): args = self.getUrlArgs('/gachacardlist/') try: mid = int(args.get(0)) except: raise CabaretError(u'表示できない引抜です', CabaretError.Code.ILLEGAL_ARGS) model_mgr = self.getModelMgr() # マスターデータ. gachamaster = BackendApi.get_gachamaster(model_mgr, mid, using=settings.DB_READONLY) if gachamaster is None: raise CabaretError(u'表示できない引抜です', CabaretError.Code.ILLEGAL_ARGS) self.html_param['gacha_name'] = gachamaster.name # カード情報. info = BackendApi.make_gachabox_rateinfo(model_mgr, gachamaster, using=settings.DB_READONLY) self.html_param['gachacardlistinfo'] = info # 戻る. url = OSAUtil.addQuery( UrlMaker.gacha(), Defines.URLQUERY_CTYPE, Defines.GachaConsumeType.TO_TOPIC[gachamaster.consumetype]) self.html_param['url_back'] = self.makeAppLinkUrl(url) self.writeAppHtml('gacha/cardlist')
def procResultAnim(self, args): """結果演出(イベント限定). """ model_mgr = self.getModelMgr() v_player = self.getViewerPlayer() # ハプニングとレイド情報を取得. raidid = str(args.get(1, '')) happeningraidset = None if raidid: if raidid.isdigit(): happeningraidset = BackendApi.get_happeningraidset( model_mgr, int(raidid), using=settings.DB_READONLY) if happeningraidset is None or happeningraidset.raidboss is None: raise CabaretError(u'接客できない超太客です', CabaretError.Code.ILLEGAL_ARGS) elif happeningraidset.happening.happening.oid != v_player.id: raise CabaretError(u'接客できない超太客です', CabaretError.Code.ILLEGAL_ARGS) elif happeningraidset.happening.happening.is_active(): raise CabaretError(u'この超太客はまだ終了していません', CabaretError.Code.ILLEGAL_ARGS) if happeningraidset.happening.happening.is_missed_and_not_end(): self.writeHappeningMissed(happeningraidset.happening.id) url = UrlMaker.raidend(raidid) else: # 未指定なので直前のバトルから. raidbattle = BackendApi.get_raid_battleresult( model_mgr, v_player.id, using=settings.DB_READONLY) if raidbattle is None: if settings_sub.IS_LOCAL: raise CabaretError(u'想定外の遷移です') url = UrlMaker.mypage() self.appRedirect(self.makeAppLinkUrlRedirect(url)) return raidid = raidbattle.raidid animdata = raidbattle.process # 演出用パラメータ. is_win = animdata.winFlag happeningraidset = BackendApi.get_happeningraidset( model_mgr, raidid, using=settings.DB_READONLY) if is_win: url = UrlMaker.raidend(raidid) else: url = UrlMaker.raidresult() # 演出はカット. # cur_eventmaster = BackendApi.get_current_raideventmaster(model_mgr, using=settings.DB_READONLY) # if cur_eventmaster: # params = { # 'backUrl' : self.makeAppLinkUrl(url), # } # self.appRedirectToEffect('levelup/effect.html', params) # else: # self.appRedirect(self.makeAppLinkUrlRedirect(url)) self.appRedirect(self.makeAppLinkUrlRedirect(url))
def procLastCardGetAnim(self, args): """最後のレア度のキャスト獲得演出 """ model_mgr = self.getModelMgr() v_player = self.getViewerPlayer() # get the card id form url cardid = args.getInt(1) cur_eventmaster = BackendApi.get_current_produce_event_master( model_mgr, using=settings.DB_READONLY) if not cur_eventmaster: raise CabaretError(u'イベントは終了しました', CabaretError.Code.EVENT_CLOSED) raidbattle = BackendApi.get_raid_battleresult( model_mgr, v_player.id, using=settings.DB_READONLY) if raidbattle is None: if settings_sub.IS_LOCAL: raise CabaretError(u'想定外の遷移です') url = UrlMaker.producehappening() self.appRedirect(self.makeAppLinkUrlRedirect(url)) return # レイド情報を取得. raidboss = None happeningraidset = BackendApi.get_producehappeningraidset( model_mgr, raidbattle.raidid, using=settings.DB_READONLY) if happeningraidset: raidboss = happeningraidset.raidboss if raidboss is None: raise CabaretError(u'超太客が存在しません', CabaretError.Code.NOT_DATA) animdata = raidbattle.process is_win = animdata.winFlag # 結果へのURL. happeningset = BackendApi.get_producehappening( model_mgr, raidbattle.raidid, using=settings.DB_READONLY) eventid = HappeningUtil.get_produceeventid( happeningset.happening.event) if cur_eventmaster and cur_eventmaster.id == eventid: url = UrlMaker.produceraidresultanim() elif is_win: url = UrlMaker.produceraidend(raidbattle.raidid) else: url = UrlMaker.produceraidresult() cardmaster = BackendApi.get_model(model_mgr, CardMasterView, cardid, using=settings.DB_READONLY) params = {} params['backUrl'] = self.makeAppLinkUrl(url) params['cast'] = self.makeAppLinkUrlImg( CardUtil.makeThumbnailUrlMiddle(cardmaster)) self.appRedirectToEffect( 'produce_event/produce_lastcastget/effect.html', params)
def process(self): model_mgr = self.getModelMgr() using = settings.DB_READONLY eventmaster = BackendApi.get_current_scouteventmaster(model_mgr, using=using) if eventmaster is None: raise CabaretError(u'Event Closed.', CabaretError.Code.EVENT_CLOSED) mid = eventmaster.id v_player = self.getViewerPlayer() uid = v_player.id # 短冊情報. obj_tanzakulist = BackendApi.put_scoutevent_tanzakudata(self, uid) if not obj_tanzakulist: # 短冊が無いイベント. url = UrlMaker.scoutevent_top() self.appRedirect(self.makeAppLinkUrlRedirect(url)) return obj_tanzaku = None # 短冊所持情報. tanzakudata = BackendApi.get_scoutevent_tanzakucastdata( model_mgr, uid, mid, using=settings.DB_READONLY) current_cast_number = tanzakudata.current_cast if tanzakudata else -1 if current_cast_number != -1: for obj in obj_tanzakulist: if obj['number'] == current_cast_number: obj_tanzaku = obj break # 一応データの不具合を防いでおく. if obj_tanzaku is None: if settings_sub.IS_DEV: raise CabaretError( u'存在しないキャストを指名しています.{}'.format(current_cast_number)) def tr(): model_mgr = ModelRequestMgr() BackendApi.tr_scoutevent_nominate_cast( model_mgr, uid, mid, None) model_mgr.write_all() return model_mgr try: db_util.run_in_transaction(tr).write_end() except CabaretError, err: if err.code == CabaretError.Code.ALREADY_RECEIVED: pass else: raise url = UrlMaker.scouteventcastnomination() self.appRedirect(self.makeAppLinkUrlRedirect(url)) return
def stop(target_squares_master, cnt): if GO_COUNT_MAX <= cnt: raise CabaretError( u'イベントが実行されすぎ', code=CabaretError.Code.INVALID_MASTERDATA) queue.append(target_squares_master) mapid = master.getMapIDByLap(self.__playdata.lap) if target_squares_master.prize: # 停まった時の報酬. prizelist = self.backend_api.get_prizelist( model_mgr, target_squares_master.prize) add_prize(prizelist, target_squares_master.prize_text) if not target_squares_master.last: # 最終マスじゃない場合はイベント発生. if target_squares_master.event_type == Defines.SugorokuMapEventType.GO: # 進む. go(queue, target_squares_master.number, target_squares_master.event_value, cnt + 1) elif target_squares_master.event_type == Defines.SugorokuMapEventType.BACK: # 戻る. loc = target_squares_master.number - target_squares_master.event_value if loc < 1 and 0 < self.__playdata.lap: # 2周目以降はスタート地点より後ろに戻る. self.__playdata.lap -= 1 mapid = master.getMapIDByLap( self.__playdata.lap) target_squares_master = self.backend_api.get_loginbonus_sugoroku_map_squares_master_by_mapid( model_mgr, mapid, using=settings.DB_READONLY)[-1] else: # 1周目はスタート地点より後ろには戻らない. target_squares_master = self.backend_api.get_loginbonus_sugoroku_map_squares_master( model_mgr, mapid, max(1, loc), using=settings.DB_READONLY) # 停まった時の処理. stop(target_squares_master, cnt + 1) elif target_squares_master.event_type == Defines.SugorokuMapEventType.LOSE_TURN: # 休み. self.__playdata.lose_turns = target_squares_master.event_value elif target_squares_master.event_type == Defines.SugorokuMapEventType.JUMP: # 飛ぶ. loc = target_squares_master.event_value target_squares_master = self.backend_api.get_loginbonus_sugoroku_map_squares_master( model_mgr, mapid, loc, using=settings.DB_READONLY) if target_squares_master is None: raise CabaretError(u'飛び先が存在しない', code=CabaretError.Code. INVALID_MASTERDATA) # 停まった時の処理. stop(target_squares_master, cnt + 1)
def procShopDo(self, master_id, buy_count, payment_id): """ショップ実行. 決済情報を確認して課金レコードを作成. """ try: mid = int(master_id) buynum = int(buy_count) if not (0 < buynum <= Defines.BUY_NUM_MAX): raise except: raise CabaretError(u'引数が想定外です', CabaretError.Code.ILLEGAL_ARGS) self.set_shop_masterid(mid) now = OSAUtil.get_now() # プレイヤー情報. v_player = self.getViewerPlayer() # 購入可能かをチェック. master = self.getShopMaster() buydata = self.getShopBuyData(True) if buydata is None: mgr = db_util.run_in_transaction(Handler.tr_write_buydata, v_player.id, master.id) mgr.write_end() buydata = mgr.get_wrote_model(ShopItemBuyData, ShopItemBuyData.makeID(v_player.id, master.id)) sku_id = '%s%s' % (Handler.PAYMENT_TYPE_SHOP, master_id) item = PaymentItem() item.itemId = sku_id item.unitPrice = master.price item.quantity = buynum self.checkPaymentRecord(payment_id, [item]) if self.response.isEnd: return model_mgr = self.getModelMgr() if not BackendApi.check_buyable_shopitem(model_mgr, v_player, master, buydata, buynum, now, using=settings.DB_READONLY): if settings_sub.IS_LOCAL: raise CabaretError(u'購入できない') # リダイレクトせずにステータス500を返す #url = UrlMaker.shop() #self.appRedirect(self.makeAppLinkUrlRedirect(url)) self.response.clear() self.response.set_status(500) self.response.end() return # ここまで来たら購入出来るのが確定.. item.itemId = master.id paymentdata = PaymentData() paymentdata.paymentId = payment_id paymentdata.status = PaymentData.Status.START paymentdata.paymentItems = [item] mgr = db_util.run_in_transaction(Handler.tr_create_entry_shop, v_player, paymentdata, now) mgr.write_end()