Go to file
Alex Bramley 17e5216144 fix race and reinit conn.Me on disconnect
* due to the blocking nature of channel reads, by the time the runLoop()
  for loop exits in that goroutine, we might well be half-way through
  reconnecting to the server -- a bad time to run conn.initialise().
  move the call to initialise() into shutdown() to ensure it happens
  in a timely manner.

* On a related note, conn.Me was retaining old channel objects in it's
  Channels map. All other references to nicks and channels are erased
  in conn.initialise(), but as we keep a seperate reference to our Nick
  object in conn.Me, we need to reinit that at the same time.
2009-12-19 19:05:32 +00:00
doc IRC RFCs and unreal docs for reference 2009-12-12 00:24:41 +00:00
irc fix race and reinit conn.Me on disconnect 2009-12-19 19:05:32 +00:00
.gitignore add irc_test.go, update Makefile and .gitignore 2009-12-18 22:50:13 +00:00
Makefile initial go IRC library, dirty hax abound :-) 2009-11-29 20:23:15 +00:00
README.md update README and comments so godoc creates nice helpful html documentation 2009-12-18 22:48:58 +00:00
client.go add flood testing capability to test client 2009-12-19 18:36:12 +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:

git clone git://github.com/fluffle/goirc.git
make -C irc install

You can build the test client also with:

make
./gobot

This will connect to freenode and join #go-nuts by default, so be careful ;-)

Using the framework

Synopsis:

import "irc"
func main() {
    c := irc.New("nick", "ident", "real name")
    // add handlers to do things here!
    if err := c.Connect("irc.freenode.net", ""); err != nil {
	    fmt.Printf("Connection error: %s\n", err.String())
    }
    for {
        if closed(c.Err) {
            break
        }
        if err := <-c.Err; err != nil {
            fmt.Printf("goirc error: %s", err.String())
        }
    }
}

The test client provides a good (if basic) example of how to use the framework. Reading irc/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 *irc.Conn object, and can be found in irc/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. It's likely that this state tracking will become optional in the near future.

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 Alex Bramley, and released under the same licence terms as Go itself.