2014-08-21 22:40:19 +08:00
|
|
|
# Convert a color `value` as integer to a hex color (e.g. 255 to #0000ff)
|
|
|
|
@colourToHex = (value) ->
|
|
|
|
hex = parseInt(value).toString(16)
|
|
|
|
hex = "0" + hex while hex.length < 6
|
|
|
|
"##{hex}"
|
|
|
|
|
2014-10-28 22:24:56 +08:00
|
|
|
# color can be a number (a hex converted to int) or a string (e.g. "#ffff00")
|
|
|
|
@formatColor = (color) ->
|
|
|
|
color ?= "0" # default value
|
|
|
|
if !color.toString().match(/\#.*/)
|
|
|
|
color = colourToHex(color)
|
|
|
|
color
|
|
|
|
|
|
|
|
# thickness can be a number (e.g. "2") or a string (e.g. "2px")
|
|
|
|
@formatThickness = (thickness) ->
|
|
|
|
thickness ?= "1" # default value
|
|
|
|
if !thickness.toString().match(/.*px$/)
|
|
|
|
"#" + thickness + "px" # leading "#" - to be compatible with Firefox
|
|
|
|
thickness
|
|
|
|
|
|
|
|
@getCurrentSlideDoc = -> # returns only one document
|
|
|
|
currentPresentation = Meteor.Presentations.findOne({"presentation.current": true})
|
|
|
|
presentationId = currentPresentation?.presentation?.id
|
|
|
|
currentSlide = Meteor.Slides.findOne({"presentationId": presentationId, "slide.current": true})
|
|
|
|
|
2014-08-09 00:04:04 +08:00
|
|
|
# retrieve account for selected user
|
|
|
|
@getCurrentUserFromSession = ->
|
2014-10-10 01:43:22 +08:00
|
|
|
Meteor.Users.findOne("_id": getInSession("userId"))
|
2014-08-09 00:04:04 +08:00
|
|
|
|
|
|
|
@getInSession = (k) -> SessionAmplify.get k
|
|
|
|
|
|
|
|
@getMeetingName = ->
|
|
|
|
meetName = getInSession("meetingName") # check if we actually have one in the session
|
|
|
|
if meetName? then meetName # great return it, no database query
|
|
|
|
else # we need it from the database
|
|
|
|
meet = Meteor.Meetings.findOne({})
|
|
|
|
if meet?.meetingName
|
|
|
|
setInSession "meetingName", meet?.meetingName # store in session for fast access next time
|
|
|
|
meet?.meetingName
|
2014-10-08 00:12:53 +08:00
|
|
|
else "your meeting"
|
2014-08-09 00:04:04 +08:00
|
|
|
|
|
|
|
@getTime = -> # returns epoch in ms
|
|
|
|
(new Date).valueOf()
|
|
|
|
|
2014-09-25 03:55:55 +08:00
|
|
|
@getTimeOfJoining = ->
|
2014-10-04 01:26:01 +08:00
|
|
|
Meteor.Users.findOne(_id: getInSession "DBID")?.user?.time_of_joining
|
2014-09-25 03:55:55 +08:00
|
|
|
|
2014-09-23 06:11:24 +08:00
|
|
|
@getPresentationFilename = ->
|
|
|
|
currentPresentation = Meteor.Presentations.findOne({"presentation.current": true})
|
|
|
|
currentPresentation?.presentation?.name
|
2014-10-28 22:24:56 +08:00
|
|
|
|
2014-08-21 22:40:19 +08:00
|
|
|
Handlebars.registerHelper "colourToHex", (value) =>
|
2014-10-28 22:24:56 +08:00
|
|
|
@window.colourToHex(value)
|
2014-08-21 22:40:19 +08:00
|
|
|
|
2014-07-09 21:15:50 +08:00
|
|
|
Handlebars.registerHelper 'equals', (a, b) -> # equals operator was dropped in Meteor's migration from Handlebars to Spacebars
|
2014-07-04 01:54:41 +08:00
|
|
|
a is b
|
|
|
|
|
2014-09-05 00:32:24 +08:00
|
|
|
Handlebars.registerHelper "getCurrentMeeting", ->
|
2014-10-28 22:24:56 +08:00
|
|
|
Meteor.Meetings.findOne()
|
2014-09-05 00:32:24 +08:00
|
|
|
|
2014-11-15 04:03:45 +08:00
|
|
|
Handlebars.registerHelper "getIPFromConfig", ->
|
|
|
|
Meteor.config.app.redirectToLoginOnLogout
|
|
|
|
|
2014-08-18 22:29:02 +08:00
|
|
|
Handlebars.registerHelper "getCurrentSlide", ->
|
|
|
|
currentPresentation = Meteor.Presentations.findOne({"presentation.current": true})
|
|
|
|
presentationId = currentPresentation?.presentation?.id
|
|
|
|
Meteor.Slides.find({"presentationId": presentationId, "slide.current": true})
|
|
|
|
|
2014-08-09 00:04:04 +08:00
|
|
|
# retrieve account for selected user
|
|
|
|
Handlebars.registerHelper "getCurrentUser", =>
|
|
|
|
@window.getCurrentUserFromSession()
|
|
|
|
|
2014-06-14 02:19:50 +08:00
|
|
|
# Allow access through all templates
|
2014-07-22 21:31:32 +08:00
|
|
|
Handlebars.registerHelper "getInSession", (k) -> SessionAmplify.get k
|
2014-06-14 02:19:50 +08:00
|
|
|
|
2014-08-09 00:04:04 +08:00
|
|
|
Handlebars.registerHelper "getMeetingName", ->
|
|
|
|
window.getMeetingName()
|
2014-06-14 02:19:50 +08:00
|
|
|
|
2014-08-18 22:29:02 +08:00
|
|
|
Handlebars.registerHelper "getShapesForSlide", ->
|
2014-09-16 00:46:02 +08:00
|
|
|
currentSlide = getCurrentSlideDoc()
|
2014-10-28 22:24:56 +08:00
|
|
|
|
2014-08-18 22:29:02 +08:00
|
|
|
# try to reuse the lines above
|
|
|
|
Meteor.Shapes.find({whiteboardId: currentSlide?.slide?.id})
|
|
|
|
|
2014-08-09 00:04:04 +08:00
|
|
|
# retrieves all users in the meeting
|
|
|
|
Handlebars.registerHelper "getUsersInMeeting", ->
|
|
|
|
Meteor.Users.find({})
|
|
|
|
|
2014-10-28 22:24:56 +08:00
|
|
|
Handlebars.registerHelper "getWhiteboardTitle", ->
|
|
|
|
"Whiteboard: " + getPresentationFilename()
|
|
|
|
|
2014-10-08 00:35:45 +08:00
|
|
|
Handlebars.registerHelper "isCurrentUser", (_id) ->
|
2014-11-12 21:30:34 +08:00
|
|
|
_id is BBB.getCurrentUser()?._id
|
2014-08-09 00:04:04 +08:00
|
|
|
|
2014-09-04 04:02:00 +08:00
|
|
|
Handlebars.registerHelper "isCurrentUserMuted", ->
|
2014-11-12 21:30:34 +08:00
|
|
|
BBB.amIMuted()
|
2014-09-04 04:02:00 +08:00
|
|
|
|
|
|
|
Handlebars.registerHelper "isCurrentUserRaisingHand", ->
|
2014-11-12 21:30:34 +08:00
|
|
|
user = BBB.getCurrentUser()
|
2014-10-15 04:25:45 +08:00
|
|
|
user?.user?.raise_hand
|
2014-09-04 04:02:00 +08:00
|
|
|
|
2014-09-04 03:22:08 +08:00
|
|
|
Handlebars.registerHelper "isCurrentUserSharingAudio", ->
|
2014-11-12 21:30:34 +08:00
|
|
|
BBB.amISharingAudio()
|
2014-09-04 03:22:08 +08:00
|
|
|
|
|
|
|
Handlebars.registerHelper "isCurrentUserSharingVideo", ->
|
2014-11-12 21:30:34 +08:00
|
|
|
BBB.amISharingVideo()
|
2014-09-04 04:11:56 +08:00
|
|
|
|
|
|
|
Handlebars.registerHelper "isCurrentUserTalking", ->
|
2014-11-12 21:30:34 +08:00
|
|
|
BBB.amITalking()
|
2014-10-11 05:35:51 +08:00
|
|
|
|
2014-11-04 22:20:55 +08:00
|
|
|
Handlebars.registerHelper "isDisconnected", ->
|
|
|
|
return !Meteor.status().connected
|
2014-10-11 05:35:51 +08:00
|
|
|
|
|
|
|
Handlebars.registerHelper "isUserListenOnly", (_id) ->
|
2014-10-24 23:09:58 +08:00
|
|
|
user = Meteor.Users.findOne({_id:_id})
|
|
|
|
return user?.user?.listenOnly
|
2014-10-11 05:35:51 +08:00
|
|
|
|
2014-10-28 22:24:56 +08:00
|
|
|
Handlebars.registerHelper "isUserMuted", (_id) ->
|
2014-11-12 21:30:34 +08:00
|
|
|
BBB.isUserMuted(_id)
|
2014-10-28 22:24:56 +08:00
|
|
|
|
|
|
|
Handlebars.registerHelper "isUserSharingAudio", (_id) ->
|
2014-11-12 21:30:34 +08:00
|
|
|
BBB.isUserSharingAudio(_id)
|
2014-10-28 22:24:56 +08:00
|
|
|
|
2014-10-11 05:35:51 +08:00
|
|
|
Handlebars.registerHelper "isUserSharingVideo", (_id) ->
|
2014-11-12 21:30:34 +08:00
|
|
|
BBB.isUserSharingWebcam(_id)
|
2014-10-11 05:35:51 +08:00
|
|
|
|
|
|
|
Handlebars.registerHelper "isUserTalking", (_id) ->
|
2014-11-12 21:30:34 +08:00
|
|
|
BBB.isUserTalking(_id)
|
2014-10-11 05:35:51 +08:00
|
|
|
|
2014-10-28 22:24:56 +08:00
|
|
|
Handlebars.registerHelper "meetingIsRecording", ->
|
|
|
|
Meteor.Meetings.findOne()?.recorded # Should only ever have one meeting, so we dont need any filter and can trust result #1
|
2014-08-09 00:04:04 +08:00
|
|
|
|
2014-08-16 01:17:51 +08:00
|
|
|
Handlebars.registerHelper "messageFontSize", ->
|
2014-10-28 22:24:56 +08:00
|
|
|
style: "font-size: #{getInSession("messageFontSize")}px;"
|
2014-08-16 01:17:51 +08:00
|
|
|
|
2014-08-18 22:29:02 +08:00
|
|
|
Handlebars.registerHelper "pointerLocation", ->
|
|
|
|
currentPresentation = Meteor.Presentations.findOne({"presentation.current": true})
|
2014-11-03 06:14:16 +08:00
|
|
|
presentationId = currentPresentation?.presentation?.id
|
|
|
|
currentSlideDoc = Meteor.Slides.findOne({"presentationId": presentationId, "slide.current": true})
|
|
|
|
pointer = currentPresentation?.pointer
|
|
|
|
pointer.x = (- currentSlideDoc.slide.x_offset * 2 + currentSlideDoc.slide.width_ratio * pointer.x) / 100
|
|
|
|
pointer.y = (- currentSlideDoc.slide.y_offset * 2 + currentSlideDoc.slide.height_ratio * pointer.y) / 100
|
|
|
|
pointer
|
2014-08-18 22:29:02 +08:00
|
|
|
|
2014-10-28 22:24:56 +08:00
|
|
|
Handlebars.registerHelper "safeName", (str) ->
|
|
|
|
safeString(str)
|
|
|
|
|
2014-10-24 23:09:58 +08:00
|
|
|
Handlebars.registerHelper "setInSession", (k, v) -> SessionAmplify.set k, v
|
2014-08-09 00:04:04 +08:00
|
|
|
|
|
|
|
Handlebars.registerHelper "visibility", (section) ->
|
2014-10-24 23:09:58 +08:00
|
|
|
if getInSession "display_#{section}"
|
|
|
|
style: 'display:block'
|
|
|
|
else
|
|
|
|
style: 'display:none'
|
2014-08-09 00:04:04 +08:00
|
|
|
|
2014-10-28 22:24:56 +08:00
|
|
|
@isSharingAudio = ->
|
|
|
|
return Meteor.Users.findOne({_id: getInSession "DBID"})?.user?.voiceUser?.joined
|
|
|
|
|
2014-08-18 22:29:02 +08:00
|
|
|
# transform plain text links into HTML tags compatible with Flash client
|
|
|
|
@linkify = (str) ->
|
|
|
|
www = /(^|[^\/])(www\.[\S]+($|\b))/img
|
|
|
|
http = /\b(https?:\/\/[0-9a-z+|.,:;\/&?_~%#=@!-]*[0-9a-z+|\/&_~%#=@-])/img
|
|
|
|
str = str.replace http, "<a href='event:$1'><u>$1</u></a>"
|
|
|
|
str = str.replace www, "$1<a href='event:http://$2'><u>$2</u></a>"
|
|
|
|
|
2014-10-28 22:24:56 +08:00
|
|
|
# check the chat history of the user and add tabs for the private chats
|
|
|
|
@populateChatTabs = ->
|
|
|
|
mydbid = getInSession "DBID"
|
|
|
|
users = Meteor.Users.find().fetch()
|
|
|
|
|
|
|
|
# assuming that I only have access only to private messages where I am the sender or the recipient
|
|
|
|
myPrivateChats = Meteor.Chat.find({'message.chat_type': 'PRIVATE_CHAT'}).fetch()
|
|
|
|
|
|
|
|
uniqueArray = []
|
|
|
|
for chat in myPrivateChats
|
|
|
|
if chat.message.to_userid is mydbid
|
|
|
|
uniqueArray.push({userId: chat.message.from_userid, username: chat.message.from_username})
|
|
|
|
if chat.message.from_userid is mydbid
|
|
|
|
uniqueArray.push({userId: chat.message.to_userid, username: chat.message.to_username})
|
|
|
|
|
|
|
|
#keep unique entries only
|
|
|
|
uniqueArray = uniqueArray.filter((itm, i, a) ->
|
|
|
|
i is a.indexOf(itm)
|
|
|
|
)
|
|
|
|
#insert the unique entries in the collection
|
|
|
|
for u in uniqueArray
|
|
|
|
unless chatTabs.findOne({userId: u.userId})?
|
|
|
|
chatTabs.insert({ userId: u.userId, name: u.username, gotMail: false, class: "privateChatTab"})
|
|
|
|
|
2014-11-06 23:27:43 +08:00
|
|
|
@setInSession = (k, v) ->
|
|
|
|
if k is "DBID" then console.log "setInSession #{k}, #{v}"
|
|
|
|
SessionAmplify.set k, v
|
|
|
|
|
|
|
|
@sendMeetingInfoToClient = (meetingId, userId) ->
|
|
|
|
setInSession("userId", userId)
|
|
|
|
setInSession("meetingId", meetingId)
|
|
|
|
setInSession("currentChatId", meetingId) #TODO check if this is needed
|
|
|
|
setInSession("meetingName", null)
|
|
|
|
setInSession("userName", null)
|
|
|
|
|
2014-11-19 03:35:51 +08:00
|
|
|
@setInSession = (k, v) -> SessionAmplify.set k, v
|
2014-10-28 22:24:56 +08:00
|
|
|
|
|
|
|
@safeString = (str) ->
|
2014-11-06 23:27:43 +08:00
|
|
|
if typeof str is 'string'
|
2014-10-28 22:24:56 +08:00
|
|
|
str.replace(/&/g, '&').replace(/</g, '<').replace(/>/g, '>').replace(/"/g, '"');
|
|
|
|
|
2014-07-14 22:46:02 +08:00
|
|
|
@toggleCam = (event) ->
|
2014-08-09 00:04:04 +08:00
|
|
|
# Meteor.Users.update {_id: context._id} , {$set:{"user.sharingVideo": !context.sharingVideo}}
|
2014-06-27 01:13:19 +08:00
|
|
|
# Meteor.call('userToggleCam', context._id, !context.sharingVideo)
|
2014-06-14 02:19:50 +08:00
|
|
|
|
2014-08-09 00:04:04 +08:00
|
|
|
@toggleChatbar = ->
|
|
|
|
setInSession "display_chatbar", !getInSession "display_chatbar"
|
|
|
|
|
|
|
|
@toggleMic = (event) ->
|
2014-10-15 05:20:27 +08:00
|
|
|
u = Meteor.Users.findOne({_id:getInSession("DBID")})
|
|
|
|
if u?
|
2014-11-19 03:35:51 +08:00
|
|
|
Meteor.call('muteUser', getInSession("meetingId"), u.userId, getInSession("userId"), getInSession("userSecret"), not u.user.voiceUser.muted)
|
2014-08-09 00:04:04 +08:00
|
|
|
|
|
|
|
@toggleNavbar = ->
|
|
|
|
setInSession "display_navbar", !getInSession "display_navbar"
|
|
|
|
|
|
|
|
# toggle state of session variable
|
|
|
|
@toggleUsersList = ->
|
|
|
|
setInSession "display_usersList", !getInSession "display_usersList"
|
|
|
|
|
2014-10-24 23:09:58 +08:00
|
|
|
@toggleVoiceCall = (event) ->
|
2014-11-12 02:56:39 +08:00
|
|
|
if isSharingAudio()
|
|
|
|
hangupCallback = ->
|
|
|
|
console.log "left voice conference"
|
2014-11-19 06:44:52 +08:00
|
|
|
BBB.leaveVoiceConference hangupCallback #TODO should we apply role permissions to this action?
|
2014-11-12 02:56:39 +08:00
|
|
|
else
|
|
|
|
# create voice call params
|
|
|
|
joinCallback = (message) ->
|
|
|
|
console.log "started webrtc_call"
|
2014-11-19 06:44:52 +08:00
|
|
|
BBB.joinVoiceConference joinCallback # make the call #TODO should we apply role permissions to this action?
|
2014-11-12 02:56:39 +08:00
|
|
|
return false
|
2014-06-14 02:19:50 +08:00
|
|
|
|
2014-08-01 21:51:45 +08:00
|
|
|
@toggleWhiteBoard = ->
|
|
|
|
setInSession "display_whiteboard", !getInSession "display_whiteboard"
|
2014-06-19 22:45:58 +08:00
|
|
|
|
2014-07-29 22:20:51 +08:00
|
|
|
# Starts the entire logout procedure.
|
2014-07-25 01:56:31 +08:00
|
|
|
# meeting: the meeting the user is in
|
|
|
|
# the user's userId
|
2014-07-28 23:00:07 +08:00
|
|
|
@userLogout = (meeting, user) ->
|
2014-11-19 06:03:13 +08:00
|
|
|
Meteor.call("userLogout", meeting, user, getInSession("userSecret"))
|
2014-07-25 01:56:31 +08:00
|
|
|
|
2014-07-28 23:00:07 +08:00
|
|
|
# Clear the local user session and redirect them away
|
2014-07-25 01:56:31 +08:00
|
|
|
setInSession("userId", null)
|
|
|
|
setInSession("meetingId", null)
|
|
|
|
setInSession("currentChatId", null)
|
|
|
|
setInSession("meetingName", null)
|
|
|
|
setInSession("bbbServerVersion", null)
|
2014-10-24 23:09:58 +08:00
|
|
|
setInSession("userName", null)
|
2014-07-25 01:56:31 +08:00
|
|
|
setInSession "display_navbar", false # needed to hide navbar when the layout template renders
|
2014-10-24 23:09:58 +08:00
|
|
|
|
2014-07-28 23:00:07 +08:00
|
|
|
Router.go('logout') # navigate to logout
|
2014-08-22 03:36:50 +08:00
|
|
|
|
2014-09-13 04:26:25 +08:00
|
|
|
# applies zooming to the stroke thickness
|
|
|
|
@zoomStroke = (thickness) ->
|
2014-09-16 00:46:02 +08:00
|
|
|
currentSlide = @getCurrentSlideDoc()
|
2014-09-13 04:26:25 +08:00
|
|
|
ratio = (currentSlide?.slide.width_ratio + currentSlide?.slide.height_ratio) / 2
|
|
|
|
thickness * 100 / ratio
|
2014-09-16 00:46:02 +08:00
|
|
|
|
2014-10-28 22:24:56 +08:00
|
|
|
# start a clientside-only collection keeping track of the chat tabs
|
2014-09-26 01:24:42 +08:00
|
|
|
@chatTabs = new Meteor.Collection(null)
|
2014-10-28 22:24:56 +08:00
|
|
|
# insert the basic tabs
|
2014-09-26 02:17:39 +08:00
|
|
|
@chatTabs.insert({ userId: "PUBLIC_CHAT", name: "Public", gotMail: false, class: "publicChatTab"})
|
|
|
|
@chatTabs.insert({ userId: "OPTIONS", name: "Options", gotMail: false, class: "optionsChatTab"})
|