Explorar el Código

[add] connect to server

isundil hace 9 años
padre
commit
f50cd4f3b7

+ 31 - 0
libirc.iml

@@ -0,0 +1,31 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<module external.linked.project.id=":libirc" external.linked.project.path="$MODULE_DIR$" external.root.project.path="$USER_HOME$/Project/androidChatter" external.system.id="GRADLE" type="JAVA_MODULE" version="4">
+  <component name="FacetManager">
+    <facet type="android-gradle" name="Android-Gradle">
+      <configuration>
+        <option name="GRADLE_PROJECT_PATH" value=":libirc" />
+      </configuration>
+    </facet>
+    <facet type="java-gradle" name="Java-Gradle">
+      <configuration>
+        <option name="BUILD_FOLDER_PATH" value="$MODULE_DIR$/build" />
+        <option name="BUILDABLE" value="true" />
+      </configuration>
+    </facet>
+  </component>
+  <component name="NewModuleRootManager" LANGUAGE_LEVEL="JDK_1_7" inherit-compiler-output="false">
+    <output url="file://$MODULE_DIR$/build/classes/main" />
+    <output-test url="file://$MODULE_DIR$/build/classes/test" />
+    <exclude-output />
+    <content url="file://$MODULE_DIR$">
+      <sourceFolder url="file://$MODULE_DIR$/src/main/java" isTestSource="false" />
+      <sourceFolder url="file://$MODULE_DIR$/src/main/resources" type="java-resource" />
+      <sourceFolder url="file://$MODULE_DIR$/src/test/java" isTestSource="true" />
+      <sourceFolder url="file://$MODULE_DIR$/src/test/resources" type="java-test-resource" />
+      <excludeFolder url="file://$MODULE_DIR$/.gradle" />
+      <excludeFolder url="file://$MODULE_DIR$/build" />
+    </content>
+    <orderEntry type="inheritedJdk" />
+    <orderEntry type="sourceFolder" forTests="false" />
+  </component>
+</module>

+ 12 - 0
src/main/java/com/knacki/lib/libirc/IrcCallback.java

@@ -0,0 +1,12 @@
+package com.knacki.lib.libirc;
+
+import com.knacki.lib.libirc.api.messages.IrcMessage;
+
+/**
+ * Created by isundil on 10/31/16.
+ */
+public interface IrcCallback {
+    void onConnect();
+    void onTerminate(Throwable e);
+    void onMessage(IrcMessage message);
+}

+ 74 - 0
src/main/java/com/knacki/lib/libirc/IrcConnector.java

@@ -0,0 +1,74 @@
+package com.knacki.lib.libirc;
+
+import com.knacki.lib.libirc.api.IrcISocket;
+import com.knacki.lib.libirc.api.IrcSSLSocket;
+import com.knacki.lib.libirc.api.IrcSocket;
+import com.knacki.lib.libirc.api.messages.ErrorMessage;
+import com.knacki.lib.libirc.api.messages.IrcMessage;
+
+import java.util.logging.Level;
+import java.util.logging.Logger;
+
+/**
+ * Created by isundil on 10/31/16.
+ */
+public class IrcConnector {
+    private static IrcISocket sock;
+    private Callbacks callBackSuite;
+    private IrcCallback cb;
+    private static final Logger log = Logger.getLogger(IrcConnector.class.getName());
+
+    public IrcConnector(String addr, short port, boolean useSsl, IrcCallback cb) {
+        callBackSuite = new Callbacks();
+        this.cb = cb;
+
+        if (useSsl)
+            sock = new IrcSSLSocket(addr, port);
+        else
+          sock = new IrcSocket(addr, port);
+
+        sock.connect(callBackSuite, callBackSuite);
+    }
+
+    private class Callbacks implements IrcISocket.ConnectCallback, IrcISocket.MessageCallback {
+        @Override
+        public void onConnectError(Throwable e) {
+            log.log(Level.WARNING, e.getMessage(), e);
+            cb.onTerminate(e);
+        }
+
+        @Override
+        public void onConnectSuccess() {
+            cb.onConnect();
+        }
+
+        @Override
+        public void onMessage(String line) {
+            IrcMessage message = IrcMessage.Builder.build(line);
+
+            if (message == null)
+                log.warning("Ignoring unknown IRC message: " +line);
+            else {
+                cb.onMessage(message);
+                if (message instanceof ErrorMessage) {
+                    log.severe("Closing link on received error: " +((ErrorMessage) message).errorMsg);
+                    sock.disconnect();
+                }
+            }
+        }
+    }
+
+    public void setPassword(String pass) {
+        sock.send("PASS " +pass);
+    }
+
+    public void setNick(String nick) {
+        sock.send("NICK " +nick);
+    }
+
+    public void setAuth(String username, String hostname, String servername, String realName, String password) {
+        if (password != null)
+            setPassword(password);
+        sock.send("USER " +username +" " +hostname +" " +servername +" :" +realName);
+    }
+}

