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