Compare commits

...

58 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
60 changed files with 1595 additions and 145 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,81 +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: 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\bin\Release\System.Drawing.Common.dll,
D:\a\WeeXnesSuite\WeeXnesSuite\WeeXnes\bin\Release\Wpf.Ui.dll,
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: Create 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,5 +1,5 @@
<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">
@ -16,14 +16,43 @@ Uses:
<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/1045710949014843402/preview1.png" height="400">
<image src="https://cdn.discordapp.com/attachments/741123537582162020/1045710949442658314/preview2.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/1045710949811761293/preview3.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>

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,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

@ -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("WXPlugin")]
[assembly: AssemblyDescription("")]
[assembly: AssemblyConfiguration("")]
[assembly: AssemblyCompany("")]
[assembly: AssemblyProduct("WXPlugin")]
[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("56BFE4E0-0D30-474A-B57B-CF08515FF66E")]
// 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")]

67
WXPlugin/WXPlugin.csproj Normal file
View file

@ -0,0 +1,67 @@
<?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>{56BFE4E0-0D30-474A-B57B-CF08515FF66E}</ProjectGuid>
<OutputType>Library</OutputType>
<AppDesignerFolder>Properties</AppDesignerFolder>
<RootNamespace>WXPlugin</RootNamespace>
<AssemblyName>WXPlugin</AssemblyName>
<TargetFrameworkVersion>v4.8</TargetFrameworkVersion>
<FileAlignment>512</FileAlignment>
<LangVersion>12</LangVersion>
</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.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="PluginCore\IPluginBase.cs" />
<Compile Include="Properties\AssemblyInfo.cs"/>
</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>

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

@ -8,6 +8,10 @@ Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "WeeXnes_UAC", "WeeXnes_UAC\
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Update", "Update\Update.csproj", "{133FF515-D605-4856-BA2E-5841BF47EC2F}"
EndProject
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
Debug|Any CPU = Debug|Any CPU
@ -30,5 +34,13 @@ Global
{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

@ -2,6 +2,8 @@
using System.ComponentModel;
using System.Windows;
using System.IO;
using System.Net;
using System.Runtime.CompilerServices;
using System.Windows.Media;
using Newtonsoft.Json.Linq;
using Nocksoft.IO.ConfigFiles;
@ -40,14 +42,30 @@ namespace WeeXnes
private void App_OnStartup(object sender, StartupEventArgs e)
{
Environment.CurrentDirectory = Application.StartupPath;
Console.Data.Colors.colored_output = false;
Console.Data.Formatting.timestamp_prefix = true;
SetExceptionHandler();
CheckForDebugMode();
CheckStartupArgs(e.Args);
CheckUpdatedFiles();
CheckForFolder();
LoadSettings();
SaveSettingsHandler.SetupSaveEvents();
LoadFiles();
CheckStartupArgs(e.Args);
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();
}
}
private void CheckUpdatedFiles()
@ -65,7 +83,7 @@ namespace WeeXnes
}
catch (Exception ex)
{
WeeXnes.Core.CustomConsole.Error(ex.ToString());
Console.Error(ex.ToString());
}
}
}
@ -127,12 +145,12 @@ namespace WeeXnes
{
Game newGame = Game.Methods.GameFromIni(new INIFile(file.FullName));
DiscordRPCView.Data.Games.Add(newGame);
WeeXnes.Core.CustomConsole.WriteLine(file.Name + " loaded");
Console.WriteLine(file.Name + " loaded -> " + newGame.ProcessName);
}
catch (Exception ex)
{
WeeXnes.Core.CustomConsole.Error(file.Name + ": " + ex.Message);
MessageBox.Show(file.Name + ": " + ex.Message);
Console.Error(file.Name + ": " + ex.Message);
new FluentMessageBox(file.Name + ": " + ex.Message).ShowDialog();
}
}
Functions.CheckFolderAndCreate(Global.AppDataPathKEY.Value);
@ -153,12 +171,13 @@ namespace WeeXnes
);
newItem.Filename = file.Name;
KeyManagerView.Data.KeyItemsList.Add(newItem);
WeeXnes.Core.CustomConsole.WriteLine(file.Name + " loaded");
Console.WriteLine(file.Name + " loaded -> " + newItem.Name);
}
catch (Exception ex)
{
WeeXnes.Core.CustomConsole.Error(file.Name + ": " + ex.Message);
Console.Error(file.Name + ": " + ex.Message);
new FluentMessageBox(file.Name + ": " + ex.Message).ShowDialog();
}
}
}
@ -172,10 +191,10 @@ namespace WeeXnes
{
switch (argument)
{
case "-autostart":
case HandleLaunchArguments.ArgumentStrings.autostart:
HandleLaunchArguments.arg_autostart();
break;
case "-debugMode":
case HandleLaunchArguments.ArgumentStrings.debugMode:
HandleLaunchArguments.arg_debugMode();
break;
}
@ -185,8 +204,7 @@ namespace WeeXnes
private void CheckForDebugMode()
{
#if DEBUG
DebugMode = true;
HandleLaunchArguments.arg_enableConsole();
HandleLaunchArguments.arg_debugMode();
#endif
}
}

View file

