home *** CD-ROM | disk | FTP | other *** search
/ PC World Komputer 1999 May / PCWK5A99.ISO / Linuxwld / linuxwld.exe / IRCSession.class (.txt) < prev    next >
Encoding:
Java Class File  |  1998-05-31  |  7.9 KB  |  474 lines

  1. import java.io.BufferedInputStream;
  2. import java.io.BufferedOutputStream;
  3. import java.io.DataInputStream;
  4. import java.io.DataOutputStream;
  5. import java.io.IOException;
  6. import java.io.PrintStream;
  7. import java.net.InetAddress;
  8. import java.net.Socket;
  9. import java.net.UnknownHostException;
  10. import java.util.StringTokenizer;
  11.  
  12. public abstract class IRCSession {
  13.    Socket theSocket;
  14.    DataInputStream sockIn;
  15.    PrintStream sockOut;
  16.    DataOutputStream sockDos;
  17.    PrintStream userOut;
  18.    PrintStream debugOut;
  19.    StreamConnector mon;
  20.    String ServerName;
  21.    int ServerPort;
  22.    boolean connected = false;
  23.    String myNick;
  24.    String currChannel;
  25.    String motd = "";
  26.    StringBuffer names = new StringBuffer(1024);
  27.    public static final int RPL_WELCOME = 1;
  28.    public static final int RPL_YOURHOST = 2;
  29.    public static final int RPL_MYINFO = 4;
  30.    public static final int ERR_LOW = 400;
  31.    public static final int ERR_HIGH = 599;
  32.    public static final int RPL_TOPIC = 332;
  33.    public static final int RPL_NAMREPLY = 353;
  34.    public static final int RPL_ENDOFNAMES = 366;
  35.    public static final int RPL_MOTD = 372;
  36.    public static final int RPL_MOTDSTART = 375;
  37.    public static final int RPL_ENDOFMOTD = 376;
  38.    public static final int RPL_YOUREOPER = 381;
  39.    public static final int CMD_JOIN = 1001;
  40.    public static final int CMD_PART = 1002;
  41.    public static final int CMD_PRIVMSG = 1003;
  42.    public static final int CMD_QUIT = 1004;
  43.    public static final int SVR_PING = 2001;
  44.    public static final int PCH_DISPLAY = 2009;
  45.    public static final int PCH_YOURESUPER = 2017;
  46.    public static final int PCH_REDIRECT = 551;
  47.  
  48.    private int getCmdID(String var1) {
  49.       int var2;
  50.       try {
  51.          var2 = Integer.valueOf(var1);
  52.       } catch (NumberFormatException var3) {
  53.          if (var1.equalsIgnoreCase("join")) {
  54.             var2 = 1001;
  55.          } else if (var1.equalsIgnoreCase("part")) {
  56.             var2 = 1002;
  57.          } else if (var1.equalsIgnoreCase("privmsg")) {
  58.             var2 = 1003;
  59.          } else if (var1.equalsIgnoreCase("quit")) {
  60.             var2 = 1004;
  61.          } else if (var1.equalsIgnoreCase("ping")) {
  62.             var2 = 2001;
  63.          } else if (var1.equalsIgnoreCase("pch_display")) {
  64.             var2 = 2009;
  65.          } else {
  66.             var2 = -1;
  67.          }
  68.       }
  69.  
  70.       return var2;
  71.    }
  72.  
  73.    protected void toUser(String var1) {
  74.       this.userOut.println(var1);
  75.    }
  76.  
  77.    protected void toServer(String var1) {
  78.       try {
  79.          if (this.sockDos != null) {
  80.             this.sockDos.writeUTF(var1);
  81.             this.sockDos.writeUTF("\n");
  82.             this.sockDos.flush();
  83.             return;
  84.          }
  85.  
  86.          if (this.sockOut != null) {
  87.             this.sockOut.println(var1);
  88.             return;
  89.          }
  90.  
  91.          if (this.mon != null) {
  92.             this.mon.send(var1);
  93.             return;
  94.          }
  95.       } catch (Exception var3) {
  96.          System.out.println("Socket error: " + var3);
  97.       }
  98.  
  99.    }
  100.  
  101.    private String getCurrChannel() {
  102.       return this.currChannel;
  103.    }
  104.  
  105.    private void doJoin(StringTokenizer var1) {
  106.       this.joinChannel(var1.nextToken());
  107.    }
  108.  
  109.    public void doQuit(StringTokenizer var1) {
  110.       this.disconnect();
  111.    }
  112.  
  113.    private void doCommand(String var1) {
  114.       StringTokenizer var2 = new StringTokenizer(var1.substring(1));
  115.       String var3 = var2.nextToken();
  116.       if (var3.equalsIgnoreCase("join")) {
  117.          this.joinChannel(var2.nextToken());
  118.       } else if (var3.equalsIgnoreCase("quit")) {
  119.          this.doQuit(var2);
  120.       } else {
  121.          this.toServer(var1.substring(1));
  122.       }
  123.    }
  124.  
  125.    private void motdStart() {
  126.       this.motd = "";
  127.    }
  128.  
  129.    private void motdAdd(String var1) {
  130.       this.motd = this.motd + "\n" + var1.substring(var1.indexOf(58) + 1);
  131.    }
  132.  
  133.    private void motdEnd() {
  134.       this.msgUserMotd(this.motd);
  135.    }
  136.  
  137.    private void nameListAdd(StringTokenizer var1) {
  138.       var1.nextToken(":");
  139.  
  140.       while(var1.hasMoreTokens()) {
  141.          this.names.append(" ").append(var1.nextToken(" \t\n"));
  142.       }
  143.  
  144.    }
  145.  
  146.    private void nameListEnd() {
  147.       this.msgUserNames(this.names.toString());
  148.    }
  149.  
  150.    public void userSaid(String var1) {
  151.       if (var1 != null && var1.length() != 0) {
  152.          if (var1.charAt(0) == '/') {
  153.             this.doCommand(var1);
  154.          } else {
  155.             String var2 = this.currChannel;
  156.             if (var2 != null) {
  157.                this.userSaid(var2, var1);
  158.             }
  159.  
  160.          }
  161.       }
  162.    }
  163.  
  164.    public void userSaid(String var1, String var2) {
  165.       if (var2 != null && var2.length() != 0) {
  166.          this.toServer("PRIVMSG " + var1 + " :" + var2);
  167.       }
  168.    }
  169.  
  170.    public void whois(String var1) {
  171.       this.toServer("PCH_WHOIS " + var1);
  172.    }
  173.  
  174.    public void setCreatorURL(String var1) {
  175.       this.toServer("PCH_CREATORURL " + var1);
  176.    }
  177.  
  178.    public void joinChannel(String var1) {
  179.       this.leaveChannel();
  180.       this.names.setLength(0);
  181.       this.currChannel = "*waiting*";
  182.       this.toServer("JOIN " + var1);
  183.    }
  184.  
  185.    public void leaveChannel() {
  186.       if (this.currChannel != null) {
  187.          if (this.currChannel.length() != 0) {
  188.             if (this.currChannel.charAt(0) != '*') {
  189.                this.toServer("PART " + this.currChannel);
  190.                this.currChannel = null;
  191.             }
  192.          }
  193.       }
  194.    }
  195.  
  196.    protected abstract void msgUserSockAccept();
  197.  
  198.    protected abstract void msgUserJoin(String var1, String var2);
  199.  
  200.    protected abstract void msgUserPart(String var1, String var2);
  201.  
  202.    protected abstract void msgPrivMsg(String var1, String var2, String var3);
  203.  
  204.    protected abstract void msgYouAreAdmin();
  205.  
  206.    protected abstract void msgYouAreSuperUser();
  207.  
  208.    protected abstract void msgPing();
  209.  
  210.    protected abstract void miscCmd(int var1, String var2);
  211.  
  212.    protected abstract void msgUserMotd(String var1);
  213.  
  214.    protected abstract void msgUserWelcome(String var1);
  215.  
  216.    protected abstract void msgUserTopic(String var1);
  217.  
  218.    protected abstract void msgUserNames(String var1);
  219.  
  220.    protected abstract void msgUserError(int var1, String var2);
  221.  
  222.    protected abstract void msgSwitchChannel(String var1);
  223.  
  224.    protected abstract void msgUserDisplay(String var1);
  225.  
  226.    protected void processCommand(String var1, String var2, String var3, StringTokenizer var4) {
  227.       int var5 = this.getCmdID(var3);
  228.       if (var5 >= 400 && var5 <= 599) {
  229.          String var13 = var4.nextToken("\n");
  230.          this.msgUserError(var5, var13.substring(var13.indexOf(58) + 1));
  231.       } else {
  232.          switch (var5) {
  233.             case 1:
  234.                String var9 = var4.nextToken("\n");
  235.                this.msgUserWelcome(var9.substring(var9.indexOf(58) + 1));
  236.                return;
  237.             case 332:
  238.                String var10 = var4.nextToken("\n");
  239.                this.msgUserTopic(var10.substring(var10.indexOf(58) + 1));
  240.                return;
  241.             case 353:
  242.                var4.nextToken(":");
  243.  
  244.                while(var4.hasMoreTokens()) {
  245.                   this.names.append(" ").append(var4.nextToken(" \t\n"));
  246.                }
  247.  
  248.                return;
  249.             case 366:
  250.                this.msgUserNames(this.names.toString());
  251.                return;
  252.             case 372:
  253.                this.motdAdd(var4.nextToken("\n"));
  254.                return;
  255.             case 375:
  256.                this.motd = "";
  257.                return;
  258.             case 376:
  259.                this.msgUserMotd(this.motd);
  260.                return;
  261.             case 381:
  262.                this.msgYouAreAdmin();
  263.                return;
  264.             case 1001:
  265.                String var6 = var4.nextToken();
  266.                var6 = var6.substring(var6.indexOf(58) + 1);
  267.                if (var1.equals(this.myNick)) {
  268.                   this.currChannel = var6;
  269.                   this.msgSwitchChannel(var6);
  270.                }
  271.  
  272.                this.msgUserJoin(var1, var6);
  273.                return;
  274.             case 1002:
  275.                this.msgUserPart(var1, var4.nextToken());
  276.                return;
  277.             case 1003:
  278.                String var7 = var4.nextToken();
  279.                String var8 = var4.nextToken("\n");
  280.                this.msgPrivMsg(var1, var7, var8.substring(var8.indexOf(58) + 1));
  281.                return;
  282.             case 1004:
  283.                this.msgUserPart(var1, "(has quit)");
  284.                return;
  285.             case 2001:
  286.                this.msgPing();
  287.                this.toServer("PONG " + this.ServerName);
  288.                return;
  289.             case 2009:
  290.                String var11 = var4.nextToken("\n");
  291.                var11 = var11.substring(var11.indexOf(58) + 1);
  292.                this.msgUserDisplay(var11);
  293.                return;
  294.             case 2017:
  295.                this.msgYouAreSuperUser();
  296.                return;
  297.             default:
  298.                this.miscCmd(var5, var4.nextToken("\n"));
  299.          }
  300.       }
  301.    }
  302.  
  303.    public void HandleServerMessage(String var1) {
  304.       StringTokenizer var2 = new StringTokenizer(var1);
  305.       if (var1.length() > 0) {
  306.          String var5;
  307.          String var6;
  308.          if (var1.charAt(0) == ':') {
  309.             String var3 = var2.nextToken();
  310.             int var7 = var3.indexOf("!");
  311.             if (var7 > 0) {
  312.                var5 = var3.substring(1, var7);
  313.                var6 = var3.substring(var7 + 1);
  314.             } else {
  315.                var5 = var3.substring(1);
  316.                var6 = "";
  317.             }
  318.          } else {
  319.             var5 = "";
  320.             var6 = "";
  321.          }
  322.  
  323.          String var4 = var2.nextToken();
  324.          this.processCommand(var5, var6, var4, var2);
  325.       }
  326.    }
  327.  
  328.    private boolean connectSocket(String var1, int var2) throws IOException, UnknownHostException {
  329.       this.disconnectSocket();
  330.       this.theSocket = new Socket(var1, var2);
  331.       this.sockIn = new DataInputStream(new BufferedInputStream(this.theSocket.getInputStream()));
  332.       this.sockOut = new PrintStream(new BufferedOutputStream(this.theSocket.getOutputStream()), true);
  333.       this.msgUserSockAccept();
  334.       return true;
  335.    }
  336.  
  337.    private boolean disconnectSocket() {
  338.       try {
  339.          this.sockIn.close();
  340.          this.sockOut.close();
  341.          if (this.sockDos != null) {
  342.             this.sockDos.close();
  343.          }
  344.  
  345.          this.theSocket.close();
  346.          this.sockIn = null;
  347.          this.sockOut = null;
  348.          this.theSocket = null;
  349.          if (this.mon != null) {
  350.             this.mon.disconnect();
  351.          }
  352.  
  353.          this.mon = null;
  354.          return true;
  355.       } catch (Exception var1) {
  356.          return false;
  357.       }
  358.    }
  359.  
  360.    public boolean connect(String var1, String var2, String var3, String var4, int var5, int var6, String var7, boolean var8) {
  361.       if (this.mon != null) {
  362.          this.mon.disconnect();
  363.       }
  364.  
  365.       this.mon = null;
  366.       boolean var9 = false;
  367.       int var10 = 0;
  368.  
  369.       for(int var11 = 0; var11 < var7.length(); ++var11) {
  370.          switch (var7.charAt(var11)) {
  371.             case 'h':
  372.                var9 = this.httpConnect(var4, var6);
  373.                var10 = var6;
  374.                break;
  375.             case 't':
  376.                var9 = this.tcpConnect(var4, var5);
  377.                var10 = var5;
  378.          }
  379.  
  380.          if (var9) {
  381.             break;
  382.          }
  383.       }
  384.  
  385.       if (!var9) {
  386.          return false;
  387.       } else {
  388.          this.ServerName = var4;
  389.          this.ServerPort = var10;
  390.  
  391.          String var12;
  392.          try {
  393.             var12 = InetAddress.getLocalHost().getHostName();
  394.          } catch (Exception var15) {
  395.             var12 = "unknown";
  396.          }
  397.  
  398.          this.debugOut.println("connecting to " + var4 + ":" + var10 + " from " + var12);
  399.          if (var8) {
  400.             this.toServer("MODE para u+");
  401.  
  402.             try {
  403.                this.sockDos = new DataOutputStream(new BufferedOutputStream(this.theSocket.getOutputStream()));
  404.             } catch (Exception var14) {
  405.                System.out.println("Oh No: " + var14);
  406.             }
  407.          }
  408.  
  409.          this.toServer("MODE paraver 206");
  410.          if (var2 != null && var2.length() > 0) {
  411.             this.toServer("PASS " + var2);
  412.          }
  413.  
  414.          this.toServer("USER " + var1 + " " + var12 + " " + var4 + " :" + var3);
  415.          this.toServer("NICK " + var1);
  416.          this.myNick = var1;
  417.          this.connected = true;
  418.          return true;
  419.       }
  420.    }
  421.  
  422.    private boolean tcpConnect(String var1, int var2) {
  423.       this.toUser("Trying TCP connection to " + var1 + ":" + var2 + " ...");
  424.       boolean var3 = false;
  425.  
  426.       try {
  427.          var3 = this.connectSocket(var1, var2);
  428.       } catch (Exception var5) {
  429.          System.out.println("TCP connect: " + var5);
  430.       }
  431.  
  432.       if (!var3) {
  433.          this.toUser("TCP Connection failed");
  434.          return false;
  435.       } else {
  436.          this.mon = new StreamConnector(this.sockIn, this, (String)null, -1);
  437.          return true;
  438.       }
  439.    }
  440.  
  441.    private boolean httpConnect(String var1, int var2) {
  442.       this.toUser("Trying HTTP connection  to " + var1 + ":" + var2 + " ...");
  443.       this.mon = new StreamConnector((DataInputStream)null, this, var1, var2);
  444.       String var3 = this.mon.connect();
  445.       if (var3 == null) {
  446.          this.toUser("HTTP connection failed.");
  447.          this.mon.disconnect();
  448.          this.mon = null;
  449.          return false;
  450.       } else {
  451.          return true;
  452.       }
  453.    }
  454.  
  455.    public boolean disconnect() {
  456.       this.toServer("QUIT");
  457.       this.connected = false;
  458.       if (this.sockIn != null) {
  459.          this.disconnectSocket();
  460.       }
  461.  
  462.       if (this.mon != null) {
  463.          this.mon.disconnect();
  464.       }
  465.  
  466.       return true;
  467.    }
  468.  
  469.    public IRCSession(PrintStream var1, PrintStream var2) {
  470.       this.userOut = var1;
  471.       this.debugOut = var2;
  472.    }
  473. }
  474.