private async Task <InvokeResponse> PositionMessagingExtensionResponse(ITurnContext <IInvokeActivity> turnContext, int positionId) { var position = await _positionService.GetById(positionId); if (position == null) { return(new InvokeResponse { Status = (int)HttpStatusCode.OK }); } var positionsTemplate = new PositionTemplateModel { Items = new List <Position> { position }, }; var mainCard = await _positionsTemplate.RenderTemplate(turnContext, null, TemplateConstants.PositionAsAdaptiveCardWithMultipleItems, positionsTemplate); var previewCard = await _positionsTemplate.RenderTemplate(turnContext, null, TemplateConstants.PositionAsThumbnailCardWithMultipleItems, positionsTemplate); var attachment = mainCard.Attachments.First().ToMessagingExtensionAttachment(previewCard.Attachments.First()); var messagingExtensionResponse = _mapper.Map <MessagingExtensionAttachment[], MessagingExtensionResponse>(new[] { attachment }); return(_mapper.Map <MessagingExtensionResponse, InvokeResponse>(messagingExtensionResponse)); }
public override async Task <DialogTurnResult> BeginDialogAsync(DialogContext dc, object options = null, CancellationToken cancellationToken = default) { var text = dc.Context.GetTextWithoutCommand(BotCommands.NewTeamDialog); var positions = await _positionService.Search(text, 15, cancellationToken); if (positions.Count == 1) { var connectionName = _appSettings.OAuthConnectionName; var token = await((IUserTokenProvider)dc.Context.Adapter) .GetUserTokenAsync(dc.Context, connectionName, null, cancellationToken); var(team, displayName) = await _graphApiService.CreateNewTeamForPosition(positions[0], token.Token, cancellationToken); await dc.Context.SendActivityAsync($"[Team {displayName}]({team.WebUrl}) has been created.", cancellationToken : cancellationToken); } else { var positionsTemplate = new PositionTemplateModel { Items = positions, NoItemsLabel = "You don't have such open positions.", BotCommand = BotCommands.NewTeamDialog, ListCardTitle = "I found following positions:", }; await _positionsTemplate.ReplyWith(dc.Context, TemplateConstants.PositionAsAdaptiveCardWithMultipleItems, positionsTemplate); } return(await dc.EndDialogAsync(cancellationToken : cancellationToken)); }
public override async Task <DialogTurnResult> BeginDialogAsync( DialogContext dc, object options = null, CancellationToken cancellationToken = default) { var text = dc.Context.GetTextWithoutCommand(BotCommands.PositionsDetailsDialogCommand); var positions = new List <Position>(); if (!string.IsNullOrEmpty(text)) { var position = int.TryParse(text, out var positionId) ? await _positionService.GetById(positionId) : await _positionService.GetByExternalId(text, cancellationToken); if (position != null) { positions.Add(position); } } var positionsTemplate = new PositionTemplateModel { Items = positions, NoItemsLabel = "I couldn't find this position." }; await _positionsTemplate.ReplyWith(dc.Context, TemplateConstants.PositionAsAdaptiveCardWithMultipleItems, positionsTemplate); return(await dc.EndDialogAsync(cancellationToken : cancellationToken)); }
public async Task NotifyRecruiterAboutNewOpenPosition( Position position, CancellationToken cancellationToken = default) { var recruiter = await _recruiterService.GetById(position.HiringManagerId, cancellationToken); if (recruiter?.ConversationData is null) { return; } var staticTabEntityId = "OpenPositionsTab"; // you can find this value in manifest definition var staticTabName = "Potential candidates"; PositionTemplateModel positionsTemplate = new PositionTemplateModel { Items = new List <Position> { position }, ButtonActions = new List <AdaptiveAction> { new AdaptiveOpenUrlAction { Title = "Show all assigned positions", Url = new Uri(string.Format(CommonConstants.DeepLinkUrlFormat, _appSettings.MicrosoftAppId, staticTabEntityId, staticTabName)) } } }; var attachments = (await _positionsTemplate.RenderTemplate(null, null, TemplateConstants.PositionAsAdaptiveCardWithMultipleItems, positionsTemplate)).Attachments; await SendToConversation("You have a new position assigned to you.", attachments, recruiter.ConversationData, cancellationToken); }
private async Task <InvokeResponse> CreateConfirmJobPostingTaskModuleResponse(ITurnContext turnContext, PositionCreateCommand positionCreateCommand, CancellationToken cancellationToken) { var position = await _positionService.AddNewPosition(positionCreateCommand, cancellationToken); positionCreateCommand.CommandId = AppCommands.ConfirmCreationOfNewPosition; positionCreateCommand.PositionId = position.PositionId; var positionsTemplate = new PositionTemplateModel { Items = new List <Position> { position }, ButtonActions = new List <AdaptiveAction> { new AdaptiveSubmitAction { Title = "Confirm posting", Data = positionCreateCommand }, new AdaptiveSubmitAction { Title = "Cancel" } } }; var messageActivity = await _positionsTemplate.RenderTemplate(turnContext, null, TemplateConstants.PositionAsAdaptiveCardWithMultipleItems, positionsTemplate); var actionResponse = new MessagingExtensionActionResponse { Task = new TaskModuleContinueResponse { Type = "continue", Value = new TaskModuleTaskInfo { Card = messageActivity.Attachments.First(), Title = "Confirm new posting", Width = "medium", Height = "medium" } } }; return(_mapper.Map <MessagingExtensionActionResponse, InvokeResponse>(actionResponse)); }
public override async Task <DialogTurnResult> BeginDialogAsync( DialogContext dc, object options = null, CancellationToken cancellationToken = default) { var text = dc.Context.GetTextWithoutCommand(BotCommands.TopCandidatesDialogCommand); var positions = await _positionService.Search(text, 15, cancellationToken); if (positions.Count == 1) { var candidates = positions[0].Candidates; var interviewers = await _recruiterService.GetAllInterviewers(cancellationToken); CandidateTemplateModel templateModel = new CandidateTemplateModel { ListCardTitle = "Top candidates who have recently applied to your position:", BotCommand = BotCommands.CandidateDetailsDialogCommand, Items = candidates, Interviewers = interviewers, AppSettings = _appSettings, NoItemsLabel = $"There are no candidates for position ID: {positions[0].PositionExternalId}" }; await _candidatesTemplate.ReplyWith(dc.Context, TemplateConstants.CandidateAsAdaptiveCardWithMultipleItems, templateModel); } else { PositionTemplateModel positionsTemplate = new PositionTemplateModel { ListCardTitle = "I found several positions. Please specify:", Items = positions, BotCommand = BotCommands.TopCandidatesDialogCommand, NoItemsLabel = "You don't have open position with such ID." }; await _positionsTemplate.ReplyWith(dc.Context, TemplateConstants.PositionAsAdaptiveCardWithMultipleItems, positionsTemplate); } return(await dc.EndDialogAsync(cancellationToken : cancellationToken)); }
public override async Task <DialogTurnResult> BeginDialogAsync( DialogContext dc, object options = null, CancellationToken cancellationToken = default) { var openPositions = await _positionService.GetOpenPositions(dc.Context.Activity.From.Name, cancellationToken); var positionsTemplate = new PositionTemplateModel { ListCardTitle = $"You have {openPositions.Count} active postings right now:", Items = openPositions, BotCommand = BotCommands.PositionsDetailsDialogCommand, NoItemsLabel = "You have no open positions", ButtonActions = new Dictionary <string, string> { { "Add new job posting", BotCommands.NewJobPostingDialog } } }; await _positionsTemplate.ReplyWith(dc.Context, TemplateConstants.PositionAsAdaptiveCardWithMultipleItems, positionsTemplate); return(await dc.EndDialogAsync(cancellationToken : cancellationToken)); }
public async Task <IMessageActivity> OpenPositionAsync( ITurnContext turnContext, CancellationToken cancellationToken) { var commandData = JsonConvert.DeserializeObject <PositionCreateCommand>(turnContext.Activity.Value?.ToString()); if (commandData is null) { return(null); } var position = await _positionService.AddNewPosition(commandData, cancellationToken); var positionsTemplate = new PositionTemplateModel { Items = new List <Position> { position } }; var messageActivity = await _positionsTemplate.RenderTemplate(turnContext, null, TemplateConstants.PositionAsAdaptiveCardWithMultipleItems, positionsTemplate); return(messageActivity); }
public async Task <InvokeResponse> HandleMessagingExtensionQueryAsync( ITurnContext turnContext, MessagingExtensionQuery query, CancellationToken cancellationToken) { var initialRunParameter = GetQueryParameterByName(query, "initialRun"); // situation where the incoming payload was received from the config popup if (!string.IsNullOrEmpty(query.State)) { initialRunParameter = bool.TrueString; } var isInitialRun = string.Equals(initialRunParameter, bool.TrueString, StringComparison.OrdinalIgnoreCase); var maxResults = isInitialRun ? 5 : query.QueryOptions.Count ?? 25; var attachments = new List <MessagingExtensionAttachment>(); var searchText = GetQueryParameterByName(query, MessagingExtensionCommands.SearchTextParameterName); switch (query.CommandId) { case MessagingExtensionCommands.SearchPositions: var positions = await _positionService.Search(searchText, maxResults, cancellationToken); foreach (var position in positions) { var positionsTemplate = new PositionTemplateModel { Items = new List <Position> { position }, }; var mainCard = await _positionsTemplate.RenderTemplate(turnContext, null, TemplateConstants.PositionAsAdaptiveCardWithMultipleItems, positionsTemplate); var previewCard = await _positionsTemplate.RenderTemplate(turnContext, null, TemplateConstants.PositionAsThumbnailCardWithMultipleItems, positionsTemplate); attachments.Add(mainCard.Attachments.First().ToMessagingExtensionAttachment(previewCard.Attachments.First())); } break; case MessagingExtensionCommands.SearchCandidates: var candidates = await _candidateService.Search(searchText, maxResults, cancellationToken); var interviewers = await _recruiterService.GetAllInterviewers(cancellationToken); foreach (var candidate in candidates) { var templateModel = new CandidateTemplateModel { Items = new List <Candidate> { candidate }, Interviewers = interviewers, AppSettings = _appSettings, }; var mainCard = await _candidatesTemplate.RenderTemplate(turnContext, null, TemplateConstants.CandidateAsAdaptiveCardWithMultipleItems, templateModel); var previewCard = await _candidatesTemplate.RenderTemplate(turnContext, null, TemplateConstants.CandidateAsThumbnailCardWithMultipleItems, templateModel); attachments.Add(mainCard.Attachments.First().ToMessagingExtensionAttachment(previewCard.Attachments.First())); } break; } return(_mapper.Map <MessagingExtensionAttachment[], InvokeResponse>(attachments.ToArray())); }