Nuked MessageFlags.
This commit is contained in:
parent
bd86c610a3
commit
224036adbd
9 changed files with 75 additions and 65 deletions
SharpChat.MariaDB
SharpChat.SockChat/S2CPackets
SharpChat
SharpChatCommon/Messages
|
@ -18,18 +18,16 @@ public partial class MariaDBMessageStorage(string connString) : MessageStorage {
|
|||
int senderRank,
|
||||
string senderNick,
|
||||
UserPermissions senderPerms,
|
||||
object? data = null,
|
||||
MessageFlags flags = MessageFlags.None
|
||||
object? data = null
|
||||
) {
|
||||
await RunCommand(
|
||||
"INSERT INTO `sqc_events` (`event_id`, `event_created`, `event_type`, `event_target`, `event_flags`, `event_data`"
|
||||
+ ", `event_sender`, `event_sender_name`, `event_sender_colour`, `event_sender_rank`, `event_sender_nick`, `event_sender_perms`)"
|
||||
+ " VALUES (@id, NOW(), @type, @target, @flags, @data"
|
||||
"INSERT INTO sqc_events (event_id, event_created, event_type, event_target, event_data"
|
||||
+ ", event_sender, event_sender_name, event_sender_colour, event_sender_rank, event_sender_nick, event_sender_perms)"
|
||||
+ " VALUES (@id, NOW(), @type, @target, @data"
|
||||
+ ", @sender, @sender_name, @sender_colour, @sender_rank, @sender_nick, @sender_perms)",
|
||||
new MySqlParameter("id", id),
|
||||
new MySqlParameter("type", type),
|
||||
new MySqlParameter("target", string.IsNullOrWhiteSpace(channelName) ? null : channelName),
|
||||
new MySqlParameter("flags", (byte)flags),
|
||||
new MySqlParameter("data", data == null ? "{}" : JsonSerializer.SerializeToUtf8Bytes(data)),
|
||||
new MySqlParameter("sender", long.TryParse(senderId, out long senderId64) && senderId64 > 0 ? senderId64 : null),
|
||||
new MySqlParameter("sender_name", senderName),
|
||||
|
@ -43,12 +41,12 @@ public partial class MariaDBMessageStorage(string connString) : MessageStorage {
|
|||
public async Task<Message?> GetMessage(long seqId) {
|
||||
try {
|
||||
using MySqlDataReader? reader = await RunQuery(
|
||||
"SELECT `event_id`, `event_type`, `event_flags`, `event_data`, `event_target`"
|
||||
+ ", `event_sender`, `event_sender_name`, `event_sender_colour`, `event_sender_rank`, `event_sender_nick`, `event_sender_perms`"
|
||||
+ ", UNIX_TIMESTAMP(`event_created`) AS `event_created`"
|
||||
+ ", UNIX_TIMESTAMP(`event_deleted`) AS `event_deleted`"
|
||||
+ " FROM `sqc_events`"
|
||||
+ " WHERE `event_id` = @id",
|
||||
"SELECT event_id, event_type, event_data, event_target"
|
||||
+ ", event_sender, event_sender_name, event_sender_colour, event_sender_rank, event_sender_nick, event_sender_perms"
|
||||
+ ", UNIX_TIMESTAMP(event_created) AS event_created"
|
||||
+ ", UNIX_TIMESTAMP(event_deleted) AS event_deleted"
|
||||
+ " FROM sqc_events"
|
||||
+ " WHERE event_id = @id",
|
||||
new MySqlParameter("id", seqId)
|
||||
);
|
||||
|
||||
|
@ -80,8 +78,7 @@ public partial class MariaDBMessageStorage(string connString) : MessageStorage {
|
|||
DateTimeOffset.FromUnixTimeSeconds(reader.GetInt32("event_created")),
|
||||
reader.IsDBNull(reader.GetOrdinal("event_deleted")) ? null : DateTimeOffset.FromUnixTimeSeconds(reader.GetInt32("event_deleted")),
|
||||
reader.IsDBNull(reader.GetOrdinal("event_target")) ? null : Encoding.ASCII.GetString((byte[])reader["event_target"]),
|
||||
JsonDocument.Parse(Encoding.ASCII.GetString((byte[])reader["event_data"])),
|
||||
(MessageFlags)reader.GetByte("event_flags")
|
||||
JsonDocument.Parse(Encoding.ASCII.GetString((byte[])reader["event_data"]))
|
||||
);
|
||||
}
|
||||
|
||||
|
@ -90,14 +87,14 @@ public partial class MariaDBMessageStorage(string connString) : MessageStorage {
|
|||
|
||||
try {
|
||||
using MySqlDataReader? reader = await RunQuery(
|
||||
"SELECT `event_id`, `event_type`, `event_flags`, `event_data`, `event_target`"
|
||||
+ ", `event_sender`, `event_sender_name`, `event_sender_colour`, `event_sender_rank`, `event_sender_nick`, `event_sender_perms`"
|
||||
+ ", UNIX_TIMESTAMP(`event_created`) AS `event_created`"
|
||||
+ ", UNIX_TIMESTAMP(`event_deleted`) AS `event_deleted`"
|
||||
+ " FROM `sqc_events`"
|
||||
+ " WHERE `event_deleted` IS NULL AND (`event_target` = @target OR `event_target` IS NULL)"
|
||||
+ " AND `event_id` > @offset"
|
||||
+ " ORDER BY `event_id` DESC"
|
||||
"SELECT event_id, event_type, event_data, event_target"
|
||||
+ ", event_sender, event_sender_name, event_sender_colour, event_sender_rank, event_sender_nick, event_sender_perms"
|
||||
+ ", UNIX_TIMESTAMP(event_created) AS event_created"
|
||||
+ ", UNIX_TIMESTAMP(event_deleted) AS event_deleted"
|
||||
+ " FROM sqc_events"
|
||||
+ " WHERE event_deleted IS NULL AND (event_target = @target OR event_target IS NULL)"
|
||||
+ " AND event_id > @offset"
|
||||
+ " ORDER BY event_id DESC"
|
||||
+ " LIMIT @amount",
|
||||
new MySqlParameter("target", channelName),
|
||||
new MySqlParameter("amount", amount),
|
||||
|
@ -122,7 +119,7 @@ public partial class MariaDBMessageStorage(string connString) : MessageStorage {
|
|||
|
||||
public async Task DeleteMessage(Message evt) {
|
||||
await RunCommand(
|
||||
"UPDATE IGNORE `sqc_events` SET `event_deleted` = NOW() WHERE `event_id` = @id AND `event_deleted` IS NULL",
|
||||
"UPDATE IGNORE sqc_events SET event_deleted = NOW() WHERE event_id = @id AND event_deleted IS NULL",
|
||||
new MySqlParameter("id", evt.Id)
|
||||
);
|
||||
}
|
||||
|
|
|
@ -32,6 +32,28 @@ public partial class MariaDBMessageStorage {
|
|||
await DoMigration("allow_null_target", AllowNullTarget);
|
||||
await DoMigration("event_data_as_medium_blob", EventDataAsMediumBlob);
|
||||
await DoMigration("event_user_and_nick_name_to_1000", EventUserAndNickNameTo1000);
|
||||
await DoMigration("no_more_flags_field", NoMoreFlagsField);
|
||||
await DoMigration("update_event_type_names", UpdateEventTypeNames);
|
||||
}
|
||||
|
||||
private async Task UpdateEventTypeNames() {
|
||||
await RunCommand(@"UPDATE sqc_events SET event_type = ""msg:add"" WHERE event_type = ""SharpChat.Events.ChatMessage""");
|
||||
await RunCommand(@"UPDATE sqc_events SET event_type = ""user:connect"" WHERE event_type = ""SharpChat.Events.UserConnectEvent""");
|
||||
await RunCommand(@"UPDATE sqc_events SET event_type = ""user:disconnect"" WHERE event_type = ""SharpChat.Events.UserDisconnectEvent""");
|
||||
await RunCommand(@"UPDATE sqc_events SET event_type = ""chan:join"" WHERE event_type = ""SharpChat.Events.UserChannelJoinEvent""");
|
||||
await RunCommand(@"UPDATE sqc_events SET event_type = ""chan:leave"" WHERE event_type = ""SharpChat.Events.UserChannelLeaveEvent""");
|
||||
}
|
||||
|
||||
private async Task NoMoreFlagsField() {
|
||||
// MessageFlags.Action is just a field in the data object
|
||||
await RunCommand("UPDATE sqc_events SET event_data = JSON_MERGE_PATCH(event_data, JSON_OBJECT('act', true)) WHERE event_flags & 1");
|
||||
|
||||
// MessageFlags.Broadcast can be implied by just having a NULL as the channel name
|
||||
await RunCommand("UPDATE sqc_events SET event_target = NULL WHERE event_flags & 2");
|
||||
|
||||
// MessageFlags.Log was never meaningfully used by anything and basically just meant "not-msg:add"
|
||||
// MessageFlags.Private was also never meaningfully used, can be determined by checking if the channel name starts with @
|
||||
await RunCommand("ALTER TABLE sqc_events DROP COLUMN event_flags");
|
||||
}
|
||||
|
||||
private async Task EventUserAndNickNameTo1000() {
|
||||
|
|
|
@ -1,13 +1,14 @@
|
|||
using SharpChat.Messages;
|
||||
using System.Text;
|
||||
using System.Text.Json;
|
||||
|
||||
namespace SharpChat.SockChat.S2CPackets;
|
||||
|
||||
public class ContextMessageS2CPacket(Message msg, bool notify = false) : S2CPacket {
|
||||
public string Pack() {
|
||||
bool isAction = msg.Flags.HasFlag(MessageFlags.Action);
|
||||
bool isBroadcast = msg.Flags.HasFlag(MessageFlags.Broadcast);
|
||||
bool isPrivate = msg.Flags.HasFlag(MessageFlags.Private);
|
||||
bool isAction = false;
|
||||
bool isBroadcast = msg.IsBroadcast;
|
||||
bool isPrivate = msg.IsPrivate;
|
||||
|
||||
StringBuilder sb = new();
|
||||
|
||||
|
@ -18,6 +19,9 @@ public class ContextMessageS2CPacket(Message msg, bool notify = false) : S2CPack
|
|||
switch(msg.Type) {
|
||||
case "msg:add":
|
||||
case "SharpChat.Events.ChatMessage":
|
||||
if(msg.Data.RootElement.TryGetProperty("act", out JsonElement act))
|
||||
isAction = act.GetBoolean();
|
||||
|
||||
if(isBroadcast || msg.SenderId is null) {
|
||||
sb.Append("-1\tChatBot\tinherit\t\t0\fsay\f");
|
||||
} else {
|
||||
|
@ -42,13 +46,14 @@ public class ContextMessageS2CPacket(Message msg, bool notify = false) : S2CPack
|
|||
if(isAction)
|
||||
sb.Append("<i>");
|
||||
|
||||
sb.Append(
|
||||
(msg.Data.RootElement.GetProperty("text").GetString()?
|
||||
.Replace("<", "<")
|
||||
.Replace(">", ">")
|
||||
.Replace("\n", " <br/> ")
|
||||
.Replace("\t", " ")) ?? string.Empty
|
||||
);
|
||||
if(msg.Data.RootElement.TryGetProperty("text", out JsonElement text))
|
||||
sb.Append(
|
||||
text.GetString()!
|
||||
.Replace("<", "<")
|
||||
.Replace(">", ">")
|
||||
.Replace("\n", " <br/> ")
|
||||
.Replace("\t", " ")
|
||||
);
|
||||
|
||||
if(isAction)
|
||||
sb.Append("</i>");
|
||||
|
|
|
@ -98,7 +98,7 @@ public class AuthC2SPacketHandler(
|
|||
if(!ctx.Chat.IsInChannel(user, channel)) {
|
||||
long msgId = snowflake.Next();
|
||||
await ctx.Chat.SendTo(channel, new UserConnectS2CPacket(msgId, DateTimeOffset.Now, user.UserId, user.LegacyNameWithStatus, user.Colour, user.Rank, user.Permissions));
|
||||
await ctx.Chat.Messages.LogMessage(msgId, "user:connect", channel.Name, user.UserId, user.UserName, user.Colour, user.Rank, user.NickName, user.Permissions, null, MessageFlags.Log);
|
||||
await ctx.Chat.Messages.LogMessage(msgId, "user:connect", channel.Name, user.UserId, user.UserName, user.Colour, user.Rank, user.NickName, user.Permissions);
|
||||
}
|
||||
|
||||
await ctx.Connection.Send(new AuthSuccessS2CPacket(
|
||||
|
|
|
@ -4,6 +4,7 @@ using SharpChat.Messages;
|
|||
using SharpChat.Snowflake;
|
||||
using SharpChat.SockChat;
|
||||
using SharpChat.SockChat.S2CPackets;
|
||||
using System.Dynamic;
|
||||
using System.Net;
|
||||
|
||||
namespace SharpChat;
|
||||
|
@ -72,15 +73,12 @@ public class Context {
|
|||
));
|
||||
}
|
||||
|
||||
await Messages.LogMessage(
|
||||
mce.MessageId, "msg:add",
|
||||
mce.ChannelName,
|
||||
mce.SenderId, mce.SenderName, mce.SenderColour, mce.SenderRank, mce.SenderNickName, mce.SenderPerms,
|
||||
new { text = mce.MessageText },
|
||||
(mce.IsBroadcast ? MessageFlags.Broadcast : 0)
|
||||
| (mce.IsAction ? MessageFlags.Action : 0)
|
||||
| (mce.IsPrivate ? MessageFlags.Private : 0)
|
||||
);
|
||||
dynamic data = new ExpandoObject();
|
||||
data.text = mce.MessageText;
|
||||
if(mce.IsAction)
|
||||
data.act = true;
|
||||
|
||||
await Messages.LogMessage(mce.MessageId, "msg:add", mce.ChannelName, mce.SenderId, mce.SenderName, mce.SenderColour, mce.SenderRank, mce.SenderNickName, mce.SenderPerms, data);
|
||||
return;
|
||||
}
|
||||
}
|
||||
|
@ -220,7 +218,7 @@ public class Context {
|
|||
|
||||
long msgId = RandomSnowflake.Next();
|
||||
await SendTo(chan, new UserDisconnectS2CPacket(msgId, DateTimeOffset.Now, user.UserId, user.LegacyNameWithStatus, reason));
|
||||
await Messages.LogMessage(msgId, "user:disconnect", chan.Name, user.UserId, user.UserName, user.Colour, user.Rank, user.NickName, user.Permissions, new { reason = (int)reason }, MessageFlags.Log);
|
||||
await Messages.LogMessage(msgId, "user:disconnect", chan.Name, user.UserId, user.UserName, user.Colour, user.Rank, user.NickName, user.Permissions, new { reason = (int)reason });
|
||||
|
||||
if(chan.IsTemporary && chan.IsOwner(user.UserId))
|
||||
await RemoveChannel(chan);
|
||||
|
@ -251,11 +249,11 @@ public class Context {
|
|||
|
||||
long leaveId = RandomSnowflake.Next();
|
||||
await SendTo(oldChan, new UserChannelLeaveS2CPacket(leaveId, user.UserId));
|
||||
await Messages.LogMessage(leaveId, "chan:leave", oldChan.Name, user.UserId, user.UserName, user.Colour, user.Rank, user.NickName, user.Permissions, null, MessageFlags.Log);
|
||||
await Messages.LogMessage(leaveId, "chan:leave", oldChan.Name, user.UserId, user.UserName, user.Colour, user.Rank, user.NickName, user.Permissions);
|
||||
|
||||
long joinId = RandomSnowflake.Next();
|
||||
await SendTo(chan, new UserChannelJoinS2CPacket(joinId, user.UserId, user.LegacyNameWithStatus, user.Colour, user.Rank, user.Permissions));
|
||||
await Messages.LogMessage(joinId, "chan:join", chan.Name, user.UserId, user.LegacyName, user.Colour, user.Rank, user.NickName, user.Permissions, null, MessageFlags.Log);
|
||||
await Messages.LogMessage(joinId, "chan:join", chan.Name, user.UserId, user.LegacyName, user.Colour, user.Rank, user.NickName, user.Permissions);
|
||||
|
||||
await SendTo(user, new ContextClearS2CPacket(ContextClearS2CPacket.Mode.MessagesUsers));
|
||||
await SendTo(user, new ContextUsersS2CPacket(
|
||||
|
|
|
@ -14,8 +14,7 @@ public class Message(
|
|||
DateTimeOffset created,
|
||||
DateTimeOffset? deleted,
|
||||
string? channelName,
|
||||
JsonDocument data,
|
||||
MessageFlags flags
|
||||
JsonDocument data
|
||||
) {
|
||||
public long Id { get; } = id;
|
||||
public string Type { get; } = type;
|
||||
|
@ -28,8 +27,10 @@ public class Message(
|
|||
public DateTimeOffset Created { get; } = created;
|
||||
public DateTimeOffset? Deleted { get; } = deleted;
|
||||
public string? ChannelName { get; } = channelName;
|
||||
public MessageFlags Flags { get; } = flags;
|
||||
public JsonDocument Data { get; } = data;
|
||||
|
||||
public bool IsPrivate => !string.IsNullOrEmpty(ChannelName) && ChannelName.StartsWith('@');
|
||||
public bool IsBroadcast => string.IsNullOrEmpty(ChannelName);
|
||||
|
||||
public string SenderLegacyName => string.IsNullOrWhiteSpace(SenderNickName) ? SenderName : $"~{SenderNickName}";
|
||||
}
|
||||
|
|
|
@ -1,10 +0,0 @@
|
|||
namespace SharpChat.Messages;
|
||||
|
||||
[Flags]
|
||||
public enum MessageFlags {
|
||||
None = 0,
|
||||
Action = 1,
|
||||
Broadcast = 1 << 1,
|
||||
Log = 1 << 2,
|
||||
Private = 1 << 3,
|
||||
}
|
|
@ -11,8 +11,7 @@ public interface MessageStorage {
|
|||
int senderRank,
|
||||
string senderNick,
|
||||
UserPermissions senderPerms,
|
||||
object? data = null,
|
||||
MessageFlags flags = MessageFlags.None
|
||||
object? data = null
|
||||
);
|
||||
Task DeleteMessage(Message evt);
|
||||
Task<Message?> GetMessage(long msgId);
|
||||
|
|
|
@ -15,8 +15,7 @@ public class VirtualMessageStorage : MessageStorage {
|
|||
int senderRank,
|
||||
string senderNick,
|
||||
UserPermissions senderPerms,
|
||||
object? data = null,
|
||||
MessageFlags flags = MessageFlags.None
|
||||
object? data = null
|
||||
) {
|
||||
Messages.Add(
|
||||
id,
|
||||
|
@ -32,8 +31,7 @@ public class VirtualMessageStorage : MessageStorage {
|
|||
DateTimeOffset.Now,
|
||||
null,
|
||||
channelName,
|
||||
JsonDocument.Parse(data == null ? "{}" : JsonSerializer.Serialize(data)),
|
||||
flags
|
||||
JsonDocument.Parse(data == null ? "{}" : JsonSerializer.Serialize(data))
|
||||
)
|
||||
);
|
||||
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue