ChatHubService.cs 1.2 KB

12345678910111213141516171819202122232425262728
  1. using Application.Abstractions.Chat;
  2. using Microsoft.AspNetCore.SignalR;
  3. namespace Web.Api.Hubs;
  4. public sealed class ChatHubService(
  5. IHubContext<ChatHub, IChatHubClient> hubContext, IChatConnectionTracker tracker
  6. ) : IChatHubService {
  7. public async Task BroadcastMessageAsync(string roomKey, ChatMessage message, CancellationToken ct = default)
  8. {
  9. await hubContext.Clients.Group($"chat:room:{roomKey}").ReceiveMessage(message);
  10. }
  11. public async Task BroadcastSystemMessageAsync(string roomKey, string message, CancellationToken ct = default)
  12. {
  13. await hubContext.Clients.Group($"chat:room:{roomKey}").ReceiveSystemMessage(message);
  14. }
  15. public async Task KickUserAsync(int memberID, CancellationToken ct = default)
  16. {
  17. // 모든 룸 연결에서 해당 memberID 검색 후 강제 종료
  18. // (룸 간 이동 가능하므로 여러 연결이 있을 수 있음)
  19. // 현재 설계상 tracker.GetByRoomAsync 는 룸 단위라서 서버 전역 검색은 지원 안 함.
  20. // 대신 Kick Pub/Sub 채널을 이용하는 별도 서비스가 처리함 (KickSubscriberService).
  21. await Task.CompletedTask;
  22. }
  23. }