예제 #1
0
        public MirrativCommentViewModel(ICommentOptions options, IMirrativSiteOptions siteOptions, Message message, bool isFirstComment, ICommentProvider commentProvider, IUser user)
            : base(options, user, commentProvider, isFirstComment)
        {
            MessageType  = message.Type;
            _siteOptions = siteOptions;
            Id           = message.Id;
            UserId       = message.UserId;
            PostTime     = Tools.UnixTime2DateTime(message.CreatedAt).ToString("HH:mm:ss");

            var name = new List <IMessagePart> {
                MessagePartFactory.CreateMessageText(message.Username)
            };

            user.Name = name;
            var comment = message.Comment;

            if (siteOptions.NeedAutoSubNickname && message.Type == MessageType.Comment)
            {
                var nick = ExtractNickname(comment);
                if (!string.IsNullOrEmpty(nick))
                {
                    user.Nickname = nick;
                }
            }
            NameItemsInternal = name;
            MessageItems      = new List <IMessagePart> {
                MessagePartFactory.CreateMessageText(comment)
            };

            Init();
        }
        public McvYouTubeLiveCommentViewModel(YouTubeLiveSitePlugin.IYouTubeLiveSuperchat item, IMessageMetadata metadata, IMessageMethods methods, IConnectionStatus connectionStatus, IOptions options)
            : this(metadata, methods, connectionStatus, options)
        {
            var comment = item;

            _message = comment;

            _nameItems = comment.NameItems;
            //MessageItems = comment.CommentItems;

            var list = new List <IMessagePart>();
            var s    = item.PurchaseAmount;

            if (item.CommentItems.Count() > 0)
            {
                s += Environment.NewLine;
            }
            list.Add(MessagePartFactory.CreateMessageText(s));
            list.AddRange(item.CommentItems);
            MessageItems = list;

            Thumbnail = comment.UserIcon;
            Id        = comment.Id;
            PostTime  = comment.PostedAt.ToString("HH:mm:ss");
        }
예제 #3
0
        public static async Task <INicoComment> CreateNicoComment(IChat chat, IUser user, INicoSiteOptions _siteOptions, string roomName, Func <string, Task <IUserInfo> > f, ILogger logger)
        {
            var userId = chat.UserId;
            var is184  = Tools.Is184UserId(userId);

            if (_siteOptions.IsAutoSetNickname)
            {
                SitePluginCommon.Utils.SetNickname(chat.Text, user);
            }

            string thumbnailUrl = null;
            string name         = null;

            try
            {
                if (IsNamaId(userId))
                {
                    var userInfo = await f(userId);//API.GetUserInfo(_dataSource, userId);

                    thumbnailUrl = userInfo.ThumbnailUrl;
                    if (_siteOptions.IsAutoGetUsername)
                    {
                        name      = userInfo.Name;
                        user.Name = new List <IMessagePart> {
                            MessagePartFactory.CreateMessageText(userInfo.Name)
                        };
                    }
                }
            }
            catch (Exception ex)
            {
                logger.LogException(ex);
            }

            string id;

            if (chat.No.HasValue)
            {
                var shortName = Tools.GetShortRoomName(roomName);
                id = $"{shortName}:{chat.No}";
            }
            else
            {
                id = roomName;
            }
            var comment = chat.Text;

            return(new NicoComment(chat.Raw)
            {
                Text = comment,
                Id = id,
                UserName = name,
                PostedAt = chat.Date,
                ThumbnailUrl = thumbnailUrl,
                UserId = userId,
                ChatNo = chat.No,
                RoomName = roomName,
                Is184 = is184,
            });
        }
예제 #4
0
        private static List <IMessagePart> GetNameParts(dynamic ren)
        {
            var nameItems = new List <IMessagePart>();

            if (ren.ContainsKey("authorName"))
            {
                nameItems.Add(MessagePartFactory.CreateMessageText((string)ren.authorName.simpleText));
            }
            if (ren.ContainsKey("authorBadges"))
            {
                foreach (var badge in ren.authorBadges)
                {
                    if (badge.liveChatAuthorBadgeRenderer.ContainsKey("customThumbnail"))
                    {
                        var url = (string)badge.liveChatAuthorBadgeRenderer.customThumbnail.thumbnails[0].url;
                        var alt = (string)badge.liveChatAuthorBadgeRenderer.tooltip;
                        nameItems.Add(new MessageImage {
                            Url = url, Alt = alt, Width = 16, Height = 16
                        });
                    }
                    else if (badge.liveChatAuthorBadgeRenderer.ContainsKey("icon"))
                    {
                        var iconType = (string)badge.liveChatAuthorBadgeRenderer.icon.iconType;
                        var alt      = (string)badge.liveChatAuthorBadgeRenderer.tooltip;
                    }
                    else
                    {
                        throw new ParseException();
                    }
                }
            }
            return(nameItems);
        }
예제 #5
0
        private void OnMessageReceived(Result result)
        {
            var commentData    = ParsePrivMsg(result);
            var userId         = commentData.UserId;
            var isFirstComment = _commentCounter.UpdateCount(userId);
            var user           = GetUser(userId);

            if (_siteOptions.NeedAutoSubNickname)
            {
                SitePluginCommon.Utils.SetNickname(commentData.Message, user);
            }
            var message = new TwitchComment(result.Raw)
            {
                CommentItems = Tools.GetMessageItems(result),
                Id           = commentData.Id,
                NameItems    = new List <IMessagePart> {
                    MessagePartFactory.CreateMessageText(commentData.Username)
                },
                PostTime = commentData.SentAt.ToString("HH:mm:ss"),
                UserId   = commentData.UserId,
            };
            var metadata = new MessageMetadata(message, _options, _siteOptions, user, this, isFirstComment)
            {
                IsInitialComment = false,
                SiteContextGuid  = SiteContextGuid,
            };
            var methods        = new TwitchMessageMethods();
            var messageContext = new TwitchMessageContext(message, metadata, methods);

            MessageReceived?.Invoke(this, messageContext);
        }
