I have run into some problem, I have created the leaderboard, I am able to calculate score, everything’s working fine and as expected.
But I am not able to fetch leaderboard records from server in client side, I am getting an empty array, even though I can clearly see records in my nakama console, Do you know what could possibly be causing this error ?
Here’s the code :
My Nakama Store
import { create } from 'zustand';
import { Client } from '@heroiclabs/nakama-js';
import { v4 as uuidv4 } from 'uuid';
import useUserStore from './useUser';
const useNakamaClient = create((set, get) => ({
client: null,
session: null,
socket: null,
isMatching: false,
matchID: null,
leaderboard: [],
initializeClient: () => {
const client = new Client('defaultkey', 'localhost', '7350');
client.ssl = false;
set({ client });
},
authenticate: async () => {
const { deviceID, setDeviceID, setUserID } = useUserStore.getState();
const { client } = get();
if (!deviceID) {
const newDeviceID = uuidv4();
setDeviceID(newDeviceID);
}
try {
const session = await client.authenticateDevice(deviceID, true);
setUserID(session.user_id);
set({ session });
} catch (error) {
console.error('Authentication failed:', error);
throw error;
}
},
fetchLeaderboard: async () => {
const { session, client } = get();
const leaderboardID = '69420-50000-3000-2';
try {
if (!client || !session) {
console.error('Nakama client or session is not available.');
return;
}
const leaderboardRecords = await client.listLeaderboardRecords(session, leaderboardID, null, 20, null, null, null);
const leaderboardData = leaderboardRecords.map(record => ({
rank: record.rank,
username: record.username,
score: record.score
}));
set({ leaderboard: leaderboardData });
console.log('Leaderboard fetched:', leaderboardData);
} catch (error) {
console.error('Failed to fetch leaderboard:', error);
throw error;
}
},
updateName: async (userName) => {
const { session, client } = get();
if (!userName) return;
try {
if (!client || !session) {
console.error('Nakama client or session is not available.');
return;
}
const updatePayload = { username: userName };
const updateResponse = await client.updateAccount(session, updatePayload);
console.log('Username updated on the server:', updateResponse);
} catch (error) {
console.error('Failed to update username on the server:', error);
throw error;
}
},
findMatch: async (ai = false) => {
set({ isMatching: true });
const { session, client , socket} = get();
const rpcid = 'find_match';
try {
const matches = await client.rpc(session, rpcid, { ai });
const matchID = matches.payload.matchIds[0]
set({ matchID });
await socket.joinMatch(matchID);
set({ isMatching: false });
} catch (error) {
console.error('Match could not be found:', error);
set({ isMatching: false });
throw error;
}
},
makeMove: async (index) => {
const data = { "position": index };
const { socket, matchID } = get();
await socket.sendMatchState(matchID, 4, JSON.stringify(data));
},
createSocketConnection: async () => {
const { session, client } = get();
const socket = client.createSocket(client.ssl, false);
try {
await socket.connect(session);
set({ socket });
} catch (error) {
console.error('Failed to connect WebSocket:', error);
throw error;
}
},
closeSocketConnection: () => {
const { socket } = get();
if (socket) {
socket.disconnect();
set({ socket: null });
console.log('WebSocket connection closed.');
}
},
}));
export default useNakamaClient;
Here I am calling it :
import React, {useEffect} from 'react'
import {useNakamaClient} from '../hooks'
function LeaderBoard() {
const{leaderboard, fetchLeaderboard} = useNakamaClient()
useEffect(() => {
fetchLeaderboard();
}, [fetchLeaderboard]);
console.log("WTF", leaderboard)
return (
<div>LeaderBoard</div>
)
}
export default LeaderBoard
Above was my client side, Here’s my server function where I am creating the leaderboard
func createLeaderboard(ctx context.Context, nk runtime.NakamaModule, logger runtime.Logger) error {
leaderboardID := "69420-50000-3000-2"
resetSchedule := "59 23 * * 0"
metadata := map[string]interface{}{
"displayString": "Weekly Top Scores",
}
err := nk.LeaderboardCreate(ctx, leaderboardID, true, "desc", "set",resetSchedule,metadata,true)
if err != nil {
logger.Error("Could not create leaderboard: %v", err)
return err
}
logger.Info("Leaderboard '%s' created successfully!", leaderboardID)
return nil
}
And here’s my nakama console:
But I am getting this
Here’s My leaderboard and it’s properties: