All Downloads are FREE. Search and download functionalities are using the official Maven repository.

com.skype.Chat Maven / Gradle / Ivy

There is a newer version: 1.7
Show newest version
/*******************************************************************************
 * Copyright (c) 2006-2007 Koji Hisano  - UBION Inc. Developer
 * Copyright (c) 2006-2007 UBION Inc. 
 * 
 * Copyright (c) 2006-2007 Skype Technologies S.A. 
 * 
 * Skype4Java is licensed under either the Apache License, Version 2.0 or
 * the Eclipse Public License v1.0.
 * You may use it freely in commercial and non-commercial products.
 * You may obtain a copy of the licenses at
 *
 *   the Apache License - http://www.apache.org/licenses/LICENSE-2.0
 *   the Eclipse Public License - http://www.eclipse.org/legal/epl-v10.html
 *
 * If it is possible to cooperate with the publicity of Skype4Java, please add
 * links to the Skype4Java web site  
 * in your web site or documents.
 * 
 * Contributors:
 * Koji Hisano - initial API and implementation
 * Bart Lamot - good javadocs
 ******************************************************************************/
package com.skype;

import java.util.Date;
import java.util.HashMap;
import java.util.Map;

import com.skype.connector.Connector;
import com.skype.connector.ConnectorException;

/**
 * object representing Skype CHAT object.
 * @see https://developer.skype.com/Docs/ApiDoc/CHAT_object 
 * @author Koji Hisano.
 */
public final class Chat extends SkypeObject {
    /**
     * Collection of Chat objects.
     */
    private static final Map chats = new HashMap();
    
    /**
     * Returns the Chat object by the specified id.
     * @param id whose associated Chat object is to be returned.
     * @return Chat object with ID == id.
     */
    static Chat getInstance(final String id) {
        synchronized(chats) {
            if (!chats.containsKey(id)) {
                chats.put(id, new Chat(id));
            }
            return chats.get(id);
        }
    }

	/**
	 * Enumeration of the status of CHAT object.
	 */
    public enum Status {
        // TODO examine when LEGACY_DIALOG is used
    	/**
    	 * LEGACY_DIALOG - old style IM
    	 * DIALOG - 1:1 chat.
    	 * MULTI_SUBSCRIBED - participant in chat
    	 * UNSUBSCRIBED - left chat 
    	 */
        DIALOG, LEGACY_DIALOG, MULTI_SUBSCRIBED, UNSUBSCRIBED;
    }

    /**
     * ID of this CHAT object.
     */
    private final String id;

    /**
     * Constructor, please use getChat() instead.
     * @param newId ID of this CHAT.
     */
    private Chat(String newId) {
        assert newId != null;
        this.id = newId;
    }

    
    /**
     * Return the hashcode of this CHAT object.
     * @return ID.
     */
    public int hashCode() {
        return getId().hashCode();
    }

    /**
     * Implement a equals check for CHAT objects based on their ID's.
     * @param compared The object to compare to.
     * @return true when objects are equal.
     */
    public boolean equals(Object compared) {
        if (compared instanceof Chat) {
            return getId().equals(((Chat) compared).getId());
        }
        return false;
    }

    /**
     * Return the ID of this CHAT object.
     * @return the ID.
     */
    public String getId() {
        return id;
    }

    /**
     * Set the topic of this CHAT.
     * @param newValue The new topic.
     * @throws SkypeException when the connection has gone bad.
     */
    public void setTopic(String newValue) throws SkypeException {
        try {
            String command = "ALTER CHAT " + getId() + " SETTOPIC " + newValue;
            String responseHeader = "ALTER CHAT SETTOPIC";
            String response = Connector.getInstance().execute(command, responseHeader);
            Utils.checkError(response);
        } catch (ConnectorException e) {
            Utils.convertToSkypeException(e);
        }
    }

