/*
* GT-Mconf: Multiconference system for interoperable web and mobile
* http://www.inf.ufrgs.br/prav/gtmconf
* PRAV Labs - UFRGS
*
* This file is part of Mconf-Mobile.
*
* Mconf-Mobile is free software: you can redistribute it and/or modify
* it under the terms of the GNU Lesser General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* Mconf-Mobile is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public License
* along with Mconf-Mobile. If not, see <http://www.gnu.org/licenses/>.
*/
package org.mconf.bbb;
import java.util.Collection;
import java.util.LinkedHashSet;
import java.util.List;
import java.util.Map;
import java.util.Set;
import org.jboss.netty.channel.Channel;
import org.mconf.bbb.api.JoinServiceBase;
import org.mconf.bbb.api.JoinServiceProxy;
import org.mconf.bbb.chat.ChatMessage;
import org.mconf.bbb.chat.ChatModule;
import org.mconf.bbb.listeners.IListener;
import org.mconf.bbb.listeners.ListenersModule;
import org.mconf.bbb.present.PresentModule;
import org.mconf.bbb.users.IParticipant;
import org.mconf.bbb.users.Participant;
import org.mconf.bbb.users.UsersModule;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import com.flazr.rtmp.client.ClientOptions;
import com.flazr.rtmp.message.Audio;
import com.flazr.rtmp.message.Command;
import com.flazr.util.Utils;
public class BigBlueButtonClient {
private static final Logger log = LoggerFactory.getLogger(BigBlueButtonClient.class);
private MainRtmpConnection mainConnection = null;
private JoinServiceProxy joinServiceProxy = new JoinServiceProxy();
private String myUserId = null;
private PresentModule presentModule = null;
private ChatModule chatModule = null;
private UsersModule usersModule = null;
private ListenersModule listenersModule = null;
public void setMyUserId(String myUserId) {
this.myUserId = myUserId;
log.info("My userID is {}", myUserId);
}
public MainRtmpConnection getConnection() {
return mainConnection;
}
public String getMyUserId() {
return myUserId;
}
public boolean isMyself(String userId) {
return myUserId.equals(userId);
}
public Participant getMyself()
{
return getUsersModule().getParticipants().get(myUserId);
}
public void createChatModule(MainRtmpConnection handler, Channel channel) {
chatModule = new ChatModule(handler, channel);
}
public ChatModule getChatModule() {
return chatModule;
}
public void createPresentModule(MainRtmpConnection handler, Channel channel) {
presentModule = new PresentModule(handler, channel);
}
public PresentModule getPresentModule() {
return presentModule;
}
public void createUsersModule(MainRtmpConnection handler,
Channel channel) {
usersModule = new UsersModule(handler, channel);
}
public UsersModule getUsersModule() {
return usersModule;
}
public void createListenersModule(MainRtmpConnection handler,
Channel channel) {
listenersModule = new ListenersModule(handler, channel);
}
public ListenersModule getListenersModule() {
return listenersModule;
}
public void createJoinService(String serverUrl) {
if (serverUrl.contains("/bigbluebutton/api/"))
serverUrl = serverUrl.substring(0, serverUrl.indexOf("/bigbluebutton/api/"));
joinServiceProxy.setServer(serverUrl);
}
public void createJoinService(String serverUrl, String salt) {
joinServiceProxy.setServer(serverUrl, salt);
}
public JoinServiceBase getJoinService() {
return joinServiceProxy.getJoinService();
}
public boolean connectBigBlueButton() {
ClientOptions opt = new ClientOptions();
opt.setClientVersionToUse(Utils.fromHex("00000000"));
opt.setHost(getJoinService().getApplicationService().getServerUrl());
opt.setAppName("bigbluebutton/" + getJoinService().getJoinedMeeting().getConference());
log.debug(opt.toString());
mainConnection = new MainRtmpConnection(opt, this);
return mainConnection.connect();
}
public void disconnect() {
if (mainConnection != null)
mainConnection.disconnect();
joinServiceProxy.resetJoinedMeeting();
}
public Collection<Participant> getParticipants() {
return usersModule.getParticipants().values();
}
public List<ChatMessage> getPublicChatMessages() {
return chatModule.getPublicChatMessage();
}
public void sendPrivateChatMessage(String message, String userId) {
chatModule.sendPrivateChatMessage(message, userId);
}
public void sendPublicChatMessage(String message) {
chatModule.sendPublicChatMessage(message);
}
public void raiseHand(boolean value) {
raiseHand(myUserId, value);
}
public void raiseHand(String userId, boolean value) {
usersModule.raiseHand(userId, value);
}
public void assignPresenter(String userId) {
usersModule.assignPresenter(userId);
}
public void kickUser(String userId) {
usersModule.kickUser(userId);
}
public void kickListener(int listenerId) {
listenersModule.doEjectUser(listenerId);
}
public void muteUnmuteListener(int listenerId, boolean value){
listenersModule.doMuteUnmuteUser(listenerId,value);
}
public void muteUnmuteRoom(boolean value) {
listenersModule.doMuteAllUsers(value);
}
public static void main(String[] args) {
BigBlueButtonClient client = new BigBlueButtonClient();
client.createJoinService("http://test.bigbluebutton.org/", "03b07");
client.getJoinService().load();
if ( (client.getJoinService().join("English 110", "Eclipse", false) == JoinServiceBase.E_OK) //.
&& (client.getJoinService().getJoinedMeeting() != null)) {
client.connectBigBlueButton();
}
}
public boolean onCommand(String resultFor, Command command) {
if (usersModule.onCommand(resultFor, command)
|| chatModule.onCommand(resultFor, command)
|| listenersModule.onCommand(resultFor, command)
|| presentModule.onCommand(resultFor, command))
return true;
else
return false;
}
public boolean isConnected() {
if (mainConnection == null)
return false;
else
return mainConnection.isConnected();
}
/**
* Listeners and related methods definition
*
* @author felipe
*/
public interface OnPublicChatMessageListener extends IBbbListener {
public void onPublicChatMessage(ChatMessage message, IParticipant source);
public void onPublicChatMessage(List<ChatMessage> publicChatMessages, Map<String, Participant> participants);
}
public interface OnPrivateChatMessageListener extends IBbbListener {
public void onPrivateChatMessage(ChatMessage message, IParticipant source);
}
public interface OnConnectedListener extends IBbbListener {
public void onConnectedSuccessfully();
public void onConnectedUnsuccessfully();
}
public interface OnDisconnectedListener extends IBbbListener {
public void onDisconnected();
}
public interface OnExceptionListener extends IBbbListener {
public void onException(Throwable throwable);
}
public interface OnKickUserListener extends IBbbListener {
public void onKickUser(IParticipant p);
public void onKickMyself();
}
public interface OnParticipantJoinedListener extends IBbbListener {
public void onParticipantJoined(IParticipant p);
}
public interface OnParticipantLeftListener extends IBbbListener {
public void onParticipantLeft(IParticipant p);
}
public interface OnParticipantStatusChangeListener extends IBbbListener {
public void onChangePresenter(IParticipant p);
public void onChangeHasStream(IParticipant p);
public void onChangeRaiseHand(IParticipant p);
}
public interface OnListenerJoinedListener extends IBbbListener {
public void onListenerJoined(IListener p);
}
public interface OnListenerLeftListener extends IBbbListener {
public void onListenerLeft(IListener p);
}
public interface OnListenerStatusChangeListener extends IBbbListener {
public void onChangeIsMuted(IListener p);
public void onChangeIsTalking(IListener p);
}
public interface OnAudioListener extends IBbbListener {
public void onAudio(Audio audio);
}
private Set<OnPublicChatMessageListener> publicChatMessageListeners = new LinkedHashSet<OnPublicChatMessageListener>();
private Set<OnPrivateChatMessageListener> privateChatMessageListeners = new LinkedHashSet<OnPrivateChatMessageListener>();
private Set<OnConnectedListener> connectedListeners = new LinkedHashSet<OnConnectedListener>();
private Set<OnDisconnectedListener> disconnectedListeners = new LinkedHashSet<OnDisconnectedListener>();
private Set<OnExceptionListener> exceptionListeners = new LinkedHashSet<OnExceptionListener>();
private Set<OnKickUserListener> kickUserListeners = new LinkedHashSet<OnKickUserListener>();
private Set<OnParticipantJoinedListener> participantJoinedListeners = new LinkedHashSet<OnParticipantJoinedListener>();
private Set<OnParticipantLeftListener> participantLeftListeners = new LinkedHashSet<OnParticipantLeftListener>();
private Set<OnParticipantStatusChangeListener> participantStatusChangeListeners = new LinkedHashSet<OnParticipantStatusChangeListener>();
private Set<OnListenerJoinedListener> listenerJoinedListeners = new LinkedHashSet<OnListenerJoinedListener>();
private Set<OnListenerLeftListener> listenerLeftListeners = new LinkedHashSet<OnListenerLeftListener>();
private Set<OnListenerStatusChangeListener> listenerStatusChangeListeners = new LinkedHashSet<OnListenerStatusChangeListener>();
private Set<OnAudioListener> audioListeners = new LinkedHashSet<OnAudioListener>();
public boolean addPublicChatMessageListener(OnPublicChatMessageListener listener) { return publicChatMessageListeners.add(listener); }
public boolean removePublicChatMessageListener(OnPublicChatMessageListener listener) { return publicChatMessageListeners.remove(listener); }
public Set<OnPublicChatMessageListener> getPublicChatMessageListeners() { return publicChatMessageListeners; }
public boolean addPrivateChatMessageListener(OnPrivateChatMessageListener listener) { return privateChatMessageListeners.add(listener); }
public boolean removePrivateChatMessageListener(OnPrivateChatMessageListener listener) { return privateChatMessageListeners.remove(listener); }
public Set<OnPrivateChatMessageListener> getPrivateChatMessageListener() { return privateChatMessageListeners; }
public boolean addConnectedListener(OnConnectedListener listener) { return connectedListeners.add(listener); }
public boolean removeConnectedListener(OnConnectedListener listener) { return connectedListeners.remove(listener); }
public Set<OnConnectedListener> getConnectedListeners() { return connectedListeners; }
public boolean addDisconnectedListener(OnDisconnectedListener listener) { return disconnectedListeners.add(listener); }
public boolean removeDisconnectedListener(OnDisconnectedListener listener) { return disconnectedListeners.remove(listener); }
public Set<OnDisconnectedListener> getDisconnectedListeners() { return disconnectedListeners; }
public boolean addExceptionListener(OnExceptionListener listener) { return exceptionListeners.add(listener); }
public boolean removeExceptionListener(OnExceptionListener listener) { return exceptionListeners.remove(listener); }
public Set<OnExceptionListener> getExceptionListeners() { return exceptionListeners; }
public boolean addKickUserListener(OnKickUserListener listener) { return kickUserListeners.add(listener); }
public boolean removeKickUserListener(OnKickUserListener listener) { return kickUserListeners.remove(listener); }
public Set<OnKickUserListener> getKickUserListeners() { return kickUserListeners; }
public boolean addParticipantJoinedListener(OnParticipantJoinedListener listener) { return participantJoinedListeners.add(listener); }
public boolean removeParticipantJoinedListener(OnParticipantJoinedListener listener) { return participantJoinedListeners.remove(listener); }
public Set<OnParticipantJoinedListener> getParticipantJoinedListeners() { return participantJoinedListeners; }
public boolean addParticipantLeftListener(OnParticipantLeftListener listener) { boolean r; synchronized (participantLeftListeners) { r = participantLeftListeners.add(listener); } return r; }
public boolean removeParticipantLeftListener(OnParticipantLeftListener listener) { boolean r; synchronized (participantLeftListeners) { r = participantLeftListeners.remove(listener); } return r; }
public Set<OnParticipantLeftListener> getParticipantLeftListeners() { return participantLeftListeners; }
public boolean addParticipantStatusChangeListener(OnParticipantStatusChangeListener listener) { return participantStatusChangeListeners.add(listener); }
public boolean removeParticipantStatusChangeListener(OnParticipantStatusChangeListener listener) { return participantStatusChangeListeners.remove(listener); }
public Set<OnParticipantStatusChangeListener> getParticipantStatusChangeListeners() { return participantStatusChangeListeners; }
public boolean addListenerJoinedListener(OnListenerJoinedListener listener) { return listenerJoinedListeners.add(listener); }
public boolean removeListenerJoinedListener(OnListenerJoinedListener listener) { return listenerJoinedListeners.remove(listener); }
public Set<OnListenerJoinedListener> getListenerJoinedListeners() { return listenerJoinedListeners; }
public boolean addListenerLeftListener(OnListenerLeftListener listener) { return listenerLeftListeners.add(listener); }
public boolean removeListenerLeftListener(OnListenerLeftListener listener) { return listenerLeftListeners.remove(listener); }
public Set<OnListenerLeftListener> getListenerLeftListeners() { return listenerLeftListeners; }
public boolean addListenerStatusChangeListener(OnListenerStatusChangeListener listener) { return listenerStatusChangeListeners.add(listener); }
public boolean removeListenerStatusChangeListener(OnListenerStatusChangeListener listener) { return listenerStatusChangeListeners.remove(listener); }
public Set<OnListenerStatusChangeListener> getListenerStatusChangeListeners() { return listenerStatusChangeListeners; }
public boolean addAudioListener(OnAudioListener listener) { return audioListeners.add(listener); }
public boolean removeAudioListener(OnAudioListener listener) { return audioListeners.remove(listener); }
public Set<OnAudioListener> getAudioListeners() { return audioListeners; }
}