diff --git a/cmd/bot/main.go b/cmd/bot/main.go index f1edd0a..10fcb53 100644 --- a/cmd/bot/main.go +++ b/cmd/bot/main.go @@ -29,13 +29,13 @@ func main() { Token: *pageToken, }) - m.Handle(messenger.TextAction, func(m messenger.Message, r *messenger.Response) { + m.HandleMessage(func(m messenger.Message, r *messenger.Response) { fmt.Printf("%v (Sent, %v)\n", m.Text, m.Time.Format(time.UnixDate)) fmt.Println(r.Text("Hello, World!")) }) - m.Handle(messenger.DeliveryAction, func(m messenger.Message, r *messenger.Response) { - fmt.Println(m.Delivery.Watermark.Format(time.UnixDate)) + m.HandleDelivery(func(d messenger.Delivery, r *messenger.Response) { + fmt.Println(d.Watermark.Format(time.UnixDate)) }) fmt.Println("Serving messenger bot on localhost:8080") diff --git a/message.go b/message.go index bc43581..1e2556d 100644 --- a/message.go +++ b/message.go @@ -8,7 +8,6 @@ type Message struct { Time time.Time Text string Seq int - Delivery *Delivery } type Delivery struct { diff --git a/messenger.go b/messenger.go index 71d5956..6e2442f 100644 --- a/messenger.go +++ b/messenger.go @@ -18,18 +18,19 @@ type MessengerOptions struct { } type MessageHandler func(Message, *Response) +type DeliveryHandler func(Delivery, *Response) type Messenger struct { - mux *http.ServeMux - handlers map[Action]MessageHandler - token string + mux *http.ServeMux + messageHandlers []MessageHandler + deliveryHandlers []DeliveryHandler + token string } func New(mo MessengerOptions) *Messenger { m := &Messenger{ - mux: http.NewServeMux(), - handlers: make(map[Action]MessageHandler), - token: mo.Token, + mux: http.NewServeMux(), + token: mo.Token, } if mo.Verify { @@ -41,8 +42,12 @@ func New(mo MessengerOptions) *Messenger { return m } -func (m *Messenger) Handle(a Action, f MessageHandler) { - m.handlers[a] = f +func (m *Messenger) HandleMessage(f MessageHandler) { + m.messageHandlers = append(m.messageHandlers, f) +} + +func (m *Messenger) HandleDelivery(f DeliveryHandler) { + m.deliveryHandlers = append(m.deliveryHandlers, f) } func (m *Messenger) Handler() http.Handler { @@ -78,30 +83,29 @@ func (m *Messenger) dispatch(r Receive) { continue } - if f := m.handlers[a]; f != nil { - message := Message{ - Sender: info.Sender, - Recipient: info.Recipient, - Time: time.Unix(info.Timestamp, 0), - } + resp := &Response{ + to: Recipient{info.Sender.ID}, + token: m.token, + } - switch a { - case TextAction: - message.Text = info.Message.Text - case DeliveryAction: - message.Delivery = &Delivery{ + switch a { + case TextAction: + for _, f := range m.messageHandlers { + f(Message{ + Sender: info.Sender, + Recipient: info.Recipient, + Time: time.Unix(info.Timestamp, 0), + Text: info.Message.Text, + }, resp) + } + case DeliveryAction: + for _, f := range m.deliveryHandlers { + f(Delivery{ Mids: info.Delivery.Mids, Seq: info.Delivery.Seq, Watermark: time.Unix(info.Delivery.Watermark, 0), - } + }, resp) } - - response := &Response{ - to: Recipient{info.Sender.ID}, - token: m.token, - } - - f(message, response) } } }