Skip to content

Commit

Permalink
Merge branch 'master' of github.com:bigbluebutton/bigbluebutton into …
Browse files Browse the repository at this point in the history
…try-to-cleanup-connection

Conflicts:
	akka-bbb-apps/src/main/scala/org/bigbluebutton/core/apps/BreakoutRoomApp.scala
  • Loading branch information
ritzalam committed Oct 21, 2016
2 parents 7ea0ab7 + f5e19f1 commit 1e8d7a5
Show file tree
Hide file tree
Showing 72 changed files with 1,025 additions and 894 deletions.
2 changes: 1 addition & 1 deletion akka-bbb-apps/build.sbt
Expand Up @@ -55,7 +55,7 @@ libraryDependencies ++= {
"org.pegdown" % "pegdown" % "1.4.0", "org.pegdown" % "pegdown" % "1.4.0",
"junit" % "junit" % "4.11", "junit" % "junit" % "4.11",
"com.etaty.rediscala" %% "rediscala" % "1.4.0", "com.etaty.rediscala" %% "rediscala" % "1.4.0",
"commons-codec" % "commons-codec" % "1.8", "commons-codec" % "commons-codec" % "1.10",
"joda-time" % "joda-time" % "2.3", "joda-time" % "joda-time" % "2.3",
"com.google.code.gson" % "gson" % "2.5", "com.google.code.gson" % "gson" % "2.5",
"redis.clients" % "jedis" % "2.7.2", "redis.clients" % "jedis" % "2.7.2",
Expand Down
Expand Up @@ -35,7 +35,7 @@ public MeetingMessageReceiver(IBigBlueButtonInGW bbbGW) {


public void handleMessage(String pattern, String channel, String message) { public void handleMessage(String pattern, String channel, String message) {
if (channel.equalsIgnoreCase(MessagingConstants.TO_MEETING_CHANNEL)) { if (channel.equalsIgnoreCase(MessagingConstants.TO_MEETING_CHANNEL)) {
System.out.println("Meeting message: " + channel + " " + message); System.out.println("Meeting message: " + channel + " " + message);


JsonParser parser = new JsonParser(); JsonParser parser = new JsonParser();
JsonObject obj = (JsonObject) parser.parse(message); JsonObject obj = (JsonObject) parser.parse(message);
Expand All @@ -45,8 +45,8 @@ public void handleMessage(String pattern, String channel, String message) {
String messageName = header.get("name").getAsString(); String messageName = header.get("name").getAsString();
if (CreateMeetingRequest.NAME.equals(messageName)) { if (CreateMeetingRequest.NAME.equals(messageName)) {
Gson gson = new Gson(); Gson gson = new Gson();
CreateMeetingRequest msg = gson.fromJson(message, CreateMeetingRequest msg = gson.fromJson(message,
CreateMeetingRequest.class); CreateMeetingRequest.class);
bbbGW.handleBigBlueButtonMessage(msg); bbbGW.handleBigBlueButtonMessage(msg);
} }
} }
Expand All @@ -59,49 +59,50 @@ public void handleMessage(String pattern, String channel, String message) {
EndMeetingMessage emm = (EndMeetingMessage) msg; EndMeetingMessage emm = (EndMeetingMessage) msg;
bbbGW.endMeeting(emm.meetingId); bbbGW.endMeeting(emm.meetingId);
} else if (msg instanceof RegisterUserMessage) { } else if (msg instanceof RegisterUserMessage) {
RegisterUserMessage emm = (RegisterUserMessage) msg; RegisterUserMessage rum = (RegisterUserMessage) msg;
bbbGW.registerUser(emm.meetingID, emm.internalUserId, emm.fullname, emm.role, emm.externUserID, emm.authToken, emm.avatarURL); bbbGW.registerUser(rum.meetingID, rum.internalUserId, rum.fullname, rum.role, rum.externUserID, rum.authToken, rum.avatarURL);
} else if (msg instanceof DestroyMeetingMessage) { } else if (msg instanceof DestroyMeetingMessage) {
DestroyMeetingMessage emm = (DestroyMeetingMessage) msg; DestroyMeetingMessage dmm = (DestroyMeetingMessage) msg;
bbbGW.destroyMeeting(emm.meetingId); bbbGW.destroyMeeting(dmm.meetingId);
} else if (msg instanceof ValidateAuthTokenMessage) { } else if (msg instanceof ValidateAuthTokenMessage) {
ValidateAuthTokenMessage emm = (ValidateAuthTokenMessage) msg; ValidateAuthTokenMessage vam = (ValidateAuthTokenMessage) msg;
String sessionId = "tobeimplemented"; String sessionId = "tobeimplemented";
bbbGW.validateAuthToken(emm.meetingId, emm.userId, emm.token, emm.replyTo, sessionId); bbbGW.validateAuthToken(vam.meetingId, vam.userId, vam.token, vam.replyTo, sessionId);
} else if (msg instanceof UserConnectedToGlobalAudio) { } else if (msg instanceof UserConnectedToGlobalAudio) {
UserConnectedToGlobalAudio emm = (UserConnectedToGlobalAudio) msg; UserConnectedToGlobalAudio ustga = (UserConnectedToGlobalAudio) msg;


Map<String, Object> logData = new HashMap<String, Object>(); Map<String, Object> logData = new HashMap<String, Object>();
logData.put("voiceConf", emm.voiceConf); logData.put("voiceConf", ustga.voiceConf);
logData.put("userId", emm.userid); logData.put("userId", ustga.userid);
logData.put("username", emm.name); logData.put("username", ustga.name);
logData.put("event", "user_connected_to_global_audio"); logData.put("event", "user_connected_to_global_audio");
logData.put("description", "User connected to global audio."); logData.put("description", "User connected to global audio.");


/*
Gson gson = new Gson(); Gson gson = new Gson();
String logStr = gson.toJson(logData); String logStr = gson.toJson(logData);

System.out.println("User connected to global audio: data={}", logStr);
//System.out.println("User connected to global audio: data={}", logStr); */

bbbGW.userConnectedToGlobalAudio(ustga.voiceConf, ustga.userid, ustga.name);
bbbGW.userConnectedToGlobalAudio(emm.voiceConf, emm.userid, emm.name);
} else if (msg instanceof UserDisconnectedFromGlobalAudio) { } else if (msg instanceof UserDisconnectedFromGlobalAudio) {
UserDisconnectedFromGlobalAudio emm = (UserDisconnectedFromGlobalAudio) msg; UserDisconnectedFromGlobalAudio udfga = (UserDisconnectedFromGlobalAudio) msg;


Map<String, Object> logData = new HashMap<String, Object>(); Map<String, Object> logData = new HashMap<String, Object>();
logData.put("voiceConf", emm.voiceConf); logData.put("voiceConf", udfga.voiceConf);
logData.put("userId", emm.userid); logData.put("userId", udfga.userid);
logData.put("username", emm.name); logData.put("username", udfga.name);
logData.put("event", "user_disconnected_from_global_audio"); logData.put("event", "user_disconnected_from_global_audio");
logData.put("description", "User disconnected from global audio."); logData.put("description", "User disconnected from global audio.");


/*
Gson gson = new Gson(); Gson gson = new Gson();
String logStr = gson.toJson(logData); String logStr = gson.toJson(logData);

System.out.println("User disconnected from global audio: data={}", logStr);
//System.out.println("User disconnected from global audio: data={}", logStr); */
bbbGW.userDisconnectedFromGlobalAudio(emm.voiceConf, emm.userid, emm.name); bbbGW.userDisconnectedFromGlobalAudio(udfga.voiceConf, udfga.userid, udfga.name);
} }
else if (msg instanceof GetAllMeetingsRequest) { else if (msg instanceof GetAllMeetingsRequest) {
GetAllMeetingsRequest emm = (GetAllMeetingsRequest) msg; GetAllMeetingsRequest gamr = (GetAllMeetingsRequest) msg;
bbbGW.getAllMeetings("no_need_of_a_meeting_id"); bbbGW.getAllMeetings("no_need_of_a_meeting_id");
} else { } else {
System.out.println("Unknown message: [" + message + "]"); System.out.println("Unknown message: [" + message + "]");
Expand All @@ -126,8 +127,8 @@ else if (msg instanceof GetAllMeetingsRequest) {


if (msg != null) { if (msg != null) {
if (msg instanceof KeepAliveMessage) { if (msg instanceof KeepAliveMessage) {
KeepAliveMessage emm = (KeepAliveMessage) msg; KeepAliveMessage kam = (KeepAliveMessage) msg;
bbbGW.isAliveAudit(emm.keepAliveId); bbbGW.isAliveAudit(kam.keepAliveId);
} }
} else { } else {
System.out.println("Unknown message: [" + message + "]"); System.out.println("Unknown message: [" + message + "]");
Expand Down
Expand Up @@ -11,33 +11,33 @@ import org.bigbluebutton.SystemConfiguration


object BigBlueButtonActor extends SystemConfiguration { object BigBlueButtonActor extends SystemConfiguration {
def props(system: ActorSystem, def props(system: ActorSystem,
eventBus: IncomingEventBus, eventBus: IncomingEventBus,
outGW: OutMessageGateway): Props = outGW: OutMessageGateway): Props =
Props(classOf[BigBlueButtonActor], system, eventBus, outGW) Props(classOf[BigBlueButtonActor], system, eventBus, outGW)
} }


class BigBlueButtonActor(val system: ActorSystem, class BigBlueButtonActor(val system: ActorSystem,
eventBus: IncomingEventBus, outGW: OutMessageGateway) extends Actor with ActorLogging { eventBus: IncomingEventBus, outGW: OutMessageGateway) extends Actor with ActorLogging {


implicit def executionContext = system.dispatcher implicit def executionContext = system.dispatcher
implicit val timeout = Timeout(5 seconds) implicit val timeout = Timeout(5 seconds)


private var meetings = new collection.immutable.HashMap[String, RunningMeeting] private var meetings = new collection.immutable.HashMap[String, RunningMeeting]


def receive = { def receive = {
case msg: CreateMeeting => handleCreateMeeting(msg) case msg: CreateMeeting => handleCreateMeeting(msg)
case msg: DestroyMeeting => handleDestroyMeeting(msg) case msg: DestroyMeeting => handleDestroyMeeting(msg)
case msg: KeepAliveMessage => handleKeepAliveMessage(msg) case msg: KeepAliveMessage => handleKeepAliveMessage(msg)
case msg: PubSubPing => handlePubSubPingMessage(msg) case msg: PubSubPing => handlePubSubPingMessage(msg)
case msg: ValidateAuthToken => handleValidateAuthToken(msg) case msg: ValidateAuthToken => handleValidateAuthToken(msg)
case msg: GetAllMeetingsRequest => handleGetAllMeetingsRequest(msg) case msg: GetAllMeetingsRequest => handleGetAllMeetingsRequest(msg)
case msg: UserJoinedVoiceConfMessage => handleUserJoinedVoiceConfMessage(msg) case msg: UserJoinedVoiceConfMessage => handleUserJoinedVoiceConfMessage(msg)
case msg: UserLeftVoiceConfMessage => handleUserLeftVoiceConfMessage(msg) case msg: UserLeftVoiceConfMessage => handleUserLeftVoiceConfMessage(msg)
case msg: UserLockedInVoiceConfMessage => handleUserLockedInVoiceConfMessage(msg) case msg: UserLockedInVoiceConfMessage => handleUserLockedInVoiceConfMessage(msg)
case msg: UserMutedInVoiceConfMessage => handleUserMutedInVoiceConfMessage(msg) case msg: UserMutedInVoiceConfMessage => handleUserMutedInVoiceConfMessage(msg)
case msg: UserTalkingInVoiceConfMessage => handleUserTalkingInVoiceConfMessage(msg) case msg: UserTalkingInVoiceConfMessage => handleUserTalkingInVoiceConfMessage(msg)
case msg: VoiceConfRecordingStartedMessage => handleVoiceConfRecordingStartedMessage(msg) case msg: VoiceConfRecordingStartedMessage => handleVoiceConfRecordingStartedMessage(msg)
case _ => // do nothing case _ => // do nothing
} }


private def findMeetingWithVoiceConfId(voiceConfId: String): Option[RunningMeeting] = { private def findMeetingWithVoiceConfId(voiceConfId: String): Option[RunningMeeting] = {
Expand Down Expand Up @@ -117,9 +117,9 @@ class BigBlueButtonActor(val system: ActorSystem,
meetings -= msg.meetingID meetings -= msg.meetingID
log.info("Kick everyone out on meetingId={}", msg.meetingID) log.info("Kick everyone out on meetingId={}", msg.meetingID)
if (m.mProps.isBreakout) { if (m.mProps.isBreakout) {
log.info("Informing parent meeting {} that a breakout room has been ended {}", m.mProps.externalMeetingID, m.mProps.meetingID) log.info("Informing parent meeting {} that a breakout room has been ended {}", m.mProps.parentMeetingID, m.mProps.meetingID)
eventBus.publish(BigBlueButtonEvent(m.mProps.externalMeetingID, eventBus.publish(BigBlueButtonEvent(m.mProps.parentMeetingID,
BreakoutRoomEnded(m.mProps.externalMeetingID, m.mProps.meetingID))) BreakoutRoomEnded(m.mProps.parentMeetingID, m.mProps.meetingID)))
} }
outGW.send(new EndAndKickAll(msg.meetingID, m.mProps.recorded)) outGW.send(new EndAndKickAll(msg.meetingID, m.mProps.recorded))
outGW.send(new DisconnectAllUsers(msg.meetingID)) outGW.send(new DisconnectAllUsers(msg.meetingID))
Expand Down Expand Up @@ -149,9 +149,9 @@ class BigBlueButtonActor(val system: ActorSystem,
eventBus.subscribe(m.actorRef, m.mProps.deskshareBridge) eventBus.subscribe(m.actorRef, m.mProps.deskshareBridge)


meetings += m.mProps.meetingID -> m meetings += m.mProps.meetingID -> m
outGW.send(new MeetingCreated(m.mProps.meetingID, m.mProps.externalMeetingID, m.mProps.recorded, m.mProps.meetingName, outGW.send(new MeetingCreated(m.mProps.meetingID, m.mProps.externalMeetingID, m.mProps.parentMeetingID,
m.mProps.voiceBridge, msg.mProps.duration, msg.mProps.moderatorPass, m.mProps.recorded, m.mProps.meetingName, m.mProps.voiceBridge, msg.mProps.duration, msg.mProps.moderatorPass,
msg.mProps.viewerPass, msg.mProps.createTime, msg.mProps.createDate)) msg.mProps.viewerPass, msg.mProps.createTime, msg.mProps.createDate, msg.mProps.isBreakout))


m.actorRef ! new InitializeMeeting(m.mProps.meetingID, m.mProps.recorded) m.actorRef ! new InitializeMeeting(m.mProps.meetingID, m.mProps.recorded)
} }
Expand Down
Expand Up @@ -57,6 +57,7 @@ class BigBlueButtonInGW(
val mProps = new MeetingProperties( val mProps = new MeetingProperties(
msg.payload.id, msg.payload.id,
msg.payload.externalId, msg.payload.externalId,
msg.payload.parentId,
msg.payload.name, msg.payload.name,
msg.payload.record, msg.payload.record,
msg.payload.voiceConfId, msg.payload.voiceConfId,
Expand All @@ -69,7 +70,8 @@ class BigBlueButtonInGW(
msg.payload.createTime, msg.payload.createTime,
msg.payload.createDate, msg.payload.createDate,
red5DeskShareIP, red5DeskShareApp, red5DeskShareIP, red5DeskShareApp,
msg.payload.isBreakout) msg.payload.isBreakout,
msg.payload.sequence)


eventBus.publish(BigBlueButtonEvent("meeting-manager", new CreateMeeting(msg.payload.id, mProps))) eventBus.publish(BigBlueButtonEvent("meeting-manager", new CreateMeeting(msg.payload.id, mProps)))
} }
Expand Down
Expand Up @@ -51,7 +51,7 @@ object JsonMessageDecoder {
def decode(json: String): Option[InMessage] = { def decode(json: String): Option[InMessage] = {
unmarshall(json) match { unmarshall(json) match {
case Success(validMsg) => Some(validMsg) case Success(validMsg) => Some(validMsg)
case Failure(ex) => None case Failure(ex) => None
} }
} }


Expand All @@ -75,4 +75,4 @@ object JsonMessageDecoder {
case _ => throw MessageProcessException("Cannot parse JSON message: [" + msg + "]") case _ => throw MessageProcessException("Cannot parse JSON message: [" + msg + "]")
} }
} }
} }
Expand Up @@ -38,35 +38,35 @@ class JsonMessageSenderActor(val service: MessageSender)
def receive = { def receive = {


// Breakout // Breakout
case msg: CreateBreakoutRoom => handleCreateBreakoutRoom(msg) case msg: CreateBreakoutRoom => handleCreateBreakoutRoom(msg)
case msg: EndBreakoutRoom => handleEndBreakoutRoom(msg) case msg: EndBreakoutRoom => handleEndBreakoutRoom(msg)
case msg: BreakoutRoomsListOutMessage => handleBreakoutRoomsList(msg) case msg: BreakoutRoomsListOutMessage => handleBreakoutRoomsList(msg)
case msg: BreakoutRoomJoinURLOutMessage => handleBreakoutRoomJoinURL(msg) case msg: BreakoutRoomJoinURLOutMessage => handleBreakoutRoomJoinURL(msg)
case msg: BreakoutRoomStartedOutMessage => handleBreakoutRoomStarted(msg) case msg: BreakoutRoomStartedOutMessage => handleBreakoutRoomStarted(msg)
case msg: BreakoutRoomEndedOutMessage => handleBreakoutRoomEnded(msg) case msg: BreakoutRoomEndedOutMessage => handleBreakoutRoomEnded(msg)
case msg: UpdateBreakoutUsersOutMessage => handleUpdateBreakoutUsers(msg) case msg: UpdateBreakoutUsersOutMessage => handleUpdateBreakoutUsers(msg)
case msg: MeetingTimeRemainingUpdate => handleMeetingTimeRemainingUpdate(msg) case msg: MeetingTimeRemainingUpdate => handleMeetingTimeRemainingUpdate(msg)


case _ => // do nothing case _ => // do nothing
} }


// Breakout // Breakout
private def handleBreakoutRoomStarted(msg: BreakoutRoomStartedOutMessage) { private def handleBreakoutRoomStarted(msg: BreakoutRoomStartedOutMessage) {
val payload = new BreakoutRoomPayload(msg.meetingId, msg.breakout.breakoutId, msg.breakout.name) val payload = new BreakoutRoomPayload(msg.parentMeetingId, msg.breakout.meetingId, msg.breakout.externalMeetingId, msg.breakout.name, msg.breakout.sequence)
val request = new BreakoutRoomStarted(payload) val request = new BreakoutRoomStarted(payload)
service.send(MessagingConstants.FROM_MEETING_CHANNEL, request.toJson) service.send(MessagingConstants.FROM_MEETING_CHANNEL, request.toJson)
} }


private def handleBreakoutRoomEnded(msg: BreakoutRoomEndedOutMessage) { private def handleBreakoutRoomEnded(msg: BreakoutRoomEndedOutMessage) {
val payload = new BreakoutRoomPayload(msg.meetingId, msg.breakoutId, "") val payload = new BreakoutRoomPayload(msg.parentMeetingId, msg.meetingId, "", "", 0)
val request = new BreakoutRoomClosed(payload) val request = new BreakoutRoomClosed(payload)
service.send(MessagingConstants.FROM_MEETING_CHANNEL, request.toJson) service.send(MessagingConstants.FROM_MEETING_CHANNEL, request.toJson)
} }


private def handleUpdateBreakoutUsers(msg: UpdateBreakoutUsersOutMessage) { private def handleUpdateBreakoutUsers(msg: UpdateBreakoutUsersOutMessage) {
val users = new java.util.ArrayList[BreakoutUserPayload]() val users = new java.util.ArrayList[BreakoutUserPayload]()
msg.users.foreach(x => users.add(new BreakoutUserPayload(x.id, x.name))) msg.users.foreach(x => users.add(new BreakoutUserPayload(x.id, x.name)))
val payload = new UpdateBreakoutUsersPayload(msg.meetingId, msg.breakoutId, users) val payload = new UpdateBreakoutUsersPayload(msg.parentMeetingId, msg.breakoutMeetingId, users)
val request = new UpdateBreakoutUsers(payload) val request = new UpdateBreakoutUsers(payload)
service.send(MessagingConstants.FROM_MEETING_CHANNEL, request.toJson()) service.send(MessagingConstants.FROM_MEETING_CHANNEL, request.toJson())
} }
Expand All @@ -85,29 +85,29 @@ class JsonMessageSenderActor(val service: MessageSender)


private def handleBreakoutRoomsList(msg: BreakoutRoomsListOutMessage) { private def handleBreakoutRoomsList(msg: BreakoutRoomsListOutMessage) {
val rooms = new java.util.ArrayList[BreakoutRoomPayload]() val rooms = new java.util.ArrayList[BreakoutRoomPayload]()
msg.rooms.foreach(r => rooms.add(new BreakoutRoomPayload(msg.meetingId, r.breakoutId, r.name))) msg.rooms.foreach(r => rooms.add(new BreakoutRoomPayload(msg.meetingId, r.meetingId, r.externalMeetingId, r.name, r.sequence)))
val payload = new BreakoutRoomsListPayload(msg.meetingId, rooms, msg.roomsReady) val payload = new BreakoutRoomsListPayload(msg.meetingId, rooms, msg.roomsReady)
val request = new BreakoutRoomsList(payload) val request = new BreakoutRoomsList(payload)
service.send(MessagingConstants.FROM_MEETING_CHANNEL, request.toJson()) service.send(MessagingConstants.FROM_MEETING_CHANNEL, request.toJson())
} }


private def handleCreateBreakoutRoom(msg: CreateBreakoutRoom) { private def handleCreateBreakoutRoom(msg: CreateBreakoutRoom) {
val payload = new CreateBreakoutRoomRequestPayload(msg.room.breakoutId, msg.room.parentId, msg.room.name, val payload = new CreateBreakoutRoomRequestPayload(msg.room.breakoutMeetingId, msg.room.parentId, msg.room.name,
msg.room.voiceConfId, msg.room.viewerPassword, msg.room.moderatorPassword, msg.room.sequence, msg.room.voiceConfId, msg.room.viewerPassword, msg.room.moderatorPassword,
msg.room.durationInMinutes, msg.room.sourcePresentationId, msg.room.sourcePresentationSlide, msg.room.record) msg.room.durationInMinutes, msg.room.sourcePresentationId, msg.room.sourcePresentationSlide, msg.room.record)
val request = new CreateBreakoutRoomRequest(payload) val request = new CreateBreakoutRoomRequest(payload)
service.send(MessagingConstants.FROM_MEETING_CHANNEL, request.toJson()) service.send(MessagingConstants.FROM_MEETING_CHANNEL, request.toJson())
} }


private def handleEndBreakoutRoom(msg: EndBreakoutRoom) { private def handleEndBreakoutRoom(msg: EndBreakoutRoom) {
val payload = new EndBreakoutRoomRequestPayload(msg.breakoutId) val payload = new EndBreakoutRoomRequestPayload(msg.breakoutMeetingId)
val request = new EndBreakoutRoomRequest(payload) val request = new EndBreakoutRoomRequest(payload)
service.send(MessagingConstants.FROM_MEETING_CHANNEL, request.toJson()) service.send(MessagingConstants.FROM_MEETING_CHANNEL, request.toJson())
} }


def handleBreakoutRoomJoinURL(msg: BreakoutRoomJoinURLOutMessage) { def handleBreakoutRoomJoinURL(msg: BreakoutRoomJoinURLOutMessage) {
val payload = new BreakoutRoomJoinURLPayload(msg.meetingId, val payload = new BreakoutRoomJoinURLPayload(msg.parentMeetingId,
msg.breakoutId, msg.userId, msg.joinURL) msg.breakoutMeetingId, msg.userId, msg.joinURL)
val request = new BreakoutRoomJoinURL(payload) val request = new BreakoutRoomJoinURL(payload)
service.send(MessagingConstants.FROM_MEETING_CHANNEL, request.toJson) service.send(MessagingConstants.FROM_MEETING_CHANNEL, request.toJson)
} }
Expand Down
Expand Up @@ -12,17 +12,17 @@ import org.bigbluebutton.core.apps.CaptionApp
import org.bigbluebutton.core.apps.CaptionModel import org.bigbluebutton.core.apps.CaptionModel


class LiveMeeting(val mProps: MeetingProperties, class LiveMeeting(val mProps: MeetingProperties,
val eventBus: IncomingEventBus, val eventBus: IncomingEventBus,
val outGW: OutMessageGateway, val outGW: OutMessageGateway,
val chatModel: ChatModel, val chatModel: ChatModel,
val layoutModel: LayoutModel, val layoutModel: LayoutModel,
val meetingModel: MeetingModel, val meetingModel: MeetingModel,
val usersModel: UsersModel, val usersModel: UsersModel,
val pollModel: PollModel, val pollModel: PollModel,
val wbModel: WhiteboardModel, val wbModel: WhiteboardModel,
val presModel: PresentationModel, val presModel: PresentationModel,
val breakoutModel: BreakoutRoomModel, val breakoutModel: BreakoutRoomModel,
val captionModel: CaptionModel)(implicit val context: ActorContext) val captionModel: CaptionModel)(implicit val context: ActorContext)
extends UsersApp with PresentationApp extends UsersApp with PresentationApp
with LayoutApp with ChatApp with WhiteboardApp with PollApp with LayoutApp with ChatApp with WhiteboardApp with PollApp
with BreakoutRoomApp with CaptionApp { with BreakoutRoomApp with CaptionApp {
Expand Down Expand Up @@ -56,7 +56,7 @@ class LiveMeeting(val mProps: MeetingProperties,
} }


def startCheckingIfWeNeedToEndVoiceConf() { def startCheckingIfWeNeedToEndVoiceConf() {
if (usersModel.numWebUsers == 0) { if (usersModel.numWebUsers == 0 && !mProps.isBreakout) {
meetingModel.lastWebUserLeft() meetingModel.lastWebUserLeft()
log.debug("MonitorNumberOfWebUsers started for meeting [" + mProps.meetingID + "]") log.debug("MonitorNumberOfWebUsers started for meeting [" + mProps.meetingID + "]")
} }
Expand Down
Expand Up @@ -37,8 +37,8 @@ class MeetingActorInternal(val mProps: MeetingProperties,
if (mProps.isBreakout) { if (mProps.isBreakout) {
// This is a breakout room. Inform our parent meeting that we have been successfully created. // This is a breakout room. Inform our parent meeting that we have been successfully created.
eventBus.publish(BigBlueButtonEvent( eventBus.publish(BigBlueButtonEvent(
mProps.externalMeetingID, mProps.parentMeetingID,
BreakoutRoomCreated(mProps.externalMeetingID, mProps.meetingID))) BreakoutRoomCreated(mProps.parentMeetingID, mProps.meetingID)))
} }


def receive = { def receive = {
Expand Down

0 comments on commit 1e8d7a5

Please sign in to comment.