コード例 #1
0
    def __valid_master(self, master):
        master.id = RaidEventRaidMaster.makeID(master.eventid, master.mid)

        if not master.is_public:
            return

        model_mgr = self.getModelMgr()

        if BackendApi.get_raideventmaster(model_mgr, master.eventid) is None:
            raise ModelEditValidError(
                u'存在しないイベントが設定されています.raideventraid=%d,%d' %
                (master.eventid, master.mid))
        elif BackendApi.get_raid_master(model_mgr, master.mid) is None:
            raise ModelEditValidError(
                u'存在しないレイドが設定されています.raideventraid=%d,%d' %
                (master.eventid, master.mid))

        midlist = dict(master.specialcard).keys()
        if len(midlist) != len(master.specialcard):
            raise ModelEditValidError(u'ご指名キャストが重複しています.raideventraid=%d,%d' %
                                      (master.eventid, master.mid))
        elif len(CardMaster.getByKey(midlist)) != len(midlist):
            raise ModelEditValidError(
                u'存在しないキャストがご指名されています.raideventraid=%d,%d' %
                (master.eventid, master.mid))
コード例 #2
0
ファイル: default_card.py プロジェクト: hitandaway100/caba
    def valid_write_end(self):
        master_all = {}
        for master in DefaultCardMaster.fetchValues(
                filters={'ctype__in': Defines.CharacterType.NAMES.keys()}):
            master_all[master.ctype] = master

        card_all = {}
        for card in CardMaster.fetchValues():
            card_all[card.id] = card

        errors = []
        for ctype, name in Defines.CharacterType.NAMES.items():
            master = master_all.get(ctype)
            if master is None:
                continue
            if card_all.get(master.leader) is None:
                errors.append(u'タイプ:%sの初期リーダーカードが存在しません' % name)
            for mid in master.members:
                if card_all.get(mid) is None:
                    errors.append(u'タイプ:%sの初期デッキに存在しないカードが含まれています' % name)
            for mid in master.box:
                if card_all.get(mid) is None:
                    errors.append(u'タイプ:%sの初期BOXカードに存在しないカードが含まれています' % name)
        if errors:
            raise ModelEditValidError('<br />'.join(errors))
コード例 #3
0
ファイル: memories.py プロジェクト: hitandaway100/caba
    def __valid_master(self, master):
        if not master.is_public:
            return
        elif CardMaster.getValuesByKey(master.cardid) is None:
            raise ModelEditValidError(u'思いで開放に必要なカードが存在しません.id=%d, card=%d' %
                                      (master.id, master.cardid))
        if master.contenttype == Defines.MemoryContentType.MOVIE and not settings_sub.IS_LOCAL and not settings_sub.IS_DEV:
            if not str(master.contentdata).isdigit(
            ) or not MoviePlayList.getByKey(int(master.contentdata)):
                raise ModelEditValidError(u'存在しない動画が設定されています.id=%d' %
                                          master.id)
        if master.contenttype == Defines.MemoryContentType.MOVIE_PC and not settings_sub.IS_LOCAL and not settings_sub.IS_DEV:
            if not str(master.contentdata).isdigit(
            ) or not PcMoviePlayList.getByKey(int(master.contentdata)):
                raise ModelEditValidError(u'存在しない動画が設定されています.id=%d' %
                                          master.id)
        if master.contenttype == Defines.MemoryContentType.VOICE and not settings_sub.IS_LOCAL:
            if not str(master.contentdata).isdigit(
            ) or not VoicePlayList.getByKey(int(master.contentdata)):
                raise ModelEditValidError(u'存在しない音声が設定されています.id=%d' %
                                          master.id)

        if self.valid_error_num < 10:
            for record in self.allmasters:
                if master.id == record.id:
                    self.valid_error_num += 1
                    raise ModelEditValidError(u'IDが重複しています.id={}'.format(
                        master.id))
コード例 #4
0
 def validate(self):
     master = None
     if self.itype == Defines.ItemType.CARD:
         master = CardMaster.getByKey(self.mid)
     elif self.itype == Defines.ItemType.ITEM:
         master = ItemMaster.getByKey(self.mid)
     if master is None:
         raise CabaretError(u'存在しないマスターがドロップアイテムテーブルに設定されています.')
コード例 #5
0
ファイル: rediscache.py プロジェクト: hitandaway100/caba
 def get(cls, album, hklevel):
     redisdb = cls.getDB()
     mid = redisdb.hget(cls.KEY, CardMaster.makeAlbumHklevel(album, hklevel))
     if mid and str(mid).isdigit():
         mid = int(mid)
     else:
         mid = None
     return mid
