habitica/src/app/groups.coffee

128 lines
4.4 KiB
CoffeeScript
Raw Normal View History

_ = require('lodash')
helpers = require('habitrpg-shared/script/helpers')
2013-05-02 19:16:09 +00:00
module.exports.app = (appExports, model, app) ->
character = require './character'
browser = require './browser'
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 (->_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('groups').withId(after)
partyQ.fetch (err, party) ->
return next(err) if err
model.ref '_party', party
browser.resetDom(model)
appExports.groupCreate = (e,el) ->
model.add('groups',
name: model.get("_newGroup")
leader: user.get('id')
members: [user.get('id')]
type: $(el).attr('data-type')
, ->location.reload())
appExports.groupInvite = (e,el) ->
id = model.get('_groupInvitee').replace(/[\s"]/g, '')
model.set '_groupInvitee', ''
return if _.isEmpty(id)
model.query('users').publicInfo([id]).fetch (err, profiles) ->
2013-02-05 21:11:28 +00:00
throw err if err
profile = profiles.at(0)
return model.set("_groupError", "User with id #{id} not found.") unless profile.get()
invite = ->
$.bootstrapGrowl "Invitation Sent."
model.set("users.#{id}.party.invitation", e.get('id'), ->location.reload())
if e.get('type') is 'party'
model.query('groups').withMember(id).fetch (err,groups) ->
if profile.get('party.invitation') or !_.isEmpty(groups.get())
return model.set("_groupError", "User already in a party or pending invitation.")
else invite()
else invite()
appExports.partyAccept = ->
partyId = user.get('party.invitation')
user.set 'party.invitation', null, ->
model.push("groups.#{partyId}.members", user.get('id'), ->location.reload())
appExports.partyReject = ->
user.set 'party.invitation', null
browser.resetDom(model)
appExports.groupLeave = (e,el) ->
members = e.get('members')
index = members.indexOf(user.get('id'))
e.at().remove 'members', index, 1, ->
if members.length is 1 # # last member out, kill the party
model.del("groups.#{id}", ->location.reload())
else
location.reload()
2013-05-02 19:16:09 +00:00
###
Chat Functionality
###
model.on 'unshift', '_party.chat', -> $('.chat-message').tooltip()
model.on 'unshift', '_habitrpg.chat', -> $('.chat-message').tooltip()
appExports.sendChat = (e,el) ->
text = model.get '_chatMessage'
# Check for non-whitespace characters
return unless /\S/.test text
group = e.at()
chat = group.at('chat')
model.set('_chatMessage', '')
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)
type = $(el).attr('data-type')
model.set '_user.party.lastMessageSeen', chat.get()[0].id if group.get('type') is 'party'
2013-05-02 19:16:09 +00:00
appExports.chatKeyup = (e, el, next) ->
return next() unless e.keyCode is 13
appExports.sendChat(e, el)
appExports.deleteChatMessage = (e) ->
if confirm("Delete chat message?") is true
e.at().remove() #requires the {#with}
2013-05-10 10:53:20 +00:00
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')