{"action":"created","comment":{"url":"https://api.github.com/repos/nightscout/cgm-remote-monitor/pulls/comments/64997531","id":64997531,"diff_hunk":"@@ -27,64 +74,406 @@ function init (env, ctx, server) {\n       'browser client gzip': false\n     });\n   }\n+  \n+  function verifyAuthorization (secret) {\n+    var read, write, write_treatment;\n+    \n+    // read now true by default\n+    read = true;\n+    write = (secret === env.api_secret);\n+    write_treatment = !env.treatments_auth || (secret === env.api_secret);\n+    \n+    return {\n+      read: read\n+      , write: write\n+      , write_treatment: write_treatment\n+    };\n+  }\n \n   function emitData (delta) {\n     if (lastData.cals) {\n-      console.log('running websocket.emitData', ctx.data.lastUpdated);\n-      io.emit('dataUpdate', delta);\n+      console.log(LOG_WS + 'running websocket.emitData', ctx.ddata.lastUpdated);\n+      if (lastProfileSwitch !== ctx.ddata.lastProfileFromSwitch) {\n+        console.log(LOG_WS + 'profile switch detected OLD: ' + lastProfileSwitch + ' NEW: ' + ctx.ddata.lastProfileFromSwitch);\n+        delta.status = status(ctx.ddata.profiles);\n+        lastProfileSwitch = ctx.ddata.lastProfileFromSwitch;\n+      }\n+      io.to('DataReceivers').emit('dataUpdate', delta);\n     }\n   }\n \n+  function pingClients ( ) {\n+    io.to('PingReceivers').emit('ping');\n+  }\n+  \n   function listeners ( ) {\n-    io.sockets.on('connection', function (socket) {\n-      // send all data upon new connection\n-      socket.emit('dataUpdate',lastData);\n+    io.sockets.on('connection', function onConnection (socket) {\n+      var socketAuthorization = null;\n+      var clientType = null;\n+      var timeDiff;\n+      var history;\n+      var pingme;\n+\n+      var remoteIP = socket.request.headers['x-forwarded-for'] || socket.request.connection.remoteAddress;\n+      console.log(LOG_WS + 'Connection from client ID: ', socket.client.id, ' IP: ', remoteIP);\n+\n       io.emit('clients', ++watchers);\n-      socket.on('ack', function(alarmType, silenceTime) {\n-        //TODO: Announcement hack a1/a2\n-        var level = alarmType2Level[alarmType] || alarmType;\n-        ctx.notifications.ack(level, silenceTime, true);\n+      socket.on('ack', function onAck(level, group, silenceTime) {\n+        ctx.notifications.ack(level, group, silenceTime, true);\n       });\n-      socket.on('disconnect', function () {\n+\n+      socket.on('disconnect', function onDisconnect ( ) {\n         io.emit('clients', --watchers);\n+        console.log(LOG_WS + 'Disconnected client ID: ',socket.client.id);\n+      });\n+\n+      \n+      function checkConditions (action, data) {\n+        var collection = supportedCollections[data.collection];\n+        if (!collection) {\n+          console.log('WS dbUpdate/dbAdd call: ', 'Wrong collection', data);\n+          return { result: 'Wrong collection' };\n+        }\n+\n+        if (!socketAuthorization) {\n+          console.log('WS dbUpdate/dbAdd call: ', 'Not authorized', data);\n+          return { result: 'Not authorized' };\n+        }\n+\n+        if (data.collection === 'treatments') {\n+          if (!socketAuthorization.write_treatment) {\n+            console.log('WS dbUpdate/dbAdd call: ', 'Not permitted', data);\n+            return { result: 'Not permitted' };\n+          }\n+        } else {\n+          if (!socketAuthorization.write) {\n+            console.log('WS dbUpdate call: ', 'Not permitted', data);\n+            return { result: 'Not permitted' };\n+          }\n+        }\n+        \n+        if (action === 'dbUpdate' && !data._id) {\n+          console.log('WS dbUpdate/dbAddnot sure abou documentati call: ', 'Missing _id', data);\n+          return { result: 'Missing _id' };\n+        }\n+\n+        return null;\n+      }\n+\n+      // dbUpdate message  \n+      //  {\n+      //    collection: treatments\n+      //    _id: 'some mongo record id'\n+      //    data: {\n+      //      field_1: new_value,\n+      //      field_2: another_value\n+      //    }\n+      //  }\n+      socket.on('dbUpdate', function dbUpdate (data, callback) {\n+       console.log(LOG_WS + 'dbUpdate client ID: ', socket.client.id, ' data: ', data);\n+       var collection = supportedCollections[data.collection];\n+        \n+        var check = checkConditions('dbUpdate', data);\n+        if (check) {\n+         if (callback) {\n+            callback( check );\n+          }\n+          return;\n+        }\n+        \n+        ctx.store.db.collection(collection).update(\n+          { '_id': new ObjectID(data._id) },\n+          { $set: data.data }\n+        );\n+          \n+        if (callback) {\n+          callback( { result: 'success' } );\n+        }\n+        ctx.bus.emit('data-received');\n+      });\n+      \n+      // dbUpdateUnset message  \n+      //  {\n+      //    collection: treatments\n+      //    _id: 'some mongo record id'\n+      //    data: {\n+      //      field_1: 1,\n+      //      field_2: 1\n+      //    }\n+      //  }\n+      socket.on('dbUpdateUnset', function dbUpdateUnset (data, callback) {\n+       console.log(LOG_WS + 'dbUpdateUnset client ID: ', socket.client.id, ' data: ', data);\n+       var collection = supportedCollections[data.collection];\n+        \n+        var check = checkConditions('dbUpdate', data);\n+        if (check) {\n+         if (callback) {\n+            callback( check );\n+          }\n+          return;\n+        }\n+        \n+        ctx.store.db.collection(collection).update(\n+          { '_id': new ObjectID(data._id) },\n+          { $unset: data.data }\n+        );\n+          \n+        if (callback) {\n+          callback( { result: 'success' } );\n+        }\n+        ctx.bus.emit('data-received');\n+      });\n+      \n+      // dbAdd message  \n+      //  {\n+      //    collection: treatments\n+      //    data: {\n+      //      field_1: new_value,\n+      //      field_2: another_value\n+      //    }\n+      //  }\n+      socket.on('dbAdd', function dbAdd (data, callback) {\n+       console.log(LOG_WS + 'dbAdd client ID: ', socket.client.id, ' data: ', data);\n+        var collection = supportedCollections[data.collection];\n+        var maxtimediff = times.mins(3).msecs;\n+        \n+        var check = checkConditions('dbAdd', data);\n+        if (check) {\n+         if (callback) {\n+            callback( check );\n+          }\n+          return;\n+        }\n+        \n+        if (data.collection === 'treatments' && !('eventType' in data.data)) {\n+          data.data.eventType = '<none>';\n+        }\n+        if (!('created_at' in data.data)) {\n+          data.data.created_at = new Date().toISOString();\n+        }\n+        \n+        // treatments deduping\n+        if (data.collection === 'treatments') {\n+          var query  = {\n+            created_at: data.data.created_at\n+            , eventType: data.data.eventType\n+          };\n+         \n+         // try to find exact match\n+          ctx.store.db.collection(collection).find(query).toArray(function findResult (err, array) {","path":"lib/websocket.js","position":274,"original_position":274,"commit_id":"71a679712ad8e311fdb4d36f2861ca6c9271aa1c","original_commit_id":"71a679712ad8e311fdb4d36f2861ca6c9271aa1c","user":{"login":"jasoncalabrese","id":751143,"avatar_url":"https://avatars.githubusercontent.com/u/751143?v=3","gravatar_id":"","url":"https://api.github.com/users/jasoncalabrese","html_url":"https://github.com/jasoncalabrese","followers_url":"https://api.github.com/users/jasoncalabrese/followers","following_url":"https://api.github.com/users/jasoncalabrese/following{/other_user}","gists_url":"https://api.github.com/users/jasoncalabrese/gists{/gist_id}","starred_url":"https://api.github.com/users/jasoncalabrese/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/jasoncalabrese/subscriptions","organizations_url":"https://api.github.com/users/jasoncalabrese/orgs","repos_url":"https://api.github.com/users/jasoncalabrese/repos","events_url":"https://api.github.com/users/jasoncalabrese/events{/privacy}","received_events_url":"https://api.github.com/users/jasoncalabrese/received_events","type":"User","site_admin":false},"body":"![Codacy](https://www.codacy.com/assets/images/favicon.png) Issue found: [This function's cyclomatic complexity is too high. (10)](https://www.codacy.com/app/Nightscout/cgm-remote-monitor/file/2651207102/issues/source?bid=2452374&fileBranchId=3324571#l263)","created_at":"2016-05-29T04:40:50Z","updated_at":"2016-05-29T04:40:50Z","html_url":"https://github.com/nightscout/cgm-remote-monitor/pull/1780#discussion_r64997531","pull_request_url":"https://api.github.com/repos/nightscout/cgm-remote-monitor/pulls/1780","_links":{"self":{"href":"https://api.github.com/repos/nightscout/cgm-remote-monitor/pulls/comments/64997531"},"html":{"href":"https://github.com/nightscout/cgm-remote-monitor/pull/1780#discussion_r64997531"},"pull_request":{"href":"https://api.github.com/repos/nightscout/cgm-remote-monitor/pulls/1780"}}},"pull_request":{"url":"https://api.github.com/repos/nightscout/cgm-remote-monitor/pulls/1780","id":71818130,"html_url":"https://github.com/nightscout/cgm-remote-monitor/pull/1780","diff_url":"https://github.com/nightscout/cgm-remote-monitor/pull/1780.diff","patch_url":"https://github.com/nightscout/cgm-remote-monitor/pull/1780.patch","issue_url":"https://api.github.com/repos/nightscout/cgm-remote-monitor/issues/1780","number":1780,"state":"open","locked":false,"title":"Dev","user":{"login":"mccgm","id":16631049,"avatar_url":"https://avatars.githubusercontent.com/u/16631049?v=3","gravatar_id":"","url":"https://api.github.com/users/mccgm","html_url":"https://github.com/mccgm","followers_url":"https://api.github.com/users/mccgm/followers","following_url":"https://api.github.com/users/mccgm/following{/other_user}","gists_url":"https://api.github.com/users/mccgm/gists{/gist_id}","starred_url":"https://api.github.com/users/mccgm/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/mccgm/subscriptions","organizations_url":"https://api.github.com/users/mccgm/orgs","repos_url":"https://api.github.com/users/mccgm/repos","events_url":"https://api.github.com/users/mccgm/events{/privacy}","received_events_url":"https://api.github.com/users/mccgm/received_events","type":"User","site_admin":false},"body":"","created_at":"2016-05-29T04:39:21Z","updated_at":"2016-05-29T04:40:50Z","closed_at":null,"merged_at":null,"merge_commit_sha":"a4fc6f74ab2e7d98d5b58c0085675e0c151f080a","assignee":null,"milestone":null,"commits_url":"https://api.github.com/repos/nightscout/cgm-remote-monitor/pulls/1780/commits","review_comments_url":"https://api.github.com/repos/nightscout/cgm-remote-monitor/pulls/1780/comments","review_comment_url":"https://api.github.com/repos/nightscout/cgm-remote-monitor/pulls/comments{/number}","comments_url":"https://api.github.com/repos/nightscout/cgm-remote-monitor/issues/1780/comments","statuses_url":"https://api.github.com/repos/nightscout/cgm-remote-monitor/statuses/71a679712ad8e311fdb4d36f2861ca6c9271aa1c","head":{"label":"nightscout:dev","ref":"dev","sha":"71a679712ad8e311fdb4d36f2861ca6c9271aa1c","user":{"login":"nightscout","id":7661012,"avatar_url":"https://avatars.githubusercontent.com/u/7661012?v=3","gravatar_id":"","url":"https://api.github.com/users/nightscout","html_url":"https://github.com/nightscout","followers_url":"https://api.github.com/users/nightscout/followers","following_url":"https://api.github.com/users/nightscout/following{/other_user}","gists_url":"https://api.github.com/users/nightscout/gists{/gist_id}","starred_url":"https://api.github.com/users/nightscout/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/nightscout/subscriptions","organizations_url":"https://api.github.com/users/nightscout/orgs","repos_url":"https://api.github.com/users/nightscout/repos","events_url":"https://api.github.com/users/nightscout/events{/privacy}","received_events_url":"https://api.github.com/users/nightscout/received_events","type":"Organization","site_admin":false},"repo":{"id":20042152,"name":"cgm-remote-monitor","full_name":"nightscout/cgm-remote-monitor","owner":{"login":"nightscout","id":7661012,"avatar_url":"https://avatars.githubusercontent.com/u/7661012?v=3","gravatar_id":"","url":"https://api.github.com/users/nightscout","html_url":"https://github.com/nightscout","followers_url":"https://api.github.com/users/nightscout/followers","following_url":"https://api.github.com/users/nightscout/following{/other_user}","gists_url":"https://api.github.com/users/nightscout/gists{/gist_id}","starred_url":"https://api.github.com/users/nightscout/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/nightscout/subscriptions","organizations_url":"https://api.github.com/users/nightscout/orgs","repos_url":"https://api.github.com/users/nightscout/repos","events_url":"https://api.github.com/users/nightscout/events{/privacy}","received_events_url":"https://api.github.com/users/nightscout/received_events","type":"Organization","site_admin":false},"private":false,"html_url":"https://github.com/nightscout/cgm-remote-monitor","description":"nightscout web monitor","fork":false,"url":"https://api.github.com/repos/nightscout/cgm-remote-monitor","forks_url":"https://api.github.com/repos/nightscout/cgm-remote-monitor/forks","keys_url":"https://api.github.com/repos/nightscout/cgm-remote-monitor/keys{/key_id}","collaborators_url":"https://api.github.com/repos/nightscout/cgm-remote-monitor/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/nightscout/cgm-remote-monitor/teams","hooks_url":"https://api.github.com/repos/nightscout/cgm-remote-monitor/hooks","issue_events_url":"https://api.github.com/repos/nightscout/cgm-remote-monitor/issues/events{/number}","events_url":"https://api.github.com/repos/nightscout/cgm-remote-monitor/events","assignees_url":"https://api.github.com/repos/nightscout/cgm-remote-monitor/assignees{/user}","branches_url":"https://api.github.com/repos/nightscout/cgm-remote-monitor/branches{/branch}","tags_url":"https://api.github.com/repos/nightscout/cgm-remote-monitor/tags","blobs_url":"https://api.github.com/repos/nightscout/cgm-remote-monitor/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/nightscout/cgm-remote-monitor/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/nightscout/cgm-remote-monitor/git/refs{/sha}","trees_url":"https://api.github.com/repos/nightscout/cgm-remote-monitor/git/trees{/sha}","statuses_url":"https://api.github.com/repos/nightscout/cgm-remote-monitor/statuses/{sha}","languages_url":"https://api.github.com/repos/nightscout/cgm-remote-monitor/languages","stargazers_url":"https://api.github.com/repos/nightscout/cgm-remote-monitor/stargazers","contributors_url":"https://api.github.com/repos/nightscout/cgm-remote-monitor/contributors","subscribers_url":"https://api.github.com/repos/nightscout/cgm-remote-monitor/subscribers","subscription_url":"https://api.github.com/repos/nightscout/cgm-remote-monitor/subscription","commits_url":"https://api.github.com/repos/nightscout/cgm-remote-monitor/commits{/sha}","git_commits_url":"https://api.github.com/repos/nightscout/cgm-remote-monitor/git/commits{/sha}","comments_url":"https://api.github.com/repos/nightscout/cgm-remote-monitor/comments{/number}","issue_comment_url":"https://api.github.com/repos/nightscout/cgm-remote-monitor/issues/comments{/number}","contents_url":"https://api.github.com/repos/nightscout/cgm-remote-monitor/contents/{+path}","compare_url":"https://api.github.com/repos/nightscout/cgm-remote-monitor/compare/{base}...{head}","merges_url":"https://api.github.com/repos/nightscout/cgm-remote-monitor/merges","archive_url":"https://api.github.com/repos/nightscout/cgm-remote-monitor/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/nightscout/cgm-remote-monitor/downloads","issues_url":"https://api.github.com/repos/nightscout/cgm-remote-monitor/issues{/number}","pulls_url":"https://api.github.com/repos/nightscout/cgm-remote-monitor/pulls{/number}","milestones_url":"https://api.github.com/repos/nightscout/cgm-remote-monitor/milestones{/number}","notifications_url":"https://api.github.com/repos/nightscout/cgm-remote-monitor/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/nightscout/cgm-remote-monitor/labels{/name}","releases_url":"https://api.github.com/repos/nightscout/cgm-remote-monitor/releases{/id}","deployments_url":"https://api.github.com/repos/nightscout/cgm-remote-monitor/deployments","created_at":"2014-05-22T00:32:28Z","updated_at":"2016-05-24T06:52:32Z","pushed_at":"2016-05-29T04:39:21Z","git_url":"git://github.com/nightscout/cgm-remote-monitor.git","ssh_url":"git@github.com:nightscout/cgm-remote-monitor.git","clone_url":"https://github.com/nightscout/cgm-remote-monitor.git","svn_url":"https://github.com/nightscout/cgm-remote-monitor","homepage":"","size":15367,"stargazers_count":178,"watchers_count":178,"language":"JavaScript","has_issues":true,"has_downloads":true,"has_wiki":true,"has_pages":false,"forks_count":5264,"mirror_url":null,"open_issues_count":81,"forks":5264,"open_issues":81,"watchers":178,"default_branch":"master"}},"base":{"label":"nightscout:master","ref":"master","sha":"e1e07e563df3e0c21045cefd823b01a2279499ed","user":{"login":"nightscout","id":7661012,"avatar_url":"https://avatars.githubusercontent.com/u/7661012?v=3","gravatar_id":"","url":"https://api.github.com/users/nightscout","html_url":"https://github.com/nightscout","followers_url":"https://api.github.com/users/nightscout/followers","following_url":"https://api.github.com/users/nightscout/following{/other_user}","gists_url":"https://api.github.com/users/nightscout/gists{/gist_id}","starred_url":"https://api.github.com/users/nightscout/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/nightscout/subscriptions","organizations_url":"https://api.github.com/users/nightscout/orgs","repos_url":"https://api.github.com/users/nightscout/repos","events_url":"https://api.github.com/users/nightscout/events{/privacy}","received_events_url":"https://api.github.com/users/nightscout/received_events","type":"Organization","site_admin":false},"repo":{"id":20042152,"name":"cgm-remote-monitor","full_name":"nightscout/cgm-remote-monitor","owner":{"login":"nightscout","id":7661012,"avatar_url":"https://avatars.githubusercontent.com/u/7661012?v=3","gravatar_id":"","url":"https://api.github.com/users/nightscout","html_url":"https://github.com/nightscout","followers_url":"https://api.github.com/users/nightscout/followers","following_url":"https://api.github.com/users/nightscout/following{/other_user}","gists_url":"https://api.github.com/users/nightscout/gists{/gist_id}","starred_url":"https://api.github.com/users/nightscout/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/nightscout/subscriptions","organizations_url":"https://api.github.com/users/nightscout/orgs","repos_url":"https://api.github.com/users/nightscout/repos","events_url":"https://api.github.com/users/nightscout/events{/privacy}","received_events_url":"https://api.github.com/users/nightscout/received_events","type":"Organization","site_admin":false},"private":false,"html_url":"https://github.com/nightscout/cgm-remote-monitor","description":"nightscout web monitor","fork":false,"url":"https://api.github.com/repos/nightscout/cgm-remote-monitor","forks_url":"https://api.github.com/repos/nightscout/cgm-remote-monitor/forks","keys_url":"https://api.github.com/repos/nightscout/cgm-remote-monitor/keys{/key_id}","collaborators_url":"https://api.github.com/repos/nightscout/cgm-remote-monitor/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/nightscout/cgm-remote-monitor/teams","hooks_url":"https://api.github.com/repos/nightscout/cgm-remote-monitor/hooks","issue_events_url":"https://api.github.com/repos/nightscout/cgm-remote-monitor/issues/events{/number}","events_url":"https://api.github.com/repos/nightscout/cgm-remote-monitor/events","assignees_url":"https://api.github.com/repos/nightscout/cgm-remote-monitor/assignees{/user}","branches_url":"https://api.github.com/repos/nightscout/cgm-remote-monitor/branches{/branch}","tags_url":"https://api.github.com/repos/nightscout/cgm-remote-monitor/tags","blobs_url":"https://api.github.com/repos/nightscout/cgm-remote-monitor/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/nightscout/cgm-remote-monitor/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/nightscout/cgm-remote-monitor/git/refs{/sha}","trees_url":"https://api.github.com/repos/nightscout/cgm-remote-monitor/git/trees{/sha}","statuses_url":"https://api.github.com/repos/nightscout/cgm-remote-monitor/statuses/{sha}","languages_url":"https://api.github.com/repos/nightscout/cgm-remote-monitor/languages","stargazers_url":"https://api.github.com/repos/nightscout/cgm-remote-monitor/stargazers","contributors_url":"https://api.github.com/repos/nightscout/cgm-remote-monitor/contributors","subscribers_url":"https://api.github.com/repos/nightscout/cgm-remote-monitor/subscribers","subscription_url":"https://api.github.com/repos/nightscout/cgm-remote-monitor/subscription","commits_url":"https://api.github.com/repos/nightscout/cgm-remote-monitor/commits{/sha}","git_commits_url":"https://api.github.com/repos/nightscout/cgm-remote-monitor/git/commits{/sha}","comments_url":"https://api.github.com/repos/nightscout/cgm-remote-monitor/comments{/number}","issue_comment_url":"https://api.github.com/repos/nightscout/cgm-remote-monitor/issues/comments{/number}","contents_url":"https://api.github.com/repos/nightscout/cgm-remote-monitor/contents/{+path}","compare_url":"https://api.github.com/repos/nightscout/cgm-remote-monitor/compare/{base}...{head}","merges_url":"https://api.github.com/repos/nightscout/cgm-remote-monitor/merges","archive_url":"https://api.github.com/repos/nightscout/cgm-remote-monitor/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/nightscout/cgm-remote-monitor/downloads","issues_url":"https://api.github.com/repos/nightscout/cgm-remote-monitor/issues{/number}","pulls_url":"https://api.github.com/repos/nightscout/cgm-remote-monitor/pulls{/number}","milestones_url":"https://api.github.com/repos/nightscout/cgm-remote-monitor/milestones{/number}","notifications_url":"https://api.github.com/repos/nightscout/cgm-remote-monitor/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/nightscout/cgm-remote-monitor/labels{/name}","releases_url":"https://api.github.com/repos/nightscout/cgm-remote-monitor/releases{/id}","deployments_url":"https://api.github.com/repos/nightscout/cgm-remote-monitor/deployments","created_at":"2014-05-22T00:32:28Z","updated_at":"2016-05-24T06:52:32Z","pushed_at":"2016-05-29T04:39:21Z","git_url":"git://github.com/nightscout/cgm-remote-monitor.git","ssh_url":"git@github.com:nightscout/cgm-remote-monitor.git","clone_url":"https://github.com/nightscout/cgm-remote-monitor.git","svn_url":"https://github.com/nightscout/cgm-remote-monitor","homepage":"","size":15367,"stargazers_count":178,"watchers_count":178,"language":"JavaScript","has_issues":true,"has_downloads":true,"has_wiki":true,"has_pages":false,"forks_count":5264,"mirror_url":null,"open_issues_count":81,"forks":5264,"open_issues":81,"watchers":178,"default_branch":"master"}},"_links":{"self":{"href":"https://api.github.com/repos/nightscout/cgm-remote-monitor/pulls/1780"},"html":{"href":"https://github.com/nightscout/cgm-remote-monitor/pull/1780"},"issue":{"href":"https://api.github.com/repos/nightscout/cgm-remote-monitor/issues/1780"},"comments":{"href":"https://api.github.com/repos/nightscout/cgm-remote-monitor/issues/1780/comments"},"review_comments":{"href":"https://api.github.com/repos/nightscout/cgm-remote-monitor/pulls/1780/comments"},"review_comment":{"href":"https://api.github.com/repos/nightscout/cgm-remote-monitor/pulls/comments{/number}"},"commits":{"href":"https://api.github.com/repos/nightscout/cgm-remote-monitor/pulls/1780/commits"},"statuses":{"href":"https://api.github.com/repos/nightscout/cgm-remote-monitor/statuses/71a679712ad8e311fdb4d36f2861ca6c9271aa1c"}}}}
{"actor":{"display_login":"jasoncalabrese"}}