{"action":"created","comment":{"url":"https://api.github.com/repos/ppy/osu/pulls/comments/205078246","pull_request_review_id":140274297,"id":205078246,"node_id":"MDI0OlB1bGxSZXF1ZXN0UmV2aWV3Q29tbWVudDIwNTA3ODI0Ng==","diff_hunk":"@@ -0,0 +1,513 @@\n+﻿// Copyright (c) 2007-2018 ppy Pty Ltd <contact@ppy.sh>.\n+// Licensed under the MIT Licence - https://raw.githubusercontent.com/ppy/osu/master/LICENCE\n+\n+using OpenTK;\n+using OpenTK.Graphics;\n+using OpenTK.Input;\n+using osu.Framework.Allocation;\n+using osu.Framework.Audio;\n+using osu.Framework.Audio.Sample;\n+using osu.Framework.Graphics;\n+using osu.Framework.Graphics.Containers;\n+using osu.Framework.Graphics.Cursor;\n+using osu.Framework.Graphics.Shapes;\n+using osu.Framework.Graphics.UserInterface;\n+using osu.Framework.Input.EventArgs;\n+using osu.Framework.Input.States;\n+using osu.Game.Graphics;\n+using osu.Game.Graphics.Sprites;\n+using osu.Game.Graphics.UserInterface;\n+using System;\n+using System.Globalization;\n+\n+namespace osu.Game.Screens.Edit.Screens.Setup.Components\n+{\n+    public class SetupTickSliderBar : SliderBar<float>, IHasTooltip, IHasAccentColour\n+    {\n+        /// <summary>\n+        /// Maximum number of decimal digits to be displayed in the tooltip.\n+        /// </summary>\n+        private const int max_decimal_digits = 5;\n+        private const float default_height = 20;\n+        private const float default_slider_height = 8;\n+        private const float nub_size_x = 36;\n+        private const float nub_size_y = 20;\n+        private const float default_caption_text_size = 13;\n+\n+        private bool leftShiftHeld;\n+        private bool rightShiftHeld;\n+\n+        private float normalPrecision;\n+        public float NormalPrecision\n+        {\n+            get => normalPrecision;\n+            set\n+            {\n+                if (normalPrecision == value)\n+                    return;\n+\n+                normalPrecision = value;\n+                if (ticks != null)\n+                    ticks.ValueInterval = value;\n+                if (!isUsingAlternatePrecision)\n+                    Precision = value;\n+            }\n+        }\n+        private float alternatePrecision;\n+        public float AlternatePrecision\n+        {\n+            get => alternatePrecision;\n+            set\n+            {\n+                alternatePrecision = value;\n+                if (isUsingAlternatePrecision)\n+                    Precision = value;\n+            }\n+        }\n+        private bool isUsingAlternatePrecision;\n+        public bool IsUsingAlternatePrecision\n+        {\n+            get => isUsingAlternatePrecision;\n+            set\n+            {\n+                if (value == isUsingAlternatePrecision)\n+                    return;\n+\n+                isUsingAlternatePrecision = value;\n+                Precision = value ? AlternatePrecision : NormalPrecision;\n+            }\n+        }\n+        public float MinValue\n+        {\n+            get => CurrentNumber.MinValue;\n+            set\n+            {\n+                if (CurrentNumber.MinValue == value)\n+                    return;\n+\n+                CurrentNumber.MinValue = value;\n+                if (ticks != null)\n+                    ticks.MinValue = value;\n+                if (CurrentNumber.Value < value)\n+                    CurrentNumber.Value = value;\n+            }\n+        }\n+        public float MaxValue\n+        {\n+            get => CurrentNumber.MaxValue;\n+            set\n+            {\n+                if (CurrentNumber.MaxValue == value)\n+                    return;\n+\n+                CurrentNumber.MaxValue = value;\n+                if (ticks != null)\n+                    ticks.MaxValue = value;\n+                if (CurrentNumber.Value > value)\n+                    CurrentNumber.Value = value;\n+            }\n+        }\n+        public float Precision\n+        {\n+            get => CurrentNumber.Precision;\n+            private set => CurrentNumber.Precision = value;\n+        }\n+\n+        public string LeftTickCaption\n+        {\n+            get => leftTickCaption.Text;\n+            set => leftTickCaption.Text = value;\n+        }\n+        public string MiddleTickCaption\n+        {\n+            get => middleTickCaption.Text;\n+            set => middleTickCaption.Text = value;\n+        }\n+        public string RightTickCaption\n+        {\n+            get => rightTickCaption.Text;\n+            set => rightTickCaption.Text = value;\n+        }\n+\n+        private SampleChannel sample;\n+        private double lastSampleTime;\n+        private float lastSampleValue;\n+\n+        protected readonly Nub Nub;\n+        private readonly Box leftBox;\n+        private readonly Box rightBox;\n+        private readonly OsuSpriteText leftTickCaption;\n+        private readonly OsuSpriteText middleTickCaption;\n+        private readonly OsuSpriteText rightTickCaption;\n+        private readonly Ticks ticks;\n+\n+        public string TooltipTextSuffix = \"\";\n+\n+        public virtual string TooltipText\n+        {\n+            get\n+            {\n+                var floatValue = CurrentNumber.Value;\n+                var floatPrecision = CurrentNumber.Precision;\n+\n+                var decimalPrecision = normalise((decimal)floatPrecision, max_decimal_digits);\n+\n+                // Find the number of significant digits (we could have less than 5 after normalize())\n+                var significantDigits = findPrecision(decimalPrecision);\n+\n+                return $\"{floatValue.ToString($\"N{significantDigits}\")}{TooltipTextSuffix}\";\n+            }\n+        }\n+\n+        private Color4 accentColour;\n+        public Color4 AccentColour\n+        {\n+            get => accentColour;\n+            set\n+            {\n+                accentColour = value;\n+                leftBox.Colour = value;\n+            }\n+        }\n+\n+        public SetupTickSliderBar(float minValue, float maxValue, float normalPrecision, float alternatePrecision)\n+        {\n+            MinValue = minValue;\n+            MaxValue = maxValue;\n+            Precision = normalPrecision;\n+            NormalPrecision = normalPrecision;\n+            AlternatePrecision = alternatePrecision;\n+\n+            RelativeSizeAxes = Axes.X;\n+            Height = default_height;\n+            RangePadding = 20;\n+            Y = 5;\n+            Children = new Drawable[]\n+            {\n+                new FillFlowContainer\n+                {\n+                    RelativeSizeAxes = Axes.X,\n+                    Height = default_height,\n+                    Direction = FillDirection.Vertical,\n+                    Spacing = new Vector2(2),\n+                    Children = new Drawable[]\n+                    {\n+                        new Container\n+                        {\n+                            Height = default_height,\n+                            RelativeSizeAxes = Axes.X,\n+                            Children = new Drawable[]\n+                            {\n+                                new Container\n+                                {\n+                                    Height = default_slider_height,\n+                                    RelativeSizeAxes = Axes.X,\n+                                    CornerRadius = 3,\n+                                    Masking = true,\n+                                    Anchor = Anchor.CentreLeft,\n+                                    Origin = Anchor.CentreLeft,\n+                                    Children = new Drawable[]\n+                                    {\n+                                        leftBox = new Box\n+                                        {\n+                                            Height = default_slider_height,\n+                                            RelativeSizeAxes = Axes.X,\n+                                            Anchor = Anchor.TopLeft,\n+                                            Origin = Anchor.TopLeft,\n+                                        },\n+                                        rightBox = new Box\n+                                        {\n+                                            Height = default_slider_height,\n+                                            RelativeSizeAxes = Axes.X,\n+                                            Anchor = Anchor.TopRight,\n+                                            Origin = Anchor.TopRight,\n+                                            Colour = Color4.Black\n+                                        },\n+                                    }\n+                                },\n+                                Nub = new Nub\n+                                {\n+                                    Anchor = Anchor.TopLeft,\n+                                    Origin = Anchor.TopCentre,\n+                                    RelativePositionAxes = Axes.X,\n+                                    Size = new Vector2(nub_size_x, nub_size_y)\n+                                },\n+                            }\n+                        },\n+                        ticks = new Ticks(minValue, maxValue, normalPrecision),\n+                        new Container\n+                        {\n+                            RelativeSizeAxes = Axes.X,\n+                            Children = new[]\n+                            {\n+                                new Container\n+                                {\n+                                    RelativePositionAxes = Axes.X,\n+                                    Anchor = Anchor.CentreLeft,\n+                                    Origin = Anchor.CentreLeft,\n+                                    Child = leftTickCaption = new OsuSpriteText\n+                                    {\n+                                        Anchor = Anchor.TopLeft,\n+                                        Origin = Anchor.TopLeft,\n+                                        Alpha = 0.8f,\n+                                        TextSize = default_caption_text_size,\n+                                    }\n+                                },\n+                                new Container\n+                                {\n+                                    RelativePositionAxes = Axes.X,\n+                                    Anchor = Anchor.Centre,\n+                                    Origin = Anchor.Centre,\n+                                    Child = middleTickCaption = new OsuSpriteText\n+                                    {\n+                                        Anchor = Anchor.TopCentre,\n+                                        Origin = Anchor.TopCentre,\n+                                        Alpha = 0.8f,\n+                                        TextSize = default_caption_text_size,\n+                                    }\n+                                },\n+                                new Container\n+                                {\n+                                    RelativePositionAxes = Axes.X,\n+                                    Anchor = Anchor.CentreRight,\n+                                    Origin = Anchor.CentreRight,\n+                                    Child = rightTickCaption = new OsuSpriteText\n+                                    {\n+                                        Anchor = Anchor.TopRight,\n+                                        Origin = Anchor.TopRight,\n+                                        Alpha = 0.8f,\n+                                        TextSize = default_caption_text_size,\n+                                    }\n+                                }\n+                            },\n+                        }\n+                    }\n+                },\n+                new HoverClickSounds()\n+            };\n+\n+            Nub.Current.Value = true;\n+\n+            ticks.TickClicked += a => Current.Value = a;\n+        }\n+\n+        [BackgroundDependencyLoader]\n+        private void load(AudioManager audio, OsuColour colours)\n+        {\n+            sample = audio.Sample.Get(@\"UI/sliderbar-notch\");\n+            AccentColour = colours.BlueDark;\n+            Nub.Colour = colours.BlueDark;\n+            Nub.AccentColour = colours.BlueDark;\n+            Nub.GlowColour = colours.BlueDarker;\n+            Nub.GlowingAccentColour = colours.BlueLighter;\n+            leftTickCaption.Colour = colours.BlueDark;\n+            middleTickCaption.Colour = colours.BlueDark;\n+            rightTickCaption.Colour = colours.BlueDark;\n+        }\n+\n+        protected override bool OnHover(InputState state)\n+        {\n+            Nub.Glowing = true;\n+            return base.OnHover(state);\n+        }\n+\n+        protected override void OnHoverLost(InputState state)\n+        {\n+            Nub.Glowing = false;\n+            base.OnHoverLost(state);\n+        }\n+\n+        protected override bool OnKeyDown(InputState state, KeyDownEventArgs args)\n+        {\n+            leftShiftHeld |= args.Key == Key.ShiftLeft;\n+            rightShiftHeld |= args.Key == Key.ShiftRight;\n+            IsUsingAlternatePrecision = leftShiftHeld | rightShiftHeld;","path":"osu.Game/Screens/Edit/Screens/Setup/Components/SetupTickSliderBar.cs","position":324,"original_position":324,"commit_id":"ec9f92195bd53e0cd1df4f39fd8ecb291acd8b04","original_commit_id":"ec9f92195bd53e0cd1df4f39fd8ecb291acd8b04","user":{"login":"AlFasGD","id":8298332,"node_id":"MDQ6VXNlcjgyOTgzMzI=","avatar_url":"https://avatars2.githubusercontent.com/u/8298332?v=4","gravatar_id":"","url":"https://api.github.com/users/AlFasGD","html_url":"https://github.com/AlFasGD","followers_url":"https://api.github.com/users/AlFasGD/followers","following_url":"https://api.github.com/users/AlFasGD/following{/other_user}","gists_url":"https://api.github.com/users/AlFasGD/gists{/gist_id}","starred_url":"https://api.github.com/users/AlFasGD/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/AlFasGD/subscriptions","organizations_url":"https://api.github.com/users/AlFasGD/orgs","repos_url":"https://api.github.com/users/AlFasGD/repos","events_url":"https://api.github.com/users/AlFasGD/events{/privacy}","received_events_url":"https://api.github.com/users/AlFasGD/received_events","type":"User","site_admin":false},"body":"It's been known that holding both shifts and releasing them, the state will be bugged. The first shift that was pressed will have its status correctly updated on release, however the second one will appear held. Pressing and releasing the second shift again will then fix the state.","created_at":"2018-07-25T11:48:12Z","updated_at":"2018-07-25T11:48:12Z","html_url":"https://github.com/ppy/osu/pull/3084#discussion_r205078246","pull_request_url":"https://api.github.com/repos/ppy/osu/pulls/3084","author_association":"CONTRIBUTOR","_links":{"self":{"href":"https://api.github.com/repos/ppy/osu/pulls/comments/205078246"},"html":{"href":"https://github.com/ppy/osu/pull/3084#discussion_r205078246"},"pull_request":{"href":"https://api.github.com/repos/ppy/osu/pulls/3084"}},"in_reply_to_id":205060630},"pull_request":{"url":"https://api.github.com/repos/ppy/osu/pulls/3084","id":202815501,"node_id":"MDExOlB1bGxSZXF1ZXN0MjAyODE1NTAx","html_url":"https://github.com/ppy/osu/pull/3084","diff_url":"https://github.com/ppy/osu/pull/3084.diff","patch_url":"https://github.com/ppy/osu/pull/3084.patch","issue_url":"https://api.github.com/repos/ppy/osu/issues/3084","number":3084,"state":"open","locked":false,"title":"Add labelled slider bar component for the Beatmap Setup Screen","user":{"login":"AlFasGD","id":8298332,"node_id":"MDQ6VXNlcjgyOTgzMzI=","avatar_url":"https://avatars2.githubusercontent.com/u/8298332?v=4","gravatar_id":"","url":"https://api.github.com/users/AlFasGD","html_url":"https://github.com/AlFasGD","followers_url":"https://api.github.com/users/AlFasGD/followers","following_url":"https://api.github.com/users/AlFasGD/following{/other_user}","gists_url":"https://api.github.com/users/AlFasGD/gists{/gist_id}","starred_url":"https://api.github.com/users/AlFasGD/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/AlFasGD/subscriptions","organizations_url":"https://api.github.com/users/AlFasGD/orgs","repos_url":"https://api.github.com/users/AlFasGD/repos","events_url":"https://api.github.com/users/AlFasGD/events{/privacy}","received_events_url":"https://api.github.com/users/AlFasGD/received_events","type":"User","site_admin":false},"body":"Split from #3078","created_at":"2018-07-20T10:57:06Z","updated_at":"2018-07-25T11:48:12Z","closed_at":null,"merged_at":null,"merge_commit_sha":"71919b229041795f451cb8cdcd168351e0f502ce","assignee":null,"assignees":[],"requested_reviewers":[],"requested_teams":[],"labels":[{"id":756794649,"node_id":"MDU6TGFiZWw3NTY3OTQ2NDk=","url":"https://api.github.com/repos/ppy/osu/labels/editor","name":"editor","color":"fcc2f3","default":false},{"id":765141404,"node_id":"MDU6TGFiZWw3NjUxNDE0MDQ=","url":"https://api.github.com/repos/ppy/osu/labels/user%20interface","name":"user interface","color":"0052cc","default":false}],"milestone":{"url":"https://api.github.com/repos/ppy/osu/milestones/28","html_url":"https://github.com/ppy/osu/milestone/28","labels_url":"https://api.github.com/repos/ppy/osu/milestones/28/labels","id":2927539,"node_id":"MDk6TWlsZXN0b25lMjkyNzUzOQ==","number":28,"title":"Candidate Issues","description":"Issues which are relatively high priority and need to be added to a milestone.","creator":{"login":"peppy","id":191335,"node_id":"MDQ6VXNlcjE5MTMzNQ==","avatar_url":"https://avatars3.githubusercontent.com/u/191335?v=4","gravatar_id":"","url":"https://api.github.com/users/peppy","html_url":"https://github.com/peppy","followers_url":"https://api.github.com/users/peppy/followers","following_url":"https://api.github.com/users/peppy/following{/other_user}","gists_url":"https://api.github.com/users/peppy/gists{/gist_id}","starred_url":"https://api.github.com/users/peppy/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/peppy/subscriptions","organizations_url":"https://api.github.com/users/peppy/orgs","repos_url":"https://api.github.com/users/peppy/repos","events_url":"https://api.github.com/users/peppy/events{/privacy}","received_events_url":"https://api.github.com/users/peppy/received_events","type":"User","site_admin":false},"open_issues":180,"closed_issues":177,"state":"open","created_at":"2017-11-21T05:35:44Z","updated_at":"2018-07-25T10:15:50Z","due_on":null,"closed_at":null},"commits_url":"https://api.github.com/repos/ppy/osu/pulls/3084/commits","review_comments_url":"https://api.github.com/repos/ppy/osu/pulls/3084/comments","review_comment_url":"https://api.github.com/repos/ppy/osu/pulls/comments{/number}","comments_url":"https://api.github.com/repos/ppy/osu/issues/3084/comments","statuses_url":"https://api.github.com/repos/ppy/osu/statuses/ec9f92195bd53e0cd1df4f39fd8ecb291acd8b04","head":{"label":"AlFasGD:labelled-slider-bar","ref":"labelled-slider-bar","sha":"ec9f92195bd53e0cd1df4f39fd8ecb291acd8b04","user":{"login":"AlFasGD","id":8298332,"node_id":"MDQ6VXNlcjgyOTgzMzI=","avatar_url":"https://avatars2.githubusercontent.com/u/8298332?v=4","gravatar_id":"","url":"https://api.github.com/users/AlFasGD","html_url":"https://github.com/AlFasGD","followers_url":"https://api.github.com/users/AlFasGD/followers","following_url":"https://api.github.com/users/AlFasGD/following{/other_user}","gists_url":"https://api.github.com/users/AlFasGD/gists{/gist_id}","starred_url":"https://api.github.com/users/AlFasGD/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/AlFasGD/subscriptions","organizations_url":"https://api.github.com/users/AlFasGD/orgs","repos_url":"https://api.github.com/users/AlFasGD/repos","events_url":"https://api.github.com/users/AlFasGD/events{/privacy}","received_events_url":"https://api.github.com/users/AlFasGD/received_events","type":"User","site_admin":false},"repo":{"id":129504685,"node_id":"MDEwOlJlcG9zaXRvcnkxMjk1MDQ2ODU=","name":"osu","full_name":"AlFasGD/osu","owner":{"login":"AlFasGD","id":8298332,"node_id":"MDQ6VXNlcjgyOTgzMzI=","avatar_url":"https://avatars2.githubusercontent.com/u/8298332?v=4","gravatar_id":"","url":"https://api.github.com/users/AlFasGD","html_url":"https://github.com/AlFasGD","followers_url":"https://api.github.com/users/AlFasGD/followers","following_url":"https://api.github.com/users/AlFasGD/following{/other_user}","gists_url":"https://api.github.com/users/AlFasGD/gists{/gist_id}","starred_url":"https://api.github.com/users/AlFasGD/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/AlFasGD/subscriptions","organizations_url":"https://api.github.com/users/AlFasGD/orgs","repos_url":"https://api.github.com/users/AlFasGD/repos","events_url":"https://api.github.com/users/AlFasGD/events{/privacy}","received_events_url":"https://api.github.com/users/AlFasGD/received_events","type":"User","site_admin":false},"private":false,"html_url":"https://github.com/AlFasGD/osu","description":"rhythm is just a *click* away!","fork":true,"url":"https://api.github.com/repos/AlFasGD/osu","forks_url":"https://api.github.com/repos/AlFasGD/osu/forks","keys_url":"https://api.github.com/repos/AlFasGD/osu/keys{/key_id}","collaborators_url":"https://api.github.com/repos/AlFasGD/osu/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/AlFasGD/osu/teams","hooks_url":"https://api.github.com/repos/AlFasGD/osu/hooks","issue_events_url":"https://api.github.com/repos/AlFasGD/osu/issues/events{/number}","events_url":"https://api.github.com/repos/AlFasGD/osu/events","assignees_url":"https://api.github.com/repos/AlFasGD/osu/assignees{/user}","branches_url":"https://api.github.com/repos/AlFasGD/osu/branches{/branch}","tags_url":"https://api.github.com/repos/AlFasGD/osu/tags","blobs_url":"https://api.github.com/repos/AlFasGD/osu/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/AlFasGD/osu/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/AlFasGD/osu/git/refs{/sha}","trees_url":"https://api.github.com/repos/AlFasGD/osu/git/trees{/sha}","statuses_url":"https://api.github.com/repos/AlFasGD/osu/statuses/{sha}","languages_url":"https://api.github.com/repos/AlFasGD/osu/languages","stargazers_url":"https://api.github.com/repos/AlFasGD/osu/stargazers","contributors_url":"https://api.github.com/repos/AlFasGD/osu/contributors","subscribers_url":"https://api.github.com/repos/AlFasGD/osu/subscribers","subscription_url":"https://api.github.com/repos/AlFasGD/osu/subscription","commits_url":"https://api.github.com/repos/AlFasGD/osu/commits{/sha}","git_commits_url":"https://api.github.com/repos/AlFasGD/osu/git/commits{/sha}","comments_url":"https://api.github.com/repos/AlFasGD/osu/comments{/number}","issue_comment_url":"https://api.github.com/repos/AlFasGD/osu/issues/comments{/number}","contents_url":"https://api.github.com/repos/AlFasGD/osu/contents/{+path}","compare_url":"https://api.github.com/repos/AlFasGD/osu/compare/{base}...{head}","merges_url":"https://api.github.com/repos/AlFasGD/osu/merges","archive_url":"https://api.github.com/repos/AlFasGD/osu/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/AlFasGD/osu/downloads","issues_url":"https://api.github.com/repos/AlFasGD/osu/issues{/number}","pulls_url":"https://api.github.com/repos/AlFasGD/osu/pulls{/number}","milestones_url":"https://api.github.com/repos/AlFasGD/osu/milestones{/number}","notifications_url":"https://api.github.com/repos/AlFasGD/osu/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/AlFasGD/osu/labels{/name}","releases_url":"https://api.github.com/repos/AlFasGD/osu/releases{/id}","deployments_url":"https://api.github.com/repos/AlFasGD/osu/deployments","created_at":"2018-04-14T09:56:19Z","updated_at":"2018-07-23T12:06:33Z","pushed_at":"2018-07-25T09:38:58Z","git_url":"git://github.com/AlFasGD/osu.git","ssh_url":"git@github.com:AlFasGD/osu.git","clone_url":"https://github.com/AlFasGD/osu.git","svn_url":"https://github.com/AlFasGD/osu","homepage":"https://osu.ppy.sh","size":20350,"stargazers_count":0,"watchers_count":0,"language":"C#","has_issues":false,"has_projects":true,"has_downloads":true,"has_wiki":true,"has_pages":false,"forks_count":0,"mirror_url":null,"archived":false,"open_issues_count":0,"license":{"key":"mit","name":"MIT License","spdx_id":"MIT","url":"https://api.github.com/licenses/mit","node_id":"MDc6TGljZW5zZTEz"},"forks":0,"open_issues":0,"watchers":0,"default_branch":"master"}},"base":{"label":"ppy:master","ref":"master","sha":"9dc55688d249de0a8df8e6bd9e8f9738d90fdde5","user":{"login":"ppy","id":995763,"node_id":"MDEyOk9yZ2FuaXphdGlvbjk5NTc2Mw==","avatar_url":"https://avatars1.githubusercontent.com/u/995763?v=4","gravatar_id":"","url":"https://api.github.com/users/ppy","html_url":"https://github.com/ppy","followers_url":"https://api.github.com/users/ppy/followers","following_url":"https://api.github.com/users/ppy/following{/other_user}","gists_url":"https://api.github.com/users/ppy/gists{/gist_id}","starred_url":"https://api.github.com/users/ppy/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/ppy/subscriptions","organizations_url":"https://api.github.com/users/ppy/orgs","repos_url":"https://api.github.com/users/ppy/repos","events_url":"https://api.github.com/users/ppy/events{/privacy}","received_events_url":"https://api.github.com/users/ppy/received_events","type":"Organization","site_admin":false},"repo":{"id":22456440,"node_id":"MDEwOlJlcG9zaXRvcnkyMjQ1NjQ0MA==","name":"osu","full_name":"ppy/osu","owner":{"login":"ppy","id":995763,"node_id":"MDEyOk9yZ2FuaXphdGlvbjk5NTc2Mw==","avatar_url":"https://avatars1.githubusercontent.com/u/995763?v=4","gravatar_id":"","url":"https://api.github.com/users/ppy","html_url":"https://github.com/ppy","followers_url":"https://api.github.com/users/ppy/followers","following_url":"https://api.github.com/users/ppy/following{/other_user}","gists_url":"https://api.github.com/users/ppy/gists{/gist_id}","starred_url":"https://api.github.com/users/ppy/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/ppy/subscriptions","organizations_url":"https://api.github.com/users/ppy/orgs","repos_url":"https://api.github.com/users/ppy/repos","events_url":"https://api.github.com/users/ppy/events{/privacy}","received_events_url":"https://api.github.com/users/ppy/received_events","type":"Organization","site_admin":false},"private":false,"html_url":"https://github.com/ppy/osu","description":"rhythm is just a *click* away!","fork":false,"url":"https://api.github.com/repos/ppy/osu","forks_url":"https://api.github.com/repos/ppy/osu/forks","keys_url":"https://api.github.com/repos/ppy/osu/keys{/key_id}","collaborators_url":"https://api.github.com/repos/ppy/osu/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/ppy/osu/teams","hooks_url":"https://api.github.com/repos/ppy/osu/hooks","issue_events_url":"https://api.github.com/repos/ppy/osu/issues/events{/number}","events_url":"https://api.github.com/repos/ppy/osu/events","assignees_url":"https://api.github.com/repos/ppy/osu/assignees{/user}","branches_url":"https://api.github.com/repos/ppy/osu/branches{/branch}","tags_url":"https://api.github.com/repos/ppy/osu/tags","blobs_url":"https://api.github.com/repos/ppy/osu/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/ppy/osu/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/ppy/osu/git/refs{/sha}","trees_url":"https://api.github.com/repos/ppy/osu/git/trees{/sha}","statuses_url":"https://api.github.com/repos/ppy/osu/statuses/{sha}","languages_url":"https://api.github.com/repos/ppy/osu/languages","stargazers_url":"https://api.github.com/repos/ppy/osu/stargazers","contributors_url":"https://api.github.com/repos/ppy/osu/contributors","subscribers_url":"https://api.github.com/repos/ppy/osu/subscribers","subscription_url":"https://api.github.com/repos/ppy/osu/subscription","commits_url":"https://api.github.com/repos/ppy/osu/commits{/sha}","git_commits_url":"https://api.github.com/repos/ppy/osu/git/commits{/sha}","comments_url":"https://api.github.com/repos/ppy/osu/comments{/number}","issue_comment_url":"https://api.github.com/repos/ppy/osu/issues/comments{/number}","contents_url":"https://api.github.com/repos/ppy/osu/contents/{+path}","compare_url":"https://api.github.com/repos/ppy/osu/compare/{base}...{head}","merges_url":"https://api.github.com/repos/ppy/osu/merges","archive_url":"https://api.github.com/repos/ppy/osu/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/ppy/osu/downloads","issues_url":"https://api.github.com/repos/ppy/osu/issues{/number}","pulls_url":"https://api.github.com/repos/ppy/osu/pulls{/number}","milestones_url":"https://api.github.com/repos/ppy/osu/milestones{/number}","notifications_url":"https://api.github.com/repos/ppy/osu/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/ppy/osu/labels{/name}","releases_url":"https://api.github.com/repos/ppy/osu/releases{/id}","deployments_url":"https://api.github.com/repos/ppy/osu/deployments","created_at":"2014-07-31T04:26:30Z","updated_at":"2018-07-25T11:15:07Z","pushed_at":"2018-07-25T10:40:15Z","git_url":"git://github.com/ppy/osu.git","ssh_url":"git@github.com:ppy/osu.git","clone_url":"https://github.com/ppy/osu.git","svn_url":"https://github.com/ppy/osu","homepage":"https://osu.ppy.sh","size":22901,"stargazers_count":1901,"watchers_count":1901,"language":"C#","has_issues":true,"has_projects":false,"has_downloads":true,"has_wiki":true,"has_pages":false,"forks_count":477,"mirror_url":null,"archived":false,"open_issues_count":269,"license":{"key":"mit","name":"MIT License","spdx_id":"MIT","url":"https://api.github.com/licenses/mit","node_id":"MDc6TGljZW5zZTEz"},"forks":477,"open_issues":269,"watchers":1901,"default_branch":"master"}},"_links":{"self":{"href":"https://api.github.com/repos/ppy/osu/pulls/3084"},"html":{"href":"https://github.com/ppy/osu/pull/3084"},"issue":{"href":"https://api.github.com/repos/ppy/osu/issues/3084"},"comments":{"href":"https://api.github.com/repos/ppy/osu/issues/3084/comments"},"review_comments":{"href":"https://api.github.com/repos/ppy/osu/pulls/3084/comments"},"review_comment":{"href":"https://api.github.com/repos/ppy/osu/pulls/comments{/number}"},"commits":{"href":"https://api.github.com/repos/ppy/osu/pulls/3084/commits"},"statuses":{"href":"https://api.github.com/repos/ppy/osu/statuses/ec9f92195bd53e0cd1df4f39fd8ecb291acd8b04"}},"author_association":"CONTRIBUTOR"}}
{"actor":{"display_login":"AlFasGD"}}