Compare commits

...

98 commits

Author SHA1 Message Date
e199c426f5 WeeXnes/Views/Settings/SettingsView.xaml aktualisiert
All checks were successful
Dotnet Build / build (push) Successful in 1m7s
2025-05-19 12:18:47 +00:00
77ef325085 WeeXnes/Core/Global.cs aktualisiert
Some checks failed
Dotnet Build / build (push) Failing after 2m9s
2025-05-19 12:14:09 +00:00
c1be81924b WeeXnes/WeeXnes.csproj aktualisiert
Some checks are pending
Dotnet Build / build (push) Waiting to run
2025-05-19 12:13:51 +00:00
dd3f5782a3 WeeXnes/Views/Settings/SettingsView.xaml aktualisiert
Some checks failed
Dotnet Build / build (push) Has been cancelled
2025-05-19 12:13:26 +00:00
83c85f932e .forgejo/workflows/dotnet.yaml aktualisiert
All checks were successful
Dotnet Build / build (push) Successful in 1m35s
2025-05-18 20:35:48 +00:00
9585ab95aa .forgejo/workflows/dotnet.yaml aktualisiert
Some checks failed
Dotnet Build / build (push) Failing after 5m6s
2025-05-18 20:28:56 +00:00
d698312381 .forgejo/workflows/dotnet.yaml aktualisiert
Some checks failed
Dotnet Build / build (push) Failing after 1m16s
2025-05-18 20:24:24 +00:00
d9981c025d .forgejo/workflows/dotnet.yaml aktualisiert
Some checks failed
Dotnet Build / build (push) Failing after 1m55s
2025-05-18 20:16:15 +00:00
3e2ed4b627 .forgejo/workflows/dotnet.yaml aktualisiert
Some checks failed
Dotnet Build / build (push) Failing after 2m7s
2025-05-18 20:06:06 +00:00
e69218c791 .forgejo/workflows/dotnet.yaml aktualisiert
Some checks failed
Dotnet Build / build (push) Failing after 1m4s
2025-05-18 20:01:36 +00:00
cd9d8fe20a .forgejo/workflows/dotnet.yaml aktualisiert
Some checks failed
Dotnet Build / build (push) Failing after 57s
2025-05-18 20:00:02 +00:00
a0ae016646 .forgejo/workflows/dotnet.yaml aktualisiert
Some checks failed
Dotnet Build / build (push) Failing after 1m2s
2025-05-18 19:58:52 +00:00
77250ee7c1 .forgejo/workflows/dotnet.yaml aktualisiert
Some checks failed
Dotnet Build / build (push) Failing after 1m39s
2025-05-18 19:52:54 +00:00
6846729432 .forgejo/workflows/dotnet.yaml aktualisiert
Some checks failed
Dotnet Build / build (push) Failing after 2m3s
2025-05-18 19:40:43 +00:00
97f3d31eab .forgejo/workflows/dotnet.yaml aktualisiert
All checks were successful
Dotnet Build / build (push) Successful in 2m4s
2025-05-18 19:32:56 +00:00
7d937fd89f .forgejo/workflows/dotnet.yaml aktualisiert
All checks were successful
Dotnet Build / build (push) Successful in 53s
2025-05-18 19:30:02 +00:00
025347faf6 .forgejo/workflows/dotnet.yaml aktualisiert
Some checks failed
Dotnet Build / build (push) Has been cancelled
2025-05-18 19:29:44 +00:00
12fbc227a5 .forgejo/workflows/dotnet.yaml aktualisiert
All checks were successful
Dotnet Build / build (push) Successful in 2m27s
2025-05-18 19:24:49 +00:00
16b21bf005 .forgejo/workflows/dotnet.yaml aktualisiert
Some checks failed
Dotnet Build / build (push) Failing after 1m12s
2025-05-18 19:20:31 +00:00
e57fef6b57 .forgejo/workflows/dotnet.yaml aktualisiert
All checks were successful
Dotnet Build / build (push) Successful in -1h57m51s
2025-05-18 19:00:39 +00:00
5c6b5dff76 .forgejo/workflows/dotnet.yaml aktualisiert
Some checks failed
Dotnet Build / build (push) Failing after -1h58m21s
2025-05-18 17:55:35 +00:00
4d937f14eb .github/workflows/dotnet-framework.yml gelöscht
All checks were successful
Dotnet Build / build (push) Successful in -1h58m56s
2025-05-18 17:53:25 +00:00
c85baa5172 .forgejo/workflows/dotnet.yaml aktualisiert
Some checks failed
Dotnet Build / build (push) Has been cancelled
2025-05-18 17:53:13 +00:00
d05f8db247 .forgejo/workflows/dotnet.yaml aktualisiert
All checks were successful
Dotnet Build / build (push) Successful in -1h59m2s
2025-05-18 17:29:14 +00:00
1faad86a8e .forgejo/workflows/dotnet.yaml aktualisiert
All checks were successful
Dotnet Build / build (push) Successful in -1h59m54s
2025-05-18 17:27:14 +00:00
09a7ee6dea .forgejo/workflows/dotnet.yaml hinzugefügt
All checks were successful
Dotnet Build / build (push) Successful in -1h59m53s
2025-05-18 16:06:45 +00:00
WeeXnes
a0e607d1e3
Update dotnet-framework.yml 2025-04-18 13:56:02 +02:00
f98cdf9b63 fixed example plugin 2025-04-09 13:30:21 +02:00
a118f4fe8b fix 2025-04-09 08:09:11 +02:00
9e8b3b89f8 plugin prototype working 2025-04-09 08:05:58 +02:00
6e60333fdf plugins loading now 2025-04-08 13:26:38 +02:00
b832aafa7c added IPluginBase for upcoming Plugin System 2025-04-08 12:20:04 +02:00
111c511ac9 file editor fix 2024-06-13 20:38:11 +02:00
55c753dead Fully added File Editor 2024-06-13 20:27:16 +02:00
5cb3c52ba7 file editor update 2024-06-13 12:46:11 +02:00
0d26606d5b updated readme 2024-06-13 12:11:51 +02:00
cbe7bfc2be updated readme and media 2024-06-13 12:08:05 +02:00
bff0928b7c file editor changes 2024-06-13 11:45:35 +02:00
f65057350d File Editor Update 2024-06-13 11:36:45 +02:00
9f96ae1493 Encrypted File Editor Ui Changes 2024-06-13 11:12:03 +02:00
218f9e1490 Prework for Encrypted TextEditor 2024-05-24 04:53:08 +02:00
7fc12b2c98 cleaned up launch flags 2024-03-12 08:36:42 +01:00
e2525e253a fixed -debugMode argument 2024-02-29 08:31:06 +01:00
9c4f2c6138 sound bug fix 2024-02-15 00:46:41 +01:00
48ef43f31e prep-work for adding auto updates option 2024-02-07 10:27:35 +01:00
56174d8003 stability improvements 2023-11-28 10:48:20 +01:00
7570f7d442 small fix 2023-11-24 10:48:13 +01:00
d5f6e160da fully implemented user debug flag for trouble shooting 2023-11-24 10:38:05 +01:00
30099b56d2 Finished login and enabled login menu 2023-11-23 14:15:09 +01:00
55b0ff1c45 fully implemented login 2023-11-21 21:02:39 +01:00
f6e3687ec2 prework for implementing login 2023-11-21 18:13:39 +01:00
e3a34fa966 fixed crash on launch during debugging 2023-10-07 16:03:45 +02:00
WeeXnes
336dbef991
Update README.md 2023-10-05 22:16:27 +02:00
17931a3103 added option for automatic shutdown & temporarily removed some debugging info 2023-10-05 21:57:42 +02:00
2225790af2 small improvements 2023-06-12 03:30:52 +02:00
WeeXnes
ddc56e7a41
Update README.md 2023-06-10 21:16:22 +02:00
776a9d86c0 updated readme 2023-06-10 20:27:33 +02:00
6fdbc9e74f internal improvements for debugging 2023-06-10 20:16:32 +02:00
79933338c9 added option to sort keys alphabetically 2023-06-09 16:04:27 +02:00
89d3bd8409 UX improvements 2023-06-08 21:59:40 +02:00
2f4ac2f00d added Password Generator 2023-06-08 21:40:04 +02:00
826e6823a1 Ui Improvements 2023-06-08 19:21:12 +02:00
e1351cc756 fixes + improved crash handler 2023-06-08 17:58:44 +02:00
f623fd79f2 fixed error from prev commit 2023-06-08 17:01:18 +02:00
892cd40895 added exception handler/dumper 2023-06-08 16:55:41 +02:00
79dcc39826 added import/export to discord rpc + fixes 2023-06-08 16:45:48 +02:00
884e12f980 added import/export options to KeyManager 2023-06-08 00:28:34 +02:00
3ef67556dd changed back to x86 because of errors 2023-05-24 08:01:18 +02:00
68d59943a7 changed to x64 for coming changes 2023-05-23 18:39:16 +02:00
aa96f282f6 fixes 2023-05-09 11:39:49 +02:00
8df1154cc4 Beautified RPC Log 2023-05-09 11:35:39 +02:00
6ce57b90ca re-added the ability to enable/disable copying keys to the clipboard when selected 2023-05-02 10:48:28 +02:00
WeeXnes
01e388ff37
Update README.md 2023-04-02 21:23:17 +02:00
2b24d81d1a re-added the function that the selected key in the keymanager list gets automatically copied to the clipboard 2023-03-05 02:44:24 +01:00
287dffbb5d added ability to change save paths for RPC and Key files 2023-01-05 22:08:09 +01:00
b95fb58925 now all issues are fixed 2023-01-04 19:51:21 +01:00
45e43d49e6 fully fixed issues with previous updates ( hopefully ) 2023-01-04 19:17:32 +01:00
a91c4af09f might have fixed issue 2023-01-04 18:41:34 +01:00
717ed8a6bf trying to fix bug 2023-01-04 18:32:02 +01:00
cac9f1d491 added missing RPC log (will be beautified in next update) 2023-01-04 18:13:23 +01:00
cc50b3861a Added icon to Update Executable 2022-12-13 11:58:56 +01:00
d39aac0981 Changed Version to test Updater 2022-12-13 11:51:54 +01:00
aeafe0570c Added missing file 2022-12-13 11:47:14 +01:00
0b3514bf46 Rewrote Updater 2022-12-13 11:45:42 +01:00
1b14fe2e57 Rewrote Updater and Removed Compiler Warnings 2022-12-13 11:44:11 +01:00
446cb60f40 Changed SettingsView and UpdatePrompt 2022-12-12 20:12:22 +01:00
de3bf385d6 fixed taskbar behaviour (kinda) 2022-12-12 12:13:03 +01:00
57c8a3bb80 changed version number 2022-11-28 19:07:30 +01:00
f720cc7325 re-added start menu shortcut button 2022-11-28 19:06:57 +01:00
95376fa0e6 Merge remote-tracking branch 'origin/master' 2022-11-28 17:15:02 +01:00
db8125de84 re-added autostart 2022-11-28 17:14:52 +01:00
WeeXnes
46b3d1569a
Update README.md 2022-11-25 15:46:28 +01:00
WeeXnes
beea861cc6
Update README.md 2022-11-25 15:44:02 +01:00
36f6d03a01 Changed Update code 2022-11-25 15:33:28 +01:00
df7a5045f9 Merge remote-tracking branch 'origin/master'
# Conflicts:
#	WeeXnes/App.xaml.cs
#	WeeXnes/Core/ApiResponse.cs
#	WeeXnes/Core/Globals.cs
#	WeeXnes/MVVM/View/DiscordRpcView.xaml
#	WeeXnes/MVVM/View/DiscordRpcView.xaml.cs
#	WeeXnes/MVVM/View/KeyManagerView.xaml
#	WeeXnes/MVVM/View/KeyManagerView.xaml.cs
#	WeeXnes/MVVM/View/SettingView.xaml
#	WeeXnes/MVVM/View/SettingView.xaml.cs
#	WeeXnes/MainWindow.xaml
#	WeeXnes/Misc/CriticalMessage.xaml
#	WeeXnes/Misc/Message.xaml
#	WeeXnes/Misc/UpdateMessage.xaml
#	WeeXnes/Misc/UpdateMessage.xaml.cs
#	WeeXnes/Theme/ControlButtonTheme.xaml
#	WeeXnes/WeeXnes.csproj
2022-11-25 15:31:14 +01:00
4258ef9a03 Complete Rewrite + Change to new GUI Library 2022-11-25 15:30:38 +01:00
WeeXnes
5bc18c02e0
Update dotnet-framework.yml 2022-11-25 15:29:06 +01:00
277541a20c added custom context menu for listbox/listview 2022-11-15 10:50:16 +01:00
137 changed files with 4817 additions and 4838 deletions

View file