예제 #6
0
        public static IUser FromJson(string json)
        {
            dynamic d         = Newtonsoft.Json.JsonConvert.DeserializeObject(json);
            var     userId    = d.userid.Value;
            var     nick      = d.nickname.Value;
            var     backColor = d.backcolor.Value;
            var     foreColor = d.forecolor.Value;
            var     isNg      = d.is_ng.Value.ToLower() == "true";
            var     name      = d.name;
            var     nameItems = new List <IMessagePart>();

            foreach (var nameItem in d.name)
            {
                if (nameItem.type == "text")
                {
                    var val = nameItem.value.Value;
                    nameItems.Add(MessagePartFactory.CreateMessageText(val));
                }
            }
            var user = new UserTest(userId)
            {
                Name = nameItems, Nickname = nick, BackColorArgb = backColor, ForeColorArgb = foreColor, IsNgUser = isNg
            };

            return(user);
        }
예제 #7
0
        private NicoComment Convert(Chat chat, string roomName)
        {
            string id;

            if (chat.No.HasValue)
            {
                var shortName = Tools.GetShortRoomName(roomName);
                id = $"{shortName}:{chat.No}";
            }
            else
            {
                id = roomName;
            }
            var message = new NicoComment(chat.Raw, _siteOptions)
            {
                ChatNo       = chat.No,
                CommentItems = new List <IMessagePart> {
                    MessagePartFactory.CreateMessageText(chat.Text)
                },
                Id        = id,
                Is184     = Tools.Is184UserId(chat.UserId),
                NameItems = null,
                PostTime  = chat.Date.ToString("HH:mm:ss"),
                RoomName  = roomName,
                UserIcon  = null,
                UserId    = chat.UserId,
            };

            return(message);
        }
예제 #8
0
 //ParseMessage.IMessage _message;
 //     public LineLiveCommentViewModel(ICommentOptions options, ILineLiveSiteOptions siteOptions, ParseMessage.ILove data, ParseMessage.IUser sender, IUser user, ICommentProvider cp) :
 //         base(options, user, cp, false)
 //     {
 //         MessageType = MessageType.BroadcastInfo;
 //         _siteOptions = siteOptions;
 //         _message = data;
 //         CommentProvider = cp;
 //         var msg = sender.DisplayName + "さんがハートを送りました!";
 //         MessageItems = new List<IMessagePart> { MessagePartFactory.CreateMessageText(msg) };
 //         Init();
 //     }
 //     public LineLiveCommentViewModel(ICommentOptions options, ILineLiveSiteOptions siteOptions, ParseMessage.IGiftMessage data, ParseMessage.IUser sender, IUser user, ICommentProvider cp) :
 //base(options, user, cp, false)
 //     {
 //         MessageType = MessageType.BroadcastInfo;
 //         _siteOptions = siteOptions;
 //         _message = data;
 //         CommentProvider = cp;
 //         //2018/07/13
 //         if (data.ItemId == "limited-love-gift" || string.IsNullOrEmpty(data.Url))
 //         {
 //             //{"type":"giftMessage","data":{"message":"","type":"LOVE","itemId":"limited-love-gift","quantity":1,"displayName":"limited.love.gift.item","sender":{"id":2903515,"hashedId":"715i4MKqyv","displayName":"上杉The Times","iconUrl":"https://scdn.line-apps.com/obs/0hmNs42D-0MmFOTR9H8JtNNnYQNBY3YzEpNmkpRHdEbQI3LnYxIX97UGIdaVdjKXVjd3ktVGNEP1VjenU1ew/f64x64","hashedIconId":"0hmNs42D-0MmFOTR9H8JtNNnYQNBY3YzEpNmkpRHdEbQI3LnYxIX97UGIdaVdjKXVjd3ktVGNEP1VjenU1ew","isGuest":false,"isBlocked":false},"isNGGift":false,"sentAt":1531445716,"key":"2426265.29035150000000000000","blockedByCms":false}}
 //             var msg = sender.DisplayName + "さんがハートで応援ポイントを送りました!";
 //             MessageItems = new List<IMessagePart> { MessagePartFactory.CreateMessageText(msg) };
 //         }
 //         else
 //         {
 //             var msg = sender.DisplayName + "さんが" + data.Quantity + "コインプレゼントしました!";
 //             MessageItems = new List<IMessagePart> { MessagePartFactory.CreateMessageText(msg), new MessageImage { Url = data.Url } };
 //         }
 //         Init();
 //     }
 //     public LineLiveCommentViewModel(ICommentOptions options, ILineLiveSiteOptions siteOptions, ParseMessage.IFollowStartData data, ParseMessage.IUser sender, IUser user, ICommentProvider cp) :
 //         base(options, user, cp, false)
 //     {
 //         MessageType = MessageType.BroadcastInfo;
 //         _siteOptions = siteOptions;
 //         _message = data;
 //         CommentProvider = cp;
 //         var msg = sender.DisplayName + "さんがフォローしました!";
 //         MessageItems = new List<IMessagePart> { MessagePartFactory.CreateMessageText(msg) };
 //         Init();
 //     }
 public LineLiveCommentViewModel(ICommentOptions options, ILineLiveSiteOptions siteOptions, ParseMessage.IMessageData data, ParseMessage.IUser sender, IUser user, ICommentProvider cp) :
     base(options, user, cp, false)
 {
     MessageType  = MessageType.Comment;
     _siteOptions = siteOptions;
     //_message = data;
     UserId = sender.Id.ToString();
     Id     = "";
     if (siteOptions.IsAutoSetNickname)
     {
         var nick = ExtractNickname(data.Message);
         if (!string.IsNullOrEmpty(nick))
         {
             user.Nickname = nick;
         }
     }
     SetNameItems();
     MessageItems = new List <IMessagePart> {
         MessagePartFactory.CreateMessageText(data.Message)
     };
     Thumbnail = new MessageImage {
         Url = sender.IconUrl
     };
     PostTime = Tools.FromUnixTime(data.SentAt).ToString("HH:mm:ss");
     Init();
     NameItemsInternal = new List <IMessagePart> {
         MessagePartFactory.CreateMessageText(sender.DisplayName)
     };
     User.Name = NameItemsInternal;
 }