コード例 #6
0
    def __valid_master(self, master):
        if not master.is_public:
            return

        model_mgr = self.getModelMgr()

        if not isinstance(master.rankingprizes, list):
            raise ModelEditValidError(u'ランキング報酬のJsonが壊れています.scoutevent=%d' %
                                      master.id)
        for data in master.rankingprizes:
            diff = set(['prize', 'rank_min', 'rank_max']) - set(data.keys())
            if diff:
                raise ModelEditValidError(
                    u'ランキング報酬に想定外のデータが含まれています.scoutevent=%d' % master.id)
            self.checkPrize(master, data['prize'], u'ランキング報酬', u'scoutevent')

        master.beginer_rankingprizes = master.beginer_rankingprizes or []
        if not isinstance(master.beginer_rankingprizes, list):
            raise ModelEditValidError(u'新店舗ランキング報酬のJsonが壊れています.scoutevent=%d' %
                                      master.id)
        for data in master.beginer_rankingprizes:
            diff = set(['prize', 'rank_min', 'rank_max']) - set(data.keys())
            if diff:
                raise ModelEditValidError(
                    u'新店舗ランキング報酬に想定外のデータが含まれています.scoutevent=%d' % master.id)
            self.checkPrize(master, data['prize'], u'新店舗ランキング報酬',
                            u'scoutevent')

        if not isinstance(master.pointprizes, (dict, list)):
            raise ModelEditValidError(u'ポイント達成報酬のJsonが壊れています.scoutevent=%d' %
                                      master.id)
        for prizeidlist in master.get_pointprizes().values():
            self.checkPrize(master, prizeidlist, u'ポイント達成報酬', u'scoutevent')

        midlist = dict(master.specialcard).keys()
        if len(midlist) != len(master.specialcard):
            raise ModelEditValidError(u'ご指名キャストが重複しています.scoutevent=%d' %
                                      master.id)
        elif len(CardMaster.getByKey(midlist)) != len(midlist):
            raise ModelEditValidError(u'存在しないキャストがご指名されています.scoutevent=%d' %
                                      master.id)

        if master.movie_op:
            moviemaster = BackendApi.get_eventmovie_master(
                model_mgr, master.movie_op)
            if moviemaster is None:
                raise ModelEditValidError(u'存在しない動画が設定されています.scoutevent=%d' %
                                          master.id)

        if not self.__is_exist_file(master.lovetime_starimgon):
            raise ModelEditValidError(
                u'「星の取得画像」に存在しない画像が設定されています.scoutevent=%d' % master.id)
        if not self.__is_exist_file(master.lovetime_starimgoff):
            raise ModelEditValidError(
                u'「星の身取得画像」に存在しない画像が設定されています.scoutevent=%d' % master.id)
コード例 #7
0
    def get_data(self):

        # 直近2週間で取ってきてみる.
        DAYS = 14
        date_from = self.date - datetime.timedelta(days=DAYS)
        date_to = OSAUtil.get_now()

        # ガチャのマスターデータ.
        gachamaster_dict = dict([(master.id, master)
                                 for master in GachaMaster.fetchValues(
                                     fetch_deleted=True, using=backup_db)])
        # カードのマスターデータ.
        cardmaster_dict = dict([(master.id, master)
                                for master in CardMaster.fetchValues(
                                    fetch_deleted=True, using=backup_db)])

        # 対象のユーザー.
        uidlist = PaymentGachaLastPlayTimeSortedSet.fetchByDate(
            date_from, date_to)

        result = [[
            'ユーザID', '生涯課金額', 'ガチャ1', 'ガチャを回した時のリーダー1', 'ガチャ2',
            'ガチャを回した時のリーダー2', 'ガチャ3', 'ガチャを回した時のリーダー3'
        ]]

        for uid in uidlist:
            row = [uid]

            # 生涯課金額.
            model = PlayerConsumePoint.getByKey(uid, using=backup_db)
            row.append(model.point_total if model else 0)

            redisdata = PaymentGachaPlayerLeaderHash.getByUserIDList(
                [uid]).get(uid) or {}
            items = list(redisdata.items())
            items.sort(key=lambda x: x[1]['date'], reverse=True)

            for gachaid, data in items:
                # 引いたガチャ.
                gachamaster = gachamaster_dict[gachaid]
                # その時のリーダー.
                cardmaster = cardmaster_dict[data['card']]

                row.extend([
                    u'%s(ID:%d)' % (gachamaster.name, gachamaster.id),
                    u'%s(ID:%d)' % (cardmaster.name, cardmaster.id)
                ])
            result.append(row)

        return result
