Boolean becomeModerator, Boolean isSuperModerator,
Long organization_id, String colorObj) {
try {
log.debug("----------- setRoomValues");
// Return Object
RoomStatus roomStatus = new RoomStatus();
IConnection current = Red5.getConnectionLocal();
String streamid = current.getClient().getId();
Client currentClient = sessionManager.getClientByStreamId(streamid, null);
currentClient.setRoom_id(room_id);
currentClient.setRoomEnter(new Date());
currentClient.setOrganization_id(organization_id);
currentClient.setUsercolor(colorObj);
// Inject externalUserId if nothing is set yet
if (currentClient.getExternalUserId() == null) {
if (currentClient.getUser_id() != null) {
User us = usersDao.get(currentClient.getUser_id());
if (us != null) {
currentClient.setExternalUserId(us.getExternalUserId());
currentClient.setExternalUserType(us.getExternalUserType());
}
}
}
// This can be set without checking for Moderation Flag
currentClient.setIsSuperModerator(isSuperModerator);
this.sessionManager.updateClientByStreamId(streamid,
currentClient, true, null);
Room room = roomDao.get(room_id);
if (room.getShowMicrophoneStatus()) {
currentClient.setCanGiveAudio(true);
}
// Log the User
conferenceLogDao.addConferenceLog("roomEnter",
currentClient.getUser_id(), streamid, room_id,
currentClient.getUserip(), "",
currentClient.getExternalUserId(),
currentClient.getExternalUserType(),
currentClient.getMail(), currentClient.getFirstname(),
currentClient.getLastname());
// Check for Moderation LogicalRoom ENTER
List<Client> clientListRoom = sessionManager.getClientListByRoom(room_id);
// appointed meeting or moderated Room? => Check Max Users first
if (room.getNumberOfPartizipants() != null
&& clientListRoom.size() > room.getNumberOfPartizipants()) {
roomStatus.setRoomFull(true);
return roomStatus;
}
// default logic for non regular rooms
if (room.getAppointment() == null || room.getAppointment() == false) {
if (room.getIsModeratedRoom()) {
// if this is a Moderated Room then the Room can be only
// locked off by the Moderator Bit
// List<RoomClient> clientModeratorListRoom =
// this.sessionManager.getCurrentModeratorByRoom(room_id);
// If there is no Moderator yet we have to check if the
// current User has the Bit set to true to
// become one, otherwise he won't get Moderation and has to
// wait
if (becomeModerator) {
currentClient.setIsMod(true);
// There is a need to send an extra Event here, cause at
// this moment there could be
// already somebody in the Room waiting
// Update the Client List
this.sessionManager.updateClientByStreamId(streamid,
currentClient, false, null);
List<Client> modRoomList = this.sessionManager
.getCurrentModeratorByRoom(currentClient.getRoom_id());
//Sync message to everybody
syncMessageToCurrentScope("setNewModeratorByList", modRoomList, false);
} else {
// The current User is not a Teacher/Admin or whatever
// Role that should get the
// Moderation
currentClient.setIsMod(false);
}
} else {
// If this is a normal Room Moderator rules : first come,
// first draw ;-)
log.debug("setRoomValues : Room"
+ room_id
+ " not appointed! Moderator rules : first come, first draw ;-)");
if (clientListRoom.size() == 1) {
log.debug("Room is empty so set this user to be moderation role");
currentClient.setIsMod(true);
} else {
log.debug("Room is already somebody so set this user not to be moderation role");
if (becomeModerator) {
currentClient.setIsMod(true);
// Update the Client List
this.sessionManager.updateClientByStreamId(
streamid, currentClient, false, null);
List<Client> modRoomList = this.sessionManager
.getCurrentModeratorByRoom(currentClient
.getRoom_id());
// There is a need to send an extra Event here,
// cause at this moment there could be
// already somebody in the Room waiting -swagner check this comment, 20.01.2012
//Sync message to everybody
syncMessageToCurrentScope("setNewModeratorByList", modRoomList, false);
} else {
// The current User is not a Teacher/Admin or
// whatever Role that should get the Moderation
currentClient.setIsMod(false);
}
}
}
// Update the Client List
this.sessionManager.updateClientByStreamId(streamid,
currentClient, false, null);
} else {
// If this is an Appointment then the Moderator will be set to
// the Invitor
Appointment ment = appointmentLogic.getAppointmentByRoom(room_id);
Long userIdInRoomClient = currentClient.getUser_id();
boolean found = false;
boolean moderator_set = false;
// Check if current user is set to moderator
for (MeetingMember member : ment.getMeetingMembers()) {
// only persistent users can schedule a meeting
// user-id is only set for registered users
if (member.getUser() != null) {
log.debug("checking user " + member.getUser().getFirstname()
+ " for moderator role - ID : "
+ member.getUser().getUser_id());
if (member.getUser().getUser_id().equals(userIdInRoomClient)) {
found = true;
if (ment.getOwner().getUser_id() == member.getUser().getUser_id()) {
log.debug("User "
+ userIdInRoomClient
+ " is moderator due to flag in MeetingMember record");
currentClient.setIsMod(true);
// Update the Client List
sessionManager.updateClientByStreamId(streamid, currentClient, false, null);
List<Client> modRoomList = this.sessionManager
.getCurrentModeratorByRoom(currentClient
.getRoom_id());
// There is a need to send an extra Event here, cause at this moment
// there could be already somebody in the Room waiting
//Sync message to everybody
syncMessageToCurrentScope("setNewModeratorByList", modRoomList, false);
moderator_set = true;
this.sessionManager.updateClientByStreamId(
streamid, currentClient, false, null);
break;
} else {
log.debug("User "
+ userIdInRoomClient
+ " is NOT moderator due to flag in MeetingMember record");
currentClient.setIsMod(false);
this.sessionManager.updateClientByStreamId(
streamid, currentClient, false, null);
break;
}
}
}
}
if (!found) {
log.debug("User "
+ userIdInRoomClient
+ " could not be found as MeetingMember -> definitely no moderator");
currentClient.setIsMod(false);
sessionManager.updateClientByStreamId(streamid, currentClient, false, null);
} else {
// if current user is part of the member list, but moderator
// couldn't be retrieved : first come, first draw!
if (clientListRoom.size() == 1 && moderator_set == false) {
log.debug("");
currentClient.setIsMod(true);
// Update the Client List
sessionManager.updateClientByStreamId(streamid, currentClient, false, null);
List<Client> modRoomList = this.sessionManager
.getCurrentModeratorByRoom(currentClient
.getRoom_id());
// There is a need to send an extra Event here, cause at
// this moment there could be
// already somebody in the Room waiting
//Sync message to everybody
syncMessageToCurrentScope("setNewModeratorByList", modRoomList, false);
this.sessionManager.updateClientByStreamId(streamid,
currentClient, false, null);
}
}
}
//Sync message to everybody
syncMessageToCurrentScope("addNewUser", currentClient, false);
//Status object for Shared Browsing
BrowserStatus browserStatus = (BrowserStatus) current.getScope()
.getAttribute("browserStatus");
if (browserStatus == null) {
browserStatus = new BrowserStatus();
}
// RoomStatus roomStatus = new RoomStatus();
// FIXME: Rework Client Object to DTOs
roomStatus.setClientList(clientListRoom);
roomStatus.setBrowserStatus(browserStatus);
return roomStatus;
} catch (Exception err) {
log.error("[setRoomValues]", err);
}