I just fixed the problem with session, but now im experimenting a weird behaviour when player1 send request friend to player2 the player2 dosnt seems to show the request till he re login … and why is not getting the update im just cant understand since i think it was working at some point all fine.
this is what i use for send friend
public async void AddFriend()
{
if (AddfriendInput.text != string.Empty)
{
Nakama.ISession _session = await MiddleMan.Instance.GetSession();
bool friendexist = await AddFriendByUsernameAsync(AddfriendInput.text, MiddleMan.Instance.GetNakamaHandler().Client, _session);
if (friendexist == true)
{
RefreshFriendsList();
}
}
}
public static async Task<bool> AddFriendByUsernameAsync(string username, IClient client, ISession session)
{
try
{
string[] usernames = new[] { username };
await client.AddFriendsAsync(session, new string[] { }, usernames);
return true;
}
catch (Exception e) //catching exception, if program entered this code adding friend operation was not successfully completed
{
Debug.Log("Adding friend failed (" + e.Message + ")");
return false;
}
}
public static TaskScheduler unityTaskScheduler;
public static SynchronizationContext unitySynchronizationContext;
public static int unityThread;
static public Queue<Action> runInUpdate = new Queue<Action>();
public static bool isOnUnityThread => unityThread == Thread.CurrentThread.ManagedThreadId;
public void Awake()
{
unitySynchronizationContext = SynchronizationContext.Current;
unityThread = Thread.CurrentThread.ManagedThreadId;
unityTaskScheduler = TaskScheduler.FromCurrentSynchronizationContext();
}
public static void RunOnUnityThread(Action action)
{
// is this right?
if (unityThread == Thread.CurrentThread.ManagedThreadId)
{
action();
}
else
{
lock (runInUpdate)
{
runInUpdate.Enqueue(action);
}
}
}
public async void Start()
{
await Initialize();
Nakama.ISocket socket = await MiddleMan.Instance.GetSocket();
socket.ReceivedStatusPresence += presenceEvent =>
{
Debug.Log(presenceEvent);
foreach (var joined in presenceEvent.Joins)
{
string userj = joined.Username;
RunOnUnityThread(() => {
// Do Unity stuff
UserGoesOnline(userj);
});
Debug.LogFormat("User id '{0}' status joined '{1}'", joined.UserId, joined.Status);
}
foreach (var left in presenceEvent.Leaves)
{
string userl = left.Username;
RunOnUnityThread(() => {
// Do Unity stuff
UserLeaves(userl);
});
Debug.LogFormat("User id '{0}' status left '{1}'", left.UserId, left.Status);
}
};
}
private async Task Initialize()
{
Nakama.ISession _session = await MiddleMan.Instance.GetSession();
var result = await MiddleMan.Instance.GetNakamaHandler().Client.ListNotificationsAsync(_session, 10);
foreach (var n in result.Notifications)
{
Debug.LogFormat("NOTIFICATION RECEIVED Subject '{0}' content '{1}'", n.Subject, n.Content);
RefreshFriendsList();
//FriendRequestPanel.SetActive(true);
}
}
public async void RefreshFriendsList()
{
//we clear our list
for(int i=0;i< FriendsPrefabsList.Count; i++)
{
if (FriendsPrefabsList[i] != null)
{
Destroy(FriendsPrefabsList[i]);
}
}
FriendsPrefabsList.Clear();
Nakama.ISession _session = await MiddleMan.Instance.GetSession();
Nakama.ISocket socket = await MiddleMan.Instance.GetSocket();
var result = await MiddleMan.Instance.GetNakamaHandler().Client.ListFriendsAsync(_session);
foreach (var f in result.Friends)
{
await socket.FollowUsersAsync(new[] { f.User.Id });
if (f.State == 0 || f.State == 1 || f.State == 2) {
GameObject newprefab = Instantiate(FriendRequestPrefab, content);
FriendPrefab fp = newprefab.GetComponent<FriendPrefab>();
FriendsPrefabsList.Add(newprefab);
fp.Initialize(f.User.Username, f.State);
if (f.User.Online == true)
{
fp.SetOnlineDot();
}
else
{
fp.SetOfflineDot();
}
Debug.LogFormat("Friend '{0}' state '{1}'", f.User.Username, f.State);
}
}
}