.github
.idx
DysonNetwork.Sphere
Account
Activity
Auth
Chat
Connection
Handlers
MessageReadHandler.cs
MessageTypingHandler.cs
GeoIpService.cs
IWebSocketPacketHandler.cs
WebSocketController.cs
WebSocketPacket.cs
WebSocketService.cs
Developer
Email
Localization
Migrations
Pages
Permission
Post
Properties
Publisher
Realm
Resources
Sticker
Storage
Wallet
wwwroot
.DS_Store
.gitignore
AppDatabase.cs
Dockerfile
DysonNetwork.Sphere.csproj
DysonNetwork.Sphere.csproj.DotSettings.user
DysonNetwork.Sphere.http
Program.cs
appsettings.json
package.json
postcss.config.js
tailwind.config.js
.dockerignore
.gitignore
DysonNetwork.sln
DysonNetwork.sln.DotSettings.user
compose.yaml
57 lines
1.9 KiB
C#
57 lines
1.9 KiB
C#
using System.Net.WebSockets;
|
|
using DysonNetwork.Sphere.Chat;
|
|
using DysonNetwork.Sphere.Storage;
|
|
using Microsoft.EntityFrameworkCore;
|
|
|
|
namespace DysonNetwork.Sphere.Connection.Handlers;
|
|
|
|
public class MessageTypingHandler(AppDatabase db, ChatRoomService crs, ICacheService cache) : IWebSocketPacketHandler
|
|
{
|
|
public string PacketType => "messages.typing";
|
|
|
|
public async Task HandleAsync(
|
|
Account.Account currentUser,
|
|
string deviceId,
|
|
WebSocketPacket packet,
|
|
WebSocket socket,
|
|
WebSocketService srv
|
|
)
|
|
{
|
|
var request = packet.GetData<ChatController.TypingMessageRequest>();
|
|
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"
|
|
}.ToBytes()),
|
|
WebSocketMessageType.Binary,
|
|
true,
|
|
CancellationToken.None
|
|
);
|
|
return;
|
|
}
|
|
|
|
var sender = await crs.GetChannelMember(currentUser.Id, 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;
|
|
}
|
|
|
|
// Broadcast read statuses
|
|
var otherMembers = (await crs.ListRoomMembers(request.ChatRoomId)).Select(m => m.AccountId).ToList();
|
|
foreach (var member in otherMembers)
|
|
srv.SendPacketToAccount(member, packet);
|
|
}
|
|
} |