commands.go 3.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119
  1. // mautrix-whatsapp - A Matrix-WhatsApp puppeting bridge.
  2. // Copyright (C) 2018 Tulir Asokan
  3. //
  4. // This program is free software: you can redistribute it and/or modify
  5. // it under the terms of the GNU Affero General Public License as published by
  6. // the Free Software Foundation, either version 3 of the License, or
  7. // (at your option) any later version.
  8. //
  9. // This program is distributed in the hope that it will be useful,
  10. // but WITHOUT ANY WARRANTY; without even the implied warranty of
  11. // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
  12. // GNU Affero General Public License for more details.
  13. //
  14. // You should have received a copy of the GNU Affero General Public License
  15. // along with this program. If not, see <https://www.gnu.org/licenses/>.
  16. package main
  17. import (
  18. "strings"
  19. "maunium.net/go/maulogger"
  20. "maunium.net/go/mautrix-appservice"
  21. "maunium.net/go/mautrix-whatsapp/types"
  22. )
  23. type CommandHandler struct {
  24. bridge *Bridge
  25. log maulogger.Logger
  26. }
  27. func NewCommandHandler(bridge *Bridge) *CommandHandler {
  28. return &CommandHandler{
  29. bridge: bridge,
  30. log: bridge.Log.Sub("Command handler"),
  31. }
  32. }
  33. type CommandEvent struct {
  34. Bot *appservice.IntentAPI
  35. Bridge *Bridge
  36. Handler *CommandHandler
  37. RoomID types.MatrixRoomID
  38. User *User
  39. Args []string
  40. }
  41. func (ce *CommandEvent) Reply(msg string) {
  42. _, err := ce.Bot.SendNotice(string(ce.RoomID), msg)
  43. if err != nil {
  44. ce.Handler.log.Warnfln("Failed to reply to command from %s: %v", ce.User.MXID, err)
  45. }
  46. }
  47. func (handler *CommandHandler) Handle(roomID types.MatrixRoomID, user *User, message string) {
  48. args := strings.Split(message, " ")
  49. cmd := strings.ToLower(args[0])
  50. ce := &CommandEvent{
  51. Bot: handler.bridge.Bot,
  52. Bridge: handler.bridge,
  53. Handler: handler,
  54. RoomID: roomID,
  55. User: user,
  56. Args: args[1:],
  57. }
  58. switch cmd {
  59. case "login":
  60. handler.CommandLogin(ce)
  61. case "logout":
  62. handler.CommandLogout(ce)
  63. case "help":
  64. handler.CommandHelp(ce)
  65. default:
  66. ce.Reply("Unknown Command")
  67. }
  68. }
  69. const cmdLoginHelp = `login - Authenticate this Bridge as WhatsApp Web Client`
  70. func (handler *CommandHandler) CommandLogin(ce *CommandEvent) {
  71. if ce.User.Session != nil {
  72. ce.Reply("You're already logged in.")
  73. return
  74. }
  75. ce.User.Connect(true)
  76. ce.User.Login(ce.RoomID)
  77. }
  78. const cmdLogoutHelp = `logout - Logout from WhatsApp`
  79. func (handler *CommandHandler) CommandLogout(ce *CommandEvent) {
  80. if ce.User.Session == nil {
  81. ce.Reply("You're not logged in.")
  82. return
  83. }
  84. err := ce.User.Conn.Logout()
  85. if err != nil {
  86. ce.User.log.Warnln("Error while logging out:", err)
  87. ce.Reply("Error while logging out (see logs for details)")
  88. return
  89. }
  90. ce.User.Conn = nil
  91. ce.User.Session = nil
  92. ce.User.Update()
  93. ce.Reply("Logged out successfully.")
  94. }
  95. const cmdHelpHelp = `help - Prints this help`
  96. // CommandHelp handles !help command
  97. func (handler *CommandHandler) CommandHelp(ce *CommandEvent) {
  98. cmdPrefix := handler.bridge.Config.Bridge.CommandPrefix + " "
  99. ce.Reply(strings.Join([]string{
  100. cmdPrefix + cmdHelpHelp,
  101. cmdPrefix + cmdLoginHelp,
  102. cmdPrefix + cmdLogoutHelp,
  103. }, "\n"))
  104. }