diff --git a/README.md b/README.md index d287429..c02ddb0 100644 --- a/README.md +++ b/README.md @@ -2,9 +2,9 @@ Given a subreddit name and a keyword, RPST will return all posts from a specified listing (default is 'top') that contain the provided keyword. [![Upload Python Package](https://github.com/rly0nheart/reddit-post-scraping-tool/actions/workflows/python-publish.yml/badge.svg)](https://github.com/rly0nheart/reddit-post-scraping-tool/actions/workflows/python-publish.yml) [![CodeQL](https://github.com/rly0nheart/reddit-post-scraping-tool/actions/workflows/codeql.yml/badge.svg)](https://github.com/rly0nheart/reddit-post-scraping-tool/actions/workflows/codeql.yml) ![.Net](https://img.shields.io/badge/.NET-5C2D91?style=flat&logo=.net&logoColor=white) ![Python](https://img.shields.io/badge/python-3670A0?style=flat&logo=python&logoColor=ffdd54) -![2023-08-08_07-04](https://github.com/bellingcat/reddit-post-scraping-tool/assets/74001397/10d91093-7b24-4de9-9f02-454b842d6b8e) -![2023-08-08_07-04_1](https://github.com/bellingcat/reddit-post-scraping-tool/assets/74001397/268a4c0e-d849-49a3-94ba-296d193774e1) - +![2023-08-09_04-05](https://github.com/bellingcat/reddit-post-scraping-tool/assets/74001397/d8917a35-3eac-44ce-aa96-1f9685095254) +![2023-08-09_04-05_1](https://github.com/bellingcat/reddit-post-scraping-tool/assets/74001397/d2fe7269-91d4-49ad-87fb-44282c5637a7) +*** # ✅ Features ## GUI diff --git a/RPST GUI/RPST/AboutBox.Designer.vb b/RPST GUI/RPST/AboutBox.Designer.vb index b3928df..78ebcaa 100644 --- a/RPST GUI/RPST/AboutBox.Designer.vb +++ b/RPST GUI/RPST/AboutBox.Designer.vb @@ -40,7 +40,7 @@ Partial Class AboutBox PictureBoxLogo.Image = CType(resources.GetObject("PictureBoxLogo.Image"), Image) PictureBoxLogo.Location = New Point(12, 12) PictureBoxLogo.Name = "PictureBoxLogo" - PictureBoxLogo.Size = New Size(99, 111) + PictureBoxLogo.Size = New Size(88, 93) PictureBoxLogo.SizeMode = PictureBoxSizeMode.StretchImage PictureBoxLogo.TabIndex = 0 PictureBoxLogo.TabStop = False @@ -48,11 +48,11 @@ Partial Class AboutBox ' LabelProgramName ' LabelProgramName.AutoSize = True - LabelProgramName.Font = New Font("Ink Free", 14.25F, FontStyle.Bold, GraphicsUnit.Point) + LabelProgramName.Font = New Font("Segoe Script", 9.75F, FontStyle.Bold, GraphicsUnit.Point) LabelProgramName.ForeColor = SystemColors.ControlText - LabelProgramName.Location = New Point(4, 11) + LabelProgramName.Location = New Point(3, 15) LabelProgramName.Name = "LabelProgramName" - LabelProgramName.Size = New Size(60, 23) + LabelProgramName.Size = New Size(48, 20) LabelProgramName.TabIndex = 3 LabelProgramName.Text = "Name" ' @@ -61,7 +61,7 @@ Partial Class AboutBox LabelProgramDescription.AutoSize = True LabelProgramDescription.Font = New Font("Segoe UI Semibold", 9F, FontStyle.Bold, GraphicsUnit.Point) LabelProgramDescription.ForeColor = SystemColors.ControlText - LabelProgramDescription.Location = New Point(4, 54) + LabelProgramDescription.Location = New Point(3, 43) LabelProgramDescription.Name = "LabelProgramDescription" LabelProgramDescription.Size = New Size(68, 15) LabelProgramDescription.TabIndex = 4 @@ -72,7 +72,7 @@ Partial Class AboutBox LabelVersion.AutoSize = True LabelVersion.Font = New Font("Segoe UI", 9F, FontStyle.Underline, GraphicsUnit.Point) LabelVersion.ForeColor = SystemColors.ControlText - LabelVersion.Location = New Point(372, 17) + LabelVersion.Location = New Point(347, 17) LabelVersion.Name = "LabelVersion" LabelVersion.Size = New Size(45, 15) LabelVersion.TabIndex = 5 @@ -82,7 +82,7 @@ Partial Class AboutBox ' LinkLabelReadtheWiki.AutoSize = True LinkLabelReadtheWiki.Font = New Font("Segoe UI", 9F, FontStyle.Regular, GraphicsUnit.Point) - LinkLabelReadtheWiki.Location = New Point(337, 54) + LinkLabelReadtheWiki.Location = New Point(313, 43) LinkLabelReadtheWiki.Name = "LinkLabelReadtheWiki" LinkLabelReadtheWiki.Size = New Size(79, 15) LinkLabelReadtheWiki.TabIndex = 6 @@ -96,18 +96,18 @@ Partial Class AboutBox Panel1.Controls.Add(LabelProgramName) Panel1.Controls.Add(LinkLabelReadtheWiki) Panel1.Controls.Add(LabelVersion) - Panel1.Location = New Point(117, 12) + Panel1.Location = New Point(106, 12) Panel1.Name = "Panel1" - Panel1.Size = New Size(440, 111) + Panel1.Size = New Size(409, 93) Panel1.TabIndex = 7 ' ' LicenseRichTextBox ' LicenseRichTextBox.Font = New Font("Cambria", 9.75F, FontStyle.Regular, GraphicsUnit.Point) - LicenseRichTextBox.Location = New Point(12, 135) + LicenseRichTextBox.Location = New Point(12, 113) LicenseRichTextBox.Name = "LicenseRichTextBox" LicenseRichTextBox.ReadOnly = True - LicenseRichTextBox.Size = New Size(545, 305) + LicenseRichTextBox.Size = New Size(503, 329) LicenseRichTextBox.TabIndex = 1 LicenseRichTextBox.Text = "License notice" ' @@ -116,7 +116,7 @@ Partial Class AboutBox AutoScaleDimensions = New SizeF(7F, 15F) AutoScaleMode = AutoScaleMode.Font BackColor = Color.Gainsboro - ClientSize = New Size(569, 454) + ClientSize = New Size(526, 453) Controls.Add(LicenseRichTextBox) Controls.Add(Panel1) Controls.Add(PictureBoxLogo) diff --git a/RPST GUI/RPST/AboutBox.vb b/RPST GUI/RPST/AboutBox.vb index c62386f..8d7bc44 100644 --- a/RPST GUI/RPST/AboutBox.vb +++ b/RPST GUI/RPST/AboutBox.vb @@ -35,8 +35,8 @@ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SO LabelProgramName.Text = My.Application.Info.ProductName LabelProgramDescription.Text = "Given a subreddit name and a keyword, -RPST returns all top posts -(by default) that contain the specified keyword." +RPST returns all top posts (by default) +that contain the specified keyword." LabelVersion.Text = $"v{My.Application.Info.Version}" LicenseRichTextBox.Text = LicenseText End Sub diff --git a/RPST GUI/RPST/DataGridViewHandler.vb b/RPST GUI/RPST/DataGridViewHandler.vb index 5df77e1..dd60c37 100644 --- a/RPST GUI/RPST/DataGridViewHandler.vb +++ b/RPST GUI/RPST/DataGridViewHandler.vb @@ -10,28 +10,28 @@ Public Class DataGridViewHandler dataGridView.Rows.Clear() dataGridView.Columns.Clear() - dataGridView.Columns.Add("PostCount", "Index") - dataGridView.Columns.Add("PostAuthor", "Author") - dataGridView.Columns.Add("PostID", "Post ID") - dataGridView.Columns.Add("PostText", "Post Text") - dataGridView.Columns.Add("PostSubreddit", "Subreddit") - dataGridView.Columns.Add("SubredditVisibility", "Subreddit Visibility") - dataGridView.Columns.Add("PostThumbnail", "Thumbnail") + dataGridView.Columns.Add("PostCount", "INDEX") + dataGridView.Columns.Add("PostAuthor", "AUTHOR") + dataGridView.Columns.Add("PostID", "ID") + dataGridView.Columns.Add("PostText", "TEXT") + dataGridView.Columns.Add("PostSubreddit", "SUBREDDIT") + dataGridView.Columns.Add("SubredditVisibility", "VISIBILITY") + dataGridView.Columns.Add("PostThumbnail", "THUMBNAIL") dataGridView.Columns.Add("PostIsNSFW", "NSFW") - dataGridView.Columns.Add("PostIsGilded", "Gilded") - dataGridView.Columns.Add("PostUpvotes", "Upvotes") - dataGridView.Columns.Add("PostUpvoteRatio", "Upvote Ratio") - dataGridView.Columns.Add("PostDownvotes", "Downvotes") - dataGridView.Columns.Add("PostAwards", "Awards") - dataGridView.Columns.Add("PostTopAward", "Top Award") - dataGridView.Columns.Add("PostIsCrosspostable", "Is Crosspostable?") - dataGridView.Columns.Add("PostScore", "Score") - dataGridView.Columns.Add("PostCategory", "Category") - dataGridView.Columns.Add("PostDomain", "Domain") - dataGridView.Columns.Add("PostPermalink", "Permalink") - dataGridView.Columns.Add("PostCreatedAt", "Created At") - dataGridView.Columns.Add("PostApprovedAt", "Approved At") - dataGridView.Columns.Add("PostApprovedBy", "Approved By") + dataGridView.Columns.Add("PostIsGilded", "GILDED") + dataGridView.Columns.Add("PostUpvotes", "UPVOTES") + dataGridView.Columns.Add("PostUpvoteRatio", "UPVOTE RATIO") + dataGridView.Columns.Add("PostDownvotes", "DOWNVOTES") + dataGridView.Columns.Add("PostAwards", "AWARDS") + dataGridView.Columns.Add("PostTopAward", "TOP AWARD") + dataGridView.Columns.Add("PostIsCrosspostable", "IS CROSS-POSTABLE?") + dataGridView.Columns.Add("PostScore", "SCORE") + dataGridView.Columns.Add("PostCategory", "CATEGORY") + dataGridView.Columns.Add("PostDomain", "DOMAIN") + dataGridView.Columns.Add("PostPermalink", "PERMALINK") + dataGridView.Columns.Add("PostCreatedAt", "CREATED AT") + dataGridView.Columns.Add("PostApprovedAt", "APPROVED ATt") + dataGridView.Columns.Add("PostApprovedBy", "APPROVED BY") End Sub Public Shared Sub AddRow(dataGridView As DataGridView, post As JObject, postNumber As Integer) diff --git a/RPST GUI/RPST/StartForm.Designer.vb b/RPST GUI/RPST/FormMain.Designer.vb similarity index 67% rename from RPST GUI/RPST/StartForm.Designer.vb rename to RPST GUI/RPST/FormMain.Designer.vb index f10ede9..07ad1df 100644 --- a/RPST GUI/RPST/StartForm.Designer.vb +++ b/RPST GUI/RPST/FormMain.Designer.vb @@ -1,5 +1,5 @@  -Partial Class StartForm +Partial Class FormMain Inherits System.Windows.Forms.Form 'Form overrides dispose to clean up the component list. @@ -23,12 +23,12 @@ Partial Class StartForm Private Sub InitializeComponent() components = New ComponentModel.Container() - Dim resources As ComponentModel.ComponentResourceManager = New ComponentModel.ComponentResourceManager(GetType(StartForm)) - KeywordTextBox = New TextBox() - SubredditTextBox = New TextBox() + Dim resources As ComponentModel.ComponentResourceManager = New ComponentModel.ComponentResourceManager(GetType(FormMain)) + TextBoxKeyword = New TextBox() + TextBoxSubreddit = New TextBox() ButtonScrape = New Button() - TimeframeComboBox = New ComboBox() - ListingComboBox = New ComboBox() + ComboBoxTimeframe = New ComboBox() + ComboBoxListing = New ComboBox() LabelKeyword = New Label() LabelSubreddit = New Label() LabelLimit = New Label() @@ -43,67 +43,76 @@ Partial Class StartForm ToolStripMenuItemDeveloper = New ToolStripMenuItem() ToolStripMenuItemCheckUpdates = New ToolStripMenuItem() ToolStripMenuItemQuit = New ToolStripMenuItem() - LimitNumericUpDown = New NumericUpDown() - PictureBoxLogo = New PictureBox() - LabelRPST = New Label() + NumericUpDownLimit = New NumericUpDown() + ToolTip = New ToolTip(components) ContextMenuStripRightClick.SuspendLayout() - CType(LimitNumericUpDown, ComponentModel.ISupportInitialize).BeginInit() - CType(PictureBoxLogo, ComponentModel.ISupportInitialize).BeginInit() + CType(NumericUpDownLimit, ComponentModel.ISupportInitialize).BeginInit() SuspendLayout() ' - ' KeywordTextBox + ' TextBoxKeyword ' - KeywordTextBox.BackColor = SystemColors.Window - KeywordTextBox.ForeColor = SystemColors.WindowText - KeywordTextBox.Location = New Point(159, 75) - KeywordTextBox.Name = "KeywordTextBox" - KeywordTextBox.PlaceholderText = "Keyword" - KeywordTextBox.Size = New Size(100, 23) - KeywordTextBox.TabIndex = 0 + TextBoxKeyword.BackColor = SystemColors.Window + TextBoxKeyword.ForeColor = SystemColors.WindowText + TextBoxKeyword.Location = New Point(118, 20) + TextBoxKeyword.Name = "TextBoxKeyword" + TextBoxKeyword.PlaceholderText = "Keyword" + TextBoxKeyword.Size = New Size(100, 23) + TextBoxKeyword.TabIndex = 0 + ToolTip.SetToolTip(TextBoxKeyword, "Enter the keyword you want to search for.") ' - ' SubredditTextBox + ' TextBoxSubreddit ' - SubredditTextBox.Location = New Point(159, 106) - SubredditTextBox.Name = "SubredditTextBox" - SubredditTextBox.PlaceholderText = "Subreddit" - SubredditTextBox.Size = New Size(100, 23) - SubredditTextBox.TabIndex = 4 + TextBoxSubreddit.Location = New Point(118, 49) + TextBoxSubreddit.Name = "TextBoxSubreddit" + TextBoxSubreddit.PlaceholderText = "Subreddit" + TextBoxSubreddit.Size = New Size(100, 23) + TextBoxSubreddit.TabIndex = 4 + ToolTip.SetToolTip(TextBoxSubreddit, "Provide the subreddit to search in.") ' ' ButtonScrape ' - ButtonScrape.Location = New Point(208, 29) + ButtonScrape.Location = New Point(167, 174) ButtonScrape.Name = "ButtonScrape" ButtonScrape.Size = New Size(51, 28) ButtonScrape.TabIndex = 6 ButtonScrape.Text = "Scrape" + ToolTip.SetToolTip(ButtonScrape, "You can also just hit ENTER to start scraping.") ButtonScrape.UseVisualStyleBackColor = True ' - ' TimeframeComboBox + ' ComboBoxTimeframe ' - TimeframeComboBox.FormattingEnabled = True - TimeframeComboBox.Items.AddRange(New Object() {"Hour", "Day", "Week", "Month", "Year"}) - TimeframeComboBox.Location = New Point(159, 200) - TimeframeComboBox.Name = "TimeframeComboBox" - TimeframeComboBox.Size = New Size(100, 23) - TimeframeComboBox.TabIndex = 8 - TimeframeComboBox.Text = "All" + ComboBoxTimeframe.AutoCompleteCustomSource.AddRange(New String() {"Hour", "Day", "Week", "Month", "Year"}) + ComboBoxTimeframe.AutoCompleteMode = AutoCompleteMode.Append + ComboBoxTimeframe.AutoCompleteSource = AutoCompleteSource.CustomSource + ComboBoxTimeframe.FormattingEnabled = True + ComboBoxTimeframe.Items.AddRange(New Object() {"Hour", "Day", "Week", "Month", "Year"}) + ComboBoxTimeframe.Location = New Point(118, 136) + ComboBoxTimeframe.Name = "ComboBoxTimeframe" + ComboBoxTimeframe.Size = New Size(100, 23) + ComboBoxTimeframe.TabIndex = 8 + ComboBoxTimeframe.Text = "All" + ToolTip.SetToolTip(ComboBoxTimeframe, "Select the time period for the posts. Default value is `All`.") ' - ' ListingComboBox + ' ComboBoxListing ' - ListingComboBox.FormattingEnabled = True - ListingComboBox.Items.AddRange(New Object() {"Controversial", "Hot", "Best", "New", "Rising"}) - ListingComboBox.Location = New Point(159, 168) - ListingComboBox.Name = "ListingComboBox" - ListingComboBox.Size = New Size(100, 23) - ListingComboBox.TabIndex = 9 - ListingComboBox.Text = "Top" + ComboBoxListing.AutoCompleteCustomSource.AddRange(New String() {"Controversial", "Hot", "Best", "New", "Rising"}) + ComboBoxListing.AutoCompleteMode = AutoCompleteMode.Append + ComboBoxListing.AutoCompleteSource = AutoCompleteSource.CustomSource + ComboBoxListing.FormattingEnabled = True + ComboBoxListing.Items.AddRange(New Object() {"Controversial", "Hot", "Best", "New", "Rising"}) + ComboBoxListing.Location = New Point(118, 107) + ComboBoxListing.Name = "ComboBoxListing" + ComboBoxListing.Size = New Size(100, 23) + ComboBoxListing.TabIndex = 9 + ComboBoxListing.Text = "Top" + ToolTip.SetToolTip(ComboBoxListing, "Choose the type of post listings. Default value is `Top`.") ' ' LabelKeyword ' LabelKeyword.AutoEllipsis = True LabelKeyword.Font = New Font("Segoe UI Semibold", 9F, FontStyle.Bold Or FontStyle.Underline, GraphicsUnit.Point) LabelKeyword.ForeColor = Color.Black - LabelKeyword.Location = New Point(19, 78) + LabelKeyword.Location = New Point(19, 23) LabelKeyword.Name = "LabelKeyword" LabelKeyword.Size = New Size(71, 20) LabelKeyword.TabIndex = 10 @@ -114,7 +123,7 @@ Partial Class StartForm LabelSubreddit.AutoEllipsis = True LabelSubreddit.Font = New Font("Segoe UI Semibold", 9F, FontStyle.Bold Or FontStyle.Underline, GraphicsUnit.Point) LabelSubreddit.ForeColor = Color.Black - LabelSubreddit.Location = New Point(19, 109) + LabelSubreddit.Location = New Point(19, 52) LabelSubreddit.Name = "LabelSubreddit" LabelSubreddit.Size = New Size(71, 23) LabelSubreddit.TabIndex = 11 @@ -125,7 +134,7 @@ Partial Class StartForm LabelLimit.AutoEllipsis = True LabelLimit.Font = New Font("Segoe UI Semibold", 9F, FontStyle.Bold Or FontStyle.Underline, GraphicsUnit.Point) LabelLimit.ForeColor = Color.Black - LabelLimit.Location = New Point(19, 137) + LabelLimit.Location = New Point(19, 75) LabelLimit.Name = "LabelLimit" LabelLimit.Size = New Size(56, 23) LabelLimit.TabIndex = 12 @@ -136,7 +145,7 @@ Partial Class StartForm LabelListing.AutoEllipsis = True LabelListing.Font = New Font("Segoe UI Semibold", 9F, FontStyle.Bold Or FontStyle.Underline, GraphicsUnit.Point) LabelListing.ForeColor = Color.Black - LabelListing.Location = New Point(19, 168) + LabelListing.Location = New Point(19, 107) LabelListing.Name = "LabelListing" LabelListing.Size = New Size(56, 23) LabelListing.TabIndex = 13 @@ -147,7 +156,7 @@ Partial Class StartForm LabelTimeframe.AutoEllipsis = True LabelTimeframe.Font = New Font("Segoe UI Semibold", 9F, FontStyle.Bold Or FontStyle.Underline, GraphicsUnit.Point) LabelTimeframe.ForeColor = Color.Black - LabelTimeframe.Location = New Point(19, 200) + LabelTimeframe.Location = New Point(19, 136) LabelTimeframe.Name = "LabelTimeframe" LabelTimeframe.Size = New Size(81, 23) LabelTimeframe.TabIndex = 14 @@ -228,76 +237,61 @@ Partial Class StartForm ToolStripMenuItemQuit.Size = New Size(153, 22) ToolStripMenuItemQuit.Text = "Quit" ' - ' LimitNumericUpDown + ' NumericUpDownLimit ' - LimitNumericUpDown.Location = New Point(159, 137) - LimitNumericUpDown.Minimum = New Decimal(New Integer() {5, 0, 0, 0}) - LimitNumericUpDown.Name = "LimitNumericUpDown" - LimitNumericUpDown.ReadOnly = True - LimitNumericUpDown.Size = New Size(100, 23) - LimitNumericUpDown.TabIndex = 15 - LimitNumericUpDown.Value = New Decimal(New Integer() {10, 0, 0, 0}) + NumericUpDownLimit.Location = New Point(118, 78) + NumericUpDownLimit.Minimum = New Decimal(New Integer() {5, 0, 0, 0}) + NumericUpDownLimit.Name = "NumericUpDownLimit" + NumericUpDownLimit.ReadOnly = True + NumericUpDownLimit.Size = New Size(100, 23) + NumericUpDownLimit.TabIndex = 15 + ToolTip.SetToolTip(NumericUpDownLimit, "Set how many posts you want to go through. Default value is `10`.") + NumericUpDownLimit.Value = New Decimal(New Integer() {10, 0, 0, 0}) ' - ' PictureBoxLogo + ' ToolTip ' - PictureBoxLogo.BackColor = Color.Transparent - PictureBoxLogo.Image = CType(resources.GetObject("PictureBoxLogo.Image"), Image) - PictureBoxLogo.Location = New Point(19, 12) - PictureBoxLogo.Name = "PictureBoxLogo" - PictureBoxLogo.Size = New Size(41, 45) - PictureBoxLogo.SizeMode = PictureBoxSizeMode.StretchImage - PictureBoxLogo.TabIndex = 17 - PictureBoxLogo.TabStop = False + ToolTip.AutoPopDelay = 5000 + ToolTip.BackColor = Color.Gainsboro + ToolTip.InitialDelay = 500 + ToolTip.ReshowDelay = 100 + ToolTip.ToolTipIcon = ToolTipIcon.Info + ToolTip.ToolTipTitle = "Tip" ' - ' LabelRPST - ' - LabelRPST.AutoSize = True - LabelRPST.BackColor = Color.Transparent - LabelRPST.Font = New Font("Ink Free", 9F, FontStyle.Regular, GraphicsUnit.Point) - LabelRPST.Location = New Point(50, 51) - LabelRPST.Name = "LabelRPST" - LabelRPST.Size = New Size(36, 15) - LabelRPST.TabIndex = 18 - LabelRPST.Text = "RPST" - ' - ' StartForm + ' FormMain ' AutoScaleDimensions = New SizeF(7F, 15F) AutoScaleMode = AutoScaleMode.Font BackColor = SystemColors.Control - ClientSize = New Size(281, 244) + ClientSize = New Size(239, 221) ContextMenuStrip = ContextMenuStripRightClick - Controls.Add(LabelRPST) - Controls.Add(PictureBoxLogo) - Controls.Add(TimeframeComboBox) - Controls.Add(KeywordTextBox) + Controls.Add(ComboBoxTimeframe) + Controls.Add(TextBoxKeyword) Controls.Add(LabelTimeframe) Controls.Add(LabelKeyword) - Controls.Add(ListingComboBox) - Controls.Add(LimitNumericUpDown) + Controls.Add(ComboBoxListing) + Controls.Add(NumericUpDownLimit) Controls.Add(LabelListing) Controls.Add(ButtonScrape) Controls.Add(LabelLimit) Controls.Add(LabelSubreddit) - Controls.Add(SubredditTextBox) + Controls.Add(TextBoxSubreddit) FormBorderStyle = FormBorderStyle.FixedSingle Icon = CType(resources.GetObject("$this.Icon"), Icon) MaximizeBox = False - Name = "StartForm" + Name = "FormMain" StartPosition = FormStartPosition.CenterScreen - Text = "ProgramName ProgramVersion" + Text = "RPST" ContextMenuStripRightClick.ResumeLayout(False) - CType(LimitNumericUpDown, ComponentModel.ISupportInitialize).EndInit() - CType(PictureBoxLogo, ComponentModel.ISupportInitialize).EndInit() + CType(NumericUpDownLimit, ComponentModel.ISupportInitialize).EndInit() ResumeLayout(False) PerformLayout() End Sub - Friend WithEvents KeywordTextBox As TextBox - Friend WithEvents SubredditTextBox As TextBox + Friend WithEvents TextBoxKeyword As TextBox + Friend WithEvents TextBoxSubreddit As TextBox Friend WithEvents ButtonScrape As Button - Friend WithEvents TimeframeComboBox As ComboBox - Friend WithEvents ListingComboBox As ComboBox + Friend WithEvents ComboBoxTimeframe As ComboBox + Friend WithEvents ComboBoxListing As ComboBox Friend WithEvents LabelKeyword As Label Friend WithEvents LabelSubreddit As Label Friend WithEvents LabelLimit As Label @@ -307,12 +301,11 @@ Partial Class StartForm Friend WithEvents ToolStripMenuItemSavePosts As ToolStripMenuItem Friend WithEvents ToolStripMenuItemtoJSON As ToolStripMenuItem Friend WithEvents ToolStripMenuItemtoCSV As ToolStripMenuItem - Friend WithEvents LimitNumericUpDown As NumericUpDown + Friend WithEvents NumericUpDownLimit As NumericUpDown Friend WithEvents ToolStripMenuItemDarkMode As ToolStripMenuItem Friend WithEvents ToolStripMenuItemAbout As ToolStripMenuItem Friend WithEvents ToolStripMenuItemDeveloper As ToolStripMenuItem Friend WithEvents ToolStripMenuItemCheckUpdates As ToolStripMenuItem Friend WithEvents ToolStripMenuItemQuit As ToolStripMenuItem - Friend WithEvents PictureBoxLogo As PictureBox - Friend WithEvents LabelRPST As Label + Friend WithEvents ToolTip As ToolTip End Class diff --git a/RPST GUI/RPST/StartForm.resx b/RPST GUI/RPST/FormMain.resx similarity index 84% rename from RPST GUI/RPST/StartForm.resx rename to RPST GUI/RPST/FormMain.resx index dd67293..5226a17 100644 --- a/RPST GUI/RPST/StartForm.resx +++ b/RPST GUI/RPST/FormMain.resx @@ -117,6 +117,9 @@ System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + 243, 22 + 38, 22 @@ -1944,371 +1947,6 @@ 57P9Wi7tx3TqLD7xCF4DnxTWTgp8V1VTiPjbIA3hOuk6IDoqiMWPujpd3ZkmEVxfvWcOLBrb7fnP02ZU 1oh1wHLacs/cG4mIItgwkf/Qb+6Zl8KLEWeji/+ofWF8tICv2AU4db7tpoCMIspFa1EN4C0+8V6bP0p+ AY7pF0Fg9EWkAAAAAElFTkSuQmCC - - - - - iVBORw0KGgoAAAANSUhEUgAAAgAAAAIACAYAAAD0eNT6AAAABGdBTUEAALGPC/xhBQAAAAlwSFlzAAAN - 0AAADdABEGw9BwAAABl0RVh0U29mdHdhcmUAd3d3Lmlua3NjYXBlLm9yZ5vuPBoAAFPuSURBVHhe7d0J - nBxVvTZ+ExbZVPTPX0Svonjd5b0qV0UEARXR60Xvq2yyi4DsskR2QfZNEEE2gbAIAgEEAgQIS4BAQEh6 - uqfXmUkySaYHbyCsCXuSep9fJyOdzjMz3dW1nKp++Hy+H+AH6e4659T5nao6dc57PM8TERGRDkODIiIi - km40KCIiIulGgyIiIpJuNCgiIiLpRoMiIiKSbjQoIiIi6UaDIiIikm40KCIiIulGgyIiIpJuNCgiIiLp - RoMiIiKSbjQoIiIi6UaDIiIikm40KCIiIulGgyIiIpJuNCgiIiLpRoMiIiKSbjQoIiIi6UaDIiIikm40 - KCIiIulGgyIiIpJuNCgiIiLpRoMiIiKSbjQoIiIi6UaDIiIikm40KCIiIulGgyIiIpJuNCgiIiLpRoMi - IiKtGhwcXA0+Bz+B38Jf4Ba4Dx6HHMyG5+B/oQ+64DG4B26GP8Mh8APYEMaw75L20aCIiMhILDHDf8Dh - cDv0wDvgBex1sIHD9fAr+BT7PdI6GhQREWmE5LsR7A8T4HlgCTsK/XAV7AofZr9VRkeDIiIiBgl2PTgI - ngKWjOO2GCbBzrAmOwbhaFBERDoXEul7YXu4E94Glnhd9AqMh61AcwdGQYMiItJ5kDTXhiPgWWAJNkls - 3oDdFRjLjlU0ABAR6XhIkuvC72ABsGSaZL2wN6zGjr2T0aCIiKQfkqJd8Z8GduucJc80mQf7gu4ILEeD - IiKSbkiEP1ueFFmyTLOnYRNWJp2GBkVEJJ2Q/D4N9y5Php1qCVwM67Iy6hQ0KCIi6YJkt8rMmTMvx9/f - AJYUO9F82JmVVyegQRERSQ8k/s/n8/nn+/v7WRKUwcEroOPWEKBBERFJh56enoO7uroWFwoFlvjkXd3w - eVaGaUWDIiKSbEhmq5RKpftnzJjhmXnz5rGkJytaCLux8kwjGhQRkeTCVf9H8vn8/OnTp3umUqmwZCfD - Ox9Sv5IgDYqISDL19vZ+JpfLLRpK/plMxqtWqyzJychugFQvHkSDIiKSPH19fZtks9k3h5K/QYwlN2nO - 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 - WNsXiQMNisQNg4GvlkqlK3GlNCuTySxmnaqIq2YsW463H2340r6+vs+zNi4SNxoUcU25XP4hrp5uRKc6 - gAGBXi8U53R1db2K9vlQoVDYA/+uXffEeTQo4rJKpTIWA4KdMCC4Ex3uc1pvQOKAhP8a2t9TcCza4EdZ - WxVxGQ2KJAkGBGtgQPBrXHk9aJMJ9ZqhhCGTybyBZD8jn8+fguSv9/Ml8WhQJMkwIFjXlibGgOCJbDa7 - kHXmIqOxV/SQ8JHv8+eiHX2OtTWRJKNBkTTBgOBjpVLpVAwIZtgbBnpkII2sTaBtvIw2Mr1YLJ6NpL8x - a0siaUKDImlXLpe3wKDgdHT4D+Eqr9rV1fU2SwySPpbscUW/AEn+SST7P6IdfA9xvY8vHYcGRToRBgXr - wz5ICtcjORSQJF7V3YJkQ/0tweDuOVzdP4qB3umo028hrhn6IkCDIrIMksUYDAq2xFXiWYVCYQqSyCAS - yjv1SUbiZ2tF2FU96mc6Bm/j8fe9Ed8IdGUvMgwaFJGRYUDwUdjf1iZAwiniCvN5DAze1B2DcKGMbWLe - cxiMdaHsr0Md2NsfG7I6EpGR0aCI+IfE9GEkpm3hSPzz5UhQ92OQkEfi+ieuUl/D1eoSltw6HQZPi5Hg - X8Fgag7K6h8oslvgTNgd5bYx/p81WHmLiD80KCLhwuBgrXK5/C3YH/98PgYKd2CgMB2Jb569qZCWxwxI - 6rXb8zie15DEn8exzQRbPGcCEvsZ+Puu+O9fxv/7PlZOIhIeGhSR+NmKh/B52BwDhe1gNzgQjsag4TS4 - EK7C4OEmmIgBxIMwDTJIrkWYiQQ7APORdF+EV5GEX7fb6LDY7kTAUkvQ8A5ib4L994X4/16GBfC/UMWf - 7YdeKEAGnsTnPgC34nuuwHeeg99gv+tX9lt7enq+MXv27H8bHBwcw45NROJHgyIiIpJuNCgiIiLpRoMi - IiKSbjQoIiIi6UaDIiIikm40KCIiIulGgyIiIpJuNCgiIiLpRoMiIiKSbjQoIiIi6UaDIiIikm40KCIi - IulGgyIiIpJuNCgiIiLpRoMiIiKSbjQoIiIi6UaDIiIikm40KCIiIulGgyIiIpJuNCgiIiLpRoMiIiKS - bjQoIiIi6UaDIiIikm40KCIiIulGgyIiIpJuNCgiIiLpRoMiIiKSbjQoIiIi6UaDIiIikmbee/4fFi8j - zX+PctYAAAAASUVORK5CYII= diff --git a/RPST GUI/RPST/FormMain.vb b/RPST GUI/RPST/FormMain.vb new file mode 100644 index 0000000..570deec --- /dev/null +++ b/RPST GUI/RPST/FormMain.vb @@ -0,0 +1,184 @@ +Imports System.IO +Imports System.Windows.Forms.VisualStyles.VisualStyleElement +Imports Newtonsoft.Json +Imports Newtonsoft.Json.Linq + +Public Class FormMain + ReadOnly settings As New SettingsManager() + ReadOnly ApiHandler As New ApiHandler() + + ''' + ''' Event handler for the form load event. + ''' It loads settings, toggles dark mode if necessary, checks for directories, logs first time launch, and sets the form title. + ''' + ''' The source of the event. + ''' An EventArgs that contains the event data. + Private Sub FormMain_Load(sender As Object, e As EventArgs) Handles MyBase.Load + settings.LoadSettings() + settings.ToggleDarkMode(settings.DarkMode) + Utilities.PathFinder() + Utilities.LogFirstTimeLaunch() + Me.Text = My.Application.Info.AssemblyName + End Sub + + + ''' + ''' Event handler for the 'Dark Mode' checkbox change event. + ''' It toggles the dark mode of the application based on the checkbox status. + ''' + ''' The source of the event. + ''' An EventArgs that contains the event data. + Private Sub DarkModeToolStripMenuItem_CheckedChanged(sender As Object, e As EventArgs) Handles ToolStripMenuItemDarkMode.CheckedChanged + settings.ToggleDarkMode(ToolStripMenuItemDarkMode.Checked) + End Sub + + + ''' + ''' Event handler for the 'About' menu item click. + ''' It shows the 'About' box. + ''' + ''' The source of the event. + ''' An EventArgs that contains the event data. + Private Sub ToolStripMenuItemAbout_Click(sender As Object, e As EventArgs) Handles ToolStripMenuItemAbout.Click + AboutBox.Show() + End Sub + + + ''' + ''' Event handler for the 'Developer' menu item click. + ''' It shows the 'Developer' dialog box. + ''' + ''' The source of the event. + ''' An EventArgs that contains the event data. + Private Sub ToolStripMenuItemDeveloper_Click(sender As Object, e As EventArgs) Handles ToolStripMenuItemDeveloper.Click + DeveloperBox.ShowDialog() + End Sub + + + ''' + ''' Event handler for the 'Check Updates' menu item click. + ''' It checks for application updates and provides update information if a newer version is available. + ''' + ''' The source of the event. + ''' An EventArgs that contains the event data. + Private Sub ToolStripMenuItemCheckUpdates_Click(sender As Object, e As EventArgs) Handles ToolStripMenuItemCheckUpdates.Click + Dim data As JObject = ApiHandler.CheckUpdates() + If data("tag_name").ToString = My.Application.Info.Version.ToString Then + MessageBox.Show($"You're running the latest version v{My.Application.Info.Version} of {Me.Text}. Check again soon! :)", $"{Me.Text} v{My.Application.Info.Version}", MessageBoxButtons.OK, MessageBoxIcon.Information) + Else + Dim confirm As DialogResult = MessageBox.Show($"A new version v{data("tag_name")} of {Me.Text} is available, would you like to get it? + +{data("body")} +", $"{Me.Text} v{data("tag_name")}".ToString, MessageBoxButtons.YesNo, MessageBoxIcon.Question) + If confirm = DialogResult.Yes Then + Shell($"cmd /c start {data("html_url")}") + End If + End If + End Sub + + + ''' + ''' Event handler for the 'Quit' menu item click. + ''' It asks the user for confirmation and closes the program if the user agrees. + ''' + ''' The source of the event. + ''' An EventArgs that contains the event data. + Private Sub ToolStripMenuItemQuit_Click(sender As Object, e As EventArgs) Handles ToolStripMenuItemQuit.Click + Dim result As DialogResult = MessageBox.Show("This will close the program, continue?", "Quit", MessageBoxButtons.YesNo, MessageBoxIcon.Question) + If result = DialogResult.Yes Then + Me.Close() + End If + End Sub + + + ''' + ''' Handles the click event of the ScrapeButton. + ''' Collects inputs, fetches Reddit posts based on the inputs, + ''' and processes Reddit posts. + ''' + ''' The sender of the event. + ''' The EventArgs instance containing the event data. + Private Sub ButtonScrape_Click(sender As Object, e As EventArgs) Handles ButtonScrape.Click + Utilities.ProcessRedditPosts(ToolStripMenuItemtoJSON) + End Sub + + + ''' + ''' Handles the KeyDown event for the TextBoxKeyword. + ''' Processes Reddit posts when the Enter key is pressed. + ''' + ''' The source of the event. + ''' The instance containing the event data. + Private Sub TextBoxKeyword_KeyDown(sender As Object, e As KeyEventArgs) Handles TextBoxKeyword.KeyDown + ' Check if the Enter key is pressed + If e.KeyCode = Keys.Enter Then + ' Prevent the beep sound that usually comes with the Enter key in a single-line TextBox + e.SuppressKeyPress = True + Utilities.ProcessRedditPosts(ToolStripMenuItemtoJSON) + End If + End Sub + + + ''' + ''' Handles the KeyDown event for the TextBoxSubreddit. + ''' Processes Reddit posts when the Enter key is pressed. + ''' + ''' The source of the event. + ''' The instance containing the event data. + Private Sub TextBoxSubreddit_KeyDown(sender As Object, e As KeyEventArgs) Handles TextBoxSubreddit.KeyDown + ' Check if the Enter key is pressed + If e.KeyCode = Keys.Enter Then + ' Prevent the beep sound that usually comes with the Enter key in a single-line TextBox + e.SuppressKeyPress = True + Utilities.ProcessRedditPosts(ToolStripMenuItemtoJSON) + End If + End Sub + + + ''' + ''' Handles the KeyDown event for the NumericUpDownLimit. + ''' Processes Reddit posts when the Enter key is pressed. + ''' + ''' The source of the event. + ''' The instance containing the event data. + Private Sub NumericUpDownLimit_KeyDown(sender As Object, e As KeyEventArgs) Handles NumericUpDownLimit.KeyDown + ' Check if the Enter key is pressed + If e.KeyCode = Keys.Enter Then + ' Prevent the beep sound that usually comes with the Enter key in a single-line TextBox + e.SuppressKeyPress = True + Utilities.ProcessRedditPosts(ToolStripMenuItemtoJSON) + End If + End Sub + + + ''' + ''' Handles the KeyDown event for the ComboBoxListing. + ''' Processes Reddit posts when the Enter key is pressed. + ''' + ''' The source of the event. + ''' The instance containing the event data. + Private Sub ComboBoxListing_KeyDown(sender As Object, e As KeyEventArgs) Handles ComboBoxListing.KeyDown + ' Check if the Enter key is pressed + If e.KeyCode = Keys.Enter Then + ' Prevent the beep sound that usually comes with the Enter key in a single-line TextBox + e.SuppressKeyPress = True + Utilities.ProcessRedditPosts(ToolStripMenuItemtoJSON) + End If + End Sub + + + ''' + ''' Handles the KeyDown event for the ComboBoxTimeframe. + ''' Processes Reddit posts when the Enter key is pressed. + ''' + ''' The source of the event. + ''' The instance containing the event data. + Private Sub ComboBoxTimeframe_KeyDown(sender As Object, e As KeyEventArgs) Handles ComboBoxTimeframe.KeyDown + ' Check if the Enter key is pressed + If e.KeyCode = Keys.Enter Then + ' Prevent the beep sound that usually comes with the Enter key in a single-line TextBox + e.SuppressKeyPress = True + Utilities.ProcessRedditPosts(ToolStripMenuItemtoJSON) + End If + End Sub +End Class diff --git a/RPST GUI/RPST/FormPosts.Designer.vb b/RPST GUI/RPST/FormPosts.Designer.vb new file mode 100644 index 0000000..4db9bc3 --- /dev/null +++ b/RPST GUI/RPST/FormPosts.Designer.vb @@ -0,0 +1,59 @@ + +Partial Class FormPosts + Inherits System.Windows.Forms.Form + + 'Form overrides dispose to clean up the component list. + + Protected Overrides Sub Dispose(ByVal disposing As Boolean) + Try + If disposing AndAlso components IsNot Nothing Then + components.Dispose() + End If + Finally + MyBase.Dispose(disposing) + End Try + End Sub + + 'Required by the Windows Form Designer + Private components As System.ComponentModel.IContainer + + 'NOTE: The following procedure is required by the Windows Form Designer + 'It can be modified using the Windows Form Designer. + 'Do not modify it using the code editor. + + Private Sub InitializeComponent() + Dim resources As ComponentModel.ComponentResourceManager = New ComponentModel.ComponentResourceManager(GetType(FormPosts)) + DataGridViewPosts = New DataGridView() + CType(DataGridViewPosts, ComponentModel.ISupportInitialize).BeginInit() + SuspendLayout() + ' + ' DataGridViewPosts + ' + DataGridViewPosts.BackgroundColor = Color.Gainsboro + DataGridViewPosts.ColumnHeadersHeightSizeMode = DataGridViewColumnHeadersHeightSizeMode.AutoSize + DataGridViewPosts.Dock = DockStyle.Fill + DataGridViewPosts.Location = New Point(0, 0) + DataGridViewPosts.Name = "DataGridViewPosts" + DataGridViewPosts.ReadOnly = True + DataGridViewPosts.RowHeadersVisible = False + DataGridViewPosts.RowTemplate.Height = 25 + DataGridViewPosts.Size = New Size(501, 365) + DataGridViewPosts.TabIndex = 3 + ' + ' FormPosts + ' + AutoScaleDimensions = New SizeF(7F, 15F) + AutoScaleMode = AutoScaleMode.Font + ClientSize = New Size(501, 365) + Controls.Add(DataGridViewPosts) + Icon = CType(resources.GetObject("$this.Icon"), Icon) + Name = "FormPosts" + ShowInTaskbar = False + StartPosition = FormStartPosition.CenterScreen + Text = "Posts" + CType(DataGridViewPosts, ComponentModel.ISupportInitialize).EndInit() + ResumeLayout(False) + End Sub + + Friend WithEvents DataGridViewPosts As DataGridView +End Class diff --git a/RPST GUI/RPST/FormPosts.resx b/RPST GUI/RPST/FormPosts.resx new file mode 100644 index 0000000..0a0bced --- /dev/null +++ b/RPST GUI/RPST/FormPosts.resx @@ -0,0 +1,393 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + + + 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 + + + \ No newline at end of file diff --git a/RPST GUI/RPST/FormPosts.vb b/RPST GUI/RPST/FormPosts.vb new file mode 100644 index 0000000..a6ba0b3 --- /dev/null +++ b/RPST GUI/RPST/FormPosts.vb @@ -0,0 +1,5 @@ +Public Class FormPosts + Private Sub FormResults_Load(sender As Object, e As EventArgs) Handles MyBase.Load + Me.Text = $"{Me.Text} - {FormMain.TextBoxKeyword.Text}, r/{FormMain.TextBoxSubreddit.Text}, {FormMain.NumericUpDownLimit.Text}, {FormMain.ComboBoxListing.Text}, {FormMain.ComboBoxTimeframe.Text}" + End Sub +End Class \ No newline at end of file diff --git a/RPST GUI/RPST/My Project/Application.Designer.vb b/RPST GUI/RPST/My Project/Application.Designer.vb index e4e5f96..4cb6146 100644 --- a/RPST GUI/RPST/My Project/Application.Designer.vb +++ b/RPST GUI/RPST/My Project/Application.Designer.vb @@ -33,7 +33,7 @@ Namespace My _ Protected Overrides Sub OnCreateMainForm() - Me.MainForm = Global.RPST.StartForm + Me.MainForm = Global.RPST.FormMain End Sub End Class End Namespace diff --git a/RPST GUI/RPST/README.md b/RPST GUI/RPST/README.md index 01df3ad..c2d5d86 100644 --- a/RPST GUI/RPST/README.md +++ b/RPST GUI/RPST/README.md @@ -2,9 +2,9 @@ Given a subreddit name and a keyword, RPST will return all posts from a specified listing (default is 'top') that contain the provided keyword. [![Upload Python Package](https://github.com/rly0nheart/reddit-post-scraping-tool/actions/workflows/python-publish.yml/badge.svg)](https://github.com/rly0nheart/reddit-post-scraping-tool/actions/workflows/python-publish.yml) [![CodeQL](https://github.com/rly0nheart/reddit-post-scraping-tool/actions/workflows/codeql.yml/badge.svg)](https://github.com/rly0nheart/reddit-post-scraping-tool/actions/workflows/codeql.yml) ![.Net](https://img.shields.io/badge/.NET-5C2D91?style=flat&logo=.net&logoColor=white) ![Python](https://img.shields.io/badge/python-3670A0?style=flat&logo=python&logoColor=ffdd54) -![2023-08-08_07-04](https://github.com/bellingcat/reddit-post-scraping-tool/assets/74001397/10d91093-7b24-4de9-9f02-454b842d6b8e) -![2023-08-08_07-04_1](https://github.com/bellingcat/reddit-post-scraping-tool/assets/74001397/268a4c0e-d849-49a3-94ba-296d193774e1) - +![2023-08-09_04-05](https://github.com/bellingcat/reddit-post-scraping-tool/assets/74001397/d8917a35-3eac-44ce-aa96-1f9685095254) +![2023-08-09_04-05_1](https://github.com/bellingcat/reddit-post-scraping-tool/assets/74001397/d2fe7269-91d4-49ad-87fb-44282c5637a7) +*** # ✅ Features ## GUI diff --git a/RPST GUI/RPST/RPST.vbproj b/RPST GUI/RPST/RPST.vbproj index c7abc93..43f46d9 100644 --- a/RPST GUI/RPST/RPST.vbproj +++ b/RPST GUI/RPST/RPST.vbproj @@ -9,15 +9,15 @@ icon.ico Bellingcat Given a subreddit name and a keyword, RPST (Reddit Post Scraping Tool) returns all top (by default) posts that contain the specified keyword. - Copyright (c) 2023-2024 Richard Mwewa + Copyright (c) 2023 Richard Mwewa https://github.com/bellingcat/reddit-post-scraping-tool README.md https://github.com/bellingcat/reddit-post-scraping-tool - 1.5.0.0 - 1.5.0.0 + 1.6.0.0 + 1.6.0.0 LICENSE True - 1.5.0 + 1.6.0 reddit;scraper;reddit-scraper;osint 6.0-recommended diff --git a/RPST GUI/RPST/RPST.vbproj.user b/RPST GUI/RPST/RPST.vbproj.user index bf640a8..c61dce2 100644 --- a/RPST GUI/RPST/RPST.vbproj.user +++ b/RPST GUI/RPST/RPST.vbproj.user @@ -7,7 +7,10 @@ Form - + + Form + + Form diff --git a/RPST GUI/RPST/ResultsForm.Designer.vb b/RPST GUI/RPST/ResultsForm.Designer.vb deleted file mode 100644 index ef88122..0000000 --- a/RPST GUI/RPST/ResultsForm.Designer.vb +++ /dev/null @@ -1,57 +0,0 @@ - -Partial Class ResultsForm - Inherits System.Windows.Forms.Form - - 'Form overrides dispose to clean up the component list. - - Protected Overrides Sub Dispose(ByVal disposing As Boolean) - Try - If disposing AndAlso components IsNot Nothing Then - components.Dispose() - End If - Finally - MyBase.Dispose(disposing) - End Try - End Sub - - 'Required by the Windows Form Designer - Private components As System.ComponentModel.IContainer - - 'NOTE: The following procedure is required by the Windows Form Designer - 'It can be modified using the Windows Form Designer. - 'Do not modify it using the code editor. - - Private Sub InitializeComponent() - DataGridViewResults = New DataGridView() - CType(DataGridViewResults, ComponentModel.ISupportInitialize).BeginInit() - SuspendLayout() - ' - ' DataGridViewResults - ' - DataGridViewResults.BackgroundColor = Color.Gainsboro - DataGridViewResults.ColumnHeadersHeightSizeMode = DataGridViewColumnHeadersHeightSizeMode.AutoSize - DataGridViewResults.Dock = DockStyle.Fill - DataGridViewResults.Location = New Point(0, 0) - DataGridViewResults.Name = "DataGridViewResults" - DataGridViewResults.ReadOnly = True - DataGridViewResults.RowHeadersVisible = False - DataGridViewResults.RowTemplate.Height = 25 - DataGridViewResults.Size = New Size(800, 450) - DataGridViewResults.TabIndex = 3 - ' - ' ResultsForm - ' - AutoScaleDimensions = New SizeF(7.0F, 15.0F) - AutoScaleMode = AutoScaleMode.Font - ClientSize = New Size(800, 450) - Controls.Add(DataGridViewResults) - Name = "ResultsForm" - ShowIcon = False - ShowInTaskbar = False - Text = "ResultsForm" - CType(DataGridViewResults, ComponentModel.ISupportInitialize).EndInit() - ResumeLayout(False) - End Sub - - Friend WithEvents DataGridViewResults As DataGridView -End Class diff --git a/RPST GUI/RPST/ResultsForm.resx b/RPST GUI/RPST/ResultsForm.resx deleted file mode 100644 index 0f362c9..0000000 --- a/RPST GUI/RPST/ResultsForm.resx +++ /dev/null @@ -1,120 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - text/microsoft-resx - - - 2.0 - - - System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - \ No newline at end of file diff --git a/RPST GUI/RPST/ResultsForm.vb b/RPST GUI/RPST/ResultsForm.vb deleted file mode 100644 index 5f28270..0000000 --- a/RPST GUI/RPST/ResultsForm.vb +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/RPST GUI/RPST/Settings.vb b/RPST GUI/RPST/Settings.vb index 3d9d52a..9551529 100644 --- a/RPST GUI/RPST/Settings.vb +++ b/RPST GUI/RPST/Settings.vb @@ -25,7 +25,7 @@ Public Class SettingsManager Dim options As New JsonSerializerOptions With {.PropertyNameCaseInsensitive = True} Dim settings = Text.Json.JsonSerializer.Deserialize(Of SettingsManager)(json, options) Me.DarkMode = settings.DarkMode - StartForm.ToolStripMenuItemDarkMode.Checked = settings.DarkMode + FormMain.ToolStripMenuItemDarkMode.Checked = settings.DarkMode Else ' Settings file does not exist ' Create a new file with default settings 'False' @@ -34,7 +34,7 @@ Public Class SettingsManager File.WriteAllText(settingsFilePath, jsonOutput) Me.DarkMode = False - StartForm.ToolStripMenuItemDarkMode.Checked = False + FormMain.ToolStripMenuItemDarkMode.Checked = False End If End Sub @@ -71,48 +71,46 @@ Public Class SettingsManager If DarkMode Then ' Enable dark mode for the Main form ' Background colours (I know 'Colours'/'Colors'😆) - StartForm.BackColor = ColorTranslator.FromHtml("#FF121212") - StartForm.SubredditTextBox.BackColor = ColorTranslator.FromHtml("#FF2E2E2E") - StartForm.KeywordTextBox.BackColor = ColorTranslator.FromHtml("#FF2E2E2E") - StartForm.LimitNumericUpDown.BackColor = ColorTranslator.FromHtml("#FF2E2E2E") - StartForm.LimitNumericUpDown.BackColor = ColorTranslator.FromHtml("#FF2E2E2E") - StartForm.ListingComboBox.BackColor = ColorTranslator.FromHtml("#FF2E2E2E") - StartForm.TimeframeComboBox.BackColor = ColorTranslator.FromHtml("#FF2E2E2E") + FormMain.BackColor = ColorTranslator.FromHtml("#FF121212") + FormMain.TextBoxSubreddit.BackColor = ColorTranslator.FromHtml("#FF2E2E2E") + FormMain.TextBoxKeyword.BackColor = ColorTranslator.FromHtml("#FF2E2E2E") + FormMain.NumericUpDownLimit.BackColor = ColorTranslator.FromHtml("#FF2E2E2E") + FormMain.NumericUpDownLimit.BackColor = ColorTranslator.FromHtml("#FF2E2E2E") + FormMain.ComboBoxListing.BackColor = ColorTranslator.FromHtml("#FF2E2E2E") + FormMain.ComboBoxTimeframe.BackColor = ColorTranslator.FromHtml("#FF2E2E2E") ' Foreground colours - StartForm.KeywordTextBox.ForeColor = SystemColors.Control - StartForm.SubredditTextBox.ForeColor = SystemColors.Control - StartForm.LimitNumericUpDown.ForeColor = SystemColors.Control - StartForm.LimitNumericUpDown.ForeColor = SystemColors.Control - StartForm.ListingComboBox.ForeColor = SystemColors.Control - StartForm.TimeframeComboBox.ForeColor = SystemColors.Control - StartForm.LabelRPST.ForeColor = SystemColors.Control - StartForm.LabelKeyword.ForeColor = SystemColors.Control - StartForm.LabelSubreddit.ForeColor = SystemColors.Control - StartForm.LabelLimit.ForeColor = SystemColors.Control - StartForm.LabelListing.ForeColor = SystemColors.Control - StartForm.LabelTimeframe.ForeColor = SystemColors.Control + FormMain.TextBoxKeyword.ForeColor = SystemColors.Control + FormMain.TextBoxSubreddit.ForeColor = SystemColors.Control + FormMain.NumericUpDownLimit.ForeColor = SystemColors.Control + FormMain.NumericUpDownLimit.ForeColor = SystemColors.Control + FormMain.ComboBoxListing.ForeColor = SystemColors.Control + FormMain.ComboBoxTimeframe.ForeColor = SystemColors.Control + FormMain.LabelKeyword.ForeColor = SystemColors.Control + FormMain.LabelSubreddit.ForeColor = SystemColors.Control + FormMain.LabelLimit.ForeColor = SystemColors.Control + FormMain.LabelListing.ForeColor = SystemColors.Control + FormMain.LabelTimeframe.ForeColor = SystemColors.Control - ResultsForm.BackColor = ColorTranslator.FromHtml("#FF121212") ' Enable dark mode on 'Right Click Menu' items ' Background colours - StartForm.ToolStripMenuItemDarkMode.BackColor = ColorTranslator.FromHtml("#FF121212") - StartForm.ToolStripMenuItemSavePosts.BackColor = ColorTranslator.FromHtml("#FF121212") - StartForm.ToolStripMenuItemtoJSON.BackColor = ColorTranslator.FromHtml("#FF121212") - StartForm.ToolStripMenuItemtoCSV.BackColor = ColorTranslator.FromHtml("#FF121212") - StartForm.ToolStripMenuItemAbout.BackColor = ColorTranslator.FromHtml("#FF121212") - StartForm.ToolStripMenuItemDeveloper.BackColor = ColorTranslator.FromHtml("#FF121212") - StartForm.ToolStripMenuItemCheckUpdates.BackColor = ColorTranslator.FromHtml("#FF121212") - StartForm.ToolStripMenuItemQuit.BackColor = ColorTranslator.FromHtml("#FF121212") + FormMain.ToolStripMenuItemDarkMode.BackColor = ColorTranslator.FromHtml("#FF121212") + FormMain.ToolStripMenuItemSavePosts.BackColor = ColorTranslator.FromHtml("#FF121212") + FormMain.ToolStripMenuItemtoJSON.BackColor = ColorTranslator.FromHtml("#FF121212") + FormMain.ToolStripMenuItemtoCSV.BackColor = ColorTranslator.FromHtml("#FF121212") + FormMain.ToolStripMenuItemAbout.BackColor = ColorTranslator.FromHtml("#FF121212") + FormMain.ToolStripMenuItemDeveloper.BackColor = ColorTranslator.FromHtml("#FF121212") + FormMain.ToolStripMenuItemCheckUpdates.BackColor = ColorTranslator.FromHtml("#FF121212") + FormMain.ToolStripMenuItemQuit.BackColor = ColorTranslator.FromHtml("#FF121212") ' Foreground colours - StartForm.ToolStripMenuItemDarkMode.ForeColor = SystemColors.Control - StartForm.ToolStripMenuItemSavePosts.ForeColor = SystemColors.Control - StartForm.ToolStripMenuItemtoJSON.ForeColor = SystemColors.Control - StartForm.ToolStripMenuItemtoCSV.ForeColor = SystemColors.Control - StartForm.ToolStripMenuItemAbout.ForeColor = SystemColors.Control - StartForm.ToolStripMenuItemDeveloper.ForeColor = SystemColors.Control - StartForm.ToolStripMenuItemCheckUpdates.ForeColor = SystemColors.Control - StartForm.ToolStripMenuItemQuit.ForeColor = SystemColors.Control + FormMain.ToolStripMenuItemDarkMode.ForeColor = SystemColors.Control + FormMain.ToolStripMenuItemSavePosts.ForeColor = SystemColors.Control + FormMain.ToolStripMenuItemtoJSON.ForeColor = SystemColors.Control + FormMain.ToolStripMenuItemtoCSV.ForeColor = SystemColors.Control + FormMain.ToolStripMenuItemAbout.ForeColor = SystemColors.Control + FormMain.ToolStripMenuItemDeveloper.ForeColor = SystemColors.Control + FormMain.ToolStripMenuItemCheckUpdates.ForeColor = SystemColors.Control + FormMain.ToolStripMenuItemQuit.ForeColor = SystemColors.Control ' Enable dark mode for the About box @@ -128,50 +126,49 @@ Public Class SettingsManager AboutBox.LabelVersion.ForeColor = SystemColors.Control ' If dark mode is enabled, set the 'Dark Mode' text value to 'Light mode' - StartForm.ToolStripMenuItemDarkMode.Text = "Light Mode" + FormMain.ToolStripMenuItemDarkMode.Text = "Light Mode" Else ' Disable dark mode for the Main Form ' Background colours - StartForm.BackColor = Color.Gainsboro - StartForm.KeywordTextBox.BackColor = SystemColors.Control - StartForm.SubredditTextBox.BackColor = SystemColors.Control - StartForm.LimitNumericUpDown.BackColor = SystemColors.Control - StartForm.LimitNumericUpDown.BackColor = SystemColors.Control - StartForm.TimeframeComboBox.BackColor = SystemColors.Control - StartForm.ListingComboBox.BackColor = SystemColors.Control + FormMain.BackColor = Color.Gainsboro + FormMain.TextBoxKeyword.BackColor = SystemColors.Control + FormMain.TextBoxSubreddit.BackColor = SystemColors.Control + FormMain.NumericUpDownLimit.BackColor = SystemColors.Control + FormMain.NumericUpDownLimit.BackColor = SystemColors.Control + FormMain.ComboBoxTimeframe.BackColor = SystemColors.Control + FormMain.ComboBoxListing.BackColor = SystemColors.Control ' Foreground colours - StartForm.KeywordTextBox.ForeColor = ColorTranslator.FromHtml("#FF121212") - StartForm.SubredditTextBox.ForeColor = ColorTranslator.FromHtml("#FF121212") - StartForm.LimitNumericUpDown.ForeColor = ColorTranslator.FromHtml("#FF121212") - StartForm.LimitNumericUpDown.ForeColor = ColorTranslator.FromHtml("#FF121212") - StartForm.ListingComboBox.ForeColor = ColorTranslator.FromHtml("#FF121212") - StartForm.TimeframeComboBox.ForeColor = ColorTranslator.FromHtml("#FF121212") - StartForm.LabelRPST.ForeColor = ColorTranslator.FromHtml("#FF121212") - StartForm.LabelKeyword.ForeColor = ColorTranslator.FromHtml("#FF121212") - StartForm.LabelSubreddit.ForeColor = ColorTranslator.FromHtml("#FF121212") - StartForm.LabelLimit.ForeColor = ColorTranslator.FromHtml("#FF121212") - StartForm.LabelListing.ForeColor = ColorTranslator.FromHtml("#FF121212") - StartForm.LabelTimeframe.ForeColor = ColorTranslator.FromHtml("#FF121212") + FormMain.TextBoxKeyword.ForeColor = ColorTranslator.FromHtml("#FF121212") + FormMain.TextBoxSubreddit.ForeColor = ColorTranslator.FromHtml("#FF121212") + FormMain.NumericUpDownLimit.ForeColor = ColorTranslator.FromHtml("#FF121212") + FormMain.NumericUpDownLimit.ForeColor = ColorTranslator.FromHtml("#FF121212") + FormMain.ComboBoxListing.ForeColor = ColorTranslator.FromHtml("#FF121212") + FormMain.ComboBoxTimeframe.ForeColor = ColorTranslator.FromHtml("#FF121212") + FormMain.LabelKeyword.ForeColor = ColorTranslator.FromHtml("#FF121212") + FormMain.LabelSubreddit.ForeColor = ColorTranslator.FromHtml("#FF121212") + FormMain.LabelLimit.ForeColor = ColorTranslator.FromHtml("#FF121212") + FormMain.LabelListing.ForeColor = ColorTranslator.FromHtml("#FF121212") + FormMain.LabelTimeframe.ForeColor = ColorTranslator.FromHtml("#FF121212") ' Disable dark mode on 'Right Click Menu' items ' Background colours - StartForm.ToolStripMenuItemDarkMode.BackColor = Color.Gainsboro - StartForm.ToolStripMenuItemSavePosts.BackColor = Color.Gainsboro - StartForm.ToolStripMenuItemtoJSON.BackColor = Color.Gainsboro - StartForm.ToolStripMenuItemtoCSV.BackColor = Color.Gainsboro - StartForm.ToolStripMenuItemAbout.BackColor = Color.Gainsboro - StartForm.ToolStripMenuItemDeveloper.BackColor = Color.Gainsboro - StartForm.ToolStripMenuItemCheckUpdates.BackColor = Color.Gainsboro - StartForm.ToolStripMenuItemQuit.BackColor = Color.Gainsboro + FormMain.ToolStripMenuItemDarkMode.BackColor = Color.Gainsboro + FormMain.ToolStripMenuItemSavePosts.BackColor = Color.Gainsboro + FormMain.ToolStripMenuItemtoJSON.BackColor = Color.Gainsboro + FormMain.ToolStripMenuItemtoCSV.BackColor = Color.Gainsboro + FormMain.ToolStripMenuItemAbout.BackColor = Color.Gainsboro + FormMain.ToolStripMenuItemDeveloper.BackColor = Color.Gainsboro + FormMain.ToolStripMenuItemCheckUpdates.BackColor = Color.Gainsboro + FormMain.ToolStripMenuItemQuit.BackColor = Color.Gainsboro ' Foreground colours - StartForm.ToolStripMenuItemDarkMode.ForeColor = Color.Black - StartForm.ToolStripMenuItemSavePosts.ForeColor = Color.Black - StartForm.ToolStripMenuItemtoJSON.ForeColor = Color.Black - StartForm.ToolStripMenuItemtoCSV.ForeColor = Color.Black - StartForm.ToolStripMenuItemAbout.ForeColor = Color.Black - StartForm.ToolStripMenuItemDeveloper.ForeColor = Color.Black - StartForm.ToolStripMenuItemCheckUpdates.ForeColor = Color.Black - StartForm.ToolStripMenuItemQuit.ForeColor = Color.Black + FormMain.ToolStripMenuItemDarkMode.ForeColor = Color.Black + FormMain.ToolStripMenuItemSavePosts.ForeColor = Color.Black + FormMain.ToolStripMenuItemtoJSON.ForeColor = Color.Black + FormMain.ToolStripMenuItemtoCSV.ForeColor = Color.Black + FormMain.ToolStripMenuItemAbout.ForeColor = Color.Black + FormMain.ToolStripMenuItemDeveloper.ForeColor = Color.Black + FormMain.ToolStripMenuItemCheckUpdates.ForeColor = Color.Black + FormMain.ToolStripMenuItemQuit.ForeColor = Color.Black ' Disable dark mode for the About box ' Background colours @@ -187,7 +184,7 @@ Public Class SettingsManager AboutBox.LabelVersion.ForeColor = SystemColors.WindowText ' If dark mode is disabled, set the 'Light Mode' text value to 'Dark Mode' - StartForm.ToolStripMenuItemDarkMode.Text = "Dark Mode" + FormMain.ToolStripMenuItemDarkMode.Text = "Dark Mode" End If End Sub diff --git a/RPST GUI/RPST/StartForm.vb b/RPST GUI/RPST/StartForm.vb deleted file mode 100644 index 9a1a0d9..0000000 --- a/RPST GUI/RPST/StartForm.vb +++ /dev/null @@ -1,103 +0,0 @@ -Imports System.IO -Imports Newtonsoft.Json -Imports Newtonsoft.Json.Linq - -Public Class StartForm - ReadOnly settings As New SettingsManager() - ReadOnly ApiHandler As New ApiHandler() - - ''' - ''' Handles the click event of the ScrapeButton. - ''' Collects inputs, fetches Reddit posts based on the inputs, - ''' and updates the DataGridView with the fetched posts. - ''' - ''' The sender of the event. - ''' The EventArgs instance containing the event data. - Private Sub ButtonScrape_Click(sender As Object, e As EventArgs) Handles ButtonScrape.Click - Utilities.ProcessRedditPosts(ToolStripMenuItemtoJSON) - End Sub - - - ''' - ''' Event handler for the form load event. - ''' It loads settings, toggles dark mode if necessary, checks for directories, logs first time launch, and sets the form title. - ''' - ''' The source of the event. - ''' An EventArgs that contains the event data. - Private Sub StartForm_Load(sender As Object, e As EventArgs) Handles MyBase.Load - settings.LoadSettings() - settings.ToggleDarkMode(settings.DarkMode) - Utilities.PathFinder() - Utilities.LogFirstTimeLaunch() - Me.Text = $"{My.Application.Info.AssemblyName} v{My.Application.Info.Version}" - End Sub - - - ''' - ''' Event handler for the 'Dark Mode' checkbox change event. - ''' It toggles the dark mode of the application based on the checkbox status. - ''' - ''' The source of the event. - ''' An EventArgs that contains the event data. - Private Sub DarkModeToolStripMenuItem_CheckedChanged(sender As Object, e As EventArgs) Handles ToolStripMenuItemDarkMode.CheckedChanged - settings.ToggleDarkMode(ToolStripMenuItemDarkMode.Checked) - End Sub - - - ''' - ''' Event handler for the 'About' menu item click. - ''' It shows the 'About' box. - ''' - ''' The source of the event. - ''' An EventArgs that contains the event data. - Private Sub ToolStripMenuItemAbout_Click(sender As Object, e As EventArgs) Handles ToolStripMenuItemAbout.Click - AboutBox.Show() - End Sub - - - ''' - ''' Event handler for the 'Developer' menu item click. - ''' It shows the 'Developer' dialog box. - ''' - ''' The source of the event. - ''' An EventArgs that contains the event data. - Private Sub ToolStripMenuItemDeveloper_Click(sender As Object, e As EventArgs) Handles ToolStripMenuItemDeveloper.Click - DeveloperBox.ShowDialog() - End Sub - - - ''' - ''' Event handler for the 'Check Updates' menu item click. - ''' It checks for application updates and provides update information if a newer version is available. - ''' - ''' The source of the event. - ''' An EventArgs that contains the event data. - Private Sub ToolStripMenuItemCheckUpdates_Click(sender As Object, e As EventArgs) Handles ToolStripMenuItemCheckUpdates.Click - Dim data As JObject = ApiHandler.CheckUpdates() - If data("tag_name").ToString = $"{My.Application.Info.Version}" Then - MessageBox.Show($"You're running the current version v{My.Application.Info.Version} of {My.Application.Info.ProductName}. Check again soon! :)", "Information", MessageBoxButtons.OK, MessageBoxIcon.Information) - Else - Dim confirm As DialogResult = MessageBox.Show($"A new version v{data("tag_name")} of {My.Application.Info.ProductName} is available, would you like to get it? - -{data("body")} -", "Update", MessageBoxButtons.YesNo, MessageBoxIcon.Question) - If confirm = DialogResult.Yes Then - Shell($"cmd /c start {data("html_url")}") - End If - End If - End Sub - - - ''' - ''' Event handler for the 'Quit' menu item click. - ''' It asks the user for confirmation and closes the program if the user agrees. - ''' - ''' The source of the event. - ''' An EventArgs that contains the event data. - Private Sub ToolStripMenuItemQuit_Click(sender As Object, e As EventArgs) Handles ToolStripMenuItemQuit.Click - Dim result As DialogResult = MessageBox.Show("This will close the program, continue?", "Quit", MessageBoxButtons.YesNo, MessageBoxIcon.Question) - If result = DialogResult.Yes Then - Me.Close() - End If - End Sub -End Class diff --git a/RPST GUI/RPST/Utilities.vb b/RPST GUI/RPST/Utilities.vb index aa47f20..543b980 100644 --- a/RPST GUI/RPST/Utilities.vb +++ b/RPST GUI/RPST/Utilities.vb @@ -17,7 +17,7 @@ Public Class Utilities If inputs.HasValue Then ' Initialize the DataGridView - DataGridViewHandler.AddColumn(ResultsForm.DataGridViewResults) + DataGridViewHandler.AddColumn(FormPosts.DataGridViewPosts) ' Fetch Reddit posts based on the inputs Dim processor As New PostsProcessor() @@ -31,8 +31,8 @@ Public Class Utilities ' Check if the post contains the keyword If PostsProcessor.PostContainsKeyword(post, inputs.Value.Keyword.ToLower(Globalization.CultureInfo.InvariantCulture)) Then ' Add the post to the DataGridView - DataGridViewHandler.AddRow(ResultsForm.DataGridViewResults, post, totalPosts) - ResultsForm.Show() + DataGridViewHandler.AddRow(FormPosts.DataGridViewPosts, post, totalPosts) + FormPosts.Show() keywordFound = True End If Next @@ -75,8 +75,8 @@ Public Class Utilities ''' ''' ''' Tuple containing: - ''' Keyword (String) - Keyword entered by user in the StartForm. - ''' Subreddit (String) - Subreddit entered by user in the StartForm. + ''' Keyword (String) - Keyword entered by user in theFormMain. + ''' Subreddit (String) - Subreddit entered by user in theFormMain. ''' Listing (String) - Listing chosen by user in the StartForm, defaults to 'top' if none is selected. ''' Limit (Integer) - Limit entered by user in the StartForm, defaults to 10 if the entered value is over 100. ''' Timeframe (String) - Timeframe chosen by user in the StartForm, defaults to 'all' if none is selected. @@ -85,12 +85,12 @@ Public Class Utilities ''' If keyword or subreddit are empty, Displays a warning and returns nothing. ''' Public Shared Function CollectInputs() As (Keyword As String, Subreddit As String, Listing As String, Limit As Integer, Timeframe As String)? - Dim keyword As String = StartForm.KeywordTextBox.Text.Trim() - Dim subreddit As String = StartForm.SubredditTextBox.Text.Trim() + Dim keyword As String = FormMain.TextBoxKeyword.Text.Trim() + Dim subreddit As String = FormMain.TextBoxSubreddit.Text.Trim() ' Convert the Listing and Subreddit to lowercase using InvariantCulture - Dim listing As String = If(String.IsNullOrEmpty(StartForm.ListingComboBox.Text), "top", StartForm.ListingComboBox.Text.ToLower(Globalization.CultureInfo.InvariantCulture).Trim()) - Dim timeframe As String = If(String.IsNullOrEmpty(StartForm.TimeframeComboBox.Text), "all", StartForm.TimeframeComboBox.Text.ToLower(Globalization.CultureInfo.InvariantCulture).Trim()) - Dim limit As Integer = StartForm.LimitNumericUpDown.Value + Dim listing As String = If(String.IsNullOrEmpty(FormMain.ComboBoxListing.Text), "top", FormMain.ComboBoxListing.Text.ToLower(Globalization.CultureInfo.InvariantCulture).Trim()) + Dim timeframe As String = If(String.IsNullOrEmpty(FormMain.ComboBoxTimeframe.Text), "all", FormMain.ComboBoxTimeframe.Text.ToLower(Globalization.CultureInfo.InvariantCulture).Trim()) + Dim limit As Integer = FormMain.NumericUpDownLimit.Value ' Validate inputs If String.IsNullOrEmpty(keyword) AndAlso String.IsNullOrEmpty(subreddit) Then diff --git a/pyproject.toml b/pyproject.toml index f90218c..6a6773a 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -7,7 +7,7 @@ packages = ["rpst"] [project] name = "reddit-post-scraping-tool" -version = "1.5.0.0" +version = "1.6.0.0" description = "Given a subreddit name and a keyword, RPST returns all top (by default) posts that contain the specified keyword." readme = "README.md" requires-python = ">=3.8" diff --git a/rpst/__main.py b/rpst/__main.py index a9498c3..6d9ba86 100644 --- a/rpst/__main.py +++ b/rpst/__main.py @@ -17,7 +17,7 @@ def run(): try: # Check for updates - check_updates(version_tag="1.5.0.0") + check_updates(version_tag="1.6.0.0") # Get posts with the provided/parsed arguments get_posts(arguments=arguments)