Files
KfChatDotNet/KfChatDotNetGui/Views/IdentitySettingsWindow.axaml.cs

117 lines
3.9 KiB
C#

using System;
using System.IO;
using System.Text.Json;
using System.Threading.Tasks;
using Avalonia;
using Avalonia.Controls;
using Avalonia.Interactivity;
using Avalonia.Markup.Xaml;
using Avalonia.Media;
using Avalonia.Threading;
using KfChatDotNetGui.Helpers;
using KfChatDotNetGui.Models;
using KfChatDotNetGui.ViewModels;
using NLog;
namespace KfChatDotNetGui.Views;
public partial class IdentitySettingsWindow : Window
{
private Logger _logger = LogManager.GetCurrentClassLogger();
public IdentitySettingsWindow()
{
InitializeComponent();
#if DEBUG
this.AttachDevTools();
#endif
}
private void InitializeComponent()
{
AvaloniaXamlLoader.Load(this);
}
private void SaveButton_OnClick(object? sender, RoutedEventArgs e)
{
var saveResult = this.FindControl<TextBlock>("SaveResult");
try
{
var settings = new SettingsModel
{
XfSessionToken = (DataContext as IdentitySettingsWindowViewModel).XfSessionToken,
WsUri = (DataContext as IdentitySettingsWindowViewModel).WsUri,
ReconnectTimeout = (DataContext as IdentitySettingsWindowViewModel).ReconnectTimeout,
AntiDdosPow = (DataContext as IdentitySettingsWindowViewModel).AntiDdosPow,
Username = (DataContext as IdentitySettingsWindowViewModel).Username
};
var options = new JsonSerializerOptions { WriteIndented = true };
File.WriteAllText("settings.json", JsonSerializer.Serialize(settings, options));
}
catch (Exception ex)
{
_logger.Error(ex);
saveResult.Foreground = Brushes.Red;
saveResult.Text = "Failed to save settings due to an error: " + ex.Message;
saveResult.IsVisible = true;
return;
}
saveResult.Foreground = Brushes.Green;
saveResult.Text = "Successfully saved settings!";
saveResult.IsVisible = true;
}
private void TestTokenButton_OnClick(object? sender, RoutedEventArgs e)
{
var saveResult = this.FindControl<TextBlock>("SaveResult");
saveResult.Foreground = Brushes.Yellow;
saveResult.Text = "Testing XenForo token";
saveResult.IsVisible = true;
var kfHost = (DataContext as IdentitySettingsWindowViewModel).WsUri.Host;
Dispatcher.UIThread.Post(
() => TestXfToken((DataContext as IdentitySettingsWindowViewModel).XfSessionToken, kfHost, (DataContext as IdentitySettingsWindowViewModel).AntiDdosPow),
DispatcherPriority.Background);
}
public void UpdateSaveText(ISolidColorBrush brush, string text)
{
Dispatcher.UIThread.InvokeAsync(() =>
{
var saveResult = this.FindControl<TextBlock>("SaveResult");
saveResult.Foreground = brush;
saveResult.Text = text;
if (!saveResult.IsVisible)
{
saveResult.IsVisible = true;
}
});
}
public async Task TestXfToken(string xfToken, string kfHost, string? antiDdosPowToken = null)
{
ForumIdentityModel forumIdentity;
try
{
forumIdentity = await ForumIdentity.GetForumIdentity(xfToken, new Uri($"https://{kfHost}/test-chat"), antiDdosPowToken);
}
catch (Exception ex)
{
_logger.Error(ex);
UpdateSaveText(Brushes.Red, "Caught exception while testing token: " + ex.Message);
return;
}
if (forumIdentity == null)
{
UpdateSaveText(Brushes.Red, "Failed to parse SneedChat page, got a null when deserializing the user info");
return;
}
if (forumIdentity.Id == 0)
{
UpdateSaveText(Brushes.Red, "Token is invalid, SneedChat page returned Guest");
return;
}
UpdateSaveText(Brushes.Green, "Success! Token belongs to " + forumIdentity.Username);
}
}