    /**
     * Add a User to this CHAT.
     * @param addedUser the user to add.
     * @throws SkypeException when connection has gone bad.
     */
    public void addUser(User addedUser) throws SkypeException {
        Utils.checkNotNull("addedUser", addedUser);
        addUsers(new User[] {addedUser});
    }

    /**
     * Add several users to this CHAT.
     * @param addedUsers Users to add.
     * @throws SkypeException when the connection has gone bad.
     */
    public void addUsers(User[] addedUsers) throws SkypeException {
        Utils.checkNotNull("addedUsers", addedUsers);
        try {
            String command = "ALTER CHAT " + getId() + " ADDMEMBERS " + toCommaSeparatedString(addedUsers);
            String responseHeader = "ALTER CHAT ADDMEMBERS";
            String response = Connector.getInstance().execute(command, responseHeader);
            Utils.checkError(response);
        } catch (ConnectorException e) {
            Utils.convertToSkypeException(e);
        }
    }

    /**
     * Return a comma seperated String of Usernames.
     * @param users The users to put into the String.
     * @return The comma seperated string.
     */
    private static String toCommaSeparatedString(User[] users) {
        StringBuilder builder = new StringBuilder();
        for (int i = 0; i < users.length; i++) {
            if (i != 0) {
                builder.append(", ");
            }
            builder.append(users[i].getId());
        }
        return builder.toString();
    }

    /**
     * Leave this CHAT.
     * @throws SkypeException when the connection has gone bad.
     */
    public void leave() throws SkypeException {
        try {
            String command = "ALTER CHAT " + getId() + " LEAVE";
            String responseHeader = "ALTER CHAT LEAVE";
            String response = Connector.getInstance().execute(command, responseHeader);
            Utils.checkError(response);
        } catch (ConnectorException e) {
            Utils.convertToSkypeException(e);
        }
    }

    /**
     * Return all messages posted in this CHAT.
     * @return array of messages.
     * @throws SkypeException when connection has gone bad.
     */
    public ChatMessage[] getAllChatMessages() throws SkypeException {
        try {
            String command = "GET CHAT " + getId() + " CHATMESSAGES";
            String responseHeader = "CHAT " + getId() + " CHATMESSAGES ";
            String response = Connector.getInstance().execute(command, responseHeader);
            if (response.contains("ERROR")) {
            	throw new SkypeException("Error when issuing command: " + command + " - " + response);
            }
            String data = response.substring(responseHeader.length());
            String[] ids = Utils.convertToArray(data);
            ChatMessage[] chatMessages = new ChatMessage[ids.length];
            for (int i = 0; i < ids.length; ++i) {
                chatMessages[i] = ChatMessage.getInstance(ids[i]);
            }
            return chatMessages;
        } catch (ConnectorException ex) {
            Utils.convertToSkypeException(ex);
            return null;
        }
    }

    /**
     * Get the most recent chatmessages for this CHAT.
     * @return array of recent chatmessages.
     * @throws SkypeException when conenction is gone bad.
     */
    public ChatMessage[] getRecentChatMessages() throws SkypeException {
        try {
            String command = "GET CHAT " + getId() + " RECENTCHATMESSAGES";
            String responseHeader = "CHAT " + getId() + " RECENTCHATMESSAGES ";
            String response = Connector.getInstance().execute(command, responseHeader);
            String data = response.substring(responseHeader.length());
            String[] ids = Utils.convertToArray(data);
            ChatMessage[] chatMessages = new ChatMessage[ids.length];
            for (int i = 0; i < ids.length; ++i) {
                chatMessages[i] = ChatMessage.getInstance(ids[i]);
            }
            return chatMessages;
        } catch (ConnectorException ex) {
            Utils.convertToSkypeException(ex);
            return null;
        }
    }

