mirror of
				https://github.com/smartfrigde/armcord.git
				synced 2024-08-14 23:56:58 +00:00 
			
		
		
		
	Initial source code upload
This commit is contained in:
		
							parent
							
								
									3fd237446f
								
							
						
					
					
						commit
						101bc63651
					
				
					 41 changed files with 1117 additions and 6272 deletions
				
			
		
							
								
								
									
										2
									
								
								.gitattributes
									
										
									
									
										vendored
									
									
								
							
							
						
						
									
										2
									
								
								.gitattributes
									
										
									
									
										vendored
									
									
								
							|  | @ -1,2 +0,0 @@ | |||
| # Auto detect text files and perform LF normalization | ||||
| * text=auto | ||||
							
								
								
									
										3
									
								
								.gitmodules
									
										
									
									
										vendored
									
									
								
							
							
						
						
									
										3
									
								
								.gitmodules
									
										
									
									
										vendored
									
									
								
							|  | @ -1,3 +0,0 @@ | |||
| [submodule "mods/goosemod"] | ||||
| 	path = mods/goosemod | ||||
| 	url = https://github.com/GooseMod/Extension | ||||
							
								
								
									
										172
									
								
								LICENSE
									
										
									
									
									
								
							
							
						
						
									
										172
									
								
								LICENSE
									
										
									
									
									
								
							|  | @ -1,172 +0,0 @@ | |||
| Open Software License ("OSL") v. 3.0 | ||||
| 
 | ||||
| This Open Software License (the "License") applies to any original work of | ||||
| authorship (the "Original Work") whose owner (the "Licensor") has placed the | ||||
| following licensing notice adjacent to the copyright notice for the Original | ||||
| Work: | ||||
| 
 | ||||
| Licensed under the Open Software License version 3.0 | ||||
| 
 | ||||
| 1) Grant of Copyright License. Licensor grants You a worldwide, royalty-free, | ||||
| non-exclusive, sublicensable license, for the duration of the copyright, to do | ||||
| the following: | ||||
| 
 | ||||
|   a) to reproduce the Original Work in copies, either alone or as part of a | ||||
|   collective work; | ||||
| 
 | ||||
|   b) to translate, adapt, alter, transform, modify, or arrange the Original | ||||
|   Work, thereby creating derivative works ("Derivative Works") based upon the | ||||
|   Original Work; | ||||
| 
 | ||||
|   c) to distribute or communicate copies of the Original Work and Derivative | ||||
|   Works to the public, with the proviso that copies of Original Work or | ||||
|   Derivative Works that You distribute or communicate shall be licensed under | ||||
|   this Open Software License; | ||||
| 
 | ||||
|   d) to perform the Original Work publicly; and | ||||
| 
 | ||||
|   e) to display the Original Work publicly. | ||||
| 
 | ||||
| 2) Grant of Patent License. Licensor grants You a worldwide, royalty-free, | ||||
| non-exclusive, sublicensable license, under patent claims owned or controlled | ||||
| by the Licensor that are embodied in the Original Work as furnished by the | ||||
| Licensor, for the duration of the patents, to make, use, sell, offer for sale, | ||||
| have made, and import the Original Work and Derivative Works. | ||||
| 
 | ||||
| 3) Grant of Source Code License. The term "Source Code" means the preferred | ||||
| form of the Original Work for making modifications to it and all available | ||||
| documentation describing how to modify the Original Work. Licensor agrees to | ||||
| provide a machine-readable copy of the Source Code of the Original Work along | ||||
| with each copy of the Original Work that Licensor distributes. Licensor | ||||
| reserves the right to satisfy this obligation by placing a machine-readable | ||||
| copy of the Source Code in an information repository reasonably calculated to | ||||
| permit inexpensive and convenient access by You for as long as Licensor | ||||
| continues to distribute the Original Work. | ||||
| 
 | ||||
| 4) Exclusions From License Grant. Neither the names of Licensor, nor the names | ||||
| of any contributors to the Original Work, nor any of their trademarks or | ||||
| service marks, may be used to endorse or promote products derived from this | ||||
| Original Work without express prior permission of the Licensor. Except as | ||||
| expressly stated herein, nothing in this License grants any license to | ||||
| Licensor's trademarks, copyrights, patents, trade secrets or any other | ||||
| intellectual property. No patent license is granted to make, use, sell, offer | ||||
| for sale, have made, or import embodiments of any patent claims other than the | ||||
| licensed claims defined in Section 2. No license is granted to the trademarks | ||||
| of Licensor even if such marks are included in the Original Work. Nothing in | ||||
| this License shall be interpreted to prohibit Licensor from licensing under | ||||
| terms different from this License any Original Work that Licensor otherwise | ||||
| would have a right to license. | ||||
| 
 | ||||
| 5) External Deployment. The term "External Deployment" means the use, | ||||
| distribution, or communication of the Original Work or Derivative Works in any | ||||
| way such that the Original Work or Derivative Works may be used by anyone | ||||
| other than You, whether those works are distributed or communicated to those | ||||
| persons or made available as an application intended for use over a network. | ||||
| As an express condition for the grants of license hereunder, You must treat | ||||
| any External Deployment by You of the Original Work or a Derivative Work as a | ||||
| distribution under section 1(c). | ||||
| 
 | ||||
| 6) Attribution Rights. You must retain, in the Source Code of any Derivative | ||||
| Works that You create, all copyright, patent, or trademark notices from the | ||||
| Source Code of the Original Work, as well as any notices of licensing and any | ||||
| descriptive text identified therein as an "Attribution Notice." You must cause | ||||
| the Source Code for any Derivative Works that You create to carry a prominent | ||||
| Attribution Notice reasonably calculated to inform recipients that You have | ||||
| modified the Original Work. | ||||
| 
 | ||||
| 7) Warranty of Provenance and Disclaimer of Warranty. Licensor warrants that | ||||
| the copyright in and to the Original Work and the patent rights granted herein | ||||
| by Licensor are owned by the Licensor or are sublicensed to You under the | ||||
| terms of this License with the permission of the contributor(s) of those | ||||
| copyrights and patent rights. Except as expressly stated in the immediately | ||||
| preceding sentence, the Original Work is provided under this License on an "AS | ||||
| IS" BASIS and WITHOUT WARRANTY, either express or implied, including, without | ||||
| limitation, the warranties of non-infringement, merchantability or fitness for | ||||
| a particular purpose. THE ENTIRE RISK AS TO THE QUALITY OF THE ORIGINAL WORK | ||||
| IS WITH YOU. This DISCLAIMER OF WARRANTY constitutes an essential part of this | ||||
| License. No license to the Original Work is granted by this License except | ||||
| under this disclaimer. | ||||
| 
 | ||||
| 8) Limitation of Liability. Under no circumstances and under no legal theory, | ||||
| whether in tort (including negligence), contract, or otherwise, shall the | ||||
| Licensor be liable to anyone for any indirect, special, incidental, or | ||||
| consequential damages of any character arising as a result of this License or | ||||
| the use of the Original Work including, without limitation, damages for loss | ||||
| of goodwill, work stoppage, computer failure or malfunction, or any and all | ||||
| other commercial damages or losses. This limitation of liability shall not | ||||
| apply to the extent applicable law prohibits such limitation. | ||||
| 
 | ||||
| 9) Acceptance and Termination. If, at any time, You expressly assented to this | ||||
| License, that assent indicates your clear and irrevocable acceptance of this | ||||
| License and all of its terms and conditions. If You distribute or communicate | ||||
| copies of the Original Work or a Derivative Work, You must make a reasonable | ||||
| effort under the circumstances to obtain the express assent of recipients to | ||||
| the terms of this License. This License conditions your rights to undertake | ||||
| the activities listed in Section 1, including your right to create Derivative | ||||
| Works based upon the Original Work, and doing so without honoring these terms | ||||
| and conditions is prohibited by copyright law and international treaty. | ||||
| Nothing in this License is intended to affect copyright exceptions and | ||||
| limitations (including "fair use" or "fair dealing"). This License shall | ||||
| terminate immediately and You may no longer exercise any of the rights granted | ||||
| to You by this License upon your failure to honor the conditions in Section | ||||
| 1(c). | ||||
| 
 | ||||
| 10) Termination for Patent Action. This License shall terminate automatically | ||||
| and You may no longer exercise any of the rights granted to You by this | ||||
| License as of the date You commence an action, including a cross-claim or | ||||
| counterclaim, against Licensor or any licensee alleging that the Original Work | ||||
| infringes a patent. This termination provision shall not apply for an action | ||||
| alleging patent infringement by combinations of the Original Work with other | ||||
| software or hardware. | ||||
| 
 | ||||
| 11) Jurisdiction, Venue and Governing Law. Any action or suit relating to this | ||||
| License may be brought only in the courts of a jurisdiction wherein the | ||||
| Licensor resides or in which Licensor conducts its primary business, and under | ||||
| the laws of that jurisdiction excluding its conflict-of-law provisions. The | ||||
| application of the United Nations Convention on Contracts for the | ||||
| International Sale of Goods is expressly excluded. Any use of the Original | ||||
| Work outside the scope of this License or after its termination shall be | ||||
| subject to the requirements and penalties of copyright or patent law in the | ||||
| appropriate jurisdiction. This section shall survive the termination of this | ||||
| License. | ||||
| 
 | ||||
| 12) Attorneys' Fees. In any action to enforce the terms of this License or | ||||
| seeking damages relating thereto, the prevailing party shall be entitled to | ||||
| recover its costs and expenses, including, without limitation, reasonable | ||||
| attorneys' fees and costs incurred in connection with such action, including | ||||
| any appeal of such action. This section shall survive the termination of this | ||||
| License. | ||||
| 
 | ||||
| 13) Miscellaneous. If any provision of this License is held to be | ||||
| unenforceable, such provision shall be reformed only to the extent necessary | ||||
| to make it enforceable. | ||||
| 
 | ||||
| 14) Definition of "You" in This License. "You" throughout this License, | ||||
| whether in upper or lower case, means an individual or a legal entity | ||||
| exercising rights under, and complying with all of the terms of, this License. | ||||
| For legal entities, "You" includes any entity that controls, is controlled by, | ||||
| or is under common control with you. For purposes of this definition, | ||||
| "control" means (i) the power, direct or indirect, to cause the direction or | ||||
| management of such entity, whether by contract or otherwise, or (ii) ownership | ||||
| of fifty percent (50%) or more of the outstanding shares, or (iii) beneficial | ||||
| ownership of such entity. | ||||
| 
 | ||||
| 15) Right to Use. You may use the Original Work in all ways not otherwise | ||||
| restricted or conditioned by this License or by law, and Licensor promises not | ||||
| to interfere with or be responsible for such uses by You. | ||||
| 
 | ||||
| 16) Modification of This License. This License is Copyright © 2005 Lawrence | ||||
| Rosen. Permission is granted to copy, distribute, or communicate this License | ||||
| without modification. Nothing in this License permits You to modify this | ||||
| License as applied to the Original Work or to Derivative Works. However, You | ||||
| may modify the text of this License and copy, distribute or communicate your | ||||
| modified version (the "Modified License") and apply it to other original works | ||||
| of authorship subject to the following conditions: (i) You may not indicate in | ||||
| any way that your Modified License is the "Open Software License" or "OSL" and | ||||
| you may not use those names in the name of your Modified License; (ii) You | ||||
| must replace the notice specified in the first paragraph above with the notice | ||||
| "Licensed under <insert your license name here>" or with a notice of your own | ||||
| that is not confusingly similar to the notice in this License; and (iii) You | ||||
| may not claim that your original works are open source software unless your | ||||
| Modified License has been approved by Open Source Initiative (OSI) and You | ||||
| comply with its license review and certification process. | ||||
|  | @ -1,5 +1,8 @@ | |||
| ### THIS IS EXPERIMENTAL REWRITE CODE | ||||
| <h1 align="center"> | ||||
| <img src="https://armcord.vercel.app/armcord_full_logo.png" width="720"> | ||||
| </h1> | ||||
| 
 | ||||
