2016-03-06 19:38:35 +00:00
[![Build Status ](https://api.travis-ci.org/fluffle/goirc.svg )](https://travis-ci.org/fluffle/goirc)
2009-12-17 21:12:37 +00:00
GoIRC Client Framework
======================
### Acquiring and Building
Pretty simple, really:
2012-06-06 14:22:06 +00:00
go get github.com/fluffle/goirc/client
2009-12-17 21:12:37 +00:00
2012-06-06 14:22:06 +00:00
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 ;-)
2009-12-17 21:12:37 +00:00
2013-04-04 17:49:56 +00:00
See `fix/goirc.go` and the README there for a quick way to migrate from the
old `go1` API.
2009-12-17 21:12:37 +00:00
### Using the framework
2009-12-17 21:47:33 +00:00
Synopsis:
2016-03-02 18:19:47 +00:00
```go
package main
import (
"crypto/tls"
"fmt"
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.SSLConfig = & tls.Config{ServerName: "irc.freenode.net"}
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(irc.CONNECTED,
func(conn *irc.Conn, line *irc.Line) { conn.Join("#channel") })
// And a signal on disconnect
quit := make(chan bool)
c.HandleFunc(irc.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.Error())
}
// With a "simple" client, set Server before calling Connect...
c.Config().Server = "irc.freenode.net"
2009-12-17 21:47:33 +00:00
2016-03-02 18:19:47 +00:00
// ... or, use ConnectTo instead.
if err := c.ConnectTo("irc.freenode.net"); err != nil {
fmt.Printf("Connection error: %s\n", err.Error())
2011-10-06 20:33:02 +00:00
}
2009-12-17 21:47:33 +00:00
2016-03-02 18:19:47 +00:00
// Wait for disconnect
< -quit
}
```
2009-12-17 21:12:37 +00:00
The test client provides a good (if basic) example of how to use the framework.
2010-11-21 19:59:57 +00:00
Reading `client/handlers.go` gives a more in-depth look at how handlers can be
2009-12-17 21:12:37 +00:00
written. Commands to be sent to the server (e.g. PRIVMSG) are methods of the
2010-11-21 19:59:57 +00:00
main `*Conn` struct, and can be found in `client/commands.go` (not all of the
2009-12-17 21:12:37 +00:00
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
2009-12-17 21:30:18 +00:00
`RPL_TOPIC` to get the topic for a channel.
2009-12-17 21:12:37 +00:00
2009-12-17 21:47:33 +00:00
The vast majority of handlers implemented within the framework deal with state
2011-11-06 05:22:02 +00:00
tracking of all nicks in any channels that the client is also present in. These
2015-07-26 23:59:05 +00:00
handlers are in `client/state_handlers.go` . State tracking is optional, disabled
2011-11-09 22:06:54 +00:00
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 ;-)
2009-12-17 21:12:37 +00:00
2022-02-03 09:09:10 +00:00
### Projects using GoIRC
- [xdcc-cli ](https://github.com/ostafen/xdcc-cli ): A command line tool for searching and downloading files from the IRC network.
2009-12-17 21:12:37 +00:00
### Misc.
Sorry the documentation is crap. Use the source, Luke.
2009-12-18 22:39:22 +00:00
[Feedback ](mailto:a.bramley@gmail.com ) on design decisions is welcome. I am
indebted to Matt Gruen for his work on
[go-bot ](http://code.google.com/p/go-bot/source/browse/irc.go ) 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.
2015-01-02 14:46:17 +00:00
This code is (c) 2009-15 Alex Bramley, and released under the same licence terms
2009-12-17 21:12:37 +00:00
as Go itself.
2013-03-08 22:24:33 +00:00
Contributions gratefully received from:
2015-01-02 14:46:17 +00:00
- [3onyc ](https://github.com/3onyc )
- [bramp ](https://github.com/bramp )
- [cgt ](https://github.com/cgt )
- [iopred ](https://github.com/iopred )
- [Krayons ](https://github.com/Krayons )
- [StalkR ](https://github.com/StalkR )
- [sztanpet ](https://github.com/sztanpet )
- [wathiede ](https://github.com/wathiede )
2015-09-20 17:15:27 +00:00
- [scrapbird ](https://github.com/scrapbird )
2015-12-03 07:59:57 +00:00
- [soul9 ](https://github.com/soul9 )
2016-03-02 21:53:04 +00:00
- [jakebailey ](https://github.com/jakebailey )
- [stapelberg ](https://github.com/stapelberg )
2021-03-26 13:17:34 +00:00
- [shammash ](https://github.com/shammash )
2022-03-23 09:40:06 +00:00
- [ostafen ](https://github.com/ostafen )
2015-09-20 17:15:27 +00:00
And thanks to the following for minor doc/fix PRs:
- [tmcarr ](https://github.com/tmcarr )
- [Gentux ](https://github.com/Gentux )
- [kidanger ](https://github.com/kidanger )
- [ripcurld00d ](https://github.com/ripcurld00d )
2018-09-03 11:08:04 +00:00
- [gundalow ](https://github.com/gundalow )