mirror of
https://github.com/2OOP/pism.git
synced 2026-02-04 02:44:50 +00:00
Moved subscriptions to store
This commit is contained in:
@@ -6,6 +6,7 @@ import org.toop.framework.networking.server.challenges.gamechallenge.GameChallen
|
||||
import org.toop.framework.networking.server.challenges.gamechallenge.GameChallengeTimer;
|
||||
import org.toop.framework.networking.server.client.NettyClient;
|
||||
import org.toop.framework.networking.server.stores.ClientStore;
|
||||
import org.toop.framework.networking.server.stores.SubscriptionStore;
|
||||
import org.toop.framework.networking.server.stores.TurnBasedGameStore;
|
||||
import org.toop.framework.networking.server.stores.TurnBasedGameTypeStore;
|
||||
import org.toop.framework.utils.ImmutablePair;
|
||||
@@ -21,7 +22,7 @@ public class Server implements GameServer<TurnBasedGame, NettyClient, Long> {
|
||||
final private List<GameChallenge> gameChallenges = new CopyOnWriteArrayList<>();
|
||||
final private TurnBasedGameStore gameStore;
|
||||
|
||||
final private ConcurrentHashMap<String, List<String>> subscriptions; // TODO move to own store / manager
|
||||
final private SubscriptionStore subscriptionStore;
|
||||
|
||||
final private Duration challengeDuration;
|
||||
final private ScheduledExecutorService scheduler = Executors.newSingleThreadScheduledExecutor();
|
||||
@@ -30,14 +31,15 @@ public class Server implements GameServer<TurnBasedGame, NettyClient, Long> {
|
||||
Duration challengeDuration,
|
||||
TurnBasedGameTypeStore turnBasedGameTypeStore,
|
||||
ClientStore<Long, NettyClient> clientStore,
|
||||
TurnBasedGameStore gameStore
|
||||
TurnBasedGameStore gameStore,
|
||||
SubscriptionStore subStore
|
||||
|
||||
) {
|
||||
this.gameTypesStore = turnBasedGameTypeStore;
|
||||
this.challengeDuration = challengeDuration;
|
||||
this.clientStore = clientStore;
|
||||
this.gameStore = gameStore;
|
||||
this.subscriptions = new ConcurrentHashMap<>();
|
||||
this.subscriptionStore = subStore;
|
||||
|
||||
scheduler.schedule(this::serverTask, 0, TimeUnit.MILLISECONDS);
|
||||
}
|
||||
@@ -114,16 +116,12 @@ public class Server implements GameServer<TurnBasedGame, NettyClient, Long> {
|
||||
return;
|
||||
}
|
||||
|
||||
subscriptions.forEach((_, clientNames) -> clientNames.remove(clientName));
|
||||
subscriptions.computeIfAbsent(
|
||||
gameTypeKey,
|
||||
_ -> new ArrayList<>())
|
||||
.add(clientName);
|
||||
subscriptionStore.add(new ImmutablePair<>(gameTypeKey, clientName));
|
||||
}
|
||||
|
||||
@Override
|
||||
public void unsubscribeClient(String clientName) {
|
||||
subscriptions.forEach((_, clientNames) -> clientNames.remove(clientName));
|
||||
subscriptionStore.remove(clientName);
|
||||
}
|
||||
|
||||
@Override
|
||||
@@ -191,13 +189,12 @@ public class Server implements GameServer<TurnBasedGame, NettyClient, Long> {
|
||||
}
|
||||
|
||||
private void checkSubscriptions() {
|
||||
if (subscriptions.isEmpty()) return;
|
||||
if (subscriptionStore.allKeys().isEmpty()) return;
|
||||
|
||||
List<String> keys = List.copyOf(subscriptions.keySet());
|
||||
Random ran = new Random();
|
||||
|
||||
for (String key : keys) {
|
||||
List<String> userNames = subscriptions.get(key);
|
||||
for (String key : subscriptionStore.allKeys()) {
|
||||
List<String> userNames = (List<String>) subscriptionStore.allValues(key);
|
||||
if (userNames.size() < 2) continue;
|
||||
|
||||
while (userNames.size() > 1) {
|
||||
|
||||
@@ -17,6 +17,7 @@ import org.toop.framework.networking.server.client.NettyClient;
|
||||
import org.toop.framework.networking.server.connectionHandler.NettyClientSession;
|
||||
import org.toop.framework.networking.server.Server;
|
||||
import org.toop.framework.networking.server.handlers.MessageHandler;
|
||||
import org.toop.framework.networking.server.stores.MapSubscriptionStore;
|
||||
import org.toop.framework.networking.server.stores.NettyClientStore;
|
||||
import org.toop.framework.networking.server.stores.TurnBasedGameStore;
|
||||
import org.toop.framework.networking.server.stores.TurnBasedGameTypeStore;
|
||||
@@ -43,7 +44,8 @@ public class NettyGatewayServer implements GatewayServer {
|
||||
challengeDuration,
|
||||
turnBasedGameTypeStore,
|
||||
new NettyClientStore(new ConcurrentHashMap<>()),
|
||||
new TurnBasedGameStore(new CopyOnWriteArrayList<>())
|
||||
new TurnBasedGameStore(new CopyOnWriteArrayList<>()),
|
||||
new MapSubscriptionStore(new ConcurrentHashMap<>())
|
||||
);
|
||||
}
|
||||
|
||||
|
||||
@@ -0,0 +1,71 @@
|
||||
package org.toop.framework.networking.server.stores;
|
||||
|
||||
import org.toop.framework.utils.ImmutablePair;
|
||||
|
||||
import java.util.*;
|
||||
|
||||
public class MapSubscriptionStore implements SubscriptionStore {
|
||||
|
||||
final private Map<String, List<String>> subscriptions;
|
||||
|
||||
public MapSubscriptionStore(Map<String, List<String>> initMap) {
|
||||
this.subscriptions = initMap;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void add(ImmutablePair<String, String> adding) {
|
||||
subscriptions.forEach((_, clientNames) -> clientNames.remove(adding.getRight()));
|
||||
subscriptions.computeIfAbsent(
|
||||
adding.getLeft(),
|
||||
_ -> new ArrayList<>())
|
||||
.add(adding.getRight());
|
||||
}
|
||||
|
||||
@Override
|
||||
public void remove(String remover) {
|
||||
subscriptions.forEach((_, clientNames) -> clientNames.remove(remover));
|
||||
}
|
||||
|
||||
// TODO move server internal code to here
|
||||
@Override
|
||||
public ImmutablePair<String, String> get(String getter) {
|
||||
String foundKey = null;
|
||||
String foundName = null;
|
||||
|
||||
for (var key : subscriptions.keySet()) {
|
||||
var a = subscriptions.get(key).stream().filter(e -> e.equals(getter)).toList();
|
||||
if (!a.isEmpty()) {
|
||||
foundKey = key;
|
||||
foundName = a.getFirst();
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
return new ImmutablePair<>(foundKey, foundName);
|
||||
|
||||
}
|
||||
|
||||
@Override
|
||||
public Collection<ImmutablePair<String, String>> all() {
|
||||
List<ImmutablePair<String, String>> a = new ArrayList<>();
|
||||
|
||||
for (var key : subscriptions.keySet()) {
|
||||
for (var sub : subscriptions.get(key)) {
|
||||
a.addLast(new ImmutablePair<>(key, sub));
|
||||
}
|
||||
}
|
||||
|
||||
return a;
|
||||
|
||||
}
|
||||
|
||||
@Override
|
||||
public Collection<String> allKeys() {
|
||||
return subscriptions.keySet();
|
||||
}
|
||||
|
||||
@Override
|
||||
public Collection<String> allValues(String key) {
|
||||
return subscriptions.get(key);
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,10 @@
|
||||
package org.toop.framework.networking.server.stores;
|
||||
|
||||
import org.toop.framework.utils.ImmutablePair;
|
||||
|
||||
import java.util.Collection;
|
||||
|
||||
public interface SubscriptionStore extends Store<String, ImmutablePair<String, String>> {
|
||||
Collection<String> allKeys();
|
||||
Collection<String> allValues(String key);
|
||||
}
|
||||
Reference in New Issue
Block a user