| #  | ||||
| ArmCord is a custom alternative Discord client made for people on lower-end devices and ARM architecture that want custom Discord experience. It uses [Cumcord](https://cumcord.com) for custom themes and plugins! | ||||
| 
 | ||||
| # How to run/install it? | ||||
|  |  | |||
										
											Binary file not shown.
										
									
								
							| Before Width: | Height: | Size: 81 KiB | 
							
								
								
									
										
											BIN
										
									
								
								ac_plug.ico
									
										
									
									
									
								
							
							
						
						
									
										
											BIN
										
									
								
								ac_plug.ico
									
										
									
									
									
								
							
										
											Binary file not shown.
										
									
								
							| Before Width: | Height: | Size: 107 KiB | 
							
								
								
									
										
											BIN
										
									
								
								ac_plug.png
									
										
									
									
									
								
							
							
						
						
									
										
											BIN
										
									
								
								ac_plug.png
									
										
									
									
									
								
							
										
											Binary file not shown.
										
									
								
							| Before Width: | Height: | Size: 38 KiB | 
							
								
								
									
										2
									
								
								build.sh
									
										
									
									
									
								
							
							
						
						
									
										2
									
								
								build.sh
									
										
									
									
									
								
							|  | @ -1,2 +0,0 @@ | |||
| npm run package | ||||
| ./dist/linux-unpacked/armcord | ||||
							
								
								
									
										
											BIN
										
									
								
								build/icon.ico
									
										
									
									
									
								
							
							
						
						
									
										
											BIN
										
									
								
								build/icon.ico
									
										
									
									
									
								
							
										
											Binary file not shown.
										
									
								
							| Before Width: | Height: | Size: 107 KiB | 
							
								
								
									
										
											BIN
										
									
								
								build/icon.png
									
										
									
									
									
								
							
							
						
						
									
										
											BIN
										
									
								
								build/icon.png
									
										
									
									
									
								
							
										
											Binary file not shown.
										
									
								
							| Before Width: | Height: | Size: 38 KiB | 
							
								
								
									
										108
									
								
								index.html
									
										
									
									
									
								
							
							
						
						
									
										108
									
								
								index.html
									
										
									
									
									
								
							|  | @ -1,108 +0,0 @@ | |||
| <!DOCTYPE html> | ||||
| <html lang="en"> | ||||
| 
 | ||||
| <head> | ||||
|   <meta charset="UTF-8"/> | ||||
|   <title>ArmCord</title> | ||||
|   <script> | ||||
|     window.onload = setTimeout(function() { | ||||
|       if (document.getElementById("ac-channel").innerHTML == "stable") { | ||||
|         window.location.href = "https://discord.com/app"; | ||||
|       } else if (document.getElementById("ac-channel").innerHTML == "canary") { | ||||
|         window.location.href = "https://canary.discord.com/app"; | ||||
|       } else if (document.getElementById("ac-channel").innerHTML == "ptb") { | ||||
|         window.location.href = "https://ptb.discord.com/app"; | ||||
|       } else if (document.getElementById("ac-channel").innerHTML == "foss") { | ||||
|         window.location.href = "https://dev.fosscord.com/app"; | ||||
|       } else { | ||||
|         window.location.href = "https://discord.com/app"; | ||||
|       }; | ||||
|     }, 3000); | ||||
|     </script> | ||||
|   <style> | ||||
|      @import url("https://kckarnige.github.io/femboi_owo/discord-font.css"); | ||||
| 
 | ||||
|     :root { | ||||
|       background-color: #2c2f33; | ||||
|       --header-secondary: #b9bbbe; | ||||
|       --header-primary: #fff; | ||||
|       --background-tertiary: #202225; | ||||
|     } | ||||
| 
 | ||||
|     body { | ||||
|       color: white; | ||||
|     } | ||||
| 
 | ||||
|     p { | ||||
|       color: #8e9297; | ||||
|       text-align: center; | ||||
|       font-weight: 100; | ||||
|       transform: translateY(-185%); | ||||
|       font-family: Whitney,Helvetica Neue,Helvetica,Arial,sans-serif; | ||||
|       text-rendering: optimizeLegibility; | ||||
|       font-style: italic; | ||||
|     } | ||||
| 
 | ||||
|     h1 { | ||||
|       font-size: 0px; | ||||
|       text-align: center; | ||||
|       transform: translateY(-105%); | ||||
|     } | ||||
| 
 | ||||
|     h1:before { | ||||
|       content: "ARM"; | ||||
|       color: #7289da; | ||||
|       font-weight: normal; | ||||
|       font-family: Helvetica, sans-serif; | ||||
|       font-size: 32px; | ||||
|     } | ||||
| 
 | ||||
|     h1:after { | ||||
|       content: "Cord"; | ||||
|       color: #ffffff; | ||||
|       font-weight: normal; | ||||
|       font-family: Discordinated; | ||||
|       font-size: 32px; | ||||
|     } | ||||
| 
 | ||||
|     span { | ||||
|       text-align: center; | ||||
|     } | ||||
| 
 | ||||
|     .logo { | ||||
|       display: block; | ||||
|       margin-left: auto; | ||||
|       margin-right: auto; | ||||
|       max-height: 204px; | ||||
|       max-width: 204px; | ||||
|       transform: translateY(5%); | ||||
|     } | ||||
| 
 | ||||
|     .container { | ||||
|       position: fixed; | ||||
|       top: 50%; | ||||
|       left: 50%; | ||||
|       color: #fff; | ||||
|       transform: translate(-50%, -50%); | ||||
|     } | ||||
| 
 | ||||
|     #ac-channel { | ||||
|       display: none; | ||||
|     } | ||||
|   </style> | ||||
| </head> | ||||
| 
 | ||||
| <body> | ||||
|    | ||||
|     <div class="container"> | ||||
|   <video autoplay loop class="logo"> | ||||
|     <source src="https://discord.com/assets/3b0d96ed8113994f3d139088726cfecd.webm" type="video/webm"> | ||||
|   </video> | ||||
|   <p>Loading...</p> | ||||
|     <h1></h1> | ||||
|   <p id="ac-channel"></p> | ||||
| </div> | ||||
| 
 | ||||
| </body> | ||||
| 
 | ||||
| </html> | ||||
							
								
								
									
										141
									
								
								main.js
									
										
									
									
									
								
							
							
						
						
									
										141
									
								
								main.js
									
										
									
									
									
								
							|  | @ -1,141 +0,0 @@ | |||
| // Modules to control application life and create native browser window
 | ||||
| const { app, BrowserWindow, session, Tray, Menu } = require("electron"); | ||||
| const path = require("path"); | ||||
| const contextMenu = require("electron-context-menu"); | ||||
| const os = require("os"); | ||||
| require("v8-compile-cache"); | ||||
| require("./utils/updater.js") | ||||
| if (require("./utils/ArmCord.js").Titlebar === "native") { | ||||
|   var frame = true | ||||
| } else { | ||||
|   var frame = false | ||||
| } | ||||
| 
 | ||||
| if (os.type() == 'Linux'){ | ||||
|   var iconformat = __dirname + "/ac_icon_transparent.png"  | ||||
| } else {  | ||||
|   console.log("Running Non-Linux") | ||||
|   var iconformat = __dirname + "/ac_plug.ico"; | ||||
| } | ||||
| 
 | ||||
| contextMenu({ | ||||
|   prepend: (defaultActions, parameters, browserWindow) => [ | ||||
|     { | ||||
|       label: "Image", | ||||
|       // Only show it when right-clicking images
 | ||||
|       visible: parameters.mediaType === "image", | ||||
|     }, | ||||
|   ], | ||||
| }); | ||||
| contextMenu.showSearchWithGoogle = false; | ||||
| 
 | ||||
| let mainWindow; | ||||
| function createWindow() { | ||||
|   mainWindow = new BrowserWindow({ | ||||
|     width: 800, | ||||
|     height: 600, | ||||
|     icon: iconformat, | ||||
|     title: "ArmCord", | ||||
|     frame: frame, | ||||
|     webPreferences: { | ||||
|       preload: path.join(__dirname, "preload.js"), | ||||
|       enableRemoteModule: true, | ||||
|       nodeIntegration: false, | ||||
|     }, | ||||
|   }); | ||||
|   var appIcon = new Tray(iconformat); | ||||
|   mainWindow.webContents.userAgent = | ||||
|     "Mozilla/5.0 (X12; Linux x86) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36"; //fake useragent
 | ||||
|   mainWindow.loadFile("index.html"); | ||||
|   mainWindow.focus(); | ||||
|   mainWindow.webContents.on("new-window", function (e, url) { | ||||
|     e.preventDefault(); | ||||
|     require("electron").shell.openExternal(url); | ||||
|   }); | ||||
|   // Open the DevTools.
 | ||||
|   // mainWindow.webContents.openDevTools()
 | ||||
|   var contextMenu = Menu.buildFromTemplate([ | ||||
|     { | ||||
|       label: "Show App", | ||||
|       click: function () { | ||||
|         mainWindow.show(); | ||||
|       }, | ||||
|     }, | ||||
|     { | ||||
|       label: "Support Discord Server", | ||||
|       click: function () { | ||||
|         mainWindow.show(); | ||||
|         mainWindow.loadURL("https://discord.gg/F25bc4RYDt"); | ||||
|       }, | ||||
|     }, | ||||
|     { | ||||
|       label: "Quit", | ||||
|       click: function () { | ||||
|         mainWindow.destroy(); | ||||
|         app.isQuiting = true; | ||||
|         app.quit(); | ||||
|       }, | ||||
|     }, | ||||
|   ]); | ||||
|   appIcon.on("click", () => { | ||||
|     mainWindow.show() | ||||
|   }); | ||||
| 
 | ||||
| 
 | ||||
|   appIcon.setContextMenu(contextMenu); | ||||
| 
 | ||||
|   // Emitted when the window is closed.
 | ||||
|   mainWindow.on("close", function (event) { | ||||
|     event.preventDefault(); | ||||
|     mainWindow.hide(); | ||||
|   }); | ||||
| 
 | ||||
|   mainWindow.on("show", function () { | ||||
|     //temporary fix
 | ||||
|     try { | ||||
|       appIcon(); | ||||
|     } catch (error) { | ||||
|       //console.error(error);
 | ||||
|       // expected output: TypeError: appIcon is not a function
 | ||||
|     } | ||||
|   }); | ||||
| } | ||||
| 
 | ||||
| // This method will be called when Electron has finished
 | ||||
| // initialization and is ready to create browser windows.
 | ||||
| // Some APIs can only be used after this event occurs.
 | ||||
