Skip to content

Commit

Permalink
Splitted event handler into its own function and file (#22)
Browse files Browse the repository at this point in the history
  • Loading branch information
insomniacslk authored May 19, 2018
1 parent cbbfb94 commit d39629e
Show file tree
Hide file tree
Showing 2 changed files with 227 additions and 103 deletions.
121 changes: 121 additions & 0 deletions event_handler.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,121 @@
package main

import (
"fmt"
"log"
"strings"

"github.com/nlopes/slack"
)

func eventHandler(ctx *IrcContext, rtm *slack.RTM) {
log.Print("Started Slack event listener")
for msg := range rtm.IncomingEvents {
switch ev := msg.Data.(type) {
case *slack.MessageEvent:
// get user
var name string
user := ctx.GetUserInfo(ev.Msg.User)
if user == nil {
log.Printf("Error getting user info for %v", ev.Msg.User)
name = ev.Msg.User
} else {
name = user.Name
}
// get channel or other recipient (e.g. recipient of a direct message)
var channame string
if strings.HasPrefix(ev.Msg.Channel, "C") {
// Channel message
// TODO cache channel info
channel, err := ctx.SlackClient.GetChannelInfo(ev.Msg.Channel)
if err != nil {
log.Printf("Error getting channel info for %v: %v", ev.Msg.Channel, err)
channame = "unknown"
} else {
channame = "#" + channel.Name
}
} else if strings.HasPrefix(ev.Msg.Channel, "D") {
// Direct message to me
channame = ctx.Nick
} else {
log.Printf("Unknown recipient ID: %s", ev.Msg.Channel)
return
}

log.Printf("SLACK msg from %v (%v) on %v: %v",
ev.Msg.User,
name,
ev.Msg.Channel,
ev.Msg.Text,
)
if ev.Msg.User == "" && ev.Msg.Text == "" {
log.Printf("WARNING: empty user and message: %+v", ev.Msg)
continue
}
// replace UIDs with user names
text := ev.Msg.Text
// replace UIDs with nicknames
text = rxSlackUser.ReplaceAllStringFunc(text, func(subs string) string {
uid := subs[2 : len(subs)-1]
user := ctx.GetUserInfo(uid)
if user == nil {
return subs
}
return fmt.Sprintf("@%s", user.Name)
})
// replace some HTML entities
text = ExpandText(text)

// FIXME if two instances are connected to the Slack API at the
// same time, this will hide the other instance's message
// believing it was sent from here. But since it's not, both
// local echo and remote message won't be shown
botID := msg.Data.(*slack.MessageEvent).BotID
if name == ctx.Nick && botID != user.Profile.BotID {
// don't print my own messages
continue
}
// handle multi-line messages
for _, line := range strings.Split(text, "\n") {
privmsg := fmt.Sprintf(":%v!%v@%v PRIVMSG %v :%v\r\n",
name, ev.Msg.User, ctx.ServerName,
channame, line,
)
log.Print(privmsg)
ctx.Conn.Write([]byte(privmsg))
}
msgEv := msg.Data.(*slack.MessageEvent)
// Check if the topic has changed
if msgEv.Topic != ctx.Channels[msgEv.Channel].Topic {
// Send out new topic
channel, err := ctx.SlackClient.GetChannelInfo(msgEv.Channel)
if err != nil {
log.Printf("Cannot get channel name for %v", msgEv.Channel)
} else {
newTopic := fmt.Sprintf(":%v TOPIC #%v :%v\r\n", ctx.Mask(), channel.Name, msgEv.Topic)
log.Printf("Got new topic: %v", newTopic)
ctx.Conn.Write([]byte(newTopic))
}
}
// check if new people joined the channel
added, removed := ctx.Channels[msgEv.Channel].MembersDiff(msgEv.Members)
if len(added) > 0 || len(removed) > 0 {
log.Printf("[*] People who joined: %v", added)
log.Printf("[*] People who left: %v", removed)
}
case *slack.ConnectedEvent:
log.Print("Connected to Slack")
ctx.SlackConnected = true
case *slack.DisconnectedEvent:
log.Printf("Disconnected from Slack (intentional: %v)", msg.Data.(*slack.DisconnectedEvent).Intentional)
ctx.SlackConnected = false
ctx.Conn.Close()
case *slack.MemberJoinedChannelEvent, *slack.MemberLeftChannelEvent:
// refresh the users list
// FIXME also send a JOIN / PART message to the IRC client
ctx.GetUsers(true)
default:
log.Printf("SLACK event: %v: %v", msg.Type, msg.Data)
}
}
}
209 changes: 106 additions & 103 deletions irc_server.go
Original file line number Diff line number Diff line change
Expand Up @@ -183,117 +183,120 @@ func IrcAfterLoggingIn(ctx *IrcContext, rtm *slack.RTM) error {
return err
}

go func(rtm *slack.RTM) {
log.Print("Started Slack event listener")
for msg := range rtm.IncomingEvents {
switch ev := msg.Data.(type) {
case *slack.MessageEvent:
// get user
var name string
user := ctx.GetUserInfo(ev.Msg.User)
if user == nil {
log.Printf("Error getting user info for %v", ev.Msg.User)
name = ev.Msg.User
} else {
name = user.Name
}
// get channel or other recipient (e.g. recipient of a direct message)
var channame string
if strings.HasPrefix(ev.Msg.Channel, "C") {
// Channel message
// TODO cache channel info
channel, err := ctx.SlackClient.GetChannelInfo(ev.Msg.Channel)
if err != nil {
log.Printf("Error getting channel info for %v: %v", ev.Msg.Channel, err)
channame = "unknown"
go eventHandler(ctx, rtm)
/*
go func(rtm *slack.RTM) {
log.Print("Started Slack event listener")
for msg := range rtm.IncomingEvents {
switch ev := msg.Data.(type) {
case *slack.MessageEvent:
// get user
var name string
user := ctx.GetUserInfo(ev.Msg.User)
if user == nil {
log.Printf("Error getting user info for %v", ev.Msg.User)
name = ev.Msg.User
} else {
channame = "#" + channel.Name
name = user.Name
}
} else if strings.HasPrefix(ev.Msg.Channel, "D") {
// Direct message to me
channame = ctx.Nick
} else {
log.Printf("Unknown recipient ID: %s", ev.Msg.Channel)
return
}

log.Printf("SLACK msg from %v (%v) on %v: %v",
ev.Msg.User,
name,
ev.Msg.Channel,
ev.Msg.Text,
)
if ev.Msg.User == "" && ev.Msg.Text == "" {
log.Printf("WARNING: empty user and message: %+v", ev.Msg)
continue
}
// replace UIDs with user names
text := ev.Msg.Text
// replace UIDs with nicknames
text = rxSlackUser.ReplaceAllStringFunc(text, func(subs string) string {
uid := subs[2 : len(subs)-1]
user := ctx.GetUserInfo(uid)
if user == nil {
return subs
// get channel or other recipient (e.g. recipient of a direct message)
var channame string
if strings.HasPrefix(ev.Msg.Channel, "C") {
// Channel message
// TODO cache channel info
channel, err := ctx.SlackClient.GetChannelInfo(ev.Msg.Channel)
if err != nil {
log.Printf("Error getting channel info for %v: %v", ev.Msg.Channel, err)
channame = "unknown"
} else {
channame = "#" + channel.Name
}
} else if strings.HasPrefix(ev.Msg.Channel, "D") {
// Direct message to me
channame = ctx.Nick
} else {
log.Printf("Unknown recipient ID: %s", ev.Msg.Channel)
return
}
return fmt.Sprintf("@%s", user.Name)
})
// replace some HTML entities
text = ExpandText(text)
// FIXME if two instances are connected to the Slack API at the
// same time, this will hide the other instance's message
// believing it was sent from here. But since it's not, both
// local echo and remote message won't be shown
botID := msg.Data.(*slack.MessageEvent).BotID
if name == ctx.Nick && botID != user.Profile.BotID {
// don't print my own messages
continue
}
// handle multi-line messages
for _, line := range strings.Split(text, "\n") {
privmsg := fmt.Sprintf(":%v!%v@%v PRIVMSG %v :%v\r\n",
name, ev.Msg.User, ctx.ServerName,
channame, line,
log.Printf("SLACK msg from %v (%v) on %v: %v",
ev.Msg.User,
name,
ev.Msg.Channel,
ev.Msg.Text,
)
log.Print(privmsg)
ctx.Conn.Write([]byte(privmsg))
}
msgEv := msg.Data.(*slack.MessageEvent)
// Check if the topic has changed
if msgEv.Topic != ctx.Channels[msgEv.Channel].Topic {
// Send out new topic
channel, err := ctx.SlackClient.GetChannelInfo(msgEv.Channel)
if err != nil {
log.Printf("Cannot get channel name for %v", msgEv.Channel)
} else {
newTopic := fmt.Sprintf(":%v TOPIC #%v :%v\r\n", ctx.Mask(), channel.Name, msgEv.Topic)
log.Printf("Got new topic: %v", newTopic)
ctx.Conn.Write([]byte(newTopic))
if ev.Msg.User == "" && ev.Msg.Text == "" {
log.Printf("WARNING: empty user and message: %+v", ev.Msg)
continue
}
// replace UIDs with user names
text := ev.Msg.Text
// replace UIDs with nicknames
text = rxSlackUser.ReplaceAllStringFunc(text, func(subs string) string {
uid := subs[2 : len(subs)-1]
user := ctx.GetUserInfo(uid)
if user == nil {
return subs
}
return fmt.Sprintf("@%s", user.Name)
})
// replace some HTML entities
text = ExpandText(text)
// FIXME if two instances are connected to the Slack API at the
// same time, this will hide the other instance's message
// believing it was sent from here. But since it's not, both
// local echo and remote message won't be shown
botID := msg.Data.(*slack.MessageEvent).BotID
if name == ctx.Nick && botID != user.Profile.BotID {
// don't print my own messages
continue
}
// handle multi-line messages
for _, line := range strings.Split(text, "\n") {
privmsg := fmt.Sprintf(":%v!%v@%v PRIVMSG %v :%v\r\n",
name, ev.Msg.User, ctx.ServerName,
channame, line,
)
log.Print(privmsg)
ctx.Conn.Write([]byte(privmsg))
}
msgEv := msg.Data.(*slack.MessageEvent)
// Check if the topic has changed
if msgEv.Topic != ctx.Channels[msgEv.Channel].Topic {
// Send out new topic
channel, err := ctx.SlackClient.GetChannelInfo(msgEv.Channel)
if err != nil {
log.Printf("Cannot get channel name for %v", msgEv.Channel)
} else {
newTopic := fmt.Sprintf(":%v TOPIC #%v :%v\r\n", ctx.Mask(), channel.Name, msgEv.Topic)
log.Printf("Got new topic: %v", newTopic)
ctx.Conn.Write([]byte(newTopic))
}
}
// check if new people joined the channel
added, removed := ctx.Channels[msgEv.Channel].MembersDiff(msgEv.Members)
if len(added) > 0 || len(removed) > 0 {
log.Printf("[*] People who joined: %v", added)
log.Printf("[*] People who left: %v", removed)
}
case *slack.ConnectedEvent:
log.Print("Connected to Slack")
ctx.SlackConnected = true
case *slack.DisconnectedEvent:
log.Printf("Disconnected from Slack (intentional: %v)", msg.Data.(*slack.DisconnectedEvent).Intentional)
ctx.SlackConnected = false
ctx.Conn.Close()
case *slack.MemberJoinedChannelEvent, *slack.MemberLeftChannelEvent:
// refresh the users list
// FIXME also send a JOIN / PART message to the IRC client
ctx.GetUsers(true)
default:
log.Printf("SLACK event: %v: %v", msg.Type, msg.Data)
}
// check if new people joined the channel
added, removed := ctx.Channels[msgEv.Channel].MembersDiff(msgEv.Members)
if len(added) > 0 || len(removed) > 0 {
log.Printf("[*] People who joined: %v", added)
log.Printf("[*] People who left: %v", removed)
}
case *slack.ConnectedEvent:
log.Print("Connected to Slack")
ctx.SlackConnected = true
case *slack.DisconnectedEvent:
log.Printf("Disconnected from Slack (intentional: %v)", msg.Data.(*slack.DisconnectedEvent).Intentional)
ctx.SlackConnected = false
ctx.Conn.Close()
case *slack.MemberJoinedChannelEvent, *slack.MemberLeftChannelEvent:
// refresh the users list
// FIXME also send a JOIN / PART message to the IRC client
ctx.GetUsers(true)
default:
log.Printf("SLACK event: %v: %v", msg.Type, msg.Data)
}
}
}(rtm)
}(rtm)
*/
return nil
}

Expand Down

0 comments on commit d39629e

Please sign in to comment.