2024-05-04 15:35:32 +00:00
|
|
|
|
using System;
|
2024-06-19 00:16:02 +00:00
|
|
|
|
using System.Linq;
|
2024-05-04 15:35:32 +00:00
|
|
|
|
using System.Net.Http;
|
|
|
|
|
using System.Threading.Tasks;
|
|
|
|
|
using Avalonia.Media.Imaging;
|
2024-06-19 00:16:02 +00:00
|
|
|
|
using Avalonia.Threading;
|
2024-05-04 15:35:32 +00:00
|
|
|
|
using CommunityToolkit.Mvvm.ComponentModel;
|
|
|
|
|
using CommunityToolkit.Mvvm.Input;
|
|
|
|
|
using CRD.Downloader;
|
2024-07-21 09:30:20 +00:00
|
|
|
|
using CRD.Downloader.Crunchyroll;
|
2024-06-19 00:16:02 +00:00
|
|
|
|
using CRD.Utils.Structs;
|
2024-05-04 15:35:32 +00:00
|
|
|
|
using CRD.Views.Utils;
|
|
|
|
|
using FluentAvalonia.UI.Controls;
|
2024-07-26 00:18:39 +00:00
|
|
|
|
using Newtonsoft.Json;
|
2024-05-04 15:35:32 +00:00
|
|
|
|
|
|
|
|
|
namespace CRD.ViewModels;
|
|
|
|
|
|
|
|
|
|
public partial class AccountPageViewModel : ViewModelBase{
|
2024-06-19 00:16:02 +00:00
|
|
|
|
[ObservableProperty]
|
|
|
|
|
private Bitmap? _profileImage;
|
2024-05-04 15:35:32 +00:00
|
|
|
|
|
2024-06-19 00:16:02 +00:00
|
|
|
|
[ObservableProperty]
|
|
|
|
|
private string _profileName = "";
|
2024-05-04 15:35:32 +00:00
|
|
|
|
|
2024-06-19 00:16:02 +00:00
|
|
|
|
[ObservableProperty]
|
|
|
|
|
private string _loginLogoutText = "";
|
2024-05-04 15:35:32 +00:00
|
|
|
|
|
2024-06-19 00:16:02 +00:00
|
|
|
|
[ObservableProperty]
|
|
|
|
|
private string _remainingTime = "";
|
|
|
|
|
|
|
|
|
|
private static DispatcherTimer? _timer;
|
|
|
|
|
private DateTime _targetTime;
|
2024-08-16 12:21:23 +00:00
|
|
|
|
|
2024-06-19 00:16:02 +00:00
|
|
|
|
private bool IsCancelled = false;
|
2024-08-05 03:06:40 +00:00
|
|
|
|
private bool UnknownEndDate = false;
|
2024-08-16 12:21:23 +00:00
|
|
|
|
private bool EndedButMaybeActive = false;
|
2024-05-04 15:35:32 +00:00
|
|
|
|
|
|
|
|
|
public AccountPageViewModel(){
|
|
|
|
|
UpdatetProfile();
|
2024-06-19 00:16:02 +00:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
private void Timer_Tick(object sender, EventArgs e){
|
2024-08-16 12:21:23 +00:00
|
|
|
|
var remaining = _targetTime - DateTime.Now;
|
2024-06-19 00:16:02 +00:00
|
|
|
|
if (remaining <= TimeSpan.Zero){
|
|
|
|
|
RemainingTime = "No active Subscription";
|
|
|
|
|
_timer.Stop();
|
2024-08-16 12:21:23 +00:00
|
|
|
|
if (UnknownEndDate){
|
|
|
|
|
RemainingTime = "Unknown Subscription end date";
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if (EndedButMaybeActive){
|
|
|
|
|
RemainingTime = "Subscription maybe ended";
|
|
|
|
|
}
|
|
|
|
|
|
2024-07-26 00:18:39 +00:00
|
|
|
|
if (CrunchyrollManager.Instance.Profile.Subscription != null){
|
|
|
|
|
Console.Error.WriteLine(JsonConvert.SerializeObject(CrunchyrollManager.Instance.Profile.Subscription, Formatting.Indented));
|
|
|
|
|
}
|
2024-06-19 00:16:02 +00:00
|
|
|
|
} else{
|
2024-06-19 15:00:08 +00:00
|
|
|
|
RemainingTime = $"{(IsCancelled ? "Subscription ending in: " : "Subscription refreshing in: ")}{remaining:dd\\:hh\\:mm\\:ss}";
|
2024-06-19 00:16:02 +00:00
|
|
|
|
}
|
2024-05-04 15:35:32 +00:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
public void UpdatetProfile(){
|
2024-08-16 12:21:23 +00:00
|
|
|
|
ProfileName = CrunchyrollManager.Instance.Profile.Username ?? "???"; // Default or fetched user name
|
2024-07-21 09:30:20 +00:00
|
|
|
|
LoginLogoutText = CrunchyrollManager.Instance.Profile.Username == "???" ? "Login" : "Logout"; // Default state
|
|
|
|
|
LoadProfileImage("https://static.crunchyroll.com/assets/avatar/170x170/" + CrunchyrollManager.Instance.Profile.Avatar);
|
2024-06-19 15:00:08 +00:00
|
|
|
|
|
|
|
|
|
|
2024-08-16 12:21:23 +00:00
|
|
|
|
var subscriptions = CrunchyrollManager.Instance.Profile.Subscription;
|
|
|
|
|
|
|
|
|
|
if (subscriptions != null){
|
|
|
|
|
if (subscriptions.SubscriptionProducts is{ Count: >= 1 }){
|
|
|
|
|
var sub = subscriptions.SubscriptionProducts.First();
|
|
|
|
|
IsCancelled = sub.IsCancelled;
|
|
|
|
|
EndedButMaybeActive = !subscriptions.IsActive;
|
|
|
|
|
} else if (subscriptions.ThirdPartySubscriptionProducts is{ Count: >= 1 }){
|
|
|
|
|
var sub = subscriptions.ThirdPartySubscriptionProducts.First();
|
|
|
|
|
IsCancelled = !sub.AutoRenew;
|
|
|
|
|
EndedButMaybeActive = !subscriptions.IsActive;
|
|
|
|
|
} else if (subscriptions.NonrecurringSubscriptionProducts is{ Count: >= 1 }){
|
2024-06-21 15:45:32 +00:00
|
|
|
|
IsCancelled = true;
|
2024-08-16 12:21:23 +00:00
|
|
|
|
EndedButMaybeActive = !subscriptions.IsActive;
|
|
|
|
|
} else if (subscriptions.FunimationSubscriptions is{ Count: >= 1 }){
|
2024-08-05 03:06:40 +00:00
|
|
|
|
IsCancelled = true;
|
|
|
|
|
UnknownEndDate = true;
|
2024-06-19 15:00:08 +00:00
|
|
|
|
}
|
|
|
|
|
|
2024-08-09 21:16:13 +00:00
|
|
|
|
if (CrunchyrollManager.Instance.Profile.Subscription?.NextRenewalDate != null && !UnknownEndDate){
|
2024-07-21 09:30:20 +00:00
|
|
|
|
_targetTime = CrunchyrollManager.Instance.Profile.Subscription.NextRenewalDate;
|
2024-06-19 15:00:08 +00:00
|
|
|
|
_timer = new DispatcherTimer{
|
|
|
|
|
Interval = TimeSpan.FromSeconds(1)
|
|
|
|
|
};
|
|
|
|
|
_timer.Tick += Timer_Tick;
|
|
|
|
|
_timer.Start();
|
2024-06-19 00:16:02 +00:00
|
|
|
|
}
|
|
|
|
|
} else{
|
|
|
|
|
RemainingTime = "No active Subscription";
|
2024-06-19 15:00:08 +00:00
|
|
|
|
if (_timer != null){
|
|
|
|
|
_timer.Stop();
|
|
|
|
|
_timer.Tick -= Timer_Tick;
|
|
|
|
|
}
|
2024-08-16 12:21:23 +00:00
|
|
|
|
|
2024-06-19 15:00:08 +00:00
|
|
|
|
RaisePropertyChanged(nameof(RemainingTime));
|
2024-07-26 00:18:39 +00:00
|
|
|
|
|
|
|
|
|
if (CrunchyrollManager.Instance.Profile.Subscription != null){
|
|
|
|
|
Console.Error.WriteLine(JsonConvert.SerializeObject(CrunchyrollManager.Instance.Profile.Subscription, Formatting.Indented));
|
|
|
|
|
}
|
2024-06-19 00:16:02 +00:00
|
|
|
|
}
|
2024-08-05 03:06:40 +00:00
|
|
|
|
|
|
|
|
|
if (UnknownEndDate){
|
|
|
|
|
RemainingTime = "Unknown Subscription end date";
|
|
|
|
|
}
|
2024-08-16 12:21:23 +00:00
|
|
|
|
|
|
|
|
|
if (EndedButMaybeActive){
|
|
|
|
|
RemainingTime = "Subscription maybe ended";
|
|
|
|
|
}
|
2024-05-04 15:35:32 +00:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
[RelayCommand]
|
|
|
|
|
public async Task Button_Press(){
|
|
|
|
|
if (LoginLogoutText == "Login"){
|
|
|
|
|
var dialog = new ContentDialog(){
|
|
|
|
|
Title = "Login",
|
|
|
|
|
PrimaryButtonText = "Login",
|
|
|
|
|
CloseButtonText = "Close"
|
|
|
|
|
};
|
|
|
|
|
|
2024-08-15 00:27:49 +00:00
|
|
|
|
var viewModel = new Utils.ContentDialogInputLoginViewModel(dialog, this);
|
2024-05-04 15:35:32 +00:00
|
|
|
|
dialog.Content = new ContentDialogInputLoginView(){
|
|
|
|
|
DataContext = viewModel
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
_ = await dialog.ShowAsync();
|
|
|
|
|
} else{
|
2024-07-21 09:30:20 +00:00
|
|
|
|
await CrunchyrollManager.Instance.CrAuth.AuthAnonymous();
|
2024-05-04 15:35:32 +00:00
|
|
|
|
UpdatetProfile();
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
public async void LoadProfileImage(string imageUrl){
|
|
|
|
|
try{
|
|
|
|
|
using (var client = new HttpClient()){
|
|
|
|
|
var response = await client.GetAsync(imageUrl);
|
|
|
|
|
response.EnsureSuccessStatusCode();
|
|
|
|
|
using (var stream = await response.Content.ReadAsStreamAsync()){
|
|
|
|
|
ProfileImage = new Bitmap(stream);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
} catch (Exception ex){
|
|
|
|
|
// Handle exceptions
|
2024-06-19 00:16:02 +00:00
|
|
|
|
Console.Error.WriteLine("Failed to load image: " + ex.Message);
|
2024-05-04 15:35:32 +00:00
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|