示例#1
0
        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));
        }
示例#3
0
        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));
        }
示例#4
0
        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);
        }
示例#5
0
        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));
        }
示例#7
0
        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));
        }
示例#8
0
        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);
        }
示例#9
0
        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()));
        }