using SharpChat.Events; using SharpChat.Users; using SharpChat.Users.Remote; using System; using System.Collections.Generic; using System.Net; namespace SharpChat.Bans { public class BanManager { private UserManager Users { get; } private IBanClient BanClient { get; } private IRemoteUserClient RemoteUserClient { get; } private IEventDispatcher Dispatcher { get; } private readonly object Sync = new(); public BanManager( UserManager users, IBanClient banClient, IRemoteUserClient remoteUserClient, IEventDispatcher dispatcher ) { Users = users ?? throw new ArgumentNullException(nameof(users)); BanClient = banClient ?? throw new ArgumentNullException(nameof(banClient)); RemoteUserClient = remoteUserClient ?? throw new ArgumentNullException(nameof(remoteUserClient)); Dispatcher = dispatcher ?? throw new ArgumentNullException(nameof(dispatcher)); } public void GetBanList( Action> onSuccess, Action onFailure ) { if(onSuccess == null) throw new ArgumentNullException(nameof(onSuccess)); if(onFailure == null) throw new ArgumentNullException(nameof(onFailure)); lock(Sync) BanClient.GetBanList(onSuccess, onFailure); } public void CheckBan( long userId, IPAddress ipAddress, Action onSuccess, Action onFailure ) { if(ipAddress == null) throw new ArgumentNullException(nameof(ipAddress)); if(onSuccess == null) throw new ArgumentNullException(nameof(onSuccess)); if(onFailure == null) throw new ArgumentNullException(nameof(onFailure)); lock(Sync) RemoteUserClient.ResolveUser( userId, rui => { if(rui == null) onSuccess(null); else CheckBan(rui, ipAddress, onSuccess, onFailure); }, onFailure ); } public void CheckBan( IUser localUserInfo, IPAddress ipAddress, Action onSuccess, Action onFailure ) { if(localUserInfo == null) throw new ArgumentNullException(nameof(localUserInfo)); if(ipAddress == null) throw new ArgumentNullException(nameof(ipAddress)); if(onSuccess == null) throw new ArgumentNullException(nameof(onSuccess)); if(onFailure == null) throw new ArgumentNullException(nameof(onFailure)); lock(Sync) RemoteUserClient.ResolveUser( localUserInfo, rui => { if(rui == null) onSuccess(null); else CheckBan(rui, ipAddress, onSuccess, onFailure); }, onFailure ); } public void CheckBan( IRemoteUser remoteUserInfo, IPAddress ipAddress, Action onSuccess, Action onFailure ) { if(remoteUserInfo == null) throw new ArgumentNullException(nameof(remoteUserInfo)); if(ipAddress == null) throw new ArgumentNullException(nameof(ipAddress)); if(onSuccess == null) throw new ArgumentNullException(nameof(onSuccess)); if(onFailure == null) throw new ArgumentNullException(nameof(onFailure)); lock(Sync) BanClient.CheckBan(remoteUserInfo, ipAddress, onSuccess, onFailure); } public void CreateBan( string subjectName, IUser localModerator, bool permanent, TimeSpan duration, string reason, Action onSuccess, Action onFailure ) { if(subjectName == null) throw new ArgumentNullException(nameof(subjectName)); if(reason == null) throw new ArgumentNullException(nameof(reason)); if(onSuccess == null) throw new ArgumentNullException(nameof(onSuccess)); if(onFailure == null) throw new ArgumentNullException(nameof(onFailure)); lock(Sync) RemoteUserClient.ResolveUser( subjectName, remoteSubject => { if(remoteSubject == null) onSuccess(false); else CreateBan(remoteSubject, localModerator, permanent, duration, reason, onSuccess, onFailure); }, onFailure ); } public void CreateBan( IUser localSubject, IUser localModerator, bool permanent, TimeSpan duration, string reason, Action onSuccess, Action onFailure ) { if(localSubject == null) throw new ArgumentNullException(nameof(localSubject)); if(reason == null) throw new ArgumentNullException(nameof(reason)); if(onSuccess == null) throw new ArgumentNullException(nameof(onSuccess)); if(onFailure == null) throw new ArgumentNullException(nameof(onFailure)); lock(Sync) RemoteUserClient.ResolveUser( localSubject, remoteSubject => { if(remoteSubject == null) onSuccess(false); else CreateBan(remoteSubject, localModerator, permanent, duration, reason, onSuccess, onFailure); }, onFailure ); } public void CreateBan( IRemoteUser remoteSubject, IUser localModerator, bool permanent, TimeSpan duration, string reason, Action onSuccess, Action onFailure ) { if(remoteSubject == null) throw new ArgumentNullException(nameof(remoteSubject)); if(reason == null) throw new ArgumentNullException(nameof(reason)); if(onSuccess == null) throw new ArgumentNullException(nameof(onSuccess)); if(onFailure == null) throw new ArgumentNullException(nameof(onFailure)); lock(Sync) RemoteUserClient.ResolveUser( localModerator, remoteModerator => CreateBan(remoteSubject, remoteModerator, permanent, duration, reason, onSuccess, onFailure), onFailure ); } public void CreateBan( IRemoteUser remoteSubject, IRemoteUser remoteModerator, bool permanent, TimeSpan duration, string reason, Action onSuccess, Action onFailure ) { if(remoteSubject == null) throw new ArgumentNullException(nameof(remoteSubject)); if(reason == null) throw new ArgumentNullException(nameof(reason)); if(onSuccess == null) throw new ArgumentNullException(nameof(onSuccess)); if(onFailure == null) throw new ArgumentNullException(nameof(onFailure)); lock(Sync) BanClient.CreateBan(remoteSubject, remoteModerator, permanent, duration, reason, success => { Dispatcher.DispatchEvent(this, new UserBanCreatedEvent(remoteSubject, remoteModerator, permanent, duration, reason)); Users.Disconnect( remoteSubject, remoteModerator == null ? UserDisconnectReason.Flood : UserDisconnectReason.Kicked ); onSuccess.Invoke(success); }, onFailure); } public void RemoveBan( long userId, Action onSuccess, Action onFailure ) { if(onSuccess == null) throw new ArgumentNullException(nameof(onSuccess)); if(onFailure == null) throw new ArgumentNullException(nameof(onFailure)); lock(Sync) RemoteUserClient.ResolveUser( userId, remoteUser => { if(remoteUser == null) onSuccess(false); else RemoveBan(remoteUser, onSuccess, onFailure); }, onFailure ); } public void RemoveBan( string userName, Action onSuccess, Action onFailure ) { if(userName == null) throw new ArgumentNullException(nameof(userName)); if(onSuccess == null) throw new ArgumentNullException(nameof(onSuccess)); if(onFailure == null) throw new ArgumentNullException(nameof(onFailure)); lock(Sync) RemoteUserClient.ResolveUser( userName, remoteUser => { if(remoteUser == null) onSuccess(false); else RemoveBan(remoteUser, onSuccess, onFailure); }, onFailure ); } public void RemoveBan( IUser localUser, Action onSuccess, Action onFailure ) { if(localUser == null) throw new ArgumentNullException(nameof(localUser)); if(onSuccess == null) throw new ArgumentNullException(nameof(onSuccess)); if(onFailure == null) throw new ArgumentNullException(nameof(onFailure)); lock(Sync) RemoteUserClient.ResolveUser( localUser, remoteUser => { if(remoteUser == null) onSuccess(false); else RemoveBan(remoteUser, onSuccess, onFailure); }, onFailure ); } public void RemoveBan( IRemoteUser remoteUser, Action onSuccess, Action onFailure ) { if(remoteUser == null) throw new ArgumentNullException(nameof(remoteUser)); if(onSuccess == null) throw new ArgumentNullException(nameof(onSuccess)); if(onFailure == null) throw new ArgumentNullException(nameof(onFailure)); lock(Sync) BanClient.RemoveBan(remoteUser, success => { Dispatcher.DispatchEvent(this, new UserBanRemovedEvent(remoteUser)); onSuccess.Invoke(success); }, onFailure); } public void RemoveBan( IPAddress ipAddress, Action onSuccess, Action onFailure ) { if(ipAddress == null) throw new ArgumentNullException(nameof(ipAddress)); if(onSuccess == null) throw new ArgumentNullException(nameof(onSuccess)); if(onFailure == null) throw new ArgumentNullException(nameof(onFailure)); lock(Sync) BanClient.RemoveBan(ipAddress, success => { Dispatcher.DispatchEvent(this, new IPBanRemovedEvent(ipAddress)); onSuccess.Invoke(success); }, onFailure); } } }