├── .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 | 
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 |
--------------------------------------------------------------------------------