package auctionsniper.xmpp;
import org.jivesoftware.smack.Chat;
import org.jivesoftware.smack.XMPPConnection;
import org.jivesoftware.smack.XMPPException;
import auctionsniper.Auction;
import auctionsniper.AuctionEventListener;
import auctionsniper.util.Announcer;
public class XMPPAuction implements Auction {
public static final String JOIN_COMMAND_FORMAT = "SOLVersion: 1.1; Command: JOIN;";
public static final String BID_COMMAND_FORMAT = "SOLVersion: 1.1; Command: BID; Price: %d;";
private final Announcer<AuctionEventListener> auctionEventListeners = Announcer.to(AuctionEventListener.class);
private final Chat chat;
private final XMPPFailureReporter failureReporter;
public XMPPAuction(XMPPConnection connection, String auctionJID, XMPPFailureReporter failureReporter) {
this.failureReporter = failureReporter;
AuctionMessageTranslator translator = translatorFor(connection);
this.chat = connection.getChatManager().createChat( auctionJID, translator);
addAuctionEventListener(chatDisconnectorFor(translator));
}
public void bid(int amount) {
sendMessage(String.format(BID_COMMAND_FORMAT, amount));
}
public void join() {
sendMessage(JOIN_COMMAND_FORMAT);
}
public void addAuctionEventListener(AuctionEventListener listener) {
auctionEventListeners.addListener(listener);
}
private AuctionMessageTranslator translatorFor(XMPPConnection connection) {
return new AuctionMessageTranslator(connection.getUser(), auctionEventListeners.announce(), failureReporter);
}
private AuctionEventListener
chatDisconnectorFor(final AuctionMessageTranslator translator) {
return new AuctionEventListener() {
public void auctionFailed() {
chat.removeMessageListener(translator);
}
public void auctionClosed() { }
public void currentPrice(int price, int increment, PriceSource priceSource) { }
};
}
private void sendMessage(final String message) {
try {
chat.sendMessage(message);
} catch (XMPPException e) {
e.printStackTrace();
}
}
}