From 942022d40866cc729464d0b9c9b844a81a5eb043 Mon Sep 17 00:00:00 2001 From: Ske Date: Sun, 11 Aug 2019 22:56:20 +0200 Subject: [PATCH 01/51] Track database handles over metrics --- PluralKit.Bot/Bot.cs | 3 +- .../Services/PeriodicStatCollector.cs | 8 +- PluralKit.Core/CoreMetrics.cs | 3 + PluralKit.Core/Utils.cs | 104 +++++++++++++++++- 4 files changed, 111 insertions(+), 7 deletions(-) diff --git a/PluralKit.Bot/Bot.cs b/PluralKit.Bot/Bot.cs index ec31da8c..d0d39793 100644 --- a/PluralKit.Bot/Bot.cs +++ b/PluralKit.Bot/Bot.cs @@ -79,7 +79,8 @@ namespace PluralKit.Bot .AddTransient(_ => _config.GetSection("PluralKit").Get() ?? new CoreConfig()) .AddTransient(_ => _config.GetSection("PluralKit").GetSection("Bot").Get() ?? new BotConfig()) - .AddTransient(svc => new DbConnectionFactory(svc.GetRequiredService().Database)) + .AddSingleton() + .AddTransient() .AddSingleton(_ => new DiscordShardedClient(new DiscordSocketConfig { diff --git a/PluralKit.Bot/Services/PeriodicStatCollector.cs b/PluralKit.Bot/Services/PeriodicStatCollector.cs index 3a745e64..55b59536 100644 --- a/PluralKit.Bot/Services/PeriodicStatCollector.cs +++ b/PluralKit.Bot/Services/PeriodicStatCollector.cs @@ -24,9 +24,11 @@ namespace PluralKit.Bot private WebhookCacheService _webhookCache; + private DbConnectionCountHolder _countHolder; + private ILogger _logger; - public PeriodicStatCollector(IDiscordClient client, IMetrics metrics, SystemStore systems, MemberStore members, SwitchStore switches, MessageStore messages, ILogger logger, WebhookCacheService webhookCache) + public PeriodicStatCollector(IDiscordClient client, IMetrics metrics, SystemStore systems, MemberStore members, SwitchStore switches, MessageStore messages, ILogger logger, WebhookCacheService webhookCache, DbConnectionCountHolder countHolder) { _client = (DiscordShardedClient) client; _metrics = metrics; @@ -35,6 +37,7 @@ namespace PluralKit.Bot _switches = switches; _messages = messages; _webhookCache = webhookCache; + _countHolder = countHolder; _logger = logger.ForContext(); } @@ -75,6 +78,9 @@ namespace PluralKit.Bot _metrics.Measure.Gauge.SetValue(CoreMetrics.ProcessHandles, process.HandleCount); _metrics.Measure.Gauge.SetValue(CoreMetrics.CpuUsage, await EstimateCpuUsage()); + // Database info + _metrics.Measure.Gauge.SetValue(CoreMetrics.DatabaseConnections, _countHolder.ConnectionCount); + // Other shiz _metrics.Measure.Gauge.SetValue(BotMetrics.WebhookCacheSize, _webhookCache.CacheSize); diff --git a/PluralKit.Core/CoreMetrics.cs b/PluralKit.Core/CoreMetrics.cs index 97dad6a6..a8850296 100644 --- a/PluralKit.Core/CoreMetrics.cs +++ b/PluralKit.Core/CoreMetrics.cs @@ -17,5 +17,8 @@ namespace PluralKit.Core public static GaugeOptions ProcessThreads => new GaugeOptions { Name = "Process Thread Count", MeasurementUnit = Unit.Threads, Context = "Process" }; public static GaugeOptions ProcessHandles => new GaugeOptions { Name = "Process Handle Count", MeasurementUnit = Unit.Items, Context = "Process" }; public static GaugeOptions CpuUsage => new GaugeOptions { Name = "CPU Usage", MeasurementUnit = Unit.Percent, Context = "Process" }; + + public static MeterOptions DatabaseRequests => new MeterOptions() { Name = "Database Requests", MeasurementUnit = Unit.Requests, Context = "Database" }; + public static GaugeOptions DatabaseConnections => new GaugeOptions() { Name = "Database Connections", MeasurementUnit = Unit.Connections, Context = "Database" }; } } \ No newline at end of file diff --git a/PluralKit.Core/Utils.cs b/PluralKit.Core/Utils.cs index 176a50f9..a89ef041 100644 --- a/PluralKit.Core/Utils.cs +++ b/PluralKit.Core/Utils.cs @@ -5,7 +5,9 @@ using System.IO; using System.Linq; using System.Security.Cryptography; using System.Text.RegularExpressions; +using System.Threading; using System.Threading.Tasks; +using App.Metrics; using Dapper; using Microsoft.Extensions.Configuration; using Newtonsoft.Json; @@ -13,6 +15,7 @@ using NodaTime; using NodaTime.Serialization.JsonNet; using NodaTime.Text; using Npgsql; +using PluralKit.Core; using Serilog; using Serilog.Formatting.Compact; using Serilog.Sinks.SystemConsole.Themes; @@ -349,18 +352,109 @@ namespace PluralKit public class DbConnectionFactory { - private string _connectionString; + private CoreConfig _config; + private IMetrics _metrics; + private DbConnectionCountHolder _countHolder; - public DbConnectionFactory(string connectionString) + public DbConnectionFactory(CoreConfig config, DbConnectionCountHolder countHolder, IMetrics metrics) { - _connectionString = connectionString; + _config = config; + _countHolder = countHolder; + _metrics = metrics; } public async Task Obtain() { - var conn = new NpgsqlConnection(_connectionString); + // Mark the request (for a handle, I guess) in the metrics + _metrics.Measure.Meter.Mark(CoreMetrics.DatabaseRequests); + + // Actually create and try to open the connection + var conn = new NpgsqlConnection(_config.Database); await conn.OpenAsync(); - return conn; + + // Increment the count + _countHolder.Increment(); + // Return a wrapped connection which will decrement the counter on dispose + return new DbConnectionTrackingConnection(conn, _countHolder); } } + + public class DbConnectionCountHolder + { + private int _connectionCount; + public int ConnectionCount => _connectionCount; + + public void Increment() + { + Interlocked.Increment(ref _connectionCount); + } + + public void Decrement() + { + Interlocked.Decrement(ref _connectionCount); + } + } + + public class DbConnectionTrackingConnection: IDbConnection + { + // Simple delegation of everything. + private IDbConnection _impl; + + private DbConnectionCountHolder _countHolder; + + public DbConnectionTrackingConnection(IDbConnection impl, DbConnectionCountHolder countHolder) + { + _impl = impl; + _countHolder = countHolder; + } + + public void Dispose() + { + _impl.Dispose(); + + _countHolder.Decrement(); + } + + public IDbTransaction BeginTransaction() + { + return _impl.BeginTransaction(); + } + + public IDbTransaction BeginTransaction(IsolationLevel il) + { + return _impl.BeginTransaction(il); + } + + public void ChangeDatabase(string databaseName) + { + _impl.ChangeDatabase(databaseName); + } + + public void Close() + { + _impl.Close(); + } + + public IDbCommand CreateCommand() + { + return _impl.CreateCommand(); + } + + public void Open() + { + _impl.Open(); + } + + public string ConnectionString + { + get => _impl.ConnectionString; + set => _impl.ConnectionString = value; + } + + public int ConnectionTimeout => _impl.ConnectionTimeout; + + public string Database => _impl.Database; + + public ConnectionState State => _impl.State; + } } From 7e92a58c8ddf4f9810cf90faf5f0ee87d3907d44 Mon Sep 17 00:00:00 2001 From: Ske Date: Sun, 11 Aug 2019 22:59:05 +0200 Subject: [PATCH 02/51] Fix API project building --- PluralKit.API/Startup.cs | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/PluralKit.API/Startup.cs b/PluralKit.API/Startup.cs index 974c615e..8437031f 100644 --- a/PluralKit.API/Startup.cs +++ b/PluralKit.API/Startup.cs @@ -33,7 +33,9 @@ namespace PluralKit.API .AddTransient(_ => Configuration.GetSection("PluralKit").Get() ?? new CoreConfig()) .AddSingleton(svc => InitUtils.InitLogger(svc.GetRequiredService(), "api")) - .AddSingleton(svc => new DbConnectionFactory(svc.GetRequiredService().Database)); + + .AddTransient() + .AddTransient(); } // This method gets called by the runtime. Use this method to configure the HTTP request pipeline. From b593c329506c515195612b511f6e78e16f5036c3 Mon Sep 17 00:00:00 2001 From: Ske Date: Mon, 12 Aug 2019 00:07:29 +0200 Subject: [PATCH 03/51] Add more extensive debug-level logging - Logging of event IDs - Logging of command invocations (at DEBUG) --- PluralKit.Bot/Bot.cs | 11 ++++++----- PluralKit.Core/Utils.cs | 36 ++++++++++++++++++++++++++++++++---- 2 files changed, 38 insertions(+), 9 deletions(-) diff --git a/PluralKit.Bot/Bot.cs b/PluralKit.Bot/Bot.cs index d0d39793..315d5300 100644 --- a/PluralKit.Bot/Bot.cs +++ b/PluralKit.Bot/Bot.cs @@ -11,13 +11,9 @@ using Discord.Commands; using Discord.WebSocket; using Microsoft.Extensions.Configuration; using Microsoft.Extensions.DependencyInjection; -using NodaTime; using Sentry; using Serilog; -using Serilog.Core; using Serilog.Events; -using Serilog.Formatting.Compact; -using Serilog.Sinks.SystemConsole.Themes; namespace PluralKit.Bot { @@ -130,7 +126,10 @@ namespace PluralKit.Bot .AddScoped(_ => new Sentry.Scope(null)) .AddTransient() - .AddSingleton(svc => InitUtils.InitLogger(svc.GetRequiredService(), "bot")) + .AddScoped() + .AddSingleton(svc => new LoggerProvider(svc.GetRequiredService(), "bot")) + .AddScoped(svc => svc.GetRequiredService().RootLogger.ForContext("EventId", svc.GetRequiredService().EventId)) + .BuildServiceProvider(); } class Bot @@ -333,6 +332,8 @@ namespace PluralKit.Bot arg.HasStringPrefix("pk!", ref argPos, StringComparison.OrdinalIgnoreCase) || arg.HasMentionPrefix(_client.CurrentUser, ref argPos)) { + _logger.Debug("Parsing command {Command} from message {Channel}-{Message}", msg.Content, msg.Channel.Id, msg.Id); + // Essentially move the argPos pointer by however much whitespace is at the start of the post-argPos string var trimStartLengthDiff = arg.Content.Substring(argPos).Length - arg.Content.Substring(argPos).TrimStart().Length; diff --git a/PluralKit.Core/Utils.cs b/PluralKit.Core/Utils.cs index a89ef041..249fb786 100644 --- a/PluralKit.Core/Utils.cs +++ b/PluralKit.Core/Utils.cs @@ -17,7 +17,11 @@ using NodaTime.Text; using Npgsql; using PluralKit.Core; using Serilog; +using Serilog.Core; +using Serilog.Events; using Serilog.Formatting.Compact; +using Serilog.Formatting.Display; +using Serilog.Formatting.Json; using Serilog.Sinks.SystemConsole.Themes; @@ -300,17 +304,19 @@ namespace PluralKit SqlMapper.AddTypeHandler(new PassthroughTypeHandler()); } - public static ILogger InitLogger(CoreConfig config, string component) + public static ILogger InitLogger(CoreConfig config, string component) { return new LoggerConfiguration() .ConfigureForNodaTime(DateTimeZoneProviders.Tzdb) + .MinimumLevel.Debug() .WriteTo.File( - new CompactJsonFormatter(), + new RenderedCompactJsonFormatter(), (config.LogDir ?? "logs") + $"/pluralkit.{component}.log", rollingInterval: RollingInterval.Day, flushToDiskInterval: TimeSpan.FromSeconds(10), + restrictedToMinimumLevel: LogEventLevel.Information, buffered: true) - .WriteTo.Console(theme: AnsiConsoleTheme.Code) + .WriteTo.Console(theme: AnsiConsoleTheme.Code, outputTemplate:"[{Timestamp:HH:mm:ss}] [{EventId}] {Level:u3} {Message:lj}{NewLine}{Exception}") .CreateLogger(); } @@ -322,7 +328,19 @@ namespace PluralKit return settings; } } - + + public class LoggerProvider + { + private CoreConfig _config; + public ILogger RootLogger { get; } + + public LoggerProvider(CoreConfig config, string component) + { + _config = config; + RootLogger = InitUtils.InitLogger(_config, component); + } + } + public class UlongEncodeAsLongHandler : SqlMapper.TypeHandler { public override ulong Parse(object value) @@ -457,4 +475,14 @@ namespace PluralKit public ConnectionState State => _impl.State; } + + public class EventIdProvider + { + public Guid EventId { get; } + + public EventIdProvider() + { + EventId = Guid.NewGuid(); + } + } } From 90c6869b00917b23cd34b1af451d041ccbaac185 Mon Sep 17 00:00:00 2001 From: Ske Date: Mon, 12 Aug 2019 00:35:30 +0200 Subject: [PATCH 04/51] Collect statistics about shard status --- PluralKit.Bot/BotMetrics.cs | 1 + PluralKit.Bot/Services/PeriodicStatCollector.cs | 1 + 2 files changed, 2 insertions(+) diff --git a/PluralKit.Bot/BotMetrics.cs b/PluralKit.Bot/BotMetrics.cs index 39c923dc..2ec66925 100644 --- a/PluralKit.Bot/BotMetrics.cs +++ b/PluralKit.Bot/BotMetrics.cs @@ -13,6 +13,7 @@ namespace PluralKit.Bot public static GaugeOptions MembersOnline => new GaugeOptions {Name = "Members online", MeasurementUnit = Unit.None, Context = "Bot"}; public static GaugeOptions Guilds => new GaugeOptions {Name = "Guilds", MeasurementUnit = Unit.None, Context = "Bot"}; public static GaugeOptions Channels => new GaugeOptions {Name = "Channels", MeasurementUnit = Unit.None, Context = "Bot"}; + public static GaugeOptions ShardsConnected => new GaugeOptions { Name = "Shards Connected", Context = "Bot" }; public static GaugeOptions WebhookCacheSize => new GaugeOptions { Name = "Webhook Cache Size", Context = "Bot" }; } } \ No newline at end of file diff --git a/PluralKit.Bot/Services/PeriodicStatCollector.cs b/PluralKit.Bot/Services/PeriodicStatCollector.cs index 55b59536..2baf2b78 100644 --- a/PluralKit.Bot/Services/PeriodicStatCollector.cs +++ b/PluralKit.Bot/Services/PeriodicStatCollector.cs @@ -49,6 +49,7 @@ namespace PluralKit.Bot // Aggregate guild/channel stats _metrics.Measure.Gauge.SetValue(BotMetrics.Guilds, _client.Guilds.Count); _metrics.Measure.Gauge.SetValue(BotMetrics.Channels, _client.Guilds.Sum(g => g.TextChannels.Count)); + _metrics.Measure.Gauge.SetValue(BotMetrics.ShardsConnected, _client.Shards.Count(shard => shard.ConnectionState == ConnectionState.Connected)); // Aggregate member stats var usersKnown = new HashSet(); From a689d6178892548a139a0670b094a44369fc05de Mon Sep 17 00:00:00 2001 From: Ske Date: Mon, 12 Aug 2019 00:57:23 +0200 Subject: [PATCH 05/51] Collect webhook response time and shard latency --- PluralKit.Bot/Bot.cs | 20 ++++++++++++++++++-- PluralKit.Bot/BotMetrics.cs | 4 ++++ PluralKit.Bot/Services/ProxyService.cs | 5 ++++- 3 files changed, 26 insertions(+), 3 deletions(-) diff --git a/PluralKit.Bot/Bot.cs b/PluralKit.Bot/Bot.cs index 315d5300..efac818e 100644 --- a/PluralKit.Bot/Bot.cs +++ b/PluralKit.Bot/Bot.cs @@ -312,8 +312,8 @@ namespace PluralKit.Bot public async Task HandleMessage(SocketMessage msg) { - _metrics.Measure.Meter.Mark(BotMetrics.MessagesReceived); - + RegisterMessageMetrics(msg); + // _client.CurrentUser will be null if we've connected *some* shards but not shard #0 yet // This will cause an error in WebhookCacheServices so we just workaround and don't process any messages // until we properly connect. TODO: can we do this without chucking away a bunch of messages? @@ -347,6 +347,7 @@ namespace PluralKit.Bot system = await conn.QueryFirstOrDefaultAsync( "select systems.* from systems, accounts where accounts.uid = @Id and systems.id = accounts.system", new {Id = arg.Author.Id}); + await _commands.ExecuteAsync(new PKCommandContext(_client, arg, system, _services), argPos, _services); } @@ -357,6 +358,21 @@ namespace PluralKit.Bot } } + private void RegisterMessageMetrics(SocketMessage msg) + { + var guild = (msg.Channel as IGuildChannel)?.Guild; + if (guild != null) + { + var shard = _client.GetShardFor(guild); + var latencyMillis = shard.Latency; + + _metrics.Provider.Timer.Instance(BotMetrics.GatewayLatency, new MetricTags("shard", shard.ShardId.ToString())) + .Record(latencyMillis, TimeUnit.Milliseconds); + } + + _metrics.Measure.Meter.Mark(BotMetrics.MessagesReceived); + } + public Task HandleReactionAdded(Cacheable message, ISocketMessageChannel channel, SocketReaction reaction) => _proxy.HandleReactionAddedAsync(message, channel, reaction); diff --git a/PluralKit.Bot/BotMetrics.cs b/PluralKit.Bot/BotMetrics.cs index 2ec66925..e335c653 100644 --- a/PluralKit.Bot/BotMetrics.cs +++ b/PluralKit.Bot/BotMetrics.cs @@ -1,6 +1,8 @@ using App.Metrics; using App.Metrics.Gauge; +using App.Metrics.Histogram; using App.Metrics.Meter; +using App.Metrics.Timer; namespace PluralKit.Bot { @@ -15,5 +17,7 @@ namespace PluralKit.Bot public static GaugeOptions Channels => new GaugeOptions {Name = "Channels", MeasurementUnit = Unit.None, Context = "Bot"}; public static GaugeOptions ShardsConnected => new GaugeOptions { Name = "Shards Connected", Context = "Bot" }; public static GaugeOptions WebhookCacheSize => new GaugeOptions { Name = "Webhook Cache Size", Context = "Bot" }; + public static TimerOptions WebhookResponseTime => new TimerOptions { Name = "Webhook Response Time", Context = "Bot" }; + public static TimerOptions GatewayLatency => new TimerOptions { Name = "Gateway Latency", Context = "Bot" }; } } \ No newline at end of file diff --git a/PluralKit.Bot/Services/ProxyService.cs b/PluralKit.Bot/Services/ProxyService.cs index c65d6662..289f7b64 100644 --- a/PluralKit.Bot/Services/ProxyService.cs +++ b/PluralKit.Bot/Services/ProxyService.cs @@ -117,7 +117,10 @@ namespace PluralKit.Bot var webhook = await _webhookCache.GetWebhook(message.Channel as ITextChannel); var avatarUrl = match.Member.AvatarUrl ?? match.System.AvatarUrl; var proxyName = match.Member.ProxyName(match.System.Tag); - var hookMessageId = await ExecuteWebhook(webhook, messageContents, proxyName, avatarUrl, message.Attachments.FirstOrDefault()); + + ulong hookMessageId; + using (_metrics.Measure.Timer.Time(BotMetrics.WebhookResponseTime)) + hookMessageId = await ExecuteWebhook(webhook, messageContents, proxyName, avatarUrl, message.Attachments.FirstOrDefault()); // Store the message in the database, and log it in the log channel (if applicable) await _messageStorage.Store(message.Author.Id, hookMessageId, message.Channel.Id, message.Id, match.Member); From ea476d405184cbcceef8a831a98d4fbc2c5af042 Mon Sep 17 00:00:00 2001 From: Ske Date: Mon, 12 Aug 2019 01:15:55 +0200 Subject: [PATCH 06/51] Yield event handlers to task queue before handling --- PluralKit.Bot/Bot.cs | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/PluralKit.Bot/Bot.cs b/PluralKit.Bot/Bot.cs index efac818e..00c31373 100644 --- a/PluralKit.Bot/Bot.cs +++ b/PluralKit.Bot/Bot.cs @@ -254,6 +254,10 @@ namespace PluralKit.Bot // Inner function so we can await the handler without stalling the entire pipeline async Task Inner() { + // "Fork" this task off by ~~yeeting~~ yielding it at the back of the task queue + // This prevents any synchronous nonsense from also stalling the pipeline before the first await point + await Task.Yield(); + // Create a DI scope for this event // and log the breadcrumb to the newly created (in-svc-scope) Sentry scope using (var scope = _services.CreateScope()) From 99ec3cd355b00933230ece789184f9fba4b674b6 Mon Sep 17 00:00:00 2001 From: Ske Date: Mon, 12 Aug 2019 02:05:30 +0200 Subject: [PATCH 07/51] Instrument and log database queries --- PluralKit.Bot/Bot.cs | 10 --- PluralKit.Bot/BotMetrics.cs | 3 +- PluralKit.Core/CoreMetrics.cs | 4 +- PluralKit.Core/Utils.cs | 160 ++++++++++++++++++++++++++++++++-- 4 files changed, 158 insertions(+), 19 deletions(-) diff --git a/PluralKit.Bot/Bot.cs b/PluralKit.Bot/Bot.cs index 00c31373..aeb0a46b 100644 --- a/PluralKit.Bot/Bot.cs +++ b/PluralKit.Bot/Bot.cs @@ -364,16 +364,6 @@ namespace PluralKit.Bot private void RegisterMessageMetrics(SocketMessage msg) { - var guild = (msg.Channel as IGuildChannel)?.Guild; - if (guild != null) - { - var shard = _client.GetShardFor(guild); - var latencyMillis = shard.Latency; - - _metrics.Provider.Timer.Instance(BotMetrics.GatewayLatency, new MetricTags("shard", shard.ShardId.ToString())) - .Record(latencyMillis, TimeUnit.Milliseconds); - } - _metrics.Measure.Meter.Mark(BotMetrics.MessagesReceived); } diff --git a/PluralKit.Bot/BotMetrics.cs b/PluralKit.Bot/BotMetrics.cs index e335c653..4f0080df 100644 --- a/PluralKit.Bot/BotMetrics.cs +++ b/PluralKit.Bot/BotMetrics.cs @@ -17,7 +17,6 @@ namespace PluralKit.Bot public static GaugeOptions Channels => new GaugeOptions {Name = "Channels", MeasurementUnit = Unit.None, Context = "Bot"}; public static GaugeOptions ShardsConnected => new GaugeOptions { Name = "Shards Connected", Context = "Bot" }; public static GaugeOptions WebhookCacheSize => new GaugeOptions { Name = "Webhook Cache Size", Context = "Bot" }; - public static TimerOptions WebhookResponseTime => new TimerOptions { Name = "Webhook Response Time", Context = "Bot" }; - public static TimerOptions GatewayLatency => new TimerOptions { Name = "Gateway Latency", Context = "Bot" }; + public static TimerOptions WebhookResponseTime => new TimerOptions { Name = "Webhook Response Time", Context = "Bot", RateUnit = TimeUnit.Seconds, MeasurementUnit = Unit.Requests, DurationUnit = TimeUnit.Seconds }; } } \ No newline at end of file diff --git a/PluralKit.Core/CoreMetrics.cs b/PluralKit.Core/CoreMetrics.cs index a8850296..e876c991 100644 --- a/PluralKit.Core/CoreMetrics.cs +++ b/PluralKit.Core/CoreMetrics.cs @@ -1,6 +1,7 @@ using App.Metrics; using App.Metrics.Gauge; using App.Metrics.Meter; +using App.Metrics.Timer; namespace PluralKit.Core { @@ -18,7 +19,8 @@ namespace PluralKit.Core public static GaugeOptions ProcessHandles => new GaugeOptions { Name = "Process Handle Count", MeasurementUnit = Unit.Items, Context = "Process" }; public static GaugeOptions CpuUsage => new GaugeOptions { Name = "CPU Usage", MeasurementUnit = Unit.Percent, Context = "Process" }; - public static MeterOptions DatabaseRequests => new MeterOptions() { Name = "Database Requests", MeasurementUnit = Unit.Requests, Context = "Database" }; + public static MeterOptions DatabaseRequests => new MeterOptions() { Name = "Database Requests", MeasurementUnit = Unit.Requests, Context = "Database", RateUnit = TimeUnit.Seconds}; + public static TimerOptions DatabaseQuery => new TimerOptions() { Name = "Database Query", MeasurementUnit = Unit.Requests, DurationUnit = TimeUnit.Seconds, RateUnit = TimeUnit.Seconds, Context = "Database" }; public static GaugeOptions DatabaseConnections => new GaugeOptions() { Name = "Database Connections", MeasurementUnit = Unit.Connections, Context = "Database" }; } } \ No newline at end of file diff --git a/PluralKit.Core/Utils.cs b/PluralKit.Core/Utils.cs index 249fb786..327feeae 100644 --- a/PluralKit.Core/Utils.cs +++ b/PluralKit.Core/Utils.cs @@ -1,6 +1,8 @@ using System; using System.Collections.Generic; using System.Data; +using System.Data.Common; +using System.Diagnostics; using System.IO; using System.Linq; using System.Security.Cryptography; @@ -8,6 +10,7 @@ using System.Text.RegularExpressions; using System.Threading; using System.Threading.Tasks; using App.Metrics; +using App.Metrics.Timer; using Dapper; using Microsoft.Extensions.Configuration; using Newtonsoft.Json; @@ -371,14 +374,16 @@ namespace PluralKit public class DbConnectionFactory { private CoreConfig _config; + private ILogger _logger; private IMetrics _metrics; private DbConnectionCountHolder _countHolder; - public DbConnectionFactory(CoreConfig config, DbConnectionCountHolder countHolder, IMetrics metrics) + public DbConnectionFactory(CoreConfig config, DbConnectionCountHolder countHolder, ILogger logger, IMetrics metrics) { _config = config; _countHolder = countHolder; _metrics = metrics; + _logger = logger; } public async Task Obtain() @@ -393,7 +398,7 @@ namespace PluralKit // Increment the count _countHolder.Increment(); // Return a wrapped connection which will decrement the counter on dispose - return new DbConnectionTrackingConnection(conn, _countHolder); + return new PerformanceTrackingConnection(conn, _countHolder, _logger, _metrics); } } @@ -413,17 +418,22 @@ namespace PluralKit } } - public class DbConnectionTrackingConnection: IDbConnection + public class PerformanceTrackingConnection: IDbConnection { // Simple delegation of everything. - private IDbConnection _impl; + private NpgsqlConnection _impl; private DbConnectionCountHolder _countHolder; + private ILogger _logger; + private IMetrics _metrics; - public DbConnectionTrackingConnection(IDbConnection impl, DbConnectionCountHolder countHolder) + public PerformanceTrackingConnection(NpgsqlConnection impl, DbConnectionCountHolder countHolder, + ILogger logger, IMetrics metrics) { _impl = impl; _countHolder = countHolder; + _logger = logger; + _metrics = metrics; } public void Dispose() @@ -455,7 +465,7 @@ namespace PluralKit public IDbCommand CreateCommand() { - return _impl.CreateCommand(); + return new PerformanceTrackingCommand(_impl.CreateCommand(), _logger, _metrics); } public void Open() @@ -476,6 +486,144 @@ namespace PluralKit public ConnectionState State => _impl.State; } + public class PerformanceTrackingCommand : DbCommand + { + private NpgsqlCommand _impl; + private ILogger _logger; + private IMetrics _metrics; + + public PerformanceTrackingCommand(NpgsqlCommand impl, ILogger logger, IMetrics metrics) + { + _impl = impl; + _metrics = metrics; + _logger = logger; + } + + public override void Cancel() + { + _impl.Cancel(); + } + + public override int ExecuteNonQuery() + { + return _impl.ExecuteNonQuery(); + } + + public override object ExecuteScalar() + { + return _impl.ExecuteScalar(); + } + + public override void Prepare() + { + _impl.Prepare(); + } + + public override string CommandText + { + get => _impl.CommandText; + set => _impl.CommandText = value; + } + + public override int CommandTimeout + { + get => _impl.CommandTimeout; + set => _impl.CommandTimeout = value; + } + + public override CommandType CommandType + { + get => _impl.CommandType; + set => _impl.CommandType = value; + } + + public override UpdateRowSource UpdatedRowSource + { + get => _impl.UpdatedRowSource; + set => _impl.UpdatedRowSource = value; + } + + protected override DbConnection DbConnection + { + get => _impl.Connection; + set => _impl.Connection = (NpgsqlConnection) value; + } + + protected override DbParameterCollection DbParameterCollection => _impl.Parameters; + + protected override DbTransaction DbTransaction + { + get => _impl.Transaction; + set => _impl.Transaction = (NpgsqlTransaction) value; + } + + public override bool DesignTimeVisible + { + get => _impl.DesignTimeVisible; + set => _impl.DesignTimeVisible = value; + } + + protected override DbParameter CreateDbParameter() + { + return _impl.CreateParameter(); + } + + protected override DbDataReader ExecuteDbDataReader(CommandBehavior behavior) + { + return _impl.ExecuteReader(behavior); + } + + private IDisposable LogQuery() + { + return new QueryLogger(_logger, _metrics, CommandText); + } + + protected override async Task ExecuteDbDataReaderAsync(CommandBehavior behavior, CancellationToken cancellationToken) + { + using (LogQuery()) + return await _impl.ExecuteReaderAsync(behavior, cancellationToken); + } + + public override async Task ExecuteNonQueryAsync(CancellationToken cancellationToken) + { + using (LogQuery()) + return await _impl.ExecuteNonQueryAsync(cancellationToken); + } + + public override async Task ExecuteScalarAsync(CancellationToken cancellationToken) + { + using (LogQuery()) + return await _impl.ExecuteScalarAsync(cancellationToken); + } + } + + public class QueryLogger : IDisposable + { + private ILogger _logger; + private IMetrics _metrics; + private string _commandText; + private Stopwatch _stopwatch; + + public QueryLogger(ILogger logger, IMetrics metrics, string commandText) + { + _metrics = metrics; + _commandText = commandText; + _logger = logger; + + _stopwatch = new Stopwatch(); + _stopwatch.Start(); + } + + public void Dispose() + { + _stopwatch.Stop(); + _logger.Debug("Executed query {Query} in {ElapsedTime}", _commandText, _stopwatch.Elapsed); + + // One tick is 100 nanoseconds + _metrics.Provider.Timer.Instance(CoreMetrics.DatabaseQuery).Record(_stopwatch.ElapsedTicks / 10, TimeUnit.Microseconds, _commandText); + } + } + public class EventIdProvider { public Guid EventId { get; } From f5c52918770e98f0aab694db05c844b8f7f1313d Mon Sep 17 00:00:00 2001 From: Ske Date: Mon, 12 Aug 2019 02:33:28 +0200 Subject: [PATCH 08/51] Attempt to speed up Docker building --- Dockerfile | 13 ++++++++++++- docker-compose.yml | 6 +++--- 2 files changed, 15 insertions(+), 4 deletions(-) diff --git a/Dockerfile b/Dockerfile index 18653e98..bf1f1d72 100644 --- a/Dockerfile +++ b/Dockerfile @@ -1,9 +1,20 @@ FROM mcr.microsoft.com/dotnet/core/sdk:2.2-alpine WORKDIR /app + +# Copy all solution files to container, and run restore +COPY PluralKit.API/PluralKit.API.csproj /app/PluralKit.API/ +COPY PluralKit.Bot/PluralKit.Bot.csproj /app/PluralKit.Bot/ +COPY PluralKit.Core/PluralKit.Core.csproj /app/PluralKit.Core/ +COPY PluralKit.Web/PluralKit.Web.csproj /app/PluralKit.Web/ +COPY PluralKit.sln /app +RUN dotnet restore + +# Copy actual source code to container and build COPY PluralKit.API /app/PluralKit.API COPY PluralKit.Bot /app/PluralKit.Bot COPY PluralKit.Core /app/PluralKit.Core COPY PluralKit.Web /app/PluralKit.Web -COPY PluralKit.sln /app RUN dotnet build + +ENTRYPOINT dotnet run \ No newline at end of file diff --git a/docker-compose.yml b/docker-compose.yml index 2e3c3a1f..16c03235 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -2,7 +2,7 @@ version: "3" services: bot: build: . - entrypoint: ["dotnet", "run", "--project", "PluralKit.Bot"] + command: ["--project", "PluralKit.Bot"] environment: - "PluralKit:Database=Host=db;Username=postgres;Password=postgres;Database=postgres" - "PluralKit:InfluxUrl=http://influx:8086" @@ -17,7 +17,7 @@ services: restart: always web: build: . - entrypoint: ["dotnet", "run", "--project", "PluralKit.Web"] + command: ["--project", "PluralKit.Web"] environment: - "PluralKit:Database=Host=db;Username=postgres;Password=postgres;Database=postgres" links: @@ -27,7 +27,7 @@ services: restart: always api: build: . - entrypoint: ["dotnet", "run", "--project", "PluralKit.API"] + command: ["--project", "PluralKit.API"] environment: - "PluralKit:Database=Host=db;Username=postgres;Password=postgres;Database=postgres" links: From 213db91ade57117b894ec2a52911fecee4daacaa Mon Sep 17 00:00:00 2001 From: Ske Date: Mon, 12 Aug 2019 02:33:56 +0200 Subject: [PATCH 09/51] Report database query stats as tags --- PluralKit.Core/Utils.cs | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/PluralKit.Core/Utils.cs b/PluralKit.Core/Utils.cs index 327feeae..fab1d874 100644 --- a/PluralKit.Core/Utils.cs +++ b/PluralKit.Core/Utils.cs @@ -620,7 +620,8 @@ namespace PluralKit _logger.Debug("Executed query {Query} in {ElapsedTime}", _commandText, _stopwatch.Elapsed); // One tick is 100 nanoseconds - _metrics.Provider.Timer.Instance(CoreMetrics.DatabaseQuery).Record(_stopwatch.ElapsedTicks / 10, TimeUnit.Microseconds, _commandText); + _metrics.Provider.Timer.Instance(CoreMetrics.DatabaseQuery, new MetricTags("query", _commandText)) + .Record(_stopwatch.ElapsedTicks / 10, TimeUnit.Microseconds, _commandText); } } From c94c6c1c417bff75b33c5781d08d500ed5d36f08 Mon Sep 17 00:00:00 2001 From: Ske Date: Mon, 12 Aug 2019 02:34:59 +0200 Subject: [PATCH 10/51] Increase maximum connection pool size to 1000 --- docker-compose.yml | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/docker-compose.yml b/docker-compose.yml index 16c03235..6c900718 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -4,7 +4,7 @@ services: build: . command: ["--project", "PluralKit.Bot"] environment: - - "PluralKit:Database=Host=db;Username=postgres;Password=postgres;Database=postgres" + - "PluralKit:Database=Host=db;Username=postgres;Password=postgres;Database=postgres;Maximum Pool Size=1000" - "PluralKit:InfluxUrl=http://influx:8086" - "PluralKit:InfluxDb=pluralkit" - "PluralKit:LogDir=/var/log/pluralkit" @@ -19,7 +19,7 @@ services: build: . command: ["--project", "PluralKit.Web"] environment: - - "PluralKit:Database=Host=db;Username=postgres;Password=postgres;Database=postgres" + - "PluralKit:Database=Host=db;Username=postgres;Password=postgres;Database=postgres;Maximum Pool Size=1000" links: - db ports: @@ -29,7 +29,7 @@ services: build: . command: ["--project", "PluralKit.API"] environment: - - "PluralKit:Database=Host=db;Username=postgres;Password=postgres;Database=postgres" + - "PluralKit:Database=Host=db;Username=postgres;Password=postgres;Database=postgres;Maximum Pool Size=1000" links: - db ports: From 5aa47278cbf070a88e9d0efd32575baef4831669 Mon Sep 17 00:00:00 2001 From: Ske Date: Mon, 12 Aug 2019 02:44:48 +0200 Subject: [PATCH 11/51] Revert "Attempt to speed up Docker building" This reverts commit f5c52918770e98f0aab694db05c844b8f7f1313d. --- Dockerfile | 13 +------------ docker-compose.yml | 6 +++--- 2 files changed, 4 insertions(+), 15 deletions(-) diff --git a/Dockerfile b/Dockerfile index bf1f1d72..18653e98 100644 --- a/Dockerfile +++ b/Dockerfile @@ -1,20 +1,9 @@ FROM mcr.microsoft.com/dotnet/core/sdk:2.2-alpine WORKDIR /app - -# Copy all solution files to container, and run restore -COPY PluralKit.API/PluralKit.API.csproj /app/PluralKit.API/ -COPY PluralKit.Bot/PluralKit.Bot.csproj /app/PluralKit.Bot/ -COPY PluralKit.Core/PluralKit.Core.csproj /app/PluralKit.Core/ -COPY PluralKit.Web/PluralKit.Web.csproj /app/PluralKit.Web/ -COPY PluralKit.sln /app -RUN dotnet restore - -# Copy actual source code to container and build COPY PluralKit.API /app/PluralKit.API COPY PluralKit.Bot /app/PluralKit.Bot COPY PluralKit.Core /app/PluralKit.Core COPY PluralKit.Web /app/PluralKit.Web +COPY PluralKit.sln /app RUN dotnet build - -ENTRYPOINT dotnet run \ No newline at end of file diff --git a/docker-compose.yml b/docker-compose.yml index 6c900718..6a5f313e 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -2,7 +2,7 @@ version: "3" services: bot: build: . - command: ["--project", "PluralKit.Bot"] + entrypoint: ["dotnet", "run", "--project", "PluralKit.Bot"] environment: - "PluralKit:Database=Host=db;Username=postgres;Password=postgres;Database=postgres;Maximum Pool Size=1000" - "PluralKit:InfluxUrl=http://influx:8086" @@ -17,7 +17,7 @@ services: restart: always web: build: . - command: ["--project", "PluralKit.Web"] + entrypoint: ["dotnet", "run", "--project", "PluralKit.Web"] environment: - "PluralKit:Database=Host=db;Username=postgres;Password=postgres;Database=postgres;Maximum Pool Size=1000" links: @@ -27,7 +27,7 @@ services: restart: always api: build: . - command: ["--project", "PluralKit.API"] + entrypoint: ["dotnet", "run", "--project", "PluralKit.API"] environment: - "PluralKit:Database=Host=db;Username=postgres;Password=postgres;Database=postgres;Maximum Pool Size=1000" links: From 423d23faf793d8f7d44827b6fa57a8a4466ab1ff Mon Sep 17 00:00:00 2001 From: Ske Date: Mon, 12 Aug 2019 03:48:08 +0200 Subject: [PATCH 12/51] Cache account lookup in memory when proxying --- PluralKit.Bot/Bot.cs | 3 + PluralKit.Bot/Commands/MemberCommands.cs | 4 + PluralKit.Bot/PluralKit.Bot.csproj | 2 +- PluralKit.Bot/Services/ProxyCacheService.cs | 82 +++++++++++++++++++++ PluralKit.Bot/Services/ProxyService.cs | 23 ++---- 5 files changed, 96 insertions(+), 18 deletions(-) create mode 100644 PluralKit.Bot/Services/ProxyCacheService.cs diff --git a/PluralKit.Bot/Bot.cs b/PluralKit.Bot/Bot.cs index aeb0a46b..67979666 100644 --- a/PluralKit.Bot/Bot.cs +++ b/PluralKit.Bot/Bot.cs @@ -106,6 +106,7 @@ namespace PluralKit.Bot .AddTransient() .AddTransient() + .AddSingleton() .AddSingleton() .AddTransient() @@ -130,6 +131,8 @@ namespace PluralKit.Bot .AddSingleton(svc => new LoggerProvider(svc.GetRequiredService(), "bot")) .AddScoped(svc => svc.GetRequiredService().RootLogger.ForContext("EventId", svc.GetRequiredService().EventId)) + .AddMemoryCache() + .BuildServiceProvider(); } class Bot diff --git a/PluralKit.Bot/Commands/MemberCommands.cs b/PluralKit.Bot/Commands/MemberCommands.cs index fa16ee93..2a58b7a3 100644 --- a/PluralKit.Bot/Commands/MemberCommands.cs +++ b/PluralKit.Bot/Commands/MemberCommands.cs @@ -15,6 +15,8 @@ namespace PluralKit.Bot.Commands public SystemStore Systems { get; set; } public MemberStore Members { get; set; } public EmbedService Embeds { get; set; } + + public ProxyCacheService ProxyCache { get; set; } public override string Prefix => "member"; public override string ContextNoun => "member"; @@ -170,6 +172,8 @@ namespace PluralKit.Bot.Commands ContextEntity.Suffix = prefixAndSuffix[1].Length > 0 ? prefixAndSuffix[1] : null; await Members.Save(ContextEntity); await Context.Channel.SendMessageAsync($"{Emojis.Success} Member proxy tags changed to `{ContextEntity.ProxyString.Sanitize()}`. Try proxying now!"); + + ProxyCache.InvalidateResultsForSystem(Context.SenderSystem); } [Command("delete")] diff --git a/PluralKit.Bot/PluralKit.Bot.csproj b/PluralKit.Bot/PluralKit.Bot.csproj index b40772c1..eb9a6af2 100644 --- a/PluralKit.Bot/PluralKit.Bot.csproj +++ b/PluralKit.Bot/PluralKit.Bot.csproj @@ -14,8 +14,8 @@ + - diff --git a/PluralKit.Bot/Services/ProxyCacheService.cs b/PluralKit.Bot/Services/ProxyCacheService.cs new file mode 100644 index 00000000..b80a4260 --- /dev/null +++ b/PluralKit.Bot/Services/ProxyCacheService.cs @@ -0,0 +1,82 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Threading.Tasks; +using Dapper; +using Microsoft.Extensions.Caching.Memory; +using Serilog; + +namespace PluralKit.Bot +{ + public class ProxyCacheService + { + public class ProxyDatabaseResult + { + public PKSystem System; + public PKMember Member; + } + + private DbConnectionFactory _conn; + private IMemoryCache _cache; + private ILogger _logger; + + public ProxyCacheService(DbConnectionFactory conn, IMemoryCache cache, ILogger logger) + { + _conn = conn; + _cache = cache; + _logger = logger; + } + + public Task> GetResultsFor(ulong account) + { + _logger.Debug("Looking up members for account {Account} in cache...", account); + return _cache.GetOrCreateAsync(GetKey(account), (entry) => FetchResults(account, entry)); + } + + public void InvalidateResultsFor(ulong account) + { + _logger.Information("Invalidating proxy cache for account {Account}", account); + _cache.Remove(GetKey(account)); + } + + public async Task InvalidateResultsForSystem(PKSystem system) + { + _logger.Information("Invalidating proxy cache for system {System}", system.Id); + using (var conn = await _conn.Obtain()) + foreach (var accountId in await conn.QueryAsync("select uid from accounts where system = @Id", system)) + _cache.Remove(GetKey(accountId)); + } + + private async Task> FetchResults(ulong account, ICacheEntry entry) + { + _logger.Information("Members for account {Account} not in cache, fetching", account); + using (var conn = await _conn.Obtain()) + { + var results = (await conn.QueryAsync( + "select members.*, systems.* from members, systems, accounts where members.system = systems.id and accounts.system = systems.id and accounts.uid = @Uid", + (member, system) => + new ProxyDatabaseResult {Member = member, System = system}, new {Uid = account})).ToList(); + + if (results.Count == 0) + { + // Long expiry for accounts with no system registered + entry.SetSlidingExpiration(TimeSpan.FromMinutes(5)); + entry.SetAbsoluteExpiration(TimeSpan.FromHours(1)); + } + else + { + // Shorter expiry if they already have a system + entry.SetSlidingExpiration(TimeSpan.FromMinutes(1)); + entry.SetAbsoluteExpiration(TimeSpan.FromMinutes(5)); + } + + return results; + } + } + + private object GetKey(ulong account) + { + return $"_proxy_account_{account}"; + } + } +} \ No newline at end of file diff --git a/PluralKit.Bot/Services/ProxyService.cs b/PluralKit.Bot/Services/ProxyService.cs index 289f7b64..8744c1ea 100644 --- a/PluralKit.Bot/Services/ProxyService.cs +++ b/PluralKit.Bot/Services/ProxyService.cs @@ -10,16 +10,11 @@ using Discord; using Discord.Net; using Discord.Webhook; using Discord.WebSocket; +using Microsoft.Extensions.Caching.Memory; using Serilog; namespace PluralKit.Bot { - class ProxyDatabaseResult - { - public PKSystem System; - public PKMember Member; - } - class ProxyMatch { public PKMember Member; public PKSystem System; @@ -35,10 +30,11 @@ namespace PluralKit.Bot private EmbedService _embeds; private IMetrics _metrics; private ILogger _logger; + private ProxyCacheService _cache; private HttpClient _httpClient; - public ProxyService(IDiscordClient client, WebhookCacheService webhookCache, DbConnectionFactory conn, LogChannelService logChannel, MessageStore messageStorage, EmbedService embeds, IMetrics metrics, ILogger logger) + public ProxyService(IDiscordClient client, WebhookCacheService webhookCache, DbConnectionFactory conn, LogChannelService logChannel, MessageStore messageStorage, EmbedService embeds, IMetrics metrics, ILogger logger, ProxyCacheService cache) { _client = client; _webhookCache = webhookCache; @@ -47,12 +43,13 @@ namespace PluralKit.Bot _messageStorage = messageStorage; _embeds = embeds; _metrics = metrics; + _cache = cache; _logger = logger.ForContext(); _httpClient = new HttpClient(); } - private ProxyMatch GetProxyTagMatch(string message, IEnumerable potentials) + private ProxyMatch GetProxyTagMatch(string message, IEnumerable potentials) { // If the message starts with a @mention, and then proceeds to have proxy tags, // extract the mention and place it inside the inner message @@ -89,14 +86,7 @@ namespace PluralKit.Bot // Bail early if this isn't in a guild channel if (!(message.Channel is IGuildChannel)) return; - IEnumerable results; - using (var conn = await _conn.Obtain()) - { - results = await conn.QueryAsync( - "select members.*, systems.* from members, systems, accounts where members.system = systems.id and accounts.system = systems.id and accounts.uid = @Uid", - (member, system) => - new ProxyDatabaseResult {Member = member, System = system}, new {Uid = message.Author.Id}); - } + var results = await _cache.GetResultsFor(message.Author.Id); // Find a member with proxy tags matching the message var match = GetProxyTagMatch(message.Content, results); @@ -134,7 +124,6 @@ namespace PluralKit.Bot await message.DeleteAsync(); } catch (HttpException) {} // If it's already deleted, we just swallow the exception } - private static string SanitizeEveryoneMaybe(IMessage message, string messageContents) { var senderPermissions = ((IGuildUser) message.Author).GetPermissions(message.Channel as IGuildChannel); From aa04d2055ee4b291e400c1071bdd49332eaefb34 Mon Sep 17 00:00:00 2001 From: Ske Date: Mon, 12 Aug 2019 03:51:54 +0200 Subject: [PATCH 13/51] Avoid deleting messages from the store if they're not webhooks --- PluralKit.Bot/Bot.cs | 2 +- PluralKit.Bot/Services/ProxyService.cs | 4 ++++ 2 files changed, 5 insertions(+), 1 deletion(-) diff --git a/PluralKit.Bot/Bot.cs b/PluralKit.Bot/Bot.cs index 67979666..f3d06118 100644 --- a/PluralKit.Bot/Bot.cs +++ b/PluralKit.Bot/Bot.cs @@ -80,7 +80,7 @@ namespace PluralKit.Bot .AddSingleton(_ => new DiscordShardedClient(new DiscordSocketConfig { - MessageCacheSize = 0, + MessageCacheSize = 10, ExclusiveBulkDelete = true })) .AddSingleton() diff --git a/PluralKit.Bot/Services/ProxyService.cs b/PluralKit.Bot/Services/ProxyService.cs index 8744c1ea..19f16e99 100644 --- a/PluralKit.Bot/Services/ProxyService.cs +++ b/PluralKit.Bot/Services/ProxyService.cs @@ -273,6 +273,10 @@ namespace PluralKit.Bot public async Task HandleMessageDeletedAsync(Cacheable message, ISocketMessageChannel channel) { + // Don't delete messages from the store if they aren't webhooks + // Non-webhook messages will never be stored anyway. + // If we're not sure (eg. message outside of cache), delete just to be sure. + if (message.HasValue && !message.Value.Author.IsWebhook) return; await _messageStorage.Delete(message.Id); } From c68ce1bdd3adafb738e71426f5d1bfd12e7714f5 Mon Sep 17 00:00:00 2001 From: Ske Date: Mon, 12 Aug 2019 04:05:22 +0200 Subject: [PATCH 14/51] Log gateway latency to console --- PluralKit.Bot/Bot.cs | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/PluralKit.Bot/Bot.cs b/PluralKit.Bot/Bot.cs index f3d06118..f920328c 100644 --- a/PluralKit.Bot/Bot.cs +++ b/PluralKit.Bot/Bot.cs @@ -105,8 +105,8 @@ namespace PluralKit.Bot .AddTransient() .AddTransient() .AddTransient() - - .AddSingleton() + + .AddTransient() .AddSingleton() .AddTransient() @@ -368,6 +368,9 @@ namespace PluralKit.Bot private void RegisterMessageMetrics(SocketMessage msg) { _metrics.Measure.Meter.Mark(BotMetrics.MessagesReceived); + + var gatewayLatency = DateTimeOffset.Now - msg.CreatedAt; + _logger.Debug("Message received with latency {Latency}", gatewayLatency); } public Task HandleReactionAdded(Cacheable message, ISocketMessageChannel channel, From 1b32cd8b6d6ed71528d7c07304f150c3299cb872 Mon Sep 17 00:00:00 2001 From: Ske Date: Mon, 12 Aug 2019 04:16:17 +0200 Subject: [PATCH 15/51] Log webhook send progress --- PluralKit.Bot/Services/ProxyService.cs | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/PluralKit.Bot/Services/ProxyService.cs b/PluralKit.Bot/Services/ProxyService.cs index 19f16e99..eddf13a1 100644 --- a/PluralKit.Bot/Services/ProxyService.cs +++ b/PluralKit.Bot/Services/ProxyService.cs @@ -159,6 +159,8 @@ namespace PluralKit.Bot // TODO: DiscordWebhookClient's ctor does a call to GetWebhook that may be unnecessary, see if there's a way to do this The Hard Way :tm: // TODO: this will probably crash if there are multiple consecutive failures, perhaps have a loop instead? + + _logger.Debug("Instantiating webhook client"); DiscordWebhookClient client; try { @@ -172,6 +174,8 @@ namespace PluralKit.Bot webhook = await _webhookCache.InvalidateAndRefreshWebhook(webhook); client = new DiscordWebhookClient(webhook); } + + _logger.Debug("Invoking webhook"); // TODO: clean this entire block up using (client) From 5b13c1b10087d2efa3c28f086edf2925e2f7a8c6 Mon Sep 17 00:00:00 2001 From: Ske Date: Mon, 12 Aug 2019 04:32:01 +0200 Subject: [PATCH 16/51] Cache the entire webhook client rather than just the token --- PluralKit.Bot/Services/ProxyService.cs | 79 ++++++++----------- PluralKit.Bot/Services/WebhookCacheService.cs | 64 +++++++++++---- 2 files changed, 78 insertions(+), 65 deletions(-) diff --git a/PluralKit.Bot/Services/ProxyService.cs b/PluralKit.Bot/Services/ProxyService.cs index eddf13a1..ebee3c48 100644 --- a/PluralKit.Bot/Services/ProxyService.cs +++ b/PluralKit.Bot/Services/ProxyService.cs @@ -104,13 +104,13 @@ namespace PluralKit.Bot var messageContents = SanitizeEveryoneMaybe(message, match.InnerText); // Fetch a webhook for this channel, and send the proxied message - var webhook = await _webhookCache.GetWebhook(message.Channel as ITextChannel); + var webhookCacheEntry = await _webhookCache.GetWebhook(message.Channel as ITextChannel); var avatarUrl = match.Member.AvatarUrl ?? match.System.AvatarUrl; var proxyName = match.Member.ProxyName(match.System.Tag); ulong hookMessageId; using (_metrics.Measure.Timer.Time(BotMetrics.WebhookResponseTime)) - hookMessageId = await ExecuteWebhook(webhook, messageContents, proxyName, avatarUrl, message.Attachments.FirstOrDefault()); + hookMessageId = await ExecuteWebhook(webhookCacheEntry, messageContents, proxyName, avatarUrl, message.Attachments.FirstOrDefault()); // Store the message in the database, and log it in the log channel (if applicable) await _messageStorage.Store(message.Author.Id, hookMessageId, message.Channel.Id, message.Id, match.Member); @@ -153,70 +153,53 @@ namespace PluralKit.Bot return true; } - private async Task ExecuteWebhook(IWebhook webhook, string text, string username, string avatarUrl, IAttachment attachment) + private async Task ExecuteWebhook(WebhookCacheService.WebhookCacheEntry cacheEntry, string text, string username, string avatarUrl, IAttachment attachment) { username = FixClyde(username); // TODO: DiscordWebhookClient's ctor does a call to GetWebhook that may be unnecessary, see if there's a way to do this The Hard Way :tm: // TODO: this will probably crash if there are multiple consecutive failures, perhaps have a loop instead? - - _logger.Debug("Instantiating webhook client"); - DiscordWebhookClient client; - try - { - client = new DiscordWebhookClient(webhook); - } - catch (InvalidOperationException) - { - // TODO: does this leak internal stuff in the (now-invalid) client? - // webhook was deleted or invalid - webhook = await _webhookCache.InvalidateAndRefreshWebhook(webhook); - client = new DiscordWebhookClient(webhook); - } - _logger.Debug("Invoking webhook"); // TODO: clean this entire block up - using (client) + ulong messageId; + + try { - ulong messageId; - - try + var client = cacheEntry.Client; + if (attachment != null) { - if (attachment != null) + using (var stream = await _httpClient.GetStreamAsync(attachment.Url)) { - using (var stream = await _httpClient.GetStreamAsync(attachment.Url)) - { - messageId = await client.SendFileAsync(stream, filename: attachment.Filename, text: text, - username: username, avatarUrl: avatarUrl); - } + messageId = await client.SendFileAsync(stream, filename: attachment.Filename, text: text, + username: username, avatarUrl: avatarUrl); } - else - { - messageId = await client.SendMessageAsync(text, username: username, avatarUrl: avatarUrl); - } - - _logger.Information("Invoked webhook {Webhook} in channel {Channel}", webhook.Id, - webhook.ChannelId); - - // Log it in the metrics - _metrics.Measure.Meter.Mark(BotMetrics.MessagesProxied, "success"); } - catch (HttpException e) + else { - _logger.Warning(e, "Error invoking webhook {Webhook} in channel {Channel}", webhook.Id, - webhook.ChannelId); - - // Log failure in metrics and rethrow (we still need to cancel everything else) - _metrics.Measure.Meter.Mark(BotMetrics.MessagesProxied, "failure"); - throw; + messageId = await client.SendMessageAsync(text, username: username, avatarUrl: avatarUrl); } - // TODO: figure out a way to return the full message object (without doing a GetMessageAsync call, which - // doesn't work if there's no permission to) - return messageId; + _logger.Information("Invoked webhook {Webhook} in channel {Channel}", cacheEntry.Webhook.Id, + cacheEntry.Webhook.ChannelId); + + // Log it in the metrics + _metrics.Measure.Meter.Mark(BotMetrics.MessagesProxied, "success"); } + catch (HttpException e) + { + _logger.Warning(e, "Error invoking webhook {Webhook} in channel {Channel}", cacheEntry.Webhook.Id, + cacheEntry.Webhook.ChannelId); + + // Log failure in metrics and rethrow (we still need to cancel everything else) + _metrics.Measure.Meter.Mark(BotMetrics.MessagesProxied, "failure"); + throw; + } + + // TODO: figure out a way to return the full message object (without doing a GetMessageAsync call, which + // doesn't work if there's no permission to) + return messageId; } public Task HandleReactionAddedAsync(Cacheable message, ISocketMessageChannel channel, SocketReaction reaction) diff --git a/PluralKit.Bot/Services/WebhookCacheService.cs b/PluralKit.Bot/Services/WebhookCacheService.cs index 02bf0017..f7eaa888 100644 --- a/PluralKit.Bot/Services/WebhookCacheService.cs +++ b/PluralKit.Bot/Services/WebhookCacheService.cs @@ -3,16 +3,23 @@ using System.Collections.Concurrent; using System.Linq; using System.Threading.Tasks; using Discord; +using Discord.Webhook; using Serilog; namespace PluralKit.Bot { - public class WebhookCacheService + public class WebhookCacheService: IDisposable { + public class WebhookCacheEntry + { + internal DiscordWebhookClient Client; + internal IWebhook Webhook; + } + public static readonly string WebhookName = "PluralKit Proxy Webhook"; private IDiscordClient _client; - private ConcurrentDictionary>> _webhooks; + private ConcurrentDictionary>> _webhooks; private ILogger _logger; @@ -20,56 +27,79 @@ namespace PluralKit.Bot { _client = client; _logger = logger.ForContext(); - _webhooks = new ConcurrentDictionary>>(); + _webhooks = new ConcurrentDictionary>>(); } - public async Task GetWebhook(ulong channelId) + public async Task GetWebhook(ulong channelId) { var channel = await _client.GetChannelAsync(channelId) as ITextChannel; if (channel == null) return null; return await GetWebhook(channel); } - public async Task GetWebhook(ITextChannel channel) + public async Task GetWebhook(ITextChannel channel) { // We cache the webhook through a Lazy>, this way we make sure to only create one webhook per channel // If the webhook is requested twice before it's actually been found, the Lazy wrapper will stop the // webhook from being created twice. var lazyWebhookValue = - _webhooks.GetOrAdd(channel.Id, new Lazy>(() => GetOrCreateWebhook(channel))); + _webhooks.GetOrAdd(channel.Id, new Lazy>(() => GetOrCreateWebhook(channel))); // It's possible to "move" a webhook to a different channel after creation // Here, we ensure it's actually still pointing towards the proper channel, and if not, wipe and refetch one. var webhook = await lazyWebhookValue.Value; - if (webhook.Channel.Id != channel.Id) return await InvalidateAndRefreshWebhook(webhook); + if (webhook.Webhook.ChannelId != channel.Id) return await InvalidateAndRefreshWebhook(webhook); return webhook; } - public async Task InvalidateAndRefreshWebhook(IWebhook webhook) + public async Task InvalidateAndRefreshWebhook(WebhookCacheEntry webhook) { - _logger.Information("Refreshing webhook for channel {Channel}", webhook.ChannelId); + _logger.Information("Refreshing webhook for channel {Channel}", webhook.Webhook.ChannelId); - _webhooks.TryRemove(webhook.ChannelId, out _); - return await GetWebhook(webhook.ChannelId); + _webhooks.TryRemove(webhook.Webhook.ChannelId, out _); + return await GetWebhook(webhook.Webhook.Channel); } - private async Task GetOrCreateWebhook(ITextChannel channel) => - await FindExistingWebhook(channel) ?? await DoCreateWebhook(channel); - + private async Task GetOrCreateWebhook(ITextChannel channel) + { + var webhook = await FindExistingWebhook(channel) ?? await DoCreateWebhook(channel); + return await DoCreateWebhookClient(webhook); + } + private async Task FindExistingWebhook(ITextChannel channel) { _logger.Debug("Finding webhook for channel {Channel}", channel.Id); return (await channel.GetWebhooksAsync()).FirstOrDefault(IsWebhookMine); } - private async Task DoCreateWebhook(ITextChannel channel) + private Task DoCreateWebhook(ITextChannel channel) { _logger.Information("Creating new webhook for channel {Channel}", channel.Id); - return await channel.CreateWebhookAsync(WebhookName); + return channel.CreateWebhookAsync(WebhookName); } - private bool IsWebhookMine(IWebhook arg) => arg.Creator.Id == _client.CurrentUser.Id && arg.Name == WebhookName; + private Task DoCreateWebhookClient(IWebhook webhook) + { + // DiscordWebhookClient's ctor is synchronous despite doing web calls, so we wrap it in a Task + return Task.Run(() => + { + return new WebhookCacheEntry + { + Client = new DiscordWebhookClient(webhook), + Webhook = webhook + }; + }); + } + + private bool IsWebhookMine(IWebhook arg) => arg.Id == _client.CurrentUser.Id && arg.Name == WebhookName; public int CacheSize => _webhooks.Count; + + public void Dispose() + { + foreach (var entry in _webhooks.Values) + if (entry.IsValueCreated) + entry.Value.Result.Client.Dispose(); + } } } \ No newline at end of file From 17c8b7b76500a8a873d4793acee08a8db6963f5e Mon Sep 17 00:00:00 2001 From: Ske Date: Mon, 12 Aug 2019 04:42:16 +0200 Subject: [PATCH 17/51] Properly retry client creation on failure --- PluralKit.Bot/Services/ProxyService.cs | 41 +++++++++++++++---- PluralKit.Bot/Services/WebhookCacheService.cs | 2 +- 2 files changed, 34 insertions(+), 9 deletions(-) diff --git a/PluralKit.Bot/Services/ProxyService.cs b/PluralKit.Bot/Services/ProxyService.cs index ebee3c48..5f157ea0 100644 --- a/PluralKit.Bot/Services/ProxyService.cs +++ b/PluralKit.Bot/Services/ProxyService.cs @@ -108,9 +108,7 @@ namespace PluralKit.Bot var avatarUrl = match.Member.AvatarUrl ?? match.System.AvatarUrl; var proxyName = match.Member.ProxyName(match.System.Tag); - ulong hookMessageId; - using (_metrics.Measure.Timer.Time(BotMetrics.WebhookResponseTime)) - hookMessageId = await ExecuteWebhook(webhookCacheEntry, messageContents, proxyName, avatarUrl, message.Attachments.FirstOrDefault()); + var hookMessageId = await ExecuteWebhookRetrying(message, webhookCacheEntry, messageContents, proxyName, avatarUrl); // Store the message in the database, and log it in the log channel (if applicable) await _messageStorage.Store(message.Author.Id, hookMessageId, message.Channel.Id, message.Id, match.Member); @@ -124,6 +122,37 @@ namespace PluralKit.Bot await message.DeleteAsync(); } catch (HttpException) {} // If it's already deleted, we just swallow the exception } + + private async Task ExecuteWebhookRetrying(IMessage message, WebhookCacheService.WebhookCacheEntry webhookCacheEntry, string messageContents, + string proxyName, string avatarUrl) + { + // In the case where the webhook is deleted, we'll only actually notice that + // when we try to execute the webhook. Therefore we try it once, and + // if Discord returns error 10015 ("Unknown Webhook"), we remake it and try again. + ulong hookMessageId; + try + { + using (_metrics.Measure.Timer.Time(BotMetrics.WebhookResponseTime)) + hookMessageId = await ExecuteWebhook(webhookCacheEntry, messageContents, proxyName, avatarUrl, + message.Attachments.FirstOrDefault()); + } + catch (HttpException e) + { + if (e.DiscordCode == 10015) + { + _logger.Warning("Webhook {Webhook} not found, recreating one", webhookCacheEntry.Webhook.Id); + + webhookCacheEntry = await _webhookCache.InvalidateAndRefreshWebhook(webhookCacheEntry); + using (_metrics.Measure.Timer.Time(BotMetrics.WebhookResponseTime)) + hookMessageId = await ExecuteWebhook(webhookCacheEntry, messageContents, proxyName, avatarUrl, + message.Attachments.FirstOrDefault()); + } + else throw; + } + + return hookMessageId; + } + private static string SanitizeEveryoneMaybe(IMessage message, string messageContents) { var senderPermissions = ((IGuildUser) message.Author).GetPermissions(message.Channel as IGuildChannel); @@ -155,12 +184,8 @@ namespace PluralKit.Bot private async Task ExecuteWebhook(WebhookCacheService.WebhookCacheEntry cacheEntry, string text, string username, string avatarUrl, IAttachment attachment) { - username = FixClyde(username); - - // TODO: DiscordWebhookClient's ctor does a call to GetWebhook that may be unnecessary, see if there's a way to do this The Hard Way :tm: - // TODO: this will probably crash if there are multiple consecutive failures, perhaps have a loop instead? - _logger.Debug("Invoking webhook"); + username = FixClyde(username); // TODO: clean this entire block up ulong messageId; diff --git a/PluralKit.Bot/Services/WebhookCacheService.cs b/PluralKit.Bot/Services/WebhookCacheService.cs index f7eaa888..e4fef7e3 100644 --- a/PluralKit.Bot/Services/WebhookCacheService.cs +++ b/PluralKit.Bot/Services/WebhookCacheService.cs @@ -91,7 +91,7 @@ namespace PluralKit.Bot }); } - private bool IsWebhookMine(IWebhook arg) => arg.Id == _client.CurrentUser.Id && arg.Name == WebhookName; + private bool IsWebhookMine(IWebhook arg) => arg.Creator.Id == _client.CurrentUser.Id && arg.Name == WebhookName; public int CacheSize => _webhooks.Count; From fda98bc25f700077236cd5b31a2dbb73d62cfa03 Mon Sep 17 00:00:00 2001 From: Ske Date: Mon, 12 Aug 2019 05:03:18 +0200 Subject: [PATCH 18/51] Lower message cache size --- PluralKit.Bot/Bot.cs | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/PluralKit.Bot/Bot.cs b/PluralKit.Bot/Bot.cs index f920328c..257b19ff 100644 --- a/PluralKit.Bot/Bot.cs +++ b/PluralKit.Bot/Bot.cs @@ -57,7 +57,6 @@ namespace PluralKit.Bot logger.Information("Initializing bot"); await services.GetRequiredService().Init(); - await client.StartAsync(); @@ -80,7 +79,7 @@ namespace PluralKit.Bot .AddSingleton(_ => new DiscordShardedClient(new DiscordSocketConfig { - MessageCacheSize = 10, + MessageCacheSize = 5, ExclusiveBulkDelete = true })) .AddSingleton() From 145ecb91ad502509471d349f9cf359c6c963724f Mon Sep 17 00:00:00 2001 From: Ske Date: Mon, 12 Aug 2019 05:47:55 +0200 Subject: [PATCH 19/51] Refactor proxy service --- PluralKit.Bot/Bot.cs | 1 + PluralKit.Bot/Services/ProxyService.cs | 119 +++--------------- PluralKit.Bot/Services/WebhookCacheService.cs | 57 +++------ .../Services/WebhookExecutorService.cs | 118 +++++++++++++++++ 4 files changed, 153 insertions(+), 142 deletions(-) create mode 100644 PluralKit.Bot/Services/WebhookExecutorService.cs diff --git a/PluralKit.Bot/Bot.cs b/PluralKit.Bot/Bot.cs index 257b19ff..42d4c2c2 100644 --- a/PluralKit.Bot/Bot.cs +++ b/PluralKit.Bot/Bot.cs @@ -104,6 +104,7 @@ namespace PluralKit.Bot .AddTransient() .AddTransient() .AddTransient() + .AddTransient() .AddTransient() .AddSingleton() diff --git a/PluralKit.Bot/Services/ProxyService.cs b/PluralKit.Bot/Services/ProxyService.cs index 5f157ea0..ca7dd7e0 100644 --- a/PluralKit.Bot/Services/ProxyService.cs +++ b/PluralKit.Bot/Services/ProxyService.cs @@ -23,27 +23,23 @@ namespace PluralKit.Bot class ProxyService: IDisposable { private IDiscordClient _client; - private DbConnectionFactory _conn; private LogChannelService _logChannel; - private WebhookCacheService _webhookCache; private MessageStore _messageStorage; private EmbedService _embeds; - private IMetrics _metrics; private ILogger _logger; + private WebhookExecutorService _webhookExecutor; private ProxyCacheService _cache; private HttpClient _httpClient; - public ProxyService(IDiscordClient client, WebhookCacheService webhookCache, DbConnectionFactory conn, LogChannelService logChannel, MessageStore messageStorage, EmbedService embeds, IMetrics metrics, ILogger logger, ProxyCacheService cache) + public ProxyService(IDiscordClient client, LogChannelService logChannel, MessageStore messageStorage, EmbedService embeds, ILogger logger, ProxyCacheService cache, WebhookExecutorService webhookExecutor) { _client = client; - _webhookCache = webhookCache; - _conn = conn; _logChannel = logChannel; _messageStorage = messageStorage; _embeds = embeds; - _metrics = metrics; _cache = cache; + _webhookExecutor = webhookExecutor; _logger = logger.ForContext(); _httpClient = new HttpClient(); @@ -84,7 +80,7 @@ namespace PluralKit.Bot public async Task HandleMessageAsync(IMessage message) { // Bail early if this isn't in a guild channel - if (!(message.Channel is IGuildChannel)) return; + if (!(message.Channel is ITextChannel)) return; var results = await _cache.GetResultsFor(message.Author.Id); @@ -99,16 +95,21 @@ namespace PluralKit.Bot // Can't proxy a message with no content and no attachment if (match.InnerText.Trim().Length == 0 && message.Attachments.Count == 0) return; - + + // Get variables in order and all + var proxyName = match.Member.ProxyName(match.System.Tag); + var avatarUrl = match.Member.AvatarUrl ?? match.System.AvatarUrl; + // Sanitize @everyone, but only if the original user wouldn't have permission to var messageContents = SanitizeEveryoneMaybe(message, match.InnerText); - - // Fetch a webhook for this channel, and send the proxied message - var webhookCacheEntry = await _webhookCache.GetWebhook(message.Channel as ITextChannel); - var avatarUrl = match.Member.AvatarUrl ?? match.System.AvatarUrl; - var proxyName = match.Member.ProxyName(match.System.Tag); - - var hookMessageId = await ExecuteWebhookRetrying(message, webhookCacheEntry, messageContents, proxyName, avatarUrl); + + // Execute the webhook itself + var hookMessageId = await _webhookExecutor.ExecuteWebhook( + (ITextChannel) message.Channel, + proxyName, avatarUrl, + messageContents, + message.Attachments.FirstOrDefault() + ); // Store the message in the database, and log it in the log channel (if applicable) await _messageStorage.Store(message.Author.Id, hookMessageId, message.Channel.Id, message.Id, match.Member); @@ -120,37 +121,12 @@ namespace PluralKit.Bot try { await message.DeleteAsync(); - } catch (HttpException) {} // If it's already deleted, we just swallow the exception - } - - private async Task ExecuteWebhookRetrying(IMessage message, WebhookCacheService.WebhookCacheEntry webhookCacheEntry, string messageContents, - string proxyName, string avatarUrl) - { - // In the case where the webhook is deleted, we'll only actually notice that - // when we try to execute the webhook. Therefore we try it once, and - // if Discord returns error 10015 ("Unknown Webhook"), we remake it and try again. - ulong hookMessageId; - try - { - using (_metrics.Measure.Timer.Time(BotMetrics.WebhookResponseTime)) - hookMessageId = await ExecuteWebhook(webhookCacheEntry, messageContents, proxyName, avatarUrl, - message.Attachments.FirstOrDefault()); } - catch (HttpException e) + catch (HttpException) { - if (e.DiscordCode == 10015) - { - _logger.Warning("Webhook {Webhook} not found, recreating one", webhookCacheEntry.Webhook.Id); - - webhookCacheEntry = await _webhookCache.InvalidateAndRefreshWebhook(webhookCacheEntry); - using (_metrics.Measure.Timer.Time(BotMetrics.WebhookResponseTime)) - hookMessageId = await ExecuteWebhook(webhookCacheEntry, messageContents, proxyName, avatarUrl, - message.Attachments.FirstOrDefault()); - } - else throw; + // If it's already deleted, we just log and swallow the exception + _logger.Warning("Attempted to delete already deleted proxy trigger message {Message}", message.Id); } - - return hookMessageId; } private static string SanitizeEveryoneMaybe(IMessage message, string messageContents) @@ -182,51 +158,6 @@ namespace PluralKit.Bot return true; } - private async Task ExecuteWebhook(WebhookCacheService.WebhookCacheEntry cacheEntry, string text, string username, string avatarUrl, IAttachment attachment) - { - _logger.Debug("Invoking webhook"); - username = FixClyde(username); - - // TODO: clean this entire block up - ulong messageId; - - try - { - var client = cacheEntry.Client; - if (attachment != null) - { - using (var stream = await _httpClient.GetStreamAsync(attachment.Url)) - { - messageId = await client.SendFileAsync(stream, filename: attachment.Filename, text: text, - username: username, avatarUrl: avatarUrl); - } - } - else - { - messageId = await client.SendMessageAsync(text, username: username, avatarUrl: avatarUrl); - } - - _logger.Information("Invoked webhook {Webhook} in channel {Channel}", cacheEntry.Webhook.Id, - cacheEntry.Webhook.ChannelId); - - // Log it in the metrics - _metrics.Measure.Meter.Mark(BotMetrics.MessagesProxied, "success"); - } - catch (HttpException e) - { - _logger.Warning(e, "Error invoking webhook {Webhook} in channel {Channel}", cacheEntry.Webhook.Id, - cacheEntry.Webhook.ChannelId); - - // Log failure in metrics and rethrow (we still need to cancel everything else) - _metrics.Measure.Meter.Mark(BotMetrics.MessagesProxied, "failure"); - throw; - } - - // TODO: figure out a way to return the full message object (without doing a GetMessageAsync call, which - // doesn't work if there's no permission to) - return messageId; - } - public Task HandleReactionAddedAsync(Cacheable message, ISocketMessageChannel channel, SocketReaction reaction) { // Dispatch on emoji @@ -298,16 +229,6 @@ namespace PluralKit.Bot await _messageStorage.BulkDelete(messages.Select(m => m.Id).ToList()); } - private string FixClyde(string name) - { - var match = Regex.Match(name, "clyde", RegexOptions.IgnoreCase); - if (!match.Success) return name; - - // Put a hair space (\u200A) between the "c" and the "lyde" in the match to avoid Discord matching it - // since Discord blocks webhooks containing the word "Clyde"... for some reason. /shrug - return name.Substring(0, match.Index + 1) + '\u200A' + name.Substring(match.Index + 1); - } - public void Dispose() { _httpClient.Dispose(); diff --git a/PluralKit.Bot/Services/WebhookCacheService.cs b/PluralKit.Bot/Services/WebhookCacheService.cs index e4fef7e3..5844252d 100644 --- a/PluralKit.Bot/Services/WebhookCacheService.cs +++ b/PluralKit.Bot/Services/WebhookCacheService.cs @@ -8,18 +8,12 @@ using Serilog; namespace PluralKit.Bot { - public class WebhookCacheService: IDisposable + public class WebhookCacheService { - public class WebhookCacheEntry - { - internal DiscordWebhookClient Client; - internal IWebhook Webhook; - } - public static readonly string WebhookName = "PluralKit Proxy Webhook"; private IDiscordClient _client; - private ConcurrentDictionary>> _webhooks; + private ConcurrentDictionary>> _webhooks; private ILogger _logger; @@ -27,45 +21,42 @@ namespace PluralKit.Bot { _client = client; _logger = logger.ForContext(); - _webhooks = new ConcurrentDictionary>>(); + _webhooks = new ConcurrentDictionary>>(); } - public async Task GetWebhook(ulong channelId) + public async Task GetWebhook(ulong channelId) { var channel = await _client.GetChannelAsync(channelId) as ITextChannel; if (channel == null) return null; return await GetWebhook(channel); } - public async Task GetWebhook(ITextChannel channel) + public async Task GetWebhook(ITextChannel channel) { // We cache the webhook through a Lazy>, this way we make sure to only create one webhook per channel // If the webhook is requested twice before it's actually been found, the Lazy wrapper will stop the // webhook from being created twice. var lazyWebhookValue = - _webhooks.GetOrAdd(channel.Id, new Lazy>(() => GetOrCreateWebhook(channel))); + _webhooks.GetOrAdd(channel.Id, new Lazy>(() => GetOrCreateWebhook(channel))); // It's possible to "move" a webhook to a different channel after creation // Here, we ensure it's actually still pointing towards the proper channel, and if not, wipe and refetch one. var webhook = await lazyWebhookValue.Value; - if (webhook.Webhook.ChannelId != channel.Id) return await InvalidateAndRefreshWebhook(webhook); + if (webhook.ChannelId != channel.Id) return await InvalidateAndRefreshWebhook(webhook); return webhook; } - public async Task InvalidateAndRefreshWebhook(WebhookCacheEntry webhook) + public async Task InvalidateAndRefreshWebhook(IWebhook webhook) { - _logger.Information("Refreshing webhook for channel {Channel}", webhook.Webhook.ChannelId); + _logger.Information("Refreshing webhook for channel {Channel}", webhook.ChannelId); - _webhooks.TryRemove(webhook.Webhook.ChannelId, out _); - return await GetWebhook(webhook.Webhook.Channel); + _webhooks.TryRemove(webhook.ChannelId, out _); + return await GetWebhook(webhook.Channel); } - private async Task GetOrCreateWebhook(ITextChannel channel) - { - var webhook = await FindExistingWebhook(channel) ?? await DoCreateWebhook(channel); - return await DoCreateWebhookClient(webhook); - } - + private async Task GetOrCreateWebhook(ITextChannel channel) => + await FindExistingWebhook(channel) ?? await DoCreateWebhook(channel); + private async Task FindExistingWebhook(ITextChannel channel) { _logger.Debug("Finding webhook for channel {Channel}", channel.Id); @@ -78,28 +69,8 @@ namespace PluralKit.Bot return channel.CreateWebhookAsync(WebhookName); } - private Task DoCreateWebhookClient(IWebhook webhook) - { - // DiscordWebhookClient's ctor is synchronous despite doing web calls, so we wrap it in a Task - return Task.Run(() => - { - return new WebhookCacheEntry - { - Client = new DiscordWebhookClient(webhook), - Webhook = webhook - }; - }); - } - private bool IsWebhookMine(IWebhook arg) => arg.Creator.Id == _client.CurrentUser.Id && arg.Name == WebhookName; public int CacheSize => _webhooks.Count; - - public void Dispose() - { - foreach (var entry in _webhooks.Values) - if (entry.IsValueCreated) - entry.Value.Result.Client.Dispose(); - } } } \ No newline at end of file diff --git a/PluralKit.Bot/Services/WebhookExecutorService.cs b/PluralKit.Bot/Services/WebhookExecutorService.cs new file mode 100644 index 00000000..e0604079 --- /dev/null +++ b/PluralKit.Bot/Services/WebhookExecutorService.cs @@ -0,0 +1,118 @@ +using System; +using System.Net.Http; +using System.Text.RegularExpressions; +using System.Threading.Tasks; +using App.Metrics; +using App.Metrics.Logging; +using Discord; +using Discord.Net; +using Discord.Webhook; +using Microsoft.Extensions.Caching.Memory; +using Serilog; + +namespace PluralKit.Bot +{ + public class WebhookExecutorService: IDisposable + { + private WebhookCacheService _webhookCache; + private IMemoryCache _cache; + private ILogger _logger; + private IMetrics _metrics; + private HttpClient _client; + + public WebhookExecutorService(IMemoryCache cache, IMetrics metrics, WebhookCacheService webhookCache, ILogger logger) + { + _cache = cache; + _metrics = metrics; + _webhookCache = webhookCache; + _logger = logger.ForContext(); + _client = new HttpClient(); + } + + public async Task ExecuteWebhook(ITextChannel channel, string name, string avatarUrl, string content, IAttachment attachment) + { + _logger.Debug("Invoking webhook in channel {Channel}", channel.Id); + + // Get a webhook, execute it + var webhook = await _webhookCache.GetWebhook(channel); + var id = await ExecuteWebhookInner(webhook, name, avatarUrl, content, attachment); + + // Log the relevant metrics + _metrics.Measure.Meter.Mark(BotMetrics.MessagesProxied); + _logger.Information("Invoked webhook {Webhook} in channel {Channel}", webhook.Id, + channel.Id); + + return id; + } + + private async Task ExecuteWebhookInner(IWebhook webhook, string name, string avatarUrl, string content, + IAttachment attachment, bool hasRetried = false) + { + var client = await GetClientFor(webhook); + + try + { + // If we have an attachment, use the special SendFileAsync method + if (attachment != null) + using (var attachmentStream = await _client.GetStreamAsync(attachment.Url)) + using (_metrics.Measure.Timer.Time(BotMetrics.WebhookResponseTime)) + return await client.SendFileAsync(attachmentStream, attachment.Filename, content, + username: FixClyde(name), + avatarUrl: avatarUrl); + + // Otherwise, send normally + return await client.SendMessageAsync(content, username: name, avatarUrl: avatarUrl); + } + catch (HttpException e) + { + // If we hit an error, just retry (if we haven't already) + if (e.DiscordCode == 10015 && !hasRetried) // Error 10015 = "Unknown Webhook" + { + _logger.Warning(e, "Error invoking webhook {Webhook} in channel {Channel}", webhook.Id, webhook.ChannelId); + return await ExecuteWebhookInner(await _webhookCache.InvalidateAndRefreshWebhook(webhook), name, avatarUrl, content, attachment, hasRetried: true); + } + + throw; + } + } + + private async Task GetClientFor(IWebhook webhook) + { + _logger.Debug("Looking for client for webhook {Webhook} in cache", webhook.Id); + return await _cache.GetOrCreateAsync($"_webhook_client_{webhook.Id}", + (entry) => MakeCachedClientFor(entry, webhook)); + } + + private Task MakeCachedClientFor(ICacheEntry entry, IWebhook webhook) { + _logger.Information("Client for {Webhook} not found in cache, creating", webhook.Id); + + // Define expiration for the client cache + // 10 minutes *without a query* and it gets yoten + entry.SlidingExpiration = TimeSpan.FromMinutes(10); + + // IMemoryCache won't automatically dispose of its values when the cache gets evicted + // so we register a hook to do so here. + entry.RegisterPostEvictionCallback((key, value, reason, state) => (value as IDisposable)?.Dispose()); + + // DiscordWebhookClient has a sync network call in its constructor (!!!) + // and we want to punt that onto a task queue, so we do that. + return Task.Run(() => new DiscordWebhookClient(webhook)); + } + + private string FixClyde(string name) + { + // Check if the name contains "Clyde" - if not, do nothing + var match = Regex.Match(name, "clyde", RegexOptions.IgnoreCase); + if (!match.Success) return name; + + // Put a hair space (\u200A) between the "c" and the "lyde" in the match to avoid Discord matching it + // since Discord blocks webhooks containing the word "Clyde"... for some reason. /shrug + return name.Substring(0, match.Index + 1) + '\u200A' + name.Substring(match.Index + 1); + } + + public void Dispose() + { + _client.Dispose(); + } + } +} \ No newline at end of file From d3f821a2666a86648ea50c5acfee331b33e013f0 Mon Sep 17 00:00:00 2001 From: Ske Date: Mon, 12 Aug 2019 05:56:05 +0200 Subject: [PATCH 20/51] Send a request ID on error --- PluralKit.Bot/Bot.cs | 20 +++++++++++++++----- 1 file changed, 15 insertions(+), 5 deletions(-) diff --git a/PluralKit.Bot/Bot.cs b/PluralKit.Bot/Bot.cs index 42d4c2c2..1220275e 100644 --- a/PluralKit.Bot/Bot.cs +++ b/PluralKit.Bot/Bot.cs @@ -5,6 +5,7 @@ using System.Reflection; using System.Threading; using System.Threading.Tasks; using App.Metrics; +using App.Metrics.Logging; using Dapper; using Discord; using Discord.Commands; @@ -226,6 +227,9 @@ namespace PluralKit.Bot private async Task CommandExecuted(Optional cmd, ICommandContext ctx, IResult _result) { + var svc = ((PKCommandContext) ctx).ServiceProvider; + var id = svc.GetService(); + _metrics.Measure.Meter.Mark(BotMetrics.CommandsRun); // TODO: refactor this entire block, it's fugly. @@ -241,8 +245,11 @@ namespace PluralKit.Bot } else if (_result is PreconditionResult) { await ctx.Message.Channel.SendMessageAsync($"{Emojis.Error} {_result.ErrorReason}"); - } else { - HandleRuntimeError((_result as ExecuteResult?)?.Exception, ((PKCommandContext) ctx).ServiceProvider.GetRequiredService()); + } else + { + await ctx.Message.Channel.SendMessageAsync( + $"{Emojis.Error} Internal error occurred. Please join the support server (see `pk;help`), and send the developer this ID: `{id.EventId}`."); + HandleRuntimeError((_result as ExecuteResult?)?.Exception, svc); } } else if ((_result.Error == CommandError.BadArgCount || _result.Error == CommandError.MultipleMatches) && cmd.IsSpecified) { await ctx.Message.Channel.SendMessageAsync($"{Emojis.Error} {_result.ErrorReason}\n**Usage: **pk;{cmd.Value.Remarks}"); @@ -274,7 +281,7 @@ namespace PluralKit.Bot } catch (Exception e) { - HandleRuntimeError(e, sentryScope); + HandleRuntimeError(e, scope.ServiceProvider); } } @@ -286,9 +293,12 @@ namespace PluralKit.Bot return Task.CompletedTask; } - private void HandleRuntimeError(Exception e, Scope scope = null) + private void HandleRuntimeError(Exception e, IServiceProvider services) { - _logger.Error(e, "Exception in bot event handler"); + var logger = services.GetRequiredService(); + var scope = services.GetRequiredService(); + + logger.Error(e, "Exception in bot event handler"); var evt = new SentryEvent(e); SentrySdk.CaptureEvent(evt, scope); From 7945603cdbe4e4220dafc0e59532ce15534674c4 Mon Sep 17 00:00:00 2001 From: Ske Date: Mon, 12 Aug 2019 06:03:20 +0200 Subject: [PATCH 21/51] Include invite link in error message --- PluralKit.Bot/Bot.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/PluralKit.Bot/Bot.cs b/PluralKit.Bot/Bot.cs index 1220275e..bc70fd76 100644 --- a/PluralKit.Bot/Bot.cs +++ b/PluralKit.Bot/Bot.cs @@ -248,7 +248,7 @@ namespace PluralKit.Bot } else { await ctx.Message.Channel.SendMessageAsync( - $"{Emojis.Error} Internal error occurred. Please join the support server (see `pk;help`), and send the developer this ID: `{id.EventId}`."); + $"{Emojis.Error} Internal error occurred. Please join the support server (), and send the developer this ID: `{id.EventId}`."); HandleRuntimeError((_result as ExecuteResult?)?.Exception, svc); } } else if ((_result.Error == CommandError.BadArgCount || _result.Error == CommandError.MultipleMatches) && cmd.IsSpecified) { From a48940476c203a3c20651358de638c35af80acbb Mon Sep 17 00:00:00 2001 From: Ske Date: Mon, 12 Aug 2019 06:10:55 +0200 Subject: [PATCH 22/51] Eagerly discard messages before shard init --- PluralKit.Bot/Bot.cs | 15 +++++++++------ 1 file changed, 9 insertions(+), 6 deletions(-) diff --git a/PluralKit.Bot/Bot.cs b/PluralKit.Bot/Bot.cs index bc70fd76..defcf281 100644 --- a/PluralKit.Bot/Bot.cs +++ b/PluralKit.Bot/Bot.cs @@ -168,7 +168,15 @@ namespace PluralKit.Bot _client.ShardReady += ShardReady; _client.Log += FrameworkLog; - _client.MessageReceived += (msg) => HandleEvent(s => s.AddMessageBreadcrumb(msg), eh => eh.HandleMessage(msg)); + _client.MessageReceived += (msg) => + { + // _client.CurrentUser will be null if we've connected *some* shards but not shard #0 yet + // This will cause an error in WebhookCacheService so we just workaround and don't process any messages + // until we properly connect. TODO: can we do this without chucking away a bunch of messages? + if (_client.CurrentUser == null) return Task.CompletedTask; + + return HandleEvent(s => s.AddMessageBreadcrumb(msg), eh => eh.HandleMessage(msg)); + }; _client.ReactionAdded += (msg, channel, reaction) => HandleEvent(s => s.AddReactionAddedBreadcrumb(msg, channel, reaction), eh => eh.HandleReactionAdded(msg, channel, reaction)); _client.MessageDeleted += (msg, channel) => HandleEvent(s => s.AddMessageDeleteBreadcrumb(msg, channel), eh => eh.HandleMessageDeleted(msg, channel)); _client.MessagesBulkDeleted += (msgs, channel) => HandleEvent(s => s.AddMessageBulkDeleteBreadcrumb(msgs, channel), eh => eh.HandleMessagesBulkDelete(msgs, channel)); @@ -331,11 +339,6 @@ namespace PluralKit.Bot { RegisterMessageMetrics(msg); - // _client.CurrentUser will be null if we've connected *some* shards but not shard #0 yet - // This will cause an error in WebhookCacheServices so we just workaround and don't process any messages - // until we properly connect. TODO: can we do this without chucking away a bunch of messages? - if (_client.CurrentUser == null) return; - // Ignore system messages (member joined, message pinned, etc) var arg = msg as SocketUserMessage; if (arg == null) return; From 5728f94e000a0c0f5aee19d4adbc298048292038 Mon Sep 17 00:00:00 2001 From: Ske Date: Mon, 12 Aug 2019 06:24:37 +0200 Subject: [PATCH 23/51] Fix stats command --- PluralKit.Bot/Commands/MiscCommands.cs | 2 -- 1 file changed, 2 deletions(-) diff --git a/PluralKit.Bot/Commands/MiscCommands.cs b/PluralKit.Bot/Commands/MiscCommands.cs index 3d7d4c14..1f1bbd89 100644 --- a/PluralKit.Bot/Commands/MiscCommands.cs +++ b/PluralKit.Bot/Commands/MiscCommands.cs @@ -43,7 +43,6 @@ namespace PluralKit.Bot.Commands { { var messagesReceived = Metrics.Snapshot.GetForContext("Bot").Meters.First(m => m.MultidimensionalName == BotMetrics.MessagesReceived.Name).Value; var messagesProxied = Metrics.Snapshot.GetForContext("Bot").Meters.First(m => m.MultidimensionalName == BotMetrics.MessagesProxied.Name).Value; - var proxySuccessRate = messagesProxied.Items.First(i => i.Item == "success"); var commandsRun = Metrics.Snapshot.GetForContext("Bot").Meters.First(m => m.MultidimensionalName == BotMetrics.CommandsRun.Name).Value; @@ -51,7 +50,6 @@ namespace PluralKit.Bot.Commands { .AddField("Messages processed", $"{messagesReceived.OneMinuteRate:F1}/s ({messagesReceived.FifteenMinuteRate:F1}/s over 15m)") .AddField("Messages proxied", $"{messagesProxied.OneMinuteRate:F1}/s ({messagesProxied.FifteenMinuteRate:F1}/s over 15m)") .AddField("Commands executed", $"{commandsRun.OneMinuteRate:F1}/s ({commandsRun.FifteenMinuteRate:F1}/s over 15m)") - .AddField("Proxy success rate", $"{proxySuccessRate.Percent/100:P1}") .Build()); } From 1604500f2a66985c4e82a909dd7154243d2f915e Mon Sep 17 00:00:00 2001 From: Ske Date: Mon, 12 Aug 2019 06:49:18 +0200 Subject: [PATCH 24/51] Optimize Docker build files --- .dockerignore | 15 +++++++++++++++ Dockerfile | 18 +++++++++++------- docker-compose.yml | 13 +++++++------ 3 files changed, 33 insertions(+), 13 deletions(-) create mode 100644 .dockerignore diff --git a/.dockerignore b/.dockerignore new file mode 100644 index 00000000..85524c7a --- /dev/null +++ b/.dockerignore @@ -0,0 +1,15 @@ +/.git/ +/.github/ +/.idea/ +/docs/ +/logs/ +/scripts/ + +bin/ +obj/ + +*.conf +*.md + +Dockerfile +docker-compose.yml \ No newline at end of file diff --git a/Dockerfile b/Dockerfile index 18653e98..0f6b47cd 100644 --- a/Dockerfile +++ b/Dockerfile @@ -1,9 +1,13 @@ -FROM mcr.microsoft.com/dotnet/core/sdk:2.2-alpine +FROM mcr.microsoft.com/dotnet/core/sdk:2.2-alpine AS build WORKDIR /app -COPY PluralKit.API /app/PluralKit.API -COPY PluralKit.Bot /app/PluralKit.Bot -COPY PluralKit.Core /app/PluralKit.Core -COPY PluralKit.Web /app/PluralKit.Web -COPY PluralKit.sln /app -RUN dotnet build +COPY . /app +RUN dotnet publish -c Release -o out + +FROM mcr.microsoft.com/dotnet/core/runtime:2.2-alpine +WORKDIR /app +COPY --from=build /app/PluralKit.*/out ./ + +ENTRYPOINT ["dotnet"] +CMD ["PluralKit.Bot.dll"] + diff --git a/docker-compose.yml b/docker-compose.yml index 6a5f313e..251b3fba 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -1,8 +1,9 @@ version: "3" services: bot: - build: . - entrypoint: ["dotnet", "run", "--project", "PluralKit.Bot"] + image: pluralkit # This image is reused in the other containers due to the + build: . # build instruction right here + command: ["PluralKit.Bot.dll"] environment: - "PluralKit:Database=Host=db;Username=postgres;Password=postgres;Database=postgres;Maximum Pool Size=1000" - "PluralKit:InfluxUrl=http://influx:8086" @@ -16,8 +17,8 @@ services: - influx restart: always web: - build: . - entrypoint: ["dotnet", "run", "--project", "PluralKit.Web"] + image: pluralkit + command: ["PluralKit.Web.dll"] environment: - "PluralKit:Database=Host=db;Username=postgres;Password=postgres;Database=postgres;Maximum Pool Size=1000" links: @@ -26,8 +27,8 @@ services: - 2837:5000 restart: always api: - build: . - entrypoint: ["dotnet", "run", "--project", "PluralKit.API"] + image: pluralkit + command: ["PluralKit.API.dll"] environment: - "PluralKit:Database=Host=db;Username=postgres;Password=postgres;Database=postgres;Maximum Pool Size=1000" links: From 5f79aaf960930d46ff985ef7bc01e07233c76e2b Mon Sep 17 00:00:00 2001 From: Ske Date: Mon, 12 Aug 2019 06:54:28 +0200 Subject: [PATCH 25/51] Fix API service injection --- PluralKit.API/Startup.cs | 5 ++++- PluralKit.Bot/Bot.cs | 9 +-------- PluralKit.Core/Utils.cs | 10 ++++++++++ 3 files changed, 15 insertions(+), 9 deletions(-) diff --git a/PluralKit.API/Startup.cs b/PluralKit.API/Startup.cs index 8437031f..17d9570a 100644 --- a/PluralKit.API/Startup.cs +++ b/PluralKit.API/Startup.cs @@ -1,4 +1,5 @@ -using Microsoft.AspNetCore.Builder; +using App.Metrics; +using Microsoft.AspNetCore.Builder; using Microsoft.AspNetCore.Hosting; using Microsoft.AspNetCore.Mvc; using Microsoft.Extensions.Configuration; @@ -28,6 +29,8 @@ namespace PluralKit.API .AddTransient() .AddTransient() .AddTransient() + + .AddSingleton(svc => InitUtils.InitMetrics(svc.GetRequiredService(), "API")) .AddScoped() diff --git a/PluralKit.Bot/Bot.cs b/PluralKit.Bot/Bot.cs index defcf281..67f58d4a 100644 --- a/PluralKit.Bot/Bot.cs +++ b/PluralKit.Bot/Bot.cs @@ -115,14 +115,7 @@ namespace PluralKit.Bot .AddTransient() .AddTransient() - .AddSingleton(svc => - { - var cfg = svc.GetRequiredService(); - var builder = AppMetrics.CreateDefaultBuilder(); - if (cfg.InfluxUrl != null && cfg.InfluxDb != null) - builder.Report.ToInfluxDb(cfg.InfluxUrl, cfg.InfluxDb); - return builder.Build(); - }) + .AddSingleton(svc => InitUtils.InitMetrics(svc.GetRequiredService())) .AddSingleton() .AddScoped(_ => new Sentry.Scope(null)) diff --git a/PluralKit.Core/Utils.cs b/PluralKit.Core/Utils.cs index fab1d874..615a7eeb 100644 --- a/PluralKit.Core/Utils.cs +++ b/PluralKit.Core/Utils.cs @@ -323,6 +323,16 @@ namespace PluralKit .CreateLogger(); } + public static IMetrics InitMetrics(CoreConfig config, string onlyContext = null) + { + var builder = AppMetrics.CreateDefaultBuilder(); + if (config.InfluxUrl != null && config.InfluxDb != null) + builder.Report.ToInfluxDb(config.InfluxUrl, config.InfluxDb); + if (onlyContext != null) + builder.Filter.ByIncludingOnlyContext(onlyContext); + return builder.Build(); + } + public static JsonSerializerSettings BuildSerializerSettings() => new JsonSerializerSettings().BuildSerializerSettings(); public static JsonSerializerSettings BuildSerializerSettings(this JsonSerializerSettings settings) From 8396e17a8740bc05525c752f04d6ae31817dc6fc Mon Sep 17 00:00:00 2001 From: Ske Date: Mon, 12 Aug 2019 16:38:34 +0200 Subject: [PATCH 26/51] Attempt to fix webhook invocation errors --- PluralKit.Bot/Services/WebhookCacheService.cs | 20 ++++++++++++++++--- .../Services/WebhookExecutorService.cs | 17 +++++++++++++++- 2 files changed, 33 insertions(+), 4 deletions(-) diff --git a/PluralKit.Bot/Services/WebhookCacheService.cs b/PluralKit.Bot/Services/WebhookCacheService.cs index 5844252d..cf107d56 100644 --- a/PluralKit.Bot/Services/WebhookCacheService.cs +++ b/PluralKit.Bot/Services/WebhookCacheService.cs @@ -1,6 +1,7 @@ using System; using System.Collections.Concurrent; using System.Linq; +using System.Net.Http; using System.Threading.Tasks; using Discord; using Discord.Webhook; @@ -54,13 +55,26 @@ namespace PluralKit.Bot return await GetWebhook(webhook.Channel); } - private async Task GetOrCreateWebhook(ITextChannel channel) => - await FindExistingWebhook(channel) ?? await DoCreateWebhook(channel); + private async Task GetOrCreateWebhook(ITextChannel channel) + { + _logger.Debug("Webhook for channel {Channel} not found in cache, trying to fetch", channel.Id); + return await FindExistingWebhook(channel) ?? await DoCreateWebhook(channel); + } private async Task FindExistingWebhook(ITextChannel channel) { _logger.Debug("Finding webhook for channel {Channel}", channel.Id); - return (await channel.GetWebhooksAsync()).FirstOrDefault(IsWebhookMine); + try + { + return (await channel.GetWebhooksAsync()).FirstOrDefault(IsWebhookMine); + } + catch (HttpRequestException e) + { + _logger.Warning(e, "Error occurred while fetching webhook list"); + // This happens sometimes when Discord returns a malformed request for the webhook list + // Nothing we can do than just assume that none exist and return null. + return null; + } } private Task DoCreateWebhook(ITextChannel channel) diff --git a/PluralKit.Bot/Services/WebhookExecutorService.cs b/PluralKit.Bot/Services/WebhookExecutorService.cs index e0604079..f8b17468 100644 --- a/PluralKit.Bot/Services/WebhookExecutorService.cs +++ b/PluralKit.Bot/Services/WebhookExecutorService.cs @@ -96,7 +96,22 @@ namespace PluralKit.Bot // DiscordWebhookClient has a sync network call in its constructor (!!!) // and we want to punt that onto a task queue, so we do that. - return Task.Run(() => new DiscordWebhookClient(webhook)); + return Task.Run(async () => + { + try + { + return new DiscordWebhookClient(webhook); + } + catch (InvalidOperationException) + { + // TODO: does this leak stuff inside the DiscordWebhookClient created above? + + // Webhook itself was found in cache, but has been deleted on the channel + // We request a new webhook instead + return new DiscordWebhookClient(await _webhookCache.InvalidateAndRefreshWebhook(webhook)); + } + + }); } private string FixClyde(string name) From d8503001eb9737311e8d7ba8ac68138b46279cf1 Mon Sep 17 00:00:00 2001 From: Ske Date: Mon, 12 Aug 2019 17:47:35 +0200 Subject: [PATCH 27/51] Show an error when a bad import URL is given --- PluralKit.Bot/Commands/ImportExportCommands.cs | 13 ++++++++++++- 1 file changed, 12 insertions(+), 1 deletion(-) diff --git a/PluralKit.Bot/Commands/ImportExportCommands.cs b/PluralKit.Bot/Commands/ImportExportCommands.cs index eb2690f1..4969da82 100644 --- a/PluralKit.Bot/Commands/ImportExportCommands.cs +++ b/PluralKit.Bot/Commands/ImportExportCommands.cs @@ -1,3 +1,4 @@ +using System; using System.IO; using System.Linq; using System.Net.Http; @@ -25,7 +26,17 @@ namespace PluralKit.Bot.Commands { using (var client = new HttpClient()) { - var response = await client.GetAsync(url); + HttpResponseMessage response; + try + { + response = await client.GetAsync(url); + } + catch (InvalidOperationException) + { + // Invalid URL throws this, we just error back out + throw Errors.InvalidImportFile; + } + if (!response.IsSuccessStatusCode) throw Errors.InvalidImportFile; var json = await response.Content.ReadAsStringAsync(); From fb7f31d42d9f9efb0f9f4c25fa6ea5844a61620f Mon Sep 17 00:00:00 2001 From: Ske Date: Mon, 12 Aug 2019 17:49:07 +0200 Subject: [PATCH 28/51] Invalidate proxy caches on more editing commands --- PluralKit.Bot/Commands/MemberCommands.cs | 14 +++++++++++++- PluralKit.Bot/Commands/SystemCommands.cs | 10 ++++++++++ 2 files changed, 23 insertions(+), 1 deletion(-) diff --git a/PluralKit.Bot/Commands/MemberCommands.cs b/PluralKit.Bot/Commands/MemberCommands.cs index 2a58b7a3..3209dcd6 100644 --- a/PluralKit.Bot/Commands/MemberCommands.cs +++ b/PluralKit.Bot/Commands/MemberCommands.cs @@ -48,6 +48,8 @@ namespace PluralKit.Bot.Commands // Send confirmation and space hint await Context.Channel.SendMessageAsync($"{Emojis.Success} Member \"{memberName.Sanitize()}\" (`{member.Hid}`) registered! See the user guide for commands for editing this member: https://pluralkit.me/guide#member-management"); if (memberName.Contains(" ")) await Context.Channel.SendMessageAsync($"{Emojis.Note} Note that this member's name contains spaces. You will need to surround it with \"double quotes\" when using commands referring to it, or just use the member's 5-character ID (which is `{member.Hid}`)."); + + await ProxyCache.InvalidateResultsForSystem(Context.SenderSystem); } [Command("rename")] @@ -80,6 +82,8 @@ namespace PluralKit.Bot.Commands await Context.Channel.SendMessageAsync($"{Emojis.Success} Member renamed."); if (newName.Contains(" ")) await Context.Channel.SendMessageAsync($"{Emojis.Note} Note that this member's name now contains spaces. You will need to surround it with \"double quotes\" when using commands referring to it."); if (ContextEntity.DisplayName != null) await Context.Channel.SendMessageAsync($"{Emojis.Note} Note that this member has a display name set (`{ContextEntity.DisplayName}`), and will be proxied using that name instead."); + + await ProxyCache.InvalidateResultsForSystem(Context.SenderSystem); } [Command("description")] @@ -173,7 +177,7 @@ namespace PluralKit.Bot.Commands await Members.Save(ContextEntity); await Context.Channel.SendMessageAsync($"{Emojis.Success} Member proxy tags changed to `{ContextEntity.ProxyString.Sanitize()}`. Try proxying now!"); - ProxyCache.InvalidateResultsForSystem(Context.SenderSystem); + await ProxyCache.InvalidateResultsForSystem(Context.SenderSystem); } [Command("delete")] @@ -186,6 +190,8 @@ namespace PluralKit.Bot.Commands if (!await Context.ConfirmWithReply(ContextEntity.Hid)) throw Errors.MemberDeleteCancelled; await Members.Delete(ContextEntity); await Context.Channel.SendMessageAsync($"{Emojis.Success} Member deleted."); + + await ProxyCache.InvalidateResultsForSystem(Context.SenderSystem); } [Command("avatar")] @@ -201,6 +207,8 @@ namespace PluralKit.Bot.Commands var embed = new EmbedBuilder().WithImageUrl(ContextEntity.AvatarUrl).Build(); await Context.Channel.SendMessageAsync( $"{Emojis.Success} Member avatar changed to {member.Username}'s avatar! {Emojis.Warn} Please note that if {member.Username} changes their avatar, the webhook's avatar will need to be re-set.", embed: embed); + + await ProxyCache.InvalidateResultsForSystem(Context.SenderSystem); } [Command("avatar")] @@ -217,6 +225,8 @@ namespace PluralKit.Bot.Commands var embed = url != null ? new EmbedBuilder().WithImageUrl(url).Build() : null; await Context.Channel.SendMessageAsync($"{Emojis.Success} Member avatar {(url == null ? "cleared" : "changed")}.", embed: embed); + + await ProxyCache.InvalidateResultsForSystem(Context.SenderSystem); } [Command("displayname")] @@ -250,6 +260,8 @@ namespace PluralKit.Bot.Commands successStr += $"This member will now be proxied using their member name `{ContextEntity.Name}."; } await Context.Channel.SendMessageAsync(successStr); + + await ProxyCache.InvalidateResultsForSystem(Context.SenderSystem); } [Command] diff --git a/PluralKit.Bot/Commands/SystemCommands.cs b/PluralKit.Bot/Commands/SystemCommands.cs index e77fc485..8d8ee585 100644 --- a/PluralKit.Bot/Commands/SystemCommands.cs +++ b/PluralKit.Bot/Commands/SystemCommands.cs @@ -24,6 +24,8 @@ namespace PluralKit.Bot.Commands public SwitchStore Switches {get; set;} public EmbedService EmbedService {get; set;} + public ProxyCacheService ProxyCache { get; set; } + [Command] [Remarks("system ")] @@ -94,6 +96,8 @@ namespace PluralKit.Bot.Commands await Systems.Save(Context.SenderSystem); await Context.Channel.SendMessageAsync($"{Emojis.Success} System tag {(newTag != null ? "changed" : "cleared")}."); + + await ProxyCache.InvalidateResultsForSystem(Context.SenderSystem); } [Command("avatar")] @@ -109,6 +113,8 @@ namespace PluralKit.Bot.Commands var embed = new EmbedBuilder().WithImageUrl(Context.SenderSystem.AvatarUrl).Build(); await Context.Channel.SendMessageAsync( $"{Emojis.Success} System avatar changed to {member.Username}'s avatar! {Emojis.Warn} Please note that if {member.Username} changes their avatar, the system's avatar will need to be re-set.", embed: embed); + + await ProxyCache.InvalidateResultsForSystem(Context.SenderSystem); } [Command("avatar")] @@ -125,6 +131,8 @@ namespace PluralKit.Bot.Commands var embed = url != null ? new EmbedBuilder().WithImageUrl(url).Build() : null; await Context.Channel.SendMessageAsync($"{Emojis.Success} System avatar {(url == null ? "cleared" : "changed")}.", embed: embed); + + await ProxyCache.InvalidateResultsForSystem(Context.SenderSystem); } [Command("delete")] @@ -138,6 +146,8 @@ namespace PluralKit.Bot.Commands await Systems.Delete(Context.SenderSystem); await Context.Channel.SendMessageAsync($"{Emojis.Success} System deleted."); + + await ProxyCache.InvalidateResultsForSystem(Context.SenderSystem); } [Group("list")] From 4d2c843442128fd7130d99a69ddfb759a97b8283 Mon Sep 17 00:00:00 2001 From: Ske Date: Mon, 12 Aug 2019 18:07:29 +0200 Subject: [PATCH 29/51] Handle busy indicator without permission properly --- PluralKit.Bot/ContextUtils.cs | 3 +++ 1 file changed, 3 insertions(+) diff --git a/PluralKit.Bot/ContextUtils.cs b/PluralKit.Bot/ContextUtils.cs index c6afd928..9e5d74b3 100644 --- a/PluralKit.Bot/ContextUtils.cs +++ b/PluralKit.Bot/ContextUtils.cs @@ -205,6 +205,9 @@ namespace PluralKit.Bot { { var task = f(); + // If we don't have permission to add reactions, don't bother, and just await the task normally. + if (!await ctx.HasPermission(ChannelPermission.AddReactions)) return await task; + try { await Task.WhenAll(ctx.Message.AddReactionAsync(new Emoji(emoji)), task); From 4e695311038cddf74f460c6f44137dc826d407fa Mon Sep 17 00:00:00 2001 From: Ske Date: Tue, 13 Aug 2019 21:49:43 +0200 Subject: [PATCH 30/51] Ignore invalid colors in member card --- PluralKit.Bot/Services/EmbedService.cs | 14 +++++++++++++- 1 file changed, 13 insertions(+), 1 deletion(-) diff --git a/PluralKit.Bot/Services/EmbedService.cs b/PluralKit.Bot/Services/EmbedService.cs index a3e0d843..42bdd6a1 100644 --- a/PluralKit.Bot/Services/EmbedService.cs +++ b/PluralKit.Bot/Services/EmbedService.cs @@ -1,3 +1,4 @@ +using System; using System.Collections.Generic; using System.Linq; using System.Threading.Tasks; @@ -69,7 +70,18 @@ namespace PluralKit.Bot { var name = member.Name; if (system.Name != null) name = $"{member.Name} ({system.Name})"; - var color = member.Color?.ToDiscordColor() ?? Color.Default; + Color color; + try + { + color = member.Color?.ToDiscordColor() ?? Color.Default; + } + catch (ArgumentException) + { + // Bad API use can cause an invalid color string + // TODO: fix that in the API + // for now we just default to a blank color, yolo + color = Color.Default; + } var messageCount = await _members.MessageCount(member); From ec49d10d66b0e9bcaed6104de469a219cdb4316b Mon Sep 17 00:00:00 2001 From: Ske Date: Tue, 13 Aug 2019 23:25:55 +0200 Subject: [PATCH 31/51] Add .editorconfig --- .editorconfig | 53 +++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 53 insertions(+) create mode 100644 .editorconfig diff --git a/.editorconfig b/.editorconfig new file mode 100644 index 00000000..7f652d9f --- /dev/null +++ b/.editorconfig @@ -0,0 +1,53 @@ + +[*] +charset=utf-8 +end_of_line=lf +trim_trailing_whitespace=false +insert_final_newline=false +indent_style=space +indent_size=4 + +# Microsoft .NET properties +csharp_preferred_modifier_order=public, private, protected, internal, new, abstract, virtual, sealed, override, static, readonly, extern, unsafe, volatile, async:suggestion +csharp_space_before_colon_in_inheritance_clause=false +csharp_style_var_elsewhere=true:hint +csharp_style_var_for_built_in_types=true:hint +csharp_style_var_when_type_is_apparent=true:hint +dotnet_style_predefined_type_for_locals_parameters_members=true:hint +dotnet_style_predefined_type_for_member_access=true:hint +dotnet_style_qualification_for_event=false:warning +dotnet_style_qualification_for_field=false:warning +dotnet_style_qualification_for_method=false:warning +dotnet_style_qualification_for_property=false:warning +dotnet_style_require_accessibility_modifiers=for_non_interface_members:hint + +# ReSharper properties +resharper_align_multiline_parameter=true +resharper_autodetect_indent_settings=true +resharper_blank_lines_between_using_groups=1 +resharper_braces_for_using=required_for_multiline +resharper_csharp_stick_comment=false +resharper_empty_block_style=together_same_line +resharper_keep_existing_attribute_arrangement=true +resharper_keep_existing_initializer_arrangement=false +resharper_local_function_body=expression_body +resharper_method_or_operator_body=expression_body +resharper_place_accessor_with_attrs_holder_on_single_line=true +resharper_place_simple_case_statement_on_same_line=if_owner_is_single_line +resharper_space_before_type_parameter_constraint_colon=false +resharper_use_indent_from_vs=false +resharper_wrap_before_first_type_parameter_constraint=true + +# ReSharper inspection severities: +resharper_web_config_module_not_resolved_highlighting=warning +resharper_web_config_type_not_resolved_highlighting=warning +resharper_web_config_wrong_module_highlighting=warning + +[{*.yml,*.yaml}] +indent_style=space +indent_size=2 + +[*.{appxmanifest,asax,ascx,aspx,build,config,cs,cshtml,csproj,dbml,discomap,dtd,fs,fsi,fsscript,fsx,htm,html,jsproj,lsproj,master,ml,mli,njsproj,nuspec,proj,props,razor,resw,resx,skin,StyleCop,targets,tasks,vb,vbproj,xaml,xamlx,xml,xoml,xsd}] +indent_style=space +indent_size=4 +tab_width=4 From 5ef8a9303d79105ccf3eb5f4a5d78f55ca49e853 Mon Sep 17 00:00:00 2001 From: Ske Date: Tue, 13 Aug 2019 23:28:24 +0200 Subject: [PATCH 32/51] Update .gitignore --- .gitignore | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/.gitignore b/.gitignore index 2bd7bf95..bbd82d81 100644 --- a/.gitignore +++ b/.gitignore @@ -6,4 +6,6 @@ obj/ pluralkit.conf pluralkit.*.conf -logs/ \ No newline at end of file +logs/ + +*.DotSettings.user \ No newline at end of file From 74e0508065e4db09f93c34c103ff565547fc7bc7 Mon Sep 17 00:00:00 2001 From: Ske Date: Wed, 14 Aug 2019 07:16:48 +0200 Subject: [PATCH 33/51] Increase webhook name limit to 80 --- PluralKit.Bot/Bot.cs | 13 +- PluralKit.Bot/Commands/SystemCommands.cs | 2 +- PluralKit.Bot/Errors.cs | 2 + PluralKit.Bot/Services/ProxyService.cs | 14 +- PluralKit.Core/Limits.cs | 9 +- PluralKit.Core/Models.cs | 4 +- PluralKit.Core/Stores.cs | 889 ++++++++++++----------- 7 files changed, 476 insertions(+), 457 deletions(-) diff --git a/PluralKit.Bot/Bot.cs b/PluralKit.Bot/Bot.cs index 67f58d4a..81e7cf34 100644 --- a/PluralKit.Bot/Bot.cs +++ b/PluralKit.Bot/Bot.cs @@ -134,18 +134,16 @@ namespace PluralKit.Bot private IServiceProvider _services; private DiscordShardedClient _client; private CommandService _commands; - private ProxyService _proxy; private Timer _updateTimer; private IMetrics _metrics; private PeriodicStatCollector _collector; private ILogger _logger; - public Bot(IServiceProvider services, IDiscordClient client, CommandService commands, ProxyService proxy, IMetrics metrics, PeriodicStatCollector collector, ILogger logger) + public Bot(IServiceProvider services, IDiscordClient client, CommandService commands, IMetrics metrics, PeriodicStatCollector collector, ILogger logger) { _services = services; _client = client as DiscordShardedClient; _commands = commands; - _proxy = proxy; _metrics = metrics; _collector = collector; _logger = logger.ForContext(); @@ -367,7 +365,14 @@ namespace PluralKit.Bot else { // If not, try proxying anyway - await _proxy.HandleMessageAsync(arg); + try + { + await _proxy.HandleMessageAsync(arg); + } + catch (PKError e) + { + await msg.Channel.SendMessageAsync($"{Emojis.Error} {e.Message}"); + } } } diff --git a/PluralKit.Bot/Commands/SystemCommands.cs b/PluralKit.Bot/Commands/SystemCommands.cs index 8d8ee585..8c3ddcf8 100644 --- a/PluralKit.Bot/Commands/SystemCommands.cs +++ b/PluralKit.Bot/Commands/SystemCommands.cs @@ -89,7 +89,7 @@ namespace PluralKit.Bot.Commands if (unproxyableMembers.Count > 0) { var msg = await Context.Channel.SendMessageAsync( - $"{Emojis.Warn} Changing your system tag to '{newTag}' will result in the following members being unproxyable, since the tag would bring their name over 32 characters:\n**{string.Join(", ", unproxyableMembers.Select((m) => m.Name))}**\nDo you want to continue anyway?"); + $"{Emojis.Warn} Changing your system tag to '{newTag}' will result in the following members being unproxyable, since the tag would bring their name over {Limits.MaxProxyNameLength} characters:\n**{string.Join(", ", unproxyableMembers.Select((m) => m.Name))}**\nDo you want to continue anyway?"); if (!await Context.PromptYesNo(msg)) throw new PKError("Tag change cancelled."); } } diff --git a/PluralKit.Bot/Errors.cs b/PluralKit.Bot/Errors.cs index 80531ce0..ee109805 100644 --- a/PluralKit.Bot/Errors.cs +++ b/PluralKit.Bot/Errors.cs @@ -76,5 +76,7 @@ namespace PluralKit.Bot { public static PKError DisplayNameTooLong(string displayName, int maxLength) => new PKError( $"Display name too long ({displayName.Length} > {maxLength} characters). Use a shorter display name, or shorten your system tag."); + public static PKError ProxyNameTooShort(string name) => new PKError($"The webhook's name, `{name}`, is shorter than two characters, and thus cannot be proxied. Please change the member name or use a longer system tag."); + public static PKError ProxyNameTooLong(string name) => new PKError($"The webhook's name, `{name}`, is too long ({name.Length} > {Limits.MaxProxyNameLength} characters), and thus cannot be proxied. Please change the member name or use a shorter system tag."); } } \ No newline at end of file diff --git a/PluralKit.Bot/Services/ProxyService.cs b/PluralKit.Bot/Services/ProxyService.cs index ca7dd7e0..ff5fe951 100644 --- a/PluralKit.Bot/Services/ProxyService.cs +++ b/PluralKit.Bot/Services/ProxyService.cs @@ -2,15 +2,14 @@ using System; using System.Collections.Generic; using System.Linq; using System.Net.Http; -using System.Text.RegularExpressions; using System.Threading.Tasks; -using App.Metrics; -using Dapper; + using Discord; using Discord.Net; -using Discord.Webhook; using Discord.WebSocket; -using Microsoft.Extensions.Caching.Memory; + +using PluralKit.Core; + using Serilog; namespace PluralKit.Bot @@ -100,6 +99,10 @@ namespace PluralKit.Bot var proxyName = match.Member.ProxyName(match.System.Tag); var avatarUrl = match.Member.AvatarUrl ?? match.System.AvatarUrl; + // If the name's too long (or short), bail + if (proxyName.Length < 2) throw Errors.ProxyNameTooShort(proxyName); + if (proxyName.Length > Limits.MaxProxyNameLength) throw Errors.ProxyNameTooLong(proxyName); + // Sanitize @everyone, but only if the original user wouldn't have permission to var messageContents = SanitizeEveryoneMaybe(message, match.InnerText); @@ -143,6 +146,7 @@ namespace PluralKit.Bot if (!permissions.ManageWebhooks) { + // todo: PKError-ify these await channel.SendMessageAsync( $"{Emojis.Error} PluralKit does not have the *Manage Webhooks* permission in this channel, and thus cannot proxy messages. Please contact a server administrator to remedy this."); return false; diff --git a/PluralKit.Core/Limits.cs b/PluralKit.Core/Limits.cs index 37f56ea7..8ced1346 100644 --- a/PluralKit.Core/Limits.cs +++ b/PluralKit.Core/Limits.cs @@ -1,9 +1,12 @@ namespace PluralKit.Core { - public static class Limits { + public static class Limits + { + public static readonly int MaxProxyNameLength = 80; + public static readonly int MaxSystemNameLength = 100; - public static readonly int MaxSystemTagLength = 31; + public static readonly int MaxSystemTagLength = MaxProxyNameLength - 1; public static readonly int MaxDescriptionLength = 1000; - public static readonly int MaxMemberNameLength = 50; + public static readonly int MaxMemberNameLength = 100; // Fair bit larger than MaxProxyNameLength for bookkeeping public static readonly int MaxPronounsLength = 100; public static readonly long AvatarFileSizeLimit = 1024 * 1024; diff --git a/PluralKit.Core/Models.cs b/PluralKit.Core/Models.cs index 64295058..eada5940 100644 --- a/PluralKit.Core/Models.cs +++ b/PluralKit.Core/Models.cs @@ -3,6 +3,8 @@ using Newtonsoft.Json; using NodaTime; using NodaTime.Text; +using PluralKit.Core; + namespace PluralKit { public class PKSystem @@ -18,7 +20,7 @@ namespace PluralKit [JsonProperty("created")] public Instant Created { get; set; } [JsonProperty("tz")] public string UiTz { get; set; } - [JsonIgnore] public int MaxMemberNameLength => Tag != null ? 32 - Tag.Length - 1 : 32; + [JsonIgnore] public int MaxMemberNameLength => Tag != null ? Limits.MaxProxyNameLength - Tag.Length - 1 : Limits.MaxProxyNameLength; [JsonIgnore] public DateTimeZone Zone => DateTimeZoneProviders.Tzdb.GetZoneOrNull(UiTz); } diff --git a/PluralKit.Core/Stores.cs b/PluralKit.Core/Stores.cs index ba4d32c9..293d6de4 100644 --- a/PluralKit.Core/Stores.cs +++ b/PluralKit.Core/Stores.cs @@ -1,444 +1,447 @@ -using System.Collections.Generic; -using System.Linq; -using System.Threading.Tasks; -using App.Metrics.Logging; -using Dapper; -using NodaTime; -using Serilog; - -namespace PluralKit { - public class SystemStore { - private DbConnectionFactory _conn; - private ILogger _logger; - - public SystemStore(DbConnectionFactory conn, ILogger logger) - { - this._conn = conn; - _logger = logger.ForContext(); - } - - public async Task Create(string systemName = null) { - string hid; - do - { - hid = Utils.GenerateHid(); - } while (await GetByHid(hid) != null); - - PKSystem system; - using (var conn = await _conn.Obtain()) - system = await conn.QuerySingleAsync("insert into systems (hid, name) values (@Hid, @Name) returning *", new { Hid = hid, Name = systemName }); - - _logger.Information("Created system {System}", system.Id); - return system; - } - - public async Task Link(PKSystem system, ulong accountId) { - // We have "on conflict do nothing" since linking an account when it's already linked to the same system is idempotent - // This is used in import/export, although the pk;link command checks for this case beforehand - using (var conn = await _conn.Obtain()) - await conn.ExecuteAsync("insert into accounts (uid, system) values (@Id, @SystemId) on conflict do nothing", new { Id = accountId, SystemId = system.Id }); - - _logger.Information("Linked system {System} to account {Account}", system.Id, accountId); - } - - public async Task Unlink(PKSystem system, ulong accountId) { - using (var conn = await _conn.Obtain()) - await conn.ExecuteAsync("delete from accounts where uid = @Id and system = @SystemId", new { Id = accountId, SystemId = system.Id }); - - _logger.Information("Unlinked system {System} from account {Account}", system.Id, accountId); - } - - public async Task GetByAccount(ulong accountId) { - using (var conn = await _conn.Obtain()) - return await conn.QuerySingleOrDefaultAsync("select systems.* from systems, accounts where accounts.system = systems.id and accounts.uid = @Id", new { Id = accountId }); - } - - public async Task GetByHid(string hid) { - using (var conn = await _conn.Obtain()) - return await conn.QuerySingleOrDefaultAsync("select * from systems where systems.hid = @Hid", new { Hid = hid.ToLower() }); - } - - public async Task GetByToken(string token) { - using (var conn = await _conn.Obtain()) - return await conn.QuerySingleOrDefaultAsync("select * from systems where token = @Token", new { Token = token }); - } - - public async Task GetById(int id) - { - using (var conn = await _conn.Obtain()) - return await conn.QuerySingleOrDefaultAsync("select * from systems where id = @Id", new { Id = id }); - } - - public async Task Save(PKSystem system) { - using (var conn = await _conn.Obtain()) - await conn.ExecuteAsync("update systems set name = @Name, description = @Description, tag = @Tag, avatar_url = @AvatarUrl, token = @Token, ui_tz = @UiTz where id = @Id", system); - - _logger.Information("Updated system {@System}", system); - } - - public async Task Delete(PKSystem system) { - using (var conn = await _conn.Obtain()) - await conn.ExecuteAsync("delete from systems where id = @Id", system); - _logger.Information("Deleted system {System}", system.Id); - } - - public async Task> GetLinkedAccountIds(PKSystem system) - { - using (var conn = await _conn.Obtain()) - return await conn.QueryAsync("select uid from accounts where system = @Id", new { Id = system.Id }); - } - - public async Task Count() - { - using (var conn = await _conn.Obtain()) - return await conn.ExecuteScalarAsync("select count(id) from systems"); - } - } - - public class MemberStore { - private DbConnectionFactory _conn; - private ILogger _logger; - - public MemberStore(DbConnectionFactory conn, ILogger logger) - { - this._conn = conn; - _logger = logger.ForContext(); - } - - public async Task Create(PKSystem system, string name) { - string hid; - do - { - hid = Utils.GenerateHid(); - } while (await GetByHid(hid) != null); - - PKMember member; - using (var conn = await _conn.Obtain()) - member = await conn.QuerySingleAsync("insert into members (hid, system, name) values (@Hid, @SystemId, @Name) returning *", new { - Hid = hid, - SystemID = system.Id, - Name = name - }); - - _logger.Information("Created member {Member}", member.Id); - return member; - } - - public async Task GetByHid(string hid) { - using (var conn = await _conn.Obtain()) - return await conn.QuerySingleOrDefaultAsync("select * from members where hid = @Hid", new { Hid = hid.ToLower() }); - } - - public async Task GetByName(PKSystem system, string name) { - // QueryFirst, since members can (in rare cases) share names - using (var conn = await _conn.Obtain()) - return await conn.QueryFirstOrDefaultAsync("select * from members where lower(name) = lower(@Name) and system = @SystemID", new { Name = name, SystemID = system.Id }); - } - - public async Task> GetUnproxyableMembers(PKSystem system) { - return (await GetBySystem(system)) - .Where((m) => { - var proxiedName = $"{m.Name} {system.Tag}"; - return proxiedName.Length > 32 || proxiedName.Length < 2; - }).ToList(); - } - - public async Task> GetBySystem(PKSystem system) { - using (var conn = await _conn.Obtain()) - return await conn.QueryAsync("select * from members where system = @SystemID", new { SystemID = system.Id }); - } - - public async Task Save(PKMember member) { - using (var conn = await _conn.Obtain()) - await conn.ExecuteAsync("update members set name = @Name, display_name = @DisplayName, description = @Description, color = @Color, avatar_url = @AvatarUrl, birthday = @Birthday, pronouns = @Pronouns, prefix = @Prefix, suffix = @Suffix where id = @Id", member); - - _logger.Information("Updated member {@Member}", member); - } - - public async Task Delete(PKMember member) { - using (var conn = await _conn.Obtain()) - await conn.ExecuteAsync("delete from members where id = @Id", member); - - _logger.Information("Deleted member {@Member}", member); - } - - public async Task MessageCount(PKMember member) - { - using (var conn = await _conn.Obtain()) - return await conn.QuerySingleAsync("select count(*) from messages where member = @Id", member); - } - - public async Task MemberCount(PKSystem system) - { - using (var conn = await _conn.Obtain()) - return await conn.ExecuteScalarAsync("select count(*) from members where system = @Id", system); - } - - public async Task Count() - { - using (var conn = await _conn.Obtain()) - return await conn.ExecuteScalarAsync("select count(id) from members"); - } - } - - public class MessageStore { - public struct PKMessage - { - public ulong Mid; - public ulong Channel; - public ulong Sender; - public ulong? OriginalMid; - } - public class StoredMessage - { - public PKMessage Message; - public PKMember Member; - public PKSystem System; - } - - private DbConnectionFactory _conn; - private ILogger _logger; - - public MessageStore(DbConnectionFactory conn, ILogger logger) - { - this._conn = conn; - _logger = logger.ForContext(); - } - - public async Task Store(ulong senderId, ulong messageId, ulong channelId, ulong originalMessage, PKMember member) { - using (var conn = await _conn.Obtain()) - await conn.ExecuteAsync("insert into messages(mid, channel, member, sender, original_mid) values(@MessageId, @ChannelId, @MemberId, @SenderId, @OriginalMid)", new { - MessageId = messageId, - ChannelId = channelId, - MemberId = member.Id, - SenderId = senderId, - OriginalMid = originalMessage - }); - - _logger.Information("Stored message {Message} in channel {Channel}", messageId, channelId); - } - - public async Task Get(ulong id) - { - using (var conn = await _conn.Obtain()) - return (await conn.QueryAsync("select messages.*, members.*, systems.* from messages, members, systems where (mid = @Id or original_mid = @Id) and messages.member = members.id and systems.id = members.system", (msg, member, system) => new StoredMessage - { - Message = msg, - System = system, - Member = member - }, new { Id = id })).FirstOrDefault(); - } - - public async Task Delete(ulong id) { - using (var conn = await _conn.Obtain()) - if (await conn.ExecuteAsync("delete from messages where mid = @Id", new { Id = id }) > 0) - _logger.Information("Deleted message {Message}", id); - } - - public async Task BulkDelete(IReadOnlyCollection ids) - { - using (var conn = await _conn.Obtain()) - { - // Npgsql doesn't support ulongs in general - we hacked around it for plain ulongs but tbh not worth it for collections of ulong - // Hence we map them to single longs, which *are* supported (this is ok since they're Technically (tm) stored as signed longs in the db anyway) - var foundCount = await conn.ExecuteAsync("delete from messages where mid = any(@Ids)", new {Ids = ids.Select(id => (long) id).ToArray()}); - if (foundCount > 0) - _logger.Information("Bulk deleted messages {Messages}, {FoundCount} found", ids, foundCount); - } - } - - public async Task Count() - { - using (var conn = await _conn.Obtain()) - return await conn.ExecuteScalarAsync("select count(mid) from messages"); - } - } - - public class SwitchStore - { - private DbConnectionFactory _conn; - private ILogger _logger; - - public SwitchStore(DbConnectionFactory conn, ILogger logger) - { - _conn = conn; - _logger = logger.ForContext(); - } - - public async Task RegisterSwitch(PKSystem system, ICollection members) - { - // Use a transaction here since we're doing multiple executed commands in one - using (var conn = await _conn.Obtain()) - using (var tx = conn.BeginTransaction()) - { - // First, we insert the switch itself - var sw = await conn.QuerySingleAsync("insert into switches(system) values (@System) returning *", - new {System = system.Id}); - - // Then we insert each member in the switch in the switch_members table - // TODO: can we parallelize this or send it in bulk somehow? - foreach (var member in members) - { - await conn.ExecuteAsync( - "insert into switch_members(switch, member) values(@Switch, @Member)", - new {Switch = sw.Id, Member = member.Id}); - } - - // Finally we commit the tx, since the using block will otherwise rollback it - tx.Commit(); - - _logger.Information("Registered switch {Switch} in system {System} with members {@Members}", sw.Id, system.Id, members.Select(m => m.Id)); - } - } - - public async Task> GetSwitches(PKSystem system, int count = 9999999) - { - // TODO: refactor the PKSwitch data structure to somehow include a hydrated member list - // (maybe when we get caching in?) - using (var conn = await _conn.Obtain()) - return await conn.QueryAsync("select * from switches where system = @System order by timestamp desc limit @Count", new {System = system.Id, Count = count}); - } - - public async Task> GetSwitchMemberIds(PKSwitch sw) - { - using (var conn = await _conn.Obtain()) - return await conn.QueryAsync("select member from switch_members where switch = @Switch order by switch_members.id", - new {Switch = sw.Id}); - } - - public async Task> GetSwitchMembers(PKSwitch sw) - { - using (var conn = await _conn.Obtain()) - return await conn.QueryAsync( - "select * from switch_members, members where switch_members.member = members.id and switch_members.switch = @Switch order by switch_members.id", - new {Switch = sw.Id}); - } - - public async Task GetLatestSwitch(PKSystem system) => (await GetSwitches(system, 1)).FirstOrDefault(); - - public async Task MoveSwitch(PKSwitch sw, Instant time) - { - using (var conn = await _conn.Obtain()) - await conn.ExecuteAsync("update switches set timestamp = @Time where id = @Id", - new {Time = time, Id = sw.Id}); - - _logger.Information("Moved switch {Switch} to {Time}", sw.Id, time); - } - - public async Task DeleteSwitch(PKSwitch sw) - { - using (var conn = await _conn.Obtain()) - await conn.ExecuteAsync("delete from switches where id = @Id", new {Id = sw.Id}); - - _logger.Information("Deleted switch {Switch}"); - } - - public async Task Count() - { - using (var conn = await _conn.Obtain()) - return await conn.ExecuteScalarAsync("select count(id) from switches"); - } - - public struct SwitchListEntry - { - public ICollection Members; - public Instant TimespanStart; - public Instant TimespanEnd; - } - - public async Task> GetTruncatedSwitchList(PKSystem system, Instant periodStart, Instant periodEnd) - { - // TODO: only fetch the necessary switches here - // todo: this is in general not very efficient LOL - // returns switches in chronological (newest first) order - var switches = await GetSwitches(system); - - // we skip all switches that happened later than the range end, and taking all the ones that happened after the range start - // *BUT ALSO INCLUDING* the last switch *before* the range (that partially overlaps the range period) - var switchesInRange = switches.SkipWhile(sw => sw.Timestamp >= periodEnd).TakeWhileIncluding(sw => sw.Timestamp > periodStart).ToList(); - - // query DB for all members involved in any of the switches above and collect into a dictionary for future use - // this makes sure the return list has the same instances of PKMember throughout, which is important for the dictionary - // key used in GetPerMemberSwitchDuration below - Dictionary memberObjects; - using (var conn = await _conn.Obtain()) - { - memberObjects = (await conn.QueryAsync( - "select distinct members.* from members, switch_members where switch_members.switch = any(@Switches) and switch_members.member = members.id", // lol postgres specific `= any()` syntax - new {Switches = switchesInRange.Select(sw => sw.Id).ToList()})) - .ToDictionary(m => m.Id); - } - - - // we create the entry objects - var outList = new List(); - - // loop through every switch that *occurred* in-range and add it to the list - // end time is the switch *after*'s timestamp - we cheat and start it out at the range end so the first switch in-range "ends" there instead of the one after's start point - var endTime = periodEnd; - foreach (var switchInRange in switchesInRange) - { - // find the start time of the switch, but clamp it to the range (only applicable to the Last Switch Before Range we include in the TakeWhileIncluding call above) - var switchStartClamped = switchInRange.Timestamp; - if (switchStartClamped < periodStart) switchStartClamped = periodStart; - - outList.Add(new SwitchListEntry - { - Members = (await GetSwitchMemberIds(switchInRange)).Select(id => memberObjects[id]).ToList(), - TimespanStart = switchStartClamped, - TimespanEnd = endTime - }); - - // next switch's end is this switch's start - endTime = switchInRange.Timestamp; - } - - return outList; - } - - public struct PerMemberSwitchDuration - { - public Dictionary MemberSwitchDurations; - public Duration NoFronterDuration; - public Instant RangeStart; - public Instant RangeEnd; - } - - public async Task GetPerMemberSwitchDuration(PKSystem system, Instant periodStart, - Instant periodEnd) - { - var dict = new Dictionary(); - - var noFronterDuration = Duration.Zero; - - // Sum up all switch durations for each member - // switches with multiple members will result in the duration to add up to more than the actual period range - - var actualStart = periodEnd; // will be "pulled" down - var actualEnd = periodStart; // will be "pulled" up - - foreach (var sw in await GetTruncatedSwitchList(system, periodStart, periodEnd)) - { - var span = sw.TimespanEnd - sw.TimespanStart; - foreach (var member in sw.Members) - { - if (!dict.ContainsKey(member)) dict.Add(member, span); - else dict[member] += span; - } - - if (sw.Members.Count == 0) noFronterDuration += span; - - if (sw.TimespanStart < actualStart) actualStart = sw.TimespanStart; - if (sw.TimespanEnd > actualEnd) actualEnd = sw.TimespanEnd; - } - - return new PerMemberSwitchDuration - { - MemberSwitchDurations = dict, - NoFronterDuration = noFronterDuration, - RangeStart = actualStart, - RangeEnd = actualEnd - }; - } - } +using System.Collections.Generic; +using System.Linq; +using System.Threading.Tasks; +using App.Metrics.Logging; +using Dapper; +using NodaTime; + +using PluralKit.Core; + +using Serilog; + +namespace PluralKit { + public class SystemStore { + private DbConnectionFactory _conn; + private ILogger _logger; + + public SystemStore(DbConnectionFactory conn, ILogger logger) + { + this._conn = conn; + _logger = logger.ForContext(); + } + + public async Task Create(string systemName = null) { + string hid; + do + { + hid = Utils.GenerateHid(); + } while (await GetByHid(hid) != null); + + PKSystem system; + using (var conn = await _conn.Obtain()) + system = await conn.QuerySingleAsync("insert into systems (hid, name) values (@Hid, @Name) returning *", new { Hid = hid, Name = systemName }); + + _logger.Information("Created system {System}", system.Id); + return system; + } + + public async Task Link(PKSystem system, ulong accountId) { + // We have "on conflict do nothing" since linking an account when it's already linked to the same system is idempotent + // This is used in import/export, although the pk;link command checks for this case beforehand + using (var conn = await _conn.Obtain()) + await conn.ExecuteAsync("insert into accounts (uid, system) values (@Id, @SystemId) on conflict do nothing", new { Id = accountId, SystemId = system.Id }); + + _logger.Information("Linked system {System} to account {Account}", system.Id, accountId); + } + + public async Task Unlink(PKSystem system, ulong accountId) { + using (var conn = await _conn.Obtain()) + await conn.ExecuteAsync("delete from accounts where uid = @Id and system = @SystemId", new { Id = accountId, SystemId = system.Id }); + + _logger.Information("Unlinked system {System} from account {Account}", system.Id, accountId); + } + + public async Task GetByAccount(ulong accountId) { + using (var conn = await _conn.Obtain()) + return await conn.QuerySingleOrDefaultAsync("select systems.* from systems, accounts where accounts.system = systems.id and accounts.uid = @Id", new { Id = accountId }); + } + + public async Task GetByHid(string hid) { + using (var conn = await _conn.Obtain()) + return await conn.QuerySingleOrDefaultAsync("select * from systems where systems.hid = @Hid", new { Hid = hid.ToLower() }); + } + + public async Task GetByToken(string token) { + using (var conn = await _conn.Obtain()) + return await conn.QuerySingleOrDefaultAsync("select * from systems where token = @Token", new { Token = token }); + } + + public async Task GetById(int id) + { + using (var conn = await _conn.Obtain()) + return await conn.QuerySingleOrDefaultAsync("select * from systems where id = @Id", new { Id = id }); + } + + public async Task Save(PKSystem system) { + using (var conn = await _conn.Obtain()) + await conn.ExecuteAsync("update systems set name = @Name, description = @Description, tag = @Tag, avatar_url = @AvatarUrl, token = @Token, ui_tz = @UiTz where id = @Id", system); + + _logger.Information("Updated system {@System}", system); + } + + public async Task Delete(PKSystem system) { + using (var conn = await _conn.Obtain()) + await conn.ExecuteAsync("delete from systems where id = @Id", system); + _logger.Information("Deleted system {System}", system.Id); + } + + public async Task> GetLinkedAccountIds(PKSystem system) + { + using (var conn = await _conn.Obtain()) + return await conn.QueryAsync("select uid from accounts where system = @Id", new { Id = system.Id }); + } + + public async Task Count() + { + using (var conn = await _conn.Obtain()) + return await conn.ExecuteScalarAsync("select count(id) from systems"); + } + } + + public class MemberStore { + private DbConnectionFactory _conn; + private ILogger _logger; + + public MemberStore(DbConnectionFactory conn, ILogger logger) + { + this._conn = conn; + _logger = logger.ForContext(); + } + + public async Task Create(PKSystem system, string name) { + string hid; + do + { + hid = Utils.GenerateHid(); + } while (await GetByHid(hid) != null); + + PKMember member; + using (var conn = await _conn.Obtain()) + member = await conn.QuerySingleAsync("insert into members (hid, system, name) values (@Hid, @SystemId, @Name) returning *", new { + Hid = hid, + SystemID = system.Id, + Name = name + }); + + _logger.Information("Created member {Member}", member.Id); + return member; + } + + public async Task GetByHid(string hid) { + using (var conn = await _conn.Obtain()) + return await conn.QuerySingleOrDefaultAsync("select * from members where hid = @Hid", new { Hid = hid.ToLower() }); + } + + public async Task GetByName(PKSystem system, string name) { + // QueryFirst, since members can (in rare cases) share names + using (var conn = await _conn.Obtain()) + return await conn.QueryFirstOrDefaultAsync("select * from members where lower(name) = lower(@Name) and system = @SystemID", new { Name = name, SystemID = system.Id }); + } + + public async Task> GetUnproxyableMembers(PKSystem system) { + return (await GetBySystem(system)) + .Where((m) => { + var proxiedName = $"{m.Name} {system.Tag}"; + return proxiedName.Length > Limits.MaxProxyNameLength || proxiedName.Length < 2; + }).ToList(); + } + + public async Task> GetBySystem(PKSystem system) { + using (var conn = await _conn.Obtain()) + return await conn.QueryAsync("select * from members where system = @SystemID", new { SystemID = system.Id }); + } + + public async Task Save(PKMember member) { + using (var conn = await _conn.Obtain()) + await conn.ExecuteAsync("update members set name = @Name, display_name = @DisplayName, description = @Description, color = @Color, avatar_url = @AvatarUrl, birthday = @Birthday, pronouns = @Pronouns, prefix = @Prefix, suffix = @Suffix where id = @Id", member); + + _logger.Information("Updated member {@Member}", member); + } + + public async Task Delete(PKMember member) { + using (var conn = await _conn.Obtain()) + await conn.ExecuteAsync("delete from members where id = @Id", member); + + _logger.Information("Deleted member {@Member}", member); + } + + public async Task MessageCount(PKMember member) + { + using (var conn = await _conn.Obtain()) + return await conn.QuerySingleAsync("select count(*) from messages where member = @Id", member); + } + + public async Task MemberCount(PKSystem system) + { + using (var conn = await _conn.Obtain()) + return await conn.ExecuteScalarAsync("select count(*) from members where system = @Id", system); + } + + public async Task Count() + { + using (var conn = await _conn.Obtain()) + return await conn.ExecuteScalarAsync("select count(id) from members"); + } + } + + public class MessageStore { + public struct PKMessage + { + public ulong Mid; + public ulong Channel; + public ulong Sender; + public ulong? OriginalMid; + } + public class StoredMessage + { + public PKMessage Message; + public PKMember Member; + public PKSystem System; + } + + private DbConnectionFactory _conn; + private ILogger _logger; + + public MessageStore(DbConnectionFactory conn, ILogger logger) + { + this._conn = conn; + _logger = logger.ForContext(); + } + + public async Task Store(ulong senderId, ulong messageId, ulong channelId, ulong originalMessage, PKMember member) { + using (var conn = await _conn.Obtain()) + await conn.ExecuteAsync("insert into messages(mid, channel, member, sender, original_mid) values(@MessageId, @ChannelId, @MemberId, @SenderId, @OriginalMid)", new { + MessageId = messageId, + ChannelId = channelId, + MemberId = member.Id, + SenderId = senderId, + OriginalMid = originalMessage + }); + + _logger.Information("Stored message {Message} in channel {Channel}", messageId, channelId); + } + + public async Task Get(ulong id) + { + using (var conn = await _conn.Obtain()) + return (await conn.QueryAsync("select messages.*, members.*, systems.* from messages, members, systems where (mid = @Id or original_mid = @Id) and messages.member = members.id and systems.id = members.system", (msg, member, system) => new StoredMessage + { + Message = msg, + System = system, + Member = member + }, new { Id = id })).FirstOrDefault(); + } + + public async Task Delete(ulong id) { + using (var conn = await _conn.Obtain()) + if (await conn.ExecuteAsync("delete from messages where mid = @Id", new { Id = id }) > 0) + _logger.Information("Deleted message {Message}", id); + } + + public async Task BulkDelete(IReadOnlyCollection ids) + { + using (var conn = await _conn.Obtain()) + { + // Npgsql doesn't support ulongs in general - we hacked around it for plain ulongs but tbh not worth it for collections of ulong + // Hence we map them to single longs, which *are* supported (this is ok since they're Technically (tm) stored as signed longs in the db anyway) + var foundCount = await conn.ExecuteAsync("delete from messages where mid = any(@Ids)", new {Ids = ids.Select(id => (long) id).ToArray()}); + if (foundCount > 0) + _logger.Information("Bulk deleted messages {Messages}, {FoundCount} found", ids, foundCount); + } + } + + public async Task Count() + { + using (var conn = await _conn.Obtain()) + return await conn.ExecuteScalarAsync("select count(mid) from messages"); + } + } + + public class SwitchStore + { + private DbConnectionFactory _conn; + private ILogger _logger; + + public SwitchStore(DbConnectionFactory conn, ILogger logger) + { + _conn = conn; + _logger = logger.ForContext(); + } + + public async Task RegisterSwitch(PKSystem system, ICollection members) + { + // Use a transaction here since we're doing multiple executed commands in one + using (var conn = await _conn.Obtain()) + using (var tx = conn.BeginTransaction()) + { + // First, we insert the switch itself + var sw = await conn.QuerySingleAsync("insert into switches(system) values (@System) returning *", + new {System = system.Id}); + + // Then we insert each member in the switch in the switch_members table + // TODO: can we parallelize this or send it in bulk somehow? + foreach (var member in members) + { + await conn.ExecuteAsync( + "insert into switch_members(switch, member) values(@Switch, @Member)", + new {Switch = sw.Id, Member = member.Id}); + } + + // Finally we commit the tx, since the using block will otherwise rollback it + tx.Commit(); + + _logger.Information("Registered switch {Switch} in system {System} with members {@Members}", sw.Id, system.Id, members.Select(m => m.Id)); + } + } + + public async Task> GetSwitches(PKSystem system, int count = 9999999) + { + // TODO: refactor the PKSwitch data structure to somehow include a hydrated member list + // (maybe when we get caching in?) + using (var conn = await _conn.Obtain()) + return await conn.QueryAsync("select * from switches where system = @System order by timestamp desc limit @Count", new {System = system.Id, Count = count}); + } + + public async Task> GetSwitchMemberIds(PKSwitch sw) + { + using (var conn = await _conn.Obtain()) + return await conn.QueryAsync("select member from switch_members where switch = @Switch order by switch_members.id", + new {Switch = sw.Id}); + } + + public async Task> GetSwitchMembers(PKSwitch sw) + { + using (var conn = await _conn.Obtain()) + return await conn.QueryAsync( + "select * from switch_members, members where switch_members.member = members.id and switch_members.switch = @Switch order by switch_members.id", + new {Switch = sw.Id}); + } + + public async Task GetLatestSwitch(PKSystem system) => (await GetSwitches(system, 1)).FirstOrDefault(); + + public async Task MoveSwitch(PKSwitch sw, Instant time) + { + using (var conn = await _conn.Obtain()) + await conn.ExecuteAsync("update switches set timestamp = @Time where id = @Id", + new {Time = time, Id = sw.Id}); + + _logger.Information("Moved switch {Switch} to {Time}", sw.Id, time); + } + + public async Task DeleteSwitch(PKSwitch sw) + { + using (var conn = await _conn.Obtain()) + await conn.ExecuteAsync("delete from switches where id = @Id", new {Id = sw.Id}); + + _logger.Information("Deleted switch {Switch}"); + } + + public async Task Count() + { + using (var conn = await _conn.Obtain()) + return await conn.ExecuteScalarAsync("select count(id) from switches"); + } + + public struct SwitchListEntry + { + public ICollection Members; + public Instant TimespanStart; + public Instant TimespanEnd; + } + + public async Task> GetTruncatedSwitchList(PKSystem system, Instant periodStart, Instant periodEnd) + { + // TODO: only fetch the necessary switches here + // todo: this is in general not very efficient LOL + // returns switches in chronological (newest first) order + var switches = await GetSwitches(system); + + // we skip all switches that happened later than the range end, and taking all the ones that happened after the range start + // *BUT ALSO INCLUDING* the last switch *before* the range (that partially overlaps the range period) + var switchesInRange = switches.SkipWhile(sw => sw.Timestamp >= periodEnd).TakeWhileIncluding(sw => sw.Timestamp > periodStart).ToList(); + + // query DB for all members involved in any of the switches above and collect into a dictionary for future use + // this makes sure the return list has the same instances of PKMember throughout, which is important for the dictionary + // key used in GetPerMemberSwitchDuration below + Dictionary memberObjects; + using (var conn = await _conn.Obtain()) + { + memberObjects = (await conn.QueryAsync( + "select distinct members.* from members, switch_members where switch_members.switch = any(@Switches) and switch_members.member = members.id", // lol postgres specific `= any()` syntax + new {Switches = switchesInRange.Select(sw => sw.Id).ToList()})) + .ToDictionary(m => m.Id); + } + + + // we create the entry objects + var outList = new List(); + + // loop through every switch that *occurred* in-range and add it to the list + // end time is the switch *after*'s timestamp - we cheat and start it out at the range end so the first switch in-range "ends" there instead of the one after's start point + var endTime = periodEnd; + foreach (var switchInRange in switchesInRange) + { + // find the start time of the switch, but clamp it to the range (only applicable to the Last Switch Before Range we include in the TakeWhileIncluding call above) + var switchStartClamped = switchInRange.Timestamp; + if (switchStartClamped < periodStart) switchStartClamped = periodStart; + + outList.Add(new SwitchListEntry + { + Members = (await GetSwitchMemberIds(switchInRange)).Select(id => memberObjects[id]).ToList(), + TimespanStart = switchStartClamped, + TimespanEnd = endTime + }); + + // next switch's end is this switch's start + endTime = switchInRange.Timestamp; + } + + return outList; + } + + public struct PerMemberSwitchDuration + { + public Dictionary MemberSwitchDurations; + public Duration NoFronterDuration; + public Instant RangeStart; + public Instant RangeEnd; + } + + public async Task GetPerMemberSwitchDuration(PKSystem system, Instant periodStart, + Instant periodEnd) + { + var dict = new Dictionary(); + + var noFronterDuration = Duration.Zero; + + // Sum up all switch durations for each member + // switches with multiple members will result in the duration to add up to more than the actual period range + + var actualStart = periodEnd; // will be "pulled" down + var actualEnd = periodStart; // will be "pulled" up + + foreach (var sw in await GetTruncatedSwitchList(system, periodStart, periodEnd)) + { + var span = sw.TimespanEnd - sw.TimespanStart; + foreach (var member in sw.Members) + { + if (!dict.ContainsKey(member)) dict.Add(member, span); + else dict[member] += span; + } + + if (sw.Members.Count == 0) noFronterDuration += span; + + if (sw.TimespanStart < actualStart) actualStart = sw.TimespanStart; + if (sw.TimespanEnd > actualEnd) actualEnd = sw.TimespanEnd; + } + + return new PerMemberSwitchDuration + { + MemberSwitchDurations = dict, + NoFronterDuration = noFronterDuration, + RangeStart = actualStart, + RangeEnd = actualEnd + }; + } + } } \ No newline at end of file From 9b0b8b43531b9efa2b45a5a4b1ca7df43c44db51 Mon Sep 17 00:00:00 2001 From: Ske Date: Wed, 14 Aug 2019 07:21:03 +0200 Subject: [PATCH 34/51] Fix Clyde, also without an attachment --- PluralKit.Bot/Services/WebhookExecutorService.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/PluralKit.Bot/Services/WebhookExecutorService.cs b/PluralKit.Bot/Services/WebhookExecutorService.cs index f8b17468..1f35f14a 100644 --- a/PluralKit.Bot/Services/WebhookExecutorService.cs +++ b/PluralKit.Bot/Services/WebhookExecutorService.cs @@ -61,7 +61,7 @@ namespace PluralKit.Bot avatarUrl: avatarUrl); // Otherwise, send normally - return await client.SendMessageAsync(content, username: name, avatarUrl: avatarUrl); + return await client.SendMessageAsync(content, username: FixClyde(name), avatarUrl: avatarUrl); } catch (HttpException e) { From dbade9b6bc5505ad96e1961bafb3179ebd452710 Mon Sep 17 00:00:00 2001 From: Ske Date: Sat, 31 Aug 2019 12:32:28 +0200 Subject: [PATCH 35/51] Various minor site/documentation changes --- README.md | 11 +++++++++++ docs/1-user-guide.md | 1 + docs/2-command-list.md | 3 ++- docs/3-api-documentation.md | 1 + docs/4-privacy-policy.md | 1 + docs/5-faq.md | 21 +++++++++++++++++++++ docs/Gemfile | 3 ++- docs/assets/myriad.png | Bin 0 -> 680055 bytes docs/favicon.ico | Bin 0 -> 159241 bytes 9 files changed, 39 insertions(+), 2 deletions(-) create mode 100644 docs/5-faq.md create mode 100644 docs/assets/myriad.png create mode 100644 docs/favicon.ico diff --git a/README.md b/README.md index 2c18e9d4..9ea1a418 100644 --- a/README.md +++ b/README.md @@ -44,6 +44,17 @@ $ docker-compose up -d * Create and fill in a `pluralkit.conf` file in the same directory as `docker-compose.yml` * Run the bot: `dotnet run --project PluralKit.Bot` +# Building the docs +The website and documentation are automatically built by GitHub Pages when pushed to the `master` branch. They use [Jekyll 3](https://jekyllrb.com), which requires [Ruby](https://www.ruby-lang.org) and [Bundler](https://bundler.io/). + +To build the docs locally, run: +``` +$ cd docs/ +$ bundle install --path vendor/bundle +$ bundle exec jekyll build + +To run an auto-reloading server, substitute the last command with: + $ bundle exec jekyll serve # License This project is under the Apache License, Version 2.0. It is available at the following link: https://www.apache.org/licenses/LICENSE-2.0 \ No newline at end of file diff --git a/docs/1-user-guide.md b/docs/1-user-guide.md index 006e5fbb..06cad30c 100644 --- a/docs/1-user-guide.md +++ b/docs/1-user-guide.md @@ -2,6 +2,7 @@ layout: default title: User Guide permalink: /guide +description: PluralKit's user guide contains a walkthrough of the bot's features, as well as how to use them. --- # User Guide diff --git a/docs/2-command-list.md b/docs/2-command-list.md index 6d2f4b41..d3ea5f2d 100644 --- a/docs/2-command-list.md +++ b/docs/2-command-list.md @@ -2,10 +2,11 @@ layout: default title: Command List permalink: /commands +description: The full list of all commands in PluralKit, and a short description of what they do. --- # How to read this -Words in \ are *required parameters*. Words in [square brackets] are *optional parameters*. Words with ellipses... indicate multiple repeating parameters. +Words in \ are *required parameters*. Words in [square brackets] are *optional parameters*. Words with ellipses... indicate multiple repeating parameters. Note that **you should not include the brackets in the actual command**. # Commands ## System commands diff --git a/docs/3-api-documentation.md b/docs/3-api-documentation.md index 8644eac5..0ef5254f 100644 --- a/docs/3-api-documentation.md +++ b/docs/3-api-documentation.md @@ -2,6 +2,7 @@ layout: default title: API documentation permalink: /api +description: PluralKit's API documentation. --- # API documentation diff --git a/docs/4-privacy-policy.md b/docs/4-privacy-policy.md index 9d481ecc..2a419b1f 100644 --- a/docs/4-privacy-policy.md +++ b/docs/4-privacy-policy.md @@ -2,6 +2,7 @@ layout: default title: Privacy Policy permalink: /privacy +description: I'm not a lawyer. I don't want to write a 50 page document no one wants to (or can) read. It's short, I promise. --- # Privacy Policy diff --git a/docs/5-faq.md b/docs/5-faq.md new file mode 100644 index 00000000..3e216e15 --- /dev/null +++ b/docs/5-faq.md @@ -0,0 +1,21 @@ +--- +layout: default +title: FAQ +permalink: /faq +description: Frequently asked questions (and the answers to them). +--- + +# Frequently asked questions +{: .no_toc } + +1. TOC +{:toc} + +## Can I use this bot for kin/roleplay/other non-plurality uses? Can I use it if I'm not plural myself? Is that appropriating? +Although this bot is designed with plural systems and their use cases in mind, the bot's feature set is still useful for many other types of communities, including role-playing and otherkin. By all means go ahead and use it for those communities, too. We don't gatekeep, and neither should you. + +## Who's the mascot? +[Our lovely bot mascot](https://imgur.com/a/LTqQHHL)'s name is Myriad! They were drawn by the lovely [Layl](https://twitter.com/braindemons). Yes, there are fictives. + +## How can I support the bot's development? +I (the bot author, [Ske](https://twitter.com/floofstrid) have a Patreon. The income from there goes towards server hosting, domains, infrastructure, my Monster Energy addiction, et cetera. There are no benefits. There might never be any. But nevertheless, it can be found here: [https://www.patreon.com/floofstrid](https://www.patreon.com/floofstrid) diff --git a/docs/Gemfile b/docs/Gemfile index 14a8769c..a9a086ec 100644 --- a/docs/Gemfile +++ b/docs/Gemfile @@ -1,2 +1,3 @@ source "https://rubygems.org" -gem 'github-pages', group: :jekyll_plugins \ No newline at end of file +gem 'github-pages', group: :jekyll_plugins +gem 'wdm', '>= 0.1.0' if Gem.win_platform? diff --git a/docs/assets/myriad.png b/docs/assets/myriad.png new file mode 100644 index 0000000000000000000000000000000000000000..d58bd01a9f74e4ae78448fe7a523cf98e0999160 GIT binary patch literal 680055 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

K8ul9JnoO`2~CWucH|6a8(C|K0U%+4nU%Q4p6 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 z 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

S*LYLmh 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 z zEOOZ^cZ-P@evz(r*|gZzLua-QO+f0ry1!W5NGT=tvqNAB4=p_{#afEd{BDWqKc zG7*uL`kNTvOFRpSz+5cm8B^3qWb}yD$>iq?Ht4K1IG)6NzqvfDVT4yYlRi?$_~)ERN-Vv~*p}Hu+WLF%$~V;ZzPIM5%sxcLoA(=7 zx;coDi63^V7Sf~Vs)#A*J@DjSbr&l7R*E_Y3dW!}guW}M)p)n@Qz%v=(tC{LJAaw} zANw`Mg1cg?nR2bqzXHO~H;^c)Mmr)p>xq;i_9>uzQx;i@iqM-&SoC54=u(coA>0E< z&`jXV(=|l&$J?%wdb8!gK86>FmHo3}Qt&A5dhCZ;t-T2R07L4>sip0gz%N&}GTu)~ zqly_sL;E#&!m$c4!D)`B7G zlF#=Zdr}R@{dD^K!FL${w2sW2g<%BsKcKbwib^3zwoti;@x2fwr1@*;$uD$Fr#L@z z`pm=mTw8r>-#7=k-^)%ThN7Wb&M`Q`Ft>lkF2O@qJPqnO1k5%QUZo&u=QkNrOC)H!$zyO#KH#x`8{-D`R_8lhqBiz;NG+{%U;N^`K>C_GBSJy4XyE9rYj zYd7=3N;=wlHB@dSHagG-V4H>oc9l{sqRE7lF)KPs^a|dB-+s%VA<;e6Fv zaSyeK8UXOgzIoNu*Vk7q{`ol;IT^{ArpfvPyHD=vAROAiSC$D+8vwTs7G5!u1qGmP zAvXMwzIm%zWt5@pxX9u3m+hamAnH2>2P2kpE8^YUIyv(v3MHPJ4C4RNg$j%elPO-d zfqtP`qV-a#>O5<~MNgr{Cpb8p>CytF#<$3@hHdUvqnFko&!jR0f#_t+%ocx3(tr~x z36;`N|7xTiJ;yK6Wu!rV>|XIjoqld1V?jcB;aKY#G`ES_ap5$u5>HL68q2N%-fR)XOKX=^LvsN>xSG z6=#*M@CxeAw>2bb`dAncCw)yio4&CXfSkFS=33W^jklD>t|7QV zxg*&%S#cmV5mo4zY5TXGA|R~EYRBH3|N7|_nuY9ky%w}8vPp4KcC*$~IA>LFcw`3V z{?@MN-1PIp#bVj={eeK~CM?$!n9=v|{1`M3EB1dYQT6Rd628WFxA1q?b>4e1^Qi*t z>7d3m)m}o_(duP7@blu>`^Kj-TR2wDmsF9~3@!PXU@>ovUDkO;5GltBFiBR|JAe1j z!hr_(uEGIYW$Qa?IW=%gmviY6@0iV(D$NpyVB~BoS&axX}2?6 zZ*%-5s0(Ib=+}=zFvA_mVT%Xz-P5HuXUH+WlTukJmObKc7ZfS-I=c^Y~sbg~f27rLCex(yIKv8~OuG^pNM8EO;3f+tQr>lPl8ISp1 zfwm7xEb@e-gzDfEb3SyXhJG@ME+ZpjH|w6~Rm36{OEMaLE(?ag%~eOWGRy})*SB@~ zdBnW#d@KF}>l?eVI$P3Gp>bQki=MivZu9e4rSyFVdE6d;Y~mz9p27-Lh%GBqQ;AR~ z8BQ;k8kj_$*OjbPa-^O-9fyhG9zD-DTKduWZy$>AR$373CW%z(-%0DHT4$6vY9R?l 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 z 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 WUO$R0@bmP2j}Y_3u>rgsrbA0 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 z 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 ChrZAN literal 0 HcmV?d00001 diff --git a/docs/favicon.ico b/docs/favicon.ico new file mode 100644 index 0000000000000000000000000000000000000000..cb81c4f321e3cba3b08f946d51ee4f17a0b654f8 GIT binary patch literal 159241 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 z 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 DB`n7? literal 0 HcmV?d00001 From cfd8a2cfdbdeacfcf11af0870b12eef2a1708d5e Mon Sep 17 00:00:00 2001 From: Ske Date: Sat, 31 Aug 2019 19:12:48 +0200 Subject: [PATCH 36/51] Fix README formatting --- README.md | 1 + 1 file changed, 1 insertion(+) diff --git a/README.md b/README.md index 9ea1a418..435a2ce8 100644 --- a/README.md +++ b/README.md @@ -52,6 +52,7 @@ To build the docs locally, run: $ cd docs/ $ bundle install --path vendor/bundle $ bundle exec jekyll build +``` To run an auto-reloading server, substitute the last command with: $ bundle exec jekyll serve From 1bfdb43c1f59234c02f17161f32c4250701f658d Mon Sep 17 00:00:00 2001 From: Ske Date: Sat, 31 Aug 2019 19:13:10 +0200 Subject: [PATCH 37/51] Fix message model table --- docs/3-api-documentation.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/3-api-documentation.md b/docs/3-api-documentation.md index 0ef5254f..f17be1e4 100644 --- a/docs/3-api-documentation.md +++ b/docs/3-api-documentation.md @@ -56,7 +56,7 @@ The following three models (usually represented in JSON format) represent the va ### Message model |Key|Type|Notes| -|---|---|--- +|---|---|---| |timestamp|datetime|| |id|snowflake|The ID of the message sent by the webhook. Encoded as string for precision reasons.| |sender|snowflake|The user ID of the account that triggered the proxy. Encoded as string for precision reasons.| From 7d1accd58d0cd29e34aaa6bac5bb7436e5563a03 Mon Sep 17 00:00:00 2001 From: Ske Date: Sat, 31 Aug 2019 19:13:37 +0200 Subject: [PATCH 38/51] Fix file name of tips and tricks page --- docs/{5-tips-and-tricks.md => 6-tips-and-tricks.md} | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename docs/{5-tips-and-tricks.md => 6-tips-and-tricks.md} (100%) diff --git a/docs/5-tips-and-tricks.md b/docs/6-tips-and-tricks.md similarity index 100% rename from docs/5-tips-and-tricks.md rename to docs/6-tips-and-tricks.md From 86d0b24758af577e2d5a49e4c44433dc499d0df6 Mon Sep 17 00:00:00 2001 From: Ske Date: Mon, 2 Sep 2019 20:37:24 +0200 Subject: [PATCH 39/51] Include event ID in Sentry dump --- PluralKit.Bot/Bot.cs | 2 ++ 1 file changed, 2 insertions(+) diff --git a/PluralKit.Bot/Bot.cs b/PluralKit.Bot/Bot.cs index 81e7cf34..1c63869d 100644 --- a/PluralKit.Bot/Bot.cs +++ b/PluralKit.Bot/Bot.cs @@ -271,7 +271,9 @@ namespace PluralKit.Bot // and log the breadcrumb to the newly created (in-svc-scope) Sentry scope using (var scope = _services.CreateScope()) { + var evtid = scope.ServiceProvider.GetService().EventId; var sentryScope = scope.ServiceProvider.GetRequiredService(); + sentryScope.SetTag("evtid", evtid.ToString()); breadcrumbFactory(sentryScope); try From 0ec522ca0a9214a27373e7abb7d2b486f50fda24 Mon Sep 17 00:00:00 2001 From: Ske Date: Sat, 21 Sep 2019 15:19:38 +0200 Subject: [PATCH 40/51] Display member roles in message query card --- PluralKit.Bot/Services/EmbedService.cs | 41 ++++++++++++++++++++------ 1 file changed, 32 insertions(+), 9 deletions(-) diff --git a/PluralKit.Bot/Services/EmbedService.cs b/PluralKit.Bot/Services/EmbedService.cs index 42bdd6a1..ee578614 100644 --- a/PluralKit.Bot/Services/EmbedService.cs +++ b/PluralKit.Bot/Services/EmbedService.cs @@ -3,6 +3,8 @@ using System.Collections.Generic; using System.Linq; using System.Threading.Tasks; using Discord; +using Discord.WebSocket; + using Humanizer; using NodaTime; @@ -151,23 +153,44 @@ namespace PluralKit.Bot { public async Task CreateMessageInfoEmbed(MessageStore.StoredMessage msg) { - var channel = (ITextChannel) await _client.GetChannelAsync(msg.Message.Channel); - var serverMsg = await channel.GetMessageAsync(msg.Message.Mid); + var channel = await _client.GetChannelAsync(msg.Message.Channel) as ITextChannel; + var serverMsg = channel != null ? await channel.GetMessageAsync(msg.Message.Mid) : null; var memberStr = $"{msg.Member.Name} (`{msg.Member.Hid}`)"; - if (msg.Member.Pronouns != null) memberStr += $"\n*(pronouns: **{msg.Member.Pronouns}**)*"; - var user = await _client.GetUserAsync(msg.Message.Sender); - var userStr = user.NameAndMention() ?? $"*(deleted user {msg.Message.Sender})*"; + var userStr = $"*(deleted user {msg.Message.Sender})*"; + ICollection roles = null; - return new EmbedBuilder() + if (channel != null) + { + // Look up the user with the REST client + // this ensures we'll still get the information even if the user's not cached, + // even if this means an extra API request (meh, it'll be fine) + var shard = ((DiscordShardedClient) _client).GetShardFor(channel.Guild); + var guildUser = await shard.Rest.GetGuildUserAsync(channel.Guild.Id, msg.Message.Sender); + if (guildUser != null) + { + roles = guildUser.RoleIds + .Select(roleId => channel.Guild.GetRole(roleId)) + .Where(role => role.Name != "@everyone") + .OrderByDescending(role => role.Position) + .ToList(); + + userStr = guildUser?.NameAndMention(); + } + } + + var eb = new EmbedBuilder() .WithAuthor(msg.Member.Name, msg.Member.AvatarUrl) .WithDescription(serverMsg?.Content ?? "*(message contents deleted or inaccessible)*") - .AddField("System", msg.System.Name != null ? $"{msg.System.Name} (`{msg.System.Hid}`)" : $"`{msg.System.Hid}`", true) + .AddField("System", + msg.System.Name != null ? $"{msg.System.Name} (`{msg.System.Hid}`)" : $"`{msg.System.Hid}`", true) .AddField("Member", memberStr, true) .AddField("Sent by", userStr, inline: true) - .WithTimestamp(SnowflakeUtils.FromSnowflake(msg.Message.Mid)) - .Build(); + .WithTimestamp(SnowflakeUtils.FromSnowflake(msg.Message.Mid)); + + if (roles != null) eb.AddField($"Account roles ({roles.Count})", string.Join(", ", roles.Select(role => role.Name))); + return eb.Build(); } public Task CreateFrontPercentEmbed(SwitchStore.PerMemberSwitchDuration frontpercent, DateTimeZone tz) From 658bcf1faf11e5f70a49c49e78bc6934b0137f68 Mon Sep 17 00:00:00 2001 From: xBelladonna Date: Sun, 22 Sep 2019 02:04:20 +0930 Subject: [PATCH 41/51] Display guild user nickname on message card if set --- PluralKit.Bot/Services/EmbedService.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/PluralKit.Bot/Services/EmbedService.cs b/PluralKit.Bot/Services/EmbedService.cs index ee578614..ee8720db 100644 --- a/PluralKit.Bot/Services/EmbedService.cs +++ b/PluralKit.Bot/Services/EmbedService.cs @@ -176,7 +176,7 @@ namespace PluralKit.Bot { .OrderByDescending(role => role.Position) .ToList(); - userStr = guildUser?.NameAndMention(); + userStr = guildUser.Nickname != null ? $"**Username:** {guildUser?.NameAndMention()}\n**Nickname:** {guildUser.Nickname}" : guildUser?.NameAndMention(); } } From 633c181e8408717a0737305fa1baa2f1c33a3439 Mon Sep 17 00:00:00 2001 From: Noko Date: Sat, 28 Sep 2019 23:29:32 -0500 Subject: [PATCH 42/51] Add displayname to PK export/import - Add display_name property to member on PK export - Set display_name if provided when importing from PK export file --- PluralKit.Core/DataFiles.cs | 3 +++ 1 file changed, 3 insertions(+) diff --git a/PluralKit.Core/DataFiles.cs b/PluralKit.Core/DataFiles.cs index 346ab224..d5b7a24b 100644 --- a/PluralKit.Core/DataFiles.cs +++ b/PluralKit.Core/DataFiles.cs @@ -49,6 +49,7 @@ namespace PluralKit.Bot { Id = member.Hid, Name = member.Name, + DisplayName = member.DisplayName, Description = member.Description, Birthday = member.Birthday != null ? Formats.DateExportFormat.Format(member.Birthday.Value) : null, Pronouns = member.Pronouns, @@ -117,6 +118,7 @@ namespace PluralKit.Bot // Apply member info member.Name = dataMember.Name; + if (dataMember.DisplayName != null) member.DisplayName = dataMember.DisplayName; if (dataMember.Description != null) member.Description = dataMember.Description; if (dataMember.Color != null) member.Color = dataMember.Color; if (dataMember.AvatarUrl != null) member.AvatarUrl = dataMember.AvatarUrl; @@ -173,6 +175,7 @@ namespace PluralKit.Bot { [JsonProperty("id")] public string Id; [JsonProperty("name")] public string Name; + [JsonProperty("display_name")] public string DisplayName; [JsonProperty("description")] public string Description; [JsonProperty("birthday")] public string Birthday; [JsonProperty("pronouns")] public string Pronouns; From 7406f18bf53c65f168c906b8d0871dda83a788ed Mon Sep 17 00:00:00 2001 From: Noko Date: Sun, 29 Sep 2019 14:40:13 -0500 Subject: [PATCH 43/51] Import switches - ImportSystem builds a mapping of data file HID to current system HID - Switches in a data file are reconciled with system members' actual IDs using this mapping - SwitchStore provides a RegisterSwitches method to register multiple switches - RegisterSwitches only imports a switch if one does not exist with the same timestamp - The number of switches created is logged --- PluralKit.Core/DataFiles.cs | 25 ++++++++++++++++++++++--- PluralKit.Core/Stores.cs | 35 +++++++++++++++++++++++++++++++++++ 2 files changed, 57 insertions(+), 3 deletions(-) diff --git a/PluralKit.Core/DataFiles.cs b/PluralKit.Core/DataFiles.cs index d5b7a24b..105caad1 100644 --- a/PluralKit.Core/DataFiles.cs +++ b/PluralKit.Core/DataFiles.cs @@ -1,8 +1,10 @@ +using System; using System.Collections.Generic; using System.Linq; using System.Threading.Tasks; using Newtonsoft.Json; using NodaTime; +using NodaTime.Text; using Serilog; namespace PluralKit.Bot @@ -73,6 +75,7 @@ namespace PluralKit.Bot // which probably means refactoring SystemStore.Save and friends etc var result = new ImportResult {AddedNames = new List(), ModifiedNames = new List()}; + var hidMapping = new Dictionary(); // If we don't already have a system to save to, create one if (system == null) system = await _systems.Create(data.Name); @@ -116,6 +119,10 @@ namespace PluralKit.Bot result.ModifiedNames.Add(dataMember.Name); } + // Keep track of what the data file's member ID maps to for switch import + if (!hidMapping.ContainsKey(dataMember.Id)) + hidMapping.Add(dataMember.Id, member); + // Apply member info member.Name = dataMember.Name; if (dataMember.DisplayName != null) member.DisplayName = dataMember.DisplayName; @@ -136,10 +143,22 @@ namespace PluralKit.Bot await _members.Save(member); } - - _logger.Information("Imported system {System}", system.Id); - // TODO: import switches, too? + // Re-map the switch members in the likely case IDs have changed + var mappedSwitches = new List>>(); + foreach (var sw in data.Switches) + { + var timestamp = InstantPattern.ExtendedIso.Parse(sw.Timestamp).Value; + var swMembers = new List(); + swMembers.AddRange(sw.Members.Select(x => + hidMapping.FirstOrDefault(y => y.Key.Equals(x)).Value)); + var mapped = new Tuple>(timestamp, swMembers); + mappedSwitches.Add(mapped); + } + // Import switches + await _switches.RegisterSwitches(system, mappedSwitches); + + _logger.Information("Imported system {System}", system.Id); result.System = system; return result; diff --git a/PluralKit.Core/Stores.cs b/PluralKit.Core/Stores.cs index 293d6de4..b53e3872 100644 --- a/PluralKit.Core/Stores.cs +++ b/PluralKit.Core/Stores.cs @@ -1,3 +1,4 @@ +using System; using System.Collections.Generic; using System.Linq; using System.Threading.Tasks; @@ -294,6 +295,40 @@ namespace PluralKit { } } + public async Task RegisterSwitches(PKSystem system, ICollection>> switches) + { + // Use a transaction here since we're doing multiple executed commands in one + using (var conn = await _conn.Obtain()) + using (var tx = conn.BeginTransaction()) + { + foreach (var s in switches) + { + // First, we insert the switch itself + var sw = await conn.QueryFirstOrDefaultAsync( + @"insert into switches(system, timestamp) + select @System, @Timestamp + where not exists ( + select * from switches + where system = @System and timestamp::timestamp(0) = @Timestamp + limit 1 + ) + returning *", + new { System = system.Id, Timestamp = s.Item1 }); + + // If we inserted a switch, also insert each member in the switch in the switch_members table + if (sw != null && s.Item2.Any()) + await conn.ExecuteAsync( + "insert into switch_members(switch, member) select @Switch, * FROM unnest(@Members)", + new { Switch = sw.Id, Members = s.Item2.Select(x => x.Id).ToArray() }); + } + + // Finally we commit the tx, since the using block will otherwise rollback it + tx.Commit(); + + _logger.Information("Registered {SwitchCount} switches in system {System}", switches.Count, system.Id); + } + } + public async Task> GetSwitches(PKSystem system, int count = 9999999) { // TODO: refactor the PKSwitch data structure to somehow include a hydrated member list From 1988b29fbc94f07bbffaf5d1f0623c80b136bc36 Mon Sep 17 00:00:00 2001 From: Ske Date: Sat, 5 Oct 2019 07:41:00 +0200 Subject: [PATCH 44/51] Refactor command system --- PluralKit.Bot/Bot.cs | 155 ++++---- PluralKit.Bot/CommandSystem/Command.cs | 16 + PluralKit.Bot/CommandSystem/CommandGroup.cs | 19 + PluralKit.Bot/CommandSystem/Context.cs | 242 ++++++++++++ PluralKit.Bot/CommandSystem/Parameters.cs | 77 ++++ PluralKit.Bot/Commands/APICommands.cs | 63 ++-- PluralKit.Bot/Commands/CommandTree.cs | 285 ++++++++++++++ PluralKit.Bot/Commands/HelpCommands.cs | 75 ++-- .../Commands/ImportExportCommands.cs | 60 +-- PluralKit.Bot/Commands/LinkCommands.cs | 57 +-- PluralKit.Bot/Commands/MemberCommands.cs | 326 ++++++++-------- PluralKit.Bot/Commands/MiscCommands.cs | 70 ++-- PluralKit.Bot/Commands/ModCommands.cs | 66 ++-- PluralKit.Bot/Commands/SwitchCommands.cs | 128 ++++--- PluralKit.Bot/Commands/SystemCommands.cs | 353 ++++++++---------- PluralKit.Bot/ContextUtils.cs | 48 +-- PluralKit.Bot/Errors.cs | 3 +- PluralKit.Bot/PluralKit.Bot.csproj | 2 +- PluralKit.Bot/Preconditions.cs | 33 -- PluralKit.Bot/Services/ProxyService.cs | 2 +- PluralKit.Bot/Utils.cs | 155 +------- 21 files changed, 1353 insertions(+), 882 deletions(-) create mode 100644 PluralKit.Bot/CommandSystem/Command.cs create mode 100644 PluralKit.Bot/CommandSystem/CommandGroup.cs create mode 100644 PluralKit.Bot/CommandSystem/Context.cs create mode 100644 PluralKit.Bot/CommandSystem/Parameters.cs create mode 100644 PluralKit.Bot/Commands/CommandTree.cs delete mode 100644 PluralKit.Bot/Preconditions.cs diff --git a/PluralKit.Bot/Bot.cs b/PluralKit.Bot/Bot.cs index 1c63869d..8951ed41 100644 --- a/PluralKit.Bot/Bot.cs +++ b/PluralKit.Bot/Bot.cs @@ -12,6 +12,10 @@ using Discord.Commands; using Discord.WebSocket; using Microsoft.Extensions.Configuration; using Microsoft.Extensions.DependencyInjection; + +using PluralKit.Bot.Commands; +using PluralKit.Bot.CommandSystem; + using Sentry; using Serilog; using Serilog.Events; @@ -84,23 +88,18 @@ namespace PluralKit.Bot ExclusiveBulkDelete = true })) .AddSingleton() - - .AddSingleton(_ => new CommandService(new CommandServiceConfig - { - CaseSensitiveCommands = false, - QuotationMarkAliasMap = new Dictionary - { - {'"', '"'}, - {'\'', '\''}, - {'‘', '’'}, - {'“', '”'}, - {'„', '‟'}, - }, - // We're already asyncing stuff by forking off at the client event handlers - // So adding an additional layer of forking is pointless - // and leads to the service scope being disposed of prematurely - DefaultRunMode = RunMode.Sync - })) + .AddTransient() + + .AddTransient() + .AddTransient() + .AddTransient() + .AddTransient() + .AddTransient() + .AddTransient() + .AddTransient() + .AddTransient() + .AddTransient() + .AddTransient() .AddTransient() .AddTransient() @@ -133,29 +132,22 @@ namespace PluralKit.Bot { private IServiceProvider _services; private DiscordShardedClient _client; - private CommandService _commands; private Timer _updateTimer; private IMetrics _metrics; private PeriodicStatCollector _collector; private ILogger _logger; - public Bot(IServiceProvider services, IDiscordClient client, CommandService commands, IMetrics metrics, PeriodicStatCollector collector, ILogger logger) + public Bot(IServiceProvider services, IDiscordClient client, IMetrics metrics, PeriodicStatCollector collector, ILogger logger) { _services = services; _client = client as DiscordShardedClient; - _commands = commands; _metrics = metrics; _collector = collector; _logger = logger.ForContext(); } - public async Task Init() + public Task Init() { - _commands.AddTypeReader(new PKSystemTypeReader()); - _commands.AddTypeReader(new PKMemberTypeReader()); - _commands.CommandExecuted += CommandExecuted; - await _commands.AddModulesAsync(Assembly.GetEntryAssembly(), _services); - _client.ShardReady += ShardReady; _client.Log += FrameworkLog; @@ -171,6 +163,8 @@ namespace PluralKit.Bot _client.ReactionAdded += (msg, channel, reaction) => HandleEvent(s => s.AddReactionAddedBreadcrumb(msg, channel, reaction), eh => eh.HandleReactionAdded(msg, channel, reaction)); _client.MessageDeleted += (msg, channel) => HandleEvent(s => s.AddMessageDeleteBreadcrumb(msg, channel), eh => eh.HandleMessageDeleted(msg, channel)); _client.MessagesBulkDeleted += (msgs, channel) => HandleEvent(s => s.AddMessageBulkDeleteBreadcrumb(msgs, channel), eh => eh.HandleMessagesBulkDelete(msgs, channel)); + + return Task.CompletedTask; } private Task FrameworkLog(LogMessage msg) @@ -224,39 +218,39 @@ namespace PluralKit.Bot return Task.CompletedTask; } - private async Task CommandExecuted(Optional cmd, ICommandContext ctx, IResult _result) - { - var svc = ((PKCommandContext) ctx).ServiceProvider; - var id = svc.GetService(); - - _metrics.Measure.Meter.Mark(BotMetrics.CommandsRun); - - // TODO: refactor this entire block, it's fugly. - if (!_result.IsSuccess) { - if (_result.Error == CommandError.Unsuccessful || _result.Error == CommandError.Exception) { - // If this is a PKError (ie. thrown deliberately), show user facing message - // If not, log as error - var exception = (_result as ExecuteResult?)?.Exception; - if (exception is PKError) { - await ctx.Message.Channel.SendMessageAsync($"{Emojis.Error} {exception.Message}"); - } else if (exception is TimeoutException) { - await ctx.Message.Channel.SendMessageAsync($"{Emojis.Error} Operation timed out. Try being faster next time :)"); - } else if (_result is PreconditionResult) - { - await ctx.Message.Channel.SendMessageAsync($"{Emojis.Error} {_result.ErrorReason}"); - } else - { - await ctx.Message.Channel.SendMessageAsync( - $"{Emojis.Error} Internal error occurred. Please join the support server (), and send the developer this ID: `{id.EventId}`."); - HandleRuntimeError((_result as ExecuteResult?)?.Exception, svc); - } - } else if ((_result.Error == CommandError.BadArgCount || _result.Error == CommandError.MultipleMatches) && cmd.IsSpecified) { - await ctx.Message.Channel.SendMessageAsync($"{Emojis.Error} {_result.ErrorReason}\n**Usage: **pk;{cmd.Value.Remarks}"); - } else if (_result.Error == CommandError.UnknownCommand || _result.Error == CommandError.UnmetPrecondition || _result.Error == CommandError.ObjectNotFound) { - await ctx.Message.Channel.SendMessageAsync($"{Emojis.Error} {_result.ErrorReason}"); - } - } - } + // private async Task CommandExecuted(Optional cmd, ICommandContext ctx, IResult _result) + // { + // var svc = ((PKCommandContext) ctx).ServiceProvider; + // var id = svc.GetService(); + // + // _metrics.Measure.Meter.Mark(BotMetrics.CommandsRun); + // + // // TODO: refactor this entire block, it's fugly. + // if (!_result.IsSuccess) { + // if (_result.Error == CommandError.Unsuccessful || _result.Error == CommandError.Exception) { + // // If this is a PKError (ie. thrown deliberately), show user facing message + // // If not, log as error + // var exception = (_result as ExecuteResult?)?.Exception; + // if (exception is PKError) { + // await ctx.Message.Channel.SendMessageAsync($"{Emojis.Error} {exception.Message}"); + // } else if (exception is TimeoutException) { + // await ctx.Message.Channel.SendMessageAsync($"{Emojis.Error} Operation timed out. Try being faster next time :)"); + // } else if (_result is PreconditionResult) + // { + // await ctx.Message.Channel.SendMessageAsync($"{Emojis.Error} {_result.ErrorReason}"); + // } else + // { + // await ctx.Message.Channel.SendMessageAsync( + // $"{Emojis.Error} Internal error occurred. Please join the support server (), and send the developer this ID: `{id.EventId}`."); + // HandleRuntimeError((_result as ExecuteResult?)?.Exception, svc); + // } + // } else if ((_result.Error == CommandError.BadArgCount || _result.Error == CommandError.MultipleMatches) && cmd.IsSpecified) { + // await ctx.Message.Channel.SendMessageAsync($"{Emojis.Error} {_result.ErrorReason}\n**Usage: **pk;{cmd.Value.Remarks}"); + // } else if (_result.Error == CommandError.UnknownCommand || _result.Error == CommandError.UnmetPrecondition || _result.Error == CommandError.ObjectNotFound) { + // await ctx.Message.Channel.SendMessageAsync($"{Emojis.Error} {_result.ErrorReason}"); + // } + // } + // } private Task HandleEvent(Action breadcrumbFactory, Func handler) { @@ -309,47 +303,51 @@ namespace PluralKit.Bot } class PKEventHandler { - private CommandService _commands; private ProxyService _proxy; private ILogger _logger; private IMetrics _metrics; private DiscordShardedClient _client; private DbConnectionFactory _connectionFactory; private IServiceProvider _services; + private CommandTree _tree; - public PKEventHandler(CommandService commands, ProxyService proxy, ILogger logger, IMetrics metrics, IDiscordClient client, DbConnectionFactory connectionFactory, IServiceProvider services) + public PKEventHandler(ProxyService proxy, ILogger logger, IMetrics metrics, IDiscordClient client, DbConnectionFactory connectionFactory, IServiceProvider services, CommandTree tree) { - _commands = commands; _proxy = proxy; _logger = logger; _metrics = metrics; _client = (DiscordShardedClient) client; _connectionFactory = connectionFactory; _services = services; + _tree = tree; } - public async Task HandleMessage(SocketMessage msg) + public async Task HandleMessage(SocketMessage arg) { - RegisterMessageMetrics(msg); + RegisterMessageMetrics(arg); // Ignore system messages (member joined, message pinned, etc) - var arg = msg as SocketUserMessage; - if (arg == null) return; + var msg = arg as SocketUserMessage; + if (msg == null) return; // Ignore bot messages - if (arg.Author.IsBot || arg.Author.IsWebhook) return; + if (msg.Author.IsBot || msg.Author.IsWebhook) return; - int argPos = 0; + int argPos = -1; // Check if message starts with the command prefix - if (arg.HasStringPrefix("pk;", ref argPos, StringComparison.OrdinalIgnoreCase) || - arg.HasStringPrefix("pk!", ref argPos, StringComparison.OrdinalIgnoreCase) || - arg.HasMentionPrefix(_client.CurrentUser, ref argPos)) + if (msg.Content.StartsWith("pk;")) argPos = 3; + else if (msg.Content.StartsWith("pk!")) argPos = 3; + else if (Utils.HasMentionPrefix(msg.Content, ref argPos, out var id)) // Set argPos to the proper value + if (id != _client.CurrentUser.Id) // But undo it if it's someone else's ping + argPos = -1; + + if (argPos > -1) { _logger.Debug("Parsing command {Command} from message {Channel}-{Message}", msg.Content, msg.Channel.Id, msg.Id); // Essentially move the argPos pointer by however much whitespace is at the start of the post-argPos string - var trimStartLengthDiff = arg.Content.Substring(argPos).Length - - arg.Content.Substring(argPos).TrimStart().Length; + var trimStartLengthDiff = msg.Content.Substring(argPos).Length - + msg.Content.Substring(argPos).TrimStart().Length; argPos += trimStartLengthDiff; // If it does, fetch the sender's system (because most commands need that) into the context, @@ -359,21 +357,20 @@ namespace PluralKit.Bot using (var conn = await _connectionFactory.Obtain()) system = await conn.QueryFirstOrDefaultAsync( "select systems.* from systems, accounts where accounts.uid = @Id and systems.id = accounts.system", - new {Id = arg.Author.Id}); - - await _commands.ExecuteAsync(new PKCommandContext(_client, arg, system, _services), argPos, - _services); + new {Id = msg.Author.Id}); + + await _tree.ExecuteCommand(new Context(_services, msg, argPos, system)); } else { // If not, try proxying anyway try { - await _proxy.HandleMessageAsync(arg); + await _proxy.HandleMessageAsync(msg); } catch (PKError e) { - await msg.Channel.SendMessageAsync($"{Emojis.Error} {e.Message}"); + await arg.Channel.SendMessageAsync($"{Emojis.Error} {e.Message}"); } } } diff --git a/PluralKit.Bot/CommandSystem/Command.cs b/PluralKit.Bot/CommandSystem/Command.cs new file mode 100644 index 00000000..42a5a2cd --- /dev/null +++ b/PluralKit.Bot/CommandSystem/Command.cs @@ -0,0 +1,16 @@ +namespace PluralKit.Bot.CommandSystem +{ + public class Command + { + public string Key { get; } + public string Usage { get; } + public string Description { get; } + + public Command(string key, string usage, string description) + { + Key = key; + Usage = usage; + Description = description; + } + } +} \ No newline at end of file diff --git a/PluralKit.Bot/CommandSystem/CommandGroup.cs b/PluralKit.Bot/CommandSystem/CommandGroup.cs new file mode 100644 index 00000000..a54ea2ad --- /dev/null +++ b/PluralKit.Bot/CommandSystem/CommandGroup.cs @@ -0,0 +1,19 @@ +using System.Collections.Generic; + +namespace PluralKit.Bot.CommandSystem +{ + public class CommandGroup + { + public string Key { get; } + public string Description { get; } + + public ICollection Children { get; } + + public CommandGroup(string key, string description, ICollection children) + { + Key = key; + Description = description; + Children = children; + } + } +} \ No newline at end of file diff --git a/PluralKit.Bot/CommandSystem/Context.cs b/PluralKit.Bot/CommandSystem/Context.cs new file mode 100644 index 00000000..5b285b2a --- /dev/null +++ b/PluralKit.Bot/CommandSystem/Context.cs @@ -0,0 +1,242 @@ +using System; +using System.Threading.Tasks; + +using Discord; +using Discord.Net; +using Discord.WebSocket; + +using Microsoft.Extensions.DependencyInjection; + +namespace PluralKit.Bot.CommandSystem +{ + public class Context + { + private IServiceProvider _provider; + + private readonly DiscordShardedClient _client; + private readonly SocketUserMessage _message; + private readonly Parameters _parameters; + + private readonly SystemStore _systems; + private readonly MemberStore _members; + private readonly PKSystem _senderSystem; + + private Command _currentCommand; + + public Context(IServiceProvider provider, SocketUserMessage message, int commandParseOffset, + PKSystem senderSystem) + { + _client = provider.GetRequiredService() as DiscordShardedClient; + _message = message; + _systems = provider.GetRequiredService(); + _members = provider.GetRequiredService(); + _senderSystem = senderSystem; + _provider = provider; + _parameters = new Parameters(message.Content.Substring(commandParseOffset)); + } + + public IUser Author => _message.Author; + public IMessageChannel Channel => _message.Channel; + public IUserMessage Message => _message; + public IGuild Guild => (_message.Channel as ITextChannel)?.Guild; + public DiscordSocketClient Shard => _client.GetShardFor(Guild); + public DiscordShardedClient Client => _client; + public PKSystem System => _senderSystem; + + public string PopArgument() => _parameters.Pop(); + public string PeekArgument() => _parameters.Peek(); + public string Remainder() => _parameters.Remainder(); + public string RemainderOrNull() => Remainder().Trim().Length == 0 ? null : Remainder(); + public bool HasNext() => RemainderOrNull() != null; + public string FullCommand => _parameters.FullCommand; + + public Task Reply(string text = null, Embed embed = null) => + Channel.SendMessageAsync(text, embed: embed); + + ///

+ /// Checks if the next parameter is equal to one of the given keywords. Case-insensitive. + /// + public bool Match(params string[] potentialMatches) + { + foreach (var match in potentialMatches) + { + if (PeekArgument().Equals(match, StringComparison.InvariantCultureIgnoreCase)) + { + PopArgument(); + return true; + } + } + + return false; + } + + public async Task Execute(Command commandDef, Func handler) + { + _currentCommand = commandDef; + + try + { + await handler(_provider.GetRequiredService()); + } + catch (PKSyntaxError e) + { + await Reply($"{Emojis.Error} {e.Message}\n**Command usage:** pk;{commandDef.Usage}"); + } + catch (PKError e) + { + await Reply($"{Emojis.Error} {e.Message}"); + } + } + + public async Task MatchUser() + { + var text = PeekArgument(); + if (MentionUtils.TryParseUser(text, out var id)) + return await Shard.Rest.GetUserAsync(id); // TODO: this should properly fetch + return null; + } + + public Task PeekSystem() => MatchSystemInner(); + + public async Task MatchSystem() + { + var system = await MatchSystemInner(); + if (system != null) PopArgument(); + return system; + } + + private async Task MatchSystemInner() + { + var input = PeekArgument(); + + // System references can take three forms: + // - The direct user ID of an account connected to the system + // - A @mention of an account connected to the system (<@uid>) + // - A system hid + + // Direct IDs and mentions are both handled by the below method: + if (input.TryParseMention(out var id)) + return await _systems.GetByAccount(id); + + // Finally, try HID parsing + var system = await _systems.GetByHid(input); + return system; + } + + public async Task PeekMember() + { + var input = PeekArgument(); + + // Member references can have one or two forms, depending on + // whether you're in a system or not: + // - A member hid + // - A textual name of a member *in your own system* + + // First, try member HID parsing: + if (await _members.GetByHid(input) is PKMember memberByHid) + return memberByHid; + + // Then, if we have a system, try finding by member name in system + if (_senderSystem != null && await _members.GetByName(_senderSystem, input) is PKMember memberByName) + return memberByName; + + // We didn't find anything, so we return null. + return null; + } + + /// + /// Attempts to pop a member descriptor from the stack, returning it if present. If a member could not be + /// resolved by the next word in the argument stack, does *not* touch the stack, and returns null. + /// + public async Task MatchMember() + { + // First, peek a member + var member = await PeekMember(); + + // If the peek was successful, we've used up the next argument, so we pop that just to get rid of it. + if (member != null) PopArgument(); + + // Finally, we return the member value. + return member; + } + + public string CreateMemberNotFoundError(string input) + { + // TODO: does this belong here? + if (input.Length == 5) + { + if (_senderSystem != null) + return $"Member with ID or name `{input}` not found."; + return $"Member with ID `{input}` not found."; // Accounts without systems can't query by name + } + + if (_senderSystem != null) + return $"Member with name `{input}` not found. Note that a member ID is 5 characters long."; + return $"Member not found. Note that a member ID is 5 characters long."; + } + + public Context CheckSystem() + { + if (_senderSystem == null) + throw Errors.NoSystemError; + return this; + } + + public Context CheckNoSystem() + { + if (_senderSystem != null) + throw Errors.ExistingSystemError; + return this; + } + + public Context CheckOwnMember(PKMember member) + { + if (member.System != _senderSystem.Id) + throw Errors.NotOwnMemberError; + return this; + } + + public GuildPermissions GetGuildPermissions(IUser user) + { + if (Channel is SocketGuildChannel gc) + return gc.GetUser(user.Id).GuildPermissions; + return GuildPermissions.None; + } + + public ChannelPermissions GetChannelPermissions(IUser user) + { + if (Channel is SocketGuildChannel gc) + return gc.GetUser(user.Id).GetPermissions(gc); + return ChannelPermissions.DM; + } + + public Context CheckAuthorPermission(GuildPermission permission, string permissionName) + { + if (!GetGuildPermissions(Author).Has(permission)) + throw new PKError($"You must have the \"{permissionName}\" permission in this server to use this command."); + return this; + } + + public Context CheckAuthorPermission(ChannelPermission permission, string permissionName) + { + if (!GetChannelPermissions(Author).Has(permission)) + throw new PKError($"You must have the \"{permissionName}\" permission in this server to use this command."); + return this; + } + + public Context CheckGuildContext() + { + if (Channel is IGuildChannel) return this; + throw new PKError("This command can not be run in a DM."); + } + + public ITextChannel MatchChannel() + { + if (!MentionUtils.TryParseChannel(PeekArgument(), out var channel)) return null; + if (!(_client.GetChannel(channel) is ITextChannel textChannel)) return null; + + PopArgument(); + return textChannel; + } + } +} \ No newline at end of file diff --git a/PluralKit.Bot/CommandSystem/Parameters.cs b/PluralKit.Bot/CommandSystem/Parameters.cs new file mode 100644 index 00000000..b1fb9447 --- /dev/null +++ b/PluralKit.Bot/CommandSystem/Parameters.cs @@ -0,0 +1,77 @@ +using System; +using System.Collections.Generic; + +namespace PluralKit.Bot.CommandSystem +{ + public class Parameters + { + private static readonly Dictionary _quotePairs = new Dictionary() + { + {'\'', '\''}, {'"', '"'} + }; + + private readonly string _cmd; + private int _ptr; + + public Parameters(string cmd) + { + _cmd = cmd; + _ptr = 0; + } + + public string Pop() + { + var positions = NextWordPosition(); + if (positions == null) return ""; + + var (start, end, advance) = positions.Value; + _ptr = end + advance; + return _cmd.Substring(start, end - start).Trim(); + } + + public string Peek() + { + var positions = NextWordPosition(); + if (positions == null) return ""; + + var (start, end, _) = positions.Value; + return _cmd.Substring(start, end - start).Trim(); + } + + public string Remainder() => _cmd.Substring(_ptr).Trim(); + public string FullCommand => _cmd; + + // Returns tuple of (startpos, endpos, advanceafter) + private ValueTuple? NextWordPosition() + { + // Is this the end of the string? + if (_cmd.Length <= _ptr) return null; + + // Is this a quoted word? + if (_quotePairs.ContainsKey(_cmd[_ptr])) + { + // This is a quoted word, find corresponding end quote and return span + var endQuote = _quotePairs[_cmd[_ptr]]; + var endQuotePosition = _cmd.IndexOf(endQuote, _ptr + 1); + + // Position after the end quote should be a space (or EOL) + // Otherwise treat it as a standard word that's not quoted + if (_cmd.Length == endQuotePosition + 1 || _cmd[endQuotePosition + 1] == ' ') + { + if (endQuotePosition == -1) + { + // This is an unterminated quoted word, just return the entire word including the start quote + // TODO: should we do something else here? + return (_ptr, _cmd.Length, 0); + } + + return (_ptr + 1, endQuotePosition, 1); + } + } + + // Not a quoted word, just find the next space and return as appropriate + var wordEnd = _cmd.IndexOf(' ', _ptr + 1); + return wordEnd != -1 ? (_ptr, wordEnd, 1) : (_ptr, _cmd.Length, 0); + } + } +} \ No newline at end of file diff --git a/PluralKit.Bot/Commands/APICommands.cs b/PluralKit.Bot/Commands/APICommands.cs index 426646a3..65bff097 100644 --- a/PluralKit.Bot/Commands/APICommands.cs +++ b/PluralKit.Bot/Commands/APICommands.cs @@ -1,66 +1,67 @@ using System.Threading.Tasks; using Discord; -using Discord.Commands; + +using PluralKit.Bot.CommandSystem; namespace PluralKit.Bot.Commands { - [Group("token")] - public class APICommands: ModuleBase + public class APICommands { - public SystemStore Systems { get; set; } - - [Command] - [MustHaveSystem] - [Remarks("token")] - public async Task GetToken() + private SystemStore _systems; + public APICommands(SystemStore systems) { + _systems = systems; + } + + public async Task GetToken(Context ctx) + { + ctx.CheckSystem(); + // Get or make a token - var token = Context.SenderSystem.Token ?? await MakeAndSetNewToken(); + var token = ctx.System.Token ?? await MakeAndSetNewToken(ctx.System); // If we're not already in a DM, reply with a reminder to check - if (!(Context.Channel is IDMChannel)) + if (!(ctx.Channel is IDMChannel)) { - await Context.Channel.SendMessageAsync($"{Emojis.Success} Check your DMs!"); + await ctx.Reply($"{Emojis.Success} Check your DMs!"); } // DM the user a security disclaimer, and then the token in a separate message (for easy copying on mobile) - await Context.User.SendMessageAsync($"{Emojis.Warn} Please note that this grants access to modify (and delete!) all your system data, so keep it safe and secure. If it leaks or you need a new one, you can invalidate this one with `pk;token refresh`.\n\nYour token is below:"); - await Context.User.SendMessageAsync(token); + await ctx.Author.SendMessageAsync($"{Emojis.Warn} Please note that this grants access to modify (and delete!) all your system data, so keep it safe and secure. If it leaks or you need a new one, you can invalidate this one with `pk;token refresh`.\n\nYour token is below:"); + await ctx.Author.SendMessageAsync(token); } - private async Task MakeAndSetNewToken() + private async Task MakeAndSetNewToken(PKSystem system) { - Context.SenderSystem.Token = PluralKit.Utils.GenerateToken(); - await Systems.Save(Context.SenderSystem); - return Context.SenderSystem.Token; + system.Token = PluralKit.Utils.GenerateToken(); + await _systems.Save(system); + return system.Token; } - - [Command("refresh")] - [MustHaveSystem] - [Alias("expire", "invalidate", "update", "new")] - [Remarks("token refresh")] - public async Task RefreshToken() + + public async Task RefreshToken(Context ctx) { - if (Context.SenderSystem.Token == null) + ctx.CheckSystem(); + + if (ctx.System.Token == null) { // If we don't have a token, call the other method instead // This does pretty much the same thing, except words the messages more appropriately for that :) - await GetToken(); + await GetToken(ctx); return; } // Make a new token from scratch - var token = await MakeAndSetNewToken(); + var token = await MakeAndSetNewToken(ctx.System); // If we're not already in a DM, reply with a reminder to check - if (!(Context.Channel is IDMChannel)) + if (!(ctx.Channel is IDMChannel)) { - await Context.Channel.SendMessageAsync($"{Emojis.Success} Check your DMs!"); + await ctx.Reply($"{Emojis.Success} Check your DMs!"); } // DM the user an invalidation disclaimer, and then the token in a separate message (for easy copying on mobile) - await Context.User.SendMessageAsync($"{Emojis.Warn} Your previous API token has been invalidated. You will need to change it anywhere it's currently used.\n\nYour token is below:"); - await Context.User.SendMessageAsync(token); + await ctx.Author.SendMessageAsync($"{Emojis.Warn} Your previous API token has been invalidated. You will need to change it anywhere it's currently used.\n\nYour token is below:"); + await ctx.Author.SendMessageAsync(token); } } } \ No newline at end of file diff --git a/PluralKit.Bot/Commands/CommandTree.cs b/PluralKit.Bot/Commands/CommandTree.cs new file mode 100644 index 00000000..3c92d3af --- /dev/null +++ b/PluralKit.Bot/Commands/CommandTree.cs @@ -0,0 +1,285 @@ +using System.Linq; +using System.Threading.Tasks; + +using Discord; + +using PluralKit.Bot.CommandSystem; + +namespace PluralKit.Bot.Commands +{ + public class CommandTree + { + public static Command SystemInfo = new Command("system", "system [system]", "uwu"); + public static Command SystemNew = new Command("system new", "system new [name]", "uwu"); + public static Command SystemRename = new Command("system name", "system rename [name]", "uwu"); + public static Command SystemDesc = new Command("system description", "system description [description]", "uwu"); + public static Command SystemTag = new Command("system tag", "system tag [tag]", "uwu"); + public static Command SystemAvatar = new Command("system avatar", "system avatar [url|@mention]", "uwu"); + public static Command SystemDelete = new Command("system delete", "system delete", "uwu"); + public static Command SystemTimezone = new Command("system timezone", "system timezone [timezone]", "uwu"); + public static Command SystemList = new Command("system list", "system list [full]", "uwu"); + public static Command SystemFronter = new Command("system fronter", "system fronter", "uwu"); + public static Command SystemFrontHistory = new Command("system fronthistory", "system fronthistory", "uwu"); + public static Command SystemFrontPercent = new Command("system frontpercent", "system frontpercent [timespan]", "uwu"); + public static Command MemberInfo = new Command("member", "member ", "uwu"); + public static Command MemberNew = new Command("member new", "member new ", "uwu"); + public static Command MemberRename = new Command("member rename", "member rename ", "uwu"); + public static Command MemberDesc = new Command("member description", "member description [description]", "uwu"); + public static Command MemberPronouns = new Command("member pronouns", "member pronouns [pronouns]", "uwu"); + public static Command MemberColor = new Command("member color", "member color [color]", "uwu"); + public static Command MemberBirthday = new Command("member birthday", "member birthday [birthday]", "uwu"); + public static Command MemberProxy = new Command("member proxy", "member proxy [example proxy]", "uwu"); + public static Command MemberDelete = new Command("member delete", "member delete", "uwu"); + public static Command MemberAvatar = new Command("member avatar", "member avatar [url|@mention]", "uwu"); + public static Command MemberDisplayName = new Command("member displayname", "member displayname [display name]", "uwu"); + public static Command Switch = new Command("switch", "switch [member 2] [member 3...]", "uwu"); + public static Command SwitchOut = new Command("switch out", "switch out", "uwu"); + public static Command SwitchMove = new Command("switch move", "switch move ", "uwu"); + public static Command SwitchDelete = new Command("switch delete", "switch delete", "uwu"); + public static Command Link = new Command("link", "link ", "uwu"); + public static Command Unlink = new Command("unlink", "unlink [account]", "uwu"); + public static Command TokenGet = new Command("token", "token", "uwu"); + public static Command TokenRefresh = new Command("token refresh", "token refresh", "uwu"); + public static Command Import = new Command("import", "import [fileurl]", "uwu"); + public static Command Export = new Command("export", "export", "uwu"); + public static Command HelpCommandList = new Command("commands", "commands", "uwu"); + public static Command HelpProxy = new Command("help proxy", "help proxy", "uwu"); + public static Command Help = new Command("help", "help", "uwu"); + public static Command Message = new Command("message", "message ", "uwu"); + public static Command Log = new Command("log", "log ", "uwu"); + public static Command Invite = new Command("invite", "invite", "uwu"); + public static Command PermCheck = new Command("permcheck", "permcheck ", "uwu"); + + private IDiscordClient _client; + + public CommandTree(IDiscordClient client) + { + _client = client; + } + + public Task ExecuteCommand(Context ctx) + { + if (ctx.Match("system", "s")) + return HandleSystemCommand(ctx); + if (ctx.Match("member", "m")) + return HandleMemberCommand(ctx); + if (ctx.Match("switch", "sw")) + return HandleSwitchCommand(ctx); + if (ctx.Match("link")) + return ctx.Execute(Link, m => m.LinkSystem(ctx)); + if (ctx.Match("unlink")) + return ctx.Execute(Unlink, m => m.UnlinkAccount(ctx)); + if (ctx.Match("token")) + if (ctx.Match("refresh", "renew", "invalidate", "reroll", "regen")) + return ctx.Execute(TokenRefresh, m => m.RefreshToken(ctx)); + else + return ctx.Execute(TokenGet, m => m.GetToken(ctx)); + if (ctx.Match("import")) + return ctx.Execute(Import, m => m.Import(ctx)); + if (ctx.Match("export")) + return ctx.Execute(Export, m => m.Export(ctx)); + if (ctx.Match("help")) + if (ctx.Match("commands")) + return ctx.Execute(HelpCommandList, m => m.CommandList(ctx)); + else if (ctx.Match("proxy")) + return ctx.Execute(HelpProxy, m => m.HelpProxy(ctx)); + else return ctx.Execute(Help, m => m.HelpRoot(ctx)); + if (ctx.Match("commands")) + return ctx.Execute(HelpCommandList, m => m.CommandList(ctx)); + if (ctx.Match("message", "msg")) + return ctx.Execute(Message, m => m.GetMessage(ctx)); + if (ctx.Match("log")) + return ctx.Execute(Log, m => m.SetLogChannel(ctx)); + if (ctx.Match("invite")) return ctx.Execute(Invite, m => m.Invite(ctx)); + if (ctx.Match("mn")) return ctx.Execute(null, m => m.Mn(ctx)); + if (ctx.Match("fire")) return ctx.Execute(null, m => m.Fire(ctx)); + if (ctx.Match("thunder")) return ctx.Execute(null, m => m.Thunder(ctx)); + if (ctx.Match("freeze")) return ctx.Execute(null, m => m.Freeze(ctx)); + if (ctx.Match("starstorm")) return ctx.Execute(null, m => m.Starstorm(ctx)); + if (ctx.Match("stats")) return ctx.Execute(null, m => m.Stats(ctx)); + if (ctx.Match("permcheck")) + return ctx.Execute(PermCheck, m => m.PermCheckGuild(ctx)); + + ctx.Reply( + $"{Emojis.Error} Unknown command `{ctx.PeekArgument().Sanitize()}`. For a list of possible commands, see ."); + return Task.CompletedTask; + } + + private async Task HandleSystemCommand(Context ctx) + { + // If we have no parameters, default to self-target + if (!ctx.HasNext()) + await ctx.Execute(SystemInfo, m => m.Query(ctx, ctx.System)); + + // First, we match own-system-only commands (ie. no target system parameter) + else if (ctx.Match("new", "create", "make", "add", "register", "init")) + await ctx.Execute(SystemNew, m => m.New(ctx)); + else if (ctx.Match("name", "rename", "changename")) + await ctx.Execute(SystemRename, m => m.Name(ctx)); + else if (ctx.Match("tag")) + await ctx.Execute(SystemTag, m => m.Tag(ctx)); + else if (ctx.Match("description", "desc", "bio")) + await ctx.Execute(SystemDesc, m => m.Description(ctx)); + else if (ctx.Match("avatar", "picture", "icon", "image", "pic", "pfp")) + await ctx.Execute(SystemAvatar, m => m.SystemAvatar(ctx)); + else if (ctx.Match("delete", "remove", "destroy", "erase", "yeet")) + await ctx.Execute(SystemDelete, m => m.Delete(ctx)); + else if (ctx.Match("timezone", "tz")) + await ctx.Execute(SystemTimezone, m => m.SystemTimezone(ctx)); + else if (ctx.Match("list", "l", "members")) + { + if (ctx.Match("f", "full", "big", "details", "long")) + await ctx.Execute(SystemList, m => m.MemberLongList(ctx, ctx.System)); + else + await ctx.Execute(SystemList, m => m.MemberShortList(ctx, ctx.System)); + } + else if (ctx.Match("f", "front", "fronter", "fronters")) + { + if (ctx.Match("h", "history")) + await ctx.Execute(SystemFrontHistory, m => m.SystemFrontHistory(ctx, ctx.System)); + else if (ctx.Match("p", "percent", "%")) + await ctx.Execute(SystemFrontPercent, m => m.SystemFrontPercent(ctx, ctx.System)); + else + await ctx.Execute(SystemFronter, m => m.SystemFronter(ctx, ctx.System)); + } + else if (ctx.Match("fh", "fronthistory", "history", "switches")) + await ctx.Execute(SystemFrontHistory, m => m.SystemFrontHistory(ctx, ctx.System)); + else if (ctx.Match("fp", "frontpercent", "front%", "frontbreakdown")) + await ctx.Execute(SystemFrontPercent, m => m.SystemFrontPercent(ctx, ctx.System)); + else if (!ctx.HasNext()) // Bare command + await ctx.Execute(SystemInfo, m => m.Query(ctx, ctx.System)); + else + await HandleSystemCommandTargeted(ctx); + } + + private async Task HandleSystemCommandTargeted(Context ctx) + { + // Commands that have a system target (eg. pk;system fronthistory) + var target = await ctx.MatchSystem(); + if (target == null) + { + var list = CreatePotentialCommandList(SystemInfo, SystemNew, SystemRename, SystemTag, SystemDesc, SystemAvatar, SystemDelete, SystemTimezone, SystemList, SystemFronter, SystemFrontHistory, SystemFrontPercent); + await ctx.Reply( + $"{Emojis.Error} {await CreateSystemNotFoundError(ctx)}\n\nPerhaps you meant to use one of the following commands?\n{list}"); + } + else if (ctx.Match("list", "l", "members")) + { + if (ctx.Match("f", "full", "big", "details", "long")) + await ctx.Execute(SystemList, m => m.MemberLongList(ctx, target)); + else + await ctx.Execute(SystemList, m => m.MemberShortList(ctx, target)); + } + else if (ctx.Match("f", "front", "fronter", "fronters")) + { + if (ctx.Match("h", "history")) + await ctx.Execute(SystemFrontHistory, m => m.SystemFrontHistory(ctx, target)); + else if (ctx.Match("p", "percent", "%")) + await ctx.Execute(SystemFrontPercent, m => m.SystemFrontPercent(ctx, target)); + else + await ctx.Execute(SystemFronter, m => m.SystemFronter(ctx, target)); + } + else if (ctx.Match("fh", "fronthistory", "history", "switches")) + await ctx.Execute(SystemFrontHistory, m => m.SystemFrontHistory(ctx, target)); + else if (ctx.Match("fp", "frontpercent", "front%", "frontbreakdown")) + await ctx.Execute(SystemFrontPercent, m => m.SystemFrontPercent(ctx, target)); + else if (ctx.Match("info", "view", "show")) + await ctx.Execute(SystemInfo, m => m.Query(ctx, target)); + else if (!ctx.HasNext()) + await ctx.Execute(SystemInfo, m => m.Query(ctx, target)); + else + await PrintCommandNotFoundError(ctx, SystemList, SystemFronter, SystemFrontHistory, SystemFrontPercent, + SystemInfo); + } + + private async Task HandleMemberCommand(Context ctx) + { + if (ctx.Match("new", "n", "add", "create", "register")) + await ctx.Execute(MemberNew, m => m.NewMember(ctx)); + else if (await ctx.MatchMember() is PKMember target) + await HandleMemberCommandTargeted(ctx, target); + else if (!ctx.HasNext()) + await PrintCommandExpectedError(ctx, MemberNew, MemberInfo, MemberRename, MemberDisplayName, MemberDesc, MemberPronouns, + MemberColor, MemberBirthday, MemberProxy, MemberDelete, MemberAvatar); + else + await ctx.Reply($"{Emojis.Error} {ctx.CreateMemberNotFoundError(ctx.PopArgument())}"); + } + + private async Task HandleMemberCommandTargeted(Context ctx, PKMember target) + { + // Commands that have a member target (eg. pk;member delete) + if (ctx.Match("rename", "name", "changename", "setname")) + await ctx.Execute(MemberRename, m => m.RenameMember(ctx, target)); + else if (ctx.Match("description", "info", "bio", "text", "desc")) + await ctx.Execute(MemberDesc, m => m.MemberDescription(ctx, target)); + else if (ctx.Match("pronouns", "pronoun")) + await ctx.Execute(MemberPronouns, m => m.MemberPronouns(ctx, target)); + else if (ctx.Match("color", "colour")) + await ctx.Execute(MemberColor, m => m.MemberColor(ctx, target)); + else if (ctx.Match("birthday", "bday", "birthdate", "cakeday", "bdate")) + await ctx.Execute(MemberBirthday, m => m.MemberBirthday(ctx, target)); + else if (ctx.Match("proxy", "tags", "proxytags", "brackets")) + await ctx.Execute(MemberProxy, m => m.MemberProxy(ctx, target)); + else if (ctx.Match("delete", "remove", "destroy", "erase", "yeet")) + await ctx.Execute(MemberDelete, m => m.MemberDelete(ctx, target)); + else if (ctx.Match("avatar", "profile", "picture", "icon", "image", "pfp", "pic")) + await ctx.Execute(MemberAvatar, m => m.MemberAvatar(ctx, target)); + else if (ctx.Match("displayname", "dn", "dname", "nick", "nickname")) + await ctx.Execute(MemberDisplayName, m => m.MemberDisplayName(ctx, target)); + else if (!ctx.HasNext()) // Bare command + await ctx.Execute(MemberInfo, m => m.ViewMember(ctx, target)); + else + await PrintCommandNotFoundError(ctx, MemberInfo, MemberRename, MemberDisplayName, MemberDesc, MemberPronouns, MemberColor, MemberBirthday, MemberProxy, MemberDelete, MemberAvatar, SystemList); + } + + private async Task HandleSwitchCommand(Context ctx) + { + if (ctx.Match("out")) + await ctx.Execute(SwitchOut, m => m.SwitchOut(ctx)); + else if (ctx.Match("move", "shift", "offset")) + await ctx.Execute(SwitchMove, m => m.SwitchMove(ctx)); + else if (ctx.Match("delete", "remove", "erase", "cancel", "yeet")) + await ctx.Execute(SwitchDelete, m => m.SwitchDelete(ctx)); + else if (ctx.HasNext()) // there are following arguments + await ctx.Execute(Switch, m => m.Switch(ctx)); + else + await PrintCommandNotFoundError(ctx, Switch, SwitchOut, SwitchMove, SwitchDelete, SystemFronter, SystemFrontHistory); + } + + private async Task PrintCommandNotFoundError(Context ctx, params Command[] potentialCommands) + { + var commandListStr = CreatePotentialCommandList(potentialCommands); + await ctx.Reply( + $"{Emojis.Error} Unknown command `pk;{ctx.FullCommand}`. Perhaps you meant to use one of the following commands?\n{commandListStr}\n\nFor a full list of possible commands, see ."); + } + + private async Task PrintCommandExpectedError(Context ctx, params Command[] potentialCommands) + { + var commandListStr = CreatePotentialCommandList(potentialCommands); + await ctx.Reply( + $"{Emojis.Error} You need to pass a command. Perhaps you meant to use one of the following commands?\n{commandListStr}\n\nFor a full list of possible commands, see ."); + } + + private static string CreatePotentialCommandList(params Command[] potentialCommands) + { + return string.Join("\n", potentialCommands.Select(cmd => $"- `pk;{cmd.Usage}`")); + } + + private async Task CreateSystemNotFoundError(Context ctx) + { + var input = ctx.PopArgument(); + if (input.TryParseMention(out var id)) + { + // Try to resolve the user ID to find the associated account, + // so we can print their username. + var user = await _client.GetUserAsync(id); + + // Print descriptive errors based on whether we found the user or not. + if (user == null) + return $"Account with ID `{id}` not found."; + return $"Account **{user.Username}#{user.Discriminator}** does not have a system registered."; + } + + return $"System with ID `{input}` not found."; + } + } +} \ No newline at end of file diff --git a/PluralKit.Bot/Commands/HelpCommands.cs b/PluralKit.Bot/Commands/HelpCommands.cs index 7e0136a9..98dd712c 100644 --- a/PluralKit.Bot/Commands/HelpCommands.cs +++ b/PluralKit.Bot/Commands/HelpCommands.cs @@ -1,56 +1,43 @@ using System.Threading.Tasks; using Discord; -using Discord.Commands; + +using PluralKit.Bot.CommandSystem; namespace PluralKit.Bot.Commands { - public class HelpCommands: ModuleBase + public class HelpCommands { - [Group("help")] - public class HelpGroup: ModuleBase + public async Task HelpProxy(Context ctx) { - [Command("proxy")] - [Priority(1)] - [Remarks("help proxy")] - public async Task HelpProxy() - { - await Context.Channel.SendMessageAsync( - "The proxy help page has been moved! See the website: https://pluralkit.me/guide#proxying"); - } - - [Command("member")] - [Priority(1)] - [Remarks("help member")] - public async Task HelpMember() - { - await Context.Channel.SendMessageAsync( - "The member help page has been moved! See the website: https://pluralkit.me/guide#member-management"); - } - - [Command] - [Remarks("help")] - public async Task HelpRoot([Remainder] string _ignored = null) - { - await Context.Channel.SendMessageAsync(embed: new EmbedBuilder() - .WithTitle("PluralKit") - .WithDescription("PluralKit is a bot designed for plural communities on Discord. It allows you to register systems, maintain system information, set up message proxying, log switches, and more.") - .AddField("What is this for? What are systems?", "This bot detects messages with certain tags associated with a profile, then replaces that message under a \"pseudo-account\" of that profile using webhooks. This is useful for multiple people sharing one body (aka \"systems\"), people who wish to roleplay as different characters without having several accounts, or anyone else who may want to post messages as a different person from the same account.") - .AddField("Why are people's names saying [BOT] next to them?", "These people are not actually bots, this is just a Discord limitation. See [the documentation](https://pluralkit.me/guide#proxying) for an in-depth explanation.") - .AddField("How do I get started?", "To get started using PluralKit, try running the following commands (of course replacing the relevant names with your own):\n**1**. `pk;system new` - Create a system (if you haven't already)\n**2**. `pk;member add John` - Add a new member to your system\n**3**. `pk;member John proxy [text]` - Set up [square brackets] as proxy tags\n**4**. You're done! You can now type [a message in brackets] and it'll be proxied appropriately.\n**5**. Optionally, you may set an avatar from the URL of an image with `pk;member John avatar [link to image]`, or from a file by typing `pk;member John avatar` and sending the message with an attached image.\n\nSee [the documentation](https://pluralkit.me/guide#member-management) for more information.") - .AddField("Useful tips", $"React with {Emojis.Error} on a proxied message to delete it (only if you sent it!)\nReact with {Emojis.RedQuestion} on a proxied message to look up information about it (like who sent it)\nType **`pk;invite`** to get a link to invite this bot to your own server!") - .AddField("More information", "For a full list of commands, see [the command list](https://pluralkit.me/commands).\nFor a more in-depth explanation of message proxying, see [the documentation](https://pluralkit.me/guide#proxying).\nIf you're an existing user of Tupperbox, type `pk;import` and attach a Tupperbox export file (from `tul!export`) to import your data from there.") - .AddField("Support server", "We also have a Discord server for support, discussion, suggestions, announcements, etc: https://discord.gg/PczBt78") - .WithFooter("By @Ske#6201 | GitHub: https://github.com/xSke/PluralKit/ | Website: https://pluralkit.me/") - .WithColor(Color.Blue) - .Build()); - } + await ctx.Reply( + "The proxy help page has been moved! See the website: https://pluralkit.me/guide#proxying"); } - - [Command("commands")] - [Remarks("commands")] - public async Task CommandList() + + public async Task HelpMember(Context ctx) { - await Context.Channel.SendMessageAsync( + await ctx.Reply( + "The member help page has been moved! See the website: https://pluralkit.me/guide#member-management"); + } + + public async Task HelpRoot(Context ctx) + { + await ctx.Reply(embed: new EmbedBuilder() + .WithTitle("PluralKit") + .WithDescription("PluralKit is a bot designed for plural communities on Discord. It allows you to register systems, maintain system information, set up message proxying, log switches, and more.") + .AddField("What is this for? What are systems?", "This bot detects messages with certain tags associated with a profile, then replaces that message under a \"pseudo-account\" of that profile using webhooks. This is useful for multiple people sharing one body (aka \"systems\"), people who wish to roleplay as different characters without having several accounts, or anyone else who may want to post messages as a different person from the same account.") + .AddField("Why are people's names saying [BOT] next to them?", "These people are not actually bots, this is just a Discord limitation. See [the documentation](https://pluralkit.me/guide#proxying) for an in-depth explanation.") + .AddField("How do I get started?", "To get started using PluralKit, try running the following commands (of course replacing the relevant names with your own):\n**1**. `pk;system new` - Create a system (if you haven't already)\n**2**. `pk;member add John` - Add a new member to your system\n**3**. `pk;member John proxy [text]` - Set up [square brackets] as proxy tags\n**4**. You're done! You can now type [a message in brackets] and it'll be proxied appropriately.\n**5**. Optionally, you may set an avatar from the URL of an image with `pk;member John avatar [link to image]`, or from a file by typing `pk;member John avatar` and sending the message with an attached image.\n\nSee [the documentation](https://pluralkit.me/guide#member-management) for more information.") + .AddField("Useful tips", $"React with {Emojis.Error} on a proxied message to delete it (only if you sent it!)\nReact with {Emojis.RedQuestion} on a proxied message to look up information about it (like who sent it)\nType **`pk;invite`** to get a link to invite this bot to your own server!") + .AddField("More information", "For a full list of commands, see [the command list](https://pluralkit.me/commands).\nFor a more in-depth explanation of message proxying, see [the documentation](https://pluralkit.me/guide#proxying).\nIf you're an existing user of Tupperbox, type `pk;import` and attach a Tupperbox export file (from `tul!export`) to import your data from there.") + .AddField("Support server", "We also have a Discord server for support, discussion, suggestions, announcements, etc: https://discord.gg/PczBt78") + .WithFooter("By @Ske#6201 | GitHub: https://github.com/xSke/PluralKit/ | Website: https://pluralkit.me/") + .WithColor(Color.Blue) + .Build()); + } + + public async Task CommandList(Context ctx) + { + await ctx.Reply( "The command list has been moved! See the website: https://pluralkit.me/commands"); } } diff --git a/PluralKit.Bot/Commands/ImportExportCommands.cs b/PluralKit.Bot/Commands/ImportExportCommands.cs index 4969da82..1d138601 100644 --- a/PluralKit.Bot/Commands/ImportExportCommands.cs +++ b/PluralKit.Bot/Commands/ImportExportCommands.cs @@ -5,24 +5,27 @@ using System.Net.Http; using System.Text; using System.Threading.Tasks; using Discord; -using Discord.Commands; using Discord.Net; using Newtonsoft.Json; +using PluralKit.Bot.CommandSystem; + namespace PluralKit.Bot.Commands { - public class ImportExportCommands : ModuleBase + public class ImportExportCommands { - public DataFileService DataFiles { get; set; } - - [Command("import")] - [Remarks("import [fileurl]")] - public async Task Import([Remainder] string url = null) + private DataFileService _dataFiles; + public ImportExportCommands(DataFileService dataFiles) { - if (url == null) url = Context.Message.Attachments.FirstOrDefault()?.Url; + _dataFiles = dataFiles; + } + + public async Task Import(Context ctx) + { + var url = ctx.RemainderOrNull() ?? ctx.Message.Attachments.FirstOrDefault()?.Url; if (url == null) throw Errors.NoImportFilePassed; - await Context.BusyIndicator(async () => + await ctx.BusyIndicator(async () => { using (var client = new HttpClient()) { @@ -74,8 +77,8 @@ namespace PluralKit.Bot.Commands issueStr += "\n- PluralKit does not support per-member system tags. Since you had multiple members with distinct tags, tags will not be imported. You can set your system tag using the `pk;system tag ` command later."; - var msg = await Context.Channel.SendMessageAsync($"{issueStr}\n\nDo you want to proceed with the import?"); - if (!await Context.PromptYesNo(msg)) throw Errors.ImportCancelled; + var msg = await ctx.Reply($"{issueStr}\n\nDo you want to proceed with the import?"); + if (!await ctx.PromptYesNo(msg)) throw Errors.ImportCancelled; } data = res.System; @@ -89,37 +92,36 @@ namespace PluralKit.Bot.Commands if (!data.Valid) throw Errors.InvalidImportFile; - if (data.LinkedAccounts != null && !data.LinkedAccounts.Contains(Context.User.Id)) + if (data.LinkedAccounts != null && !data.LinkedAccounts.Contains(ctx.Author.Id)) { - var msg = await Context.Channel.SendMessageAsync($"{Emojis.Warn} You seem to importing a system profile belonging to another account. Are you sure you want to proceed?"); - if (!await Context.PromptYesNo(msg)) throw Errors.ImportCancelled; + var msg = await ctx.Reply($"{Emojis.Warn} You seem to importing a system profile belonging to another account. Are you sure you want to proceed?"); + if (!await ctx.PromptYesNo(msg)) throw Errors.ImportCancelled; } // If passed system is null, it'll create a new one // (and that's okay!) - var result = await DataFiles.ImportSystem(data, Context.SenderSystem, Context.User.Id); + var result = await _dataFiles.ImportSystem(data, ctx.System, ctx.Author.Id); - if (Context.SenderSystem == null) + if (ctx.System != null) { - await Context.Channel.SendMessageAsync($"{Emojis.Success} PluralKit has created a system for you based on the given file. Your system ID is `{result.System.Hid}`. Type `pk;system` for more information."); + await ctx.Reply($"{Emojis.Success} PluralKit has created a system for you based on the given file. Your system ID is `{result.System.Hid}`. Type `pk;system` for more information."); } else { - await Context.Channel.SendMessageAsync($"{Emojis.Success} Updated {result.ModifiedNames.Count} members, created {result.AddedNames.Count} members. Type `pk;system list` to check!"); + await ctx.Reply($"{Emojis.Success} Updated {result.ModifiedNames.Count} members, created {result.AddedNames.Count} members. Type `pk;system list` to check!"); } } }); } - - [Command("export")] - [Remarks("export")] - [MustHaveSystem] - public async Task Export() + + public async Task Export(Context ctx) { - var json = await Context.BusyIndicator(async () => + ctx.CheckSystem(); + + var json = await ctx.BusyIndicator(async () => { // Make the actual data file - var data = await DataFiles.ExportSystem(Context.SenderSystem); + var data = await _dataFiles.ExportSystem(ctx.System); return JsonConvert.SerializeObject(data, Formatting.None); }); @@ -129,16 +131,16 @@ namespace PluralKit.Bot.Commands try { - await Context.User.SendFileAsync(stream, "system.json", $"{Emojis.Success} Here you go!"); + await ctx.Author.SendFileAsync(stream, "system.json", $"{Emojis.Success} Here you go!"); // If the original message wasn't posted in DMs, send a public reminder - if (!(Context.Channel is IDMChannel)) - await Context.Channel.SendMessageAsync($"{Emojis.Success} Check your DMs!"); + if (!(ctx.Channel is IDMChannel)) + await ctx.Reply($"{Emojis.Success} Check your DMs!"); } catch (HttpException) { // If user has DMs closed, tell 'em to open them - await Context.Channel.SendMessageAsync( + await ctx.Reply( $"{Emojis.Error} Could not send the data file in your DMs. Do you have DMs closed?"); } } diff --git a/PluralKit.Bot/Commands/LinkCommands.cs b/PluralKit.Bot/Commands/LinkCommands.cs index cae4e3c6..cd7b0f05 100644 --- a/PluralKit.Bot/Commands/LinkCommands.cs +++ b/PluralKit.Bot/Commands/LinkCommands.cs @@ -1,50 +1,57 @@ using System.Linq; using System.Threading.Tasks; using Discord; -using Discord.Commands; + +using PluralKit.Bot.CommandSystem; namespace PluralKit.Bot.Commands { - public class LinkCommands: ModuleBase + public class LinkCommands { - public SystemStore Systems { get; set; } + private SystemStore _systems; - - [Command("link")] - [Remarks("link ")] - [MustHaveSystem] - public async Task LinkSystem(IUser account) + public LinkCommands(SystemStore systems) { - var accountIds = await Systems.GetLinkedAccountIds(Context.SenderSystem); + _systems = systems; + } + + public async Task LinkSystem(Context ctx) + { + ctx.CheckSystem(); + + var account = await ctx.MatchUser() ?? throw new PKSyntaxError("You must pass an account to link with (either ID or @mention)."); + var accountIds = await _systems.GetLinkedAccountIds(ctx.System); if (accountIds.Contains(account.Id)) throw Errors.AccountAlreadyLinked; - var existingAccount = await Systems.GetByAccount(account.Id); + var existingAccount = await _systems.GetByAccount(account.Id); if (existingAccount != null) throw Errors.AccountInOtherSystem(existingAccount); - var msg = await Context.Channel.SendMessageAsync( - $"{account.Mention}, please confirm the link by clicking the {Emojis.Success} reaction on this message."); - if (!await Context.PromptYesNo(msg, user: account)) throw Errors.MemberLinkCancelled; - await Systems.Link(Context.SenderSystem, account.Id); - await Context.Channel.SendMessageAsync($"{Emojis.Success} Account linked to system."); + var msg = await ctx.Reply($"{account.Mention}, please confirm the link by clicking the {Emojis.Success} reaction on this message."); + if (!await ctx.PromptYesNo(msg, user: account)) throw Errors.MemberLinkCancelled; + await _systems.Link(ctx.System, account.Id); + await ctx.Reply($"{Emojis.Success} Account linked to system."); } - [Command("unlink")] - [Remarks("unlink [account]")] - [MustHaveSystem] - public async Task UnlinkAccount(IUser account = null) + public async Task UnlinkAccount(Context ctx) { - if (account == null) account = Context.User; + ctx.CheckSystem(); - var accountIds = (await Systems.GetLinkedAccountIds(Context.SenderSystem)).ToList(); + IUser account; + if (!ctx.HasNext()) + account = ctx.Author; + else + account = await ctx.MatchUser() ?? throw new PKSyntaxError("You must pass an account to link with (either ID or @mention)."); + + var accountIds = (await _systems.GetLinkedAccountIds(ctx.System)).ToList(); if (!accountIds.Contains(account.Id)) throw Errors.AccountNotLinked; if (accountIds.Count == 1) throw Errors.UnlinkingLastAccount; - var msg = await Context.Channel.SendMessageAsync( + var msg = await ctx.Reply( $"Are you sure you want to unlink {account.Mention} from your system?"); - if (!await Context.PromptYesNo(msg)) throw Errors.MemberUnlinkCancelled; + if (!await ctx.PromptYesNo(msg)) throw Errors.MemberUnlinkCancelled; - await Systems.Unlink(Context.SenderSystem, account.Id); - await Context.Channel.SendMessageAsync($"{Emojis.Success} Account unlinked."); + await _systems.Unlink(ctx.System, account.Id); + await ctx.Reply($"{Emojis.Success} Account unlinked."); } } } \ No newline at end of file diff --git a/PluralKit.Bot/Commands/MemberCommands.cs b/PluralKit.Bot/Commands/MemberCommands.cs index 3209dcd6..4ec176d6 100644 --- a/PluralKit.Bot/Commands/MemberCommands.cs +++ b/PluralKit.Bot/Commands/MemberCommands.cs @@ -2,167 +2,170 @@ using System.Linq; using System.Text.RegularExpressions; using System.Threading.Tasks; using Discord; -using Discord.Commands; using NodaTime; + +using PluralKit.Bot.CommandSystem; using PluralKit.Core; namespace PluralKit.Bot.Commands { - [Group("member")] - [Alias("m")] - public class MemberCommands : ContextParameterModuleBase + public class MemberCommands { - public SystemStore Systems { get; set; } - public MemberStore Members { get; set; } - public EmbedService Embeds { get; set; } - - public ProxyCacheService ProxyCache { get; set; } + private SystemStore _systems; + private MemberStore _members; + private EmbedService _embeds; - public override string Prefix => "member"; - public override string ContextNoun => "member"; + private ProxyCacheService _proxyCache; - [Command("new")] - [Alias("n", "add", "create", "register")] - [Remarks("member new ")] - [MustHaveSystem] - public async Task NewMember([Remainder] string memberName) { + public MemberCommands(SystemStore systems, MemberStore members, EmbedService embeds, ProxyCacheService proxyCache) + { + _systems = systems; + _members = members; + _embeds = embeds; + _proxyCache = proxyCache; + } + + public async Task NewMember(Context ctx) { + if (ctx.System == null) throw Errors.NoSystemError; + var memberName = ctx.RemainderOrNull() ?? throw new PKSyntaxError("You must pass a member name."); + // Hard name length cap if (memberName.Length > Limits.MaxMemberNameLength) throw Errors.MemberNameTooLongError(memberName.Length); // Warn if member name will be unproxyable (with/without tag) - if (memberName.Length > Context.SenderSystem.MaxMemberNameLength) { - var msg = await Context.Channel.SendMessageAsync($"{Emojis.Warn} Member name too long ({memberName.Length} > {Context.SenderSystem.MaxMemberNameLength} characters), this member will be unproxyable. Do you want to create it anyway? (You can change the name later, or set a member display name)"); - if (!await Context.PromptYesNo(msg)) throw new PKError("Member creation cancelled."); + if (memberName.Length > ctx.System.MaxMemberNameLength) { + var msg = await ctx.Reply($"{Emojis.Warn} Member name too long ({memberName.Length} > {ctx.System.MaxMemberNameLength} characters), this member will be unproxyable. Do you want to create it anyway? (You can change the name later, or set a member display name)"); + if (!await ctx.PromptYesNo(msg)) throw new PKError("Member creation cancelled."); } // Warn if there's already a member by this name - var existingMember = await Members.GetByName(Context.SenderSystem, memberName); + var existingMember = await _members.GetByName(ctx.System, memberName); if (existingMember != null) { - var msg = await Context.Channel.SendMessageAsync($"{Emojis.Warn} You already have a member in your system with the name \"{existingMember.Name.Sanitize()}\" (with ID `{existingMember.Hid}`). Do you want to create another member with the same name?"); - if (!await Context.PromptYesNo(msg)) throw new PKError("Member creation cancelled."); + var msg = await ctx.Reply($"{Emojis.Warn} You already have a member in your system with the name \"{existingMember.Name.Sanitize()}\" (with ID `{existingMember.Hid}`). Do you want to create another member with the same name?"); + if (!await ctx.PromptYesNo(msg)) throw new PKError("Member creation cancelled."); } // Create the member - var member = await Members.Create(Context.SenderSystem, memberName); + var member = await _members.Create(ctx.System, memberName); // Send confirmation and space hint - await Context.Channel.SendMessageAsync($"{Emojis.Success} Member \"{memberName.Sanitize()}\" (`{member.Hid}`) registered! See the user guide for commands for editing this member: https://pluralkit.me/guide#member-management"); - if (memberName.Contains(" ")) await Context.Channel.SendMessageAsync($"{Emojis.Note} Note that this member's name contains spaces. You will need to surround it with \"double quotes\" when using commands referring to it, or just use the member's 5-character ID (which is `{member.Hid}`)."); + await ctx.Reply($"{Emojis.Success} Member \"{memberName.Sanitize()}\" (`{member.Hid}`) registered! See the user guide for commands for editing this member: https://pluralkit.me/guide#member-management"); + if (memberName.Contains(" ")) await ctx.Reply($"{Emojis.Note} Note that this member's name contains spaces. You will need to surround it with \"double quotes\" when using commands referring to it, or just use the member's 5-character ID (which is `{member.Hid}`)."); - await ProxyCache.InvalidateResultsForSystem(Context.SenderSystem); + await _proxyCache.InvalidateResultsForSystem(ctx.System); } - - [Command("rename")] - [Alias("name", "changename", "setname")] - [Remarks("member rename ")] - [MustPassOwnMember] - public async Task RenameMember([Remainder] string newName) { + + public async Task RenameMember(Context ctx, PKMember target) { // TODO: this method is pretty much a 1:1 copy/paste of the above creation method, find a way to clean? + if (ctx.System == null) throw Errors.NoSystemError; + if (target.System != ctx.System.Id) throw Errors.NotOwnMemberError; + + var newName = ctx.RemainderOrNull(); // Hard name length cap if (newName.Length > Limits.MaxMemberNameLength) throw Errors.MemberNameTooLongError(newName.Length); // Warn if member name will be unproxyable (with/without tag), only if member doesn't have a display name - if (ContextEntity.DisplayName == null && newName.Length > Context.SenderSystem.MaxMemberNameLength) { - var msg = await Context.Channel.SendMessageAsync($"{Emojis.Warn} New member name too long ({newName.Length} > {Context.SenderSystem.MaxMemberNameLength} characters), this member will be unproxyable. Do you want to change it anyway? (You can set a member display name instead)"); - if (!await Context.PromptYesNo(msg)) throw new PKError("Member renaming cancelled."); + if (target.DisplayName == null && newName.Length > ctx.System.MaxMemberNameLength) { + var msg = await ctx.Reply($"{Emojis.Warn} New member name too long ({newName.Length} > {ctx.System.MaxMemberNameLength} characters), this member will be unproxyable. Do you want to change it anyway? (You can set a member display name instead)"); + if (!await ctx.PromptYesNo(msg)) throw new PKError("Member renaming cancelled."); } // Warn if there's already a member by this name - var existingMember = await Members.GetByName(Context.SenderSystem, newName); + var existingMember = await _members.GetByName(ctx.System, newName); if (existingMember != null) { - var msg = await Context.Channel.SendMessageAsync($"{Emojis.Warn} You already have a member in your system with the name \"{existingMember.Name.Sanitize()}\" (`{existingMember.Hid}`). Do you want to rename this member to that name too?"); - if (!await Context.PromptYesNo(msg)) throw new PKError("Member renaming cancelled."); + var msg = await ctx.Reply($"{Emojis.Warn} You already have a member in your system with the name \"{existingMember.Name.Sanitize()}\" (`{existingMember.Hid}`). Do you want to rename this member to that name too?"); + if (!await ctx.PromptYesNo(msg)) throw new PKError("Member renaming cancelled."); } // Rename the member - ContextEntity.Name = newName; - await Members.Save(ContextEntity); + target.Name = newName; + await _members.Save(target); - await Context.Channel.SendMessageAsync($"{Emojis.Success} Member renamed."); - if (newName.Contains(" ")) await Context.Channel.SendMessageAsync($"{Emojis.Note} Note that this member's name now contains spaces. You will need to surround it with \"double quotes\" when using commands referring to it."); - if (ContextEntity.DisplayName != null) await Context.Channel.SendMessageAsync($"{Emojis.Note} Note that this member has a display name set (`{ContextEntity.DisplayName}`), and will be proxied using that name instead."); + await ctx.Reply($"{Emojis.Success} Member renamed."); + if (newName.Contains(" ")) await ctx.Reply($"{Emojis.Note} Note that this member's name now contains spaces. You will need to surround it with \"double quotes\" when using commands referring to it."); + if (target.DisplayName != null) await ctx.Reply($"{Emojis.Note} Note that this member has a display name set (`{target.DisplayName}`), and will be proxied using that name instead."); - await ProxyCache.InvalidateResultsForSystem(Context.SenderSystem); + await _proxyCache.InvalidateResultsForSystem(ctx.System); } + + public async Task MemberDescription(Context ctx, PKMember target) { + if (ctx.System == null) throw Errors.NoSystemError; + if (target.System != ctx.System.Id) throw Errors.NotOwnMemberError; - [Command("description")] - [Alias("info", "bio", "text", "desc")] - [Remarks("member description ")] - [MustPassOwnMember] - public async Task MemberDescription([Remainder] string description = null) { + var description = ctx.RemainderOrNull(); if (description.IsLongerThan(Limits.MaxDescriptionLength)) throw Errors.DescriptionTooLongError(description.Length); - ContextEntity.Description = description; - await Members.Save(ContextEntity); + target.Description = description; + await _members.Save(target); - await Context.Channel.SendMessageAsync($"{Emojis.Success} Member description {(description == null ? "cleared" : "changed")}."); + await ctx.Reply($"{Emojis.Success} Member description {(description == null ? "cleared" : "changed")}."); } + + public async Task MemberPronouns(Context ctx, PKMember target) { + if (ctx.System == null) throw Errors.NoSystemError; + if (target.System != ctx.System.Id) throw Errors.NotOwnMemberError; - [Command("pronouns")] - [Alias("pronoun")] - [Remarks("member pronouns ")] - [MustPassOwnMember] - public async Task MemberPronouns([Remainder] string pronouns = null) { + var pronouns = ctx.RemainderOrNull(); if (pronouns.IsLongerThan(Limits.MaxPronounsLength)) throw Errors.MemberPronounsTooLongError(pronouns.Length); - ContextEntity.Pronouns = pronouns; - await Members.Save(ContextEntity); + target.Pronouns = pronouns; + await _members.Save(target); - await Context.Channel.SendMessageAsync($"{Emojis.Success} Member pronouns {(pronouns == null ? "cleared" : "changed")}."); + await ctx.Reply($"{Emojis.Success} Member pronouns {(pronouns == null ? "cleared" : "changed")}."); } - [Command("color")] - [Alias("colour")] - [Remarks("member color ")] - [MustPassOwnMember] - public async Task MemberColor([Remainder] string color = null) + public async Task MemberColor(Context ctx, PKMember target) { + if (ctx.System == null) throw Errors.NoSystemError; + if (target.System != ctx.System.Id) throw Errors.NotOwnMemberError; + + var color = ctx.RemainderOrNull(); if (color != null) { if (color.StartsWith("#")) color = color.Substring(1); if (!Regex.IsMatch(color, "^[0-9a-fA-F]{6}$")) throw Errors.InvalidColorError(color); } - ContextEntity.Color = color; - await Members.Save(ContextEntity); + target.Color = color; + await _members.Save(target); - await Context.Channel.SendMessageAsync($"{Emojis.Success} Member color {(color == null ? "cleared" : "changed")}."); + await ctx.Reply($"{Emojis.Success} Member color {(color == null ? "cleared" : "changed")}."); } - [Command("birthday")] - [Alias("birthdate", "bday", "cakeday", "bdate")] - [Remarks("member birthday ")] - [MustPassOwnMember] - public async Task MemberBirthday([Remainder] string birthday = null) + public async Task MemberBirthday(Context ctx, PKMember target) { + if (ctx.System == null) throw Errors.NoSystemError; + if (target.System != ctx.System.Id) throw Errors.NotOwnMemberError; + LocalDate? date = null; + var birthday = ctx.RemainderOrNull(); if (birthday != null) { date = PluralKit.Utils.ParseDate(birthday, true); if (date == null) throw Errors.BirthdayParseError(birthday); } - ContextEntity.Birthday = date; - await Members.Save(ContextEntity); + target.Birthday = date; + await _members.Save(target); - await Context.Channel.SendMessageAsync($"{Emojis.Success} Member birthdate {(date == null ? "cleared" : $"changed to {ContextEntity.BirthdayString}")}."); + await ctx.Reply($"{Emojis.Success} Member birthdate {(date == null ? "cleared" : $"changed to {target.BirthdayString}")}."); } - [Command("proxy")] - [Alias("proxy", "tags", "proxytags", "brackets")] - [Remarks("member proxy ")] - [MustPassOwnMember] - public async Task MemberProxy([Remainder] string exampleProxy = null) + public async Task MemberProxy(Context ctx, PKMember target) { + if (ctx.System == null) throw Errors.NoSystemError; + if (target.System != ctx.System.Id) throw Errors.NotOwnMemberError; + // Handling the clear case in an if here to keep the body dedented + var exampleProxy = ctx.RemainderOrNull(); if (exampleProxy == null) { // Just reset and send OK message - ContextEntity.Prefix = null; - ContextEntity.Suffix = null; - await Members.Save(ContextEntity); - await Context.Channel.SendMessageAsync($"{Emojis.Success} Member proxy tags cleared."); + target.Prefix = null; + target.Suffix = null; + await _members.Save(target); + await ctx.Reply($"{Emojis.Success} Member proxy tags cleared."); return; } @@ -172,75 +175,83 @@ namespace PluralKit.Bot.Commands if (prefixAndSuffix.Length > 2) throw Errors.ProxyMultipleText; // If the prefix/suffix is empty, use "null" instead (for DB) - ContextEntity.Prefix = prefixAndSuffix[0].Length > 0 ? prefixAndSuffix[0] : null; - ContextEntity.Suffix = prefixAndSuffix[1].Length > 0 ? prefixAndSuffix[1] : null; - await Members.Save(ContextEntity); - await Context.Channel.SendMessageAsync($"{Emojis.Success} Member proxy tags changed to `{ContextEntity.ProxyString.Sanitize()}`. Try proxying now!"); + target.Prefix = prefixAndSuffix[0].Length > 0 ? prefixAndSuffix[0] : null; + target.Suffix = prefixAndSuffix[1].Length > 0 ? prefixAndSuffix[1] : null; + await _members.Save(target); + await ctx.Reply($"{Emojis.Success} Member proxy tags changed to `{target.ProxyString.Sanitize()}`. Try proxying now!"); - await ProxyCache.InvalidateResultsForSystem(Context.SenderSystem); + await _proxyCache.InvalidateResultsForSystem(ctx.System); } - [Command("delete")] - [Alias("remove", "destroy", "erase", "yeet")] - [Remarks("member delete")] - [MustPassOwnMember] - public async Task MemberDelete() + public async Task MemberDelete(Context ctx, PKMember target) { - await Context.Channel.SendMessageAsync($"{Emojis.Warn} Are you sure you want to delete \"{ContextEntity.Name.Sanitize()}\"? If so, reply to this message with the member's ID (`{ContextEntity.Hid}`). __***This cannot be undone!***__"); - if (!await Context.ConfirmWithReply(ContextEntity.Hid)) throw Errors.MemberDeleteCancelled; - await Members.Delete(ContextEntity); - await Context.Channel.SendMessageAsync($"{Emojis.Success} Member deleted."); + if (ctx.System == null) throw Errors.NoSystemError; + if (target.System != ctx.System.Id) throw Errors.NotOwnMemberError; - await ProxyCache.InvalidateResultsForSystem(Context.SenderSystem); - } - - [Command("avatar")] - [Alias("profile", "picture", "icon", "image", "pic", "pfp")] - [Remarks("member avatar ")] - [MustPassOwnMember] - public async Task MemberAvatarByMention(IUser member) - { - if (member.AvatarId == null) throw Errors.UserHasNoAvatar; - ContextEntity.AvatarUrl = member.GetAvatarUrl(ImageFormat.Png, size: 256); - await Members.Save(ContextEntity); + await ctx.Reply($"{Emojis.Warn} Are you sure you want to delete \"{target.Name.Sanitize()}\"? If so, reply to this message with the member's ID (`{target.Hid}`). __***This cannot be undone!***__"); + if (!await ctx.ConfirmWithReply(target.Hid)) throw Errors.MemberDeleteCancelled; + await _members.Delete(target); + await ctx.Reply($"{Emojis.Success} Member deleted."); - var embed = new EmbedBuilder().WithImageUrl(ContextEntity.AvatarUrl).Build(); - await Context.Channel.SendMessageAsync( - $"{Emojis.Success} Member avatar changed to {member.Username}'s avatar! {Emojis.Warn} Please note that if {member.Username} changes their avatar, the webhook's avatar will need to be re-set.", embed: embed); - - await ProxyCache.InvalidateResultsForSystem(Context.SenderSystem); - } - - [Command("avatar")] - [Alias("profile", "picture", "icon", "image", "pic", "pfp")] - [Remarks("member avatar ")] - [MustPassOwnMember] - public async Task MemberAvatar([Remainder] string avatarUrl = null) - { - string url = avatarUrl ?? Context.Message.Attachments.FirstOrDefault()?.ProxyUrl; - if (url != null) await Context.BusyIndicator(() => Utils.VerifyAvatarOrThrow(url)); - - ContextEntity.AvatarUrl = url; - await Members.Save(ContextEntity); - - var embed = url != null ? new EmbedBuilder().WithImageUrl(url).Build() : null; - await Context.Channel.SendMessageAsync($"{Emojis.Success} Member avatar {(url == null ? "cleared" : "changed")}.", embed: embed); - - await ProxyCache.InvalidateResultsForSystem(Context.SenderSystem); + await _proxyCache.InvalidateResultsForSystem(ctx.System); } - [Command("displayname")] - [Alias("nick", "nickname", "displayname")] - [Remarks("member displayname ")] - [MustPassOwnMember] - public async Task MemberDisplayName([Remainder] string newDisplayName = null) - { - // Refuse if proxy name will be unproxyable (with/without tag) - if (newDisplayName != null && newDisplayName.Length > Context.SenderSystem.MaxMemberNameLength) - throw Errors.DisplayNameTooLong(newDisplayName, Context.SenderSystem.MaxMemberNameLength); + public async Task MemberAvatar(Context ctx, PKMember target) + { + if (ctx.System == null) throw Errors.NoSystemError; + if (target.System != ctx.System.Id) throw Errors.NotOwnMemberError; - ContextEntity.DisplayName = newDisplayName; - await Members.Save(ContextEntity); + if (await ctx.MatchUser() is IUser user) + { + if (user.AvatarId == null) throw Errors.UserHasNoAvatar; + target.AvatarUrl = user.GetAvatarUrl(ImageFormat.Png, size: 256); + + await _members.Save(target); + + var embed = new EmbedBuilder().WithImageUrl(target.AvatarUrl).Build(); + await ctx.Reply( + $"{Emojis.Success} Member avatar changed to {user.Username}'s avatar! {Emojis.Warn} Please note that if {user.Username} changes their avatar, the webhook's avatar will need to be re-set.", embed: embed); + + } + else if (ctx.RemainderOrNull() is string url) + { + await Utils.VerifyAvatarOrThrow(url); + target.AvatarUrl = url; + await _members.Save(target); + + var embed = new EmbedBuilder().WithImageUrl(url).Build(); + await ctx.Reply($"{Emojis.Success} Member avatar changed.", embed: embed); + } + else if (ctx.Message.Attachments.FirstOrDefault() is Attachment attachment) + { + await Utils.VerifyAvatarOrThrow(attachment.Url); + target.AvatarUrl = attachment.Url; + await _members.Save(target); + + await ctx.Reply($"{Emojis.Success} Member avatar changed to attached image. Please note that if you delete the message containing the attachment, the avatar will stop working."); + } + else + { + target.AvatarUrl = null; + await _members.Save(target); + await ctx.Reply($"{Emojis.Success} Member avatar cleared."); + } + + await _proxyCache.InvalidateResultsForSystem(ctx.System); + } + + public async Task MemberDisplayName(Context ctx, PKMember target) + { + if (ctx.System == null) throw Errors.NoSystemError; + if (target.System != ctx.System.Id) throw Errors.NotOwnMemberError; + + var newDisplayName = ctx.RemainderOrNull(); + // Refuse if proxy name will be unproxyable (with/without tag) + if (newDisplayName != null && newDisplayName.Length > ctx.System.MaxMemberNameLength) + throw Errors.DisplayNameTooLong(newDisplayName, ctx.System.MaxMemberNameLength); + + target.DisplayName = newDisplayName; + await _members.Save(target); var successStr = $"{Emojis.Success} "; if (newDisplayName != null) @@ -253,30 +264,21 @@ namespace PluralKit.Bot.Commands successStr += $"Member display name cleared. "; // If we're removing display name and the *real* name will be unproxyable, warn. - if (ContextEntity.Name.Length > Context.SenderSystem.MaxMemberNameLength) + if (target.Name.Length > ctx.System.MaxMemberNameLength) successStr += - $" {Emojis.Warn} This member's actual name is too long ({ContextEntity.Name.Length} > {Context.SenderSystem.MaxMemberNameLength} characters), and thus cannot be proxied."; + $" {Emojis.Warn} This member's actual name is too long ({target.Name.Length} > {ctx.System.MaxMemberNameLength} characters), and thus cannot be proxied."; else - successStr += $"This member will now be proxied using their member name `{ContextEntity.Name}."; + successStr += $"This member will now be proxied using their member name `{target.Name}."; } - await Context.Channel.SendMessageAsync(successStr); + await ctx.Reply(successStr); - await ProxyCache.InvalidateResultsForSystem(Context.SenderSystem); - } - - [Command] - [Alias("view", "show", "info")] - [Remarks("member ")] - public async Task ViewMember(PKMember member) - { - var system = await Systems.GetById(member.System); - await Context.Channel.SendMessageAsync(embed: await Embeds.CreateMemberEmbed(system, member)); + await _proxyCache.InvalidateResultsForSystem(ctx.System); } - public override async Task ReadContextParameterAsync(string value) + public async Task ViewMember(Context ctx, PKMember target) { - var res = await new PKMemberTypeReader().ReadAsync(Context, value, _services); - return res.IsSuccess ? res.BestMatch as PKMember : null; + var system = await _systems.GetById(target.System); + await ctx.Reply(embed: await _embeds.CreateMemberEmbed(system, target)); } } } \ No newline at end of file diff --git a/PluralKit.Bot/Commands/MiscCommands.cs b/PluralKit.Bot/Commands/MiscCommands.cs index 1f1bbd89..da69e555 100644 --- a/PluralKit.Bot/Commands/MiscCommands.cs +++ b/PluralKit.Bot/Commands/MiscCommands.cs @@ -1,23 +1,27 @@ using System.Collections.Generic; -using System.ComponentModel; using System.Linq; using System.Threading.Tasks; using App.Metrics; using Discord; -using Discord.Commands; using Humanizer; +using PluralKit.Bot.CommandSystem; + namespace PluralKit.Bot.Commands { - public class MiscCommands: ModuleBase { - public BotConfig BotConfig { get; set; } - public IMetrics Metrics { get; set; } - - [Command("invite")] - [Alias("inv")] - [Remarks("invite")] - public async Task Invite() + public class MiscCommands + { + private BotConfig _botConfig; + private IMetrics _metrics; + + public MiscCommands(BotConfig botConfig, IMetrics metrics) { - var clientId = BotConfig.ClientId ?? (await Context.Client.GetApplicationInfoAsync()).Id; + _botConfig = botConfig; + _metrics = metrics; + } + + public async Task Invite(Context ctx) + { + var clientId = _botConfig.ClientId ?? (await ctx.Client.GetApplicationInfoAsync()).Id; var permissions = new GuildPermissions( addReactions: true, attachFiles: true, @@ -29,36 +33,36 @@ namespace PluralKit.Bot.Commands { ); var invite = $"https://discordapp.com/oauth2/authorize?client_id={clientId}&scope=bot&permissions={permissions.RawValue}"; - await Context.Channel.SendMessageAsync($"{Emojis.Success} Use this link to add PluralKit to your server:\n<{invite}>"); + await ctx.Reply($"{Emojis.Success} Use this link to add PluralKit to your server:\n<{invite}>"); } + + public Task Mn(Context ctx) => ctx.Reply("Gotta catch 'em all!"); + public Task Fire(Context ctx) => ctx.Reply("*A giant lightning bolt promptly erupts into a pillar of fire as it hits your opponent.*"); + public Task Thunder(Context ctx) => ctx.Reply("*A giant ball of lightning is conjured and fired directly at your opponent, vanquishing them.*"); + public Task Freeze(Context ctx) => ctx.Reply("*A giant crystal ball of ice is charged and hurled toward your opponent, bursting open and freezing them solid on contact.*"); + public Task Starstorm(Context ctx) => ctx.Reply("*Vibrant colours burst forth from the sky as meteors rain down upon your opponent.*"); - [Command("mn")] public Task Mn() => Context.Channel.SendMessageAsync("Gotta catch 'em all!"); - [Command("fire")] public Task Fire() => Context.Channel.SendMessageAsync("*A giant lightning bolt promptly erupts into a pillar of fire as it hits your opponent.*"); - [Command("thunder")] public Task Thunder() => Context.Channel.SendMessageAsync("*A giant ball of lightning is conjured and fired directly at your opponent, vanquishing them.*"); - [Command("freeze")] public Task Freeze() => Context.Channel.SendMessageAsync("*A giant crystal ball of ice is charged and hurled toward your opponent, bursting open and freezing them solid on contact.*"); - [Command("starstorm")] public Task Starstorm() => Context.Channel.SendMessageAsync("*Vibrant colours burst forth from the sky as meteors rain down upon your opponent.*"); - - [Command("stats")] - public async Task Stats() + public async Task Stats(Context ctx) { - var messagesReceived = Metrics.Snapshot.GetForContext("Bot").Meters.First(m => m.MultidimensionalName == BotMetrics.MessagesReceived.Name).Value; - var messagesProxied = Metrics.Snapshot.GetForContext("Bot").Meters.First(m => m.MultidimensionalName == BotMetrics.MessagesProxied.Name).Value; + var messagesReceived = _metrics.Snapshot.GetForContext("Bot").Meters.First(m => m.MultidimensionalName == BotMetrics.MessagesReceived.Name).Value; + var messagesProxied = _metrics.Snapshot.GetForContext("Bot").Meters.First(m => m.MultidimensionalName == BotMetrics.MessagesProxied.Name).Value; - var commandsRun = Metrics.Snapshot.GetForContext("Bot").Meters.First(m => m.MultidimensionalName == BotMetrics.CommandsRun.Name).Value; + var commandsRun = _metrics.Snapshot.GetForContext("Bot").Meters.First(m => m.MultidimensionalName == BotMetrics.CommandsRun.Name).Value; - await Context.Channel.SendMessageAsync(embed: new EmbedBuilder() + await ctx.Reply(embed: new EmbedBuilder() .AddField("Messages processed", $"{messagesReceived.OneMinuteRate:F1}/s ({messagesReceived.FifteenMinuteRate:F1}/s over 15m)") .AddField("Messages proxied", $"{messagesProxied.OneMinuteRate:F1}/s ({messagesProxied.FifteenMinuteRate:F1}/s over 15m)") .AddField("Commands executed", $"{commandsRun.OneMinuteRate:F1}/s ({commandsRun.FifteenMinuteRate:F1}/s over 15m)") .Build()); } - - [Command("permcheck")] - [Summary("permcheck [guild]")] - public async Task PermCheckGuild(ulong guildId) + + public async Task PermCheckGuild(Context ctx) { + var guildIdStr = ctx.PopArgument() ?? throw new PKSyntaxError("You must pass a server ID."); + if (!ulong.TryParse(guildIdStr, out var guildId)) throw new PKSyntaxError($"Could not parse `{guildIdStr}` as an ID."); + // TODO: will this call break for sharding if you try to request a guild on a different bot instance? - var guild = Context.Client.GetGuild(guildId) as IGuild; + var guild = ctx.Client.GetGuild(guildId) as IGuild; if (guild == null) throw Errors.GuildNotFound(guildId); @@ -118,13 +122,7 @@ namespace PluralKit.Bot.Commands { } // Send! :) - await Context.Channel.SendMessageAsync(embed: eb.Build()); + await ctx.Reply(embed: eb.Build()); } - - [Command("permcheck")] - [Summary("permcheck [guild]")] - [RequireContext(ContextType.Guild, ErrorMessage = - "When running this command in DMs, you must pass a guild ID.")] - public Task PermCheckGuild() => PermCheckGuild(Context.Guild.Id); } } \ No newline at end of file diff --git a/PluralKit.Bot/Commands/ModCommands.cs b/PluralKit.Bot/Commands/ModCommands.cs index a61e0ed1..19624640 100644 --- a/PluralKit.Bot/Commands/ModCommands.cs +++ b/PluralKit.Bot/Commands/ModCommands.cs @@ -1,44 +1,56 @@ +using System.Text.RegularExpressions; using System.Threading.Tasks; using Discord; -using Discord.Commands; + +using PluralKit.Bot.CommandSystem; namespace PluralKit.Bot.Commands { - public class ModCommands: ModuleBase + public class ModCommands { - public LogChannelService LogChannels { get; set; } - public MessageStore Messages { get; set; } - - public EmbedService Embeds { get; set; } - - [Command("log")] - [Remarks("log ")] - [RequireUserPermission(GuildPermission.ManageGuild, ErrorMessage = "You must have the Manage Server permission to use this command.")] - [RequireContext(ContextType.Guild, ErrorMessage = "This command can not be run in a DM.")] - public async Task SetLogChannel(ITextChannel channel = null) + private LogChannelService _logChannels; + private MessageStore _messages; + + private EmbedService _embeds; + + public ModCommands(LogChannelService logChannels, MessageStore messages, EmbedService embeds) { - await LogChannels.SetLogChannel(Context.Guild, channel); + _logChannels = logChannels; + _messages = messages; + _embeds = embeds; + } + + public async Task SetLogChannel(Context ctx) + { + ctx.CheckAuthorPermission(GuildPermission.ManageGuild, "Manage Server").CheckGuildContext(); + + ITextChannel channel = null; + if (ctx.HasNext()) + channel = ctx.MatchChannel() ?? throw new PKSyntaxError("You must pass a #channel to set."); + + await _logChannels.SetLogChannel(ctx.Guild, channel); if (channel != null) - await Context.Channel.SendMessageAsync($"{Emojis.Success} Proxy logging channel set to #{channel.Name.Sanitize()}."); + await ctx.Reply($"{Emojis.Success} Proxy logging channel set to #{channel.Name.Sanitize()}."); else - await Context.Channel.SendMessageAsync($"{Emojis.Success} Proxy logging channel cleared."); + await ctx.Reply($"{Emojis.Success} Proxy logging channel cleared."); } - - [Command("message")] - [Remarks("message ")] - [Alias("msg")] - public async Task GetMessage(ulong messageId) + + public async Task GetMessage(Context ctx) { - var message = await Messages.Get(messageId); + var word = ctx.PopArgument() ?? throw new PKSyntaxError("You must pass a message ID or link."); + + ulong messageId; + if (ulong.TryParse(word, out var id)) + messageId = id; + else if (Regex.Match(word, "https://discordapp.com/channels/\\d+/(\\d+)") is Match match && match.Success) + messageId = ulong.Parse(match.Groups[1].Value); + else throw new PKSyntaxError($"Could not parse `{word}` as a message ID or link."); + + var message = await _messages.Get(messageId); if (message == null) throw Errors.MessageNotFound(messageId); - await Context.Channel.SendMessageAsync(embed: await Embeds.CreateMessageInfoEmbed(message)); + await ctx.Reply(embed: await _embeds.CreateMessageInfoEmbed(message)); } - - [Command("message")] - [Remarks("message ")] - [Alias("msg")] - public async Task GetMessage(IMessage msg) => await GetMessage(msg.Id); } } \ No newline at end of file diff --git a/PluralKit.Bot/Commands/SwitchCommands.cs b/PluralKit.Bot/Commands/SwitchCommands.cs index 981f1174..788309fc 100644 --- a/PluralKit.Bot/Commands/SwitchCommands.cs +++ b/PluralKit.Bot/Commands/SwitchCommands.cs @@ -2,75 +2,91 @@ using System.Collections.Generic; using System.Linq; using System.Threading.Tasks; using Discord; -using Discord.Commands; + using NodaTime; using NodaTime.TimeZones; +using PluralKit.Bot.CommandSystem; + namespace PluralKit.Bot.Commands { - [Group("switch")] - [Alias("sw")] - public class SwitchCommands: ModuleBase + public class SwitchCommands { - public SystemStore Systems { get; set; } - public SwitchStore Switches { get; set; } + private SwitchStore _switches; - [Command] - [Remarks("switch [member...]")] - [MustHaveSystem] - public async Task Switch(params PKMember[] members) => await DoSwitchCommand(members); - - [Command("out")] - [Alias("none")] - [Remarks("switch out")] - [MustHaveSystem] - public async Task SwitchOut() => await DoSwitchCommand(new PKMember[] { }); - - private async Task DoSwitchCommand(ICollection members) + public SwitchCommands(SwitchStore switches) { - // Make sure all the members *are actually in the system* - // PKMember parameters won't let this happen if they resolve by name - // but they can if they resolve with ID - if (members.Any(m => m.System != Context.SenderSystem.Id)) throw Errors.SwitchMemberNotInSystem; + _switches = switches; + } + + public async Task Switch(Context ctx) + { + ctx.CheckSystem(); + var members = new List(); + + // Loop through all the given arguments + while (ctx.HasNext()) + { + // and attempt to match a member + var member = await ctx.MatchMember(); + if (member == null) + // if we can't, big error. Every member name must be valid. + throw new PKError(ctx.CreateMemberNotFoundError(ctx.PopArgument())); + + ctx.CheckOwnMember(member); // Ensure they're in our own system + members.Add(member); // Then add to the final output list + } + + // Finally, do the actual switch + await DoSwitchCommand(ctx, members); + } + public async Task SwitchOut(Context ctx) + { + ctx.CheckSystem(); + // Switch with no members = switch-out + await DoSwitchCommand(ctx, new PKMember[] { }); + } + + private async Task DoSwitchCommand(Context ctx, ICollection members) + { // Make sure there are no dupes in the list // We do this by checking if removing duplicate member IDs results in a list of different length if (members.Select(m => m.Id).Distinct().Count() != members.Count) throw Errors.DuplicateSwitchMembers; // Find the last switch and its members if applicable - var lastSwitch = await Switches.GetLatestSwitch(Context.SenderSystem); + var lastSwitch = await _switches.GetLatestSwitch(ctx.System); if (lastSwitch != null) { - var lastSwitchMembers = await Switches.GetSwitchMembers(lastSwitch); + var lastSwitchMembers = await _switches.GetSwitchMembers(lastSwitch); // Make sure the requested switch isn't identical to the last one if (lastSwitchMembers.Select(m => m.Id).SequenceEqual(members.Select(m => m.Id))) throw Errors.SameSwitch(members); } - await Switches.RegisterSwitch(Context.SenderSystem, members); + await _switches.RegisterSwitch(ctx.System, members); if (members.Count == 0) - await Context.Channel.SendMessageAsync($"{Emojis.Success} Switch-out registered."); + await ctx.Reply($"{Emojis.Success} Switch-out registered."); else - await Context.Channel.SendMessageAsync($"{Emojis.Success} Switch registered. Current fronter is now {string.Join(", ", members.Select(m => m.Name)).Sanitize()}."); + await ctx.Reply($"{Emojis.Success} Switch registered. Current fronter is now {string.Join(", ", members.Select(m => m.Name)).Sanitize()}."); } - - [Command("move")] - [Alias("shift")] - [Remarks("switch move ")] - [MustHaveSystem] - public async Task SwitchMove([Remainder] string str) + + public async Task SwitchMove(Context ctx) { - var tz = TzdbDateTimeZoneSource.Default.ForId(Context.SenderSystem.UiTz ?? "UTC"); + ctx.CheckSystem(); - var result = PluralKit.Utils.ParseDateTime(str, true, tz); - if (result == null) throw Errors.InvalidDateTime(str); + var timeToMove = ctx.RemainderOrNull() ?? throw new PKSyntaxError("Must pass a date or time to move the switch to."); + var tz = TzdbDateTimeZoneSource.Default.ForId(ctx.System.UiTz ?? "UTC"); + + var result = PluralKit.Utils.ParseDateTime(timeToMove, true, tz); + if (result == null) throw Errors.InvalidDateTime(timeToMove); var time = result.Value; if (time.ToInstant() > SystemClock.Instance.GetCurrentInstant()) throw Errors.SwitchTimeInFuture; // Fetch the last two switches for the system to do bounds checking on - var lastTwoSwitches = (await Switches.GetSwitches(Context.SenderSystem, 2)).ToArray(); + var lastTwoSwitches = (await _switches.GetSwitches(ctx.System, 2)).ToArray(); // If we don't have a switch to move, don't bother if (lastTwoSwitches.Length == 0) throw Errors.NoRegisteredSwitches; @@ -84,55 +100,53 @@ namespace PluralKit.Bot.Commands // Now we can actually do the move, yay! // But, we do a prompt to confirm. - var lastSwitchMembers = await Switches.GetSwitchMembers(lastTwoSwitches[0]); + var lastSwitchMembers = await _switches.GetSwitchMembers(lastTwoSwitches[0]); var lastSwitchMemberStr = string.Join(", ", lastSwitchMembers.Select(m => m.Name)); - var lastSwitchTimeStr = Formats.ZonedDateTimeFormat.Format(lastTwoSwitches[0].Timestamp.InZone(Context.SenderSystem.Zone)); + var lastSwitchTimeStr = Formats.ZonedDateTimeFormat.Format(lastTwoSwitches[0].Timestamp.InZone(ctx.System.Zone)); var lastSwitchDeltaStr = Formats.DurationFormat.Format(SystemClock.Instance.GetCurrentInstant() - lastTwoSwitches[0].Timestamp); var newSwitchTimeStr = Formats.ZonedDateTimeFormat.Format(time); var newSwitchDeltaStr = Formats.DurationFormat.Format(SystemClock.Instance.GetCurrentInstant() - time.ToInstant()); // yeet - var msg = await Context.Channel.SendMessageAsync($"{Emojis.Warn} This will move the latest switch ({lastSwitchMemberStr.Sanitize()}) from {lastSwitchTimeStr} ({lastSwitchDeltaStr} ago) to {newSwitchTimeStr} ({newSwitchDeltaStr} ago). Is this OK?"); - if (!await Context.PromptYesNo(msg)) throw Errors.SwitchMoveCancelled; + var msg = await ctx.Reply($"{Emojis.Warn} This will move the latest switch ({lastSwitchMemberStr.Sanitize()}) from {lastSwitchTimeStr} ({lastSwitchDeltaStr} ago) to {newSwitchTimeStr} ({newSwitchDeltaStr} ago). Is this OK?"); + if (!await ctx.PromptYesNo(msg)) throw Errors.SwitchMoveCancelled; // aaaand *now* we do the move - await Switches.MoveSwitch(lastTwoSwitches[0], time.ToInstant()); - await Context.Channel.SendMessageAsync($"{Emojis.Success} Switch moved."); + await _switches.MoveSwitch(lastTwoSwitches[0], time.ToInstant()); + await ctx.Reply($"{Emojis.Success} Switch moved."); } - - [Command("delete")] - [Remarks("switch delete")] - [Alias("remove", "erase", "cancel", "yeet")] - [MustHaveSystem] - public async Task SwitchDelete() + + public async Task SwitchDelete(Context ctx) { + ctx.CheckSystem(); + // Fetch the last two switches for the system to do bounds checking on - var lastTwoSwitches = (await Switches.GetSwitches(Context.SenderSystem, 2)).ToArray(); + var lastTwoSwitches = (await _switches.GetSwitches(ctx.System, 2)).ToArray(); if (lastTwoSwitches.Length == 0) throw Errors.NoRegisteredSwitches; - var lastSwitchMembers = await Switches.GetSwitchMembers(lastTwoSwitches[0]); + var lastSwitchMembers = await _switches.GetSwitchMembers(lastTwoSwitches[0]); var lastSwitchMemberStr = string.Join(", ", lastSwitchMembers.Select(m => m.Name)); var lastSwitchDeltaStr = Formats.DurationFormat.Format(SystemClock.Instance.GetCurrentInstant() - lastTwoSwitches[0].Timestamp); IUserMessage msg; if (lastTwoSwitches.Length == 1) { - msg = await Context.Channel.SendMessageAsync( + msg = await ctx.Reply( $"{Emojis.Warn} This will delete the latest switch ({lastSwitchMemberStr.Sanitize()}, {lastSwitchDeltaStr} ago). You have no other switches logged. Is this okay?"); } else { - var secondSwitchMembers = await Switches.GetSwitchMembers(lastTwoSwitches[1]); + var secondSwitchMembers = await _switches.GetSwitchMembers(lastTwoSwitches[1]); var secondSwitchMemberStr = string.Join(", ", secondSwitchMembers.Select(m => m.Name)); var secondSwitchDeltaStr = Formats.DurationFormat.Format(SystemClock.Instance.GetCurrentInstant() - lastTwoSwitches[1].Timestamp); - msg = await Context.Channel.SendMessageAsync( + msg = await ctx.Reply( $"{Emojis.Warn} This will delete the latest switch ({lastSwitchMemberStr.Sanitize()}, {lastSwitchDeltaStr} ago). The next latest switch is {secondSwitchMemberStr.Sanitize()} ({secondSwitchDeltaStr} ago). Is this okay?"); } - if (!await Context.PromptYesNo(msg)) throw Errors.SwitchDeleteCancelled; - await Switches.DeleteSwitch(lastTwoSwitches[0]); + if (!await ctx.PromptYesNo(msg)) throw Errors.SwitchDeleteCancelled; + await _switches.DeleteSwitch(lastTwoSwitches[0]); - await Context.Channel.SendMessageAsync($"{Emojis.Success} Switch deleted."); + await ctx.Reply($"{Emojis.Success} Switch deleted."); } } } \ No newline at end of file diff --git a/PluralKit.Bot/Commands/SystemCommands.cs b/PluralKit.Bot/Commands/SystemCommands.cs index 8c3ddcf8..7c3f554f 100644 --- a/PluralKit.Bot/Commands/SystemCommands.cs +++ b/PluralKit.Bot/Commands/SystemCommands.cs @@ -2,240 +2,206 @@ using System; using System.Linq; using System.Threading.Tasks; using Discord; -using Discord.Commands; using Humanizer; using NodaTime; using NodaTime.Text; using NodaTime.TimeZones; + +using PluralKit.Bot.CommandSystem; using PluralKit.Core; namespace PluralKit.Bot.Commands { - [Group("system")] - [Alias("s")] - public class SystemCommands : ContextParameterModuleBase + public class SystemCommands { - public override string Prefix => "system"; - public override string ContextNoun => "system"; + private SystemStore _systems; + private MemberStore _members; - public SystemStore Systems {get; set;} - public MemberStore Members {get; set;} - - public SwitchStore Switches {get; set;} - public EmbedService EmbedService {get; set;} - - public ProxyCacheService ProxyCache { get; set; } - + private SwitchStore _switches; + private EmbedService _embeds; - [Command] - [Remarks("system ")] - public async Task Query(PKSystem system = null) { - if (system == null) system = Context.SenderSystem; + private ProxyCacheService _proxyCache; + + public SystemCommands(SystemStore systems, MemberStore members, SwitchStore switches, EmbedService embeds, ProxyCacheService proxyCache) + { + _systems = systems; + _members = members; + _switches = switches; + _embeds = embeds; + _proxyCache = proxyCache; + } + + public async Task Query(Context ctx, PKSystem system) { if (system == null) throw Errors.NoSystemError; - await Context.Channel.SendMessageAsync(embed: await EmbedService.CreateSystemEmbed(system)); + await ctx.Reply(embed: await _embeds.CreateSystemEmbed(system)); } - - [Command("new")] - [Alias("register", "create", "init", "add", "make")] - [Remarks("system new ")] - public async Task New([Remainder] string systemName = null) + + public async Task New(Context ctx) { - if (ContextEntity != null) throw Errors.NotOwnSystemError; - if (Context.SenderSystem != null) throw Errors.ExistingSystemError; + ctx.CheckNoSystem(); - var system = await Systems.Create(systemName); - await Systems.Link(system, Context.User.Id); - await Context.Channel.SendMessageAsync($"{Emojis.Success} Your system has been created. Type `pk;system` to view it, and type `pk;help` for more information about commands you can use now."); + var system = await _systems.Create(ctx.RemainderOrNull()); + await _systems.Link(system, ctx.Author.Id); + await ctx.Reply($"{Emojis.Success} Your system has been created. Type `pk;system` to view it, and type `pk;help` for more information about commands you can use now."); } + + public async Task Name(Context ctx) + { + ctx.CheckSystem(); - [Command("name")] - [Alias("rename", "changename")] - [Remarks("system name ")] - [MustHaveSystem] - public async Task Name([Remainder] string newSystemName = null) { + var newSystemName = ctx.RemainderOrNull(); if (newSystemName != null && newSystemName.Length > Limits.MaxSystemNameLength) throw Errors.SystemNameTooLongError(newSystemName.Length); - Context.SenderSystem.Name = newSystemName; - await Systems.Save(Context.SenderSystem); - await Context.Channel.SendMessageAsync($"{Emojis.Success} System name {(newSystemName != null ? "changed" : "cleared")}."); + ctx.System.Name = newSystemName; + await _systems.Save(ctx.System); + await ctx.Reply($"{Emojis.Success} System name {(newSystemName != null ? "changed" : "cleared")}."); } + + public async Task Description(Context ctx) { + ctx.CheckSystem(); - [Command("description")] - [Alias("desc")] - [Remarks("system description ")] - [MustHaveSystem] - public async Task Description([Remainder] string newDescription = null) { + var newDescription = ctx.RemainderOrNull(); if (newDescription != null && newDescription.Length > Limits.MaxDescriptionLength) throw Errors.DescriptionTooLongError(newDescription.Length); - Context.SenderSystem.Description = newDescription; - await Systems.Save(Context.SenderSystem); - await Context.Channel.SendMessageAsync($"{Emojis.Success} System description {(newDescription != null ? "changed" : "cleared")}."); + ctx.System.Description = newDescription; + await _systems.Save(ctx.System); + await ctx.Reply($"{Emojis.Success} System description {(newDescription != null ? "changed" : "cleared")}."); } + + public async Task Tag(Context ctx) + { + ctx.CheckSystem(); - [Command("tag")] - [Remarks("system tag ")] - [MustHaveSystem] - public async Task Tag([Remainder] string newTag = null) { - - Context.SenderSystem.Tag = newTag; + var newTag = ctx.RemainderOrNull(); + ctx.System.Tag = newTag; if (newTag != null) { if (newTag.Length > Limits.MaxSystemTagLength) throw Errors.SystemNameTooLongError(newTag.Length); // Check unproxyable messages *after* changing the tag (so it's seen in the method) but *before* we save to DB (so we can cancel) - var unproxyableMembers = await Members.GetUnproxyableMembers(Context.SenderSystem); + var unproxyableMembers = await _members.GetUnproxyableMembers(ctx.System); if (unproxyableMembers.Count > 0) { - var msg = await Context.Channel.SendMessageAsync( + var msg = await ctx.Reply( $"{Emojis.Warn} Changing your system tag to '{newTag}' will result in the following members being unproxyable, since the tag would bring their name over {Limits.MaxProxyNameLength} characters:\n**{string.Join(", ", unproxyableMembers.Select((m) => m.Name))}**\nDo you want to continue anyway?"); - if (!await Context.PromptYesNo(msg)) throw new PKError("Tag change cancelled."); + if (!await ctx.PromptYesNo(msg)) throw new PKError("Tag change cancelled."); } } - await Systems.Save(Context.SenderSystem); - await Context.Channel.SendMessageAsync($"{Emojis.Success} System tag {(newTag != null ? "changed" : "cleared")}."); + await _systems.Save(ctx.System); + await ctx.Reply($"{Emojis.Success} System tag {(newTag != null ? "changed" : "cleared")}."); - await ProxyCache.InvalidateResultsForSystem(Context.SenderSystem); + await _proxyCache.InvalidateResultsForSystem(ctx.System); } - [Command("avatar")] - [Alias("profile", "picture", "icon", "image", "pic", "pfp")] - [Remarks("system avatar ")] - [MustHaveSystem] - public async Task SystemAvatar(IUser member) + public async Task SystemAvatar(Context ctx) { - if (member.AvatarId == null) throw Errors.UserHasNoAvatar; - Context.SenderSystem.AvatarUrl = member.GetAvatarUrl(ImageFormat.Png, size: 256); - await Systems.Save(Context.SenderSystem); + ctx.CheckSystem(); + + var member = await ctx.MatchUser(); + if (member != null) + { + if (member.AvatarId == null) throw Errors.UserHasNoAvatar; + ctx.System.AvatarUrl = member.GetAvatarUrl(ImageFormat.Png, size: 256); + await _systems.Save(ctx.System); - var embed = new EmbedBuilder().WithImageUrl(Context.SenderSystem.AvatarUrl).Build(); - await Context.Channel.SendMessageAsync( - $"{Emojis.Success} System avatar changed to {member.Username}'s avatar! {Emojis.Warn} Please note that if {member.Username} changes their avatar, the system's avatar will need to be re-set.", embed: embed); - - await ProxyCache.InvalidateResultsForSystem(Context.SenderSystem); - } - - [Command("avatar")] - [Alias("profile", "picture", "icon", "image", "pic", "pfp")] - [Remarks("system avatar ")] - [MustHaveSystem] - public async Task SystemAvatar([Remainder] string avatarUrl = null) - { - string url = avatarUrl ?? Context.Message.Attachments.FirstOrDefault()?.ProxyUrl; - if (url != null) await Context.BusyIndicator(() => Utils.VerifyAvatarOrThrow(url)); - - Context.SenderSystem.AvatarUrl = url; - await Systems.Save(Context.SenderSystem); - - var embed = url != null ? new EmbedBuilder().WithImageUrl(url).Build() : null; - await Context.Channel.SendMessageAsync($"{Emojis.Success} System avatar {(url == null ? "cleared" : "changed")}.", embed: embed); - - await ProxyCache.InvalidateResultsForSystem(Context.SenderSystem); - } - - [Command("delete")] - [Alias("remove", "destroy", "erase", "yeet")] - [Remarks("system delete")] - [MustHaveSystem] - public async Task Delete() { - var msg = await Context.Channel.SendMessageAsync($"{Emojis.Warn} Are you sure you want to delete your system? If so, reply to this message with your system's ID (`{Context.SenderSystem.Hid}`).\n**Note: this action is permanent.**"); - var reply = await Context.AwaitMessage(Context.Channel, Context.User, timeout: TimeSpan.FromMinutes(1)); - if (reply.Content != Context.SenderSystem.Hid) throw new PKError($"System deletion cancelled. Note that you must reply with your system ID (`{Context.SenderSystem.Hid}`) *verbatim*."); - - await Systems.Delete(Context.SenderSystem); - await Context.Channel.SendMessageAsync($"{Emojis.Success} System deleted."); - - await ProxyCache.InvalidateResultsForSystem(Context.SenderSystem); - } - - [Group("list")] - [Alias("l", "members")] - public class SystemListCommands: ModuleBase { - public MemberStore Members { get; set; } - - [Command] - [Remarks("system [system] list")] - public async Task MemberShortList() { - var system = Context.GetContextEntity() ?? Context.SenderSystem; - if (system == null) throw Errors.NoSystemError; - - var members = await Members.GetBySystem(system); - var embedTitle = system.Name != null ? $"Members of {system.Name} (`{system.Hid}`)" : $"Members of `{system.Hid}`"; - await Context.Paginate( - members.OrderBy(m => m.Name).ToList(), - 25, - embedTitle, - (eb, ms) => eb.Description = string.Join("\n", ms.Select((m) => { - if (m.HasProxyTags) return $"[`{m.Hid}`] **{m.Name}** *({m.ProxyString})*"; - return $"[`{m.Hid}`] **{m.Name}**"; - })) - ); + var embed = new EmbedBuilder().WithImageUrl(ctx.System.AvatarUrl).Build(); + await ctx.Reply( + $"{Emojis.Success} System avatar changed to {member.Username}'s avatar! {Emojis.Warn} Please note that if {member.Username} changes their avatar, the system's avatar will need to be re-set.", embed: embed); } + else + { + string url = ctx.RemainderOrNull() ?? ctx.Message.Attachments.FirstOrDefault()?.ProxyUrl; + if (url != null) await ctx.BusyIndicator(() => Utils.VerifyAvatarOrThrow(url)); - [Command("full")] - [Alias("big", "details", "long")] - [Remarks("system [system] list full")] - public async Task MemberLongList() { - var system = Context.GetContextEntity() ?? Context.SenderSystem; - if (system == null) throw Errors.NoSystemError; + ctx.System.AvatarUrl = url; + await _systems.Save(ctx.System); - var members = await Members.GetBySystem(system); - var embedTitle = system.Name != null ? $"Members of {system.Name} (`{system.Hid}`)" : $"Members of `{system.Hid}`"; - await Context.Paginate( - members.OrderBy(m => m.Name).ToList(), - 5, - embedTitle, - (eb, ms) => { - foreach (var m in ms) { - var profile = $"**ID**: {m.Hid}"; - if (m.Pronouns != null) profile += $"\n**Pronouns**: {m.Pronouns}"; - if (m.Birthday != null) profile += $"\n**Birthdate**: {m.BirthdayString}"; - if (m.Prefix != null || m.Suffix != null) profile += $"\n**Proxy tags**: {m.ProxyString}"; - if (m.Description != null) profile += $"\n\n{m.Description}"; - eb.AddField(m.Name, profile.Truncate(1024)); - } + var embed = url != null ? new EmbedBuilder().WithImageUrl(url).Build() : null; + await ctx.Reply($"{Emojis.Success} System avatar {(url == null ? "cleared" : "changed")}.", embed: embed); + } + + await _proxyCache.InvalidateResultsForSystem(ctx.System); + } + + public async Task Delete(Context ctx) { + ctx.CheckSystem(); + + var msg = await ctx.Reply($"{Emojis.Warn} Are you sure you want to delete your system? If so, reply to this message with your system's ID (`{ctx.System.Hid}`).\n**Note: this action is permanent.**"); + var reply = await ctx.AwaitMessage(ctx.Channel, ctx.Author, timeout: TimeSpan.FromMinutes(1)); + if (reply.Content != ctx.System.Hid) throw new PKError($"System deletion cancelled. Note that you must reply with your system ID (`{ctx.System.Hid}`) *verbatim*."); + + await _systems.Delete(ctx.System); + await ctx.Reply($"{Emojis.Success} System deleted."); + + await _proxyCache.InvalidateResultsForSystem(ctx.System); + } + + public async Task MemberShortList(Context ctx, PKSystem system) { + if (system == null) throw Errors.NoSystemError; + + var members = await _members.GetBySystem(system); + var embedTitle = system.Name != null ? $"Members of {system.Name} (`{system.Hid}`)" : $"Members of `{system.Hid}`"; + await ctx.Paginate( + members.OrderBy(m => m.Name).ToList(), + 25, + embedTitle, + (eb, ms) => eb.Description = string.Join("\n", ms.Select((m) => { + if (m.HasProxyTags) return $"[`{m.Hid}`] **{m.Name}** *({m.ProxyString})*"; + return $"[`{m.Hid}`] **{m.Name}**"; + })) + ); + } + + public async Task MemberLongList(Context ctx, PKSystem system) { + if (system == null) throw Errors.NoSystemError; + + var members = await _members.GetBySystem(system); + var embedTitle = system.Name != null ? $"Members of {system.Name} (`{system.Hid}`)" : $"Members of `{system.Hid}`"; + await ctx.Paginate( + members.OrderBy(m => m.Name).ToList(), + 5, + embedTitle, + (eb, ms) => { + foreach (var m in ms) { + var profile = $"**ID**: {m.Hid}"; + if (m.Pronouns != null) profile += $"\n**Pronouns**: {m.Pronouns}"; + if (m.Birthday != null) profile += $"\n**Birthdate**: {m.BirthdayString}"; + if (m.Prefix != null || m.Suffix != null) profile += $"\n**Proxy tags**: {m.ProxyString}"; + if (m.Description != null) profile += $"\n\n{m.Description}"; + eb.AddField(m.Name, profile.Truncate(1024)); } - ); - } + } + ); } - - [Command("fronter")] - [Alias("f", "front", "fronters")] - [Remarks("system [system] fronter")] - public async Task SystemFronter() + + public async Task SystemFronter(Context ctx, PKSystem system) { - var system = ContextEntity ?? Context.SenderSystem; if (system == null) throw Errors.NoSystemError; - var sw = await Switches.GetLatestSwitch(system); + var sw = await _switches.GetLatestSwitch(system); if (sw == null) throw Errors.NoRegisteredSwitches; - await Context.Channel.SendMessageAsync(embed: await EmbedService.CreateFronterEmbed(sw, system.Zone)); + await ctx.Reply(embed: await _embeds.CreateFronterEmbed(sw, system.Zone)); } - - [Command("fronthistory")] - [Alias("fh", "history", "switches")] - [Remarks("system [system] fronthistory")] - public async Task SystemFrontHistory() + + public async Task SystemFrontHistory(Context ctx, PKSystem system) { - var system = ContextEntity ?? Context.SenderSystem; if (system == null) throw Errors.NoSystemError; - var sws = (await Switches.GetSwitches(system, 10)).ToList(); + var sws = (await _switches.GetSwitches(system, 10)).ToList(); if (sws.Count == 0) throw Errors.NoRegisteredSwitches; - await Context.Channel.SendMessageAsync(embed: await EmbedService.CreateFrontHistoryEmbed(sws, system.Zone)); + await ctx.Reply(embed: await _embeds.CreateFrontHistoryEmbed(sws, system.Zone)); } - - [Command("frontpercent")] - [Alias("frontbreakdown", "frontpercent", "front%", "fp")] - [Remarks("system [system] frontpercent [duration]")] - public async Task SystemFrontPercent([Remainder] string durationStr = "30d") + + public async Task SystemFrontPercent(Context ctx, PKSystem system) { - var system = ContextEntity ?? Context.SenderSystem; if (system == null) throw Errors.NoSystemError; + + string durationStr = ctx.RemainderOrNull() ?? "30d"; var now = SystemClock.Instance.GetCurrentInstant(); @@ -243,38 +209,37 @@ namespace PluralKit.Bot.Commands if (rangeStart == null) throw Errors.InvalidDateTime(durationStr); if (rangeStart.Value.ToInstant() > now) throw Errors.FrontPercentTimeInFuture; - var frontpercent = await Switches.GetPerMemberSwitchDuration(system, rangeStart.Value.ToInstant(), now); - await Context.Channel.SendMessageAsync(embed: await EmbedService.CreateFrontPercentEmbed(frontpercent, system.Zone)); + var frontpercent = await _switches.GetPerMemberSwitchDuration(system, rangeStart.Value.ToInstant(), now); + await ctx.Reply(embed: await _embeds.CreateFrontPercentEmbed(frontpercent, system.Zone)); } - - [Command("timezone")] - [Alias("tz")] - [Remarks("system timezone [timezone]")] - [MustHaveSystem] - public async Task SystemTimezone([Remainder] string zoneStr = null) + + public async Task SystemTimezone(Context ctx) { + if (ctx.System == null) throw Errors.NoSystemError; + + var zoneStr = ctx.RemainderOrNull(); if (zoneStr == null) { - Context.SenderSystem.UiTz = "UTC"; - await Systems.Save(Context.SenderSystem); - await Context.Channel.SendMessageAsync($"{Emojis.Success} System time zone cleared."); + ctx.System.UiTz = "UTC"; + await _systems.Save(ctx.System); + await ctx.Reply($"{Emojis.Success} System time zone cleared."); return; } - var zone = await FindTimeZone(zoneStr); + var zone = await FindTimeZone(ctx, zoneStr); if (zone == null) throw Errors.InvalidTimeZone(zoneStr); var currentTime = SystemClock.Instance.GetCurrentInstant().InZone(zone); - var msg = await Context.Channel.SendMessageAsync( + var msg = await ctx.Reply( $"This will change the system time zone to {zone.Id}. The current time is {Formats.ZonedDateTimeFormat.Format(currentTime)}. Is this correct?"); - if (!await Context.PromptYesNo(msg)) throw Errors.TimezoneChangeCancelled; - Context.SenderSystem.UiTz = zone.Id; - await Systems.Save(Context.SenderSystem); + if (!await ctx.PromptYesNo(msg)) throw Errors.TimezoneChangeCancelled; + ctx.System.UiTz = zone.Id; + await _systems.Save(ctx.System); - await Context.Channel.SendMessageAsync($"System time zone changed to {zone.Id}."); + await ctx.Reply($"System time zone changed to {zone.Id}."); } - public async Task FindTimeZone(string zoneStr) { + public async Task FindTimeZone(Context ctx, string zoneStr) { // First, if we're given a flag emoji, we extract the flag emoji code from it. zoneStr = PluralKit.Utils.ExtractCountryFlag(zoneStr) ?? zoneStr; @@ -322,7 +287,7 @@ namespace PluralKit.Bot.Commands return matchingZones.First(); // Otherwise, prompt and return! - return await Context.Choose("There were multiple matches for your time zone query. Please select the region that matches you the closest:", matchingZones, + return await ctx.Choose("There were multiple matches for your time zone query. Please select the region that matches you the closest:", matchingZones, z => { if (TzdbDateTimeZoneSource.Default.Aliases.Contains(z.Id)) @@ -330,12 +295,6 @@ namespace PluralKit.Bot.Commands return $"**{z.Id}**"; }); - } - - public override async Task ReadContextParameterAsync(string value) - { - var res = await new PKSystemTypeReader().ReadAsync(Context, value, _services); - return res.IsSuccess ? res.BestMatch as PKSystem : null; } } } \ No newline at end of file diff --git a/PluralKit.Bot/ContextUtils.cs b/PluralKit.Bot/ContextUtils.cs index 9e5d74b3..16aa0506 100644 --- a/PluralKit.Bot/ContextUtils.cs +++ b/PluralKit.Bot/ContextUtils.cs @@ -6,15 +6,17 @@ using Discord; using Discord.Commands; using Discord.WebSocket; +using PluralKit.Bot.CommandSystem; + namespace PluralKit.Bot { public static class ContextUtils { - public static async Task PromptYesNo(this ICommandContext ctx, IUserMessage message, IUser user = null, TimeSpan? timeout = null) { + public static async Task PromptYesNo(this Context ctx, IUserMessage message, IUser user = null, TimeSpan? timeout = null) { await message.AddReactionsAsync(new[] {new Emoji(Emojis.Success), new Emoji(Emojis.Error)}); - var reaction = await ctx.AwaitReaction(message, user ?? ctx.User, (r) => r.Emote.Name == Emojis.Success || r.Emote.Name == Emojis.Error, timeout ?? TimeSpan.FromMinutes(1)); + var reaction = await ctx.AwaitReaction(message, user ?? ctx.Author, (r) => r.Emote.Name == Emojis.Success || r.Emote.Name == Emojis.Error, timeout ?? TimeSpan.FromMinutes(1)); return reaction.Emote.Name == Emojis.Success; } - public static async Task AwaitReaction(this ICommandContext ctx, IUserMessage message, IUser user = null, Func predicate = null, TimeSpan? timeout = null) { + public static async Task AwaitReaction(this Context ctx, IUserMessage message, IUser user = null, Func predicate = null, TimeSpan? timeout = null) { var tcs = new TaskCompletionSource(); Task Inner(Cacheable _message, ISocketMessageChannel _channel, SocketReaction reaction) { if (message.Id != _message.Id) return Task.CompletedTask; // Ignore reactions for different messages @@ -24,38 +26,38 @@ namespace PluralKit.Bot { return Task.CompletedTask; } - (ctx.Client as BaseSocketClient).ReactionAdded += Inner; + ((BaseSocketClient) ctx.Shard).ReactionAdded += Inner; try { return await (tcs.Task.TimeoutAfter(timeout)); } finally { - (ctx.Client as BaseSocketClient).ReactionAdded -= Inner; + ((BaseSocketClient) ctx.Shard).ReactionAdded -= Inner; } } - public static async Task AwaitMessage(this ICommandContext ctx, IMessageChannel channel, IUser user = null, Func predicate = null, TimeSpan? timeout = null) { + public static async Task AwaitMessage(this Context ctx, IMessageChannel channel, IUser user = null, Func predicate = null, TimeSpan? timeout = null) { var tcs = new TaskCompletionSource(); Task Inner(SocketMessage msg) { if (channel != msg.Channel) return Task.CompletedTask; // Ignore messages in a different channel if (user != null && user != msg.Author) return Task.CompletedTask; // Ignore messages from other users if (predicate != null && !predicate.Invoke(msg)) return Task.CompletedTask; // Check predicate - (ctx.Client as BaseSocketClient).MessageReceived -= Inner; + ((BaseSocketClient) ctx.Shard).MessageReceived -= Inner; tcs.SetResult(msg as IUserMessage); return Task.CompletedTask; } - (ctx.Client as BaseSocketClient).MessageReceived += Inner; + ((BaseSocketClient) ctx.Shard).MessageReceived += Inner; return await (tcs.Task.TimeoutAfter(timeout)); } - public static async Task ConfirmWithReply(this ICommandContext ctx, string expectedReply) + public static async Task ConfirmWithReply(this Context ctx, string expectedReply) { - var msg = await ctx.AwaitMessage(ctx.Channel, ctx.User, timeout: TimeSpan.FromMinutes(1)); + var msg = await ctx.AwaitMessage(ctx.Channel, ctx.Author, timeout: TimeSpan.FromMinutes(1)); return string.Equals(msg.Content, expectedReply, StringComparison.InvariantCultureIgnoreCase); } - public static async Task Paginate(this ICommandContext ctx, ICollection items, int itemsPerPage, string title, Action> renderer) { + public static async Task Paginate(this Context ctx, ICollection items, int itemsPerPage, string title, Action> renderer) { // TODO: make this generic enough we can use it in Choose below var pageCount = (items.Count / itemsPerPage) + 1; @@ -74,7 +76,7 @@ namespace PluralKit.Bot { try { var currentPage = 0; while (true) { - var reaction = await ctx.AwaitReaction(msg, ctx.User, timeout: TimeSpan.FromMinutes(5)); + var reaction = await ctx.AwaitReaction(msg, ctx.Author, timeout: TimeSpan.FromMinutes(5)); // Increment/decrement page counter based on which reaction was clicked if (reaction.Emote.Name == "\u23EA") currentPage = 0; // << @@ -97,10 +99,10 @@ namespace PluralKit.Bot { } if (await ctx.HasPermission(ChannelPermission.ManageMessages)) await msg.RemoveAllReactionsAsync(); - else await msg.RemoveReactionsAsync(ctx.Client.CurrentUser, botEmojis); + else await msg.RemoveReactionsAsync(ctx.Shard.CurrentUser, botEmojis); } - public static async Task Choose(this ICommandContext ctx, string description, IList items, Func display = null) + public static async Task Choose(this Context ctx, string description, IList items, Func display = null) { // Generate a list of :regional_indicator_?: emoji surrogate pairs (starting at codepoint 0x1F1E6) // We just do 7 (ABCDEFG), this amount is arbitrary (although sending a lot of emojis takes a while) @@ -143,7 +145,7 @@ namespace PluralKit.Bot { while (true) { // Wait for a reaction - var reaction = await ctx.AwaitReaction(msg, ctx.User); + var reaction = await ctx.AwaitReaction(msg, ctx.Author); // If it's a movement reaction, inc/dec the page index if (reaction.Emote.Name == "\u2B05") currPage -= 1; // < @@ -160,7 +162,7 @@ namespace PluralKit.Bot { if (idx < items.Count) return items[idx]; } - var __ = msg.RemoveReactionAsync(reaction.Emote, ctx.User); // don't care about awaiting + var __ = msg.RemoveReactionAsync(reaction.Emote, ctx.Author); // don't care about awaiting await msg.ModifyAsync(mp => mp.Content = $"**[Page {currPage + 1}/{pageCount}]**\n{description}\n{MakeOptionList(currPage)}"); } } @@ -177,12 +179,12 @@ namespace PluralKit.Bot { var _ = AddEmojis(); // Then wait for a reaction and return whichever one we found - var reaction = await ctx.AwaitReaction(msg, ctx.User,rx => indicators.Contains(rx.Emote.Name)); + var reaction = await ctx.AwaitReaction(msg, ctx.Author,rx => indicators.Contains(rx.Emote.Name)); return items[Array.IndexOf(indicators, reaction.Emote.Name)]; } } - public static async Task Permissions(this ICommandContext ctx) { + public static async Task Permissions(this Context ctx) { if (ctx.Channel is IGuildChannel) { var gu = await ctx.Guild.GetCurrentUserAsync(); return gu.GetPermissions(ctx.Channel as IGuildChannel); @@ -190,9 +192,9 @@ namespace PluralKit.Bot { return ChannelPermissions.DM; } - public static async Task HasPermission(this ICommandContext ctx, ChannelPermission permission) => (await Permissions(ctx)).Has(permission); + public static async Task HasPermission(this Context ctx, ChannelPermission permission) => (await Permissions(ctx)).Has(permission); - public static async Task BusyIndicator(this ICommandContext ctx, Func f, string emoji = "\u23f3" /* hourglass */) + public static async Task BusyIndicator(this Context ctx, Func f, string emoji = "\u23f3" /* hourglass */) { await ctx.BusyIndicator(async () => { @@ -201,7 +203,7 @@ namespace PluralKit.Bot { }, emoji); } - public static async Task BusyIndicator(this ICommandContext ctx, Func> f, string emoji = "\u23f3" /* hourglass */) + public static async Task BusyIndicator(this Context ctx, Func> f, string emoji = "\u23f3" /* hourglass */) { var task = f(); @@ -215,8 +217,8 @@ namespace PluralKit.Bot { } finally { - var _ = ctx.Message.RemoveReactionAsync(new Emoji(emoji), ctx.Client.CurrentUser); + var _ = ctx.Message.RemoveReactionAsync(new Emoji(emoji), ctx.Shard.CurrentUser); } - } + } } } \ No newline at end of file diff --git a/PluralKit.Bot/Errors.cs b/PluralKit.Bot/Errors.cs index ee109805..241f986d 100644 --- a/PluralKit.Bot/Errors.cs +++ b/PluralKit.Bot/Errors.cs @@ -9,6 +9,7 @@ using PluralKit.Core; namespace PluralKit.Bot { public static class Errors { // TODO: is returning constructed errors and throwing them at call site a good idea, or should these be methods that insta-throw instead? + // or should we just like... go back to inlining them? at least for the one-time-use commands public static PKError NotOwnSystemError => new PKError($"You can only run this command on your own system."); public static PKError NotOwnMemberError => new PKError($"You can only run this command on your own member."); @@ -38,7 +39,7 @@ namespace PluralKit.Bot { public static PKError AccountAlreadyLinked => new PKError("That account is already linked to your system."); public static PKError AccountNotLinked => new PKError("That account isn't linked to your system."); public static PKError AccountInOtherSystem(PKSystem system) => new PKError($"The mentioned account is already linked to another system (see `pk;system {system.Hid}`)."); - public static PKError UnlinkingLastAccount => new PKError("Since this is the only account linked to this system, you cannot unlink it (as that would leave your system account-less)."); + public static PKError UnlinkingLastAccount => new PKError("Since this is the only account linked to this system, you cannot unlink it (as that would leave your system account-less). If you would like to delete your system, use `pk;system delete`."); public static PKError MemberLinkCancelled => new PKError("Member link cancelled."); public static PKError MemberUnlinkCancelled => new PKError("Member unlink cancelled."); diff --git a/PluralKit.Bot/PluralKit.Bot.csproj b/PluralKit.Bot/PluralKit.Bot.csproj index eb9a6af2..3bc6da4d 100644 --- a/PluralKit.Bot/PluralKit.Bot.csproj +++ b/PluralKit.Bot/PluralKit.Bot.csproj @@ -10,11 +10,11 @@ - + diff --git a/PluralKit.Bot/Preconditions.cs b/PluralKit.Bot/Preconditions.cs deleted file mode 100644 index b412599a..00000000 --- a/PluralKit.Bot/Preconditions.cs +++ /dev/null @@ -1,33 +0,0 @@ -using System; -using System.Threading.Tasks; -using Discord.Commands; - -namespace PluralKit.Bot { - class MustHaveSystem : PreconditionAttribute - { - public override Task CheckPermissionsAsync(ICommandContext context, CommandInfo command, IServiceProvider services) - { - var c = context as PKCommandContext; - if (c == null) return Task.FromResult(PreconditionResult.FromError("Must be called on a PKCommandContext (should never happen!)")) ; - if (c.SenderSystem == null) return Task.FromResult(PreconditionResult.FromError(Errors.NoSystemError)); - return Task.FromResult(PreconditionResult.FromSuccess()); - } - } - - class MustPassOwnMember : PreconditionAttribute - { - public override Task CheckPermissionsAsync(ICommandContext context, CommandInfo command, IServiceProvider services) - { - // OK when: - // - Sender has a system - // - Sender passes a member as a context parameter - // - Sender owns said member - - var c = context as PKCommandContext; - if (c.SenderSystem == null) return Task.FromResult(PreconditionResult.FromError(Errors.NoSystemError)); - if (c.GetContextEntity() == null) return Task.FromResult(PreconditionResult.FromError(Errors.MissingMemberError)); - if (c.GetContextEntity().System != c.SenderSystem.Id) return Task.FromResult(PreconditionResult.FromError(Errors.NotOwnMemberError)); - return Task.FromResult(PreconditionResult.FromSuccess()); - } - } -} \ No newline at end of file diff --git a/PluralKit.Bot/Services/ProxyService.cs b/PluralKit.Bot/Services/ProxyService.cs index ff5fe951..58b4996c 100644 --- a/PluralKit.Bot/Services/ProxyService.cs +++ b/PluralKit.Bot/Services/ProxyService.cs @@ -51,7 +51,7 @@ namespace PluralKit.Bot // eg. @Ske [text] => [@Ske text] int matchStartPosition = 0; string leadingMention = null; - if (Utils.HasMentionPrefix(message, ref matchStartPosition)) + if (Utils.HasMentionPrefix(message, ref matchStartPosition, out _)) { leadingMention = message.Substring(0, matchStartPosition); message = message.Substring(matchStartPosition); diff --git a/PluralKit.Bot/Utils.cs b/PluralKit.Bot/Utils.cs index e6a1e4fa..b7c3cd9c 100644 --- a/PluralKit.Bot/Utils.cs +++ b/PluralKit.Bot/Utils.cs @@ -5,10 +5,7 @@ using System.Net.Http; using System.Text.RegularExpressions; using System.Threading.Tasks; using Discord; -using Discord.Commands; -using Discord.Commands.Builders; -using Discord.WebSocket; -using Microsoft.Extensions.DependencyInjection; + using PluralKit.Core; using Image = SixLabors.ImageSharp.Image; @@ -68,18 +65,27 @@ namespace PluralKit.Bot } } - public static bool HasMentionPrefix(string content, ref int argPos) + public static bool HasMentionPrefix(string content, ref int argPos, out ulong mentionId) { + mentionId = 0; + // Roughly ported from Discord.Commands.MessageExtensions.HasMentionPrefix if (string.IsNullOrEmpty(content) || content.Length <= 3 || (content[0] != '<' || content[1] != '@')) return false; int num = content.IndexOf('>'); - if (num == -1 || content.Length < num + 2 || content[num + 1] != ' ' || !MentionUtils.TryParseUser(content.Substring(0, num + 1), out _)) + if (num == -1 || content.Length < num + 2 || content[num + 1] != ' ' || !MentionUtils.TryParseUser(content.Substring(0, num + 1), out mentionId)) return false; argPos = num + 2; return true; } + public static bool TryParseMention(this string potentialMention, out ulong id) + { + if (ulong.TryParse(potentialMention, out id)) return true; + if (MentionUtils.TryParseUser(potentialMention, out id)) return true; + return false; + } + public static string Sanitize(this string input) => Regex.Replace(Regex.Replace(input, "<@[!&]?(\\d{17,19})>", "<\\@$1>"), "@(everyone|here)", "@\u200B$1"); @@ -113,136 +119,9 @@ namespace PluralKit.Bot (await PermissionsIn(channel)).Has(permission); } - class PKSystemTypeReader : TypeReader - { - public override async Task ReadAsync(ICommandContext context, string input, IServiceProvider services) - { - var client = services.GetService(); - var systems = services.GetService(); - - // System references can take three forms: - // - The direct user ID of an account connected to the system - // - A @mention of an account connected to the system (<@uid>) - // - A system hid - - // First, try direct user ID parsing - if (ulong.TryParse(input, out var idFromNumber)) return await FindSystemByAccountHelper(idFromNumber, client, systems); - - // Then, try mention parsing. - if (MentionUtils.TryParseUser(input, out var idFromMention)) return await FindSystemByAccountHelper(idFromMention, client, systems); - - // Finally, try HID parsing - var res = await systems.GetByHid(input); - if (res != null) return TypeReaderResult.FromSuccess(res); - return TypeReaderResult.FromError(CommandError.ObjectNotFound, $"System with ID `{input}` not found."); - } - - async Task FindSystemByAccountHelper(ulong id, IDiscordClient client, SystemStore systems) - { - var foundByAccountId = await systems.GetByAccount(id); - if (foundByAccountId != null) return TypeReaderResult.FromSuccess(foundByAccountId); - - // We didn't find any, so we try to resolve the user ID to find the associated account, - // so we can print their username. - var user = await client.GetUserAsync(id); - - // Return descriptive errors based on whether we found the user or not. - if (user == null) return TypeReaderResult.FromError(CommandError.ObjectNotFound, $"System or account with ID `{id}` not found."); - return TypeReaderResult.FromError(CommandError.ObjectNotFound, $"Account **{user.Username}#{user.Discriminator}** not found."); - } - } - - class PKMemberTypeReader : TypeReader - { - public override async Task ReadAsync(ICommandContext context, string input, IServiceProvider services) - { - var members = services.GetRequiredService(); - - // If the sender of the command is in a system themselves, - // then try searching by the member's name - if (context is PKCommandContext ctx && ctx.SenderSystem != null) - { - var foundByName = await members.GetByName(ctx.SenderSystem, input); - if (foundByName != null) return TypeReaderResult.FromSuccess(foundByName); - } - - // Otherwise, if sender isn't in a system, or no member found by that name, - // do a standard by-hid search. - var foundByHid = await members.GetByHid(input); - if (foundByHid != null) return TypeReaderResult.FromSuccess(foundByHid); - return TypeReaderResult.FromError(CommandError.ObjectNotFound, $"Member with ID `{input}` not found."); - } - } - - /// Subclass of ICommandContext with PK-specific additional fields and functionality - public class PKCommandContext : ShardedCommandContext - { - public PKSystem SenderSystem { get; } - public IServiceProvider ServiceProvider { get; } - - private object _entity; - - public PKCommandContext(DiscordShardedClient client, SocketUserMessage msg, PKSystem system, IServiceProvider serviceProvider) : base(client, msg) - { - SenderSystem = system; - ServiceProvider = serviceProvider; - } - - public T GetContextEntity() where T: class { - return _entity as T; - } - - public void SetContextEntity(object entity) { - _entity = entity; - } - } - - public abstract class ContextParameterModuleBase : ModuleBase where T: class - { - public IServiceProvider _services { get; set; } - public CommandService _commands { get; set; } - - public abstract string Prefix { get; } - public abstract string ContextNoun { get; } - public abstract Task ReadContextParameterAsync(string value); - - public T ContextEntity => Context.GetContextEntity(); - - protected override void OnModuleBuilding(CommandService commandService, ModuleBuilder builder) { - // We create a catch-all command that intercepts the first argument, tries to parse it as - // the context parameter, then runs the command service AGAIN with that given in a wrapped - // context, with the context argument removed so it delegates to the subcommand executor - builder.AddCommand("", async (ctx, param, services, info) => { - var pkCtx = ctx as PKCommandContext; - pkCtx.SetContextEntity(param[0] as T); - - await commandService.ExecuteAsync(pkCtx, Prefix + " " + param[1] as string, services); - }, (cb) => { - cb.WithPriority(-9999); - cb.AddPrecondition(new MustNotHaveContextPrecondition()); - cb.AddParameter("contextValue", (pb) => pb.WithDefault("")); - cb.AddParameter("rest", (pb) => pb.WithDefault("").WithIsRemainder(true)); - }); - } - } - - public class MustNotHaveContextPrecondition : PreconditionAttribute - { - public MustNotHaveContextPrecondition() - { - } - - public override Task CheckPermissionsAsync(ICommandContext context, CommandInfo command, IServiceProvider services) - { - // This stops the "delegating command" we define above from being called multiple times - // If we've already added a context object to the context, then we'll return with the same - // error you get when there's an invalid command - it's like it didn't exist - // This makes sure the user gets the proper error, instead of the command trying to parse things weirdly - if ((context as PKCommandContext)?.GetContextEntity() == null) return Task.FromResult(PreconditionResult.FromSuccess()); - return Task.FromResult(PreconditionResult.FromError(command.Module.Service.Search(""))); - } - } - + /// + /// An exception class representing user-facing errors caused when parsing and executing commands. + /// public class PKError : Exception { public PKError(string message) : base(message) @@ -250,6 +129,10 @@ namespace PluralKit.Bot } } + /// + /// A subclass of that represent command syntax errors, meaning they'll have their command + /// usages printed in the message. + /// public class PKSyntaxError : PKError { public PKSyntaxError(string message) : base(message) From 845ec90c3e850865b78cd7c5dc4122adcf143bb4 Mon Sep 17 00:00:00 2001 From: Noko Date: Sat, 5 Oct 2019 15:08:27 -0500 Subject: [PATCH 45/51] Improve frontpercent performance Refactored GetTruncatedSwitchList to: - Only fetch switches in the requested range - Fetch switch members in bulk rather than one switch at a time This uses a new GetSwitchMembersList method that requires the following indexes: CREATE INDEX ix_switches_system ON public.switches USING btree (system ASC NULLS LAST) INCLUDE("timestamp") TABLESPACE pg_default; CREATE INDEX ix_switch_members_switch ON public.switch_members USING btree (switch ASC NULLS LAST) INCLUDE(member) TABLESPACE pg_default; --- PluralKit.Core/Stores.cs | 93 +++++++++++++++++++++++++++++----------- 1 file changed, 69 insertions(+), 24 deletions(-) diff --git a/PluralKit.Core/Stores.cs b/PluralKit.Core/Stores.cs index 293d6de4..9625a304 100644 --- a/PluralKit.Core/Stores.cs +++ b/PluralKit.Core/Stores.cs @@ -302,6 +302,48 @@ namespace PluralKit { return await conn.QueryAsync("select * from switches where system = @System order by timestamp desc limit @Count", new {System = system.Id, Count = count}); } + public struct SwitchMembersListEntry + { + public int Member; + public Instant Timestamp; + } + + public async Task> GetSwitchMembersList(PKSystem system, Instant start, Instant end) + { + // Wrap multiple commands in a single transaction for performance + using (var conn = await _conn.Obtain()) + using (var tx = conn.BeginTransaction()) + { + // Find the time of the last switch outside the range as it overlaps the range + // If no prior switch exists, the lower bound of the range remains the start time + var lastSwitch = await conn.QuerySingleOrDefaultAsync( + @"SELECT COALESCE(MAX(timestamp), @Start) + FROM switches + WHERE switches.system = @System + AND switches.timestamp < @Start", + new { System = system.Id, Start = start }); + + // Then collect the time and members of all switches that overlap the range + var switchMembersEntries = await conn.QueryAsync( + @"SELECT switch_members.member, switches.timestamp + FROM switches + JOIN switch_members + ON switches.id = switch_members.switch + WHERE switches.system = @System + AND ( + switches.timestamp >= @Start + OR switches.timestamp = @LastSwitch + ) + AND switches.timestamp < @End + ORDER BY switches.timestamp DESC", + new { System = system.Id, Start = start, End = end, LastSwitch = lastSwitch }); + + // Commit and return the list + tx.Commit(); + return switchMembersEntries; + } + } + public async Task> GetSwitchMemberIds(PKSwitch sw) { using (var conn = await _conn.Obtain()) @@ -351,14 +393,8 @@ namespace PluralKit { public async Task> GetTruncatedSwitchList(PKSystem system, Instant periodStart, Instant periodEnd) { - // TODO: only fetch the necessary switches here - // todo: this is in general not very efficient LOL - // returns switches in chronological (newest first) order - var switches = await GetSwitches(system); - - // we skip all switches that happened later than the range end, and taking all the ones that happened after the range start - // *BUT ALSO INCLUDING* the last switch *before* the range (that partially overlaps the range period) - var switchesInRange = switches.SkipWhile(sw => sw.Timestamp >= periodEnd).TakeWhileIncluding(sw => sw.Timestamp > periodStart).ToList(); + // Returns the timestamps and member IDs of switches overlapping the range, in chronological (newest first) order + var switchMembers = await GetSwitchMembersList(system, periodStart, periodEnd); // query DB for all members involved in any of the switches above and collect into a dictionary for future use // this makes sure the return list has the same instances of PKMember throughout, which is important for the dictionary @@ -366,34 +402,43 @@ namespace PluralKit { Dictionary memberObjects; using (var conn = await _conn.Obtain()) { - memberObjects = (await conn.QueryAsync( - "select distinct members.* from members, switch_members where switch_members.switch = any(@Switches) and switch_members.member = members.id", // lol postgres specific `= any()` syntax - new {Switches = switchesInRange.Select(sw => sw.Id).ToList()})) - .ToDictionary(m => m.Id); + memberObjects = ( + await conn.QueryAsync( + "select * from members where id = any(@Switches)", // lol postgres specific `= any()` syntax + new { Switches = switchMembers.Select(m => m.Member).Distinct().ToList() }) + ).ToDictionary(m => m.Id); } + // Initialize entries - still need to loop to determine the TimespanEnd below + var entries = + from item in switchMembers + group item by item.Timestamp into g + select new SwitchListEntry + { + TimespanStart = g.Key, + Members = g.Select(x => memberObjects[x.Member]).ToList() + }; - // we create the entry objects - var outList = new List(); - - // loop through every switch that *occurred* in-range and add it to the list - // end time is the switch *after*'s timestamp - we cheat and start it out at the range end so the first switch in-range "ends" there instead of the one after's start point + // Loop through every switch that overlaps the range and add it to the output list + // end time is the *FOLLOWING* switch's timestamp - we cheat by working backwards from the range end, so no dates need to be compared var endTime = periodEnd; - foreach (var switchInRange in switchesInRange) + var outList = new List(); + foreach (var e in entries) { - // find the start time of the switch, but clamp it to the range (only applicable to the Last Switch Before Range we include in the TakeWhileIncluding call above) - var switchStartClamped = switchInRange.Timestamp; - if (switchStartClamped < periodStart) switchStartClamped = periodStart; + // Override the start time of the switch if it's outside the range (only true for the "out of range" switch we included above) + var switchStartClamped = e.TimespanStart < periodStart + ? periodStart + : e.TimespanStart; outList.Add(new SwitchListEntry { - Members = (await GetSwitchMemberIds(switchInRange)).Select(id => memberObjects[id]).ToList(), + Members = e.Members, TimespanStart = switchStartClamped, TimespanEnd = endTime }); - // next switch's end is this switch's start - endTime = switchInRange.Timestamp; + // next switch's end is this switch's start (we're working backward in time) + endTime = e.TimespanStart; } return outList; From bc0213c9a10922c63da0f2b0a90e89e591ab80cd Mon Sep 17 00:00:00 2001 From: Noko Date: Sat, 5 Oct 2019 15:30:55 -0500 Subject: [PATCH 46/51] Added indexes to support frontpercent query changes Note: need to determine conventions to use for index names and settings going forward. There are also some indexes in production that aren't in here and are probably good additions to a standard set. --- PluralKit.Core/db_schema.sql | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/PluralKit.Core/db_schema.sql b/PluralKit.Core/db_schema.sql index 3fe1848d..d0108cca 100644 --- a/PluralKit.Core/db_schema.sql +++ b/PluralKit.Core/db_schema.sql @@ -49,6 +49,10 @@ create table if not exists switches system serial not null references systems (id) on delete cascade, timestamp timestamp not null default (current_timestamp at time zone 'utc') ); +CREATE INDEX IF NOT EXISTS idx_switches_system +ON switches USING btree ( + system ASC NULLS LAST +) INCLUDE ("timestamp"); create table if not exists switch_members ( @@ -56,6 +60,10 @@ create table if not exists switch_members switch serial not null references switches (id) on delete cascade, member serial not null references members (id) on delete cascade ); +CREATE INDEX IF NOT EXISTS idx_switch_members_switch +ON switch_members USING btree ( + switch ASC NULLS LAST +) INCLUDE (member); create table if not exists webhooks ( From adea7be07c1cce3ef9d803bf8741e6bcd974eb13 Mon Sep 17 00:00:00 2001 From: Noko Date: Sun, 6 Oct 2019 02:03:28 -0500 Subject: [PATCH 47/51] Improve export performance Refactored ExportSystem to: - Only fetch message counts once (instead of a query per member) - Fetch switches using the newly refactored GetTruncatedSwitchList (gets switches and their members in one shot instead of querying for switch members one switch at a time) - Added a new MessageCountsPerMember method to MemberStore to support the above - Modified GetTruncatedSwitchList query to retrieve switches with no members (wasn't important for frontpercent, but is if we're reusing that method here) This doesn't require any index changes beyond those that support GetTruncatedSwitchList, though we can see a small benefit with an index on messages covering the member column (valuable for other reasons outside of these additions). --- PluralKit.Core/DataFiles.cs | 49 +++++++++++++++++++------------------ PluralKit.Core/Stores.cs | 23 +++++++++++++++-- 2 files changed, 46 insertions(+), 26 deletions(-) diff --git a/PluralKit.Core/DataFiles.cs b/PluralKit.Core/DataFiles.cs index 105caad1..80518230 100644 --- a/PluralKit.Core/DataFiles.cs +++ b/PluralKit.Core/DataFiles.cs @@ -26,11 +26,34 @@ namespace PluralKit.Bot public async Task ExportSystem(PKSystem system) { + // Export members var members = new List(); - foreach (var member in await _members.GetBySystem(system)) members.Add(await ExportMember(member)); + var pkMembers = await _members.GetBySystem(system); // Read all members in the system + var messageCounts = await _members.MessageCountsPerMember(system); // Count messages proxied by all members in the system + members.AddRange(pkMembers.Select(m => new DataFileMember + { + Id = m.Hid, + Name = m.Name, + DisplayName = m.DisplayName, + Description = m.Description, + Birthday = m.Birthday != null ? Formats.DateExportFormat.Format(m.Birthday.Value) : null, + Pronouns = m.Pronouns, + Color = m.Color, + AvatarUrl = m.AvatarUrl, + Prefix = m.Prefix, + Suffix = m.Suffix, + Created = Formats.TimestampExportFormat.Format(m.Created), + MessageCount = messageCounts.Where(x => x.Member.Equals(m.Id)).Select(x => x.MessageCount).FirstOrDefault() + })); + // Export switches var switches = new List(); - foreach (var sw in await _switches.GetSwitches(system, 999999)) switches.Add(await ExportSwitch(sw)); + var switchList = await _switches.GetTruncatedSwitchList(system, Instant.FromDateTimeUtc(DateTime.MinValue.ToUniversalTime()), SystemClock.Instance.GetCurrentInstant()); + switches.AddRange(switchList.Select(x => new DataFileSwitch + { + Timestamp = Formats.TimestampExportFormat.Format(x.TimespanStart), + Members = x.Members.Select(m => m.Hid).ToList() // Look up member's HID using the member export from above + })); return new DataFileSystem { @@ -47,28 +70,6 @@ namespace PluralKit.Bot }; } - private async Task ExportMember(PKMember member) => new DataFileMember - { - Id = member.Hid, - Name = member.Name, - DisplayName = member.DisplayName, - Description = member.Description, - Birthday = member.Birthday != null ? Formats.DateExportFormat.Format(member.Birthday.Value) : null, - Pronouns = member.Pronouns, - Color = member.Color, - AvatarUrl = member.AvatarUrl, - Prefix = member.Prefix, - Suffix = member.Suffix, - Created = Formats.TimestampExportFormat.Format(member.Created), - MessageCount = await _members.MessageCount(member) - }; - - private async Task ExportSwitch(PKSwitch sw) => new DataFileSwitch - { - Members = (await _switches.GetSwitchMembers(sw)).Select(m => m.Hid).ToList(), - Timestamp = Formats.TimestampExportFormat.Format(sw.Timestamp) - }; - public async Task ImportSystem(DataFileSystem data, PKSystem system, ulong accountId) { // TODO: make atomic, somehow - we'd need to obtain one IDbConnection and reuse it diff --git a/PluralKit.Core/Stores.cs b/PluralKit.Core/Stores.cs index 81566f82..44aeeff0 100644 --- a/PluralKit.Core/Stores.cs +++ b/PluralKit.Core/Stores.cs @@ -172,6 +172,25 @@ namespace PluralKit { return await conn.QuerySingleAsync("select count(*) from messages where member = @Id", member); } + public struct MessageBreakdownListEntry + { + public int Member; + public int MessageCount; + } + + public async Task> MessageCountsPerMember(PKSystem system) + { + using (var conn = await _conn.Obtain()) + return await conn.QueryAsync( + @"SELECT messages.member, COUNT(messages.member) messagecount + FROM members + JOIN messages + ON members.id = messages.member + WHERE members.system = @System + GROUP BY messages.member", + new { System = system.Id }); + } + public async Task MemberCount(PKSystem system) { using (var conn = await _conn.Obtain()) @@ -362,7 +381,7 @@ namespace PluralKit { var switchMembersEntries = await conn.QueryAsync( @"SELECT switch_members.member, switches.timestamp FROM switches - JOIN switch_members + LEFT JOIN switch_members ON switches.id = switch_members.switch WHERE switches.system = @System AND ( @@ -451,7 +470,7 @@ namespace PluralKit { select new SwitchListEntry { TimespanStart = g.Key, - Members = g.Select(x => memberObjects[x.Member]).ToList() + Members = g.Where(x => x.Member != 0).Select(x => memberObjects[x.Member]).ToList() }; // Loop through every switch that overlaps the range and add it to the output list From 83c709b69d09283dc09fb08efe93efafd9e207cc Mon Sep 17 00:00:00 2001 From: Ske Date: Fri, 18 Oct 2019 13:14:36 +0200 Subject: [PATCH 48/51] Sanitize more inputs --- PluralKit.Bot/CommandSystem/Context.cs | 6 +++--- PluralKit.Bot/Commands/CommandTree.cs | 2 +- PluralKit.Bot/Commands/MemberCommands.cs | 16 ++++++++-------- PluralKit.Bot/Commands/MiscCommands.cs | 4 ++-- PluralKit.Bot/Commands/ModCommands.cs | 2 +- PluralKit.Bot/Commands/SwitchCommands.cs | 8 ++++---- PluralKit.Bot/Commands/SystemCommands.cs | 8 ++++---- PluralKit.Bot/Errors.cs | 24 ++++++++++++------------ PluralKit.Bot/Utils.cs | 4 ++-- 9 files changed, 37 insertions(+), 37 deletions(-) diff --git a/PluralKit.Bot/CommandSystem/Context.cs b/PluralKit.Bot/CommandSystem/Context.cs index 5b285b2a..99854d41 100644 --- a/PluralKit.Bot/CommandSystem/Context.cs +++ b/PluralKit.Bot/CommandSystem/Context.cs @@ -166,12 +166,12 @@ namespace PluralKit.Bot.CommandSystem if (input.Length == 5) { if (_senderSystem != null) - return $"Member with ID or name `{input}` not found."; - return $"Member with ID `{input}` not found."; // Accounts without systems can't query by name + return $"Member with ID or name \"{input.SanitizeMentions()}\" not found."; + return $"Member with ID \"{input.SanitizeMentions()}\" not found."; // Accounts without systems can't query by name } if (_senderSystem != null) - return $"Member with name `{input}` not found. Note that a member ID is 5 characters long."; + return $"Member with name \"{input.SanitizeMentions()}\" not found. Note that a member ID is 5 characters long."; return $"Member not found. Note that a member ID is 5 characters long."; } diff --git a/PluralKit.Bot/Commands/CommandTree.cs b/PluralKit.Bot/Commands/CommandTree.cs index 3c92d3af..2e114a5f 100644 --- a/PluralKit.Bot/Commands/CommandTree.cs +++ b/PluralKit.Bot/Commands/CommandTree.cs @@ -101,7 +101,7 @@ namespace PluralKit.Bot.Commands return ctx.Execute(PermCheck, m => m.PermCheckGuild(ctx)); ctx.Reply( - $"{Emojis.Error} Unknown command `{ctx.PeekArgument().Sanitize()}`. For a list of possible commands, see ."); + $"{Emojis.Error} Unknown command `{ctx.PeekArgument().SanitizeMentions()}`. For a list of possible commands, see ."); return Task.CompletedTask; } diff --git a/PluralKit.Bot/Commands/MemberCommands.cs b/PluralKit.Bot/Commands/MemberCommands.cs index 4ec176d6..8961b1f0 100644 --- a/PluralKit.Bot/Commands/MemberCommands.cs +++ b/PluralKit.Bot/Commands/MemberCommands.cs @@ -41,7 +41,7 @@ namespace PluralKit.Bot.Commands // Warn if there's already a member by this name var existingMember = await _members.GetByName(ctx.System, memberName); if (existingMember != null) { - var msg = await ctx.Reply($"{Emojis.Warn} You already have a member in your system with the name \"{existingMember.Name.Sanitize()}\" (with ID `{existingMember.Hid}`). Do you want to create another member with the same name?"); + var msg = await ctx.Reply($"{Emojis.Warn} You already have a member in your system with the name \"{existingMember.Name.SanitizeMentions()}\" (with ID `{existingMember.Hid}`). Do you want to create another member with the same name?"); if (!await ctx.PromptYesNo(msg)) throw new PKError("Member creation cancelled."); } @@ -49,7 +49,7 @@ namespace PluralKit.Bot.Commands var member = await _members.Create(ctx.System, memberName); // Send confirmation and space hint - await ctx.Reply($"{Emojis.Success} Member \"{memberName.Sanitize()}\" (`{member.Hid}`) registered! See the user guide for commands for editing this member: https://pluralkit.me/guide#member-management"); + await ctx.Reply($"{Emojis.Success} Member \"{memberName.SanitizeMentions()}\" (`{member.Hid}`) registered! See the user guide for commands for editing this member: https://pluralkit.me/guide#member-management"); if (memberName.Contains(" ")) await ctx.Reply($"{Emojis.Note} Note that this member's name contains spaces. You will need to surround it with \"double quotes\" when using commands referring to it, or just use the member's 5-character ID (which is `{member.Hid}`)."); await _proxyCache.InvalidateResultsForSystem(ctx.System); @@ -74,7 +74,7 @@ namespace PluralKit.Bot.Commands // Warn if there's already a member by this name var existingMember = await _members.GetByName(ctx.System, newName); if (existingMember != null) { - var msg = await ctx.Reply($"{Emojis.Warn} You already have a member in your system with the name \"{existingMember.Name.Sanitize()}\" (`{existingMember.Hid}`). Do you want to rename this member to that name too?"); + var msg = await ctx.Reply($"{Emojis.Warn} You already have a member in your system with the name \"{existingMember.Name.SanitizeMentions()}\" (`{existingMember.Hid}`). Do you want to rename this member to that name too?"); if (!await ctx.PromptYesNo(msg)) throw new PKError("Member renaming cancelled."); } @@ -84,7 +84,7 @@ namespace PluralKit.Bot.Commands await ctx.Reply($"{Emojis.Success} Member renamed."); if (newName.Contains(" ")) await ctx.Reply($"{Emojis.Note} Note that this member's name now contains spaces. You will need to surround it with \"double quotes\" when using commands referring to it."); - if (target.DisplayName != null) await ctx.Reply($"{Emojis.Note} Note that this member has a display name set (`{target.DisplayName}`), and will be proxied using that name instead."); + if (target.DisplayName != null) await ctx.Reply($"{Emojis.Note} Note that this member has a display name set ({target.DisplayName.SanitizeMentions()}), and will be proxied using that name instead."); await _proxyCache.InvalidateResultsForSystem(ctx.System); } @@ -178,7 +178,7 @@ namespace PluralKit.Bot.Commands target.Prefix = prefixAndSuffix[0].Length > 0 ? prefixAndSuffix[0] : null; target.Suffix = prefixAndSuffix[1].Length > 0 ? prefixAndSuffix[1] : null; await _members.Save(target); - await ctx.Reply($"{Emojis.Success} Member proxy tags changed to `{target.ProxyString.Sanitize()}`. Try proxying now!"); + await ctx.Reply($"{Emojis.Success} Member proxy tags changed to `{target.ProxyString.SanitizeMentions()}`. Try proxying now!"); await _proxyCache.InvalidateResultsForSystem(ctx.System); } @@ -188,7 +188,7 @@ namespace PluralKit.Bot.Commands if (ctx.System == null) throw Errors.NoSystemError; if (target.System != ctx.System.Id) throw Errors.NotOwnMemberError; - await ctx.Reply($"{Emojis.Warn} Are you sure you want to delete \"{target.Name.Sanitize()}\"? If so, reply to this message with the member's ID (`{target.Hid}`). __***This cannot be undone!***__"); + await ctx.Reply($"{Emojis.Warn} Are you sure you want to delete \"{target.Name.SanitizeMentions()}\"? If so, reply to this message with the member's ID (`{target.Hid}`). __***This cannot be undone!***__"); if (!await ctx.ConfirmWithReply(target.Hid)) throw Errors.MemberDeleteCancelled; await _members.Delete(target); await ctx.Reply($"{Emojis.Success} Member deleted."); @@ -257,7 +257,7 @@ namespace PluralKit.Bot.Commands if (newDisplayName != null) { successStr += - $"Member display name changed. This member will now be proxied using the name `{newDisplayName}`."; + $"Member display name changed. This member will now be proxied using the name \"{newDisplayName.SanitizeMentions()}\"."; } else { @@ -268,7 +268,7 @@ namespace PluralKit.Bot.Commands successStr += $" {Emojis.Warn} This member's actual name is too long ({target.Name.Length} > {ctx.System.MaxMemberNameLength} characters), and thus cannot be proxied."; else - successStr += $"This member will now be proxied using their member name `{target.Name}."; + successStr += $"This member will now be proxied using their member name \"{target.Name.SanitizeMentions()}\"."; } await ctx.Reply(successStr); diff --git a/PluralKit.Bot/Commands/MiscCommands.cs b/PluralKit.Bot/Commands/MiscCommands.cs index da69e555..4ddf56e3 100644 --- a/PluralKit.Bot/Commands/MiscCommands.cs +++ b/PluralKit.Bot/Commands/MiscCommands.cs @@ -59,7 +59,7 @@ namespace PluralKit.Bot.Commands { public async Task PermCheckGuild(Context ctx) { var guildIdStr = ctx.PopArgument() ?? throw new PKSyntaxError("You must pass a server ID."); - if (!ulong.TryParse(guildIdStr, out var guildId)) throw new PKSyntaxError($"Could not parse `{guildIdStr}` as an ID."); + if (!ulong.TryParse(guildIdStr, out var guildId)) throw new PKSyntaxError($"Could not parse `{guildIdStr.SanitizeMentions()}` as an ID."); // TODO: will this call break for sharding if you try to request a guild on a different bot instance? var guild = ctx.Client.GetGuild(guildId) as IGuild; @@ -97,7 +97,7 @@ namespace PluralKit.Bot.Commands { // Generate the output embed var eb = new EmbedBuilder() - .WithTitle($"Permission check for **{guild.Name}**"); + .WithTitle($"Permission check for **{guild.Name.SanitizeMentions()}**"); if (permissionsMissing.Count == 0) { diff --git a/PluralKit.Bot/Commands/ModCommands.cs b/PluralKit.Bot/Commands/ModCommands.cs index 19624640..df7c89fb 100644 --- a/PluralKit.Bot/Commands/ModCommands.cs +++ b/PluralKit.Bot/Commands/ModCommands.cs @@ -31,7 +31,7 @@ namespace PluralKit.Bot.Commands await _logChannels.SetLogChannel(ctx.Guild, channel); if (channel != null) - await ctx.Reply($"{Emojis.Success} Proxy logging channel set to #{channel.Name.Sanitize()}."); + await ctx.Reply($"{Emojis.Success} Proxy logging channel set to #{channel.Name.SanitizeMentions()}."); else await ctx.Reply($"{Emojis.Success} Proxy logging channel cleared."); } diff --git a/PluralKit.Bot/Commands/SwitchCommands.cs b/PluralKit.Bot/Commands/SwitchCommands.cs index 788309fc..d026c733 100644 --- a/PluralKit.Bot/Commands/SwitchCommands.cs +++ b/PluralKit.Bot/Commands/SwitchCommands.cs @@ -69,7 +69,7 @@ namespace PluralKit.Bot.Commands if (members.Count == 0) await ctx.Reply($"{Emojis.Success} Switch-out registered."); else - await ctx.Reply($"{Emojis.Success} Switch registered. Current fronter is now {string.Join(", ", members.Select(m => m.Name)).Sanitize()}."); + await ctx.Reply($"{Emojis.Success} Switch registered. Current fronter is now {string.Join(", ", members.Select(m => m.Name)).SanitizeMentions()}."); } public async Task SwitchMove(Context ctx) @@ -108,7 +108,7 @@ namespace PluralKit.Bot.Commands var newSwitchDeltaStr = Formats.DurationFormat.Format(SystemClock.Instance.GetCurrentInstant() - time.ToInstant()); // yeet - var msg = await ctx.Reply($"{Emojis.Warn} This will move the latest switch ({lastSwitchMemberStr.Sanitize()}) from {lastSwitchTimeStr} ({lastSwitchDeltaStr} ago) to {newSwitchTimeStr} ({newSwitchDeltaStr} ago). Is this OK?"); + var msg = await ctx.Reply($"{Emojis.Warn} This will move the latest switch ({lastSwitchMemberStr.SanitizeMentions()}) from {lastSwitchTimeStr} ({lastSwitchDeltaStr} ago) to {newSwitchTimeStr} ({newSwitchDeltaStr} ago). Is this OK?"); if (!await ctx.PromptYesNo(msg)) throw Errors.SwitchMoveCancelled; // aaaand *now* we do the move @@ -132,7 +132,7 @@ namespace PluralKit.Bot.Commands if (lastTwoSwitches.Length == 1) { msg = await ctx.Reply( - $"{Emojis.Warn} This will delete the latest switch ({lastSwitchMemberStr.Sanitize()}, {lastSwitchDeltaStr} ago). You have no other switches logged. Is this okay?"); + $"{Emojis.Warn} This will delete the latest switch ({lastSwitchMemberStr.SanitizeMentions()}, {lastSwitchDeltaStr} ago). You have no other switches logged. Is this okay?"); } else { @@ -140,7 +140,7 @@ namespace PluralKit.Bot.Commands var secondSwitchMemberStr = string.Join(", ", secondSwitchMembers.Select(m => m.Name)); var secondSwitchDeltaStr = Formats.DurationFormat.Format(SystemClock.Instance.GetCurrentInstant() - lastTwoSwitches[1].Timestamp); msg = await ctx.Reply( - $"{Emojis.Warn} This will delete the latest switch ({lastSwitchMemberStr.Sanitize()}, {lastSwitchDeltaStr} ago). The next latest switch is {secondSwitchMemberStr.Sanitize()} ({secondSwitchDeltaStr} ago). Is this okay?"); + $"{Emojis.Warn} This will delete the latest switch ({lastSwitchMemberStr.SanitizeMentions()}, {lastSwitchDeltaStr} ago). The next latest switch is {secondSwitchMemberStr.SanitizeMentions()} ({secondSwitchDeltaStr} ago). Is this okay?"); } if (!await ctx.PromptYesNo(msg)) throw Errors.SwitchDeleteCancelled; diff --git a/PluralKit.Bot/Commands/SystemCommands.cs b/PluralKit.Bot/Commands/SystemCommands.cs index 7c3f554f..dbb61a6d 100644 --- a/PluralKit.Bot/Commands/SystemCommands.cs +++ b/PluralKit.Bot/Commands/SystemCommands.cs @@ -85,7 +85,7 @@ namespace PluralKit.Bot.Commands if (unproxyableMembers.Count > 0) { var msg = await ctx.Reply( - $"{Emojis.Warn} Changing your system tag to '{newTag}' will result in the following members being unproxyable, since the tag would bring their name over {Limits.MaxProxyNameLength} characters:\n**{string.Join(", ", unproxyableMembers.Select((m) => m.Name))}**\nDo you want to continue anyway?"); + $"{Emojis.Warn} Changing your system tag to '{newTag.SanitizeMentions()}' will result in the following members being unproxyable, since the tag would bring their name over {Limits.MaxProxyNameLength} characters:\n**{string.Join(", ", unproxyableMembers.Select((m) => m.Name.SanitizeMentions()))}**\nDo you want to continue anyway?"); if (!await ctx.PromptYesNo(msg)) throw new PKError("Tag change cancelled."); } } @@ -143,14 +143,14 @@ namespace PluralKit.Bot.Commands if (system == null) throw Errors.NoSystemError; var members = await _members.GetBySystem(system); - var embedTitle = system.Name != null ? $"Members of {system.Name} (`{system.Hid}`)" : $"Members of `{system.Hid}`"; + var embedTitle = system.Name != null ? $"Members of {system.Name.SanitizeMentions()} (`{system.Hid}`)" : $"Members of `{system.Hid}`"; await ctx.Paginate( members.OrderBy(m => m.Name).ToList(), 25, embedTitle, (eb, ms) => eb.Description = string.Join("\n", ms.Select((m) => { - if (m.HasProxyTags) return $"[`{m.Hid}`] **{m.Name}** *({m.ProxyString})*"; - return $"[`{m.Hid}`] **{m.Name}**"; + if (m.HasProxyTags) return $"[`{m.Hid}`] **{m.Name.SanitizeMentions()}** *({m.ProxyString.SanitizeMentions()})*"; + return $"[`{m.Hid}`] **{m.Name.SanitizeMentions()}**"; })) ); } diff --git a/PluralKit.Bot/Errors.cs b/PluralKit.Bot/Errors.cs index 241f986d..2d5d79ed 100644 --- a/PluralKit.Bot/Errors.cs +++ b/PluralKit.Bot/Errors.cs @@ -23,15 +23,15 @@ namespace PluralKit.Bot { public static PKError MemberNameTooLongError(int length) => new PKError($"Member name too long ({length}/{Limits.MaxMemberNameLength} characters)."); public static PKError MemberPronounsTooLongError(int length) => new PKError($"Member pronouns too long ({length}/{Limits.MaxMemberNameLength} characters)."); - public static PKError InvalidColorError(string color) => new PKError($"\"{color.Sanitize()}\" is not a valid color. Color must be in 6-digit RGB hex format (eg. #ff0000)."); - public static PKError BirthdayParseError(string birthday) => new PKError($"\"{birthday.Sanitize()}\" could not be parsed as a valid date. Try a format like \"2016-12-24\" or \"May 3 1996\"."); + public static PKError InvalidColorError(string color) => new PKError($"\"{color.SanitizeMentions()}\" is not a valid color. Color must be in 6-digit RGB hex format (eg. #ff0000)."); + public static PKError BirthdayParseError(string birthday) => new PKError($"\"{birthday.SanitizeMentions()}\" could not be parsed as a valid date. Try a format like \"2016-12-24\" or \"May 3 1996\"."); public static PKError ProxyMustHaveText => new PKSyntaxError("Example proxy message must contain the string 'text'."); public static PKError ProxyMultipleText => new PKSyntaxError("Example proxy message must contain the string 'text' exactly once."); public static PKError MemberDeleteCancelled => new PKError($"Member deletion cancelled. Stay safe! {Emojis.ThumbsUp}"); public static PKError AvatarServerError(HttpStatusCode statusCode) => new PKError($"Server responded with status code {(int) statusCode}, are you sure your link is working?"); public static PKError AvatarFileSizeLimit(long size) => new PKError($"File size too large ({size.Bytes().ToString("#.#")} > {Limits.AvatarFileSizeLimit.Bytes().ToString("#.#")}), try shrinking or compressing the image."); - public static PKError AvatarNotAnImage(string mimeType) => new PKError($"The given link does not point to an image{(mimeType != null ? $" ({mimeType.Sanitize()})" : "")}. Make sure you're using a direct link (ending in .jpg, .png, .gif)."); + public static PKError AvatarNotAnImage(string mimeType) => new PKError($"The given link does not point to an image{(mimeType != null ? $" ({mimeType.SanitizeMentions()})" : "")}. Make sure you're using a direct link (ending in .jpg, .png, .gif)."); public static PKError AvatarDimensionsTooLarge(int width, int height) => new PKError($"Image too large ({width}x{height} > {Limits.AvatarDimensionLimit}x{Limits.AvatarDimensionLimit}), try resizing the image."); public static PKError UserHasNoAvatar => new PKError("The given user has no avatar set."); public static PKError InvalidUrl(string url) => new PKError($"The given URL is invalid."); @@ -46,38 +46,38 @@ namespace PluralKit.Bot { public static PKError SameSwitch(ICollection members) { if (members.Count == 0) return new PKError("There's already no one in front."); - if (members.Count == 1) return new PKError($"Member {members.First().Name.Sanitize()} is already fronting."); - return new PKError($"Members {string.Join(", ", members.Select(m => m.Name.Sanitize()))} are already fronting."); + if (members.Count == 1) return new PKError($"Member {members.First().Name.SanitizeMentions()} is already fronting."); + return new PKError($"Members {string.Join(", ", members.Select(m => m.Name.SanitizeMentions()))} are already fronting."); } public static PKError DuplicateSwitchMembers => new PKError("Duplicate members in member list."); public static PKError SwitchMemberNotInSystem => new PKError("One or more switch members aren't in your own system."); - public static PKError InvalidDateTime(string str) => new PKError($"Could not parse '{str.Sanitize()}' as a valid date/time. Try using a syntax such as \"May 21, 12:30 PM\" or \"3d12h\" (ie. 3 days, 12 hours ago)."); + public static PKError InvalidDateTime(string str) => new PKError($"Could not parse '{str.SanitizeMentions()}' as a valid date/time. Try using a syntax such as \"May 21, 12:30 PM\" or \"3d12h\" (ie. 3 days, 12 hours ago)."); public static PKError SwitchTimeInFuture => new PKError("Can't move switch to a time in the future."); public static PKError NoRegisteredSwitches => new PKError("There are no registered switches for this system."); public static PKError SwitchMoveBeforeSecondLast(ZonedDateTime time) => new PKError($"Can't move switch to before last switch time ({Formats.ZonedDateTimeFormat.Format(time)}), as it would cause conflicts."); public static PKError SwitchMoveCancelled => new PKError("Switch move cancelled."); public static PKError SwitchDeleteCancelled => new PKError("Switch deletion cancelled."); - public static PKError TimezoneParseError(string timezone) => new PKError($"Could not parse timezone offset {timezone.Sanitize()}. Offset must be a value like 'UTC+5' or 'GMT-4:30'."); + public static PKError TimezoneParseError(string timezone) => new PKError($"Could not parse timezone offset {timezone.SanitizeMentions()}. Offset must be a value like 'UTC+5' or 'GMT-4:30'."); - public static PKError InvalidTimeZone(string zoneStr) => new PKError($"Invalid time zone ID '{zoneStr.Sanitize()}'. To find your time zone ID, use the following website: "); + public static PKError InvalidTimeZone(string zoneStr) => new PKError($"Invalid time zone ID '{zoneStr.SanitizeMentions()}'. To find your time zone ID, use the following website: "); public static PKError TimezoneChangeCancelled => new PKError("Time zone change cancelled."); - public static PKError AmbiguousTimeZone(string zoneStr, int count) => new PKError($"The time zone query '{zoneStr.Sanitize()}' resulted in **{count}** different time zone regions. Try being more specific - e.g. pass an exact time zone specifier from the following website: "); + public static PKError AmbiguousTimeZone(string zoneStr, int count) => new PKError($"The time zone query '{zoneStr.SanitizeMentions()}' resulted in **{count}** different time zone regions. Try being more specific - e.g. pass an exact time zone specifier from the following website: "); public static PKError NoImportFilePassed => new PKError("You must either pass an URL to a file as a command parameter, or as an attachment to the message containing the command."); public static PKError InvalidImportFile => new PKError("Imported data file invalid. Make sure this is a .json file directly exported from PluralKit or Tupperbox."); public static PKError ImportCancelled => new PKError("Import cancelled."); public static PKError MessageNotFound(ulong id) => new PKError($"Message with ID '{id}' not found. Are you sure it's a message proxied by PluralKit?"); - public static PKError DurationParseError(string durationStr) => new PKError($"Could not parse '{durationStr.Sanitize()}' as a valid duration. Try a format such as `30d`, `1d3h` or `20m30s`."); + public static PKError DurationParseError(string durationStr) => new PKError($"Could not parse '{durationStr.SanitizeMentions()}' as a valid duration. Try a format such as `30d`, `1d3h` or `20m30s`."); public static PKError FrontPercentTimeInFuture => new PKError("Cannot get the front percent between now and a time in the future."); public static PKError GuildNotFound(ulong guildId) => new PKError($"Guild with ID {guildId} not found."); public static PKError DisplayNameTooLong(string displayName, int maxLength) => new PKError( $"Display name too long ({displayName.Length} > {maxLength} characters). Use a shorter display name, or shorten your system tag."); - public static PKError ProxyNameTooShort(string name) => new PKError($"The webhook's name, `{name}`, is shorter than two characters, and thus cannot be proxied. Please change the member name or use a longer system tag."); - public static PKError ProxyNameTooLong(string name) => new PKError($"The webhook's name, `{name}`, is too long ({name.Length} > {Limits.MaxProxyNameLength} characters), and thus cannot be proxied. Please change the member name or use a shorter system tag."); + public static PKError ProxyNameTooShort(string name) => new PKError($"The webhook's name, `{name.SanitizeMentions()}`, is shorter than two characters, and thus cannot be proxied. Please change the member name or use a longer system tag."); + public static PKError ProxyNameTooLong(string name) => new PKError($"The webhook's name, {name.SanitizeMentions()}, is too long ({name.Length} > {Limits.MaxProxyNameLength} characters), and thus cannot be proxied. Please change the member name or use a shorter system tag."); } } \ No newline at end of file diff --git a/PluralKit.Bot/Utils.cs b/PluralKit.Bot/Utils.cs index b7c3cd9c..3bac36fa 100644 --- a/PluralKit.Bot/Utils.cs +++ b/PluralKit.Bot/Utils.cs @@ -86,8 +86,8 @@ namespace PluralKit.Bot return false; } - public static string Sanitize(this string input) => - Regex.Replace(Regex.Replace(input, "<@[!&]?(\\d{17,19})>", "<\\@$1>"), "@(everyone|here)", "@\u200B$1"); + public static string SanitizeMentions(this string input) => + Regex.Replace(Regex.Replace(input, "<@[!&]?(\\d{17,19})>", "<\u200B@$1>"), "@(everyone|here)", "@\u200B$1"); public static string SanitizeEveryone(this string input) => Regex.Replace(input, "@(everyone|here)", "@\u200B$1"); From 49dede7ff84f589b0a7706b94dc1958354fa7137 Mon Sep 17 00:00:00 2001 From: Ske Date: Fri, 18 Oct 2019 13:19:17 +0200 Subject: [PATCH 49/51] Remove compiler warning from API --- PluralKit.API/Controllers/SystemController.cs | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/PluralKit.API/Controllers/SystemController.cs b/PluralKit.API/Controllers/SystemController.cs index 372100f7..24f4f6df 100644 --- a/PluralKit.API/Controllers/SystemController.cs +++ b/PluralKit.API/Controllers/SystemController.cs @@ -48,9 +48,9 @@ namespace PluralKit.API.Controllers [HttpGet] [RequiresSystem] - public async Task> GetOwnSystem() + public Task> GetOwnSystem() { - return Ok(_auth.CurrentSystem); + return Task.FromResult>(Ok(_auth.CurrentSystem)); } [HttpGet("{hid}")] From c4d28f64c7d997c3e91fa9a92f7adbbee50a03bc Mon Sep 17 00:00:00 2001 From: Ske Date: Fri, 18 Oct 2019 13:29:16 +0200 Subject: [PATCH 50/51] Display system/member created date in embed footer. Closes #122. --- PluralKit.Bot/Services/EmbedService.cs | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/PluralKit.Bot/Services/EmbedService.cs b/PluralKit.Bot/Services/EmbedService.cs index ee8720db..fe4438b1 100644 --- a/PluralKit.Bot/Services/EmbedService.cs +++ b/PluralKit.Bot/Services/EmbedService.cs @@ -36,8 +36,8 @@ namespace PluralKit.Bot { .WithColor(Color.Blue) .WithTitle(system.Name ?? null) .WithThumbnailUrl(system.AvatarUrl ?? null) - .WithFooter($"System ID: {system.Hid}"); - + .WithFooter($"System ID: {system.Hid} | Created on {Formats.ZonedDateTimeFormat.Format(system.Created.InZone(system.Zone))}"); + var latestSwitch = await _switches.GetLatestSwitch(system); if (latestSwitch != null) { @@ -91,7 +91,7 @@ namespace PluralKit.Bot { // TODO: add URL of website when that's up .WithAuthor(name, member.AvatarUrl) .WithColor(color) - .WithFooter($"System ID: {system.Hid} | Member ID: {member.Hid}"); + .WithFooter($"System ID: {system.Hid} | Member ID: {member.Hid} | Created on {Formats.ZonedDateTimeFormat.Format(member.Created.InZone(system.Zone))}"); if (member.AvatarUrl != null) eb.WithThumbnailUrl(member.AvatarUrl); From 4ce4efcc618283a8d01129b3af75e78287d7926f Mon Sep 17 00:00:00 2001 From: Ske Date: Fri, 18 Oct 2019 13:34:54 +0200 Subject: [PATCH 51/51] Fix importing brackets from Tupperbox. Closes #123 --- PluralKit.Core/DataFiles.cs | 4 ++-- PluralKit.Core/Utils.cs | 5 +++++ 2 files changed, 7 insertions(+), 2 deletions(-) diff --git a/PluralKit.Core/DataFiles.cs b/PluralKit.Core/DataFiles.cs index 4af01299..8c839269 100644 --- a/PluralKit.Core/DataFiles.cs +++ b/PluralKit.Core/DataFiles.cs @@ -307,8 +307,8 @@ namespace PluralKit.Bot AvatarUrl = AvatarUrl, Birthday = Birthday, Description = Description, - Prefix = Brackets.FirstOrDefault(), - Suffix = Brackets.Skip(1).FirstOrDefault() // TODO: can Tupperbox members have no proxies at all? + Prefix = Brackets.FirstOrDefault().NullIfEmpty(), + Suffix = Brackets.Skip(1).FirstOrDefault().NullIfEmpty() // TODO: can Tupperbox members have no proxies at all? }; } } diff --git a/PluralKit.Core/Utils.cs b/PluralKit.Core/Utils.cs index 615a7eeb..b71c5b6a 100644 --- a/PluralKit.Core/Utils.cs +++ b/PluralKit.Core/Utils.cs @@ -246,6 +246,11 @@ namespace PluralKit yield break; } } + + public static string NullIfEmpty(this string input) + { + return input.Trim().Length == 0 ? null : input; + } } public static class Emojis {