# IRC CHAT auslesen -> Sockets/input und output Streams



## Clue (28. Jan 2004)

Hallo , habe mich hier neu angemeldet und hoffe auf gute Hilfe und das ich dann mein wissen auch anderen Übermitteln kann.

Also ich möchte mit nem Programm mich ins IRC verbinden (glaube das geht schon bei mir)
und dann aus bestimmten channeln das was gechattet/geschrieben wird in einem textarea oder liste ausgeben lassen.

bzw würde ich die vorher noch auswerten ect, aber da sist nicht das Problem.

Folgende Problempunkte treten auf :::

-Wie gelange ich an ausgaben des IRC
-der getinputStream , ist der richtig eingebaut??

hier mal mein Programm , bin über jegliche hilfen erfreut!!!!


```
/* EchoClient.java */
import java.awt.event.*;
import java.awt.*;
import java.net.*;
import java.io.*;
import java.util.*;
import javax.imageio.*;
import java.awt.image.*;

//Klassenbeginn
public class connectirc extends Frame implements ActionListener
{
  
  Vector hatDaten;

  java.awt.List anzeigeliste;

  //Mainmethode
  public static void main(String[] args)
  {
		new connectirc();
  }

  //Kontruktorbeginn
  public connectirc()
	{
      
		hatDaten = new Vector();

		this.setLayout(null);
		this.setSize(400,200);
		this.setBackground(Color.gray);
		this.setTitle("Fifa Stadium 1.0");

		anzeigeliste = new java.awt.List();
		anzeigeliste.setBounds(200,0,200,200);
		
		this.add(anzeigeliste);

		this.setVisible(true);

		this.addWindowListener(new WindowAdapter() 
			{	public void windowClosing(WindowEvent e)  
					{System.exit(0);}  });

	  
	  
	}
	  
         public void verbindung()
				{
 
				try
					{
						// Verbindung zum IRC
						Socket sock = new Socket("irc.quakenet.eu.org" , 6667);
						InputStream in = sock.getInputStream();
						OutputStream out = sock.getOutputStream();
						sock.setSoTimeout(300);
						BufferedReader conin = new BufferedReader(
                        new InputStreamReader(System.in));
						String line = "";
						while (true) {
						//Eingabezeile lesen
						line = conin.readLine();
						anzeigeliste.add(line);
									 }
					}

				//Exception fängt fehler aus try ab
				catch(Exception se ) 
					{
						//Fehlerausgaben
						System.out.println( "keine Verbindung moeglich: " + se.getMessage() );
						System.exit( 1 );

					}

				}



		public void actionPerformed(ActionEvent e)
			{
				String s=(String)e.getActionCommand();
			}


	
}
```


----------



## nekton (29. Jan 2004)

hatte da auch mal an einem irc-client gebastelt.  ist zwar schon ein bisschen laenger her, aber immernoch funktionsfaehig 
vieleichts hilfts dir ja weiter. ich arbeite gerade an einer neuen version die ein wenig mehr OOP arbeitet. kann ich bei gelegenheit auch mal posten wenn interesse besteht.

