using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;
using gehGassi.Core.Interfaces;
using gehGassi.Dto.Messages;
using Microsoft.AspNetCore.SignalR;
using Microsoft.Extensions.DependencyInjection;
namespace gehGassi.Web.Hubs
{
///
/// Service der den Versand von SignalR-Nachrichten
/// vom Server an die App ermöglicht.
///
public class AppHubSender : IAppHubSender
{
private readonly IHubContext _appHub;
private readonly IAppHubUsers _appHubUsers;
///
/// Erstellt eine Instanz
///
/// Instanz eines IAppHub
/// Instanz eines IAppHubUsers
public AppHubSender(IHubContext appHub, IAppHubUsers appHubUsers)
{
_appHub = appHub;
_appHubUsers = appHubUsers;
}
///
/// Senden eine Nachricht an einen Benutzer
///
/// Benutzer - email
/// Nachricht
/// Task
public async Task MessageForUser(string user, string message)
{
var connectionIds = _appHubUsers.ConnectedUsers[user];
if (connectionIds != null && connectionIds.Any())
{
await _appHub.Clients.Clients(connectionIds).SendAsync("MessageForUser", message);
}
}
///
/// Event wenn sich die Daten eines App-Users geändert haben
///
/// Id des App-Users
/// Liste Benutzer die ignoriert werden soll
/// Task
public async Task AppUserChangedAsync(string appUserId, List ignoreUsers = null)
{
var ignoreList = GetIgnoreList(ignoreUsers);
await _appHub.Clients.Group($"appuser_{appUserId}").SendAsync("AppUserChanged");
}
///
/// Gibt zurück ob ein Benutzer verbunden ist
///
/// Benutzername
/// true wenn verbunden, false sonst
public async Task IsUserConnectedAsync(string userName)
{
await Task.Delay(1);
var connected = _appHubUsers.ConnectedUsers.ContainsKey(userName);
return connected;
}
///
/// Event wenn sich ein Benutzer ausloggen soll
///
/// Id des App-Users
///
public async Task LogoutAsync(string appUserId)
{
await _appHub.Clients.Group($"appuser_{appUserId}").SendAsync("Logout");
}
///
/// Event wenn eine Nachricht für einen Benutzer angekommen ist
///
///
///
public async Task MessageAddedAsync(string appUserId)
{
await _appHub.Clients.Group($"appuser_{appUserId}").SendAsync("MessageAdded");
}
///
/// Event wenn eine Nachricht für einen Benutzer angekommen ist
///
///
///
public async Task SystemMessageAddedAsync(string appUserId)
{
await _appHub.Clients.Group($"appuser_{appUserId}").SendAsync("SystemMessageAdded");
}
///
/// Event wenn sich NewsKategorien geändert haben
///
/// Liste Benutzer die ignoriert werden soll
///
public async Task NewsCategoriesChangedAsync(List ignoreUsers = null)
{
var ignoreList = GetIgnoreList(ignoreUsers);
await _appHub.Clients.AllExcept(ignoreList).SendAsync("NewsCategoriesChanged");
}
#region Helper
///
/// Holen der Connection-IDS für Benutzer die Ignoriert werden sollen
///
/// Liste Benutzernamen die ignoriert werden sollen
/// Liste connectionIds die ignoriert werden sollen
private List GetIgnoreList(List ignoreUsers)
{
var ignoreList = new List();
if (ignoreUsers == null || !ignoreUsers.Any()) return ignoreList;
foreach (var ignoreUser in ignoreUsers.Where(ignoreUser => _appHubUsers.ConnectedUsers.ContainsKey(ignoreUser)))
{
ignoreList.AddRange(_appHubUsers.ConnectedUsers[ignoreUser]);
}
return ignoreList;
}
#endregion
}
}