/*
* Copyright 2016 Sam Sun <me@samczsun.com>
*
* 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 com.samczsun.skype4j.chat;
import com.samczsun.skype4j.Skype;
import com.samczsun.skype4j.chat.messages.ChatMessage;
import com.samczsun.skype4j.exceptions.ConnectionException;
import com.samczsun.skype4j.exceptions.handler.ErrorHandler;
import com.samczsun.skype4j.formatting.IMoji;
import com.samczsun.skype4j.formatting.Message;
import com.samczsun.skype4j.participants.Participant;
import com.samczsun.skype4j.participants.info.Contact;
import com.samczsun.skype4j.participants.User;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.IOException;
import java.util.Collection;
import java.util.List;
/**
* Represents a single chat. This can be a private message or a group chat.
*/
public interface Chat {
/**
* Sends a formatted message to this chat.
*
* @param message The rich text to send
* @return The {@link ChatMessage} object representing the message
* @throws ConnectionException If an error occurs while connecting to the endpoint
*/
ChatMessage sendMessage(Message message) throws ConnectionException;
/**
* Sends a plain message to this chat.
*
* @param plainMessage The plain message to send
* @return The {@link ChatMessage} object representing the message
* @throws ConnectionException If an error occurs while connecting to the endpoint
*/
ChatMessage sendMessage(String plainMessage) throws ConnectionException;
/**
* Sends a contact to this chat
*
* @param contact The contact to send
* @throws ConnectionException If an error occurs while connecting to the endpoint
*/
void sendContact(Contact contact) throws ConnectionException;
/**
* Sends an image to this chat
*
* @param image The image to send
* @param imageType The type of image (jpg, png, etc)
* @param imageName The name of the image
* @throws ConnectionException If an error occurs while connecting to the endpoint
* @throws IOException If an error occurs while reading the image file
*/
void sendImage(BufferedImage image, String imageType, String imageName) throws ConnectionException, IOException;
/**
* Sends an image to this chat
*
* @param image The file containing the image
* @throws ConnectionException If an error occurs while connecting to the endpoint
* @throws IOException If an error occurs while reading the image file
*/
void sendImage(File image) throws ConnectionException, IOException;
/**
* Sends a file to this chat
*
* @param file The file to send
* @throws ConnectionException If an error occurs while connecting to the endpoint
*/
void sendFile(File file) throws ConnectionException;
/**
* Sends a Moji to this chat
*
* @param moji The appropriate lang-based Flik message
* @throws ConnectionException If an error occurs while connecting to the endpoint
*/
void sendMoji(IMoji moji) throws ConnectionException;
/**
* Get a participant based on their id. The ID is in the format of {number}:{string}
*
* For example, a user has id 8:{username} while a bot has id 28:{uuid}
*
* @param id The id of the participant
* @return The participant, or null if not found
*/
Participant getParticipant(String id);
/**
* Get yourself!
*
* @return Your user object!
*/
User getSelf();
/**
* Get the identity of the chat. Persistent across restarts
*
* @return The identity of this chat
*/
String getIdentity();
/**
* Return a view of all the users in this chat
*
* @return All the users
*/
Collection<Participant> getAllParticipants();
/**
* Return a view of all the messages saved, in chronological order
*
* @return All the messages saved
*/
List<ChatMessage> getAllMessages();
/**
* Get the {@link Skype} instance associated with this chat
*
* @return The Skype instance
*/
Skype getClient();
/**
* Sets your alerts off. Does not affect anything in this API
*
* @throws ConnectionException If an error occurs while connecting to the endpoint
*/
void alertsOff() throws ConnectionException;
/**
* Sets your alerts on. Does not affect anything in this API
*
* @throws ConnectionException If an error occurs while connecting to the endpoint
*/
void alertsOn() throws ConnectionException;
/**
* Sets your alerts on to a keyword. Does not affect anything in this API
*
* @param keyword The word to alert to
* @throws ConnectionException If an error occurs while connecting to the endpoint
*/
void alertsOn(String keyword) throws ConnectionException;
/**
* Load more chatmessages from the past
*
* @param amount The amount of messages to load
* @return The loaded messages
* @throws ConnectionException If an error occurs while connecting to the endpoint
*/
List<ChatMessage> loadMoreMessages(int amount) throws ConnectionException;
/*
* Send the typing notification. Note that this will spawn a new thread so supplying an ErrorHandler is recommended
* If typing is already being sent no action will be taken.
*
* If an error occurs the default handler will be notified
*/
default void startTyping() {
startTyping(null);
}
/*
* Send the typing notification. If an connection exception occurs the specified handler as well
* as the default handler will be notified
*/
void startTyping(ErrorHandler handler);
/*
* Stop sending the typing notification
*/
void stopTyping();
/*
* Forces a synchronization of this Chat with the remote Chat.
*
* What this updates is up to the implementation
*/
void sync() throws ConnectionException;
}