public IActionResult Chat(ChatModel model) { var outModel = new ChatModel(); // Check if we have the ChatEntries queue initialized var chatEntriesQueue = HttpContext.Session.Get <Queue <ChatEntry> >("ChatEntriesQueue"); if (chatEntriesQueue == null) { // Initialize the queue chatEntriesQueue = new Queue <ChatEntry>(); } if (ModelState.IsValid) { // Add the entry to the queue var newChat = new ChatEntry { DatePosted = DateTime.UtcNow, Text = model.ChatText, WhoPosted = User.Identity.Name }; _model.BasicPublish(ExchangeName, "chat", null, newChat.Serialize()); } // Connect to our rabbit queue and retrieve messages _model.BasicQos(prefetchSize: 0, prefetchCount: 10, global: false); var queueName = $"Chat_{User.Identity.Name}_Queue"; var _consumer = new QueueingBasicConsumer(_model); _model.BasicConsume(queue: queueName, autoAck: false, _consumer); while (true) { if (!_consumer.Queue.Dequeue(millisecondsTimeout: 100, out var result)) { break; } var message = (ChatEntry)result.Body.DeSerialize(typeof(ChatEntry)); // Check for stock commands if (!message.Text.StartsWith("/stock=", StringComparison.InvariantCultureIgnoreCase)) { chatEntriesQueue.Enqueue(new ChatEntry { DatePosted = message.DatePosted, Text = message.Text, WhoPosted = message.WhoPosted }); } // Acknowledge _model.BasicAck(result.DeliveryTag, false); } // Take the last 50 entries of the local queue outModel.ChatEntries = chatEntriesQueue.TakeLast(50).ToList(); // Remove old ones while (chatEntriesQueue.Count > 50) { chatEntriesQueue.Dequeue(); } // Add the local queue back to the session HttpContext.Session.Set <Queue <ChatEntry> >("ChatEntriesQueue", chatEntriesQueue); return(View(outModel)); }
/// <summary> /// Send a message to the exchange with a stock quote /// </summary> /// <param name="channel">Channel</param> /// <param name="symbol">Stock symbol</param> /// <param name="quote">Stock Quote value</param> private static void PostStockQuoteAsBot(IModel channel, string symbol, string quote) { try { var message = new ChatEntry { DatePosted = DateTime.UtcNow, Text = $"{symbol} quote is ${quote} per share", WhoPosted = BotName }; channel.BasicPublish(ExchangeName, "bot", null, message.Serialize()); Console.WriteLine($"Bot Sent {message.Text}"); } catch (Exception ex) { // Nothing to do here Console.WriteLine($"The bot had an issue posting to the queue: {ex.Message}"); } }
private static void SendMessage(ChatEntry message) { _model.BasicPublish(ExchangeName, "chat", null, message.Serialize()); Console.WriteLine($"Message Sent by {message.WhoPosted}: {message.Text}"); }