Browse Source

add im message blocker

pull/305/head
cKey 4 years ago
parent
commit
a071e719b0
  1. 911
      aspnet-core/modules/common/LINGYUN.Abp.EventBus.CAP/modules/common/LINGYUN.Abp.EventBus.CAP/LINGYUN.Abp.EventBus.CAP.xml
  2. 141
      aspnet-core/modules/common/LINGYUN.Abp.IM.SignalR/LINGYUN/Abp/IM/SignalR/Messages/SignalRMessageSenderProvider.cs
  3. 33
      aspnet-core/modules/common/LINGYUN.Abp.IM/LINGYUN/Abp/IM/AbpIMOptions.cs
  4. 9
      aspnet-core/modules/common/LINGYUN.Abp.IM/LINGYUN/Abp/IM/Messages/IMessageBlocker.cs
  5. 45
      aspnet-core/modules/common/LINGYUN.Abp.IM/LINGYUN/Abp/IM/Messages/MessageSendResult.cs
  6. 120
      aspnet-core/modules/common/LINGYUN.Abp.IM/LINGYUN/Abp/IM/Messages/MessageSenderProviderBase.cs
  7. 14
      aspnet-core/modules/common/LINGYUN.Abp.IM/LINGYUN/Abp/IM/Messages/NullMessageBlocker.cs
  8. 106
      aspnet-core/modules/message/LINGYUN.Abp.MessageService.Domain/LINGYUN/Abp/MessageService/Chat/UserChatSetting.cs
  9. 766
      aspnet-core/modules/settings/LINGYUN.Abp.SettingManagement.Application/LINGYUN/Abp/SettingManagement/SettingAppService.cs
  10. 114
      aspnet-core/services/messages/LINGYUN.Abp.MessageService.HttpApi.Host/EventBus/Distributed/ChatMessageEventHandler.cs

911
aspnet-core/modules/common/LINGYUN.Abp.EventBus.CAP/modules/common/LINGYUN.Abp.EventBus.CAP/LINGYUN.Abp.EventBus.CAP.xml