コード例 #8
0
ファイル: gacha_csv.py プロジェクト: hitandaway100/caba
    def handle(self, *args, **options):

        print '================================'
        print 'copy_img'
        print '================================'

        out = args[0]

        # ガチャのマスターを取得.
        gachalist = GachaMaster.fetchValues(filters={
            'consumetype__in':
            Defines.GachaConsumeType.PAYMENT_TYPES,
            'schedule__gt':
            0
        },
                                            using=backup_db)

        # ガチャのボックスデータを作成.
        read_boxids = []

        card_dict = {}
        for gacha in gachalist:
            if gacha.boxid in read_boxids:
                continue

            schedule = ScheduleMaster.getByKey(gacha.schedule, using=backup_db)
            name = u'%s(%s-%s)' % (gacha.name,
                                   schedule.stime.strftime('%m/%d'),
                                   schedule.stime.strftime('%m/%d'))

            boxmaster = GachaBoxMaster.getByKey(gacha.boxid, using=backup_db)
            gachamasterset = GachaMasterSet(gacha, boxmaster, schedule)

            gachabox = GachaBox(gachamasterset,
                                GachaPlayData.makeInstance(
                                    GachaPlayData.makeID(0, gacha.boxid)),
                                blank=True)
            grouplist = GachaGroupMaster.getByKey(gachabox.get_group_id_list(),
                                                  using=backup_db)

            # カードIDとガチャのIDをひもづける.
            for group in grouplist:
                if 1 < len(group.table):
                    continue
                cardid = group.table[0]['id']
                arr = card_dict[cardid] = card_dict.get(cardid) or []
                arr.append(name)

        # カードマスターを取得.
        cardmasterlist = CardMaster.getByKey(card_dict.keys(),
                                             order_by='id',
                                             using=backup_db)

        # CSVを作成.
        rows = []

        def makeRow(row):
            arr = []
            for v in row:
                s = u'%s' % v
                s = s.replace('"', '""')
                arr.append(u'"%s"' % s)
            return u','.join(arr)

        for cardmaster in cardmasterlist:
            cardsortmaster = CardSortMaster.getByKey(cardmaster.id,
                                                     using=backup_db)

            row = [
                cardmaster.id, cardmaster.name,
                Defines.Rarity.NAMES[cardsortmaster.rare],
                Defines.CharacterType.NAMES[cardsortmaster.ctype]
            ]
            row.extend(card_dict[cardmaster.id])
            str_row = makeRow(row)
            print str_row
            rows.append(str_row)
        csv_data = StrUtil.to_s(u'\n'.join(rows), dest_enc='shift-jis')

        f = None
        try:
            f = open(out, "w")
            f.write(csv_data)
            f.close()
        except:
            if f:
                f.close()
                f = None
            raise

        print '================================'
        print 'output:%s' % out
        print 'all done..'
コード例 #9
0
    def get_data(self):

        result = []

        # 指輪のマスターデータ.
        master_dict = dict([
            (master.id, master.name) for master in CardMaster.fetchValues(
                filters={'ckind': Defines.CardKind.EVOLUTION}, using=backup_db)
        ])
        if not master_dict:
            return None
        midlist = master_dict.keys()
        waylist = Defines.CardGetWayType.NAMES.keys()

        titles = [u'ユーザID']
        for mid in midlist:
            for way in waylist:
                result.append(
                    u'%s(%s)' %
                    (master_dict[mid].name, Defines.CardGetWayType.NAMES[way]))
        titles.extend([u'直近一ヶ月の課金額', u'生涯課金額'])
        result.append(titles)

        # 7日前.
        s_time = DateTimeUtil.toBaseTime(
            self.date - datetime.timedelta(days=7), 0)
        e_time = self.date

        # 過去1週間以内にログインしたユーザー.
        str_uidlist = WeeklyLoginSet.getUserIdListByRange(s_time, e_time)

        redisdb = RingGetNumHash.getDB()
        keys = [RingGetNumHash.makeKey(self.date, mid) for mid in midlist]

        union_key = DailyPaymentPointSet.makeUnionSortSet(s_time, e_time)

        for str_uid in str_uidlist:
            row = []

            uid = int(str_uid)
            row.append(uid)

            # 各カードの枚数.
            members = [RingGetNumHash.makeMember(uid, way) for way in waylist]
            for key in keys:
                values = redisdb.hmget(key, members)
                for v in values:
                    v = int(str(v)) if str(v).isdigit() else 0
                    row.append(v)

            # 直近1ヶ月の課金額.
            point = redisdb.zscore(union_key, uid) or 0
            row.append(point)

            # 生涯課金額.
            model = PlayerConsumePoint.getByKey(uid, using=backup_db)
            row.append(model.point_total if model else 0)

            result.append(row)

        # 後片付け.
        redisdb.delete(union_key)

        return result
