using Hamakaze; using SharpChat.Bans; using SharpChat.Users.Remote; using System; using System.Collections.Generic; using System.Net; using System.Text.Json; using System.Web; namespace SharpChat.DataProvider.Misuzu.Bans { public class MisuzuBanClient : IBanClient { private const string STRING = @"givemethebeans"; private MisuzuDataProvider DataProvider { get; } private HttpClient HttpClient { get; } private const string URL = @"/bans"; private const string URL_CHECK = URL + @"/check"; private const string URL_CREATE = URL + @"/create"; private const string URL_REMOVE = URL + @"/remove"; public MisuzuBanClient(MisuzuDataProvider dataProvider, HttpClient httpClient) { DataProvider = dataProvider ?? throw new ArgumentNullException(nameof(dataProvider)); HttpClient = httpClient ?? throw new ArgumentNullException(nameof(httpClient)); } public void GetBanList(Action> onSuccess, Action onFailure) { HttpRequestMessage req = new(HttpRequestMessage.GET, DataProvider.GetURL(URL)); req.SetHeader(@"X-SharpChat-Signature", DataProvider.GetSignedHash(STRING)); HttpClient.SendRequest( req, onComplete: (t, r) => onSuccess.Invoke(JsonSerializer.Deserialize>(r.GetBodyBytes())), (t, e) => { Logger.Debug(e); onFailure?.Invoke(e); } ); } public void CheckBan(IRemoteUser subject, IPAddress ipAddress, Action onSuccess, Action onFailure) { HttpRequestMessage req = new( HttpRequestMessage.GET, string.Format(@"{0}?a={1}&u={2}", DataProvider.GetURL(URL_CHECK), ipAddress, subject.UserId) ); req.SetHeader(@"X-SharpChat-Signature", DataProvider.GetSignedHash(string.Format(@"check#{0}#{1}", ipAddress, subject.UserId))); HttpClient.SendRequest( req, (t, r) => { try { onSuccess.Invoke(JsonSerializer.Deserialize(r.GetBodyBytes())); } catch(Exception ex) { Logger.Debug(ex); onFailure.Invoke(ex); } }, (t, e) => { Logger.Debug(e); onFailure?.Invoke(e); } ); } public void CreateBan(IRemoteUser subject, IRemoteUser moderator, bool perma, TimeSpan duration, string reason, Action onSuccess, Action onFailure) { reason ??= string.Empty; long modId = moderator?.UserId ?? DataProvider.ActorId; HttpRequestMessage req = new(HttpRequestMessage.POST, DataProvider.GetURL(URL_CREATE)); req.SetHeader(@"Content-Type", @"application/x-www-form-urlencoded"); req.SetHeader(@"X-SharpChat-Signature", DataProvider.GetSignedHash(string.Format( @"create#{0}#{1}#{2}#{3}#{4}", subject.UserId, modId, duration.TotalSeconds, perma ? '1' : '0', reason ))); req.SetBody(string.Format( @"u={0}&m={1}&d={2}&p={3}&r={4}", subject.UserId, modId, duration.TotalSeconds, perma ? '1' : '0', HttpUtility.UrlEncode(reason) )); HttpClient.SendRequest( req, (t, r) => onSuccess?.Invoke(r.StatusCode == 201), (t, e) => { Logger.Debug(e); onFailure?.Invoke(e); } ); } public void RemoveBan(IRemoteUser subject, Action onSuccess, Action onFailure) { RemoveBan(@"user", subject.UserId, onSuccess, onFailure); } public void RemoveBan(IPAddress ipAddress, Action onSuccess, Action onFailure) { RemoveBan(@"ip", ipAddress, onSuccess, onFailure); } private void RemoveBan(string type, object param, Action onSuccess, Action onFailure) { HttpRequestMessage req = new( HttpRequestMessage.DELETE, string.Format(@"{0}?t={1}&s={2}", DataProvider.GetURL(URL_REMOVE), type, param) ); req.SetHeader(@"X-SharpChat-Signature", DataProvider.GetSignedHash(string.Format(@"remove#{0}#{1}", type, param))); HttpClient.SendRequest( req, (t, r) => onSuccess.Invoke(r.StatusCode == 204), (t, e) => { Logger.Debug(e); onFailure?.Invoke(e); } ); } } }