@ -1,455 +1,456 @@
<?xml version="1.0"?> <?xml version="1.0"?>
<doc> <doc>
<assembly> <assembly>
<name>LINGYUN.Abp.EventBus.CAP</name> <name>LINGYUN.Abp.EventBus.CAP</name>
</assembly> </assembly>
<members> <members>
<member name="T:DotNetCore.CAP.ConsumerServiceSelector"> <member name="T:DotNetCore.CAP.ConsumerServiceSelector">
<summary> <summary>
消费者查找器 消费者查找器
</summary> </summary>
</member> </member>
<member name="P:DotNetCore.CAP.ConsumerServiceSelector.CapOptions"> <member name="P:DotNetCore.CAP.ConsumerServiceSelector.CapOptions">
<summary> <summary>
CAP配置 CAP配置
</summary> </summary>
</member> </member>
<member name="P:DotNetCore.CAP.ConsumerServiceSelector.AbpDistributedEventBusOptions"> <member name="P:DotNetCore.CAP.ConsumerServiceSelector.AbpDistributedEventBusOptions">
<summary> <summary>
Abp分布式事件配置 Abp分布式事件配置
</summary> </summary>
</member> </member>
<member name="P:DotNetCore.CAP.ConsumerServiceSelector.ServiceProvider"> <member name="P:DotNetCore.CAP.ConsumerServiceSelector.ServiceProvider">
<summary> <summary>
服务提供者 服务提供者
</summary> </summary>
</member> </member>
<member name="M:DotNetCore.CAP.ConsumerServiceSelector.#ctor(System.IServiceProvider,Microsoft.Extensions.Options.IOptions{DotNetCore.CAP.CapOptions},Microsoft.Extensions.Options.IOptions{Volo.Abp.EventBus.Distributed.AbpDistributedEventBusOptions})"> <member name="M:DotNetCore.CAP.ConsumerServiceSelector.#ctor(System.IServiceProvider,Microsoft.Extensions.Options.IOptions{DotNetCore.CAP.CapOptions},Microsoft.Extensions.Options.IOptions{Volo.Abp.EventBus.Distributed.AbpDistributedEventBusOptions})">
<summary> <summary>
Creates a new <see cref="T:DotNetCore.CAP.Internal.ConsumerServiceSelector" />. Creates a new <see cref="T:DotNetCore.CAP.Internal.ConsumerServiceSelector" />.
</summary> </summary>
</member> </member>
<member name="M:DotNetCore.CAP.ConsumerServiceSelector.FindConsumersFromInterfaceTypes(System.IServiceProvider)"> <member name="M:DotNetCore.CAP.ConsumerServiceSelector.FindConsumersFromInterfaceTypes(System.IServiceProvider)">
<summary> <summary>
查找消费者集合 查找消费者集合
</summary> </summary>
<param name="provider"></param> <param name="provider"></param>
<returns></returns> <returns></returns>
</member> </member>
<member name="M:DotNetCore.CAP.ConsumerServiceSelector.GetHandlerDescription(System.Type,System.Type)"> <member name="M:DotNetCore.CAP.ConsumerServiceSelector.GetHandlerDescription(System.Type,System.Type)">
<summary> <summary>
获取事件处理器集合 获取事件处理器集合
</summary> </summary>
<param name="eventType"></param> <param name="eventType"></param>
<param name="typeInfo"></param> <param name="typeInfo"></param>
<returns></returns> <returns></returns>
</member> </member>
<member name="T:DotNetCore.CAP.Processor.AbpCapExpiresMessageCleanupBackgroundWorker"> <member name="T:DotNetCore.CAP.Processor.AbpCapExpiresMessageCleanupBackgroundWorker">
<summary> <summary>
过期消息清理任务 过期消息清理任务
</summary> </summary>
</member> </member>
<member name="P:DotNetCore.CAP.Processor.AbpCapExpiresMessageCleanupBackgroundWorker.Options"> <member name="P:DotNetCore.CAP.Processor.AbpCapExpiresMessageCleanupBackgroundWorker.Options">
<summary> <summary>
过期消息清理配置 过期消息清理配置
</summary> </summary>
</member> </member>
<member name="P:DotNetCore.CAP.Processor.AbpCapExpiresMessageCleanupBackgroundWorker.Initializer"> <member name="P:DotNetCore.CAP.Processor.AbpCapExpiresMessageCleanupBackgroundWorker.Initializer">
<summary> <summary>
Initializer Initializer
</summary> </summary>
</member> </member>
<member name="P:DotNetCore.CAP.Processor.AbpCapExpiresMessageCleanupBackgroundWorker.Storage"> <member name="P:DotNetCore.CAP.Processor.AbpCapExpiresMessageCleanupBackgroundWorker.Storage">
<summary> <summary>
Storage Storage
</summary> </summary>
</member> </member>
<member name="M:DotNetCore.CAP.Processor.AbpCapExpiresMessageCleanupBackgroundWorker.#ctor(Volo.Abp.Threading.AbpAsyncTimer,DotNetCore.CAP.Persistence.IDataStorage,DotNetCore.CAP.Persistence.IStorageInitializer,Microsoft.Extensions.Options.IOptions{LINGYUN.Abp.EventBus.CAP.AbpCAPEventBusOptions},Microsoft.Extensions.DependencyInjection.IServiceScopeFactory)"> <member name="M:DotNetCore.CAP.Processor.AbpCapExpiresMessageCleanupBackgroundWorker.#ctor(Volo.Abp.Threading.AbpAsyncTimer,DotNetCore.CAP.Persistence.IDataStorage,DotNetCore.CAP.Persistence.IStorageInitializer,Microsoft.Extensions.Options.IOptions{LINGYUN.Abp.EventBus.CAP.AbpCAPEventBusOptions},Microsoft.Extensions.DependencyInjection.IServiceScopeFactory)">
<summary> <summary>
创建过期消息清理任务 创建过期消息清理任务
</summary> </summary>
<param name="timer"></param> <param name="timer"></param>
<param name="storage"></param> <param name="storage"></param>
<param name="initializer"></param> <param name="initializer"></param>
<param name="options"></param> <param name="options"></param>
<param name="serviceScopeFactory"></param> <param name="serviceScopeFactory"></param>
</member> </member>
<member name="M:DotNetCore.CAP.Processor.AbpCapExpiresMessageCleanupBackgroundWorker.DoWorkAsync(Volo.Abp.BackgroundWorkers.PeriodicBackgroundWorkerContext)"> <member name="M:DotNetCore.CAP.Processor.AbpCapExpiresMessageCleanupBackgroundWorker.DoWorkAsync(Volo.Abp.BackgroundWorkers.PeriodicBackgroundWorkerContext)">
<summary> <summary>
异步执行任务 异步执行任务
</summary> </summary>
<param name="workerContext"></param> <param name="workerContext"></param>
<returns></returns> <returns></returns>
</member> </member>
<member name="T:DotNetCore.CAP.Processor.AbpCapProcessingServer"> <member name="T:DotNetCore.CAP.Processor.AbpCapProcessingServer">
<summary> <summary>
CapProcessingServer CapProcessingServer
</summary> </summary>
</member> </member>
<member name="M:DotNetCore.CAP.Processor.AbpCapProcessingServer.#ctor(Microsoft.Extensions.Logging.ILogger{DotNetCore.CAP.Processor.AbpCapProcessingServer},Microsoft.Extensions.Logging.ILoggerFactory,System.IServiceProvider)"> <member name="M:DotNetCore.CAP.Processor.AbpCapProcessingServer.#ctor(Microsoft.Extensions.Logging.ILogger{DotNetCore.CAP.Processor.AbpCapProcessingServer},Microsoft.Extensions.Logging.ILoggerFactory,System.IServiceProvider)">
<summary> <summary>
CapProcessingServer CapProcessingServer
</summary> </summary>
<param name="logger"></param> <param name="logger"></param>
<param name="loggerFactory"></param> <param name="loggerFactory"></param>
<param name="provider"></param> <param name="provider"></param>
</member> </member>
<member name="M:DotNetCore.CAP.Processor.AbpCapProcessingServer.Start"> <member name="M:DotNetCore.CAP.Processor.AbpCapProcessingServer.Start(System.Threading.CancellationToken)">
<summary> <summary>
Start Start
</summary> </summary>
</member> </member>
<member name="M:DotNetCore.CAP.Processor.AbpCapProcessingServer.Pulse"> <member name="M:DotNetCore.CAP.Processor.AbpCapProcessingServer.Pulse">
<summary> <summary>
Pulse Pulse
</summary> </summary>
</member> </member>
<member name="M:DotNetCore.CAP.Processor.AbpCapProcessingServer.Dispose"> <member name="M:DotNetCore.CAP.Processor.AbpCapProcessingServer.Dispose">
<summary> <summary>
Dispose Dispose
</summary> </summary>
</member> </member>
<member name="T:LINGYUN.Abp.EventBus.CAP.AbpCAPEventBusModule"> <member name="T:LINGYUN.Abp.EventBus.CAP.AbpCAPEventBusModule">
<summary> <summary>
AbpCAPEventBusModule AbpCAPEventBusModule
</summary> </summary>
</member> </member>
<member name="M:LINGYUN.Abp.EventBus.CAP.AbpCAPEventBusModule.ConfigureServices(Volo.Abp.Modularity.ServiceConfigurationContext)"> <member name="M:LINGYUN.Abp.EventBus.CAP.AbpCAPEventBusModule.ConfigureServices(Volo.Abp.Modularity.ServiceConfigurationContext)">
<summary> <summary>
ConfigureServices ConfigureServices
</summary> </summary>
<param name="context"></param> <param name="context"></param>
</member> </member>
<member name="M:LINGYUN.Abp.EventBus.CAP.AbpCAPEventBusModule.OnApplicationInitialization(Volo.Abp.ApplicationInitializationContext)"> <member name="M:LINGYUN.Abp.EventBus.CAP.AbpCAPEventBusModule.OnApplicationInitialization(Volo.Abp.ApplicationInitializationContext)">
<summary> <summary>
OnApplicationInitialization OnApplicationInitialization
</summary> </summary>
<param name="context"></param> <param name="context"></param>
</member> </member>
<member name="T:LINGYUN.Abp.EventBus.CAP.AbpCAPEventBusOptions"> <member name="T:LINGYUN.Abp.EventBus.CAP.AbpCAPEventBusOptions">
<summary> <summary>
过期消息清理配置项 过期消息清理配置项
</summary> </summary>
</member> </member>
<member name="P:LINGYUN.Abp.EventBus.CAP.AbpCAPEventBusOptions.NotifyFailedCallback"> <member name="P:LINGYUN.Abp.EventBus.CAP.AbpCAPEventBusOptions.NotifyFailedCallback">
<summary> <summary>
发布消息处理失败通知 发布消息处理失败通知
default: false default: false
</summary> </summary>
</member> </member>
<member name="P:LINGYUN.Abp.EventBus.CAP.AbpCAPEventBusOptions.CleanUpExpiresMessageBatch"> <member name="P:LINGYUN.Abp.EventBus.CAP.AbpCAPEventBusOptions.CleanUpExpiresMessageBatch">
<summary> <summary>
批量清理数量 批量清理数量
default: 1000 default: 1000
</summary> </summary>
</member> </member>
<member name="P:LINGYUN.Abp.EventBus.CAP.AbpCAPEventBusOptions.CleanUpExpiresMessageInterval"> <member name="P:LINGYUN.Abp.EventBus.CAP.AbpCAPEventBusOptions.CleanUpExpiresMessageInterval">
<summary> <summary>
执行间隔(ms) 执行间隔(ms)
default: 3600000 (1 hours) default: 3600000 (1 hours)
</summary> </summary>
</member> </member>
<member name="T:LINGYUN.Abp.EventBus.CAP.AbpCAPExecutionFailedException"> <member name="T:LINGYUN.Abp.EventBus.CAP.AbpCAPExecutionFailedException">
<summary> <summary>
AbpECAPExecutionFailedException AbpECAPExecutionFailedException
</summary> </summary>
</member> </member>
<member name="P:LINGYUN.Abp.EventBus.CAP.AbpCAPExecutionFailedException.MessageType"> <member name="P:LINGYUN.Abp.EventBus.CAP.AbpCAPExecutionFailedException.MessageType">
<summary> <summary>
MessageType MessageType
</summary> </summary>
</member> </member>
<member name="P:LINGYUN.Abp.EventBus.CAP.AbpCAPExecutionFailedException.Origin"> <member name="P:LINGYUN.Abp.EventBus.CAP.AbpCAPExecutionFailedException.Origin">
<summary> <summary>
Message Message
</summary> </summary>
</member> </member>
<member name="M:LINGYUN.Abp.EventBus.CAP.AbpCAPExecutionFailedException.#ctor(DotNetCore.CAP.Messages.MessageType,DotNetCore.CAP.Messages.Message)"> <member name="M:LINGYUN.Abp.EventBus.CAP.AbpCAPExecutionFailedException.#ctor(DotNetCore.CAP.Messages.MessageType,DotNetCore.CAP.Messages.Message)">
<summary> <summary>
constructor constructor
</summary> </summary>
<param name="messageType"></param> <param name="messageType"></param>
<param name="origin"></param> <param name="origin"></param>
</member> </member>
<member name="M:LINGYUN.Abp.EventBus.CAP.AbpCAPExecutionFailedException.#ctor(DotNetCore.CAP.Messages.MessageType,DotNetCore.CAP.Messages.Message,System.String)"> <member name="M:LINGYUN.Abp.EventBus.CAP.AbpCAPExecutionFailedException.#ctor(DotNetCore.CAP.Messages.MessageType,DotNetCore.CAP.Messages.Message,System.String)">
<summary> <summary>
constructor constructor
</summary> </summary>
<param name="messageType"></param> <param name="messageType"></param>
<param name="origin"></param> <param name="origin"></param>
<param name="message"></param> <param name="message"></param>
</member> </member>
<member name="M:LINGYUN.Abp.EventBus.CAP.AbpCAPExecutionFailedException.#ctor(DotNetCore.CAP.Messages.MessageType,DotNetCore.CAP.Messages.Message,System.String,System.Exception)"> <member name="M:LINGYUN.Abp.EventBus.CAP.AbpCAPExecutionFailedException.#ctor(DotNetCore.CAP.Messages.MessageType,DotNetCore.CAP.Messages.Message,System.String,System.Exception)">
<summary> <summary>
constructor constructor
</summary> </summary>
<param name="messageType"></param> <param name="messageType"></param>
<param name="origin"></param> <param name="origin"></param>
<param name="message"></param> <param name="message"></param>
<param name="innerException"></param> <param name="innerException"></param>
</member> </member>
<member name="T:LINGYUN.Abp.EventBus.CAP.AbpCAPMessageExtensions"> <member name="T:LINGYUN.Abp.EventBus.CAP.AbpCAPMessageExtensions">
<summary> <summary>
CAP消息扩展 CAP消息扩展
</summary> </summary>
</member> </member>
<member name="M:LINGYUN.Abp.EventBus.CAP.AbpCAPMessageExtensions.TryGetTenantId(DotNetCore.CAP.Messages.Message,System.Nullable{System.Guid}@)"> <member name="M:LINGYUN.Abp.EventBus.CAP.AbpCAPMessageExtensions.TryGetTenantId(DotNetCore.CAP.Messages.Message,System.Nullable{System.Guid}@)">
<summary> <summary>
尝试获取消息标头中的租户标识 尝试获取消息标头中的租户标识
</summary> </summary>
<param name="message"></param> <param name="message"></param>
<param name="tenantId"></param> <param name="tenantId"></param>
<returns></returns> <returns></returns>
</member> </member>
<member name="M:LINGYUN.Abp.EventBus.CAP.AbpCAPMessageExtensions.GetTenantIdOrNull(DotNetCore.CAP.Messages.Message)"> <member name="M:LINGYUN.Abp.EventBus.CAP.AbpCAPMessageExtensions.GetTenantIdOrNull(DotNetCore.CAP.Messages.Message)">
<summary> <summary>
获取消息标头中的租户标识 获取消息标头中的租户标识
</summary> </summary>
<param name="message"></param> <param name="message"></param>
<returns></returns> <returns></returns>
</member> </member>
<member name="T:LINGYUN.Abp.EventBus.CAP.AbpCAPSubscribeInvoker"> <member name="T:LINGYUN.Abp.EventBus.CAP.AbpCAPSubscribeInvoker">
<summary> <summary>
重写 ISubscribeInvoker 实现 Abp 租户集成 重写 ISubscribeInvoker 实现 Abp 租户集成
</summary> </summary>
</member> </member>
<member name="M:LINGYUN.Abp.EventBus.CAP.AbpCAPSubscribeInvoker.#ctor(Microsoft.Extensions.Logging.ILoggerFactory,System.IServiceProvider,DotNetCore.CAP.Serialization.ISerializer,Volo.Abp.MultiTenancy.ICurrentTenant)"> <member name="M:LINGYUN.Abp.EventBus.CAP.AbpCAPSubscribeInvoker.#ctor(Microsoft.Extensions.Logging.ILoggerFactory,System.IServiceProvider,DotNetCore.CAP.Serialization.ISerializer,Volo.Abp.MultiTenancy.ICurrentTenant)">
<summary> <summary>
AbpCAPSubscribeInvoker AbpCAPSubscribeInvoker
</summary> </summary>
<param name="loggerFactory"></param> <param name="loggerFactory"></param>
<param name="serviceProvider"></param> <param name="serviceProvider"></param>
<param name="serializer"></param> <param name="serializer"></param>
<param name="currentTenant"></param> <param name="currentTenant"></param>
</member> </member>
<member name="M:LINGYUN.Abp.EventBus.CAP.AbpCAPSubscribeInvoker.InvokeAsync(DotNetCore.CAP.Internal.ConsumerContext,System.Threading.CancellationToken)"> <member name="M:LINGYUN.Abp.EventBus.CAP.AbpCAPSubscribeInvoker.InvokeAsync(DotNetCore.CAP.Internal.ConsumerContext,System.Threading.CancellationToken)">
<summary> <summary>
调用订阅者方法 调用订阅者方法
</summary> </summary>
<param name="context"></param> <param name="context"></param>
<param name="cancellationToken"></param> <param name="cancellationToken"></param>
<returns></returns> <returns></returns>
</member> </member>
<member name="M:LINGYUN.Abp.EventBus.CAP.AbpCAPSubscribeInvoker.GetInstance(System.IServiceProvider,DotNetCore.CAP.Internal.ConsumerContext)"> <member name="M:LINGYUN.Abp.EventBus.CAP.AbpCAPSubscribeInvoker.GetInstance(System.IServiceProvider,DotNetCore.CAP.Internal.ConsumerContext)">
<summary> <summary>
获取事件处理类实例 获取事件处理类实例
</summary> </summary>
<param name="provider"></param> <param name="provider"></param>
<param name="context"></param> <param name="context"></param>
<returns></returns> <returns></returns>
</member> </member>
<member name="M:LINGYUN.Abp.EventBus.CAP.AbpCAPSubscribeInvoker.ExecuteWithParameterAsync(LINGYUN.Abp.EventBus.CAP.Internal.ObjectMethodExecutor,System.Object,System.Object[])"> <member name="M:LINGYUN.Abp.EventBus.CAP.AbpCAPSubscribeInvoker.ExecuteWithParameterAsync(LINGYUN.Abp.EventBus.CAP.Internal.ObjectMethodExecutor,System.Object,System.Object[])">
<summary> <summary>
通过给定的类型实例与参数调用订阅者方法 通过给定的类型实例与参数调用订阅者方法
</summary> </summary>
<param name="executor"></param> <param name="executor"></param>
<param name="class"></param> <param name="class"></param>
<param name="parameter"></param> <param name="parameter"></param>
<returns></returns> <returns></returns>
</member> </member>
<member name="T:LINGYUN.Abp.EventBus.CAP.CAPDistributedEventBus"> <member name="T:LINGYUN.Abp.EventBus.CAP.CAPDistributedEventBus">
<summary> <summary>
CAP分布式事件总线 CAP分布式事件总线
</summary> </summary>
</member> </member>
<member name="P:LINGYUN.Abp.EventBus.CAP.CAPDistributedEventBus.AbpDistributedEventBusOptions"> <member name="P:LINGYUN.Abp.EventBus.CAP.CAPDistributedEventBus.AbpDistributedEventBusOptions">
<summary> <summary>
Abp分布式事件总线配置 Abp分布式事件总线配置
</summary> </summary>
</member> </member>
<member name="F:LINGYUN.Abp.EventBus.CAP.CAPDistributedEventBus.CapPublisher"> <member name="F:LINGYUN.Abp.EventBus.CAP.CAPDistributedEventBus.CapPublisher">
<summary> <summary>
CAP消息发布接口 CAP消息发布接口
</summary> </summary>
</member> </member>
<member name="P:LINGYUN.Abp.EventBus.CAP.CAPDistributedEventBus.CustomDistributedEventSubscriber"> <member name="P:LINGYUN.Abp.EventBus.CAP.CAPDistributedEventBus.CustomDistributedEventSubscriber">
<summary> <summary>
自定义事件注册接口 自定义事件注册接口
</summary> </summary>
</member> </member>
<member name="P:LINGYUN.Abp.EventBus.CAP.CAPDistributedEventBus.HandlerFactories"> <member name="P:LINGYUN.Abp.EventBus.CAP.CAPDistributedEventBus.HandlerFactories">
<summary> <summary>
本地事件处理器工厂对象集合 本地事件处理器工厂对象集合
</summary> </summary>
</member> </member>
<member name="P:LINGYUN.Abp.EventBus.CAP.CAPDistributedEventBus.EventTypes"> <member name="P:LINGYUN.Abp.EventBus.CAP.CAPDistributedEventBus.EventTypes">
<summary> <summary>
本地事件集合 本地事件集合
</summary> </summary>
</member> </member>
<member name="P:LINGYUN.Abp.EventBus.CAP.CAPDistributedEventBus.CurrentUser"> <member name="P:LINGYUN.Abp.EventBus.CAP.CAPDistributedEventBus.CurrentUser">
<summary> <summary>
当前用户 当前用户
</summary> </summary>
</member> </member>
<member name="P:LINGYUN.Abp.EventBus.CAP.CAPDistributedEventBus.CurrentClient"> <member name="P:LINGYUN.Abp.EventBus.CAP.CAPDistributedEventBus.CurrentClient">
<summary> <summary>
当前客户端 当前客户端
</summary> </summary>
</member> </member>
<member name="P:LINGYUN.Abp.EventBus.CAP.CAPDistributedEventBus.CancellationTokenProvider"> <member name="P:LINGYUN.Abp.EventBus.CAP.CAPDistributedEventBus.CancellationTokenProvider">
<summary> <summary>
取消令牌 取消令牌
</summary> </summary>
</member> </member>
<member name="M:LINGYUN.Abp.EventBus.CAP.CAPDistributedEventBus.#ctor(Microsoft.Extensions.DependencyInjection.IServiceScopeFactory,Microsoft.Extensions.Options.IOptions{Volo.Abp.EventBus.Distributed.AbpDistributedEventBusOptions},DotNetCore.CAP.ICapPublisher,Volo.Abp.Users.ICurrentUser,Volo.Abp.Clients.ICurrentClient,Volo.Abp.MultiTenancy.ICurrentTenant,Volo.Abp.Threading.ICancellationTokenProvider,LINGYUN.Abp.EventBus.CAP.ICustomDistributedEventSubscriber)"> <member name="M:LINGYUN.Abp.EventBus.CAP.CAPDistributedEventBus.#ctor(Microsoft.Extensions.DependencyInjection.IServiceScopeFactory,Microsoft.Extensions.Options.IOptions{Volo.Abp.EventBus.Distributed.AbpDistributedEventBusOptions},DotNetCore.CAP.ICapPublisher,Volo.Abp.Users.ICurrentUser,Volo.Abp.Clients.ICurrentClient,Volo.Abp.MultiTenancy.ICurrentTenant,Volo.Abp.EventBus.IEventErrorHandler,Volo.Abp.Threading.ICancellationTokenProvider,LINGYUN.Abp.EventBus.CAP.ICustomDistributedEventSubscriber)">
<summary> <summary>
constructor constructor
</summary> </summary>
<param name="serviceScopeFactory"></param> <param name="serviceScopeFactory"></param>
<param name="distributedEventBusOptions"></param> <param name="distributedEventBusOptions"></param>
<param name="capPublisher"></param> <param name="capPublisher"></param>
<param name="currentUser"></param> <param name="currentUser"></param>
<param name="currentTenant"></param> <param name="currentClient"></param>
<param name="currentClient"></param> <param name="currentTenant"></param>
<param name="cancellationTokenProvider"></param> <param name="eventErrorHandler"></param>
<param name="customDistributedEventSubscriber"></param> <param name="cancellationTokenProvider"></param>
</member> <param name="customDistributedEventSubscriber"></param>
<member name="M:LINGYUN.Abp.EventBus.CAP.CAPDistributedEventBus.Subscribe(System.Type,Volo.Abp.EventBus.IEventHandlerFactory)"> </member>
<summary> <member name="M:LINGYUN.Abp.EventBus.CAP.CAPDistributedEventBus.Subscribe(System.Type,Volo.Abp.EventBus.IEventHandlerFactory)">
订阅事件 <summary>
</summary> 订阅事件
<param name="eventType"></param> </summary>
<param name="factory"></param> <param name="eventType"></param>
<returns></returns> <param name="factory"></param>
</member> <returns></returns>
<member name="M:LINGYUN.Abp.EventBus.CAP.CAPDistributedEventBus.Unsubscribe``1(System.Func{``0,System.Threading.Tasks.Task})"> </member>
<summary> <member name="M:LINGYUN.Abp.EventBus.CAP.CAPDistributedEventBus.Unsubscribe``1(System.Func{``0,System.Threading.Tasks.Task})">
退订事件 <summary>
</summary> 退订事件
<typeparam name="TEvent">事件类型</typeparam> </summary>
<param name="action"></param> <typeparam name="TEvent">事件类型</typeparam>
</member> <param name="action"></param>
<member name="M:LINGYUN.Abp.EventBus.CAP.CAPDistributedEventBus.Unsubscribe(System.Type,Volo.Abp.EventBus.IEventHandler)"> </member>
<summary> <member name="M:LINGYUN.Abp.EventBus.CAP.CAPDistributedEventBus.Unsubscribe(System.Type,Volo.Abp.EventBus.IEventHandler)">
退订事件 <summary>
</summary> 退订事件
<param name="eventType">事件类型</param> </summary>
<param name="handler">事件处理器</param> <param name="eventType">事件类型</param>
</member> <param name="handler">事件处理器</param>
<member name="M:LINGYUN.Abp.EventBus.CAP.CAPDistributedEventBus.Unsubscribe(System.Type,Volo.Abp.EventBus.IEventHandlerFactory)"> </member>
<summary> <member name="M:LINGYUN.Abp.EventBus.CAP.CAPDistributedEventBus.Unsubscribe(System.Type,Volo.Abp.EventBus.IEventHandlerFactory)">
退订事件 <summary>
</summary> 退订事件
<param name="eventType">事件类型</param> </summary>
<param name="factory">事件处理器工厂</param> <param name="eventType">事件类型</param>
</member> <param name="factory">事件处理器工厂</param>
<member name="M:LINGYUN.Abp.EventBus.CAP.CAPDistributedEventBus.UnsubscribeAll(System.Type)"> </member>
<summary> <member name="M:LINGYUN.Abp.EventBus.CAP.CAPDistributedEventBus.UnsubscribeAll(System.Type)">
退订所有事件 <summary>
</summary> 退订所有事件
<param name="eventType">事件类型</param> </summary>
</member> <param name="eventType">事件类型</param>
<member name="M:LINGYUN.Abp.EventBus.CAP.CAPDistributedEventBus.Subscribe``1(Volo.Abp.EventBus.Distributed.IDistributedEventHandler{``0})"> </member>
<summary> <member name="M:LINGYUN.Abp.EventBus.CAP.CAPDistributedEventBus.Subscribe``1(Volo.Abp.EventBus.Distributed.IDistributedEventHandler{``0})">
订阅事件 <summary>
</summary> 订阅事件
<typeparam name="TEvent">事件类型</typeparam> </summary>
<param name="handler">事件处理器</param> <typeparam name="TEvent">事件类型</typeparam>
<returns></returns> <param name="handler">事件处理器</param>
</member> <returns></returns>
<member name="M:LINGYUN.Abp.EventBus.CAP.CAPDistributedEventBus.PublishAsync(System.Type,System.Object)"> </member>
<summary> <member name="M:LINGYUN.Abp.EventBus.CAP.CAPDistributedEventBus.PublishAsync(System.Type,System.Object)">
发布事件 <summary>
</summary> 发布事件
<param name="eventType">事件类型</param> </summary>
<param name="eventData">事件数据对象</param> <param name="eventType">事件类型</param>
<returns></returns> <param name="eventData">事件数据对象</param>
</member> <returns></returns>
<member name="M:LINGYUN.Abp.EventBus.CAP.CAPDistributedEventBus.GetHandlerFactories(System.Type)"> </member>
<summary> <member name="M:LINGYUN.Abp.EventBus.CAP.CAPDistributedEventBus.GetHandlerFactories(System.Type)">
获取事件处理器工厂列表 <summary>
</summary> 获取事件处理器工厂列表
<param name="eventType"></param> </summary>
<returns></returns> <param name="eventType"></param>
</member> <returns></returns>
<member name="T:LINGYUN.Abp.EventBus.CAP.ICustomDistributedEventSubscriber"> </member>
<summary> <member name="T:LINGYUN.Abp.EventBus.CAP.ICustomDistributedEventSubscriber">
自定义事件订阅者 <summary>
</summary> 自定义事件订阅者
</member> </summary>
<member name="M:LINGYUN.Abp.EventBus.CAP.ICustomDistributedEventSubscriber.Subscribe(System.Type,Volo.Abp.EventBus.IEventHandlerFactory)"> </member>
<summary> <member name="M:LINGYUN.Abp.EventBus.CAP.ICustomDistributedEventSubscriber.Subscribe(System.Type,Volo.Abp.EventBus.IEventHandlerFactory)">
订阅事件 <summary>
</summary> 订阅事件
<param name="eventType"></param> </summary>
<param name="factory"></param> <param name="eventType"></param>
</member> <param name="factory"></param>
<member name="M:LINGYUN.Abp.EventBus.CAP.ICustomDistributedEventSubscriber.UnSubscribe(System.Type,Volo.Abp.EventBus.IEventHandlerFactory)"> </member>
<summary> <member name="M:LINGYUN.Abp.EventBus.CAP.ICustomDistributedEventSubscriber.UnSubscribe(System.Type,Volo.Abp.EventBus.IEventHandlerFactory)">
取消订阅 <summary>
</summary> 取消订阅
<param name="eventType"></param> </summary>
<param name="factory"></param> <param name="eventType"></param>
</member> <param name="factory"></param>
<member name="M:LINGYUN.Abp.EventBus.CAP.Internal.ObjectMethodExecutor.Execute(System.Object,System.Object[])"> </member>
<summary> <member name="M:LINGYUN.Abp.EventBus.CAP.Internal.ObjectMethodExecutor.Execute(System.Object,System.Object[])">
Executes the configured method on <paramref name="target" />. This can be used whether or not <summary>
the configured method is asynchronous. Executes the configured method on <paramref name="target" />. This can be used whether or not
</summary> the configured method is asynchronous.
<remarks> </summary>
Even if the target method is asynchronous, it's desirable to invoke it using Execute rather than <remarks>
ExecuteAsync if you know at compile time what the return type is, because then you can directly Even if the target method is asynchronous, it's desirable to invoke it using Execute rather than
"await" that value (via a cast), and then the generated code will be able to reference the ExecuteAsync if you know at compile time what the return type is, because then you can directly
resulting awaitable as a value-typed variable. If you use ExecuteAsync instead, the generated "await" that value (via a cast), and then the generated code will be able to reference the
code will have to treat the resulting awaitable as a boxed object, because it doesn't know at resulting awaitable as a value-typed variable. If you use ExecuteAsync instead, the generated
compile time what type it would be. code will have to treat the resulting awaitable as a boxed object, because it doesn't know at
</remarks> compile time what type it would be.
<param name="target">The object whose method is to be executed.</param> </remarks>
<param name="parameters">Parameters to pass to the method.</param> <param name="target">The object whose method is to be executed.</param>
<returns>The method return value.</returns> <param name="parameters">Parameters to pass to the method.</param>
</member> <returns>The method return value.</returns>
<member name="M:LINGYUN.Abp.EventBus.CAP.Internal.ObjectMethodExecutor.ExecuteAsync(System.Object,System.Object[])"> </member>
<summary> <member name="M:LINGYUN.Abp.EventBus.CAP.Internal.ObjectMethodExecutor.ExecuteAsync(System.Object,System.Object[])">
Executes the configured method on <paramref name="target" />. This can only be used if the configured <summary>
method is asynchronous. Executes the configured method on <paramref name="target" />. This can only be used if the configured
</summary> method is asynchronous.
<remarks> </summary>
If you don't know at compile time the type of the method's returned awaitable, you can use ExecuteAsync, <remarks>
which supplies an awaitable-of-object. This always works, but can incur several extra heap allocations If you don't know at compile time the type of the method's returned awaitable, you can use ExecuteAsync,
as compared with using Execute and then using "await" on the result value typecasted to the known which supplies an awaitable-of-object. This always works, but can incur several extra heap allocations
awaitable type. The possible extra heap allocations are for: as compared with using Execute and then using "await" on the result value typecasted to the known
1. The custom awaitable (though usually there's a heap allocation for this anyway, since normally awaitable type. The possible extra heap allocations are for:
it's a reference type, and you normally create a new instance per call). 1. The custom awaitable (though usually there's a heap allocation for this anyway, since normally
2. The custom awaiter (whether or not it's a value type, since if it's not, you need a new instance it's a reference type, and you normally create a new instance per call).
of it, and if it is, it will have to be boxed so the calling code can reference it as an object). 2. The custom awaiter (whether or not it's a value type, since if it's not, you need a new instance
3. The async result value, if it's a value type (it has to be boxed as an object, since the calling of it, and if it is, it will have to be boxed so the calling code can reference it as an object).
code doesn't know what type it's going to be). 3. The async result value, if it's a value type (it has to be boxed as an object, since the calling
</remarks> code doesn't know what type it's going to be).
<param name="target">The object whose method is to be executed.</param> </remarks>
<param name="parameters">Parameters to pass to the method.</param> <param name="target">The object whose method is to be executed.</param>
<returns>An object that you can "await" to get the method return value.</returns> <param name="parameters">Parameters to pass to the method.</param>
</member> <returns>An object that you can "await" to get the method return value.</returns>
<member name="T:LINGYUN.Abp.EventBus.CAP.Internal.ObjectMethodExecutorAwaitable"> </member>
<summary> <member name="T:LINGYUN.Abp.EventBus.CAP.Internal.ObjectMethodExecutorAwaitable">
Provides a common awaitable structure that <see cref="M:LINGYUN.Abp.EventBus.CAP.Internal.ObjectMethodExecutor.ExecuteAsync(System.Object,System.Object[])" /> can <summary>
return, regardless of whether the underlying value is a System.Task, an FSharpAsync, or an Provides a common awaitable structure that <see cref="M:LINGYUN.Abp.EventBus.CAP.Internal.ObjectMethodExecutor.ExecuteAsync(System.Object,System.Object[])" /> can
application-defined custom awaitable. return, regardless of whether the underlying value is a System.Task, an FSharpAsync, or an
</summary> application-defined custom awaitable.
</member> </summary>
<member name="T:LINGYUN.Abp.EventBus.CAP.Internal.ObjectMethodExecutorFSharpSupport"> </member>
<summary> <member name="T:LINGYUN.Abp.EventBus.CAP.Internal.ObjectMethodExecutorFSharpSupport">
Helper for detecting whether a given type is FSharpAsync`1, and if so, supplying <summary>
an <see cref="T:System.Linq.Expressions.Expression" /> for mapping instances of that type to a C# awaitable. Helper for detecting whether a given type is FSharpAsync`1, and if so, supplying
</summary> an <see cref="T:System.Linq.Expressions.Expression" /> for mapping instances of that type to a C# awaitable.
<remarks> </summary>
The main design goal here is to avoid taking a compile-time dependency on <remarks>
FSharp.Core.dll, because non-F# applications wouldn't use it. So all the references The main design goal here is to avoid taking a compile-time dependency on
to FSharp types have to be constructed dynamically at runtime. FSharp.Core.dll, because non-F# applications wouldn't use it. So all the references
</remarks> to FSharp types have to be constructed dynamically at runtime.
</member> </remarks>
<member name="T:Microsoft.Extensions.DependencyInjection.ServiceCollectionExtensions"> </member>
<summary> <member name="T:Microsoft.Extensions.DependencyInjection.ServiceCollectionExtensions">
CAP ServiceCollectionExtensions <summary>
</summary> CAP ServiceCollectionExtensions
</member> </summary>
<member name="M:Microsoft.Extensions.DependencyInjection.ServiceCollectionExtensions.AddCAPEventBus(Microsoft.Extensions.DependencyInjection.IServiceCollection,System.Action{DotNetCore.CAP.CapOptions})"> </member>
<summary> <member name="M:Microsoft.Extensions.DependencyInjection.ServiceCollectionExtensions.AddCAPEventBus(Microsoft.Extensions.DependencyInjection.IServiceCollection,System.Action{DotNetCore.CAP.CapOptions})">
Adds and configures the consistence services for the consistency. <summary>
</summary> Adds and configures the consistence services for the consistency.
<param name="services"></param> </summary>
<param name="capAction"></param> <param name="services"></param>
<returns></returns> <param name="capAction"></param>
</member> <returns></returns>
</members> </member>
</doc> </members>
</doc>

