/* * Jitsi, the OpenSource Java VoIP and Instant Messaging client. * * Copyright @ 2015 Atlassian Pty Ltd * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package net.java.sip.communicator.service.protocol; import java.util.*; import net.java.sip.communicator.service.protocol.event.*; /** * Represents a chat channel/room/rendez-vous point/ where multiple chat users * could rally and communicate in a many-to-many fashion. * * @author Emil Ivov * @author Yana Stamcheva * @author Valentin Martinet */ public interface ChatRoom { /** * Returns the name of this <tt>ChatRoom</tt>. * * @return a <tt>String</tt> containing the name of this <tt>ChatRoom</tt>. */ public String getName(); /** * Returns the identifier of this <tt>ChatRoom</tt>. The identifier of the * chat room would have the following syntax: * [chatRoomName]@[chatRoomServer]@[accountID] * * @return a <tt>String</tt> containing the identifier of this * <tt>ChatRoom</tt>. */ public String getIdentifier(); /** * Joins this chat room with the nickname of the local user so that the * user would start receiving events and messages for it. * * @throws OperationFailedException with the corresponding code if an error * occurs while joining the room. */ public void join() throws OperationFailedException; /** * Joins this chat room so that the user would start receiving events and * messages for it. The method uses the nickname of the local user and the * specified password in order to enter the chatroom. * * @param password the password to use when authenticating on the chatroom. * @throws OperationFailedException with the corresponding code if an error * occurs while joining the room. */ public void join(byte[] password) throws OperationFailedException; /** * Joins this chat room with the specified nickname so that the user would * start receiving events and messages for it. If the chatroom already * contains a user with this nickname, the method would throw an * OperationFailedException with code IDENTIFICATION_CONFLICT. * * @param nickname the nickname to use. * @throws OperationFailedException with the corresponding code if an error * occurs while joining the room. */ public void joinAs(String nickname) throws OperationFailedException; /** * Joins this chat room with the specified nickname and password so that the * user would start receiving events and messages for it. If the chatroom * already contains a user with this nickname, the method would throw an * OperationFailedException with code IDENTIFICATION_CONFLICT. * * @param nickname the nickname to use. * @param password a password necessary to authenticate when joining the * room. * @throws OperationFailedException with the corresponding code if an error * occurs while joining the room. */ public void joinAs(String nickname, byte[] password) throws OperationFailedException; /** * Returns true if the local user is currently in the multi user chat * (after calling one of the {@link #join()} methods). * * @return true if currently we're currently in this chat room and false * otherwise. */ public boolean isJoined(); /** * Leave this chat room. Once this method is called, the user won't be * listed as a member of the chat room any more and no further chat events * will be delivered. Depending on the underlying protocol and * implementation leave() might cause the room to be destroyed if it has * been created by the local user. */ public void leave(); /** * Returns the last known room subject/theme or <tt>null</tt> if the user * hasn't joined the room or the room does not have a subject yet. * <p> * To be notified every time the room's subject change you should add a * <tt>ChatRoomChangelistener</tt> to this room. * {@link #addPropertyChangeListener(ChatRoomPropertyChangeListener)} * <p> * To change the room's subject use {@link #setSubject(String)}. * * @return the room subject or <tt>null</tt> if the user hasn't joined the * room or the room does not have a subject yet. */ public String getSubject(); /** * Sets the subject of this chat room. If the user does not have the right * to change the room subject, or the protocol does not support this, or * the operation fails for some other reason, the method throws an * <tt>OperationFailedException</tt> with the corresponding code. * * @param subject the new subject that we'd like this room to have * @throws OperationFailedException if the user doesn't have the right to * change this property. */ public void setSubject(String subject) throws OperationFailedException; /** * Returns the local user's nickname in the context of this chat room or * <tt>null</tt> if not currently joined. * * @return the nickname currently being used by the local user in the * context of the local chat room. */ public String getUserNickname(); /** * Returns the local user's role in the context of this chat room or * <tt>null</tt> if not currently joined. * * @return the role currently being used by the local user in the context of * the chat room. */ public ChatRoomMemberRole getUserRole(); /** * Changes the the local user's nickname in the context of this chatroom. * * @param role the new role to set for the local user. * * @throws OperationFailedException if an error occurs. */ public void setLocalUserRole(ChatRoomMemberRole role) throws OperationFailedException; /** * Changes the the local user's nickname in the context of this chatroom. * * @param nickname the new nickname within the room. * * @throws OperationFailedException if the new nickname already exist in * this room */ public void setUserNickname(String nickname) throws OperationFailedException; /** * Adds a listener that will be notified of changes in our participation in * the room such as us being kicked, join, left... * * @param listener a member participation listener. */ public void addMemberPresenceListener( ChatRoomMemberPresenceListener listener); /** * Removes a listener that was being notified of changes in the * participation of other chat room participants such as users being kicked, * join, left. * * @param listener a member participation listener. */ public void removeMemberPresenceListener( ChatRoomMemberPresenceListener listener); /** * Adds a listener that will be notified of changes in our role in the room * such as us being granded operator. * * @param listener a local user role listener. */ public void addLocalUserRoleListener(ChatRoomLocalUserRoleListener listener); /** * Removes a listener that was being notified of changes in our role in this * chat room such as us being granded operator. * * @param listener a local user role listener. */ public void removelocalUserRoleListener( ChatRoomLocalUserRoleListener listener); /** * Adds a listener that will be notified of changes of a member role in the * room such as being granded operator. * * @param listener a member role listener. */ public void addMemberRoleListener(ChatRoomMemberRoleListener listener); /** * Removes a listener that was being notified of changes of a member role in * this chat room such as us being granded operator. * * @param listener a member role listener. */ public void removeMemberRoleListener(ChatRoomMemberRoleListener listener); /** * Adds a listener that will be notified of changes in the property of the * room such as the subject being change or the room state being changed. * * @param listener a property change listener. */ public void addPropertyChangeListener( ChatRoomPropertyChangeListener listener); /** * Removes a listener that was being notified of changes in the property of * the chat room such as the subject being change or the room state being * changed. * * @param listener a property change listener. */ public void removePropertyChangeListener( ChatRoomPropertyChangeListener listener); /** * Adds a listener that will be notified of changes in the property of a * room member such as the nickname being changed. * * @param listener a room member property change listener. */ public void addMemberPropertyChangeListener( ChatRoomMemberPropertyChangeListener listener); /** * Removes a listener that was being notified of changes in the property of * a chat room member such as the nickname being changed. * * @param listener a room member property change listener. */ public void removeMemberPropertyChangeListener( ChatRoomMemberPropertyChangeListener listener); /** * Invites another user to this room. * <p> * If the room is password-protected, the invitee will receive a password to * use to join the room. If the room is members-only, the the invitee may * be added to the member list. * * @param userAddress the address of the user to invite to the room.(one * may also invite users not on their contact list). * @param reason a reason, subject, or welcome message that would tell the * the user why they are being invited. */ public void invite(String userAddress, String reason); /** * Returns a <tt>List</tt> of <tt>ChatRoomMember</tt>s corresponding to all * members currently participating in this room. * * @return a <tt>List</tt> of <tt>ChatRoomMember</tt> instances * corresponding to all room members. */ public List<ChatRoomMember> getMembers(); /** * Returns the number of participants that are currently in this chat room. * @return the number of <tt>Contact</tt>s, currently participating in * this room. */ public int getMembersCount(); /** * Registers <tt>listener</tt> so that it would receive events every time a * new message is received on this chat room. * @param listener a <tt>MessageListener</tt> that would be notified every * time a new message is received on this chat room. */ public void addMessageListener(ChatRoomMessageListener listener); /** * Removes <tt>listener</tt> so that it won't receive any further message * events from this room. * @param listener the <tt>MessageListener</tt> to remove from this room */ public void removeMessageListener(ChatRoomMessageListener listener); /** * Create a Message instance for sending arbitrary MIME-encoding content. * * @param content content value * @param contentType the MIME-type for <tt>content</tt> * @param contentEncoding encoding used for <tt>content</tt> * @param subject a <tt>String</tt> subject or <tt>null</tt> for now subject. * @return the newly created message. */ public Message createMessage(byte[] content, String contentType, String contentEncoding, String subject); /** * Create a Message instance for sending a simple text messages with default * (text/plain) content type and encoding. * * @param messageText the string content of the message. * @return Message the newly created message */ public Message createMessage(String messageText); /** * Sends the <tt>message</tt> to this chat room. * * @param message the <tt>Message</tt> to send. * @throws OperationFailedException if sending the message fails for some * reason. */ public void sendMessage(Message message) throws OperationFailedException; /** * Returns a reference to the provider that created this room. * * @return a reference to the <tt>ProtocolProviderService</tt> instance * that created this room. */ public ProtocolProviderService getParentProvider(); /** * Returns an Iterator over a set of ban masks for this chat room. The ban * mask defines a group of users that will be banned. The ban list is a list * of all such ban masks defined for this chat room. * * @return an Iterator over a set of ban masks for this chat room * @throws OperationFailedException if an error occured while performing the * request to the server or you don't have enough privileges to get this * information */ public Iterator<ChatRoomMember> getBanList() throws OperationFailedException; /** * Bans a user from the room. An administrator or owner of the room can ban * users from a room. A banned user will no longer be able to join the room * unless the ban has been removed. If the banned user was present in the * room then he/she will be removed from the room and notified that he/she * was banned along with the reason (if provided) and the user who initiated * the ban. * * @param chatRoomMember the <tt>ChatRoomMember</tt> to be banned. * @param reason the reason why the user was banned. * @throws OperationFailedException if an error occurs while banning a user. * In particular, an error can occur if a moderator or a user with an * affiliation of "owner" or "admin" was tried to be banned or if the user * that is banning have not enough permissions to ban. */ public void banParticipant(ChatRoomMember chatRoomMember, String reason) throws OperationFailedException; /** * Kicks a visitor or participant from the room. * * @param chatRoomMember the <tt>ChatRoomMember</tt> to kick from the room * @param reason the reason why the participant is being kicked from the * room * @throws OperationFailedException if an error occurs while kicking the * participant. In particular, an error can occur if a moderator or a user * with an affiliation of "owner" or "administrator" was intended to be * kicked; or if the participant that intended to kick another participant * does not have kicking privileges; */ public void kickParticipant(ChatRoomMember chatRoomMember, String reason) throws OperationFailedException; /** * Returns the <tt>ChatRoomConfigurationForm</tt> containing all * configuration properties for this chat room. If the user doesn't have * permissions to see and change chat room configuration an * <tt>OperationFailedException</tt> is thrown. * * @return the <tt>ChatRoomConfigurationForm</tt> containing all * configuration properties for this chat room * @throws OperationFailedException if the user doesn't have * permissions to see and change chat room configuration */ public ChatRoomConfigurationForm getConfigurationForm() throws OperationFailedException; /** * Returns <code>true</code> if this chat room is a system room and * <code>false</code> otherwise. * * @return <code>true</code> if this chat room is a system room and * <code>false</code> otherwise. */ public boolean isSystem(); /** * Determines whether this chat room should be stored in the configuration * file or not. If the chat room is persistent it still will be shown after a * restart in the chat room list. A non-persistent chat room will be only in * the chat room list until the the program is running. * * @return true if this chat room is persistent, false otherwise */ public boolean isPersistent(); /** * Finds private messaging contact by nickname. If the contact doesn't * exists a new volatile contact is created. * * @param name the nickname of the contact. * @return the contact instance. */ public Contact getPrivateContactByNickname(String name); /** * Grants administrator privileges to another user. Room owners may grant * administrator privileges to a member or unaffiliated user. An * administrator is allowed to perform administrative functions such as * banning users and edit moderator list. * * @param address the user address of the user to grant administrator * privileges (e.g. "user@host.org"). */ public void grantAdmin(String address); /** * Grants membership to a user. Only administrators are able to grant * membership. A user that becomes a room member will be able to enter a room * of type Members-Only (i.e. a room that a user cannot enter without being * on the member list). * * @param address the user address of the user to grant membership * privileges (e.g. "user@host.org"). */ public void grantMembership(String address); /** * Grants moderator privileges to a participant or visitor. Room * administrators may grant moderator privileges. A moderator is allowed to * kick users, grant and revoke voice, invite other users, modify room's * subject plus all the partcipants privileges. * * @param nickname the nickname of the occupant to grant moderator * privileges. */ public void grantModerator(String nickname); /** * Grants ownership privileges to another user. Room owners may grant * ownership privileges. Some room implementations will not allow to grant * ownership privileges to other users. An owner is allowed to change * defining room features as well as perform all administrative functions. * * @param address the user address of the user to grant ownership * privileges (e.g. "user@host.org"). */ public void grantOwnership(String address); /** * Grants voice to a visitor in the room. In a moderated room, a moderator * may want to manage who does and does not have "voice" in the room. To have * voice means that a room occupant is able to send messages to the room * occupants. * * @param nickname the nickname of the visitor to grant voice in the room * (e.g. "john"). */ public void grantVoice(String nickname); /** * Revokes administrator privileges from a user. The occupant that loses * administrator privileges will become a member. Room owners may revoke * administrator privileges from a member or unaffiliated user. * * @param address the user address of the user to grant administrator * privileges (e.g. "user@host.org"). */ public void revokeAdmin(String address); /** * Revokes a user's membership. Only administrators are able to revoke * membership. A user that becomes a room member will be able to enter a room * of type Members-Only (i.e. a room that a user cannot enter without being * on the member list). If the user is in the room and the room is of type * members-only then the user will be removed from the room. * * @param address the user address of the user to revoke membership * (e.g. "user@host.org"). */ public void revokeMembership(String address); /** * Revokes moderator privileges from another user. The occupant that loses * moderator privileges will become a participant. Room administrators may * revoke moderator privileges only to occupants whose affiliation is member * or none. This means that an administrator is not allowed to revoke * moderator privileges from other room administrators or owners. * * @param nickname the nickname of the occupant to revoke moderator * privileges. */ public void revokeModerator(String nickname); /** * Revokes ownership privileges from another user. The occupant that loses * ownership privileges will become an administrator. Room owners may revoke * ownership privileges. Some room implementations will not allow to grant * ownership privileges to other users. * * @param address the user address of the user to revoke ownership * (e.g. "user@host.org"). */ public void revokeOwnership(String address); /** * Revokes voice from a participant in the room. In a moderated room, a * moderator may want to revoke an occupant's privileges to speak. To have * voice means that a room occupant is able to send messages to the room * occupants. * @param nickname the nickname of the participant to revoke voice * (e.g. "john"). */ public void revokeVoice(String nickname); /** * Publishes a <tt>ConferenceDescription</tt> to the chat room. * * @param cd the description to publish * @param name the name of the conference * @return the published conference */ public ConferenceDescription publishConference(ConferenceDescription cd, String name); /** * Updates the presence status of private messaging contact. * * @param nickname the nickname of the contact. */ public void updatePrivateContactPresenceStatus(String nickname); /** * Updates the presence status of private messaging contact. * * @param contact the contact. */ public void updatePrivateContactPresenceStatus(Contact contact); /** * Adds a listener that will be notified when a member of this chat room * has published a <tt>ConferenceDescription</tt> to the room. * * @param listener the listener to add. */ public void addConferencePublishedListener( ChatRoomConferencePublishedListener listener); /** * Removes a listener that was being notified when a member of this chat * room had published a <tt>ConferenceDescription</tt> to the room. * * @param listener the listener to remove. */ public void removeConferencePublishedListener( ChatRoomConferencePublishedListener listener); /** * Returns cached <tt>ConferenceDescription</tt> instances. * @return the cached <tt>ConferenceDescription</tt> instances. */ public Map<String, ConferenceDescription> getCachedConferenceDescriptions(); /** * Returns the number of cached <tt>ConferenceDescription</tt> instances. * @return the number of cached <tt>ConferenceDescription</tt> instances. */ public int getCachedConferenceDescriptionSize(); /** * Destroys the chat room. * @param reason the reason for destroying. * @param alternateAddress the alternate address * @return <tt>true</tt> if the room is destroyed. */ public boolean destroy(String reason, String alternateAddress); /** * Returns the ids of the users that has the member role in the room. * When the room is member only, this are the users allowed to join. * @return the ids of the users that has the member role in the room. */ public List<String> getMembersWhiteList(); /** * Changes the list of users that has role member for this room. * When the room is member only, this are the users allowed to join. * @param members the ids of user to have member role. */ public void setMembersWhiteList(List<String> members); }