JacobTech c178ec62cf Public Servers.
Added a bunch of controls to use in public servers.
2023-08-21 10:55:03 -04:00

126 lines
4.5 KiB
C#

using GraphicsManager.Enums;
using GraphicsManager.Objects;
using Luski.net.Structures.Public;
using OpenTK.Mathematics;
using OpenTK.Windowing.Common.Input;
namespace Luski.GUI.MainScreen.UI.PublicServers;
public class PublicChat : UserControl
{
public FlowLayout MessageFlow;
private Label title, desc;
private Textbox tb;
private SocketChannel? Channel;
public PublicChat()
{
UserControl titlecon;
Size = new((int)(980 * Globals.Settings.Scale), (int)(866 * Globals.Settings.Scale));
BackgroundColor = new(50, 50, 50, 255);
Anchor = ObjectAnchor.All;
Controls.Add(MessageFlow = new()
{
Size = new(Size.X, (int)(761 * Globals.Settings.Scale)),
Location = new(0, (int)(52 * Globals.Settings.Scale)),
BackgroundColor = new(40,40,40,255),
Anchor = ObjectAnchor.All,
HScrollPixels = Globals.Settings.PerScrollPixels
});
Controls.Add(titlecon = new UserControl(){Anchor = ObjectAnchor.Left | ObjectAnchor.Top | ObjectAnchor.Right, Size = new((int)(980 * Globals.Settings.Scale), (int)(52 * Globals.Settings.Scale)), BackgroundColor = BackgroundColor});
titlecon.Controls.Add(title = new Label(Globals.DefaultFont)
{
//Location = new(
// (int)((26 - (Globals.DefaultFont.PixelHeight / 2)) * Globals.Settings.Scale),
// (int)((26 * Globals.Settings.Scale) - (Globals.DefaultFont.PixelHeight/2.0)))
});
titlecon.Controls.Add(desc = new Label(Globals.DefaultFont){ Color = new(161,161,161,255), Location = new(title.Location.X + title.Size.X + 5, title.Location.Y)});
Controls.Add(tb = new Textbox(Globals.DefaultFont, Globals.DefaultFont)
{
InsideColor = new(28, 28, 28, 255),
BorderColor = Color4.DarkCyan,
Location = new((int)(10 * Globals.Settings.Scale), (int)(824 * Globals.Settings.Scale)),
Size = new((int)(960 * Globals.Settings.Scale), (int)(34 * Globals.Settings.Scale)),
Anchor = ObjectAnchor.Bottom | ObjectAnchor.Left | ObjectAnchor.Right,
HoverMouse = MouseCursor.IBeam
});
//tb.KeyPress += TbOnKeyPress;
//Globals.Luski.MainServer.MessageReceived += LuskiOnMessageReceived;
}
private SocketMessage? lastm;
private long? lastUser;
private ChatMessage? LastChatMessage;
public async Task LoadChannel(SocketChannel channel)
{
Channel = channel;
title.Text = channel.Name;
desc.Text = channel.Description;
this.tb.WatermarkText = $"Message {channel.Name}";
}
public void ClearChat()
{
MessageFlow.Controls.Clear();
lastm = null;
lastUser = null;
LastChatMessage = null;
}
public async Task AddMessages(IEnumerable<SocketMessage> messages, bool reverse = true)
{
if (reverse)
{
foreach (SocketMessage message in messages.Reverse())
{
await AddMessage(message);
}
}
else
{
foreach (SocketMessage message in messages)
{
await AddMessage(message);
}
}
}
public async Task 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 || !Globals.ms.InvokeRequired)
{
MessageFlow.Controls.Add(LastChatMessage = await ChatMessage.MakeChatMessage(Message));
}
else
{
LastChatMessage = await ChatMessage.MakeChatMessage(Message);
Globals.ms.Invoke(() =>
{
MessageFlow.Controls.Add(LastChatMessage);
Window.DrawFrame();
});
}
}
else
{
if (Window is null || !Globals.ms.InvokeRequired)
{
await LastChatMessage!.AddMessage(Message);
}
else
Globals.ms.Invoke(() => { LastChatMessage!.AddMessage(Message); Window!.DrawFrame(); });
}
lastUser = Message.AuthorID;
}
}