| @@ -30,7 +30,9 @@ namespace Discord | |||||
| /// <summary> Bulk deletes multiple messages. </summary> | /// <summary> Bulk deletes multiple messages. </summary> | ||||
| Task DeleteMessagesAsync(IEnumerable<IMessage> messages, RequestOptions options = null); | Task DeleteMessagesAsync(IEnumerable<IMessage> messages, RequestOptions options = null); | ||||
| /// <summary> Broadcasts the "user is typing" message to all users in this channel, lasting 10 seconds.</summary> | |||||
| /// <summary> Broadcasts the "user is typing" message to all users in this channel, lasting 10 seconds. </summary> | |||||
| Task TriggerTypingAsync(RequestOptions options = null); | |||||
| /// <summary> Continuously broadcasts the "user is typing" message to all users in this channel until the returned object is disposed. </summary> | |||||
| IDisposable EnterTypingState(RequestOptions options = null); | IDisposable EnterTypingState(RequestOptions options = null); | ||||
| } | } | ||||
| } | } | ||||
| @@ -4,7 +4,7 @@ namespace Discord.Extensions | |||||
| { | { | ||||
| public static class SnowflakeEntityExtensions | public static class SnowflakeEntityExtensions | ||||
| { | { | ||||
| //TODO: C#7 Candidate for Extension Property. | |||||
| //TODO: C#7 Candidate for extension property. | |||||
| public static DateTimeOffset GetCreatedAt(this ISnowflakeEntity entity) => DateTimeUtils.FromSnowflake(entity.Id); | public static DateTimeOffset GetCreatedAt(this ISnowflakeEntity entity) => DateTimeUtils.FromSnowflake(entity.Id); | ||||
| } | } | ||||
| } | } | ||||
| @@ -204,7 +204,12 @@ namespace Discord.Rest | |||||
| } | } | ||||
| //Typing | //Typing | ||||
| public static IDisposable EnterTypingState(IChannel channel, BaseDiscordClient client, | |||||
| public static async Task TriggerTypingAsync(IMessageChannel channel, BaseDiscordClient client, | |||||
| RequestOptions options = null) | |||||
| { | |||||
| await client.ApiClient.TriggerTypingIndicatorAsync(channel.Id, options); | |||||
| } | |||||
| public static IDisposable EnterTypingState(IMessageChannel channel, BaseDiscordClient client, | |||||
| RequestOptions options) | RequestOptions options) | ||||
| => new TypingNotifier(client, channel, options); | => new TypingNotifier(client, channel, options); | ||||
| } | } | ||||
| @@ -73,6 +73,8 @@ namespace Discord.Rest | |||||
| public Task DeleteMessagesAsync(IEnumerable<IMessage> messages, RequestOptions options = null) | public Task DeleteMessagesAsync(IEnumerable<IMessage> messages, RequestOptions options = null) | ||||
| => ChannelHelper.DeleteMessagesAsync(this, Discord, messages, options); | => ChannelHelper.DeleteMessagesAsync(this, Discord, messages, options); | ||||
| public Task TriggerTypingAsync(RequestOptions options = null) | |||||
| => ChannelHelper.TriggerTypingAsync(this, Discord, options); | |||||
| public IDisposable EnterTypingState(RequestOptions options = null) | public IDisposable EnterTypingState(RequestOptions options = null) | ||||
| => ChannelHelper.EnterTypingState(this, Discord, options); | => ChannelHelper.EnterTypingState(this, Discord, options); | ||||
| @@ -86,6 +86,8 @@ namespace Discord.Rest | |||||
| public Task DeleteMessagesAsync(IEnumerable<IMessage> messages, RequestOptions options = null) | public Task DeleteMessagesAsync(IEnumerable<IMessage> messages, RequestOptions options = null) | ||||
| => ChannelHelper.DeleteMessagesAsync(this, Discord, messages, options); | => ChannelHelper.DeleteMessagesAsync(this, Discord, messages, options); | ||||
| public Task TriggerTypingAsync(RequestOptions options = null) | |||||
| => ChannelHelper.TriggerTypingAsync(this, Discord, options); | |||||
| public IDisposable EnterTypingState(RequestOptions options = null) | public IDisposable EnterTypingState(RequestOptions options = null) | ||||
| => ChannelHelper.EnterTypingState(this, Discord, options); | => ChannelHelper.EnterTypingState(this, Discord, options); | ||||
| @@ -63,6 +63,8 @@ namespace Discord.Rest | |||||
| public Task DeleteMessagesAsync(IEnumerable<IMessage> messages, RequestOptions options = null) | public Task DeleteMessagesAsync(IEnumerable<IMessage> messages, RequestOptions options = null) | ||||
| => ChannelHelper.DeleteMessagesAsync(this, Discord, messages, options); | => ChannelHelper.DeleteMessagesAsync(this, Discord, messages, options); | ||||
| public Task TriggerTypingAsync(RequestOptions options = null) | |||||
| => ChannelHelper.TriggerTypingAsync(this, Discord, options); | |||||
| public IDisposable EnterTypingState(RequestOptions options = null) | public IDisposable EnterTypingState(RequestOptions options = null) | ||||
| => ChannelHelper.EnterTypingState(this, Discord, options); | => ChannelHelper.EnterTypingState(this, Discord, options); | ||||
| @@ -8,14 +8,14 @@ namespace Discord.Rest | |||||
| { | { | ||||
| private readonly BaseDiscordClient _client; | private readonly BaseDiscordClient _client; | ||||
| private readonly CancellationTokenSource _cancelToken; | private readonly CancellationTokenSource _cancelToken; | ||||
| private readonly ulong _channelId; | |||||
| private readonly IMessageChannel _channel; | |||||
| private readonly RequestOptions _options; | private readonly RequestOptions _options; | ||||
| public TypingNotifier(BaseDiscordClient discord, IChannel channel, RequestOptions options) | |||||
| public TypingNotifier(BaseDiscordClient discord, IMessageChannel channel, RequestOptions options) | |||||
| { | { | ||||
| _client = discord; | _client = discord; | ||||
| _cancelToken = new CancellationTokenSource(); | _cancelToken = new CancellationTokenSource(); | ||||
| _channelId = channel.Id; | |||||
| _channel = channel; | |||||
| _options = options; | _options = options; | ||||
| var _ = Run(); | var _ = Run(); | ||||
| } | } | ||||
| @@ -29,7 +29,7 @@ namespace Discord.Rest | |||||
| { | { | ||||
| try | try | ||||
| { | { | ||||
| await _client.ApiClient.TriggerTypingIndicatorAsync(_channelId); | |||||
| await _channel.TriggerTypingAsync(_options); | |||||
| } | } | ||||
| catch { } | catch { } | ||||
| await Task.Delay(9750, token); | await Task.Delay(9750, token); | ||||
| @@ -43,7 +43,7 @@ namespace Discord.WebSocket | |||||
| public static void AddMessage(ISocketMessageChannel channel, DiscordSocketClient discord, | public static void AddMessage(ISocketMessageChannel channel, DiscordSocketClient discord, | ||||
| SocketMessage msg) | SocketMessage msg) | ||||
| { | { | ||||
| //C#7 Candidate for pattern matching | |||||
| //TODO: C#7 Candidate for pattern matching | |||||
| if (channel is SocketDMChannel) | if (channel is SocketDMChannel) | ||||
| (channel as SocketDMChannel).AddMessage(msg); | (channel as SocketDMChannel).AddMessage(msg); | ||||
| else if (channel is SocketGroupChannel) | else if (channel is SocketGroupChannel) | ||||
| @@ -56,7 +56,7 @@ namespace Discord.WebSocket | |||||
| public static SocketMessage RemoveMessage(ISocketMessageChannel channel, DiscordSocketClient discord, | public static SocketMessage RemoveMessage(ISocketMessageChannel channel, DiscordSocketClient discord, | ||||
| ulong id) | ulong id) | ||||
| { | { | ||||
| //C#7 Candidate for pattern matching | |||||
| //TODO: C#7 Candidate for pattern matching | |||||
| if (channel is SocketDMChannel) | if (channel is SocketDMChannel) | ||||
| return (channel as SocketDMChannel).RemoveMessage(id); | return (channel as SocketDMChannel).RemoveMessage(id); | ||||
| else if (channel is SocketGroupChannel) | else if (channel is SocketGroupChannel) | ||||
| @@ -76,6 +76,8 @@ namespace Discord.WebSocket | |||||
| public Task DeleteMessagesAsync(IEnumerable<IMessage> messages, RequestOptions options = null) | public Task DeleteMessagesAsync(IEnumerable<IMessage> messages, RequestOptions options = null) | ||||
| => ChannelHelper.DeleteMessagesAsync(this, Discord, messages, options); | => ChannelHelper.DeleteMessagesAsync(this, Discord, messages, options); | ||||
| public Task TriggerTypingAsync(RequestOptions options = null) | |||||
| => ChannelHelper.TriggerTypingAsync(this, Discord, options); | |||||
| public IDisposable EnterTypingState(RequestOptions options = null) | public IDisposable EnterTypingState(RequestOptions options = null) | ||||
| => ChannelHelper.EnterTypingState(this, Discord, options); | => ChannelHelper.EnterTypingState(this, Discord, options); | ||||
| @@ -99,6 +99,8 @@ namespace Discord.WebSocket | |||||
| public Task DeleteMessagesAsync(IEnumerable<IMessage> messages, RequestOptions options = null) | public Task DeleteMessagesAsync(IEnumerable<IMessage> messages, RequestOptions options = null) | ||||
| => ChannelHelper.DeleteMessagesAsync(this, Discord, messages, options); | => ChannelHelper.DeleteMessagesAsync(this, Discord, messages, options); | ||||
| public Task TriggerTypingAsync(RequestOptions options = null) | |||||
| => ChannelHelper.TriggerTypingAsync(this, Discord, options); | |||||
| public IDisposable EnterTypingState(RequestOptions options = null) | public IDisposable EnterTypingState(RequestOptions options = null) | ||||
| => ChannelHelper.EnterTypingState(this, Discord, options); | => ChannelHelper.EnterTypingState(this, Discord, options); | ||||
| @@ -82,6 +82,8 @@ namespace Discord.WebSocket | |||||
| public Task DeleteMessagesAsync(IEnumerable<IMessage> messages, RequestOptions options = null) | public Task DeleteMessagesAsync(IEnumerable<IMessage> messages, RequestOptions options = null) | ||||
| => ChannelHelper.DeleteMessagesAsync(this, Discord, messages, options); | => ChannelHelper.DeleteMessagesAsync(this, Discord, messages, options); | ||||
| public Task TriggerTypingAsync(RequestOptions options = null) | |||||
| => ChannelHelper.TriggerTypingAsync(this, Discord, options); | |||||
| public IDisposable EnterTypingState(RequestOptions options = null) | public IDisposable EnterTypingState(RequestOptions options = null) | ||||
| => ChannelHelper.EnterTypingState(this, Discord, options); | => ChannelHelper.EnterTypingState(this, Discord, options); | ||||