public BaseResponse <List <TimelineResponse> > GetLessonTimeline(int id, int page, int size) { BaseResponse <List <TimelineResponse> > rsp = new BaseResponse <List <TimelineResponse> >(); try { var tl = mContext.timeline.Where(p => p.lessonId == id).OrderByDescending(p => p.id).Skip((page - 1) * size).Take(size).ToList(); if (tl.Count > 0) { List <TimelineResponse> content = new List <TimelineResponse>(); foreach (Timeline t in tl) { try { TimelineResponse tr = new TimelineResponse(t); content.Add(tr); } catch { continue; } } rsp.setContent(content); } } catch (Exception e) { rsp.setFailed(e.Message); } return(rsp); }
public override async Task GetTimeline(TimelineRequest request, IServerStreamWriter <TimelineResponse> responseStream, ServerCallContext context) { var timestampRanges = new Dictionary <int, TimestampRange>(); // 요청받은 기간 내의 activity만 가져온다. var activities = from activity in _db.GetActivities() where activity.Time >= request.Range.Start.ToDateTime() && activity.Time <= request.Range.End.ToDateTime() where activity.Action == ActionType.Active || activity.Action == ActionType.Idle || activity.Action == ActionType.Blur || activity.Action == ActionType.Focus orderby activity.Time select activity; Application applicationNow = null; await foreach (var activity in activities) { var application = await _db.GetAsync <Application>(activity.ApplicationId); switch (activity.Action) { case ActionType.Focus: applicationNow = application; break; case ActionType.Active: if (applicationNow == null) { applicationNow = application; } if (!timestampRanges.ContainsKey(applicationNow.Id)) { timestampRanges[applicationNow.Id] = new TimestampRange() { Start = Timestamp.FromDateTimeOffset(activity.Time) }; } break; case ActionType.Blur: case ActionType.Idle: if (timestampRanges.ContainsKey(applicationNow.Id)) { timestampRanges[applicationNow.Id].End = Timestamp.FromDateTimeOffset(activity.Time); var response = new TimelineResponse() { Application = applicationNow.ToRpc(), Range = timestampRanges[applicationNow.Id] }; timestampRanges.Remove(applicationNow.Id); await responseStream.WriteAsync(response); } break; default: continue; } } }
public static async Task <TimelineResponse> GetCustomTimeline(sc2dsstatsContext context, TimelineRequest request) { if (request.Step < 3) { request.Step = 3; } if (request.smaK < 3) { request.smaK = 3; } var lresults = await GetTimelineData(request, context); TimelineResponse response = new TimelineResponse() { Count = lresults.Select(s => s.Id).Distinct().Count(), Interest = request.Interest, Versus = request.Versus, AvgDuration = lresults.Count == 0 ? 0 : (int)(lresults.Sum(s => s.Duration) / (double)lresults.Count), Items = new List <DsResponseItem>() }; DateTime _dateTime = request.StartTime; while (_dateTime < request.EndTime) { DateTime dateTime = _dateTime.AddMonths(1); var stepResults = lresults.Where(x => x.GameTime >= _dateTime && x.GameTime < dateTime).ToList(); response.Items.Add(new TimelineResponseItem() { Label = $"{_dateTime.ToString("yyyy-MM-dd")} ({stepResults.Count})", Count = stepResults.Count, Wins = stepResults.Where(x => x.Win == true).Count() }); _dateTime = dateTime; } if (response.Items.Any() && response.Items.Last().Count < 10) { response.Items.RemoveAt(response.Items.Count - 1); } var sma = new SimpleMovingAverage(request.smaK); response.SmaData = new List <double>(); response.SmaData = GetNiceLineData(response.Items.Select(s => s.Count == 0 ? 0 : ((double)s.Wins * 100.0 / (double)s.Count)), request.smaK); return(response); }
static async Task Main2() { try { string url = "http://hatenaproxy.azurewebsites.net/api/timeline?user="******"kobake"; // 通信 HttpClient client = new HttpClient(); client.DefaultRequestHeaders.TryAddWithoutValidation("User-Agent", "Mozilla/5.0 (Windows NT 6.2; WOW64; rv:19.0) Gecko/20100101 Firefox/19.0"); client.DefaultRequestHeaders.TryAddWithoutValidation("Accept-Charset", "UTF-8"); string json = await client.GetStringAsync(url); /* * WebClient client = new WebClient(); * client.Encoding = Encoding.UTF8; * client.Headers.Add("Accept-Charset", "UTF-8"); * string json = await client.DownloadStringTaskAsync(url); */ /* * string json = File.ReadAllText(@"C:\Projects\Hatenatter\_gomi\sample.json"); */ Console.WriteLine(json); // パース TimelineResponse response = JsonConvert.DeserializeObject <TimelineResponse>(json); if (!string.IsNullOrEmpty(response.Error)) { throw new Exception(response.Error); } if (response.Result != "OK") { throw new Exception("不明なエラー"); } // 適用 Console.WriteLine(response.Result); } catch (Exception ex) { Console.WriteLine("タイムライン取得時にエラーが発生しました: " + ex.Message); } }
public static ConfigBase GetChartConfig(TimelineResponse response) { var config = GetLineConfig(); config.Options.Title.Text = response.Interest + (response.Versus == "ALL" ? "" : " vs " + response.Versus); List <double> pointData = new List <double>(); foreach (var item in response.Items) { config.Data.Labels.Add(item.Label); pointData.Add(item.Count == 0 ? 0 : Math.Round((double)item.Wins * 100.0 / (double)item.Count, 2)); } var pointDataset = new LineDataset <double>(pointData) { Label = "", BorderColor = DSData.CMDRcolor[response.Interest], BorderWidth = 1, PointRadius = 2, PointHoverRadius = 10, ShowLine = false, Fill = false }; var timelineDataset = new LineDataset <double>(response.SmaData) { Label = response.Interest, BorderColor = DSData.CMDRcolor[response.Interest], BorderWidth = 3, PointRadius = 1, PointHoverRadius = 1, ShowLine = true, Fill = false }; config.Data.Datasets.Add(pointDataset); config.Data.Datasets.Add(timelineDataset); return(config); }
public async Task <IHttpActionResult> Get([FromUri] TimelineRequest request) { if (request == null) { throw new ArgumentNullException("request"); } if (string.IsNullOrEmpty(request.UserId)) { throw new ArgumentException( "TimelineRequest.UserId is required."); } var userTask = request.TrimUser ? Task.FromResult((UserModel)null) : this.userService.GetAsync(request.UserId); var statusListParams = new StatusListParamsModel { SavedByUserId = this.claimsHelper.GetUserId(), CreatedByUserId = request.UserId, MaxId = request.MaxId, Count = request.Count }; var statusesTask = request.SavedOnly ? this.statusService.GetAllSavedAsync(statusListParams) : this.statusService.GetUserTimelineAsync(statusListParams); await Task.WhenAll(userTask, statusesTask); var response = new TimelineResponse { User = userTask.Result, Statuses = statusesTask.Result }; return(Ok(response)); }
async Task Refresh() { // ログインしてない場合は何もしない if (string.IsNullOrEmpty(m_myInfo.Id)) { Debug.WriteLine("Error: required to login"); return; } // 多重処理防止 if (m_refreshing) { return; } m_refreshing = true; await Task.Delay(100); // ローディング表示 var config = new ProgressDialogConfig() .SetTitle("Load Timeline ...") .SetIsDeterministic(false) .SetMaskType(MaskType.Black); string error = ""; using (UserDialogs.Instance.Progress(config)) { await Task.Delay(100); try { // 通信 HttpClient client = new HttpClient(); client.DefaultRequestHeaders.TryAddWithoutValidation("User-Agent", "Mozilla/5.0 (Windows NT 6.2; WOW64; rv:19.0) Gecko/20100101 Firefox/19.0"); client.DefaultRequestHeaders.TryAddWithoutValidation("Accept-Charset", "UTF-8"); string url = "http://hatenaproxy.azurewebsites.net/api/timeline?user="******"OK") { throw new Exception("不明なエラー"); } // 適用 m_list.Reset(response.Timeline); } catch (Exception ex) { error = ex.Message; } } // using 抜けたらローディング表示消える // 処理完了印 m_refreshing = false; // エラーが発生していたら表示 if (error != "") { await DisplayAlert("エラー", "タイムライン取得時にエラーが発生しました\n\n" + error, "OK"); } }
/// <summary> /// Main extraction method. /// </summary> /// <typeparam name="T"></typeparam> /// <param name="initialUrl">Initial url.</param> /// <param name="nextPageUrlGenerator">Next page url generator.</param> /// <param name="onItemsExtracted">Action which will be called each time when a new part of items are extracted.</param> /// <param name="canExecute">Uses to manage the execution process. Setup it as you need, to control when you want to stop extraction.</param> /// <param name="executionRate"></param> /// <param name="token"></param> /// <returns></returns> public virtual async Task ExtractAsync(string initialUrl, Func <NextPageMeta, string> nextPageUrlGenerator, Action <IEnumerable <T> > onItemsExtracted, Func <bool> canExecute, TimeSpan executionRate, CancellationToken token) { // Define vars TimelineResponse response = null; long minResult = 0; string url = initialUrl; string payload; List <T> items; // Start execution while ((payload = await ExecuteHttpRequestAsync(url)) != null) { // Check cancellation if (token.IsCancellationRequested) { token.ThrowIfCancellationRequested(); } // Deserialize data try { response = JsonConvert.DeserializeObject <TimelineResponse>(payload); } catch (JsonReaderException ex) { RaiseJsonError(ex); } // Check response if (response == null) { break; } // Parse items items = TwitterItemParser.Parse(response.ItemsHtml); if (items.Count == 0) { break; } // Push tweets to external code onItemsExtracted(items); // Check if we should to stop the extractor if (!canExecute()) { break; } // Gather data for generate next page url if (minResult == 0) { minResult = items.First().Id; } long maxTweet = items.Last().Id; if (minResult != maxTweet) { // Wait for some time await Task.Delay(executionRate, token); url = nextPageUrlGenerator(new NextPageMeta(minResult, maxTweet)); } else { break; } } }
public static TimelineResponse GetTimeline(TimelineRequest request, List <CmdrStats> cmdrstats) { if (request.Step < 3) { request.Step = 3; } if (request.smaK < 3) { request.smaK = 3; } var stats = GetTimeStats(request, cmdrstats); int tcount = stats.Sum(s => s.count); TimelineResponse response = new TimelineResponse() { Interest = request.Interest, Count = request.Player ? tcount : tcount / 6, Versus = request.Versus, AvgDuration = tcount == 0 ? 0 : (int)(stats.Sum(s => s.duration) / tcount), Items = new List <DsResponseItem>() }; DateTime requestTime = request.StartTime; while (requestTime < request.EndTime) { var timeResults = stats.Where(f => f.year == requestTime.Year && f.month == requestTime.Month && f.RACE == (byte)DSData.GetCommander(request.Interest)); if (!timeResults.Any()) { response.Items.Add(new TimelineResponseItem() { Label = $"{requestTime.ToString("yyyy-MM")} (0)", Count = 0, Wins = 0 }); } else { int ccount = timeResults.Sum(s => s.count); response.Items.Add(new TimelineResponseItem() { Label = $"{requestTime.ToString("yyyy-MM")} ({ccount})", Count = ccount, Wins = timeResults.Sum(s => s.wins) }); } requestTime = requestTime.AddMonths(1); } if (response.Items.Any() && response.Items.Last().Count < 10) { response.Items.RemoveAt(response.Items.Count - 1); } var sma = new SimpleMovingAverage(request.smaK); response.SmaData = new List <double>(); response.SmaData = GetNiceLineData(response.Items.Select(s => s.Count == 0 ? 0 : ((double)s.Wins * 100.0 / (double)s.Count)), request.smaK); return(response); }
public static async Task <TimelineResponse> GetDuration(sc2dsstatsContext context, DsRequest request) { var replays = ReplayFilter.Filter(context, request); replays = replays.Where(x => x.Gametime >= request.StartTime); if (request.EndTime != DateTime.Today) { replays = replays.Where(x => x.Gametime <= request.EndTime); } var results = request.Player switch { true => from r in replays from p in r.Dsplayers where p.Race == (byte)DSData.GetCommander(request.Interest) && p.isPlayer select new { r.Id, r.Duration, p.Win }, false => from r in replays from p in r.Dsplayers where p.Race == (byte)DSData.GetCommander(request.Interest) select new { r.Id, r.Duration, p.Win } }; var lresults = await results.ToListAsync(); TimelineResponse response = new TimelineResponse() { Interest = request.Interest, Count = lresults.Select(s => s.Id).Distinct().Count(), AvgDuration = lresults.Count == 0 ? 0 : (int)(lresults.Sum(s => s.Duration) / lresults.Count), Items = new List <DsResponseItem>() }; if (lresults.Any()) { for (int i = 0; i < DSData.durations.Length; i++) { int startd = 0; if (i > 0) { Match m = d_rx.Match(DSData.durations[i]); if (m.Success) { startd = int.Parse(m.Value); } } int endd = startd + 3; if (i == 0) { endd = 8; } if (i == DSData.durations.Length - 1) { endd = 200; } var ilresults = lresults.Where(x => x.Duration > startd * 60 && x.Duration < endd * 60).ToList(); response.Items.Add(new DsResponseItem() { Label = $"{DSData.durations[i]} min ({ilresults.Count})", Count = ilresults.Count, Wins = ilresults.Where(x => x.Win == true).Count() }); } } var sma = new SimpleMovingAverage(4); response.SmaData = new List <double>(); response.SmaData = TimelineService.GetNiceLineData(response.Items.Select(s => s.Count == 0 ? 0 : ((double)s.Wins * 100.0 / (double)s.Count)), 4); return(response); } }
public static async Task <TimelineResponse> GetTimelineFromTimeResults(sc2dsstatsContext context, TimelineRequest request) { if (request.Step < 3) { request.Step = 3; } if (request.smaK < 3) { request.smaK = 3; } DateTime requestTime = request.StartTime; List <string> timeRequestStrings = new List <string>(); while (requestTime < request.EndTime) { timeRequestStrings.Add(requestTime.ToString("yyyyMM")); requestTime = requestTime.AddMonths(1); } List <DsTimeResult> timeResults = await context.DsTimeResults .AsNoTracking() .Where(f => f.Cmdr == request.Interest && f.Opp == String.Empty && timeRequestStrings.Contains(f.Timespan) && f.Player == request.Player ) .ToListAsync(); int tcount = timeResults.Sum(s => s.Count); TimelineResponse response = new TimelineResponse() { Interest = request.Interest, Count = tcount / 6, Versus = request.Versus, AvgDuration = (int)(timeResults.Sum(s => s.Duration) / tcount), Items = new List <DsResponseItem>() }; requestTime = request.StartTime; while (requestTime < request.EndTime) { var timeResult = timeResults.SingleOrDefault(f => f.Timespan == requestTime.ToString("yyyyMM")); if (timeResult == null || timeResult.Count == 0) { response.Items.Add(new TimelineResponseItem() { Label = $"{requestTime.ToString("yyyy-MM")} (0)", Count = 0, Wins = 0 }); } else { response.Items.Add(new TimelineResponseItem() { Label = $"{requestTime.ToString("yyyy-MM")} ({timeResult.Count})", Count = timeResult.Count, Wins = timeResult.Wins }); } requestTime = requestTime.AddMonths(1); } if (response.Items.Any() && response.Items.Last().Count < 10) { response.Items.RemoveAt(response.Items.Count - 1); } var sma = new SimpleMovingAverage(request.smaK); response.SmaData = new List <double>(); response.SmaData = GetNiceLineData(response.Items.Select(s => s.Count == 0 ? 0 : ((double)s.Wins * 100.0 / (double)s.Count)), request.smaK); return(response); }