public async Task <SlackMessage> Respond(SlackCommandRequest command)
        {
            if (command.Command != Constants.Commands.Lang)
            {
                return(null);
            }

            if (await IsPostCommand(command))
            {
                return(RenderPostPreview(command));
            }

            var channelType = GetChannelType(command.ChannelId);

            var templates = await _configService.GetTemplatesForUser(command.UserId);

            var template = templates.FirstOrDefault(x => x.Default == true) ?? templates.First();
            var imageUrl = await _imageUtility.GetImageUrl(command.Text, template);

            var message = await _databaseRepo.InsertMessage(
                teamId : command.TeamId,
                teamDomain : command.TeamDomain,
                channelId : command.ChannelId,
                channelName : command.ChannelName,
                channelType : channelType,
                userId : command.UserId,
                userName : command.UserName,
                templateId : template.Id,
                message : command.Text,
                imageUrl : imageUrl,
                isAnonymous : false);

            return(await _langResponse.RenderPreview(message));
        }
예제 #2
0
        public async Task GetStanLee(SlackCommandRequest slackCommandRequest)
        {
            var client  = new SbmClient(slackCommandRequest.ResponseUrl);
            var message = new Message
            {
                UnfurlLinks = false,
                UnfurlMedia = false,
                Text        = slackCommandRequest.Text switch
                {
                    "help" => BuildHelpText(slackCommandRequest.UserName),
                    "support" => "Sure, if you want to reach out go to https://stanleebot.com/Support",
                    _ => "Unfortunately, I only know how to respond to help and support right now."
                }
            };

            message.SetResponseType(ResponseType.Ephemeral);
            var response = await client.SendAsync(message).ConfigureAwait(false);

            if (response == "ok")
            {
                _logger.LogInformation("GetStanLee: Responded to {MessageText} and sent message {@Message}", slackCommandRequest.Text, message);
            }
            else
            {
                _logger.LogError("GetStanLee: Tried responding to {MessageText} but received an error sending {@Message}", slackCommandRequest.Text, message);
            }
        }
예제 #3
0
        public async Task <IActionResult> Post()
        {
            Request.EnableBuffering();
            var requestBody = await Request.GetRawBodyStringAsyncWithOptions(null, null, true);

            var slackSignature        = Request.Headers["X-Slack-Signature"].ToString();
            var slackRequestTimeStamp = Request.Headers["X-Slack-Request-Timestamp"].ToString();

            var fromSlack = IsRequestFromSlack(slackSignature, slackRequestTimeStamp, requestBody);

            if (!fromSlack)
            {
                return(new BadRequestObjectResult("Request is not from Slack"));
            }

            var requestForm = await Request.ReadFormAsync();

            var slackCommandRequest = new SlackCommandRequest()
            {
                Token       = requestForm["token"],
                TeamId      = requestForm["team_id"],
                TeamDomain  = requestForm["team_domain"],
                ChannelId   = requestForm["channel_id"],
                ChannelName = requestForm["channel_name"],
                UserId      = requestForm["user_id"],
                UserName    = requestForm["user_name"],
                Command     = requestForm["command"],
                Text        = requestForm["text"],
                ResponseUrl = requestForm["response_url"],
                TriggerId   = requestForm["trigger_id"]
            };

            _logger.LogInformation("SlackCommandRequest: {@SlackCommandRequest}", slackCommandRequest);

            switch (slackCommandRequest.Command)
            {
            case "/marvel":
                await _slackService.GetMarvel(slackCommandRequest);

                return(new OkResult());

            case "/dc":
                await _slackService.GetDcComics(slackCommandRequest);

                return(new OkResult());

            case "/stanlee":
                await _slackService.GetStanLee(slackCommandRequest);

                return(new OkResult());

            case "/mrvlco":
                await _slackService.GetMrvlCoLink(slackCommandRequest);

                return(new OkResult());

            default:
                return(new BadRequestResult());
            }
        }
