Browse Source

Merge pull request #305 from colinin/4.4

add im message blocker
pull/364/head
yx lin 4 years ago
committed by GitHub
parent
commit
56a1275a0b
No known key found for this signature in database GPG Key ID: 4AEE18F83AFDEB23
  1. 7
      aspnet-core/modules/common/LINGYUN.Abp.EventBus.CAP/modules/common/LINGYUN.Abp.EventBus.CAP/LINGYUN.Abp.EventBus.CAP.xml
  2. 3
      aspnet-core/modules/common/LINGYUN.Abp.IM.SignalR/LINGYUN/Abp/IM/SignalR/Messages/SignalRMessageSenderProvider.cs
  3. 3
      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. 28
      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. 2
      aspnet-core/modules/message/LINGYUN.Abp.MessageService.Domain/LINGYUN/Abp/MessageService/Chat/UserChatSetting.cs
  9. 12
      aspnet-core/modules/settings/LINGYUN.Abp.SettingManagement.Application/LINGYUN/Abp/SettingManagement/SettingAppService.cs
  10. 12
      aspnet-core/services/messages/LINGYUN.Abp.MessageService.HttpApi.Host/EventBus/Distributed/ChatMessageEventHandler.cs

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

@ -94,7 +94,7 @@
<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>
@ -292,7 +292,7 @@
取消令牌 取消令牌
</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>
@ -300,8 +300,9 @@
<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="eventErrorHandler"></param>
<param name="cancellationTokenProvider"></param> <param name="cancellationTokenProvider"></param>
<param name="customDistributedEventSubscriber"></param> <param name="customDistributedEventSubscriber"></param>
</member> </member>

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

