Files
companion-module-toggl-track/index.js
2022-02-26 10:41:40 +00:00

262 lines
5.3 KiB
JavaScript

var instance_skel = require('../../instance_skel')
var debug
var log
function instance(system, id, config) {
var self = this
// super-constructor
instance_skel.apply(this, arguments)
return self
}
instance.prototype.updateConfig = function (config) {
var self = this
self.config = config
self.auth()
self.getCurrentTimer()
self.actions()
}
instance.prototype.init = function () {
var self = this
debug = self.debug
log = self.log
self.currentTimer = null
self.init_presets()
self.auth()
self.getCurrentTimer()
self.actions()
}
instance.prototype.auth = function () {
var self = this
auth = Buffer.from(self.config.apiToken + ':' + 'api_token').toString('base64')
self.header = []
self.header['Content-Type'] = 'application/json'
self.header['Authorization'] = 'Basic ' + auth
console.log(self.header)
}
instance.prototype.config_fields = function () {
var self = this
return [
{
type: 'text',
id: 'info',
width: 12,
label: 'Information',
value: 'This module is for the toggl track service',
},
{
type: 'textinput',
id: 'apiToken',
label: 'Personal API Token from your Toggl user profile (required)',
width: 12,
default: '',
},
]
}
instance.prototype.destroy = function () {
var self = this
self.currentTimer = null
debug('destroy', self.id)
}
instance.prototype.init_presets = function () {
var self = this
var presets = []
presets.push({
category: 'Timer',
label: 'Start',
bank: {
style: 'text',
text: 'Start Timer',
size: '18',
color: 16777215,
bgcolor: 0,
},
actions: [
{
action: 'startNewTimer',
options: {
description: '',
},
},
],
})
presets.push({
category: 'Timer',
label: 'Stop',
bank: {
style: 'text',
text: 'Stop Timer',
size: '18',
color: 16777215,
bgcolor: 0,
},
actions: [
{
action: 'getCurrentTimer',
},
{
action: 'stopCurrentTimer',
delay: 250,
},
],
})
self.setPresetDefinitions(presets)
}
instance.prototype.actions = function (system) {
var self = this
self.setActions({
startNewTimer: {
label: 'Start New Timer',
options: [
{
type: 'textinput',
label: 'Description',
id: 'description',
default: '',
},
],
},
getCurrentTimer: {
label: 'Get Current Timer',
},
stopCurrentTimer: {
label: 'Stop Current Timer',
},
})
}
instance.prototype.action = function (action) {
var self = this
const opt = action.options
switch (action.action) {
case 'startNewTimer': {
var restCmd = 'rest' // post
var cmd = 'https://api.track.toggl.com/api/v8/time_entries/start'
var body = '{"time_entry":{"description":"' + opt.description + '","created_with":"companion"}}'
console.log(body)
break
}
case 'stopCurrentTimer': {
var restCmd = 'rest_put'
console.log(self.currentTimer)
if (self.currentTimer != null && self.currentTimer != undefined) {
var cmd = 'https://api.track.toggl.com/api/v8/time_entries/' + self.currentTimer + '/stop'
console.log(cmd)
} else {
self.log('warn', 'No running timer to stop or running timer ID unknown')
return
}
break
}
case 'getCurrentTimer': {
self.getCurrentTimer()
return
break
}
default:
return
break
}
self.system.emit(
restCmd,
cmd,
body,
function (err, result) {
if (err !== null) {
console.log(result.statusCode)
console.log('HTTP Request failed (' + result.error.code + ')')
self.status(self.STATUS_ERROR, result.error.code)
} else {
console.log(typeof result.data)
console.log(result.statusCode)
if (!self.auth_error) {
self.status(self.STATUS_OK)
if (typeof result.data === 'object') {
if (typeof result.data.data === 'object') {
self.interpretData(result.data.data)
}
} else {
self.currentTimer = null
console.log(result.data)
self.log('debug', result.data)
}
}
}
},
self.header
)
}
instance.prototype.getCurrentTimer = function () {
var self = this
var cmd = 'https://api.track.toggl.com/api/v8/time_entries/current'
self.system.emit(
'rest_get',
cmd,
function (err, result) {
if (err !== null) {
console.log('HTTP Request failed (' + result.error.code + ')')
self.status(self.STATUS_ERROR, result.error.code)
} else if (result.response.statusCode == 200) {
console.log('status:' + result.response.statusCode)
self.status(self.STATUS_OK)
if (typeof result.data.data === 'object' && result.data.data != null) {
if ('id' in result.data.data) {
self.currentTimer = result.data.data.id
console.log(self.currentTimer)
self.log('debug', 'Current timer id ' + self.currentTimer)
}
} else {
console.log(result.data)
self.log('debug', 'No timer running')
self.currentTimer = null
}
} else {
console.log('error: ' + result.response.statusCode)
self.status(self.STATUS_ERROR, result.response.statusCode)
self.log('warn', 'Unable to connect to toggl, check your API token is correct')
self.currentTimer = null
}
},
self.header
)
}
instance.prototype.interpretData = function (data) {
var self = this
console.log(data)
if ('id' in data) {
console.log(data.id)
self.currentTimer = data.id
self.log('debug', 'timer id ' + data.id)
}
}
instance_skel.extendedBy(instance)
exports = module.exports = instance