Go to file
Alex Bramley bf726bff88 Add LICENSE file lifted from Go to back up README. 2014-01-20 21:04:19 +00:00
client Atomic incrementing of call count for dispatch test (1->0). 2013-09-30 14:49:32 +01:00
doc IRC RFCs and unreal docs for reference 2009-12-12 00:24:41 +00:00
fix Fix copypasta and add a comment about fail. 2013-04-05 12:30:04 +01:00
logging Simple adapter to utilise GLog with goirc. 2013-09-27 22:34:07 +01:00
state Minimally invasive change to put logging behind a user-replaceable interface. 2013-09-27 22:19:40 +01:00
.gitignore add irc_test.go, update Makefile and .gitignore 2009-12-18 22:50:13 +00:00
LICENSE Add LICENSE file lifted from Go to back up README. 2014-01-20 21:04:19 +00:00
README.md Go fix tool for client API changes. 2013-04-04 18:51:35 +01:00
client.go Update README and example client. 2013-02-18 01:53:17 +00:00
vims update vims to edit README too, maybe i'll actually add stuff. 2009-12-17 21:14:46 +00:00

README.md

GoIRC Client Framework

Acquiring and Building

Pretty simple, really:

go get github.com/fluffle/goirc/client

There is some example code that demonstrates usage of the library in client.go. This will connect to freenode and join #go-nuts by default, so be careful ;-)

See fix/goirc.go and the README there for a quick way to migrate from the old go1 API.

Using the framework

Synopsis:

import irc "github.com/fluffle/goirc/client"

func main() {
	// Creating a simple IRC client is simple.
	c := irc.SimpleClient("nick")

	// Or, create a config and fiddle with it first:
	cfg := irc.NewConfig("nick")
	cfg.SSL = true
	cfg.Server = "irc.freenode.net:7000"
	cfg.NewNick = func(n string) string { return n + "^" }
	c := irc.Client(cfg)

	// Add handlers to do things here!
	// e.g. join a channel on connect.
	c.HandleFunc("connected",
		func(conn *irc.Conn, line *irc.Line) { conn.Join("#channel") })
	// And a signal on disconnect
	quit := make(chan bool)
	c.HandleFunc("disconnected",
		func(conn *irc.Conn, line *irc.Line) { quit <- true })

	// Tell client to connect.
	if err := c.Connect(); err != nil {
		fmt.Printf("Connection error: %s\n", err.String())
	}

	// With a "simple" client, set Server before calling Connect...
	c.Config().Server = "irc.freenode.net"

	// ... or, use ConnectTo instead.
	if err := c.ConnectTo("irc.freenode.net"); err != nil {
		fmt.Printf("Connection error: %s\n", err.String())
	}

	// Wait for disconnect
	<-quit
}

The test client provides a good (if basic) example of how to use the framework. Reading client/handlers.go gives a more in-depth look at how handlers can be written. Commands to be sent to the server (e.g. PRIVMSG) are methods of the main *Conn struct, and can be found in client/commands.go (not all of the possible IRC commands are implemented yet). Events are produced directly from the messages from the IRC server, so you have to handle e.g. "332" for RPL_TOPIC to get the topic for a channel.

The vast majority of handlers implemented within the framework deal with state tracking of all nicks in any channels that the client is also present in. These handers are in client/state_handlers.go. State tracking is optional, disabled by default, and can be enabled and disabled by calling EnableStateTracking() and DisableStateTracking() respectively. Doing this while connected to an IRC server will probably result in an inconsistent state and a lot of warnings to STDERR ;-)

Misc.

Sorry the documentation is crap. Use the source, Luke.

Feedback on design decisions is welcome. I am indebted to Matt Gruen for his work on go-bot which inspired the re-organisation and channel-based communication structure of *Conn.send() and *Conn.recv(). I'm sure things could be more asynchronous, still.

This code is (c) 2009-13 Alex Bramley, and released under the same licence terms as Go itself.

Contributions gratefully received from: