class Daneel::Adapters::Campfire

Public Class Methods

new(robot) click to toggle source
Calls superclass method
# File lib/daneel/adapters/campfire.rb, line 9
def initialize(robot)
  super
  domain = ENV['CAMPFIRE_SUBDOMAIN']
  token  = ENV['CAMPFIRE_API_TOKEN']
  @fire  = Sparks.new(domain, token, :logger => logger)

  ENV['CAMPFIRE_ROOM_IDS'].split(",").map(&:to_i).map do |id|
    # Get info about the room state
    room = Room.new(id, self, @fire.room(id))
    robot.data.rooms[id] = room
    # Save the user info for all the users in the room
    room.data["users"].each do |data|
      user = User.new(data["id"], data["name"], data)
      robot.data.users[user.id] = user
    end
  end
end

Public Instance Methods

announce(*texts) click to toggle source
# File lib/daneel/adapters/campfire.rb, line 43
def announce(*texts)
  robot.data.rooms.each do |id, room|
    say id, *texts
  end
end
leave() click to toggle source
# File lib/daneel/adapters/campfire.rb, line 49
def leave
  # stop the listening threads
  @threads.each{|t| t.kill }
  # leave each room
  robot.data.rooms.each{|r| @fire.room(r.id).leave }
end
me() click to toggle source
# File lib/daneel/adapters/campfire.rb, line 56
def me
  @me ||= begin
    data = @fire.me
    me = User.new(data["id"], data["name"], data)
    robot.data.users[me.id] = me
  end
end
run() click to toggle source
# File lib/daneel/adapters/campfire.rb, line 27
def run
  @threads ||= []
  robot.data.rooms.each do |id, room|
    t = Thread.new { watch_room(room) } until t
    t.abort_on_exception = true
    @threads << t
  end
  @threads.each{|t| t.join }
end
say(id, *texts) click to toggle source
# File lib/daneel/adapters/campfire.rb, line 37
def say(id, *texts)
  texts.each do |text|
    text =~ /\n/ ? @fire.paste(id, text) : @fire.speak(id, text)
  end
end

Private Instance Methods

find_user(id) click to toggle source
# File lib/daneel/adapters/campfire.rb, line 66
def find_user(id)
  robot.data.users[id] ||= begin
    data = @fire.user(id)
    User.new(data["id"], data["name"], data)
  end
end
watch_room(room) click to toggle source
# File lib/daneel/adapters/campfire.rb, line 73
def watch_room(room)
  @fire.watch(room.id) do |data|
    next if data["type"] == "TimestampMessage"

    # TODO pass through self-messages, once they are filtered by
    # the accept? method on scripts
    next if data["user_id"] == me.id

    text = data["body"]
    time = Time.parse(data["created_at"]) rescue Time.now
    type = data["type"].gsub(/Message$/, '').downcase
    mesg = Message.new(text, time, type)
    room = robot.data.rooms[data["room_id"]]
    user = find_user(data["user_id"])
    robot.receive room, mesg, user
  end
end