public static ComposeExtensionResponse HandleMessageExtensionQuery(Activity activity) { var query = activity.GetComposeExtensionQueryData(); Newtonsoft.Json.Linq.JObject data = activity.Value as Newtonsoft.Json.Linq.JObject; if (query == null || query.CommandId != "partyParrot") { // We only process the 'partyParrot' queries with this message extension return(null); } var title = ""; var titleParam = query.Parameters?.FirstOrDefault(p => p.Name == "searchKeyword"); if (titleParam != null) { title = titleParam.Value.ToString(); } var response = new ComposeExtensionResponse(new ComposeExtensionResult { AttachmentLayout = "list", Type = "result", Attachments = new List <ComposeExtensionAttachment>(), Text = "Response text" }); for (int i = 0; i < 5; i++) { response.ComposeExtension.Attachments.Add(GetAttachment(title)); } return(response); }
private ComposeExtensionResponse HandleSomeCommand(Activity activity) { ComposeExtensionResult catResult = new ComposeExtensionResult(null, "message", null, null, "Here is a cat ┬┴┬┴┤・ω・)ノ├┬┴┬┴"); ComposeExtensionResponse flyingCat = new ComposeExtensionResponse(catResult); return(flyingCat); }
// Query task private static ComposeExtensionResponse QueryData(ConnectorClient connector, Activity activity, ComposeExtensionQuery query) { var keyword = ""; var titleParam = query.Parameters?.FirstOrDefault(p => p.Name == "keyword"); if (titleParam != null) { keyword = titleParam.Value.ToString(); } if (string.IsNullOrEmpty(keyword)) { return(null); } var filteredItems = ItemDB.SearchItems(keyword); if (filteredItems == null || filteredItems.Count <= 0) { return(new ComposeExtensionResponse(new ComposeExtensionResult("list", "result"))); } var attachments = new List <ComposeExtensionAttachment>(); foreach (var item in filteredItems) { attachments.Add(GetItemAttachment(item)); } var response = new ComposeExtensionResponse(new ComposeExtensionResult("list", "result")); response.ComposeExtension.Attachments = attachments.ToList(); return(response); }
//gavdcodeend 01 //gavdcodebegin 02 private static ComposeExtensionResponse CreateCard(Activity myActivity) { ComposeExtensionResponse rtnResponse = null; dynamic activityValue = JObject.FromObject(myActivity.Value); string myFirst = activityValue.data.firstNumber; string mySecond = activityValue.data.secondNumber; int myAdd = int.Parse(myFirst) + int.Parse(mySecond); HeroCard myCard = new HeroCard { Title = "Add Card", Subtitle = "Adding " + myFirst + " + " + mySecond, Text = "The result is " + myAdd.ToString(), Images = new List <CardImage>(), Buttons = new List <CardAction>(), }; myCard.Images.Add(new CardImage { Url = "http://wiki.opensemanticframework.org/images/0/0b/Add-72.png" }); var myAttachs = new ComposeExtensionAttachment[1]; myAttachs[0] = myCard.ToAttachment().ToComposeExtensionAttachment(); rtnResponse = new ComposeExtensionResponse( new ComposeExtensionResult("list", "result")); rtnResponse.ComposeExtension.Attachments = myAttachs.ToList(); return(rtnResponse); }
public virtual async Task <HttpResponseMessage> Post([FromBody] Activity activity) { // check if activity is of type message if (activity != null && activity.GetActivityType() == ActivityTypes.Message) { await Conversation.SendAsync(activity, () => new EchoDialog()); } else if (activity != null && activity.Type == "invoke") { //await Conversation.SendAsync(activity, () => new SearchResultDialog()); ComposeExtensionResponse invokeResponse = new ComposeExtensionResponse(); // query.Parameters has the parameters sent by client var results = new ComposeExtensionResult() { AttachmentLayout = "list", Type = "result", Attachments = new List <ComposeExtensionAttachment>(), }; var query = activity.GetComposeExtensionQueryData(); if (query.CommandId != null && query.Parameters != null && query.Parameters.Count > 0) { var searchText = query.Parameters.First().Value; using (var _client = new HttpClient()) { var res = await _client.GetAsync("https://msopenhackeu.azurewebsites.net/api/trivia/search?k=" + searchText); var responseText = await res.Content.ReadAsStringAsync(); var att = JsonConvert.DeserializeObject <List <SearchResultDto> >(responseText); foreach (var x in att) { var heroCard = new HeroCard { Title = x.name, Subtitle = x.achievementBadge, Text = "Score: " + x.score.ToString(), Images = new List <CardImage> { new CardImage(x.achievementBadgeIcon) } }; results.Attachments.Add(heroCard.ToAttachment().ToComposeExtensionAttachment()); } invokeResponse.ComposeExtension = results; // Return the response return(Request.CreateResponse <ComposeExtensionResponse>(HttpStatusCode.OK, invokeResponse)); } } } else { await HandleSystemMessage(activity); } return(new HttpResponseMessage(System.Net.HttpStatusCode.Accepted)); }
public static async Task <IActionResult> Run( [HttpTrigger(AuthorizationLevel.Anonymous, "post", Route = null)] HttpRequest req, ILogger logger, ExecutionContext context) { logger.LogInformation("Messages function received a request."); ISettings settings = new Settings(logger, context); IClippySetRepository clippySetRepository = new ClippySetRepository(logger, settings); IClippySetIndexer clippySetIndexer = new ClippySetIndexer(logger); ICredentialProvider credentialProvider = new SimpleCredentialProvider(settings.MicrosoftAppId, null); IChannelProvider channelProvider = new SimpleChannelProvider(); Activity activity; try { var authorizationHeader = GetAuthorizationHeader(req); activity = await ParseRequestBody(req); await JwtTokenValidation.AuthenticateRequest(activity, authorizationHeader, credentialProvider, channelProvider); } catch (JsonReaderException e) { logger.LogDebug(e, "JSON parser failed to parse request payload."); return(new BadRequestResult()); } catch (UnauthorizedAccessException e) { logger.LogDebug(e, "Request was not propertly authorized."); return(new UnauthorizedResult()); } if (!activity.IsComposeExtensionQuery()) { logger.LogDebug("Request payload was not a compose extension query."); return(new BadRequestObjectResult($"Clippy only supports compose extension query activity types.")); } var queryValue = JObject.FromObject(activity.Value).ToObject <ComposeExtensionValue>(); var query = queryValue.GetParameterValue(); var clippySet = await clippySetRepository.FetchClippySetAsync(); await clippySetIndexer.IndexClippySetAsync(clippySet); var clippies = await clippySetIndexer.FindClippiesByQuery(query); var result = new ComposeExtensionResponse { ComposeExtensionResult = new ComposeExtensionResult { Type = "result", AttachmentLayout = "grid", Attachments = clippies.Select(clippy => new ClippyComposeExtensionCard(clippy).ToAttachment()).ToArray() } }; return(new OkObjectResult(result)); }
public static ComposeExtensionResponse HandleMessageExtensionQuery(ConnectorClient connector, Activity activity) { var query = activity.GetComposeExtensionQueryData(); if (query == null || query.CommandId != "getRandomText") { // We only process the 'getRandomText' queries with this message extension return(null); } var title = ""; var titleParam = query.Parameters?.FirstOrDefault(p => p.Name == "cardTitle"); if (titleParam != null) { title = titleParam.Value.ToString(); } var attachments = new ComposeExtensionAttachment[5]; for (int i = 0; i < 5; i++) { attachments[i] = GetAttachment(title); } var response = new ComposeExtensionResponse(new ComposeExtensionResult("list", "result")); response.ComposeExtension.Attachments = attachments.ToList(); return(response); }
public static ComposeExtensionResponse HandleMessageExtensionQuery(ConnectorClient connector, Activity activity) { ComposeExtensionResponse invokeResponse = new ComposeExtensionResponse(); // This helper method gets the query as an object. var query = activity.GetComposeExtensionQueryData(); var results = new ComposeExtensionResult() { AttachmentLayout = "list", Type = "result", Attachments = new List <ComposeExtensionAttachment>() }; if (query.CommandId != null && query.Parameters != null && query.Parameters.Count > 0) { //用户没有设置参数,而是初始化 if (query.Parameters[0].Name.Equals("initialRun")) { results.Attachments = GetAttachment(); } else { //根据传入的参数来返回结果的个数 string keyword = query.Parameters[0].Value.ToString(); results.Attachments = GetAttachment(keyword); } } invokeResponse.ComposeExtension = results; return(invokeResponse); }
public async static Task <ComposeExtensionResponse> HandleMessageExtensionQuery(ConnectorClient connector, Activity activity, string tid, string emailId) { var query = activity.GetComposeExtensionQueryData(); if (query == null || query.CommandId != "getMyMessages") { // We only process the 'getMyMessages' queries with this message extension return(null); } var searchString = string.Empty; var titleParam = query.Parameters?.FirstOrDefault(p => p.Name == "title"); if (titleParam != null) { searchString = titleParam.Value.ToString().ToLower(); } var attachments = new List <ComposeExtensionAttachment>(); var announcements = await GetMyAnnouncements(tid, emailId, searchString); foreach (var item in announcements.OrderByDescending(a => a.CreatedTime)) { var attachment2 = GetAttachment(item); attachments.Add(attachment2); } var response = new ComposeExtensionResponse(new ComposeExtensionResult("list", "result")); response.ComposeExtension.Attachments = attachments.ToList(); return(response); }
public async Task <HttpResponseMessage> HandleQueryAction(HttpRequestMessage request, ComposeExtensionQuery extensionQueryData, CancellationToken cancellation = default) { if (extensionQueryData.Parameters == null) { return(request.CreateResponse(HttpStatusCode.NoContent)); } var isInitialRun = false; var initialRunParameter = GetQueryParameterByName(extensionQueryData, "initialRun"); // situation where the incoming payload was received from the config popup if (!string.IsNullOrEmpty(extensionQueryData.State)) { initialRunParameter = "true"; } if (string.Equals(initialRunParameter, "true", StringComparison.OrdinalIgnoreCase)) { isInitialRun = true; } var maxResults = extensionQueryData.QueryOptions.Count ?? 25; if (isInitialRun) { maxResults = 5; } var attachments = new List <ComposeExtensionAttachment>(); //var searchText = GetQueryParameterByName(extensionQueryData, "searchText"); var currentUser = GetQueryParameterByName(extensionQueryData, "userId"); var graphService = RestService.For <IGraphRestAPIService>( new HttpClient(new AuthenticatedHttpClientHandler(request.Headers.Authorization.Parameter)) { BaseAddress = new Uri("https://graph.microsoft.com") }); var events = graphService.FindCurrentEvents(currentUser, DateTime.Now); attachments = this.mapper.Map <List <ComposeExtensionAttachment> >(events); var response = new ComposeExtensionResponse { ComposeExtension = new ComposeExtensionResult { Type = "result", Attachments = attachments, AttachmentLayout = AttachmentLayoutTypes.List } }; return(request.CreateResponse(HttpStatusCode.OK, response)); }
private async Task <HttpResponseMessage> ProcessQueryAction(HttpRequestMessage request, ComposeExtensionQuery extensionQueryData, CancellationToken cancellationToken) { if (extensionQueryData.Parameters == null) { return(request.CreateResponse(HttpStatusCode.NoContent)); } var isInitialRun = false; var initialRunParameter = GetQueryParameterByName(extensionQueryData, "initialRun"); // situation where the incoming payload was received from the config popup if (extensionQueryData.State.HasValue()) { initialRunParameter = "true"; } if (string.Equals(initialRunParameter, "true", StringComparison.OrdinalIgnoreCase)) { isInitialRun = true; } var maxResults = extensionQueryData.QueryOptions.Count ?? 25; if (isInitialRun) { maxResults = 5; } var attachments = new List <ComposeExtensionAttachment>(); var searchText = GetQueryParameterByName(extensionQueryData, MessagingExtensionCommands.SearchTextParameterName); switch (extensionQueryData.CommandId) { case MessagingExtensionCommands.SearchPositions: var positions = await _positionService.Search(searchText, maxResults, cancellationToken); attachments = _mapper.Map <List <ComposeExtensionAttachment> >(positions); break; case MessagingExtensionCommands.SearchCandidates: var candidates = await _candidateService.Search(searchText, maxResults, cancellationToken); attachments = _mapper.Map <List <ComposeExtensionAttachment> >(candidates); break; } var response = new ComposeExtensionResponse { ComposeExtension = new ComposeExtensionResult { Type = "result", Attachments = attachments, AttachmentLayout = AttachmentLayoutTypes.List } }; return(request.CreateResponse(HttpStatusCode.OK, response)); }
public async Task <HttpResponseMessage> Post([FromBody] Activity myActivity) { ComposeExtensionResponse myResponse = CreateCard(myActivity); return(myResponse != null ? Request.CreateResponse <ComposeExtensionResponse>(myResponse) : new HttpResponseMessage(HttpStatusCode.OK)); }
public static ComposeExtensionResponse HandleMessageExtensionQuery(ConnectorClient connector, Activity activity) { // GetDataHelper helper = new GetDataHelper(); var query = activity.GetComposeExtensionQueryData(); if (query == null) { // We only process the 'getRandomText' queries with this message extension return(null); } if (query.CommandId == "News") { NewsModel news = GetDataHelper.GetNews(); var title = ""; var titleParam = query.Parameters?.FirstOrDefault(p => p.Name == "newstitle"); var response = new ComposeExtensionResponse(new ComposeExtensionResult("list", "result")); ComposeExtensionAttachment[] attachments = null; if (titleParam != null) { title = titleParam.Value.ToString(); // List<string> searchtitle = news.Select(a => a.NewsTitle).Where(c => c.ToLower().Contains(title.ToLower())).Select(d => d).ToList(); // List<string> searchImages = news.Where(a => a.NewsTitle.ToLower().Contains(title.ToLower())).Select(c => c.NewsThumbnailUrl).ToList(); // List<string> searchDateTime = news.Where(a => a.NewsTitle.ToLower().Contains(title.ToLower())).Select(c => c.NewsDateTIme).ToList(); // List<string> searchviews = news.Where(a => a.NewsTitle.ToLower().Contains(title.ToLower())).Select(c => c.NoOfViews).ToList(); // List<string> searchby = news.Where(a => a.NewsTitle.ToLower().Contains(title.ToLower())).Select(c => c.NewsBy).ToList(); // int attacCount = searchtitle.Count(); // attachments = new ComposeExtensionAttachment[attacCount]; // for (int i = 0; i < attacCount; i++) // { // attachments[i] = GetAttachment(searchImages[i], searchtitle[i], searchDateTime[i], searchviews[i],searchby[i]); // } response.ComposeExtension.Attachments = attachments.ToList(); } else { // List<string> searchtitle = news.Select(c => c.NewsTitle).ToList(); // List<string> searchImages = news.Select(c => c.NewsThumbnailUrl).ToList(); // List<string> searchDateTime = news.Select(c => c.NewsDateTIme).ToList(); // List<string> searchviews = news.Select(c => c.NoOfViews).ToList(); // List<string> searchby=news.Select(c => c.NewsBy).ToList(); // attachments = new ComposeExtensionAttachment[searchtitle.Count()]; // for (int i = 0; i < searchtitle.Count(); i++) // { // attachments[i] = GetAttachment(searchImages[i], searchtitle[i], searchDateTime[i], searchviews[i],searchby[i]); // } response.ComposeExtension.Attachments = attachments.ToList(); } return(response); } else { return(null); } }
public static ComposeExtensionResponse GetComposeExtenionQueryResult(ComposeExtensionResponse composeExtensionResponse, List <ComposeExtensionAttachment> lstComposeExtensionAttachment) { composeExtensionResponse = new ComposeExtensionResponse(); ComposeExtensionResult composeExtensionResult = new ComposeExtensionResult(); composeExtensionResult.Type = "result"; composeExtensionResult.Attachments = lstComposeExtensionAttachment; composeExtensionResult.AttachmentLayout = "list"; composeExtensionResponse.ComposeExtension = composeExtensionResult; return(composeExtensionResponse); }
public ComposeExtensionResponse GetComposeExtensionQueryResult(List <ComposeExtensionAttachment> composeExtensionAttachments) { ComposeExtensionResponse composeExtensionResponse = new ComposeExtensionResponse(); ComposeExtensionResult composeExtensionResult = new ComposeExtensionResult(); composeExtensionResult.Type = "result"; composeExtensionResult.Attachments = composeExtensionAttachments; composeExtensionResult.AttachmentLayout = "list"; composeExtensionResponse.ComposeExtension = composeExtensionResult; return(composeExtensionResponse); }
//gavdcodeend 01 //gavdcodebegin 02 private async Task <ComposeExtensionResponse> CreateCard(Activity myActivity) { ComposeExtensionResponse rtnResponse = null; ComposeExtensionQuery queryData = myActivity.GetComposeExtensionQueryData(); string myQuery = string.Empty; ComposeExtensionParameter queryParam = queryData.Parameters?.FirstOrDefault( par => par.Name == "wikipediaQuery"); if (queryParam != null) { myQuery = queryParam.Value.ToString(); } string myText = string.Empty; if (string.IsNullOrEmpty(myQuery) == true) { myText = "Get a query to create the card"; } else { myText = myQuery; } string wikiResult = await GetWikipediaSnippet(myText); HeroCard myCard = new HeroCard { Title = "Wikipedia Card", Subtitle = "Searching for: " + myText, Text = wikiResult, Images = new List <CardImage>(), Buttons = new List <CardAction>(), }; myCard.Images.Add(new CardImage { Url = "https://upload.wikimedia.org/wikipedia/commons/thumb/4/45/" + "Orange_Icon_Pale_Wiki.png/120px-Orange_Icon_Pale_Wiki.png" }); ComposeExtensionAttachment[] myAttachs = new ComposeExtensionAttachment[1]; myAttachs[0] = myCard.ToAttachment().ToComposeExtensionAttachment(); rtnResponse = new ComposeExtensionResponse( new ComposeExtensionResult("list", "result")); rtnResponse.ComposeExtension.Attachments = myAttachs.ToList(); return(rtnResponse); }
private ComposeExtensionResponse GetComposeExtensionResponse(Activity activity) { var composeExtensionQuery = activity.GetComposeExtensionQueryData(); var composeExtParamValue = composeExtensionQuery.Parameters[0].Value.ToString(); // Process data and return the response. ComposeExtensionResponse composeExtensionResponse = new ComposeExtensionResponse(); ComposeExtensionResult composeExtensionResult = new ComposeExtensionResult(); List <ComposeExtensionAttachment> lstComposeExtensionAttachment = new List <ComposeExtensionAttachment>(); string imageUrl = "https://luna1.co/cae4f2.png"; string deepLinkUrl = TemplateUtility.GetDeepLink(activity, composeExtParamValue); lstComposeExtensionAttachment.Add(TemplateUtility.GenerateComposeExtentionAttachments(activity)); composeExtensionResult.Type = "result"; composeExtensionResult.AttachmentLayout = "list"; composeExtensionResult.Attachments = lstComposeExtensionAttachment; composeExtensionResponse.ComposeExtension = composeExtensionResult; return(composeExtensionResponse); }
private ComposeExtensionResponse GetComposeExtensionResponse(Activity activity) { var composeExtensionQuery = activity.GetComposeExtensionQueryData(); var composeExtParamValue = composeExtensionQuery.Parameters[0].Value.ToString(); // Process data and return the response. ComposeExtensionResponse composeExtensionResponse = new ComposeExtensionResponse(); ComposeExtensionResult composeExtensionResult = new ComposeExtensionResult(); List <ComposeExtensionAttachment> lstComposeExtensionAttachment = new List <ComposeExtensionAttachment>(); string imageUrl = "https://luna1.co/cae4f2.png"; string deepLinkUrl = TemplateUtility.GetDeepLink(activity, composeExtParamValue); lstComposeExtensionAttachment.Add(TemplateUtility.CreateComposeExtensionCardsAttachments("Deep Link", "Clicking on the button will redirect you to the configuration tab", imageUrl, "hero", deepLinkUrl)); composeExtensionResult.Type = "result"; composeExtensionResult.AttachmentLayout = "list"; composeExtensionResult.Attachments = lstComposeExtensionAttachment; composeExtensionResponse.ComposeExtension = composeExtensionResult; return(composeExtensionResponse); }
public IActionResult Post([FromBody] Activity activity) { if (activity.Type == ActivityTypes.Invoke) { if (activity.IsComposeExtensionQuery()) { // This is the response object that will get sent back to the messaging extension request. var invokeResponse = new ComposeExtensionResponse(); // This helper method gets the query as an object. var query = activity.GetComposeExtensionQueryData(); if (query.CommandId != null && query.Parameters != null && query.Parameters.Count > 0) { string[] cities; if (query.Parameters[0].Name == "initialRun") { cities = s_sampleCities; } else { var keyword = query.Parameters[0].Value.ToString(); cities = s_sampleCities .Where(c => c.Contains(keyword, StringComparison.InvariantCultureIgnoreCase)) .ToArray(); } var results = new ComposeExtensionResult() { AttachmentLayout = "list", Type = "result", Attachments = BuildAttachments(cities) }; invokeResponse.ComposeExtension = results; } // Return the response return(Ok(invokeResponse)); } } // Failure case catch-all. return(BadRequest("Invalid request! This API supports only messaging extension requests. Check your query and try again")); }
/// <summary> /// Help method to generate a compose extension /// /// Note that for this sample, we are returning random tasks, for illustration purposes only. /// </summary> /// <returns></returns> public ComposeExtensionResponse CreateComposeExtensionResponse() { ComposeExtensionResponse response = null; const int numResults = 10; var query = activity.GetComposeExtensionQueryData(); //Check to make sure a query was actually made: if (query.CommandId == null || query.Parameters == null) { return(null); } else if (query.Parameters.Count > 0) { // query.Parameters has the parameters sent by client var results = new ComposeExtensionResult() { AttachmentLayout = "list", Type = "result", Attachments = new List <ComposeExtensionAttachment>(), }; // Generate cards for the response. for (var i = 0; i < numResults; i++) { var card = GenerateResultCard(); // Add content to the response title. if (query.Parameters[0].Name != "initialRun") { card.Title += " " + query.Parameters[0].Value; } var composeExtensionAttachment = card.ToAttachment().ToComposeExtensionAttachment(); results.Attachments.Add(composeExtensionAttachment); } response = new ComposeExtensionResponse() { ComposeExtension = results }; } return(response); }
public static ComposeExtensionResponse GetSignin(ComposeExtensionResponse composeExtensionResponse) { string configUrl = ConfigurationManager.AppSettings["BaseUri"].ToString() + "/composeExtensionSettings.html"; CardAction configExp = new CardAction(ActionTypes.OpenUrl, "Config", null, configUrl); List <CardAction> lstCardAction = new List <CardAction>(); lstCardAction.Add(configExp); composeExtensionResponse = new ComposeExtensionResponse(); ComposeExtensionResult composeExtensionResult = new ComposeExtensionResult(); ComposeExtensionSuggestedAction objSuggestedAction = new ComposeExtensionSuggestedAction(); objSuggestedAction.Actions = lstCardAction; composeExtensionResult.SuggestedActions = objSuggestedAction; composeExtensionResult.Type = "auth"; composeExtensionResponse.ComposeExtension = composeExtensionResult; return(composeExtensionResponse); }
/// <summary> /// Helper method to create a task module response using an adaptive card. /// </summary> /// <returns></returns> private ComposeExtensionResponse CreateTaskModuleResponse() { ComposeExtensionResponse response = new ComposeExtensionResponse() { ComposeExtension = new ComposeExtensionResult("medium", "adaptivecard", new List <ComposeExtensionAttachment>()) }; var card = CardHelper.CreateExtendedCardForNewJobPosting(); Attachment attachment = new Attachment() { ContentType = AdaptiveCard.ContentType, Content = card }; var composeExtensionAttachment = attachment.ToComposeExtensionAttachment(); response.ComposeExtension.Attachments.Add(composeExtensionAttachment); System.Diagnostics.Debug.WriteLine(response.ToString()); return(response); }
/// <summary> /// Handles compose extension queries. /// </summary> /// <param name="activity">Incoming request from Bot Framework.</param> /// <param name="connectorClient">Connector client instance for posting to Bot Framework.</param> /// <returns>Task tracking operation.</returns> private static async Task <HttpResponseMessage> HandleComposeExtensionQuery(Activity activity, ConnectorClient connectorClient) { // Get Compose extension query data. ComposeExtensionQuery composeExtensionQuery = activity.GetComposeExtensionQueryData(); // Process data and return the response. ComposeExtensionResponse response = new ComposeExtensionResponse { ComposeExtension = new ComposeExtensionResult { Attachments = new List <ComposeExtensionAttachment> { new HeroCard { Buttons = new List <CardAction> { new CardAction { Image = "https://upload.wikimedia.org/wikipedia/commons/thumb/c/c7/Bing_logo_%282016%29.svg/160px-Bing_logo_%282016%29.svg.png", Type = ActionTypes.OpenUrl, Title = "Bing", Value = "https://www.bing.com" }, }, Title = "SampleHeroCard", Subtitle = "BingHeroCard", Text = "Bing.com" }.ToAttachment().ToComposeExtensionAttachment() }, Type = "result", AttachmentLayout = "list" } }; StringContent stringContent = new StringContent(JsonConvert.SerializeObject(response)); HttpResponseMessage httpResponseMessage = new HttpResponseMessage(HttpStatusCode.OK); httpResponseMessage.Content = stringContent; return(httpResponseMessage); }
public async static Task <ComposeExtensionResponse> HandleMessageExtensionQuery(Activity activity) { var query = activity.GetComposeExtensionQueryData(); if (query == null || query.CommandId != "search") { // We only process the 'getRandomText' queries with this message extension return(null); } var title = ""; var titleParam = query.Parameters?.FirstOrDefault(p => p.Name == "searchText"); if (titleParam != null) { title = titleParam.Value.ToString().ToLower(); } var attachments = new List <ComposeExtensionAttachment>(); var passengers = await DocumentDBRepository <Passenger> .GetItemsAsync(d => d != null && (d.Name.ToLower().Contains(title) || d.Seat.ToLower().Contains(title))); foreach (var passenger in passengers) { var card = O365CardHelper.GetO365ConnectorCard(passenger); var preview = O365CardHelper.GetPreviewCard(passenger); attachments.Add(card .ToAttachment() .ToComposeExtensionAttachment(preview.ToAttachment())); } var response = new ComposeExtensionResponse(new ComposeExtensionResult("list", "result")); response.ComposeExtension.Attachments = attachments.ToList(); return(response); }
public async Task <IActionResult> Post([FromBody] Activity activity) { if (activity.Type == ActivityTypes.Invoke) { if (activity.IsComposeExtensionQuery()) { // This is the response object that will get sent back to the messaging extension request. var invokeResponse = new ComposeExtensionResponse(); // This helper method gets the query as an object. var query = activity.GetComposeExtensionQueryData(); if (query.CommandId != null && query.Parameters != null && query.Parameters.Count > 0) { var keyword = string.Empty; if (query.Parameters[0].Name != "initialRun") { keyword = query.Parameters[0].Value.ToString(); } var stories = await SearchStories(keyword); var results = new ComposeExtensionResult() { AttachmentLayout = "list", Type = "result", Attachments = BuildAttachments(stories) }; invokeResponse.ComposeExtension = results; } // Return the response return(Ok(invokeResponse)); } } // Failure case catch-all. return(BadRequest("Invalid request! This API supports only messaging extension requests. Check your query and try again")); }
public static ComposeExtensionResponse GetComposeExtensionResponse(Activity activity) { ComposeExtensionResponse composeExtensionResponse = null; ImageResult imageResult = null; List <ComposeExtensionAttachment> lstComposeExtensionAttachment = new List <ComposeExtensionAttachment>(); StateClient stateClient = activity.GetStateClient(); BotData userData = stateClient.BotState.GetUserData(activity.ChannelId, activity.From.Id); bool IsSettingUrl = false; var composeExtensionQuery = activity.GetComposeExtensionQueryData(); if (string.Equals(activity.Name.ToLower(), Strings.ComposeExtensionQuerySettingUrl)) { IsSettingUrl = true; } if (composeExtensionQuery.CommandId == null || composeExtensionQuery.Parameters == null) { return(null); } var initialRunParameter = GetQueryParameterByName(composeExtensionQuery, Strings.manifestInitialRun); var queryParameter = GetQueryParameterByName(composeExtensionQuery, Strings.manifestParameterName); if (userData == null) { composeExtensionResponse = new ComposeExtensionResponse(); string message = Strings.ComposeExtensionNoUserData; composeExtensionResponse.ComposeExtension = GetMessageResponseResult(message); return(composeExtensionResponse); } /** * Below are the checks for various states that may occur * Note that the order of many of these blocks of code do matter */ // situation where the incoming payload was received from the config popup if (!string.IsNullOrEmpty(composeExtensionQuery.State)) { ParseSettingsAndSave(composeExtensionQuery.State, userData, stateClient, activity); /** * //// need to keep going to return a response so do not return here * //// these variables are changed so if the word 'setting' kicked off the compose extension, * //// then the word setting will not retrigger the config experience **/ queryParameter = ""; initialRunParameter = "true"; } // this is a sitaution where the user's preferences have not been set up yet if (string.IsNullOrEmpty(userData.GetProperty <string>(Strings.ComposeExtensionCardTypeKeyword))) { composeExtensionResponse = GetConfig(composeExtensionResponse); return(composeExtensionResponse); } /** * // this is the situation where the user has entered the word 'reset' and wants * // to clear his/her settings * // resetKeyword for English is "reset" **/ if (string.Equals(queryParameter.ToLower(), Strings.ComposeExtensionResetKeyword)) { //make the userData null userData = null; composeExtensionResponse = new ComposeExtensionResponse(); composeExtensionResponse.ComposeExtension = GetMessageResponseResult(Strings.ComposeExtensionResetText); return(composeExtensionResponse); } /** * // this is the situation where the user has entered "setting" or "settings" in order * // to repromt the config experience * // keywords for English are "setting" and "settings" **/ if ((string.Equals(queryParameter.ToLower(), Strings.ComposeExtensionSettingKeyword) || string.Equals(queryParameter.ToLower(), Strings.ComposeExtensionSettingsKeyword)) || (IsSettingUrl)) { composeExtensionResponse = GetConfig(composeExtensionResponse); return(composeExtensionResponse); } /** * // this is the situation where the user in on the initial run of the compose extension * // e.g. when the user first goes to the compose extension and the search bar is still blank * // in order to get the compose extension to run the initial run, the setting "initialRun": true * // must be set in the manifest for the compose extension **/ if (initialRunParameter == "true") { //Signin Experience, please uncomment below code for Signin Experience //composeExtensionResponse = WikiHelper.GetSignin(composeExtensionResponse); //return composeExtensionResponse; composeExtensionResponse = new ComposeExtensionResponse(); composeExtensionResponse.ComposeExtension = GetMessageResponseResult(Strings.ComposeExtensionInitialRunText); return(composeExtensionResponse); } /** * * Below here is simply the logic to call the Wikipedia API and create the response for * * a query; the general flow is to call the Wikipedia API for the query and then call the * * Wikipedia API for each entry for the query to see if that entry has an image; in order * * to get the asynchronous sections handled, an array of Promises for cards is used; each * * Promise is resolved when it is discovered if an image exists for that entry; once all * * of the Promises are resolved, the response is sent back to Teams * */ WikiResult wikiResult = SearchWiki(queryParameter, composeExtensionQuery); // enumerate search results and build Promises for cards for response foreach (var searchResult in wikiResult.query.search) { //Get the Image result on the basis of Image Title one by one imageResult = SearchWikiImage(searchResult); //Get the Image Url from imageResult string imageUrl = GetImageURL(imageResult); //Set the Highlighter title string highlightedTitle = GetHighLightedTitle(searchResult.title, queryParameter); string cardText = searchResult.snippet + " ..."; // create the card itself and the preview card based upon the information // check user preference for which type of card to create lstComposeExtensionAttachment.Add(TemplateUtility.CreateComposeExtensionCardsAttachments(highlightedTitle, cardText, imageUrl, userData.GetProperty <string>(Strings.ComposeExtensionCardTypeKeyword))); } composeExtensionResponse = GetComposeExtenionQueryResult(composeExtensionResponse, lstComposeExtensionAttachment); return(composeExtensionResponse); }
/// <summary> /// Helper method to generate a the messaging extension response. /// /// Note that for this sample, we are returning generated positions for illustration purposes only. /// </summary> /// <returns></returns> public ComposeExtensionResponse CreateResponse() { ComposeExtensionResponse response = null; var query = activity.GetComposeExtensionQueryData(); JObject data = activity.Value as JObject; // Check if this is a task module invocation. if (data != null && data["type"] != null) { // Handle other types of Invoke activities here, e.g. CardActions if (data["type"].ToString() == TaskModuleCommandType && data["command"].ToString() == CreatePostingCommand) { response = CreateTaskModuleResponse(); } } else { //Check to make sure a query was actually made: if (query.CommandId == null || query.Parameters == null) { return(null); } else if (query.Parameters.Count > 0) { // query.Parameters has the parameters sent by client var results = new ComposeExtensionResult() { AttachmentLayout = "list", Type = "result", Attachments = new List <ComposeExtensionAttachment>(), }; if (query.CommandId == "searchPositions") { OpenPositionsDataController controller = new OpenPositionsDataController(); IEnumerable <OpenPosition> positions; if (query.Parameters[0].Name == "initialRun") { // Default query => list all positions = controller.ListOpenPositions(10); } else { // Basic search. string title = query.Parameters[0].Value.ToString().ToLower(); positions = controller.ListOpenPositions(10).Where(x => x.Title.ToLower().Contains(title)); } // Generate cards for the response. foreach (OpenPosition pos in positions) { var card = CardHelper.CreateCardForPosition(pos, true); var composeExtensionAttachment = card.ToAttachment().ToComposeExtensionAttachment(); results.Attachments.Add(composeExtensionAttachment); } } else if (query.CommandId == "searchCandidates") { string name = query.Parameters[0].Value.ToString(); CandidatesDataController controller = new CandidatesDataController(); foreach (Candidate c in controller.GetTopCandidates("ABCD1234")) { c.Name = c.Name.Split(' ')[0] + " " + CultureInfo.CurrentCulture.TextInfo.ToTitleCase(name); var card = CardHelper.CreateSummaryCardForCandidate(c); var composeExtensionAttachment = card.ToAttachment().ToComposeExtensionAttachment(CardHelper.CreatePreviewCardForCandidate(c).ToAttachment()); results.Attachments.Add(composeExtensionAttachment); } } response = new ComposeExtensionResponse() { ComposeExtension = results }; } } return(response); }
/// <summary> /// Helper method to generate a compose extension /// /// Note that for this sample, we are returning generated positions for illustration purposes only. /// </summary> /// <returns></returns> public ComposeExtensionResponse CreateResponse() { try { ComposeExtensionResponse response = null; ComposeExtensionAttachment composeExtensionAttachment = new ComposeExtensionAttachment(); var query = activity.GetComposeExtensionQueryData(); var results = new ComposeExtensionResult() { AttachmentLayout = "list", Type = "result", Attachments = new List <ComposeExtensionAttachment>(), }; string text = ""; //Check to make sure a query was actually made: if (query.CommandId == null || query.Parameters == null) { return(null); } else if (query.Parameters.Count > 0) { // query.Parameters has the parameters sent by client string headRefName = ""; if (query.CommandId == "PRs") { var titleParam = query.Parameters?.FirstOrDefault(p => p.Name == "PRs" || p.Name == "Repos" || p.Name == "Issues"); if (titleParam != null) { headRefName = titleParam.Value.ToString().ToLower(); } var query3 = @"query($headRefName: String!) { viewer { pullRequests (first : 100, headRefName : $headRefName){ edges { node { id title body state headRefName revertUrl url repository { nameWithOwner } headRefName } } } } }"; var client = new GraphQLClient(); string data = client.Query(query3, new { headRefName = headRefName }); RootPullRequest obj = Newtonsoft.Json.JsonConvert.DeserializeObject <RootPullRequest>(data); if (obj.data.viewer.pullRequests.edges.Count == 0) { text = "No pull request exists."; } else { HeroCard card = new HeroCard { Title = obj.data.viewer.pullRequests.edges[0].node.headRefName, Text = "<b>Id :</b>" + obj.data.viewer.pullRequests.edges[0].node.id + "</br>" + "<b>Body :</b>" + obj.data.viewer.pullRequests.edges[0].node.body + "</br>" + "<b>State :</b>" + obj.data.viewer.pullRequests.edges[0].node.state + "</br>" + "<b>RevertUrl :</b>" + obj.data.viewer.pullRequests.edges[0].node.revertUrl + "</br>" + "<b>Repository :</b>" + obj.data.viewer.pullRequests.edges[0].node.repository.nameWithOwner, Buttons = new List <CardAction> { new CardAction(ActionTypes.OpenUrl, "More Info", value: obj.data.viewer.pullRequests.edges[0].node.url) } }; composeExtensionAttachment = card.ToAttachment().ToComposeExtensionAttachment(); } if (text != "") { results.Text = text; } else { results.Attachments.Add(composeExtensionAttachment); } } else if (query.CommandId == "Repos") { string repository = ""; var titleParam = query.Parameters?.FirstOrDefault(p => p.Name == "PRs" || p.Name == "Repos" || p.Name == "Issues"); if (titleParam != null) { repository = titleParam.Value.ToString().ToLower(); } var query3 = @"query($owner: String!,$name: String! ) { repository(owner: $owner, name: $name) { id name homepageUrl resourcePath isPrivate updatedAt createdAt nameWithOwner url } }"; var client = new GraphQLClient(); string data = client.Query(query3, new { owner = "poonam0025", name = repository }); RepositoryRootObject obj = Newtonsoft.Json.JsonConvert.DeserializeObject <RepositoryRootObject>(data); if (obj.data.repository == null) { text = "No " + repository + "found."; } else { HeroCard card = new HeroCard { Title = repository, Text = "<b>Id : </b> " + obj.data.repository.id + "</br>" + "<b>Resource path : </b> " + obj.data.repository.resourcePath + "</br>" + "<b>IsPrivate : </b> " + obj.data.repository.isPrivate + "</br>" + "<b>CreatedAt : </b> " + Convert.ToDateTime(obj.data.repository.createdAt).ToString("dd MMM yyyy hh:mm:ss tt") + "</br>" + "<b>UpdatedAt : </b> " + Convert.ToDateTime(obj.data.repository.updatedAt).ToString("dd MMM yyyy hh:mm:ss tt") + "</br>" + "<b>Name with Owner : </b> " + obj.data.repository.nameWithOwner, Buttons = new List <CardAction> { new CardAction(ActionTypes.OpenUrl, "More Info", value: obj.data.repository.url) } }; composeExtensionAttachment = card.ToAttachment().ToComposeExtensionAttachment(); } if (text != "") { results.Text = text; } else { results.Attachments.Add(composeExtensionAttachment); } } else if (query.CommandId == "Issues") { string repository = ""; var titleParam = query.Parameters?.FirstOrDefault(p => p.Name == "PRs" || p.Name == "Repos" || p.Name == "Issues"); if (titleParam != null) { repository = titleParam.Value.ToString().ToLower(); } var query3 = @"query($owner:String!,$name:String!) { repository(owner : $owner, name: $name) { issues(first:20) { edges { node { title url state body createdAt } } } } }"; var client = new GraphQLClient(); string data = client.Query(query3, new { owner = "poonam0025", name = repository }); RepositoryDetailRoot repositorydata = Newtonsoft.Json.JsonConvert.DeserializeObject <RepositoryDetailRoot>(data); if (repositorydata.data.repository.issues.edges.Count == 0) { text = "No issue found."; } else { HeroCard card = new HeroCard(); for (int i = 0; i < repositorydata.data.repository.issues.edges.Count; i++) { card = new HeroCard { Title = "<b>" + repositorydata.data.repository.issues.edges[i].node.title + "</b>", Text = "<b>Description :</b>" + repositorydata.data.repository.issues.edges[i].node.body + "</br>" + "<b>Created At :</b>" + Convert.ToDateTime(repositorydata.data.repository.issues.edges[i].node.createdAt).ToString("dd MMM yyyy hh:mm:ss tt") + "</br>" + "<b>State :</b>" + repositorydata.data.repository.issues.edges[i].node.state, Buttons = new List <CardAction> { new CardAction(ActionTypes.OpenUrl, "More Info", value: repositorydata.data.repository.issues.edges[i].node.url) } }; composeExtensionAttachment = card.ToAttachment().ToComposeExtensionAttachment(); results.Attachments.Add(composeExtensionAttachment); } } } response = new ComposeExtensionResponse() { ComposeExtension = results }; } return(response); } catch (Exception ex) { return(null); } }
public static ComposeExtensionResponse HandleMessageExtensionQuery(ConnectorClient connector, Activity activity) { GetDataHelper helper = new GetDataHelper(); List <News> news = helper.GetNews(); var query = activity.GetComposeExtensionQueryData(); if (query == null /*|| (query.CommandId != "Speakers" || query.CommandId != "Sessions")*/) { return(null); } /* if (query.CommandId == "speaker") * { * var title = ""; * var titleParam = query.Parameters?.FirstOrDefault(p => p.category == "speakerTitle"); * var response = new ComposeExtensionResponse(new ComposeExtensionResult("list", "result")); * ComposeExtensionAttachment[] attachments = null; * if (titleParam != null) * { * title = titleParam.Value.ToString(); * * List<string> searchNames = speakers.Select(a => a.SpeakerName).Where(c => c.ToLower().Contains(title.ToLower())).Select(d => d).ToList(); * List<string> searchImages = speakers.Where(a => a.SpeakerName.ToLower().Contains(title.ToLower())).Select(c => c.Snap).ToList(); * List<string> searchBio = speakers.Where(a => a.SpeakerName.ToLower().Contains(title.ToLower())).Select(c => c.Bio).ToList(); * List<string> searchTitle = speakers.Where(a => a.SpeakerName.ToLower().Contains(title.ToLower())).Select(c => c.Title).ToList(); * int attacCount = searchNames.Count(); * * attachments = new ComposeExtensionAttachment[attacCount]; * for (int i = 0; i < attacCount; i++) * { * attachments[i] = GetAttachment(searchImages[i], searchNames[i], searchTitle[i], searchBio[i]); * } * response.ComposeExtension.Attachments = attachments.ToList(); * } * else * { * List<string> searchNames = speakers.Select(c => c.SpeakerName).ToList(); * List<string> searchImages = speakers.Select(c => c.Snap).ToList(); * List<string> searchTitle = speakers.Select(c => c.Title).ToList(); * List<string> searchBio = speakers.Select(c => c.Bio).ToList(); * attachments = new ComposeExtensionAttachment[searchNames.Count]; * for (int i = 0; i < searchNames.Count; i++) * { * attachments[i] = GetAttachment(searchImages[i], searchNames[i], searchTitle[i], searchBio[i]); * } * response.ComposeExtension.Attachments = attachments.ToList(); * } * * return response; * }*/ else if (query.CommandId == "EventsTrainings") { List <EventsAndTrainings> eventsTrainings = helper.GetEandT(); var title = ""; var titleParam = query.Parameters?.FirstOrDefault(p => p.Name == "ETTitle"); var response = new ComposeExtensionResponse(new ComposeExtensionResult("list", "result")); ComposeExtensionAttachment[] attachments = null; if (titleParam != null) { title = titleParam.Value.ToString(); List <string> searchTitle = eventsTrainings.Select(a => a.ETTitle).Where(c => c.ToLower().Contains(title.ToLower())).Select(d => d).ToList(); List <string> searchdate = eventsTrainings.Where(a => a.ETTitle.ToLower().Contains(title.ToLower())).Select(d => d.ETStartDate).ToList(); List <string> searchend = eventsTrainings.Where(a => a.ETTitle.ToLower().Contains(title.ToLower())).Select(d => d.ETEndDate).ToList(); List <string> searchETType = eventsTrainings.Where(a => a.ETTitle.ToLower().Contains(title.ToLower())).Select(d => d.ETType).ToList();; int attacCount = searchTitle.Count(); attachments = new ComposeExtensionAttachment[attacCount]; for (int i = 0; i < attacCount; i++) { // string Type = searchSpeaker[i] + " - " + searchSessionType[i]; attachments[i] = GetAttachment(searchdate[i], searchend[i], searchTitle[i], searchETType[i]); } response.ComposeExtension.Attachments = attachments.ToList(); } else { List <string> searchTitle = eventsTrainings.Select(c => c.ETTitle).Take(20).ToList(); List <string> searchdate = eventsTrainings.Select(c => c.ETStartDate).Take(20).ToList(); List <string> searchend = eventsTrainings.Select(c => c.ETEndDate).Take(20).ToList(); List <string> searchETType = eventsTrainings.Select(c => c.ETType).ToList(); attachments = new ComposeExtensionAttachment[searchTitle.Count]; for (int i = 0; i < searchTitle.Count; i++) { //string speakerAndSessionType = searchSpeaker[i] + " - " + searchSessionType[i]; attachments[i] = GetAttachment(searchdate[i], searchend[i], searchTitle[i], searchETType[i]); } response.ComposeExtension.Attachments = attachments.ToList(); } return(response); } return(null); }
public async Task <IActionResult> Run([HttpTrigger(AuthorizationLevel.Anonymous, "post", Route = null)] HttpRequest req, ILogger logger, ExecutionContext context) { if (logger == null) { throw new ArgumentNullException(nameof(logger)); } using (var scope = logger.BeginScope($"{nameof(MessagesHttpFunction.Run)}")) { if (req == null) { throw new ArgumentNullException(nameof(req)); } if (context == null) { throw new ArgumentNullException(nameof(context)); } logger.LogInformation("Messages function received a request."); // Use the configured service for tests or create ones to use. ISettings settings = this.settings ?? new Settings(logger, context); IStickerSetRepository stickerSetRepository = this.stickerSetRepository ?? new StickerSetRepository(logger, settings); IStickerSetIndexer stickerSetIndexer = this.stickerSetIndexer ?? new StickerSetIndexer(logger); ICredentialProvider credentialProvider = this.credentialProvider ?? new SimpleCredentialProvider(settings.MicrosoftAppId, null); IChannelProvider channelProvider = this.channelProvider ?? new SimpleChannelProvider(); // Parse the incoming activity and authenticate the request Activity activity; try { var authorizationHeader = GetAuthorizationHeader(req); activity = await ParseRequestBody(req); await JwtTokenValidation.AuthenticateRequest(activity, authorizationHeader, credentialProvider, channelProvider); } catch (JsonReaderException e) { logger.LogDebug(e, "JSON parser failed to parse request payload."); return(new BadRequestResult()); } catch (UnauthorizedAccessException e) { logger.LogDebug(e, "Request was not propertly authorized."); return(new UnauthorizedResult()); } // Log telemetry about the activity try { this.LogActivityTelemetry(activity); } catch (Exception ex) { logger.LogWarning(ex, "Error sending user activity telemetry"); } // Reject all activity types other than those related to messaging extensions if (!activity.IsComposeExtensionQuery()) { logger.LogDebug("Request payload was not a messaging extension query."); return(new BadRequestObjectResult($"App only supports messaging extension query activity types.")); } // Get the query string. We expect exactly 1 parameter, so we take the first parameter, regardless of the name. var skip = 0; var count = 25; var query = string.Empty; if (activity.Value != null) { var queryValue = JObject.FromObject(activity.Value).ToObject <ComposeExtensionValue>(); query = queryValue.GetParameterValue(); if (queryValue?.QueryOptions != null) { skip = queryValue.QueryOptions.Skip; count = queryValue.QueryOptions.Count; } } // Find matching stickers var stickerSet = await stickerSetRepository.FetchStickerSetAsync(); await stickerSetIndexer.IndexStickerSetAsync(stickerSet); var stickers = await stickerSetIndexer.FindStickersByQuery(query, skip, count); var result = new ComposeExtensionResponse { ComposeExtensionResult = new ComposeExtensionResult { Type = "result", AttachmentLayout = "grid", Attachments = stickers.Select(sticker => new StickerComposeExtensionCard(sticker).ToAttachment()).ToArray() } }; return(new OkObjectResult(result)); } }