Browse Source

add im message blocker

pull/305/head
cKey 4 years ago
parent
commit
a071e719b0
  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="provider"></param>
</member>
<member name="M:DotNetCore.CAP.Processor.AbpCapProcessingServer.Start">
<member name="M:DotNetCore.CAP.Processor.AbpCapProcessingServer.Start(System.Threading.CancellationToken)">
<summary>
Start
</summary>
@ -292,7 +292,7 @@
取消令牌
</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)">
<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>
@ -300,8 +300,9 @@
<param name="distributedEventBusOptions"></param>
<param name="capPublisher"></param>
<param name="currentUser"></param>
<param name="currentTenant"></param>
<param name="currentClient"></param>
<param name="currentTenant"></param>
<param name="eventErrorHandler"></param>
<param name="cancellationTokenProvider"></param>
<param name="customDistributedEventSubscriber"></param>
</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.Linq;
using System.Threading.Tasks;
using Volo.Abp.DependencyInjection;
namespace LINGYUN.Abp.IM.SignalR.Messages
{
@ -23,7 +24,7 @@ namespace LINGYUN.Abp.IM.SignalR.Messages
public SignalRMessageSenderProvider(
IOnlineClientManager onlineClientManager,
IHubContext<MessagesHub> hubContext,
IServiceProvider serviceProvider,
IAbpLazyServiceProvider serviceProvider,
IOptions<AbpIMSignalROptions> options)
: 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
{
/// <summary>
/// 消息发送者
/// </summary>
public ITypeList<IMessageSenderProvider> Providers { get; }
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 System;
using System.Threading.Tasks;
@ -11,33 +10,14 @@ namespace LINGYUN.Abp.IM.Messages
{
public abstract string Name { get; }
protected IServiceProvider ServiceProvider { get; }
protected IAbpLazyServiceProvider ServiceProvider { get; }
protected readonly object ServiceProviderLock = new object();
public ILoggerFactory LoggerFactory => LazyGetRequiredService(ref _loggerFactory);
private ILoggerFactory _loggerFactory;
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 TService LazyGetRequiredService<TService>(ref TService reference)
{
if (reference == null)
{
lock (ServiceProviderLock)
{
if (reference == null)
{
reference = ServiceProvider.GetRequiredService<TService>();
}
}
}
return reference;
}
protected MessageSenderProviderBase(IServiceProvider serviceProvider)
protected MessageSenderProviderBase(IAbpLazyServiceProvider 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.Collections.Generic;
using System.Linq;
using Volo.Abp.Domain.Entities;
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.EventBus.Distributed;
using Volo.Abp.AspNetCore.Mvc.ApplicationConfigurations;
using Volo.Abp.Features;
namespace LINGYUN.Abp.SettingManagement
{
@ -49,6 +50,9 @@ namespace LINGYUN.Abp.SettingManagement
[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);
@ -66,6 +70,9 @@ namespace LINGYUN.Abp.SettingManagement
[Authorize(AbpSettingManagementPermissions.Settings.Manager)]
public virtual async Task SetCurrentTenantAsync(UpdateSettingsDto input)
{
// 增加特性检查
await CheckFeatureAsync();
if (CurrentTenant.IsAvailable)
{
foreach (var setting in input.Settings)
@ -373,5 +380,10 @@ namespace LINGYUN.Abp.SettingManagement
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 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;
@ -40,13 +43,18 @@ namespace LINGYUN.Abp.MessageService.EventBus.Distributed
{
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)
{
Logger.LogDebug($"Sending message with provider {provider.Name}");
await provider.SendMessageAsync(eventData.Data);
await provider.SendMessageAsync(message);
}
}
}

Loading…
Cancel
Save