fb29e35ffc
callback checks for dupes and sets messages to unique. this way minimizes the model.set() (which clobbers other chatters if you are the duplicate bugger)
148 lines
5.0 KiB
CoffeeScript
148 lines
5.0 KiB
CoffeeScript
_ = require('underscore')
|
|
helpers = require './helpers'
|
|
|
|
module.exports.app = (appExports, model, app) ->
|
|
character = require './character'
|
|
browser = require './browser'
|
|
helpers = require './helpers'
|
|
|
|
_currentTime = model.at '_currentTime'
|
|
|
|
_currentTime.setNull +new Date()
|
|
|
|
# Every 60 seconds, reset the current time so that the chat
|
|
# can update relative times
|
|
setInterval ->
|
|
_currentTime.set +new Date()
|
|
, 60000
|
|
|
|
user = model.at('_user')
|
|
|
|
model.on 'set', '_user.party.invitation', (after, before) ->
|
|
if !before? and after? # they just got invited
|
|
partyQ = model.query('parties').withId(after)
|
|
partyQ.fetch (err, party) ->
|
|
return next(err) if err
|
|
model.ref '_party', party
|
|
browser.resetDom(model)
|
|
|
|
appExports.partyCreate = ->
|
|
newParty = model.get("_newParty")
|
|
id = model.add 'parties', { name: newParty, leader: user.get('id'), members: [user.get('id')], invites:[] }
|
|
user.set 'party', {current: id, invitation: null, leader: true}, ->
|
|
window.location.reload true
|
|
|
|
appExports.partyInvite = ->
|
|
id = model.get('_newPartyMember').replace(/[\s"]/g, '')
|
|
return if _.isEmpty(id)
|
|
|
|
model.query('users').party([id]).fetch (err, users) ->
|
|
throw err if err
|
|
u = users.at(0).get()
|
|
if !u?
|
|
model.set "_partyError", "User with id #{id} not found."
|
|
return
|
|
else if u.party.current? or u.party.invitation?
|
|
model.set "_partyError", "User already in a party or pending invitation."
|
|
return
|
|
else
|
|
$.bootstrapGrowl "Invitation Sent."
|
|
model.set "users.#{id}.party.invitation", model.get('_party.id'), -> window.location.reload()
|
|
#model.set '_newPartyMember', ''
|
|
#partySubscribe model
|
|
|
|
appExports.partyAccept = ->
|
|
partyId = user.get('party.invitation')
|
|
user.set 'party.invitation', null
|
|
user.set 'party.current', partyId
|
|
model.at("parties.#{partyId}.members").push user.get('id'), -> window.location.reload()
|
|
# model.query('parties').withId(partyId).fetch (err, p) ->
|
|
# members = p.get('members')
|
|
# members.push user.get('id')
|
|
# p.set 'members', members, ->
|
|
# window.location.reload true
|
|
|
|
# partySubscribe model, ->
|
|
# p = model.at('_party')
|
|
# p.push 'members', user.get('id')
|
|
|
|
appExports.partyReject = ->
|
|
user.set 'party.invitation', null
|
|
browser.resetDom(model)
|
|
|
|
appExports.partyLeave = ->
|
|
id = user.set 'party.current', null
|
|
party = model.at '_party'
|
|
members = party.get('members')
|
|
index = members.indexOf(user.get('id'))
|
|
party.remove 'members', index, 1, ->
|
|
if members.length is 1 # # last member out, kill the party
|
|
model.del "parties.#{id}", (-> window.location.reload true)
|
|
else
|
|
window.location.reload true
|
|
|
|
###
|
|
Chat Functionality
|
|
###
|
|
|
|
sendChat = (path, input) ->
|
|
chat = model.at path
|
|
text = model.get input
|
|
# Check for non-whitespace characters
|
|
return unless /\S/.test text
|
|
model.set(input, '')
|
|
|
|
message =
|
|
id: model.id()
|
|
uuid: user.get('id')
|
|
contributor: user.get('backer.contributor')
|
|
npc: user.get('backer.npc')
|
|
text: text
|
|
user: helpers.username(model.get('_user.auth'), model.get('_user.profile.name'))
|
|
timestamp: +new Date
|
|
|
|
# FIXME - sometimes racer will send many duplicates via chat.unshift. I think because it can't make connection, keeps
|
|
# trying, but all attempts go through. Unfortunately we can't do chat.set without potentially clobbering other chatters,
|
|
# and we can't make chat an object without using refLists. hack solution for now is to unshift, and if there are dupes
|
|
# after we set to unique
|
|
chat.unshift message, ->
|
|
messages = chat.get() || []
|
|
count = messages.length
|
|
messages =_.uniq messages, true, ((m) -> m?.id) # get rid of dupes
|
|
#There were a bunch of duplicates, let's clean it up
|
|
if messages.length != count
|
|
messages.splice(200)
|
|
chat.set messages
|
|
else
|
|
chat.remove(200)
|
|
|
|
model.on 'unshift', '_party.chat', -> $('.chat-message').tooltip()
|
|
model.on 'unshift', '_tavern.chat.messages', -> $('.chat-message').tooltip()
|
|
|
|
appExports.partySendChat = ->
|
|
sendChat('_party.chat', '_chatMessage')
|
|
model.set '_user.party.lastMessageSeen', model.get('_party.chat')[0].id
|
|
|
|
appExports.tavernSendChat = ->
|
|
sendChat('_tavern.chat.messages', '_tavernMessage')
|
|
|
|
appExports.partyMessageKeyup = (e, el, next) ->
|
|
return next() unless e.keyCode is 13
|
|
appExports.partySendChat()
|
|
|
|
appExports.tavernMessageKeyup = (e, el, next) ->
|
|
return next() unless e.keyCode is 13
|
|
appExports.tavernSendChat()
|
|
|
|
appExports.deleteChatMessage = (e) -> e.at().remove() #requires the {#with}
|
|
|
|
app.on 'render', (ctx) ->
|
|
$('#party-tab-link').on 'shown', (e) ->
|
|
messages = model.get('_party.chat')
|
|
return false unless messages?.length > 0
|
|
model.set '_user.party.lastMessageSeen', messages[0].id
|
|
|
|
appExports.gotoPartyChat = ->
|
|
model.set '_gamePane', true, ->
|
|
$('#party-tab-link').tab('show')
|