5
0
mirror of https://github.com/cwinfo/matterbridge.git synced 2024-09-19 21:32:31 +00:00

Initial matterbridge commit

This commit is contained in:
Wim 2015-10-23 22:34:37 +02:00
parent 74d0d3fd5b
commit cbd01d4a55
5 changed files with 171 additions and 1 deletions

69
README.md Normal file
View File

@ -0,0 +1,69 @@
# matterbridge
Simple bridge between mattermost and IRC. Uses the in/outgoing webhooks.
Relays public channel messages between mattermost and IRC.
Work in progress.
## building
Make sure you have [Go](https://golang.org/doc/install) properly installed, including setting up your [GOPATH] (https://golang.org/doc/code.html#GOPATH)
```
cd $GOPATH
go get https://github.com/42wim/matterbridge
```
You should now have matterbridge binary in the bin directory:
```
$ ls bin/
matterbridge
```
## running
1) Copy the matterbridge.conf.sample to matterbridge.conf in the same directory as the matterbridge binary.
2) Edit matterbridge.conf with the settings for your environment. See below for more config information.
3) Now you can run matterbridge.
Matterbridge will:
* start a webserver listening on the port specified in the configuration.
* connect to specified irc server and channel.
* send messages from mattermost to irc and vice versa, messages in mattermost will appear with irc-nick
## config
### matterbridge
matterbridge looks for matterbridge.conf in current directory.
Look at matterbridge.conf.sample for an example
```
[IRC]
server="irc.freenode.net"
port=6667
UseTLS=false
SkipTLSVerify=true
nick="matterbot"
channel="#matterbridge"
[mattermost]
#url is your incoming webhook url (account settings - integrations - incoming webhooks)
url="http://mattermost.yourdomain.com/hooks/incomingwebhookkey"
#port the bridge webserver will listen on
port=9999
```
### mattermost
You'll have to configure the incoming en outgoing webhooks.
* incoming webhooks
Go to "account settings" - integrations - "incoming webhooks".
Choose a channel at "Add a new incoming webhook", this will create a webhook URL right below.
This URL should be set in the matterbridge.conf in the [mattermost] section (see above)
* outgoing webhooks
Go to "account settings" - integrations - "outgoing webhooks".
Choose a channel (the same as the one from incoming webhooks) and fill in the address and port of the server matterbridge will run on.
e.g. http://192.168.1.1:9999 (9999 is the port specified in [mattermost] section of matterbridge.conf)

35
config.go Normal file
View File

@ -0,0 +1,35 @@
package main
import (
"gopkg.in/gcfg.v1"
"io/ioutil"
"log"
)
type Config struct {
IRC struct {
UseTLS bool
SkipTLSVerify bool
Server string
Port int
Nick string
Channel string
}
Mattermost struct {
URL string
Port int
}
}
func NewConfig(cfgfile string) *Config {
var cfg Config
content, err := ioutil.ReadFile(cfgfile)
if err != nil {
log.Fatal(err)
}
err = gcfg.ReadStringInto(&cfg, string(content))
if err != nil {
log.Fatal("Failed to parse "+cfgfile+":", err)
}
return &cfg
}

11
matterbridge.conf.sample Normal file
View File

@ -0,0 +1,11 @@
[IRC]
server="irc.freenode.net"
port=6667
UseTLS=false
SkipTLSVerify=true
nick="matterbot"
channel="#matterbridge"
[mattermost]
url="http://yourdomain/hooks/yourhookkey"
port=9999

56
matterbridge.go Normal file
View File

@ -0,0 +1,56 @@
package main
import (
"crypto/tls"
"github.com/42wim/matterbridge/matterhook"
"github.com/thoj/go-ircevent"
"log"
"strconv"
"time"
)
type Bridge struct {
i *irc.Connection
m *matterhook.Client
*Config
}
func NewBridge(name string, config *Config) *Bridge {
b := &Bridge{}
b.Config = config
b.m = matterhook.New(b.Config.Mattermost.URL, matterhook.Config{Port: b.Config.Mattermost.Port})
b.i = b.createIRC(name)
go b.handleMatter()
return b
}
func (b *Bridge) createIRC(name string) *irc.Connection {
i := irc.IRC(b.Config.IRC.Nick, b.Config.IRC.Nick)
i.UseTLS = b.Config.IRC.UseTLS
i.TLSConfig = &tls.Config{InsecureSkipVerify: b.Config.IRC.SkipTLSVerify}
i.Connect(b.Config.IRC.Server + ":" + strconv.Itoa(b.Config.IRC.Port))
time.Sleep(time.Second)
log.Println("Joining", b.Config.IRC.Channel, "as", b.Config.IRC.Nick)
i.Join(b.Config.IRC.Channel)
i.AddCallback("PRIVMSG", b.handlePrivMsg)
return i
}
func (b *Bridge) handlePrivMsg(event *irc.Event) {
matterMessage := matterhook.OMessage{}
matterMessage.Text = event.Message()
matterMessage.UserName = "irc-" + event.Nick
b.m.Send(matterMessage)
}
func (b *Bridge) handleMatter() {
for {
message := b.m.Receive()
b.i.Privmsg(b.Config.IRC.Channel, message.UserName+": "+message.Text)
}
}
func main() {
NewBridge("matterbot", NewConfig("matterbridge.conf"))
select {}
}

View File

@ -51,7 +51,6 @@ type Config struct {
// New Mattermost client. // New Mattermost client.
func New(url string, config Config) *Client { func New(url string, config Config) *Client {
c := &Client{url: url, In: make(chan IMessage), Out: make(chan OMessage), Config: config} c := &Client{url: url, In: make(chan IMessage), Out: make(chan OMessage), Config: config}
log.Println(config.Port)
if c.Port == 0 { if c.Port == 0 {
c.Port = 9999 c.Port = 9999
} }