Updatedededed...? Still needs testing.

This commit is contained in:
2026-04-04 17:06:35 -04:00
parent 3aec6e23b2
commit 7af1295754
4 changed files with 147 additions and 6 deletions

View File

@@ -0,0 +1,55 @@
using System.Collections.Concurrent;
namespace RelayServer.Services.Rtc;
public static class RtcChannelPresenceService
{
private static readonly ConcurrentDictionary<string, string> SessionToChannel = new();
private static readonly ConcurrentDictionary<string, string> SessionToUsername = new();
public static void SetUser(string sessionId, string username)
{
SessionToUsername[sessionId] = username;
}
public static void JoinChannel(string sessionId, string channelId)
{
SessionToChannel[sessionId] = channelId;
}
public static void LeaveChannel(string sessionId)
{
SessionToChannel.TryRemove(sessionId, out _);
}
public static void RemoveSession(string sessionId)
{
SessionToChannel.TryRemove(sessionId, out _);
SessionToUsername.TryRemove(sessionId, out _);
}
public static IReadOnlyList<string> GetSessionsInChannel(string channelId)
{
return SessionToChannel
.Where(x => x.Value == channelId)
.Select(x => x.Key)
.ToList();
}
public static IReadOnlyList<string> GetUsersInChannel(string channelId)
{
var sessionIds = GetSessionsInChannel(channelId);
return sessionIds
.Where(id => SessionToUsername.ContainsKey(id))
.Select(id => SessionToUsername[id])
.Distinct(StringComparer.OrdinalIgnoreCase)
.ToList();
}
public static bool IsInChannel(string sessionId, string channelId)
{
return SessionToChannel.TryGetValue(sessionId, out var currentChannel) &&
string.Equals(currentChannel, channelId, StringComparison.Ordinal);
}
}

View File

@@ -8,12 +8,21 @@ public static class RtcNotificationService
{
public static WebSocketServer? Server { get; set; }
public static void Broadcast(RtcNotificationMessage message)
public static void BroadcastToChannel(RtcNotificationMessage message)
{
if (Server is null)
return;
var host = Server.WebSocketServices["/"];
if (host is null)
return;
var json = JsonSerializer.Serialize(message);
Server.WebSocketServices["/"]?.Sessions.Broadcast(json);
var sessionIds = RtcChannelPresenceService.GetSessionsInChannel(message.ChannelId);
foreach (var sessionId in sessionIds)
{
host.Sessions.SendTo(json, sessionId);
}
}
}