using System.Security.AccessControl; using FreeRedis; using Mapster; using Microsoft.AspNetCore.SignalR; using Microsoft.Extensions.Options; using Volo.Abp.Caching; using Volo.Abp.Domain.Repositories; using Volo.Abp.Domain.Services; using Yi.Framework.ChatHub.Domain.Entities; using Yi.Framework.ChatHub.Domain.Shared.Caches; using Yi.Framework.ChatHub.Domain.Shared.Consts; using Yi.Framework.ChatHub.Domain.Shared.Enums; using Yi.Framework.ChatHub.Domain.Shared.Model; using Yi.Framework.ChatHub.Domain.SignalRHubs; using Yi.Framework.SqlSugarCore.Abstractions; namespace Yi.Framework.ChatHub.Domain.Managers { public class UserMessageManager : DomainService { private IHubContext _hubContext; public ISqlSugarRepository _repository; public UserMessageManager(IHubContext hubContext, ISqlSugarRepository repository) { _hubContext = hubContext; _repository = repository; } /// /// 使用懒加载防止报错 /// private IRedisClient RedisClient => LazyServiceProvider.LazyGetRequiredService(); private string CacheKeyPrefix => LazyServiceProvider.LazyGetRequiredService>().Value.KeyPrefix; /// /// 发送消息 /// /// 消息内容 /// 关联字符 /// public async Task SendMessageAsync(MessageContext context,string relStr=null) { switch (context.MessageType) { case MessageTypeEnum.Personal: var userModel = await GetUserAsync(context.ReceiveId.Value); if (userModel is not null) { await _hubContext.Clients.Client(userModel.ClientId).SendAsync(ChatConst.ClientActionReceiveMsg, context.MessageType,relStr, context); } break; case MessageTypeEnum.Group: throw new NotImplementedException(); break; case MessageTypeEnum.All: await _hubContext.Clients.All.SendAsync(ChatConst.ClientActionReceiveMsg, context.MessageType,relStr, context); break; case MessageTypeEnum.Ai: var userModel2 = await GetUserAsync(context.ReceiveId.Value); if (userModel2 is not null) { await _hubContext.Clients.Client(userModel2.ClientId).SendAsync(ChatConst.ClientActionReceiveMsg, context.MessageType,relStr, context); } break; default: break; } } public async Task CreateMessageStoreAsync(MessageContext context) { await _repository.InsertAsync(context.Adapt()); } public async Task> GetAllUserAsync() { var key = new ChatOnlineUserCacheKey(CacheKeyPrefix); var cacheUsers = (await RedisClient.HGetAllAsync(key.GetKey())).Select(x => System.Text.Json.JsonSerializer.Deserialize(x.Value)).ToList(); return cacheUsers; } public async Task GetUserAsync(Guid userId) { var key = new ChatOnlineUserCacheKey(CacheKeyPrefix); var cacheUserOrNull= await RedisClient.HGetAsync(key.GetKey(), key.GetField(userId)); if (cacheUserOrNull is null) { return null; } var cacheUser = System.Text.Json.JsonSerializer.Deserialize(cacheUserOrNull); return cacheUser; } } }