Slackbot支持用引号引起来的参数

时间:2018-08-01 22:38:21

标签: go slack slack-api

我正在尝试编写一个slackbot。我已经尝试了来自github的各种框架,但是我使用过的最有前途的似乎是hanu

我想做的就是像这样向机器人发送消息:

@bot <command> "Something" "Another thing that contains spaces" "A final thing with spaces"

然后我希望将这三个参数中的每一个作为字符串传递给var,然后var具有可以执行的句柄函数。

我似乎无法做到这一点!上面链接的hanu框架似乎使用this框架,其中指出:

  

分配库支持占位符和正则表达式   参数匹配和解析。

但是因为我是一个糟糕的开发人员,所以我似乎无法在上面的框架中弄清楚该怎么做,因为没有示例。

所以我希望能够:

  • 弄清楚如何使用带有这些参数的上述库,以便我可以开始构建一些东西
  • 编写一个bot命令,自己使用github.com/nlopes/slack接受此类参数并传递我自己的处理函数。

1 个答案:

答案 0 :(得分:1)

一种方法是滥用strings.FieldsFunc(...),以仅在引号中未包含空格的情况下拆分字符串:

func main() {
  s := `@bot <command> "Something" "Another thing that contains spaces, it's great" "A final thing with spaces"`

  tokens := splitWithQuotes(s)
  for i, t := range tokens {
    fmt.Printf("OK: tokens[%d] = %s\n", i, t)
  }
  // OK: tokens[0] = @bot
  // OK: tokens[1] = <command>
  // OK: tokens[2] = "Something"
  // OK: tokens[3] = "Another thing that contains spaces, it's great"
  // OK: tokens[4] = "A final thing with spaces"
}

func splitWithQuotes(s string) []string {
  inquote := false
  return strings.FieldsFunc(s, func(c rune) bool {
    switch {
    case c == '"':
      inquote = !inquote
      return false
    case inquote:
      return false
    default:
      return unicode.IsSpace(c)
    }
  })
}

严格来说,此方法可能不适用于所有版本的golang,因为根据文档:

  

如果f对于给定的c没有返回一致的结果,则FieldsFunc可能会崩溃。

...并且此函数肯定会返回不同的空格字符结果;但是,它似乎可以在1.9和更高版本上使用,所以我想这取决于您对冒险的兴趣!