| app.whenReady().then(() => { | ||||
|   createWindow(); | ||||
|   require("./utils/mod.js"); | ||||
|   require("./utils/plugin.js"); | ||||
|   session | ||||
|     .fromPartition("some-partition") | ||||
|     .setPermissionRequestHandler((webContents, permission, callback) => { | ||||
|       const url = webContents.getURL(); //unused?
 | ||||
| 
 | ||||
|       if (permission === "notifications") { | ||||
|         // Approves the permissions request
 | ||||
|         callback(true); | ||||
|       } | ||||
|       if (permission === "microphone") { | ||||
|         // Approves the permissions request
 | ||||
|         callback(true); | ||||
|       } | ||||
|       if (!url.startsWith("discord://")) { | ||||
|         // Denies the permissions request
 | ||||
|         return callback(false); | ||||
|       } | ||||
|     }); | ||||
|   app.on("activate", function () { | ||||
|     // On macOS it's common to re-create a window in the app when the
 | ||||
|     // dock icon is clicked and there are no other windows open.
 | ||||
|     if (BrowserWindow.getAllWindows().length === 0) createWindow(); | ||||
|   }); | ||||
| }); | ||||
| 
 | ||||
| // Quit when all windows are closed, except on macOS. There, it's common
 | ||||
| // for applications and their menu bar to stay active until the user quits
 | ||||
| // explicitly with Cmd + Q.
 | ||||
| app.on("window-all-closed", function () { | ||||
|   if (process.platform !== "darwin") app.quit(); | ||||
| }); | ||||
							
								
								
									
										161
									
								
								manager.css
									
										
									
									
									
								
							
							
						
						
									
										161
									
								
								manager.css
									
										
									
									
									
								
							|  | @ -1,161 +0,0 @@ | |||
| @import url("https://kckarnige.github.io/femboi_owo/discord-font.css"); | ||||
| 
 | ||||
| :root { | ||||
|     background-color: #2f3136; | ||||
|     user-select: none; | ||||
|     --header-secondary: #b9bbbe; | ||||
|     --header-primary: #fff; | ||||
|     --background-tertiary: #202225; | ||||
| } | ||||
| 
 | ||||
| body { | ||||
|     color: white; | ||||
| } | ||||
| 
 | ||||
| h1 { | ||||
|     font-size: 0; | ||||
|     text-align: center; | ||||
|     transform: translateY(-105%); | ||||
| } | ||||
| 
 | ||||
| .logo:before { | ||||
|     content: "ARM"; | ||||
|     color: #7289da; | ||||
|     font-weight: normal; | ||||
|     font-family: Helvetica, sans-serif; | ||||
| } | ||||
| 
 | ||||
| span { | ||||
|     text-align: center; | ||||
| } | ||||
| 
 | ||||
| .logo { | ||||
|     color: #ffffff; | ||||
|     font-weight: normal; | ||||
|     font-family: Discordinated; | ||||
|     font-size: 32px; | ||||
|     text-align: center; | ||||
| } | ||||
| .disabled { | ||||
|     text-align: center; | ||||
|     font-weight: normal; | ||||
|     font-family: Helvetica, sans-serif; | ||||
| } | ||||
| .container { | ||||
|     position: fixed; | ||||
|     top: 50%; | ||||
|     left: 50%; | ||||
|     color: #fff; | ||||
|     transform: translate(-50%, -50%); | ||||
| } | ||||
| 
 | ||||
| button.back-btn { | ||||
|     position: absolute; | ||||
|     background-color: #7289da; | ||||
|     font-family: Whitney, "Helvetica Neue", Helvetica, Arial, sans-serif; | ||||
|     color: #ffffff; | ||||
|     padding: 4px; | ||||
|     border-radius: 5px; | ||||
|     width: 105px; | ||||
|     height: 25px; | ||||
|     margin-top: 5px; | ||||
|     margin-left: 5px; | ||||
|     left: 0; | ||||
|     text-align: center; | ||||
|     border-style: none; | ||||
|     outline: none; | ||||
| } | ||||
| 
 | ||||
| button.back-btn:hover { | ||||
|     background-color: #687dc6; | ||||
|     border-style: none; | ||||
|     outline: none; | ||||
|     cursor: pointer; | ||||
| } | ||||
| 
 | ||||
| button.back-btn:active { | ||||
|     background-color: #5c6fb1; | ||||
| } | ||||
| 
 | ||||
| button#open-themes-btn { | ||||
|     position: absolute; | ||||
|     background-color: #7289da; | ||||
|     font-family: Whitney, "Helvetica Neue", Helvetica, Arial, sans-serif; | ||||
|     color: #ffffff; | ||||
|     padding: 4px; | ||||
|     border-radius: 5px; | ||||
|     width: 105px; | ||||
|     height: 25px; | ||||
|     margin-top: 5px; | ||||
|     margin-right: 5px; | ||||
|     right: 0; | ||||
|     text-align: center; | ||||
|     border-style: none; | ||||
|     outline: none; | ||||
| } | ||||
| 
 | ||||
| button#open-themes-btn:hover { | ||||
|     background-color: #687dc6; | ||||
|     border-style: none; | ||||
|     outline: none; | ||||
|     cursor: pointer; | ||||
| } | ||||
| 
 | ||||
| button#open-themes-btn:active { | ||||
|     background-color: #5c6fb1; | ||||
| } | ||||
| 
 | ||||
| #tm-list { | ||||
|     position: absolute; | ||||
|     top: 100px; | ||||
|     left: 50%; | ||||
|     transform: translateX(-50%); | ||||
| } | ||||
| #tm-disabled { | ||||
|     position: absolute; | ||||
|     top: 100px; | ||||
|     left: 50%; | ||||
|     transform: translateX(-50%); | ||||
| } | ||||
| #tm-list-item { | ||||
|     background: #23272a; | ||||
|     font-family: Whitney, Helvetica Neue, Helvetica, Arial, sans-serif; | ||||
|     width: 100%; | ||||
|     border-radius: 5px; | ||||
|     padding: 10px 10px 18px; | ||||
|     width: 420px; | ||||
|     max-width: 820px; | ||||
| } | ||||
| 
 | ||||
| #theme-name { | ||||
|     color: #7289da; | ||||
|     font-weight: 400; | ||||
|     font-size: 20px; | ||||
| } | ||||
| 
 | ||||
| #theme-author { | ||||
|     color: #99aab5; | ||||
|     font-size: 12px; | ||||
| } | ||||
| 
 | ||||
| #theme-description { | ||||
|     color: #b9bbbe; | ||||
|     font-size: 15px; | ||||
|     position: relative; | ||||
|     top: 8px; | ||||
|     width: 75%; | ||||
| } | ||||
| 
 | ||||
| #ac-channel { | ||||
|     display: none; | ||||
|   } | ||||
| 
 | ||||
| ::-webkit-scrollbar { | ||||
|     width: 0.4em; | ||||
|     background: transparent; | ||||
| } | ||||
| 
 | ||||
| ::-webkit-scrollbar-thumb { | ||||
|     background: #202225; | ||||
|     border-radius: 25px; | ||||
| } | ||||
							
								
								
									
										18
									
								
								manager.html
									
										
									
									
									
								
							
							
						
						
									
										18
									
								
								manager.html
									
										
									
									
									
								
							|  | @ -1,18 +0,0 @@ | |||
| <!DOCTYPE html> | ||||
| <html lang="en"> | ||||
|   <head> | ||||
|     <meta charset="UTF-8" /> | ||||
|     <title>ArmCord Manager</title> | ||||
|     <link rel="stylesheet" href="manager.css"> | ||||
|   </head> | ||||
| 
 | ||||
|   <body> | ||||
|     <button class="back-btn">Back to Discord</button> | ||||
|     <button id="open-themes-btn">Themes Folder</button> | ||||
|     <p class="logo">Cord Manager</p> | ||||
|     <div id="tm-list"></div> | ||||
|     <p class="disabled">Disabled Themes:</p> | ||||
|     <div id="tm-disabled"></div> | ||||
|     <p id="ac-channel"></p> | ||||
|   </body> | ||||
| </html> | ||||
|  | @ -1,42 +0,0 @@ | |||
| const cspAllowAll = [ | ||||
|     'connect-src', | ||||
|     'style-src', | ||||
|     'img-src', | ||||
|     'font-src' | ||||
|   ]; | ||||
|   const corsAllowUrls = [ | ||||
|     'https://github.com/GooseMod/GooseMod/releases/download/dev/index.js', | ||||
|     'https://github-releases.githubusercontent.com/', | ||||
|     'https://api.goosemod.com/inject.js', | ||||
|     'https://raw.githubusercontent.com/Cumcord/Cumcord/stable/dist/build.js' | ||||
|   ]; | ||||
|    | ||||
|   chrome.webRequest.onHeadersReceived.addListener(({ responseHeaders, url }) => { | ||||
|     let csp = responseHeaders.find((x) => x.name === 'content-security-policy'); | ||||
|    | ||||
|     if (csp) { | ||||
|       for (let p of cspAllowAll) { | ||||
|         csp.value = csp.value.replace(`${p}`, `${p} * blob: data:`); // * does not include data: URIs
 | ||||
|       } | ||||
|    | ||||
|       // Fix Discord's broken CSP which disallows unsafe-inline due to having a nonce (which they don't even use?)
 | ||||
|       csp.value = csp.value.replace(/'nonce-.*?' /, ''); | ||||
|     } | ||||
|     if (corsAllowUrls.some((x) => url.startsWith(x))) { | ||||
|       let cors = responseHeaders.find((x) => x.name === 'access-control-allow-origin'); | ||||
|       cors.value = '*'; | ||||
|     } | ||||
|       return { | ||||
|       responseHeaders | ||||
|     }; | ||||
| 
 | ||||
|   }, | ||||
|    | ||||
|     { | ||||
|       urls: [ | ||||
|         '*://*.discord.com/*' | ||||
|       ] | ||||
|     }, | ||||
|    | ||||
|     ['blocking', 'responseHeaders'] | ||||
|   ); | ||||
|  | @ -1,9 +0,0 @@ | |||
| const load = async () => { | ||||
| 	console.log("[CCExt] Loading Cumcord..."); | ||||
| 	const response = await fetch("https://raw.githubusercontent.com/Cumcord/Cumcord/stable/dist/build.js"); | ||||
| 	const text = await response.text() | ||||
| 	eval(text); | ||||
| } | ||||
| const el = document.createElement('script'); | ||||
| el.appendChild(document.createTextNode(`(${load.toString()})();`)); | ||||
| document.body.appendChild(el); | ||||
|  | @ -1,25 +0,0 @@ | |||
| { | ||||
|     "name": "Cumcord for Web", | ||||
|     "description": "A heavy, throbbing, and easy to use cum expeller; now in your browser.", | ||||
|     "version": "0.0.1", | ||||
|     "author": "Drake", | ||||
|     "background": { | ||||
|         "scripts": [ | ||||
|             "background.js" | ||||
|         ] | ||||
|     }, | ||||
| 
 | ||||
|     "content_scripts": [ | ||||
|         { | ||||
|             "matches": ["*://*.discord.com/*"], | ||||
|             "js": ["content.js"] | ||||
|         } | ||||
|     ], | ||||
|     "permissions": [ | ||||
|         "storage", | ||||
|         "webRequest", | ||||
|         "webRequestBlocking", | ||||
|         "*://*.discord.com/*" | ||||
|     ], | ||||
|     "manifest_version": 2 | ||||
| } | ||||
							
								
								
									
										5560
									
								
								package-lock.json
									
										
									
										generated
									
									
									
								
							
							
						
						
									
										5560
									
								
								package-lock.json
									
										
									
										generated
									
									
									
								
							
										
											
												File diff suppressed because it is too large
												Load diff
											
										
									
								
							
							
								
								
									
										85
									
								
								package.json
									
										
									
									
									
								
							
							
						
						
									
										85
									
								
								package.json
									
										
									
									
									
								
							|  | @ -1,71 +1,32 @@ | |||
