using FreeRedis;
using Mapster;
using Microsoft.AspNetCore.Authorization;
using Microsoft.AspNetCore.SignalR;
using Microsoft.Extensions.Options;
using Volo.Abp.AspNetCore.SignalR;
using Volo.Abp.Caching;
using Yi.Framework.ChatHub.Domain.Shared.Caches;
using Yi.Framework.ChatHub.Domain.Shared.Consts;
using Yi.Framework.ChatHub.Domain.Shared.Model;
namespace Yi.Framework.ChatHub.Domain.SignalRHubs
{
[HubRoute("/hub/chat")]
[Authorize]
public class ChatCenterHub : AbpHub
{
///
/// 使用懒加载防止报错
///
private IRedisClient RedisClient => LazyServiceProvider.LazyGetRequiredService();
///
/// 缓存前缀
///
private string CacheKeyPrefix => LazyServiceProvider.LazyGetRequiredService>().Value.KeyPrefix;
public ChatCenterHub()
{
}
///
/// 用户进入聊天室
///
///
public override async Task OnConnectedAsync()
{
var key = new ChatOnlineUserCacheKey(CacheKeyPrefix);
var item = new ChatOnlineUserCacheItem()
{
UserId = CurrentUser.Id!.Value,
ClientId = Context.ConnectionId,
UserName = CurrentUser.UserName!
};
await RedisClient.HSetAsync(key.GetKey(), key.GetField(CurrentUser.Id!.Value), item);
//连接时,还需要去查询用户包含在的群组,将群主全部加入.Todo
await Groups.AddToGroupAsync(Context.ConnectionId, ChatConst.AllGroupName);
await Clients.All.SendAsync("liveUser", item.Adapt());
}
///
/// 用户退出聊天室
///
///
///
public async override Task OnDisconnectedAsync(Exception? exception)
{
var key = new ChatOnlineUserCacheKey(CacheKeyPrefix);
await RedisClient.HDelAsync(key.GetKey(), key.GetField(CurrentUser.Id!.Value));
await Groups.RemoveFromGroupAsync(Context.ConnectionId, ChatConst.AllGroupName);
await Clients.All.SendAsync("offlineUser", CurrentUser.Id!.Value);
}
}
}