def tr_migrate_cards():
                print "migrating cards to uid : %d" % uid2
                model_mgr = ModelRequestMgr()
                player1_cardlist = BackendApi.get_card_list(
                    uid1, arg_model_mgr=model_mgr, using=backup_db)
                cardidlist = [card.master.id for card in player1_cardlist]
                prizelist = [
                    PrizeData.create(cardid=cardid, cardnum=1)
                    for cardid in cardidlist
                ]

                for prize in prizelist:
                    BackendApi.tr_add_prize(model_mgr, uid2, [prize], 0)
                    model_mgr.write_all()

                print "finished migrating cards"

                print "========================"
                print "Migrating album data"
                print "========================"
                userlog = UserLogEvolution.fetchValues(filters={'uid': uid1},
                                                       using=backup_db)
                cardidlist = [log.data['base']['mid'] for log in userlog]
                cardmasters = BackendApi.get_cardmasters(cardidlist,
                                                         model_mgr,
                                                         using=backup_db)
                print "ID of cards previously gotten through evolution (ハメ管理):", cardidlist

                # set card acquisition and album acquisition for these cards
                for _, master in cardmasters.items():
                    BackendApi.tr_set_cardacquisition(model_mgr, uid2, master)

                model_mgr.write_all()

                return model_mgr
Exemple #2
0
 def tr_send_point(uid, starttime):
     """名誉ポイントの配布.
     """
     model_mgr = ModelRequestMgr()
     scoredata_weekly = CabaClubScorePlayerDataWeekly.getByKeyForUpdate(
         CabaClubScorePlayerDataWeekly.makeID(
             uid, starttime))
     if scoredata_weekly is None or scoredata_weekly.flag_aggregate:
         return 0
     # 配布する数を計算.
     cabaclub_honor = int(
         math.ceil(scoredata_weekly.proceeds / 1000.0))
     if 0 < cabaclub_honor:
         # 報酬付与.
         prizedata = PrizeData.create(
             cabaclub_honor=cabaclub_honor)
         BackendApi.tr_add_prize(
             model_mgr, uid, [prizedata],
             Defines.TextMasterID.CABARETCLUB_WEEKLY_PRIZE)
     # 重複防止.
     scoredata_weekly.flag_aggregate = True
     model_mgr.set_save(scoredata_weekly)
     model_mgr.write_all()
     model_mgr.write_end()
     return cabaclub_honor
    def tr_exchange_item(self, uid, eventmaster, num):
        model_mgr = ModelRequestMgr()

        BackendApi.tr_add_item(model_mgr, uid, eventmaster.useitem, -num)

        prizelist = [PrizeData.create(itemid=eventmaster.changeitem, itemnum=num)]
        TEXTID = 252
        BackendApi.tr_add_prize(model_mgr, uid, prizelist, TEXTID)

        model_mgr.write_all()
        model_mgr.write_end()
        def tr_trade(raideventscore_id):
            model_mgr = ModelRequestMgr()
            raideventscore = RaidEventScore.getByKeyForUpdate(
                raideventscore_id)
            ticket = raideventscore.ticket
            if ticket < 1:
                raise CabaretError('zero', CabaretError.Code.ALREADY_RECEIVED)

            # キャバゴールドを配布.
            prize = PrizeData.create(gold=ticket * GOLD)
            BackendApi.tr_add_prize(model_mgr, raideventscore.uid, [prize],
                                    message_id)

            # チケットを0に.
            raideventscore.ticket = 0
            model_mgr.set_save(raideventscore)

            model_mgr.write_all()

            return model_mgr, prize.gold
    def handle(self, *args, **options):
        print '================================'
        print 'send_owabi'
        print '================================'
        model_mgr = ModelRequestMgr()

        is_write = (args[0] if args else '0') == '1'
        print "write:%s" % is_write

        receivelogs = UserLogPresentReceive.fetchValues(filters={
            'ctime__gt':
            '2016-04-21 16:00:00',
            'ctime__lt':
            '2016-04-21 16:20:00'
        },
                                                        using=backup_db)
        presentlist = []
        for log in receivelogs:
            presentdata = UserLogPresentSend.fetchValues(filters={
                'uid':
                log.uid,
                'ctime__gt':
                '2016-04-21 15:00:00',
                'ctime__lt':
                '2016-04-21 16:00:00'
            },
                                                         using=backup_db)
            for sendlog in presentdata:
                if log.presentid == sendlog.presentid and Defines.ItemType.ADDITIONAL_GACHATICKET == sendlog.itype:
                    print sendlog.itype, sendlog.ivalue, sendlog.inum
                    prizelist = [
                        log.uid,
                        [
                            PrizeData.create(
                                additional_ticket_id=sendlog.ivalue,
                                additional_ticket_num=sendlog.inum)
                        ]
                    ]
                    presentlist.append(prizelist)
        self.send_owabi(presentlist, is_write)