예제 #4
0
        private async Task <string> GetChatPreview(SlackCommandRequest commandRequest, List <ChatMember> mentionHighscores)
        {
            var requestedChatText = "";

            if (!string.IsNullOrWhiteSpace(commandRequest.Text))
            {
                if (!int.TryParse(commandRequest.Text, out int chatNumber) || chatNumber <= 0)
                {
                    requestedChatText = "\n\nUgyldig verdi på valg av spørsmål.";
                }
                else
                {
                    var chats = GetChats(mentionHighscores, commandRequest);
                    if (chats.Count < chatNumber)
                    {
                        requestedChatText = $"\n\nDet er kun {chats.Count} spørsmål tilgjengelig.";
                    }
                    else
                    {
                        var chatIndex     = chatNumber - 1;
                        var requestedChat = await chats.ElementAt(chatIndex)();

                        requestedChatText = $"\n\nSpørsmål #{chatNumber}\n{requestedChat.Question}";
                    }
                }
            }

            return(requestedChatText);
        }
        private SlackMessage RenderPostPreview(SlackCommandRequest command)
        {
            var message = command.Text.Substring(1);

            return(new SlackMessage
            {
                ResponseType = SlackMessageResponseTypes.Ephemeral,
                Text = message,
                Attachments = new []
                {
                    new SlackMessageAttachment
                    {
                        Fallback = "Approve message here",
                        CallbackId = Constants.CallbackIds.Post,
                        Actions = new[]
                        {
                            new SlackMessageButton
                            {
                                Name = Constants.ActionNames.Cancel,
                                Text = "Cancel",
                            },
                            new SlackMessageButton
                            {
                                Name = Constants.ActionNames.Submit,
                                Text = "Submit",
                                Value = _serializer.ObjectToBase64Url(message)
                            },
                        }
                    }
                }
            });
        }
예제 #6
0
        public async Task GetMarvel(SlackCommandRequest slackCommandRequest)
        {
            var marvelGoogleCx = _appSettings.GoogleCustomSearch.MarvelCx;
            var gsr            = await _googleSearchService.GetResponse(slackCommandRequest.Text, marvelGoogleCx);

            if (gsr != null)
            {
                var client  = new SbmClient(slackCommandRequest.ResponseUrl);
                var message = new Message();

                var gsrMetaTags = gsr.Items.ElementAtOrDefault(0)?.PageMap.MetaTags.ElementAtOrDefault(0) ?? new GoogleSearchResponse.MetaTag();

                var snippet = gsrMetaTags.OgDescription;
                if (snippet.IsNullOrWhiteSpace())
                {
                    snippet = gsr.Items.ElementAtOrDefault(0)?.Snippet.CleanString() ?? string.Empty;
                }

                var title = gsr.Items.ElementAtOrDefault(0)?.Title.Split("|").ElementAtOrDefault(0)?.Trim();

                var website = gsrMetaTags.OgUrl;
                if (website.IsNullOrWhiteSpace())
                {
                    website = gsr.Items.ElementAtOrDefault(0)?.Link;
                }

                var attachment = new Attachment()
                {
                    Fallback = snippet,
                    Pretext  = $"Excelsior! I found {title} :star-struck:!"
                }
                .AddField("Name", title, true)
                .AddField("Website", website, true)
                .AddField("Bio", snippet)
                .SetImage(gsr.Items[0].PageMap.CseImage[0].Src)
                .SetColor(Color.Green);

                message.SetResponseType(ResponseType.InChannel);
                message.AddAttachment(attachment);
                var response = await client.SendAsync(message).ConfigureAwait(false);

                if (response == "ok")
                {
                    _logger.LogInformation("GetMarvel: Sent message {@Message}", message);
                }
                else
                {
                    _logger.LogError("GetMarvel: Error sending {@Message}", message);
                }
            }
            else
            {
                _logger.LogError("GetMarvel: GetGoogleSearchSlackResponseJson is null. {@SlackCommandRequest}", slackCommandRequest);
            }
        }