コード例 #10
0
ファイル: rediscache.py プロジェクト: hitandaway100/caba
 def _save(cls, pipe, album, hklevel, mid):
     pipe.hset(cls.KEY, CardMaster.makeAlbumHklevel(album, hklevel), mid)
コード例 #11
0
ファイル: rediscache.py プロジェクト: hitandaway100/caba
 def _flush(cls, pipe):
     """関係するキャッシュを全て削除.
     """
     masterlist = CardMaster.fetchValues(['albumhklevel'])
     for master in masterlist:
         pipe.delete(AlbumMemoriesSet.makeKey(master.album))
コード例 #12
0
ファイル: battleevent.py プロジェクト: hitandaway100/caba
    def __valid_master(self, master):
        if not (1 <= master.id <= 0xffffff):
            raise ModelEditValidError(u'イベントのマスターIDが不正です.battleevent=%d' %
                                      master.id)

        if not master.is_public:
            return

        if not isinstance(master.rankingprizes, list):
            raise ModelEditValidError(u'ランキング報酬のJsonが壊れています.battleevent=%d' %
                                      master.id)
        for data in master.rankingprizes:
            diff = set(['prize', 'rank_min', 'rank_max']) - set(data.keys())
            if diff:
                raise ModelEditValidError(
                    u'ランキング報酬に想定外のデータが含まれています.battleevent=%d' % master.id)
            self.checkPrize(master, data['prize'], u'ランキング報酬', 'battleevent')

        master.beginer_rankingprizes = master.beginer_rankingprizes or []
        if not isinstance(master.beginer_rankingprizes, list):
            raise ModelEditValidError(
                u'新店舗ランキング報酬のJsonが壊れています.battleevent=%d' % master.id)
        for data in master.beginer_rankingprizes:
            diff = set(['prize', 'rank_min', 'rank_max']) - set(data.keys())
            if diff:
                raise ModelEditValidError(
                    u'新店舗ランキング報酬に想定外のデータが含まれています.battleevent=%d' % master.id)
            self.checkPrize(master, data['prize'], u'新店舗ランキング報酬',
                            'battleevent')

        if not isinstance(master.pointprizes, (dict, list)):
            raise ModelEditValidError(
                u'名声ポイント達成報酬のJsonが壊れています.battleevent=%d' % master.id)
        for prizeidlist in master.get_pointprizes().values():
            self.checkPrize(master, prizeidlist, u'名声ポイント達成報酬', 'battleevent')

        try:
            specialtable = dict(master.specialtable)
        except:
            raise ModelEditValidError(u'特効倍率テーブルが壊れています.battleevent=%d' %
                                      master.id)
        diff = set(specialtable.keys()) - set(Defines.Rarity.NAMES.keys())
        if diff:
            raise ModelEditValidError(
                u'特効倍率テーブルに存在しないレア度が含まれています.battleevent=%d' % master.id)

        for arr in specialtable.values():
            if not isinstance(arr, list):
                raise ModelEditValidError(u'特効倍率テーブルが壊れています.battleevent=%d' %
                                          master.id)

            for v in arr:
                if not isinstance(v, (int, long)):
                    raise ModelEditValidError(
                        u'特効倍率テーブルが壊れています.battleevent=%d' % master.id)

        specialcard = dict(master.specialcard)
        midlist = specialcard.keys()
        if len(midlist) != len(master.specialcard):
            raise ModelEditValidError(u'特効キャストが重複しています.battleeventraid=%d' %
                                      master.id)
        elif len(CardMaster.getByKey(midlist)) != len(midlist):
            raise ModelEditValidError(
                u'存在しないキャストが特効に設定されています.battleeventraid=%d' % master.id)

        dest = []
        for mid, _ in master.specialcard:
            arr = specialcard.get(mid)
            if isinstance(arr, (int, long)):
                arr = [arr]

            if not isinstance(arr, list) or len(arr) < 1:
                raise ModelEditValidError(u'特効キャストテーブルが壊れています.battleevent=%d' %
                                          master.id)
            for v in arr:
                if not isinstance(v, (int, long)):
                    raise ModelEditValidError(
                        u'特効キャストテーブルが壊れています.battleevent=%d' % master.id)
            dest.append([mid, arr])
        master.specialcard = dest
コード例 #13
0
 def get_data(self, sql):
     CardMaster.sql('', using=backup_db)
     cursor = connections[backup_db].cursor()
     cursor.execute(sql)
     return cursor.fetchall()[0]