diff --git a/akka-bbb-apps/src/main/scala/org/bigbluebutton/Boot.scala b/akka-bbb-apps/src/main/scala/org/bigbluebutton/Boot.scala index 081ded6075820ff8a040e978ca10c7ed3ff2ab32..e851662d1977bd47eff5714a32e27d738d00b367 100755 --- a/akka-bbb-apps/src/main/scala/org/bigbluebutton/Boot.scala +++ b/akka-bbb-apps/src/main/scala/org/bigbluebutton/Boot.scala @@ -18,10 +18,6 @@ import org.bigbluebutton.core.pubsub.senders._ import org.bigbluebutton.core.service.recorder.RedisDispatcher import org.bigbluebutton.core.service.recorder.RecorderApplication import org.bigbluebutton.core.recorders.VoiceEventRecorder -import org.bigbluebutton.core.recorders.ChatEventRedisRecorder -import org.bigbluebutton.core.recorders.PresentationEventRedisRecorder -import org.bigbluebutton.core.recorders.UsersEventRedisRecorder -import org.bigbluebutton.core.recorders.WhiteboardEventRedisRecorder object Boot extends App with SystemConfiguration { @@ -35,33 +31,7 @@ object Boot extends App with SystemConfiguration { recorderApp.start() val voiceEventRecorder = new VoiceEventRecorder(recorderApp) - - val chatEventRecorder = new ChatEventRedisRecorder(recorderApp) - val presentationEventRecorder = new PresentationEventRedisRecorder(recorderApp) - val usersEventRecorder = new UsersEventRedisRecorder(recorderApp) - val whiteboardEventRecorder = new WhiteboardEventRedisRecorder(recorderApp) - - val chatSender = new ChatEventRedisPublisher(msgSender) - val meetingSender = new MeetingEventRedisPublisher(msgSender) - val presSender = new PresentationEventRedisPublisher(msgSender) - val userSender = new UsersEventRedisPublisher(msgSender) - val whiteboardSender = new WhiteboardEventRedisPublisher(msgSender) - val pollingSender = new PollingEventRedisPublisher(msgSender) - - val outMessageListeners = new java.util.ArrayList[OutMessageListener2]() - outMessageListeners.add(chatSender) - outMessageListeners.add(meetingSender) - outMessageListeners.add(presSender) - outMessageListeners.add(userSender) - outMessageListeners.add(whiteboardSender) - outMessageListeners.add(chatEventRecorder) - outMessageListeners.add(presentationEventRecorder) - outMessageListeners.add(usersEventRecorder) - outMessageListeners.add(whiteboardEventRecorder) - outMessageListeners.add(pollingSender) - - val outGW = new MessageOutGateway(outMessageListeners) - val bbbInGW = new BigBlueButtonInGW(system, outGW, voiceEventRecorder) + val bbbInGW = new BigBlueButtonInGW(system, recorderApp, msgSender, voiceEventRecorder) val redisMsgReceiver = new RedisMessageReceiver(bbbInGW) val redisSubscriberActor = system.actorOf(AppsRedisSubscriberActor.props(redisMsgReceiver), "redis-subscriber") diff --git a/akka-bbb-apps/src/main/scala/org/bigbluebutton/core/BigBlueButtonActor.scala b/akka-bbb-apps/src/main/scala/org/bigbluebutton/core/BigBlueButtonActor.scala index b986f390e402ff2327bb0b8010d62cfcc5ad6a30..b83bd75789fe0400a9d57ec3308417f8d8c0b97d 100755 --- a/akka-bbb-apps/src/main/scala/org/bigbluebutton/core/BigBlueButtonActor.scala +++ b/akka-bbb-apps/src/main/scala/org/bigbluebutton/core/BigBlueButtonActor.scala @@ -19,17 +19,19 @@ import org.bigbluebutton.core.recorders.events.VoiceUserLockedRecordEvent import org.bigbluebutton.core.recorders.events.VoiceUserMutedRecordEvent import org.bigbluebutton.core.recorders.events.VoiceStartRecordingRecordEvent import org.bigbluebutton.core.recorders.events.VoiceUserTalkingRecordEvent +import org.bigbluebutton.core.service.recorder.RecorderApplication object BigBlueButtonActor extends SystemConfiguration { - def props(system: ActorSystem, outGW: MessageOutGateway, voiceEventRecorder: VoiceEventRecorder): Props = - Props(classOf[BigBlueButtonActor], system, outGW, voiceEventRecorder) + def props(system: ActorSystem, recorderApp: RecorderApplication, messageSender: MessageSender, voiceEventRecorder: VoiceEventRecorder): Props = + Props(classOf[BigBlueButtonActor], system, recorderApp, messageSender, voiceEventRecorder) } -class BigBlueButtonActor(val system: ActorSystem, outGW: MessageOutGateway, voiceEventRecorder: VoiceEventRecorder) extends Actor with ActorLogging { +class BigBlueButtonActor(val system: ActorSystem, recorderApp: RecorderApplication, messageSender: MessageSender, voiceEventRecorder: VoiceEventRecorder) extends Actor with ActorLogging { implicit def executionContext = system.dispatcher implicit val timeout = Timeout(5 seconds) private var meetings = new collection.immutable.HashMap[String, RunningMeeting] + private val outGW = new OutMessageGateway("bbbActorOutGW", recorderApp, messageSender) def receive = { case msg: CreateMeeting => handleCreateMeeting(msg) @@ -187,7 +189,8 @@ class BigBlueButtonActor(val system: ActorSystem, outGW: MessageOutGateway, voic meetings.get(msg.meetingID) match { case None => { log.info("New meeting create request [" + msg.mProps.meetingName + "]") - var m = RunningMeeting(msg.mProps, outGW) + val moutGW = new OutMessageGateway("meetingOutGW-" + msg.meetingID, recorderApp, messageSender) + var m = RunningMeeting(msg.mProps, moutGW) meetings += m.mProps.meetingID -> m outGW.send(new MeetingCreated(m.mProps.meetingID, m.mProps.externalMeetingID, m.mProps.recorded, m.mProps.meetingName, diff --git a/akka-bbb-apps/src/main/scala/org/bigbluebutton/core/BigBlueButtonInGW.scala b/akka-bbb-apps/src/main/scala/org/bigbluebutton/core/BigBlueButtonInGW.scala index 149a8136e203f1697574d16c45fe4be78bb9d71d..aace43d1e7303c6c476c06c492947a4fd66134aa 100755 --- a/akka-bbb-apps/src/main/scala/org/bigbluebutton/core/BigBlueButtonInGW.scala +++ b/akka-bbb-apps/src/main/scala/org/bigbluebutton/core/BigBlueButtonInGW.scala @@ -14,10 +14,11 @@ import akka.util.Timeout import scala.concurrent.duration._ import scala.util.Success import scala.util.Failure +import org.bigbluebutton.core.service.recorder.RecorderApplication -class BigBlueButtonInGW(val system: ActorSystem, outGW: MessageOutGateway, voiceEventRecorder: VoiceEventRecorder) extends IBigBlueButtonInGW { +class BigBlueButtonInGW(val system: ActorSystem, recorderApp: RecorderApplication, messageSender: MessageSender, voiceEventRecorder: VoiceEventRecorder) extends IBigBlueButtonInGW { val log = system.log - val bbbActor = system.actorOf(BigBlueButtonActor.props(system, outGW, voiceEventRecorder), "bigbluebutton-actor") + val bbbActor = system.actorOf(BigBlueButtonActor.props(system, recorderApp, messageSender, voiceEventRecorder), "bigbluebutton-actor") // Meeting def createMeeting2(meetingID: String, externalMeetingID: String, meetingName: String, record: Boolean, diff --git a/akka-bbb-apps/src/main/scala/org/bigbluebutton/core/MeetingActor.scala b/akka-bbb-apps/src/main/scala/org/bigbluebutton/core/MeetingActor.scala index 936cc8d7fec75ba002db863505b80103001107ed..537115e72ab5710d409cee31d1fe79f8893f98ec 100755 --- a/akka-bbb-apps/src/main/scala/org/bigbluebutton/core/MeetingActor.scala +++ b/akka-bbb-apps/src/main/scala/org/bigbluebutton/core/MeetingActor.scala @@ -13,11 +13,11 @@ import org.bigbluebutton.core.apps.{ ChatModel, LayoutModel, UsersModel, PollMod import org.bigbluebutton.core.apps.PresentationModel object MeetingActor { - def props(mProps: MeetingProperties, outGW: MessageOutGateway): Props = + def props(mProps: MeetingProperties, outGW: OutMessageGateway): Props = Props(classOf[MeetingActor], mProps: MeetingProperties, outGW) } -class MeetingActor(val mProps: MeetingProperties, val outGW: MessageOutGateway) +class MeetingActor(val mProps: MeetingProperties, val outGW: OutMessageGateway) extends Actor with UsersApp with PresentationApp with LayoutApp with ChatApp with WhiteboardApp with PollApp with ActorLogging { diff --git a/akka-bbb-apps/src/main/scala/org/bigbluebutton/core/MessageSenderActor.scala b/akka-bbb-apps/src/main/scala/org/bigbluebutton/core/MessageSenderActor.scala new file mode 100755 index 0000000000000000000000000000000000000000..1a8d56dad578990e3af2c2d70a27184703907dd7 --- /dev/null +++ b/akka-bbb-apps/src/main/scala/org/bigbluebutton/core/MessageSenderActor.scala @@ -0,0 +1,643 @@ +package org.bigbluebutton.core + +import akka.actor.Actor +import akka.actor.ActorRef +import akka.actor.ActorLogging +import akka.actor.Props +import org.bigbluebutton.core.api._ +import org.bigbluebutton.common.messages.MessagingConstants +import org.bigbluebutton.core.pubsub.senders.ChatMessageToJsonConverter +import org.bigbluebutton.common.messages.StartRecordingVoiceConfRequestMessage +import org.bigbluebutton.common.messages.StopRecordingVoiceConfRequestMessage +import org.bigbluebutton.core.pubsub.senders.MeetingMessageToJsonConverter +import org.bigbluebutton.core.pubsub.senders.PesentationMessageToJsonConverter +import org.bigbluebutton.common.messages.GetPresentationInfoReplyMessage +import org.bigbluebutton.common.messages.PresentationRemovedMessage +import org.bigbluebutton.core.apps.Page +import collection.JavaConverters._ +import scala.collection.JavaConversions._ +import org.bigbluebutton.core.apps.SimplePollResultOutVO +import org.bigbluebutton.core.apps.SimplePollOutVO +import org.bigbluebutton.core.pubsub.senders.UsersMessageToJsonConverter +import org.bigbluebutton.common.messages.GetUsersFromVoiceConfRequestMessage +import org.bigbluebutton.common.messages.MuteUserInVoiceConfRequestMessage +import org.bigbluebutton.common.messages.EjectUserFromVoiceConfRequestMessage +import org.bigbluebutton.common.messages.GetCurrentLayoutReplyMessage +import org.bigbluebutton.common.messages.BroadcastLayoutMessage +import org.bigbluebutton.common.messages.LockLayoutMessage +import org.bigbluebutton.core.pubsub.senders.WhiteboardMessageToJsonConverter + +object MessageSenderActor { + def props(meetingId: String, msgSender: MessageSender): Props = + Props(classOf[MessageSenderActor], meetingId, msgSender) +} + +class MessageSenderActor(val meetingId: String, val service: MessageSender) + extends Actor with ActorLogging { + + def receive = { + case msg: GetChatHistoryReply => handleGetChatHistoryReply(msg) + case msg: SendPublicMessageEvent => handleSendPublicMessageEvent(msg) + case msg: SendPrivateMessageEvent => handleSendPrivateMessageEvent(msg) + case msg: MeetingCreated => handleMeetingCreated(msg) + case msg: VoiceRecordingStarted => handleVoiceRecordingStarted(msg) + case msg: VoiceRecordingStopped => handleVoiceRecordingStopped(msg) + case msg: RecordingStatusChanged => handleRecordingStatusChanged(msg) + case msg: GetRecordingStatusReply => handleGetRecordingStatusReply(msg) + case msg: MeetingEnded => handleMeetingEnded(msg) + case msg: MeetingHasEnded => handleMeetingHasEnded(msg) + case msg: MeetingDestroyed => handleMeetingDestroyed(msg) + case msg: KeepAliveMessageReply => handleKeepAliveMessageReply(msg) + case msg: StartRecording => handleStartRecording(msg) + case msg: StopRecording => handleStopRecording(msg) + case msg: GetAllMeetingsReply => handleGetAllMeetingsReply(msg) + case msg: StartRecordingVoiceConf => handleStartRecordingVoiceConf(msg) + case msg: StopRecordingVoiceConf => handleStopRecordingVoiceConf(msg) + case msg: ClearPresentationOutMsg => handleClearPresentationOutMsg(msg) + case msg: RemovePresentationOutMsg => handleRemovePresentationOutMsg(msg) + case msg: GetPresentationInfoOutMsg => handleGetPresentationInfoOutMsg(msg) + case msg: SendCursorUpdateOutMsg => handleSendCursorUpdateOutMsg(msg) + case msg: ResizeAndMoveSlideOutMsg => handleResizeAndMoveSlideOutMsg(msg) + case msg: GotoSlideOutMsg => handleGotoSlideOutMsg(msg) + case msg: SharePresentationOutMsg => handleSharePresentationOutMsg(msg) + case msg: GetSlideInfoOutMsg => handleGetSlideInfoOutMsg(msg) + case msg: PresentationConversionProgress => handlePresentationConversionProgress(msg) + case msg: PresentationConversionError => handlePresentationConversionError(msg) + case msg: PresentationPageGenerated => handlePresentationPageGenerated(msg) + case msg: PresentationConversionDone => handlePresentationConversionDone(msg) + case msg: PollStartedMessage => handlePollStartedMessage(msg) + case msg: PollStoppedMessage => handlePollStoppedMessage(msg) + case msg: PollShowResultMessage => handlePollShowResultMessage(msg) + case msg: PollHideResultMessage => handlePollHideResultMessage(msg) + case msg: UserRespondedToPollMessage => handleUserRespondedToPollMessage(msg) + case msg: MeetingMuted => handleMeetingMuted(msg) + case msg: MeetingState => handleMeetingState(msg) + case msg: DisconnectAllUsers => handleDisconnectAllUsers(msg) + case msg: DisconnectUser => handleDisconnectUser(msg) + case msg: PermissionsSettingInitialized => handlePermissionsSettingInitialized(msg) + case msg: NewPermissionsSetting => handleNewPermissionsSetting(msg) + case msg: UserLocked => handleUserLocked(msg) + case msg: GetPermissionsSettingReply => handleGetPermissionsSettingReply(msg) + case msg: UserRegistered => handleUserRegistered(msg) + case msg: UserLeft => handleUserLeft(msg) + case msg: PresenterAssigned => handlePresenterAssigned(msg) + case msg: EndAndKickAll => handleEndAndKickAll(msg) + case msg: GetUsersReply => handleGetUsersReply(msg) + case msg: ValidateAuthTokenReply => handleValidateAuthTokenReply(msg) + case msg: ValidateAuthTokenTimedOut => handleValidateAuthTokenTimedOut(msg) + case msg: UserJoined => handleUserJoined(msg) + case msg: UserRaisedHand => handleUserRaisedHand(msg) + case msg: UserLoweredHand => handleUserLoweredHand(msg) + case msg: UserSharedWebcam => handleUserSharedWebcam(msg) + case msg: UserUnsharedWebcam => handleUserUnsharedWebcam(msg) + case msg: UserStatusChange => handleUserStatusChange(msg) + case msg: UserVoiceMuted => handleUserVoiceMuted(msg) + case msg: UserVoiceTalking => handleUserVoiceTalking(msg) + case msg: MuteVoiceUser => handleMuteVoiceUser(msg) + case msg: EjectVoiceUser => handleEjectVoiceUser(msg) + case msg: GetUsersInVoiceConference => handleGetUsersFromVoiceConference(msg) + case msg: UserJoinedVoice => handleUserJoinedVoice(msg) + case msg: UserLeftVoice => handleUserLeftVoice(msg) + case msg: IsMeetingMutedReply => handleIsMeetingMutedReply(msg) + case msg: UserListeningOnly => handleUserListeningOnly(msg) + case msg: GetCurrentLayoutReply => handleGetCurrentLayoutReply(msg) + case msg: BroadcastLayoutEvent => handleBroadcastLayoutEvent(msg) + case msg: LockLayoutEvent => handleLockLayoutEvent(msg) + case msg: GetWhiteboardShapesReply => handleGetWhiteboardShapesReply(msg) + case msg: SendWhiteboardAnnotationEvent => handleSendWhiteboardAnnotationEvent(msg) + case msg: ClearWhiteboardEvent => handleClearWhiteboardEvent(msg) + case msg: UndoWhiteboardEvent => handleUndoWhiteboardEvent(msg) + case msg: WhiteboardEnabledEvent => handleWhiteboardEnabledEvent(msg) + case msg: IsWhiteboardEnabledReply => handleIsWhiteboardEnabledReply(msg) + case _ => // do nothing + } + + private def handleGetChatHistoryReply(msg: GetChatHistoryReply) { + val json = ChatMessageToJsonConverter.getChatHistoryReplyToJson(msg) + service.send(MessagingConstants.FROM_CHAT_CHANNEL, json) + } + + private def handleSendPublicMessageEvent(msg: SendPublicMessageEvent) { + val json = ChatMessageToJsonConverter.sendPublicMessageEventToJson(msg) + service.send(MessagingConstants.FROM_CHAT_CHANNEL, json) + } + + private def handleSendPrivateMessageEvent(msg: SendPrivateMessageEvent) { + val json = ChatMessageToJsonConverter.sendPrivateMessageEventToJson(msg) + service.send(MessagingConstants.FROM_CHAT_CHANNEL, json) + } + + private def handleStartRecordingVoiceConf(msg: StartRecordingVoiceConf) { + val m = new StartRecordingVoiceConfRequestMessage(msg.meetingID, msg.voiceConfId) + service.send(MessagingConstants.TO_VOICE_CONF_SYSTEM_CHAN, m.toJson()) + } + + private def handleStopRecordingVoiceConf(msg: StopRecordingVoiceConf) { + val m = new StopRecordingVoiceConfRequestMessage(msg.meetingID, msg.voiceConfId, msg.recordedStream) + service.send(MessagingConstants.TO_VOICE_CONF_SYSTEM_CHAN, m.toJson()) + } + + private def handleMeetingDestroyed(msg: MeetingDestroyed) { + val json = MeetingMessageToJsonConverter.meetingDestroyedToJson(msg) + service.send(MessagingConstants.FROM_MEETING_CHANNEL, json) + } + + private def handleKeepAliveMessageReply(msg: KeepAliveMessageReply) { + val json = MeetingMessageToJsonConverter.keepAliveMessageReplyToJson(msg) + service.send(MessagingConstants.FROM_SYSTEM_CHANNEL, json) + } + + private def handleMeetingCreated(msg: MeetingCreated) { + val json = MeetingMessageToJsonConverter.meetingCreatedToJson(msg) + service.send(MessagingConstants.FROM_MEETING_CHANNEL, json) + } + + private def handleMeetingEnded(msg: MeetingEnded) { + val json = MeetingMessageToJsonConverter.meetingEndedToJson(msg) + service.send(MessagingConstants.FROM_MEETING_CHANNEL, json) + + val json2 = UsersMessageToJsonConverter.meetingEnded(msg) + service.send(MessagingConstants.FROM_MEETING_CHANNEL, json2) + } + + private def handleStartRecording(msg: StartRecording) { + val json = MeetingMessageToJsonConverter.startRecordingToJson(msg) + service.send(MessagingConstants.FROM_MEETING_CHANNEL, json) + } + + private def handleStopRecording(msg: StopRecording) { + val json = MeetingMessageToJsonConverter.stopRecordingToJson(msg) + service.send(MessagingConstants.FROM_MEETING_CHANNEL, json) + } + + private def handleVoiceRecordingStarted(msg: VoiceRecordingStarted) { + val json = MeetingMessageToJsonConverter.voiceRecordingStartedToJson(msg) + service.send(MessagingConstants.FROM_MEETING_CHANNEL, json) + } + + private def handleVoiceRecordingStopped(msg: VoiceRecordingStopped) { + val json = MeetingMessageToJsonConverter.voiceRecordingStoppedToJson(msg) + service.send(MessagingConstants.FROM_MEETING_CHANNEL, json) + } + + private def handleRecordingStatusChanged(msg: RecordingStatusChanged) { + val json = MeetingMessageToJsonConverter.recordingStatusChangedToJson(msg) + service.send(MessagingConstants.FROM_MEETING_CHANNEL, json) + + val json2 = UsersMessageToJsonConverter.recordingStatusChangedToJson(msg) + service.send(MessagingConstants.FROM_USERS_CHANNEL, json2) + } + + private def handleGetRecordingStatusReply(msg: GetRecordingStatusReply) { + val json = MeetingMessageToJsonConverter.getRecordingStatusReplyToJson(msg) + service.send(MessagingConstants.FROM_MEETING_CHANNEL, json) + + val json2 = UsersMessageToJsonConverter.getRecordingStatusReplyToJson(msg) + service.send(MessagingConstants.FROM_USERS_CHANNEL, json2) + } + + private def handleMeetingHasEnded(msg: MeetingHasEnded) { + val json = MeetingMessageToJsonConverter.meetingHasEndedToJson(msg) + service.send(MessagingConstants.FROM_MEETING_CHANNEL, json) + + val json2 = UsersMessageToJsonConverter.meetingHasEnded(msg) + service.send(MessagingConstants.FROM_MEETING_CHANNEL, json2) + } + + private def handleGetAllMeetingsReply(msg: GetAllMeetingsReply) { + val json = MeetingMessageToJsonConverter.getAllMeetingsReplyToJson(msg) + service.send(MessagingConstants.FROM_MEETING_CHANNEL, json) + } + + private def pageToMap(page: Page): java.util.Map[String, Any] = { + val res = new scala.collection.mutable.HashMap[String, Any] + res += "id" -> page.id + res += "num" -> page.num + res += "thumb_uri" -> page.thumbUri + res += "swf_uri" -> page.swfUri + res += "txt_uri" -> page.txtUri + res += "png_uri" -> page.pngUri + res += "current" -> page.current + res += "x_offset" -> page.xOffset + res += "y_offset" -> page.yOffset + res += "width_ratio" -> page.widthRatio + res += "height_ratio" -> page.heightRatio + + mapAsJavaMap(res) + } + + private def handleClearPresentationOutMsg(msg: ClearPresentationOutMsg) { + val json = PesentationMessageToJsonConverter.clearPresentationOutMsgToJson(msg) + service.send(MessagingConstants.FROM_PRESENTATION_CHANNEL, json) + } + + private def handleRemovePresentationOutMsg(msg: RemovePresentationOutMsg) { + val m = new PresentationRemovedMessage(msg.meetingID, msg.presentationID) + service.send(MessagingConstants.FROM_PRESENTATION_CHANNEL, m.toJson()) + } + + private def handleGetPresentationInfoOutMsg(msg: GetPresentationInfoOutMsg) { + // Create a map for our current presenter + val presenter = new java.util.HashMap[String, Object]() + presenter.put(Constants.USER_ID, msg.info.presenter.userId) + presenter.put(Constants.NAME, msg.info.presenter.name) + presenter.put(Constants.ASSIGNED_BY, msg.info.presenter.assignedBy) + + // Create an array for our presentations + val presentations = new java.util.ArrayList[java.util.Map[String, Object]] + msg.info.presentations.foreach { pres => + val presentation = new java.util.HashMap[String, Object]() + presentation.put(Constants.ID, pres.id) + presentation.put(Constants.NAME, pres.name) + presentation.put(Constants.CURRENT, pres.current: java.lang.Boolean) + + // Get the pages for a presentation + val pages = new java.util.ArrayList[java.util.Map[String, Any]]() + pres.pages.values foreach { p => + pages.add(pageToMap(p)) + } + // store the pages in the presentation + presentation.put(Constants.PAGES, pages) + + // add this presentation into our presentations list + presentations.add(presentation); + } + + val reply = new GetPresentationInfoReplyMessage(msg.meetingID, msg.requesterID, presenter, presentations) + + val json = PesentationMessageToJsonConverter.getPresentationInfoOutMsgToJson(msg) + service.send(MessagingConstants.FROM_PRESENTATION_CHANNEL, json) + } + + private def handleSendCursorUpdateOutMsg(msg: SendCursorUpdateOutMsg) { + val json = PesentationMessageToJsonConverter.sendCursorUpdateOutMsgToJson(msg) + service.send(MessagingConstants.FROM_PRESENTATION_CHANNEL, json) + } + + private def handleResizeAndMoveSlideOutMsg(msg: ResizeAndMoveSlideOutMsg) { + val json = PesentationMessageToJsonConverter.resizeAndMoveSlideOutMsgToJson(msg) + service.send(MessagingConstants.FROM_PRESENTATION_CHANNEL, json) + } + + private def handleGotoSlideOutMsg(msg: GotoSlideOutMsg) { + val json = PesentationMessageToJsonConverter.gotoSlideOutMsgToJson(msg) + service.send(MessagingConstants.FROM_PRESENTATION_CHANNEL, json) + } + + private def handleSharePresentationOutMsg(msg: SharePresentationOutMsg) { + val json = PesentationMessageToJsonConverter.sharePresentationOutMsgToJson(msg) + service.send(MessagingConstants.FROM_PRESENTATION_CHANNEL, json) + } + + private def handleGetSlideInfoOutMsg(msg: GetSlideInfoOutMsg) { + val json = PesentationMessageToJsonConverter.getSlideInfoOutMsgToJson(msg) + service.send(MessagingConstants.FROM_PRESENTATION_CHANNEL, json) + } + + private def handleGetPreuploadedPresentationsOutMsg(msg: GetPreuploadedPresentationsOutMsg) { + val json = PesentationMessageToJsonConverter.getPreuploadedPresentationsOutMsgToJson(msg) + service.send(MessagingConstants.FROM_PRESENTATION_CHANNEL, json) + } + + private def handlePresentationConversionProgress(msg: PresentationConversionProgress) { + val json = PesentationMessageToJsonConverter.presentationConversionProgressToJson(msg) + service.send(MessagingConstants.FROM_PRESENTATION_CHANNEL, json) + } + + private def handlePresentationConversionError(msg: PresentationConversionError) { + val json = PesentationMessageToJsonConverter.presentationConversionErrorToJson(msg) + service.send(MessagingConstants.FROM_PRESENTATION_CHANNEL, json) + } + + private def handlePresentationPageGenerated(msg: PresentationPageGenerated) { + val json = PesentationMessageToJsonConverter.presentationPageGenerated(msg) + service.send(MessagingConstants.FROM_PRESENTATION_CHANNEL, json) + } + + private def handlePresentationConversionDone(msg: PresentationConversionDone) { + val json = PesentationMessageToJsonConverter.presentationConversionDoneToJson(msg) + service.send(MessagingConstants.FROM_PRESENTATION_CHANNEL, json) + } + + private def handlePresentationChanged(msg: PresentationChanged) { + val json = PesentationMessageToJsonConverter.presentationChangedToJson(msg) + service.send(MessagingConstants.FROM_PRESENTATION_CHANNEL, json) + } + + private def handleGetPresentationStatusReply(msg: GetPresentationStatusReply) { + val json = PesentationMessageToJsonConverter.getPresentationStatusReplyToJson(msg) + service.send(MessagingConstants.FROM_PRESENTATION_CHANNEL, json) + } + + private def handlePresentationRemoved(msg: PresentationRemoved) { + val json = PesentationMessageToJsonConverter.presentationRemovedToJson(msg) + service.send(MessagingConstants.FROM_PRESENTATION_CHANNEL, json) + } + + private def handlePageChanged(msg: PageChanged) { + val json = PesentationMessageToJsonConverter.pageChangedToJson(msg) + service.send(MessagingConstants.FROM_PRESENTATION_CHANNEL, json) + } + + private def handlePollStartedMessage(msg: PollStartedMessage) { + val json = pollStartedMessageToJson(msg) + service.send(MessagingConstants.FROM_POLLING_CHANNEL, json) + } + + private def handlePollStoppedMessage(msg: PollStoppedMessage) { + val json = pollStoppedMessageToJson(msg) + service.send(MessagingConstants.FROM_POLLING_CHANNEL, json) + } + + private def handlePollShowResultMessage(msg: PollShowResultMessage) { + val json = pollShowResultMessageToJson(msg) + service.send(MessagingConstants.FROM_POLLING_CHANNEL, json) + } + + private def handlePollHideResultMessage(msg: PollHideResultMessage) { + val json = pollHideResultMessageToJson(msg) + service.send(MessagingConstants.FROM_POLLING_CHANNEL, json) + } + + private def handleUserRespondedToPollMessage(msg: UserRespondedToPollMessage) { + val json = UserRespondedToPollMessageTpJson(msg) + service.send(MessagingConstants.FROM_POLLING_CHANNEL, json) + } + + private def pollVOtoMap(msg: SimplePollOutVO): java.util.HashMap[String, Object] = { + val pollVO = new java.util.HashMap[String, Object]() + pollVO.put("id", msg.id) + + val answers = new java.util.ArrayList[java.util.Map[String, Any]]; + msg.answers.foreach(ans => { + val amap = new java.util.HashMap[String, Any]() + amap.put("id", ans.id) + amap.put("key", ans.key) + answers.add(amap) + }) + + pollVO.put("answers", answers) + + pollVO + } + + private def pollStartedMessageToJson(msg: PollStartedMessage): String = { + val pollVO = pollVOtoMap(msg.poll) + val psm = new org.bigbluebutton.common.messages.PollStartedMessage(msg.meetingID, msg.requesterId, pollVO) + psm.toJson + } + + private def pollStoppedMessageToJson(msg: PollStoppedMessage): String = { + val psm = new org.bigbluebutton.common.messages.PollStoppedMessage(msg.meetingID, msg.requesterId, msg.pollId) + psm.toJson + } + + private def pollResultVOtoMap(msg: SimplePollResultOutVO): java.util.HashMap[String, Object] = { + val pollVO = new java.util.HashMap[String, Object]() + pollVO.put("id", msg.id) + + val answers = new java.util.ArrayList[java.util.Map[String, Any]]; + msg.answers.foreach(ans => { + val amap = new java.util.HashMap[String, Any]() + amap.put("id", ans.id) + amap.put("key", ans.key) + amap.put("num_votes", ans.numVotes) + answers.add(amap) + }) + + pollVO.put("answers", answers) + + pollVO + } + + private def pollShowResultMessageToJson(msg: PollShowResultMessage): String = { + val pollResultVO = pollResultVOtoMap(msg.poll) + + val psm = new org.bigbluebutton.common.messages.PollShowResultMessage(msg.meetingID, pollResultVO) + psm.toJson + } + + private def pollHideResultMessageToJson(msg: PollHideResultMessage): String = { + val psm = new org.bigbluebutton.common.messages.PollHideResultMessage(msg.meetingID, msg.pollId) + psm.toJson + } + + private def UserRespondedToPollMessageTpJson(msg: UserRespondedToPollMessage): String = { + val pollResultVO = pollResultVOtoMap(msg.poll) + val psm = new org.bigbluebutton.common.messages.UserVotedPollMessage(msg.meetingID, msg.presenterId, pollResultVO) + psm.toJson + } + + private def handleLockLayoutEvent(msg: LockLayoutEvent) { + val users = new java.util.ArrayList[String]; + msg.applyTo.foreach(uvo => { + users.add(uvo.userID) + }) + + val evt = new LockLayoutMessage(msg.meetingID, msg.setById, msg.locked, users) + service.send(MessagingConstants.FROM_USERS_CHANNEL, evt.toJson()) + } + + private def handleBroadcastLayoutEvent(msg: BroadcastLayoutEvent) { + val users = new java.util.ArrayList[String]; + msg.applyTo.foreach(uvo => { + users.add(uvo.userID) + }) + + val evt = new BroadcastLayoutMessage(msg.meetingID, msg.setByUserID, msg.layoutID, msg.locked, users) + service.send(MessagingConstants.FROM_USERS_CHANNEL, evt.toJson()) + } + + private def handleGetCurrentLayoutReply(msg: GetCurrentLayoutReply) { + val reply = new GetCurrentLayoutReplyMessage(msg.meetingID, msg.requesterID, msg.setByUserID, msg.layoutID, msg.locked) + service.send(MessagingConstants.FROM_USERS_CHANNEL, reply.toJson()) + } + + private def handleMeetingState(msg: MeetingState) { + val json = UsersMessageToJsonConverter.meetingState(msg) + service.send(MessagingConstants.FROM_MEETING_CHANNEL, json) + } + + private def handleMeetingMuted(msg: MeetingMuted) { + val json = UsersMessageToJsonConverter.meetingMuted(msg) + service.send(MessagingConstants.FROM_MEETING_CHANNEL, json) + } + + private def handleDisconnectAllUsers(msg: DisconnectAllUsers) { + val json = UsersMessageToJsonConverter.disconnectAllUsersToJson(msg) + service.send(MessagingConstants.FROM_MEETING_CHANNEL, json) + } + + private def handleDisconnectUser(msg: DisconnectUser) { + val json = UsersMessageToJsonConverter.disconnectUserToJson(msg) + service.send(MessagingConstants.FROM_MEETING_CHANNEL, json) + } + + private def handlePermissionsSettingInitialized(msg: PermissionsSettingInitialized) { + val json = UsersMessageToJsonConverter.permissionsSettingInitializedToJson(msg) + service.send(MessagingConstants.FROM_MEETING_CHANNEL, json) + } + + private def handleNewPermissionsSetting(msg: NewPermissionsSetting) { + val json = UsersMessageToJsonConverter.newPermissionsSettingToJson(msg) + service.send(MessagingConstants.FROM_MEETING_CHANNEL, json) + } + + private def handleUserLocked(msg: UserLocked) { + val json = UsersMessageToJsonConverter.userLockedToJson(msg) + service.send(MessagingConstants.FROM_MEETING_CHANNEL, json) + } + + private def handleGetPermissionsSettingReply(msg: GetPermissionsSettingReply) { + val json = UsersMessageToJsonConverter.getPermissionsSettingReplyToJson(msg) + service.send(MessagingConstants.FROM_MEETING_CHANNEL, json) + } + + private def handleUserRegistered(msg: UserRegistered) { + val json = UsersMessageToJsonConverter.userRegisteredToJson(msg) + service.send(MessagingConstants.FROM_MEETING_CHANNEL, json) + } + + private def handleUserStatusChange(msg: UserStatusChange) { + val json = UsersMessageToJsonConverter.userStatusChangeToJson(msg) + service.send(MessagingConstants.FROM_USERS_CHANNEL, json) + } + + private def handleUserRaisedHand(msg: UserRaisedHand) { + val json = UsersMessageToJsonConverter.userRaisedHandToJson(msg) + service.send(MessagingConstants.FROM_USERS_CHANNEL, json) + } + + private def handleUserLoweredHand(msg: UserLoweredHand) { + val json = UsersMessageToJsonConverter.userLoweredHandToJson(msg) + service.send(MessagingConstants.FROM_USERS_CHANNEL, json) + } + + private def handleUserSharedWebcam(msg: UserSharedWebcam) { + val json = UsersMessageToJsonConverter.userSharedWebcamToJson(msg) + service.send(MessagingConstants.FROM_USERS_CHANNEL, json) + } + + private def handleUserUnsharedWebcam(msg: UserUnsharedWebcam) { + val json = UsersMessageToJsonConverter.userUnsharedWebcamToJson(msg) + service.send(MessagingConstants.FROM_USERS_CHANNEL, json) + } + + private def handleGetUsersReply(msg: GetUsersReply) { + val json = UsersMessageToJsonConverter.getUsersReplyToJson(msg) + service.send(MessagingConstants.FROM_USERS_CHANNEL, json) + } + + private def handleUserJoinedVoice(msg: UserJoinedVoice) { + val json = UsersMessageToJsonConverter.userJoinedVoice(msg) + service.send(MessagingConstants.FROM_USERS_CHANNEL, json) + } + + private def handleUserVoiceMuted(msg: UserVoiceMuted) { + val json = UsersMessageToJsonConverter.userVoiceMuted(msg) + service.send(MessagingConstants.FROM_USERS_CHANNEL, json) + } + + private def handleUserVoiceTalking(msg: UserVoiceTalking) { + val json = UsersMessageToJsonConverter.userVoiceTalking(msg) + service.send(MessagingConstants.FROM_USERS_CHANNEL, json) + } + + private def handleMuteVoiceUser(msg: MuteVoiceUser) { + val m = new MuteUserInVoiceConfRequestMessage(msg.meetingID, msg.voiceConfId, msg.voiceUserId, msg.mute) + service.send(MessagingConstants.TO_VOICE_CONF_SYSTEM_CHAN, m.toJson()) + } + + private def handleGetUsersFromVoiceConference(msg: GetUsersInVoiceConference) { + val m = new GetUsersFromVoiceConfRequestMessage(msg.meetingID, msg.voiceConfId) + service.send(MessagingConstants.TO_VOICE_CONF_SYSTEM_CHAN, m.toJson()) + } + + private def handleEjectVoiceUser(msg: EjectVoiceUser) { + val m = new EjectUserFromVoiceConfRequestMessage(msg.meetingID, msg.voiceConfId, msg.voiceUserId) + service.send(MessagingConstants.TO_VOICE_CONF_SYSTEM_CHAN, m.toJson()) + + } + + private def handleUserLeftVoice(msg: UserLeftVoice) { + val json = UsersMessageToJsonConverter.userLeftVoiceToJson(msg) + service.send(MessagingConstants.FROM_USERS_CHANNEL, json) + } + + private def handleIsMeetingMutedReply(msg: IsMeetingMutedReply) { + val json = UsersMessageToJsonConverter.isMeetingMutedReplyToJson(msg) + service.send(MessagingConstants.FROM_USERS_CHANNEL, json) + } + + private def handleValidateAuthTokenReply(msg: ValidateAuthTokenReply) { + val json = UsersMessageToJsonConverter.validateAuthTokenReplyToJson(msg) + println("************** Publishing [" + json + "] *******************") + service.send(MessagingConstants.FROM_USERS_CHANNEL, json) + } + + private def handleValidateAuthTokenTimedOut(msg: ValidateAuthTokenTimedOut) { + val json = UsersMessageToJsonConverter.validateAuthTokenTimeoutToJson(msg) + println("************** Publishing [" + json + "] *******************") + service.send(MessagingConstants.FROM_USERS_CHANNEL, json) + } + + private def handleUserJoined(msg: UserJoined) { + val json = UsersMessageToJsonConverter.userJoinedToJson(msg) + service.send(MessagingConstants.FROM_USERS_CHANNEL, json) + } + + private def handleRegisteredUser(msg: UserRegistered) { + val json = UsersMessageToJsonConverter.userRegisteredToJson(msg) + service.send(MessagingConstants.FROM_USERS_CHANNEL, json) + } + + private def handleUserLeft(msg: UserLeft) { + val json = UsersMessageToJsonConverter.userLeftToJson(msg) + service.send(MessagingConstants.FROM_USERS_CHANNEL, json) + } + + private def handlePresenterAssigned(msg: PresenterAssigned) { + val json = UsersMessageToJsonConverter.presenterAssignedToJson(msg) + service.send(MessagingConstants.FROM_USERS_CHANNEL, json) + } + + private def handleEndAndKickAll(msg: EndAndKickAll) { + val json = UsersMessageToJsonConverter.endAndKickAllToJson(msg) + service.send(MessagingConstants.FROM_USERS_CHANNEL, json) + } + + private def handleUserListeningOnly(msg: UserListeningOnly) { + val json = UsersMessageToJsonConverter.userListeningOnlyToJson(msg) + service.send(MessagingConstants.FROM_USERS_CHANNEL, json) + } + + private def handleGetWhiteboardShapesReply(msg: GetWhiteboardShapesReply) { + val json = WhiteboardMessageToJsonConverter.getWhiteboardShapesReplyToJson(msg) + service.send(MessagingConstants.FROM_WHITEBOARD_CHANNEL, json) + } + + private def handleSendWhiteboardAnnotationEvent(msg: SendWhiteboardAnnotationEvent) { + val json = WhiteboardMessageToJsonConverter.sendWhiteboardAnnotationEventToJson(msg) + service.send(MessagingConstants.FROM_WHITEBOARD_CHANNEL, json) + } + + private def handleClearWhiteboardEvent(msg: ClearWhiteboardEvent) { + val json = WhiteboardMessageToJsonConverter.clearWhiteboardEventToJson(msg) + service.send(MessagingConstants.FROM_WHITEBOARD_CHANNEL, json) + } + + private def handleUndoWhiteboardEvent(msg: UndoWhiteboardEvent) { + val json = WhiteboardMessageToJsonConverter.undoWhiteboardEventToJson(msg) + service.send(MessagingConstants.FROM_WHITEBOARD_CHANNEL, json) + } + + private def handleWhiteboardEnabledEvent(msg: WhiteboardEnabledEvent) { + val json = WhiteboardMessageToJsonConverter.whiteboardEnabledEventToJson(msg) + service.send(MessagingConstants.FROM_WHITEBOARD_CHANNEL, json) + } + + private def handleIsWhiteboardEnabledReply(msg: IsWhiteboardEnabledReply) { + val json = WhiteboardMessageToJsonConverter.isWhiteboardEnabledReplyToJson(msg) + service.send(MessagingConstants.FROM_WHITEBOARD_CHANNEL, json) + } +} \ No newline at end of file diff --git a/akka-bbb-apps/src/main/scala/org/bigbluebutton/core/OutMessageGateway.scala b/akka-bbb-apps/src/main/scala/org/bigbluebutton/core/OutMessageGateway.scala new file mode 100755 index 0000000000000000000000000000000000000000..9939d1005133ffca72f303235133e9ad52855889 --- /dev/null +++ b/akka-bbb-apps/src/main/scala/org/bigbluebutton/core/OutMessageGateway.scala @@ -0,0 +1,21 @@ +package org.bigbluebutton.core + +import akka.actor.ActorRef +import akka.actor.ActorContext +import org.bigbluebutton.core.api.MessageOutGateway +import org.bigbluebutton.core.service.recorder.RecorderApplication +import org.bigbluebutton.core.api.IOutMessage + +object OutMessageGateway { + def apply(meetingId: String, recorder: RecorderApplication, sender: MessageSender)(implicit context: ActorContext) = + new OutMessageGateway(meetingId, recorder, sender)(context) +} + +class OutMessageGateway(val meetingId: String, val recorder: RecorderApplication, val sender: MessageSender)(implicit val context: ActorContext) { + + private val outGW = context.actorOf(OutMessageGatewayActor.props(meetingId, recorder, sender), meetingId) + + def send(msg: IOutMessage) { + outGW forward msg + } +} \ No newline at end of file diff --git a/akka-bbb-apps/src/main/scala/org/bigbluebutton/core/OutMessageGatewayActor.scala b/akka-bbb-apps/src/main/scala/org/bigbluebutton/core/OutMessageGatewayActor.scala new file mode 100755 index 0000000000000000000000000000000000000000..693e2d7c3bf4cc70e591bb76f8664c37755e5816 --- /dev/null +++ b/akka-bbb-apps/src/main/scala/org/bigbluebutton/core/OutMessageGatewayActor.scala @@ -0,0 +1,35 @@ +package org.bigbluebutton.core + +import akka.actor.Actor +import akka.actor.ActorRef +import akka.actor.ActorLogging +import akka.actor.Props +import org.bigbluebutton.core.api._ +import java.util.concurrent.TimeUnit +import org.bigbluebutton.core.util._ +import scala.concurrent.duration._ +import org.bigbluebutton.core.apps.{ PollApp, UsersApp, PresentationApp, LayoutApp, ChatApp, WhiteboardApp } +import org.bigbluebutton.core.apps.{ ChatModel, LayoutModel, UsersModel, PollModel, WhiteboardModel } +import org.bigbluebutton.core.apps.PresentationModel +import org.bigbluebutton.core.service.recorder.RecorderApplication + +object OutMessageGatewayActor { + def props(meetingId: String, recorder: RecorderApplication, sender: MessageSender): Props = + Props(classOf[OutMessageGatewayActor], meetingId, recorder, sender) +} + +class OutMessageGatewayActor(val meetingId: String, val recorder: RecorderApplication, val msgSender: MessageSender) + extends Actor with ActorLogging { + + private val recorderActor = context.actorOf(RecorderActor.props(meetingId, recorder), "recorderActor-" + meetingId) + private val msgSenderActor = context.actorOf(MessageSenderActor.props(meetingId, msgSender), "senderActor-" + meetingId) + + def receive = { + case msg: IOutMessage => { + msgSenderActor forward msg + recorderActor forward msg + } + case _ => // do nothing + } + +} \ No newline at end of file diff --git a/akka-bbb-apps/src/main/scala/org/bigbluebutton/core/RecorderActor.scala b/akka-bbb-apps/src/main/scala/org/bigbluebutton/core/RecorderActor.scala new file mode 100755 index 0000000000000000000000000000000000000000..4afaa57e065ffbccf742e61b8bec6f8edab25d7a --- /dev/null +++ b/akka-bbb-apps/src/main/scala/org/bigbluebutton/core/RecorderActor.scala @@ -0,0 +1,426 @@ +package org.bigbluebutton.core + +import akka.actor.Actor +import akka.actor.ActorRef +import akka.actor.ActorLogging +import akka.actor.Props +import org.bigbluebutton.core.api._ +import org.bigbluebutton.core.api._ +import scala.collection.JavaConversions._ +import org.bigbluebutton.core.service.recorder.RecorderApplication +import org.bigbluebutton.core.recorders.events.PublicChatRecordEvent +import org.bigbluebutton.core.recorders.events.ConversionCompletedPresentationRecordEvent +import org.bigbluebutton.core.recorders.events.GotoSlidePresentationRecordEvent +import org.bigbluebutton.core.recorders.events.ResizeAndMoveSlidePresentationRecordEvent +import org.bigbluebutton.core.recorders.events.RemovePresentationPresentationRecordEvent +import org.bigbluebutton.core.recorders.events.SharePresentationPresentationRecordEvent +import org.bigbluebutton.core.recorders.events.CursorUpdateRecordEvent +import org.bigbluebutton.core.recorders.events.AssignPresenterRecordEvent +import org.bigbluebutton.core.recorders.events.ParticipantStatusChangeRecordEvent +import org.bigbluebutton.core.recorders.events.ParticipantLeftRecordEvent +import org.bigbluebutton.core.recorders.events.RecordStatusRecordEvent +import org.bigbluebutton.core.recorders.events.ParticipantLeftVoiceRecordEvent +import org.bigbluebutton.core.recorders.events.ParticipantJoinedVoiceRecordEvent +import org.bigbluebutton.core.recorders.events.ParticipantTalkingVoiceRecordEvent +import org.bigbluebutton.core.recorders.events.ParticipantMutedVoiceRecordEvent +import org.bigbluebutton.core.recorders.events.StartRecordingVoiceRecordEvent +import org.bigbluebutton.core.recorders.events.ParticipantJoinRecordEvent +import org.bigbluebutton.core.recorders.events.ParticipantEndAndKickAllRecordEvent +import org.bigbluebutton.core.recorders.events.UndoShapeWhiteboardRecordEvent +import org.bigbluebutton.core.recorders.events.ClearPageWhiteboardRecordEvent +import org.bigbluebutton.core.recorders.events.AddShapeWhiteboardRecordEvent +import org.bigbluebutton.core.service.whiteboard.WhiteboardKeyUtil +import org.bigbluebutton.core.recorders.events.ModifyTextWhiteboardRecordEvent +import scala.collection.immutable.StringOps + +object RecorderActor { + def props(meetingId: String, recorder: RecorderApplication): Props = + Props(classOf[RecorderActor], meetingId, recorder) +} + +class RecorderActor(val meetingId: String, val recorder: RecorderApplication) + extends Actor with ActorLogging { + + def receive = { + case msg: SendPublicMessageEvent => handleSendPublicMessageEvent(msg) + case msg: ClearPresentationOutMsg => handleClearPresentationOutMsg(msg) + case msg: RemovePresentationOutMsg => handleRemovePresentationOutMsg(msg) + case msg: SendCursorUpdateOutMsg => handleSendCursorUpdateOutMsg(msg) + case msg: ResizeAndMoveSlideOutMsg => handleResizeAndMoveSlideOutMsg(msg) + case msg: GotoSlideOutMsg => handleGotoSlideOutMsg(msg) + case msg: SharePresentationOutMsg => handleSharePresentationOutMsg(msg) + case msg: EndAndKickAll => handleEndAndKickAll(msg) + case msg: PresenterAssigned => handleAssignPresenter(msg) + case msg: UserJoined => handleUserJoined(msg) + case msg: UserLeft => handleUserLeft(msg) + case msg: UserStatusChange => handleUserStatusChange(msg) + case msg: UserVoiceMuted => handleUserVoiceMuted(msg) + case msg: UserVoiceTalking => handleUserVoiceTalking(msg) + case msg: UserJoinedVoice => handleUserJoinedVoice(msg) + case msg: UserLeftVoice => handleUserLeftVoice(msg) + case msg: RecordingStatusChanged => handleRecordingStatusChanged(msg) + case msg: UserRaisedHand => handleUserRaisedHand(msg) + case msg: UserLoweredHand => handleUserLoweredHand(msg) + case msg: UserSharedWebcam => handleUserSharedWebcam(msg) + case msg: UserUnsharedWebcam => handleUserUnsharedWebcam(msg) + case msg: VoiceRecordingStarted => handleVoiceRecordingStarted(msg) + case msg: VoiceRecordingStopped => handleVoiceRecordingStopped(msg) + case msg: SendWhiteboardAnnotationEvent => handleSendWhiteboardAnnotationEvent(msg) + case msg: ClearWhiteboardEvent => handleClearWhiteboardEvent(msg) + case msg: UndoWhiteboardEvent => handleUndoWhiteboardEvent(msg) + case _ => // do nothing + } + + private def handleSendPublicMessageEvent(msg: SendPublicMessageEvent) { + if (msg.recorded) { + val message = mapAsJavaMap(msg.message) + val ev = new PublicChatRecordEvent(); + ev.setTimestamp(TimestampGenerator.generateTimestamp); + ev.setMeetingId(msg.meetingID); + ev.setSender(message.get("fromUsername")); + ev.setMessage(message.get("message")); + ev.setColor(message.get("fromColor")); + recorder.record(msg.meetingID, ev); + } + } + + private def handleClearPresentationOutMsg(msg: ClearPresentationOutMsg) { + + } + + private def handlePresentationConversionDone(msg: PresentationConversionDone) { + if (msg.recorded) { + val event = new ConversionCompletedPresentationRecordEvent(); + event.setMeetingId(msg.meetingID); + event.setTimestamp(TimestampGenerator.generateTimestamp); + event.setPresentationName(msg.presentation.id); + event.setOriginalFilename(msg.presentation.name); + recorder.record(msg.meetingID, event); + } + + } + + private def handleGotoSlideOutMsg(msg: GotoSlideOutMsg) { + if (msg.recorded) { + val event = new GotoSlidePresentationRecordEvent(); + event.setMeetingId(msg.meetingID); + event.setTimestamp(TimestampGenerator.generateTimestamp); + event.setSlide(msg.page.num); + event.setId(msg.page.id); + event.setNum(msg.page.num); + event.setThumbUri(msg.page.thumbUri); + event.setSwfUri(msg.page.swfUri); + event.setTxtUri(msg.page.txtUri); + event.setPngUri(msg.page.pngUri); + event.setXOffset(msg.page.xOffset); + event.setYOffset(msg.page.yOffset); + event.setWidthRatio(msg.page.widthRatio); + event.setHeightRatio(msg.page.heightRatio); + recorder.record(msg.meetingID, event); + } + } + + private def handleResizeAndMoveSlideOutMsg(msg: ResizeAndMoveSlideOutMsg) { + if (msg.recorded) { + val event = new ResizeAndMoveSlidePresentationRecordEvent(); + event.setMeetingId(msg.meetingID); + event.setTimestamp(TimestampGenerator.generateTimestamp); + event.setId(msg.page.id); + event.setNum(msg.page.num); + event.setThumbUri(msg.page.thumbUri); + event.setSwfUri(msg.page.swfUri); + event.setTxtUri(msg.page.txtUri); + event.setPngUri(msg.page.pngUri); + event.setXOffset(msg.page.xOffset); + event.setYOffset(msg.page.yOffset); + event.setWidthRatio(msg.page.widthRatio); + event.setHeightRatio(msg.page.heightRatio); + + recorder.record(msg.meetingID, event); + } + } + + private def handleRemovePresentationOutMsg(msg: RemovePresentationOutMsg) { + if (msg.recorded) { + val event = new RemovePresentationPresentationRecordEvent(); + event.setMeetingId(msg.meetingID); + event.setTimestamp(TimestampGenerator.generateTimestamp); + event.setPresentationName(msg.presentationID); + recorder.record(msg.meetingID, event); + } + } + + private def handleSharePresentationOutMsg(msg: SharePresentationOutMsg) { + if (msg.recorded) { + val event = new SharePresentationPresentationRecordEvent(); + event.setMeetingId(msg.meetingID); + event.setTimestamp(TimestampGenerator.generateTimestamp); + event.setPresentationName(msg.presentation.id); + event.setOriginalFilename(msg.presentation.name); + event.setShare(true); + recorder.record(msg.meetingID, event); + } + } + + private def handleSendCursorUpdateOutMsg(msg: SendCursorUpdateOutMsg) { + if (msg.recorded) { + val event = new CursorUpdateRecordEvent(); + event.setMeetingId(msg.meetingID); + event.setTimestamp(TimestampGenerator.generateTimestamp); + event.setXPercent(msg.xPercent); + event.setYPercent(msg.yPercent); + + recorder.record(msg.meetingID, event); + } + } + + private def handleEndAndKickAll(msg: EndAndKickAll): Unit = { + if (msg.recorded) { + val ev = new ParticipantEndAndKickAllRecordEvent(); + ev.setTimestamp(TimestampGenerator.generateTimestamp); + ev.setMeetingId(msg.meetingID); + recorder.record(msg.meetingID, ev); + } + } + + private def handleUserJoined(msg: UserJoined): Unit = { + if (msg.recorded) { + val ev = new ParticipantJoinRecordEvent(); + ev.setTimestamp(TimestampGenerator.generateTimestamp); + ev.setUserId(msg.user.userID); + ev.setName(msg.user.name); + ev.setMeetingId(msg.meetingID); + ev.setRole(msg.user.role.toString()); + + recorder.record(msg.meetingID, ev); + } + } + + def handleVoiceRecordingStarted(msg: VoiceRecordingStarted) { + if (msg.recorded) { + val evt = new StartRecordingVoiceRecordEvent(true); + evt.setMeetingId(msg.meetingID); + evt.setTimestamp(TimestampGenerator.generateTimestamp); + evt.setBridge(msg.confNum); + evt.setRecordingTimestamp(msg.timestamp); + evt.setFilename(msg.recordingFile); + recorder.record(msg.meetingID, evt); + } + } + + def handleVoiceRecordingStopped(msg: VoiceRecordingStopped) { + if (msg.recorded) { + val evt = new StartRecordingVoiceRecordEvent(false); + evt.setMeetingId(msg.meetingID); + evt.setTimestamp(TimestampGenerator.generateTimestamp); + evt.setBridge(msg.confNum); + evt.setRecordingTimestamp(msg.timestamp); + evt.setFilename(msg.recordingFile); + recorder.record(msg.meetingID, evt); + } + } + + def handleUserVoiceMuted(msg: UserVoiceMuted) { + if (msg.recorded) { + val ev = new ParticipantMutedVoiceRecordEvent() + ev.setMeetingId(msg.meetingID); + ev.setTimestamp(TimestampGenerator.generateTimestamp); + ev.setBridge(msg.confNum); + ev.setParticipant(msg.user.voiceUser.userId); + ev.setMuted(msg.user.voiceUser.muted); + + recorder.record(msg.meetingID, ev); + } + } + + def handleUserVoiceTalking(msg: UserVoiceTalking) { + if (msg.recorded) { + val evt = new ParticipantTalkingVoiceRecordEvent(); + evt.setMeetingId(msg.meetingID); + evt.setTimestamp(TimestampGenerator.generateTimestamp); + evt.setBridge(msg.confNum); + evt.setParticipant(msg.user.userID); + evt.setTalking(msg.user.voiceUser.talking); + + recorder.record(msg.meetingID, evt); + } + } + + def handleUserJoinedVoice(msg: UserJoinedVoice) { + if (msg.recorded) { + val evt = new ParticipantJoinedVoiceRecordEvent(); + evt.setMeetingId(msg.meetingID); + evt.setTimestamp(TimestampGenerator.generateTimestamp); + evt.setBridge(msg.confNum); + evt.setParticipant(msg.user.voiceUser.userId); + evt.setCallerName(msg.user.voiceUser.callerName); + evt.setCallerNumber(msg.user.voiceUser.callerNum); + evt.setMuted(msg.user.voiceUser.muted); + evt.setTalking(msg.user.voiceUser.talking); + + recorder.record(msg.meetingID, evt) + } + } + + def handleUserLeftVoice(msg: UserLeftVoice) { + if (msg.recorded) { + val evt = new ParticipantLeftVoiceRecordEvent(); + evt.setMeetingId(msg.meetingID); + evt.setTimestamp(TimestampGenerator.generateTimestamp); + evt.setBridge(msg.confNum); + evt.setParticipant(msg.user.voiceUser.userId); + recorder.record(msg.meetingID, evt); + } + } + + def handleRecordingStatusChanged(msg: RecordingStatusChanged) { + if (msg.recorded) { + val evt = new RecordStatusRecordEvent(); + evt.setMeetingId(msg.meetingID); + evt.setTimestamp(TimestampGenerator.generateTimestamp); + evt.setUserId(msg.userId); + evt.setRecordingStatus(msg.recording.toString); + + recorder.record(msg.meetingID, evt); + } + } + + private def handleUserLeft(msg: UserLeft): Unit = { + if (msg.recorded) { + val ev = new ParticipantLeftRecordEvent(); + ev.setTimestamp(TimestampGenerator.generateTimestamp); + ev.setUserId(msg.user.userID); + ev.setMeetingId(msg.meetingID); + + recorder.record(msg.meetingID, ev); + } + + } + + private def handleUserRaisedHand(msg: UserRaisedHand) { + val status = UserStatusChange(msg.meetingID, msg.recorded, + msg.userID, "raiseHand", true: java.lang.Boolean) + handleUserStatusChange(status) + } + + private def handleUserLoweredHand(msg: UserLoweredHand) { + val status = UserStatusChange(msg.meetingID, msg.recorded, + msg.userID, "raiseHand", false: java.lang.Boolean) + handleUserStatusChange(status) + } + + private def handleUserSharedWebcam(msg: UserSharedWebcam) { + val status = UserStatusChange(msg.meetingID, msg.recorded, + msg.userID, "hasStream", "true,stream=" + msg.stream) + handleUserStatusChange(status) + } + + private def handleUserUnsharedWebcam(msg: UserUnsharedWebcam) { + val status = UserStatusChange(msg.meetingID, msg.recorded, + msg.userID, "hasStream", "false,stream=" + msg.stream) + handleUserStatusChange(status) + } + + private def handleUserStatusChange(msg: UserStatusChange): Unit = { + if (msg.recorded) { + val ev = new ParticipantStatusChangeRecordEvent(); + ev.setTimestamp(TimestampGenerator.generateTimestamp); + ev.setUserId(msg.userID); + ev.setMeetingId(msg.meetingID); + ev.setStatus(msg.status); + ev.setValue(msg.value.toString()); + + recorder.record(msg.meetingID, ev); + } + } + + private def handleAssignPresenter(msg: PresenterAssigned): Unit = { + if (msg.recorded) { + val event = new AssignPresenterRecordEvent(); + event.setMeetingId(msg.meetingID); + event.setTimestamp(TimestampGenerator.generateTimestamp); + event.setUserId(msg.presenter.presenterID); + event.setName(msg.presenter.presenterName); + event.setAssignedBy(msg.presenter.assignedBy); + + recorder.record(msg.meetingID, event); + } + + } + + private def getPresentationId(whiteboardId: String): String = { + // Need to split the whiteboard id into presenation id and page num as the old + // recording expects them + val strId = new StringOps(whiteboardId) + val ids = strId.split('/') + var presId: String = "" + if (ids.length == 2) { + presId = ids(0) + } + + presId + } + + private def getPageNum(whiteboardId: String): String = { + val strId = new StringOps(whiteboardId) + val ids = strId.split('/') + var pageNum = "0" + if (ids.length == 2) { + pageNum = ids(1) + } + pageNum + } + + private def handleSendWhiteboardAnnotationEvent(msg: SendWhiteboardAnnotationEvent) { + if ((msg.shape.shapeType == WhiteboardKeyUtil.TEXT_TYPE) && (msg.shape.status != WhiteboardKeyUtil.TEXT_CREATED_STATUS)) { + + val event = new ModifyTextWhiteboardRecordEvent() + event.setMeetingId(msg.meetingID) + event.setTimestamp(TimestampGenerator.generateTimestamp) + event.setPresentation(getPresentationId(msg.whiteboardId)) + event.setPageNumber(getPageNum(msg.whiteboardId)) + event.setWhiteboardId(msg.whiteboardId) + event.addAnnotation(mapAsJavaMap(msg.shape.shape)) + recorder.record(msg.meetingID, event) + } else if ((msg.shape.shapeType == WhiteboardKeyUtil.POLL_RESULT_TYPE)) { + val event = new AddShapeWhiteboardRecordEvent() + event.setMeetingId(msg.meetingID) + event.setTimestamp(TimestampGenerator.generateTimestamp) + event.setPresentation(getPresentationId(msg.whiteboardId)) + event.setPageNumber(getPageNum(msg.whiteboardId)) + event.setWhiteboardId(msg.whiteboardId); + event.addAnnotation(mapAsJavaMap(msg.shape.shape)) + recorder.record(msg.meetingID, event) + } else { + val event = new AddShapeWhiteboardRecordEvent() + event.setMeetingId(msg.meetingID) + event.setTimestamp(TimestampGenerator.generateTimestamp) + event.setPresentation(getPresentationId(msg.whiteboardId)) + event.setPageNumber(getPageNum(msg.whiteboardId)) + event.setWhiteboardId(msg.whiteboardId); + event.addAnnotation(mapAsJavaMap(msg.shape.shape)) + recorder.record(msg.meetingID, event) + } + } + + private def handleClearWhiteboardEvent(msg: ClearWhiteboardEvent) { + val event = new ClearPageWhiteboardRecordEvent() + event.setMeetingId(msg.meetingID) + event.setTimestamp(TimestampGenerator.generateTimestamp) + event.setPresentation(getPresentationId(msg.whiteboardId)) + event.setPageNumber(getPageNum(msg.whiteboardId)) + event.setWhiteboardId(msg.whiteboardId) + recorder.record(msg.meetingID, event) + } + + private def handleUndoWhiteboardEvent(msg: UndoWhiteboardEvent) { + val event = new UndoShapeWhiteboardRecordEvent() + event.setMeetingId(msg.meetingID) + event.setTimestamp(TimestampGenerator.generateTimestamp) + event.setPresentation(getPresentationId(msg.whiteboardId)) + event.setPageNumber(getPageNum(msg.whiteboardId)) + event.setWhiteboardId(msg.whiteboardId) + event.setShapeId(msg.shapeId); + recorder.record(msg.meetingID, event) + } +} \ No newline at end of file diff --git a/akka-bbb-apps/src/main/scala/org/bigbluebutton/core/RunningMeeting.scala b/akka-bbb-apps/src/main/scala/org/bigbluebutton/core/RunningMeeting.scala index 69073a24f44a2ee512e366a99d2679ef686d5da1..ebcaf8d440a950a59ee519b9b8aa9eec285a6391 100755 --- a/akka-bbb-apps/src/main/scala/org/bigbluebutton/core/RunningMeeting.scala +++ b/akka-bbb-apps/src/main/scala/org/bigbluebutton/core/RunningMeeting.scala @@ -5,13 +5,11 @@ import akka.actor.ActorContext import org.bigbluebutton.core.api.MessageOutGateway object RunningMeeting { - def apply(mProps: MeetingProperties, - outGW: MessageOutGateway)(implicit context: ActorContext) = + def apply(mProps: MeetingProperties, outGW: OutMessageGateway)(implicit context: ActorContext) = new RunningMeeting(mProps, outGW)(context) } -class RunningMeeting(val mProps: MeetingProperties, - val outGW: MessageOutGateway)(implicit val context: ActorContext) { +class RunningMeeting(val mProps: MeetingProperties, val outGW: OutMessageGateway)(implicit val context: ActorContext) { val actorRef = context.actorOf(MeetingActor.props(mProps, outGW), mProps.meetingID) } \ No newline at end of file diff --git a/akka-bbb-apps/src/main/scala/org/bigbluebutton/core/apps/ChatApp.scala b/akka-bbb-apps/src/main/scala/org/bigbluebutton/core/apps/ChatApp.scala index e44fcd21b7dd0cef7791535de63fe4d4f3ff125f..235376109f4692e7888b18a1b905483eaf81f151 100755 --- a/akka-bbb-apps/src/main/scala/org/bigbluebutton/core/apps/ChatApp.scala +++ b/akka-bbb-apps/src/main/scala/org/bigbluebutton/core/apps/ChatApp.scala @@ -3,11 +3,12 @@ package org.bigbluebutton.core.apps import org.bigbluebutton.core.api._ import scala.collection.mutable.ArrayBuffer import org.bigbluebutton.core.MeetingActor +import org.bigbluebutton.core.OutMessageGateway trait ChatApp { this: MeetingActor => - val outGW: MessageOutGateway + val outGW: OutMessageGateway def handleGetChatHistoryRequest(msg: GetChatHistoryRequest) { val history = chatModel.getChatHistory() diff --git a/akka-bbb-apps/src/main/scala/org/bigbluebutton/core/apps/LayoutApp.scala b/akka-bbb-apps/src/main/scala/org/bigbluebutton/core/apps/LayoutApp.scala index 6398bc0e9b24c0057247464434f47dc2ac3fef94..b14d3d7f4567557b0ccc98a22d20973a2632c4d8 100755 --- a/akka-bbb-apps/src/main/scala/org/bigbluebutton/core/apps/LayoutApp.scala +++ b/akka-bbb-apps/src/main/scala/org/bigbluebutton/core/apps/LayoutApp.scala @@ -3,11 +3,12 @@ package org.bigbluebutton.core.apps import org.bigbluebutton.core.api._ import org.bigbluebutton.core.MeetingActor import scala.collection.mutable.ArrayBuffer +import org.bigbluebutton.core.OutMessageGateway trait LayoutApp { this: MeetingActor => - val outGW: MessageOutGateway + val outGW: OutMessageGateway def handleGetCurrentLayoutRequest(msg: GetCurrentLayoutRequest) { outGW.send(new GetCurrentLayoutReply(msg.meetingID, mProps.recorded, msg.requesterID, diff --git a/akka-bbb-apps/src/main/scala/org/bigbluebutton/core/apps/PollApp.scala b/akka-bbb-apps/src/main/scala/org/bigbluebutton/core/apps/PollApp.scala index 6843582af7aa8c0f7e650e6b09adbbc1c9463647..a217048dcd2f26fc7a24912b9fa26b3420b0cb2c 100755 --- a/akka-bbb-apps/src/main/scala/org/bigbluebutton/core/apps/PollApp.scala +++ b/akka-bbb-apps/src/main/scala/org/bigbluebutton/core/apps/PollApp.scala @@ -7,11 +7,12 @@ import scala.collection.mutable.ArrayBuffer import org.bigbluebutton.core.service.whiteboard.WhiteboardKeyUtil import com.google.gson.Gson import java.util.ArrayList +import org.bigbluebutton.core.OutMessageGateway trait PollApp { this: MeetingActor => - val outGW: MessageOutGateway + val outGW: OutMessageGateway def handleGetPollRequest(msg: GetPollRequest) { diff --git a/akka-bbb-apps/src/main/scala/org/bigbluebutton/core/apps/PresentationApp.scala b/akka-bbb-apps/src/main/scala/org/bigbluebutton/core/apps/PresentationApp.scala index baf6f64d62b970d1d19c733446566d2b660cd140..a15ea077d1fec738a27242045fc0f95166dbe333 100755 --- a/akka-bbb-apps/src/main/scala/org/bigbluebutton/core/apps/PresentationApp.scala +++ b/akka-bbb-apps/src/main/scala/org/bigbluebutton/core/apps/PresentationApp.scala @@ -3,11 +3,12 @@ package org.bigbluebutton.core.apps import org.bigbluebutton.core.api._ import org.bigbluebutton.core.MeetingActor import com.google.gson.Gson +import org.bigbluebutton.core.OutMessageGateway trait PresentationApp { this: MeetingActor => - val outGW: MessageOutGateway + val outGW: OutMessageGateway private var cursorLocation = new CursorLocation diff --git a/akka-bbb-apps/src/main/scala/org/bigbluebutton/core/apps/UsersApp.scala b/akka-bbb-apps/src/main/scala/org/bigbluebutton/core/apps/UsersApp.scala index cdf6cdb28433e3797734522d002f27e603ce7ff8..f2b7f275b566947868f6fa87a58e2b323fec7b58 100755 --- a/akka-bbb-apps/src/main/scala/org/bigbluebutton/core/apps/UsersApp.scala +++ b/akka-bbb-apps/src/main/scala/org/bigbluebutton/core/apps/UsersApp.scala @@ -6,11 +6,12 @@ import java.util.ArrayList import org.bigbluebutton.core.MeetingActor import scala.collection.mutable.ArrayBuffer import scala.collection.immutable.ListSet +import org.bigbluebutton.core.OutMessageGateway trait UsersApp { this: MeetingActor => - val outGW: MessageOutGateway + val outGW: OutMessageGateway def hasUser(userID: String): Boolean = { usersModel.hasUser(userID) diff --git a/akka-bbb-apps/src/main/scala/org/bigbluebutton/core/apps/WhiteboardApp.scala b/akka-bbb-apps/src/main/scala/org/bigbluebutton/core/apps/WhiteboardApp.scala index bf531c41a4fe01b516560723ab1d848785d9c79c..93a8811fc2d9222caa5064469dc89144e6044eb0 100755 --- a/akka-bbb-apps/src/main/scala/org/bigbluebutton/core/apps/WhiteboardApp.scala +++ b/akka-bbb-apps/src/main/scala/org/bigbluebutton/core/apps/WhiteboardApp.scala @@ -3,13 +3,14 @@ package org.bigbluebutton.core.apps import org.bigbluebutton.core.api._ import org.bigbluebutton.core.MeetingActor import org.bigbluebutton.core.service.whiteboard.WhiteboardKeyUtil +import org.bigbluebutton.core.OutMessageGateway case class Whiteboard(id: String, shapes: Seq[AnnotationVO]) trait WhiteboardApp { this: MeetingActor => - val outGW: MessageOutGateway + val outGW: OutMessageGateway def handleSendWhiteboardAnnotationRequest(msg: SendWhiteboardAnnotationRequest) { val status = msg.annotation.status diff --git a/akka-bbb-apps/src/main/scala/org/bigbluebutton/core/pubsub/senders/ChatEventRedisPublisher.scala b/akka-bbb-apps/src/main/scala/org/bigbluebutton/core/pubsub/senders/ChatEventRedisPublisher.scala deleted file mode 100755 index f1ffe8f3113ca3b2f02d1a279f8d43778b20f7cc..0000000000000000000000000000000000000000 --- a/akka-bbb-apps/src/main/scala/org/bigbluebutton/core/pubsub/senders/ChatEventRedisPublisher.scala +++ /dev/null @@ -1,38 +0,0 @@ -package org.bigbluebutton.core.pubsub.senders - -import org.bigbluebutton.core.api.OutMessageListener2 -import org.bigbluebutton.core.MessageSender -import org.bigbluebutton.core.api._ -import com.google.gson.Gson -import scala.collection.mutable.HashMap -import collection.JavaConverters._ -import scala.collection.JavaConversions._ -import java.util.ArrayList -import org.bigbluebutton.common.messages.MessagingConstants -import org.bigbluebutton.core.messaging.Util - -class ChatEventRedisPublisher(service: MessageSender) extends OutMessageListener2 { - def handleMessage(msg: IOutMessage) { - msg match { - case msg: GetChatHistoryReply => handleGetChatHistoryReply(msg) - case msg: SendPublicMessageEvent => handleSendPublicMessageEvent(msg) - case msg: SendPrivateMessageEvent => handleSendPrivateMessageEvent(msg) - case _ => // do nothing - } - } - - private def handleGetChatHistoryReply(msg: GetChatHistoryReply) { - val json = ChatMessageToJsonConverter.getChatHistoryReplyToJson(msg) - service.send(MessagingConstants.FROM_CHAT_CHANNEL, json) - } - - private def handleSendPublicMessageEvent(msg: SendPublicMessageEvent) { - val json = ChatMessageToJsonConverter.sendPublicMessageEventToJson(msg) - service.send(MessagingConstants.FROM_CHAT_CHANNEL, json) - } - - private def handleSendPrivateMessageEvent(msg: SendPrivateMessageEvent) { - val json = ChatMessageToJsonConverter.sendPrivateMessageEventToJson(msg) - service.send(MessagingConstants.FROM_CHAT_CHANNEL, json) - } -} \ No newline at end of file diff --git a/akka-bbb-apps/src/main/scala/org/bigbluebutton/core/pubsub/senders/MeetingEventRedisPublisher.scala b/akka-bbb-apps/src/main/scala/org/bigbluebutton/core/pubsub/senders/MeetingEventRedisPublisher.scala deleted file mode 100755 index 2c4ce5c2ee38f7a4e44692ac58cb198588890bfe..0000000000000000000000000000000000000000 --- a/akka-bbb-apps/src/main/scala/org/bigbluebutton/core/pubsub/senders/MeetingEventRedisPublisher.scala +++ /dev/null @@ -1,110 +0,0 @@ -package org.bigbluebutton.core.pubsub.senders - -import org.bigbluebutton.core.MessageSender -import org.bigbluebutton.core.api._ -import scala.collection.immutable.HashMap -import com.google.gson.Gson -import scala.collection.JavaConverters._ -import org.bigbluebutton.common.messages.MessagingConstants -import org.bigbluebutton.common.messages.StartRecordingVoiceConfRequestMessage -import org.bigbluebutton.common.messages.StopRecordingVoiceConfRequestMessage - -class MeetingEventRedisPublisher(service: MessageSender) extends OutMessageListener2 { - - private val KEEP_ALIVE_REPLY = "KEEP_ALIVE_REPLY" - - def handleMessage(msg: IOutMessage) { - msg match { - case msg: MeetingCreated => handleMeetingCreated(msg) - case msg: VoiceRecordingStarted => handleVoiceRecordingStarted(msg) - case msg: VoiceRecordingStopped => handleVoiceRecordingStopped(msg) - case msg: RecordingStatusChanged => handleRecordingStatusChanged(msg) - case msg: GetRecordingStatusReply => handleGetRecordingStatusReply(msg) - case msg: MeetingEnded => handleMeetingEnded(msg) - case msg: MeetingHasEnded => handleMeetingHasEnded(msg) - case msg: MeetingDestroyed => handleMeetingDestroyed(msg) - case msg: KeepAliveMessageReply => handleKeepAliveMessageReply(msg) - case msg: StartRecording => handleStartRecording(msg) - case msg: StopRecording => handleStopRecording(msg) - case msg: GetAllMeetingsReply => handleGetAllMeetingsReply(msg) - case msg: StartRecordingVoiceConf => handleStartRecordingVoiceConf(msg) - case msg: StopRecordingVoiceConf => handleStopRecordingVoiceConf(msg) - case _ => //println("Unhandled message in MeetingEventRedisPublisher") - } - } - - private def handleStartRecordingVoiceConf(msg: StartRecordingVoiceConf) { - val m = new StartRecordingVoiceConfRequestMessage(msg.meetingID, msg.voiceConfId) - System.out.println("*******************\n" + m.toJson()) - service.send(MessagingConstants.TO_VOICE_CONF_SYSTEM_CHAN, m.toJson()) - } - - private def handleStopRecordingVoiceConf(msg: StopRecordingVoiceConf) { - val m = new StopRecordingVoiceConfRequestMessage(msg.meetingID, msg.voiceConfId, msg.recordedStream) - System.out.println("*******************\n" + m.toJson()) - service.send(MessagingConstants.TO_VOICE_CONF_SYSTEM_CHAN, m.toJson()) - } - - private def handleMeetingDestroyed(msg: MeetingDestroyed) { - val json = MeetingMessageToJsonConverter.meetingDestroyedToJson(msg) - // System.out.println("****\n" + json) - service.send(MessagingConstants.FROM_MEETING_CHANNEL, json) - } - - private def handleKeepAliveMessageReply(msg: KeepAliveMessageReply) { - val json = MeetingMessageToJsonConverter.keepAliveMessageReplyToJson(msg) - service.send(MessagingConstants.FROM_SYSTEM_CHANNEL, json) - } - - private def handleMeetingCreated(msg: MeetingCreated) { - val json = MeetingMessageToJsonConverter.meetingCreatedToJson(msg) - // System.out.println("****\n" + json) - service.send(MessagingConstants.FROM_MEETING_CHANNEL, json) - } - - private def handleMeetingEnded(msg: MeetingEnded) { - val json = MeetingMessageToJsonConverter.meetingEndedToJson(msg) - // System.out.println("****\n" + json) - service.send(MessagingConstants.FROM_MEETING_CHANNEL, json) - } - - private def handleStartRecording(msg: StartRecording) { - val json = MeetingMessageToJsonConverter.startRecordingToJson(msg) - service.send(MessagingConstants.FROM_MEETING_CHANNEL, json) - } - - private def handleStopRecording(msg: StopRecording) { - val json = MeetingMessageToJsonConverter.stopRecordingToJson(msg) - service.send(MessagingConstants.FROM_MEETING_CHANNEL, json) - } - - private def handleVoiceRecordingStarted(msg: VoiceRecordingStarted) { - val json = MeetingMessageToJsonConverter.voiceRecordingStartedToJson(msg) - service.send(MessagingConstants.FROM_MEETING_CHANNEL, json) - } - - private def handleVoiceRecordingStopped(msg: VoiceRecordingStopped) { - val json = MeetingMessageToJsonConverter.voiceRecordingStoppedToJson(msg) - service.send(MessagingConstants.FROM_MEETING_CHANNEL, json) - } - - private def handleRecordingStatusChanged(msg: RecordingStatusChanged) { - val json = MeetingMessageToJsonConverter.recordingStatusChangedToJson(msg) - service.send(MessagingConstants.FROM_MEETING_CHANNEL, json) - } - - private def handleGetRecordingStatusReply(msg: GetRecordingStatusReply) { - val json = MeetingMessageToJsonConverter.getRecordingStatusReplyToJson(msg) - service.send(MessagingConstants.FROM_MEETING_CHANNEL, json) - } - - private def handleMeetingHasEnded(msg: MeetingHasEnded) { - val json = MeetingMessageToJsonConverter.meetingHasEndedToJson(msg) - service.send(MessagingConstants.FROM_MEETING_CHANNEL, json) - } - - private def handleGetAllMeetingsReply(msg: GetAllMeetingsReply) { - val json = MeetingMessageToJsonConverter.getAllMeetingsReplyToJson(msg) - service.send(MessagingConstants.FROM_MEETING_CHANNEL, json) - } -} \ No newline at end of file diff --git a/akka-bbb-apps/src/main/scala/org/bigbluebutton/core/pubsub/senders/PollingEventRedisPublisher.scala b/akka-bbb-apps/src/main/scala/org/bigbluebutton/core/pubsub/senders/PollingEventRedisPublisher.scala deleted file mode 100755 index efa8ff3325cbea3ef4b08342fbb7b1c42198b744..0000000000000000000000000000000000000000 --- a/akka-bbb-apps/src/main/scala/org/bigbluebutton/core/pubsub/senders/PollingEventRedisPublisher.scala +++ /dev/null @@ -1,116 +0,0 @@ -package org.bigbluebutton.core.pubsub.senders - -import org.bigbluebutton.core.api.OutMessageListener2 -import org.bigbluebutton.core.MessageSender -import org.bigbluebutton.core.api._ -import com.google.gson.Gson -import scala.collection.mutable.HashMap -import collection.JavaConverters._ -import scala.collection.JavaConversions._ -import java.util.ArrayList -import org.bigbluebutton.common.messages.MessagingConstants -import org.bigbluebutton.core.messaging.Util -import org.bigbluebutton.core.apps.SimplePollOutVO -import org.bigbluebutton.core.apps.SimplePollResultOutVO - -class PollingEventRedisPublisher(service: MessageSender) extends OutMessageListener2 { - def handleMessage(msg: IOutMessage) { - msg match { - case msg: PollStartedMessage => handlePollStartedMessage(msg) - case msg: PollStoppedMessage => handlePollStoppedMessage(msg) - case msg: PollShowResultMessage => handlePollShowResultMessage(msg) - case msg: PollHideResultMessage => handlePollHideResultMessage(msg) - case msg: UserRespondedToPollMessage => handleUserRespondedToPollMessage(msg) - case _ => // do nothing - } - } - - private def handlePollStartedMessage(msg: PollStartedMessage) { - val json = pollStartedMessageToJson(msg) - service.send(MessagingConstants.FROM_POLLING_CHANNEL, json) - } - - private def handlePollStoppedMessage(msg: PollStoppedMessage) { - val json = pollStoppedMessageToJson(msg) - service.send(MessagingConstants.FROM_POLLING_CHANNEL, json) - } - - private def handlePollShowResultMessage(msg: PollShowResultMessage) { - val json = pollShowResultMessageToJson(msg) - service.send(MessagingConstants.FROM_POLLING_CHANNEL, json) - } - - private def handlePollHideResultMessage(msg: PollHideResultMessage) { - val json = pollHideResultMessageToJson(msg) - service.send(MessagingConstants.FROM_POLLING_CHANNEL, json) - } - - private def handleUserRespondedToPollMessage(msg: UserRespondedToPollMessage) { - val json = UserRespondedToPollMessageTpJson(msg) - service.send(MessagingConstants.FROM_POLLING_CHANNEL, json) - } - - private def pollVOtoMap(msg: SimplePollOutVO): java.util.HashMap[String, Object] = { - val pollVO = new java.util.HashMap[String, Object]() - pollVO.put("id", msg.id) - - val answers = new java.util.ArrayList[java.util.Map[String, Any]]; - msg.answers.foreach(ans => { - val amap = new java.util.HashMap[String, Any]() - amap.put("id", ans.id) - amap.put("key", ans.key) - answers.add(amap) - }) - - pollVO.put("answers", answers) - - pollVO - } - - private def pollStartedMessageToJson(msg: PollStartedMessage): String = { - val pollVO = pollVOtoMap(msg.poll) - val psm = new org.bigbluebutton.common.messages.PollStartedMessage(msg.meetingID, msg.requesterId, pollVO) - psm.toJson - } - - private def pollStoppedMessageToJson(msg: PollStoppedMessage): String = { - val psm = new org.bigbluebutton.common.messages.PollStoppedMessage(msg.meetingID, msg.requesterId, msg.pollId) - psm.toJson - } - - private def pollResultVOtoMap(msg: SimplePollResultOutVO): java.util.HashMap[String, Object] = { - val pollVO = new java.util.HashMap[String, Object]() - pollVO.put("id", msg.id) - - val answers = new java.util.ArrayList[java.util.Map[String, Any]]; - msg.answers.foreach(ans => { - val amap = new java.util.HashMap[String, Any]() - amap.put("id", ans.id) - amap.put("key", ans.key) - amap.put("num_votes", ans.numVotes) - answers.add(amap) - }) - - pollVO.put("answers", answers) - - pollVO - } - - private def pollShowResultMessageToJson(msg: PollShowResultMessage): String = { - val pollResultVO = pollResultVOtoMap(msg.poll) - - val psm = new org.bigbluebutton.common.messages.PollShowResultMessage(msg.meetingID, pollResultVO) - psm.toJson - } - - private def pollHideResultMessageToJson(msg: PollHideResultMessage): String = { - val psm = new org.bigbluebutton.common.messages.PollHideResultMessage(msg.meetingID, msg.pollId) - psm.toJson - } - - private def UserRespondedToPollMessageTpJson(msg: UserRespondedToPollMessage): String = { - val pollResultVO = pollResultVOtoMap(msg.poll) - val psm = new org.bigbluebutton.common.messages.UserVotedPollMessage(msg.meetingID, msg.presenterId, pollResultVO) - psm.toJson - } -} \ No newline at end of file diff --git a/akka-bbb-apps/src/main/scala/org/bigbluebutton/core/pubsub/senders/PresentationEventRedisPublisher.scala b/akka-bbb-apps/src/main/scala/org/bigbluebutton/core/pubsub/senders/PresentationEventRedisPublisher.scala deleted file mode 100755 index 78752b5a29621f86fb4bcf8714620704d85315b7..0000000000000000000000000000000000000000 --- a/akka-bbb-apps/src/main/scala/org/bigbluebutton/core/pubsub/senders/PresentationEventRedisPublisher.scala +++ /dev/null @@ -1,161 +0,0 @@ -package org.bigbluebutton.core.pubsub.senders - -import org.bigbluebutton.core.api.OutMessageListener2 -import org.bigbluebutton.core.apps.Page -import org.bigbluebutton.core.MessageSender -import org.bigbluebutton.core.api._ -import org.bigbluebutton.common.messages.MessagingConstants -import org.bigbluebutton.common.messages.PresentationRemovedMessage -import collection.JavaConverters._ -import scala.collection.JavaConversions._ -import org.bigbluebutton.common.messages.GetPresentationInfoReplyMessage - -class PresentationEventRedisPublisher(service: MessageSender) extends OutMessageListener2 { - def handleMessage(msg: IOutMessage) { - msg match { - case msg: ClearPresentationOutMsg => handleClearPresentationOutMsg(msg) - case msg: RemovePresentationOutMsg => handleRemovePresentationOutMsg(msg) - case msg: GetPresentationInfoOutMsg => handleGetPresentationInfoOutMsg(msg) - case msg: SendCursorUpdateOutMsg => handleSendCursorUpdateOutMsg(msg) - case msg: ResizeAndMoveSlideOutMsg => handleResizeAndMoveSlideOutMsg(msg) - case msg: GotoSlideOutMsg => handleGotoSlideOutMsg(msg) - case msg: SharePresentationOutMsg => handleSharePresentationOutMsg(msg) - case msg: GetSlideInfoOutMsg => handleGetSlideInfoOutMsg(msg) - case msg: PresentationConversionProgress => handlePresentationConversionProgress(msg) - case msg: PresentationConversionError => handlePresentationConversionError(msg) - case msg: PresentationPageGenerated => handlePresentationPageGenerated(msg) - case msg: PresentationConversionDone => handlePresentationConversionDone(msg) - case _ => // do nothing - } - } - - private def pageToMap(page: Page): java.util.Map[String, Any] = { - val res = new scala.collection.mutable.HashMap[String, Any] - res += "id" -> page.id - res += "num" -> page.num - res += "thumb_uri" -> page.thumbUri - res += "swf_uri" -> page.swfUri - res += "txt_uri" -> page.txtUri - res += "png_uri" -> page.pngUri - res += "current" -> page.current - res += "x_offset" -> page.xOffset - res += "y_offset" -> page.yOffset - res += "width_ratio" -> page.widthRatio - res += "height_ratio" -> page.heightRatio - - mapAsJavaMap(res) - } - - private def handleClearPresentationOutMsg(msg: ClearPresentationOutMsg) { - val json = PesentationMessageToJsonConverter.clearPresentationOutMsgToJson(msg) - service.send(MessagingConstants.FROM_PRESENTATION_CHANNEL, json) - } - - private def handleRemovePresentationOutMsg(msg: RemovePresentationOutMsg) { - val m = new PresentationRemovedMessage(msg.meetingID, msg.presentationID) - service.send(MessagingConstants.FROM_PRESENTATION_CHANNEL, m.toJson()) - } - - private def handleGetPresentationInfoOutMsg(msg: GetPresentationInfoOutMsg) { - // Create a map for our current presenter - val presenter = new java.util.HashMap[String, Object]() - presenter.put(Constants.USER_ID, msg.info.presenter.userId) - presenter.put(Constants.NAME, msg.info.presenter.name) - presenter.put(Constants.ASSIGNED_BY, msg.info.presenter.assignedBy) - - // Create an array for our presentations - val presentations = new java.util.ArrayList[java.util.Map[String, Object]] - msg.info.presentations.foreach { pres => - val presentation = new java.util.HashMap[String, Object]() - presentation.put(Constants.ID, pres.id) - presentation.put(Constants.NAME, pres.name) - presentation.put(Constants.CURRENT, pres.current: java.lang.Boolean) - - // Get the pages for a presentation - val pages = new java.util.ArrayList[java.util.Map[String, Any]]() - pres.pages.values foreach { p => - pages.add(pageToMap(p)) - } - // store the pages in the presentation - presentation.put(Constants.PAGES, pages) - - // add this presentation into our presentations list - presentations.add(presentation); - } - - val reply = new GetPresentationInfoReplyMessage(msg.meetingID, msg.requesterID, presenter, presentations) - - val json = PesentationMessageToJsonConverter.getPresentationInfoOutMsgToJson(msg) - service.send(MessagingConstants.FROM_PRESENTATION_CHANNEL, json) - } - - private def handleSendCursorUpdateOutMsg(msg: SendCursorUpdateOutMsg) { - val json = PesentationMessageToJsonConverter.sendCursorUpdateOutMsgToJson(msg) - service.send(MessagingConstants.FROM_PRESENTATION_CHANNEL, json) - } - - private def handleResizeAndMoveSlideOutMsg(msg: ResizeAndMoveSlideOutMsg) { - val json = PesentationMessageToJsonConverter.resizeAndMoveSlideOutMsgToJson(msg) - service.send(MessagingConstants.FROM_PRESENTATION_CHANNEL, json) - } - - private def handleGotoSlideOutMsg(msg: GotoSlideOutMsg) { - val json = PesentationMessageToJsonConverter.gotoSlideOutMsgToJson(msg) - service.send(MessagingConstants.FROM_PRESENTATION_CHANNEL, json) - } - - private def handleSharePresentationOutMsg(msg: SharePresentationOutMsg) { - val json = PesentationMessageToJsonConverter.sharePresentationOutMsgToJson(msg) - service.send(MessagingConstants.FROM_PRESENTATION_CHANNEL, json) - } - - private def handleGetSlideInfoOutMsg(msg: GetSlideInfoOutMsg) { - val json = PesentationMessageToJsonConverter.getSlideInfoOutMsgToJson(msg) - service.send(MessagingConstants.FROM_PRESENTATION_CHANNEL, json) - } - - private def handleGetPreuploadedPresentationsOutMsg(msg: GetPreuploadedPresentationsOutMsg) { - val json = PesentationMessageToJsonConverter.getPreuploadedPresentationsOutMsgToJson(msg) - service.send(MessagingConstants.FROM_PRESENTATION_CHANNEL, json) - } - - private def handlePresentationConversionProgress(msg: PresentationConversionProgress) { - val json = PesentationMessageToJsonConverter.presentationConversionProgressToJson(msg) - service.send(MessagingConstants.FROM_PRESENTATION_CHANNEL, json) - } - - private def handlePresentationConversionError(msg: PresentationConversionError) { - val json = PesentationMessageToJsonConverter.presentationConversionErrorToJson(msg) - service.send(MessagingConstants.FROM_PRESENTATION_CHANNEL, json) - } - - private def handlePresentationPageGenerated(msg: PresentationPageGenerated) { - val json = PesentationMessageToJsonConverter.presentationPageGenerated(msg) - service.send(MessagingConstants.FROM_PRESENTATION_CHANNEL, json) - } - - private def handlePresentationConversionDone(msg: PresentationConversionDone) { - val json = PesentationMessageToJsonConverter.presentationConversionDoneToJson(msg) - service.send(MessagingConstants.FROM_PRESENTATION_CHANNEL, json) - } - - private def handlePresentationChanged(msg: PresentationChanged) { - val json = PesentationMessageToJsonConverter.presentationChangedToJson(msg) - service.send(MessagingConstants.FROM_PRESENTATION_CHANNEL, json) - } - - private def handleGetPresentationStatusReply(msg: GetPresentationStatusReply) { - val json = PesentationMessageToJsonConverter.getPresentationStatusReplyToJson(msg) - service.send(MessagingConstants.FROM_PRESENTATION_CHANNEL, json) - } - - private def handlePresentationRemoved(msg: PresentationRemoved) { - val json = PesentationMessageToJsonConverter.presentationRemovedToJson(msg) - service.send(MessagingConstants.FROM_PRESENTATION_CHANNEL, json) - } - - private def handlePageChanged(msg: PageChanged) { - val json = PesentationMessageToJsonConverter.pageChangedToJson(msg) - service.send(MessagingConstants.FROM_PRESENTATION_CHANNEL, json) - } -} \ No newline at end of file diff --git a/akka-bbb-apps/src/main/scala/org/bigbluebutton/core/pubsub/senders/WhiteboardEventRedisPublisher.scala b/akka-bbb-apps/src/main/scala/org/bigbluebutton/core/pubsub/senders/WhiteboardEventRedisPublisher.scala deleted file mode 100755 index b48713f2c46f10c1466809670369ffe24aee655d..0000000000000000000000000000000000000000 --- a/akka-bbb-apps/src/main/scala/org/bigbluebutton/core/pubsub/senders/WhiteboardEventRedisPublisher.scala +++ /dev/null @@ -1,54 +0,0 @@ -package org.bigbluebutton.core.pubsub.senders - -import org.bigbluebutton.core.api._ -import scala.collection.JavaConversions._ -import scala.collection.immutable.StringOps -import org.bigbluebutton.core.MessageSender -import org.bigbluebutton.common.messages.MessagingConstants -import com.google.gson.Gson; -import com.google.gson.reflect.TypeToken; - -class WhiteboardEventRedisPublisher(service: MessageSender) extends OutMessageListener2 { - def handleMessage(msg: IOutMessage) { - msg match { - case msg: GetWhiteboardShapesReply => handleGetWhiteboardShapesReply(msg) - case msg: SendWhiteboardAnnotationEvent => handleSendWhiteboardAnnotationEvent(msg) - case msg: ClearWhiteboardEvent => handleClearWhiteboardEvent(msg) - case msg: UndoWhiteboardEvent => handleUndoWhiteboardEvent(msg) - case msg: WhiteboardEnabledEvent => handleWhiteboardEnabledEvent(msg) - case msg: IsWhiteboardEnabledReply => handleIsWhiteboardEnabledReply(msg) - case _ => //println("Unhandled message in UsersClientMessageSender") - } - } - - private def handleGetWhiteboardShapesReply(msg: GetWhiteboardShapesReply) { - val json = WhiteboardMessageToJsonConverter.getWhiteboardShapesReplyToJson(msg) - service.send(MessagingConstants.FROM_WHITEBOARD_CHANNEL, json) - } - - private def handleSendWhiteboardAnnotationEvent(msg: SendWhiteboardAnnotationEvent) { - val json = WhiteboardMessageToJsonConverter.sendWhiteboardAnnotationEventToJson(msg) - service.send(MessagingConstants.FROM_WHITEBOARD_CHANNEL, json) - } - - private def handleClearWhiteboardEvent(msg: ClearWhiteboardEvent) { - val json = WhiteboardMessageToJsonConverter.clearWhiteboardEventToJson(msg) - service.send(MessagingConstants.FROM_WHITEBOARD_CHANNEL, json) - } - - private def handleUndoWhiteboardEvent(msg: UndoWhiteboardEvent) { - val json = WhiteboardMessageToJsonConverter.undoWhiteboardEventToJson(msg) - service.send(MessagingConstants.FROM_WHITEBOARD_CHANNEL, json) - } - - private def handleWhiteboardEnabledEvent(msg: WhiteboardEnabledEvent) { - val json = WhiteboardMessageToJsonConverter.whiteboardEnabledEventToJson(msg) - service.send(MessagingConstants.FROM_WHITEBOARD_CHANNEL, json) - } - - private def handleIsWhiteboardEnabledReply(msg: IsWhiteboardEnabledReply) { - val json = WhiteboardMessageToJsonConverter.isWhiteboardEnabledReplyToJson(msg) - service.send(MessagingConstants.FROM_WHITEBOARD_CHANNEL, json) - } - -} \ No newline at end of file diff --git a/akka-bbb-apps/src/main/scala/org/bigbluebutton/core/recorders/ChatEventRedisRecorder.scala b/akka-bbb-apps/src/main/scala/org/bigbluebutton/core/recorders/ChatEventRedisRecorder.scala deleted file mode 100755 index b547c006082abcef90c2a72844d255646d2e78d4..0000000000000000000000000000000000000000 --- a/akka-bbb-apps/src/main/scala/org/bigbluebutton/core/recorders/ChatEventRedisRecorder.scala +++ /dev/null @@ -1,29 +0,0 @@ -package org.bigbluebutton.core.recorders - -import org.bigbluebutton.core.api._ -import scala.collection.JavaConversions._ -import org.bigbluebutton.core.service.recorder.RecorderApplication -import org.bigbluebutton.core.recorders.events.PublicChatRecordEvent - -class ChatEventRedisRecorder(recorder: RecorderApplication) extends OutMessageListener2 { - - def handleMessage(msg: IOutMessage) { - msg match { - case msg: SendPublicMessageEvent => handleSendPublicMessageEvent(msg) - case _ => // do nothing - } - } - - private def handleSendPublicMessageEvent(msg: SendPublicMessageEvent) { - if (msg.recorded) { - val message = mapAsJavaMap(msg.message) - val ev = new PublicChatRecordEvent(); - ev.setTimestamp(TimestampGenerator.generateTimestamp); - ev.setMeetingId(msg.meetingID); - ev.setSender(message.get("fromUsername")); - ev.setMessage(message.get("message")); - ev.setColor(message.get("fromColor")); - recorder.record(msg.meetingID, ev); - } - } -} \ No newline at end of file diff --git a/akka-bbb-apps/src/main/scala/org/bigbluebutton/core/recorders/PresentationEventRedisRecorder.scala b/akka-bbb-apps/src/main/scala/org/bigbluebutton/core/recorders/PresentationEventRedisRecorder.scala deleted file mode 100755 index 8b8cf67f95f7c9f19e41f8c37f3a96bd7fffcefe..0000000000000000000000000000000000000000 --- a/akka-bbb-apps/src/main/scala/org/bigbluebutton/core/recorders/PresentationEventRedisRecorder.scala +++ /dev/null @@ -1,126 +0,0 @@ -package org.bigbluebutton.core.recorders - -import org.bigbluebutton.core.api.OutMessageListener2 -import org.bigbluebutton.core.api.IOutMessage -import org.bigbluebutton.core.api.GotoSlideOutMsg -import org.bigbluebutton.core.api.ResizeAndMoveSlideOutMsg -import org.bigbluebutton.core.api.RemovePresentationOutMsg -import org.bigbluebutton.core.api.SharePresentationOutMsg -import org.bigbluebutton.core.api.SendCursorUpdateOutMsg -import org.bigbluebutton.core.api.ClearPresentationOutMsg -import org.bigbluebutton.core.api.PresentationConversionDone -import org.bigbluebutton.core.api.TimestampGenerator -import org.bigbluebutton.core.service.recorder.RecorderApplication -import org.bigbluebutton.core.recorders.events.ConversionCompletedPresentationRecordEvent -import org.bigbluebutton.core.recorders.events.GotoSlidePresentationRecordEvent -import org.bigbluebutton.core.recorders.events.ResizeAndMoveSlidePresentationRecordEvent -import org.bigbluebutton.core.recorders.events.RemovePresentationPresentationRecordEvent -import org.bigbluebutton.core.recorders.events.SharePresentationPresentationRecordEvent -import org.bigbluebutton.core.recorders.events.CursorUpdateRecordEvent - -class PresentationEventRedisRecorder(recorder: RecorderApplication) extends OutMessageListener2 { - private val GENERATED_SLIDE_KEY = "GENERATED_SLIDE"; - private val CONVERSION_COMPLETED_KEY = "CONVERSION_COMPLETED"; - - def handleMessage(msg: IOutMessage) { - msg match { - case msg: ClearPresentationOutMsg => handleClearPresentationOutMsg(msg) - case msg: RemovePresentationOutMsg => handleRemovePresentationOutMsg(msg) - case msg: SendCursorUpdateOutMsg => handleSendCursorUpdateOutMsg(msg) - case msg: ResizeAndMoveSlideOutMsg => handleResizeAndMoveSlideOutMsg(msg) - case msg: GotoSlideOutMsg => handleGotoSlideOutMsg(msg) - case msg: SharePresentationOutMsg => handleSharePresentationOutMsg(msg) - case _ => // do nothing - } - } - - private def handleClearPresentationOutMsg(msg: ClearPresentationOutMsg) { - - } - - private def handlePresentationConversionDone(msg: PresentationConversionDone) { - if (msg.recorded) { - val event = new ConversionCompletedPresentationRecordEvent(); - event.setMeetingId(msg.meetingID); - event.setTimestamp(TimestampGenerator.generateTimestamp); - event.setPresentationName(msg.presentation.id); - event.setOriginalFilename(msg.presentation.name); - recorder.record(msg.meetingID, event); - } - - } - - private def handleGotoSlideOutMsg(msg: GotoSlideOutMsg) { - if (msg.recorded) { - val event = new GotoSlidePresentationRecordEvent(); - event.setMeetingId(msg.meetingID); - event.setTimestamp(TimestampGenerator.generateTimestamp); - event.setSlide(msg.page.num); - event.setId(msg.page.id); - event.setNum(msg.page.num); - event.setThumbUri(msg.page.thumbUri); - event.setSwfUri(msg.page.swfUri); - event.setTxtUri(msg.page.txtUri); - event.setPngUri(msg.page.pngUri); - event.setXOffset(msg.page.xOffset); - event.setYOffset(msg.page.yOffset); - event.setWidthRatio(msg.page.widthRatio); - event.setHeightRatio(msg.page.heightRatio); - recorder.record(msg.meetingID, event); - } - } - - private def handleResizeAndMoveSlideOutMsg(msg: ResizeAndMoveSlideOutMsg) { - if (msg.recorded) { - val event = new ResizeAndMoveSlidePresentationRecordEvent(); - event.setMeetingId(msg.meetingID); - event.setTimestamp(TimestampGenerator.generateTimestamp); - event.setId(msg.page.id); - event.setNum(msg.page.num); - event.setThumbUri(msg.page.thumbUri); - event.setSwfUri(msg.page.swfUri); - event.setTxtUri(msg.page.txtUri); - event.setPngUri(msg.page.pngUri); - event.setXOffset(msg.page.xOffset); - event.setYOffset(msg.page.yOffset); - event.setWidthRatio(msg.page.widthRatio); - event.setHeightRatio(msg.page.heightRatio); - - recorder.record(msg.meetingID, event); - } - } - - private def handleRemovePresentationOutMsg(msg: RemovePresentationOutMsg) { - if (msg.recorded) { - val event = new RemovePresentationPresentationRecordEvent(); - event.setMeetingId(msg.meetingID); - event.setTimestamp(TimestampGenerator.generateTimestamp); - event.setPresentationName(msg.presentationID); - recorder.record(msg.meetingID, event); - } - } - - private def handleSharePresentationOutMsg(msg: SharePresentationOutMsg) { - if (msg.recorded) { - val event = new SharePresentationPresentationRecordEvent(); - event.setMeetingId(msg.meetingID); - event.setTimestamp(TimestampGenerator.generateTimestamp); - event.setPresentationName(msg.presentation.id); - event.setOriginalFilename(msg.presentation.name); - event.setShare(true); - recorder.record(msg.meetingID, event); - } - } - - private def handleSendCursorUpdateOutMsg(msg: SendCursorUpdateOutMsg) { - if (msg.recorded) { - val event = new CursorUpdateRecordEvent(); - event.setMeetingId(msg.meetingID); - event.setTimestamp(TimestampGenerator.generateTimestamp); - event.setXPercent(msg.xPercent); - event.setYPercent(msg.yPercent); - - recorder.record(msg.meetingID, event); - } - } -} \ No newline at end of file diff --git a/akka-bbb-apps/src/main/scala/org/bigbluebutton/core/recorders/UsersEventRedisRecorder.scala b/akka-bbb-apps/src/main/scala/org/bigbluebutton/core/recorders/UsersEventRedisRecorder.scala deleted file mode 100755 index 8e90be985a7fb35f2d84710fcc9ec903f57e371c..0000000000000000000000000000000000000000 --- a/akka-bbb-apps/src/main/scala/org/bigbluebutton/core/recorders/UsersEventRedisRecorder.scala +++ /dev/null @@ -1,214 +0,0 @@ -package org.bigbluebutton.core.recorders - -import org.bigbluebutton.core.api._ -import org.bigbluebutton.core.service.recorder.RecorderApplication -import org.bigbluebutton.core.recorders.events.ParticipantEndAndKickAllRecordEvent -import org.bigbluebutton.core.recorders.events.ParticipantJoinRecordEvent -import org.bigbluebutton.core.recorders.events.StartRecordingVoiceRecordEvent -import org.bigbluebutton.core.recorders.events.ParticipantMutedVoiceRecordEvent -import org.bigbluebutton.core.recorders.events.ParticipantTalkingVoiceRecordEvent -import org.bigbluebutton.core.recorders.events.ParticipantJoinedVoiceRecordEvent -import org.bigbluebutton.core.recorders.events.ParticipantLeftVoiceRecordEvent -import org.bigbluebutton.core.recorders.events.RecordStatusRecordEvent -import org.bigbluebutton.core.recorders.events.ParticipantLeftRecordEvent -import org.bigbluebutton.core.recorders.events.ParticipantStatusChangeRecordEvent -import org.bigbluebutton.core.recorders.events.AssignPresenterRecordEvent - -class UsersEventRedisRecorder(recorder: RecorderApplication) extends OutMessageListener2 { - - def handleMessage(msg: IOutMessage) { - msg match { - case msg: EndAndKickAll => handleEndAndKickAll(msg) - case msg: PresenterAssigned => handleAssignPresenter(msg) - case msg: UserJoined => handleUserJoined(msg) - case msg: UserLeft => handleUserLeft(msg) - case msg: UserStatusChange => handleUserStatusChange(msg) - case msg: UserVoiceMuted => handleUserVoiceMuted(msg) - case msg: UserVoiceTalking => handleUserVoiceTalking(msg) - case msg: UserJoinedVoice => handleUserJoinedVoice(msg) - case msg: UserLeftVoice => handleUserLeftVoice(msg) - case msg: RecordingStatusChanged => handleRecordingStatusChanged(msg) - case msg: UserRaisedHand => handleUserRaisedHand(msg) - case msg: UserLoweredHand => handleUserLoweredHand(msg) - case msg: UserSharedWebcam => handleUserSharedWebcam(msg) - case msg: UserUnsharedWebcam => handleUserUnsharedWebcam(msg) - case msg: VoiceRecordingStarted => handleVoiceRecordingStarted(msg) - case msg: VoiceRecordingStopped => handleVoiceRecordingStopped(msg) - case _ => //println("Unhandled message in UsersClientMessageSender") - } - } - - private def handleEndAndKickAll(msg: EndAndKickAll): Unit = { - if (msg.recorded) { - val ev = new ParticipantEndAndKickAllRecordEvent(); - ev.setTimestamp(TimestampGenerator.generateTimestamp); - ev.setMeetingId(msg.meetingID); - recorder.record(msg.meetingID, ev); - } - } - - private def handleUserJoined(msg: UserJoined): Unit = { - if (msg.recorded) { - val ev = new ParticipantJoinRecordEvent(); - ev.setTimestamp(TimestampGenerator.generateTimestamp); - ev.setUserId(msg.user.userID); - ev.setName(msg.user.name); - ev.setMeetingId(msg.meetingID); - ev.setRole(msg.user.role.toString()); - - recorder.record(msg.meetingID, ev); - } - } - - def handleVoiceRecordingStarted(msg: VoiceRecordingStarted) { - if (msg.recorded) { - val evt = new StartRecordingVoiceRecordEvent(true); - evt.setMeetingId(msg.meetingID); - evt.setTimestamp(TimestampGenerator.generateTimestamp); - evt.setBridge(msg.confNum); - evt.setRecordingTimestamp(msg.timestamp); - evt.setFilename(msg.recordingFile); - recorder.record(msg.meetingID, evt); - } - } - - def handleVoiceRecordingStopped(msg: VoiceRecordingStopped) { - if (msg.recorded) { - val evt = new StartRecordingVoiceRecordEvent(false); - evt.setMeetingId(msg.meetingID); - evt.setTimestamp(TimestampGenerator.generateTimestamp); - evt.setBridge(msg.confNum); - evt.setRecordingTimestamp(msg.timestamp); - evt.setFilename(msg.recordingFile); - recorder.record(msg.meetingID, evt); - } - } - - def handleUserVoiceMuted(msg: UserVoiceMuted) { - if (msg.recorded) { - val ev = new ParticipantMutedVoiceRecordEvent() - ev.setMeetingId(msg.meetingID); - ev.setTimestamp(TimestampGenerator.generateTimestamp); - ev.setBridge(msg.confNum); - ev.setParticipant(msg.user.voiceUser.userId); - ev.setMuted(msg.user.voiceUser.muted); - - recorder.record(msg.meetingID, ev); - } - } - - def handleUserVoiceTalking(msg: UserVoiceTalking) { - if (msg.recorded) { - val evt = new ParticipantTalkingVoiceRecordEvent(); - evt.setMeetingId(msg.meetingID); - evt.setTimestamp(TimestampGenerator.generateTimestamp); - evt.setBridge(msg.confNum); - evt.setParticipant(msg.user.userID); - evt.setTalking(msg.user.voiceUser.talking); - - recorder.record(msg.meetingID, evt); - } - } - - def handleUserJoinedVoice(msg: UserJoinedVoice) { - if (msg.recorded) { - val evt = new ParticipantJoinedVoiceRecordEvent(); - evt.setMeetingId(msg.meetingID); - evt.setTimestamp(TimestampGenerator.generateTimestamp); - evt.setBridge(msg.confNum); - evt.setParticipant(msg.user.voiceUser.userId); - evt.setCallerName(msg.user.voiceUser.callerName); - evt.setCallerNumber(msg.user.voiceUser.callerNum); - evt.setMuted(msg.user.voiceUser.muted); - evt.setTalking(msg.user.voiceUser.talking); - - recorder.record(msg.meetingID, evt) - } - } - - def handleUserLeftVoice(msg: UserLeftVoice) { - if (msg.recorded) { - val evt = new ParticipantLeftVoiceRecordEvent(); - evt.setMeetingId(msg.meetingID); - evt.setTimestamp(TimestampGenerator.generateTimestamp); - evt.setBridge(msg.confNum); - evt.setParticipant(msg.user.voiceUser.userId); - recorder.record(msg.meetingID, evt); - } - } - - def handleRecordingStatusChanged(msg: RecordingStatusChanged) { - if (msg.recorded) { - val evt = new RecordStatusRecordEvent(); - evt.setMeetingId(msg.meetingID); - evt.setTimestamp(TimestampGenerator.generateTimestamp); - evt.setUserId(msg.userId); - evt.setRecordingStatus(msg.recording.toString); - - recorder.record(msg.meetingID, evt); - } - } - - private def handleUserLeft(msg: UserLeft): Unit = { - if (msg.recorded) { - val ev = new ParticipantLeftRecordEvent(); - ev.setTimestamp(TimestampGenerator.generateTimestamp); - ev.setUserId(msg.user.userID); - ev.setMeetingId(msg.meetingID); - - recorder.record(msg.meetingID, ev); - } - - } - - private def handleUserRaisedHand(msg: UserRaisedHand) { - val status = UserStatusChange(msg.meetingID, msg.recorded, - msg.userID, "raiseHand", true: java.lang.Boolean) - handleUserStatusChange(status) - } - - private def handleUserLoweredHand(msg: UserLoweredHand) { - val status = UserStatusChange(msg.meetingID, msg.recorded, - msg.userID, "raiseHand", false: java.lang.Boolean) - handleUserStatusChange(status) - } - - private def handleUserSharedWebcam(msg: UserSharedWebcam) { - val status = UserStatusChange(msg.meetingID, msg.recorded, - msg.userID, "hasStream", "true,stream=" + msg.stream) - handleUserStatusChange(status) - } - - private def handleUserUnsharedWebcam(msg: UserUnsharedWebcam) { - val status = UserStatusChange(msg.meetingID, msg.recorded, - msg.userID, "hasStream", "false,stream=" + msg.stream) - handleUserStatusChange(status) - } - - private def handleUserStatusChange(msg: UserStatusChange): Unit = { - if (msg.recorded) { - val ev = new ParticipantStatusChangeRecordEvent(); - ev.setTimestamp(TimestampGenerator.generateTimestamp); - ev.setUserId(msg.userID); - ev.setMeetingId(msg.meetingID); - ev.setStatus(msg.status); - ev.setValue(msg.value.toString()); - - recorder.record(msg.meetingID, ev); - } - } - - private def handleAssignPresenter(msg: PresenterAssigned): Unit = { - if (msg.recorded) { - val event = new AssignPresenterRecordEvent(); - event.setMeetingId(msg.meetingID); - event.setTimestamp(TimestampGenerator.generateTimestamp); - event.setUserId(msg.presenter.presenterID); - event.setName(msg.presenter.presenterName); - event.setAssignedBy(msg.presenter.assignedBy); - - recorder.record(msg.meetingID, event); - } - - } -} \ No newline at end of file diff --git a/akka-bbb-apps/src/main/scala/org/bigbluebutton/core/recorders/WhiteboardEventRedisRecorder.scala b/akka-bbb-apps/src/main/scala/org/bigbluebutton/core/recorders/WhiteboardEventRedisRecorder.scala deleted file mode 100755 index cf098503de628dbbdd2c4911127868d7b726e420..0000000000000000000000000000000000000000 --- a/akka-bbb-apps/src/main/scala/org/bigbluebutton/core/recorders/WhiteboardEventRedisRecorder.scala +++ /dev/null @@ -1,100 +0,0 @@ -package org.bigbluebutton.core.recorders - -import org.bigbluebutton.core.api._ -import scala.collection.JavaConversions._ -import scala.collection.immutable.StringOps -import org.bigbluebutton.core.service.recorder.RecorderApplication -import org.bigbluebutton.core.service.whiteboard.WhiteboardKeyUtil -import org.bigbluebutton.core.recorders.events.ModifyTextWhiteboardRecordEvent -import org.bigbluebutton.core.recorders.events.AddShapeWhiteboardRecordEvent -import org.bigbluebutton.core.recorders.events.ClearPageWhiteboardRecordEvent -import org.bigbluebutton.core.recorders.events.UndoShapeWhiteboardRecordEvent - -class WhiteboardEventRedisRecorder(recorder: RecorderApplication) extends OutMessageListener2 { - - def handleMessage(msg: IOutMessage) { - msg match { - case msg: SendWhiteboardAnnotationEvent => handleSendWhiteboardAnnotationEvent(msg) - case msg: ClearWhiteboardEvent => handleClearWhiteboardEvent(msg) - case msg: UndoWhiteboardEvent => handleUndoWhiteboardEvent(msg) - case _ => //println("Unhandled message in UsersClientMessageSender") - } - } - - private def getPresentationId(whiteboardId: String): String = { - // Need to split the whiteboard id into presenation id and page num as the old - // recording expects them - val strId = new StringOps(whiteboardId) - val ids = strId.split('/') - var presId: String = "" - if (ids.length == 2) { - presId = ids(0) - } - - presId - } - - private def getPageNum(whiteboardId: String): String = { - val strId = new StringOps(whiteboardId) - val ids = strId.split('/') - var pageNum = "0" - if (ids.length == 2) { - pageNum = ids(1) - } - pageNum - } - - private def handleSendWhiteboardAnnotationEvent(msg: SendWhiteboardAnnotationEvent) { - if ((msg.shape.shapeType == WhiteboardKeyUtil.TEXT_TYPE) && (msg.shape.status != WhiteboardKeyUtil.TEXT_CREATED_STATUS)) { - - val event = new ModifyTextWhiteboardRecordEvent() - event.setMeetingId(msg.meetingID) - event.setTimestamp(TimestampGenerator.generateTimestamp) - event.setPresentation(getPresentationId(msg.whiteboardId)) - event.setPageNumber(getPageNum(msg.whiteboardId)) - event.setWhiteboardId(msg.whiteboardId) - event.addAnnotation(mapAsJavaMap(msg.shape.shape)) - recorder.record(msg.meetingID, event) - } else if ((msg.shape.shapeType == WhiteboardKeyUtil.POLL_RESULT_TYPE)) { - val event = new AddShapeWhiteboardRecordEvent() - event.setMeetingId(msg.meetingID) - event.setTimestamp(TimestampGenerator.generateTimestamp) - event.setPresentation(getPresentationId(msg.whiteboardId)) - event.setPageNumber(getPageNum(msg.whiteboardId)) - event.setWhiteboardId(msg.whiteboardId); - event.addAnnotation(mapAsJavaMap(msg.shape.shape)) - recorder.record(msg.meetingID, event) - } else { - val event = new AddShapeWhiteboardRecordEvent() - event.setMeetingId(msg.meetingID) - event.setTimestamp(TimestampGenerator.generateTimestamp) - event.setPresentation(getPresentationId(msg.whiteboardId)) - event.setPageNumber(getPageNum(msg.whiteboardId)) - event.setWhiteboardId(msg.whiteboardId); - event.addAnnotation(mapAsJavaMap(msg.shape.shape)) - recorder.record(msg.meetingID, event) - } - } - - private def handleClearWhiteboardEvent(msg: ClearWhiteboardEvent) { - val event = new ClearPageWhiteboardRecordEvent() - event.setMeetingId(msg.meetingID) - event.setTimestamp(TimestampGenerator.generateTimestamp) - event.setPresentation(getPresentationId(msg.whiteboardId)) - event.setPageNumber(getPageNum(msg.whiteboardId)) - event.setWhiteboardId(msg.whiteboardId) - recorder.record(msg.meetingID, event) - } - - private def handleUndoWhiteboardEvent(msg: UndoWhiteboardEvent) { - val event = new UndoShapeWhiteboardRecordEvent() - event.setMeetingId(msg.meetingID) - event.setTimestamp(TimestampGenerator.generateTimestamp) - event.setPresentation(getPresentationId(msg.whiteboardId)) - event.setPageNumber(getPageNum(msg.whiteboardId)) - event.setWhiteboardId(msg.whiteboardId) - event.setShapeId(msg.shapeId); - recorder.record(msg.meetingID, event) - } - -} \ No newline at end of file