예제 #7
0
        public void Balance(SlackCommandRequest request)
        {
            var settings = SlackLeadsBidderSettings.Settings;

            var agentClient = new SlackClient(request.Response_Url);

            if (request.Token != settings.SlackCommandBalanceToken)
            {
                agentClient.PostError("Invalid token.");
            }

            SlackLeadsBidderService.ShowBalance(agentClient);
        }
        private async Task <bool> IsPostCommand(SlackCommandRequest command)
        {
            if (!command.Text.StartsWith('!'))
            {
                return(false);
            }
            var isPrivilegedUser = await _configService.IsPrivilegedUser(command.UserId);

            if (!isPrivilegedUser)
            {
                return(false);
            }
            return(true);
        }
        public async Task <ActionResult> Weather([FromForm] SlackCommandRequest request)
        {
            //if (await request.IsValidAsync(Request, _slackOptions.SigningSecret))
            //{
            //    return new UnauthorizedResult();
            //}

            var response = await _weatherService.GetWeatherAsync(request.Text);

            return(new JsonResult(new
            {
                text = response.ToString()
            }));
        }
예제 #10
0
        public async Task <IActionResult> Test([HttpTrigger(AuthorizationLevel.Anonymous, "get", "post", Route = null)] HttpRequest req, ILogger log)
        {
            try
            {
                var commandRequest = new SlackCommandRequest(req.Form);

                log.LogInformation(JsonConvert.SerializeObject(commandRequest));

                var channelMembers = await GetChannelMemberIds();

                var channelMessages = await GetChannelMessages();

                var mentionHighscores = GetMentionHighscores(channelMembers, channelMessages);

                var lowestMentionCount = mentionHighscores.First().Count;

                var mentionsTable = $"\n\nAntall mentions siste {MessageLimit} meldinger i {SlackChannelId.ToSlackChannel()} :arrow_down:\n" + string.Join("\n", mentionHighscores.Select(x =>
                {
                    var row = $"{x.Count:D2}: {x.Id}";
                    if (commandRequest.UserId == x.Id)
                    {
                        row = $"_{row}_";
                    }
                    if (lowestMentionCount == x.Count)
                    {
                        row = $"*{row}*";
                    }
                    return(row);
                }));

                var responseText =
                    $"Hei {commandRequest.UserName}, din ID på Slack er {commandRequest.UserId}." +
                    mentionsTable +
                    await GetChatPreview(commandRequest, mentionHighscores);

                return(new OkObjectResult(responseText));
            }
            catch (Exception ex)
            {
                log.LogInformation($"{ex.Message} \n{ex.StackTrace}");

                throw;
            }
        }
예제 #11
0
        public async Task <IActionResult> StanLeeBotCommand(
            [HttpTrigger(AuthorizationLevel.Function, "post", Route = null)]
            HttpRequest req)
        {
            var requestForm = await req.ReadFormAsync();

            var slackCommandRequest = new SlackCommandRequest()
            {
                Token       = requestForm["token"],
                TeamId      = requestForm["team_id"],
                TeamDomain  = requestForm["team_domain"],
                ChannelId   = requestForm["channel_id"],
                ChannelName = requestForm["channel_name"],
                UserId      = requestForm["user_id"],
                UserName    = requestForm["user_name"],
                Command     = requestForm["command"],
                Text        = requestForm["text"],
                ResponseUrl = requestForm["response_url"],
                TriggerId   = requestForm["trigger_id"]
            };

            _logger.LogInformation("SlackCommandRequest: {@SlackCommandRequest}", slackCommandRequest);

            switch (slackCommandRequest.Command)
            {
            case "/test":
                await GetTest(slackCommandRequest);

                return(new OkResult());

            case "/marvel":
                await GetMarvel(slackCommandRequest);

                return(new OkResult());

            case "/dc":
                await GetDCComics(slackCommandRequest);

                return(new OkResult());

            default:
                return(new BadRequestResult());
            }
        }
