Skip to content

Instantly share code, notes, and snippets.

@ObjectIsAdvantag
Last active November 4, 2016 01:26
Show Gist options
  • Save ObjectIsAdvantag/58a8e833507bf5acd336f19e3a513450 to your computer and use it in GitHub Desktop.
Save ObjectIsAdvantag/58a8e833507bf5acd336f19e3a513450 to your computer and use it in GitHub Desktop.
Simple script to boostrap Tropo with Spark log enabled
// QUICK START GUIDE
//
// 1. Clone this gists and make it private
// 2. Create an incoming integratin in a Spark Room from the Spark Web client : http://web.ciscospark.com
// 3. Replace YOUR_INTEGRATION_SUFFIX by the integration id, example: Y2lzY29zcGFyazovL3VzL1dFQkhPT0svZjE4ZTI0MDctYzg3MS00ZTdmLTgzYzEtM2EyOGI1N2ZZZZZ
// 4. Replace APP by your Tropo application name, example: TropoBootstrap
// 5. Create your Tropo application pointing to your raw gist URL, by appending /raw/YOUR_GIST_NAME.js to the gist URL
//
// Cisco Spark Logging Library for Tropo
//
// Factory for the Spark Logging Library, with 2 parameters
// - the name of the application will prefix all your logs,
// - the Spark Incoming integration (to which logs will be posted)
// To create an Incoming Integration
// - click integrations in the right pane of a Spark Room (Example : I create a dedicated "Tropo Logs" room)
// - select incoming integration
// - give your integration a name, it will be displayed in the members lists (Example : I personally named it "from tropo scripting")
// - copy your integration ID, you'll use it to initialize the SparkLibrary
function SparkLog(appName, incomingIntegrationID) {
if (!appName) {
log("SPARK_LOG : bad configuration, no application name, exiting...");
throw createError("SparkLibrary configuration error: no application name specified");
}
this.tropoApp = appName;
if (!incomingIntegrationID) {
log("SPARK_LOG : bad configuration, no Spark incoming integration URI, exiting...");
throw createError("SparkLibrary configuration error: no Spark incoming integration URI specified");
}
this.sparkIntegration = incomingIntegrationID;
log("SPARK_LOG: all set for application:" + this.tropoApp + ", posting to integrationURI: " + this.sparkIntegration);
}
// This function sends the log entry to the registered Spark Room
// Invoke this function from the Tropo token-url with the "sparkIntegration" parameter set to the incoming Webhook ID you'll have prepared
// Returns true if the log entry was acknowledge by Spark (ie, got a 2xx HTTP status code)
SparkLog.prototype.log = function(newLogEntry) {
// Robustify
if (!newLogEntry) {
newLogEntry = "";
}
var result;
try {
// Open Connection
var url = "https://api.ciscospark.com/v1/webhooks/incoming/" + this.sparkIntegration;
connection = new java.net.URL(url).openConnection();
// Set timeout to 10s
connection.setReadTimeout(10000);
connection.setConnectTimeout(10000);
// Method == POST
connection.setRequestMethod("POST");
connection.setRequestProperty("Content-Type", "application/json");
// TODO : check if this cannot be removed
connection.setRequestProperty("Content-Length", newLogEntry.length);
connection.setUseCaches (false);
connection.setDoInput(true);
connection.setDoOutput(true);
//Send Post Data
bodyWriter = new java.io.DataOutputStream(connection.getOutputStream());
log("SPARK_LOG: posting: " + newLogEntry + " to: " + url);
contents = '{ "text": "' + this.tropoApp + ': ' + newLogEntry + '" }'
bodyWriter.writeBytes(contents);
bodyWriter.flush ();
bodyWriter.close ();
result = connection.getResponseCode();
log("SPARK_LOG: read response code: " + result);
if(result < 200 || result > 299) {
log("SPARK_LOG: could not log to Spark, message format not supported");
return false;
}
}
catch(e) {
log("SPARK_LOG: could not log to Spark, socket Exception or Server Timeout");
return false;
}
log("SPARK_LOG: log successfully sent to Spark, status code: " + result);
return true; // success
}
// Let's create several instances for various log levels
// Note that you may spread logs to distinct rooms by changing the integrationId
var SparkInfo = new SparkLog("APP-INFO", "YOUR_INTEGRATION_SUFFIX");
var SparkDebug = new SparkLog("APP-DEBUG", "YOUR_INTEGRATION_SUFFIX");
//
// Log Configuration happens here
//
// info level used to get a synthetic sump up of what's happing
function info(logEntry) {
log("INFO: " + logEntry);
SparkInfo.log(logEntry);
// Uncomment if you opt to go for 2 distinct Spark Rooms for DEBUG and INFO log levels
//SparkDebug.log(logEntry);
}
// debug level used to get detail informations
function debug(logEntry) {
log("DEBUG: " + logEntry);
SparkDebug.log(logEntry);
}
// You may check currentCall features here : https://www.tropo.com/docs/scripting/currentcall
if (currentCall) {
if (currentCall.network == "SMS") {
var input = currentCall.initialText;
debug("received: " + input + ", from: " + currentCall.callerID );
// check we received a valid email address
var reversed = input.split("").reverse().join("");
say("Tropo echo: " + reversed);
info("echoed: " + reversed + ", to: " + currentCall.callerID);
}
else {
// Speak a welcome message if the incoming call is not a SMS
debug("incoming call from: " + currentCall.callerID );
say("Welcome to the Echo service.", { voice:"Susan"});
wait(1000);
say("Text to this number, and get your message reversed.", { voice:"Kate"});
wait(1000);
say("Transmettez un SMS à ce numéro, et recevez votre SMS inversé en retour.", { voice:"Aurelie"});
info("spoke the welcome message to: " + currentCall.callerID );
}
}
else {
debug("new API request, nothing there.");
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment