Switched to file namespace declarations.

This commit is contained in:
flash 2025-04-26 23:15:54 +00:00
parent 6593929827
commit 34e4e9b1a9
Signed by: flash
GPG key ID: 2C9C2C574D47FE3E
93 changed files with 3470 additions and 3471 deletions
.editorconfig
SharpChat.Flashii
SharpChat.SockChat
SharpChat
SharpChatCommon

View file

@ -15,7 +15,7 @@ csharp_indent_labels = one_less_than_current
csharp_using_directive_placement = outside_namespace:silent csharp_using_directive_placement = outside_namespace:silent
csharp_prefer_simple_using_statement = true:suggestion csharp_prefer_simple_using_statement = true:suggestion
csharp_prefer_braces = true:silent csharp_prefer_braces = true:silent
csharp_style_namespace_declarations = block_scoped:silent csharp_style_namespace_declarations = file_scoped:silent
csharp_style_prefer_method_group_conversion = true:silent csharp_style_prefer_method_group_conversion = true:silent
csharp_style_prefer_top_level_statements = true:silent csharp_style_prefer_top_level_statements = true:silent
csharp_style_prefer_primary_constructors = true:suggestion csharp_style_prefer_primary_constructors = true:suggestion

View file

@ -1,7 +1,8 @@
using SharpChat.Auth; using SharpChat.Auth;
using System.Text.Json.Serialization; using System.Text.Json.Serialization;
namespace SharpChat.Flashii { namespace SharpChat.Flashii;
public class FlashiiAuthResult : AuthResult { public class FlashiiAuthResult : AuthResult {
public string UserId => UserIdRaw.ToString(); public string UserId => UserIdRaw.ToString();
public string UserName => UserNameRaw ?? string.Empty; public string UserName => UserNameRaw ?? string.Empty;
@ -28,4 +29,3 @@ namespace SharpChat.Flashii {
[JsonPropertyName("perms")] [JsonPropertyName("perms")]
public UserPermissions UserPermissions { get; init; } public UserPermissions UserPermissions { get; init; }
} }
}

View file

@ -1,6 +1,7 @@
using SharpChat.Bans; using SharpChat.Bans;
namespace SharpChat.Flashii;
namespace SharpChat.Flashii {
public abstract class FlashiiBanInfo( public abstract class FlashiiBanInfo(
BanKind kind, BanKind kind,
FlashiiRawBanInfo rawBanInfo FlashiiRawBanInfo rawBanInfo
@ -10,4 +11,3 @@ namespace SharpChat.Flashii {
public DateTimeOffset ExpiresAt { get; } = rawBanInfo.ExpiresAt; public DateTimeOffset ExpiresAt { get; } = rawBanInfo.ExpiresAt;
public abstract override string ToString(); public abstract override string ToString();
} }
}

View file

@ -6,7 +6,8 @@ using System.Security.Cryptography;
using System.Text; using System.Text;
using System.Text.Json; using System.Text.Json;
namespace SharpChat.Flashii { namespace SharpChat.Flashii;
public class FlashiiClient(HttpClient httpClient, Config config) : AuthClient, BansClient { public class FlashiiClient(HttpClient httpClient, Config config) : AuthClient, BansClient {
private const string DEFAULT_BASE_URL = "https://flashii.net/_sockchat"; private const string DEFAULT_BASE_URL = "https://flashii.net/_sockchat";
private readonly CachedValue<string> BaseURL = config.ReadCached("url", DEFAULT_BASE_URL); private readonly CachedValue<string> BaseURL = config.ReadCached("url", DEFAULT_BASE_URL);
@ -237,4 +238,3 @@ namespace SharpChat.Flashii {
})]; })];
} }
} }
}

View file

@ -1,9 +1,9 @@
using SharpChat.Bans; using SharpChat.Bans;
using System.Net; using System.Net;
namespace SharpChat.Flashii { namespace SharpChat.Flashii;
public class FlashiiIPAddressBanInfo(FlashiiRawBanInfo rawBanInfo) : FlashiiBanInfo(BanKind.IPAddress, rawBanInfo), IPAddressBanInfo { public class FlashiiIPAddressBanInfo(FlashiiRawBanInfo rawBanInfo) : FlashiiBanInfo(BanKind.IPAddress, rawBanInfo), IPAddressBanInfo {
public IPAddress Address { get; } = IPAddress.TryParse(rawBanInfo.RemoteAddress, out IPAddress? addr) && addr is not null ? addr : IPAddress.IPv6None; public IPAddress Address { get; } = IPAddress.TryParse(rawBanInfo.RemoteAddress, out IPAddress? addr) && addr is not null ? addr : IPAddress.IPv6None;
public override string ToString() => Address.ToString(); public override string ToString() => Address.ToString();
} }
}

View file

@ -1,6 +1,7 @@
using System.Text.Json.Serialization; using System.Text.Json.Serialization;
namespace SharpChat.Flashii;
namespace SharpChat.Flashii {
public class FlashiiRawBanInfo { public class FlashiiRawBanInfo {
[JsonPropertyName("is_ban")] [JsonPropertyName("is_ban")]
public bool IsBanned { get; set; } public bool IsBanned { get; set; }
@ -26,4 +27,3 @@ namespace SharpChat.Flashii {
public bool HasExpired => !IsPermanent && DateTimeOffset.UtcNow >= ExpiresAt; public bool HasExpired => !IsPermanent && DateTimeOffset.UtcNow >= ExpiresAt;
} }
}

View file

@ -1,10 +1,10 @@
using SharpChat.Bans; using SharpChat.Bans;
namespace SharpChat.Flashii;
namespace SharpChat.Flashii {
public class FlashiiUserBanInfo(FlashiiRawBanInfo rawBanInfo) : FlashiiBanInfo(BanKind.User, rawBanInfo), UserBanInfo { public class FlashiiUserBanInfo(FlashiiRawBanInfo rawBanInfo) : FlashiiBanInfo(BanKind.User, rawBanInfo), UserBanInfo {
public string UserId { get; } = rawBanInfo.UserId ?? string.Empty; public string UserId { get; } = rawBanInfo.UserId ?? string.Empty;
public string UserName { get; } = rawBanInfo.UserName ?? $"({rawBanInfo.UserId ?? string.Empty})"; public string UserName { get; } = rawBanInfo.UserName ?? $"({rawBanInfo.UserId ?? string.Empty})";
public ColourInheritable UserColour { get; } = ColourInheritable.FromMisuzu(rawBanInfo.UserColourRaw); public ColourInheritable UserColour { get; } = ColourInheritable.FromMisuzu(rawBanInfo.UserColourRaw);
public override string ToString() => UserName; public override string ToString() => UserName;
} }
}

View file

@ -1,5 +1,5 @@
namespace SharpChat.SockChat { namespace SharpChat.SockChat;
public interface S2CPacket { public interface S2CPacket {
string Pack(); string Pack();
} }
}

View file

@ -1,6 +1,7 @@
using System.Text; using System.Text;
namespace SharpChat.SockChat.S2CPackets { namespace SharpChat.SockChat.S2CPackets;
public class AuthFailS2CPacket( public class AuthFailS2CPacket(
AuthFailS2CPacket.Reason reason, AuthFailS2CPacket.Reason reason,
DateTimeOffset? expiresAt = null DateTimeOffset? expiresAt = null
@ -40,4 +41,3 @@ namespace SharpChat.SockChat.S2CPackets {
return sb.ToString(); return sb.ToString();
} }
} }
}

View file

