示例#1
0
文件: do.py 项目: hitandaway100/caba
    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
示例#2
0
    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'存在しない秘宝交換が設定されています')
示例#3
0
 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
示例#4
0
 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')
示例#5
0
 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
示例#6
0
 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
示例#7
0
    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')
示例#8
0
    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
示例#9
0
 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
示例#10
0
    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)
示例#11
0
    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)
示例#12
0
    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)
示例#13
0
 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
示例#14
0
    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'想定外のバグです')
示例#15
0
 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)
示例#16
0
 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
示例#17
0
 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
示例#18
0
    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()
示例#19
0
 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
示例#20
0
 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
示例#21
0
 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)
示例#22
0
 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)
示例#23
0
    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
示例#24
0
    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
示例#25
0
    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)
示例#26
0
 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()
示例#27
0
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)
示例#28
0
        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))
示例#29
0
    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()
示例#30
0
    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')