Skip to content

Commit 3659989

Browse files
committed
Integrated ReStudio Into Remotely (Basic).
1 parent 4756b0b commit 3659989

5 files changed

Lines changed: 73 additions & 11 deletions

File tree

libs/ReScreen-1.0.jar

35 Bytes
Binary file not shown.

libs/Rebase-1.0-SNAPSHOT.jar

17.5 KB
Binary file not shown.

src/main/java/redxax/oxy/remotely/RemotelyEntry.java

Lines changed: 10 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,8 @@
33
import redxax.oxy.remotely.config.RemotelyConfigManager;
44
import redxax.oxy.remotely.host.ReScreenApplicationHost;
55
import redxax.oxy.remotely.ui.server.ServerManagerScreen;
6+
import restudio.rebase.restudio.ReStudio;
7+
import restudio.rebase.ui.screens.auth.ReStudioLoginScreen;
68
import restudio.rescreen.ReStudioEntry;
79
import restudio.rescreen.config.Config;
810
import restudio.rescreen.ui.core.ScreenManager;
@@ -18,8 +20,10 @@ public void init() {
1820

1921
RemotelyClient.INSTANCE.getHost().ensureTextRenderer();
2022

21-
2223
Config.applicationDir = remotelyDir;
24+
25+
ReStudio.getInstance().init(remotelyDir);
26+
2327
setupScreens();
2428
}
2529

@@ -30,6 +34,10 @@ public String getIconResourcePath() {
3034

3135
@Override
3236
protected void setupScreens() {
33-
ScreenManager.getInstance().setScreen(new ServerManagerScreen(null, RemotelyClient.INSTANCE));
37+
if (ReStudio.getInstance().isAuthenticated()) {
38+
ScreenManager.getInstance().setScreen(new ServerManagerScreen(null, RemotelyClient.INSTANCE));
39+
} else {
40+
ScreenManager.getInstance().setScreen(new ReStudioLoginScreen(ScreenManager.currentScreen, () -> ScreenManager.getInstance().setScreen(new ServerManagerScreen(null, RemotelyClient.INSTANCE))));
41+
}
3442
}
3543
}