예제 #12
0
        public async Task GetDcComics(SlackCommandRequest slackCommandRequest)
        {
            var dcComicsCx = _appSettings.GoogleCustomSearch.DcComicsCx;
            var gsr        = await _googleSearchService.GetResponse(slackCommandRequest.Text, dcComicsCx);

            if (gsr != null)
            {
                var client  = new SbmClient(slackCommandRequest.ResponseUrl);
                var message = new Message();

                var gsrMetaTags   = gsr.Items.ElementAtOrDefault(0)?.PageMap.MetaTags.ElementAtOrDefault(0) ?? new GoogleSearchResponse.MetaTag();
                var snippet       = gsr.Items.ElementAtOrDefault(0)?.Snippet.CleanString() ?? string.Empty;
                var characterName = gsrMetaTags.OgTitle;

                var attachment = new Attachment()
                {
                    Fallback = snippet,
                    Pretext  = $"Excelsior! I found {characterName} :star-struck:!"
                }
                .AddField("Name", characterName, true)
                .AddField("Website", gsrMetaTags.OgUrl, true)
                .AddField("Bio", snippet)
                .SetThumbUrl(gsr.Items[0].PageMap.CseThumbnail.ElementAtOrDefault(0)?.Src)
                .SetColor(Color.Green);

                message.SetResponseType(ResponseType.InChannel);
                message.AddAttachment(attachment);
                var response = await client.SendAsync(message).ConfigureAwait(false);

                if (response == "ok")
                {
                    _logger.LogInformation("GetDCComics: Sent message {@Message}", message);
                }
                else
                {
                    _logger.LogError("GetDCComics: Error sending {@Message}", message);
                }
            }
            else
            {
                _logger.LogError("GetDCComics: GetGoogleSearchSlackResponseJson is null. {@SlackCommandRequest}", slackCommandRequest);
            }
        }
예제 #13
0
        public async Task GetMrvlCoLink(SlackCommandRequest slackCommandRequest)
        {
            var client        = new SbmClient(slackCommandRequest.ResponseUrl);
            var firstResponse = new Message();

            firstResponse.SetResponseType(ResponseType.Ephemeral);
            firstResponse.Text = "Sure thing! Let me get to work!";
            await client.SendAsync(firstResponse).ConfigureAwait(false);

            var message = new Message();

            message.SetResponseType(ResponseType.Ephemeral);
            message.UnfurlLinks = false;
            message.UnfurlMedia = false;

            var response = string.Empty;
            var textList = slackCommandRequest.Text.Split(" ").ToList();

            if (textList.Count() == 2)
            {
                var longUrl      = textList[0];
                var emailAddress = textList[1];

                var shortenerMessage = await _urlShorteningService.Shorten(longUrl, Constants.UrlShortenerDomains.MrvlCo, emailAddress, OriginSources.Slack, slackCommandRequest.TriggerId);

                message.Text = shortenerMessage;
                response     = await client.SendAsync(message);
            }
            else
            {
                message.Text = "Please verify that your message is in the format of URL<space>EmailAddress";
                response     = await client.SendAsync(message).ConfigureAwait(false);
            }

            if (response == "ok")
            {
                _logger.LogInformation("GetMrvlCoLink: Responded to {MessageText} and sent message {@Message}", slackCommandRequest.Text, message);
            }
            else
            {
                _logger.LogError("GetMrvlCoLink: Tried responding to {MessageText} but received an error sending {@Message}", slackCommandRequest.Text, message);
            }
        }
