mirror of
https://github.com/awfufu/qbot.git
synced 2026-03-01 13:29:43 +08:00
97 lines
1.8 KiB
Go
97 lines
1.8 KiB
Go
package qbot
|
|
|
|
import (
|
|
"net/http"
|
|
"strings"
|
|
"time"
|
|
)
|
|
|
|
type Sender struct {
|
|
httpClient *http.Client
|
|
apiEndpoint string
|
|
}
|
|
|
|
type Receiver struct {
|
|
httpServer *http.Server
|
|
|
|
// Channels for events
|
|
message chan *Message
|
|
emojiLike chan *EmojiReaction
|
|
recall chan *RecallNotice
|
|
poke chan *PokeNotify
|
|
err chan error // Channel for server errors
|
|
}
|
|
|
|
func HttpClient(url string) *Sender {
|
|
url = strings.TrimRight(url, "/")
|
|
return &Sender{
|
|
httpClient: &http.Client{
|
|
Transport: &http.Transport{
|
|
MaxIdleConns: 10,
|
|
MaxIdleConnsPerHost: 10,
|
|
IdleConnTimeout: 90 * time.Second,
|
|
DisableKeepAlives: false,
|
|
},
|
|
Timeout: 10 * time.Second,
|
|
},
|
|
apiEndpoint: url,
|
|
}
|
|
}
|
|
|
|
func HttpServer(address string) *Receiver {
|
|
rx := &Receiver{
|
|
message: make(chan *Message, 100),
|
|
emojiLike: make(chan *EmojiReaction, 100),
|
|
recall: make(chan *RecallNotice, 100),
|
|
poke: make(chan *PokeNotify, 100),
|
|
err: make(chan error, 1),
|
|
}
|
|
|
|
rx.httpServer = &http.Server{
|
|
Addr: address,
|
|
Handler: http.HandlerFunc(rx.handleHttpEvent),
|
|
ReadTimeout: 10 * time.Second,
|
|
WriteTimeout: 10 * time.Second,
|
|
}
|
|
|
|
// Start server in goroutine
|
|
go func() {
|
|
if err := rx.httpServer.ListenAndServe(); err != nil && err != http.ErrServerClosed {
|
|
rx.err <- err
|
|
}
|
|
close(rx.err)
|
|
close(rx.message)
|
|
close(rx.emojiLike)
|
|
close(rx.recall)
|
|
close(rx.poke)
|
|
}()
|
|
|
|
return rx
|
|
}
|
|
|
|
// Event Channels
|
|
|
|
func (r *Receiver) OnMessage() <-chan *Message {
|
|
return r.message
|
|
}
|
|
|
|
func (r *Receiver) OnEmojiReaction() <-chan *EmojiReaction {
|
|
return r.emojiLike
|
|
}
|
|
|
|
func (r *Receiver) OnRecall() <-chan *RecallNotice {
|
|
return r.recall
|
|
}
|
|
|
|
func (r *Receiver) OnPoke() <-chan *PokeNotify {
|
|
return r.poke
|
|
}
|
|
|
|
func (r *Receiver) Error() <-chan error {
|
|
return r.err
|
|
}
|
|
|
|
func (r *Receiver) Close() error {
|
|
return r.httpServer.Close()
|
|
}
|