{"action":"created","comment":{"url":"https://api.github.com/repos/triplea-game/dice-server-js/pulls/comments/238072870","pull_request_review_id":180533050,"id":238072870,"node_id":"MDI0OlB1bGxSZXF1ZXN0UmV2aWV3Q29tbWVudDIzODA3Mjg3MA==","diff_hunk":"@@ -1,3 +1,167 @@\n [![Travis](https://img.shields.io/travis/triplea-game/dice-server-js.svg?style=flat-square)](https://travis-ci.org/triplea-game/dice-server-js)\n # dice-server-js\n-The new TripleA dice server powered by Node.js\n+The new TripleA dice server re-written in JavaScript.\n+\n+## Setup\n+### Prequisites\n+In order to be able to run the server you need to have a couple of things installed on your system:\n+ - `node.js` >= 10\n+ - `yarn`\n+ - `postgres` >= 10\n+After those are installed on your system you can follow the steps below to get yourself up and running.\n+The steps assume node and yarn are on the `PATH` of your system, if that's not the case, you need to replace `node` and `yarn` with the full qualified path name to the executable.\n+\n+### One-Time-Setup\n+1. Clone this Repository in a directory of your choice.\n+2. Open a terminal and navigate to the newly checked out directory.\n+3. Run `yarn install`, this will resolve all dependencies for you and install them in `node_modules`\n+4. - Generate an RSA key-pair, if you have installed `openssl` and it's on your PATH, you can simply run `yarn generate-keypair`, which will create the files `privkey.pem` and `pubkey.pem` in the current directory.\n+   - On productive systems you should move them into a \"save directory\" and (at least on UNIX-like systems) restrict read access of the private key to the user that's going to run the server and root.\n+5. - Create a file `config.json` which contains all information the server needs to start.\n+   - Alternatively those configuration options can be passed via CLI directly or as environment variables, check the [nconf docs](https://github.com/indexzero/nconf#example) for more information.\n+   - The config files' Layout will be explained below.\n+6. Create a Database in postgres to be used by the Server.\n+   \n+#### config.json\n+```json\n+{\n+  \"port\": 7654,\n+  \"database\": {\n+    \"username\": \"postgres\",\n+    \"password\": \"\",\n+    \"host\": \"localhost\",\n+    \"port\": 5432,\n+    \"database\": \"dicedb\"\n+  },\n+  \"email\": {\n+    \"smtp\": {\n+      \"host\": \"smtp.provider.com\",\n+      \"port\": 587,\n+      \"auth\": {\n+        \"user\": \"your.email@provider.com\",\n+        \"pass\": \"super secret password no one will ever guess\"\n+      }\n+    },\n+    \"display\": {\n+      \"sender\": \"\\\"Display Name\\\" <your.email@provider.com>\",\n+      \"server\": {\n+        \"protocol\": \"http\",\n+        \"host\": \"localhost\",\n+        \"port\": 7654,\n+        \"baseurl\": \"\"\n+      }\n+    }\n+  },\n+  \"keys\": {\n+    \"private\": \"./privkey.pem\",\n+    \"public\": \"./pubkey.pem\"\n+  }\n+}\n+```\n+- `port`: The port node.js will listen on. Required.\n+- `database`: Details about the database connection. Required.\n+   - `username`: Username to authenticate with the Database. Default: `postgres`.\n+   - `password`: Password to authenticate with the Database. Default ` `.\n+   - `host`: Hostname to connect to the Database. Default `localhost`.\n+   - `port`: Port to connect to the Database. Default `5432`.\n+   - `database`: Name of the Database to use, this should be the Database you created in the one-time setup. Default `dicedb`.\n+- `email`: Settings that are used by the EmailManager. Required.\n+   - `smtp`: Nodemailer SMTP Configuration, this object will be passed directly to Nodemailer without any further processing. Check the [Nodemailer Docs](https://nodemailer.com/smtp/#general-options). If you need a service to test emails locally you can use [Ethereal](https://ethereal.email/), a dummy email service that doesn't actually sends emails but simulates a fully-featured SMTP server.\n+   - `display`: Display settings how the server will refer to itself in emails.\n+      - `sender`: The Entry for the `From:` field in the email, the actual email should be the correct one, otherwise the emails will likely land in SPAM Folders. Required.\n+      - `server`: Settings that define how the Server will refer to itself in E-Mails. Required.\n+         - `protocol`: The Protocol that should be used for this server in emails. Default `http`.\n+         - `host`: The hostname that should be used to refer to this server, ideally a domain. Default `localhost`.\n+         - `port`: The port that should be used to connect to this server, if used behind a reverse-proxy this should be the public port. Default: `7654`.\n+         - `baseurl`: In case your server is in a non-root installation, set this to the folder name. (Example `yourserver.com/dice` -> `/dice`.) Default ` `.\n+- `keys`:\n+   - `private`: Path to the private key used to sign dice rolls. Required.\n+   - `public`: Path to the public key used to sign dice rolls. Required.\n+   \n+### Starting\n+In order to start the server run\n+`node dice-server.js`\n+It can be terminated using `SIGTERM`, i.e. `Ctrl+C`\n+\n+### Testing\n+In order to run all local tests and eslint, you can simply run\n+`yarn test`\n+This is also the command that will be executed by Travis.\n+\n+## Routes\n+The dice server is divided into 2 seperate routers.\n+The REST Service handles all calls under `/api`.\n+All other requests are handled by the _frontend_ which basically wraps the API calls with a nice UI.\n+### API\n+All of the requests return JSON in the same format.\n+When successful:\n+```json\n+{\n+  \"status\": \"OK\",\n+  \"result\": {\n+    \"some info\": \"some value\",\n+    \"other info\": true\n+  }\n+}\n+```\n+`result` is optional, if it's not present this simply means that the server has no additional information for this request.\n+On Error:\n+```json\n+{\n+  \"status\": \"Error\",\n+  \"errors\": [\"List\", \"of\", \"error\", \"messages\"]\n+}\n+```\n+#### Routes\n+- POST `/api/roll`:\n+   - Required Parameters (POST Body, urlencoded):\n+      - `max` Integer. Specifies the highest outcome for each roll, must be <= 100.\n+      - `times` Integer. Specifies how many dice should be rolled, must be <= 100.\n+      - `email1` String. The first email to send the notification email to. This emails needs to be registered.\n+      - `email2` String. The second email to send the notification to. This email needs to be registered.\n+   - Generates `times` random numbers with a value in `[1, times]`.\n+   - Result\n+      - `dice` Integer Array: An array of the rolled dice.\n+      - `date` Integer: The current UNIX timestamp with millisecond precision, taken into account for the signature so the signature can't be reused in the future.\n+      - `signature`: The base64-encoded signature verifying the integrity of the rolled dice.\n+- GET `/api/verify/:token`:\n+   - `:token` Parameter:\n+      - This Parameter is actually a base64 encoded, urlencoded JSON string of roughly this scheme: `{ \"dice\": [1, 2, 3], \"date\": 121332, signature: \"base64encodedsignature\" }`\n+      - `dice` Integer Array: An array of the dice rolls to be verified.\n+      - `date` Integer: A Unix Timestamp of the exact millisecond the original request was made. Important for the signature, and could potentially be used to check if this signature was made with a legacy certificate.\n+      - `signature` String: A base64-encoded RSA signature that can be verified by the server.\n+      - Result:\n+         - `valid`: A Boolean indicating if the integrity could be confirmed.\n+- POST `/register`:\n+   - Required Parameters (POST Body, urlencoded):\n+      - `email` String: An email a confirmation email will be sent to.\n+   - A request to this endpoint sends an email to the specified email with a random 512-bit token that is only saved in the RAM and will expire after a maximum amount of 60 minutes.\n+- POST `/register/:token`:\n+   - `:token` Parameter:\n+      - This parameter is a base64 encoded random number to verify that the person registering the email actually has access.\n+      - If the token is wrong, the actual token automatically expires and a new confirmation email needs to be sent.\n+   - Required Parameters (POST Body, urlencoded):\n+      - `email` String: The email to compare the token with.\n+- POST `/unregister`\n+   - Required Parameters (POST Body, urlencoded):\n+      - `email` String: The email to remove from the database.\n+### Frontend\n+The _Frontend_ is being served using templates and the liquid format.\n+The same template engine is used for emails as well.\n+Basically all Pages consist of a classic HTML Form that gets replaced with a responsive AJAX system if JavaScript is available.\n+#### Routes\n+- GET `/`:\n+   - The index page, the page where users can register their emails.\n+- GET `/verify`:\n+   - The Page the emails redirect to to verify your emails.\n+   - Parameters:\n+      - `token` String: The token to pass to the `/api/verify` endpoint\n+- GET `/register`:\n+   - The Page the \"confirm-registration-email\" redirects to to press a confirm button in a user-friendly way.\n+   - Parameters:\n+      - `email` String: The email to confirm the registration for.\n+      - `token` String: The token to pass to the `/api/register/:token` endpoint","path":"README.md","position":164,"original_position":164,"commit_id":"8a0b9cb8573b16e1fd40236fca3d9be52cea9bfb","original_commit_id":"8a0b9cb8573b16e1fd40236fca3d9be52cea9bfb","user":{"login":"ssoloff","id":4826349,"node_id":"MDQ6VXNlcjQ4MjYzNDk=","avatar_url":"https://avatars2.githubusercontent.com/u/4826349?v=4","gravatar_id":"","url":"https://api.github.com/users/ssoloff","html_url":"https://github.com/ssoloff","followers_url":"https://api.github.com/users/ssoloff/followers","following_url":"https://api.github.com/users/ssoloff/following{/other_user}","gists_url":"https://api.github.com/users/ssoloff/gists{/gist_id}","starred_url":"https://api.github.com/users/ssoloff/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/ssoloff/subscriptions","organizations_url":"https://api.github.com/users/ssoloff/orgs","repos_url":"https://api.github.com/users/ssoloff/repos","events_url":"https://api.github.com/users/ssoloff/events{/privacy}","received_events_url":"https://api.github.com/users/ssoloff/received_events","type":"User","site_admin":false},"body":"```suggestion\r\n      - `token` String: The token to pass to the `/api/register/:token` endpoint.\r\n```","created_at":"2018-12-01T18:48:25Z","updated_at":"2018-12-01T18:53:04Z","html_url":"https://github.com/triplea-game/dice-server-js/pull/12#discussion_r238072870","pull_request_url":"https://api.github.com/repos/triplea-game/dice-server-js/pulls/12","author_association":"MEMBER","_links":{"self":{"href":"https://api.github.com/repos/triplea-game/dice-server-js/pulls/comments/238072870"},"html":{"href":"https://github.com/triplea-game/dice-server-js/pull/12#discussion_r238072870"},"pull_request":{"href":"https://api.github.com/repos/triplea-game/dice-server-js/pulls/12"}}},"pull_request":{"url":"https://api.github.com/repos/triplea-game/dice-server-js/pulls/12","id":235196327,"node_id":"MDExOlB1bGxSZXF1ZXN0MjM1MTk2MzI3","html_url":"https://github.com/triplea-game/dice-server-js/pull/12","diff_url":"https://github.com/triplea-game/dice-server-js/pull/12.diff","patch_url":"https://github.com/triplea-game/dice-server-js/pull/12.patch","issue_url":"https://api.github.com/repos/triplea-game/dice-server-js/issues/12","number":12,"state":"open","locked":false,"title":"Add documentation","user":{"login":"RoiEXLab","id":8350879,"node_id":"MDQ6VXNlcjgzNTA4Nzk=","avatar_url":"https://avatars0.githubusercontent.com/u/8350879?v=4","gravatar_id":"","url":"https://api.github.com/users/RoiEXLab","html_url":"https://github.com/RoiEXLab","followers_url":"https://api.github.com/users/RoiEXLab/followers","following_url":"https://api.github.com/users/RoiEXLab/following{/other_user}","gists_url":"https://api.github.com/users/RoiEXLab/gists{/gist_id}","starred_url":"https://api.github.com/users/RoiEXLab/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/RoiEXLab/subscriptions","organizations_url":"https://api.github.com/users/RoiEXLab/orgs","repos_url":"https://api.github.com/users/RoiEXLab/repos","events_url":"https://api.github.com/users/RoiEXLab/events{/privacy}","received_events_url":"https://api.github.com/users/RoiEXLab/received_events","type":"User","site_admin":false},"body":"Closes #3\r\n/cc @DanVanAtta ","created_at":"2018-12-01T14:29:38Z","updated_at":"2018-12-01T18:53:03Z","closed_at":null,"merged_at":null,"merge_commit_sha":"f9a5b5a30f9774621aaed6187875188c4a7790ba","assignee":null,"assignees":[],"requested_reviewers":[],"requested_teams":[],"labels":[],"milestone":null,"commits_url":"https://api.github.com/repos/triplea-game/dice-server-js/pulls/12/commits","review_comments_url":"https://api.github.com/repos/triplea-game/dice-server-js/pulls/12/comments","review_comment_url":"https://api.github.com/repos/triplea-game/dice-server-js/pulls/comments{/number}","comments_url":"https://api.github.com/repos/triplea-game/dice-server-js/issues/12/comments","statuses_url":"https://api.github.com/repos/triplea-game/dice-server-js/statuses/8a0b9cb8573b16e1fd40236fca3d9be52cea9bfb","head":{"label":"triplea-game:documentation","ref":"documentation","sha":"8a0b9cb8573b16e1fd40236fca3d9be52cea9bfb","user":{"login":"triplea-game","id":13318615,"node_id":"MDEyOk9yZ2FuaXphdGlvbjEzMzE4NjE1","avatar_url":"https://avatars0.githubusercontent.com/u/13318615?v=4","gravatar_id":"","url":"https://api.github.com/users/triplea-game","html_url":"https://github.com/triplea-game","followers_url":"https://api.github.com/users/triplea-game/followers","following_url":"https://api.github.com/users/triplea-game/following{/other_user}","gists_url":"https://api.github.com/users/triplea-game/gists{/gist_id}","starred_url":"https://api.github.com/users/triplea-game/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/triplea-game/subscriptions","organizations_url":"https://api.github.com/users/triplea-game/orgs","repos_url":"https://api.github.com/users/triplea-game/repos","events_url":"https://api.github.com/users/triplea-game/events{/privacy}","received_events_url":"https://api.github.com/users/triplea-game/received_events","type":"Organization","site_admin":false},"repo":{"id":100662460,"node_id":"MDEwOlJlcG9zaXRvcnkxMDA2NjI0NjA=","name":"dice-server-js","full_name":"triplea-game/dice-server-js","private":false,"owner":{"login":"triplea-game","id":13318615,"node_id":"MDEyOk9yZ2FuaXphdGlvbjEzMzE4NjE1","avatar_url":"https://avatars0.githubusercontent.com/u/13318615?v=4","gravatar_id":"","url":"https://api.github.com/users/triplea-game","html_url":"https://github.com/triplea-game","followers_url":"https://api.github.com/users/triplea-game/followers","following_url":"https://api.github.com/users/triplea-game/following{/other_user}","gists_url":"https://api.github.com/users/triplea-game/gists{/gist_id}","starred_url":"https://api.github.com/users/triplea-game/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/triplea-game/subscriptions","organizations_url":"https://api.github.com/users/triplea-game/orgs","repos_url":"https://api.github.com/users/triplea-game/repos","events_url":"https://api.github.com/users/triplea-game/events{/privacy}","received_events_url":"https://api.github.com/users/triplea-game/received_events","type":"Organization","site_admin":false},"html_url":"https://github.com/triplea-game/dice-server-js","description":"The new TripleA dice server powered by Node.js","fork":false,"url":"https://api.github.com/repos/triplea-game/dice-server-js","forks_url":"https://api.github.com/repos/triplea-game/dice-server-js/forks","keys_url":"https://api.github.com/repos/triplea-game/dice-server-js/keys{/key_id}","collaborators_url":"https://api.github.com/repos/triplea-game/dice-server-js/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/triplea-game/dice-server-js/teams","hooks_url":"https://api.github.com/repos/triplea-game/dice-server-js/hooks","issue_events_url":"https://api.github.com/repos/triplea-game/dice-server-js/issues/events{/number}","events_url":"https://api.github.com/repos/triplea-game/dice-server-js/events","assignees_url":"https://api.github.com/repos/triplea-game/dice-server-js/assignees{/user}","branches_url":"https://api.github.com/repos/triplea-game/dice-server-js/branches{/branch}","tags_url":"https://api.github.com/repos/triplea-game/dice-server-js/tags","blobs_url":"https://api.github.com/repos/triplea-game/dice-server-js/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/triplea-game/dice-server-js/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/triplea-game/dice-server-js/git/refs{/sha}","trees_url":"https://api.github.com/repos/triplea-game/dice-server-js/git/trees{/sha}","statuses_url":"https://api.github.com/repos/triplea-game/dice-server-js/statuses/{sha}","languages_url":"https://api.github.com/repos/triplea-game/dice-server-js/languages","stargazers_url":"https://api.github.com/repos/triplea-game/dice-server-js/stargazers","contributors_url":"https://api.github.com/repos/triplea-game/dice-server-js/contributors","subscribers_url":"https://api.github.com/repos/triplea-game/dice-server-js/subscribers","subscription_url":"https://api.github.com/repos/triplea-game/dice-server-js/subscription","commits_url":"https://api.github.com/repos/triplea-game/dice-server-js/commits{/sha}","git_commits_url":"https://api.github.com/repos/triplea-game/dice-server-js/git/commits{/sha}","comments_url":"https://api.github.com/repos/triplea-game/dice-server-js/comments{/number}","issue_comment_url":"https://api.github.com/repos/triplea-game/dice-server-js/issues/comments{/number}","contents_url":"https://api.github.com/repos/triplea-game/dice-server-js/contents/{+path}","compare_url":"https://api.github.com/repos/triplea-game/dice-server-js/compare/{base}...{head}","merges_url":"https://api.github.com/repos/triplea-game/dice-server-js/merges","archive_url":"https://api.github.com/repos/triplea-game/dice-server-js/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/triplea-game/dice-server-js/downloads","issues_url":"https://api.github.com/repos/triplea-game/dice-server-js/issues{/number}","pulls_url":"https://api.github.com/repos/triplea-game/dice-server-js/pulls{/number}","milestones_url":"https://api.github.com/repos/triplea-game/dice-server-js/milestones{/number}","notifications_url":"https://api.github.com/repos/triplea-game/dice-server-js/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/triplea-game/dice-server-js/labels{/name}","releases_url":"https://api.github.com/repos/triplea-game/dice-server-js/releases{/id}","deployments_url":"https://api.github.com/repos/triplea-game/dice-server-js/deployments","created_at":"2017-08-18T02:01:45Z","updated_at":"2018-12-01T18:10:05Z","pushed_at":"2018-12-01T18:12:36Z","git_url":"git://github.com/triplea-game/dice-server-js.git","ssh_url":"git@github.com:triplea-game/dice-server-js.git","clone_url":"https://github.com/triplea-game/dice-server-js.git","svn_url":"https://github.com/triplea-game/dice-server-js","homepage":null,"size":125,"stargazers_count":1,"watchers_count":1,"language":"JavaScript","has_issues":true,"has_projects":true,"has_downloads":true,"has_wiki":true,"has_pages":false,"forks_count":2,"mirror_url":null,"archived":false,"open_issues_count":3,"license":{"key":"agpl-3.0","name":"GNU Affero General Public License v3.0","spdx_id":"AGPL-3.0","url":"https://api.github.com/licenses/agpl-3.0","node_id":"MDc6TGljZW5zZTE="},"forks":2,"open_issues":3,"watchers":1,"default_branch":"master"}},"base":{"label":"triplea-game:master","ref":"master","sha":"55a6359855f0085a044d93deb123bc8030ba5734","user":{"login":"triplea-game","id":13318615,"node_id":"MDEyOk9yZ2FuaXphdGlvbjEzMzE4NjE1","avatar_url":"https://avatars0.githubusercontent.com/u/13318615?v=4","gravatar_id":"","url":"https://api.github.com/users/triplea-game","html_url":"https://github.com/triplea-game","followers_url":"https://api.github.com/users/triplea-game/followers","following_url":"https://api.github.com/users/triplea-game/following{/other_user}","gists_url":"https://api.github.com/users/triplea-game/gists{/gist_id}","starred_url":"https://api.github.com/users/triplea-game/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/triplea-game/subscriptions","organizations_url":"https://api.github.com/users/triplea-game/orgs","repos_url":"https://api.github.com/users/triplea-game/repos","events_url":"https://api.github.com/users/triplea-game/events{/privacy}","received_events_url":"https://api.github.com/users/triplea-game/received_events","type":"Organization","site_admin":false},"repo":{"id":100662460,"node_id":"MDEwOlJlcG9zaXRvcnkxMDA2NjI0NjA=","name":"dice-server-js","full_name":"triplea-game/dice-server-js","private":false,"owner":{"login":"triplea-game","id":13318615,"node_id":"MDEyOk9yZ2FuaXphdGlvbjEzMzE4NjE1","avatar_url":"https://avatars0.githubusercontent.com/u/13318615?v=4","gravatar_id":"","url":"https://api.github.com/users/triplea-game","html_url":"https://github.com/triplea-game","followers_url":"https://api.github.com/users/triplea-game/followers","following_url":"https://api.github.com/users/triplea-game/following{/other_user}","gists_url":"https://api.github.com/users/triplea-game/gists{/gist_id}","starred_url":"https://api.github.com/users/triplea-game/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/triplea-game/subscriptions","organizations_url":"https://api.github.com/users/triplea-game/orgs","repos_url":"https://api.github.com/users/triplea-game/repos","events_url":"https://api.github.com/users/triplea-game/events{/privacy}","received_events_url":"https://api.github.com/users/triplea-game/received_events","type":"Organization","site_admin":false},"html_url":"https://github.com/triplea-game/dice-server-js","description":"The new TripleA dice server powered by Node.js","fork":false,"url":"https://api.github.com/repos/triplea-game/dice-server-js","forks_url":"https://api.github.com/repos/triplea-game/dice-server-js/forks","keys_url":"https://api.github.com/repos/triplea-game/dice-server-js/keys{/key_id}","collaborators_url":"https://api.github.com/repos/triplea-game/dice-server-js/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/triplea-game/dice-server-js/teams","hooks_url":"https://api.github.com/repos/triplea-game/dice-server-js/hooks","issue_events_url":"https://api.github.com/repos/triplea-game/dice-server-js/issues/events{/number}","events_url":"https://api.github.com/repos/triplea-game/dice-server-js/events","assignees_url":"https://api.github.com/repos/triplea-game/dice-server-js/assignees{/user}","branches_url":"https://api.github.com/repos/triplea-game/dice-server-js/branches{/branch}","tags_url":"https://api.github.com/repos/triplea-game/dice-server-js/tags","blobs_url":"https://api.github.com/repos/triplea-game/dice-server-js/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/triplea-game/dice-server-js/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/triplea-game/dice-server-js/git/refs{/sha}","trees_url":"https://api.github.com/repos/triplea-game/dice-server-js/git/trees{/sha}","statuses_url":"https://api.github.com/repos/triplea-game/dice-server-js/statuses/{sha}","languages_url":"https://api.github.com/repos/triplea-game/dice-server-js/languages","stargazers_url":"https://api.github.com/repos/triplea-game/dice-server-js/stargazers","contributors_url":"https://api.github.com/repos/triplea-game/dice-server-js/contributors","subscribers_url":"https://api.github.com/repos/triplea-game/dice-server-js/subscribers","subscription_url":"https://api.github.com/repos/triplea-game/dice-server-js/subscription","commits_url":"https://api.github.com/repos/triplea-game/dice-server-js/commits{/sha}","git_commits_url":"https://api.github.com/repos/triplea-game/dice-server-js/git/commits{/sha}","comments_url":"https://api.github.com/repos/triplea-game/dice-server-js/comments{/number}","issue_comment_url":"https://api.github.com/repos/triplea-game/dice-server-js/issues/comments{/number}","contents_url":"https://api.github.com/repos/triplea-game/dice-server-js/contents/{+path}","compare_url":"https://api.github.com/repos/triplea-game/dice-server-js/compare/{base}...{head}","merges_url":"https://api.github.com/repos/triplea-game/dice-server-js/merges","archive_url":"https://api.github.com/repos/triplea-game/dice-server-js/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/triplea-game/dice-server-js/downloads","issues_url":"https://api.github.com/repos/triplea-game/dice-server-js/issues{/number}","pulls_url":"https://api.github.com/repos/triplea-game/dice-server-js/pulls{/number}","milestones_url":"https://api.github.com/repos/triplea-game/dice-server-js/milestones{/number}","notifications_url":"https://api.github.com/repos/triplea-game/dice-server-js/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/triplea-game/dice-server-js/labels{/name}","releases_url":"https://api.github.com/repos/triplea-game/dice-server-js/releases{/id}","deployments_url":"https://api.github.com/repos/triplea-game/dice-server-js/deployments","created_at":"2017-08-18T02:01:45Z","updated_at":"2018-12-01T18:10:05Z","pushed_at":"2018-12-01T18:12:36Z","git_url":"git://github.com/triplea-game/dice-server-js.git","ssh_url":"git@github.com:triplea-game/dice-server-js.git","clone_url":"https://github.com/triplea-game/dice-server-js.git","svn_url":"https://github.com/triplea-game/dice-server-js","homepage":null,"size":125,"stargazers_count":1,"watchers_count":1,"language":"JavaScript","has_issues":true,"has_projects":true,"has_downloads":true,"has_wiki":true,"has_pages":false,"forks_count":2,"mirror_url":null,"archived":false,"open_issues_count":3,"license":{"key":"agpl-3.0","name":"GNU Affero General Public License v3.0","spdx_id":"AGPL-3.0","url":"https://api.github.com/licenses/agpl-3.0","node_id":"MDc6TGljZW5zZTE="},"forks":2,"open_issues":3,"watchers":1,"default_branch":"master"}},"_links":{"self":{"href":"https://api.github.com/repos/triplea-game/dice-server-js/pulls/12"},"html":{"href":"https://github.com/triplea-game/dice-server-js/pull/12"},"issue":{"href":"https://api.github.com/repos/triplea-game/dice-server-js/issues/12"},"comments":{"href":"https://api.github.com/repos/triplea-game/dice-server-js/issues/12/comments"},"review_comments":{"href":"https://api.github.com/repos/triplea-game/dice-server-js/pulls/12/comments"},"review_comment":{"href":"https://api.github.com/repos/triplea-game/dice-server-js/pulls/comments{/number}"},"commits":{"href":"https://api.github.com/repos/triplea-game/dice-server-js/pulls/12/commits"},"statuses":{"href":"https://api.github.com/repos/triplea-game/dice-server-js/statuses/8a0b9cb8573b16e1fd40236fca3d9be52cea9bfb"}},"author_association":"MEMBER"}}
{"actor":{"display_login":"ssoloff"}}