    /**
     * Send a message to this CHAT.
     * @param message the message to send.
     * @return the newly created message which has been sent.
     * @throws SkypeException when the connection has gone bad.
     */
    public ChatMessage send(String message) throws SkypeException {
        try {
            String responseHeader = "CHATMESSAGE ";
            String response = Connector.getInstance().executeWithId("CHATMESSAGE " + getId() + " " + message, responseHeader);
            Utils.checkError(response);
            String msgId = response.substring(responseHeader.length(), response.indexOf(" STATUS "));
            return ChatMessage.getInstance(msgId);
        } catch (ConnectorException e) {
            Utils.convertToSkypeException(e);
            return null;
        }
    }

    /**
     * Return the timestamp of this CHAT.
     * @return date of this CHAT.
     * @throws SkypeException when the connection has gone bad.
     */
    public Date getTime() throws SkypeException {
        return Utils.parseUnixTime(getProperty("TIMESTAMP"));
    }

    /**
     * Return user who added the current user to chat.
     * @return User who added us.
     * @throws SkypeException when connection has gone bad.
     */
    public User getAdder() throws SkypeException {
        String adder = getProperty("ADDER");
        if ("".equals(adder)) {
            return null;
        } else {
            return User.getInstance(adder);
        }
    }

    /**
     * Return the status of this CHAT.
     * @return chat status.
     * @throws SkypeException when the connection has gone bad.
     */
    public Status getStatus() throws SkypeException {
        return Status.valueOf(Utils.getPropertyWithCommandId("CHAT", getId(), "STATUS"));
    }

    /**
     * Get the friendly name of this chat.
     * @return friendly name of this chat.
     * @throws SkypeException when the connection has gone bad.
     */
    public String getWindowTitle() throws SkypeException {
        return getProperty("FRIENDLYNAME");
    }

    /** 
     * Return all chatting members on this CHAT.
     * @return array of chatting users.
     * @throws SkypeException when connection has gone bad.
     */
    public User[] getAllPosters() throws SkypeException {
        return getUsersProperty("POSTERS");
    }

    /**
     * Return all users in this CHAT.
     * @return array of members.
     * @throws SkypeException when connection has gone bad.
     */
    public User[] getAllMembers() throws SkypeException {
        return getUsersProperty("MEMBERS");
    }

    // TODO examine what are active members
    /**
     * Return all active members of CHAT.
     * @return array of active Users.
     * @throws SkypeException when connection has gone bad.
     */
    public User[] getAllActiveMembers() throws SkypeException {
        return getUsersProperty("ACTIVEMEMBERS");
    }

    /**
     * Get a property of a User who is member in this chat.
     * @param name Username.
     * @return Array of user.
     * @throws SkypeException when connection has gone bad.
     */
    private User[] getUsersProperty(String name) throws SkypeException {
        try {
            String command = "GET CHAT " + getId() + " " + name;
            String responseHeader = "CHAT " + id + " " + name + " ";
            String response = Connector.getInstance().execute(command, responseHeader);
            String data = response.substring(responseHeader.length());
            if ("".equals(data)) {
                return new User[0];
            }
            String[] ids = data.split(" ");
            User[] users = new User[ids.length];
            for (int i = 0; i < ids.length; ++i) {
                users[i] = User.getInstance(ids[i]);
            }
            return users;
        } catch (ConnectorException ex) {
            Utils.convertToSkypeException(ex);
            return null;
        }
    }

    /**
     * Indicates if this chat has been bookmarked.
     * @return true if this chat is bookmarked
     * @throws SkypeException when the connection has gone bad.
     */
    public boolean isBookmarked() throws SkypeException {
        return Boolean.parseBoolean(getProperty("BOOKMARKED"));
    }

    /**
     * Return a property of this CHAT.
     * @param name propertyname.
     * @return value of the property.
     * @throws SkypeException when the connection has gone bad or property ain't found.
     */
    private String getProperty(String name) throws SkypeException {
        return Utils.getProperty("CHAT", getId(), name);
    }
}




© 2015 - 2024 Weber Informatics LLC | Privacy Policy