def getPooledPrizeList(self, cancel=False): """プールされている報酬一覧. """ if self.__prizelist is None: happening = self.getHappening() prizelist = [] if happening: prizelist = BackendApi.aggregate_happeningprize(happening.happening, cancel) self.__prizelist = prizelist return self.__prizelist
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
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')
def __procView(self, uid): """詳細表示. """ model_mgr = self.getModelMgr() now = OSAUtil.get_now() playerlist = BackendApi.get_players(self, [uid], using=backup_db) if not playerlist: self.putAlertToHtmlParam(u'見つかりませんでした', AlertCode.ERROR) self.__procSearch() return player = playerlist[0] person = BackendApi.get_dmmplayers(self, [player], using=backup_db, do_execute=True).get(player.dmmid) obj_player = Objects.player(self, player, person) obj_player['userType'] = person.userType or u'一般' self.html_param['player'] = obj_player # 招待してくれた人. invitedata = BackendApi.get_model(model_mgr, InviteData, player.dmmid, using=backup_db) if invitedata and invitedata.fid: playerlist = BackendApi.get_players(self, [invitedata.fid], [], using=backup_db, model_mgr=model_mgr) invite_from_player = playerlist[0] if playerlist else None if invite_from_player: invite_from_person = BackendApi.get_dmmplayers(self, [invite_from_player], using=backup_db, do_execute=True).get(invite_from_player.dmmid) self.html_param['invitedata'] = { 'url' : self.makeAppLinkUrlAdmin(UrlMaker.view_player(invite_from_player.id)), 'player' : Objects.player(self, invite_from_player, invite_from_person), 'ctime' : invitedata.ctime, 'state' : Defines.InviteState.NAMES[invitedata.state], } # 招待した人数. inviterecordlist = Invite.fetchValues(filters={'uid':player.id}, order_by='mid', using=backup_db) if inviterecordlist: midlist = [inviterecord.mid for inviterecord in inviterecordlist] invitemasterdict = BackendApi.get_model_dict(model_mgr, InviteMaster, midlist, get_instance=True, using=backup_db) obj_inviterecordlist = [] for inviterecord in inviterecordlist: invitemaster = invitemasterdict.get(inviterecord.mid) obj_inviterecordlist.append({ 'id' : invitemaster.id, 'name' : invitemaster.name, 'cnt' : inviterecord.cnt, }) self.html_param['inviterecordlist'] = obj_inviterecordlist regist = False if player.getModel(PlayerRegist) is not None: regist = True # アイテム. itemidlist = Defines.ItemEffect.NAMES.keys() itemmasterdict = BackendApi.get_model_dict(model_mgr, ItemMaster, itemidlist, using=backup_db) itemnums = BackendApi.get_model_list(model_mgr, Item, [Item.makeID(uid, iid) for iid in Defines.ItemEffect.NAMES.keys()], using=backup_db) iteminfolist = [] for item in itemnums: master = itemmasterdict.get(item.mid) if master: iteminfolist.append({ 'master' : master, 'nums' : item, }) self.html_param['itemlist'] = iteminfolist # 所持カード. deck = BackendApi.get_deck(uid, arg_model_mgr=model_mgr, using=backup_db) raiddeck = BackendApi.get_raid_deck(uid, arg_model_mgr=model_mgr, using=backup_db) cardlist = BackendApi.get_card_list(uid, arg_model_mgr=model_mgr, using=backup_db) obj_cardlist = [] obj_deckcards = {} obj_raiddeckcards = {} cardcounts = {} for cardset in cardlist: obj_card = Objects.card(self, cardset, deck) obj_card['way'] = Defines.CardGetWayType.NAMES.get(cardset.card.way, u'不明') obj_card['raiddeckmember'] = raiddeck.is_member(cardset.id) if obj_card['deckmember']: obj_deckcards[cardset.id] = obj_card elif obj_card['raiddeckmember']: obj_card['raiddeckmember'] = True obj_raiddeckcards[cardset.id] = obj_card else: obj_cardlist.append(obj_card) mid = cardset.master.id data = cardcounts[mid] = cardcounts.get(mid) or {'name':cardset.master.name, 'cnt':0} data['cnt'] += 1 self.html_param['deckcardlist'] = [obj_deckcards[cardid] for cardid in deck.to_array()] self.html_param['raiddeckcardlist'] = [obj_raiddeckcards[cardid] for cardid in raiddeck.to_array() if obj_raiddeckcards.get(cardid)] self.html_param['cardlist'] = obj_cardlist self.html_param['cardcounts'] = cardcounts # フレンド. table = { 'friendlist' : BackendApi.get_friend_idlist, 'friendrequestlist' : BackendApi.get_friendrequest_send_idlist, 'friendreceivelist' : BackendApi.get_friendrequest_receive_idlist, } for k,func in table.items(): uidlist = func(uid, arg_model_mgr=model_mgr, using=backup_db) friendlist = BackendApi.get_players(self, uidlist, [], using=backup_db) friendmodels = BackendApi.get_model_dict(model_mgr, Friend, [Friend.makeID(uid, fid) for fid in uidlist], using=backup_db) obj_friendlist = [] for friend in friendlist: obj_friend = self.makeListPlayer(friend) friendmodel = friendmodels.get(Friend.makeID(uid, friend.id)) if friendmodel: obj_friend['f_time'] = friendmodel.ctime.strftime("%Y/%m/%d %H:%M:%S") obj_friendlist.append(obj_friend) self.html_param[k] = obj_friendlist # バトル情報. self.html_param['battleKOs'] = BackendApi.get_battleKOs(uid, arg_model_mgr=model_mgr, using=backup_db) battleplayer = BackendApi.get_battleplayer(model_mgr, uid, using=backup_db) if battleplayer: # 最大ランク. self.html_param['max_rank'] = BackendApi.get_battlerank_max(model_mgr, using=backup_db) rankmaster = BackendApi.get_battlerank(model_mgr, battleplayer.rank, using=backup_db) self.html_param['battleplayer'] = Objects.battleplayer(self, battleplayer, rankmaster) # ハプニング. if player.getModel(PlayerHappening): happeningraidset = BackendApi.get_happeningraidset(model_mgr, player.happening, using=backup_db) if happeningraidset: model_happening = happeningraidset.happening.happening prize = BackendApi.aggregate_happeningprize(model_happening, model_happening.is_canceled()) self.html_param['happening'] = Objects.happening(self, happeningraidset, prize) self.html_param['is_ban'] = not BackendApi.check_player_ban(model_mgr, uid, using=backup_db) # スカウトイベント. scevent = [] config = BackendApi.get_current_scouteventconfig(model_mgr, using=backup_db) if config: eventmaster = BackendApi.get_scouteventmaster(model_mgr, config.mid, using=backup_db) if eventmaster: playdata = BackendApi.get_event_playdata(model_mgr, eventmaster.id, uid, using=backup_db) arr = BackendApi.get_event_stages(model_mgr, [playdata.stage], using=backup_db) stage = arr[0] if arr else None arr = BackendApi.get_event_stages(model_mgr, [playdata.cleared], using=backup_db) cleared = arr[0] if arr else None scorerecord = BackendApi.get_scoutevent_scorerecord(model_mgr, eventmaster.id, uid, using=backup_db) produce_list = BackendApi.get_scoutevent_presentprizemaster_by_eventid(model_mgr, eventmaster.id, using=backup_db) produce_data = BackendApi.get_scoutevent_presentnums_record(model_mgr, eventmaster.id, uid, using=backup_db) if produce_data: nums = produce_data.nums else: nums = {} obj_produce_list = [(produce.name, nums.get(produce.number, 0)) for produce in produce_list] tanzaku_list = BackendApi.get_scoutevent_tanzakumaster_by_eventid(model_mgr, eventmaster.id, using=backup_db) obj_tanzaku_list = None current_cast_number = -1 if tanzaku_list: tanzakudata = ScoutEventTanzakuCastData.getByKey(ScoutEventTanzakuCastData.makeID(uid, eventmaster.id), using=backup_db) current_cast_number = tanzakudata.current_cast if tanzakudata else -1 obj_tanzaku_list = [dict(Objects.scoutevent_tanzaku(self, tanzakumaster, tanzakudata), current=current_cast_number==tanzakumaster.number) for tanzakumaster in tanzaku_list] event = {'name': eventmaster.name, 'stage': stage, 'cleared': cleared, 'scorerecord': scorerecord, 'produce_list' : obj_produce_list, 'tanzaku_list' : obj_tanzaku_list, } scevent.insert(0, event) self.html_param['scevent'] = scevent # バトルイベント. battleevent_config = BackendApi.get_current_battleeventconfig(model_mgr, using=backup_db) if battleevent_config.mid: eventmaster = BackendApi.get_battleevent_master(model_mgr, battleevent_config.mid, using=backup_db) if eventmaster: eventid = eventmaster.id obj_battleevent = { 'id' : eventmaster.id, 'name' : eventmaster.name, 'point' : 0, 'point_total' : 0, 'rank' : 0, 'rankname' : u'未参加', 'fame' : 0, 'fame_next' : 0, } scorerecord = BackendApi.get_battleevent_scorerecord(model_mgr, eventid, uid, using=backup_db) if scorerecord: obj_battleevent.update({ 'point' : scorerecord.getPointToday(), 'point_total' : scorerecord.point_total, }) rankrecord = BackendApi.get_battleevent_rankrecord(model_mgr, eventid, uid, using=backup_db) if rankrecord: rank = rankrecord.getRank(battleevent_config) rankmaster = BackendApi.get_battleevent_rankmaster(model_mgr, eventid, rank, using=backup_db) obj_battleevent.update({ 'rank' : rank, 'rankname' : rankmaster.name if rankmaster else u'不明', 'fame' : rankrecord.fame, 'fame_next' : rankrecord.fame_next, }) # ランク別バトルポイント. rankmasterlist = BackendApi.get_battleevent_rankmaster_by_eventid(model_mgr, eventid, using=backup_db, do_check_open=False) idlist = [BattleEventScorePerRank.makeID(uid, BattleEventScorePerRank.makeMid(eventid, rankmaster.rank)) for rankmaster in rankmasterlist] scoredata_dict = BackendApi.get_model_dict(model_mgr, BattleEventScorePerRank, idlist, using=backup_db, key=lambda x:x.rank) obj_rankscorelist = [] rankmasterlist.sort(key=lambda x:x.rank, reverse=True) for rankmaster in rankmasterlist: obj_rankscorelist.append({ 'rank' : rankmaster.rank, 'rankname' : rankmaster.name if rankmaster else u'不明', 'score' : scoredata_dict[rankmaster.rank].point if scoredata_dict.get(rankmaster.rank) else 0, }) obj_battleevent['rankscorelist'] = obj_rankscorelist # 現在の贈り物. presentdata = BackendApi.get_model(model_mgr, BattleEventPresentData, BattleEventPresentData.makeID(uid, eventid), using=backup_db) obj_presentdata = None if presentdata and presentdata.getData(): data = presentdata.getData() presentmaster = BackendApi.get_battleeventpresent_master(model_mgr, eventid, data['number'], using=backup_db) contentmaster = BackendApi.get_battleeventpresent_content_master(model_mgr, data['content'], using=backup_db) obj_presentdata = { 'present' : presentmaster, 'content' : contentmaster, 'point' : presentdata.point, } obj_battleevent['presentdata'] = obj_presentdata self.html_param['battleevent'] = obj_battleevent obj_player['regist'] = regist # ガチャチケット. tickettypes = Defines.GachaConsumeType.GachaTicketType.NAMES.keys() ticket_num_models = BackendApi.get_additional_gachaticket_nums(model_mgr, uid, tickettypes, using=backup_db) ticket_list = [] for tickettype in tickettypes: num_model = ticket_num_models.get(tickettype) ticket_list.append({ 'name' : Defines.GachaConsumeType.GachaTicketType.NAMES[tickettype], 'num' : num_model.num if num_model else 0, }) self.html_param['ticket_list'] = ticket_list # ランキングガチャ. rankinggachascore_list = RankingGachaScore.fetchByOwner(uid, using=backup_db) rankinggacha_master_dict = BackendApi.get_rankinggacha_master_dict(model_mgr, [rankinggachascore.mid for rankinggachascore in rankinggachascore_list], using=backup_db) obj_rankinggacha_list = [] for rankinggachascore in rankinggachascore_list: rankinggacha_master = rankinggacha_master_dict.get(rankinggachascore.mid) obj_rankinggacha_list.append({ 'id' : rankinggachascore.mid, 'name' : rankinggacha_master.name if rankinggacha_master else u'不明', 'single' : rankinggachascore.single, 'total' : rankinggachascore.total, 'firstpoint' : rankinggachascore.firstpoint, 'firsttime' : (rankinggachascore.firsttime or OSAUtil.get_datetime_min()).strftime("%Y-%m-%d %H:%M:%S"), }) self.html_param['rankinggacha_list'] = obj_rankinggacha_list # 店舗. cabaclubstoremaster_all = BackendApi.get_cabaretclub_store_master_all(model_mgr, using=backup_db) midlist = [cabaclubstoremaster.id for cabaclubstoremaster in cabaclubstoremaster_all] store_set_dict = BackendApi.get_cabaretclub_storeset_dict(model_mgr, uid, midlist, using=backup_db) obj_store_list = [] for cabaclubstoremaster in cabaclubstoremaster_all: store_set = store_set_dict.get(cabaclubstoremaster.id) or CabaclubStoreSet(cabaclubstoremaster, None) obj = Objects.cabaclubstore(self, store_set, now) obj['utime'] = store_set.playerdata.utime obj['rtime'] = store_set.playerdata.rtime obj['etime'] = store_set.playerdata.etime obj_store_list.append(obj) self.html_param['cabaclubstore_list'] = obj_store_list # 称号. title_set = BackendApi.get_current_title_set(model_mgr, uid, now, using=backup_db) if title_set: self.html_param['title'] = Objects.title(self, title_set.master, title_set.playerdata, now) self.writeAppHtml('infomations/view_player/detail')