2023-01-06 01:52:36 -05:00

125 lines
4.5 KiB
C#

using GraphicsManager.Enums;
using GraphicsManager.Objects;
using Luski.GUI.MainScreen.Interfaces;
using Luski.net.Enums;
using Luski.net.JsonTypes;
using OpenTK.Mathematics;
using OpenTK.Windowing.Common;
using OpenTK.Windowing.GraphicsLibraryFramework;
namespace Luski.GUI.MainScreen.UI;
public class Chat : UserControl
{
private FlowLayout MessageFlow;
private UserControl titlecon, typecon;
private Label title, desc;
private Textbox tb;
private long id = -1;
public Chat()
{
Size = new(1520, 1334);
BackgroundColor = new(50, 50, 50, 255);
Anchor = ObjectAnchor.All;
Controls.Add(MessageFlow = new()
{
Size = new(1520, 1172),
Location = new(0, 80),
BackgroundColor = new(40,40,40,255),
Anchor = ObjectAnchor.All
});
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;
typecon.Controls.Add(tb = new Textbox()
{
InsideColor = new(28, 28, 28, 255),
BorderColor = Color4.DarkCyan,
Location = new(15, 15),
Size = new(1490, 52),
Anchor = ObjectAnchor.All
});
tb.KeyPress += TbOnKeyPress;
}
private Task TbOnKeyPress(KeyboardKeyEventArgs arg)
{
if (arg.Key != Keys.Enter && arg.Key != Keys.KeyPadEnter) return Task.CompletedTask;
Thread t = new(() => Thr());
t.Start();
return Task.CompletedTask;
}
private void Thr()
{
Globals.Luski.SendMessage(tb.Text, id);
tb.Text = string.Empty;
}
private Task LuskiOnMessageReceived(SocketMessage arg)
{
if (id != arg.ChannelID) return Task.CompletedTask;
AddMessage(arg);
return Task.CompletedTask;
}
public void Clear()
{
MessageFlow.Controls.Clear();
lastm = null;
lastUser = null;
}
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;
title.Text = channelPick.Channel.Title;
if (channelPick.Channel.Type == ChannelType.DM)
title.Text = (channelPick.Channel as SocketDMChannel)!.User.Username;
if (channelPick.Channel.Description is not null)
{
desc.Visible = true;
desc.Text = channelPick.Channel.Description;
desc.Location = new(title.Location.X + title.Size.X + 5, title.Location.Y);
}
else
{
desc.Visible = false;
}
}
private SocketMessage? lastm = null;
private long? lastUser = null;
private ChatMessage? LastChatMessage = null;
public void AddMessage(SocketMessage Message)
{
bool hasbeentenmin = false;
if (lastm is not null)
hasbeentenmin =
new DateTime(2022, 1, 1, 0, 0, 0, 0).AddMilliseconds(lastm.Id >> 22).ToLocalTime().AddMinutes(10) <
new DateTime(2022, 1, 1, 0, 0, 0, 0).AddMilliseconds(Message.Id >> 22).ToLocalTime();
lastm = Message;
if (lastUser is null || lastUser != Message.AuthorID || hasbeentenmin)
{
if (Window is null || !Window.InvokeRequired)
MessageFlow.Controls.Add(LastChatMessage = new ChatMessage(Message));
else
Window!.Invoke(new Action(() => { MessageFlow.Controls.Add(LastChatMessage = new ChatMessage(Message)); Window.DrawFrame(); }));
}
else
{
if (Window is null || !Window.InvokeRequired)
LastChatMessage!.AddMessage(Message);
else
Window!.Invoke(new Action(() => { LastChatMessage!.AddMessage(Message); Window!.DrawFrame(); }));
}
lastUser = Message.AuthorID;
//Task.Delay(100);
}
}