├── .gitattributes ├── .github └── FUNDING.yml ├── .gitignore ├── LICENSE ├── MultiRPC.sln ├── MultiRPC ├── App.config ├── App.xaml ├── App.xaml.cs ├── Assets │ ├── 150x150Logo.png │ ├── 70x70Logo.png │ ├── ClientIDHelp.jpg │ ├── Icons.xaml │ ├── LargeTextHelp.jpg │ ├── Loading.gif │ ├── LottieAnimations │ │ ├── CreditsIconAnimation.json │ │ ├── CustomIconAnimation.json │ │ ├── DiscordIconAnimation.json │ │ ├── IconAnimations.aep │ │ ├── LogsIconAnimation.json │ │ └── SettingsIconAnimation.json │ ├── MultiRPCLogo.ai │ ├── Other │ │ ├── Loading Animation.aep │ │ └── Loading Animation.prproj │ ├── SmallAndLargeKeyHelp.jpg │ ├── SmallTextHelp.jpg │ ├── Svg files │ │ ├── AddIcon.svg │ │ ├── AlertIcon.svg │ │ ├── BrowserIcon.svg │ │ ├── CreditsIcon.svg │ │ ├── CustomIcon.svg │ │ ├── DeleteIcon.svg │ │ ├── DiscordColourIcon.svg │ │ ├── DiscordIcon.svg │ │ ├── DownloadIcon.svg │ │ ├── FluxpointDevelopmentIcon.svg │ │ ├── GithubIcon.svg │ │ ├── HeartIcon.svg │ │ ├── HelpIcon.svg │ │ ├── InfoIcon.svg │ │ ├── LogsIcon.svg │ │ ├── MultiRPCLogo.svg │ │ ├── PencilIcon.svg │ │ ├── ProgramsIcon.svg │ │ ├── SettingsIcon.svg │ │ ├── ShareIcon.svg │ │ ├── ShieldIcon.svg │ │ ├── ThemeIcon.svg │ │ ├── Update.cmd │ │ └── WarningIcon.svg │ ├── Text1Help.jpg │ ├── Text2Help.jpg │ └── Themes │ │ └── DesignerTheme.xaml ├── Data.cs ├── Functions │ ├── Animations.cs │ ├── BitmapDownloader.cs │ ├── Checks.cs │ ├── ClickOnceUpdater.cs │ ├── FileWatch.cs │ ├── IUpdate.cs │ ├── Logging.cs │ ├── SimpleUpdater.cs │ ├── TriggerWatch.cs │ ├── Updater.cs │ ├── Uri.Extra.cs │ └── Utils.cs ├── GUI │ ├── Controls │ │ ├── MultiRPCAndCustomDictionary.xaml │ │ ├── TabPage.xaml │ │ ├── TabPage.xaml.cs │ │ └── ToolTip.cs │ ├── MainWindow.xaml │ ├── MainWindow.xaml.cs │ ├── MessageBox │ │ ├── CustomMessageBox.cs │ │ ├── MessageBoxPage.xaml │ │ └── MessageBoxPage.xaml.cs │ ├── Pages │ │ ├── ChangelogPage.xaml │ │ ├── ChangelogPage.xaml.cs │ │ ├── CreditsPage.xaml │ │ ├── CreditsPage.xaml.cs │ │ ├── Custom Pages │ │ │ ├── CustomPage.xaml │ │ │ ├── CustomPage.xaml.cs │ │ │ ├── MasterCustomPage.xaml │ │ │ ├── MasterCustomPage.xaml.cs │ │ │ ├── TriggerPage.xaml │ │ │ └── TriggerPage.xaml.cs │ │ ├── DebugPage.xaml │ │ ├── DebugPage.xaml.cs │ │ ├── EditProfileNamePage.xaml │ │ ├── EditProfileNamePage.xaml.cs │ │ ├── LogsPage.xaml │ │ ├── LogsPage.xaml.cs │ │ ├── MainPage.xaml │ │ ├── MainPage.xaml.cs │ │ ├── MainPageThumbnail.xaml │ │ ├── MainPageThumbnail.xaml.cs │ │ ├── MultiRPCAndCustomLogic.cs │ │ ├── MultiRPCPage.xaml │ │ ├── MultiRPCPage.xaml.cs │ │ ├── ProgramsPage.xaml │ │ ├── ProgramsPage.xaml.cs │ │ ├── SettingsPage.xaml │ │ ├── SettingsPage.xaml.cs │ │ ├── ShareProfilePage.xaml │ │ ├── ShareProfilePage.xaml.cs │ │ ├── Theme Pages │ │ │ ├── InstalledThemes.xaml │ │ │ ├── InstalledThemes.xaml.cs │ │ │ ├── MasterThemeEditorPage.xaml │ │ │ ├── MasterThemeEditorPage.xaml.cs │ │ │ ├── ThemeEditorPage.xaml │ │ │ └── ThemeEditorPage.xaml.cs │ │ ├── UpdateFailedPage.xaml │ │ ├── UpdateFailedPage.xaml.cs │ │ ├── UpdatePage.xaml │ │ └── UpdatePage.xaml.cs │ └── Views │ │ ├── RPCPreview.xaml │ │ └── RPCPreview.xaml.cs ├── JsonClasses │ ├── Config.cs │ ├── CreditsList.cs │ ├── CustomProfile.cs │ ├── Day.cs │ ├── FileLocations.cs │ ├── ProcessWatcher.cs │ ├── Theme.cs │ ├── UIText.cs │ └── Version.cs ├── Lang │ ├── en-gb.json │ └── es.json ├── MultiRPC.csproj ├── MultiRPCCore.csproj ├── MultiRPCIcon.ico ├── Ooki-Dialogs-Wpf-license.txt ├── Ookii.Dialogs.Wpf.dll ├── Properties │ ├── AssemblyInfo.cs │ ├── Settings.Designer.cs │ ├── Settings.settings │ └── app.manifest ├── RPC.cs └── multirpc.VisualElementsManifest.xml └── README.md /.gitattributes: -------------------------------------------------------------------------------- 1 | ############################################################################### 2 | # Set default behavior to automatically normalize line endings. 3 | ############################################################################### 4 | * text=auto 5 | 6 | ############################################################################### 7 | # Set default behavior for command prompt diff. 8 | # 9 | # This is need for earlier builds of msysgit that does not have it on by 10 | # default for csharp files. 11 | # Note: This is only used by command line 12 | ############################################################################### 13 | #*.cs diff=csharp 14 | 15 | ############################################################################### 16 | # Set the merge driver for project and solution files 17 | # 18 | # Merging from the command prompt will add diff markers to the files if there 19 | # are conflicts (Merging from VS is not affected by the settings below, in VS 20 | # the diff markers are never inserted). Diff markers may cause the following 21 | # file extensions to fail to load in VS. An alternative would be to treat 22 | # these files as binary and thus will always conflict and require user 23 | # intervention with every merge. To do so, just uncomment the entries below 24 | ############################################################################### 25 | #*.sln merge=binary 26 | #*.csproj merge=binary 27 | #*.vbproj merge=binary 28 | #*.vcxproj merge=binary 29 | #*.vcproj merge=binary 30 | #*.dbproj merge=binary 31 | #*.fsproj merge=binary 32 | #*.lsproj merge=binary 33 | #*.wixproj merge=binary 34 | #*.modelproj merge=binary 35 | #*.sqlproj merge=binary 36 | #*.wwaproj merge=binary 37 | 38 | ############################################################################### 39 | # behavior for image files 40 | # 41 | # image files are treated as binary by default. 42 | ############################################################################### 43 | #*.jpg binary 44 | #*.png binary 45 | #*.gif binary 46 | 47 | ############################################################################### 48 | # diff behavior for common document formats 49 | # 50 | # Convert binary document formats to text before diffing them. This feature 51 | # is only available from the command line. Turn it on by uncommenting the 52 | # entries below. 53 | ############################################################################### 54 | #*.doc diff=astextplain 55 | #*.DOC diff=astextplain 56 | #*.docx diff=astextplain 57 | #*.DOCX diff=astextplain 58 | #*.dot diff=astextplain 59 | #*.DOT diff=astextplain 60 | #*.pdf diff=astextplain 61 | #*.PDF diff=astextplain 62 | #*.rtf diff=astextplain 63 | #*.RTF diff=astextplain 64 | -------------------------------------------------------------------------------- /.github/FUNDING.yml: -------------------------------------------------------------------------------- 1 | patreon: fluxpointdev 2 | custom: fluxpoint.dev/donate 3 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | ## Ignore Visual Studio temporary files, build results, and 2 | ## files generated by popular Visual Studio add-ons. 3 | 4 | # User Added 5 | /MultiRPC/Assets/tmp 6 | 7 | # User-specific files 8 | *.suo 9 | *.user 10 | *.userosscache 11 | *.sln.docstates 12 | 13 | # User-specific files (MonoDevelop/Xamarin Studio) 14 | *.userprefs 15 | 16 | # Build results 17 | [Dd]ebug/ 18 | [Dd]ebugPublic/ 19 | [Rr]elease/ 20 | [Rr]eleases/ 21 | x64/ 22 | x86/ 23 | bld/ 24 | [Bb]in/ 25 | [Oo]bj/ 26 | [Ll]og/ 27 | 28 | # Visual Studio 2015 cache/options directory 29 | .vs/ 30 | # Uncomment if you have tasks that create the project's static files in wwwroot 31 | #wwwroot/ 32 | 33 | # MSTest test Results 34 | [Tt]est[Rr]esult*/ 35 | [Bb]uild[Ll]og.* 36 | 37 | # NUNIT 38 | *.VisualState.xml 39 | TestResult.xml 40 | 41 | # Build Results of an ATL Project 42 | [Dd]ebugPS/ 43 | [Rr]eleasePS/ 44 | dlldata.c 45 | 46 | # DNX 47 | project.lock.json 48 | project.fragment.lock.json 49 | artifacts/ 50 | 51 | *_i.c 52 | *_p.c 53 | *_i.h 54 | *.ilk 55 | *.meta 56 | *.obj 57 | *.pch 58 | *.pdb 59 | *.pgc 60 | *.pgd 61 | *.rsp 62 | *.sbr 63 | *.tlb 64 | *.tli 65 | *.tlh 66 | *.tmp 67 | *.tmp_proj 68 | *.log 69 | *.vspscc 70 | *.vssscc 71 | .builds 72 | *.pidb 73 | *.svclog 74 | *.scc 75 | 76 | # Chutzpah Test files 77 | _Chutzpah* 78 | 79 | # Visual C++ cache files 80 | ipch/ 81 | *.aps 82 | *.ncb 83 | *.opendb 84 | *.opensdf 85 | *.sdf 86 | *.cachefile 87 | *.VC.db 88 | *.VC.VC.opendb 89 | 90 | # Visual Studio profiler 91 | *.psess 92 | *.vsp 93 | *.vspx 94 | *.sap 95 | 96 | # TFS 2012 Local Workspace 97 | $tf/ 98 | 99 | # Guidance Automation Toolkit 100 | *.gpState 101 | 102 | # ReSharper is a .NET coding add-in 103 | _ReSharper*/ 104 | *.[Rr]e[Ss]harper 105 | *.DotSettings.user 106 | 107 | # JustCode is a .NET coding add-in 108 | .JustCode 109 | 110 | # TeamCity is a build add-in 111 | _TeamCity* 112 | 113 | # DotCover is a Code Coverage Tool 114 | *.dotCover 115 | 116 | # NCrunch 117 | _NCrunch_* 118 | .*crunch*.local.xml 119 | nCrunchTemp_* 120 | 121 | # MightyMoose 122 | *.mm.* 123 | AutoTest.Net/ 124 | 125 | # Web workbench (sass) 126 | .sass-cache/ 127 | 128 | # Installshield output folder 129 | [Ee]xpress/ 130 | 131 | # DocProject is a documentation generator add-in 132 | DocProject/buildhelp/ 133 | DocProject/Help/*.HxT 134 | DocProject/Help/*.HxC 135 | DocProject/Help/*.hhc 136 | DocProject/Help/*.hhk 137 | DocProject/Help/*.hhp 138 | DocProject/Help/Html2 139 | DocProject/Help/html 140 | 141 | # Click-Once directory 142 | publish/ 143 | 144 | # Publish Web Output 145 | *.[Pp]ublish.xml 146 | *.azurePubxml 147 | # TODO: Comment the next line if you want to checkin your web deploy settings 148 | # but database connection strings (with potential passwords) will be unencrypted 149 | #*.pubxml 150 | *.publishproj 151 | 152 | # Microsoft Azure Web App publish settings. Comment the next line if you want to 153 | # checkin your Azure Web App publish settings, but sensitive information contained 154 | # in these scripts will be unencrypted 155 | PublishScripts/ 156 | 157 | # NuGet Packages 158 | *.nupkg 159 | # The packages folder can be ignored because of Package Restore 160 | **/packages/* 161 | # except build/, which is used as an MSBuild target. 162 | !**/packages/build/ 163 | # Uncomment if necessary however generally it will be regenerated when needed 164 | #!**/packages/repositories.config 165 | # NuGet v3's project.json files produces more ignoreable files 166 | *.nuget.props 167 | *.nuget.targets 168 | 169 | # Microsoft Azure Build Output 170 | csx/ 171 | *.build.csdef 172 | 173 | # Microsoft Azure Emulator 174 | ecf/ 175 | rcf/ 176 | 177 | # Windows Store app package directories and files 178 | AppPackages/ 179 | BundleArtifacts/ 180 | Package.StoreAssociation.xml 181 | _pkginfo.txt 182 | 183 | # Visual Studio cache files 184 | # files ending in .cache can be ignored 185 | *.[Cc]ache 186 | # but keep track of directories ending in .cache 187 | !*.[Cc]ache/ 188 | 189 | # Others 190 | ClientBin/ 191 | ~$* 192 | *~ 193 | *.dbmdl 194 | *.dbproj.schemaview 195 | *.jfm 196 | *.pfx 197 | *.publishsettings 198 | node_modules/ 199 | orleans.codegen.cs 200 | 201 | # Since there are multiple workflows, uncomment next line to ignore bower_components 202 | # (https://github.com/github/gitignore/pull/1529#issuecomment-104372622) 203 | #bower_components/ 204 | 205 | # RIA/Silverlight projects 206 | Generated_Code/ 207 | 208 | # Backup & report files from converting an old project file 209 | # to a newer Visual Studio version. Backup files are not needed, 210 | # because we have git ;-) 211 | _UpgradeReport_Files/ 212 | Backup*/ 213 | UpgradeLog*.XML 214 | UpgradeLog*.htm 215 | 216 | # SQL Server files 217 | *.mdf 218 | *.ldf 219 | 220 | # Business Intelligence projects 221 | *.rdl.data 222 | *.bim.layout 223 | *.bim_*.settings 224 | 225 | # Microsoft Fakes 226 | FakesAssemblies/ 227 | 228 | # GhostDoc plugin setting file 229 | *.GhostDoc.xml 230 | 231 | # Node.js Tools for Visual Studio 232 | .ntvs_analysis.dat 233 | 234 | # Visual Studio 6 build log 235 | *.plg 236 | 237 | # Visual Studio 6 workspace options file 238 | *.opt 239 | 240 | # Visual Studio LightSwitch build output 241 | **/*.HTMLClient/GeneratedArtifacts 242 | **/*.DesktopClient/GeneratedArtifacts 243 | **/*.DesktopClient/ModelManifest.xml 244 | **/*.Server/GeneratedArtifacts 245 | **/*.Server/ModelManifest.xml 246 | _Pvt_Extensions 247 | 248 | # Paket dependency manager 249 | .paket/paket.exe 250 | paket-files/ 251 | 252 | # FAKE - F# Make 253 | .fake/ 254 | 255 | # JetBrains Rider 256 | .idea/ 257 | *.sln.iml 258 | 259 | # CodeRush 260 | .cr/ 261 | 262 | # Python Tools for Visual Studio (PTVS) 263 | __pycache__/ 264 | *.pyc 265 | 266 | MultiRPC.sln.DotSettings 267 | -------------------------------------------------------------------------------- /MultiRPC.sln: -------------------------------------------------------------------------------- 1 |  2 | Microsoft Visual Studio Solution File, Format Version 12.00 3 | # Visual Studio Version 16 4 | VisualStudioVersion = 16.0.29201.188 5 | MinimumVisualStudioVersion = 10.0.40219.1 6 | Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "MultiRPC", "MultiRPC\MultiRPC.csproj", "{9EA9E3C8-C1A4-4A26-84BD-543789EE437D}" 7 | EndProject 8 | Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "MultiRPCCore", "MultiRPC\MultiRPCCore.csproj", "{8641E29E-5DD4-45A5-A159-7C4A103E40D3}" 9 | EndProject 10 | Global 11 | GlobalSection(SolutionConfigurationPlatforms) = preSolution 12 | Debug|Any CPU = Debug|Any CPU 13 | Release|Any CPU = Release|Any CPU 14 | EndGlobalSection 15 | GlobalSection(ProjectConfigurationPlatforms) = postSolution 16 | {9EA9E3C8-C1A4-4A26-84BD-543789EE437D}.Debug|Any CPU.ActiveCfg = Debug|Any CPU 17 | {9EA9E3C8-C1A4-4A26-84BD-543789EE437D}.Debug|Any CPU.Build.0 = Debug|Any CPU 18 | {9EA9E3C8-C1A4-4A26-84BD-543789EE437D}.Release|Any CPU.ActiveCfg = Release|Any CPU 19 | {9EA9E3C8-C1A4-4A26-84BD-543789EE437D}.Release|Any CPU.Build.0 = Release|Any CPU 20 | {8641E29E-5DD4-45A5-A159-7C4A103E40D3}.Debug|Any CPU.ActiveCfg = Debug|Any CPU 21 | {8641E29E-5DD4-45A5-A159-7C4A103E40D3}.Debug|Any CPU.Build.0 = Debug|Any CPU 22 | {8641E29E-5DD4-45A5-A159-7C4A103E40D3}.Release|Any CPU.ActiveCfg = Release|Any CPU 23 | {8641E29E-5DD4-45A5-A159-7C4A103E40D3}.Release|Any CPU.Build.0 = Release|Any CPU 24 | EndGlobalSection 25 | GlobalSection(SolutionProperties) = preSolution 26 | HideSolutionNode = FALSE 27 | EndGlobalSection 28 | GlobalSection(ExtensibilityGlobals) = postSolution 29 | SolutionGuid = {5FEA78DE-0EAB-4673-B5C1-989FD3E64C39} 30 | EndGlobalSection 31 | EndGlobal 32 | -------------------------------------------------------------------------------- /MultiRPC/App.config: -------------------------------------------------------------------------------- 1 |  2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | -------------------------------------------------------------------------------- /MultiRPC/Assets/150x150Logo.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/FluxpointDev/MultiRPC/ddefcaf6c61817ebaa7e48cc544fbe6bb158c27c/MultiRPC/Assets/150x150Logo.png -------------------------------------------------------------------------------- /MultiRPC/Assets/70x70Logo.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/FluxpointDev/MultiRPC/ddefcaf6c61817ebaa7e48cc544fbe6bb158c27c/MultiRPC/Assets/70x70Logo.png -------------------------------------------------------------------------------- /MultiRPC/Assets/ClientIDHelp.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/FluxpointDev/MultiRPC/ddefcaf6c61817ebaa7e48cc544fbe6bb158c27c/MultiRPC/Assets/ClientIDHelp.jpg -------------------------------------------------------------------------------- /MultiRPC/Assets/LargeTextHelp.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/FluxpointDev/MultiRPC/ddefcaf6c61817ebaa7e48cc544fbe6bb158c27c/MultiRPC/Assets/LargeTextHelp.jpg -------------------------------------------------------------------------------- /MultiRPC/Assets/Loading.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/FluxpointDev/MultiRPC/ddefcaf6c61817ebaa7e48cc544fbe6bb158c27c/MultiRPC/Assets/Loading.gif -------------------------------------------------------------------------------- /MultiRPC/Assets/LottieAnimations/CreditsIconAnimation.json: -------------------------------------------------------------------------------- 1 | {"v":"5.3.4","fr":60,"ip":0,"op":60,"w":150,"h":150,"nm":"CreditsIconAnimation ","ddd":0,"assets":[],"layers":[{"ddd":0,"ind":1,"ty":1,"nm":"Colour","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[75,75,0],"ix":2},"a":{"a":0,"k":[400.5,329,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"hasMask":true,"masksProperties":[{"inv":false,"mode":"a","pt":{"a":1,"k":[{"i":{"x":0,"y":1},"o":{"x":0.167,"y":0.167},"n":"0_1_0p167_0p167","t":0,"s":[{"i":[[-10.737,0],[0,0],[0,-10.737],[0,0],[10.737,0],[0,0],[0,10.737],[0,0]],"o":[[0,0],[10.737,0],[0,0],[0,10.737],[0,0],[-10.737,0],[0,0],[0,-10.737]],"v":[[349.113,254.75],[451.887,254.75],[471.328,274.19],[471.328,274.19],[451.887,293.631],[349.113,293.631],[329.672,274.19],[329.672,274.19]],"c":true}],"e":[{"i":[[-10.737,0],[0,0],[0,-10.736],[0,0],[10.737,0],[0,0],[0,10.738],[0,0]],"o":[[0,0],[10.737,0],[0,0],[0,10.738],[0,0],[-10.737,0],[0,0],[0,-10.736]],"v":[[349.113,365],[451.887,365],[471.328,384.44],[471.328,384.44],[451.887,403.882],[349.113,403.882],[329.672,384.44],[329.672,384.44]],"c":true}]},{"i":{"x":0.445,"y":0.73},"o":{"x":0.877,"y":0},"n":"0p445_0p73_0p877_0","t":30,"s":[{"i":[[-10.737,0],[0,0],[0,-10.736],[0,0],[10.737,0],[0,0],[0,10.738],[0,0]],"o":[[0,0],[10.737,0],[0,0],[0,10.738],[0,0],[-10.737,0],[0,0],[0,-10.736]],"v":[[349.113,365],[451.887,365],[471.328,384.44],[471.328,384.44],[451.887,403.882],[349.113,403.882],[329.672,384.44],[329.672,384.44]],"c":true}],"e":[{"i":[[-10.737,0],[0,0],[0,-10.737],[0,0],[10.737,0],[0,0],[0,10.737],[0,0]],"o":[[0,0],[10.737,0],[0,0],[0,10.737],[0,0],[-10.737,0],[0,0],[0,-10.737]],"v":[[349.113,254],[451.887,254],[471.328,273.44],[471.328,273.44],[451.887,292.881],[349.113,292.881],[329.672,273.44],[329.672,273.44]],"c":true}]},{"t":59}],"ix":1},"o":{"a":0,"k":100,"ix":3},"x":{"a":0,"k":0,"ix":4},"nm":"Mask 2"},{"inv":false,"mode":"a","pt":{"a":1,"k":[{"i":{"x":0,"y":1},"o":{"x":0.167,"y":0.167},"n":"0_1_0p167_0p167","t":0,"s":[{"i":[[-10.737,0],[0,0],[0,-10.737],[0,0],[10.737,0],[0,0],[0,10.737],[0,0]],"o":[[0,0],[10.737,0],[0,0],[0,10.737],[0,0],[-10.737,0],[0,0],[0,-10.737]],"v":[[349.113,309.56],[451.887,309.56],[471.328,329],[471.328,329],[451.887,348.44],[349.113,348.44],[329.672,329],[329.672,329]],"c":true}],"e":[{"i":[[-10.737,0],[0,0],[0,-10.736],[0,0],[10.737,0],[0,0],[0,10.736],[0,0]],"o":[[0,0],[10.737,0],[0,0],[0,10.736],[0,0],[-10.737,0],[0,0],[0,-10.736]],"v":[[349.113,364.995],[451.887,364.995],[471.328,384.434],[471.328,384.434],[451.887,403.874],[349.113,403.874],[329.672,384.434],[329.672,384.434]],"c":true}]},{"i":{"x":0.445,"y":0.73},"o":{"x":0.877,"y":0},"n":"0p445_0p73_0p877_0","t":30,"s":[{"i":[[-10.737,0],[0,0],[0,-10.736],[0,0],[10.737,0],[0,0],[0,10.736],[0,0]],"o":[[0,0],[10.737,0],[0,0],[0,10.736],[0,0],[-10.737,0],[0,0],[0,-10.736]],"v":[[349.113,364.995],[451.887,364.995],[471.328,384.434],[471.328,384.434],[451.887,403.874],[349.113,403.874],[329.672,384.434],[329.672,384.434]],"c":true}],"e":[{"i":[[-10.737,0],[0,0],[0,-10.737],[0,0],[10.737,0],[0,0],[0,10.737],[0,0]],"o":[[0,0],[10.737,0],[0,0],[0,10.737],[0,0],[-10.737,0],[0,0],[0,-10.737]],"v":[[349.113,309.56],[451.887,309.56],[471.328,329],[471.328,329],[451.887,348.44],[349.113,348.44],[329.672,329],[329.672,329]],"c":true}]},{"t":59}],"ix":1},"o":{"a":0,"k":100,"ix":3},"x":{"a":0,"k":0,"ix":4},"nm":"Mask 3"},{"inv":false,"mode":"a","pt":{"a":1,"k":[{"i":{"x":0,"y":1},"o":{"x":0.167,"y":0.167},"n":"0_1_0p167_0p167","t":0,"s":[{"i":[[-10.737,0],[0,0],[0,-10.737],[0,0],[10.737,0],[0,0],[0,10.737],[0,0]],"o":[[0,0],[10.737,0],[0,0],[0,10.737],[0,0],[-10.737,0],[0,0],[0,-10.737]],"v":[[349.113,365.119],[451.887,365.119],[471.328,384.56],[471.328,384.56],[451.887,404],[349.113,404],[329.672,384.56],[329.672,384.56]],"c":true}],"e":[{"i":[[-10.737,0],[0,0],[0,-10.737],[0,0],[10.737,0],[0,0],[0,10.737],[0,0]],"o":[[0,0],[10.737,0],[0,0],[0,10.737],[0,0],[-10.737,0],[0,0],[0,-10.737]],"v":[[349.113,365.119],[451.887,365.119],[471.328,384.56],[471.328,384.56],[451.887,404],[349.113,404],[329.672,384.56],[329.672,384.56]],"c":true}]},{"i":{"x":0.445,"y":0.73},"o":{"x":0.877,"y":0},"n":"0p445_0p73_0p877_0","t":30,"s":[{"i":[[-10.737,0],[0,0],[0,-10.737],[0,0],[10.737,0],[0,0],[0,10.737],[0,0]],"o":[[0,0],[10.737,0],[0,0],[0,10.737],[0,0],[-10.737,0],[0,0],[0,-10.737]],"v":[[349.113,365.119],[451.887,365.119],[471.328,384.56],[471.328,384.56],[451.887,404],[349.113,404],[329.672,384.56],[329.672,384.56]],"c":true}],"e":[{"i":[[-10.737,0],[0,0],[0,-10.737],[0,0],[10.737,0],[0,0],[0,10.737],[0,0]],"o":[[0,0],[10.737,0],[0,0],[0,10.737],[0,0],[-10.737,0],[0,0],[0,-10.737]],"v":[[349.113,365.119],[451.887,365.119],[471.328,384.56],[471.328,384.56],[451.887,404],[349.113,404],[329.672,384.56],[329.672,384.56]],"c":true}]},{"t":59}],"ix":1},"o":{"a":0,"k":100,"ix":3},"x":{"a":0,"k":0,"ix":4},"nm":"Mask 4"}],"sw":801,"sh":658,"sc":"#ffffff","ip":0,"op":60,"st":0,"bm":0}],"markers":[]} -------------------------------------------------------------------------------- /MultiRPC/Assets/LottieAnimations/CustomIconAnimation.json: -------------------------------------------------------------------------------- 1 | {"v":"5.3.4","fr":60,"ip":0,"op":120,"w":107,"h":159,"nm":"CustomIconAnimation","ddd":0,"assets":[],"layers":[{"ddd":0,"ind":1,"ty":1,"nm":"White Solid 1","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[53.5,79.5,0],"ix":2},"a":{"a":0,"k":[53.5,79.5,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"hasMask":true,"masksProperties":[{"inv":false,"mode":"f","pt":{"a":1,"k":[{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"n":"0p833_0p833_0p167_0p167","t":0,"s":[{"i":[[-11.648,0],[0,-11.648],[11.648,0],[0,11.648]],"o":[[11.648,0],[0,11.648],[-11.648,0],[0,-11.648]],"v":[[21.589,58.413],[42.679,79.503],[21.589,100.594],[0.498,79.503]],"c":true}],"e":[{"i":[[-11.648,0],[0,-11.648],[11.648,0],[0,11.648]],"o":[[11.648,0],[0,11.648],[-11.648,0],[0,-11.648]],"v":[[21.589,58.413],[42.679,79.503],[21.589,100.594],[0.498,79.503]],"c":true}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"n":"0p833_0p833_0p167_0p167","t":20,"s":[{"i":[[-11.648,0],[0,-11.648],[11.648,0],[0,11.648]],"o":[[11.648,0],[0,11.648],[-11.648,0],[0,-11.648]],"v":[[21.589,58.413],[42.679,79.503],[21.589,100.594],[0.498,79.503]],"c":true}],"e":[{"i":[[-11.648,0],[0,-11.648],[11.648,0],[0,11.648]],"o":[[11.648,0],[0,11.648],[-11.648,0],[0,-11.648]],"v":[[21.589,58.413],[42.679,79.503],[21.589,100.594],[0.498,79.503]],"c":true}]},{"t":30}],"ix":1},"o":{"a":0,"k":100,"ix":3},"x":{"a":0,"k":0,"ix":4},"nm":"Mask 1"},{"inv":false,"mode":"f","pt":{"a":1,"k":[{"i":{"x":0,"y":1},"o":{"x":0.167,"y":0.167},"n":"0_1_0p167_0p167","t":0,"s":[{"i":[[-11.648,0],[-3.816,-3.816],[0,-5.824],[3.817,-3.817],[5.824,0],[0,11.648]],"o":[[5.824,0],[3.817,3.817],[0,5.824],[-3.816,3.817],[-11.648,0],[0,-11.648]],"v":[[21.589,116.71],[36.502,122.887],[42.679,137.8],[36.502,152.714],[21.589,158.891],[0.498,137.8]],"c":true}],"e":[{"i":[[-11.708,0],[0,0],[0,-14.734],[14.698,0],[0,0],[0,16.207]],"o":[[0,0],[11.708,0],[0,14.391],[0,0],[-11.708,0],[0,-16.168]],"v":[[21.698,115.718],[85.302,115.718],[106.283,136.984],[85.302,158.117],[21.698,158.117],[0.498,136.918]],"c":true}]},{"i":{"x":0.383,"y":0.534},"o":{"x":0.754,"y":0},"n":"0p383_0p534_0p754_0","t":20,"s":[{"i":[[-11.708,0],[0,0],[0,-14.734],[14.698,0],[0,0],[0,16.207]],"o":[[0,0],[11.708,0],[0,14.391],[0,0],[-11.708,0],[0,-16.168]],"v":[[21.698,115.718],[85.302,115.718],[106.283,136.984],[85.302,158.117],[21.698,158.117],[0.498,136.918]],"c":true}],"e":[{"i":[[-11.648,0],[-3.816,-3.816],[0,-5.824],[3.817,-3.817],[5.824,0],[0,11.648]],"o":[[5.824,0],[3.817,3.817],[0,5.824],[-3.816,3.817],[-11.648,0],[0,-11.648]],"v":[[21.589,116.71],[36.502,122.887],[42.679,137.8],[36.502,152.714],[21.589,158.891],[0.498,137.8]],"c":true}]},{"t":120}],"ix":1},"o":{"a":0,"k":100,"ix":3},"x":{"a":0,"k":0,"ix":4},"nm":"Mask 2"},{"inv":false,"mode":"f","pt":{"a":1,"k":[{"i":{"x":0,"y":1},"o":{"x":0.167,"y":0.167},"n":"0_1_0p167_0p167","t":0,"s":[{"i":[[-11.708,0],[0,0],[0,-11.708],[0,0],[11.708,0],[0,0],[0,11.708],[0,0]],"o":[[0,0],[11.708,0],[0,0],[0,11.708],[0,0],[-11.708,0],[0,0],[0,-11.708]],"v":[[21.698,0.109],[85.302,0.109],[106.502,21.309],[106.502,21.309],[85.302,42.508],[21.698,42.508],[0.498,21.309],[0.498,21.309]],"c":true}],"e":[{"i":[[-11.708,0],[0,0],[0,-11.708],[0,0],[11.708,0],[0,0],[0,11.708],[0,0]],"o":[[0,0],[11.708,0],[0,0],[0,11.708],[0,0],[-11.708,0],[0,0],[0,-11.708]],"v":[[21.698,0.109],[21.912,0.109],[43.111,21.309],[43.111,21.309],[21.912,42.508],[21.698,42.508],[0.498,21.309],[0.498,21.309]],"c":true}]},{"i":{"x":0.383,"y":0.534},"o":{"x":0.754,"y":0},"n":"0p383_0p534_0p754_0","t":20,"s":[{"i":[[-11.708,0],[0,0],[0,-11.708],[0,0],[11.708,0],[0,0],[0,11.708],[0,0]],"o":[[0,0],[11.708,0],[0,0],[0,11.708],[0,0],[-11.708,0],[0,0],[0,-11.708]],"v":[[21.698,0.109],[21.912,0.109],[43.111,21.309],[43.111,21.309],[21.912,42.508],[21.698,42.508],[0.498,21.309],[0.498,21.309]],"c":true}],"e":[{"i":[[-11.708,0],[0,0],[0,-11.708],[0,0],[11.708,0],[0,0],[0,11.708],[0,0]],"o":[[0,0],[11.708,0],[0,0],[0,11.708],[0,0],[-11.708,0],[0,0],[0,-11.708]],"v":[[21.698,0.109],[85.302,0.109],[106.502,21.309],[106.502,21.309],[85.302,42.508],[21.698,42.508],[0.498,21.309],[0.498,21.309]],"c":true}]},{"t":120}],"ix":1},"o":{"a":0,"k":100,"ix":3},"x":{"a":0,"k":0,"ix":4},"nm":"Mask 3"}],"sw":107,"sh":159,"sc":"#ffffff","ip":0,"op":120,"st":0,"bm":0}],"markers":[]} -------------------------------------------------------------------------------- /MultiRPC/Assets/LottieAnimations/IconAnimations.aep: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/FluxpointDev/MultiRPC/ddefcaf6c61817ebaa7e48cc544fbe6bb158c27c/MultiRPC/Assets/LottieAnimations/IconAnimations.aep -------------------------------------------------------------------------------- /MultiRPC/Assets/LottieAnimations/LogsIconAnimation.json: -------------------------------------------------------------------------------- 1 | {"v":"5.3.4","fr":60,"ip":0,"op":60,"w":156,"h":156,"nm":"LogsIconAnimation ","ddd":0,"assets":[],"layers":[{"ddd":0,"ind":1,"ty":1,"nm":"Colour","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[78,78,0],"ix":2},"a":{"a":0,"k":[400.5,329,0],"ix":1},"s":{"a":0,"k":[98.718,98.718,100],"ix":6}},"ao":0,"hasMask":true,"masksProperties":[{"inv":false,"mode":"f","pt":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[349.649,299.408],[407.018,299.408],[407.018,304.629],[349.649,304.629],[349.649,299.408]],"c":true},"ix":1},"o":{"a":0,"k":100,"ix":3},"x":{"a":0,"k":0,"ix":4},"nm":"Mask 1"},{"inv":false,"mode":"f","pt":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0]],"v":[[349.649,341.178],[373.558,341.178],[373.558,346.399],[349.649,346.399]],"c":true},"ix":1},"o":{"a":0,"k":100,"ix":3},"x":{"a":0,"k":0,"ix":4},"nm":"Mask 3"},{"inv":false,"mode":"f","pt":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0]],"v":[[349.649,362.063],[363.991,362.063],[363.991,367.284],[349.649,367.284]],"c":true},"ix":1},"o":{"a":0,"k":100,"ix":3},"x":{"a":0,"k":0,"ix":4},"nm":"Mask 4"},{"inv":false,"mode":"f","pt":{"a":0,"k":{"i":[[0,0],[9.089,0],[0,0],[0,9.264],[0,0],[-9.089,0],[0,0],[0,0],[-2.961,0],[0,3.072],[0,0],[0,0],[0,0],[-2.961,0],[0,3.072],[0,0],[0,0],[0,0],[-2.961,0],[0,3.072],[0,0],[0,0],[0,0],[-2.961,0],[0,3.072],[0,0],[0,0],[0,-9.265],[0,0],[0,0],[0,0],[10.331,0],[0,0],[0,0],[2.961,0],[0,-3.072],[0,0],[0,0],[0,0],[2.961,0],[0,-3.072],[0,0],[0,0],[0,0],[2.961,0],[0,-3.072],[0,0],[0,0],[0,0],[2.961,0],[0,-3.072],[0,0],[0,0],[0,-10.554],[0,0],[-10.331,0],[0,0],[0,10.554],[0,0],[0,0],[0,0]],"o":[[0,9.28],[0,0],[-9.089,0],[0,0],[0,-9.28],[0,0],[0,0],[0,3.072],[2.961,0],[0,0],[0,0],[0,0],[0,3.072],[2.961,0],[0,0],[0,0],[0,0],[0,3.072],[2.961,0],[0,0],[0,0],[0,0],[0,3.072],[2.961,0],[0,0],[0,0],[9.089,0],[0,0],[0,0],[0,0],[0,-10.554],[0,0],[0,0],[0,-3.072],[-2.961,0],[0,0],[0,0],[0,0],[0,-3.072],[-2.961,0],[0,0],[0,0],[0,0],[0,-3.072],[-2.961,0],[0,0],[0,0],[0,0],[0,-3.072],[-2.961,0],[0,0],[0,0],[-10.347,0],[0,0],[0,10.554],[0,0],[10.347,0],[0,0],[0,0],[0,0],[0,0]],"v":[[447.642,381.387],[431.183,398.181],[347.818,398.181],[331.359,381.387],[331.359,286.434],[347.818,269.64],[349.649,269.64],[349.649,275.451],[355.013,281.006],[360.378,275.451],[360.378,269.625],[368.783,269.625],[368.783,275.435],[374.147,280.99],[379.512,275.435],[379.512,269.625],[387.917,269.625],[387.917,275.435],[393.281,280.99],[398.646,275.435],[398.646,269.625],[407.05,269.625],[407.05,275.435],[412.415,280.99],[417.779,275.435],[417.779,269.625],[431.23,269.625],[447.69,286.418],[447.69,288.679],[457.098,288.679],[457.098,279.924],[438.378,260.822],[417.732,260.822],[417.732,256.555],[412.367,251],[407.003,256.555],[407.003,260.822],[398.598,260.822],[398.598,256.555],[393.233,251],[387.869,256.555],[387.869,260.822],[379.464,260.822],[379.464,256.555],[374.099,251],[368.735,256.555],[368.735,260.822],[360.33,260.822],[360.33,256.555],[354.966,251],[349.649,256.555],[349.649,260.822],[340.671,260.822],[321.951,279.924],[321.951,387.898],[340.671,407],[438.314,407],[457.034,387.898],[457.034,368.096],[447.626,368.096],[447.626,381.387]],"c":true},"ix":1},"o":{"a":0,"k":100,"ix":3},"x":{"a":0,"k":0,"ix":4},"nm":"Mask 7"},{"inv":false,"mode":"f","pt":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0]],"v":[[349.649,320.293],[383.109,320.293],[383.109,325.514],[349.649,325.514]],"c":true},"ix":1},"o":{"a":0,"k":100,"ix":3},"x":{"a":0,"k":0,"ix":4},"nm":"Mask 2"},{"inv":false,"mode":"f","pt":{"a":1,"k":[{"i":{"x":0.667,"y":1},"o":{"x":0.167,"y":0.167},"n":"0p667_1_0p167_0p167","t":0,"s":[{"i":[[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0]],"v":[[387.089,361.919],[387.089,389.92],[412.733,389.92]],"c":true}],"e":[{"i":[[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0]],"v":[[349.641,339.222],[349.641,367.223],[375.283,367.223]],"c":true}]},{"i":{"x":0,"y":0.69},"o":{"x":0.333,"y":0},"n":"0_0p69_0p333_0","t":15,"s":[{"i":[[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0]],"v":[[349.641,339.222],[349.641,367.223],[375.283,367.223]],"c":true}],"e":[{"i":[[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0]],"v":[[364.012,339.159],[364.012,367.159],[389.654,367.159]],"c":true}]},{"i":{"x":0.833,"y":0.833},"o":{"x":1,"y":0},"n":"0p833_0p833_1_0","t":35,"s":[{"i":[[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0]],"v":[[364.012,339.159],[364.012,367.159],[389.654,367.159]],"c":true}],"e":[{"i":[[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0]],"v":[[387.089,361.919],[387.089,389.92],[412.733,389.92]],"c":true}]},{"t":60}],"ix":1},"o":{"a":0,"k":100,"ix":3},"x":{"a":0,"k":0,"ix":4},"nm":"Mask 5"},{"inv":false,"mode":"f","pt":{"a":1,"k":[{"i":{"x":0.667,"y":1},"o":{"x":0.167,"y":0.167},"n":"0p667_1_0p167_0p167","t":0,"s":[{"i":[[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0]],"v":[[391.021,357.239],[417.063,385.685],[464.532,333.855],[438.489,305.409]],"c":true}],"e":[{"i":[[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0]],"v":[[353.573,334.542],[379.615,362.988],[427.081,311.158],[401.038,282.712]],"c":true}]},{"i":{"x":0,"y":0.69},"o":{"x":0.333,"y":0},"n":"0_0p69_0p333_0","t":15,"s":[{"i":[[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0]],"v":[[353.573,334.542],[379.615,362.988],[427.081,311.158],[401.038,282.712]],"c":true}],"e":[{"i":[[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0]],"v":[[367.944,334.479],[393.987,362.925],[441.453,311.095],[415.41,282.648]],"c":true}]},{"i":{"x":0.833,"y":0.833},"o":{"x":1,"y":0},"n":"0p833_0p833_1_0","t":35,"s":[{"i":[[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0]],"v":[[367.944,334.479],[393.987,362.925],[441.453,311.095],[415.41,282.648]],"c":true}],"e":[{"i":[[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0]],"v":[[391.021,357.239],[417.063,385.685],[464.532,333.855],[438.489,305.409]],"c":true}]},{"t":60}],"ix":1},"o":{"a":0,"k":100,"ix":3},"x":{"a":0,"k":0,"ix":4},"nm":"Mask 6"},{"inv":false,"mode":"f","pt":{"a":1,"k":[{"i":{"x":0.667,"y":1},"o":{"x":0.167,"y":0.167},"n":"0p667_1_0p167_0p167","t":0,"s":[{"i":[[4.139,4.091],[0,0],[3.868,-4.187],[0,0],[0,0],[-3.868,4.203]],"o":[[0,0],[-4.123,-4.091],[-3.868,4.187],[0,0],[0,0],[3.852,-4.186]],"v":[[474.703,307.351],[462.128,294.903],[447.658,295.094],[441.402,302.544],[467.747,330.305],[475.197,322.346]],"c":true}],"e":[{"i":[[4.139,4.091],[0,0],[3.869,-4.187],[0,0],[0,0],[-3.868,4.203]],"o":[[0,0],[-4.122,-4.091],[-3.868,4.187],[0,0],[0,0],[3.852,-4.187]],"v":[[437.252,284.654],[424.677,272.206],[410.207,272.397],[403.951,279.846],[430.296,307.608],[437.746,299.649]],"c":true}]},{"i":{"x":0,"y":0.69},"o":{"x":0.333,"y":0},"n":"0_0p69_0p333_0","t":15,"s":[{"i":[[4.139,4.091],[0,0],[3.869,-4.187],[0,0],[0,0],[-3.868,4.203]],"o":[[0,0],[-4.122,-4.091],[-3.868,4.187],[0,0],[0,0],[3.852,-4.187]],"v":[[437.252,284.654],[424.677,272.206],[410.207,272.397],[403.951,279.846],[430.296,307.608],[437.746,299.649]],"c":true}],"e":[{"i":[[4.139,4.091],[0,0],[3.869,-4.187],[0,0],[0,0],[-3.868,4.203]],"o":[[0,0],[-4.122,-4.091],[-3.868,4.187],[0,0],[0,0],[3.852,-4.187]],"v":[[451.624,284.59],[439.049,272.142],[424.579,272.333],[418.323,279.783],[444.668,307.545],[452.118,299.586]],"c":true}]},{"i":{"x":0.833,"y":0.833},"o":{"x":1,"y":0},"n":"0p833_0p833_1_0","t":35,"s":[{"i":[[4.139,4.091],[0,0],[3.869,-4.187],[0,0],[0,0],[-3.868,4.203]],"o":[[0,0],[-4.122,-4.091],[-3.868,4.187],[0,0],[0,0],[3.852,-4.187]],"v":[[451.624,284.59],[439.049,272.142],[424.579,272.333],[418.323,279.783],[444.668,307.545],[452.118,299.586]],"c":true}],"e":[{"i":[[4.139,4.091],[0,0],[3.868,-4.187],[0,0],[0,0],[-3.868,4.203]],"o":[[0,0],[-4.123,-4.091],[-3.868,4.187],[0,0],[0,0],[3.852,-4.186]],"v":[[474.703,307.351],[462.128,294.903],[447.658,295.094],[441.402,302.544],[467.747,330.305],[475.197,322.346]],"c":true}]},{"t":60}],"ix":1},"o":{"a":0,"k":100,"ix":3},"x":{"a":0,"k":0,"ix":4},"nm":"Mask 8"}],"sw":801,"sh":658,"sc":"#ffffff","ip":0,"op":60,"st":0,"bm":0}],"markers":[]} -------------------------------------------------------------------------------- /MultiRPC/Assets/LottieAnimations/SettingsIconAnimation.json: -------------------------------------------------------------------------------- 1 | {"v":"5.3.4","fr":60,"ip":0,"op":60,"w":150,"h":150,"nm":"SettingsIconAnimation","ddd":0,"assets":[],"layers":[{"ddd":0,"ind":1,"ty":1,"nm":"Colour","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":1,"k":[{"i":{"x":[0],"y":[1]},"o":{"x":[0.167],"y":[0.167]},"n":["0_1_0p167_0p167"],"t":0,"s":[0],"e":[-25]},{"i":{"x":[0],"y":[1]},"o":{"x":[0.333],"y":[0]},"n":["0_1_0p333_0"],"t":10,"s":[-25],"e":[415]},{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"n":["0p667_1_0p333_0"],"t":45,"s":[415],"e":[360]},{"t":60}],"ix":10},"p":{"a":0,"k":[75,75,0],"ix":2},"a":{"a":0,"k":[400.5,329,0],"ix":1},"s":{"a":0,"k":[96.765,96.765,100],"ix":6}},"ao":0,"hasMask":true,"masksProperties":[{"inv":false,"mode":"a","pt":{"a":0,"k":{"i":[[0,0],[-0.032,2.568],[0.305,2.55],[0,0],[1.136,1.617],[0,0],[1.762,-0.783],[0,0],[4.636,1.985],[0,0],[1.889,-0.106],[0,0],[0.269,-1.836],[0,0],[3.902,-3.208],[0,0],[0.968,-1.649],[0,0],[-1.589,-1.161],[0,0],[0.032,-2.568],[-0.305,-2.55],[0,0],[-0.922,-1.707],[0,0],[-1.764,0.738],[0,0],[-4.636,-1.985],[0,0],[-1.855,0.014],[0,0],[-0.269,1.836],[0,0],[-3.901,3.208],[0,0],[-0.967,1.649],[0,0],[1.416,1.282]],"o":[[0.314,-2.549],[-0.041,-2.568],[0,0],[1.578,-1.19],[0,0],[-0.939,-1.684],[0,0],[-3.966,-3.115],[0,0],[-0.186,-1.883],[0,0],[-1.855,-0.014],[0,0],[-4.687,1.883],[0,0],[-1.764,-0.738],[0,0],[-1.001,1.695],[0,0],[-0.314,2.549],[0.041,2.568],[0,0],[-1.521,1.204],[0,0],[0.967,1.649],[0,0],[3.966,3.115],[0,0],[0.269,1.836],[0,0],[1.855,0.014],[0,0],[4.687,-1.883],[0,0],[1.764,0.738],[0,0],[0.953,-1.655],[0,0]],"v":[[457.782,336.596],[458.3,328.914],[457.782,321.232],[474.204,308.516],[474.997,303.483],[459.633,276.994],[454.863,275.403],[435.528,283.085],[422.569,275.403],[419.635,255.005],[415.924,251.827],[384.93,251.827],[381.224,255.005],[378.311,275.672],[365.352,283.354],[345.991,275.403],[341.222,276.994],[325.868,303.747],[326.904,308.78],[343.342,321.496],[342.823,329.178],[343.342,336.86],[326.904,349.576],[325.868,354.609],[341.232,381.098],[346.001,382.689],[365.341,375.007],[378.301,382.689],[381.214,403.087],[384.92,406.265],[415.913,406.265],[419.62,403.087],[422.533,382.689],[435.492,375.007],[454.832,382.689],[459.601,381.098],[474.966,354.345],[474.173,349.312]],"c":true},"ix":1},"o":{"a":0,"k":100,"ix":3},"x":{"a":0,"k":0,"ix":4},"nm":"Mask 1"},{"inv":false,"mode":"s","pt":{"a":0,"k":{"i":[[14.899,-0.06],[0,14.924],[-14.924,0],[0,-14.924],[0,0]],"o":[[-14.924,0],[0,-14.924],[14.924,0],[0,0],[-0.06,14.899]],"v":[[400.559,356.201],[373.537,329.178],[400.559,302.156],[427.582,329.178],[427.582,329.178]],"c":true},"ix":1},"o":{"a":0,"k":100,"ix":3},"x":{"a":0,"k":0,"ix":4},"nm":"Mask 2"}],"sw":801,"sh":658,"sc":"#ffffff","ip":0,"op":60,"st":0,"bm":0}],"markers":[]} -------------------------------------------------------------------------------- /MultiRPC/Assets/MultiRPCLogo.ai: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/FluxpointDev/MultiRPC/ddefcaf6c61817ebaa7e48cc544fbe6bb158c27c/MultiRPC/Assets/MultiRPCLogo.ai -------------------------------------------------------------------------------- /MultiRPC/Assets/Other/Loading Animation.aep: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/FluxpointDev/MultiRPC/ddefcaf6c61817ebaa7e48cc544fbe6bb158c27c/MultiRPC/Assets/Other/Loading Animation.aep -------------------------------------------------------------------------------- /MultiRPC/Assets/Other/Loading Animation.prproj: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/FluxpointDev/MultiRPC/ddefcaf6c61817ebaa7e48cc544fbe6bb158c27c/MultiRPC/Assets/Other/Loading Animation.prproj -------------------------------------------------------------------------------- /MultiRPC/Assets/SmallAndLargeKeyHelp.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/FluxpointDev/MultiRPC/ddefcaf6c61817ebaa7e48cc544fbe6bb158c27c/MultiRPC/Assets/SmallAndLargeKeyHelp.jpg -------------------------------------------------------------------------------- /MultiRPC/Assets/SmallTextHelp.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/FluxpointDev/MultiRPC/ddefcaf6c61817ebaa7e48cc544fbe6bb158c27c/MultiRPC/Assets/SmallTextHelp.jpg -------------------------------------------------------------------------------- /MultiRPC/Assets/Svg files/AddIcon.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | -------------------------------------------------------------------------------- /MultiRPC/Assets/Svg files/AlertIcon.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 5 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | -------------------------------------------------------------------------------- /MultiRPC/Assets/Svg files/BrowserIcon.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /MultiRPC/Assets/Svg files/CreditsIcon.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /MultiRPC/Assets/Svg files/CustomIcon.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /MultiRPC/Assets/Svg files/DeleteIcon.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | -------------------------------------------------------------------------------- /MultiRPC/Assets/Svg files/DiscordColourIcon.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 5 | 8 | 16 | 17 | -------------------------------------------------------------------------------- /MultiRPC/Assets/Svg files/DiscordIcon.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /MultiRPC/Assets/Svg files/DownloadIcon.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | -------------------------------------------------------------------------------- /MultiRPC/Assets/Svg files/FluxpointDevelopmentIcon.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 5 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 20 | 23 | 26 | 27 | 28 | 29 | -------------------------------------------------------------------------------- /MultiRPC/Assets/Svg files/GithubIcon.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 5 | 6 | 12 | 13 | 14 | -------------------------------------------------------------------------------- /MultiRPC/Assets/Svg files/HeartIcon.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /MultiRPC/Assets/Svg files/HelpIcon.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 5 | 9 | 12 | 14 | 15 | 16 | -------------------------------------------------------------------------------- /MultiRPC/Assets/Svg files/InfoIcon.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | -------------------------------------------------------------------------------- /MultiRPC/Assets/Svg files/LogsIcon.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | Svg Vector Icons : http://www.onlinewebfonts.com/icon 6 | 7 | -------------------------------------------------------------------------------- /MultiRPC/Assets/Svg files/MultiRPCLogo.svg: -------------------------------------------------------------------------------- 1 | MultiRPCLogo -------------------------------------------------------------------------------- /MultiRPC/Assets/Svg files/PencilIcon.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 5 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | 31 | 32 | 33 | 34 | 35 | 36 | 37 | 38 | 39 | 40 | 41 | 42 | 43 | -------------------------------------------------------------------------------- /MultiRPC/Assets/Svg files/ProgramsIcon.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /MultiRPC/Assets/Svg files/SettingsIcon.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /MultiRPC/Assets/Svg files/ShareIcon.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 5 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | 31 | 32 | 33 | 34 | 35 | 36 | 37 | 38 | 39 | 40 | 41 | 42 | -------------------------------------------------------------------------------- /MultiRPC/Assets/Svg files/ShieldIcon.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /MultiRPC/Assets/Svg files/ThemeIcon.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 5 | 11 | ThemeIcon 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | 31 | 32 | 33 | -------------------------------------------------------------------------------- /MultiRPC/Assets/Svg files/Update.cmd: -------------------------------------------------------------------------------- 1 | SvgToXaml.exe BuildDict /inputdir "." /outputdir "." /outputname Icons 2 | pause -------------------------------------------------------------------------------- /MultiRPC/Assets/Svg files/WarningIcon.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 5 | 9 | 12 | 13 | 14 | 15 | -------------------------------------------------------------------------------- /MultiRPC/Assets/Text1Help.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/FluxpointDev/MultiRPC/ddefcaf6c61817ebaa7e48cc544fbe6bb158c27c/MultiRPC/Assets/Text1Help.jpg -------------------------------------------------------------------------------- /MultiRPC/Assets/Text2Help.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/FluxpointDev/MultiRPC/ddefcaf6c61817ebaa7e48cc544fbe6bb158c27c/MultiRPC/Assets/Text2Help.jpg -------------------------------------------------------------------------------- /MultiRPC/Assets/Themes/DesignerTheme.xaml: -------------------------------------------------------------------------------- 1 |  4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | Dark 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | -------------------------------------------------------------------------------- /MultiRPC/Data.cs: -------------------------------------------------------------------------------- 1 | using System.Collections.Generic; 2 | 3 | namespace MultiRPC 4 | { 5 | public static class Data 6 | { 7 | public static Dictionary MultiRPCImages = MakeImagesDictionary(); 8 | 9 | public static Dictionary MakeImagesDictionary() 10 | { 11 | return new Dictionary 12 | { 13 | {App.Text.NoImage, ""}, 14 | {"Discord", "https://i.imgur.com/QN5WA4W.png"}, 15 | {"MultiRPC", "https://i.imgur.com/d6OLF2z.png"}, 16 | {"Firefox", "https://i.imgur.com/oTuovMT.png"}, 17 | {"Firefox Nightly", "https://i.imgur.com/JBjTLUs.png"}, 18 | {"Google", "https://i.imgur.com/DJjs5Yc.png"}, 19 | {"Mel", "https://i.imgur.com/SUm8SwK.png"}, 20 | {"Youtube", "https://i.imgur.com/Hc9DirJ.png"}, 21 | {"Kappa", "https://i.imgur.com/kdUCRrj.png"}, 22 | {"MmLol", "https://i.imgur.com/StXRONi.png"}, 23 | {"Nyancat", "https://i.imgur.com/YoiJGh5.png"}, 24 | {"Monstercat", "https://i.imgur.com/QTGPwi0.png"}, 25 | {"Thonk", "https://i.imgur.com/P4Mvpmf.png"}, 26 | {"Lul", "https://i.imgur.com/1Q1Nbin.png"}, 27 | {"Pepe", "https://i.imgur.com/7ybyrw7.png"}, 28 | {"Trollface", "https://i.imgur.com/tanLvrt.png"}, 29 | {"Doge", "https://i.imgur.com/ytpmvjg.png"}, 30 | {App.Text.Christmas, "https://i.imgur.com/NF2enEO.png"}, 31 | {App.Text.Present, "https://i.imgur.com/qMfJKt6.png"}, 32 | {"Neko", "https://i.imgur.com/l2RsYY7.png"}, 33 | {App.Text.Popcorn, "https://i.imgur.com/xplfztu.png"}, 34 | {"Skype", "https://i.imgur.com/PjQFB6d.png"}, 35 | {App.Text.Games, "https://i.imgur.com/lPrT5BG.png"}, 36 | {"Steam", "https://i.imgur.com/bKxJ7Lj.png"}, 37 | {"Minecraft", "https://i.imgur.com/vnw6Z8X.png"}, 38 | {"Coke", "https://i.imgur.com/GAsmn3P.png"} 39 | }; 40 | } 41 | 42 | public static string GetImageValue(string imageKey) 43 | { 44 | if (string.IsNullOrWhiteSpace(imageKey)) 45 | { 46 | return ""; 47 | } 48 | 49 | MultiRPCImages.TryGetValue(imageKey, out var uri); 50 | return uri; 51 | } 52 | } 53 | } -------------------------------------------------------------------------------- /MultiRPC/Functions/Animations.cs: -------------------------------------------------------------------------------- 1 | using System; 2 | using System.Threading.Tasks; 3 | using System.Windows; 4 | using System.Windows.Media.Animation; 5 | 6 | namespace MultiRPC.Functions 7 | { 8 | internal class Animations 9 | { 10 | public static async Task DoubleAnimation( 11 | FrameworkElement element, 12 | double to, 13 | double from, 14 | Storyboard storyboard = null, 15 | Duration duration = new Duration(), 16 | PropertyPath propertyPath = null, 17 | IEasingFunction ease = null) 18 | { 19 | if (storyboard == null) 20 | { 21 | storyboard = new Storyboard(); 22 | } 23 | 24 | if (propertyPath == null) 25 | { 26 | propertyPath = new PropertyPath(UIElement.OpacityProperty); 27 | } 28 | 29 | //storyboard ??= new Storyboard(); 30 | //propertyPath ??= new PropertyPath(UIElement.OpacityProperty); 31 | 32 | var fadeAnimation = new DoubleAnimation 33 | { 34 | From = from, 35 | To = to, 36 | Duration = !duration.HasTimeSpan ? new Duration(TimeSpan.FromSeconds(0.5)) : duration, 37 | EasingFunction = ease ?? new QuadraticEase() 38 | }; 39 | 40 | storyboard.Children.Add(fadeAnimation); 41 | Storyboard.SetTargetName(fadeAnimation, element.Name); 42 | Storyboard.SetTargetProperty(fadeAnimation, propertyPath); 43 | storyboard.Begin(element); 44 | await Task.Delay(fadeAnimation.Duration.TimeSpan); 45 | } 46 | 47 | public static async Task ThicknessAnimation( 48 | FrameworkElement element, 49 | Thickness to, 50 | Thickness from, 51 | Duration duration = new Duration(), 52 | PropertyPath propertyPath = null, 53 | IEasingFunction ease = null) 54 | { 55 | if (propertyPath == null) 56 | { 57 | propertyPath = new PropertyPath(FrameworkElement.MarginProperty); 58 | } 59 | 60 | //propertyPath ??= new PropertyPath(FrameworkElement.MarginProperty); 61 | 62 | var storyboard = new Storyboard(); 63 | var fadeAnimation = new ThicknessAnimation 64 | { 65 | From = from, 66 | To = to, 67 | Duration = !duration.HasTimeSpan ? new Duration(TimeSpan.FromSeconds(0.3)) : duration, 68 | EasingFunction = ease ?? new CircleEase() 69 | }; 70 | 71 | storyboard.Children.Add(fadeAnimation); 72 | Storyboard.SetTargetName(fadeAnimation, element.Name); 73 | Storyboard.SetTargetProperty(fadeAnimation, propertyPath); 74 | storyboard.Begin(element); 75 | await Task.Delay(fadeAnimation.Duration.TimeSpan); 76 | } 77 | } 78 | } -------------------------------------------------------------------------------- /MultiRPC/Functions/BitmapDownloader.cs: -------------------------------------------------------------------------------- 1 | using System; 2 | using System.Threading.Tasks; 3 | using System.Windows.Media; 4 | using System.Windows.Media.Imaging; 5 | 6 | namespace MultiRPC.Functions 7 | { 8 | public static class BitmapDownloader 9 | { 10 | public static async Task DownloadImage(this Uri uri) 11 | { 12 | var b = new BitmapImage(); 13 | 14 | b.BeginInit(); 15 | b.UriSource = uri; 16 | b.EndInit(); 17 | b.DownloadFailed += Image_FailedLoading; 18 | return b; 19 | } 20 | 21 | private static void Image_FailedLoading(object sender, ExceptionEventArgs e) 22 | { 23 | App.Logging.ImageError(sender as BitmapImage, e); 24 | } 25 | } 26 | } -------------------------------------------------------------------------------- /MultiRPC/Functions/Checks.cs: -------------------------------------------------------------------------------- 1 | using System.Text; 2 | 3 | namespace MultiRPC.Functions 4 | { 5 | public static class Checks 6 | { 7 | public static bool UnderAmountOfBytes(this string s, int byteLength) 8 | { 9 | return byteLength > Encoding.ASCII.GetBytes(s).Length; 10 | } 11 | } 12 | } -------------------------------------------------------------------------------- /MultiRPC/Functions/FileWatch.cs: -------------------------------------------------------------------------------- 1 | using System.IO; 2 | using System.Threading.Tasks; 3 | using System.Windows; 4 | using MultiRPC.GUI.Pages; 5 | using MultiRPC.JsonClasses; 6 | 7 | namespace MultiRPC.Functions 8 | { 9 | public static class FileWatch 10 | { 11 | public static void Create() 12 | { 13 | var watcher = new FileSystemWatcher 14 | { 15 | Filter = "*.rpc", 16 | Path = FileLocations.ConfigFolder, 17 | EnableRaisingEvents = true 18 | }; 19 | watcher.Created += Watcher_FileCreated; 20 | } 21 | 22 | private static async void Watcher_FileCreated(object sender, FileSystemEventArgs e) 23 | { 24 | if (e.Name == FileLocations.OpenFileName) 25 | { 26 | await Application.Current.Dispatcher.InvokeAsync(async () => 27 | { 28 | await Application.Current.MainWindow.Dispatcher.InvokeAsync(async () => 29 | { 30 | await Task.Delay(1000); 31 | string[] text; 32 | using (var reader = File.OpenText(FileLocations.OpenFileLocalLocation)) 33 | { 34 | text = (await reader.ReadToEndAsync()).Split('\r', '\n'); 35 | } 36 | 37 | if (text[0] == "LOADCUSTOM") //Load a custom profile 38 | { 39 | CustomPage.StartCustomProfileLogic(text[2]); 40 | } 41 | else 42 | { 43 | Application.Current.MainWindow.WindowState = WindowState.Normal; 44 | Application.Current.MainWindow.Activate(); 45 | } 46 | 47 | try 48 | { 49 | File.Delete(FileLocations.OpenFileLocalLocation); 50 | } 51 | catch 52 | { 53 | App.Logging.Application($"{App.Text.CouldntDelete} {FileLocations.OpenFileLocalLocation}"); 54 | } 55 | }); 56 | }); 57 | } 58 | } 59 | } 60 | } -------------------------------------------------------------------------------- /MultiRPC/Functions/IUpdate.cs: -------------------------------------------------------------------------------- 1 | using System; 2 | using System.Collections.Generic; 3 | using System.Text; 4 | using System.Threading.Tasks; 5 | 6 | namespace MultiRPC.Functions 7 | { 8 | interface IUpdate 9 | { 10 | bool IsChecking { get; } 11 | bool IsUpdating { get; } 12 | bool BeenUpdated { get; } 13 | string NewVersion { get; } 14 | 15 | Task Check(bool showNoUpdateMessage = false); 16 | 17 | Task Update(); 18 | } 19 | } 20 | -------------------------------------------------------------------------------- /MultiRPC/Functions/Logging.cs: -------------------------------------------------------------------------------- 1 | using System; 2 | using System.ComponentModel; 3 | using System.Linq; 4 | using System.Windows; 5 | using System.Windows.Media; 6 | using System.Windows.Media.Imaging; 7 | using DiscordRPC.Logging; 8 | using MultiRPC.GUI.Pages; 9 | 10 | namespace MultiRPC.Functions 11 | { 12 | public class Logging : INotifyPropertyChanged, ILogger 13 | { 14 | public Logging() 15 | { 16 | Application(App.Text.LoggerHasStarted); 17 | } 18 | 19 | private string _logText; 20 | 21 | public string LogText 22 | { 23 | set 24 | { 25 | if (_logText != value) 26 | { 27 | _logText = value; 28 | OnPropertyChanged("LogText"); 29 | } 30 | } 31 | get => _logText; 32 | } 33 | 34 | #if DEBUG 35 | private static readonly LogLevel _level = LogLevel.Trace; 36 | #else 37 | private static readonly LogLevel _level = LogLevel.Info; 38 | #endif 39 | public LogLevel Level { get; set; } = _level; 40 | 41 | public event PropertyChangedEventHandler PropertyChanged; 42 | 43 | private void OnPropertyChanged(string propertyName) 44 | { 45 | PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName)); 46 | } 47 | 48 | /// [App] Text 49 | public void Application(string message) 50 | { 51 | LogText += LogEvent("App", message); 52 | } 53 | 54 | /// [Discord] Text 55 | public void Discord(string message) 56 | { 57 | LogText += LogEvent("Discord", message); 58 | } 59 | 60 | /// [Custom Error] Error message 61 | public void Error(string name, string message) 62 | { 63 | LogText += LogEvent($"{name} {App.Text.Error}", message); 64 | } 65 | 66 | /// [Custom Error] Exception error 67 | public void Error(string name, Exception ex) 68 | { 69 | LogText += LogEvent($"{name} {App.Text.Error}", ex.Message); 70 | } 71 | 72 | /// [Image Error] Failed to download 73 | public void ImageError(BitmapImage img, ExceptionEventArgs ex) 74 | { 75 | if (ex == null) 76 | { 77 | LogText += LogEvent(App.Text.ImageError, 78 | $"{App.Text.FailedToDownload} ({img.UriSource.AbsoluteUri}) {App.Text.NetworkError}"); 79 | } 80 | else 81 | { 82 | LogText += LogEvent(App.Text.ImageError, 83 | $"{App.Text.FailedToDownload} ({img.UriSource.AbsoluteUri}) {ex.ErrorException.Message}"); 84 | } 85 | } 86 | 87 | public string LogEvent(string name, string message) 88 | { 89 | return $"[{name}]: {message}\r\n\r\n"; 90 | } 91 | 92 | public void Trace(string message, params object[] args) 93 | { 94 | LogText += LogEvent($"RPC {App.Text.Trace}", RPCMessage(message, args)); 95 | } 96 | 97 | public void Info(string message, params object[] args) 98 | { 99 | LogText += LogEvent($"RPC {App.Text.Info}", RPCMessage(message, args)); 100 | } 101 | 102 | public void Warning(string message, params object[] args) 103 | { 104 | LogText += LogEvent($"RPC {App.Text.Warning}", RPCMessage(message, args)); 105 | } 106 | 107 | public void Error(string message, params object[] args) 108 | { 109 | if (args.Contains("Access to the path is denied.")) 110 | { 111 | MainPage._MainPage.frmRPCPreview.Dispatcher.Invoke(() => 112 | { 113 | RPC.Shutdown(); 114 | MessageBox.Show(App.Text.NeedAdmin, App.Text.AdminRequired, MessageBoxButton.OK, MessageBoxImage.Information); 115 | }); 116 | } 117 | LogText += LogEvent($"RPC {App.Text.Error}", RPCMessage(message, args)); 118 | } 119 | 120 | private string RPCMessage(string message, params object[] args) 121 | { 122 | return message + (args != null && args.Length > 0 ? "\r\nArgs\r\n" + string.Join("\r\n", args) : ""); 123 | } 124 | } 125 | } -------------------------------------------------------------------------------- /MultiRPC/Functions/SimpleUpdater.cs: -------------------------------------------------------------------------------- 1 | using System; 2 | using System.Collections.Generic; 3 | using System.Text; 4 | using System.Threading.Tasks; 5 | 6 | namespace MultiRPC.Functions 7 | { 8 | class SimpleUpdater : IUpdate 9 | { 10 | public bool IsChecking { get; private set; } 11 | public bool IsUpdating { get; private set; } 12 | public bool BeenUpdated { get; private set; } 13 | public string NewVersion { get; private set; } 14 | 15 | public Task Check(bool showNoUpdateMessage = false) 16 | { 17 | return Task.CompletedTask; 18 | } 19 | 20 | public Task Update() 21 | { 22 | return Task.CompletedTask; 23 | } 24 | } 25 | } 26 | -------------------------------------------------------------------------------- /MultiRPC/Functions/TriggerWatch.cs: -------------------------------------------------------------------------------- 1 | //using System; 2 | //using System.Collections.Generic; 3 | //using System.Diagnostics; 4 | //using System.Globalization; 5 | //using System.IO; 6 | //using System.Linq; 7 | //using System.Management; 8 | //using System.Security.Principal; 9 | //using System.Text; 10 | //using System.Threading.Tasks; 11 | //using MultiRPC.GUI.Pages; 12 | //using MultiRPC.JsonClasses; 13 | 14 | //namespace MultiRPC.Functions 15 | //{ 16 | // public static class TriggerWatch 17 | // { 18 | // private static Process[] _processes; 19 | // private static Process _process; 20 | 21 | // static TriggerWatch() 22 | // { 23 | // if (IsElevated) 24 | // { 25 | // var processStartEvent = new ManagementEventWatcher("SELECT * FROM Win32_ProcessStartTrace"); 26 | // processStartEvent.EventArrived += ((sender, e) => ProcessStartEvent(sender, e.NewEvent.Properties["ProcessName"].Value.ToString())); 27 | // processStartEvent.Scope.Options.EnablePrivileges = true; 28 | 29 | // processStartEvent.Start(); 30 | // } 31 | // else 32 | // { 33 | // _ = Task.Run(async () => 34 | // { 35 | // _processes = Process.GetProcesses(); 36 | // while (true) 37 | // { 38 | // var processes = Process.GetProcesses(); 39 | // if (processes.Length > _processes.Length) 40 | // { 41 | // List processesNames = new List(_processes.Length); 42 | // for (int i = 0; i < _processes.LongLength; i++) 43 | // { 44 | // processesNames.Add(_processes[i].ProcessName); 45 | // } 46 | // for (int j = 0; j < processes.LongLength; j++) 47 | // { 48 | // if (!processesNames.Contains(processes[j].ProcessName)) 49 | // { 50 | // ProcessStartEvent(null, processes[j].ProcessName + ".exe"); 51 | // } 52 | // } 53 | // } 54 | // _processes = Process.GetProcesses(); 55 | // await Task.Delay(100); 56 | // } 57 | // }); 58 | // } 59 | // } 60 | 61 | // private static bool IsElevated => new WindowsPrincipal(WindowsIdentity.GetCurrent()).IsInRole(WindowsBuiltInRole.Administrator); 62 | 63 | // #region Process 64 | // private static void ProcessStartEvent(object sender, string processName) 65 | // { 66 | // var processes = Process.GetProcesses(); 67 | // for (int i = 0; i < MasterCustomPage.Profiles.Count; i++) 68 | // { 69 | // var profile = MasterCustomPage.Profiles.ElementAt(i).Value; 70 | 71 | // string btnStartContent = ""; 72 | // if (MainPage._MainPage != null) 73 | // { 74 | // MainPage._MainPage.Dispatcher.Invoke(() => 75 | // { 76 | // if (MainPage._MainPage.btnStart != null) 77 | // { 78 | // btnStartContent = MainPage._MainPage.btnStart.Content.ToString(); 79 | // } 80 | // }); 81 | // } 82 | 83 | // App.Logging.Application(processName); 84 | // if (!RPC.Equals(RPC.Presence, profile) || (RPC.Equals(RPC.Presence, profile) && btnStartContent != App.Text.Shutdown) && processName == profile.Triggers.Process) 85 | // { 86 | // for (int j = 0; j < processes.LongLength; j++) 87 | // { 88 | // App.Logging.Application(processes[j].ProcessName); 89 | // if (processes[j].ProcessName + ".exe" == profile.Triggers.Process) 90 | // { 91 | // if (_process != null) 92 | // { 93 | // _process.Exited -= Process_Exited; 94 | // } 95 | 96 | // _process = processes[j]; 97 | // _process.EnableRaisingEvents = true; 98 | // _process.Exited += Process_Exited; 99 | // CustomPage.StartCustomProfileLogic(profile.Name); 100 | // break; 101 | // } 102 | // } 103 | // break; 104 | // } 105 | // } 106 | // } 107 | 108 | // private static void Process_Exited(object sender, EventArgs e) 109 | // { 110 | // for (int i = 0; i < MasterCustomPage.Profiles.Count; i++) 111 | // { 112 | // var profile = MasterCustomPage.Profiles.ElementAt(i).Value; 113 | 114 | // if (RPC.Equals(RPC.Presence, profile) && ((Process)sender).ProcessName + ".exe" == profile.Triggers.Process) 115 | // { 116 | // RPC.Shutdown(); 117 | // break; 118 | // } 119 | // } 120 | // } 121 | // #endregion 122 | 123 | // /// 124 | // /// Just a void to trigger the static 125 | // /// 126 | // public static void Start() 127 | // { 128 | // return; 129 | // } 130 | // } 131 | //} 132 | -------------------------------------------------------------------------------- /MultiRPC/Functions/Updater.cs: -------------------------------------------------------------------------------- 1 | using System.Threading.Tasks; 2 | 3 | namespace MultiRPC.Functions 4 | { 5 | public static class Updater 6 | { 7 | static Updater() 8 | { 9 | #if NETCORE 10 | _Updater = new SimpleUpdater(); 11 | #else 12 | _Updater = new ClickOnceUpdater(); 13 | #endif 14 | } 15 | 16 | private static IUpdate _Updater; 17 | 18 | public static bool IsChecking => _Updater.IsChecking; 19 | public static bool IsUpdating => _Updater.IsUpdating; 20 | public static bool BeenUpdated => _Updater.BeenUpdated; 21 | 22 | public static async Task Check(bool showNoUpdateMessage = false) 23 | { 24 | _Updater?.Check(showNoUpdateMessage); 25 | } 26 | 27 | public static async Task Update() 28 | { 29 | _Updater?.Update(); 30 | } 31 | } 32 | } -------------------------------------------------------------------------------- /MultiRPC/Functions/Uri.Extra.cs: -------------------------------------------------------------------------------- 1 | using MultiRPC; 2 | using System.Collections.Generic; 3 | using System.Diagnostics; 4 | using System.Web; 5 | 6 | namespace System.Extra 7 | { 8 | public static class Uri 9 | { 10 | public static string Combine(this string[] strings) 11 | { 12 | var uri = ""; 13 | for (var i = 0; i < strings.Length; i++) 14 | { 15 | uri += $"{strings[i]}/"; 16 | } 17 | 18 | return uri.Remove(uri.Length - 1); 19 | } 20 | 21 | public static System.Uri CombineToUri(this string[] strings) 22 | { 23 | return new System.Uri(strings.Combine()); 24 | } 25 | 26 | public static void OpenWebsite(this System.Uri uri) 27 | { 28 | uri.AbsoluteUri.OpenWebsite(); 29 | } 30 | 31 | public static void OpenWebsite(this string uri) 32 | { 33 | #if NETCORE 34 | Process.Start(new ProcessStartInfo("cmd", $"/c start {uri}") 35 | { 36 | CreateNoWindow = true 37 | }); 38 | #else 39 | Process.Start(uri); 40 | #endif 41 | } 42 | 43 | public static List GetQueryStringParameters() 44 | { 45 | #if !NETCORE 46 | try 47 | { 48 | if (Deployment.Application.ApplicationDeployment.IsNetworkDeployed) 49 | { 50 | var nameValueTable = HttpUtility.ParseQueryString(Deployment.Application.ApplicationDeployment.CurrentDeployment.ActivationUri.Query); 51 | var list = new List(); 52 | foreach (var item in nameValueTable.AllKeys) 53 | { 54 | list.Add(item); 55 | var itemContent = nameValueTable.GetValues(item); 56 | if (itemContent != null) 57 | { 58 | list.AddRange(itemContent); 59 | } 60 | } 61 | 62 | return list.Count > 0 ? list : null; 63 | } 64 | } 65 | catch (Exception e) 66 | { 67 | App.Logging.Error("", e); 68 | } 69 | #endif 70 | return null; 71 | } 72 | } 73 | } -------------------------------------------------------------------------------- /MultiRPC/Functions/Utils.cs: -------------------------------------------------------------------------------- 1 | using System; 2 | using System.Net.NetworkInformation; 3 | using System.Text; 4 | 5 | namespace MultiRPC.Functions 6 | { 7 | public static class Utils 8 | { 9 | public static string Base64Encode(string plainText) 10 | { 11 | var plainTextBytes = Encoding.UTF8.GetBytes(plainText); 12 | var s = Convert.ToBase64String(plainTextBytes); 13 | return s; 14 | } 15 | 16 | public static string Base64Decode(string base64EncodedData) 17 | { 18 | var base64EncodedBytes = Convert.FromBase64String(base64EncodedData); 19 | var s = Encoding.UTF8.GetString(base64EncodedBytes); 20 | return s; 21 | } 22 | 23 | public static bool NetworkIsAvailable() 24 | { 25 | var networkInterfaces = NetworkInterface.GetAllNetworkInterfaces(); 26 | for (var i = 0; i < networkInterfaces.LongLength; i++) 27 | { 28 | var item = networkInterfaces[i]; 29 | if (item.NetworkInterfaceType == NetworkInterfaceType.Loopback) 30 | { 31 | continue; 32 | } 33 | 34 | if (item.Name.ToLower().Contains("virtual") || item.Description.ToLower().Contains("virtual")) 35 | { 36 | continue; //Exclude virtual networks set up by VMWare and others 37 | } 38 | 39 | if (item.OperationalStatus == OperationalStatus.Up) 40 | { 41 | return true; 42 | } 43 | } 44 | 45 | return false; 46 | } 47 | } 48 | } -------------------------------------------------------------------------------- /MultiRPC/GUI/Controls/MultiRPCAndCustomDictionary.xaml: -------------------------------------------------------------------------------- 1 |  4 | 9 | 14 | 18 | -------------------------------------------------------------------------------- /MultiRPC/GUI/Controls/TabPage.xaml: -------------------------------------------------------------------------------- 1 |  10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | -------------------------------------------------------------------------------- /MultiRPC/GUI/Controls/TabPage.xaml.cs: -------------------------------------------------------------------------------- 1 | using System; 2 | using System.Threading.Tasks; 3 | using System.Windows; 4 | using System.Windows.Controls; 5 | using System.Windows.Input; 6 | using System.Windows.Media; 7 | using System.Windows.Shapes; 8 | using MultiRPC.Functions; 9 | 10 | namespace MultiRPC.GUI.Controls 11 | { 12 | /// 13 | /// Interaction logic for TabPage.xaml 14 | /// 15 | public partial class TabPage : Page 16 | { 17 | private Grid _selectedGrid; 18 | public TabItem[] Tabs; 19 | 20 | public TabPage(TabItem[] tabs) 21 | { 22 | var gridToPress = 0; 23 | 24 | InitializeComponent(); 25 | Tabs = tabs; 26 | for (var i = 0; i < tabs.LongLength; i++) 27 | { 28 | if (tabs[i].IsActive && gridToPress == 0) 29 | { 30 | gridToPress = i; 31 | } 32 | 33 | Grid grid = new Grid 34 | { 35 | Margin = new Thickness(10, 0, 0, 0), 36 | Background = Brushes.Transparent, 37 | RowDefinitions = 38 | { 39 | new RowDefinition 40 | { 41 | Height = new GridLength(0, GridUnitType.Auto) 42 | }, 43 | new RowDefinition 44 | { 45 | Height = new GridLength(1, GridUnitType.Star) 46 | } 47 | }, 48 | Tag = tabs[i].Page 49 | }; 50 | TextBlock textBlock = new TextBlock 51 | { 52 | Text = tabs[i].TabName 53 | }; 54 | Rectangle rectangle = new Rectangle 55 | { 56 | VerticalAlignment = VerticalAlignment.Bottom, 57 | Height = 0, 58 | Margin = new Thickness(-2, 3, -2, 0), 59 | Name = $"rec{i}", 60 | }; 61 | Grid.SetRow(rectangle, 1); 62 | rectangle.SetResourceReference(Shape.FillProperty, "AccentColour3SCBrush"); 63 | RegisterName($"rec{i}", rectangle); 64 | 65 | grid.Children.Add(textBlock); 66 | grid.Children.Add(rectangle); 67 | grid.MouseEnter += Grid_MouseEnter; 68 | grid.MouseLeave += Grid_MouseLeave; 69 | grid.MouseDown += Grid_MouseDown; 70 | spTabContainer.Children.Add(grid); 71 | } 72 | 73 | var mouseDownEvent = 74 | new MouseButtonEventArgs(Mouse.PrimaryDevice, (int) DateTime.Now.Ticks, MouseButton.Left) 75 | { 76 | RoutedEvent = MouseDownEvent, 77 | Source = this 78 | }; 79 | spTabContainer.Children[gridToPress].RaiseEvent(mouseDownEvent); 80 | } 81 | 82 | /// 83 | /// Updates Tabs Menu Text 84 | /// 85 | /// New tab Names (give them in the order you gave the tabs or the tabs will have the wrong text!!!) 86 | /// 87 | public Task UpdateText(params string[] tabNames) 88 | { 89 | for (var i = 0; i < spTabContainer.Children.Count; i++) 90 | { 91 | var grid = (Grid) spTabContainer.Children[i]; 92 | ((TextBlock) grid.Children[0]).Text = tabNames[i]; 93 | } 94 | 95 | return Task.CompletedTask; 96 | } 97 | 98 | private void Grid_MouseDown(object sender, MouseButtonEventArgs e) 99 | { 100 | MouseDownLogic((Grid) sender); 101 | } 102 | 103 | private void Grid_MouseLeave(object sender, MouseEventArgs e) 104 | { 105 | MouseEnterLeaveLogic((Grid) sender, 0); 106 | } 107 | 108 | private void Grid_MouseEnter(object sender, MouseEventArgs e) 109 | { 110 | MouseEnterLeaveLogic((Grid) sender, 1); 111 | } 112 | 113 | private async Task MouseEnterLeaveLogic(Grid grid, double to) 114 | { 115 | if (_selectedGrid != grid) 116 | { 117 | var rec = (Rectangle) grid.Children[1]; 118 | Animations.DoubleAnimation(rec, to, rec.Height, propertyPath: new PropertyPath(HeightProperty), 119 | duration: new Duration(TimeSpan.FromSeconds(0.15))); 120 | } 121 | } 122 | 123 | private async Task MouseDownLogic(Grid grid) 124 | { 125 | Rectangle rec; 126 | if (_selectedGrid != null) 127 | { 128 | rec = (Rectangle) _selectedGrid.Children[1]; 129 | Animations.DoubleAnimation(rec, 0, rec.Height, propertyPath: new PropertyPath(HeightProperty), 130 | duration: new Duration(TimeSpan.FromSeconds(0.15))); 131 | } 132 | 133 | _selectedGrid = grid; 134 | 135 | rec = (Rectangle) grid.Children[1]; 136 | Animations.DoubleAnimation(rec, 3, rec.Height, propertyPath: new PropertyPath(HeightProperty), 137 | duration: new Duration(TimeSpan.FromSeconds(0.3))); 138 | frmContent.Navigate(grid.Tag); 139 | } 140 | } 141 | 142 | public class TabItem 143 | { 144 | public string TabName; 145 | public object Page; 146 | public bool IsActive; 147 | } 148 | } -------------------------------------------------------------------------------- /MultiRPC/GUI/Controls/ToolTip.cs: -------------------------------------------------------------------------------- 1 | using System.Threading.Tasks; 2 | using System.Windows; 3 | 4 | namespace MultiRPC.GUI.Controls 5 | { 6 | /// 7 | /// Edited Tooltip to have a string parameter, nothing special 8 | /// 9 | public class ToolTip : System.Windows.Controls.ToolTip 10 | { 11 | /// 12 | /// Tooltip with string parameter 13 | /// 14 | /// Text to show on the tooltip 15 | public ToolTip(string text) 16 | { 17 | Content = text; 18 | UISetup(); 19 | } 20 | 21 | public ToolTip() 22 | { 23 | UISetup(); 24 | } 25 | 26 | private Task UISetup() 27 | { 28 | BorderThickness = new Thickness(1); 29 | SetResourceReference(BorderBrushProperty, "AccentColour1SCBrush"); 30 | SetResourceReference(BackgroundProperty, "AccentColour2SCBrush"); 31 | 32 | return Task.CompletedTask; 33 | } 34 | } 35 | } -------------------------------------------------------------------------------- /MultiRPC/GUI/MainWindow.xaml: -------------------------------------------------------------------------------- 1 |  22 | 23 | 53 | 54 | 56 | 57 | 58 | 59 | 60 | 61 | 62 | 63 | 64 | 65 | 66 | 67 | 68 | 70 | 72 | 73 | 74 | 75 | 79 | 117 | 118 | 119 | 121 | 122 | 123 | -------------------------------------------------------------------------------- /MultiRPC/GUI/MessageBox/CustomMessageBox.cs: -------------------------------------------------------------------------------- 1 | using System; 2 | using System.Threading.Tasks; 3 | using System.Windows; 4 | 5 | namespace MultiRPC.GUI 6 | { 7 | internal class CustomMessageBox : MainWindow 8 | { 9 | private CustomMessageBox(MessageBoxPage page, string title) 10 | { 11 | InitializeComponent(); 12 | SizeToContent = SizeToContent.WidthAndHeight; 13 | frmContent.Content = page; 14 | MinHeight = page.MinHeight + 30; 15 | MinWidth = page.MinWidth; 16 | tblTitle.Text = title; 17 | btnMin.Visibility = Visibility.Collapsed; 18 | ResizeMode = ResizeMode.CanMinimize; 19 | WindowStartupLocation = WindowStartupLocation.CenterOwner; 20 | ShowInTaskbar = false; 21 | } 22 | 23 | private static async Task _Show(string messageBoxText, string messageBoxTitle, 24 | MessageBoxButton messageBoxButton, MessageBoxImage messageBoxImage, 25 | MessageBoxResult messageBoxResult = MessageBoxResult.None, Window ownerWindow = null) 26 | { 27 | await Application.Current.Dispatcher.InvokeAsync(() => 28 | { 29 | var tick = DateTime.Now.Ticks; 30 | var page = new MessageBoxPage(messageBoxText, messageBoxButton, messageBoxImage, tick); 31 | 32 | switch (messageBoxButton) 33 | { 34 | case MessageBoxButton.OKCancel: 35 | page.btnOk.IsDefault = true; 36 | break; 37 | case MessageBoxButton.OK: 38 | page.btnOk.IsDefault = true; 39 | break; 40 | case MessageBoxButton.YesNoCancel: 41 | page.btnYes.IsDefault = true; 42 | break; 43 | case MessageBoxButton.YesNo: 44 | page.btnYes.IsDefault = true; 45 | break; 46 | } 47 | 48 | var window = new CustomMessageBox(page, messageBoxTitle) 49 | { 50 | WindowID = tick, 51 | Owner = ownerWindow ?? App.Current.MainWindow 52 | }; 53 | if (messageBoxButton == MessageBoxButton.YesNo) 54 | { 55 | window.btnClose.IsEnabled = false; 56 | } 57 | 58 | window.ShowDialog(); 59 | return window.ToReturn ?? DefaultReturn(messageBoxButton, messageBoxResult); 60 | }); 61 | return messageBoxResult; 62 | } 63 | 64 | private static MessageBoxResult DefaultReturn(MessageBoxButton button, MessageBoxResult defaultMessageBoxResult) 65 | { 66 | switch (button) 67 | { 68 | case MessageBoxButton.OKCancel: 69 | return MessageBoxResult.Cancel; 70 | case MessageBoxButton.OK: 71 | return MessageBoxResult.OK; 72 | case MessageBoxButton.YesNoCancel: 73 | return MessageBoxResult.Cancel; 74 | case MessageBoxButton.YesNo: 75 | return MessageBoxResult.Yes; 76 | default: 77 | return defaultMessageBoxResult; 78 | } 79 | } 80 | 81 | public static async Task Show(string messageBoxText, Window window = null) 82 | { 83 | return await _Show(messageBoxText, "MultiRPC", MessageBoxButton.OK, MessageBoxImage.None, 84 | ownerWindow: window); 85 | } 86 | 87 | public static async Task Show(string messageBoxText, string messageBoxTitle, 88 | Window window = null) 89 | { 90 | return await _Show(messageBoxText, messageBoxTitle, MessageBoxButton.OK, MessageBoxImage.None, 91 | ownerWindow: window); 92 | } 93 | 94 | public static async Task Show(string messageBoxText, string messageBoxTitle, 95 | MessageBoxButton messageBoxButton, Window window = null) 96 | { 97 | return await _Show(messageBoxText, messageBoxTitle, messageBoxButton, MessageBoxImage.None, 98 | ownerWindow: window); 99 | } 100 | 101 | public static async Task Show(string messageBoxText, string messageBoxTitle, 102 | MessageBoxButton messageBoxButton, MessageBoxImage messageBoxImage, Window window = null) 103 | { 104 | return await _Show(messageBoxText, messageBoxTitle, messageBoxButton, messageBoxImage, ownerWindow: window); 105 | } 106 | 107 | public static async Task Show(string messageBoxText, string messageBoxTitle, 108 | MessageBoxButton messageBoxButton, MessageBoxImage messageBoxImage, MessageBoxResult defaultResult, 109 | Window window = null) 110 | { 111 | return await _Show(messageBoxText, messageBoxTitle, messageBoxButton, messageBoxImage, defaultResult, 112 | window); 113 | } 114 | } 115 | } -------------------------------------------------------------------------------- /MultiRPC/GUI/MessageBox/MessageBoxPage.xaml: -------------------------------------------------------------------------------- 1 |  10 | 11 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 26 | 27 | 28 | 29 | 30 | 95 | 102 | 103 | 104 | 105 | 106 | 108 | 109 | 111 | 112 | 113 | 114 | 115 | 116 | 117 | 118 | 119 |