mirror of
https://github.com/barelyprofessional/KfChatDotNet.git
synced 2026-05-02 04:22:04 -04:00
Refactored to fix compiler warnings
This commit is contained in:
@@ -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;
|
||||
@@ -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; }
|
||||
|
||||
@@ -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; }
|
||||
}
|
||||
@@ -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; }
|
||||
}
|
||||
@@ -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; }
|
||||
}
|
||||
@@ -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; }
|
||||
}
|
||||
@@ -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; } = [];
|
||||
}
|
||||
@@ -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();
|
||||
}
|
||||
Reference in New Issue
Block a user