├── RobloxLatestClientDownloader ├── ClientDownloadLogo.ico ├── ClientDownloadLogo.png ├── App.xaml.cs ├── App.xaml ├── AssemblyInfo.cs ├── RobloxLatestClientDownloader.csproj ├── MainWindow.xaml └── MainWindow.xaml.cs ├── README.md ├── RobloxLatestClientDownloader.sln └── .gitignore /RobloxLatestClientDownloader/ClientDownloadLogo.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ShouxTech/RobloxLatestClientDownloader/HEAD/RobloxLatestClientDownloader/ClientDownloadLogo.ico -------------------------------------------------------------------------------- /RobloxLatestClientDownloader/ClientDownloadLogo.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ShouxTech/RobloxLatestClientDownloader/HEAD/RobloxLatestClientDownloader/ClientDownloadLogo.png -------------------------------------------------------------------------------- /RobloxLatestClientDownloader/App.xaml.cs: -------------------------------------------------------------------------------- 1 | using System; 2 | using System.Collections.Generic; 3 | using System.Configuration; 4 | using System.Data; 5 | using System.Linq; 6 | using System.Threading.Tasks; 7 | using System.Windows; 8 | 9 | namespace RobloxLatestClientDownloader { 10 | /// 11 | /// Interaction logic for App.xaml 12 | /// 13 | public partial class App : Application { 14 | } 15 | } 16 | -------------------------------------------------------------------------------- /RobloxLatestClientDownloader/App.xaml: -------------------------------------------------------------------------------- 1 | 6 | 7 | 8 | 9 | 10 | -------------------------------------------------------------------------------- /RobloxLatestClientDownloader/AssemblyInfo.cs: -------------------------------------------------------------------------------- 1 | using System.Windows; 2 | 3 | [assembly: ThemeInfo( 4 | ResourceDictionaryLocation.None, //where theme specific resource dictionaries are located 5 | //(used if a resource is not found in the page, 6 | // or application resource dictionaries) 7 | ResourceDictionaryLocation.SourceAssembly //where the generic resource dictionary is located 8 | //(used if a resource is not found in the page, 9 | // app, or any theme specific resource dictionaries) 10 | )] 11 | -------------------------------------------------------------------------------- /RobloxLatestClientDownloader/RobloxLatestClientDownloader.csproj: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | WinExe 5 | net6.0-windows 6 | enable 7 | true 8 | ClientDownloadLogo.ico 9 | ClientDownloadLogo.png 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | True 23 | \ 24 | 25 | 26 | 27 | 28 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # Roblox Client Downloader 2 | 3 | This application downloads the latest available release of the Roblox client. This is different from the regular official release as it is typically pushed by Roblox a day or a few days before Roblox officially updates their client and forces every user to download it. 4 | 5 | [Video](https://streamable.com/k9opp5) 6 | 7 | ![UI Image](https://i.gyazo.com/991bb90e9584cf5d32c931b3c4900572.png) 8 | 9 | ## How does it work? 10 | 11 | Roblox has their deploy logs [here](http://setup.roblox.com/DeployHistory.txt). This application checks for the latest WindowsPlayer version and allows you to download it or replace it directly into your Roblox versions folder (Only works if you have Roblox installed in local appdata, but if you have Roblox installed somewhere else, you can still download the zip and put the Roblox client executable into your Roblox/Versions/version-xxx directory) 12 | -------------------------------------------------------------------------------- /RobloxLatestClientDownloader.sln: -------------------------------------------------------------------------------- 1 | 2 | Microsoft Visual Studio Solution File, Format Version 12.00 3 | # Visual Studio Version 17 4 | VisualStudioVersion = 17.1.31911.260 5 | MinimumVisualStudioVersion = 10.0.40219.1 6 | Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "RobloxLatestClientDownloader", "RobloxLatestClientDownloader\RobloxLatestClientDownloader.csproj", "{9D218C22-7FDD-41D2-A83A-4DB4F0759CAE}" 7 | EndProject 8 | Global 9 | GlobalSection(SolutionConfigurationPlatforms) = preSolution 10 | Debug|Any CPU = Debug|Any CPU 11 | Release|Any CPU = Release|Any CPU 12 | EndGlobalSection 13 | GlobalSection(ProjectConfigurationPlatforms) = postSolution 14 | {9D218C22-7FDD-41D2-A83A-4DB4F0759CAE}.Debug|Any CPU.ActiveCfg = Debug|Any CPU 15 | {9D218C22-7FDD-41D2-A83A-4DB4F0759CAE}.Debug|Any CPU.Build.0 = Debug|Any CPU 16 | {9D218C22-7FDD-41D2-A83A-4DB4F0759CAE}.Release|Any CPU.ActiveCfg = Release|Any CPU 17 | {9D218C22-7FDD-41D2-A83A-4DB4F0759CAE}.Release|Any CPU.Build.0 = Release|Any CPU 18 | EndGlobalSection 19 | GlobalSection(SolutionProperties) = preSolution 20 | HideSolutionNode = FALSE 21 | EndGlobalSection 22 | GlobalSection(ExtensibilityGlobals) = postSolution 23 | SolutionGuid = {4B37B31A-5DD8-4010-9E30-47BBF839D20F} 24 | EndGlobalSection 25 | EndGlobal 26 | -------------------------------------------------------------------------------- /RobloxLatestClientDownloader/MainWindow.xaml: -------------------------------------------------------------------------------- 1 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | -------------------------------------------------------------------------------- /RobloxLatestClientDownloader/MainWindow.xaml.cs: -------------------------------------------------------------------------------- 1 | using System; 2 | using System.Collections.Generic; 3 | using System.IO; 4 | using System.IO.Compression; 5 | using System.Linq; 6 | using System.Net; 7 | using System.Net.Http; 8 | using System.Text; 9 | using System.Text.RegularExpressions; 10 | using System.Threading.Tasks; 11 | using System.Windows; 12 | using System.Windows.Controls; 13 | using System.Windows.Data; 14 | using System.Windows.Documents; 15 | using System.Windows.Input; 16 | using System.Windows.Media; 17 | using System.Windows.Media.Imaging; 18 | using System.Windows.Navigation; 19 | using System.Windows.Shapes; 20 | 21 | namespace RobloxLatestClientDownloader { 22 | public partial class MainWindow : Window { 23 | private const string robloxClientName = "RobloxPlayerBeta.exe"; 24 | 25 | private string currentRobloxVersion; 26 | private string availableRobloxVersion; 27 | 28 | public MainWindow() { 29 | InitializeComponent(); 30 | 31 | currentRobloxVersion = GetCurrentRobloxVersion(); 32 | availableRobloxVersion = GetAvailableRobloxVersion(); 33 | 34 | SetLatestVersionLabel(); 35 | SetAvailableVersionLabel(); 36 | } 37 | 38 | private string GetCurrentRobloxVersion() { 39 | if (!string.IsNullOrEmpty(currentRobloxVersion)) { 40 | return currentRobloxVersion; 41 | } 42 | 43 | using (HttpClient client = new HttpClient()) { 44 | return client.GetStringAsync("http://setup.roblox.com/version").Result; 45 | } 46 | } 47 | 48 | private string GetWindowsPlayerLineFromAllVersionLines(string[] allVersionLines, int index) { 49 | string line = allVersionLines[index]; 50 | 51 | if (!line.Contains("WindowsPlayer")) { 52 | return GetWindowsPlayerLineFromAllVersionLines(allVersionLines, index - 1); 53 | } 54 | 55 | return line; 56 | } 57 | 58 | private string GetAvailableRobloxVersion() { 59 | if (!string.IsNullOrEmpty(availableRobloxVersion)) { 60 | return availableRobloxVersion; 61 | } 62 | 63 | using (HttpClient httpClient = new HttpClient()) { 64 | string allVersions = httpClient.GetStringAsync("http://setup.roblox.com/DeployHistory.txt").Result; 65 | string[] lines = allVersions.Split('\n'); 66 | string versionLine = GetWindowsPlayerLineFromAllVersionLines(lines, lines.Length - 1); 67 | MatchCollection regexMatch = Regex.Matches(versionLine, "version-\\S+"); 68 | return regexMatch[0].Value; 69 | } 70 | } 71 | 72 | private void SetLatestVersionLabel() { 73 | CurrentVersionLabel.Content = "Current Roblox Version: " + currentRobloxVersion; 74 | } 75 | 76 | private void SetAvailableVersionLabel() { 77 | AvailableVersionLabel.Content = "Available Roblox Version: " + availableRobloxVersion; 78 | } 79 | 80 | private void DownloadAvailableVersion() { 81 | using (WebClient webClient = new WebClient()) { 82 | webClient.DownloadFile("https://setup.rbxcdn.com/" + availableRobloxVersion + "-RobloxApp.zip", availableRobloxVersion + ".zip"); 83 | } 84 | } 85 | 86 | // Button methods. 87 | 88 | private void DownloadAvailableBtn_Click(object sender, RoutedEventArgs e) { 89 | DownloadAvailableVersion(); 90 | MessageBox.Show("Downloaded the latest available Roblox version.", "Downloaded", MessageBoxButton.OK, MessageBoxImage.Information); 91 | } 92 | 93 | private void ReplaceVersionBtn_Click(object sender, RoutedEventArgs e) { 94 | string zipPath = availableRobloxVersion + ".zip"; 95 | 96 | if (!File.Exists(zipPath)) { 97 | DownloadAvailableVersion(); 98 | } 99 | 100 | using (ZipArchive archive = ZipFile.OpenRead(zipPath)) { 101 | foreach (ZipArchiveEntry entry in archive.Entries) { 102 | if (entry.Name == robloxClientName) { 103 | entry.ExtractToFile(Environment.GetFolderPath(Environment.SpecialFolder.LocalApplicationData) + @"\Roblox\Versions\" + currentRobloxVersion + "\\" + entry.Name, true); 104 | 105 | MessageBox.Show("Replaced the current version of Roblox with the latest available version.", "Replaced", MessageBoxButton.OK, MessageBoxImage.Information); 106 | } 107 | } 108 | } 109 | } 110 | } 111 | } -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | 2 | # Created by https://www.toptal.com/developers/gitignore/api/visualstudio 3 | # Edit at https://www.toptal.com/developers/gitignore?templates=visualstudio 4 | 5 | ### VisualStudio ### 6 | ## Ignore Visual Studio temporary files, build results, and 7 | ## files generated by popular Visual Studio add-ons. 8 | ## 9 | ## Get latest from https://github.com/github/gitignore/blob/main/VisualStudio.gitignore 10 | 11 | # User-specific files 12 | *.rsuser 13 | *.suo 14 | *.user 15 | *.userosscache 16 | *.sln.docstates 17 | 18 | # User-specific files (MonoDevelop/Xamarin Studio) 19 | *.userprefs 20 | 21 | # Mono auto generated files 22 | mono_crash.* 23 | 24 | # Build results 25 | [Dd]ebug/ 26 | [Dd]ebugPublic/ 27 | [Rr]elease/ 28 | [Rr]eleases/ 29 | x64/ 30 | x86/ 31 | [Ww][Ii][Nn]32/ 32 | [Aa][Rr][Mm]/ 33 | [Aa][Rr][Mm]64/ 34 | bld/ 35 | [Bb]in/ 36 | [Oo]bj/ 37 | [Ll]og/ 38 | [Ll]ogs/ 39 | 40 | # Visual Studio 2015/2017 cache/options directory 41 | .vs/ 42 | # Uncomment if you have tasks that create the project's static files in wwwroot 43 | #wwwroot/ 44 | 45 | # Visual Studio 2017 auto generated files 46 | Generated\ Files/ 47 | 48 | # MSTest test Results 49 | [Tt]est[Rr]esult*/ 50 | [Bb]uild[Ll]og.* 51 | 52 | # NUnit 53 | *.VisualState.xml 54 | TestResult.xml 55 | nunit-*.xml 56 | 57 | # Build Results of an ATL Project 58 | [Dd]ebugPS/ 59 | [Rr]eleasePS/ 60 | dlldata.c 61 | 62 | # Benchmark Results 63 | BenchmarkDotNet.Artifacts/ 64 | 65 | # .NET Core 66 | project.lock.json 67 | project.fragment.lock.json 68 | artifacts/ 69 | 70 | # ASP.NET Scaffolding 71 | ScaffoldingReadMe.txt 72 | 73 | # StyleCop 74 | StyleCopReport.xml 75 | 76 | # Files built by Visual Studio 77 | *_i.c 78 | *_p.c 79 | *_h.h 80 | *.ilk 81 | *.meta 82 | *.obj 83 | *.iobj 84 | *.pch 85 | *.pdb 86 | *.ipdb 87 | *.pgc 88 | *.pgd 89 | *.rsp 90 | *.sbr 91 | *.tlb 92 | *.tli 93 | *.tlh 94 | *.tmp 95 | *.tmp_proj 96 | *_wpftmp.csproj 97 | *.log 98 | *.tlog 99 | *.vspscc 100 | *.vssscc 101 | .builds 102 | *.pidb 103 | *.svclog 104 | *.scc 105 | 106 | # Chutzpah Test files 107 | _Chutzpah* 108 | 109 | # Visual C++ cache files 110 | ipch/ 111 | *.aps 112 | *.ncb 113 | *.opendb 114 | *.opensdf 115 | *.sdf 116 | *.cachefile 117 | *.VC.db 118 | *.VC.VC.opendb 119 | 120 | # Visual Studio profiler 121 | *.psess 122 | *.vsp 123 | *.vspx 124 | *.sap 125 | 126 | # Visual Studio Trace Files 127 | *.e2e 128 | 129 | # TFS 2012 Local Workspace 130 | $tf/ 131 | 132 | # Guidance Automation Toolkit 133 | *.gpState 134 | 135 | # ReSharper is a .NET coding add-in 136 | _ReSharper*/ 137 | *.[Rr]e[Ss]harper 138 | *.DotSettings.user 139 | 140 | # TeamCity is a build add-in 141 | _TeamCity* 142 | 143 | # DotCover is a Code Coverage Tool 144 | *.dotCover 145 | 146 | # AxoCover is a Code Coverage Tool 147 | .axoCover/* 148 | !.axoCover/settings.json 149 | 150 | # Coverlet is a free, cross platform Code Coverage Tool 151 | coverage*.json 152 | coverage*.xml 153 | coverage*.info 154 | 155 | # Visual Studio code coverage results 156 | *.coverage 157 | *.coveragexml 158 | 159 | # NCrunch 160 | _NCrunch_* 161 | .*crunch*.local.xml 162 | nCrunchTemp_* 163 | 164 | # MightyMoose 165 | *.mm.* 166 | AutoTest.Net/ 167 | 168 | # Web workbench (sass) 169 | .sass-cache/ 170 | 171 | # Installshield output folder 172 | [Ee]xpress/ 173 | 174 | # DocProject is a documentation generator add-in 175 | DocProject/buildhelp/ 176 | DocProject/Help/*.HxT 177 | DocProject/Help/*.HxC 178 | DocProject/Help/*.hhc 179 | DocProject/Help/*.hhk 180 | DocProject/Help/*.hhp 181 | DocProject/Help/Html2 182 | DocProject/Help/html 183 | 184 | # Click-Once directory 185 | publish/ 186 | 187 | # Publish Web Output 188 | *.[Pp]ublish.xml 189 | *.azurePubxml 190 | # Note: Comment the next line if you want to checkin your web deploy settings, 191 | # but database connection strings (with potential passwords) will be unencrypted 192 | *.pubxml 193 | *.publishproj 194 | 195 | # Microsoft Azure Web App publish settings. Comment the next line if you want to 196 | # checkin your Azure Web App publish settings, but sensitive information contained 197 | # in these scripts will be unencrypted 198 | PublishScripts/ 199 | 200 | # NuGet Packages 201 | *.nupkg 202 | # NuGet Symbol Packages 203 | *.snupkg 204 | # The packages folder can be ignored because of Package Restore 205 | **/[Pp]ackages/* 206 | # except build/, which is used as an MSBuild target. 207 | !**/[Pp]ackages/build/ 208 | # Uncomment if necessary however generally it will be regenerated when needed 209 | #!**/[Pp]ackages/repositories.config 210 | # NuGet v3's project.json files produces more ignorable files 211 | *.nuget.props 212 | *.nuget.targets 213 | 214 | # Microsoft Azure Build Output 215 | csx/ 216 | *.build.csdef 217 | 218 | # Microsoft Azure Emulator 219 | ecf/ 220 | rcf/ 221 | 222 | # Windows Store app package directories and files 223 | AppPackages/ 224 | BundleArtifacts/ 225 | Package.StoreAssociation.xml 226 | _pkginfo.txt 227 | *.appx 228 | *.appxbundle 229 | *.appxupload 230 | 231 | # Visual Studio cache files 232 | # files ending in .cache can be ignored 233 | *.[Cc]ache 234 | # but keep track of directories ending in .cache 235 | !?*.[Cc]ache/ 236 | 237 | # Others 238 | ClientBin/ 239 | ~$* 240 | *~ 241 | *.dbmdl 242 | *.dbproj.schemaview 243 | *.jfm 244 | *.pfx 245 | *.publishsettings 246 | orleans.codegen.cs 247 | 248 | # Including strong name files can present a security risk 249 | # (https://github.com/github/gitignore/pull/2483#issue-259490424) 250 | #*.snk 251 | 252 | # Since there are multiple workflows, uncomment next line to ignore bower_components 253 | # (https://github.com/github/gitignore/pull/1529#issuecomment-104372622) 254 | #bower_components/ 255 | 256 | # RIA/Silverlight projects 257 | Generated_Code/ 258 | 259 | # Backup & report files from converting an old project file 260 | # to a newer Visual Studio version. Backup files are not needed, 261 | # because we have git ;-) 262 | _UpgradeReport_Files/ 263 | Backup*/ 264 | UpgradeLog*.XML 265 | UpgradeLog*.htm 266 | ServiceFabricBackup/ 267 | *.rptproj.bak 268 | 269 | # SQL Server files 270 | *.mdf 271 | *.ldf 272 | *.ndf 273 | 274 | # Business Intelligence projects 275 | *.rdl.data 276 | *.bim.layout 277 | *.bim_*.settings 278 | *.rptproj.rsuser 279 | *- [Bb]ackup.rdl 280 | *- [Bb]ackup ([0-9]).rdl 281 | *- [Bb]ackup ([0-9][0-9]).rdl 282 | 283 | # Microsoft Fakes 284 | FakesAssemblies/ 285 | 286 | # GhostDoc plugin setting file 287 | *.GhostDoc.xml 288 | 289 | # Node.js Tools for Visual Studio 290 | .ntvs_analysis.dat 291 | node_modules/ 292 | 293 | # Visual Studio 6 build log 294 | *.plg 295 | 296 | # Visual Studio 6 workspace options file 297 | *.opt 298 | 299 | # Visual Studio 6 auto-generated workspace file (contains which files were open etc.) 300 | *.vbw 301 | 302 | # Visual Studio 6 auto-generated project file (contains which files were open etc.) 303 | *.vbp 304 | 305 | # Visual Studio 6 workspace and project file (working project files containing files to include in project) 306 | *.dsw 307 | *.dsp 308 | 309 | # Visual Studio 6 technical files 310 | 311 | # Visual Studio LightSwitch build output 312 | **/*.HTMLClient/GeneratedArtifacts 313 | **/*.DesktopClient/GeneratedArtifacts 314 | **/*.DesktopClient/ModelManifest.xml 315 | **/*.Server/GeneratedArtifacts 316 | **/*.Server/ModelManifest.xml 317 | _Pvt_Extensions 318 | 319 | # Paket dependency manager 320 | .paket/paket.exe 321 | paket-files/ 322 | 323 | # FAKE - F# Make 324 | .fake/ 325 | 326 | # CodeRush personal settings 327 | .cr/personal 328 | 329 | # Python Tools for Visual Studio (PTVS) 330 | __pycache__/ 331 | *.pyc 332 | 333 | # Cake - Uncomment if you are using it 334 | # tools/** 335 | # !tools/packages.config 336 | 337 | # Tabs Studio 338 | *.tss 339 | 340 | # Telerik's JustMock configuration file 341 | *.jmconfig 342 | 343 | # BizTalk build output 344 | *.btp.cs 345 | *.btm.cs 346 | *.odx.cs 347 | *.xsd.cs 348 | 349 | # OpenCover UI analysis results 350 | OpenCover/ 351 | 352 | # Azure Stream Analytics local run output 353 | ASALocalRun/ 354 | 355 | # MSBuild Binary and Structured Log 356 | *.binlog 357 | 358 | # NVidia Nsight GPU debugger configuration file 359 | *.nvuser 360 | 361 | # MFractors (Xamarin productivity tool) working folder 362 | .mfractor/ 363 | 364 | # Local History for Visual Studio 365 | .localhistory/ 366 | 367 | # Visual Studio History (VSHistory) files 368 | .vshistory/ 369 | 370 | # BeatPulse healthcheck temp database 371 | healthchecksdb 372 | 373 | # Backup folder for Package Reference Convert tool in Visual Studio 2017 374 | MigrationBackup/ 375 | 376 | # Ionide (cross platform F# VS Code tools) working folder 377 | .ionide/ 378 | 379 | # Fody - auto-generated XML schema 380 | FodyWeavers.xsd 381 | 382 | # VS Code files for those working on multiple tools 383 | .vscode/* 384 | !.vscode/settings.json 385 | !.vscode/tasks.json 386 | !.vscode/launch.json 387 | !.vscode/extensions.json 388 | *.code-workspace 389 | 390 | # Local History for Visual Studio Code 391 | .history/ 392 | 393 | # Windows Installer files from build outputs 394 | *.cab 395 | *.msi 396 | *.msix 397 | *.msm 398 | *.msp 399 | 400 | # JetBrains Rider 401 | *.sln.iml 402 | 403 | ### VisualStudio Patch ### 404 | # Additional files built by Visual Studio 405 | 406 | # End of https://www.toptal.com/developers/gitignore/api/visualstudio --------------------------------------------------------------------------------