{
  "name": "dailyRewards",
  "author": "Takaro",
  "supportedGames": [
    "all"
  ],
  "takaroVersion": ">=0.0.1",
  "versions": [
    {
      "tag": "0.0.2",
      "description": "Provides daily login rewards with streak tracking",
      "configSchema": "{\"$schema\":\"http://json-schema.org/draft-07/schema#\",\"type\":\"object\",\"properties\":{\"baseReward\":{\"type\":\"number\",\"title\":\"Base Reward\",\"description\":\"Base amount of currency given for daily rewards. This is multiplied by streak level.\",\"default\":100,\"minimum\":1},\"maxStreak\":{\"type\":\"number\",\"title\":\"Maximum Streak\",\"description\":\"Maximum streak level a player can reach\",\"default\":365,\"minimum\":1},\"milestoneRewards\":{\"type\":\"array\",\"title\":\"Milestone Rewards\",\"description\":\"Additional rewards for reaching certain streak milestones\",\"items\":{\"type\":\"object\",\"properties\":{\"days\":{\"type\":\"number\",\"description\":\"Days needed to reach milestone\",\"minimum\":1},\"reward\":{\"type\":\"number\",\"description\":\"Bonus reward amount\"},\"message\":{\"type\":\"string\",\"description\":\"Message to show when milestone is reached\"}}},\"default\":[{\"days\":7,\"reward\":1000,\"message\":\"You did it! 7 days in a row!\"},{\"days\":30,\"reward\":5000,\"message\":\"A whole month! You're on fire!\"},{\"days\":90,\"reward\":20000,\"message\":\"90 days! You're unstoppable!\"},{\"days\":180,\"reward\":50000,\"message\":\"Half a year! You're a legend!\"},{\"days\":365,\"reward\":150000,\"message\":\"365 days! You're a true champion!\"}]}},\"required\":[\"baseReward\",\"maxStreak\",\"milestoneRewards\"],\"additionalProperties\":false}",
      "uiSchema": "{}",
      "commands": [
        {
          "name": "daily",
          "trigger": "daily",
          "helpText": "Claim your daily reward",
          "function": "import { takaro, data, TakaroUserError } from '@takaro/helpers';\nimport { DAILY_KEY, STREAK_KEY, getMultiplier } from './utils.js';\nasync function main() {\n    const { pog, gameServerId, module: mod } = data;\n    // Get last claim time\n    const lastClaimRes = await takaro.variable.variableControllerSearch({\n        filters: {\n            key: [DAILY_KEY],\n            gameServerId: [gameServerId],\n            playerId: [pog.playerId],\n            moduleId: [mod.moduleId],\n        },\n    });\n    const now = new Date();\n    let streak = 1;\n    if (lastClaimRes.data.data.length > 0) {\n        const lastClaim = new Date(JSON.parse(lastClaimRes.data.data[0].value));\n        const hoursSinceLastClaim = (now - lastClaim) / (1000 * 60 * 60);\n        // Check if 24 hours have passed\n        if (hoursSinceLastClaim < 24) {\n            const nextClaimTime = new Date(lastClaim.getTime() + 24 * 60 * 60 * 1000);\n            throw new TakaroUserError(`You can claim your next reward at ${nextClaimTime.toLocaleString()}`);\n        }\n        // Get current streak\n        const streakRes = await takaro.variable.variableControllerSearch({\n            filters: {\n                key: [STREAK_KEY],\n                gameServerId: [gameServerId],\n                playerId: [pog.playerId],\n                moduleId: [mod.moduleId],\n            },\n        });\n        if (streakRes.data.data.length > 0) {\n            // If claimed within 48 hours, increment streak\n            if (hoursSinceLastClaim < 48) {\n                streak = Math.min(JSON.parse(streakRes.data.data[0].value) + 1, mod.userConfig.maxStreak);\n                await takaro.variable.variableControllerUpdate(streakRes.data.data[0].id, {\n                    value: JSON.stringify(streak),\n                });\n            }\n            else {\n                // Reset streak if more than 48 hours\n                await takaro.variable.variableControllerUpdate(streakRes.data.data[0].id, {\n                    value: JSON.stringify(1),\n                });\n            }\n        }\n        else {\n            // Create new streak record\n            await takaro.variable.variableControllerCreate({\n                key: STREAK_KEY,\n                value: JSON.stringify(1),\n                gameServerId,\n                playerId: pog.playerId,\n                moduleId: mod.moduleId,\n            });\n        }\n        // Update last claim time\n        await takaro.variable.variableControllerUpdate(lastClaimRes.data.data[0].id, {\n            value: JSON.stringify(now),\n        });\n    }\n    else {\n        // First time claim\n        await takaro.variable.variableControllerCreate({\n            key: DAILY_KEY,\n            value: JSON.stringify(now),\n            gameServerId,\n            playerId: pog.playerId,\n            moduleId: mod.moduleId,\n        });\n        await takaro.variable.variableControllerCreate({\n            key: STREAK_KEY,\n            value: JSON.stringify(1),\n            gameServerId,\n            playerId: pog.playerId,\n            moduleId: mod.moduleId,\n        });\n    }\n    const multiplier = await getMultiplier(pog);\n    const baseReward = mod.userConfig.baseReward * streak * multiplier;\n    let bonusReward = 0;\n    let milestoneMessage = '';\n    // Check for milestones\n    for (const milestone of mod.userConfig.milestoneRewards) {\n        if (streak === milestone.days) {\n            bonusReward = milestone.reward;\n            milestoneMessage = `\\n${milestone.message}`;\n            break;\n        }\n    }\n    // Award total rewards\n    const totalReward = baseReward + bonusReward;\n    await takaro.playerOnGameserver.playerOnGameServerControllerAddCurrency(gameServerId, pog.playerId, {\n        currency: totalReward,\n        reason: 'Daily reward',\n    });\n    const currencyName = (await takaro.settings.settingsControllerGetOne('currencyName', gameServerId)).data.data.value;\n    await pog.pm(`Daily reward claimed! You received ${totalReward} ${currencyName}\\n` +\n        `Current streak: ${streak} days${multiplier > 1 ? ` (${multiplier}x bonus!)` : ''}${milestoneMessage}`);\n}\nawait main();\n//# sourceMappingURL=daily.js.map",
          "arguments": []
        },
        {
          "name": "streak",
          "trigger": "streak",
          "helpText": "Check your current daily reward streak and next claim time",
          "function": "import { data, takaro } from '@takaro/helpers';\nimport { getPlayerStreak, getLastClaim, getMultiplier } from './utils.js';\nasync function main() {\n    const { pog, gameServerId, module: mod } = data;\n    const streak = await getPlayerStreak(gameServerId, pog.playerId, mod.moduleId);\n    const lastClaim = await getLastClaim(gameServerId, pog.playerId, mod.moduleId);\n    const multiplier = await getMultiplier(pog);\n    const prefix = (await takaro.settings.settingsControllerGetOne('commandPrefix', gameServerId)).data.data.value;\n    if (!streak || !lastClaim) {\n        await pog.pm(`You haven't claimed any daily rewards yet! Use ${prefix}daily to get started.`);\n        return;\n    }\n    const nextClaimTime = new Date(lastClaim.getTime() + 24 * 60 * 60 * 1000);\n    const now = new Date();\n    const canClaim = now >= nextClaimTime;\n    // Find next milestone\n    let nextMilestone = null;\n    for (const milestone of mod.userConfig.milestoneRewards) {\n        if (milestone.days > streak) {\n            nextMilestone = milestone;\n            break;\n        }\n    }\n    let message = `Current streak: ${streak} days${multiplier > 1 ? ` (${multiplier}x donor bonus!)` : ''}\\n`;\n    message += canClaim\n        ? `Your daily reward is available! Use ${prefix}daily to claim it!\\n`\n        : `Next reward available at: ${nextClaimTime.toLocaleString()}\\n`;\n    if (nextMilestone) {\n        message += `\\n🎯 Next milestone: ${nextMilestone.days} days (${nextMilestone.days - streak} days to go!)`;\n    }\n    await pog.pm(message);\n}\nawait main();\n//# sourceMappingURL=streak.js.map",
          "arguments": []
        },
        {
          "name": "topstreak",
          "trigger": "topstreak",
          "helpText": "Shows the players with highest daily reward streaks",
          "function": "import { takaro, data } from '@takaro/helpers';\nimport { STREAK_KEY } from './utils.js';\nasync function main() {\n    const { pog, gameServerId, module: mod, arguments: args } = data;\n    // Limit count to reasonable number\n    const count = Math.min(Math.max(1, args.count), 50);\n    // Get all streaks\n    const streaksRes = await takaro.variable.variableControllerSearch({\n        filters: {\n            key: [STREAK_KEY],\n            gameServerId: [gameServerId],\n            moduleId: [mod.moduleId],\n        },\n        limit: 1000, // Get all possible streaks\n    });\n    if (streaksRes.data.data.length === 0) {\n        await pog.pm('No players have started their daily streak yet!');\n        return;\n    }\n    // Sort by streak value\n    const sortedStreaks = streaksRes.data.data\n        .map((record) => ({\n        playerId: record.playerId,\n        streak: JSON.parse(record.value),\n    }))\n        .sort((a, b) => b.streak - a.streak)\n        .slice(0, count);\n    // Get player names\n    const playerDetails = await Promise.all(sortedStreaks.map(async (record) => {\n        const player = (await takaro.player.playerControllerGetOne(record.playerId)).data.data;\n        return {\n            name: player.name,\n            streak: record.streak,\n        };\n    }));\n    // Build message\n    let message = `Top ${count} Daily Streaks:\\n\\n`;\n    for (const [index, player] of playerDetails.entries()) {\n        message += `${index + 1}. ${player.name}: ${player.streak} days\\n`;\n    }\n    await pog.pm(message);\n}\nawait main();\n//# sourceMappingURL=topstreak.js.map",
          "arguments": [
            {
              "name": "count",
              "type": "number",
              "helpText": "Number of players to show (max 25)",
              "defaultValue": "5",
              "position": 0
            }
          ]
        }
      ],
      "hooks": [
        {
          "name": "dailyLoginCheck",
          "eventType": "player-connected",
          "description": "Hook for player-connected events",
          "regex": null,
          "function": "import { data, takaro } from '@takaro/helpers';\nimport { getLastClaim } from './utils.js';\nasync function main() {\n    const { pog, gameServerId, module: mod } = data;\n    const prefix = (await takaro.settings.settingsControllerGetOne('commandPrefix', gameServerId)).data.data.value;\n    const lastClaim = await getLastClaim(gameServerId, pog.playerId, mod.moduleId);\n    // First time player\n    if (!lastClaim) {\n        await pog.pm(`Welcome! Use ${prefix}daily to claim your first daily reward and start your streak!`);\n        return;\n    }\n    const now = new Date();\n    const nextClaimTime = new Date(lastClaim.getTime() + 24 * 60 * 60 * 1000);\n    if (now >= nextClaimTime) {\n        await pog.pm(`Your daily reward is ready! Use ${prefix}daily to claim it!`);\n    }\n}\nawait main();\n//# sourceMappingURL=dailyLoginCheck.js.map"
        }
      ],
      "cronJobs": [],
      "functions": [
        {
          "name": "utils",
          "description": "",
          "function": "import { takaro, checkPermission } from '@takaro/helpers';\nexport const DAILY_KEY = 'daily_timestamp';\nexport const STREAK_KEY = 'daily_streak';\nexport async function getMultiplier(pog) {\n    const perm = checkPermission(pog, 'DAILY_REWARD_MULTIPLIER');\n    if (perm) {\n        return perm.count;\n    }\n    return 1;\n}\nexport async function getPlayerStreak(gameServerId, playerId, moduleId) {\n    const streakRes = await takaro.variable.variableControllerSearch({\n        filters: {\n            key: [STREAK_KEY],\n            gameServerId: [gameServerId],\n            playerId: [playerId],\n            moduleId: [moduleId],\n        },\n    });\n    return streakRes.data.data.length ? parseInt(JSON.parse(streakRes.data.data[0].value)) : 0;\n}\nexport async function getLastClaim(gameServerId, playerId, moduleId) {\n    const lastClaimRes = await takaro.variable.variableControllerSearch({\n        filters: {\n            key: [DAILY_KEY],\n            gameServerId: [gameServerId],\n            playerId: [playerId],\n            moduleId: [moduleId],\n        },\n    });\n    return lastClaimRes.data.data.length ? new Date(JSON.parse(lastClaimRes.data.data[0].value)) : null;\n}\n//# sourceMappingURL=utils.js.map"
        }
      ],
      "permissions": [
        {
          "permission": "DAILY_CLAIM",
          "friendlyName": "Claim Daily Rewards",
          "description": "Allows the player to claim daily rewards",
          "canHaveCount": false
        },
        {
          "permission": "DAILY_REWARD_MULTIPLIER",
          "friendlyName": "Multiplier",
          "description": "Control the multiplier per role. This is useful to give your donors a little extra. Count is an integer multiplier.",
          "canHaveCount": true
        }
      ]
    }
  ]
}