mirror of
https://github.com/2OOP/pism.git
synced 2026-02-04 10:54:51 +00:00
Fixed bugs, easy to use host button
This commit is contained in:
@@ -102,7 +102,7 @@ public class NetworkEvents extends EventsBase {
|
||||
implements GenericEvent {}
|
||||
|
||||
/** Requests to accept an existing challenge. */
|
||||
public record SendAcceptChallenge(long clientId, int challengeId)
|
||||
public record SendAcceptChallenge(long clientId, long challengeId)
|
||||
implements GenericEvent {}
|
||||
|
||||
/** Requests to forfeit the current game. */
|
||||
|
||||
@@ -5,14 +5,14 @@ import org.toop.framework.SnowflakeGenerator;
|
||||
public class GameChallenge {
|
||||
private final long id = SnowflakeGenerator.nextId(); // I don't need this, but the tournament server uses it...
|
||||
|
||||
private final ServerUser from;
|
||||
private final ServerUser to;
|
||||
private final User from;
|
||||
private final User to;
|
||||
private final String gameType;
|
||||
private final SimpleTimer timer;
|
||||
|
||||
private boolean isChallengeAccepted = false;
|
||||
|
||||
public GameChallenge(ServerUser from, ServerUser to, String gameType, SimpleTimer timer) {
|
||||
public GameChallenge(User from, User to, String gameType, SimpleTimer timer) {
|
||||
this.from = from;
|
||||
this.to = to;
|
||||
this.gameType = gameType;
|
||||
@@ -23,8 +23,8 @@ public class GameChallenge {
|
||||
return id;
|
||||
}
|
||||
|
||||
public ServerUser[] getUsers() {
|
||||
return new ServerUser[]{from, to};
|
||||
public User[] getUsers() {
|
||||
return new User[]{from, to};
|
||||
}
|
||||
|
||||
public void forceExpire() {
|
||||
@@ -37,6 +37,10 @@ public class GameChallenge {
|
||||
return gameType;
|
||||
}
|
||||
|
||||
public boolean isChallengeAccepted() {
|
||||
return isChallengeAccepted;
|
||||
}
|
||||
|
||||
public boolean isExpired() {
|
||||
return timer.isExpired();
|
||||
}
|
||||
|
||||
@@ -13,7 +13,7 @@ import java.time.Duration;
|
||||
public class Server implements GameServer {
|
||||
|
||||
final private Map<String, Class<? extends TurnBasedGame>> gameTypes;
|
||||
final private Map<Long, ServerUser> users = new ConcurrentHashMap<>();
|
||||
final private Map<Long, User> users = new ConcurrentHashMap<>();
|
||||
final private List<GameChallenge> gameChallenges = new CopyOnWriteArrayList<>();
|
||||
final private List<OnlineGame<TurnBasedGame>> games = new CopyOnWriteArrayList<>();
|
||||
|
||||
@@ -32,53 +32,53 @@ public class Server implements GameServer {
|
||||
scheduler.schedule(this::serverTask, 500, TimeUnit.MILLISECONDS);
|
||||
}
|
||||
|
||||
public void addUser(ServerUser user) {
|
||||
public void addUser(User user) {
|
||||
users.putIfAbsent(user.id(), user);
|
||||
}
|
||||
|
||||
public void removeUser(ServerUser user) {
|
||||
public void removeUser(User user) {
|
||||
users.remove(user.id());
|
||||
}
|
||||
|
||||
public String[] gameTypes() {
|
||||
return gameTypes.keySet().toArray(new String[0]);
|
||||
public List<String> gameTypes() {
|
||||
return gameTypes.keySet().stream().toList();
|
||||
}
|
||||
|
||||
public List<OnlineGame<TurnBasedGame>> ongoingGames() {
|
||||
return games;
|
||||
}
|
||||
|
||||
public ServerUser getUser(String username) {
|
||||
public User getUser(String username) {
|
||||
return users.values().stream().filter(e -> e.name().equalsIgnoreCase(username)).findFirst().orElse(null);
|
||||
}
|
||||
|
||||
public ServerUser getUser(long id) {
|
||||
public User getUser(long id) {
|
||||
return users.get(id);
|
||||
}
|
||||
|
||||
public void challengeUser(String fromUser, String toUser, String gameType) {
|
||||
|
||||
ServerUser from = getUser(fromUser);
|
||||
User from = getUser(fromUser);
|
||||
if (from == null) {
|
||||
return;
|
||||
}
|
||||
|
||||
if (!gameTypes.containsKey(gameType)) {
|
||||
from.sendMessage("ERR gametype not found");
|
||||
from.sendMessage("ERR gametype not found \n");
|
||||
return;
|
||||
}
|
||||
|
||||
ServerUser to = getUser(toUser);
|
||||
User to = getUser(toUser);
|
||||
if (to == null) {
|
||||
from.sendMessage("ERR user not found");
|
||||
from.sendMessage("ERR user not found \n");
|
||||
return;
|
||||
}
|
||||
|
||||
var ch = new GameChallenge(from, to, gameType, new GameChallengeTimer(challengeDuration));
|
||||
|
||||
to.sendMessage(
|
||||
"\"SVR GAME CHALLENGE {CHALLENGER: \"%s\", GAMETYPE: \"%s\", CHALLENGENUMBER: \"%s\"}"
|
||||
.formatted(from.name(), gameType, ch.id())
|
||||
"SVR GAME CHALLENGE {CHALLENGER: \"%s\", CHALLENGENUMBER: \"%s\", GAMETYPE: \"%s\"} \n"
|
||||
.formatted(from.name(), ch.id(), gameType)
|
||||
);
|
||||
|
||||
if (!isValidChallenge(ch)) {
|
||||
@@ -90,8 +90,8 @@ public class Server implements GameServer {
|
||||
gameChallenges.addLast(ch);
|
||||
}
|
||||
|
||||
private void warnUserExpiredChallenge(ServerUser user, long challengeId) {
|
||||
user.sendMessage("SVR GAME CHALLENGE CANCELLED {CHALLENGENUMBER: \"" + challengeId + "\"}");
|
||||
private void warnUserExpiredChallenge(User user, long challengeId) {
|
||||
user.sendMessage("SVR GAME CHALLENGE CANCELLED {CHALLENGENUMBER: \"" + challengeId + "\"}" + "\n");
|
||||
}
|
||||
|
||||
private boolean isValidChallenge(GameChallenge gameChallenge) {
|
||||
@@ -119,7 +119,9 @@ public class Server implements GameServer {
|
||||
if (isValidChallenge(challenge)) continue;
|
||||
|
||||
if (challenge.isExpired()) {
|
||||
Arrays.stream(challenge.getUsers()).forEach(user -> warnUserExpiredChallenge(user, challenge.id()));
|
||||
if (!challenge.isChallengeAccepted()) Arrays.stream(challenge.getUsers())
|
||||
.forEach(user -> warnUserExpiredChallenge(user, challenge.id()));
|
||||
|
||||
gameChallenges.remove(i);
|
||||
}
|
||||
}
|
||||
@@ -128,7 +130,7 @@ public class Server implements GameServer {
|
||||
public void acceptChallenge(long challengeId) {
|
||||
for (var challenge : gameChallenges) {
|
||||
if (challenge.id() == challengeId) {
|
||||
startGame(challenge.acceptChallenge(), (User[]) challenge.getUsers());
|
||||
startGame(challenge.acceptChallenge(), challenge.getUsers());
|
||||
break;
|
||||
}
|
||||
}
|
||||
@@ -162,8 +164,8 @@ public class Server implements GameServer {
|
||||
// }
|
||||
// }
|
||||
|
||||
public String[] onlineUsers() {
|
||||
return users.values().stream().map(ServerUser::name).toArray(String[]::new);
|
||||
public List<User> onlineUsers() {
|
||||
return users.values().stream().toList();
|
||||
}
|
||||
|
||||
public void closeServer() {
|
||||
|
||||
@@ -2,8 +2,10 @@ package org.toop.framework.networking.server;
|
||||
|
||||
import io.netty.channel.ChannelHandlerContext;
|
||||
import io.netty.channel.SimpleChannelInboundHandler;
|
||||
import org.apache.maven.surefire.shared.utils.StringUtils;
|
||||
|
||||
import java.util.Arrays;
|
||||
import java.util.Iterator;
|
||||
import java.util.LinkedList;
|
||||
import java.util.List;
|
||||
|
||||
@@ -17,6 +19,10 @@ public class ServerHandler extends SimpleChannelInboundHandler<String> {
|
||||
this.server = server;
|
||||
}
|
||||
|
||||
private String returnQuotedString(Iterator<String> strings) { // TODO more places this could be useful
|
||||
return "\"" + StringUtils.join(strings, "\",\"") + "\"";
|
||||
}
|
||||
|
||||
@Override
|
||||
public void channelActive(ChannelHandlerContext ctx) {
|
||||
ctx.writeAndFlush("WELCOME " + user.id() + "\n");
|
||||
@@ -27,6 +33,9 @@ public class ServerHandler extends SimpleChannelInboundHandler<String> {
|
||||
|
||||
@Override
|
||||
protected void channelRead0(ChannelHandlerContext ctx, String msg) {
|
||||
|
||||
IO.println(msg);
|
||||
|
||||
ParsedMessage p = parse(msg);
|
||||
if (p == null) return;
|
||||
|
||||
@@ -61,8 +70,14 @@ public class ServerHandler extends SimpleChannelInboundHandler<String> {
|
||||
if (!allowedArgs(p.args())) return;
|
||||
|
||||
switch (p.args()[0]) {
|
||||
case "playerlist" -> user.ctx().writeAndFlush(Arrays.toString(server.onlineUsers()));
|
||||
case "gamelist" -> user.ctx().writeAndFlush(Arrays.toString(server.gameTypes()));
|
||||
case "playerlist" -> {
|
||||
var names = server.onlineUsers().stream().map(ServerUser::name).iterator();
|
||||
user.ctx().writeAndFlush("SVR PLAYERLIST " + returnQuotedString(names) + "\n");
|
||||
}
|
||||
case "gamelist" -> {
|
||||
var names = server.gameTypes().stream().iterator();
|
||||
user.ctx().writeAndFlush("SVR GAMELIST " + returnQuotedString(names) + "\n");
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -87,14 +102,14 @@ public class ServerHandler extends SimpleChannelInboundHandler<String> {
|
||||
long id = Long.parseLong(p.args()[1]);
|
||||
|
||||
if (id <= 0) {
|
||||
user.sendMessage("ERR id must be a positive number");
|
||||
user.sendMessage("ERR id must be a positive number \n");
|
||||
return;
|
||||
}
|
||||
|
||||
server.acceptChallenge(id);
|
||||
|
||||
} catch (NumberFormatException e) {
|
||||
user.sendMessage("ERR id is not a valid number or too big");
|
||||
user.sendMessage("ERR id is not a valid number or too big \n");
|
||||
return;
|
||||
}
|
||||
return;
|
||||
|
||||
Reference in New Issue
Block a user