149 lines
7.9 KiB
C#
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);
|
|
}
|
|
}
|
|
} |