habitica/src/app/party.coffee

148 lines
5 KiB
CoffeeScript
Raw Normal View History

_ = require('underscore')
helpers = require './helpers'
2013-05-02 19:16:09 +00:00
module.exports.app = (appExports, model, app) ->
character = require './character'
browser = require './browser'
helpers = require './helpers'
2013-05-05 17:47:50 +00:00
_currentTime = model.at '_currentTime'
_currentTime.setNull +new Date()
# Every 60 seconds, reset the current time so that the chat
# can update relative times
setInterval ->
2013-05-05 17:47:50 +00:00
_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}, ->
2013-02-19 22:33:34 +00:00
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) ->
2013-02-05 21:11:28 +00:00
throw err if err
u = users.at(0).get()
2013-02-27 21:21:06 +00:00
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()
2013-02-27 21:21:06 +00:00
#model.set '_newPartyMember', ''
#partySubscribe model
appExports.partyAccept = ->
partyId = user.get('party.invitation')
2013-02-08 00:13:14 +00:00
user.set 'party.invitation', null
user.set 'party.current', partyId
model.at("parties.#{partyId}.members").push user.get('id'), -> window.location.reload()
2013-02-27 21:21:06 +00:00
# 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
2013-02-19 22:33:34 +00:00
window.location.reload true
2013-05-02 19:16:09 +00:00
###
Chat Functionality
###
2013-05-02 20:09:50 +00:00
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)
2013-05-02 19:16:09 +00:00
model.on 'unshift', '_party.chat', -> $('.chat-message').tooltip()
model.on 'unshift', '_tavern.chat.messages', -> $('.chat-message').tooltip()
2013-05-02 20:09:50 +00:00
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()
2013-05-10 10:53:20 +00:00
appExports.deleteChatMessage = (e) -> e.at().remove() #requires the {#with}
2013-05-02 19:16:09 +00:00
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')