Add some more async functionality

This commit is contained in:
Colin McDonald 2016-06-17 01:12:32 -04:00
parent 07e0a3328a
commit 26e84251b6
2 changed files with 76 additions and 43 deletions

View File

@ -131,16 +131,49 @@ public final class IpBan {
return removedBy != null;
}
public String getAccessDenialReason() {
String accessDenialReason = "Your ip address has been suspended from the MineHQ Network. \n\n";
// TODO: CLEANUP
public void getAccessDenialReason(SingleResultCallback<String> callback) {
Punishment.findByLinkedIpBanId(id, (punishment, error) -> {
if (error != null) {
callback.onResult(null, error);
return;
};
if (getExpiresAt() != null) {
accessDenialReason += "Expires in " + TimeUtils.formatIntoDetailedString(TimeUtils.getSecondsBetween(getExpiresAt(), Instant.now()));
} else {
accessDenialReason += "Appeal at MineHQ.com/appeal";
}
if (punishment != null) {
User.findById(punishment.getUser(), (user, error2) -> {
if (error2 != null) {
callback.onResult(null, error2);
return;
}
return accessDenialReason;
String accessDenialReason;
if (user != null) {
accessDenialReason = "Your IP address has been suspended from the MineHQ Network for a punishment related to " + user.getLastUsername() + ". \n\n";
} else {
accessDenialReason = "Your IP address has been suspended from the MineHQ Network. \n\n";
}
if (getExpiresAt() != null) {
accessDenialReason += "Expires in " + TimeUtils.formatIntoDetailedString(TimeUtils.getSecondsBetween(getExpiresAt(), Instant.now()));
} else {
accessDenialReason += "Appeal at MineHQ.com/appeal";
}
callback.onResult(accessDenialReason, null);
});
} else {
String accessDenialReason = "Your IP address has been suspended from the MineHQ Network. \n\n";
if (getExpiresAt() != null) {
accessDenialReason += "Expires in " + TimeUtils.formatIntoDetailedString(TimeUtils.getSecondsBetween(getExpiresAt(), Instant.now()));
} else {
accessDenialReason += "Appeal at MineHQ.com/appeal";
}
callback.onResult(accessDenialReason, null);
}
});
}
public void insert() {

View File

@ -13,18 +13,19 @@ import fr.javatic.mongo.jacksonCodec.Entity;
import fr.javatic.mongo.jacksonCodec.objectId.Id;
import io.vertx.core.CompositeFuture;
import io.vertx.core.Future;
import io.vertx.core.cli.converters.BooleanConverter;
import lombok.AllArgsConstructor;
import lombok.Getter;
import lombok.Setter;
import net.frozenorb.apiv3.APIv3;
import net.frozenorb.apiv3.serialization.gson.ExcludeFromReplies;
import net.frozenorb.apiv3.serialization.jackson.UUIDJsonDeserializer;
import net.frozenorb.apiv3.serialization.jackson.UUIDJsonSerializer;
import net.frozenorb.apiv3.serialization.jackson.UuidJsonDeserializer;
import net.frozenorb.apiv3.serialization.jackson.UuidJsonSerializer;
import net.frozenorb.apiv3.unsorted.BlockingCallback;
import net.frozenorb.apiv3.util.MojangUtils;
import net.frozenorb.apiv3.util.PermissionUtils;
import net.frozenorb.apiv3.util.SyncUtils;
import net.frozenorb.apiv3.util.UUIDUtils;
import net.frozenorb.apiv3.util.UuidUtils;
import org.bson.Document;
import java.time.Instant;
@ -36,7 +37,7 @@ public final class User {
private static final MongoCollection<User> usersCollection = APIv3.getDatabase().getCollection("users", User.class);
@Getter @Id @JsonSerialize(using=UUIDJsonSerializer.class) @JsonDeserialize(using=UUIDJsonDeserializer.class) private UUID id;
@Getter @Id @JsonSerialize(using=UuidJsonSerializer.class) @JsonDeserialize(using=UuidJsonDeserializer.class) private UUID id;
@Getter private String lastUsername;
@Getter @ExcludeFromReplies private Map<String, Instant> aliases = new HashMap<>();
@Getter @ExcludeFromReplies @Setter private String totpSecret;
@ -59,7 +60,7 @@ public final class User {
try {
uuid = UUID.fromString(id);
} catch (IllegalArgumentException ex) {
} catch (NullPointerException | IllegalArgumentException ex) {
return null;
}
@ -67,7 +68,7 @@ public final class User {
}
public static User findByIdSync(UUID id) {
if (UUIDUtils.isAcceptableUUID(id)) {
if (UuidUtils.isAcceptableUuid(id)) {
return SyncUtils.blockOne(usersCollection.find(new Document("_id", id)));
} else {
return null;
@ -96,7 +97,7 @@ public final class User {
}
public static void findById(UUID id, SingleResultCallback<User> callback) {
if (UUIDUtils.isAcceptableUUID(id)) {
if (UuidUtils.isAcceptableUuid(id)) {
usersCollection.find(new Document("_id", id)).first(callback);
} else {
callback.onResult(null, null);
@ -133,6 +134,8 @@ public final class User {
public User() {} // For Morphia
// TODO: THIS IS CURRENTLY BLOCKING. MAYBE FOR THE HEARTBEAT WE CAN DO SOMETHING
// TO MAKE IT NOT SO BLOCKING
public User(UUID id, String lastUsername) {
this.id = id;
this.lastUsername = ""; // Intentional, so updateUsername actually does something.
@ -145,13 +148,16 @@ public final class User {
this.lastSeenAt = Instant.now();
this.firstSeenAt = Instant.now();
// TODO: MAKE THIS ASYNC? SOMEHOW?
BlockingCallback<Void> blockingCallback = new BlockingCallback<>();
updateUsername(lastUsername, blockingCallback);
blockingCallback.get();
updateUsername(lastUsername);
}
public boolean hasPermissionAnywhere(String permission) {
Map<String, Boolean> globalPermissions = getGlobalPermissions();
return globalPermissions.containsKey(permission) && globalPermissions.get(permission);
}
// TODO: ASYNC
public Map<String, Boolean> getGlobalPermissions() {
Map<String, Boolean> globalPermissions = PermissionUtils.getDefaultPermissions(getHighestRankAnywhere());
for (Map.Entry<ServerGroup, Rank> serverGroupEntry : getHighestRanks().entrySet()) {
@ -164,7 +170,7 @@ public final class User {
);
}
return globalPermissions.containsKey(permission) && globalPermissions.get(permission);
return ImmutableMap.copyOf(globalPermissions);
}
// TODO: Clean
@ -188,31 +194,20 @@ public final class User {
this.online = false;
}
public void updateUsername(String newUsername, SingleResultCallback<Void> callback) {
this.aliases.put(newUsername, Instant.now());
public void updateUsername(String newUsername) {
if (!newUsername.equals(lastUsername)) {
this.lastUsername = newUsername;
if (newUsername.equalsIgnoreCase(lastUsername)) {
callback.onResult(null, null);
return;
User withNewUsername;
while ((withNewUsername = User.findByLastUsernameSync(newUsername)) != null) {
BlockingCallback<String> callback = new BlockingCallback<>();
MojangUtils.getName(withNewUsername.getId(), callback);
withNewUsername.updateUsername(callback.get());
}
}
this.lastUsername = newUsername;
User.findByLastUsername(newUsername, (otherUser, error) -> {
if (error != null) {
callback.onResult(null, error);
} else if (otherUser != null) {
MojangUtils.getName(otherUser.getId(), (newName, error2) -> {
if (error2 != null) {
callback.onResult(null, error2);
} else {
otherUser.updateUsername(newName, callback);
}
});
} else {
callback.onResult(null, null);
}
});
this.aliases.put(newUsername, Instant.now());
}
public void setPassword(String input) {
@ -378,9 +373,14 @@ public final class User {
"activeBanId", activeBan.getId()
);
} else if (activeIpBan != null) {
// TODO: ASYNC
BlockingCallback<String> callback = new BlockingCallback<>();
activeIpBan.getAccessDenialReason(callback);
String reason = callback.get();
access = ImmutableMap.of(
"allowed", false,
"message", activeIpBan.getAccessDenialReason(),
"message", reason,
"activeIpBanId", activeIpBan.getId()
);
}