From db8ed70f8dd9a558cfc11fd647c9e0c315d21279 Mon Sep 17 00:00:00 2001 From: xitiomet Date: Thu, 1 Dec 2011 02:39:26 -0500 Subject: [PATCH] Overhaul --- Makefile | 2 +- client.sh | 2 + lib/placebohttp.jar | Bin 112659 -> 114559 bytes src/org/openstatic/irc/GatewayConnection.java | 6 +- src/org/openstatic/irc/IRCMessage.java | 92 +++++- .../openstatic/irc/IRCMessageListener.java | 7 + src/org/openstatic/irc/IRCResponse.java | 153 ++++++++++ src/org/openstatic/irc/IrcChannel.java | 2 +- src/org/openstatic/irc/IrcServer.java | 41 ++- src/org/openstatic/irc/IrcUser.java | 44 ++- .../openstatic/irc/client/O5ChatPanel.java | 107 +++++++ src/org/openstatic/irc/client/O5Client.java | 263 ++++++++++++++++++ .../openstatic/irc/client/O5Connection.java | 163 +++++++++++ .../openstatic/irc/client/O5ServerPanel.java | 117 ++++++++ .../openstatic/irc/gateways/APIGateway.java | 63 ++++- .../irc/gateways/APIGatewayConnection.java | 98 +++++-- .../irc/gateways/CLIGatewayConnection.java | 17 +- .../irc/gateways/IrcGatewayConnection.java | 13 +- .../irc/gateways/WebGatewayConnection.java | 41 +-- 19 files changed, 1146 insertions(+), 85 deletions(-) create mode 100755 client.sh create mode 100755 src/org/openstatic/irc/IRCMessageListener.java create mode 100644 src/org/openstatic/irc/IRCResponse.java create mode 100644 src/org/openstatic/irc/client/O5ChatPanel.java create mode 100644 src/org/openstatic/irc/client/O5Client.java create mode 100644 src/org/openstatic/irc/client/O5Connection.java create mode 100644 src/org/openstatic/irc/client/O5ServerPanel.java diff --git a/Makefile b/Makefile index eb25dec..6813e34 100755 --- a/Makefile +++ b/Makefile @@ -12,7 +12,7 @@ all: ircd jvm: mkdir jvm-build - javac -cp lib/json-gcj.jar:lib/placebohttp.jar:lib/smack.jar -d jvm-build src/org/openstatic/*.java src/org/openstatic/irc/*.java src/org/openstatic/irc/gateways/*.java src/org/openstatic/irc/middleware/*.java + javac -cp lib/json-gcj.jar:lib/placebohttp.jar:lib/smack.jar -d jvm-build src/org/openstatic/*.java src/org/openstatic/irc/*.java src/org/openstatic/irc/gateways/*.java src/org/openstatic/irc/middleware/*.java src/org/openstatic/irc/client/*.java jar -cvmf res/manifest.mf o5ircd.jar -C jvm-build org -C res www # Executable Rule for GCJ diff --git a/client.sh b/client.sh new file mode 100755 index 0000000..390d6b9 --- /dev/null +++ b/client.sh @@ -0,0 +1,2 @@ +#!/bin/bash +java -cp lib/json-gcj.jar:lib/placebohttp.jar:lib/smack.jar:o5ircd.jar org.openstatic.irc.client.O5Client $@ diff --git a/lib/placebohttp.jar b/lib/placebohttp.jar index 31d9592a83f742948a0dd7aa16f36ac47412aa9a..990214ab6d0eb3e20a4de7070c7321c1e7d6c959 100644 GIT binary patch delta 13004 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 delta 11149 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 args; protected Vector destination; + protected JSONObject meta; + public static final int PRIVMSG = 100; + public static final int MODE = 101; + public static final int JOIN = 102; + public static final int PART = 103; + public static final int INVITE = 104; + public static final int TOPIC = 105; + public static final int LIST = 106; + public static final int WHOIS = 107; + public static final int USER = 108; + public static final int NICK = 109; + public static final int WHO = 110; + public static final int AWAY = 111; + public static final int QUIT = 112; + public static final int NOTICE = 113; + public static final int PONG = 114; + public static final int ISON = 115; + public static final int PING = 116; // constructor public IRCMessage(String line) @@ -27,15 +45,25 @@ public IRCMessage(String line) this.args = doArgs(cmdArray,1); } } + + public IRCMessage(int command) + { + this.cmd = getCommand(command); + this.args = new Vector(); + this.destination = null; + } public IRCMessage(JSONObject job) throws JSONException { - this.source = job.getString("source"); + if (job.has("source")) + this.source = job.getString("source"); + if (job.has("meta")) + this.meta = job.getJSONObject("meta"); this.cmd = job.getString("command"); this.args = new Vector(); - if (job.has("args")) + if (job.has("data")) { - JSONArray arguments = job.getJSONArray("args"); + JSONArray arguments = job.getJSONArray("data"); for (int a = 0; a < arguments.length(); a++) { String c_arg = arguments.getString(a); @@ -106,6 +134,47 @@ public void clearArgs() this.args = new Vector(); } + public static String getCommand(int command) + { + if (command == PRIVMSG) + { + return "PRIVMSG"; + } else if (command == MODE) { + return "MODE"; + } else if (command == JOIN) { + return "JOIN"; + } else if (command == PART) { + return "PART"; + } else if (command == INVITE) { + return "INVITE"; + } else if (command == TOPIC) { + return "TOPIC"; + } else if (command == LIST) { + return "LIST"; + } else if (command == WHOIS) { + return "WHOIS"; + } else if (command == USER) { + return "USER"; + } else if (command == NICK) { + return "NICK"; + } else if (command == WHO) { + return "WHO"; + } else if (command == AWAY) { + return "AWAY"; + } else if (command == QUIT) { + return "QUIT"; + } else if (command == NOTICE) { + return "NOTICE"; + } else if (command == PONG) { + return "PONG"; + } else if (command == ISON) { + return "ISON"; + } else if (command == PING) { + return "PING"; + } else { + return null; + } + } // process that funny argument layout private Vector doArgs(String[] ary, int start) @@ -245,8 +314,8 @@ public String getEchoResponse() { return this.toString(); } - - public String toString() + + public String getData() { StringBuffer args_string = new StringBuffer(""); for (Enumeration e = args.elements(); e.hasMoreElements(); ) @@ -262,7 +331,12 @@ public String toString() args_string.append(" "); } } - return this.cmd + " " + args_string.toString(); + return args_string.toString(); + } + + public String toString() + { + return this.cmd + " " + this.getData(); } // check to see if a command matches a string @@ -324,7 +398,9 @@ public JSONObject toJSONObject() job.put("destination", this.destination); } job.put("command", this.getCommand()); - job.put("args", this.args); + if (this.meta != null) + job.put("meta", this.meta); + job.put("data", this.args); } catch (Exception e) {} return job; } @@ -335,4 +411,4 @@ public static IRCMessage prepare(String cmd) newm.setCommand(cmd); return newm; } -} \ No newline at end of file +} diff --git a/src/org/openstatic/irc/IRCMessageListener.java b/src/org/openstatic/irc/IRCMessageListener.java new file mode 100755 index 0000000..7801edd --- /dev/null +++ b/src/org/openstatic/irc/IRCMessageListener.java @@ -0,0 +1,7 @@ +package org.openstatic.irc; + +public interface IRCMessageListener +{ + public void onIRCMessage(IRCMessage message, Object source); + public void onIRCResponse(IRCResponse response, Object source); +} diff --git a/src/org/openstatic/irc/IRCResponse.java b/src/org/openstatic/irc/IRCResponse.java new file mode 100644 index 0000000..dbb59f7 --- /dev/null +++ b/src/org/openstatic/irc/IRCResponse.java @@ -0,0 +1,153 @@ +package org.openstatic.irc; + +import java.util.Vector; +import java.util.Enumeration; +import org.json.*; + +public class IRCResponse +{ + private String response_code; + private String server_host; + private String target_nick; + private Vector args; + + public IRCResponse(String line) + { + String[] cmdArray = line.split(" "); + if (cmdArray[0].startsWith(":")) + { + this.server_host = cmdArray[0].substring(1); + this.response_code = cmdArray[1]; + this.args = doArgs(cmdArray,2); + } else { + this.response_code = cmdArray[0]; + this.args = doArgs(cmdArray, 1); + } + } + + public IRCResponse(String resp_code, String data) + { + this.response_code = resp_code; + String[] data_array = data.split(" "); + this.args = doArgs(data_array, 0); + } + + public IRCResponse(JSONObject job) throws JSONException + { + this.args = new Vector(); + this.response_code = job.getString("response"); + if (job.has("data")) + { + JSONArray arguments = job.getJSONArray("data"); + for (int a = 0; a < arguments.length(); a++) + { + String c_arg = arguments.getString(a); + this.args.add(c_arg); + } + } + } + + // add arg for command handler recreation + public void addArg(String value) + { + this.args.add(value); + } + + public void clearArgs() + { + this.args = new Vector(); + } + + + // process that funny argument layout + private Vector doArgs(String[] ary, int start) + { + Vector return_vector = new Vector(); + for (int i = start; i < ary.length; i++) + { + if (ary[i].startsWith(":")) + { + StringBuffer lastarg = new StringBuffer(ary[i].substring(1)); + i++; + while (i < ary.length) + { + lastarg.append(" " + ary[i]); + i++; + } + return_vector.add(lastarg.toString()); + } else { + return_vector.add(ary[i]); + } + } + return return_vector; + } + + // check to see if a command matches a string + public boolean is(String text) + { + if (this.response_code.equals(text)) + { + return true; + } else { + return false; + } + } + + // retrieve the arguments by index to a command + public String getArg(int index) + { + try + { + return this.args.elementAt(index); + } catch (Exception e) { + return null; + } + } + + public Vector getArgs() + { + return this.args; + } + + public String getResponseCode() + { + return this.response_code; + } + + public String getData() + { + StringBuffer args_string = new StringBuffer(); + for (Enumeration e = args.elements(); e.hasMoreElements(); ) + { + String ca = e.nextElement(); + if (ca.contains(" ")) + { + ca = ":" + ca; + } + args_string.append(ca); + if (e.hasMoreElements()) + { + args_string.append(" "); + } + } + return args_string.toString(); + } + + public JSONObject toJSONObject() + { + JSONObject job = new JSONObject(); + try + { + job.put("response", this.response_code); + job.put("data", this.args); + } catch (Exception e) {} + return job; + } + + public String toString() + { + + return this.response_code + " " + this.getData(); + } + +} diff --git a/src/org/openstatic/irc/IrcChannel.java b/src/org/openstatic/irc/IrcChannel.java index 74be708..876fc54 100755 --- a/src/org/openstatic/irc/IrcChannel.java +++ b/src/org/openstatic/irc/IrcChannel.java @@ -358,7 +358,7 @@ public void onCommand(IRCMessage receivedCommand) IRCMessage outbound_message = receivedCommand; if (receivedCommand.getArg(0).equals(this.channel_name)) { - broadcast(outbound_message, false); + broadcast(outbound_message, u.shouldEcho()); } else { IrcUser intended_target = findMember(receivedCommand.getArg(0)); if (intended_target != null) diff --git a/src/org/openstatic/irc/IrcServer.java b/src/org/openstatic/irc/IrcServer.java index cc91c28..ebfdc90 100755 --- a/src/org/openstatic/irc/IrcServer.java +++ b/src/org/openstatic/irc/IrcServer.java @@ -1,5 +1,6 @@ package org.openstatic.irc; +import java.net.InetAddress; import java.util.Date; import java.util.Vector; import java.util.Enumeration; @@ -21,6 +22,7 @@ public class IrcServer extends Thread private int minute_tracker; private Vector motd; private long boot_time; + private String server_name; public IrcServer() { @@ -32,6 +34,13 @@ public IrcServer() this.keep_running = true; this.motd = null; this.boot_time = 0; + try + { + InetAddress addr = InetAddress.getLocalHost(); + this.server_name = addr.getHostName(); + } catch (Exception e) { + this.server_name = "localhost"; + } } public void run() @@ -42,7 +51,7 @@ public void run() Gateway gate = e.nextElement(); gate.initGateway(this); } - log("SERVER", 1, "Completed Init Gateway"); + log(this.server_name, 1, "Completed Init Gateway"); while (this.keep_running) { try @@ -56,22 +65,22 @@ public void run() Thread.sleep(1000); } catch (Exception z) {} } - log("SERVER", 1, "Full Shutdown, killing gateways"); + log(this.server_name, 1, "Full Shutdown, killing gateways"); for(Enumeration e2 = gateways.elements(); e2.hasMoreElements(); ) { Gateway gate = e2.nextElement(); gate.shutdownGateway(); } - log("SERVER", 1, "Gatway Shutdown Complete!"); + log(this.server_name, 1, "Gatway Shutdown Complete!"); - log("SERVER", 1, "Killing User Connections"); + log(this.server_name, 1, "Killing User Connections"); for(Enumeration e3 = users.elements(); e3.hasMoreElements(); ) { IrcUser cu = e3.nextElement(); cu.disconnect(); } - log("SERVER", 1, "Detaching Channels and Shutting Down Middleware"); + log(this.server_name, 1, "Detaching Channels and Shutting Down Middleware"); for(Enumeration e4 = rooms.elements(); e4.hasMoreElements(); ) { IrcChannel cc = e4.nextElement(); @@ -86,7 +95,7 @@ public String getBootTime() public void addGateway(Gateway g) { - log("SERVER", 1, "Gateway Added \"" + g.toString() + "\""); + log(this.server_name, 1, "Gateway Added \"" + g.toString() + "\""); gateways.add(g); } @@ -94,6 +103,11 @@ public void setDebug(int value) { this.debug_mode = value; } + + public void setServerName(String value) + { + this.server_name = value; + } public int getDebug() { @@ -165,7 +179,7 @@ public void removeUser(IrcUser conn) IrcChannel chan = e.nextElement(); chan.removeMember(conn); } - log("SERVER", 1, "Connection Removed \"" + conn.toString() + "\""); + log(this.server_name, 1, "Connection Removed \"" + conn.toString() + "\""); } } @@ -211,7 +225,7 @@ public void removeChannel(IrcChannel chan) if (idx != -1) { rooms.remove(idx); - log("SERVER", 1, "Channel Removed \"" + chan.toString() + "\""); + log(this.server_name, 1, "Channel Removed \"" + chan.toString() + "\""); } } @@ -229,7 +243,7 @@ public void setMotd(File motd_file) br = new BufferedReader(new FileReader(motd_file)); while ((thisLine = br.readLine()) != null) this.motd.add(thisLine); - log("SERVER", 1, "Loaded MOTD from file \"" + motd_file.toString() + "\""); + log(this.server_name, 1, "Loaded MOTD from file \"" + motd_file.toString() + "\""); } catch (Exception ioe) { // who cares } finally { @@ -255,7 +269,7 @@ public Vector getMotd() public void addChannel(IrcChannel chan) { this.rooms.add(chan); - log("SERVER", 1, "Channel Added \"" + chan.getName() + "\""); + log(this.server_name, 1, "Channel Added \"" + chan.getName() + "\""); } public Vector getChannels() @@ -267,9 +281,14 @@ public Vector getUsers() { return this.users; } + + public String getServerName() + { + return this.server_name; + } public void shutdown() { this.keep_running = false; } -} \ No newline at end of file +} diff --git a/src/org/openstatic/irc/IrcUser.java b/src/org/openstatic/irc/IrcUser.java index 37cbb38..c19d96a 100755 --- a/src/org/openstatic/irc/IrcUser.java +++ b/src/org/openstatic/irc/IrcUser.java @@ -15,6 +15,7 @@ public class IrcUser extends Thread private boolean welcomed; private int idle_time; private boolean stay_connected; + private boolean echo_back; private IrcServer server; private GatewayConnection connection; @@ -26,6 +27,7 @@ public IrcUser(IrcServer server) this.away_message = null; this.welcomed = false; this.server = server; + this.echo_back = false; } public void initGatewayConnection(GatewayConnection connection) @@ -50,6 +52,16 @@ public void run() this.server.log(this.connection.getClientHostname(), 1, "IrcUser Class initGatewayConnection()"); } + public void setEcho(boolean echo) + { + this.echo_back = echo; + } + + public boolean shouldEcho() + { + return this.echo_back; + } + public void disconnect() { this.server.log(this.username, 1, "IrcUser Class " + this.nickname + " disconnect()"); @@ -230,7 +242,10 @@ public void onGatewayCommand(IRCMessage cmd) { sendResponse("301", possible_target2.getNick() + " :" + possible_target2.getAway()); } - possible_target2.sendCommand(new IRCMessage(cmd, this)); + IRCMessage out_message = new IRCMessage(cmd, this); + possible_target2.sendCommand(out_message); + if (this.shouldEcho()) + this.sendCommand(out_message); } else { sendResponse("401", cmd.getArg(0) + " :No such nick/channel"); } @@ -350,6 +365,24 @@ public String getNick() { return this.nickname; } + + public String getPassword() + { + return this.password; + } + + public boolean checkPassword(String pass) + { + if (pass != null) + { + if (pass.equals(this.password)) + return true; + else + return false; + } else { + return false; + } + } public String getAway() { @@ -397,10 +430,15 @@ public void sendCommand(IRCMessage pc) { this.connection.sendCommand(pc); } + + public void sendResponse(String resp_code, String data) + { + this.connection.sendResponse(new IRCResponse(resp_code, data)); + } - public void sendResponse(String response, String args) + public void sendResponse(IRCResponse response) { - this.connection.sendResponse(response, args); + this.connection.sendResponse(response); } private void processUser(Vector args) diff --git a/src/org/openstatic/irc/client/O5ChatPanel.java b/src/org/openstatic/irc/client/O5ChatPanel.java new file mode 100644 index 0000000..740c3b6 --- /dev/null +++ b/src/org/openstatic/irc/client/O5ChatPanel.java @@ -0,0 +1,107 @@ +package org.openstatic.irc.client; + +import javax.swing.JPanel; +import javax.swing.JTextPane; +import javax.swing.JTextField; +import javax.swing.JScrollPane; +import javax.swing.ScrollPaneConstants; +import javax.swing.text.Document; + +import java.awt.BorderLayout; +import java.awt.Font; +import java.awt.Color; +import java.awt.Component; +import java.awt.Graphics; +import java.awt.event.ActionEvent; +import java.awt.event.ActionListener; + +import java.io.ByteArrayOutputStream; +import java.io.InputStream; +import java.io.BufferedInputStream; +import java.io.PrintStream; +import java.io.BufferedReader; +import java.io.InputStreamReader; +import java.io.OutputStreamWriter; + +import java.net.URL; +import java.net.URLEncoder; +import java.net.HttpURLConnection; + +import org.json.*; +import org.openstatic.irc.IRCMessage; + +public class O5ChatPanel extends JPanel implements ActionListener +{ + private JTextPane chat_box; + private JTextField chat_input; + private StringBuffer chat_buffer; + private String nickname; + private O5Connection connection; + + public O5ChatPanel(O5Connection oc, String nickname) + { + super(new BorderLayout()); + this.connection = oc; + this.chat_buffer = new StringBuffer(); + this.nickname = nickname; + chat_box = new JTextPane(); + chat_box.setContentType("text/html"); + chat_box.setEditable(false); + Font font = new Font("Monospaced", Font.BOLD, 14); + chat_box.setBackground(Color.WHITE); + chat_box.setFont(font); + chat_box.setForeground(Color.BLACK); + chat_box.setText(""); + JScrollPane scroller = new JScrollPane(chat_box); + scroller.setVerticalScrollBarPolicy(ScrollPaneConstants.VERTICAL_SCROLLBAR_ALWAYS); + + chat_input = new JTextField(255); + chat_input.setBackground(Color.WHITE); + chat_input.setFont(font); + chat_input.setForeground(Color.BLACK); + chat_input.addActionListener(this); + JPanel page_start = new JPanel(new BorderLayout()); + + this.add(scroller, BorderLayout.CENTER); + this.add(chat_input, BorderLayout.PAGE_END); + } + + public void handleMessage(IRCMessage im) + { + if (im.getSourceNick().equals(nickname)) + addText(im.getSourceNick(), "#880000", im.getArgs().lastElement()); + else + addText(im.getSourceNick(), "#000088", im.getArgs().lastElement()); + } + + public void addText(String user, String color, String message) + { + chat_buffer.append("" + user + ": " + message + "
"); + chat_box.setText("" + chat_buffer.toString() + ""); + Document d = chat_box.getDocument(); + chat_box.select(d.getLength(), d.getLength()); + } + + public void actionPerformed(ActionEvent e) + { + final ActionEvent x = e; + Thread t = new Thread() + { + public void run() + { + try + { + IRCMessage im = new IRCMessage(IRCMessage.PRIVMSG); + im.addArg(O5ChatPanel.this.nickname); + im.addArg(chat_input.getText()); + O5ChatPanel.this.connection.sendIRCMessage(im); + chat_input.setText(""); + } catch (Exception e) { + + } + } + + }; + t.start(); + } +} diff --git a/src/org/openstatic/irc/client/O5Client.java b/src/org/openstatic/irc/client/O5Client.java new file mode 100644 index 0000000..c8ccaa2 --- /dev/null +++ b/src/org/openstatic/irc/client/O5Client.java @@ -0,0 +1,263 @@ +/* + Copyright (C) 2010 Brian Dunigan + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . +*/ + +package org.openstatic.irc.client; + +import javax.swing.JFrame; +import javax.swing.JList; +import javax.swing.DefaultListModel; +import javax.swing.JLabel; +import javax.swing.JPanel; +import javax.swing.JButton; +import javax.swing.JCheckBox; +import javax.swing.JTextField; +import javax.swing.JTextArea; +import javax.swing.JTextPane; +import javax.swing.JScrollPane; +import javax.swing.ScrollPaneConstants; +import javax.imageio.ImageIO; +import java.awt.BorderLayout; +import java.awt.GridLayout; +import java.awt.Toolkit; +import java.awt.Dimension; +import java.awt.event.ActionEvent; +import java.awt.event.ActionListener; +import java.awt.event.WindowEvent; +import java.awt.image.BufferedImage; +import javax.swing.JTabbedPane; +import java.awt.Font; +import java.awt.Color; +import java.awt.Component; +import java.awt.Graphics; + +import java.util.Hashtable; +import java.util.Enumeration; +import java.util.Properties; + +import org.json.*; + +import org.openstatic.irc.IRCMessage; +import org.openstatic.irc.IRCResponse; +import org.openstatic.irc.IRCMessageListener; + +public class O5Client extends JFrame implements ActionListener, IRCMessageListener +{ + private JTabbedPane tabbed; + private JTextField server_field; + private JTextField username_field; + private JTextField password_field; + private Hashtable chat_panels; + private Hashtable server_panels; + private JButton login_btn; + private String token_id; + + public static void main(String[] args) + { + O5Client o5 = new O5Client(); + } + + public O5Client() + { + super("O5 IRC"); + this.chat_panels = new Hashtable(); + this.server_panels = new Hashtable(); + this.token_id = null; + this.addWindowListener(new java.awt.event.WindowAdapter() + { + public void windowClosing(WindowEvent winEvt) + { + System.exit(0); + } + }); + this.tabbed = new JTabbedPane(); + + JPanel main_pane = new JPanel(); + main_pane.setLayout(new BorderLayout()); + // Setup tab + JPanel pane = new JPanel(new GridLayout(0,2,6,6)); + pane.setSize(50,100); + + JLabel server_label = new JLabel("Server:", JLabel.TRAILING); + server_field = new JTextField(15); + server_field.setText("127.0.0.1:4050"); + + JLabel username_label = new JLabel("Username:", JLabel.TRAILING); + username_field = new JTextField(15); + + JLabel password_label = new JLabel("Password:", JLabel.TRAILING); + password_field = new JTextField(15); + + login_btn = new JButton("Connect"); + login_btn.setActionCommand("login"); + login_btn.addActionListener(this); + + pane.add(server_label); + pane.add(server_field); + + pane.add(username_label); + pane.add(username_field); + + pane.add(password_label); + pane.add(password_field); + + pane.add(new JLabel("")); + pane.add(login_btn); + + JPanel page_start = new JPanel(new BorderLayout()); + + JLabel page_header = new JLabel("O5 Client"); + page_header.setFont(new Font("Monospaced", Font.BOLD, 36)); + + page_start.add(page_header, BorderLayout.PAGE_START); + page_start.add(pane, BorderLayout.PAGE_END); + + main_pane.add(page_start, BorderLayout.PAGE_START); + + tabbed.addTab("Connect", null, main_pane, ""); + + // finish window + this.add(tabbed); + centerWindow(); + this.setVisible(true); + } + + public void centerWindow() + { + Toolkit tk = Toolkit.getDefaultToolkit(); + Dimension screenSize = tk.getScreenSize(); + final int WIDTH = screenSize.width; + final int HEIGHT = screenSize.height; + this.setSize(520, 340); + this.setLocation(WIDTH / 4 - 260, HEIGHT / 2 - 170); + } + + public boolean isCentered() + { + Toolkit tk = Toolkit.getDefaultToolkit(); + Dimension screenSize = tk.getScreenSize(); + final int WIDTH = screenSize.width; + final int HEIGHT = screenSize.height; + if (this.getX() == ((WIDTH / 2) - (this.getWidth() / 2)) && this.getY() == ((HEIGHT / 2) - (this.getHeight() / 2))) + { + return true; + } else { + return false; + } + } + + public void addPanel(String panel_caption, Component panel) + { + final JPanel plugin_pane = new JPanel(new BorderLayout()); + plugin_pane.add(panel, BorderLayout.CENTER); + plugin_pane.setForeground(Color.WHITE); + plugin_pane.setBackground(Color.GRAY); + JButton close_button = new JButton("Close Tab"); + close_button.addActionListener(new ActionListener(){ + public void actionPerformed(ActionEvent e) + { + tabbed.remove(plugin_pane); + } + }); + + + /* + JPanel sub_layout = new JPanel(new BorderLayout()) + { + public void paintComponent(Graphics g) + { + g.drawImage(placebo_icon, 2, 2, 24, 24, null); + } + }; + sub_layout.add(close_button, BorderLayout.EAST); + plugin_pane.add(sub_layout, BorderLayout.PAGE_END); + */ + + tabbed.addTab(panel_caption, null, plugin_pane, ""); + } + + public void onIRCMessage(IRCMessage message, Object source) + { + if (message.is("PRIVMSG")) + { + O5Connection connection = (O5Connection) source; + String source_nick = message.getSourceNick(); + String dest_nick = message.getArgs().firstElement(); + O5ChatPanel p = null; + //System.err.println("{" + connection.getNick() + "} [" + source_nick + "] , [" + dest_nick + "]"); + if (source_nick.equals(connection.getNick())) + { + p = chat_panels.get(dest_nick); + } else { + p = chat_panels.get(source_nick); + } + if (p != null) + { + p.handleMessage(message); + } else { + O5ChatPanel p_new = new O5ChatPanel((O5Connection) source, source_nick); + chat_panels.put(source_nick, p_new); + p_new.handleMessage(message); + tabbed.addTab(source_nick, null, p_new, ""); + } + } + } + + public void onIRCResponse(IRCResponse response, Object source) + { + O5Connection connection = (O5Connection) source; + O5ServerPanel sp = null; + sp = server_panels.get(connection.getServerName()); + sp.handleResponse(response); + } + + private void addServer(O5Connection oc) + { + O5ServerPanel osp = new O5ServerPanel(oc); + oc.startInteractive(this); + server_panels.put(oc.getServerName(), osp); + tabbed.addTab(oc.getServerName(), null, osp, ""); + tabbed.setSelectedIndex(tabbed.getTabCount() - 1); + } + + + public void actionPerformed(ActionEvent e) + { + final ActionEvent x = e; + Thread t = new Thread() + { + public void run() + { + try + { + if ("login".equals(x.getActionCommand())) + { + String server = server_field.getText(); + String username = username_field.getText(); + String password = password_field.getText(); + O5Connection oc = new O5Connection(server); + oc.login(username, password); + addServer(oc); + } + } catch (Exception e) { + + } + } + + }; + t.start(); + } +} diff --git a/src/org/openstatic/irc/client/O5Connection.java b/src/org/openstatic/irc/client/O5Connection.java new file mode 100644 index 0000000..dd7c1d1 --- /dev/null +++ b/src/org/openstatic/irc/client/O5Connection.java @@ -0,0 +1,163 @@ +package org.openstatic.irc.client; + +import java.net.URL; +import java.net.URLEncoder; +import java.net.HttpURLConnection; + +import java.io.ByteArrayOutputStream; +import java.io.InputStream; +import java.io.BufferedInputStream; +import java.io.PrintStream; +import java.io.BufferedReader; +import java.io.InputStreamReader; +import java.io.OutputStreamWriter; + +import org.json.*; + +import org.openstatic.irc.IRCMessage; +import org.openstatic.irc.IRCResponse; +import org.openstatic.irc.IRCMessageListener; + + +public class O5Connection +{ + private String token_id; + private String nick; + private String server; + private String server_name; + private PrintStream ips; + + public O5Connection(String server) + { + this.server = server; + } + + public JSONObject login(String nick, String password) + { + try + { + JSONObject login_response = apiCall("http://" + server + "/irc/connect/?nick=" + URLEncoder.encode(nick, "UTF-8") + "&password=" + URLEncoder.encode(password, "UTF-8")); + this.token_id = login_response.getString("token_id"); + this.server_name = login_response.getString("server"); + this.nick = login_response.getString("nick"); + return login_response; + } catch (Exception e) { + return null; + } + } + + public void startInteractive(final IRCMessageListener iml) + { + Thread t = new Thread() + { + public void run() + { + try + { + URL url = new URL("http://" + O5Connection.this.server + "/irc/interactive/?token_id=" + O5Connection.this.token_id); + InputStream is = url.openStream(); + BufferedReader br = new BufferedReader(new InputStreamReader(is)); + String cmd_line; + do + { + try + { + cmd_line = br.readLine(); + } catch (Exception n) { + System.err.println("READLINE: " + n.toString() + " / " + n.getMessage()); + n.printStackTrace(System.err); + cmd_line = null; + } + if (cmd_line != null) + { + System.err.println(cmd_line); + try + { + JSONObject event = new JSONObject(cmd_line); + if (event.has("command")) + iml.onIRCMessage(new IRCMessage(event), O5Connection.this); + if (event.has("response")) + iml.onIRCResponse(new IRCResponse(event), O5Connection.this); + } catch (Exception cmd_exception) { + System.err.println(cmd_exception.toString() + " / " + cmd_exception.getMessage()); + cmd_exception.printStackTrace(System.err); + } + } + } while (cmd_line != null); + } catch (Exception e) { + System.err.println(e.toString() + " / " + e.getMessage()); + e.printStackTrace(System.err); + } + } + }; + t.start(); + } + + public void onIRCMessage(IRCMessage message) + { + // stub for event. + } + + public void sendIRCMessage(IRCMessage message) + { + apiCall("http://" + this.server + "/irc/direct/?token_id=" + this.token_id, message.toJSONObject().toString()); + } + + public String getNick() + { + return this.nick; + } + + public String getServerName() + { + return this.server_name; + } + + public String getServerAddress() + { + return this.server; + } + + public String getTokenId() + { + return this.token_id; + } + + private static JSONObject apiCall(String url_string) + { + return apiCall(url_string, null); + } + + private static JSONObject apiCall(String url_string, String post_data) + { + try + { + URL url = new URL(url_string); + HttpURLConnection conn = (HttpURLConnection) url.openConnection(); + if (post_data != null) + { + conn.setRequestMethod("POST"); + conn.setRequestProperty("Content-Type", "text/plain"); + conn.setDoOutput(true); + OutputStreamWriter wr = new OutputStreamWriter(conn.getOutputStream()); + wr.write(post_data); + wr.flush(); + wr.close(); + } + InputStream is = conn.getInputStream(); + ByteArrayOutputStream baos = new ByteArrayOutputStream(); + int inputByte; + while ((inputByte = is.read()) > -1) + { + baos.write(inputByte); + } + is.close(); + String response = new String(baos.toByteArray()); + return new JSONObject(response); + } catch (Exception e) { + e.printStackTrace(System.err); + return null; + } + } + +} diff --git a/src/org/openstatic/irc/client/O5ServerPanel.java b/src/org/openstatic/irc/client/O5ServerPanel.java new file mode 100644 index 0000000..b694f99 --- /dev/null +++ b/src/org/openstatic/irc/client/O5ServerPanel.java @@ -0,0 +1,117 @@ +package org.openstatic.irc.client; + +import javax.swing.JPanel; +import javax.swing.JTextPane; +import javax.swing.JTextField; +import javax.swing.JScrollPane; +import javax.swing.ScrollPaneConstants; +import javax.swing.text.Document; + +import java.awt.BorderLayout; +import java.awt.Font; +import java.awt.Color; +import java.awt.Component; +import java.awt.Graphics; +import java.awt.event.ActionEvent; +import java.awt.event.ActionListener; + +import org.openstatic.irc.IRCMessage; +import org.openstatic.irc.IRCResponse; + +import java.util.StringTokenizer; + +public class O5ServerPanel extends JPanel implements ActionListener +{ + private O5Connection connection; + private JTextPane server_box; + private StringBuffer server_buffer; + private JTextField server_input; + + public O5ServerPanel(O5Connection oc) + { + super(new BorderLayout()); + this.connection = oc; + this.server_buffer = new StringBuffer(); + server_box = new JTextPane(); + server_box.setContentType("text/html"); + server_box.setEditable(false); + Font font = new Font("Monospaced", Font.BOLD, 12); + server_box.setBackground(Color.BLACK); + server_box.setFont(font); + server_box.setForeground(Color.WHITE); + server_box.setText(""); + JScrollPane scroller = new JScrollPane(server_box); + scroller.setVerticalScrollBarPolicy(ScrollPaneConstants.VERTICAL_SCROLLBAR_ALWAYS); + server_input = new JTextField(255); + server_input.setBackground(Color.BLACK); + server_input.setFont(font); + server_input.setForeground(Color.WHITE); + server_input.addActionListener(this); + JPanel page_start = new JPanel(new BorderLayout()); + this.add(scroller, BorderLayout.CENTER); + this.add(server_input, BorderLayout.PAGE_END); + } + + public void addText(String message, String color) + { + server_buffer.append("" + message + "
"); + server_box.setText("" + server_buffer.toString() + ""); + } + + public void handleResponse(IRCResponse response) + { + addText(response.toString(), "white"); + } + + public void serverCommand(String command) + { + StringTokenizer st = new StringTokenizer(command); + String cmd = st.nextToken().toLowerCase(); + if (cmd.equals("/join")) + { + IRCMessage im = new IRCMessage(IRCMessage.JOIN); + im.addArg(st.nextToken()); + this.connection.sendIRCMessage(im); + } + if (cmd.equals("/msg")) + { + IRCMessage im = new IRCMessage(IRCMessage.PRIVMSG); + im.addArg(st.nextToken()); + im.addArg(remainingTokens(st)); + this.connection.sendIRCMessage(im); + } + } + + public String remainingTokens(StringTokenizer st) + { + StringBuffer sb = new StringBuffer(); + while (st.hasMoreTokens()) + { + sb.append(st.nextToken()); + if (st.hasMoreTokens()) + sb.append(" "); + } + return sb.toString(); + } + + public void actionPerformed(ActionEvent e) + { + final ActionEvent x = e; + Thread t = new Thread() + { + public void run() + { + try + { + O5ServerPanel.this.serverCommand(server_input.getText()); + server_input.setText(""); + } catch (Exception e) { + + } + } + + }; + t.start(); + } + +} diff --git a/src/org/openstatic/irc/gateways/APIGateway.java b/src/org/openstatic/irc/gateways/APIGateway.java index 3171be5..73430f7 100755 --- a/src/org/openstatic/irc/gateways/APIGateway.java +++ b/src/org/openstatic/irc/gateways/APIGateway.java @@ -4,6 +4,7 @@ import org.openstatic.irc.IrcUser; import org.openstatic.irc.IrcChannel; import org.openstatic.irc.Gateway; +import org.openstatic.irc.IRCMessage; import org.openstatic.http.*; @@ -64,6 +65,17 @@ public APIGatewayConnection findClient(String token_id) } return null; } + + public APIGatewayConnection findClient(IrcUser u) + { + for(Enumeration e = clients.elements(); e.hasMoreElements(); ) + { + APIGatewayConnection ce = e.nextElement(); + if (ce.getIrcUser() == u) + return ce; + } + return null; + } public void shutdownGateway() { @@ -82,6 +94,7 @@ public void run() if (this.ircServer.getDebug() >= 10) { httpServer.setDebug(true); + httpServer.setShowData(true); } httpServer.setSessionVariable("token_id"); httpServer.setSessionMode(PlaceboHttpServer.GET_SESSION); @@ -121,7 +134,10 @@ public void run() public JSONObject doRequest(HttpRequest request) throws Exception { JSONObject response = new JSONObject(); - String client_ip = request.getHttpHeader("X-Real-IP"); + String client_ip = request.getClientHostname(); + String x_real_ip = request.getHttpHeader("X-Real-IP"); + if (x_real_ip != null) + client_ip = x_real_ip; String token_id = request.getGetValue("token_id"); String timeout_string = request.getGetValue("timeout"); int timeout = 60; @@ -131,6 +147,8 @@ public JSONObject doRequest(HttpRequest request) throws Exception if (token_id != null) { connection = findClient(token_id); + if (connection != null) + connection.resetPingRemaining(); } if (request.getPath().equals("/irc/connect/")) @@ -138,18 +156,49 @@ public JSONObject doRequest(HttpRequest request) throws Exception if (token_id == null) token_id = generateBigAlphaKey(15); String nickname = request.getGetValue("nick"); - if (this.ircServer.findUser(nickname) == null) + String pass = request.getGetValue("password"); + IrcUser existing_user = this.ircServer.findUser(nickname); + if (existing_user == null) { connection = new APIGatewayConnection(this.ircServer, token_id, timeout, client_ip, request.getServerHostname()); + //connection.start(); this.clients.add(connection); - connection.connect(nickname, request.getGetValue("password")); + connection.connect(nickname, pass); response.put("token_id", token_id); } else { - response.put("error", "NICK_IN_USE"); + APIGatewayConnection ec = findClient(existing_user); + if (ec != null) + { + if (existing_user.checkPassword(pass)) + { + response.put("token_id", ec.getTokenId()); + } else { + response.put("error", "INVALID_PASSWORD"); + } + + } else { + response.put("error", "NICK_IN_USE"); + } } - } else if (request.getPath().startsWith("/irc/queue/")) { + } else if (request.getPath().equals("/irc/queue/")) { if (connection != null) response.put("events", connection.getMessageQueue()); + } else if (request.getPath().equals("/irc/interactive/")) { + if (connection != null) + { + InteractiveResponse ir = new InteractiveResponse(request); + connection.addInteractiveResponse(ir); + } + } else if (request.getPath().equals("/irc/direct/")) { + if (connection != null) + { + connection.handleMessage(new IRCMessage(request.getJSONObjectPost())); + } + } else if (request.getPath().equals("/irc/raw/")) { + if (connection != null) + { + connection.rawCommand(request.getRawPost()); + } } else if (request.getPath().startsWith("/irc/channel/")) { String channel_name = request.getPathArray()[2]; IrcChannel channel = this.ircServer.findChannel(channel_name); @@ -184,13 +233,13 @@ public JSONObject doRequest(HttpRequest request) throws Exception } } } else { - + response.put("error", "API_NOT_FOUND"); } if (connection != null) { - response.put("ping_remaining", connection.getPingRemaining()); response.put("nick", connection.getIrcUser().getNick()); } + response.put("server", this.ircServer.getServerName()); return response; } diff --git a/src/org/openstatic/irc/gateways/APIGatewayConnection.java b/src/org/openstatic/irc/gateways/APIGatewayConnection.java index 7ec2a71..79dd8f2 100755 --- a/src/org/openstatic/irc/gateways/APIGatewayConnection.java +++ b/src/org/openstatic/irc/gateways/APIGatewayConnection.java @@ -2,17 +2,20 @@ import org.openstatic.irc.GatewayConnection; import org.openstatic.irc.IRCMessage; +import org.openstatic.irc.IRCResponse; import org.openstatic.irc.IrcServer; import org.openstatic.irc.IrcUser; import org.openstatic.irc.IrcChannel; import org.openstatic.http.HttpRequest; import org.openstatic.http.HttpResponse; +import org.openstatic.http.InteractiveResponse; import java.io.ByteArrayOutputStream; import java.io.PrintStream; import java.util.Vector; import java.util.Enumeration; import java.util.StringTokenizer; import java.util.Hashtable; +import java.util.concurrent.LinkedBlockingQueue; import java.net.URLEncoder; import org.json.*; @@ -21,7 +24,8 @@ public class APIGatewayConnection extends Thread implements GatewayConnection private IrcServer ircServer; private IrcUser ircUser; private Hashtable room_timeout; - private Vector message_queue; + private LinkedBlockingQueue message_queue; + private Vector ir_list; private int lastRequestDelay; private int timeout; private String clientHostname; @@ -33,7 +37,9 @@ public APIGatewayConnection(IrcServer ircServer, String token_id, int timeout, S { this.ircServer = ircServer; this.ircUser = new IrcUser(this.ircServer); - this.message_queue = new Vector(); + this.ircUser.setEcho(true); + this.message_queue = new LinkedBlockingQueue(); + this.ir_list = new Vector(); this.ircUser.initGatewayConnection(this); this.ircServer.addUser(this.ircUser); this.clientHostname = client_ip; @@ -43,10 +49,6 @@ public APIGatewayConnection(IrcServer ircServer, String token_id, int timeout, S this.timeout = timeout; this.keep_running = true; this.token_id = token_id; - } - - public void run() - { Thread pingPong = new Thread() { public void run() @@ -66,6 +68,10 @@ public void run() } }; pingPong.start(); + } + + public void run() + { this.ircUser.getIrcServer().log(this.clientHostname, 1, "APIGatewayConnection Thread Exiting!"); } @@ -99,6 +105,19 @@ public void privmsg(String target, String message) this.ircUser.onGatewayCommand(imessage); } + public void handleMessage(IRCMessage imessage) + { + imessage.setSource(this.ircUser); + this.ircUser.onGatewayCommand(imessage); + } + + public void rawCommand(String raw) + { + IRCMessage imessage = new IRCMessage(raw); + imessage.setSource(this.ircUser); + this.ircUser.onGatewayCommand(imessage); + } + public String getTokenId() { return this.token_id; @@ -114,6 +133,11 @@ public int getDelay() return this.lastRequestDelay; } + public void resetPingRemaining() + { + this.lastRequestDelay = 0; + } + public int getPingRemaining() { return this.timeout - this.lastRequestDelay; @@ -139,31 +163,71 @@ public IrcUser getIrcUser() return this.ircUser; } - public void sendResponse(String response, String params) + public void addInteractiveResponse(InteractiveResponse ir) + { + this.ir_list.add(ir); + } + + public void sendResponse(IRCResponse response) { - /* try { - JSONObject resp = new JSONObject(); - resp.put("response", response); - resp.put("data", params); - this.message_queue.add(resp); + this.ircUser.getIrcServer().log(this.clientHostname, 5, "<- " + response.toString()); + if (this.ir_list.size() > 0) + { + resetPingRemaining(); + for (Enumeration e = this.ir_list.elements(); e.hasMoreElements(); ) + { + InteractiveResponse ir = e.nextElement(); + if (ir.isConnected()) + ir.push(response.toJSONObject()); + else + this.ir_list.remove(ir); + } + } else { + this.message_queue.put(response.toJSONObject()); + } } catch (Exception e) { } - */ } - public void sendCommand(IRCMessage pc) + public void sendCommand(IRCMessage message) + { + try + { + this.ircUser.getIrcServer().log(this.clientHostname, 5, "<- " + message.toString()); + if (this.ir_list.size() > 0) + { + resetPingRemaining(); + for (Enumeration e = this.ir_list.elements(); e.hasMoreElements(); ) + { + InteractiveResponse ir = e.nextElement(); + if (ir.isConnected()) + ir.push(message.toJSONObject()); + else + this.ir_list.remove(ir); + } + } else { + this.message_queue.put(message.toJSONObject()); + } + } catch (Exception e) { + System.err.println(e.toString() + " / " + e.getMessage()); + e.printStackTrace(System.err); + } + } + + public JSONObject pollMessageQueue() { - this.ircUser.getIrcServer().log(this.clientHostname, 5, "<- " + pc.toString()); - this.message_queue.add(pc.toJSONObject()); + return this.message_queue.poll(); } public JSONArray getMessageQueue() { JSONArray return_array = new JSONArray(); - for(Enumeration e = this.message_queue.elements(); e.hasMoreElements(); ) + Vector drain_results = new Vector(); + this.message_queue.drainTo(drain_results); + for(Enumeration e = drain_results.elements(); e.hasMoreElements(); ) { JSONObject jo = e.nextElement(); return_array.put(jo); diff --git a/src/org/openstatic/irc/gateways/CLIGatewayConnection.java b/src/org/openstatic/irc/gateways/CLIGatewayConnection.java index e030bd7..2d13263 100755 --- a/src/org/openstatic/irc/gateways/CLIGatewayConnection.java +++ b/src/org/openstatic/irc/gateways/CLIGatewayConnection.java @@ -4,6 +4,7 @@ import org.openstatic.irc.IrcUser; import org.openstatic.irc.IrcChannel; import org.openstatic.irc.IRCMessage; +import org.openstatic.irc.IRCResponse; import org.openstatic.irc.IrcServer; import java.net.Socket; import java.io.InputStream; @@ -180,7 +181,7 @@ public void run() this.println("notice [target] [msg] Send a notice to target"); this.println("msg [target] [msg] Send a privmsg to target"); this.println("nick [target] [new nick] Change somebodys nickname"); - this.println("drop [target] Remove target from server"); + this.println("drop [target] Remove target channel/user from server"); this.println("debug [0-10] Set the verbosity"); this.println("motd Show the message of the day"); this.println("inject [cmd] [src] [target] [msg] Inject Irc Packet"); @@ -339,19 +340,19 @@ public void run() } - public void sendResponse(String response, String params) + public void sendResponse(IRCResponse response) { - socketWrite(response + " : " + params + "\r\n"); + socketWrite(response.getResponseCode() + " : " + response.getData() + "\r\n"); } - public void sendCommand(IRCMessage pc) + public void sendCommand(IRCMessage message) { String out = null; - if (pc.getSource() != null) + if (message.getSource() != null) { - out = ":" + pc.getSource() + " " + pc.toString() + "\r\n"; + out = ":" + message.getSource() + " " + message.toString() + "\r\n"; } else { - out = ":" + this.serverHostname + " " + pc.toString() + "\r\n"; + out = ":" + this.serverHostname + " " + message.toString() + "\r\n"; } socketWrite(out); } @@ -374,4 +375,4 @@ public void println(String out) { socketWrite(out + "\n"); } -} \ No newline at end of file +} diff --git a/src/org/openstatic/irc/gateways/IrcGatewayConnection.java b/src/org/openstatic/irc/gateways/IrcGatewayConnection.java index d35eac2..86dd363 100755 --- a/src/org/openstatic/irc/gateways/IrcGatewayConnection.java +++ b/src/org/openstatic/irc/gateways/IrcGatewayConnection.java @@ -3,6 +3,7 @@ import org.openstatic.irc.GatewayConnection; import org.openstatic.irc.IrcUser; import org.openstatic.irc.IRCMessage; +import org.openstatic.irc.IRCResponse; import java.net.Socket; import java.io.InputStream; import java.io.OutputStream; @@ -139,19 +140,19 @@ public void run() this.ircUser.getIrcServer().log(this.clientHostname, 1, "IrcGatewayConnection Thread Exiting!"); } - public void sendResponse(String response, String params) + public void sendResponse(IRCResponse response) { - socketWrite(":" + this.serverHostname + " " + response + " " + this.ircUser.getNick() + " " + params + "\r\n"); + socketWrite(":" + this.serverHostname + " " + response.getResponseCode() + " " + this.ircUser.getNick() + " " + response.getData() + "\r\n"); } - public void sendCommand(IRCMessage pc) + public void sendCommand(IRCMessage message) { String out = null; - if (pc.getSource() != null) + if (message.getSource() != null) { - out = ":" + pc.getSource() + " " + pc.toString() + "\r\n"; + out = ":" + message.getSource() + " " + message.toString() + "\r\n"; } else { - out = ":" + this.serverHostname + " " + pc.toString() + "\r\n"; + out = ":" + this.serverHostname + " " + message.toString() + "\r\n"; } socketWrite(out); } diff --git a/src/org/openstatic/irc/gateways/WebGatewayConnection.java b/src/org/openstatic/irc/gateways/WebGatewayConnection.java index 85501a5..3b74de7 100755 --- a/src/org/openstatic/irc/gateways/WebGatewayConnection.java +++ b/src/org/openstatic/irc/gateways/WebGatewayConnection.java @@ -2,6 +2,7 @@ import org.openstatic.irc.GatewayConnection; import org.openstatic.irc.IRCMessage; +import org.openstatic.irc.IRCResponse; import org.openstatic.irc.IrcServer; import org.openstatic.irc.IrcUser; import org.openstatic.irc.IrcChannel; @@ -323,7 +324,7 @@ public void close() this.connection.endSession(); } - public void sendResponse(String response, String params) + public void sendResponse(IRCResponse response) { // Do Nothing } @@ -371,43 +372,43 @@ public byte[] readBuffer(String buffer_name) return return_data; } - public void sendCommand(IRCMessage pc) + public void sendCommand(IRCMessage message) { - this.ircUser.getIrcServer().log(this.clientHostname, 5, "<- " + pc.toString()); - String nc = pc.getSourceNick(); - if (pc.is("PRIVMSG")) + this.ircUser.getIrcServer().log(this.clientHostname, 5, "<- " + message.toString()); + String nc = message.getSourceNick(); + if (message.is("PRIVMSG")) { - if (pc.getArg(0).equals(this.ircUser.getNick())) + if (message.getArg(0).equals(this.ircUser.getNick())) { - writeToBuffer(nc, "" + nc + ": " + pc.getArg(1) + "
"); + writeToBuffer(nc, "" + nc + ": " + message.getArg(1) + "
"); } else { - writeToBuffer(pc.getArg(0), "" + nc + ": " + pc.getArg(1) + "
"); + writeToBuffer(message.getArg(0), "" + nc + ": " + message.getArg(1) + "
"); } } - if (pc.is("NOTICE")) + if (message.is("NOTICE")) { - if (pc.getArg(0).equals(this.ircUser.getNick())) + if (message.getArg(0).equals(this.ircUser.getNick())) { - writeToBuffer(nc, "NOTICE (" + nc + "): " + pc.getArg(1) + "
"); + writeToBuffer(nc, "NOTICE (" + nc + "): " + message.getArg(1) + "
"); } else { - writeToBuffer(pc.getArg(0), "NOTICE (" + nc + "): " + pc.getArg(1) + "
"); + writeToBuffer(message.getArg(0), "NOTICE (" + nc + "): " + message.getArg(1) + "
"); } } - if (pc.is("JOIN")) + if (message.is("JOIN")) { - writeToBuffer(pc.getArg(0), "*** " + nc + " Joined Channel :" + pc.getArg(0) + "
"); + writeToBuffer(message.getArg(0), "*** " + nc + " Joined Channel :" + message.getArg(0) + "
"); } - if (pc.is("PART")) + if (message.is("PART")) { - writeToBuffer(pc.getArg(0), "*** " + nc + " Left Channel :" + pc.getArg(0) + "
"); + writeToBuffer(message.getArg(0), "*** " + nc + " Left Channel :" + message.getArg(0) + "
"); } - if (pc.is("QUIT")) + if (message.is("QUIT")) { - writeToBuffer(pc.getArg(0), "*** " + nc + " QUIT IRC :" + pc.getArg(0) + "
"); + writeToBuffer(message.getArg(0), "*** " + nc + " QUIT IRC :" + message.getArg(0) + "
"); } - if (pc.is("TOPIC")) + if (message.is("TOPIC")) { - writeToBuffer(pc.getArg(0), "*** " + nc + " changed the topic to: " + pc.getArg(1) + "
"); + writeToBuffer(message.getArg(0), "*** " + nc + " changed the topic to: " + message.getArg(1) + "
"); } } }