handler.go 4.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169
  1. package whatsapp
  2. import (
  3. "fmt"
  4. "github.com/Rhymen/go-whatsapp/binary"
  5. "github.com/Rhymen/go-whatsapp/binary/proto"
  6. "os"
  7. )
  8. /*
  9. The Handler interface is the minimal interface that needs to be implemented
  10. to be accepted as a valid handler for our dispatching system.
  11. The minimal handler is used to dispatch error messages. These errors occur on unexpected behavior by the websocket
  12. connection or if we are unable to handle or interpret an incoming message. Error produced by user actions are not
  13. dispatched through this handler. They are returned as an error on the specific function call.
  14. */
  15. type Handler interface {
  16. HandleError(err error)
  17. }
  18. /*
  19. The TextMessageHandler interface needs to be implemented to receive text messages dispatched by the dispatcher.
  20. */
  21. type TextMessageHandler interface {
  22. Handler
  23. HandleTextMessage(message TextMessage)
  24. }
  25. /*
  26. The ImageMessageHandler interface needs to be implemented to receive image messages dispatched by the dispatcher.
  27. */
  28. type ImageMessageHandler interface {
  29. Handler
  30. HandleImageMessage(message ImageMessage)
  31. }
  32. /*
  33. The VideoMessageHandler interface needs to be implemented to receive video messages dispatched by the dispatcher.
  34. */
  35. type VideoMessageHandler interface {
  36. Handler
  37. HandleVideoMessage(message VideoMessage)
  38. }
  39. /*
  40. The AudioMessageHandler interface needs to be implemented to receive audio messages dispatched by the dispatcher.
  41. */
  42. type AudioMessageHandler interface {
  43. Handler
  44. HandleAudioMessage(message AudioMessage)
  45. }
  46. /*
  47. The DocumentMessageHandler interface needs to be implemented to receive document messages dispatched by the dispatcher.
  48. */
  49. type DocumentMessageHandler interface {
  50. Handler
  51. HandleDocumentMessage(message DocumentMessage)
  52. }
  53. /*
  54. The JsonMessageHandler interface needs to be implemented to receive json messages dispatched by the dispatcher.
  55. These json messages contain status updates of every kind sent by WhatsAppWeb servers. WhatsAppWeb uses these messages
  56. to built a Store, which is used to save these "secondary" information. These messages may contain
  57. presence (available, last see) information, or just the battery status of your phone.
  58. */
  59. type JsonMessageHandler interface {
  60. Handler
  61. HandleJsonMessage(message string)
  62. }
  63. /**
  64. The RawMessageHandler interface needs to be implemented to receive raw messages dispatched by the dispatcher.
  65. Raw messages are the raw protobuf structs instead of the easy-to-use structs in TextMessageHandler, ImageMessageHandler, etc..
  66. */
  67. type RawMessageHandler interface {
  68. Handler
  69. HandleRawMessage(message *proto.WebMessageInfo)
  70. }
  71. /*
  72. AddHandler adds an handler to the list of handler that receive dispatched messages.
  73. The provided handler must at least implement the Handler interface. Additionally implemented
  74. handlers(TextMessageHandler, ImageMessageHandler) are optional. At runtime it is checked if they are implemented
  75. and they are called if so and needed.
  76. */
  77. func (wac *Conn) AddHandler(handler Handler) {
  78. wac.handler = append(wac.handler, handler)
  79. }
  80. func (wac *Conn) handle(message interface{}) {
  81. switch m := message.(type) {
  82. case error:
  83. for _, h := range wac.handler {
  84. go h.HandleError(m)
  85. }
  86. case string:
  87. for _, h := range wac.handler {
  88. if x, ok := h.(JsonMessageHandler); ok {
  89. go x.HandleJsonMessage(m)
  90. }
  91. }
  92. case TextMessage:
  93. for _, h := range wac.handler {
  94. if x, ok := h.(TextMessageHandler); ok {
  95. go x.HandleTextMessage(m)
  96. }
  97. }
  98. case ImageMessage:
  99. for _, h := range wac.handler {
  100. if x, ok := h.(ImageMessageHandler); ok {
  101. go x.HandleImageMessage(m)
  102. }
  103. }
  104. case VideoMessage:
  105. for _, h := range wac.handler {
  106. if x, ok := h.(VideoMessageHandler); ok {
  107. go x.HandleVideoMessage(m)
  108. }
  109. }
  110. case AudioMessage:
  111. for _, h := range wac.handler {
  112. if x, ok := h.(AudioMessageHandler); ok {
  113. go x.HandleAudioMessage(m)
  114. }
  115. }
  116. case DocumentMessage:
  117. for _, h := range wac.handler {
  118. if x, ok := h.(DocumentMessageHandler); ok {
  119. go x.HandleDocumentMessage(m)
  120. }
  121. }
  122. case *proto.WebMessageInfo:
  123. for _, h := range wac.handler {
  124. if x, ok := h.(RawMessageHandler); ok {
  125. go x.HandleRawMessage(m)
  126. }
  127. }
  128. }
  129. }
  130. func (wac *Conn) dispatch(msg interface{}) {
  131. if msg == nil {
  132. return
  133. }
  134. switch message := msg.(type) {
  135. case *binary.Node:
  136. if message.Description == "action" {
  137. if con, ok := message.Content.([]interface{}); ok {
  138. for a := range con {
  139. if v, ok := con[a].(*proto.WebMessageInfo); ok {
  140. wac.handle(v)
  141. wac.handle(parseProtoMessage(v))
  142. }
  143. }
  144. }
  145. } else if message.Description == "response" && message.Attributes["type"] == "contacts" {
  146. wac.updateContacts(message.Content)
  147. }
  148. case error:
  149. wac.handle(message)
  150. case string:
  151. wac.handle(message)
  152. default:
  153. fmt.Fprintf(os.Stderr, "unknown type in dipatcher chan: %T", msg)
  154. }
  155. }