Sales Force Sphero

First, let's import Cylon:

var Cylon = require('cylon');

With that done, let's define the Robot we'll use to communicate with Salesforce:

Cylon.robot({
  name: 'salesforce',

  connections: {
    sfcon: {
      adaptor: 'force',
      sfuser: process.env.SF_USERNAME,
      sfpass: process.env.SF_SECURITY_TOKEN,
      orgCreds: {
        clientId: process.env.SF_CLIENT_ID,
        clientSecret: process.env.SF_CLIENT_SECRET,
        redirectUri: 'http://localhost:3000/oauth/_callback'
      }
    }
  },

  devices: {
    salesforce: { driver: 'force' }
  },

  work: function(my) {
    my.salesforce.on('start', function() {
      my.salesforce.subscribe('/topic/SpheroMsgOutbound', function(data) {
        var msg = "Sphero: " + data.sobject.Sphero_Name__c + ",";
            msg += "Bucks: " + data.sobject.Bucks__c + ",";
            msg += "SM_Id: " + data.sobject.Id;

        console.log(msg);

        var sphero = Cylon.robots[data.sobject.Sphero_Name__c];
        sphero.react();
      });
    });
  }
});

Next up, the shape our Sphero Robot will take:

Cylon.robot({
  name: 'ROY',

  connections: {
    sphero: { adaptor: 'sphero' }
  },

  devices: {
    sphero: { driver: 'sphero' }
  },

  react: function() {
    this.sphero.setRGB(0x00FF00);
    this.sphero.roll(90, Math.floor(Math.random() * 360));
  },

  work: function(my) {
    console.log('Setting up collision detection.');
    my.sphero.detectCollisions();

    my.sphero.stop();
    my.sphero.setRGB(0x00FF00);

    my.sphero.roll(90, Math.floor(Math.random() * 360));

    my.sphero.on('collision', function() {
      my.sphero.setRGB(0x0000FF, my);
      my.sphero.stop();

      var data = JSON.stringify({
        spheroName: my.name,
        bucks: "" + (my.totalBucks++)
      });

      var sf = Cylon.robots.salesforce;
      sf.devices.salesforce.push('SpheroController', 'POST', data);
    });
  }
});

Now that our robot knows what work to do, and the work it will be doing that hardware with, we can start it:

Cylon.start();