Started working on 2 min heartbeats.
This commit is contained in:
12
assets/js/UrlHelper.js
Normal file
12
assets/js/UrlHelper.js
Normal file
@@ -0,0 +1,12 @@
|
|||||||
|
class UrlHelper {
|
||||||
|
|
||||||
|
static getDomainFromUrl(url)
|
||||||
|
{
|
||||||
|
var parts = url.split('/');
|
||||||
|
|
||||||
|
return parts[0] + "//" + parts[2];
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
export default UrlHelper;
|
||||||
@@ -1,6 +1,66 @@
|
|||||||
/**
|
var UrlHelper = require('./UrlHelper');
|
||||||
* I think that I am going to need this.
|
|
||||||
*/
|
|
||||||
class WakaTime {
|
class WakaTime {
|
||||||
|
|
||||||
|
detectionIntervalInSeconds = 60; //default
|
||||||
|
|
||||||
|
loggingType = 'domain'; //default
|
||||||
|
|
||||||
|
recordHeartbeat()
|
||||||
|
{
|
||||||
|
console.log('recording heartbeat.');
|
||||||
|
|
||||||
|
chrome.idle.queryState(this.detectionIntervalInSeconds, (newState) => {
|
||||||
|
|
||||||
|
console.log(newState);
|
||||||
|
|
||||||
|
if(newState === 'active')
|
||||||
|
{
|
||||||
|
// Get current tab URL.
|
||||||
|
chrome.tabs.query({active: true}, (tabs) => {
|
||||||
|
console.log(tabs[0].url);
|
||||||
|
|
||||||
|
this.sendHeartbeat(tabs[0].url);
|
||||||
|
});
|
||||||
|
}
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
sendHeartbeat(entity)
|
||||||
|
{
|
||||||
|
chrome.storage.sync.get({
|
||||||
|
loggingType: this.loggingType
|
||||||
|
}, function(items) {
|
||||||
|
|
||||||
|
if(items.loggingType == 'domain') {
|
||||||
|
console.log('sending entity with type domain');
|
||||||
|
|
||||||
|
// Get only the domain from the entity.
|
||||||
|
// And send that in heartbeat
|
||||||
|
console.log(UrlHelper.getDomainFromUrl(entity));
|
||||||
|
|
||||||
|
var domain = UrlHelper.getDomainFromUrl(entity);
|
||||||
|
|
||||||
|
var data = {
|
||||||
|
entity: domain,
|
||||||
|
type: 'domain',
|
||||||
|
time: Math.round((new Date()).getTime() / 1000),
|
||||||
|
is_debugging: false
|
||||||
|
};
|
||||||
|
|
||||||
|
console.log(data);
|
||||||
|
|
||||||
|
|
||||||
|
}
|
||||||
|
else if (items.loggingType == 'url') {
|
||||||
|
console.log('sending entity with type url');
|
||||||
|
|
||||||
|
// Send entity in heartbeat
|
||||||
|
}
|
||||||
|
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
export default WakaTime;
|
||||||
|
|||||||
@@ -0,0 +1,37 @@
|
|||||||
|
// What to do when the event page first loads?
|
||||||
|
//
|
||||||
|
// Functional style
|
||||||
|
//
|
||||||
|
// 1. Run a function every 2 mins DONE
|
||||||
|
// 2. Check if the user is active (not idle)
|
||||||
|
// If the user is active, get the current active tab URL
|
||||||
|
// and send heartbeat to wakatime.
|
||||||
|
//
|
||||||
|
|
||||||
|
var WakaTime = require('./WakaTime');
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Whenever an alarms sets off, this function
|
||||||
|
* gets called to detect the alarm name and
|
||||||
|
* do appropriate action.
|
||||||
|
*
|
||||||
|
* @param alarm
|
||||||
|
*/
|
||||||
|
function resolveAlarm(alarm) {
|
||||||
|
// |alarm| can be undefined because onAlarm also gets called from
|
||||||
|
// window.setTimeout on old chrome versions.
|
||||||
|
if (alarm && alarm.name == 'heartbeatAlarm') {
|
||||||
|
|
||||||
|
console.log('heartbeatAlarm triggered');
|
||||||
|
|
||||||
|
var wakatime = new WakaTime;
|
||||||
|
|
||||||
|
wakatime.recordHeartbeat();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Add a listener to resolve alarms
|
||||||
|
chrome.alarms.onAlarm.addListener(resolveAlarm);
|
||||||
|
|
||||||
|
// Create a new alarm for heartbeats.
|
||||||
|
chrome.alarms.create('heartbeatAlarm', {periodInMinutes: 1});
|
||||||
|
|||||||
@@ -4,16 +4,31 @@ require('bootstrap');
|
|||||||
|
|
||||||
var $ = require('jquery');
|
var $ = require('jquery');
|
||||||
|
|
||||||
|
function detectCheckedRadio(name)
|
||||||
|
{
|
||||||
|
for(var i = 0; i < document.getElementsByName(name).length; i++)
|
||||||
|
{
|
||||||
|
var button = document.getElementsByName(name)[i];
|
||||||
|
|
||||||
|
if(button.checked === true)
|
||||||
|
{
|
||||||
|
return button.value;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
// Saves options to chrome.storage.sync.
|
// Saves options to chrome.storage.sync.
|
||||||
function save_options(e) {
|
function save_options(e) {
|
||||||
e.preventDefault();
|
e.preventDefault();
|
||||||
|
|
||||||
var theme = document.getElementById('theme').value;
|
var theme = document.getElementById('theme').value;
|
||||||
var blacklist = document.getElementById('blacklist').value;
|
var blacklist = document.getElementById('blacklist').value;
|
||||||
|
var loggingType = detectCheckedRadio('loggingType');
|
||||||
|
|
||||||
chrome.storage.sync.set({
|
chrome.storage.sync.set({
|
||||||
theme: theme,
|
theme: theme,
|
||||||
blacklist: blacklist
|
blacklist: blacklist,
|
||||||
|
loggingType: loggingType
|
||||||
}, function() {
|
}, function() {
|
||||||
// Update status to let user know options were saved.
|
// Update status to let user know options were saved.
|
||||||
var status = $('#status');
|
var status = $('#status');
|
||||||
@@ -36,10 +51,12 @@ function restore_options() {
|
|||||||
// Use default value color = 'red' and likesColor = true.
|
// Use default value color = 'red' and likesColor = true.
|
||||||
chrome.storage.sync.get({
|
chrome.storage.sync.get({
|
||||||
theme: 'light',
|
theme: 'light',
|
||||||
blacklist: ''
|
blacklist: '',
|
||||||
|
loggingType: 'domain'
|
||||||
}, function(items) {
|
}, function(items) {
|
||||||
document.getElementById('theme').value = items.theme;
|
document.getElementById('theme').value = items.theme;
|
||||||
document.getElementById('blacklist').value = items.blacklist;
|
document.getElementById('blacklist').value = items.blacklist;
|
||||||
|
document.getElementById(items.loggingType + 'Type').checked = true;
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -19,7 +19,7 @@ elixir(function (mix) {
|
|||||||
mix.copy('vendor/bower_components/font-awesome/less', 'assets/less/font-awesome');
|
mix.copy('vendor/bower_components/font-awesome/less', 'assets/less/font-awesome');
|
||||||
mix.copy('vendor/bower_components/font-awesome/fonts', 'public/fonts');
|
mix.copy('vendor/bower_components/font-awesome/fonts', 'public/fonts');
|
||||||
mix.less('app.less');
|
mix.less('app.less');
|
||||||
mix.browserify('app.js', null, 'assets/js');
|
//mix.browserify('app.js', null, 'assets/js');
|
||||||
//mix.browserify('events.js', 'public/js/events.js', 'assets/js');
|
mix.browserify('events.js', 'public/js/events.js', 'assets/js');
|
||||||
//mix.browserify('options.js', 'public/js/options.js', 'assets/js');
|
//mix.browserify('options.js', 'public/js/options.js', 'assets/js');
|
||||||
});
|
});
|
||||||
|
|||||||
@@ -13,7 +13,8 @@
|
|||||||
"https://wakatime.com/logout",
|
"https://wakatime.com/logout",
|
||||||
"alarms",
|
"alarms",
|
||||||
"tabs",
|
"tabs",
|
||||||
"storage"
|
"storage",
|
||||||
|
"idle"
|
||||||
],
|
],
|
||||||
"background": {
|
"background": {
|
||||||
"scripts": [
|
"scripts": [
|
||||||
|
|||||||
19
options.html
19
options.html
@@ -36,6 +36,25 @@
|
|||||||
</select>
|
</select>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
|
<div class="form-group">
|
||||||
|
<label class="col-lg-2 control-label">Logging type</label>
|
||||||
|
<div class="col-lg-10">
|
||||||
|
<div class="radio">
|
||||||
|
<label>
|
||||||
|
<input type="radio" name="loggingType" id="domainType" value="domain" checked="">
|
||||||
|
Only the domain
|
||||||
|
</label>
|
||||||
|
</div>
|
||||||
|
<div class="radio">
|
||||||
|
<label>
|
||||||
|
<input type="radio" name="loggingType" id="urlType" value="url">
|
||||||
|
Entire URL
|
||||||
|
</label>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
<div class="form-group">
|
<div class="form-group">
|
||||||
<div class="col-lg-10 col-lg-offset-2">
|
<div class="col-lg-10 col-lg-offset-2">
|
||||||
<button id="save" type="submit" class="btn btn-primary">Save</button>
|
<button id="save" type="submit" class="btn btn-primary">Save</button>
|
||||||
|
|||||||
@@ -1,4 +1,157 @@
|
|||||||
(function e(t,n,r){function s(o,u){if(!n[o]){if(!t[o]){var a=typeof require=="function"&&require;if(!u&&a)return a(o,!0);if(i)return i(o,!0);var f=new Error("Cannot find module '"+o+"'");throw f.code="MODULE_NOT_FOUND",f}var l=n[o]={exports:{}};t[o][0].call(l.exports,function(e){var n=t[o][1][e];return s(n?n:e)},l,l.exports,e,t,n,r)}return n[o].exports}var i=typeof require=="function"&&require;for(var o=0;o<r.length;o++)s(r[o]);return s})({1:[function(require,module,exports){
|
(function e(t,n,r){function s(o,u){if(!n[o]){if(!t[o]){var a=typeof require=="function"&&require;if(!u&&a)return a(o,!0);if(i)return i(o,!0);var f=new Error("Cannot find module '"+o+"'");throw f.code="MODULE_NOT_FOUND",f}var l=n[o]={exports:{}};t[o][0].call(l.exports,function(e){var n=t[o][1][e];return s(n?n:e)},l,l.exports,e,t,n,r)}return n[o].exports}var i=typeof require=="function"&&require;for(var o=0;o<r.length;o++)s(r[o]);return s})({1:[function(require,module,exports){
|
||||||
|
// What to do when the event page first loads?
|
||||||
|
//
|
||||||
|
// Functional style
|
||||||
|
//
|
||||||
|
// 1. Run a function every 2 mins DONE
|
||||||
|
// 2. Check if the user is active (not idle)
|
||||||
|
// If the user is active, get the current active tab URL
|
||||||
|
// and send heartbeat to wakatime.
|
||||||
|
//
|
||||||
|
|
||||||
|
'use strict';
|
||||||
|
|
||||||
|
var WakaTime = require('./WakaTime');
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Whenever an alarms sets off, this function
|
||||||
|
* gets called to detect the alarm name and
|
||||||
|
* do appropriate action.
|
||||||
|
*
|
||||||
|
* @param alarm
|
||||||
|
*/
|
||||||
|
function resolveAlarm(alarm) {
|
||||||
|
// |alarm| can be undefined because onAlarm also gets called from
|
||||||
|
// window.setTimeout on old chrome versions.
|
||||||
|
if (alarm && alarm.name == 'heartbeatAlarm') {
|
||||||
|
|
||||||
|
console.log('heartbeatAlarm triggered');
|
||||||
|
|
||||||
|
var wakatime = new WakaTime();
|
||||||
|
|
||||||
|
wakatime.recordHeartbeat();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Add a listener to resolve alarms
|
||||||
|
chrome.alarms.onAlarm.addListener(resolveAlarm);
|
||||||
|
|
||||||
|
// Create a new alarm for heartbeats.
|
||||||
|
chrome.alarms.create('heartbeatAlarm', { periodInMinutes: 1 });
|
||||||
|
|
||||||
|
},{"./WakaTime":3}],2:[function(require,module,exports){
|
||||||
"use strict";
|
"use strict";
|
||||||
|
|
||||||
},{}]},{},[1]);
|
Object.defineProperty(exports, "__esModule", {
|
||||||
|
value: true
|
||||||
|
});
|
||||||
|
|
||||||
|
var _createClass = (function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; })();
|
||||||
|
|
||||||
|
function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }
|
||||||
|
|
||||||
|
var UrlHelper = (function () {
|
||||||
|
function UrlHelper() {
|
||||||
|
_classCallCheck(this, UrlHelper);
|
||||||
|
}
|
||||||
|
|
||||||
|
_createClass(UrlHelper, null, [{
|
||||||
|
key: "getDomainFromUrl",
|
||||||
|
value: function getDomainFromUrl(url) {
|
||||||
|
var parts = url.split("/");
|
||||||
|
|
||||||
|
return parts[0] + "//" + parts[2];
|
||||||
|
}
|
||||||
|
}]);
|
||||||
|
|
||||||
|
return UrlHelper;
|
||||||
|
})();
|
||||||
|
|
||||||
|
exports["default"] = UrlHelper;
|
||||||
|
module.exports = exports["default"];
|
||||||
|
|
||||||
|
},{}],3:[function(require,module,exports){
|
||||||
|
'use strict';
|
||||||
|
|
||||||
|
Object.defineProperty(exports, '__esModule', {
|
||||||
|
value: true
|
||||||
|
});
|
||||||
|
|
||||||
|
var _createClass = (function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ('value' in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; })();
|
||||||
|
|
||||||
|
function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError('Cannot call a class as a function'); } }
|
||||||
|
|
||||||
|
var UrlHelper = require('./UrlHelper');
|
||||||
|
|
||||||
|
var WakaTime = (function () {
|
||||||
|
function WakaTime() {
|
||||||
|
_classCallCheck(this, WakaTime);
|
||||||
|
|
||||||
|
this.detectionIntervalInSeconds = 60;
|
||||||
|
this.loggingType = 'domain';
|
||||||
|
}
|
||||||
|
|
||||||
|
_createClass(WakaTime, [{
|
||||||
|
key: 'recordHeartbeat',
|
||||||
|
//default
|
||||||
|
|
||||||
|
value: function recordHeartbeat() {
|
||||||
|
var _this = this;
|
||||||
|
|
||||||
|
console.log('recording heartbeat.');
|
||||||
|
|
||||||
|
chrome.idle.queryState(this.detectionIntervalInSeconds, function (newState) {
|
||||||
|
|
||||||
|
console.log(newState);
|
||||||
|
|
||||||
|
if (newState === 'active') {
|
||||||
|
// Get current tab URL.
|
||||||
|
chrome.tabs.query({ active: true }, function (tabs) {
|
||||||
|
console.log(tabs[0].url);
|
||||||
|
|
||||||
|
_this.sendHeartbeat(tabs[0].url);
|
||||||
|
});
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}
|
||||||
|
}, {
|
||||||
|
key: 'sendHeartbeat',
|
||||||
|
value: function sendHeartbeat(entity) {
|
||||||
|
chrome.storage.sync.get({
|
||||||
|
loggingType: this.loggingType
|
||||||
|
}, function (items) {
|
||||||
|
|
||||||
|
if (items.loggingType == 'domain') {
|
||||||
|
console.log('sending entity with type domain');
|
||||||
|
|
||||||
|
// Get only the domain from the entity.
|
||||||
|
// And send that in heartbeat
|
||||||
|
console.log(UrlHelper.getDomainFromUrl(entity));
|
||||||
|
|
||||||
|
var domain = UrlHelper.getDomainFromUrl(entity);
|
||||||
|
|
||||||
|
var data = {
|
||||||
|
entity: domain,
|
||||||
|
type: 'domain',
|
||||||
|
time: Math.round(new Date().getTime() / 1000),
|
||||||
|
is_debugging: false
|
||||||
|
};
|
||||||
|
|
||||||
|
console.log(data);
|
||||||
|
} else if (items.loggingType == 'url') {
|
||||||
|
console.log('sending entity with type url');
|
||||||
|
|
||||||
|
// Send entity in heartbeat
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}
|
||||||
|
}]);
|
||||||
|
|
||||||
|
return WakaTime;
|
||||||
|
})();
|
||||||
|
|
||||||
|
exports['default'] = WakaTime;
|
||||||
|
module.exports = exports['default'];
|
||||||
|
//default
|
||||||
|
|
||||||
|
},{"./UrlHelper":2}]},{},[1]);
|
||||||
|
|||||||
@@ -8,16 +8,28 @@ require('bootstrap');
|
|||||||
|
|
||||||
var $ = require('jquery');
|
var $ = require('jquery');
|
||||||
|
|
||||||
|
function detectCheckedRadio(name) {
|
||||||
|
for (var i = 0; i < document.getElementsByName(name).length; i++) {
|
||||||
|
var button = document.getElementsByName(name)[i];
|
||||||
|
|
||||||
|
if (button.checked === true) {
|
||||||
|
return button.value;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
// Saves options to chrome.storage.sync.
|
// Saves options to chrome.storage.sync.
|
||||||
function save_options(e) {
|
function save_options(e) {
|
||||||
e.preventDefault();
|
e.preventDefault();
|
||||||
|
|
||||||
var theme = document.getElementById('theme').value;
|
var theme = document.getElementById('theme').value;
|
||||||
var blacklist = document.getElementById('blacklist').value;
|
var blacklist = document.getElementById('blacklist').value;
|
||||||
|
var loggingType = detectCheckedRadio('loggingType');
|
||||||
|
|
||||||
chrome.storage.sync.set({
|
chrome.storage.sync.set({
|
||||||
theme: theme,
|
theme: theme,
|
||||||
blacklist: blacklist
|
blacklist: blacklist,
|
||||||
|
loggingType: loggingType
|
||||||
}, function () {
|
}, function () {
|
||||||
// Update status to let user know options were saved.
|
// Update status to let user know options were saved.
|
||||||
var status = $('#status');
|
var status = $('#status');
|
||||||
@@ -39,10 +51,12 @@ function restore_options() {
|
|||||||
// Use default value color = 'red' and likesColor = true.
|
// Use default value color = 'red' and likesColor = true.
|
||||||
chrome.storage.sync.get({
|
chrome.storage.sync.get({
|
||||||
theme: 'light',
|
theme: 'light',
|
||||||
blacklist: ''
|
blacklist: '',
|
||||||
|
loggingType: 'domain'
|
||||||
}, function (items) {
|
}, function (items) {
|
||||||
document.getElementById('theme').value = items.theme;
|
document.getElementById('theme').value = items.theme;
|
||||||
document.getElementById('blacklist').value = items.blacklist;
|
document.getElementById('blacklist').value = items.blacklist;
|
||||||
|
document.getElementById(items.loggingType + 'Type').checked = true;
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user