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; // сохранение токена } } }
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; } }
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; } }