125 lines
4.5 KiB
C#
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);
|
|
}
|
|
} |