@ -0,0 +1,140 @@
name: Dotnet Build
on: [push]
jobs:
build:
runs-on: win11
steps:
- name: Checkout code
uses: actions/checkout@v4
- name: MSBuild version
run: |
msbuild -version
- name: Extract project version
run: |
$version = Select-String -Path "WeeXnes/WeeXnes.csproj" -Pattern "<Version>(.+?)</Version>" | ForEach-Object {
($_ -match "<Version>(.+?)</Version>") | Out-Null
$matches[1]
}
Write-Output "Version extracted: $version"
"PROJECT_VERSION=$version" | Out-File -FilePath $Env:GITHUB_ENV -Encoding ASCII -Append
- name: Test exported version variable
run: |
Write-Output "The extracted project version is: $env:PROJECT_VERSION"
if (-not $env:PROJECT_VERSION) {
Write-Error "PROJECT_VERSION variable is not set!"
exit 1
}
- name: Restore Packages
run: nuget restore WeeXnes.sln
- name: Build Solution
run: |
msbuild WeeXnes.sln /p:DeleteExistingFiles=True /p:platform="Any CPU" /p:configuration="Release"
- name: Packing Zip
run: |
$zipName = "currentRelease_$env:PROJECT_VERSION.zip"
Compress-Archive -Path `
WeeXnes\bin\Release\WeeXnes.exe, `
WeeXnes\bin\Release\System.Drawing.Common.dll, `
WeeXnes\bin\Release\Wpf.Ui.dll, `
WeeXnes_UAC\bin\Release\WeeXnes_UAC.exe, `
WeeXnes\bin\Release\DiscordRPC.dll, `
WeeXnes\bin\Release\Newtonsoft.Json.dll, `
Autostart\bin\Release\Autostart.exe, `
WXPlugin\bin\Release\WXPlugin.dll, `
Update\bin\Release\Update.exe `
-CompressionLevel Optimal `
-DestinationPath $zipName
Write-Output "Created zip: $zipName"
- name: Prepare release directory
run: |
mkdir release
move currentRelease_$env:PROJECT_VERSION.zip release\
- name: Create Git tag
run: |
git config user.name "WeeXnes"
git config user.email "weexnes@weexnes.dev"
git tag $env:PROJECT_VERSION
git push origin $env:PROJECT_VERSION
- name: Upload Release Asset to Forgejo
env:
RELEASE_TOKEN: ${{ secrets.RELEASE_TOKEN }}
PROJECT_VERSION: ${{ env.PROJECT_VERSION }}
run: |
$ErrorActionPreference = "Stop"
$owner = "WeeXnes"
$repo = "WeeXnesSuite"
$tag = "$env:PROJECT_VERSION"
$token = $env:RELEASE_TOKEN
$fileName = "currentRelease_$tag.zip"
$filePath = "release/$fileName"
$releaseUrl = "https://git.weexnes.dev/api/v1/repos/$owner/$repo/releases/tags/$tag"
try {
$release = Invoke-RestMethod -Uri $releaseUrl -Headers @{ Authorization = "token $token" }
Write-Host "Found existing release for tag $tag"
} catch {
Write-Host "Release for tag $tag not found, creating..."
$createReleaseUrl = "https://git.weexnes.dev/api/v1/repos/$owner/$repo/releases"
$body = @{
tag_name = $tag
name = $tag
draft = $false
prerelease = $false
} | ConvertTo-Json -Depth 3
$release = Invoke-RestMethod -Uri $createReleaseUrl -Headers @{ Authorization = "token $token"; "Content-Type" = "application/json" } -Method Post -Body $body
}
$releaseId = $release.id
Write-Host "Release ID: $releaseId"
$uploadUrl = "https://git.weexnes.dev/api/v1/repos/$owner/$repo/releases/$releaseId/assets?name=$fileName"
Write-Host "Uploading asset to $uploadUrl"
Add-Type -AssemblyName "System.Net.Http"
$fileBytes = [System.IO.File]::ReadAllBytes($filePath)
# Use static method to correctly instantiate ByteArrayContent
$byteContent = [System.Net.Http.ByteArrayContent]::new($fileBytes)
$byteContent.Headers.ContentType = [System.Net.Http.Headers.MediaTypeHeaderValue]::new("application/zip")
$form = [System.Net.Http.MultipartFormDataContent]::new()
$form.Add($byteContent, "attachment", $fileName)
$client = [System.Net.Http.HttpClient]::new()
$client.DefaultRequestHeaders.Authorization = [System.Net.Http.Headers.AuthenticationHeaderValue]::new("token", $token)
$response = $client.PostAsync($uploadUrl, $form).Result
$responseContent = $response.Content.ReadAsStringAsync().Result
if ($response.IsSuccessStatusCode) {
Write-Host "✅ Upload succeeded"
} else {
Write-Host "❌ Upload failed with status $($response.StatusCode)"
Write-Host "Response: $responseContent"
exit 1
}

View file

@ -1,94 +0,0 @@
name: .NET Framework
on:
push:
branches: [ "master" ]
pull_request:
branches: [ "master" ]
jobs:
build:
runs-on: windows-latest
steps:
- uses: actions/checkout@v3
- name: Setup MSBuild
uses: microsoft/setup-msbuild@v1
- name: Setup NuGet
uses: NuGet/setup-nuget@v1.1.1
- name: Navigate to Workspace
run: cd $GITHUB_WORKSPACE
- name: Restore Packages
run: nuget restore WeeXnes.sln
- name: Build Solution
run: |
msbuild.exe WeeXnes.sln /p:DeleteExistingFiles=True /p:platform="Any CPU" /p:configuration="Release"
- name: List Folder 1
run: dir D:\a\WeeXnesSuite\WeeXnesSuite\WeeXnes\bin\Release\
- name: List Folder 2
run: dir D:\a\WeeXnesSuite\WeeXnesSuite\WeeXnes_UAC\bin\Release\
- name: List Folder 3
run: dir D:\a\WeeXnesSuite\WeeXnesSuite\Autostart\bin\Release\
- name: List Folder 4
run: dir D:\a\WeeXnesSuite\WeeXnesSuite\Update\bin\Release\
- name: List Folder 5
run: dir D:\a\WeeXnesSuite\WeeXnesSuite\Release_Tool\bin\Release\
- name: Format Xaml to XML
run: (gc Weexnes\WeeXnes.csproj) -replace ' ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003"', '' | Out-File -encoding ASCII formatted.csproj
shell: pwsh
- uses: bbonkr/get-version-action@v1.0.4
id: get_version
with:
project: "formatted.csproj"
- name: logging
run: |
echo "Version=${{ steps.get_version.outputs.version }}"
- name: Packing Zip
run: Compress-Archive
D:\a\WeeXnesSuite\WeeXnesSuite\WeeXnes\bin\Release\WeeXnes.exe,
D:\a\WeeXnesSuite\WeeXnesSuite\WeeXnes_UAC\bin\Release\WeeXnes_UAC.exe,
D:\a\WeeXnesSuite\WeeXnesSuite\WeeXnes\bin\Release\DiscordRPC.dll,
D:\a\WeeXnesSuite\WeeXnesSuite\WeeXnes\bin\Release\Newtonsoft.Json.dll,
D:\a\WeeXnesSuite\WeeXnesSuite\Autostart\bin\Release\Autostart.exe,
Update\bin\Release\Update.exe
-CompressionLevel Optimal -DestinationPath packed.zip
shell: pwsh
- name: Check for Zip
run: dir
- name: release
uses: actions/create-release@v1
id: create_release
with:
draft: false
prerelease: false
release_name: v${{ steps.get_version.outputs.version }}
tag_name: ${{ steps.get_version.outputs.version }}
env:
GITHUB_TOKEN: ${{ github.token }}
- name: upload windows artifact
uses: actions/upload-release-asset@v1
env:
GITHUB_TOKEN: ${{ github.token }}
with:
upload_url: ${{ steps.create_release.outputs.upload_url }}
asset_path: D:\a\WeeXnesSuite\WeeXnesSuite\packed.zip
asset_name: currentRelease_${{ steps.get_version.outputs.version }}.zip
asset_content_type: application/zip

View file

@ -14,6 +14,7 @@
<WarningLevel>4</WarningLevel>
<AutoGenerateBindingRedirects>true</AutoGenerateBindingRedirects>
<ApplicationIcon>wicns.ico</ApplicationIcon>
<LangVersion>12</LangVersion>
</PropertyGroup>
<PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
<PlatformTarget>AnyCPU</PlatformTarget>

View file

@ -0,0 +1,33 @@
using System;
using System.Windows.Controls;
using Wpf.Ui.Common;
using Wpf.Ui.Controls;
using WXPlugin.PluginCore;
namespace ExamplePlugin
{
public class ExamplePlugin : IPluginBase
{
public String Name { get; set; } = "Example Plugin";
public String Description { get; set; } = "This is an example plugin.";
public Page UiPage { get; set; } = new ExampleUi();
public NavigationItem NavIcon { get; set; } = new NavigationItem
{
Content = "Plugin",
Icon = SymbolRegular.Syringe20,
PageTag = "examplePlugin",
PageType = typeof(ExampleUi),
};
public void Execute()
{
throw new NotImplementedException();
}
public void Initialize()
{
//throw new NotImplementedException();
}
}
}

View file

@ -0,0 +1,77 @@
<?xml version="1.0" encoding="utf-8"?>
<Project ToolsVersion="4.0" DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
<Import Project="$(MSBuildExtensionsPath)\$(MSBuildToolsVersion)\Microsoft.Common.props"
Condition="Exists('$(MSBuildExtensionsPath)\$(MSBuildToolsVersion)\Microsoft.Common.props')"/>
<PropertyGroup>
<Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
<Platform Condition=" '$(Platform)' == '' ">AnyCPU</Platform>
<ProjectGuid>{910F0FC8-B73D-449F-ADD7-C6CA147D9F05}</ProjectGuid>
<OutputType>Library</OutputType>
<AppDesignerFolder>Properties</AppDesignerFolder>
<RootNamespace>ExamplePlugin</RootNamespace>
<AssemblyName>ExamplePlugin</AssemblyName>
<TargetFrameworkVersion>v4.8</TargetFrameworkVersion>
<FileAlignment>512</FileAlignment>
</PropertyGroup>
<PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
<PlatformTarget>AnyCPU</PlatformTarget>
<DebugSymbols>true</DebugSymbols>
<DebugType>full</DebugType>
<Optimize>false</Optimize>
<OutputPath>bin\Debug\</OutputPath>
<DefineConstants>DEBUG;TRACE</DefineConstants>
<ErrorReport>prompt</ErrorReport>
<WarningLevel>4</WarningLevel>
</PropertyGroup>
<PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' ">
<PlatformTarget>AnyCPU</PlatformTarget>
<DebugType>pdbonly</DebugType>
<Optimize>true</Optimize>
<OutputPath>bin\Release\</OutputPath>
<DefineConstants>TRACE</DefineConstants>
<ErrorReport>prompt</ErrorReport>
<WarningLevel>4</WarningLevel>
</PropertyGroup>
<ItemGroup>
<Reference Include="PresentationCore" />
<Reference Include="PresentationFramework" />
<Reference Include="System"/>
<Reference Include="System.Core"/>
<Reference Include="System.Data"/>
<Reference Include="System.Drawing.Common, Version=6.0.0.0, Culture=neutral, PublicKeyToken=cc7b13ffcd2ddd51, processorArchitecture=MSIL">
<HintPath>..\packages\System.Drawing.Common.6.0.0\lib\net461\System.Drawing.Common.dll</HintPath>
</Reference>
<Reference Include="System.Xaml" />
<Reference Include="System.Xml"/>
<Reference Include="WindowsBase" />
<Reference Include="Wpf.Ui, Version=2.0.3.0, Culture=neutral, processorArchitecture=MSIL">
<HintPath>..\packages\WPF-UI.2.0.3\lib\net48\Wpf.Ui.dll</HintPath>
</Reference>
</ItemGroup>
<ItemGroup>
<Compile Include="ExamplePlugin.cs" />
<Compile Include="ExampleUi.xaml.cs" />
<Compile Include="Properties\AssemblyInfo.cs"/>
</ItemGroup>
<ItemGroup>
<ProjectReference Include="..\WXPlugin\WXPlugin.csproj">
<Project>{56bfe4e0-0d30-474a-b57b-cf08515ff66e}</Project>
<Name>WXPlugin</Name>
</ProjectReference>
</ItemGroup>
<ItemGroup>
<Page Include="ExampleUi.xaml" />
</ItemGroup>
<ItemGroup>
<None Include="packages.config" />
</ItemGroup>
<Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets"/>
<!-- To modify your build process, add your task inside one of the targets below and uncomment it.
Other similar extension points exist, see Microsoft.Common.targets.
<Target Name="BeforeBuild">
</Target>
<Target Name="AfterBuild">
</Target>
-->
</Project>

View file

@ -0,0 +1,17 @@
<Page x:Class="ExampleUi"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:local="clr-namespace:ExamplePlugin"
xmlns:ui="http://schemas.lepo.co/wpfui/2022/xaml"
mc:Ignorable="d"
Title="AddRPCView" Height="Auto" Width="Auto"
Loaded="ExampleUi_OnLoaded">
<Grid>
<StackPanel>
<TextBlock Foreground="White">This is a Test Ui for the Example Plugin</TextBlock>
<TextBlock Name="TestLabel" Foreground="White" Text="{Binding LabelContent}"/>
</StackPanel>
</Grid>
</Page>

View file

@ -0,0 +1,18 @@
using System;
using System.Windows;
using System.Windows.Controls;
public partial class ExampleUi : Page
{
private int counter = 0;
public ExampleUi()
{
InitializeComponent();
}
private void ExampleUi_OnLoaded(object sender, RoutedEventArgs e)
{
counter++;
TestLabel.Text = counter.ToString();
}
}

View file

@ -0,0 +1,35 @@
using System.Reflection;
using System.Runtime.InteropServices;
// General Information about an assembly is controlled through the following
// set of attributes. Change these attribute values to modify the information
// associated with an assembly.
[assembly: AssemblyTitle("ExamplePlugin")]
[assembly: AssemblyDescription("")]
[assembly: AssemblyConfiguration("")]
[assembly: AssemblyCompany("")]
[assembly: AssemblyProduct("ExamplePlugin")]
[assembly: AssemblyCopyright("Copyright © 2025")]
[assembly: AssemblyTrademark("")]
[assembly: AssemblyCulture("")]
// Setting ComVisible to false makes the types in this assembly not visible
// to COM components. If you need to access a type in this assembly from
// COM, set the ComVisible attribute to true on that type.
[assembly: ComVisible(false)]
// The following GUID is for the ID of the typelib if this project is exposed to COM
[assembly: Guid("910F0FC8-B73D-449F-ADD7-C6CA147D9F05")]
// Version information for an assembly consists of the following four values:
//
// Major Version
// Minor Version
// Build Number
// Revision
//
// You can specify all the values or you can default the Build and Revision Numbers
// by using the '*' as shown below:
// [assembly: AssemblyVersion("1.0.*")]
[assembly: AssemblyVersion("1.0.0.0")]
[assembly: AssemblyFileVersion("1.0.0.0")]

View file

@ -0,0 +1,5 @@
<?xml version="1.0" encoding="utf-8"?>
<packages>
<package id="System.Drawing.Common" version="6.0.0" targetFramework="net48" />
<package id="WPF-UI" version="2.0.3" targetFramework="net48" />
</packages>

BIN
Images/home.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 80 KiB

BIN
Images/password_gen.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 63 KiB

BIN
Images/password_manager.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 46 KiB

BIN
Images/rpc.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 62 KiB

BIN
Images/settings.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 88 KiB

View file

@ -1,11 +1,9 @@
<div align="center">
<img width="100" height="100" src="https://cdn.discordapp.com/attachments/741123537582162020/965619554426437732/wicon.png">
<img width="100" height="100" src="https://raw.githubusercontent.com/WeeXnes/WeeXnesSuite/master/WeeXnes/Images/wicon.png">
<br>
<img alt="GitHub release (latest by date)" src="https://img.shields.io/github/v/release/WeeXnes/WeeXnesSuite?color=%23702e94">
</div>
<h1 align="center">WeeXnes Suite</h1>
<div align="center">
Built with:
@ -13,14 +11,51 @@ Built with:
![C#](https://img.shields.io/badge/c%23-%23239120.svg?style=for-the-badge&logo=c-sharp&logoColor=white)
![.Net](https://img.shields.io/badge/.NET-5C2D91?style=for-the-badge&logo=.net&logoColor=white)
</div>
Uses:
<a href="https://github.com/lepoco/wpfui">C# WPF-UI Library</a>
<h2></h2>
<h3 align="center">Encrypted Key Manager and Custom Discord Rich Presence that you can configure for every Process you want</h3>
<h2>Overview:</h2>
<image src="https://cdn.discordapp.com/attachments/741123537582162020/988509405815398472/keyview.png" height="400">
<image src="https://cdn.discordapp.com/attachments/741123537582162020/988509406658437250/settings.png" height="400">
<h3>Discord Rich Presence</h3>
Configurable DiscordRPC for every process you want. It detects if a process is started and starts the Rich Presence you configured for the Process
<image src="https://cdn.discordapp.com/attachments/741123537582162020/988509406293557258/rpc.png" height="320">
<image src="https://raw.githubusercontent.com/WeeXnes/WeeXnesSuite/master/Images/home.png" height="400">
<h2></h2>
<h3>Discord Rich Presence</h3>
Configurable DiscordRPC for every process you want. It detects if a process is started and starts the Rich Presence you configured for the Process (also has import/export functionality)
<br>
<image src="https://raw.githubusercontent.com/WeeXnes/WeeXnesSuite/master/Images/rpc.png" height="400">
<h2></h2>
<h3>Key Manager</h3>
encrypted key manager with import/export functionality
<br>
<image src="https://raw.githubusercontent.com/WeeXnes/WeeXnesSuite/master/Images/password_manager.png" height="400">
<h2></h2>
<h3>Password Generator</h3>
Password Generator. Generated passwords can be quickly saved to the Key Manager
<br>
<image src="https://raw.githubusercontent.com/WeeXnes/WeeXnesSuite/master/Images/password_gen.png" height="400">
<h2></h2>
<h3>Settings</h3>
Settings Showcase
<br>
<image src="https://raw.githubusercontent.com/WeeXnes/WeeXnesSuite/master/Images/settings.png" height="600">
<h2>Supported by: <a href="https://www.jetbrains.com">JetBrains</a></h2>
<image src="https://resources.jetbrains.com/storage/products/company/brand/logos/jb_beam.svg" width="200"><br>
Special thanks to JetBrains supporting this Project with their <a href="https://jb.gg/OpenSourceSupport">Open Source License Program</a>
</div>

View file

@ -1,134 +0,0 @@
using System;
using System.Collections.Generic;
using System.IO;
using System.IO.Compression;
namespace Release_Tool
{
internal class Program
{
static List<file> files = new List<file>();
public static string globalTimestamp = null;
public static string releaseFolder = "debug_release";
public static string releaseFileName = "currentRelease";
public static string fileending = ".zip";
public static string destFolder = null;
public static bool success = true;
public static bool Contains(string source, string toCheck, StringComparison comp)
{
return source?.IndexOf(toCheck, comp) >= 0;
}
public static void Main(string[] args)
{
var lines = File.ReadAllLines(".\\WeeXnes\\Core\\Globals.cs");
string versionLine = "";
foreach (var line in lines)
{
if (Contains(line, "public static string version", StringComparison.OrdinalIgnoreCase))
{
versionLine = line;
}
}
Console.WriteLine(versionLine);
string versionnr =
versionLine.Substring(versionLine.IndexOf("\""), versionLine.Length - versionLine.IndexOf("\""));
versionnr = versionnr.Substring(1, versionnr.Length - 1);
versionnr = versionnr.Substring(0, versionnr.IndexOf("\""));
string VersionNumber = versionnr;
releaseFileName = releaseFileName + "_" + versionnr + fileending;
Console.WriteLine("Packing " + releaseFileName);
Console.Title = "WeeXnes Automated Release Tool";
SetTimestamp();
SetPaths();
Console.WriteLine("Folder -> " + globalTimestamp);
CheckDirectories();
GetFiles();
PackFiles();
if (!success)
{
Console.WriteLine("Something went wrong");
Console.ReadLine();
}
else
{
PackIntoZip();
Console.WriteLine("Build succeeded | " + globalTimestamp);
Console.ReadLine();
}
}
private static void PackIntoZip()
{
try
{
if(File.Exists(Path.Combine(releaseFolder, releaseFileName)))
{
File.Delete(Path.Combine(releaseFolder, "currentRelease.zip"));
ZipFile.CreateFromDirectory(destFolder, Path.Combine(releaseFolder, releaseFileName));
}
else
{
ZipFile.CreateFromDirectory(destFolder, Path.Combine(releaseFolder, releaseFileName));
}
}catch (Exception ex)
{
Console.WriteLine(ex);
Console.ReadLine();
}
}
private static void SetPaths()
{
destFolder = Path.Combine(releaseFolder, globalTimestamp);
}
private static void CheckDirectories()
{
if (!Directory.Exists(releaseFolder))
{
Directory.CreateDirectory(releaseFolder);
}
if(!Directory.Exists(destFolder))
{
Directory.CreateDirectory(destFolder);
}
}
private static void SetTimestamp()
{
string date = DateTime.Now.ToString("dd.MM.yyyy");
string time = DateTime.Now.ToString("HH.mm.ss");
string timestamp = date + " - " + time;
globalTimestamp = timestamp;
}
private static void PackFiles()
{
foreach(file fileobj in files)
{
try
{
File.Copy(fileobj.path, Path.Combine(destFolder, fileobj.newfilename));
Console.WriteLine("Copied " + fileobj.path);
}
catch (Exception ex)
{
Console.WriteLine("Coudnt find " + fileobj.path + "| ->" + ex.GetType());
success = false;
}
}
}
private static void GetFiles()
{
files.Add(new file(@"WeeXnes\bin\Release\WeeXnes.exe", "WeeXnes.exe"));
files.Add(new file(@"WeeXnes_UAC\bin\Release\WeeXnes_UAC.exe", "WeeXnes_UAC.exe"));
files.Add(new file(@"WeeXnes\bin\Release\DiscordRPC.dll", "DiscordRPC.dll"));
files.Add(new file(@"WeeXnes\bin\Release\Newtonsoft.Json.dll", "Newtonsoft.Json.dll"));
files.Add(new file(@"Autostart\bin\Release\Autostart.exe", "Autostart.exe"));
files.Add(new file(@"Update\bin\Release\Update.exe", "Update.exe"));
}
}
}

View file

@ -1,13 +0,0 @@
namespace Release_Tool
{
public class file
{
public string path { get; set; }
public string newfilename { get; set; }
public file(string _path, string _newfilename)
{
this.path = _path;
this.newfilename = _newfilename;
}
}
}

6
Update/App.config Normal file
View file

@ -0,0 +1,6 @@
<?xml version="1.0" encoding="utf-8" ?>
<configuration>
<startup>
<supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.8.1" />
</startup>
</configuration>

10
Update/App.xaml Normal file
View file

@ -0,0 +1,10 @@
<Application x:Class="Update.App"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:local="clr-namespace:Update"
StartupUri="MainWindow.xaml"
Startup="App_OnStartup">
<Application.Resources>
</Application.Resources>
</Application>

View file

@ -2,42 +2,49 @@
using System.Diagnostics;
using System.IO;
using System.IO.Compression;
using System.Windows;
namespace Update
{
internal class Program
/// <summary>
/// Interaction logic for App.xaml
/// </summary>
public partial class App
{
public static bool keepWindowOpen = false;
public static void Main(string[] args)
private void App_OnStartup(object sender, StartupEventArgs e)
{
Console.WriteLine("Path: " + args[0]);
Console.WriteLine("FileName: " + args[1]);
Console.WriteLine("PID: " + args[2]);
Console.WriteLine("New File: " + args[3]);
Process p = Process.GetProcessById(Convert.ToInt32(args[2]));
RunUpdater(e.Args[0],e.Args[1],e.Args[2],e.Args[3]);
}
private void RunUpdater(string Path, string FileName, string ProcessId, string NewFile)
{
if(String.IsNullOrEmpty(Path))
return;
if(String.IsNullOrEmpty(FileName))
return;
if(String.IsNullOrEmpty(ProcessId))
return;
if(String.IsNullOrEmpty(NewFile))
return;
Process p = Process.GetProcessById(Convert.ToInt32(ProcessId));
p.Kill();
p.WaitForExit();
try
{
ZipArchiveHelper.ExtractToDirectory(args[3], args[0], true);
ZipArchiveHelper.ExtractToDirectory(NewFile, Path, true);
}
catch (Exception ex)
{
Console.WriteLine(ex.ToString());
ZipArchiveHelper.ExtractToDirectory(args[3], args[0], true);
ZipArchiveHelper.ExtractToDirectory(NewFile, Path, true);
}
Process.Start(args[0] + "\\" + args[1]);
if (File.Exists(args[3]))
Process.Start(Path + "\\" + FileName);
if (File.Exists(NewFile))
{
File.Delete(args[3]);
}
if (keepWindowOpen)
{
Console.WriteLine("Window kept open to see error message, press enter to continue");
Console.ReadLine();
File.Delete(NewFile);
}
Environment.Exit(0);
}
}
public static class ZipArchiveHelper
@ -68,16 +75,9 @@ namespace Update
}
catch (IOException ex)
{
if (file.FullName == "Update.exe")
{
}
else
{
Console.WriteLine(ex.ToString());
Console.WriteLine(file.FullName + " couldnt be overwritten, an error has occured");
Program.keepWindowOpen = true;
}
Console.WriteLine(ex);
var completeFileName = Path.Combine(destinationDirectoryName, file.FullName + ".new");
file.ExtractToFile(completeFileName);
}
}

12
Update/MainWindow.xaml Normal file
View file

@ -0,0 +1,12 @@
<Window x:Class="Update.MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
xmlns:local="clr-namespace:Update"
mc:Ignorable="d"
Title="MainWindow" Height="350" Width="525">
<Grid>
</Grid>
</Window>

13
Update/MainWindow.xaml.cs Normal file
View file

@ -0,0 +1,13 @@
namespace Update
{
/// <summary>
/// Interaction logic for MainWindow.xaml
/// </summary>
public partial class MainWindow
{
public MainWindow()
{
InitializeComponent();
}
}
}

View file

@ -1,7 +1,10 @@
using System.Reflection;
using System.Resources;
using System.Runtime.CompilerServices;
using System.Runtime.InteropServices;
using System.Windows;
// General Information about an assembly is controlled through the following
// General Information about an assembly is controlled through the following
// set of attributes. Change these attribute values to modify the information
// associated with an assembly.
[assembly: AssemblyTitle("Update")]
@ -13,22 +16,39 @@ using System.Runtime.InteropServices;
[assembly: AssemblyTrademark("")]
[assembly: AssemblyCulture("")]
// Setting ComVisible to false makes the types in this assembly not visible
// to COM components. If you need to access a type in this assembly from
// Setting ComVisible to false makes the types in this assembly not visible
// to COM components. If you need to access a type in this assembly from
// COM, set the ComVisible attribute to true on that type.
[assembly: ComVisible(false)]
// The following GUID is for the ID of the typelib if this project is exposed to COM
[assembly: Guid("6F2F689B-F4E3-4204-BA72-624BE46020AD")]
//In order to begin building localizable applications, set
//<UICulture>CultureYouAreCodingWith</UICulture> in your .csproj file
//inside a <PropertyGroup>. For example, if you are using US english
//in your source files, set the <UICulture> to en-US. Then uncomment
//the NeutralResourceLanguage attribute below. Update the "en-US" in
//the line below to match the UICulture setting in the project file.
//[assembly: NeutralResourcesLanguage("en-US", UltimateResourceFallbackLocation.Satellite)]
[assembly: ThemeInfo(
ResourceDictionaryLocation.None, //where theme specific resource dictionaries are located
//(used if a resource is not found in the page,
// or application resource dictionaries)
ResourceDictionaryLocation.SourceAssembly //where the generic resource dictionary is located
//(used if a resource is not found in the page,
// app, or any theme specific resource dictionaries)
)]
// Version information for an assembly consists of the following four values:
//
// Major Version
// Minor Version
// Minor Version
// Build Number
// Revision
//
// You can specify all the values or you can default the Build and Revision Numbers
// You can specify all the values or you can default the Build and Revision Numbers
// by using the '*' as shown below:
// [assembly: AssemblyVersion("1.0.*")]
[assembly: AssemblyVersion("1.0.0.0")]

69
Update/Properties/Resources.Designer.cs generated Normal file
View file

@ -0,0 +1,69 @@
//------------------------------------------------------------------------------
// <auto-generated>
// This code was generated by a tool.
// Runtime Version:4.0.30319.42000
//
// Changes to this file may cause incorrect behavior and will be lost if
// the code is regenerated.
// </auto-generated>
//------------------------------------------------------------------------------
namespace Update.Properties
{
/// <summary>
/// A strongly-typed resource class, for looking up localized strings, etc.
/// </summary>
// This class was auto-generated by the StronglyTypedResourceBuilder
// class via a tool like ResGen or Visual Studio.
// To add or remove a member, edit your .ResX file then rerun ResGen
// with the /str option, or rebuild your VS project.
[global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Resources.Tools.StronglyTypedResourceBuilder",
"4.0.0.0")]
[global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
[global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()]
internal class Resources
{
private static global::System.Resources.ResourceManager resourceMan;
private static global::System.Globalization.CultureInfo resourceCulture;
[global::System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance",
"CA1811:AvoidUncalledPrivateCode")]
internal Resources()
{
}
/// <summary>
/// Returns the cached ResourceManager instance used by this class.
/// </summary>
[global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState
.Advanced)]
internal static global::System.Resources.ResourceManager ResourceManager
{
get
{
if ((resourceMan == null))
{
global::System.Resources.ResourceManager temp =
new global::System.Resources.ResourceManager("Update.Properties.Resources",
typeof(Resources).Assembly);
resourceMan = temp;
}
return resourceMan;
}
}
/// <summary>
/// Overrides the current thread's CurrentUICulture property for all
/// resource lookups using this strongly typed resource class.
/// </summary>
[global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState
.Advanced)]
internal static global::System.Globalization.CultureInfo Culture
{
get { return resourceCulture; }
set { resourceCulture = value; }
}
}
}

View file

@ -0,0 +1,117 @@
<?xml version="1.0" encoding="utf-8"?>
<root>
<!--
Microsoft ResX Schema
Version 2.0
The primary goals of this format is to allow a simple XML format
that is mostly human readable. The generation and parsing of the
various data types are done through the TypeConverter classes
associated with the data types.
Example:
... ado.net/XML headers & schema ...
<resheader name="resmimetype">text/microsoft-resx</resheader>
<resheader name="version">2.0</resheader>
<resheader name="reader">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>
<resheader name="writer">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>
<data name="Name1"><value>this is my long string</value><comment>this is a comment</comment></data>
<data name="Color1" type="System.Drawing.Color, System.Drawing">Blue</data>
<data name="Bitmap1" mimetype="application/x-microsoft.net.object.binary.base64">
<value>[base64 mime encoded serialized .NET Framework object]</value>
</data>
<data name="Icon1" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
<value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>
<comment>This is a comment</comment>
</data>
There are any number of "resheader" rows that contain simple
name/value pairs.
Each data row contains a name, and value. The row also contains a
type or mimetype. Type corresponds to a .NET class that support
text/value conversion through the TypeConverter architecture.
Classes that don't support this are serialized and stored with the
mimetype set.
The mimetype is used for serialized objects, and tells the
ResXResourceReader how to depersist the object. This is currently not
extensible. For a given mimetype the value must be set accordingly:
Note - application/x-microsoft.net.object.binary.base64 is the format
that the ResXResourceWriter will generate, however the reader can
read any of the formats listed below.
mimetype: application/x-microsoft.net.object.binary.base64
value : The object must be serialized with
: System.Serialization.Formatters.Binary.BinaryFormatter
: and then encoded with base64 encoding.
mimetype: application/x-microsoft.net.object.soap.base64
value : The object must be serialized with
: System.Runtime.Serialization.Formatters.Soap.SoapFormatter
: and then encoded with base64 encoding.
mimetype: application/x-microsoft.net.object.bytearray.base64
value : The object must be serialized into a byte array
: using a System.ComponentModel.TypeConverter
: and then encoded with base64 encoding.
-->
<xsd:schema id="root" xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
<xsd:element name="root" msdata:IsDataSet="true">
<xsd:complexType>
<xsd:choice maxOccurs="unbounded">
<xsd:element name="metadata">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" />
</xsd:sequence>
<xsd:attribute name="name" type="xsd:string" />
<xsd:attribute name="type" type="xsd:string" />
<xsd:attribute name="mimetype" type="xsd:string" />
</xsd:complexType>
</xsd:element>
<xsd:element name="assembly">
<xsd:complexType>
<xsd:attribute name="alias" type="xsd:string" />
<xsd:attribute name="name" type="xsd:string" />
</xsd:complexType>
</xsd:element>
<xsd:element name="data">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
<xsd:element name="comment" type="xsd:string" minOccurs="0" msdata:Ordinal="2" />
</xsd:sequence>
<xsd:attribute name="name" type="xsd:string" msdata:Ordinal="1" />
<xsd:attribute name="type" type="xsd:string" msdata:Ordinal="3" />
<xsd:attribute name="mimetype" type="xsd:string" msdata:Ordinal="4" />
</xsd:complexType>
</xsd:element>
<xsd:element name="resheader">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
</xsd:sequence>
<xsd:attribute name="name" type="xsd:string" use="required" />
</xsd:complexType>
</xsd:element>
</xsd:choice>
</xsd:complexType>
</xsd:element>
</xsd:schema>
<resheader name="resmimetype">
<value>text/microsoft-resx</value>
</resheader>
<resheader name="version">
<value>2.0</value>
</resheader>
<resheader name="reader">
<value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</resheader>
<resheader name="writer">
<value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</resheader>
</root>

View file

@ -1,17 +1,20 @@
<?xml version="1.0" encoding="utf-8"?>
<Project ToolsVersion="4.0" DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
<Project ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
<Import Project="$(MSBuildExtensionsPath)\$(MSBuildToolsVersion)\Microsoft.Common.props" Condition="Exists('$(MSBuildExtensionsPath)\$(MSBuildToolsVersion)\Microsoft.Common.props')" />
<PropertyGroup>
<Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
<Platform Condition=" '$(Platform)' == '' ">AnyCPU</Platform>
<ProjectGuid>{6F2F689B-F4E3-4204-BA72-624BE46020AD}</ProjectGuid>
<OutputType>Exe</OutputType>
<AppDesignerFolder>Properties</AppDesignerFolder>
<ProjectGuid>{133FF515-D605-4856-BA2E-5841BF47EC2F}</ProjectGuid>
<OutputType>WinExe</OutputType>
<RootNamespace>Update</RootNamespace>
<AssemblyName>Update</AssemblyName>
<TargetFrameworkVersion>v4.8</TargetFrameworkVersion>
<TargetFrameworkVersion>v4.8.1</TargetFrameworkVersion>
<FileAlignment>512</FileAlignment>
<ProjectTypeGuids>{60dc8134-eba5-43b8-bcc9-bb4bc16c2548};{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}</ProjectTypeGuids>
<WarningLevel>4</WarningLevel>
<AutoGenerateBindingRedirects>true</AutoGenerateBindingRedirects>
<ApplicationIcon>wicns.ico</ApplicationIcon>
<LangVersion>12</LangVersion>
</PropertyGroup>
<PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
<PlatformTarget>AnyCPU</PlatformTarget>
@ -39,18 +42,48 @@
<Reference Include="System.IO.Compression" />
<Reference Include="System.IO.Compression.FileSystem" />
<Reference Include="System.Xml" />
<Reference Include="System.Xaml">
<RequiredTargetFramework>4.0</RequiredTargetFramework>
</Reference>
<Reference Include="WindowsBase" />
<Reference Include="PresentationCore" />
<Reference Include="PresentationFramework" />
</ItemGroup>
<ItemGroup>
<Compile Include="Program.cs" />
<Compile Include="Properties\AssemblyInfo.cs" />
<ApplicationDefinition Include="App.xaml">
<Generator>MSBuild:Compile</Generator>
<SubType>Designer</SubType>
</ApplicationDefinition>
<Page Include="MainWindow.xaml">
<Generator>MSBuild:Compile</Generator>
<SubType>Designer</SubType>
</Page>
<Compile Include="App.xaml.cs">
<DependentUpon>App.xaml</DependentUpon>
<SubType>Code</SubType>
</Compile>
<Compile Include="MainWindow.xaml.cs">
<DependentUpon>MainWindow.xaml</DependentUpon>
<SubType>Code</SubType>
</Compile>
</ItemGroup>
<ItemGroup>
<Compile Include="Properties\AssemblyInfo.cs">
<SubType>Code</SubType>
</Compile>
<Compile Include="Properties\Resources.Designer.cs">
<AutoGen>True</AutoGen>
<DesignTime>True</DesignTime>
<DependentUpon>Resources.resx</DependentUpon>
</Compile>
<EmbeddedResource Include="Properties\Resources.resx">
<Generator>ResXFileCodeGenerator</Generator>
<LastGenOutput>Resources.Designer.cs</LastGenOutput>
</EmbeddedResource>
</ItemGroup>
<ItemGroup>
<None Include="App.config" />
<None Include="wicns.ico" />
</ItemGroup>
<Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" />
<!-- To modify your build process, add your task inside one of the targets below and uncomment it.
Other similar extension points exist, see Microsoft.Common.targets.
<Target Name="BeforeBuild">
</Target>
<Target Name="AfterBuild">
</Target>
-->
</Project>
</Project>

View file

Before

Width:  |  Height:  |  Size: 308 KiB

After

Width:  |  Height:  |  Size: 308 KiB

View file

@ -0,0 +1,16 @@
using System;
using System.Windows.Controls;
using Wpf.Ui.Controls;
namespace WXPlugin.PluginCore
{
public interface IPluginBase
{
public String Name { get; set; }
public String Description { get; set; }
public Page UiPage { get; set; }
public NavigationItem NavIcon { get; set; }
public void Initialize();
public void Execute();
}
}

View file

@ -4,12 +4,12 @@ using System.Runtime.InteropServices;
// General Information about an assembly is controlled through the following
// set of attributes. Change these attribute values to modify the information
// associated with an assembly.
[assembly: AssemblyTitle("Release_Tool")]
[assembly: AssemblyTitle("WXPlugin")]
[assembly: AssemblyDescription("")]
[assembly: AssemblyConfiguration("")]
[assembly: AssemblyCompany("")]
[assembly: AssemblyProduct("Release_Tool")]
[assembly: AssemblyCopyright("Copyright © 2022")]
[assembly: AssemblyProduct("WXPlugin")]
[assembly: AssemblyCopyright("Copyright © 2025")]
[assembly: AssemblyTrademark("")]
[assembly: AssemblyCulture("")]
@ -19,7 +19,7 @@ using System.Runtime.InteropServices;
[assembly: ComVisible(false)]
// The following GUID is for the ID of the typelib if this project is exposed to COM
[assembly: Guid("4C09AD12-B48E-40ED-B418-CF868889E317")]
[assembly: Guid("56BFE4E0-0D30-474A-B57B-CF08515FF66E")]
// Version information for an assembly consists of the following four values:
//

View file

@ -1,18 +1,18 @@
<?xml version="1.0" encoding="utf-8"?>
<Project ToolsVersion="4.0" DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
<Import Project="$(MSBuildExtensionsPath)\$(MSBuildToolsVersion)\Microsoft.Common.props" Condition="Exists('$(MSBuildExtensionsPath)\$(MSBuildToolsVersion)\Microsoft.Common.props')" />
<Import Project="$(MSBuildExtensionsPath)\$(MSBuildToolsVersion)\Microsoft.Common.props"
Condition="Exists('$(MSBuildExtensionsPath)\$(MSBuildToolsVersion)\Microsoft.Common.props')"/>
<PropertyGroup>
<Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
<Platform Condition=" '$(Platform)' == '' ">AnyCPU</Platform>
<ProjectGuid>{4C09AD12-B48E-40ED-B418-CF868889E317}</ProjectGuid>
<OutputType>Exe</OutputType>
<ProjectGuid>{56BFE4E0-0D30-474A-B57B-CF08515FF66E}</ProjectGuid>
<OutputType>Library</OutputType>
<AppDesignerFolder>Properties</AppDesignerFolder>
<RootNamespace>Release_Tool</RootNamespace>
<AssemblyName>Release_Tool</AssemblyName>
<RootNamespace>WXPlugin</RootNamespace>
<AssemblyName>WXPlugin</AssemblyName>
<TargetFrameworkVersion>v4.8</TargetFrameworkVersion>
<FileAlignment>512</FileAlignment>
<AutoGenerateBindingRedirects>true</AutoGenerateBindingRedirects>
<ApplicationIcon>wicns.ico</ApplicationIcon>
<LangVersion>12</LangVersion>
</PropertyGroup>
<PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
<PlatformTarget>AnyCPU</PlatformTarget>
@ -34,21 +34,28 @@
<WarningLevel>4</WarningLevel>
</PropertyGroup>
<ItemGroup>
<Reference Include="System" />
<Reference Include="System.Core" />
<Reference Include="System.Data" />
<Reference Include="System.IO.Compression.FileSystem" />
<Reference Include="System.Xml" />
<Reference Include="PresentationCore" />
<Reference Include="PresentationFramework" />
<Reference Include="System"/>
<Reference Include="System.Core"/>
<Reference Include="System.Data"/>
<Reference Include="System.Drawing.Common, Version=6.0.0.0, Culture=neutral, PublicKeyToken=cc7b13ffcd2ddd51, processorArchitecture=MSIL">
<HintPath>..\packages\System.Drawing.Common.6.0.0\lib\net461\System.Drawing.Common.dll</HintPath>
</Reference>
<Reference Include="System.Xml"/>
<Reference Include="WindowsBase" />
<Reference Include="Wpf.Ui, Version=2.0.3.0, Culture=neutral, processorArchitecture=MSIL">
<HintPath>..\packages\WPF-UI.2.0.3\lib\net48\Wpf.Ui.dll</HintPath>
</Reference>
</ItemGroup>
<ItemGroup>
<Compile Include="file.cs" />
<Compile Include="Program.cs" />
<Compile Include="Properties\AssemblyInfo.cs" />
<Compile Include="PluginCore\IPluginBase.cs" />
<Compile Include="Properties\AssemblyInfo.cs"/>
</ItemGroup>
<ItemGroup>
<Content Include="wicns.ico" />
<None Include="packages.config" />
</ItemGroup>
<Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" />
<Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets"/>
<!-- To modify your build process, add your task inside one of the targets below and uncomment it.
Other similar extension points exist, see Microsoft.Common.targets.
<Target Name="BeforeBuild">

5
WXPlugin/packages.config Normal file
View file

@ -0,0 +1,5 @@
<?xml version="1.0" encoding="utf-8"?>
<packages>
<package id="System.Drawing.Common" version="6.0.0" targetFramework="net48" />
<package id="WPF-UI" version="2.0.3" targetFramework="net48" />
</packages>

View file

@ -6,9 +6,11 @@ Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Autostart", "Autostart\Auto
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "WeeXnes_UAC", "WeeXnes_UAC\WeeXnes_UAC.csproj", "{2DCC0DCD-7843-4719-9FDD-1786924CF941}"
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Release_Tool", "Release_Tool\Release_Tool.csproj", "{4C09AD12-B48E-40ED-B418-CF868889E317}"
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Update", "Update\Update.csproj", "{133FF515-D605-4856-BA2E-5841BF47EC2F}"
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Update", "Update\Update.csproj", "{6F2F689B-F4E3-4204-BA72-624BE46020AD}"
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "WXPlugin", "WXPlugin\WXPlugin.csproj", "{56BFE4E0-0D30-474A-B57B-CF08515FF66E}"
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "ExamplePlugin", "ExamplePlugin\ExamplePlugin.csproj", "{910F0FC8-B73D-449F-ADD7-C6CA147D9F05}"
EndProject
Global
GlobalSection(SolutionConfigurationPlatforms) = preSolution
@ -28,13 +30,17 @@ Global
{2DCC0DCD-7843-4719-9FDD-1786924CF941}.Debug|Any CPU.Build.0 = Debug|Any CPU
{2DCC0DCD-7843-4719-9FDD-1786924CF941}.Release|Any CPU.ActiveCfg = Release|Any CPU
{2DCC0DCD-7843-4719-9FDD-1786924CF941}.Release|Any CPU.Build.0 = Release|Any CPU
{4C09AD12-B48E-40ED-B418-CF868889E317}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{4C09AD12-B48E-40ED-B418-CF868889E317}.Debug|Any CPU.Build.0 = Debug|Any CPU
{4C09AD12-B48E-40ED-B418-CF868889E317}.Release|Any CPU.ActiveCfg = Release|Any CPU
{4C09AD12-B48E-40ED-B418-CF868889E317}.Release|Any CPU.Build.0 = Release|Any CPU
{6F2F689B-F4E3-4204-BA72-624BE46020AD}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{6F2F689B-F4E3-4204-BA72-624BE46020AD}.Debug|Any CPU.Build.0 = Debug|Any CPU
{6F2F689B-F4E3-4204-BA72-624BE46020AD}.Release|Any CPU.ActiveCfg = Release|Any CPU
{6F2F689B-F4E3-4204-BA72-624BE46020AD}.Release|Any CPU.Build.0 = Release|Any CPU
{133FF515-D605-4856-BA2E-5841BF47EC2F}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{133FF515-D605-4856-BA2E-5841BF47EC2F}.Debug|Any CPU.Build.0 = Debug|Any CPU
{133FF515-D605-4856-BA2E-5841BF47EC2F}.Release|Any CPU.ActiveCfg = Release|Any CPU
{133FF515-D605-4856-BA2E-5841BF47EC2F}.Release|Any CPU.Build.0 = Release|Any CPU
{56BFE4E0-0D30-474A-B57B-CF08515FF66E}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{56BFE4E0-0D30-474A-B57B-CF08515FF66E}.Debug|Any CPU.Build.0 = Debug|Any CPU
{56BFE4E0-0D30-474A-B57B-CF08515FF66E}.Release|Any CPU.ActiveCfg = Release|Any CPU
{56BFE4E0-0D30-474A-B57B-CF08515FF66E}.Release|Any CPU.Build.0 = Release|Any CPU
{910F0FC8-B73D-449F-ADD7-C6CA147D9F05}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{910F0FC8-B73D-449F-ADD7-C6CA147D9F05}.Debug|Any CPU.Build.0 = Debug|Any CPU
{910F0FC8-B73D-449F-ADD7-C6CA147D9F05}.Release|Any CPU.ActiveCfg = Release|Any CPU
{910F0FC8-B73D-449F-ADD7-C6CA147D9F05}.Release|Any CPU.Build.0 = Release|Any CPU
EndGlobalSection
EndGlobal

View file

@ -1,6 +1,6 @@
<?xml version="1.0" encoding="utf-8" ?>
<configuration>
<startup>
<startup>
<supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.8" />
</startup>
</configuration>

View file

@ -2,37 +2,15 @@
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:local="clr-namespace:WeeXnes"
xmlns:viewModel="clr-namespace:WeeXnes.MVVM.ViewModel"
xmlns:view="clr-namespace:WeeXnes.MVVM.View"
xmlns:ui="http://schemas.lepo.co/wpfui/2022/xaml"
StartupUri="MainWindow.xaml"
Startup="App_OnStartup">
<Application.Resources>
<ResourceDictionary>
<ResourceDictionary.MergedDictionaries>
<ResourceDictionary Source="Theme/MenuButtonTheme.xaml"/>
<ResourceDictionary Source="Theme/TextBoxTheme.xaml"/>
<ResourceDictionary Source="Theme/ControlButtonTheme.xaml"/>
<ResourceDictionary Source="Theme/ModernCheckbox.xaml"/>
<ResourceDictionary Source="Theme/Scrollbar.xaml"/>
<ui:ThemesDictionary Theme="Dark" />
<ui:ControlsDictionary />
</ResourceDictionary.MergedDictionaries>
<DataTemplate DataType="{x:Type viewModel:HomeViewModel}">
<view:HomeView/>
</DataTemplate>
<DataTemplate DataType="{x:Type viewModel:KeyManagerViewModel}">
<view:KeyManagerView/>
</DataTemplate>
<DataTemplate DataType="{x:Type viewModel:DiscordRpcViewModel}">
<view:DiscordRpcView/>
</DataTemplate>
<DataTemplate DataType="{x:Type viewModel:SettingsViewModel}">
<view:SettingView/>
</DataTemplate>
</ResourceDictionary>
</Application.Resources>

View file

@ -1,9 +1,16 @@
using System;
using System.ComponentModel;
using System.Windows;
using WeeXnes.Core;
using System.IO;
using System.Reflection;
using WeeXnes.Misc;
using System.Net;
using System.Runtime.CompilerServices;
using System.Windows.Media;
using Newtonsoft.Json.Linq;
using Nocksoft.IO.ConfigFiles;
using WeeXnes.Core;
using WeeXnes.Views.DiscordRPC;
using WeeXnes.Views.KeyManager;
using WeeXnes.Views.Settings;
using Application = System.Windows.Forms.Application;
namespace WeeXnes
@ -13,23 +20,192 @@ namespace WeeXnes
/// </summary>
public partial class App
{
public static bool DebugMode = false;
private void SetExceptionHandler()
{
AppDomain currentDomain = default(AppDomain);
currentDomain = AppDomain.CurrentDomain;
currentDomain.UnhandledException += GlobalUnhandledExceptionHandler;
}
private static void GlobalUnhandledExceptionHandler(object sender, UnhandledExceptionEventArgs e)
{
Exception ex = (Exception)e.ExceptionObject;
DateTime currentDateTime = DateTime.Now;
string formattedDateTime = currentDateTime.ToString("dddd, dd MMMM yyyy HH:mm:ss");
using (StreamWriter writer = new StreamWriter("error_log.txt"))
{
writer.WriteLine(formattedDateTime);
writer.WriteLine(ex.ToString());
}
new FluentMessageBox(ex.Message).ShowDialog();
}
private void App_OnStartup(object sender, StartupEventArgs e)
{
Environment.CurrentDirectory = Application.StartupPath;
if (e.Args.Length > 0)
{
for (int i = 0; i != e.Args.Length; ++i)
{
//MessageBox.Show(e.Args[i]);
if (e.Args[i] == "-autostart")
{
//MessageBox.Show("Launched via autostart");
Globals.info_RpcAutoStart = true;
}
}
Console.Data.Colors.colored_output = false;
Console.Data.Formatting.timestamp_prefix = true;
SetExceptionHandler();
CheckForDebugMode();
CheckStartupArgs(e.Args);
CheckUpdatedFiles();
CheckForFolder();
LoadSettings();
SaveSettingsHandler.SetupSaveEvents();
LoadFiles();
LoadPluginManager();
}
private void LoadPluginManager()
{
if (!Directory.Exists(Global.Defaults.DefaultPathPlugins))
Directory.CreateDirectory(Global.Defaults.DefaultPathPlugins);
Global.pluginManager.LoadPlugins();
foreach (var plugin in Global.pluginManager.CurrentPlugins)
{
plugin.Initialize();
}
//Globals.autoStartRpc = true;
}
private void CheckUpdatedFiles()
{
string[] files = System.IO.Directory.GetFiles(Environment.CurrentDirectory, "*.new");
foreach (string file in files)
{
try
{
string originalFile = file.Substring(0, file
.Length - 4);
if (File.Exists(originalFile))
File.Delete(originalFile);
System.IO.File.Move(file, originalFile);
}
catch (Exception ex)
{
Console.Error(ex.ToString());
}
}
}
private void LoadSettings()
{
if(!File.Exists(Path.Combine(Global.AppDataPath, Global.SettingsFile)))
return;
KeyManagerView.Data.censorKeys.Value =
Convert.ToBoolean(SettingsView.Data.settingsFile.GetValue(
SaveSettingsHandler.Data.KeyManager.Section,
SaveSettingsHandler.Data.KeyManager.CensorKeys));
KeyManagerView.Data.copyOnSelect.Value =
Convert.ToBoolean(SettingsView.Data.settingsFile.GetValue(
SaveSettingsHandler.Data.KeyManager.Section,
SaveSettingsHandler.Data.KeyManager.CopyOnSelect));
KeyManagerView.Data.sortList.Value =
Convert.ToBoolean(SettingsView.Data.settingsFile.GetValue(
SaveSettingsHandler.Data.KeyManager.Section,
SaveSettingsHandler.Data.KeyManager.SortList));
//Load paths
string customRpcPath = SettingsView.Data.settingsFile.GetValue(
SaveSettingsHandler.Data.General.Section,
SaveSettingsHandler.Data.General.RpcFilesPath
);
if (!String.IsNullOrEmpty(customRpcPath))
{
Global.AppDataPathRPC.Value = customRpcPath;
}
else
{
Global.AppDataPathRPC.Value = Global.Defaults.DefaultPathRPC;
}
string customKeyPath = SettingsView.Data.settingsFile.GetValue(
SaveSettingsHandler.Data.General.Section,
SaveSettingsHandler.Data.General.KeyFilesPath
);
if (!String.IsNullOrEmpty(customKeyPath))
{
Global.AppDataPathKEY.Value = customKeyPath;
}
else
{
Global.AppDataPathKEY.Value = Global.Defaults.DefaultPathKEY;
}
}
private void LoadFiles()
{
Functions.CheckFolderAndCreate(Global.AppDataPathRPC.Value);
DirectoryInfo rpcDirectoryInfo = new DirectoryInfo(Global.AppDataPathRPC.Value);
foreach (var file in rpcDirectoryInfo.GetFiles("*.rpc"))
{
try
{
Game newGame = Game.Methods.GameFromIni(new INIFile(file.FullName));
DiscordRPCView.Data.Games.Add(newGame);
Console.WriteLine(file.Name + " loaded -> " + newGame.ProcessName);
}
catch (Exception ex)
{
Console.Error(file.Name + ": " + ex.Message);
new FluentMessageBox(file.Name + ": " + ex.Message).ShowDialog();
}
}
Functions.CheckFolderAndCreate(Global.AppDataPathKEY.Value);
DirectoryInfo keyDirectoryInfo = new DirectoryInfo(Global.AppDataPathKEY.Value);
foreach (var file in keyDirectoryInfo.GetFiles("*.wx"))
{
try
{
//Load KeyFiles
WXFile wxFile = new WXFile(file.FullName);
KeyItem newItem = new KeyItem(
wxFile.GetName(),
EncryptionLib.EncryptorLibary.decrypt(
Information.EncryptionHash,
wxFile.GetValue()
)
);
newItem.Filename = file.Name;
KeyManagerView.Data.KeyItemsList.Add(newItem);
Console.WriteLine(file.Name + " loaded -> " + newItem.Name);
}
catch (Exception ex)
{
Console.Error(file.Name + ": " + ex.Message);
new FluentMessageBox(file.Name + ": " + ex.Message).ShowDialog();
}
}
}
private void CheckForFolder()
{
Functions.CheckFolderAndCreate(Global.AppDataPath);
}
private void CheckStartupArgs(string[] arguments)
{
foreach (string argument in arguments)
{
switch (argument)
{
case HandleLaunchArguments.ArgumentStrings.autostart:
HandleLaunchArguments.arg_autostart();
break;
case HandleLaunchArguments.ArgumentStrings.debugMode:
HandleLaunchArguments.arg_debugMode();
break;
}
}
}
private void CheckForDebugMode()
{
#if DEBUG
HandleLaunchArguments.arg_debugMode();
#endif
}
}
}

147
WeeXnes/Core/Console.cs Normal file
View file

@ -0,0 +1,147 @@
global using Console = WeeXnes.Core.Console;
global using VanillaConsole = System.Console;
using System;
using System.Collections.Generic;
using System.Runtime.CompilerServices;
using System.Text;
namespace WeeXnes.Core
{
public static class Console
{
public static class Data
{
public static class Colors
{
public static bool colored_output = true;
public static ConsoleColor int_color = ConsoleColor.Blue;
public static ConsoleColor double_color = ConsoleColor.Cyan;
public static ConsoleColor float_color = ConsoleColor.DarkCyan;
}
public static class Formatting
{
public static bool timestamp_prefix = false;
public static string success_char = "✓";
public static string warning_char = "⌬";
public static string info_char = "◈";
public static string error_char = "☓";
public static string writeline_char = "•";
}
}
private static void ConfiguredWriteline(
string text,
ConsoleColor color,
ConsoleColor foregroundColor = ConsoleColor.White)
{
if(!App.DebugMode)
return;
try
{
VanillaConsole.OutputEncoding = Encoding.UTF8;
}
catch (Exception ex)
{
}
ConsoleColor prevColor = VanillaConsole.BackgroundColor;
ConsoleColor prevForeColor = VanillaConsole.ForegroundColor;
if (Data.Colors.colored_output)
{
VanillaConsole.BackgroundColor = color;
VanillaConsole.ForegroundColor = foregroundColor;
}
DateTime currentTime = DateTime.Now;
if (Data.Formatting.timestamp_prefix)
text = currentTime.ToString("[HH:mm:ss]") + text;
VanillaConsole.WriteLine(text + " ");
if (Data.Colors.colored_output)
{
VanillaConsole.BackgroundColor = prevColor;
VanillaConsole.ForegroundColor = prevForeColor;
}
}
public static void WriteLine(string text,
[CallerLineNumber] int lineNumber = 0,
[CallerMemberName] string caller = null)
{
ConfiguredWriteline(" " + Data.Formatting.writeline_char + " (" + lineNumber + "|" + caller + ") " + text,VanillaConsole.BackgroundColor, ConsoleColor.White);
}
public static void WriteLine(float text,
[CallerLineNumber] int lineNumber = 0,
[CallerMemberName] string caller = null)
{
ConfiguredWriteline(" " + Data.Formatting.writeline_char + " (" + lineNumber + "|" + caller + ") " + text,Data.Colors.float_color, ConsoleColor.White);
}
public static void WriteLine(double text,
[CallerLineNumber] int lineNumber = 0,
[CallerMemberName] string caller = null)
{
ConfiguredWriteline(" " + Data.Formatting.writeline_char + " (" + lineNumber + "|" + caller + ") " + text,Data.Colors.double_color, ConsoleColor.White);
}
public static void WriteLine(int text,
[CallerLineNumber] int lineNumber = 0,
[CallerMemberName] string caller = null)
{
ConfiguredWriteline(" " + Data.Formatting.writeline_char + " (" + lineNumber + "|" + caller + ") " + text,Data.Colors.int_color, ConsoleColor.White);
}
public static void Success(string text,
[CallerLineNumber] int lineNumber = 0,
[CallerMemberName] string caller = null)
{
ConfiguredWriteline(" " + Data.Formatting.success_char + " (" + lineNumber + "|" + caller + ") " + text, ConsoleColor.Green,
ConsoleColor.Black);
}
public static void Info(string text,
[CallerLineNumber] int lineNumber = 0,
[CallerMemberName] string caller = null)
{
ConfiguredWriteline(" " + Data.Formatting.info_char + " (" + lineNumber + "|" + caller + ") " + text, ConsoleColor.Blue,
ConsoleColor.Black);
}
public static void Error(string text,
[CallerLineNumber] int lineNumber = 0,
[CallerMemberName] string caller = null)
{
ConfiguredWriteline(" " + Data.Formatting.error_char + " (" + lineNumber + "|" + caller + ") " + text, ConsoleColor.DarkRed,
ConsoleColor.Black);
}
public static void Warning(string text,
[CallerLineNumber] int lineNumber = 0,
[CallerMemberName] string caller = null)
{
ConfiguredWriteline(" " + Data.Formatting.warning_char + " (" + lineNumber + "|" + caller + ") " + text, ConsoleColor.DarkYellow,
ConsoleColor.Black);
}
public static void WriteLine<T>(List<T> List, bool verbose = true)
{
ConfiguredWriteline("List contains " + typeof(T) + "(" + List.Count + ")", ConsoleColor.DarkMagenta,
ConsoleColor.Black);
if (!verbose)
return;
for (int i = 0; i < List.Count; i++)
{
if (i % 2 == 0)
{
ConfiguredWriteline("(" + i + "): " + List[i], ConsoleColor.DarkGray);
}
else
{
ConfiguredWriteline("(" + i + "): " + List[i], ConsoleColor.Black);
}
}
}
}
}

24
WeeXnes/Core/DataTypes.cs Normal file
View file

@ -0,0 +1,24 @@
using System;
namespace WeeXnes.Core
{
public class UpdateVar<T>
{
private T _value;
public Action ValueChanged;
public T Value
{
get => _value;
set
{
_value = value;
OnValueChanged();
}
}
protected virtual void OnValueChanged() => ValueChanged?.Invoke();
}
}

View file

@ -47,25 +47,7 @@ namespace EncryptionLib
}
return returnval;
}
public static string[] readFile(string filepath)
{
string[] lines = System.IO.File.ReadAllLines(filepath);
var listOfStrings = new List<string>();
foreach (string line in lines)
{
listOfStrings.Add(line);
}
string[] arrayOfStrings = listOfStrings.ToArray();
return arrayOfStrings;
}
public static void writeFile(string[] stringArray, string filepath)
{
for (int i = 0; i < stringArray.Length; i++)
{
Console.WriteLine(stringArray[i]);
}
File.WriteAllLines(filepath, stringArray, Encoding.UTF8);
}
public static string[] encryptArray(string hash, string[] arrayToEncrypt)
{
for (int i = 0; i < arrayToEncrypt.Length; i++)

50
WeeXnes/Core/Functions.cs Normal file
View file

@ -0,0 +1,50 @@
using System;
using System.Collections.Generic;
using System.IO;
using System.Text;
using System.Windows;
namespace WeeXnes.Core
{
public static class Functions
{
public static void CheckFolderAndCreate(string path)
{
try
{
if (!Directory.Exists(path))
Directory.CreateDirectory(path);
}
catch (Exception e)
{
MessageBox.Show(e.Message);
}
}
public static string[] readFile(string filepath)
{
string[] lines = System.IO.File.ReadAllLines(filepath);
var listOfStrings = new List<string>();
foreach (string line in lines)
{
listOfStrings.Add(line);
}
string[] arrayOfStrings = listOfStrings.ToArray();
return arrayOfStrings;
}
public static void writeFile(string[] stringArray, string filepath)
{
for (int i = 0; i < stringArray.Length; i++)
{
Console.WriteLine(stringArray[i]);
}
File.WriteAllLines(filepath, stringArray, Encoding.UTF8);
}
public static void ThrowTestException(Exception ex = null)
{
if (ex == null)
ex = new NotImplementedException();
throw ex;
}
}
}

36
WeeXnes/Core/Global.cs Normal file
View file

@ -0,0 +1,36 @@
using System;
using System.Collections.Generic;
using System.Diagnostics;
using System.IO;
using System.Windows.Forms;
namespace WeeXnes.Core
{
public class Information
{
public const string Version = "4.7";
public const string EncryptionHash = "8zf5#RdyQ]$4x4_";
public const string ApiUrl = "https://api.github.com/repos/weexnes/weexnessuite/releases/latest";
}
public class Global
{
public static PluginManager pluginManager = new PluginManager(Path.Combine(Environment.CurrentDirectory, "plugins"));
public static string AppDataPath = Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData), "WeeXnes");
public static UpdateVar<string> AppDataPathRPC = new UpdateVar<string>();
public static UpdateVar<string> AppDataPathKEY = new UpdateVar<string>();
public static UpdateVar<bool> checkUpdateOnStartup = new UpdateVar<bool>();
public static string SettingsFile = "settings.ini";
public class Defaults
{
public static string DefaultPathRPC = Path.Combine(AppDataPath, "RPC");
public static string DefaultPathKEY = Path.Combine(AppDataPath, "Keys");
public static string DefaultPathPlugins = Path.Combine(Environment.CurrentDirectory, "plugins");
}
public static void ForceClose()
{
System.Windows.Forms.Application.Restart();
Environment.Exit(0);
}
}
}

View file

@ -1,212 +0,0 @@
using WeeXnes.RPC;
using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
using Nocksoft.IO.ConfigFiles;
using MessageBox = System.Windows.MessageBox;
namespace WeeXnes.Core
{
internal class Globals
{
public static string encryptionKey = "8zf5#RdyQ]$4x4_";
public static string AppDataPath = Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData), "WeeXnes");
public static string SettingsFileName = "settings.ini";
public static string version = "3.7.0";
public static bool info_isRpcRunning = false;
public static bool info_RpcAutoStart;
public static string apiUrl = "https://api.github.com/repos/weexnes/weexnessuite/releases/latest";
public static UpdateVar<bool> settings_alwaysOnTop = new UpdateVar<bool>();
public static UpdateVar<bool> settings_osxStyleControlls = new UpdateVar<bool>();
public static UpdateVar<bool> settings_copySelectedToClipboard = new UpdateVar<bool>();
public static string settings_KeyManagerItemsPath_Default = AppDataPath + "\\" + "Keys";
public static UpdateVar<string> settings_KeyManagerItemsPath = new UpdateVar<string>();
public static UpdateVar<bool> settings_KeyManagerItemsPath_Bool = new UpdateVar<bool>();
public static UpdateVar<bool> settings_KeyManagerCensorKeys = new UpdateVar<bool>();
public static string settings_RpcItemsPath_Default = AppDataPath + "\\" + "RPC";
public static UpdateVar<string> settings_RpcItemsPath = new UpdateVar<string>();
public static UpdateVar<bool> settings_RpcItemsPath_Bool = new UpdateVar<bool>();
public static UpdateVar<bool> settings_RpcShowElapsedTime = new UpdateVar<bool>();
public static UpdateVar<string> settings_RpcDefaultClientID = new UpdateVar<string>();
public static UpdateVar<bool> settings_RpcAutoStart = new UpdateVar<bool>();
public static UpdateVar<string> searchbox_content = new UpdateVar<string>();
}
public static class SettingsManager
{
public static INIFile SettingsFile = new INIFile(
Globals.AppDataPath + "\\" + Globals.SettingsFileName,
true
);
public static void start()
{
loadSettings();
setEventListeners();
}
private static void loadSettings()
{
Globals.settings_alwaysOnTop.Value = Convert.ToBoolean(SettingsFile.GetValue("general", "alwaysOnTop"));
Globals.settings_copySelectedToClipboard.Value = Convert.ToBoolean(SettingsFile.GetValue("KeyManager", "copySelectedToClipboard"));
Globals.settings_KeyManagerItemsPath_Bool.Value = Convert.ToBoolean(SettingsFile.GetValue("KeyManager", "KeyManagerItemsPath_Bool"));
Globals.settings_KeyManagerCensorKeys.Value = Convert.ToBoolean(SettingsFile.GetValue("KeyManager", "CensorKeys"));
if (Globals.settings_KeyManagerItemsPath_Bool.Value)
{
Globals.settings_KeyManagerItemsPath.Value = SettingsFile.GetValue("KeyManager", "KeyManagerItemsPath");
}
else
{
Globals.settings_KeyManagerItemsPath.Value = Globals.settings_KeyManagerItemsPath_Default;
}
Globals.settings_osxStyleControlls.Value = Convert.ToBoolean(SettingsFile.GetValue("general", "OSXStyle"));
Globals.settings_RpcShowElapsedTime.Value = Convert.ToBoolean(SettingsFile.GetValue("rpc", "RpcShowElapsedTime"));
Globals.settings_RpcItemsPath_Bool.Value = Convert.ToBoolean(SettingsFile.GetValue("rpc", "RpcItemsPath_Bool"));
Globals.settings_RpcAutoStart.Value = Convert.ToBoolean(SettingsFile.GetValue("rpc", "RpcAutoStart"));
if (Globals.settings_RpcItemsPath_Bool.Value)
{
Globals.settings_RpcItemsPath.Value = SettingsFile.GetValue("rpc", "RpcItemsPath");
}
else
{
Globals.settings_RpcItemsPath.Value = Globals.settings_RpcItemsPath_Default;
}
Globals.settings_RpcDefaultClientID.Value = SettingsFile.GetValue("rpc", "RpcDefaultClientID");
if (String.IsNullOrEmpty(Globals.settings_RpcDefaultClientID.Value))
{
Globals.settings_RpcDefaultClientID.Value = "605116707035676701";
}
}
private static void setEventListeners()
{
Globals.settings_KeyManagerItemsPath_Bool.ValueChanged += () =>
{
if (Globals.settings_KeyManagerItemsPath_Bool.Value)
{
SettingsFile.SetValue("KeyManager", "KeyManagerItemsPath_Bool", "true");
}
else
{
SettingsFile.SetValue("KeyManager", "KeyManagerItemsPath_Bool", "false");
}
};
Globals.settings_KeyManagerItemsPath.ValueChanged += () =>
{
if (Globals.settings_KeyManagerItemsPath_Bool.Value)
{
SettingsFile.SetValue("KeyManager", "KeyManagerItemsPath", Globals.settings_KeyManagerItemsPath.Value);
}
else
{
SettingsFile.SetValue("KeyManager", "KeyManagerItemsPath", "");
}
};
Globals.settings_KeyManagerCensorKeys.ValueChanged += () =>
{
if (Globals.settings_KeyManagerCensorKeys.Value)
{
SettingsFile.SetValue("KeyManager", "CensorKeys", "true");
}
else
{
SettingsFile.SetValue("KeyManager", "CensorKeys", "false");
}
};
Globals.settings_osxStyleControlls.ValueChanged += () =>
{
SettingsFile.SetValue("general", "OSXStyle", Globals.settings_osxStyleControlls.Value.ToString());
};
Globals.settings_RpcItemsPath_Bool.ValueChanged += () =>
{
if (Globals.settings_RpcItemsPath_Bool.Value)
{
SettingsFile.SetValue("rpc", "RpcItemsPath_Bool", "true");
}
else
{
SettingsFile.SetValue("rpc", "RpcItemsPath_Bool", "false");
}
};
Globals.settings_RpcItemsPath.ValueChanged += () =>
{
if (Globals.settings_RpcItemsPath_Bool.Value)
{
SettingsFile.SetValue("rpc", "RpcItemsPath", Globals.settings_RpcItemsPath.Value);
}
else
{
SettingsFile.SetValue("rpc", "RpcItemsPath", "");
}
};
Globals.settings_alwaysOnTop.ValueChanged += () =>
{
SettingsFile.SetValue("general","alwaysOnTop",Convert.ToString(Globals.settings_alwaysOnTop.Value));
};
Globals.settings_copySelectedToClipboard.ValueChanged += () =>
{
SettingsFile.SetValue("KeyManager","copySelectedToClipboard",Convert.ToString(Globals.settings_copySelectedToClipboard.Value));
};
Globals.settings_RpcDefaultClientID.ValueChanged += () =>
{
SettingsFile.SetValue("rpc", "RpcDefaultClientID", Globals.settings_RpcDefaultClientID.Value);
};
Globals.settings_RpcShowElapsedTime.ValueChanged += () =>
{
SettingsFile.SetValue("rpc", "RpcShowElapsedTime", Convert.ToString(Globals.settings_RpcShowElapsedTime.Value));
};
Globals.settings_RpcAutoStart.ValueChanged += () =>
{
SettingsFile.SetValue("rpc","RpcAutoStart", Convert.ToString(Globals.settings_RpcAutoStart.Value));
};
}
}
public static class funcs
{
public static bool IsDirectoryEmpty(string path)
{
return !Directory.EnumerateFileSystemEntries(path).Any();
}
}
public class UpdateVar<T>
{
private T _value;
public Action ValueChanged;
public T Value
{
get => _value;
set
{
_value = value;
OnValueChanged();
}
}
protected virtual void OnValueChanged() => ValueChanged?.Invoke();
}
}

View file

@ -0,0 +1,40 @@
using System;
using System.Net;
using System.Runtime.InteropServices;
using System.Text;
using System.Windows;
namespace WeeXnes.Core
{
public class HandleLaunchArguments
{
public static class ArgumentStrings
{
public const string autostart = "-autostart";
public const string debugMode = "-debugMode";
}
public static class Data
{
public static bool Autostart = false;
}
private const int ATTACH_PARENT_PROCESS = -1;
[DllImport("kernel32.dll")]
private static extern bool AttachConsole(int dwProcessId);
public static void arg_autostart()
{
Data.Autostart = true;
}
public static void arg_debugMode()
{
App.DebugMode = true;
HandleLaunchArguments.arg_enableConsole();
//Allow untrusted certs in Debug mode
ServicePointManager.ServerCertificateValidationCallback +=
(sender, cert, chain, sslPolicyErrors) => true;
}
public static void arg_enableConsole()
{
AttachConsole(ATTACH_PARENT_PROCESS);
}
}
}

296
WeeXnes/Core/INIFile.cs Normal file
View file

@ -0,0 +1,296 @@
/**
* Copyright by Nocksoft
* https://www.nocksoft.de
* https://nocksoft.de/tutorials/visual-c-sharp-arbeiten-mit-ini-dateien/
* https://github.com/Nocksoft/INIFile.cs
* -----------------------------------
* Author: Rafael Nockmann @ Nocksoft
* Updated: 2022-01-09
* Version: 1.0.3
*
* Language: Visual C#
*
* License: MIT license
* License URL: https://github.com/Nocksoft/INIFile.cs/blob/master/LICENSE
*
* Description:
* Provides basic functions for working with INI files.
*
* ##############################################################################################
*/
using System;
using System.Collections.Generic;
using System.Linq;
using System.IO;
namespace Nocksoft.IO.ConfigFiles
{
public class INIFile
{
private string _File;
/// <summary>
/// Call the constructor creates a new object of the INIFile class to work with INI files.
/// </summary>
/// <param name="file">Name of INI file, which you want to access.</param>
/// <param name="createFile">Specifies whether the INI file should be created if it does not exist.</param>
public INIFile(string file, bool createFile = false)
{
if (createFile == true && File.Exists(file) == false)
{
FileInfo fileInfo = new FileInfo(file);
FileStream fileStream = fileInfo.Create();
fileStream.Close();
}
_File = file;
}
#region Public Methods
/// <summary>
/// Removes all comments and empty lines from a complete section and returns the sections.
/// This method is not case-sensitive.
/// The return value does not contain any spaces at the beginning or at the end of a line.
/// </summary>
/// <param name="section">Name of the requested section.</param>
/// <param name="includeComments">Specifies whether comments should also be returned.</param>
/// <returns>Returns the whole section.</returns>
public List<string> GetSection(string section, bool includeComments = false)
{
section = CheckSection(section);
List<string> completeSection = new List<string>();
bool sectionStart = false;
string[] fileArray = File.ReadAllLines(_File);
foreach (var item in fileArray)
{
if (item.Length <= 0) continue;
// Beginning of section.
if (item.Replace(" ", "").ToLower() == section)
{
sectionStart = true;
}
// Beginning of next section.
if (sectionStart == true && item.Replace(" ", "").ToLower() != section && item.Replace(" ", "").Substring(0, 1) == "[" && item.Replace(" ", "").Substring(item.Length - 1, 1) == "]")
{
break;
}
if (sectionStart == true)
{
// Add the entry to the List<string> completeSection, if it is not a comment or an empty entry.
if (includeComments == false
&& item.Replace(" ", "").Substring(0, 1) != ";" && !string.IsNullOrWhiteSpace(item))
{
completeSection.Add(ReplaceSpacesAtStartAndEnd(item));
}
if (includeComments == true && !string.IsNullOrWhiteSpace(item))
{
completeSection.Add(ReplaceSpacesAtStartAndEnd(item));
}
}
}
return completeSection;
}
/// <summary>
/// The method returns a value for the associated key.
/// This method is not case-sensitive.
/// </summary>
/// <param name="section">Name of the requested section.</param>
/// <param name="key">Name of the requested key.</param>
/// <param name="convertValueToLower">If "true" is passed, the value will be returned in lowercase letters.</param>
/// <returns>Returns the value for the specified key in the specified section, if available, otherwise null.</returns>
public string GetValue(string section, string key, bool convertValueToLower = false)
{
section = CheckSection(section);
key = key.ToLower();
List<string> completeSection = GetSection(section);
foreach (var item in completeSection)
{
// Continue if entry is no key.
if (!item.Contains("=") && item.Contains("[") && item.Contains("]")) continue;
string[] keyAndValue = item.Split(new string[] { "=" }, StringSplitOptions.RemoveEmptyEntries);
if (keyAndValue[0].ToLower() == key && keyAndValue.Count() > 1)
{
if (convertValueToLower == true)
{
keyAndValue[1] = keyAndValue[1].ToLower();
}
return keyAndValue[1];
}
}
return null;
}
/// <summary>
/// Set or add a value of the associated key in the specified section.
/// This method is not case-sensitive.
/// </summary>
/// <param name="section">Name of the section.</param>
/// <param name="key">Name of the key.</param>
/// <param name="value">Value to save.</param>
/// <param name="convertValueToLower">If "true" is passed, the value will be saved in lowercase letters.</param>
public void SetValue(string section, string key, string value, bool convertValueToLower = false)
{
section = CheckSection(section, false);
string sectionToLower = section.ToLower();
bool sectionFound = false;
List<string> iniFileContent = new List<string>();
string[] fileLines = File.ReadAllLines(_File);
// Creates a new INI file if none exists.
if (fileLines.Length <= 0)
{
iniFileContent = AddSection(iniFileContent, section, key, value, convertValueToLower);
WriteFile(iniFileContent);
return;
}
for (int i = 0; i < fileLines.Length; i++)
{
// Possibility 1: The desired section has not (yet) been found.
if (fileLines[i].Replace(" ", "").ToLower() != sectionToLower)
{
iniFileContent.Add(fileLines[i]);
// If a section does not exist, the section will be created.
if (i == fileLines.Length - 1 && fileLines[i].Replace(" ", "").ToLower() != sectionToLower && sectionFound == false)
{
iniFileContent.Add(null);
iniFileContent = AddSection(iniFileContent, section, key, value, convertValueToLower);
break;
}
continue;
}
// Possibility 2 -> Desired section was found.
sectionFound = true;
// Get the complete section in which the target key may be.
List<string> targetSection = GetSection(sectionToLower, true);
for (int x = 0; x < targetSection.Count; x++)
{
string[] targetKey = targetSection[x].Split(new string[] { "=" }, StringSplitOptions.None);
// When the target key is found.
if (targetKey[0].ToLower() == key.ToLower())
{
if (convertValueToLower == true)
{
iniFileContent.Add(key + "=" + value.ToLower());
}
else
{
iniFileContent.Add(key + "=" + value);
}
i = i + x;
break;
}
else
{
iniFileContent.Add(targetSection[x]);
// If the target key is not found, it will be created.
if (x == targetSection.Count - 1 && targetKey[0].ToLower() != key.ToLower())
{
if (convertValueToLower == true)
{
iniFileContent.Add(key + "=" + value.ToLower());
}
else
{
iniFileContent.Add(key + "=" + value);
}
i = i + x;
break;
}
}
}
}
WriteFile(iniFileContent);
}
#endregion
#region Private Methods
/// <summary>
/// Ensures that a section is always in the following format: [section].
/// </summary>
/// <param name="section">Section to be checked for correct format.</param>
/// <param name="convertToLower">Specifies whether the section should be vonverted in lower case letters.</param>
/// <returns>Returns section in this form: [section].</returns>
private string CheckSection(string section, bool convertToLower = true)
{
if (convertToLower == true)
{
section = section.ToLower();
}
if (!section.StartsWith("[") && !section.EndsWith("]"))
{
section = "[" + section + "]";
}
return section;
}
/// <summary>
/// Removes leading and trailing spaces from sections, keys and values.
/// </summary>
/// <param name="item">String to be trimmed.</param>
/// <returns>Returns the trimmed string.</returns>
private string ReplaceSpacesAtStartAndEnd(string item)
{
// If the string has a key and a value.
if (item.Contains("=") && !item.Contains("[") && !item.Contains("]"))
{
string[] keyAndValue = item.Split(new string[] { "=" }, StringSplitOptions.None);
return keyAndValue[0].Trim() + "=" + keyAndValue[1].Trim();
}
return item.Trim();
}
/// <summary>
/// Adds a new section with key value pair.
/// </summary>
/// <param name="iniFileContent">List iniFileContent from SetValue.</param>
/// <param name="section">Section to be created.</param>
/// <param name="key">Key to be added.</param>
/// <param name="value">Value to be added.</param>
/// <param name="convertValueToLower">Specifies whether the key and value should be saved in lower case letters.</param>
/// <returns>Returns the new created section with key value pair.</returns>
private List<string> AddSection(List<string> iniFileContent, string section, string key, string value, bool convertValueToLower)
{
if (convertValueToLower == true)
{
value = value.ToLower();
}
iniFileContent.Add(section);
iniFileContent.Add($"{key}={value}");
return iniFileContent;
}
private void WriteFile(List<string> content)
{
StreamWriter writer = new StreamWriter(_File);
foreach (var item in content)
{
writer.WriteLine(item);
}
writer.Close();
}
#endregion
}
}

144
WeeXnes/Core/LoginLib.cs Normal file
View file

@ -0,0 +1,144 @@
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Net.Http;
using Newtonsoft.Json;
using WeeXnes.Views.ProfileView;
using WeeXnes.Views.Settings;
using Wpf.Ui.Appearance;
using Wpf.Ui.Controls;
namespace WeeXnes.Core
{
public class Auth
{
public BackgroundWorker _loginWorker { get; set; }
public UpdateVar<dynamic> _currentUserCache { get; private set; } = new UpdateVar<dynamic>();
private string _token { get; set; }
private string _userDataUrl { get; set; }
private string _loginUrl { get; set; }
public string _email { get; set; }
public string _password { private get; set; }
public UpdateVar<Exception> ExceptionCache { get; private set; } = new UpdateVar<Exception>();
public Auth(string loginUrl, string userDataUrl)
{
this._currentUserCache.Value = null;
this._loginWorker = new BackgroundWorker();
this._loginWorker.WorkerReportsProgress = true;
this._loginWorker.WorkerSupportsCancellation = true;
this._loginWorker.DoWork += (sender, args) =>
{
try
{
Login(this._email, this._password);
GetUserData();
}
catch (Exception ex)
{
Console.Error(ex.ToString());
this.ExceptionCache.Value = ex;
}
};
this._loginWorker.RunWorkerCompleted += LoginWorkerOnRunWorkerCompleted;
this._loginUrl = loginUrl;
this._userDataUrl = userDataUrl;
}
private void LoginWorkerOnRunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
{
Console.WriteLine("LoginWorker complete");
}
public string Login(string email, string password)
{
if (String.IsNullOrEmpty(email))
throw new NullReferenceException();
if (String.IsNullOrEmpty(password))
throw new NullReferenceException();
using (HttpClient client = new HttpClient())
{
var postData = new Dictionary<string, string>
{
{ "email", email },
{ "password", password }
};
var content = new FormUrlEncodedContent(postData);
HttpResponseMessage response = client.PostAsync(_loginUrl, content).Result;
if (response.IsSuccessStatusCode)
{
string responseData = response.Content.ReadAsStringAsync().Result;
dynamic jsonData = Newtonsoft.Json.JsonConvert.DeserializeObject(responseData);
string token = jsonData.token;
_token = token;
return token;
//Console.WriteLine($"Token: {token}");
}
else
{
Console.Error("Error: " + response.StatusCode);
LoginView.errorStringCache.Value = response.StatusCode.ToString();
return null;
}
}
}
public dynamic GetUserData(string token = null)
{
if(String.IsNullOrEmpty(token))
if (String.IsNullOrEmpty(_token))
{
return null;
}
else
{
token = _token;
}
// Create an instance of HttpClient
using (HttpClient client = new HttpClient())
{
// Add the token to the request headers
client.DefaultRequestHeaders.Add("token", token);
// Send the GET request
HttpResponseMessage response = client.GetAsync(_userDataUrl).Result;
// Check if the request was successful (status code 200)
if (response.IsSuccessStatusCode)
{
// Read the response content as a string
string responseData = response.Content.ReadAsStringAsync().Result;
//Console.WriteLine(responseData);
// Parse the JSON data into a dynamic object
dynamic user = JsonConvert.DeserializeObject(responseData);
user = user.user;
// Now you can access the user object properties dynamically
Console.WriteLine("authenticated user: " + user.name);
//Console.WriteLine($"Email: {user.email}");
// Access other properties as needed
_currentUserCache.Value = user;
LoginView.alreadyLoggedIn = true;
return user;
}
else
{
// Handle the error, e.g., print the status code
_currentUserCache.Value = null;
Console.Error("Error: " + response.StatusCode);
LoginView.errorStringCache.Value = response.StatusCode.ToString();
return null;
}
}
}
}
}

View file

@ -1,19 +0,0 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.ComponentModel;
using System.Runtime.CompilerServices;
namespace WeeXnes.Core
{
internal class ObservableObject : INotifyPropertyChanged
{
public event PropertyChangedEventHandler PropertyChanged;
protected void OnPropertyChanged([CallerMemberName] string name = null)
{
PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(name));
}
}
}

View file

@ -0,0 +1,51 @@
using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Reflection;
using WXPlugin.PluginCore;
namespace WeeXnes.Core;
public class PluginManager
{
private HashSet<String> Directories = new HashSet<String>();
public HashSet<IPluginBase> CurrentPlugins { get; set; } = new HashSet<IPluginBase>();
public PluginManager(String pluginPath)
{
Console.WriteLine("Plugin Manager Initialized");
Directories.Add(pluginPath);
}
public void LoadPlugins()
{
Console.WriteLine("Plugin Manager Loading Plugins");
CurrentPlugins = new HashSet<IPluginBase>();
foreach (var dir in Directories)
{
DirectoryInfo dirInfo = new DirectoryInfo(dir);
foreach (var file in dirInfo.GetFiles("*.dll"))
{
Assembly asm = Assembly.LoadFrom(file.FullName);
foreach (Type type in asm.GetTypes())
{
if (type.IsSubclassOf(typeof(IPluginBase)) || type.GetInterfaces().Contains(typeof(IPluginBase)) && type.IsAbstract == false)
{
IPluginBase newPlugin = type.InvokeMember(
null,
BindingFlags.CreateInstance,
null,
null,
null)
as IPluginBase;
Console.WriteLine("Loaded: " + newPlugin.Name);
Console.WriteLine(newPlugin.UiPage.Content.ToString());
CurrentPlugins.Add(newPlugin);
}
}
}
}
}
}

View file

@ -1,30 +0,0 @@
using System;
using System.Windows.Input;
namespace WeeXnes.Core
{
internal class RelayCommand : ICommand
{
private Action<object> _execute;
private Func<object, bool> _canExecute;
public event EventHandler CanExecuteChanged
{
add { CommandManager.RequerySuggested += value; }
remove { CommandManager.RequerySuggested -= value;}
}
public RelayCommand(Action<object> execute, Func<object, bool> canExecute = null)
{
_execute = execute;
_canExecute = canExecute;
}
public bool CanExecute(object parameter)
{
return _canExecute == null || _canExecute(parameter);
}
public void Execute(object parameter)
{
_execute(parameter);
}
}
}

View file

@ -1,11 +1,4 @@
using System;
using System.Diagnostics;
using System.IO;
using System.Net;
using System.Threading.Tasks;
using System.Windows;
namespace WeeXnes.Core
namespace WeeXnes.Core
{
public enum EventType
{

View file

@ -0,0 +1,101 @@
using System;
using System.Collections.Specialized;
using System.Net.Mime;
using System.Runtime.CompilerServices;
using System.Windows;
using WeeXnes.Views.KeyManager;
using WeeXnes.Views.Settings;
namespace WeeXnes.Core
{
public static class SaveSettingsHandler
{
public static class Data
{
//Layout-Names for INIFiles
public static class General
{
public const string Section = "GENERAL";
public const string RpcFilesPath = "RpcFilesPath";
public const string KeyFilesPath = "KeyFilesPath";
public const string StartupUpdateCheck = "StartupUpdateCheck";
}
public static class KeyManager
{
public const string Section = "KEY_MANAGER";
public const string CensorKeys = "CensorKeys";
public const string CopyOnSelect = "CopyOnSelect";
public const string SortList = "SortList";
}
public static class DiscordRpcFiles
{
public const string Section = "CONFIG";
public const string ProcessName = "ProcessName";
public const string ClientId = "ClientID";
public const string State = "State";
public const string Details = "Details";
public const string BigImageKey = "BigImageKey";
public const string BigImageText = "BigImageText";
public const string SmallImageKey = "SmallImageKey";
public const string SmallImageText = "SmallImageText";
public const string UUID = "UUID";
}
}
public static void SetupSaveEvents()
{
KeyManagerView.Data.censorKeys.ValueChanged += () =>
{
SettingsView.Data.settingsFile.SetValue(
Data.KeyManager.Section,
Data.KeyManager.CensorKeys,
KeyManagerView.Data.censorKeys.Value.ToString()
);
};
KeyManagerView.Data.copyOnSelect.ValueChanged += () =>
{
SettingsView.Data.settingsFile.SetValue(
Data.KeyManager.Section,
Data.KeyManager.CopyOnSelect,
KeyManagerView.Data.copyOnSelect.Value.ToString()
);
};
KeyManagerView.Data.sortList.ValueChanged += () =>
{
SettingsView.Data.settingsFile.SetValue(
Data.KeyManager.Section,
Data.KeyManager.SortList,
KeyManagerView.Data.sortList.Value.ToString()
);
};
Global.AppDataPathRPC.ValueChanged += () =>
{
SettingsView.Data.settingsFile.SetValue(
Data.General.Section,
Data.General.RpcFilesPath,
Global.AppDataPathRPC.Value
);
};
Global.AppDataPathKEY.ValueChanged += () =>
{
SettingsView.Data.settingsFile.SetValue(
Data.General.Section,
Data.General.KeyFilesPath,
Global.AppDataPathKEY.Value
);
};
Global.checkUpdateOnStartup.ValueChanged += () =>
{
SettingsView.Data.settingsFile.SetValue(
Data.General.Section,
Data.General.StartupUpdateCheck,
Global.checkUpdateOnStartup.Value.ToString()
);
};
}
}
}

99
WeeXnes/Core/WXFile.cs Normal file
View file

@ -0,0 +1,99 @@
using System;
using System.Collections.Generic;
using WeeXnes.Views.KeyManager;
namespace WeeXnes.Core
{
public class WXFile
{
private const string FileIdentifier = "##WXfile##";
public string path
{
get;
set;
}
public WXFile(string _path)
{
this.path = _path;
}
public string GetName()
{
string returnval = null;
string[] rawcontent = Methods.ReadFile(this.path);
if (Methods.Verify(rawcontent))
{
try
{
returnval = rawcontent[1];
}
catch (Exception e)
{
Console.WriteLine(e.ToString());
returnval = null;
}
}
return returnval;
}
public string GetValue()
{
string returnval = null;
string[] rawcontent = Methods.ReadFile(this.path);
if (Methods.Verify(rawcontent))
{
try
{
returnval = rawcontent[2];
}catch (Exception e)
{
Console.WriteLine(e.ToString());
returnval = null;
}
}
return returnval;
}
public static class Methods
{
public static void WriteFile(KeyItem keyItem, WXFile wxFile)
{
string[] fileContent = new string[]
{
"##WXfile##",
keyItem.Name,
EncryptionLib.EncryptorLibary.encrypt(
Information.EncryptionHash,
keyItem.Value
)
};
Functions.writeFile(fileContent, wxFile.path);
}
public static string[] ReadFile(string filepath)
{
string[] lines = System.IO.File.ReadAllLines(filepath);
var listOfStrings = new List<string>();
foreach (string line in lines)
{
listOfStrings.Add(line);
}
string[] arrayOfStrings = listOfStrings.ToArray();
return arrayOfStrings;
}
public static bool Verify(string[] content)
{
bool integ = false;
if(content != null)
{
if(content[0] == FileIdentifier)
{
integ = true;
}
}
return integ;
}
}
}
}

Binary file not shown.

Binary file not shown.

Before

Width:  |  Height:  |  Size: 26 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 13 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 20 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 4 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 6.8 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 7.5 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 6.8 KiB

View file

@ -1,19 +0,0 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace WeeXnes.Keys
{
public class KeyItem
{
public string name { get; set; }
public string value { get; set; }
public KeyItem(string _name, string _value)
{
this.name = _name;
this.value = _value;
}
}
}

View file

@ -1,13 +0,0 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace WeeXnes.Keys
{
public class KeyManagerLib
{
public static List<KeyItem> KeyList = new List<KeyItem>();
}
}

View file

@ -1,420 +0,0 @@
<UserControl x:Class="WeeXnes.MVVM.View.DiscordRpcView"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:local="clr-namespace:WeeXnes.MVVM.View"
mc:Ignorable="d"
d:DesignHeight="450" d:DesignWidth="800"
Unloaded="UserControl_Unloaded">
<Grid>
<Grid>
<Grid.RowDefinitions>
<RowDefinition Height="340"/>
<RowDefinition/>
</Grid.RowDefinitions>
<Grid HorizontalAlignment="Center">
<Grid.ColumnDefinitions>
<ColumnDefinition Width="220"/>
<ColumnDefinition/>
</Grid.ColumnDefinitions>
<Border
CornerRadius="4"
Height="300"
VerticalAlignment="Top">
<Border.Background>
<LinearGradientBrush StartPoint="0 0" EndPoint="1 1">
<LinearGradientBrush.GradientStops>
<GradientStop Offset="0.2" Color="#212329" />
<GradientStop Offset="1" Color="#202127" />
</LinearGradientBrush.GradientStops>
</LinearGradientBrush>
</Border.Background>
<ListBox Height="300"
VerticalAlignment="Top"
Background="Transparent"
BorderThickness="0"
Name="RpcItemList"
Foreground="White"
SelectionChanged="RpcItemList_SelectionChanged"
MouseDoubleClick="RpcItemList_MouseDoubleClick"/>
</Border>
<TextBox Grid.Column="1"
Style="{StaticResource MaterialTextBox}"
Height="33"
Width="450"
HorizontalAlignment="Left"
VerticalAlignment="Top"
Margin="20,20,0,0"
Name="tb_FormName"
Background="#212329"
Tag="Name (for List)"/>
<TextBox Grid.Column="1"
Style="{StaticResource MaterialTextBox}"
Height="33"
Width="450"
HorizontalAlignment="Left"
VerticalAlignment="Top"
Margin="20,60,0,0"
Name="tb_FormPName"
Background="#212329"
Tag="Process Name (without .exe)"/>
<TextBox Grid.Column="1"
Style="{StaticResource MaterialTextBox}"
Height="33"
Width="450"
HorizontalAlignment="Left"
VerticalAlignment="Top"
Margin="20,100,0,0"
Name="tb_FormClient"
Background="#212329"
Tag="ClientID"/>
<TextBox Grid.Column="1"
Style="{StaticResource MaterialTextBox}"
Height="33"
Width="450"
HorizontalAlignment="Left"
VerticalAlignment="Top"
Margin="20,180,0,0"
Name="tb_FormState"
Background="#212329"
Tag="State"/>
<TextBox Grid.Column="1"
Style="{StaticResource MaterialTextBox}"
Height="33"
Width="450"
HorizontalAlignment="Left"
VerticalAlignment="Top"
Margin="20,140,0,0"
Name="tb_FormDetails"
Background="#212329"
Tag="Details"/>
<TextBox Grid.Column="1"
Style="{StaticResource MaterialTextBox}"
Height="33"
Width="220"
HorizontalAlignment="Left"
VerticalAlignment="Top"
Margin="20,220,0,0"
Name="tb_FormLargeImgKey"
Background="#212329"
Tag="Large Image Key"/>
<TextBox Grid.Column="1"
Style="{StaticResource MaterialTextBox}"
Height="33"
Width="220"
HorizontalAlignment="Left"
VerticalAlignment="Top"
Margin="250,220,0,0"
Name="tb_FormLargeImgTxt"
Background="#212329"
Tag="Large Image Text"/>
<TextBox Grid.Column="1"
Style="{StaticResource MaterialTextBox}"
Height="33"
Width="220"
HorizontalAlignment="Left"
VerticalAlignment="Top"
Margin="20,260,0,0"
Name="tb_FormSmallImgKey"
Background="#212329"
Tag="Small Image Key"/>
<TextBox Grid.Column="1"
Style="{StaticResource MaterialTextBox}"
Height="33"
Width="220"
HorizontalAlignment="Left"
VerticalAlignment="Top"
Margin="250,260,0,0"
Name="tb_FormSmallImgTxt"
Background="#212329"
Tag="Small Image Text"/>
<Button Height="30"
Width="450"
Style="{StaticResource UniversalMaterialButton}"
Name="DiscordRpcSave"
Click="DiscordRpcSave_Click"
VerticalAlignment="Bottom"
HorizontalAlignment="Left"
Grid.Column="1"
Margin="20,0,0,5"
Foreground="DarkGray"
Background="#212329"
Content="Save"
Cursor="Hand">
<Button.Triggers>
<!-- Animate the button's Width property. -->
<EventTrigger RoutedEvent="Button.MouseEnter">
<BeginStoryboard>
<Storyboard>
<ColorAnimation
Storyboard.TargetProperty="(Button.Background).(SolidColorBrush.Color)"
To="DarkGray" Duration="0:0:00.1" AutoReverse="False"
/>
<ColorAnimation
Storyboard.TargetProperty="(Button.Foreground).(SolidColorBrush.Color)"
To="#212329" Duration="0:0:00.1" AutoReverse="False"
/>
</Storyboard>
</BeginStoryboard>
</EventTrigger>
<EventTrigger RoutedEvent="Button.MouseLeave">
<BeginStoryboard>
<Storyboard>
<ColorAnimation
Storyboard.TargetProperty="(Button.Background).(SolidColorBrush.Color)"
To="#212329" Duration="0:0:00.1" AutoReverse="False"
/>
<ColorAnimation
Storyboard.TargetProperty="(Button.Foreground).(SolidColorBrush.Color)"
To="DarkGray" Duration="0:0:00.1" AutoReverse="False"
/>
</Storyboard>
</BeginStoryboard>
</EventTrigger>
</Button.Triggers>
</Button>
<StackPanel Grid.Column="0" Orientation="Horizontal" HorizontalAlignment="Center">
<Button Height="30"
Width="65"
Style="{StaticResource UniversalMaterialButton}"
Name="DiscordRpcStart"
Click="DiscordRpcStart_Click"
VerticalAlignment="Bottom"
HorizontalAlignment="Left"
Margin="0,0,5,5"
Foreground="DarkGray"
Background="#212329"
Content="Start"
Cursor="Hand">
<Button.Triggers>
<!-- Animate the button's Width property. -->
<EventTrigger RoutedEvent="Button.MouseEnter">
<BeginStoryboard>
<Storyboard>
<ColorAnimation
Storyboard.TargetProperty="(Button.Background).(SolidColorBrush.Color)"
To="DarkGray" Duration="0:0:00.1" AutoReverse="False"
/>
<ColorAnimation
Storyboard.TargetProperty="(Button.Foreground).(SolidColorBrush.Color)"
To="#212329" Duration="0:0:00.1" AutoReverse="False"
/>
</Storyboard>
</BeginStoryboard>
</EventTrigger>
<EventTrigger RoutedEvent="Button.MouseLeave">
<BeginStoryboard>
<Storyboard>
<ColorAnimation
Storyboard.TargetProperty="(Button.Background).(SolidColorBrush.Color)"
To="#212329" Duration="0:0:00.1" AutoReverse="False"
/>
<ColorAnimation
Storyboard.TargetProperty="(Button.Foreground).(SolidColorBrush.Color)"
To="DarkGray" Duration="0:0:00.1" AutoReverse="False"
/>
</Storyboard>
</BeginStoryboard>
</EventTrigger>
</Button.Triggers>
</Button>
<Button Height="30"
Width="65"
Style="{StaticResource UniversalMaterialButton}"
Name="DiscordRpcStop"
Click="DiscordRpcStop_Click"
VerticalAlignment="Bottom"
HorizontalAlignment="Left"
Margin="5,0,5,5"
Foreground="DarkGray"
Background="#212329"
Content="Stop"
Cursor="Hand">
<Button.Triggers>
<!-- Animate the button's Width property. -->
<EventTrigger RoutedEvent="Button.MouseEnter">
<BeginStoryboard>
<Storyboard>
<ColorAnimation
Storyboard.TargetProperty="(Button.Background).(SolidColorBrush.Color)"
To="DarkGray" Duration="0:0:00.1" AutoReverse="False"
/>
<ColorAnimation
Storyboard.TargetProperty="(Button.Foreground).(SolidColorBrush.Color)"
To="#212329" Duration="0:0:00.1" AutoReverse="False"
/>
</Storyboard>
</BeginStoryboard>
</EventTrigger>
<EventTrigger RoutedEvent="Button.MouseLeave">
<BeginStoryboard>
<Storyboard>
<ColorAnimation
Storyboard.TargetProperty="(Button.Background).(SolidColorBrush.Color)"
To="#212329" Duration="0:0:00.1" AutoReverse="False"
/>
<ColorAnimation
Storyboard.TargetProperty="(Button.Foreground).(SolidColorBrush.Color)"
To="DarkGray" Duration="0:0:00.1" AutoReverse="False"
/>
</Storyboard>
</BeginStoryboard>
</EventTrigger>
</Button.Triggers>
</Button>
<Button Height="30"
Width="65"
Style="{StaticResource UniversalMaterialButton}"
Name="DiscordRpcNew"
Click="DiscordRpcNew_Click"
VerticalAlignment="Bottom"
HorizontalAlignment="Left"
Margin="5,0,0,5"
Foreground="DarkGray"
Background="#212329"
Content="New"
Cursor="Hand">
<Button.Triggers>
<!-- Animate the button's Width property. -->
<EventTrigger RoutedEvent="Button.MouseEnter">
<BeginStoryboard>
<Storyboard>
<ColorAnimation
Storyboard.TargetProperty="(Button.Background).(SolidColorBrush.Color)"
To="DarkGray" Duration="0:0:00.1" AutoReverse="False"
/>
<ColorAnimation
Storyboard.TargetProperty="(Button.Foreground).(SolidColorBrush.Color)"
To="#212329" Duration="0:0:00.1" AutoReverse="False"
/>
</Storyboard>
</BeginStoryboard>
</EventTrigger>
<EventTrigger RoutedEvent="Button.MouseLeave">
<BeginStoryboard>
<Storyboard>
<ColorAnimation
Storyboard.TargetProperty="(Button.Background).(SolidColorBrush.Color)"
To="#212329" Duration="0:0:00.1" AutoReverse="False"
/>
<ColorAnimation
Storyboard.TargetProperty="(Button.Foreground).(SolidColorBrush.Color)"
To="DarkGray" Duration="0:0:00.1" AutoReverse="False"
/>
</Storyboard>
</BeginStoryboard>
</EventTrigger>
</Button.Triggers>
</Button>
</StackPanel>
</Grid>
<Border Grid.Row="1"
CornerRadius="4">
<Border.Background>
<LinearGradientBrush StartPoint="0 0" EndPoint="1 1">
<LinearGradientBrush.GradientStops>
<GradientStop Offset="0.2" Color="#212329" />
<GradientStop Offset="1" Color="#1b1c21" />
</LinearGradientBrush.GradientStops>
</LinearGradientBrush>
</Border.Background>
<ScrollViewer Grid.Column="0" Background="Transparent" VerticalScrollBarVisibility="Hidden" Foreground="White"
Padding="5,5,5,5" Name="LogViewer">
<StackPanel>
<StackPanel>
<ItemsControl x:Name="ListViewVersions" ItemsSource="{Binding version}" Loaded="ListViewVersions_OnLoaded"
>
<ItemsControl.ItemTemplate>
<DataTemplate>
<StackPanel Orientation="Vertical">
<Border Height="30" CornerRadius="4" Margin="0,3,0,0" Name="ParentBorder"
Opacity="0">
<Border.Triggers>
<!-- Animate the button's Width property. -->
<EventTrigger RoutedEvent="Border.Loaded">
<BeginStoryboard>
<Storyboard>
<DoubleAnimation
Storyboard.TargetName="ParentBorder"
Storyboard.TargetProperty="(Border.Opacity)"
To="1" Duration="0:0:00.5" AutoReverse="False"
/>
</Storyboard>
</BeginStoryboard>
</EventTrigger>
</Border.Triggers>
<Border.Background>
<LinearGradientBrush StartPoint="0 0" EndPoint="1 1">
<LinearGradientBrush.GradientStops>
<GradientStop Offset="0" Color="{Binding GradientColor1}" />
<GradientStop Offset="1" Color="{Binding GradientColor2}" />
</LinearGradientBrush.GradientStops>
</LinearGradientBrush>
</Border.Background>
<TextBlock Margin="5 0" Text="{Binding Content}" FontSize="12"
Foreground="White"
HorizontalAlignment="Left"
VerticalAlignment="Center"
Padding="10,0,0,0">
<TextBlock.Effect>
<DropShadowEffect ShadowDepth="1"/>
</TextBlock.Effect>
</TextBlock>
</Border>
</StackPanel>
</DataTemplate>
</ItemsControl.ItemTemplate>
<ItemsControl.ItemsPanel>
<ItemsPanelTemplate>
<UniformGrid Columns="1"/>
</ItemsPanelTemplate>
</ItemsControl.ItemsPanel>
</ItemsControl>
</StackPanel>
</StackPanel>
</ScrollViewer>
</Border>
</Grid>
</Grid>
</UserControl>

View file

@ -1,321 +0,0 @@
using Nocksoft.IO.ConfigFiles;
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Diagnostics;
using System.IO;
using System.Linq;
using System.Runtime.CompilerServices;
using System.Text;
using System.Threading;
using System.Threading.Tasks;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Data;
using System.Windows.Documents;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Imaging;
using System.Windows.Navigation;
using System.Windows.Shapes;
using WeeXnes.Core;
using WeeXnes.RPC;
namespace WeeXnes.MVVM.View
{
/// <summary>
/// Interaktionslogik für DiscordRpcView.xaml
/// </summary>
public partial class DiscordRpcView : UserControl
{
public List<customEvent> events = new List<customEvent>();
//static bool shouldBeRunning = false;
BackgroundWorker backgroundWorker = new BackgroundWorker();
List<Game> Games = new List<Game>();
Game lastSelectedGame = null;
public static customEvent logContent = null;
public static UpdateVar<string> triggerLogupdate = new UpdateVar<string>();
public DiscordRpcView()
{
CheckFolders();
InitializeComponent();
triggerLogupdate.ValueChanged += () =>
{
if(logContent != null)
{
writeLog(logContent);
}
};
InitializeSettings();
CheckForAutostart();
}
public void CheckFolders()
{
if (!Globals.settings_RpcItemsPath_Bool.Value)
{
Globals.settings_RpcItemsPath.Value = Globals.settings_RpcItemsPath_Default;
}
if (!Directory.Exists(Globals.settings_RpcItemsPath.Value))
{
Directory.CreateDirectory(Globals.settings_RpcItemsPath.Value);
Console.WriteLine("Created settings_RpcItemsPath");
}
}
private void CheckForAutostart()
{
if (Globals.info_RpcAutoStart)
{
Globals.info_RpcAutoStart = false;
runBackgroundWorker();
}
}
private void InitializeSettings()
{
backgroundWorker.WorkerReportsProgress = true;
backgroundWorker.WorkerSupportsCancellation = true;
backgroundWorker.RunWorkerCompleted += BackgroundWorker_RunWorkerCompleted;
backgroundWorker.DoWork += BackgroundWorker_DoWork;
Refresh();
}
public void writeLog(customEvent _content, bool _timestamp = true)
{
string timestamp = DateTime.Now.ToString("HH:mm:ss");
this.Dispatcher.Invoke(() =>
{
ListViewVersions.Items.Add(_content);
LogViewer.ScrollToEnd();
});
}
private void BackgroundWorker_DoWork(object sender, DoWorkEventArgs e)
{
Globals.info_isRpcRunning = true;
writeLog(new customEvent("Thread Started", EventType.ProcessStartedEvent));
bool runWorker = true;
int delay = 2000;
while (runWorker)
{
if (backgroundWorker.CancellationPending)
{
runWorker = false;
delay = 0;
foreach (Game game in Games)
{
game.stop();
}
}
Process[] processes = Process.GetProcesses();
foreach (Game game in Games)
{
game.checkState(processes);
}
Thread.Sleep(delay);
}
}
private void BackgroundWorker_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
{
Globals.info_isRpcRunning = false;
foreach(Game game in Games)
{
game.isRunning = false;
}
writeLog(new customEvent("Thread Closed",EventType.ProcessStoppedEvent));
}
public void runBackgroundWorker()
{
try
{
backgroundWorker.RunWorkerAsync();
}
catch (Exception e)
{
Misc.Message message = new Misc.Message(e.ToString());
message.Show();
}
}
public void stopBackgroundWorker()
{
try
{
backgroundWorker.CancelAsync();
}
catch (Exception e)
{
Misc.Message message = new Misc.Message(e.ToString());
message.Show();
}
}
public void Refresh()
{
readRpcFileDirectory();
LoadGamesIntoListBox();
}
public void generateNewGame()
{
string filename = Guid.NewGuid().ToString() + ".rpc";
Game newGame = new Game(filename, generateIncrementalName(), null, Globals.settings_RpcDefaultClientID.Value);
saveGameToFile(newGame);
}
public string generateIncrementalName()
{
Random random = new Random();
int randomInt = random.Next(1000);
return "New Game " + randomInt;
}
public void saveGameToFile(Game game)
{
INIFile rpcFile = new INIFile(Globals.settings_RpcItemsPath.Value + "\\" + game.fileName, true);
rpcFile.SetValue("config", "name", game.Name);
rpcFile.SetValue("config", "pname", game.ProcessName);
rpcFile.SetValue("config", "id", game.id);
rpcFile.SetValue("config", "state", game.state);
rpcFile.SetValue("config", "details", game.details);
rpcFile.SetValue("config", "BigImgKey", game.bigimgkey);
rpcFile.SetValue("config", "SmallImgKey", game.smallimgkey);
rpcFile.SetValue("config", "BigImgText", game.bigimgtext);
rpcFile.SetValue("config", "SmallImgText", game.smallimgtext);
rpcFile.SetValue("config", "FileName", game.fileName);
}
public void deleteGameFile(Game game)
{
try
{
File.Delete(Globals.settings_RpcItemsPath.Value + "\\" + game.fileName);
}
catch (Exception e)
{
Misc.Message message = new Misc.Message(e.ToString());
message.Show();
}
}
public void readRpcFileDirectory()
{
bool Empty = funcs.IsDirectoryEmpty(Globals.settings_RpcItemsPath.Value);
List<Game> readGames = new List<Game>();
if (!Empty)
{
Console.WriteLine("RpcDir is not Empty, Reading content");
string[] files = Directory.GetFiles(Globals.settings_RpcItemsPath.Value, "*.rpc", SearchOption.AllDirectories);
foreach (string file in files)
{
INIFile rpcFile = new INIFile(file);
string Name = rpcFile.GetValue("config", "name");
string ProcessName = rpcFile.GetValue("config", "pname");
string id = rpcFile.GetValue("config", "id");
string state = rpcFile.GetValue("config", "state");
string details = rpcFile.GetValue("config", "details");
string bigimgkey = rpcFile.GetValue("config", "BigImgKey");
string smallimgkey = rpcFile.GetValue("config", "SmallImgKey");
string bigimgtxt = rpcFile.GetValue("config", "BigImgText");
string smallimgtxt = rpcFile.GetValue("config", "SmallImgText");
string FileName = rpcFile.GetValue("config", "FileName");
Game newGame = new Game(FileName, Name, ProcessName, id, state, details, bigimgkey, smallimgkey, bigimgtxt, smallimgtxt);
readGames.Add(newGame);
}
Games.Clear();
foreach (Game game in readGames)
{
//Console.WriteLine("Added " + game + " from file");
Games.Add(game);
}
}
}
public void LoadGamesIntoListBox()
{
RpcItemList.Items.Clear();
foreach (Game game in Games)
{
RpcItemList.Items.Add(game);
}
}
private void RpcItemList_SelectionChanged(object sender, SelectionChangedEventArgs e)
{
if (RpcItemList.SelectedItem != null)
{
Game selectedGame = RpcItemList.SelectedItem as Game;
lastSelectedGame = selectedGame;
tb_FormPName.Text = selectedGame.ProcessName;
tb_FormClient.Text = selectedGame.id;
tb_FormName.Text = selectedGame.Name;
tb_FormState.Text = selectedGame.state;
tb_FormDetails.Text = selectedGame.details;
tb_FormLargeImgKey.Text = selectedGame.bigimgkey;
tb_FormLargeImgTxt.Text = selectedGame.bigimgtext;
tb_FormSmallImgKey.Text = selectedGame.smallimgkey;
tb_FormSmallImgTxt.Text = selectedGame.smallimgtext;
}
}
private void RpcItemList_MouseDoubleClick(object sender, MouseButtonEventArgs e)
{
if (RpcItemList.SelectedItem != null)
{
deleteGameFile((Game)RpcItemList.SelectedItem);
}
Refresh();
}
private void DiscordRpcSave_Click(object sender, RoutedEventArgs e)
{
Game selectedItem = lastSelectedGame;
if (selectedItem != null)
{
Game editedGame = new Game(
selectedItem.fileName,
tb_FormName.Text,
tb_FormPName.Text,
tb_FormClient.Text,
tb_FormState.Text,
tb_FormDetails.Text,
tb_FormLargeImgKey.Text,
tb_FormSmallImgKey.Text,
tb_FormLargeImgTxt.Text,
tb_FormSmallImgTxt.Text
);
saveGameToFile(editedGame);
}
Refresh();
}
private void DiscordRpcStop_Click(object sender, RoutedEventArgs e)
{
stopBackgroundWorker();
}
private void DiscordRpcStart_Click(object sender, RoutedEventArgs e)
{
runBackgroundWorker();
}
private void DiscordRpcNew_Click(object sender, RoutedEventArgs e)
{
generateNewGame();
Refresh();
}
private void UserControl_Unloaded(object sender, RoutedEventArgs e)
{
stopBackgroundWorker();
}
private void ListViewVersions_OnLoaded(object sender, RoutedEventArgs e)
{
}
}
}

View file

@ -1,35 +0,0 @@
<UserControl x:Class="WeeXnes.MVVM.View.HomeView"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:local="clr-namespace:WeeXnes.MVVM.View"
mc:Ignorable="d"
d:DesignHeight="450" d:DesignWidth="800">
<StackPanel>
<TextBlock Text="Welcome to WeeXnes Hub"
Foreground="White"
FontSize="28"
Margin="0,0,0,20"
Name="WelcomeMSG"
HorizontalAlignment="Center"/>
<Grid>
<Grid.RowDefinitions>
<RowDefinition Height="300"/>
<RowDefinition/>
</Grid.RowDefinitions>
<Image RenderOptions.BitmapScalingMode="HighQuality"
Source="/Images/wicon.png" Grid.Row="0"
HorizontalAlignment="Center" RenderTransformOrigin="0.5,0.5" />
<TextBlock Text="WeeXnes Hub" Grid.Row="1"
Foreground="White"
FontFamily="/Fonts/#Poppins"
FontSize="28"
HorizontalAlignment="Center"
Name="VersionInfo"
/>
</Grid>
</StackPanel>
</UserControl>

View file

@ -1,41 +0,0 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Data;
using System.Windows.Documents;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Imaging;
using System.Windows.Navigation;
using System.Windows.Shapes;
using WeeXnes.Core;
namespace WeeXnes.MVVM.View
{
/// <summary>
/// Interaktionslogik für HomeView.xaml
/// </summary>
public partial class HomeView : UserControl
{
public HomeView()
{
InitializeComponent();
SetWelcomeMSG();
SetVersionInfo();
}
private void SetVersionInfo()
{
VersionInfo.Text = VersionInfo.Text + " v" + Globals.version;
}
private void SetWelcomeMSG()
{
WelcomeMSG.Text = "Welcome, " + Environment.UserName;
}
}
}

View file

@ -1,127 +0,0 @@
<UserControl x:Class="WeeXnes.MVVM.View.KeyManagerView"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:local="clr-namespace:WeeXnes.MVVM.View"
mc:Ignorable="d"
d:DesignHeight="450" d:DesignWidth="800">
<Grid>
<Grid.RowDefinitions>
<RowDefinition Height="430"/>
<RowDefinition/>
</Grid.RowDefinitions>
<StackPanel Loaded="StackPanel_Loaded"
Grid.Row="0">
<TextBlock Text="Key Manager"
Foreground="White"
FontSize="25"
HorizontalAlignment="Center"
Margin="0,0,0,20"/>
<Grid>
<Border
CornerRadius="4"
Height="375">
<Border.Background>
<LinearGradientBrush StartPoint="0 0" EndPoint="1 1">
<LinearGradientBrush.GradientStops>
<GradientStop Offset="0.2" Color="#212329" />
<GradientStop Offset="1" Color="#1b1c21" />
</LinearGradientBrush.GradientStops>
</LinearGradientBrush>
</Border.Background>
<ListView Name="KeyListView"
Background="Transparent"
Foreground="White"
BorderThickness="0"
SelectionChanged="KeyListView_SelectionChanged" MouseDoubleClick="KeyListView_MouseDoubleClick"
>
<ListView.ItemTemplate>
<DataTemplate>
<Grid>
<Grid.ColumnDefinitions>
<ColumnDefinition Width="300"/>
<ColumnDefinition/>
</Grid.ColumnDefinitions>
<TextBlock Text="{Binding name}"
Grid.Column="0"/>
<TextBlock Text="{Binding value}"
Grid.Column="1"
Name="monkeman"
Loaded="Key_OnLoaded"/>
</Grid>
</DataTemplate>
</ListView.ItemTemplate>
</ListView>
</Border>
</Grid>
</StackPanel>
<StackPanel Grid.Row="1" Orientation="Horizontal" HorizontalAlignment="Center">
<TextBox Name="Textbox_Name"
Height="30"
HorizontalAlignment="Left"
Width="250"
Style="{StaticResource MaterialTextBox}"
Background="#1c1e23" Tag="Name"/>
<TextBox Name="Textbox_Value"
Height="30"
HorizontalAlignment="Right"
Width="250"
Margin="15,0,0,0"
Style="{StaticResource MaterialTextBox}"
Background="#1c1e23" Tag="Value"/>
<Button Width="90"
Height="30"
Name="AddButton"
Margin="15,0,0,0"
Click="AddButton_Click"
Content="Add"
Foreground="DarkGray"
Background="#1c1e23"
Style="{StaticResource UniversalMaterialButton}"
Cursor="Hand">
<Button.Triggers>
<!-- Animate the button's Width property. -->
<EventTrigger RoutedEvent="Button.MouseEnter">
<BeginStoryboard>
<Storyboard>
<ColorAnimation
Storyboard.TargetProperty="(Button.Background).(SolidColorBrush.Color)"
To="DarkGray" Duration="0:0:00.1" AutoReverse="False"
/>
<ColorAnimation
Storyboard.TargetProperty="(Button.Foreground).(SolidColorBrush.Color)"
To="#212329" Duration="0:0:00.1" AutoReverse="False"
/>
</Storyboard>
</BeginStoryboard>
</EventTrigger>
<EventTrigger RoutedEvent="Button.MouseLeave">
<BeginStoryboard>
<Storyboard>
<ColorAnimation
Storyboard.TargetProperty="(Button.Background).(SolidColorBrush.Color)"
To="#212329" Duration="0:0:00.1" AutoReverse="False"
/>
<ColorAnimation
Storyboard.TargetProperty="(Button.Foreground).(SolidColorBrush.Color)"
To="DarkGray" Duration="0:0:00.1" AutoReverse="False"
/>
</Storyboard>
</BeginStoryboard>
</EventTrigger>
</Button.Triggers>
</Button>
</StackPanel>
</Grid>
</UserControl>

View file

@ -1,267 +0,0 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Data;
using System.Windows.Documents;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Imaging;
using System.Windows.Navigation;
using System.Windows.Shapes;
using WeeXnes.Keys;
using WeeXnes.Core;
using wx;
using System.IO;
using System.ComponentModel;
namespace WeeXnes.MVVM.View
{
/// <summary>
/// Interaktionslogik für KeyManagerView.xaml
/// </summary>
public partial class KeyManagerView : UserControl
{
public KeyManagerView()
{
CheckForFolders();
InitializeComponent();
Globals.searchbox_content.ValueChanged += () => { SearchboxChanged(); };
}
public void SearchboxChanged()
{
Console.WriteLine("Searchbox: " + Globals.searchbox_content.Value);
KeyListView.Items.Clear();
List<KeyItem> items = new List<KeyItem>();
foreach(KeyItem item in KeyManagerLib.KeyList)
{
if(Contains(item.name, Globals.searchbox_content.Value, StringComparison.OrdinalIgnoreCase))
{
items.Add(item);
}
}
if(items.Count > 0)
{
foreach(KeyItem item in items)
{
KeyListView.Items.Add(item);
}
}
else
{
KeyListView.Items.Clear();
}
}
public bool Contains(string source, string toCheck, StringComparison comp)
{
return source?.IndexOf(toCheck, comp) >= 0;
}
#region ListControls
public void FillList()
{
Console.WriteLine("->Filling Listview");
KeyListView.Items.Clear();
foreach (KeyItem key in KeyManagerLib.KeyList)
{
KeyListView.Items.Add(key);
}
}
public void AddItemFromUI()
{
if (!String.IsNullOrEmpty(Textbox_Name.Text))
{
if (!String.IsNullOrEmpty(Textbox_Value.Text))
{
KeyItem newkey = new KeyItem(Textbox_Name.Text, Textbox_Value.Text);
KeyManagerLib.KeyList.Add(newkey);
string filename = Globals.settings_KeyManagerItemsPath.Value + "\\" + Guid.NewGuid().ToString() + ".wx";
string[] filecontent = new string[] { "##WXfile##", newkey.name, EncryptionLib.EncryptorLibary.encrypt(Globals.encryptionKey, newkey.value) };
/*
INIFile newini = new INIFile(filename, true);
newini.SetValue("key", "name", newkey.name);
newini.SetValue("key", "value", newkey.value);
*/
EncryptionLib.EncryptorLibary.writeFile(filecontent, filename);
Console.WriteLine("Added: <" + newkey.name + "> Value: " + newkey.value);
}
}
}
public void AddItem(string _name, string _value)
{
KeyItem newkey = new KeyItem(_name, _value);
KeyManagerLib.KeyList.Add(newkey);
}
public void PrintList()
{
Console.WriteLine("-------------------------------");
foreach (KeyItem item in KeyManagerLib.KeyList)
{
Console.WriteLine(item.name + ": " + item.value);
}
}
#endregion
private void StackPanel_Loaded(object sender, RoutedEventArgs e)
{
KeyManagerLib.KeyList.Clear();
if (!SaveInterface.IsDirectoryEmpty(Globals.settings_KeyManagerItemsPath.Value))
{
string[] files = SaveInterface.GetFilesInDir(Globals.settings_KeyManagerItemsPath.Value);
foreach (string file in files)
{
Console.WriteLine(file);
try
{
wxfile inifile = new wxfile(file);
string name = inifile.GetName();
string value = inifile.GetValue();
value = EncryptionLib.EncryptorLibary.decrypt(Globals.encryptionKey, value);
if (name != null && value != null)
{
KeyItem newitem = new KeyItem(name, value);
KeyManagerLib.KeyList.Add(newitem);
Console.WriteLine("Added Item: <" + newitem.name + ">");
}
}
catch (Exception ex)
{
MessageBox.Show(ex.Message);
}
FillList();
}
}
}
private void CheckForFolders()
{
if (!Globals.settings_KeyManagerItemsPath_Bool.Value)
{
Globals.settings_KeyManagerItemsPath.Value = Globals.settings_KeyManagerItemsPath_Default;
}
if (!Directory.Exists(Globals.AppDataPath))
{
Directory.CreateDirectory(Globals.AppDataPath);
Console.WriteLine("Created AppDataPath");
}
if (!Directory.Exists(Globals.settings_KeyManagerItemsPath.Value))
{
Directory.CreateDirectory(Globals.settings_KeyManagerItemsPath.Value);
Console.WriteLine("Created settings_KeyManagerItemsPath");
}
}
private void AddButton_Click(object sender, RoutedEventArgs e)
{
AddItemFromUI();
FillList();
ClearInputs();
}
private void DebugBtn_Click(object sender, RoutedEventArgs e)
{
PrintList();
}
private void RefreshBtn_Click(object sender, RoutedEventArgs e)
{
FillList();
}
private void KeyListView_SelectionChanged(object sender, SelectionChangedEventArgs e)
{
KeyItem selectedItem = (KeyItem)KeyListView.SelectedItem;
if(selectedItem != null)
{
Console.WriteLine(selectedItem.name + ": " + selectedItem.value);
if (Globals.settings_copySelectedToClipboard.Value)
{
Clipboard.SetText(selectedItem.value);
}
Console.WriteLine("Copied: " + selectedItem.value + " to Clipboard");
}
}
private void KeyListView_MouseDoubleClick(object sender, MouseButtonEventArgs e)
{
KeyItem selectedItem = (KeyItem)KeyListView.SelectedItem;
Console.WriteLine("Doubleclicked " + selectedItem.name);
KeyManagerLib.KeyList.Remove(selectedItem);
string[] files = SaveInterface.GetFilesInDir(Globals.settings_KeyManagerItemsPath.Value);
foreach (string file in files)
{
Console.WriteLine(file);
try
{
wxfile inifile = new wxfile(file);
string name = inifile.GetName();
string value = inifile.GetValue();
if(name == selectedItem.name)
{
File.Delete(file);
Console.WriteLine("Removed File: " + file);
}
}
catch (Exception ex)
{
MessageBox.Show(ex.Message);
}
}
FillList();
}
private void ClearInputs()
{
Textbox_Name.Clear();
Textbox_Value.Clear();
}
private void addNameClip_IsEnabledChanged(object sender, DependencyPropertyChangedEventArgs e)
{
Console.WriteLine("fnmgikegnmek");
}
private void Key_OnLoaded(object sender, RoutedEventArgs e)
{
if (Globals.settings_KeyManagerCensorKeys.Value)
{
TextBlock tb = (TextBlock)sender;
int text_size = tb.Text.Length;
string censored_string = "";
for (int i = 0; i <= text_size; i++)
censored_string = censored_string + "•";
tb.Text = censored_string;
}
}
}
public static class SaveInterface
{
public static bool IsDirectoryEmpty(string path)
{
return !Directory.EnumerateFileSystemEntries(path).Any();
}
public static string[] GetFilesInDir(string path)
{
return Directory.GetFiles(path, "*.wx");
}
}
}

View file

@ -1,542 +0,0 @@
<UserControl x:Class="WeeXnes.MVVM.View.SettingView"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:local="clr-namespace:WeeXnes.MVVM.View"
mc:Ignorable="d"
d:DesignHeight="2000" d:DesignWidth="800">
<ScrollViewer>
<Grid >
<Grid.RowDefinitions>
<RowDefinition/>
<RowDefinition/>
<RowDefinition/>
</Grid.RowDefinitions>
<Border Grid.Row="0"
CornerRadius="4"
Margin="10,10,10,10"
Padding="0,0,0,5">
<Border.Background>
<LinearGradientBrush StartPoint="0 0" EndPoint="1 1">
<LinearGradientBrush.GradientStops>
<GradientStop Offset="0.2" Color="#212329" />
<GradientStop Offset="1" Color="#1b1c21" />
</LinearGradientBrush.GradientStops>
</LinearGradientBrush>
</Border.Background>
<StackPanel Orientation="Vertical">
<Label Content="General"
Foreground="White"
HorizontalAlignment="Center"
FontSize="23"/>
<CheckBox VerticalAlignment="Top"
VerticalContentAlignment="Center"
HorizontalContentAlignment="Center"
Name="AlwaysOnTopSwitch"
Checked="AlwaysOnTopSwitch_Checked"
Unchecked="AlwaysOnTopSwitch_Unchecked"
Margin="10,10,0,0">
<TextBlock
Text="Always On Top"
VerticalAlignment="Center"
FontSize="15"
Foreground="White"/>
</CheckBox>
<CheckBox VerticalAlignment="Top"
VerticalContentAlignment="Center"
HorizontalContentAlignment="Center"
Name="OSXSwitch"
Checked="OSXSwitch_OnChecked"
Unchecked="OSXSwitch_OnUnchecked"
Margin="10,10,0,0">
<TextBlock
Text="Enable OSX Style (Restart Required)"
VerticalAlignment="Center"
FontSize="15"
Foreground="White"/>
</CheckBox>
<Button Name="CheckForUpdateBtn"
Style="{StaticResource UniversalMaterialButton}"
Content="Check for Updates"
Background="#2f313b"
Foreground="DarkGray"
Height="25"
Click="CheckForUpdateBtn_OnClick"
Margin="4,10,4,0"
Cursor="Hand">
<Button.Triggers>
<!-- Animate the button's Width property. -->
<EventTrigger RoutedEvent="Button.MouseEnter">
<BeginStoryboard>
<Storyboard>
<ColorAnimation
Storyboard.TargetProperty="(Button.Background).(SolidColorBrush.Color)"
To="DarkGray" Duration="0:0:00.1" AutoReverse="False"
/>
<ColorAnimation
Storyboard.TargetProperty="(Button.Foreground).(SolidColorBrush.Color)"
To="#212329" Duration="0:0:00.1" AutoReverse="False"
/>
</Storyboard>
</BeginStoryboard>
</EventTrigger>
<EventTrigger RoutedEvent="Button.MouseLeave">
<BeginStoryboard>
<Storyboard>
<ColorAnimation
Storyboard.TargetProperty="(Button.Background).(SolidColorBrush.Color)"
To="#2f313b" Duration="0:0:00.1" AutoReverse="False"
/>
<ColorAnimation
Storyboard.TargetProperty="(Button.Foreground).(SolidColorBrush.Color)"
To="DarkGray" Duration="0:0:00.1" AutoReverse="False"
/>
</Storyboard>
</BeginStoryboard>
</EventTrigger>
</Button.Triggers>
</Button>
<Button Name="createShortcut"
Style="{StaticResource UniversalMaterialButton}"
Content="Create Startmenu Entry"
Background="#2f313b"
Foreground="DarkGray"
Height="25"
Click="CreateShortcut_OnClick"
Margin="4,10,4,0"
Cursor="Hand">
<Button.Triggers>
<!-- Animate the button's Width property. -->
<EventTrigger RoutedEvent="Button.MouseEnter">
<BeginStoryboard>
<Storyboard>
<ColorAnimation
Storyboard.TargetProperty="(Button.Background).(SolidColorBrush.Color)"
To="DarkGray" Duration="0:0:00.1" AutoReverse="False"
/>
<ColorAnimation
Storyboard.TargetProperty="(Button.Foreground).(SolidColorBrush.Color)"
To="#212329" Duration="0:0:00.1" AutoReverse="False"
/>
</Storyboard>
</BeginStoryboard>
</EventTrigger>
<EventTrigger RoutedEvent="Button.MouseLeave">
<BeginStoryboard>
<Storyboard>
<ColorAnimation
Storyboard.TargetProperty="(Button.Background).(SolidColorBrush.Color)"
To="#2f313b" Duration="0:0:00.1" AutoReverse="False"
/>
<ColorAnimation
Storyboard.TargetProperty="(Button.Foreground).(SolidColorBrush.Color)"
To="DarkGray" Duration="0:0:00.1" AutoReverse="False"
/>
</Storyboard>
</BeginStoryboard>
</EventTrigger>
</Button.Triggers>
</Button>
<Button Name="OpenAppdataFolder" Grid.Row="1"
Style="{StaticResource UniversalMaterialButton}"
Content="Open AppData Folder"
Background="#2f313b"
Foreground="DarkGray"
Height="25"
Margin="4,10,4,0"
Click="OpenAppdataFolder_Click"
Cursor="Hand">
<Button.Triggers>
<!-- Animate the button's Width property. -->
<EventTrigger RoutedEvent="Button.MouseEnter">
<BeginStoryboard>
<Storyboard>
<ColorAnimation
Storyboard.TargetProperty="(Button.Background).(SolidColorBrush.Color)"
To="DarkGray" Duration="0:0:00.1" AutoReverse="False"
/>
<ColorAnimation
Storyboard.TargetProperty="(Button.Foreground).(SolidColorBrush.Color)"
To="#212329" Duration="0:0:00.1" AutoReverse="False"
/>
</Storyboard>
</BeginStoryboard>
</EventTrigger>
<EventTrigger RoutedEvent="Button.MouseLeave">
<BeginStoryboard>
<Storyboard>
<ColorAnimation
Storyboard.TargetProperty="(Button.Background).(SolidColorBrush.Color)"
To="#2f313b" Duration="0:0:00.1" AutoReverse="False"
/>
<ColorAnimation
Storyboard.TargetProperty="(Button.Foreground).(SolidColorBrush.Color)"
To="DarkGray" Duration="0:0:00.1" AutoReverse="False"
/>
</Storyboard>
</BeginStoryboard>
</EventTrigger>
</Button.Triggers>
</Button>
</StackPanel>
</Border>
<Border Grid.Row="1"
CornerRadius="4"
Margin="10,10,10,10"
Padding="0,0,0,5">
<Border.Background>
<LinearGradientBrush StartPoint="0 0" EndPoint="1 1">
<LinearGradientBrush.GradientStops>
<GradientStop Offset="0.2" Color="#212329" />
<GradientStop Offset="1" Color="#1b1c21" />
</LinearGradientBrush.GradientStops>
</LinearGradientBrush>
</Border.Background>
<StackPanel Orientation="Vertical">
<Label Content="RPC"
Foreground="White"
HorizontalAlignment="Center"
FontSize="23"/>
<CheckBox VerticalAlignment="Top"
VerticalContentAlignment="Center"
HorizontalContentAlignment="Center"
Name="ShowElapsedTimeOnRpc"
Checked="ShowElapsedTimeOnRpc_Checked"
Unchecked="ShowElapsedTimeOnRpc_Unchecked"
Margin="10,10,0,0">
<TextBlock
Text="Show Elapsed Time"
VerticalAlignment="Center"
FontSize="15"
Foreground="White"/>
</CheckBox>
<Label Content="Default RPC ClientID:"
Margin="0,0,0,0"
FontSize="13"
Foreground="White"
HorizontalAlignment="Center"/>
<TextBox Style="{StaticResource MaterialTextBox}"
Margin="4,0,4,0"
Name="tb_DefaultClientID"
Background="#2f313b"
Tag="Default Client ID"/>
<Button Name="SaveDefaultID"
Style="{StaticResource UniversalMaterialButton}"
Content="Set Default ClientID"
Background="#2f313b"
Foreground="DarkGray"
Height="25"
Click="SaveDefaultID_Click"
Margin="4,10,4,0"
Cursor="Hand">
<Button.Triggers>
<!-- Animate the button's Width property. -->
<EventTrigger RoutedEvent="Button.MouseEnter">
<BeginStoryboard>
<Storyboard>
<ColorAnimation
Storyboard.TargetProperty="(Button.Background).(SolidColorBrush.Color)"
To="DarkGray" Duration="0:0:00.1" AutoReverse="False"
/>
<ColorAnimation
Storyboard.TargetProperty="(Button.Foreground).(SolidColorBrush.Color)"
To="#212329" Duration="0:0:00.1" AutoReverse="False"
/>
</Storyboard>
</BeginStoryboard>
</EventTrigger>
<EventTrigger RoutedEvent="Button.MouseLeave">
<BeginStoryboard>
<Storyboard>
<ColorAnimation
Storyboard.TargetProperty="(Button.Background).(SolidColorBrush.Color)"
To="#2f313b" Duration="0:0:00.1" AutoReverse="False"
/>
<ColorAnimation
Storyboard.TargetProperty="(Button.Foreground).(SolidColorBrush.Color)"
To="DarkGray" Duration="0:0:00.1" AutoReverse="False"
/>
</Storyboard>
</BeginStoryboard>
</EventTrigger>
</Button.Triggers>
</Button>
<CheckBox VerticalAlignment="Top"
VerticalContentAlignment="Center"
HorizontalContentAlignment="Center"
Name="EnableAutoStart"
Margin="10,10,0,0">
<TextBlock
Text="Enable RPC autostart"
VerticalAlignment="Center"
FontSize="15"
Foreground="White"/>
</CheckBox>
<Label Content="Placeholder" HorizontalAlignment="Center"
FontSize="13"
Foreground="White"
Name="RpcPathLabel"/>
<Button Name="SetRpcLocation"
Style="{StaticResource UniversalMaterialButton}"
Content="Set Rpc Files Path"
Background="#2f313b"
Foreground="DarkGray"
Height="25"
Click="SetRpcLocation_OnClick"
Margin="4,10,4,0"
Cursor="Hand">
<Button.Triggers>
<!-- Animate the button's Width property. -->
<EventTrigger RoutedEvent="Button.MouseEnter">
<BeginStoryboard>
<Storyboard>
<ColorAnimation
Storyboard.TargetProperty="(Button.Background).(SolidColorBrush.Color)"
To="DarkGray" Duration="0:0:00.1" AutoReverse="False"
/>
<ColorAnimation
Storyboard.TargetProperty="(Button.Foreground).(SolidColorBrush.Color)"
To="#212329" Duration="0:0:00.1" AutoReverse="False"
/>
</Storyboard>
</BeginStoryboard>
</EventTrigger>
<EventTrigger RoutedEvent="Button.MouseLeave">
<BeginStoryboard>
<Storyboard>
<ColorAnimation
Storyboard.TargetProperty="(Button.Background).(SolidColorBrush.Color)"
To="#2f313b" Duration="0:0:00.1" AutoReverse="False"
/>
<ColorAnimation
Storyboard.TargetProperty="(Button.Foreground).(SolidColorBrush.Color)"
To="DarkGray" Duration="0:0:00.1" AutoReverse="False"
/>
</Storyboard>
</BeginStoryboard>
</EventTrigger>
</Button.Triggers>
</Button>
<Button Name="SetRpcLocationDefault"
Style="{StaticResource UniversalMaterialButton}"
Content="Set Default Path"
Background="#2f313b"
Foreground="DarkGray"
Height="25"
Click="SetRpcLocationDefault_OnClick"
Margin="4,10,4,0"
Cursor="Hand">
<Button.Triggers>
<!-- Animate the button's Width property. -->
<EventTrigger RoutedEvent="Button.MouseEnter">
<BeginStoryboard>
<Storyboard>
<ColorAnimation
Storyboard.TargetProperty="(Button.Background).(SolidColorBrush.Color)"
To="DarkGray" Duration="0:0:00.1" AutoReverse="False"
/>
<ColorAnimation
Storyboard.TargetProperty="(Button.Foreground).(SolidColorBrush.Color)"
To="#212329" Duration="0:0:00.1" AutoReverse="False"
/>
</Storyboard>
</BeginStoryboard>
</EventTrigger>
<EventTrigger RoutedEvent="Button.MouseLeave">
<BeginStoryboard>
<Storyboard>
<ColorAnimation
Storyboard.TargetProperty="(Button.Background).(SolidColorBrush.Color)"
To="#2f313b" Duration="0:0:00.1" AutoReverse="False"
/>
<ColorAnimation
Storyboard.TargetProperty="(Button.Foreground).(SolidColorBrush.Color)"
To="DarkGray" Duration="0:0:00.1" AutoReverse="False"
/>
</Storyboard>
</BeginStoryboard>
</EventTrigger>
</Button.Triggers>
</Button>
</StackPanel>
</Border>
<Border Grid.Row="2"
CornerRadius="4"
Margin="10,10,10,10"
Padding="0,0,0,5">
<Border.Background>
<LinearGradientBrush StartPoint="0 0" EndPoint="1 1">
<LinearGradientBrush.GradientStops>
<GradientStop Offset="0.2" Color="#212329" />
<GradientStop Offset="1" Color="#1b1c21" />
</LinearGradientBrush.GradientStops>
</LinearGradientBrush>
</Border.Background>
<StackPanel Orientation="Vertical">
<Label Content="Key Manager"
Foreground="White"
HorizontalAlignment="Center"
FontSize="23"/>
<CheckBox VerticalAlignment="Top"
VerticalContentAlignment="Center"
HorizontalContentAlignment="Center"
Name="ItemToClipboardSwitch"
Checked="ItemToClipboardSwitch_Checked"
Unchecked="ItemToClipboardSwitch_Unchecked"
Margin="10,10,0,0">
<TextBlock
Text="Selected Item to Clipboard"
VerticalAlignment="Center"
FontSize="15"
Foreground="White"/>
</CheckBox>
<CheckBox VerticalAlignment="Top"
VerticalContentAlignment="Center"
HorizontalContentAlignment="Center"
Name="CensorKeysSwitch"
Checked="CensorKeysSwitch_OnChecked"
Unchecked="CensorKeysSwitch_OnUnchecked"
Margin="10,10,0,0">
<TextBlock
Text="Censor Keys Visually"
VerticalAlignment="Center"
FontSize="15"
Foreground="White"/>
</CheckBox>
<Label Content="Placeholder" HorizontalAlignment="Center"
FontSize="13"
Foreground="White"
Name="KeyPathLabel"/>
<Button Name="SetKeyLocation"
Style="{StaticResource UniversalMaterialButton}"
Content="Set Key Files Path"
Background="#2f313b"
Foreground="DarkGray"
Height="25"
Click="SetKeyLocation_OnClick"
Margin="4,10,4,0"
Cursor="Hand">
<Button.Triggers>
<!-- Animate the button's Width property. -->
<EventTrigger RoutedEvent="Button.MouseEnter">
<BeginStoryboard>
<Storyboard>
<ColorAnimation
Storyboard.TargetProperty="(Button.Background).(SolidColorBrush.Color)"
To="DarkGray" Duration="0:0:00.1" AutoReverse="False"
/>
<ColorAnimation
Storyboard.TargetProperty="(Button.Foreground).(SolidColorBrush.Color)"
To="#212329" Duration="0:0:00.1" AutoReverse="False"
/>
</Storyboard>
</BeginStoryboard>
</EventTrigger>
<EventTrigger RoutedEvent="Button.MouseLeave">
<BeginStoryboard>
<Storyboard>
<ColorAnimation
Storyboard.TargetProperty="(Button.Background).(SolidColorBrush.Color)"
To="#2f313b" Duration="0:0:00.1" AutoReverse="False"
/>
<ColorAnimation
Storyboard.TargetProperty="(Button.Foreground).(SolidColorBrush.Color)"
To="DarkGray" Duration="0:0:00.1" AutoReverse="False"
/>
</Storyboard>
</BeginStoryboard>
</EventTrigger>
</Button.Triggers>
</Button>
<Button Name="SetKeyLocationDefault"
Style="{StaticResource UniversalMaterialButton}"
Content="Set Default Path"
Background="#2f313b"
Foreground="DarkGray"
Height="25"
Click="SetKeyLocationDefault_OnClick"
Margin="4,10,4,0"
Cursor="Hand">
<Button.Triggers>
<!-- Animate the button's Width property. -->
<EventTrigger RoutedEvent="Button.MouseEnter">
<BeginStoryboard>
<Storyboard>
<ColorAnimation
Storyboard.TargetProperty="(Button.Background).(SolidColorBrush.Color)"
To="DarkGray" Duration="0:0:00.1" AutoReverse="False"
/>
<ColorAnimation
Storyboard.TargetProperty="(Button.Foreground).(SolidColorBrush.Color)"
To="#212329" Duration="0:0:00.1" AutoReverse="False"
/>
</Storyboard>
</BeginStoryboard>
</EventTrigger>
<EventTrigger RoutedEvent="Button.MouseLeave">
<BeginStoryboard>
<Storyboard>
<ColorAnimation
Storyboard.TargetProperty="(Button.Background).(SolidColorBrush.Color)"
To="#2f313b" Duration="0:0:00.1" AutoReverse="False"
/>
<ColorAnimation
Storyboard.TargetProperty="(Button.Foreground).(SolidColorBrush.Color)"
To="DarkGray" Duration="0:0:00.1" AutoReverse="False"
/>
</Storyboard>
</BeginStoryboard>
</EventTrigger>
</Button.Triggers>
</Button>
</StackPanel>
</Border>
</Grid>
</ScrollViewer>
</UserControl>

View file

@ -1,357 +0,0 @@
using System;
using System.Collections.Generic;
using System.Diagnostics;
using System.IO;
using System.Linq;
using System.Net;
using System.Text;
using System.Threading.Tasks;
using System.Windows;
using System.Windows.Data;
using System.Windows.Documents;
using System.Windows.Forms;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Imaging;
using System.Windows.Navigation;
using System.Windows.Shapes;
using Newtonsoft.Json;
using Nocksoft.IO.ConfigFiles;
using WeeXnes.Core;
using WeeXnes.Misc;
using Application = System.Windows.Forms.Application;
using Message = WeeXnes.Misc.Message;
using MessageBox = System.Windows.MessageBox;
using Path = System.IO.Path;
using UserControl = System.Windows.Controls.UserControl;
namespace WeeXnes.MVVM.View
{
/// <summary>
/// Interaktionslogik für SettingView.xaml
/// </summary>
public partial class SettingView : UserControl
{
public SettingView()
{
InitializeComponent();
//LoadUiFromSettingsFile();
SetFunction();
SetUiUpdateListeners();
InitializeUi();
//UpdatePathsOnUi();
}
public void InitializeUi()
{
if (!String.IsNullOrEmpty(Globals.settings_RpcItemsPath.Value))
{
RpcPathLabel.Content = Globals.settings_RpcItemsPath.Value;
}
else
{
RpcPathLabel.Content = Globals.settings_RpcItemsPath_Default;
}
if (!String.IsNullOrEmpty(Globals.settings_KeyManagerItemsPath.Value))
{
KeyPathLabel.Content = Globals.settings_KeyManagerItemsPath.Value;
}
else
{
KeyPathLabel.Content = Globals.settings_KeyManagerItemsPath_Default;
}
if (Globals.settings_alwaysOnTop.Value)
{
AlwaysOnTopSwitch.IsChecked = true;
}
if (Globals.settings_osxStyleControlls.Value)
{
OSXSwitch.IsChecked = true;
}
if (Globals.settings_RpcAutoStart.Value)
{
UnsetFunction();
EnableAutoStart.IsChecked = true;
SetFunction();
}
if (Globals.settings_RpcShowElapsedTime.Value)
{
ShowElapsedTimeOnRpc.IsChecked = true;
}
if (Globals.settings_copySelectedToClipboard.Value)
{
ItemToClipboardSwitch.IsChecked = true;
}
if (Globals.settings_KeyManagerCensorKeys.Value)
{
CensorKeysSwitch.IsChecked = true;
}
tb_DefaultClientID.Text = Globals.settings_RpcDefaultClientID.Value;
}
private void SetUiUpdateListeners()
{
Globals.settings_RpcItemsPath.ValueChanged += () =>
{
if (!String.IsNullOrEmpty(Globals.settings_RpcItemsPath.Value))
{
RpcPathLabel.Content = Globals.settings_RpcItemsPath.Value;
}
else
{
RpcPathLabel.Content = Globals.settings_RpcItemsPath_Default;
}
};
Globals.settings_KeyManagerItemsPath.ValueChanged += () =>
{
if (!String.IsNullOrEmpty(Globals.settings_KeyManagerItemsPath.Value))
{
KeyPathLabel.Content = Globals.settings_KeyManagerItemsPath.Value;
}
else
{
KeyPathLabel.Content = Globals.settings_KeyManagerItemsPath_Default;
}
};
}
private void SetFunction()
{
EnableAutoStart.Checked += EnableAutoStart_Checked;
EnableAutoStart.Unchecked += EnableAutoStart_Unchecked;
}
private void UnsetFunction()
{
EnableAutoStart.Checked -= EnableAutoStart_Checked;
EnableAutoStart.Unchecked -= EnableAutoStart_Unchecked;
}
private void AlwaysOnTopSwitch_Checked(object sender, RoutedEventArgs e)
{
Globals.settings_alwaysOnTop.Value = true;
}
private void AlwaysOnTopSwitch_Unchecked(object sender, RoutedEventArgs e)
{
Globals.settings_alwaysOnTop.Value = false;
}
private void ShowElapsedTimeOnRpc_Checked(object sender, RoutedEventArgs e)
{
Globals.settings_RpcShowElapsedTime.Value = true;
}
private void ShowElapsedTimeOnRpc_Unchecked(object sender, RoutedEventArgs e)
{
Globals.settings_RpcShowElapsedTime.Value = false;
}
private void ItemToClipboardSwitch_Checked(object sender, RoutedEventArgs e)
{
Globals.settings_copySelectedToClipboard.Value = true;
}
private void ItemToClipboardSwitch_Unchecked(object sender, RoutedEventArgs e)
{
Globals.settings_copySelectedToClipboard.Value = false;
}
private void OpenAppdataFolder_Click(object sender, RoutedEventArgs e)
{
Process.Start(Globals.AppDataPath);
}
private void SaveDefaultID_Click(object sender, RoutedEventArgs e)
{
if (!String.IsNullOrEmpty(tb_DefaultClientID.Text))
{
Globals.settings_RpcDefaultClientID.Value = tb_DefaultClientID.Text;
}
else
{
Misc.Message message = new Misc.Message("Dont leave ClientID empty");
message.Show();
}
}
public void switchAutoRpc(bool on)
{
UnsetFunction();
if (on)
{
Globals.settings_RpcAutoStart.Value = true;
EnableAutoStart.IsChecked = true;
}
else
{
Globals.settings_RpcAutoStart.Value = false;
EnableAutoStart.IsChecked = false;
}
SetFunction();
}
private void EnableAutoStart_Checked(object sender, RoutedEventArgs e)
{
bool proc_suc;
try
{
Process uacpromp = Process.Start("WeeXnes_UAC.exe", "-EnableAutostart");
uacpromp.WaitForExit();
proc_suc = true;
}
catch (Exception ex)
{
Misc.Message message = new Misc.Message(ex.ToString());
message.Show();
proc_suc = false;
}
switchAutoRpc(proc_suc);
}
private void EnableAutoStart_Unchecked(object sender, RoutedEventArgs e)
{
bool proc_suc;
try
{
Process uacpromp = Process.Start("WeeXnes_UAC.exe", "-DisableAutostart");
uacpromp.WaitForExit();
proc_suc = false;
}
catch (Exception ex)
{
Misc.Message message = new Misc.Message(ex.ToString());
message.Show();
proc_suc = true;
}
switchAutoRpc(proc_suc);
}
private void SetKeyLocationDefault_OnClick(object sender, RoutedEventArgs e)
{
Globals.settings_KeyManagerItemsPath_Bool.Value = false;
Globals.settings_KeyManagerItemsPath.Value = "";
}
private void SetKeyLocation_OnClick(object sender, RoutedEventArgs e)
{
using(var fbd = new FolderBrowserDialog())
{
DialogResult result = fbd.ShowDialog();
if (result == DialogResult.OK && !string.IsNullOrWhiteSpace(fbd.SelectedPath))
{
Globals.settings_KeyManagerItemsPath_Bool.Value = true;
Globals.settings_KeyManagerItemsPath.Value = fbd.SelectedPath;
//MessageBox.Show("valid path: " + fbd.SelectedPath);
}
}
}
private void SetRpcLocationDefault_OnClick(object sender, RoutedEventArgs e)
{
Globals.settings_RpcItemsPath_Bool.Value = false;
Globals.settings_RpcItemsPath.Value = "";
}
private void SetRpcLocation_OnClick(object sender, RoutedEventArgs e)
{
using(var fbd = new FolderBrowserDialog())
{
DialogResult result = fbd.ShowDialog();
if (result == DialogResult.OK && !string.IsNullOrWhiteSpace(fbd.SelectedPath))
{
Globals.settings_RpcItemsPath_Bool.Value = true;
Globals.settings_RpcItemsPath.Value = fbd.SelectedPath;
}
}
}
private void CheckForUpdateBtn_OnClick(object sender, RoutedEventArgs e)
{
try
{
using(WebClient webClient = new WebClient())
{;
webClient.Headers.Add("Authorization", "Basic :x-oauth-basic");
webClient.Headers.Add("User-Agent","lk-github-clien");
var downloadString = webClient.DownloadString(Globals.apiUrl);
GithubApiResponse ApiResponseData = JsonConvert.DeserializeObject<GithubApiResponse>(downloadString);
if (ApiResponseData.tag_name != Globals.version)
{
Misc.UpdateMessage updateMessage = new UpdateMessage(
ApiResponseData,
"Update Found");
updateMessage.Show();
}
else
{
Misc.Message msg = new Misc.Message("No Updates found");
msg.Show();
}
}
}
catch (Exception ex)
{
Misc.CriticalMessage error = new Misc.CriticalMessage(ex.ToString());
error.Show();
}
WebClient client = new WebClient();
}
private void CreateShortcut_OnClick(object sender, RoutedEventArgs e)
{
try
{
Process p = Process.Start("WeeXnes_UAC.exe", "-CreateStartMenuShortcut");
p.WaitForExit();
}
catch (Exception ex)
{
Misc.CriticalMessage message = new Misc.CriticalMessage(ex.ToString());
message.Show();
}
}
private void CensorKeysSwitch_OnChecked(object sender, RoutedEventArgs e)
{
Globals.settings_KeyManagerCensorKeys.Value = true;
}
private void CensorKeysSwitch_OnUnchecked(object sender, RoutedEventArgs e)
{
Globals.settings_KeyManagerCensorKeys.Value = false;
}
private void OSXSwitch_OnChecked(object sender, RoutedEventArgs e)
{
Globals.settings_osxStyleControlls.Value = true;
}
private void OSXSwitch_OnUnchecked(object sender, RoutedEventArgs e)
{
Globals.settings_osxStyleControlls.Value = false;
}
}
}

View file

@ -1,12 +0,0 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace WeeXnes.MVVM.ViewModel
{
internal class DiscordRpcViewModel
{
}
}

View file

@ -1,12 +0,0 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace WeeXnes.MVVM.ViewModel
{
internal class HomeViewModel
{
}
}

View file

@ -1,12 +0,0 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace WeeXnes.MVVM.ViewModel
{
internal class KeyManagerViewModel
{
}
}

View file

@ -1,62 +0,0 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using WeeXnes.Core;
namespace WeeXnes.MVVM.ViewModel
{
internal class MainViewModel : ObservableObject
{
public RelayCommand HomeViewCommand { get; set; }
public RelayCommand KeyManagerViewCommand { get; set; }
public RelayCommand DiscordRpcViewCommand { get; set; }
public RelayCommand SettingsViewCommand { get; set; }
public HomeViewModel HomeVM { get; set; }
public KeyManagerViewModel KeyManagerVM { get; set; }
public DiscordRpcViewModel DiscordRpcVM { get; set; }
public SettingsViewModel SettingsVM { get; set; }
private object _currentView;
public object CurrentView
{
get { return _currentView; }
set
{
_currentView = value;
OnPropertyChanged();
}
}
public MainViewModel()
{
HomeVM = new HomeViewModel();
KeyManagerVM = new KeyManagerViewModel();
DiscordRpcVM = new DiscordRpcViewModel();
SettingsVM = new SettingsViewModel();
CurrentView = HomeVM;
HomeViewCommand = new RelayCommand(o =>
{
CurrentView = HomeVM;
});
KeyManagerViewCommand = new RelayCommand(o =>
{
CurrentView = KeyManagerVM;
});
DiscordRpcViewCommand = new RelayCommand(o =>
{
CurrentView = DiscordRpcVM;
});
SettingsViewCommand = new RelayCommand(o =>
{
CurrentView = SettingsVM;
});
}
}
}

View file

@ -1,12 +0,0 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace WeeXnes.MVVM.ViewModel
{
internal class SettingsViewModel
{
}
}

View file

@ -1,457 +1,130 @@
<Window x:Class="WeeXnes.MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
xmlns:local="clr-namespace:WeeXnes"
xmlns:viewModel="clr-namespace:WeeXnes.MVVM.ViewModel"
mc:Ignorable="d"
Height="632"
Width="952"
WindowStyle="None"
ResizeMode="NoResize"
Background="Transparent"
AllowsTransparency="True"
Title="WeeXnes"
WindowStartupLocation="CenterScreen"
Loaded="Window_Loaded"
Deactivated="Window_Deactivated"
StateChanged="Window_StateChanged"
Closing="Window_Closing">
<Window.DataContext>
<viewModel:MainViewModel/>
</Window.DataContext>
<Border
CornerRadius="4"
MouseDown="Border_MouseDown"
Name="window_border"
Margin="16">
<Border.Background>
<LinearGradientBrush StartPoint="0 0" EndPoint="1 1">
<LinearGradientBrush.GradientStops>
<GradientStop Offset="0.2" Color="#2c2e36" />
<GradientStop Offset="1" Color="#212329" />
</LinearGradientBrush.GradientStops>
</LinearGradientBrush>
</Border.Background>
<Border.Effect>
<DropShadowEffect BlurRadius="15" Direction="-90"
RenderingBias="Quality" ShadowDepth="0"/>
</Border.Effect>
<Grid>
<ui:UiWindow x:Class="WeeXnes.MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
xmlns:ui="http://schemas.lepo.co/wpfui/2022/xaml"
xmlns:home="clr-namespace:WeeXnes.Views.Home"
xmlns:keymanager="clr-namespace:WeeXnes.Views.KeyManager"
xmlns:settings="clr-namespace:WeeXnes.Views.Settings"
xmlns:discordrpc="clr-namespace:WeeXnes.Views.DiscordRPC"
xmlns:passwordGenerator="clr-namespace:WeeXnes.Views.PasswordGenerator"
xmlns:profile="clr-namespace:WeeXnes.Views.ProfileView"
xmlns:EncryptedTextEditor="clr-namespace:WeeXnes.Views.EncryptedTextEditor"
mc:Ignorable="d"
Height="540"
Width="500"
Title="WeeXnes"
Background="{DynamicResource ApplicationBackgroundBrush}"
ExtendsContentIntoTitleBar="True"
WindowBackdropType="Mica"
WindowStartupLocation="CenterScreen"
Loaded="MainWindow_OnLoaded">
<Grid>
<Grid.RowDefinitions>
<RowDefinition Height="50"/>
<RowDefinition/>
</Grid.RowDefinitions>
<ui:TitleBar
Grid.Row="0"
Title="WeeXnes Suite"
ForceShutdown="False"
MinimizeToTray="True"
ShowHelp="False"
ShowClose="True"
ShowMaximize="True"
ShowMinimize="True"
UseSnapLayout="True"
Name="TitleBar2">
<ui:TitleBar.Tray>
<ui:NotifyIcon Icon="/Images/wicon.png"
LeftClick="NotifyIcon_OnLeftClick">
<ui:NotifyIcon.Menu>
<ContextMenu>
<MenuItem
Header="Start RPC"
Click="ContextStartRpc_OnClick"/>
<MenuItem
Header="Stop RPC"
Click="ContextStopRpc_OnClick"/>
<MenuItem
Header="Exit"
Click="ContextExit_OnClick"/>
</ContextMenu>
</ui:NotifyIcon.Menu>
</ui:NotifyIcon>
</ui:TitleBar.Tray>
</ui:TitleBar>
<Grid Margin="8" Grid.Row="1">
<Grid.ColumnDefinitions>
<ColumnDefinition Width="Auto"/>
<ColumnDefinition/>
<ColumnDefinition Width="Auto" />
<ColumnDefinition Width="*" />
</Grid.ColumnDefinitions>
<Grid.RowDefinitions>
<RowDefinition Height="75"/>
<RowDefinition/>
</Grid.RowDefinitions>
<Image RenderOptions.BitmapScalingMode="HighQuality"
Source="/Images/wicon.png" Grid.Row="0"
HorizontalAlignment="Center" RenderTransformOrigin="0.5,0.5"
Margin="5,0,0,0"
Width="50"
Name="HeaderIcon"
/>
<Border Grid.Row="1" Width="50" Name="NavigationBorder"
Margin="5,0,0,0">
<Border.Triggers>
<!-- Animate the button's Width property. -->
<EventTrigger RoutedEvent="Border.MouseEnter">
<BeginStoryboard>
<Storyboard>
<DoubleAnimation
Storyboard.TargetName="NavigationBorder"
Storyboard.TargetProperty="(Border.Width)"
To="200" Duration="0:0:00.4" AutoReverse="False"
>
<DoubleAnimation.EasingFunction>
<CircleEase EasingMode="EaseInOut"/>
</DoubleAnimation.EasingFunction>
</DoubleAnimation>
</Storyboard>
</BeginStoryboard>
</EventTrigger>
<EventTrigger RoutedEvent="Border.MouseLeave">
<BeginStoryboard>
<Storyboard>
<DoubleAnimation
Storyboard.TargetName="NavigationBorder"
Storyboard.TargetProperty="(Border.Width)"
To="50" Duration="0:0:00.4" AutoReverse="False"
>
<DoubleAnimation.EasingFunction>
<CircleEase EasingMode="EaseInOut"/>
</DoubleAnimation.EasingFunction>
</DoubleAnimation>
</Storyboard>
</BeginStoryboard>
</EventTrigger>
</Border.Triggers>
<StackPanel Name="NavigationBar">
<RadioButton Content="Home"
Height="50"
Foreground="White"
FontSize="14"
Style="{StaticResource HomeMenuButton}"
IsChecked="True"
Command="{Binding HomeViewCommand}"
Name="HomeMenuButton"
Tag="/Images/wicon.png"/>
<RadioButton Content="Key Manager"
Height="50"
Foreground="White"
FontSize="14"
Style="{StaticResource KeyManagerMenuButton}"
Command="{Binding KeyManagerViewCommand}"
Name="KMMenuButton"/>
<RadioButton Content="DiscordRPC"
Height="50"
Foreground="White"
FontSize="14"
Style="{StaticResource DiscordMenuButton}"
Command="{Binding DiscordRpcViewCommand}"
Name="RpcMenuButton"/>
<RadioButton Content="Settings"
Height="50"
Foreground="White"
FontSize="14"
Style="{StaticResource SettingsMenuButton}"
Command="{Binding SettingsViewCommand}"
Name="SettingsMenuButton"/>
</StackPanel>
</Border>
<TextBox Grid.Column="1"
Width="250"
Height="40"
VerticalAlignment="Center"
HorizontalAlignment="Left"
Margin="10,5,5,5"
Style="{StaticResource MaterialTextBox}"
Background="#212329" Tag="Search..."
TextChanged="Searchbox_TextChanged"
Name="Searchbox"
/>
<Button Width="50"
Height="23"
Name="MinimizeBtn"
Click="MinimizeBtn_Click"
Content="―"
FontSize="11"
HorizontalAlignment="Right"
VerticalAlignment="Top"
Margin="0,0,50,0"
Background="#25272e"
Style="{StaticResource ModernMinimizeButton}"
Grid.Column="1"
Visibility="Hidden"
Cursor="Hand">
<Button.Triggers>
<!-- Animate the button's Width property. -->
<EventTrigger RoutedEvent="Button.MouseEnter">
<BeginStoryboard>
<Storyboard>
<ColorAnimation
Storyboard.TargetProperty="(Button.Background).(SolidColorBrush.Color)"
To="#555555" Duration="0:0:00.1" AutoReverse="False"
/>
</Storyboard>
</BeginStoryboard>
</EventTrigger>
<EventTrigger RoutedEvent="Button.MouseLeave">
<BeginStoryboard>
<Storyboard>
<ColorAnimation
Storyboard.TargetProperty="(Button.Background).(SolidColorBrush.Color)"
To="#25272e" Duration="0:0:00.1" AutoReverse="False"
/>
</Storyboard>
</BeginStoryboard>
</EventTrigger>
</Button.Triggers>
</Button>
<Button Width="50"
Height="23"
Name="CloseBtn"
Click="CloseBtn_Click"
Content=""
FontSize="11"
HorizontalAlignment="Right"
VerticalAlignment="Top"
Background="#b82727"
Style="{StaticResource ModernCloseButton}"
Grid.Column="1"
Visibility="Hidden"
Cursor="Hand">
<Button.Triggers>
<!-- Animate the button's Width property. -->
<EventTrigger RoutedEvent="Button.MouseEnter">
<BeginStoryboard>
<Storyboard>
<ColorAnimation
Storyboard.TargetProperty="(Button.Background).(SolidColorBrush.Color)"
To="#b85858" Duration="0:0:00.1" AutoReverse="False"
/>
</Storyboard>
</BeginStoryboard>
</EventTrigger>
<EventTrigger RoutedEvent="Button.MouseLeave">
<BeginStoryboard>
<Storyboard>
<ColorAnimation
Storyboard.TargetProperty="(Button.Background).(SolidColorBrush.Color)"
To="#b82727" Duration="0:0:00.1" AutoReverse="False"
/>
</Storyboard>
</BeginStoryboard>
</EventTrigger>
</Button.Triggers>
</Button>
<DockPanel Grid.Column="1" Margin="0,5,5,5"
Height="23"
VerticalAlignment="Top"
HorizontalAlignment="Right" Visibility="Hidden" Name="OSXControlls">
<Button Name="MinimizeButton" Width="20" BorderThickness="0" Background="Transparent"
Style="{StaticResource OSXButtonStyle}" Click="MinimizeBtn_Click">
<StackPanel>
<Image Source="Images\green.png" Margin="1"/>
</StackPanel>
</Button>
<Button Name="MaximizeButton" Width="20" BorderThickness="0" Background="Transparent"
Style="{StaticResource OSXButtonStyle}">
<StackPanel>
<Image Source="Images\yellow.png" Margin="1"/>
</StackPanel>
</Button>
<Button Name="CloseButton" Width="20" BorderThickness="0" Background="Transparent"
Style="{StaticResource OSXButtonStyle}" Click="CloseBtn_Click">
<StackPanel>
<Image Source="Images\red.png" Margin="1"/>
</StackPanel>
</Button>
</DockPanel>
<ContentControl Grid.Row="1"
Grid.Column="1"
Margin="10"
Content="{Binding CurrentView}"/>
<ui:NavigationStore
Name="NavBar"
Grid.Column="0"
Frame="{Binding ElementName=MainFrame}"
SelectedPageIndex="0">
<ui:NavigationStore.Items>
<ui:NavigationItem
Content="Home"
Icon="Home24"
PageTag="home"
Name="ButtonHome"
PageType="{x:Type home:HomeView}"/>
<ui:NavigationItem
Content="RPC"
Icon="XboxController24"
Name="ButtonRpc"
PageTag="RPC"
PageType="{x:Type discordrpc:DiscordRPCView}"
Loaded="RPCBtn_OnLoaded"/>
<ui:NavigationItem
Content="Keys"
Icon="Key24"
PageTag="Keys"
PageType="{x:Type keymanager:KeyManagerView}"/>
<ui:NavigationItem
Content="Gen."
Icon="Password24"
Name="ButtonPwGen"
PageTag="Gen"
PageType="{x:Type passwordGenerator:PasswordGenView}"/>
<ui:NavigationItem
Content="Editor"
Icon="DocumentOnePage24"
Name="ButtonEncryptedFileEditor"
PageTag="Editor"
PageType="{x:Type EncryptedTextEditor:TextEditorView}"/>
<ui:NavigationItem
Content="Profile"
Icon="InprivateAccount24"
Name="ButtonProfile"
PageTag="Profile"
PageType="{x:Type profile:LoginView}"
Visibility="Collapsed"/>
</ui:NavigationStore.Items>
<ui:NavigationStore.Footer>
<ui:NavigationItem
Content="Settings"
Icon="Settings24"
PageTag="Settings"
PageType="{x:Type settings:SettingsView}"/>
</ui:NavigationStore.Footer>
</ui:NavigationStore>
<Frame
x:Name="MainFrame"
Grid.Column="1"
Margin="8,0,0,0"
/>
</Grid>
</Grid>
</ui:UiWindow>
</Border>
<Window.Resources>
<Style TargetType="Image">
<Setter Property="RenderOptions.BitmapScalingMode" Value="HighQuality" />
</Style>
<SolidColorBrush x:Key="StandardBorderBrush" Color="#888" />
<SolidColorBrush x:Key="StandardBackgroundBrush" Color="Black" />
<SolidColorBrush x:Key="HoverBorderBrush" Color="#DDD" />
<SolidColorBrush x:Key="SelectedBackgroundBrush" Color="Gray" />
<SolidColorBrush x:Key="SelectedForegroundBrush" Color="White" />
<SolidColorBrush x:Key="DisabledForegroundBrush" Color="#888" />
<SolidColorBrush x:Key="GlyphBrush" Color="#444" />
<SolidColorBrush x:Key="NormalBrush" Color="#888" />
<SolidColorBrush x:Key="NormalBorderBrush" Color="#888" />
<SolidColorBrush x:Key="HorizontalNormalBrush" Color="#FF686868" />
<SolidColorBrush x:Key="HorizontalNormalBorderBrush" Color="#888" />
<LinearGradientBrush x:Key="ListBoxBackgroundBrush" StartPoint="0,0" EndPoint="1,0.001">
<GradientBrush.GradientStops>
<GradientStopCollection>
<GradientStop Color="White" Offset="0.0" />
<GradientStop Color="White" Offset="0.6" />
<GradientStop Color="#DDDDDD" Offset="1.2"/>
</GradientStopCollection>
</GradientBrush.GradientStops>
</LinearGradientBrush>
<LinearGradientBrush x:Key="StandardBrush" StartPoint="0,0" EndPoint="0,1">
<GradientBrush.GradientStops>
<GradientStopCollection>
<GradientStop Color="#FFF" Offset="0.0"/>
<GradientStop Color="#CCC" Offset="1.0"/>
</GradientStopCollection>
</GradientBrush.GradientStops>
</LinearGradientBrush>
<LinearGradientBrush x:Key="PressedBrush" StartPoint="0,0" EndPoint="0,1">
<GradientBrush.GradientStops>
<GradientStopCollection>
<GradientStop Color="#BBB" Offset="0.0"/>
<GradientStop Color="#EEE" Offset="0.1"/>
<GradientStop Color="#EEE" Offset="0.9"/>
<GradientStop Color="#FFF" Offset="1.0"/>
</GradientStopCollection>
</GradientBrush.GradientStops>
</LinearGradientBrush>
<Style x:Key="ScrollBarLineButton" TargetType="{x:Type RepeatButton}">
<Setter Property="Visibility" Value="Hidden"/>
<Setter Property="SnapsToDevicePixels" Value="True"/>
<Setter Property="OverridesDefaultStyle" Value="true"/>
<Setter Property="Focusable" Value="false"/>
<Setter Property="Template">
<Setter.Value>
<ControlTemplate TargetType="{x:Type RepeatButton}">
<Border Name="Border" Margin="1" CornerRadius="2" Background="{StaticResource NormalBrush}" BorderBrush="{StaticResource NormalBorderBrush}" BorderThickness="1">
<Path HorizontalAlignment="Center" VerticalAlignment="Center" Fill="{StaticResource GlyphBrush}" Data="{Binding Path=Content, RelativeSource={RelativeSource TemplatedParent}}" />
</Border>
<ControlTemplate.Triggers>
<Trigger Property="IsPressed" Value="true">
<Setter TargetName="Border" Property="Background" Value="{StaticResource PressedBrush}" />
</Trigger>
<Trigger Property="IsEnabled" Value="false">
<Setter Property="Foreground" Value="{StaticResource DisabledForegroundBrush}"/>
</Trigger>
</ControlTemplate.Triggers>
</ControlTemplate>
</Setter.Value>
</Setter>
</Style>
<Style x:Key="ScrollBarPageButton" TargetType="{x:Type RepeatButton}">
<Setter Property="Visibility" Value="Hidden"/>
<Setter Property="SnapsToDevicePixels" Value="True"/>
<Setter Property="OverridesDefaultStyle" Value="true"/>
<Setter Property="IsTabStop" Value="false"/>
<Setter Property="Focusable" Value="false"/>
<Setter Property="Template">
<Setter.Value>
<ControlTemplate TargetType="{x:Type RepeatButton}">
<Border Background="Black" />
</ControlTemplate>
</Setter.Value>
</Setter>
</Style>
<Style x:Key="ScrollBarThumb" TargetType="{x:Type Thumb}">
<Setter Property="SnapsToDevicePixels" Value="True"/>
<Setter Property="OverridesDefaultStyle" Value="true"/>
<Setter Property="IsTabStop" Value="false"/>
<Setter Property="Focusable" Value="false"/>
<Setter Property="Template">
<Setter.Value>
<ControlTemplate TargetType="{x:Type Thumb}">
<Border CornerRadius="4" Background="{TemplateBinding Background}" BorderBrush="{TemplateBinding BorderBrush}" BorderThickness="0" Width="8" Margin="8,0,-2,0"/>
</ControlTemplate>
</Setter.Value>
</Setter>
</Style>
<ControlTemplate x:Key="VerticalScrollBar" TargetType="{x:Type ScrollBar}">
<Grid>
<Grid.RowDefinitions>
<RowDefinition MaxHeight="0"/>
<RowDefinition Height="0.00001*"/>
<RowDefinition MaxHeight="0"/>
</Grid.RowDefinitions>
<Border Grid.RowSpan="3" CornerRadius="2" Background="Transparent" />
<RepeatButton Grid.Row="0" Style="{StaticResource ScrollBarLineButton}" Height="18" Command="ScrollBar.LineUpCommand" Content="M 0 4 L 8 4 L 4 0 Z" />
<Track Name="PART_Track" Grid.Row="1" IsDirectionReversed="true">
<Track.DecreaseRepeatButton>
<RepeatButton Style="{StaticResource ScrollBarPageButton}" Command="ScrollBar.PageUpCommand" />
</Track.DecreaseRepeatButton>
<Track.Thumb>
<Thumb Style="{StaticResource ScrollBarThumb}" Margin="1,0,1,0" Background="{StaticResource HorizontalNormalBrush}" BorderBrush="{StaticResource HorizontalNormalBorderBrush}" />
</Track.Thumb>
<Track.IncreaseRepeatButton>
<RepeatButton Style="{StaticResource ScrollBarPageButton}" Command="ScrollBar.PageDownCommand" />
</Track.IncreaseRepeatButton>
</Track>
<RepeatButton Grid.Row="3" Style="{StaticResource ScrollBarLineButton}" Height="18" Command="ScrollBar.LineDownCommand" Content="M 0 0 L 4 4 L 8 0 Z"/>
</Grid>
</ControlTemplate>
<ControlTemplate x:Key="HorizontalScrollBar" TargetType="{x:Type ScrollBar}">
<Grid>
<Grid.ColumnDefinitions>
<ColumnDefinition MaxWidth="18"/>
<ColumnDefinition Width="0.00001*"/>
<ColumnDefinition MaxWidth="18"/>
</Grid.ColumnDefinitions>
<Border Grid.ColumnSpan="3" CornerRadius="2" Background="#F0F0F0"/>
<RepeatButton Grid.Column="0" Style="{StaticResource ScrollBarLineButton}" Width="18" Command="ScrollBar.LineLeftCommand" Content="M 4 0 L 4 8 L 0 4 Z" />
<Track Name="PART_Track" Grid.Column="1" IsDirectionReversed="False">
<Track.DecreaseRepeatButton>
<RepeatButton Style="{StaticResource ScrollBarPageButton}" Command="ScrollBar.PageLeftCommand" />
</Track.DecreaseRepeatButton>
<Track.Thumb>
<Thumb Style="{StaticResource ScrollBarThumb}" Margin="0,1,0,1" Background="{StaticResource NormalBrush}" BorderBrush="{StaticResource NormalBorderBrush}" />
</Track.Thumb>
<Track.IncreaseRepeatButton>
<RepeatButton Style="{StaticResource ScrollBarPageButton}" Command="ScrollBar.PageRightCommand" />
</Track.IncreaseRepeatButton>
</Track>
<RepeatButton Grid.Column="3" Style="{StaticResource ScrollBarLineButton}" Width="18" Command="ScrollBar.LineRightCommand" Content="M 0 0 L 4 4 L 0 8 Z"/>
</Grid>
</ControlTemplate>
<Style x:Key="{x:Type ScrollBar}" TargetType="{x:Type ScrollBar}">
<Setter Property="SnapsToDevicePixels" Value="True"/>
<Setter Property="OverridesDefaultStyle" Value="true"/>
<Style.Triggers>
<Trigger Property="Orientation" Value="Horizontal">
<Setter Property="Width" Value="Auto"/>
<Setter Property="Height" Value="18" />
<Setter Property="Template" Value="{StaticResource HorizontalScrollBar}" />
</Trigger>
<Trigger Property="Orientation" Value="Vertical">
<Setter Property="Width" Value="18"/>
<Setter Property="Height" Value="Auto" />
<Setter Property="Template" Value="{StaticResource VerticalScrollBar}" />
</Trigger>
</Style.Triggers>
</Style>
<Style x:Key="FavsScrollViewer" TargetType="{x:Type ScrollViewer}">
<Setter Property="OverridesDefaultStyle" Value="True"/>
<Setter Property="Template">
<Setter.Value>
<ControlTemplate TargetType="{x:Type ScrollViewer}">
<Grid>
<Grid.ColumnDefinitions>
<ColumnDefinition Width="Auto"/>
<ColumnDefinition/>
</Grid.ColumnDefinitions>
<Grid.RowDefinitions>
<RowDefinition/>
<RowDefinition Height="Auto"/>
</Grid.RowDefinitions>
<ScrollContentPresenter Grid.Column="1"/>
<ScrollBar Name="PART_VerticalScrollBar" Value="{TemplateBinding VerticalOffset}" Maximum="{TemplateBinding ScrollableHeight}" ViewportSize="{TemplateBinding ViewportHeight}" Visibility="{TemplateBinding ComputedVerticalScrollBarVisibility}"/>
<ScrollBar Name="PART_HorizontalScrollBar" Orientation="Horizontal" Grid.Row="1" Grid.Column="1" Value="{TemplateBinding HorizontalOffset}" Maximum="{TemplateBinding ScrollableWidth}" ViewportSize="{TemplateBinding ViewportWidth}" Visibility="{TemplateBinding ComputedHorizontalScrollBarVisibility}"/>
</Grid>
</ControlTemplate>
</Setter.Value>
</Setter>
</Style>
</Window.Resources>
</Window>

View file

@ -1,189 +1,72 @@
using System;
using System.ComponentModel;
using System.IO;
using System.Text;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Forms;
using System.Windows.Input;
using System.Windows.Media;
using WeeXnes.Core;
using WeeXnes.MVVM.View;
using ButtonBase = System.Windows.Controls.Primitives.ButtonBase;
using NotifyIcon = Wpf.Ui.Controls.NotifyIcon;
namespace WeeXnes
{
/// <summary>
/// Interaktionslogik für MainWindow.xaml
/// </summary>
public partial class MainWindow : Window
public partial class MainWindow
{
System.Windows.Forms.NotifyIcon trayIcon = new System.Windows.Forms.NotifyIcon();
private ContextMenuStrip trayIconMenu = new ContextMenuStrip();
public MainWindow()
{
buildTrayMenu();
trayIcon.Icon = System.Drawing.Icon.ExtractAssociatedIcon(System.Reflection.Assembly.GetEntryAssembly().ManifestModule.Name);
trayIcon.Visible = false;
trayIcon.DoubleClick += TrayIcon_DoubleClick;
trayIcon.ContextMenuStrip = trayIconMenu;
InitializeComponent();
Wpf.Ui.Appearance.Accent.ApplySystemAccent();
EnableDebugOptions();
}
private void buildTrayMenu()
private void EnableDebugOptions()
{
trayIconMenu.Items.Add("Show Window",null, (sender, args) =>
{
this.Show();
this.WindowState = WindowState.Normal;
trayIcon.Visible = false;
});
//RPC MENU//////////////////////////////////////////////////////////////////////////////////////
//monke
ToolStripMenuItem DiscordMenu = new ToolStripMenuItem("DiscordRPC");
DiscordMenu.DropDownItems.Add("Stop DiscordRPC",null, (sender, args) =>
{
controllRpcFromTray(false);
});
DiscordMenu.DropDownItems.Add("Start DiscordRPC",null, (sender, args) =>
{
controllRpcFromTray(true);
});
trayIconMenu.Items.Add(DiscordMenu);
////////////////////////////////////////////////////////////////////////////////////////////
trayIconMenu.Items.Add("Exit",null, (sender, args) =>
{
this.Close();
});
trayIconMenu.Opening += (sender, args) =>
{
};
if(!App.DebugMode)
return;
//Code to be enabled in Debug mode
}
public void controllRpcFromTray(bool start)
private void RPCBtn_OnLoaded(object sender, RoutedEventArgs e)
{
//set tray controlls.
if (start)
if (HandleLaunchArguments.Data.Autostart)
{
HomeMenuButton.Command.Execute(null);
HomeMenuButton.IsChecked = true;
Globals.info_RpcAutoStart = true;
RpcMenuButton.Command.Execute(null);
RpcMenuButton.IsChecked = true;
}
else
{
HomeMenuButton.Command.Execute(null);
HomeMenuButton.IsChecked = true;
ButtonRpc.RaiseEvent(new RoutedEventArgs(ButtonBase.ClickEvent));
MainFrame.Source = new Uri("/Views/DiscordRPC/RunRPCView.xaml",UriKind.Relative);
this.Visibility = Visibility.Collapsed;
this.ShowInTaskbar = false;
}
}
private void TrayIcon_DoubleClick(object sender, EventArgs e)
private void ContextStartRpc_OnClick(object sender, RoutedEventArgs e)
{
ButtonRpc.RaiseEvent(new RoutedEventArgs(ButtonBase.ClickEvent));
MainFrame.Source = new Uri("/Views/DiscordRPC/RunRPCView.xaml",UriKind.Relative);
}
private void ContextStopRpc_OnClick(object sender, RoutedEventArgs e)
{
ButtonHome.RaiseEvent(new RoutedEventArgs(ButtonBase.ClickEvent));
}
private void NotifyIcon_OnLeftClick(NotifyIcon sender, RoutedEventArgs e)
{
this.ShowInTaskbar = true;
this.Show();
this.WindowState = WindowState.Normal;
trayIcon.Visible = false;
}
private void ContextExit_OnClick(object sender, RoutedEventArgs e)
{
Environment.Exit(0);
}
private void Window_Loaded(object sender, RoutedEventArgs e)
private void MainWindow_OnLoaded(object sender, RoutedEventArgs e)
{
CheckForFolders();
CheckForSettingsFile();
CheckForAutoStartup();
}
private void CheckForSettingsFile()
{
//SettingView.CheckSetting();
SettingsManager.start();
if (Globals.settings_osxStyleControlls.Value)
foreach (var plugin in Global.pluginManager.CurrentPlugins)
{
OSXControlls.Visibility = Visibility.Visible;
NavBar.Items.Add(plugin.NavIcon);
}
else
{
MinimizeBtn.Visibility = Visibility.Visible;
CloseBtn.Visibility = Visibility.Visible;
}
}
private void Border_MouseDown(object sender, MouseButtonEventArgs e)
{
if (e.ChangedButton == MouseButton.Left)
this.DragMove();
}
private void Searchbox_TextChanged(object sender, TextChangedEventArgs e)
{
Globals.searchbox_content.Value = Searchbox.Text;
}
private void CloseBtn_Click(object sender, RoutedEventArgs e)
{
if (Globals.info_isRpcRunning)
{
WindowState = WindowState.Minimized;
}
else
{
this.Close();
}
}
private void MinimizeBtn_Click(object sender, RoutedEventArgs e)
{
WindowState = WindowState.Minimized;
}
private void CheckForAutoStartup()
{
if (Globals.info_RpcAutoStart)
{
WindowState = WindowState.Minimized;
RpcMenuButton.Command.Execute(null);
RpcMenuButton.IsChecked = true;
}
}
private void CheckForFolders()
{
if (!Directory.Exists(Globals.AppDataPath))
{
Directory.CreateDirectory(Globals.AppDataPath);
Console.WriteLine("Created AppDataPath");
}
}
private void Window_Deactivated(object sender, EventArgs e)
{
Window window = (Window)sender;
if (Globals.settings_alwaysOnTop.Value)
{
window.Topmost = true;
}
else
{
window.Topmost = false;
}
}
private void Window_StateChanged(object sender, EventArgs e)
{
if (WindowState == System.Windows.WindowState.Minimized)
{
this.Hide();
trayIcon.Visible = true;
}
}
private void Window_Closing(object sender, CancelEventArgs e)
{
trayIcon.Dispose();
}
}
}

View file

@ -1,54 +0,0 @@
<Window x:Class="WeeXnes.Misc.CriticalMessage"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:local="clr-namespace:WeeXnes.Misc"
mc:Ignorable="d"
Title="Message" Height="150" Width="300"
ResizeMode="NoResize"
WindowStartupLocation="CenterScreen"
SizeToContent="WidthAndHeight"
Background="Transparent"
AllowsTransparency="True"
WindowStyle="None">
<Border CornerRadius="4"
Margin="16"
MouseDown="UIElement_OnMouseDown">
<Border.Background>
<LinearGradientBrush StartPoint="0 0" EndPoint="1 1">
<LinearGradientBrush.GradientStops>
<GradientStop Offset="0.2" Color="#8a1c2c" />
<GradientStop Offset="1" Color="#751e2c" />
</LinearGradientBrush.GradientStops>
</LinearGradientBrush>
</Border.Background>
<Border.Effect>
<DropShadowEffect BlurRadius="15" Direction="-90"
RenderingBias="Quality" ShadowDepth="0"/>
</Border.Effect>
<Grid>
<Grid.RowDefinitions>
<RowDefinition/>
<RowDefinition/>
</Grid.RowDefinitions>
<Label Content="Placeholder"
Name="MessageLabel"
Foreground="White"
VerticalAlignment="Center"
HorizontalAlignment="Center"
Padding="100,20,100,20"/>
<Button Grid.Row="1"
Style="{StaticResource UniversalMaterialButton}"
Content="OK"
Width="140"
Height="40"
Foreground="DarkGray"
Background="#520b16"
Name="okButton"
Click="okButton_Click"
Margin="0,0,0,20"/>
</Grid>
</Border>
</Window>

View file

@ -1,26 +0,0 @@
using System.Windows;
using System.Windows.Input;
namespace WeeXnes.Misc
{
public partial class CriticalMessage : Window
{
public CriticalMessage(string _message, string _title = "Message")
{
InitializeComponent();
MessageLabel.Content = _message;
this.Title = _title;
}
private void okButton_Click(object sender, RoutedEventArgs e)
{
this.Close();
}
private void UIElement_OnMouseDown(object sender, MouseButtonEventArgs e)
{
if (e.ChangedButton == MouseButton.Left)
this.DragMove();
}
}
}

View file

@ -1,305 +0,0 @@
/**
* Copyright by Nocksoft
* https://www.nocksoft.de
* https://nocksoft.de/tutorials/visual-c-sharp-arbeiten-mit-ini-dateien/
* https://github.com/Nocksoft/INIFile
* -----------------------------------
* Author: Rafael Nockmann @ Nocksoft
* Updated: 2017-08-23
* Version: 1.0.3
*
* Language: Visual C#
*
* License: MIT license
*
* Description:
* Provides basic functions for working with INI files.
*
* ##############################################################################################
*/
using System;
using System.Collections.Generic;
using System.Linq;
using System.IO;
namespace Nocksoft.IO.ConfigFiles
{
public class INIFile
{
private string _File;
/// <summary>
/// Aufruf des Konstruktors initialisiert ein Objekt der Klasse INIFile.
/// </summary>
/// <param name="file">INI-Datei, auf der zugegriffen werden soll.</param>
/// <param name="createFile">Gibt an, ob die Datei erstellt werden soll, wenn diese nicht vorhanden ist.</param>
public INIFile(string file, bool createFile = false)
{
if (createFile == true && File.Exists(file) == false)
{
FileInfo fileInfo = new FileInfo(file);
FileStream fileStream = fileInfo.Create();
fileStream.Close();
}
_File = file;
}
#region Öffentliche Methoden
/// <summary>
/// Entfernt alle Kommentare und leeren Zeilen aus einer kompletten Section und gibt diese zurück.
/// Die Methode ist nicht Case-sensitivity und ignoriert daher Groß- und Kleinschreibung.
/// Der Rückgabewert enthält keine Leerzeichen.
/// </summary>
/// <param name="section">Name der angeforderten Section.</param>
/// <param name="getComments">Gibt an, ob Kommentare berücksichtigt werden sollen.</param>
/// <returns>Gibt die komplette Section zurück.</returns>
public List<string> GetSection(string section, bool getComments = false)
{
// Stellt sicher, dass eine Section immer im folgenden Format vorliegt: [section]
section = CheckSection(section);
List<string> completeSection = new List<string>();
bool sectionStart = false;
// Liest die Zieldatei ein
string[] fileArray = File.ReadAllLines(_File);
foreach (var item in fileArray)
{
if (item.Length <= 0) continue;
// Wenn die gewünschte Section erreicht ist
if (item.Replace(" ", "").ToLower() == section)
{
sectionStart = true;
}
// Wenn auf eine neue Section getroffen wird, wird die Schleife beendet
if (sectionStart == true && item.Replace(" ", "").ToLower() != section && item.Replace(" ", "").Substring(0, 1) == "[" && item.Replace(" ", "").Substring(item.Length - 1, 1) == "]")
{
break;
}
if (sectionStart == true)
{
// Wenn der Eintrag kein Kommentar und kein leerer Eintrag ist, wird er der List<string> completeSection hinzugefügt
if (getComments == false
&& item.Replace(" ", "").Substring(0, 1) != ";" && !string.IsNullOrWhiteSpace(item))
{
completeSection.Add(ReplaceScpacesAtStartAndEnd(item));
}
if (getComments == true && !string.IsNullOrWhiteSpace(item))
{
completeSection.Add(ReplaceScpacesAtStartAndEnd(item));
}
}
}
return completeSection;
}
/// <summary>
/// Die Methode gibt einen Wert zum dazugehörigen Key zurück.
/// Die Methode ist nicht Case-sensitivity und ignoriert daher Groß- und Kleinschreibung.
/// </summary>
/// <param name="section">Name der angeforderten Section.</param>
/// <param name="key">Name des angeforderten Keys.</param>
/// <param name="convertKeyToLower">Wenn "true" übergeben wird, wird der Rückgabewert in Kleinbuchstaben zurückgegeben.</param>
/// <returns>Gibt, wenn vorhanden, den Wert zu dem angegebenen Key in der angegeben Section zurück.</returns>
public string GetValue(string section, string key, bool convertValueToLower = false)
{
// Stellt sicher, dass eine Section immer im folgenden Format vorliegt: [section]
section = CheckSection(section);
key = key.ToLower();
List<string> completeSection = GetSection(section);
foreach (var item in completeSection)
{
// In Schleife fortfahren, wenn kein Key
if (!item.Contains("=") && item.Contains("[") && item.Contains("]")) continue;
string[] keyAndValue = item.Split(new string[] { "=" }, StringSplitOptions.RemoveEmptyEntries);
if (keyAndValue[0].ToLower() == key && keyAndValue.Count() > 1)
{
if (convertValueToLower == true)
{
keyAndValue[1] = keyAndValue[1].ToLower();
}
return keyAndValue[1];
}
}
return null;
}
/// <summary>
/// Ändert einen Wert des dazugehörigen Schlüssels in der angegebenen Section.
/// </summary>
/// <param name="section">Name der Section, in dem sich der Schlüssel befindet.</param>
/// <param name="key">Name des Schlüssels, dessen Wert geändert werden soll.</param>
/// <param name="value">Neuer Wert.</param>
/// <param name="convertValueToLower">Wenn "true" übergeben wird, wird der Wert in Kleinbuchstaben gespeichert.</param>
public void SetValue(string section, string key, string value, bool convertValueToLower = false)
{
// Stellt sicher, dass eine Section immer im folgenden Format vorliegt: [section]
section = CheckSection(section);
string keyToLower = key.ToLower();
// Prüft, ob die gesuchte Section gefunden wurde
bool sectionFound = false;
List<string> newFileContent = new List<string>();
// Liest die Zieldatei ein
string[] fileLines = File.ReadAllLines(_File);
// Wenn die Zieldatei leer ist...
if (fileLines.Length <= 0)
{
newFileContent = CreateSection(newFileContent, section, value, key, convertValueToLower);
WriteFile(newFileContent);
return;
}
// ...sonst wird jede Zeile durchsucht
for (int i = 0; i < fileLines.Length; i++)
{
// Option 1 -> Gewünschte Section wurde (noch) nicht gefunden
if (fileLines[i].Replace(" ", "").ToLower() != section)
{
newFileContent.Add(fileLines[i]);
// Wenn Section nicht vorhanden ist, wird diese erzeugt
if (i == fileLines.Length - 1 && fileLines[i].Replace(" ", "").ToLower() != section && sectionFound == false)
{
newFileContent.Add(null);
newFileContent = CreateSection(newFileContent, section, value, key, convertValueToLower);
break;
}
continue;
}
// Option 2 -> Gewünschte Section wurde gefunden
sectionFound = true;
// Enthält die komplette Section, in der sich der Zielschlüssel befindet
List<string> targetSection = GetSection(section, true);
// Jeden Eintrag in der Section, in der sich der Zielschlüssel befindet, durchgehen
for (int x = 0; x < targetSection.Count; x++)
{
string[] targetKey = targetSection[x].Split(new string[] { "=" }, StringSplitOptions.None);
// Wenn der Zielschlüssel gefunden ist
if (targetKey[0].ToLower() == keyToLower)
{
// Prüft, in welcher Schreibweise die Werte abgespeichert werden sollen
if (convertValueToLower == true)
{
newFileContent.Add(keyToLower + "=" + value.ToLower());
}
else
{
newFileContent.Add(key + "=" + value);
}
i = i + x;
break;
}
else
{
newFileContent.Add(targetSection[x]);
// Wenn Key nicht vorhanden ist, wird dieser erzeugt
if (x == targetSection.Count - 1 && targetKey[0].ToLower() != keyToLower)
{
// Prüft, in welcher Schreibweise die Werte abgespeichert werden sollen
if (convertValueToLower == true)
{
newFileContent.Add(keyToLower + "=" + value.ToLower());
}
else
{
newFileContent.Add(key + "=" + value);
}
i = i + x;
break;
}
}
}
}
WriteFile(newFileContent);
}
#endregion
#region Private Methoden
/// <summary>
/// Stellt sicher, dass eine Section immer im folgenden Format vorliegt: [section]
/// </summary>
/// <param name="section">Section, die auf korrektes Format geprüft werden soll.</param>
/// <returns>Gibt Section in dieser Form zurück: [section]</returns>
private string CheckSection(string section)
{
section = section.ToLower();
if (section.Substring(0, 1) != "[" && section.Substring(section.Length - 1, 1) != "]")
{
section = "[" + section + "]";
}
return section;
}
/// <summary>
/// Entfernt voranstehende und hintenstehende Leerzeichen bei Sections, Keys und Values.
/// </summary>
/// <param name="item">String, der gekürzt werden soll.</param>
/// <returns>Gibt einen gekürzten String zurück.</returns>
private string ReplaceScpacesAtStartAndEnd(string item)
{
// Wenn der Eintrag einen Schlüssel und einen Wert hat
if (item.Contains("=") && !item.Contains("[") && !item.Contains("]"))
{
string[] keyAndValue = item.Split(new string[] { "=" }, StringSplitOptions.None);
return keyAndValue[0].Trim() + "=" + keyAndValue[1].Trim();
}
return item.Trim();
}
/// <summary>
/// Legt eine neue Section an.
/// </summary>
/// <param name="newSettings">Liste newSettings aus SetValue.</param>
/// <param name="section">section die angelegt werden soll.</param>
/// <param name="value">Wert der hinzugefügt werden soll.</param>
/// <param name="key">Schlüssel der hinzugefügt werden soll.</param>
/// <param name="convertValueToLower">Gibt an, ob Schlüssel und Wert in Kleinbuchstaben abgespeichert werden sollen.</param>
/// <returns></returns>
private List<string> CreateSection(List<string> newSettings, string section, string value, string key, bool convertValueToLower)
{
string keyToLower = key.ToLower();
newSettings.Add(section);
// Prüft, in welcher Schreibweise die Werte abgespeichert werden sollen
if (convertValueToLower == true)
{
newSettings.Add(keyToLower + "=" + value.ToLower());
}
else
{
newSettings.Add(key + "=" + value);
}
return newSettings;
}
private void WriteFile(List<string> content)
{
StreamWriter writer = new StreamWriter(_File);
foreach (var item in content)
{
writer.WriteLine(item);
}
writer.Close();
}
#endregion
}
}

View file

@ -1,54 +0,0 @@
<Window x:Class="WeeXnes.Misc.Message"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
xmlns:local="clr-namespace:WeeXnes.Misc"
mc:Ignorable="d"
Title="Message" Height="150" Width="300"
ResizeMode="NoResize"
WindowStartupLocation="CenterScreen"
SizeToContent="WidthAndHeight"
Background="Transparent"
AllowsTransparency="True"
WindowStyle="None">
<Border CornerRadius="4"
Margin="16"
MouseDown="UIElement_OnMouseDown">
<Border.Background>
<LinearGradientBrush StartPoint="0 0" EndPoint="1 1">
<LinearGradientBrush.GradientStops>
<GradientStop Offset="0.2" Color="#212329" />
<GradientStop Offset="1" Color="#1f2026" />
</LinearGradientBrush.GradientStops>
</LinearGradientBrush>
</Border.Background>
<Border.Effect>
<DropShadowEffect BlurRadius="15" Direction="-90"
RenderingBias="Quality" ShadowDepth="0"/>
</Border.Effect>
<Grid>
<Grid.RowDefinitions>
<RowDefinition/>
<RowDefinition/>
</Grid.RowDefinitions>
<Label Content="Placeholder"
Name="MessageLabel"
Foreground="White"
VerticalAlignment="Center"
HorizontalAlignment="Center"
Padding="100,20,100,20"/>
<Button Grid.Row="1"
Style="{StaticResource UniversalMaterialButton}"
Content="OK"
Width="140"
Height="40"
Background="#2f313b"
Foreground="DarkGray"
Name="okButton"
Click="okButton_Click"
Margin="0,0,0,20"/>
</Grid>
</Border>
</Window>

View file

@ -1,40 +0,0 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Data;
using System.Windows.Documents;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Imaging;
using System.Windows.Shapes;
namespace WeeXnes.Misc
{
/// <summary>
/// Interaktionslogik für Message.xaml
/// </summary>
public partial class Message : Window
{
public Message(string _message, string _title = "Message")
{
InitializeComponent();
MessageLabel.Content = _message;
this.Title = _title;
}
private void okButton_Click(object sender, RoutedEventArgs e)
{
this.Close();
}
private void UIElement_OnMouseDown(object sender, MouseButtonEventArgs e)
{
if (e.ChangedButton == MouseButton.Left)
this.DragMove();
}
}
}

View file

@ -1,79 +0,0 @@
<Window x:Class="WeeXnes.Misc.UpdateMessage"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
xmlns:local="clr-namespace:WeeXnes.Misc"
mc:Ignorable="d"
Title="Message" Height="158" Width="308"
ResizeMode="NoResize"
Background="Transparent"
AllowsTransparency="True"
WindowStyle="None"
WindowStartupLocation="CenterScreen"
SizeToContent="WidthAndHeight">
<Window.Resources>
<Style TargetType="Image">
<Setter Property="RenderOptions.BitmapScalingMode" Value="HighQuality" />
</Style>
</Window.Resources>
<Border CornerRadius="4"
Margin="16"
MouseDown="UIElement_OnMouseDown">
<Border.Background>
<LinearGradientBrush StartPoint="0 0" EndPoint="1 1">
<LinearGradientBrush.GradientStops>
<GradientStop Offset="0.2" Color="#212329" />
<GradientStop Offset="1" Color="#1f2026" />
</LinearGradientBrush.GradientStops>
</LinearGradientBrush>
</Border.Background>
<Border.Effect>
<DropShadowEffect BlurRadius="15" Direction="-90"
RenderingBias="Quality" ShadowDepth="0"/>
</Border.Effect>
<Grid>
<Grid.RowDefinitions>
<RowDefinition/>
<RowDefinition/>
</Grid.RowDefinitions>
<Label Content="Placeholder"
Name="MessageLabel"
Foreground="White"
VerticalAlignment="Center"
HorizontalAlignment="Center"
Padding="100,20,100,20"/>
<StackPanel Grid.Row="1" Orientation="Horizontal" HorizontalAlignment="Center">
<Button Grid.Row="1"
Style="{StaticResource UniversalMaterialButton}"
Content="OK"
Width="140"
Height="40"
Foreground="DarkGray"
Background="#2f313b"
Name="okButton"
Click="OkButton_OnClick"
Margin="0,0,10,20"/>
<Button Grid.Row="1"
Style="{StaticResource UniversalMaterialButton}"
Content="CANCEL"
Width="140"
Height="40"
Foreground="DarkGray"
Background="#2f313b"
Name="cancelButton"
Click="CancelButton_OnClick"
Margin="10,0,0,20"/>
</StackPanel>
</Grid>
</Border>
</Window>

View file

@ -1,69 +0,0 @@
using System;
using System.Diagnostics;
using System.IO;
using System.Net;
using System.Windows;
using System.Windows.Input;
using WeeXnes.Core;
using Application = System.Windows.Forms.Application;
namespace WeeXnes.Misc
{
public partial class UpdateMessage : Window
{
public static GithubApiResponse GitHub;
public UpdateMessage(GithubApiResponse _GitHub, string _title = "Message")
{
InitializeComponent();
string content = "Your Version: " + Globals.version + "\n" +
"Current Version: " + _GitHub.tag_name;
MessageLabel.Content = content;
this.Title = _title;
GitHub = _GitHub;
}
public static void downloadAssets()
{
checkForFile();
WebClient client = new WebClient();
client.DownloadFile(GitHub.assets[0].browser_download_url, GitHub.assets[0].name);
client.Dispose();
}
private static void checkForFile()
{
if (File.Exists(GitHub.assets[0].name))
{
File.Delete(GitHub.assets[0].name);
}
}
private void OkButton_OnClick(object sender, RoutedEventArgs e)
{
downloadAssets();
try
{
string path = Application.StartupPath;
string fileName = Path.GetFileName(Application.ExecutablePath);
string pid = Process.GetCurrentProcess().Id.ToString();
Process updateProc = Process.Start("Update.exe", "\"" + path + "\"" + " " + "\"" + fileName + "\"" + " " + "\"" + pid + "\"" + " " + "\"" + GitHub.assets[0].name + "\"");
}
catch (Exception ex)
{
Misc.Message message = new Misc.Message(ex.ToString());
message.Show();
}
this.Close();
}
private void CancelButton_OnClick(object sender, RoutedEventArgs e)
{
this.Close();
}
private void UIElement_OnMouseDown(object sender, MouseButtonEventArgs e)
{
if (e.ChangedButton == MouseButton.Left)
this.DragMove();
}
}
}

View file

@ -1,82 +0,0 @@
#pragma warning disable CS0168
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace wx
{
public class wxfile
{
public string path { get; set; }
public wxfile(string _path)
{
this.path = _path;
}
public string GetName()
{
string returnval = null;
string[] rawcontent = wxfilefuncs.readFile(this.path);
if (wxfilefuncs.verify(rawcontent))
{
try
{
returnval = rawcontent[1];
}
catch (Exception e)
{
returnval = null;
}
}
return returnval;
}
public string GetValue()
{
string returnval = null;
string[] rawcontent = wxfilefuncs.readFile(this.path);
if (wxfilefuncs.verify(rawcontent))
{
try
{
returnval = rawcontent[2];
}catch (Exception e)
{
returnval = null;
}
}
return returnval;
}
}
public class wxfilefuncs
{
public static string[] readFile(string filepath)
{
string[] lines = System.IO.File.ReadAllLines(filepath);
var listOfStrings = new List<string>();
foreach (string line in lines)
{
listOfStrings.Add(line);
}
string[] arrayOfStrings = listOfStrings.ToArray();
return arrayOfStrings;
}
public static bool verify(string[] content)
{
bool integ = false;
if(content != null)
{
if(content[0] == "##WXfile##")
{
integ = true;
}
}
return integ;
}
}
}

View file

@ -1,142 +0,0 @@
using System;
using System.Collections.Generic;
using System.Diagnostics;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using WeeXnes.Core;
using WeeXnes.MVVM.View;
using DiscordRPC;
using DiscordRPC.Message;
using EventType = WeeXnes.Core.EventType;
namespace WeeXnes.RPC
{
class EventCache
{
public static string cache1 = "";
}
public class Game
{
public DiscordRpcClient client { get; set; }
public string id { get; set; }
public string state { get; set; }
public string details { get; set; }
public string ProcessName { get; set; }
public string Name { get; set; }
public string bigimgkey { get; set; }
public string smallimgkey { get; set; }
public string bigimgtext { get; set; }
public string smallimgtext { get; set; }
public bool isRunning { get; set; }
public string fileName { get; set; }
public Game(string _fileName, string _name, string _pname = null, string _id = null, string _state = null, string _details = null, string _bigimgkey = null, string _smallimgkey = null, string _bigimgtext = null, string _smallimgtext = null)
{
this.fileName = _fileName;
this.id = _id;
this.state = _state;
this.details = _details;
this.Name = _name;
this.ProcessName = _pname;
this.bigimgkey = _bigimgkey;
this.smallimgkey = _smallimgkey;
this.bigimgtext = _bigimgtext;
this.smallimgtext = _smallimgtext;
this.client = new DiscordRpcClient(id);
}
public void start()
{
if (!client.IsInitialized)
{
client.Initialize();
}
client.OnReady += ClientOnOnReady;
client.OnPresenceUpdate += ClientOnOnPresenceUpdate;
client.SetPresence(new RichPresence()
{
Details = this.details,
State = this.state,
Assets = new Assets()
{
LargeImageKey = this.bigimgkey,
LargeImageText = this.bigimgtext,
SmallImageKey = this.smallimgkey,
SmallImageText = this.smallimgtext
}
});
if (Globals.settings_RpcShowElapsedTime.Value)
{
client.UpdateStartTime();
}
}
private void ClientOnOnPresenceUpdate(object sender, PresenceMessage args)
{
DiscordRpcView.logContent = new customEvent("[" + this.ProcessName + ".exe] ➜ Received Update on " + args.Name, EventType.RPCUpdateEvent);
DiscordRpcView.triggerLogupdate.Value = "nlejgmolegjog";
}
private void ClientOnOnReady(object sender, ReadyMessage args)
{
DiscordRpcView.logContent = new customEvent("[" + this.ProcessName + ".exe] ➜ Received Ready from user " + args.User.Username, EventType.RPCReadyEvent);
DiscordRpcView.triggerLogupdate.Value = "nlejgmolegjog";
}
public void stop()
{
if (this.client.IsInitialized)
{
client.ClearPresence();
client.OnReady -= ClientOnOnReady;
client.OnPresenceUpdate -= ClientOnOnPresenceUpdate;
}
}
public void checkState(Process[] processes)
{
if(!String.IsNullOrEmpty(this.ProcessName))
{
if (!String.IsNullOrEmpty(this.id))
{
bool foundProcess = false;
foreach (Process process in processes)
{
if (process.ProcessName == this.ProcessName)
{
foundProcess = true;
}
}
if (!this.isRunning)
{
if (foundProcess)
{
start();
DiscordRpcView.logContent = new customEvent("↪ " + this.Name + " [" + this.ProcessName + ".exe] started", EventType.ProcessStartedEvent);
DiscordRpcView.triggerLogupdate.Value = "nlejgmolegjog";
this.isRunning = true;
}
}
if (this.isRunning)
{
if (!foundProcess)
{
stop();
DiscordRpcView.logContent = new customEvent( "↩ " + this.Name + " [" + this.ProcessName + ".exe] closed", EventType.ProcessStoppedEvent);
DiscordRpcView.triggerLogupdate.Value = "nlejgmolegjog";
this.isRunning = false;
}
}
}
}
}
public override string ToString()
{
return this.Name;
}
}
}

View file

@ -1,91 +0,0 @@
<ResourceDictionary xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml">
<Style TargetType="{x:Type Button}"
x:Key="ModernCloseButton">
<Setter Property="Template">
<Setter.Value>
<ControlTemplate TargetType="{x:Type Button}">
<Border CornerRadius="0"
Background="{TemplateBinding Property=Background}">
<Grid>
<Rectangle StrokeThickness="1"/>
<TextBlock Text="{TemplateBinding Property=Content}"
HorizontalAlignment="Center"
VerticalAlignment="Center"
Foreground="DarkGray"
Margin="0,0,0,5"/>
</Grid>
</Border>
<ControlTemplate.Triggers>
<Trigger Property="IsMouseOver" Value="True">
<Setter Property="Background" Value="Transparent" />
</Trigger>
</ControlTemplate.Triggers>
</ControlTemplate>
</Setter.Value>
</Setter>
</Style>
<Style TargetType="{x:Type Button}"
x:Key="ModernMinimizeButton">
<Setter Property="Template">
<Setter.Value>
<ControlTemplate TargetType="{x:Type Button}">
<Border CornerRadius="0"
Background="{TemplateBinding Property=Background}">
<Grid>
<Rectangle StrokeThickness="1"/>
<TextBlock Text="{TemplateBinding Property=Content}"
HorizontalAlignment="Center"
VerticalAlignment="Center"
Foreground="DarkGray"/>
</Grid>
</Border>
<ControlTemplate.Triggers>
<Trigger Property="IsMouseOver" Value="True">
<Setter Property="Background" Value="Transparent" />
</Trigger>
</ControlTemplate.Triggers>
</ControlTemplate>
</Setter.Value>
</Setter>
</Style>
<Style TargetType="{x:Type Button}"
x:Key="UniversalMaterialButton">
<Setter Property="Template">
<Setter.Value>
<ControlTemplate TargetType="{x:Type Button}">
<Border CornerRadius="4"
Background="{TemplateBinding Background}">
<Grid>
<Rectangle StrokeThickness="1"/>
<TextBlock Text="{TemplateBinding Property=Content}"
HorizontalAlignment="Center"
VerticalAlignment="Center"
Foreground="{TemplateBinding Foreground}"/>
</Grid>
</Border>
<ControlTemplate.Triggers>
<Trigger Property="IsMouseOver" Value="True">
<Setter Property="Background" Value="Transparent" />
</Trigger>
</ControlTemplate.Triggers>
</ControlTemplate>
</Setter.Value>
</Setter>
</Style>
<Style x:Key="OSXButtonStyle" TargetType="Button">
<Setter Property="Background" Value="Transparent" />
<Setter Property="Template">
<Setter.Value>
<ControlTemplate TargetType="Button">
<Grid Background="{TemplateBinding Background}">
<ContentPresenter />
</Grid>
</ControlTemplate>
</Setter.Value>
</Setter>
</Style>
</ResourceDictionary>

View file

@ -1,219 +0,0 @@
<ResourceDictionary xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml">
<Style BasedOn="{StaticResource {x:Type ToggleButton}}"
TargetType="{x:Type RadioButton}"
x:Key="MenuButtonTheme">
<Style.Setters>
<Setter Property="Template">
<Setter.Value>
<ControlTemplate TargetType="RadioButton">
<Grid VerticalAlignment="Stretch"
HorizontalAlignment="Stretch"
Background="{TemplateBinding Background}">
<TextBlock Text="{TemplateBinding Property=Content}"
VerticalAlignment="Center"
Margin="50,0,0,0"/>
</Grid>
</ControlTemplate>
</Setter.Value>
</Setter>
<Setter Property="Background" Value="Transparent"/>
<Setter Property="BorderThickness" Value="0"/>
</Style.Setters>
<Style.Triggers>
<Trigger Property="IsChecked" Value="True">
<Setter Property="Background" Value="#22202f"/>
</Trigger>
</Style.Triggers>
</Style>
<Style BasedOn="{StaticResource {x:Type ToggleButton}}"
TargetType="{x:Type RadioButton}"
x:Key="MenuButtonRoundTheme">
<Style.Setters>
<Setter Property="Template">
<Setter.Value>
<ControlTemplate TargetType="RadioButton">
<Grid VerticalAlignment="Stretch"
HorizontalAlignment="Stretch">
<Border Background="{TemplateBinding Background}"
CornerRadius="4">
<StackPanel Orientation="Horizontal">
<TextBlock Text="{TemplateBinding Property=Content}"
VerticalAlignment="Center"
Margin="50,0,0,0"/>
</StackPanel>
</Border>
</Grid>
</ControlTemplate>
</Setter.Value>
</Setter>
<Setter Property="Background" Value="Transparent"/>
<Setter Property="BorderThickness" Value="0"/>
</Style.Setters>
<Style.Triggers>
<Trigger Property="IsChecked" Value="True">
<Setter Property="Background" Value="#212329"/>
</Trigger>
</Style.Triggers>
</Style>
<Style BasedOn="{StaticResource {x:Type ToggleButton}}"
TargetType="{x:Type RadioButton}"
x:Key="DiscordMenuButton">
<Style.Setters>
<Setter Property="Template">
<Setter.Value>
<ControlTemplate TargetType="RadioButton">
<Grid VerticalAlignment="Stretch"
HorizontalAlignment="Stretch">
<Border Background="{TemplateBinding Background}"
CornerRadius="4">
<StackPanel Orientation="Horizontal">
<Image Margin="10,0,10,0" RenderOptions.BitmapScalingMode="HighQuality"
Source="/../Images/discord.png" Width="30">
</Image>
<TextBlock Text="{TemplateBinding Property=Content}"
VerticalAlignment="Center"
Margin="0,0,0,0"/>
</StackPanel>
</Border>
</Grid>
</ControlTemplate>
</Setter.Value>
</Setter>
<Setter Property="Background" Value="Transparent"/>
<Setter Property="BorderThickness" Value="0"/>
</Style.Setters>
<Style.Triggers>
<Trigger Property="IsChecked" Value="True">
<Setter Property="Background" Value="#212329"/>
</Trigger>
</Style.Triggers>
</Style>
<Style BasedOn="{StaticResource {x:Type ToggleButton}}"
TargetType="{x:Type RadioButton}"
x:Key="HomeMenuButton">
<Style.Setters>
<Setter Property="Template">
<Setter.Value>
<ControlTemplate TargetType="RadioButton">
<Grid VerticalAlignment="Stretch"
HorizontalAlignment="Stretch">
<Border Background="{TemplateBinding Background}"
CornerRadius="4">
<StackPanel Orientation="Horizontal">
<Image Margin="10,0,10,0" RenderOptions.BitmapScalingMode="HighQuality"
Source="/../Images/home.png" Width="30">
</Image>
<TextBlock Text="{TemplateBinding Property=Content}"
VerticalAlignment="Center"
Margin="0,0,0,0"/>
</StackPanel>
</Border>
</Grid>
</ControlTemplate>
</Setter.Value>
</Setter>
<Setter Property="Background" Value="Transparent"/>
<Setter Property="BorderThickness" Value="0"/>
</Style.Setters>
<Style.Triggers>
<Trigger Property="IsChecked" Value="True">
<Setter Property="Background" Value="#212329"/>
</Trigger>
</Style.Triggers>
</Style>
<Style BasedOn="{StaticResource {x:Type ToggleButton}}"
TargetType="{x:Type RadioButton}"
x:Key="SettingsMenuButton">
<Style.Setters>
<Setter Property="Template">
<Setter.Value>
<ControlTemplate TargetType="RadioButton">
<Grid VerticalAlignment="Stretch"
HorizontalAlignment="Stretch">
<Border Background="{TemplateBinding Background}"
CornerRadius="4">
<StackPanel Orientation="Horizontal">
<Image Margin="10,0,10,0" RenderOptions.BitmapScalingMode="HighQuality"
Source="/../Images/settings.png" Width="30">
</Image>
<TextBlock Text="{TemplateBinding Property=Content}"
VerticalAlignment="Center"
Margin="0,0,0,0"/>
</StackPanel>
</Border>
</Grid>
</ControlTemplate>
</Setter.Value>
</Setter>
<Setter Property="Background" Value="Transparent"/>
<Setter Property="BorderThickness" Value="0"/>
</Style.Setters>
<Style.Triggers>
<Trigger Property="IsChecked" Value="True">
<Setter Property="Background" Value="#212329"/>
</Trigger>
</Style.Triggers>
</Style>
<Style BasedOn="{StaticResource {x:Type ToggleButton}}"
TargetType="{x:Type RadioButton}"
x:Key="KeyManagerMenuButton">
<Style.Setters>
<Setter Property="Template">
<Setter.Value>
<ControlTemplate TargetType="RadioButton">
<Grid VerticalAlignment="Stretch"
HorizontalAlignment="Stretch">
<Border Background="{TemplateBinding Background}"
CornerRadius="4">
<StackPanel Orientation="Horizontal">
<Image Margin="10,0,10,0" RenderOptions.BitmapScalingMode="HighQuality"
Source="/../Images/key.png" Width="30">
</Image>
<TextBlock Text="{TemplateBinding Property=Content}"
VerticalAlignment="Center"
Margin="0,0,0,0"/>
</StackPanel>
</Border>
</Grid>
</ControlTemplate>
</Setter.Value>
</Setter>
<Setter Property="Background" Value="Transparent"/>
<Setter Property="BorderThickness" Value="0"/>
</Style.Setters>
<Style.Triggers>
<Trigger Property="IsChecked" Value="True">
<Setter Property="Background" Value="#212329"/>
</Trigger>
</Style.Triggers>
</Style>
</ResourceDictionary>

View file

@ -1,35 +0,0 @@
<ResourceDictionary xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml">
<Style BasedOn="{StaticResource {x:Type ToggleButton}}"
TargetType="{x:Type CheckBox}"
x:Key="ModernChecbox">
<Style.Setters>
<Setter Property="Template">
<Setter.Value>
<ControlTemplate TargetType="CheckBox">
<Border CornerRadius="10"
Background="#353340">
<Grid>
<Rectangle StrokeThickness="1"/>
<CheckBox Content="{Binding RelativeSource={RelativeSource TemplatedParent}, Path=Text, UpdateSourceTrigger=PropertyChanged}"
VerticalAlignment="Center"
Foreground="DarkGray"
Background="#353340"
Margin="5,0,0,0"
BorderThickness="0"/>
</Grid>
</Border>
</ControlTemplate>
</Setter.Value>
</Setter>
<Setter Property="Background" Value="Transparent"/>
<Setter Property="BorderThickness" Value="0"/>
</Style.Setters>
<Style.Triggers>
<Trigger Property="IsChecked" Value="True">
<Setter Property="Background" Value="#22202f"/>
</Trigger>
</Style.Triggers>
</Style>
</ResourceDictionary>

View file

@ -1,18 +0,0 @@
<ResourceDictionary xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml">
<Style x:Key="ScrollBarThumbHor" TargetType="{x:Type Thumb}">
<Setter Property="SnapsToDevicePixels" Value="True"/>
<Setter Property="OverridesDefaultStyle" Value="true"/>
<Setter Property="IsTabStop" Value="false"/>
<Setter Property="Focusable" Value="false"/>
<Setter Property="Template">
<Setter.Value>
<ControlTemplate TargetType="{x:Type Thumb}">
<Border CornerRadius="1" Background="#c8c8c8" BorderBrush="{TemplateBinding BorderBrush}" BorderThickness="0" Height="8" Margin="0,0,-2,0"/>
</ControlTemplate>
</Setter.Value>
</Setter>
</Style>
</ResourceDictionary>

View file

@ -1,50 +0,0 @@
<ResourceDictionary xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml">
<Style TargetType="{x:Type TextBox}"
x:Key="MaterialTextBox">
<Setter Property="Template">
<Setter.Value>
<ControlTemplate TargetType="{x:Type TextBox}">
<Border CornerRadius="4"
Background="{TemplateBinding Background}">
<Grid>
<Rectangle StrokeThickness="1"/>
<TextBox Margin="1"
Text="{Binding RelativeSource={RelativeSource TemplatedParent}, Path=Text, UpdateSourceTrigger=PropertyChanged}"
BorderThickness="0"
Background="Transparent"
VerticalAlignment="Center"
Padding="5"
Foreground="#cfcfcf"
x:Name="SearchBox"/>
<TextBlock IsHitTestVisible="False"
Text="{TemplateBinding Tag}"
VerticalAlignment="Center"
HorizontalAlignment="Left"
Margin="10,0,0,0"
FontSize="11"
Foreground="DarkGray"
Grid.Column="1">
<TextBlock.Style>
<Style TargetType="{x:Type TextBlock}">
<Style.Triggers>
<DataTrigger Binding="{Binding Text, ElementName=SearchBox}" Value="">
<Setter Property="Visibility" Value="Visible"/>
</DataTrigger>
</Style.Triggers>
<Setter Property="Visibility" Value="Hidden"/>
</Style>
</TextBlock.Style>
</TextBlock>
</Grid>
</Border>
</ControlTemplate>
</Setter.Value>
</Setter>
</Style>
</ResourceDictionary>

View file

@ -0,0 +1,50 @@
<Page x:Class="WeeXnes.Views.DiscordRPC.AddRPCView"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:local="clr-namespace:WeeXnes.Views.DiscordRPC"
xmlns:ui="http://schemas.lepo.co/wpfui/2022/xaml"
mc:Ignorable="d"
Title="AddRPCView" Height="Auto" Width="Auto">
<Grid>
<Grid.RowDefinitions>
<RowDefinition/>
<RowDefinition Height="45"/>
</Grid.RowDefinitions>
<ScrollViewer Grid.Row="0">
<StackPanel Orientation="Vertical">
<ui:TextBox Name="TextboxProcessname" PlaceholderText="Process name" Margin="0,4"/>
<ui:TextBox Name="TextboxClientid" PlaceholderText="Client ID" Margin="0,4"/>
<ui:TextBox Name="TextboxDetails" PlaceholderText="Details" Margin="0,4"/>
<ui:TextBox Name="TextboxState" PlaceholderText="State" Margin="0,4"/>
<ui:TextBox Name="TextboxBigimgkey" PlaceholderText="Big image key" Margin="0,4"/>
<ui:TextBox Name="TextboxBigimgtxt" PlaceholderText="Big image text" Margin="0,4"/>
<ui:TextBox Name="TextboxSmallimgkey" PlaceholderText="Small image key" Margin="0,4"/>
<ui:TextBox Name="TextboxSmallimgtxt" PlaceholderText="Small image text" Margin="0,4"/>
</StackPanel>
</ScrollViewer>
<Grid Grid.Row="1">
<Grid.ColumnDefinitions>
<ColumnDefinition Width="*"/>
<ColumnDefinition Width="*"/>
</Grid.ColumnDefinitions>
<ui:Button
Padding="24,6"
HorizontalAlignment="Center"
Content="Cancel"
Icon="CaretLeft24"
Name="ButtonCancelDialog"
Click="ButtonCancelDialog_OnClick"/>
<ui:Button Grid.Column="1"
Padding="24,6"
HorizontalAlignment="Center"
Content="Add"
Icon="AddCircle32"
Name="ButtonSaveDialog"
Click="ButtonSaveDialog_OnClick"/>
</Grid>
</Grid>
</Page>

View file

@ -0,0 +1,56 @@
using System;
using System.Net.Mime;
using System.Windows;
using System.Windows.Controls;
namespace WeeXnes.Views.DiscordRPC
{
public partial class AddRPCView : Page
{
public AddRPCView()
{
InitializeComponent();
}
private void CloseDialog()
{
NavigationService.Navigate(new Uri("/Views/DiscordRPC/DiscordRPCView.xaml",UriKind.Relative));
}
private void ButtonSaveDialog_OnClick(object sender, RoutedEventArgs e)
{
if(String.IsNullOrEmpty(TextboxProcessname.Text))
return;
if(String.IsNullOrEmpty(TextboxClientid.Text))
return;
try
{
//Add new item
Game newGame = new Game(
TextboxProcessname.Text,
TextboxClientid.Text,
TextboxDetails.Text,
TextboxState.Text,
TextboxBigimgkey.Text,
TextboxBigimgtxt.Text,
TextboxSmallimgkey.Text,
TextboxSmallimgtxt.Text
);
DiscordRPCView.Data.Games.Add(newGame);
}
catch (Exception ex)
{
Console.WriteLine(ex.ToString());
}
CloseDialog();
}
private void ButtonCancelDialog_OnClick(object sender, RoutedEventArgs e)
{
CloseDialog();
}
}
}

View file

@ -0,0 +1,72 @@
<Page x:Class="WeeXnes.Views.DiscordRPC.DiscordRPCView"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:local="clr-namespace:WeeXnes.Views.DiscordRPC"
xmlns:ui="http://schemas.lepo.co/wpfui/2022/xaml"
mc:Ignorable="d"
Tag="RPCView"
Title="DiscordRPCView" Height="Auto" Width="Auto">
<Grid>
<Grid.RowDefinitions>
<RowDefinition Height="*"/>
<RowDefinition Height="74"/>
</Grid.RowDefinitions>
<Grid>
<Grid.ColumnDefinitions>
<ColumnDefinition Width="*"/>
<ColumnDefinition Width="*"/>
</Grid.ColumnDefinitions>
<ListBox Grid.Column="0" Name="ItemboxRpc" Margin="0,0,0,5"
SelectionChanged="ItemboxRpc_OnSelectionChanged">
<ListBox.ContextMenu>
<ContextMenu>
<MenuItem Header="Edit"
Name="ButtonContextEdit"
Click="ContextMenu_Edit"/>
<MenuItem Header="Export"
Name="ButtonContextExport"
Click="ContextMenu_Export"/>
<MenuItem Header="Import"
Name="ButtonContextImport"
Click="ContextMenu_Import"/>
<Separator />
<MenuItem Header="Remove"
Name="ButtonContextRemove"
Click="ContextMenu_Remove"/>
</ContextMenu>
</ListBox.ContextMenu>
</ListBox>
<StackPanel Grid.Column="1">
<ui:CardAction Icon="Play28" Grid.Row="1"
Name="ButtonStartRPC"
Margin="5,0,0,0"
Click="ButtonStartRPC_OnClick">
<StackPanel>
<TextBlock
Margin="0,0,0,4"
FontWeight="Medium"
Text="Run RPC"
/>
</StackPanel>
</ui:CardAction>
</StackPanel>
</Grid>
<ui:CardAction Icon="AddCircle32" Grid.Row="1"
Name="ButtonAddProcess"
Click="ButtonAddProcess_OnClick">
<StackPanel>
<TextBlock
Margin="0,0,0,4"
FontWeight="Medium"
Text="Add Process" />
<TextBlock
FontSize="11"
Foreground="{DynamicResource TextFillColorTertiaryBrush}"
Text="add process to configure corresponding RPC" />
</StackPanel>
</ui:CardAction>
</Grid>
</Page>

View file

@ -0,0 +1,121 @@
using System;
using System.ComponentModel;
using System.IO;
using System.Net;
using System.Windows;
using System.Windows.Controls;
using Microsoft.Win32;
using Nocksoft.IO.ConfigFiles;
using WeeXnes.Core;
namespace WeeXnes.Views.DiscordRPC
{
public partial class DiscordRPCView : Page
{
public static class Data
{
public static BindingList<Game> Games = new BindingList<Game>();
public static Game SelectedItem = null;
}
public DiscordRPCView()
{
InitializeComponent();
ItemboxRpc.ItemsSource = Data.Games;
Data.Games.ListChanged += GamesOnListChanged;
}
private void GamesOnListChanged(object sender, ListChangedEventArgs e)
{
foreach (Game game in Data.Games)
{
//Save Item to disk
game.Save();
}
}
private void ButtonAddProcess_OnClick(object sender, RoutedEventArgs e)
{
NavigationService.Navigate(new Uri("/Views/DiscordRPC/AddRPCView.xaml",UriKind.Relative));
}
private void ItemboxRpc_OnSelectionChanged(object sender, SelectionChangedEventArgs e)
{
ListBox listBox = (ListBox)sender;
Data.SelectedItem = (Game)listBox.SelectedItem;
}
private void ContextMenu_Edit(object sender, RoutedEventArgs e)
{
if(Data.SelectedItem == null)
return;
NavigationService.Navigate(new Uri("/Views/DiscordRPC/EditRPCView.xaml",UriKind.Relative));
}
private void ContextMenu_Export(object sender, RoutedEventArgs e)
{
Game selectedCache = Data.SelectedItem;
if(selectedCache == null)
return;
string filepath = Global.AppDataPathRPC.Value + "\\" + selectedCache.UUID + ".rpc";
SaveFileDialog dialog = new SaveFileDialog()
{
FileName = selectedCache.UUID,
Filter = "RPC File (*.rpc)|*.rpc",
Title = "Export RPC File"
};
if (dialog.ShowDialog() == true)
{
File.Copy(filepath, dialog.FileName, true);
Console.WriteLine("Exported to: " + dialog.FileName);
}
}
private void ContextMenu_Import(object sender, RoutedEventArgs e)
{
Game selectedCache = Data.SelectedItem;
if(selectedCache == null)
return;
OpenFileDialog dialog = new OpenFileDialog()
{
Filter = "RPC File (*.rpc)|*.rpc",
Title = "Import RPC File"
};
if (dialog.ShowDialog() == true)
{
Game newGame = Game.Methods.GameFromIni(new INIFile(dialog.FileName));
if (!File.Exists(Global.AppDataPathRPC.Value + "\\" + newGame.UUID + ".rpc"))
{
File.Copy(dialog.FileName, Global.AppDataPathRPC.Value + "\\" + newGame.UUID + ".rpc", true);
DiscordRPCView.Data.Games.Add(newGame);
Console.WriteLine("Imported: " + dialog.FileName);
}
else
{
Console.Error("not imported: " + dialog.FileName);
}
}
}
private void ContextMenu_Remove(object sender, RoutedEventArgs e)
{
Game selectedCache = Data.SelectedItem;
if(selectedCache == null)
return;
Data.Games.Remove(selectedCache);
File.Delete(Global.AppDataPathRPC.Value + "\\" + selectedCache.UUID + ".rpc");
}
private void ButtonStartRPC_OnClick(object sender, RoutedEventArgs e)
{
NavigationService.Navigate(new Uri("/Views/DiscordRPC/RunRPCView.xaml",UriKind.Relative));
}
}
}

View file

@ -0,0 +1,51 @@
<Page x:Class="WeeXnes.Views.DiscordRPC.EditRPCView"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:local="clr-namespace:WeeXnes.Views.DiscordRPC"
xmlns:ui="http://schemas.lepo.co/wpfui/2022/xaml"
mc:Ignorable="d"
Title="EditRPCView" Height="Auto" Width="Auto"
Loaded="EditRPCView_OnLoaded">
<Grid>
<Grid.RowDefinitions>
<RowDefinition/>
<RowDefinition Height="45"/>
</Grid.RowDefinitions>
<ScrollViewer Grid.Row="0">
<StackPanel Orientation="Vertical">
<ui:TextBox Name="TextboxProcessname" PlaceholderText="Process name" Margin="0,4"/>
<ui:TextBox Name="TextboxClientid" PlaceholderText="Client ID" Margin="0,4"/>
<ui:TextBox Name="TextboxState" PlaceholderText="State" Margin="0,4"/>
<ui:TextBox Name="TextboxDetails" PlaceholderText="Details" Margin="0,4"/>
<ui:TextBox Name="TextboxBigimgkey" PlaceholderText="Big image key" Margin="0,4"/>
<ui:TextBox Name="TextboxBigimgtxt" PlaceholderText="Big image text" Margin="0,4"/>
<ui:TextBox Name="TextboxSmallimgkey" PlaceholderText="Small image key" Margin="0,4"/>
<ui:TextBox Name="TextboxSmallimgtxt" PlaceholderText="Small image text" Margin="0,4"/>
</StackPanel>
</ScrollViewer>
<Grid Grid.Row="1">
<Grid.ColumnDefinitions>
<ColumnDefinition Width="*"/>
<ColumnDefinition Width="*"/>
</Grid.ColumnDefinitions>
<ui:Button
Padding="24,6"
HorizontalAlignment="Center"
Content="Cancel"
Icon="CaretLeft24"
Name="ButtonCancelDialog"
Click="ButtonCancelDialog_OnClick"/>
<ui:Button Grid.Column="1"
Padding="24,6"
HorizontalAlignment="Center"
Content="Edit"
Icon="AddCircle32"
Name="ButtonSaveDialog"
Click="ButtonSaveDialog_OnClick"/>
</Grid>
</Grid>
</Page>

View file

@ -0,0 +1,55 @@
using System;
using System.Windows;
using System.Windows.Controls;
namespace WeeXnes.Views.DiscordRPC
{
public partial class EditRPCView : Page
{
private Game editItem = null;
public EditRPCView()
{
InitializeComponent();
}
private void CloseDialog()
{
NavigationService.Navigate(new Uri("/Views/DiscordRPC/DiscordRPCView.xaml",UriKind.Relative));
}
private void ButtonSaveDialog_OnClick(object sender, RoutedEventArgs e)
{
Game editedItem = new Game(
TextboxProcessname.Text,
TextboxClientid.Text,
TextboxDetails.Text,
TextboxState.Text,
TextboxBigimgkey.Text,
TextboxBigimgtxt.Text,
TextboxSmallimgkey.Text,
TextboxSmallimgtxt.Text
);
editedItem.UUID = editItem.UUID;
int listIndex = DiscordRPCView.Data.Games.IndexOf(editItem);
DiscordRPCView.Data.Games[listIndex] = editedItem;
CloseDialog();
}
private void EditRPCView_OnLoaded(object sender, RoutedEventArgs e)
{
editItem = DiscordRPCView.Data.SelectedItem;
TextboxProcessname.Text = editItem.ProcessName;
TextboxClientid.Text = editItem.PresenceClient.ApplicationID;
TextboxState.Text = editItem.State;
TextboxDetails.Text = editItem.Details;
TextboxBigimgkey.Text = editItem.BigImageKey;
TextboxBigimgtxt.Text = editItem.BigImageText;
TextboxSmallimgkey.Text = editItem.SmallImageKey;
TextboxSmallimgtxt.Text = editItem.SmallImageText;
}
private void ButtonCancelDialog_OnClick(object sender, RoutedEventArgs e)
{
CloseDialog();
}
}
}

View file

@ -0,0 +1,208 @@
using System;
using System.Diagnostics;
using System.Windows.Forms;
using DiscordRPC;
using DiscordRPC.Message;
using Nocksoft.IO.ConfigFiles;
using WeeXnes.Core;
using WeeXnes.Views.Settings;
using EventType = WeeXnes.Core.EventType;
namespace WeeXnes.Views.DiscordRPC
{
public class Game
{
public static class Methods
{
public static Game GameFromIni(INIFile inifile)
{
Game returnval = new Game(
inifile.GetValue(SaveSettingsHandler.Data.DiscordRpcFiles.Section,
SaveSettingsHandler.Data.DiscordRpcFiles.ProcessName),
inifile.GetValue(SaveSettingsHandler.Data.DiscordRpcFiles.Section,
SaveSettingsHandler.Data.DiscordRpcFiles.ClientId),
inifile.GetValue(SaveSettingsHandler.Data.DiscordRpcFiles.Section,
SaveSettingsHandler.Data.DiscordRpcFiles.Details),
inifile.GetValue(SaveSettingsHandler.Data.DiscordRpcFiles.Section,
SaveSettingsHandler.Data.DiscordRpcFiles.State),
inifile.GetValue(SaveSettingsHandler.Data.DiscordRpcFiles.Section,
SaveSettingsHandler.Data.DiscordRpcFiles.BigImageKey),
inifile.GetValue(SaveSettingsHandler.Data.DiscordRpcFiles.Section,
SaveSettingsHandler.Data.DiscordRpcFiles.BigImageText),
inifile.GetValue(SaveSettingsHandler.Data.DiscordRpcFiles.Section,
SaveSettingsHandler.Data.DiscordRpcFiles.SmallImageKey),
inifile.GetValue(SaveSettingsHandler.Data.DiscordRpcFiles.Section,
SaveSettingsHandler.Data.DiscordRpcFiles.SmallImageText)
);
returnval.UUID = inifile.GetValue(SaveSettingsHandler.Data.DiscordRpcFiles.Section,
SaveSettingsHandler.Data.DiscordRpcFiles.UUID);
return returnval;
}
}
public string ProcessName { get; set; }
public bool IsRunning { get; set; }
public DiscordRpcClient PresenceClient { get; set; }
public string Details { get; set; }
public string State { get; set; }
public string BigImageKey { get; set; }
public string BigImageText { get; set; }
public string SmallImageKey { get; set; }
public string SmallImageText { get; set; }
public string UUID { get; set; }
private string generateUUID()
{
return Guid.NewGuid().ToString();
}
public Game(
string processName,
string clientId,
string details,
string state,
string bigImageKey,
string bigImageText,
string smallImageKey,
string smallImageText
)
{
this.ProcessName = processName;
this.IsRunning = false;
this.PresenceClient = new DiscordRpcClient(clientId);
this.Details = details;
this.State = state;
this.BigImageKey = bigImageKey;
this.BigImageText = bigImageText;
this.SmallImageKey = smallImageKey;
this.SmallImageText = smallImageText;
this.UUID = generateUUID();
}
public void Start()
{
this.IsRunning = true;
//Console.WriteLine("Process started");
RunRPCView.Data.LogCache.Value = new customEvent("[" + this.ProcessName + ".exe] ➜ is running", EventType.ProcessStartedEvent);
if (!this.PresenceClient.IsInitialized)
{
this.PresenceClient.Initialize();
}
this.PresenceClient.OnReady += PresenceClientOnOnReady;
this.PresenceClient.OnPresenceUpdate += PresenceClientOnOnPresenceUpdate;
this.PresenceClient.SetPresence(new RichPresence()
{
Details = this.Details,
State = this.State,
Assets = new Assets()
{
LargeImageKey = this.BigImageKey,
LargeImageText = this.BigImageText,
SmallImageKey = this.SmallImageKey,
SmallImageText = this.SmallImageText
}
});
PresenceClient.UpdateStartTime();
}
public void Stop()
{
this.IsRunning = false;
//Console.WriteLine("Process stopped");
RunRPCView.Data.LogCache.Value = new customEvent("[" + this.ProcessName + ".exe] ➜ stopped running", EventType.ProcessStoppedEvent);
if (this.PresenceClient.IsInitialized)
{
this.PresenceClient.ClearPresence();
this.PresenceClient.OnReady -= PresenceClientOnOnReady;
this.PresenceClient.OnPresenceUpdate -= PresenceClientOnOnPresenceUpdate;
}
}
private void PresenceClientOnOnPresenceUpdate(object sender, PresenceMessage args)
{
//Console.WriteLine("[" + this.ProcessName + ".exe] ➜ Received Update on " + args.Name);
RunRPCView.Data.LogCache.Value = new customEvent("[" + this.ProcessName + ".exe] ➜ Received Update on " + args.Name, EventType.RPCUpdateEvent);
}
private void PresenceClientOnOnReady(object sender, ReadyMessage args)
{
//Console.WriteLine("[" + this.ProcessName + ".exe] ➜ Received Ready from user " + args.User.Username);
RunRPCView.Data.LogCache.Value =
new customEvent("[" + this.ProcessName + ".exe] ➜ Received Ready from user " + args.User.Username, EventType.RPCReadyEvent);
}
public void CheckState(Process[] processes)
{
if(String.IsNullOrEmpty(this.ProcessName))
return;
bool processFound = false;
foreach (Process process in processes)
{
if (process.ProcessName == this.ProcessName)
processFound = true;
}
if(!this.IsRunning)
if (processFound)
Start();
if(this.IsRunning)
if(!processFound)
Stop();
}
public void Save()
{
INIFile rpcFile = new INIFile(Global.AppDataPathRPC.Value + "\\" + this.UUID + ".rpc", true);
rpcFile.SetValue(
SaveSettingsHandler.Data.DiscordRpcFiles.Section,
SaveSettingsHandler.Data.DiscordRpcFiles.ProcessName,
this.ProcessName);
rpcFile.SetValue(
SaveSettingsHandler.Data.DiscordRpcFiles.Section,
SaveSettingsHandler.Data.DiscordRpcFiles.ClientId,
this.PresenceClient.ApplicationID);
rpcFile.SetValue(
SaveSettingsHandler.Data.DiscordRpcFiles.Section,
SaveSettingsHandler.Data.DiscordRpcFiles.State,
this.State);
rpcFile.SetValue(
SaveSettingsHandler.Data.DiscordRpcFiles.Section,
SaveSettingsHandler.Data.DiscordRpcFiles.Details,
this.Details);
rpcFile.SetValue(
SaveSettingsHandler.Data.DiscordRpcFiles.Section,
SaveSettingsHandler.Data.DiscordRpcFiles.BigImageKey,
this.BigImageKey);
rpcFile.SetValue(
SaveSettingsHandler.Data.DiscordRpcFiles.Section,
SaveSettingsHandler.Data.DiscordRpcFiles.BigImageText,
this.BigImageText);
rpcFile.SetValue(
SaveSettingsHandler.Data.DiscordRpcFiles.Section,
SaveSettingsHandler.Data.DiscordRpcFiles.SmallImageKey,
this.SmallImageKey);
rpcFile.SetValue(
SaveSettingsHandler.Data.DiscordRpcFiles.Section,
SaveSettingsHandler.Data.DiscordRpcFiles.SmallImageText,
this.SmallImageText);
rpcFile.SetValue(
SaveSettingsHandler.Data.DiscordRpcFiles.Section,
SaveSettingsHandler.Data.DiscordRpcFiles.UUID,
this.UUID);
}
public override string ToString()
{
return this.ProcessName + ".exe";
}
}
}

View file

@ -0,0 +1,77 @@
<Page x:Class="WeeXnes.Views.DiscordRPC.RunRPCView"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:local="clr-namespace:WeeXnes.Views.DiscordRPC"
xmlns:ui="http://schemas.lepo.co/wpfui/2022/xaml"
mc:Ignorable="d"
Title="RunRPCView" Height="Auto" Width="Auto"
Unloaded="RunRPCView_OnUnloaded">
<Grid>
<Grid.RowDefinitions>
<RowDefinition Height="70px"/>
<RowDefinition/>
</Grid.RowDefinitions>
<ui:CardAction Grid.Column="1" Icon="CaretLeft24"
Name="ButtonRPCStop"
Click="ButtonRPCStop_OnClick">
<StackPanel>
<TextBlock
Margin="0,0,0,4"
FontWeight="Medium"
Text="Stop RPC"
/>
</StackPanel>
</ui:CardAction>
<ScrollViewer Grid.Row="1" Name="LogViewer">
<ItemsControl Grid.Row="1" Name="RpcLogView" Loaded="RpcLogView_OnLoaded" Margin="0,0,0,0">
<ItemsControl.ItemTemplate>
<DataTemplate>
<StackPanel Orientation="Vertical">
<Border Height="30" CornerRadius="4" Margin="0,3,0,0" Name="ParentBorder"
Opacity="0">
<Border.Triggers>
<!-- Animate the button's Width property. -->
<EventTrigger RoutedEvent="Border.Loaded">
<BeginStoryboard>
<Storyboard>
<DoubleAnimation
Storyboard.TargetName="ParentBorder"
Storyboard.TargetProperty="(Border.Opacity)"
To="1" Duration="0:0:00.5" AutoReverse="False"
/>
</Storyboard>
</BeginStoryboard>
</EventTrigger>
</Border.Triggers>
<Border.Background>
<LinearGradientBrush StartPoint="0 0" EndPoint="1 1">
<LinearGradientBrush.GradientStops>
<GradientStop Offset="0" Color="{Binding GradientColor1}" />
<GradientStop Offset="1" Color="{Binding GradientColor2}" />
</LinearGradientBrush.GradientStops>
</LinearGradientBrush>
</Border.Background>
<TextBlock Margin="5 0" Text="{Binding Content}" FontSize="12"
Foreground="White"
HorizontalAlignment="Left"
VerticalAlignment="Center"
Padding="10,0,0,0">
<TextBlock.Effect>
<DropShadowEffect ShadowDepth="1"/>
</TextBlock.Effect>
</TextBlock>
</Border>
</StackPanel>
</DataTemplate>
</ItemsControl.ItemTemplate>
</ItemsControl>
</ScrollViewer>
</Grid>
</Page>

View file

@ -0,0 +1,122 @@
using System;
using System.ComponentModel;
using System.Diagnostics;
using System.Threading;
using System.Windows;
using System.Windows.Controls;
using WeeXnes.Core;
namespace WeeXnes.Views.DiscordRPC
{
public partial class RunRPCView : Page
{
public static class Data
{
public static UpdateVar<customEvent> LogCache = new UpdateVar<customEvent>();
}
BackgroundWorker backgroundWorker = new BackgroundWorker();
public RunRPCView()
{
InitializeComponent();
SetupLogListener();
SetupBackgroundWorker();
}
public void SetupLogListener()
{
Data.LogCache.ValueChanged += LogChanged;
}
public void RemoveListener()
{
Data.LogCache.ValueChanged -= LogChanged;
}
private void LogChanged()
{
VanillaConsole.WriteLine("Log Write Data: " + Data.LogCache.Value);
this.Dispatcher.Invoke(() =>
{
RpcLogView.Items.Add(Data.LogCache.Value);
LogViewer.ScrollToEnd();
});
}
private void SetupBackgroundWorker()
{
backgroundWorker.WorkerReportsProgress = true;
backgroundWorker.WorkerSupportsCancellation = true;
backgroundWorker.RunWorkerCompleted += BackgroundWorkerOnRunWorkerCompleted;
backgroundWorker.DoWork += BackgroundWorkerOnDoWork;
RunBackgroundWorker();
}
public void RunBackgroundWorker()
{
try
{
if(!backgroundWorker.IsBusy)
backgroundWorker.RunWorkerAsync();
}
catch (Exception ex)
{
VanillaConsole.WriteLine(ex.ToString());
}
}
public void StopBackgroundWorker()
{
try
{
if(backgroundWorker.IsBusy)
backgroundWorker.CancelAsync();
}
catch (Exception ex)
{
VanillaConsole.WriteLine(ex.ToString());
}
//Stop RPC
}
private void BackgroundWorkerOnDoWork(object sender, DoWorkEventArgs e)
{
Data.LogCache.Value = new customEvent("[INFO] RPC Thread is running", EventType.ProcessStartedEvent);
bool runWorker = true;
while (runWorker)
{
Process[] processes = Process.GetProcesses();
if (backgroundWorker.CancellationPending)
runWorker = false;
foreach (Game game in DiscordRPCView.Data.Games)
{
game.CheckState(processes);
}
Thread.Sleep(2000);
}
}
private void BackgroundWorkerOnRunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
{
foreach (Game game in DiscordRPCView.Data.Games)
game.Stop();
VanillaConsole.WriteLine("Thread Stopped");
Data.LogCache.Value = new customEvent("[INFO] RPC Thread has stopped", EventType.ProcessStoppedEvent);
}
private void RunRPCView_OnUnloaded(object sender, RoutedEventArgs e)
{
StopBackgroundWorker();
RemoveListener();
}
private void ButtonRPCStop_OnClick(object sender, RoutedEventArgs e)
{
NavigationService.Navigate(new Uri("/Views/DiscordRPC/DiscordRPCView.xaml",UriKind.Relative));
}
private void RpcLogView_OnLoaded(object sender, RoutedEventArgs e)
{
}
}
}

View file

@ -0,0 +1,35 @@
<Page x:Class="WeeXnes.Views.EncryptedTextEditor.TextEditorView"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:local="clr-namespace:WeeXnes.Views.EncryptedTextEditor"
mc:Ignorable="d"
Title="TextEditorView" Height="Auto" Width="Auto">
<Grid>
<Grid>
<Grid.RowDefinitions>
<RowDefinition Height="40px"/>
<RowDefinition/>
</Grid.RowDefinitions>
<Grid Grid.Row="0">
<Grid.ColumnDefinitions>
<ColumnDefinition Width="*" />
<ColumnDefinition Width="*" />
<ColumnDefinition Width="*" />
</Grid.ColumnDefinitions>
<Button Name="btn_openFile" Click="Btn_openFile_OnClick" Grid.Column="0" Content="Open File" HorizontalAlignment="Stretch" VerticalAlignment="Stretch" Margin="5"/>
<Button Name="btn_saveFile" Click="Btn_saveFile_OnClick" Grid.Column="1" Content="Save" HorizontalAlignment="Stretch" VerticalAlignment="Stretch" Margin="5"/>
<Button Name="btn_saveFileAs" Click="Btn_saveFileAs_OnClick" Grid.Column="2" Content="Save As" HorizontalAlignment="Stretch" VerticalAlignment="Stretch" Margin="5"/>
</Grid>
<RichTextBox Name="rtb_FileEditor" Grid.Row="1">
<RichTextBox.Resources>
<Style TargetType="{x:Type Paragraph}">
<Setter Property="Margin" Value="0"/>
</Style>
</RichTextBox.Resources>
</RichTextBox>
</Grid>
</Grid>
</Page>

View file

@ -0,0 +1,97 @@
using System;
using System.IO;
using System.Linq;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Documents;
using System.Windows.Forms;
using EncryptionLib;
using WeeXnes.Core;
namespace WeeXnes.Views.EncryptedTextEditor;
public partial class TextEditorView : Page
{
public string currentFilePath { get; set; } = null;
public TextEditorView()
{
InitializeComponent();
}
private void RaiseClickEvent(System.Windows.Controls.Button button)
{
var clickEventArgs = new RoutedEventArgs(System.Windows.Controls.Button.ClickEvent);
button.RaiseEvent(clickEventArgs);
}
private void Btn_openFile_OnClick(object sender, RoutedEventArgs e)
{
var fileContent = string.Empty;
var filePath = string.Empty;
Console.WriteLine("Calling OpenFileDialog");
using (OpenFileDialog openFileDialog = new OpenFileDialog())
{
//openFileDialog.InitialDirectory = AppDomain.CurrentDomain.BaseDirectory;
openFileDialog.Filter = "WXN Text Files (*.wtf)|*.wtf";
openFileDialog.RestoreDirectory = true;
if (openFileDialog.ShowDialog() == DialogResult.OK)
{
Console.WriteLine("Opening file " + openFileDialog.FileName);
this.currentFilePath = openFileDialog.FileName;
string[] FileContent = File.ReadAllLines(openFileDialog.FileName);
string[] decryptedContent = EncryptorLibary.decryptArray(Information.EncryptionHash, FileContent);
rtb_FileEditor.Document.Blocks.Clear();
foreach (string line in decryptedContent)
{
rtb_FileEditor.Document.Blocks.Add(new Paragraph(new Run(line)));
}
}
}
}
private void Btn_saveFile_OnClick(object sender, RoutedEventArgs e)
{
if (this.currentFilePath == null)
{
RaiseClickEvent(btn_saveFileAs);
}
else
{
Console.WriteLine("Saving file " + currentFilePath);
TextRange textRange = new TextRange(rtb_FileEditor.Document.ContentStart, rtb_FileEditor.Document.ContentEnd);
string plainText = textRange.Text;
string[] lines = plainText.Split(new[] { Environment.NewLine }, StringSplitOptions.None);
string[] encryptedContent =
EncryptionLib.EncryptorLibary.encryptArray(Information.EncryptionHash, lines);
File.WriteAllLines(this.currentFilePath, encryptedContent);
}
}
private void Btn_saveFileAs_OnClick(object sender, RoutedEventArgs e)
{
Console.WriteLine("Calling SaveFileDialog");
using (SaveFileDialog saveFileDialog = new SaveFileDialog())
{
//saveFileDialog.InitialDirectory = AppDomain.CurrentDomain.BaseDirectory;
saveFileDialog.Filter = "WXN Text Files (*.wtf)|*.wtf";
saveFileDialog.RestoreDirectory = true;
if(saveFileDialog.ShowDialog() == DialogResult.OK)
{
Console.WriteLine("Saving file " + saveFileDialog.FileName);
this.currentFilePath = saveFileDialog.FileName;
TextRange textRange = new TextRange(rtb_FileEditor.Document.ContentStart, rtb_FileEditor.Document.ContentEnd);
string plainText = textRange.Text;
string[] lines = plainText.Split(new[] { Environment.NewLine }, StringSplitOptions.None);
string[] encryptedContent =
EncryptionLib.EncryptorLibary.encryptArray(Information.EncryptionHash, lines);
File.WriteAllLines(saveFileDialog.FileName, encryptedContent);
}
}
}
}

Some files were not shown because too many files have changed in this diff Show more