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 19246b750d086d1046ef60d008744befd6431a3c..0770d5a7c00a6005ba047089c8727ee99686352b 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 @@ -171,6 +171,8 @@ class MeetingActor(val mProps: MeetingProperties, val outGW: MessageOutGateway) handleRespondToPollRequest(msg) case msg: GetPollRequest => handleGetPollRequest(msg) + case msg: GetCurrentPollRequest => + handleGetCurrentPollRequest(msg) case msg: EndMeeting => handleEndMeeting(msg) case StopMeetingActor => //exit diff --git a/akka-bbb-apps/src/main/scala/org/bigbluebutton/core/api/InMessages.scala b/akka-bbb-apps/src/main/scala/org/bigbluebutton/core/api/InMessages.scala index f8db8cf13bf4e2094e4d275e98bb31aa9fd17612..cd33971a88d46c2f07e8af59e42f4a56ce55222e 100755 --- a/akka-bbb-apps/src/main/scala/org/bigbluebutton/core/api/InMessages.scala +++ b/akka-bbb-apps/src/main/scala/org/bigbluebutton/core/api/InMessages.scala @@ -84,6 +84,7 @@ case class ShowPollResultRequest(meetingID: String, requesterId: String, pollId: case class HidePollResultRequest(meetingID: String, requesterId: String, pollId: String) extends InMessage case class RespondToPollRequest(meetingID: String, requesterId: String, pollId: String, questionId: Int, answerId: Int) extends InMessage case class GetPollRequest(meetingID: String, requesterId: String, pollId: String) extends InMessage +case class GetCurrentPollRequest(meetingID: String, requesterId: String) extends InMessage // Voice case class InitAudioSettings(meetingID: String, requesterID: String, muted: Boolean) extends InMessage diff --git a/akka-bbb-apps/src/main/scala/org/bigbluebutton/core/api/OutMessages.scala b/akka-bbb-apps/src/main/scala/org/bigbluebutton/core/api/OutMessages.scala index 500246c8b596ec8e29e859d58b053c371b435e49..16b79a65e9176c21405151f2b812ffd4a4682a81 100755 --- a/akka-bbb-apps/src/main/scala/org/bigbluebutton/core/api/OutMessages.scala +++ b/akka-bbb-apps/src/main/scala/org/bigbluebutton/core/api/OutMessages.scala @@ -115,6 +115,9 @@ case class PollShowResultMessage(meetingID: String, recorded: Boolean, requester case class ShowPollResultReplyMessage(meetingID: String, recorded: Boolean, result: RequestResult, requesterId: String, pollId: String) extends IOutMessage case class PollHideResultMessage(meetingID: String, recorded: Boolean, requesterId: String, pollId: String, poll: PollVO) extends IOutMessage case class HidePollResultReplyMessage(meetingID: String, recorded: Boolean, result: RequestResult, requesterId: String, pollId: String) extends IOutMessage +case class UserRespondedToPollMessage(meetingID: String, recorded: Boolean, requesterId: String, pollId: String, poll: PollVO) extends IOutMessage +case class RespondToPollReplyMessage(meetingID: String, recorded: Boolean, result: RequestResult, requesterId: String, pollId: String) extends IOutMessage +case class GetCurrentPollReplyMessage(meetingID: String, recorded: Boolean, requesterId: String, hasPoll: Boolean, poll: Option[PollVO]) extends IOutMessage // Whiteboard case class GetWhiteboardShapesReply(meetingID: String, recorded: Boolean, requesterID: String, whiteboardId: String, shapes: Array[AnnotationVO], replyTo: String) extends IOutMessage 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 79e525744f1c1b1bdce4e8e431a60e77ba449aea..c8d7da311d2f71e0c111f3a6cb9d3838ac1db831 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 @@ -14,15 +14,29 @@ trait PollApp { } + def handleGetCurrentPollRequest(msg: GetCurrentPollRequest) { + pollModel.getCurrentPoll() match { + case Some(p) => { + if (p.started && p.stopped && p.showResult) { + outGW.send(new GetCurrentPollReplyMessage(mProps.meetingID, mProps.recorded, msg.requesterId, true, Some(p))) + } else { + outGW.send(new GetCurrentPollReplyMessage(mProps.meetingID, mProps.recorded, msg.requesterId, false, None)) + } + } + case None => { + outGW.send(new GetCurrentPollReplyMessage(mProps.meetingID, mProps.recorded, msg.requesterId, false, None)) + } + } + } + def handleRespondToPollRequest(msg: RespondToPollRequest) { pollModel.getPoll(msg.pollId) match { case Some(poll) => { - poll.hideResult() - outGW.send(new PollHideResultMessage(mProps.meetingID, mProps.recorded, msg.requesterId, msg.pollId, poll.toPollVO())) + handleRespondToPoll(poll, msg) } case None => { val result = new RequestResult(StatusCodes.NOT_FOUND, Some(Array(ErrorCodes.RESOURCE_NOT_FOUND))) - sender ! new HidePollResultReplyMessage(mProps.meetingID, mProps.recorded, result, msg.requesterId, msg.pollId) + sender ! new RespondToPollReplyMessage(mProps.meetingID, mProps.recorded, result, msg.requesterId, msg.pollId) } } } @@ -30,8 +44,8 @@ trait PollApp { def handleHidePollResultRequest(msg: HidePollResultRequest) { pollModel.getPoll(msg.pollId) match { case Some(poll) => { - poll.hideResult() - outGW.send(new PollHideResultMessage(mProps.meetingID, mProps.recorded, msg.requesterId, msg.pollId, poll.toPollVO())) + pollModel.hidePollResult(msg.pollId) + outGW.send(new PollHideResultMessage(mProps.meetingID, mProps.recorded, msg.requesterId, msg.pollId, poll)) } case None => { val result = new RequestResult(StatusCodes.NOT_FOUND, Some(Array(ErrorCodes.RESOURCE_NOT_FOUND))) @@ -43,8 +57,8 @@ trait PollApp { def handleShowPollResultRequest(msg: ShowPollResultRequest) { pollModel.getPoll(msg.pollId) match { case Some(poll) => { - poll.showResult() - outGW.send(new PollShowResultMessage(mProps.meetingID, mProps.recorded, msg.requesterId, msg.pollId, poll.toPollVO())) + pollModel.showPollResult(poll.id) + outGW.send(new PollShowResultMessage(mProps.meetingID, mProps.recorded, msg.requesterId, msg.pollId, poll)) } case None => { val result = new RequestResult(StatusCodes.NOT_FOUND, Some(Array(ErrorCodes.RESOURCE_NOT_FOUND))) @@ -56,7 +70,7 @@ trait PollApp { def handleStopPollRequest(msg: StopPollRequest) { pollModel.getPoll(msg.pollId) match { case Some(poll) => { - poll.stop() + pollModel.stopPoll(poll.id) outGW.send(new PollStoppedMessage(mProps.meetingID, mProps.recorded, msg.requesterId, msg.pollId)) } case None => { @@ -69,8 +83,8 @@ trait PollApp { def handleStartPollRequest(msg: StartPollRequest) { pollModel.getPoll(msg.pollId) match { case Some(poll) => { - poll.start() - outGW.send(new PollStartedMessage(mProps.meetingID, mProps.recorded, msg.requesterId, msg.pollId, poll.toPollVO())) + pollModel.startPoll(poll.id) + outGW.send(new PollStartedMessage(mProps.meetingID, mProps.recorded, msg.requesterId, msg.pollId, poll)) } case None => { val result = new RequestResult(StatusCodes.NOT_FOUND, Some(Array(ErrorCodes.RESOURCE_NOT_FOUND))) @@ -93,105 +107,19 @@ trait PollApp { } - private def handleRespondToPoll(poll: Poll, msg: RespondToPollRequest) { + private def handleRespondToPoll(poll: PollVO, msg: RespondToPollRequest) { if (hasUser(msg.requesterId)) { getUser(msg.requesterId) match { case Some(user) => { val responder = new Responder(user.userID, user.name) - poll.respondToQuestion(msg.questionId, msg.answerId, responder) - + pollModel.respondToQuestion(poll.id, msg.questionId, msg.answerId, responder) + outGW.send(new UserRespondedToPollMessage(mProps.meetingID, mProps.recorded, msg.requesterId, msg.pollId, poll)) + } + case None => { + val result = new RequestResult(StatusCodes.FORBIDDEN, Some(Array(ErrorCodes.RESOURCE_NOT_FOUND))) + sender ! new RespondToPollReplyMessage(mProps.meetingID, mProps.recorded, result, msg.requesterId, msg.pollId) } - case None => //do nothing } } } - - /* - def handleHidePollResult(msg: HidePollResult) { - val pollID = msg.pollID - - if (pollModel.hasPoll(pollID)) { - pollModel.hidePollResult(pollID) - outGW.send(new PollHideResultOutMsg(meetingID, recorded, pollID)) - } - } - - def handleShowPollResult(msg: ShowPollResult) { - val pollID = msg.pollID - - if (pollModel.hasPoll(pollID)) { - pollModel.showPollResult(pollID) - outGW.send(new PollShowResultOutMsg(meetingID, recorded, pollID)) - } - } - - - - def handleGetPolls(msg: GetPolls) { - var polls = pollModel.getPolls - outGW.send(new GetPollsReplyOutMsg(meetingID, recorded, msg.requesterID, polls)) - } - - def handleClearPoll(msg: ClearPoll) { - if (pollModel.clearPoll(msg.pollID)) { - outGW.send(new PollClearedOutMsg(meetingID, recorded, msg.pollID)) - } else { - print("PollApp:: handleClearPoll - " + msg.pollID + " not found") - } - } - - def handleStartPoll(msg: StartPoll) { - if (pollModel.hasPoll(msg.pollID)) { - pollModel.startPoll(msg.pollID) - outGW.send(new PollStartedOutMsg(meetingID, recorded, msg.pollID)) - } else { - print("PollApp:: handleStartPoll - " + msg.pollID + " not found") - } - } - - def handleStopPoll(msg: StopPoll) { - if (pollModel.hasPoll(msg.pollID)) { - pollModel.stopPoll(msg.pollID) - outGW.send(new PollStoppedOutMsg(meetingID, recorded, msg.pollID)) - } else { - print("PollApp:: handleStopPoll - " + msg.pollID + " not found") - } - } - - def handleSharePoll(msg: SharePoll) { - - } - - def handleRemovePoll(msg: RemovePoll) { - if (pollModel.hasPoll(msg.pollID)) { - pollModel.removePoll(msg.pollID) - outGW.send(new PollRemovedOutMsg(meetingID, recorded, msg.pollID)) - } else { - print("PollApp:: handleRemovePoll - " + msg.pollID + " not found") - } - } - - def handleDestroyPoll(msg: DestroyPoll) { - - } - - def handleUpdatePoll(msg: UpdatePoll) { - if (pollModel.updatePoll(msg.poll)) { - outGW.send(new PollUpdatedOutMsg(meetingID, recorded, msg.poll.id, msg.poll)) - } else { - print("PollApp:: handleUpdatePoll - " + msg.poll.id + " not found") - } - } - - def handlePreCreatedPoll(msg: PreCreatedPoll) { - pollModel.createPoll(msg.poll) - outGW.send(new PollCreatedOutMsg(meetingID, recorded, msg.poll.id, msg.poll)) - } - - def handleCreatePoll(msg: CreatePoll) { - pollModel.createPoll(msg.poll) - outGW.send(new PollCreatedOutMsg(meetingID, recorded, msg.poll.id, msg.poll)) - } - - */ } \ No newline at end of file diff --git a/akka-bbb-apps/src/main/scala/org/bigbluebutton/core/apps/PollModel.scala b/akka-bbb-apps/src/main/scala/org/bigbluebutton/core/apps/PollModel.scala index 36635571b2e32795f1e54bfce2a864ba741770a8..7e2c2c0f0a6e37d23184f4f65682bbb26f4ae85b 100755 --- a/akka-bbb-apps/src/main/scala/org/bigbluebutton/core/apps/PollModel.scala +++ b/akka-bbb-apps/src/main/scala/org/bigbluebutton/core/apps/PollModel.scala @@ -7,6 +7,8 @@ class PollModel { private val polls = new HashMap[String, Poll]() + private var currentPoll: Option[PollVO] = None + /** * * * Uncomment to create sample polls for manual testing purposes @@ -21,47 +23,12 @@ class PollModel { polls += poll.id -> poll } - def createPoll(pollVO: PollVO) { - val questions = new ArrayBuffer[Question] - /* - pollVO.questions.foreach(qv => { - val responses = new ArrayBuffer[Answer] - qv.responses.foreach(rv => { - val response = new Answer(rv.id, rv.text) - responses += response - }) - questions += new Question(qv.id, qv.multiResponse, qv.question, responses.toArray) - }) - - val poll = new Poll(pollVO.id, pollVO.title, questions.toArray) - polls += poll.id -> poll - - */ + def hasCurrentPoll(): Boolean = { + currentPoll != None } - def updatePoll(pollVO: PollVO): Boolean = { - var success = false - /* - polls.get(pollVO.id) match { - case Some(p) => { - val questions = new ArrayBuffer[Question] - pollVO.questions.foreach(qv => { - val responses = new ArrayBuffer[Response] - qv.responses.foreach(rv => { - val response = new Response(rv.id, rv.text) - responses += response - }) - questions += new Question(qv.id, qv.multiResponse, qv.question, responses.toArray) - }) - - val poll = new Poll(pollVO.id, pollVO.title, questions.toArray) - polls += poll.id -> poll - success = true - } - case None => success = false - } -*/ - success + def getCurrentPoll(): Option[PollVO] = { + currentPoll } def getPolls(): Array[PollVO] = { @@ -86,17 +53,12 @@ class PollModel { success } - def startPoll(pollId: String): Boolean = { - var success = false - polls.get(pollId) match { - case Some(p) => { - p.start - success = true - } - case None => success = false + def startPoll(pollId: String) { + polls.get(pollId) foreach { + p => + p.start() + currentPoll = Some(p.toPollVO()) } - - success } def removePoll(pollID: String): Boolean = { @@ -112,51 +74,38 @@ class PollModel { success } - def stopPoll(pollID: String): Boolean = { - var success = false - polls.get(pollID) match { - case Some(p) => { - p.stop - success = true - } - case None => success = false - } - - success + def stopPoll(pollId: String) { + polls.get(pollId) foreach (p => p.stop()) } - def hasPoll(pollID: String): Boolean = { - var present = false - polls.get(pollID) match { - case Some(p) => { - present = true - } - case None => present = false - } - - present + def hasPoll(pollId: String): Boolean = { + polls.get(pollId) != None } - def getPoll(pollId: String): Option[Poll] = { - polls.get(pollId) + def getPoll(pollId: String): Option[PollVO] = { + var pvo: Option[PollVO] = None + polls.get(pollId) foreach (p => pvo = Some(p.toPollVO())) + pvo } - def hidePollResult(pollID: String) { - polls.get(pollID) match { - case Some(p) => p.hideResult - case None => // do nothing + def hidePollResult(pollId: String) { + polls.get(pollId) foreach { + p => + p.hideResult() + currentPoll = None } } - def showPollResult(pollID: String) { - polls.get(pollID) match { - case Some(p) => p.showResult - case None => // do nothing + def showPollResult(pollId: String) { + polls.get(pollId) foreach { + p => + p.showResult + currentPoll = Some(p.toPollVO()) } } - def respondToQuestion(pollID: String, questionID: Int, responseID: Int, responder: Responder) { - polls.get(pollID) match { + def respondToQuestion(pollId: String, questionID: Int, responseID: Int, responder: Responder) { + polls.get(pollId) match { case Some(p) => { p.respondToQuestion(questionID, responseID, responder) }