dispatch/pkg/irc/ctcp.go
2020-05-23 09:42:20 +02:00

70 lines
1.3 KiB
Go

package irc
import (
"fmt"
"strings"
"time"
)
// ClientInfo is the CTCP messages this client implements
const ClientInfo = "ACTION CLIENTINFO DCC FINGER PING SOURCE TIME VERSION USERINFO"
type CTCP struct {
Command string
Params string
}
func DecodeCTCP(str string) *CTCP {
if len(str) > 1 && str[0] == 0x01 {
parts := strings.SplitN(strings.Trim(str, "\x01"), " ", 2)
ctcp := CTCP{}
if parts[0] != "" {
ctcp.Command = parts[0]
} else {
return nil
}
if len(parts) == 2 {
ctcp.Params = parts[1]
}
return &ctcp
}
return nil
}
func EncodeCTCP(ctcp *CTCP) string {
if ctcp == nil || ctcp.Command == "" {
return ""
}
return fmt.Sprintf("\x01%s %s\x01", ctcp.Command, ctcp.Params)
}
func (c *Client) handleCTCP(ctcp *CTCP, msg *Message) {
switch ctcp.Command {
case "CLIENTINFO":
c.ReplyCTCP(msg.Nick, ctcp.Command, ClientInfo)
case "FINGER", "VERSION":
if c.Config.Version != "" {
c.ReplyCTCP(msg.Nick, ctcp.Command, c.Config.Version)
}
case "PING":
c.ReplyCTCP(msg.Nick, ctcp.Command, ctcp.Params)
case "SOURCE":
if c.Config.Source != "" {
c.ReplyCTCP(msg.Nick, ctcp.Command, c.Config.Source)
}
case "TIME":
c.ReplyCTCP(msg.Nick, ctcp.Command, time.Now().UTC().Format(time.RFC3339))
case "USERINFO":
c.ReplyCTCP(msg.Nick, ctcp.Command, fmt.Sprintf("%s (%s)", c.GetNick(), c.Config.Realname))
}
}