Leaderboard Reset Callback failed in TS env

I listen to “registerLeaderboardReset” callback after creating the leaderboard. The leaderboard gets reset based on the CRON timer but the callback is not called. Sharing the code below. Please guide if I have done any logical error.

function InitModule(_ctx: nkruntime.Context, logger: nkruntime.Logger, _nk: nkruntime.Nakama, initializer: nkruntime.Initializer)
{
    logger.info(`Hello World!............................`);
    //rest of the code.

    function createLeaderboard()
    {
        let id = WEEKLY_LEADERBOARD;
        let authoritative = true;
        let sort = nkruntime.SortOrder.DESCENDING;
        let operator = nkruntime.Operator.INCREMENTAL;
        let reset = '0 0 * * 0'; // Resets every sunday at midnight

        try
        {
            _nk.leaderboardCreate(id, authoritative, sort, operator, reset);
            logger.info("createLeaderboard success......... ")

            // Register leaderboard reset event
            initializer.registerLeaderboardReset(leaderboardResetCallback);

        } catch (error)
        {
            // Handle error
            logger.info("createLeaderboard failed......... ")
        }
    }

    createLeaderboard();
}

function leaderboardResetCallback(ctx: nkruntime.Context, logger: nkruntime.Logger, nk: nkruntime.Nakama, leaderboard: nkruntime.Leaderboard)
{
    logger.info(`Leaderboard ${leaderboard.id} has been reset.`);

    try
    {
        // Fetch the leaderboard records
        let results = nk.leaderboardRecordsList(leaderboard.id, [], 1, undefined);

        if (results && results.records && results.records.length > 0)
        {
            let topRecord = results.records[0];
            let topPlayerId = topRecord.ownerId;

            // Reward the top player with 2000 coins
            let changeset = {coins: 2000};
            nk.walletUpdate(topPlayerId, changeset, {}, true);
            logger.info(`Top player ${topPlayerId} rewarded with 2000 coins.`);

            //Reward notification to the winner
            {
                // Send a persistent message to the top player
                let content = {reward: 2000, message: "Congratulations! You've been rewarded with 2000 coins for being the top player."};
                let subject = "Weekly Leaderboard Reward";
                let senderId = ""; // Can be an empty string or a specific sender ID

                // Send the notification with the correct content type
                nk.notificationSend(topPlayerId, subject, content, NOTIFICATION_MSG_WEEKLY_LEADERBOARD_REWARD, senderId, true);
                logger.info(`Notification sent to top player ${topPlayerId}.`);
            }
        } else
        {
            logger.info("No players in the leaderboard.");
        }
    } catch (error)
    {
        logger.error(`Failed to fetch leaderboard records or update wallet: ${error}`);
    }
}

Hello @Sathyaraj,

The initializer.registerLeaderboardReset function cannot be nested inside a another function - whilst this is valid JS, it’s a limitation of the Nakama JS runtime, the function registration needs to be in the InitModule body.

You’re catching the error but not re-throwing it, your code does prints:

 logger.info("createLeaderboard failed......... ")

indicating that registerLeaderboardReset is throwing an error you’re not handling.

After you fix the above, also make sure that you see:

Registered JavaScript runtime Leaderboard Reset function invocation

in the server logs after startup.

Hope this helps

Thanks, that did the trick. I moved the registerLeaderboardReset callback inside that try block only to listen if it succeeds.