package com.kolakcc.loljclient.controller; import java.awt.event.MouseEvent; import java.awt.event.MouseListener; import java.io.InputStreamReader; import java.io.OutputStreamWriter; import java.util.Collection; import javax.swing.JOptionPane; import javax.swing.SwingUtilities; import javax.swing.SwingWorker; import javax.swing.event.DocumentEvent; import javax.swing.event.DocumentListener; import org.jivesoftware.smack.Chat; import org.jivesoftware.smack.ChatManagerListener; import org.jivesoftware.smack.Connection; import org.jivesoftware.smack.RosterListener; import org.jivesoftware.smack.debugger.ConsoleDebugger; import org.jivesoftware.smack.packet.Message; import org.jivesoftware.smack.packet.Presence; import org.jivesoftware.smack.packet.Presence.Mode; import org.jivesoftware.smackx.muc.InvitationListener; import org.jivesoftware.smackx.muc.MultiUserChat; import com.kolakcc.loljclient.model.ServerInfo; import com.kolakcc.loljclient.model.Status; import com.kolakcc.loljclient.model.XMPPWrapper; import com.kolakcc.loljclient.model.swing.FriendsListModel; import com.kolakcc.loljclient.model.swing.StatusComboBoxModel; import com.kolakcc.loljclient.util.Configuration; import com.kolakcc.loljclient.view.FriendsListView; public class FriendsListController extends KolaController implements MouseListener, DocumentListener, RosterListener, ChatManagerListener { private FriendsListView view; protected FriendsListModel onlineModel; protected FriendsListModel offlineModel; SwingWorker<Void, Void> connectionWorker; public FriendsListController(String username, String password) { if (ServerInfo.currentServerInfo.XMPPserver == null) { JOptionPane.showMessageDialog(null, "You're using a region of League of Legends that does not yet have a chat server configured - please contact KolakCC to get it added!"); return; } this.view = new FriendsListView(); this.setView(this.view); this.initializeWorkers(username, password); this.onlineModel = new FriendsListModel(FriendsListModel.ShowMode.ONLINE); this.view.onlineList.setModel(onlineModel); this.view.onlineList.addMouseListener(this); this.offlineModel = new FriendsListModel(FriendsListModel.ShowMode.OFFLINE); this.view.offlineList.setModel(offlineModel); this.view.presenceComboBox.setModel(new StatusComboBoxModel()); this.view.presenceStatusField.getDocument().addDocumentListener(this); this.connectionWorker.execute(); } public void initializeWorkers(final String username, final String password) { this.connectionWorker = new SwingWorker<Void, Void>() { protected Void doInBackground() throws Exception { XMPPWrapper.login(username, password); FriendsListController.this.updateStatus(Configuration.getXMPPStatus()); FriendsListController.this.view.presenceStatusField.setText(Configuration.getXMPPStatus()); FriendsListController.this.refreshLists(); XMPPWrapper.getConnection().getRoster() .addRosterListener(FriendsListController.this); XMPPWrapper.getConnection().getChatManager().addChatListener(FriendsListController.this); MultiUserChat.addInvitationListener(XMPPWrapper.getConnection(), new InvitationListener() { @Override public void invitationReceived(Connection conn, String room, String inviter, String reason, String password, Message message) { } }); new ConsoleDebugger(XMPPWrapper.getConnection(), new OutputStreamWriter(System.out), new InputStreamReader(System.in)); return null; } }; } @Override public void mouseClicked(MouseEvent e) { if ((e.getClickCount() == 2) && (this.view.onlineList.getSelectedIndex() != -1)) { new FriendChatController( this.onlineModel.getElementAt(this.view.onlineList .getSelectedIndex())); } } public void refreshLists() { SwingUtilities.invokeLater(new Runnable() { @Override public void run() { //TODO: find out why I can't update the model instead of replacing the model onlineModel = new FriendsListModel(FriendsListModel.ShowMode.ONLINE); FriendsListController.this.view.onlineList.setModel(onlineModel); offlineModel = new FriendsListModel(FriendsListModel.ShowMode.OFFLINE); FriendsListController.this.view.offlineList.setModel(offlineModel); } }); } public void updateStatus(String status) { //TODO: totally editable messages Configuration.setStatus(status); Configuration.flushConfig(); String statusXML = String.format("<body><level>99</level><profileIcon>28</profileIcon><wins>9001</wins><rankedWins>9001</rankedWins><statusMsg>%s</statusMsg></body>", status); Status selectedStatus = (Status) this.view.presenceComboBox.getSelectedItem(); Mode presenceMode = Presence.Mode.chat; if (selectedStatus.getDisplay().equals("Away")) presenceMode = Presence.Mode.away; Presence newPresence = new Presence(Presence.Type.available,statusXML,1,presenceMode); XMPPWrapper.getConnection().sendPacket(newPresence); } public void presenceChanged(Presence presence) { this.refreshLists(); } public void chatCreated(final Chat chat, boolean createdLocally) { if (!createdLocally) { SwingUtilities.invokeLater(new Runnable() { @Override public void run() { FriendChatController chatController = new FriendChatController(chat); chat.addMessageListener(chatController.getMessageListener()); } }); } } @Override public void insertUpdate(DocumentEvent e) { updateStatus(this.view.presenceStatusField.getText()); } @Override public void removeUpdate(DocumentEvent e) { updateStatus(this.view.presenceStatusField.getText()); } @Override public void changedUpdate(DocumentEvent e) {} public void entriesAdded(Collection<String> addresses) { } public void entriesDeleted(Collection<String> addresses) { } public void entriesUpdated(Collection<String> addresses) { } @Override public void mouseEntered(MouseEvent e) { } @Override public void mouseExited(MouseEvent e) { } @Override public void mousePressed(MouseEvent e) { } @Override public void mouseReleased(MouseEvent e) { } }