예제 #9
0
        public static INicoInfo CreateNicoInfo(IChat chat, string roomName, INicoSiteOptions siteOptions)
        {
            var match = Regex.Match(chat.Text, "^/info (?<no>\\d+) (?<content>.+)$", RegexOptions.Singleline);

            if (match.Success)
            {
                var no      = int.Parse(match.Groups["no"].Value);
                var content = match.Groups["content"].Value;
                return(new NicoInfo(chat.Raw, siteOptions)
                {
                    CommentItems = new List <IMessagePart> {
                        MessagePartFactory.CreateMessageText(content)
                    },
                    NameItems = null,
                    PostTime = chat.Date.ToString("HH:mm:ss"),
                    UserId = chat.UserId,
                    RoomName = roomName,
                    No = no,
                });
            }
            else
            {
                throw new ParseException(chat.Raw);
            }
        }
예제 #10
0
        public TwitchCommentViewModel(ICommentOptions options, ITwitchSiteOptions siteOptions,
                                      ICommentData commentData, bool isFirstComment, ICommentProvider commentProvider, IUser user)
            : base(options, user, commentProvider, isFirstComment)
        {
            MessageType  = MessageType.Comment;
            _siteOptions = siteOptions;
            Id           = commentData.Id;
            UserId       = commentData.UserId;
            DisplayName  = commentData.DisplayName;
            PostTime     = commentData.SentAt.ToString("HH:mm:ss");

            var name = commentData.Username;

            user.Name = new List <IMessagePart> {
                MessagePartFactory.CreateMessageText(name)
            };
            var message = commentData.Message;

            if (siteOptions.NeedAutoSubNickname)
            {
                var nick = ExtractNickname(message);
                if (!string.IsNullOrEmpty(nick))
                {
                    user.Nickname = nick;
                }
            }
            NameItemsInternal = new List <IMessagePart> {
                MessagePartFactory.CreateMessageText(name)
            };
            MessageItems = Tools.GetMessageItems(commentData.Message, commentData.Emotes);

            Init();
        }
        private MixchMessageContext CreateMessageContext(Packet p, bool isInitialComment)
        {
            var userId = p.UserId.ToString();
            var user   = GetUser(userId) as IUser2;

            if (!_userDict.ContainsKey(userId))
            {
                _userDict.AddOrUpdate(user.UserId, user, (id, u) => u);
            }
            bool isFirstComment;

            if (_userCommentCountDict.ContainsKey(userId))
            {
                _userCommentCountDict[userId]++;
                isFirstComment = false;
            }
            else
            {
                _userCommentCountDict.Add(userId, 1);
                isFirstComment = true;
            }

            var nameItems = new List <IMessagePart>();

            nameItems.Add(MessagePartFactory.CreateMessageText(p.Name));
            user.Name = nameItems;

            var messageItems = new List <IMessagePart>();
            var messageBody  = p.Message();

            if (!string.IsNullOrEmpty(messageBody))
            {
                messageItems.Add(MessagePartFactory.CreateMessageText(messageBody));
            }

            MixchMessageContext messageContext = null;
            IMixchMessage       message;

            message = new MixchMessage("")
            {
                MixchMessageType = (MixchMessageType)p.Kind,
                MessageItems     = messageItems,
                Id             = "", // ミクチャはメッセージにIDが存在しない
                NameItems      = nameItems,
                PostTime       = DateTimeOffset.FromUnixTimeSeconds(p.Created).LocalDateTime,
                UserId         = p.UserId.ToString(),
                IsFirstComment = isFirstComment,
            };
            var metadata = new MessageMetadata(message, _options, _siteOptions, user, this, isFirstComment)
            {
                IsInitialComment = isInitialComment,
                SiteContextGuid  = SiteContextGuid,
            };
            var methods = new MixchMessageMethods();

            messageContext = new MixchMessageContext(message, metadata, methods);
            return(messageContext);
        }
예제 #12
0
        public static List <IMessagePart> ParseMessage(string message)
        {
            var b    = ReplaceLink(message);
            var arr  = Regex.Split(b, "(\\<[^\\>]+?\\>)");
            var list = new List <IMessagePart>();

            foreach (var s in arr)
            {
                if (!s.StartsWith("<"))
                {
                    var decoded = ReplaceHtmlEntities(s);
                    list.Add(MessagePartFactory.CreateMessageText(decoded));
                }
                else if (s.StartsWith("<a href"))
                {
                    var match = Regex.Match(s, "^<a href=\"(?<url>[^\"]+)\"");
                    if (match.Success)
                    {
                        var url = match.Groups["url"].Value;
                        list.Add(new MessageLink {
                            Text = url, Url = url
                        });
                    }
                }
                else if (s.StartsWith("<br"))
                {
                    list.Add(MessagePartFactory.CreateMessageText(Environment.NewLine));
                }
                else if (s == "<wbr>")
                {
                    //do nothing
                }
                else if (s.StartsWith("<img"))
                {
                    var match = Regex.Match(s, "(\\<img class=\"emoji\" src=\"(?<url>[^\"]+)\" width=\"(?<width>\\d+)\" height=\"(?<height>\\d+)\" /\\>)");
                    if (match.Success)
                    {
                        var url    = "https://twitcasting.tv" + match.Groups["url"].Value;//domainを追加しないと
                        var width  = int.Parse(match.Groups["width"].Value);
                        var height = int.Parse(match.Groups["height"].Value);
                        list.Add(new MessageImage {
                            Url = url, Alt = "", Height = height, Width = width
                        });
                    }
                }
                else
                {
#if DEBUG
                    using (var sw = new System.IO.StreamWriter("tag.txt", true))
                    {
                        sw.WriteLine(s);
                    }
#endif
                }
            }
            return(list);
        }
