diff --git a/im-client/pom.xml b/im-client/pom.xml
index d3949d0..8e3d245 100644
--- a/im-client/pom.xml
+++ b/im-client/pom.xml
@@ -25,10 +25,17 @@
io.netty
netty-all
+
+ com.google.inject
+ guice
+
+
+ org.reflections
+ reflections
+
com.beust
jcommander
- 1.82
diff --git a/im-client/src/main/java/net/sopod/soim/client/ClientMain.java b/im-client/src/main/java/net/sopod/soim/client/ClientMain.java
index 27e5eef..0e3bc30 100644
--- a/im-client/src/main/java/net/sopod/soim/client/ClientMain.java
+++ b/im-client/src/main/java/net/sopod/soim/client/ClientMain.java
@@ -1,5 +1,11 @@
package net.sopod.soim.client;
+import com.google.inject.Guice;
+import com.google.inject.Injector;
+import com.google.inject.Stage;
+import net.sopod.soim.client.cmd.CmdDispatcher;
+import net.sopod.soim.client.cmd.CmdStarter;
+import net.sopod.soim.client.config.GuiceIoc;
import net.sopod.soim.client.net.ImNetClient;
/**
@@ -14,9 +20,15 @@ import net.sopod.soim.client.net.ImNetClient;
public class ClientMain {
public static void main(String[] args) throws InterruptedException {
- ImNetClient client = new ImNetClient();
- client.connect("127.0.0.1", 8088);
-
+// ImNetClient client = new ImNetClient();
+// client.connect("127.0.0.1", 8088);
+ GuiceIoc guiceIoc = new GuiceIoc(ClientMain.class);
+ Injector injector = Guice.createInjector(Stage.PRODUCTION, guiceIoc);
+ // dispatcher
+ CmdDispatcher cmdDispatcher = new CmdDispatcher(injector);
+ // starter
+ CmdStarter cmdStarter = new CmdStarter(cmdDispatcher);
+ cmdStarter.start();
}
}
diff --git a/im-client/src/main/java/net/sopod/soim/client/cmd/ArgsLogin.java b/im-client/src/main/java/net/sopod/soim/client/cmd/ArgsLogin.java
new file mode 100644
index 0000000..2adf415
--- /dev/null
+++ b/im-client/src/main/java/net/sopod/soim/client/cmd/ArgsLogin.java
@@ -0,0 +1,21 @@
+package net.sopod.soim.client.cmd;
+
+import com.beust.jcommander.Parameter;
+import lombok.Data;
+
+/**
+ * ArgsLogin
+ *
+ * @author tmy
+ * @date 2022-04-25 10:42
+ */
+@Data
+public class ArgsLogin {
+
+ @Parameter(names = {"-u", "-account"}, description = "账号")
+ private String account;
+
+ @Parameter(names = {"-p", "-password"}, description = "密码", password = true)
+ private String password;
+
+}
diff --git a/im-client/src/main/java/net/sopod/soim/client/cmd/CmdDispatcher.java b/im-client/src/main/java/net/sopod/soim/client/cmd/CmdDispatcher.java
new file mode 100644
index 0000000..94ea555
--- /dev/null
+++ b/im-client/src/main/java/net/sopod/soim/client/cmd/CmdDispatcher.java
@@ -0,0 +1,52 @@
+package net.sopod.soim.client.cmd;
+
+import com.beust.jcommander.JCommander;
+import com.google.inject.Injector;
+import net.sopod.soim.client.logger.Logger;
+
+/**
+ * CommandDispatcher
+ *
+ * auth -u prometheus -p 123456
+ * send zeus hello
+ * send prometheus hi!
+ * users
+ * groups
+ *
+ *
+ * @author tmy
+ * @date 2022-04-25 10:28
+ */
+public class CmdDispatcher {
+
+ private final Injector injector;
+
+ public CmdDispatcher(Injector injector) {
+ this.injector = injector;
+ }
+
+ public void dispatchCmd(String cmdStr) {
+ Logger.info("dispatch cmd: {}", cmdStr);
+ int idx = cmdStr.indexOf(" ");
+ String cmd = idx == -1 ? cmdStr : cmdStr.substring(0, idx);
+ String argsStr = idx == -1 ? "" : cmdStr.substring(idx + 1);
+
+ }
+
+ public static void main(String[] args) {
+ String cmdStr = "auth -u prometheus -p 123456";
+ int idx = cmdStr.indexOf(" ");
+ String cmd = idx == -1 ? cmdStr : cmdStr.substring(0, idx);
+ String argsStr = idx == -1 ? "" : cmdStr.substring(idx + 1);
+
+
+ ArgsLogin argsLogin = new ArgsLogin();
+ String[] argv = {"-u", "zeus", "-p", "123456"};
+ JCommander.newBuilder()
+ .addObject(argsLogin)
+ .build()
+ .parse(argv);
+ System.out.println(argsLogin);
+ }
+
+}
diff --git a/im-client/src/main/java/net/sopod/soim/client/cmd/CmdEnum.java b/im-client/src/main/java/net/sopod/soim/client/cmd/CmdEnum.java
new file mode 100644
index 0000000..a32f30a
--- /dev/null
+++ b/im-client/src/main/java/net/sopod/soim/client/cmd/CmdEnum.java
@@ -0,0 +1,31 @@
+package net.sopod.soim.client.cmd;
+
+/**
+ * Commands
+ *
+ * @author tmy
+ * @date 2022-04-25 10:51
+ */
+public enum CmdEnum {
+
+ /** 登录 */
+ login,
+
+ /** 发送消息 */
+ send,
+
+ /** 用户列表 */
+ users,
+
+ /** 用户分组列表 */
+ groups,
+
+ /** 退出 */
+ exit;
+
+
+ CmdEnum() {
+
+ }
+
+}
diff --git a/im-client/src/main/java/net/sopod/soim/client/cmd/CmdStarter.java b/im-client/src/main/java/net/sopod/soim/client/cmd/CmdStarter.java
new file mode 100644
index 0000000..0c85d77
--- /dev/null
+++ b/im-client/src/main/java/net/sopod/soim/client/cmd/CmdStarter.java
@@ -0,0 +1,38 @@
+package net.sopod.soim.client.cmd;
+
+import com.google.inject.Injector;
+import net.sopod.soim.client.logger.Logger;
+
+import java.util.Scanner;
+
+/**
+ * Args
+ *
+ * @author tmy
+ * @date 2022-04-25 10:28
+ */
+public class CmdStarter {
+
+ private final CmdDispatcher cmdDispatcher;
+
+ public CmdStarter(CmdDispatcher cmdDispatcher) {
+ this.cmdDispatcher = cmdDispatcher;
+ }
+
+ public void start() {
+ Scanner scanner = new Scanner(System.in);
+ Logger.pre("[client]: ");
+ while(scanner.hasNextLine()) {
+ String cmd = scanner.nextLine();
+ cmdDispatcher.dispatchCmd(cmd);
+ Logger.pre("[client]: ");
+ }
+
+ scanner.close();
+ }
+
+ public void exit() {
+
+ }
+
+}
diff --git a/im-client/src/main/java/net/sopod/soim/client/config/GuiceIoc.java b/im-client/src/main/java/net/sopod/soim/client/config/GuiceIoc.java
new file mode 100644
index 0000000..451d933
--- /dev/null
+++ b/im-client/src/main/java/net/sopod/soim/client/config/GuiceIoc.java
@@ -0,0 +1,43 @@
+package net.sopod.soim.client.config;
+
+import com.google.inject.AbstractModule;
+import com.google.inject.Singleton;
+import org.reflections.Reflections;
+
+import java.util.Collections;
+import java.util.Set;
+
+/**
+ * Ioc
+ *
+ * @author tmy
+ * @date 2022-04-25 11:02
+ */
+public class GuiceIoc extends AbstractModule {
+
+ private final String rootPackage;
+
+ private Set> beanTypes = Collections.emptySet();
+
+ public GuiceIoc(Class> rootClass) {
+ this.rootPackage = rootClass.getPackage().getName();
+ this.scanRootPackage();
+ }
+
+ @Override
+ protected void configure() {
+ for (Class> beanType : this.beanTypes) {
+ bind(beanType);
+ }
+ this.beanTypes = Collections.emptySet();
+ }
+
+ /**
+ * 扫描需要注入的类
+ */
+ private void scanRootPackage() {
+ Reflections reflect = new Reflections(rootPackage);
+ this.beanTypes = reflect.getTypesAnnotatedWith(Singleton.class);
+ }
+
+}
diff --git a/im-client/src/main/java/net/sopod/soim/client/handler/CmdHandler.java b/im-client/src/main/java/net/sopod/soim/client/handler/CmdHandler.java
new file mode 100644
index 0000000..9df3859
--- /dev/null
+++ b/im-client/src/main/java/net/sopod/soim/client/handler/CmdHandler.java
@@ -0,0 +1,15 @@
+package net.sopod.soim.client.handler;
+
+/**
+ * CmdHandler
+ *
+ * @author tmy
+ * @date 2022-04-25 10:56
+ */
+public interface CmdHandler {
+
+ T newArgsInstance();
+
+ void handleArgs(T args);
+
+}
diff --git a/im-client/src/main/java/net/sopod/soim/client/handler/ExitHandler.java b/im-client/src/main/java/net/sopod/soim/client/handler/ExitHandler.java
new file mode 100644
index 0000000..b3e0425
--- /dev/null
+++ b/im-client/src/main/java/net/sopod/soim/client/handler/ExitHandler.java
@@ -0,0 +1,19 @@
+package net.sopod.soim.client.handler;
+
+import com.google.inject.Singleton;
+
+/**
+ * ExitHandler
+ *
+ * @author tmy
+ * @date 2022-04-25 11:53
+ */
+@Singleton
+public class ExitHandler extends NonArgsHandler {
+
+ @Override
+ public void handle() {
+ System.exit(1);
+ }
+
+}
diff --git a/im-client/src/main/java/net/sopod/soim/client/handler/LoginCmdHandler.java b/im-client/src/main/java/net/sopod/soim/client/handler/LoginCmdHandler.java
new file mode 100644
index 0000000..e101a83
--- /dev/null
+++ b/im-client/src/main/java/net/sopod/soim/client/handler/LoginCmdHandler.java
@@ -0,0 +1,25 @@
+package net.sopod.soim.client.handler;
+
+import com.google.inject.Singleton;
+import net.sopod.soim.client.cmd.ArgsLogin;
+
+/**
+ * LoginCmdHandler
+ *
+ * @author tmy
+ * @date 2022-04-25 10:53
+ */
+@Singleton
+public class LoginCmdHandler implements CmdHandler {
+
+ @Override
+ public ArgsLogin newArgsInstance() {
+ return new ArgsLogin();
+ }
+
+ @Override
+ public void handleArgs(ArgsLogin args) {
+
+ }
+
+}
diff --git a/im-client/src/main/java/net/sopod/soim/client/handler/NonArgsHandler.java b/im-client/src/main/java/net/sopod/soim/client/handler/NonArgsHandler.java
new file mode 100644
index 0000000..e9ced6a
--- /dev/null
+++ b/im-client/src/main/java/net/sopod/soim/client/handler/NonArgsHandler.java
@@ -0,0 +1,23 @@
+package net.sopod.soim.client.handler;
+
+/**
+ * NoArgsHandler
+ *
+ * @author tmy
+ * @date 2022-04-25 12:00
+ */
+public abstract class NonArgsHandler implements CmdHandler