Example #1
0
        private static async ValueTask GetLiveStatus(SoraApi soraApi, long biliUser, List <long> groupId,
                                                     SubscriptionDBHelper dbHelper)
        {
            LiveInfo      live;
            UserSpaceInfo biliUserInfo;

            //获取数据
            try
            {
                biliUserInfo = UserApis.GetLiveRoomInfo(biliUser);
                live         = LiveAPIs.GetLiveRoomInfo(biliUserInfo.LiveRoomInfo.ShortId);
            }
            catch (Exception e)
            {
                Log.Error("获取直播状态时发生错误", Log.ErrorLogBuilder(e));
                return;
            }

            //需要更新数据的群
            Dictionary <long, LiveStatusType> updateDict = groupId
                                                           .Where(gid => dbHelper.GetLastLiveStatus(gid, biliUser) !=
                                                                  live.LiveStatus)
                                                           .ToDictionary(gid => gid, _ => live.LiveStatus);

            //更新数据库
            foreach (var status in updateDict)
            {
                if (!dbHelper.UpdateLiveStatus(status.Key, biliUser, live.LiveStatus))
                {
                    Log.Error("Database", "更新直播订阅数据失败");
                }
            }

            //需要消息提示的群
            var targetGroup = updateDict.Where(group => group.Value == LiveStatusType.Online)
                              .Select(group => group.Key)
                              .ToList();

            if (targetGroup.Count == 0)
            {
                return;
            }
            //构建提示消息
            MessageBody message = $"{biliUserInfo.Name} 正在直播!\r\n{biliUserInfo.LiveRoomInfo.Title}" +
                                  CQCodes.CQImage(biliUserInfo.LiveRoomInfo.CoverUrl) +
                                  $"直播间地址:{biliUserInfo.LiveRoomInfo.LiveUrl}";

            foreach (var gid in targetGroup)
            {
                Log.Info("直播订阅", $"获取到{biliUserInfo.Name}正在直播,向群[{gid}]发送动态信息");
                await soraApi.SendGroupMessage(gid, message);
            }
        }
Example #2
0
        public bool ParseUri(Uri uri)
        {
            try
            {
                if (uri == null ||
                    !uri.IsAbsoluteUri ||
                    uri.Scheme != Name ||
                    uri.Host != "app")
                {
                    return(false);
                }

                var uriString      = uri.OriginalString;
                var pathStartIndex = Name.Length + 6;

                if (uriString.Length < pathStartIndex + 2)
                {
                    return(false);
                }

                var version            = 1U;
                var versionDivideIndex = uriString
                                         .IndexOf('/', pathStartIndex + 1);

                if (versionDivideIndex != -1 &&
                    uriString[pathStartIndex + 1] == 'v' &&
                    uriString.Length > pathStartIndex + 2)
                {
                    var versionString = uriString.Substring(
                        pathStartIndex + 2,
                        versionDivideIndex - pathStartIndex - 2);

                    if (uint.TryParse(versionString, out version))
                    {
                        uriString = uriString.Remove(
                            pathStartIndex,
                            versionString.Length + 2);
                        uri = new Uri(
                            uriString, UriKind.Absolute);
                    }
                }

                if (version == 0)
                {
                    version = 1;
                }

                if (!UserApis.TryGetValue(version, out var api))
                {
                    return(false);
                }

                return(api?
                       .ParseUri(uri) ?? false);
            }
            catch (Exception ex)
            {
                LogManager.Default.Error(ex,
                                         $"User protocol schema[Name = {Name}] parse uri error");

                return(false);
            }
        }