コード例 #1
0
        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);
        }
コード例 #2
0
        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;
                }
            }
        }
コード例 #3
0
        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);
        }
コード例 #4
0
ファイル: Program.cs プロジェクト: kobake/Hatenatter
        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);
            }
        }
コード例 #5
0
ファイル: ChartService.cs プロジェクト: ipax77/sc2dsstats
        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);
        }
コード例 #6
0
        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));
        }
コード例 #7
0
ファイル: Page1.xaml.cs プロジェクト: kobake/Hatenatter
        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");
            }
        }
コード例 #8
0
        /// <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;
                }
            }
        }
コード例 #9
0
        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);
        }
コード例 #10
0
        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);
        }
    }
コード例 #11
0
        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);
        }