From df9b68c4403b2a704ba4c6cb93de1c19a9d4303d Mon Sep 17 00:00:00 2001 From: JacobTech Date: Tue, 24 Jan 2023 09:27:44 -0500 Subject: [PATCH] Got my code back --- Luski/Clesses/Settings.cs | 30 ++++ Luski/Clesses/UpdaterSettings.cs | 42 +++++ Luski/GUI/MainScreen.cs | 194 ++++++++++++++++----- Luski/GUI/MainScreen/UI/AddFriendPage.cs | 6 +- Luski/GUI/MainScreen/UI/Chat.cs | 60 ++++--- Luski/GUI/MainScreen/UI/ChatMessage.cs | 68 +++++++- Luski/GUI/MainScreen/UI/ContentEmbed.cs | 4 +- Luski/GUI/MainScreen/UI/Friend.cs | 29 ++- Luski/GUI/MainScreen/UI/FriendRequest.cs | 20 +-- Luski/GUI/MainScreen/UI/Group.cs | 30 +++- Luski/GUI/StartPage/UI/CreateAccount.cs | 26 ++- Luski/GUI/StartPage/UI/Login.cs | 29 +-- Luski/GUI/UpdateWindow.cs | 100 +++++++++++ Luski/Globals.cs | 66 +++++-- Luski/Luski.csproj | 15 +- Luski/Luski.ico | Bin 0 -> 39891 bytes Luski/Program.cs | 74 +++++++- Luski/Resources/Fonts/OpenSans-Regular.ttf | Bin 0 -> 129796 bytes 18 files changed, 647 insertions(+), 146 deletions(-) create mode 100644 Luski/Clesses/Settings.cs create mode 100644 Luski/Clesses/UpdaterSettings.cs create mode 100644 Luski/GUI/UpdateWindow.cs create mode 100755 Luski/Luski.ico create mode 100644 Luski/Resources/Fonts/OpenSans-Regular.ttf diff --git a/Luski/Clesses/Settings.cs b/Luski/Clesses/Settings.cs new file mode 100644 index 0000000..f9fef7f --- /dev/null +++ b/Luski/Clesses/Settings.cs @@ -0,0 +1,30 @@ +using System.Text.Json.Serialization; + +namespace Luski.Clesses; + +public class Settings +{ + [JsonInclude] + [JsonPropertyName("scale")] + public double Scale { get; set; } = 1; + [JsonInclude] + [JsonPropertyName("perscrollpixels")] + public uint PerScrollPixels { get; set; } = 20; + [JsonInclude] + [JsonPropertyName("multithreadpercent")] + public uint MultiThreadPercent { get; set; } = 50; + [JsonInclude] + [JsonPropertyName("loadperchannel")] + public int LoadPerChannel { get; set; } = 50; +} + +[JsonSerializable(typeof(Settings))] +[JsonSourceGenerationOptions( + GenerationMode = JsonSourceGenerationMode.Default, + PropertyNamingPolicy = JsonKnownNamingPolicy.Unspecified, + WriteIndented = true, + DefaultIgnoreCondition = JsonIgnoreCondition.Never)] +internal partial class SettingsContext : JsonSerializerContext +{ + +} \ No newline at end of file diff --git a/Luski/Clesses/UpdaterSettings.cs b/Luski/Clesses/UpdaterSettings.cs new file mode 100644 index 0000000..5e3a68a --- /dev/null +++ b/Luski/Clesses/UpdaterSettings.cs @@ -0,0 +1,42 @@ +using System.Text.Json.Serialization; +using Luski.net.Enums; + +namespace Luski.Clesses; + +public class UpdaterSettings +{ + [JsonInclude] + [JsonPropertyName("self_contained")] + public bool SelfContained { get; set; } = false; + + [JsonInclude] + [JsonPropertyName("updater")] + public string? Updater { get; set; } = null; + + [JsonInclude] + [JsonPropertyName("branch")] + public Branch Branch { get; set; } = Branch.Beta; + + [JsonInclude] + [JsonPropertyName("platform")] + public string Platform { get; set; } = "linux-x64"; + + [JsonInclude] + [JsonPropertyName("auto_launch")] + public bool AutoLaunch { get; set; } = true; + + [JsonInclude] + [JsonPropertyName("update_check")] + public bool AutoUpdateCheck { get; set; } = true; +} + +[JsonSerializable(typeof(UpdaterSettings))] +[JsonSourceGenerationOptions( + GenerationMode = JsonSourceGenerationMode.Default, + PropertyNamingPolicy = JsonKnownNamingPolicy.Unspecified, + WriteIndented = true, + DefaultIgnoreCondition = JsonIgnoreCondition.Never)] +internal partial class UpdaterSettingsContext : JsonSerializerContext +{ + +} diff --git a/Luski/GUI/MainScreen.cs b/Luski/GUI/MainScreen.cs index 9df4b06..599ddee 100644 --- a/Luski/GUI/MainScreen.cs +++ b/Luski/GUI/MainScreen.cs @@ -1,3 +1,6 @@ +using System.Diagnostics; +using System.Reflection; +using GraphicsManager; using GraphicsManager.Enums; using GraphicsManager.Interfaces; using GraphicsManager.Objects; @@ -24,7 +27,8 @@ public class MainScreen : Window WindowBorder = WindowBorder.Fixed, APIVersion = new Version(3, 2), StartFocused = true, - Size = new OpenTK.Mathematics.Vector2i(481, 838), + Size = new Vector2i((int)(240.5 * Globals.Settings.Scale), (int)(419 * Globals.Settings.Scale)), + Icon = Globals.Icon }; private TabControl tc; @@ -36,13 +40,44 @@ public class MainScreen : Window public MainScreen() : base(Settings) { - Controls.Add(ca = new CreateAccount() {Visible = false}); + VSync = VSyncMode.On; + Globals.DefaultFont = + Font.MakeEmbeddedFont("Luski.Resources.Fonts.OpenSans-Regular.ttf", Assembly.GetExecutingAssembly()); + Globals.DefaultFont.PixelHeight = (uint)(12 * Globals.Settings.Scale); + //Font.MakeFontFromSystem((uint)(12 * Globals.Settings.Scale)); + Globals.LuskiTexture = TextureManager.AddTexture(Tools.GetResourceBytes(Assembly.GetExecutingAssembly(), + "Luski.Resources.Textures.Luski.png")); + + CenterWindow(0); + Controls.Add(ca = new CreateAccount()); + ca.Visible = false; ca.ChangeToApp += LoginOnChangeToApp; Controls.Add(login = new Login()); login.ChangeToApp += LoginOnChangeToApp; login.ChangeToCa += LoginOnChangeToCa; - Thread t = new(_ => Encryption.GenerateKeys()); + + Thread t = new(_ => + { + Encryption.GenerateKeys(); + + }); t.Start(); + WindowLoaded += OnWindowLoaded; + } + + private Task OnWindowLoaded(Window arg) + { + if (Globals.UpdaterSettings.AutoUpdateCheck && new HttpClient().GetAsync($"https://www.jacobtech.com/Updater/GetProgramVersion?directory=Luski&branch={Globals.UpdaterSettings.Branch}&selfcontained={Globals.UpdaterSettings.SelfContained.ToString().ToLower()}&platform={Globals.UpdaterSettings.Platform}").Result.Content.ReadAsStringAsync().Result != FileVersionInfo.GetVersionInfo(Assembly.GetExecutingAssembly().Location).FileVersion) + { + var update = new UpdateWindow(); + var result = update.ShowDialogue(this); + if (result == UpdateWindow.DialogueResult.Yes) + { + Globals.Download = true; + Close(); + } + } + return Task.CompletedTask; } private Task LoginOnChangeToCa() @@ -93,29 +128,66 @@ public class MainScreen : Window } } - private Task ChannelOnClickCon(IChannelPick arg) + private CancellationTokenSource? channelCancellationToken = null; + private async Task ChannelOnClickCon(IChannelPick arg) { try { - if (!chat.Visible) - { - chat.Visible = true; - tc.Visible = false; - } - chat!.UpdateTitle(arg); - chat.Clear(); - IReadOnlyList messages = arg.Channel.GetMessages(200).Result; - foreach (SocketMessage message in messages.Reverse()) - { - chat.AddMessage(message); - } - DrawFrame(); + BlockDraw = true; + Thread t = new(a => cc(a)); + t.Start(arg); } catch (Exception e) { Console.WriteLine(e); } - return Task.CompletedTask; + } + + private void cc(object argg) + { + try + { + IChannelPick arg = (IChannelPick)argg; + Invoke(new Action(() => + { + chat!.UpdateTitle(arg); + })); + Console.WriteLine("Checking token"); + if (channelCancellationToken is not null) + { + Console.WriteLine("Cancling token"); + channelCancellationToken.Cancel(false); + } + channelCancellationToken = new CancellationTokenSource(); + Globals.Luski.ChangeChannel(arg.Channel.Id, channelCancellationToken.Token).Wait(); + Invoke(new Action(() => + { + chat!.Clear(); + })); + IReadOnlyList messages = arg.Channel.GetMessages(channelCancellationToken.Token, Globals.Settings.LoadPerChannel).Result; + + foreach (SocketMessage message in messages.Reverse()) + { + if (channelCancellationToken.Token.IsCancellationRequested) return; + Invoke(new Action(() => + { + chat!.AddMessage(message); + })); + } + if (channelCancellationToken.Token.IsCancellationRequested) return; + channelCancellationToken = null; + Invoke(new Action(() => + { + BlockDraw = false; + chat!.MessageFlow.ScrollToBottom(); + DrawFrame(); + })); + } + catch (Exception e) + { + if (e.Message.Contains("A task was canceled")) return; + Console.WriteLine(e); + } } private Task LoginOnChangeToApp() @@ -123,17 +195,30 @@ public class MainScreen : Window Controls.Clear(); BlockDraw = true; Title = "Luski"; - Size = new(2048, 1334); + // string Public, Private; + // using (RSACryptoServiceProvider cryptoServiceProvider = new RSACryptoServiceProvider(Encryption.NewKeySize)) + //{ + // Private = cryptoServiceProvider.ToXmlString(true); + // Public = cryptoServiceProvider.ToXmlString(false); + //} + // Luski.net.Encryption.File.Channels.AddKey(69, Private); + //Clip + // Console.WriteLine(Public); + Globals.Luski.SetMultiThreadPercent(Globals.Settings.MultiThreadPercent); + Size = new((int)(1024 * Globals.Settings.Scale), (int)(667 * Globals.Settings.Scale)); + DateTime start = DateTime.Now; + CenterWindow(0); + DateTime start1 = DateTime.Now; 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}); + Controls.Add(new Rectangle(TextureManager.AddTexture(Globals.Luski.CurrentUser.GetAvatar(CancellationToken.None).Result)) { Anchor = ObjectAnchor.Bottom | ObjectAnchor.Left, Size = new((int)(35 * Globals.Settings.Scale)), Location = new((int)(47 * Globals.Settings.Scale), (int)(624 * Globals.Settings.Scale))}); + Controls.Add(new Label(){ Font = Globals.DefaultFont, Anchor = ObjectAnchor.Bottom | ObjectAnchor.Left, Location = new((int)(86 * Globals.Settings.Scale), (int)(635.5 * Globals.Settings.Scale)), Text = Globals.Luski.CurrentUser.Username}); FlowLayout ser; - Controls.Add(chat = new() {Location = new(528,0)}); + Controls.Add(chat = new(this) {Location = new((int)(270 * Globals.Settings.Scale),0)}); Controls.Add(ser = new FlowLayout() { BackgroundColor = new(26, 26, 26, 255), - Size = new(80,1334), + Size = new((int)(40 * Globals.Settings.Scale),(int)(667 * Globals.Settings.Scale)), Anchor = ObjectAnchor.Top | ObjectAnchor.Left | ObjectAnchor.Bottom, }); @@ -143,9 +228,12 @@ public class MainScreen : Window Size = chat.Size, BackgroundColor = chat.BackgroundColor, Anchor = ObjectAnchor.All, - Visible = false + Visible = false, + TitleFont = Globals.DefaultFont, + Border = (int)( 10 * Globals.Settings.Scale), + TabSpace = (int)(5 * Globals.Settings.Scale), }); - tc.AddPage("Frineds", friends = new FlowLayout() + tc.AddPage("Friends", friends = new FlowLayout() { BackgroundColor = new(45,45,45,255) }); @@ -156,18 +244,19 @@ public class MainScreen : Window tc.AddPage("Add Friend", new AddFriendPage(this)); ser.Controls.Add(new Rectangle(Globals.LuskiTexture) { - Size = new(80,80), + Size = new((int)(40 * Globals.Settings.Scale)), }); Controls.Add(channelpicker = new FlowLayout() { BackgroundColor = new(34,34,34,255), - Size = new(448, 1232), - Location = new(80, 0), + Size = new((int)(230 * Globals.Settings.Scale), (int)(616 * Globals.Settings.Scale)), + Location = new((int)(40 * Globals.Settings.Scale), 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}); + channelpicker.Controls.Add(FriendManagerBtn = new RoundedButton() { Font = Globals.DefaultFont, Text = "Friends", Size = new((int)(40* Globals.Settings.Scale)), InsideColor = new(28, 28, 28, 255), BorderColor = Color4.DarkCyan}); FriendManagerBtn.Clicked += FriendManagerBtnOnClicked; + Console.WriteLine("Templates loaded in " + (DateTime.Now - start).TotalSeconds + " seconds"); foreach (SocketGroupChannel ch in Globals.Luski.CurrentUser.Channels.Where(s => s is SocketGroupChannel).Cast()) { AddGroup(ch); @@ -176,28 +265,52 @@ public class MainScreen : Window { if (item.Channel is not null) AddFriend(item); } + Console.WriteLine("Channels done in " + (DateTime.Now - start).TotalSeconds + " seconds"); - SocketTextChannel chan = Globals.Luski.GetChannel(Globals.Luski.CurrentUser.SelectedChannel).Result; + SocketTextChannel chan = Globals.Luski.GetChannel(Globals.Luski.CurrentUser.SelectedChannel, CancellationToken.None).Result; chat.UpdateTitle(chans.First(s => s.Channel.Id == chan.Id)); - IReadOnlyList messages = chan.GetMessages(200).Result; - foreach (SocketMessage message in messages.Reverse()) + try { - chat.AddMessage(message); + IReadOnlyList messages = chan.GetMessages(CancellationToken.None, Globals.Settings.LoadPerChannel).Result; + Console.WriteLine("Messages done in " + (DateTime.Now - start).TotalSeconds + " seconds"); + foreach (SocketMessage message in messages.Reverse()) + { + chat.AddMessage(message); + } + chat.MessageFlow.ScrollToBottom(); } - Globals.Luski.OnError += LuskiOnOnError; - Globals.Luski.UserStatusUpdate += LuskiOnUserStatusUpdate; - Globals.Luski.ReceivedFriendRequest += LuskiOnReceivedFriendRequest; - Globals.Luski.FriendRequestResult += LuskiOnFriendRequestResult; + catch (Exception e) + { + Console.WriteLine(e); + ChannelOnClickCon(chans.Where(s => s.Channel.Id == 0).First()); + } + + + Console.WriteLine("Messages Fonts done in " + (DateTime.Now - start).TotalSeconds + " seconds"); foreach (SocketRemoteUser cufr in Globals.Luski.CurrentUser.FriendRequests) { AddFriendRequest(cufr); } - + Console.WriteLine("FR done in " + (DateTime.Now - start).TotalSeconds + " seconds"); BlockDraw = false; DrawFrame(); + Console.WriteLine("GUI done in " + (DateTime.Now - start1).TotalSeconds + " seconds"); + MainShow += OnMainShow; + MainShow.Invoke(); return Task.CompletedTask; } + private Task OnMainShow() + { + Globals.Luski.OnError += LuskiOnOnError; + Globals.Luski.UserStatusUpdate += LuskiOnUserStatusUpdate; + Globals.Luski.ReceivedFriendRequest += LuskiOnReceivedFriendRequest; + Globals.Luski.FriendRequestResult += LuskiOnFriendRequestResult; + return Task.CompletedTask; + } + + public event Func MainShow; + private Task LuskiOnOnError(Exception arg) { Console.WriteLine(arg); @@ -206,6 +319,7 @@ public class MainScreen : Window private Task LuskiOnFriendRequestResult(SocketRemoteUser arg1, bool arg2) { + Console.WriteLine("new result"); Invoke(new Action(() => { RemoveFriendRequest(arg1); @@ -225,7 +339,9 @@ public class MainScreen : Window private Task LuskiOnUserStatusUpdate(IUser before, IUser After) { - if (before is not SocketRemoteUser Before || Before.FriendStatus != FriendStatus.Friends) return Task.CompletedTask; + Console.WriteLine(before); + Console.WriteLine(After); + if (before is not SocketRemoteUser Before || Before.FriendStatus != FriendStatus.Friends || Before.Id == 0) return Task.CompletedTask; Label stat = fr.Where(s => s.User.Id == before.Id).First()!.Status; Invoke(new Action(() => { diff --git a/Luski/GUI/MainScreen/UI/AddFriendPage.cs b/Luski/GUI/MainScreen/UI/AddFriendPage.cs index 4faf17b..eae05af 100644 --- a/Luski/GUI/MainScreen/UI/AddFriendPage.cs +++ b/Luski/GUI/MainScreen/UI/AddFriendPage.cs @@ -15,9 +15,9 @@ public class AddFriendPage : FlowLayout public AddFriendPage(MainScreen Parent) { this.Screen = Parent; - Size = new(400, 96); + Size = new((int)(200 * Globals.Settings.Scale), (int)(48 * Globals.Settings.Scale)); BackgroundColor = new(45,45,45,255); - Controls.Add(Input = new Textbox() { Anchor = ObjectAnchor.Left | ObjectAnchor.Top | ObjectAnchor.Right, Location = new(15,15), Size = new(370,40), InsideColor = new(28,28,28,255), BorderColor = Color4.DarkCyan }); + Controls.Add(Input = new Textbox() { Anchor = ObjectAnchor.Left | ObjectAnchor.Top | ObjectAnchor.Right, Location = new((int)(7.5 * Globals.Settings.Scale)), Size = new((int)(185 * Globals.Settings.Scale),(int)(20 * Globals.Settings.Scale)), InsideColor = new(28,28,28,255), BorderColor = Color4.DarkCyan }); Input.KeyPress += InputOnKeyPress; } @@ -31,7 +31,7 @@ public class AddFriendPage : FlowLayout Input.BorderColor = Color4.Red; return Task.CompletedTask; } - SocketRemoteUser? result = Globals.Luski.SendFriendRequest(code).Result; + SocketRemoteUser? result = Globals.Luski.SendFriendRequest(code, CancellationToken.None).Result; if (result is null) Input.BorderColor = Color4.Red; else { diff --git a/Luski/GUI/MainScreen/UI/Chat.cs b/Luski/GUI/MainScreen/UI/Chat.cs index 9c44d6b..f97de7c 100644 --- a/Luski/GUI/MainScreen/UI/Chat.cs +++ b/Luski/GUI/MainScreen/UI/Chat.cs @@ -1,6 +1,8 @@ using GraphicsManager.Enums; +using GraphicsManager.Interfaces; using GraphicsManager.Objects; using Luski.GUI.MainScreen.Interfaces; +using Luski.net; using Luski.net.Enums; using Luski.net.JsonTypes; using OpenTK.Mathematics; @@ -11,39 +13,52 @@ namespace Luski.GUI.MainScreen.UI; public class Chat : UserControl { - private FlowLayout MessageFlow; + public FlowLayout MessageFlow; private UserControl titlecon, typecon; private Label title, desc; private Textbox tb; - private long id = -1; - public Chat() + private SocketTextChannel? Channel = null; + public Chat(MainScreen screen) { - Size = new(1520, 1334); + screen.MainShow += ScreenOnMainShow; + Size = new((int)(754 * Globals.Settings.Scale), (int)(667 * Globals.Settings.Scale)); BackgroundColor = new(50, 50, 50, 255); Anchor = ObjectAnchor.All; Controls.Add(MessageFlow = new() { - Size = new(1520, 1172), - Location = new(0, 80), + Size = new((int)(754 * Globals.Settings.Scale), (int)(586 * Globals.Settings.Scale)), + Location = new(0, (int)(40 * Globals.Settings.Scale)), BackgroundColor = new(40,40,40,255), - Anchor = ObjectAnchor.All + Anchor = ObjectAnchor.All, + HScrollPixels = Globals.Settings.PerScrollPixels }); - Controls.Add(titlecon = new UserControl(){Anchor = ObjectAnchor.Left | ObjectAnchor.Top | ObjectAnchor.Right, Size = new(1520, 80), BackgroundColor = BackgroundColor}); - Controls.Add(typecon = new UserControl(){Anchor = ObjectAnchor.Left | ObjectAnchor.Bottom | ObjectAnchor.Right, Location = new(0, 1252), Size = new(1520, 82), BackgroundColor = BackgroundColor}); - titlecon.Controls.Add(title = new Label(){Location = new(27, 40)}); - titlecon.Controls.Add(desc = new Label(){Color = new(161,161,161,255), Location = new(title.Location.X + title.Size.X + 5, title.Location.Y)}); - Globals.Luski.MessageReceived += LuskiOnMessageReceived; + Controls.Add(titlecon = new UserControl(){Anchor = ObjectAnchor.Left | ObjectAnchor.Top | ObjectAnchor.Right, Size = new((int)(754 * Globals.Settings.Scale), (int)(40 * Globals.Settings.Scale)), BackgroundColor = BackgroundColor}); + Controls.Add(typecon = new UserControl(){Anchor = ObjectAnchor.Left | ObjectAnchor.Bottom | ObjectAnchor.Right, Location = new(0, (int)(626 * Globals.Settings.Scale)), Size = new((int)(754 * Globals.Settings.Scale), (int)(41 * Globals.Settings.Scale)), BackgroundColor = BackgroundColor}); + titlecon.Controls.Add(title = new Label() + { + Font = Globals.DefaultFont, Location = new( + (int)((20 - (Globals.DefaultFont.PixelHeight / 2)) * Globals.Settings.Scale), + (int)((20 * Globals.Settings.Scale) - (Globals.DefaultFont.PixelHeight / 2))) + }); + titlecon.Controls.Add(desc = new Label(){ Font = Globals.DefaultFont, Color = new(161,161,161,255), Location = new(title.Location.X + title.Size.X + 5, title.Location.Y)}); typecon.Controls.Add(tb = new Textbox() { + Font = Globals.DefaultFont, InsideColor = new(28, 28, 28, 255), BorderColor = Color4.DarkCyan, - Location = new(15, 15), - Size = new(1490, 52), + Location = new((int)(7.5 * Globals.Settings.Scale)), + Size = new((int)(739 * Globals.Settings.Scale), (int)(26 * Globals.Settings.Scale)), Anchor = ObjectAnchor.All }); tb.KeyPress += TbOnKeyPress; } + private Task ScreenOnMainShow() + { + Globals.Luski.MessageReceived += LuskiOnMessageReceived; + return Task.CompletedTask; + } + private Task TbOnKeyPress(KeyboardKeyEventArgs arg) { if (arg.Key != Keys.Enter && arg.Key != Keys.KeyPadEnter) return Task.CompletedTask; @@ -54,15 +69,18 @@ public class Chat : UserControl private void Thr() { - Globals.Luski.SendMessage(tb.Text, id); + Globals.Luski.SendMessage(tb.Text, Channel!.Id, CancellationToken.None); Window!.Invoke(new Action(() => { tb.Text = string.Empty; })); } private Task LuskiOnMessageReceived(SocketMessage arg) { - Console.WriteLine(arg); - if (id != arg.ChannelID) return Task.CompletedTask; + if (Channel!.Id != arg.ChannelID) return Task.CompletedTask; + IRenderObject? reff = null; + if (MessageFlow.Controls.Length > 0) reff = MessageFlow.Controls[MessageFlow.Controls.Length - 1]; AddMessage(arg); + if (reff is null || (reff.Location.Y + reff.Size.Y <= MessageFlow.Size.Y && reff.Location.X >= 0)) Window.Invoke(new Action(() => { MessageFlow.ScrollToBottom();})); + return Task.CompletedTask; } @@ -75,12 +93,13 @@ public class Chat : UserControl public void UpdateTitle(IChannelPick channelPick) { - //if (channelPick.Channel.Title is null) throw new Exception("You dont have a key for this channel"); - if (id == channelPick.Channel.Id) return; - id = channelPick.Channel.Id; + if (Channel is not null && Channel!.Id == channelPick.Channel.Id) return; + Channel = channelPick.Channel; title.Text = channelPick.Channel.Title; + tb.WatermarkFont = Globals.DefaultFont; if (channelPick.Channel.Type == ChannelType.DM) title.Text = (channelPick.Channel as SocketDMChannel)!.User.Username; + tb.WatermarkText = "Message " + title.Text; if (channelPick.Channel.Description is not null) { desc.Visible = true; @@ -121,6 +140,5 @@ public class Chat : UserControl } lastUser = Message.AuthorID; - //Task.Delay(100); } } \ No newline at end of file diff --git a/Luski/GUI/MainScreen/UI/ChatMessage.cs b/Luski/GUI/MainScreen/UI/ChatMessage.cs index 1aa053e..09a732b 100644 --- a/Luski/GUI/MainScreen/UI/ChatMessage.cs +++ b/Luski/GUI/MainScreen/UI/ChatMessage.cs @@ -1,9 +1,12 @@ +using GraphicsManager; using GraphicsManager.Enums; using GraphicsManager.Interfaces; using GraphicsManager.Objects; using GraphicsManager.Objects.Core; +using Luski.net.Enums; using Luski.net.Interfaces; using Luski.net.JsonTypes; +using OpenTK.Mathematics; using File = Luski.net.JsonTypes.File; namespace Luski.GUI.MainScreen.UI; @@ -14,16 +17,19 @@ public class ChatMessage : UserControl private static Font TimeFont = Font.MakeFontFromSystem(13); private SocketMessage Msg { get; } private Label label1, label2, lastm; + private static Dictionary Menues = new(); + private static Dictionary> Messages = new(); public ChatMessage(SocketMessage message) { - Size = new(1467, 74); + Size = new((int)(723.5 * Globals.Settings.Scale), (int)(37 * Globals.Settings.Scale)); + BackgroundColor = new(40, 40, 40, 255); Msg = message; - IUser user = message.GetAuthor().Result; + IUser user = message.GetAuthor(CancellationToken.None).Result; Anchor = ObjectAnchor.Left | ObjectAnchor.Right; - Controls.Add(label1 = new Label() {Location = new(83, 9), Text = user.Username}); + Controls.Add(label1 = new Label() { Font = Globals.DefaultFont, Location = new((int)(42 * Globals.Settings.Scale), (int)(4.5 * Globals.Settings.Scale)), Text = user.Username}); @@ -41,9 +47,9 @@ public class ChatMessage : UserControl { timestr = $"{time:M/dd/yyyy h:mm tt}"; } - Controls.Add(new Label() {Location = new(label1.Location.X + label1.Size.X + 4, 9), Text = timestr}); - Controls.Add(new Rectangle(new Texture(user.GetAvatar().Result)) { Location = new(15, 3), Size = new(58, 58) }); - Controls.Add(label2 = new Label() {Location = new(83, 40), Text = message.Context}); + Controls.Add(new Label() { Font = Globals.DefaultFont, Location = new(label1.Location.X + label1.Size.X + 4, (int)(4.5 * Globals.Settings.Scale)), Text = timestr}); + Controls.Add(new Rectangle(Globals.ms.TextureManager.AddTexture(user.GetAvatar(CancellationToken.None).Result)) { Location = new((int)(7.5 * Globals.Settings.Scale), (int)(1.5 * Globals.Settings.Scale)), Size = new((int)(29 * Globals.Settings.Scale)) }); + Controls.Add(label2 = new Label() { Font = Globals.DefaultFont, Location = new((int)(41.5 * Globals.Settings.Scale), (int)(20 * Globals.Settings.Scale)), Text = message.Context}); lastm = label2; if (Msg.Files != null && Msg.Files.Length > 0) { @@ -67,13 +73,57 @@ public class ChatMessage : UserControl } } + if (user is SocketRemoteUser u && u.FriendStatus == FriendStatus.NotFriends) + { + Tag = u; + if (!Menues.ContainsKey(u)) + { + ContextMenu m = new((int)(150 * Globals.Settings.Scale)); + RoundedButton d; + m.Items.Add(d = new RoundedButton() + { + InsideColor = new(28, 28, 28, 255), BorderColor = Color4.DarkCyan, + Size = new((int)(25 * Globals.Settings.Scale)), Font = Globals.DefaultFont, Text = "Add Friend" + }); + d.Tag = this; + Menues.Add(u,m); + Messages.Add(u, new()); + d.Clicked += DOnClicked; + } + Messages[u].Add(this); + this.ContextMenu = Menues[u]; + } Size = new(Size.X, Controls[Controls.Length - 1].Location.Y + Controls[Controls.Length - 1].Size.Y + padding + 10); } - + + private Task DOnClicked(IRenderObject arg) + { + if (arg.Tag is ChatMessage u && u.Tag is SocketRemoteUser uu) + { + foreach (ChatMessage cm in Messages[uu]) + { + cm.ContextMenu!.IsVisible = false; + cm.ContextMenu!.Close(); + cm.ContextMenu = null; + } + + Messages.Remove(uu); + Menues.Remove(uu); + SocketRemoteUser? result = Globals.Luski.SendFriendRequest(long.Parse(uu.friend_codes.First()), CancellationToken.None).Result; + if (result.Channel is null) + Globals.ms.AddFriendRequest(result); + else + Globals.ms.AddFriend(result); + } + + return Task.CompletedTask; + } + public void AddMessage(SocketMessage msg) { Label newLabel = new() { + Font = Globals.DefaultFont, Text = msg.Context, Tag = msg, Location = new(label2.Location.X, Size.Y) @@ -129,9 +179,9 @@ public class ChatMessage : UserControl DateTime time = new DateTime(2022, 1, 1, 0, 0, 0, 0).AddMilliseconds(Message.Id >> 22).ToLocalTime(); Label m = new() { + Font = TimeFont, Text = time.ToString("h:mm tt"), - Location = new(15, label.Location.Y - (int)TimeFont.PixelHeight + (int)label.Font.PixelHeight), - Font = TimeFont + Location = new((int)(7.5 * Globals.Settings.Scale), label.Location.Y - (int)TimeFont.PixelHeight + (int)label.Font.PixelHeight), }; Controls.Add(m); diff --git a/Luski/GUI/MainScreen/UI/ContentEmbed.cs b/Luski/GUI/MainScreen/UI/ContentEmbed.cs index 0e0341c..877462b 100644 --- a/Luski/GUI/MainScreen/UI/ContentEmbed.cs +++ b/Luski/GUI/MainScreen/UI/ContentEmbed.cs @@ -39,7 +39,7 @@ public class ContentEmbed : UserControl Controls.Add(fileNameLabel = new Label() { Color = new(102/(float)255,227/(float)255,170/(float)255, 1), Text = file.Name, Location = new(64, 6)}); fileNameLabel.Clicked += FileNameLabelOnClicked; byte[] tempp = Tools.GetResourceBytes(Assembly.GetExecutingAssembly(), "Luski.Resources.Textures.Download.png"); - Controls.Add(new Rectangle(new Texture(tempp)) { Location = new(8, 6), Size = new(50, 50)}); + Controls.Add(new Rectangle(Globals.ms.TextureManager.AddTexture(tempp)) { Location = new(8, 6), Size = new(50, 50)}); int temp = fileNameLabel.Size.X + fileNameLabel.Location.X; int temp2 = fileSizeLabel.Size.X + fileSizeLabel.Location.X; ; if (temp >= temp2) Size = new(temp + 4, Size.Y); @@ -50,7 +50,7 @@ public class ContentEmbed : UserControl { string dir = Path.Join(Environment.GetFolderPath(Environment.SpecialFolder.MyDocuments), "Downloads", "LuskiDownloads"); if (!Directory.Exists(dir)) Directory.CreateDirectory(dir); - Thread t = new(() => file.DownloadBytes(Path.Join(dir, file.Name), channel)); + Thread t = new(() => file.DownloadBytes(Path.Join(dir, file.Name), channel, CancellationToken.None)); t.Start(); return Task.CompletedTask; } diff --git a/Luski/GUI/MainScreen/UI/Friend.cs b/Luski/GUI/MainScreen/UI/Friend.cs index b51181e..06bbdfb 100644 --- a/Luski/GUI/MainScreen/UI/Friend.cs +++ b/Luski/GUI/MainScreen/UI/Friend.cs @@ -3,6 +3,7 @@ using GraphicsManager.Objects; using GraphicsManager.Objects.Core; using Luski.GUI.MainScreen.Interfaces; using Luski.net.JsonTypes; +using OpenTK.Mathematics; namespace Luski.GUI.MainScreen.UI; @@ -22,17 +23,29 @@ public class Friend : UserControl, IChannelPick public Friend(SocketRemoteUser person) { User = person; - Size = new(370, 96); + Size = new((int)(185 * Globals.Settings.Scale), (int)(48* Globals.Settings.Scale)); BackgroundColor = new(34, 34, 34, 255); - Controls.Add( r = new Rectangle(new Texture(person.GetAvatar().Result)) { Location = new(15,17), Size = new(58,58)}); - Controls.Add(Username = new Label() { Text = person.Username, Location = new(77,20)}); - Controls.Add(Status = new Label() { Text = person.Status.ToString(), Location = new(77,48)}); - //r.Clicked += AllOnClicked; - //Username.Clicked += AllOnClicked; - //Status.Clicked += AllOnClicked; + Controls.Add( r = new Rectangle(Globals.ms.TextureManager.AddTexture(person.GetAvatar(CancellationToken.None).Result)) { Location = new((int)(7.5 * Globals.Settings.Scale),(int)(8.5 * Globals.Settings.Scale)), Size = new((int)(29* Globals.Settings.Scale))}); + Controls.Add(Username = new Label() { Font = Globals.DefaultFont, Text = person.Username, Location = new((int)(38.5 * Globals.Settings.Scale),(int)(10 * Globals.Settings.Scale))}); + Controls.Add(Status = new Label() { Font = Globals.DefaultFont, Text = person.Status.ToString(), Location = new((int)(38.5 * Globals.Settings.Scale),(int)(24 * Globals.Settings.Scale))}); this.Clicked += AllOnClicked; + ContextMenu = new((int)(150 * Globals.Settings.Scale)); + RoundedButton rr; + ContextMenu.Items.Add(rr=new() + { + InsideColor = new(28, 28, 28, 255), BorderColor = Color4.DarkCyan, + Size = new((int)(25 * Globals.Settings.Scale)), Font = Globals.DefaultFont, Text = "Export Keys" + }); + rr.Clicked += RrOnClicked; } - + + private Task RrOnClicked(IRenderObject arg) + { + _ = User.Channel!.SendKeysToUsers(CancellationToken.None); + ContextMenu!.HideContext(Window!); + return Task.CompletedTask; + } + private Task AllOnClicked(IRenderObject arg) { if (ClickCon is not null) _ = ClickCon.Invoke(this); diff --git a/Luski/GUI/MainScreen/UI/FriendRequest.cs b/Luski/GUI/MainScreen/UI/FriendRequest.cs index af91f73..91259d4 100644 --- a/Luski/GUI/MainScreen/UI/FriendRequest.cs +++ b/Luski/GUI/MainScreen/UI/FriendRequest.cs @@ -18,22 +18,22 @@ public class FriendRequest : UserControl { this.User = User; this.Screen = Parent; - Size = new(400, 96); + Size = new((int)(200 * Globals.Settings.Scale), (int)(48* Globals.Settings.Scale)); BackgroundColor = new(34, 34, 34, 255); - Controls.Add(new Rectangle(new Texture(User.GetAvatar().Result)) { Location = new(15,17), Size = new(58,58)}); - Controls.Add(new Label() { Text = User.Username, Location = new(77,20)}); - Controls.Add(new Label() { Text = User.FriendStatus.ToString(), Location = new(77,48)}); + Controls.Add(new Rectangle(Globals.ms.TextureManager.AddTexture(User.GetAvatar(CancellationToken.None).Result)) { Location = new((int)(7.5 * Globals.Settings.Scale),(int)(8.5 * Globals.Settings.Scale)), Size = new((int)(29 * Globals.Settings.Scale))}); + Controls.Add(new Label() { Font = Globals.DefaultFont, Text = User.Username, Location = new((int)(38.5 * Globals.Settings.Scale),(int)(10 * Globals.Settings.Scale))}); + Controls.Add(new Label() { Font = Globals.DefaultFont, Text = User.FriendStatus.ToString(), Location = new((int)(38.5 * Globals.Settings.Scale),(int)(24 * Globals.Settings.Scale))}); if (User.FriendStatus == FriendStatus.PendingIn) { Controls.Add(Accept = new Rectangle() { - Anchor = ObjectAnchor.Top | ObjectAnchor.Right, BackgroundColor = Color4.Green, Location = new(254, 17), - Size = new(58, 58) + Anchor = ObjectAnchor.Top | ObjectAnchor.Right, BackgroundColor = Color4.Green, Location = new((int)(127 * Globals.Settings.Scale), (int)(8.5 * Globals.Settings.Scale)), + Size = new((int)(29 * Globals.Settings.Scale)) }); Controls.Add(Reject = new Rectangle() { - Anchor = ObjectAnchor.Top | ObjectAnchor.Right, BackgroundColor = Color4.Red, Location = new(327, 17), - Size = new(58, 58) + Anchor = ObjectAnchor.Top | ObjectAnchor.Right, BackgroundColor = Color4.Red, Location = new((int)(163.5 * Globals.Settings.Scale), (int)(8.5 * Globals.Settings.Scale)), + Size = new((int)(29 * Globals.Settings.Scale)) }); Accept.Clicked += AcceptOnClicked; Reject.Clicked += RejectOnClicked; @@ -42,14 +42,14 @@ public class FriendRequest : UserControl private Task RejectOnClicked(IRenderObject arg) { - _ = Globals.Luski.SendFriendResult(User.Id, false).Result; + _ = Globals.Luski.SendFriendResult(User.Id, false, CancellationToken.None).Result; Screen.RemoveFriendRequest(User); return Task.CompletedTask; } private Task AcceptOnClicked(IRenderObject arg) { - Screen.AddFriend(Globals.Luski.SendFriendResult(User.Id, true).Result); + Screen.AddFriend(Globals.Luski.SendFriendResult(User.Id, true, CancellationToken.None).Result); Screen.RemoveFriendRequest(User); return Task.CompletedTask; } diff --git a/Luski/GUI/MainScreen/UI/Group.cs b/Luski/GUI/MainScreen/UI/Group.cs index 49bfc96..2bb840d 100644 --- a/Luski/GUI/MainScreen/UI/Group.cs +++ b/Luski/GUI/MainScreen/UI/Group.cs @@ -3,6 +3,7 @@ using GraphicsManager.Objects; using GraphicsManager.Objects.Core; using Luski.net.JsonTypes; using Luski.GUI.MainScreen.Interfaces; +using OpenTK.Mathematics; namespace Luski.GUI.MainScreen.UI; @@ -15,22 +16,35 @@ public class Group : UserControl, IChannelPick public Group(SocketGroupChannel chan) { Channel = chan; - Size = new(370, 96); + Size = new((int)(185 * Globals.Settings.Scale), (int)(48* Globals.Settings.Scale)); BackgroundColor = new(34, 34, 34, 255); - Controls.Add( r = new Rectangle(new Texture(chan.GetPicture().Result)) { Location = new(15,17), Size = new(58,58)}); - Controls.Add(Username = new Label() { Text = chan.Title, Location = new(77,20)}); + Controls.Add( r = new Rectangle(Globals.ms.TextureManager.AddTexture(chan.GetPicture(CancellationToken.None).Result)) { Location = new((int)(7.5 * Globals.Settings.Scale),(int)(8.5 * Globals.Settings.Scale)), Size = new((int)(29* Globals.Settings.Scale))}); + Controls.Add(Username = new Label() { Font = Globals.DefaultFont, Text = chan.Title, Location = new((int)(38.5 * Globals.Settings.Scale),(int)(10 * Globals.Settings.Scale))}); string sl = "Online"; if (chan.Id != 0) { - sl = chan.Members.Count + " Memmbers"; + sl = chan.Members.Count + " Members"; } - Controls.Add(Status = new Label() { Text = sl, Location = new(77,48)}); - //r.Clicked += AllOnClicked; - //Username.Clicked += AllOnClicked; - //Status.Clicked += AllOnClicked; + Controls.Add(Status = new Label() { Font = Globals.DefaultFont, Text = sl, Location = new((int)(38.5 * Globals.Settings.Scale),(int)(24 * Globals.Settings.Scale))}); this.Clicked += AllOnClicked; + if (chan.Id == 0) return; + ContextMenu = new((int)(150 * Globals.Settings.Scale)); + RoundedButton rr; + ContextMenu.Items.Add(rr=new() + { + InsideColor = new(28, 28, 28, 255), BorderColor = Color4.DarkCyan, + Size = new((int)(25 * Globals.Settings.Scale)), Font = Globals.DefaultFont, Text = "Export Keys" + }); + rr.Clicked += RrOnClicked; } + private Task RrOnClicked(IRenderObject arg) + { + _ = Channel.SendKeysToUsers(CancellationToken.None); + ContextMenu!.HideContext(Window!); + return Task.CompletedTask; + } + private Task AllOnClicked(IRenderObject arg) { if (ClickCon is not null) _ = ClickCon.Invoke(this); diff --git a/Luski/GUI/StartPage/UI/CreateAccount.cs b/Luski/GUI/StartPage/UI/CreateAccount.cs index 97dde3a..7787b56 100644 --- a/Luski/GUI/StartPage/UI/CreateAccount.cs +++ b/Luski/GUI/StartPage/UI/CreateAccount.cs @@ -1,7 +1,6 @@ using GraphicsManager.Interfaces; using GraphicsManager.Objects; using Luski.net; -using Luski.net.Enums; using OpenTK.Mathematics; using OpenTK.Windowing.Common; using OpenTK.Windowing.GraphicsLibraryFramework; @@ -19,17 +18,16 @@ public class CreateAccount : UserControl public CreateAccount() { - Size = new(481, 838); - Controls.Add(new Rectangle(Globals.LuskiTexture) { Location = new(103,8), Size = new(276, 289)}); - Controls.Add(new Label() { Scale = 1.4f, Location = new(173,305), Text = "Luski", Color = new(243, 119, 53, 255) }); - Controls.Add(new Label() { Location = new(41,395), Text = "Email"}); - Controls.Add(Email = new Textbox() { Location = new(41,431), Size = new(401,41), InsideColor = new(28,28,28,255), BorderColor = Color4.DarkCyan }); - Controls.Add(new Label() { Location = new(41,490), Text = "Password" }); - Controls.Add(Password = new Textbox() { PasswordChar = '●', Location = new(41,531), Size = new(401, 41), InsideColor = new(28, 28, 28, 255), BorderColor = Color4.DarkCyan }); - Controls.Add(new Label() { Location = new(41,580), Text = "Display Name" }); - Controls.Add(Username = new Textbox() { Location = new(41,616), Size = new(300, 41), InsideColor = new(28, 28, 28, 255), BorderColor = Color4.DarkCyan }); - Controls.Add(button = new() { Text = "Create Account", Location = new(41, 700), Size = new(401, 71), InsideColor = new(28, 28, 28, 255), BorderColor = Color4.DarkCyan }); - Controls.Add(rec = new Rectangle(){ Location = new(350, 585), Size = new(100), BackgroundColor = Color4.Red}); + Size = new((int)(240.5*Globals.Settings.Scale), (int)(419*Globals.Settings.Scale)); + Controls.Add(new Rectangle(Globals.LuskiTexture) { Location = new((int)(51.5 * Globals.Settings.Scale), (int)(4 * Globals.Settings.Scale)), Size = new((int)(138*Globals.Settings.Scale), (int)(144.5*Globals.Settings.Scale))}); + Label t; + Controls.Add(t=new Label() { Scale = 1.6f, Font = Globals.DefaultFont, Location = new((int)(85*Globals.Settings.Scale),(int)(153*Globals.Settings.Scale)), Text = "Luski", Color = new(243, 119, 53, 255) }); + t.Location = new((Size.X / 2) - (t.Size.X / 2), t.Location.Y); + Controls.Add(Email = new Textbox() { WatermarkFont = Globals.DefaultFont, WatermarkText = "Email", Font = Globals.DefaultFont, Location = new((int)(20.5 * Globals.Settings.Scale),(int)(215.5 * Globals.Settings.Scale)), Size = new((int)(200.5 * Globals.Settings.Scale),(int)(20.5 * Globals.Settings.Scale)), InsideColor = new(28,28,28,255), BorderColor = Color4.DarkCyan }); + Controls.Add(Password = new Textbox() { WatermarkFont = Globals.DefaultFont, WatermarkText = "Password", Font = Globals.DefaultFont, PasswordChar = '●', Location = new(Email.Location.X,(int)(265.5 * Globals.Settings.Scale)), Size = new(Email.Size.X, Email.Location.X), InsideColor = new(28, 28, 28, 255), BorderColor = Color4.DarkCyan }); + Controls.Add(Username = new Textbox() { WatermarkFont = Globals.DefaultFont, WatermarkText = "Username", Font = Globals.DefaultFont, Location = new(Email.Location.X,(int)(308 * Globals.Settings.Scale)), Size = new((int)(150 * Globals.Settings.Scale), Email.Location.X), InsideColor = new(28, 28, 28, 255), BorderColor = Color4.DarkCyan }); + Controls.Add(button = new() { Font = Globals.DefaultFont, Text = "Create Account", Location = new(Email.Location.X, (int)(350 * Globals.Settings.Scale)), Size = new((int)(200.5 * Globals.Settings.Scale), (int)(35.5 * Globals.Settings.Scale)), InsideColor = new(28, 28, 28, 255), BorderColor = Color4.DarkCyan }); + Controls.Add(rec = new Rectangle(){ Location = new((int)(175 * Globals.Settings.Scale), (int)(292.5 * Globals.Settings.Scale)), Size = new((int)(50 * Globals.Settings.Scale)), BackgroundColor = Color4.Red}); Password.KeyPress += PasswordOnKeyPress; Email.KeyPress += EmailOnKeyPress; button.Clicked += ButtonOnClicked; @@ -50,7 +48,7 @@ public class CreateAccount : UserControl if (!arg[0].ToLower().EndsWith("png")) return Task.CompletedTask; Controls.Remove(rec); pfp = arg[0]; - rec = new(new(File.ReadAllBytes(arg[0]))){ Location = new(350, 585), Size = new(100) }; + rec = new(Globals.ms.TextureManager.AddTexture(File.ReadAllBytes(arg[0]))){ Location = new(350, 585), Size = new(100) }; Controls.Add(rec); Window!.DrawFrame(); return Task.CompletedTask; @@ -89,7 +87,7 @@ public class CreateAccount : UserControl pfp }; if (arr.Any(s => string.IsNullOrEmpty(s))) return Task.CompletedTask; - Globals.Luski = Server.CreateAccount(Email.Text, Password.Text, Username.Text, pfp, Globals.Branch); + Globals.Luski = Server.CreateAccount(Email.Text, Password.Text, Username.Text, pfp, CancellationToken.None, Globals.UpdaterSettings.Branch); ChangeToApp.Invoke(); } catch (Exception e) diff --git a/Luski/GUI/StartPage/UI/Login.cs b/Luski/GUI/StartPage/UI/Login.cs index 9593b29..56733f8 100644 --- a/Luski/GUI/StartPage/UI/Login.cs +++ b/Luski/GUI/StartPage/UI/Login.cs @@ -3,6 +3,7 @@ using GraphicsManager.Objects; using Luski.net; using OpenTK.Mathematics; using OpenTK.Windowing.Common; +using OpenTK.Windowing.Desktop; using OpenTK.Windowing.GraphicsLibraryFramework; namespace Luski.GUI.StartPage.UI; @@ -12,19 +13,19 @@ public class Login : UserControl private RoundedButton button; private Textbox Password, Email; private Label ca; - public event Func ChangeToApp; - public event Func ChangeToCa; + public event Func? ChangeToApp; + public event Func? ChangeToCa; public Login() { - Size = new(481, 838); - Controls.Add(new Rectangle(Globals.LuskiTexture) { Location = new(103,8), Size = new(276, 289)}); - Controls.Add(new Label() { Scale = 1.4f, Location = new(173,305), Text = "Luski", Color = new(243, 119, 53, 255) }); - Controls.Add(new Label() { Location = new(41,395), Text = "Email"}); - Controls.Add(Email = new Textbox() { Location = new(41,431), Size = new(401,41), InsideColor = new(28,28,28,255), BorderColor = Color4.DarkCyan }); - Controls.Add(new Label() { Location = new(41,521), Text = "Password" }); - Controls.Add(Password = new Textbox() { PasswordChar = '●', Location = new(41,562), Size = new(401, 41), InsideColor = new(28, 28, 28, 255), BorderColor = Color4.DarkCyan }); - Controls.Add(ca = new Label() { Location = new(41,664), Text = "Create Account" }); - Controls.Add(button = new() { Text = "Login", Location = new(41, 700), Size = new(401, 71), InsideColor = new(28, 28, 28, 255), BorderColor = Color4.DarkCyan }); + Size = new((int)(240.5*Globals.Settings.Scale), (int)(419*Globals.Settings.Scale)); + Controls.Add(new Rectangle(Globals.LuskiTexture) { Location = new((int)(51.5 * Globals.Settings.Scale), (int)(4 * Globals.Settings.Scale)), Size = new((int)(138*Globals.Settings.Scale), (int)(144.5*Globals.Settings.Scale))}); + Label t; + Controls.Add(t=new Label() { Scale = 1.6f, Font = Globals.DefaultFont, Location = new((int)(85*Globals.Settings.Scale),(int)(153*Globals.Settings.Scale)), Text = "Luski", Color = new(243, 119, 53, 255) }); + t.Location = new((Size.X / 2) - (t.Size.X / 2), t.Location.Y); + Controls.Add(Email = new Textbox() { WatermarkFont = Globals.DefaultFont, WatermarkText = "Email", Font = Globals.DefaultFont, Location = new((int)(20.5*Globals.Settings.Scale),(int)(215.5 * Globals.Settings.Scale)), Size = new((int)(200.5 * Globals.Settings.Scale),(int)(20.5 * Globals.Settings.Scale)), InsideColor = new(28,28,28,255), BorderColor = Color4.DarkCyan }); + Controls.Add(Password = new Textbox() { WatermarkFont = Globals.DefaultFont, WatermarkText = "Password", Font = Globals.DefaultFont, PasswordChar = '●', Location = new((int)(20.5*Globals.Settings.Scale),(int)(281 * Globals.Settings.Scale)), Size = new((int)(200.5 * Globals.Settings.Scale), (int)(20.5 * Globals.Settings.Scale)), InsideColor = new(28, 28, 28, 255), BorderColor = Color4.DarkCyan }); + Controls.Add(ca = new Label() { Font = Globals.DefaultFont, Location = new((int)(20.5*Globals.Settings.Scale),(int)(332 * Globals.Settings.Scale)), Text = "Create Account" }); + Controls.Add(button = new() { Font = Globals.DefaultFont, Text = "Login", Location = new((int)(20.5*Globals.Settings.Scale), (int)(350 * Globals.Settings.Scale)), Size = new((int)(200.5 * Globals.Settings.Scale), (int)(35.5 * Globals.Settings.Scale)), InsideColor = new(28, 28, 28, 255), BorderColor = Color4.DarkCyan }); Password.KeyPress += PasswordOnKeyPress; Email.KeyPress += EmailOnKeyPress; button.Clicked += ButtonOnClicked; @@ -40,7 +41,7 @@ public class Login : UserControl private Task CaOnClicked(IRenderObject arg) { - ChangeToCa.Invoke(); + ChangeToCa!.Invoke(); return Task.CompletedTask; } @@ -63,8 +64,8 @@ public class Login : UserControl { try { - Globals.Luski = Server.Login(Email.Text, Password.Text, Globals.Branch).Result; - ChangeToApp.Invoke(); + Globals.Luski = Server.Login(Email.Text, Password.Text, CancellationToken.None, Globals.UpdaterSettings.Branch).Result; + ChangeToApp!.Invoke(); } catch (Exception e) { diff --git a/Luski/GUI/UpdateWindow.cs b/Luski/GUI/UpdateWindow.cs new file mode 100644 index 0000000..cdfaad9 --- /dev/null +++ b/Luski/GUI/UpdateWindow.cs @@ -0,0 +1,100 @@ +using GraphicsManager; +using GraphicsManager.Interfaces; +using GraphicsManager.Objects; +using OpenTK.Mathematics; +using OpenTK.Windowing.Desktop; +using OpenTK.Windowing.Common; + +namespace Luski.GUI; + +public class UpdateWindow : Window +{ + private RoundedButton yes, no; + private static readonly NativeWindowSettings Settings = new() + { + Title = "Update Available", + WindowBorder = WindowBorder.Fixed, + APIVersion = new Version(3, 2), + StartFocused = true, + Size = new OpenTK.Mathematics.Vector2i(481, 838), + Icon = Globals.Icon + }; + + public enum DialogueResult + { + Yes, + No, + Closed + } + + private DialogueResult Result = DialogueResult.Closed; + + public UpdateWindow() : base(Settings) + { + Label t; + Controls.Add(t = new Label() { Font = Globals.DefaultFont, Scale = 1.2f, Location = new((int)(17.5*Globals.Settings.Scale)), Text = "Luski has detected that your\nclient is on an older version\nfor your branch."}); + if (!Globals.Empty(Globals.UpdaterSettings.Updater)) + { + t.Text += "\n\nWould you like to update?"; + Controls.Add(yes = new() + { + Font = Globals.DefaultFont, Text = "Yes", + Location = new(t.Location.X, t.Location.Y + t.Size.Y + (int)(t.Scale * t.Font.PixelHeight)), + Size = new(t.Size.X, (int)(35.5 * Globals.Settings.Scale)), InsideColor = new(28, 28, 28, 255), + BorderColor = Color4.DarkCyan + }); + Controls.Add(no = new() + { + Font = Globals.DefaultFont, Text = "No", Location = new(t.Location.X, yes.Location.Y + yes.Size.Y + 20), + Size = new(yes.Size.X, (int)(35.5 * Globals.Settings.Scale)), InsideColor = new(28, 28, 28, 255), + BorderColor = Color4.DarkCyan + }); + Size = new(t.Location.X + t.Location.X + t.Size.X, no.Location.Y + no.Size.Y + t.Location.X); + yes.Clicked += YesOnClicked; + no.Clicked += NoOnClicked; + } + else + { + t.Text += "\n\nNo updater path was set\nSet a path for auto updates"; + Controls.Add(no = new() + { + Font = Globals.DefaultFont, Text = "Ok", + Location = new(t.Location.X, t.Location.Y + t.Size.Y + (int)(t.Scale * t.Font.PixelHeight)), + Size = new(t.Size.X, (int)(35.5 * Globals.Settings.Scale)), InsideColor = new(28, 28, 28, 255), + BorderColor = Color4.DarkCyan + }); + Size = new(t.Location.X + t.Location.X + t.Size.X, no.Location.Y + no.Size.Y + t.Location.X); + no.Clicked += NoOnClicked; + } + CenterWindow(); + } + + private Task NoOnClicked(IRenderObject arg) + { + Result = DialogueResult.No; + base.Close(); + return Task.CompletedTask; + } + + private Task YesOnClicked(IRenderObject arg) + { + Result = DialogueResult.Yes; + base.Close(); + return Task.CompletedTask; + } + + public DialogueResult ShowDialogue(Window? Parent = null) + { + try + { + if (Parent is not null) Parent.DrawFrame(); + StartRender(); + return Result; + } + finally + { + IsVisible = false; + //Dispose(); + } + } +} \ No newline at end of file diff --git a/Luski/Globals.cs b/Luski/Globals.cs index 18c4dcc..16d0701 100644 --- a/Luski/Globals.cs +++ b/Luski/Globals.cs @@ -1,16 +1,56 @@ using System.Reflection; +using System.Text.Json; +using System.Text.Json.Serialization.Metadata; using GraphicsManager; using GraphicsManager.Objects.Core; +using Luski.Clesses; +using Luski.GUI.MainScreen; using Luski.net; using Luski.net.Enums; +using OpenTK.Windowing.Common.Input; namespace Luski; public class Globals { - public static Server Luski = null!; + public static bool Download { get; set; } = false; + public static Server Luski { get; set; } = null!; + public static MainScreen ms; + public static Settings Settings { get; set; } - public static Texture LuskiTexture = new(Tools.GetResourceBytes(Assembly.GetExecutingAssembly(), "Luski.Resources.Textures.Luski.png")); + public static Font DefaultFont { get; set; } + public static UpdaterSettings UpdaterSettings { get; set; } + + public static Texture LuskiTexture; + + public static TResult GetSettings(string path, JsonTypeInfo TypeInfo) where TResult : new() + { + TResult? @out; + if (!File.Exists(path)) + { + @out = new(); + Console.WriteLine("Overiding 1"); + File.WriteAllText(path, JsonSerializer.Serialize(@out, TypeInfo)); + } + + try + { + @out = JsonSerializer.Deserialize(File.ReadAllText(path), TypeInfo); + Console.WriteLine("Found"); + if (@out is null) + { + Console.WriteLine("Overiding 2"); + @out = new(); + } + } + catch + { + Console.WriteLine("Overiding 3"); + @out = new(); + } + File.WriteAllText(path, JsonSerializer.Serialize(@out, TypeInfo)); + return @out; + } public static string JT { @@ -22,22 +62,24 @@ public class Globals tmp = Path.Combine(Environment.GetEnvironmentVariable("HOME")!, ".config/"); tmp += "JacobTech"; } + + if (!Directory.Exists(tmp)) Directory.CreateDirectory(tmp); + if (!Directory.Exists(Path.Combine(tmp, "Luski"))) Directory.CreateDirectory(Path.Combine(tmp, "Luski")); return tmp; } } - - public static Branch Branch + public static WindowIcon Icon { get; set; } + + public static string LuskiPath { get { - if (!File.Exists(Path.Combine(Environment.CurrentDirectory, "branch.txt"))) File.WriteAllText(Path.Combine(Environment.CurrentDirectory, "branch.txt"), ((int)Branch.Beta).ToString()); - return File.ReadAllText(Path.Combine(Environment.CurrentDirectory, "branch.txt")) switch - { - "0" => Branch.Dev, - "1" => Branch.Beta, - "2" => Branch.Master, - _ => Branch.Beta - }; + return Path.Combine(JT, "Luski"); } } + + public static bool Empty(string? str) + { + return (string.IsNullOrEmpty(str) || string.IsNullOrWhiteSpace(str)); + } } \ No newline at end of file diff --git a/Luski/Luski.csproj b/Luski/Luski.csproj index 02ca044..2993119 100644 --- a/Luski/Luski.csproj +++ b/Luski/Luski.csproj @@ -5,15 +5,26 @@ net6.0 enable enable + 1.0.1.2 + JacobTech, LLC + + + + + none - - + + + + Luski.ico + + diff --git a/Luski/Luski.ico b/Luski/Luski.ico new file mode 100755 index 0000000000000000000000000000000000000000..413cb3b687e5e224860cdb84e6b518668d7e4a84 GIT binary patch literal 39891 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 QaS-@BfpxI1wK{j>f8b7nk^lez literal 0 HcmV?d00001 diff --git a/Luski/Program.cs b/Luski/Program.cs index adc49ce..65ba94b 100644 --- a/Luski/Program.cs +++ b/Luski/Program.cs @@ -1,12 +1,78 @@ -using Luski.GUI.MainScreen; +using System.Diagnostics; +using System.Reflection; +using System.Security.Cryptography; +using Luski; +using Luski.Clesses; +using Luski.GUI.MainScreen; +using Luski.net; +using OpenTK.Windowing.Common.Input; +using SixLabors.ImageSharp.PixelFormats; try { - MainScreen t = new MainScreen(); - t.StartRender(); - t.Dispose(); + + Globals.Settings = Globals.GetSettings(Path.Combine(Globals.LuskiPath, "Settings.json"), SettingsContext.Default.Settings); + Globals.UpdaterSettings = Globals.GetSettings(Path.Combine(Globals.LuskiPath, "UpdaterSettings.json"), UpdaterSettingsContext.Default.UpdaterSettings); + + Assembly assembly = Assembly.GetExecutingAssembly(); + Stream? resource_stream = assembly.GetManifestResourceStream($"Luski.Resources.Textures.Luski.png"); + MemoryStream ms = new(); + resource_stream?.CopyTo(ms); + var Logo = SixLabors.ImageSharp.Image.Load(ms.ToArray()); + + var pixels = new List(4 * Logo.Width * Logo.Height); + + for (int y = 0; y < Logo.Height; y++) + { + var row = Logo.GetPixelRowSpan(y); + + for (int x = 0; x < Logo.Width; x++) + { + pixels.Add(row[x].R); + pixels.Add(row[x].G); + pixels.Add(row[x].B); + pixels.Add(row[x].A); + } + } + Globals.Icon = new WindowIcon(new Image(Logo.Width, Logo.Height, pixels.ToArray())); + Globals.ms = new MainScreen(); + Globals.ms.StartRender(); + Globals.ms.Dispose(); } catch (Exception ex) { Console.WriteLine(ex); +} + +if (Globals.Download) +{ + Console.WriteLine("Auto Update Starting"); + List arguments = new List + { + "--process", + Process.GetCurrentProcess().ProcessName, + "--remotedirectory", + "Luski", + "--localdirectory", + AppDomain.CurrentDomain.BaseDirectory, + "--branch", + Globals.UpdaterSettings.Branch.ToString(), + "--selfcontained", + Globals.UpdaterSettings.SelfContained.ToString().ToLower(), + "--platform", + Globals.UpdaterSettings.Platform, + "--setconfig", + Path.Combine(Globals.LuskiPath, "UpdaterSettings.json") + }; + if (Globals.UpdaterSettings.AutoLaunch) + { + arguments.Add("--dll"); + arguments.Add(AppDomain.CurrentDomain.FriendlyName); + } + Process p = new(); + p.StartInfo.FileName = Globals.UpdaterSettings.Updater; + p.StartInfo.WorkingDirectory = new FileInfo(Globals.UpdaterSettings.Updater!).Directory!.FullName; + p.StartInfo.Arguments = $"\"{string.Join("\" \"", arguments)}\""; + p.Start(); + Environment.Exit(0); } \ No newline at end of file diff --git a/Luski/Resources/Fonts/OpenSans-Regular.ttf b/Luski/Resources/Fonts/OpenSans-Regular.ttf new file mode 100644 index 0000000000000000000000000000000000000000..1dc226ddc00a11a9813844b00fb5edaf87921c38 GIT binary patch literal 129796 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°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 G@Baau^V-P( literal 0 HcmV?d00001