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"?>
<doc>
<assembly>
<name>LINGYUN.Abp.EventBus.CAP</name>
</assembly>
<members>
<member name="T:DotNetCore.CAP.ConsumerServiceSelector">
<summary>
消费者查找器
</summary>
</member>
<member name="P:DotNetCore.CAP.ConsumerServiceSelector.CapOptions">
<summary>
CAP配置
</summary>
</member>
<member name="P:DotNetCore.CAP.ConsumerServiceSelector.AbpDistributedEventBusOptions">
<summary>
Abp分布式事件配置
</summary>
</member>
<member name="P:DotNetCore.CAP.ConsumerServiceSelector.ServiceProvider">
<summary>
服务提供者
</summary>
</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})">
<summary>
Creates a new <see cref="T:DotNetCore.CAP.Internal.ConsumerServiceSelector" />.
</summary>
</member>
<member name="M:DotNetCore.CAP.ConsumerServiceSelector.FindConsumersFromInterfaceTypes(System.IServiceProvider)">
<summary>
查找消费者集合
</summary>
<param name="provider"></param>
<returns></returns>
</member>
<member name="M:DotNetCore.CAP.ConsumerServiceSelector.GetHandlerDescription(System.Type,System.Type)">
<summary>
获取事件处理器集合
</summary>
<param name="eventType"></param>
<param name="typeInfo"></param>
<returns></returns>
</member>
<member name="T:DotNetCore.CAP.Processor.AbpCapExpiresMessageCleanupBackgroundWorker">
<summary>
过期消息清理任务
</summary>
</member>
<member name="P:DotNetCore.CAP.Processor.AbpCapExpiresMessageCleanupBackgroundWorker.Options">
<summary>
过期消息清理配置
</summary>
</member>
<member name="P:DotNetCore.CAP.Processor.AbpCapExpiresMessageCleanupBackgroundWorker.Initializer">
<summary>
Initializer
</summary>
</member>
<member name="P:DotNetCore.CAP.Processor.AbpCapExpiresMessageCleanupBackgroundWorker.Storage">
<summary>
Storage
</summary>
</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)">
<summary>
创建过期消息清理任务
</summary>
<param name="timer"></param>
<param name="storage"></param>
<param name="initializer"></param>
<param name="options"></param>
<param name="serviceScopeFactory"></param>
</member>
<member name="M:DotNetCore.CAP.Processor.AbpCapExpiresMessageCleanupBackgroundWorker.DoWorkAsync(Volo.Abp.BackgroundWorkers.PeriodicBackgroundWorkerContext)">
<summary>
异步执行任务
</summary>
<param name="workerContext"></param>
<returns></returns>
</member>
<member name="T:DotNetCore.CAP.Processor.AbpCapProcessingServer">
<summary>
CapProcessingServer
</summary>
</member>
<member name="M:DotNetCore.CAP.Processor.AbpCapProcessingServer.#ctor(Microsoft.Extensions.Logging.ILogger{DotNetCore.CAP.Processor.AbpCapProcessingServer},Microsoft.Extensions.Logging.ILoggerFactory,System.IServiceProvider)">
<summary>
CapProcessingServer
</summary>
<param name="logger"></param>
<param name="loggerFactory"></param>
<param name="provider"></param>
</member>
<member name="M:DotNetCore.CAP.Processor.AbpCapProcessingServer.Start">
<summary>
Start
</summary>
</member>
<member name="M:DotNetCore.CAP.Processor.AbpCapProcessingServer.Pulse">
<summary>
Pulse
</summary>
</member>
<member name="M:DotNetCore.CAP.Processor.AbpCapProcessingServer.Dispose">
<summary>
Dispose
</summary>
</member>
<member name="T:LINGYUN.Abp.EventBus.CAP.AbpCAPEventBusModule">
<summary>
AbpCAPEventBusModule
</summary>
</member>
<member name="M:LINGYUN.Abp.EventBus.CAP.AbpCAPEventBusModule.ConfigureServices(Volo.Abp.Modularity.ServiceConfigurationContext)">
<summary>
ConfigureServices
</summary>
<param name="context"></param>
</member>
<member name="M:LINGYUN.Abp.EventBus.CAP.AbpCAPEventBusModule.OnApplicationInitialization(Volo.Abp.ApplicationInitializationContext)">
<summary>
OnApplicationInitialization
</summary>
<param name="context"></param>
</member>
<member name="T:LINGYUN.Abp.EventBus.CAP.AbpCAPEventBusOptions">
<summary>
过期消息清理配置项
</summary>
</member>
<member name="P:LINGYUN.Abp.EventBus.CAP.AbpCAPEventBusOptions.NotifyFailedCallback">
<summary>
发布消息处理失败通知
default: false
</summary>
</member>
<member name="P:LINGYUN.Abp.EventBus.CAP.AbpCAPEventBusOptions.CleanUpExpiresMessageBatch">
<summary>
批量清理数量
default: 1000
</summary>
</member>
<member name="P:LINGYUN.Abp.EventBus.CAP.AbpCAPEventBusOptions.CleanUpExpiresMessageInterval">
<summary>
执行间隔(ms)
default: 3600000 (1 hours)
</summary>
</member>
<member name="T:LINGYUN.Abp.EventBus.CAP.AbpCAPExecutionFailedException">
<summary>
AbpECAPExecutionFailedException
</summary>
</member>
<member name="P:LINGYUN.Abp.EventBus.CAP.AbpCAPExecutionFailedException.MessageType">
<summary>
MessageType
</summary>
</member>
<member name="P:LINGYUN.Abp.EventBus.CAP.AbpCAPExecutionFailedException.Origin">
<summary>
Message
</summary>
</member>
<member name="M:LINGYUN.Abp.EventBus.CAP.AbpCAPExecutionFailedException.#ctor(DotNetCore.CAP.Messages.MessageType,DotNetCore.CAP.Messages.Message)">
<summary>
constructor
</summary>
<param name="messageType"></param>
<param name="origin"></param>
</member>
<member name="M:LINGYUN.Abp.EventBus.CAP.AbpCAPExecutionFailedException.#ctor(DotNetCore.CAP.Messages.MessageType,DotNetCore.CAP.Messages.Message,System.String)">
<summary>
constructor
</summary>
<param name="messageType"></param>
<param name="origin"></param>
<param name="message"></param>
</member>
<member name="M:LINGYUN.Abp.EventBus.CAP.AbpCAPExecutionFailedException.#ctor(DotNetCore.CAP.Messages.MessageType,DotNetCore.CAP.Messages.Message,System.String,System.Exception)">
<summary>
constructor
</summary>
<param name="messageType"></param>
<param name="origin"></param>
<param name="message"></param>
<param name="innerException"></param>
</member>
<member name="T:LINGYUN.Abp.EventBus.CAP.AbpCAPMessageExtensions">
<summary>
CAP消息扩展
</summary>
</member>
<member name="M:LINGYUN.Abp.EventBus.CAP.AbpCAPMessageExtensions.TryGetTenantId(DotNetCore.CAP.Messages.Message,System.Nullable{System.Guid}@)">
<summary>
尝试获取消息标头中的租户标识
</summary>
<param name="message"></param>
<param name="tenantId"></param>
<returns></returns>
</member>
<member name="M:LINGYUN.Abp.EventBus.CAP.AbpCAPMessageExtensions.GetTenantIdOrNull(DotNetCore.CAP.Messages.Message)">
<summary>
获取消息标头中的租户标识
</summary>
<param name="message"></param>
<returns></returns>
</member>
<member name="T:LINGYUN.Abp.EventBus.CAP.AbpCAPSubscribeInvoker">
<summary>
重写 ISubscribeInvoker 实现 Abp 租户集成
</summary>
</member>
<member name="M:LINGYUN.Abp.EventBus.CAP.AbpCAPSubscribeInvoker.#ctor(Microsoft.Extensions.Logging.ILoggerFactory,System.IServiceProvider,DotNetCore.CAP.Serialization.ISerializer,Volo.Abp.MultiTenancy.ICurrentTenant)">
<summary>
AbpCAPSubscribeInvoker
</summary>
<param name="loggerFactory"></param>
<param name="serviceProvider"></param>
<param name="serializer"></param>
<param name="currentTenant"></param>
</member>
<member name="M:LINGYUN.Abp.EventBus.CAP.AbpCAPSubscribeInvoker.InvokeAsync(DotNetCore.CAP.Internal.ConsumerContext,System.Threading.CancellationToken)">
<summary>
调用订阅者方法
</summary>
<param name="context"></param>
<param name="cancellationToken"></param>
<returns></returns>
</member>
<member name="M:LINGYUN.Abp.EventBus.CAP.AbpCAPSubscribeInvoker.GetInstance(System.IServiceProvider,DotNetCore.CAP.Internal.ConsumerContext)">
<summary>
获取事件处理类实例
</summary>
<param name="provider"></param>
<param name="context"></param>
<returns></returns>
</member>
<member name="M:LINGYUN.Abp.EventBus.CAP.AbpCAPSubscribeInvoker.ExecuteWithParameterAsync(LINGYUN.Abp.EventBus.CAP.Internal.ObjectMethodExecutor,System.Object,System.Object[])">
<summary>
通过给定的类型实例与参数调用订阅者方法
</summary>
<param name="executor"></param>
<param name="class"></param>
<param name="parameter"></param>
<returns></returns>
</member>
<member name="T:LINGYUN.Abp.EventBus.CAP.CAPDistributedEventBus">
<summary>
CAP分布式事件总线
</summary>
</member>
<member name="P:LINGYUN.Abp.EventBus.CAP.CAPDistributedEventBus.AbpDistributedEventBusOptions">
<summary>
Abp分布式事件总线配置
</summary>
</member>
<member name="F:LINGYUN.Abp.EventBus.CAP.CAPDistributedEventBus.CapPublisher">
<summary>
CAP消息发布接口
</summary>
</member>
<member name="P:LINGYUN.Abp.EventBus.CAP.CAPDistributedEventBus.CustomDistributedEventSubscriber">
<summary>
自定义事件注册接口
</summary>
</member>
<member name="P:LINGYUN.Abp.EventBus.CAP.CAPDistributedEventBus.HandlerFactories">
<summary>
本地事件处理器工厂对象集合
</summary>
</member>
<member name="P:LINGYUN.Abp.EventBus.CAP.CAPDistributedEventBus.EventTypes">
<summary>
本地事件集合
</summary>
</member>
<member name="P:LINGYUN.Abp.EventBus.CAP.CAPDistributedEventBus.CurrentUser">
<summary>
当前用户
</summary>
</member>
<member name="P:LINGYUN.Abp.EventBus.CAP.CAPDistributedEventBus.CurrentClient">
<summary>
当前客户端
</summary>
</member>
<member name="P:LINGYUN.Abp.EventBus.CAP.CAPDistributedEventBus.CancellationTokenProvider">
<summary>
取消令牌
</summary>
</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)">
<summary>
constructor
</summary>
<param name="serviceScopeFactory"></param>
<param name="distributedEventBusOptions"></param>
<param name="capPublisher"></param>
<param name="currentUser"></param>
<param name="currentTenant"></param>
<param name="currentClient"></param>
<param name="cancellationTokenProvider"></param>
<param name="customDistributedEventSubscriber"></param>
</member>
<member name="M:LINGYUN.Abp.EventBus.CAP.CAPDistributedEventBus.Subscribe(System.Type,Volo.Abp.EventBus.IEventHandlerFactory)">
<summary>
订阅事件
</summary>
<param name="eventType"></param>
<param name="factory"></param>
<returns></returns>
</member>
<member name="M:LINGYUN.Abp.EventBus.CAP.CAPDistributedEventBus.Unsubscribe``1(System.Func{``0,System.Threading.Tasks.Task})">
<summary>
退订事件
</summary>
<typeparam name="TEvent">事件类型</typeparam>
<param name="action"></param>
</member>
<member name="M:LINGYUN.Abp.EventBus.CAP.CAPDistributedEventBus.Unsubscribe(System.Type,Volo.Abp.EventBus.IEventHandler)">
<summary>
退订事件
</summary>
<param name="eventType">事件类型</param>
<param name="handler">事件处理器</param>
</member>
<member name="M:LINGYUN.Abp.EventBus.CAP.CAPDistributedEventBus.Unsubscribe(System.Type,Volo.Abp.EventBus.IEventHandlerFactory)">
<summary>
退订事件
</summary>
<param name="eventType">事件类型</param>
<param name="factory">事件处理器工厂</param>
</member>
<member name="M:LINGYUN.Abp.EventBus.CAP.CAPDistributedEventBus.UnsubscribeAll(System.Type)">
<summary>
退订所有事件
</summary>
<param name="eventType">事件类型</param>
</member>
<member name="M:LINGYUN.Abp.EventBus.CAP.CAPDistributedEventBus.Subscribe``1(Volo.Abp.EventBus.Distributed.IDistributedEventHandler{``0})">
<summary>
订阅事件
</summary>
<typeparam name="TEvent">事件类型</typeparam>
<param name="handler">事件处理器</param>
<returns></returns>
</member>
<member name="M:LINGYUN.Abp.EventBus.CAP.CAPDistributedEventBus.PublishAsync(System.Type,System.Object)">
<summary>
发布事件
</summary>
<param name="eventType">事件类型</param>
<param name="eventData">事件数据对象</param>
<returns></returns>
</member>
<member name="M:LINGYUN.Abp.EventBus.CAP.CAPDistributedEventBus.GetHandlerFactories(System.Type)">
<summary>
获取事件处理器工厂列表
</summary>
<param name="eventType"></param>
<returns></returns>
</member>
<member name="T:LINGYUN.Abp.EventBus.CAP.ICustomDistributedEventSubscriber">
<summary>
自定义事件订阅者
</summary>
</member>
<member name="M:LINGYUN.Abp.EventBus.CAP.ICustomDistributedEventSubscriber.Subscribe(System.Type,Volo.Abp.EventBus.IEventHandlerFactory)">
<summary>
订阅事件
</summary>
<param name="eventType"></param>
<param name="factory"></param>
</member>
<member name="M:LINGYUN.Abp.EventBus.CAP.ICustomDistributedEventSubscriber.UnSubscribe(System.Type,Volo.Abp.EventBus.IEventHandlerFactory)">
<summary>
取消订阅
</summary>
<param name="eventType"></param>
<param name="factory"></param>
</member>
<member name="M:LINGYUN.Abp.EventBus.CAP.Internal.ObjectMethodExecutor.Execute(System.Object,System.Object[])">
<summary>
Executes the configured method on <paramref name="target" />. This can be used whether or not
the configured method is asynchronous.
</summary>
<remarks>
Even if the target method is asynchronous, it's desirable to invoke it using Execute rather than
ExecuteAsync if you know at compile time what the return type is, because then you can directly
"await" that value (via a cast), and then the generated code will be able to reference the
resulting awaitable as a value-typed variable. If you use ExecuteAsync instead, the generated
code will have to treat the resulting awaitable as a boxed object, because it doesn't know at
compile time what type it would be.
</remarks>
<param name="target">The object whose method is to be executed.</param>
<param name="parameters">Parameters to pass to the method.</param>
<returns>The method return value.</returns>
</member>
<member name="M:LINGYUN.Abp.EventBus.CAP.Internal.ObjectMethodExecutor.ExecuteAsync(System.Object,System.Object[])">
<summary>
Executes the configured method on <paramref name="target" />. This can only be used if the configured
method is asynchronous.
</summary>
<remarks>
If you don't know at compile time the type of the method's returned awaitable, you can use ExecuteAsync,
which supplies an awaitable-of-object. This always works, but can incur several extra heap allocations
as compared with using Execute and then using "await" on the result value typecasted to the known
awaitable type. The possible extra heap allocations are for:
1. The custom awaitable (though usually there's a heap allocation for this anyway, since normally
it's a reference type, and you normally create a new instance per call).
2. The custom awaiter (whether or not it's a value type, since if it's not, you need a new instance
of it, and if it is, it will have to be boxed so the calling code can reference it as an object).
3. The async result value, if it's a value type (it has to be boxed as an object, since the calling
code doesn't know what type it's going to be).
</remarks>
<param name="target">The object whose method is to be executed.</param>
<param name="parameters">Parameters to pass to the method.</param>
<returns>An object that you can "await" to get the method return value.</returns>
</member>
<member name="T:LINGYUN.Abp.EventBus.CAP.Internal.ObjectMethodExecutorAwaitable">
<summary>
Provides a common awaitable structure that <see cref="M:LINGYUN.Abp.EventBus.CAP.Internal.ObjectMethodExecutor.ExecuteAsync(System.Object,System.Object[])" /> can
return, regardless of whether the underlying value is a System.Task, an FSharpAsync, or an
application-defined custom awaitable.
</summary>
</member>
<member name="T:LINGYUN.Abp.EventBus.CAP.Internal.ObjectMethodExecutorFSharpSupport">
<summary>
Helper for detecting whether a given type is FSharpAsync`1, and if so, supplying
an <see cref="T:System.Linq.Expressions.Expression" /> for mapping instances of that type to a C# awaitable.
</summary>
<remarks>
The main design goal here is to avoid taking a compile-time dependency on
FSharp.Core.dll, because non-F# applications wouldn't use it. So all the references
to FSharp types have to be constructed dynamically at runtime.
</remarks>
</member>
<member name="T:Microsoft.Extensions.DependencyInjection.ServiceCollectionExtensions">
<summary>
CAP ServiceCollectionExtensions
</summary>
</member>
<member name="M:Microsoft.Extensions.DependencyInjection.ServiceCollectionExtensions.AddCAPEventBus(Microsoft.Extensions.DependencyInjection.IServiceCollection,System.Action{DotNetCore.CAP.CapOptions})">
<summary>
Adds and configures the consistence services for the consistency.
</summary>
<param name="services"></param>
<param name="capAction"></param>
<returns></returns>
</member>
</members>
</doc>
<?xml version="1.0"?>
<doc>
<assembly>
<name>LINGYUN.Abp.EventBus.CAP</name>
</assembly>
<members>
<member name="T:DotNetCore.CAP.ConsumerServiceSelector">
<summary>
消费者查找器
</summary>
</member>
<member name="P:DotNetCore.CAP.ConsumerServiceSelector.CapOptions">
<summary>
CAP配置
</summary>
</member>
<member name="P:DotNetCore.CAP.ConsumerServiceSelector.AbpDistributedEventBusOptions">
<summary>
Abp分布式事件配置
</summary>
</member>
<member name="P:DotNetCore.CAP.ConsumerServiceSelector.ServiceProvider">
<summary>
服务提供者
</summary>
</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})">
<summary>
Creates a new <see cref="T:DotNetCore.CAP.Internal.ConsumerServiceSelector" />.
</summary>
</member>
<member name="M:DotNetCore.CAP.ConsumerServiceSelector.FindConsumersFromInterfaceTypes(System.IServiceProvider)">
<summary>
查找消费者集合
</summary>
<param name="provider"></param>
<returns></returns>
</member>
<member name="M:DotNetCore.CAP.ConsumerServiceSelector.GetHandlerDescription(System.Type,System.Type)">
<summary>
获取事件处理器集合
</summary>
<param name="eventType"></param>
<param name="typeInfo"></param>
<returns></returns>
</member>
<member name="T:DotNetCore.CAP.Processor.AbpCapExpiresMessageCleanupBackgroundWorker">
<summary>
过期消息清理任务
</summary>
</member>
<member name="P:DotNetCore.CAP.Processor.AbpCapExpiresMessageCleanupBackgroundWorker.Options">
<summary>
过期消息清理配置
</summary>
</member>
<member name="P:DotNetCore.CAP.Processor.AbpCapExpiresMessageCleanupBackgroundWorker.Initializer">
<summary>
Initializer
</summary>
</member>
<member name="P:DotNetCore.CAP.Processor.AbpCapExpiresMessageCleanupBackgroundWorker.Storage">
<summary>
Storage
</summary>
</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)">
<summary>
创建过期消息清理任务
</summary>
<param name="timer"></param>
<param name="storage"></param>
<param name="initializer"></param>
<param name="options"></param>
<param name="serviceScopeFactory"></param>
</member>
<member name="M:DotNetCore.CAP.Processor.AbpCapExpiresMessageCleanupBackgroundWorker.DoWorkAsync(Volo.Abp.BackgroundWorkers.PeriodicBackgroundWorkerContext)">
<summary>
异步执行任务
</summary>
<param name="workerContext"></param>
<returns></returns>
</member>
<member name="T:DotNetCore.CAP.Processor.AbpCapProcessingServer">
<summary>
CapProcessingServer
</summary>
</member>
<member name="M:DotNetCore.CAP.Processor.AbpCapProcessingServer.#ctor(Microsoft.Extensions.Logging.ILogger{DotNetCore.CAP.Processor.AbpCapProcessingServer},Microsoft.Extensions.Logging.ILoggerFactory,System.IServiceProvider)">
<summary>
CapProcessingServer
</summary>
<param name="logger"></param>
<param name="loggerFactory"></param>
<param name="provider"></param>
</member>
<member name="M:DotNetCore.CAP.Processor.AbpCapProcessingServer.Start(System.Threading.CancellationToken)">
<summary>
Start
</summary>
</member>
<member name="M:DotNetCore.CAP.Processor.AbpCapProcessingServer.Pulse">
<summary>
Pulse
</summary>
</member>
<member name="M:DotNetCore.CAP.Processor.AbpCapProcessingServer.Dispose">
<summary>
Dispose
</summary>
</member>
<member name="T:LINGYUN.Abp.EventBus.CAP.AbpCAPEventBusModule">
<summary>
AbpCAPEventBusModule
</summary>
</member>
<member name="M:LINGYUN.Abp.EventBus.CAP.AbpCAPEventBusModule.ConfigureServices(Volo.Abp.Modularity.ServiceConfigurationContext)">
<summary>
ConfigureServices
</summary>
<param name="context"></param>
</member>
<member name="M:LINGYUN.Abp.EventBus.CAP.AbpCAPEventBusModule.OnApplicationInitialization(Volo.Abp.ApplicationInitializationContext)">
<summary>
OnApplicationInitialization
</summary>
<param name="context"></param>
</member>
<member name="T:LINGYUN.Abp.EventBus.CAP.AbpCAPEventBusOptions">
<summary>
过期消息清理配置项
</summary>
</member>
<member name="P:LINGYUN.Abp.EventBus.CAP.AbpCAPEventBusOptions.NotifyFailedCallback">
<summary>
发布消息处理失败通知
default: false
</summary>
</member>
<member name="P:LINGYUN.Abp.EventBus.CAP.AbpCAPEventBusOptions.CleanUpExpiresMessageBatch">
<summary>
批量清理数量
default: 1000
</summary>
</member>
<member name="P:LINGYUN.Abp.EventBus.CAP.AbpCAPEventBusOptions.CleanUpExpiresMessageInterval">
<summary>
执行间隔(ms)
default: 3600000 (1 hours)
</summary>
</member>
<member name="T:LINGYUN.Abp.EventBus.CAP.AbpCAPExecutionFailedException">
<summary>
AbpECAPExecutionFailedException
</summary>
</member>
<member name="P:LINGYUN.Abp.EventBus.CAP.AbpCAPExecutionFailedException.MessageType">
<summary>
MessageType
</summary>
</member>
<member name="P:LINGYUN.Abp.EventBus.CAP.AbpCAPExecutionFailedException.Origin">
<summary>
Message
</summary>
</member>
<member name="M:LINGYUN.Abp.EventBus.CAP.AbpCAPExecutionFailedException.#ctor(DotNetCore.CAP.Messages.MessageType,DotNetCore.CAP.Messages.Message)">
<summary>
constructor
</summary>
<param name="messageType"></param>
<param name="origin"></param>
</member>
<member name="M:LINGYUN.Abp.EventBus.CAP.AbpCAPExecutionFailedException.#ctor(DotNetCore.CAP.Messages.MessageType,DotNetCore.CAP.Messages.Message,System.String)">
<summary>
constructor
</summary>
<param name="messageType"></param>
<param name="origin"></param>
<param name="message"></param>
</member>
<member name="M:LINGYUN.Abp.EventBus.CAP.AbpCAPExecutionFailedException.#ctor(DotNetCore.CAP.Messages.MessageType,DotNetCore.CAP.Messages.Message,System.String,System.Exception)">
<summary>
constructor
</summary>
<param name="messageType"></param>
<param name="origin"></param>
<param name="message"></param>
<param name="innerException"></param>
</member>
<member name="T:LINGYUN.Abp.EventBus.CAP.AbpCAPMessageExtensions">
<summary>
CAP消息扩展
</summary>
</member>
<member name="M:LINGYUN.Abp.EventBus.CAP.AbpCAPMessageExtensions.TryGetTenantId(DotNetCore.CAP.Messages.Message,System.Nullable{System.Guid}@)">
<summary>
尝试获取消息标头中的租户标识
</summary>
<param name="message"></param>
<param name="tenantId"></param>
<returns></returns>
</member>
<member name="M:LINGYUN.Abp.EventBus.CAP.AbpCAPMessageExtensions.GetTenantIdOrNull(DotNetCore.CAP.Messages.Message)">
<summary>
获取消息标头中的租户标识
</summary>
<param name="message"></param>
<returns></returns>
</member>
<member name="T:LINGYUN.Abp.EventBus.CAP.AbpCAPSubscribeInvoker">
<summary>
重写 ISubscribeInvoker 实现 Abp 租户集成
</summary>
</member>
<member name="M:LINGYUN.Abp.EventBus.CAP.AbpCAPSubscribeInvoker.#ctor(Microsoft.Extensions.Logging.ILoggerFactory,System.IServiceProvider,DotNetCore.CAP.Serialization.ISerializer,Volo.Abp.MultiTenancy.ICurrentTenant)">
<summary>
AbpCAPSubscribeInvoker
</summary>
<param name="loggerFactory"></param>
<param name="serviceProvider"></param>
<param name="serializer"></param>
<param name="currentTenant"></param>
</member>
<member name="M:LINGYUN.Abp.EventBus.CAP.AbpCAPSubscribeInvoker.InvokeAsync(DotNetCore.CAP.Internal.ConsumerContext,System.Threading.CancellationToken)">
<summary>
调用订阅者方法
</summary>
<param name="context"></param>
<param name="cancellationToken"></param>
<returns></returns>
</member>
<member name="M:LINGYUN.Abp.EventBus.CAP.AbpCAPSubscribeInvoker.GetInstance(System.IServiceProvider,DotNetCore.CAP.Internal.ConsumerContext)">
<summary>
获取事件处理类实例
</summary>
<param name="provider"></param>
<param name="context"></param>
<returns></returns>
</member>
<member name="M:LINGYUN.Abp.EventBus.CAP.AbpCAPSubscribeInvoker.ExecuteWithParameterAsync(LINGYUN.Abp.EventBus.CAP.Internal.ObjectMethodExecutor,System.Object,System.Object[])">
<summary>
通过给定的类型实例与参数调用订阅者方法
</summary>
<param name="executor"></param>
<param name="class"></param>
<param name="parameter"></param>
<returns></returns>
</member>
<member name="T:LINGYUN.Abp.EventBus.CAP.CAPDistributedEventBus">
<summary>
CAP分布式事件总线
</summary>
</member>
<member name="P:LINGYUN.Abp.EventBus.CAP.CAPDistributedEventBus.AbpDistributedEventBusOptions">
<summary>
Abp分布式事件总线配置
</summary>
</member>
<member name="F:LINGYUN.Abp.EventBus.CAP.CAPDistributedEventBus.CapPublisher">
<summary>
CAP消息发布接口
</summary>
</member>
<member name="P:LINGYUN.Abp.EventBus.CAP.CAPDistributedEventBus.CustomDistributedEventSubscriber">
<summary>
自定义事件注册接口
</summary>
</member>
<member name="P:LINGYUN.Abp.EventBus.CAP.CAPDistributedEventBus.HandlerFactories">
<summary>
本地事件处理器工厂对象集合
</summary>
</member>
<member name="P:LINGYUN.Abp.EventBus.CAP.CAPDistributedEventBus.EventTypes">
<summary>
本地事件集合
</summary>
</member>
<member name="P:LINGYUN.Abp.EventBus.CAP.CAPDistributedEventBus.CurrentUser">
<summary>
当前用户
</summary>
</member>
<member name="P:LINGYUN.Abp.EventBus.CAP.CAPDistributedEventBus.CurrentClient">
<summary>
当前客户端
</summary>
</member>
<member name="P:LINGYUN.Abp.EventBus.CAP.CAPDistributedEventBus.CancellationTokenProvider">
<summary>
取消令牌
</summary>
</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.EventBus.IEventErrorHandler,Volo.Abp.Threading.ICancellationTokenProvider,LINGYUN.Abp.EventBus.CAP.ICustomDistributedEventSubscriber)">
<summary>
constructor
</summary>
<param name="serviceScopeFactory"></param>
<param name="distributedEventBusOptions"></param>
<param name="capPublisher"></param>
<param name="currentUser"></param>
<param name="currentClient"></param>
<param name="currentTenant"></param>
<param name="eventErrorHandler"></param>
<param name="cancellationTokenProvider"></param>
<param name="customDistributedEventSubscriber"></param>
</member>
<member name="M:LINGYUN.Abp.EventBus.CAP.CAPDistributedEventBus.Subscribe(System.Type,Volo.Abp.EventBus.IEventHandlerFactory)">
<summary>
订阅事件
</summary>
<param name="eventType"></param>
<param name="factory"></param>
<returns></returns>
</member>
<member name="M:LINGYUN.Abp.EventBus.CAP.CAPDistributedEventBus.Unsubscribe``1(System.Func{``0,System.Threading.Tasks.Task})">
<summary>
退订事件
</summary>
<typeparam name="TEvent">事件类型</typeparam>
<param name="action"></param>
</member>
<member name="M:LINGYUN.Abp.EventBus.CAP.CAPDistributedEventBus.Unsubscribe(System.Type,Volo.Abp.EventBus.IEventHandler)">
<summary>
退订事件
</summary>
<param name="eventType">事件类型</param>
<param name="handler">事件处理器</param>
</member>
<member name="M:LINGYUN.Abp.EventBus.CAP.CAPDistributedEventBus.Unsubscribe(System.Type,Volo.Abp.EventBus.IEventHandlerFactory)">
<summary>
退订事件
</summary>
<param name="eventType">事件类型</param>
<param name="factory">事件处理器工厂</param>
</member>
<member name="M:LINGYUN.Abp.EventBus.CAP.CAPDistributedEventBus.UnsubscribeAll(System.Type)">
<summary>
退订所有事件
</summary>
<param name="eventType">事件类型</param>
</member>
<member name="M:LINGYUN.Abp.EventBus.CAP.CAPDistributedEventBus.Subscribe``1(Volo.Abp.EventBus.Distributed.IDistributedEventHandler{``0})">
<summary>
订阅事件
</summary>
<typeparam name="TEvent">事件类型</typeparam>
<param name="handler">事件处理器</param>
<returns></returns>
</member>
<member name="M:LINGYUN.Abp.EventBus.CAP.CAPDistributedEventBus.PublishAsync(System.Type,System.Object)">
<summary>
发布事件
</summary>
<param name="eventType">事件类型</param>
<param name="eventData">事件数据对象</param>
<returns></returns>
</member>
<member name="M:LINGYUN.Abp.EventBus.CAP.CAPDistributedEventBus.GetHandlerFactories(System.Type)">
<summary>
获取事件处理器工厂列表
</summary>
<param name="eventType"></param>
<returns></returns>
</member>
<member name="T:LINGYUN.Abp.EventBus.CAP.ICustomDistributedEventSubscriber">
<summary>
自定义事件订阅者
</summary>
</member>
<member name="M:LINGYUN.Abp.EventBus.CAP.ICustomDistributedEventSubscriber.Subscribe(System.Type,Volo.Abp.EventBus.IEventHandlerFactory)">
<summary>
订阅事件
</summary>
<param name="eventType"></param>
<param name="factory"></param>
</member>
<member name="M:LINGYUN.Abp.EventBus.CAP.ICustomDistributedEventSubscriber.UnSubscribe(System.Type,Volo.Abp.EventBus.IEventHandlerFactory)">
<summary>
取消订阅
</summary>
<param name="eventType"></param>
<param name="factory"></param>
</member>
<member name="M:LINGYUN.Abp.EventBus.CAP.Internal.ObjectMethodExecutor.Execute(System.Object,System.Object[])">
<summary>
Executes the configured method on <paramref name="target" />. This can be used whether or not
the configured method is asynchronous.
</summary>
<remarks>
Even if the target method is asynchronous, it's desirable to invoke it using Execute rather than
ExecuteAsync if you know at compile time what the return type is, because then you can directly
"await" that value (via a cast), and then the generated code will be able to reference the
resulting awaitable as a value-typed variable. If you use ExecuteAsync instead, the generated
code will have to treat the resulting awaitable as a boxed object, because it doesn't know at
compile time what type it would be.
</remarks>
<param name="target">The object whose method is to be executed.</param>
<param name="parameters">Parameters to pass to the method.</param>
<returns>The method return value.</returns>
</member>
<member name="M:LINGYUN.Abp.EventBus.CAP.Internal.ObjectMethodExecutor.ExecuteAsync(System.Object,System.Object[])">
<summary>
Executes the configured method on <paramref name="target" />. This can only be used if the configured
method is asynchronous.
</summary>
<remarks>
If you don't know at compile time the type of the method's returned awaitable, you can use ExecuteAsync,
which supplies an awaitable-of-object. This always works, but can incur several extra heap allocations
as compared with using Execute and then using "await" on the result value typecasted to the known
awaitable type. The possible extra heap allocations are for:
1. The custom awaitable (though usually there's a heap allocation for this anyway, since normally
it's a reference type, and you normally create a new instance per call).
2. The custom awaiter (whether or not it's a value type, since if it's not, you need a new instance
of it, and if it is, it will have to be boxed so the calling code can reference it as an object).
3. The async result value, if it's a value type (it has to be boxed as an object, since the calling
code doesn't know what type it's going to be).
</remarks>
<param name="target">The object whose method is to be executed.</param>
<param name="parameters">Parameters to pass to the method.</param>
<returns>An object that you can "await" to get the method return value.</returns>
</member>
<member name="T:LINGYUN.Abp.EventBus.CAP.Internal.ObjectMethodExecutorAwaitable">
<summary>
Provides a common awaitable structure that <see cref="M:LINGYUN.Abp.EventBus.CAP.Internal.ObjectMethodExecutor.ExecuteAsync(System.Object,System.Object[])" /> can
return, regardless of whether the underlying value is a System.Task, an FSharpAsync, or an
application-defined custom awaitable.
</summary>
</member>
<member name="T:LINGYUN.Abp.EventBus.CAP.Internal.ObjectMethodExecutorFSharpSupport">
<summary>
Helper for detecting whether a given type is FSharpAsync`1, and if so, supplying
an <see cref="T:System.Linq.Expressions.Expression" /> for mapping instances of that type to a C# awaitable.
</summary>
<remarks>
The main design goal here is to avoid taking a compile-time dependency on
FSharp.Core.dll, because non-F# applications wouldn't use it. So all the references
to FSharp types have to be constructed dynamically at runtime.
</remarks>
</member>
<member name="T:Microsoft.Extensions.DependencyInjection.ServiceCollectionExtensions">
<summary>
CAP ServiceCollectionExtensions
</summary>
</member>
<member name="M:Microsoft.Extensions.DependencyInjection.ServiceCollectionExtensions.AddCAPEventBus(Microsoft.Extensions.DependencyInjection.IServiceCollection,System.Action{DotNetCore.CAP.CapOptions})">
<summary>
Adds and configures the consistence services for the consistency.
</summary>
<param name="services"></param>
<param name="capAction"></param>
<returns></returns>
</member>
</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.SignalR.Hubs;
using LINGYUN.Abp.RealTime.Client;
using Microsoft.AspNetCore.SignalR;
using Microsoft.Extensions.Logging;
using Microsoft.Extensions.Options;
using System;
using System.Collections.Immutable;
using System.Linq;
using System.Threading.Tasks;
namespace LINGYUN.Abp.IM.SignalR.Messages
{
public class SignalRMessageSenderProvider : MessageSenderProviderBase
{
public override string Name => "SignalR";
private readonly AbpIMSignalROptions _options;
private readonly IOnlineClientManager _onlineClientManager;
private readonly IHubContext<MessagesHub> _hubContext;
public SignalRMessageSenderProvider(
IOnlineClientManager onlineClientManager,
IHubContext<MessagesHub> hubContext,
IServiceProvider serviceProvider,
IOptions<AbpIMSignalROptions> options)
: base(serviceProvider)
{
_options = options.Value;
_hubContext = hubContext;
_onlineClientManager = onlineClientManager;
}
protected override async Task SendMessageToGroupAsync(ChatMessage chatMessage)
{
var signalRClient = _hubContext.Clients.Group(chatMessage.GroupId);
if (signalRClient == null)
{
Logger.LogDebug("Can not get group " + chatMessage.GroupId + " from SignalR hub!");
return;
}
await signalRClient.SendAsync(_options.GetChatMessageMethod, chatMessage);
}
protected override async Task SendMessageToUserAsync(ChatMessage chatMessage)
{
try
{
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);
if (signalRClients == null)
{
Logger.LogDebug("Can not get user " + onlineClientContext.UserId + " connection from SignalR hub!");
return;
}
await signalRClients.SendAsync(_options.GetChatMessageMethod, chatMessage);
}
catch (Exception ex)
{
Logger.LogWarning("Could not send message to user: {0}", chatMessage.ToUserId);
Logger.LogWarning("Send to user message error: {0}", ex.Message);
}
}
}
}
using LINGYUN.Abp.IM.Messages;
using LINGYUN.Abp.IM.SignalR.Hubs;
using LINGYUN.Abp.RealTime.Client;
using Microsoft.AspNetCore.SignalR;
using Microsoft.Extensions.Logging;
using Microsoft.Extensions.Options;
using System;
using System.Collections.Immutable;
using System.Linq;
using System.Threading.Tasks;
using Volo.Abp.DependencyInjection;
namespace LINGYUN.Abp.IM.SignalR.Messages
{
public class SignalRMessageSenderProvider : MessageSenderProviderBase
{
public override string Name => "SignalR";
private readonly AbpIMSignalROptions _options;
private readonly IOnlineClientManager _onlineClientManager;
private readonly IHubContext<MessagesHub> _hubContext;
public SignalRMessageSenderProvider(
IOnlineClientManager onlineClientManager,
IHubContext<MessagesHub> hubContext,
IAbpLazyServiceProvider serviceProvider,
IOptions<AbpIMSignalROptions> options)
: base(serviceProvider)
{
_options = options.Value;
_hubContext = hubContext;
_onlineClientManager = onlineClientManager;
}
protected override async Task SendMessageToGroupAsync(ChatMessage chatMessage)
{
var signalRClient = _hubContext.Clients.Group(chatMessage.GroupId);
if (signalRClient == null)
{
Logger.LogDebug("Can not get group " + chatMessage.GroupId + " from SignalR hub!");
return;
}
await signalRClient.SendAsync(_options.GetChatMessageMethod, chatMessage);
}
protected override async Task SendMessageToUserAsync(ChatMessage chatMessage)
{
try
{
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);
if (signalRClients == null)
{
Logger.LogDebug("Can not get user " + onlineClientContext.UserId + " connection from SignalR hub!");
return;
}
await signalRClients.SendAsync(_options.GetChatMessageMethod, chatMessage);
}
catch (Exception ex)
{
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 Volo.Abp.Collections;
namespace LINGYUN.Abp.IM
{
public class AbpIMOptions
{
public ITypeList<IMessageSenderProvider> Providers { get; }
public AbpIMOptions()
{
Providers = new TypeList<IMessageSenderProvider>();
}
}
}
using LINGYUN.Abp.IM.Messages;
using Volo.Abp.Collections;
namespace LINGYUN.Abp.IM
{
public class AbpIMOptions
{
/// <summary>
/// 消息发送者
/// </summary>
public ITypeList<IMessageSenderProvider> Providers { get; }
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.Abstractions;
using System;
using System.Threading.Tasks;
using Volo.Abp.DependencyInjection;
namespace LINGYUN.Abp.IM.Messages
{
public abstract class MessageSenderProviderBase : IMessageSenderProvider, ITransientDependency
{
public abstract string Name { get; }
protected IServiceProvider ServiceProvider { get; }
protected readonly object ServiceProviderLock = new object();
public ILoggerFactory LoggerFactory => LazyGetRequiredService(ref _loggerFactory);
private ILoggerFactory _loggerFactory;
protected ILogger Logger => _lazyLogger.Value;
private Lazy<ILogger> _lazyLogger => new Lazy<ILogger>(() => LoggerFactory?.CreateLogger(GetType().FullName) ?? NullLogger.Instance, true);
protected TService LazyGetRequiredService<TService>(ref TService reference)
{
if (reference == null)
{
lock (ServiceProviderLock)
{
if (reference == null)
{
reference = ServiceProvider.GetRequiredService<TService>();
}
}
}
return reference;
}
protected MessageSenderProviderBase(IServiceProvider serviceProvider)
{
ServiceProvider = serviceProvider;
}
public virtual async Task SendMessageAsync(ChatMessage chatMessage)
{
try
{
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);
}
}
using Microsoft.Extensions.Logging;
using Microsoft.Extensions.Logging.Abstractions;
using System;
using System.Threading.Tasks;
using Volo.Abp.DependencyInjection;
namespace LINGYUN.Abp.IM.Messages
{
public abstract class MessageSenderProviderBase : IMessageSenderProvider, ITransientDependency
{
public abstract string Name { get; }
protected IAbpLazyServiceProvider ServiceProvider { get; }
protected ILoggerFactory LoggerFactory => ServiceProvider.LazyGetRequiredService<ILoggerFactory>();
protected ILogger Logger => _lazyLogger.Value;
private Lazy<ILogger> _lazyLogger => new Lazy<ILogger>(() => LoggerFactory?.CreateLogger(GetType().FullName) ?? NullLogger.Instance, true);
protected MessageSenderProviderBase(IAbpLazyServiceProvider serviceProvider)
{
ServiceProvider = serviceProvider;
}
public virtual async Task SendMessageAsync(ChatMessage chatMessage)
{
try
{
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.Collections.Generic;
using System.Linq;
using Volo.Abp.Domain.Entities;
using Volo.Abp.MultiTenancy;
namespace LINGYUN.Abp.MessageService.Chat
{
public class UserChatSetting : Entity<long>, IMultiTenant
{
/// <summary>
/// 租户
/// </summary>
public virtual Guid? TenantId { 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 AllowAddFriend { get; set; }
/// <summary>
/// 添加好友需要验证
/// </summary>
public virtual bool RequireAddFriendValition { get; set; }
/// <summary>
/// 允许接收消息
/// </summary>
public virtual bool AllowReceiveMessage { get; set; }
/// <summary>
/// 允许发送消息
/// </summary>
public virtual bool AllowSendMessage { get; set; }
protected UserChatSetting()
{
}
public UserChatSetting(Guid userId, Guid? tenantId)
: this()
{
UserId = userId;
TenantId = tenantId;
AllowAnonymous = false;
AllowAddFriend = true;
AllowReceiveMessage = true;
AllowSendMessage = true;
RequireAddFriendValition = true;
}
}
}
using System;
using Volo.Abp.Domain.Entities;
using Volo.Abp.MultiTenancy;
namespace LINGYUN.Abp.MessageService.Chat
{
public class UserChatSetting : Entity<long>, IMultiTenant
{
/// <summary>
/// 租户
/// </summary>
public virtual Guid? TenantId { 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 AllowAddFriend { get; set; }
/// <summary>
/// 添加好友需要验证
/// </summary>
public virtual bool RequireAddFriendValition { get; set; }
/// <summary>
/// 允许接收消息
/// </summary>
public virtual bool AllowReceiveMessage { get; set; }
/// <summary>
/// 允许发送消息
/// </summary>
public virtual bool AllowSendMessage { get; set; }
protected UserChatSetting()
{
}
public UserChatSetting(Guid userId, Guid? tenantId)
: this()
{
UserId = userId;
TenantId = tenantId;
AllowAnonymous = false;
AllowAddFriend = true;
AllowReceiveMessage = 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.Extensions.Options;
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;
using Volo.Abp.Account.Settings;
using Volo.Abp.Application.Dtos;
using Volo.Abp.Application.Services;
using Volo.Abp.Caching;
using Volo.Abp.Emailing;
using Volo.Abp.Identity.Settings;
using Volo.Abp.Localization;
using Volo.Abp.MultiTenancy;
using Volo.Abp.SettingManagement;
using Volo.Abp.SettingManagement.Localization;
using Volo.Abp.Settings;
using Volo.Abp.Timing;
using Volo.Abp.Users;
using Volo.Abp.EventBus.Distributed;
using Volo.Abp.AspNetCore.Mvc.ApplicationConfigurations;
namespace LINGYUN.Abp.SettingManagement
{
[Authorize(AbpSettingManagementPermissions.Settings.Default)]
public class SettingAppService : ApplicationService, ISettingAppService
{
protected AbpLocalizationOptions LocalizationOptions { get; }
protected IDistributedEventBus EventBus { get; }
protected ISettingManager SettingManager { get; }
protected ISettingDefinitionManager SettingDefinitionManager { get; }
protected IDistributedCache<SettingCacheItem> Cache { get; }
public SettingAppService(
IDistributedEventBus eventBus,
ISettingManager settingManager,
IDistributedCache<SettingCacheItem> cache,
IOptions<AbpLocalizationOptions> localizationOptions,
ISettingDefinitionManager settingDefinitionManager)
{
Cache = cache;
EventBus = eventBus;
SettingManager = settingManager;
SettingDefinitionManager = settingDefinitionManager;
LocalizationOptions = localizationOptions.Value;
LocalizationResource = typeof(AbpSettingManagementResource);
}
[Authorize(AbpSettingManagementPermissions.Settings.Manager)]
public virtual async Task SetGlobalAsync(UpdateSettingsDto input)
{
foreach (var setting in input.Settings)
{
await SettingManager.SetGlobalAsync(setting.Name, setting.Value);
}
CurrentUnitOfWork.OnCompleted(async () =>
{
// 发送刷新用户缓存事件
await EventBus.PublishAsync(new CurrentApplicationConfigurationCacheResetEventData());
});
await CurrentUnitOfWork.SaveChangesAsync();
}
[Authorize(AbpSettingManagementPermissions.Settings.Manager)]
public virtual async Task SetCurrentTenantAsync(UpdateSettingsDto input)
{
if (CurrentTenant.IsAvailable)
{
foreach (var setting in input.Settings)
{
await SettingManager.SetForTenantAsync(CurrentTenant.GetId(), setting.Name, setting.Value);
}
CurrentUnitOfWork.OnCompleted(async () =>
{
// 发送刷新用户缓存事件
await EventBus.PublishAsync(new CurrentApplicationConfigurationCacheResetEventData());
});
await CurrentUnitOfWork.SaveChangesAsync();
}
}
//[Authorize]
[AllowAnonymous]
public virtual async Task<ListResultDto<SettingGroupDto>> GetAllForCurrentTenantAsync()
{
return await GetAllForProviderAsync(TenantSettingValueProvider.ProviderName, CurrentTenant.GetId().ToString());
}
[AllowAnonymous]
public virtual async Task<ListResultDto<SettingGroupDto>> GetAllForGlobalAsync()
{
return await GetAllForProviderAsync(GlobalSettingValueProvider.ProviderName, null);
}
protected virtual async Task<ListResultDto<SettingGroupDto>> GetAllForProviderAsync(string providerName, string providerKey)
{
/*
* 2020-11-19
* colin@foxmail.com
*
* ,
*
* Dto的配置服务,,
* (vue前端已设计为动态表单页面)
*
* ,,
*/
var settingGroups = new List<SettingGroupDto>();
#region 系统设置
var sysSettingGroup = new SettingGroupDto(L["DisplayName:System"], L["Description:System"]);
// 语言
var languageSetting = sysSettingGroup.AddSetting(L["DisplayName:System.Language"], L["Description:System.Language"]);
languageSetting.AddDetail(
SettingDefinitionManager.Get(LocalizationSettingNames.DefaultLanguage),
StringLocalizerFactory,
await SettingManager.GetOrNullAsync(LocalizationSettingNames.DefaultLanguage, providerName, providerKey),
ValueType.Option)
.AddOptions(LocalizationOptions.Languages.Select(l => new OptionDto(l.DisplayName, l.CultureName)));
// 时区
var timingSetting = sysSettingGroup.AddSetting(L["DisplayName:System.Timing"], L["Description:System.Timing"]);
timingSetting.AddDetail(
SettingDefinitionManager.Get(TimingSettingNames.TimeZone),
StringLocalizerFactory,
await SettingManager.GetOrNullAsync(TimingSettingNames.TimeZone, providerName, providerKey),
ValueType.String);
settingGroups.Add(sysSettingGroup);
#endregion
#region 安全设置
var securitySettingGroup = new SettingGroupDto(L["DisplayName:Security"], L["Description:Security"]);
// 用户账户
var accountSetting = securitySettingGroup.AddSetting(L["DisplayName:Security.Account"], L["Description:Security.Account"]);
// 启用本地登录
accountSetting.AddDetail(
SettingDefinitionManager.Get(AccountSettingNames.EnableLocalLogin),
StringLocalizerFactory,
await SettingManager.GetOrNullAsync(AccountSettingNames.EnableLocalLogin, providerName, providerKey),
ValueType.Boolean);
accountSetting.AddDetail(
SettingDefinitionManager.Get(AccountSettingNames.IsSelfRegistrationEnabled),
StringLocalizerFactory,
await SettingManager.GetOrNullAsync(AccountSettingNames.IsSelfRegistrationEnabled, providerName, providerKey),
ValueType.Boolean);
settingGroups.Add(securitySettingGroup);
#endregion
#region 身份标识设置
// 身份标识设置
var identitySetting = new SettingGroupDto(L["DisplayName:Identity"], L["Description:Identity"]);
#region 用户锁定
var lockoutSetting = identitySetting.AddSetting(L["DisplayName:Identity.Lockout"], L["Description:Identity.Lockout"]);
lockoutSetting.AddDetail(
SettingDefinitionManager.Get(IdentitySettingNames.Lockout.AllowedForNewUsers),
StringLocalizerFactory,
await SettingManager.GetOrNullAsync(IdentitySettingNames.Lockout.AllowedForNewUsers, providerName, providerKey),
ValueType.Boolean);
lockoutSetting.AddDetail(
SettingDefinitionManager.Get(IdentitySettingNames.Lockout.LockoutDuration),
StringLocalizerFactory,
await SettingManager.GetOrNullAsync(IdentitySettingNames.Lockout.LockoutDuration, providerName, providerKey),
ValueType.Number);
lockoutSetting.AddDetail(
SettingDefinitionManager.Get(IdentitySettingNames.Lockout.MaxFailedAccessAttempts),
StringLocalizerFactory,
await SettingManager.GetOrNullAsync(IdentitySettingNames.Lockout.MaxFailedAccessAttempts, providerName, providerKey),
ValueType.Number);
#endregion
#region 用户
var userSetting = identitySetting.AddSetting(L["DisplayName:Identity.User"], L["Description:Identity.User"]);
userSetting.AddDetail(
SettingDefinitionManager.Get(IdentitySettingNames.User.IsEmailUpdateEnabled),
StringLocalizerFactory,
await SettingManager.GetOrNullAsync(IdentitySettingNames.User.IsEmailUpdateEnabled, providerName, providerKey),
ValueType.Boolean);
userSetting.AddDetail(
SettingDefinitionManager.Get(IdentitySettingNames.User.IsUserNameUpdateEnabled),
StringLocalizerFactory,
await SettingManager.GetOrNullAsync(IdentitySettingNames.User.IsUserNameUpdateEnabled, providerName, providerKey),
ValueType.Boolean);
userSetting.AddDetail(
SettingDefinitionManager.Get(LINGYUN.Abp.Identity.Settings.IdentitySettingNames.User.SmsNewUserRegister),
StringLocalizerFactory,
await SettingManager.GetOrNullAsync(LINGYUN.Abp.Identity.Settings.IdentitySettingNames.User.SmsNewUserRegister, providerName, providerKey),
ValueType.String);
userSetting.AddDetail(
SettingDefinitionManager.Get(LINGYUN.Abp.Identity.Settings.IdentitySettingNames.User.SmsResetPassword),
StringLocalizerFactory,
await SettingManager.GetOrNullAsync(LINGYUN.Abp.Identity.Settings.IdentitySettingNames.User.SmsResetPassword, providerName, providerKey),
ValueType.String);
userSetting.AddDetail(
SettingDefinitionManager.Get(LINGYUN.Abp.Identity.Settings.IdentitySettingNames.User.SmsUserSignin),
StringLocalizerFactory,
await SettingManager.GetOrNullAsync(LINGYUN.Abp.Identity.Settings.IdentitySettingNames.User.SmsUserSignin, providerName, providerKey),
ValueType.String);
userSetting.AddDetail(
SettingDefinitionManager.Get(LINGYUN.Abp.Identity.Settings.IdentitySettingNames.User.SmsPhoneNumberConfirmed),
StringLocalizerFactory,
await SettingManager.GetOrNullAsync(LINGYUN.Abp.Identity.Settings.IdentitySettingNames.User.SmsPhoneNumberConfirmed, providerName, providerKey),
ValueType.String);
userSetting.AddDetail(
SettingDefinitionManager.Get(LINGYUN.Abp.Identity.Settings.IdentitySettingNames.User.SmsRepetInterval),
StringLocalizerFactory,
await SettingManager.GetOrNullAsync(LINGYUN.Abp.Identity.Settings.IdentitySettingNames.User.SmsRepetInterval, providerName, providerKey),
ValueType.Number);
#endregion
#region 登录
var signinSetting = identitySetting.AddSetting(L["DisplayName:Identity.SignIn"], L["Description:Identity.SignIn"]);
signinSetting.AddDetail(
SettingDefinitionManager.Get(IdentitySettingNames.SignIn.EnablePhoneNumberConfirmation),
StringLocalizerFactory,
await SettingManager.GetOrNullAsync(IdentitySettingNames.SignIn.EnablePhoneNumberConfirmation, providerName, providerKey),
ValueType.Boolean);
signinSetting.AddDetail(
SettingDefinitionManager.Get(IdentitySettingNames.SignIn.RequireConfirmedEmail),
StringLocalizerFactory,
await SettingManager.GetOrNullAsync(IdentitySettingNames.SignIn.RequireConfirmedEmail, providerName, providerKey),
ValueType.Boolean);
signinSetting.AddDetail(
SettingDefinitionManager.Get(IdentitySettingNames.SignIn.RequireConfirmedPhoneNumber),
StringLocalizerFactory,
await SettingManager.GetOrNullAsync(IdentitySettingNames.SignIn.RequireConfirmedPhoneNumber, providerName, providerKey),
ValueType.Boolean);
#endregion
#region 密码
var passwordSetting = identitySetting.AddSetting(L["DisplayName:Identity.Password"], L["Description:Identity.Password"]);
passwordSetting.AddDetail(
SettingDefinitionManager.Get(IdentitySettingNames.Password.RequireDigit),
StringLocalizerFactory,
await SettingManager.GetOrNullAsync(IdentitySettingNames.Password.RequireDigit, providerName, providerKey),
ValueType.Boolean);
passwordSetting.AddDetail(
SettingDefinitionManager.Get(IdentitySettingNames.Password.RequiredLength),
StringLocalizerFactory,
await SettingManager.GetOrNullAsync(IdentitySettingNames.Password.RequiredLength, providerName, providerKey),
ValueType.Number);
passwordSetting.AddDetail(
SettingDefinitionManager.Get(IdentitySettingNames.Password.RequiredUniqueChars),
StringLocalizerFactory,
await SettingManager.GetOrNullAsync(IdentitySettingNames.Password.RequiredUniqueChars, providerName, providerKey),
ValueType.Number);
passwordSetting.AddDetail(
SettingDefinitionManager.Get(IdentitySettingNames.Password.RequireLowercase),
StringLocalizerFactory,
await SettingManager.GetOrNullAsync(IdentitySettingNames.Password.RequireLowercase, providerName, providerKey),
ValueType.Boolean);
passwordSetting.AddDetail(
SettingDefinitionManager.Get(IdentitySettingNames.Password.RequireUppercase),
StringLocalizerFactory,
await SettingManager.GetOrNullAsync(IdentitySettingNames.Password.RequireUppercase, providerName, providerKey),
ValueType.Boolean);
passwordSetting.AddDetail(
SettingDefinitionManager.Get(IdentitySettingNames.Password.RequireNonAlphanumeric),
StringLocalizerFactory,
await SettingManager.GetOrNullAsync(IdentitySettingNames.Password.RequireNonAlphanumeric, providerName, providerKey),
ValueType.Boolean);
#endregion
#region 双因素
// Removed See: https://github.com/abpframework/abp/pull/7719
//var twoFactorSetting = identitySetting.AddSetting(L["DisplayName:Identity.TwoFactor"], L["Description:Identity.TwoFactor"]);
//twoFactorSetting.AddDetail(
// SettingDefinitionManager.Get(IdentitySettingNames.TwoFactor.Behaviour),
// StringLocalizerFactory,
// await SettingManager.GetOrNullAsync(IdentitySettingNames.TwoFactor.Behaviour, providerName, providerKey),
// ValueType.Option)
// .AddOption(IdentityTwoFactorBehaviour.Optional.ToString(), IdentityTwoFactorBehaviour.Optional.ToString())
// .AddOption(IdentityTwoFactorBehaviour.Forced.ToString(), IdentityTwoFactorBehaviour.Forced.ToString())
// .AddOption(IdentityTwoFactorBehaviour.Disabled.ToString(), IdentityTwoFactorBehaviour.Disabled.ToString());
//twoFactorSetting.AddDetail(
// SettingDefinitionManager.Get(IdentitySettingNames.TwoFactor.UsersCanChange),
// StringLocalizerFactory,
// await SettingManager.GetOrNullAsync(IdentitySettingNames.TwoFactor.UsersCanChange, providerName, providerKey),
// ValueType.Boolean);
#endregion
#region 组织机构
var ouSetting = identitySetting.AddSetting(L["DisplayName:Identity.OrganizationUnit"], L["Description:Identity.OrganizationUnit"]);
ouSetting.AddDetail(
SettingDefinitionManager.Get(IdentitySettingNames.OrganizationUnit.MaxUserMembershipCount),
StringLocalizerFactory,
await SettingManager.GetOrNullAsync(IdentitySettingNames.OrganizationUnit.MaxUserMembershipCount, providerName, providerKey),
ValueType.Number);
settingGroups.Add(identitySetting);
#endregion
#endregion
#region 邮件设置
var emailSettingGroup = new SettingGroupDto(L["DisplayName:Emailing"], L["Description:Emailing"]);
var defaultMailSetting = emailSettingGroup.AddSetting(L["DisplayName:Emailing.Default"], L["Description:Emailing.Default"]);
defaultMailSetting.AddDetail(
SettingDefinitionManager.Get(EmailSettingNames.DefaultFromAddress),
StringLocalizerFactory,
await SettingManager.GetOrNullAsync(EmailSettingNames.DefaultFromAddress, providerName, providerKey),
ValueType.String);
defaultMailSetting.AddDetail(
SettingDefinitionManager.Get(EmailSettingNames.DefaultFromDisplayName),
StringLocalizerFactory,
await SettingManager.GetOrNullAsync(EmailSettingNames.DefaultFromDisplayName, providerName, providerKey),
ValueType.String);
var smtpSetting = emailSettingGroup.AddSetting(L["DisplayName:Emailing.Smtp"], L["Description:Emailing.Smtp"]);
smtpSetting.AddDetail(
SettingDefinitionManager.Get(EmailSettingNames.Smtp.EnableSsl),
StringLocalizerFactory,
await SettingManager.GetOrNullAsync(EmailSettingNames.Smtp.EnableSsl, providerName, providerKey),
ValueType.Boolean);
smtpSetting.AddDetail(
SettingDefinitionManager.Get(EmailSettingNames.Smtp.UseDefaultCredentials),
StringLocalizerFactory,
await SettingManager.GetOrNullAsync(EmailSettingNames.Smtp.UseDefaultCredentials, providerName, providerKey),
ValueType.Boolean);
smtpSetting.AddDetail(
SettingDefinitionManager.Get(EmailSettingNames.Smtp.Domain),
StringLocalizerFactory,
await SettingManager.GetOrNullAsync(EmailSettingNames.Smtp.Domain, providerName, providerKey),
ValueType.String);
smtpSetting.AddDetail(
SettingDefinitionManager.Get(EmailSettingNames.Smtp.Host),
StringLocalizerFactory,
await SettingManager.GetOrNullAsync(EmailSettingNames.Smtp.Host, providerName, providerKey),
ValueType.String);
smtpSetting.AddDetail(
SettingDefinitionManager.Get(EmailSettingNames.Smtp.Port),
StringLocalizerFactory,
await SettingManager.GetOrNullAsync(EmailSettingNames.Smtp.Port, providerName, providerKey),
ValueType.Number);
smtpSetting.AddDetail(
SettingDefinitionManager.Get(EmailSettingNames.Smtp.UserName),
StringLocalizerFactory,
await SettingManager.GetOrNullAsync(EmailSettingNames.Smtp.UserName, providerName, providerKey),
ValueType.String);
smtpSetting.AddDetail(
SettingDefinitionManager.Get(EmailSettingNames.Smtp.Password),
StringLocalizerFactory,
await SettingManager.GetOrNullAsync(EmailSettingNames.Smtp.Password, providerName, providerKey),
ValueType.String);
settingGroups.Add(emailSettingGroup);
#endregion
return new ListResultDto<SettingGroupDto>(settingGroups);
}
}
}
using Microsoft.AspNetCore.Authorization;
using Microsoft.Extensions.Options;
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;
using Volo.Abp.Account.Settings;
using Volo.Abp.Application.Dtos;
using Volo.Abp.Application.Services;
using Volo.Abp.Caching;
using Volo.Abp.Emailing;
using Volo.Abp.Identity.Settings;
using Volo.Abp.Localization;
using Volo.Abp.MultiTenancy;
using Volo.Abp.SettingManagement;
using Volo.Abp.SettingManagement.Localization;
using Volo.Abp.Settings;
using Volo.Abp.Timing;
using Volo.Abp.Users;
using Volo.Abp.EventBus.Distributed;
using Volo.Abp.AspNetCore.Mvc.ApplicationConfigurations;
using Volo.Abp.Features;
namespace LINGYUN.Abp.SettingManagement
{
[Authorize(AbpSettingManagementPermissions.Settings.Default)]
public class SettingAppService : ApplicationService, ISettingAppService
{
protected AbpLocalizationOptions LocalizationOptions { get; }
protected IDistributedEventBus EventBus { get; }
protected ISettingManager SettingManager { get; }
protected ISettingDefinitionManager SettingDefinitionManager { get; }
protected IDistributedCache<SettingCacheItem> Cache { get; }
public SettingAppService(
IDistributedEventBus eventBus,
ISettingManager settingManager,
IDistributedCache<SettingCacheItem> cache,
IOptions<AbpLocalizationOptions> localizationOptions,
ISettingDefinitionManager settingDefinitionManager)
{
Cache = cache;
EventBus = eventBus;
SettingManager = settingManager;
SettingDefinitionManager = settingDefinitionManager;
LocalizationOptions = localizationOptions.Value;
LocalizationResource = typeof(AbpSettingManagementResource);
}
[Authorize(AbpSettingManagementPermissions.Settings.Manager)]
public virtual async Task SetGlobalAsync(UpdateSettingsDto input)
{
// 增加特性检查
await CheckFeatureAsync();
foreach (var setting in input.Settings)
{
await SettingManager.SetGlobalAsync(setting.Name, setting.Value);
}
CurrentUnitOfWork.OnCompleted(async () =>
{
// 发送刷新用户缓存事件
await EventBus.PublishAsync(new CurrentApplicationConfigurationCacheResetEventData());
});
await CurrentUnitOfWork.SaveChangesAsync();
}
[Authorize(AbpSettingManagementPermissions.Settings.Manager)]
public virtual async Task SetCurrentTenantAsync(UpdateSettingsDto input)
{
// 增加特性检查
await CheckFeatureAsync();
if (CurrentTenant.IsAvailable)
{
foreach (var setting in input.Settings)
{
await SettingManager.SetForTenantAsync(CurrentTenant.GetId(), setting.Name, setting.Value);
}
CurrentUnitOfWork.OnCompleted(async () =>
{
// 发送刷新用户缓存事件
await EventBus.PublishAsync(new CurrentApplicationConfigurationCacheResetEventData());
});
await CurrentUnitOfWork.SaveChangesAsync();
}
}
//[Authorize]
[AllowAnonymous]
public virtual async Task<ListResultDto<SettingGroupDto>> GetAllForCurrentTenantAsync()
{
return await GetAllForProviderAsync(TenantSettingValueProvider.ProviderName, CurrentTenant.GetId().ToString());
}
[AllowAnonymous]
public virtual async Task<ListResultDto<SettingGroupDto>> GetAllForGlobalAsync()
{
return await GetAllForProviderAsync(GlobalSettingValueProvider.ProviderName, null);
}
protected virtual async Task<ListResultDto<SettingGroupDto>> GetAllForProviderAsync(string providerName, string providerKey)
{
/*
* 2020-11-19
* colin@foxmail.com
*
* ,
*
* Dto的配置服务,,
* (vue前端已设计为动态表单页面)
*
* ,,
*/
var settingGroups = new List<SettingGroupDto>();
#region 系统设置
var sysSettingGroup = new SettingGroupDto(L["DisplayName:System"], L["Description:System"]);
// 语言
var languageSetting = sysSettingGroup.AddSetting(L["DisplayName:System.Language"], L["Description:System.Language"]);
languageSetting.AddDetail(
SettingDefinitionManager.Get(LocalizationSettingNames.DefaultLanguage),
StringLocalizerFactory,
await SettingManager.GetOrNullAsync(LocalizationSettingNames.DefaultLanguage, providerName, providerKey),
ValueType.Option)
.AddOptions(LocalizationOptions.Languages.Select(l => new OptionDto(l.DisplayName, l.CultureName)));
// 时区
var timingSetting = sysSettingGroup.AddSetting(L["DisplayName:System.Timing"], L["Description:System.Timing"]);
timingSetting.AddDetail(
SettingDefinitionManager.Get(TimingSettingNames.TimeZone),
StringLocalizerFactory,
await SettingManager.GetOrNullAsync(TimingSettingNames.TimeZone, providerName, providerKey),
ValueType.String);
settingGroups.Add(sysSettingGroup);
#endregion
#region 安全设置
var securitySettingGroup = new SettingGroupDto(L["DisplayName:Security"], L["Description:Security"]);
// 用户账户
var accountSetting = securitySettingGroup.AddSetting(L["DisplayName:Security.Account"], L["Description:Security.Account"]);
// 启用本地登录
accountSetting.AddDetail(
SettingDefinitionManager.Get(AccountSettingNames.EnableLocalLogin),
StringLocalizerFactory,
await SettingManager.GetOrNullAsync(AccountSettingNames.EnableLocalLogin, providerName, providerKey),
ValueType.Boolean);
accountSetting.AddDetail(
SettingDefinitionManager.Get(AccountSettingNames.IsSelfRegistrationEnabled),
StringLocalizerFactory,
await SettingManager.GetOrNullAsync(AccountSettingNames.IsSelfRegistrationEnabled, providerName, providerKey),
ValueType.Boolean);
settingGroups.Add(securitySettingGroup);
#endregion
#region 身份标识设置
// 身份标识设置
var identitySetting = new SettingGroupDto(L["DisplayName:Identity"], L["Description:Identity"]);
#region 用户锁定
var lockoutSetting = identitySetting.AddSetting(L["DisplayName:Identity.Lockout"], L["Description:Identity.Lockout"]);
lockoutSetting.AddDetail(
SettingDefinitionManager.Get(IdentitySettingNames.Lockout.AllowedForNewUsers),
StringLocalizerFactory,
await SettingManager.GetOrNullAsync(IdentitySettingNames.Lockout.AllowedForNewUsers, providerName, providerKey),
ValueType.Boolean);
lockoutSetting.AddDetail(
SettingDefinitionManager.Get(IdentitySettingNames.Lockout.LockoutDuration),
StringLocalizerFactory,
await SettingManager.GetOrNullAsync(IdentitySettingNames.Lockout.LockoutDuration, providerName, providerKey),
ValueType.Number);
lockoutSetting.AddDetail(
SettingDefinitionManager.Get(IdentitySettingNames.Lockout.MaxFailedAccessAttempts),
StringLocalizerFactory,
await SettingManager.GetOrNullAsync(IdentitySettingNames.Lockout.MaxFailedAccessAttempts, providerName, providerKey),
ValueType.Number);
#endregion
#region 用户
var userSetting = identitySetting.AddSetting(L["DisplayName:Identity.User"], L["Description:Identity.User"]);
userSetting.AddDetail(
SettingDefinitionManager.Get(IdentitySettingNames.User.IsEmailUpdateEnabled),
StringLocalizerFactory,
await SettingManager.GetOrNullAsync(IdentitySettingNames.User.IsEmailUpdateEnabled, providerName, providerKey),
ValueType.Boolean);
userSetting.AddDetail(
SettingDefinitionManager.Get(IdentitySettingNames.User.IsUserNameUpdateEnabled),
StringLocalizerFactory,
await SettingManager.GetOrNullAsync(IdentitySettingNames.User.IsUserNameUpdateEnabled, providerName, providerKey),
ValueType.Boolean);
userSetting.AddDetail(
SettingDefinitionManager.Get(LINGYUN.Abp.Identity.Settings.IdentitySettingNames.User.SmsNewUserRegister),
StringLocalizerFactory,
await SettingManager.GetOrNullAsync(LINGYUN.Abp.Identity.Settings.IdentitySettingNames.User.SmsNewUserRegister, providerName, providerKey),
ValueType.String);
userSetting.AddDetail(
SettingDefinitionManager.Get(LINGYUN.Abp.Identity.Settings.IdentitySettingNames.User.SmsResetPassword),
StringLocalizerFactory,
await SettingManager.GetOrNullAsync(LINGYUN.Abp.Identity.Settings.IdentitySettingNames.User.SmsResetPassword, providerName, providerKey),
ValueType.String);
userSetting.AddDetail(
SettingDefinitionManager.Get(LINGYUN.Abp.Identity.Settings.IdentitySettingNames.User.SmsUserSignin),
StringLocalizerFactory,
await SettingManager.GetOrNullAsync(LINGYUN.Abp.Identity.Settings.IdentitySettingNames.User.SmsUserSignin, providerName, providerKey),
ValueType.String);
userSetting.AddDetail(
SettingDefinitionManager.Get(LINGYUN.Abp.Identity.Settings.IdentitySettingNames.User.SmsPhoneNumberConfirmed),
StringLocalizerFactory,
await SettingManager.GetOrNullAsync(LINGYUN.Abp.Identity.Settings.IdentitySettingNames.User.SmsPhoneNumberConfirmed, providerName, providerKey),
ValueType.String);
userSetting.AddDetail(
SettingDefinitionManager.Get(LINGYUN.Abp.Identity.Settings.IdentitySettingNames.User.SmsRepetInterval),
StringLocalizerFactory,
await SettingManager.GetOrNullAsync(LINGYUN.Abp.Identity.Settings.IdentitySettingNames.User.SmsRepetInterval, providerName, providerKey),
ValueType.Number);
#endregion
#region 登录
var signinSetting = identitySetting.AddSetting(L["DisplayName:Identity.SignIn"], L["Description:Identity.SignIn"]);
signinSetting.AddDetail(
SettingDefinitionManager.Get(IdentitySettingNames.SignIn.EnablePhoneNumberConfirmation),
StringLocalizerFactory,
await SettingManager.GetOrNullAsync(IdentitySettingNames.SignIn.EnablePhoneNumberConfirmation, providerName, providerKey),
ValueType.Boolean);
signinSetting.AddDetail(
SettingDefinitionManager.Get(IdentitySettingNames.SignIn.RequireConfirmedEmail),
StringLocalizerFactory,
await SettingManager.GetOrNullAsync(IdentitySettingNames.SignIn.RequireConfirmedEmail, providerName, providerKey),
ValueType.Boolean);
signinSetting.AddDetail(
SettingDefinitionManager.Get(IdentitySettingNames.SignIn.RequireConfirmedPhoneNumber),
StringLocalizerFactory,
await SettingManager.GetOrNullAsync(IdentitySettingNames.SignIn.RequireConfirmedPhoneNumber, providerName, providerKey),
ValueType.Boolean);
#endregion
#region 密码
var passwordSetting = identitySetting.AddSetting(L["DisplayName:Identity.Password"], L["Description:Identity.Password"]);
passwordSetting.AddDetail(
SettingDefinitionManager.Get(IdentitySettingNames.Password.RequireDigit),
StringLocalizerFactory,
await SettingManager.GetOrNullAsync(IdentitySettingNames.Password.RequireDigit, providerName, providerKey),
ValueType.Boolean);
passwordSetting.AddDetail(
SettingDefinitionManager.Get(IdentitySettingNames.Password.RequiredLength),
StringLocalizerFactory,
await SettingManager.GetOrNullAsync(IdentitySettingNames.Password.RequiredLength, providerName, providerKey),
ValueType.Number);
passwordSetting.AddDetail(
SettingDefinitionManager.Get(IdentitySettingNames.Password.RequiredUniqueChars),
StringLocalizerFactory,
await SettingManager.GetOrNullAsync(IdentitySettingNames.Password.RequiredUniqueChars, providerName, providerKey),
ValueType.Number);
passwordSetting.AddDetail(
SettingDefinitionManager.Get(IdentitySettingNames.Password.RequireLowercase),
StringLocalizerFactory,
await SettingManager.GetOrNullAsync(IdentitySettingNames.Password.RequireLowercase, providerName, providerKey),
ValueType.Boolean);
passwordSetting.AddDetail(
SettingDefinitionManager.Get(IdentitySettingNames.Password.RequireUppercase),
StringLocalizerFactory,
await SettingManager.GetOrNullAsync(IdentitySettingNames.Password.RequireUppercase, providerName, providerKey),
ValueType.Boolean);
passwordSetting.AddDetail(
SettingDefinitionManager.Get(IdentitySettingNames.Password.RequireNonAlphanumeric),
StringLocalizerFactory,
await SettingManager.GetOrNullAsync(IdentitySettingNames.Password.RequireNonAlphanumeric, providerName, providerKey),
ValueType.Boolean);
#endregion
#region 双因素
// Removed See: https://github.com/abpframework/abp/pull/7719
//var twoFactorSetting = identitySetting.AddSetting(L["DisplayName:Identity.TwoFactor"], L["Description:Identity.TwoFactor"]);
//twoFactorSetting.AddDetail(
// SettingDefinitionManager.Get(IdentitySettingNames.TwoFactor.Behaviour),
// StringLocalizerFactory,
// await SettingManager.GetOrNullAsync(IdentitySettingNames.TwoFactor.Behaviour, providerName, providerKey),
// ValueType.Option)
// .AddOption(IdentityTwoFactorBehaviour.Optional.ToString(), IdentityTwoFactorBehaviour.Optional.ToString())
// .AddOption(IdentityTwoFactorBehaviour.Forced.ToString(), IdentityTwoFactorBehaviour.Forced.ToString())
// .AddOption(IdentityTwoFactorBehaviour.Disabled.ToString(), IdentityTwoFactorBehaviour.Disabled.ToString());
//twoFactorSetting.AddDetail(
// SettingDefinitionManager.Get(IdentitySettingNames.TwoFactor.UsersCanChange),
// StringLocalizerFactory,
// await SettingManager.GetOrNullAsync(IdentitySettingNames.TwoFactor.UsersCanChange, providerName, providerKey),
// ValueType.Boolean);
#endregion
#region 组织机构
var ouSetting = identitySetting.AddSetting(L["DisplayName:Identity.OrganizationUnit"], L["Description:Identity.OrganizationUnit"]);
ouSetting.AddDetail(
SettingDefinitionManager.Get(IdentitySettingNames.OrganizationUnit.MaxUserMembershipCount),
StringLocalizerFactory,
await SettingManager.GetOrNullAsync(IdentitySettingNames.OrganizationUnit.MaxUserMembershipCount, providerName, providerKey),
ValueType.Number);
settingGroups.Add(identitySetting);
#endregion
#endregion
#region 邮件设置
var emailSettingGroup = new SettingGroupDto(L["DisplayName:Emailing"], L["Description:Emailing"]);
var defaultMailSetting = emailSettingGroup.AddSetting(L["DisplayName:Emailing.Default"], L["Description:Emailing.Default"]);
defaultMailSetting.AddDetail(
SettingDefinitionManager.Get(EmailSettingNames.DefaultFromAddress),
StringLocalizerFactory,
await SettingManager.GetOrNullAsync(EmailSettingNames.DefaultFromAddress, providerName, providerKey),
ValueType.String);
defaultMailSetting.AddDetail(
SettingDefinitionManager.Get(EmailSettingNames.DefaultFromDisplayName),
StringLocalizerFactory,
await SettingManager.GetOrNullAsync(EmailSettingNames.DefaultFromDisplayName, providerName, providerKey),
ValueType.String);
var smtpSetting = emailSettingGroup.AddSetting(L["DisplayName:Emailing.Smtp"], L["Description:Emailing.Smtp"]);
smtpSetting.AddDetail(
SettingDefinitionManager.Get(EmailSettingNames.Smtp.EnableSsl),
StringLocalizerFactory,
await SettingManager.GetOrNullAsync(EmailSettingNames.Smtp.EnableSsl, providerName, providerKey),
ValueType.Boolean);
smtpSetting.AddDetail(
SettingDefinitionManager.Get(EmailSettingNames.Smtp.UseDefaultCredentials),
StringLocalizerFactory,
await SettingManager.GetOrNullAsync(EmailSettingNames.Smtp.UseDefaultCredentials, providerName, providerKey),
ValueType.Boolean);
smtpSetting.AddDetail(
SettingDefinitionManager.Get(EmailSettingNames.Smtp.Domain),
StringLocalizerFactory,
await SettingManager.GetOrNullAsync(EmailSettingNames.Smtp.Domain, providerName, providerKey),
ValueType.String);
smtpSetting.AddDetail(
SettingDefinitionManager.Get(EmailSettingNames.Smtp.Host),
StringLocalizerFactory,
await SettingManager.GetOrNullAsync(EmailSettingNames.Smtp.Host, providerName, providerKey),
ValueType.String);
smtpSetting.AddDetail(
SettingDefinitionManager.Get(EmailSettingNames.Smtp.Port),
StringLocalizerFactory,
await SettingManager.GetOrNullAsync(EmailSettingNames.Smtp.Port, providerName, providerKey),
ValueType.Number);
smtpSetting.AddDetail(
SettingDefinitionManager.Get(EmailSettingNames.Smtp.UserName),
StringLocalizerFactory,
await SettingManager.GetOrNullAsync(EmailSettingNames.Smtp.UserName, providerName, providerKey),
ValueType.String);
smtpSetting.AddDetail(
SettingDefinitionManager.Get(EmailSettingNames.Smtp.Password),
StringLocalizerFactory,
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.Messages;
using LINGYUN.Abp.RealTime;
using Microsoft.Extensions.Logging;
using Microsoft.Extensions.Logging.Abstractions;
using Microsoft.Extensions.Options;
using System.Threading.Tasks;
using Volo.Abp.DependencyInjection;
using Volo.Abp.EventBus.Distributed;
namespace LINGYUN.Abp.MessageService.EventBus.Distributed
{
public class ChatMessageEventHandler : IDistributedEventHandler<RealTimeEto<ChatMessage>>, ITransientDependency
{
/// <summary>
/// Reference to <see cref="ILogger<DefaultNotificationDispatcher>"/>.
/// </summary>
public ILogger<ChatMessageEventHandler> Logger { get; set; }
/// <summary>
/// Reference to <see cref="AbpIMOptions"/>.
/// </summary>
protected AbpIMOptions Options { get; }
protected IMessageStore MessageStore { get; }
protected IMessageSenderProviderManager MessageSenderProviderManager { get; }
public ChatMessageEventHandler(
IOptions<AbpIMOptions> options,
IMessageStore messageStore,
IMessageSenderProviderManager messageSenderProviderManager)
{
Options = options.Value;
MessageStore = messageStore;
MessageSenderProviderManager = messageSenderProviderManager;
Logger = NullLogger<ChatMessageEventHandler>.Instance;
}
public virtual async Task HandleEventAsync(RealTimeEto<ChatMessage> eventData)
{
Logger.LogDebug($"Persistent chat message.");
await MessageStore.StoreMessageAsync(eventData.Data);
// 发送消息
foreach (var provider in MessageSenderProviderManager.Providers)
{
Logger.LogDebug($"Sending message with provider {provider.Name}");
await provider.SendMessageAsync(eventData.Data);
}
}
}
}
using LINGYUN.Abp.IM;
using LINGYUN.Abp.IM.Messages;
using LINGYUN.Abp.RealTime;
using Microsoft.Extensions.Logging;
using Microsoft.Extensions.Logging.Abstractions;
using Microsoft.Extensions.Options;
using System.Threading.Tasks;
using Volo.Abp.DependencyInjection;
using Volo.Abp.EventBus.Distributed;
namespace LINGYUN.Abp.MessageService.EventBus.Distributed
{
public class ChatMessageEventHandler : IDistributedEventHandler<RealTimeEto<ChatMessage>>, ITransientDependency
{
/// <summary>
/// Reference to <see cref="ILogger<DefaultNotificationDispatcher>"/>.
/// </summary>
public ILogger<ChatMessageEventHandler> Logger { get; set; }
/// <summary>
/// Reference to <see cref="AbpIMOptions"/>.
/// </summary>
protected AbpIMOptions Options { get; }
protected IMessageStore MessageStore { get; }
protected IMessageBlocker MessageBlocker { get; }
protected IMessageSenderProviderManager MessageSenderProviderManager { get; }
public ChatMessageEventHandler(
IOptions<AbpIMOptions> options,
IMessageStore messageStore,
IMessageBlocker messageBlocker,
IMessageSenderProviderManager messageSenderProviderManager)
{
Options = options.Value;
MessageStore = messageStore;
MessageBlocker = messageBlocker;
MessageSenderProviderManager = messageSenderProviderManager;
Logger = NullLogger<ChatMessageEventHandler>.Instance;
}
public virtual async Task HandleEventAsync(RealTimeEto<ChatMessage> eventData)
{
Logger.LogDebug($"Persistent chat message.");
var message = 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