def check(self): model_mgr = ModelRequestMgr() # 確認キー. playerrequest = BackendApi.get_model(model_mgr, PlayerRequest, self.__player0.id) if self.__player0.req_confirmkey == playerrequest.req_confirmkey: raise AppTestError(u'確認キーが更新されていない') elif self.__player0.req_confirmkey != playerrequest.req_alreadykey: raise AppTestError(u'確認済みのキーが更新されていない') # ハプニング. happeningset = BackendApi.get_happening(model_mgr, self.__raid.id) if happeningset.happening.state != Defines.HappeningState.END: raise AppTestError(u'状態が正しくない') # ダメージレコード. raidboss = BackendApi.get_raid(model_mgr, self.__raid.id) record = raidboss.getDamageRecord(self.__player0.id) if record.damage == 0 or record.damage_cnt == 0: raise AppTestError(u'ダメージが記録されていない') # ダメージ. record_pre = self.__raid.getDamageRecord(self.__player0.id) if (self.__raid.raid.hp - (record.damage - record_pre.damage)) != raidboss.raid.hp: raise AppTestError(u'ダメージが正しくない') # 秘宝. playertreasure0 = PlayerTreasure.getByKey(self.__player0.id) if playertreasure0.cabaretking != self.__raid.get_cabaretking(): raise AppTestError(u'キャバ王の秘宝が付与されていない') # 報酬. present_num0 = BackendApi.get_present_num(self.__player0.id) if self.__present_num0 == present_num0: raise AppTestError(u'発見者に報酬が付与されていない') if Defines.RAID_PRIZE_DISTRIBUTION_OUTSIDE: queue = RaidPrizeDistributeQueue.getValues( filters={'raidid': self.__raid.id}) if queue is None: raise AppTestError(u'報酬配布用のキューが作成されていない') else: present_num1 = BackendApi.get_present_num(self.__player1.id) if self.__present_num1 == present_num1: raise AppTestError(u'救援者に報酬が付与されていない') playertreasure1 = PlayerTreasure.getByKey(self.__player1.id) if playertreasure1.demiworld != self.__raid.get_demiworld(): raise AppTestError(u'裏社会の秘宝が付与されていない')
def handle(self, *args, **options): print '================================' print 'aggregate_cabarettreasure' print '================================' # 出力先. path = OSAUtil.get_now().strftime(args[0]) # 書き込むデータをここに溜め込む. writer = Command.Writer(path) # 今のユーザIDの最大値を取得. uid_max = PlayerTreasure.max_value('id', 0, using=backup_db) # 交換できるもの. model_mgr = ModelRequestMgr() trade_all = dict([(model.id, model) for model in model_mgr.get_mastermodel_all( TradeMaster, fetch_deleted=True, using=backup_db) ]) for uid in xrange(1, uid_max + 1): # 現在の所持数. player = PlayerTreasure.getByKey(uid, using=backup_db) if player is None: continue cabaretking = player.get_cabaretking_num() row = [str(uid), str(cabaretking)] # ユーザログを集計して消費量を求める. userloglist = UserLogTrade.fetchValues(filters={'uid': uid}, using=backup_db) consumed = 0 for userlog in userloglist: trademaster = trade_all.get(userlog.mid, None) if trademaster: consumed += trademaster.rate_cabaretking row.append('%s' % (cabaretking + consumed)) rowtext = ','.join(row) print rowtext writer.add(rowtext) writer.output(overwrite=False) print '================================' print 'all done..'
def check(self): playerrequest = PlayerRequest.getByKey(self.__player.id) if playerrequest.req_confirmkey == self.__player.req_confirmkey: raise AppTestError(u'確認キーが更新されていない') elif playerrequest.req_alreadykey != self.__player.req_confirmkey: raise AppTestError(u'確認済みのキーが正しく設定されていない') # 秘宝. playertreasure = PlayerTreasure.getByKey(self.__player.id) cabaretking = playertreasure.get_cabaretking_num() if cabaretking == self.__treasurenum: raise AppTestError(u'キャバ王の秘宝所持数が減っていない') elif cabaretking != (self.__treasurenum - self.__trade.rate_cabaretking): raise AppTestError(u'キャバ王の秘宝所持数が正しくない') # チケット数. playergachapt = PlayerGachaPt.getByKey(self.__player.id) ticketnum = BackendApi.get_num_by_itemtype(ModelRequestMgr(), playergachapt, self.__trade.itype) if ticketnum == self.__ticketnum: raise AppTestError(u'チケットの所持数が変わっていない') elif ticketnum != (self.__ticketnum + self.__trade.itemnum): raise AppTestError(u'チケットの所持数が正しくない')
def check(self): self.checkResponseStatus() model_mgr = ModelRequestMgr() # 確認キー. playerrequest = BackendApi.get_model(model_mgr, PlayerRequest, self.__player0.id) if self.__requestkey == playerrequest.req_confirmkey: raise AppTestError(u'確認キーが更新されていない') elif self.__requestkey != playerrequest.req_alreadykey: raise AppTestError(u'確認済みのキーが更新されていない') # ハプニング. happeningset = BackendApi.get_happening(model_mgr, self.__raid.id) if happeningset.happening.state != Defines.HappeningState.END: raise AppTestError(u'状態が正しくない') # ダメージレコード. raidboss = BackendApi.get_raid(model_mgr, self.__raid.id) record = raidboss.getDamageRecord(self.__player0.id) if record.damage == 0 or record.damage_cnt == 0: raise AppTestError(u'ダメージが記録されていない') # ダメージ. record_pre = self.__raid.getDamageRecord(self.__player0.id) if (self.__raid.raid.hp - (record.damage - record_pre.damage)) != raidboss.raid.hp: raise AppTestError(u'ダメージが正しくない') # 秘宝. playertreasure0 = PlayerTreasure.getByKey(self.__player0.id) playertreasure1 = PlayerTreasure.getByKey(self.__player1.id) if playertreasure0.cabaretking != self.__raid.get_cabaretking(): raise AppTestError(u'キャバ王の秘宝が付与されていない') elif playertreasure1.demiworld != self.__raid.get_demiworld(): raise AppTestError(u'裏社会の秘宝が付与されていない') # 報酬. present_num0 = BackendApi.get_present_num(self.__player0.id) present_num1 = BackendApi.get_present_num(self.__player1.id) if self.__present_num0 == present_num0: raise AppTestError(u'発見者に報酬が付与されていない') elif self.__present_num1 == present_num1: raise AppTestError(u'救援者に報酬が付与されていない')
def check(self): playerrequest = PlayerRequest.getByKey(self.__player.id) if playerrequest.req_confirmkey == self.__player.req_confirmkey: raise AppTestError(u'確認キーが更新されていない') elif playerrequest.req_alreadykey != self.__player.req_confirmkey: raise AppTestError(u'確認済みのキーが正しく設定されていない') # 秘宝. playertreasure = PlayerTreasure.getByKey(self.__player.id) cabaretking = playertreasure.get_cabaretking_num() if cabaretking == self.__treasurenum: raise AppTestError(u'キャバ王の秘宝所持数が減っていない') elif cabaretking != (self.__treasurenum - self.__trade.rate_cabaretking): raise AppTestError(u'キャバ王の秘宝所持数が正しくない') # アイテム数. itemnum = BackendApi.get_item_nums(ModelRequestMgr(), self.__player.id, [self.__itemmaster.id]).get( self.__itemmaster.id, 0) if itemnum == self.__itemnum: raise AppTestError(u'アイテムの所持数が変わっていない') elif itemnum != (self.__itemnum + self.__trade.itemnum): raise AppTestError(u'アイテムの所持数がおかしい')
def check(self): model_mgr = ModelRequestMgr() # 確認キー. playerrequest = BackendApi.get_model(model_mgr, PlayerRequest, self.__player0.id) if self.__player0.req_confirmkey == playerrequest.req_confirmkey: raise AppTestError(u'確認キーが更新されていない') elif self.__player0.req_confirmkey != playerrequest.req_alreadykey: raise AppTestError(u'確認済みのキーが更新されていない') # ハプニング. happeningset = BackendApi.get_happening(model_mgr, self.__raid.id) if happeningset.happening.state != Defines.HappeningState.END: raise AppTestError(u'状態が正しくない') # ダメージレコード. raidboss = BackendApi.get_raid(model_mgr, self.__raid.id) record = raidboss.getDamageRecord(self.__player0.id) if record.damage == 0 or record.damage_cnt == 0: raise AppTestError(u'ダメージが記録されていない') elif not record.champagne: raise AppTestError(u'シャンパンコールフラグが立っていない') # ダメージ. record_pre = self.__raid.getDamageRecord(self.__player0.id) if (self.__raid.raid.hp - (record.damage - record_pre.damage)) != raidboss.raid.hp: raise AppTestError(u'ダメージが正しくない') # 秘宝. playertreasure0 = PlayerTreasure.getByKey(self.__player0.id) if playertreasure0.cabaretking != self.__raid.get_cabaretking(): raise AppTestError(u'キャバ王の秘宝が付与されていない') # 報酬. present_num0 = BackendApi.get_present_num(self.__player0.id) if self.__present_num0 == present_num0: raise AppTestError(u'発見者に報酬が付与されていない') # イベントポイント. scorerecord0 = BackendApi.get_raidevent_scorerecord( model_mgr, self.__eventmaster.id, self.__player0.id) pointtable = BackendApi.aggregate_raidevent_destroypoint( model_mgr, self.__eventmaster, raidboss) arr = pointtable.get(self.__player0.id) if not arr: raise AppTestError(u'発見者にイベントポイントが付与されていない') elif len(arr) != 2: raise AppTestError(u'発見者にMVPポイントが付与されていない') elif sum(arr) != scorerecord0.point or sum( arr) != scorerecord0.point_total: raise AppTestError(u'発見者にポイントがただしく付与されていない') arr = pointtable.get(self.__player1.id) if not arr: raise AppTestError(u'協力者にイベントポイントが付与されていない') if Defines.RAID_PRIZE_DISTRIBUTION_OUTSIDE: queue = RaidPrizeDistributeQueue.getValues( filters={'raidid': self.__raid.id}) if queue is None: raise AppTestError(u'報酬配布用のキューが作成されていない') def write(queue, happening, raidboss, help_prizelist): model_mgr = ModelRequestMgr() BackendApi.tr_distribute_raid(model_mgr, queue, happening, raidboss, help_prizelist) model_mgr.write_all() model_mgr.write_end() help_prizelist = BackendApi.get_prizelist( model_mgr, raidboss.master.helpprizes) write(queue, BackendApi.get_happening(model_mgr, raidboss.id).happening, raidboss, help_prizelist) # 救援者の報酬を確認. present_num1 = BackendApi.get_present_num(self.__player1.id) if self.__present_num1 == present_num1: raise AppTestError(u'救援者に報酬が付与されていない') playertreasure1 = PlayerTreasure.getByKey(self.__player1.id) if 0 < self.__raid.get_demiworld( ) and playertreasure1.demiworld != self.__raid.get_demiworld(): raise AppTestError(u'裏社会の秘宝が付与されていない') scorerecord1 = BackendApi.get_raidevent_scorerecord( model_mgr, self.__eventmaster.id, self.__player1.id) if len(arr) != 1 or sum(arr) != scorerecord1.point or sum( arr) != scorerecord1.point_total: raise AppTestError(u'協力者にポイントがただしく付与されていない')
def check(self): model_mgr = ModelRequestMgr() # 確認キー. playerrequest = BackendApi.get_model(model_mgr, PlayerRequest, self.__player0.id) if self.__player0.req_confirmkey == playerrequest.req_confirmkey: raise AppTestError(u'確認キーが更新されていない') elif self.__player0.req_confirmkey != playerrequest.req_alreadykey: raise AppTestError(u'確認済みのキーが更新されていない') # ハプニング. happeningset = BackendApi.get_happening(model_mgr, self.__raid.id) if happeningset.happening.state != Defines.HappeningState.END: raise AppTestError(u'状態が正しくない') # ダメージレコード. raidboss = BackendApi.get_raid(model_mgr, self.__raid.id) record = raidboss.getDamageRecord(self.__player0.id) if record.damage == 0 or record.damage_cnt == 0: raise AppTestError(u'ダメージが記録されていない') # ダメージ. record_pre = self.__raid.getDamageRecord(self.__player0.id) if (self.__raid.raid.hp - (record.damage - record_pre.damage)) != raidboss.raid.hp: raise AppTestError(u'ダメージが正しくない') # 秘宝. playertreasure0 = PlayerTreasure.getByKey(self.__player0.id) if playertreasure0.cabaretking != self.__raid.get_cabaretking(): raise AppTestError(u'キャバ王の秘宝が付与されていない') # 報酬. present_num0 = BackendApi.get_present_num(self.__player0.id) if self.__present_num0 == present_num0: raise AppTestError(u'発見者に報酬が付与されていない') # 短冊. def check_tanzaku_num(tanzaku_data_pre, is_lovetime): uid = tanzaku_data_pre.uid ownername = u'発見者' if self.__player0.id == uid else '救援者' tanzaku_data_post = BackendApi.get_scoutevent_tanzakucastdata( model_mgr, uid, self.__eventmaster.id) if tanzaku_data_post is None: raise AppTestError(u'{}の短冊情報が消えている'.format(ownername)) sep = '' if self.__player0.id == uid else '_help' tanzakuup = self.__eventmaster.lovetime_tanzakuup if is_lovetime else 0 tanzaku_number = getattr(self.__scouteventraidmaster, 'tanzaku{}_number'.format(sep)) tanzaku_randmin = getattr( self.__scouteventraidmaster, 'tanzaku{}_randmin'.format(sep)) * (100 + tanzakuup) / 100 tanzaku_randmax = getattr( self.__scouteventraidmaster, 'tanzaku{}_randmax'.format(sep)) * (100 + tanzakuup) / 100 tanzaku_diff = tanzaku_data_post.get_tanzaku( tanzaku_number) - tanzaku_data_pre.get_tanzaku(tanzaku_number) if not (tanzaku_randmin <= tanzaku_diff <= tanzaku_randmax): raise AppTestError(u'{}の短冊の増加量が想定外です'.format(ownername)) check_tanzaku_num(self.__tanzaku_data0, self.__scoutevent_playdata.is_lovetime()) if Defines.RAID_PRIZE_DISTRIBUTION_OUTSIDE: queue = RaidPrizeDistributeQueue.getValues( filters={'raidid': self.__raid.id}) if queue is None: raise AppTestError(u'報酬配布用のキューが作成されていない') def write(queue, happening, raidboss, help_prizelist): model_mgr = ModelRequestMgr() BackendApi.tr_distribute_raid(model_mgr, queue, happening, raidboss, help_prizelist) model_mgr.write_all() model_mgr.write_end() help_prizelist = BackendApi.get_prizelist( model_mgr, raidboss.master.helpprizes) write(queue, BackendApi.get_happening(model_mgr, raidboss.id).happening, raidboss, help_prizelist) # 救援者の報酬を確認. present_num1 = BackendApi.get_present_num(self.__player1.id) if self.__present_num1 == present_num1: raise AppTestError(u'救援者に報酬が付与されていない') playertreasure1 = PlayerTreasure.getByKey(self.__player1.id) if 0 < self.__raid.get_demiworld( ) and playertreasure1.demiworld != self.__raid.get_demiworld(): raise AppTestError(u'裏社会の秘宝が付与されていない') # 短冊. check_tanzaku_num(self.__tanzaku_data1, False)
def check(self): model_mgr = ModelRequestMgr() # 確認キー. playerrequest = BackendApi.get_model(model_mgr, PlayerRequest, self.__player1.id) if self.__player1.req_confirmkey == playerrequest.req_confirmkey: raise AppTestError(u'確認キーが更新されていない') elif self.__player1.req_confirmkey != playerrequest.req_alreadykey: raise AppTestError(u'確認済みのキーが更新されていない') # ハプニング. happeningset = BackendApi.get_happening(model_mgr, self.__raid.id) if happeningset.happening.state != Defines.HappeningState.END: raise AppTestError(u'状態が正しくない') # ダメージレコード. raidboss = BackendApi.get_raid(model_mgr, self.__raid.id) record = raidboss.getDamageRecord(self.__player1.id) if record.damage == 0 or record.damage_cnt == 0: raise AppTestError(u'ダメージが記録されていない') elif not record.champagne: raise AppTestError(u'シャンパンコールフラグが立っていない') # ダメージ. record_pre = self.__raid.getDamageRecord(self.__player1.id) if (self.__raid.raid.hp - (record.damage - record_pre.damage)) != raidboss.raid.hp: raise AppTestError(u'ダメージが正しくない') # 秘宝. playertreasure1 = PlayerTreasure.getByKey(self.__player1.id) if 0 < self.__raid.get_demiworld( ) and playertreasure1.demiworld != self.__raid.get_demiworld(): raise AppTestError(u'裏社会の秘宝が付与されていない') # 報酬. present_num1 = BackendApi.get_present_num(self.__player1.id) if self.__present_num1 == present_num1: raise AppTestError(u'救援者に報酬が付与されていない') # イベントポイント. scorerecords = BackendApi.get_raidevent_scorerecords( model_mgr, self.__eventmaster.id, [self.__player0.id, self.__player1.id]) scorerecord0 = scorerecords.get(self.__player0.id) scorerecord1 = scorerecords.get(self.__player1.id) pointtable = BackendApi.aggregate_raidevent_destroypoint( model_mgr, self.__eventmaster, raidboss) arr = pointtable.get(self.__player0.id) if not arr: raise AppTestError(u'発見者にイベントポイントが付与されていない') elif len(arr) != 1 or sum(arr) != scorerecord0.point or sum( arr) != scorerecord0.point_total: raise AppTestError(u'発見者にポイントがただしく付与されていない') arr = pointtable.get(self.__player1.id) if not arr: raise AppTestError(u'協力者にイベントポイントが付与されていない') elif len(arr) != 2: raise AppTestError(u'協力者にMVPポイントが付与されていない') elif sum(arr) != scorerecord1.point or sum( arr) != scorerecord1.point_total: raise AppTestError(u'協力者にポイントがただしく付与されていない')
def handle(self, *args, **options): print '================================' print 'aggregate_cabaretclub_weekly' print '================================' last_week_starttime = BackendApi.to_cabaretclub_section_starttime( OSAUtil.get_now() - datetime.timedelta(days=7)) str_year_and_week = args[0] if 0 < len(args) else None if str_year_and_week: week = int(str_year_and_week[4:]) first_of_year = DateTimeUtil.strToDateTime( "%s%02d" % (str_year_and_week[:4], Defines.CABARETCLUB_EVENT_DATE_CHANGE_TIME), "%Y%H") # 0週目. zero = BackendApi.to_cabaretclub_section_starttime(first_of_year) starttime = zero + datetime.timedelta(days=week * 7) if last_week_starttime < starttime: print u'未完了の週なので集計は行えません' return else: # 指定がない場合は前回の週. starttime = last_week_starttime print "target:%s" % starttime.strftime("%Y%W") endtime = BackendApi.to_cabaretclub_section_endtime(starttime) section_lasttime = endtime - datetime.timedelta(microseconds=1) model_mgr = ModelRequestMgr() self.update_eventconfig_previous_mid(model_mgr, starttime) # 店舗のマスターデータ. cabaclubstoremaster_dict = dict([ (cabaclubstoremaster.id, cabaclubstoremaster) for cabaclubstoremaster in model_mgr.get_mastermodel_all( CabaClubStoreMaster, fetch_deleted=True, using=backup_db) ]) # ユーザIDの最大値. uid_max = PlayerTreasure.max_value('id', using=backup_db) for uid in xrange(1, uid_max + 1): # 所持している店舗.ここはreadonlyで大丈夫. store_list = CabaClubStorePlayerData.fetchByOwner( uid, using=settings.DB_READONLY) if store_list: # この週に更新された店舗数. update_store_cnt = 0 # Activeな店舗を週の終了時間まですすめる. for store in store_list: cabaclubstoremaster = cabaclubstoremaster_dict[store.mid] if not store.is_open: # 閉じるときに集計しているので必要なし. if starttime <= store.utime: update_store_cnt += 1 continue store_set = CabaclubStoreSet(cabaclubstoremaster, store) lasttime = min( section_lasttime, store_set.get_limit_time() - datetime.timedelta(microseconds=1)) if (lasttime - store.utime).total_seconds( ) < cabaclubstoremaster.customer_interval: # 獲得時間が経過していないので更新する必要が無い. if starttime <= store.utime: update_store_cnt += 1 continue def tr_advance_the_time(uid, cabaclubstoremaster, now): """店舗の時間をすすめる. """ model_mgr = ModelRequestMgr() BackendApi.tr_cabaclubstore_advance_the_time_with_checkalive( model_mgr, uid, cabaclubstoremaster, now) model_mgr.write_all() model_mgr.write_end() try: db_util.run_in_transaction(tr_advance_the_time, uid, cabaclubstoremaster, lasttime) except CabaretError, err: if err.code == CabaretError.Code.ALREADY_RECEIVED: # ユーザー自信が更新した可能性. pass else: DbgLogger.write_error(err.value) raise update_store_cnt += 1 if 0 < update_store_cnt: # 売り上げに応じた名誉ポイントを配布. 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 cabaclub_honor = db_util.run_in_transaction( tr_send_point, uid, starttime) print '%s...honor=%d' % (uid, cabaclub_honor) else: print '%s...not updated' % uid