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)
            {
                ChatNo   = chat.No,
                Text     = chat.Text,
                Id       = id,
                Is184    = Tools.Is184UserId(chat.UserId),
                PostedAt = chat.Date,
                RoomName = roomName,
                UserId   = chat.UserId,
            };

            return(message);
        }
Пример #2
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);
        }
        private void ProcessChatMessage(Chat.IChatMessage message)
        {
            switch (message)
            {
            case Chat.ChatMessage chat:
            {
                if (_isFirstConnection == false && _isInitialCommentsReceiving == true)
                {
                    //再接続時は初期コメントを無視する
                    return;
                }
                var  userId = chat.UserId;
                var  user   = GetUser(userId);
                bool isFirstComment;
                if (_userCommentCountDict.ContainsKey(userId))
                {
                    _userCommentCountDict[userId]++;
                    isFirstComment = false;
                }
                else
                {
                    _userCommentCountDict.AddOrUpdate(userId, 1, (s, n) => n);
                    isFirstComment = true;
                }
                //var comment = await Tools.CreateNicoComment(chat, user, _siteOptions, roomName, async userid => await API.GetUserInfo(_dataSource, userid), _logger);
                INicoMessage         comment;
                INicoMessageMetadata metadata;
                if (IsAd(chat))
                {
                    ///nicoad {"totalAdPoint":215500,"message":"シュガーさんが1700ptニコニ広告しました","version":"1"}
                    var     adJson = chat.Content.Replace("/nicoad", "");
                    dynamic d      = JsonConvert.DeserializeObject(adJson);
                    if ((string)d.version != "1")
                    {
                        //未対応
                        return;
                    }
                    var content = (string)d.message;
                    var ad      = new NicoAd(chat.Raw)
                    {
                        PostedAt = Common.UnixTimeConverter.FromUnixTime(chat.Date),
                        UserId   = userId,
                        Text     = content,
                    };
                    comment  = ad;
                    metadata = new AdMessageMetadata(ad, _options, _siteOptions)
                    {
                        IsInitialComment = _isInitialCommentsReceiving,
                        SiteContextGuid  = SiteContextGuid,
                    };
                }
                else if (IsGift(chat))
                {
                    var match = Regex.Match(chat.Content, "/gift (\\S+) (\\d+) \"(\\S+)\" (\\d+) \"(\\S+)\" \"(\\S+)\" (\\d+)");
                    if (!match.Success)
                    {
                        return;
                    }
                    var giftId    = match.Groups[1].Value;
                    var userIdp   = match.Groups[2].Value;      //ギフトを投げた人。userId == "900000000"
                    var username  = match.Groups[3].Value;
                    var point     = match.Groups[4].Value;
                    var what      = match.Groups[5].Value;
                    var itemName  = match.Groups[6].Value;
                    var itemCount = match.Groups[7].Value;        //アイテムの個数?ギフト貢献n位?
                    var text      = $"{username}さんがギフト「{itemName}({point}pt)」を贈りました";
                    var gift      = new NicoGift(chat.Raw)
                    {
                        Text      = text,
                        PostedAt  = Common.UnixTimeConverter.FromUnixTime(chat.Date),
                        UserId    = userIdp,
                        NameItems = Common.MessagePartFactory.CreateMessageItems(username),
                    };
                    comment  = gift;
                    metadata = new ItemMessageMetadata(gift, _options, _siteOptions)
                    {
                        IsInitialComment = _isInitialCommentsReceiving,
                        SiteContextGuid  = SiteContextGuid,
                    };
                }
                else if (IsSpi(chat))
                {
                    var spi = new NicoSpi(chat.Raw)
                    {
                        Text     = chat.Content,
                        PostedAt = Common.UnixTimeConverter.FromUnixTime(chat.Date),
                        UserId   = chat.UserId,
                    };
                    comment  = spi;
                    metadata = new SpiMessageMetadata(spi, _options, _siteOptions)
                    {
                        IsInitialComment = _isInitialCommentsReceiving,
                        SiteContextGuid  = SiteContextGuid,
                    };
                }
                else if (IsEmotion(chat))
                {
                    var content = chat.Content.Substring("/emotion ".Length);
                    var abc     = new NicoEmotion("")
                    {
                        ChatNo    = chat.No,
                        Anonymity = chat.Anonymity,
                        PostedAt  = Common.UnixTimeConverter.FromUnixTime(chat.Date),
                        Content   = content,
                        UserId    = chat.UserId,
                    };
                    comment  = abc;
                    metadata = new EmotionMessageMetadata(abc, _options, _siteOptions, user, this)
                    {
                        IsInitialComment = _isInitialCommentsReceiving,
                        SiteContextGuid  = SiteContextGuid,
                    };
                }
                else if (IsInfo(chat))
                {
                    var match = Regex.Match(chat.Content, "^/info (?<no>\\d+) (?<content>.+)$", RegexOptions.Singleline);
                    if (!match.Success)
                    {
                        throw new ParseException(chat.Raw);
                    }
                    else
                    {
                        var no      = int.Parse(match.Groups["no"].Value);
                        var content = match.Groups["content"].Value;
                        var info    = new NicoInfo(chat.Raw)
                        {
                            Text     = content,
                            PostedAt = Common.UnixTimeConverter.FromUnixTime(chat.Date),
                            UserId   = chat.UserId,
                            No       = no,
                        };
                        comment  = info;
                        metadata = new InfoMessageMetadata(info, _options, _siteOptions)
                        {
                            IsInitialComment = _isInitialCommentsReceiving,
                            SiteContextGuid  = SiteContextGuid,
                        };
                    }
                }
                else
                {
                    if (IsDisconnect(chat))        //NicoCommentではなく専用のクラスを作っても良いかも。
                    {
                        _chatProvider?.Disconnect();
                    }
                    var abc = new NicoComment("")
                    {
                        ChatNo   = chat.No,
                        Id       = chat.No.ToString(),
                        Is184    = chat.Anonymity == 1,
                        PostedAt = Common.UnixTimeConverter.FromUnixTime(chat.Date),
                        Text     = chat.Content,
                        UserId   = chat.UserId,
                        UserName = "",
                    };
                    comment  = abc;
                    metadata = new CommentMessageMetadata(abc, _options, _siteOptions, user, this, isFirstComment)
                    {
                        IsInitialComment = _isInitialCommentsReceiving,
                        SiteContextGuid  = SiteContextGuid,
                    };
                }


                var context = new NicoMessageContext(comment, metadata, new NicoMessageMethods());
                RaiseMessageReceived(context);
            }
            break;

            case Chat.Ping ping:
                if (ping.Content == "rs:0")
                {
                    _isInitialCommentsReceiving = true;
                }
                else if (ping.Content == "rf:0")
                {
                    _isInitialCommentsReceiving = false;
                }
                break;

            case Chat.UnknownMessage unknown:
                _logger.LogException(new ParseException(unknown.Raw));
                break;

            default:
                break;
            }
        }