|
|
- 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
- }
|