| { | ||||
|   "name": "ArmCord", | ||||
|   "version": "2.7.0", | ||||
|   "description": "ArmCord is a Discord client made for ARM Linux that allows you to customize your experience.", | ||||
|   "main": "main.js", | ||||
|   "name": "armcord", | ||||
|   "version": "3.0.0", | ||||
|   "description": "ArmCord is a custom client designed to enhance your Discord experience while keeping everything lightweight.", | ||||
|   "main": "src/index.ts", | ||||
|   "scripts": { | ||||
|     "start": "./build.sh", | ||||
|     "test": "echo \"Error: no test specified\" && exit 1", | ||||
|     "package": "electron-builder --dir", | ||||
|     "make": "electron-builder", | ||||
|     "linux-build": "electron-builder --linux deb tar.gz rpm AppImage", | ||||
|     "windows-build": "electron-builder --windows nsis portable zip" | ||||
|   }, | ||||
|   "author": "smartfrigde <smartfridge1337@protonmail.com>", | ||||
|   "license": "OSL-3.0", | ||||
|   "dependencies": { | ||||
|     "electron-context-menu": "^3.0.0", | ||||
|     "electron-dl": "^3.2.1", | ||||
|     "electron-localshortcut": "^3.2.1", | ||||
|     "electron-store": "^8.0.0", | ||||
|     "electron-updater": "^4.3.9", | ||||
|     "unzipper": "^0.10.1", | ||||
|     "v8-compile-cache": "^2.3.0" | ||||
|   }, | ||||
|   "devDependencies": { | ||||
|     "electron": "^13.3.0", | ||||
|     "electron-builder": "^22.11.7" | ||||
|     "build": "tsc", | ||||
|     "watch": "tsc -w", | ||||
|     "start": "npm run build && npm run copy-files && electron ./dist/main.js", | ||||
|     "copy-files": "copyfiles -u 1 src/**/*.html src/**/*.css dist/ && copyfiles package.json dist/" | ||||
|   }, | ||||
|   "repository": { | ||||
|     "type": "git", | ||||
|     "url": "git+https://github.com/smartfrigde/armcord.git" | ||||
|   }, | ||||
|   "keywords": [ | ||||
|     "arm", | ||||
|     "discord", | ||||
|     "electron" | ||||
|   ], | ||||
|   "build": { | ||||
|     "appId": "com.smartfridge.armcord", | ||||
|     "productName": "ArmCord", | ||||
|     "mac": { | ||||
|       "category": "Network", | ||||
|       "extraResources": [ | ||||
|         "./mods/cumcord/*" | ||||
|       ] | ||||
|     }, | ||||
|     "win": { | ||||
|       "extraResources": [ | ||||
|         "./mods/cumcord/*" | ||||
|       ] | ||||
|     }, | ||||
|     "linux": { | ||||
|       "category": "Network", | ||||
|       "extraResources": [ | ||||
|         "./mods/cumcord/*" | ||||
|       ], | ||||
|       "maintainer": "smartfridge1337@protonmail.com", | ||||
|       "target": [ | ||||
|         "deb", | ||||
|         "tar.gz", | ||||
|         "rpm", | ||||
|         "AppImage" | ||||
|       ] | ||||
|     } | ||||
|     "url": "git+https://github.com/armcord/armcord.git" | ||||
|   }, | ||||
|   "author": "smartfrigde", | ||||
|   "license": "OSL-3.0", | ||||
|   "bugs": { | ||||
|     "url": "https://github.com/smartfrigde/armcord/issues", | ||||
|     "email": "smartfridge1337@protonmail.com" | ||||
|     "url": "https://github.com/armcord/armcord/issues" | ||||
|   }, | ||||
|   "homepage": "https://github.com/smartfrigde/armcord#readme" | ||||
|   "homepage": "https://github.com/armcord/armcord#readme", | ||||
|   "devDependencies": { | ||||
|     "electron": "^16.0.5" | ||||
|   }, | ||||
|   "dependencies": { | ||||
|     "@types/electron-json-storage": "^4.5.0", | ||||
|     "@types/node": "^14.18.2", | ||||
|     "copyfiles": "^2.4.1", | ||||
|     "electron-json-storage": "^4.5.0", | ||||
|     "typescript": "^4.5.4" | ||||
|   } | ||||
| } | ||||
|  |  | |||
							
								
								
									
										97
									
								
								preload.js
									
										
									
									
									
								
							
							
						
						
									
										97
									
								
								preload.js
									
										
									
									
									
								
							|  | @ -1,97 +0,0 @@ | |||
| const { remote } = require("electron"); | ||||
| const currentWindow = remote.getCurrentWindow(); | ||||
| const ArmCord = require("./utils/ArmCord.js"); | ||||
| const electronLocalshortcut = require("electron-localshortcut"); | ||||
| require("./utils/theme.js"); | ||||
| require("./utils/bridge.js") | ||||
| require('./utils/titlebar') | ||||
| window.addEventListener("DOMContentLoaded", () => { | ||||
|   if (require("./utils/ArmCord.js").Titlebar == "native") {console.log("Using native titlebar")} else { | ||||
|     //todo
 | ||||
|   } | ||||
| 
 | ||||
|   electronLocalshortcut.register(currentWindow, "F5", () => { | ||||
|     location.reload(); | ||||
|   }); | ||||
|   electronLocalshortcut.register(currentWindow, "F12", () => { | ||||
|     currentWindow.webContents.openDevTools(); | ||||
|   }); | ||||
|   electronLocalshortcut.register(currentWindow, "F1", () => { | ||||
|     require("shell").openExternal("https://support.discord.com/"); | ||||
|   }); | ||||
|   electronLocalshortcut.register(currentWindow, "F2", () => { | ||||
|     window.location.href = "https://discord.gg/invite/F25bc4RYDt"; | ||||
|   }); | ||||
|   electronLocalshortcut.register(currentWindow, "F4", () => { | ||||
|     currentWindow.loadFile("./manager.html"); | ||||
|   }); | ||||
|   require("./utils/capturer.js"); | ||||
| 
 | ||||
|   ArmCord.addStyle(` | ||||
| @import url("https://kckarnige.github.io/femboi_owo/discord-font.css"); | ||||
| :root { | ||||
|   --window-buttons: var(--header-secondary); | ||||
|   --cord-color: var(--header-primary); | ||||
|   --armcord-color: #7289da; | ||||
|   --titlebar-color: var(--background-tertiary); | ||||
| } | ||||
| .base-3dtUhz, .sidebar-2K8pFh { | ||||
|   display: -webkit-box; | ||||
|   display: -ms-flexbox; | ||||
|   display: flex; | ||||
|   -webkit-box-orient: vertical; | ||||
|   -webkit-box-direction: normal; | ||||
|   -ms-flex-direction: column; | ||||
|   overflow: hidden; | ||||
|   border-top-left-radius: 8px; | ||||
| } | ||||
| div.menubar[role="menubar"] { | ||||
|   width: 0px; | ||||
| } | ||||
| .window-title:after { | ||||
|   content: "Cord"; | ||||
|   color: var(--cord-color) !important; | ||||
|   font-weight: normal; | ||||
|   font-size: 14px; | ||||
|   font-family: Discordinated; | ||||
| } | ||||
| .window-title:before { | ||||
|   content: "ARM"; | ||||
|   color: var(--armcord-color); | ||||
|   font-weight: normal; | ||||
|   font-size: 14px; | ||||
|   font-family: Helvetica, sans-serif; | ||||
| } | ||||
| .window-title { | ||||
|   font-size: 0px !important; | ||||
|   margin-left: initial !important; | ||||
|   transform: translate(10px, 0px); | ||||
| } | ||||
| .titlebar { | ||||
|   background: var(--titlebar-color) !important; | ||||
|   font-family: Verdana, Geneva, Tahoma, sans-serif; | ||||
| } | ||||
| .titlebar .window-controls-container .window-icon { | ||||
|   background: var(--window-buttons) !important; | ||||
| } | ||||
| .notice-3bPHh-.colorDefault-22HBa0 { | ||||
|   display: none; | ||||
| } | ||||
| `);
 | ||||
| 
 | ||||
|   ArmCord.addStyle( | ||||
|     `.info-1VyQPT:last-child:before {
 | ||||
|   content: "ArmCord Version: ` +
 | ||||
|       ArmCord.Version + | ||||
|       `";
 | ||||
|   height: auto; | ||||
|   line-height: 16px; | ||||
|   text-align: center; | ||||
|   color: var(--text-muted); | ||||
|   font-size: 12px; | ||||
|   text-transform: none; | ||||
| }` | ||||
|   ); | ||||
| 
 | ||||
|   document.getElementById("ac-channel").innerHTML = ArmCord.Channel; | ||||
| }); | ||||
							
								
								
									
										85
									
								
								src/content/css/setup.css
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										85
									
								
								src/content/css/setup.css
									
										
									
									
									
										Normal file
									
								
							|  | @ -0,0 +1,85 @@ | |||
| /*CSS ONLY FOR INTERNAL USE (setup and loading)*/ | ||||
| @import url("https://kckarnige.github.io/femboi_owo/discord-font.css"); | ||||
| 
 | ||||
| :root { | ||||
|   background-color: #2c2f33; | ||||
|   --header-secondary: #b9bbbe; | ||||
|   --header-primary: #fff; | ||||
|   --background-tertiary: #202225; | ||||
| } | ||||
| 
 | ||||
| body { | ||||
|   color: white; | ||||
| } | ||||
| 
 | ||||
| p { | ||||
|   color: #8e9297; | ||||
|   text-align: center; | ||||
|   font-weight: 100; | ||||
|   transform: translateY(-185%); | ||||
|   font-family: Whitney, Helvetica Neue, Helvetica, Arial, sans-serif; | ||||
|   text-rendering: optimizeLegibility; | ||||
|   font-style: italic; | ||||
| } | ||||
| 
 | ||||
| .logo { | ||||
|   font-size: 0px; | ||||
|   text-align: center; | ||||
|   transform: translateY(-105%); | ||||
| } | ||||
| 
 | ||||
| .logo:before { | ||||
|   content: "ARM"; | ||||
|   color: #7289da; | ||||
|   font-weight: normal; | ||||
|   font-family: Helvetica, sans-serif; | ||||
|   font-size: 32px; | ||||
| } | ||||
| 
 | ||||
| .logo:after { | ||||
|   content: "Cord"; | ||||
|   color: #ffffff; | ||||
|   font-weight: normal; | ||||
|   font-family: Discordinated; | ||||
|   font-size: 32px; | ||||
| } | ||||
| 
 | ||||
| span { | ||||
|   text-align: center; | ||||
| } | ||||
| 
 | ||||
| .logo { | ||||
|   display: block; | ||||
|   margin-left: auto; | ||||
|   margin-right: auto; | ||||
|   max-height: 204px; | ||||
|   max-width: 204px; | ||||
|   transform: translateY(5%); | ||||
| } | ||||
| 
 | ||||
| .container { | ||||
|   position: fixed; | ||||
|   top: 50%; | ||||
|   left: 50%; | ||||
|   color: #fff; | ||||
|   transform: translate(-50%, -50%); | ||||
| } | ||||
| 
 | ||||
| button { | ||||
|     background-color: #7289da; | ||||
|     font-family: Whitney, "Helvetica Neue", Helvetica, Arial, sans-serif; | ||||
|     color: #ffffff; | ||||
|     padding: 4px; | ||||
|     border-radius: 5px; | ||||
|     left: 0; | ||||
|     text-align: center; | ||||
|     border-style: none; | ||||
|     outline: none; | ||||
| } | ||||
| 
 | ||||
