diff --git a/lib/src/main/java/io/github/lonamiwebs/overgram/Overgram.java b/lib/src/main/java/io/github/lonamiwebs/overgram/Overgram.java index 40277ea..8980b6a 100644 --- a/lib/src/main/java/io/github/lonamiwebs/overgram/Overgram.java +++ b/lib/src/main/java/io/github/lonamiwebs/overgram/Overgram.java @@ -1,46 +1,16 @@ package io.github.lonamiwebs.overgram; -import io.github.lonamiwebs.overgram.crypto.AuthKey; -import io.github.lonamiwebs.overgram.network.MTProtoSender; -import io.github.lonamiwebs.overgram.network.MTProtoState; -import io.github.lonamiwebs.overgram.network.connection.TcpFull; -import io.github.lonamiwebs.overgram.tl.Functions; - -import java.io.File; -import java.io.FileInputStream; -import java.io.FileOutputStream; -import java.io.IOException; -import java.util.concurrent.ExecutionException; -import java.util.concurrent.Future; +import io.github.lonamiwebs.overgram.client.TelegramBaseClient; public class Overgram { - private static void saveAuthKey(final AuthKey authKey, final File file) { - try (final FileOutputStream out = new FileOutputStream(file)) { - out.write(authKey.key); - } catch (IOException ignored) { - } - } + public static void main(final String... args) throws Exception { + final TelegramBaseClient client = new TelegramBaseClient( + "auth.key", Integer.parseInt(args[0]), args[1]) {}; - private static AuthKey loadAuthKey(final File file) { - try (final FileInputStream in = new FileInputStream(file)) { - final byte[] key = new byte[256]; - assert in.read(key) == key.length; - return new AuthKey(key); - } catch (IOException ignored) { - return null; - } - } - - public static void main(final String... args) throws IOException, InterruptedException, ExecutionException { - final File authKey = new File("auth.key"); - final MTProtoSender sender = new MTProtoSender(new MTProtoState(loadAuthKey(authKey)), new TcpFull()); try { - sender.connect("149.154.167.91", 443); - saveAuthKey(sender.state.authKey, authKey); - final Future result = sender.send(new Functions.Ping()); - System.out.println(result.get()); + client.connect(); } finally { - sender.disconnect(); + client.disconnect(); } } } diff --git a/lib/src/main/java/io/github/lonamiwebs/overgram/client/TelegramBaseClient.java b/lib/src/main/java/io/github/lonamiwebs/overgram/client/TelegramBaseClient.java new file mode 100644 index 0000000..2cf8423 --- /dev/null +++ b/lib/src/main/java/io/github/lonamiwebs/overgram/client/TelegramBaseClient.java @@ -0,0 +1,90 @@ +package io.github.lonamiwebs.overgram.client; + +import io.github.lonamiwebs.overgram.crypto.AuthKey; +import io.github.lonamiwebs.overgram.network.MTProtoSender; +import io.github.lonamiwebs.overgram.network.MTProtoState; +import io.github.lonamiwebs.overgram.network.connection.Connection; +import io.github.lonamiwebs.overgram.network.connection.TcpFull; +import io.github.lonamiwebs.overgram.session.BinarySession; +import io.github.lonamiwebs.overgram.session.Session; +import io.github.lonamiwebs.overgram.tl.Abstract; +import io.github.lonamiwebs.overgram.tl.Functions; +import io.github.lonamiwebs.overgram.tl.TLRequest; + +import java.io.IOException; +import java.util.concurrent.ExecutionException; +import java.util.concurrent.Future; + +public abstract class TelegramBaseClient { + private final Session session; + private final int apiId; + private final String apiHash; + private final MTProtoSender sender; + private final Functions.InitConnection init; + + public static final int DEFAULT_DC_ID = 4; + public static final String DEFAULT_IPV4_IP = "149.154.167.51"; + public static final String DEFAULT_IPV6_IP = "[2001:67c:4e8:f002::a]"; + public static final int DEFAULT_PORT = 443; + + public TelegramBaseClient(final String session, final int apiId, final String apiHash) { + this(new BinarySession(session), apiId, apiHash, new TcpFull(), new Functions.InitConnection().apiId(apiId) + .deviceModel(String.format("Java %s", + System.getProperty("java.version") + )) + .systemVersion(String.format("%s %s %s", + System.getProperty("os.name"), + System.getProperty("os.version"), + System.getProperty("os.arch") + )) + .appVersion("0.1") + .langCode(System.getProperty("user.language")) + .systemLangCode(System.getProperty("user.language")) + .langPack("")); + } + + public TelegramBaseClient(final Session session, final int apiId, final String apiHash, + final Connection connection, final Functions.InitConnection init) { + session.load(); + this.session = session; + this.apiId = apiId; + this.apiHash = apiHash; + this.init = init; + + final byte[] authKey = session.getAuthKey(session.getDcId()); + this.sender = new MTProtoSender(new MTProtoState( + authKey == null ? null : new AuthKey(authKey)), connection); + } + + public void connect() throws IOException { + String ip = session.getServerAddress(false); + int port = session.getServerPort(); + if (ip == null || ip.isEmpty()) { + ip = DEFAULT_IPV4_IP; + port = DEFAULT_PORT; + } + + sender.connect(ip, port); + session.setAuthKey(DEFAULT_DC_ID, sender.state.authKey.key); + final Future result = sender.send(new Functions.InvokeWithLayer() + .layer(Abstract.LAYER) + .query(init.query(new Functions.help.GetConfig()))); + + try { + result.get(); + } catch (ExecutionException | InterruptedException ignored) { + throw new IOException(); + } + } + + public void disconnect() { + sender.disconnect(); + session.save(); + } + + @SuppressWarnings("unchecked") + public T send(final TLRequest request) throws IOException, InterruptedException, ExecutionException { + final Future result = sender.send(request); + return (T) result.get(); + } +} diff --git a/lib/src/main/java/io/github/lonamiwebs/overgram/client/TelegramClient.java b/lib/src/main/java/io/github/lonamiwebs/overgram/client/TelegramClient.java new file mode 100644 index 0000000..dc36402 --- /dev/null +++ b/lib/src/main/java/io/github/lonamiwebs/overgram/client/TelegramClient.java @@ -0,0 +1,7 @@ +package io.github.lonamiwebs.overgram.client; + +public class TelegramClient extends UserMethods { + public TelegramClient(String session, int apiId, String apiHash) { + super(session, apiId, apiHash); + } +} diff --git a/lib/src/main/java/io/github/lonamiwebs/overgram/client/UserMethods.java b/lib/src/main/java/io/github/lonamiwebs/overgram/client/UserMethods.java new file mode 100644 index 0000000..73a9c04 --- /dev/null +++ b/lib/src/main/java/io/github/lonamiwebs/overgram/client/UserMethods.java @@ -0,0 +1,7 @@ +package io.github.lonamiwebs.overgram.client; + +public abstract class UserMethods extends TelegramBaseClient { + public UserMethods(String session, int apiId, String apiHash) { + super(session, apiId, apiHash); + } +} diff --git a/lib/src/main/java/io/github/lonamiwebs/overgram/session/BinarySession.java b/lib/src/main/java/io/github/lonamiwebs/overgram/session/BinarySession.java new file mode 100644 index 0000000..de34952 --- /dev/null +++ b/lib/src/main/java/io/github/lonamiwebs/overgram/session/BinarySession.java @@ -0,0 +1,74 @@ +package io.github.lonamiwebs.overgram.session; + +import java.io.File; +import java.io.FileInputStream; +import java.io.FileOutputStream; +import java.io.IOException; + +public class BinarySession implements Session { + + protected final File file; + protected byte[] authKey; + protected int dcId; + protected String ip; + protected int port; + + + public BinarySession(final String file) { + this.file = new File(file).getAbsoluteFile(); + } + + @Override + public void load() { + try (final FileInputStream in = new FileInputStream(file)) { + authKey = new byte[256]; + if (in.read(authKey) != authKey.length) { + authKey = null; + } + } catch (IOException ignored) { + } + } + + @Override + public void save() { + if (authKey == null) { + return; + } + try (final FileOutputStream out = new FileOutputStream(file)) { + out.write(authKey); + } catch (IOException ignored) { + } + } + + @Override + public void setPrimaryDc(int dc, String ipv4, String ipv6, int port) { + this.dcId = dc; + this.ip = ipv4; + this.port = port; + } + + @Override + public int getDcId() { + return dcId; + } + + @Override + public String getServerAddress(boolean ipv6) { + return ip; + } + + @Override + public int getServerPort() { + return port; + } + + @Override + public void setAuthKey(int dc, byte[] data) { + this.authKey = data; + } + + @Override + public byte[] getAuthKey(int dc) { + return authKey; + } +} diff --git a/lib/src/main/java/io/github/lonamiwebs/overgram/session/Session.java b/lib/src/main/java/io/github/lonamiwebs/overgram/session/Session.java new file mode 100644 index 0000000..2c3ea96 --- /dev/null +++ b/lib/src/main/java/io/github/lonamiwebs/overgram/session/Session.java @@ -0,0 +1,19 @@ +package io.github.lonamiwebs.overgram.session; + +public interface Session { + void load(); + + void save(); + + void setPrimaryDc(final int dc, final String ipv4, final String ipv6, final int port); + + int getDcId(); + + String getServerAddress(final boolean ipv6); + + int getServerPort(); + + void setAuthKey(final int dc, final byte[] data); + + byte[] getAuthKey(final int dc); +}