@ -1,6 +1,7 @@
using System.Text; using System.Text;
namespace SharpChat.SockChat.S2CPackets { namespace SharpChat.SockChat.S2CPackets;
public class AuthSuccessS2CPacket( public class AuthSuccessS2CPacket(
string userId, string userId,
string userName, string userName,
@ -37,4 +38,3 @@ namespace SharpChat.SockChat.S2CPackets {
return sb.ToString(); return sb.ToString();
} }
} }
}

View file

@ -1,7 +1,8 @@
using SharpChat.Bans; using SharpChat.Bans;
using System.Text; using System.Text;
namespace SharpChat.SockChat.S2CPackets { namespace SharpChat.SockChat.S2CPackets;
public class BanListS2CPacket( public class BanListS2CPacket(
long msgId, long msgId,
IEnumerable<BanListS2CPacket.Entry> entries IEnumerable<BanListS2CPacket.Entry> entries
@ -26,4 +27,3 @@ namespace SharpChat.SockChat.S2CPackets {
return sb.ToString(); return sb.ToString();
} }
} }
}

View file

@ -1,6 +1,7 @@
using System.Text; using System.Text;
namespace SharpChat.SockChat.S2CPackets { namespace SharpChat.SockChat.S2CPackets;
public class ChannelCreateS2CPacket( public class ChannelCreateS2CPacket(
string name, string name,
bool hasPassword, bool hasPassword,
@ -19,4 +20,3 @@ namespace SharpChat.SockChat.S2CPackets {
return sb.ToString(); return sb.ToString();
} }
} }
}

View file

@ -1,6 +1,7 @@
using System.Text; using System.Text;
namespace SharpChat.SockChat.S2CPackets { namespace SharpChat.SockChat.S2CPackets;
public class ChannelDeleteS2CPacket( public class ChannelDeleteS2CPacket(
string channelName string channelName
) : S2CPacket { ) : S2CPacket {
@ -13,4 +14,3 @@ namespace SharpChat.SockChat.S2CPackets {
return sb.ToString(); return sb.ToString();
} }
} }
}

View file

@ -1,6 +1,7 @@
using System.Text; using System.Text;
namespace SharpChat.SockChat.S2CPackets { namespace SharpChat.SockChat.S2CPackets;
public class ChannelUpdateS2CPacket( public class ChannelUpdateS2CPacket(
string previousName, string previousName,
string newName, string newName,
@ -22,4 +23,3 @@ namespace SharpChat.SockChat.S2CPackets {
return sb.ToString(); return sb.ToString();
} }
} }
}

View file

@ -1,6 +1,7 @@
using System.Text; using System.Text;
namespace SharpChat.SockChat.S2CPackets { namespace SharpChat.SockChat.S2CPackets;
public class ChatMessageAddS2CPacket( public class ChatMessageAddS2CPacket(
long msgId, long msgId,
DateTimeOffset created, DateTimeOffset created,
@ -45,4 +46,3 @@ namespace SharpChat.SockChat.S2CPackets {
return sb.ToString(); return sb.ToString();
} }
} }
}

View file

@ -1,6 +1,7 @@
using System.Text; using System.Text;
namespace SharpChat.SockChat.S2CPackets { namespace SharpChat.SockChat.S2CPackets;
public class ChatMessageDeleteS2CPacket(long eventId) : S2CPacket { public class ChatMessageDeleteS2CPacket(long eventId) : S2CPacket {
public string Pack() { public string Pack() {
StringBuilder sb = new(); StringBuilder sb = new();
@ -11,4 +12,3 @@ namespace SharpChat.SockChat.S2CPackets {
return sb.ToString(); return sb.ToString();
} }
} }
}

View file

@ -1,6 +1,7 @@
using System.Text; using System.Text;
namespace SharpChat.SockChat.S2CPackets { namespace SharpChat.SockChat.S2CPackets;
public class CommandResponseS2CPacket( public class CommandResponseS2CPacket(
long msgId, long msgId,
string stringId, string stringId,
@ -82,4 +83,3 @@ namespace SharpChat.SockChat.S2CPackets {
public const string FLOOD_WARN = "flwarn"; public const string FLOOD_WARN = "flwarn";
public const string NICKNAME_CHANGE = "nick"; public const string NICKNAME_CHANGE = "nick";
} }
}

View file

@ -1,6 +1,7 @@
using System.Text; using System.Text;
namespace SharpChat.SockChat.S2CPackets { namespace SharpChat.SockChat.S2CPackets;
public class ContextChannelsS2CPacket(IEnumerable<ContextChannelsS2CPacket.Entry> entries) : S2CPacket { public class ContextChannelsS2CPacket(IEnumerable<ContextChannelsS2CPacket.Entry> entries) : S2CPacket {
public record Entry(string name, bool hasPassword, bool isTemporary); public record Entry(string name, bool hasPassword, bool isTemporary);
@ -22,4 +23,3 @@ namespace SharpChat.SockChat.S2CPackets {
return sb.ToString(); return sb.ToString();
} }
} }
}

View file

@ -1,6 +1,7 @@
using System.Text; using System.Text;
namespace SharpChat.SockChat.S2CPackets { namespace SharpChat.SockChat.S2CPackets;
public class ContextClearS2CPacket(ContextClearS2CPacket.Mode mode) : S2CPacket { public class ContextClearS2CPacket(ContextClearS2CPacket.Mode mode) : S2CPacket {
public enum Mode { public enum Mode {
Messages = 0, Messages = 0,
@ -19,4 +20,3 @@ namespace SharpChat.SockChat.S2CPackets {
return sb.ToString(); return sb.ToString();
} }
} }
}

View file

@ -1,6 +1,7 @@
using System.Text; using System.Text;
namespace SharpChat.SockChat.S2CPackets { namespace SharpChat.SockChat.S2CPackets;
public class ContextUsersS2CPacket(IEnumerable<ContextUsersS2CPacket.Entry> entries) : S2CPacket { public class ContextUsersS2CPacket(IEnumerable<ContextUsersS2CPacket.Entry> entries) : S2CPacket {
public record Entry(string id, string name, ColourInheritable colour, int rank, UserPermissions perms, bool visible); public record Entry(string id, string name, ColourInheritable colour, int rank, UserPermissions perms, bool visible);
@ -34,4 +35,3 @@ namespace SharpChat.SockChat.S2CPackets {
return sb.ToString(); return sb.ToString();
} }
} }
}

View file

@ -1,6 +1,7 @@
using System.Text; using System.Text;
namespace SharpChat.SockChat.S2CPackets { namespace SharpChat.SockChat.S2CPackets;
public class ForceDisconnectS2CPacket(DateTimeOffset? expires = null) : S2CPacket { public class ForceDisconnectS2CPacket(DateTimeOffset? expires = null) : S2CPacket {
public string Pack() { public string Pack() {
StringBuilder sb = new(); StringBuilder sb = new();
@ -19,4 +20,3 @@ namespace SharpChat.SockChat.S2CPackets {
return sb.ToString(); return sb.ToString();
} }
} }
}

View file

@ -1,7 +1,7 @@
namespace SharpChat.SockChat.S2CPackets { namespace SharpChat.SockChat.S2CPackets;
public class PongS2CPacket : S2CPacket { public class PongS2CPacket : S2CPacket {
public string Pack() { public string Pack() {
return "0\tpong"; return "0\tpong";
} }
} }
}

View file

@ -1,6 +1,7 @@
using System.Text; using System.Text;
namespace SharpChat.SockChat.S2CPackets { namespace SharpChat.SockChat.S2CPackets;
public class UserChannelForceJoinS2CPacket(string channelName) : S2CPacket { public class UserChannelForceJoinS2CPacket(string channelName) : S2CPacket {
public string Pack() { public string Pack() {
StringBuilder sb = new(); StringBuilder sb = new();
@ -11,4 +12,3 @@ namespace SharpChat.SockChat.S2CPackets {
return sb.ToString(); return sb.ToString();
} }
} }
}

View file

@ -1,6 +1,7 @@
using System.Text; using System.Text;
namespace SharpChat.SockChat.S2CPackets { namespace SharpChat.SockChat.S2CPackets;
public class UserChannelJoinS2CPacket( public class UserChannelJoinS2CPacket(
long msgId, long msgId,
string userId, string userId,
@ -34,4 +35,3 @@ namespace SharpChat.SockChat.S2CPackets {
return sb.ToString(); return sb.ToString();
} }
} }
}

View file

@ -1,6 +1,7 @@
using System.Text; using System.Text;
namespace SharpChat.SockChat.S2CPackets { namespace SharpChat.SockChat.S2CPackets;
public class UserChannelLeaveS2CPacket(long msgId, string userId) : S2CPacket { public class UserChannelLeaveS2CPacket(long msgId, string userId) : S2CPacket {
public string Pack() { public string Pack() {
StringBuilder sb = new(); StringBuilder sb = new();
@ -13,4 +14,3 @@ namespace SharpChat.SockChat.S2CPackets {
return sb.ToString(); return sb.ToString();
} }
} }
}

View file

@ -1,6 +1,7 @@
using System.Text; using System.Text;
namespace SharpChat.SockChat.S2CPackets { namespace SharpChat.SockChat.S2CPackets;
public class UserConnectS2CPacket( public class UserConnectS2CPacket(
long msgId, long msgId,
DateTimeOffset joined, DateTimeOffset joined,
@ -37,4 +38,3 @@ namespace SharpChat.SockChat.S2CPackets {
return sb.ToString(); return sb.ToString();
} }
} }
}

View file

@ -1,6 +1,7 @@
using System.Text; using System.Text;
namespace SharpChat.SockChat.S2CPackets { namespace SharpChat.SockChat.S2CPackets;
public class UserDisconnectS2CPacket( public class UserDisconnectS2CPacket(
long msgId, long msgId,
DateTimeOffset disconnected, DateTimeOffset disconnected,
@ -48,4 +49,3 @@ namespace SharpChat.SockChat.S2CPackets {
return sb.ToString(); return sb.ToString();
} }
} }
}

View file

@ -1,6 +1,7 @@
using System.Text; using System.Text;
namespace SharpChat.SockChat.S2CPackets { namespace SharpChat.SockChat.S2CPackets;
public class UserUpdateS2CPacket( public class UserUpdateS2CPacket(
string userId, string userId,
string userName, string userName,
@ -31,4 +32,3 @@ namespace SharpChat.SockChat.S2CPackets {
return sb.ToString(); return sb.ToString();
} }
} }
}