예제 #13
0
 private void SetNameItems()
 {
     if (!string.IsNullOrEmpty(User.Nickname))
     {
         NickItemsInternal = new List <IMessagePart> {
             MessagePartFactory.CreateMessageText(User.Nickname)
         };
     }
 }
        public OpenrecCommentViewModel(IOpenrecCommentData commentData, ICommentOptions options, IOpenrecSiteOptions siteOptions, ICommentProvider commentProvider, bool isFirstComment, IUser user)
            : base(options, user, commentProvider, isFirstComment)
        {
            MessageType  = MessageType.Comment;
            _options     = options;
            _siteOptions = siteOptions;
            UserId       = commentData.UserId;
            Id           = commentData.Id;
            PostDate     = commentData.PostTime.ToString("HH:mm:ss");
            var elapsed = commentData.Elapsed;

            Elapsed = Tools.ElapsedToString(elapsed);
            IsStamp = commentData.Stamp != null;
            IsYell  = commentData.IsYell;
            if (!string.IsNullOrEmpty(commentData.UserIconUrl))
            {
                Thumbnail = new MessageImage {
                    Url = commentData.UserIconUrl
                };
            }
            if (siteOptions.IsAutoSetNickname)
            {
                var nick = ExtractNickname(commentData.Message.Text);
                if (!string.IsNullOrEmpty(nick))
                {
                    user.Nickname = nick;
                }
            }
            //Name
            {
                var nameItems = new List <IMessagePart>();
                nameItems.Add(MessagePartFactory.CreateMessageText(commentData.Name));
                nameItems.AddRange(commentData.NameIcons);
                NameItemsInternal = nameItems;
            }
            //Message
            {
                var messageItems = new List <IMessagePart>();
                if (commentData.IsYell)
                {
                    MessageType = MessageType.BroadcastInfo;
                    messageItems.Add(MessagePartFactory.CreateMessageText("エールポイント:" + commentData.YellPoints + Environment.NewLine));
                }
                messageItems.Add(commentData.Message);
                if (commentData.Stamp != null)
                {
                    MessageType = MessageType.BroadcastInfo;
                    messageItems.Add(commentData.Stamp);
                }
                MessageItems = messageItems;
            }
            Init();
        }
예제 #15
0
        private static List <IMessagePart> GetMessageParts(dynamic ren)
        {
            var messageItems = new List <IMessagePart>();

            if (!ren.ContainsKey("message"))//PaidMessageではコメント無しも可能
            {
                return(messageItems);
            }
            if (ren.message.ContainsKey("runs"))
            {
                foreach (var r in ren.message.runs)
                {
                    if (r.ContainsKey("text"))
                    {
                        var text = (string)r.text;
                        messageItems.Add(MessagePartFactory.CreateMessageText(text));
                    }
                    else if (r.ContainsKey("emoji"))
                    {
                        var emoji       = r.emoji;
                        var thumbnail   = emoji.image.thumbnails[0];
                        var emojiUrl    = thumbnail.url;
                        var emojiWidth  = (int)thumbnail.width;
                        var emojiHeight = (int)thumbnail.height;
                        var emojiAlt    = emoji.image.accessibility.accessibilityData.label;
                        messageItems.Add(new MessageImage {
                            Url = emojiUrl, Alt = emojiAlt, Height = emojiHeight, Width = emojiWidth
                        });
                    }
                    else
                    {
                        throw new ParseException();
                    }
                }
            }
            else if (ren.message.ContainsKey("simpleText"))
            {
                var text = (string)ren.message.simpleText;
                messageItems.Add(MessagePartFactory.CreateMessageText(text));
            }
            else
            {
                throw new ParseException();
            }
            return(messageItems);
        }
예제 #16
0
        private TwicasMessageContext CreateMessageContext(LowObject.Comment lowComment, bool isInitialComment, string raw)
        {
            var  commentData = Tools.Parse(lowComment);
            var  userId      = commentData.UserId;
            bool isFirstComment;

            if (_userCommentCountDict.ContainsKey(userId))
            {
                _userCommentCountDict[userId]++;
                isFirstComment = false;
            }
            else
            {
                _userCommentCountDict.AddOrUpdate(userId, 1, (s, n) => n);
                isFirstComment = true;
            }
            var user = GetUser(userId);

            var message = new TwicasComment(raw)
            {
                CommentItems = commentData.Message,
                Id           = commentData.Id.ToString(),
                NameItems    = new List <IMessagePart> {
                    MessagePartFactory.CreateMessageText(commentData.Name)
                },
                PostTime = commentData.Date.ToString("HH:mm:ss"),
                UserId   = commentData.UserId,
                UserIcon = new MessageImage
                {
                    Url    = commentData.ThumbnailUrl,
                    Alt    = null,
                    Height = commentData.ThumbnailHeight,
                    Width  = commentData.ThumbnailWidth,
                },
            };
            var metadata = new MessageMetadata(message, _options, _siteOptions, user, _cp, isFirstComment)
            {
                IsInitialComment = isInitialComment,
                SiteContextGuid  = SiteContextGuid,
            };
            var methods        = new TwicasMessageMethods();
            var messageContext = new TwicasMessageContext(message, metadata, methods);

            return(messageContext);
        }
예제 #17
0
        public static INicoItem CreateNicoItem(IChat chat, string roomName, INicoSiteOptions siteOptions)
        {
            //Text
            ///gift takenoko 41600702 "さーら♔" 600 "" "たけのこ" 1

            var content = chat.Text;

            return(new NicoItem(chat.Raw, siteOptions)
            {
                CommentItems = new List <IMessagePart> {
                    MessagePartFactory.CreateMessageText(content)
                },
                NameItems = null,
                PostTime = chat.Date.ToString("HH:mm:ss"),
                UserId = chat.UserId,
                RoomName = roomName,
            });
        }
