add permissions, turn queue, and account login. Event handler is now assigned post-instantiation.
This commit is contained in:
parent
804a49c6b2
commit
de5b6cf703
8 changed files with 135 additions and 12 deletions
10
src/main/java/dev/elijahr/CollabVM4j/AccountLoginResult.java
Normal file
10
src/main/java/dev/elijahr/CollabVM4j/AccountLoginResult.java
Normal file
|
@ -0,0 +1,10 @@
|
||||||
|
package dev.elijahr.CollabVM4j;
|
||||||
|
|
||||||
|
public class AccountLoginResult {
|
||||||
|
public boolean Success;
|
||||||
|
public String Error;
|
||||||
|
public AccountLoginResult(boolean success, String error) {
|
||||||
|
Success = success;
|
||||||
|
Error = error;
|
||||||
|
}
|
||||||
|
}
|
|
@ -12,39 +12,49 @@ import java.util.AbstractMap;
|
||||||
import java.util.ArrayList;
|
import java.util.ArrayList;
|
||||||
import java.util.Arrays;
|
import java.util.Arrays;
|
||||||
import java.util.Base64;
|
import java.util.Base64;
|
||||||
|
import java.util.concurrent.CompletableFuture;
|
||||||
|
|
||||||
public class CollabVMClient {
|
public class CollabVMClient {
|
||||||
// Private fields
|
// Private fields
|
||||||
private boolean _debug;
|
private boolean _debug;
|
||||||
private URI _url;
|
private URI _url;
|
||||||
private CollabVMEventHandler _eventHandler;
|
private CollabVMEventHandler _eventHandler = new CollabVMEventHandler() {};
|
||||||
private CollabVMWebSocket _socket;
|
private CollabVMWebSocket _socket;
|
||||||
private AbstractMap.SimpleEntry<String, String>[] _customHeaders;
|
private AbstractMap.SimpleEntry<String, String>[] _customHeaders;
|
||||||
private boolean _connected;
|
private boolean _connected;
|
||||||
private boolean _connectedToNode;
|
private boolean _connectedToNode;
|
||||||
private String _username;
|
private String _username;
|
||||||
|
private int _rank;
|
||||||
|
private Permissions _permissions;
|
||||||
private String _node;
|
private String _node;
|
||||||
private ArrayList<User> _users = new ArrayList<>();
|
private ArrayList<User> _users = new ArrayList<>();
|
||||||
private BufferedImage _framebuffer;
|
private BufferedImage _framebuffer;
|
||||||
|
private TurnQueue _currentTurnQueue;
|
||||||
|
private TurnStatus _turnStatus;
|
||||||
|
// Futures
|
||||||
|
private CompletableFuture<AccountLoginResult> _loginFuture;
|
||||||
|
|
||||||
// Constructor
|
// Constructor
|
||||||
@SuppressWarnings("unchecked")
|
@SuppressWarnings("unchecked")
|
||||||
public CollabVMClient(URI url, CollabVMEventHandler eventHandler) {
|
public CollabVMClient(URI url) {
|
||||||
this(url, eventHandler, (AbstractMap.SimpleEntry<String, String>[]) new AbstractMap.SimpleEntry<?, ?>[0]);
|
this(url, (AbstractMap.SimpleEntry<String, String>[]) new AbstractMap.SimpleEntry<?, ?>[0]);
|
||||||
}
|
}
|
||||||
public CollabVMClient(URI url, CollabVMEventHandler eventHandler, AbstractMap.SimpleEntry<String, String>[] customHeaders) {
|
public CollabVMClient(URI url, AbstractMap.SimpleEntry<String, String>[] customHeaders) {
|
||||||
this(url, eventHandler, customHeaders, false);
|
this(url, customHeaders, false);
|
||||||
}
|
}
|
||||||
|
|
||||||
public CollabVMClient(URI url, CollabVMEventHandler eventHandler, AbstractMap.SimpleEntry<String, String>[] customHeaders, boolean debug) {
|
public CollabVMClient(URI url, AbstractMap.SimpleEntry<String, String>[] customHeaders, boolean debug) {
|
||||||
_debug = debug;
|
_debug = debug;
|
||||||
_connected = false;
|
_connected = false;
|
||||||
_connectedToNode = false;
|
_connectedToNode = false;
|
||||||
_username = null;
|
_username = null;
|
||||||
|
_rank = Rank.Unregistered;
|
||||||
|
_permissions = Permissions.None();
|
||||||
|
_turnStatus = TurnStatus.None;
|
||||||
|
_currentTurnQueue = new TurnQueue(null, null, new User[0]);
|
||||||
_node = null;
|
_node = null;
|
||||||
_url = url;
|
_url = url;
|
||||||
_framebuffer = new BufferedImage(1, 1, BufferedImage.TYPE_INT_ARGB);
|
_framebuffer = new BufferedImage(1, 1, BufferedImage.TYPE_INT_ARGB);
|
||||||
_eventHandler = eventHandler;
|
|
||||||
_socket = new CollabVMWebSocket(_url, this);
|
_socket = new CollabVMWebSocket(_url, this);
|
||||||
_customHeaders = customHeaders;
|
_customHeaders = customHeaders;
|
||||||
for (AbstractMap.SimpleEntry<String, String> header : _customHeaders) _socket.addHeader(header.getKey(), header.getValue());
|
for (AbstractMap.SimpleEntry<String, String> header : _customHeaders) _socket.addHeader(header.getKey(), header.getValue());
|
||||||
|
@ -116,6 +126,7 @@ public class CollabVMClient {
|
||||||
for (int i = 2; i < msgArr.length; i += 2) {
|
for (int i = 2; i < msgArr.length; i += 2) {
|
||||||
String username = msgArr[i];
|
String username = msgArr[i];
|
||||||
int rank = Integer.parseInt(msgArr[i + 1]);
|
int rank = Integer.parseInt(msgArr[i + 1]);
|
||||||
|
if (username.equals(_username)) _rank = rank;
|
||||||
_users.removeIf(u -> u.Username.equals(username));
|
_users.removeIf(u -> u.Username.equals(username));
|
||||||
User user = new User(username, rank);
|
User user = new User(username, rank);
|
||||||
_users.add(user);
|
_users.add(user);
|
||||||
|
@ -175,7 +186,55 @@ public class CollabVMClient {
|
||||||
_eventHandler.OnRectangle(x, y, rect);
|
_eventHandler.OnRectangle(x, y, rect);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
case "turn": {
|
||||||
|
ArrayList<User> queue = new ArrayList<>();
|
||||||
|
// Reset turn data
|
||||||
|
for (User user : _users) user.TurnStatus = TurnStatus.None;
|
||||||
|
this._turnStatus = TurnStatus.None;
|
||||||
|
int queuedUsers = Integer.parseInt(msgArr[2]);
|
||||||
|
if (queuedUsers == 0) {
|
||||||
|
this._currentTurnQueue = new TurnQueue(null, null, new User[0]);
|
||||||
|
_eventHandler.OnTurnUpdate(this._currentTurnQueue);
|
||||||
|
return;
|
||||||
}
|
}
|
||||||
|
User currentTurnUser = _users.stream().filter(u -> u.Username.equals(msgArr[3])).findFirst().orElse(null);
|
||||||
|
if (currentTurnUser == null) return;
|
||||||
|
if (currentTurnUser.Username.equals(_username)) {
|
||||||
|
this._turnStatus = TurnStatus.HasTurn;
|
||||||
|
}
|
||||||
|
currentTurnUser.TurnStatus = TurnStatus.HasTurn;
|
||||||
|
queue.add(currentTurnUser);
|
||||||
|
if (queuedUsers > 1) {
|
||||||
|
for (int i = 1; i < queuedUsers; i++) {
|
||||||
|
String username = msgArr[i + 3];
|
||||||
|
User user = _users.stream().filter(u -> u.Username.equals(username)).findFirst().orElse(null);
|
||||||
|
if (user == null) continue;
|
||||||
|
user.TurnStatus = TurnStatus.Waiting;
|
||||||
|
if (user.Username.equals(_username))
|
||||||
|
this._turnStatus = TurnStatus.Waiting;
|
||||||
|
queue.add(user);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
this._currentTurnQueue = new TurnQueue(
|
||||||
|
(this._turnStatus == TurnStatus.HasTurn) ? Integer.parseInt(msgArr[1]) : null,
|
||||||
|
(this._turnStatus == TurnStatus.Waiting) ? Integer.parseInt(msgArr[msgArr.length - 1]) : null,
|
||||||
|
queue.toArray(new User[0])
|
||||||
|
);
|
||||||
|
_eventHandler.OnTurnUpdate(this._currentTurnQueue);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
case "login": {
|
||||||
|
boolean success = msgArr[1].equals("1");
|
||||||
|
this._loginFuture.complete(new AccountLoginResult(success, success ? null : msgArr[2]));
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public CompletableFuture<AccountLoginResult> loginAccount(String token) {
|
||||||
|
this._loginFuture = new CompletableFuture<>();
|
||||||
|
this.sendGuac("login", token);
|
||||||
|
return this._loginFuture;
|
||||||
}
|
}
|
||||||
public void onWsClose(int code, String reason, boolean remote) {
|
public void onWsClose(int code, String reason, boolean remote) {
|
||||||
_connectedToNode = false;
|
_connectedToNode = false;
|
||||||
|
@ -211,4 +270,5 @@ public class CollabVMClient {
|
||||||
img.getGraphics().drawImage(_framebuffer, 0, 0, null);
|
img.getGraphics().drawImage(_framebuffer, 0, 0, null);
|
||||||
return img;
|
return img;
|
||||||
}
|
}
|
||||||
|
public void setEventHandler(CollabVMEventHandler handler) { this._eventHandler = handler; }
|
||||||
}
|
}
|
||||||
|
|
|
@ -17,6 +17,6 @@ public interface CollabVMEventHandler {
|
||||||
default void OnVoteUpdate() {}
|
default void OnVoteUpdate() {}
|
||||||
default void OnVoteEnded() {}
|
default void OnVoteEnded() {}
|
||||||
default void OnVoteCooldown(int cooldown) {}
|
default void OnVoteCooldown(int cooldown) {}
|
||||||
default void OnTurnUpdate() {}
|
default void OnTurnUpdate(TurnQueue queue) {}
|
||||||
default void OnConnectionClosed() {}
|
default void OnConnectionClosed() {}
|
||||||
}
|
}
|
||||||
|
|
30
src/main/java/dev/elijahr/CollabVM4j/Permissions.java
Normal file
30
src/main/java/dev/elijahr/CollabVM4j/Permissions.java
Normal file
|
@ -0,0 +1,30 @@
|
||||||
|
package dev.elijahr.CollabVM4j;
|
||||||
|
|
||||||
|
public class Permissions {
|
||||||
|
public boolean restore;
|
||||||
|
public boolean reboot;
|
||||||
|
public boolean ban;
|
||||||
|
public boolean kick;
|
||||||
|
public boolean mute;
|
||||||
|
public boolean forcevote;
|
||||||
|
public boolean bypassendturn;
|
||||||
|
public boolean rename;
|
||||||
|
public boolean getip;
|
||||||
|
public boolean xss;
|
||||||
|
|
||||||
|
public Permissions(int mask) {
|
||||||
|
restore = (mask & 1) != 0;
|
||||||
|
reboot = (mask & 2) != 0;
|
||||||
|
ban = (mask & 4) != 0;
|
||||||
|
kick = (mask & 8) != 0;
|
||||||
|
mute = (mask & 16) != 0;
|
||||||
|
forcevote = (mask & 32) != 0;
|
||||||
|
bypassendturn = (mask & 64) != 0;
|
||||||
|
rename = (mask & 128) != 0;
|
||||||
|
getip = (mask & 256) != 0;
|
||||||
|
xss = (mask & 512) != 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
public static Permissions All() { return new Permissions(65535); }
|
||||||
|
public static Permissions None() { return new Permissions(0); }
|
||||||
|
}
|
|
@ -2,8 +2,8 @@ package dev.elijahr.CollabVM4j;
|
||||||
|
|
||||||
// java enums suck so we have to use a class instead
|
// java enums suck so we have to use a class instead
|
||||||
public class Rank {
|
public class Rank {
|
||||||
public final int Unregistered = 0;
|
public static final int Unregistered = 0;
|
||||||
public final int Registered = 1;
|
public static final int Registered = 1;
|
||||||
public final int Admin = 2;
|
public static final int Admin = 2;
|
||||||
public final int Moderator = 3;
|
public static final int Moderator = 3;
|
||||||
}
|
}
|
||||||
|
|
14
src/main/java/dev/elijahr/CollabVM4j/TurnQueue.java
Normal file
14
src/main/java/dev/elijahr/CollabVM4j/TurnQueue.java
Normal file
|
@ -0,0 +1,14 @@
|
||||||
|
package dev.elijahr.CollabVM4j;
|
||||||
|
|
||||||
|
import java.util.Optional;
|
||||||
|
|
||||||
|
public class TurnQueue {
|
||||||
|
public Integer TurnTimer;
|
||||||
|
public Integer QueueTimer;
|
||||||
|
public User[] Queue;
|
||||||
|
public TurnQueue(Integer turnTimer, Integer queueTimer, User[] queue) {
|
||||||
|
TurnTimer = turnTimer;
|
||||||
|
QueueTimer = queueTimer;
|
||||||
|
Queue = queue;
|
||||||
|
}
|
||||||
|
}
|
7
src/main/java/dev/elijahr/CollabVM4j/TurnStatus.java
Normal file
7
src/main/java/dev/elijahr/CollabVM4j/TurnStatus.java
Normal file
|
@ -0,0 +1,7 @@
|
||||||
|
package dev.elijahr.CollabVM4j;
|
||||||
|
|
||||||
|
public enum TurnStatus {
|
||||||
|
None,
|
||||||
|
Waiting,
|
||||||
|
HasTurn
|
||||||
|
}
|
|
@ -3,8 +3,10 @@ package dev.elijahr.CollabVM4j;
|
||||||
public class User {
|
public class User {
|
||||||
public String Username;
|
public String Username;
|
||||||
public int Rank;
|
public int Rank;
|
||||||
|
public TurnStatus TurnStatus;
|
||||||
public User(String username, int rank) {
|
public User(String username, int rank) {
|
||||||
Username = username;
|
Username = username;
|
||||||
Rank = rank;
|
Rank = rank;
|
||||||
|
TurnStatus = dev.elijahr.CollabVM4j.TurnStatus.None;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in a new issue