Mercury-IM/cli/src/main/java/org/mercury_im/messenger/cli/MercuryCli.java

132 lines
3.8 KiB
Java

package org.mercury_im.messenger.cli;
import org.jivesoftware.smack.util.StringUtils;
import org.jxmpp.jid.DomainBareJid;
import org.jxmpp.jid.EntityBareJid;
import org.jxmpp.jid.impl.JidCreate;
import org.jxmpp.jid.parts.Localpart;
import org.jxmpp.stringprep.XmppStringprepException;
import org.mercury_im.messenger.cli.di.component.CliComponent;
import org.mercury_im.messenger.cli.di.component.DaggerCliComponent;
import org.mercury_im.messenger.core.Messenger;
import org.mercury_im.messenger.core.viewmodel.accounts.LoginViewModel;
import org.mercury_im.messenger.core.xmpp.MercuryConnection;
import java.util.List;
import javax.inject.Inject;
import io.reactivex.disposables.Disposable;
public class MercuryCli {
private final UserInterface userInterface;
Disposable connectionStateDisposable;
@Inject
Messenger messenger;
@Inject
LoginViewModel loginViewModel;
public static void main(String[] args) {
MercuryCli cli = new MercuryCli();
cli.loginDialog();
System.out.println("Login successful.");
cli.loop();
}
/**
* Create the Dependency Injection graph.
*/
public CliComponent createCliComponent() {
CliComponent cliComponent = DaggerCliComponent.builder()
.build();
cliComponent.inject(this);
return cliComponent;
}
public MercuryCli() {
createCliComponent();
userInterface = ConsoleUserInterface.isSupported() ? new ConsoleUserInterface() : new ScannerUserInterface();
}
private void loginDialog() {
System.out.println("Format is 'Username'@'Service'.");
String username = promptForUsername();
DomainBareJid service = promptForServiceDomain();
String password = promptForPassword();
EntityBareJid jid = JidCreate.entityBareFrom(Localpart.formUnescapedOrNull(username), service);
loginViewModel.onLoginUsernameChanged(jid.toString());
loginViewModel.onLoginPasswordChanged(password);
loginViewModel.login();
}
private String promptForPassword() {
System.out.println("Enter password:");
String password = userInterface.readPassword();
if (StringUtils.isNullOrEmpty(password)) {
System.out.println("Password too short.");
return promptForPassword();
}
return password;
}
private DomainBareJid promptForServiceDomain() {
System.out.println("Enter service:");
String service = userInterface.readText();
try {
return JidCreate.domainBareFrom(service);
} catch (XmppStringprepException e) {
System.out.println("Invalid service domain.");
return promptForServiceDomain();
}
}
private String promptForUsername() {
System.out.println("Please enter username:");
String username = userInterface.readText();
try {
Localpart.from(username);
} catch (XmppStringprepException e) {
System.out.println("Invalid username.");
return promptForUsername();
}
return username;
}
private void loop() {
String input = userInterface.readText();
if (StringUtils.isNullOrEmpty(input)) {
loop();
return;
}
String[] command = input.split(" ");
switch (command[0]) {
case "/exit":
System.out.println("Shutting down.");
messenger.getConnectionManager().doShutdownAllConnections();
connectionStateDisposable.dispose();
return;
case "/contacts":
List<MercuryConnection> connectionList = messenger.getConnectionManager().getConnections();
break;
case "/msg":
break;
}
loop();
}
}