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);
}
}