def vipAutoSupplyPerDay(userId): """ vip每日自动补足 """ vipLevel = hallvip.userVipSystem.getVipInfo(userId).get("level", 0) key = GameData.autoSupplyKey % config.CHIP_KINDID autoSupplyCount = config.getVipConf(vipLevel).get(key, 0) chips = userchip.getUserChipAll(userId) if autoSupplyCount >= 10000 and chips < autoSupplyCount and weakdata.getDayFishData( userId, key, 0) == 0: weakdata.incrDayFishData(userId, key, 1) lang = util.getLanguage(userId) rewards = [{ "name": config.CHIP_KINDID, "count": (autoSupplyCount - chips) }] message = config.getMultiLangTextConf( "ID_VIP_AUTO_SUPPLY_PER_DAY", lang=lang) % (autoSupplyCount / 10000) mail_system.sendSystemMail(userId, mail_system.MailRewardType.SystemReward, rewards, message) if ftlog.is_debug(): ftlog.debug("vipAutoSupplyPerDay", userId, vipLevel, autoSupplyCount, chips, key, autoSupplyCount - chips)
def sendWelcomeMail(userId): """ 发送欢迎邮件 """ message = None welcomeMailConfs = config.getCommonValueByKey("ignoreConf") clientId = util.getClientId(userId) ftlog.debug("sendWelcomeMail", userId, "clientId = ", clientId) lang = util.getLanguage(userId) rewards = config.getCommonValueByKey("welcomeMailRewards") for welcomeMailConf in welcomeMailConfs: if clientId in welcomeMailConf.get("clientIds", []): # 不可显示实物、人民币相关描述 message = config.getMultiLangTextConf( "ID_CONFIG_BAN_ENTITY_WELCOME_MSG", lang=lang) else: # 可显示实物、人民币相关描述 message = config.getMultiLangTextConf( "ID_CONFIG_ALLOW_ENTITY_WELCOME_MSG", lang=lang) if message: mail_system.sendSystemMail(userId, mail_system.MailRewardType.SystemReward, rewards, message=message, title=config.getMultiLangTextConf( "ID_MAIL_TITLE_HOT_WELCOME", lang=lang))
def provideTimeMatchRankReward(userId, roomId, rank, rankRewards): """ 回馈赛上榜发放宝藏奖励到邮件 """ treasureConf = config.getTreasureConf(effectType=EffectType.MatchRankRewardAdd) if treasureConf: kindId = treasureConf["kindId"] level, levelConf = getTreasureInfo(userId, kindId) if not levelConf: return refreshTreasureState(userId, kindId) treasureData = getTreasure(userId, kindId) if treasureData[INDEX_FINISH_COUNT] >= treasureConf["limitCount"]: return rewards = [] lang = util.getLanguage(userId) ratio = levelConf["params"]["time_match"] for _reward in rankRewards: if _reward["name"] in config.BULLET_VALUE: name = config.BRONZE_BULLET_KINDID count = int(math.ceil(_reward["count"] * config.BULLET_VALUE[_reward["name"]] * ratio)) else: name = _reward["name"] count = int(math.ceil(_reward["count"] * ratio)) rewards.append({"name": name, "count": count}) if rewards: matchName = config.getMultiLangTextConf(gdata.getRoomConfigure(roomId).get("name", ""), lang=lang) treasureName = config.getMultiLangTextConf(treasureConf["name"], lang=lang) message = config.getMultiLangTextConf("ID_CONFIG_TREASURE_TIME_MATCH_RANK", lang=lang) message = message.format(matchName, rank, level, treasureName) title = config.getMultiLangTextConf("ID_MAIL_TITLE_TREASURE_REWARD", lang=lang) mail_system.sendSystemMail(userId, mail_system.MailRewardType.TreasureReward, rewards, message, title) activeTreasure(userId, kindId, treasureData)
def doReturnFee(self, msg): """ 停服准备返还玩家报名费 """ # des = u"由于游戏维护导致您离开了比赛,特将此次报名费全额返还,请您查收!非常抱歉给您带来不便,祝您游戏愉快!" userList = msg.getParam("users") assert (isinstance(userList, list)) for user in userList: userId = user.get("userId", 0) if userId <= config.ROBOT_MAX_USER_ID: continue lang = util.getLanguage(userId) des = config.getMultiLangTextConf("ID_DO_RETURN_FEE_MESSAGE", lang=lang) player = self.match.findPlayer(userId) if player and self.userFee.get(userId, None): fee = self.userFee.get(int(userId)) rewardsList = [] if fee: rewardsList = util.convertToFishItems(fee) self._logger.debug("doReturnFee", "userId=", userId, "fee=", rewardsList) self.match.matchUserIF.unlockUser(self.matchId, self.roomId, player.instId, userId) if rewardsList: mail_system.sendSystemMail( userId, mail_system.MailRewardType.SystemCompensate, rewardsList, des)
def provideFinishGrandPrixReward(userId): """ 完成大奖赛发放宝藏奖励到邮件 """ treasureConf = config.getTreasureConf(effectType=EffectType.MatchItemReward) if treasureConf: kindId = treasureConf["kindId"] level, levelConf = getTreasureInfo(userId, kindId) if not levelConf: return refreshTreasureState(userId, kindId) treasureData = getTreasure(userId, kindId) if treasureData[INDEX_FINISH_COUNT] >= treasureConf["limitCount"]: return rewards = [] lang = util.getLanguage(userId) for _kindId, _count in levelConf.get("params", {}).iteritems(): rewards.append({"name": int(_kindId), "count": _count}) if rewards: treasureName = config.getMultiLangTextConf(treasureConf["name"], lang=lang) message = config.getMultiLangTextConf("ID_CONFIG_TREASURE_FINISH_GRAND_PRIX", lang=lang).format(level, treasureName) title = config.getMultiLangTextConf("ID_MAIL_TITLE_TREASURE_REWARD", lang=lang) mail_system.sendSystemMail(userId, mail_system.MailRewardType.TreasureReward, rewards, message, title) activeTreasure(userId, kindId, treasureData)
def _main(): userId = 100220502 rewards = [{"name": 101, "count": 6560000}] message = u"您好,由于我们的问题给您造成不便,非常抱歉。现在补偿您一份小礼物,请您注意查收。祝您游戏愉快~" # message = u"您好,因为今天您发现并提供了游戏中出现的问题,现在送您一份小礼物哦~非常感谢您对我们游戏的关注。祝您游戏愉快~ " mail_system.sendSystemMail(userId, mail_system.MailType.SystemCompensate, rewards, message) from newfish.entity.gift import gift_system gift_system.doBuyFishGift(100260920, 7311) gift_system.doBuyFishGift(100268749, 7211) gift_system.doBuyFishGift(100185545, 7311)
def _triggerUserVipExpChangeEvent(event): try: rmbs = int(event.toAddExp / 10) rewards = [{ "name": config.SOUVENIR_KINDID, "count": int(RMB_SOUVENIR_RATE * rmbs) }] message = config.getMultiLangTextConf("ID_MAIL_SOUVENIR_COIN_MESSAGE", lang=util.getLanguage( event.userId)) mail_system.sendSystemMail(event.userId, mail_system.MailRewardType.SystemReward, rewards, message) except Exception as e: ftlog.error("souvenir_coin._triggerUserVipExpChangeEvent error", e, "userId=", event.userId, "toAddExp=", event.toAddExp)
def _triggerTYOpenItemEvent(event): userId = event.userId itemKind = event.item.itemKind lang = util.getLanguage(userId) for key, value in config.getChestConf().iteritems(): if value["kindId"] == itemKind.kindId: from hall.entity import halluser from hall.entity.todotask import TodoTaskShowInfo, TodoTaskHelper from newfish.entity import mail_system message = config.getMultiLangTextConf("ID_OPEN_ITEM_GET_REWARD_MSG", lang=lang) % value["name"] GameMsg.sendPrivate(FISH_GAMEID, userId, 0, message) todoTask = TodoTaskShowInfo(message) TodoTaskHelper.sendTodoTask(FISH_GAMEID, userId, todoTask) halluser.ensureGameDataExists(userId, FISH_GAMEID, util.getClientId(userId)) message = config.getMultiLangTextConf("ID_USE_ITEM_GET_REWARD_MSG", lang=lang).format(itemKind.displayName, value["name"]) rewards = [{"name": value["chestId"], "count": 1}] mail_system.sendSystemMail(userId, mail_system.MailRewardType.ChestReward, rewards, message) break
def sendUpdateRewards(userId, clientId): """ 发放更服奖励 """ conf = config.getUpdateVerRewardsConf() updateClientVer = conf.get("version") if updateClientVer is None: return clientVersion = gamedata.getGameAttr(userId, config.FISH_GAMEID, GameData.clientVersion) if clientVersion == updateClientVer: updateVerRewards = gamedata.getGameAttrJson(userId, config.FISH_GAMEID, GameData.updateVerRewards, []) if clientVersion not in updateVerRewards: updateVerRewards.append(clientVersion) gamedata.setGameAttr(userId, config.FISH_GAMEID, GameData.updateVerRewards, json.dumps(updateVerRewards)) rewardTye = conf.get("type", 1) vipLv = hallvip.userVipSystem.getUserVip(userId).vipLevel.level #message = conf.get("msg", "")# u"您的版本更新已完成,以下是更新奖励,祝您游戏愉快!" lang = util.getLanguage(userId, clientId) message = config.getMultiLangTextConf(conf.get("msg", ""), lang=lang) rewards = conf.get("rewards", {}).get(str(vipLv), {}).get(str(rewardTye), []) if rewards: mail_system.sendSystemMail( userId, mail_system.MailRewardType.SystemCompensate, rewards, message, config.getMultiLangTextConf( "ID_MAIL_VERSION_UPDATE_REWARDS", lang=lang)) if ftlog.is_debug(): ftlog.debug("sendUpdateRewards, userId =", userId, "vip =", vipLv, "type =", rewardTye, "rewards =", rewards, "updateVer =", updateClientVer, "updateVerRewards =", updateVerRewards)
def provideFinishTimeMatchReward(userId, bigRoomId): """ 完成回馈赛发放宝藏奖励到邮件 """ treasureConf = config.getTreasureConf(effectType=EffectType.MatchRewardAdd) if treasureConf: kindId = treasureConf["kindId"] level, levelConf = getTreasureInfo(userId, kindId) if not levelConf: return refreshTreasureState(userId, kindId) treasureData = getTreasure(userId, kindId) if treasureData[INDEX_FINISH_COUNT] >= treasureConf["limitCount"]: return lang = util.getLanguage(userId) if str(bigRoomId) in levelConf.get("params", {}): matchName = config.getMultiLangTextConf(gdata.getRoomConfigure(bigRoomId).get("name", ""), lang=lang) rewards = [{"name": config.CHIP_KINDID, "count": levelConf["params"][str(bigRoomId)]}] treasureName = config.getMultiLangTextConf(treasureConf["name"], lang=lang) message = config.getMultiLangTextConf("ID_CONFIG_TREASURE_FINISH_TIME_MATCH", lang=lang) message = message.format(matchName, level, treasureName) title = config.getMultiLangTextConf("ID_MAIL_TITLE_TREASURE_REWARD", lang=lang) mail_system.sendSystemMail(userId, mail_system.MailRewardType.TreasureReward, rewards, message, title) activeTreasure(userId, kindId, treasureData)
def _sendHonorCompensate(userId): """ 称号补偿 """ from newfish.entity import mail_system from newfish.entity.mail_system import MailRewardType oldKey = "honor2:%d:%d" % (FISH_GAMEID, userId) value = daobase.executeUserCmd(userId, "HGETALL", oldKey) if not value: return if gamedata.getGameAttrInt(userId, FISH_GAMEID, GameData.compensateOldHonor): return honorIds = value[0::2] infos = [strutil.loads(info, False, True) for info in value[1::2] if info] honorData = dict(zip(honorIds, infos)) compensateRewards = {} compensateConf = config.getAchievementConf().get("compensate", {}) compensateKeys = compensateConf.keys() for key_, value_ in honorData.iteritems(): key_ = str(key_) if key_ in compensateKeys and value_[INDEX_STATE] > 0: _reward = compensateConf.get(key_, {}) compensateRewards.setdefault(_reward.get("name"), 0) compensateRewards[_reward.get("name")] += _reward.get("count") rewards = [] for k, v in compensateRewards.iteritems(): rewards.append({"name": int(k), "count": int(v)}) msg = config.getMultiLangTextConf("ID_HONOR_TASK_CHANGE_REWARD_MSG", lang=util.getLanguage(userId)) if rewards: mail_system.sendSystemMail(userId, MailRewardType.SystemCompensate, rewards, msg) # daobase.executeUserCmd(userId, "del", oldKey) gamedata.setGameAttr(userId, FISH_GAMEID, GameData.compensateOldHonor, 1)
def doBuyGift(userId, clientId, giftId, buyType, itemId=0): """ 购买礼包 """ if ftlog.is_debug(): ftlog.debug("doBuyGift===>", userId, clientId, giftId, buyType) giftConf = config.getDailyGiftConf(clientId).get(str(giftId), {}) continuousDay = _getContinuousDay(userId, giftId) dayIdx = _getGiftDayIdx(clientId, giftId, continuousDay) lang = util.getLanguage(userId, clientId) commonRewards = [] chestRewards = [] chestId = 0 giftName = config.getMultiLangTextConf(giftConf["giftName"], lang=lang) # 使用其他货币(非direct)购买 if giftConf.get("otherBuyType", {}).get(buyType): price = giftConf.get("otherBuyType", {}).get(buyType) # 代购券购买礼包 if buyType == BT_VOUCHER: _consume = [{"name": VOUCHER_KINDID, "count": abs(price)}] _ret = util.consumeItems(userId, _consume, "BI_NFISH_BUY_ITEM_CONSUME", intEventParam=int(giftId), param01=int(giftId)) if not _ret: code = 1 _sendBuyGiftRet(userId, clientId, giftId, code, chestId, commonRewards, chestRewards) return else: code = 0 vip_system.addUserVipExp(FISH_GAMEID, userId, abs(price) * 10, "BUY_PRODUCT", pokerconf.productIdToNumber( giftConf["productId"]), giftConf["productId"], rmbs=abs(price)) # message = u"您使用%s代购券,购买商品【%s】, 获得%s" % (price, giftConf["giftName"], giftConf["giftName"]) message = config.getMultiLangTextConf( "ID_BUY_GIFT_RET_BY_VOUCHER", lang=lang).format(price, giftName, giftName) GameMsg.sendPrivate(FISH_GAMEID, userId, 0, message) else: code = 1 _sendBuyGiftRet(userId, clientId, giftId, code, chestId, commonRewards, chestRewards) return elif buyType == config.BT_DIAMOND: price = giftConf.get("price", 0) price, isSucc = store.getUseRebateItemPrice(userId, itemId, price, buyType, giftId, clientId) code = 0 if price > 0: consumeCount = 0 if isSucc: store.autoConvertVoucherToDiamond(userId, price) consumeCount, final = userchip.incrDiamond( userId, FISH_GAMEID, -abs(price), 0, "BI_NFISH_BUY_ITEM_CONSUME", int(giftId), util.getClientId(userId), param01=giftId) if not isSucc or abs(consumeCount) != price: code = 1 _sendBuyGiftRet(userId, clientId, giftId, code, chestId, commonRewards, chestRewards) return else: code = 0 # message = u"您购买商品【%s】, 获得%s" % (giftConf["giftName"], giftConf["giftName"]) message = config.getMultiLangTextConf("ID_BUY_GIFT_RET_BY_DRIECT", lang=lang).format( giftName, giftName) GameMsg.sendPrivate(FISH_GAMEID, userId, 0, message) # 记录存档 boughtGift = weakdata.getDayFishData(userId, WeakData.buyFishDailyGift, []) boughtGift.append(giftId) weakdata.setDayFishData(userId, WeakData.buyFishDailyGift, json.dumps(boughtGift)) # 记录每日礼包购买次数. buyFishDailyGiftTimes = gamedata.getGameAttrJson( userId, FISH_GAMEID, GameData.buyFishDailyGiftTimes, {}) buyFishDailyGiftTimes.setdefault(str(giftId), 0) buyFishDailyGiftTimes[str(giftId)] += 1 gamedata.setGameAttr(userId, FISH_GAMEID, GameData.buyFishDailyGiftTimes, json.dumps(buyFishDailyGiftTimes)) purchaseData = gamedata.getGameAttrJson(userId, FISH_GAMEID, GameData.continuousPurchase, {}) data = purchaseData.get(str(giftId), [0, 0]) if util.getDayStartTimestamp( data[0]) + 24 * 60 * 60 < util.getDayStartTimestamp( int(time.time())): data[1] = 1 else: data[1] += 1 data[0] = int(time.time()) purchaseData[str(giftId)] = data gamedata.setGameAttr(userId, FISH_GAMEID, GameData.continuousPurchase, json.dumps(purchaseData)) # 发奖励 mail_rewards = [] giftInfo = giftConf.get("giftInfo", []) for gift in giftInfo: if gift["day_idx"] == dayIdx: for item in gift.get("items", []): if util.isChestRewardId(item["itemId"]): # 宝箱 chestId = item["itemId"] rewards = chest_system.getChestRewards(userId, chestId) if buyType == BT_VOUCHER or buyType == config.BT_DIAMOND: code = chest_system.deliveryChestRewards( userId, chestId, rewards, "BI_NFISH_BUY_ITEM_GAIN") else: code = 0 gamedata.incrGameAttr(userId, FISH_GAMEID, GameData.openChestCount, 1) bireport.reportGameEvent("BI_NFISH_GE_CHEST_OPEN", userId, FISH_GAMEID, 0, 0, int(chestId), 0, 0, 0, [], util.getClientId(userId)) chestRewards.extend(rewards) mail_rewards.extend([{"name": item["itemId"], "count": 1}]) else: # 资产/道具 rewards = [{ "name": item["itemId"], "count": item["count"] }] if buyType == BT_VOUCHER or buyType == config.BT_DIAMOND: code = util.addRewards(userId, rewards, "BI_NFISH_BUY_ITEM_GAIN", int(giftId), param01=int(giftId)) else: code = 0 commonRewards.extend(rewards) mail_rewards.extend(rewards) break if buyType == BT_VOUCHER or buyType == config.BT_DIAMOND: _sendBuyGiftRet(userId, clientId, giftId, code, chestId, commonRewards, chestRewards) else: message = config.getMultiLangTextConf("ID_DO_BUY_GIFT_MSG", lang=lang) % giftName title = config.getMultiLangTextConf("ID_MAIL_TITLE_DAILY_GIFT", lang=lang) mail_system.sendSystemMail(userId, mail_system.MailRewardType.SystemReward, mail_rewards, message, title) doSendGift(userId, clientId) # 购买礼包事件 from newfish.game import TGFish from newfish.entity.event import GiftBuyEvent event = GiftBuyEvent(userId, FISH_GAMEID, giftConf["productId"], buyType, giftId) TGFish.getEventBus().publishEvent(event) util.addProductBuyEvent(userId, giftConf["productId"], clientId)
def sendVipSpringFestivalRewards(userId): """ vip玩家2019年春节礼包 """ vip_springfestival_rewards = { 1: { "name": 101, "count": 10000 }, 2: { "name": 101, "count": 30000 }, 3: { "name": 101, "count": 60000 }, 4: { "name": 101, "count": 100000 }, 5: { "name": 101, "count": 200000 }, 6: { "name": 101, "count": 300000 }, 7: { "name": 101, "count": 500000 }, 8: { "name": 101, "count": 1000000 }, 9: { "name": 101, "count": 1600000 }, 10: { "name": 101, "count": 3000000 }, 11: { "name": 101, "count": 6000000 }, 12: { "name": 101, "count": 10000000 } } lang = util.getLanguage(userId) vip_springfestival_message = config.getMultiLangTextConf( "ID_VIP_SPRING_FESTIVAL_MESSAGE", lang=lang) springFestival_time = { "start": "2019-01-31 00:00:00", "end": "2019-02-05 23:59:59" } if util.isTimeEffective(springFestival_time) is False: return if gamedata.getGameAttrInt( userId, FISH_GAMEID, "vip2019SpringFestivalRewards") == 0: # vip2019NewYearRewards vipLevel = hallvip.userVipSystem.getVipInfo(userId).get("level", 0) rewards = vip_springfestival_rewards.get(vipLevel, None) if rewards is not None: gamedata.setGameAttr(userId, FISH_GAMEID, "vip2019SpringFestivalRewards", 1) # vip2019NewYearRewards mail_system.sendSystemMail(userId, mail_system.MailRewardType.SystemReward, [rewards], vip_springfestival_message)
def provideRankReward(userId, rankId, rankType, rank, params): """ 特定排行榜上榜发放宝藏奖励到邮件 """ from newfish.entity.ranking import ranking_system lang = util.getLanguage(userId) if rankId == config.RANK_GRAND_PRIX: # 大奖赛 treasureConf = config.getTreasureConf(effectType=EffectType.MatchRankRewardAdd) if treasureConf: kindId = treasureConf["kindId"] level, levelConf = getTreasureInfo(userId, kindId) if not levelConf: return refreshTreasureState(userId, kindId) treasureData = getTreasure(userId, kindId) if treasureData[INDEX_FINISH_COUNT] >= treasureConf["limitCount"]: return rewards = [] ratio = levelConf["params"]["grand_prix"] for _reward in params["rewards"]: if _reward["name"] in config.BULLET_VALUE: name = config.BRONZE_BULLET_KINDID count = int(math.ceil(_reward["count"] * config.BULLET_VALUE[_reward["name"]] * ratio)) else: name = _reward["name"] count = int(math.ceil(_reward["count"] * ratio)) rewards.append({"name": name, "count": count}) if rewards: treasureName = config.getMultiLangTextConf(treasureConf["name"], lang=lang) message = config.getMultiLangTextConf("ID_CONFIG_TREASURE_GRAND_PRIX_RANK", lang=lang) message = message.format(rank, level, treasureName) title = config.getMultiLangTextConf("ID_MAIL_TITLE_TREASURE_REWARD", lang=lang) mail_system.sendSystemMail(userId, mail_system.MailRewardType.TreasureReward, rewards, message, title) activeTreasure(userId, kindId, treasureData) # elif rankType in ranking_system.SbossPointRankTypeDefineIndexDict: # # Boss幸运榜 # treasureConf = config.getTreasureConf(effectType=EffectType.BossRankRewardAdd) # if treasureConf: # kindId = treasureConf["kindId"] # level, levelConf = getTreasureInfo(userId, kindId) # if not levelConf: # return # refreshTreasureState(userId, kindId) # treasureData = getTreasure(userId, kindId) # if treasureData[INDEX_FINISH_COUNT] >= treasureConf["limitCount"]: # return # rewards = [] # ratio = levelConf["params"]["boss"] # for _reward in params["rewards"]: # if _reward["name"] in config.BULLET_VALUE: # name = config.BRONZE_BULLET_KINDID # count = int(math.ceil(_reward["count"] * config.BULLET_VALUE[_reward["name"]] * ratio)) # else: # name = _reward["name"] # count = int(math.ceil(_reward["count"] * ratio)) # rewards.append({"name": name, "count": count}) # if rewards: # rankRewardConf = config.getRankRewardConf(rankType) # rankName = config.getMultiLangTextConf(rankRewardConf["rankName"], lang=lang) # treasureName = config.getMultiLangTextConf(treasureConf["name"], lang=lang) # message = config.getMultiLangTextConf("ID_CONFIG_TREASURE_BOSS_RANK", lang=lang).format(rankName, rank, level, treasureName) # title = config.getMultiLangTextConf("ID_MAIL_TITLE_TREASURE_REWARD", lang=lang) # mail_system.sendSystemMail(userId, mail_system.MailRewardType.TreasureReward, rewards, message, title) # activeTreasure(userId, kindId, treasureData) elif rankId == config.RANK_ROBBERY_DAY_WIN: # 招财赢家榜 treasureConf = config.getTreasureConf(effectType=EffectType.BossRankRewardAdd) if treasureConf: kindId = treasureConf["kindId"] level, levelConf = getTreasureInfo(userId, kindId) if not levelConf: return refreshTreasureState(userId, kindId) treasureData = getTreasure(userId, kindId) if treasureData[INDEX_FINISH_COUNT] >= treasureConf["limitCount"]: return ratio = levelConf["params"]["robbery"] count = int(math.ceil(params["originCount"] * ratio)) rewards = [{"name": config.BRONZE_BULLET_KINDID, "count": count}] treasureName = config.getMultiLangTextConf(treasureConf["name"], lang=lang) message = config.getMultiLangTextConf("ID_CONFIG_TREASURE_ROBBERY_RANK", lang=lang) message = message.format(rank, level, treasureName) title = config.getMultiLangTextConf("ID_MAIL_TITLE_TREASURE_REWARD", lang=lang) mail_system.sendSystemMail(userId, mail_system.MailRewardType.TreasureReward, rewards, message, title) activeTreasure(userId, kindId, treasureData)