ansonsten schau dir halt mal ds irc protokoll nach rfc1459 an (http://rfc.sunsite.dk/rfc/rfc1459.html) - da steht alles drin wie du mit dem server zu reden hast..

achja, der code


```
/*
  FUZZEL-BOT 0.03
  ===============
  NAME: IrcStream.java
  USE: this file includes methods which will be needed to run/code an IRC-client.
  MAINCODE: Dennis Wilson <nektonx@gmx.net>
  ADDITIONAL CODE: [NONEYET]
  CHANGES: - better structured source
          - better structured methods
          - new IRC methods ()
	      - a bit better class communication model

  LAST CHANGES: 24.04.2002

  NOTE: Fuzzle-Bot is protected by the GPL. That means feel free to copy, you may modifie this code (and send the
        new modification back to me <nektonx@gmx.net>) and also use it for your projects (it also would be nice if
        I could get a copy of your new work :). If you modifie anythig in this code so, please set comments and
        change the points in headcomments ("ADDITIONAL CODE" & "LAST CHANGES").



   Methods (only important ones):

      Construkter
      ===========
      	public Irc()				         Just create the an Objekt of Irc. By this way you have to initialize
						         the connection by your own.
	public Irc(String sRemoteHost, int iRemotePort)  This create an Objekt and etablishes a connection to the server and
							 port defined in _sRemoteHost_ and _sRemotePort_.

      Connection
      ==========
	public int initConnection(String sRemoteHost, int iRemotePort) open a connetion to remote host on the given port
				  
	public int shutConnection()                   closes the server connection
	public int shutConnection(String sQuitMsg)    closes the server connection and sends a quit message
	public int getStatus()                        returns the actual connection status {0 = offline,
                                                                                          1 = online,
                                                                                          2 = host error,
                                                                                          3 = socket error}
	public boolean isConnected()		      returns true if connection is etablished or false when no 
						      connection is given.


      Basic Communication
      ===================
	public void write(String sMsg)  send a string to the server
	public String read()           get the server messages as a string objekt

      
      Extended Communication
      ======================
	public void logIn(String sNickName)              login with this nickname
	public void pong(String sPingId)                 tell's the server with a PONG message that you are alive
	public void nick(String sNickName)               changes your nickname on irc
	public void joinChan(String sChannel)            join the specified channel
	public void topic(String sChan, String sTitle)   changes channel topic
	public void privmsg(String sNick, String sMsg)   send a message to channel/user
	public void notice(String sNick, String sMsg)    send a notice message to channel/user


*/


import java.io.*;
import java.net.*;

public class IrcStream
{

   public final String BOLD 		= "^B";
   public final String LINED 		= "^_";
   public final String COLOR 		= "";

   private Socket clientSock 		= null;
   private BufferedReader socketIn	= null;
   private PrintWriter socketOut 	= null;
   private int iStatus 			= 0;



/* constructer 	     */

   public IrcStream()
   {
   }

   public IrcStream(String sRemoteHost, int iRemotePort)
   {
	  this.initConnection(sRemoteHost, iRemotePort); 
   }


/* explicit methods */

   private int initConnection(String sRemoteHost, int iRemotePort)
   {
      if(this.isConnected())
      { 
	return 4;
      }
      
      try
      {
        clientSock = new Socket(sRemoteHost, iRemotePort);
        socketOut  = new PrintWriter(clientSock.getOutputStream(), true);
        socketIn   = new BufferedReader(new InputStreamReader(clientSock.getInputStream()));
        this.iStatus    = 0;
      }
      catch (UnknownHostException e)
      {
         System.out.println(e);
         this.iStatus = 2;
      }
      catch (IOException e)
      {
         System.out.println(e);
         this.iStatus = 3;
      }

      if(iStatus == 0) iStatus = 1;
      return this.iStatus;
   }


   public int shutConnection() throws IOException
   {
	   return this.shutConnection(" ");
   }
   
   public int shutConnection(String sQuitMsg) throws IOException
   {
	if(this.isConnected())
	{
		this.quit(sQuitMsg);
		clientSock.close();
		iStatus = 0;
	}

	return this.iStatus;
   }


   public void write(String sMsg) throws IOException
   {
	if(!this.isConnected())
	{
		return;
	}
	   
	this.socketOut.println(sMsg);
   }
   
   public String read() throws IOException
   {
	if(!this.isConnected())
	{
		return " ";
	}

	return this.socketIn.readLine();
   }

   private boolean isConnected()
   {
	return (this.iStatus == 1)? true : false;
   }
   



/* PROTOCOL COMMAND METHODS AS DEFINED IN RFC 1459 */

   public void logIn(String sNickName) throws IOException
   {
      if(!this.isConnected())
      {
	      return;
      }
      
      this.write("nick " + sNickName);
      this.write("user "+ sNickName +" 0 0 :" + sNickName);
   }

   public void pong(String sPongId) throws IOException
   {
	if(!this.isConnected())
	{
		return;
	}

	this.write("PONG " + sPongId);
   }

   public void nick(String sNickName) throws IOException
   {
	if(!this.isConnected())
	{
		return;
	}
	   
	this.write("nick " + sNickName);
   }

   public void joinChan(String sChannel) throws IOException
   {
	if(!this.isConnected())
	{
		return;
	}

	this.write("join " + sChannel);
   }

   public void topic(String sChan, String sTitle) throws IOException
   {
	if(!this.isConnected())
	{
		return;
	}

	this.write("topic " + sChan + " :" + sTitle);
   }

   public void privmsg(String sNick, String sMsg) throws IOException
   {
	if(!this.isConnected())
	{
		return;
	}
	   
	this.write("privmsg " + sNick + " :" + sMsg);
   }

   public void notice(String sNick, String sMsg) throws IOException
   {
	if(!this.isConnected())
	{
		return;
	}

	this.write("notice " + sNick + " :" + sMsg);
   }

   public void action(String sNick, String sMsg) throws IOException
   {
	if(!this.isConnected())
	{
		return;
	}

	this.write("privmsg " + sNick + " :?ACTION" + sMsg + "?");
   }

   private void quit(String sQuitMsg) throws IOException
   {
	if(!this.isConnected())
	{
		return;
	}

	this.write("quit :" + sQuitMsg);
   }


}
```


----------



## Clue (30. Jan 2004)

vielen Dank

das hilft mir sehr viel weiter, den code an sich verstehe ich

aber sage mir eben , das ist doch jetzt nur die funktion oder??

also ich müsste doch rein theorethisch sttt dne host string und sowas immer meine xpliziten eingaben dann vonehmen , bzw das script für meine bedürfnisse anpassne doer?


----------



## Clue (30. Jan 2004)

habe nochmal drüber geschaut ...


ähm also sehe ichd as richtig das das hier eigentlich so übernommen werden kann ,

ich eine neue Datei öffne und in dieser mein programm /Bot schreibe , indem ich dann die einzelnen Mehtoden aus deiner Vorlage aufrufen kann??

schreibt mals chnell back , wäre cool

und nochmal danke !!!!!!


----------



## odysseus (30. Jan 2004)

ich bastel auch gerade an meinem irc client.

kennt ihr das, das out.println, out sei OutputStream oder PrintWriter, der String nur bis zum ersten Leerzeichen zum Server übertragen wird ??

ich habs debuggt, der String geht komplett in die println-Methode, aber dann muss was schief gehen ?

danke.


----------



## odysseus (30. Jan 2004)

habs geklärt:

funzt nicht:
"PRIVMSG " + #channel+ " " + msg;

funzt:
"PRIVMSG " + #channel + " :" + msg;


ich hatte den doppelpunkt vergessen!
peace.


----------



## Clue (30. Jan 2004)

also ich habe das problem das der bei mir wenn ich 

Objekt von IrcStream ist hier fifabot

fifabot.logIn(nickname);

geht einfach nit , entweder der sagt dann 
first register oder der sagt not enough paramters in USER

einer ne idee , ich rätsel in diversn channeln mit andren leuten drann rum 

wenn eienr das shcon hat mal posten , aber auhc ideen sind gefragt


----------



## Clue (30. Jan 2004)

Also ich komme nit weiter , er gibt immer folgendes aus::

Ich habe zusätzlich die Klasse IrcStream.java benutzt , die ganz oben gepostet worden ist!!

wäre über jede hilfe erfreut!!


```
---------- Run ----------
start
NOTICE AUTH :*** Checking Ident
NOTICE AUTH :*** No ident response
:demon1.uk.quakenet.org 451 testbot testbot :Register first.
```






```
//Imports
import java.awt.Button;
import java.awt.Color;
import java.awt.Frame;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;
import java.util.Vector;
import java.awt.*;
import java.awt.event.*;
import java.util.*;
import java.io.*;
import java.net.*;
import javax.imageio.*;
import java.awt.image.*;

//Klassenerzweugung
public class Fifastadiumbot extends Frame implements ActionListener
{
	//Initialisierungen
	Vector hatStadium;

	IrcStream fifabot;
	
	Button start;
	
	String username ="testbot";
	String nickname="testbot";

	// innere Klassen

	MouseListener Mauslauscher = new MouseListener()
   	{
		public void mouseClicked(MouseEvent e) {} 
		public void mousePressed(MouseEvent e) {}
		public void mouseReleased(MouseEvent e) {}
		public void mouseEntered(MouseEvent e) {}
		public void mouseExited(MouseEvent e)  {}
   	};
   	
		public class MyThread extends Thread
	{
		public void run() 
		{
			String str;
			try
			{

				
				while ((str = fifabot.read()) != null)
				{
					String a = fifabot.read();
					System.out.println(a);
					if (a.startsWith("PING")) fifabot.write("PONG" + a.substring(4));
		 
				}
			}
			catch(Exception e)
			{
				
			}
	
		}
	}

   	
	//Kontruktor
	public Fifastadiumbot()
	{
 
		this.setLayout(null);
		this.setSize(600,600);
		this.setBackground(Color.gray);
		this.setTitle("Fifa Stadium BOT 1.0");
		
		start= new Button ("auslese starten lassen");
		start.setBounds(400,185,180,20);  
		start.addActionListener(this);
		start.setActionCommand("start");
		this.add(start);
		

		
		this.setVisible(true);
		
		this.addWindowListener(new WindowAdapter() 
		{  
			public void windowClosing(WindowEvent e)
			{
				System.exit(0);
			}  
		});
	}

	//Alles was auf Reaktionen vom ActionListener reagieren soll
	public void actionPerformed(ActionEvent e)
	{
		String s=(String)e.getActionCommand();

		if(s.equals("start"))
		{
			botstart();

			System.out.println("start");
		}
	}

	//Platz für Methoden/Funktionen

	public void botstart()
	{
		try
		{   
			MyThread t = new MyThread();
			
			fifabot = new IrcStream("irc.quakenet.eu.org",6667);
			t.start();
			
            fifabot.logIn(nickname);
			//fifabot.write("NICK " + nickname);
			//fifabot.write("USER " + username);
				
			fifabot.joinChan("natobase");

			//fifabot.joinChan("natobase");
		}
		catch(Exception er)
		{
			System.out.println(er);
		}
	}

	//Mainmethode
	
	public static void main(String [] args)
	{
		new Fifastadiumbot();
	}







}
```


----------



## Clue (31. Jan 2004)

habs selber schon raus , melde mich aber bei weiteren Problemen


----------



## stev.glasow (3. Feb 2004)

Clue hat gesagt.:
			
		

> habs selber schon raus , melde mich aber bei weiteren Problemen


Mir ist so etwas hier schon öfter aufgefällen: Könntet ihr beim nächsten Mal noch eure Lösung posten, das ist eigendlich so üblich. Danke.


----------