+ 0 - 4
src/main/java/com/knacki/lib/libirc/MyClass.java

@@ -1,4 +0,0 @@
-package com.knacki.lib.libirc;
-
-public class MyClass {
-}

+ 22 - 0
src/main/java/com/knacki/lib/libirc/api/IrcISocket.java

@@ -0,0 +1,22 @@
+package com.knacki.lib.libirc.api;
+
+import java.util.logging.Level;
+import java.util.logging.Logger;
+
+/**
+ * Created by isundil on 10/31/16.
+ */
+public interface IrcISocket {
+    void connect(ConnectCallback cb, MessageCallback mcb);
+    void disconnect();
+    void send(String line);
+
+    interface ConnectCallback {
+        void onConnectSuccess();
+        void onConnectError(Throwable e);
+    }
+
+    interface MessageCallback {
+        void onMessage(String line);
+    }
+}

+ 21 - 0
src/main/java/com/knacki/lib/libirc/api/IrcSSLSocket.java

@@ -0,0 +1,21 @@
+package com.knacki.lib.libirc.api;
+
+/**
+ * Created by isundil on 10/31/16.
+ */
+
+public class IrcSSLSocket implements IrcISocket {
+    public IrcSSLSocket(String addr, short port) {
+        throw new UnsupportedOperationException("SSL not supported yet");
+    }
+
+    @Override
+    public void connect(ConnectCallback cb, final MessageCallback mcb) {
+        throw new UnsupportedOperationException("SSL not supported yet");
+    }
+
+    @Override
+    public void disconnect() {
+        throw new UnsupportedOperationException("SSL not supported yet");
+    }
+}

+ 107 - 0
src/main/java/com/knacki/lib/libirc/api/IrcSocket.java

@@ -0,0 +1,107 @@
+package com.knacki.lib.libirc.api;
+
+import java.io.BufferedReader;
+import java.io.IOException;
+import java.io.InputStreamReader;
+import java.io.OutputStreamWriter;
+import java.net.Socket;
+import java.net.SocketException;
+import java.util.ArrayDeque;
+import java.util.Iterator;
+
+/**
+ * Created by isundil on 10/31/16.
+ */
+public class IrcSocket implements IrcISocket {
+    protected String addr;
+    protected short port;
+    protected Socket sock;
+    protected Thread thread;
+    private OutputStreamWriter out;
+    private ArrayDeque<String> delayMsg;
+
+    protected MessageCallback mcb;
+    protected ConnectCallback ccb;
+
+    public IrcSocket(String addr, short port) {
+        this.addr = addr;
+        this.port = port;
+        delayMsg = new ArrayDeque<>();
+    }
+
+    @Override
+    public void connect(ConnectCallback cb, final MessageCallback mcb) {
+        final InputStreamReader input;
+        ccb = cb;
+        this.mcb = mcb;
+
+        try {
+            sock = new Socket(addr, port);
+            input = new InputStreamReader(sock.getInputStream());
+            out = new OutputStreamWriter(sock.getOutputStream());
+        }
+        catch (IOException e) {
+            cb.onConnectError(e);
+            return;
+        }
+        thread = new Thread() {
+            @Override
+            public void run() {
+                runThread(new BufferedReader(input));
+            }
+        };
+        thread.start();
+        cb.onConnectSuccess();
+    }
+
+    @Override
+    public void disconnect() {
+        try {
+            sock.close();
+            thread.interrupt();
+        }
+        catch (IOException e) {
+        }
+    }
+
+    @Override
+    public void send(String line) {
+        delayMsg.add(line);
+    }
+
+    private void runThread(BufferedReader in) {
+        while (true) {
+            String line;
+
+            try {
+                line = in.readLine();
+            }
+            catch (InterruptedException) {
+                try {
+                    for (Iterator<String> lineIt = delayMsg.iterator(); lineIt.hasNext();) {
+                        out.write(lineIt.next() + "\n");
+                        lineIt.remove();
+                    }
+                }
+                catch (IOException e) {
+                    ccb.onConnectError(e);
+                    break;
+                }
+                continue;
+            }
+            catch (SocketException e) {
+                if (sock.isClosed()) {
+                    break;
+                }
+                ccb.onConnectError(e);
+                break;
+            }
+            catch (IOException e) {
+                ccb.onConnectError(e);
+                break;
+            }
+            if (line != null)
+                mcb.onMessage(line);
+        }
+    }
+}