View file

@ -1,6 +1,6 @@
namespace SharpChat { namespace SharpChat;
public interface C2SPacketHandler { public interface C2SPacketHandler {
bool IsMatch(C2SPacketHandlerContext ctx); bool IsMatch(C2SPacketHandlerContext ctx);
Task Handle(C2SPacketHandlerContext ctx); Task Handle(C2SPacketHandlerContext ctx);
} }
}

View file

@ -1,4 +1,5 @@
namespace SharpChat { namespace SharpChat;
public class C2SPacketHandlerContext( public class C2SPacketHandlerContext(
string text, string text,
Context chat, Context chat,
@ -16,4 +17,3 @@
return Text.Split('\t', expect + 1); return Text.Split('\t', expect + 1);
} }
} }
}

View file

@ -3,7 +3,8 @@ using SharpChat.Bans;
using SharpChat.Configuration; using SharpChat.Configuration;
using SharpChat.SockChat.S2CPackets; using SharpChat.SockChat.S2CPackets;
namespace SharpChat.C2SPacketHandlers { namespace SharpChat.C2SPacketHandlers;
public class AuthC2SPacketHandler( public class AuthC2SPacketHandler(
AuthClient authClient, AuthClient authClient,
BansClient bansClient, BansClient bansClient,
@ -109,4 +110,3 @@ namespace SharpChat.C2SPacketHandlers {
} }
} }
} }
}

View file

@ -2,7 +2,8 @@ using SharpChat.Auth;
using SharpChat.SockChat.S2CPackets; using SharpChat.SockChat.S2CPackets;
using System.Net; using System.Net;
namespace SharpChat.C2SPacketHandlers { namespace SharpChat.C2SPacketHandlers;
public class PingC2SPacketHandler(AuthClient authClient) : C2SPacketHandler { public class PingC2SPacketHandler(AuthClient authClient) : C2SPacketHandler {
private readonly TimeSpan BumpInterval = TimeSpan.FromMinutes(1); private readonly TimeSpan BumpInterval = TimeSpan.FromMinutes(1);
private DateTimeOffset LastBump = DateTimeOffset.MinValue; private DateTimeOffset LastBump = DateTimeOffset.MinValue;
@ -37,4 +38,3 @@ namespace SharpChat.C2SPacketHandlers {
} }
} }
} }
}

View file

@ -4,7 +4,8 @@ using SharpChat.Snowflake;
using System.Globalization; using System.Globalization;
using System.Text; using System.Text;
namespace SharpChat.C2SPacketHandlers { namespace SharpChat.C2SPacketHandlers;
public class SendMessageC2SPacketHandler( public class SendMessageC2SPacketHandler(
RandomSnowflake randomSnowflake, RandomSnowflake randomSnowflake,
CachedValue<int> maxMsgLength CachedValue<int> maxMsgLength
@ -86,4 +87,3 @@ namespace SharpChat.C2SPacketHandlers {
} }
} }
} }
}

View file

@ -1,4 +1,5 @@
namespace SharpChat { namespace SharpChat;
public class Channel( public class Channel(
string name, string name,
string password = "", string password = "",
@ -37,4 +38,3 @@ namespace SharpChat {
return char.IsLetter(c) || char.IsNumber(c) || c == '-' || c == '_'; return char.IsLetter(c) || char.IsNumber(c) || c == '-' || c == '_';
} }
} }
}

View file

@ -1,6 +1,6 @@
namespace SharpChat { namespace SharpChat;
public interface ClientCommand { public interface ClientCommand {
bool IsMatch(ClientCommandContext ctx); bool IsMatch(ClientCommandContext ctx);
Task Dispatch(ClientCommandContext ctx); Task Dispatch(ClientCommandContext ctx);
} }
}

View file

@ -1,4 +1,5 @@
namespace SharpChat { namespace SharpChat;
public class ClientCommandContext { public class ClientCommandContext {
public string Name { get; } public string Name { get; }
public string[] Args { get; } public string[] Args { get; }
@ -46,4 +47,3 @@
return Name.Equals(name, StringComparison.InvariantCultureIgnoreCase); return Name.Equals(name, StringComparison.InvariantCultureIgnoreCase);
} }
} }
}

View file

@ -1,7 +1,8 @@
using System.Globalization; using System.Globalization;
using System.Text; using System.Text;
namespace SharpChat.ClientCommands { namespace SharpChat.ClientCommands;
public class AFKClientCommand : ClientCommand { public class AFKClientCommand : ClientCommand {
private const string DEFAULT = "AFK"; private const string DEFAULT = "AFK";
public const int MAX_GRAPHEMES = 5; public const int MAX_GRAPHEMES = 5;
@ -31,4 +32,3 @@ namespace SharpChat.ClientCommands {
); );
} }
} }
}

