# go-irc

[![GoDoc](https://img.shields.io/badge/doc-GoDoc-blue.svg)](https://godoc.org/github.com/go-irc/irc)
[![Build Status](https://img.shields.io/travis/go-irc/irc.svg)](https://travis-ci.org/go-irc/irc)
[![Coverage Status](https://img.shields.io/coveralls/go-irc/irc.svg)](https://coveralls.io/github/go-irc/irc?branch=master)

This package was originally created to only handle message parsing,
but has since been expanded to include a small abstraction around a
connection and a simple client.

This library is not designed to hide any of the IRC elements from
you. If you just want to build a simple chat bot and don't want to
deal with IRC in particular, there are a number of other libraries
which provide a more full featured client if that's what you're
looking for.

This library is meant to stay as simple as possible so it can be a
building block for other packages.

This library aims for API compatibility whenever possible. New
functions and other additions will most likely not result in a major
version increase unless they break the API. This library aims to
follow the semver recommendations mentioned on gopkg.in.

Due to complications in how to support x/net/context vs the built-in context
package, only go 1.7+ is officially supported.

## Import Paths

All development happens on the `master` branch and when features are
considered stable enough, a new release will be tagged.

As a result of this, there are multiple import locations.

* `gopkg.in/irc.v2` should be used to develop against the commits
  tagged as stable
* `github.com/go-irc/irc` should be used to develop against the master branch

## Development

In order to run the tests, make sure all submodules are up to date. If you are
just using this library, these are not needed.

## Example

```go
package main

import (
	"log"
	"net"

	"github.com/belak/irc"
)

func main() {
	conn, err := net.Dial("tcp", "chat.freenode.net:6667")
	if err != nil {
		log.Fatalln(err)
	}

	config := irc.ClientConfig{
		Nick: "i_have_a_nick",
		Pass: "password",
		User: "username",
		Name: "Full Name",
		Handler: irc.HandlerFunc(func(c *irc.Client, m *irc.Message) {
			if m.Command == "001" {
				// 001 is a welcome event, so we join channels there
				c.Write("JOIN #bot-test-chan")
			} else if m.Command == "PRIVMSG" && m.FromChannel() {
				// Create a handler on all messages.
				c.WriteMessage(&irc.Message{
					Command: "PRIVMSG",
					Params: []string{
						m.Params[0],
						m.Trailing(),
					},
				})
			}
		}),
	}

	// Create the client
	client := irc.NewClient(conn, config)
	err = client.Run()
	if err != nil {
		log.Fatalln(err)
	}
}
```

## Major Version Changes

### v1

Initial release

### v2

- CTCP messages will no longer be rewritten. The decision was made that this
  library should pass through all messages without mangling them.
- Remove Message.FromChannel as this is not always accurate, while
  Client.FromChannel should always be accurate.
