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_prefer_simple_using_statement = true:suggestion
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_top_level_statements = true:silent
csharp_style_prefer_primary_constructors = true:suggestion

View file

@ -1,7 +1,8 @@
using SharpChat.Auth;
using System.Text.Json.Serialization;
namespace SharpChat.Flashii {
namespace SharpChat.Flashii;
public class FlashiiAuthResult : AuthResult {
public string UserId => UserIdRaw.ToString();
public string UserName => UserNameRaw ?? string.Empty;
@ -28,4 +29,3 @@ namespace SharpChat.Flashii {
[JsonPropertyName("perms")]
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(
BanKind kind,
FlashiiRawBanInfo rawBanInfo
@ -10,4 +11,3 @@ namespace SharpChat.Flashii {
public DateTimeOffset ExpiresAt { get; } = rawBanInfo.ExpiresAt;
public abstract override string ToString();
}
}

View file

@ -6,7 +6,8 @@ using System.Security.Cryptography;
using System.Text;
using System.Text.Json;
namespace SharpChat.Flashii {
namespace SharpChat.Flashii;
public class FlashiiClient(HttpClient httpClient, Config config) : AuthClient, BansClient {
private const string DEFAULT_BASE_URL = "https://flashii.net/_sockchat";
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;
namespace SharpChat.Flashii {
namespace SharpChat.Flashii;
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 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 {
[JsonPropertyName("is_ban")]
public bool IsBanned { get; set; }
@ -26,4 +27,3 @@ namespace SharpChat.Flashii {
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 string UserId { get; } = rawBanInfo.UserId ?? string.Empty;
public string UserName { get; } = rawBanInfo.UserName ?? $"({rawBanInfo.UserId ?? string.Empty})";
public ColourInheritable UserColour { get; } = ColourInheritable.FromMisuzu(rawBanInfo.UserColourRaw);
public override string ToString() => UserName;
}
}

View file

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

View file

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

View file

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

View file

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

View file

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

View file

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

View file

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

View file

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

View file

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

View file

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

View file

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

View file

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

View file

@ -1,6 +1,7 @@
using System.Text;
namespace SharpChat.SockChat.S2CPackets {
namespace SharpChat.SockChat.S2CPackets;
public class ContextUsersS2CPacket(IEnumerable<ContextUsersS2CPacket.Entry> entries) : S2CPacket {
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();
}
}
}

View file

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

View file

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

View file

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

View file

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

View file

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

View file

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

View file

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

View file

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

View file

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

View file

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

View file

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

View file

@ -2,7 +2,8 @@ using SharpChat.Auth;
using SharpChat.SockChat.S2CPackets;
using System.Net;
namespace SharpChat.C2SPacketHandlers {
namespace SharpChat.C2SPacketHandlers;
public class PingC2SPacketHandler(AuthClient authClient) : C2SPacketHandler {
private readonly TimeSpan BumpInterval = TimeSpan.FromMinutes(1);
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.Text;
namespace SharpChat.C2SPacketHandlers {
namespace SharpChat.C2SPacketHandlers;
public class SendMessageC2SPacketHandler(
RandomSnowflake randomSnowflake,
CachedValue<int> maxMsgLength
@ -86,4 +87,3 @@ namespace SharpChat.C2SPacketHandlers {
}
}
}
}

View file

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

View file

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

View file

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

View file

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

View file

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

View file

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

View file

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

View file

@ -1,6 +1,7 @@
using SharpChat.SockChat.S2CPackets;
namespace SharpChat.ClientCommands {
namespace SharpChat.ClientCommands;
public class CreateChannelClientCommand : ClientCommand {
public bool IsMatch(ClientCommandContext ctx) {
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));
}
}
}

View file

@ -1,6 +1,7 @@
using SharpChat.SockChat.S2CPackets;
namespace SharpChat.ClientCommands {
namespace SharpChat.ClientCommands;
public class DeleteChannelClientCommand : ClientCommand {
public bool IsMatch(ClientCommandContext ctx) {
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));
}
}
}

View file

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

View file

@ -1,6 +1,7 @@
using SharpChat.SockChat.S2CPackets;
namespace SharpChat.ClientCommands {
namespace SharpChat.ClientCommands;
public class JoinChannelClientCommand : ClientCommand {
public bool IsMatch(ClientCommandContext ctx) {
return ctx.NameEquals("join");
@ -20,4 +21,3 @@ namespace SharpChat.ClientCommands {
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 System.Net;
namespace SharpChat.ClientCommands {
namespace SharpChat.ClientCommands;
public class KickBanClientCommand(BansClient bansClient) : ClientCommand {
public bool IsMatch(ClientCommandContext ctx) {
return ctx.NameEquals("kick")
@ -70,4 +71,3 @@ namespace SharpChat.ClientCommands {
await ctx.Chat.BanUser(banUser, duration);
}
}
}

View file

@ -2,7 +2,8 @@ using SharpChat.SockChat.S2CPackets;
using System.Globalization;
using System.Text;
namespace SharpChat.ClientCommands {
namespace SharpChat.ClientCommands;
public class NickClientCommand : ClientCommand {
private const int MAX_GRAPHEMES = 16;
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);
}
}
}

View file

@ -2,7 +2,8 @@ using SharpChat.Bans;
using SharpChat.SockChat.S2CPackets;
using System.Net;
namespace SharpChat.ClientCommands {
namespace SharpChat.ClientCommands;
public class PardonAddressClientCommand(BansClient bansClient) : ClientCommand {
public bool IsMatch(ClientCommandContext ctx) {
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));
}
}
}

View file

@ -1,7 +1,8 @@
using SharpChat.Bans;
using SharpChat.SockChat.S2CPackets;
namespace SharpChat.ClientCommands {
namespace SharpChat.ClientCommands;
public class PardonUserClientCommand(BansClient bansClient) : ClientCommand {
public bool IsMatch(ClientCommandContext ctx) {
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));
}
}
}

View file

@ -1,6 +1,7 @@
using SharpChat.SockChat.S2CPackets;
namespace SharpChat.ClientCommands {
namespace SharpChat.ClientCommands;
public class PasswordChannelClientCommand : ClientCommand {
public bool IsMatch(ClientCommandContext ctx) {
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));
}
}
}