@ -1,13 +1,17 @@
using System;
global using Console = WeeXnes.Core.Console;
global using VanillaConsole = System.Console;
using System;
using System.Collections.Generic;
using System.IO;
using System.Runtime.CompilerServices;
using System.Text;
using VanillaConsole = System.Console;
namespace WeeXnes.Core
{
public class CustomConsole
public static class Console
{
public static class Data
{
@ -21,6 +25,7 @@ namespace WeeXnes.Core
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 = "◈";
@ -28,7 +33,6 @@ namespace WeeXnes.Core
public static string writeline_char = "•";
}
}
private static void ConfiguredWriteline(
string text,
ConsoleColor color,
@ -36,9 +40,15 @@ namespace WeeXnes.Core
{
if(!App.DebugMode)
return;
VanillaConsole.OutputEncoding = Encoding.UTF8;
try
{
VanillaConsole.OutputEncoding = Encoding.UTF8;
}
catch (Exception ex)
{
}
ConsoleColor prevColor = VanillaConsole.BackgroundColor;
ConsoleColor prevForeColor = VanillaConsole.ForegroundColor;
if (Data.Colors.colored_output)
@ -46,7 +56,9 @@ namespace WeeXnes.Core
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)
{
@ -62,13 +74,6 @@ namespace WeeXnes.Core
{
ConfiguredWriteline(" " + Data.Formatting.writeline_char + " (" + lineNumber + "|" + caller + ") " + text,VanillaConsole.BackgroundColor, ConsoleColor.White);
}
public static void WriteLineVerbose(string text,
[CallerLineNumber] int lineNumber = 0,
[CallerMemberName] string caller = null,
[CallerFilePath] string filePath = null)
{
ConfiguredWriteline(" " + Data.Formatting.writeline_char + " (" + Path.GetFileName(filePath) + "|" + caller + "|" + lineNumber + ") " + text,VanillaConsole.BackgroundColor, ConsoleColor.White);
}
public static void WriteLine(float text,
[CallerLineNumber] int lineNumber = 0,
[CallerMemberName] string caller = null)

View file

@ -40,9 +40,11 @@ namespace WeeXnes.Core
File.WriteAllLines(filepath, stringArray, Encoding.UTF8);
}
public static void ThrowTestException()
public static void ThrowTestException(Exception ex = null)
{
throw new NotImplementedException();
if (ex == null)
ex = new NotImplementedException();
throw ex;
}
}
}

View file

@ -8,21 +8,24 @@ namespace WeeXnes.Core
{
public class Information
{
public const string Version = "4.4.2";
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()
{

View file

@ -1,11 +1,18 @@
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;
@ -19,7 +26,11 @@ namespace WeeXnes.Core
}
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()
{

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

@ -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

@ -18,6 +18,7 @@ namespace WeeXnes.Core
public const string Section = "GENERAL";
public const string RpcFilesPath = "RpcFilesPath";
public const string KeyFilesPath = "KeyFilesPath";
public const string StartupUpdateCheck = "StartupUpdateCheck";
}
public static class KeyManager
{
@ -87,6 +88,14 @@ namespace WeeXnes.Core
Global.AppDataPathKEY.Value
);
};
Global.checkUpdateOnStartup.ValueChanged += () =>
{
SettingsView.Data.settingsFile.SetValue(
Data.General.Section,
Data.General.StartupUpdateCheck,
Global.checkUpdateOnStartup.Value.ToString()
);
};
}
}
}

View file

@ -29,7 +29,7 @@ namespace WeeXnes.Core
}
catch (Exception e)
{
Console.WriteLine(e);
Console.WriteLine(e.ToString());
returnval = null;
}
}
@ -48,7 +48,7 @@ namespace WeeXnes.Core
returnval = rawcontent[2];
}catch (Exception e)
{
Console.WriteLine(e);
Console.WriteLine(e.ToString());
returnval = null;
}
}

View file

@ -9,14 +9,17 @@
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="400"
Height="540"
Width="500"
Title="WeeXnes"
Background="{DynamicResource ApplicationBackgroundBrush}"
ExtendsContentIntoTitleBar="True"
WindowBackdropType="Mica"
WindowStartupLocation="CenterScreen">
WindowStartupLocation="CenterScreen"
Loaded="MainWindow_OnLoaded">
<Grid>
<Grid.RowDefinitions>
@ -46,6 +49,9 @@
<MenuItem
Header="Stop RPC"
Click="ContextStopRpc_OnClick"/>
<MenuItem
Header="Exit"
Click="ContextExit_OnClick"/>
</ContextMenu>
</ui:NotifyIcon.Menu>
</ui:NotifyIcon>
@ -59,6 +65,7 @@
<ColumnDefinition Width="*" />
</Grid.ColumnDefinitions>
<ui:NavigationStore
Name="NavBar"
Grid.Column="0"
Frame="{Binding ElementName=MainFrame}"
SelectedPageIndex="0">
@ -87,6 +94,19 @@
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

View file

