GitHub PullRequestReviewCommentEvent at 2014-07-22 03:34:21
Repository: Bukkit
Actor: turt2live
Payload: {"action":"created","comment":{"url":"https://api.github.com/repos/Bukkit/Bukkit/pulls/comments/15209367","id":15209367,"diff_hunk":"@@ -0,0 +1,305 @@\n+package org.bukkit.inventory;\n+\n+import java.util.Map;\n+\n+import com.google.common.collect.ImmutableMap;\n+import org.apache.commons.lang.Validate;\n+\n+import org.bukkit.Material;\n+import org.bukkit.configuration.serialization.ConfigurationSerializable;\n+\n+/**\n+ * Represents a Merchant's trade offer that always will have the following:\n+ * <ul>\n+ *     <li>At least one {@link ItemStack} being bought from the player</li>\n+ *     <li>Another ItemStack being granted to the Player</li>\n+ *     <li>A maximum amount of times this trade can be used</li>\n+ * </ul>\n+ *\n+ * Each TradeOffer has a limited amount of uses. Once the uses have reached\n+ * their maximum, the TradeOffer is no longer valid for a player's trade.\n+ */\n+public final class TradeOffer implements ConfigurationSerializable {\n+\n+    /**\n+     * Gets a builder for building a TradeOffer.\n+     *\n+     * @return a utility object for building a TradeOffer\n+     */\n+    public static Builder builder() {\n+        return new Builder();\n+    }\n+\n+    /**\n+     * Gets a new builder object with this TradeOffer as a template. The\n+     * builder can create a new TradeOffer, but it will be a new instance of\n+     * the TradeOffer, not the same TradeOffer.\n+     *\n+     * @return a new Builder with the TradeOffer as a template for default\n+     *     values\n+     */\n+    public Builder builderOf() {\n+        return builder()\n+                .withFirstItem(firstItem)\n+                .withSecondItem(secondItem)\n+                .withResultingItem(resultingOffer)\n+                .withSetUses(uses)\n+                .withMaxUses(maxUses);\n+    }\n+\n+    /**\n+     * This is a builder for TradeOffer.\n+     *\n+     * @see TradeOffer#builder()\n+     */\n+    public static final class Builder {\n+        ItemStack firstItem;\n+        ItemStack secondItem;\n+        ItemStack resultingOffer;\n+        int maxUses = 7;\n+        int uses = 0;\n+\n+        Builder() {}\n+\n+        /**\n+         * Sets the first buying item for the trade offer.\n+         *\n+         * @param itemStack the first buying item\n+         * @return this object, for chaining\n+         * @throws IllegalArgumentException if the itemstack is null\n+         * @throws IllegalArgumentException if the itemstack type is AIR\n+         */\n+        public Builder withFirstItem(ItemStack itemStack) {\n+            Validate.notNull(itemStack, \"Cannot have a null item for a TradeOffer's first item!\");\n+            ItemStack temp = new ItemStack(itemStack);\n+            Validate.isTrue(temp.getType() != Material.AIR, \"Cannot have an AIR item for a TradeOffer's first item!\");\n+            this.firstItem = temp;\n+            return this;\n+        }\n+\n+        /**\n+         * Sets the second buying item for the trade offer.\n+         *\n+         * @param itemStack the second buying item\n+         * @return this object, for chaining\n+         * @throws IllegalArgumentException if the itemstack type is AIR\n+         */\n+        public Builder withSecondItem(ItemStack itemStack) {\n+            if (itemStack == null) {\n+                this.secondItem = null;\n+                return this;\n+            }\n+            ItemStack temp = new ItemStack(itemStack);\n+            Validate.isTrue(temp.getType() != Material.AIR, \"Cannot have an AIR item for a TradeOffer's second item!\");\n+            this.secondItem = new ItemStack(itemStack);\n+            return this;\n+        }\n+\n+        /**\n+         * Sets the offered item for the trade offer.\n+         *\n+         * @param itemStack the resulting offered item\n+         * @return this object, for chaining\n+         * @throws IllegalArgumentException if the itemstack is null\n+         * @throws IllegalArgumentException if the itemstack type is AIR\n+         */\n+        public Builder withResultingItem(ItemStack itemStack) {\n+            Validate.notNull(itemStack, \"Cannot have a null item for a TradeOffer's resulting item!\");\n+            ItemStack temp = new ItemStack(itemStack);\n+            Validate.isTrue(temp.getType() != Material.AIR, \"Cannot have an AIR item for a TradeOffer's resulting item!\");\n+            this.resultingOffer = temp;\n+            return this;\n+        }\n+\n+        /**\n+         * Sets the maximum uses of the trade offer.\n+         *\n+         * @param uses the maximum uses this TradeOffer will have\n+         * @return this object, for chaining\n+         * @throws IllegalArgumentException if the uses is less than zero\n+         */\n+        public Builder withMaxUses(int uses) {\n+            Validate.isTrue(uses > 0, \"Cannot have zero or less than zero uses!\");\n+            this.maxUses = uses;\n+            return this;\n+        }\n+\n+        /**\n+         * Sets the current uses of the trade offer.\n+         *\n+         * @param uses the current uses this TradeOffer will have\n+         * @return this object, for chaining\n+         * @throws IllegalArgumentException if the uses is less than zero\n+         */\n+        public Builder withSetUses(int uses) {\n+            Validate.isTrue(uses >= 0, \"Cannot have less than zero uses!\");\n+            this.uses = uses;\n+            return this;\n+        }\n+\n+        /**\n+         * Gets a new TradeOffer from the current state of this builder.\n+         * <p>\n+         * To successfully build, you must have specified at least the\n+         * {@link #withFirstItem(ItemStack)} and {@link #withResultingItem(ItemStack)}\n+         *\n+         * @return the respective TradeOffer\n+         * @throws IllegalStateException if the builder was not set up with the\n+         *         proper variables\n+         */\n+        public TradeOffer build() {\n+            if (firstItem == null || resultingOffer == null) {\n+                throw new IllegalStateException(\"Cannot have a null first item or resulting offer item in a TradeOffer!\");\n+            }\n+            return new TradeOffer(this);\n+        }\n+    }\n+\n+    private static final String FIRST_ITEM = \"first-item\";\n+    private static final String SECOND_ITEM = \"second-item\";\n+    private static final String BUYING_ITEM = \"buying-item\";\n+    private static final String CURRENT_USES = \"current-uses\";\n+    private static final String MAX_USES = \"max-uses\";\n+\n+    private final ItemStack firstItem;\n+    private final ItemStack secondItem;\n+    private final ItemStack resultingOffer;\n+    private final int maxUses;\n+    private final int uses;\n+\n+    TradeOffer(Builder builder) {\n+        this.firstItem = builder.firstItem;\n+        this.secondItem = builder.secondItem;\n+        this.resultingOffer = builder.resultingOffer;\n+        this.uses = builder.uses;\n+        this.maxUses = builder.maxUses;\n+    }\n+\n+    /**\n+     * Gets the first item (or left item) required by this offer.","path":"src/main/java/org/bukkit/inventory/TradeOffer.java","position":179,"original_position":179,"commit_id":"fa1a2e2e43a3d390f9a73ca6bb88ed3c597d21e0","original_commit_id":"fa1a2e2e43a3d390f9a73ca6bb88ed3c597d21e0","user":{"login":"turt2live","id":1190097,"avatar_url":"https://avatars.githubusercontent.com/u/1190097?","gravatar_id":"1ff897313ab7ed45a24871913d0968e6","url":"https://api.github.com/users/turt2live","html_url":"https://github.com/turt2live","followers_url":"https://api.github.com/users/turt2live/followers","following_url":"https://api.github.com/users/turt2live/following{/other_user}","gists_url":"https://api.github.com/users/turt2live/gists{/gist_id}","starred_url":"https://api.github.com/users/turt2live/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/turt2live/subscriptions","organizations_url":"https://api.github.com/users/turt2live/orgs","repos_url":"https://api.github.com/users/turt2live/repos","events_url":"https://api.github.com/users/turt2live/events{/privacy}","received_events_url":"https://api.github.com/users/turt2live/received_events","type":"User","site_admin":false},"body":"`left` does not really help us when we see a bunch of text in an editor.","created_at":"2014-07-22T03:34:21Z","updated_at":"2014-07-22T03:34:21Z","html_url":"https://github.com/Bukkit/Bukkit/pull/1077#discussion_r15209367","pull_request_url":"https://api.github.com/repos/Bukkit/Bukkit/pulls/1077","_links":{"self":{"href":"https://api.github.com/repos/Bukkit/Bukkit/pulls/comments/15209367"},"html":{"href":"https://github.com/Bukkit/Bukkit/pull/1077#discussion_r15209367"},"pull_request":{"href":"https://api.github.com/repos/Bukkit/Bukkit/pulls/1077"}}},"pull_request":{"url":"https://api.github.com/repos/Bukkit/Bukkit/pulls/1077","id":17386080,"html_url":"https://github.com/Bukkit/Bukkit/pull/1077","diff_url":"https://github.com/Bukkit/Bukkit/pull/1077.diff","patch_url":"https://github.com/Bukkit/Bukkit/pull/1077.patch","issue_url":"https://api.github.com/repos/Bukkit/Bukkit/issues/1077","number":1077,"state":"open","title":"[B+C] Add Merchant Trade API - Adds BUKKIT-5663","user":{"login":"gabizou","id":1203877,"avatar_url":"https://avatars.githubusercontent.com/u/1203877?","gravatar_id":"b4ce89a8a975b91d2d656808d4ea0fb5","url":"https://api.github.com/users/gabizou","html_url":"https://github.com/gabizou","followers_url":"https://api.github.com/users/gabizou/followers","following_url":"https://api.github.com/users/gabizou/following{/other_user}","gists_url":"https://api.github.com/users/gabizou/gists{/gist_id}","starred_url":"https://api.github.com/users/gabizou/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/gabizou/subscriptions","organizations_url":"https://api.github.com/users/gabizou/orgs","repos_url":"https://api.github.com/users/gabizou/repos","events_url":"https://api.github.com/users/gabizou/events{/privacy}","received_events_url":"https://api.github.com/users/gabizou/received_events","type":"User","site_admin":false},"body":"**The Issue:**\r\n\r\nThere is no way to modify Villager trades through the Bukkit API.\r\n\r\n**Justification**\r\n\r\n\r\nWithout the API to allow for modifications being made on a Merchant's offers list, plugins have no Bukkit API way to affect trades, leading to messy uses of NMS classes and modified CraftBukkit classes, which can cause plugins to break or the server to crash. With an API, all plugin developers will be able to safely modify merchant trades (which as of current writing is only implemented through Villagers).\r\n\r\n**PR Breakdown:**\r\n\r\nThe API adds the ability to retrieve current trades offered by a Merchant, add trades, remove trades and modify trades. There is also the added ability to influence event specific trades such that modified trades added to the MerchantTradeEvent do not alter the more permanent TradeOffers supplied by the Merchant.\r\nIn this sense: A MerchantTradeEvent's offers are a copy of the Merchant's offers that do not affect the Merchant's offers. However, the Merchant is still able to have their trades altered, but the MerchantTradeEvent will not be affected.\r\n\r\n**Testing Results / Materials:**\r\n\r\nPlugin code used to test: https://github.com/gabizou/TradeAPITest\r\nCompiled Binary: https://dl.dropboxusercontent.com/u/9058563/TradingTest.jar\r\n\r\nSteps to test:\r\n- Spawn villager\r\n- Interact with villager to bring up the Trade window\r\n\r\nConsole shows the debugging text\r\n\r\n**Associated PRs**\r\nBukkit PR: https://github.com/Bukkit/Bukkit/pull/1077\r\nCraftBukkit PR: https://github.com/Bukkit/CraftBukkit/pull/1393 \r\n\r\n** Relevant PRs** \r\nClosed Bukkit PR: https://github.com/Bukkit/Bukkit/pull/921\r\nClosed Bukkit PR: https://github.com/Bukkit/Bukkit/pull/833\r\nClosed Bukkit PR: https://github.com/Bukkit/Bukkit/pull/832\r\nClosed CraftBukkit PR: https://github.com/Bukkit/CraftBukkit/pull/1240\r\nClosed CraftBukkit PR: https://github.com/Bukkit/CraftBukkit/pull/1111\r\n\r\n**JIRA Tickets**\r\n\r\n\r\nMain ticket: https://bukkit.atlassian.net/browse/BUKKIT-5663\r\nSubsequent (duplicate) tickets\r\nhttps://bukkit.atlassian.net/browse/BUKKIT-3935\r\nhttps://bukkit.atlassian.net/browse/BUKKIT-2138","created_at":"2014-06-20T01:54:45Z","updated_at":"2014-07-22T03:34:21Z","closed_at":null,"merged_at":null,"merge_commit_sha":"0e1aef1429206d534ecdaa1b00335a245a9ecadc","assignee":null,"milestone":null,"commits_url":"https://api.github.com/repos/Bukkit/Bukkit/pulls/1077/commits","review_comments_url":"https://api.github.com/repos/Bukkit/Bukkit/pulls/1077/comments","review_comment_url":"https://api.github.com/repos/Bukkit/Bukkit/pulls/comments/{number}","comments_url":"https://api.github.com/repos/Bukkit/Bukkit/issues/1077/comments","statuses_url":"https://api.github.com/repos/Bukkit/Bukkit/statuses/fa1a2e2e43a3d390f9a73ca6bb88ed3c597d21e0","head":{"label":"gabizou:tradingAPI","ref":"tradingAPI","sha":"fa1a2e2e43a3d390f9a73ca6bb88ed3c597d21e0","user":{"login":"gabizou","id":1203877,"avatar_url":"https://avatars.githubusercontent.com/u/1203877?","gravatar_id":"b4ce89a8a975b91d2d656808d4ea0fb5","url":"https://api.github.com/users/gabizou","html_url":"https://github.com/gabizou","followers_url":"https://api.github.com/users/gabizou/followers","following_url":"https://api.github.com/users/gabizou/following{/other_user}","gists_url":"https://api.github.com/users/gabizou/gists{/gist_id}","starred_url":"https://api.github.com/users/gabizou/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/gabizou/subscriptions","organizations_url":"https://api.github.com/users/gabizou/orgs","repos_url":"https://api.github.com/users/gabizou/repos","events_url":"https://api.github.com/users/gabizou/events{/privacy}","received_events_url":"https://api.github.com/users/gabizou/received_events","type":"User","site_admin":false},"repo":{"id":16093578,"name":"Bukkit","full_name":"gabizou/Bukkit","owner":{"login":"gabizou","id":1203877,"avatar_url":"https://avatars.githubusercontent.com/u/1203877?","gravatar_id":"b4ce89a8a975b91d2d656808d4ea0fb5","url":"https://api.github.com/users/gabizou","html_url":"https://github.com/gabizou","followers_url":"https://api.github.com/users/gabizou/followers","following_url":"https://api.github.com/users/gabizou/following{/other_user}","gists_url":"https://api.github.com/users/gabizou/gists{/gist_id}","starred_url":"https://api.github.com/users/gabizou/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/gabizou/subscriptions","organizations_url":"https://api.github.com/users/gabizou/orgs","repos_url":"https://api.github.com/users/gabizou/repos","events_url":"https://api.github.com/users/gabizou/events{/privacy}","received_events_url":"https://api.github.com/users/gabizou/received_events","type":"User","site_admin":false},"private":false,"html_url":"https://github.com/gabizou/Bukkit","description":"The Minecraft Mod API","fork":true,"url":"https://api.github.com/repos/gabizou/Bukkit","forks_url":"https://api.github.com/repos/gabizou/Bukkit/forks","keys_url":"https://api.github.com/repos/gabizou/Bukkit/keys{/key_id}","collaborators_url":"https://api.github.com/repos/gabizou/Bukkit/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/gabizou/Bukkit/teams","hooks_url":"https://api.github.com/repos/gabizou/Bukkit/hooks","issue_events_url":"https://api.github.com/repos/gabizou/Bukkit/issues/events{/number}","events_url":"https://api.github.com/repos/gabizou/Bukkit/events","assignees_url":"https://api.github.com/repos/gabizou/Bukkit/assignees{/user}","branches_url":"https://api.github.com/repos/gabizou/Bukkit/branches{/branch}","tags_url":"https://api.github.com/repos/gabizou/Bukkit/tags","blobs_url":"https://api.github.com/repos/gabizou/Bukkit/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/gabizou/Bukkit/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/gabizou/Bukkit/git/refs{/sha}","trees_url":"https://api.github.com/repos/gabizou/Bukkit/git/trees{/sha}","statuses_url":"https://api.github.com/repos/gabizou/Bukkit/statuses/{sha}","languages_url":"https://api.github.com/repos/gabizou/Bukkit/languages","stargazers_url":"https://api.github.com/repos/gabizou/Bukkit/stargazers","contributors_url":"https://api.github.com/repos/gabizou/Bukkit/contributors","subscribers_url":"https://api.github.com/repos/gabizou/Bukkit/subscribers","subscription_url":"https://api.github.com/repos/gabizou/Bukkit/subscription","commits_url":"https://api.github.com/repos/gabizou/Bukkit/commits{/sha}","git_commits_url":"https://api.github.com/repos/gabizou/Bukkit/git/commits{/sha}","comments_url":"https://api.github.com/repos/gabizou/Bukkit/comments{/number}","issue_comment_url":"https://api.github.com/repos/gabizou/Bukkit/issues/comments/{number}","contents_url":"https://api.github.com/repos/gabizou/Bukkit/contents/{+path}","compare_url":"https://api.github.com/repos/gabizou/Bukkit/compare/{base}...{head}","merges_url":"https://api.github.com/repos/gabizou/Bukkit/merges","archive_url":"https://api.github.com/repos/gabizou/Bukkit/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/gabizou/Bukkit/downloads","issues_url":"https://api.github.com/repos/gabizou/Bukkit/issues{/number}","pulls_url":"https://api.github.com/repos/gabizou/Bukkit/pulls{/number}","milestones_url":"https://api.github.com/repos/gabizou/Bukkit/milestones{/number}","notifications_url":"https://api.github.com/repos/gabizou/Bukkit/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/gabizou/Bukkit/labels{/name}","releases_url":"https://api.github.com/repos/gabizou/Bukkit/releases{/id}","created_at":"2014-01-21T05:28:10Z","updated_at":"2014-07-08T06:24:42Z","pushed_at":"2014-07-10T18:34:36Z","git_url":"git://github.com/gabizou/Bukkit.git","ssh_url":"git@github.com:gabizou/Bukkit.git","clone_url":"https://github.com/gabizou/Bukkit.git","svn_url":"https://github.com/gabizou/Bukkit","homepage":"http://bukkit.org","size":4961,"stargazers_count":0,"watchers_count":0,"language":"Java","has_issues":false,"has_downloads":true,"has_wiki":false,"forks_count":0,"mirror_url":null,"open_issues_count":0,"forks":0,"open_issues":0,"watchers":0,"default_branch":"master"}},"base":{"label":"Bukkit:master","ref":"master","sha":"d3ab9468c3aed2a06c280bf6c9cea5108c736dcc","user":{"login":"Bukkit","id":544609,"avatar_url":"https://avatars.githubusercontent.com/u/544609?","gravatar_id":"cafe4b8d296dd981f519b7789b9159de","url":"https://api.github.com/users/Bukkit","html_url":"https://github.com/Bukkit","followers_url":"https://api.github.com/users/Bukkit/followers","following_url":"https://api.github.com/users/Bukkit/following{/other_user}","gists_url":"https://api.github.com/users/Bukkit/gists{/gist_id}","starred_url":"https://api.github.com/users/Bukkit/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/Bukkit/subscriptions","organizations_url":"https://api.github.com/users/Bukkit/orgs","repos_url":"https://api.github.com/users/Bukkit/repos","events_url":"https://api.github.com/users/Bukkit/events{/privacy}","received_events_url":"https://api.github.com/users/Bukkit/received_events","type":"Organization","site_admin":false},"repo":{"id":1215215,"name":"Bukkit","full_name":"Bukkit/Bukkit","owner":{"login":"Bukkit","id":544609,"avatar_url":"https://avatars.githubusercontent.com/u/544609?","gravatar_id":"cafe4b8d296dd981f519b7789b9159de","url":"https://api.github.com/users/Bukkit","html_url":"https://github.com/Bukkit","followers_url":"https://api.github.com/users/Bukkit/followers","following_url":"https://api.github.com/users/Bukkit/following{/other_user}","gists_url":"https://api.github.com/users/Bukkit/gists{/gist_id}","starred_url":"https://api.github.com/users/Bukkit/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/Bukkit/subscriptions","organizations_url":"https://api.github.com/users/Bukkit/orgs","repos_url":"https://api.github.com/users/Bukkit/repos","events_url":"https://api.github.com/users/Bukkit/events{/privacy}","received_events_url":"https://api.github.com/users/Bukkit/received_events","type":"Organization","site_admin":false},"private":false,"html_url":"https://github.com/Bukkit/Bukkit","description":"The Minecraft Mod API","fork":false,"url":"https://api.github.com/repos/Bukkit/Bukkit","forks_url":"https://api.github.com/repos/Bukkit/Bukkit/forks","keys_url":"https://api.github.com/repos/Bukkit/Bukkit/keys{/key_id}","collaborators_url":"https://api.github.com/repos/Bukkit/Bukkit/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/Bukkit/Bukkit/teams","hooks_url":"https://api.github.com/repos/Bukkit/Bukkit/hooks","issue_events_url":"https://api.github.com/repos/Bukkit/Bukkit/issues/events{/number}","events_url":"https://api.github.com/repos/Bukkit/Bukkit/events","assignees_url":"https://api.github.com/repos/Bukkit/Bukkit/assignees{/user}","branches_url":"https://api.github.com/repos/Bukkit/Bukkit/branches{/branch}","tags_url":"https://api.github.com/repos/Bukkit/Bukkit/tags","blobs_url":"https://api.github.com/repos/Bukkit/Bukkit/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/Bukkit/Bukkit/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/Bukkit/Bukkit/git/refs{/sha}","trees_url":"https://api.github.com/repos/Bukkit/Bukkit/git/trees{/sha}","statuses_url":"https://api.github.com/repos/Bukkit/Bukkit/statuses/{sha}","languages_url":"https://api.github.com/repos/Bukkit/Bukkit/languages","stargazers_url":"https://api.github.com/repos/Bukkit/Bukkit/stargazers","contributors_url":"https://api.github.com/repos/Bukkit/Bukkit/contributors","subscribers_url":"https://api.github.com/repos/Bukkit/Bukkit/subscribers","subscription_url":"https://api.github.com/repos/Bukkit/Bukkit/subscription","commits_url":"https://api.github.com/repos/Bukkit/Bukkit/commits{/sha}","git_commits_url":"https://api.github.com/repos/Bukkit/Bukkit/git/commits{/sha}","comments_url":"https://api.github.com/repos/Bukkit/Bukkit/comments{/number}","issue_comment_url":"https://api.github.com/repos/Bukkit/Bukkit/issues/comments/{number}","contents_url":"https://api.github.com/repos/Bukkit/Bukkit/contents/{+path}","compare_url":"https://api.github.com/repos/Bukkit/Bukkit/compare/{base}...{head}","merges_url":"https://api.github.com/repos/Bukkit/Bukkit/merges","archive_url":"https://api.github.com/repos/Bukkit/Bukkit/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/Bukkit/Bukkit/downloads","issues_url":"https://api.github.com/repos/Bukkit/Bukkit/issues{/number}","pulls_url":"https://api.github.com/repos/Bukkit/Bukkit/pulls{/number}","milestones_url":"https://api.github.com/repos/Bukkit/Bukkit/milestones{/number}","notifications_url":"https://api.github.com/repos/Bukkit/Bukkit/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/Bukkit/Bukkit/labels{/name}","releases_url":"https://api.github.com/repos/Bukkit/Bukkit/releases{/id}","created_at":"2011-01-02T23:47:25Z","updated_at":"2014-07-21T16:46:02Z","pushed_at":"2014-07-10T00:01:09Z","git_url":"git://github.com/Bukkit/Bukkit.git","ssh_url":"git@github.com:Bukkit/Bukkit.git","clone_url":"https://github.com/Bukkit/Bukkit.git","svn_url":"https://github.com/Bukkit/Bukkit","homepage":"http://bukkit.org","size":19691,"stargazers_count":1516,"watchers_count":1516,"language":"Java","has_issues":false,"has_downloads":true,"has_wiki":false,"forks_count":969,"mirror_url":null,"open_issues_count":74,"forks":969,"open_issues":74,"watchers":1516,"default_branch":"master"}},"_links":{"self":{"href":"https://api.github.com/repos/Bukkit/Bukkit/pulls/1077"},"html":{"href":"https://github.com/Bukkit/Bukkit/pull/1077"},"issue":{"href":"https://api.github.com/repos/Bukkit/Bukkit/issues/1077"},"comments":{"href":"https://api.github.com/repos/Bukkit/Bukkit/issues/1077/comments"},"review_comments":{"href":"https://api.github.com/repos/Bukkit/Bukkit/pulls/1077/comments"},"review_comment":{"href":"https://api.github.com/repos/Bukkit/Bukkit/pulls/comments/{number}"},"commits":{"href":"https://api.github.com/repos/Bukkit/Bukkit/pulls/1077/commits"},"statuses":{"href":"https://api.github.com/repos/Bukkit/Bukkit/statuses/fa1a2e2e43a3d390f9a73ca6bb88ed3c597d21e0"}}}}