Luski/Luski/GUI/MainScreen.cs
2023-01-08 01:41:19 -05:00

251 lines
8.0 KiB
C#

using GraphicsManager.Enums;
using GraphicsManager.Interfaces;
using GraphicsManager.Objects;
using GraphicsManager.Objects.Core;
using Luski.GUI.MainScreen.Interfaces;
using Luski.GUI.MainScreen.UI;
using Luski.GUI.StartPage.UI;
using Luski.net;
using Luski.net.Enums;
using Luski.net.Interfaces;
using Luski.net.JsonTypes;
using OpenTK.Mathematics;
using OpenTK.Windowing.Desktop;
using OpenTK.Windowing.Common;
using Window = GraphicsManager.Window;
namespace Luski.GUI.MainScreen;
public class MainScreen : Window
{
private static readonly NativeWindowSettings Settings = new()
{
Title = "Luski Login",
WindowBorder = WindowBorder.Fixed,
APIVersion = new Version(3, 2),
StartFocused = true,
Size = new OpenTK.Mathematics.Vector2i(481, 838),
};
private TabControl tc;
private FlowLayout? channelpicker, friends, friend_request;
private RoundedButton? FriendManagerBtn;
public Chat? chat;
Login login;
CreateAccount ca;
public MainScreen() : base(Settings)
{
Controls.Add(ca = new CreateAccount() {Visible = false});
ca.ChangeToApp += LoginOnChangeToApp;
Controls.Add(login = new Login());
login.ChangeToApp += LoginOnChangeToApp;
login.ChangeToCa += LoginOnChangeToCa;
Thread t = new(_ => Encryption.GenerateKeys());
t.Start();
}
private Task LoginOnChangeToCa()
{
Title = "Create Account";
ca.Visible = true;
login.Visible = false;
return Task.CompletedTask;
}
public void AddGroup(SocketGroupChannel group)
{
Group friend = new(group);
friend.ClickCon += ChannelOnClickCon;
channelpicker!.Controls.Add(friend);
chans.Add(friend);
}
private readonly List<Friend> fr = new();
private List<IChannelPick> chans = new();
private Dictionary<long, int> FR_Index = new();
public void AddFriendRequest(SocketRemoteUser user)
{
FriendRequest frui = new(this, user);
FR_Index.Add(user.Id, friend_request!.Controls.Length);
friend_request.Controls.Add(frui);
}
public void RemoveFriendRequest(SocketRemoteUser user)
{
if (!FR_Index.ContainsKey(user.Id)) return;
friend_request!.Controls.Remove(friend_request!.Controls[FR_Index[user.Id]]);
}
public void AddFriend(SocketRemoteUser user)
{
Friend friend2 = new(user);
friend2.ClickCon += ChannelOnClickCon;
friends.Controls.Add(friend2);
if (user.Channel is not null)
{
Friend friend = new(user);
friend.ClickCon += ChannelOnClickCon;
fr.Add(friend);
channelpicker!.Controls.Add(friend);
chans.Add(friend);
}
}
private Task ChannelOnClickCon(IChannelPick arg)
{
try
{
if (!chat.Visible)
{
chat.Visible = true;
tc.Visible = false;
}
chat!.UpdateTitle(arg);
chat.Clear();
IReadOnlyList<SocketMessage> messages = arg.Channel.GetMessages(200).Result;
foreach (SocketMessage message in messages.Reverse())
{
chat.AddMessage(message);
}
DrawFrame();
}
catch (Exception e)
{
Console.WriteLine(e);
}
return Task.CompletedTask;
}
private Task LoginOnChangeToApp()
{
Controls.Clear();
BlockDraw = true;
Title = "Luski";
Size = new(2048, 1334);
WindowBorder = WindowBorder.Resizable;
BackgroundColor = new Color4(34, 34, 34, 255);
Controls.Add(new Rectangle(new Texture(Globals.Luski.CurrentUser.GetAvatar().Result)) { Anchor = ObjectAnchor.Bottom | ObjectAnchor.Left, Size = new(70, 70), Location = new(94, 1248)});
Controls.Add(new Label(){ Anchor = ObjectAnchor.Bottom | ObjectAnchor.Left, Location = new(172, 1271), Text = Globals.Luski.CurrentUser.Username});
FlowLayout ser;
Controls.Add(chat = new() {Location = new(528,0)});
Controls.Add(ser = new FlowLayout()
{
BackgroundColor = new(26, 26, 26, 255),
Size = new(80,1334),
Anchor = ObjectAnchor.Top | ObjectAnchor.Left | ObjectAnchor.Bottom,
});
Controls.Add(tc = new()// this is here to showcase my good friend TCLL
{
Location = chat.Location,
Size = chat.Size,
BackgroundColor = chat.BackgroundColor,
Anchor = ObjectAnchor.All,
Visible = false
});
tc.AddPage("Frineds", friends = new FlowLayout()
{
BackgroundColor = new(45,45,45,255)
});
tc.AddPage("Friend Request", friend_request = new FlowLayout()
{
BackgroundColor = new(45,45,45,255)
});
tc.AddPage("Add Friend", new AddFriendPage(this));
ser.Controls.Add(new Rectangle(Globals.LuskiTexture)
{
Size = new(80,80),
});
Controls.Add(channelpicker = new FlowLayout()
{
BackgroundColor = new(34,34,34,255),
Size = new(448, 1232),
Location = new(80, 0),
Anchor = ObjectAnchor.Top | ObjectAnchor.Left | ObjectAnchor.Bottom
});
channelpicker.Controls.Add(FriendManagerBtn = new RoundedButton() {Text = "Friends", Size = new(50, 80), InsideColor = new(28, 28, 28, 255), BorderColor = Color4.DarkCyan});
FriendManagerBtn.Clicked += FriendManagerBtnOnClicked;
foreach (SocketGroupChannel ch in Globals.Luski.CurrentUser.Channels.Where(s => s is SocketGroupChannel).Cast<SocketGroupChannel>())
{
AddGroup(ch);
}
foreach (SocketRemoteUser item in Globals.Luski.CurrentUser.Friends)
{
if (item.Channel is not null) AddFriend(item);
}
SocketTextChannel chan = Globals.Luski.GetChannel<SocketTextChannel>(Globals.Luski.CurrentUser.SelectedChannel).Result;
chat.UpdateTitle(chans.First(s => s.Channel.Id == chan.Id));
IReadOnlyList<SocketMessage> messages = chan.GetMessages(200).Result;
foreach (SocketMessage message in messages.Reverse())
{
chat.AddMessage(message);
}
Globals.Luski.OnError += LuskiOnOnError;
Globals.Luski.UserStatusUpdate += LuskiOnUserStatusUpdate;
Globals.Luski.ReceivedFriendRequest += LuskiOnReceivedFriendRequest;
Globals.Luski.FriendRequestResult += LuskiOnFriendRequestResult;
foreach (SocketRemoteUser cufr in Globals.Luski.CurrentUser.FriendRequests)
{
AddFriendRequest(cufr);
}
BlockDraw = false;
DrawFrame();
return Task.CompletedTask;
}
private Task LuskiOnOnError(Exception arg)
{
Console.WriteLine(arg);
return Task.CompletedTask;
}
private Task LuskiOnFriendRequestResult(SocketRemoteUser arg1, bool arg2)
{
Invoke(new Action(() =>
{
RemoveFriendRequest(arg1);
if (arg2) AddFriend(arg1);
}));
return Task.CompletedTask;
}
private Task LuskiOnReceivedFriendRequest(SocketRemoteUser arg)
{
Invoke(new Action(() =>
{
AddFriendRequest(arg);
}));
return Task.CompletedTask;
}
private Task LuskiOnUserStatusUpdate(IUser before, IUser After)
{
if (before is not SocketRemoteUser Before || Before.FriendStatus != FriendStatus.Friends) return Task.CompletedTask;
Label stat = fr.Where(s => s.User.Id == before.Id).First()!.Status;
Invoke(new Action(() =>
{
stat.Text = After.Status.ToString();
}));
return Task.CompletedTask;
}
private Task FriendManagerBtnOnClicked(IRenderObject arg)
{
if (chat.Visible)
{
chat.Visible = false;
tc.Visible = true;
}
else
{
chat.Visible = true;
tc.Visible = false;
}
return Task.CompletedTask;
}
}