@ -8,6 +8,7 @@ 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
{ {
@ -23,7 +24,7 @@ namespace LINGYUN.Abp.IM.SignalR.Messages
public SignalRMessageSenderProvider( public SignalRMessageSenderProvider(
IOnlineClientManager onlineClientManager, IOnlineClientManager onlineClientManager,
IHubContext<MessagesHub> hubContext, IHubContext<MessagesHub> hubContext,
IServiceProvider serviceProvider, IAbpLazyServiceProvider serviceProvider,
IOptions<AbpIMSignalROptions> options) IOptions<AbpIMSignalROptions> options)
: base(serviceProvider) : base(serviceProvider)
{ {

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

@ -5,6 +5,9 @@ namespace LINGYUN.Abp.IM
{ {
public class AbpIMOptions public class AbpIMOptions
{ {
/// <summary>
/// 消息发送者
/// </summary>
public ITypeList<IMessageSenderProvider> Providers { get; } public ITypeList<IMessageSenderProvider> Providers { get; }
public AbpIMOptions() public AbpIMOptions()

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;
}
}
}

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

@ -1,5 +1,4 @@
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;
@ -11,33 +10,14 @@ namespace LINGYUN.Abp.IM.Messages
{ {
public abstract string Name { get; } public abstract string Name { get; }
protected IServiceProvider ServiceProvider { get; } protected IAbpLazyServiceProvider ServiceProvider { get; }
protected readonly object ServiceProviderLock = new object(); protected ILoggerFactory LoggerFactory => ServiceProvider.LazyGetRequiredService<ILoggerFactory>();
public ILoggerFactory LoggerFactory => LazyGetRequiredService(ref _loggerFactory);
private ILoggerFactory _loggerFactory;
protected ILogger Logger => _lazyLogger.Value; protected ILogger Logger => _lazyLogger.Value;
private Lazy<ILogger> _lazyLogger => new Lazy<ILogger>(() => LoggerFactory?.CreateLogger(GetType().FullName) ?? NullLogger.Instance, true); private Lazy<ILogger> _lazyLogger => new Lazy<ILogger>(() => LoggerFactory?.CreateLogger(GetType().FullName) ?? NullLogger.Instance, true);
protected TService LazyGetRequiredService<TService>(ref TService reference) protected MessageSenderProviderBase(IAbpLazyServiceProvider serviceProvider)
{
if (reference == null)
{
lock (ServiceProviderLock)
{
if (reference == null)
{
reference = ServiceProvider.GetRequiredService<TService>();
}
}
}
return reference;
}
protected MessageSenderProviderBase(IServiceProvider serviceProvider)
{ {
ServiceProvider = serviceProvider; ServiceProvider = serviceProvider;
} }

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;
}
}
}

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

@ -1,6 +1,4 @@
using System; using System;
using System.Collections.Generic;
using System.Linq;
using Volo.Abp.Domain.Entities; using Volo.Abp.Domain.Entities;
using Volo.Abp.MultiTenancy; using Volo.Abp.MultiTenancy;

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

@ -18,6 +18,7 @@ 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
{ {
@ -49,6 +50,9 @@ namespace LINGYUN.Abp.SettingManagement
[Authorize(AbpSettingManagementPermissions.Settings.Manager)] [Authorize(AbpSettingManagementPermissions.Settings.Manager)]
public virtual async Task SetGlobalAsync(UpdateSettingsDto input) public virtual async Task SetGlobalAsync(UpdateSettingsDto input)
{ {
// 增加特性检查
await CheckFeatureAsync();
foreach (var setting in input.Settings) foreach (var setting in input.Settings)
{ {
await SettingManager.SetGlobalAsync(setting.Name, setting.Value); await SettingManager.SetGlobalAsync(setting.Name, setting.Value);
@ -66,6 +70,9 @@ namespace LINGYUN.Abp.SettingManagement
[Authorize(AbpSettingManagementPermissions.Settings.Manager)] [Authorize(AbpSettingManagementPermissions.Settings.Manager)]
public virtual async Task SetCurrentTenantAsync(UpdateSettingsDto input) public virtual async Task SetCurrentTenantAsync(UpdateSettingsDto input)
{ {
// 增加特性检查
await CheckFeatureAsync();
if (CurrentTenant.IsAvailable) if (CurrentTenant.IsAvailable)
{ {
foreach (var setting in input.Settings) foreach (var setting in input.Settings)
@ -373,5 +380,10 @@ namespace LINGYUN.Abp.SettingManagement
return new ListResultDto<SettingGroupDto>(settingGroups); return new ListResultDto<SettingGroupDto>(settingGroups);
} }
protected virtual async Task CheckFeatureAsync()
{
await FeatureChecker.CheckEnabledAsync(SettingManagementFeatures.Enable);
}
} }
} }

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

@ -22,15 +22,18 @@ namespace LINGYUN.Abp.MessageService.EventBus.Distributed
protected AbpIMOptions Options { get; } protected AbpIMOptions Options { get; }
protected IMessageStore MessageStore { get; } protected IMessageStore MessageStore { get; }
protected IMessageBlocker MessageBlocker { get; }
protected IMessageSenderProviderManager MessageSenderProviderManager { get; } protected IMessageSenderProviderManager MessageSenderProviderManager { get; }
public ChatMessageEventHandler( public ChatMessageEventHandler(
IOptions<AbpIMOptions> options, IOptions<AbpIMOptions> options,
IMessageStore messageStore, IMessageStore messageStore,
IMessageBlocker messageBlocker,
IMessageSenderProviderManager messageSenderProviderManager) IMessageSenderProviderManager messageSenderProviderManager)
{ {
Options = options.Value; Options = options.Value;
MessageStore = messageStore; MessageStore = messageStore;
MessageBlocker = messageBlocker;
MessageSenderProviderManager = messageSenderProviderManager; MessageSenderProviderManager = messageSenderProviderManager;
Logger = NullLogger<ChatMessageEventHandler>.Instance; Logger = NullLogger<ChatMessageEventHandler>.Instance;
@ -40,13 +43,18 @@ namespace LINGYUN.Abp.MessageService.EventBus.Distributed
{ {
Logger.LogDebug($"Persistent chat message."); Logger.LogDebug($"Persistent chat message.");
await MessageStore.StoreMessageAsync(eventData.Data); var message = eventData.Data;
// 消息拦截
// 扩展敏感词汇过滤
await MessageBlocker.InterceptAsync(message);
await MessageStore.StoreMessageAsync(message);
// 发送消息 // 发送消息
foreach (var provider in MessageSenderProviderManager.Providers) foreach (var provider in MessageSenderProviderManager.Providers)
{ {
Logger.LogDebug($"Sending message with provider {provider.Name}"); Logger.LogDebug($"Sending message with provider {provider.Name}");
await provider.SendMessageAsync(eventData.Data); await provider.SendMessageAsync(message);
} }
} }
} }

Loading…
Cancel
Save