package org.elite.jdcbot.examples;
import java.awt.*;
import java.awt.event.*;
import java.io.IOException;
import java.io.OutputStream;
import java.io.PrintStream;
import java.text.*;
import java.util.*;
import javax.swing.*;
import javax.swing.border.*;
import org.elite.jdcbot.framework.User;
public class BotMain extends JFrame implements ActionListener {
private static final long serialVersionUID = 1L;
// GUI
JMenuBar mnuBar = new JMenuBar();
JMenu mnuFile = new JMenu("File");
JMenuItem itemExit = new JMenuItem("Exit");
JMenu mnuHelp = new JMenu("Help");
JMenuItem itemAbout = new JMenuItem("About");
JPanel pnlServer = new JPanel();
JLabel lblServer = new JLabel("Server : Port");
JTextField fieldServerDC = new JTextField("192.168.179.128", 11);
JTextField fieldServerPortDC = new JTextField("411", 3);
JButton btnConnect = new JButton("Connect");
JButton btnDisconnect = new JButton("Disconnect");
JPanel pnlDirectories = new JPanel();
JPanel pnlDir1 = new JPanel();
JLabel lblDir1 = new JLabel("File path: ");
JTextField fieldDir1 = new JTextField("C:/tmp",20);
JPanel pnlDir2 = new JPanel();
JLabel lblDir2 = new JLabel("File path: ");
JTextField fieldDir2 = new JTextField("C:/tmp/Incomplete",20);
JTextArea txtLog = new JTextArea();
JScrollPane scrollPane = new JScrollPane(txtLog);
JPanel pnlUsers = new JPanel();
JTextField fieldUser = new JTextField("njmartinez");
JButton btnGetUserFiles = new JButton("Get user files");
JTextField fieldSearch = new JTextField();
JButton btnSearch = new JButton("Search");
JTextField fieldFile = new JTextField();
JButton btnDownload = new JButton("Download");
JFileChooser chooser = new JFileChooser();
JButton btnAddDir = new JButton("Add directory");
JButton btnExcludeDir = new JButton("Exclude directory");
JButton btnRemoveDir = new JButton("Remove directory");
JButton btnProcessList = new JButton("Process list");
JPanel pnlConfig = new JPanel();
JLabel lblBotName = new JLabel("Bot name");
JTextField fieldBotName = new JTextField("miBot");
JLabel lblBotIp = new JLabel("Bot Ip");
JTextField fieldBotIp = new JTextField("192.168.210.116");
JLabel lblListenPort = new JLabel("Port");
JTextField fieldListenPort = new JTextField("9000");
JLabel lblListenPortUDP = new JLabel("UDP port");
JTextField fieldListenPortUDP = new JTextField("10000");
JLabel lblPassword = new JLabel("Password");
JTextField fieldPassword = new JTextField("");
JLabel lblDescription = new JLabel("Description");
JTextField fieldDescription = new JTextField("Bot de pruebas");
JLabel lblConnectionType = new JLabel("Connection Type");
JTextField fieldConnectionType = new JTextField("ADSL");
JLabel lblEmail = new JLabel("Email");
JTextField fieldEmail = new JTextField("@");
JLabel lblShareSize = new JLabel("Share size");
JTextField fieldShareSize = new JTextField("0");
JLabel lblUploadSlots = new JLabel("Upload slots");
JTextField fieldUploadSlots = new JTextField("2");
JLabel lblDownloadSlots = new JLabel("Download slots");
JTextField fieldDownloadSlots = new JTextField("4");
JLabel lblisPassive = new JLabel("Set mode");
String [] states = {"Active", "Passive"};
JComboBox cmbStates = new JComboBox(states);
JTextField fieldInformation = new JTextField();
// Common
UiLogStream log = new UiLogStream();
// Logic
private BotLogic logic = new BotLogic(log);
public BotMain() {
setTitle("ClienteBot Direct Connect");
setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
setResizable(true);
setJMenuBar(mnuBar);
btnDisconnect.setEnabled(false);
txtLog.setEditable(false);
scrollPane.setPreferredSize(new Dimension(250, 250));
fieldInformation.setEditable(false);
cmbStates.setSelectedIndex(1);
TitledBorder pnlBorderConfig, pnlBorderServ, pnlBorderDir1, pnlBorderDir2;
pnlBorderConfig = BorderFactory.createTitledBorder("Bot configuration");
pnlBorderServ = BorderFactory.createTitledBorder("Quick connect");
pnlBorderDir1 = BorderFactory.createTitledBorder("Config directory");
pnlBorderDir2 = BorderFactory.createTitledBorder("Temporal download directory");
pnlConfig.setBorder(pnlBorderConfig);
pnlServer.setBorder(pnlBorderServ);
pnlDir1.setBorder(pnlBorderDir1);
pnlDir2.setBorder(pnlBorderDir2);
JPanel pnlGeneral = (JPanel) this.getContentPane();
mnuBar.add(mnuFile);
mnuFile.add(itemExit);
mnuBar.add(mnuHelp);
mnuHelp.add(itemAbout);
pnlServer.add(lblServer);
pnlServer.add(fieldServerDC);
pnlServer.add(fieldServerPortDC);
pnlServer.add(btnConnect);
pnlServer.add(btnDisconnect);
pnlDir1.add(lblDir1);
pnlDir1.add(fieldDir1);
pnlDir2.add(lblDir2);
pnlDir2.add(fieldDir2);
pnlDirectories.add(pnlDir1);
pnlDirectories.add(pnlDir2);
JTabbedPane tabbedPaneS = new JTabbedPane();
tabbedPaneS.addTab("Server", pnlServer);
tabbedPaneS.addTab("Directories", pnlDirectories);
pnlUsers.setLayout(new GridLayout(0, 2));
pnlUsers.add(fieldUser);
pnlUsers.add(btnGetUserFiles);
pnlUsers.add(fieldSearch);
pnlUsers.add(btnSearch);
pnlUsers.add(fieldFile);
pnlUsers.add(btnDownload);
pnlUsers.add(btnAddDir);
pnlUsers.add(btnExcludeDir);
pnlUsers.add(btnRemoveDir);
pnlUsers.add(btnProcessList);
pnlConfig.setLayout(new GridLayout(0, 2));
pnlConfig.add(lblBotName);
pnlConfig.add(fieldBotName);
pnlConfig.add(lblBotIp);
pnlConfig.add(fieldBotIp);
pnlConfig.add(lblListenPort);
pnlConfig.add(fieldListenPort);
pnlConfig.add(lblListenPortUDP);
pnlConfig.add(fieldListenPortUDP);
pnlConfig.add(lblPassword);
pnlConfig.add(fieldPassword);
pnlConfig.add(lblDescription);
pnlConfig.add(fieldDescription);
pnlConfig.add(lblConnectionType);
pnlConfig.add(fieldConnectionType);
pnlConfig.add(lblEmail);
pnlConfig.add(fieldEmail);
pnlConfig.add(lblShareSize);
pnlConfig.add(fieldShareSize);
pnlConfig.add(lblUploadSlots);
pnlConfig.add(fieldUploadSlots);
pnlConfig.add(lblDownloadSlots);
pnlConfig.add(fieldDownloadSlots);
pnlConfig.add(lblisPassive);
pnlConfig.add(cmbStates);
JTabbedPane tabbedPane = new JTabbedPane();
tabbedPane.addTab("Actions", pnlUsers);
tabbedPane.addTab("Log", scrollPane);
pnlGeneral.add("North", tabbedPaneS);
pnlGeneral.add("Center", tabbedPane);
pnlGeneral.add("West", pnlConfig);
pnlGeneral.add("South", fieldInformation);
setContentPane(pnlGeneral);
pack();
itemExit.addActionListener(this);
btnConnect.addActionListener(this);
btnDisconnect.addActionListener(this);
btnGetUserFiles.addActionListener(this);
btnSearch.addActionListener(this);
btnDownload.addActionListener(this);
btnAddDir.addActionListener(this);
btnExcludeDir.addActionListener(this);
btnRemoveDir.addActionListener(this);
btnProcessList.addActionListener(this);
chooser.setCurrentDirectory(new java.io.File("."));
chooser.setFileSelectionMode(JFileChooser.DIRECTORIES_ONLY);
chooser.setAcceptAllFileFilterUsed(false);
}
/**
* Handles the buttons' actions.
*/
public void actionPerformed(ActionEvent ae) {
SimpleDateFormat formatter = new SimpleDateFormat("hh:mm:ss");
Calendar calendarNow = Calendar.getInstance();
if(ae.getSource() == itemExit){
if(btnDisconnect.isEnabled()){
logic.disconnect();
}
System.exit(0);
}
else if (ae.getSource() == btnConnect) {
boolean isActive = false;
if(cmbStates.getSelectedItem() == "Active"){
isActive = true;
}
else if (cmbStates.getSelectedItem() == "Passive"){
isActive = false;
}
logic.configBot(fieldBotName.getText(), fieldBotIp.getText(),
Integer.parseInt(fieldListenPort.getText()),
Integer.parseInt(fieldListenPortUDP.getText()),
fieldPassword.getText(), fieldDescription.getText(),
fieldConnectionType.getText() + User.NORMAL_FLAG,
fieldEmail.getText(), fieldShareSize.getText(),
Integer.parseInt(fieldUploadSlots.getText()),
Integer.parseInt(fieldDownloadSlots.getText()),
isActive, fieldDir1.getText(), fieldDir2.getText());
if (logic.connect(fieldServerDC.getText(), Integer.parseInt(fieldServerPortDC.getText()))) {
btnConnect.setEnabled(false);
btnDisconnect.setEnabled(true);
log.println(formatter.format(calendarNow.getTime()) + ": Is connected now");
fieldInformation.setText("Connected");
}
} else if (ae.getSource() == btnDisconnect) {
logic.disconnect();
btnConnect.setEnabled(true);
btnDisconnect.setEnabled(false);
log.println(formatter.format(calendarNow.getTime()) + ": Is disconnected now");
fieldInformation.setText("Disconnected");
} else if (ae.getSource() == btnGetUserFiles) {
logic.readFiles(fieldUser.getText());
log.println(formatter.format(calendarNow.getTime()) + ": Get user files finished");
fieldInformation.setText("Get user files finished");
} else if (ae.getSource() == btnSearch) {
String searchText = fieldSearch.getText();
if (searchText.isEmpty()) {
fieldInformation.setText("Enter a word to start searching");
} else {
logic.search(searchText);
log.println(formatter.format(calendarNow.getTime()) + ": Search finished");
fieldInformation.setText("Search finished");
}
} else if (ae.getSource()==btnDownload){
logic.downloadFile(fieldFile.getText());
log.println(formatter.format(calendarNow.getTime()) + ": Starting download process");
fieldInformation.setText("Processing a download");
}else if(ae.getSource() == btnAddDir){
int selection = chooser.showOpenDialog(this);
if (selection == JFileChooser.APPROVE_OPTION) {
String directory = chooser.getSelectedFile().toString();
logic.addDirectory(directory);
JOptionPane.showMessageDialog(getRootPane(), "This folder has been added to the list:\n" + directory);
log.println(formatter.format(calendarNow.getTime())+": This folder has been added to the list: "+ directory);
fieldInformation.setText("Folder adicionado");
}
} else if(ae.getSource() == btnExcludeDir){
int selection = chooser.showOpenDialog(this);
if (selection == JFileChooser.APPROVE_OPTION) {
String directory = chooser.getSelectedFile().toString();
logic.excludeDirectory(directory);
JOptionPane.showMessageDialog(getRootPane(), "This folder has beend excluded from the list:\n" + directory);
log.println(formatter.format(calendarNow.getTime())+": This folder has beend excluded from the list: "+ directory);
fieldInformation.setText("Folder excluido");
}
} else if(ae.getSource() == btnRemoveDir){
int selection = chooser.showOpenDialog(this);
if (selection == JFileChooser.APPROVE_OPTION) {
String directory = chooser.getSelectedFile().toString();
logic.removeDirectory(directory);
JOptionPane.showMessageDialog(getRootPane(), "This folder has been removed from the list:\n" + directory);
log.println(formatter.format(calendarNow.getTime())+": This folder has been removed from the list: "+ directory);
fieldInformation.setText("Folder retirado");
}
} else if(ae.getSource() == btnProcessList){
logic.processList();
JOptionPane.showMessageDialog(getRootPane(), "The list has been processed");
log.println(formatter.format(calendarNow.getTime())+": The list has been updated");
fieldInformation.setText("List updated");
}
}
private class UiLogStream extends PrintStream {
public UiLogStream() {
super(new OutputStream() {
StringBuffer buffer = new StringBuffer();
@Override
public synchronized void write(int ch) throws IOException {
buffer.append((char) ch);
}
@Override
public synchronized void flush() {
txtLog.append(buffer.toString());
buffer = new StringBuffer();
}
}, true);
}
}
// main
public static void main(String[] args) {
try {
UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
} catch (Exception e) {
e.printStackTrace();
}
BotMain clienteBot = new BotMain();
clienteBot.setVisible(true);
}
}