diff --git a/LuskiServer/Classes/AppConfig.cs b/LuskiServer/Classes/AppConfig.cs index 013dbef..dfd2f95 100644 --- a/LuskiServer/Classes/AppConfig.cs +++ b/LuskiServer/Classes/AppConfig.cs @@ -12,7 +12,7 @@ public class AppConfig public byte DataId { get; set; } = 0; [JsonInclude] [JsonPropertyName("server_epoch")] - public long ServerEpoch { get; set; } = Luski.Info.GetTimestampFromEpoch(0); + public DateTime ServerEpoch { get; set; } = DateTime.UtcNow.Date; [JsonInclude] [JsonPropertyName("database")] public string Database { get; set; } = "Some database name"; diff --git a/LuskiServer/Classes/Luski.cs b/LuskiServer/Classes/Luski.cs index dd58382..478f284 100644 --- a/LuskiServer/Classes/Luski.cs +++ b/LuskiServer/Classes/Luski.cs @@ -80,9 +80,9 @@ public static class Luski // public static readonly DateTime ServerEpoch = new(2023, 1, 1, 0, 0, 0, 0); - public static long GetTimestampFromEpoch(long Epoch) + public static long GetTimestampFromEpoch(DateTime Epoch) { - double ts = Math.Round(DateTime.UtcNow.Subtract(DateTime.UnixEpoch).TotalMilliseconds - Epoch, 0); + double ts = Math.Round(DateTime.UtcNow.Subtract(Epoch).TotalMilliseconds, 0); return long.Parse(ts.ToString().Replace(".", string.Empty)); } } @@ -97,7 +97,7 @@ public static class Luski Timestamp = ID >> 20; } - public static Snowflake GenerateSnowflake(long Epoch) + public static Snowflake GenerateSnowflake(DateTime Epoch) { i++; if (i > 0b_1111_1111_1111) i = 0; diff --git a/LuskiServer/Classes/ServerComs/MessageEvent.cs b/LuskiServer/Classes/ServerComs/MessageEvent.cs new file mode 100644 index 0000000..7b63e27 --- /dev/null +++ b/LuskiServer/Classes/ServerComs/MessageEvent.cs @@ -0,0 +1,23 @@ +using System.Text.Json.Serialization; +using LuskiServer.Interfaces.ServerComs; + +namespace LuskiServer.Classes.ServerComs; + +public class MessageEvent : IServerEvent +{ + [JsonInclude] + [JsonPropertyName("user_id")] + public long UserID { get; set; } + [JsonInclude] + [JsonPropertyName("channel_id")] + public long ChannelID { get; set; } + [JsonInclude] + [JsonPropertyName("context")] + public string Base64Context { get; set; } + [JsonInclude] + [JsonPropertyName("id")] + public long ID { get; set; } + [JsonInclude] + [JsonPropertyName("files")] + public long[] Files { get; set; } +} \ No newline at end of file diff --git a/LuskiServer/Classes/ServerComs/ServerEvent.cs b/LuskiServer/Classes/ServerComs/ServerEvent.cs new file mode 100644 index 0000000..40a54c2 --- /dev/null +++ b/LuskiServer/Classes/ServerComs/ServerEvent.cs @@ -0,0 +1,16 @@ +using System.Text.Json.Serialization; +using LuskiServer.Enums.ServerComs; +using LuskiServer.Interfaces.ServerComs; + +namespace LuskiServer.Classes.ServerComs; + +public class ServerEvent +{ + [JsonInclude] + [JsonPropertyName("type")] + public DataType Type { get; set; } + + [JsonInclude] + [JsonPropertyName("data")] + public IServerEvent Data { get; set; } +} \ No newline at end of file diff --git a/LuskiServer/Classes/ServerComs/ServerSendSendEvent.cs b/LuskiServer/Classes/ServerComs/ServerSendSendEvent.cs new file mode 100644 index 0000000..7311cd8 --- /dev/null +++ b/LuskiServer/Classes/ServerComs/ServerSendSendEvent.cs @@ -0,0 +1,23 @@ +using System.Text.Json.Serialization; +using LuskiServer.Enums.ServerComs; + +namespace LuskiServer.Classes.ServerComs; + +public class ServerSendSendEvent +{ + [JsonInclude] + [JsonPropertyName("data")] + public ServerEvent Data { get; set; } + + [JsonInclude] + [JsonPropertyName("send_type")] + public SendType SendType { get; set; } + + [JsonInclude] + [JsonPropertyName("id")] + public long? ID { get; set; } = null; + + [JsonInclude] + [JsonPropertyName("ids")] + public long[]? IDS { get; set; } = null; +} \ No newline at end of file diff --git a/LuskiServer/Classes/ServerComs/WSS.cs b/LuskiServer/Classes/ServerComs/WSS.cs new file mode 100644 index 0000000..175fbe2 --- /dev/null +++ b/LuskiServer/Classes/ServerComs/WSS.cs @@ -0,0 +1,18 @@ +using LuskiServer.Enums.ServerComs; + +namespace LuskiServer.Classes.ServerComs; + +public class WSS +{ + public static void SendData(SendType SendType, ServerEvent Event, params long[] IDS) + { + ServerSendSendEvent SSSE = new() + { + SendType = SendType, + Data = Event + }; + if (SendType == SendType.ID_Group) SSSE.IDS = IDS; + else if (SendType == SendType.ID) SSSE.ID = IDS[0]; + //TODO Start work on server send code + } +} \ No newline at end of file diff --git a/LuskiServer/Classes/TableDef/Files.cs b/LuskiServer/Classes/TableDef/Files.cs index 780fde4..56da3d8 100644 --- a/LuskiServer/Classes/TableDef/Files.cs +++ b/LuskiServer/Classes/TableDef/Files.cs @@ -6,6 +6,7 @@ namespace LuskiServer.Classes.TableDef; public static class Files { public static TableColumn ID { get; } = new("id", true); + public static TableColumn ChannelID { get; } = new("channel_id"); public static TableColumn Size { get; } = new("size"); public static TableColumn Name { get; } = new("name"); public static TableColumn Hash { get; } = new("hash"); diff --git a/LuskiServer/Classes/v1/Incoming/ClientSendMessage.cs b/LuskiServer/Classes/v1/Incoming/ClientSendMessage.cs new file mode 100644 index 0000000..f95ddcc --- /dev/null +++ b/LuskiServer/Classes/v1/Incoming/ClientSendMessage.cs @@ -0,0 +1,24 @@ +using System.Text.Json.Serialization; +using Microsoft.AspNetCore.Mvc.ModelBinding; + +namespace LuskiServer.Classes.v1.Incoming; + +public class ClientSendMessage +{ + [JsonInclude] + [BindRequired] + [JsonRequired] + [JsonPropertyName("channel_id")] + public long ChannelID { get; set; } + [JsonInclude] + [BindRequired] + [JsonRequired] + [JsonPropertyName("context")] + public string Base64Context { get; set; } + + [JsonInclude] + [BindRequired] + [JsonRequired] + [JsonPropertyName("files")] + public long[] Files { get; set; } +} \ No newline at end of file diff --git a/LuskiServer/Controllers/v1/SocketBulkMessageController.cs b/LuskiServer/Controllers/v1/SocketBulkMessageController.cs index 71a6d7d..ab4a31f 100644 --- a/LuskiServer/Controllers/v1/SocketBulkMessageController.cs +++ b/LuskiServer/Controllers/v1/SocketBulkMessageController.cs @@ -15,6 +15,7 @@ namespace LuskiServer.Controllers.v1; public class SocketBulkMessageController : ControllerBase { [HttpGet] + [Route(Luski.Info.Routes.Default.Base)] public IActionResult Get() { try diff --git a/LuskiServer/Controllers/v1/SocketMessageController.cs b/LuskiServer/Controllers/v1/SocketMessageController.cs new file mode 100644 index 0000000..3c17215 --- /dev/null +++ b/LuskiServer/Controllers/v1/SocketMessageController.cs @@ -0,0 +1,62 @@ +using Asp.Versioning; +using JacobTechEncryption.Enums; +using LuskiServer.Classes; +using LuskiServer.Classes.ServerComs; +using LuskiServer.Classes.TableDef; +using LuskiServer.Classes.v1.Incoming; +using LuskiServer.Classes.WebTypes; +using LuskiServer.Enums; +using LuskiServer.Enums.ServerComs; +using Microsoft.AspNetCore.Mvc; + +namespace LuskiServer.Controllers.v1; + +[ApiVersion(1)] +[ApiController] +public class SocketMessageController : ControllerBase +{ + [HttpPost] + [DisableRequestSizeLimit] + [Route(Luski.Info.Routes.Default.Base)] + public async Task Post([FromBody]ClientSendMessage data) + { + try + { + if (!this.CanTokenRequest(out long ID, out IActionResult? toc) && toc != null) return toc; + //TODO Add a check system for channel access + //if (Luski.HasAccessToChannel(ID, data.ChannelID)) + { + Luski.Snowflake Id = Luski.Snowflake.GenerateSnowflake(Tables.Channels.Read(Channels.Epoch, Channels.ID.CreateParameter(data.ChannelID))); + ChannelType type = Tables.Channels.Read(Channels.Type, Channels.ID.CreateParameter(data.ChannelID)); + MessageEvent MessageEvent = new() + { + UserID = ID, + ChannelID = data.ChannelID, + Base64Context = data.Base64Context, + ID = Id.ID + }; + Tables.Messages.Insert( + Messages.ChannelID.CreateParameter(data.ChannelID), + Messages.ID.CreateParameter(Id.ID), + Messages.AuthorID.CreateParameter(ID), + Messages.Context.CreateParameter(Convert.FromBase64String(data.Base64Context)), + Messages.TimeStamp.CreateParameter(Id.Timestamp), + Messages.Files.CreateParameter(data.Files), + Messages.EncoderType.CreateParameter(EncoderType.UTF8), + Messages.EncryptionType.CreateParameter(EncryptionType.RSA)); + //TODO Get all ID for members to send to + WSS.SendData(SendType.ID_Group, new ServerEvent() + { + Type = DataType.MessageCreate, + Data = MessageEvent + }, Array.Empty()); + } + Response.StatusCode = 201; + return null!; + } + catch (Exception ex) + { + return this.ShowError(ex); + } + } +} \ No newline at end of file diff --git a/LuskiServer/Enums/ChannelType.cs b/LuskiServer/Enums/ChannelType.cs index b7418df..4878bc7 100644 --- a/LuskiServer/Enums/ChannelType.cs +++ b/LuskiServer/Enums/ChannelType.cs @@ -2,5 +2,5 @@ namespace LuskiServer.Enums; public enum ChannelType : short { - Default = 0 + TextAndVoice = 0 } \ No newline at end of file diff --git a/LuskiServer/Enums/ServerComs/DataType.cs b/LuskiServer/Enums/ServerComs/DataType.cs new file mode 100644 index 0000000..a02e3f7 --- /dev/null +++ b/LuskiServer/Enums/ServerComs/DataType.cs @@ -0,0 +1,6 @@ +namespace LuskiServer.Enums.ServerComs; + +public enum DataType +{ + MessageCreate +} \ No newline at end of file diff --git a/LuskiServer/Enums/ServerComs/SendType.cs b/LuskiServer/Enums/ServerComs/SendType.cs new file mode 100644 index 0000000..623df93 --- /dev/null +++ b/LuskiServer/Enums/ServerComs/SendType.cs @@ -0,0 +1,8 @@ +namespace LuskiServer.Enums.ServerComs; + +public enum SendType +{ + All, + ID_Group, + ID +} \ No newline at end of file diff --git a/LuskiServer/Interfaces/ServerComs/IServerEvent.cs b/LuskiServer/Interfaces/ServerComs/IServerEvent.cs new file mode 100644 index 0000000..0c78a7c --- /dev/null +++ b/LuskiServer/Interfaces/ServerComs/IServerEvent.cs @@ -0,0 +1,6 @@ +namespace LuskiServer.Interfaces.ServerComs; + +public interface IServerEvent +{ + +} \ No newline at end of file diff --git a/LuskiServer/Program.cs b/LuskiServer/Program.cs index 1d5730b..ccb27d3 100644 --- a/LuskiServer/Program.cs +++ b/LuskiServer/Program.cs @@ -14,7 +14,7 @@ using Swashbuckle.AspNetCore.SwaggerGen; [assembly: Microsoft.AspNetCore.Mvc.ApiController] Luski.Config = Luski.GetSettings("/etc/luskiserver/app.json", AppConfigContext.Default.AppConfig, true); -Console.WriteLine($"Server starting with starting epoch of {DateTime.UnixEpoch.AddMilliseconds(Luski.Config.ServerEpoch).ToLocalTime()}"); +Console.WriteLine($"Server starting with starting epoch of {Luski.Config.ServerEpoch.ToLocalTime()} and current time of {DateTime.UtcNow.ToLocalTime()}"); Luski.Database = new Database(Luski.Config.Address, Luski.Config.Database, Luski.Config.Username, @@ -99,7 +99,7 @@ if (!Tables.Categories.TryRead(Categories.ID, out _, Categories.ID.CreateParamet ); Tables.Channels.Insert( Channels.ID.CreateParameter(0), - Channels.Type.CreateParameter(ChannelType.Default), + Channels.Type.CreateParameter(ChannelType.TextAndVoice), Channels.Description.CreateParameter(Encoding.UTF8.GetBytes("Default chat for you to use in your new server")), Channels.Name.CreateParameter(Encoding.UTF8.GetBytes("Default Channel")), Channels.Key.CreateParameter(Luski.Encryption.Keys.PublicKey),