사용자에게 세션이 있는 경우 여러분은 해당 계정을 검색할 수 있습니다. 프로필에는 다수의 “연결된” 소셜 제공자가 포함된 여러가지 정보가 있습니다.
Client
1
2
curl -X GET "http://127.0.0.1:7350/v2/account"\
-H 'authorization: Bearer <session token>'
Client
1
2
3
4
constaccount=awaitclient.getAccount(session);constuser=account.user;console.info("User id '%o' and username '%o'.",user.id,user.username);console.info("User's wallet:",account.wallet);
Client
1
2
3
4
varaccount=awaitclient.GetAccountAsync(session);varuser=account.User;System.Console.WriteLine("User id '{0}' username '{1}'",user.Id,user.Username);System.Console.WriteLine("User wallet: '{0}'",account.Wallet);
localresult=client.get_account()ifresult.errorthenprint(result.message)returnendlocaluser=result.userprint(("User id '%s' and username '%s'."):format(user.id,user.username))
지갑, 장치 ID, 사용자 지정 ID와 같은 일부 정보는 비공개지만 프로필의 일부는 다른 사용자에게 표시됩니다.
다른 사용자에게 데이터를 공개하여 공유하는데 유용한 user.metadata 내의 사용자를 위해 추가 필드를 저장할 수 있습니다. 다른 사용자가 볼 필요가 있는 매우 일반적인 필드를 저장하려면 사용자 메타데이터를 사용하는 것이 좋습니다. 예를 들어 메타데이터를 사용하여 사용자가 원하는 경우 약력 세부 정보를 표시하거나 해당 캐릭터 이름, 수준 및 게임 통계를 표시할 수 있습니다.
다른 모든 정보의 경우 다른 사용자가 찾을 수 있도록 공개 읽기 권한으로 레코드를 저장할 수 있습니다.
메타데이터는 사용자당 16KB로 제한됩니다. wallet과(와) 유사한 스크립트 런타임을 통해서만 설정할 수 있습니다.
다음 예에서는 사용자 메타데이터를 사용하여 VIP 상태를 저장한 다음 VIP 회원만 가입할 수 있는 사전 가입 토너먼트 후크의 일부로 사용하는 방법을 보여줍니다.
// Assuming a user metadata structure as follows
constmetadata={vip: true};// Add a before hook to only allow VIP users to join the vip_only tournament
letBeforeJoinTournament: nkruntime.BeforeHookFunction<JoinTournamentRequest>=function(ctx: nkruntime.Context,logger: nkruntime.Logger,nk: nkruntime.Nakama,data: nkruntime.JoinTournamentRequest):nkruntime.JoinTournamentRequest|void{constaccount=nk.accountGetId(ctx.userId)// Only do the following checks if the tournament id is `vip_only`
if(data.tournamentId!="vip_only"){returndata;}// Only continue with the Join Tournament if the actioning user is a vip
if(account.user.metadata["vip"]){returndata;}logger.warn("you must be a vip to join this tournament")returnnull;};// Register inside InitModule
initializer.registerBeforeJoinTournament(BeforeJoinTournament);
// Assuming a user metadata structure as follows
typeUserMetadatastruct{Vipbool`json:"vip"`}metadata:=&UserMetadata{Vip:true,}// Add a before hook to only allow VIP users to join the vip_only tournament
iferr:=initializer.RegisterBeforeJoinTournament(func(ctxcontext.Context,loggerruntime.Logger,db*sql.DB,nkruntime.NakamaModule,in*api.JoinTournamentRequest)(*api.JoinTournamentRequest,error){userId,ok:=ctx.Value(runtime.RUNTIME_CTX_USER_ID).(string)if!ok{logger.Error("invalid user")returnnil,runtime.NewError("invalid user",13)}// Get the user's metadata
account,err:=nk.AccountGetId(ctx,userId)iferr!=nil{logger.Error("error getting user account")returnnil,runtime.NewError("error getting user account",13)}// Only do the following checks if the tournament id is `vip_only`
ifin.TournamentId!="vip_only"{returnin,nil}// Only continue with the Join Tournament if the actioning user is a vip
varmetadataUserMetadataiferr:=json.Unmarshal([]byte(account.User.GetMetadata()),&metadata);err!=nil{logger.Error("error deserializing metadata")returnnil,runtime.NewError("error deserializing metadata",13)}ifmetadata.Vip{returnin,nil}returnnil,runtime.NewError("you must be a vip user to join this tournament",7)});err!=nil{logger.Error("unable to register before join tournament hook: %v",err)returnerr}
-- Assuming a user metadata structure as followslocalmetadata={["vip"]=true}-- Add a before hook to only allow VIP users to join the vip_only tournamentlocalfunctionbefore_join_tournament(context,payload)localaccount=nk.account_get_id(context.user_id)-- Only do the following checks if the tournament id is `vip_only`ifpayload.tournament_id~="vip_only"thenreturnpayloadend-- Only continue with the Join Tournament request if the actioning user is a vipifaccount.user.metadata["vip"]thenreturnpayloadendnk.logger_error("you must be a vip user to join this tournament")returnnilendnk.register_req_before(before_join_tournament,"JoinTournament")
Nakama에는 가상 지갑과 거래 원장이라는 개념이 사용되고 있습니다. Nakama를 사용하면 개발자는 사용자 지갑에 대한 변경 사항을 생성, 업데이트 및 나열할 수 있습니다. 이 작업에서 거래는 보장되며 스크립트 런타임에서만 수행할 수 있습니다.
서버 측 코드를 사용하면 사용자의 지갑을 업데이트할 수 있습니다.
Server
1
2
3
4
5
6
7
8
9
10
11
12
13
localnk=require("nakama")localuser_id="8f4d52c7-bf28-4fcf-8af2-1d4fcf685592"localchangeset={coins=10,-- Add 10 coins to the user's wallet.gems=-5-- Remove 5 gems from the user's wallet.}localmetadata={game_result="won"}localupdated,previous=nk.wallet_update(user_id,changeset,metadata,true)
Server
1
2
3
4
5
6
7
8
9
10
11
12
userID:="8f4d52c7-bf28-4fcf-8af2-1d4fcf685592"changeset:=map[string]interface{}{"coins":10,// Add 10 coins to the user's wallet.
"gems":-5,// Remove 5 gems from the user's wallet.
}metadata:=map[string]interface{}{"game_result":"won",}updated,previous,err:=nk.WalletUpdate(ctx,userID,changeset,metadata,true)iferr!=nil{logger.WithField("err",err).Error("Wallet update error.")}
Server
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
letuser_id='8f4d52c7-bf28-4fcf-8af2-1d4fcf685592';letchangeset={coins: 10,// Add 10 coins to the user's wallet.
gems:-5,// Remove 5 gems from the user's wallet.
};letmetadata={gameResult:'won'};letresult: nkruntime.WalletUpdateResult;try{result=nk.walletUpdate(user_id,changeset,metadata,true);}catch(error){// Handle error
}
지갑은 사용자에게만 표시되며 다른 사용자에게는 비공개입니다. 계정 가져오기 작업을 통해 사용자의 지갑 정보를 가져올 수 있습니다.
ID 또는 핸들로 한 명 이상의 사용자를 가져올 수 있습니다. 이 방법으로 다른 사용자와 공개 프로필을 쉽게 표시할 수 있습니다.
Client
1
2
curl -X GET "http://127.0.0.1:7350/v2/user?ids=userid1&ids=userid2&usernames=username1&usernames=username2&facebook_ids=facebookid1"\
-H 'authorization: Bearer <session token>'
Client
1
2
3
4
5
constusers=awaitclient.getUsers(session,["user_id1"],["username1"],["facebookid1"]);users.foreach(user=>{console.info("User id '%o' and username '%o'.",user.id,user.username);});
Client
1
2
3
4
5
6
7
8
9
varids=new[]{"userid1","userid2"};varusernames=new[]{"username1","username2"};varfacebookIds=new[]{"facebookid1"};varresult=awaitclient.GetUsersAsync(session,ids,usernames,facebookIds);foreach(varuinresult.Users){System.Console.WriteLine("User id '{0}' username '{1}'",u.Id,u.Username);}
Client
1
2
3
4
5
6
7
8
autosuccessCallback=[](constNUsers&users){for(auto&user:users.users){std::cout<<"User id '"<<user.id<<"' username "<<user.username<<std::endl;}};client->getUsers(session,{"user_id1"},{"username1"},{"facebookid1"},successCallback);
Client
1
2
3
4
5
6
7
8
List<String>ids=Arrays.asList("userid1","userid2");List<String>usernames=Arrays.asList("username1","username1");String[]facebookIds=newString[]{"facebookid1"};Usersusers=client.getUsers(session,ids,usernames,facebookIds).get();for(Useruser:users.getUsersList()){System.out.format("User id %s username %s",user.getId(),user.getUsername());}
Client
1
2
3
4
5
6
7
8
9
10
11
varids=["userid1","userid2"]varusernames=["username1","username2"]varfacebook_ids=["facebookid1"]varresult:NakamaAPI.ApiUsers=yield(client.get_users_async(session,ids,usernames,facebook_ids),"completed")ifresult.is_exception():print("An error occurred: %s"%result)returnforuinresult.users:print("User id '%s' username '%s'"%[u.id,u.username])
localids={"userid1","userid2"}localusernames={"username1","username2"}localfacebook_ids={"facebookid1"}localresult=client.get_users(ids,usernames,facebook_ids)ifresult.errorthenprint(result.message)returnendlocalusers=result.usersfor_,userinipairs(users)doprint(("User id '%s' and username '%s'."):format(user.id,user.username))end
사용자가 등록되면 대부분의 프로필이 기본값으로 설정됩니다. 사용자는 필드를 바꾸기 위해 자신의 프로필을 업데이트할 수 있지만 다른 사용자의 프로필은 변경할 수 없습니다.
Client
1
2
3
4
5
6
7
curl -X PUT "http://127.0.0.1:7350/v2/account"\
-H 'authorization: Bearer <session token>'\
--data '{
"display_name": "My new name",
"avatar_url": "http://graph.facebook.com/avatar_url",
"location": "San Francisco"
}'
Client
1
2
3
4
5
awaitclient.updateAccount(session,{display_name:"My new name",avatar_url:"http://graph.facebook.com/avatar_url",location:"San Francisco"});
Client
1
2
3
4
conststringdisplayName="My new name";conststringavatarUrl="http://graph.facebook.com/avatar_url";conststringlocation="San Francisco";awaitclient.UpdateAccountAsync(session,null,displayName,avatarUrl,null,location);
Client
1
client->updateAccount(session,opt::nullopt,"My new name","http://graph.facebook.com/avatar_url",opt::nullopt,"San Francisco");
Client
1
2
3
4
StringdisplayName="My new name";StringavatarUrl="http://graph.facebook.com/avatar_url";Stringlocation="San Francisco";client.updateAccount(session,null,displayName,avatarUrl,null,location);
Client
1
2
3
4
5
6
7
8
9
10
vardisplay_name="My new name";varavatar_url="http://graph.facebook.com/avatar_url";varlocation="San Francisco";varupdate:NakamaAsyncResult=yield(client.update_account_async(session,null,display_name,avatar_url,null,location),"completed")ifupdate.is_exception():print("An error occurred: %s"%update)returnprint("Account updated")
Client
1
2
3
4
5
6
7
8
9
10
PUT /v2/account HTTP/1.1
Host: 127.0.0.1:7350
Accept: application/json
Content-Type: application/json
Authorization: Bearer <session token>
{"display_name": "My new name",
"avatar_url": "http://graph.facebook.com/avatar_url",
"location": "San Francisco"}
localnk=require("nakama")localuser_id="4ec4f126-3f9d-11e7-84ef-b7c182b36521"-- some user's id.localmetadata={}localusername="my-new-username"localdisplay_name="My new Name"localtimezone=nillocallocation="San Francisco"locallang_tag=nillocalavatar_url="http://graph.facebook.com/avatar_url"localstatus,err=pcall(nk.account_update_id,user_id,metadata,username,display_name,timezone,location,lang_tag,avatar_url)if(notstatus)thennk.logger_info(("Account update error: %q"):format(err))end
Server
1
2
3
4
5
6
7
8
9
10
11
12
13
userID:="4ec4f126-3f9d-11e7-84ef-b7c182b36521"// some user's id.
username:="my-new-username"// must be unique
metadata:=make(map[string]interface{})displayName:="My new name"timezone:=""location:="San Francisco"langTag:=""avatarUrl:="http://graph.facebook.com/avatar_url"iferr:=nk.AccountUpdateId(ctx,userID,username,metadata,displayName,timezone,location,langTag,avatarUrl);err!=nil{// Handle error.
logger.Error("Account update error: %s",err.Error())}