53: Create Nenjim Process Manager and some dummy services

This commit is contained in:
2026-08-05 10:12:39 +02:00
parent 70fbb793ec
commit da72aa4458
11 changed files with 153 additions and 68 deletions
@@ -1,5 +1,9 @@
package com.fanitas.evelyn.core;
import org.jetbrains.annotations.NotNull;
public interface Evelyn {
void executeService() throws Exception;
@NotNull String getStatusReport();
}
@@ -13,6 +13,7 @@ import com.r35157.libs.solana.SolanaConstants;
import com.r35157.libs.valuetypes.basic.AssetPrice;
import com.r35157.libs.valuetypes.basic.MoneyAmount;
import com.r35157.libs.valuetypes.basic.TradingPair;
import org.jetbrains.annotations.NotNull;
import java.math.BigDecimal;
import java.util.*;
@@ -27,7 +28,7 @@ import static com.r35157.libs.solana.valuetypes.economic.SolanaSPLTokenProgram.T
public class EvelynImpl implements Evelyn {
public EvelynImpl(
/*public EvelynImpl(
State state,
DesiredPositionCalculator desiredPositionCalculator,
Raydium raydium,
@@ -37,13 +38,21 @@ public class EvelynImpl implements Evelyn {
this.desiredPositionCalculator = desiredPositionCalculator;
this.raydium = raydium;
this.solanaChain = solanaChain;
}*/
public EvelynImpl() {
}
@Override
public void executeService() throws Exception {
handleRebalancingProposal();
//handleRebalancingProposal();
}
@Override
public @NotNull String getStatusReport() {
return "Hello World!";
}
/*
private SPLTokenHolding getSPLHolding(ΩSolanaAddressΩ ownerAddress, ΩSPLMintAddressΩ splMintAddress) throws Exception {
Map<ΩSPLMintAddressΩ, SPLTokenHolding> holdings = new HashMap<>();
@@ -263,4 +272,5 @@ public class EvelynImpl implements Evelyn {
private final DesiredPositionCalculator desiredPositionCalculator;
private final Raydium raydium;
private final SolanaBlockChain solanaChain;
*/
}
@@ -1,51 +0,0 @@
package com.fanitas.evelyn.core.impl.ref;
import com.fanitas.evelyn.core.Evelyn;
import com.fanitas.evelyn.core.DesiredPositionCalculator;
import com.fanitas.evelyn.core.State;
import com.r35157.libs.raydium.*;
import com.r35157.libs.raydium.impl.ref.RaydiumImpl;
import com.r35157.libs.solana.SPLTokenHolding;
import com.r35157.libs.solana.SPLTokenSupply;
import com.r35157.libs.solana.SolanaAccountInfo;
import com.r35157.libs.solana.SolanaBlockChain;
import com.r35157.libs.solana.impl.ref.SolanaBlockChainImpl;
import com.r35157.libs.solana.valuetypes.SolanaProgramDerivedAddress;
import com.r35157.libs.solana.valuetypes.economic.SolanaSPLTokenProgram;
import com.r35157.libs.valuetypes.basic.Range;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import java.math.BigDecimal;
import java.math.MathContext;
import java.nio.charset.StandardCharsets;
import java.util.List;
import java.util.Set;
public class Main {
static void main() throws Exception {
log.info("Initializing Evelyn...");
SolanaBlockChain solanaChain = new SolanaBlockChainImpl();
Raydium raydium = new RaydiumImpl(solanaChain);
System.out.println(" Done.");
State state = new StateImpl(raydium);
DesiredPositionCalculator desiredPositionCalculator = new DesiredPositionCalculatorImpl(
state.getCurveWidth(),
state.getLiquidityPositions()
);
Evelyn evelyn = new EvelynImpl(
state,
desiredPositionCalculator,
raydium,
solanaChain
);
evelyn.executeService();
}
private static final Logger log = LoggerFactory.getLogger(Main.class);
}
@@ -1,13 +1,11 @@
package com.r35157.evelyn.emc.impl.ref;
import com.r35157.evelyn.emc.EvelynMissionControl;
import javafx.application.Platform;
import com.r35157.libs.javafx.JavaFxRuntime;
import javafx.scene.Scene;
import javafx.scene.control.TextArea;
import javafx.stage.Stage;
import java.util.Objects;
public final class EvelynMissionControlImpl/*<T>*/ implements EvelynMissionControl {
public EvelynMissionControlImpl(/*T evelyn*/) {
@@ -16,20 +14,22 @@ public final class EvelynMissionControlImpl/*<T>*/ implements EvelynMissionContr
@Override
public void start() {
Platform.startup(() -> {
TextArea text = new TextArea("""
Evelyn Mission Control
JavaFxRuntime.runLater(this::showWindow);
}
Evelyn is running.
Connected to: %s
""".formatted("Test123"/*evelyn.getClass().getName())*/));
text.setEditable(false);
private void showWindow() {
TextArea text = new TextArea("""
Evelyn Mission Control
Stage window = new Stage();
window.setTitle("Evelyn Mission Control");
window.setScene(new Scene(text, 600, 400));
window.show();
});
Evelyn is running.
Connected to: %s
""".formatted("Test123"/*evelyn.getClass().getName())*/));
text.setEditable(false);
Stage window = new Stage();
window.setTitle("Evelyn Mission Control");
window.setScene(new Scene(text, 600, 400));
window.show();
}
//private final T evelyn;
@@ -0,0 +1,25 @@
package com.r35157.libs.javafx;
import javafx.application.Platform;
public final class JavaFxRuntime {
public static void runLater(Runnable runnable) {
initialize();
Platform.runLater(runnable);
}
private static synchronized void initialize() {
if (initialized) {
return;
}
Platform.startup(() -> Platform.setImplicitExit(false));
initialized = true;
}
private JavaFxRuntime() {
}
private static boolean initialized;
}
@@ -0,0 +1,5 @@
package com.r35157.nenjim.composer;
public interface NenjimComposer {
void start();
}
@@ -0,0 +1,20 @@
package com.r35157.nenjim.composer.impl.ref;
import com.r35157.libs.javafx.JavaFxRuntime;
import com.r35157.nenjim.composer.NenjimComposer;
import javafx.stage.Stage;
public final class NenjimComposerImpl implements NenjimComposer {
@Override
public void start() {
JavaFxRuntime.runLater(this::showWindow);
}
private void showWindow() {
var window = new Stage();
window.setTitle("Nenjim Composer");
window.show();
}
}
@@ -3,8 +3,12 @@ package com.r35157.nenjim.hubd.impl.ref;
import com.r35157.evelyn.emc.EvelynMissionControl;
import com.r35157.evelyn.emc.impl.ref.EvelynMissionControlImpl;
import com.r35157.jupiterperpsalarm.impl.ref.JupiterPerpsAlarmImpl;
import com.r35157.nenjim.composer.NenjimComposer;
import com.r35157.nenjim.composer.impl.ref.NenjimComposerImpl;
import com.r35157.nenjim.hubd.NenjimHub;
import com.r35157.nenjim.hubd.journal.Journal;
import com.r35157.nenjim.npm.NenjimProcessManager;
import com.r35157.nenjim.npm.impl.ref.NenjimProcessManagerImpl;
import crypto.r35157.nenjim.NenjimProcess;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
@@ -48,6 +52,8 @@ public class NenjimHubImpl implements NenjimHub {
private void startAutoRunProcesses() throws Exception {
startJupiterPerpsAlarm(); // TODO: Hardcoded/hacky way to auto-start but good enough for now.
startEvelynMissionControl();
startNenjimComposer();
startNenjimProcessManager();
// TODO: Old but more correct way to auto start plugins - but it is currently broken.
/*
@@ -138,6 +144,36 @@ public class NenjimHubImpl implements NenjimHub {
}
private void startNenjimComposer() {
Thread thread = new Thread(() -> {
try {
NenjimComposer nc = new NenjimComposerImpl();
nc.start();
} catch (Throwable throwable) {
throwable.printStackTrace();
}
}, "Nenjim Plugin - Nenjim Composer");
thread.setDaemon(false);
thread.start();
}
private void startNenjimProcessManager() {
Thread thread = new Thread(() -> {
try {
NenjimProcessManager npm = new NenjimProcessManagerImpl();
npm.start();
} catch (Throwable throwable) {
throwable.printStackTrace();
}
}, "Nenjim Plugin - Nenjim Process Manager");
thread.setDaemon(false);
thread.start();
}
private static final Logger log = LoggerFactory.getLogger(NenjimHubImpl.class);
private final CountDownLatch shutdownLatch = new CountDownLatch(1);
@@ -0,0 +1,5 @@
package com.r35157.nenjim.npm;
public interface NenjimProcessManager {
void start();
}
@@ -0,0 +1,31 @@
package com.r35157.nenjim.npm.impl.ref;
import com.r35157.libs.javafx.JavaFxRuntime;
import com.r35157.nenjim.npm.NenjimProcessManager;
import javafx.scene.Scene;
import javafx.scene.control.ListView;
import javafx.scene.control.SelectionMode;
import javafx.stage.Stage;
public final class NenjimProcessManagerImpl implements NenjimProcessManager {
@Override
public void start() {
JavaFxRuntime.runLater(this::showWindow);
}
private void showWindow() {
var processes = new ListView<String>();
processes.getItems().addAll(
"Nenjim Composer",
"Nenjim Process Manager (this)",
"Evelyn Mission Control"
);
processes.getSelectionModel().setSelectionMode(SelectionMode.MULTIPLE);
var window = new Stage();
window.setTitle("Nenjim Process Manager");
window.setScene(new Scene(processes, 500, 400));
window.show();
}
}