示例#1
0
Intercom.prototype._updateUser = function (identify, settings, callback) {
  var traits = formatTraits(identify.traits());
  var active = identify.active();

  extend(traits, {
    user_id: identify.userId(),
    email: identify.email(),
    name: identify.name()
  });

  if (active) traits.last_request_at = time(identify.timestamp());
  if (identify.created()) traits.created_at = time(identify.created());

  // Add company data
  var company   = identify.proxy('traits.company');
  var companies = identify.proxy('traits.companies');

  if (company) companies = [company];
  if (companies) {
    if (Array.isArray(companies)) traits.companies = companies.map(formatCompany);
    else dot.del(traits, 'companies'); // intercom 500s if this is the case
  }

  return this
    .put('/users')
    .set(headers(identify, settings))
    .type('json')
    .send(traits)
    .end(this.handle(callback));
};
示例#2
0
Intercom.prototype._updateUser = function (identify, settings, callback) {

  var traits = formatTraits(identify.traits());
  var active = identify.active();

  extend(traits, {
    user_id: identify.userId(),
    email: identify.email(),
    name: identify.name()
  });

  if (active) traits.last_request_at = unixTime(identify.timestamp());
  if (identify.created()) traits.created_at = unixTime(identify.created());

  // Add company data
  var company   = identify.proxy('traits.company');
  var companies = identify.proxy('traits.companies');

  if (company) companies = [company];
  if (companies) {
    if (Array.isArray(companies)) traits.companies = companies.map(formatCompany);
    else objCase.del(traits, 'companies'); // intercom 500s if this is the case
  }

  var req = {
    url     : this.baseUrl + '/users',
    headers : headers(identify, settings),
    json    : traits
  };

  debug('updating the user %o', req);
  request.put(req, this._handleResponse(callback));
};
示例#3
0
Cohorter.prototype.query = function (start, end, offset, callback) {
  debug('loading customers with created [%s - %s] with offset %d ..', start, end, offset);
  var options = {
    created: { gte: unixTime(start), lte: unixTime(end) },
    count: this.options.count,
    offset: offset
  };
  this.stripe.customers.list(options, function (err, res) {
    if (err) return callback(err);
    var customers = res.data;
    debug('loaded %d customers with offset %d', customers.length, offset);
    callback(null, res);
  });
};
示例#4
0
function clean(obj){
  var ret = {};

  for (var k in obj) {
    var value = obj[k];
    if (null == value) continue;

    // iso
    if (isostring(value)) {
      ret[k] = time(value);
      continue;
    }

    // not object
    if ('[object Object]' != value.toString()) {
      ret[k] = value.toString();
      continue;
    }

    // json
    ret[k] = JSON.stringify(value);
  }

  return ret;
}
function clean(obj){
  obj = traverse(obj);
  var ret = {};

  for (var k in obj) {
    var value = obj[k];
    if (null == value) continue;

    // convert dates
    if (is.date(value)) {
      ret[k] = time(value);
      continue;
    }

    // not object
    if ('[object Object]' != value.toString()) {
      ret[k] = value.toString();
      continue;
    }

    // json
    ret[k] = JSON.stringify(value);
  }

  return ret;
}
示例#6
0
function event(track){
  var extras = track.properties();

  reject(extend(extras, {
    _ua: track.userAgent(),
    _referer: track.referrer(),
    _url: track.proxy('properties.url'),
    _page_title: track.proxy('properties.pageTitle'),
    _ip: track.ip()
  }));

  del(extras, "note");
  del(extras, "account");
  del(extras, "targetId");
  del(extras, "linkUrl");
  del(extras, "thumbUrl");
  del(extras, "url");
  del(extras, "pageTitle");
  del(extras, "referrer");
  del(extras, "revenue");

  return reject({
    name: track.event(),
    timestamp: time(track.timestamp()),
    extras: extras,
    note: track.proxy('properties.note'),
    account: track.proxy('properties.account'),
    target_id: track.proxy('properties.targetId'),
    link_url: track.proxy('properties.linkUrl'),
    thumb_url: track.proxy('properties.thumbUrl'),
    revenue: 100 * track.revenue()
  });
}
示例#7
0
function formatCompany (company) {
  if (is.string(company)) company = { name : company };
  if (company.created) company.created_at = unixTime(company.created);
  if (!company.id && !company.name) return company;
  company.id = company.id || hash(company.name);
  return company;
}
exports.track = function(track){
  var payload = {};
  // Some track events that are campaign critical inside Kahuna may depend on user attributes
  var traits = track.proxy('context.traits');
  if (traits && !isEmpty(traits)) {
    traits.id = track.userId(); // adding traits.id for parity with identify.traits()
    payload.user_info = JSON.stringify(traits);
  }
  var events = [{
    event: track.event(),
    time: unixTime(track.timestamp())
  }];

  // Formulate properties to required specs
  var flattenedObj = trample(reject(track.properties()));
  events[0].properties = foldl(function(results, value, key){
    if (value) {
      if (!is.array(value)) value = [value];
      results[key] = reject(value.map(function(prop){
        if (prop) return prop.toString();
      }));
    }
    return results;
  }, {}, flattenedObj);

  payload.events = JSON.stringify(events);
  payload.credentials = formulateCreds(track);

  return addDeviceParams(track, payload);
};
exports.track = function(msg){
  var props = traverse(msg.properties());
  return {
    timestamp: time(msg.timestamp()),
    data: convert(props, time),
    name: msg.event()
  }
};
exports.track = function(track) {
  var properties = createBaseTrackProperties(track, this.settings);
  return extend(properties, {
    _p: track.userId() || track.sessionId(),
    _t: toUnixTimestamp(track.timestamp()),
    _n: track.event(),
    _d: 1
  });
};
示例#11
0
  Object.keys(properties).forEach(function (key) {
    var val = properties[key];
    if (val === null || val === undefined) return;

    // Transform dates and objects
    if (isostring(val)) output[key] = unixTime(val);
    else if (val.toString() !== '[object Object]') output[key] = val.toString();
    else output[key] = JSON.stringify(val);
  });
  Object.keys(traits).forEach(function(key){
    var val = traits[key];
    if (isostring(val) || is.date(val)) {
      val = time(val);
      key = dateKey(key);
    }

    output[key] = val;
  });
