예제 #1
0
        internal override async Task FeedAsync()
        {
            using (var state = new ContinuationSync <long?>($"sessionsstate-{Options.PId}"))
            {
                //Получение ленты событий. Если не задать курсор (continuationToken) то потребелние событий будет начинаться с перого события.
                var feed = Sclm.GetSessionFeed(Options.PId,  //Указываем идентификатор презентации
                                               Options.UId,  // если не null то будет отфильтровано по пользователю, иначе все события ленты этой презентации
                                               SetSections(Options.Sections),
                                               state.Token); // токен продолжения, позиция курсора в ленте.

                //События ленты потребляются постранично. При получении страницы вместе с ней приходит continuationToken. По этому токену можно получить слудющую страницу.
                //Сохраняя этот токен, возможно прожолжить обход ленты в следующий раз если в данный момент в ленте 0 событий или произошел краш.
                foreach (var page in feed)
                {
                    //Обработка страницы параллельно с ограничением в 10 потоков
                    await page.Result.ThrottleAsync(async session =>
                    {
                        Logger.LogInformation(
                            $"SESSION: {session.SessionId}, Data: {new DateTime(session.LocalTicks):dd.MM.yyyy HH:mm:ss}, Slides: {session.SlidesCount}, Duration: {session.Duration}, User: {session.UserId}, Presentation: {session.PresentationId}, Address: {session.Address}");

                        //Получение визита по идентификатору сессии. Визит включает: сессию, список слайдов и собранные в один объект кастомные события.
                        var visit  = await Sclm.GetVisit <PresentationData>(session.SessionId);
                        var slides = visit.Slides;        // стэк показа слайдов
                        var data   = visit.CustomEvents;  // данные из презентации агрегированные в один обхект

                        visit.SaveTo("Data/Sessions");    // сохранение в хранилище))
                    }, 1);                                // сколько одновременно обрабатывать

                    state.Token = page.ContinuationToken; // сохранение токена
                }
            }
        }
예제 #2
0
        internal override async Task FeedAsync()
        {
            using var state = new ContinuationSync <long?>($"slidesstate-{Options.PId}");
            var feed = Sclm.GetSlidesFeed(Options.PId, Options.UId, SetSections(Options.Sections), state.Token);

            foreach (var page in feed)
            {
                await page.Result.ThrottleAsync(slide =>
                {
                    Logger.LogInformation(
                        $"SLIDE: {slide.SlideId}, SlideName: {slide.SlideName}, Data: {new DateTime(slide.LocalTicks):dd.MM.yyyy HH:mm:ss}, Duration: {slide.Duration}, SessionId: {slide.SessionId}, User: {slide.UserId}, Presentation: {slide.PresentationId}");

                    slide.SaveTo("Data/Slides");
                    return(Task.CompletedTask);
                }, 10);

                state.Token = page.ContinuationToken;
            }
        }
예제 #3
0
        internal override async Task FeedAsync()
        {
            using var state = new ContinuationSync <long?>($"csstate-{Options.PId}");
            var feed = Sclm.GetCustomEventsFeed(Options.PId, Options.UId, SetSections(Options.Sections), state.Token);

            foreach (var page in feed)
            {
                await page.Result.ThrottleAsync(customEvent =>
                {
                    Logger.LogInformation(
                        $"CUSTOM EVENT: {customEvent.Id}, Data: {new DateTime(customEvent.LocalTicks):dd.MM.yyyy HH:mm:ss}, PresentationId: {customEvent.PresentationId}, SessionId: {customEvent.SessionId}, User: {customEvent.UserId}");

                    customEvent.SaveTo("Data/CustomEvents");
                    return(Task.CompletedTask);
                }, 10);

                state.Token = page.ContinuationToken;
            }
        }