Exemple #6
0
    def procDetail(self, helplog):
        """詳細.
        """
        model_mgr = self.getModelMgr()

        v_player = self.getViewerPlayer()

        # レイド情報.
        raidboss = BackendApi.get_raid(model_mgr,
                                       helplog.raidid,
                                       using=settings.DB_READONLY,
                                       get_instance=True)
        is_owner = v_player.id == raidboss.raid.oid
        if not (is_owner
                or v_player.id in raidboss.getDamageRecordUserIdList()):
            # 閲覧できない.
            self.appRedirect(self.makeAppLinkUrlRedirect(UrlMaker.happening()))
            return

        damagerecord = raidboss.getDamageRecord(v_player.id)

        is_cleared = raidboss.raid.hp == 0
        is_canceled = False

        prizelist = None

        # ハプニング情報.
        happeningset = BackendApi.get_happening(model_mgr,
                                                raidboss.id,
                                                using=settings.DB_READONLY)
        if happeningset is None:
            BackendApi.save_raidlog_idlist(model_mgr,
                                           v_player.id,
                                           using=settings.DB_READONLY)
            url = UrlMaker.raidloglist()
            self.appRedirect(self.makeAppLinkUrlRedirect(url))
            return

        # イベント情報を設定.
        BackendApi.reset_raidboss_eventraidmaster(model_mgr,
                                                  raidboss,
                                                  happeningset.happening.event,
                                                  using=settings.DB_READONLY)

        raideventmaster = None
        excludes = None
        raideventid = HappeningUtil.get_raideventid(
            happeningset.happening.event)
        if raideventid:
            raideventmaster = BackendApi.get_raideventmaster(
                model_mgr, raideventid, using=settings.DB_READONLY)

            destroypoint_info = None

            if is_cleared:
                bonusscore = 0
                if happeningset.happening.oid == v_player.id:
                    specialscore_obj = BackendApi.get_model(
                        model_mgr,
                        RaidEventSpecialBonusScoreLog,
                        raidboss.id,
                        using=settings.DB_READONLY)
                    if isinstance(specialscore_obj,
                                  RaidEventSpecialBonusScoreLog):
                        bonusscore = specialscore_obj.bonusscore
                else:
                    _helpbonusscore = BackendApi.get_raidevent_helpspecialbonusscore(
                        raidboss.id, v_player.id, using=settings.DB_DEFAULT)
                    if isinstance(_helpbonusscore,
                                  RaidEventHelpSpecialBonusScore):
                        bonusscore = _helpbonusscore.bonusscore
                destroypoint_info = BackendApi.make_raidevent_destroypoint_info(
                    model_mgr,
                    v_player.id,
                    raideventmaster,
                    HappeningRaidSet(happeningset, raidboss),
                    bonusscore,
                    using=settings.DB_READONLY)

                # MVP.
                mvp_uidlist = raidboss.getMVPList()
                self.html_param['mvp_uidlist'] = mvp_uidlist

                self.html_param['destroy_time'] = helplog.ctime

            # イベント情報.
            config = BackendApi.get_current_raideventconfig(
                model_mgr, using=settings.DB_READONLY)
            self.html_param['raidevent'] = Objects.raidevent(
                self, raideventmaster, config)

            # シャンパン.
            if 0 < damagerecord.champagne_num_add:
                self.html_param[
                    'champagne_num_pre'] = damagerecord.champagne_num_pre
                self.html_param[
                    'champagne_num_post'] = damagerecord.champagne_num_post
                self.html_param[
                    'champagne_num_add'] = damagerecord.champagne_num_add

            # 素材.
            if 0 < damagerecord.material_num:
                materials = raideventmaster.getMaterialDict()
                material_id = materials.get(
                    raidboss.raideventraidmaster.material)
                if material_id:
                    materialmaster = BackendApi.get_raidevent_materialmaster(
                        model_mgr, material_id, using=settings.DB_READONLY)
                    materialnumdata = BackendApi.get_raidevent_materialdata(
                        model_mgr, v_player.id, using=settings.DB_READONLY)
                    obj = Objects.raidevent_material(
                        self, materialmaster,
                        materialnumdata.getMaterialNum(
                            raideventid,
                            raidboss.raideventraidmaster.material))
                    obj['num_add'] = damagerecord.material_num
                    self.html_param['material'] = obj

            self.html_param['destroypoint_info'] = destroypoint_info
        elif raidboss.scouteventraidmaster:
            scouteventid = raidboss.scouteventraidmaster.eventid
            tanzaku_number = raidboss.get_tanzaku_number(v_player.id)
            tanzakumaster = BackendApi.get_scoutevent_tanzakumaster(
                model_mgr,
                scouteventid,
                tanzaku_number,
                using=settings.DB_READONLY
            ) if tanzaku_number is not None else None

            if tanzakumaster is not None:
                # 短冊.
                self.html_param[
                    'scoutevent_tanzaku'] = Objects.scoutevent_tanzaku(
                        self, tanzakumaster)
                self.html_param[
                    'tanzaku_num_pre'] = damagerecord.tanzaku_num_pre
                self.html_param[
                    'tanzaku_num_post'] = damagerecord.tanzaku_num_post
                self.html_param['tanzaku_num_add'] = damagerecord.tanzaku_num

        if raideventmaster or RaidBoss.RAIDEVENT_PRIZE_UPDATETIME <= happeningset.happening.ctime:
            if is_cleared:
                # 報酬.
                prizelist = []
                if is_owner:
                    # 発見者.
                    if raideventmaster:
                        cabaretking = raidboss.get_cabaretking()
                        if 0 < cabaretking:
                            prizelist.append(
                                PrizeData.create(cabaretking=cabaretking))
                    prizelist.extend(
                        BackendApi.get_prizelist(model_mgr,
                                                 raidboss.master.prizes,
                                                 using=settings.DB_READONLY))
                    prizelist.extend(
                        BackendApi.aggregate_happeningprize(
                            happeningset.happening))
                elif 0 < damagerecord.damage_cnt:
                    # 救援者.
                    if raideventmaster:
                        demiworld = raidboss.get_demiworld()
                        if 0 < demiworld:
                            prizelist.append(
                                PrizeData.create(demiworld=demiworld))
                    prizelist = BackendApi.get_prizelist(
                        model_mgr,
                        raidboss.master.helpprizes,
                        using=settings.DB_READONLY)
            elif happeningset.happening.is_canceled(
            ) and v_player.id == happeningset.happening.oid:
                # キャンセル.
                prizelist = BackendApi.aggregate_happeningprize(
                    happeningset.happening, cancel=True)
                is_canceled = True

        # ダメージ履歴.
        func_put_attacklog = self.putRaidAttackLog(raidboss, excludes=excludes)

        prizeinfo = None
        if prizelist:
            prizeinfo = BackendApi.make_prizeinfo(self,
                                                  prizelist,
                                                  using=settings.DB_READONLY)

        persons = {}
        dmmid = ''
        if not is_owner:
            o_players = BackendApi.get_players(self,
                                               [happeningset.happening.oid],
                                               [],
                                               using=settings.DB_READONLY)
            if o_players:
                o_player = o_players[0]
                dmmid = o_player.dmmid
                persons = BackendApi.get_dmmplayers(self,
                                                    o_players,
                                                    using=settings.DB_READONLY,
                                                    do_execute=False)

        self.html_param['player'] = Objects.player(self, v_player)

        self.html_param['is_cleared'] = is_cleared
        self.html_param['is_canceled'] = is_canceled

        self.execute_api()

        self.html_param['happening'] = Objects.happening(
            self,
            HappeningRaidSet(happeningset, raidboss),
            prizeinfo,
            o_person=persons.get(dmmid))

        if func_put_attacklog:
            func_put_attacklog()

        self.setFromPage(Defines.FromPages.RAIDLOG, helplog.id)
        self.html_param['url_trade'] = self.makeAppLinkUrl(UrlMaker.trade(),
                                                           add_frompage=True)

        self.writeHtmlSwitchEvent('log',
                                  eventmaster=raideventmaster,
                                  basedir_normal='raid')
