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
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)
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 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 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..'
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()