| button:hover { | ||||
|     background-color: #687dc6; | ||||
|     border-style: none; | ||||
|     outline: none; | ||||
|     cursor: pointer; | ||||
| } | ||||
							
								
								
									
										114
									
								
								src/content/css/splash.css
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										114
									
								
								src/content/css/splash.css
									
										
									
									
									
										Normal file
									
								
							|  | @ -0,0 +1,114 @@ | |||
| /*MIT License | ||||
| 
 | ||||
| Copyright (c) 2021 GooseMod | ||||
| 
 | ||||
| Permission is hereby granted, free of charge, to any person obtaining a copy | ||||
| of this software and associated documentation files (the "Software"), to deal | ||||
| in the Software without restriction, including without limitation the rights | ||||
| to use, copy, modify, merge, publish, distribute, sublicense, and/or sell | ||||
| copies of the Software, and to permit persons to whom the Software is | ||||
| furnished to do so, subject to the following conditions: | ||||
| 
 | ||||
| The above copyright notice and this permission notice shall be included in all | ||||
| copies or substantial portions of the Software. | ||||
| 
 | ||||
| THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR | ||||
| IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, | ||||
| FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE | ||||
| AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER | ||||
| LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, | ||||
| OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE | ||||
| SOFTWARE.*/ | ||||
| :root { | ||||
|   --background-primary: #282b30; | ||||
|   --background-secondary: rgba(255, 255, 255, 0.1); | ||||
|   --brand-experiment: #5865f2; | ||||
|   --header-primary: #fff; | ||||
|   --text-muted: #72767d; | ||||
| } | ||||
| 
 | ||||
| @font-face { | ||||
|   font-family: Whitney; | ||||
|   font-weight: 400; | ||||
|   font-style: normal; | ||||
|   src: url(https://armcord.smartfridge.space/whitney_400.woff) format("woff"); | ||||
| } | ||||
| 
 | ||||
| html, | ||||
| body { | ||||
|   -webkit-app-region: drag; | ||||
|   overflow: hidden; | ||||
| 
 | ||||
|   margin: 0; | ||||
|   padding: 0; | ||||
|   width: 100%; | ||||
|   height: 100%; | ||||
| 
 | ||||
|   background: var(--background-primary); | ||||
| 
 | ||||
|   display: flex; | ||||
|   flex-direction: column; | ||||
|   justify-content: center; | ||||
|   align-items: center; | ||||
| } | ||||
| 
 | ||||
| * { | ||||
|   font-family: "Whitney", sans-serif; | ||||
| 
 | ||||
|   box-sizing: border-box; | ||||
|   -webkit-user-select: none; | ||||
|   cursor: default; | ||||
| } | ||||
| 
 | ||||
| video { | ||||
|   width: 200px; | ||||
|   height: 150px; | ||||
|   object-fit: cover; | ||||
| } | ||||
| 
 | ||||
| #text { | ||||
|   font-size: 7vw; | ||||
|   text-align: center; | ||||
| 
 | ||||
|   color: var(--header-primary); | ||||
|   font-weight: 400; | ||||
|   font-style: italic; | ||||
|   font-size: 16px; | ||||
| 
 | ||||
|   text-transform: uppercase; | ||||
| 
 | ||||
|   width: 100%; | ||||
| } | ||||
| 
 | ||||
| #bar-container, | ||||
| #bar-fill { | ||||
|   width: 180px; | ||||
|   height: 8px; | ||||
| 
 | ||||
|   border-radius: 4px; | ||||
| 
 | ||||
|   visibility: hidden; | ||||
| } | ||||
| 
 | ||||
| #bar-container { | ||||
|   background-color: var(--background-secondary); | ||||
| 
 | ||||
|   position: relative; | ||||
|   margin-top: 12px; | ||||
| } | ||||
| 
 | ||||
| #bar-fill { | ||||
|   background-color: var(--brand-experiment); | ||||
|   width: 0; | ||||
| } | ||||
| 
 | ||||
| #debug { | ||||
|   position: absolute; | ||||
|   bottom: 6px; | ||||
|   right: 6px; | ||||
| 
 | ||||
|   text-align: right; | ||||
|   font-size: 10px; | ||||
|   color: var(--text-muted); | ||||
|   white-space: pre; | ||||
| } | ||||
							
								
								
									
										123
									
								
								src/content/css/titlebar.css
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										123
									
								
								src/content/css/titlebar.css
									
										
									
									
									
										Normal file
									
								
							|  | @ -0,0 +1,123 @@ | |||
| @import url("https://kckarnige.github.io/femboi_owo/discord-font.css"); | ||||
| :root { | ||||
|   --window-buttons: var(--header-secondary); | ||||
|   --cord-color: var(--header-primary); | ||||
|   --armcord-color: #7289da; | ||||
|   --titlebar-color: var(--background-tertiary); | ||||
| } | ||||
| .titleebar { | ||||
|     position: absolute; | ||||
|     top: 0; | ||||
|     left: 0; | ||||
|     right: 0; | ||||
|     box-sizing: border-box; | ||||
|     width: 100%; | ||||
|     font-size: 13px; | ||||
|     padding: 0 16px; | ||||
|     overflow: hidden; | ||||
|     flex-shrink: 0; | ||||
|     align-items: center; | ||||
|     justify-content: center; | ||||
|     user-select: none; | ||||
|     zoom: 1; | ||||
|     line-height: 22px; | ||||
|     height: 22px; | ||||
|     display: flex; | ||||
|     z-index: 99999; | ||||
|   } | ||||
|   .titlebar { | ||||
|     display: block; | ||||
|     top: 0; | ||||
|     left: 0; | ||||
|     right: 0; | ||||
|     flex-shrink: 0; | ||||
|     overflow: hidden; | ||||
|     zoom: 1; | ||||
|     box-sizing: border-box; | ||||
|     width: 100%; | ||||
|     clear:both; | ||||
|     height: 30px; | ||||
|     line-height: 30px; | ||||
|     background-color: #202225; | ||||
|     -webkit-app-region: drag; | ||||
|     width: 100%; | ||||
|     user-select: none; | ||||
|     -webkit-user-select: none; | ||||
|     position: fixed; | ||||
|     z-index: 99999; | ||||
|      | ||||
|   } | ||||
|   .appMount-3lHmkl{ | ||||
|    | ||||
|   } | ||||
|   .titlebar #window-title { | ||||
|     width: 30%; | ||||
|     height: 100%; | ||||
|     line-height: 30px; | ||||
|     float: left; | ||||
|     padding: 0 0 0 1em; | ||||
|   } | ||||
|    | ||||
|   .titlebar #window-controls-container { | ||||
|     float: right; | ||||
|     width: 150px; | ||||
|     height: 100%; | ||||
|     line-height: 30px; | ||||
|     background-color: #202225; | ||||
|     -webkit-app-region: no-drag; | ||||
|   } | ||||
|    | ||||
|   .titlebar #window-controls-container #minimize, | ||||
|   .titlebar #window-controls-container #maximize, | ||||
|   .titlebar #window-controls-container #quit { | ||||
|     float: left; | ||||
|     height: 100%; | ||||
|     width: 33%; | ||||
|     text-align: center; | ||||
|     color: #f7f7f7; | ||||
|     cursor: default; | ||||
|   } | ||||
|    | ||||
|   .titlebar #window-controls-container #minimize:hover { | ||||
|     background-color: #99AAB5; | ||||
|   } | ||||
|   .titlebar #window-controls-container #maximize:hover { | ||||
|     background-color: #99AAB5; | ||||
|   } | ||||
|   .titlebar #window-controls-container #quit:hover { | ||||
|     background-color: #F04747; | ||||
|   } | ||||
|   .titlebar #window-controls-container #quit { | ||||
|     background-color: #f7f7f7; | ||||
|     -webkit-mask: url("data:image/svg+xml;charset=utf-8,%3Csvg width='11' height='11' viewBox='0 0 11 11' fill='none' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath d='M6.279 5.5L11 10.221l-.779.779L5.5 6.279.779 11 0 10.221 4.721 5.5 0 .779.779 0 5.5 4.721 10.221 0 11 .779 6.279 5.5z' fill='%23000'/%3E%3C/svg%3E") no-repeat 50% 50%; | ||||
|     mask: url("data:image/svg+xml;charset=utf-8,%3Csvg width='11' height='11' viewBox='0 0 11 11' fill='none' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath d='M6.279 5.5L11 10.221l-.779.779L5.5 6.279.779 11 0 10.221 4.721 5.5 0 .779.779 0 5.5 4.721 10.221 0 11 .779 6.279 5.5z' fill='%23000'/%3E%3C/svg%3E") no-repeat 50% 50%; | ||||
|   } | ||||
|   .titlebar #window-controls-container #minimize { | ||||
|     background-color: #f7f7f7; | ||||
|     -webkit-mask: url("data:image/svg+xml;charset=utf-8,%3Csvg width='11' height='11' viewBox='0 0 11 11' fill='none' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath d='M11 4.399V5.5H0V4.399h11z' fill='%23000'/%3E%3C/svg%3E") no-repeat 50% 50%; | ||||
|     mask: url("data:image/svg+xml;charset=utf-8,%3Csvg width='11' height='11' viewBox='0 0 11 11' fill='none' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath d='M11 4.399V5.5H0V4.399h11z' fill='%23000'/%3E%3C/svg%3E") no-repeat 50% 50%; | ||||
|   } | ||||
|   .titlebar #window-controls-container #maximize { | ||||
|     background-color: #f7f7f7; | ||||
|     -webkit-mask: url("data:image/svg+xml;charset=utf-8,%3Csvg width='11' height='11' viewBox='0 0 11 11' fill='none' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath d='M11 0v11H0V0h11zM9.899 1.101H1.1V9.9h8.8V1.1z' fill='%23000'/%3E%3C/svg%3E") no-repeat 50% 50%; | ||||
|     mask: url("data:image/svg+xml;charset=utf-8,%3Csvg width='11' height='11' viewBox='0 0 11 11' fill='none' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath d='M11 0v11H0V0h11zM9.899 1.101H1.1V9.9h8.8V1.1z' fill='%23000'/%3E%3C/svg%3E") no-repeat 50% 50%; | ||||
|   } | ||||
|   .window-title:after { | ||||
|     content: "Cord"; | ||||
|     color: var(--cord-color) !important; | ||||
|     font-weight: normal; | ||||
|     font-size: 14px; | ||||
|     font-family: Discordinated; | ||||
|   } | ||||
|   .window-title:before { | ||||
|     content: "ARM"; | ||||
|     color: var(--armcord-color); | ||||
|     font-weight: normal; | ||||
|     font-size: 14px; | ||||
|     font-family: Helvetica, sans-serif; | ||||
|   } | ||||
|   .window-title { | ||||
|     font-size: 0px !important; | ||||
|     margin-left: initial !important; | ||||
|     transform: translate(10px, 0px); | ||||
|   } | ||||
							
								
								
									
										50
									
								
								src/content/index.html
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										50
									
								
								src/content/index.html
									
										
									
									
									
										Normal file
									
								
							|  | @ -0,0 +1,50 @@ | |||
| <!DOCTYPE html> | ||||
| <html lang="en"> | ||||
|   <head> | ||||
|     <meta charset="UTF-8" /> | ||||
|     <title>ArmCord</title> | ||||
|     <style> | ||||
|       @import url("css/splash.css"); | ||||
|     </style> | ||||
|   </head> | ||||
| 
 | ||||