Exemple #7
0
    def putHappeningInfo(self, happeningset, raidboss, do_execute=True):
        """ハプニング情報作成.
        """
        model_mgr = self.getModelMgr()

        v_player = self.getViewerPlayer()
        o_player = None
        is_owner = v_player.id == happeningset.happening.oid

        prizelist = []
        if 0 < happeningset.happening.event:
            if not raidboss.raideventraidmaster:
                eventraidmaster = BackendApi.get_eventraidmaster_by_modeleventvalue(
                    model_mgr,
                    happeningset.happening.event,
                    raidboss.raid.mid,
                    using=settings.DB_READONLY)
                raidboss.setEventRaidMaster(eventraidmaster)

            if raidboss.raid.hp < 1 and RaidBoss.RAIDEVENT_PRIZE_UPDATETIME <= happeningset.happening.ctime:
                damagerecord = raidboss.getDamageRecord(v_player.id)
                # 報酬.
                if is_owner:
                    # 発見者.
                    cabaretking = raidboss.get_cabaretking()
                    if 0 < cabaretking:
                        prizelist.append(
                            PrizeData.create(cabaretking=cabaretking))
                    prizelist.extend(
                        BackendApi.get_prizelist(model_mgr,
                                                 raidboss.master.prizes,
                                                 using=settings.DB_READONLY))
                    prizelist.extend(
                        BackendApi.aggregate_happeningprize(
                            happeningset.happening))

                    # ドロップアイテム報酬
                    if happeningset.happening.items:
                        dropitems = [
                            happening.id for happening in
                            happeningset.happening.items['dropitems']
                        ]
                        prizelist.extend(
                            BackendApi.get_prizelist(
                                model_mgr,
                                dropitems,
                                using=settings.DB_READONLY))
                elif 0 < damagerecord.damage_cnt:
                    # 救援者.
                    demiworld = raidboss.get_demiworld()
                    if 0 < demiworld:
                        prizelist.append(PrizeData.create(demiworld=demiworld))
                    prizelist.extend(
                        BackendApi.get_prizelist(model_mgr,
                                                 raidboss.master.helpprizes,
                                                 using=settings.DB_READONLY))

        # 獲得した報酬.
        if is_owner:
            prizelist.extend(
                self.getPooledPrizeList(happeningset.happening.is_canceled()))
            o_player = v_player
        else:
            o_player = BackendApi.get_players(self,
                                              [happeningset.happening.oid], [],
                                              using=settings.DB_READONLY)[0]

        prizeinfo = None
        if prizelist:
            prizeinfo = BackendApi.make_prizeinfo(self,
                                                  prizelist,
                                                  using=settings.DB_READONLY)

        persons = BackendApi.get_dmmplayers(self, [o_player],
                                            using=settings.DB_READONLY,
                                            do_execute=do_execute)

        def cb():
            # ハプニング情報.
            obj_happening = Objects.happening(
                self, HappeningRaidSet(happeningset, raidboss), prizeinfo,
                persons.get(o_player.dmmid))
            self.html_param['happening'] = obj_happening
            return obj_happening

        if do_execute:
            self.execute_api()
            return cb()
        else:
            return cb