View file

@ -1,6 +1,7 @@
using SharpChat.SockChat.S2CPackets;
namespace SharpChat.ClientCommands {
namespace SharpChat.ClientCommands;
public class RankChannelClientCommand : ClientCommand {
public bool IsMatch(ClientCommandContext ctx) {
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));
}
}
}

View file

@ -1,7 +1,8 @@
using SharpChat.SockChat.S2CPackets;
using System.Net;
namespace SharpChat.ClientCommands {
namespace SharpChat.ClientCommands;
public class RemoteAddressClientCommand : ClientCommand {
public bool IsMatch(ClientCommandContext ctx) {
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));
}
}
}

View file

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

View file

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

View file

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

View file

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

View file

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

View file

@ -1,4 +1,5 @@
namespace SharpChat.EventStorage {
namespace SharpChat.EventStorage;
public interface EventStorage {
void AddEvent(
long id,
@ -17,4 +18,3 @@ namespace SharpChat.EventStorage {
StoredEventInfo? GetEvent(long seqId);
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.Json;
namespace SharpChat.EventStorage {
namespace SharpChat.EventStorage;
public partial class MariaDBEventStorage(string connString) : EventStorage {
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 SharpChat.Configuration;
namespace SharpChat.EventStorage {
namespace SharpChat.EventStorage;
public partial class MariaDBEventStorage {
public static string BuildConnString(Configuration.Config config) {
return BuildConnString(
@ -84,4 +85,3 @@ namespace SharpChat.EventStorage {
return default;
}
}
}

View file

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

View file

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

View file

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

View file

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

View file

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

View file

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

View file

@ -3,7 +3,8 @@ using SharpChat.EventStorage;
using SharpChat.Flashii;
using System.Text;
namespace SharpChat {
namespace SharpChat;
public class Program {
public const string CONFIG = "sharpchat.cfg";
@ -144,4 +145,3 @@ namespace SharpChat {
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
// https://github.com/statianzo/Fleck/blob/1.1.0/src/Fleck/WebSocketServer.cs
namespace SharpChat {
namespace SharpChat;
public class SharpChatWebSocketServer : IWebSocketServer {
private readonly string _scheme;
@ -164,4 +165,3 @@ namespace SharpChat {
}
}
}
}

View file

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

View file

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

View file

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

View file

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

View file

@ -1,8 +1,8 @@
using System.Net;
namespace SharpChat.Auth {
namespace SharpChat.Auth;
public interface AuthClient {
Task<AuthResult> AuthVerifyAsync(IPAddress remoteAddr, string scheme, string token);
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) {}
}

View file

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

View file

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

View file

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

View file

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

View file

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

View file

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

View file

@ -1,4 +1,5 @@
namespace SharpChat {
namespace SharpChat;
public readonly record struct ColourInheritable(ColourRgb? rgb) {
public static readonly ColourInheritable None = new(null);
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 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 byte Red => (byte)((Raw >> 16) & 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 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) {
private Config Config { get; } = config ?? throw new ArgumentNullException(nameof(config));
private string Name { get; } = name ?? throw new ArgumentNullException(nameof(name));
@ -31,4 +32,3 @@ namespace SharpChat.Configuration {
return Value?.ToString() ?? string.Empty;
}
}
}

View file

@ -1,4 +1,5 @@
namespace SharpChat.Configuration {
namespace SharpChat.Configuration;
public interface Config : IDisposable {
/// <summary>
/// Creates a proxy object that forces all names to start with the given prefix.
@ -26,4 +27,3 @@ namespace SharpChat.Configuration {
/// </summary>
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 ConfigException(string message) : base(message) { }
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 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 {
private Config Config { get; } = config ?? throw new ArgumentNullException(nameof(config));
private string Prefix { get; } = prefix ?? throw new ArgumentNullException(nameof(prefix));
@ -31,4 +32,3 @@ namespace SharpChat.Configuration {
GC.SuppressFinalize(this);
}
}
}

View file

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

View file

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

View file

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

View file

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

View file

@ -1,7 +1,8 @@
using System.Reflection;
using System.Text;
namespace SharpChat {
namespace SharpChat;
public static class SharpInfo {
private const string NAME = @"SharpChat";
private const string UNKNOWN = @"XXXXXXXXXX";
@ -33,4 +34,3 @@ namespace SharpChat {
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(
SnowflakeGenerator? generator = null
) {
@ -10,4 +11,3 @@ namespace SharpChat.Snowflake {
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 const long MASK = 0x7FFFFFFFFFFFFFFF;
// previous default epoch was 1588377600000, but snowflakes are much larger than SharpIds
@ -32,4 +33,3 @@
return ((Now(at) & TimestampMask) << Shift) | (sequence & SequenceMask);
}
}
}

View file

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