using Application.Abstractions.Hub; using Microsoft.AspNetCore.SignalR; using Microsoft.Extensions.Logging; namespace Infrastructure.Hubs; /// /// 후원 전용 Hub — OBS 위젯, 리모콘 전용 /// 채널 SID 기반 그룹으로 분리 /// public sealed class DonationHub( ILogger logger ) : Hub { public override async Task OnConnectedAsync() { logger.LogInformation("[DonationHub] Connected: {ConnectionId}", Context.ConnectionId); await base.OnConnectedAsync(); } public override async Task OnDisconnectedAsync(Exception? exception) { logger.LogInformation("[DonationHub] Disconnected: {ConnectionId}", Context.ConnectionId); await base.OnDisconnectedAsync(exception); } /// 채널 그룹 참가 (OBS 위젯, 리모콘에서 호출) public async Task JoinChannel(string widgetToken) { await Groups.AddToGroupAsync(Context.ConnectionId, widgetToken); logger.LogInformation("[DonationHub] {ConnectionId} joined group {WidgetToken}", Context.ConnectionId, widgetToken); } /// 채널 그룹 퇴장 public async Task LeaveChannel(string widgetToken) { await Groups.RemoveFromGroupAsync(Context.ConnectionId, widgetToken); } /// OBS 위젯에서 알림 전달 완료 보고 public async Task AlertDelivered(int alertID) { // Handler에서 처리 — 여기서는 이벤트만 전달 logger.LogInformation("[DonationHub] AlertDelivered: {AlertID}", alertID); } /// OBS 위젯에서 알림 전달 실패 보고 public async Task AlertFailed(int alertID, string reason) { logger.LogWarning("[DonationHub] AlertFailed: {AlertID} — {Reason}", alertID, reason); } }