예제 #14
0
        private async Task GetMarvel(SlackCommandRequest slackCommandRequest)
        {
            var marvelGoogleCx = Environment.GetEnvironmentVariable("MARVEL_GOOGLE_CX", EnvironmentVariableTarget.Process);
            var gsr            = await GetGoogleSearchSlackResponseJson(slackCommandRequest.Text, marvelGoogleCx);

            if (gsr != null)
            {
                var client  = new SbmClient(slackCommandRequest.ResponseUrl);
                var message = new Message();

                var gsrMetaTags = gsr.Items.ElementAtOrDefault(0)?.PageMap.MetaTags.ElementAtOrDefault(0) ?? new MetaTag();
                var snippet     = gsr.Items.ElementAtOrDefault(0)?.Snippet.CleanString() ?? string.Empty;

                var title = gsr.Items.ElementAtOrDefault(0)?.Title.Split("|").ElementAtOrDefault(0)?.Trim();

                var attachment = new Attachment()
                {
                    Fallback = snippet,
                    Pretext  = $"Excelsior! I found {title} :star-struck:!"
                }
                .AddField("Name", title, true)
                .AddField("Website", gsrMetaTags.OgUrl, true)
                .AddField("Bio", snippet)
                .SetImage(gsr.Items[0].PageMap.CseImage[0].Src)
                .SetColor(Color.Green);

                message.AddAttachment(attachment);
                var response = await client.SendAsync(message);

                if (response == "ok")
                {
                    _logger.LogInformation("GetMarvel: Sent message {@Message}", message);
                }
                else
                {
                    _logger.LogError("GetMarvel: Error sending {@Message}", message);
                }
            }
            else
            {
                _logger.LogError("GetMarvel: GetGoogleSearchSlackResponseJson is null. {@SlackCommandRequest}", slackCommandRequest);
            }
        }
예제 #15
0
        public async Task <ActionResult> Random([FromForm] SlackCommandRequest request)
        {
            // if (await request.IsValidAsync(Request, _slackOptions.SigningSecret))
            // {
            //     return new UnauthorizedResult();
            // }

            var response = await _jokeService.GetJokeAsync();

            return(new JsonResult(new
            {
                response_type = request.Text == "share" ? "in_channel" : "ephemeral",
                text = response.Value.Joke,
                attachments = new[]
                {
                    new { text = _jokeService.GetRandomJokeEmoji() }
                }
            }));
        }
        internal static async Task <bool> IsValidAsync(
            this SlackCommandRequest request,
            HttpRequest httpRequest,
            string signingSecret,
            ILogger logger)
        {
            if (request is null ||
                httpRequest is null ||
                signingSecret is null)
            {
                logger.LogInformation("Early exit.");
                return(false);
            }

            // https://api.slack.com/docs/verifying-requests-from-slack
            var timestamp = httpRequest.Headers["X-Slack-Request-Timestamp"];

            if (double.TryParse(timestamp.ToString(), out var unix) &&
                DateTime.Now.Subtract(unix.FromUnixTime()).TotalMinutes > 5)
            {
                logger.LogInformation($"Date {unix.FromUnixTime()}");
                return(false);
            }

            var signature = httpRequest.Headers["X-Slack-Signature"].ToString();

            var body = await GetRequestBody(httpRequest);

            var payload = Encoding.UTF8.GetBytes($"v0:{timestamp}:{body}");

            logger.LogInformation($"Payload {payload}");

            using (var hmac = new HMACSHA256(Encoding.UTF8.GetBytes(signingSecret)))
            {
                var hash = hmac.ComputeHash(payload);
                var computedSignature = $"v0={Encoding.UTF8.GetString(hash)}";

                logger.LogInformation($"cs:{computedSignature} vs s:{signature}");

                return(string.Equals(signature, computedSignature));
            }
        }