|   <body> | ||||
|     <div class="container"> | ||||
|       <video autoplay loop class="logo"> | ||||
|         <source | ||||
|           src="https://armcord.smartfridge.space/discord_loading.webm" | ||||
|           type="video/webm" | ||||
|         /> | ||||
|       </video> | ||||
|       <p id="text"></p> | ||||
|     </div> | ||||
|   </body> | ||||
|   <script> | ||||
|     const text = document.getElementById("text"); | ||||
|     if (window.navigator.onLine === false) { | ||||
|       text.innerHTML = | ||||
|         "You appear to be offline. Please connect to the internet and try again."; | ||||
|     } else { | ||||
|       text.innerHTML = "Starting ArmCord..."; | ||||
|        | ||||
|       setTimeout(() => { | ||||
|       window.armcord.splashEnd(); | ||||
|       switch (window.armcord.channel) { | ||||
|         case "stable": | ||||
|           window.location.href = "https://discord.com/app"; | ||||
|           break; | ||||
|         case "canary": | ||||
|           window.location.href = "https://canary.discord.com/app"; | ||||
|           break; | ||||
|         case "ptb": | ||||
|           window.location.href = "https://ptb.discord.com/app"; | ||||
|           break; | ||||
|         case "foss": | ||||
|           window.location.href = "https://dev.fosscord.com/app"; | ||||
|           break; | ||||
|         default: | ||||
|           window.location.href = "https://discord.com/app"; | ||||
|       }}, 5000); | ||||
|     } | ||||
|   </script> | ||||
| </html> | ||||
							
								
								
									
										24
									
								
								src/content/setup.html
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										24
									
								
								src/content/setup.html
									
										
									
									
									
										Normal file
									
								
							|  | @ -0,0 +1,24 @@ | |||
| 
 | ||||
| <!DOCTYPE html> | ||||
| <html lang="en"> | ||||
| 
 | ||||
| <head> | ||||
|   <meta charset="UTF-8"/> | ||||
|   <title>ArmCord Setup</title> | ||||
|   <style> | ||||
|      @import url("css/setup.css"); | ||||
|   </style> | ||||
| </head> | ||||
| 
 | ||||
| <body>   | ||||
| <div class="container"> | ||||
|   <h1 class="logo"></h1> | ||||
|   <h2>Welcome to ArmCord!</h2> | ||||
|   <p>Select what kind of setup you want to perform:</p> | ||||
|   <button id="express">Express setup</button> | ||||
|   <button id="full">Full setup</button> | ||||
| </div> | ||||
| 
 | ||||
| </body> | ||||
| 
 | ||||
| </html> | ||||
							
								
								
									
										26
									
								
								src/extensions/plugin.ts
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										26
									
								
								src/extensions/plugin.ts
									
										
									
									
									
										Normal file
									
								
							|  | @ -0,0 +1,26 @@ | |||
| import * as fs from 'fs'; | ||||
| import { app, session } from 'electron'; | ||||
| const userDataPath = app.getPath("userData"); | ||||
| const pluginFolder = userDataPath + "/plugins/"; | ||||
| if (!fs.existsSync(pluginFolder)) { | ||||
|     fs.mkdirSync(pluginFolder); | ||||
|     console.log("Created missing plugin folder"); | ||||
|   } | ||||
| app.whenReady().then(() => { | ||||
|   fs.readdirSync(pluginFolder).forEach((file) => { | ||||
|     try { | ||||
|       const manifest = fs.readFileSync( | ||||
|         `${userDataPath}/plugins/${file}/manifest.json`, | ||||
|         "utf8" | ||||
|       ); | ||||
|       var pluginFile = JSON.parse(manifest); | ||||
|       session.defaultSession.loadExtension(`${userDataPath}/plugins/${file}`); | ||||
|       console.log( | ||||
|         `%cLoaded ${pluginFile.name} made by ${pluginFile.author}`, | ||||
|         "color:red" | ||||
|       ); | ||||
|     } catch (err) { | ||||
|       console.error(err); | ||||
|     } | ||||
|   }); | ||||
| }); | ||||
							
								
								
									
										0
									
								
								src/extensions/themes.ts
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										0
									
								
								src/extensions/themes.ts
									
										
									
									
									
										Normal file
									
								
							
							
								
								
									
										92
									
								
								src/main.ts
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										92
									
								
								src/main.ts
									
										
									
									
									
										Normal file
									
								
							|  | @ -0,0 +1,92 @@ | |||
| // Modules to control application life and create native browser window
 | ||||
| import { app, BrowserWindow, ipcMain, shell } from "electron"; | ||||
| import * as path from "path"; | ||||
| import * as storage from 'electron-json-storage'; | ||||
| import {setup} from './utils'; | ||||
| import './extensions/plugin'; | ||||
| var isSetup = null; | ||||
| var contentPath:string = "null"; | ||||
| var frame:boolean; | ||||
| 
 | ||||
| storage.keys(function(error, keys) { | ||||
|     if (error) throw error; | ||||
|    | ||||
|     for (var key of keys) { | ||||
|       console.log('There is a key called: ' + key); | ||||
|     } | ||||
|   }); | ||||
| storage.has('firstRun', function(error, hasKey) { | ||||
|   if (error) throw error; | ||||
| 
 | ||||
|   if (!hasKey) { | ||||
|     console.log('First run of the ArmCord. Starting setup.'); | ||||
|     isSetup = true; | ||||
|     setup(); | ||||
|     contentPath = __dirname + '/content/setup.html' | ||||
|   } else { | ||||
|     console.log('ArmCord has been run before. Skipping setup.'); | ||||
|     isSetup = false; | ||||
|     contentPath = __dirname + '/content/index.html' | ||||
|   } | ||||
| }); | ||||
| storage.get('settings', function(error, data:any) { | ||||
|     if (error) throw error; | ||||
|     console.log(data); | ||||
|     frame = data.customTitlebar; | ||||
|     console.log(frame) | ||||
|   }); | ||||
| function createWindow () { | ||||
|   const mainWindow = new BrowserWindow({ | ||||
|     width: 300, | ||||
|     height: 300, | ||||
|     title: "ArmCord", | ||||
|     frame: frame, | ||||
|     webPreferences: { | ||||
|       preload: path.join(__dirname, 'preload/preload.js') | ||||
|     } | ||||
|   }) | ||||
|   ipcMain.on("get-app-path", (event, arg) => { | ||||
|     event.reply("app-path", app.getAppPath()); | ||||
|   }); | ||||
|   ipcMain.on("open-external-link", (event, href: string) => { | ||||
|     shell.openExternal(href); | ||||
|   }); | ||||
|   ipcMain.on("win-maximize", (event, arg) => { | ||||
|     mainWindow.maximize(); | ||||
|   }); | ||||
|   ipcMain.on("win-isMaximized", (event, arg) => { | ||||
|     event.returnValue = mainWindow.isMaximized(); | ||||
|   }); | ||||
|   ipcMain.on("win-minimize", (event, arg) => { | ||||
|     mainWindow.minimize(); | ||||
|   }); | ||||
|   ipcMain.on("win-show", (event, arg) => { | ||||
|     mainWindow.show(); | ||||
|   }); | ||||
|   ipcMain.on("win-hide", (event, arg) => { | ||||
|     mainWindow.hide(); | ||||
|   }); | ||||
|   ipcMain.on("get-app-version", (event) => { | ||||
|     event.returnValue = process.env.npm_package_version; | ||||
|   }) | ||||
|   ipcMain.on("splashEnd", (event, arg) => { | ||||
|     mainWindow.setSize(800, 600); | ||||
|   }); | ||||
|   ipcMain.on("channel", (event) => { | ||||
|     event.returnValue = storage.getSync('channel'); | ||||
|   }) | ||||
|   mainWindow.loadFile(contentPath) | ||||
| } | ||||
| 
 | ||||
| 
 | ||||
| app.whenReady().then(() => { | ||||
|   createWindow() | ||||
| 
 | ||||
|   app.on('activate', function () { | ||||
|     if (BrowserWindow.getAllWindows().length === 0) createWindow() | ||||
|   }) | ||||
| }) | ||||
| 
 | ||||
| app.on('window-all-closed', function () { | ||||
|   if (process.platform !== 'darwin') app.quit() | ||||
| }) | ||||
							
								
								
									
										17
									
								
								src/preload/bridge.ts
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										17
									
								
								src/preload/bridge.ts
									
										
									
									
									
										Normal file
									
								
							|  | @ -0,0 +1,17 @@ | |||
| 
 | ||||
| import { contextBridge, ipcRenderer } from 'electron'; | ||||
| import {getDisplayMediaSelector} from './capturer'; | ||||
| 
 | ||||
| contextBridge.exposeInMainWorld("armcord", { | ||||
|   window: { | ||||
|     show: () => ipcRenderer.sendSync('win-show'), | ||||
|     hide: () => ipcRenderer.sendSync('win-hide'), | ||||
|     minimize: () => ipcRenderer.sendSync('win-minimize'), | ||||
|     maximize: () => ipcRenderer.sendSync('win-maximize'), | ||||
|   }, | ||||
|   electron: process.versions.electron, | ||||
|   version: ipcRenderer.sendSync('get-app-version', 'app-version'), | ||||
|   getDisplayMediaSelector: getDisplayMediaSelector, | ||||
|   splashEnd: () => ipcRenderer.sendSync('splashEnd'), | ||||
|   channel: ipcRenderer.sendSync('channel') | ||||
| }); | ||||
|  | @ -1,9 +1,11 @@ | |||
| //Fixed context isolation version https://github.com/getferdi/ferdi/blob/develop/src/webview/screenshare.ts
 | ||||
| //original https://github.com/electron/electron/issues/16513#issuecomment-602070250
 | ||||
| const { desktopCapturer } = require('electron'); | ||||
| import { desktopCapturer } from 'electron'; | ||||
| import {addStyle, addScript} from '../utils'; | ||||
| 
 | ||||
