コード例 #1
0
ファイル: UI.cs プロジェクト: rwobig93/ArbitraryBot
        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");
        }
コード例 #2
0
        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);
            }
        }
コード例 #3
0
ファイル: UI.cs プロジェクト: rwobig93/ArbitraryBot
        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();
        }
コード例 #4
0
        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);
            }
        }
コード例 #5
0
ファイル: Watcher.cs プロジェクト: rwobig93/ArbitraryBot
        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);
            }
        }
コード例 #6
0
        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");
            }
        }
コード例 #7
0
ファイル: Watcher.cs プロジェクト: rwobig93/ArbitraryBot
        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;
            }
        }
コード例 #8
0
        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);
        }
コード例 #9
0
ファイル: Watcher.cs プロジェクト: rwobig93/ArbitraryBot
        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;
            }
        }
コード例 #10
0
        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}");
            }
        }
コード例 #11
0
ファイル: Watcher.cs プロジェクト: rwobig93/ArbitraryBot
        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;
            }
        }
コード例 #12
0
ファイル: UI.cs プロジェクト: rwobig93/ArbitraryBot
        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");
        }