A modular Twitch bot made in Go
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

84 lines
1.6 KiB

package twitchbot
import (
"strings"
)
type Command struct {
Tags map[string]string
Prefix string
Command string
Args []string
Suffix string
}
func (c *Command) String() string {
return "Prefix: " + c.Prefix + " Command: " + c.Command + " Args: " + strings.Join(c.Args, " ") + " Suffix: " + c.Suffix
}
func ReadString(reader *strings.Reader, until byte) string {
result := strings.Builder{}
char, ok := reader.ReadByte()
for ok == nil {
if char == until {
break
}
result.WriteByte(char)
char, ok = reader.ReadByte()
}
return result.String()
}
func ReadTags(reader *strings.Reader) map[string]string {
result := make(map[string]string)
for {
tag := ReadString(reader, '=')
if tag == "" {
break
}
value := ReadString(reader, ';')
result[tag] = value
}
return result
}
func ParsePacket(packet string) *Command {
reader := strings.NewReader(packet)
command := Command{}
args := make([]string, 15)
arg := 0
char, ok := reader.ReadByte()
for ok == nil {
if char == ':' && command.Prefix == "" && command.Command == "" {
command.Prefix = ReadString(reader, ' ')
} else if char == '@' && command.Tags == nil {
command.Tags = ReadTags(strings.NewReader(ReadString(reader, ' ')))
} else if command.Command == "" {
_, err := reader.Seek(-1, 1)
if err != nil {
continue
}
command.Command = ReadString(reader, ' ')
} else if char == ':' {
command.Suffix = ReadString(reader, '\r')
} else {
_, err := reader.Seek(-1, 1)
if err != nil {
continue
}
args[arg] = ReadString(reader, ' ')
arg++
}
char, ok = reader.ReadByte()
}
command.Args = args
return &command
}