@ -1,4 +1,5 @@
using System;
using System.Text;
using System.Windows;
using WeeXnes.Core;
using ButtonBase = System.Windows.Controls.Primitives.ButtonBase;
@ -15,6 +16,14 @@ namespace WeeXnes
{
InitializeComponent();
Wpf.Ui.Appearance.Accent.ApplySystemAccent();
EnableDebugOptions();
}
private void EnableDebugOptions()
{
if(!App.DebugMode)
return;
//Code to be enabled in Debug mode
}
@ -25,7 +34,8 @@ namespace WeeXnes
{
ButtonRpc.RaiseEvent(new RoutedEventArgs(ButtonBase.ClickEvent));
MainFrame.Source = new Uri("/Views/DiscordRPC/RunRPCView.xaml",UriKind.Relative);
WindowState = WindowState.Minimized;
this.Visibility = Visibility.Collapsed;
this.ShowInTaskbar = false;
}
}
@ -42,8 +52,22 @@ namespace WeeXnes
private void NotifyIcon_OnLeftClick(NotifyIcon sender, RoutedEventArgs e)
{
this.ShowInTaskbar = true;
this.Show();
}
private void ContextExit_OnClick(object sender, RoutedEventArgs e)
{
Environment.Exit(0);
}
private void MainWindow_OnLoaded(object sender, RoutedEventArgs e)
{
foreach (var plugin in Global.pluginManager.CurrentPlugins)
{
NavBar.Items.Add(plugin.NavIcon);
}
}
}
}

View file

@ -17,8 +17,8 @@
<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="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"/>

View file

@ -42,7 +42,7 @@ namespace WeeXnes.Views.DiscordRPC
}
catch (Exception ex)
{
Console.WriteLine(ex);
Console.WriteLine(ex.ToString());
}
CloseDialog();

View file

@ -7,7 +7,6 @@ using System.Windows.Controls;
using Microsoft.Win32;
using Nocksoft.IO.ConfigFiles;
using WeeXnes.Core;
using CConsole = WeeXnes.Core.CustomConsole;
namespace WeeXnes.Views.DiscordRPC
{
@ -67,7 +66,7 @@ namespace WeeXnes.Views.DiscordRPC
if (dialog.ShowDialog() == true)
{
File.Copy(filepath, dialog.FileName, true);
CustomConsole.WriteLine("Exported to: " + dialog.FileName);
Console.WriteLine("Exported to: " + dialog.FileName);
}
}
@ -92,11 +91,11 @@ namespace WeeXnes.Views.DiscordRPC
{
File.Copy(dialog.FileName, Global.AppDataPathRPC.Value + "\\" + newGame.UUID + ".rpc", true);
DiscordRPCView.Data.Games.Add(newGame);
CustomConsole.WriteLine("Imported: " + dialog.FileName);
Console.WriteLine("Imported: " + dialog.FileName);
}
else
{
CustomConsole.Error("not imported: " + dialog.FileName);
Console.Error("not imported: " + dialog.FileName);
}

View file

@ -33,7 +33,7 @@ namespace WeeXnes.Views.DiscordRPC
private void LogChanged()
{
Console.WriteLine("Log Write Data: " + Data.LogCache.Value);
VanillaConsole.WriteLine("Log Write Data: " + Data.LogCache.Value);
this.Dispatcher.Invoke(() =>
{
RpcLogView.Items.Add(Data.LogCache.Value);
@ -58,7 +58,7 @@ namespace WeeXnes.Views.DiscordRPC
}
catch (Exception ex)
{
Console.WriteLine(ex);
VanillaConsole.WriteLine(ex.ToString());
}
}
public void StopBackgroundWorker()
@ -71,7 +71,7 @@ namespace WeeXnes.Views.DiscordRPC
}
catch (Exception ex)
{
Console.WriteLine(ex);
VanillaConsole.WriteLine(ex.ToString());
}
//Stop RPC
}
@ -98,7 +98,7 @@ namespace WeeXnes.Views.DiscordRPC
{
foreach (Game game in DiscordRPCView.Data.Games)
game.Stop();
Console.WriteLine("Thread Stopped");
VanillaConsole.WriteLine("Thread Stopped");
Data.LogCache.Value = new customEvent("[INFO] RPC Thread has stopped", EventType.ProcessStoppedEvent);
}

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);
}
}
}
}

View file

@ -6,7 +6,6 @@ using System.Net;
using Wpf.Ui.Controls;
using Microsoft.Win32;
using Path = System.Windows.Shapes.Path;
using Console = WeeXnes.Core.CustomConsole;
namespace WeeXnes.Views.KeyManager
{

View file

@ -87,7 +87,7 @@ namespace WeeXnes.Views.KeyManager
}
catch (Exception ex)
{
Console.WriteLine(ex);
Console.WriteLine(ex.ToString());
}
}

View file

@ -43,7 +43,7 @@ namespace WeeXnes.Views.PasswordGenerator
CustomPasswordBuilderString += PasswordBuilderStrings.special;
CustomConsole.WriteLine("Generating Password from: " + CustomPasswordBuilderString);
Console.WriteLine("Generating Password from: " + CustomPasswordBuilderString);
//MessageBox.Show(CustomPasswordBuilderString);
string generatedPassword = "";

View file

@ -0,0 +1,21 @@
<Page x:Class="WeeXnes.Views.PluginManager.PluginManagerView"
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.PluginManager"
mc:Ignorable="d"
Title="PluginManagerView" Height="450" Width="800">
<Grid>
<ListView ItemsSource="{Binding Plugin}">
<ListView.ItemTemplate>
<DataTemplate>
<StackPanel>
<TextBlock Text="{Binding Name}"/>
<TextBlock Text="{Binding Description}"/>
</StackPanel>
</DataTemplate>
</ListView.ItemTemplate>
</ListView>
</Grid>
</Page>

View file