CustomerIO.prototype.visit = function(message, fn){
  if (!message.active()) return setImmediate(fn);
  this
  .put(message.userId())
  .auth(this.settings.siteId, this.settings.apiKey)
  .send({ _last_visit: time(message.timestamp()) })
  .type('json')
  .end(this.handle(fn));
};
示例#14
0
exports.track = function(track){
  var event = clean(track.event());
  return {
    name: event,
    value: track.value() || 1,
    measure_time: time(track.timestamp()),
    source: track.options(this.name).source || event
  };
};
示例#15
0
function formatCompany (company) {
  if (is.string(company)) company = { name : company };
  var created = dot(company, 'created') || dot(company, 'createdAt');
  if (created) company.created_at = time(created);
  if (!company.id && !company.name) return company;
  company.id = company.id || hash(company.name);
  dot.del(company, 'created');
  delete company.createdAt;
  return company;
}
 var mappedProducts = map(products, function(product, i) {
   return extend(
     createBaseTrackProperties(product, settings),
     {
       // Ensure products aren't ignored as duplicates
       // http://support.kissmetrics.com/troubleshooting/detecting-duplicates
       _t: toUnixTimestamp(product.timestamp()) + i
     }
   );
 });
exports.screen = function(msg){
  var props = traverse(msg.properties());
  var name = `Viewed ${msg.name()} Screen`;
  delete props.name;

  return {
    timestamp: time(msg.timestamp()),
    name: name,
    data: convert(props, time)
  }
};
示例#18
0
function formatProperties(track, settings){
  var properties = track.properties() || {};
  var identify = track.identify();
  var userAgent = track.userAgent();
  extend(properties, {
    token: settings.token,
    distinct_id: track.userId() || track.sessionId(),
    time: time(track.timestamp()),
    mp_lib: 'Segment: ' + track.library().name,
    $lib_version: track.library().version,
    $search_engine: track.proxy('properties.searchEngine'),
    $referrer: track.referrer(),
    $username: track.username(),
    $query: track.query(),
    $os: track.proxy('context.os.name'),
    $os_version: track.proxy('context.os.version'),
    $manufacturer: track.proxy('context.device.manufacturer'),
    $screen_dpi: track.proxy('context.screen.density'),
    $screen_height: track.proxy('context.screen.height'),
    $screen_width: track.proxy('context.screen.width'),
    $bluetooth_enabled: track.proxy('context.network.bluetooth'),
    $has_telephone: track.proxy('context.network.cellular'),
    $carrier: track.proxy('context.network.carrier'),
    $app_version: track.proxy('context.app.version'),
    $wifi: track.proxy('context.network.wifi'),
    $brand: track.proxy('context.device.brand'),
    $model: track.proxy('context.device.model'),
    ip: track.ip()
  });

  // Remove possible duplicate properties.
  object.del(properties, 'referrer');
  object.del(properties, 'username');
  object.del(properties, 'query');
  object.del(properties, 'searchEngine');

  // Add the name tag
  properties.mp_name_tag = identify.name()
    || identify.email()
    || identify.userId()
    || identify.sessionId();

  properties = reject(properties);
  stringifyValues(properties);

  if (userAgent) {
    var parsed = parse(userAgent);
    var browser = parsed.browser
    var os = parsed.os;
    if (browser) properties.$browser = browser.name + ' ' + browser.version;
    if (os) properties.$os = os.name + ' ' + os.version;
  }
  return properties;
}
示例#19
0
GAClassic.prototype._querystring = function (message, settings) {

  return {
    utmhn : settings.domain,                 // site domain (optional)
    utmac : settings.serversideTrackingId,   // set our tracking id
    utmwv : this.version,                    // set the ga version
    utmcc : this._cookie(message, settings), // cookie request
    utmn  : unixTime(new Date()),            // prevent caching
    utmcs : '-',                             // language
    utmr  : '-'                              // referrer url
  };
};
 it('should get a good response from the API', function(done){
   var track = helpers.track();
   payload.timestamp = time(track.timestamp());
   payload.data = convert(track.properties(), time);
   payload.name = track.event();
   test
     .track(track)
     .requests(1)
     .request(0)
     .sends(payload)
     .expects(200, done)
 });
