Code style updates.
This commit is contained in:
parent
c9cc5ff23a
commit
4104e40843
|
@ -26,7 +26,9 @@ namespace SharpChat {
|
||||||
Username = fb.Username;
|
Username = fb.Username;
|
||||||
}
|
}
|
||||||
|
|
||||||
public override string ToString() => Username;
|
public override string ToString() {
|
||||||
|
return Username;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public class BannedIPAddress : IBan {
|
public class BannedIPAddress : IBan {
|
||||||
|
@ -41,7 +43,9 @@ namespace SharpChat {
|
||||||
Expires = fb.Expires;
|
Expires = fb.Expires;
|
||||||
}
|
}
|
||||||
|
|
||||||
public override string ToString() => Address.ToString();
|
public override string ToString() {
|
||||||
|
return Address.ToString();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public class BanManager : IDisposable {
|
public class BanManager : IDisposable {
|
||||||
|
@ -168,8 +172,9 @@ namespace SharpChat {
|
||||||
return BanList.ToList();
|
return BanList.ToList();
|
||||||
}
|
}
|
||||||
|
|
||||||
~BanManager()
|
~BanManager() {
|
||||||
=> DoDispose();
|
DoDispose();
|
||||||
|
}
|
||||||
|
|
||||||
public void Dispose() {
|
public void Dispose() {
|
||||||
DoDispose();
|
DoDispose();
|
||||||
|
|
|
@ -9,7 +9,7 @@ namespace SharpChat {
|
||||||
public class ChannelInvalidNameException : ChannelException { }
|
public class ChannelInvalidNameException : ChannelException { }
|
||||||
|
|
||||||
public class ChannelManager : IDisposable {
|
public class ChannelManager : IDisposable {
|
||||||
private readonly List<ChatChannel> Channels = new List<ChatChannel>();
|
private readonly List<ChatChannel> Channels = new();
|
||||||
|
|
||||||
public readonly ChatContext Context;
|
public readonly ChatContext Context;
|
||||||
|
|
||||||
|
@ -140,21 +140,21 @@ namespace SharpChat {
|
||||||
return Channels.Where(c => c.Rank <= hierarchy).ToList();
|
return Channels.Where(c => c.Rank <= hierarchy).ToList();
|
||||||
}
|
}
|
||||||
|
|
||||||
~ChannelManager()
|
~ChannelManager() {
|
||||||
=> Dispose(false);
|
DoDispose();
|
||||||
|
}
|
||||||
|
|
||||||
public void Dispose()
|
public void Dispose() {
|
||||||
=> Dispose(true);
|
DoDispose();
|
||||||
|
GC.SuppressFinalize(this);
|
||||||
|
}
|
||||||
|
|
||||||
private void Dispose(bool disposing) {
|
private void DoDispose() {
|
||||||
if(IsDisposed)
|
if(IsDisposed)
|
||||||
return;
|
return;
|
||||||
IsDisposed = true;
|
IsDisposed = true;
|
||||||
|
|
||||||
Channels.Clear();
|
Channels.Clear();
|
||||||
|
|
||||||
if (disposing)
|
|
||||||
GC.SuppressFinalize(this);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -10,8 +10,7 @@ namespace SharpChat {
|
||||||
public int Rank { get; set; } = 0;
|
public int Rank { get; set; } = 0;
|
||||||
public ChatUser Owner { get; set; } = null;
|
public ChatUser Owner { get; set; } = null;
|
||||||
|
|
||||||
private List<ChatUser> Users { get; } = new List<ChatUser>();
|
private List<ChatUser> Users { get; } = new();
|
||||||
private List<ChatChannelTyping> Typing { get; } = new List<ChatChannelTyping>();
|
|
||||||
|
|
||||||
public bool HasPassword
|
public bool HasPassword
|
||||||
=> !string.IsNullOrWhiteSpace(Password);
|
=> !string.IsNullOrWhiteSpace(Password);
|
||||||
|
@ -69,30 +68,8 @@ namespace SharpChat {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public bool IsTyping(ChatUser user) {
|
|
||||||
if(user == null)
|
|
||||||
return false;
|
|
||||||
lock(Typing)
|
|
||||||
return Typing.Any(x => x.User == user && !x.HasExpired);
|
|
||||||
}
|
|
||||||
public bool CanType(ChatUser user) {
|
|
||||||
if(user == null || !HasUser(user))
|
|
||||||
return false;
|
|
||||||
return !IsTyping(user);
|
|
||||||
}
|
|
||||||
public ChatChannelTyping RegisterTyping(ChatUser user) {
|
|
||||||
if(user == null || !HasUser(user))
|
|
||||||
return null;
|
|
||||||
ChatChannelTyping typing = new ChatChannelTyping(user);
|
|
||||||
lock(Typing) {
|
|
||||||
Typing.RemoveAll(x => x.HasExpired);
|
|
||||||
Typing.Add(typing);
|
|
||||||
}
|
|
||||||
return typing;
|
|
||||||
}
|
|
||||||
|
|
||||||
public string Pack() {
|
public string Pack() {
|
||||||
StringBuilder sb = new StringBuilder();
|
StringBuilder sb = new();
|
||||||
|
|
||||||
sb.Append(Name);
|
sb.Append(Name);
|
||||||
sb.Append('\t');
|
sb.Append('\t');
|
||||||
|
|
|
@ -1,18 +0,0 @@
|
||||||
using System;
|
|
||||||
|
|
||||||
namespace SharpChat {
|
|
||||||
public class ChatChannelTyping {
|
|
||||||
public static TimeSpan Lifetime { get; } = TimeSpan.FromSeconds(5);
|
|
||||||
|
|
||||||
public ChatUser User { get; }
|
|
||||||
public DateTimeOffset Started { get; }
|
|
||||||
|
|
||||||
public bool HasExpired
|
|
||||||
=> DateTimeOffset.Now - Started > Lifetime;
|
|
||||||
|
|
||||||
public ChatChannelTyping(ChatUser user) {
|
|
||||||
User = user ?? throw new ArgumentNullException(nameof(user));
|
|
||||||
Started = DateTimeOffset.Now;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
|
@ -28,10 +28,10 @@ namespace SharpChat {
|
||||||
public ChatContext(HttpClient httpClient, SockChatServer server) {
|
public ChatContext(HttpClient httpClient, SockChatServer server) {
|
||||||
HttpClient = httpClient;
|
HttpClient = httpClient;
|
||||||
Server = server;
|
Server = server;
|
||||||
Bans = new BanManager(httpClient, this);
|
Bans = new(httpClient, this);
|
||||||
Users = new UserManager(this);
|
Users = new(this);
|
||||||
Channels = new ChannelManager(this);
|
Channels = new(this);
|
||||||
Events = new ChatEventManager(this);
|
Events = new(this);
|
||||||
|
|
||||||
BumpTimer = new Timer(e => FlashiiBump.SubmitAsync(HttpClient, Users.WithActiveConnections()).Wait(), null, TimeSpan.Zero, TimeSpan.FromMinutes(1));
|
BumpTimer = new Timer(e => FlashiiBump.SubmitAsync(HttpClient, Users.WithActiveConnections()).Wait(), null, TimeSpan.Zero, TimeSpan.FromMinutes(1));
|
||||||
}
|
}
|
||||||
|
|
|
@ -16,7 +16,7 @@ namespace SharpChat {
|
||||||
Context = context;
|
Context = context;
|
||||||
|
|
||||||
if(!Database.HasDatabase)
|
if(!Database.HasDatabase)
|
||||||
Events = new List<IChatEvent>();
|
Events = new();
|
||||||
}
|
}
|
||||||
|
|
||||||
public void Add(IChatEvent evt) {
|
public void Add(IChatEvent evt) {
|
||||||
|
@ -80,21 +80,21 @@ namespace SharpChat {
|
||||||
return Enumerable.Empty<IChatEvent>();
|
return Enumerable.Empty<IChatEvent>();
|
||||||
}
|
}
|
||||||
|
|
||||||
~ChatEventManager()
|
~ChatEventManager() {
|
||||||
=> Dispose(false);
|
DoDispose();
|
||||||
|
}
|
||||||
|
|
||||||
public void Dispose()
|
public void Dispose() {
|
||||||
=> Dispose(true);
|
DoDispose();
|
||||||
|
GC.SuppressFinalize(this);
|
||||||
|
}
|
||||||
|
|
||||||
private void Dispose(bool disposing) {
|
private void DoDispose() {
|
||||||
if(IsDisposed)
|
if(IsDisposed)
|
||||||
return;
|
return;
|
||||||
IsDisposed = true;
|
IsDisposed = true;
|
||||||
|
|
||||||
Events?.Clear();
|
Events?.Clear();
|
||||||
|
|
||||||
if (disposing)
|
|
||||||
GC.SuppressFinalize(this);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -13,7 +13,7 @@ namespace SharpChat {
|
||||||
private const int FLOOD_PROTECTION_AMOUNT = 30;
|
private const int FLOOD_PROTECTION_AMOUNT = 30;
|
||||||
private const int FLOOD_PROTECTION_THRESHOLD = 10;
|
private const int FLOOD_PROTECTION_THRESHOLD = 10;
|
||||||
|
|
||||||
private readonly Queue<DateTimeOffset> TimePoints = new Queue<DateTimeOffset>();
|
private readonly Queue<DateTimeOffset> TimePoints = new();
|
||||||
|
|
||||||
public ChatRateLimitState State {
|
public ChatRateLimitState State {
|
||||||
get {
|
get {
|
||||||
|
|
|
@ -23,15 +23,16 @@ namespace SharpChat {
|
||||||
public bool HasFloodProtection
|
public bool HasFloodProtection
|
||||||
=> Rank < RANK_NO_FLOOD;
|
=> Rank < RANK_NO_FLOOD;
|
||||||
|
|
||||||
public bool Equals([AllowNull] BasicUser other)
|
public bool Equals([AllowNull] BasicUser other) {
|
||||||
=> UserId == other.UserId;
|
return UserId == other.UserId;
|
||||||
|
}
|
||||||
|
|
||||||
public string DisplayName {
|
public string DisplayName {
|
||||||
get {
|
get {
|
||||||
StringBuilder sb = new StringBuilder();
|
StringBuilder sb = new();
|
||||||
|
|
||||||
if(Status == ChatUserStatus.Away)
|
if(Status == ChatUserStatus.Away)
|
||||||
sb.AppendFormat(@"<{0}>_", StatusMessage.Substring(0, Math.Min(StatusMessage.Length, 5)).ToUpperInvariant());
|
sb.AppendFormat(@"<{0}>_", StatusMessage[..Math.Min(StatusMessage.Length, 5)].ToUpperInvariant());
|
||||||
|
|
||||||
if(string.IsNullOrWhiteSpace(Nickname))
|
if(string.IsNullOrWhiteSpace(Nickname))
|
||||||
sb.Append(Username);
|
sb.Append(Username);
|
||||||
|
@ -50,7 +51,7 @@ namespace SharpChat {
|
||||||
}
|
}
|
||||||
|
|
||||||
public string Pack() {
|
public string Pack() {
|
||||||
StringBuilder sb = new StringBuilder();
|
StringBuilder sb = new();
|
||||||
|
|
||||||
sb.Append(UserId);
|
sb.Append(UserId);
|
||||||
sb.Append('\t');
|
sb.Append('\t');
|
||||||
|
@ -61,7 +62,7 @@ namespace SharpChat {
|
||||||
sb.Append(Rank);
|
sb.Append(Rank);
|
||||||
sb.Append(' ');
|
sb.Append(' ');
|
||||||
sb.Append(Can(ChatUserPermissions.KickUser) ? '1' : '0');
|
sb.Append(Can(ChatUserPermissions.KickUser) ? '1' : '0');
|
||||||
sb.Append(@" 0 ");
|
sb.Append(@" 0 "); // view logs
|
||||||
sb.Append(Can(ChatUserPermissions.SetOwnNickname) ? '1' : '0');
|
sb.Append(Can(ChatUserPermissions.SetOwnNickname) ? '1' : '0');
|
||||||
sb.Append(' ');
|
sb.Append(' ');
|
||||||
sb.Append(Can(ChatUserPermissions.CreateChannel | ChatUserPermissions.SetChannelPermanent, true) ? 2 : (
|
sb.Append(Can(ChatUserPermissions.CreateChannel | ChatUserPermissions.SetChannelPermanent, true) ? 2 : (
|
||||||
|
@ -75,10 +76,10 @@ namespace SharpChat {
|
||||||
public class ChatUser : BasicUser, IPacketTarget {
|
public class ChatUser : BasicUser, IPacketTarget {
|
||||||
public DateTimeOffset SilencedUntil { get; set; }
|
public DateTimeOffset SilencedUntil { get; set; }
|
||||||
|
|
||||||
private readonly List<ChatUserSession> Sessions = new List<ChatUserSession>();
|
private readonly List<ChatUserSession> Sessions = new();
|
||||||
private readonly List<ChatChannel> Channels = new List<ChatChannel>();
|
private readonly List<ChatChannel> Channels = new();
|
||||||
|
|
||||||
public readonly ChatRateLimiter RateLimiter = new ChatRateLimiter();
|
public readonly ChatRateLimiter RateLimiter = new();
|
||||||
|
|
||||||
public string TargetName => @"@log";
|
public string TargetName => @"@log";
|
||||||
|
|
||||||
|
@ -130,7 +131,7 @@ namespace SharpChat {
|
||||||
if(Status == ChatUserStatus.Offline)
|
if(Status == ChatUserStatus.Offline)
|
||||||
Status = ChatUserStatus.Online;
|
Status = ChatUserStatus.Online;
|
||||||
|
|
||||||
Colour = new ChatColour(auth.ColourRaw);
|
Colour = new(auth.ColourRaw);
|
||||||
Rank = auth.Rank;
|
Rank = auth.Rank;
|
||||||
Permissions = auth.Permissions;
|
Permissions = auth.Permissions;
|
||||||
|
|
||||||
|
@ -152,8 +153,9 @@ namespace SharpChat {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public void ForceChannel(ChatChannel chan = null)
|
public void ForceChannel(ChatChannel chan = null) {
|
||||||
=> Send(new UserChannelForceJoinPacket(chan ?? CurrentChannel));
|
Send(new UserChannelForceJoinPacket(chan ?? CurrentChannel));
|
||||||
|
}
|
||||||
|
|
||||||
public void FocusChannel(ChatChannel chan) {
|
public void FocusChannel(ChatChannel chan) {
|
||||||
lock(Channels) {
|
lock(Channels) {
|
||||||
|
|
|
@ -20,7 +20,7 @@ namespace SharpChat {
|
||||||
public DateTimeOffset LastPing { get; set; } = DateTimeOffset.MinValue;
|
public DateTimeOffset LastPing { get; set; } = DateTimeOffset.MinValue;
|
||||||
public ChatUser User { get; set; }
|
public ChatUser User { get; set; }
|
||||||
|
|
||||||
private static int CloseCode { get; set; } = 1000;
|
private int CloseCode { get; set; } = 1000;
|
||||||
|
|
||||||
public string TargetName => @"@log";
|
public string TargetName => @"@log";
|
||||||
|
|
||||||
|
@ -65,30 +65,32 @@ namespace SharpChat {
|
||||||
Connection.Send(line);
|
Connection.Send(line);
|
||||||
}
|
}
|
||||||
|
|
||||||
public void BumpPing()
|
public void BumpPing() {
|
||||||
=> LastPing = DateTimeOffset.Now;
|
LastPing = DateTimeOffset.Now;
|
||||||
|
}
|
||||||
|
|
||||||
public bool HasTimedOut
|
public bool HasTimedOut
|
||||||
=> DateTimeOffset.Now - LastPing > SessionTimeOut;
|
=> DateTimeOffset.Now - LastPing > SessionTimeOut;
|
||||||
|
|
||||||
public void PrepareForRestart()
|
public void PrepareForRestart() {
|
||||||
=> CloseCode = 1012;
|
CloseCode = 1012;
|
||||||
|
}
|
||||||
|
|
||||||
public void Dispose()
|
~ChatUserSession() {
|
||||||
=> Dispose(true);
|
DoDispose();
|
||||||
|
}
|
||||||
|
|
||||||
~ChatUserSession()
|
public void Dispose() {
|
||||||
=> Dispose(false);
|
DoDispose();
|
||||||
|
GC.SuppressFinalize(this);
|
||||||
|
}
|
||||||
|
|
||||||
private void Dispose(bool disposing) {
|
private void DoDispose() {
|
||||||
if(IsDisposed)
|
if(IsDisposed)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
IsDisposed = true;
|
IsDisposed = true;
|
||||||
Connection.Close(CloseCode);
|
Connection.Close(CloseCode);
|
||||||
|
|
||||||
if(disposing)
|
|
||||||
GC.SuppressFinalize(this);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -18,7 +18,7 @@ namespace SharpChat.Commands {
|
||||||
else {
|
else {
|
||||||
statusText = statusText.Trim();
|
statusText = statusText.Trim();
|
||||||
if(statusText.Length > MAX_LENGTH)
|
if(statusText.Length > MAX_LENGTH)
|
||||||
statusText = statusText.Substring(0, MAX_LENGTH).Trim();
|
statusText = statusText[..MAX_LENGTH].Trim();
|
||||||
}
|
}
|
||||||
|
|
||||||
context.User.Status = ChatUserStatus.Away;
|
context.User.Status = ChatUserStatus.Away;
|
||||||
|
|
|
@ -46,7 +46,7 @@ namespace SharpChat {
|
||||||
if(!HasDatabase)
|
if(!HasDatabase)
|
||||||
return null;
|
return null;
|
||||||
|
|
||||||
MySqlConnection conn = new MySqlConnection(ConnectionString);
|
MySqlConnection conn = new(ConnectionString);
|
||||||
conn.Open();
|
conn.Open();
|
||||||
|
|
||||||
return conn;
|
return conn;
|
||||||
|
@ -175,7 +175,7 @@ namespace SharpChat {
|
||||||
}
|
}
|
||||||
|
|
||||||
public static IEnumerable<IChatEvent> GetEvents(IPacketTarget target, int amount, int offset) {
|
public static IEnumerable<IChatEvent> GetEvents(IPacketTarget target, int amount, int offset) {
|
||||||
List<IChatEvent> events = new List<IChatEvent>();
|
List<IChatEvent> events = new();
|
||||||
|
|
||||||
try {
|
try {
|
||||||
using MySqlDataReader reader = RunQuery(
|
using MySqlDataReader reader = RunQuery(
|
||||||
|
|
|
@ -1,20 +1,19 @@
|
||||||
using System;
|
using System.IO;
|
||||||
using System.IO;
|
|
||||||
using System.Security.Cryptography;
|
using System.Security.Cryptography;
|
||||||
using System.Text;
|
using System.Text;
|
||||||
|
|
||||||
namespace SharpChat {
|
namespace SharpChat {
|
||||||
public static class Extensions {
|
public static class Extensions {
|
||||||
public static string GetSignedHash(this string str, string key = null)
|
public static string GetSignedHash(this string str, string key = null) {
|
||||||
=> Encoding.UTF8.GetBytes(str).GetSignedHash(key);
|
return Encoding.UTF8.GetBytes(str).GetSignedHash(key);
|
||||||
|
}
|
||||||
|
|
||||||
public static string GetSignedHash(this byte[] bytes, string key = null) {
|
public static string GetSignedHash(this byte[] bytes, string key = null) {
|
||||||
if (key == null)
|
key ??= File.Exists(@"login_key.txt") ? File.ReadAllText(@"login_key.txt") : @"woomy";
|
||||||
key = File.Exists(@"login_key.txt") ? File.ReadAllText(@"login_key.txt") : @"woomy";
|
|
||||||
|
|
||||||
StringBuilder sb = new StringBuilder();
|
StringBuilder sb = new();
|
||||||
|
|
||||||
using (HMACSHA256 algo = new HMACSHA256(Encoding.UTF8.GetBytes(key))) {
|
using(HMACSHA256 algo = new(Encoding.UTF8.GetBytes(key))) {
|
||||||
byte[] hash = algo.ComputeHash(bytes);
|
byte[] hash = algo.ComputeHash(bytes);
|
||||||
|
|
||||||
foreach(byte b in hash)
|
foreach(byte b in hash)
|
||||||
|
@ -26,7 +25,7 @@ namespace SharpChat {
|
||||||
|
|
||||||
public static string GetIdString(this byte[] buffer) {
|
public static string GetIdString(this byte[] buffer) {
|
||||||
const string id_chars = @"abcdefghijklmnopqrstuvwxyz0123456789-_ABCDEFGHIJKLMNOPQRSTUVWXYZ";
|
const string id_chars = @"abcdefghijklmnopqrstuvwxyz0123456789-_ABCDEFGHIJKLMNOPQRSTUVWXYZ";
|
||||||
StringBuilder sb = new StringBuilder();
|
StringBuilder sb = new();
|
||||||
foreach(byte b in buffer)
|
foreach(byte b in buffer)
|
||||||
sb.Append(id_chars[b % id_chars.Length]);
|
sb.Append(id_chars[b % id_chars.Length]);
|
||||||
return sb.ToString();
|
return sb.ToString();
|
||||||
|
|
|
@ -19,8 +19,9 @@ namespace SharpChat.Flashii {
|
||||||
public string Hash
|
public string Hash
|
||||||
=> string.Join(@"#", UserId, Token, IPAddress).GetSignedHash();
|
=> string.Join(@"#", UserId, Token, IPAddress).GetSignedHash();
|
||||||
|
|
||||||
public byte[] GetJSON()
|
public byte[] GetJSON() {
|
||||||
=> JsonSerializer.SerializeToUtf8Bytes(this);
|
return JsonSerializer.SerializeToUtf8Bytes(this);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public class FlashiiAuth {
|
public class FlashiiAuth {
|
||||||
|
|
|
@ -4,25 +4,31 @@ 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));
|
||||||
|
}
|
||||||
|
|
||||||
public static void Write(byte[] bytes)
|
public static void Write(byte[] bytes) {
|
||||||
=> Write(Encoding.UTF8.GetString(bytes));
|
Write(Encoding.UTF8.GetString(bytes));
|
||||||
|
}
|
||||||
|
|
||||||
public static void Write(object obj)
|
public static void Write(object obj) {
|
||||||
=> Write(obj?.ToString() ?? string.Empty);
|
Write(obj?.ToString() ?? string.Empty);
|
||||||
|
}
|
||||||
|
|
||||||
[Conditional(@"DEBUG")]
|
[Conditional(@"DEBUG")]
|
||||||
public static void Debug(string str)
|
public static void Debug(string str) {
|
||||||
=> Write(str);
|
Write(str);
|
||||||
|
}
|
||||||
|
|
||||||
[Conditional(@"DEBUG")]
|
[Conditional(@"DEBUG")]
|
||||||
public static void Debug(byte[] bytes)
|
public static void Debug(byte[] bytes) {
|
||||||
=> Write(bytes);
|
Write(bytes);
|
||||||
|
}
|
||||||
|
|
||||||
[Conditional(@"DEBUG")]
|
[Conditional(@"DEBUG")]
|
||||||
public static void Debug(object obj)
|
public static void Debug(object obj) {
|
||||||
=> Write(obj);
|
Write(obj);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -24,7 +24,7 @@ namespace SharpChat.Packet {
|
||||||
}
|
}
|
||||||
|
|
||||||
public override IEnumerable<string> Pack() {
|
public override IEnumerable<string> Pack() {
|
||||||
StringBuilder sb = new StringBuilder();
|
StringBuilder sb = new();
|
||||||
|
|
||||||
sb.Append('1');
|
sb.Append('1');
|
||||||
sb.Append("\tn\t");
|
sb.Append("\tn\t");
|
||||||
|
|
|
@ -15,7 +15,7 @@ namespace SharpChat.Packet {
|
||||||
}
|
}
|
||||||
|
|
||||||
public override IEnumerable<string> Pack() {
|
public override IEnumerable<string> Pack() {
|
||||||
StringBuilder sb = new StringBuilder();
|
StringBuilder sb = new();
|
||||||
|
|
||||||
sb.Append('1');
|
sb.Append('1');
|
||||||
sb.Append("\ty\t");
|
sb.Append("\ty\t");
|
||||||
|
|
|
@ -12,7 +12,7 @@ namespace SharpChat.Packet {
|
||||||
}
|
}
|
||||||
|
|
||||||
public override IEnumerable<string> Pack() {
|
public override IEnumerable<string> Pack() {
|
||||||
StringBuilder sb = new StringBuilder();
|
StringBuilder sb = new();
|
||||||
|
|
||||||
sb.Append('2');
|
sb.Append('2');
|
||||||
sb.Append('\t');
|
sb.Append('\t');
|
||||||
|
|
|
@ -10,7 +10,7 @@ namespace SharpChat.Packet {
|
||||||
}
|
}
|
||||||
|
|
||||||
public override IEnumerable<string> Pack() {
|
public override IEnumerable<string> Pack() {
|
||||||
StringBuilder sb = new StringBuilder();
|
StringBuilder sb = new();
|
||||||
|
|
||||||
sb.Append('4');
|
sb.Append('4');
|
||||||
sb.Append('\t');
|
sb.Append('\t');
|
||||||
|
|
|
@ -11,7 +11,7 @@ namespace SharpChat.Packet {
|
||||||
}
|
}
|
||||||
|
|
||||||
public override IEnumerable<string> Pack() {
|
public override IEnumerable<string> Pack() {
|
||||||
StringBuilder sb = new StringBuilder();
|
StringBuilder sb = new();
|
||||||
|
|
||||||
sb.Append('4');
|
sb.Append('4');
|
||||||
sb.Append('\t');
|
sb.Append('\t');
|
||||||
|
|
|
@ -12,7 +12,7 @@ namespace SharpChat.Packet {
|
||||||
}
|
}
|
||||||
|
|
||||||
public override IEnumerable<string> Pack() {
|
public override IEnumerable<string> Pack() {
|
||||||
StringBuilder sb = new StringBuilder();
|
StringBuilder sb = new();
|
||||||
|
|
||||||
sb.Append('4');
|
sb.Append('4');
|
||||||
sb.Append('\t');
|
sb.Append('\t');
|
||||||
|
|
|
@ -15,7 +15,7 @@ namespace SharpChat.Packet {
|
||||||
}
|
}
|
||||||
|
|
||||||
public override IEnumerable<string> Pack() {
|
public override IEnumerable<string> Pack() {
|
||||||
StringBuilder sb = new StringBuilder();
|
StringBuilder sb = new();
|
||||||
|
|
||||||
sb.Append('2');
|
sb.Append('2');
|
||||||
sb.Append('\t');
|
sb.Append('\t');
|
||||||
|
|
|
@ -10,7 +10,7 @@ namespace SharpChat.Packet {
|
||||||
}
|
}
|
||||||
|
|
||||||
public override IEnumerable<string> Pack() {
|
public override IEnumerable<string> Pack() {
|
||||||
StringBuilder sb = new StringBuilder();
|
StringBuilder sb = new();
|
||||||
|
|
||||||
sb.Append('6');
|
sb.Append('6');
|
||||||
sb.Append('\t');
|
sb.Append('\t');
|
||||||
|
|
|
@ -12,7 +12,7 @@ namespace SharpChat.Packet {
|
||||||
}
|
}
|
||||||
|
|
||||||
public override IEnumerable<string> Pack() {
|
public override IEnumerable<string> Pack() {
|
||||||
StringBuilder sb = new StringBuilder();
|
StringBuilder sb = new();
|
||||||
|
|
||||||
sb.Append('7');
|
sb.Append('7');
|
||||||
sb.Append('\t');
|
sb.Append('\t');
|
||||||
|
|
|
@ -23,7 +23,7 @@ namespace SharpChat.Packet {
|
||||||
}
|
}
|
||||||
|
|
||||||
public override IEnumerable<string> Pack() {
|
public override IEnumerable<string> Pack() {
|
||||||
StringBuilder sb = new StringBuilder();
|
StringBuilder sb = new();
|
||||||
|
|
||||||
sb.Append('8');
|
sb.Append('8');
|
||||||
sb.Append('\t');
|
sb.Append('\t');
|
||||||
|
|
|
@ -16,7 +16,7 @@ namespace SharpChat.Packet {
|
||||||
private const string V1_CHATBOT = "-1\tChatBot\tinherit\t\t";
|
private const string V1_CHATBOT = "-1\tChatBot\tinherit\t\t";
|
||||||
|
|
||||||
public override IEnumerable<string> Pack() {
|
public override IEnumerable<string> Pack() {
|
||||||
StringBuilder sb = new StringBuilder();
|
StringBuilder sb = new();
|
||||||
|
|
||||||
sb.Append('7');
|
sb.Append('7');
|
||||||
sb.Append('\t');
|
sb.Append('\t');
|
||||||
|
|
|
@ -12,7 +12,7 @@ namespace SharpChat.Packet {
|
||||||
}
|
}
|
||||||
|
|
||||||
public override IEnumerable<string> Pack() {
|
public override IEnumerable<string> Pack() {
|
||||||
StringBuilder sb = new StringBuilder();
|
StringBuilder sb = new();
|
||||||
|
|
||||||
sb.Append('7');
|
sb.Append('7');
|
||||||
sb.Append('\t');
|
sb.Append('\t');
|
||||||
|
|
|
@ -5,7 +5,7 @@ using System.Text;
|
||||||
namespace SharpChat.Packet {
|
namespace SharpChat.Packet {
|
||||||
public class FloodWarningPacket : ServerPacket {
|
public class FloodWarningPacket : ServerPacket {
|
||||||
public override IEnumerable<string> Pack() {
|
public override IEnumerable<string> Pack() {
|
||||||
StringBuilder sb = new StringBuilder();
|
StringBuilder sb = new();
|
||||||
|
|
||||||
sb.Append('2');
|
sb.Append('2');
|
||||||
sb.Append('\t');
|
sb.Append('\t');
|
||||||
|
|
|
@ -23,7 +23,7 @@ namespace SharpChat.Packet {
|
||||||
}
|
}
|
||||||
|
|
||||||
public override IEnumerable<string> Pack() {
|
public override IEnumerable<string> Pack() {
|
||||||
StringBuilder sb = new StringBuilder();
|
StringBuilder sb = new();
|
||||||
|
|
||||||
sb.Append('9');
|
sb.Append('9');
|
||||||
sb.Append('\t');
|
sb.Append('\t');
|
||||||
|
|
|
@ -20,7 +20,7 @@ namespace SharpChat.Packet {
|
||||||
}
|
}
|
||||||
|
|
||||||
public override IEnumerable<string> Pack() {
|
public override IEnumerable<string> Pack() {
|
||||||
StringBuilder sb = new StringBuilder();
|
StringBuilder sb = new();
|
||||||
|
|
||||||
if(StringId == LCR.WELCOME) {
|
if(StringId == LCR.WELCOME) {
|
||||||
sb.Append('7');
|
sb.Append('7');
|
||||||
|
|
|
@ -11,7 +11,7 @@ namespace SharpChat.Packet {
|
||||||
}
|
}
|
||||||
|
|
||||||
public override IEnumerable<string> Pack() {
|
public override IEnumerable<string> Pack() {
|
||||||
StringBuilder sb = new StringBuilder();
|
StringBuilder sb = new();
|
||||||
|
|
||||||
sb.Append('0');
|
sb.Append('0');
|
||||||
sb.Append('\t');
|
sb.Append('\t');
|
||||||
|
|
|
@ -11,7 +11,7 @@ namespace SharpChat.Packet {
|
||||||
}
|
}
|
||||||
|
|
||||||
public override IEnumerable<string> Pack() {
|
public override IEnumerable<string> Pack() {
|
||||||
StringBuilder sb = new StringBuilder();
|
StringBuilder sb = new();
|
||||||
|
|
||||||
sb.Append('5');
|
sb.Append('5');
|
||||||
sb.Append('\t');
|
sb.Append('\t');
|
||||||
|
|
|
@ -11,7 +11,7 @@ namespace SharpChat.Packet {
|
||||||
}
|
}
|
||||||
|
|
||||||
public override IEnumerable<string> Pack() {
|
public override IEnumerable<string> Pack() {
|
||||||
StringBuilder sb = new StringBuilder();
|
StringBuilder sb = new();
|
||||||
|
|
||||||
sb.Append('5');
|
sb.Append('5');
|
||||||
sb.Append('\t');
|
sb.Append('\t');
|
||||||
|
|
|
@ -11,7 +11,7 @@ namespace SharpChat.Packet {
|
||||||
}
|
}
|
||||||
|
|
||||||
public override IEnumerable<string> Pack() {
|
public override IEnumerable<string> Pack() {
|
||||||
StringBuilder sb = new StringBuilder();
|
StringBuilder sb = new();
|
||||||
|
|
||||||
sb.Append('5');
|
sb.Append('5');
|
||||||
sb.Append('\t');
|
sb.Append('\t');
|
||||||
|
|
|
@ -13,7 +13,7 @@ namespace SharpChat.Packet {
|
||||||
}
|
}
|
||||||
|
|
||||||
public override IEnumerable<string> Pack() {
|
public override IEnumerable<string> Pack() {
|
||||||
StringBuilder sb = new StringBuilder();
|
StringBuilder sb = new();
|
||||||
|
|
||||||
sb.Append('1');
|
sb.Append('1');
|
||||||
sb.Append('\t');
|
sb.Append('\t');
|
||||||
|
|
|
@ -22,7 +22,7 @@ namespace SharpChat.Packet {
|
||||||
}
|
}
|
||||||
|
|
||||||
public override IEnumerable<string> Pack() {
|
public override IEnumerable<string> Pack() {
|
||||||
StringBuilder sb = new StringBuilder();
|
StringBuilder sb = new();
|
||||||
|
|
||||||
sb.Append('3');
|
sb.Append('3');
|
||||||
sb.Append('\t');
|
sb.Append('\t');
|
||||||
|
|
|
@ -13,7 +13,7 @@ namespace SharpChat.Packet {
|
||||||
}
|
}
|
||||||
|
|
||||||
public override IEnumerable<string> Pack() {
|
public override IEnumerable<string> Pack() {
|
||||||
StringBuilder sb = new StringBuilder();
|
StringBuilder sb = new();
|
||||||
|
|
||||||
bool isSilent = string.IsNullOrEmpty(PreviousName);
|
bool isSilent = string.IsNullOrEmpty(PreviousName);
|
||||||
|
|
||||||
|
|
|
@ -3,8 +3,8 @@ using System.Security.Cryptography;
|
||||||
|
|
||||||
namespace SharpChat {
|
namespace SharpChat {
|
||||||
public static class RNG {
|
public static class RNG {
|
||||||
private static object Lock { get; } = new object();
|
private static object Lock { get; } = new();
|
||||||
private static Random NormalRandom { get; } = new Random();
|
private static Random NormalRandom { get; } = new();
|
||||||
private static RandomNumberGenerator SecureRandom { get; } = RandomNumberGenerator.Create();
|
private static RandomNumberGenerator SecureRandom { get; } = RandomNumberGenerator.Create();
|
||||||
|
|
||||||
public static int Next() {
|
public static int Next() {
|
||||||
|
|
|
@ -21,7 +21,7 @@ namespace SharpChat {
|
||||||
private Action<IWebSocketConnection> _config;
|
private Action<IWebSocketConnection> _config;
|
||||||
|
|
||||||
public SharpChatWebSocketServer(string location, bool supportDualStack = true) {
|
public SharpChatWebSocketServer(string location, bool supportDualStack = true) {
|
||||||
Uri uri = new Uri(location);
|
Uri uri = new(location);
|
||||||
|
|
||||||
Port = uri.Port;
|
Port = uri.Port;
|
||||||
Location = location;
|
Location = location;
|
||||||
|
@ -29,7 +29,7 @@ namespace SharpChat {
|
||||||
|
|
||||||
_locationIP = ParseIPAddress(uri);
|
_locationIP = ParseIPAddress(uri);
|
||||||
_scheme = uri.Scheme;
|
_scheme = uri.Scheme;
|
||||||
Socket socket = new Socket(_locationIP.AddressFamily, SocketType.Stream, ProtocolType.IP);
|
Socket socket = new(_locationIP.AddressFamily, SocketType.Stream, ProtocolType.IP);
|
||||||
socket.SetSocketOption(SocketOptionLevel.Socket, SocketOptionName.ReuseAddress, 1);
|
socket.SetSocketOption(SocketOptionLevel.Socket, SocketOptionName.ReuseAddress, 1);
|
||||||
|
|
||||||
if(SupportDualStack && Type.GetType(@"Mono.Runtime") == null && RuntimeInformation.IsOSPlatform(OSPlatform.Windows)) {
|
if(SupportDualStack && Type.GetType(@"Mono.Runtime") == null && RuntimeInformation.IsOSPlatform(OSPlatform.Windows)) {
|
||||||
|
@ -37,7 +37,7 @@ namespace SharpChat {
|
||||||
}
|
}
|
||||||
|
|
||||||
ListenerSocket = new SocketWrapper(socket);
|
ListenerSocket = new SocketWrapper(socket);
|
||||||
SupportedSubProtocols = new string[0];
|
SupportedSubProtocols = Array.Empty<string>();
|
||||||
}
|
}
|
||||||
|
|
||||||
public ISocket ListenerSocket { get; set; }
|
public ISocket ListenerSocket { get; set; }
|
||||||
|
@ -55,9 +55,10 @@ namespace SharpChat {
|
||||||
|
|
||||||
public void Dispose() {
|
public void Dispose() {
|
||||||
ListenerSocket.Dispose();
|
ListenerSocket.Dispose();
|
||||||
|
GC.SuppressFinalize(this);
|
||||||
}
|
}
|
||||||
|
|
||||||
private IPAddress ParseIPAddress(Uri uri) {
|
private static IPAddress ParseIPAddress(Uri uri) {
|
||||||
string ipStr = uri.Host;
|
string ipStr = uri.Host;
|
||||||
|
|
||||||
if(ipStr == "0.0.0.0") {
|
if(ipStr == "0.0.0.0") {
|
||||||
|
@ -74,7 +75,7 @@ namespace SharpChat {
|
||||||
}
|
}
|
||||||
|
|
||||||
public void Start(Action<IWebSocketConnection> config) {
|
public void Start(Action<IWebSocketConnection> config) {
|
||||||
IPEndPoint ipLocal = new IPEndPoint(_locationIP, Port);
|
IPEndPoint ipLocal = new(_locationIP, Port);
|
||||||
ListenerSocket.Bind(ipLocal);
|
ListenerSocket.Bind(ipLocal);
|
||||||
ListenerSocket.Listen(100);
|
ListenerSocket.Listen(100);
|
||||||
Port = ((IPEndPoint)ListenerSocket.LocalEndPoint).Port;
|
Port = ((IPEndPoint)ListenerSocket.LocalEndPoint).Port;
|
||||||
|
@ -101,7 +102,7 @@ namespace SharpChat {
|
||||||
FleckLog.Info("Listener socket restarting");
|
FleckLog.Info("Listener socket restarting");
|
||||||
try {
|
try {
|
||||||
ListenerSocket.Dispose();
|
ListenerSocket.Dispose();
|
||||||
Socket socket = new Socket(_locationIP.AddressFamily, SocketType.Stream, ProtocolType.IP);
|
Socket socket = new(_locationIP.AddressFamily, SocketType.Stream, ProtocolType.IP);
|
||||||
socket.SetSocketOption(SocketOptionLevel.Socket, SocketOptionName.ReuseAddress, 1);
|
socket.SetSocketOption(SocketOptionLevel.Socket, SocketOptionName.ReuseAddress, 1);
|
||||||
ListenerSocket = new SocketWrapper(socket);
|
ListenerSocket = new SocketWrapper(socket);
|
||||||
Start(_config);
|
Start(_config);
|
||||||
|
|
|
@ -4,7 +4,7 @@ using System.Linq;
|
||||||
|
|
||||||
namespace SharpChat {
|
namespace SharpChat {
|
||||||
public class UserManager : IDisposable {
|
public class UserManager : IDisposable {
|
||||||
private readonly List<ChatUser> Users = new List<ChatUser>();
|
private readonly List<ChatUser> Users = new();
|
||||||
|
|
||||||
public readonly ChatContext Context;
|
public readonly ChatContext Context;
|
||||||
|
|
||||||
|
@ -70,21 +70,21 @@ namespace SharpChat {
|
||||||
return Users.ToList();
|
return Users.ToList();
|
||||||
}
|
}
|
||||||
|
|
||||||
~UserManager()
|
~UserManager() {
|
||||||
=> Dispose(false);
|
DoDispose();
|
||||||
|
}
|
||||||
|
|
||||||
public void Dispose()
|
public void Dispose() {
|
||||||
=> Dispose(true);
|
DoDispose();
|
||||||
|
GC.SuppressFinalize(this);
|
||||||
|
}
|
||||||
|
|
||||||
private void Dispose(bool disposing) {
|
private void DoDispose() {
|
||||||
if(IsDisposed)
|
if(IsDisposed)
|
||||||
return;
|
return;
|
||||||
IsDisposed = true;
|
IsDisposed = true;
|
||||||
|
|
||||||
Users.Clear();
|
Users.Clear();
|
||||||
|
|
||||||
if (disposing)
|
|
||||||
GC.SuppressFinalize(this);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in a new issue