/
BigBlueButtonActor.scala
executable file
·145 lines (122 loc) · 5.18 KB
/
BigBlueButtonActor.scala
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
package org.bigbluebutton.core
import scala.actors.Actor
import scala.actors.Actor._
import scala.collection.mutable.HashMap
import org.bigbluebutton.core.api._
import org.bigbluebutton.core.util._
class BigBlueButtonActor(outGW: MessageOutGateway) extends Actor with LogHelper {
private var meetings = new HashMap[String, MeetingActor]
def act() = {
loop {
react {
case msg: CreateMeeting => handleCreateMeeting(msg)
case msg: DestroyMeeting => handleDestroyMeeting(msg)
case msg: KeepAliveMessage => handleKeepAliveMessage(msg)
case msg: GetAllMeetingsRequest => handleGetAllMeetingsRequest(msg)
case msg: InMessage => handleMeetingMessage(msg)
case _ => // do nothing
}
}
}
private def handleMeetingMessage(msg: InMessage):Unit = {
msg match {
case ucm: UserConnectedToGlobalAudio => {
val m = meetings.values.find( m => m.voiceBridge == ucm.voiceConf)
m foreach {mActor => mActor ! ucm}
}
case udm: UserDisconnectedFromGlobalAudio => {
val m = meetings.values.find( m => m.voiceBridge == udm.voiceConf)
m foreach {mActor => mActor ! udm}
}
case allOthers => {
meetings.get(allOthers.meetingID) match {
case None => handleMeetingNotFound(allOthers)
case Some(m) => {
// log.debug("Forwarding message [{}] to meeting [{}]", msg.meetingID)
m ! allOthers
}
}
}
}
}
private def handleMeetingNotFound(msg: InMessage) {
msg match {
case vat:ValidateAuthToken => {
logger.info("No meeting [" + vat.meetingID + "] for auth token [" + vat.token + "]")
outGW.send(new ValidateAuthTokenReply(vat.meetingID, vat.userId, vat.token, false, vat.correlationId, vat.sessionId))
}
case _ => {
logger.info("No meeting [" + msg.meetingID + "] for message type [" + msg.getClass() + "]")
// do nothing
}
}
}
private def handleKeepAliveMessage(msg: KeepAliveMessage):Unit = {
outGW.send(new KeepAliveMessageReply(msg.aliveID))
}
private def handleDestroyMeeting(msg: DestroyMeeting) {
logger.info("BBBActor received DestroyMeeting message for meeting id [" + msg.meetingID + "]")
meetings.get(msg.meetingID) match {
case None => println("Could not find meeting id[" + msg.meetingID + "] to destroy.")
case Some(m) => {
m ! StopMeetingActor
meetings -= msg.meetingID
logger.info("Kick everyone out on meeting id[" + msg.meetingID + "].")
outGW.send(new EndAndKickAll(msg.meetingID, m.recorded))
logger.info("Destroyed meeting id[" + msg.meetingID + "].")
outGW.send(new MeetingDestroyed(msg.meetingID))
}
}
}
private def handleCreateMeeting(msg: CreateMeeting):Unit = {
meetings.get(msg.meetingID) match {
case None => {
logger.info("New meeting create request [" + msg.meetingName + "]")
var m = new MeetingActor(msg.meetingID, msg.externalMeetingID, msg.meetingName, msg.recorded,
msg.voiceBridge, msg.duration,
msg.autoStartRecording, msg.allowStartStopRecording,
outGW)
m.start
meetings += m.meetingID -> m
outGW.send(new MeetingCreated(m.meetingID, m.externalMeetingID, m.recorded, m.meetingName, m.voiceBridge, msg.duration))
m ! new InitializeMeeting(m.meetingID, m.recorded)
m ! "StartTimer"
}
case Some(m) => {
logger.info("Meeting already created [" + msg.meetingName + "]")
// do nothing
}
}
}
private def handleGetAllMeetingsRequest(msg: GetAllMeetingsRequest) {
var len = meetings.keys.size
println("meetings.size=" + meetings.size)
println("len_=" + len)
val set = meetings.keySet
val arr : Array[String] = new Array[String](len)
set.copyToArray(arr)
val resultArray : Array[MeetingInfo] = new Array[MeetingInfo](len)
for(i <- 0 until arr.length) {
val id = arr(i)
val duration = meetings.get(arr(i)).head.getDuration()
val name = meetings.get(arr(i)).head.getMeetingName()
val recorded = meetings.get(arr(i)).head.getRecordedStatus()
val voiceBridge = meetings.get(arr(i)).head.getVoiceBridgeNumber()
var info = new MeetingInfo(id, name, recorded, voiceBridge, duration)
resultArray(i) = info
//remove later
println("for a meeting:" + id)
println("Meeting Name = " + meetings.get(id).head.getMeetingName())
println("isRecorded = " + meetings.get(id).head.getRecordedStatus())
println("voiceBridge = " + voiceBridge)
println("duration = " + duration)
//send the users
this ! (new GetUsers(id, "nodeJSapp"))
//send the presentation
this ! (new GetPresentationInfo(id, "nodeJSapp", "nodeJSapp"))
//send chat history
this ! (new GetChatHistoryRequest(id, "nodeJSapp", "nodeJSapp"))
}
outGW.send(new GetAllMeetingsReply(resultArray))
}
}