예제 #18
0
        public void VisibilityTest(bool isNgUser, bool isVisible)
        {
            var commentMock = new Mock <IOpenrecCommentData>();

            commentMock.Setup(s => s.Stamp).Returns(new Mock <IMessageImage>().Object);
            commentMock.Setup(s => s.NameIcons).Returns(new List <IMessagePart>());
            commentMock.Setup(s => s.Message).Returns(MessagePartFactory.CreateMessageText(""));
            var optionsMock     = new Mock <ICommentOptions>();
            var siteOptionsMock = new Mock <IOpenrecSiteOptions>();

            siteOptionsMock.Setup(s => s.IsAutoSetNickname).Returns(true);
            var cpMock   = new Mock <ICommentProvider>();
            var userMock = new Mock <IUser>();

            userMock.Setup(u => u.IsNgUser).Returns(isNgUser);
            var cvm = new OpenrecCommentViewModel(commentMock.Object, optionsMock.Object, siteOptionsMock.Object, cpMock.Object, false, userMock.Object);

            Assert.AreEqual(isVisible, cvm.IsVisible);
        }
        public YouTubeLiveCommentViewModel(ICommentOptions options, IYouTubeLiveSiteOptions siteOptions, CommentData commentData, ICommentProvider commentProvider, bool isFirstComment, IUser user)
            : base(options, user, commentProvider, isFirstComment)
        {
            var messageText = commentData.MessageItems.ToText();

            IsPaidMessage = commentData.IsPaidMessage;
            if (siteOptions.IsAutoSetNickname)
            {
                var nick = ExtractNickname(messageText);
                if (!string.IsNullOrEmpty(nick))
                {
                    user.Nickname = nick;
                }
            }
            NameItemsInternal = commentData.NameItems;
            user.Name         = commentData.NameItems;
            if (commentData.IsPaidMessage)
            {
                var list = new List <IMessagePart>();
                var s    = commentData.PurchaseAmount;
                if (commentData.MessageItems.Count > 0)
                {
                    s += Environment.NewLine;
                }
                list.Add(MessagePartFactory.CreateMessageText(s));
                list.AddRange(commentData.MessageItems);
                MessageItems = list;
                MessageType  = MessageType.BroadcastInfo;
            }
            else
            {
                MessageItems = commentData.MessageItems;
                MessageType  = MessageType.Comment;
            }
            Id           = commentData.Id;
            UserId       = commentData.UserId;
            Thumbnail    = commentData.Thumbnail;
            PostTime     = Tools.ParseTimestampUsec(commentData.TimestampUsec).ToLocalTime().ToString("HH:mm:ss");
            _siteOptions = siteOptions;

            Init();
        }
        private YouTubeLiveCommentViewModel CreateCvm(IUser user, string username, string message)
        {
            var options     = new Mock <ICommentOptions>();
            var siteOptions = new Mock <IYouTubeLiveSiteOptions>();

            siteOptions.Setup(s => s.IsAutoSetNickname).Returns(true);
            var commentData = new CommentData
            {
                MessageItems = new List <IMessagePart> {
                    MessagePartFactory.CreateMessageText(message)
                },
                NameItems = new List <IMessagePart> {
                    MessagePartFactory.CreateMessageText(username)
                },
            };
            var cp  = new Mock <ICommentProvider>();
            var cvm = new YouTubeLiveCommentViewModel(options.Object, siteOptions.Object, commentData, cp.Object, false, user);

            return(cvm);
        }
예제 #21
0
        private OpenrecCommentViewModel CreateCvm(IUser user, string username, string message)
        {
            var commentMock = new Mock <IOpenrecCommentData>();

            commentMock.Setup(s => s.Stamp).Returns(new Mock <IMessageImage>().Object);
            commentMock.Setup(s => s.NameIcons).Returns(new List <IMessagePart>());
            commentMock.Setup(s => s.Name).Returns(username);
            commentMock.Setup(s => s.Message).Returns(MessagePartFactory.CreateMessageText(message));
            var optionsMock = new Mock <ICommentOptions>();

            var siteOptionsMock = new Mock <IOpenrecSiteOptions>();

            siteOptionsMock.Setup(o => o.IsAutoSetNickname).Returns(true);
            var cpMock = new Mock <ICommentProvider>();

            user.IsNgUser = false;
            var cvm = new OpenrecCommentViewModel(commentMock.Object, optionsMock.Object, siteOptionsMock.Object, cpMock.Object, false, user);

            return(cvm);
        }
예제 #22
0
        public YouTubeLiveSuperchat(Test2.CommentData commentData) : base(commentData.Raw)
        {
            UserId = commentData.UserId;
            Id     = commentData.Id;

            var list = new List <IMessagePart>();
            var s    = commentData.PurchaseAmount;

            if (commentData.MessageItems.Count > 0)
            {
                s += Environment.NewLine;
            }
            list.Add(MessagePartFactory.CreateMessageText(s));
            list.AddRange(commentData.MessageItems);
            CommentItems = list;

            NameItems      = commentData.NameItems;
            PurchaseAmount = commentData.PurchaseAmount;
            UserIcon       = commentData.Thumbnail;
            PostedAt       = SitePluginCommon.Utils.UnixtimeToDateTime(commentData.TimestampUsec / (1000 * 1000));
        }
예제 #23
0
 public McvMildomCommentViewModel(MildomSitePlugin.IMildomGift gift, IMessageMetadata metadata, IMessageMethods methods, IConnectionStatus connectionStatus, IOptions options)
     : this(metadata, methods, connectionStatus, options)
 {
     _message     = gift;
     MessageItems = new List <IMessagePart>
     {
         new MessageImage
         {
             Alt    = gift.GiftName,
             Url    = gift.GiftUrl,
             Width  = 40,
             Height = 40,
         },
         MessagePartFactory.CreateMessageText($"を贈りました × {gift.Count}"),
     };
     _nameItems = MessagePartFactory.CreateMessageItems(gift.UserName);
     //MessageItems = comment.CommentItems;
     //Thumbnail = null;
     //Id = null;
     PostTime = gift.PostedAt.ToString("HH:mm:ss");
     Info     = gift.GiftName;
 }
