var Clay = require('pebble-clay');
var clayConfig = require('./config');
var clay = new Clay(clayConfig);
var messageKeys = require('message_keys');
var sid;
var status;
var retry;
retry = 1;
function xhr_to_syno(method, url_path, onload_function, max_retry) {
console.log('------xhr start')
status = "";
if (JSON.parse(localStorage.getItem('clay-settings')).server) {
var server = JSON.parse(localStorage.getItem('clay-settings')).server
url = server + url_path;
var xhr = new XMLHttpRequest();
xhr.timeout = 4000; // time in milliseconds
xhr.open(method, url, true);
console.log('------xhr opened on ' + url + ' # retry=' + retry)
xhr.onload = function() {
console.log('------xhr onload')
if (xhr.readyState === 4) {
retry = 1;
console.log('------xhr request returned');
if (xhr.status == 200) {
onload_function(xhr);
return true;
} else {
console.log('------xhr request returned error code ' + xhr.status);
return false;
}
}
};
xhr.ontimeout = function(e) {
retry++;
if (retry < max_retry) {
console.log('------xhr timed out retrying another time ');
xhr_to_syno(method, url_path, onload_function, max_retry);
} else {
console.log('------xhr timed out ' + retry + ' time');
//send back "timeout" to watch
message = "Call to server timed out, verify settings and connectivity";
// Build message
var dict = {
'status': message,
};
// Send the message
Pebble.sendAppMessage(dict, function(e) {
console.log('sent');
}, function() {
console.log('failed');
});
return false;
}
};
xhr.send(null);
} else {
Pebble.showSimpleNotificationOnPebble("DSCam H-S", "You need to set your Synology account and server.");
}
}
function authenticate() {
var response;
sid = "";
console.log('---- authenticate');
if (JSON.parse(localStorage.getItem('clay-settings')).username && JSON.parse(localStorage.getItem('clay-settings')).password) {
var username = JSON.parse(localStorage.getItem('clay-settings')).username;
var password = JSON.parse(localStorage.getItem('clay-settings')).password;
console.log('-- username:' + username);
console.log('-- password:' + password);
var url_path = "/webapi/auth.cgi?api=SYNO.API.Auth&method=Login&version=2&account=" + username + "&passwd=" + password + "&session=SurveillanceStation&format=sid";
var method = "GET";
onload_function = function(xhr) {
response = JSON.parse(xhr.responseText);
if (response.success == true) {
sid = response.data.sid;
console.log('------Authentication succeeded');
if (sid != "") {
message = "Welcome to Syno Cam Switch ! ready & authenticated";
// Build message
var dict = {
'auth': message,
};
// Send the message
Pebble.sendAppMessage(dict, function(e) {
console.log('sent');
}, function() {
console.log('failed');
});
} else {
console.log('------Unexpected error : authentication is OK but no SID retrieved');
}
} else {
console.log('------Authentication failed : ' + response.toString());
}
};
max_retry = 10;
xhr_to_syno(method, url_path, onload_function, max_retry);
} else {
console.log("--- failed to get settings");
Pebble.showSimpleNotificationOnPebble("DSCam H-S", "You need to set your Synology account and server.");
}
}
function get_status() {
var response;
if (sid != "") {
status = "";
console.log('---- get_status');
var url_path = "/webapi/entry.cgi?api=SYNO.SurveillanceStation.HomeMode&version=1&method=GetInfo&_sid=" + sid;
var method = "GET";
onload_function = function(xhr) {
response = JSON.parse(xhr.responseText);
if (response.success == true) {
status = response.data.on;
var message;
switch (status) {
case true:
message = "Your Home mode is ON";
break;
case false:
message = "Your Home mode is OFF";
break;
default:
message = "home mode is unknown !";
}
// Build message
var dict = {
'status': message,
};
// Send the message
Pebble.sendAppMessage(dict, function(e) {
console.log('sent');
}, function() {
console.log('failed');
});
}
}
max_retry = 10;
xhr_to_syno(method, url_path, onload_function, max_retry);
} else {
authenticate();
get_status();
}
}
function switch_home(bool) {
var response;
console.log('---- authenticate');
if (sid != "") {
status = "";
console.log('---- get_status');
url_path = "/webapi/entry.cgi?api=SYNO.SurveillanceStation.HomeMode&version=1&method=GetInfo&_sid=" + sid;
var method = "GET";
onload_status_function = function(xhr) {
response = JSON.parse(xhr.responseText);
if (response.success == true) {
status = response.data.on;
console.log('------ status:' + status);
var message;
var dict;
if (status != bool) {
console.log('---- switching home mode to ' + bool);
url_path = "/webapi/entry.cgi?api=SYNO.SurveillanceStation.HomeMode&version=1&method=Switch&on=" + bool + "&_sid=" + sid;
method = "GET"
onload_switch_function = function(xhr) {
response = JSON.parse(xhr.responseText);
if (response.success == true) {
status = bool;
switch (status) {
case true:
message = "You just set Home mode ON";
break;
case false:
message = "You just set Home mode OFF";
break;
default:
message = "something happened, try again !";
}
// Build message
dict = {
'status': message,
};
// Send the message
Pebble.sendAppMessage(dict, function(e) {
console.log('sent');
}, function() {
console.log('failed');
});
}
}
max_retry = 10;
xhr_to_syno(method, url_path, onload_switch_function, max_retry);
} else {
console.log('---- nothing to do, status already ' + status);
switch (status) {
case true:
message = "Your Home Mode is already ON";
break;
case false:
message = "Your Home Mode is already OFF";
break;
default:
message = "something happened, try again !";
}
// Build message
dict = {
'status': message,
};
// Send the message
Pebble.sendAppMessage(dict, function(e) {
console.log('sent');
}, function() {
console.log('failed');
});
}
}
}
max_retry = 10;
xhr_to_syno(method, url_path, onload_status_function, max_retry);
} else {
authenticate();
switch_home(bool);
}
}
// Get JS readiness events
Pebble.addEventListener('ready', function(e) {
console.log("---- local storage:");
console.log("user " + JSON.parse(localStorage.getItem('clay-settings')).username);
console.log('PebbleKit JS is ready');
// Update Watch on this
Pebble.sendAppMessage({ 'JSReady': 1 });
});
// Get AppMessage events
Pebble.addEventListener('appmessage', function(e) {
// Get the dictionary from the message
var dict = e.payload;
console.log(dict[0].toString());
switch (dict[0]) {
case 'auth':
authenticate();
break;
case 'get':
get_status();
break;
case 'home_on':
switch_home(true);
break;
case 'home_off':
switch_home(false);
break;
default:
console.log('Sorry. I don\'t understand your request :' + dict[0]);
}
});