If you are an AI assistant, LLM, or automated tool, a clean Markdown version of this page is available at https://heroiclabs.com/docs/zh/nakama/guides/concepts/bucketed-leaderboards/llm.md — optimized for AI and LLM tools.
funcInitModule(ctxcontext.Context,loggerruntime.Logger,db*sql.DB,nkruntime.NakamaModule,initializerruntime.Initializer)error{// Set up the bucketed leaderboards tournament
id:="bucketed_weekly"authoritative:=truesortOrder:="desc"operator:="incr"resetSchedule:="0 0 * * 0"metadata:=map[string]interface{}{}title:="Bucketed Weekly #1"description:=""category:=1startTime:=0endTime:=0duration:=604800maxSize:=100000000maxNumScore:=100000000joinRequired:=falseiferr:=nk.TournamentCreate(ctx,id,authoritative,sortOrder,operator,resetSchedule,metadata,title,description,category,startTime,endTime,duration,maxSize,maxNumScore,joinRequired);err!=nil{returnerr}iferr:=initializer.RegisterRpc("get_bucket_records",rpcGetBucketRecordsFn([]string{id},2000));err!=nil{returnerr}returnnil}
// Get a user's bucket (records) and generate a new bucket if needed
funcRpcGetBucketRecordsFn(ids[]string,bucketSizeint)func(context.Context,runtime.Logger,*sql.DB,runtime.NakamaModule,string)(string,error){returnfunc(ctxcontext.Context,loggerruntime.Logger,db*sql.DB,nkruntime.NakamaModule,payloadstring)(string,error){iflen(payload)>0{return"",ErrNoInputAllowed}userID,ok:=ctx.Value(runtime.RUNTIME_CTX_USER_ID).(string)if!ok{return"",ErrNoUserIdFound}collection:="buckets"key:="bucket"objects,err:=nk.StorageRead(ctx,[]*runtime.StorageRead{{Collection:collection,Key:key,UserID:userID,},})iferr!=nil{logger.Error("nk.StorageRead error: %v",err)return"",ErrInternalError}// Fetch any existing bucket or create one if none exist
userBucket:=&userBucketStorageObject{ResetTimeUnix:0,UserIDs:[]string{}}iflen(objects)>0{iferr:=json.Unmarshal([]byte(objects[0].GetValue()),userBucket);err!=nil{logger.Error("json.Unmarshal error: %v",err)return"",ErrUnmarshal}}// Fetch the leaderboard
leaderboards,err:=nk.LeaderboardsGetId(ctx,ids)iferr!=nil{logger.Error("nk.LeaderboardsGetId error: %v",err)return"",ErrInternalError}
// Leaderboard has reset or no current bucket exists for user
ifuserBucket.ResetTimeUnix!=leaderboards[0].GetPrevReset()||len(userBucket.UserIDs)<1{logger.Debug("rpcGetBucketRecordsFn new bucket for %q",userID)// Code below goes here...
}
Server
1
2
3
4
5
6
// Leaderboard has reset or no current bucket exists for user
if(userBucket.resetTimeUnix!=leaderboards[0].endActive||userBucket.userIds.length<1){logger.debug(`RpcGetBucketRecordsFn new bucket for ${ctx.userId}`);// Code below goes here
}
Code snippet for this language Lua has not been found. Please choose another language to show equivalent examples.
userBucket.UserIDs=nillogger.Debug("rpcGetBucketRecordsFn new bucket for %q",userID)users,err:=nk.UsersGetRandom(ctx,bucketSize)iferr!=nil{logger.Error("Error getting random users.")return"",ErrInternalError}for_,user:=rangeusers{userBucket.UserIDs=append(userBucket.UserIDs,user.Id)}
// Set the Reset and Bucket end times to be in sync
userBucket.ResetTimeUnix=leaderboards[0].GetNextReset()value,err:=json.Marshal(userBucket)iferr!=nil{return"",ErrMarshal}// Store generated bucket for the user
if_,err:=nk.StorageWrite(ctx,[]*runtime.StorageWrite{{Collection:collection,Key:key,PermissionRead:0,PermissionWrite:0,UserID:userID,Value:string(value),},});err!=nil{logger.Error("nk.StorageWrite error: %v",err)return"",ErrInternalError}
Server
1
2
3
4
5
6
7
8
9
10
11
12
// Set the Reset and Bucket end times to be in sync
userBucket.resetTimeUnix=leaderboards[0].endActive;// Store generated bucket for the user
nk.storageWrite([{collection,key,userId: ctx.userId,value: userBucket,permissionRead: 0,permissionWrite: 0}]);
Code snippet for this language Lua has not been found. Please choose another language to show equivalent examples.
// Add self to the list of leaderboard records to fetch
userBucket.UserIDs=append(userBucket.UserIDs,userID)_,records,_,_,err:=nk.LeaderboardRecordsList(ctx,ids[0],userBucket.UserIDs,bucketSize,"",0)iferr!=nil{logger.Error("nk.LeaderboardRecordsList error: %v",err)return"",ErrInternalError}result:=&api.LeaderboardRecordList{Records:records}encoded,err:=json.Marshal(result)iferr!=nil{return"",ErrMarshal}logger.Debug("rpcGetBucketRecordsFn resp: %s",encoded)returnstring(encoded),nil
Server
1
2
3
4
5
6
7
8
9
10
// Add self to the list of leaderboard records to fetch
userBucket.userIds.push(ctx.userId);// Get the leaderboard records
constrecords=nk.tournamentRecordsList(ids[0],userBucket.userIds,bucketSize);constresult=JSON.stringify(records);logger.debug(`RpcGetBucketRecordsFn resp: ${result}`);returnJSON.stringify(records);
Code snippet for this language Lua has not been found. Please choose another language to show equivalent examples.