@ -0,0 +1,13 @@
using System.Windows.Controls;
namespace WeeXnes.Views.PluginManager;
public partial class PluginManagerView : Page
{
public PluginManagerView()
{
InitializeComponent();
}
}

View file

@ -0,0 +1,44 @@
<Page x:Class="WeeXnes.Views.ProfileView.InboxView"
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.ProfileView"
xmlns:ui="http://schemas.lepo.co/wpfui/2022/xaml"
mc:Ignorable="d"
Title="InboxView" Height="Auto" Width="Auto"
Loaded="InboxView_OnLoaded">
<Grid>
<ScrollViewer Grid.Row="1" Name="LogViewer">
<ItemsControl Grid.Row="1" x:Name="InboxItems" Loaded="InboxItemsLoaded" Margin="0,0,0,0">
<ItemsControl.ItemTemplate>
<DataTemplate>
<StackPanel Orientation="Vertical">
<ui:CardAction Icon="Mail24" Margin="0,0,0,5"
Click="ButtonBase_OnClick"
CommandParameter="test123"
Tag="{Binding}">
<StackPanel>
<TextBlock
Margin="0,0,0,4"
FontWeight="Medium"
Text="{Binding Author}" />
<TextBlock
FontSize="11"
Foreground="{DynamicResource TextFillColorTertiaryBrush}"
Text="{Binding Message}"
TextTrimming="CharacterEllipsis"/>
</StackPanel>
</ui:CardAction>
</StackPanel>
</DataTemplate>
</ItemsControl.ItemTemplate>
</ItemsControl>
</ScrollViewer>
</Grid>
</Page>

View file

@ -0,0 +1,46 @@
using System;
using System.Collections;
using System.Collections.Generic;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Documents;
using WeeXnes.Core;
using Wpf.Ui.Controls;
namespace WeeXnes.Views.ProfileView
{
public partial class InboxView : Page
{
public InboxView()
{
InitializeComponent();
}
private void InboxView_OnLoaded(object sender, RoutedEventArgs e)
{
//header_label.Content = "Inbox of " + ProfileView.auth._currentUserCache.Value.name;
}
private void InboxItemsLoaded(object sender, RoutedEventArgs e)
{
//Reverse the message list
List<dynamic> messageList = new List<dynamic>();
foreach (var msg in ProfileView.auth._currentUserCache.Value.inbox)
{
messageList.Add(msg);
}
messageList.Reverse();
InboxItems.ItemsSource = messageList;
}
private void ButtonBase_OnClick(object sender, RoutedEventArgs e)
{
CardAction button = (CardAction)sender;
dynamic messageObj = button.Tag;
Console.WriteLine(messageObj.ToString());
MessageFullView.MessageToShow = messageObj;
NavigationService.Navigate(new Uri("/Views/ProfileView/MessageFullView.xaml",UriKind.Relative));
}
}
}

View file

@ -0,0 +1,15 @@
<Page x:Class="WeeXnes.Views.ProfileView.LicenseView"
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.ProfileView"
mc:Ignorable="d"
Title="LicenseView" Height="Auto" Width="Auto"
Loaded="LicenseView_OnLoaded">
<Grid>
<StackPanel>
<Label Name="header_label"/>
</StackPanel>
</Grid>
</Page>

View file

@ -0,0 +1,18 @@
using System.Windows;
using System.Windows.Controls;
namespace WeeXnes.Views.ProfileView
{
public partial class LicenseView : Page
{
public LicenseView()
{
InitializeComponent();
}
private void LicenseView_OnLoaded(object sender, RoutedEventArgs e)
{
header_label.Content = "Licenses of " + ProfileView.auth._currentUserCache.Value.name;
}
}
}

View file

@ -0,0 +1,15 @@
<Page x:Class="WeeXnes.Views.ProfileView.LoginError"
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.ProfileView"
mc:Ignorable="d"
Title="LoginError" Height="Auto" Width="Auto">
<Grid>
<StackPanel VerticalAlignment="Center">
<Label Content="wrong credentials" HorizontalAlignment="Center" Padding="0,0,0,10"/>
<Button Content="Back to login" HorizontalAlignment="Center" Click="ButtonBase_OnClick"/>
</StackPanel>
</Grid>
</Page>

View file

@ -0,0 +1,19 @@
using System;
using System.Windows;
using System.Windows.Controls;
namespace WeeXnes.Views.ProfileView
{
public partial class LoginError : Page
{
public LoginError()
{
InitializeComponent();
}
private void ButtonBase_OnClick(object sender, RoutedEventArgs e)
{
NavigationService.Navigate(new Uri("/Views/ProfileView/LoginView.xaml",UriKind.Relative));
}
}
}

View file

@ -0,0 +1,19 @@
<Page x:Class="WeeXnes.Views.ProfileView.LoginView"
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.ProfileView"
mc:Ignorable="d"
Title="LoginView" Height="Auto" Width="Auto"
Loaded="LoginView_OnLoaded">
<Grid>
<StackPanel>
<Label Content="Email:"/>
<TextBox Name="tb_email" Margin="0,0,0,10" KeyDown="InputKeydown"/>
<Label Content="Password:"/>
<TextBox Name="tb_password" Margin="0,0,0,10" KeyDown="InputKeydown"/>
<Button Content="Login" HorizontalAlignment="Center" Name="LoginButton" Click="LoginButton_OnClick"/>
</StackPanel>
</Grid>
</Page>

