LuskiServer/LuskiServer/Controllers/v1/SocketBulkMessageController.cs
JacobTech 39c5401cdb Permission Check System
Added a system for code to easily check for permission to a given channel.
2023-05-21 16:14:24 -04:00

149 lines
7.9 KiB
C#

using Asp.Versioning;
using JacobTechEncryption;
using JacobTechEncryption.Enums;
using LuskiServer.Classes;
using LuskiServer.Classes.TableDef;
using LuskiServer.Classes.WebTypes;
using LuskiServer.Enums;
using Microsoft.AspNetCore.Mvc;
using ServerDatabase;
namespace LuskiServer.Controllers.v1;
[ApiVersion(1)]
[ApiController]
public class SocketBulkMessageController : ControllerBase
{
[HttpGet]
[Route(Luski.Info.Routes.Default.Base)]
public IActionResult Get()
{
try
{
if (!this.CanTokenRequest(out long ID, out IActionResult? toc) && toc != null) return toc;
if (!Request.Headers.ContainsKey("id")) return this.ShowError(ErrorCode.MissingHeader, "You did not give an channel id for the channel you want to get a message from");
string channel_id = Request.Headers["id"].First();
long MessagesToDownload = 50;
long Max = 200;
if (long.TryParse(channel_id, out long Channel_Id) && !Tables.Channels.TryRead(Channels.ID, out _, Channels.ID.CreateParameter(Channel_Id))) return this.ShowError(ErrorCode.InvalidHeader, "The the channel id you have given the server is not a valed id");
if (!Luski.HasAccessToChannel(ID, Channel_Id, ServerPermissions.ReadMessageHistory))
return this.ResponseToResult(new HTTPResponse() { error = ErrorCode.Forbidden });
if (Request.Headers.ContainsKey("messages")) _ = long.TryParse(Request.Headers["messages"].First(), out MessagesToDownload);
if (MessagesToDownload > Max) MessagesToDownload = Max;
string? MostRecentID = null;
string sign = "<";
if (!Request.Headers.ContainsKey("mostrecentid") || !long.TryParse(MostRecentID = Request.Headers["mostrecentid"].First(), out long mrid) || !Tables.Messages.TryRead(Messages.ID, out _, Messages.ID.CreateParameter(mrid), Messages.ChannelID.CreateParameter(Channel_Id)))
{
try
{
bool HasMRID = Tables.Messages.TryRead(Messages.ID, new Order() { Assending = false, Type = Messages.TimeStamp.Name }, out long MRID, Messages.ChannelID.CreateParameter(Channel_Id));
Console.WriteLine(MRID);
if (HasMRID)
{
MostRecentID = MRID.ToString();
sign += "=";
}
}
catch
{
return this.ResponseToResult(
new SocketBulkMessage()
{
messages = Array.Empty<SocketMessage>()
});
}
}
SocketBulkMessage all = new();
///StartDatabse(MessagesToDownload, Channel_Id, MostRecentID, sign, out SocketMessage[]? mmm);
SocketMessage[]? mmm = null;
if (MostRecentID != null)
{
var con2 = Luski.Database.CreateConnection();
con2.Open();
var cmd2 = con2.CreateCommand();
Console.WriteLine($"SELECT context,author_id,message_id,files FROM messages WHERE ts {sign} '{new Luski.Snowflake(long.Parse(MostRecentID)).Timestamp}' AND channel_id = '{Channel_Id}' ORDER BY ts DESC LIMIT {MessagesToDownload};");
cmd2.CommandText = $"SELECT context,author_id,message_id,files FROM messages WHERE ts {sign} '{new Luski.Snowflake(long.Parse(MostRecentID)).Timestamp}' AND channel_id = '{Channel_Id}' ORDER BY ts DESC LIMIT {MessagesToDownload};";
var reader2 = cmd2.ExecuteReader();
//Loop(Messages, Channel_Id, out mmm, reader);
long current = 0;
var mmmm = new List<SocketMessage>();
while (reader2.Read())
{
current++;
if (current <= MessagesToDownload)
{
SocketMessage Current = new();
//ReadRow(Channel_Id, reader, ref mmm);
Current.channel_id = Channel_Id;
int i2 = 0;
while (i2 < reader2.FieldCount)
{
//ReadCollume(reader.GetValue(i), ref msg, reader.GetName(i));
string name = reader2.GetName(i2);
object val = reader2.GetValue(i2);
if (name == "context") Current.content = Convert.ToBase64String((byte[])val);
else if (name == "author_id") Current.user_id = long.Parse(val.ToString());
else if (name == "message_id") Current.id = long.Parse(val.ToString());
else if (name == "files")
{
if (val is not DBNull)
{
if ((long[]?)val is not null && ((long[])val).Length > 0)
{
List<Classes.WebTypes.File> list = new();
foreach (long b in (long[])val)
{
var con = Luski.Database.CreateConnection();
con.Open();
var cmd = con.CreateCommand();
cmd.CommandText = $"SELECT name,size FROM files WHERE id = '{b}';";
var reader = cmd.ExecuteReader();
int i3 = 0;
Classes.WebTypes.File file = new()
{
data = null!,
id = b
};
while (reader.Read())
{
while (i3 < reader.FieldCount)
{
//ReadFileCollume(reader.GetValue(i), ref file, reader.GetName(i));
string name2 = reader2.GetName(i3);
object val2 = reader2.GetValue(i3);
if (name2 == "name") file.name = Convert.ToBase64String((byte[])val2);
else if (name2 == "size") file.size = ulong.Parse(val2.ToString());
else;
i3++;
}
if (i3 >= reader.FieldCount) break;
}
list.Add(file);
con.Close();
}
Current.files = list.ToArray();
}
}
}
i2++;
}
if (mmm == null) break;
mmmm.Add(Current);
}
else break;
}
mmm = mmmm.ToArray();
con2.Close();
}
if (mmm is not null) all.messages = mmm;
else all.messages = Array.Empty<SocketMessage>();
return this.ResponseToResult(all);
}
catch (Exception ex)
{
return this.ShowError(ex);
}
}
}