251 lines
8.0 KiB
C#
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;
|
|
}
|
|
} |