Пример #1
0
    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')
Пример #2
0
    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
Пример #3
0
 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()
Пример #4
0
    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
Пример #5
0
 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
Пример #6
0
    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')
Пример #7
0
    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
Пример #8
0
 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')
Пример #9
0
    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()
Пример #10
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.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)
Пример #11
0
    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)
Пример #12
0
    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
Пример #13
0
    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)
Пример #14
0
    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
Пример #15
0
    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)
Пример #16
0
    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))
Пример #17
0
    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)
Пример #18
0
    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
Пример #19
0
    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))
Пример #20
0
    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)
Пример #21
0
 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'署名を確認できません')
Пример #22
0
    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')
Пример #23
0
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)
Пример #24
0
 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')
Пример #25
0
    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')
Пример #26
0
    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))
Пример #27
0
    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)
Пример #28
0
    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
Пример #29
0
 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)
Пример #30
0
 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()