Issue #427 fixed issues
Change-Id: I984b6ccefd84e90d0296e1b38b8dd30b241546f8 Former-commit-id:14c2b1271e
[formerly 64e3f77ac8ebc03c0e15c3d4ac513df78f05b00a] Former-commit-id:db3027c0d6
This commit is contained in:
parent
8d741bc4a1
commit
1b03a14b23
7 changed files with 79 additions and 164 deletions
|
@ -458,7 +458,7 @@ public class CollaborationConnection implements IEventPublisher {
|
|||
* @param session
|
||||
*/
|
||||
protected void removeSession(ISession session) {
|
||||
sessions.remove(session);
|
||||
sessions.remove(session.getSessionId());
|
||||
}
|
||||
|
||||
/**
|
||||
|
@ -544,14 +544,7 @@ public class CollaborationConnection implements IEventPublisher {
|
|||
});
|
||||
}
|
||||
|
||||
// ***************************
|
||||
// Peer to Peer communications
|
||||
// ***************************
|
||||
|
||||
/**
|
||||
*
|
||||
*/
|
||||
protected ISession getSession(String sessionId) {
|
||||
public ISession getSession(String sessionId) {
|
||||
return sessions.get(sessionId);
|
||||
}
|
||||
|
||||
|
@ -674,6 +667,10 @@ public class CollaborationConnection implements IEventPublisher {
|
|||
return id;
|
||||
}
|
||||
|
||||
public Collection<ISession> getSessions() {
|
||||
return sessions.values();
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns the currently connected connection or null if it's not connected
|
||||
*
|
||||
|
@ -707,4 +704,5 @@ public class CollaborationConnection implements IEventPublisher {
|
|||
return getConnection();
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
|
|
|
@ -26,17 +26,18 @@ import java.util.Arrays;
|
|||
import java.util.Collection;
|
||||
import java.util.HashSet;
|
||||
import java.util.List;
|
||||
import java.util.Map;
|
||||
import java.util.Set;
|
||||
|
||||
import org.eclipse.ecf.core.user.User;
|
||||
import org.eclipse.ecf.presence.IPresence;
|
||||
import org.eclipse.ecf.presence.IPresence.Mode;
|
||||
import org.eclipse.ecf.presence.IPresence.Type;
|
||||
import org.eclipse.ecf.presence.Presence;
|
||||
import org.eclipse.ecf.presence.roster.IRoster;
|
||||
import org.eclipse.ecf.presence.roster.IRosterEntry;
|
||||
import org.eclipse.ecf.presence.roster.IRosterGroup;
|
||||
import org.eclipse.ecf.presence.roster.IRosterItem;
|
||||
import org.eclipse.ecf.presence.roster.IRosterManager;
|
||||
import org.eclipse.ecf.presence.roster.RosterEntry;
|
||||
import org.eclipse.ecf.presence.roster.RosterGroup;
|
||||
import org.eclipse.jface.action.Action;
|
||||
|
@ -228,7 +229,6 @@ public class CollaborationGroupView extends CaveFloatingView implements
|
|||
}
|
||||
LoginDialog dlg = new LoginDialog(shell);
|
||||
dlg.open();
|
||||
dlg.close();
|
||||
}
|
||||
});
|
||||
connection = CollaborationConnection.getConnection();
|
||||
|
@ -379,8 +379,8 @@ public class CollaborationGroupView extends CaveFloatingView implements
|
|||
@Override
|
||||
public void run() {
|
||||
String sessionId = getId();
|
||||
IVenueSession session = CollaborationDataManager.getInstance()
|
||||
.getSession(sessionId);
|
||||
IVenueSession session = (IVenueSession) CollaborationConnection
|
||||
.getConnection().getSession(sessionId);
|
||||
List<UserId> ids = new ArrayList<UserId>();
|
||||
|
||||
for (IRosterEntry user : getSelectedUsers()) {
|
||||
|
@ -746,7 +746,8 @@ public class CollaborationGroupView extends CaveFloatingView implements
|
|||
IViewPart viewPart = ref.getView(false);
|
||||
if (viewPart instanceof SessionView) {
|
||||
String sessionId = viewPart.getViewSite().getSecondaryId();
|
||||
activeSessionGroup.addObject(manager.getSession(sessionId));
|
||||
activeSessionGroup.addObject(CollaborationConnection
|
||||
.getConnection().getSession(sessionId));
|
||||
}
|
||||
}
|
||||
} catch (NullPointerException e) {
|
||||
|
@ -819,13 +820,12 @@ public class CollaborationGroupView extends CaveFloatingView implements
|
|||
&& user.getPresence().getType() == Type.AVAILABLE) {
|
||||
MenuManager inviteManager = new MenuManager("Invite to...");
|
||||
// get current open chats
|
||||
Map<String, IVenueSession> sessions = CollaborationDataManager
|
||||
.getInstance().getSessions();
|
||||
for (String name : sessions.keySet()) {
|
||||
final ISession session = sessions.get(name);
|
||||
if (session != null) {
|
||||
final IVenueInfo info = sessions.get(name).getVenue()
|
||||
.getInfo();
|
||||
Collection<ISession> sessions = CollaborationConnection
|
||||
.getConnection().getSessions();
|
||||
for (final ISession session : sessions) {
|
||||
if (session != null && session instanceof IVenueSession) {
|
||||
final IVenueInfo info = ((IVenueSession) session)
|
||||
.getVenue().getInfo();
|
||||
if (info != null) {
|
||||
Action action = new Action(
|
||||
info.getVenueDescription()) {
|
||||
|
@ -1026,7 +1026,21 @@ public class CollaborationGroupView extends CaveFloatingView implements
|
|||
.getString(CollabPrefConstants.P_STATUS).toLowerCase());
|
||||
String msg = Activator.getDefault().getPreferenceStore()
|
||||
.getString(CollabPrefConstants.P_MESSAGE);
|
||||
CollaborationDataManager.getInstance().fireModifiedPresence(mode, msg);
|
||||
CollaborationConnection connection = CollaborationConnection
|
||||
.getConnection();
|
||||
IRosterManager manager = connection.getRosterManager();
|
||||
IPresence presence = new Presence(Type.AVAILABLE, msg, mode);
|
||||
|
||||
try {
|
||||
connection.getAccountManager().sendPresence(presence);
|
||||
UserId id = connection.getUser();
|
||||
RosterEntry rosterEntry = new RosterEntry(manager.getRoster(), id,
|
||||
presence);
|
||||
rosterEntry.setPresence(presence);
|
||||
connection.getEventPublisher().post(rosterEntry);
|
||||
} catch (CollaborationException e) {
|
||||
statusHandler.handle(Priority.PROBLEM, "Error sending presence", e);
|
||||
}
|
||||
|
||||
// need to refresh the local tree so that the top user shows up with the
|
||||
// current status
|
||||
|
@ -1057,8 +1071,8 @@ public class CollaborationGroupView extends CaveFloatingView implements
|
|||
|
||||
try {
|
||||
if (result.isInviteUsers()) {
|
||||
IVenueSession session = CollaborationDataManager
|
||||
.getInstance().getSession(result.getSessionId());
|
||||
IVenueSession session = (IVenueSession) CollaborationConnection
|
||||
.getConnection().getSession(result.getSessionId());
|
||||
List<UserId> usersList = new ArrayList<UserId>();
|
||||
for (IRosterEntry user : getSelectedUsers()) {
|
||||
usersList.add(IDConverter.convertFrom(user.getUser()));
|
||||
|
@ -1535,7 +1549,7 @@ public class CollaborationGroupView extends CaveFloatingView implements
|
|||
if (part instanceof SessionView) {
|
||||
SessionView sessionView = (SessionView) part;
|
||||
String sessionId = sessionView.getViewSite().getSecondaryId();
|
||||
IVenueSession session = CollaborationDataManager.getInstance()
|
||||
ISession session = CollaborationConnection.getConnection()
|
||||
.getSession(sessionId);
|
||||
activeSessionGroup.addObject(session);
|
||||
session.registerEventHandler(sessionView);
|
||||
|
|
|
@ -48,7 +48,6 @@ import com.raytheon.uf.viz.collaboration.comm.identity.user.SharedDisplayRole;
|
|||
import com.raytheon.uf.viz.collaboration.comm.provider.TextMessage;
|
||||
import com.raytheon.uf.viz.collaboration.comm.provider.session.CollaborationConnection;
|
||||
import com.raytheon.uf.viz.collaboration.comm.provider.user.UserId;
|
||||
import com.raytheon.uf.viz.collaboration.ui.data.CollaborationDataManager;
|
||||
import com.raytheon.uf.viz.collaboration.ui.data.SharedDisplaySessionMgr;
|
||||
import com.raytheon.uf.viz.collaboration.ui.prefs.CollabPrefConstants;
|
||||
import com.raytheon.uf.viz.collaboration.ui.session.CollaborationSessionView;
|
||||
|
@ -57,7 +56,8 @@ import com.raytheon.uf.viz.collaboration.ui.session.SessionView;
|
|||
import com.raytheon.uf.viz.core.VizApp;
|
||||
|
||||
/**
|
||||
* TODO Add Description
|
||||
* Subscribes to events that occur on the collaboration connection, ie the
|
||||
* logged in user. This is for events not tied to a particular session.
|
||||
*
|
||||
* <pre>
|
||||
*
|
||||
|
@ -86,6 +86,12 @@ public class ConnectionSubscriber {
|
|||
|
||||
}
|
||||
|
||||
/**
|
||||
* Subscribes to events on the given connection. Should only be called on
|
||||
* login.
|
||||
*
|
||||
* @param connection
|
||||
*/
|
||||
public static void subscribe(CollaborationConnection connection) {
|
||||
if (instance == null) {
|
||||
instance = new ConnectionSubscriber();
|
||||
|
@ -93,6 +99,12 @@ public class ConnectionSubscriber {
|
|||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Unsubscribes from events on the given connection. Should only be called
|
||||
* on logout.
|
||||
*
|
||||
* @param connection
|
||||
*/
|
||||
public static void unsubscribe(CollaborationConnection connection) {
|
||||
if (instance != null) {
|
||||
instance.dispose(connection);
|
||||
|
@ -187,8 +199,6 @@ public class ConnectionSubscriber {
|
|||
IVenueSession session = connection
|
||||
.joinCollaborationVenue(invitation);
|
||||
String sessionId = session.getSessionId();
|
||||
CollaborationDataManager.getInstance().addSession(
|
||||
sessionId, session);
|
||||
if (sharedDisplay) {
|
||||
ISharedDisplaySession displaySession = (ISharedDisplaySession) session;
|
||||
SessionColorManager man = new SessionColorManager();
|
||||
|
|
|
@ -19,28 +19,11 @@
|
|||
**/
|
||||
package com.raytheon.uf.viz.collaboration.ui.data;
|
||||
|
||||
import java.util.HashMap;
|
||||
import java.util.Map;
|
||||
|
||||
import org.eclipse.core.runtime.Assert;
|
||||
import org.eclipse.ecf.presence.IPresence;
|
||||
import org.eclipse.ecf.presence.IPresence.Mode;
|
||||
import org.eclipse.ecf.presence.IPresence.Type;
|
||||
import org.eclipse.ecf.presence.Presence;
|
||||
import org.eclipse.ecf.presence.roster.IRosterManager;
|
||||
import org.eclipse.ecf.presence.roster.RosterEntry;
|
||||
import org.eclipse.swt.widgets.Shell;
|
||||
import org.eclipse.ui.IWorkbenchListener;
|
||||
|
||||
import com.raytheon.uf.common.status.IUFStatusHandler;
|
||||
import com.raytheon.uf.common.status.UFStatus;
|
||||
import com.raytheon.uf.common.status.UFStatus.Priority;
|
||||
import com.raytheon.uf.viz.collaboration.comm.identity.CollaborationException;
|
||||
import com.raytheon.uf.viz.collaboration.comm.identity.ISharedDisplaySession;
|
||||
import com.raytheon.uf.viz.collaboration.comm.identity.IVenueSession;
|
||||
import com.raytheon.uf.viz.collaboration.comm.identity.user.SharedDisplayRole;
|
||||
import com.raytheon.uf.viz.collaboration.comm.provider.session.CollaborationConnection;
|
||||
import com.raytheon.uf.viz.collaboration.comm.provider.user.UserId;
|
||||
|
||||
/**
|
||||
* A single class that contains all data information.
|
||||
|
@ -61,27 +44,6 @@ import com.raytheon.uf.viz.collaboration.comm.provider.user.UserId;
|
|||
public class CollaborationDataManager {
|
||||
private static CollaborationDataManager instance;
|
||||
|
||||
private static final transient IUFStatusHandler statusHandler = UFStatus
|
||||
.getHandler(CollaborationDataManager.class);
|
||||
|
||||
/**
|
||||
* The connection to the server.
|
||||
*/
|
||||
private CollaborationConnection connection;
|
||||
|
||||
Shell shell;
|
||||
|
||||
/**
|
||||
* Created when connection made. Used to clean up connection when CAVE shuts
|
||||
* down.
|
||||
*/
|
||||
private IWorkbenchListener wbListener;
|
||||
|
||||
/**
|
||||
* Mapping for all active chat sessions.
|
||||
*/
|
||||
Map<String, IVenueSession> sessionsMap;
|
||||
|
||||
public static CollaborationDataManager getInstance() {
|
||||
if (instance == null) {
|
||||
instance = new CollaborationDataManager();
|
||||
|
@ -93,47 +55,6 @@ public class CollaborationDataManager {
|
|||
* Private constructor to for singleton class.
|
||||
*/
|
||||
private CollaborationDataManager() {
|
||||
sessionsMap = new HashMap<String, IVenueSession>();
|
||||
}
|
||||
|
||||
/**
|
||||
* Get the Venue session associated with the key or any session when key is
|
||||
* null.
|
||||
*
|
||||
* @param sessionId
|
||||
* - key to fetch session
|
||||
* @return session - The venue session or null if none found
|
||||
*/
|
||||
public IVenueSession getSession(String sessionId) {
|
||||
Assert.isNotNull(sessionId,
|
||||
"getSession should never be passed a null sessionId");
|
||||
// IVenueSession session = null;
|
||||
// if (sessionId == null) {
|
||||
// if (sessionsMap.size() > 0) {
|
||||
// session = sessionsMap.get(sessionsMap.keySet().toArray()[0]);
|
||||
// }
|
||||
// } else {
|
||||
// session = sessionsMap.get(sessionId);
|
||||
// }
|
||||
// return session;
|
||||
return sessionsMap.get(sessionId);
|
||||
}
|
||||
|
||||
public Map<String, IVenueSession> getSessions() {
|
||||
return sessionsMap;
|
||||
}
|
||||
|
||||
/**
|
||||
* Closes connection to the session.
|
||||
*
|
||||
* @param sessionId
|
||||
*/
|
||||
public void closeSession(String sessionId) {
|
||||
IVenueSession session = sessionsMap.get(sessionId);
|
||||
if (session != null) {
|
||||
sessionsMap.remove(sessionId);
|
||||
session.close();
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
|
@ -160,7 +81,6 @@ public class CollaborationDataManager {
|
|||
// TODO throw an exception if unable to make connection?
|
||||
if (session.isConnected()) {
|
||||
ISharedDisplaySession displaySession = (ISharedDisplaySession) session;
|
||||
sessionsMap.put(sessionId, session);
|
||||
SharedDisplaySessionMgr.joinSession(displaySession,
|
||||
SharedDisplayRole.DATA_PROVIDER, null);
|
||||
}
|
||||
|
@ -177,38 +97,8 @@ public class CollaborationDataManager {
|
|||
session = connection.createTextOnlyVenue(venueName, subject);
|
||||
if (session.isConnected()) {
|
||||
sessionId = session.getSessionId();
|
||||
sessionsMap.put(sessionId, session);
|
||||
}
|
||||
return sessionId;
|
||||
}
|
||||
|
||||
public boolean isConnected() {
|
||||
return connection != null && connection.isConnected();
|
||||
}
|
||||
|
||||
public void fireModifiedPresence(Mode mode, String msg) {
|
||||
IRosterManager manager = connection.getRosterManager();
|
||||
IPresence presence = new Presence(Type.AVAILABLE, msg, mode);
|
||||
|
||||
try {
|
||||
connection.getAccountManager().sendPresence(presence);
|
||||
UserId id = connection.getUser();
|
||||
RosterEntry rosterEntry = new RosterEntry(manager.getRoster(), id,
|
||||
presence);
|
||||
rosterEntry.setPresence(presence);
|
||||
connection.getEventPublisher().post(rosterEntry);
|
||||
} catch (CollaborationException e) {
|
||||
// TODO Auto-generated catch block. Please revise as
|
||||
// appropriate.
|
||||
statusHandler.handle(Priority.PROBLEM, e.getLocalizedMessage(), e);
|
||||
} catch (Exception ex) {
|
||||
ex.printStackTrace();
|
||||
}
|
||||
}
|
||||
|
||||
// TODO remove as this is temporary to fix a problem and get in a good state
|
||||
public void addSession(String sessionId, IVenueSession session) {
|
||||
sessionsMap.put(sessionId, session);
|
||||
}
|
||||
|
||||
}
|
||||
|
|
|
@ -58,7 +58,6 @@ import com.raytheon.uf.viz.collaboration.comm.provider.user.IDConverter;
|
|||
import com.raytheon.uf.viz.collaboration.comm.provider.user.UserId;
|
||||
import com.raytheon.uf.viz.collaboration.ui.Activator;
|
||||
import com.raytheon.uf.viz.collaboration.ui.ColorChangeEvent;
|
||||
import com.raytheon.uf.viz.collaboration.ui.data.CollaborationDataManager;
|
||||
import com.raytheon.uf.viz.collaboration.ui.data.SessionContainer;
|
||||
import com.raytheon.uf.viz.collaboration.ui.data.SharedDisplaySessionMgr;
|
||||
import com.raytheon.uf.viz.collaboration.ui.telestrator.CollaborationDrawingResource;
|
||||
|
@ -468,8 +467,8 @@ public class CollaborationSessionView extends SessionView implements
|
|||
@Override
|
||||
protected void setSession(String sessionId) {
|
||||
super.setSession(sessionId);
|
||||
this.session = (ISharedDisplaySession) CollaborationDataManager
|
||||
.getInstance().getSession(this.sessionId);
|
||||
this.session = (ISharedDisplaySession) CollaborationConnection
|
||||
.getConnection().getSession(sessionId);
|
||||
}
|
||||
|
||||
public String getSessionId() {
|
||||
|
@ -479,6 +478,7 @@ public class CollaborationSessionView extends SessionView implements
|
|||
@Override
|
||||
public void dispose() {
|
||||
SharedDisplaySessionMgr.exitSession(session.getSessionId());
|
||||
session.close();
|
||||
super.dispose();
|
||||
getSite().getPage().removePartListener(this);
|
||||
}
|
||||
|
|
|
@ -37,13 +37,14 @@ import org.eclipse.swt.graphics.Point;
|
|||
import org.eclipse.swt.graphics.RGB;
|
||||
import org.eclipse.swt.widgets.Display;
|
||||
|
||||
import com.raytheon.uf.viz.collaboration.comm.identity.ISession;
|
||||
import com.raytheon.uf.viz.collaboration.comm.identity.IVenueSession;
|
||||
import com.raytheon.uf.viz.collaboration.comm.provider.session.CollaborationConnection;
|
||||
import com.raytheon.uf.viz.collaboration.comm.provider.session.SharedDisplaySession;
|
||||
import com.raytheon.uf.viz.collaboration.comm.provider.user.IDConverter;
|
||||
import com.raytheon.uf.viz.collaboration.comm.provider.user.UserId;
|
||||
import com.raytheon.uf.viz.collaboration.ui.CollaborationUtils;
|
||||
import com.raytheon.uf.viz.collaboration.ui.SessionColorManager;
|
||||
import com.raytheon.uf.viz.collaboration.ui.data.CollaborationDataManager;
|
||||
|
||||
/**
|
||||
* Generate the Participant's label and icon image.
|
||||
|
@ -128,8 +129,8 @@ public class ParticipantsLabelProvider extends ColumnLabelProvider {
|
|||
|
||||
@Override
|
||||
public Image getImage(Object element) {
|
||||
IVenueSession session = CollaborationDataManager.getInstance()
|
||||
.getSession(sessionId);
|
||||
IVenueSession session = (IVenueSession) CollaborationConnection
|
||||
.getConnection().getSession(sessionId);
|
||||
|
||||
if (session == null) {
|
||||
return null;
|
||||
|
@ -218,8 +219,8 @@ public class ParticipantsLabelProvider extends ColumnLabelProvider {
|
|||
@Override
|
||||
public Font getFont(Object element) {
|
||||
IRosterEntry user = (IRosterEntry) element;
|
||||
IVenueSession session = CollaborationDataManager.getInstance()
|
||||
.getSession(sessionId);
|
||||
ISession session = CollaborationConnection.getConnection().getSession(
|
||||
sessionId);
|
||||
if (session instanceof SharedDisplaySession) {
|
||||
UserId id = IDConverter.convertFrom(user.getUser());
|
||||
boolean isSessionLeader = id
|
||||
|
@ -346,8 +347,8 @@ public class ParticipantsLabelProvider extends ColumnLabelProvider {
|
|||
.getMode())).append("\n");
|
||||
builder.append("Message : \"").append(user.getPresence().getStatus())
|
||||
.append("\"");
|
||||
IVenueSession session = CollaborationDataManager.getInstance()
|
||||
.getSession(sessionId);
|
||||
ISession session = CollaborationConnection.getConnection().getSession(
|
||||
sessionId);
|
||||
if (session instanceof SharedDisplaySession) {
|
||||
UserId id = IDConverter.convertFrom(user.getUser());
|
||||
boolean isSessionLeader = id
|
||||
|
|
|
@ -75,7 +75,6 @@ import com.raytheon.uf.viz.collaboration.comm.provider.session.CollaborationConn
|
|||
import com.raytheon.uf.viz.collaboration.comm.provider.user.IDConverter;
|
||||
import com.raytheon.uf.viz.collaboration.comm.provider.user.UserId;
|
||||
import com.raytheon.uf.viz.collaboration.ui.SessionColorManager;
|
||||
import com.raytheon.uf.viz.collaboration.ui.data.CollaborationDataManager;
|
||||
import com.raytheon.uf.viz.core.VizApp;
|
||||
|
||||
/**
|
||||
|
@ -411,8 +410,7 @@ public class SessionView extends AbstractSessionView {
|
|||
|
||||
// clean up event handlers
|
||||
session.unRegisterEventHandler(this);
|
||||
CollaborationDataManager mgr = CollaborationDataManager.getInstance();
|
||||
mgr.closeSession(sessionId);
|
||||
session.close();
|
||||
CollaborationConnection conn = CollaborationConnection.getConnection();
|
||||
if (conn != null) {
|
||||
conn.getEventPublisher().unregister(this);
|
||||
|
@ -595,8 +593,8 @@ public class SessionView extends AbstractSessionView {
|
|||
|
||||
protected void setSession(String sessionId) {
|
||||
this.sessionId = sessionId;
|
||||
this.session = CollaborationDataManager.getInstance().getSession(
|
||||
this.sessionId);
|
||||
this.session = (IVenueSession) CollaborationConnection.getConnection()
|
||||
.getSession(this.sessionId);
|
||||
}
|
||||
|
||||
@Subscribe
|
||||
|
@ -664,18 +662,22 @@ public class SessionView extends AbstractSessionView {
|
|||
@SuppressWarnings("unchecked")
|
||||
private void participantDeparted(UserId participant) {
|
||||
List<IRosterEntry> users = (List<IRosterEntry>) usersTable.getInput();
|
||||
for (int i = 0; i < users.size(); ++i) {
|
||||
UserId otherId = IDConverter.convertFrom(users.get(i).getUser());
|
||||
if (users.get(i) == null
|
||||
|| participant.getName().equals(otherId.getName())) {
|
||||
users.remove(i);
|
||||
usersTable.refresh();
|
||||
break;
|
||||
if (users != null) {
|
||||
for (int i = 0; i < users.size(); ++i) {
|
||||
UserId otherId = IDConverter
|
||||
.convertFrom(users.get(i).getUser());
|
||||
if (users.get(i) == null
|
||||
|| participant.getName().equals(otherId.getName())) {
|
||||
users.remove(i);
|
||||
usersTable.refresh();
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
StringBuilder builder = new StringBuilder(participant.getName()
|
||||
+ " has left the room");
|
||||
sendSystemMessage(builder);
|
||||
}
|
||||
StringBuilder builder = new StringBuilder(participant.getName()
|
||||
+ " has left the room");
|
||||
sendSystemMessage(builder);
|
||||
}
|
||||
|
||||
/**
|
||||
|
|
Loading…
Add table
Reference in a new issue