From 671951c35b317da3fb8911b6a8d2b0e7a5250fe0 Mon Sep 17 00:00:00 2001 From: Sem van der Hoeven Date: Tue, 20 Oct 2020 21:12:31 +0200 Subject: [PATCH] [ADD] added sending the lobbies data from the server to the clients on startup --- Client/Client.cs | 17 ++++++++++++++--- Client/ViewModels/ViewModel.cs | 26 ++++++++++++++++++++++---- Client/Views/LoginScreen.xaml.cs | 1 + Server/Models/ServerClient.cs | 8 +++++++- Server/Models/ServerCommunication.cs | 3 +++ SharedClientServer/JSONConvert.cs | 10 ++++++++++ 6 files changed, 57 insertions(+), 8 deletions(-) diff --git a/Client/Client.cs b/Client/Client.cs index 6ba9b16..b14eaf8 100644 --- a/Client/Client.cs +++ b/Client/Client.cs @@ -4,6 +4,7 @@ using System.Collections.Generic; using System.Diagnostics; using System.Net.Sockets; using System.Text; +using static SharedClientServer.JSONConvert; namespace Client { @@ -18,6 +19,8 @@ namespace Client public bool Connected = false; private string username; public Callback OnSuccessfullConnect; + public Callback OnLobbiesListReceived; + public Lobby[] Lobbies { get; set; } public Client(string username) { @@ -70,9 +73,9 @@ namespace Client private void handleData(byte[] message) { - byte id = message[0]; - byte[] payload = new byte[message.Length - 1]; - Array.Copy(message, 1, payload, 0, message.Length - 1); + byte id = message[4]; + byte[] payload = new byte[message.Length - 5]; + Array.Copy(message, 5, payload, 0, message.Length - 5); switch (id) { case JSONConvert.LOGIN: @@ -89,6 +92,14 @@ namespace Client case JSONConvert.LOBBY: // lobby data + LobbyIdentifier lobbyIdentifier = JSONConvert.GetLobbyIdentifier(payload); + switch (lobbyIdentifier) + { + case LobbyIdentifier.LIST: + Lobbies = JSONConvert.GetLobbiesFromMessage(payload); + OnLobbiesListReceived?.Invoke(); + break; + } //TODO fill lobby with the data received break; case JSONConvert.CANVAS: diff --git a/Client/ViewModels/ViewModel.cs b/Client/ViewModels/ViewModel.cs index be55690..aeea9f0 100644 --- a/Client/ViewModels/ViewModel.cs +++ b/Client/ViewModels/ViewModel.cs @@ -9,6 +9,7 @@ using System.Diagnostics; using System.Windows; using System.Collections.ObjectModel; using Client.Views; +using System.Linq; namespace Client { @@ -21,14 +22,17 @@ namespace Client public Lobby SelectedLobby { get; set; } + private Client client; + public ViewModel() { _model = new Model(); _lobbies = new ObservableCollection(); - - _lobbies.Add(new Lobby(50, 3, 8)); - _lobbies.Add(new Lobby(69, 1, 9)); - _lobbies.Add(new Lobby(420, 7, 7)); + client = ClientData.Instance.Client; + client.OnLobbiesListReceived = updateLobbies; + //_lobbies.Add(new Lobby(50, 3, 8)); + //_lobbies.Add(new Lobby(69, 1, 9)); + //_lobbies.Add(new Lobby(420, 7, 7)); OnHostButtonClick = new RelayCommand(() => { @@ -38,6 +42,20 @@ namespace Client JoinSelectedLobby = new RelayCommand(startGameInLobby, true); } + private void updateLobbies() + { + Lobby[] lobbiesArr = client.Lobbies; + Application.Current.Dispatcher.Invoke(delegate + { + foreach (Lobby lobby in lobbiesArr) + { + _lobbies.Add(lobby); + } + }); + } + + + private void startGameInLobby() { if (SelectedLobby != null) diff --git a/Client/Views/LoginScreen.xaml.cs b/Client/Views/LoginScreen.xaml.cs index 780b619..5b742d2 100644 --- a/Client/Views/LoginScreen.xaml.cs +++ b/Client/Views/LoginScreen.xaml.cs @@ -34,6 +34,7 @@ namespace Client.Views Application.Current.Dispatcher.Invoke(delegate { data.User = user; data.Client = client; + client.SendMessage(JSONConvert.ConstructLobbyRequestMessage()); MainWindow startWindow = new MainWindow(); startWindow.Show(); this.Close(); diff --git a/Server/Models/ServerClient.cs b/Server/Models/ServerClient.cs index d5846cf..987db9c 100644 --- a/Server/Models/ServerClient.cs +++ b/Server/Models/ServerClient.cs @@ -123,6 +123,13 @@ namespace Server.Models case JSONConvert.LOBBY: // lobby data LobbyIdentifier l = JSONConvert.GetLobbyIdentifier(payload); + switch(l) + { + case LobbyIdentifier.REQUEST: + Debug.WriteLine("[SERVERCLIENT] got lobby request message, sending lobbies..."); + sendMessage(JSONConvert.ConstructLobbyListMessage(ServerCommunication.INSTANCE.lobbies.ToArray())); + break; + } break; case JSONConvert.CANVAS: // canvas data @@ -132,7 +139,6 @@ namespace Server.Models Debug.WriteLine("[SERVER] Received weird identifier: " + id); break; } - //TODO implement ways to handle the message } /// diff --git a/Server/Models/ServerCommunication.cs b/Server/Models/ServerCommunication.cs index 5507103..a4bfb96 100644 --- a/Server/Models/ServerCommunication.cs +++ b/Server/Models/ServerCommunication.cs @@ -33,6 +33,9 @@ namespace Server.Models listener = new TcpListener(IPAddress.Any, port); serverClients = new List(); lobbies = new List(); + lobbies.Add(new Lobby(1,1,1)); + lobbies.Add(new Lobby(2, 2, 2)); + lobbies.Add(new Lobby(3, 3, 3)); serverClientsInlobbies = new Dictionary>(); } diff --git a/SharedClientServer/JSONConvert.cs b/SharedClientServer/JSONConvert.cs index 6620e06..7ca1d3f 100644 --- a/SharedClientServer/JSONConvert.cs +++ b/SharedClientServer/JSONConvert.cs @@ -1,8 +1,10 @@ using Client; using Newtonsoft.Json; +using Newtonsoft.Json.Linq; using System; using System.Collections.Generic; using System.Diagnostics; +using System.Linq; using System.Text; namespace SharedClientServer @@ -79,6 +81,14 @@ namespace SharedClientServer }); } + public static Lobby[] GetLobbiesFromMessage(byte[] json) + { + dynamic payload = JsonConvert.DeserializeObject(Encoding.ASCII.GetString(json)); + JArray lobbiesArray = payload.lobbies; + Debug.WriteLine(lobbiesArray.ToString()); + return lobbiesArray.ToObject(); + } + public static int GetLobbyID(byte[] json) { dynamic payload = JsonConvert.DeserializeObject(Encoding.ASCII.GetString(json));