70 lines
2.0 KiB
Java
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());
|
|
}
|
|
}
|