View file

@ -0,0 +1,49 @@
using System;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Input;
using WeeXnes.Core;
namespace WeeXnes.Views.ProfileView
{
public partial class LoginView : Page
{
public static bool alreadyLoggedIn = false;
public static UpdateVar<string> errorStringCache = new UpdateVar<string>();
public LoginView()
{
InitializeComponent();
}
private void SwitchToProfileView()
{
NavigationService.Navigate(new Uri("/Views/ProfileView/ProfileView.xaml",UriKind.Relative));
}
private void LoginView_OnLoaded(object sender, RoutedEventArgs e)
{
if (alreadyLoggedIn)
{
SwitchToProfileView();
}
}
private void LoginButton_OnClick(object sender, RoutedEventArgs e)
{
attemptLogin();
}
private void InputKeydown(object sender, KeyEventArgs e)
{
if (e.Key == Key.Enter)
attemptLogin();
}
private void attemptLogin()
{
ProfileView.auth._email = tb_email.Text;
ProfileView.auth._password = tb_password.Text;
SwitchToProfileView();
}
}
}

View file

@ -0,0 +1,18 @@
<Page x:Class="WeeXnes.Views.ProfileView.MessageFullView"
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.ProfileView"
mc:Ignorable="d"
Title="MessageFullView" Height="Auto" Width="Auto"
Loaded="MessageFullView_OnLoaded">
<Grid>
<Grid.RowDefinitions>
<RowDefinition Height="50px"/>
<RowDefinition/>
</Grid.RowDefinitions>
<Label HorizontalAlignment="Center" VerticalAlignment="Center" Name="AuthorLabel" Content=""/>
<RichTextBox Grid.Row="1" Name="MessageContent" IsReadOnly="True"/>
</Grid>
</Page>

View file

@ -0,0 +1,30 @@
using System.Windows;
using System.Windows.Controls;
using System.Windows.Documents;
namespace WeeXnes.Views.ProfileView
{
public partial class MessageFullView : Page
{
public static dynamic MessageToShow = null;
public MessageFullView()
{
InitializeComponent();
}
private void MessageFullView_OnLoaded(object sender, RoutedEventArgs e)
{
if(MessageToShow == null)
return;
AuthorLabel.Content = MessageToShow.Author;
MessageContent.Document.Blocks.Clear();
MessageContent.Document.Blocks.Add(
new Paragraph(
new Run(
MessageToShow.Message.ToString()
)
)
);
}
}
}

View file

@ -0,0 +1,81 @@
<Page x:Class="WeeXnes.Views.ProfileView.ProfileView"
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.ProfileView"
xmlns:ui="http://schemas.lepo.co/wpfui/2022/xaml"
mc:Ignorable="d"
Title="ProfileView" Height="Auto" Width="Auto"
Loaded="ProfileView_OnLoaded"
Unloaded="ProfileView_OnUnloaded">
<Grid>
<Grid Name="LoadingScreen" Visibility="Collapsed">
<ui:LoadingScreen Background="Transparent"
HorizontalAlignment="Center"
VerticalAlignment="Center"/>
</Grid>
<StackPanel Orientation="Vertical" Name="ProfileContentPanel" Visibility="Collapsed">
<Border Height="40px" CornerRadius="5">
<Border.Background>
<ImageBrush
Stretch="UniformToFill"
x:Name="BannerBackground"/>
</Border.Background>
<Label Content="TestName" HorizontalAlignment="Center" VerticalAlignment="Center"
Foreground="White"
FontSize="20px"
Name="UsernameLabel">
<Label.Effect>
<DropShadowEffect
ShadowDepth="0"
Direction="0"
Color="Black"
Opacity="1"
BlurRadius="3"/>
</Label.Effect>
</Label>
</Border>
<Label Name="ProfileDesc" HorizontalAlignment="Center" Foreground="White" Padding="0,10,0,10"/>
<Separator/>
<Label Content="" HorizontalAlignment="Center" Padding="0,0,0,0"/>
<!-- Options for Account -->
<ui:CardAction Icon="MailInbox24"
Name="InboxButton"
Click="InboxButton_OnClick">
<StackPanel>
<TextBlock
Margin="0,0,0,4"
FontWeight="Medium"
Text="Inbox" />
<TextBlock
FontSize="11"
Foreground="{DynamicResource TextFillColorTertiaryBrush}"
Text="Check your messages" />
</StackPanel>
</ui:CardAction>
<ui:CardAction Icon="Key24"
Click="LicenseButton_OnClick"
Name="LicenseButton" Margin="0,5,0,0"
Visibility="Collapsed">
<StackPanel>
<TextBlock
Margin="0,0,0,4"
FontWeight="Medium"
Text="Licenses" />
<TextBlock
FontSize="11"
Foreground="{DynamicResource TextFillColorTertiaryBrush}"
Text="See your currently active licenses for other Apps of mine (These are no purchasable licenses, these are access licenses only given to specific people for testing)"
TextTrimming="CharacterEllipsis"/>
</StackPanel>
</ui:CardAction>
</StackPanel>
</Grid>
</Page>

View file