141
aspnet-core/modules/common/LINGYUN.Abp.IM.SignalR/LINGYUN/Abp/IM/SignalR/Messages/SignalRMessageSenderProvider.cs

@ -1,70 +1,71 @@
using LINGYUN.Abp.IM.Messages; using LINGYUN.Abp.IM.Messages;
using LINGYUN.Abp.IM.SignalR.Hubs; using LINGYUN.Abp.IM.SignalR.Hubs;
using LINGYUN.Abp.RealTime.Client; using LINGYUN.Abp.RealTime.Client;
using Microsoft.AspNetCore.SignalR; using Microsoft.AspNetCore.SignalR;
using Microsoft.Extensions.Logging; using Microsoft.Extensions.Logging;
using Microsoft.Extensions.Options; using Microsoft.Extensions.Options;
using System; using System;
using System.Collections.Immutable; using System.Collections.Immutable;
using System.Linq; using System.Linq;
using System.Threading.Tasks; using System.Threading.Tasks;
using Volo.Abp.DependencyInjection;
namespace LINGYUN.Abp.IM.SignalR.Messages
{ namespace LINGYUN.Abp.IM.SignalR.Messages
public class SignalRMessageSenderProvider : MessageSenderProviderBase {
{ public class SignalRMessageSenderProvider : MessageSenderProviderBase
public override string Name => "SignalR"; {
private readonly AbpIMSignalROptions _options; public override string Name => "SignalR";
private readonly AbpIMSignalROptions _options;
private readonly IOnlineClientManager _onlineClientManager;
private readonly IOnlineClientManager _onlineClientManager;
private readonly IHubContext<MessagesHub> _hubContext;
private readonly IHubContext<MessagesHub> _hubContext;
public SignalRMessageSenderProvider(
IOnlineClientManager onlineClientManager, public SignalRMessageSenderProvider(
IHubContext<MessagesHub> hubContext, IOnlineClientManager onlineClientManager,
IServiceProvider serviceProvider, IHubContext<MessagesHub> hubContext,
IOptions<AbpIMSignalROptions> options) IAbpLazyServiceProvider serviceProvider,
: base(serviceProvider) IOptions<AbpIMSignalROptions> options)
{ : base(serviceProvider)
_options = options.Value; {
_hubContext = hubContext; _options = options.Value;
_onlineClientManager = onlineClientManager; _hubContext = hubContext;
} _onlineClientManager = onlineClientManager;
}
protected override async Task SendMessageToGroupAsync(ChatMessage chatMessage)
{ protected override async Task SendMessageToGroupAsync(ChatMessage chatMessage)
var signalRClient = _hubContext.Clients.Group(chatMessage.GroupId); {
if (signalRClient == null) var signalRClient = _hubContext.Clients.Group(chatMessage.GroupId);
{ if (signalRClient == null)
Logger.LogDebug("Can not get group " + chatMessage.GroupId + " from SignalR hub!"); {
return; Logger.LogDebug("Can not get group " + chatMessage.GroupId + " from SignalR hub!");
} return;
}
await signalRClient.SendAsync(_options.GetChatMessageMethod, chatMessage);
} await signalRClient.SendAsync(_options.GetChatMessageMethod, chatMessage);
}
protected override async Task SendMessageToUserAsync(ChatMessage chatMessage)
{ protected override async Task SendMessageToUserAsync(ChatMessage chatMessage)
try {
{ try
var onlineClientContext = new OnlineClientContext(chatMessage.TenantId, chatMessage.ToUserId.Value); {
var onlineClients = _onlineClientManager.GetAllByContext(onlineClientContext); var onlineClientContext = new OnlineClientContext(chatMessage.TenantId, chatMessage.ToUserId.Value);
var onlineClients = _onlineClientManager.GetAllByContext(onlineClientContext);
var onlineClientConnectionIds = onlineClients.Select(client => client.ConnectionId).ToImmutableArray();
var signalRClients = _hubContext.Clients.Clients(onlineClientConnectionIds); var onlineClientConnectionIds = onlineClients.Select(client => client.ConnectionId).ToImmutableArray();
if (signalRClients == null) var signalRClients = _hubContext.Clients.Clients(onlineClientConnectionIds);
{ if (signalRClients == null)
Logger.LogDebug("Can not get user " + onlineClientContext.UserId + " connection from SignalR hub!"); {
return; Logger.LogDebug("Can not get user " + onlineClientContext.UserId + " connection from SignalR hub!");
} return;
await signalRClients.SendAsync(_options.GetChatMessageMethod, chatMessage); }
} await signalRClients.SendAsync(_options.GetChatMessageMethod, chatMessage);
catch (Exception ex) }
{ catch (Exception ex)
Logger.LogWarning("Could not send message to user: {0}", chatMessage.ToUserId); {
Logger.LogWarning("Send to user message error: {0}", ex.Message); Logger.LogWarning("Could not send message to user: {0}", chatMessage.ToUserId);
} Logger.LogWarning("Send to user message error: {0}", ex.Message);
} }
} }
} }
}

