Example #1
0
        public Runner Init(IFeedbackProvider feedbackProvider, string[] args)
        {
            var catalog = new AggregateCatalog(new AssemblyCatalog(typeof(Bootstrapper).Assembly));

            var currentDir = Environment.CurrentDirectory;
            var assemblyDir = new FileInfo(new Uri(Assembly.GetExecutingAssembly().CodeBase).AbsolutePath).Directory.FullName;

            var paths = new string[]
            {
                assemblyDir,
                Path.Combine(assemblyDir, "Tasks"),
                currentDir,
                Path.Combine(currentDir, "Tasks")
            }.Unique();

            var dirCatalogs = paths.Where(x => Directory.Exists(x))
                                   .Select(x => new DirectoryCatalog(x, "*.Tasks.dll"));
            dirCatalogs.Apply(x => catalog.Catalogs.Add(x));

            var container = new CompositionContainer(catalog);

            var parsed = new ArgumentParser().Parse(args);
            var runner = new Runner(parsed.ActualArgs.ToArray());

            var batch = new CompositionBatch();
            batch.AddExportedValue<IFeedbackProvider>(feedbackProvider);
            parsed.Options.Apply(x => batch.AddExportedValue<string>(x.Item1, x.Item2));
            parsed.Switches.Apply(x => batch.AddExportedValue<bool>(x, true));
            batch.AddPart(runner);
            container.Compose(batch);

            return runner;
        }
Example #2
0
        public FeedbackManager(IFeedbackProvider feedbackProvider)
        {
            if (feedbackProvider == null)
            {
                throw new ArgumentNullException(nameof(feedbackProvider));
            }

            _feedbackProvider = feedbackProvider;
        }
        private static void InitFeedback()
        {
            lock (feedbackProviderSync) {
                foreach (TypeExtensionNode node in AddinManager.GetExtensionNodes("/Warehouse/Business/Feedback"))
                {
                    feedbackProvider = node.CreateInstance() as IFeedbackProvider;
                    if (feedbackProvider != null)
                    {
                        return;
                    }
                }

                feedbackProvider = new DummyFeedbackProvider();
            }
        }
