diff --git a/Server/Models/Information.cs b/Server/Models/Information.cs index 8f41ba9..1764312 100644 --- a/Server/Models/Information.cs +++ b/Server/Models/Information.cs @@ -4,6 +4,7 @@ namespace Server.Models { public class Information : ObservableObject { + public bool CanStartServer { get; set; } public bool ServerOnline { get; set; } @@ -15,5 +16,7 @@ namespace Server.Models return "Offline"; } } + + public int ClientsConnected{ get { return ServerCommunication.INSTANCE.ClientsConnected; } } } } \ No newline at end of file diff --git a/Server/Models/ServerClient.cs b/Server/Models/ServerClient.cs index 4db4128..94a563f 100644 --- a/Server/Models/ServerClient.cs +++ b/Server/Models/ServerClient.cs @@ -84,7 +84,30 @@ namespace Server.Models /// the incoming message private void HandleIncomingMessage(byte[] message) { - Debug.WriteLine($"Got message from client : {message}"); + Debug.WriteLine($"Got message from {Username} : {message}"); + byte id = message[0]; + byte[] payload = new byte[message.Length - 1]; + Array.Copy(message,1,payload,0,message.Length-1); + switch(id) + { + case 0x01: + // canvas data + break; + case 0x02: + // json message data + (string, string) combo = JSONConvert.GetUsernameAndMessage(payload); + string textUsername = combo.Item1; + string textMsg = combo.Item2; + // todo handle sending to all except this user the username and message to display in chat + break; + + case 0x03: + // object data + break; + default: + Debug.WriteLine("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 0ead864..4dcf07a 100644 --- a/Server/Models/ServerCommunication.cs +++ b/Server/Models/ServerCommunication.cs @@ -14,6 +14,7 @@ namespace Server.Models private TcpListener listener; private List serverClients; public bool Started = false; + public int ClientsConnected { get { return serverClients.Count; } } /// /// use a padlock object to make sure the singleton is thread-safe @@ -85,5 +86,13 @@ namespace Server.Models sc.sendMessage(message); } } + + public void sendToAllExcept(string username, byte[] message) + { + foreach (ServerClient sc in serverClients) + { + if (sc.Username != username) sc.sendMessage(message); + } + } } } diff --git a/Server/Server.csproj b/Server/Server.csproj index afc85b6..c6ad1ce 100644 --- a/Server/Server.csproj +++ b/Server/Server.csproj @@ -11,6 +11,7 @@ + diff --git a/Server/ViewModels/MainViewModel.cs b/Server/ViewModels/MainViewModel.cs index 7652c38..0ff5359 100644 --- a/Server/ViewModels/MainViewModel.cs +++ b/Server/ViewModels/MainViewModel.cs @@ -9,6 +9,7 @@ using System.Net.Sockets; using System.Text; using System.Windows.Input; using System.Windows.Media; +using System.Windows.Media.Imaging; namespace Server.ViewModels { @@ -21,24 +22,21 @@ namespace Server.ViewModels public MainViewModel(MainWindow mainWindow) { + serverCommunication = ServerCommunication.INSTANCE; this.mainWindow = mainWindow; Debug.WriteLine("init mainviewmodel"); InformationModel = new Information(); InformationModel.CanStartServer = true; InformationModel.ServerOnline = false; + //BitmapImage onlineImg = new BitmapImage(new Uri(@"/img/online.png",UriKind.Relative)); + //BitmapImage offlineImg = new BitmapImage(new Uri(@"/img/offline.png", UriKind.Relative)); this.ServerStartCommand = new RelayCommand(() => { Debug.WriteLine("connect button clicked"); - if (serverCommunication == null) - { - Debug.WriteLine("making new server communication"); - serverCommunication = ServerCommunication.INSTANCE; - } + if (!serverCommunication.Started) { - - Debug.WriteLine("can start server " + InformationModel.CanStartServer); serverCommunication.Start(); InformationModel.ServerOnline = true; InformationModel.CanStartServer = false; diff --git a/Server/Views/MainWindow.xaml b/Server/Views/MainWindow.xaml index 4cb49fb..5ff94af 100644 --- a/Server/Views/MainWindow.xaml +++ b/Server/Views/MainWindow.xaml @@ -8,8 +8,11 @@ Title="MainWindow" Height="450" Width="800">