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"); }
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, }); }
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); }
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); }
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); }
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); }
//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; }
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); } }
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); }
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); }
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(); }
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); }
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); }
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, }); }
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); }
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); }
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)); }
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; }
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(); }
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); } }
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); }
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); }
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); }
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); }