Refactored to fix compiler warnings

This commit is contained in:
barelyprofessional
2025-07-07 20:12:07 -05:00
parent bcc3bde6c9
commit 5f189cb9cc
28 changed files with 279 additions and 228 deletions

View File

@@ -1,7 +1,6 @@
using System.Net;
using System.Net.WebSockets;
using System.Text.Json;
using System.Xml;
using KfChatDotNetWsClient.Models;
using KfChatDotNetWsClient.Models.Events;
using KfChatDotNetWsClient.Models.Json;
@@ -14,15 +13,15 @@ namespace KfChatDotNetWsClient;
public class ChatClient
{
public event EventHandlers.OnMessagesEventHandler OnMessages;
public event EventHandlers.OnUsersPartedEventHandler OnUsersParted;
public event EventHandlers.OnUsersJoinedEventHandler OnUsersJoined;
public event EventHandlers.OnWsReconnectEventHandler OnWsReconnect;
public event EventHandlers.OnDeleteMessagesEventHandler OnDeleteMessages;
public event EventHandlers.OnWsDisconnectionEventHandler OnWsDisconnection;
public event EventHandlers.OnFailedToJoinRoom OnFailedToJoinRoom;
public event EventHandlers.OnUnknownCommand OnUnknownCommand;
private WebsocketClient _wsClient;
public event EventHandlers.OnMessagesEventHandler? OnMessages;
public event EventHandlers.OnUsersPartedEventHandler? OnUsersParted;
public event EventHandlers.OnUsersJoinedEventHandler? OnUsersJoined;
public event EventHandlers.OnWsReconnectEventHandler? OnWsReconnect;
public event EventHandlers.OnDeleteMessagesEventHandler? OnDeleteMessages;
public event EventHandlers.OnWsDisconnectionEventHandler? OnWsDisconnection;
public event EventHandlers.OnFailedToJoinRoom? OnFailedToJoinRoom;
public event EventHandlers.OnUnknownCommand? OnUnknownCommand;
private WebsocketClient? _wsClient;
private readonly Logger _logger = LogManager.GetCurrentClassLogger();
private ChatClientConfigModel _config;
public DateTime LastPacketReceived = DateTime.UtcNow;
@@ -49,6 +48,7 @@ public class ChatClient
public void Disconnect()
{
if (_wsClient == null) throw new WebSocketNotInitializedException();
_wsClient.Stop(WebSocketCloseStatus.NormalClosure, "Closing websocket").Wait();
}
@@ -57,11 +57,13 @@ public class ChatClient
// none for reconnect.
public async Task DisconnectAsync()
{
if (_wsClient == null) throw new WebSocketNotInitializedException();
await _wsClient.Stop(WebSocketCloseStatus.NormalClosure, "Closing websocket");
}
public async Task Reconnect()
{
if (_wsClient == null) throw new WebSocketNotInitializedException();
await _wsClient.Reconnect();
}
@@ -144,7 +146,7 @@ public class ChatClient
return;
}
Dictionary<string, object> packetType = new Dictionary<string, object>();
Dictionary<string, object> packetType;
try
{
packetType = JsonSerializer.Deserialize<Dictionary<string, object>>(message.Text)!;
@@ -193,30 +195,35 @@ public class ChatClient
public void JoinRoom(int roomId)
{
_logger.Debug($"Joining {roomId}");
if (_wsClient == null) throw new WebSocketNotInitializedException();
_wsClient.Send($"/join {roomId}");
}
public void SendMessage(string message)
{
_logger.Debug($"Sending '{message}'");
if (_wsClient == null) throw new WebSocketNotInitializedException();
_wsClient.Send(message);
}
public async Task SendMessageInstantAsync(string message)
{
_logger.Debug($"Sending '{message}', bypassing the queue");
if (_wsClient == null) throw new WebSocketNotInitializedException();
await _wsClient.SendInstant(message);
}
public void DeleteMessage(int messageId)
{
_logger.Debug($"Deleting {messageId}");
if (_wsClient == null) throw new WebSocketNotInitializedException();
_wsClient.Send($"/delete {messageId}");
}
public async Task DeleteMessageAsync(int messageId)
{
_logger.Debug($"Deleting {messageId}");
if (_wsClient == null) throw new WebSocketNotInitializedException();
await _wsClient.SendInstant($"/delete {messageId}");
}
@@ -224,6 +231,7 @@ public class ChatClient
{
var payload = JsonSerializer.Serialize(new EditMessageJsonModel {Id = messageId, Message = newMessage});
_logger.Debug($"Editing {messageId} with '{newMessage}'");
if (_wsClient == null) throw new WebSocketNotInitializedException();
_wsClient.Send($"/edit {payload}");
}
@@ -231,21 +239,22 @@ public class ChatClient
{
var payload = JsonSerializer.Serialize(new EditMessageJsonModel {Id = messageId, Message = newMessage});
_logger.Debug($"Editing {messageId} with '{newMessage}'");
if (_wsClient == null) throw new WebSocketNotInitializedException();
await _wsClient.SendInstant($"/edit {payload}");
}
private void WsDeleteMessagesReceived(ResponseMessage message)
{
var data = JsonSerializer.Deserialize<DeleteMessagesJsonModel>(message.Text);
_logger.Debug($"Received delete packet for messages: {string.Join(',', data.MessageIdsToDelete)}");
var data = JsonSerializer.Deserialize<DeleteMessagesJsonModel>(message.Text!);
_logger.Debug($"Received delete packet for messages: {string.Join(',', data!.MessageIdsToDelete)}");
OnDeleteMessages?.Invoke(this, data.MessageIdsToDelete);
}
private void WsChatMessagesReceived(ResponseMessage message)
{
var data = JsonSerializer.Deserialize<MessagesJsonModel>(message.Text);
var data = JsonSerializer.Deserialize<MessagesJsonModel>(message.Text!);
var messages = new List<MessageModel>();
foreach (var chatMessage in data.Messages)
foreach (var chatMessage in data!.Messages)
{
var model = new MessageModel
{
@@ -260,10 +269,12 @@ public class ChatClient
Message = chatMessage.Message,
MessageId = chatMessage.MessageId,
MessageRaw = chatMessage.MessageRaw,
RoomId = chatMessage.RoomId
RoomId = chatMessage.RoomId,
MessageRawHtmlDecoded = WebUtility.HtmlDecode(chatMessage.MessageRaw),
MessageDate = DateTimeOffset.FromUnixTimeSeconds(chatMessage.MessageDate)
};
if(chatMessage.MessageEditDate == 0)
if (chatMessage.MessageEditDate == 0)
{
model.MessageEditDate = null;
}
@@ -272,8 +283,6 @@ public class ChatClient
model.MessageEditDate = DateTimeOffset.FromUnixTimeSeconds(chatMessage.MessageEditDate);
}
model.MessageDate = DateTimeOffset.FromUnixTimeSeconds(chatMessage.MessageDate);
messages.Add(model);
}
_logger.Debug($"Received {messages.Count} chat messages");
@@ -286,9 +295,9 @@ public class ChatClient
private void WsChatUsersJoined(ResponseMessage message)
{
var data = JsonSerializer.Deserialize<UsersJsonModel>(message.Text);
var data = JsonSerializer.Deserialize<UsersJsonModel>(message.Text!);
var users = new List<UserModel>();
foreach (var user in data.Users.Keys)
foreach (var user in data!.Users.Keys)
{
users.Add(new UserModel
{
@@ -306,9 +315,11 @@ public class ChatClient
private void WsChatUsersParted(ResponseMessage message)
{
// {"user":{"1337":false}}
var data = JsonSerializer.Deserialize<Dictionary<string, Dictionary<string, bool>>>(message.Text);
var data = JsonSerializer.Deserialize<Dictionary<string, Dictionary<string, bool>>>(message.Text!);
var usersParted = data!["user"].Select(user => int.Parse(user.Key)).ToList();
_logger.Debug($"Following users have parted: {string.Join(',', usersParted)}");
OnUsersParted?.Invoke(this, usersParted);
}
}
}
public class WebSocketNotInitializedException : Exception;

View File

@@ -5,7 +5,7 @@ public class ChatClientConfigModel
// XF session token. Sent as a cookie to auth the user
public string? XfSessionToken { get; set; }
// Currently wss://kiwifarms.net/chat.ws
public Uri WsUri { get; set; }
public required Uri WsUri { get; set; }
public int ReconnectTimeout { get; set; } = 30;
public string CookieDomain { get; set; } = "kiwifarms.net";
public string? Proxy { get; set; }

View File

@@ -2,17 +2,21 @@ namespace KfChatDotNetWsClient.Models.Events;
public class MessageModel
{
public UserModel Author { get; set; }
public required UserModel Author { get; set; }
/// <summary>
/// HTML formatted message
/// </summary>
public string Message { get; set; }
public int MessageId { get; set; }
public required string Message { get; set; }
public required int MessageId { get; set; }
public DateTimeOffset? MessageEditDate { get; set; }
public DateTimeOffset MessageDate { get; set; }
public required DateTimeOffset MessageDate { get; set; }
/// <summary>
/// Unformatted message with original BB code
/// Unformatted message with original BB code but retaining HTML encoding
/// </summary>
public string MessageRaw { get; set; }
public int RoomId { get; set; }
public required string MessageRaw { get; set; }
public required int RoomId { get; set; }
/// <summary>
/// Unformatted message with original BB code and HTML entities decoded
/// </summary>
public required string MessageRawHtmlDecoded { get; set; }
}

View File

@@ -6,8 +6,8 @@ public class UserModel
/// <summary>
/// Forum display name. Note that it'll be HTML encoded
/// </summary>
public string Username { get; set; }
public Uri AvatarUrl { get; set; }
public required string Username { get; set; }
public Uri? AvatarUrl { get; set; }
// Unset if it's related to a chat message
public DateTimeOffset? LastActivity { get; set; }
}

View File

@@ -5,5 +5,5 @@ namespace KfChatDotNetWsClient.Models.Json;
public class DeleteMessagesJsonModel
{
[JsonPropertyName("delete")]
public List<int> MessageIdsToDelete { get; set; }
public required List<int> MessageIdsToDelete { get; set; }
}

View File

@@ -5,8 +5,8 @@ namespace KfChatDotNetWsClient.Models.Json;
public class EditMessageJsonModel
{
[JsonPropertyName("id")]
public int Id { get; set; }
public required int Id { get; set; }
[JsonPropertyName("message")]
public string Message { get; set; }
public required string Message { get; set; }
}

View File

@@ -30,17 +30,17 @@ public class MessagesJsonModel
[JsonPropertyName("id")]
public int Id { get; set; }
[JsonPropertyName("username")]
public string Username { get; set; }
public required string Username { get; set; }
[JsonPropertyName("avatar_url")]
public Uri AvatarUrl { get; set; }
public Uri? AvatarUrl { get; set; }
}
public class MessageModel
{
[JsonPropertyName("author")]
public AuthorModel Author { get; set; }
public required AuthorModel Author { get; set; }
[JsonPropertyName("message")]
public string Message { get; set; }
public required string Message { get; set; }
[JsonPropertyName("message_id")]
public int MessageId { get; set; }
[JsonPropertyName("message_edit_date")]
@@ -48,11 +48,10 @@ public class MessagesJsonModel
[JsonPropertyName("message_date")]
public int MessageDate { get; set; }
[JsonPropertyName("message_raw")]
public string MessageRaw { get; set; }
public required string MessageRaw { get; set; }
[JsonPropertyName("room_id")]
public int RoomId { get; set; }
}
[JsonPropertyName("messages")]
public List<MessageModel> Messages { get; set; }
[JsonPropertyName("messages")] public List<MessageModel> Messages { get; set; } = [];
}

View File

@@ -19,13 +19,13 @@ public class UsersJsonModel
[JsonPropertyName("id")]
public int Id { get; set; }
[JsonPropertyName("username")]
public string Username { get; set; }
public required string Username { get; set; }
[JsonPropertyName("avatar_url")]
public Uri AvatarUrl { get; set; }
public Uri? AvatarUrl { get; set; }
[JsonPropertyName("last_activity")]
public int LastActivity { get; set; }
}
[JsonPropertyName("users")]
public Dictionary<string, UserModel> Users { get; set; }
public Dictionary<string, UserModel> Users { get; set; } = new();
}