示例#21
0
exports.track = function(track){
  var payload = clean(track.properties());
  if (track.revenue()) payload['Billing Amount'] = track.revenue();
  if (this.settings.prefixProperties) payload = prefix(track.event(), payload);
  return extend(payload, {
    _p: track.userId() || track.sessionId(),
    _t: time(track.timestamp()),
    _k: this.settings.apiKey,
    _n: track.event(),
    _d: 1
  });
};
exports.page = function(msg){
  var props = traverse(msg.properties());
  var url = props.url;
  delete props.url;

  return {
    timestamp: time(msg.timestamp()),
    type: 'page',
    name: url,
    data: convert(props, time)
  }
};
exports.page = function(page) {
  var name = 'Viewed ' + (page.name() || page.category()) + ' Page';
  var properties = prefix('Page', page.properties());
  var payload = extend(properties, {
    _p: page.userId() || page.sessionId(),
    _t: toUnixTimestamp(page.timestamp()),
    _k: this.settings.apiKey,
    _n: name,
    _d: 1
  });
  addIPAndUserAgent(page, payload);
  return payload;
};
exports.screen = function(screen) {
  var name = 'Viewed ' + (screen.name() || screen.category()) + ' Screen';
  var properties = prefix('Screen', screen.properties());
  var payload = extend(properties, {
    _p: screen.userId() || screen.sessionId(),
    _t: toUnixTimestamp(screen.timestamp()),
    _k: this.settings.apiKey,
    _n: name,
    _d: 1
  });
  addIPAndUserAgent(screen, payload);
  return payload;
};
exports.track = function(track){
  var props = clean(track.properties());
  var revenue = track.revenue();
  props.email = track.email();
  if (revenue) props.revenue_amount = revenue;

  return {
    uid: track.userId() || track.sessionId(),
    occurred_at: time(track.timestamp()),
    action_name: track.event(),
    properties: props
  };
};
 it('should get a good response from the API', function(done){
   var identify = helpers.identify();
   payload = identify.traits();
   payload.created_at = time(identify.created());
   payload.email = identify.email();
   del(payload, 'created');
   payload = convert(payload, time);
   test
     .identify(identify)
     .requests(1)
     .request(0)
     .sends(payload)
     .expects(200, done);
 });
exports.group = function(group){
  var userId = group.userId();
  var anonymousId = group.sessionId();
  var payload = prefix('Group', clean(group.traits()));
  payload = extend(payload, {
    'Group - id': group.groupId(),
    _p: userId || anonymousId,
    _t: toUnixTimestamp(group.timestamp()),
    _k: this.settings.apiKey,
    _d: 1
  });
  addIPAndUserAgent(group, payload);
  return payload;
};
示例#28
0
    app.get('/:timestamp', function(request, response) {
        var timestamp = (isNaN(request.params.timestamp))
            ? request.params.timestamp
            : request.params.timestamp*1000
        var unix = unix_time(timestamp)

        if (!unix) timestamp = null

        else if (!isNaN(timestamp))
            timestamp = getNatureDate(timestamp)

        response.json({
            unix: unix,
            natural: timestamp
        })
    });
 it('should send page successfully', function(done){
   var event = librato.mapper.clean(page.track(page.fullName()).event());
   test
     .set(settings)
     .page(page)
     .sends({
       gauges: [{
         name: event,
         value: 1,
         measure_time: time(page.timestamp()),
         source: event
       }]
     })
     .expects(200)
     .end(done);
 });
示例#30
0
 it('should track successfully', function(done){
   var event = librato.mapper.clean(track.event());
   test(librato)
     .set(settings)
     .track(track)
     .sends({
       gauges: [{
         name: event,
         value: 1,
         measure_time: time(track.timestamp()),
         source: event
       }]
     })
     .expects(200)
     .end(done);
 });