/// <summary> /// Stop the server and disconnect any clients /// </summary> public void Stop() { disposed = true; disconnectAll(); isRunning = false; this.listenSocket.Close(); if (OnClientConnected != null) { foreach (var receiver in OnClientConnected.GetInvocationList()) { OnClientConnected -= (RemoteClientConnectedEventHandler)receiver; } } if (OnClientDisconnected != null) { foreach (var receiver in OnClientDisconnected.GetInvocationList()) { OnClientDisconnected -= (RemoteClientDisconnectedEventHandler)receiver; } } if (OnClientMessageReceived != null) { foreach (var receiver in OnClientMessageReceived.GetInvocationList()) { OnClientMessageReceived -= (RemoteClientMessageReceivedEventHandler)receiver; } } }
/// <summary> /// Emits a message to TerrariaChatRelay that a client message have been received. /// </summary> /// <param name="sender">Object that is emitting this event.</param> /// <param name="user">User object detailing the client source and username</param> /// <param name="msg">Text content of the message</param> /// <param name="commandPrefix">Command prefix to indicate a command is being used.</param> /// <param name="clientPrefix">String to insert before the main chat message.</param> /// <param name="sourceChannelId">Optional id for clients that require id's to send to channels. Id of the channel the message originated from.</param> public static void RaiseClientMessageReceived(object sender, TCRClientUser user, string clientPrefix, string msg, string commandPrefix, ulong sourceChannelId = 0) { if (CommandServ.IsCommand(msg, commandPrefix)) { var payload = CommandServ.GetExecutableCommand(msg, commandPrefix, user); msg = payload.Execute(); ((IChatClient)sender).HandleCommand(payload, msg, sourceChannelId); } else { _adapter.BroadcastChatMessage($"{clientPrefix}<{user.Username}> {msg}", -1); OnClientMessageReceived?.Invoke(sender, new ClientChatEventArgs(user, msg)); } }
private void IncomingMessageTypeData(PeerType receiver, NetIncomingMessage message) { if (receiver == PeerType.Client) { OnServerMessageReceived?.Invoke(receiver, message); } else if (receiver == PeerType.Server) { OnClientMessageReceived?.Invoke(receiver, message); } else { throw new ArgumentOutOfRangeException(nameof(receiver), "Invalid NetPeer class."); } }
/// <summary> /// Handle an incoming message from a remote client. /// </summary> /// <param name="msg">Incoming message.</param> private void HandleIncomingMessage(NetIncomingMessage msg) { switch (msg.MessageType) { case NetIncomingMessageType.ConnectionApproval: HandleIncomingConnection(msg); break; case NetIncomingMessageType.StatusChanged: switch (msg.SenderConnection.Status) { case NetConnectionStatus.Disconnected: if (OnClientDisconnect != null) { OnClientDisconnect.Invoke( msg.SenderConnection, null); } break; case NetConnectionStatus.Connected: if (OnClientConnect != null) { OnClientConnect.Invoke( msg.SenderConnection, null ); } break; } break; case NetIncomingMessageType.Data: if (OnClientMessageReceived != null) { OnClientMessageReceived.Invoke( msg.SenderConnection, msg ); } break; } }