private void InvokeNewMessageHandler(BroadcastedMessage message) { try { OnNewMessage?.Invoke(this, message); } catch (Exception e) { throw new Exception($"Error thrown by OnNewMessage handler! Error: {e.Message} \n {e.InnerException?.Message}"); } }
public override async Task <NewMessageSendingResult> NewMessage(NewMessageContent message, ServerCallContext context) { var port = GetPeerPort(context); if (!_clientsByPort.ContainsKey(port)) { return(new NewMessageSendingResult { Success = false, Error = "You haven't been connected, please (re)try greeting the server" }); } var userInfo = _clientsByPort[port]; var senderName = userInfo.Name; var newMessage = new BroadcastedMessage { Sender = senderName, Text = message.Text, FiletimeUtc = DateTime.Now.ToFileTimeUtc(), }; var success = false; string error = ""; try { await BroadcastMessage(newMessage); success = true; } catch (Exception e) { Console.Error.WriteLine($"FAILED to broadcast! Error: {e.Message} \n {e.InnerException?.Message}"); error = "Internal error while broadcasting the message"; } if (success) { AddMessageToNewcomerQueue(newMessage); } return(new NewMessageSendingResult { Success = success, Error = error, }); }
private async Task BroadcastMessage(BroadcastedMessage message) { var clientsToBroadcastTo = _clientsByPort.Values .Where(v => v.Name != message.Sender && v.MessagesWriter != null && !v.Dead) .ToList(); foreach (var client in clientsToBroadcastTo) { try { // todo optimize by moving into a wrapping task to send them all simultaneously await client.MessagesWriter.WriteAsync(message); } catch (Exception e) { client.Dead = true; // todo might want to save some info about the death } } RemoveDeadClients(); // todo do it as a background job }
private void AddMessageToNewcomerQueue(BroadcastedMessage messsage) { _newcomerMessagesHistory.TrimExcess(); _newcomerMessagesHistory.Enqueue(messsage); }
private void OnNewMessage(object sender, BroadcastedMessage message) { var output = $"\n{message.Sender}: {message.Text}"; Console.WriteLine(output); }