예제 #17
0
        public async Task <IActionResult> Post([FromForm] SlackCommandRequest request)
        {
            if (request == null)
            {
                return(BadRequest());
            }

            var key = await _firebaseService.SavePurchaseRequestAsync(request.UserId, request.Text);

            await _slackService.SendDirectMessage(
                _ceoMemberId,
                $"Hi! <@{request.UserId}> would like to order *{request.Text}*. Do you authorise this purchase request?",
                new List <SlackAttachment> {
                new SlackAttachment {
                    Text       = "Do you authorise this purchase request?",
                    CallbackId = "purchase_request",
                    Actions    = new List <SlackAction> {
                        new SlackAction {
                            Name  = key,
                            Text  = "Yes, I approve",
                            Type  = "button",
                            Value = "approved"
                        },
                        new SlackAction {
                            Name  = key,
                            Text  = "No",
                            Type  = "button",
                            Value = "declined"
                        }
                    }
                }
            }
                );

            var response = new SlackCommandResponse
            {
                Text = $"Thanks for your puchase request of *{request.Text}*. We will message the CEO now for authorisation"
            };

            return(Ok(response));
        }
예제 #18
0
        /// <summary>
        /// https://api.slack.com/methods/chat.postMessage
        /// </summary>
        internal async Task SendMessage(Chat chat, SlackCommandRequest commandRequest)
        {
            var token   = SlackAccessTokenBot;
            var channel = SlackChannelId;
            var text    = chat.Question;

            if (!string.IsNullOrWhiteSpace(commandRequest.UserName))
            {
                text = $"{text}\n(videresendt fra {commandRequest.UserName} :incoming_envelope:)";
            }

            var json = JsonConvert.SerializeObject(new { token, channel, text });
            var data = new StringContent(json, Encoding.UTF8, "application/json");

            var response = await HttpClient.PostAsync($"{SlackBaseUrl}/chat.postMessage", data);

            if (!response.IsSuccessStatusCode)
            {
                throw new Exception($"chat.postMessage failed: {response.StatusCode} {response.ReasonPhrase}");
            }
        }
예제 #19
0
        public void Autobid(SlackCommandRequest request)
        {
            var settings = SlackLeadsBidderSettings.Settings;

            var agentClient = new SlackClient(request.Response_Url);

            if (request.Token != settings.SlackCommandAutoBidToken)
            {
                agentClient.PostError("Invalid token.");
            }

            int amount;

            if (!int.TryParse(request.Text, out amount) || amount < 0)
            {
                SlackLeadsBidderService.GetAgentAutoBid(request.User_Name, agentClient);
            }
            else
            {
                SlackLeadsBidderService.SetAgentAutoBid(request.User_Name, amount, agentClient);
            }
        }
예제 #20
0
        private async Task GetTest(SlackCommandRequest slackCommandRequest)
        {
            var client  = new SbmClient(slackCommandRequest.ResponseUrl);
            var message = new Message();

            const string bio = @"I’m a techie inside and out. If it involves technology, chances are I’ve at least dabbled with it. "
                               + "I enjoy helping people and organizations learn how to leverage technology to level up their lives or organization. "
                               + "I’ve worn many hats from having my own businesses, helping startups launch, and developing small to large scale web applications & APIs utilizing .NET & C# as the backend for many of my projects."
                               + "\n\nCombining my interests in technology and sociology, I’m simply passionate about the human side of technology… and Marvel Comics.";

            var attachment = new Attachment()
            {
                Fallback = $"Testing for {slackCommandRequest.Text}",
                Pretext  = $"Testing for {slackCommandRequest.Text}"
            }
            .AddField("Name", "AJ Tatum", true)
            .AddField("Website", "https://ajt.io", true)
            .AddField("Bio", bio)
            .SetThumbUrl("https://ajtatum.com/wp-content/uploads/2014/08/AJ-Tatum-120x120.png")
            .SetColor(Color.Green);

            message.AddAttachment(attachment);
            await client.SendAsync(message);
        }
