Ejemplo n.º 1
0
        private async Task <PostMessageResponse> PostMessage(BotMessage message)
        {
            var response = await _api.Chat.PostMessage(new Message
            {
                Channel = message.Hub != null
                        ? await message.Hub.HubId(this).ConfigureAwait(false)
                        : message.ReplyTo?.Hub?.Id,
                Text        = message.Text,
                Attachments = message.Attachments,
                Blocks      = message.Blocks,
                ThreadTs    = await ReplyingInDifferentHub(message).ConfigureAwait(false)
                        ? null
                        : message.ReplyTo?.ThreadTs
                              ?? (message.CreateThread ? message.ReplyTo?.Ts : null),
                ReplyBroadcast = message.ReplyBroadcast,
                Parse          = message.Parse,
                LinkNames      = message.LinkNames,
                UnfurlLinks    = message.UnfurlLinks,
                UnfurlMedia    = message.UnfurlMedia,
                AsUser         = true
            }).ConfigureAwait(false);

            _sentMessages.OnNext(message);
            return(response);
        }
Ejemplo n.º 2
0
        private async Task <PostMessageResponse> PostMessage(BotMessage message)
        {
            if (message.Ephemeral && message.ReplyTo?.User?.Id == null)
            {
                throw new ArgumentException("Can't send ephemeral message: missing reply-to user ID", nameof(message));
            }

            var slackMessage = new Message
            {
                Channel = message.Conversation != null
                        ? await message.Conversation.ConversationId(this).ConfigureAwait(false)
                        : message.ReplyTo?.Conversation?.Id,
                Text        = message.Text,
                Attachments = message.Attachments,
                Blocks      = message.Blocks,
                ThreadTs    = await ReplyingInDifferentHub(message).ConfigureAwait(false)
                        ? null
                        : message.ReplyTo?.ThreadTs
                              ?? (message.CreateThread ? message.ReplyTo?.Ts : null),
                ReplyBroadcast = message.ReplyBroadcast,
                Parse          = message.Parse,
                LinkNames      = message.LinkNames,
                UnfurlLinks    = message.UnfurlLinks,
                UnfurlMedia    = message.UnfurlMedia,
                AsUser         = true
            };

            return(message.Ephemeral
                ? await _api.Chat.PostEphemeral(message.ReplyTo.User.Id, slackMessage, message.CancellationToken).ConfigureAwait(false)
                : await _api.Chat.PostMessage(slackMessage, message.CancellationToken).ConfigureAwait(false));
        }
Ejemplo n.º 3
0
        /// <summary>
        /// Send a message to Slack as the bot.
        /// </summary>
        public async Task Send(BotMessage message)
        {
            var sent = _sentMessages.FirstOrDefaultAsync(m => m == message).ToTask();

            _outgoingMessages.OnNext(message);
            await sent.ConfigureAwait(false);
        }
Ejemplo n.º 4
0
        public async Task ReplyWith(BotMessage message, bool createThread = false)
        {
            if (message == null)
            {
                throw new ArgumentNullException(nameof(message));
            }

            message.ReplyTo      = this;
            message.CreateThread = createThread;
            await _bot.Send(message).ConfigureAwait(false);
        }
Ejemplo n.º 5
0
        /// <summary>
        /// Send a message to Slack as the bot.
        /// </summary>
        public async Task Send(BotMessage message, CancellationToken?cancellationToken = null)
        {
            var linkedTokenSource = CancellationTokenSource.CreateLinkedTokenSource(
                message.CancellationToken ?? CancellationToken.None,
                cancellationToken ?? CancellationToken.None);

            message.CancellationToken = linkedTokenSource.Token;

            var sent = _sentMessages.FirstOrDefaultAsync(m => m.Message == message)
                       .SelectMany(m => m.Post)
                       .ToTask(linkedTokenSource.Token);

            _outgoingMessages.OnNext(message);

            await sent.ConfigureAwait(false);
        }
Ejemplo n.º 6
0
 private async Task <PostMessageResponse> PostMessage(BotMessage message) =>
 await _api.Chat.PostMessage(new Message
 {
     Channel = message.Conversation != null
                 ? await message.Conversation.ConversationId(this).ConfigureAwait(false)
                 : message.ReplyTo?.Conversation?.Id,
     Text        = message.Text,
     Attachments = message.Attachments,
     Blocks      = message.Blocks,
     ThreadTs    = await ReplyingInDifferentHub(message).ConfigureAwait(false)
                 ? null
                 : message.ReplyTo?.ThreadTs
                   ?? (message.CreateThread ? message.ReplyTo?.Ts : null),
     ReplyBroadcast = message.ReplyBroadcast,
     Parse          = message.Parse,
     LinkNames      = message.LinkNames,
     UnfurlLinks    = message.UnfurlLinks,
     UnfurlMedia    = message.UnfurlMedia,
     AsUser         = true
 }, message.CancellationToken).ConfigureAwait(false);
Ejemplo n.º 7
0
 public void OnNext(BotMessage value) => _outgoingMessages.OnNext(value);
Ejemplo n.º 8
0
 private async Task <bool> ReplyingInDifferentHub(BotMessage message) =>
 message.Conversation != null &&
 await message.Conversation.ConversationId(this).ConfigureAwait(false) != message.ReplyTo?.Conversation.Id;
Ejemplo n.º 9
0
 private async Task <bool> ReplyingInDifferentHub(BotMessage message)
 {
     return(message.Hub != null && await message.Hub.HubId(this).ConfigureAwait(false) != message.ReplyTo?.Hub.Id);
 }