33
aspnet-core/modules/common/LINGYUN.Abp.IM/LINGYUN/Abp/IM/AbpIMOptions.cs

@ -1,15 +1,18 @@
using LINGYUN.Abp.IM.Messages; using LINGYUN.Abp.IM.Messages;
using Volo.Abp.Collections; using Volo.Abp.Collections;
namespace LINGYUN.Abp.IM namespace LINGYUN.Abp.IM
{ {
public class AbpIMOptions public class AbpIMOptions
{ {
public ITypeList<IMessageSenderProvider> Providers { get; } /// <summary>
/// 消息发送者
public AbpIMOptions() /// </summary>
{ public ITypeList<IMessageSenderProvider> Providers { get; }
Providers = new TypeList<IMessageSenderProvider>();
} public AbpIMOptions()
} {
} Providers = new TypeList<IMessageSenderProvider>();
}
}
}

9
aspnet-core/modules/common/LINGYUN.Abp.IM/LINGYUN/Abp/IM/Messages/IMessageBlocker.cs

@ -0,0 +1,9 @@
using System.Threading.Tasks;
namespace LINGYUN.Abp.IM.Messages
{
public interface IMessageBlocker
{
Task InterceptAsync(ChatMessage message);
}
}

45
aspnet-core/modules/common/LINGYUN.Abp.IM/LINGYUN/Abp/IM/Messages/MessageSendResult.cs

@ -0,0 +1,45 @@
namespace LINGYUN.Abp.IM.Messages
{
public class MessageSendResult
{
public bool Success { get; }
public string Error { get; }
public int Code { get; }
public string Form { get; }
public string To { get; }
public string Content { get; }
public static MessageSendResult Successed(string form, string to, string content)
{
return new MessageSendResult(form, to, content);
}
public static MessageSendResult Failed(int code, string error, string form, string to, string content)
{
return new MessageSendResult(code, error, form, to, content);
}
private MessageSendResult(
int code,
string error,
string form,
string to,
string content)
{
Code = code;
Error = error;
Form = form;
To = to;
Success = false;
}
private MessageSendResult(
string form,
string to,
string content)
{
Form = form;
To = to;
Content = content;
Success = true;
}
}
}

