@@ -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); | ||||