+ 33 - 0
src/main/java/com/knacki/lib/libirc/api/LineReader.java

@@ -0,0 +1,33 @@
+package com.knacki.lib.libirc.api;
+
+/**
+ * Created by isundil on 10/31/16.
+ */
+
+public class LineReader {
+    private String line;
+    private static String lineInit;
+
+    public LineReader(String s) {
+        lineInit = line = s;
+    }
+
+    public String nextToken() {
+        if (line.length() == 0)
+            return null;
+
+        final int tokenDelim = line.indexOf(' ');
+        final String token;
+
+        if (tokenDelim == -1)
+            token = line;
+        else
+            token = line.substring(0, tokenDelim);
+        line = line.substring(tokenDelim +1).trim();
+        return token;
+    }
+
+    public String getRemains() {
+        return line;
+    }
+}

+ 15 - 0
src/main/java/com/knacki/lib/libirc/api/messages/ErrorMessage.java

@@ -0,0 +1,15 @@
+package com.knacki.lib.libirc.api.messages;
+
+import com.knacki.lib.libirc.api.LineReader;
+
+/**
+ * Created by isundil on 10/31/16.
+ */
+
+public class ErrorMessage extends IrcMessage {
+    public final String errorMsg;
+
+    ErrorMessage(LineReader lr) {
+        errorMsg = lr.getRemains();
+    }
+}

+ 26 - 0
src/main/java/com/knacki/lib/libirc/api/messages/IrcMessage.java

@@ -0,0 +1,26 @@
+package com.knacki.lib.libirc.api.messages;
+
+import com.knacki.lib.libirc.api.LineReader;
+
+/**
+ * Created by isundil on 10/31/16.
+ */
+public abstract class IrcMessage {
+
+    public static class Builder {
+        private Builder() {}
+
+        public static IrcMessage build(String line) {
+            LineReader lr = new LineReader(line);
+            String token = lr.nextToken();
+
+            switch (token) {
+                case "NOTICE":
+                    return new NoticeMessage(lr);
+                case "ERROR":
+                    return new ErrorMessage(lr);
+            }
+            return null;
+        }
+    }
+}

+ 13 - 0
src/main/java/com/knacki/lib/libirc/api/messages/NoticeMessage.java

@@ -0,0 +1,13 @@
+package com.knacki.lib.libirc.api.messages;
+
+import com.knacki.lib.libirc.api.LineReader;
+
+/**
+ * Created by isundil on 10/31/16.
+ */
+
+public class NoticeMessage extends IrcMessage {
+    NoticeMessage(LineReader lr) {
+
+    }
+}

+ 42 - 0
src/main/java/com/knacki/lib/libirc/test/SocketTest.java

@@ -0,0 +1,42 @@
+package com.knacki.lib.libirc.test;
+
+import com.knacki.lib.libirc.IrcCallback;
+import com.knacki.lib.libirc.IrcConnector;
+import com.knacki.lib.libirc.api.messages.IrcMessage;
+
+import java.sql.Time;
+import java.util.Timer;
+
+/**
+ * Created by isundil on 10/31/16.
+ */
+
+public class SocketTest {
+    public static void main(String []av) {
+        IrcConnector con = new IrcConnector("irc.gamesurge.net", (short) 6667, false, new IrcCallback() {
+
+            @Override
+            public void onConnect() {
+                System.out.println("Connected");
+            }
+
+            @Override
+            public void onTerminate(Throwable e) {
+                System.out.println("terminated");
+            }
+
+            @Override
+            public void onMessage(IrcMessage message) {
+                System.out.println("read message");
+            }
+        });
+        while (true) {
+            try {
+                Thread.sleep(1000);
+            }
+            catch (InterruptedException e) {
+                return;
+            }
+        }
+    }
+}