2019-10-05 05:41:00 +00:00
|
|
|
using System;
|
2020-06-20 15:33:10 +00:00
|
|
|
using System.Collections.Generic;
|
2019-10-05 05:41:00 +00:00
|
|
|
using System.Threading.Tasks;
|
|
|
|
|
2019-12-21 20:51:41 +00:00
|
|
|
using App.Metrics;
|
|
|
|
|
2020-01-26 00:27:45 +00:00
|
|
|
using Autofac;
|
|
|
|
|
2020-04-17 21:10:01 +00:00
|
|
|
using DSharpPlus;
|
|
|
|
using DSharpPlus.Entities;
|
|
|
|
|
2020-02-12 14:16:19 +00:00
|
|
|
using PluralKit.Core;
|
2019-10-05 05:41:00 +00:00
|
|
|
|
2020-02-12 14:16:19 +00:00
|
|
|
namespace PluralKit.Bot
|
2019-10-05 05:41:00 +00:00
|
|
|
{
|
|
|
|
public class Context
|
|
|
|
{
|
2020-08-29 11:46:27 +00:00
|
|
|
private readonly ILifetimeScope _provider;
|
2019-10-05 05:41:00 +00:00
|
|
|
|
2020-04-24 19:50:28 +00:00
|
|
|
private readonly DiscordRestClient _rest;
|
2019-10-05 05:41:00 +00:00
|
|
|
private readonly DiscordShardedClient _client;
|
2020-04-17 21:10:01 +00:00
|
|
|
private readonly DiscordClient _shard;
|
|
|
|
private readonly DiscordMessage _message;
|
2019-10-05 05:41:00 +00:00
|
|
|
private readonly Parameters _parameters;
|
2020-06-13 14:03:57 +00:00
|
|
|
private readonly MessageContext _messageContext;
|
2019-10-05 05:41:00 +00:00
|
|
|
|
2020-06-29 21:51:12 +00:00
|
|
|
private readonly IDatabase _db;
|
2020-08-29 11:46:27 +00:00
|
|
|
private readonly ModelRepository _repo;
|
2019-10-05 05:41:00 +00:00
|
|
|
private readonly PKSystem _senderSystem;
|
2019-12-21 20:51:41 +00:00
|
|
|
private readonly IMetrics _metrics;
|
2019-10-05 05:41:00 +00:00
|
|
|
|
|
|
|
private Command _currentCommand;
|
|
|
|
|
2020-04-17 21:10:01 +00:00
|
|
|
public Context(ILifetimeScope provider, DiscordClient shard, DiscordMessage message, int commandParseOffset,
|
2020-06-13 14:03:57 +00:00
|
|
|
PKSystem senderSystem, MessageContext messageContext)
|
2019-10-05 05:41:00 +00:00
|
|
|
{
|
2020-04-24 19:50:28 +00:00
|
|
|
_rest = provider.Resolve<DiscordRestClient>();
|
2020-01-26 00:27:45 +00:00
|
|
|
_client = provider.Resolve<DiscordShardedClient>();
|
2019-10-05 05:41:00 +00:00
|
|
|
_message = message;
|
2020-04-17 21:10:01 +00:00
|
|
|
_shard = shard;
|
2019-10-05 05:41:00 +00:00
|
|
|
_senderSystem = senderSystem;
|
2020-06-13 14:03:57 +00:00
|
|
|
_messageContext = messageContext;
|
2020-06-29 21:51:12 +00:00
|
|
|
_db = provider.Resolve<IDatabase>();
|
2020-08-29 11:46:27 +00:00
|
|
|
_repo = provider.Resolve<ModelRepository>();
|
2020-01-26 00:27:45 +00:00
|
|
|
_metrics = provider.Resolve<IMetrics>();
|
2019-10-05 05:41:00 +00:00
|
|
|
_provider = provider;
|
|
|
|
_parameters = new Parameters(message.Content.Substring(commandParseOffset));
|
|
|
|
}
|
|
|
|
|
2020-04-17 21:10:01 +00:00
|
|
|
public DiscordUser Author => _message.Author;
|
|
|
|
public DiscordChannel Channel => _message.Channel;
|
|
|
|
public DiscordMessage Message => _message;
|
|
|
|
public DiscordGuild Guild => _message.Channel.Guild;
|
|
|
|
public DiscordClient Shard => _shard;
|
2019-10-05 05:41:00 +00:00
|
|
|
public DiscordShardedClient Client => _client;
|
2020-06-13 14:03:57 +00:00
|
|
|
public MessageContext MessageContext => _messageContext;
|
2020-04-24 19:50:28 +00:00
|
|
|
|
|
|
|
public DiscordRestClient Rest => _rest;
|
|
|
|
|
2019-10-05 05:41:00 +00:00
|
|
|
public PKSystem System => _senderSystem;
|
2020-07-01 16:27:26 +00:00
|
|
|
|
|
|
|
public Parameters Parameters => _parameters;
|
2019-10-05 05:41:00 +00:00
|
|
|
|
2020-06-29 21:51:12 +00:00
|
|
|
internal IDatabase Database => _db;
|
2020-08-29 11:46:27 +00:00
|
|
|
internal ModelRepository Repository => _repo;
|
2019-10-05 05:41:00 +00:00
|
|
|
|
2020-06-20 15:33:10 +00:00
|
|
|
public Task<DiscordMessage> Reply(string text = null, DiscordEmbed embed = null, IEnumerable<IMention> mentions = null)
|
2020-02-24 08:57:16 +00:00
|
|
|
{
|
2020-05-02 13:29:36 +00:00
|
|
|
if (!this.BotHasAllPermissions(Permissions.SendMessages))
|
2020-02-24 08:57:16 +00:00
|
|
|
// Will be "swallowed" during the error handler anyway, this message is never shown.
|
|
|
|
throw new PKError("PluralKit does not have permission to send messages in this channel.");
|
|
|
|
|
2020-05-02 13:29:36 +00:00
|
|
|
if (embed != null && !this.BotHasAllPermissions(Permissions.EmbedLinks))
|
2020-02-24 08:57:16 +00:00
|
|
|
throw new PKError("PluralKit does not have permission to send embeds in this channel. Please ensure I have the **Embed Links** permission enabled.");
|
2020-06-20 15:33:10 +00:00
|
|
|
return Channel.SendMessageFixedAsync(text, embed: embed, mentions: mentions);
|
2020-02-24 08:57:16 +00:00
|
|
|
}
|
2020-01-11 15:49:20 +00:00
|
|
|
|
2019-10-05 05:41:00 +00:00
|
|
|
public async Task Execute<T>(Command commandDef, Func<T, Task> handler)
|
|
|
|
{
|
|
|
|
_currentCommand = commandDef;
|
|
|
|
|
|
|
|
try
|
|
|
|
{
|
2020-01-26 00:27:45 +00:00
|
|
|
await handler(_provider.Resolve<T>());
|
2019-12-21 20:51:41 +00:00
|
|
|
_metrics.Measure.Meter.Mark(BotMetrics.CommandsRun);
|
2019-10-05 05:41:00 +00:00
|
|
|
}
|
|
|
|
catch (PKSyntaxError e)
|
|
|
|
{
|
2019-12-28 11:16:26 +00:00
|
|
|
await Reply($"{Emojis.Error} {e.Message}\n**Command usage:**\n> pk;{commandDef.Usage}");
|
2019-10-05 05:41:00 +00:00
|
|
|
}
|
|
|
|
catch (PKError e)
|
|
|
|
{
|
|
|
|
await Reply($"{Emojis.Error} {e.Message}");
|
|
|
|
}
|
2019-10-26 17:45:30 +00:00
|
|
|
catch (TimeoutException)
|
2019-10-22 17:31:40 +00:00
|
|
|
{
|
|
|
|
// Got a complaint the old error was a bit too patronizing. Hopefully this is better?
|
|
|
|
await Reply($"{Emojis.Error} Operation timed out, sorry. Try again, perhaps?");
|
|
|
|
}
|
2019-10-05 05:41:00 +00:00
|
|
|
}
|
|
|
|
|
2020-01-11 15:49:20 +00:00
|
|
|
public LookupContext LookupContextFor(PKSystem target) =>
|
|
|
|
System?.Id == target.Id ? LookupContext.ByOwner : LookupContext.ByNonOwner;
|
2020-02-27 23:23:54 +00:00
|
|
|
|
2020-06-14 19:37:04 +00:00
|
|
|
public LookupContext LookupContextFor(SystemId systemId) =>
|
2020-02-27 23:23:54 +00:00
|
|
|
System?.Id == systemId ? LookupContext.ByOwner : LookupContext.ByNonOwner;
|
2020-06-18 15:08:36 +00:00
|
|
|
|
|
|
|
public LookupContext LookupContextFor(PKMember target) =>
|
|
|
|
System?.Id == target.System ? LookupContext.ByOwner : LookupContext.ByNonOwner;
|
2020-07-01 16:27:26 +00:00
|
|
|
|
2020-05-05 14:03:46 +00:00
|
|
|
public IComponentContext Services => _provider;
|
2019-10-05 05:41:00 +00:00
|
|
|
}
|
|
|
|
}
|