├── .gitattributes ├── .github ├── FUNDING.yml ├── ISSUE_TEMPLATE │ ├── bug_report.md │ ├── feature_request.md │ └── need-help.md └── workflows │ └── main.yml ├── .gitignore ├── AutoUpdater ├── AutoUpdater.csproj ├── MainForm.Designer.cs ├── MainForm.cs ├── MainForm.resx └── Program.cs ├── Disclaimer.png ├── LICENSE ├── README.md ├── StreamViewerBot.sln ├── StreamViewerBot ├── App.config ├── Images │ ├── bot.png │ ├── button_emergency.png │ ├── button_start.png │ ├── button_stop.png │ ├── button_stopping.png │ ├── facebook.png │ ├── favicon.ico │ ├── icon_onwhite.png │ ├── info.png │ ├── twitch.png │ ├── twitter.png │ ├── ukraine.ico │ ├── validating.gif │ ├── viewers.png │ ├── webshare.png │ ├── withLoggedInUsers.png │ └── youtube.png ├── MainScreen.Designer.cs ├── MainScreen.cs ├── MainScreen.resx ├── Program.cs ├── Properties │ ├── Resources.Designer.cs │ └── Resources.resx ├── StreamViewerBot.csproj └── UI │ ├── ChangeLogViewer.Designer.cs │ ├── ChangeLogViewer.cs │ ├── ChangeLogViewer.resx │ ├── ProxyDisplayer.Designer.cs │ ├── ProxyDisplayer.cs │ ├── ProxyDisplayer.resx │ ├── ValidatingForm.Designer.cs │ ├── ValidatingForm.cs │ └── ValidatingForm.resx └── codeql-analysis.yml /.gitattributes: -------------------------------------------------------------------------------- 1 | ############################################################################### 2 | # Set default behavior to automatically normalize line endings. 3 | ############################################################################### 4 | * text=auto 5 | 6 | ############################################################################### 7 | # Set default behavior for command prompt diff. 8 | # 9 | # This is need for earlier builds of msysgit that does not have it on by 10 | # default for csharp files. 11 | # Note: This is only used by command line 12 | ############################################################################### 13 | #*.cs diff=csharp 14 | 15 | ############################################################################### 16 | # Set the merge driver for project and solution files 17 | # 18 | # Merging from the command prompt will add diff markers to the files if there 19 | # are conflicts (Merging from VS is not affected by the settings below, in VS 20 | # the diff markers are never inserted). Diff markers may cause the following 21 | # file extensions to fail to load in VS. An alternative would be to treat 22 | # these files as binary and thus will always conflict and require user 23 | # intervention with every merge. To do so, just uncomment the entries below 24 | ############################################################################### 25 | #*.sln merge=binary 26 | #*.csproj merge=binary 27 | #*.vbproj merge=binary 28 | #*.vcxproj merge=binary 29 | #*.vcproj merge=binary 30 | #*.dbproj merge=binary 31 | #*.fsproj merge=binary 32 | #*.lsproj merge=binary 33 | #*.wixproj merge=binary 34 | #*.modelproj merge=binary 35 | #*.sqlproj merge=binary 36 | #*.wwaproj merge=binary 37 | 38 | ############################################################################### 39 | # behavior for image files 40 | # 41 | # image files are treated as binary by default. 42 | ############################################################################### 43 | #*.jpg binary 44 | #*.png binary 45 | #*.gif binary 46 | 47 | ############################################################################### 48 | # diff behavior for common document formats 49 | # 50 | # Convert binary document formats to text before diffing them. This feature 51 | # is only available from the command line. Turn it on by uncommenting the 52 | # entries below. 53 | ############################################################################### 54 | #*.doc diff=astextplain 55 | #*.DOC diff=astextplain 56 | #*.docx diff=astextplain 57 | #*.DOCX diff=astextplain 58 | #*.dot diff=astextplain 59 | #*.DOT diff=astextplain 60 | #*.pdf diff=astextplain 61 | #*.PDF diff=astextplain 62 | #*.rtf diff=astextplain 63 | #*.RTF diff=astextplain 64 | -------------------------------------------------------------------------------- /.github/FUNDING.yml: -------------------------------------------------------------------------------- 1 | # These are supported funding model platforms 2 | 3 | github: # Replace with up to 4 GitHub Sponsors-enabled usernames e.g., [user1, user2] 4 | patreon: # Replace with a single Patreon username 5 | open_collective: # Replace with a single Open Collective username 6 | ko_fi: # Replace with a single Ko-fi username 7 | tidelift: # Replace with a single Tidelift platform-name/package-name e.g., npm/babel 8 | community_bridge: # Replace with a single Community Bridge project-name e.g., cloud-foundry 9 | liberapay: # Replace with a single Liberapay username 10 | issuehunt: # Replace with a single IssueHunt username 11 | otechie: # Replace with a single Otechie username 12 | lfx_crowdfunding: # Replace with a single LFX Crowdfunding project-name e.g., cloud-foundry 13 | custom: ['https://www.paypal.me/hadjaoglu'] 14 | -------------------------------------------------------------------------------- /.github/ISSUE_TEMPLATE/bug_report.md: -------------------------------------------------------------------------------- 1 | --- 2 | name: Bug report 3 | about: Create a report to help us improve 4 | title: '' 5 | labels: '' 6 | assignees: gorkemhacioglu 7 | 8 | --- 9 | 10 | **Describe the bug** 11 | A clear and concise description of what the bug is. 12 | 13 | **To Reproduce** 14 | Steps to reproduce the behavior: 15 | 1. Go to '...' 16 | 2. Click on '....' 17 | 3. Do this '....' 18 | 4. See error 19 | 20 | **Screenshots** 21 | If applicable, add screenshots to help explain your problem. 22 | 23 | **Desktop (please complete the following information):** 24 | - OS: [e.g. Windows 11] 25 | - Chrome Version 26 | - Bot Version [e.g. 1.2] 27 | - Which stream service? 28 | 29 | 30 | 31 | **Additional context** 32 | Add any other context about the problem here. 33 | -------------------------------------------------------------------------------- /.github/ISSUE_TEMPLATE/feature_request.md: -------------------------------------------------------------------------------- 1 | --- 2 | name: Feature request 3 | about: Suggest an idea for this project 4 | title: '' 5 | labels: '' 6 | assignees: gorkemhacioglu 7 | 8 | --- 9 | 10 | **Is your feature request related to a problem? Please describe.** 11 | A clear and concise description of what the problem is. Ex. I'm always frustrated when [...] 12 | 13 | **Describe the solution you'd like** 14 | A clear and concise description of what you want to happen. 15 | 16 | **Describe alternatives you've considered** 17 | A clear and concise description of any alternative solutions or features you've considered. 18 | 19 | **Additional context** 20 | Add any other context or screenshots about the feature request here. 21 | -------------------------------------------------------------------------------- /.github/ISSUE_TEMPLATE/need-help.md: -------------------------------------------------------------------------------- 1 | --- 2 | name: Need help 3 | about: Describe this issue template's purpose here. 4 | title: '' 5 | labels: '' 6 | assignees: gorkemhacioglu 7 | 8 | --- 9 | 10 | Chrome Version: ... 11 | Bot Version: ... 12 | Stream Platform: ... 13 | -------------------------------------------------------------------------------- /.github/workflows/main.yml: -------------------------------------------------------------------------------- 1 | - name: VirusTotal GitHub Action 2 | uses: crazy-max/ghaction-virustotal@v3.2.0 3 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | ## Ignore Visual Studio temporary files, build results, and 2 | ## files generated by popular Visual Studio add-ons. 3 | ## 4 | ## Get latest from https://github.com/github/gitignore/blob/master/VisualStudio.gitignore 5 | 6 | # User-specific files 7 | *.rsuser 8 | *.suo 9 | *.user 10 | *.userosscache 11 | *.sln.docstates 12 | 13 | # User-specific files (MonoDevelop/Xamarin Studio) 14 | *.userprefs 15 | 16 | # Build results 17 | [Dd]ebug/ 18 | [Dd]ebugPublic/ 19 | [Rr]elease/ 20 | [Rr]eleases/ 21 | x64/ 22 | x86/ 23 | [Aa][Rr][Mm]/ 24 | [Aa][Rr][Mm]64/ 25 | bld/ 26 | [Bb]in/ 27 | [Oo]bj/ 28 | [Ll]og/ 29 | 30 | # Visual Studio 2015/2017 cache/options directory 31 | .vs/ 32 | # Uncomment if you have tasks that create the project's static files in wwwroot 33 | #wwwroot/ 34 | 35 | # Visual Studio 2017 auto generated files 36 | Generated\ Files/ 37 | 38 | # MSTest test Results 39 | [Tt]est[Rr]esult*/ 40 | [Bb]uild[Ll]og.* 41 | 42 | # NUNIT 43 | *.VisualState.xml 44 | TestResult.xml 45 | 46 | # Build Results of an ATL Project 47 | [Dd]ebugPS/ 48 | [Rr]eleasePS/ 49 | dlldata.c 50 | 51 | # Benchmark Results 52 | BenchmarkDotNet.Artifacts/ 53 | 54 | # .NET Core 55 | project.lock.json 56 | project.fragment.lock.json 57 | artifacts/ 58 | 59 | # StyleCop 60 | StyleCopReport.xml 61 | 62 | # Files built by Visual Studio 63 | *_i.c 64 | *_p.c 65 | *_h.h 66 | *.ilk 67 | *.meta 68 | *.obj 69 | *.iobj 70 | *.pch 71 | *.pdb 72 | *.ipdb 73 | *.pgc 74 | *.pgd 75 | *.rsp 76 | *.sbr 77 | *.tlb 78 | *.tli 79 | *.tlh 80 | *.tmp 81 | *.tmp_proj 82 | *_wpftmp.csproj 83 | *.log 84 | *.vspscc 85 | *.vssscc 86 | .builds 87 | *.pidb 88 | *.svclog 89 | *.scc 90 | 91 | # Chutzpah Test files 92 | _Chutzpah* 93 | 94 | # Visual C++ cache files 95 | ipch/ 96 | *.aps 97 | *.ncb 98 | *.opendb 99 | *.opensdf 100 | *.sdf 101 | *.cachefile 102 | *.VC.db 103 | *.VC.VC.opendb 104 | 105 | # Visual Studio profiler 106 | *.psess 107 | *.vsp 108 | *.vspx 109 | *.sap 110 | 111 | # Visual Studio Trace Files 112 | *.e2e 113 | 114 | # TFS 2012 Local Workspace 115 | $tf/ 116 | 117 | # Guidance Automation Toolkit 118 | *.gpState 119 | 120 | # ReSharper is a .NET coding add-in 121 | _ReSharper*/ 122 | *.[Rr]e[Ss]harper 123 | *.DotSettings.user 124 | 125 | # JustCode is a .NET coding add-in 126 | .JustCode 127 | 128 | # TeamCity is a build add-in 129 | _TeamCity* 130 | 131 | # DotCover is a Code Coverage Tool 132 | *.dotCover 133 | 134 | # AxoCover is a Code Coverage Tool 135 | .axoCover/* 136 | !.axoCover/settings.json 137 | 138 | # Visual Studio code coverage results 139 | *.coverage 140 | *.coveragexml 141 | 142 | # NCrunch 143 | _NCrunch_* 144 | .*crunch*.local.xml 145 | nCrunchTemp_* 146 | 147 | # MightyMoose 148 | *.mm.* 149 | AutoTest.Net/ 150 | 151 | # Web workbench (sass) 152 | .sass-cache/ 153 | 154 | # Installshield output folder 155 | [Ee]xpress/ 156 | 157 | # DocProject is a documentation generator add-in 158 | DocProject/buildhelp/ 159 | DocProject/Help/*.HxT 160 | DocProject/Help/*.HxC 161 | DocProject/Help/*.hhc 162 | DocProject/Help/*.hhk 163 | DocProject/Help/*.hhp 164 | DocProject/Help/Html2 165 | DocProject/Help/html 166 | 167 | # Click-Once directory 168 | publish/ 169 | 170 | # Publish Web Output 171 | *.[Pp]ublish.xml 172 | *.azurePubxml 173 | # Note: Comment the next line if you want to checkin your web deploy settings, 174 | # but database connection strings (with potential passwords) will be unencrypted 175 | *.pubxml 176 | *.publishproj 177 | 178 | # Microsoft Azure Web App publish settings. Comment the next line if you want to 179 | # checkin your Azure Web App publish settings, but sensitive information contained 180 | # in these scripts will be unencrypted 181 | PublishScripts/ 182 | 183 | # NuGet Packages 184 | *.nupkg 185 | # The packages folder can be ignored because of Package Restore 186 | **/[Pp]ackages/* 187 | # except build/, which is used as an MSBuild target. 188 | !**/[Pp]ackages/build/ 189 | # Uncomment if necessary however generally it will be regenerated when needed 190 | #!**/[Pp]ackages/repositories.config 191 | # NuGet v3's project.json files produces more ignorable files 192 | *.nuget.props 193 | *.nuget.targets 194 | 195 | # Microsoft Azure Build Output 196 | csx/ 197 | *.build.csdef 198 | 199 | # Microsoft Azure Emulator 200 | ecf/ 201 | rcf/ 202 | 203 | # Windows Store app package directories and files 204 | AppPackages/ 205 | BundleArtifacts/ 206 | Package.StoreAssociation.xml 207 | _pkginfo.txt 208 | *.appx 209 | 210 | # Visual Studio cache files 211 | # files ending in .cache can be ignored 212 | *.[Cc]ache 213 | # but keep track of directories ending in .cache 214 | !?*.[Cc]ache/ 215 | 216 | # Others 217 | ClientBin/ 218 | ~$* 219 | *~ 220 | *.dbmdl 221 | *.dbproj.schemaview 222 | *.jfm 223 | *.pfx 224 | *.publishsettings 225 | orleans.codegen.cs 226 | 227 | # Including strong name files can present a security risk 228 | # (https://github.com/github/gitignore/pull/2483#issue-259490424) 229 | #*.snk 230 | 231 | # Since there are multiple workflows, uncomment next line to ignore bower_components 232 | # (https://github.com/github/gitignore/pull/1529#issuecomment-104372622) 233 | #bower_components/ 234 | 235 | # RIA/Silverlight projects 236 | Generated_Code/ 237 | 238 | # Backup & report files from converting an old project file 239 | # to a newer Visual Studio version. Backup files are not needed, 240 | # because we have git ;-) 241 | _UpgradeReport_Files/ 242 | Backup*/ 243 | UpgradeLog*.XML 244 | UpgradeLog*.htm 245 | ServiceFabricBackup/ 246 | *.rptproj.bak 247 | 248 | # SQL Server files 249 | *.mdf 250 | *.ldf 251 | *.ndf 252 | 253 | # Business Intelligence projects 254 | *.rdl.data 255 | *.bim.layout 256 | *.bim_*.settings 257 | *.rptproj.rsuser 258 | *- Backup*.rdl 259 | 260 | # Microsoft Fakes 261 | FakesAssemblies/ 262 | 263 | # GhostDoc plugin setting file 264 | *.GhostDoc.xml 265 | 266 | # Node.js Tools for Visual Studio 267 | .ntvs_analysis.dat 268 | node_modules/ 269 | 270 | # Visual Studio 6 build log 271 | *.plg 272 | 273 | # Visual Studio 6 workspace options file 274 | *.opt 275 | 276 | # Visual Studio 6 auto-generated workspace file (contains which files were open etc.) 277 | *.vbw 278 | 279 | # Visual Studio LightSwitch build output 280 | **/*.HTMLClient/GeneratedArtifacts 281 | **/*.DesktopClient/GeneratedArtifacts 282 | **/*.DesktopClient/ModelManifest.xml 283 | **/*.Server/GeneratedArtifacts 284 | **/*.Server/ModelManifest.xml 285 | _Pvt_Extensions 286 | 287 | # Paket dependency manager 288 | .paket/paket.exe 289 | paket-files/ 290 | 291 | # FAKE - F# Make 292 | .fake/ 293 | 294 | # JetBrains Rider 295 | .idea/ 296 | *.sln.iml 297 | 298 | # CodeRush personal settings 299 | .cr/personal 300 | 301 | # Python Tools for Visual Studio (PTVS) 302 | __pycache__/ 303 | *.pyc 304 | 305 | # Cake - Uncomment if you are using it 306 | # tools/** 307 | # !tools/packages.config 308 | 309 | # Tabs Studio 310 | *.tss 311 | 312 | # Telerik's JustMock configuration file 313 | *.jmconfig 314 | 315 | # BizTalk build output 316 | *.btp.cs 317 | *.btm.cs 318 | *.odx.cs 319 | *.xsd.cs 320 | 321 | # OpenCover UI analysis results 322 | OpenCover/ 323 | 324 | # Azure Stream Analytics local run output 325 | ASALocalRun/ 326 | 327 | # MSBuild Binary and Structured Log 328 | *.binlog 329 | 330 | # NVidia Nsight GPU debugger configuration file 331 | *.nvuser 332 | 333 | # MFractors (Xamarin productivity tool) working folder 334 | .mfractor/ 335 | 336 | # Local History for Visual Studio 337 | .localhistory/ 338 | 339 | # BeatPulse healthcheck temp database 340 | healthchecksdb -------------------------------------------------------------------------------- /AutoUpdater/AutoUpdater.csproj: -------------------------------------------------------------------------------- 1 |  2 | 3 | 4 | WinExe 5 | netcoreapp3.1 6 | true 7 | 10 8 | 9 | 10 | 11 | 12 | 13 | 14 | -------------------------------------------------------------------------------- /AutoUpdater/MainForm.Designer.cs: -------------------------------------------------------------------------------- 1 | namespace AutoUpdater 2 | { 3 | partial class MainForm 4 | { 5 | /// 6 | /// Required designer variable. 7 | /// 8 | private System.ComponentModel.IContainer components = null; 9 | 10 | /// 11 | /// Clean up any resources being used. 12 | /// 13 | /// true if managed resources should be disposed; otherwise, false. 14 | protected override void Dispose(bool disposing) 15 | { 16 | if (disposing && (components != null)) 17 | { 18 | components.Dispose(); 19 | } 20 | base.Dispose(disposing); 21 | } 22 | 23 | #region Windows Form Designer generated code 24 | 25 | /// 26 | /// Required method for Designer support - do not modify 27 | /// the contents of this method with the code editor. 28 | /// 29 | private void InitializeComponent() 30 | { 31 | System.ComponentModel.ComponentResourceManager resources = new System.ComponentModel.ComponentResourceManager(typeof(MainForm)); 32 | this.progressBar1 = new System.Windows.Forms.ProgressBar(); 33 | this.label1 = new System.Windows.Forms.Label(); 34 | this.SuspendLayout(); 35 | // 36 | // progressBar1 37 | // 38 | this.progressBar1.Location = new System.Drawing.Point(12, 12); 39 | this.progressBar1.Name = "progressBar1"; 40 | this.progressBar1.Size = new System.Drawing.Size(356, 33); 41 | this.progressBar1.TabIndex = 0; 42 | // 43 | // label1 44 | // 45 | this.label1.Font = new System.Drawing.Font("Segoe UI", 12F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point); 46 | this.label1.Location = new System.Drawing.Point(12, 48); 47 | this.label1.Name = "label1"; 48 | this.label1.Size = new System.Drawing.Size(356, 26); 49 | this.label1.TabIndex = 1; 50 | this.label1.Text = "Starting to update..."; 51 | this.label1.TextAlign = System.Drawing.ContentAlignment.MiddleCenter; 52 | // 53 | // MainForm 54 | // 55 | this.AutoScaleDimensions = new System.Drawing.SizeF(7F, 15F); 56 | this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; 57 | this.ClientSize = new System.Drawing.Size(380, 84); 58 | this.Controls.Add(this.label1); 59 | this.Controls.Add(this.progressBar1); 60 | this.Icon = ((System.Drawing.Icon)(resources.GetObject("$this.Icon"))); 61 | this.MaximumSize = new System.Drawing.Size(396, 123); 62 | this.MinimumSize = new System.Drawing.Size(396, 39); 63 | this.Name = "MainForm"; 64 | this.StartPosition = System.Windows.Forms.FormStartPosition.CenterScreen; 65 | this.Text = "Updater"; 66 | this.TopMost = true; 67 | this.ResumeLayout(false); 68 | 69 | } 70 | 71 | #endregion 72 | 73 | private System.Windows.Forms.ProgressBar progressBar1; 74 | private System.Windows.Forms.Label label1; 75 | } 76 | } 77 | 78 | -------------------------------------------------------------------------------- /AutoUpdater/MainForm.cs: -------------------------------------------------------------------------------- 1 | using System; 2 | using System.ComponentModel; 3 | using System.Diagnostics; 4 | using System.IO; 5 | using System.IO.Compression; 6 | using System.Linq; 7 | using System.Net; 8 | using System.Threading; 9 | using System.Windows.Forms; 10 | 11 | namespace AutoUpdater 12 | { 13 | public partial class MainForm : Form 14 | { 15 | private string _appDirectory = string.Empty; 16 | 17 | private string _targetUrl = string.Empty; 18 | 19 | private string _updatedAppFile = string.Empty; 20 | 21 | private string _zipPath = string.Empty; 22 | 23 | public MainForm() 24 | { 25 | InitializeComponent(); 26 | 27 | Shown += Start; 28 | } 29 | 30 | private void Start(object sender, EventArgs e) 31 | { 32 | try 33 | { 34 | var args = Environment.GetCommandLineArgs().Skip(1).ToArray().First().Replace('?', ' ').Split('*'); 35 | 36 | if (args.Length == 1) 37 | { 38 | label1.Text = "Failed to update"; 39 | 40 | return; 41 | } 42 | 43 | _targetUrl = args[0]; 44 | 45 | _appDirectory = args[1]; 46 | 47 | _updatedAppFile = args[2]; 48 | 49 | var directoryInfo = PrepareTempFolder(); 50 | 51 | if (directoryInfo != null) DownloadFiles(_targetUrl, directoryInfo); 52 | } 53 | catch (Exception) 54 | { 55 | SetLabel("Failed to update due to argument corruption."); 56 | } 57 | } 58 | 59 | private void ReRunApp(string appFile) 60 | { 61 | SetLabel("Starting updated application."); 62 | 63 | if (File.Exists(appFile)) 64 | Process.Start(appFile); 65 | else if (File.Exists(appFile.Replace("TwitchBotUI.exe", "StreamViewerBot.exe"))) 66 | Process.Start(appFile.Replace("TwitchBotUI.exe", "StreamViewerBot.exe")); 67 | else 68 | MessageBox.Show("Please restart the application manually."); 69 | 70 | Thread.Sleep(1000); 71 | Environment.Exit(0); 72 | } 73 | 74 | private void DownloadFiles(string targetUrl, DirectoryInfo directory) 75 | { 76 | try 77 | { 78 | using (var client = new WebClient()) 79 | { 80 | var targetDirectory = ""; 81 | _zipPath = targetDirectory = Path.Combine(directory.FullName, "win-x64.zip"); 82 | 83 | SetLabel("Downloading..."); 84 | client.DownloadProgressChanged += Client_DownloadProgressChanged; 85 | client.DownloadFileCompleted += Client_DownloadFileCompleted; 86 | 87 | client.Headers.Add("Accept: text/html, application/xhtml+xml, */*"); 88 | client.Headers.Add( 89 | "User-Agent: Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; WOW64; Trident/5.0)"); 90 | client.DownloadFileAsync(new Uri(targetUrl), targetDirectory); 91 | } 92 | } 93 | catch (Exception ex) 94 | { 95 | Debug.WriteLine(ex); 96 | SetLabel("Failed to download files."); 97 | } 98 | } 99 | 100 | private void Client_DownloadFileCompleted(object sender, AsyncCompletedEventArgs e) 101 | { 102 | if (e.Error == null && !e.Cancelled) 103 | { 104 | SetLabel("Extracting files."); 105 | 106 | var isExtracted = Extract(_zipPath); 107 | 108 | if (isExtracted) ReRunApp(_updatedAppFile); 109 | } 110 | } 111 | 112 | private void Client_DownloadProgressChanged(object sender, DownloadProgressChangedEventArgs e) 113 | { 114 | progressBar1.Value = e.ProgressPercentage; 115 | } 116 | 117 | private DirectoryInfo PrepareTempFolder() 118 | { 119 | var directory = 120 | Directory.CreateDirectory(Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "tempFolder")); 121 | 122 | foreach (var files in directory.GetFiles()) files.Delete(); 123 | 124 | return directory; 125 | } 126 | 127 | private bool Extract(string zipFile) 128 | { 129 | try 130 | { 131 | ZipFile.ExtractToDirectory(zipFile, _appDirectory, true); 132 | SetLabel("Application updated."); 133 | return true; 134 | } 135 | catch (Exception ex) 136 | { 137 | MessageBox.Show(ex.ToString()); 138 | Debug.WriteLine(ex); 139 | progressBar1.Value = 0; 140 | SetLabel("Failed to extract files"); 141 | return false; 142 | } 143 | } 144 | 145 | private void SetLabel(string label) 146 | { 147 | label1.Text = label; 148 | } 149 | } 150 | } -------------------------------------------------------------------------------- /AutoUpdater/Program.cs: -------------------------------------------------------------------------------- 1 | using System; 2 | using System.Windows.Forms; 3 | 4 | namespace AutoUpdater 5 | { 6 | internal static class Program 7 | { 8 | /// 9 | /// The main entry point for the application. 10 | /// 11 | [STAThread] 12 | private static void Main() 13 | { 14 | Application.SetHighDpiMode(HighDpiMode.SystemAware); 15 | Application.EnableVisualStyles(); 16 | Application.SetCompatibleTextRenderingDefault(false); 17 | Application.Run(new MainForm()); 18 | } 19 | } 20 | } -------------------------------------------------------------------------------- /Disclaimer.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gorkemhacioglu/Stream-Viewer-Chat-Bot/92752f0ac91e0522ca636af43122e3783e150882/Disclaimer.png -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | All Rights Reserved 2 | 3 | Copyright (c) 2022 Görkem Alican Hacıoğlu 4 | 5 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 6 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 7 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 8 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 9 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 10 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN 11 | THE SOFTWARE. THE SOFTWARE CAN NOT BE DISTRIBUTED AND USED FOR COMMERCIAL PURPOSES. 12 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # 🤖Stream Viewer & Chat Bot 2 | 3 | # FREE UP TO 2 URL! 4 | 5 | Our easy to use app, allows you to gain chat capable live viewers in a couple of minutes. 6 | 7 | **Supports:** *Twitch | Youtube | Kick | DLive | Nimo Tv | Trovo Live* 8 | 9 | **Don't have time and knowledge to run this app? Try our **[Cloud Service](https://streamviewerbot.com/pricing.html):cloud:** and gain viewers in seconds...** 10 | 11 | :star: Give us a star, if you like it! :star: 12 | 13 | ![image](https://github.com/gorkemhacioglu/Stream-Viewer-Chat-Bot/assets/32572262/90eee264-1dbb-4207-aa04-7dc65d05ef30) 14 | 15 | **[Download for Windows x64](https://streamviewerbot.com/download/win-x64.zip):arrow_down:** 16 | 17 | Leaked free proxies may **NOT** work, please buy for yourself. You can buy it from [**HERE**](https://www.webshare.io/?referral_code=ceuygyx4sir2) 18 | at an affordable price. 19 | 20 | * *Unfortunately free usage is over to prevent others to make money with this free application.* 21 | * *Your hardware and proxy capacity determines the viewer count that you will have.* 22 | 23 | ## **:white_check_mark: [VirusTotal Result](https://www.virustotal.com/gui/file/f57747dcb091ceb39461b8586cf0a8574b39728f7e7bfcad2fba9fec73b50833?nocache=1)** 24 | ## **:question: [How to configure](https://github.com/gorkemhacioglu/Stream-Viewer-Bot/wiki/Configuration)** 25 | ## **:information_source: [Wiki for more information](https://github.com/gorkemhacioglu/Stream-Viewer-Bot/wiki)** 26 | ## **:envelope: [Discord](https://discord.gg/t9N85a3eVv)** 27 | -------------------------------------------------------------------------------- /StreamViewerBot.sln: -------------------------------------------------------------------------------- 1 |  2 | Microsoft Visual Studio Solution File, Format Version 12.00 3 | # Visual Studio Version 16 4 | VisualStudioVersion = 16.0.30717.126 5 | MinimumVisualStudioVersion = 10.0.40219.1 6 | Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "AutoUpdater", "AutoUpdater\AutoUpdater.csproj", "{CAC57C41-6515-44E5-819E-18A8B55B6FAF}" 7 | EndProject 8 | Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "StreamViewerBot", "StreamViewerBot\StreamViewerBot.csproj", "{8EF8C0B7-4318-4AE6-A718-C0BB9D5BA31D}" 9 | EndProject 10 | Global 11 | GlobalSection(SolutionConfigurationPlatforms) = preSolution 12 | Debug|Any CPU = Debug|Any CPU 13 | Release|Any CPU = Release|Any CPU 14 | EndGlobalSection 15 | GlobalSection(ProjectConfigurationPlatforms) = postSolution 16 | {CAC57C41-6515-44E5-819E-18A8B55B6FAF}.Debug|Any CPU.ActiveCfg = Debug|Any CPU 17 | {CAC57C41-6515-44E5-819E-18A8B55B6FAF}.Debug|Any CPU.Build.0 = Debug|Any CPU 18 | {CAC57C41-6515-44E5-819E-18A8B55B6FAF}.Release|Any CPU.ActiveCfg = Release|Any CPU 19 | {CAC57C41-6515-44E5-819E-18A8B55B6FAF}.Release|Any CPU.Build.0 = Release|Any CPU 20 | {8EF8C0B7-4318-4AE6-A718-C0BB9D5BA31D}.Debug|Any CPU.ActiveCfg = Debug|Any CPU 21 | {8EF8C0B7-4318-4AE6-A718-C0BB9D5BA31D}.Debug|Any CPU.Build.0 = Debug|Any CPU 22 | {8EF8C0B7-4318-4AE6-A718-C0BB9D5BA31D}.Release|Any CPU.ActiveCfg = Release|Any CPU 23 | {8EF8C0B7-4318-4AE6-A718-C0BB9D5BA31D}.Release|Any CPU.Build.0 = Release|Any CPU 24 | EndGlobalSection 25 | GlobalSection(SolutionProperties) = preSolution 26 | HideSolutionNode = FALSE 27 | EndGlobalSection 28 | GlobalSection(ExtensibilityGlobals) = postSolution 29 | SolutionGuid = {171435FA-412E-41CF-9965-317AC68D2116} 30 | EndGlobalSection 31 | EndGlobal 32 | -------------------------------------------------------------------------------- /StreamViewerBot/App.config: -------------------------------------------------------------------------------- 1 |  2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | -------------------------------------------------------------------------------- /StreamViewerBot/Images/bot.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gorkemhacioglu/Stream-Viewer-Chat-Bot/92752f0ac91e0522ca636af43122e3783e150882/StreamViewerBot/Images/bot.png -------------------------------------------------------------------------------- /StreamViewerBot/Images/button_emergency.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gorkemhacioglu/Stream-Viewer-Chat-Bot/92752f0ac91e0522ca636af43122e3783e150882/StreamViewerBot/Images/button_emergency.png -------------------------------------------------------------------------------- /StreamViewerBot/Images/button_start.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gorkemhacioglu/Stream-Viewer-Chat-Bot/92752f0ac91e0522ca636af43122e3783e150882/StreamViewerBot/Images/button_start.png -------------------------------------------------------------------------------- /StreamViewerBot/Images/button_stop.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gorkemhacioglu/Stream-Viewer-Chat-Bot/92752f0ac91e0522ca636af43122e3783e150882/StreamViewerBot/Images/button_stop.png -------------------------------------------------------------------------------- /StreamViewerBot/Images/button_stopping.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gorkemhacioglu/Stream-Viewer-Chat-Bot/92752f0ac91e0522ca636af43122e3783e150882/StreamViewerBot/Images/button_stopping.png -------------------------------------------------------------------------------- /StreamViewerBot/Images/facebook.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gorkemhacioglu/Stream-Viewer-Chat-Bot/92752f0ac91e0522ca636af43122e3783e150882/StreamViewerBot/Images/facebook.png -------------------------------------------------------------------------------- /StreamViewerBot/Images/favicon.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gorkemhacioglu/Stream-Viewer-Chat-Bot/92752f0ac91e0522ca636af43122e3783e150882/StreamViewerBot/Images/favicon.ico -------------------------------------------------------------------------------- /StreamViewerBot/Images/icon_onwhite.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gorkemhacioglu/Stream-Viewer-Chat-Bot/92752f0ac91e0522ca636af43122e3783e150882/StreamViewerBot/Images/icon_onwhite.png -------------------------------------------------------------------------------- /StreamViewerBot/Images/info.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gorkemhacioglu/Stream-Viewer-Chat-Bot/92752f0ac91e0522ca636af43122e3783e150882/StreamViewerBot/Images/info.png -------------------------------------------------------------------------------- /StreamViewerBot/Images/twitch.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gorkemhacioglu/Stream-Viewer-Chat-Bot/92752f0ac91e0522ca636af43122e3783e150882/StreamViewerBot/Images/twitch.png -------------------------------------------------------------------------------- /StreamViewerBot/Images/twitter.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gorkemhacioglu/Stream-Viewer-Chat-Bot/92752f0ac91e0522ca636af43122e3783e150882/StreamViewerBot/Images/twitter.png -------------------------------------------------------------------------------- /StreamViewerBot/Images/ukraine.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gorkemhacioglu/Stream-Viewer-Chat-Bot/92752f0ac91e0522ca636af43122e3783e150882/StreamViewerBot/Images/ukraine.ico -------------------------------------------------------------------------------- /StreamViewerBot/Images/validating.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gorkemhacioglu/Stream-Viewer-Chat-Bot/92752f0ac91e0522ca636af43122e3783e150882/StreamViewerBot/Images/validating.gif -------------------------------------------------------------------------------- /StreamViewerBot/Images/viewers.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gorkemhacioglu/Stream-Viewer-Chat-Bot/92752f0ac91e0522ca636af43122e3783e150882/StreamViewerBot/Images/viewers.png -------------------------------------------------------------------------------- /StreamViewerBot/Images/webshare.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gorkemhacioglu/Stream-Viewer-Chat-Bot/92752f0ac91e0522ca636af43122e3783e150882/StreamViewerBot/Images/webshare.png -------------------------------------------------------------------------------- /StreamViewerBot/Images/withLoggedInUsers.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gorkemhacioglu/Stream-Viewer-Chat-Bot/92752f0ac91e0522ca636af43122e3783e150882/StreamViewerBot/Images/withLoggedInUsers.png -------------------------------------------------------------------------------- /StreamViewerBot/Images/youtube.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gorkemhacioglu/Stream-Viewer-Chat-Bot/92752f0ac91e0522ca636af43122e3783e150882/StreamViewerBot/Images/youtube.png -------------------------------------------------------------------------------- /StreamViewerBot/MainScreen.Designer.cs: -------------------------------------------------------------------------------- 1 | namespace StreamViewerBot 2 | { 3 | partial class MainScreen 4 | { 5 | /// 6 | /// Required designer variable. 7 | /// 8 | private System.ComponentModel.IContainer components = null; 9 | 10 | /// 11 | /// Clean up any resources being used. 12 | /// 13 | /// true if managed resources should be disposed; otherwise, false. 14 | protected override void Dispose(bool disposing) 15 | { 16 | if (disposing && (components != null)) 17 | { 18 | components.Dispose(); 19 | } 20 | base.Dispose(disposing); 21 | } 22 | 23 | #region Windows Form Designer generated code 24 | 25 | /// 26 | /// Required method for Designer support - do not modify 27 | /// the contents of this method with the code editor. 28 | /// 29 | private void InitializeComponent() 30 | { 31 | this.components = new System.ComponentModel.Container(); 32 | System.ComponentModel.ComponentResourceManager resources = new System.ComponentModel.ComponentResourceManager(typeof(MainScreen)); 33 | this.startStopButton = new System.Windows.Forms.PictureBox(); 34 | this.txtStreamUrl = new System.Windows.Forms.TextBox(); 35 | this.lblStreamUrl = new System.Windows.Forms.Label(); 36 | this.lblLog = new System.Windows.Forms.Label(); 37 | this.checkHeadless = new System.Windows.Forms.CheckBox(); 38 | this.openFileDialog1 = new System.Windows.Forms.OpenFileDialog(); 39 | this.txtProxyList = new System.Windows.Forms.TextBox(); 40 | this.browseProxyList = new System.Windows.Forms.Button(); 41 | this.logScreen = new System.Windows.Forms.TextBox(); 42 | this.lblBrowserLimit = new System.Windows.Forms.Label(); 43 | this.txtBrowserLimit = new System.Windows.Forms.TextBox(); 44 | this.picVulture = new System.Windows.Forms.PictureBox(); 45 | this.numRefreshMinutes = new System.Windows.Forms.NumericUpDown(); 46 | this.lblRefreshMin = new System.Windows.Forms.Label(); 47 | this.tipLimitInfo = new System.Windows.Forms.PictureBox(); 48 | this.toolTip = new System.Windows.Forms.ToolTip(this.components); 49 | this.tipRefreshBrowser = new System.Windows.Forms.PictureBox(); 50 | this.lblProxyList = new System.Windows.Forms.LinkLabel(); 51 | this.lblRefreshMin2 = new System.Windows.Forms.Label(); 52 | this.lblRefreshMin3 = new System.Windows.Forms.Label(); 53 | this.lblQuality = new System.Windows.Forms.Label(); 54 | this.lstQuality = new System.Windows.Forms.ComboBox(); 55 | this.tipQuality = new System.Windows.Forms.PictureBox(); 56 | this.txtLoginInfos = new System.Windows.Forms.TextBox(); 57 | this.btnWithLoggedIn = new System.Windows.Forms.PictureBox(); 58 | this.lblLoginInfoTitle = new System.Windows.Forms.Label(); 59 | this.lblHeadless = new System.Windows.Forms.Label(); 60 | this.picLiveViewer = new System.Windows.Forms.PictureBox(); 61 | this.lblViewer = new System.Windows.Forms.Label(); 62 | this.picBotViewer = new System.Windows.Forms.PictureBox(); 63 | this.lblLiveViewer = new System.Windows.Forms.Label(); 64 | this.tipLiveViewer = new System.Windows.Forms.PictureBox(); 65 | this.lnlResourceSaving = new System.Windows.Forms.Label(); 66 | this.checkLowCpuRam = new System.Windows.Forms.CheckBox(); 67 | this.lblNeedCloudServer = new System.Windows.Forms.Label(); 68 | this.picWebshare = new System.Windows.Forms.PictureBox(); 69 | this.label1 = new System.Windows.Forms.Label(); 70 | this.label2 = new System.Windows.Forms.Label(); 71 | this.lstserviceType = new System.Windows.Forms.ComboBox(); 72 | this.browseChatMessages = new System.Windows.Forms.Button(); 73 | this.lblChatMessages = new System.Windows.Forms.Label(); 74 | this.txtChatMessages = new System.Windows.Forms.TextBox(); 75 | this.label3 = new System.Windows.Forms.Label(); 76 | this.label4 = new System.Windows.Forms.Label(); 77 | this.label5 = new System.Windows.Forms.Label(); 78 | this.label6 = new System.Windows.Forms.Label(); 79 | this.browseUserAgentList = new System.Windows.Forms.Button(); 80 | this.txtUserAgentList = new System.Windows.Forms.TextBox(); 81 | this.lblUserAgentList = new System.Windows.Forms.Label(); 82 | ((System.ComponentModel.ISupportInitialize)(this.startStopButton)).BeginInit(); 83 | ((System.ComponentModel.ISupportInitialize)(this.picVulture)).BeginInit(); 84 | ((System.ComponentModel.ISupportInitialize)(this.numRefreshMinutes)).BeginInit(); 85 | ((System.ComponentModel.ISupportInitialize)(this.tipLimitInfo)).BeginInit(); 86 | ((System.ComponentModel.ISupportInitialize)(this.tipRefreshBrowser)).BeginInit(); 87 | ((System.ComponentModel.ISupportInitialize)(this.tipQuality)).BeginInit(); 88 | ((System.ComponentModel.ISupportInitialize)(this.btnWithLoggedIn)).BeginInit(); 89 | ((System.ComponentModel.ISupportInitialize)(this.picLiveViewer)).BeginInit(); 90 | ((System.ComponentModel.ISupportInitialize)(this.picBotViewer)).BeginInit(); 91 | ((System.ComponentModel.ISupportInitialize)(this.tipLiveViewer)).BeginInit(); 92 | ((System.ComponentModel.ISupportInitialize)(this.picWebshare)).BeginInit(); 93 | this.SuspendLayout(); 94 | // 95 | // startStopButton 96 | // 97 | this.startStopButton.BackgroundImage = ((System.Drawing.Image)(resources.GetObject("startStopButton.BackgroundImage"))); 98 | this.startStopButton.BackgroundImageLayout = System.Windows.Forms.ImageLayout.Zoom; 99 | this.startStopButton.Location = new System.Drawing.Point(404, 249); 100 | this.startStopButton.Name = "startStopButton"; 101 | this.startStopButton.Size = new System.Drawing.Size(71, 32); 102 | this.startStopButton.TabIndex = 0; 103 | this.startStopButton.TabStop = false; 104 | this.startStopButton.Click += new System.EventHandler(this.startStopButton_Click); 105 | // 106 | // txtStreamUrl 107 | // 108 | this.txtStreamUrl.Location = new System.Drawing.Point(83, 292); 109 | this.txtStreamUrl.Name = "txtStreamUrl"; 110 | this.txtStreamUrl.Size = new System.Drawing.Size(306, 23); 111 | this.txtStreamUrl.TabIndex = 1; 112 | // 113 | // lblStreamUrl 114 | // 115 | this.lblStreamUrl.AutoSize = true; 116 | this.lblStreamUrl.Location = new System.Drawing.Point(12, 295); 117 | this.lblStreamUrl.Name = "lblStreamUrl"; 118 | this.lblStreamUrl.Size = new System.Drawing.Size(65, 15); 119 | this.lblStreamUrl.TabIndex = 2; 120 | this.lblStreamUrl.Text = "Stream Url:"; 121 | // 122 | // lblLog 123 | // 124 | this.lblLog.AutoSize = true; 125 | this.lblLog.BackColor = System.Drawing.Color.White; 126 | this.lblLog.Font = new System.Drawing.Font("Segoe UI", 9F, ((System.Drawing.FontStyle)((System.Drawing.FontStyle.Bold | System.Drawing.FontStyle.Italic))), System.Drawing.GraphicsUnit.Point); 127 | this.lblLog.ForeColor = System.Drawing.SystemColors.HotTrack; 128 | this.lblLog.Location = new System.Drawing.Point(410, 15); 129 | this.lblLog.Name = "lblLog"; 130 | this.lblLog.Size = new System.Drawing.Size(45, 15); 131 | this.lblLog.TabIndex = 4; 132 | this.lblLog.Text = "Logger"; 133 | // 134 | // checkHeadless 135 | // 136 | this.checkHeadless.AutoSize = true; 137 | this.checkHeadless.Location = new System.Drawing.Point(142, 198); 138 | this.checkHeadless.Name = "checkHeadless"; 139 | this.checkHeadless.RightToLeft = System.Windows.Forms.RightToLeft.Yes; 140 | this.checkHeadless.Size = new System.Drawing.Size(15, 14); 141 | this.checkHeadless.TabIndex = 5; 142 | this.checkHeadless.UseVisualStyleBackColor = true; 143 | this.checkHeadless.CheckedChanged += new System.EventHandler(this.checkHeadless_CheckedChanged); 144 | // 145 | // openFileDialog1 146 | // 147 | this.openFileDialog1.FileName = "openFileDialog1"; 148 | // 149 | // txtProxyList 150 | // 151 | this.txtProxyList.Location = new System.Drawing.Point(123, 238); 152 | this.txtProxyList.Name = "txtProxyList"; 153 | this.txtProxyList.Size = new System.Drawing.Size(266, 23); 154 | this.txtProxyList.TabIndex = 7; 155 | // 156 | // browseProxyList 157 | // 158 | this.browseProxyList.Location = new System.Drawing.Point(81, 238); 159 | this.browseProxyList.Name = "browseProxyList"; 160 | this.browseProxyList.Size = new System.Drawing.Size(34, 23); 161 | this.browseProxyList.TabIndex = 8; 162 | this.browseProxyList.Text = "..."; 163 | this.browseProxyList.UseVisualStyleBackColor = true; 164 | this.browseProxyList.Click += new System.EventHandler(this.browseProxyList_Click); 165 | // 166 | // logScreen 167 | // 168 | this.logScreen.Location = new System.Drawing.Point(9, 12); 169 | this.logScreen.Multiline = true; 170 | this.logScreen.Name = "logScreen"; 171 | this.logScreen.ScrollBars = System.Windows.Forms.ScrollBars.Vertical; 172 | this.logScreen.Size = new System.Drawing.Size(467, 137); 173 | this.logScreen.TabIndex = 10; 174 | // 175 | // lblBrowserLimit 176 | // 177 | this.lblBrowserLimit.AutoSize = true; 178 | this.lblBrowserLimit.Location = new System.Drawing.Point(12, 162); 179 | this.lblBrowserLimit.Name = "lblBrowserLimit"; 180 | this.lblBrowserLimit.Size = new System.Drawing.Size(85, 15); 181 | this.lblBrowserLimit.TabIndex = 11; 182 | this.lblBrowserLimit.Text = "Browser Limit :"; 183 | this.lblBrowserLimit.Visible = false; 184 | // 185 | // txtBrowserLimit 186 | // 187 | this.txtBrowserLimit.Enabled = false; 188 | this.txtBrowserLimit.Location = new System.Drawing.Point(100, 157); 189 | this.txtBrowserLimit.Name = "txtBrowserLimit"; 190 | this.txtBrowserLimit.PlaceholderText = "0"; 191 | this.txtBrowserLimit.Size = new System.Drawing.Size(40, 23); 192 | this.txtBrowserLimit.TabIndex = 12; 193 | this.txtBrowserLimit.Visible = false; 194 | this.txtBrowserLimit.TextChanged += new System.EventHandler(this.txtBrowserLimit_TextChanged); 195 | // 196 | // picVulture 197 | // 198 | this.picVulture.BackgroundImage = ((System.Drawing.Image)(resources.GetObject("picVulture.BackgroundImage"))); 199 | this.picVulture.BackgroundImageLayout = System.Windows.Forms.ImageLayout.Zoom; 200 | this.picVulture.Location = new System.Drawing.Point(207, 337); 201 | this.picVulture.Name = "picVulture"; 202 | this.picVulture.Size = new System.Drawing.Size(160, 39); 203 | this.picVulture.TabIndex = 13; 204 | this.picVulture.TabStop = false; 205 | this.picVulture.Click += new System.EventHandler(this.pictureBox2_Click); 206 | this.picVulture.MouseEnter += new System.EventHandler(this.picVulture_MouseEnter); 207 | this.picVulture.MouseLeave += new System.EventHandler(this.picVulture_MouseLeave); 208 | // 209 | // numRefreshMinutes 210 | // 211 | this.numRefreshMinutes.Location = new System.Drawing.Point(265, 160); 212 | this.numRefreshMinutes.Maximum = new decimal(new int[] { 213 | 15, 214 | 0, 215 | 0, 216 | 0}); 217 | this.numRefreshMinutes.Name = "numRefreshMinutes"; 218 | this.numRefreshMinutes.Size = new System.Drawing.Size(64, 23); 219 | this.numRefreshMinutes.TabIndex = 14; 220 | this.numRefreshMinutes.Tag = "Refresh Browsers (Min.)"; 221 | this.numRefreshMinutes.Value = new decimal(new int[] { 222 | 5, 223 | 0, 224 | 0, 225 | 0}); 226 | // 227 | // lblRefreshMin 228 | // 229 | this.lblRefreshMin.AutoSize = true; 230 | this.lblRefreshMin.Location = new System.Drawing.Point(183, 171); 231 | this.lblRefreshMin.Name = "lblRefreshMin"; 232 | this.lblRefreshMin.Size = new System.Drawing.Size(53, 15); 233 | this.lblRefreshMin.TabIndex = 15; 234 | this.lblRefreshMin.Text = "(Minute)"; 235 | // 236 | // tipLimitInfo 237 | // 238 | this.tipLimitInfo.BackgroundImage = global::StreamViewerBot.Properties.Resources.info; 239 | this.tipLimitInfo.BackgroundImageLayout = System.Windows.Forms.ImageLayout.Zoom; 240 | this.tipLimitInfo.Location = new System.Drawing.Point(142, 155); 241 | this.tipLimitInfo.Name = "tipLimitInfo"; 242 | this.tipLimitInfo.Size = new System.Drawing.Size(16, 16); 243 | this.tipLimitInfo.TabIndex = 16; 244 | this.tipLimitInfo.TabStop = false; 245 | this.tipLimitInfo.Visible = false; 246 | this.tipLimitInfo.MouseHover += new System.EventHandler(this.picLimitInfo_MouseHover); 247 | // 248 | // toolTip 249 | // 250 | this.toolTip.AutoPopDelay = 10000; 251 | this.toolTip.BackColor = System.Drawing.Color.Aqua; 252 | this.toolTip.InitialDelay = 300; 253 | this.toolTip.IsBalloon = true; 254 | this.toolTip.ReshowDelay = 100; 255 | // 256 | // tipRefreshBrowser 257 | // 258 | this.tipRefreshBrowser.BackgroundImage = global::StreamViewerBot.Properties.Resources.info; 259 | this.tipRefreshBrowser.BackgroundImageLayout = System.Windows.Forms.ImageLayout.Zoom; 260 | this.tipRefreshBrowser.Location = new System.Drawing.Point(335, 158); 261 | this.tipRefreshBrowser.Name = "tipRefreshBrowser"; 262 | this.tipRefreshBrowser.Size = new System.Drawing.Size(16, 16); 263 | this.tipRefreshBrowser.TabIndex = 16; 264 | this.tipRefreshBrowser.TabStop = false; 265 | this.tipRefreshBrowser.MouseHover += new System.EventHandler(this.refreshInterval_MouseHover); 266 | // 267 | // lblProxyList 268 | // 269 | this.lblProxyList.AutoSize = true; 270 | this.lblProxyList.LinkBehavior = System.Windows.Forms.LinkBehavior.AlwaysUnderline; 271 | this.lblProxyList.Location = new System.Drawing.Point(12, 243); 272 | this.lblProxyList.Name = "lblProxyList"; 273 | this.lblProxyList.Size = new System.Drawing.Size(61, 15); 274 | this.lblProxyList.TabIndex = 17; 275 | this.lblProxyList.TabStop = true; 276 | this.lblProxyList.Text = "Proxy List:"; 277 | this.lblProxyList.LinkClicked += new System.Windows.Forms.LinkLabelLinkClickedEventHandler(this.lblProxyList_LinkClicked); 278 | // 279 | // lblRefreshMin2 280 | // 281 | this.lblRefreshMin2.AutoSize = true; 282 | this.lblRefreshMin2.Location = new System.Drawing.Point(164, 157); 283 | this.lblRefreshMin2.Name = "lblRefreshMin2"; 284 | this.lblRefreshMin2.Size = new System.Drawing.Size(88, 15); 285 | this.lblRefreshMin2.TabIndex = 15; 286 | this.lblRefreshMin2.Text = "Refresh Interval"; 287 | // 288 | // lblRefreshMin3 289 | // 290 | this.lblRefreshMin3.AutoSize = true; 291 | this.lblRefreshMin3.Location = new System.Drawing.Point(251, 162); 292 | this.lblRefreshMin3.Name = "lblRefreshMin3"; 293 | this.lblRefreshMin3.Size = new System.Drawing.Size(10, 15); 294 | this.lblRefreshMin3.TabIndex = 15; 295 | this.lblRefreshMin3.Text = ":"; 296 | // 297 | // lblQuality 298 | // 299 | this.lblQuality.AutoSize = true; 300 | this.lblQuality.Location = new System.Drawing.Point(187, 197); 301 | this.lblQuality.Name = "lblQuality"; 302 | this.lblQuality.Size = new System.Drawing.Size(72, 15); 303 | this.lblQuality.TabIndex = 19; 304 | this.lblQuality.Text = "Quality :"; 305 | // 306 | // lstQuality 307 | // 308 | this.lstQuality.DropDownStyle = System.Windows.Forms.ComboBoxStyle.DropDownList; 309 | this.lstQuality.Location = new System.Drawing.Point(265, 193); 310 | this.lstQuality.Name = "lstQuality"; 311 | this.lstQuality.Size = new System.Drawing.Size(64, 23); 312 | this.lstQuality.TabIndex = 20; 313 | this.lstQuality.SelectedIndexChanged += new System.EventHandler(this.lstQuality_SelectedIndexChanged); 314 | // 315 | // tipQuality 316 | // 317 | this.tipQuality.BackgroundImage = global::StreamViewerBot.Properties.Resources.info; 318 | this.tipQuality.BackgroundImageLayout = System.Windows.Forms.ImageLayout.Zoom; 319 | this.tipQuality.Location = new System.Drawing.Point(335, 191); 320 | this.tipQuality.Name = "tipQuality"; 321 | this.tipQuality.Size = new System.Drawing.Size(16, 16); 322 | this.tipQuality.TabIndex = 16; 323 | this.tipQuality.TabStop = false; 324 | this.tipQuality.MouseHover += new System.EventHandler(this.streamQuality_MouseHover); 325 | // 326 | // txtLoginInfos 327 | // 328 | this.txtLoginInfos.Location = new System.Drawing.Point(520, 26); 329 | this.txtLoginInfos.Multiline = true; 330 | this.txtLoginInfos.Name = "txtLoginInfos"; 331 | this.txtLoginInfos.PlaceholderText = "Format is =>Username{Blank}Password{Enter}"; 332 | this.txtLoginInfos.ScrollBars = System.Windows.Forms.ScrollBars.Both; 333 | this.txtLoginInfos.Size = new System.Drawing.Size(288, 308); 334 | this.txtLoginInfos.TabIndex = 21; 335 | this.txtLoginInfos.WordWrap = false; 336 | // 337 | // btnWithLoggedIn 338 | // 339 | this.btnWithLoggedIn.BackgroundImage = global::StreamViewerBot.Properties.Resources.withLoggedInUsers1; 340 | this.btnWithLoggedIn.BackgroundImageLayout = System.Windows.Forms.ImageLayout.Zoom; 341 | this.btnWithLoggedIn.Location = new System.Drawing.Point(485, 109); 342 | this.btnWithLoggedIn.Name = "btnWithLoggedIn"; 343 | this.btnWithLoggedIn.Size = new System.Drawing.Size(29, 144); 344 | this.btnWithLoggedIn.TabIndex = 22; 345 | this.btnWithLoggedIn.TabStop = false; 346 | this.btnWithLoggedIn.Click += new System.EventHandler(this.btnWithLoggedIn_Click); 347 | // 348 | // lblLoginInfoTitle 349 | // 350 | this.lblLoginInfoTitle.AutoSize = true; 351 | this.lblLoginInfoTitle.Location = new System.Drawing.Point(522, 9); 352 | this.lblLoginInfoTitle.Name = "lblLoginInfoTitle"; 353 | this.lblLoginInfoTitle.Size = new System.Drawing.Size(279, 15); 354 | this.lblLoginInfoTitle.TabIndex = 23; 355 | this.lblLoginInfoTitle.Text = "Login Credentials (Required for Facebook and Bigo)"; 356 | // 357 | // lblHeadless 358 | // 359 | this.lblHeadless.AutoSize = true; 360 | this.lblHeadless.Location = new System.Drawing.Point(11, 197); 361 | this.lblHeadless.Name = "lblHeadless"; 362 | this.lblHeadless.Size = new System.Drawing.Size(126, 15); 363 | this.lblHeadless.TabIndex = 24; 364 | this.lblHeadless.Text = "Headless :"; 365 | // 366 | // picLiveViewer 367 | // 368 | this.picLiveViewer.BackgroundImage = ((System.Drawing.Image)(resources.GetObject("picLiveViewer.BackgroundImage"))); 369 | this.picLiveViewer.BackgroundImageLayout = System.Windows.Forms.ImageLayout.Zoom; 370 | this.picLiveViewer.Location = new System.Drawing.Point(425, 157); 371 | this.picLiveViewer.Name = "picLiveViewer"; 372 | this.picLiveViewer.Size = new System.Drawing.Size(28, 26); 373 | this.picLiveViewer.TabIndex = 25; 374 | this.picLiveViewer.TabStop = false; 375 | // 376 | // lblViewer 377 | // 378 | this.lblViewer.Location = new System.Drawing.Point(376, 186); 379 | this.lblViewer.MaximumSize = new System.Drawing.Size(50, 13); 380 | this.lblViewer.Name = "lblViewer"; 381 | this.lblViewer.Size = new System.Drawing.Size(32, 13); 382 | this.lblViewer.TabIndex = 26; 383 | this.lblViewer.Text = "0"; 384 | this.lblViewer.TextAlign = System.Drawing.ContentAlignment.MiddleCenter; 385 | // 386 | // picBotViewer 387 | // 388 | this.picBotViewer.BackgroundImage = global::StreamViewerBot.Properties.Resources.bot; 389 | this.picBotViewer.BackgroundImageLayout = System.Windows.Forms.ImageLayout.Zoom; 390 | this.picBotViewer.Location = new System.Drawing.Point(376, 157); 391 | this.picBotViewer.Name = "picBotViewer"; 392 | this.picBotViewer.Size = new System.Drawing.Size(32, 26); 393 | this.picBotViewer.TabIndex = 27; 394 | this.picBotViewer.TabStop = false; 395 | // 396 | // lblLiveViewer 397 | // 398 | this.lblLiveViewer.Location = new System.Drawing.Point(414, 186); 399 | this.lblLiveViewer.MaximumSize = new System.Drawing.Size(50, 13); 400 | this.lblLiveViewer.Name = "lblLiveViewer"; 401 | this.lblLiveViewer.Size = new System.Drawing.Size(50, 13); 402 | this.lblLiveViewer.TabIndex = 28; 403 | this.lblLiveViewer.Text = "0"; 404 | this.lblLiveViewer.TextAlign = System.Drawing.ContentAlignment.MiddleCenter; 405 | // 406 | // tipLiveViewer 407 | // 408 | this.tipLiveViewer.BackgroundImage = global::StreamViewerBot.Properties.Resources.info; 409 | this.tipLiveViewer.BackgroundImageLayout = System.Windows.Forms.ImageLayout.Zoom; 410 | this.tipLiveViewer.Location = new System.Drawing.Point(459, 155); 411 | this.tipLiveViewer.Name = "tipLiveViewer"; 412 | this.tipLiveViewer.Size = new System.Drawing.Size(16, 16); 413 | this.tipLiveViewer.TabIndex = 29; 414 | this.tipLiveViewer.TabStop = false; 415 | this.tipLiveViewer.MouseHover += new System.EventHandler(this.tipLiveViewer_MouseHover); 416 | // 417 | // lnlResourceSaving 418 | // 419 | this.lnlResourceSaving.AutoSize = true; 420 | this.lnlResourceSaving.Font = new System.Drawing.Font("Segoe UI", 9F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point); 421 | this.lnlResourceSaving.Location = new System.Drawing.Point(12, 217); 422 | this.lnlResourceSaving.Name = "lnlResourceSaving"; 423 | this.lnlResourceSaving.Size = new System.Drawing.Size(125, 15); 424 | this.lnlResourceSaving.TabIndex = 30; 425 | this.lnlResourceSaving.Text = "Use Low CPU&&RAM :"; 426 | this.lnlResourceSaving.Visible = false; 427 | // 428 | // checkLowCpuRam 429 | // 430 | this.checkLowCpuRam.AutoSize = true; 431 | this.checkLowCpuRam.Location = new System.Drawing.Point(143, 217); 432 | this.checkLowCpuRam.Name = "checkLowCpuRam"; 433 | this.checkLowCpuRam.RightToLeft = System.Windows.Forms.RightToLeft.Yes; 434 | this.checkLowCpuRam.Size = new System.Drawing.Size(15, 14); 435 | this.checkLowCpuRam.TabIndex = 31; 436 | this.checkLowCpuRam.UseVisualStyleBackColor = true; 437 | this.checkLowCpuRam.Visible = false; 438 | // 439 | // lblNeedCloudServer 440 | // 441 | this.lblNeedCloudServer.AutoSize = true; 442 | this.lblNeedCloudServer.Font = new System.Drawing.Font("Segoe UI", 9F, System.Drawing.FontStyle.Italic, System.Drawing.GraphicsUnit.Point); 443 | this.lblNeedCloudServer.Location = new System.Drawing.Point(207, 319); 444 | this.lblNeedCloudServer.Name = "lblNeedCloudServer"; 445 | this.lblNeedCloudServer.Size = new System.Drawing.Size(159, 15); 446 | this.lblNeedCloudServer.TabIndex = 0; 447 | this.lblNeedCloudServer.Text = "Run this app on cloud server!"; 448 | // 449 | // picWebshare 450 | // 451 | this.picWebshare.BackgroundImage = ((System.Drawing.Image)(resources.GetObject("picWebshare.BackgroundImage"))); 452 | this.picWebshare.BackgroundImageLayout = System.Windows.Forms.ImageLayout.Zoom; 453 | this.picWebshare.Location = new System.Drawing.Point(51, 337); 454 | this.picWebshare.Name = "picWebshare"; 455 | this.picWebshare.Size = new System.Drawing.Size(119, 39); 456 | this.picWebshare.TabIndex = 32; 457 | this.picWebshare.TabStop = false; 458 | this.picWebshare.Click += new System.EventHandler(this.picWebshare_Click); 459 | this.picWebshare.MouseEnter += new System.EventHandler(this.picWebshare_MouseEnter); 460 | this.picWebshare.MouseLeave += new System.EventHandler(this.picWebshare_MouseLeave); 461 | // 462 | // label1 463 | // 464 | this.label1.AutoSize = true; 465 | this.label1.Font = new System.Drawing.Font("Segoe UI", 9F, System.Drawing.FontStyle.Italic, System.Drawing.GraphicsUnit.Point); 466 | this.label1.Location = new System.Drawing.Point(51, 319); 467 | this.label1.Name = "label1"; 468 | this.label1.Size = new System.Drawing.Size(119, 15); 469 | this.label1.TabIndex = 33; 470 | this.label1.Text = "Need private proxies?"; 471 | // 472 | // label2 473 | // 474 | this.label2.AutoSize = true; 475 | this.label2.Location = new System.Drawing.Point(352, 214); 476 | this.label2.Name = "label2"; 477 | this.label2.Size = new System.Drawing.Size(47, 15); 478 | this.label2.TabIndex = 40; 479 | this.label2.Text = "Service:"; 480 | // 481 | // lstserviceType 482 | // 483 | this.lstserviceType.DropDownStyle = System.Windows.Forms.ComboBoxStyle.DropDownList; 484 | this.lstserviceType.Location = new System.Drawing.Point(396, 211); 485 | this.lstserviceType.Name = "lstserviceType"; 486 | this.lstserviceType.Size = new System.Drawing.Size(79, 23); 487 | this.lstserviceType.TabIndex = 41; 488 | this.lstserviceType.Tag = ""; 489 | this.lstserviceType.SelectedIndexChanged += new System.EventHandler(this.lstServiceType_SelectedIndexChanged); 490 | // 491 | // browseChatMessages 492 | // 493 | this.browseChatMessages.Location = new System.Drawing.Point(609, 340); 494 | this.browseChatMessages.Name = "browseChatMessages"; 495 | this.browseChatMessages.Size = new System.Drawing.Size(34, 23); 496 | this.browseChatMessages.TabIndex = 42; 497 | this.browseChatMessages.Text = "..."; 498 | this.browseChatMessages.UseVisualStyleBackColor = true; 499 | this.browseChatMessages.Click += new System.EventHandler(this.chatMessagesList_Click); 500 | // 501 | // lblChatMessages 502 | // 503 | this.lblChatMessages.AutoSize = true; 504 | this.lblChatMessages.Font = new System.Drawing.Font("Segoe UI", 9F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point); 505 | this.lblChatMessages.Location = new System.Drawing.Point(517, 343); 506 | this.lblChatMessages.Name = "lblChatMessages"; 507 | this.lblChatMessages.Size = new System.Drawing.Size(92, 15); 508 | this.lblChatMessages.TabIndex = 43; 509 | this.lblChatMessages.Text = "Chat Messages :"; 510 | // 511 | // txtChatMessages 512 | // 513 | this.txtChatMessages.Location = new System.Drawing.Point(649, 340); 514 | this.txtChatMessages.Name = "txtChatMessages"; 515 | this.txtChatMessages.Size = new System.Drawing.Size(159, 23); 516 | this.txtChatMessages.TabIndex = 44; 517 | // 518 | // label3 519 | // 520 | this.label3.AutoSize = true; 521 | this.label3.Font = new System.Drawing.Font("Segoe UI", 8F, System.Drawing.FontStyle.Italic, System.Drawing.GraphicsUnit.Point); 522 | this.label3.Location = new System.Drawing.Point(575, 363); 523 | this.label3.Name = "label3"; 524 | this.label3.Size = new System.Drawing.Size(169, 13); 525 | this.label3.TabIndex = 45; 526 | this.label3.Text = "Sends messages randomly between"; 527 | // 528 | // label4 529 | // 530 | this.label4.AutoSize = true; 531 | this.label4.Font = new System.Drawing.Font("Segoe UI", 8F, System.Drawing.FontStyle.Italic, System.Drawing.GraphicsUnit.Point); 532 | this.label4.Location = new System.Drawing.Point(585, 376); 533 | this.label4.Name = "label4"; 534 | this.label4.Size = new System.Drawing.Size(145, 13); 535 | this.label4.TabIndex = 46; 536 | this.label4.Text = "1-10 minutes for each viewer."; 537 | // 538 | // label5 539 | // 540 | this.label5.AutoSize = true; 541 | this.label5.Location = new System.Drawing.Point(492, 91); 542 | this.label5.Name = "label5"; 543 | this.label5.Size = new System.Drawing.Size(15, 15); 544 | this.label5.TabIndex = 47; 545 | this.label5.Text = ">"; 546 | // 547 | // label6 548 | // 549 | this.label6.AutoSize = true; 550 | this.label6.Location = new System.Drawing.Point(492, 256); 551 | this.label6.Name = "label6"; 552 | this.label6.Size = new System.Drawing.Size(15, 15); 553 | this.label6.TabIndex = 48; 554 | this.label6.Text = ">"; 555 | // 556 | // browseUserAgentList 557 | // 558 | this.browseUserAgentList.Location = new System.Drawing.Point(109, 265); 559 | this.browseUserAgentList.Name = "browseUserAgentList"; 560 | this.browseUserAgentList.Size = new System.Drawing.Size(34, 23); 561 | this.browseUserAgentList.TabIndex = 50; 562 | this.browseUserAgentList.Text = "..."; 563 | this.browseUserAgentList.UseVisualStyleBackColor = true; 564 | this.browseUserAgentList.Click += new System.EventHandler(this.browseUserAgentList_Click); 565 | // 566 | // txtUserAgentList 567 | // 568 | this.txtUserAgentList.Location = new System.Drawing.Point(151, 265); 569 | this.txtUserAgentList.Name = "txtUserAgentList"; 570 | this.txtUserAgentList.Size = new System.Drawing.Size(238, 23); 571 | this.txtUserAgentList.TabIndex = 49; 572 | // 573 | // lblUserAgentList 574 | // 575 | this.lblUserAgentList.AutoSize = true; 576 | this.lblUserAgentList.Location = new System.Drawing.Point(12, 269); 577 | this.lblUserAgentList.Name = "lblUserAgentList"; 578 | this.lblUserAgentList.Size = new System.Drawing.Size(91, 15); 579 | this.lblUserAgentList.TabIndex = 51; 580 | this.lblUserAgentList.Text = "User-Agent List:"; 581 | // 582 | // MainScreen 583 | // 584 | this.AutoScaleDimensions = new System.Drawing.SizeF(96F, 96F); 585 | this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Dpi; 586 | this.ClientSize = new System.Drawing.Size(813, 396); 587 | this.Controls.Add(this.lblUserAgentList); 588 | this.Controls.Add(this.browseUserAgentList); 589 | this.Controls.Add(this.txtUserAgentList); 590 | this.Controls.Add(this.label6); 591 | this.Controls.Add(this.label5); 592 | this.Controls.Add(this.label4); 593 | this.Controls.Add(this.label3); 594 | this.Controls.Add(this.txtChatMessages); 595 | this.Controls.Add(this.lblChatMessages); 596 | this.Controls.Add(this.browseChatMessages); 597 | this.Controls.Add(this.checkHeadless); 598 | this.Controls.Add(this.lstserviceType); 599 | this.Controls.Add(this.label2); 600 | this.Controls.Add(this.label1); 601 | this.Controls.Add(this.picWebshare); 602 | this.Controls.Add(this.lblNeedCloudServer); 603 | this.Controls.Add(this.checkLowCpuRam); 604 | this.Controls.Add(this.lnlResourceSaving); 605 | this.Controls.Add(this.tipLiveViewer); 606 | this.Controls.Add(this.lblLiveViewer); 607 | this.Controls.Add(this.picBotViewer); 608 | this.Controls.Add(this.lblViewer); 609 | this.Controls.Add(this.picLiveViewer); 610 | this.Controls.Add(this.lblLog); 611 | this.Controls.Add(this.lblHeadless); 612 | this.Controls.Add(this.lblLoginInfoTitle); 613 | this.Controls.Add(this.btnWithLoggedIn); 614 | this.Controls.Add(this.txtLoginInfos); 615 | this.Controls.Add(this.tipQuality); 616 | this.Controls.Add(this.lstQuality); 617 | this.Controls.Add(this.lblQuality); 618 | this.Controls.Add(this.lblRefreshMin3); 619 | this.Controls.Add(this.lblRefreshMin2); 620 | this.Controls.Add(this.lblProxyList); 621 | this.Controls.Add(this.tipRefreshBrowser); 622 | this.Controls.Add(this.tipLimitInfo); 623 | this.Controls.Add(this.lblRefreshMin); 624 | this.Controls.Add(this.numRefreshMinutes); 625 | this.Controls.Add(this.picVulture); 626 | this.Controls.Add(this.txtBrowserLimit); 627 | this.Controls.Add(this.lblBrowserLimit); 628 | this.Controls.Add(this.browseProxyList); 629 | this.Controls.Add(this.txtProxyList); 630 | this.Controls.Add(this.lblStreamUrl); 631 | this.Controls.Add(this.txtStreamUrl); 632 | this.Controls.Add(this.startStopButton); 633 | this.Controls.Add(this.logScreen); 634 | this.FormBorderStyle = System.Windows.Forms.FormBorderStyle.FixedSingle; 635 | this.Icon = ((System.Drawing.Icon)(resources.GetObject("$this.Icon"))); 636 | this.MaximumSize = new System.Drawing.Size(836, 435); 637 | this.Name = "MainScreen"; 638 | this.StartPosition = System.Windows.Forms.FormStartPosition.CenterScreen; 639 | this.Text = "WE STAND WITH UKRAINE! - Stream Viewer Bot"; 640 | this.TopMost = true; 641 | this.FormClosing += new System.Windows.Forms.FormClosingEventHandler(this.MainScreen_FormClosing); 642 | this.Shown += new System.EventHandler(this.MainScreen_Shown); 643 | ((System.ComponentModel.ISupportInitialize)(this.startStopButton)).EndInit(); 644 | ((System.ComponentModel.ISupportInitialize)(this.picVulture)).EndInit(); 645 | ((System.ComponentModel.ISupportInitialize)(this.numRefreshMinutes)).EndInit(); 646 | ((System.ComponentModel.ISupportInitialize)(this.tipLimitInfo)).EndInit(); 647 | ((System.ComponentModel.ISupportInitialize)(this.tipRefreshBrowser)).EndInit(); 648 | ((System.ComponentModel.ISupportInitialize)(this.tipQuality)).EndInit(); 649 | ((System.ComponentModel.ISupportInitialize)(this.btnWithLoggedIn)).EndInit(); 650 | ((System.ComponentModel.ISupportInitialize)(this.picLiveViewer)).EndInit(); 651 | ((System.ComponentModel.ISupportInitialize)(this.picBotViewer)).EndInit(); 652 | ((System.ComponentModel.ISupportInitialize)(this.tipLiveViewer)).EndInit(); 653 | ((System.ComponentModel.ISupportInitialize)(this.picWebshare)).EndInit(); 654 | this.ResumeLayout(false); 655 | this.PerformLayout(); 656 | 657 | } 658 | 659 | #endregion 660 | 661 | private System.Windows.Forms.PictureBox startStopButton; 662 | private System.Windows.Forms.TextBox txtStreamUrl; 663 | private System.Windows.Forms.Label lblStreamUrl; 664 | private System.Windows.Forms.Label lblLog; 665 | private System.Windows.Forms.CheckBox checkHeadless; 666 | private System.Windows.Forms.OpenFileDialog openFileDialog1; 667 | private System.Windows.Forms.Button browseProxyList; 668 | private System.Windows.Forms.TextBox txtProxyList; 669 | private System.Windows.Forms.TextBox logScreen; 670 | private System.Windows.Forms.Label lblBrowserLimit; 671 | private System.Windows.Forms.TextBox txtBrowserLimit; 672 | private System.Windows.Forms.PictureBox picVulture; 673 | private System.Windows.Forms.NumericUpDown numRefreshMinutes; 674 | private System.Windows.Forms.Label lblRefreshMin; 675 | private System.Windows.Forms.PictureBox tipLimitInfo; 676 | private System.Windows.Forms.ToolTip toolTip; 677 | private System.Windows.Forms.PictureBox tipRefreshBrowser; 678 | private System.Windows.Forms.LinkLabel lblProxyList; 679 | private System.Windows.Forms.Label lblRefreshMin2; 680 | private System.Windows.Forms.Label lblRefreshMin3; 681 | private System.Windows.Forms.Label lblQuality; 682 | private System.Windows.Forms.ComboBox lstQuality; 683 | private System.Windows.Forms.PictureBox tipQuality; 684 | private System.Windows.Forms.TextBox txtLoginInfos; 685 | private System.Windows.Forms.PictureBox btnWithLoggedIn; 686 | private System.Windows.Forms.Label lblLoginInfoTitle; 687 | private System.Windows.Forms.Label lblHeadless; 688 | private System.Windows.Forms.PictureBox picLiveViewer; 689 | private System.Windows.Forms.Label lblViewer; 690 | private System.Windows.Forms.PictureBox picBotViewer; 691 | private System.Windows.Forms.Label lblLiveViewer; 692 | private System.Windows.Forms.PictureBox tipLiveViewer; 693 | private System.Windows.Forms.Label lnlResourceSaving; 694 | private System.Windows.Forms.CheckBox checkLowCpuRam; 695 | private System.Windows.Forms.Label lblNeedCloudServer; 696 | private System.Windows.Forms.PictureBox picWebshare; 697 | private System.Windows.Forms.Label label1; 698 | private System.Windows.Forms.Label label2; 699 | private System.Windows.Forms.ComboBox lstserviceType; 700 | private System.Windows.Forms.Button browseChatMessages; 701 | private System.Windows.Forms.Label lblChatMessages; 702 | private System.Windows.Forms.TextBox txtChatMessages; 703 | private System.Windows.Forms.Label label3; 704 | private System.Windows.Forms.Label label4; 705 | private System.Windows.Forms.Label label5; 706 | private System.Windows.Forms.Label label6; 707 | private System.Windows.Forms.Button browseUserAgentList; 708 | private System.Windows.Forms.TextBox txtUserAgentList; 709 | private System.Windows.Forms.Label lblUserAgentList; 710 | } 711 | } 712 | 713 | -------------------------------------------------------------------------------- /StreamViewerBot/MainScreen.cs: -------------------------------------------------------------------------------- 1 | using System; 2 | using System.Collections.Concurrent; 3 | using System.Collections.Generic; 4 | using System.Configuration; 5 | using System.Diagnostics; 6 | using System.Drawing; 7 | using System.IO; 8 | using System.Linq; 9 | using System.Net; 10 | using System.Threading; 11 | using System.Threading.Tasks; 12 | using System.Windows.Forms; 13 | using BotCore; 14 | using BotCore.Dto; 15 | using BotCore.Log; 16 | using Serilog; 17 | using StreamViewerBot.Properties; 18 | using StreamViewerBot.UI; 19 | 20 | namespace StreamViewerBot 21 | { 22 | public partial class MainScreen : Form 23 | { 24 | private static readonly string _productVersion = "2.9.2.2"; 25 | 26 | private static string _proxyListDirectory = ""; 27 | 28 | private static string _userAgentListDirectory = ""; 29 | 30 | private static string _chatMessagesDirectory = ""; 31 | 32 | private static string _ipCheckURL = "https://api.ipify.org/"; 33 | 34 | private static bool _headless; 35 | 36 | private readonly Configuration _configuration = 37 | ConfigurationManager.OpenExeConfiguration(ConfigurationUserLevel.None); 38 | 39 | private readonly Core _core = new Core(); 40 | 41 | private readonly Dictionary _dataSourceQuality = new Dictionary(); 42 | 43 | private string _quality = string.Empty; 44 | 45 | private readonly ConcurrentQueue _lstLoginInfo = new ConcurrentQueue(); 46 | 47 | private readonly Dictionary _serviceTypes = 48 | new Dictionary(); 49 | 50 | private StreamService.Service _serviceType; 51 | 52 | private bool _canStart; 53 | 54 | private Size _loginSize; 55 | 56 | private List _nonPrivateProxies = new List(); 57 | 58 | private List _userAgentStrings = new List(); 59 | 60 | private List _chatMessages = new List(); 61 | 62 | private CancellationTokenSource _tokenSource = new CancellationTokenSource(); 63 | 64 | private ValidatingForm _validatingForm = new ValidatingForm(); 65 | 66 | private bool _withLoggedIn; 67 | 68 | public MainScreen() 69 | { 70 | InitializeComponent(); 71 | 72 | var appId = _configuration.AppSettings.Settings["appId"].Value; 73 | 74 | if (string.IsNullOrEmpty(appId)) 75 | { 76 | _configuration.AppSettings.Settings["appId"].Value = Guid.NewGuid().ToString(); 77 | _configuration.Save(ConfigurationSaveMode.Modified); 78 | } 79 | 80 | Logger.CreateLogger(appId); 81 | 82 | Text += " v" + _productVersion; 83 | 84 | LogInfo(new Exception($"Application started. v{_productVersion}")); 85 | 86 | var isAvailable = IsNewerVersionAvailable(); 87 | 88 | if (isAvailable) 89 | { 90 | var isForcedUpdate = IsForcedUpdate(); 91 | 92 | if(isForcedUpdate) 93 | UpdateBot(true); 94 | 95 | ShowChangelog(); 96 | UpdateBot(); 97 | } 98 | 99 | 100 | #region StreamQuality 101 | 102 | FillComboBoxes(); 103 | 104 | void FillComboBoxes() 105 | { 106 | _dataSourceQuality.Add("Source", string.Empty); 107 | _dataSourceQuality.Add("480p", "{\"default\":\"480p30\"}"); 108 | _dataSourceQuality.Add("360p", "{\"default\":\"360p30\"}"); 109 | _dataSourceQuality.Add("160p", "{\"default\":\"160p30\"}"); 110 | 111 | lstQuality.ValueMember = "Value"; 112 | lstQuality.DisplayMember = "Key"; 113 | lstQuality.DataSource = new BindingSource(_dataSourceQuality, null); 114 | lstQuality.SelectedIndex = _dataSourceQuality.Count - 1; 115 | 116 | _serviceTypes.Add("Twitch", StreamService.Service.Twitch); 117 | _serviceTypes.Add("YouTube", StreamService.Service.Youtube); 118 | _serviceTypes.Add("DLive", StreamService.Service.DLive); 119 | _serviceTypes.Add("Nimo Tv", StreamService.Service.NimoTv); 120 | _serviceTypes.Add("Twitter", StreamService.Service.Twitter); 121 | _serviceTypes.Add("Facebook", StreamService.Service.Facebook); 122 | _serviceTypes.Add("Trovo.live", StreamService.Service.TrovoLive); 123 | _serviceTypes.Add("Bigo Live", StreamService.Service.BigoLive); 124 | 125 | lstserviceType.ValueMember = "Value"; 126 | lstserviceType.DisplayMember = "Key"; 127 | lstserviceType.DataSource = new BindingSource(_serviceTypes, null); 128 | lstserviceType.SelectedIndex = 0; 129 | } 130 | 131 | #endregion 132 | } 133 | 134 | public sealed override Size MinimumSize 135 | { 136 | get => base.MinimumSize; 137 | set => base.MinimumSize = value; 138 | } 139 | 140 | public sealed override Size MaximumSize 141 | { 142 | get => base.MaximumSize; 143 | set => base.MaximumSize = value; 144 | } 145 | 146 | private void ShowChangelog() 147 | { 148 | try 149 | { 150 | var webRequest = WebRequest.Create(@"https://streamviewerbot.com/Download/changelog.txt"); 151 | webRequest.Headers.Add("Accept: text/html, application/xhtml+xml, */*"); 152 | webRequest.Headers.Add( 153 | "User-Agent: Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; WOW64; Trident/5.0)"); 154 | webRequest.Timeout = 5000; 155 | using var response = webRequest.GetResponse(); 156 | using var content = response.GetResponseStream(); 157 | if (content != null) 158 | { 159 | using var reader = new StreamReader(content); 160 | var changeLog = reader.ReadToEnd(); 161 | 162 | var changeLogViewer = new Changelog(); 163 | changeLogViewer.SetChangelog(changeLog); 164 | changeLogViewer.ShowDialog(); 165 | } 166 | } 167 | catch (Exception) 168 | { 169 | //ignored 170 | } 171 | } 172 | 173 | private bool IsNewerVersionAvailable() 174 | { 175 | try 176 | { 177 | var webRequest = WebRequest.Create(@"https://streamviewerbot.com/Download/latestVersion.txt"); 178 | webRequest.Headers.Add("Accept: text/html, application/xhtml+xml, */*"); 179 | webRequest.Headers.Add( 180 | "User-Agent: Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; WOW64; Trident/5.0)"); 181 | webRequest.Timeout = 5000; 182 | using var response = webRequest.GetResponse(); 183 | using var content = response.GetResponseStream(); 184 | if (content != null) 185 | { 186 | using var reader = new StreamReader(content); 187 | var latestVersion = reader.ReadToEnd(); 188 | 189 | return latestVersion != _productVersion; 190 | } 191 | } 192 | catch (Exception) 193 | { 194 | return false; 195 | } 196 | 197 | return false; 198 | } 199 | 200 | private bool IsForcedUpdate() 201 | { 202 | try 203 | { 204 | var webRequest = WebRequest.Create(@"https://streamviewerbot.com/Download/isForcedUpdate.txt"); 205 | webRequest.Headers.Add("Accept: text/html, application/xhtml+xml, */*"); 206 | webRequest.Headers.Add( 207 | "User-Agent: Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; WOW64; Trident/5.0)"); 208 | webRequest.Timeout = 5000; 209 | using var response = webRequest.GetResponse(); 210 | using var content = response.GetResponseStream(); 211 | if (content != null) 212 | { 213 | using var reader = new StreamReader(content); 214 | var value = Convert.ToBoolean(reader.ReadToEnd()); 215 | 216 | return value; 217 | } 218 | } 219 | catch (Exception) 220 | { 221 | return false; 222 | } 223 | 224 | return false; 225 | } 226 | 227 | private void CheckProxiesArePrivateOrNot() 228 | { 229 | _nonPrivateProxies = new List(); 230 | 231 | try 232 | { 233 | var proxies = File.ReadAllLines(_proxyListDirectory); 234 | 235 | var error = ExecuteProxyTest(proxies); 236 | 237 | if (!error) LogToScreen("Proxies are working OK!"); 238 | } 239 | catch (Exception exception) 240 | { 241 | try 242 | { 243 | Log.Logger.Error(exception.ToString()); 244 | } 245 | catch (Exception) 246 | { 247 | //ignored 248 | } 249 | } 250 | } 251 | 252 | private bool CheckUserAgentStrings() 253 | { 254 | _userAgentStrings = new List(); 255 | 256 | if (File.Exists(_userAgentListDirectory)) 257 | { 258 | try 259 | { 260 | _userAgentStrings = File.ReadAllLines(_userAgentListDirectory).ToList(); 261 | _ = _userAgentStrings.RemoveAll(userAgentString => string.IsNullOrWhiteSpace(userAgentString)); 262 | 263 | return true; 264 | } 265 | catch (Exception exception) 266 | { 267 | MessageBox.Show("Please make sure that your user agent strings are valid. Each user agent string must be placed on a new line."); 268 | try 269 | { 270 | Log.Logger.Error(exception.ToString()); 271 | } 272 | catch (Exception) 273 | { 274 | //ignored 275 | } 276 | return false; 277 | } 278 | } 279 | 280 | return true; 281 | } 282 | 283 | private bool CheckChatMessages() 284 | { 285 | _chatMessages = new List(); 286 | 287 | if (File.Exists(_chatMessagesDirectory)) 288 | { 289 | try 290 | { 291 | var messages = File.ReadAllText(_chatMessagesDirectory); 292 | 293 | _chatMessages = messages.Split(';').ToList(); 294 | 295 | return true; 296 | } 297 | catch (Exception exception) 298 | { 299 | MessageBox.Show("Please make sure that your messages are valid. Split all messages with ;\r\nFor example=> Hello;Hi everyone;It's awesome;Cool!;Great to see you..."); 300 | try 301 | { 302 | Log.Logger.Error(exception.ToString()); 303 | } 304 | catch (Exception) 305 | { 306 | //ignored 307 | } 308 | return false; 309 | } 310 | } 311 | 312 | return true; 313 | } 314 | 315 | private void Retest(string[] proxies) 316 | { 317 | var error = ExecuteProxyTest(proxies); 318 | 319 | if (!error) LogToScreen("Proxies are working OK!"); 320 | } 321 | 322 | private string GetIPAddress() 323 | { 324 | var address = ""; 325 | var request = WebRequest.Create(_ipCheckURL); 326 | request.Headers.Add("Accept: text/html, application/xhtml+xml, */*"); 327 | request.Headers.Add( 328 | "User-Agent: Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; WOW64; Trident/5.0)"); 329 | request.Timeout = 5000; 330 | using (var response = request.GetResponse()) 331 | using (var stream = new StreamReader(response.GetResponseStream()!)) 332 | { 333 | address = stream.ReadToEnd(); 334 | } 335 | 336 | request.Abort(); 337 | return address; 338 | } 339 | 340 | public bool ExecuteProxyTest(string[] proxies) 341 | { 342 | var error = false; 343 | _nonPrivateProxies.Clear(); 344 | 345 | if (_validatingForm.IsDisposed) 346 | _validatingForm = new ValidatingForm(); 347 | 348 | if (_validatingForm.InvokeRequired) 349 | _validatingForm.BeginInvoke(new Action(() => { _validatingForm.Show(); })); 350 | else 351 | _validatingForm.Show(); 352 | 353 | if (_validatingForm.ProgressBar.InvokeRequired) 354 | { 355 | lstQuality.BeginInvoke(new Action(() => 356 | { 357 | _validatingForm.ProgressBar.Value = 0; 358 | _validatingForm.ProgressBar.Maximum = proxies.Length; 359 | })); 360 | } 361 | else 362 | { 363 | _validatingForm.ProgressBar.Value = 0; 364 | _validatingForm.ProgressBar.Maximum = proxies.Length; 365 | } 366 | 367 | foreach (var line in proxies) 368 | { 369 | if (_validatingForm.ProgressBar.InvokeRequired) 370 | lstQuality.BeginInvoke(new Action(() => { _validatingForm.ProgressBar.Value++; })); 371 | else 372 | _validatingForm.ProgressBar.Value++; 373 | 374 | try 375 | { 376 | var webRequest = WebRequest.Create(_ipCheckURL); 377 | webRequest.Headers.Add("Accept: text/html, application/xhtml+xml, */*"); 378 | webRequest.Headers.Add( 379 | "User-Agent: Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; WOW64; Trident/5.0)"); 380 | 381 | var lineArr = line.Split(':'); 382 | 383 | if (lineArr.Length != 4) 384 | { 385 | MessageBox.Show(new Form { TopMost = true }, 386 | "Proxy format must be in this format;\r\nIPADDRESS:PORT:USERNAME:PASSWORD\r\nFix and try again."); 387 | error = true; 388 | break; 389 | } 390 | 391 | IWebProxy proxy = new WebProxy(lineArr[0], Convert.ToInt32(lineArr[1])); 392 | var proxyUsername = lineArr[2]; 393 | var proxyPassword = lineArr[3]; 394 | proxy.Credentials = new NetworkCredential(proxyUsername, proxyPassword); 395 | webRequest.Proxy = proxy; 396 | 397 | webRequest.Timeout = 5000; 398 | using var response = webRequest.GetResponse(); 399 | using var content = response.GetResponseStream(); 400 | if (content != null) 401 | { 402 | using var reader = new StreamReader(content); 403 | var requestAddress = reader.ReadToEnd(); 404 | var address = GetIPAddress(); 405 | 406 | if (string.IsNullOrEmpty(requestAddress) || string.IsNullOrEmpty(address)) 407 | { 408 | _nonPrivateProxies.Add(line); 409 | continue; 410 | } 411 | 412 | if (address == requestAddress) _nonPrivateProxies.Add(line); 413 | } 414 | 415 | webRequest.Abort(); 416 | } 417 | catch (Exception) 418 | { 419 | _nonPrivateProxies.Add(line); 420 | } 421 | } 422 | 423 | if (_validatingForm.InvokeRequired) 424 | _validatingForm.BeginInvoke(new Action(() => { _validatingForm.Close(); })); 425 | else 426 | _validatingForm.Close(); 427 | 428 | if (_nonPrivateProxies.Count > 0) 429 | { 430 | var uiThread = new Thread(() => 431 | { 432 | var proxyDisplayer = new ProxyDisplayer(_nonPrivateProxies); 433 | proxyDisplayer.Retest += Retest; 434 | Application.Run(proxyDisplayer); 435 | }); 436 | uiThread.SetApartmentState(ApartmentState.STA); 437 | uiThread.Start(); 438 | error = true; 439 | } 440 | 441 | return error; 442 | } 443 | 444 | private void LogToScreen(string log) 445 | { 446 | if (logScreen.InvokeRequired) 447 | { 448 | logScreen.BeginInvoke(new Action(() => 449 | { 450 | logScreen.Text += DateTime.Now.ToString("dd/MM/yyyy HH:mm:ss | ") + log + Environment.NewLine; 451 | logScreen.SelectionStart = logScreen.TextLength; 452 | logScreen.ScrollToCaret(); 453 | })); 454 | } 455 | else 456 | { 457 | logScreen.Text += DateTime.Now.ToString("dd/MM/yyyy HH:mm:ss | ") + log + Environment.NewLine; 458 | logScreen.SelectionStart = logScreen.TextLength; 459 | logScreen.ScrollToCaret(); 460 | } 461 | } 462 | 463 | private void UpdateBot(bool isForcedUpdate = false) 464 | { 465 | if (isForcedUpdate) 466 | { 467 | ExecuteUpdate(); 468 | return; 469 | } 470 | 471 | var dialogResult = MessageBox.Show(GetFromResource("MainScreen_UpdateBot_Do_you_want_to_update_"), 472 | GetFromResource("MainScreen_UpdateBot_Newer_version_is_available_"), MessageBoxButtons.YesNo); 473 | 474 | if (dialogResult == DialogResult.Yes) 475 | { 476 | ExecuteUpdate(); 477 | } 478 | 479 | void ExecuteUpdate() 480 | { 481 | var args = "https://streamviewerbot.com/Download/win-x64.zip" + "*" + 482 | AppDomain.CurrentDomain.BaseDirectory.Replace(' ', '?') + "*" + 483 | Path.Combine(AppDomain.CurrentDomain.BaseDirectory.Replace(' ', '?'), "StreamViewerBot.exe"); 484 | try 485 | { 486 | Directory.Delete(Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "AutoUpdaterOld"), true); 487 | } 488 | catch (Exception) 489 | { 490 | //ignored 491 | } 492 | 493 | try 494 | { 495 | var tempUpdaterPath = Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "AutoUpdaterTemp"); 496 | var updaterPath = Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "AutoUpdater"); 497 | Directory.CreateDirectory(tempUpdaterPath); 498 | foreach (var file in Directory.GetFiles(updaterPath)) 499 | { 500 | var destFile = Path.Combine(tempUpdaterPath, Path.GetFileName(file)); 501 | File.Move(file, destFile, true); 502 | } 503 | 504 | var filename = Path.Combine(tempUpdaterPath, "AutoUpdater.exe"); 505 | Process.Start(filename, args); 506 | Environment.Exit(0); 507 | } 508 | catch (Exception) 509 | { 510 | MessageBox.Show(GetFromResource("MainScreen_UpdateBot_Sorry__updater_failed_")); 511 | } 512 | } 513 | } 514 | 515 | private string GetFromResource(string key) 516 | { 517 | return Resources.ResourceManager.GetString(key); 518 | } 519 | 520 | private void LoadFromAppSettings() 521 | { 522 | LogInfo(new Exception("Reading configuration.")); 523 | _proxyListDirectory = txtProxyList.Text = _configuration.AppSettings.Settings["proxyListDirectory"].Value; 524 | _userAgentListDirectory = txtUserAgentList.Text = _configuration.AppSettings.Settings["userAgentListDirectory"].Value; 525 | _chatMessagesDirectory = txtChatMessages.Text = _configuration.AppSettings.Settings["chatMessageDirectory"].Value; 526 | txtStreamUrl.Text = _configuration.AppSettings.Settings["streamUrl"].Value; 527 | _headless = checkHeadless.Checked = 528 | Convert.ToBoolean(_configuration.AppSettings.Settings["headless"].Value); 529 | numRefreshMinutes.Value = Convert.ToInt32(_configuration.AppSettings.Settings["refreshInterval"].Value); 530 | _withLoggedIn = Convert.ToBoolean(_configuration.AppSettings.Settings["withLoggedIn"].Value); 531 | txtLoginInfos.Text = _configuration.AppSettings.Settings["loginInfos"].Value; 532 | checkLowCpuRam.Checked = Convert.ToBoolean(_configuration.AppSettings.Settings["uselowcpuram"].Value); 533 | 534 | ShowLoggedInPart(_withLoggedIn); 535 | } 536 | 537 | private void ShowLoggedInPart(bool visibility) 538 | { 539 | ClientSize = visibility 540 | ? _loginSize 541 | : new Size(_loginSize.Width - txtLoginInfos.Width - tipLiveViewer.Width / 2, _loginSize.Height); 542 | } 543 | 544 | private void startStopButton_Click(object sender, EventArgs e) 545 | { 546 | if (string.IsNullOrEmpty(txtProxyList.Text) || string.IsNullOrEmpty(txtStreamUrl.Text)) 547 | { 548 | LogInfo(new Exception("Please choose a proxy directory and enter your stream URL.")); 549 | return; 550 | } 551 | 552 | if (!CheckUserAgentStrings()) 553 | { 554 | LogInfo(new Exception("Please correct your user agent string file.")); 555 | return; 556 | } 557 | 558 | _lstLoginInfo.Clear(); 559 | 560 | if (_withLoggedIn) 561 | { 562 | foreach (var line in txtLoginInfos.Text.Split("\r\n")) 563 | { 564 | var parts = line.Split(' '); 565 | 566 | if (parts.Length != 2) 567 | { 568 | LogInfo(new Exception("Please correct the format of your login credentials")); 569 | 570 | return; 571 | } 572 | 573 | _lstLoginInfo.Enqueue(new LoginDto { Username = parts[0], Password = parts[1] }); 574 | } 575 | 576 | if (!CheckChatMessages()) 577 | return; 578 | } 579 | 580 | _serviceType = StreamService.Service.Twitch; 581 | 582 | if (lstserviceType.InvokeRequired) 583 | { 584 | lstserviceType.BeginInvoke(new Action(() => 585 | { 586 | _serviceType = (StreamService.Service)lstserviceType.SelectedValue; 587 | })); 588 | } 589 | else 590 | { 591 | _serviceType = (StreamService.Service)lstserviceType.SelectedValue; 592 | } 593 | 594 | if (lstQuality.InvokeRequired) 595 | lstQuality.BeginInvoke(new Action(() => { _quality = lstQuality.SelectedValue.ToString(); })); 596 | else 597 | _quality = lstQuality.SelectedValue.ToString(); 598 | 599 | _canStart = !_canStart; 600 | 601 | if (_canStart) 602 | { 603 | startStopButton.BackgroundImage = 604 | Image.FromFile(AppDomain.CurrentDomain.BaseDirectory + "\\Images\\button_stop.png"); 605 | LogInfo(new Exception("Initializing bot.")); 606 | _core.CanRun = true; 607 | _tokenSource = new CancellationTokenSource(); 608 | 609 | Task.Run(() => { RunIt(null); }, _tokenSource.Token); 610 | 611 | ConfigurationManager.RefreshSection("appSettings"); 612 | } 613 | else 614 | { 615 | startStopButton.BackgroundImage = 616 | Image.FromFile(AppDomain.CurrentDomain.BaseDirectory + "\\Images\\button_stopping.png"); 617 | startStopButton.Enabled = false; 618 | LogInfo(new Exception("Terminating bot, please wait.")); 619 | 620 | _tokenSource.Cancel(); 621 | _core.CanRun = false; 622 | 623 | try 624 | { 625 | _core.Stop(); 626 | } 627 | catch (Exception) 628 | { 629 | LogInfo(new Exception("Termination error. (Ignored)")); 630 | } 631 | 632 | _core.InitializationError -= ErrorOccurred; 633 | 634 | _core.LogMessage -= LogMessage; 635 | 636 | _core.DidItsJob -= DidItsJob; 637 | 638 | _core.IncreaseViewer -= IncreaseViewer; 639 | 640 | _core.DecreaseViewer -= DecreaseViewer; 641 | 642 | startStopButton.BackgroundImage = 643 | Image.FromFile(AppDomain.CurrentDomain.BaseDirectory + "\\Images\\button_start.png"); 644 | startStopButton.Enabled = true; 645 | } 646 | } 647 | 648 | private void RunIt(object obj) 649 | { 650 | LogInfo(new Exception("Saving the configuration.")); 651 | 652 | _configuration.AppSettings.Settings["streamUrl"].Value = txtStreamUrl.Text; 653 | _configuration.AppSettings.Settings["headless"].Value = checkHeadless.Checked.ToString(); 654 | _configuration.AppSettings.Settings["proxyListDirectory"].Value = txtProxyList.Text; 655 | _configuration.AppSettings.Settings["userAgentListDirectory"].Value = txtUserAgentList.Text; 656 | _configuration.AppSettings.Settings["chatMessageDirectory"].Value = txtChatMessages.Text; 657 | _configuration.AppSettings.Settings["refreshInterval"].Value = numRefreshMinutes.Value.ToString(); 658 | _configuration.AppSettings.Settings["withLoggedIn"].Value = _withLoggedIn.ToString(); 659 | _configuration.AppSettings.Settings["loginInfos"].Value = txtLoginInfos.Text; 660 | _configuration.AppSettings.Settings["uselowcpuram"].Value = checkLowCpuRam.Checked.ToString(); 661 | 662 | _configuration.Save(ConfigurationSaveMode.Modified); 663 | 664 | LogInfo(new Exception("Bot is starting.")); 665 | 666 | int.TryParse(txtBrowserLimit.Text, out var browserLimit); 667 | 668 | _headless = checkHeadless.Checked; 669 | 670 | _core.AllBrowsersTerminated += AllBrowsersTerminated; 671 | 672 | _core.InitializationError += ErrorOccurred; 673 | 674 | _core.LogMessage += LogMessage; 675 | 676 | _core.DidItsJob += DidItsJob; 677 | 678 | _core.IncreaseViewer += IncreaseViewer; 679 | 680 | _core.DecreaseViewer += DecreaseViewer; 681 | 682 | _core.LiveViewer += SetLiveViewer; 683 | 684 | var needs = new ExecuteNeedsDto() 685 | { 686 | Headless = _headless, 687 | Service = _serviceType, 688 | Stream = txtStreamUrl.Text, 689 | BrowserLimit = browserLimit, 690 | ChatMessages = _chatMessages, 691 | LoginInfos = _lstLoginInfo, 692 | PreferredQuality = _quality, 693 | RefreshInterval = Convert.ToInt32(numRefreshMinutes.Value), 694 | ProxyListDirectory = _proxyListDirectory, 695 | UserAgentStrings = _userAgentStrings, 696 | UseLowCpuRam = false //TEMPORARY DISABLED => checkLowCpuRam.Checked 697 | }; 698 | _core.Start(needs); 699 | } 700 | 701 | 702 | private void SetBotViewer(string count) 703 | { 704 | if (lblViewer.InvokeRequired) 705 | lblViewer.BeginInvoke(new Action(() => { lblViewer.Text = count; })); 706 | else 707 | lblViewer.Text = count; 708 | } 709 | 710 | private void SetLiveViewer(string count) 711 | { 712 | if (lblLiveViewer.InvokeRequired) 713 | lblLiveViewer.BeginInvoke(new Action(() => { lblLiveViewer.Text = count; })); 714 | else 715 | lblLiveViewer.Text = count; 716 | } 717 | 718 | private void DecreaseViewer() 719 | { 720 | if (lblViewer.InvokeRequired) 721 | lblViewer.BeginInvoke(new Action(() => 722 | { 723 | lblViewer.Text = (Convert.ToInt32(lblViewer.Text) - 1).ToString(); 724 | })); 725 | else 726 | lblViewer.Text = (Convert.ToInt32(lblViewer.Text) - 1).ToString(); 727 | } 728 | 729 | private void IncreaseViewer() 730 | { 731 | if (lblViewer.InvokeRequired) 732 | lblViewer.BeginInvoke(new Action(() => 733 | { 734 | lblViewer.Text = (Convert.ToInt32(lblViewer.Text) + 1).ToString(); 735 | })); 736 | else 737 | lblViewer.Text = (Convert.ToInt32(lblViewer.Text) + 1).ToString(); 738 | } 739 | 740 | private void ErrorOccurred(Exception exception) 741 | { 742 | LogError(exception); 743 | } 744 | 745 | private void LogMessage(Exception exception) 746 | { 747 | LogInfo(exception); 748 | } 749 | 750 | private void AllBrowsersTerminated() 751 | { 752 | startStopButton.BackgroundImage = 753 | Image.FromFile(AppDomain.CurrentDomain.BaseDirectory + "\\Images\\button_stop.png"); 754 | 755 | SetBotViewer("0"); 756 | SetLiveViewer("0"); 757 | 758 | LogInfo(new Exception("Bot terminated.")); 759 | 760 | _core.AllBrowsersTerminated -= AllBrowsersTerminated; 761 | } 762 | 763 | private void DidItsJob() 764 | { 765 | LogInfo(new Exception("Bot did it's job, wait at least 3-5 minutes to see on the stream platform.")); 766 | } 767 | 768 | private void LogInfo(Exception exception) 769 | { 770 | try 771 | { 772 | Log.Logger.Information(exception.Message); 773 | } 774 | catch (Exception) 775 | { 776 | //ignored 777 | } 778 | 779 | if (logScreen.InvokeRequired) 780 | { 781 | logScreen.BeginInvoke(new Action(() => 782 | { 783 | logScreen.Text += DateTime.Now.ToString("dd/MM/yyyy HH:mm:ss | ") + exception.Message + 784 | Environment.NewLine; 785 | logScreen.SelectionStart = logScreen.TextLength; 786 | logScreen.ScrollToCaret(); 787 | })); 788 | } 789 | else 790 | { 791 | logScreen.Text += DateTime.Now.ToString("dd/MM/yyyy HH:mm:ss | ") + exception.Message + 792 | Environment.NewLine; 793 | logScreen.SelectionStart = logScreen.TextLength; 794 | logScreen.ScrollToCaret(); 795 | } 796 | } 797 | 798 | private void LogError(Exception exception) 799 | { 800 | try 801 | { 802 | if (exception.Message.Contains("Timeout") && exception.Message.Contains("exceeded") || exception.Message.Contains("ERR_TIMED_OUT")) 803 | { 804 | exception = new Exception( 805 | "Load Timeout: Low system resources may cause this. Close unused applications."); 806 | } 807 | 808 | Log.Logger.Error(exception.ToString()); 809 | } 810 | catch (Exception) 811 | { 812 | //ignored 813 | } 814 | 815 | if (logScreen.InvokeRequired) 816 | { 817 | logScreen.BeginInvoke(new Action(() => 818 | { 819 | logScreen.Text += DateTime.Now.ToString("dd/MM/yyyy HH:mm:ss | ") + exception.Message + 820 | Environment.NewLine; 821 | logScreen.SelectionStart = logScreen.TextLength; 822 | logScreen.ScrollToCaret(); 823 | })); 824 | } 825 | else 826 | { 827 | logScreen.Text += DateTime.Now.ToString("dd/MM/yyyy HH:mm:ss | ") + exception.Message + 828 | Environment.NewLine; 829 | logScreen.SelectionStart = logScreen.TextLength; 830 | logScreen.ScrollToCaret(); 831 | } 832 | } 833 | 834 | private void browseProxyList_Click(object sender, EventArgs e) 835 | { 836 | MessageBox.Show("You have to use private proxies, free proxies will not work!"); 837 | 838 | var fileDialog = new OpenFileDialog(); 839 | 840 | fileDialog.Filter = "txt files (*.txt)|*.txt"; 841 | fileDialog.FilterIndex = 1; 842 | fileDialog.Multiselect = false; 843 | 844 | if (fileDialog.ShowDialog() == DialogResult.OK) 845 | { 846 | _proxyListDirectory = txtProxyList.Text = fileDialog.FileName; 847 | 848 | _validatingForm = new ValidatingForm(); 849 | _validatingForm.Show(); 850 | _validatingForm.Location = new Point(Location.X + Width / 2 - _validatingForm.Width / 2, 851 | Location.Y + Height / 2 - _validatingForm.Height / 2); 852 | 853 | _ = Task.Run(CheckProxiesArePrivateOrNot); 854 | } 855 | } 856 | 857 | private void browseUserAgentList_Click(object sender, EventArgs e) 858 | { 859 | MessageBox.Show("User-Agent list allows you to specify user agents for bots. You can provide a .txt file with user-agent strings on each line.\r\n\r\nThis feature is optional. If you do not provide a file, all bots will use the default user agent string of Chrome browser."); 860 | 861 | var fileDialog = new OpenFileDialog(); 862 | 863 | fileDialog.Filter = "txt files (*.txt)|*.txt"; 864 | fileDialog.FilterIndex = 1; 865 | fileDialog.Multiselect = false; 866 | 867 | if (fileDialog.ShowDialog() == DialogResult.OK) 868 | { 869 | _userAgentListDirectory = txtUserAgentList.Text = fileDialog.FileName; 870 | 871 | _ = Task.Run(CheckUserAgentStrings); 872 | } 873 | } 874 | 875 | private void chatMessagesList_Click(object sender, EventArgs e) 876 | { 877 | MessageBox.Show("Only Twitch, NimoTV and Trovo Live supported for now!\r\n\r\nCreate a .txt file with ; separated messages.\r\nBot will consume your messages and won't send a sent message again, so make your list as long as possible.\r\n\r\nPlease don't forget to disable Followers-only mode and Subscriber-only chat on Twitch Moderation Settings", "Warning"); 878 | var fileDialog = new OpenFileDialog(); 879 | 880 | fileDialog.Filter = "txt files (*.txt)|*.txt"; 881 | fileDialog.FilterIndex = 1; 882 | fileDialog.Multiselect = false; 883 | 884 | if (fileDialog.ShowDialog() == DialogResult.OK) 885 | { 886 | _chatMessagesDirectory = txtChatMessages.Text = fileDialog.FileName; 887 | 888 | _ = Task.Run(CheckChatMessages); 889 | } 890 | } 891 | 892 | private void MainScreen_FormClosing(object sender, FormClosingEventArgs e) 893 | { 894 | try 895 | { 896 | if (!_canStart) 897 | _core.Stop(); 898 | } 899 | catch (Exception) 900 | { 901 | LogInfo(new Exception("Termination error. (Ignored)")); 902 | } 903 | 904 | Application.Exit(); 905 | } 906 | 907 | private void pictureBox2_Click(object sender, EventArgs e) 908 | { 909 | try 910 | { 911 | var strCmdLine = "/C explorer \"https://www.vultr.com/?ref=8827163\""; 912 | var browserProcess = Process.Start("CMD.exe", strCmdLine); 913 | browserProcess?.Close(); 914 | } 915 | catch (Exception) 916 | { 917 | //ignored 918 | } 919 | } 920 | 921 | private void picLimitInfo_MouseHover(object sender, EventArgs e) 922 | { 923 | toolTip.SetToolTip(tipLimitInfo, 924 | "Feature disabled temporarily."); //"Rotates proxies with limited quantity of browser. Old ones dies, new ones born. 0 means, no limit."); 925 | } 926 | 927 | private void lblProxyList_LinkClicked(object sender, LinkLabelLinkClickedEventArgs e) 928 | { 929 | try 930 | { 931 | var strCmdLine = 932 | "/C explorer \"https://github.com/gorkemhacioglu/Stream-Viewer-Bot/wiki/Configuration#:~:text=Your%20proxy%20list.%20You%20have%20to%20buy%20private%20proxies."; 933 | var browserProcess = Process.Start("CMD.exe", strCmdLine); 934 | browserProcess?.Close(); 935 | } 936 | catch (Exception) 937 | { 938 | //ignored 939 | } 940 | } 941 | 942 | private void refreshInterval_MouseHover(object sender, EventArgs e) 943 | { 944 | toolTip.SetToolTip(tipRefreshBrowser, "Refreshes browser, just in case. Example: Connection loss"); 945 | } 946 | 947 | private void txtBrowserLimit_TextChanged(object sender, EventArgs e) 948 | { 949 | var value = txtBrowserLimit.Text; 950 | 951 | if (value == "0" || value == string.Empty) 952 | { 953 | lblRefreshMin.Enabled = lblRefreshMin2.Enabled = 954 | lblRefreshMin3.Enabled = numRefreshMinutes.Enabled = tipRefreshBrowser.Enabled = true; 955 | } 956 | else 957 | { 958 | lblRefreshMin.Enabled = lblRefreshMin2.Enabled = lblRefreshMin3.Enabled = 959 | numRefreshMinutes.Enabled = tipRefreshBrowser.Enabled = false; 960 | numRefreshMinutes.Value = 0; 961 | _withLoggedIn = false; 962 | ShowLoggedInPart(false); 963 | } 964 | } 965 | 966 | private void lstQuality_SelectedIndexChanged(object sender, EventArgs e) 967 | { 968 | if (lstQuality.InvokeRequired) 969 | lstQuality.BeginInvoke(new Action(() => 970 | { 971 | _core.PreferredQuality = lstQuality.SelectedValue.ToString(); 972 | })); 973 | else 974 | _core.PreferredQuality = lstQuality.SelectedValue.ToString(); 975 | } 976 | 977 | private void streamQuality_MouseHover(object sender, EventArgs e) 978 | { 979 | toolTip.SetToolTip(tipQuality, "Stream quality."); 980 | } 981 | 982 | private void btnWithLoggedIn_Click(object sender, EventArgs e) 983 | { 984 | _withLoggedIn = !_withLoggedIn; 985 | 986 | if (_withLoggedIn) 987 | { 988 | checkLowCpuRam.Checked = false; 989 | checkLowCpuRam.Enabled = false; 990 | } 991 | else if (!checkHeadless.Checked) 992 | { 993 | checkLowCpuRam.Enabled = true; 994 | } 995 | 996 | var serviceType = StreamService.Service.Twitch; 997 | 998 | if (lstserviceType.InvokeRequired) 999 | lstserviceType.BeginInvoke(new Action(() => 1000 | { 1001 | serviceType = (StreamService.Service)lstserviceType.SelectedValue; 1002 | })); 1003 | else 1004 | serviceType = (StreamService.Service)lstserviceType.SelectedValue; 1005 | 1006 | if (serviceType == StreamService.Service.NimoTv) 1007 | MessageBox.Show( 1008 | GetFromResource("MainScreen_NimoTVTypeWithCountryCode"), "Information"); 1009 | 1010 | ShowLoggedInPart(_withLoggedIn); 1011 | } 1012 | 1013 | private void tipLiveViewer_MouseHover(object sender, EventArgs e) 1014 | { 1015 | toolTip.SetToolTip(tipLiveViewer, "Your bots will be here soon."); 1016 | } 1017 | 1018 | private void MainScreen_Shown(object sender, EventArgs e) 1019 | { 1020 | _loginSize = ClientSize; 1021 | 1022 | LoadFromAppSettings(); 1023 | } 1024 | 1025 | private void checkHeadless_CheckedChanged(object sender, EventArgs e) 1026 | { 1027 | if (checkHeadless.Checked) 1028 | { 1029 | MessageBox.Show( 1030 | GetFromResource( 1031 | "MainScreen_checkHeadless_CheckedChanged_Enable_IP_authorization_to_use_your_proxies_in_headless_mode"), 1032 | GetFromResource("MainScreen_checkHeadless_CheckedChanged_Warning"), MessageBoxButtons.OK); 1033 | 1034 | checkLowCpuRam.Checked = false; 1035 | 1036 | checkLowCpuRam.Enabled = false; 1037 | } 1038 | else if (!_withLoggedIn) 1039 | { 1040 | checkLowCpuRam.Enabled = true; 1041 | } 1042 | } 1043 | 1044 | private void picWebshare_Click(object sender, EventArgs e) 1045 | { 1046 | try 1047 | { 1048 | var strCmdLine = "/C explorer \"https://www.webshare.io/?referral_code=ceuygyx4sir2"; 1049 | var browserProcess = Process.Start("CMD.exe", strCmdLine); 1050 | browserProcess?.Close(); 1051 | } 1052 | catch (Exception) 1053 | { 1054 | //ignored 1055 | } 1056 | } 1057 | 1058 | private void picWebshare_MouseEnter(object sender, EventArgs e) 1059 | { 1060 | picWebshare.BackColor = Color.LightGray; 1061 | } 1062 | 1063 | private void picWebshare_MouseLeave(object sender, EventArgs e) 1064 | { 1065 | picWebshare.BackColor = Color.Transparent; 1066 | } 1067 | 1068 | private void picVulture_MouseEnter(object sender, EventArgs e) 1069 | { 1070 | picVulture.BackColor = Color.LightGray; 1071 | } 1072 | 1073 | private void picVulture_MouseLeave(object sender, EventArgs e) 1074 | { 1075 | picVulture.BackColor = Color.Transparent; 1076 | } 1077 | 1078 | private void lstServiceType_SelectedIndexChanged(object sender, EventArgs e) 1079 | { 1080 | btnWithLoggedIn.Visible = checkLowCpuRam.Enabled = lstQuality.Enabled = true; 1081 | 1082 | var comboBox = (ComboBox)sender; 1083 | 1084 | switch (comboBox.SelectedValue) 1085 | { 1086 | case StreamService.Service.Twitch: 1087 | _dataSourceQuality.Clear(); 1088 | _dataSourceQuality.Add("Source", string.Empty); 1089 | _dataSourceQuality.Add("480p", "{\"default\":\"480p30\"}"); 1090 | _dataSourceQuality.Add("360p", "{\"default\":\"360p30\"}"); 1091 | _dataSourceQuality.Add("160p", "{\"default\":\"160p30\"}"); 1092 | break; 1093 | case StreamService.Service.Facebook: 1094 | MessageBox.Show( 1095 | GetFromResource("MainScreen_LoginRequiredForFacebook"), "Information"); 1096 | break; 1097 | case StreamService.Service.Twitter: 1098 | if (_withLoggedIn) 1099 | { 1100 | btnWithLoggedIn_Click(null, null); 1101 | btnWithLoggedIn.Visible = false; 1102 | } 1103 | break; 1104 | case StreamService.Service.DLive: 1105 | if (_withLoggedIn) 1106 | { 1107 | btnWithLoggedIn_Click(null, null); 1108 | btnWithLoggedIn.Visible = false; 1109 | } 1110 | break; 1111 | case StreamService.Service.TrovoLive: 1112 | _dataSourceQuality.Clear(); 1113 | _dataSourceQuality.Add("Source", ""); 1114 | _dataSourceQuality.Add("1080p", "4|5000"); 1115 | _dataSourceQuality.Add("720p", "3|2500"); 1116 | _dataSourceQuality.Add("480p", "2|1500"); 1117 | _dataSourceQuality.Add("360p", "1|600"); 1118 | _dataSourceQuality.Add("144p", "0|280"); 1119 | break; 1120 | case StreamService.Service.BigoLive: 1121 | MessageBox.Show("Login is required for Bigo Live.\r\nPlease login manually after browsers deployed. Automated login is not available yet :(", "Information"); 1122 | checkLowCpuRam.Enabled = lstQuality.Enabled = false; 1123 | break; 1124 | default: 1125 | checkLowCpuRam.Enabled = lstQuality.Enabled = false; 1126 | break; 1127 | } 1128 | 1129 | if (lstQuality.InvokeRequired) 1130 | lstQuality.BeginInvoke(new Action(() => 1131 | { 1132 | lstQuality.DataSource = new BindingSource(_dataSourceQuality, null); 1133 | lstQuality.SelectedIndex = _dataSourceQuality.Count - 1; 1134 | })); 1135 | else 1136 | { 1137 | lstQuality.DataSource = new BindingSource(_dataSourceQuality, null); 1138 | lstQuality.SelectedIndex = _dataSourceQuality.Count - 1; 1139 | } 1140 | } 1141 | } 1142 | } -------------------------------------------------------------------------------- /StreamViewerBot/Program.cs: -------------------------------------------------------------------------------- 1 | using System; 2 | using System.Windows.Forms; 3 | 4 | namespace StreamViewerBot 5 | { 6 | internal static class Program 7 | { 8 | /// 9 | /// The main entry point for the application. 10 | /// 11 | [STAThread] 12 | private static void Main() 13 | { 14 | Application.SetHighDpiMode(HighDpiMode.SystemAware); 15 | Application.EnableVisualStyles(); 16 | Application.SetCompatibleTextRenderingDefault(false); 17 | Application.Run(new MainScreen()); 18 | } 19 | } 20 | } -------------------------------------------------------------------------------- /StreamViewerBot/Properties/Resources.Designer.cs: -------------------------------------------------------------------------------- 1 | //------------------------------------------------------------------------------ 2 | // 3 | // This code was generated by a tool. 4 | // Runtime Version:4.0.30319.42000 5 | // 6 | // Changes to this file may cause incorrect behavior and will be lost if 7 | // the code is regenerated. 8 | // 9 | //------------------------------------------------------------------------------ 10 | 11 | namespace StreamViewerBot.Properties { 12 | using System; 13 | 14 | 15 | /// 16 | /// A strongly-typed resource class, for looking up localized strings, etc. 17 | /// 18 | // This class was auto-generated by the StronglyTypedResourceBuilder 19 | // class via a tool like ResGen or Visual Studio. 20 | // To add or remove a member, edit your .ResX file then rerun ResGen 21 | // with the /str option, or rebuild your VS project. 22 | [global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Resources.Tools.StronglyTypedResourceBuilder", "17.0.0.0")] 23 | [global::System.Diagnostics.DebuggerNonUserCodeAttribute()] 24 | [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()] 25 | internal class Resources { 26 | 27 | private static global::System.Resources.ResourceManager resourceMan; 28 | 29 | private static global::System.Globalization.CultureInfo resourceCulture; 30 | 31 | [global::System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode")] 32 | internal Resources() { 33 | } 34 | 35 | /// 36 | /// Returns the cached ResourceManager instance used by this class. 37 | /// 38 | [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)] 39 | internal static global::System.Resources.ResourceManager ResourceManager { 40 | get { 41 | if (object.ReferenceEquals(resourceMan, null)) { 42 | global::System.Resources.ResourceManager temp = new global::System.Resources.ResourceManager("StreamViewerBot.Properties.Resources", typeof(Resources).Assembly); 43 | resourceMan = temp; 44 | } 45 | return resourceMan; 46 | } 47 | } 48 | 49 | /// 50 | /// Overrides the current thread's CurrentUICulture property for all 51 | /// resource lookups using this strongly typed resource class. 52 | /// 53 | [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)] 54 | internal static global::System.Globalization.CultureInfo Culture { 55 | get { 56 | return resourceCulture; 57 | } 58 | set { 59 | resourceCulture = value; 60 | } 61 | } 62 | 63 | /// 64 | /// Looks up a localized resource of type System.Drawing.Bitmap. 65 | /// 66 | internal static System.Drawing.Bitmap bot { 67 | get { 68 | object obj = ResourceManager.GetObject("bot", resourceCulture); 69 | return ((System.Drawing.Bitmap)(obj)); 70 | } 71 | } 72 | 73 | /// 74 | /// Looks up a localized resource of type System.Drawing.Bitmap. 75 | /// 76 | internal static System.Drawing.Bitmap button_start { 77 | get { 78 | object obj = ResourceManager.GetObject("button_start", resourceCulture); 79 | return ((System.Drawing.Bitmap)(obj)); 80 | } 81 | } 82 | 83 | /// 84 | /// Looks up a localized resource of type System.Drawing.Bitmap. 85 | /// 86 | internal static System.Drawing.Bitmap icon_onwhite { 87 | get { 88 | object obj = ResourceManager.GetObject("icon_onwhite", resourceCulture); 89 | return ((System.Drawing.Bitmap)(obj)); 90 | } 91 | } 92 | 93 | /// 94 | /// Looks up a localized resource of type System.Drawing.Bitmap. 95 | /// 96 | internal static System.Drawing.Bitmap icon_onwhite1 { 97 | get { 98 | object obj = ResourceManager.GetObject("icon_onwhite1", resourceCulture); 99 | return ((System.Drawing.Bitmap)(obj)); 100 | } 101 | } 102 | 103 | /// 104 | /// Looks up a localized resource of type System.Drawing.Bitmap. 105 | /// 106 | internal static System.Drawing.Bitmap info { 107 | get { 108 | object obj = ResourceManager.GetObject("info", resourceCulture); 109 | return ((System.Drawing.Bitmap)(obj)); 110 | } 111 | } 112 | 113 | /// 114 | /// Looks up a localized resource of type System.Drawing.Bitmap. 115 | /// 116 | internal static System.Drawing.Bitmap info1 { 117 | get { 118 | object obj = ResourceManager.GetObject("info1", resourceCulture); 119 | return ((System.Drawing.Bitmap)(obj)); 120 | } 121 | } 122 | 123 | /// 124 | /// Looks up a localized string similar to Enable IP authorization to use your proxies in headless mode, otherwise your viewers will not appear.. 125 | /// 126 | internal static string MainScreen_checkHeadless_CheckedChanged_Enable_IP_authorization_to_use_your_proxies_in_headless_mode { 127 | get { 128 | return ResourceManager.GetString("MainScreen_checkHeadless_CheckedChanged_Enable_IP_authorization_to_use_your_proxi" + 129 | "es_in_headless_mode", resourceCulture); 130 | } 131 | } 132 | 133 | /// 134 | /// Looks up a localized string similar to Warning. 135 | /// 136 | internal static string MainScreen_checkHeadless_CheckedChanged_Warning { 137 | get { 138 | return ResourceManager.GetString("MainScreen_checkHeadless_CheckedChanged_Warning", resourceCulture); 139 | } 140 | } 141 | 142 | /// 143 | /// Looks up a localized string similar to Login is required for Facebook Live to gain viewers. Please run the bot and log in on each browser.. 144 | /// 145 | internal static string MainScreen_LoginRequiredForFacebook { 146 | get { 147 | return ResourceManager.GetString("MainScreen_LoginRequiredForFacebook", resourceCulture); 148 | } 149 | } 150 | 151 | /// 152 | /// Looks up a localized string similar to Username is phone number on NimoTV. Please type it with country code like +90/xxxxxxxxxx. 153 | /// 154 | internal static string MainScreen_NimoTVTypeWithCountryCode { 155 | get { 156 | return ResourceManager.GetString("MainScreen_NimoTVTypeWithCountryCode", resourceCulture); 157 | } 158 | } 159 | 160 | /// 161 | /// Looks up a localized string similar to Do you want to update?. 162 | /// 163 | internal static string MainScreen_UpdateBot_Do_you_want_to_update_ { 164 | get { 165 | return ResourceManager.GetString("MainScreen_UpdateBot_Do_you_want_to_update_", resourceCulture); 166 | } 167 | } 168 | 169 | /// 170 | /// Looks up a localized string similar to Newer version is available!. 171 | /// 172 | internal static string MainScreen_UpdateBot_Newer_version_is_available_ { 173 | get { 174 | return ResourceManager.GetString("MainScreen_UpdateBot_Newer_version_is_available_", resourceCulture); 175 | } 176 | } 177 | 178 | /// 179 | /// Looks up a localized string similar to Sorry, updater failed. 180 | /// 181 | internal static string MainScreen_UpdateBot_Sorry__updater_failed_ { 182 | get { 183 | return ResourceManager.GetString("MainScreen_UpdateBot_Sorry__updater_failed_", resourceCulture); 184 | } 185 | } 186 | 187 | /// 188 | /// Looks up a localized resource of type System.Drawing.Bitmap. 189 | /// 190 | internal static System.Drawing.Bitmap validating { 191 | get { 192 | object obj = ResourceManager.GetObject("validating", resourceCulture); 193 | return ((System.Drawing.Bitmap)(obj)); 194 | } 195 | } 196 | 197 | /// 198 | /// Looks up a localized resource of type System.Drawing.Bitmap. 199 | /// 200 | internal static System.Drawing.Bitmap viewers { 201 | get { 202 | object obj = ResourceManager.GetObject("viewers", resourceCulture); 203 | return ((System.Drawing.Bitmap)(obj)); 204 | } 205 | } 206 | 207 | /// 208 | /// Looks up a localized resource of type System.Drawing.Bitmap. 209 | /// 210 | internal static System.Drawing.Bitmap withLoggedInUsers { 211 | get { 212 | object obj = ResourceManager.GetObject("withLoggedInUsers", resourceCulture); 213 | return ((System.Drawing.Bitmap)(obj)); 214 | } 215 | } 216 | 217 | /// 218 | /// Looks up a localized resource of type System.Drawing.Bitmap. 219 | /// 220 | internal static System.Drawing.Bitmap withLoggedInUsers1 { 221 | get { 222 | object obj = ResourceManager.GetObject("withLoggedInUsers1", resourceCulture); 223 | return ((System.Drawing.Bitmap)(obj)); 224 | } 225 | } 226 | } 227 | } 228 | -------------------------------------------------------------------------------- /StreamViewerBot/Properties/Resources.resx: -------------------------------------------------------------------------------- 1 |  2 | 3 | 62 | 63 | 64 | 65 | 66 | 67 | 68 | 69 | 70 | 71 | 72 | 73 | 74 | 75 | 76 | 77 | 78 | 79 | 80 | 81 | 82 | 83 | 84 | 85 | 86 | 87 | 88 | 89 | 90 | 91 | 92 | 93 | 94 | 95 | 96 | 97 | 98 | 99 | 100 | 101 | 102 | 103 | 104 | 105 | 106 | 107 | 108 | 109 | text/microsoft-resx 110 | 111 | 112 | 2.0 113 | 114 | 115 | System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 116 | 117 | 118 | System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 119 | 120 | 121 | Login is required for Facebook Live to gain viewers. Please run the bot and log in on each browser. 122 | 123 | 124 | 125 | ..\Images\withLoggedInUsers.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, 126 | PublicKeyToken=b03f5f7f11d50a3a 127 | 128 | 129 | Sorry, updater failed 130 | 131 | 132 | ..\Images\withLoggedInUsers.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, 133 | PublicKeyToken=b03f5f7f11d50a3a 134 | 135 | 136 | ..\Images\validating.gif;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, 137 | PublicKeyToken=b03f5f7f11d50a3a 138 | 139 | 140 | Enable IP authorization to use your proxies in headless mode, otherwise your viewers will not appear. 141 | 142 | 143 | ..\Images\info.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, 144 | PublicKeyToken=b03f5f7f11d50a3a 145 | 146 | 147 | ..\Images\info.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, 148 | PublicKeyToken=b03f5f7f11d50a3a 149 | 150 | 151 | ..\Images\button_start.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, 152 | PublicKeyToken=b03f5f7f11d50a3a 153 | 154 | 155 | Warning 156 | 157 | 158 | ..\Images\bot.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, 159 | PublicKeyToken=b03f5f7f11d50a3a 160 | 161 | 162 | Do you want to update? 163 | 164 | 165 | Username is phone number on NimoTV. Please type it with country code like +90/xxxxxxxxxx 166 | 167 | 168 | ..\Images\icon_onwhite.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, 169 | PublicKeyToken=b03f5f7f11d50a3a 170 | 171 | 172 | Newer version is available! 173 | 174 | 175 | ..\Images\viewers.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, 176 | PublicKeyToken=b03f5f7f11d50a3a 177 | 178 | 179 | ..\Images\icon_onwhite.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, 180 | PublicKeyToken=b03f5f7f11d50a3a 181 | 182 | -------------------------------------------------------------------------------- /StreamViewerBot/StreamViewerBot.csproj: -------------------------------------------------------------------------------- 1 |  2 | 3 | 4 | WinExe 5 | netcoreapp3.1 6 | true 7 | Images\favicon.ico 8 | Stream Viewer Bot 9 | Our easy to use app, allows you to gain live viewers in seconds. We did our best for an undetectable bot by Twitch, YouTube, Facebook Live, Twitter, DLive and Nimo Tv. 10 | https://streamviewerbot.com/ 11 | https://github.com/gorkemhacioglu/Stream-Viewer-Bot 12 | 2.7.4 13 | Görkem Alican Hacıoğlu 14 | 10 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | 31 | 32 | 33 | 34 | 35 | 36 | 37 | 38 | 39 | 40 | 41 | 42 | 43 | 44 | PreserveNewest 45 | 46 | 47 | PreserveNewest 48 | 49 | 50 | PreserveNewest 51 | 52 | 53 | PreserveNewest 54 | 55 | 56 | PreserveNewest 57 | 58 | 59 | PreserveNewest 60 | 61 | 62 | PreserveNewest 63 | 64 | 65 | PreserveNewest 66 | 67 | 68 | PreserveNewest 69 | 70 | 71 | PreserveNewest 72 | 73 | 74 | PreserveNewest 75 | 76 | 77 | PreserveNewest 78 | 79 | 80 | PreserveNewest 81 | 82 | 83 | PreserveNewest 84 | 85 | 86 | PreserveNewest 87 | 88 | 89 | PreserveNewest 90 | 91 | 92 | PreserveNewest 93 | 94 | 95 | 96 | 97 | 98 | 99 | 100 | 101 | 102 | 103 | 104 | 105 | 106 | 107 | 108 | 109 | True 110 | True 111 | Resources.resx 112 | 113 | 114 | 115 | 116 | 117 | ResXFileCodeGenerator 118 | Resources.Designer.cs 119 | 120 | 121 | 122 | 123 | 124 | PreserveNewest 125 | 126 | 127 | 128 | -------------------------------------------------------------------------------- /StreamViewerBot/UI/ChangeLogViewer.Designer.cs: -------------------------------------------------------------------------------- 1 | namespace StreamViewerBot.UI 2 | { 3 | partial class Changelog 4 | { 5 | /// 6 | /// Required designer variable. 7 | /// 8 | private System.ComponentModel.IContainer components = null; 9 | 10 | /// 11 | /// Clean up any resources being used. 12 | /// 13 | /// true if managed resources should be disposed; otherwise, false. 14 | protected override void Dispose(bool disposing) 15 | { 16 | if (disposing && (components != null)) 17 | { 18 | components.Dispose(); 19 | } 20 | base.Dispose(disposing); 21 | } 22 | 23 | #region Windows Form Designer generated code 24 | 25 | /// 26 | /// Required method for Designer support - do not modify 27 | /// the contents of this method with the code editor. 28 | /// 29 | private void InitializeComponent() 30 | { 31 | this.tableLayoutPanel1 = new System.Windows.Forms.TableLayoutPanel(); 32 | this.txtChangelog = new System.Windows.Forms.RichTextBox(); 33 | this.tableLayoutPanel1.SuspendLayout(); 34 | this.SuspendLayout(); 35 | // 36 | // tableLayoutPanel1 37 | // 38 | this.tableLayoutPanel1.ColumnCount = 1; 39 | this.tableLayoutPanel1.ColumnStyles.Add(new System.Windows.Forms.ColumnStyle(System.Windows.Forms.SizeType.Percent, 50F)); 40 | this.tableLayoutPanel1.Controls.Add(this.txtChangelog, 0, 0); 41 | this.tableLayoutPanel1.Dock = System.Windows.Forms.DockStyle.Fill; 42 | this.tableLayoutPanel1.Location = new System.Drawing.Point(0, 0); 43 | this.tableLayoutPanel1.Name = "tableLayoutPanel1"; 44 | this.tableLayoutPanel1.RowCount = 1; 45 | this.tableLayoutPanel1.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Percent, 50F)); 46 | this.tableLayoutPanel1.Size = new System.Drawing.Size(462, 237); 47 | this.tableLayoutPanel1.TabIndex = 0; 48 | // 49 | // txtChangelog 50 | // 51 | this.txtChangelog.Dock = System.Windows.Forms.DockStyle.Fill; 52 | this.txtChangelog.Location = new System.Drawing.Point(3, 3); 53 | this.txtChangelog.Name = "txtChangelog"; 54 | this.txtChangelog.ReadOnly = true; 55 | this.txtChangelog.Size = new System.Drawing.Size(456, 231); 56 | this.txtChangelog.TabIndex = 0; 57 | this.txtChangelog.Text = ""; 58 | // 59 | // Changelog 60 | // 61 | this.AutoScaleDimensions = new System.Drawing.SizeF(7F, 15F); 62 | this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; 63 | this.AutoScroll = true; 64 | this.AutoSizeMode = System.Windows.Forms.AutoSizeMode.GrowAndShrink; 65 | this.ClientSize = new System.Drawing.Size(462, 237); 66 | this.Controls.Add(this.tableLayoutPanel1); 67 | this.Name = "Changelog"; 68 | this.StartPosition = System.Windows.Forms.FormStartPosition.CenterScreen; 69 | this.Text = "A new version is available!"; 70 | this.tableLayoutPanel1.ResumeLayout(false); 71 | this.ResumeLayout(false); 72 | 73 | } 74 | 75 | #endregion 76 | 77 | private System.Windows.Forms.TableLayoutPanel tableLayoutPanel1; 78 | private System.Windows.Forms.RichTextBox txtChangelog; 79 | } 80 | } -------------------------------------------------------------------------------- /StreamViewerBot/UI/ChangeLogViewer.cs: -------------------------------------------------------------------------------- 1 | using System; 2 | using System.Collections.Generic; 3 | using System.ComponentModel; 4 | using System.Data; 5 | using System.Drawing; 6 | using System.Text; 7 | using System.Windows.Forms; 8 | 9 | namespace StreamViewerBot.UI 10 | { 11 | public partial class Changelog : Form 12 | { 13 | public Changelog() 14 | { 15 | InitializeComponent(); 16 | } 17 | 18 | public void SetChangelog(string changelog) 19 | { 20 | txtChangelog.Text = changelog; 21 | } 22 | } 23 | } 24 | -------------------------------------------------------------------------------- /StreamViewerBot/UI/ChangeLogViewer.resx: -------------------------------------------------------------------------------- 1 |  2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | 31 | 32 | 33 | 34 | 35 | 36 | 37 | 38 | 39 | 40 | 41 | 42 | 43 | 44 | 45 | 46 | 47 | 48 | 49 | text/microsoft-resx 50 | 51 | 52 | 2.0 53 | 54 | 55 | System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 56 | 57 | 58 | System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 59 | 60 | -------------------------------------------------------------------------------- /StreamViewerBot/UI/ProxyDisplayer.Designer.cs: -------------------------------------------------------------------------------- 1 | namespace StreamViewerBot.UI 2 | { 3 | partial class ProxyDisplayer 4 | { 5 | /// 6 | /// Required designer variable. 7 | /// 8 | private System.ComponentModel.IContainer components = null; 9 | 10 | /// 11 | /// Clean up any resources being used. 12 | /// 13 | /// true if managed resources should be disposed; otherwise, false. 14 | protected override void Dispose(bool disposing) 15 | { 16 | if (disposing && (components != null)) 17 | { 18 | components.Dispose(); 19 | } 20 | base.Dispose(disposing); 21 | } 22 | 23 | #region Windows Form Designer generated code 24 | 25 | /// 26 | /// Required method for Designer support - do not modify 27 | /// the contents of this method with the code editor. 28 | /// 29 | private void InitializeComponent() 30 | { 31 | this.lblHeader = new System.Windows.Forms.Label(); 32 | this.txtProxyList = new System.Windows.Forms.RichTextBox(); 33 | this.lblMessage = new System.Windows.Forms.Label(); 34 | this.lblBuyProxy = new System.Windows.Forms.Label(); 35 | this.btnRetest = new System.Windows.Forms.Button(); 36 | this.SuspendLayout(); 37 | // 38 | // lblHeader 39 | // 40 | this.lblHeader.AutoSize = true; 41 | this.lblHeader.Font = new System.Drawing.Font("Segoe UI", 14.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point); 42 | this.lblHeader.Location = new System.Drawing.Point(23, 9); 43 | this.lblHeader.Name = "lblHeader"; 44 | this.lblHeader.Size = new System.Drawing.Size(465, 25); 45 | this.lblHeader.TabIndex = 0; 46 | this.lblHeader.Text = "These proxies are not private or not working properly!"; 47 | // 48 | // txtProxyList 49 | // 50 | this.txtProxyList.Location = new System.Drawing.Point(12, 37); 51 | this.txtProxyList.Name = "txtProxyList"; 52 | this.txtProxyList.ReadOnly = true; 53 | this.txtProxyList.Size = new System.Drawing.Size(494, 439); 54 | this.txtProxyList.TabIndex = 1; 55 | this.txtProxyList.Text = ""; 56 | // 57 | // lblMessage 58 | // 59 | this.lblMessage.AutoSize = true; 60 | this.lblMessage.Font = new System.Drawing.Font("Segoe UI", 11.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point); 61 | this.lblMessage.Location = new System.Drawing.Point(23, 508); 62 | this.lblMessage.Name = "lblMessage"; 63 | this.lblMessage.Size = new System.Drawing.Size(427, 20); 64 | this.lblMessage.TabIndex = 2; 65 | this.lblMessage.Text = "You must have private and working proxies. You can buy it from"; 66 | // 67 | // lblBuyProxy 68 | // 69 | this.lblBuyProxy.AutoSize = true; 70 | this.lblBuyProxy.Font = new System.Drawing.Font("Segoe UI", 12F, ((System.Drawing.FontStyle)((System.Drawing.FontStyle.Bold | System.Drawing.FontStyle.Underline))), System.Drawing.GraphicsUnit.Point); 71 | this.lblBuyProxy.ForeColor = System.Drawing.Color.LimeGreen; 72 | this.lblBuyProxy.Location = new System.Drawing.Point(446, 507); 73 | this.lblBuyProxy.Name = "lblBuyProxy"; 74 | this.lblBuyProxy.Size = new System.Drawing.Size(55, 21); 75 | this.lblBuyProxy.TabIndex = 3; 76 | this.lblBuyProxy.Text = "HERE!"; 77 | this.lblBuyProxy.Click += new System.EventHandler(this.lblBuyProxy_Click); 78 | this.lblBuyProxy.MouseEnter += new System.EventHandler(this.lblBuyProxy_MouseEnter); 79 | this.lblBuyProxy.MouseLeave += new System.EventHandler(this.lblBuyProxy_MouseLeave); 80 | // 81 | // btnRetest 82 | // 83 | this.btnRetest.Location = new System.Drawing.Point(220, 482); 84 | this.btnRetest.Name = "btnRetest"; 85 | this.btnRetest.Size = new System.Drawing.Size(75, 23); 86 | this.btnRetest.TabIndex = 4; 87 | this.btnRetest.Text = "Retest"; 88 | this.btnRetest.UseVisualStyleBackColor = true; 89 | this.btnRetest.Click += new System.EventHandler(this.btnRetest_Click); 90 | // 91 | // ProxyDisplayer 92 | // 93 | this.AutoScaleDimensions = new System.Drawing.SizeF(7F, 15F); 94 | this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; 95 | this.ClientSize = new System.Drawing.Size(518, 540); 96 | this.Controls.Add(this.btnRetest); 97 | this.Controls.Add(this.lblBuyProxy); 98 | this.Controls.Add(this.lblMessage); 99 | this.Controls.Add(this.txtProxyList); 100 | this.Controls.Add(this.lblHeader); 101 | this.MaximizeBox = false; 102 | this.MinimizeBox = false; 103 | this.Name = "ProxyDisplayer"; 104 | this.StartPosition = System.Windows.Forms.FormStartPosition.CenterScreen; 105 | this.Text = "Proxy Check"; 106 | this.TopMost = true; 107 | this.ResumeLayout(false); 108 | this.PerformLayout(); 109 | 110 | } 111 | 112 | #endregion 113 | 114 | private System.Windows.Forms.Label lblHeader; 115 | private System.Windows.Forms.RichTextBox txtProxyList; 116 | private System.Windows.Forms.Label lblMessage; 117 | private System.Windows.Forms.Label lblBuyProxy; 118 | private System.Windows.Forms.Button btnRetest; 119 | } 120 | } -------------------------------------------------------------------------------- /StreamViewerBot/UI/ProxyDisplayer.cs: -------------------------------------------------------------------------------- 1 | using System; 2 | using System.Collections.Generic; 3 | using System.Diagnostics; 4 | using System.Drawing; 5 | using System.Linq; 6 | using System.Windows.Forms; 7 | 8 | namespace StreamViewerBot.UI 9 | { 10 | public partial class ProxyDisplayer : Form 11 | { 12 | public Action Retest; 13 | 14 | public ProxyDisplayer(List proxyList) 15 | { 16 | InitializeComponent(); 17 | 18 | txtProxyList.Text = string.Empty; 19 | 20 | foreach (var proxy in proxyList) txtProxyList.Text += proxy+Environment.NewLine; 21 | } 22 | 23 | private void lblBuyProxy_Click(object sender, EventArgs e) 24 | { 25 | try 26 | { 27 | var strCmdLine = "/C explorer \"https://www.webshare.io/?referral_code=ceuygyx4sir2"; 28 | var browserProcess = Process.Start("CMD.exe", strCmdLine); 29 | browserProcess?.Close(); 30 | } 31 | catch (Exception) 32 | { 33 | //ignored 34 | } 35 | } 36 | 37 | private void lblBuyProxy_MouseEnter(object sender, EventArgs e) 38 | { 39 | lblBuyProxy.ForeColor = Color.ForestGreen; 40 | } 41 | 42 | private void lblBuyProxy_MouseLeave(object sender, EventArgs e) 43 | { 44 | lblBuyProxy.ForeColor = Color.LimeGreen; 45 | } 46 | 47 | private void btnRetest_Click(object sender, EventArgs e) 48 | { 49 | Retest.Invoke(txtProxyList.Text.Split('\n').SkipLast(1).ToArray()); 50 | Close(); 51 | } 52 | } 53 | } -------------------------------------------------------------------------------- /StreamViewerBot/UI/ProxyDisplayer.resx: -------------------------------------------------------------------------------- 1 |  2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | 31 | 32 | 33 | 34 | 35 | 36 | 37 | 38 | 39 | 40 | 41 | 42 | 43 | 44 | 45 | 46 | 47 | 48 | 49 | text/microsoft-resx 50 | 51 | 52 | 2.0 53 | 54 | 55 | System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, 56 | PublicKeyToken=b77a5c561934e089 57 | 58 | 59 | 60 | System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, 61 | PublicKeyToken=b77a5c561934e089 62 | 63 | 64 | -------------------------------------------------------------------------------- /StreamViewerBot/UI/ValidatingForm.Designer.cs: -------------------------------------------------------------------------------- 1 | namespace StreamViewerBot.UI 2 | { 3 | partial class ValidatingForm 4 | { 5 | /// 6 | /// Required designer variable. 7 | /// 8 | private System.ComponentModel.IContainer components = null; 9 | 10 | /// 11 | /// Clean up any resources being used. 12 | /// 13 | /// true if managed resources should be disposed; otherwise, false. 14 | protected override void Dispose(bool disposing) 15 | { 16 | if (disposing && (components != null)) 17 | { 18 | components.Dispose(); 19 | } 20 | base.Dispose(disposing); 21 | } 22 | 23 | #region Windows Form Designer generated code 24 | 25 | /// 26 | /// Required method for Designer support - do not modify 27 | /// the contents of this method with the code editor. 28 | /// 29 | private void InitializeComponent() 30 | { 31 | System.ComponentModel.ComponentResourceManager resources = new System.ComponentModel.ComponentResourceManager(typeof(ValidatingForm)); 32 | this.pictureBox1 = new System.Windows.Forms.PictureBox(); 33 | this.lblValidating = new System.Windows.Forms.Label(); 34 | this.progressBar = new System.Windows.Forms.ProgressBar(); 35 | ((System.ComponentModel.ISupportInitialize)(this.pictureBox1)).BeginInit(); 36 | this.SuspendLayout(); 37 | // 38 | // pictureBox1 39 | // 40 | this.pictureBox1.Image = ((System.Drawing.Image)(resources.GetObject("pictureBox1.Image"))); 41 | this.pictureBox1.Location = new System.Drawing.Point(12, 12); 42 | this.pictureBox1.Name = "pictureBox1"; 43 | this.pictureBox1.Size = new System.Drawing.Size(217, 134); 44 | this.pictureBox1.SizeMode = System.Windows.Forms.PictureBoxSizeMode.Zoom; 45 | this.pictureBox1.TabIndex = 0; 46 | this.pictureBox1.TabStop = false; 47 | // 48 | // lblValidating 49 | // 50 | this.lblValidating.AutoSize = true; 51 | this.lblValidating.Location = new System.Drawing.Point(12, 160); 52 | this.lblValidating.Name = "lblValidating"; 53 | this.lblValidating.Size = new System.Drawing.Size(109, 15); 54 | this.lblValidating.TabIndex = 1; 55 | this.lblValidating.Text = "Validating proxies..."; 56 | // 57 | // progressBar 58 | // 59 | this.progressBar.Location = new System.Drawing.Point(127, 160); 60 | this.progressBar.Maximum = 1000; 61 | this.progressBar.Name = "progressBar"; 62 | this.progressBar.Size = new System.Drawing.Size(100, 15); 63 | this.progressBar.Step = 1; 64 | this.progressBar.TabIndex = 2; 65 | // 66 | // ValidatingForm 67 | // 68 | this.AutoScaleDimensions = new System.Drawing.SizeF(7F, 15F); 69 | this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; 70 | this.BackColor = System.Drawing.SystemColors.Control; 71 | this.ClientSize = new System.Drawing.Size(241, 184); 72 | this.ControlBox = false; 73 | this.Controls.Add(this.progressBar); 74 | this.Controls.Add(this.lblValidating); 75 | this.Controls.Add(this.pictureBox1); 76 | this.FormBorderStyle = System.Windows.Forms.FormBorderStyle.None; 77 | this.MaximizeBox = false; 78 | this.MinimizeBox = false; 79 | this.Name = "ValidatingForm"; 80 | this.ShowIcon = false; 81 | this.StartPosition = System.Windows.Forms.FormStartPosition.CenterScreen; 82 | this.Text = "ValidatingForm"; 83 | this.TopMost = true; 84 | ((System.ComponentModel.ISupportInitialize)(this.pictureBox1)).EndInit(); 85 | this.ResumeLayout(false); 86 | this.PerformLayout(); 87 | 88 | } 89 | 90 | #endregion 91 | 92 | private System.Windows.Forms.PictureBox pictureBox1; 93 | private System.Windows.Forms.Label lblValidating; 94 | private System.Windows.Forms.ProgressBar progressBar; 95 | } 96 | } -------------------------------------------------------------------------------- /StreamViewerBot/UI/ValidatingForm.cs: -------------------------------------------------------------------------------- 1 | using System.Windows.Forms; 2 | 3 | namespace StreamViewerBot.UI 4 | { 5 | public partial class ValidatingForm : Form 6 | { 7 | public ProgressBar ProgressBar; 8 | 9 | public ValidatingForm() 10 | { 11 | InitializeComponent(); 12 | ProgressBar = progressBar; 13 | } 14 | } 15 | } -------------------------------------------------------------------------------- /codeql-analysis.yml: -------------------------------------------------------------------------------- 1 | # For most projects, this workflow file will not need changing; you simply need 2 | # to commit it to your repository. 3 | # 4 | # You may wish to alter this file to override the set of languages analyzed, 5 | # or to provide custom queries or build logic. 6 | # 7 | # ******** NOTE ******** 8 | # We have attempted to detect the languages in your repository. Please check 9 | # the `language` matrix defined below to confirm you have the correct set of 10 | # supported CodeQL languages. 11 | # 12 | name: "CodeQL" 13 | 14 | on: 15 | push: 16 | branches: [ master, Protection ] 17 | pull_request: 18 | # The branches below must be a subset of the branches above 19 | branches: [ master ] 20 | schedule: 21 | - cron: '36 0 * * 3' 22 | 23 | jobs: 24 | analyze: 25 | name: Analyze 26 | runs-on: ubuntu-latest 27 | permissions: 28 | actions: read 29 | contents: read 30 | security-events: write 31 | 32 | strategy: 33 | fail-fast: false 34 | matrix: 35 | language: [ 'csharp', 'javascript' ] 36 | # CodeQL supports [ 'cpp', 'csharp', 'go', 'java', 'javascript', 'python', 'ruby' ] 37 | # Learn more about CodeQL language support at https://git.io/codeql-language-support 38 | 39 | steps: 40 | - name: Checkout repository 41 | uses: actions/checkout@v2 42 | 43 | # Initializes the CodeQL tools for scanning. 44 | - name: Initialize CodeQL 45 | uses: github/codeql-action/init@v1 46 | with: 47 | languages: ${{ matrix.language }} 48 | # If you wish to specify custom queries, you can do so here or in a config file. 49 | # By default, queries listed here will override any specified in a config file. 50 | # Prefix the list here with "+" to use these queries and those in the config file. 51 | # queries: ./path/to/local/query, your-org/your-repo/queries@main 52 | 53 | # Autobuild attempts to build any compiled languages (C/C++, C#, or Java). 54 | # If this step fails, then you should remove it and run the build manually (see below) 55 | - name: Autobuild 56 | uses: github/codeql-action/autobuild@v1 57 | 58 | # ℹ️ Command-line programs to run using the OS shell. 59 | # 📚 https://git.io/JvXDl 60 | 61 | # ✏️ If the Autobuild fails above, remove it and uncomment the following three lines 62 | # and modify them (or add more) to build your code if your project 63 | # uses a compiled language 64 | 65 | #- run: | 66 | # make bootstrap 67 | # make release 68 | 69 | - name: Perform CodeQL Analysis 70 | uses: github/codeql-action/analyze@v1 71 | --------------------------------------------------------------------------------