Fix tight loop (gitter). Closes #68.

This commit is contained in:
Wim 2016-11-02 16:12:43 +01:00
parent 8e606e3cef
commit 1b15897135
8 changed files with 76 additions and 30 deletions

View File

@ -1,9 +1,9 @@
package bgitter package bgitter
import ( import (
"github.com/42wim/go-gitter"
"github.com/42wim/matterbridge/bridge/config" "github.com/42wim/matterbridge/bridge/config"
log "github.com/Sirupsen/logrus" log "github.com/Sirupsen/logrus"
"github.com/sromku/go-gitter"
"strings" "strings"
) )

View File

@ -192,7 +192,7 @@ func (gitter *Gitter) SendMessage(roomID, text string) error {
message := Message{Text: text} message := Message{Text: text}
body, _ := json.Marshal(message) body, _ := json.Marshal(message)
err := gitter.post(gitter.config.apiBaseURL+"rooms/"+roomID+"/chatMessages", body) _, err := gitter.post(gitter.config.apiBaseURL+"rooms/"+roomID+"/chatMessages", body)
if err != nil { if err != nil {
gitter.log(err) gitter.log(err)
return err return err
@ -202,31 +202,37 @@ func (gitter *Gitter) SendMessage(roomID, text string) error {
} }
// JoinRoom joins a room // JoinRoom joins a room
func (gitter *Gitter) JoinRoom(uri string) (*Room, error) { func (gitter *Gitter) JoinRoom(roomID, userID string) (*Room, error) {
message := Room{URI: uri} message := Room{ID: roomID}
body, _ := json.Marshal(message) body, _ := json.Marshal(message)
err := gitter.post(apiBaseURL+"rooms", body) response, err := gitter.post(gitter.config.apiBaseURL+"user/"+userID+"/rooms", body)
if err != nil { if err != nil {
gitter.log(err) gitter.log(err)
return nil, err return nil, err
} }
rooms, err := gitter.GetRooms() var room Room
err = json.Unmarshal(response, &room)
if err != nil { if err != nil {
gitter.log(err) gitter.log(err)
return nil, err return nil, err
} }
for _, room := range rooms {
if room.URI == uri {
return &room, nil return &room, nil
} }
// LeaveRoom removes a user from the room
func (gitter *Gitter) LeaveRoom(roomID, userID string) error {
_, err := gitter.delete(gitter.config.apiBaseURL + "rooms/" + roomID + "/users/" + userID)
if err != nil {
gitter.log(err)
return err
} }
err = APIError{What: fmt.Sprintf("Joined room (%v) not found in list of rooms", uri)} return nil
gitter.log(err)
return nil, err
} }
// SetDebug traces errors if it's set to true. // SetDebug traces errors if it's set to true.
@ -319,11 +325,11 @@ func (gitter *Gitter) get(url string) ([]byte, error) {
return body, nil return body, nil
} }
func (gitter *Gitter) post(url string, body []byte) error { func (gitter *Gitter) post(url string, body []byte) ([]byte, error) {
r, err := http.NewRequest("POST", url, bytes.NewBuffer(body)) r, err := http.NewRequest("POST", url, bytes.NewBuffer(body))
if err != nil { if err != nil {
gitter.log(err) gitter.log(err)
return err return nil, err
} }
r.Header.Set("Content-Type", "application/json") r.Header.Set("Content-Type", "application/json")
@ -333,17 +339,56 @@ func (gitter *Gitter) post(url string, body []byte) error {
resp, err := gitter.config.client.Do(r) resp, err := gitter.config.client.Do(r)
if err != nil { if err != nil {
gitter.log(err) gitter.log(err)
return err return nil, err
} }
defer resp.Body.Close() defer resp.Body.Close()
if resp.StatusCode != http.StatusOK { if resp.StatusCode != http.StatusOK {
err = APIError{What: fmt.Sprintf("Status code: %v", resp.StatusCode)} err = APIError{What: fmt.Sprintf("Status code: %v", resp.StatusCode)}
gitter.log(err) gitter.log(err)
return err return nil, err
} }
return nil result, err := ioutil.ReadAll(resp.Body)
if err != nil {
gitter.log(err)
return nil, err
}
return result, nil
}
func (gitter *Gitter) delete(url string) ([]byte, error) {
r, err := http.NewRequest("delete", url, nil)
if err != nil {
gitter.log(err)
return nil, err
}
r.Header.Set("Content-Type", "application/json")
r.Header.Set("Accept", "application/json")
r.Header.Set("Authorization", "Bearer "+gitter.config.token)
resp, err := gitter.config.client.Do(r)
if err != nil {
gitter.log(err)
return nil, err
}
defer resp.Body.Close()
if resp.StatusCode != http.StatusOK {
err = APIError{What: fmt.Sprintf("Status code: %v", resp.StatusCode)}
gitter.log(err)
return nil, err
}
result, err := ioutil.ReadAll(resp.Body)
if err != nil {
gitter.log(err)
return nil, err
}
return result, nil
} }
func (gitter *Gitter) log(a interface{}) { func (gitter *Gitter) log(a interface{}) {

View File

@ -57,6 +57,11 @@ Loop:
//"The JSON stream returns messages as JSON objects that are delimited by carriage return (\r)" <- Not true crap it's (\n) only //"The JSON stream returns messages as JSON objects that are delimited by carriage return (\r)" <- Not true crap it's (\n) only
reader = bufio.NewReader(resp.Body) reader = bufio.NewReader(resp.Body)
line, err := reader.ReadBytes('\n') line, err := reader.ReadBytes('\n')
if err != nil {
gitter.log("ReadBytes error: " + err.Error())
stream.connect()
continue
}
//Check if the line only consists of whitespace //Check if the line only consists of whitespace
onlyWhitespace := true onlyWhitespace := true
@ -77,10 +82,6 @@ Loop:
} else if stream.isClosed() { } else if stream.isClosed() {
gitter.log("Stream closed") gitter.log("Stream closed")
continue continue
} else if err != nil {
gitter.log("ReadBytes error: " + err.Error())
stream.connect()
continue
} }
// unmarshal the streamed data // unmarshal the streamed data

16
vendor/manifest vendored
View File

@ -1,6 +1,14 @@
{ {
"version": 0, "version": 0,
"dependencies": [ "dependencies": [
{
"importpath": "github.com/42wim/go-gitter",
"repository": "https://github.com/42wim/go-gitter",
"vcs": "git",
"revision": "ae777f740326ef6b4d910496022649859232ff38",
"branch": "fixloop",
"notests": true
},
{ {
"importpath": "github.com/42wim/matterbridge-plus/bridge", "importpath": "github.com/42wim/matterbridge-plus/bridge",
"repository": "https://github.com/42wim/matterbridge-plus", "repository": "https://github.com/42wim/matterbridge-plus",
@ -158,14 +166,6 @@
"branch": "master", "branch": "master",
"notests": true "notests": true
}, },
{
"importpath": "github.com/sromku/go-gitter",
"repository": "https://github.com/sromku/go-gitter",
"vcs": "git",
"revision": "932bf9af423ac2da1544cb73540b3b08b1bdb181",
"branch": "master",
"notests": true
},
{ {
"importpath": "github.com/thoj/go-ircevent", "importpath": "github.com/thoj/go-ircevent",
"repository": "https://github.com/thoj/go-ircevent", "repository": "https://github.com/thoj/go-ircevent",