sharp-chat/SharpChat/Connection.cs

63 lines
1.6 KiB
C#
Raw Normal View History

2025-04-26 22:28:41 +00:00
using Fleck;
2025-04-28 12:29:11 +00:00
using Microsoft.Extensions.Logging;
using SharpChat.SockChat;
2022-08-30 17:00:58 +02:00
using System.Net;
namespace SharpChat;
2025-04-28 12:29:11 +00:00
public class Connection(ILogger logger, IWebSocketConnection sock, IPEndPoint remoteEndPoint) : IDisposable {
public static readonly TimeSpan SessionTimeOut = TimeSpan.FromMinutes(5);
2022-08-30 17:00:58 +02:00
2025-04-28 12:29:11 +00:00
public ILogger Logger { get; } = logger;
public IWebSocketConnection Socket { get; } = sock;
public IPEndPoint RemoteEndPoint { get; } = remoteEndPoint;
2022-08-30 17:00:58 +02:00
public bool IsDisposed { get; private set; }
public DateTimeOffset LastPing { get; set; } = DateTimeOffset.Now;
public User? User { get; set; }
2022-08-30 17:00:58 +02:00
private int CloseCode { get; set; } = 1000;
2025-04-28 12:29:11 +00:00
public IPAddress RemoteAddress => RemoteEndPoint.Address;
public ushort RemotePort => (ushort)RemoteEndPoint.Port;
2022-08-30 17:00:58 +02:00
public bool IsAlive => !IsDisposed && !HasTimedOut;
public async Task Send(S2CPacket packet) {
if(!Socket.IsAvailable)
return;
2022-08-30 17:00:58 +02:00
string data = packet.Pack();
if(!string.IsNullOrWhiteSpace(data))
await Socket.Send(data);
}
2022-08-30 17:00:58 +02:00
public void BumpPing() {
LastPing = DateTimeOffset.Now;
}
2022-08-30 17:00:58 +02:00
public bool HasTimedOut
=> DateTimeOffset.Now - LastPing > SessionTimeOut;
2022-08-30 17:00:58 +02:00
public void PrepareForRestart() {
CloseCode = 1012;
}
~Connection() {
DoDispose();
}
2022-08-30 17:00:58 +02:00
public void Dispose() {
DoDispose();
GC.SuppressFinalize(this);
}
2022-08-30 17:00:58 +02:00
private void DoDispose() {
if(IsDisposed)
return;
2022-08-30 17:00:58 +02:00
IsDisposed = true;
Socket.Close(CloseCode);
}
2022-08-30 17:00:58 +02:00
}