Class: Lita::Handlers::Pubsub

Inherits:
Handler
  • Object
show all
Defined in:
lib/lita/handlers/pubsub.rb

Instance Method Summary collapse

Instance Method Details

#all_subscriptions(response) ⇒ Object



102
103
104
105
106
107
108
# 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) ⇒ Object



77
78
79
80
81
82
83
84
85
86
87
# 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) ⇒ Object



89
90
91
92
93
94
95
96
97
98
99
100
# 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) ⇒ Object



165
166
167
168
# 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) ⇒ Object



123
124
125
126
127
128
129
130
131
# 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) ⇒ Object



117
118
119
120
121
# 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) ⇒ Object



110
111
112
113
114
115
# 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) ⇒ Object



133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
# 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) ⇒ Object



152
153
154
155
156
157
158
159
160
161
162
163
# 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