move to a generic http requestor
This commit is contained in:
parent
d182ca2efb
commit
df72df5e62
@ -1,12 +1,9 @@
|
|||||||
package plugins
|
package plugins
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"encoding/json"
|
|
||||||
"fmt"
|
"fmt"
|
||||||
"io/ioutil"
|
|
||||||
"log"
|
"log"
|
||||||
"math/rand"
|
"math/rand"
|
||||||
"net/http"
|
|
||||||
"net/url"
|
"net/url"
|
||||||
"regexp"
|
"regexp"
|
||||||
"time"
|
"time"
|
||||||
@ -95,30 +92,6 @@ func (h *Beer) Match(user, msg string) bool {
|
|||||||
return re.MatchString(msg)
|
return re.MatchString(msg)
|
||||||
}
|
}
|
||||||
|
|
||||||
func (h *Beer) get(beer string) (*BeerResp, error) {
|
|
||||||
u := "https://data.opendatasoft.com/api/records/1.0/search?dataset=open-beer-database%40public-us&q="
|
|
||||||
u = fmt.Sprintf("%s%s", u, url.PathEscape(beer))
|
|
||||||
resp, err := http.Get(u)
|
|
||||||
if err != nil {
|
|
||||||
return nil, err
|
|
||||||
}
|
|
||||||
|
|
||||||
defer resp.Body.Close()
|
|
||||||
|
|
||||||
body, err := ioutil.ReadAll(resp.Body)
|
|
||||||
if err != nil {
|
|
||||||
return nil, err
|
|
||||||
}
|
|
||||||
|
|
||||||
var beers = &BeerResp{}
|
|
||||||
err = json.Unmarshal([]byte(body), beers)
|
|
||||||
if err != nil {
|
|
||||||
return nil, err
|
|
||||||
}
|
|
||||||
|
|
||||||
return beers, nil
|
|
||||||
}
|
|
||||||
|
|
||||||
func (h *Beer) pretty(b BeerResp, random bool) string {
|
func (h *Beer) pretty(b BeerResp, random bool) string {
|
||||||
idx := 0
|
idx := 0
|
||||||
|
|
||||||
@ -148,18 +121,28 @@ func (h *Beer) RespondText(c *gomatrix.Client, ev *gomatrix.Event, user, post st
|
|||||||
beer := h.fix(post)
|
beer := h.fix(post)
|
||||||
if beer != "" {
|
if beer != "" {
|
||||||
log.Printf("%s: responding to '%s'", h.Name(), ev.Sender)
|
log.Printf("%s: responding to '%s'", h.Name(), ev.Sender)
|
||||||
brr, err := h.get(beer)
|
var beers = &BeerResp{}
|
||||||
|
u := fmt.Sprintf("%s%s",
|
||||||
|
"https://data.opendatasoft.com/api/records/1.0/search?dataset=open-beer-database%40public-us&q=",
|
||||||
|
url.PathEscape(beer),
|
||||||
|
)
|
||||||
|
req := HTTPRequest{
|
||||||
|
Method: "GET",
|
||||||
|
ResBody: beers,
|
||||||
|
URL: u,
|
||||||
|
}
|
||||||
|
err := req.DoJSON()
|
||||||
if err != nil {
|
if err != nil {
|
||||||
SendText(c, ev.RoomID, fmt.Sprintf("sorry %s, I can't look for beer. (%s)", ev.Sender, err))
|
SendText(c, ev.RoomID, fmt.Sprintf("sorry %s, I can't look for beer. (%s)", ev.Sender, err))
|
||||||
}
|
}
|
||||||
|
|
||||||
switch {
|
switch {
|
||||||
case brr.Nhits == 0:
|
case beers.Nhits == 0:
|
||||||
SendText(c, ev.RoomID, "¯\\_(ツ)_/¯")
|
SendText(c, ev.RoomID, "¯\\_(ツ)_/¯")
|
||||||
case brr.Nhits == 1:
|
case beers.Nhits == 1:
|
||||||
SendText(c, ev.RoomID, h.pretty(*brr, false))
|
SendText(c, ev.RoomID, h.pretty(*beers, false))
|
||||||
case brr.Nhits > 1:
|
case beers.Nhits > 1:
|
||||||
SendText(c, ev.RoomID, fmt.Sprintf("Found %d beers, here is a random one:\n%s", brr.Nhits, h.pretty(*brr, true)))
|
SendText(c, ev.RoomID, fmt.Sprintf("Found %d beers, here is a random one:\n%s", beers.Nhits, h.pretty(*beers, true)))
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -1,17 +0,0 @@
|
|||||||
package plugins
|
|
||||||
|
|
||||||
import (
|
|
||||||
"testing"
|
|
||||||
)
|
|
||||||
|
|
||||||
func TestBeer(t *testing.T) {
|
|
||||||
beer := &Beer{}
|
|
||||||
b, err := beer.get("oskar blues")
|
|
||||||
if err != nil {
|
|
||||||
t.Errorf("%+v\n", err)
|
|
||||||
}
|
|
||||||
|
|
||||||
if b.Nhits == 0 {
|
|
||||||
t.Errorf("Expected 7 results; got %d\n", b.Nhits)
|
|
||||||
}
|
|
||||||
}
|
|
@ -1,11 +1,8 @@
|
|||||||
package plugins
|
package plugins
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"encoding/json"
|
|
||||||
"fmt"
|
"fmt"
|
||||||
"io/ioutil"
|
|
||||||
"log"
|
"log"
|
||||||
"net/http"
|
|
||||||
"net/url"
|
"net/url"
|
||||||
"regexp"
|
"regexp"
|
||||||
"time"
|
"time"
|
||||||
@ -51,33 +48,6 @@ func (h *Feder) Match(user, msg string) bool {
|
|||||||
return re.MatchString(msg)
|
return re.MatchString(msg)
|
||||||
}
|
}
|
||||||
|
|
||||||
func (h *Feder) get(hserver string) (*FedResp, error) {
|
|
||||||
u := "https://federationtester.matrix.org/api/report?server_name="
|
|
||||||
u = fmt.Sprintf("%s%s", u, url.PathEscape(hserver))
|
|
||||||
hClient := http.Client{
|
|
||||||
Timeout: time.Duration(5 * time.Second),
|
|
||||||
}
|
|
||||||
resp, err := hClient.Get(u)
|
|
||||||
if err != nil {
|
|
||||||
return nil, err
|
|
||||||
}
|
|
||||||
|
|
||||||
defer resp.Body.Close()
|
|
||||||
|
|
||||||
body, err := ioutil.ReadAll(resp.Body)
|
|
||||||
if err != nil {
|
|
||||||
return nil, err
|
|
||||||
}
|
|
||||||
|
|
||||||
var fresp = &FedResp{}
|
|
||||||
err = json.Unmarshal([]byte(body), fresp)
|
|
||||||
if err != nil {
|
|
||||||
return nil, err
|
|
||||||
}
|
|
||||||
|
|
||||||
return fresp, nil
|
|
||||||
}
|
|
||||||
|
|
||||||
// SetStore we don't need a store here.
|
// SetStore we don't need a store here.
|
||||||
func (h *Feder) SetStore(s PluginStore) {}
|
func (h *Feder) SetStore(s PluginStore) {}
|
||||||
|
|
||||||
@ -94,7 +64,21 @@ func (h *Feder) RespondText(c *gomatrix.Client, ev *gomatrix.Event, user, post s
|
|||||||
homeServer = u.Hostname()
|
homeServer = u.Hostname()
|
||||||
|
|
||||||
log.Printf("%s: responding to '%s'", h.Name(), ev.Sender)
|
log.Printf("%s: responding to '%s'", h.Name(), ev.Sender)
|
||||||
fed, err := h.get(homeServer)
|
|
||||||
|
furl := fmt.Sprintf("%s%s",
|
||||||
|
"https://federationtester.matrix.org/api/report?server_name=",
|
||||||
|
url.PathEscape(homeServer),
|
||||||
|
)
|
||||||
|
var fed = &FedResp{}
|
||||||
|
|
||||||
|
var req = HTTPRequest{
|
||||||
|
Timeout: 5 * time.Second,
|
||||||
|
URL: furl,
|
||||||
|
Method: "GET",
|
||||||
|
ResBody: fed,
|
||||||
|
}
|
||||||
|
err = req.DoJSON()
|
||||||
|
|
||||||
if err != nil {
|
if err != nil {
|
||||||
SendText(c, ev.RoomID, fmt.Sprintf("sorry %s, I can't look up the federation status (%s)", ev.Sender, err))
|
SendText(c, ev.RoomID, fmt.Sprintf("sorry %s, I can't look up the federation status (%s)", ev.Sender, err))
|
||||||
return
|
return
|
||||||
|
@ -1,8 +1,12 @@
|
|||||||
package plugins
|
package plugins
|
||||||
|
|
||||||
import (
|
import (
|
||||||
|
"bytes"
|
||||||
|
"encoding/json"
|
||||||
|
"net/http"
|
||||||
"regexp"
|
"regexp"
|
||||||
"strings"
|
"strings"
|
||||||
|
"time"
|
||||||
|
|
||||||
"github.com/matrix-org/gomatrix"
|
"github.com/matrix-org/gomatrix"
|
||||||
)
|
)
|
||||||
@ -47,6 +51,60 @@ func ToMe(user, message string) bool {
|
|||||||
return strings.Contains(message, u)
|
return strings.Contains(message, u)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// HTTPRequest has the bits for making http requests
|
||||||
|
type HTTPRequest struct {
|
||||||
|
Client http.Client
|
||||||
|
Request *http.Request
|
||||||
|
Timeout time.Duration
|
||||||
|
URL string
|
||||||
|
Method string
|
||||||
|
ReqBody interface{}
|
||||||
|
ResBody interface{}
|
||||||
|
}
|
||||||
|
|
||||||
|
// DoJSON is a general purpose http mechanic that can be used to get, post..
|
||||||
|
// what evs. The response is always expected to be json
|
||||||
|
func (h *HTTPRequest) DoJSON() (err error) {
|
||||||
|
h.Client.Timeout = h.Timeout
|
||||||
|
|
||||||
|
if h.Method == "" {
|
||||||
|
h.Method = "GET"
|
||||||
|
}
|
||||||
|
|
||||||
|
if h.ReqBody != nil {
|
||||||
|
// We have a request to send to the server
|
||||||
|
buf := new(bytes.Buffer)
|
||||||
|
err = json.NewEncoder(buf).Encode(h.ReqBody)
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
h.Request, err = http.NewRequest(h.Method, h.URL, buf)
|
||||||
|
} else {
|
||||||
|
// Just gimme dem datas
|
||||||
|
h.Request, err = http.NewRequest(h.Method, h.URL, nil)
|
||||||
|
}
|
||||||
|
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
|
h.Request.Header.Set("Content-Type", "application/json")
|
||||||
|
|
||||||
|
res, err := h.Client.Do(h.Request)
|
||||||
|
if res != nil {
|
||||||
|
defer res.Body.Close()
|
||||||
|
}
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
|
if h.ResBody != nil && res.Body != nil {
|
||||||
|
return json.NewDecoder(res.Body).Decode(&h.ResBody)
|
||||||
|
}
|
||||||
|
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
// SendText sends a text message to a given room. It pretends to be
|
// SendText sends a text message to a given room. It pretends to be
|
||||||
// "typing" by calling UserTyping for the caller.
|
// "typing" by calling UserTyping for the caller.
|
||||||
func SendText(c *gomatrix.Client, roomID, message string) error {
|
func SendText(c *gomatrix.Client, roomID, message string) error {
|
||||||
|
@ -1,6 +1,9 @@
|
|||||||
package plugins
|
package plugins
|
||||||
|
|
||||||
import (
|
import (
|
||||||
|
"fmt"
|
||||||
|
"net/http"
|
||||||
|
"net/http/httptest"
|
||||||
"testing"
|
"testing"
|
||||||
)
|
)
|
||||||
|
|
||||||
@ -16,3 +19,30 @@ func TestPluginsNameRE(t *testing.T) {
|
|||||||
t.Errorf("NameRE expected 'test'; got %q\n", n)
|
t.Errorf("NameRE expected 'test'; got %q\n", n)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
type testResp struct {
|
||||||
|
Name string `json:"test"`
|
||||||
|
}
|
||||||
|
|
||||||
|
func TestHTTPRequestDoJSON(t *testing.T) {
|
||||||
|
ts := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
|
||||||
|
fmt.Fprintln(w, `{"test":"success"}`)
|
||||||
|
}))
|
||||||
|
defer ts.Close()
|
||||||
|
|
||||||
|
var tr = &testResp{}
|
||||||
|
|
||||||
|
req := HTTPRequest{
|
||||||
|
ResBody: tr,
|
||||||
|
URL: ts.URL,
|
||||||
|
}
|
||||||
|
|
||||||
|
err := req.DoJSON()
|
||||||
|
if err != nil {
|
||||||
|
t.Error(err)
|
||||||
|
}
|
||||||
|
|
||||||
|
if tr.Name != "success" {
|
||||||
|
t.Errorf("Expected 'test'; got '%s'\n", tr.Name)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user