예제 #1
0
 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}");
     }
 }
예제 #2
0
        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,
            });
        }
예제 #3
0
        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
        }
예제 #4
0
 private void AddMessageToNewcomerQueue(BroadcastedMessage messsage)
 {
     _newcomerMessagesHistory.TrimExcess();
     _newcomerMessagesHistory.Enqueue(messsage);
 }
예제 #5
0
        private void OnNewMessage(object sender, BroadcastedMessage message)
        {
            var output = $"\n{message.Sender}: {message.Text}";

            Console.WriteLine(output);
        }