@ -0,0 +1,107 @@
using System;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Media.Imaging;
using WeeXnes.Core;
using WeeXnes.Views.Settings;
namespace WeeXnes.Views.ProfileView
{
public partial class ProfileView : Page
{
public static Auth auth = new Auth(
"https://weexnes.dev:4000/login",
"https://weexnes.dev:4000/user"
);
public ProfileView()
{
InitializeComponent();
}
private void ProfileView_OnLoaded(object sender, RoutedEventArgs e)
{
auth.ExceptionCache.ValueChanged += LoginWorkerException;
auth._currentUserCache.ValueChanged += userCacheChanged;
LoginView.errorStringCache.ValueChanged += errorStringChanged;
Console.WriteLine("Event hooks loaded");
Console.WriteLine("Error Hooks loaded");
if (auth._currentUserCache.Value == null)
{
LoadingScreen.Visibility = Visibility.Visible;
auth._loginWorker.RunWorkerAsync();
}
else
{
LoadProfileToGui();
ProfileContentPanel.Visibility = Visibility.Visible;
}
}
private void userCacheChanged()
{
if (auth._currentUserCache.Value != null)
{
this.Dispatcher.Invoke(() =>
{
LoadProfileToGui();
ProfileContentPanel.Visibility = Visibility.Visible;
LoadingScreen.Visibility = Visibility.Collapsed;
});
}
else
{
this.Dispatcher.Invoke(() =>
{
ProfileContentPanel.Visibility = Visibility.Collapsed;
LoadingScreen.Visibility = Visibility.Visible;
});
}
}
private void LoginWorkerException()
{
this.Dispatcher.Invoke(() =>
{
new FluentMessageBox(auth.ExceptionCache.Value.ToString()).ShowDialog();
errorStringChanged();
});
}
private void LoadProfileToGui()
{
//Load Profile
UsernameLabel.Content = Convert.ToString(auth._currentUserCache.Value.name);
ProfileDesc.Content = Convert.ToString(auth._currentUserCache.Value.profileInfo.bio);
BannerBackground.ImageSource =
new BitmapImage(new Uri(Convert.ToString(auth._currentUserCache.Value.profileInfo.bannerUrl)));
}
private void ProfileView_OnUnloaded(object sender, RoutedEventArgs e)
{
auth.ExceptionCache.ValueChanged -= LoginWorkerException;
auth._currentUserCache.ValueChanged -= userCacheChanged;
LoginView.errorStringCache.ValueChanged -= errorStringChanged;
Console.WriteLine("Event hooks unloaded");
Console.WriteLine("Error hooks unloaded");
}
private void errorStringChanged()
{
this.Dispatcher.Invoke(() =>
{
NavigationService.Navigate(new Uri("/Views/ProfileView/LoginError.xaml",UriKind.Relative));
});
}
private void InboxButton_OnClick(object sender, RoutedEventArgs e)
{
NavigationService.Navigate(new Uri("/Views/ProfileView/InboxView.xaml",UriKind.Relative));
}
private void LicenseButton_OnClick(object sender, RoutedEventArgs e)
{
NavigationService.Navigate(new Uri("/Views/ProfileView/LicenseView.xaml",UriKind.Relative));
}
}
}

View file

@ -17,7 +17,8 @@
<ui:CardAction Icon="Play28"
Name="ButtonCheckForUpdates"
Click="ButtonCheckForUpdates_OnClick"
Margin="0,10,0,0">
Margin="0,10,0,0"
Visibility="Collapsed">
<StackPanel>
<TextBlock
Margin="0,0,0,4"
@ -103,6 +104,33 @@
</Grid>
<StackPanel Orientation="Vertical" Name="MiscOptions" Margin="0,0,0,5">
<Label Content="set automatic shutdown" HorizontalAlignment="Center"/>
<ui:NumberBox Name="ShutdownTimer"/>
<ui:Button Content="Set" HorizontalAlignment="Stretch" Margin="0,5,0,5" Click="TimedShutdown_OnClick"/>
<ui:Button Content="Reset" HorizontalAlignment="Stretch" Click="ResetShutdown_OnClick"/>
</StackPanel>
<StackPanel Orientation="Vertical" Visibility="Collapsed" Name="DebugOptions">
<Label Content="Debug" HorizontalAlignment="Center"/>
<CheckBox Content="Check for updates on Startup"
Name="CheckboxAutoUpdate"
Checked="CheckboxAutoUpdate_OnChecked"
Unchecked="CheckboxAutoUpdate_OnUnchecked"/>
<ui:CardAction Icon="ErrorCircle24"
Click="dbg_throwException">
<StackPanel>
<TextBlock
Margin="0,0,0,4"
FontWeight="Medium"
Text="Throw Exception"
/>
</StackPanel>
</ui:CardAction>
</StackPanel>
</StackPanel>
</ScrollViewer>
</Grid>

View file

