diff --git a/.idea/gradle.xml b/.idea/gradle.xml index 2a65317..48c153e 100644 --- a/.idea/gradle.xml +++ b/.idea/gradle.xml @@ -9,6 +9,10 @@ diff --git a/API/build.gradle b/API/build.gradle new file mode 100644 index 0000000..01fb848 --- /dev/null +++ b/API/build.gradle @@ -0,0 +1,20 @@ +plugins { + id 'java' +} + +group = 'me.zacharias' +version = '1.0-SNAPSHOT' + +dependencies { + implementation project(":Core") +} + +test { + useJUnitPlatform() +} + +jar{ + manifest { + attributes 'Main-Class': 'me.zacharias.char.api.APIServer' + } +} \ No newline at end of file diff --git a/API/src/main/java/me/zacharias/chat/api/APIEndpoints.java b/API/src/main/java/me/zacharias/chat/api/APIEndpoints.java new file mode 100644 index 0000000..7063d63 --- /dev/null +++ b/API/src/main/java/me/zacharias/chat/api/APIEndpoints.java @@ -0,0 +1,12 @@ +package me.zacharias.chat.api; + +public enum APIEndpoints { + // API request endpoints + ADD_TOOL, + QUERY, + + // API response endpoints + RESPONSE, + USE_TOOL, + +} diff --git a/API/src/main/java/me/zacharias/chat/api/APIServer.java b/API/src/main/java/me/zacharias/chat/api/APIServer.java new file mode 100644 index 0000000..e6ef274 --- /dev/null +++ b/API/src/main/java/me/zacharias/chat/api/APIServer.java @@ -0,0 +1,13 @@ +package me.zacharias.chat.api; + +import java.net.ServerSocket; +import java.util.ArrayList; + +public class APIServer { + ArrayList clientsList = new ArrayList<>(); + ServerSocket serverSocket; + + public APIServer(int port, String redirectedOutput) { + + } +} diff --git a/API/src/main/java/me/zacharias/chat/api/Client.java b/API/src/main/java/me/zacharias/chat/api/Client.java new file mode 100644 index 0000000..c6d6005 --- /dev/null +++ b/API/src/main/java/me/zacharias/chat/api/Client.java @@ -0,0 +1,4 @@ +package me.zacharias.chat.api; + +public class Client { +} diff --git a/Core/build.gradle b/Core/build.gradle new file mode 100644 index 0000000..1cdce5e --- /dev/null +++ b/Core/build.gradle @@ -0,0 +1,16 @@ +plugins { + id 'java-library' +} + +group = 'me.zacharias' +version = '1.0-SNAPSHOT' + +dependencies { + +} + +java { + toolchain { + languageVersion.set(JavaLanguageVersion.of(21)) // Set Java version + } +} \ No newline at end of file diff --git a/src/main/java/me/zacharias/chat/Main.java b/Core/src/main/java/me/zacharias/chat/core/Core.java similarity index 60% rename from src/main/java/me/zacharias/chat/Main.java rename to Core/src/main/java/me/zacharias/chat/core/Core.java index 0aea3f9..b72c058 100644 --- a/src/main/java/me/zacharias/chat/Main.java +++ b/Core/src/main/java/me/zacharias/chat/core/Core.java @@ -1,4 +1,4 @@ -package me.zacharias.chat; +package me.zacharias.chat.core; import me.zacharias.chat.ollama.*; import me.zacharias.chat.ollama.exceptions.OllamaToolErrorException; @@ -7,25 +7,28 @@ import org.json.JSONObject; import java.io.*; import java.net.*; -import java.nio.file.Files; import java.time.LocalDateTime; import java.time.format.DateTimeFormatter; -import java.util.*; +import java.util.ArrayList; +import java.util.List; import java.util.concurrent.Executors; import java.util.concurrent.ScheduledExecutorService; import java.util.concurrent.TimeUnit; -public class Main { - private String ollamaIP = "localhost";//"192.168.5.184"; - private int ollamaPort = 11434; - private URL url; - +public class Core { private static File logFile = new File("./logs/latest.log"); private static BufferedWriter logWriter; private ScheduledExecutorService scheduler; private OllamaObject ollamaObject; - private ArrayList funtionTools; + private ArrayList funtionTools = new ArrayList<>(); + + private String ollamaIP = "localhost";//"192.168.5.184"; + private int ollamaPort = 11434; + private URL url; + + private final PrintMessageHandler printMessageHandler; + private boolean supportColor; { File dir = new File("./logs/"); @@ -79,14 +82,7 @@ public class Main { e.printStackTrace(); } }, 0, 3, TimeUnit.MINUTES); - } - public static void main(String[] args) { - new Main(); - } - - public Main() - { Runtime.getRuntime().addShutdownHook(new Thread(() -> { scheduler.shutdownNow(); try { @@ -113,91 +109,32 @@ public class Main { throw new RuntimeException(e); } })); - - ollamaObject = OllamaObject.builder() - .setModel("llama3-AI") - .keep_alive(10) - .addTool(new TimeTool()) - .addTool(new PythonRunner()) - .stream(false) - .build(); - - writeLog("Creating base OllamaObject with model: "+ollamaObject.getModel()); - - funtionTools = new ArrayList<>(); - - System.out.println("Installed tools"); - writeLog("Tools installed in this instance"); - - for(OllamaTool tool : ollamaObject.getTools()) - { - if(tool instanceof OllamaFuntionTool funtion) - { - StringBuilder args = new StringBuilder(); - OllamaPerameter perameter = funtion.parameters(); - if(perameter != null) { - JSONObject obj = perameter.getProperties(); - for (String name : obj.keySet()) { - args.append(args.toString().isBlank() ? "" : ", ").append(obj.getJSONObject(name).getString("type")).append(Arrays.stream(perameter.getRequired()).anyMatch(str -> str.equalsIgnoreCase(name)) ? "" : "?").append(" ").append(name); - } - } - - System.out.println("> Function: "+funtion.name()+"("+args+")"); - writeLog("Function: "+funtion.name()+"("+args+")"); - funtionTools.add(funtion); - } - } - - BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); - - System.out.println("Message Trsnscription:"); - try { - while (true) { - System.out.print("> "); - StringBuilder message = new StringBuilder(br.readLine()); - while(br.ready()) - { - message.append("\n").append(br.readLine()); - } - if(message.toString().startsWith("/")) - { - switch (message.substring(1)) { - case "help": - System.out.print(""" - Available commands: - /help Prints this help message. - /bye Exits the program. - /write Flushes the current log stream to file. - """); - break; - case "bye": - writeLog("Exiting program..."); - System.out.println("Bye!"); - System.exit(0); - return; - case "write": - logWriter.flush(); - break; - default: - System.out.println("Unknown command: "+message); - } - } - else - { - writeLog("User: "+message); - ollamaObject.addMessage(new OllamaMessage(OllamaMessageRole.USER, message.toString())); - //System.out.println(ollamaObject.toString()); - handleResponce(qurryOllama(ollamaObject)); - } - } - }catch (Exception e) { - e.printStackTrace(); - System.out.println("Exiting due to exception"); - System.exit(-1); - } } - public JSONObject qurryOllama(OllamaObject request) + public Core(PrintMessageHandler printMessageHandler) { + this.printMessageHandler = printMessageHandler; + supportColor = printMessageHandler.color(); + } + + public void setOllamaObject(OllamaObject ollamaObject) { + this.ollamaObject = ollamaObject; + } + + public OllamaObject getOllamaObject() { + return ollamaObject; + } + + public void addFuntionTool(OllamaFuntionTool funtionTool) { + funtionTools.add(funtionTool); + } + + public static void flushLog() { + try { + logWriter.flush(); + }catch (IOException e) {} + } + + public JSONObject qurryOllama() { try { HttpURLConnection connection = (HttpURLConnection) url.openConnection(); @@ -207,7 +144,7 @@ public class Main { connection.setConnectTimeout(80*1000); try(DataOutputStream wr = new DataOutputStream(connection.getOutputStream())) { - wr.writeBytes(request.toString()); + wr.writeBytes(ollamaObject.toString()); wr.flush(); } @@ -234,7 +171,7 @@ public class Main { } else { connection.disconnect(); - System.out.println("Error: HTTP Response code - " + responseCode + "\n"+response.toString()); + System.err.println("Error: HTTP Response code - " + responseCode + "\n"+response.toString()); throw new RuntimeException("HTTP Response code - " + responseCode); } } catch (IOException e) { @@ -261,7 +198,7 @@ public class Main { if(functions.isEmpty()) { ollamaObject.addMessage(new OllamaToolError("Function '"+function.getString("name")+"' does not exist")); - System.out.println(">> \u001b[31mTried funtion call "+function.getString("name")+" but failed to find it.\u001b[0m"); + printMessageHandler.printMessage((supportColor ?"\u001b[31m":"")+"Tried funtion call "+function.getString("name")+" but failed to find it."+(printMessageHandler.color()?"\u001b[0m":"")); writeLog("Failed function call to "+function.getString("name")); } else { @@ -279,31 +216,30 @@ public class Main { try { OllamaToolRespnce function1 = func.function(argumentArrayList.toArray(new OllamaFunctionArgument[0])); ollamaObject.addMessage(function1); - System.out.println(">> \u001b[34mCall " + func.name() + "\u001b[0m"); + printMessageHandler.printMessage((supportColor?"\u001b[34m":"")+"Call "+func.name() + (printMessageHandler.color()?"\u001b[0m":"")); writeLog("Successfully function call " + func.name() + " output: " + function1.getResponse()); } catch (OllamaToolErrorException e) { ollamaObject.addMessage(new OllamaToolError(e.getMessage())); - System.out.println(">> \u001b[31mTried funtion call " + func.name() + " but failed due to " + e.getError() + "\u001b[0m"); + printMessageHandler.printMessage((supportColor?"\u001b[31m":"")+"Tried funtion call " + func.name() + " but failed due to " + e.getError() + (supportColor?"\u001b[0m":"")); writeLog(e.getMessage()); } } } } } - if(responce.getJSONObject("message").has("content") && !responce.getJSONObject("message").getString("content").isBlank()) - { - System.out.println(">> \u001b[32m"+responce.getJSONObject("message").getString("content")+"\u001b[0m"); - writeLog("Response content: "+responce.getJSONObject("message").getString("content")); - ollamaObject.addMessage(new OllamaMessage(OllamaMessageRole.ASSISTANT, responce.getJSONObject("message").getString("content"))); - } - handleResponce(qurryOllama(ollamaObject)); - } - else if(responce.getJSONObject("message").has("content") && !responce.getJSONObject("message").getString("content").isBlank()) - { - System.out.println(">> \u001b[32m"+responce.getJSONObject("message").getString("content")+"\u001b[0m"); - writeLog("Response content: "+responce.getJSONObject("message").getString("content")); - ollamaObject.addMessage(new OllamaMessage(OllamaMessageRole.ASSISTANT, responce.getJSONObject("message").getString("content"))); + checkIfResponceMessage(responce); + handleResponce(qurryOllama()); } + else checkIfResponceMessage(responce); + } + } + + private void checkIfResponceMessage(JSONObject responce) { + if(responce.getJSONObject("message").has("content") && !responce.getJSONObject("message").getString("content").isBlank()) + { + printMessageHandler.printMessage((supportColor?"\u001b[32m":"")+responce.getJSONObject("message").getString("content")+(supportColor?"\u001b[0m":"")); + writeLog("Response content: "+responce.getJSONObject("message").getString("content")); + ollamaObject.addMessage(new OllamaMessage(OllamaMessageRole.ASSISTANT, responce.getJSONObject("message").getString("content"))); } } diff --git a/Core/src/main/java/me/zacharias/chat/core/PrintMessageHandler.java b/Core/src/main/java/me/zacharias/chat/core/PrintMessageHandler.java new file mode 100644 index 0000000..43ff002 --- /dev/null +++ b/Core/src/main/java/me/zacharias/chat/core/PrintMessageHandler.java @@ -0,0 +1,6 @@ +package me.zacharias.chat.core; + +public interface PrintMessageHandler { + void printMessage(String message); + boolean color(); +} diff --git a/src/main/java/me/zacharias/chat/ollama/OllamaFunctionArgument.java b/Core/src/main/java/me/zacharias/chat/ollama/OllamaFunctionArgument.java similarity index 100% rename from src/main/java/me/zacharias/chat/ollama/OllamaFunctionArgument.java rename to Core/src/main/java/me/zacharias/chat/ollama/OllamaFunctionArgument.java diff --git a/src/main/java/me/zacharias/chat/ollama/OllamaFuntionTool.java b/Core/src/main/java/me/zacharias/chat/ollama/OllamaFuntionTool.java similarity index 100% rename from src/main/java/me/zacharias/chat/ollama/OllamaFuntionTool.java rename to Core/src/main/java/me/zacharias/chat/ollama/OllamaFuntionTool.java diff --git a/src/main/java/me/zacharias/chat/ollama/OllamaMessage.java b/Core/src/main/java/me/zacharias/chat/ollama/OllamaMessage.java similarity index 91% rename from src/main/java/me/zacharias/chat/ollama/OllamaMessage.java rename to Core/src/main/java/me/zacharias/chat/ollama/OllamaMessage.java index 59eb1f4..d48ecbd 100644 --- a/src/main/java/me/zacharias/chat/ollama/OllamaMessage.java +++ b/Core/src/main/java/me/zacharias/chat/ollama/OllamaMessage.java @@ -14,7 +14,7 @@ public class OllamaMessage { @Override public String toString() { JSONObject json = new JSONObject(); - json.put("role", role); + json.put("role", role.getRole()); json.put("content", content); return json.toString(); } diff --git a/src/main/java/me/zacharias/chat/ollama/OllamaMessageRole.java b/Core/src/main/java/me/zacharias/chat/ollama/OllamaMessageRole.java similarity index 100% rename from src/main/java/me/zacharias/chat/ollama/OllamaMessageRole.java rename to Core/src/main/java/me/zacharias/chat/ollama/OllamaMessageRole.java diff --git a/src/main/java/me/zacharias/chat/ollama/OllamaObject.java b/Core/src/main/java/me/zacharias/chat/ollama/OllamaObject.java similarity index 100% rename from src/main/java/me/zacharias/chat/ollama/OllamaObject.java rename to Core/src/main/java/me/zacharias/chat/ollama/OllamaObject.java diff --git a/src/main/java/me/zacharias/chat/ollama/OllamaPerameter.java b/Core/src/main/java/me/zacharias/chat/ollama/OllamaPerameter.java similarity index 100% rename from src/main/java/me/zacharias/chat/ollama/OllamaPerameter.java rename to Core/src/main/java/me/zacharias/chat/ollama/OllamaPerameter.java diff --git a/src/main/java/me/zacharias/chat/ollama/OllamaTool.java b/Core/src/main/java/me/zacharias/chat/ollama/OllamaTool.java similarity index 100% rename from src/main/java/me/zacharias/chat/ollama/OllamaTool.java rename to Core/src/main/java/me/zacharias/chat/ollama/OllamaTool.java diff --git a/src/main/java/me/zacharias/chat/ollama/OllamaToolError.java b/Core/src/main/java/me/zacharias/chat/ollama/OllamaToolError.java similarity index 100% rename from src/main/java/me/zacharias/chat/ollama/OllamaToolError.java rename to Core/src/main/java/me/zacharias/chat/ollama/OllamaToolError.java diff --git a/src/main/java/me/zacharias/chat/ollama/OllamaToolRespnce.java b/Core/src/main/java/me/zacharias/chat/ollama/OllamaToolRespnce.java similarity index 100% rename from src/main/java/me/zacharias/chat/ollama/OllamaToolRespnce.java rename to Core/src/main/java/me/zacharias/chat/ollama/OllamaToolRespnce.java diff --git a/src/main/java/me/zacharias/chat/ollama/exceptions/OllamaToolErrorException.java b/Core/src/main/java/me/zacharias/chat/ollama/exceptions/OllamaToolErrorException.java similarity index 89% rename from src/main/java/me/zacharias/chat/ollama/exceptions/OllamaToolErrorException.java rename to Core/src/main/java/me/zacharias/chat/ollama/exceptions/OllamaToolErrorException.java index 6e8ec2a..9a1fe0d 100644 --- a/src/main/java/me/zacharias/chat/ollama/exceptions/OllamaToolErrorException.java +++ b/Core/src/main/java/me/zacharias/chat/ollama/exceptions/OllamaToolErrorException.java @@ -1,7 +1,5 @@ package me.zacharias.chat.ollama.exceptions; -import me.zacharias.chat.ollama.OllamaToolRespnce; - public class OllamaToolErrorException extends RuntimeException { private final String tool; private final String error; diff --git a/Display/build.gradle b/Display/build.gradle new file mode 100644 index 0000000..a3a65f9 --- /dev/null +++ b/Display/build.gradle @@ -0,0 +1,20 @@ +plugins { + id 'java' +} + +group = 'me.zacharias' +version = '1.0-SNAPSHOT' + +dependencies { + implementation project(":Core") +} + +test { + useJUnitPlatform() +} + +jar{ + manifest { + attributes 'Main-Class': 'me.zacharias.chat.display.Main' + } +} \ No newline at end of file diff --git a/Display/src/main/java/me/zacharias/chat/display/Display.java b/Display/src/main/java/me/zacharias/chat/display/Display.java new file mode 100644 index 0000000..ca02794 --- /dev/null +++ b/Display/src/main/java/me/zacharias/chat/display/Display.java @@ -0,0 +1,106 @@ +package me.zacharias.chat.display; + +import me.zacharias.chat.core.Core; +import me.zacharias.chat.core.PrintMessageHandler; +import me.zacharias.chat.ollama.*; +import org.json.JSONObject; + +import java.io.*; +import java.util.*; + +import static me.zacharias.chat.core.Core.writeLog; + +public class Display { + + Core core = new Core(new PrintMessageHandler() { + @Override + public void printMessage(String message) { + System.out.println(">> "+message); + } + + @Override + public boolean color() { + return true; + } + }); + + public Display() + { + + core.setOllamaObject(OllamaObject.builder() + .setModel("llama3-AI") + .keep_alive(10) + .addTool(new TimeTool()) + .addTool(new PythonRunner()) + .stream(false) + .build()); + + writeLog("Creating base OllamaObject with model: "+core.getOllamaObject().getModel()); + + System.out.println("Installed tools"); + writeLog("Tools installed in this instance"); + + for(OllamaTool tool : core.getOllamaObject().getTools()) + { + if(tool instanceof OllamaFuntionTool funtion) + { + StringBuilder args = new StringBuilder(); + OllamaPerameter perameter = funtion.parameters(); + if(perameter != null) { + JSONObject obj = perameter.getProperties(); + for (String name : obj.keySet()) { + args.append(args.toString().isBlank() ? "" : ", ").append(obj.getJSONObject(name).getString("type")).append(Arrays.stream(perameter.getRequired()).anyMatch(str -> str.equalsIgnoreCase(name)) ? "" : "?").append(" ").append(name); + } + } + + System.out.println("> Function: "+funtion.name()+"("+args+")"); + writeLog("Function: "+funtion.name()+"("+args+")"); + core.addFuntionTool(funtion); + } + } + + BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); + + System.out.println("Message Trsnscription:"); + try { + while (true) { + System.out.print("> "); + StringBuilder message = new StringBuilder(br.readLine()); + while (br.ready()) { + message.append("\n").append(br.readLine()); + } + if (message.toString().startsWith("/")) { + switch (message.substring(1)) { + case "help": + System.out.print(""" + Available commands: + /help Prints this help message. + /bye Exits the program. + /write Flushes the current log stream to file. + """); + break; + case "bye": + writeLog("Exiting program..."); + System.out.println("Bye!"); + System.exit(0); + return; + case "write": + core.flushLog(); + break; + default: + System.out.println("Unknown command: " + message); + } + } else { + writeLog("User: " + message); + core.getOllamaObject().addMessage(new OllamaMessage(OllamaMessageRole.USER, message.toString())); + //System.out.println(ollamaObject.toString()); + core.handleResponce(core.qurryOllama()); + } + } + } catch (Exception e) { + e.printStackTrace(); + System.out.println("Exiting due to exception"); + System.exit(-1); + } + } +} diff --git a/src/main/java/me/zacharias/chat/PythonRunner.java b/Display/src/main/java/me/zacharias/chat/display/PythonRunner.java similarity index 91% rename from src/main/java/me/zacharias/chat/PythonRunner.java rename to Display/src/main/java/me/zacharias/chat/display/PythonRunner.java index b7f4890..65cb877 100644 --- a/src/main/java/me/zacharias/chat/PythonRunner.java +++ b/Display/src/main/java/me/zacharias/chat/display/PythonRunner.java @@ -1,29 +1,25 @@ -package me.zacharias.chat; +package me.zacharias.chat.display; import com.github.dockerjava.api.DockerClient; import com.github.dockerjava.api.async.ResultCallback; -import com.github.dockerjava.api.async.ResultCallbackTemplate; -import com.github.dockerjava.api.command.AttachContainerCmd; import com.github.dockerjava.api.command.LogContainerCmd; -import com.github.dockerjava.api.command.StartContainerCmd; import com.github.dockerjava.api.model.Frame; import com.github.dockerjava.core.DefaultDockerClientConfig; import com.github.dockerjava.core.DockerClientBuilder; -import com.github.dockerjava.core.DockerClientConfig; -import com.github.dockerjava.core.command.LogContainerResultCallback; -import me.zacharias.chat.ollama.*; +import me.zacharias.chat.ollama.OllamaFunctionArgument; +import me.zacharias.chat.ollama.OllamaFuntionTool; +import me.zacharias.chat.ollama.OllamaPerameter; +import me.zacharias.chat.ollama.OllamaToolRespnce; import me.zacharias.chat.ollama.exceptions.OllamaToolErrorException; -import org.json.JSONObject; import java.io.*; import java.nio.charset.StandardCharsets; import java.security.MessageDigest; import java.util.ArrayList; -import java.util.Base64; import java.util.List; import java.util.logging.Logger; -import static me.zacharias.chat.Main.writeLog; +import static me.zacharias.chat.core.Core.writeLog; public class PythonRunner extends OllamaFuntionTool { DockerClient dockerClient; @@ -172,7 +168,7 @@ public class PythonRunner extends OllamaFuntionTool { logContainerCmd.exec(new ResultCallback.Adapter() { @Override public void onNext(Frame item) { - logs.add(item.toString()); + logs.add(new String(item.getPayload()).trim()); } }).awaitCompletion(); } catch (InterruptedException e) { diff --git a/src/main/java/me/zacharias/chat/TimeTool.java b/Display/src/main/java/me/zacharias/chat/display/TimeTool.java similarity index 95% rename from src/main/java/me/zacharias/chat/TimeTool.java rename to Display/src/main/java/me/zacharias/chat/display/TimeTool.java index 4cd57c2..edb7c71 100644 --- a/src/main/java/me/zacharias/chat/TimeTool.java +++ b/Display/src/main/java/me/zacharias/chat/display/TimeTool.java @@ -1,4 +1,4 @@ -package me.zacharias.chat; +package me.zacharias.chat.display; import me.zacharias.chat.ollama.OllamaFunctionArgument; import me.zacharias.chat.ollama.OllamaFuntionTool; diff --git a/build.gradle b/build.gradle index 9ac6b9b..8ebdeae 100644 --- a/build.gradle +++ b/build.gradle @@ -6,21 +6,18 @@ plugins { group = 'me.zacharias' version = '1.0-SNAPSHOT' -repositories { - mavenCentral() +allprojects { + repositories { + mavenCentral() + } + } -dependencies { - implementation("org.json:json:20250107") - implementation("com.github.docker-java:docker-java:3.4.1") -} +subprojects { + apply plugin: 'java' -test { - useJUnitPlatform() -} - -jar{ - manifest { - attributes 'Main-Class': 'me.zacharias.chat.Main' + dependencies { + implementation("org.json:json:20250107") + implementation("com.github.docker-java:docker-java:3.4.1") } } \ No newline at end of file diff --git a/luancher/build.gradle b/luancher/build.gradle new file mode 100644 index 0000000..6754add --- /dev/null +++ b/luancher/build.gradle @@ -0,0 +1,11 @@ +plugins { + id 'java' +} + +group = 'me.zacharias' +version = '1.0-SNAPSHOT' + +dependencies { + implementation project(":Display") + implementation project(":API") +} \ No newline at end of file diff --git a/luancher/src/main/java/me/zacharias/chat/luancher/Launcher.java b/luancher/src/main/java/me/zacharias/chat/luancher/Launcher.java new file mode 100644 index 0000000..8d9b8d6 --- /dev/null +++ b/luancher/src/main/java/me/zacharias/chat/luancher/Launcher.java @@ -0,0 +1,55 @@ +package me.zacharias.chat.luancher; + +import me.zacharias.chat.api.APIServer; +import me.zacharias.chat.display.Display; + +public class Launcher { + public static void main(String[] args) { + boolean serverMode = false; + int port = 39075; + String redirectedOutput = null; + + for (int i = 0; i < args.length; i++) { + String arg = args[i].toLowerCase(); + String argValue = (i + 1 < args.length) ? args[i + 1] : null; + + switch (arg) { + case "-s", "--server" -> serverMode = true; + case "-p", "--port" -> { + if (argValue != null) { + port = Integer.parseInt(argValue); + } else { + System.out.println("Missing argument for -p or --port option"); + System.exit(1); + } + } + case "-o", "--output" -> { + if (argValue != null) { + redirectedOutput = argValue; + } else { + System.out.println("Missing argument for -o or --output option"); + System.exit(1); + } + } + case "--api" -> { + System.out.println("API available at https://server.4zellen.se:3000/Zacharias/chat_thing/wiki/API-Docs"); + return; + } + default -> System.out.println("Unknown argument: " + arg); + } + } + + if (redirectedOutput != null && !serverMode) { + System.out.println("Cannot run with a redirected output without running in server mode"); + return; + } + + if (serverMode) { + System.out.println("Starting in API mode..."); + new APIServer(port, redirectedOutput); + } else { + System.out.println("Starting in Display mode..."); + new Display(); + } + } +} diff --git a/settings.gradle b/settings.gradle index a8ed29d..29e44a1 100644 --- a/settings.gradle +++ b/settings.gradle @@ -1,2 +1,3 @@ rootProject.name = 'AI-test' +include 'API', 'Core', 'Display', 'luancher'