help.go 2.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110
  1. package mux
  2. import (
  3. "fmt"
  4. "sort"
  5. "strconv"
  6. "git.mgmcomp.net/thisnthat/discordgo"
  7. )
  8. func (r *Router) helpCommandHandler(s *discordgo.Session, m *discordgo.Message, ctx *Context) {
  9. displayPrefix := ""
  10. switch ctx.Method {
  11. case DirectMethod:
  12. displayPrefix = ""
  13. case PrefixMethod:
  14. displayPrefix = r.prefix
  15. case MentionMethod:
  16. displayPrefix = fmt.Sprintf("@%s ", s.State.User.Username)
  17. }
  18. maxDisplayLen := 0
  19. cmdmap := make(map[string]*route)
  20. catMap := make(map[string][]string)
  21. var cats []string
  22. var isAdmin = r.isAdminRoute(s, m, ctx)
  23. for _, v := range r.categories {
  24. keys := make([]string, 0, len(r.routes))
  25. for _, route := range r.routes {
  26. // If the route is hidde, do not add it to the help list
  27. if route.Hidden {
  28. continue
  29. }
  30. if route.Admin && !isAdmin {
  31. continue
  32. }
  33. if route.CategoryID == v.ID {
  34. l := len(route.Usage) // TODO: Add the +args part :)
  35. if l > maxDisplayLen {
  36. maxDisplayLen = l
  37. }
  38. cmdmap[route.Name] = route
  39. keys = append(keys, route.Name)
  40. }
  41. }
  42. if len(keys) > 0 {
  43. sort.Strings(keys)
  44. catMap[v.Description] = keys
  45. cats = append(cats, v.Description)
  46. }
  47. }
  48. keys := make([]string, 0, len(r.routes))
  49. for _, route := range r.routes {
  50. if route.CategoryID == 0 {
  51. l := len(route.Usage) // TODO: Add the +args part :)
  52. if l > maxDisplayLen {
  53. maxDisplayLen = l
  54. }
  55. cmdmap[route.Name] = route
  56. keys = append(keys, route.Name)
  57. }
  58. }
  59. v, ok := cmdmap["help"]
  60. if ok {
  61. keys = append([]string{v.Name}, keys...)
  62. }
  63. v, ok = cmdmap["about"]
  64. if ok {
  65. keys = append([]string{v.Name}, keys...)
  66. }
  67. if len(keys) > 0 {
  68. sort.Strings(keys)
  69. catMap[""] = keys
  70. cats = append(cats, "")
  71. }
  72. maxDisplayLen = maxDisplayLen + 3
  73. // TODO: Learn more link needs to be configurable
  74. resp := "```autoit\n"
  75. // Add sorted result to help msg
  76. for _, catKey := range cats {
  77. if catKey != "" {
  78. resp += fmt.Sprintf("\n%s\n", catKey)
  79. } else {
  80. resp += "\n\n"
  81. }
  82. routes := catMap[catKey]
  83. for _, routeKey := range routes {
  84. route := cmdmap[routeKey]
  85. resp += fmt.Sprintf("%s%-"+strconv.Itoa(maxDisplayLen)+"s # %s\n", displayPrefix, route.Usage, route.Description)
  86. }
  87. }
  88. resp += "```\n"
  89. s.ChannelMessageSend(m.ChannelID, resp)
  90. }