diff --git a/lib/src/nakama_client/nakama_api_client.dart b/lib/src/nakama_client/nakama_api_client.dart index 4beff24..c4bac0a 100644 --- a/lib/src/nakama_client/nakama_api_client.dart +++ b/lib/src/nakama_client/nakama_api_client.dart @@ -459,4 +459,25 @@ class NakamaRestApiClient extends NakamaBaseClient { return LeaderboardRecordList()..mergeFromProto3Json(res.body!.toJson()); } + + @override + Future writeLeaderboardRecord({ + required model.Session session, + required String leaderboardId, + int? score, + int? subscore, + String? metadata, + }) async { + _session = session; + + final res = await _api.nakamaWriteLeaderboardRecord( + leaderboardId: leaderboardId, + body: WriteLeaderboardRecordRequestLeaderboardRecordWrite( + score: score?.toString(), + subscore: subscore?.toString(), + metadata: metadata, + )); + + return LeaderboardRecord()..mergeFromProto3Json(res.body!.toJson()); + } } diff --git a/lib/src/nakama_client/nakama_client.dart b/lib/src/nakama_client/nakama_client.dart index c850aa1..2f81182 100644 --- a/lib/src/nakama_client/nakama_client.dart +++ b/lib/src/nakama_client/nakama_client.dart @@ -128,4 +128,12 @@ abstract class NakamaBaseClient { String? cursor, DateTime? expiry, }); + + Future writeLeaderboardRecord({ + required model.Session session, + required String leaderboardId, + int? score, + int? subscore, + String? metadata, + }); } diff --git a/lib/src/nakama_client/nakama_grpc_client.dart b/lib/src/nakama_client/nakama_grpc_client.dart index 46ad7b9..96b6141 100644 --- a/lib/src/nakama_client/nakama_grpc_client.dart +++ b/lib/src/nakama_client/nakama_grpc_client.dart @@ -438,4 +438,25 @@ class NakamaGrpcClient extends NakamaBaseClient { options: _getSessionCallOptions(session), ); } + + @override + Future writeLeaderboardRecord({ + required model.Session session, + required String leaderboardId, + int? score, + int? subscore, + String? metadata, + }) async { + return await _client.writeLeaderboardRecord( + WriteLeaderboardRecordRequest( + leaderboardId: leaderboardId, + record: WriteLeaderboardRecordRequest_LeaderboardRecordWrite( + score: score == null ? null : Int64(score), + subscore: subscore == null ? null : Int64(subscore), + metadata: metadata, + ), + ), + options: _getSessionCallOptions(session), + ); + } } diff --git a/test/grpc/leaderboard_test.dart b/test/grpc/leaderboard_test.dart index 9ae98a5..16a4c74 100644 --- a/test/grpc/leaderboard_test.dart +++ b/test/grpc/leaderboard_test.dart @@ -29,5 +29,13 @@ void main() { expect(result, isA()); }); + + test('write leaderboard record', () async { + final result = await client.writeLeaderboardRecord( + session: session, leaderboardId: 'test', score: 10); + + expect(result, isA()); + expect(result.score.toInt(), equals(10)); + }); }); } diff --git a/test/rest/leaderboard_test.dart b/test/rest/leaderboard_test.dart index 243a776..b87eb50 100644 --- a/test/rest/leaderboard_test.dart +++ b/test/rest/leaderboard_test.dart @@ -28,5 +28,13 @@ void main() { expect(result, isA()); }); + + test('write leaderboard record', () async { + final result = await client.writeLeaderboardRecord( + session: session, leaderboardId: 'test', score: 10); + + expect(result, isA()); + expect(result.score.toInt(), equals(10)); + }); }); }