src/main/java/redxax/oxy/remotely/RemotelyManager.java

Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,7 @@
1414
import restudio.rebase.resource.ResourceMetadataManager;
1515
import restudio.rebase.resource.UpdateManager;
1616
import restudio.rebase.resource.provider.*;
17+
import restudio.rebase.restudio.ReStudio;
1718
import restudio.rebase.util.PlaytimeManager;
1819
import restudio.rebase.instance.loaders.FabricHandler;
1920
import restudio.rebase.instance.loaders.ForgeHandler;
@@ -24,7 +25,6 @@
2425
import restudio.rebase.minecraft.GameVersion;
2526
import restudio.rebase.backend.BackendFactory;
2627
import restudio.rebase.backend.BackendConfig;
27-
import restudio.rebase.backend.ServerBackend;
2828
import restudio.rebase.backend.impl.LocalBackend;
2929
import restudio.rebase.backend.impl.SshBackend;
3030
import com.google.gson.JsonArray;
@@ -61,7 +61,7 @@ public class RemotelyManager implements IRebaseManager {
6161
private final InstanceResourceManager instanceResourceManager;
6262
private final UpdateManager updateManager;
6363
private final List<IResourceProvider> resourceProviders;
64-
private Path versionsDir;
64+
private final Path versionsDir;
6565
private final Map<ModLoader, ModLoaderHandler> modLoaderHandlers = new HashMap<>();
6666
private final Map<String, GameVersion> allGameVersions = new ConcurrentHashMap<>();
6767
private static final String VERSION_MANIFEST_URL = "https://piston-meta.mojang.com/mc/game/version_manifest_v2.json";
@@ -264,6 +264,11 @@ public RebaseConfigManager getConfigManager() {
264264
return configManager;
265265
}
266266

267+
@Override
268+
public ReStudio getReStudio() {
269+
return ReStudio.getInstance();
270+
}
271+
267272
@Override
268273
public Path getLauncherJarPath() {
269274
throw new UnsupportedOperationException("getLauncherJarPath is not applicable for Remotely as a mod.");

src/main/java/redxax/oxy/remotely/ui/server/ServerManagerScreen.java

Lines changed: 56 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -2,11 +2,13 @@
22

33
import org.lwjgl.glfw.GLFW;
44
import redxax.oxy.remotely.RemotelyClient;
5+
import redxax.oxy.remotely.config.Config;
56
import redxax.oxy.remotely.config.RemotelyConfigManager;
67
import redxax.oxy.remotely.config.SettingsScreenFactory;
78
import redxax.oxy.remotely.ui.widgets.DesktopIconWidget;
8-
import restudio.rebase.api.unified.InstanceApi;
9-
import restudio.rebase.instance.InstanceState;
9+
import restudio.rebase.restudio.AuthStateListener;
10+
import restudio.rebase.restudio.ReStudio;
11+
import restudio.rebase.ui.screens.auth.ReStudioLoginScreen;
1012
import restudio.rebase.ui.worldmap.WorldMapScreen;
1113
import restudio.rebase.Rebase;
1214
import restudio.rebase.hosting.RemoteHost;
@@ -28,7 +30,6 @@
2830
import restudio.rescreen.ui.widgets.*;
2931
import restudio.rescreen.util.Notification;
3032
import restudio.rescreen.util.Sound;
31-
import restudio.rescreen.util.ImageUtils;
3233

3334
import javax.imageio.ImageIO;
3435
import java.awt.image.BufferedImage;
@@ -40,10 +41,9 @@
4041
import static redxax.oxy.remotely.config.Config.remotelyDir;
4142
import static redxax.oxy.remotely.util.DevUtil.devPrint;
4243
import static redxax.oxy.remotely.util.ImageUtil.loadResourceIcon;
43-
import static restudio.rescreen.render.Render.drawOuterBorder;
4444
import static restudio.rescreen.util.SoundUtils.playSound;
4545

46-
public class ServerManagerScreen extends ReScreen {
46+
public class ServerManagerScreen extends ReScreen implements AuthStateListener {
4747
private final RemotelyClient remotelyClient;
4848
private Instance instanceForDeletion;
4949
private PopupWidget addServerPopup;
@@ -57,6 +57,7 @@ public class ServerManagerScreen extends ReScreen {
5757
private AnimatedButton remoteHostConfirmButton;
5858
private AnimatedButton remoteHostDeleteButton;
5959
private final Object parent;
60+
private IconButton userButton;
6061
int bx1 = 0, by1 = 0, bx2 = 0, by2 = 0;
6162

6263
private static BufferedImage unknown, serverIcon, paper, vanilla, fabric, forge, neoforge, waterfall, velocity, leaf, quilt, spigot, bukkit, purpur;
@@ -75,16 +76,36 @@ public void init() {
7576
reloadInstancesSmartly();
7677
loadIcons();
7778
createPopups();
79+
ReStudio.getInstance().addListener(this);
7880

7981
int taskbarHeight = 28;
82+
String displayName = ReStudio.getInstance().getDisplayName();
83+
if (displayName == null || displayName.isBlank()) displayName = ReStudio.getInstance().getEmail();
84+
if (displayName == null) displayName = "Account";
85+
86+
userButton = new IconButton.Builder()
87+
.imagePath("steve.png")
88+
.label(displayName)
89+
.onClick(this::showUserMenu)
90+
.size(18, 18)
91+
.autoWidthOnTextChange(true)
92+
.build();
93+
94+
ReStudio.getInstance().loadAvatar().thenAccept(img -> ScreenManager.getInstance().execute(() -> {
95+
if (img != null && userButton != null) {
96+
userButton.setIcon(img);
97+
}
98+
}));
99+
80100
header().position(HeaderBuilder.Position.BOTTOM).size(taskbarHeight)
81101
.addLeft("terminal.png", () -> remotelyClient.openMultiTerminal(this), "Terminal")
82102
.addLeft("explorer.png", this::openFileExplorer, "File Explorer")
83103
.addLeft("remotely.png", () -> client.setScreen(SettingsScreenFactory.createGlobalSettingsScreen( this,(RemotelyConfigManager) Rebase.get().getConfigManager())), "Settings")
104+
.addLeft(userButton)
84105
.build();
85106

86107
tabs().builder()
87-
.position(width / 2, height - taskbarHeight + 4)
108+
.position(width / 2, height - taskbarHeight + 5)
88109
.size(width / 2 - 5, 18)
89110
.rightToLeft(true)
90111
.allowAdd(true)
@@ -102,8 +123,35 @@ public void init() {
102123

103124
setActiveContainer(desktopContainer);
104125
populateHostTabs();
126+
updatePositions();
127+
}
128+
129+
private void showUserMenu() {
130+
ContextMenuWidget.Builder builder = new ContextMenuWidget.Builder(this).addHeaderButton("close.png", () -> ReStudio.getInstance().logout(), "Log Out", ThemeManager.getAccent("danger"));
131+
showContextMenu(userButton.getX(), height - 35, builder);
132+
}
133+
134+
@Override
135+
public void onLogin(String email) {
136+
new Notification.Builder().message("Welcome back!").description("Email: " + (Config.showIp ? "" : "§k") + email).type(Notification.Type.SUCCESS).build();
105137
}
106138

139+
@Override
140+
public void onLogout() {
141+
ScreenManager.getInstance().execute(() -> ScreenManager.getInstance().setScreen(new ReStudioLoginScreen(null, () -> ScreenManager.getInstance().setScreen(new ServerManagerScreen(null, RemotelyClient.INSTANCE)))));
142+
new Notification.Builder().message("Bye Bye").type(Notification.Type.INFO).build();
143+
144+
}
145+
146+
@Override
147+
public void onSessionExpired() {
148+
ScreenManager.getInstance().execute(() -> {
149+
new Notification("Session Expired", "Your session has expired. Please log in again.", Notification.Type.WARN);
150+
onLogout();
151+
});
152+
}
153+
154+
107155
private void reloadInstancesSmartly() {
108156
Map<String, SSHManager> activeSessions = new HashMap<>();
109157
if (instanceManager != null) {
@@ -635,6 +683,7 @@ private void openModpackInstallation() {
635683

636684
@Override
637685
public void removed() {
686+
ReStudio.getInstance().removeListener(this);
638687
remotelyClient.saveTabIndex(tabs().getActiveTabIndex());
639688
super.removed();
640689
}
@@ -679,7 +728,7 @@ public void onDisplayed() {
679728
@Override
680729
public void updatePositions() {
681730
super.updatePositions();
682-
tabs().setPosition(width - tabs().getWidth(), height - 28 + 4);
731+
tabs().setPosition(width - tabs().getWidth(), height - 28 + 5);
683732
}
684733

685734
@Override

0 commit comments

Comments
 (0)