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)); }
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); } }
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()); } }
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) }, } } } }); }
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); } }
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() })); }
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; } }
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()); } }
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); } }
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); } }
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); } }
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)); } }
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)); }
/// <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}"); } }
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); } }
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); }
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 });
public async Task <SlackMessage> Post([FromForm] SlackCommandRequest request) { return(await _service.Respond(request)); }