120
aspnet-core/modules/common/LINGYUN.Abp.IM/LINGYUN/Abp/IM/Messages/MessageSenderProviderBase.cs

@ -1,70 +1,50 @@
using Microsoft.Extensions.DependencyInjection; using Microsoft.Extensions.Logging;
using Microsoft.Extensions.Logging; using Microsoft.Extensions.Logging.Abstractions;
using Microsoft.Extensions.Logging.Abstractions; using System;
using System; using System.Threading.Tasks;
using System.Threading.Tasks; using Volo.Abp.DependencyInjection;
using Volo.Abp.DependencyInjection;
namespace LINGYUN.Abp.IM.Messages
namespace LINGYUN.Abp.IM.Messages {
{ public abstract class MessageSenderProviderBase : IMessageSenderProvider, ITransientDependency
public abstract class MessageSenderProviderBase : IMessageSenderProvider, ITransientDependency {
{ public abstract string Name { get; }
public abstract string Name { get; }
protected IAbpLazyServiceProvider ServiceProvider { get; }
protected IServiceProvider ServiceProvider { get; }
protected ILoggerFactory LoggerFactory => ServiceProvider.LazyGetRequiredService<ILoggerFactory>();
protected readonly object ServiceProviderLock = new object();
protected ILogger Logger => _lazyLogger.Value;
public ILoggerFactory LoggerFactory => LazyGetRequiredService(ref _loggerFactory); private Lazy<ILogger> _lazyLogger => new Lazy<ILogger>(() => LoggerFactory?.CreateLogger(GetType().FullName) ?? NullLogger.Instance, true);
private ILoggerFactory _loggerFactory;
protected MessageSenderProviderBase(IAbpLazyServiceProvider serviceProvider)
protected ILogger Logger => _lazyLogger.Value; {
private Lazy<ILogger> _lazyLogger => new Lazy<ILogger>(() => LoggerFactory?.CreateLogger(GetType().FullName) ?? NullLogger.Instance, true); ServiceProvider = serviceProvider;
}
protected TService LazyGetRequiredService<TService>(ref TService reference)
{ public virtual async Task SendMessageAsync(ChatMessage chatMessage)
if (reference == null) {
{ try
lock (ServiceProviderLock) {
{ if (!chatMessage.GroupId.IsNullOrWhiteSpace())
if (reference == null) {
{ await SendMessageToGroupAsync(chatMessage);
reference = ServiceProvider.GetRequiredService<TService>(); }
} else
} {
} await SendMessageToUserAsync(chatMessage);
}
return reference; }
} catch (Exception ex)
{
protected MessageSenderProviderBase(IServiceProvider serviceProvider) Logger.LogWarning("Could not send message, group: {0}, formUser: {1}, toUser: {2}",
{ chatMessage.GroupId, chatMessage.FormUserName,
ServiceProvider = serviceProvider; chatMessage.ToUserId.HasValue ? chatMessage.ToUserId.ToString() : "None");
} Logger.LogWarning("Send group message error: {0}", ex.Message);
}
public virtual async Task SendMessageAsync(ChatMessage chatMessage) }
{
try protected abstract Task SendMessageToGroupAsync(ChatMessage chatMessage);
{ protected abstract Task SendMessageToUserAsync(ChatMessage chatMessage);
if (!chatMessage.GroupId.IsNullOrWhiteSpace()) }
{ }
await SendMessageToGroupAsync(chatMessage);
}
else
{
await SendMessageToUserAsync(chatMessage);
}
}
catch (Exception ex)
{
Logger.LogWarning("Could not send message, group: {0}, formUser: {1}, toUser: {2}",
chatMessage.GroupId, chatMessage.FormUserName,
chatMessage.ToUserId.HasValue ? chatMessage.ToUserId.ToString() : "None");
Logger.LogWarning("Send group message error: {0}", ex.Message);
}
}
protected abstract Task SendMessageToGroupAsync(ChatMessage chatMessage);
protected abstract Task SendMessageToUserAsync(ChatMessage chatMessage);
}
}

14
aspnet-core/modules/common/LINGYUN.Abp.IM/LINGYUN/Abp/IM/Messages/NullMessageBlocker.cs

@ -0,0 +1,14 @@
using System.Threading.Tasks;
using Volo.Abp.DependencyInjection;
namespace LINGYUN.Abp.IM.Messages
{
[Dependency(TryRegister = true)]
public class NullMessageBlocker : IMessageBlocker, ISingletonDependency
{
public Task InterceptAsync(ChatMessage message)
{
return Task.CompletedTask;
}
}
}

106
aspnet-core/modules/message/LINGYUN.Abp.MessageService.Domain/LINGYUN/Abp/MessageService/Chat/UserChatSetting.cs

@ -1,54 +1,52 @@
using System; using System;
using System.Collections.Generic; using Volo.Abp.Domain.Entities;
using System.Linq; using Volo.Abp.MultiTenancy;
using Volo.Abp.Domain.Entities;
using Volo.Abp.MultiTenancy; namespace LINGYUN.Abp.MessageService.Chat
{
namespace LINGYUN.Abp.MessageService.Chat public class UserChatSetting : Entity<long>, IMultiTenant
{ {
public class UserChatSetting : Entity<long>, IMultiTenant /// <summary>
{ /// 租户
/// <summary> /// </summary>
/// 租户 public virtual Guid? TenantId { get; protected set; }
/// </summary> /// <summary>
public virtual Guid? TenantId { get; protected set; } /// 用户标识
/// <summary> /// </summary>
/// 用户标识 public virtual Guid UserId { get; protected set; }
/// </summary> /// <summary>
public virtual Guid UserId { get; protected set; } /// 允许匿名聊天
/// <summary> /// </summary>
/// 允许匿名聊天 public virtual bool AllowAnonymous { get; set; }
/// </summary> /// <summary>
public virtual bool AllowAnonymous { get; set; } /// 允许添加好友
/// <summary> /// </summary>
/// 允许添加好友 public virtual bool AllowAddFriend { get; set; }
/// </summary> /// <summary>
public virtual bool AllowAddFriend { get; set; } /// 添加好友需要验证
/// <summary> /// </summary>
/// 添加好友需要验证 public virtual bool RequireAddFriendValition { get; set; }
/// </summary> /// <summary>
public virtual bool RequireAddFriendValition { get; set; } /// 允许接收消息
/// <summary> /// </summary>
/// 允许接收消息 public virtual bool AllowReceiveMessage { get; set; }
/// </summary> /// <summary>
public virtual bool AllowReceiveMessage { get; set; } /// 允许发送消息
/// <summary> /// </summary>
/// 允许发送消息 public virtual bool AllowSendMessage { get; set; }
/// </summary> protected UserChatSetting()
public virtual bool AllowSendMessage { get; set; } {
protected UserChatSetting() }
{ public UserChatSetting(Guid userId, Guid? tenantId)
} : this()
public UserChatSetting(Guid userId, Guid? tenantId) {
: this() UserId = userId;
{ TenantId = tenantId;
UserId = userId; AllowAnonymous = false;
TenantId = tenantId; AllowAddFriend = true;
AllowAnonymous = false; AllowReceiveMessage = true;
AllowAddFriend = true; AllowSendMessage = true;
AllowReceiveMessage = true; RequireAddFriendValition = true;
AllowSendMessage = true; }
RequireAddFriendValition = true; }
} }
}
}

766
aspnet-core/modules/settings/LINGYUN.Abp.SettingManagement.Application/LINGYUN/Abp/SettingManagement/SettingAppService.cs

