/// <summary> /// This is the event handler attached to every client that is connected's MessageReceive event. /// This is where it checks if a client has sent the disconnetion code, and if so, disposes of them. /// </summary> /// <param name="sender"></param> /// <param name="e"></param> private void ConnectedClient_MessageReceived(object sender, MessageReceivedEventArgs e) { if (e.Message == TcpOptions.EndConnectionCode.ToString()) { ConnectedClients.Remove(sender as Client); var eventargs = new ClientToggleEventArgs { ConnectedClient = sender as Client, Time = DateTime.Now }; ClientDisconnected?.Invoke(this, eventargs); } else { foreach (var response in Responses) { var willTrigger = false; switch (response.Mode) { case ContentMode.Contains: if (e.Message.Contains(response.Content)) { willTrigger = true; } break; case ContentMode.EndsWish: if (e.Message.EndsWith(response.Content)) { willTrigger = true; } break; case ContentMode.StartsWith: if (e.Message.StartsWith(response.Content)) { willTrigger = true; } break; case ContentMode.Equals: if (e.Message == response.Content) { willTrigger = true; } break; } if (willTrigger) { response.Event?.Invoke(e); } else { MessageReceived?.Invoke(sender, e); } } } }
/// <summary> /// The threaded method where the server listens for client connections. Only called from <see cref="StartClientListening"/> /// </summary> private void ListenForClients() { while (!IsDisposed) { try { var connectedTCPClient = _listener.AcceptTcpClient(); var connectedClient = new Client(connectedTCPClient); connectedClient.MessageReceived += ConnectedClient_MessageReceived; ConnectedClients.Add(connectedClient); var eventargs = new ClientToggleEventArgs { ConnectedClient = connectedClient, Time = DateTime.Now }; ClientConnected?.Invoke(this, eventargs); } catch (SocketException e) { if (e.SocketErrorCode == SocketError.Interrupted) { break; } else { throw e; } } } }