예제 #24
0
        public void 途中でNGユーザに指定された時に非表示になるか()
        {
            var userId      = "abc";
            var commentMock = new Mock <IOpenrecCommentData>();

            commentMock.Setup(s => s.Stamp).Returns(new Mock <IMessageImage>().Object);
            commentMock.Setup(s => s.NameIcons).Returns(new List <IMessagePart>());
            commentMock.Setup(s => s.Message).Returns(MessagePartFactory.CreateMessageText(""));
            var optionsMock = new Mock <ICommentOptions>();

            var siteOptionsMock = new Mock <IOpenrecSiteOptions>();

            siteOptionsMock.Setup(s => s.IsAutoSetNickname).Returns(true);
            var cpMock = new Mock <ICommentProvider>();
            var user   = new UserTest(userId);

            user.IsNgUser = false;
            var cvm = new OpenrecCommentViewModel(commentMock.Object, optionsMock.Object, siteOptionsMock.Object, cpMock.Object, false, user);

            Assert.IsTrue(cvm.IsVisible);
            user.IsNgUser = true;
            Assert.IsFalse(cvm.IsVisible);
        }
        public WhowatchCommentViewModel(Comment comment, ICommentOptions options, IWhowatchSiteOptions siteOptions, IUser user, ICommentProvider cp, bool isFirstComment)
            : base(options, user, cp, isFirstComment)
        {
            _siteOptions = siteOptions;
            _user        = user;
            Id           = comment.Id.ToString();

            var name = comment.User.Name;

            user.Name = new List <IMessagePart> {
                MessagePartFactory.CreateMessageText(name)
            };
            var message = comment.Message;

            if (siteOptions.NeedAutoSubNickname)
            {
                var nick = ExtractNickname(message);
                if (!string.IsNullOrEmpty(nick))
                {
                    user.Nickname = nick;
                }
            }
            NameItemsInternal = new List <IMessagePart> {
                MessagePartFactory.CreateMessageText(name)
            };
            MessageItems = new List <IMessagePart> {
                MessagePartFactory.CreateMessageText(message)
            };

            var iconUrl = !string.IsNullOrEmpty(comment.User.IconUrl) ? comment.User.IconUrl : DefaultUserIconUrl;

            Thumbnail = new MessageImage {
                Url = iconUrl
            };

            Init();
        }
예제 #26
0
        public static INicoAd CreateNicoAd(IChat chat, string roomName, INicoSiteOptions siteOptions)
        {
            var jsonStr = chat.Text.Substring(8);
            var d       = Codeplex.Data.DynamicJson.Parse(jsonStr);

            if (d.version == "1")
            {
                var content = (string)d.message;
                return(new NicoAd(chat.Raw, siteOptions)
                {
                    CommentItems = new List <IMessagePart> {
                        MessagePartFactory.CreateMessageText(content)
                    },
                    NameItems = null,
                    PostTime = chat.Date.ToString("HH:mm:ss"),
                    UserId = chat.UserId,
                    RoomName = roomName,
                });
            }
            else
            {
                throw new ParseException(chat.Raw);
            }
        }