@ -1,10 +1,12 @@
using System;
using System.Collections;
using System.Diagnostics;
using System.IO;
using System.Net;
using System.Windows;
using Application = System.Windows.Forms.Application;
using System.Windows.Controls;
using System.Windows.Media.Animation;
using Newtonsoft.Json;
using Nocksoft.IO.ConfigFiles;
using WeeXnes.Core;
@ -23,8 +25,16 @@ namespace WeeXnes.Views.Settings
{
InitializeComponent();
LoadSettingsToGui();
EnableDebugOptions();
}
private void EnableDebugOptions()
{
if(!App.DebugMode)
return;
DebugOptions.Visibility = Visibility.Visible;
}
private void LoadSettingsToGui()
{
CheckboxCensorKeys.IsChecked = KeyManagerView.Data.censorKeys.Value;
@ -40,12 +50,23 @@ namespace WeeXnes.Views.Settings
{
KeyManagerView.Data.censorKeys.Value = false;
}
private void CheckboxAutoUpdate_OnChecked(object sender, RoutedEventArgs e)
{
Global.checkUpdateOnStartup.Value = true;
}
private void CheckboxAutoUpdate_OnUnchecked(object sender, RoutedEventArgs e)
{
Global.checkUpdateOnStartup.Value = false;
}
private void ButtonCheckForUpdates_OnClick(object sender, RoutedEventArgs e)
{
Console.WriteLine("Checking for Updates...");
try
{
using(WebClient webClient = new WebClient())
@ -56,14 +77,19 @@ namespace WeeXnes.Views.Settings
GithubApiResponse apiResponseData = JsonConvert.DeserializeObject<GithubApiResponse>(downloadString);
if (apiResponseData.tag_name != Information.Version)
{
Console.WriteLine("Update found");
UpdateFoundView.Data.updateResponse = apiResponseData;
NavigationService.Navigate(new Uri("/Views/Settings/UpdateFoundView.xaml",UriKind.Relative));
}
else
{
Console.WriteLine("No Update found");
}
}
}
catch (Exception ex)
{
Console.WriteLine(ex);
Console.WriteLine(ex.ToString());
}
}
@ -77,7 +103,7 @@ namespace WeeXnes.Views.Settings
}
catch (Exception ex)
{
MessageBox.Show(ex.Message);
Console.Error(ex.Message);
}
}
@ -90,7 +116,7 @@ namespace WeeXnes.Views.Settings
}
catch (Exception ex)
{
MessageBox.Show(ex.Message);
Console.Error(ex.Message);
}
}
@ -103,7 +129,7 @@ namespace WeeXnes.Views.Settings
}
catch (Exception ex)
{
MessageBox.Show(ex.Message);
Console.Error(ex.Message);
}
}
@ -131,5 +157,35 @@ namespace WeeXnes.Views.Settings
{
KeyManagerView.Data.sortList.Value = false;
}
private void dbg_throwException(object sender, RoutedEventArgs e)
{
Console.Warning("Creating ArithmeticException for Debugging");
Functions.ThrowTestException(new ArithmeticException());
}
private void TimedShutdown_OnClick(object sender, RoutedEventArgs e)
{
Console.WriteLine("Setting timed shutdown in " + (Convert.ToInt32(ShutdownTimer.Value)) + "mins");
System.Diagnostics.Process process = new System.Diagnostics.Process();
System.Diagnostics.ProcessStartInfo startInfo = new System.Diagnostics.ProcessStartInfo();
startInfo.WindowStyle = System.Diagnostics.ProcessWindowStyle.Hidden;
startInfo.FileName = "cmd.exe";
startInfo.Arguments = "/C shutdown -s -t " + (Convert.ToInt32(ShutdownTimer.Value)*60).ToString();
process.StartInfo = startInfo;
process.Start();
}
private void ResetShutdown_OnClick(object sender, RoutedEventArgs e)
{
Console.WriteLine("Canceling timed shutdown");
System.Diagnostics.Process process = new System.Diagnostics.Process();
System.Diagnostics.ProcessStartInfo startInfo = new System.Diagnostics.ProcessStartInfo();
startInfo.WindowStyle = System.Diagnostics.ProcessWindowStyle.Hidden;
startInfo.FileName = "cmd.exe";
startInfo.Arguments = "/C shutdown -a";
process.StartInfo = startInfo;
process.Start();
}
}
}

View file

@ -48,7 +48,7 @@ namespace WeeXnes.Views.Settings
}
catch (Exception ex)
{
Console.WriteLine(ex);
Console.WriteLine(ex.ToString());
}
}

View file

