148 lines
2.8 KiB
Go
148 lines
2.8 KiB
Go
|
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()
|
||
|
}
|