예제 #27
0
        private LineLiveMessageContext CreateMessageContext(ParseMessage.IMessage message, ParseMessage.IUser sender, string raw, bool isInitialComment)
        {
            LineLiveMessageContext messageContext;

            if (message is ParseMessage.IMessageData comment)
            {
                var user           = GetUser(sender.Id.ToString());
                var isFirstComment = _first.IsFirstComment(user.UserId);
                var m = new LineLiveComment(raw)
                {
                    Text        = comment.Message,
                    IsNgMessage = comment.IsNgMessage,
                    PostedAt    = SitePluginCommon.Utils.UnixtimeToDateTime(comment.SentAt),
                    UserIconUrl = sender.IconUrl,
                    UserId      = sender.Id,
                    DisplayName = sender.DisplayName,
                };
                var metadata = new MessageMetadata(m, _options, _siteOptions, user, this, isFirstComment)
                {
                    IsInitialComment = isInitialComment,
                    SiteContextGuid  = SiteContextGuid,
                };
                var methods = new LineLiveMessageMethods();
                messageContext = new LineLiveMessageContext(m, metadata, methods);
            }
            else if (message is ParseMessage.ILove love)
            {
                var user           = GetUser(sender.Id.ToString());
                var isFirstComment = _first.IsFirstComment(user.UserId);
                var str            = sender.DisplayName + "さんがハートを送りました!";
                var m = new LineLiveItem(raw)
                {
                    CommentItems = Common.MessagePartFactory.CreateMessageItems(str),
                    PostedAt     = SitePluginCommon.Utils.UnixtimeToDateTime(love.SentAt),
                    UserIconUrl  = sender.IconUrl,
                    UserId       = sender.Id,
                    DisplayName  = sender.DisplayName,
                };
                var metadata = new MessageMetadata(m, _options, _siteOptions, user, this, isFirstComment)
                {
                    IsInitialComment = isInitialComment,
                    SiteContextGuid  = SiteContextGuid,
                };
                var methods = new LineLiveMessageMethods();
                messageContext = new LineLiveMessageContext(m, metadata, methods);
            }
            else if (message is ParseMessage.IFollowStartData follow)
            {
                var user           = GetUser(sender.Id.ToString());
                var isFirstComment = _first.IsFirstComment(user.UserId);
                var msg            = sender.DisplayName + "さんがフォローしました!";
                var m = new LineLiveItem(raw)
                {
                    CommentItems = Common.MessagePartFactory.CreateMessageItems(msg),
                    PostedAt     = SitePluginCommon.Utils.UnixtimeToDateTime(follow.FollowedAt),
                    UserIconUrl  = sender.IconUrl,
                    UserId       = sender.Id,
                    DisplayName  = sender.DisplayName,
                };
                var metadata = new MessageMetadata(m, _options, _siteOptions, user, this, isFirstComment)
                {
                    IsInitialComment = isInitialComment,
                    SiteContextGuid  = SiteContextGuid,
                };
                var methods = new LineLiveMessageMethods();
                messageContext = new LineLiveMessageContext(m, metadata, methods);
            }
            else if (message is ParseMessage.IGiftMessage gift)
            {
                var user           = GetUser(sender.Id.ToString());
                var isFirstComment = _first.IsFirstComment(user.UserId);
                if (_loveIconUrlDict.ContainsKey(gift.ItemId))
                {
                    gift.Url = _loveIconUrlDict[gift.ItemId];
                }
                else
                {
                    gift.Url = "";
                }
                List <IMessagePart> messageItems;
                if (gift.ItemId == "limited-love-gift" || string.IsNullOrEmpty(gift.Url))
                {
                    //{"type":"giftMessage","data":{"message":"","type":"LOVE","itemId":"limited-love-gift","quantity":1,"displayName":"limited.love.gift.item","sender":{"id":2903515,"hashedId":"715i4MKqyv","displayName":"上杉The Times","iconUrl":"https://scdn.line-apps.com/obs/0hmNs42D-0MmFOTR9H8JtNNnYQNBY3YzEpNmkpRHdEbQI3LnYxIX97UGIdaVdjKXVjd3ktVGNEP1VjenU1ew/f64x64","hashedIconId":"0hmNs42D-0MmFOTR9H8JtNNnYQNBY3YzEpNmkpRHdEbQI3LnYxIX97UGIdaVdjKXVjd3ktVGNEP1VjenU1ew","isGuest":false,"isBlocked":false},"isNGGift":false,"sentAt":1531445716,"key":"2426265.29035150000000000000","blockedByCms":false}}
                    var msg = sender.DisplayName + "さんがハートで応援ポイントを送りました!";
                    messageItems = new List <IMessagePart> {
                        MessagePartFactory.CreateMessageText(msg)
                    };
                }
                else
                {
                    var msg = sender.DisplayName + "さんが" + gift.Quantity + "コインプレゼントしました!";
                    messageItems = new List <IMessagePart> {
                        MessagePartFactory.CreateMessageText(msg), new MessageImage {
                            Url = gift.Url
                        }
                    };
                }

                var m = new LineLiveItem(raw)
                {
                    CommentItems = messageItems,
                    PostedAt     = SitePluginCommon.Utils.UnixtimeToDateTime(gift.SentAt),
                    UserIconUrl  = sender.IconUrl,
                    UserId       = sender.Id,
                    DisplayName  = sender.DisplayName,
                };
                var metadata = new MessageMetadata(m, _options, _siteOptions, user, this, isFirstComment)
                {
                    IsInitialComment = isInitialComment,
                    SiteContextGuid  = SiteContextGuid,
                };
                var methods = new LineLiveMessageMethods();
                messageContext = new LineLiveMessageContext(m, metadata, methods);
            }
            else
            {
                messageContext = null;
            }
            return(messageContext);
        }
예제 #28
0
        private OpenrecMessageContext CreateMessageContext(Tools.IComment comment, IOpenrecCommentData commentData, bool isInitialComment)
        {
            var userId = commentData.UserId;
            var user   = GetUser(userId) as IUser2;

            if (!_userDict.ContainsKey(userId))
            {
                _userDict.AddOrUpdate(user.UserId, user, (id, u) => u);
            }
            bool isFirstComment;

            if (_userCommentCountDict.ContainsKey(userId))
            {
                _userCommentCountDict[userId]++;
                isFirstComment = false;
            }
            else
            {
                _userCommentCountDict.Add(userId, 1);
                isFirstComment = true;
            }

            var nameItems = new List <IMessagePart>();

            nameItems.Add(MessagePartFactory.CreateMessageText(commentData.Name));
            nameItems.AddRange(commentData.NameIcons);
            user.Name = nameItems;

            var messageItems = new List <IMessagePart>();

            if (commentData.Message != null)
            {
                messageItems.Add(MessagePartFactory.CreateMessageText(commentData.Message));
            }

            OpenrecMessageContext messageContext = null;
            IOpenrecMessage       message;

            if (commentData.IsYell)
            {
                message = new OpenrecYell("")
                {
                    YellPoints = commentData.YellPoints,
                    Id         = commentData.Id,
                    NameItems  = nameItems,
                    PostTime   = commentData.PostTime,
                    UserId     = commentData.UserId,
                    Message    = commentData.Message,
                };
            }
            else if (commentData.Stamp != null)
            {
                message = new OpenrecStamp("")
                {
                    Stamp     = commentData.Stamp,
                    Id        = commentData.Id,
                    NameItems = nameItems,
                    PostTime  = commentData.PostTime,
                    UserId    = commentData.UserId,
                };
            }
            else
            {
                message = new OpenrecComment("")
                {
                    MessageItems = messageItems,
                    Id           = commentData.Id,
                    NameItems    = nameItems,
                    PostTime     = commentData.PostTime,
                    UserId       = commentData.UserId,
                };
            }
            var metadata = new MessageMetadata(message, _options, _siteOptions, user, this, isFirstComment)
            {
                IsInitialComment = isInitialComment,
                SiteContextGuid  = SiteContextGuid,
            };
            var methods = new OpenrecMessageMethods();

            messageContext = new OpenrecMessageContext(message, metadata, methods);
            return(messageContext);
        }
