forked from wyc/linkr
/
main.go
106 lines (93 loc) · 2.41 KB
/
main.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
package main
/**
* linkr bridges Slack and IRC
*/
import (
"fmt"
"log"
"os"
"strings"
"time"
"github.com/nlopes/slack"
"github.com/thoj/go-ircevent"
)
var (
SlackAPIToken = os.Getenv("SLACK_API_TOKEN")
SlackChannel = os.Getenv("SLACK_CHANNEL")
IRCNick = os.Getenv("IRC_NICK")
IRCPassword = os.Getenv("IRC_PASSWORD")
IRCNetwork = os.Getenv("IRC_NETWORK")
IRCChannel = os.Getenv("IRC_CHANNEL")
DebugMode = os.Getenv("DEBUG_MODE") != ""
)
var (
SlackAPI *slack.Slack
IRCLink *irc.Connection
)
func unescapeMessage(message string) string {
replacer := strings.NewReplacer("&", "&", "<", "<", ">", ">")
return replacer.Replace(message)
}
func PipeSlackToIRC(slackAPI *slack.Slack, ircLink *irc.Connection) {
//sender := make(chan slack.OutgoingMessage)
receiver := make(chan slack.SlackEvent)
wsAPI, err := slackAPI.StartRTM("", "http://example.com")
if err != nil {
log.Fatalf("StartRTM() error: %s", err)
}
go wsAPI.HandleIncomingEvents(receiver)
go wsAPI.Keepalive(10 * time.Second)
for {
msg := <-receiver
switch msg.Data.(type) {
case *slack.MessageEvent:
msgEvent := msg.Data.(*slack.MessageEvent)
// Ignore bot messages, including our own
if msgEvent.BotId != "" {
break
}
fmt.Printf("Message: %s\n", msgEvent)
user, err := slackAPI.GetUserInfo(msgEvent.UserId)
if err != nil {
log.Printf("GetUserInfo(): %s\n", err)
break
}
msg := fmt.Sprintf("(Slack) <%s> %s", user.Profile.RealName, unescapeMessage(msgEvent.Text))
ircLink.Privmsg(IRCChannel, msg)
fmt.Println("Slack -> IRC:", msg)
}
}
}
func SendIRCToSlack(event *irc.Event, slackAPI *slack.Slack) {
params := slack.PostMessageParameters{
Username: fmt.Sprintf("(IRC) %s", event.Nick),
AsUser: true,
}
_, _, err := slackAPI.PostMessage(SlackChannel, event.Message(), params)
if err != nil {
log.Println("SendIRCToSlack:", err)
} else {
fmt.Println("IRC -> Slack:", event.Message())
}
}
func main() {
// Connect to Slack
SlackAPI = slack.New(SlackAPIToken)
SlackAPI.SetDebug(DebugMode)
// Connect to IRC
IRCLink = irc.IRC(IRCNick, IRCNick)
IRCLink.UseTLS = true
IRCLink.Password = IRCPassword
IRCLink.Connect(IRCNetwork)
IRCLink.Join(IRCChannel)
// Setup Callbacks
go PipeSlackToIRC(SlackAPI, IRCLink)
IRCLink.AddCallback("PRIVMSG",
func(event *irc.Event) {
SendIRCToSlack(event, SlackAPI)
})
// Loop FOREVER.
for {
<-time.After(5 * time.Second)
}
}