예제 #21
0
        internal List <Func <Task <Chat> > > GetChats(List <ChatMember> members, SlackCommandRequest commandRequest = null)
        {
            return(new List <Func <Task <Chat> > >
            {
                async() => {
                    var workEmojies = new [] { ":floppy_disk:", ":printer:", ":chart_with_upwards_trend:", ":briefcase:" };
                    return new Chat {
                        Question = $"Hei {members.First().Id.ToSlackMention()}! Hva jobber du med i dag? {workEmojies[new Random().Next(0,workEmojies.Length)]}"
                    };
                },
                async() => {
                    var funEmojies = new [] { ":bowling:", ":video_game:", ":ice_skate:", ":woman-surfing:" };
                    return new Chat {
                        Question = $"God dag {members.First().Id.ToSlackMention()}! Gjør du noe gøy akkurat nå? {funEmojies[new Random().Next(0,funEmojies.Length)]}"
                    };
                },
                async() => new Chat {
                    Question = $"Hallo {members.First().Id.ToSlackMention()}! Hva skjer? :what: :up:"
                },
                async() =>
                {
                    var question = $"Fortell oss hva du jobber med {members.First().Id.ToSlackMention()}!";
                    var feed = await HttpClient.GetStringAsync("https://rss.kode24.no/");

                    if (feed != null)
                    {
                        var parser = new RssParser();
                        var rss = parser.Parse(feed);
                        var latestPostUrl = rss.First()?.FeedUrl?.Replace("\n", "").Trim();
                        if (latestPostUrl != null)
                        {
                            question += $" Etterpå kan du jo sjekke {latestPostUrl.ToSlackUrl("siste nytt på kode24")} :moonwalk-parrot:";
                        }
                    }

                    return new Chat {
                        Question = question
                    };
                },
                // CRJ7QDS90 == #karaoke channel
                async() => new Chat {
                    Question = $"Har det blitt noe {"CRJ7QDS90".ToSlackChannel()} i det siste {members.First().Id.ToSlackMention()}? :microphone: Eller noe annet som skjer?"
                },
                async() =>
                {
                    var question = $"Kompilerer ikke koden {members.First().Id.ToSlackMention()}? Du kan jo lufte problemet her";

                    try
                    {
                        var officeLocations = new Dictionary <string, string>
                        {
                            { "Oslo", "lat=59.91273&lon=10.74609" },
                            { "Eidsvoll", "lat=60.33045&lon=11.26161" },
                            { "Ulsteinvik", "lat=62.34316&lon=5.84867" },
                            { "Karmøy", "lat=59.28354&lon=5.30671" },
                            { "København", "lat=55.67594&lon=12.56553" },
                            { "Trysil", "lat=61.31485&lon=12.2637" },
                            { "Fredrikstad", "lat=59.2263353&lon=10.8800742" },
                            { "Moss", "lat=59.428299&lon=10.667990" },
                        };

                        var randomOffice = officeLocations.ElementAt(new Random().Next(0, officeLocations.Count));

                        using var client = new HttpClient();
                        client.DefaultRequestHeaders.UserAgent.Add(new ProductInfoHeaderValue("min-slack-integrasjon", "0.0.1"));

                        var url = "https://api.met.no/weatherapi/locationforecast/2.0/compact.json?" + randomOffice.Value;
                        var weatherResponse = await client.GetAsync(url);

                        var weatherData = await weatherResponse.Content.ReadAsStringAsync();

                        var weatherJson = JsonConvert.DeserializeObject <dynamic>(weatherData);
                        if (weatherJson != null)
                        {
                            question += $" eller lufte hjernen ute! Her på {randomOffice.Key}-kontoret er det {GetWeatherDescription(weatherJson)}";
                        }
                    }
                    catch (Exception)
                    {
                        question += " :male-technologist:";
                    }


                    return new Chat {
                        Question = question
                    };
                },
                async() => new Chat {
                    Question = $"Sitter du fast i et problem {members.First().Id.ToSlackMention()}? La oss hjelpe deg! :rubber_duck:"
                },

                // TODO

                // REMINDERS
                // po
                // cv
                // forecast + navn

                // REPLIES - if other replies  react, else message
            });
예제 #22
0
 public async Task <SlackMessage> Post([FromForm] SlackCommandRequest request)
 {
     return(await _service.Respond(request));
 }