{"action":"created","comment":{"url":"https://api.github.com/repos/ElementalAlchemist/txircd/pulls/comments/30471391","id":30471391,"diff_hunk":"@@ -372,7 +374,111 @@ def reloadModule(self, moduleName):\n \t\telse:\n \t\t\tdeferList.addCallback(lambda result: self.loadModule(moduleName))\n \t\treturn deferList\n-\t\n+\n+\tdef verifyConfig(self, config):\n+\t\t# Verify the configuration values that are used in the core first.\n+\n+\t\t# IRCd\n+\t\tif not isinstance(config[\"bind_client\"], list):\n+\t\t\traise ConfigValidationError(\"bind_client\", \"value must be a list\")\n+\t\tfor bindDesc in config[\"bind_client\"]:\n+\t\t\tif not isinstance(bindDesc, str):\n+\t\t\t\traise ConfigValidationError(\"bind_client\", \"every entry must be a string\")\n+\t\tif not isinstance(config[\"bind_server\"], list):\n+\t\t\traise ConfigValidationError(\"bind_server\", \"value must be a list\")\n+\t\tfor bindDesc in config[\"bind_server\"]:\n+\t\t\tif not isinstance(bindDesc, str):\n+\t\t\t\traise ConfigValidationError(\"bind_server\", \"every entry must be a string\")\n+\t\tif not isinstance(config[\"modules\"], list):\n+\t\t\traise ConfigValidationError(\"modules\", \"value must be a list\")\n+\t\tfor module in config[\"modules\"]:\n+\t\t\tif not isinstance(module, str):\n+\t\t\t\traise ConfigValidationError(\"modules\", \"every entry must be a string\")\n+\t\tif \"links\" in config:\n+\t\t\tif not isinstance(config[\"links\"], dict):\n+\t\t\t\traise ConfigValidationError(\"links\", \"value must be a dictionary\")\n+\t\t\tfor desc, server in config[\"links\"].iteritems():\n+\t\t\t\tif not isinstance(desc, str):\n+\t\t\t\t\traise ConfigValidationError(\"links\", \"\\\"{}\\\" is an invalid server description\".format(desc))\n+\t\t\t\tif not isinstance(server, dict):\n+\t\t\t\t\traise ConfigValidationError(\"links\", \"values for \\\"{}\\\" must be a dictionary\".format(desc))\n+\t\t\t\tif \"connect_descriptor\" not in server:\n+\t\t\t\t\traise ConfigValidationError(\"links\", \"server \\\"{}\\\" must contain a \\\"connect_descriptor\\\" value\".format(desc))\n+\t\t\t\tif \"in_password\" in server:\n+\t\t\t\t\tif not isinstance(server[\"in_password\"], str):\n+\t\t\t\t\t\tconfig[\"links\"][desc][\"in_password\"] = str(server[\"in_password\"])\n+\t\t\t\tif \"out_password\" in server:\n+\t\t\t\t\tif not isinstance(server[\"out_password\"], str):\n+\t\t\t\t\t\tconfig[\"links\"][desc][\"out_password\"] = str(server[\"out_password\"])\n+\t\tif \"datastore_path\" not in config:\n+\t\t\tconfig[\"datastore_path\"] = \"data.db\"\n+\t\tif not os.access(config[\"datastore_path\"], os.W_OK):\n+\t\t\traise ConfigValidationError(\"datastore_path\", \"path is invalid or txircd does not have write access\")\n+\t\tif \"storage_sync_interval\" in config and not isinstance(config[\"storage_sync_interval\"], int):\n+\t\t\traise ConfigValidationError(config[\"storage_sync_interval\"], \"invalid number\")\n+\n+\t\t# Channels\n+\t\tif \"channel_name_length\" in config:\n+\t\t\tif not isinstance(config[\"channel_name_length\"], int) or config[\"channel_name_length\"] < 0:\n+\t\t\t\traise ConfigValidationError(\"channel_name_length\", \"invalid number\")\n+\t\t\telif config[\"channel_name_length\"] > 32:\n+\t\t\t\tconfig[\"channel_name_length\"] = 32\n+\t\t\t\tself.logConfigValidationWarning(\"channel_name_length\", \"value is too large\", 32)\n+\t\tif \"modes_per_line\" in config:\n+\t\t\tif not isinstance(config[\"modes_per_line\"], int) or config[\"modes_per_line\"] < 0:\n+\t\t\t\traise ConfigValidationError(\"modes_per_line\", \"invalid number\")\n+\t\t\telif config[\"modes_per_line\"] > 20:\n+\t\t\t\tconfig[\"modes_per_line\"] = 20\n+\t\t\t\tself.logConfigValidationWarning(\"modes_per_line\", \"value is too large\", 20)\n+\t\tif \"channel_listmode_limit\" in config and (not isinstance(config[\"channel_listmode_limit\"], int) or config[\"channel_listmode_limit\"] < 0):\n+\t\t\traise ConfigValidationError(\"channel_listmode_limit\", \"invalid number\")\n+\n+\t\t# Users\n+\t\tif \"user_registration_timeout\" in config:\n+\t\t\tif not isinstance(config[\"user_registration_timeout\"], int) or config[\"user_registration_timeout\"] < 0:\n+\t\t\t\traise ConfigValidationError(\"user_registration_timeout\", \"invalid number\")\n+\t\t\telif config[\"user_registration_timeout\"] < 10:\n+\t\t\t\tconfig[\"user_registration_timeout\"] = 10\n+\t\t\t\tself.logConfigValidationWarning(\"user_registration_timeout\", \"timeout could be too short for clients to register in time\", 10)\n+\t\tif \"user_ping_frequency\" in config and (not isinstance(config[\"user_ping_frequency\"], int) or config[\"user_ping_frequency\"] < 0):\n+\t\t\traise ConfigValidationError(\"user_ping_frequency\", \"invalid number\")\n+\t\tif \"hostname_length\" in config:\n+\t\t\tif not isinstance(config[\"hostname_length\"], int) or config[\"hostname_length\"] < 0:\n+\t\t\t\traise ConfigValidationError(\"hostname_length\", \"invalid number\")\n+\t\t\telif config[\"hostname_length\"] > 64:\n+\t\t\t\tconfig[\"hostname_length\"] = 64\n+\t\t\t\tself.logConfigValidationWarning(\"hostname_length\", \"value is too large\", 64)\n+\t\tif \"ident_length\" in config:\n+\t\t\tif not isinstance(config[\"ident_length\"], int) or config[\"ident_length\"] < 0:\n+\t\t\t\traise ConfigValidationError(\"ident_length\", \"invalid number\")\n+\t\t\telif config[\"ident_length\"] > 12:\n+\t\t\t\tconfig[\"ident_length\"] = 12\n+\t\t\t\tself.logConfigValidationWarning(\"ident_length\", \"value is too large\", 12)\n+\t\tif \"gecos_length\" in config:\n+\t\t\tif not isinstance(config[\"gecos_length\"], int) or config[\"gecos_length\"] < 0:\n+\t\t\t\traise ConfigValidationError(\"gecos_length\", \"invalid number\")\n+\t\t\telif config[\"gecos_length\"] > 128:\n+\t\t\t\tconfig[\"gecos_length\"] = 128\n+\t\t\t\tself.logConfigValidationWarning(\"gecos_length\", \"value is too large\", 128)\n+\t\tif \"user_listmode_limit\" in config and (not isinstance(config[\"user_listmode_limit\"], int) or config[\"user_listmode_limit\"] < 0):\n+\t\t\traise ConfigValidationError(\"user_listmode_limit\", \"invalid number\")\n+\n+\t\t# Servers\n+\t\tif \"server_registration_timeout\" in config:\n+\t\t\tif not isinstance(config[\"server_registration_timeout\"], int) or config[\"server_registration_timeout\"] < 0:\n+\t\t\t\traise ConfigValidationError(\"server_registration_timeout\", \"invalid number\")\n+\t\t\telif config[\"server_registration_timeout\"] < 10:\n+\t\t\t\tconfig[\"server_registration_timeout\"] = 10\n+\t\t\t\tself.logConfigValidationWarning(\"server_registration_timeout\", \"timeout could be too short for servers to register in time\", 10)\n+\t\tif \"server_ping_frequency\" in config and (not isinstance(config[\"server_ping_frequency\"], int) or config[\"server_ping_frequency\"] < 0):\n+\t\t\traise ConfigValidationError(\"server_ping_frequency\", \"invalid number\")\n+\n+\t\tfor module in self.loadedModules.itervalues():\n+\t\t\tmodule.veryifyConfig(config)\n+\n+\tdef logConfigValidationWarning(self, key, message, default):","path":"txircd/ircd.py","position":163,"original_position":163,"commit_id":"7bb63aee0b52a78d9b91ac21df58016da70a6a6c","original_commit_id":"7bb63aee0b52a78d9b91ac21df58016da70a6a6c","user":{"login":"Heufneutje","id":1357231,"avatar_url":"https://avatars.githubusercontent.com/u/1357231?v=3","gravatar_id":"","url":"https://api.github.com/users/Heufneutje","html_url":"https://github.com/Heufneutje","followers_url":"https://api.github.com/users/Heufneutje/followers","following_url":"https://api.github.com/users/Heufneutje/following{/other_user}","gists_url":"https://api.github.com/users/Heufneutje/gists{/gist_id}","starred_url":"https://api.github.com/users/Heufneutje/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/Heufneutje/subscriptions","organizations_url":"https://api.github.com/users/Heufneutje/orgs","repos_url":"https://api.github.com/users/Heufneutje/repos","events_url":"https://api.github.com/users/Heufneutje/events{/privacy}","received_events_url":"https://api.github.com/users/Heufneutje/received_events","type":"User","site_admin":false},"body":"It can.","created_at":"2015-05-17T15:33:16Z","updated_at":"2015-05-17T15:33:16Z","html_url":"https://github.com/ElementalAlchemist/txircd/pull/116#discussion_r30471391","pull_request_url":"https://api.github.com/repos/ElementalAlchemist/txircd/pulls/116","_links":{"self":{"href":"https://api.github.com/repos/ElementalAlchemist/txircd/pulls/comments/30471391"},"html":{"href":"https://github.com/ElementalAlchemist/txircd/pull/116#discussion_r30471391"},"pull_request":{"href":"https://api.github.com/repos/ElementalAlchemist/txircd/pulls/116"}}},"pull_request":{"url":"https://api.github.com/repos/ElementalAlchemist/txircd/pulls/116","id":35543333,"html_url":"https://github.com/ElementalAlchemist/txircd/pull/116","diff_url":"https://github.com/ElementalAlchemist/txircd/pull/116.diff","patch_url":"https://github.com/ElementalAlchemist/txircd/pull/116.patch","issue_url":"https://api.github.com/repos/ElementalAlchemist/txircd/issues/116","number":116,"state":"open","locked":false,"title":"Limit changes and config validation","user":{"login":"Heufneutje","id":1357231,"avatar_url":"https://avatars.githubusercontent.com/u/1357231?v=3","gravatar_id":"","url":"https://api.github.com/users/Heufneutje","html_url":"https://github.com/Heufneutje","followers_url":"https://api.github.com/users/Heufneutje/followers","following_url":"https://api.github.com/users/Heufneutje/following{/other_user}","gists_url":"https://api.github.com/users/Heufneutje/gists{/gist_id}","starred_url":"https://api.github.com/users/Heufneutje/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/Heufneutje/subscriptions","organizations_url":"https://api.github.com/users/Heufneutje/orgs","repos_url":"https://api.github.com/users/Heufneutje/repos","events_url":"https://api.github.com/users/Heufneutje/events{/privacy}","received_events_url":"https://api.github.com/users/Heufneutje/received_events","type":"User","site_admin":false},"body":"Since we're still in the breakage phase of txircd 0.4, I give you a breaking, yet valuable in my opinion, change.\r\n\r\nSo let's go over the things that are in this PR:\r\n- Replacement of a lot of magic numbers with configurable equivalents. I kinda took this upon myself because the amount of magic numbers we have bothered me. Making these configurable is, in my opinion, a change that will not only make the codebase cleaner and assure that these numbers are always the same in all cases (see my fix in TOPICLEN for an example on this one), but also make txircd a lot more configurable for our users. One could argue that a lot of these numbers should never be changed, but I prefer going the InspIRCd route of \"configurable but discouraged\" over \"not configurable at all\". Besides, we already had some of them configurable. It doesn't really make sense to make some configurable and some hardcoded.\r\n\r\n- The addition of a few new limits. We did not yet have limits on our gecos, our AWAY messages and our KICK reasons. In my opinion they should be present since I was working on the limits anyway, I added them. The default values were taken from InspIRCd.\r\n\r\n- Modularization of extra ISUPPORT tokens. The last change is for the ISUPPORT dictionary generation, which now allows modules to add their own tokens on top of the default ones we already have. In theory we could even move the tokens that belong to core modules to their respective modules, but I'll let you be the judge on that one.","created_at":"2015-05-15T19:29:27Z","updated_at":"2015-05-17T15:33:16Z","closed_at":null,"merged_at":null,"merge_commit_sha":"f117b4300467d8e28383cf602f650bcca4997ff8","assignee":null,"milestone":null,"commits_url":"https://api.github.com/repos/ElementalAlchemist/txircd/pulls/116/commits","review_comments_url":"https://api.github.com/repos/ElementalAlchemist/txircd/pulls/116/comments","review_comment_url":"https://api.github.com/repos/ElementalAlchemist/txircd/pulls/comments{/number}","comments_url":"https://api.github.com/repos/ElementalAlchemist/txircd/issues/116/comments","statuses_url":"https://api.github.com/repos/ElementalAlchemist/txircd/statuses/7bb63aee0b52a78d9b91ac21df58016da70a6a6c","head":{"label":"Heufneutje:limit-overhaul-and-isupport","ref":"limit-overhaul-and-isupport","sha":"7bb63aee0b52a78d9b91ac21df58016da70a6a6c","user":{"login":"Heufneutje","id":1357231,"avatar_url":"https://avatars.githubusercontent.com/u/1357231?v=3","gravatar_id":"","url":"https://api.github.com/users/Heufneutje","html_url":"https://github.com/Heufneutje","followers_url":"https://api.github.com/users/Heufneutje/followers","following_url":"https://api.github.com/users/Heufneutje/following{/other_user}","gists_url":"https://api.github.com/users/Heufneutje/gists{/gist_id}","starred_url":"https://api.github.com/users/Heufneutje/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/Heufneutje/subscriptions","organizations_url":"https://api.github.com/users/Heufneutje/orgs","repos_url":"https://api.github.com/users/Heufneutje/repos","events_url":"https://api.github.com/users/Heufneutje/events{/privacy}","received_events_url":"https://api.github.com/users/Heufneutje/received_events","type":"User","site_admin":false},"repo":{"id":28537151,"name":"txircd","full_name":"Heufneutje/txircd","owner":{"login":"Heufneutje","id":1357231,"avatar_url":"https://avatars.githubusercontent.com/u/1357231?v=3","gravatar_id":"","url":"https://api.github.com/users/Heufneutje","html_url":"https://github.com/Heufneutje","followers_url":"https://api.github.com/users/Heufneutje/followers","following_url":"https://api.github.com/users/Heufneutje/following{/other_user}","gists_url":"https://api.github.com/users/Heufneutje/gists{/gist_id}","starred_url":"https://api.github.com/users/Heufneutje/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/Heufneutje/subscriptions","organizations_url":"https://api.github.com/users/Heufneutje/orgs","repos_url":"https://api.github.com/users/Heufneutje/repos","events_url":"https://api.github.com/users/Heufneutje/events{/privacy}","received_events_url":"https://api.github.com/users/Heufneutje/received_events","type":"User","site_admin":false},"private":false,"html_url":"https://github.com/Heufneutje/txircd","description":"Twisted IRC Daemon","fork":true,"url":"https://api.github.com/repos/Heufneutje/txircd","forks_url":"https://api.github.com/repos/Heufneutje/txircd/forks","keys_url":"https://api.github.com/repos/Heufneutje/txircd/keys{/key_id}","collaborators_url":"https://api.github.com/repos/Heufneutje/txircd/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/Heufneutje/txircd/teams","hooks_url":"https://api.github.com/repos/Heufneutje/txircd/hooks","issue_events_url":"https://api.github.com/repos/Heufneutje/txircd/issues/events{/number}","events_url":"https://api.github.com/repos/Heufneutje/txircd/events","assignees_url":"https://api.github.com/repos/Heufneutje/txircd/assignees{/user}","branches_url":"https://api.github.com/repos/Heufneutje/txircd/branches{/branch}","tags_url":"https://api.github.com/repos/Heufneutje/txircd/tags","blobs_url":"https://api.github.com/repos/Heufneutje/txircd/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/Heufneutje/txircd/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/Heufneutje/txircd/git/refs{/sha}","trees_url":"https://api.github.com/repos/Heufneutje/txircd/git/trees{/sha}","statuses_url":"https://api.github.com/repos/Heufneutje/txircd/statuses/{sha}","languages_url":"https://api.github.com/repos/Heufneutje/txircd/languages","stargazers_url":"https://api.github.com/repos/Heufneutje/txircd/stargazers","contributors_url":"https://api.github.com/repos/Heufneutje/txircd/contributors","subscribers_url":"https://api.github.com/repos/Heufneutje/txircd/subscribers","subscription_url":"https://api.github.com/repos/Heufneutje/txircd/subscription","commits_url":"https://api.github.com/repos/Heufneutje/txircd/commits{/sha}","git_commits_url":"https://api.github.com/repos/Heufneutje/txircd/git/commits{/sha}","comments_url":"https://api.github.com/repos/Heufneutje/txircd/comments{/number}","issue_comment_url":"https://api.github.com/repos/Heufneutje/txircd/issues/comments{/number}","contents_url":"https://api.github.com/repos/Heufneutje/txircd/contents/{+path}","compare_url":"https://api.github.com/repos/Heufneutje/txircd/compare/{base}...{head}","merges_url":"https://api.github.com/repos/Heufneutje/txircd/merges","archive_url":"https://api.github.com/repos/Heufneutje/txircd/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/Heufneutje/txircd/downloads","issues_url":"https://api.github.com/repos/Heufneutje/txircd/issues{/number}","pulls_url":"https://api.github.com/repos/Heufneutje/txircd/pulls{/number}","milestones_url":"https://api.github.com/repos/Heufneutje/txircd/milestones{/number}","notifications_url":"https://api.github.com/repos/Heufneutje/txircd/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/Heufneutje/txircd/labels{/name}","releases_url":"https://api.github.com/repos/Heufneutje/txircd/releases{/id}","created_at":"2014-12-27T13:21:15Z","updated_at":"2015-04-29T07:42:15Z","pushed_at":"2015-05-17T13:35:03Z","git_url":"git://github.com/Heufneutje/txircd.git","ssh_url":"git@github.com:Heufneutje/txircd.git","clone_url":"https://github.com/Heufneutje/txircd.git","svn_url":"https://github.com/Heufneutje/txircd","homepage":null,"size":3860,"stargazers_count":0,"watchers_count":0,"language":"Python","has_issues":false,"has_downloads":true,"has_wiki":false,"has_pages":false,"forks_count":0,"mirror_url":null,"open_issues_count":0,"forks":0,"open_issues":0,"watchers":0,"default_branch":"dev/next"}},"base":{"label":"ElementalAlchemist:dev/next","ref":"dev/next","sha":"36817dd3dac483a89b86f040ac573e55229067d4","user":{"login":"ElementalAlchemist","id":115662,"avatar_url":"https://avatars.githubusercontent.com/u/115662?v=3","gravatar_id":"","url":"https://api.github.com/users/ElementalAlchemist","html_url":"https://github.com/ElementalAlchemist","followers_url":"https://api.github.com/users/ElementalAlchemist/followers","following_url":"https://api.github.com/users/ElementalAlchemist/following{/other_user}","gists_url":"https://api.github.com/users/ElementalAlchemist/gists{/gist_id}","starred_url":"https://api.github.com/users/ElementalAlchemist/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/ElementalAlchemist/subscriptions","organizations_url":"https://api.github.com/users/ElementalAlchemist/orgs","repos_url":"https://api.github.com/users/ElementalAlchemist/repos","events_url":"https://api.github.com/users/ElementalAlchemist/events{/privacy}","received_events_url":"https://api.github.com/users/ElementalAlchemist/received_events","type":"User","site_admin":false},"repo":{"id":6614056,"name":"txircd","full_name":"ElementalAlchemist/txircd","owner":{"login":"ElementalAlchemist","id":115662,"avatar_url":"https://avatars.githubusercontent.com/u/115662?v=3","gravatar_id":"","url":"https://api.github.com/users/ElementalAlchemist","html_url":"https://github.com/ElementalAlchemist","followers_url":"https://api.github.com/users/ElementalAlchemist/followers","following_url":"https://api.github.com/users/ElementalAlchemist/following{/other_user}","gists_url":"https://api.github.com/users/ElementalAlchemist/gists{/gist_id}","starred_url":"https://api.github.com/users/ElementalAlchemist/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/ElementalAlchemist/subscriptions","organizations_url":"https://api.github.com/users/ElementalAlchemist/orgs","repos_url":"https://api.github.com/users/ElementalAlchemist/repos","events_url":"https://api.github.com/users/ElementalAlchemist/events{/privacy}","received_events_url":"https://api.github.com/users/ElementalAlchemist/received_events","type":"User","site_admin":false},"private":false,"html_url":"https://github.com/ElementalAlchemist/txircd","description":"Twisted IRC Daemon","fork":true,"url":"https://api.github.com/repos/ElementalAlchemist/txircd","forks_url":"https://api.github.com/repos/ElementalAlchemist/txircd/forks","keys_url":"https://api.github.com/repos/ElementalAlchemist/txircd/keys{/key_id}","collaborators_url":"https://api.github.com/repos/ElementalAlchemist/txircd/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/ElementalAlchemist/txircd/teams","hooks_url":"https://api.github.com/repos/ElementalAlchemist/txircd/hooks","issue_events_url":"https://api.github.com/repos/ElementalAlchemist/txircd/issues/events{/number}","events_url":"https://api.github.com/repos/ElementalAlchemist/txircd/events","assignees_url":"https://api.github.com/repos/ElementalAlchemist/txircd/assignees{/user}","branches_url":"https://api.github.com/repos/ElementalAlchemist/txircd/branches{/branch}","tags_url":"https://api.github.com/repos/ElementalAlchemist/txircd/tags","blobs_url":"https://api.github.com/repos/ElementalAlchemist/txircd/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/ElementalAlchemist/txircd/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/ElementalAlchemist/txircd/git/refs{/sha}","trees_url":"https://api.github.com/repos/ElementalAlchemist/txircd/git/trees{/sha}","statuses_url":"https://api.github.com/repos/ElementalAlchemist/txircd/statuses/{sha}","languages_url":"https://api.github.com/repos/ElementalAlchemist/txircd/languages","stargazers_url":"https://api.github.com/repos/ElementalAlchemist/txircd/stargazers","contributors_url":"https://api.github.com/repos/ElementalAlchemist/txircd/contributors","subscribers_url":"https://api.github.com/repos/ElementalAlchemist/txircd/subscribers","subscription_url":"https://api.github.com/repos/ElementalAlchemist/txircd/subscription","commits_url":"https://api.github.com/repos/ElementalAlchemist/txircd/commits{/sha}","git_commits_url":"https://api.github.com/repos/ElementalAlchemist/txircd/git/commits{/sha}","comments_url":"https://api.github.com/repos/ElementalAlchemist/txircd/comments{/number}","issue_comment_url":"https://api.github.com/repos/ElementalAlchemist/txircd/issues/comments{/number}","contents_url":"https://api.github.com/repos/ElementalAlchemist/txircd/contents/{+path}","compare_url":"https://api.github.com/repos/ElementalAlchemist/txircd/compare/{base}...{head}","merges_url":"https://api.github.com/repos/ElementalAlchemist/txircd/merges","archive_url":"https://api.github.com/repos/ElementalAlchemist/txircd/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/ElementalAlchemist/txircd/downloads","issues_url":"https://api.github.com/repos/ElementalAlchemist/txircd/issues{/number}","pulls_url":"https://api.github.com/repos/ElementalAlchemist/txircd/pulls{/number}","milestones_url":"https://api.github.com/repos/ElementalAlchemist/txircd/milestones{/number}","notifications_url":"https://api.github.com/repos/ElementalAlchemist/txircd/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/ElementalAlchemist/txircd/labels{/name}","releases_url":"https://api.github.com/repos/ElementalAlchemist/txircd/releases{/id}","created_at":"2012-11-09T13:49:39Z","updated_at":"2015-04-30T03:59:21Z","pushed_at":"2015-05-17T13:35:04Z","git_url":"git://github.com/ElementalAlchemist/txircd.git","ssh_url":"git@github.com:ElementalAlchemist/txircd.git","clone_url":"https://github.com/ElementalAlchemist/txircd.git","svn_url":"https://github.com/ElementalAlchemist/txircd","homepage":null,"size":7091,"stargazers_count":3,"watchers_count":3,"language":"Python","has_issues":true,"has_downloads":true,"has_wiki":false,"has_pages":false,"forks_count":2,"mirror_url":null,"open_issues_count":2,"forks":2,"open_issues":2,"watchers":3,"default_branch":"dev/next"}},"_links":{"self":{"href":"https://api.github.com/repos/ElementalAlchemist/txircd/pulls/116"},"html":{"href":"https://github.com/ElementalAlchemist/txircd/pull/116"},"issue":{"href":"https://api.github.com/repos/ElementalAlchemist/txircd/issues/116"},"comments":{"href":"https://api.github.com/repos/ElementalAlchemist/txircd/issues/116/comments"},"review_comments":{"href":"https://api.github.com/repos/ElementalAlchemist/txircd/pulls/116/comments"},"review_comment":{"href":"https://api.github.com/repos/ElementalAlchemist/txircd/pulls/comments{/number}"},"commits":{"href":"https://api.github.com/repos/ElementalAlchemist/txircd/pulls/116/commits"},"statuses":{"href":"https://api.github.com/repos/ElementalAlchemist/txircd/statuses/7bb63aee0b52a78d9b91ac21df58016da70a6a6c"}}}}