Get rid of Listen.
This commit is contained in:
parent
e8d8f03214
commit
8b39278c3e
5 changed files with 31 additions and 63 deletions
17
discord.go
17
discord.go
|
@ -117,20 +117,3 @@ func New(args ...interface{}) (s *Session, err error) {
|
||||||
|
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
// OpenAndListen is a helper method that opens the websocket connection,
|
|
||||||
// does the required handshake and then immediately begins listening.
|
|
||||||
// This is the preferred way to start listening for events and is safe
|
|
||||||
// to be called inside an OnDisconnect handler.
|
|
||||||
func (s *Session) OpenAndListen() (err error) {
|
|
||||||
// Open websocket connection.
|
|
||||||
err = s.Open()
|
|
||||||
if err != nil {
|
|
||||||
return
|
|
||||||
}
|
|
||||||
|
|
||||||
// Listen for events.
|
|
||||||
go s.Listen()
|
|
||||||
|
|
||||||
return
|
|
||||||
}
|
|
||||||
|
|
|
@ -199,8 +199,8 @@ func TestOpenClose(t *testing.T) {
|
||||||
t.Fatalf("TestClose, New(envToken) returned error: %+v", err)
|
t.Fatalf("TestClose, New(envToken) returned error: %+v", err)
|
||||||
}
|
}
|
||||||
|
|
||||||
if err = d.OpenAndListen(); err != nil {
|
if err = d.Open(); err != nil {
|
||||||
t.Fatalf("TestClose, d.OpenAndListen failed: %+v", err)
|
t.Fatalf("TestClose, d.Open failed: %+v", err)
|
||||||
}
|
}
|
||||||
|
|
||||||
if err = d.Close(); err != nil {
|
if err = d.Close(); err != nil {
|
||||||
|
|
|
@ -40,9 +40,6 @@ func main() {
|
||||||
fmt.Println(err)
|
fmt.Println(err)
|
||||||
}
|
}
|
||||||
|
|
||||||
// Listen for events.
|
|
||||||
go dg.Listen()
|
|
||||||
|
|
||||||
// Simple way to keep program running until any key press.
|
// Simple way to keep program running until any key press.
|
||||||
var input string
|
var input string
|
||||||
fmt.Scanln(&input)
|
fmt.Scanln(&input)
|
||||||
|
|
|
@ -32,7 +32,7 @@ func main() {
|
||||||
dg.OnMessageCreate = messageCreate
|
dg.OnMessageCreate = messageCreate
|
||||||
|
|
||||||
// Open the websocket and begin listening.
|
// Open the websocket and begin listening.
|
||||||
dg.OpenAndListen()
|
dg.Open()
|
||||||
|
|
||||||
// Simple way to keep program running until any key press.
|
// Simple way to keep program running until any key press.
|
||||||
var input string
|
var input string
|
||||||
|
|
68
wsapi.go
68
wsapi.go
|
@ -70,6 +70,11 @@ func (s *Session) Open() (err error) {
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Create listening outside of listen, as it needs to happen inside the mutex
|
||||||
|
// lock.
|
||||||
|
s.listening = make(chan interface{})
|
||||||
|
go s.listen(s.listening)
|
||||||
|
|
||||||
s.Unlock()
|
s.Unlock()
|
||||||
|
|
||||||
if s.OnConnect != nil {
|
if s.OnConnect != nil {
|
||||||
|
@ -105,6 +110,29 @@ func (s *Session) Close() (err error) {
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// listen polls the websocket connection for events, it will stop when
|
||||||
|
// the listening channel is closed, or an error occurs.
|
||||||
|
func (s *Session) listen(listening <-chan interface{}) {
|
||||||
|
for {
|
||||||
|
messageType, message, err := s.wsConn.ReadMessage()
|
||||||
|
if err != nil {
|
||||||
|
// There has been an error reading, Close() the websocket so that
|
||||||
|
// OnDisconnect is fired.
|
||||||
|
s.Close()
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
select {
|
||||||
|
case <-listening:
|
||||||
|
return
|
||||||
|
default:
|
||||||
|
go s.event(messageType, message)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
type updateStatusGame struct {
|
type updateStatusGame struct {
|
||||||
Name string `json:"name"`
|
Name string `json:"name"`
|
||||||
}
|
}
|
||||||
|
@ -142,46 +170,6 @@ func (s *Session) UpdateStatus(idle int, game string) (err error) {
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
// Listen starts listening to the websocket connection for events.
|
|
||||||
func (s *Session) Listen() (err error) {
|
|
||||||
s.RLock()
|
|
||||||
|
|
||||||
if s.wsConn == nil {
|
|
||||||
s.RUnlock()
|
|
||||||
return errors.New("No websocket connection exists.")
|
|
||||||
}
|
|
||||||
if s.listening != nil {
|
|
||||||
s.RUnlock()
|
|
||||||
return errors.New("Already listening to websocket.")
|
|
||||||
}
|
|
||||||
|
|
||||||
s.listening = make(chan interface{})
|
|
||||||
|
|
||||||
s.RUnlock()
|
|
||||||
|
|
||||||
// Keep a reference, as s.listening can be nilled out.
|
|
||||||
listening := s.listening
|
|
||||||
|
|
||||||
for {
|
|
||||||
messageType, message, err1 := s.wsConn.ReadMessage()
|
|
||||||
if err1 != nil {
|
|
||||||
err = err1
|
|
||||||
// Defer so we get better log ordering.
|
|
||||||
defer s.Close()
|
|
||||||
return fmt.Errorf("Websocket Listen Error", err)
|
|
||||||
}
|
|
||||||
|
|
||||||
select {
|
|
||||||
case <-listening:
|
|
||||||
return
|
|
||||||
default:
|
|
||||||
go s.event(messageType, message)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
return
|
|
||||||
}
|
|
||||||
|
|
||||||
// Not sure how needed this is and where it would be best to call it.
|
// Not sure how needed this is and where it would be best to call it.
|
||||||
// somewhere.
|
// somewhere.
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue