69 lines
		
	
	
		
			2.0 KiB
		
	
	
	
		
			C#
		
	
	
	
	
	
			
		
		
	
	
			69 lines
		
	
	
		
			2.0 KiB
		
	
	
	
		
			C#
		
	
	
	
	
	
| using System.Net.WebSockets;
 | |
| using DysonNetwork.Common.Models;
 | |
| using DysonNetwork.Sphere.Chat;
 | |
| using DysonNetwork.Sphere.Storage;
 | |
| using Microsoft.EntityFrameworkCore;
 | |
| using Microsoft.Extensions.Caching.Memory;
 | |
| using Microsoft.Extensions.Internal;
 | |
| using SystemClock = NodaTime.SystemClock;
 | |
| 
 | |
| namespace DysonNetwork.Sphere.Connection.Handlers;
 | |
| 
 | |
| public class MessageReadHandler(
 | |
|     ChatRoomService crs,
 | |
|     FlushBufferService buffer
 | |
| )
 | |
|     : IWebSocketPacketHandler
 | |
| {
 | |
|     public string PacketType => "messages.read";
 | |
| 
 | |
|     public const string ChatMemberCacheKey = "ChatMember_{0}_{1}";
 | |
| 
 | |
|     public async Task HandleAsync(
 | |
|         Account.Account currentUser,
 | |
|         string deviceId,
 | |
|         WebSocketPacket packet,
 | |
|         WebSocket socket,
 | |
|         WebSocketService srv
 | |
|     )
 | |
|     {
 | |
|         var request = packet.GetData<ChatController.MarkMessageReadRequest>();
 | |
|         if (request is null)
 | |
|         {
 | |
|             await socket.SendAsync(
 | |
|                 new ArraySegment<byte>(new WebSocketPacket
 | |
|                 {
 | |
|                     Type = WebSocketPacketType.Error,
 | |
|                     ErrorMessage = "Mark message as read requires you provide the ChatRoomId and MessageId"
 | |
|                 }.ToBytes()),
 | |
|                 WebSocketMessageType.Binary,
 | |
|                 true,
 | |
|                 CancellationToken.None
 | |
|             );
 | |
|             return;
 | |
|         }
 | |
| 
 | |
|         var sender = await crs.GetRoomMember(currentUserId, request.ChatRoomId);
 | |
|         if (sender is null)
 | |
|         {
 | |
|             await socket.SendAsync(
 | |
|                 new ArraySegment<byte>(new WebSocketPacket
 | |
|                 {
 | |
|                     Type = WebSocketPacketType.Error,
 | |
|                     ErrorMessage = "User is not a member of the chat room."
 | |
|                 }.ToBytes()),
 | |
|                 WebSocketMessageType.Binary,
 | |
|                 true,
 | |
|                 CancellationToken.None
 | |
|             );
 | |
|             return;
 | |
|         }
 | |
| 
 | |
|         var readReceipt = new MessageReadReceipt
 | |
|         {
 | |
|             SenderId = sender.Id,
 | |
|         };
 | |
| 
 | |
|         buffer.Enqueue(readReceipt);
 | |
|     }
 | |
| } |