| @@ -6,6 +6,6 @@ namespace Discord.Commands | |||||
| [AttributeUsage(AttributeTargets.Parameter, AllowMultiple = true, Inherited = true)] | [AttributeUsage(AttributeTargets.Parameter, AllowMultiple = true, Inherited = true)] | ||||
| public abstract class ParameterPreconditionAttribute : Attribute | public abstract class ParameterPreconditionAttribute : Attribute | ||||
| { | { | ||||
| public abstract Task<PreconditionResult> CheckPermissions(CommandContext context, ParameterInfo parameter, object value, IDependencyMap map); | |||||
| public abstract Task<PreconditionResult> CheckPermissions(ICommandContext context, ParameterInfo parameter, object value, IDependencyMap map); | |||||
| } | } | ||||
| } | } | ||||
| @@ -6,6 +6,6 @@ namespace Discord.Commands | |||||
| [AttributeUsage(AttributeTargets.Method | AttributeTargets.Class, AllowMultiple = true, Inherited = true)] | [AttributeUsage(AttributeTargets.Method | AttributeTargets.Class, AllowMultiple = true, Inherited = true)] | ||||
| public abstract class PreconditionAttribute : Attribute | public abstract class PreconditionAttribute : Attribute | ||||
| { | { | ||||
| public abstract Task<PreconditionResult> CheckPermissions(CommandContext context, CommandInfo command, IDependencyMap map); | |||||
| public abstract Task<PreconditionResult> CheckPermissions(ICommandContext context, CommandInfo command, IDependencyMap map); | |||||
| } | } | ||||
| } | } | ||||
| @@ -41,7 +41,7 @@ namespace Discord.Commands | |||||
| GuildPermission = null; | GuildPermission = null; | ||||
| } | } | ||||
| public override async Task<PreconditionResult> CheckPermissions(CommandContext context, CommandInfo command, IDependencyMap map) | |||||
| public override async Task<PreconditionResult> CheckPermissions(ICommandContext context, CommandInfo command, IDependencyMap map) | |||||
| { | { | ||||
| var guildUser = await context.Guild.GetCurrentUserAsync(); | var guildUser = await context.Guild.GetCurrentUserAsync(); | ||||
| @@ -37,7 +37,7 @@ namespace Discord.Commands | |||||
| Contexts = contexts; | Contexts = contexts; | ||||
| } | } | ||||
| public override Task<PreconditionResult> CheckPermissions(CommandContext context, CommandInfo command, IDependencyMap map) | |||||
| public override Task<PreconditionResult> CheckPermissions(ICommandContext context, CommandInfo command, IDependencyMap map) | |||||
| { | { | ||||
| bool isValid = false; | bool isValid = false; | ||||
| @@ -10,7 +10,7 @@ namespace Discord.Commands | |||||
| [AttributeUsage(AttributeTargets.Class | AttributeTargets.Method, AllowMultiple = false, Inherited = true)] | [AttributeUsage(AttributeTargets.Class | AttributeTargets.Method, AllowMultiple = false, Inherited = true)] | ||||
| public class RequireOwnerAttribute : PreconditionAttribute | public class RequireOwnerAttribute : PreconditionAttribute | ||||
| { | { | ||||
| public override async Task<PreconditionResult> CheckPermissions(CommandContext context, CommandInfo command, IDependencyMap map) | |||||
| public override async Task<PreconditionResult> CheckPermissions(ICommandContext context, CommandInfo command, IDependencyMap map) | |||||
| { | { | ||||
| var application = await context.Client.GetApplicationInfoAsync(); | var application = await context.Client.GetApplicationInfoAsync(); | ||||
| if (context.User.Id == application.Owner.Id) return PreconditionResult.FromSuccess(); | if (context.User.Id == application.Owner.Id) return PreconditionResult.FromSuccess(); | ||||
| @@ -42,7 +42,7 @@ namespace Discord.Commands | |||||
| GuildPermission = null; | GuildPermission = null; | ||||
| } | } | ||||
| public override Task<PreconditionResult> CheckPermissions(CommandContext context, CommandInfo command, IDependencyMap map) | |||||
| public override Task<PreconditionResult> CheckPermissions(ICommandContext context, CommandInfo command, IDependencyMap map) | |||||
| { | { | ||||
| var guildUser = context.User as IGuildUser; | var guildUser = context.User as IGuildUser; | ||||
| @@ -12,7 +12,7 @@ namespace Discord.Commands.Builders | |||||
| private readonly List<string> _aliases; | private readonly List<string> _aliases; | ||||
| public ModuleBuilder Module { get; } | public ModuleBuilder Module { get; } | ||||
| internal Func<CommandContext, object[], IDependencyMap, Task> Callback { get; set; } | |||||
| internal Func<ICommandContext, object[], IDependencyMap, Task> Callback { get; set; } | |||||
| public string Name { get; set; } | public string Name { get; set; } | ||||
| public string Summary { get; set; } | public string Summary { get; set; } | ||||
| @@ -34,7 +34,7 @@ namespace Discord.Commands.Builders | |||||
| _aliases = new List<string>(); | _aliases = new List<string>(); | ||||
| } | } | ||||
| //User-defined | //User-defined | ||||
| internal CommandBuilder(ModuleBuilder module, string primaryAlias, Func<CommandContext, object[], IDependencyMap, Task> callback) | |||||
| internal CommandBuilder(ModuleBuilder module, string primaryAlias, Func<ICommandContext, object[], IDependencyMap, Task> callback) | |||||
| : this(module) | : this(module) | ||||
| { | { | ||||
| Discord.Preconditions.NotNull(primaryAlias, nameof(primaryAlias)); | Discord.Preconditions.NotNull(primaryAlias, nameof(primaryAlias)); | ||||
| @@ -72,7 +72,7 @@ namespace Discord.Commands.Builders | |||||
| _preconditions.Add(precondition); | _preconditions.Add(precondition); | ||||
| return this; | return this; | ||||
| } | } | ||||
| public ModuleBuilder AddCommand(string primaryAlias, Func<CommandContext, object[], IDependencyMap, Task> callback, Action<CommandBuilder> createFunc) | |||||
| public ModuleBuilder AddCommand(string primaryAlias, Func<ICommandContext, object[], IDependencyMap, Task> callback, Action<CommandBuilder> createFunc) | |||||
| { | { | ||||
| var builder = new CommandBuilder(this, primaryAlias, callback); | var builder = new CommandBuilder(this, primaryAlias, callback); | ||||
| createFunc(builder); | createFunc(builder); | ||||
| @@ -10,7 +10,7 @@ namespace Discord.Commands | |||||
| { | { | ||||
| internal static class ModuleClassBuilder | internal static class ModuleClassBuilder | ||||
| { | { | ||||
| private static readonly TypeInfo _moduleTypeInfo = typeof(ModuleBase).GetTypeInfo(); | |||||
| private static readonly TypeInfo _moduleTypeInfo = typeof(IModuleBase).GetTypeInfo(); | |||||
| public static IEnumerable<TypeInfo> Search(Assembly assembly) | public static IEnumerable<TypeInfo> Search(Assembly assembly) | ||||
| { | { | ||||
| @@ -155,12 +155,12 @@ namespace Discord.Commands | |||||
| }); | }); | ||||
| } | } | ||||
| var createInstance = ReflectionUtils.CreateBuilder<ModuleBase>(typeInfo, service); | |||||
| var createInstance = ReflectionUtils.CreateBuilder<IModuleBase>(typeInfo, service); | |||||
| builder.Callback = (ctx, args, map) => | builder.Callback = (ctx, args, map) => | ||||
| { | { | ||||
| var instance = createInstance(map); | var instance = createInstance(map); | ||||
| instance.Context = ctx; | |||||
| instance.SetContext(ctx); | |||||
| try | try | ||||
| { | { | ||||
| return method.Invoke(instance, args) as Task ?? Task.Delay(0); | return method.Invoke(instance, args) as Task ?? Task.Delay(0); | ||||
| @@ -1,6 +1,6 @@ | |||||
| namespace Discord.Commands | namespace Discord.Commands | ||||
| { | { | ||||
| public struct CommandContext | |||||
| public class CommandContext : ICommandContext | |||||
| { | { | ||||
| public IDiscordClient Client { get; } | public IDiscordClient Client { get; } | ||||
| public IGuild Guild { get; } | public IGuild Guild { get; } | ||||
| @@ -9,15 +9,7 @@ | |||||
| public IUserMessage Message { get; } | public IUserMessage Message { get; } | ||||
| public bool IsPrivate => Channel is IPrivateChannel; | public bool IsPrivate => Channel is IPrivateChannel; | ||||
| public CommandContext(IDiscordClient client, IGuild guild, IMessageChannel channel, IUser user, IUserMessage msg) | |||||
| { | |||||
| Client = client; | |||||
| Guild = guild; | |||||
| Channel = channel; | |||||
| User = user; | |||||
| Message = msg; | |||||
| } | |||||
| public CommandContext(IDiscordClient client, IUserMessage msg) | public CommandContext(IDiscordClient client, IUserMessage msg) | ||||
| { | { | ||||
| Client = client; | Client = client; | ||||
| @@ -14,13 +14,13 @@ namespace Discord.Commands | |||||
| Alias = alias; | Alias = alias; | ||||
| } | } | ||||
| public Task<PreconditionResult> CheckPreconditionsAsync(CommandContext context, IDependencyMap map = null) | |||||
| public Task<PreconditionResult> CheckPreconditionsAsync(ICommandContext context, IDependencyMap map = null) | |||||
| => Command.CheckPreconditionsAsync(context, map); | => Command.CheckPreconditionsAsync(context, map); | ||||
| public Task<ParseResult> ParseAsync(CommandContext context, SearchResult searchResult, PreconditionResult? preconditionResult = null) | |||||
| public Task<ParseResult> ParseAsync(ICommandContext context, SearchResult searchResult, PreconditionResult? preconditionResult = null) | |||||
| => Command.ParseAsync(context, Alias.Length, searchResult, preconditionResult); | => Command.ParseAsync(context, Alias.Length, searchResult, preconditionResult); | ||||
| public Task<ExecuteResult> ExecuteAsync(CommandContext context, IEnumerable<object> argList, IEnumerable<object> paramList, IDependencyMap map) | |||||
| public Task<ExecuteResult> ExecuteAsync(ICommandContext context, IEnumerable<object> argList, IEnumerable<object> paramList, IDependencyMap map) | |||||
| => Command.ExecuteAsync(context, argList, paramList, map); | => Command.ExecuteAsync(context, argList, paramList, map); | ||||
| public Task<ExecuteResult> ExecuteAsync(CommandContext context, ParseResult parseResult, IDependencyMap map) | |||||
| public Task<ExecuteResult> ExecuteAsync(ICommandContext context, ParseResult parseResult, IDependencyMap map) | |||||
| => Command.ExecuteAsync(context, parseResult, map); | => Command.ExecuteAsync(context, parseResult, map); | ||||
| } | } | ||||
| } | } | ||||
| @@ -13,7 +13,7 @@ namespace Discord.Commands | |||||
| QuotedParameter | QuotedParameter | ||||
| } | } | ||||
| public static async Task<ParseResult> ParseArgs(CommandInfo command, CommandContext context, string input, int startPos) | |||||
| public static async Task<ParseResult> ParseArgs(CommandInfo command, ICommandContext context, string input, int startPos) | |||||
| { | { | ||||
| ParameterInfo curParam = null; | ParameterInfo curParam = null; | ||||
| StringBuilder argBuilder = new StringBuilder(input.Length); | StringBuilder argBuilder = new StringBuilder(input.Length); | ||||
| @@ -222,9 +222,9 @@ namespace Discord.Commands | |||||
| } | } | ||||
| //Execution | //Execution | ||||
| public SearchResult Search(CommandContext context, int argPos) | |||||
| public SearchResult Search(ICommandContext context, int argPos) | |||||
| => Search(context, context.Message.Content.Substring(argPos)); | => Search(context, context.Message.Content.Substring(argPos)); | ||||
| public SearchResult Search(CommandContext context, string input) | |||||
| public SearchResult Search(ICommandContext context, string input) | |||||
| { | { | ||||
| string searchInput = _caseSensitive ? input : input.ToLowerInvariant(); | string searchInput = _caseSensitive ? input : input.ToLowerInvariant(); | ||||
| var matches = _map.GetCommands(searchInput).OrderByDescending(x => x.Command.Priority).ToImmutableArray(); | var matches = _map.GetCommands(searchInput).OrderByDescending(x => x.Command.Priority).ToImmutableArray(); | ||||
| @@ -235,9 +235,9 @@ namespace Discord.Commands | |||||
| return SearchResult.FromError(CommandError.UnknownCommand, "Unknown command."); | return SearchResult.FromError(CommandError.UnknownCommand, "Unknown command."); | ||||
| } | } | ||||
| public Task<IResult> ExecuteAsync(CommandContext context, int argPos, IDependencyMap dependencyMap = null, MultiMatchHandling multiMatchHandling = MultiMatchHandling.Exception) | |||||
| public Task<IResult> ExecuteAsync(ICommandContext context, int argPos, IDependencyMap dependencyMap = null, MultiMatchHandling multiMatchHandling = MultiMatchHandling.Exception) | |||||
| => ExecuteAsync(context, context.Message.Content.Substring(argPos), dependencyMap, multiMatchHandling); | => ExecuteAsync(context, context.Message.Content.Substring(argPos), dependencyMap, multiMatchHandling); | ||||
| public async Task<IResult> ExecuteAsync(CommandContext context, string input, IDependencyMap dependencyMap = null, MultiMatchHandling multiMatchHandling = MultiMatchHandling.Exception) | |||||
| public async Task<IResult> ExecuteAsync(ICommandContext context, string input, IDependencyMap dependencyMap = null, MultiMatchHandling multiMatchHandling = MultiMatchHandling.Exception) | |||||
| { | { | ||||
| dependencyMap = dependencyMap ?? DependencyMap.Empty; | dependencyMap = dependencyMap ?? DependencyMap.Empty; | ||||
| @@ -0,0 +1,7 @@ | |||||
| namespace Discord.Commands | |||||
| { | |||||
| internal interface IModuleBase | |||||
| { | |||||
| void SetContext(ICommandContext context); | |||||
| } | |||||
| } | |||||
| @@ -17,7 +17,7 @@ namespace Discord.Commands | |||||
| private static readonly System.Reflection.MethodInfo _convertParamsMethod = typeof(CommandInfo).GetTypeInfo().GetDeclaredMethod(nameof(ConvertParamsList)); | private static readonly System.Reflection.MethodInfo _convertParamsMethod = typeof(CommandInfo).GetTypeInfo().GetDeclaredMethod(nameof(ConvertParamsList)); | ||||
| private static readonly ConcurrentDictionary<Type, Func<IEnumerable<object>, object>> _arrayConverters = new ConcurrentDictionary<Type, Func<IEnumerable<object>, object>>(); | private static readonly ConcurrentDictionary<Type, Func<IEnumerable<object>, object>> _arrayConverters = new ConcurrentDictionary<Type, Func<IEnumerable<object>, object>>(); | ||||
| private readonly Func<CommandContext, object[], IDependencyMap, Task> _action; | |||||
| private readonly Func<ICommandContext, object[], IDependencyMap, Task> _action; | |||||
| public ModuleInfo Module { get; } | public ModuleInfo Module { get; } | ||||
| public string Name { get; } | public string Name { get; } | ||||
| @@ -63,7 +63,7 @@ namespace Discord.Commands | |||||
| _action = builder.Callback; | _action = builder.Callback; | ||||
| } | } | ||||
| public async Task<PreconditionResult> CheckPreconditionsAsync(CommandContext context, IDependencyMap map = null) | |||||
| public async Task<PreconditionResult> CheckPreconditionsAsync(ICommandContext context, IDependencyMap map = null) | |||||
| { | { | ||||
| if (map == null) | if (map == null) | ||||
| map = DependencyMap.Empty; | map = DependencyMap.Empty; | ||||
| @@ -85,7 +85,7 @@ namespace Discord.Commands | |||||
| return PreconditionResult.FromSuccess(); | return PreconditionResult.FromSuccess(); | ||||
| } | } | ||||
| public async Task<ParseResult> ParseAsync(CommandContext context, int startIndex, SearchResult searchResult, PreconditionResult? preconditionResult = null) | |||||
| public async Task<ParseResult> ParseAsync(ICommandContext context, int startIndex, SearchResult searchResult, PreconditionResult? preconditionResult = null) | |||||
| { | { | ||||
| if (!searchResult.IsSuccess) | if (!searchResult.IsSuccess) | ||||
| return ParseResult.FromError(searchResult); | return ParseResult.FromError(searchResult); | ||||
| @@ -96,7 +96,7 @@ namespace Discord.Commands | |||||
| return await CommandParser.ParseArgs(this, context, input, 0).ConfigureAwait(false); | return await CommandParser.ParseArgs(this, context, input, 0).ConfigureAwait(false); | ||||
| } | } | ||||
| public Task<ExecuteResult> ExecuteAsync(CommandContext context, ParseResult parseResult, IDependencyMap map) | |||||
| public Task<ExecuteResult> ExecuteAsync(ICommandContext context, ParseResult parseResult, IDependencyMap map) | |||||
| { | { | ||||
| if (!parseResult.IsSuccess) | if (!parseResult.IsSuccess) | ||||
| return Task.FromResult(ExecuteResult.FromError(parseResult)); | return Task.FromResult(ExecuteResult.FromError(parseResult)); | ||||
| @@ -119,7 +119,7 @@ namespace Discord.Commands | |||||
| return ExecuteAsync(context, argList, paramList, map); | return ExecuteAsync(context, argList, paramList, map); | ||||
| } | } | ||||
| public async Task<ExecuteResult> ExecuteAsync(CommandContext context, IEnumerable<object> argList, IEnumerable<object> paramList, IDependencyMap map) | |||||
| public async Task<ExecuteResult> ExecuteAsync(ICommandContext context, IEnumerable<object> argList, IEnumerable<object> paramList, IDependencyMap map) | |||||
| { | { | ||||
| if (map == null) | if (map == null) | ||||
| map = DependencyMap.Empty; | map = DependencyMap.Empty; | ||||
| @@ -41,7 +41,7 @@ namespace Discord.Commands | |||||
| _reader = builder.TypeReader; | _reader = builder.TypeReader; | ||||
| } | } | ||||
| public async Task<PreconditionResult> CheckPreconditionsAsync(CommandContext context, object[] args, IDependencyMap map = null) | |||||
| public async Task<PreconditionResult> CheckPreconditionsAsync(ICommandContext context, object[] args, IDependencyMap map = null) | |||||
| { | { | ||||
| if (map == null) | if (map == null) | ||||
| map = DependencyMap.Empty; | map = DependencyMap.Empty; | ||||
| @@ -61,7 +61,7 @@ namespace Discord.Commands | |||||
| return PreconditionResult.FromSuccess(); | return PreconditionResult.FromSuccess(); | ||||
| } | } | ||||
| public async Task<TypeReaderResult> Parse(CommandContext context, string input) | |||||
| public async Task<TypeReaderResult> Parse(ICommandContext context, string input) | |||||
| { | { | ||||
| return await _reader.Read(context, input).ConfigureAwait(false); | return await _reader.Read(context, input).ConfigureAwait(false); | ||||
| } | } | ||||
| @@ -1,14 +1,27 @@ | |||||
| using System.Threading.Tasks; | |||||
| using System; | |||||
| using System.Threading.Tasks; | |||||
| namespace Discord.Commands | namespace Discord.Commands | ||||
| { | { | ||||
| public abstract class ModuleBase | |||||
| public abstract class ModuleBase : ModuleBase<CommandContext> { } | |||||
| public abstract class ModuleBase<T> : IModuleBase | |||||
| where T : class, ICommandContext | |||||
| { | { | ||||
| public CommandContext Context { get; internal set; } | |||||
| public T Context { get; private set; } | |||||
| protected virtual async Task<IUserMessage> ReplyAsync(string message, bool isTTS = false, EmbedBuilder embed = null, RequestOptions options = null) | protected virtual async Task<IUserMessage> ReplyAsync(string message, bool isTTS = false, EmbedBuilder embed = null, RequestOptions options = null) | ||||
| { | { | ||||
| return await Context.Channel.SendMessageAsync(message, isTTS, embed, options).ConfigureAwait(false); | return await Context.Channel.SendMessageAsync(message, isTTS, embed, options).ConfigureAwait(false); | ||||
| } | } | ||||
| //IModuleBase | |||||
| void IModuleBase.SetContext(ICommandContext context) | |||||
| { | |||||
| var newValue = context as T; | |||||
| if (newValue == null) | |||||
| throw new InvalidOperationException($"Invalid context type. Expected {typeof(T).Name}, got {context.GetType().Name}"); | |||||
| Context = newValue; | |||||
| } | |||||
| } | } | ||||
| } | } | ||||
| @@ -9,7 +9,7 @@ namespace Discord.Commands | |||||
| internal class ChannelTypeReader<T> : TypeReader | internal class ChannelTypeReader<T> : TypeReader | ||||
| where T : class, IChannel | where T : class, IChannel | ||||
| { | { | ||||
| public override async Task<TypeReaderResult> Read(CommandContext context, string input) | |||||
| public override async Task<TypeReaderResult> Read(ICommandContext context, string input) | |||||
| { | { | ||||
| if (context.Guild != null) | if (context.Guild != null) | ||||
| { | { | ||||
| @@ -44,7 +44,7 @@ namespace Discord.Commands | |||||
| _enumsByValue = byValueBuilder.ToImmutable(); | _enumsByValue = byValueBuilder.ToImmutable(); | ||||
| } | } | ||||
| public override Task<TypeReaderResult> Read(CommandContext context, string input) | |||||
| public override Task<TypeReaderResult> Read(ICommandContext context, string input) | |||||
| { | { | ||||
| T baseValue; | T baseValue; | ||||
| object enumValue; | object enumValue; | ||||
| @@ -6,7 +6,7 @@ namespace Discord.Commands | |||||
| internal class MessageTypeReader<T> : TypeReader | internal class MessageTypeReader<T> : TypeReader | ||||
| where T : class, IMessage | where T : class, IMessage | ||||
| { | { | ||||
| public override async Task<TypeReaderResult> Read(CommandContext context, string input) | |||||
| public override async Task<TypeReaderResult> Read(ICommandContext context, string input) | |||||
| { | { | ||||
| ulong id; | ulong id; | ||||
| @@ -21,7 +21,7 @@ namespace Discord.Commands | |||||
| _tryParse = PrimitiveParsers.Get<T>(); | _tryParse = PrimitiveParsers.Get<T>(); | ||||
| } | } | ||||
| public override Task<TypeReaderResult> Read(CommandContext context, string input) | |||||
| public override Task<TypeReaderResult> Read(ICommandContext context, string input) | |||||
| { | { | ||||
| T value; | T value; | ||||
| if (_tryParse(input, out value)) | if (_tryParse(input, out value)) | ||||
| @@ -9,7 +9,7 @@ namespace Discord.Commands | |||||
| internal class RoleTypeReader<T> : TypeReader | internal class RoleTypeReader<T> : TypeReader | ||||
| where T : class, IRole | where T : class, IRole | ||||
| { | { | ||||
| public override Task<TypeReaderResult> Read(CommandContext context, string input) | |||||
| public override Task<TypeReaderResult> Read(ICommandContext context, string input) | |||||
| { | { | ||||
| ulong id; | ulong id; | ||||
| @@ -4,6 +4,6 @@ namespace Discord.Commands | |||||
| { | { | ||||
| public abstract class TypeReader | public abstract class TypeReader | ||||
| { | { | ||||
| public abstract Task<TypeReaderResult> Read(CommandContext context, string input); | |||||
| public abstract Task<TypeReaderResult> Read(ICommandContext context, string input); | |||||
| } | } | ||||
| } | } | ||||
| @@ -10,7 +10,7 @@ namespace Discord.Commands | |||||
| internal class UserTypeReader<T> : TypeReader | internal class UserTypeReader<T> : TypeReader | ||||
| where T : class, IUser | where T : class, IUser | ||||
| { | { | ||||
| public override async Task<TypeReaderResult> Read(CommandContext context, string input) | |||||
| public override async Task<TypeReaderResult> Read(ICommandContext context, string input) | |||||
| { | { | ||||
| var results = new Dictionary<ulong, TypeReaderValue>(); | var results = new Dictionary<ulong, TypeReaderValue>(); | ||||
| IReadOnlyCollection<IUser> channelUsers = (await context.Channel.GetUsersAsync(CacheMode.CacheOnly).Flatten().ConfigureAwait(false)).ToArray(); //TODO: must be a better way? | IReadOnlyCollection<IUser> channelUsers = (await context.Channel.GetUsersAsync(CacheMode.CacheOnly).Flatten().ConfigureAwait(false)).ToArray(); //TODO: must be a better way? | ||||
| @@ -0,0 +1,11 @@ | |||||
| namespace Discord.Commands | |||||
| { | |||||
| public interface ICommandContext | |||||
| { | |||||
| IDiscordClient Client { get; } | |||||
| IGuild Guild { get; } | |||||
| IMessageChannel Channel { get; } | |||||
| IUser User { get; } | |||||
| IUserMessage Message { get; } | |||||
| } | |||||
| } | |||||
| @@ -1,4 +1,4 @@ | |||||
| <Project ToolsVersion="15.0" Sdk="Microsoft.NET.Sdk" xmlns="http://schemas.microsoft.com/developer/msbuild/2003"> | |||||
| <Project ToolsVersion="15.0" Sdk="Microsoft.NET.Sdk" xmlns="http://schemas.microsoft.com/developer/msbuild/2003"> | |||||
| <PropertyGroup> | <PropertyGroup> | ||||
| <Description>A core Discord.Net library containing the REST client and models.</Description> | <Description>A core Discord.Net library containing the REST client and models.</Description> | ||||
| <VersionPrefix>1.0.0-beta2</VersionPrefix> | <VersionPrefix>1.0.0-beta2</VersionPrefix> | ||||
| @@ -0,0 +1,29 @@ | |||||
| using Discord.Rpc; | |||||
| namespace Discord.Commands | |||||
| { | |||||
| public class RpcCommandContext : ICommandContext | |||||
| { | |||||
| public DiscordRpcClient Client { get; } | |||||
| public IMessageChannel Channel { get; } | |||||
| public RpcUser User { get; } | |||||
| public RpcUserMessage Message { get; } | |||||
| public bool IsPrivate => Channel is IPrivateChannel; | |||||
| public RpcCommandContext(DiscordRpcClient client, RpcUserMessage msg) | |||||
| { | |||||
| Client = client; | |||||
| Channel = msg.Channel; | |||||
| User = msg.Author; | |||||
| Message = msg; | |||||
| } | |||||
| //ICommandContext | |||||
| IDiscordClient ICommandContext.Client => Client; | |||||
| IGuild ICommandContext.Guild => null; | |||||
| IMessageChannel ICommandContext.Channel => Channel; | |||||
| IUser ICommandContext.User => User; | |||||
| IUserMessage ICommandContext.Message => Message; | |||||
| } | |||||
| } | |||||
| @@ -33,7 +33,7 @@ namespace Discord.Rpc | |||||
| public DateTimeOffset Timestamp => DateTimeUtils.FromTicks(_timestampTicks); | public DateTimeOffset Timestamp => DateTimeUtils.FromTicks(_timestampTicks); | ||||
| internal RpcMessage(DiscordRpcClient discord, ulong id, IMessageChannel channel, RpcUser author) | |||||
| internal RpcMessage(DiscordRpcClient discord, ulong id, RestVirtualMessageChannel channel, RpcUser author) | |||||
| : base(discord, id) | : base(discord, id) | ||||
| { | { | ||||
| Channel = channel; | Channel = channel; | ||||
| @@ -62,7 +62,9 @@ namespace Discord.Rpc | |||||
| => MessageHelper.DeleteAsync(this, Discord, options); | => MessageHelper.DeleteAsync(this, Discord, options); | ||||
| public override string ToString() => Content; | public override string ToString() => Content; | ||||
| //IMessage | |||||
| IMessageChannel IMessage.Channel => Channel; | |||||
| MessageType IMessage.Type => MessageType.Default; | MessageType IMessage.Type => MessageType.Default; | ||||
| IUser IMessage.Author => Author; | IUser IMessage.Author => Author; | ||||
| IReadOnlyCollection<IAttachment> IMessage.Attachments => Attachments; | IReadOnlyCollection<IAttachment> IMessage.Attachments => Attachments; | ||||
| @@ -9,7 +9,7 @@ namespace Discord.Rpc | |||||
| { | { | ||||
| public MessageType Type { get; private set; } | public MessageType Type { get; private set; } | ||||
| internal RpcSystemMessage(DiscordRpcClient discord, ulong id, IMessageChannel channel, RpcUser author) | |||||
| internal RpcSystemMessage(DiscordRpcClient discord, ulong id, RestVirtualMessageChannel channel, RpcUser author) | |||||
| : base(discord, id, channel, author) | : base(discord, id, channel, author) | ||||
| { | { | ||||
| } | } | ||||
| @@ -32,7 +32,7 @@ namespace Discord.Rpc | |||||
| public override IReadOnlyCollection<ITag> Tags => _tags; | public override IReadOnlyCollection<ITag> Tags => _tags; | ||||
| public IReadOnlyDictionary<Emoji, int> Reactions => ImmutableDictionary.Create<Emoji, int>(); | public IReadOnlyDictionary<Emoji, int> Reactions => ImmutableDictionary.Create<Emoji, int>(); | ||||
| internal RpcUserMessage(DiscordRpcClient discord, ulong id, IMessageChannel channel, RpcUser author) | |||||
| internal RpcUserMessage(DiscordRpcClient discord, ulong id, RestVirtualMessageChannel channel, RpcUser author) | |||||
| : base(discord, id, channel, author) | : base(discord, id, channel, author) | ||||
| { | { | ||||
| } | } | ||||
| @@ -0,0 +1,31 @@ | |||||
| using Discord.WebSocket; | |||||
| namespace Discord.Commands | |||||
| { | |||||
| public class SocketCommandContext : ICommandContext | |||||
| { | |||||
| public DiscordSocketClient Client { get; } | |||||
| public SocketGuild Guild { get; } | |||||
| public ISocketMessageChannel Channel { get; } | |||||
| public SocketUser User { get; } | |||||
| public SocketUserMessage Message { get; } | |||||
| public bool IsPrivate => Channel is IPrivateChannel; | |||||
| public SocketCommandContext(DiscordSocketClient client, SocketUserMessage msg) | |||||
| { | |||||
| Client = client; | |||||
| Guild = (msg.Channel as SocketGuildChannel)?.Guild; | |||||
| Channel = msg.Channel; | |||||
| User = msg.Author; | |||||
| Message = msg; | |||||
| } | |||||
| //ICommandContext | |||||
| IDiscordClient ICommandContext.Client => Client; | |||||
| IGuild ICommandContext.Guild => Guild; | |||||
| IMessageChannel ICommandContext.Channel => Channel; | |||||
| IUser ICommandContext.User => User; | |||||
| IUserMessage ICommandContext.Message => Message; | |||||
| } | |||||
| } | |||||