예제 #29
0
        public static CommentData ParseLiveChatTextMessageRenderer(dynamic ren)
        {
            var commentData = new CommentData
            {
                UserId        = ren.authorExternalChannelId,
                TimestampUsec = long.Parse((string)ren.timestampUsec),
                Id            = ren.id
            };

            //authorPhoto
            {
                var thumbnail   = ren.authorPhoto.thumbnails[0];
                var url         = thumbnail.url;
                var width       = (int)thumbnail.width;
                var height      = (int)thumbnail.height;
                var authorPhoto = new MessageImage {
                    Url = url, Width = width, Height = height
                };
                commentData.Thumbnail = authorPhoto;
            }
            //message
            {
                var messageItems = new List <IMessagePart>();
                commentData.MessageItems = messageItems;
                if (ren.IsDefined("message"))//PaidMessageではコメント無しも可能
                {
                    if (ren.message.IsDefined("runs"))
                    {
                        foreach (var r in ren.message.runs)
                        {
                            if (r.IsDefined("text"))
                            {
                                var text = r.text;
                                messageItems.Add(MessagePartFactory.CreateMessageText(text));
                            }
                            else if (r.IsDefined("emoji"))
                            {
                                var emoji       = r.emoji;
                                var thumbnail   = emoji.image.thumbnails[0];
                                var emojiUrl    = thumbnail.url;
                                var emojiWidth  = (int)thumbnail.width;
                                var emojiHeight = (int)thumbnail.height;
                                var emojiAlt    = emoji.image.accessibility.accessibilityData.label;
                                messageItems.Add(new MessageImage {
                                    Url = emojiUrl, Alt = emojiAlt, Height = emojiHeight, Width = emojiWidth
                                });
                            }
                            else
                            {
                                throw new ParseException();
                            }
                        }
                    }
                    else if (ren.message.IsDefined("simpleText"))
                    {
                        var text = ren.message.simpleText;
                        messageItems.Add(MessagePartFactory.CreateMessageText(text));
                    }
                    else
                    {
                        throw new ParseException();
                    }
                }
            }
            //name
            {
                var nameItems = new List <IMessagePart>();
                commentData.NameItems = nameItems;
                nameItems.Add(MessagePartFactory.CreateMessageText(ren.authorName.simpleText));
                if (ren.IsDefined("authorBadges"))
                {
                    foreach (var badge in ren.authorBadges)
                    {
                        if (badge.liveChatAuthorBadgeRenderer.IsDefined("customThumbnail"))
                        {
                            var url = badge.liveChatAuthorBadgeRenderer.customThumbnail.thumbnails[0].url;
                            var alt = badge.liveChatAuthorBadgeRenderer.tooltip;
                            nameItems.Add(new MessageImage {
                                Url = url, Alt = alt, Width = 16, Height = 16
                            });
                        }
                        else if (badge.liveChatAuthorBadgeRenderer.IsDefined("icon"))
                        {
                            var iconType = badge.liveChatAuthorBadgeRenderer.icon.iconType;
                            var alt      = badge.liveChatAuthorBadgeRenderer.tooltip;
                        }
                        else
                        {
                            throw new ParseException();
                        }
                    }
                }
            }
            return(commentData);
        }
예제 #30
0
        public static List <IMessagePart> GetMessageItems(string message, string emotes)
        {
            if (string.IsNullOrEmpty(emotes))
            {
                return(new List <IMessagePart> {
                    MessagePartFactory.CreateMessageText(message)
                });
            }
            var emote     = emotes.Split('/');
            var emoteList = new List <EmotContext>();

            foreach (var emo in emote)
            {
                var r  = emo.IndexOf(':');
                var id = emo.Substring(0, r);

                var sub   = emo.Substring(r + 1);
                var poses = sub.Split(',');
                foreach (var pos in poses)
                {
                    var po_s = pos.Split('-');

                    var startAt = int.Parse(po_s[0]);
                    var endAt   = int.Parse(po_s[1]);

                    var alt = message.Substring(startAt, endAt - startAt + 1);

                    var context = new EmotContext
                    {
                        Id      = id,
                        StartAt = startAt,
                        EndAt   = endAt,
                        Alt     = alt
                    };
                    emoteList.Add(context);
                }
            }

            //emotesに該当しない部分の抜き出し?
            //EmoteContextのStartAt-EndAtどうしに重複は無いという前提で。
            var starts = emoteList.Select(e => e.StartAt).ToList();

            starts.Sort();
            var ends = emoteList.Select(e => e.EndAt).ToList();

            ends.Sort();

            var messageContexts = new List <MessageContext>();
            int n = 0;

            for (; starts.Count > 0 && ends.Count > 0;)
            {
                var lowestStart = starts[0];
                var s1          = message.Substring(n, lowestStart - n);
                if (!string.IsNullOrEmpty(s1))
                {
                    messageContexts.Add(new MessageContext {
                        Message = s1, Emot = null
                    });
                }
                n += s1.Length;
                var lowestEnd = ends[0];
                var s2        = message.Substring(n, lowestEnd - n + 1);

                var emot = emoteList.Where(e => e.StartAt == lowestStart).First();
                if (!string.IsNullOrEmpty(s2))//ここが""は無いだろう。
                {
                    messageContexts.Add(new MessageContext {
                        Message = s2, Emot = emot
                    });
                }
                n += s2.Length;
                starts.Remove(lowestStart);
                ends.Remove(lowestEnd);
            }
            var s3 = message.Substring(n);

            if (!string.IsNullOrEmpty(s3))
            {
                messageContexts.Add(new MessageContext {
                    Message = s3
                });
            }

            var actual = new List <IMessagePart>();

            foreach (var m in messageContexts)
            {
                if (m.Emot == null)
                {
                    actual.Add(MessagePartFactory.CreateMessageText(m.Message));
                }
                else
                {
                    actual.Add(new MessageImage {
                        Url = $"https://static-cdn.jtvnw.net/emoticons/v1/{m.Emot.Id}/1.0", Alt = m.Message, Height = 28, Width = 28
                    });
                }
            }
            return(actual);
        }