Exemple #8
0
    def process(self):
        args = self.getUrlArgs('/gachaseatanim/')
        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

        uid = v_player.id

        model_mgr = self.getModelMgr()

        seatmodels = self.getSeatModels(True)
        seatmaster = seatmodels.get('seatmaster')
        seatplaycount = seatmodels.get('playcount')
        seatplaydata = seatmodels.get('playdata')
        gachamaster = BackendApi.get_gachamaster(model_mgr, mid)

        tableid = gachamaster.seattableid
        tablemaster = None
        if tableid:
            tablemaster = BackendApi.get_gachaseattablemaster(
                model_mgr, tableid, using=settings.DB_DEFAULT)

        def _get_playdata(mid):
            return BackendApi.get_gachaseatplaydata(
                model_mgr,
                uid, [mid],
                get_instance=True,
                using=settings.DB_DEFAULT).get(mid)

        if seatplaydata.is_first() and 0 < seatplaycount.lap:
            oldlap_mid = tablemaster.getSeatId(seatplaycount.lap)
            seatmaster = BackendApi.get_gachaseatmaster(
                model_mgr, oldlap_mid, using=settings.DB_DEFAULT)
            seatplaydata = _get_playdata(oldlap_mid)

        if seatmaster is None or seatplaydata is None or seatplaycount is None:
            # シートの演出を表示できない結果が見当たらない.
            if settings_sub.IS_LOCAL:
                raise CabaretError(u'結果アニメを出せない')
            url = UrlMaker.gacha()
            self.appRedirect(self.makeAppLinkUrlRedirect(url))
            return

        params = {
            'prefix': self.url_static_img,
        }

        # 表示するアイテムの画像URL.
        flags = {}
        prize_map = {}
        idx = 0
        allempty = True
        allend = True

        while True:
            prizeid = seatmaster.getPrizeId(idx)
            if prizeid is None:
                break
            weight = seatmaster.getWeight(idx)
            if prizeid and weight:
                if seatplaydata.getFlag(idx):
                    allempty = False
                    flags[idx] = True
                else:
                    allend = False
                    flags[idx] = False
                prize_map[prizeid] = None
            idx += 1

        if allempty and 0 < seatplaycount.lap:
            allend = True

        for prizemaster in BackendApi.get_prizemaster_list(
                model_mgr, prize_map.keys(), using=settings.DB_READONLY):
            prize_map[prizemaster.id] = PrizeData.createByMaster(prizemaster)

        for i in xrange(idx):
            flag = flags.get(i, None)
            if flag is None:
                continue

            prizeid = seatmaster.getPrizeId(i)
            prize = prize_map.get(prizeid)
            if not prize:
                continue

            thumb = seatmaster.getThumb(i)

            if not thumb:
                presentlist = BackendApi.create_present_by_prize(
                    model_mgr,
                    uid, [prize],
                    0,
                    using=settings.DB_READONLY,
                    do_set_save=False)
                if not presentlist:
                    continue

                presentlist = presentlist[:1]
                presentset = PresentSet.presentToPresentSet(
                    model_mgr, presentlist, using=settings.DB_READONLY)[0]
                thumb = presentset.itemthumbnail_rect_middle

            params['i%02d' % i] = thumb
            params['f%02d' %
                   i] = 1 if (allend or flag) and i != seatplaydata.last else 0

        # 選択されたアイテムのindex.
        if params.get('i%02d' % seatplaydata.last) is None:
            # シートの演出を表示できない.
            if settings_sub.IS_LOCAL:
                raise CabaretError(u'結果が存在しない')
            url = UrlMaker.gacha()
            self.appRedirect(self.makeAppLinkUrlRedirect(url))
            return
        params['idx'] = seatplaydata.last

        # ロゴ画像.
        params['logoPre'] = self.makeAppLinkUrlImg(seatmaster.img_effect)

        # 遷移先.
        url = UrlMaker.gacharesult(self.gachamaster_id,
                                   v_player.req_alreadykey)
        params['backUrl'] = self.makeAppLinkUrl(url)

        self.appRedirectToEffect('%s/effect.html' % seatmaster.effectname,
                                 params)
    def handle(self, *args, **options):

        print '================================'
        print 'recov_raidevent_destroyprize'
        print '================================'

        TEST_MODE = True

        LIMIT = 500

        # 対象のイベント.
        mid = 7
        master = RaidEventMaster.getByKey(mid)
        textid = master.destroyprize_text

        # 対象の討伐回数.
        destroy = 200

        # 配付する報酬.
        prize = PrizeData.create(cardid=13100, cardnum=1)

        offset = 0
        while True:
            # 撃破済みのユーザーを取得.
            scorelist = RaidEventScore.fetchValues(filters={
                'mid': mid,
                'destroy__gte': destroy
            },
                                                   order_by='id',
                                                   limit=LIMIT,
                                                   offset=offset)
            if not scorelist:
                break

            offset += LIMIT

            idlist = [
                RaidEventFlags.makeID(score.uid, mid) for score in scorelist
            ]
            flags = RaidEventFlags.getByKey(idlist)
            for flag in flags:
                # 受け取りフラグを確認.
                if not destroy in flag.destroyprize_flags:
                    # 未受け取り.
                    print '%s...no' % flag.uid
                    continue

                # 配布.
                if not TEST_MODE:

                    def tr(uid, mid, prize, textid):
                        model_mgr = ModelRequestMgr()
                        BackendApi.tr_add_prize(model_mgr, uid, [prize],
                                                textid)
                        model_mgr.write_all()
                        return model_mgr

                    db_util.run_in_transaction(tr, flag.uid, mid, prize,
                                               textid).write_end()
                print '%s...send' % flag.uid

        print '================================'
        print 'all done..'
