package dev.wiing.gossip.server; import dev.wiing.gossip.lib.models.SecretUser; import dev.wiing.gossip.lib.models.User; import java.security.SecureRandom; import java.util.*; public class Database { private final Map users = Collections.synchronizedMap(new HashMap<>()); private final Map usersBySecret = Collections.synchronizedMap(new HashMap<>()); private final Set usedUsernames = Collections.synchronizedSet(new HashSet<>()); private Database() { } private static final Database instance = new Database(); public static Database getInstance() { return instance; } public SecretUser registerUser(String username, char iconID) { SecureRandom random = new SecureRandom(); byte[] secret = new byte[32]; random.nextBytes(secret); long userID = random.nextLong(); User user = new User(username, iconID, userID); users.put(userID, user); usersBySecret.put(secret, user); usedUsernames.add(username); System.out.println("Created user: " + username + " #" + Long.toUnsignedString(userID)); return new SecretUser(username, iconID, userID, secret); } public User getUserByID(long uID) { return users.getOrDefault(uID, null); } public User getUserByUsername(String username) { return users.values().stream() .filter(user -> user.getUsername().equals(username)) .findFirst() .orElse(null); } public User getUserBySecret(byte[] secret) { return usersBySecret.getOrDefault(secret, null); } public void removeUser(User user) { users.remove(user.getUserID()); usersBySecret.entrySet().stream() .filter(userEntry -> userEntry.getValue().getUserID() == user.getUserID()) .map(Map.Entry::getKey) .findFirst() .ifPresent(usersBySecret::remove); usedUsernames.remove(user.getUsername()); } }