首次推送
This commit is contained in:
@@ -0,0 +1,73 @@
|
||||
package commands
|
||||
|
||||
import (
|
||||
"strings"
|
||||
)
|
||||
|
||||
func ParseCommand(s string) *Command {
|
||||
if s == "" {
|
||||
return nil
|
||||
}
|
||||
|
||||
startIndex := 0
|
||||
for i := range len(s) {
|
||||
if s[i] >= 32 && s[i] <= 126 {
|
||||
startIndex = i
|
||||
|
||||
break
|
||||
}
|
||||
}
|
||||
if startIndex > 0 {
|
||||
s = s[startIndex:]
|
||||
}
|
||||
|
||||
parts := strings.Split(s, " ")
|
||||
if len(parts) == 0 {
|
||||
return nil
|
||||
}
|
||||
|
||||
cmd := &Command{
|
||||
Params: make(map[string]string),
|
||||
}
|
||||
|
||||
// TS3 list responses (clientlist, channellist) arrive as nameless rows of
|
||||
// key=value pairs. Only treat the first token as a command name when it is
|
||||
// NOT a key=value pair; otherwise every token is a parameter.
|
||||
start := 0
|
||||
if !strings.Contains(parts[0], "=") {
|
||||
cmd.Name = parts[0]
|
||||
start = 1
|
||||
}
|
||||
|
||||
for _, p := range parts[start:] {
|
||||
if p == "" {
|
||||
continue
|
||||
}
|
||||
kv := strings.SplitN(p, "=", 2)
|
||||
if len(kv) == 2 {
|
||||
cmd.Params[Unescape(kv[0])] = Unescape(kv[1])
|
||||
} else {
|
||||
cmd.Params[Unescape(p)] = ""
|
||||
}
|
||||
}
|
||||
|
||||
return cmd
|
||||
}
|
||||
|
||||
var unescaper = strings.NewReplacer(
|
||||
"\\\\", "\\",
|
||||
"\\/", "/",
|
||||
"\\s", " ",
|
||||
"\\p", "|",
|
||||
"\\a", "\a",
|
||||
"\\b", "\b",
|
||||
"\\f", "\f",
|
||||
"\\n", "\n",
|
||||
"\\r", "\r",
|
||||
"\\t", "\t",
|
||||
"\\v", "\v",
|
||||
)
|
||||
|
||||
func Unescape(s string) string {
|
||||
return unescaper.Replace(s)
|
||||
}
|
||||
Reference in New Issue
Block a user