Example #4
0
 /// <summary>
 /// Initializes a new instance of the <see cref="ActivityHelper{T}"/> class.
 /// </summary>
 /// <param name="logger">Instance to send logs to the Application Insights service.</param>
 /// <param name="userState">State management object for maintaining user conversation state.</param>
 /// <param name="teamStorageProvider">Provider for fetching information about team details from storage.</param>
 /// <param name="localizer">The current culture's string localizer.</param>
 /// <param name="dialog">Base class for all bot dialogs.</param>
 /// <param name="conversationState">State management object for maintaining conversation state.</param>
 /// <param name="teamMembershipHelper">Helper for team operations with Microsoft Graph API.</param>
 /// <param name="userProfileGraphApiHelper">Helper for user profile operations with Microsoft Graph API.</param>
 /// <param name="introductionStorageProvider">Provider for fetching information about new joiner introduction details from storage.</param>
 /// <param name="sharePointHelper">Helper for working with SharePoint.</param>
 /// <param name="introductionCardHelper">Helper for working with introduction cards.</param>
 /// <param name="graphUtility">Instance of Microsoft Graph utility helper.</param>
 /// <param name="welcomeCardFactory">Factory for working with welcome card attachments.</param>
 /// <param name="botOptions">A set of key/value application configuration properties for bot.</param>
 /// <param name="userStorageProvider">Provider for fetching information about user details from storage.</param>
 /// <param name="securityGroupSettings"> A set of key/value application configuration properties for AAD security group settings.</param>
 /// <param name="feedbackProvider">Provider for fetching information about new joiner feedbacks from storage.</param>
 /// <param name="imageUploadProvider">Provider for uploading user image to blob storage.</param>
 public ActivityHelper(
     ILogger <ActivityHelper <T> > logger,
     UserState userState,
     ITeamStorageProvider teamStorageProvider,
     IStringLocalizer <Strings> localizer,
     T dialog,
     ConversationState conversationState,
     ITeamMembership teamMembershipHelper,
     IUserProfile userProfileGraphApiHelper,
     IIntroductionStorageProvider introductionStorageProvider,
     ISharePointHelper sharePointHelper,
     IIntroductionCardHelper introductionCardHelper,
     IGraphUtilityHelper graphUtility,
     IWelcomeCardFactory welcomeCardFactory,
     IOptions <BotOptions> botOptions,
     IUserStorageProvider userStorageProvider,
     IOptions <AadSecurityGroupSettings> securityGroupSettings,
     IFeedbackProvider feedbackProvider,
     IImageUploadProvider imageUploadProvider)
 {
     this.logger                      = logger;
     this.userState                   = userState;
     this.teamStorageProvider         = teamStorageProvider;
     this.localizer                   = localizer;
     this.dialog                      = dialog;
     this.conversationState           = conversationState;
     this.teamOperationGraphApiHelper = teamMembershipHelper;
     this.userProfileGraphApiHelper   = userProfileGraphApiHelper;
     this.introductionStorageProvider = introductionStorageProvider;
     this.sharePointHelper            = sharePointHelper;
     this.introductionCardHelper      = introductionCardHelper;
     this.graphUtility                = graphUtility;
     this.welcomeCardFactory          = welcomeCardFactory;
     this.botOptions                  = botOptions ?? throw new ArgumentNullException(nameof(botOptions));
     this.userStorageProvider         = userStorageProvider;
     this.securityGroupSettings       = securityGroupSettings ?? throw new ArgumentNullException(nameof(securityGroupSettings));
     this.feedbackProvider            = feedbackProvider;
     this.imageUploadProvider         = imageUploadProvider;
 }
        /// <summary>
        /// Create a new Feedback entity from the input.
        /// </summary>
        /// <param name="message">A message in a conversation.</param>
        /// <param name="data">Represents the submit data associated with the Share feedback card.</param>
        /// <param name="member">Teams channel account detailing user Azure Active Directory details.</param>
        /// <param name="feedbackProvider">Tickets Provider.</param>
        /// <returns>TicketEntity object.</returns>
        private static async Task <FeedbackEntity> CreateFeedbackAsync(
            IMessageActivity message,
            ShareFeedbackCardPayload data,
            TeamsChannelAccount member,
            IFeedbackProvider feedbackProvider)
        {
            string description = null;

            if (data.Rating == nameof(FeedbackRating.Helpful))
            {
                description = data.DescriptionHelpful;
            }
            else if (data.Rating == nameof(FeedbackRating.NeedsImprovement))
            {
                description = data.DescriptionNeedsImprovement;
            }
            else if (data.Rating == nameof(FeedbackRating.NotHelpful))
            {
                description = data.DescriptionNotHelpful;
            }

            FeedbackEntity feedbackEntity = new FeedbackEntity
            {
                FeedbackId          = Guid.NewGuid().ToString(),
                UserPrincipalName   = member.UserPrincipalName,
                UserName            = member.Name,
                UserGivenName       = member.GivenName,
                Rating              = data.Rating,
                Description         = description,
                UserQuestion        = data.UserQuestion,
                KnowledgeBaseAnswer = data.KnowledgeBaseAnswer,
                Subject             = data.Project,
            };

            await feedbackProvider.UpsertFeecbackAsync(feedbackEntity).ConfigureAwait(false);

            return(feedbackEntity);
        }
        /// <summary>
        /// Helps to get the expert submit card.
        /// </summary>
        /// <param name="message">A message in a conversation.</param>
        /// <param name="appBaseUri">The base URI where the app is hosted.</param>
        /// <param name="turnContext">Context object containing information cached for a single turn of conversation with a user.</param>
        /// <param name="cancellationToken">Propagates notification that operations should be canceled.</param>
        /// <param name="feedbackProvider">Feedback Provider.</param>
        /// <returns>A task that represents the work queued to execute.</returns>
        public static async Task <FeedbackEntity> ShareFeedbackSubmitText(
            IMessageActivity message,
            string appBaseUri,
            ITurnContext <IMessageActivity> turnContext,
            CancellationToken cancellationToken,
            IFeedbackProvider feedbackProvider)
        {
            var shareFeedbackSubmitTextPayload = ((JObject)message.Value).ToObject <ShareFeedbackCardPayload>();

            // Validate required fields.
            if (!Enum.TryParse(shareFeedbackSubmitTextPayload?.Rating, out FeedbackRating rating) || shareFeedbackSubmitTextPayload.DescriptionHelpful?.Length > 500 || shareFeedbackSubmitTextPayload.DescriptionNeedsImprovement?.Length > 500 || shareFeedbackSubmitTextPayload.DescriptionNotHelpful?.Length > 500)
            {
                var updateCardActivity = new Activity(ActivityTypes.Message)
                {
                    Id           = turnContext.Activity.ReplyToId,
                    Conversation = turnContext.Activity.Conversation,
                    Attachments  = new List <Attachment> {
                        ShareFeedbackCard.GetCard(shareFeedbackSubmitTextPayload, appBaseUri)
                    },
                };
                try
                {
                    await turnContext.UpdateActivityAsync(updateCardActivity, cancellationToken).ConfigureAwait(false);
                }
                catch (ErrorResponseException)
                {
                    await turnContext.SendActivityAsync(Strings.InputTooLongWarning).ConfigureAwait(false);
                }

                return(null);
            }

            var teamsUserDetails = await GetUserDetailsInPersonalChatAsync(turnContext, cancellationToken).ConfigureAwait(false);

            return(await CreateFeedbackAsync(message, shareFeedbackSubmitTextPayload, teamsUserDetails, feedbackProvider).ConfigureAwait(false));
        }
Example #7
0
 public GenerationContext(IFeedbackProvider provider, string[] generationArgs)
 {
     this.generationArgs = generationArgs;
     FeedbackProvider = provider;
 }
 public FeedbackManager(IFeedbackProvider provider, ICespResourceProvider resourceProvider)
 {
     _feedbackProvider     = provider;
     _cespResourceProvider = resourceProvider;
 }
Example #9
0
 private void outputOutputHandler(IFeedbackProvider sender, string msg)
 {
     Console.WriteLine($"{sender.Owner} - OUTPUT ADDED: {msg}");
 }
Example #10
0
 private void errorOutputHandler(IFeedbackProvider sender, string msg)
 {
     Console.WriteLine($"{sender.Owner} - ERROR ADDED: {sender.LastError}");
 }
Example #11
0
 public FeedbackController(IFeedbackProvider provider)
 {
     _provider = provider;
 }