Skip to content

Instantly share code, notes, and snippets.

@whereandy
Created April 18, 2013 22:13
class window.GroupmePushClient
constructor: (@apiToken) ->
@baseUri = GroupmePushClient.baseUri || ""
@subscriptions = {}
publish: (channel, data) ->
@debug("publishing to #{channel}...")
@client().publish(channel, data)
subscribe: (channel, options) ->
@debug("subscribing to #{channel}...")
subscription = @client().subscribe(channel, options.message)
subscription.callback =>
@debug("subscription success: #{channel}")
options.success(channel) if options.success
subscribeInit = => @publish channel, type: "subscribe"
setTimeout subscribeInit, 500
subscription.errback (error) =>
@debug("subscription error: #{error}")
delete @subscriptions[channel]
options.error(error) if options.error
@subscriptions[channel] = subscription
unsubscribe: (channel) ->
@debug("unsubscribing from #{channel}")
@subscriptions[channel].cancel()
delete @subscriptions[channel]
bindTyping: (element, channel, userId) ->
element.bind 'keydown', (event) =>
return unless event.keyCode >= 65 && event.keyCode <= 91
target = event.target
if !target.typingSince || Date.now() - target.typingSince > 5000
@publish channel, type: 'typing', user_id: String(userId), started: Date.now()
event.target.typingSince = Date.now()
removeTyping: (element) ->
element.unbind 'keydown'
delete element.typingSince
# private
client: ->
this._client ||= @initClient()
debug: (message) ->
if @logLevel == "debug" || GroupmePushClient.logLevel == "debug"
console?.log(message)
initClient: ->
client = new Faye.Client("#{@baseUri}/faye", timeout: 30, retry: 5)
client.addExtension(this)
setInterval( ->
client.connect()
, 30000)
client
outgoing: (message, callback) ->
unless message.channel.match /\/meta\/(?!subscribe)/
message.ext = access_token: @apiToken
@debug("sending message: #{JSON.stringify message}")
callback(message)
incoming: (message, callback) ->
@debug("received message: #{JSON.stringify message}")
callback(message)
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment