Go to file
Alex Bramley 762ba1e599 Type inference proves too costly for ragel-based config...
On the one hand, the complex ragel solution is explicit about the config syntax
and requires little heavy lifting on the Go side, but the ragel definition is
overly complex, too rigid and produces bloody huge binary output. On the other
the simple ragel solution can provide pretty much the same syntax with some
type conversion, but the reflection magic to pack this into objects correctly
is done much better by the JSON module. Forcing parsing of everything tostrings
results in lots of nasty if/case statements in the Go code.

JSON has another benefit in that the config serialisation is two-way, allowing
for web or IRC based configuration. It's a pity it's a bugger to edit by hand.
2011-02-22 21:26:48 +00:00
client Make timestamp format twiddleable; cosmetic re-arrangement of *Conn struct. 2010-11-23 22:18:08 +00:00
doc IRC RFCs and unreal docs for reference 2009-12-12 00:24:41 +00:00
server Type inference proves too costly for ragel-based config... 2011-02-22 21:26:48 +00:00
.gitignore Initial commit of vague hackery for a go IRCd. 2010-11-21 20:07:31 +00:00
Makefile Makefile fixes to build with more recent Go releases. 2010-08-29 21:24:47 +01:00
Makeserv Initial commit of vague hackery for a go IRCd. 2010-11-21 20:07:31 +00:00
README.md Update README for release. 2010-11-21 19:59:57 +00:00
client.go Move irc/ to client/ and set up for goinstall. 2010-11-21 19:53:14 +00:00
server-plan.svg Initial commit of vague hackery for a go IRCd. 2010-11-21 20:07:31 +00:00
server.cfg Add oper parsing, standardise ragel naming, change config. 2010-11-28 18:08:11 +00:00
server.go Initial commit of vague hackery for a go IRCd. 2010-11-21 20:07:31 +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:

goinstall github.com/fluffle/goirc

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 "github.com/fluffle/goirc/client"
func main() {
    c := irc.New("nick", "ident", "real name")
    // Optionally, turn on debugging
    c.Debug = true
    // Optionally, enable SSL
    c.SSL = true
    // 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 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. 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-10 Alex Bramley, and released under the same licence terms as Go itself.