Thresher Code Example



using System;

using Sharkbite.Irc;


namespace Sharkbite.Irc.Examples


/// <summary>

/// A basic example which simply echos all

/// public messages sent to a channel.

/// It is designed to demonstrate how to connect to an IRC

/// server and how to register event handlers.

/// </summary>

public class Basic



/// <summary>

/// The connection object is the focal point of the library.

/// It used to retrieve references to the various library components.

/// </summary>

private Connection connection;


/// <summary>

/// Create a bot and register its handlers.

/// </summary>

public Basic()


CreateConnection ();


//OnRegister tells us that we have successfully established a connection with

//the server. Once this is established we can join channels, check for people

//online, or whatever.

connection.Listener.OnRegistered += new RegisteredEventHandler ( OnRegistered );

//Listen for any messages sent to the channel

connection.Listener.OnPublic += new PublicMessageEventHandler ( OnPublic );


//Listen for bot commands sent as private messages

connection.Listener.OnPrivate += new PrivateMessageEventHandler ( OnPrivate );

//Listen for notification that an error has ocurred

connection.Listener.OnError += new ErrorMessageEventHandler ( OnError );


//Listen for notification that we are no longer connected.

connection.Listener.OnDisconnected += new DisconnectedEventHandler ( OnDisconnected );



private void CreateConnection()


//The hostname of the IRC server

string server = "";


//The bot's nick on IRC

string nick = "EchoBot";


//Fire up the Ident server for those IRC networks

//silly enough to use it.

Identd.Start ( nick );


//A ConnectionArgs contains all the info we need to establish

//our connection with the IRC server and register our bot.

//This line uses the simplfied contructor and the default values.

//With this constructor the Nick, Real Name, and User name are

//all set to the same value. It will use the default port of 6667 and no server


ConnectionArgs cargs = new ConnectionArgs (nick, server);

//When creating a Connection two additional protocols may be

//enabled: CTCP and DCC. In this example we will disable them


connection = new Connection( cargs, false, false );



//We could have created multiple Connections to different IRC servers

//and each would process messages simultaneously and independently.

//There is no fixed limit on how many Connection can be opened at one time but

//it is important to realize that each runs in its own Thread. Also,separate event

//handlers are required for each connection, i.e. the

//same OnRegistered () handler cannot be used for different connection




public void start()


//Notice that by having the actual connect call here

//the constructor can add the necessary listeners before

//the connection process begins. If listeners are added

//after connecting they may miss certain events. the OnRegistered()

//event will certainly be missed.




//Calling Connect() will cause the Connection object to open a

//socket to the IRC server and to spawn its own thread. In this

//separate thread it will listen for messages and send them to the

//Listener for processing.

connection.Connect ();


Console.WriteLine ("Echobot connected.");

//The main thread ends here but the Connection's thread is still alive.

//We are now in a passive mode waiting for events to arrive.


catch( Exception e )


Console.WriteLine ("Error during connection process.");

Console.WriteLine ( e );

Identd.Stop ();




public void OnRegistered()


//We have to catch errors in our delegates because Thresher purposefully

//does not handle them for us. Exceptions will cause the library to exit if they are not




//Don't need this anymore in this example but this can be left running

//if you want.

Identd.Stop ();


//The connection is ready so lets join a channel.

//We can join any number of channels simultaneously but

//one will do for now.

//All commands are sent to IRC using the Sender object

//from the Connection.

connection.Sender.Join ("#thresher");


catch( Exception e )


Console.WriteLine ("Error in OnRegistered(): " + e ) ;




public void OnPublic( UserInfo user, string channel, string message )


//Echo back any public messages

connection.Sender.PublicMessage ( channel,user.Nick + " said, " + message );



public void OnPrivate( UserInfo user,string message )


//Quit IRC if someone sends us a 'die' message

if( message == "die" )


connection.Disconnect ("Bye");




public void OnError( ReplyCode code, string message)


//All anticipated errors have a numeric code. The custom Thresher ones start at 1000 and

//can be found in the ErrorCodes class. All the others are determined by the IRC spec

//and can be found in RFC2812Codes.

Console.WriteLine ("An error of type " + code + " due to " + message + " has occurred.");



public void OnDisconnected()


//If this disconnection was involutary then you should have received an error

//message ( from OnError() ) before this was called.

Console.WriteLine ("Connection to the server has been closed.");