134 lines
3.8 KiB
Java
134 lines
3.8 KiB
Java
package server;
|
|
|
|
import java.io.IOException;
|
|
import java.net.DatagramSocket;
|
|
import java.net.InetSocketAddress;
|
|
import java.net.SocketException;
|
|
|
|
import network.SocketWriter;
|
|
import network.protocol.Packet;
|
|
import network.protocol.PacketVisitor;
|
|
import network.protocol.packets.ChatMessagePacket;
|
|
import network.protocol.packets.CreateRoomPacket;
|
|
import network.protocol.packets.DisconnectPacket;
|
|
import network.protocol.packets.JoinRoomPacket;
|
|
import network.protocol.packets.LeaveRoomPacket;
|
|
import network.protocol.packets.LoginPacket;
|
|
import network.protocol.packets.RequestRoomListPacket;
|
|
import network.protocol.packets.RoomListPacket;
|
|
import network.protocol.packets.SendChatMessagePacket;
|
|
import network.protocol.packets.ServerResponsePacket;
|
|
import network.protocol.packets.ServerResponsePacket.Response;
|
|
|
|
public class ServerConnexion implements PacketVisitor {
|
|
|
|
private final Server server;
|
|
private final InetSocketAddress clientAddress;
|
|
private final SocketWriter writer;
|
|
private String chatterName;
|
|
|
|
public ServerConnexion(Server server, DatagramSocket socket, InetSocketAddress clientAddress) {
|
|
this.clientAddress = clientAddress;
|
|
this.server = server;
|
|
this.writer = new SocketWriter(socket);
|
|
}
|
|
|
|
public String getChatterName() {
|
|
return this.chatterName;
|
|
}
|
|
|
|
public void sendPacket(Packet packet) {
|
|
try {
|
|
this.writer.sendPacket(packet, clientAddress);
|
|
} catch (IOException e) {
|
|
e.printStackTrace();
|
|
this.server.removeConnexion(this);
|
|
}
|
|
}
|
|
|
|
@Override
|
|
public void visitPacket(CreateRoomPacket packet) {
|
|
try {
|
|
server.createRoom(packet.getRoomName(), this);
|
|
sendPacket(new ServerResponsePacket(Response.RoomCreated));
|
|
} catch (SocketException e) {
|
|
sendPacket(new ServerResponsePacket(Response.RoomNotCreated));
|
|
}
|
|
}
|
|
|
|
@Override
|
|
public void visitPacket(JoinRoomPacket packet) {
|
|
try {
|
|
server.joinRoom(packet.getRoomName(), this);
|
|
sendPacket(new ServerResponsePacket(Response.RoomJoined));
|
|
} catch (SocketException e) {
|
|
sendPacket(new ServerResponsePacket(Response.RoomNotJoined));
|
|
}
|
|
}
|
|
|
|
@Override
|
|
public void visitPacket(LeaveRoomPacket packet) {
|
|
try {
|
|
server.leaveRoom(this);
|
|
sendPacket(new ServerResponsePacket(Response.RoomLeft));
|
|
} catch (SocketException e) {
|
|
sendPacket(new ServerResponsePacket(Response.RoomNotLeft));
|
|
}
|
|
}
|
|
|
|
@Override
|
|
public void visitPacket(LoginPacket packet) {
|
|
if (server.hasChatterName(packet.getPseudo())) {
|
|
sendPacket(new ServerResponsePacket(Response.AuthError));
|
|
return;
|
|
}
|
|
|
|
this.chatterName = packet.getPseudo();
|
|
sendPacket(new RoomListPacket(server.getRoomNames()));
|
|
System.out.println("[Server] Chatter " + packet.getPseudo() + " connected !");
|
|
}
|
|
|
|
@Override
|
|
public void visitPacket(RequestRoomListPacket packet) {
|
|
sendPacket(new RoomListPacket(server.getRoomNames()));
|
|
}
|
|
|
|
@Override
|
|
public void visitPacket(SendChatMessagePacket packet) {
|
|
try {
|
|
server.sendToRoom(this, packet);
|
|
} catch (SocketException e) {
|
|
sendPacket(new ServerResponsePacket(Response.MessageNotSent));
|
|
}
|
|
}
|
|
|
|
@Override
|
|
public void visitPacket(DisconnectPacket packet) {
|
|
this.onDisconnect();
|
|
}
|
|
|
|
private void onDisconnect() {
|
|
this.server.removeConnexion(this);
|
|
System.out.println("[Server] Chatter " + chatterName + " disconnected !");
|
|
}
|
|
|
|
@Override
|
|
public void visitPacket(RoomListPacket packet) {
|
|
// I'm never supposed to receive this from the client
|
|
throw new UnsupportedOperationException("Unimplemented method 'visitPacket'");
|
|
}
|
|
|
|
@Override
|
|
public void visitPacket(ChatMessagePacket packet) {
|
|
// I'm never supposed to receive this from the client
|
|
throw new UnsupportedOperationException("Unimplemented method 'visitPacket'");
|
|
}
|
|
|
|
@Override
|
|
public void visitPacket(ServerResponsePacket packet) {
|
|
// I'm never supposed to receive this from the client
|
|
throw new UnsupportedOperationException("Unimplemented method 'visitPacket'");
|
|
}
|
|
|
|
}
|