Exemple #10
0
 def getItemList(self, num=1):
     """設定されているアイテム.
     """
     items = {}
     for i in xrange(ShopItemMaster.ITEM_LENGTH):
         itype = getattr(self, 'itype%d' % i)
         iid = getattr(self, 'iid%d' % i)
         inum = getattr(self, 'inum%d' % i) * num
         key = (itype << 32) + iid
         if inum == 0:
             continue
         elif itype == Defines.ItemType.CARD and 0 < iid:
             prize = items.get(key) or PrizeData.create(cardid=iid, cardnum=0)
             prize.cardnum += inum
             items[key] = prize
         elif itype == Defines.ItemType.ITEM and 0 < iid:
             prize = items.get(key) or PrizeData.create(itemid=iid, cardnum=0)
             prize.itemnum += inum
             items[key] = prize
         elif itype == Defines.ItemType.RAREOVERTICKET:
             prize = items.get(key) or PrizeData.create()
             prize.rareoverticket += inum
             items[key] = prize
         elif itype == Defines.ItemType.TRYLUCKTICKET:
             prize = items.get(key) or PrizeData.create()
             prize.ticket += inum
             items[key] = prize
         elif itype == Defines.ItemType.MEMORIESTICKET:
             prize = items.get(key) or PrizeData.create()
             prize.memoriesticket += inum
             items[key] = prize
         elif itype == Defines.ItemType.GACHATICKET:
             prize = items.get(key) or PrizeData.create()
             prize.gachaticket += inum
             items[key] = prize
         elif itype == Defines.ItemType.GOLDKEY:
             prize = items.get(key) or PrizeData.create()
             prize.goldkey += inum
             items[key] = prize
         elif itype == Defines.ItemType.GOLDKEY:
             prize = items.get(key) or PrizeData.create()
             prize.goldkey += inum
             items[key] = prize
         elif itype == Defines.ItemType.SILVERKEY:
             prize = items.get(key) or PrizeData.create()
             prize.silverkey += inum
             items[key] = prize
         elif itype == Defines.ItemType.EVENT_GACHATICKET:
             prize = items.get(key) or PrizeData.create(eventticket_id=iid)
             prize.eventticket_num += inum
             items[key] = prize
         elif itype == Defines.ItemType.CABARETCLUB_SPECIAL_MONEY:
             prize = items.get(key) or PrizeData.create()
             prize.cabaclub_money += inum
             items[key] = prize
         elif itype == Defines.ItemType.CABARETCLUB_HONOR_POINT:
             prize = items.get(key) or PrizeData.create()
             prize.cabaclub_honor += inum
             items[key] = prize
         else:
             raise CabaretError(u'商品設定に誤りがあります.id=%d' % self.id, CabaretError.Code.INVALID_MASTERDATA)
     return items.values()