BugFix e atualização da interface no mpChat
This commit is contained in:
1 parent
7a699cd280
commit
581a924afc
8 files changed
+222
-179
No files matched your search
@@ -0,0 +1,116 @@
|
||||
package control;
|
||||
|
||||
import GUI.PrivateChatWindow;
|
||||
import net.MpChatMessage;
|
||||
import pitiupi.models.User;
|
||||
import pitiupi.net.tcp.TcpConnection;
|
||||
import pitiupi.plugin.Pitiupi;
|
||||
import plugin.MultiProtocolChat;
|
||||
|
||||
import java.util.HashMap;
|
||||
import java.util.HashSet;
|
||||
import java.util.Map;
|
||||
import java.util.Set;
|
||||
|
||||
public class PrivateChatController {
|
||||
|
||||
private final Pitiupi pitiupi;
|
||||
private final MultiProtocolChat multiProtocolChat;
|
||||
|
||||
/*
|
||||
* Relaciona o endereço do usuário à janela de chat.
|
||||
*/
|
||||
private final Map<String, PrivateChatWindow> windows;
|
||||
|
||||
/*
|
||||
* Endereços para os quais uma conexão já foi solicitada,
|
||||
* mas ainda não chegou.
|
||||
*/
|
||||
private final Set<String> pendingConnections;
|
||||
|
||||
public PrivateChatController(
|
||||
Pitiupi pitiupi,
|
||||
MultiProtocolChat multiProtocolChat
|
||||
) {
|
||||
this.pitiupi = pitiupi;
|
||||
this.multiProtocolChat = multiProtocolChat;
|
||||
|
||||
this.windows = new HashMap<>();
|
||||
this.pendingConnections = new HashSet<>();
|
||||
}
|
||||
|
||||
public void openChat(User user) {
|
||||
String address = user.getAddress().getHostAddress();
|
||||
|
||||
PrivateChatWindow window = windows.get(address);
|
||||
|
||||
/*
|
||||
* Já existe uma janela para esse usuário.
|
||||
*/
|
||||
if (window != null) {
|
||||
window.setVisible(true);
|
||||
window.toFront();
|
||||
window.requestFocus();
|
||||
return;
|
||||
}
|
||||
|
||||
/*
|
||||
* Já estamos esperando uma conexão para esse usuário.
|
||||
*/
|
||||
if (pendingConnections.contains(address)) {
|
||||
return;
|
||||
}
|
||||
|
||||
/*
|
||||
* Ainda não existe conexão.
|
||||
*/
|
||||
pendingConnections.add(address);
|
||||
|
||||
multiProtocolChat.openConnection(address);
|
||||
}
|
||||
|
||||
public void receiveMessage(TcpConnection connection, MpChatMessage message) {
|
||||
String address = connection.getAddress().toString();
|
||||
|
||||
PrivateChatWindow window = windows.get(address);
|
||||
|
||||
if (window == null) {
|
||||
return;
|
||||
}
|
||||
|
||||
window.receiveMessage(message);
|
||||
}
|
||||
|
||||
/**
|
||||
* Deve ser chamado quando uma nova conexão privada chegar.
|
||||
*/
|
||||
public void connectionReceived(TcpConnection connection) {
|
||||
String address = connection.getAddress().toString();
|
||||
|
||||
pendingConnections.remove(address);
|
||||
|
||||
PrivateChatWindow window = new PrivateChatWindow(
|
||||
pitiupi,
|
||||
connection
|
||||
);
|
||||
|
||||
windows.put(address, window);
|
||||
|
||||
window.setVisible(true);
|
||||
window.toFront();
|
||||
window.requestFocus();
|
||||
}
|
||||
|
||||
/**
|
||||
* Fecha a janela e remove o relacionamento.
|
||||
*/
|
||||
public void closeChat(TcpConnection connection) {
|
||||
String address = connection.getAddress().toString();
|
||||
|
||||
PrivateChatWindow window = windows.remove(address);
|
||||
|
||||
if (window != null) {
|
||||
window.dispose();
|
||||
}
|
||||
}
|
||||
}
|
||||
Reference in new issue
Block a user