| const CANCEL_ID = 'desktop-capturer-selection__cancel'; | ||||
| const ArmCord = require("./ArmCord.js"); | ||||
| async function getDisplayMediaSelector() { | ||||
| 
 | ||||
| export async function getDisplayMediaSelector() { | ||||
|   const sources = await desktopCapturer.getSources({ | ||||
|     types: ['screen', 'window'], | ||||
|   }); | ||||
|  | @ -144,9 +146,7 @@ window.navigator.mediaDevices.getDisplayMedia = () => new Promise(async (resolve | |||
| `;
 | ||||
| 
 | ||||
| document.addEventListener("DOMContentLoaded", function(event) {      | ||||
|   ArmCord.addScript(screenShareJS); | ||||
|   ArmCord.addStyle(screenShareCSS); | ||||
|   addScript(screenShareJS); | ||||
|   addStyle(screenShareCSS); | ||||
| }); | ||||
| 
 | ||||
| 
 | ||||
| exports.getDisplayMediaSelector = getDisplayMediaSelector; | ||||
							
								
								
									
										5
									
								
								src/preload/preload.ts
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										5
									
								
								src/preload/preload.ts
									
										
									
									
									
										Normal file
									
								
							|  | @ -0,0 +1,5 @@ | |||
| import './capturer' | ||||
| import './bridge' | ||||
| import {injectTitlebar} from './titlebar'; | ||||
| injectTitlebar(); | ||||
| console.log("ArmCord"); | ||||
							
								
								
									
										46
									
								
								src/preload/titlebar.ts
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										46
									
								
								src/preload/titlebar.ts
									
										
									
									
									
										Normal file
									
								
							|  | @ -0,0 +1,46 @@ | |||
| import { ipcRenderer } from 'electron'; | ||||
| import {addStyle} from '../utils' | ||||
| import * as fs from 'fs'; | ||||
| import * as path from 'path'; | ||||
| export function injectTitlebar() { | ||||
|     document.addEventListener("DOMContentLoaded", function (event) { | ||||
|         var elem = document.createElement("div"); | ||||
|         elem.innerHTML = `<nav class="titlebar">
 | ||||
|           <div class="window-title" id="window-title"></div> | ||||
|           <div id="window-controls-container"> | ||||
|               <div id="minimize"></div> | ||||
|               <div id="maximize"></div> | ||||
|               <div id="quit"></div> | ||||
|           </div> | ||||
|         </nav>`;
 | ||||
|         document.body.appendChild(elem); | ||||
|         const cssPath = path.join(__dirname, '../', '/content/css/titlebar.css'); | ||||
|         addStyle(fs.readFileSync( | ||||
|            cssPath, | ||||
|           "utf8" | ||||
|         )); | ||||
|        | ||||
|         var minimize = document.querySelector("#minimize"); | ||||
|         var maximize = document.querySelector("#maximize"); | ||||
|         var quit = document.querySelector("#quit"); | ||||
|        | ||||
|         minimize!.addEventListener("click", () => { | ||||
|           ipcRenderer.sendSync('win-minimize') | ||||
|         }); | ||||
|        | ||||
|         maximize!.addEventListener("click", () => { | ||||
|           if (ipcRenderer.sendSync('win-isMaximized') == true) { | ||||
|               ipcRenderer.sendSync('win-minimize') | ||||
|           } else { | ||||
|               ipcRenderer.sendSync('win-maximize') | ||||
|           } | ||||
|         }); | ||||
|        | ||||
|         quit!.addEventListener("click", () => { | ||||
|           ipcRenderer.sendSync('win-hide') | ||||
|         }); | ||||
|       }); | ||||
| } | ||||
| export function removeTitlebar() { | ||||
|     document.querySelector('#titlebar')!.remove(); | ||||
| } | ||||
							
								
								
									
										24
									
								
								src/utils.ts
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										24
									
								
								src/utils.ts
									
										
									
									
									
										Normal file
									
								
							|  | @ -0,0 +1,24 @@ | |||
| import * as storage from 'electron-json-storage'; | ||||
| //utillity functions that are used all over the codebase or just too obscure to be put in the file used in
 | ||||
| export function addStyle(styleString: string) { | ||||
|  const style = document.createElement('style'); | ||||
|  style.textContent = styleString; | ||||
|  document.head.append(style); | ||||
| }; | ||||
| 
 | ||||
| export function addScript(scriptString: string) { | ||||
|   var script = document.createElement("script"); | ||||
|   script.textContent = scriptString; | ||||
|   document.body.append(script); | ||||
| }; | ||||
| export function setup(){ | ||||
|     console.log("Setting up ArmCord settings."); | ||||
|       storage.set('settings', { customTitlebar: true, channel: 'stable', firstRun: 'done' }, function(error) { | ||||
|         if (error) throw error; | ||||
|       }); | ||||
| } | ||||
| export interface settingsStructure { | ||||
|     channel: string, | ||||
|     customTitlebar: boolean, | ||||
|     firstRun: string, | ||||
| } | ||||
							
								
								
									
										35
									
								
								tsconfig.json
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										35
									
								
								tsconfig.json
									
										
									
									
									
										Normal file
									
								
							|  | @ -0,0 +1,35 @@ | |||
| // Reference: https://www.typescriptlang.org/tsconfig | ||||
| { | ||||
|     "include": ["src/**/*"], // This makes it so that the compiler won't compile anything outside of "src". | ||||
|     //"exclude": ["src/**/*.test.ts"], // Exclude .test.ts files since they're for Jest only. | ||||
|     "compilerOptions": { | ||||
|         // Project Structure // | ||||
|         "rootDir": "src", // rootDir only affects the STRUCTURE of the folders, not what gets compiled. For extra measure, make sure the structure conforms to "src". | ||||
|         "outDir": "dist", // Likewise, outDir only chooses which folder to compile to. Prevent the compiler from creating JS files right next to source files. | ||||
|         "moduleResolution": "node", // Specify how the compiler resolves modules, like going for node_modules first then searching elsewhere. The official docs just say to use this instead of classic. | ||||
| 
 | ||||
|         // Type Settings // | ||||
|         "strict": true, // Enables all strict checks possible. | ||||
|         "noImplicitReturns": false, // Makes sure you don't accidentally return something + undefined. | ||||
|         "noFallthroughCasesInSwitch": true, // Prevents accidentally forgetting to break every switch case. Of course, if you know what you're doing, feel free to add a @ts-ignore, which also signals that it's not a mistake. | ||||
|         "forceConsistentCasingInFileNames": true, // Make import paths case-sensitive. "./tEst" is no longer the same as "./test". | ||||
|         "esModuleInterop": true, // Enables compatibility with Node.js' module system since the entire export can be whatever you want. allowSyntheticDefaultImports doesn't address runtime issues and is made redundant by this setting. | ||||
|         "resolveJsonModule": true, // Allows you to import JSON files just like how you can require() them. Do note that if you're accessing any JSON files outside of src, it'll mess up dist. | ||||
|         "lib": ["ES2020", "DOM"], // Specifies what common libraries you have access to. If you're working in Node.js, you'll want to leave out the DOM library. But do make sure to include "@types/node" because otherwise, variables like "console" won't be defined. | ||||
| 
 | ||||
|         // Output // | ||||
|         "module": "CommonJS", // Compiles ES6 imports to require() syntax. | ||||
|         "removeComments": false, | ||||
|         "sourceMap": true, // Used for displaying the original source when debugging in webpack. Allows you to set breakpoints directly on TypeScript code for VSCode's debugger. | ||||
| 
 | ||||
|         // Library Building // | ||||
|         "declaration": false, // Exports declaration files in addition, used for exporting a module. | ||||
|         "declarationMap": false, // Allows the user to go to the source file when hitting a go-to-implementation key like F12 in VSCode for example. | ||||
|         //"declarationDir": "typings", // declarationDir allows you to separate the compiled code from the declaration files, used in conjunction with package.json's "types" property. | ||||
| 
 | ||||
|         // Web Compatibility // | ||||
|         "target": "ES2020", // ES2017 supports async/await, reducing the amount of compiled code, especially for async-heavy projects. ES2020 is from the Node 14 base (https://github.com/tsconfig/bases/blob/master/bases/node14.json) | ||||
|         "downlevelIteration": false, // This flag adds extra support when targeting ES3, but adds extra bloat otherwise. | ||||
|         "importHelpers": false // Reduce the amount of bloat that comes from downlevelIteration (when polyfills are redeclared). | ||||
|     } | ||||
| } | ||||
|  | @ -1,24 +0,0 @@ | |||
| exports.Version = require("../package.json").version; | ||||
| const fs = require("fs"); | ||||
| const electron = require("electron"); | ||||
| const userDataPath = (electron.app || electron.remote.app).getPath("userData"); | ||||
| const settingsFile= userDataPath + "/settings.json"; | ||||
| if (!fs.existsSync(settingsFile)) { | ||||
|   fs.writeFile(settingsFile, "{}", (err) => { | ||||
|     if (err) throw err; | ||||
| });  | ||||
|   console.log("Created settings.json file"); | ||||
| } | ||||
| exports.Channel = require(settingsFile).channel; | ||||
| exports.Titlebar = require(settingsFile).titlebar; | ||||
| exports.addStyle = function(styleString) { | ||||
|  const style = document.createElement('style'); | ||||
|  style.textContent = styleString; | ||||
|  document.head.append(style); | ||||
| }; | ||||
| 
 | ||||
| exports.addScript = function (scriptString) { | ||||
|   var script = document.createElement("script"); | ||||
|   script.textContent = scriptString; | ||||
|   document.body.append(script); | ||||
| }; | ||||
|  | @ -1,19 +0,0 @@ | |||
| const { contextBridge, remote } = require("electron"); | ||||
| const currentWindow = remote.getCurrentWindow(); | ||||
| const {getDisplayMediaSelector} = require('./capturer') | ||||
| const ArmCord = require("./ArmCord.js"); | ||||
| const version = require("../package.json").version; | ||||
| contextBridge.exposeInMainWorld("electron", { | ||||
|   window: { | ||||
|     show: () => currentWindow.show(), | ||||
|     hide: () => currentWindow.hide(), | ||||
|     minimize: () => currentWindow.minimize(), | ||||
|     maximize: () => currentWindow.maximize(), | ||||
|     on : () => currentWindow.on(), | ||||
|   }, | ||||
|   electron: process.versions.electron, | ||||
|   version: version, | ||||
|   ArmCord: ArmCord, | ||||
|   getDisplayMediaSelector: getDisplayMediaSelector, | ||||
| 
 | ||||
| }); | ||||
							
								
								
									
										22
									
								
								utils/mod.js
									
										
									
									
									
								
							
							
						
						
									
										22
									
								
								utils/mod.js
									
										
									
									
									
								
							|  | @ -1,22 +0,0 @@ | |||
| const fs = require("fs"); | ||||
| const { app, session } = require("electron"); | ||||
| const path = require ('path'); | ||||
| const execPath = path.dirname (process.execPath); | ||||
| app.whenReady().then(() => { | ||||
| fs.readdirSync(`${execPath}/resources/mods/`).forEach((file) => { | ||||
|   try { | ||||
|     const manifest = fs.readFileSync( | ||||
|       `${execPath}/resources/mods/${file}/manifest.json`, | ||||
|       "utf8" | ||||
|     ); | ||||
|     var pluginFile = JSON.parse(manifest); | ||||
|     session.defaultSession.loadExtension(`${execPath}/resources/mods/${file}`); | ||||
|     console.log( | ||||
|       `%cLoaded ${pluginFile.name} made by ${pluginFile.author}`, | ||||
|       "color:red" | ||||
|     ); | ||||
|   } catch (err) { | ||||
|     console.error(err); | ||||
|   } | ||||
| }); | ||||
| }); | ||||
|  | @ -1,24 +0,0 @@ | |||
| const fs = require("fs"); | ||||
| const { app, session } = require("electron"); | ||||
| const electron = require("electron"); | ||||
| const userDataPath = (electron.app || electron.remote.app).getPath("userData"); | ||||
| const pluginFolder = userDataPath + "/plugins/"; | ||||
| 
 | ||||
| app.whenReady().then(() => { | ||||
| fs.readdirSync(pluginFolder).forEach((file) => { | ||||
|   try { | ||||
|     const manifest = fs.readFileSync( | ||||
|       `${userDataPath}/plugins/${file}/manifest.json`, | ||||
|       "utf8" | ||||
|     ); | ||||
|     var pluginFile = JSON.parse(manifest); | ||||
|     session.defaultSession.loadExtension(`${userDataPath}/plugins/${file}`); | ||||
|     console.log( | ||||
|       `%cLoaded ${pluginFile.name} made by ${pluginFile.author}`, | ||||
|       "color:red" | ||||
|     ); | ||||
|   } catch (err) { | ||||
|     console.error(err); | ||||
|   } | ||||
| }); | ||||
| }); | ||||
|  | @ -1,53 +0,0 @@ | |||
| const fs = require("fs"); | ||||
| const {shell} = require('electron'); | ||||
| const electron = require("electron"); | ||||
| const ArmCord = require("./ArmCord.js"); | ||||
| const userDataPath = (electron.app || electron.remote.app).getPath("userData"); | ||||
| const themeFolder = userDataPath + "/themes/"; | ||||
| if (!fs.existsSync(themeFolder)) { | ||||
|   fs.mkdirSync(themeFolder); | ||||
|   console.log("Created theme folder"); | ||||
| } | ||||
| window.addEventListener("DOMContentLoaded", () => { | ||||
|   console.log("Theme Module Loaded"); // I KNOW THIS IS A MESS BUT IT'S WORKING MESS, XOXO
 | ||||
|   fs.readdirSync(themeFolder).forEach((file) => { | ||||
|     try { | ||||
|       if (file.includes('DISABLED')) { | ||||
|         console.log(`Skipping ${file}.`) | ||||
|         const manifest = fs.readFileSync(`${userDataPath}/themes/${file}/manifest.json`, "utf8"); | ||||
|         var themeFile = JSON.parse(manifest); | ||||
|         var html = `<div id="tm-list-item"><div id="theme-name">${themeFile.name}</div><div id="theme-author">By ${themeFile.author}</div><div id="theme-description">${themeFile.description}</div></div><br><br>`; | ||||
|         document.getElementById("tm-disabled").innerHTML = html + document.getElementById("tm-disabled").innerHTML; | ||||
|       } | ||||
|       const manifest = fs.readFileSync(`${userDataPath}/themes/${file}/manifest.json`, "utf8"); | ||||
|       var themeFile = JSON.parse(manifest); | ||||
|       const theme = fs.readFileSync(`${userDataPath}/themes/${file}/${themeFile.theme}`, "utf8"); | ||||
|       if (themeFile.theme.endsWith(".scss")) { | ||||
|         console.log( | ||||
|           `%cCouldn't load ${themeFile.name} made by ${themeFile.author}. ArmCord doesn't support SCSS files! If you want to have this theme ported, feel free to reach out https://discord.gg/F25bc4RYDt `, | ||||
|           "color:red; font-weight: bold; font-size: 50px;color: red;" | ||||
|         ); | ||||
|       } | ||||
|       ArmCord.addStyle(theme); | ||||
|       var html = `<div id="tm-list-item"><div id="theme-name">${themeFile.name}</div><div id="theme-author">By ${themeFile.author}</div><div id="theme-description">${themeFile.description}</div></div><br><br>`; | ||||
|       document.getElementById("tm-list").innerHTML = html + document.getElementById("tm-list").innerHTML; | ||||
|       console.log(`%cLoaded ${themeFile.name} made by ${themeFile.author}`, "color:red"); | ||||
|     } catch (err) { | ||||
|       console.error(err); | ||||
|     } | ||||
|   }); | ||||
|   document.getElementById("open-themes-btn").onclick = function () {shell.openPath(`${userDataPath}/themes`);}; | ||||
|   document.getElementsByClassName("back-btn")[0].onclick = function () { | ||||
|     if (document.getElementById("ac-channel").innerHTML == "stable") { | ||||
|       window.location.href = "https://discord.com/app"; | ||||
|     } else if (document.getElementById("ac-channel").innerHTML == "canary") { | ||||
|       window.location.href = "https://canary.discord.com/app"; | ||||
|     } else if (document.getElementById("ac-channel").innerHTML == "ptb") { | ||||
|       window.location.href = "https://ptb.discord.com/app"; | ||||
|     } else if (document.getElementById("ac-channel").innerHTML == "foss") { | ||||
|       window.location.href = "https://dev.fosscord.com/app"; | ||||
|     } else { | ||||
|       window.location.href = "https://discord.com/app"; | ||||
|     }; | ||||
|   }; | ||||
| }); | ||||
|  | @ -1,138 +0,0 @@ | |||
| const { remote } = require("electron"); | ||||
| var win = remote.BrowserWindow.getFocusedWindow(); | ||||
| const ArmCord = require("./ArmCord.js"); | ||||
| const css = ` | ||||
| .titleebar { | ||||
|   position: absolute; | ||||
|   top: 0; | ||||
|   left: 0; | ||||
|   right: 0; | ||||
|   box-sizing: border-box; | ||||
|   width: 100%; | ||||
|   font-size: 13px; | ||||
|   padding: 0 16px; | ||||
|   overflow: hidden; | ||||
|   flex-shrink: 0; | ||||
|   align-items: center; | ||||
|   justify-content: center; | ||||
|   user-select: none; | ||||
|   zoom: 1; | ||||
|   line-height: 22px; | ||||
|   height: 22px; | ||||
|   display: flex; | ||||
|   z-index: 99999; | ||||
| } | ||||
| .titlebar { | ||||
|   display: block; | ||||
|   top: 0; | ||||
|   left: 0; | ||||
|   right: 0; | ||||
|   flex-shrink: 0; | ||||
|   overflow: hidden; | ||||
|   zoom: 1; | ||||
|   box-sizing: border-box; | ||||
|   width: 100%; | ||||
|   clear:both; | ||||
|   height: 30px; | ||||
|   line-height: 30px; | ||||
|   background-color: #202225; | ||||
|   -webkit-app-region: drag; | ||||
|   width: 100%; | ||||
|   user-select: none; | ||||
|   -webkit-user-select: none; | ||||
|   position: fixed; | ||||
|   z-index: 99999; | ||||
|    | ||||
| } | ||||
| .appMount-3lHmkl{ | ||||
| 
 | ||||
| } | ||||
| .titlebar #window-title { | ||||
|   width: 30%; | ||||
|   height: 100%; | ||||
|   line-height: 30px; | ||||
|   float: left; | ||||
|   padding: 0 0 0 1em; | ||||
| } | ||||
| 
 | ||||
| .titlebar #window-controls-container { | ||||
|   float: right; | ||||
|   width: 150px; | ||||
|   height: 100%; | ||||
|   line-height: 30px; | ||||
|   background-color: #202225; | ||||
|   -webkit-app-region: no-drag; | ||||
| } | ||||
| 
 | ||||
| .titlebar #window-controls-container #minimize, | ||||
| .titlebar #window-controls-container #maximize, | ||||
| .titlebar #window-controls-container #quit { | ||||
|   float: left; | ||||
|   height: 100%; | ||||
|   width: 33%; | ||||
|   text-align: center; | ||||
|   color: #f7f7f7; | ||||
|   cursor: default; | ||||
| } | ||||
| 
 | ||||
| .titlebar #window-controls-container #minimize:hover { | ||||
|   background-color: #99AAB5; | ||||
| } | ||||
| .titlebar #window-controls-container #maximize:hover { | ||||
|   background-color: #99AAB5; | ||||
| } | ||||
| .titlebar #window-controls-container #quit:hover { | ||||
|   background-color: #F04747; | ||||
| } | ||||
| .titlebar #window-controls-container #quit { | ||||
|   background-color: #f7f7f7; | ||||
|   -webkit-mask: url("data:image/svg+xml;charset=utf-8,%3Csvg width='11' height='11' viewBox='0 0 11 11' fill='none' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath d='M6.279 5.5L11 10.221l-.779.779L5.5 6.279.779 11 0 10.221 4.721 5.5 0 .779.779 0 5.5 4.721 10.221 0 11 .779 6.279 5.5z' fill='%23000'/%3E%3C/svg%3E") no-repeat 50% 50%; | ||||
|   mask: url("data:image/svg+xml;charset=utf-8,%3Csvg width='11' height='11' viewBox='0 0 11 11' fill='none' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath d='M6.279 5.5L11 10.221l-.779.779L5.5 6.279.779 11 0 10.221 4.721 5.5 0 .779.779 0 5.5 4.721 10.221 0 11 .779 6.279 5.5z' fill='%23000'/%3E%3C/svg%3E") no-repeat 50% 50%; | ||||
| } | ||||
| .titlebar #window-controls-container #minimize { | ||||
|   background-color: #f7f7f7; | ||||
|   -webkit-mask: url("data:image/svg+xml;charset=utf-8,%3Csvg width='11' height='11' viewBox='0 0 11 11' fill='none' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath d='M11 4.399V5.5H0V4.399h11z' fill='%23000'/%3E%3C/svg%3E") no-repeat 50% 50%; | ||||
|   mask: url("data:image/svg+xml;charset=utf-8,%3Csvg width='11' height='11' viewBox='0 0 11 11' fill='none' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath d='M11 4.399V5.5H0V4.399h11z' fill='%23000'/%3E%3C/svg%3E") no-repeat 50% 50%; | ||||
| } | ||||
| .titlebar #window-controls-container #maximize { | ||||
|   background-color: #f7f7f7; | ||||
|   -webkit-mask: url("data:image/svg+xml;charset=utf-8,%3Csvg width='11' height='11' viewBox='0 0 11 11' fill='none' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath d='M11 0v11H0V0h11zM9.899 1.101H1.1V9.9h8.8V1.1z' fill='%23000'/%3E%3C/svg%3E") no-repeat 50% 50%; | ||||
|   mask: url("data:image/svg+xml;charset=utf-8,%3Csvg width='11' height='11' viewBox='0 0 11 11' fill='none' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath d='M11 0v11H0V0h11zM9.899 1.101H1.1V9.9h8.8V1.1z' fill='%23000'/%3E%3C/svg%3E") no-repeat 50% 50%; | ||||
| } | ||||
| 
 | ||||
| 
 | ||||
| `;
 | ||||