@ -4,7 +4,7 @@
<PropertyGroup>
<Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
<Platform Condition=" '$(Platform)' == '' ">AnyCPU</Platform>
<Version>4.4.2</Version>
<Version>4.7</Version>
<ProjectGuid>{4B33CEE7-C74D-43B9-B99A-8B273D5195BC}</ProjectGuid>
<OutputType>WinExe</OutputType>
<RootNamespace>WeeXnes</RootNamespace>
@ -15,6 +15,7 @@
<WarningLevel>4</WarningLevel>
<AutoGenerateBindingRedirects>true</AutoGenerateBindingRedirects>
<ApplicationIcon>wicns.ico</ApplicationIcon>
<LangVersion>12</LangVersion>
</PropertyGroup>
<PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
<PlatformTarget>AnyCPU</PlatformTarget>
@ -41,6 +42,7 @@
<Reference Include="DiscordRPC, Version=1.0.175.0, Culture=neutral, processorArchitecture=MSIL">
<HintPath>..\packages\DiscordRichPresence.1.0.175\lib\net35\DiscordRPC.dll</HintPath>
</Reference>
<Reference Include="Microsoft.CSharp" />
<Reference Include="Newtonsoft.Json, Version=12.0.0.0, Culture=neutral, PublicKeyToken=30ad4fe6b2a6aeed, processorArchitecture=MSIL">
<HintPath>..\packages\Newtonsoft.Json.12.0.2\lib\net45\Newtonsoft.Json.dll</HintPath>
</Reference>
@ -51,6 +53,7 @@
<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.Net.Http" />
<Reference Include="System.Windows.Forms" />
<Reference Include="System.Xml" />
<Reference Include="System.Xaml">
@ -68,9 +71,11 @@
<Generator>MSBuild:Compile</Generator>
<SubType>Designer</SubType>
</ApplicationDefinition>
<Compile Include="Core\CustomConsole.cs" />
<Compile Include="Core\Console.cs" />
<Compile Include="Core\EncryptorLibrary.cs" />
<Compile Include="Core\HandleLaunchArguments.cs" />
<Compile Include="Core\LoginLib.cs" />
<Compile Include="Core\PluginManager.cs" />
<Compile Include="Core\RpcLogEvents.cs" />
<Compile Include="Core\SaveSettingsHandler.cs" />
<Compile Include="Core\WXFile.cs" />
@ -87,6 +92,9 @@
<Compile Include="Views\DiscordRPC\RunRPCView.xaml.cs">
<DependentUpon>RunRPCView.xaml</DependentUpon>
</Compile>
<Compile Include="Views\EncryptedTextEditor\TextEditorView.xaml.cs">
<DependentUpon>TextEditorView.xaml</DependentUpon>
</Compile>
<Compile Include="Views\Home\HomeView.xaml.cs">
<DependentUpon>HomeView.xaml</DependentUpon>
</Compile>
@ -103,6 +111,27 @@
<Compile Include="Views\PasswordGenerator\SaveToKeyManagerView.xaml.cs">
<DependentUpon>SaveToKeyManagerView.xaml</DependentUpon>
</Compile>
<Compile Include="Views\PluginManager\PluginManagerView.xaml.cs">
<DependentUpon>PluginManagerView.xaml</DependentUpon>
</Compile>
<Compile Include="Views\ProfileView\InboxView.xaml.cs">
<DependentUpon>InboxView.xaml</DependentUpon>
</Compile>
<Compile Include="Views\ProfileView\LicenseView.xaml.cs">
<DependentUpon>LicenseView.xaml</DependentUpon>
</Compile>
<Compile Include="Views\ProfileView\LoginError.xaml.cs">
<DependentUpon>LoginError.xaml</DependentUpon>
</Compile>
<Compile Include="Views\ProfileView\LoginView.xaml.cs">
<DependentUpon>LoginView.xaml</DependentUpon>
</Compile>
<Compile Include="Views\ProfileView\MessageFullView.xaml.cs">
<DependentUpon>MessageFullView.xaml</DependentUpon>
</Compile>
<Compile Include="Views\ProfileView\ProfileView.xaml.cs">
<DependentUpon>ProfileView.xaml</DependentUpon>
</Compile>
<Compile Include="Views\Settings\ApiResponse.cs" />
<Compile Include="Views\Settings\ChangePathsView.xaml.cs">
<DependentUpon>ChangePathsView.xaml</DependentUpon>
@ -136,11 +165,19 @@
<Page Include="Views\DiscordRPC\DiscordRPCView.xaml" />
<Page Include="Views\DiscordRPC\EditRPCView.xaml" />
<Page Include="Views\DiscordRPC\RunRPCView.xaml" />
<Page Include="Views\EncryptedTextEditor\TextEditorView.xaml" />
<Page Include="Views\Home\HomeView.xaml" />
<Page Include="Views\KeyManager\KeyManagerView.xaml" />
<Page Include="Views\PasswordGenerator\PasswordGenView.xaml" />
<Page Include="Views\PasswordGenerator\SavePasswordView.xaml" />
<Page Include="Views\PasswordGenerator\SaveToKeyManagerView.xaml" />
<Page Include="Views\PluginManager\PluginManagerView.xaml" />
<Page Include="Views\ProfileView\InboxView.xaml" />
<Page Include="Views\ProfileView\LicenseView.xaml" />
<Page Include="Views\ProfileView\LoginError.xaml" />
<Page Include="Views\ProfileView\LoginView.xaml" />
<Page Include="Views\ProfileView\MessageFullView.xaml" />
<Page Include="Views\ProfileView\ProfileView.xaml" />
<Page Include="Views\Settings\ChangePathsView.xaml" />
<Page Include="Views\Settings\FluentMessageBox.xaml" />
<Page Include="Views\Settings\SettingsView.xaml" />
@ -168,5 +205,11 @@
<Content Include="wicns.ico" />
<Resource Include="Images\wicon.png" />
</ItemGroup>
<ItemGroup>
<ProjectReference Include="..\WXPlugin\WXPlugin.csproj">
<Project>{56bfe4e0-0d30-474a-b57b-cf08515ff66e}</Project>
<Name>WXPlugin</Name>
</ProjectReference>
</ItemGroup>
<Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" />
</Project>

View file

@ -13,6 +13,7 @@
<ProjectTypeGuids>{60dc8134-eba5-43b8-bcc9-bb4bc16c2548};{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}</ProjectTypeGuids>
<WarningLevel>4</WarningLevel>
<AutoGenerateBindingRedirects>true</AutoGenerateBindingRedirects>
<LangVersion>12</LangVersion>
</PropertyGroup>
<PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
<PlatformTarget>AnyCPU</PlatformTarget>