//private YouTubeLiveMessageContext CreateMessageContext2(InternalMembership comment, bool isInitialComment)
        //{
        //    IYouTubeLiveMessage message;
        //    IEnumerable<IMessagePart> commentItems;
        //    IEnumerable<IMessagePart> nameItems;

        //    var a = new YouTubeLiveMembership(comment);
        //    message = a;
        //    nameItems = a.NameItems;
        //    commentItems = a.CommentItems;

        //    var metadata = CreateMetadata(message, isInitialComment);
        //    var methods = new YouTubeLiveMessageMethods();
        //    if (_siteOptions.IsAutoSetNickname)
        //    {
        //        var user = metadata.User;
        //        var messageText = Common.MessagePartsTools.ToText(commentItems);
        //        var nick = SitePluginCommon.Utils.ExtractNickname(messageText);
        //        if (!string.IsNullOrEmpty(nick))
        //        {
        //            user.Nickname = nick;
        //        }
        //    }
        //    metadata.User.Name = nameItems;
        //    return new YouTubeLiveMessageContext(message, metadata, methods);
        //}
        //private YouTubeLiveMessageContext CreateMessageContext2(InternalSuperChat superChat, bool isInitialComment)
        //{
        //    IYouTubeLiveMessage message;
        //    IEnumerable<IMessagePart> commentItems;
        //    IEnumerable<IMessagePart> nameItems;

        //    var a = new YouTubeLiveSuperchat(superChat);
        //    message = a;
        //    nameItems = a.NameItems;
        //    commentItems = a.CommentItems;

        //    var metadata = CreateMetadata(message, isInitialComment);
        //    var methods = new YouTubeLiveMessageMethods();
        //    if (_siteOptions.IsAutoSetNickname)
        //    {
        //        var user = metadata.User;
        //        var messageText = Common.MessagePartsTools.ToText(commentItems);
        //        var nick = SitePluginCommon.Utils.ExtractNickname(messageText);
        //        if (!string.IsNullOrEmpty(nick))
        //        {
        //            user.Nickname = nick;
        //        }
        //    }
        //    metadata.User.Name = nameItems;
        //    return new YouTubeLiveMessageContext(message, metadata, methods);
        //}
        //private YouTubeLiveMessageContext CreateMessageContext2(InternalComment comment, bool isInitialComment)
        //{
        //    IYouTubeLiveMessage message;
        //    IEnumerable<IMessagePart> commentItems;
        //    IEnumerable<IMessagePart> nameItems;

        //    var a = new YouTubeLiveComment(comment);
        //    message = a;
        //    nameItems = a.NameItems;
        //    commentItems = a.CommentItems;

        //    var metadata = CreateMetadata(message, isInitialComment);
        //    var methods = new YouTubeLiveMessageMethods();
        //    if (_siteOptions.IsAutoSetNickname)
        //    {
        //        var user = metadata.User;
        //        var messageText = Common.MessagePartsTools.ToText(commentItems);
        //        var nick = SitePluginCommon.Utils.ExtractNickname(messageText);
        //        if (!string.IsNullOrEmpty(nick))
        //        {
        //            user.Nickname = nick;
        //        }
        //    }
        //    metadata.User.Name = nameItems;
        //    return new YouTubeLiveMessageContext(message, metadata, methods);
        //}
        //private YouTubeLiveMessageContext CreateMessageContext(CommentData commentData, bool isInitialComment)
        //{
        //    IYouTubeLiveMessage message;
        //    IEnumerable<IMessagePart> commentItems;
        //    IEnumerable<IMessagePart> nameItems;

        //    if (commentData.IsPaidMessage)
        //    {
        //        var superchat = new YouTubeLiveSuperchat(commentData);
        //        message = superchat;
        //        nameItems = superchat.NameItems;
        //        commentItems = superchat.CommentItems;
        //    }
        //    else
        //    {
        //        var comment = new YouTubeLiveComment(commentData);
        //        message = comment;
        //        nameItems = comment.NameItems;
        //        commentItems = comment.CommentItems;
        //    }
        //    var metadata = CreateMetadata(message, isInitialComment);
        //    var methods = new YouTubeLiveMessageMethods();
        //    if (_siteOptions.IsAutoSetNickname)
        //    {
        //        var user = metadata.User;
        //        var messageText = Common.MessagePartsTools.ToText(commentItems);
        //        var nick = SitePluginCommon.Utils.ExtractNickname(messageText);
        //        if (!string.IsNullOrEmpty(nick))
        //        {
        //            user.Nickname = nick;
        //        }
        //    }
        //    metadata.User.Name = nameItems;
        //    return new YouTubeLiveMessageContext(message, metadata, methods);
        //}
        private YouTubeLiveMessageMetadata CreateMetadata(IYouTubeLiveMessage message, bool isInitialComment)
        {
            string userId = null;

            if (message is IYouTubeLiveComment comment)
            {
                userId = comment.UserId;
            }
            else if (message is IYouTubeLiveSuperchat superchat)
            {
                userId = superchat.UserId;
            }
            else if (message is IYouTubeLiveMembership membership)
            {
                userId = membership.UserId;
            }
            bool  isFirstComment;
            IUser user;

            if (userId != null)
            {
                if (_userCommentCountDict.ContainsKey(userId))
                {
                    _userCommentCountDict[userId]++;
                    isFirstComment = false;
                }
                else
                {
                    _userCommentCountDict.Add(userId, 1);
                    isFirstComment = true;
                }
                user = GetUser(userId);
            }
            else
            {
                isFirstComment = false;
                user           = null;
            }
            var metadata = new YouTubeLiveMessageMetadata(message, _options, _siteOptions, user, this, isFirstComment)
            {
                IsInitialComment = isInitialComment,
                SiteContextGuid  = SiteContextGuid,
            };

            return(metadata);
        }
        public void UserColorTest()
        {
            var userMock = new Mock <IUser>();

            userMock.Setup(u => u.BackColorArgb).Returns("#FFFF0000");
            userMock.Setup(u => u.ForeColorArgb).Returns("#FF0000FF");
            var messageMock     = new Mock <IYouTubeLiveComment>();
            var optionsMock     = new Mock <ICommentOptions>();
            var siteOptionsMock = new Mock <IYouTubeLiveSiteOptions>();
            var message         = messageMock.Object;
            var options         = optionsMock.Object;
            var siteOptions     = siteOptionsMock.Object;
            var user            = userMock.Object;

            var metadata = new YouTubeLiveMessageMetadata(message, options, siteOptions, user, null, false);

            Assert.AreEqual(Colors.Red, metadata.BackColor);
            Assert.AreEqual(Colors.Blue, metadata.ForeColor);
        }
        public void UserColorChangedRaisedTest()
        {
            var userMock = new Mock <IUser>();

            userMock.Setup(u => u.BackColorArgb).Returns("#FFFF0000");
            userMock.Setup(u => u.ForeColorArgb).Returns("#FF0000FF");
            var messageMock     = new Mock <IYouTubeLiveComment>();
            var optionsMock     = new Mock <ICommentOptions>();
            var siteOptionsMock = new Mock <IYouTubeLiveSiteOptions>();
            var message         = messageMock.Object;
            var options         = optionsMock.Object;
            var siteOptions     = siteOptionsMock.Object;
            var user            = userMock.Object;

            var metadata        = new YouTubeLiveMessageMetadata(message, options, siteOptions, user, null, false);
            var backColorRaised = false;
            var foreColorRaised = false;

            metadata.PropertyChanged += (s, e) =>
            {
                switch (e.PropertyName)
                {
                case nameof(metadata.BackColor):
                    backColorRaised = true;
                    break;

                case nameof(metadata.ForeColor):
                    foreColorRaised = true;
                    break;
                }
            };
            userMock.Raise(c => c.PropertyChanged += null, new PropertyChangedEventArgs(nameof(user.BackColorArgb)));
            userMock.Raise(c => c.PropertyChanged += null, new PropertyChangedEventArgs(nameof(user.ForeColorArgb)));
            Assert.IsTrue(backColorRaised);
            Assert.IsTrue(foreColorRaised);
        }