dispatch/message_handler.go

148 lines
2.8 KiB
Go
Raw Normal View History

2015-01-17 01:37:21 +00:00
package main
import (
"bytes"
"fmt"
"strings"
"github.com/khlieng/irc/storage"
)
func handleMessages(irc *IRC, session *Session) {
userBuffers := make(map[string][]string)
var motd MOTD
var motdContent bytes.Buffer
for msg := range irc.Messages {
switch msg.Command {
case JOIN:
user := parseUser(msg.Prefix)
session.sendJSON("join", Join{
Server: irc.Host,
User: user,
Channels: msg.Params,
})
channelStore.AddUser(user, irc.Host, msg.Params[0])
if user == irc.nick {
session.user.AddChannel(storage.Channel{
Server: irc.Host,
Name: msg.Params[0],
})
}
case PART:
user := parseUser(msg.Prefix)
session.sendJSON("part", Join{
Server: irc.Host,
User: user,
Channels: msg.Params,
})
channelStore.RemoveUser(user, irc.Host, msg.Params[0])
if user == irc.nick {
session.user.RemoveChannel(irc.Host, msg.Params[0])
}
case PRIVMSG, NOTICE:
if msg.Params[0] == irc.nick {
session.sendJSON("pm", Chat{
Server: irc.Host,
From: msg.Prefix,
Message: msg.Trailing,
})
} else {
session.sendJSON("message", Chat{
Server: irc.Host,
From: msg.Prefix,
To: msg.Params[0],
Message: msg.Trailing,
})
}
case QUIT:
/*
session.sendJSON("quit", Quit{
Server: irc.Host,
User: user,
})
*/
case RPL_WELCOME,
RPL_YOURHOST,
RPL_LUSERCLIENT,
RPL_LUSEROP,
RPL_LUSERUNKNOWN,
RPL_LUSERCHANNELS,
RPL_LUSERME:
session.sendJSON("pm", Chat{
Server: irc.Host,
From: msg.Prefix,
Message: strings.Join(append(msg.Params[1:], msg.Trailing), " "),
})
case RPL_TOPIC:
session.sendJSON("topic", Topic{
Server: irc.Host,
Channel: msg.Params[1],
Topic: msg.Trailing,
})
case RPL_NAMREPLY:
users := strings.Split(msg.Trailing, " ")
for i, user := range users {
users[i] = strings.TrimLeft(user, "@+")
}
userBuffer := userBuffers[msg.Params[2]]
userBuffers[msg.Params[2]] = append(userBuffer, users...)
case RPL_ENDOFNAMES:
channel := msg.Params[1]
users := userBuffers[channel]
session.sendJSON("users", Userlist{
Server: irc.Host,
Channel: channel,
Users: users,
})
channelStore.SetUsers(users, irc.Host, channel)
delete(userBuffers, channel)
case RPL_MOTDSTART:
motd.Server = irc.Host
motd.Title = msg.Trailing
case RPL_MOTD:
motdContent.WriteString(msg.Trailing)
motdContent.WriteRune('\n')
case RPL_ENDOFMOTD:
motd.Content = motdContent.String()
session.sendJSON("motd", motd)
motdContent.Reset()
motd = MOTD{}
default:
printMessage(msg, irc)
}
}
}
func printMessage(msg *Message, irc *IRC) {
fmt.Printf("%s: %s %s %s\n", irc.nick, msg.Prefix, msg.Command, msg.Params)
if msg.Trailing != "" {
fmt.Println(msg.Trailing)
}
fmt.Println()
}