Fix: Resolving Git Merge Conflicts #253
@@ -341,4 +341,103 @@ LIST_USERS
|
|||||||
END
|
END
|
||||||
END
|
END
|
||||||
END
|
END
|
||||||
|
```
|
||||||
|
|
||||||
|
## SEND_MESSAGE command
|
||||||
|
The `SEND_MESSAGE` command is used to transfer the chat message sent by a user to the server.
|
||||||
|
### Required pre-execution checks
|
||||||
|
None.
|
||||||
|
|
||||||
|
### Request Parameters
|
||||||
|
|
||||||
|
| Field | Type | Description |
|
||||||
|
|:---------|:----------------|:-------------------------------------------------------------------|
|
||||||
|
| `TYPE` | `Enum<ChatType` | GLOBAL, LOBBY or WHISPER, specifying the Chat |
|
||||||
|
| `GAME` | `int` | ID for identifying the Lobby Chat |
|
||||||
|
| `USER` | `String` | Username of the player that sent the message |
|
||||||
|
| `TARGET` | `String` | Username of to which the message is sent to (only in Whisper Chat) |
|
||||||
|
| `TIME` | `String` | Timestamp, when the message was sent |
|
||||||
|
| `TEXT` | `String` | Content of the message |
|
||||||
|
|
||||||
|
### Success Response
|
||||||
|
No response fields.
|
||||||
|
|
||||||
|
### Error Response
|
||||||
|
None.
|
||||||
|
|
||||||
|
### Example Request
|
||||||
|
```
|
||||||
|
SEND_MESSAGE TYPE=GLOBAL GAME=1 USER=player1 TARGET=null TIME='10:30' TEXT='Hello World'
|
||||||
|
```
|
||||||
|
|
||||||
|
### Example Response
|
||||||
|
```
|
||||||
|
+OK
|
||||||
|
END
|
||||||
|
```
|
||||||
|
|
||||||
|
## GET_MESSAGE_COUNT command
|
||||||
|
The `GET_MESSAGE_COUNT` is used to get the current number of messages that are stored in the queue for a client.
|
||||||
|
### Required pre-execution checks
|
||||||
|
None.
|
||||||
|
|
||||||
|
### Request Parameters
|
||||||
|
No parameters.
|
||||||
|
|
||||||
|
### Success Response
|
||||||
|
|
||||||
|
| Field | Type | Description |
|
||||||
|
|:--------|:------|:-------------------------------|
|
||||||
|
| `COUNT` | `int` | The current number of messages |
|
||||||
|
|
||||||
|
### Error Response
|
||||||
|
| Code | Description |
|
||||||
|
| :------------------- |:---------------------------------------------------------------------------------|
|
||||||
|
| `NO_USER_ASSOCIATED` | The session has no user associated, there is no queue of messages for the client |
|
||||||
|
|
||||||
|
|
||||||
|
### Example Request
|
||||||
|
```
|
||||||
|
GET_MESSAGE_COUNT
|
||||||
|
```
|
||||||
|
|
||||||
|
### Example Response
|
||||||
|
```
|
||||||
|
+OK
|
||||||
|
COUNT=10
|
||||||
|
END
|
||||||
|
```
|
||||||
|
|
||||||
|
## GET_NEXT_MESSAGE command
|
||||||
|
The `GET_NEXT_MESSAGE` command is used to get the next message stored in a queue for the client.
|
||||||
|
### Required pre-execution checks
|
||||||
|
None.
|
||||||
|
|
||||||
|
### Request Parameters
|
||||||
|
No parameters.
|
||||||
|
|
||||||
|
### Success Response
|
||||||
|
| Field | Type | Description |
|
||||||
|
|:---------|:----------------|:-------------------------------------------------------------------|
|
||||||
|
| `TYPE` | `Enum<ChatType` | GLOBAL, LOBBY or WHISPER, specifying the Chat |
|
||||||
|
| `GAME` | `int` | ID for identifying the Lobby Chat |
|
||||||
|
| `USER` | `String` | Username of the player that sent the message |
|
||||||
|
| `TARGET` | `String` | Username of to which the message is sent to (only in Whisper Chat) |
|
||||||
|
| `TIME` | `String` | Timestamp, when the message was sent |
|
||||||
|
| `TEXT` | `String` | Content of the message |
|
||||||
|
### Error Response
|
||||||
|
| Code | Description |
|
||||||
|
| :------------------- |:---------------------------------------------------------------------------------|
|
||||||
|
| `NO_USER_ASSOCIATED` | The session has no user associated, there is no queue of messages for the client |
|
||||||
|
|
||||||
|
### Example Request
|
||||||
|
```
|
||||||
|
GET_NEXT_MESSAGE
|
||||||
|
```
|
||||||
|
|
||||||
|
### Example Response
|
||||||
|
```
|
||||||
|
+OK
|
||||||
|
TYPE=GLOBAL GAME=-1 USER=player1 TARGET=null TIME=9:30 TEXT="Guten Tag"
|
||||||
|
END
|
||||||
```
|
```
|
||||||
@@ -35,12 +35,13 @@ import ch.unibas.dmi.dbis.cs108.casono.server.network.events.EventBus;
|
|||||||
import ch.unibas.dmi.dbis.cs108.casono.server.network.protocol.response.dispatcher.ResponseDispatcher;
|
import ch.unibas.dmi.dbis.cs108.casono.server.network.protocol.response.dispatcher.ResponseDispatcher;
|
||||||
import ch.unibas.dmi.dbis.cs108.casono.server.network.sessions.SessionDisconnectJob;
|
import ch.unibas.dmi.dbis.cs108.casono.server.network.sessions.SessionDisconnectJob;
|
||||||
import ch.unibas.dmi.dbis.cs108.casono.server.network.sessions.SessionManager;
|
import ch.unibas.dmi.dbis.cs108.casono.server.network.sessions.SessionManager;
|
||||||
|
import org.apache.logging.log4j.LogManager;
|
||||||
|
import org.apache.logging.log4j.Logger;
|
||||||
|
|
||||||
import java.time.Duration;
|
import java.time.Duration;
|
||||||
import java.util.concurrent.Executors;
|
import java.util.concurrent.Executors;
|
||||||
import java.util.concurrent.ScheduledExecutorService;
|
import java.util.concurrent.ScheduledExecutorService;
|
||||||
import java.util.concurrent.TimeUnit;
|
import java.util.concurrent.TimeUnit;
|
||||||
import org.apache.logging.log4j.LogManager;
|
|
||||||
import org.apache.logging.log4j.Logger;
|
|
||||||
|
|
||||||
/** Application class for starting the server. */
|
/** Application class for starting the server. */
|
||||||
public class ServerApp {
|
public class ServerApp {
|
||||||
@@ -49,7 +50,7 @@ public class ServerApp {
|
|||||||
private static final int USER_CLEANUP_JOB_RECONNECT_THRESHOLD = 10;
|
private static final int USER_CLEANUP_JOB_RECONNECT_THRESHOLD = 10;
|
||||||
private static final int SESSION_DISCONNECT_JOB_DELAY = 0;
|
private static final int SESSION_DISCONNECT_JOB_DELAY = 0;
|
||||||
private static final int SESSION_DISCONNECT_JOB_PERIOD = 2;
|
private static final int SESSION_DISCONNECT_JOB_PERIOD = 2;
|
||||||
private static final int SESSION_DISCONNECT_JOB_TIMEOUT = 30;
|
private static final int SESSION_DISCONNECT_JOB_TIMEOUT = 5;
|
||||||
|
|
||||||
public static void start(String arg) {
|
public static void start(String arg) {
|
||||||
int port = Integer.parseInt(arg);
|
int port = Integer.parseInt(arg);
|
||||||
|
|||||||
+1
-5
@@ -1,15 +1,12 @@
|
|||||||
package ch.unibas.dmi.dbis.cs108.casono.server.app.commands.check_nick;
|
package ch.unibas.dmi.dbis.cs108.casono.server.app.commands.check_nick;
|
||||||
|
|
||||||
import ch.unibas.dmi.dbis.cs108.casono.server.domain.user.User;
|
import ch.unibas.dmi.dbis.cs108.casono.server.domain.user.User;
|
||||||
import ch.unibas.dmi.dbis.cs108.casono.server.domain.user.UserRegistry;
|
import ch.unibas.dmi.dbis.cs108.casono.server.domain.user.UserRegistry;
|
||||||
import ch.unibas.dmi.dbis.cs108.casono.server.network.command.execution.CommandHandler;
|
import ch.unibas.dmi.dbis.cs108.casono.server.network.command.execution.CommandHandler;
|
||||||
import ch.unibas.dmi.dbis.cs108.casono.server.network.protocol.response.dispatcher.ResponseDispatcher;
|
import ch.unibas.dmi.dbis.cs108.casono.server.network.protocol.response.dispatcher.ResponseDispatcher;
|
||||||
import java.util.Optional;
|
import java.util.Optional;
|
||||||
|
|
||||||
/** Handles {@link CheckUsernameRequest}s to check whether a username is available. */
|
/** Handles {@link CheckUsernameRequest}s to check whether a username is available. */
|
||||||
public class CheckUsernameHandler extends CommandHandler<CheckUsernameRequest> {
|
public class CheckUsernameHandler extends CommandHandler<CheckUsernameRequest> {
|
||||||
private final UserRegistry userRegistry;
|
private final UserRegistry userRegistry;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Creates a new handler for checking username availability.
|
* Creates a new handler for checking username availability.
|
||||||
*
|
*
|
||||||
@@ -20,7 +17,6 @@ public class CheckUsernameHandler extends CommandHandler<CheckUsernameRequest> {
|
|||||||
super(responseDispatcher);
|
super(responseDispatcher);
|
||||||
this.userRegistry = userRegistry;
|
this.userRegistry = userRegistry;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Executes the username availability check for the given request.
|
* Executes the username availability check for the given request.
|
||||||
*
|
*
|
||||||
@@ -40,4 +36,4 @@ public class CheckUsernameHandler extends CommandHandler<CheckUsernameRequest> {
|
|||||||
}
|
}
|
||||||
responseDispatcher.dispatch(new CheckUsernameResponse(request.getContext(), availability));
|
responseDispatcher.dispatch(new CheckUsernameResponse(request.getContext(), availability));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
+1
-3
@@ -1,9 +1,7 @@
|
|||||||
package ch.unibas.dmi.dbis.cs108.casono.server.app.commands.check_nick;
|
package ch.unibas.dmi.dbis.cs108.casono.server.app.commands.check_nick;
|
||||||
|
|
||||||
import ch.unibas.dmi.dbis.cs108.casono.server.network.command.parsing.CommandParser;
|
import ch.unibas.dmi.dbis.cs108.casono.server.network.command.parsing.CommandParser;
|
||||||
import ch.unibas.dmi.dbis.cs108.casono.server.network.protocol.request.PrimitiveRequest;
|
import ch.unibas.dmi.dbis.cs108.casono.server.network.protocol.request.PrimitiveRequest;
|
||||||
import ch.unibas.dmi.dbis.cs108.casono.server.network.protocol.request.accessor.RequestParameterAccessor;
|
import ch.unibas.dmi.dbis.cs108.casono.server.network.protocol.request.accessor.RequestParameterAccessor;
|
||||||
import ch.unibas.dmi.dbis.cs108.casono.server.app.commands.check_nick.CheckUsernameRequest;
|
|
||||||
/** Parses a primitive request into a {@link CheckUsernameRequest}. */
|
/** Parses a primitive request into a {@link CheckUsernameRequest}. */
|
||||||
public class CheckUsernameParser implements CommandParser<CheckUsernameRequest> {
|
public class CheckUsernameParser implements CommandParser<CheckUsernameRequest> {
|
||||||
/**
|
/**
|
||||||
@@ -18,4 +16,4 @@ public class CheckUsernameParser implements CommandParser<CheckUsernameRequest>
|
|||||||
new RequestParameterAccessor(primitiveRequest.parameters());
|
new RequestParameterAccessor(primitiveRequest.parameters());
|
||||||
return new CheckUsernameRequest(primitiveRequest.context(), accessor.require("USERNAME"));
|
return new CheckUsernameRequest(primitiveRequest.context(), accessor.require("USERNAME"));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
+1
-5
@@ -1,12 +1,9 @@
|
|||||||
package ch.unibas.dmi.dbis.cs108.casono.server.app.commands.check_nick;
|
package ch.unibas.dmi.dbis.cs108.casono.server.app.commands.check_nick;
|
||||||
|
|
||||||
import ch.unibas.dmi.dbis.cs108.casono.server.network.protocol.request.Request;
|
import ch.unibas.dmi.dbis.cs108.casono.server.network.protocol.request.Request;
|
||||||
import ch.unibas.dmi.dbis.cs108.casono.server.network.protocol.request.RequestContext;
|
import ch.unibas.dmi.dbis.cs108.casono.server.network.protocol.request.RequestContext;
|
||||||
|
|
||||||
/** Request implementation used to check whether a username is available or already taken */
|
/** Request implementation used to check whether a username is available or already taken */
|
||||||
public class CheckUsernameRequest extends Request {
|
public class CheckUsernameRequest extends Request {
|
||||||
private final String username;
|
private final String username;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Constructs a new CheckUsernameRequest with the given context and username to check
|
* Constructs a new CheckUsernameRequest with the given context and username to check
|
||||||
*
|
*
|
||||||
@@ -18,7 +15,6 @@ public class CheckUsernameRequest extends Request {
|
|||||||
super(context);
|
super(context);
|
||||||
this.username = username;
|
this.username = username;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Returns the provided username in the request
|
* Returns the provided username in the request
|
||||||
*
|
*
|
||||||
@@ -27,4 +23,4 @@ public class CheckUsernameRequest extends Request {
|
|||||||
public String getUsername() {
|
public String getUsername() {
|
||||||
return username;
|
return username;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
+3
-4
@@ -2,8 +2,7 @@ package ch.unibas.dmi.dbis.cs108.casono.server.app.commands.check_nick;
|
|||||||
|
|
||||||
import ch.unibas.dmi.dbis.cs108.casono.server.network.protocol.request.RequestContext;
|
import ch.unibas.dmi.dbis.cs108.casono.server.network.protocol.request.RequestContext;
|
||||||
import ch.unibas.dmi.dbis.cs108.casono.server.network.protocol.response.SuccessResponse;
|
import ch.unibas.dmi.dbis.cs108.casono.server.network.protocol.response.SuccessResponse;
|
||||||
import ch.unibas.dmi.dbis.cs108.casono.server.network.protocol.response.builder.ResponseBody;
|
import ch.unibas.dmi.dbis.cs108.casono.server.network.protocol.response.builder.ResponseBodyBuilder;
|
||||||
|
|
||||||
/** Response indicating the availability status of a username check. */
|
/** Response indicating the availability status of a username check. */
|
||||||
public class CheckUsernameResponse extends SuccessResponse {
|
public class CheckUsernameResponse extends SuccessResponse {
|
||||||
/**
|
/**
|
||||||
@@ -13,6 +12,6 @@ public class CheckUsernameResponse extends SuccessResponse {
|
|||||||
* @param availability the availability status of the requested username
|
* @param availability the availability status of the requested username
|
||||||
*/
|
*/
|
||||||
public CheckUsernameResponse(RequestContext context, UsernameAvailability availability) {
|
public CheckUsernameResponse(RequestContext context, UsernameAvailability availability) {
|
||||||
super(context, ResponseBody.builder().param("STATUS", availability).build());
|
super(context, new ResponseBodyBuilder().param("STATUS", availability).build());
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
-16
@@ -1,16 +0,0 @@
|
|||||||
package ch.unibas.dmi.dbis.cs108.casono.server.domain.message;
|
|
||||||
|
|
||||||
import ch.unibas.dmi.dbis.cs108.casono.server.domain.user.UserRegistry;
|
|
||||||
|
|
||||||
/** NOT USED * */
|
|
||||||
public class MessageManager {
|
|
||||||
private final UserRegistry userRegistry;
|
|
||||||
|
|
||||||
public MessageManager(UserRegistry userRegistry) {
|
|
||||||
this.userRegistry = userRegistry;
|
|
||||||
}
|
|
||||||
|
|
||||||
public void broadcast(Message message) {
|
|
||||||
// userRegistry.getAllUsers().forEach(user -> user.enqueueMessage(message));
|
|
||||||
}
|
|
||||||
}
|
|
||||||
Reference in New Issue
Block a user