class Lita::Handlers::Pubsub

Public Instance Methods

all_subscriptions(response) click to toggle source
# File lib/lita/handlers/pubsub.rb, line 102
def all_subscriptions(response)
  events = redis.smembers('pubsub.events').sort
  subscriptions = events.map do |event|
    "#{event} -> #{redis.smembers("pubsub.events.#{event}").sort}"
  end
  response.reply("All subscriptions:\n#{subscriptions.join("\n")}")
end
http_get(request, response) click to toggle source
# File lib/lita/handlers/pubsub.rb, line 77
def http_get(request, response)
  validate_http_password!(request.params['password'])
  response.write('ok')
  Thread.new do
    robot.trigger(
      :publish,
      event: request.params['event'],
      data: request.params['data']
    )
  end
end
http_post(request, response) click to toggle source
# File lib/lita/handlers/pubsub.rb, line 89
def http_post(request, response)
  data = JSON.parse(request.body.read)
  validate_http_password!(request.params['password'] || data['password'])
  response.write('ok')
  Thread.new do
    robot.trigger(
      :publish,
      event: data['event'],
      data: data['data']
    )
  end
end
publish(response) click to toggle source
# File lib/lita/handlers/pubsub.rb, line 165
def publish(response)
  event, data = response.matches[0]
  robot.trigger(:publish, event: event, data: data)
end
subscribe(response) click to toggle source
# File lib/lita/handlers/pubsub.rb, line 123
def subscribe(response)
  event = response.matches[0][0]
  room = response.room
  return response.reply('This command only works in a room') unless room
  redis.sadd("pubsub.events", event)
  redis.sadd("pubsub.rooms.#{room.id}", event)
  redis.sadd("pubsub.events.#{event}", room.id)
  response.reply("Subscribed #{room.name} to #{event} events")
end
subscribers(response) click to toggle source
# File lib/lita/handlers/pubsub.rb, line 117
def subscribers(response)
  event = response.matches[0][1]
  subscribers = find_subscriptions(event)
  response.reply("Subscribers of #{event}: #{subscribers}")
end
subscriptions(response) click to toggle source
# File lib/lita/handlers/pubsub.rb, line 110
def subscriptions(response)
  room = response.room
  return response.reply('This command only works in a room') unless room
  subscriptions = redis.smembers("pubsub.rooms.#{room.id}").sort
  response.reply("Subscriptions for #{room.name}: #{subscriptions}")
end
unsubscribe(response) click to toggle source
# File lib/lita/handlers/pubsub.rb, line 133
def unsubscribe(response)
  event = response.matches[0][0]
  room = response.room
  return response.reply('This command only works in a room') unless room
  subscriptions = redis.smembers("pubsub.rooms.#{room.id}").sort
  if subscriptions.include?(event)
    redis.srem("pubsub.rooms.#{room.id}", event)
    redis.srem("pubsub.events.#{event}", room.id)
    subscribers = redis.smembers("pubsub.events.#{event}")
    redis.srem("pubsub.events", event) if subscribers.empty?
    response.reply("Unsubscribed #{room.name} from #{event} events")
  else
    response.reply(
      "There is no #{event} subscription in #{room.name}.\n" \
      "Current subscriptions: #{subscriptions}"
    )
  end
end
unsubscribe_all(response) click to toggle source
# File lib/lita/handlers/pubsub.rb, line 152
def unsubscribe_all(response)
  room = response.room
  return response.reply('This command only works in a room') unless room
  subscriptions = redis.smembers("pubsub.rooms.#{room.id}").sort
  subscriptions.each do |event|
    redis.srem("pubsub.rooms.#{room.id}", event)
    redis.srem("pubsub.events.#{event}", room.id)
    subscribers = redis.smembers("pubsub.events.#{event}")
    redis.srem("pubsub.events", event) if subscribers.empty?
    response.reply("Unsubscribed #{room.name} from #{event} events")
  end
end

Private Instance Methods

find_subscriptions(event) click to toggle source
# File lib/lita/handlers/pubsub.rb, line 176
def find_subscriptions(event)
  return [] if event.nil? || event.empty?
  subscriptions = redis.smembers('pubsub.events').sort
  if event.include?('.')
    ev_parts = event.split('.')
    matched = []
    while ev_parts.any?
      sub_ev = ev_parts.join('.')
      if subscriptions.include?(sub_ev)
        matched += redis.smembers("pubsub.events.#{sub_ev}").sort
      end
      ev_parts.pop
    end
    matched.sort.uniq
  else
    redis.smembers("pubsub.events.#{event}").sort
  end
end
format_message(event, data) click to toggle source
# File lib/lita/handlers/pubsub.rb, line 172
def format_message(event, data)
  "*#{event}*: #{data}"
end
validate_http_password!(password) click to toggle source
# File lib/lita/handlers/pubsub.rb, line 195
def validate_http_password!(password)
  return if config.http_password.nil? || config.http_password.empty?
  raise 'incorrect password!' if password != config.http_password
end