def check(self): model_mgr = ModelRequestMgr() # 進行情報があるかを確認. playdata = ScoutPlayData.getByKey( ScoutPlayData.makeID(self.__player0.id, self.__scout.id)) if playdata is None: raise AppTestError(u'進行情報が保存されていない') elif playdata.progress == 0: raise AppTestError(u'進行度が進んでいない') # 報酬. resultlist = playdata.result.get('result', None) if not resultlist: raise AppTestError(u'結果が設定されていない') for result in resultlist: self.__player0.exp += result['exp_add'] self.__player0.gold += result['gold_add'] # お金確認. playergold = PlayerGold.getByKey(playdata.uid) if playergold.gold != self.__player0.gold: raise AppTestError(u'お金が正しくない') # 経験値. playerexp = PlayerExp.getByKey(playdata.uid) if playerexp.exp != self.__player0.exp: raise AppTestError(u'お金が正しくない') # イベント設定されているか. eventlist = playdata.result.get('event', None) if not eventlist: raise AppTestError(u'イベントが設定されていない') # ハプニング発生のイベントが設定されているか. targetevent = None for event in eventlist: if event.get_type() == Defines.ScoutEventType.HAPPENING: targetevent = event if targetevent is None: raise AppTestError(u'ハプニング発生イベントが設定されていない') elif targetevent.happening != self.__happeningmaster.id: raise AppTestError( u'ハプニング発生イベントに正しくハプニングが設定されていない.%d vs %d' % (targetevent.happening, self.__happeningmaster.id)) happeningset = BackendApi.get_current_happening( model_mgr, self.__player0.id) if happeningset is None or happeningset.happening.mid != self.__happeningmaster.id: raise AppTestError(u'ハプニングが開始されていない.') raidboss = BackendApi.get_raid( model_mgr, happeningset.id, happening_eventvalue=HappeningUtil.make_raideventvalue( self.__eventmaster.id)) record = raidboss.getDamageRecord(self.__player0.id) if not record.champagne: raise AppTestError(u'シャンパンコールのフラグが立っていない.')
def check(self): keys = ('redirect_url', ) for k in keys: if self.response.get(k, None) is None: raise AppTestError(u'%sが設定されていない' % k) # 書き込み後の進行情報. playdata = self.getWroteEventScoutPlayData() self.checkEventCommonResult(playdata) stagemaster = self.getStageByNumber(self.eventplaydata.stage) # URLを確認. redirect_url = self.response['redirect_url'] if redirect_url.find('/raideventscoutanim/{}/{}'.format( stagemaster.id, playdata.alreadykey)) == -1: raise AppTestError(u'リダイレクト先が正しくない') # 進行度. if playdata.progress == 0: raise AppTestError(u'進行度が進んでいない') events = self.checkEventScoutResultEvent( playdata, [Defines.ScoutEventType.LEVELUP, Defines.ScoutEventType.COMPLETE]) # レベルアップの結果を検証. playerexp = PlayerExp.getByKey(playdata.uid) levelupevent = events[Defines.ScoutEventType.LEVELUP] if playerexp.level != levelupevent.level: raise AppTestError(u'レベルアップイベントに正しくレベルが設定されていない.{} vs {}'.format( playerexp.level, levelupevent.level))
def checkEventCommonResult(self, playdata): """共通の実行結果を確認. """ if playdata is None: raise AppTestError(u'進行情報が保存されていない') elif playdata.alreadykey != self.eventplaydata.confirmkey: raise AppTestError(u'重複確認用のキーが正しくない') # 報酬. resultlist = playdata.result.get('result', None) if resultlist is None: raise AppTestError(u'結果が設定されていない') post_exp = self.player.exp post_gold = self.player.gold for result in resultlist: post_exp += result['exp_add'] post_gold += result['gold_add'] # お金確認. playergold = PlayerGold.getByKey(playdata.uid) if playergold.gold != post_gold: raise AppTestError(u'お金が正しくない') # 経験値. playerexp = PlayerExp.getByKey(playdata.uid) if playerexp.exp != post_exp: raise AppTestError(u'経験値が正しくない') # イベント設定されているか. eventlist = playdata.result.get('event', None) if not eventlist: raise AppTestError(u'イベントが設定されていない')
def check(self): self.checkResponseStatus() # 進行情報があるかを確認. playdata = ScoutPlayData.getByKey( ScoutPlayData.makeID(self.__player0.id, self.__scout.id)) if playdata is None: raise AppTestError(u'進行情報が保存されていない') elif playdata.progress == 0: raise AppTestError(u'進行度が進んでいない') # 報酬. resultlist = playdata.result.get('result', None) if not resultlist: raise AppTestError(u'結果が設定されていない') for result in resultlist: self.__player0.exp += result['exp_add'] self.__player0.gold += result['gold_add'] # お金確認. playergold = PlayerGold.getByKey(playdata.uid) if playergold.gold != self.__player0.gold: raise AppTestError(u'お金が正しくない') # 経験値. playerexp = PlayerExp.getByKey(playdata.uid) if playerexp.exp != self.__player0.exp: raise AppTestError(u'お金が正しくない') # デッキコスト. playerdeck = PlayerDeck.getByKey(playdata.uid) if playerdeck.deckcapacityscout != (self.__player0.deckcapacityscout + 1): raise AppTestError(u'デッキコスト上限が正しくない') # イベント設定されているか. eventlist = playdata.result.get('event', None) if not eventlist: raise AppTestError(u'イベントが設定されていない') # レベルアップとスカウト完了のイベントが設定されているか. levelupevent = None completeevent = None for event in eventlist: if event.get_type() == Defines.ScoutEventType.LEVELUP: levelupevent = event elif event.get_type() == Defines.ScoutEventType.COMPLETE: completeevent = event if levelupevent is None: raise AppTestError(u'レベルアップイベントが設定されていない') elif completeevent is None: raise AppTestError(u'スカウト完了イベントが設定されていない') elif playerexp.level != levelupevent.level: raise AppTestError(u'レベルアップイベントに正しくレベルが設定されていない.%d vs %d' % (playerexp.level, levelupevent.level)) elif playdata.mid != completeevent.scoutid: raise AppTestError(u'完了イベントに正しくスカウトIDが設定されていない.%d vs %d' % (playdata.mid, completeevent.scoutid))
def check(self): self.checkResponseStatus() # 進行情報があるかを確認. happening = Happening.getByKey(self.__happening.id) playerhappening = PlayerHappening.getByKey(self.__player0.id) if happening is None or happening.progress == 0: raise AppTestError(u'進行情報が保存されていない') # 報酬. resultlist = playerhappening.happening_result.get('result', None) if resultlist is None: raise AppTestError(u'結果が設定されていない') gold_add = 0 for result in resultlist: self.__player0.exp += result['exp_add'] gold_add += result['gold_add'] # お金確認. if happening.gold != gold_add: raise AppTestError(u'お金が正しくない') # 経験値. playerexp = PlayerExp.getByKey(self.__player0.id) if playerexp.exp != self.__player0.exp: raise AppTestError(u'お金が正しくない') # イベント設定されているか. eventlist = playerhappening.happening_result.get('event', None) if not eventlist: raise AppTestError(u'イベントが設定されていない') # レベルアップとスカウト完了のイベントが設定されているか. levelupevent = None completeevent = None for event in eventlist: if event.get_type() == Defines.ScoutEventType.LEVELUP: levelupevent = event elif event.get_type() == Defines.ScoutEventType.COMPLETE: completeevent = event if levelupevent is None: raise AppTestError(u'レベルアップイベントが設定されていない') elif completeevent is None: raise AppTestError(u'スカウト完了イベントが設定されていない') elif playerexp.level != levelupevent.level: raise AppTestError(u'レベルアップイベントに正しくレベルが設定されていない.%d vs %d' % (playerexp.level, levelupevent.level)) elif happening.mid != completeevent.scoutid: raise AppTestError(u'完了イベントに正しくハプニングIDが設定されていない.%d vs %d' % (happening.mid, completeevent.scoutid)) # レイド. raid = Raid.getByKey(self.__happening.id) if raid is None: raise AppTestError(u'レイドが発生していない.')
def check(self): self.checkResponseStatus() # 進行情報があるかを確認. happening = Happening.getByKey(self.__happening.id) playerhappening = PlayerHappening.getByKey(self.__player0.id) if happening is None or happening.progress == 0: raise AppTestError(u'進行情報が保存されていない') # 報酬. resultlist = playerhappening.happening_result.get('result', None) if resultlist is None: raise AppTestError(u'結果が設定されていない') gold_add = 0 for result in resultlist: self.__player0.exp += result['exp_add'] gold_add += result['gold_add'] # お金確認. if happening.gold != gold_add: raise AppTestError(u'お金が正しくない') # 経験値. playerexp = PlayerExp.getByKey(self.__player0.id) if playerexp.exp != self.__player0.exp: raise AppTestError(u'お金が正しくない') # イベント設定されているか. eventlist = playerhappening.happening_result.get('event', None) if not eventlist: raise AppTestError(u'イベントが設定されていない') # アイテム獲得のイベントが設定されているか. targetevent = None for event in eventlist: if event.get_type() == Defines.ScoutEventType.GET_ITEM: targetevent = event if targetevent is None: raise AppTestError(u'アイテム獲得が設定されていない') elif targetevent.item != self.__itemmaster.id: raise AppTestError(u'イベントのアイテムIDが正しくない') # 報酬リストにアイテムが入っているか. if not happening.idDropped(Defines.ItemType.ITEM, self.__itemmaster.id): raise AppTestError(u'報酬リストにアイテムが設定されていない')
def tr_recover_exp(): model_mgr = ModelRequestMgr() new_player_exp = PlayerExp.getByKeyForUpdate(player2.id) new_player_exp.exp = 0 print "Before | exp = %s, level = %s" % (new_player_exp.exp, new_player_exp.level) model_mgr.set_got_models([new_player_exp]) model_mgr.set_got_models([ model_cls.getByKeyForUpdate(player2.id) for model_cls in (PlayerDeck, PlayerAp, PlayerFriend) ]) BackendApi.tr_add_exp(model_mgr, player2, player1.exp) model_mgr.write_all() print "After | exp = %s, level = %s" % (new_player_exp.exp, new_player_exp.level) return model_mgr
def check(self): self.checkResponseStatus() model_mgr = ModelRequestMgr() # 進行情報があるかを確認. playdata = ScoutPlayData.getByKey( ScoutPlayData.makeID(self.__player0.id, self.__scout.id)) if playdata is None: raise AppTestError(u'進行情報が保存されていない') elif playdata.progress == 0: raise AppTestError(u'進行度が進んでいない') # 報酬. resultlist = playdata.result.get('result', None) if not resultlist: raise AppTestError(u'結果が設定されていない') for result in resultlist: self.__player0.exp += result['exp_add'] self.__player0.gold += result['gold_add'] # お金確認. playergold = PlayerGold.getByKey(playdata.uid) if playergold.gold != self.__player0.gold: raise AppTestError(u'お金が正しくない') # 経験値. playerexp = PlayerExp.getByKey(playdata.uid) if playerexp.exp != self.__player0.exp: raise AppTestError(u'お金が正しくない') # 宝箱獲得のイベントが設定されているか. targetevent = BackendApi.find_scout_event( playdata, Defines.ScoutEventType.GET_TREASURE) if targetevent is None: raise AppTestError(u'宝箱獲得イベントが設定されていない') elif targetevent.treasuretype != Defines.TreasureType.GOLD: raise AppTestError(u'宝箱獲得イベントに正しくカードが設定されていない.%d' % targetevent.treasuretype) treasure_num = BackendApi.get_treasure_num(model_mgr, Defines.TreasureType.GOLD, self.__player0.id) if (self.__treasure_num + 1) != treasure_num: raise AppTestError(u'宝箱の所持数が想定外.%d vs %d' % ((self.__treasure_num + 1), treasure_num))
def tr(): model_mgr = ModelRequestMgr() player = BackendApi.get_player(None, uid, [], model_mgr=model_mgr) player_exp = PlayerExp.getByKeyForUpdate(uid) player_exp.exp = 0 model_mgr.set_got_models([player_exp]) model_mgr.set_got_models([ model_cls.getByKeyForUpdate(uid) for model_cls in (PlayerDeck, PlayerAp, PlayerFriend) ]) BackendApi.tr_add_exp(model_mgr, player, exp) model_mgr.write_all() print "level=%s,exp=%s" % (player_exp.level, player_exp.exp) return model_mgr
def check(self): self.checkResponseStatus() # 進行情報があるかを確認. happening = Happening.getByKey(self.__happening.id) playerhappening = PlayerHappening.getByKey(self.__player0.id) if happening is None: raise AppTestError(u'進行情報が保存されていない') # 報酬. resultlist = playerhappening.happening_result.get('result', None) if resultlist is None: raise AppTestError(u'結果が設定されていない') gold_add = 0 for result in resultlist: self.__player0.exp += result['exp_add'] gold_add += result['gold_add'] # お金確認. if happening.gold != gold_add: raise AppTestError(u'お金が正しくない') # 経験値. playerexp = PlayerExp.getByKey(self.__player0.id) if playerexp.exp != self.__player0.exp: raise AppTestError(u'お金が正しくない') # イベント設定されているか. eventlist = playerhappening.happening_result.get('event', None) if not eventlist: raise AppTestError(u'イベントが設定されていない') # イベント設定されているか. eventlist = playerhappening.happening_result.get('event', None) if not eventlist: raise AppTestError(u'イベントが設定されていない') # 体力不足のイベントが設定されているか. targetevent = None for event in eventlist: if event.get_type() == Defines.ScoutEventType.AP_NONE: targetevent = event if targetevent is None: raise AppTestError(u'体力不足イベントが設定されていない')
def check(self): self.checkResponseStatus() # 進行情報があるかを確認. playdata = ScoutPlayData.getByKey( ScoutPlayData.makeID(self.__player0.id, self.__scout.id)) if playdata is None: raise AppTestError(u'進行情報が保存されていない') elif playdata.progress == 0: raise AppTestError(u'進行度が進んでいない') # 報酬. resultlist = playdata.result.get('result', None) if not resultlist: raise AppTestError(u'結果が設定されていない') for result in resultlist: self.__player0.exp += result['exp_add'] self.__player0.gold += result['gold_add'] # お金確認. playergold = PlayerGold.getByKey(playdata.uid) if playergold.gold != self.__player0.gold: raise AppTestError(u'お金が正しくない') # 経験値. playerexp = PlayerExp.getByKey(playdata.uid) if playerexp.exp != self.__player0.exp: raise AppTestError(u'お金が正しくない') # イベント設定されているか. eventlist = playdata.result.get('event', None) if not eventlist: raise AppTestError(u'イベントが設定されていない') # レベルアップのイベントが設定されているか. targetevent = None for event in eventlist: if event.get_type() == Defines.ScoutEventType.LEVELUP: targetevent = event if targetevent is None: raise AppTestError(u'レベルアップイベントが設定されていない') elif playerexp.level != targetevent.level: raise AppTestError(u'イベントに正しくレベルが設定されていない.%d vs %d' % (playerexp.level, targetevent.level))
def check(self): self.checkResponseStatus() # 進行情報があるかを確認. happening = Happening.getByKey(self.__happening.id) playerhappening = PlayerHappening.getByKey(self.__player0.id) if happening is None or happening.progress == 0: raise AppTestError(u'進行情報が保存されていない') # 報酬. resultlist = playerhappening.happening_result.get('result', None) if resultlist is None: raise AppTestError(u'結果が設定されていない') gold_add = 0 for result in resultlist: self.__player0.exp += result['exp_add'] gold_add += result['gold_add'] # お金確認. if happening.gold != gold_add: raise AppTestError(u'お金が正しくない') # 経験値. playerexp = PlayerExp.getByKey(self.__player0.id) if playerexp.exp != self.__player0.exp: raise AppTestError(u'お金が正しくない') # イベント設定されているか. eventlist = playerhappening.happening_result.get('event', None) if not eventlist: raise AppTestError(u'イベントが設定されていない') # レベルアップのイベントが設定されているか. targetevent = None for event in eventlist: if event.get_type() == Defines.ScoutEventType.LEVELUP: targetevent = event if targetevent is None: raise AppTestError(u'レベルアップイベントが設定されていない') elif playerexp.level != targetevent.level: raise AppTestError(u'イベントに正しくレベルが設定されていない.%d vs %d' % (playerexp.level, targetevent.level))
def check(self): self.checkResponseStatus() # 進行情報があるかを確認. playdata = ScoutPlayData.getByKey( ScoutPlayData.makeID(self.__player0.id, self.__scout.id)) if playdata is None: raise AppTestError(u'進行情報が保存されていない') # 報酬. resultlist = playdata.result.get('result', None) if resultlist is None: raise AppTestError(u'結果が設定されていない') for result in resultlist: self.__player0.exp += result['exp_add'] self.__player0.gold += result['gold_add'] # お金確認. playergold = PlayerGold.getByKey(playdata.uid) if playergold.gold != self.__player0.gold: raise AppTestError(u'お金が正しくない') # 経験値. playerexp = PlayerExp.getByKey(playdata.uid) if playerexp.exp != self.__player0.exp: raise AppTestError(u'お金が正しくない') # イベント設定されているか. eventlist = playdata.result.get('event', None) if not eventlist: raise AppTestError(u'イベントが設定されていない') # 体力不足のイベントが設定されているか. targetevent = None for event in eventlist: if event.get_type() == Defines.ScoutEventType.AP_NONE: targetevent = event if targetevent is None: raise AppTestError(u'体力不足イベントが設定されていない')
def check(self): self.checkResponseStatus() # 進行情報があるかを確認. playdata = ScoutPlayData.getByKey( ScoutPlayData.makeID(self.__player0.id, self.__scout.id)) if playdata is None: raise AppTestError(u'進行情報が保存されていない') elif playdata.progress == 0: raise AppTestError(u'進行度が進んでいない') # 報酬. resultlist = playdata.result.get('result', None) if not resultlist: raise AppTestError(u'結果が設定されていない') for result in resultlist: self.__player0.exp += result['exp_add'] self.__player0.gold += result['gold_add'] # お金確認. playergold = PlayerGold.getByKey(playdata.uid) if playergold.gold != self.__player0.gold: raise AppTestError(u'お金が正しくない') # 経験値. playerexp = PlayerExp.getByKey(playdata.uid) if playerexp.exp != self.__player0.exp: raise AppTestError(u'お金が正しくない') # カード獲得のイベントが設定されているか. targetevent = BackendApi.find_scout_event( playdata, Defines.ScoutEventType.GET_CARD) if targetevent is None: raise AppTestError(u'カード獲得イベントが設定されていない') elif targetevent.card != self.__cardmaster.id: raise AppTestError(u'カード獲得イベントに正しくカードが設定されていない.%d vs %d' % (targetevent.card, self.__cardmaster.id)) elif targetevent.is_received: raise AppTestError(u'カード受取判定済になってしまっている')
def handle(self, *args, **options): print '================================' print 'recover_goukonevent_score' print '================================' is_write = (args[0] if args else None) in ('1', 1) model_mgr = ModelRequestMgr() config = BackendApi.get_current_battleeventconfig( model_mgr, using=settings.DB_READONLY) mid = config.mid eventmaster = BackendApi.get_battleevent_master( model_mgr, mid, using=settings.DB_READONLY) eventrankmaster_list = BackendApi.get_battleevent_rankmaster_by_eventid( model_mgr, mid, using=settings.DB_READONLY) eventrankmaster_dict = dict([ (eventrankmaster.rank, eventrankmaster) for eventrankmaster in eventrankmaster_list ]) uid = PlayerExp.max_value('id') LIMIT = 500 while 0 < uid: filters = {'mid': eventmaster.id, 'uid__lte': uid} scorerecord_list = BattleEventScore.fetchValues( filters=filters, order_by='-uid', limit=LIMIT, offset=0, using=settings.DB_READONLY) rankrecord_list = BattleEventRank.getByKey( [ BattleEventRank.makeID(scorerecord.uid, eventmaster.id) for scorerecord in scorerecord_list ], using=settings.DB_READONLY) rankrecord_dict = dict([(rankrecord.uid, rankrecord) for rankrecord in rankrecord_list]) for scorerecord in scorerecord_list: uid = min(uid, scorerecord.uid) if scorerecord.point_total < 1: print '%s...zero' % scorerecord.uid continue rankrecord = rankrecord_dict.get(scorerecord.uid) if rankrecord is None: print '%s...rank None' % scorerecord.uid continue eventrankmaster = eventrankmaster_dict.get(rankrecord.rank) if eventrankmaster is None: print '%s...rank Unknown' % scorerecord.uid continue p_key = BattleEventScorePerRank.makeID( scorerecord.uid, BattleEventScorePerRank.makeMid(mid, eventrankmaster.rank)) if BackendApi.get_model(model_mgr, BattleEventScorePerRank, p_key, using=settings.DB_DEFAULT): print '%s...Already' % scorerecord.uid continue if is_write: try: db_util.run_in_transaction(Command.tr_write, eventmaster, eventrankmaster, rankrecord).write_end() except: print '%s...ERROR' % scorerecord.uid continue print '%s...SUCCESS' % scorerecord.uid uid -= 1
def __proc_normal(self, model_mgr, redisdb, config, eventmaster, rankmaster_dict, now, logintime, cdate): """通常のバトルイベント. """ eventrankmaster = rankmaster_dict.get(eventmaster.rankstart) print 'start for normal' print '================================' print 'save level.' rediskey = "battleevent_preparation" redisdb.delete(rediskey) uid = PlayerExp.max_value('id') LIMIT = 500 while 0 < uid: pipe = redisdb.pipeline() uidlist = range(max(0, uid - LIMIT) + 1, uid + 1) playerexplist = PlayerExp.getByKey(uidlist, using=settings.DB_READONLY) tutorialend_uid_list = [ model.id for model in PlayerTutorial.getByKey( uidlist, using=settings.DB_READONLY) if model.tutorialstate == Defines.TutorialStatus.COMPLETED ] for playerexp in playerexplist: if not playerexp.id in tutorialend_uid_list: continue pipe.zadd(rediskey, playerexp.id, playerexp.level) pipe.execute() uid -= LIMIT print '================================' print 'allocate start.' data = redisdb.zrevrange(rediskey, 0, 1, withscores=True, score_cast_func=RedisModel.value_to_int) if data: level = data[0][1] groupid = 0 while 0 < level: uidlist = [ RedisModel.value_to_int(uid) for uid in redisdb.zrangebyscore(rediskey, level, level) if RedisModel.value_to_int(uid) ] if uidlist: random.shuffle(uidlist) model_mgr, group = db_util.run_in_transaction( Command.tr_write, groupid, eventmaster, eventrankmaster, uidlist, now) model_mgr.write_end() if group and not group.fixed: groupid = group.id else: groupid = 0 level -= 1 print '================================' print 'save rankuidset.' for rankmaster in rankmaster_dict.values(): print "eventid=%s, rank=%s" % (rankmaster.eventid, rankmaster.rank) BackendApi.save_battleevent_rankuidset(rankmaster.eventid, rankmaster.rank) # 後片付け. redisdb.delete(rediskey) print '================================' print 'all done.'