Files
open-save-cloud-client/OpenSaveCloudClient/GameLibraryForm.cs
2022-05-22 22:44:21 +02:00

292 lines
9.8 KiB
C#

using OpenSaveCloudClient.Models;
using OpenSaveCloudClient.Core;
using IGDB;
using OpenSaveCloudClient.Models.Remote;
namespace OpenSaveCloudClient
{
public partial class GameLibrary : Form
{
private readonly Configuration _configuration;
private readonly IGDBClient? _client;
private readonly SaveManager saveManager;
private readonly TaskManager taskManager;
private readonly ServerConnector serverConnector;
private readonly LogManager logManager;
public GameLibrary()
{
InitializeComponent();
saveManager = SaveManager.GetInstance();
taskManager = TaskManager.GetInstance();
serverConnector = ServerConnector.GetInstance();
_configuration = Configuration.GetInstance();
logManager = LogManager.GetInstance();
/*if (_configuration.GetBoolean("igdb.enabled", false))
{
string clientId = _configuration.GetString("igdb.client_id", "");
string clientSecret = _configuration.GetString("igdb.client_secret", "");
_client = new IGDBClient(clientId, clientSecret);
}*/
}
private void GameLibrary_Load(object sender, EventArgs e)
{
taskManager.TaskChanged += taskManager_TaskChanged;
logManager.Cleared += LogManager_LogCleared;
logManager.NewMessage += LogManager_NewMessage;
new Thread(() =>
{
serverConnector.Reconnect();
if (!serverConnector.Connected)
{
this.Invoke((MethodInvoker)delegate {
ShowLoginForm();
});
}
else
{
this.Invoke((MethodInvoker)delegate {
LogoutButton.Enabled = true;
AboutButton.Enabled = true;
if (_configuration.GetBoolean("synchronization.at_login", true))
{
SyncButton_Click(sender, e);
} else
{
AddButton.Enabled = true;
SyncButton.Enabled = true;
}
});
}
}).Start();
RefreshList();
}
private void ShowLoginForm()
{
Enabled = false;
LoginForm loginForm = new LoginForm();
loginForm.FormClosed += LoginForm_Close;
loginForm.Show();
}
private void LoginForm_Close(object? sender, EventArgs e)
{
if (!serverConnector.Connected)
{
Close();
} else
{
Enabled = true;
LogoutButton.Enabled = true;
AboutButton.Enabled = true;
if (_configuration.GetBoolean("synchronization.at_login", true))
{
SyncButton_Click(sender, e);
}
else
{
AddButton.Enabled = true;
SyncButton.Enabled = true;
}
}
}
private void AddButton_Click(object sender, EventArgs e)
{
AddGameForm form = new(_client);
if (form.ShowDialog() == DialogResult.OK) {
GameSave newGame = form.Result;
new Thread(() => AddGameToLibrary(newGame)).Start();
}
}
private void AddGameToLibrary(GameSave newGame)
{
string taskUuid = "";
try
{
taskUuid = StartTask(String.Format("Archiving \"{0}\"", newGame.Name), true, 1);
Game? g = serverConnector.CreateGame(newGame.Name);
if (g != null)
{
newGame.Id = g.Id;
newGame.Archive();
saveManager.Saves.Add(newGame);
saveManager.Save();
SetTaskEnded(taskUuid);
this.Invoke((MethodInvoker)delegate {
RefreshList();
if (_configuration.GetBoolean("synchronization.at_game_creation", true))
{
SyncButton_Click(null, null);
}
});
} else
{
logManager.AddError(new Exception("Failed to create game on the server"));
SetTaskFailed(taskUuid);
}
}
catch (Exception ex)
{
logManager.AddError(ex);
SetTaskFailed(taskUuid);
}
}
private void ConfigButton_Click(object sender, EventArgs e)
{
SettingsForm form = new();
form.ShowDialog();
}
private void RefreshList()
{
listView1.Clear();
foreach (GameSave game in saveManager.Saves)
{
ListViewItem itm = listView1.Items.Add(game.Name);
itm.ImageKey = "unknown_cover.png";
}
}
private string StartTask(string label, bool undefined, int maxProgress)
{
return taskManager.StartTask(label, undefined, maxProgress);
}
private void SetTaskEnded(string uuid)
{
try
{
taskManager.UpdateTaskStatus(uuid, AsyncTaskStatus.Ended);
}
catch (Exception ex)
{
logManager.AddError(ex);
}
}
private void SetTaskFailed(string uuid)
{
try
{
taskManager.UpdateTaskStatus(uuid, AsyncTaskStatus.Failed);
}
catch (Exception ex)
{
logManager.AddError(ex);
}
}
private void taskManager_TaskChanged(object? sender, TaskChangedEventArgs e)
{
string text = "";
switch (e.TaskInformation.Status)
{
case AsyncTaskStatus.Running:
text = e.TaskInformation.Label;
break;
case AsyncTaskStatus.Stopped:
text = String.Format("Stopped: {0}", e.TaskInformation.Label);
break;
case AsyncTaskStatus.Failed:
text = String.Format("Failed: {0}", e.TaskInformation.Label);
break;
case AsyncTaskStatus.Ended:
text = String.Format("Ended: {0}", e.TaskInformation.Label);
break;
}
if (taskManager.TasksInformation.Count > 1)
{
this.Invoke((MethodInvoker)delegate {
toolStripStatusLabel1.Text = String.Format("{0} (and {1} more)", text, taskManager.TasksInformation.Count);
});
}
else
{
this.Invoke((MethodInvoker)delegate {
toolStripStatusLabel1.Text = text;
});
}
}
private void LogoutButton_Click(object sender, EventArgs e)
{
serverConnector.Logout();
AddButton.Enabled = false;
LogoutButton.Enabled = false;
AboutButton.Enabled = false;
ShowLoginForm();
}
private void AboutButton_Click(object sender, EventArgs e)
{
AboutBox aboutBox = new();
aboutBox.ShowDialog();
}
private void LogButton_Click(object sender, EventArgs e)
{
LogsForm form = new();
form.Show();
}
private void LogManager_NewMessage(object? sender, NewMessageEventArgs e)
{
int errors = logManager.Messages.Count(m => m.Severity == LogSeverity.Error);
int warnings = logManager.Messages.Count(m => m.Severity == LogSeverity.Warning);
string label = "";
if (errors > 0)
{
label = String.Format("({0} errors)", errors);
}
if (warnings > 0)
{
if (errors > 0)
{
label += " ";
}
label = String.Format("({0} warnings)", warnings);
}
if (errors > 0 || warnings > 0)
{
this.Invoke((MethodInvoker)delegate {
ErrorLogButton.Text = label;
ErrorLogButton.DisplayStyle = ToolStripItemDisplayStyle.ImageAndText;
});
}
}
private void LogManager_LogCleared(object? sender, ClearEventArgs e)
{
this.Invoke((MethodInvoker)delegate {
ErrorLogButton.Text = "Show logs";
ErrorLogButton.DisplayStyle = ToolStripItemDisplayStyle.Image;
});
}
private void toolStripDropDownButton1_Click(object sender, EventArgs e)
{
TasksForm form = new();
form.Show();
}
private void SyncButton_Click(object sender, EventArgs e)
{
AddButton.Enabled = false;
SyncButton.Enabled = false;
new Thread(() => {
serverConnector.Synchronize();
this.Invoke((MethodInvoker)delegate {
AddButton.Enabled = true;
SyncButton.Enabled = true;
});
}).Start();
}
}
}