Skip to content

Instantly share code, notes, and snippets.

Embed
What would you like to do?
Enhanced version of gists-can-help-for-tropo-dev.js (https://gist.github.com/ObjectIsAdvantag/cc131aab9409f014db22e18e572f722d)
// DO NOT DELETE : this gist is referenced by a live article
//
// 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("Spark Onboarding - INFO:", "YOUR_INTEGRATION_SUFFIX");
var SparkDebug = new SparkLog("Spark Onboarding - 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);
}
//
// Tropo Script custom logic starts here
//
// returns true or false
function isEmail(email) {
// extract from http://stackoverflow.com/questions/46155/validate-email-address-in-javascript
var re = /^(([^<>()\[\]\\.,;:\s@"]+(\.[^<>()\[\]\\.,;:\s@"]+)*)|(".+"))@((\[[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}])|(([a-zA-Z\-0-9]+\.)+[a-zA-Z]{2,}))$/;
return re.test(email);
}
// returns an email address if found in the phrase specified
function extractEmail(phrase) {
if (phrase) {
var parts = phrase.split(" ");
for (var i = 0; i < parts.length ; i++) {
if (isEmail(parts[i])) {
return parts[i];
}
}
}
return null;
}
// 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 email = extractEmail(input);
if (email) {
info("new subscription for email: " + email);
say ("Thanks for suscribing to our service.");
}
else {
debug("could not extract email from: " + input + ", for: " + currentCall.callerID );
say ("Sorry we could not read your email");
}
}
else {
// Speak a welcome message if the incoming call is not a SMS
info("incoming call from: " + currentCall.callerID );
say("Please text your email to this number.");
}
}
else {
debug("no outgoing call support here");
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
You can’t perform that action at this time.
You signed in with another tab or window. Reload to refresh your session. You signed out in another tab or window. Reload to refresh your session.