| document.addEventListener("DOMContentLoaded", function (event) { | ||||
|   var elem = document.createElement("div"); | ||||
|   elem.innerHTML = `<nav class="titlebar">
 | ||||
|     <div class="window-title" id="window-title"></div> | ||||
|     <div id="window-controls-container"> | ||||
|         <div id="minimize"></div> | ||||
|         <div id="maximize"></div> | ||||
|         <div id="quit"></div> | ||||
|     </div> | ||||
|   </nav>`; | ||||
|   document.body.appendChild(elem); | ||||
|    | ||||
|   ArmCord.addStyle(css); | ||||
| 
 | ||||
|   var minimize = document.querySelector("#minimize"); | ||||
|   var maximize = document.querySelector("#maximize"); | ||||
|   var quit = document.querySelector("#quit"); | ||||
| 
 | ||||
|   minimize.addEventListener("click", () => { | ||||
|     win.minimize(); | ||||
|   }); | ||||
| 
 | ||||
|   maximize.addEventListener("click", () => { | ||||
|     if (win.isMaximized() == true) { | ||||
|       win.unmaximize(); | ||||
|     } else { | ||||
|       win.maximize(); | ||||
|     } | ||||
|   }); | ||||
| 
 | ||||
|   quit.addEventListener("click", () => { | ||||
|     win.close(); | ||||
|   }); | ||||
| }); | ||||
|  | @ -1,22 +0,0 @@ | |||
| const { app, autoUpdater } = require('electron') | ||||
| const server = "https://download.smartfridge.space" | ||||
| const url = `${server}/update/${process.platform}/${app.getVersion()}` | ||||
| 
 | ||||
| autoUpdater.setFeedURL({ url }) | ||||
| autoUpdater.on('update-downloaded', (event, releaseNotes, releaseName) => { | ||||
|     const dialogOpts = { | ||||
|       type: 'info', | ||||
|       buttons: ['Restart', 'Later'], | ||||
|       title: 'ArmCord Update', | ||||
|       message: process.platform === 'win32' ? releaseNotes : releaseName, | ||||
|       detail: 'A new version has been downloaded. Restart the application to apply the updates.' | ||||
|     } | ||||
|    | ||||
|     dialog.showMessageBox(dialogOpts).then((returnValue) => { | ||||
|       if (returnValue.response === 0) autoUpdater.quitAndInstall() | ||||
|     }) | ||||
|   }) | ||||
|   autoUpdater.on('error', message => { | ||||
|     console.error('There was a problem updating the application') | ||||
|     console.error(message) | ||||
|   }) | ||||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue