Git Product home page Git Product logo

hubot-hipchat's Introduction

hubot-hipchat

Quickstart: Hubot for HipChat on Heroku

The Easy Way

Try deploying the "Triatomic" starter HipChat Hubot project to Heroku. Once you have it running, simply clone it and customize its scripts as you please.

Deploy

The "I do it myself!" Way

This is a HipChat-specific version of the more general instructions in the Hubot wiki. Some of this guide is derived from Hubot's general set up instructions. You may wish to see that guide for more information about the general use and configuration of Hubot, in addition to details for deploying it to environments other than Heroku.

  1. From your existing HipChat account add your bot as a new user. Stay signed in to the account - we'll need to access its account settings later.

  2. If you are using Linux, make sure libexpat is installed:

     % apt-get install libexpat1-dev
    
  3. You will need node.js. Joyent has an excellent blog post on how to get those installed, so we'll omit those details here. You'll want node.js 0.12.x or later.

  4. Once node and npm are ready, we can install the hubot generator:

     %  npm install -g yo generator-hubot
    
  5. This will give us the hubot yeoman generator. Now we can make a new directory, and generate a new instance of hubot in it, using this Hubot HipChat adapter. For example, if we wanted to make a bot called myhubot:

     % mkdir myhubot
     % cd myhubot
     % yo hubot --adapter hipchat
    
  6. At this point, you'll be asked a few questions about the bot you are creating. When you finish answering, yeoman will download and install the necessary dependencies. (If the generator hangs, a workaround is to re-run without the --adapter hipchat argument, accept the default campfire value when prompted, and then re-run yet again, again with the hipchat adapter argument, accepting the prompts to overwrite existing files. This appears to be an issue with the generator itself.)

  7. Turn your hubot directory into a git repository:

     % git init
     % git add .
     % git commit -m "Initial commit"
    
  8. Install the Heroku command line tools if you don't have them installed yet.

  9. Create a new Heroku application and (optionally) rename it:

     % heroku create our-company-hubot
    
  10. Add Redis To Go to your Heroku app:

     % heroku addons:create redistogo:nano --app our-company-hubot
    
  11. Configure it:

    You will need to set a configuration variable if you are hosting on the free Heroku plan.

     % heroku config:add HEROKU_URL=http://our-company-hubot.herokuapp.com
    

    Where the URL is your Heroku app's URL (shown after running heroku create, or heroku rename).

    Set the JID to the "Jabber ID" shown on your bot's XMPP/Jabber account settings:

     % heroku config:add HUBOT_HIPCHAT_JID="..."
    

    Set the password to the password chosen when you created the bot's account.

     % heroku config:add HUBOT_HIPCHAT_PASSWORD="..."
    

    If using HipChat Server Beta, you need to set xmppDomain to btf.hipchat.com.

     % heroku config:add HUBOT_HIPCHAT_XMPP_DOMAIN="btf.hipchat.com"
    
  12. Deploy and start the bot:

     % git push heroku master
     % heroku ps:scale web=1
    

    This will tell Heroku to run 1 of the web process type which is described in the Procfile.

  13. You should see the bot join all rooms it has access to (or are specified in HUBOT_HIPCHAT_ROOMS, see below). If not, check the output of heroku logs. You can also use heroku config to check the config vars and heroku restart to restart the bot. heroku ps will show you its current process state.

  14. Assuming your bot's name is "Hubot", the bot will respond to commands like "@hubot help". It will also respond in 1-1 chat ("@hubot" must be omitted there, so just use "help" for example).

  15. To configure the commands the bot responds to, you'll need to edit the hubot-scripts.json file (valid script names here) or add scripts to the scripts/ directory.

  16. To deploy an updated version of the bot, simply commit your changes and run git push heroku master again.

Bonus: Add a notification hook to Heroku so a notification is sent to a room whenever the bot is updated: https://marketplace.atlassian.com/plugins/com.heroku.hipchat/cloud/overview

Scripting Gotchas

robot.messageRoom syntax is as follows

robot.messageRoom("[email protected]", "message");

Adapter configuration

This adapter uses the following environment variables:

HUBOT_HIPCHAT_JID

This is your bot's Jabber ID which can be found in your XMPP/Jabber account settings. It will look something like [email protected]

HUBOT_HIPCHAT_PASSWORD

This is the password for your bot's HipChat account.

HUBOT_HIPCHAT_ROOMS

Optional. This is a comma separated list of room JIDs that you want your bot to join. You can leave this blank or set it to "All" to have your bot join every room. Room JIDs look like "[email protected]" and can be found in the XMPP/Jabber account settings - just add "@conf.hipchat.com" to the end of the room's "XMPP/Jabber Name".

HUBOT_HIPCHAT_ROOMS_BLACKLIST

Optional. This is a comma separated list of room JIDs that should not be joined.

HUBOT_HIPCHAT_JOIN_ROOMS_ON_INVITE

Optional. Setting to false will prevent the HipChat adapter from auto-joining rooms when invited.

HUBOT_HIPCHAT_JOIN_PUBLIC_ROOMS

Optional. Setting to false will prevent the HipChat adapter from auto-joining rooms that are publicly available (i.e. guest-accessible).

HUBOT_HIPCHAT_HOST

Optional. Use to force the host to open the XMPP connection to.

HUBOT_HIPCHAT_XMPP_DOMAIN

Optional. Set to btf.hipchat.com if using HipChat Server.

HUBOT_LOG_LEVEL

Optional. Set to debug to enable detailed debug logging.

HUBOT_HIPCHAT_RECONNECT

Optional. Seting to false will prevent the HipChat adapter from auto-reconnecting if it detects a server error or disconnection.

Running locally

To run locally on OSX or Linux you'll need to set the required environment variables and run the bin/hubot script. An example script to run the bot might look like:

#!/bin/bash

export HUBOT_HIPCHAT_JID="..."
export HUBOT_HIPCHAT_PASSWORD="..."

bin/hubot --adapter hipchat

But be aware that credentials normally shouldn't be checked into your vcs.

hubot-hipchat's People

Contributors

aaronblythe avatar alexmingoia avatar amcclosky avatar awiddersheim avatar crim avatar dtorres avatar fleeting avatar halkeye avatar inadarei avatar jamiew avatar jhubert avatar jmalonzo avatar kb avatar mafuba avatar mal avatar manojlds avatar md-cake avatar newsroomdev avatar nightwhistler avatar powdahound avatar rbergman avatar schisamo avatar schmijos avatar sopel avatar spruce avatar streeter avatar streetlogics avatar svperfecta avatar tenzer avatar yurytolochko avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

hubot-hipchat's Issues

No longer able to address robot by

When using 1.0.9 I am able to address by name 'jimbot', however, when I updated to 1.1.2 (and wobot updated from 0.6.0 to 0.8.0) I now must address it as @Jimbot3000 for it to respond. When I run hubot I do pass in --name jimbot. Also, @Jimbot3000 did not work for me in 1.0.9, only jimbot.

Is there any way that could still work?

1.0.4 Emit Issues

After some changes to a custom script and redeploying to Heroku, I got the following error continuously until setting the NPM package back to 1.0.3.

2012-04-10T18:49:29+00:00 app[app.1]: TypeError: Object # has no method 'emit'
2012-04-10T18:49:29+00:00 app[app.1]: at HipChat.run (/app/node_modules/hubot-hipchat/src/hipchat.coffee:138:19)
2012-04-10T18:49:29+00:00 app[app.1]: at Robot.run (/app/node_modules/hubot/src/robot.coffee:290:27)
2012-04-10T18:49:29+00:00 app[app.1]: at Object. (/app/node_modules/hubot/bin/hubot:102:11)
2012-04-10T18:49:29+00:00 app[app.1]: at Object. (/app/node_modules/hubot/bin/hubot:105:4)
2012-04-10T18:49:29+00:00 app[app.1]: at Module._compile (module.js:404:26)
2012-04-10T18:49:29+00:00 app[app.1]: at Object.run (/app/node_modules/hubot/node_modules/coffee-script/lib/coffee-script/coffee-script.js:68:25)
2012-04-10T18:49:29+00:00 app[app.1]: at /app/node_modules/hubot/node_modules/coffee-script/lib/coffee-script/command.js:135:29
2012-04-10T18:49:29+00:00 app[app.1]: at [object Object]. (fs.js:107:5)
2012-04-10T18:49:29+00:00 app[app.1]: at /app/node_modules/hubot/node_modules/coffee-script/lib/coffee-script/command.js:110:18
2012-04-10T18:49:29+00:00 app[app.1]: at [object Object].emit (events.js:61:17)

It was also reported here:
http://stackoverflow.com/questions/9714958/installing-hubot-on-hipchat-ubuntu

Missing methods on Hipchat-adapter-based hubot Robot

A few scripts from the hubot-scripts package call a couple of methods on Robot which the Hipchat adapter doesn't seem to provide.

When I try to use availability.coffee or working-on.coffee for example, I see these errors in the node debug output:

2013-01-25T15:09:52+00:00 app[web.1]: [Fri Jan 25 2013 15:09:52 GMT+0000 (UTC)] ERROR Unable to call the listener: TypeError: Object #<Robot> has no method 'users'
2013-01-25T15:09:52+00:00 app[web.1]: TypeError: Object #<Robot> has no method 'users'
2013-01-25T15:09:52+00:00 app[web.1]:     at TextListener.module.exports.robot.respond.name [as callback] (/app/node_modules/hubot-scripts/src/scripts/working-on.coffee:7:21)
2013-01-25T15:09:52+00:00 app[web.1]:     at TextListener.Listener.call (/app/node_modules/hubot/src/listener.coffee:19:14)
2013-01-25T15:09:52+00:00 app[web.1]:     at Robot.receive (/app/node_modules/hubot/src/robot.coffee:102:33)
2013-01-25T15:09:52+00:00 app[web.1]:     at HipChat.Adapter.receive (/app/node_modules/hubot/src/adapter.coffee:37:25)
2013-01-25T15:09:52+00:00 app[web.1]:     at Bot.HipChat.run.bot (/app/node_modules/hubot-hipchat/src/hipchat.coffee:170:21)
2013-01-25T15:09:52+00:00 app[web.1]:     at Bot.EventEmitter.emit (events.js:99:17)
2013-01-25T15:09:52+00:00 app[web.1]:     at Bot.module.exports.Bot.onStanza (/app/node_modules/hubot-hipchat/node_modules/wobot/lib/bot.js:122:12)
2013-01-25T15:09:52+00:00 app[web.1]:     at Client.EventEmitter.emit (events.js:96:17)
2013-01-25T15:09:52+00:00 app[web.1]:     at Client.onRawStanza (/app/node_modules/hubot-hipchat/node_modules/wobot/node_modules/node-xmpp/lib/xmpp/client.js:159:14)
2013-01-25T15:09:52+00:00 app[web.1]:     at Client.EventEmitter.emit (events.js:96:17)
2013-01-25T15:09:54+00:00 app[web.1]: [Fri Jan 25 2013 15:09:54 GMT+0000 (UTC)] DEBUG Not saving, because not loaded yet
2013-01-25T15:09:59+00:00 app[web.1]: [Fri Jan 25 2013 15:09:59 GMT+0000 (UTC)] DEBUG Not saving, because not loaded yet
2013-01-25T15:10:04+00:00 app[web.1]: [Fri Jan 25 2013 15:10:04 GMT+0000 (UTC)] DEBUG Not saving, because not loaded yet
2013-01-25T15:10:05+00:00 app[web.1]: [Fri Jan 25 2013 15:10:05 GMT+0000 (UTC)] ERROR Unable to call the listener: TypeError: Object #<Robot> has no method 'usersForFuzzyName'
2013-01-25T15:10:05+00:00 app[web.1]: TypeError: Object #<Robot> has no method 'usersForFuzzyName'
2013-01-25T15:10:05+00:00 app[web.1]:     at module.exports.findUser (/app/node_modules/hubot-scripts/src/scripts/availability.coffee:7:21)
2013-01-25T15:10:05+00:00 app[web.1]:     at TextListener.module.exports.robot.respond.name [as callback] (/app/node_modules/hubot-scripts/src/scripts/availability.coffee:35:14)
2013-01-25T15:10:05+00:00 app[web.1]:     at TextListener.Listener.call (/app/node_modules/hubot/src/listener.coffee:19:14)
2013-01-25T15:10:05+00:00 app[web.1]:     at Robot.receive (/app/node_modules/hubot/src/robot.coffee:102:33)
2013-01-25T15:10:05+00:00 app[web.1]:     at HipChat.Adapter.receive (/app/node_modules/hubot/src/adapter.coffee:37:25)
2013-01-25T15:10:05+00:00 app[web.1]:     at Bot.HipChat.run.bot (/app/node_modules/hubot-hipchat/src/hipchat.coffee:170:21)
2013-01-25T15:10:05+00:00 app[web.1]:     at Bot.EventEmitter.emit (events.js:99:17)
2013-01-25T15:10:05+00:00 app[web.1]:     at Bot.module.exports.Bot.onStanza (/app/node_modules/hubot-hipchat/node_modules/wobot/lib/bot.js:122:12)
2013-01-25T15:10:05+00:00 app[web.1]:     at Client.EventEmitter.emit (events.js:96:17)
2013-01-25T15:10:05+00:00 app[web.1]:     at Client.onRawStanza (/app/node_modules/hubot-hipchat/node_modules/wobot/node_modules/node-xmpp/lib/xmpp/client.js:159:14)

It looks like calls to robot.users() and robot.userForName() are affected.

$ grep robot.users node_modules/hubot-scripts/src/scripts/*                                                                                                                         master 
node_modules/hubot-scripts/src/scripts/46elks.coffee:    users = robot.usersForFuzzyName(name)
node_modules/hubot-scripts/src/scripts/46elks.coffee:    users = robot.usersForFuzzyName(name)
node_modules/hubot-scripts/src/scripts/ambush.coffee:    users = robot.usersForFuzzyName(msg.match[1].trim())
node_modules/hubot-scripts/src/scripts/availability.coffee:    users = robot.usersForFuzzyName name
node_modules/hubot-scripts/src/scripts/working-on.coffee:    users = robot.users()
$ grep robot.userForName node_modules/hubot-scripts/src/scripts/*                                                                                                                   master 
node_modules/hubot-scripts/src/scripts/46elks.coffee:    if user = robot.userForName(to)
node_modules/hubot-scripts/src/scripts/auth.coffee:      user = robot.userForName(name)
node_modules/hubot-scripts/src/scripts/auth.coffee:      user = robot.userForName(name)
node_modules/hubot-scripts/src/scripts/auth.coffee:      user = robot.userForName(name)
node_modules/hubot-scripts/src/scripts/auth.coffee:    user = robot.userForName(name)
node_modules/hubot-scripts/src/scripts/harvest.coffee:    user = robot.userForName(test_user)
node_modules/hubot-scripts/src/scripts/working-on.coffee:    user = robot.userForName name

Hubot connecting but silent

I know there was another (closed) issue about this, but my problem appears to be unrelated to the node-stringprep issues addressed there. The startup does not show me any error message or indication that node-stringprep is not installed. With debug mode on I see my connection and all incoming messages but I never get an outgoing one.

The shell adapter works perfectly, just not the hipchat one.

replies need update with hubot 2.4.5

Found another issue with the envelope vs user in the hipchat.coffee file.

  reply: (envelope, strings...) ->
    # added evelope. as a prefix to user
    for str in strings
      @send envelope, "@#{envelope.user.mention_name} #{str}"

error installing [email protected] Error: No compatible version found: hubot@'>=2.4.0'

Hubot works locally, but build fails when pushing to heroku with

-----> Installing dependencies with npm
       npm ERR! error installing [email protected] Error: No compatible version found: hubot@'>=2.4.0'
       npm ERR! error installing [email protected] Valid install targets:
       npm ERR! error installing [email protected] ["1.0.0","1.0.2","1.0.3","1.0.4","1.0.5","1.0.6","1.1.0","1.1.1","1.1.2","1.1.3","1.1.4","1.1.5","1.1.6","1.1.7","1.1.8","1.1.9","1.1.10","1.1.11","2.0.2","2.0.4","2.0.5","2.0.6","2.0.7","2.1.0","2.1.1","2.1.2","2.1.3","2.1.4","2.2.0","2.2.1","2.3.0","2.3.2","2.3.3","2.3.4","2.3.5"]
       npm ERR! error installing [email protected]     at installTargetsError (/tmp/node-npm-sOqX/lib/cache.js:424:10)
       npm ERR! error installing [email protected]     at /tmp/node-npm-sOqX/lib/cache.js:406:17
       npm ERR! error installing [email protected]     at saved (/tmp/node-npm-sOqX/lib/utils/npm-registry-client/get.js:136:7)
       npm ERR! error installing [email protected]     at Object.cb [as oncomplete] (/tmp/node-npm-sOqX/node_modules/graceful-fs/graceful-fs.js:36:9)
       npm ERR! Error: No compatible version found: hubot@'>=2.4.0'
       npm ERR! Valid install targets:
       npm ERR! ["1.0.0","1.0.2","1.0.3","1.0.4","1.0.5","1.0.6","1.1.0","1.1.1","1.1.2","1.1.3","1.1.4","1.1.5","1.1.6","1.1.7","1.1.8","1.1.9","1.1.10","1.1.11","2.0.2","2.0.4","2.0.5","2.0.6","2.0.7","2.1.0","2.1.1","2.1.2","2.1.3","2.1.4","2.2.0","2.2.1","2.3.0","2.3.2","2.3.3","2.3.4","2.3.5"]
       npm ERR!     at installTargetsError (/tmp/node-npm-sOqX/lib/cache.js:424:10)
       npm ERR!     at /tmp/node-npm-sOqX/lib/cache.js:406:17
       npm ERR!     at saved (/tmp/node-npm-sOqX/lib/utils/npm-registry-client/get.js:136:7)
       npm ERR!     at Object.cb [as oncomplete] (/tmp/node-npm-sOqX/node_modules/graceful-fs/graceful-fs.js:36:9)
       npm ERR! Report this *entire* log at:
       npm ERR!     <http://github.com/isaacs/npm/issues>
       npm ERR! or email it to:
       npm ERR!     <[email protected]>
       npm ERR! 
       npm ERR! System Linux 2.6.32-347-ec2
       npm ERR! command "/tmp/node-node-Sqgo/bin/node" "/tmp/node-npm-sOqX/cli.js" "install" "--production"
       npm ERR! cwd /tmp/build_219mthqsjrv38
       npm ERR! node -v v0.6.20
       npm ERR! npm -v 1.0.106

       > [email protected] preinstall /tmp/build_219mthqsjrv38/node_modules/hubot-hipchat/node_modules/node-expat
       > node-waf clean || true; node-waf configure build

       npm ERR! 
       npm ERR! Additional logging details can be found in:
       npm ERR!     /tmp/build_219mthqsjrv38/npm-debug.log
       npm not ok

I've followed the instructions in the readme, my dependencies look like:

  "dependencies": {
    "hubot-hipchat": ">= 1.1.4",
    "hubot": "2.3.2",
    "hubot-scripts": ">= 2.1.0",
    "optparse": "1.0.3"
  },

procfile:

web: bin/hubot --adapter hipchat

and hubot-scripts:
["tweet.coffee", "shipit.coffee"]
(removed redis-brain)

I feel like I've fixed this before (somewhat recently) so I'm wondering if it could be an error in the documentation.

bot receives messages but the reply has an XMPP error and does not get sent correctly

Using hubot 2.4.2 and hubot-hipchat 1.1.4 and testing locally on OSX 10.8.2 with HUBOT_HIPCHAT_DEBUG=true

It looks like an issue in that the "to" part of the message contains the room name instead of the fully addressable roomid.

 OUT > <message to="test" type="chat" from="[email protected]/wobot"><inactive xmlns="http://jabber/protocol/chatstates"/><body>foo</body></message>
  IN > <message to='[email protected]/wobot-23815' type='groupchat' from='[email protected]/James Bayer'><body>@HipchatHubot echo foo</body></message>
  IN > <message to='[email protected]/wobot' from='test' type='error'><inactive xmlns='http://jabber/protocol/chatstates'/><body>foo</body><error code='400' type='modify'><bad-request xmlns='urn:ietf:params:xml:ns:xmpp-stanzas'/></error></message>

compare that to a message i created myself like this

self.robot.messageRoom("[email protected]", "hello!");

that does post correctly:

<message to="[email protected]/Hipchat Hubot" type="groupchat"><body>hello!</body></message>

Authentication Failure and TypeError and StringPrep Bindings Errors

Hello,

I've just tried setting up Hubot on Heroku with HipChat however there seem to be some issues preventing this from working.

Three main issues:

  1. Authentication Failure (perhaps due to the next two)
    Note: I'm able to connect with iChat to HipChat using the same jabber_id & pass.
  2. TypeError: Cannot call method 'end' of undefined
  3. Cannot load StringPrep-0.1.0 bindings. You may need to `npm install node-stringprep'
    Note: For 3 I've tried 1.0.4 and the git-url#master.

Here are my logs and settings:
package.json

 // I tried "hubot-hipchat": ">= 1.0.4" as well, same problems
  "dependencies": {
    "hubot-hipchat": "git://github.com/hipchat/hubot-hipchat.git#master",
    "hubot": "2.1.4",
    "hubot-scripts": ">=2.0.4",
    "optparse": "1.0.3"
  }
}

Procfile

web: bin/hubot -a hipchat -n Hubot

Heroku Logs

2012-05-07T15:17:44+00:00 heroku[web.1]: State changed from up to bouncing
2012-05-07T15:17:44+00:00 heroku[web.1]: State changed from bouncing to created
2012-05-07T15:17:44+00:00 heroku[web.1]: State changed from created to starting
2012-05-07T15:17:46+00:00 heroku[web.1]: Starting process with command `bin/hubot -a hipchat -n Hubot`
2012-05-07T15:17:46+00:00 app[web.1]: bin/hubot: 3: npm: not found
2012-05-07T15:17:47+00:00 heroku[web.1]: Stopping all processes with SIGTERM
2012-05-07T15:17:47+00:00 app[web.1]: Cannot load StringPrep-0.1.0 bindings. You may need to `npm install node-stringprep'
2012-05-07T15:17:47+00:00 app[web.1]: Options: { jid: '[email protected]',
2012-05-07T15:17:47+00:00 app[web.1]:   password: 'mypass',
2012-05-07T15:17:47+00:00 app[web.1]:   debug: false,
2012-05-07T15:17:47+00:00 app[web.1]:   token: 'my-notify-token',
2012-05-07T15:17:47+00:00 app[web.1]:   name: 'My Hubot',
2012-05-07T15:17:47+00:00 app[web.1]:   rooms: '@All',
2012-05-07T15:17:47+00:00 app[web.1]:   host: null }
2012-05-07T15:17:47+00:00 app[web.1]: Bot: { _events: 
2012-05-07T15:17:47+00:00 app[web.1]: /@Hubot\b/i
2012-05-07T15:17:47+00:00 app[web.1]:    { connect: { [Function: g] listener: [Function] },
2012-05-07T15:17:47+00:00 app[web.1]:      error: [Function] },
2012-05-07T15:17:47+00:00 app[web.1]:   plugins: {},
2012-05-07T15:17:47+00:00 app[web.1]:   jabber: null,
2012-05-07T15:17:47+00:00 app[web.1]:   name: null,
2012-05-07T15:17:47+00:00 app[web.1]:      maxListeners: 0,
2012-05-07T15:17:47+00:00 app[web.1]:   iq_count: 1,
2012-05-07T15:17:47+00:00 app[web.1]:   keepalive: null,
2012-05-07T15:17:47+00:00 app[web.1]:   jid: '[email protected]',
2012-05-07T15:17:47+00:00 app[web.1]:   password: 'mypass,
2012-05-07T15:17:47+00:00 app[web.1]:   debug: false,
2012-05-07T15:17:47+00:00 app[web.1]:   caps_ver: 'wobot:0.6.0',
2012-05-07T15:17:47+00:00 app[web.1]:   host: null,
2012-05-07T15:17:47+00:00 app[web.1]:   mucHost: 'conf.hipchat.com' }
2012-05-07T15:17:47+00:00 app[web.1]: [Mon, 07 May 2012 15:17:47 GMT] INFO Loading scripts from /app/scripts
2012-05-07T15:17:47+00:00 app[web.1]: [Mon, 07 May 2012 15:17:47 GMT] INFO Loading scripts from /app/src/scripts
2012-05-07T15:17:47+00:00 app[web.1]: [Mon, 07 May 2012 15:17:47 GMT] INFO Loading hubot-scripts from /app/node_modules/hubot-scripts/src/scripts
2012-05-07T15:17:48+00:00 app[web.1]: 
2012-05-07T15:17:48+00:00 app[web.1]: Received error from HipChat: XMPP authentication failure
2012-05-07T15:17:48+00:00 app[web.1]: /app/node_modules/hubot-hipchat/node_modules/wobot/node_modules/node-xmpp/lib/xmpp/connection.js:277
2012-05-07T15:17:48+00:00 app[web.1]:     this.socket.end();
2012-05-07T15:17:48+00:00 app[web.1]:                 ^
2012-05-07T15:17:48+00:00 app[web.1]: TypeError: Cannot call method 'end' of undefined
2012-05-07T15:17:48+00:00 app[web.1]:     at Client.onEnd (/app/node_modules/hubot-hipchat/node_modules/wobot/node_modules/node-xmpp/lib/xmpp/connection.js:277:17)
2012-05-07T15:17:48+00:00 app[web.1]:     at Socket.<anonymous> (/app/node_modules/hubot-hipchat/node_modules/wobot/node_modules/node-xmpp/lib/xmpp/connection.js:56:14)
2012-05-07T15:17:48+00:00 app[web.1]:     at Socket.emit (events.js:81:20)
2012-05-07T15:17:48+00:00 app[web.1]:     at Socket._onReadable (net.js:656:51)
2012-05-07T15:17:48+00:00 app[web.1]:     at IOWatcher.onReadable [as callback] (net.js:177:10)
2012-05-07T15:17:49+00:00 heroku[web.1]: Process exited with status 1
2012-05-07T15:17:49+00:00 heroku[web.1]: Process exited with status 0
2012-05-07T15:17:49+00:00 heroku[web.1]: State changed from starting to crashed
2012-05-07T15:17:49+00:00 heroku[web.1]: State changed from crashed to created
2012-05-07T15:17:49+00:00 heroku[web.1]: State changed from created to starting
[~/Projects/hubot]
[me]:hubot(master)$ heroku ps
Process  State            Command
-------  ---------------  ----------------------------
web.1    crashed for 27s  bin/hubot -a hipchat -n Hubot

I've read that I need to add the HUBOT_AUTHENTICATION_TOKEN with the admin API token for this to work, is that correct?

heroku config:add HUBOT_HIPCHAT_TOKEN="admin-api-group-token"

http://labnotes.org/2011/10/25/hubot-does-hipchat/

Can't connect any longer

Without changing our setup, Hubot won't connect to HipChat any longer. Could this be related to this new feature?

Our debug log looks like this:

       [...]
  IN > <success xmlns='urn:ietf:params:xml:ns:xmpp-sasl'/>
 OUT > <bind xmlns="urn:ietf:params:xml:ns:xmpp-bind"/>

  IN > <stream:stream xmlns:stream='http://etherx.jabber.org/streams' xmlns='jabber:client' version='1.0' from='chat.hipchat.com' id='XXXXXXXXXXXXXXXX'>
         <stream:features><session xmlns='urn:ietf:params:xml:ns:xmpp-session'/>
           <bind xmlns='urn:ietf:params:xml:ns:xmpp-bind'>
             <required/>
           </bind>
         </stream:features>
         <failure xmlns='urn:ietf:params:xml:ns:xmpp-sasl'>
           <not-acceptable/>
         </failure>
       </stream:stream>

Move setup instructions into local README file

I think it'd make sense to move the instructions here into a local README.md file so that pull requests changing something about the instructions can update them appropriately.

Anyone object? I can move this over if not (and add a redirect from the old wiki page).

Can't post multi-line message with links

I am working on a plugin for hubot which posts information about changesets. The post includes a link to the changeset, and the original comments (which are often multi-line).

The first problem I have is that when I post a multi-line message, hipchat displays it in monospace and doesn't linkify the URL.

msg.send "r#{revision}: #{author} #{time} #{url}\n#{message}"

If I could send HTML, that would solve it, but when I do that it simply shows the HTML source instead of rendering as HTML (interestingly, using the Hipchat REST API it's possible to send HTML).

So I figured I would send multiple messages, one per line:

msg.send "r#{revision}: #{author} #{time} #{url}"
msg.send line for line in message.split("\n")

This fails because msg.send does not guarantee order, and so the messages show up in hipchat in a random order, different every time.

So I am at a loss. There are a few ways I could see solving this:

  • Allow sending HTML-formatted messages
  • Support a flag to indicate monospace or not (allow me to post without monospace interpretation)
  • Guarantee the delivery order of msg.send (I see they did this for at least Campfire: hubotio/hubot#128)

Updated hubot (new, clean install), now it crashes on start

Connected to HipChat as @hubot!
Joining [email protected]
Joining [email protected]
Joining 1148_#[email protected]

/home/archon810/hubot2/node_modules/hubot/src/adapter.coffee:45
      return this.robot.userForId(id, options);
                        ^
TypeError: Object #<Robot> has no method 'userForId'
    at HipChat.Adapter.userForId (/home/archon810/hubot2/node_modules/hubot/src/adapter.coffee:45:25)
    at HipChat.run.bot.onMessage.author (/home/archon810/hubot2/node_modules/hubot-hipchat/src/hipchat.coffee:126:34)
    at Bot.module.exports.Bot.Bot.getRoster (/home/archon810/hubot2/node_modules/hubot-hipchat/node_modules/wobot/lib/bot.js:300:7)
    at Bot.g (events.js:192:14)
    at Bot.EventEmitter.emit (events.js:99:17)
    at Bot.module.exports.Bot.onStanza (/home/archon810/hubot2/node_modules/hubot-hipchat/node_modules/wobot/lib/bot.js:141:14)
    at Client.EventEmitter.emit (events.js:96:17)
    at Client.onRawStanza (/home/archon810/hubot2/node_modules/hubot-hipchat/node_modules/wobot/node_modules/node-xmpp/lib/xmpp/client.js:159:14)
    at Client.EventEmitter.emit (events.js:96:17)
    at Client.Connection.onStanza (/home/archon810/hubot2/node_modules/hubot-hipchat/node_modules/wobot/node_modules/node-xmpp/lib/xmpp/connection.js:237:14)

Using hubot-hipchat 2.4.5-1 from today as well as the latest hubot 2.4.5.

Any ideas?

ERROR Cannot load adapter hipchat - Error: Cannot find module '../build/Release/node_expat.node'

Hey,

I was attempting to install hubot on heroku. Using the instructions in the readme.md and I keep getting the error below. Any suggestions on how to fix?

2012-10-09T20:46:34+00:00 heroku[app.1]: Starting process with command bin/hubot -a hipchat -n Hubot
2012-10-09T20:46:34+00:00 app[app.1]: bin/hubot: 3: npm: not found
2012-10-09T20:46:35+00:00 heroku[app.1]: State changed from starting to up
2012-10-09T20:46:35+00:00 app[app.1]: [Tue Oct 09 2012 20:46:35 GMT+0000 (UTC)] ERROR Cannot load adapter hipchat - Error: Cannot find module '../build/Release/node_expat.node'
2012-10-09T20:46:35+00:00 app[app.1]: Error: Cannot find module '../build/Release/node_expat.node'
2012-10-09T20:46:35+00:00 app[app.1]: at Function._resolveFilename (module.js:337:11)
2012-10-09T20:46:35+00:00 app[app.1]: at Function._load (module.js:279:25)
2012-10-09T20:46:35+00:00 app[app.1]: at Module.require (module.js:359:17)
2012-10-09T20:46:35+00:00 app[app.1]: at require (module.js:375:17)
2012-10-09T20:46:35+00:00 app[app.1]: at Object..js (module.js:464:10)
2012-10-09T20:46:35+00:00 app[app.1]: at Module.load (module.js:353:31)
2012-10-09T20:46:35+00:00 app[app.1]: at Object. (/app/node_modules/hubot-hipchat/node_modules/wobot/node_modules/node-xmpp/node_modules/node-expat/lib/node-expat.js:4:13)
2012-10-09T20:46:35+00:00 app[app.1]: at Object. (/app/node_modules/hubot/bin/hubot:105:19)
2012-10-09T20:46:35+00:00 app[app.1]: at Module._compile (module.js:446:26)
2012-10-09T20:46:35+00:00 app[app.1]: at Function._load (module.js:311:12)
2012-10-09T20:46:35+00:00 app[app.1]: at /app/node_modules/hubot/node_modules/coffee-script/lib/coffee-script/command.js:150:18
2012-10-09T20:46:35+00:00 app[app.1]: at Module.require (module.js:359:17)
2012-10-09T20:46:35+00:00 app[app.1]: TypeError: Cannot call method 'on' of null
2012-10-09T20:46:35+00:00 app[app.1]: at [object Object]. (fs.js:123:5)
2012-10-09T20:46:35+00:00 app[app.1]: at Object. (/app/node_modules/hubot/bin/hubot:109:4)
2012-10-09T20:46:35+00:00 app[app.1]: at [object Object].emit (events.js:64:17)
2012-10-09T20:46:35+00:00 app[app.1]: at Module._compile (module.js:446:26)
2012-10-09T20:46:35+00:00 app[app.1]: at /app/node_modules/hubot/node_modules/coffee-script/lib/coffee-script/command.js:175:29
2012-10-09T20:46:35+00:00 app[app.1]: at Object.run (/app/node_modules/hubot/node_modules/coffee-script/lib/coffee-script/coffee-script.js:79:25)
2012-10-09T20:46:35+00:00 app[app.1]: at Object.oncomplete (fs.js:1190:12)
2012-10-09T20:46:36+00:00 heroku[app.1]: Process exited with status 1
2012-10-09T20:46:36+00:00 heroku[app.1]: State changed from up to crashed
2012-10-09T20:46:36+00:00 heroku[app.1]: State changed from crashed to starting
2012-10-09T20:46:39+00:00 heroku[app.1]: Starting process with command bin/hubot -a hipchat -n Hubot

TypeError: Object #<HipChat> has no method 'emit'

I can't connect to hipchat neither with the latest hubot (67b2878) nor with v2.1.4.1.

dominis@golem:~/hubot$ ./bin/hubot -a hipchat -n Hubot

> [email protected] install /home/dominis/hubot/node_modules/node-stringprep
> sh ./install.sh

Checking for program g++ or c++          : /usr/bin/g++ 
Checking for program cpp                 : /usr/bin/cpp 
Checking for program ar                  : /usr/bin/ar 
Checking for program ranlib              : /usr/bin/ranlib 
Checking for g++                         : ok  
Checking for node path                   : ok /usr/local/lib/node 
Checking for node prefix                 : ok /usr/local 
'configure' finished successfully (0.084s)
Waf: Entering directory `/home/dominis/hubot/node_modules/node-stringprep/build'
Waf: Leaving directory `/home/dominis/hubot/node_modules/node-stringprep/build'
'build' finished successfully (0.009s)
[Tue, 17 Apr 2012 10:21:49 GMT] INFO Loading scripts from /home/dominis/hubot/scripts
[Tue, 17 Apr 2012 10:21:49 GMT] INFO Loading scripts from /home/dominis/hubot/src/scripts
Options: { jid: '[email protected]',
  password: 'xxx',
  token: null,
  name: 'Hubot a',
  rooms: '[email protected]',
  debug: 'true',
  host: 'hipchat.com' }
/@Hubot\b/i
Bot: { _events: 
   { connect: { [Function: g] listener: [Function] },
     error: [Function] },
  _maxListeners: 0,
  jabber: null,
  keepalive: null,
  name: null,
  plugins: {},
  iq_count: 1,
  jid: '[email protected]',
  password: 'xxx',
  debug: true,
  host: 'hipchat.com',
  caps_ver: 'wobot:0.6.0',
  mucHost: 'conf.hipchat.com' }
TypeError: Object #<HipChat> has no method 'emit'
    at HipChat.run (/home/dominis/hubot/node_modules/hubot-hipchat/src/hipchat.coffee:138:19)
    at Robot.run (/home/dominis/hubot/node_modules/hubot/src/robot.coffee:290:27)
    at Object.<anonymous> (/home/dominis/hubot/node_modules/hubot/bin/hubot:102:11)
    at Object.<anonymous> (/home/dominis/hubot/node_modules/hubot/bin/hubot:105:4)
    at Module._compile (module.js:444:26)
    at Object.run (/home/dominis/hubot/node_modules/hubot/node_modules/coffee-script/lib/coffee-script/coffee-script.js:68:25)
    at /home/dominis/hubot/node_modules/hubot/node_modules/coffee-script/lib/coffee-script/command.js:135:29
    at /home/dominis/hubot/node_modules/hubot/node_modules/coffee-script/lib/coffee-script/command.js:110:18
    at [object Object].<anonymous> (fs.js:115:5)
    at [object Object].emit (events.js:64:17)

Gracefully handle disconnections from the server

I can get hubot to connect to hipchat and everything works perfectly except it will randomly disconnect and return this error.

Received error from HipChat: Unknown error

/Users/admin/Desktop/hubot/node_modules/hubot-hipchat/node_modules/wobot/node_modules/node-xmpp/lib/xmpp/connection.js:274
this.socket.end();
^
TypeError: Cannot call method 'end' of undefined
at Client.onEnd (/Users/admin/Desktop/hubot/node_modules/hubot-hipchat/node_modules/wobot/node_modules/node-xmpp/lib/xmpp/connection.js:274:17)
at Socket. (/Users/admin/Desktop/hubot/node_modules/hubot-hipchat/node_modules/wobot/node_modules/node-xmpp/lib/xmpp/connection.js:56:14)
at Socket.emit (events.js:81:20)
at Socket._onReadable (net.js:656:51)
at IOWatcher.onReadable as callback

I'm using
"hubot-hipchat": "1.0.1",
"hubot": "2.0.5"

Hubot Listening but not responding

After following all of the install instructions (twice), I am still struggling to get hubot to respond.

This is an example of my logs:

2012-10-16T19:07:21+00:00 app[web.1]:   IN > <message to='[email protected]/wobot' type='groupchat' from='[email protected]/Joe Hand'><body>@Hubot help</body><x xmlns='http://hipchat.com'><sender>[email protected]</sender></x></message>
2012-10-16T19:07:43+00:00 app[web.1]:  OUT >  

I also tried it locally and it is similarly not responding.
EDIT: It is working locally. I was just forgetting to address it using its name (hubot).

I looked through the other similar issues but found no solutions. Any one know where to start looking to debug this?

messageRoom doesn't work

It should send a message to the room but comes with following stack trace:

2012-04-19T02:02:22+00:00 app[web.1]: Error: Argument error
2012-04-19T02:02:22+00:00 app[web.1]: at new JID (/app/node_modules/hubot-hipchat/node_modules/wobot/node_modules/node-xmpp/lib/xmpp/jid.js:30:15)
2012-04-19T02:02:22+00:00 app[web.1]: at Bot.message (/app/node_modules/hubot-hipchat/node_modules/wobot/lib/bot.js:344:21)
2012-04-19T02:02:22+00:00 app[web.1]: at Robot.send (/app/node_modules/hubot/src/robot.coffee:226:41)
2012-04-19T02:02:22+00:00 app[web.1]: at HipChat.send (/app/node_modules/hubot-hipchat/src/hipchat.coffee:29:32)
2012-04-19T02:02:22+00:00 app[web.1]: at nextMiddleware (/app/node_modules/hubot/node_modules/connect/lib/middleware/router.js:175:25)
2012-04-19T02:02:22+00:00 app[web.1]: at Object. (/app/scripts/cloudmailin.coffee:12:13)
2012-04-19T02:02:22+00:00 app[web.1]: at param (/app/node_modules/hubot/node_modules/connect/lib/middleware/router.js:183:16)
2012-04-19T02:02:22+00:00 app[web.1]: at pass (/app/node_modules/hubot/node_modules/connect/lib/middleware/router.js:191:10)
2012-04-19T02:02:22+00:00 app[web.1]: at param (/app/node_modules/hubot/node_modules/connect/lib/middleware/router.js:186:15)
2012-04-19T02:02:22+00:00 app[web.1]: at Object.router as handle

I've tried both room JID & JID@hostname but no luck with that.

Any help please?

Public: A helper send function to message a room that the robot is in

room - String designating the room to message

strings - One or more Strings for each message to send.

messageRoom: (room, strings...) ->
user = @userForId @id, { room: room }
@adapter.send user, strings...

Documentation omits requirement of redistogo

From https://github.com/github/hubot/wiki/Deploying-Hubot-onto-Heroku :

If you want to use the redis-brain.coffee you will need to add the Redis to Go addon (this requires a verified account).

% heroku addons:add redistogo:nano

Without redistogo, hubot crashes:

2012-03-09T17:54:24+00:00 app[app.1]: node.js:134
2012-03-09T17:54:24+00:00 app[app.1]: throw e; // process.nextTick error, or 'error' event on first tick
2012-03-09T17:54:24+00:00 app[app.1]: ^
2012-03-09T17:54:24+00:00 app[app.1]: TypeError: Object Error: Redis connection to localhost:6379 failed - ECONNREFUSED, Connection refused has no method 'replace'
2012-03-09T17:54:24+00:00 app[app.1]: at EventEmitter.log (/app/node_modules/hubot/node_modules/log/lib/log.js:149:25)
2012-03-09T17:54:24+00:00 app[app.1]: at EventEmitter.error (/app/node_modules/hubot/node_modules/log/lib/log.js:202:10)
2012-03-09T17:54:24+00:00 app[app.1]: at RedisClient. (/app/node_modules/hubot-scripts/src/scripts/redis-brain.coffee:14:27)
2012-03-09T17:54:24+00:00 app[app.1]: at RedisClient.emit (events.js:64:17)
2012-03-09T17:54:24+00:00 app[app.1]: at Socket. (/app/node_modules/hubot-scripts/node_modules/redis/index.js:123:14)
2012-03-09T17:54:24+00:00 app[app.1]: at Socket.emit (events.js:64:17)
2012-03-09T17:54:24+00:00 app[app.1]: at Array. (net.js:828:27)
2012-03-09T17:54:24+00:00 app[app.1]: at EventEmitter._tickCallback (node.js:126:26)
2012-03-09T17:54:25+00:00 heroku[app.1]: Process exited with status 1
2012-03-09T17:54:25+00:00 heroku[app.1]: State changed from up to crashed

Fetch bot name automatically

Wobot now fetches the name of the bot automatically (change) and it'd be great to take advantage of this to make configuration simpler. Unfortunately Hubot core seems very set on knowing the name ahead of time since it builds up the regexes to run on incoming messages (src) at the time scripts are loaded.

Deferring loading of scripts until we've connected would allow this to work but I believe that would require a change in Hubot core.

Error on startup with vanilla hubot-hipchat setup

Any advice?

heroku[slugc]: Slug compilation started
heroku[api]: Release v79 created by [email protected]
heroku[api]: Deploy 4b08a7b by [email protected]
heroku[web.1]: State changed from crashed to starting
heroku[slugc]: Slug compilation finished
heroku[web.1]: Starting process with command `bin/hubot -a hipchat -n EllieF`
app[web.1]: bin/hubot: 3: npm: not found
app[web.1]: Cannot load StringPrep-0.1.0 bindings. You may need to `npm install node-stringprep'
app[web.1]: Options: { jid: '[email protected]',
app[web.1]:   password: 'XXXXXX',
app[web.1]:   token: null,
app[web.1]:   name: 'Ellie F',
app[web.1]:   rooms: '@All',
app[web.1]:   debug: 'false',
app[web.1]:   host: null }
app[web.1]: /@EllieF\b/i
app[web.1]: Bot: { _events: 
app[web.1]:    { connect: { [Function: g] listener: [Function] },
app[web.1]:      error: [Function] },
app[web.1]:   _maxListeners: 0,
app[web.1]:   jabber: null,
app[web.1]:   keepalive: null,
app[web.1]:   name: null,
app[web.1]:   plugins: {},
app[web.1]:   iq_count: 1,
app[web.1]:   jid: '[email protected]',
app[web.1]:   password: 'XXXXXXX',
app[web.1]:   debug: false,
app[web.1]:   host: null,
app[web.1]:   caps_ver: 'wobot:0.6.0',
app[web.1]:   mucHost: 'conf.hipchat.com' }
heroku[web.1]: State changed from starting to up
app[web.1]: Connected to HipChat
app[web.1]: Joining [email protected]
app[web.1]: Joining 15412_no_(swiper)[email protected]
app[web.1]: Joining [email protected]
app[web.1]: Joining [email protected]
app[web.1]: Joining [email protected]
app[web.1]: Joining [email protected]
app[web.1]: Joining [email protected]
app[web.1]: Joining [email protected]
app[web.1]: Joining [email protected]
app[web.1]: 
app[web.1]: /app/node_modules/hubot-hipchat/src/hipchat.coffee:132
app[web.1]:         return self.receive(new Robot.TextMessage(author, "" + self.robot.name
app[web.1]:                             ^
app[web.1]: TypeError: undefined is not a function
app[web.1]:     at Bot.<anonymous> (/app/node_modules/hubot-hipchat/src/hipchat.coffee:132:29)
app[web.1]:     at Bot.emit (events.js:70:17)
app[web.1]:     at Bot.<anonymous> (/app/node_modules/hubot-hipchat/node_modules/wobot/lib/bot.js:116:12)
app[web.1]:     at Client.<anonymous> (native)
app[web.1]:     at Client.emit (events.js:67:17)
app[web.1]:     at Client.onRawStanza (/app/node_modules/hubot-hipchat/node_modules/wobot/node_modules/node-xmpp/lib/xmpp/client.js:159:14)
app[web.1]:     at Client.emit (events.js:67:17)
app[web.1]:     at Client.onStanza (/app/node_modules/hubot-hipchat/node_modules/wobot/node_modules/node-xmpp/lib/xmpp/connection.js:237:14)
app[web.1]:     at StreamParser.<anonymous> (/app/node_modules/hubot-hipchat/node_modules/wobot/node_modules/node-xmpp/lib/xmpp/connection.js:136:14)
app[web.1]:     at StreamParser.emit (events.js:67:17)
heroku[web.1]: Process exited with status 1

How do you send private message?

I'm trying to send a private message to the user that sent a command to my bot. I've looked over #16 but still cant get it to work. Here is my code:

module.exports = (robot) ->
  robot.respond /deploy (.+) (prod|staging|test) (.+)/i, (msg) ->
  #below works to send an @user message
  robot.send msg.message.user, 'test send'
  #does not work - robot.reply msg.message.user, 'test pm'
  #below does not work either, get ERROR Unable to call the listener: TypeError: Object #<Robot> has no method 'message'
  robot.message msg.message.user.jid, 'test pm'

what am I doing wrong? or is this feature not supported.

HuBot won't join a private room

We're running hubot on heroku created via the https://hubot-factory.herokuapp.com/ yesterday. We have the bot in a public room and everything is fine and cool but today we tried to invite the bot to a private room and nothing happened. We've restarted the bot a number of times and it doesn't appear to resolve the issue.

Currently the bot is online and listening in the public room, but marked offline and not listening in the private room. Also, in the one-on-one chat the bot is always marked offline, even though it will respond.

thanks!

Here is a related issue i found but the resolution doesn't work: hubotio/hubot#78

using hubot 2.4.1 and instructions, scripts don't get called

using 2.4.1, i had to modify the scripts path of bin/hubot so that they found the right location, but still they are not getting invoked when messages arrive (which i can see from turning debug on). so the hipchat_bot shows up in my rooms, but never responds to a script such as "shipit.coffee" even though it's loaded in my project root "hubot-scripts.json" file.

why does hubot-hipcat require me to put a dependency on 'hubot' in the package.json of the hubot project?

Hubot doesn't respond at all

Hi,

I am trying to get hubot-hipchat to work with hubot .. However it doesn't respond to @ mentions in chatrooms or in 1-1 chats at all .. here is the details:

package.json dependencies:

  "dependencies": {
    "hubot-hipchat": ">= 1.1.3",
    "hubot": ">= 2.3.2",
    "coffee-script": "1.3.3",
    "optparse": "1.0.3",
    "scoped-http-client": "0.9.7",
    "log": "1.3.0",
    "connect": "2.3.4",
    "connect_router": "1.8.6"
  }

I tried installing hubot 2.3.4 with hubot-hipchat 1.1.3 but it always complained about hubot npm package not there for some reason ..

It now connects to HipChat just fine and i can see that in the debug logs, but it doesn't respond to messages at all, just an empty OUT > is printed in the logs ..

Any hints ?

Crash when receiving text message

Hubot crashes every time any text is sent in a chat room or 1-on-1 in hipchat:

/opt/hubot/node_modules/hubot-hipchat/src/hipchat.coffee:126
        return self.receive(new Robot.TextMessage(author, hubot_msg));
                            ^
TypeError: undefined is not a function
    at Bot. (/opt/hubot/node_modules/hubot-hipchat/src/hipchat.coffee:126:29)
    at Bot.EventEmitter.emit (events.js:106:17)
    at Bot.module.exports.Bot.onStanza (/opt/hubot/node_modules/hubot-hipchat/node_modules/wobot/lib/bot.js:114:12)
    at Client.EventEmitter.emit (events.js:96:17)
    at Client.onRawStanza (/opt/hubot/node_modules/hubot-hipchat/node_modules/wobot/node_modules/node-xmpp/lib/xmpp/client.js:159:14)
    at Client.EventEmitter.emit (events.js:96:17)
    at Client.Connection.onStanza (/opt/hubot/node_modules/hubot-hipchat/node_modules/wobot/node_modules/node-xmpp/lib/xmpp/connection.js:237:14)
    at StreamParser.Connection.startParser (/opt/hubot/node_modules/hubot-hipchat/node_modules/wobot/node_modules/node-xmpp/lib/xmpp/connection.js:136:14)
    at StreamParser.EventEmitter.emit (events.js:96:17)
    at null. (/opt/hubot/node_modules/hubot-hipchat/node_modules/wobot/node_modules/node-xmpp/lib/xmpp/stream_parser.js:42:22)

I've tested it with Robot.TextMessage and just TextMessage and get the same TypeError undefined is not a function. Do you have any ideas on how to fix this?

getting user object fails when user changes their (display) name

This should probably be an issue with wobot xmpp bridge, but it is a problem nonetheless on hubot-hipchat adapter, so here you go.

When someone identifies their identity and roles (with roles.coffee or github.coffee) and they change their display name after, hubot fails to retrieve the originally registered user object, since apparently hipchat binding (with wobot) uses the user's name, not the XMPP JID, to retrieve the original object.

https://github.com/hipchat/hubot-hipchat/blob/master/src/hipchat.coffee#L67

I see that on the private messaging the adapter gets user based on JID so I wish that were the case with public message as well.

You can argue that changing the name is an unlikely event, and I wish that were the case, but because of the recent changes by Hipchat, a lot of the users in our company changed their display name (back) to their full name, rather than nickname + first/last, and a lot of scripts stopped working.

I ended up writing a script to update its redis data manually to update their name to the current one so the hipchat can figure out. It would be nice if hubot can retrieve the same user object even after the user changed their display name.

The version that's published to npm is not the official hipchat version

The version published to npm right now appears to be chrisabruce's version from https://github.com/chrisabruce/hubot-hipchat/

(Which doesn't work for me, FYI)

Unfortunately npmjs.org appears to be down so I can't actually get the details, I just noticed that the version from NPM currently includes the two small changes from chrisabruce's branch (which break my hubot's ability to respond to messages from users or in channels).

Typo in README

  • In the Procfile you define:
    app: bin/hubot --adapter hipchat
  • then the the deploy command should be:
    heroku ps:scale app=1

Custom @mention names are not respected

If a custom @mention name is set for the bot it still expects @FirstLast format, even if the @mention name is properly passed via --name to bin/hubot.

The best solution to this would be #7. Will have to investigate and see if that's fully possible yet.

Errors with Hubot version 2.3.4

This issue is the same as #19. I tried everything in that thread with no success.. Maybe is an issue that is happening again with newer versions of hubot...
Here are my dependencies:

"dependencies": {

  "coffee-script": "1.3.3",
  "hubot": "= 2.3.4",
  "hubot-scripts": ">=2.0.4",
  "hubot-hipchat": "1.0.9",
  "optparse": "1.0.3",
  "scoped-http-client": "0.9.7",
  "log": "1.3.0",
  "connect": "2.3.4",
  "connect_router": "1.8.6"
}

The bot is online in hipchat and I double check that the hipchat name is sync with the settings for the account:

bin/hubot -a hipchat -n Hubot
export HUBOT_HIPCHAT_NAME="Hubot Boston"

With the debug mode, I'm able to see the messages in the logs:

 IN > <message to='[email protected]' type='chat'
 from='[email protected]/mac'><body>help</body>
  <active xmlns='http://jabber.org/protocol/chatstates'/></message>

But the bot doesn't respond.

Any help in how to solve this issue?

Thanks in advanced !

Cannot load StringPrep-0.1.0 bindings

I've seen a couple different issues that mention this, but they all seem to have a resolution that's something I've already done. I am trying to set up hubot over hipchat with janky on heroku.

HEROKU_URL             => http://profitably-hubot.herokuapp.com
HUBOT_HIPCHAT_JID      => [email protected]
HUBOT_HIPCHAT_NAME     => Hubot McBotson
HUBOT_HIPCHAT_PASSWORD => [password]
HUBOT_JANKY_URL        => http://12111_129575:[password]@profitably-janky.herokuapp.com/_hubot
PATH                   => bin:node_modules/.bin:/usr/local/bin:/usr/bin:/bin
REDISTOGO_URL          =>  _url_

When I push to heroku and run the logs, it says "Cannot load StringPrep-0.1.0 bindings. You may need to `npm install node-stringprep'"

Is this related to the hipchat adapter? Any ideas? Thanks!

Can talk privately, but not in group rooms?

If I directly message Hubot in HipChat 1-1, Hubot works as advertised.

However, if I try to type @hubot help or something in a group chat room, hubot remains silent. Tailing heroku doesn't output any errors.

Anyone know why this is? Don't have much to go on...

hubot-hipchat wont install on ubuntu 12.04 64bit

I am able to install hubot just fine. When I add "hubot-hipchat": ">= 1.0.4", to my dependcies and try to re-run bin/hubot I get the following error:
https://gist.github.com/2648173

I also tried specifying version 1.0.3 but get same error. I have tried removing my hubot/node_modules dir and re-running but get same error.

Any idea what is going on?

Here is my system setup:

:/hubot# npm -v
1.1.21
:
/hubot# node -v
v0.6.17

:~/hubot# cat package.json
{
"name": "hosted-hubot",
"version": "2.1.4",
"author": "GitHub Inc.",
"keywords": "github hubot campfire bot",
"description": "A simple helpful Robot for your Company",
"licenses": [{
"type": "MIT",
"url": "http://github.com/github/hubot/raw/master/LICENSE"
}],

"repository" : {
"type" : "git",
"url" : "http://github.com/github/hubot.git"
},

"dependencies": {
"hubot-hipchat": ">= 1.0.4",
"hubot": "2.1.4",
"hubot-scripts": ">=2.0.4",
"optparse": "1.0.3"
}
}

running hubot locally with latest nodejs failed at npm install

OS: debian 6
hubot: 2.3.2
nodejs: 0.8.16
npm: 1.1.69

Downloaded the hubot from https://github.com/github/hubot/downloads. Added the dependencies hubot-hipchat to packages.json

"dependencies": {
  "hubot-hipchat": ">= 1.1.3",
  "hubot": ">= 2.3.2",
   ...
}

when i try to run the hubot locally without adapter I will encounter the error below. Any tip on where I've might have missed out? Installing [email protected] returns the same error

root@debian:~/hubot# ./bin/hubot 
npm http GET https://registry.npmjs.org/hubot-hipchat
npm http GET https://registry.npmjs.org/hubot/2.3.2
npm http GET https://registry.npmjs.org/hubot-scripts
npm http GET https://registry.npmjs.org/optparse/1.0.3
npm http 200 https://registry.npmjs.org/optparse/1.0.3
npm http GET https://registry.npmjs.org/optparse/-/optparse-1.0.3.tgz
npm http 200 https://registry.npmjs.org/hubot/2.3.2
npm http GET https://registry.npmjs.org/hubot/-/hubot-2.3.2.tgz
npm http 200 https://registry.npmjs.org/hubot-hipchat
npm http GET https://registry.npmjs.org/hubot-hipchat/-/hubot-hipchat-1.1.3.tgz
npm http 200 https://registry.npmjs.org/hubot-scripts
npm http GET https://registry.npmjs.org/hubot-scripts/-/hubot-scripts-2.2.2.tgz
npm http 200 https://registry.npmjs.org/optparse/-/optparse-1.0.3.tgz
npm http 200 https://registry.npmjs.org/hubot/-/hubot-2.3.2.tgz
npm http 200 https://registry.npmjs.org/hubot-hipchat/-/hubot-hipchat-1.1.3.tgz
npm http 200 https://registry.npmjs.org/hubot-scripts/-/hubot-scripts-2.2.2.tgz
npm http GET https://registry.npmjs.org/node-expat/1.6.1
npm http GET https://registry.npmjs.org/wobot/0.8.0
npm http GET https://registry.npmjs.org/coffee-script/1.3.3
npm http GET https://registry.npmjs.org/scoped-http-client/0.9.7
npm http GET https://registry.npmjs.org/log/1.3.0
npm http GET https://registry.npmjs.org/connect/2.3.4
npm http GET https://registry.npmjs.org/connect_router/1.8.6
npm http GET https://registry.npmjs.org/redis/0.7.2
npm http 200 https://registry.npmjs.org/log/1.3.0
npm http GET https://registry.npmjs.org/log/-/log-1.3.0.tgz
npm http 200 https://registry.npmjs.org/scoped-http-client/0.9.7
npm http GET https://registry.npmjs.org/scoped-http-client/-/scoped-http-client-0.9.7.tgz
npm http 200 https://registry.npmjs.org/coffee-script/1.3.3
npm http 200 https://registry.npmjs.org/wobot/0.8.0
npm http GET https://registry.npmjs.org/coffee-script/-/coffee-script-1.3.3.tgz
npm http GET https://registry.npmjs.org/wobot/-/wobot-0.8.0.tgz
npm http 200 https://registry.npmjs.org/connect/2.3.4
npm http 200 https://registry.npmjs.org/node-expat/1.6.1
npm http 200 https://registry.npmjs.org/connect_router/1.8.6
npm http GET https://registry.npmjs.org/connect/-/connect-2.3.4.tgz
npm http GET https://registry.npmjs.org/node-expat/-/node-expat-1.6.1.tgz
npm http GET https://registry.npmjs.org/connect_router/-/connect_router-1.8.6.tgz
npm http 200 https://registry.npmjs.org/log/-/log-1.3.0.tgz
npm http 200 https://registry.npmjs.org/scoped-http-client/-/scoped-http-client-0.9.7.tgz
npm http 200 https://registry.npmjs.org/coffee-script/-/coffee-script-1.3.3.tgz
npm http 200 https://registry.npmjs.org/wobot/-/wobot-0.8.0.tgz
npm http 200 https://registry.npmjs.org/redis/0.7.2
npm http GET https://registry.npmjs.org/redis/-/redis-0.7.2.tgz
npm http 200 https://registry.npmjs.org/node-expat/-/node-expat-1.6.1.tgz
npm http 200 https://registry.npmjs.org/connect_router/-/connect_router-1.8.6.tgz
npm http 200 https://registry.npmjs.org/connect/-/connect-2.3.4.tgz
npm WARN package.json [email protected] No README.md file found!
npm http 200 https://registry.npmjs.org/redis/-/redis-0.7.2.tgz
npm WARN package.json [email protected] No README.md file found!
npm WARN package.json [email protected] No README.md file found!
npm http GET https://registry.npmjs.org/hiredis
npm http GET https://registry.npmjs.org/qs/0.4.2
npm http GET https://registry.npmjs.org/mime/1.2.4
npm http GET https://registry.npmjs.org/formidable/1.0.11
npm http GET https://registry.npmjs.org/crc/0.2.0
npm http GET https://registry.npmjs.org/cookie/0.0.4
npm http GET https://registry.npmjs.org/fresh/0.0.1
npm http GET https://registry.npmjs.org/bytes/0.0.1
npm http GET https://registry.npmjs.org/range-parser/0.0.4
npm http GET https://registry.npmjs.org/debug
npm WARN engine [email protected]: wanted: {"node":">= 0.4.1 < 0.7.0"} (current: {"node":"v0.8.16","npm":"1.1.69"})
npm http GET https://registry.npmjs.org/node-xmpp
npm http GET https://registry.npmjs.org/underscore

> [email protected] install /root/hubot/node_modules/hubot-hipchat/node_modules/node-expat
> node-gyp rebuild

npm http 200 https://registry.npmjs.org/qs/0.4.2
npm http GET https://registry.npmjs.org/qs/-/qs-0.4.2.tgz
npm http 200 https://registry.npmjs.org/mime/1.2.4
npm http GET https://registry.npmjs.org/mime/-/mime-1.2.4.tgz
npm http 200 https://registry.npmjs.org/crc/0.2.0
npm http GET https://registry.npmjs.org/crc/-/crc-0.2.0.tgz
npm http 200 https://registry.npmjs.org/cookie/0.0.4
gyp http GET http://nodejs.org/dist/v0.8.16/node-v0.8.16.tar.gz
npm http GET https://registry.npmjs.org/cookie/-/cookie-0.0.4.tgz
npm http 200 https://registry.npmjs.org/fresh/0.0.1
npm http GET https://registry.npmjs.org/fresh/-/fresh-0.0.1.tgz
npm http 200 https://registry.npmjs.org/bytes/0.0.1
npm http 200 https://registry.npmjs.org/formidable/1.0.11
npm http 200 https://registry.npmjs.org/hiredis
npm http GET https://registry.npmjs.org/hiredis/-/hiredis-0.1.14.tgz
npm http GET https://registry.npmjs.org/bytes/-/bytes-0.0.1.tgz
npm http GET https://registry.npmjs.org/formidable/-/formidable-1.0.11.tgz
npm http 200 https://registry.npmjs.org/range-parser/0.0.4
npm http GET https://registry.npmjs.org/range-parser/-/range-parser-0.0.4.tgz
npm http 200 https://registry.npmjs.org/qs/-/qs-0.4.2.tgz
npm http 200 https://registry.npmjs.org/mime/-/mime-1.2.4.tgz
npm http 200 https://registry.npmjs.org/debug
npm http GET https://registry.npmjs.org/debug/-/debug-0.7.0.tgz
gyp http 200 http://nodejs.org/dist/v0.8.16/node-v0.8.16.tar.gz
npm http 200 https://registry.npmjs.org/node-xmpp
npm http GET https://registry.npmjs.org/node-xmpp/-/node-xmpp-0.3.2.tgz
npm http 200 https://registry.npmjs.org/cookie/-/cookie-0.0.4.tgz
npm http 200 https://registry.npmjs.org/crc/-/crc-0.2.0.tgz
npm http 200 https://registry.npmjs.org/underscore
npm http GET https://registry.npmjs.org/underscore/-/underscore-1.4.3.tgz
npm http 200 https://registry.npmjs.org/hiredis/-/hiredis-0.1.14.tgz
npm http 200 https://registry.npmjs.org/fresh/-/fresh-0.0.1.tgz
npm http 200 https://registry.npmjs.org/bytes/-/bytes-0.0.1.tgz
npm http 200 https://registry.npmjs.org/node-xmpp/-/node-xmpp-0.3.2.tgz
npm http 200 https://registry.npmjs.org/debug/-/debug-0.7.0.tgz
npm http 200 https://registry.npmjs.org/range-parser/-/range-parser-0.0.4.tgz
npm http 200 https://registry.npmjs.org/formidable/-/formidable-1.0.11.tgz
npm http 200 https://registry.npmjs.org/underscore/-/underscore-1.4.3.tgz
npm WARN package.json [email protected] No README.md file found!

> [email protected] preinstall /root/hubot/node_modules/hubot-scripts/node_modules/redis/node_modules/hiredis
> make || gmake

cd deps/hiredis && make static
make[1]: Entering directory `/root/hubot/node_modules/hubot-scripts/node_modules/redis/node_modules/hiredis/deps/hiredis'
cc -std=c99 -pedantic -c -O3 -fPIC  -Wall -W -Wstrict-prototypes -Wwrite-strings -g -ggdb net.c
cc -std=c99 -pedantic -c -O3 -fPIC  -Wall -W -Wstrict-prototypes -Wwrite-strings -g -ggdb hiredis.c
npm http GET https://registry.npmjs.org/ltx
npm http 200 https://registry.npmjs.org/ltx
npm http GET https://registry.npmjs.org/ltx/-/ltx-0.2.2.tgz
npm http 200 https://registry.npmjs.org/ltx/-/ltx-0.2.2.tgz
cc -std=c99 -pedantic -c -O3 -fPIC  -Wall -W -Wstrict-prototypes -Wwrite-strings -g -ggdb sds.c
npm http GET https://registry.npmjs.org/sax
cc -std=c99 -pedantic -c -O3 -fPIC  -Wall -W -Wstrict-prototypes -Wwrite-strings -g -ggdb async.c
npm http 200 https://registry.npmjs.org/sax
npm http GET https://registry.npmjs.org/sax/-/sax-0.4.2.tgz
ar rcs libhiredis.a net.o hiredis.o sds.o async.o
make[1]: Leaving directory `/root/hubot/node_modules/hubot-scripts/node_modules/redis/node_modules/hiredis/deps/hiredis'
node-waf configure build
npm http 200 https://registry.npmjs.org/sax/-/sax-0.4.2.tgz
Setting srcdir to                        : /root/hubot/node_modules/hubot-scripts/node_modules/redis/node_modules/hiredis 
Setting blddir to                        : /root/hubot/node_modules/hubot-scripts/node_modules/redis/node_modules/hiredis/build 
Checking for program g++ or c++          : /usr/bin/g++ 
Checking for program cpp                 : /usr/bin/cpp 
Checking for program ar                  : /usr/bin/ar 
Checking for program ranlib              : /usr/bin/ranlib 
Checking for g++                         : ok  
Checking for node path                   : not found 
Checking for node prefix                 : ok /usr/local 
'configure' finished successfully (0.316s)
Waf: Entering directory `/root/hubot/node_modules/hubot-scripts/node_modules/redis/node_modules/hiredis/build'
[1/3] cxx: hiredis.cc -> build/Release/hiredis_1.o
[2/3] cxx: reader.cc -> build/Release/reader_1.o
[3/3] cxx_link: build/Release/hiredis_1.o build/Release/reader_1.o -> build/Release/hiredis.node
Waf: Leaving directory `/root/hubot/node_modules/hubot-scripts/node_modules/redis/node_modules/hiredis/build'
'build' finished successfully (7.013s)
make: Entering directory `/root/hubot/node_modules/hubot-hipchat/node_modules/node-expat/build'
  CXX(target) Release/obj.target/node_expat/node-expat.o
../node-expat.cc:6:19: warning: expat.h: No such file or directory
../node-expat.cc:71: error: ISO C++ forbids declaration of ‘XML_Char’ with no type
../node-expat.cc:71: error: expected ‘,’ or ‘...’ before ‘*’ token
../node-expat.cc:191: error: ‘XML_Char’ has not been declared
../node-expat.cc:261: error: ‘XML_Char’ has not been declared
../node-expat.cc:265: error: ISO C++ forbids declaration of ‘XML_LChar’ with no type
../node-expat.cc:265: error: expected ‘;’ before ‘*’ token
../node-expat.cc:272: error: expected ‘;’ before ‘static’
../node-expat.cc:313: error: ‘XML_Parser’ does not name a type
../node-expat.cc:322: error: ISO C++ forbids declaration of ‘XML_Char’ with no type
../node-expat.cc:322: error: expected ‘,’ or ‘...’ before ‘*’ token
../node-expat.cc:339: error: ISO C++ forbids declaration of ‘XML_Char’ with no type
../node-expat.cc:339: error: expected ‘,’ or ‘...’ before ‘*’ token
../node-expat.cc:367: error: ISO C++ forbids declaration of ‘XML_Char’ with no type
../node-expat.cc:367: error: expected ‘,’ or ‘...’ before ‘*’ token
../node-expat.cc:378: error: ISO C++ forbids declaration of ‘XML_Char’ with no type
../node-expat.cc:378: error: expected ‘,’ or ‘...’ before ‘*’ token
../node-expat.cc:390: error: ISO C++ forbids declaration of ‘XML_Char’ with no type
../node-expat.cc:390: error: expected ‘,’ or ‘...’ before ‘*’ token
../node-expat.cc:400: error: ISO C++ forbids declaration of ‘XML_Char’ with no type
../node-expat.cc:400: error: expected ‘,’ or ‘...’ before ‘*’ token
../node-expat.cc:413: error: ISO C++ forbids declaration of ‘XML_Char’ with no type
../node-expat.cc:413: error: expected ‘,’ or ‘...’ before ‘*’ token
../node-expat.cc: In static member function ‘static v8::Handle<v8::Value> Parser::New(const v8::Arguments&)’:
../node-expat.cc:57: error: ‘XML_Char’ was not declared in this scope
../node-expat.cc:57: error: expected primary-expression before ‘=’ token
../node-expat.cc:60: error: expected unqualified-id before ‘=’ token
../node-expat.cc:61: error: expected primary-expression before ‘,’ token
../node-expat.cc:64: error: expected primary-expression before ‘)’ token
../node-expat.cc:65: error: expected primary-expression before ‘)’ token
../node-expat.cc:66: error: expected primary-expression before ‘;’ token
../node-expat.cc: In constructor ‘Parser::Parser(int)’:
../node-expat.cc:74: error: ‘parser’ was not declared in this scope
../node-expat.cc:74: error: expected primary-expression before ‘)’ token
../node-expat.cc:74: error: ‘XML_ParserCreate’ was not declared in this scope
../node-expat.cc: In destructor ‘virtual Parser::~Parser()’:
../node-expat.cc:82: error: ‘parser’ was not declared in this scope
../node-expat.cc:82: error: ‘XML_ParserFree’ was not declared in this scope
../node-expat.cc: In member function ‘void Parser::attachHandlers()’:
../node-expat.cc:87: error: ‘parser’ was not declared in this scope
../node-expat.cc:87: error: ‘XML_SetUserData’ was not declared in this scope
../node-expat.cc:88: error: ‘XML_SetElementHandler’ was not declared in this scope
../node-expat.cc:89: error: ‘XML_SetCharacterDataHandler’ was not declared in this scope
../node-expat.cc:90: error: ‘XML_SetCdataSectionHandler’ was not declared in this scope
../node-expat.cc:91: error: ‘XML_SetProcessingInstructionHandler’ was not declared in this scope
../node-expat.cc:92: error: ‘XML_SetCommentHandler’ was not declared in this scope
../node-expat.cc:93: error: ‘XML_SetXmlDeclHandler’ was not declared in this scope
../node-expat.cc:94: error: ‘XML_SetEntityDeclHandler’ was not declared in this scope
../node-expat.cc: In member function ‘bool Parser::parseString(v8::String&, int)’:
../node-expat.cc:149: error: ‘parser’ was not declared in this scope
../node-expat.cc:149: error: ‘XML_GetBuffer’ was not declared in this scope
../node-expat.cc:153: error: ‘XML_ParseBuffer’ was not declared in this scope
../node-expat.cc:153: error: ‘XML_STATUS_ERROR’ was not declared in this scope
../node-expat.cc: In member function ‘bool Parser::parseBuffer(v8::Local<v8::Object>, int)’:
../node-expat.cc:165: error: ‘parser’ was not declared in this scope
../node-expat.cc:165: error: ‘XML_Parse’ was not declared in this scope
../node-expat.cc:165: error: ‘XML_STATUS_ERROR’ was not declared in this scope
../node-expat.cc: In static member function ‘static v8::Handle<v8::Value> Parser::SetEncoding(const v8::Arguments&)’:
../node-expat.cc:178: error: ‘XML_Char’ was not declared in this scope
../node-expat.cc:178: error: expected primary-expression before ‘=’ token
../node-expat.cc:178: error: expected type-specifier before ‘XML_Char’
../node-expat.cc:178: error: expected ‘;’ before ‘XML_Char’
../node-expat.cc:179: error: expected primary-expression before ‘,’ token
../node-expat.cc:181: error: expected primary-expression before ‘)’ token
../node-expat.cc:183: error: expected primary-expression before ‘;’ token
../node-expat.cc: In member function ‘int Parser::setEncoding(int*)’:
../node-expat.cc:193: error: ‘parser’ was not declared in this scope
../node-expat.cc:193: error: ‘XML_SetEncoding’ was not declared in this scope
../node-expat.cc: In static member function ‘static v8::Handle<v8::Value> Parser::GetError(const v8::Arguments&)’:
../node-expat.cc:203: error: expected initializer before ‘*’ token
../node-expat.cc:204: error: ‘error’ was not declared in this scope
../node-expat.cc:201: warning: unused variable ‘parser’
../node-expat.cc: In member function ‘int Parser::stop()’:
../node-expat.cc:224: error: ‘parser’ was not declared in this scope
../node-expat.cc:224: error: ‘XML_TRUE’ was not declared in this scope
../node-expat.cc:224: error: ‘XML_StopParser’ was not declared in this scope
../node-expat.cc: In member function ‘int Parser::resume()’:
../node-expat.cc:241: error: ‘parser’ was not declared in this scope
../node-expat.cc:241: error: ‘XML_ResumeParser’ was not declared in this scope
../node-expat.cc: In static member function ‘static v8::Handle<v8::Value> Parser::Reset(const v8::Arguments&)’:
../node-expat.cc:248: error: ‘XML_Char’ was not declared in this scope
../node-expat.cc:248: error: expected primary-expression before ‘=’ token
../node-expat.cc:251: error: expected unqualified-id before ‘=’ token
../node-expat.cc:252: error: expected primary-expression before ‘,’ token
../node-expat.cc:255: error: expected primary-expression before ‘)’ token
../node-expat.cc: In member function ‘int Parser::reset(int*)’:
../node-expat.cc:263: error: ‘parser’ was not declared in this scope
../node-expat.cc:263: error: ‘XML_ParserReset’ was not declared in this scope
../node-expat.cc: In member function ‘uint32_t Parser::getCurrentLineNumber()’:
../node-expat.cc:282: error: ‘parser’ was not declared in this scope
../node-expat.cc:282: error: ‘XML_GetCurrentLineNumber’ was not declared in this scope
../node-expat.cc: In member function ‘uint32_t Parser::getCurrentColumnNumber()’:
../node-expat.cc:295: error: ‘parser’ was not declared in this scope
../node-expat.cc:295: error: ‘XML_GetCurrentColumnNumber’ was not declared in this scope
../node-expat.cc: In member function ‘int32_t Parser::getCurrentByteIndex()’:
../node-expat.cc:308: error: ‘parser’ was not declared in this scope
../node-expat.cc:308: error: ‘XML_GetCurrentByteIndex’ was not declared in this scope
../node-expat.cc: In static member function ‘static void Parser::StartElement(void*, int)’:
../node-expat.cc:328: error: expected initializer before ‘*’ token
../node-expat.cc:328: error: ‘atts1’ was not declared in this scope
../node-expat.cc:333: error: ‘name’ was not declared in this scope
../node-expat.cc: In static member function ‘static void Parser::EndElement(void*, int)’:
../node-expat.cc:344: error: ‘name’ was not declared in this scope
../node-expat.cc: In static member function ‘static void Parser::Text(void*, int)’:
../node-expat.cc:373: error: ‘s’ was not declared in this scope
../node-expat.cc:373: error: ‘len’ was not declared in this scope
../node-expat.cc: In static member function ‘static void Parser::ProcessingInstruction(void*, int)’:
../node-expat.cc:384: error: ‘target’ was not declared in this scope
../node-expat.cc:385: error: ‘data’ was not declared in this scope
../node-expat.cc: In static member function ‘static void Parser::Comment(void*, int)’:
../node-expat.cc:395: error: ‘data’ was not declared in this scope
../node-expat.cc: In static member function ‘static void Parser::XmlDecl(void*, int)’:
../node-expat.cc:407: error: ‘version’ was not declared in this scope
../node-expat.cc:408: error: expected primary-expression before ‘?’ token
../node-expat.cc:408: error: expected primary-expression before ‘)’ token
../node-expat.cc:409: error: ‘standalone’ was not declared in this scope
../node-expat.cc: In static member function ‘static void Parser::EntityDecl(void*, int)’:
../node-expat.cc:421: error: ‘entityName’ was not declared in this scope
../node-expat.cc:422: error: ‘is_parameter_entity’ was not declared in this scope
../node-expat.cc:423: error: ‘value’ was not declared in this scope
../node-expat.cc:423: error: ‘value_length’ was not declared in this scope
../node-expat.cc:424: error: ‘base’ was not declared in this scope
  1 ["ping.coffee", "tweet.coffee", "shipit.coffee"]
../node-expat.cc:425: error: ‘systemId’ was not declared in this scope
../node-expat.cc:426: error: ‘publicId’ was not declared in this scope
../node-expat.cc:427: error: ‘notationName’ was not declared in this scope
make: *** [Release/obj.target/node_expat/node-expat.o] Error 1
make: Leaving directory `/root/hubot/node_modules/hubot-hipchat/node_modules/node-expat/build'
gyp ERR! build error 
gyp ERR! stack Error: `make` failed with exit code: 2
gyp ERR! stack     at ChildProcess.onExit (/usr/local/lib/node_modules/npm/node_modules/node-gyp/lib/build.js:232:23)
gyp ERR! stack     at ChildProcess.EventEmitter.emit (events.js:99:17)
gyp ERR! stack     at Process._handle.onexit (child_process.js:678:10)
gyp ERR! System Linux 2.6.32-5-amd64
gyp ERR! command "node" "/usr/local/lib/node_modules/npm/node_modules/node-gyp/bin/node-gyp.js" "rebuild"
gyp ERR! cwd /root/hubot/node_modules/hubot-hipchat/node_modules/node-expat
gyp ERR! node -v v0.8.16
gyp ERR! node-gyp -v v0.7.3
gyp ERR! not ok 
npm ERR! [email protected] install: `node-gyp rebuild`
npm ERR! `sh "-c" "node-gyp rebuild"` failed with 1
npm ERR! 
npm ERR! Failed at the [email protected] install script.
npm ERR! This is most likely a problem with the node-expat package,
npm ERR! not with npm itself.
npm ERR! Tell the author that this fails on your system:
npm ERR!     node-gyp rebuild
npm ERR! You can get their info via:
npm ERR!     npm owner ls node-expat
npm ERR! There is likely additional logging output above.

npm ERR! System Linux 2.6.32-5-amd64
npm ERR! command "/usr/local/bin/node" "/usr/local/bin/npm" "install"
npm ERR! cwd /root/hubot
npm ERR! node -v v0.8.16
npm ERR! npm -v 1.1.69
npm ERR! code ELIFECYCLE
npm ERR! 
npm ERR! Additional logging details can be found in:
npm ERR!     /root/hubot/npm-debug.log
npm ERR! not ok code 0
path.exists is now called `fs.exists`.

Private messaging issue with user.reply_to

I'm trying to implement some functionality that causes Hubot to send a private message to user Y in response to receiving a command from user X. It seems that HipChat#send sends the message to a user's reply_to address, but this is often not what I want, because that value is usually set to my company's group chat. In this case I specifically want to initiate a private message. Is there a way to do this that I'm overlooking? Or is it necessary to add another method that sends to something like user.jid instead? I can make a pull request, just wanted your thoughts on how you'd like to approach this.

ERROR Unable to load

I have managed to get hubot to enter the channel, however it disconnects every 20 or so minutes. I have checked the procfile and the process is set to web. Looking at the logs i noticed lots of errors:

heroku logs --tail
2012-08-30T12:53:46+00:00 app[web.1]: at Object. (/app/scripts/drupalorg.coffee:102:4)
2012-08-30T12:53:46+00:00 app[web.1]: at Module._compile (module.js:446:26)
2012-08-30T12:53:46+00:00 app[web.1]: at Object..coffee (/app/node_modules/hubot/node_modules/coffee-script/lib/coffee-script/coffee-script.js:22:21)
2012-08-30T12:53:46+00:00 app[web.1]: at Module.load (module.js:353:31)
2012-08-30T12:53:46+00:00 app[web.1]: at Function._load (module.js:311:12)
2012-08-30T12:53:46+00:00 app[web.1]: [Thu Aug 30 2012 12:53:46 GMT+0000 (UTC)] ERROR Unable to load /app/scripts/oauth: Error: Cannot find module 'scribe-node'
2012-08-30T12:53:46+00:00 app[web.1]: Error: Cannot find module 'scribe-node'
2012-08-30T12:53:46+00:00 app[web.1]: at Function._resolveFilename (module.js:337:11)
2012-08-30T12:53:46+00:00 app[web.1]: at Function._load (module.js:279:25)
2012-08-30T12:53:46+00:00 app[web.1]: at Module.require (module.js:359:17)
2012-08-30T12:53:46+00:00 app[web.1]: at require (module.js:375:17)
2012-08-30T12:53:46+00:00 app[web.1]: at Object. (/app/scripts/oauth.coffee:4:12)
2012-08-30T12:53:46+00:00 app[web.1]: at Object. (/app/scripts/oauth.coffee:117:4)
2012-08-30T12:53:46+00:00 app[web.1]: at Module._compile (module.js:446:26)
2012-08-30T12:53:46+00:00 app[web.1]: at Module.load (module.js:353:31)
2012-08-30T12:53:46+00:00 app[web.1]: at Object..coffee (/app/node_modules/hubot/node_modules/coffee-script/lib/coffee-script/coffee-script.js:22:21)
2012-08-30T12:53:46+00:00 app[web.1]: at Function._load (module.js:311:12)
2012-08-30T12:53:46+00:00 app[web.1]: [Thu Aug 30 2012 12:53:46 GMT+0000 (UTC)] ERROR Unable to load /app/scripts/github-pulls: Error: Cannot find module 'githubot'
2012-08-30T12:53:46+00:00 app[web.1]: Error: Cannot find module 'githubot'
2012-08-30T12:53:46+00:00 app[web.1]: at Function._resolveFilename (module.js:337:11)
2012-08-30T12:53:46+00:00 app[web.1]: at Function._load (module.js:279:25)
2012-08-30T12:53:46+00:00 app[web.1]: at Module.require (module.js:359:17)
2012-08-30T12:53:46+00:00 app[web.1]: at require (module.js:375:17)
2012-08-30T12:53:46+00:00 app[web.1]: at /app/scripts/github-pulls.coffee:5:14
2012-08-30T12:53:46+00:00 app[web.1]: at Robot.loadFile (/app/node_modules/hubot/src/robot.coffee:146:23)
2012-08-30T12:53:46+00:00 app[web.1]: at /app/node_modules/hubot/src/robot.coffee:133:33
2012-08-30T12:53:46+00:00 app[web.1]: at Object.oncomplete (path.js:415:19)
2012-08-30T12:53:46+00:00 app[web.1]: Error: Cannot find module 'underscore'
2012-08-30T12:53:46+00:00 app[web.1]: [Thu Aug 30 2012 12:53:46 GMT+0000 (UTC)] ERROR Unable to load /app/scripts/aws: Error: Cannot find module 'underscore'
2012-08-30T12:53:46+00:00 app[web.1]: at Function._resolveFilename (module.js:337:11)
2012-08-30T12:53:46+00:00 app[web.1]: at Function._load (module.js:279:25)
2012-08-30T12:53:46+00:00 app[web.1]: at Module.require (module.js:359:17)
2012-08-30T12:53:46+00:00 app[web.1]: at require (module.js:375:17)
2012-08-30T12:53:46+00:00 app[web.1]: at Object. (/app/scripts/aws.coffee:8:7)
2012-08-30T12:53:46+00:00 app[web.1]: at Object. (/app/scripts/aws.coffee:203:4)
2012-08-30T12:53:46+00:00 app[web.1]: at Module._compile (module.js:446:26)
2012-08-30T12:53:46+00:00 app[web.1]: at Object..coffee (/app/node_modules/hubot/node_modules/coffee-script/lib/coffee-script/coffee-script.js:22:21)
2012-08-30T12:53:46+00:00 app[web.1]: at Module.load (module.js:353:31)
2012-08-30T12:53:46+00:00 app[web.1]: at Function._load (module.js:311:12)

Any suggestions? Thank you

Does 1-1 chat with Hubot have any special requirements?

I've followed the quickstart and got Hubot for HipChat running on Heroku in almost no time, great work :)

There is only one glitch currently (everything else seems to work as advertised): The quickstart mentions in step 13 that Hubot will also respond in 1-1 chat, which is not the case. Has this feature any undocumented requirements? Assuming it doesn't, any hint on how to approach this?

Updating from Pre v2 to v2.04 - Hubot joins but doesn't hear

When upgrading I changed the following files:

package.json

  "dependencies": {
    "hubot": "2.0.4",
    "hubot-hipchat-adapter": "1.0.0",
    "hubot-scripts": "2.0.3",
    "optparse": "1.0.3"
  }
}

Procfile

app: bin/hubot -a hipchat-adapter -n Hubot

Hubot logs in, joins all the rooms, then is mute. No commands elicit a response.

Remove tags from `hubot help`

When doing hubot help I see stuff like this: hubot youtube me &lt;query&gt; - Searches YouTube for the query and returns the video embed link.

I assume the double escaping bug comes from HipChat, but as a workaround it might be good to do msg.replace(/<([^ ]+?)>/g, '[$1]') or something similar which would end up in youtube me [query] - ... A bit more readable.

Errors with latest Hubot version

Hi -

I'm receiving a strange error about node-stringprep. Google show this issue isn't new, though it appears to have been fixed in Issue #1 (#1). This is a new hubot I built it this evening using two sets of directions.

The first:

https://github.com/github/hubot/blob/master/src/templates/README.md

The second:

https://github.com/hipchat/hubot-hipchat

Here's the corresponding section of my logs:

 $ heroku logs
 ...
 2012-03-25T22:42:44+00:00 heroku[web.1]: State changed from created to starting
 2012-03-25T22:42:45+00:00 heroku[slugc]: Slug compilation finished
 2012-03-25T22:42:51+00:00 heroku[web.1]: Starting process with command `bin/hubot -a hipchat -n Charlie`
 2012-03-25T22:42:51+00:00 app[web.1]: bin/hubot: 3: npm: not found
 2012-03-25T22:42:51+00:00 app[web.1]: Cannot load StringPrep-0.1.0 bindings. You may need to `npm install node-stringprep'
 ...

Here's the relevant portion of my package.json:

"hubot-hipchat": ">= 1.0.3",
"hubot": "2.1.4",
"hubot-scripts": ">=2.0.4",
"optparse": "1.0.3"

Here's my heroku config (config masked to protect the innocent):

$ heroku config
HUBOT_HIPCHAT_JID      => [email protected]
HUBOT_HIPCHAT_NAME     => Exact Name
HUBOT_HIPCHAT_PASSWORD => password
PATH                   => bin:node_modules/.bin:/usr/local/bin:/usr/bin:/bin
REDISTOGO_URL          => redis://redistogo:[email protected]:9659/

I'd appreciate any thoughts or advice.

send to room does not work

Some scripts(e.g. hubot-scripts/gerrit) use Robot.messageRoom(or Robot.send room:).
But this does not work on hipchat.

The room information has gone in the HitChat.send.
The method may be needed to accept room option.

Please fix this problem.

(What do you think about following code?)

class HipChat extends Adapter
  send: (user, strings...) ->
    for str in strings
      @bot.message user.reply_to or user.room, str

hubot-hipchat with hubot 2.3.0

Not sure if the hipchat connector is ready for hubot 2.3.0. If not, what version of hubot is best for hubot-hipchat 1.0.7?

{
  "name":        "hosted-hubot",
  "version":     "2.3.0",
  "author":      "GitHub Inc.",
  "keywords":    "github hubot campfire bot",
  "description": "A simple helpful Robot for your Company",
  "licenses":     [{
    "type":       "MIT",
    "url":        "http://github.com/github/hubot/raw/master/LICENSE"
  }],

  "repository" : {
    "type": "git",
    "url":  "https://github.com/github/hubot.git"
  },

  "dependencies": {
    "hubot-hipchat": ">= 1.0.7",
    "hubot": "2.0.1",
    "hubot-scripts": ">= 2.1.0",
    "optparse": "1.0.3"
  },

  "engines": {
    "node": "0.6.x",
    "npm": "1.0.x"
  }
}

Heroku error:

2012-07-16T21:53:07+00:00 heroku[app.1]: State changed from starting to up
2012-07-16T21:53:07+00:00 app[app.1]: [Mon Jul 16 2012 21:53:07 GMT+0000 (UTC)] ERROR Cannot load adapter hipchat - TypeError: Object #<Object> has no method 'robot'
2012-07-16T21:53:07+00:00 app[app.1]: TypeError: Object #<Object> has no method 'robot'
2012-07-16T21:53:07+00:00 app[app.1]:     at Object.<anonymous> (/app/node_modules/hubot-hipchat/src/hipchat.coffee:7:28)
2012-07-16T21:53:07+00:00 app[app.1]:     at Object.<anonymous> (/app/node_modules/hubot-hipchat/src/hipchat.coffee:239:4)
2012-07-16T21:53:07+00:00 app[app.1]:     at Module._compile (module.js:446:26)
2012-07-16T21:53:07+00:00 app[app.1]:     at Module.load (module.js:353:31)
2012-07-16T21:53:07+00:00 app[app.1]:     at Object..coffee (/app/node_modules/hubot/node_modules/coffee-script/lib/coffee-script/coffee-script.js:22:21)
2012-07-16T21:53:07+00:00 app[app.1]:     at Function._load (module.js:311:12)
2012-07-16T21:53:07+00:00 app[app.1]:     at require (module.js:375:17)
2012-07-16T21:53:07+00:00 app[app.1]:     at Robot.loadAdapter (/app/node_modules/hubot/src/robot.coffee:218:31)
2012-07-16T21:53:07+00:00 app[app.1]:     at Module.require (module.js:359:17)
2012-07-16T21:53:07+00:00 app[app.1]: TypeError: Cannot call method 'on' of null
2012-07-16T21:53:07+00:00 app[app.1]:     at Object.<anonymous> (/app/node_modules/hubot/bin/hubot:105:19)
2012-07-16T21:53:07+00:00 app[app.1]:     at new Robot (/app/node_modules/hubot/src/robot.coffee:49:14)
2012-07-16T21:53:07+00:00 app[app.1]:     at Module._compile (module.js:446:26)
2012-07-16T21:53:07+00:00 app[app.1]:     at Object.<anonymous> (/app/node_modules/hubot/bin/hubot:109:4)
2012-07-16T21:53:07+00:00 app[app.1]:     at /app/node_modules/hubot/node_modules/coffee-script/lib/coffee-script/command.js:177:29
2012-07-16T21:53:07+00:00 app[app.1]:     at Object.run (/app/node_modules/hubot/node_modules/coffee-script/lib/coffee-script/coffee-script.js:79:25)
2012-07-16T21:53:07+00:00 app[app.1]:     at /app/node_modules/hubot/node_modules/coffee-script/lib/coffee-script/command.js:152:18
2012-07-16T21:53:07+00:00 app[app.1]:     at [object Object].<anonymous> (fs.js:123:5)
2012-07-16T21:53:07+00:00 app[app.1]:     at Object.oncomplete (fs.js:1190:12)
2012-07-16T21:53:07+00:00 app[app.1]:     at [object Object].emit (events.js:64:17)
2012-07-16T21:53:09+00:00 heroku[app.1]: Process exited with status 1
2012-07-16T21:53:09+00:00 heroku[app.1]: State changed from up to crashed

Thanks!

No longer connects to hipchat?

Everything had been working fine for several months up until a few days ago when suddenly my bot refused to show in hipchat -- the bot doesn't show in hipchat and I am unsure if it is even able to connect anymore.

Was there a change recently made of some sort? Everything seems to compile fine on my end, but my heroku and local instances can no longer connect. Can anyone recommend a local way to test to see if the connection is even being made?

Thanks.

Running and issuing commands

Just to preface I am using:

HuBot from master - v2.4.6
Node v0.8.17
NPM 1.2.0
Last version of hubot-hipchat
Debian Squeeze (not a heroku deployment)

Steps I took:

  • Downloaded and extracted HuBot from master tarball
  • Added hubot-scripts and hubot-hipchat to my dependencies
  • Ran npm install
  • Set my environment variables
  • ran /opt/hubot/bin/hubot -a hipchat

my package.json looks like this:

{
  "name":        "hubot",
  "version":     "2.4.6",
  "author":      "hubot",
  "keywords":    ["github","hubot","campfire","bot"],
  "description": "A simple helpful Robot for your Company",
  "licenses":     [{
    "type":       "MIT",
    "url":        "http://github.com/github/hubot/raw/master/LICENSE"
  }],

  "repository" : {
    "type": "git",
    "url":  "https://github.com/github/hubot.git"
  },

  "dependencies": {
    "coffee-script": "~> 1.4.0",
    "optparse": "1.0.3",
    "scoped-http-client": "0.9.7",
    "log": "1.3.0",
    "connect": "2.3.4",
    "connect_router": "1.8.6",
    "hubot-scripts": "2.4.1",
    "hubot-hipchat": ">= 2.4.5"
  },

  "engines": {
    "node": ">= 0.8.x",
    "npm": "1.2.x"
  },

  "main": "./index",

  "bin": {
    "hubot": "./bin/hubot"
  }
}

When I run /opt/hubot/bin/hubot -a hipchat get the following traceback:

[Thu Jan 24 2013 12:08:49 GMT-0600 (CST)] ERROR Cannot load adapter hipchat - Error: Cannot find module 'hubot'
TypeError: Cannot call method 'on' of null
    at Object.<anonymous> (/opt/hubot/bin/hubot:136:19)
    at Object.<anonymous> (/opt/hubot/bin/hubot:140:4)
    at Module._compile (module.js:449:26)
    at Object.exports.run (/usr/local/lib/node_modules/coffee-script/lib/coffee-script/coffee-script.js:83:25)
    at compileScript (/usr/local/lib/node_modules/coffee-script/lib/coffee-script/command.js:177:29)
    at fs.stat.notSources.(anonymous function) (/usr/local/lib/node_modules/coffee-script/lib/coffee-script/command.js:152:18)
    at fs.readFile (fs.js:176:14)
    at Object.oncomplete (fs.js:297:15)

A quick google search tells me to replace the includes in hipchat.coffee to a path but this seems hacky. Here is what the top of the file /opt/hubot/node_modules/hubot-hipchat/src/hipchat.cofee looks like:

Robot   = require '../../../src/robot'
Adapter = require '../../../src/adapter'
TextMessage = require '../../../src/message'
# Robot   = require('hubot').Robot
# Adapter = require('hubot').Adapter
# TextMessage = require('hubot').TextMessage

Magic. It works now only until I try to issue a help command to HuBot. Now I get the following error:

/opt/hubot/node_modules/hubot-hipchat/src/hipchat.coffee:170
        return self.receive(new TextMessage(author, hubot_msg));
                            ^
TypeError: object is not a function
    at Bot.HipChat.run.bot (/opt/hubot/node_modules/hubot-hipchat/src/hipchat.coffee:170:29)
    at Bot.EventEmitter.emit (events.js:99:17)
    at Bot.module.exports.Bot.onStanza (/opt/hubot/node_modules/hubot-hipchat/node_modules/wobot/lib/bot.js:122:12)
    at Client.EventEmitter.emit (events.js:96:17)
    at Client.onRawStanza (/opt/hubot/node_modules/hubot-hipchat/node_modules/wobot/node_modules/node-xmpp/lib/xmpp/client.js:159:14)
    at Client.EventEmitter.emit (events.js:96:17)
    at Client.Connection.onStanza (/opt/hubot/node_modules/hubot-hipchat/node_modules/wobot/node_modules/node-xmpp/lib/xmpp/connection.js:237:14)
    at StreamParser.Connection.startParser (/opt/hubot/node_modules/hubot-hipchat/node_modules/wobot/node_modules/node-xmpp/lib/xmpp/connection.js:136:14)
    at StreamParser.EventEmitter.emit (events.js:96:17)
    at null.<anonymous> (/opt/hubot/node_modules/hubot-hipchat/node_modules/wobot/node_modules/node-xmpp/lib/xmpp/stream_parser.js:42:22)

I feel like my setup is wrong. Hacking the path in the coffee script feels wrong. What am I missing?

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.