View file

@ -1,6 +1,7 @@
using SharpChat.Events; using SharpChat.Events;
namespace SharpChat.ClientCommands { namespace SharpChat.ClientCommands;
public class ActionClientCommand : ClientCommand { public class ActionClientCommand : ClientCommand {
public bool IsMatch(ClientCommandContext ctx) { public bool IsMatch(ClientCommandContext ctx) {
return ctx.NameEquals("action") return ctx.NameEquals("action")
@ -30,4 +31,3 @@ namespace SharpChat.ClientCommands {
)); ));
} }
} }
}

View file

@ -1,7 +1,8 @@
using SharpChat.Bans; using SharpChat.Bans;
using SharpChat.SockChat.S2CPackets; using SharpChat.SockChat.S2CPackets;
namespace SharpChat.ClientCommands { namespace SharpChat.ClientCommands;
public class BanListClientCommand(BansClient bansClient) : ClientCommand { public class BanListClientCommand(BansClient bansClient) : ClientCommand {
public bool IsMatch(ClientCommandContext ctx) { public bool IsMatch(ClientCommandContext ctx) {
return ctx.NameEquals("bans") return ctx.NameEquals("bans")
@ -27,4 +28,3 @@ namespace SharpChat.ClientCommands {
} }
} }
} }
}

View file

@ -1,7 +1,8 @@
using SharpChat.Events; using SharpChat.Events;
using SharpChat.SockChat.S2CPackets; using SharpChat.SockChat.S2CPackets;
namespace SharpChat.ClientCommands { namespace SharpChat.ClientCommands;
public class BroadcastClientCommand : ClientCommand { public class BroadcastClientCommand : ClientCommand {
public bool IsMatch(ClientCommandContext ctx) { public bool IsMatch(ClientCommandContext ctx) {
return ctx.NameEquals("say") return ctx.NameEquals("say")
@ -31,4 +32,3 @@ namespace SharpChat.ClientCommands {
)); ));
} }
} }
}

View file

