private static void ShowMenuAddWatcher() { bool menuClose = false; while (!menuClose) { Prompts.PromptMenuAction("Add a Watcher"); var friendlyName = Prompts.PromptQuestion("Enter a name for this tracker"); var pageURL = Prompts.PromptQuestion("Enter the page URL to monitor"); var keyWord = Prompts.PromptQuestion("Enter the keyword you want to look for (case sensitive)"); bool alertOnNotExist = Prompts.PromptYesNo($"Do you want the alert to trigger when this keyword doesn't exist?{Environment.NewLine} (if no then alert triggers when the keyword does exist)"); var newTracker = new TrackedProduct() { FriendlyName = friendlyName, PageURL = pageURL, Keyword = keyWord, AlertOnKeywordNotExist = alertOnNotExist }; Prompts.PromptWatcherAlertType(newTracker); newTracker.Save(); Log.Information("Created new tracker! {Tracker}", newTracker); Console.Write($"Successfully created tracker! {Environment.NewLine}URL: {newTracker.PageURL}"); menuClose = true; StopForMessage(); Console.Clear(); } Log.Information("Exited Menu AddWatcher"); }
public static void Save(this TrackedProduct tracker) { List <TrackedProduct> selectedList; TrackedProduct foundTracker; switch (tracker.AlertInterval) { case TrackInterval.OneMin: selectedList = Constants.SavedData.TrackedProducts1Min; break; case TrackInterval.FiveMin: selectedList = Constants.SavedData.TrackedProducts5Min; break; default: Log.Warning("Default was hit on a switch that shouldn't occur", tracker); selectedList = Constants.SavedData.TrackedProducts5Min; break; } Log.Debug("Adding or updating tracker on the {Interval} queue: {Tracker}", tracker.AlertInterval, tracker.FriendlyName); foundTracker = selectedList.Find(x => x.TrackerID == tracker.TrackerID); if (foundTracker != null) { foundTracker = tracker; Log.Debug("Updated tracker on the {Interval} queue: {Tracker}", tracker.AlertInterval, tracker.FriendlyName); } else { selectedList.Add(tracker); Log.Debug("Added tracker on the {Interval} queue: {Tracker}", tracker.AlertInterval, tracker.FriendlyName); } }
private static void ShowWatcherProperties(TrackedProduct selectedTracker) { Console.Clear(); var menu = Prompts.PromptMenuAction("Watcher Properties", displayMenu: false); menu += "FriendlyName".ConvertToMenuProperty(selectedTracker.FriendlyName); menu += "PageURL".ConvertToMenuProperty(selectedTracker.PageURL); menu += "Keyword".ConvertToMenuProperty(selectedTracker.Keyword); menu += "AlertNoKeyword".ConvertToMenuProperty(selectedTracker.AlertOnKeywordNotExist.ToString()); menu += "Enabled".ConvertToMenuProperty(selectedTracker.Enabled.ToString()); menu += "AlertInterval".ConvertToMenuProperty(selectedTracker.AlertInterval.ToString()); menu += "AlertType".ConvertToMenuProperty(selectedTracker.AlertType.ToString()); if (selectedTracker.AlertType == AlertType.Email) { menu += "Emails".ConvertToMenuProperty(selectedTracker.Emails.ToString()); } else if (selectedTracker.AlertType == AlertType.Webhook) { menu += "WebHookURL".ConvertToMenuProperty(selectedTracker.WebHookURL); menu += "MentionString".ConvertToMenuProperty(selectedTracker.MentionString); } menu = menu.AddSeperatorTilde(); Console.Write(menu); StopForMessage(); }
public static void Delete(this TrackedProduct tracker) { List <TrackedProduct> selectedList; TrackedProduct foundTracker; switch (tracker.AlertInterval) { case TrackInterval.OneMin: selectedList = Constants.SavedData.TrackedProducts1Min; break; case TrackInterval.FiveMin: selectedList = Constants.SavedData.TrackedProducts5Min; break; default: Log.Warning("Default was hit on a switch that shouldn't occur", tracker); selectedList = Constants.SavedData.TrackedProducts5Min; break; } Log.Debug("Removing tracker on {Interval} queue: {Tracker}", tracker.AlertInterval, tracker.FriendlyName); foundTracker = selectedList.Find(x => x.TrackerID == tracker.TrackerID); if (foundTracker != null) { Log.Debug("Removed tracker on {Interval} queue: {Tracker}", tracker.AlertInterval, tracker.FriendlyName); selectedList.Remove(foundTracker); } else { Log.Warning("Attempted to remove tracker on {Interval} queue: {Tracker} | Couldn't find the tracker", tracker.AlertInterval, tracker.FriendlyName); } }
public static async void ProcessAlertNeedOnTracker(TrackedProduct tracker) { try { Log.Verbose("Processing alert for tracker", tracker); WebCheck attempt1 = (await Communication.WebCheckForKeyword(tracker.PageURL, tracker.Keyword)); if (attempt1 == null) { Log.Verbose("Attempt1 page is empty, not alerting"); return; } WebCheck attempt2 = (await Communication.WebCheckForKeyword(tracker.PageURL, tracker.Keyword)); if (attempt2 == null) { Log.Verbose("Attempt2 page is empty, not alerting"); return; } if (attempt1.KeywordExists == attempt2.KeywordExists) { if ((attempt1.KeywordExists && !tracker.AlertOnKeywordNotExist) || (!attempt1.KeywordExists && tracker.AlertOnKeywordNotExist)) { if (!tracker.Triggered) { Log.Verbose("Alerting on tracker as logic matches", tracker, attempt1.KeywordExists); ProcessAlertToSend(tracker); } } else { if (tracker.Triggered) { Log.Verbose("Resetting on tracker as logic matches", tracker, attempt1.KeywordExists); ProcessAlertToReset(tracker); } } } else { Log.Verbose("Keyword found [{KWFound}] and Validation [{KWValidation}] don't match, not alerting", attempt1.KeywordExists, attempt2.KeywordExists); } } catch (Exception ex) { Log.Error("Error on tracker: [{Tracker}]{Error}", tracker.FriendlyName, ex.Message); Handler.NotifyError(ex, tracker.FriendlyName); } }
internal static void SendAlertWebhookDiscord(TrackedProduct tracker, string _title = null, string _msg = null, string _color = "718317") { try { if (_title == null) { _title = $"Keyword alert {tracker.FriendlyName}, Go Go Go!"; } if (_msg == null) { _msg = $"Alerting on the tracker for the following page:{Environment.NewLine}{tracker.PageURL}"; } string jsonSend = JsonConvert.SerializeObject(new { username = "******", avatar_url = Constants.WebHookAvatarURL, embeds = new[] { new { description = _msg, title = _title, color = _color } }, content = $"<@&{tracker.MentionString}>" }); Log.Debug("Attempting to send webhook", tracker, jsonSend); WebRequest request = (HttpWebRequest)WebRequest.Create(tracker.WebHookURL); request.ContentType = "application/json"; request.Method = "POST"; using (var sw = new StreamWriter(request.GetRequestStream())) { sw.Write(jsonSend); } Log.Debug("Sent webhook post", tracker, jsonSend); var response = (HttpWebResponse)request.GetResponse(); Log.Information("Posted webhook", tracker, jsonSend, response); } catch (Exception ex) { Log.Error(ex, "Failure occured when attempting to send tracker alert webhook", tracker); Handler.NotifyError(ex, "Alert"); } }
public static void ProcessAlertToSend(TrackedProduct tracker) { Log.Debug("Processing Alert Type", tracker.AlertType); tracker.Triggered = true; switch (tracker.AlertType) { case AlertType.Email: Communication.SendAlertEmail(tracker); break; case AlertType.Webhook: Communication.SendAlertWebhookDiscord(tracker, _color: "2813191"); break; case AlertType.Email_Webhook: Log.Warning("Processed Alert Type Webhook + Email when it isn't implemented yet", tracker); break; } }
private static void SendEmail(TrackedProduct tracker, string title, string msg) { var mailMessage = new MimeMessage(); mailMessage.From.Add(new MailboxAddress(Constants.Config.SMTPEmailName, Constants.Config.SMTPEmailFrom)); foreach (var address in tracker.Emails) { mailMessage.Bcc.Add(new MailboxAddress(address.ToString())); } mailMessage.Subject = title; mailMessage.Body = new TextPart("plain") { Text = msg }; using var smtpClient = new SmtpClient(); smtpClient.Connect(Constants.Config.SMTPUrl, Constants.Config.SMTPPort, MailKit.Security.SecureSocketOptions.Auto); smtpClient.Authenticate(Constants.Config.SMTPUsername, Constants.Config.SMTPPassword); smtpClient.Send(mailMessage); smtpClient.Disconnect(true); }
public static void ProcessAlertToTest(TrackedProduct tracker) { Log.Debug("Processing Alert Type For Testing", tracker.AlertType); string title = $"Testing alert on the the {tracker.FriendlyName} tracker, Get Pumped!"; string msg = $"Testing the tracker for the following page: {Environment.NewLine}{tracker.PageURL}"; string color = "16445954"; switch (tracker.AlertType) { case AlertType.Email: Communication.SendAlertEmail(tracker); break; case AlertType.Webhook: Communication.SendAlertWebhookDiscord(tracker, title, msg, color); break; case AlertType.Email_Webhook: Log.Warning("Processed Alert Type Webhook + Email when it isn't implemented yet", tracker); break; } }
internal static void SendAlertEmail(TrackedProduct tracker, string title = null, string msg = null) { try { Log.Debug("Attempting to send email alert: [{Tracker}] {Emails}", tracker.FriendlyName, tracker.Emails); if (title == null) { title = $"Keyword alert {tracker.FriendlyName}, Go Go Go!"; } if (msg == null) { msg = $"Alerting on the tracker for the following page:{Environment.NewLine}{tracker.PageURL}"; } Communication.SendEmail(tracker, title, msg); Log.Information("Sent email alert: [{Tracker}] {Emails}", tracker.FriendlyName, tracker.Emails); } catch (Exception ex) { Log.Error(ex, "Error occured on email alert"); Handler.NotifyError($"Error on Tracker Alert: [{tracker.FriendlyName}] {ex.Message}"); } }
public static void ProcessAlertToReset(TrackedProduct tracker) { Log.Debug("Processing Alert Type", tracker.AlertType); tracker.Triggered = false; var msg = $"Alert has cleared for the following page:{Environment.NewLine}{tracker.PageURL}"; var title = $"Alert has cleared for the {tracker.FriendlyName}, back to waiting :cry:"; var color = "15730439"; switch (tracker.AlertType) { case AlertType.Email: Communication.SendAlertEmail(tracker); break; case AlertType.Webhook: Communication.SendAlertWebhookDiscord(tracker, title, msg, color); break; case AlertType.Email_Webhook: Log.Warning("Processed Alert Type Webhook + Email when it isn't implemented yet", tracker); break; } }
private static void ShowMenuModifySingleWatcher(TrackedProduct selectedTracker) { Console.Clear(); bool menuClose = false; bool removeWatcher = false; while (!menuClose) { string menuName = $"Modify: {selectedTracker.FriendlyName}"; string description = "Select the property you wish to modify:"; var answer = Prompts.PromptMenuTrackerProperties(menuName, description); switch (answer) { case 1: menuClose = true; break; case 2: selectedTracker.FriendlyName = Prompts.PromptQuestion("Enter a new Friendly Name"); break; case 3: selectedTracker.PageURL = Prompts.PromptQuestion("Enter a new Page URL"); break; case 4: selectedTracker.Keyword = Prompts.PromptQuestion("Enter a new keyword"); break; case 5: selectedTracker.AlertOnKeywordNotExist = Prompts.PromptYesNo("Alert when keyword doesn't exist?"); break; case 6: selectedTracker.Enabled = Prompts.PromptYesNo("Do you want this watcher enabled?"); break; case 7: Prompts.PromptWatcherAlertType(selectedTracker); break; case 8: ShowWatcherProperties(selectedTracker); break; case 9: removeWatcher = Prompts.PromptYesNo("Are you sure you want to delete this watcher?"); menuClose = true; break; default: Log.Information("Answer entered wasn't a valid presented option"); Console.WriteLine("Answer entered isn't one of the options, please press enter and try again"); Console.ReadLine(); break; } if (removeWatcher) { selectedTracker.Delete(); } else { selectedTracker.Save(); } } Log.Information("Exited Menu ModifySingleWatcher"); }