def process(self): args = self.getUrlArgs('/tradedo/') str_mid = args.get(0) if str_mid == 'event': self.__procEvent(args) return try: mid = int(str_mid) confirmkey = urllib.unquote(args.get(1)) num = int(self.request.get(Defines.URLQUERY_NUMBER, 1)) except: raise CabaretError(u'リクエストが正しくありません', CabaretError.Code.ILLEGAL_ARGS) model_mgr = self.getModelMgr() trademaster = BackendApi.get_trademaster(model_mgr, mid, using=settings.DB_READONLY) if trademaster is None: raise CabaretError(u'秘宝交換のマスターデータが見つかりません', CabaretError.Code.ILLEGAL_ARGS) # プレイヤー情報. v_player = self.getViewerPlayer() # 書き込み try: model_mgr = db_util.run_in_transaction(self.tr_write_trade, v_player.id, trademaster, 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.tradeyesno(mid) self.appRedirect(self.makeAppLinkUrlRedirect(url)) return
def _validateMissionTrade(self, missionmaster): if missionmaster.condition_value1 == 0 and missionmaster.condition_value2 == 0: return filters = { 'itype': missionmaster.condition_value1, 'itemid': missionmaster.condition_value2, } if not TradeMaster.fetchValues(fields=['id'], filters=filters, limit=1): raise CabaretError(u'存在しない秘宝交換が設定されています')
def __get_present_idlist(self, blank=False): """引数で渡されたIDのリスト. """ try: str_idlist = self.request.get(Defines.URLQUERY_ID) idlist = [int(str_id) for str_id in str_idlist.split(',') if str_id] if not idlist and not blank: raise except: raise CabaretError(u'プレゼントが指定されていません', CabaretError.Code.ILLEGAL_ARGS) return idlist
def procComplete(self, v_player, fid): """申請完了. """ obj_playerlist = self.getObjPlayerList([fid]) if len(obj_playerlist) == 0: raise CabaretError(u'存在しないプレイヤーです', CabaretError.Code.NOT_DATA) self.html_param['player'] = obj_playerlist[0] self.writeAppHtml('friend/requestcancelcomplete')
def getShopMaster(self): """マスターデータ. """ if self.__shopmaster is None: model_mgr = self.getModelMgr() self.__shopmaster = BackendApi.get_shopmaster( model_mgr, self.__shopmaster_id, using=settings.DB_READONLY) if self.__shopmaster is None: raise CabaretError(u'存在しない商品です', CabaretError.Code.INVALID_MASTERDATA) return self.__shopmaster
def checkMaterialCard(self, basecard, materialcard, deck): v_player = self.getViewerPlayer() if materialcard is None or materialcard.id == basecard.id or materialcard.card.protection or deck.is_member( materialcard.id) or basecard.card.uid != v_player.id: if settings_sub.IS_LOCAL: raise CabaretError(u'ハメ管理に選択できないキャストです.', CabaretError.Code.ILLEGAL_ARGS) url = UrlMaker.evolution() self.appRedirect(self.makeAppLinkUrlRedirect(url)) return False return True
def process(self): model_mgr = self.getModelMgr() # プレイヤー情報 v_player = self.getViewerPlayer() obj_player = Objects.player(self, v_player) # 交換レートリスト取得 #tradelist = BackendApi.get_tradeshopmaster_all(model_mgr, using=settings.DB_READONLY) #tradelist.sort(key=...) # カード所持数 cardnum = BackendApi.get_cardnum(v_player.id, model_mgr, using=settings.DB_READONLY) cardrest = v_player.cardlimit - cardnum is_cardnum_max = cardrest < 1 obj_tradelist = [] limited_masters = {} # ストック制限があるマスター. # slide_cards = {} # スライド表示するカード. header_img_list = {} # ヘッダ画像. self.putFromBackPageLinkUrl() self.html_param['player'] = obj_player self.html_param['tradelist'] = obj_tradelist self.html_param['headerlist'] = header_img_list # self.html_param['slidelist'] = obj_slidelist # 必要か判断出来ない tradeshopmaster = BackendApi.get_current_tradeshopmaster( model_mgr, using=settings.DB_READONLY) if tradeshopmaster is None: raise CabaretError(u'交換所の開催期間外です', CabaretError.Code.EVENT_CLOSED) userdata = None userpoint = BackendApi.get_tradeshop_userpoint(model_mgr, v_player.id) if userpoint is None: userdata = PlayerTradeShop.createInstance(uid) userpoint = userdata.point self.html_param['user_point'] = userpoint self.html_param['itemdata'] = self.get_tradeitem_list( model_mgr, tradeshopmaster.trade_shop_item_master_ids, userpoint) tradeshopitemmasters = BackendApi.get_tradeshopitemmaster_list( model_mgr, tradeshopmaster.trade_shop_item_master_ids) tradecount_data = BackendApi.get_tradeshopitem_tradecountdata( model_mgr, v_player.id, tradeshopitemmasters) model_mgr = db_util.run_in_transaction(self.tr_write, userdata, tradecount_data) model_mgr.write_end() self.writeAppHtml('tradeshop/top')
def __get_ap_max(self, ap_column_name): AP_MAX_CNAME = PlayerAp.AP_MAX_COLUMN_BASE % ap_column_name playerap = self.getModel(PlayerAp) if ap_column_name == PlayerAp.BP_COLUMN_NAME: # これはそのまま. return getattr(playerap, AP_MAX_CNAME) playerfriend = self.getModel(PlayerFriend) if playerap is None or playerfriend is None: raise CabaretError(u'行動力を操作するときはPlayerApとPlayerFriendをロードしてください.') return getattr(playerap, AP_MAX_CNAME) + playerfriend.friendnum
def process(self): args = self.getUrlArgs('/scoutcardget/') try: scoutid = int(args.get(0)) itemid = int(self.request.get(Defines.URLQUERY_ID, 0)) except: raise CabaretError(u'引数が想定外です', CabaretError.Code.ILLEGAL_ARGS) v_player = self.getViewerPlayer() model_mgr = self.getModelMgr() # アイテムの確認. itemmaster = None if itemid: if not itemid in Defines.ItemEffect.SCOUT_CARD_ITEMS: if settings_sub.IS_LOCAL: raise CabaretError(u'使用できないアイテムです') playdata = BackendApi.get_scoutprogress(model_mgr, v_player.id, [scoutid], using=settings.DB_READONLY).get(scoutid, None) if playdata: url = UrlMaker.scoutresult(scoutid, 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, v_player.id, scoutid, itemmaster, 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 process(self): args = self.getUrlArgs('/bossbattleanim/') try: # エリア. areaid = int(args.get(0, None)) self.setAreaID(areaid) battlekey = urllib.unquote(args.get(1))[:32] if not battlekey: raise except: raise CabaretError(u'引数が想定外です', CabaretError.Code.ILLEGAL_ARGS) model_mgr = self.getModelMgr() v_player = self.getViewerPlayer() uid = v_player.id using = settings.DB_READONLY # 結果. bossbattle = BackendApi.get_bossresult(model_mgr, uid, areaid, using=using) if bossbattle is None: if settings_sub.IS_LOCAL: raise CabaretError(u'結果が見つかりませんでした', CabaretError.Code.ILLEGAL_ARGS) self.callFunctionByFromPage('redirectToScoutTop') return # 演出用パラメータ. boss = self.getBossMaster() animdata = bossbattle.anim params = BackendApi.make_bossbattle_animation_params( self, animdata, boss.thumb) # ボス戦結果へのURL. params['backUrl'] = self.callFunctionByFromPage( 'getEffectBackUrl', bossbattle, battlekey) self.appRedirectToEffect('bossbattle2/effect.html', params)
def write_PRODUCEEVENTSCOUT(self, animdata, scoutkey): """書き込み """ model_mgr = self.getModelMgr() eventmaster = BackendApi.get_current_produce_event_master(model_mgr, using=settings.DB_READONLY) if eventmaster is None: raise CabaretError(u'Event Closed.', CabaretError.Code.EVENT_CLOSED) v_player = self.getViewerPlayer() area = self.getAreaMaster() boss = self.getBossMaster() return db_util.run_in_transaction(self.tr_event_write, eventmaster, v_player.id, area, boss, animdata, scoutkey, BackendApi.tr_produceevent_stage_clear)
def process(self): args = self.getUrlArgs('/raideventexplain/') str_eventid = str(args.get(0)) ope = args.get(1) model_mgr = self.getModelMgr() eventmaster = None mid = None if str_eventid.isdigit(): mid = int(str_eventid) eventmaster = BackendApi.get_raideventmaster( model_mgr, mid, using=settings.DB_READONLY) if eventmaster is None: raise CabaretError(u'閲覧できないイベントです', CabaretError.Code.ILLEGAL_ARGS) # 開催中判定. cur_eventmaster = self.getCurrentRaidEvent(quiet=True) if cur_eventmaster and cur_eventmaster.id == mid: is_opened = True else: is_opened = False self.html_param['is_opened'] = is_opened # イベント情報. config = BackendApi.get_current_raideventconfig( model_mgr, using=settings.DB_READONLY) self.html_param['raidevent'] = Objects.raidevent( self, eventmaster, config) # スコア. v_player = self.getViewerPlayer() scorerecord = BackendApi.get_raidevent_scorerecord( model_mgr, eventmaster.id, v_player.id, using=settings.DB_READONLY) rank = BackendApi.get_raidevent_rank(eventmaster.id, v_player.id) self.html_param['raideventscore'] = Objects.raidevent_score( eventmaster, scorerecord, rank) self.putEventTopic(mid, 'explain') self.html_param['current_topic'] = ope table = { 'detail': self.__proc_detail, 'prizes': self.__proc_prizes, 'nomination': self.__proc_nomination, 'faq': self.__proc_faq, } for k in table.keys(): self.html_param['url_explain_%s' % k] = self.makeAppLinkUrl( UrlMaker.raidevent_explain(mid, k)) table.get(ope, self.__proc_detail)(eventmaster, is_opened)
def getCurrentRaidTicketEvent(self, quiet=False): """現在チケット交換中のイベント. """ if self.__current_ticket_event is None: if self.__current_event: self.__current_ticket_event = self.__current_event else: model_mgr = self.getModelMgr() self.__current_ticket_event = BackendApi.get_current_ticket_raideventmaster(model_mgr, using=settings.DB_READONLY) if self.__current_ticket_event is None and not quiet: raise CabaretError(u'Event Closed.', CabaretError.Code.EVENT_CLOSED) return self.__current_ticket_event
def choice_bonus(self, rand=None): """おまけを選定. """ if not self.bonus or not isinstance(self.bonus, list): return [] elif not isinstance(self.bonus[0], dict): return self.bonus rand = rand or AppRandom() rate_total = sum([data.get('rate', 0) for data in self.bonus]) if rate_total < 1 or AppRandom.RAND_MAX <= rate_total: raise CabaretError(u'おまけの確率が壊れています', CabaretError.Code.INVALID_MASTERDATA) v = rand.getIntN(rate_total) for data in self.bonus: rate = data.get('rate', 0) v -= rate if 0 < rate and v <= 0: return data['prize'] raise CabaretError(u'想定外のバグです')
def __execFunction(self, condition_type, raise_on_notfound, prefix, *args, **kwargs): """各項目ごとの関数を実行. """ # 取得用メソッド. engname = Defines.PanelMissionCondition.ENG_NAMES.get(condition_type) func = getattr(self, '%s%s' % (prefix, engname), None) if func is None: if raise_on_notfound: raise CabaretError(u'未実装のパネルミッションです.%d' % condition_type) return None return func(*args, **kwargs)
def getShopBuyData(self, blank=False): """購入情報. """ if self.__buydata is None: v_player = self.getViewerPlayer() master = self.getShopMaster() model_mgr = self.getModelMgr() self.__buydata = BackendApi.get_shopbuydata(model_mgr, v_player.id, [master.id], using=settings.DB_READONLY).get(master.id) if self.__buydata is None and not blank: # 明らかに不正アクセス. raise CabaretError(u'不正なアクセスです', CabaretError.Code.ILLEGAL_ARGS) return self.__buydata
def getCurrentScoutEvent(self, quiet=False, do_check_schedule=True): """現在開催中のスカウトイベント. """ model_mgr = self.getModelMgr() eventmaster = BackendApi.get_current_scouteventmaster( model_mgr, using=settings.DB_READONLY, check_schedule=do_check_schedule) if not quiet and eventmaster is None: raise CabaretError(u'Event Closed.', CabaretError.Code.EVENT_CLOSED) return eventmaster
def execute(self, apcost): if self.is_end: raise CabaretError(u'スカウト実行:終了済み') elif self.ap < apcost: self.addEvent(Defines.ScoutEventType.AP_NONE, self.master.id) self.end() return elif ScoutExec.CONTINUITY_MAX <= self.__exec_cnt: # 一度強制終了. self.end() return self.__exec_cnt += 1 ap_pre = self.ap self.ap -= apcost gold_add = int( self.rand.getIntS(self.master.goldmin, self.master.goldmax) * (self.__title_effect_gold + 100) / 100) exp_add = int(self.master.exp * (self.__title_effect_exp + 100) / 100) # 設定期間中に経験値を指定倍率に上げる. if Defines.EXP_START_TIME <= OSAUtil.get_now() <= Defines.EXP_END_TIME: exp_add = int(exp_add * Defines.EXP_RATE_OVER) exp_pre = self.exp self.add_exp(exp_add) progress_pre = self.progress self.progress += 1 obj = ScoutExec.makeResultObject(self.__player.level, exp_pre, self.exp, exp_add, gold_add, ap_pre, self.ap, self.apmax, apcost, progress_pre, self.progress, self.master.execution) self.result.append(obj) # レベルアップ. if self.is_levelup: self.addEvent(Defines.ScoutEventType.LEVELUP, self.nextlevelexp.level) # クリア判定. if self.progress == self.master.execution: self.addEvent(Defines.ScoutEventType.COMPLETE, self.master.id) elif not self.is_end and (self.progress % Defines.SCOUT_EVENT_RATE) == 0: event = self.select_event() if event: self.addEvent(event) else: self.end()
def tr(): model_mgr = ModelRequestMgr() config = CurrentScoutEventConfig.getByKeyForUpdate( CurrentScoutEventConfig.SINGLE_ID) if getattr(config, att_prize_flag) != idx: raise CabaretError(u'整合が取れていないので終了します') for uid in uidlist: BackendApi.tr_add_prize(model_mgr, uid, prizelist, textid) setattr(config, att_prize_flag, idx + 1) model_mgr.set_save(config) model_mgr.write_all() return model_mgr, config
def getCurrentProduceEvent(self, quiet=False, check_schedule=True): """現在発生中のプロデュースイベント. """ if self.__current_event is None: model_mgr = self.getModelMgr() self.__current_event = BackendApi.get_current_produce_event_master( model_mgr, using=settings.DB_READONLY, check_schedule=check_schedule) if self.__current_event is None and not quiet: raise CabaretError(u'Event Closed.', CabaretError.Code.EVENT_CLOSED) return self.__current_event
def __find_produce_castmaster(self, model_mgr, produce_castmasters, current_rare): for produce_castmaster in produce_castmasters: card_master = produce_castmaster.get_card( model_mgr, using=settings.DB_READONLY) card_master_view = BackendApi.get_model(model_mgr, CardMasterView, card_master.id, using=settings.DB_READONLY) if card_master_view.rare == current_rare: return produce_castmaster raise CabaretError(u'レア度に対応するProduceCastMasterが存在しません', CabaretError.Code.ILLEGAL_ARGS)
def checkUser(self): self.osa_util.checkUser() # 認証. if settings_sub.IS_LOCAL: return elif self.request.host.startswith('10.116.41.'): return elif self.request.remote_addr.startswith('10.132.67.5'): return elif self.request.remote_addr in self.appparam.developer_ip: return elif not self.request.django_request.user.is_authenticated(): raise CabaretError(code=CabaretError.Code.NOT_AUTH)
def process(self): try: args = self.getUrlArgs('/bossbattle/') # エリア. areaid = int(args.get(0, None)) scoutkey = urllib.unquote(args.get(1))[:32] self.setAreaID(areaid) if not scoutkey: raise CabaretError() except: raise CabaretError(u'引数が想定外です', CabaretError.Code.ILLEGAL_ARGS) model_mgr = self.getModelMgr() using = settings.DB_READONLY # ボス情報. boss = self.getBossMaster() if boss is None or not self.checkBossBattleAble(model_mgr, using=using): if settings_sub.IS_LOCAL: raise CabaretError(u'まだこの街の太客には接客できません', CabaretError.Code.ILLEGAL_ARGS) self.callFunctionByFromPage('redirectToScoutTop') return # デッキのカード. cardlist = self.getDeckCardList() # 戦闘計算. _, animdata = BackendApi.bossbattle(cardlist, boss) # 書き込み. try: self.callFunctionByFromPage('write', animdata, scoutkey).write_end() except CabaretError, e: if e.code == CabaretError.Code.ALREADY_RECEIVED: pass else: raise
def createOpenedTreasure(treasure): """開封済みの宝箱を作成. """ model_cls = treasure.__class__ model_clsname = model_cls.__name__ model_opened_cls = globals().get('%sOpened' % model_clsname) if model_opened_cls is None: raise CabaretError(u'開封済みテーブルが存在しません.name=%s' % model_clsname) ins = model_opened_cls() for field in treasure.get_fields(): setattr(ins, field.name, getattr(treasure, field.name)) return ins
def procFree(self): """無料用フロー. """ args = self.getUrlArgs('/gachaanim/') try: mid = int(args.get(0)) key = urllib.unquote(args.get(1)) except: raise CabaretError(u'引数が想定外です', CabaretError.Code.ILLEGAL_ARGS) self.set_masterid(mid) v_player = self.getViewerPlayer() if v_player.req_alreadykey != key: # 結果が見当たらない. if settings_sub.IS_LOCAL: raise CabaretError(u'結果アニメを出せない') url = UrlMaker.gacha() self.appRedirect(self.makeAppLinkUrlRedirect(url)) return playdata = self.getGachaPlayData() self.writeSwf(playdata)
def processList(self, target): """一括設定. """ model_mgr = self.getModelMgr() try: # 選択したカード. cardidlist = list(set([int(strcardid) for strcardid in self.request.get(Defines.URLQUERY_CARD).split(',')])) if not cardidlist: raise CabaretError() except: raise CabaretError(u'設定できないキャストです', CabaretError.Code.ILLEGAL_ARGS) v_player = self.getViewerPlayer() if target == 'raid': # 書き込み. model_mgr = db_util.run_in_transaction(Handler.tr_write_raid, v_player, cardidlist) else: # 書き込み. model_mgr = db_util.run_in_transaction(Handler.tr_write, v_player, cardidlist) model_mgr.write_end()
def getGameLog(log_data): # ゲームログのタイプとクラスをマッピング. cls = None if isinstance(log_data, FriendLogList): func = getFriendLogCls # if isinstance(log_data, PlayerLog): # func = getPlayerLogCls if func: cls = func(log_data.logtype) if cls is None: raise CabaretError(u'未実装の%s:%s' % (log_data.__class__.__name__, log_data.logtype)) return cls(log_data)
def sendRankingPrize(ranking_cls, rankingprizes, textid, att_prize_flag): for idx, data in enumerate(rankingprizes): if idx < getattr(config, att_prize_flag): print 'skip...%d' % idx continue prizeidlist = data['prize'] rank_min = data['rank_min'] rank_max = data['rank_max'] prizelist = BackendApi.get_prizelist(model_mgr, prizeidlist) uidlist = [] for rank in xrange(rank_min, rank_max + 1): data = ranking_cls.fetchByRank(eventmaster.id, rank, zero=False) dic = dict(data) uidlist.extend(dic.keys()) if len(set(uidlist)) != len(uidlist): raise CabaretError(u'ランキング取得がなにかおかしい..%d' % rank) def tr(): model_mgr = ModelRequestMgr() config = CurrentBattleEventConfig.getByKeyForUpdate( CurrentBattleEventConfig.SINGLE_ID) if getattr(config, att_prize_flag) != idx: raise CabaretError(u'整合が取れていないので終了します') for uid in uidlist: BackendApi.tr_add_prize(model_mgr, uid, prizelist, textid) setattr(config, att_prize_flag, idx + 1) model_mgr.set_save(config) model_mgr.write_all() return model_mgr, config try: tmp_model_mgr, wrote_config = db_util.run_in_transaction( tr) except CabaretError, err: print 'error...%s' % err.value return print 'save end...%d' % idx tmp_model_mgr.write_end() print 'cache end...%d' % idx setattr(config, att_prize_flag, getattr(wrote_config, att_prize_flag))
def procGachaDo(self, master_id, buy_count, payment_id): """ガチャ実行. 決済情報を確認して課金レコードを作成. """ try: mid = int(master_id) # buynum = int(buy_count) except: raise CabaretError(u'引数が想定外です', CabaretError.Code.ILLEGAL_ARGS) self.set_gacha_masterid(mid) now = OSAUtil.get_now() # 基本的なチェックはここにくるまでに終わっている model_mgr = self.getModelMgr() v_player = self.getViewerPlayer() master = self.getGachaMaster() playcount = self.getGachaPlayCount() seatplaydata = BackendApi.get_gachaseatmodels_by_gachamaster(model_mgr, v_player.id, master, do_get_result=False, using=settings.DB_READONLY).get('playdata') is_first = 0 < BackendApi.get_gacha_firstplay_restnum(master, playcount, now, seatplaydata=seatplaydata) continuity = BackendApi.get_gacha_continuity_num(model_mgr, master, v_player, is_first) price = BackendApi.get_consumevalue(master, continuity, is_first, playcount, seatplaydata=seatplaydata) stock = BackendApi.get_gacha_stock(model_mgr, master, playcount, using=settings.DB_READONLY) if stock is not None and stock < 1: # これ以上引き抜けない. self.response.clear() self.response.set_status(500) self.response.end() return sku_id = '%s%s' % (Handler.PAYMENT_TYPE_GACHA, master_id) item = PaymentItem() item.itemId = sku_id item.unitPrice = price item.quantity = 1 self.checkPaymentRecord(payment_id, [item]) if self.response.isEnd: 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_gacha, v_player, paymentdata, continuity, now) mgr.write_end()
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.produceevent_scoutcardgetresult(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) # 獲得判定へ飛ぶ. url = UrlMaker.produceevent_scoutcardget(stagemaster.id) self.html_param['url_exec'] = self.makeAppLinkUrl(url) # アイテム. BackendApi.put_scoutcard_uselead_info( self, UrlMaker.produceevent_scoutcardget(stagemaster.id)) self.html_param['num_key'] = Defines.URLQUERY_NUMBER self.writeHtml(self.eventmaster, 'scout/cardget')