2023-12-11 01:08:29 +02:00

70 lines
2.0 KiB
Java

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<Long, User> users = Collections.synchronizedMap(new HashMap<>());
private final Map<byte[], User> usersBySecret = Collections.synchronizedMap(new HashMap<>());
private final Set<String> 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());
}
}