private void Messages_UnreadUpdated(object sender, MessagesUpdateEventArgs e) { try { foreach (var message in e.NewMessages) { MessageHandlers.ForEach(c => { if (c.Process(message)) { } }); } } catch (RedditGatewayTimeoutException exception) { _logger.Error(exception, $"Exception caught in {nameof(Messages_UnreadUpdated)}. Redoing event and continuing..."); Account.Messages.InboxUpdated -= Messages_UnreadUpdated; SubscribeToMessageFeed(); } catch (RedditServiceUnavailableException exception) { _logger.Error(exception, $"Exception caught in {nameof(Messages_UnreadUpdated)}. Redoing event and continuing..."); Account.Messages.InboxUpdated -= Messages_UnreadUpdated; SubscribeToMessageFeed(); } catch (Exception exception) { _logger.Error(exception, $"Unexpected exception caught in {nameof(Messages_UnreadUpdated)}"); } }
// Callback function that's triggered whenever one or more new messages come in. --Kris private void C_UnreadMessagesUpdated(object sender, MessagesUpdateEventArgs e) { if (e.NewMessages.Count > 0) { // Mark all messages as read now so they don't come up multiple times. --Kris Reddit.Account.Messages.MarkAllRead(); foreach (Message message in e.NewMessages) { // If author has an active session, reply to the content. Otherwise, respond with greeting. --Kris string response; if (!ActiveSessions.ContainsKey(message.Author)) { ActiveSessions.Add(message.Author, DateTime.Now); response = Eliza.Session.GetGreeting(); // These greetings are really generic so feel free to replace this with your own custom greeting string. --Kris } else { if (message.Body.Contains("bye", StringComparison.OrdinalIgnoreCase) || message.Body.Contains("farewell", StringComparison.OrdinalIgnoreCase) || message.Body.Equals("exit", StringComparison.OrdinalIgnoreCase) || message.Body.Equals("quit", StringComparison.OrdinalIgnoreCase)) { ActiveSessions.Remove(message.Author); } response = Eliza.GetResponse(message.Body); } // Send the Reddit response. --Kris Reddit.Account.Messages.Compose(message.Author, message.Subject, response); } } }
private void MonitorPrivateMessagesThread(string key, string type, int startDelayMs = 0, int?monitoringDelayMs = null) { if (startDelayMs > 0) { Thread.Sleep(startDelayMs); } monitoringDelayMs = (monitoringDelayMs.HasValue ? monitoringDelayMs : Monitoring.Count() * MonitoringWaitDelayMS); while (!Terminate && Monitoring.Get(key).Contains("PrivateMessages")) { List <Message> oldList; List <Message> newList; switch (type) { default: throw new RedditControllerException("Unrecognized type '" + type + "'."); case "inbox": oldList = inbox; newList = GetMessagesInbox(); break; case "unread": oldList = unread; newList = GetMessagesUnread(); break; case "sent": oldList = sent; newList = GetMessagesSent(); break; } if (Lists.ListDiff(oldList, newList, out List <Message> added, out List <Message> removed)) { // Event handler to alert the calling app that the list has changed. --Kris MessagesUpdateEventArgs args = new MessagesUpdateEventArgs { NewMessages = newList, OldMessages = oldList, Added = added, Removed = removed }; TriggerUpdate(args, type); } Thread.Sleep(monitoringDelayMs.Value); } }
protected void TriggerUpdate(MessagesUpdateEventArgs args, string type) { switch (type) { case "inbox": OnInboxUpdated(args); break; case "unread": OnUnreadUpdated(args); break; case "sent": OnSentUpdated(args); break; } }
public async Task OnUnreadMessagesUpdated(object sender, MessagesUpdateEventArgs e) { if (NoMessagesInEvent(e)) { return; } foreach (var message in e.NewMessages) { if (MessageIsUsernameMention(message)) { try { await RotateAndUploadVideo(message); } catch (Exception ex) { Console.WriteLine($"Failed to process video rotation sequence: {ex}"); } } MarkMessageAsRead(message); } }
private void C_UnreadMessagesUpdated(object sender, MessagesUpdateEventArgs e) { E = e; }
protected virtual void OnSentUpdated(MessagesUpdateEventArgs e) { SentUpdated?.Invoke(this, e); }
protected virtual void OnUnreadUpdated(MessagesUpdateEventArgs e) { UnreadUpdated?.Invoke(this, e); }
private void MonitorPrivateMessagesThread(string key, string type, int startDelayMs = 0, int?monitoringDelayMs = null) { if (startDelayMs > 0) { Thread.Sleep(startDelayMs); } monitoringDelayMs = (monitoringDelayMs.HasValue ? monitoringDelayMs : Monitoring.Count() * MonitoringWaitDelayMS); while (!Terminate && Monitoring.Get(key).Contains("PrivateMessages")) { if (MonitoringExpiration.HasValue && DateTime.Now > MonitoringExpiration.Value) { MonitorModel.RemoveMonitoringKey(key, "PrivateMessages", ref Monitoring); Threads.Remove(key); break; } while (!IsScheduled()) { if (Terminate) { break; } Thread.Sleep(15000); } if (Terminate) { break; } List <Message> oldList; List <Message> newList; try { switch (type) { default: throw new RedditControllerException("Unrecognized type '" + type + "'."); case "inbox": oldList = inbox; newList = GetMessagesInbox(); break; case "unread": oldList = unread; newList = GetMessagesUnread(); break; case "sent": oldList = sent; newList = GetMessagesSent(); break; } if (Lists.ListDiff(oldList, newList, out List <Message> added, out List <Message> removed)) { // Event handler to alert the calling app that the list has changed. --Kris MessagesUpdateEventArgs args = new MessagesUpdateEventArgs { NewMessages = newList, OldMessages = oldList, Added = added, Removed = removed }; TriggerUpdate(args, type); } } catch (Exception) when(!BreakOnFailure) { } Wait(monitoringDelayMs.Value); } }
private void InvokeUnreadUpdatedEvent(object sender, MessagesUpdateEventArgs e) { UnreadUpdated.Invoke(sender, e); }
private static bool NoMessagesInEvent(MessagesUpdateEventArgs e) { return(e == null || e.NewMessages == null); }
public async Task GivenRedditMessageHandler_WhenOnUnreadMessagesUpdatedIsCalledWithNoValidUsernameMentions_ThenNoUsernameMentionsWereHandled(MessagesUpdateEventArgs messagesUpdateEventArgs) { // Act await _redditMessageHandler.OnUnreadMessagesUpdated(new object(), messagesUpdateEventArgs); // Assert A.CallTo(() => _fakeRedditClientWrapper.ReadMessage(A <string> ._)).MustNotHaveHappened(); A.CallTo(() => _fakeRedditClientWrapper.ReplyToComment(A <string> ._, A <string> ._)).MustNotHaveHappened(); }