diff --git a/akka-bbb-apps/src/main/scala/org/bigbluebutton/core/apps/users/GetPresenterGroupReqMsgHdlr.scala b/akka-bbb-apps/src/main/scala/org/bigbluebutton/core/apps/users/GetPresenterGroupReqMsgHdlr.scala new file mode 100644 index 0000000000000000000000000000000000000000..f5c177e6055c787d322c10c79c4e8cd5c40eaf35 --- /dev/null +++ b/akka-bbb-apps/src/main/scala/org/bigbluebutton/core/apps/users/GetPresenterGroupReqMsgHdlr.scala @@ -0,0 +1,37 @@ +package org.bigbluebutton.core.apps.users + +import org.bigbluebutton.common2.msgs._ +import org.bigbluebutton.core.models.Users2x +import org.bigbluebutton.core.running.{ LiveMeeting, OutMsgRouter } + +trait GetPresenterGroupReqMsgHdlr { + this: UsersApp => + + val liveMeeting: LiveMeeting + val outGW: OutMsgRouter + + def handleGetPresenterGroupReqMsg(msg: GetPresenterGroupReqMsg) { + + def broadcastGetPresenterGroupRespMsg(meetingId: String, userId: String, requesterId: String, presenterGroup: Vector[String]): Unit = { + val routing = Routing.addMsgToClientRouting(MessageTypes.DIRECT, liveMeeting.props.meetingProp.intId, requesterId) + val envelope = BbbCoreEnvelope(GetPresenterGroupRespMsg.NAME, routing) + val header = BbbClientMsgHeader(GetPresenterGroupRespMsg.NAME, meetingId, userId) + val body = GetPresenterGroupRespMsgBody(presenterGroup, requesterId) + val event = GetPresenterGroupRespMsg(header, body) + val msgEvent = BbbCommonEnvCoreMsg(envelope, event) + + outGW.send(msgEvent) + } + + val userId = msg.header.userId + val requesterId = msg.body.requesterId + + for { + requester <- Users2x.findWithIntId(liveMeeting.users2x, requesterId) + } yield { + val presGroup = Users2x.getPresenterGroupUsers(liveMeeting.users2x) + broadcastGetPresenterGroupRespMsg(liveMeeting.props.meetingProp.intId, userId, requesterId, presGroup) + } + } + +} diff --git a/akka-bbb-apps/src/main/scala/org/bigbluebutton/core/apps/users/UsersApp.scala b/akka-bbb-apps/src/main/scala/org/bigbluebutton/core/apps/users/UsersApp.scala index c85174bcd26c84be3dd6e4699ec9bdeb9f00b3cd..a0f414b3edc317a6111cf6d1ffbd8815691fc9b0 100755 --- a/akka-bbb-apps/src/main/scala/org/bigbluebutton/core/apps/users/UsersApp.scala +++ b/akka-bbb-apps/src/main/scala/org/bigbluebutton/core/apps/users/UsersApp.scala @@ -23,6 +23,7 @@ class UsersApp( with AssignPresenterReqMsgHdlr with AddUserToPresenterGroupCmdMsgHdlr with RemoveUserFromPresenterGroupCmdMsgHdlr + with GetPresenterGroupReqMsgHdlr with EjectUserFromMeetingCmdMsgHdlr with MuteUserCmdMsgHdlr with MuteUserCmdMsgHdlrPermCheck { diff --git a/akka-bbb-apps/src/main/scala/org/bigbluebutton/core/pubsub/senders/ReceivedJsonMsgHandlerActor.scala b/akka-bbb-apps/src/main/scala/org/bigbluebutton/core/pubsub/senders/ReceivedJsonMsgHandlerActor.scala index 0d79d2ab79dff29add0f0a6d80c6178178582228..c730c55e5b49a010dc9dcc186a60d557934d7063 100755 --- a/akka-bbb-apps/src/main/scala/org/bigbluebutton/core/pubsub/senders/ReceivedJsonMsgHandlerActor.scala +++ b/akka-bbb-apps/src/main/scala/org/bigbluebutton/core/pubsub/senders/ReceivedJsonMsgHandlerActor.scala @@ -86,6 +86,8 @@ class ReceivedJsonMsgHandlerActor( routeGenericMsg[AddUserToPresenterGroupCmdMsg](envelope, jsonNode) case RemoveUserFromPresenterGroupCmdMsg.NAME => routeGenericMsg[RemoveUserFromPresenterGroupCmdMsg](envelope, jsonNode) + case GetPresenterGroupReqMsg.NAME => + routeGenericMsg[GetPresenterGroupReqMsg](envelope, jsonNode) // Poll case StartCustomPollReqMsg.NAME => diff --git a/akka-bbb-apps/src/main/scala/org/bigbluebutton/core/running/MeetingActor.scala b/akka-bbb-apps/src/main/scala/org/bigbluebutton/core/running/MeetingActor.scala index 77886b21819187012e83666b387324e9a0fd6323..20a6b4dc105ca8652b57f3bd9e9f4f302c40e633 100755 --- a/akka-bbb-apps/src/main/scala/org/bigbluebutton/core/running/MeetingActor.scala +++ b/akka-bbb-apps/src/main/scala/org/bigbluebutton/core/running/MeetingActor.scala @@ -227,6 +227,7 @@ class MeetingActor( case m: AddUserToPresenterGroupCmdMsg => usersApp.handleAddUserToPresenterGroupCmdMsg(m) case m: RemoveUserFromPresenterGroupCmdMsg => usersApp.handleRemoveUserFromPresenterGroupCmdMsg(m) + case m: GetPresenterGroupReqMsg => usersApp.handleGetPresenterGroupReqMsg(m) // Whiteboard case m: SendCursorPositionPubMsg => wbApp.handle(m, liveMeeting, msgBus) diff --git a/bbb-common-message/src/main/scala/org/bigbluebutton/common2/msgs/UsersMgs.scala b/bbb-common-message/src/main/scala/org/bigbluebutton/common2/msgs/UsersMgs.scala index 412b1c0565ac81e4db0966190961f22f18e96a14..72575cdbdb638511827cc8da84c09b293e9e822b 100755 --- a/bbb-common-message/src/main/scala/org/bigbluebutton/common2/msgs/UsersMgs.scala +++ b/bbb-common-message/src/main/scala/org/bigbluebutton/common2/msgs/UsersMgs.scala @@ -310,3 +310,17 @@ case class RemoveUserFromPresenterGroupCmdMsgBody(userId: String, requesterId: S object UserRemovedFromPresenterGroupEvtMsg { val NAME = "UserRemovedFromPresenterGroupEvtMsg" } case class UserRemovedFromPresenterGroupEvtMsg(header: BbbClientMsgHeader, body: UserRemovedFromPresenterGroupEvtMsgBody) extends StandardMsg case class UserRemovedFromPresenterGroupEvtMsgBody(userId: String, requesterId: String) + +/** + * Sent from client to request the presenter group of a meeting. + */ +object GetPresenterGroupReqMsg { val NAME = "GetPresenterGroupReqMsg" } +case class GetPresenterGroupReqMsg(header: BbbClientMsgHeader, body: GetPresenterGroupReqMsgBody) extends StandardMsg +case class GetPresenterGroupReqMsgBody(requesterId: String) + +/** + * Sent to all clients about the members of the presenter group of a meeting + */ +object GetPresenterGroupRespMsg { val NAME = "GetPresenterGroupRespMsg" } +case class GetPresenterGroupRespMsg(header: BbbClientMsgHeader, body: GetPresenterGroupRespMsgBody) extends StandardMsg +case class GetPresenterGroupRespMsgBody(presenterGroup: Vector[String], requesterId: String) diff --git a/bigbluebutton-client/src/org/bigbluebutton/main/model/users/UserService.as b/bigbluebutton-client/src/org/bigbluebutton/main/model/users/UserService.as index e7579a47f48c8612a436fce2c739d8b2cb49416d..88337ff67cd35fefa3f9670cab3e420d409d7b65 100755 --- a/bigbluebutton-client/src/org/bigbluebutton/main/model/users/UserService.as +++ b/bigbluebutton-client/src/org/bigbluebutton/main/model/users/UserService.as @@ -51,6 +51,8 @@ package org.bigbluebutton.main.model.users import org.bigbluebutton.main.model.users.events.UsersConnectionEvent; import org.bigbluebutton.main.model.users.events.AddUserToPresenterGroupEvent; import org.bigbluebutton.main.model.users.events.RemoveUserFromPresenterGroupEvent; + import org.bigbluebutton.main.model.users.events.RequestPresenterGroupEvent; + import org.bigbluebutton.modules.users.services.MessageReceiver; import org.bigbluebutton.modules.users.services.MessageSender; @@ -272,6 +274,10 @@ package org.bigbluebutton.main.model.users if (this.isModerator()) sender.removeUserFromPresenterGroup(e.userId); } + public function handleRequestPresenterGroupEvent(e: RequestPresenterGroupEvent): void { + sender.handleRequestPresenterGroupEvent(); + } + public function changeRole(e:ChangeRoleEvent):void { if (this.isModerator()) sender.changeRole(e.userid, e.role); } diff --git a/bigbluebutton-client/src/org/bigbluebutton/main/model/users/events/RequestPresenterGroupEvent.as b/bigbluebutton-client/src/org/bigbluebutton/main/model/users/events/RequestPresenterGroupEvent.as new file mode 100644 index 0000000000000000000000000000000000000000..efd134895c69216c91c9c0f9897d8305eb19bea2 --- /dev/null +++ b/bigbluebutton-client/src/org/bigbluebutton/main/model/users/events/RequestPresenterGroupEvent.as @@ -0,0 +1,32 @@ +/** + * BigBlueButton open source conferencing system - http://www.bigbluebutton.org/ + * + * Copyright (c) 2017 BigBlueButton Inc. and by respective authors (see below). + * + * This program is free software; you can redistribute it and/or modify it under the + * terms of the GNU Lesser General Public License as published by the Free Software + * Foundation; either version 3.0 of the License, or (at your option) any later + * version. + * + * BigBlueButton is distributed in the hope that it will be useful, but WITHOUT ANY + * WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A + * PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public License along + * with BigBlueButton; if not, see <http://www.gnu.org/licenses/>. + * + */ + +package org.bigbluebutton.main.model.users.events +{ + + import flash.events.Event; + + public class RequestPresenterGroupEvent extends Event { + public static const REQUEST_PRESENTER_GROUP:String = "REQUEST_PRESENTER_GROUP"; + + public function RequestPresenterGroupEvent(type:String) { + super(type, true, false); + } + } +} diff --git a/bigbluebutton-client/src/org/bigbluebutton/modules/present/managers/PresentManager.as b/bigbluebutton-client/src/org/bigbluebutton/modules/present/managers/PresentManager.as index b527c1acfc241a23c5cd92a7ab172fb0b04aea58..125bd80c88d248b083e47289c735aa35b8dcc78c 100755 --- a/bigbluebutton-client/src/org/bigbluebutton/modules/present/managers/PresentManager.as +++ b/bigbluebutton-client/src/org/bigbluebutton/modules/present/managers/PresentManager.as @@ -32,6 +32,7 @@ package org.bigbluebutton.modules.present.managers import org.bigbluebutton.common.events.CloseWindowEvent; import org.bigbluebutton.core.Options; import org.bigbluebutton.core.PopUpUtil; + import org.bigbluebutton.main.model.users.events.RequestPresenterGroupEvent; import org.bigbluebutton.modules.present.events.ExportEvent; import org.bigbluebutton.modules.present.events.PresentModuleEvent; import org.bigbluebutton.modules.present.events.UploadEvent; @@ -62,8 +63,11 @@ package org.bigbluebutton.modules.present.managers return; } - var event:RequestAllPodsEvent = new RequestAllPodsEvent(RequestAllPodsEvent.REQUEST_ALL_PODS); - globalDispatcher.dispatchEvent(event); + var requestAllPodsEvent:RequestAllPodsEvent = new RequestAllPodsEvent(RequestAllPodsEvent.REQUEST_ALL_PODS); + globalDispatcher.dispatchEvent(requestAllPodsEvent); + + var requestPresenterGroupEvent:RequestPresenterGroupEvent = new RequestPresenterGroupEvent(RequestPresenterGroupEvent.REQUEST_PRESENTER_GROUP); + globalDispatcher.dispatchEvent(requestPresenterGroupEvent); } public function handleAddPresentationPod(e: NewPresentationPodCreated): void { diff --git a/bigbluebutton-client/src/org/bigbluebutton/modules/present/maps/PresentEventMap.mxml b/bigbluebutton-client/src/org/bigbluebutton/modules/present/maps/PresentEventMap.mxml index 253e53ca5029534eff633cff8bc5e29ea433fbb1..eb495481889ab2c0ee4c5bdc3f0a6d13d85cb5b3 100755 --- a/bigbluebutton-client/src/org/bigbluebutton/modules/present/maps/PresentEventMap.mxml +++ b/bigbluebutton-client/src/org/bigbluebutton/modules/present/maps/PresentEventMap.mxml @@ -49,7 +49,6 @@ with BigBlueButton; if not, see <http://www.gnu.org/licenses/>. import org.bigbluebutton.modules.present.events.GetAllPodsRespEvent; import org.bigbluebutton.modules.present.events.RequestAllPodsEvent; import org.bigbluebutton.modules.present.events.SetPresenterInPodReqEvent; -// import org.bigbluebutton.modules.present.events.SetPresenterInPodRespEvent; import org.bigbluebutton.modules.present.managers.PresentManager; import org.bigbluebutton.modules.present.model.PresentationPodManager; import org.bigbluebutton.modules.present.services.PageLoaderService; @@ -193,8 +192,5 @@ with BigBlueButton; if not, see <http://www.gnu.org/licenses/>. <MethodInvoker generator="{PresentProxy}" method="handleSetPresenterInPodReqEvent" arguments="{event}" /> </EventHandlers> - <!--<EventHandlers type="{SetPresenterInPodRespEvent.SET_PRESENTER_IN_POD_RESP}" >--> - <!--<MethodInvoker generator="{PresentManager}" method="handleSetPresenterInPodRespEvent" arguments="{event}" />--> - <!--</EventHandlers>--> </fx:Declarations> </EventMap> diff --git a/bigbluebutton-client/src/org/bigbluebutton/modules/present/ui/views/FileUploadWindow.mxml b/bigbluebutton-client/src/org/bigbluebutton/modules/present/ui/views/FileUploadWindow.mxml index 2b3b68c116303687c03b9c7eef850c84e147e69e..18bcbdfaf91d2a0ba387cfa599410ecc253d2968 100755 --- a/bigbluebutton-client/src/org/bigbluebutton/modules/present/ui/views/FileUploadWindow.mxml +++ b/bigbluebutton-client/src/org/bigbluebutton/modules/present/ui/views/FileUploadWindow.mxml @@ -119,7 +119,7 @@ with BigBlueButton; if not, see <http://www.gnu.org/licenses/>. public function setPodId(_podId: String): void { podId = _podId; - presentationNamesAC = PresentationPodManager.getInstance().getPod(podId).getPresentations(); // GOOD + presentationNamesAC = PresentationPodManager.getInstance().getPod(podId).getPresentations(); if (presentationNamesAC.length <= 0) { selectFile(); } diff --git a/bigbluebutton-client/src/org/bigbluebutton/modules/present/ui/views/SlideView.mxml b/bigbluebutton-client/src/org/bigbluebutton/modules/present/ui/views/SlideView.mxml index 43b1941728c64557e7aaac85f6a0116a986356c3..3924f136ffd91aefbd2857851060f96a80e805fe 100755 --- a/bigbluebutton-client/src/org/bigbluebutton/modules/present/ui/views/SlideView.mxml +++ b/bigbluebutton-client/src/org/bigbluebutton/modules/present/ui/views/SlideView.mxml @@ -286,6 +286,7 @@ with BigBlueButton; if not, see <http://www.gnu.org/licenses/>. private function notifyOthersOfZoomEvent():void { var presentEvent:PresenterCommands = new PresenterCommands(PresenterCommands.ZOOM); + presentEvent.podId = this.podId; presentEvent.xOffset = slideModel.viewedRegionX; presentEvent.yOffset = slideModel.viewedRegionY; presentEvent.slideToCanvasWidthRatio = slideModel.viewedRegionW; diff --git a/bigbluebutton-client/src/org/bigbluebutton/modules/users/maps/UsersMainEventMap.mxml b/bigbluebutton-client/src/org/bigbluebutton/modules/users/maps/UsersMainEventMap.mxml index 3c2b4856a93aad17ed09f56c837fb8f0666effee..a1c10d1d624e6eeb9ce0dcc1b6332064c988759b 100755 --- a/bigbluebutton-client/src/org/bigbluebutton/modules/users/maps/UsersMainEventMap.mxml +++ b/bigbluebutton-client/src/org/bigbluebutton/modules/users/maps/UsersMainEventMap.mxml @@ -45,6 +45,7 @@ with BigBlueButton; if not, see <http://www.gnu.org/licenses/>. import org.bigbluebutton.main.model.users.events.RoleChangeEvent; import org.bigbluebutton.main.model.users.events.AddUserToPresenterGroupEvent; import org.bigbluebutton.main.model.users.events.RemoveUserFromPresenterGroupEvent; + import org.bigbluebutton.main.model.users.events.RequestPresenterGroupEvent; <!--TODO: Move guest events to user events? --> @@ -115,6 +116,10 @@ with BigBlueButton; if not, see <http://www.gnu.org/licenses/>. <MethodInvoker generator="{UserService}" method="removeUserFromPresenterGroup" arguments="{event}" /> </EventHandlers> + <EventHandlers type="{RequestPresenterGroupEvent.REQUEST_PRESENTER_GROUP}" > + <MethodInvoker generator="{UserService}" method="handleRequestPresenterGroupEvent" arguments="{event}" /> + </EventHandlers> + <EventHandlers type="{BBBEvent.CHANGE_RECORDING_STATUS}"> <MethodInvoker generator="{UserService}" method="changeRecordingStatus" arguments="{event}" /> </EventHandlers> diff --git a/bigbluebutton-client/src/org/bigbluebutton/modules/users/services/MessageReceiver.as b/bigbluebutton-client/src/org/bigbluebutton/modules/users/services/MessageReceiver.as index a3c81e1fbc878ff33b194894f6467823c293d687..cbb2137d65a1bade171ac9a6579d778782d41d5f 100755 --- a/bigbluebutton-client/src/org/bigbluebutton/modules/users/services/MessageReceiver.as +++ b/bigbluebutton-client/src/org/bigbluebutton/modules/users/services/MessageReceiver.as @@ -209,6 +209,9 @@ package org.bigbluebutton.modules.users.services case "UserRemovedFromPresenterGroupEvtMsg": handleUserRemovedFromPresenterGroupEvtMsg(message); break; + case "GetPresenterGroupRespMsg": + handleGetPresenterGroupRespMsg(message); + break; } } @@ -879,6 +882,14 @@ package org.bigbluebutton.modules.users.services var userId: String = msg.body.userId; dispatcher.dispatchEvent(new UserRemovedFromPresenterGroupEvent(userId)); } + + private function handleGetPresenterGroupRespMsg(msg: Object): void { + var presenterGroup: Array = msg.body.presenterGroup as Array; + for (var i: int = 0; i < presenterGroup.length; i++) { + var member: String = presenterGroup[i] as String; + dispatcher.dispatchEvent(new UserAddedToPresenterGroupEvent(member)); + } + } public function handleGuestPolicyChanged(msg:Object):void { var header: Object = msg.header as Object; diff --git a/bigbluebutton-client/src/org/bigbluebutton/modules/users/services/MessageSender.as b/bigbluebutton-client/src/org/bigbluebutton/modules/users/services/MessageSender.as index c69023f95279f934aebba82ca945d97528e01b9b..64abd6f561b599e923ec739945e569f24d322441 100755 --- a/bigbluebutton-client/src/org/bigbluebutton/modules/users/services/MessageSender.as +++ b/bigbluebutton-client/src/org/bigbluebutton/modules/users/services/MessageSender.as @@ -456,6 +456,20 @@ package org.bigbluebutton.modules.users.services }, JSON.stringify(message)); } + public function handleRequestPresenterGroupEvent():void { + var message:Object = { + header: {name: "GetPresenterGroupReqMsg", meetingId: UsersUtil.getInternalMeetingID(), userId: UsersUtil.getMyUserID()}, + body: {requesterId: UsersUtil.getMyUserID()} + }; + + var _nc:ConnectionManager = BBB.initConnectionManager(); + _nc.sendMessage2x( + function(result:String):void { }, + function(status:String):void { LOGGER.error(status); }, + JSON.stringify(message) + ); + } + public function getRoomMuteState():void{ var message:Object = { header: {name: "IsMeetingMutedReqMsg", meetingId: UsersUtil.getInternalMeetingID(), diff --git a/bigbluebutton-web/grails-app/conf/bigbluebutton.properties b/bigbluebutton-web/grails-app/conf/bigbluebutton.properties index 5eb3d3a2c97782b9cf041f7d268ddcd0f232a968..0ca1ad07a2d4fc0430bd0cc508234a2e364787af 100755 --- a/bigbluebutton-web/grails-app/conf/bigbluebutton.properties +++ b/bigbluebutton-web/grails-app/conf/bigbluebutton.properties @@ -156,7 +156,7 @@ webcamsOnlyForModerator=false #---------------------------------------------------- # This URL is where the BBB client is accessible. When a user sucessfully # enters a name and password, she is redirected here to load the client. -bigbluebutton.web.serverURL=https://ritz-ss.blindside-dev.com +bigbluebutton.web.serverURL=http://192.168.246.131 #----------------------------------------------------