@ -1,377 +1,389 @@
using Microsoft.AspNetCore.Authorization; using Microsoft.AspNetCore.Authorization;
using Microsoft.Extensions.Options; using Microsoft.Extensions.Options;
using System.Collections.Generic; using System.Collections.Generic;
using System.Linq; using System.Linq;
using System.Threading.Tasks; using System.Threading.Tasks;
using Volo.Abp.Account.Settings; using Volo.Abp.Account.Settings;
using Volo.Abp.Application.Dtos; using Volo.Abp.Application.Dtos;
using Volo.Abp.Application.Services; using Volo.Abp.Application.Services;
using Volo.Abp.Caching; using Volo.Abp.Caching;
using Volo.Abp.Emailing; using Volo.Abp.Emailing;
using Volo.Abp.Identity.Settings; using Volo.Abp.Identity.Settings;
using Volo.Abp.Localization; using Volo.Abp.Localization;
using Volo.Abp.MultiTenancy; using Volo.Abp.MultiTenancy;
using Volo.Abp.SettingManagement; using Volo.Abp.SettingManagement;
using Volo.Abp.SettingManagement.Localization; using Volo.Abp.SettingManagement.Localization;
using Volo.Abp.Settings; using Volo.Abp.Settings;
using Volo.Abp.Timing; using Volo.Abp.Timing;
using Volo.Abp.Users; using Volo.Abp.Users;
using Volo.Abp.EventBus.Distributed; using Volo.Abp.EventBus.Distributed;
using Volo.Abp.AspNetCore.Mvc.ApplicationConfigurations; using Volo.Abp.AspNetCore.Mvc.ApplicationConfigurations;
using Volo.Abp.Features;
namespace LINGYUN.Abp.SettingManagement
{ namespace LINGYUN.Abp.SettingManagement
[Authorize(AbpSettingManagementPermissions.Settings.Default)] {
public class SettingAppService : ApplicationService, ISettingAppService [Authorize(AbpSettingManagementPermissions.Settings.Default)]
{ public class SettingAppService : ApplicationService, ISettingAppService
protected AbpLocalizationOptions LocalizationOptions { get; } {
protected AbpLocalizationOptions LocalizationOptions { get; }
protected IDistributedEventBus EventBus { get; }
protected ISettingManager SettingManager { get; } protected IDistributedEventBus EventBus { get; }
protected ISettingDefinitionManager SettingDefinitionManager { get; } protected ISettingManager SettingManager { get; }
protected ISettingDefinitionManager SettingDefinitionManager { get; }
protected IDistributedCache<SettingCacheItem> Cache { get; }
public SettingAppService( protected IDistributedCache<SettingCacheItem> Cache { get; }
IDistributedEventBus eventBus, public SettingAppService(
ISettingManager settingManager, IDistributedEventBus eventBus,
IDistributedCache<SettingCacheItem> cache, ISettingManager settingManager,
IOptions<AbpLocalizationOptions> localizationOptions, IDistributedCache<SettingCacheItem> cache,
ISettingDefinitionManager settingDefinitionManager) IOptions<AbpLocalizationOptions> localizationOptions,
{ ISettingDefinitionManager settingDefinitionManager)
Cache = cache; {
EventBus = eventBus; Cache = cache;
SettingManager = settingManager; EventBus = eventBus;
SettingDefinitionManager = settingDefinitionManager; SettingManager = settingManager;
LocalizationOptions = localizationOptions.Value; SettingDefinitionManager = settingDefinitionManager;
LocalizationResource = typeof(AbpSettingManagementResource); LocalizationOptions = localizationOptions.Value;
} LocalizationResource = typeof(AbpSettingManagementResource);
}
[Authorize(AbpSettingManagementPermissions.Settings.Manager)]
public virtual async Task SetGlobalAsync(UpdateSettingsDto input) [Authorize(AbpSettingManagementPermissions.Settings.Manager)]
{ public virtual async Task SetGlobalAsync(UpdateSettingsDto input)
foreach (var setting in input.Settings) {
{ // 增加特性检查
await SettingManager.SetGlobalAsync(setting.Name, setting.Value); await CheckFeatureAsync();
}
foreach (var setting in input.Settings)
CurrentUnitOfWork.OnCompleted(async () => {
{ await SettingManager.SetGlobalAsync(setting.Name, setting.Value);
// 发送刷新用户缓存事件 }
await EventBus.PublishAsync(new CurrentApplicationConfigurationCacheResetEventData());
}); CurrentUnitOfWork.OnCompleted(async () =>
{
await CurrentUnitOfWork.SaveChangesAsync(); // 发送刷新用户缓存事件
} await EventBus.PublishAsync(new CurrentApplicationConfigurationCacheResetEventData());
});
[Authorize(AbpSettingManagementPermissions.Settings.Manager)]
public virtual async Task SetCurrentTenantAsync(UpdateSettingsDto input) await CurrentUnitOfWork.SaveChangesAsync();
{ }
if (CurrentTenant.IsAvailable)
{ [Authorize(AbpSettingManagementPermissions.Settings.Manager)]
foreach (var setting in input.Settings) public virtual async Task SetCurrentTenantAsync(UpdateSettingsDto input)
{ {
await SettingManager.SetForTenantAsync(CurrentTenant.GetId(), setting.Name, setting.Value); // 增加特性检查
} await CheckFeatureAsync();
CurrentUnitOfWork.OnCompleted(async () => if (CurrentTenant.IsAvailable)
{ {
// 发送刷新用户缓存事件 foreach (var setting in input.Settings)
await EventBus.PublishAsync(new CurrentApplicationConfigurationCacheResetEventData()); {
}); await SettingManager.SetForTenantAsync(CurrentTenant.GetId(), setting.Name, setting.Value);
}
await CurrentUnitOfWork.SaveChangesAsync();
} CurrentUnitOfWork.OnCompleted(async () =>
} {
// 发送刷新用户缓存事件
//[Authorize] await EventBus.PublishAsync(new CurrentApplicationConfigurationCacheResetEventData());
[AllowAnonymous] });
public virtual async Task<ListResultDto<SettingGroupDto>> GetAllForCurrentTenantAsync()
{ await CurrentUnitOfWork.SaveChangesAsync();
return await GetAllForProviderAsync(TenantSettingValueProvider.ProviderName, CurrentTenant.GetId().ToString()); }
} }
[AllowAnonymous] //[Authorize]
public virtual async Task<ListResultDto<SettingGroupDto>> GetAllForGlobalAsync() [AllowAnonymous]
{ public virtual async Task<ListResultDto<SettingGroupDto>> GetAllForCurrentTenantAsync()
return await GetAllForProviderAsync(GlobalSettingValueProvider.ProviderName, null); {
} return await GetAllForProviderAsync(TenantSettingValueProvider.ProviderName, CurrentTenant.GetId().ToString());
}
protected virtual async Task<ListResultDto<SettingGroupDto>> GetAllForProviderAsync(string providerName, string providerKey)
{ [AllowAnonymous]
/* public virtual async Task<ListResultDto<SettingGroupDto>> GetAllForGlobalAsync()
* 2020-11-19 {
* colin@foxmail.com return await GetAllForProviderAsync(GlobalSettingValueProvider.ProviderName, null);
* }
* ,
* protected virtual async Task<ListResultDto<SettingGroupDto>> GetAllForProviderAsync(string providerName, string providerKey)
* Dto的配置服务,, {
* (vue前端已设计为动态表单页面) /*
* * 2020-11-19
* ,, * colin@foxmail.com
*/ *
* ,
var settingGroups = new List<SettingGroupDto>(); *
* Dto的配置服务,,
#region 系统设置 * (vue前端已设计为动态表单页面)
*
var sysSettingGroup = new SettingGroupDto(L["DisplayName:System"], L["Description:System"]); * ,,
// 语言 */
var languageSetting = sysSettingGroup.AddSetting(L["DisplayName:System.Language"], L["Description:System.Language"]);
languageSetting.AddDetail( var settingGroups = new List<SettingGroupDto>();
SettingDefinitionManager.Get(LocalizationSettingNames.DefaultLanguage),
StringLocalizerFactory, #region 系统设置
await SettingManager.GetOrNullAsync(LocalizationSettingNames.DefaultLanguage, providerName, providerKey),
ValueType.Option) var sysSettingGroup = new SettingGroupDto(L["DisplayName:System"], L["Description:System"]);
.AddOptions(LocalizationOptions.Languages.Select(l => new OptionDto(l.DisplayName, l.CultureName))); // 语言
// 时区 var languageSetting = sysSettingGroup.AddSetting(L["DisplayName:System.Language"], L["Description:System.Language"]);
var timingSetting = sysSettingGroup.AddSetting(L["DisplayName:System.Timing"], L["Description:System.Timing"]); languageSetting.AddDetail(
timingSetting.AddDetail( SettingDefinitionManager.Get(LocalizationSettingNames.DefaultLanguage),
SettingDefinitionManager.Get(TimingSettingNames.TimeZone), StringLocalizerFactory,
StringLocalizerFactory, await SettingManager.GetOrNullAsync(LocalizationSettingNames.DefaultLanguage, providerName, providerKey),
await SettingManager.GetOrNullAsync(TimingSettingNames.TimeZone, providerName, providerKey), ValueType.Option)
ValueType.String); .AddOptions(LocalizationOptions.Languages.Select(l => new OptionDto(l.DisplayName, l.CultureName)));
settingGroups.Add(sysSettingGroup); // 时区
var timingSetting = sysSettingGroup.AddSetting(L["DisplayName:System.Timing"], L["Description:System.Timing"]);
#endregion timingSetting.AddDetail(
SettingDefinitionManager.Get(TimingSettingNames.TimeZone),
#region 安全设置 StringLocalizerFactory,
await SettingManager.GetOrNullAsync(TimingSettingNames.TimeZone, providerName, providerKey),
var securitySettingGroup = new SettingGroupDto(L["DisplayName:Security"], L["Description:Security"]); ValueType.String);
settingGroups.Add(sysSettingGroup);
// 用户账户
var accountSetting = securitySettingGroup.AddSetting(L["DisplayName:Security.Account"], L["Description:Security.Account"]); #endregion
// 启用本地登录
accountSetting.AddDetail( #region 安全设置
SettingDefinitionManager.Get(AccountSettingNames.EnableLocalLogin),
StringLocalizerFactory, var securitySettingGroup = new SettingGroupDto(L["DisplayName:Security"], L["Description:Security"]);
await SettingManager.GetOrNullAsync(AccountSettingNames.EnableLocalLogin, providerName, providerKey),
ValueType.Boolean); // 用户账户
accountSetting.AddDetail( var accountSetting = securitySettingGroup.AddSetting(L["DisplayName:Security.Account"], L["Description:Security.Account"]);
SettingDefinitionManager.Get(AccountSettingNames.IsSelfRegistrationEnabled), // 启用本地登录
StringLocalizerFactory, accountSetting.AddDetail(
await SettingManager.GetOrNullAsync(AccountSettingNames.IsSelfRegistrationEnabled, providerName, providerKey), SettingDefinitionManager.Get(AccountSettingNames.EnableLocalLogin),
ValueType.Boolean); StringLocalizerFactory,
await SettingManager.GetOrNullAsync(AccountSettingNames.EnableLocalLogin, providerName, providerKey),
settingGroups.Add(securitySettingGroup); ValueType.Boolean);
accountSetting.AddDetail(
#endregion SettingDefinitionManager.Get(AccountSettingNames.IsSelfRegistrationEnabled),
StringLocalizerFactory,
#region 身份标识设置 await SettingManager.GetOrNullAsync(AccountSettingNames.IsSelfRegistrationEnabled, providerName, providerKey),
ValueType.Boolean);
// 身份标识设置
var identitySetting = new SettingGroupDto(L["DisplayName:Identity"], L["Description:Identity"]); settingGroups.Add(securitySettingGroup);
#region 用户锁定 #endregion
var lockoutSetting = identitySetting.AddSetting(L["DisplayName:Identity.Lockout"], L["Description:Identity.Lockout"]); #region 身份标识设置
lockoutSetting.AddDetail(
SettingDefinitionManager.Get(IdentitySettingNames.Lockout.AllowedForNewUsers), // 身份标识设置
StringLocalizerFactory, var identitySetting = new SettingGroupDto(L["DisplayName:Identity"], L["Description:Identity"]);
await SettingManager.GetOrNullAsync(IdentitySettingNames.Lockout.AllowedForNewUsers, providerName, providerKey),
ValueType.Boolean); #region 用户锁定
lockoutSetting.AddDetail(
SettingDefinitionManager.Get(IdentitySettingNames.Lockout.LockoutDuration), var lockoutSetting = identitySetting.AddSetting(L["DisplayName:Identity.Lockout"], L["Description:Identity.Lockout"]);
StringLocalizerFactory, lockoutSetting.AddDetail(
await SettingManager.GetOrNullAsync(IdentitySettingNames.Lockout.LockoutDuration, providerName, providerKey), SettingDefinitionManager.Get(IdentitySettingNames.Lockout.AllowedForNewUsers),
ValueType.Number); StringLocalizerFactory,
lockoutSetting.AddDetail( await SettingManager.GetOrNullAsync(IdentitySettingNames.Lockout.AllowedForNewUsers, providerName, providerKey),
SettingDefinitionManager.Get(IdentitySettingNames.Lockout.MaxFailedAccessAttempts), ValueType.Boolean);
StringLocalizerFactory, lockoutSetting.AddDetail(
await SettingManager.GetOrNullAsync(IdentitySettingNames.Lockout.MaxFailedAccessAttempts, providerName, providerKey), SettingDefinitionManager.Get(IdentitySettingNames.Lockout.LockoutDuration),
ValueType.Number); StringLocalizerFactory,
await SettingManager.GetOrNullAsync(IdentitySettingNames.Lockout.LockoutDuration, providerName, providerKey),
#endregion ValueType.Number);
lockoutSetting.AddDetail(
#region 用户 SettingDefinitionManager.Get(IdentitySettingNames.Lockout.MaxFailedAccessAttempts),
StringLocalizerFactory,
var userSetting = identitySetting.AddSetting(L["DisplayName:Identity.User"], L["Description:Identity.User"]); await SettingManager.GetOrNullAsync(IdentitySettingNames.Lockout.MaxFailedAccessAttempts, providerName, providerKey),
userSetting.AddDetail( ValueType.Number);
SettingDefinitionManager.Get(IdentitySettingNames.User.IsEmailUpdateEnabled),
StringLocalizerFactory, #endregion
await SettingManager.GetOrNullAsync(IdentitySettingNames.User.IsEmailUpdateEnabled, providerName, providerKey),
ValueType.Boolean); #region 用户
userSetting.AddDetail(
SettingDefinitionManager.Get(IdentitySettingNames.User.IsUserNameUpdateEnabled), var userSetting = identitySetting.AddSetting(L["DisplayName:Identity.User"], L["Description:Identity.User"]);
StringLocalizerFactory, userSetting.AddDetail(
await SettingManager.GetOrNullAsync(IdentitySettingNames.User.IsUserNameUpdateEnabled, providerName, providerKey), SettingDefinitionManager.Get(IdentitySettingNames.User.IsEmailUpdateEnabled),
ValueType.Boolean); StringLocalizerFactory,
userSetting.AddDetail( await SettingManager.GetOrNullAsync(IdentitySettingNames.User.IsEmailUpdateEnabled, providerName, providerKey),
SettingDefinitionManager.Get(LINGYUN.Abp.Identity.Settings.IdentitySettingNames.User.SmsNewUserRegister), ValueType.Boolean);
StringLocalizerFactory, userSetting.AddDetail(
await SettingManager.GetOrNullAsync(LINGYUN.Abp.Identity.Settings.IdentitySettingNames.User.SmsNewUserRegister, providerName, providerKey), SettingDefinitionManager.Get(IdentitySettingNames.User.IsUserNameUpdateEnabled),
ValueType.String); StringLocalizerFactory,
userSetting.AddDetail( await SettingManager.GetOrNullAsync(IdentitySettingNames.User.IsUserNameUpdateEnabled, providerName, providerKey),
SettingDefinitionManager.Get(LINGYUN.Abp.Identity.Settings.IdentitySettingNames.User.SmsResetPassword), ValueType.Boolean);
StringLocalizerFactory, userSetting.AddDetail(
await SettingManager.GetOrNullAsync(LINGYUN.Abp.Identity.Settings.IdentitySettingNames.User.SmsResetPassword, providerName, providerKey), SettingDefinitionManager.Get(LINGYUN.Abp.Identity.Settings.IdentitySettingNames.User.SmsNewUserRegister),
ValueType.String); StringLocalizerFactory,
userSetting.AddDetail( await SettingManager.GetOrNullAsync(LINGYUN.Abp.Identity.Settings.IdentitySettingNames.User.SmsNewUserRegister, providerName, providerKey),
SettingDefinitionManager.Get(LINGYUN.Abp.Identity.Settings.IdentitySettingNames.User.SmsUserSignin), ValueType.String);
StringLocalizerFactory, userSetting.AddDetail(
await SettingManager.GetOrNullAsync(LINGYUN.Abp.Identity.Settings.IdentitySettingNames.User.SmsUserSignin, providerName, providerKey), SettingDefinitionManager.Get(LINGYUN.Abp.Identity.Settings.IdentitySettingNames.User.SmsResetPassword),
ValueType.String); StringLocalizerFactory,
userSetting.AddDetail( await SettingManager.GetOrNullAsync(LINGYUN.Abp.Identity.Settings.IdentitySettingNames.User.SmsResetPassword, providerName, providerKey),
SettingDefinitionManager.Get(LINGYUN.Abp.Identity.Settings.IdentitySettingNames.User.SmsPhoneNumberConfirmed), ValueType.String);
StringLocalizerFactory, userSetting.AddDetail(
await SettingManager.GetOrNullAsync(LINGYUN.Abp.Identity.Settings.IdentitySettingNames.User.SmsPhoneNumberConfirmed, providerName, providerKey), SettingDefinitionManager.Get(LINGYUN.Abp.Identity.Settings.IdentitySettingNames.User.SmsUserSignin),
ValueType.String); StringLocalizerFactory,
userSetting.AddDetail( await SettingManager.GetOrNullAsync(LINGYUN.Abp.Identity.Settings.IdentitySettingNames.User.SmsUserSignin, providerName, providerKey),
SettingDefinitionManager.Get(LINGYUN.Abp.Identity.Settings.IdentitySettingNames.User.SmsRepetInterval), ValueType.String);
StringLocalizerFactory, userSetting.AddDetail(
await SettingManager.GetOrNullAsync(LINGYUN.Abp.Identity.Settings.IdentitySettingNames.User.SmsRepetInterval, providerName, providerKey), SettingDefinitionManager.Get(LINGYUN.Abp.Identity.Settings.IdentitySettingNames.User.SmsPhoneNumberConfirmed),
ValueType.Number); StringLocalizerFactory,
await SettingManager.GetOrNullAsync(LINGYUN.Abp.Identity.Settings.IdentitySettingNames.User.SmsPhoneNumberConfirmed, providerName, providerKey),
#endregion ValueType.String);
userSetting.AddDetail(
#region 登录 SettingDefinitionManager.Get(LINGYUN.Abp.Identity.Settings.IdentitySettingNames.User.SmsRepetInterval),
StringLocalizerFactory,
var signinSetting = identitySetting.AddSetting(L["DisplayName:Identity.SignIn"], L["Description:Identity.SignIn"]); await SettingManager.GetOrNullAsync(LINGYUN.Abp.Identity.Settings.IdentitySettingNames.User.SmsRepetInterval, providerName, providerKey),
signinSetting.AddDetail( ValueType.Number);
SettingDefinitionManager.Get(IdentitySettingNames.SignIn.EnablePhoneNumberConfirmation),
StringLocalizerFactory, #endregion
await SettingManager.GetOrNullAsync(IdentitySettingNames.SignIn.EnablePhoneNumberConfirmation, providerName, providerKey),
ValueType.Boolean); #region 登录
signinSetting.AddDetail(
SettingDefinitionManager.Get(IdentitySettingNames.SignIn.RequireConfirmedEmail), var signinSetting = identitySetting.AddSetting(L["DisplayName:Identity.SignIn"], L["Description:Identity.SignIn"]);
StringLocalizerFactory, signinSetting.AddDetail(
await SettingManager.GetOrNullAsync(IdentitySettingNames.SignIn.RequireConfirmedEmail, providerName, providerKey), SettingDefinitionManager.Get(IdentitySettingNames.SignIn.EnablePhoneNumberConfirmation),
ValueType.Boolean); StringLocalizerFactory,
signinSetting.AddDetail( await SettingManager.GetOrNullAsync(IdentitySettingNames.SignIn.EnablePhoneNumberConfirmation, providerName, providerKey),
SettingDefinitionManager.Get(IdentitySettingNames.SignIn.RequireConfirmedPhoneNumber), ValueType.Boolean);
StringLocalizerFactory, signinSetting.AddDetail(
await SettingManager.GetOrNullAsync(IdentitySettingNames.SignIn.RequireConfirmedPhoneNumber, providerName, providerKey), SettingDefinitionManager.Get(IdentitySettingNames.SignIn.RequireConfirmedEmail),
ValueType.Boolean); StringLocalizerFactory,
await SettingManager.GetOrNullAsync(IdentitySettingNames.SignIn.RequireConfirmedEmail, providerName, providerKey),
#endregion ValueType.Boolean);
signinSetting.AddDetail(
#region 密码 SettingDefinitionManager.Get(IdentitySettingNames.SignIn.RequireConfirmedPhoneNumber),
StringLocalizerFactory,
var passwordSetting = identitySetting.AddSetting(L["DisplayName:Identity.Password"], L["Description:Identity.Password"]); await SettingManager.GetOrNullAsync(IdentitySettingNames.SignIn.RequireConfirmedPhoneNumber, providerName, providerKey),
passwordSetting.AddDetail( ValueType.Boolean);
SettingDefinitionManager.Get(IdentitySettingNames.Password.RequireDigit),
StringLocalizerFactory, #endregion
await SettingManager.GetOrNullAsync(IdentitySettingNames.Password.RequireDigit, providerName, providerKey),
ValueType.Boolean); #region 密码
passwordSetting.AddDetail(
SettingDefinitionManager.Get(IdentitySettingNames.Password.RequiredLength), var passwordSetting = identitySetting.AddSetting(L["DisplayName:Identity.Password"], L["Description:Identity.Password"]);
StringLocalizerFactory, passwordSetting.AddDetail(
await SettingManager.GetOrNullAsync(IdentitySettingNames.Password.RequiredLength, providerName, providerKey), SettingDefinitionManager.Get(IdentitySettingNames.Password.RequireDigit),
ValueType.Number); StringLocalizerFactory,
passwordSetting.AddDetail( await SettingManager.GetOrNullAsync(IdentitySettingNames.Password.RequireDigit, providerName, providerKey),
SettingDefinitionManager.Get(IdentitySettingNames.Password.RequiredUniqueChars), ValueType.Boolean);
StringLocalizerFactory, passwordSetting.AddDetail(
await SettingManager.GetOrNullAsync(IdentitySettingNames.Password.RequiredUniqueChars, providerName, providerKey), SettingDefinitionManager.Get(IdentitySettingNames.Password.RequiredLength),
ValueType.Number); StringLocalizerFactory,
passwordSetting.AddDetail( await SettingManager.GetOrNullAsync(IdentitySettingNames.Password.RequiredLength, providerName, providerKey),
SettingDefinitionManager.Get(IdentitySettingNames.Password.RequireLowercase), ValueType.Number);
StringLocalizerFactory, passwordSetting.AddDetail(
await SettingManager.GetOrNullAsync(IdentitySettingNames.Password.RequireLowercase, providerName, providerKey), SettingDefinitionManager.Get(IdentitySettingNames.Password.RequiredUniqueChars),
ValueType.Boolean); StringLocalizerFactory,
passwordSetting.AddDetail( await SettingManager.GetOrNullAsync(IdentitySettingNames.Password.RequiredUniqueChars, providerName, providerKey),
SettingDefinitionManager.Get(IdentitySettingNames.Password.RequireUppercase), ValueType.Number);
StringLocalizerFactory, passwordSetting.AddDetail(
await SettingManager.GetOrNullAsync(IdentitySettingNames.Password.RequireUppercase, providerName, providerKey), SettingDefinitionManager.Get(IdentitySettingNames.Password.RequireLowercase),
ValueType.Boolean); StringLocalizerFactory,
passwordSetting.AddDetail( await SettingManager.GetOrNullAsync(IdentitySettingNames.Password.RequireLowercase, providerName, providerKey),
SettingDefinitionManager.Get(IdentitySettingNames.Password.RequireNonAlphanumeric), ValueType.Boolean);
StringLocalizerFactory, passwordSetting.AddDetail(
await SettingManager.GetOrNullAsync(IdentitySettingNames.Password.RequireNonAlphanumeric, providerName, providerKey), SettingDefinitionManager.Get(IdentitySettingNames.Password.RequireUppercase),
ValueType.Boolean); StringLocalizerFactory,
await SettingManager.GetOrNullAsync(IdentitySettingNames.Password.RequireUppercase, providerName, providerKey),
#endregion ValueType.Boolean);
passwordSetting.AddDetail(
#region 双因素 SettingDefinitionManager.Get(IdentitySettingNames.Password.RequireNonAlphanumeric),
StringLocalizerFactory,
// Removed See: https://github.com/abpframework/abp/pull/7719 await SettingManager.GetOrNullAsync(IdentitySettingNames.Password.RequireNonAlphanumeric, providerName, providerKey),
//var twoFactorSetting = identitySetting.AddSetting(L["DisplayName:Identity.TwoFactor"], L["Description:Identity.TwoFactor"]); ValueType.Boolean);
//twoFactorSetting.AddDetail(
// SettingDefinitionManager.Get(IdentitySettingNames.TwoFactor.Behaviour), #endregion
// StringLocalizerFactory,
// await SettingManager.GetOrNullAsync(IdentitySettingNames.TwoFactor.Behaviour, providerName, providerKey), #region 双因素
// ValueType.Option)
// .AddOption(IdentityTwoFactorBehaviour.Optional.ToString(), IdentityTwoFactorBehaviour.Optional.ToString()) // Removed See: https://github.com/abpframework/abp/pull/7719
// .AddOption(IdentityTwoFactorBehaviour.Forced.ToString(), IdentityTwoFactorBehaviour.Forced.ToString()) //var twoFactorSetting = identitySetting.AddSetting(L["DisplayName:Identity.TwoFactor"], L["Description:Identity.TwoFactor"]);
// .AddOption(IdentityTwoFactorBehaviour.Disabled.ToString(), IdentityTwoFactorBehaviour.Disabled.ToString()); //twoFactorSetting.AddDetail(
//twoFactorSetting.AddDetail( // SettingDefinitionManager.Get(IdentitySettingNames.TwoFactor.Behaviour),
// SettingDefinitionManager.Get(IdentitySettingNames.TwoFactor.UsersCanChange), // StringLocalizerFactory,
// StringLocalizerFactory, // await SettingManager.GetOrNullAsync(IdentitySettingNames.TwoFactor.Behaviour, providerName, providerKey),
// await SettingManager.GetOrNullAsync(IdentitySettingNames.TwoFactor.UsersCanChange, providerName, providerKey), // ValueType.Option)
// ValueType.Boolean); // .AddOption(IdentityTwoFactorBehaviour.Optional.ToString(), IdentityTwoFactorBehaviour.Optional.ToString())
// .AddOption(IdentityTwoFactorBehaviour.Forced.ToString(), IdentityTwoFactorBehaviour.Forced.ToString())
#endregion // .AddOption(IdentityTwoFactorBehaviour.Disabled.ToString(), IdentityTwoFactorBehaviour.Disabled.ToString());
//twoFactorSetting.AddDetail(
#region 组织机构 // SettingDefinitionManager.Get(IdentitySettingNames.TwoFactor.UsersCanChange),
// StringLocalizerFactory,
var ouSetting = identitySetting.AddSetting(L["DisplayName:Identity.OrganizationUnit"], L["Description:Identity.OrganizationUnit"]); // await SettingManager.GetOrNullAsync(IdentitySettingNames.TwoFactor.UsersCanChange, providerName, providerKey),
ouSetting.AddDetail( // ValueType.Boolean);
SettingDefinitionManager.Get(IdentitySettingNames.OrganizationUnit.MaxUserMembershipCount),
StringLocalizerFactory, #endregion
await SettingManager.GetOrNullAsync(IdentitySettingNames.OrganizationUnit.MaxUserMembershipCount, providerName, providerKey),
ValueType.Number); #region 组织机构
settingGroups.Add(identitySetting); var ouSetting = identitySetting.AddSetting(L["DisplayName:Identity.OrganizationUnit"], L["Description:Identity.OrganizationUnit"]);
ouSetting.AddDetail(
#endregion SettingDefinitionManager.Get(IdentitySettingNames.OrganizationUnit.MaxUserMembershipCount),
StringLocalizerFactory,
#endregion await SettingManager.GetOrNullAsync(IdentitySettingNames.OrganizationUnit.MaxUserMembershipCount, providerName, providerKey),
ValueType.Number);
#region 邮件设置
settingGroups.Add(identitySetting);
var emailSettingGroup = new SettingGroupDto(L["DisplayName:Emailing"], L["Description:Emailing"]);
var defaultMailSetting = emailSettingGroup.AddSetting(L["DisplayName:Emailing.Default"], L["Description:Emailing.Default"]); #endregion
defaultMailSetting.AddDetail(
SettingDefinitionManager.Get(EmailSettingNames.DefaultFromAddress), #endregion
StringLocalizerFactory,
await SettingManager.GetOrNullAsync(EmailSettingNames.DefaultFromAddress, providerName, providerKey), #region 邮件设置
ValueType.String);
defaultMailSetting.AddDetail( var emailSettingGroup = new SettingGroupDto(L["DisplayName:Emailing"], L["Description:Emailing"]);
SettingDefinitionManager.Get(EmailSettingNames.DefaultFromDisplayName), var defaultMailSetting = emailSettingGroup.AddSetting(L["DisplayName:Emailing.Default"], L["Description:Emailing.Default"]);
StringLocalizerFactory, defaultMailSetting.AddDetail(
await SettingManager.GetOrNullAsync(EmailSettingNames.DefaultFromDisplayName, providerName, providerKey), SettingDefinitionManager.Get(EmailSettingNames.DefaultFromAddress),
ValueType.String); StringLocalizerFactory,
await SettingManager.GetOrNullAsync(EmailSettingNames.DefaultFromAddress, providerName, providerKey),
var smtpSetting = emailSettingGroup.AddSetting(L["DisplayName:Emailing.Smtp"], L["Description:Emailing.Smtp"]); ValueType.String);
smtpSetting.AddDetail( defaultMailSetting.AddDetail(
SettingDefinitionManager.Get(EmailSettingNames.Smtp.EnableSsl), SettingDefinitionManager.Get(EmailSettingNames.DefaultFromDisplayName),
StringLocalizerFactory, StringLocalizerFactory,
await SettingManager.GetOrNullAsync(EmailSettingNames.Smtp.EnableSsl, providerName, providerKey), await SettingManager.GetOrNullAsync(EmailSettingNames.DefaultFromDisplayName, providerName, providerKey),
ValueType.Boolean); ValueType.String);
smtpSetting.AddDetail(
SettingDefinitionManager.Get(EmailSettingNames.Smtp.UseDefaultCredentials), var smtpSetting = emailSettingGroup.AddSetting(L["DisplayName:Emailing.Smtp"], L["Description:Emailing.Smtp"]);
StringLocalizerFactory, smtpSetting.AddDetail(
await SettingManager.GetOrNullAsync(EmailSettingNames.Smtp.UseDefaultCredentials, providerName, providerKey), SettingDefinitionManager.Get(EmailSettingNames.Smtp.EnableSsl),
ValueType.Boolean); StringLocalizerFactory,
smtpSetting.AddDetail( await SettingManager.GetOrNullAsync(EmailSettingNames.Smtp.EnableSsl, providerName, providerKey),
SettingDefinitionManager.Get(EmailSettingNames.Smtp.Domain), ValueType.Boolean);
StringLocalizerFactory, smtpSetting.AddDetail(
await SettingManager.GetOrNullAsync(EmailSettingNames.Smtp.Domain, providerName, providerKey), SettingDefinitionManager.Get(EmailSettingNames.Smtp.UseDefaultCredentials),
ValueType.String); StringLocalizerFactory,
smtpSetting.AddDetail( await SettingManager.GetOrNullAsync(EmailSettingNames.Smtp.UseDefaultCredentials, providerName, providerKey),
SettingDefinitionManager.Get(EmailSettingNames.Smtp.Host), ValueType.Boolean);
StringLocalizerFactory, smtpSetting.AddDetail(
await SettingManager.GetOrNullAsync(EmailSettingNames.Smtp.Host, providerName, providerKey), SettingDefinitionManager.Get(EmailSettingNames.Smtp.Domain),
ValueType.String); StringLocalizerFactory,
smtpSetting.AddDetail( await SettingManager.GetOrNullAsync(EmailSettingNames.Smtp.Domain, providerName, providerKey),
SettingDefinitionManager.Get(EmailSettingNames.Smtp.Port), ValueType.String);
StringLocalizerFactory, smtpSetting.AddDetail(
await SettingManager.GetOrNullAsync(EmailSettingNames.Smtp.Port, providerName, providerKey), SettingDefinitionManager.Get(EmailSettingNames.Smtp.Host),
ValueType.Number); StringLocalizerFactory,
smtpSetting.AddDetail( await SettingManager.GetOrNullAsync(EmailSettingNames.Smtp.Host, providerName, providerKey),
SettingDefinitionManager.Get(EmailSettingNames.Smtp.UserName), ValueType.String);
StringLocalizerFactory, smtpSetting.AddDetail(
await SettingManager.GetOrNullAsync(EmailSettingNames.Smtp.UserName, providerName, providerKey), SettingDefinitionManager.Get(EmailSettingNames.Smtp.Port),
ValueType.String); StringLocalizerFactory,
smtpSetting.AddDetail( await SettingManager.GetOrNullAsync(EmailSettingNames.Smtp.Port, providerName, providerKey),
SettingDefinitionManager.Get(EmailSettingNames.Smtp.Password), ValueType.Number);
StringLocalizerFactory, smtpSetting.AddDetail(
await SettingManager.GetOrNullAsync(EmailSettingNames.Smtp.Password, providerName, providerKey), SettingDefinitionManager.Get(EmailSettingNames.Smtp.UserName),
ValueType.String); StringLocalizerFactory,
await SettingManager.GetOrNullAsync(EmailSettingNames.Smtp.UserName, providerName, providerKey),
settingGroups.Add(emailSettingGroup); ValueType.String);
smtpSetting.AddDetail(
#endregion SettingDefinitionManager.Get(EmailSettingNames.Smtp.Password),
StringLocalizerFactory,
return new ListResultDto<SettingGroupDto>(settingGroups); await SettingManager.GetOrNullAsync(EmailSettingNames.Smtp.Password, providerName, providerKey),
} ValueType.String);
}
} settingGroups.Add(emailSettingGroup);
#endregion
return new ListResultDto<SettingGroupDto>(settingGroups);
}
protected virtual async Task CheckFeatureAsync()
{
await FeatureChecker.CheckEnabledAsync(SettingManagementFeatures.Enable);
}
}
}

114
aspnet-core/services/messages/LINGYUN.Abp.MessageService.HttpApi.Host/EventBus/Distributed/ChatMessageEventHandler.cs

@ -1,53 +1,61 @@
using LINGYUN.Abp.IM; using LINGYUN.Abp.IM;
using LINGYUN.Abp.IM.Messages; using LINGYUN.Abp.IM.Messages;
using LINGYUN.Abp.RealTime; using LINGYUN.Abp.RealTime;
using Microsoft.Extensions.Logging; using Microsoft.Extensions.Logging;
using Microsoft.Extensions.Logging.Abstractions; using Microsoft.Extensions.Logging.Abstractions;
using Microsoft.Extensions.Options; using Microsoft.Extensions.Options;
using System.Threading.Tasks; using System.Threading.Tasks;
using Volo.Abp.DependencyInjection; using Volo.Abp.DependencyInjection;
using Volo.Abp.EventBus.Distributed; using Volo.Abp.EventBus.Distributed;
namespace LINGYUN.Abp.MessageService.EventBus.Distributed namespace LINGYUN.Abp.MessageService.EventBus.Distributed
{ {
public class ChatMessageEventHandler : IDistributedEventHandler<RealTimeEto<ChatMessage>>, ITransientDependency public class ChatMessageEventHandler : IDistributedEventHandler<RealTimeEto<ChatMessage>>, ITransientDependency
{ {
/// <summary> /// <summary>
/// Reference to <see cref="ILogger<DefaultNotificationDispatcher>"/>. /// Reference to <see cref="ILogger<DefaultNotificationDispatcher>"/>.
/// </summary> /// </summary>
public ILogger<ChatMessageEventHandler> Logger { get; set; } public ILogger<ChatMessageEventHandler> Logger { get; set; }
/// <summary> /// <summary>
/// Reference to <see cref="AbpIMOptions"/>. /// Reference to <see cref="AbpIMOptions"/>.
/// </summary> /// </summary>
protected AbpIMOptions Options { get; } protected AbpIMOptions Options { get; }
protected IMessageStore MessageStore { get; } protected IMessageStore MessageStore { get; }
protected IMessageSenderProviderManager MessageSenderProviderManager { get; } protected IMessageBlocker MessageBlocker { get; }
protected IMessageSenderProviderManager MessageSenderProviderManager { get; }
public ChatMessageEventHandler(
IOptions<AbpIMOptions> options, public ChatMessageEventHandler(
IMessageStore messageStore, IOptions<AbpIMOptions> options,
IMessageSenderProviderManager messageSenderProviderManager) IMessageStore messageStore,
{ IMessageBlocker messageBlocker,
Options = options.Value; IMessageSenderProviderManager messageSenderProviderManager)
MessageStore = messageStore; {
MessageSenderProviderManager = messageSenderProviderManager; Options = options.Value;
MessageStore = messageStore;
Logger = NullLogger<ChatMessageEventHandler>.Instance; MessageBlocker = messageBlocker;
} MessageSenderProviderManager = messageSenderProviderManager;
public virtual async Task HandleEventAsync(RealTimeEto<ChatMessage> eventData) Logger = NullLogger<ChatMessageEventHandler>.Instance;
{ }
Logger.LogDebug($"Persistent chat message.");
public virtual async Task HandleEventAsync(RealTimeEto<ChatMessage> eventData)
await MessageStore.StoreMessageAsync(eventData.Data); {
Logger.LogDebug($"Persistent chat message.");
// 发送消息
foreach (var provider in MessageSenderProviderManager.Providers) var message = eventData.Data;
{ // 消息拦截
Logger.LogDebug($"Sending message with provider {provider.Name}"); // 扩展敏感词汇过滤
await provider.SendMessageAsync(eventData.Data); await MessageBlocker.InterceptAsync(message);
}
} await MessageStore.StoreMessageAsync(message);
}
} // 发送消息
foreach (var provider in MessageSenderProviderManager.Providers)
{
Logger.LogDebug($"Sending message with provider {provider.Name}");
await provider.SendMessageAsync(message);
}
}
}
}

Loading…
Cancel
Save