@ -1,6 +1,7 @@
using SharpChat.SockChat.S2CPackets; using SharpChat.SockChat.S2CPackets;
namespace SharpChat.ClientCommands { namespace SharpChat.ClientCommands;
public class CreateChannelClientCommand : ClientCommand { public class CreateChannelClientCommand : ClientCommand {
public bool IsMatch(ClientCommandContext ctx) { public bool IsMatch(ClientCommandContext ctx) {
return ctx.NameEquals("create"); return ctx.NameEquals("create");
@ -59,4 +60,3 @@ namespace SharpChat.ClientCommands {
await ctx.Chat.SendTo(ctx.User, new CommandResponseS2CPacket(msgId, LCR.CHANNEL_CREATED, false, createChan.Name)); await ctx.Chat.SendTo(ctx.User, new CommandResponseS2CPacket(msgId, LCR.CHANNEL_CREATED, false, createChan.Name));
} }
} }
}

View file

@ -1,6 +1,7 @@
using SharpChat.SockChat.S2CPackets; using SharpChat.SockChat.S2CPackets;
namespace SharpChat.ClientCommands { namespace SharpChat.ClientCommands;
public class DeleteChannelClientCommand : ClientCommand { public class DeleteChannelClientCommand : ClientCommand {
public bool IsMatch(ClientCommandContext ctx) { public bool IsMatch(ClientCommandContext ctx) {
return ctx.NameEquals("delchan") || ( return ctx.NameEquals("delchan") || (
@ -34,4 +35,3 @@ namespace SharpChat.ClientCommands {
await ctx.Chat.SendTo(ctx.User, new CommandResponseS2CPacket(msgId, LCR.CHANNEL_DELETED, false, delChan.Name)); await ctx.Chat.SendTo(ctx.User, new CommandResponseS2CPacket(msgId, LCR.CHANNEL_DELETED, false, delChan.Name));
} }
} }
}

View file

@ -1,8 +1,8 @@
using SharpChat.EventStorage; using SharpChat.EventStorage;
using SharpChat.SockChat.S2CPackets; using SharpChat.SockChat.S2CPackets;
namespace SharpChat.ClientCommands namespace SharpChat.ClientCommands;
{
public class DeleteMessageClientCommand : ClientCommand { public class DeleteMessageClientCommand : ClientCommand {
public bool IsMatch(ClientCommandContext ctx) { public bool IsMatch(ClientCommandContext ctx) {
return ctx.NameEquals("delmsg") || ( return ctx.NameEquals("delmsg") || (
@ -38,4 +38,3 @@ namespace SharpChat.ClientCommands
await ctx.Chat.Send(new ChatMessageDeleteS2CPacket(delMsg.Id)); await ctx.Chat.Send(new ChatMessageDeleteS2CPacket(delMsg.Id));
} }
} }
}

View file

@ -1,6 +1,7 @@
using SharpChat.SockChat.S2CPackets; using SharpChat.SockChat.S2CPackets;
namespace SharpChat.ClientCommands { namespace SharpChat.ClientCommands;
public class JoinChannelClientCommand : ClientCommand { public class JoinChannelClientCommand : ClientCommand {
public bool IsMatch(ClientCommandContext ctx) { public bool IsMatch(ClientCommandContext ctx) {
return ctx.NameEquals("join"); return ctx.NameEquals("join");
@ -20,4 +21,3 @@ namespace SharpChat.ClientCommands {
await ctx.Chat.SwitchChannel(ctx.User, joinChan, string.Join(' ', ctx.Args.Skip(1))); await ctx.Chat.SwitchChannel(ctx.User, joinChan, string.Join(' ', ctx.Args.Skip(1)));
} }
} }
}

View file

@ -2,7 +2,8 @@ using SharpChat.Bans;
using SharpChat.SockChat.S2CPackets; using SharpChat.SockChat.S2CPackets;
using System.Net; using System.Net;
namespace SharpChat.ClientCommands { namespace SharpChat.ClientCommands;
public class KickBanClientCommand(BansClient bansClient) : ClientCommand { public class KickBanClientCommand(BansClient bansClient) : ClientCommand {
public bool IsMatch(ClientCommandContext ctx) { public bool IsMatch(ClientCommandContext ctx) {
return ctx.NameEquals("kick") return ctx.NameEquals("kick")
@ -70,4 +71,3 @@ namespace SharpChat.ClientCommands {
await ctx.Chat.BanUser(banUser, duration); await ctx.Chat.BanUser(banUser, duration);
} }
} }
}

View file

@ -2,7 +2,8 @@ using SharpChat.SockChat.S2CPackets;
using System.Globalization; using System.Globalization;
using System.Text; using System.Text;
namespace SharpChat.ClientCommands { namespace SharpChat.ClientCommands;
public class NickClientCommand : ClientCommand { public class NickClientCommand : ClientCommand {
private const int MAX_GRAPHEMES = 16; private const int MAX_GRAPHEMES = 16;
private const int MAX_BYTES = MAX_GRAPHEMES * 10; private const int MAX_BYTES = MAX_GRAPHEMES * 10;
@ -60,4 +61,3 @@ namespace SharpChat.ClientCommands {
await ctx.Chat.UpdateUser(targetUser, nickName: nickStr, silent: previousName == null); await ctx.Chat.UpdateUser(targetUser, nickName: nickStr, silent: previousName == null);
} }
} }
}

View file

@ -2,7 +2,8 @@ using SharpChat.Bans;
using SharpChat.SockChat.S2CPackets; using SharpChat.SockChat.S2CPackets;
using System.Net; using System.Net;
namespace SharpChat.ClientCommands { namespace SharpChat.ClientCommands;
public class PardonAddressClientCommand(BansClient bansClient) : ClientCommand { public class PardonAddressClientCommand(BansClient bansClient) : ClientCommand {
public bool IsMatch(ClientCommandContext ctx) { public bool IsMatch(ClientCommandContext ctx) {
return ctx.NameEquals("pardonip") return ctx.NameEquals("pardonip")
@ -37,4 +38,3 @@ namespace SharpChat.ClientCommands {
await ctx.Chat.SendTo(ctx.User, new CommandResponseS2CPacket(msgId, LCR.USER_NOT_BANNED, true, unbanAddrTarget)); await ctx.Chat.SendTo(ctx.User, new CommandResponseS2CPacket(msgId, LCR.USER_NOT_BANNED, true, unbanAddrTarget));
} }
} }
}

View file

@ -1,7 +1,8 @@
using SharpChat.Bans; using SharpChat.Bans;
using SharpChat.SockChat.S2CPackets; using SharpChat.SockChat.S2CPackets;
namespace SharpChat.ClientCommands { namespace SharpChat.ClientCommands;
public class PardonUserClientCommand(BansClient bansClient) : ClientCommand { public class PardonUserClientCommand(BansClient bansClient) : ClientCommand {
public bool IsMatch(ClientCommandContext ctx) { public bool IsMatch(ClientCommandContext ctx) {
return ctx.NameEquals("pardon") return ctx.NameEquals("pardon")
@ -43,4 +44,3 @@ namespace SharpChat.ClientCommands {
await ctx.Chat.SendTo(ctx.User, new CommandResponseS2CPacket(msgId, LCR.USER_NOT_BANNED, true, unbanUserDisplay)); await ctx.Chat.SendTo(ctx.User, new CommandResponseS2CPacket(msgId, LCR.USER_NOT_BANNED, true, unbanUserDisplay));
} }
} }
}

View file

@ -1,6 +1,7 @@
using SharpChat.SockChat.S2CPackets; using SharpChat.SockChat.S2CPackets;
namespace SharpChat.ClientCommands { namespace SharpChat.ClientCommands;
public class PasswordChannelClientCommand : ClientCommand { public class PasswordChannelClientCommand : ClientCommand {
public bool IsMatch(ClientCommandContext ctx) { public bool IsMatch(ClientCommandContext ctx) {
return ctx.NameEquals("pwd") return ctx.NameEquals("pwd")
@ -24,4 +25,3 @@ namespace SharpChat.ClientCommands {
await ctx.Chat.SendTo(ctx.User, new CommandResponseS2CPacket(msgId, LCR.CHANNEL_PASSWORD_CHANGED, false)); await ctx.Chat.SendTo(ctx.User, new CommandResponseS2CPacket(msgId, LCR.CHANNEL_PASSWORD_CHANGED, false));
} }
} }
}

View file

@ -1,6 +1,7 @@
using SharpChat.SockChat.S2CPackets; using SharpChat.SockChat.S2CPackets;
namespace SharpChat.ClientCommands { namespace SharpChat.ClientCommands;
public class RankChannelClientCommand : ClientCommand { public class RankChannelClientCommand : ClientCommand {
public bool IsMatch(ClientCommandContext ctx) { public bool IsMatch(ClientCommandContext ctx) {
return ctx.NameEquals("rank") return ctx.NameEquals("rank")
@ -25,4 +26,3 @@ namespace SharpChat.ClientCommands {
await ctx.Chat.SendTo(ctx.User, new CommandResponseS2CPacket(msgId, LCR.CHANNEL_HIERARCHY_CHANGED, false)); await ctx.Chat.SendTo(ctx.User, new CommandResponseS2CPacket(msgId, LCR.CHANNEL_HIERARCHY_CHANGED, false));
} }
} }
}

View file

@ -1,7 +1,8 @@
using SharpChat.SockChat.S2CPackets; using SharpChat.SockChat.S2CPackets;
using System.Net; using System.Net;
namespace SharpChat.ClientCommands { namespace SharpChat.ClientCommands;
public class RemoteAddressClientCommand : ClientCommand { public class RemoteAddressClientCommand : ClientCommand {
public bool IsMatch(ClientCommandContext ctx) { public bool IsMatch(ClientCommandContext ctx) {
return ctx.NameEquals("ip") return ctx.NameEquals("ip")
@ -28,4 +29,3 @@ namespace SharpChat.ClientCommands {
await ctx.Chat.SendTo(ctx.User, new CommandResponseS2CPacket(msgId, LCR.IP_ADDRESS, false, ipUser.UserName, ip)); await ctx.Chat.SendTo(ctx.User, new CommandResponseS2CPacket(msgId, LCR.IP_ADDRESS, false, ipUser.UserName, ip));
} }
} }
}

View file

@ -1,6 +1,7 @@
using SharpChat.SockChat.S2CPackets; using SharpChat.SockChat.S2CPackets;
namespace SharpChat.ClientCommands { namespace SharpChat.ClientCommands;
public class ShutdownRestartClientCommand(ManualResetEvent waitHandle, Func<bool> shutdownCheck) : ClientCommand { public class ShutdownRestartClientCommand(ManualResetEvent waitHandle, Func<bool> shutdownCheck) : ClientCommand {
private readonly ManualResetEvent WaitHandle = waitHandle ?? throw new ArgumentNullException(nameof(waitHandle)); private readonly ManualResetEvent WaitHandle = waitHandle ?? throw new ArgumentNullException(nameof(waitHandle));
private readonly Func<bool> ShutdownCheck = shutdownCheck ?? throw new ArgumentNullException(nameof(shutdownCheck)); private readonly Func<bool> ShutdownCheck = shutdownCheck ?? throw new ArgumentNullException(nameof(shutdownCheck));
@ -28,4 +29,3 @@ namespace SharpChat.ClientCommands {
WaitHandle?.Set(); WaitHandle?.Set();
} }
} }
}

View file

@ -1,7 +1,8 @@
using SharpChat.Events; using SharpChat.Events;
using SharpChat.SockChat.S2CPackets; using SharpChat.SockChat.S2CPackets;
namespace SharpChat.ClientCommands { namespace SharpChat.ClientCommands;
public class WhisperClientCommand : ClientCommand { public class WhisperClientCommand : ClientCommand {
public bool IsMatch(ClientCommandContext ctx) { public bool IsMatch(ClientCommandContext ctx) {
return ctx.NameEquals("whisper") return ctx.NameEquals("whisper")
@ -42,4 +43,3 @@ namespace SharpChat.ClientCommands {
)); ));
} }
} }
}

View file

@ -1,7 +1,8 @@
using SharpChat.SockChat.S2CPackets; using SharpChat.SockChat.S2CPackets;
using System.Text; using System.Text;
namespace SharpChat.ClientCommands { namespace SharpChat.ClientCommands;
public class WhoClientCommand : ClientCommand { public class WhoClientCommand : ClientCommand {
public bool IsMatch(ClientCommandContext ctx) { public bool IsMatch(ClientCommandContext ctx) {
return ctx.NameEquals("who"); return ctx.NameEquals("who");
@ -59,4 +60,3 @@ namespace SharpChat.ClientCommands {
} }
} }
} }
}

View file

@ -2,7 +2,8 @@ using Fleck;
using SharpChat.SockChat; using SharpChat.SockChat;
using System.Net; using System.Net;
namespace SharpChat { namespace SharpChat;
public class Connection : IDisposable { public class Connection : IDisposable {
public const int ID_LENGTH = 20; public const int ID_LENGTH = 20;
@ -87,4 +88,3 @@ namespace SharpChat {
return Id.GetHashCode(); return Id.GetHashCode();
} }
} }
}

View file

@ -5,7 +5,8 @@ using SharpChat.SockChat;
using SharpChat.SockChat.S2CPackets; using SharpChat.SockChat.S2CPackets;
using System.Net; using System.Net;
namespace SharpChat { namespace SharpChat;
public class Context { public class Context {
public record ChannelUserAssoc(string UserId, string ChannelName); public record ChannelUserAssoc(string UserId, string ChannelName);
@ -410,4 +411,3 @@ namespace SharpChat {
await SendTo(user, new ChannelDeleteS2CPacket(channel.Name)); await SendTo(user, new ChannelDeleteS2CPacket(channel.Name));
} }
} }
}

View file

@ -1,4 +1,5 @@
namespace SharpChat.EventStorage { namespace SharpChat.EventStorage;
public interface EventStorage { public interface EventStorage {
void AddEvent( void AddEvent(
long id, long id,
@ -17,4 +18,3 @@ namespace SharpChat.EventStorage {
StoredEventInfo? GetEvent(long seqId); StoredEventInfo? GetEvent(long seqId);
IEnumerable<StoredEventInfo> GetChannelEventLog(string channelName, int amount = 20, int offset = 0); IEnumerable<StoredEventInfo> GetChannelEventLog(string channelName, int amount = 20, int offset = 0);
} }
}

View file

@ -2,7 +2,8 @@ using MySqlConnector;
using System.Text; using System.Text;
using System.Text.Json; using System.Text.Json;
namespace SharpChat.EventStorage { namespace SharpChat.EventStorage;
public partial class MariaDBEventStorage(string connString) : EventStorage { public partial class MariaDBEventStorage(string connString) : EventStorage {
private string ConnectionString { get; } = connString ?? throw new ArgumentNullException(nameof(connString)); private string ConnectionString { get; } = connString ?? throw new ArgumentNullException(nameof(connString));
@ -128,4 +129,3 @@ namespace SharpChat.EventStorage {
); );
} }
} }
}

View file

@ -1,7 +1,8 @@
using MySqlConnector; using MySqlConnector;
using SharpChat.Configuration; using SharpChat.Configuration;
namespace SharpChat.EventStorage { namespace SharpChat.EventStorage;
public partial class MariaDBEventStorage { public partial class MariaDBEventStorage {
public static string BuildConnString(Configuration.Config config) { public static string BuildConnString(Configuration.Config config) {
return BuildConnString( return BuildConnString(
@ -84,4 +85,3 @@ namespace SharpChat.EventStorage {
return default; return default;
} }
} }
}

View file

@ -1,6 +1,7 @@
using MySqlConnector; using MySqlConnector;
namespace SharpChat.EventStorage { namespace SharpChat.EventStorage;
public partial class MariaDBEventStorage { public partial class MariaDBEventStorage {
private void DoMigration(string name, Action action) { private void DoMigration(string name, Action action) {
bool done = RunQueryValue<long>( bool done = RunQueryValue<long>(
@ -81,4 +82,3 @@ namespace SharpChat.EventStorage {
); );
} }
} }
}

View file

@ -1,4 +1,5 @@
namespace SharpChat.EventStorage { namespace SharpChat.EventStorage;
[Flags] [Flags]
public enum StoredEventFlags { public enum StoredEventFlags {
None = 0, None = 0,
@ -7,4 +8,3 @@
Log = 1 << 2, Log = 1 << 2,
Private = 1 << 3, Private = 1 << 3,
} }
}

View file

@ -1,6 +1,7 @@
using System.Text.Json; using System.Text.Json;
namespace SharpChat.EventStorage { namespace SharpChat.EventStorage;
public class StoredEventInfo( public class StoredEventInfo(
long id, long id,
string type, string type,
@ -20,4 +21,3 @@ namespace SharpChat.EventStorage {
public StoredEventFlags Flags { get; set; } = flags; public StoredEventFlags Flags { get; set; } = flags;
public JsonDocument Data { get; set; } = data; public JsonDocument Data { get; set; } = data;
} }
}

View file

@ -1,6 +1,7 @@
using System.Text.Json; using System.Text.Json;
namespace SharpChat.EventStorage { namespace SharpChat.EventStorage;
public class VirtualEventStorage : EventStorage { public class VirtualEventStorage : EventStorage {
private readonly Dictionary<long, StoredEventInfo> Events = []; private readonly Dictionary<long, StoredEventInfo> Events = [];
@ -62,4 +63,3 @@ namespace SharpChat.EventStorage {
return [.. subset.Skip(start).Take(amount)]; return [.. subset.Skip(start).Take(amount)];
} }
} }
}

View file

@ -1,3 +1,3 @@
namespace SharpChat.Events { namespace SharpChat.Events;
public interface ChatEvent {} public interface ChatEvent {}
}

View file

@ -1,4 +1,5 @@
namespace SharpChat.Events { namespace SharpChat.Events;
public class MessageCreateEvent( public class MessageCreateEvent(
long msgId, long msgId,
string channelName, string channelName,
@ -28,4 +29,3 @@ namespace SharpChat.Events {
public bool IsAction { get; } = isAction; public bool IsAction { get; } = isAction;
public bool IsBroadcast { get; } = isBroadcast; public bool IsBroadcast { get; } = isBroadcast;
} }
}

View file

@ -3,7 +3,8 @@ using SharpChat.EventStorage;
using SharpChat.Flashii; using SharpChat.Flashii;
using System.Text; using System.Text;
namespace SharpChat { namespace SharpChat;
public class Program { public class Program {
public const string CONFIG = "sharpchat.cfg"; public const string CONFIG = "sharpchat.cfg";
@ -144,4 +145,3 @@ namespace SharpChat {
sw.Flush(); sw.Flush();
} }
} }
}

View file

@ -12,7 +12,8 @@ using System.Text;
// Fleck's Socket wrapper doesn't provide any way to do this with the normally provided APIs // Fleck's Socket wrapper doesn't provide any way to do this with the normally provided APIs
// https://github.com/statianzo/Fleck/blob/1.1.0/src/Fleck/WebSocketServer.cs // https://github.com/statianzo/Fleck/blob/1.1.0/src/Fleck/WebSocketServer.cs
namespace SharpChat { namespace SharpChat;
public class SharpChatWebSocketServer : IWebSocketServer { public class SharpChatWebSocketServer : IWebSocketServer {
private readonly string _scheme; private readonly string _scheme;
@ -164,4 +165,3 @@ namespace SharpChat {
} }
} }
} }
}

View file

@ -1,7 +1,8 @@
using SharpChat.EventStorage; using SharpChat.EventStorage;
using System.Text; using System.Text;
namespace SharpChat.SockChat.S2CPackets { namespace SharpChat.SockChat.S2CPackets;
public class ContextMessageS2CPacket(StoredEventInfo evt, bool notify = false) : S2CPacket { public class ContextMessageS2CPacket(StoredEventInfo evt, bool notify = false) : S2CPacket {
public StoredEventInfo Event { get; private set; } = evt ?? throw new ArgumentNullException(nameof(evt)); public StoredEventInfo Event { get; private set; } = evt ?? throw new ArgumentNullException(nameof(evt));
@ -112,4 +113,3 @@ namespace SharpChat.SockChat.S2CPackets {
return sb.ToString(); return sb.ToString();
} }
} }
}

View file

@ -7,7 +7,8 @@ using SharpChat.Configuration;
using SharpChat.SockChat.S2CPackets; using SharpChat.SockChat.S2CPackets;
using System.Net; using System.Net;
namespace SharpChat { namespace SharpChat;
public class SockChatServer : IDisposable { public class SockChatServer : IDisposable {
public const ushort DEFAULT_PORT = 6770; public const ushort DEFAULT_PORT = 6770;
public const int DEFAULT_MSG_LENGTH_MAX = 5000; public const int DEFAULT_MSG_LENGTH_MAX = 5000;
@ -237,4 +238,3 @@ namespace SharpChat {
Server?.Dispose(); Server?.Dispose();
} }
} }
}

View file

@ -2,7 +2,8 @@ using SharpChat.ClientCommands;
using System.Globalization; using System.Globalization;
using System.Text; using System.Text;
namespace SharpChat { namespace SharpChat;
public class User( public class User(
string userId, string userId,
string userName, string userName,
@ -70,4 +71,3 @@ namespace SharpChat {
: $"@{user1.UserId}-{user2.UserId}"; : $"@{user1.UserId}-{user2.UserId}";
} }
} }
}

View file

@ -1,7 +1,7 @@
namespace SharpChat { namespace SharpChat;
public enum UserStatus { public enum UserStatus {
Online, Online,
Away, Away,
Offline, Offline,
} }
}

View file

@ -1,8 +1,8 @@
using System.Net; using System.Net;
namespace SharpChat.Auth { namespace SharpChat.Auth;
public interface AuthClient { public interface AuthClient {
Task<AuthResult> AuthVerifyAsync(IPAddress remoteAddr, string scheme, string token); Task<AuthResult> AuthVerifyAsync(IPAddress remoteAddr, string scheme, string token);
Task AuthBumpUsersOnlineAsync(IEnumerable<(IPAddress remoteAddr, string userId)> entries); Task AuthBumpUsersOnlineAsync(IEnumerable<(IPAddress remoteAddr, string userId)> entries);
} }
}

View file

@ -1,3 +1,3 @@
namespace SharpChat.Auth { namespace SharpChat.Auth;
public class AuthFailedException(string message) : Exception(message) {} public class AuthFailedException(string message) : Exception(message) {}
}

View file

@ -1,4 +1,5 @@
namespace SharpChat.Auth { namespace SharpChat.Auth;
public interface AuthResult { public interface AuthResult {
string UserId { get; } string UserId { get; }
string UserName { get; } string UserName { get; }
@ -6,4 +7,3 @@ namespace SharpChat.Auth {
int UserRank { get; } int UserRank { get; }
UserPermissions UserPermissions { get; } UserPermissions UserPermissions { get; }
} }
}

View file

@ -1,4 +1,5 @@
namespace SharpChat.Bans { namespace SharpChat.Bans;
public interface BanInfo { public interface BanInfo {
BanKind Kind { get; } BanKind Kind { get; }
bool IsPermanent { get; } bool IsPermanent { get; }
@ -6,4 +7,3 @@ namespace SharpChat.Bans {
public bool HasExpired => !IsPermanent && DateTimeOffset.UtcNow >= ExpiresAt; public bool HasExpired => !IsPermanent && DateTimeOffset.UtcNow >= ExpiresAt;
string ToString(); string ToString();
} }
}

View file

@ -1,6 +1,6 @@
namespace SharpChat.Bans { namespace SharpChat.Bans;
public enum BanKind { public enum BanKind {
User, User,
IPAddress, IPAddress,
} }
}

View file

@ -1,6 +1,7 @@
using System.Net; using System.Net;
namespace SharpChat.Bans { namespace SharpChat.Bans;
public interface BansClient { public interface BansClient {
Task BanCreateAsync( Task BanCreateAsync(
BanKind kind, BanKind kind,
@ -15,4 +16,3 @@ namespace SharpChat.Bans {
Task<BanInfo?> BanGetAsync(string? userIdOrName = null, IPAddress? remoteAddr = null); Task<BanInfo?> BanGetAsync(string? userIdOrName = null, IPAddress? remoteAddr = null);
Task<BanInfo[]> BanGetListAsync(); Task<BanInfo[]> BanGetListAsync();
} }
}

View file

@ -1,7 +1,7 @@
using System.Net; using System.Net;
namespace SharpChat.Bans { namespace SharpChat.Bans;
public interface IPAddressBanInfo : BanInfo { public interface IPAddressBanInfo : BanInfo {
IPAddress Address { get; } IPAddress Address { get; }
} }
}

View file

@ -1,7 +1,7 @@
namespace SharpChat.Bans { namespace SharpChat.Bans;
public interface UserBanInfo : BanInfo { public interface UserBanInfo : BanInfo {
string UserId { get; } string UserId { get; }
string UserName { get; } string UserName { get; }
ColourInheritable UserColour { get; } ColourInheritable UserColour { get; }
} }
}

View file

@ -1,4 +1,5 @@
namespace SharpChat { namespace SharpChat;
public readonly record struct ColourInheritable(ColourRgb? rgb) { public readonly record struct ColourInheritable(ColourRgb? rgb) {
public static readonly ColourInheritable None = new(null); public static readonly ColourInheritable None = new(null);
public override string ToString() => rgb.HasValue ? rgb.Value.ToString() : "inherit"; public override string ToString() => rgb.HasValue ? rgb.Value.ToString() : "inherit";
@ -11,4 +12,3 @@ namespace SharpChat {
public int ToMisuzu() => rgb.HasValue ? rgb.Value.Raw : MSZ_INHERIT; public int ToMisuzu() => rgb.HasValue ? rgb.Value.Raw : MSZ_INHERIT;
public static ColourInheritable FromMisuzu(int msz) => (msz & MSZ_INHERIT) > 0 ? None : new(new ColourRgb(msz & 0xFFFFFF)); public static ColourInheritable FromMisuzu(int msz) => (msz & MSZ_INHERIT) > 0 ? None : new(new ColourRgb(msz & 0xFFFFFF));
} }
}

View file

@ -1,4 +1,5 @@
namespace SharpChat { namespace SharpChat;
public readonly record struct ColourRgb(int Raw) { public readonly record struct ColourRgb(int Raw) {
public byte Red => (byte)((Raw >> 16) & 0xFF); public byte Red => (byte)((Raw >> 16) & 0xFF);
public byte Green => (byte)((Raw >> 8) & 0xFF); public byte Green => (byte)((Raw >> 8) & 0xFF);
@ -6,4 +7,3 @@ namespace SharpChat {
public override string ToString() => string.Format("#{0:x2}{1:x2}{2:x2}", Red, Green, Blue); public override string ToString() => string.Format("#{0:x2}{1:x2}{2:x2}", Red, Green, Blue);
public static ColourRgb FromRgb(byte red, byte green, byte blue) => new(red << 16 | green << 8 | blue); public static ColourRgb FromRgb(byte red, byte green, byte blue) => new(red << 16 | green << 8 | blue);
} }
}

View file

@ -1,4 +1,5 @@
namespace SharpChat.Configuration { namespace SharpChat.Configuration;
public class CachedValue<T>(Config config, string name, TimeSpan lifetime, T? fallback) { public class CachedValue<T>(Config config, string name, TimeSpan lifetime, T? fallback) {
private Config Config { get; } = config ?? throw new ArgumentNullException(nameof(config)); private Config Config { get; } = config ?? throw new ArgumentNullException(nameof(config));
private string Name { get; } = name ?? throw new ArgumentNullException(nameof(name)); private string Name { get; } = name ?? throw new ArgumentNullException(nameof(name));
@ -31,4 +32,3 @@ namespace SharpChat.Configuration {
return Value?.ToString() ?? string.Empty; return Value?.ToString() ?? string.Empty;
} }
} }
}

View file

@ -1,4 +1,5 @@
namespace SharpChat.Configuration { namespace SharpChat.Configuration;
public interface Config : IDisposable { public interface Config : IDisposable {
/// <summary> /// <summary>
/// Creates a proxy object that forces all names to start with the given prefix. /// Creates a proxy object that forces all names to start with the given prefix.
@ -26,4 +27,3 @@ namespace SharpChat.Configuration {
/// </summary> /// </summary>
CachedValue<T> ReadCached<T>(string name, T? fallback = default, TimeSpan? lifetime = null); CachedValue<T> ReadCached<T>(string name, T? fallback = default, TimeSpan? lifetime = null);
} }
}

View file

@ -1,4 +1,5 @@
namespace SharpChat.Configuration { namespace SharpChat.Configuration;
public abstract class ConfigException : Exception { public abstract class ConfigException : Exception {
public ConfigException(string message) : base(message) { } public ConfigException(string message) : base(message) { }
public ConfigException(string message, Exception ex) : base(message, ex) { } public ConfigException(string message, Exception ex) : base(message, ex) { }
@ -6,4 +7,3 @@ namespace SharpChat.Configuration {
public class ConfigLockException() : ConfigException("Unable to acquire lock for reading configuration.") {} public class ConfigLockException() : ConfigException("Unable to acquire lock for reading configuration.") {}
public class ConfigTypeException(Exception ex) : ConfigException("Given type does not match the value in the configuration.", ex) {} public class ConfigTypeException(Exception ex) : ConfigException("Given type does not match the value in the configuration.", ex) {}
}

View file

@ -1,4 +1,5 @@
namespace SharpChat.Configuration { namespace SharpChat.Configuration;
public class ScopedConfig(Config config, string prefix) : Config { public class ScopedConfig(Config config, string prefix) : Config {
private Config Config { get; } = config ?? throw new ArgumentNullException(nameof(config)); private Config Config { get; } = config ?? throw new ArgumentNullException(nameof(config));
private string Prefix { get; } = prefix ?? throw new ArgumentNullException(nameof(prefix)); private string Prefix { get; } = prefix ?? throw new ArgumentNullException(nameof(prefix));
@ -31,4 +32,3 @@ namespace SharpChat.Configuration {
GC.SuppressFinalize(this); GC.SuppressFinalize(this);
} }
} }
}

View file

@ -1,6 +1,7 @@
using System.Text; using System.Text;
namespace SharpChat.Configuration { namespace SharpChat.Configuration;
public class StreamConfig : Config { public class StreamConfig : Config {
private Stream Stream { get; } private Stream Stream { get; }
private StreamReader StreamReader { get; } private StreamReader StreamReader { get; }
@ -112,4 +113,3 @@ namespace SharpChat.Configuration {
Lock.Dispose(); Lock.Dispose();
} }
} }
}

View file

@ -1,7 +1,8 @@
using System.Diagnostics; using System.Diagnostics;
using System.Text; using System.Text;
namespace SharpChat { namespace SharpChat;
public static class Logger { public static class Logger {
public static void Write(string str) { public static void Write(string str) {
Console.WriteLine(string.Format("[{1}] {0}", str, DateTime.Now)); Console.WriteLine(string.Format("[{1}] {0}", str, DateTime.Now));
@ -30,4 +31,3 @@ namespace SharpChat {
Write(obj); Write(obj);
} }
} }
}

View file

@ -1,7 +1,8 @@
using System.Buffers; using System.Buffers;
using System.Security.Cryptography; using System.Security.Cryptography;
namespace SharpChat { namespace SharpChat;
public static class RNG { public static class RNG {
public const string CHARS = "AaBbCcDdEeFfGgHhIiJjKkLlMmNnOoPpQqRrSsTtUuVvWwXxYyZz0123456789"; public const string CHARS = "AaBbCcDdEeFfGgHhIiJjKkLlMmNnOoPpQqRrSsTtUuVvWwXxYyZz0123456789";
@ -79,4 +80,3 @@ namespace SharpChat {
return RandomStringInternal(SecureNext, length); return RandomStringInternal(SecureNext, length);
} }
} }
}

View file

@ -1,4 +1,5 @@
namespace SharpChat { namespace SharpChat;
public class RateLimiter { public class RateLimiter {
private readonly int Size; private readonly int Size;
private readonly int MinimumDelay; private readonly int MinimumDelay;
@ -32,4 +33,3 @@
TimePoints[Size - 1] = DateTimeOffset.UtcNow.ToUnixTimeMilliseconds(); TimePoints[Size - 1] = DateTimeOffset.UtcNow.ToUnixTimeMilliseconds();
} }
} }
}

View file

@ -1,7 +1,8 @@
using System.Reflection; using System.Reflection;
using System.Text; using System.Text;
namespace SharpChat { namespace SharpChat;
public static class SharpInfo { public static class SharpInfo {
private const string NAME = @"SharpChat"; private const string NAME = @"SharpChat";
private const string UNKNOWN = @"XXXXXXXXXX"; private const string UNKNOWN = @"XXXXXXXXXX";
@ -33,4 +34,3 @@ namespace SharpChat {
ProgramName = sb.ToString(); ProgramName = sb.ToString();
} }
} }
}

View file

@ -1,6 +1,7 @@
using System.Security.Cryptography; using System.Security.Cryptography;
namespace SharpChat.Snowflake;
namespace SharpChat.Snowflake {
public class RandomSnowflake( public class RandomSnowflake(
SnowflakeGenerator? generator = null SnowflakeGenerator? generator = null
) { ) {
@ -10,4 +11,3 @@ namespace SharpChat.Snowflake {
return Generator.Next(Math.Abs(BitConverter.ToInt64(RandomNumberGenerator.GetBytes(8))), at); return Generator.Next(Math.Abs(BitConverter.ToInt64(RandomNumberGenerator.GetBytes(8))), at);
} }
} }
}

View file

@ -1,4 +1,5 @@
namespace SharpChat.Snowflake { namespace SharpChat.Snowflake;
public class SnowflakeGenerator { public class SnowflakeGenerator {
public const long MASK = 0x7FFFFFFFFFFFFFFF; public const long MASK = 0x7FFFFFFFFFFFFFFF;
// previous default epoch was 1588377600000, but snowflakes are much larger than SharpIds // previous default epoch was 1588377600000, but snowflakes are much larger than SharpIds
@ -32,4 +33,3 @@
return ((Now(at) & TimestampMask) << Shift) | (sequence & SequenceMask); return ((Now(at) & TimestampMask) << Shift) | (sequence & SequenceMask);
} }
} }
}

View file

@ -1,4 +1,5 @@
namespace SharpChat { namespace SharpChat;
[Flags] [Flags]
public enum UserPermissions : int { public enum UserPermissions : int {
KickUser = 0x00000001, KickUser = 0x00000001,
@ -21,4 +22,3 @@
SeeIPAddress = 0x00008000, SeeIPAddress = 0x00008000,
ViewLogs = 0x00040000, ViewLogs = 0x00040000,
} }
}