132 lines
2.7 KiB
Go
132 lines
2.7 KiB
Go
package zulip
|
|
|
|
import (
|
|
"encoding/base64"
|
|
"encoding/json"
|
|
"errors"
|
|
"fmt"
|
|
"io"
|
|
"log"
|
|
"net/http"
|
|
"net/url"
|
|
"strings"
|
|
)
|
|
|
|
type Bot struct {
|
|
Url string
|
|
Email string
|
|
Key string
|
|
HTTPClient http.Client
|
|
}
|
|
|
|
func (b *Bot) url() *url.URL {
|
|
u, err := url.Parse(b.Url)
|
|
if err != nil {
|
|
log.Fatalln(u)
|
|
}
|
|
return u
|
|
}
|
|
func (b *Bot) authHeaders(h http.Header) {
|
|
h.Add("authorization", "basic "+base64.StdEncoding.EncodeToString([]byte(b.Email+":"+b.Key)))
|
|
}
|
|
|
|
func (b *Bot) SendMessage(stream, topic, message string) error {
|
|
u := b.url()
|
|
u.Path = "/api/v1/messages"
|
|
|
|
values := url.Values{
|
|
"type": []string{"stream"},
|
|
"to": []string{stream},
|
|
"topic": []string{topic},
|
|
"content": []string{message},
|
|
}
|
|
req, err := http.NewRequest("POST", u.String(), strings.NewReader(values.Encode()))
|
|
if err != nil {
|
|
log.Fatalln(err)
|
|
}
|
|
req.Header.Add("content-type", "application/x-www-form-urlencoded")
|
|
b.authHeaders(req.Header)
|
|
|
|
res, err := b.HTTPClient.Do(req)
|
|
if err != nil {
|
|
log.Println("Error enviando mensaje", err)
|
|
return err
|
|
}
|
|
if res.StatusCode != http.StatusOK {
|
|
log.Printf("Zulip tiró un %d", res.StatusCode)
|
|
}
|
|
byt, err := io.ReadAll(res.Body)
|
|
if err != nil {
|
|
log.Println("Error enviando mensaje", err)
|
|
return err
|
|
}
|
|
log.Printf("Response: %s", string(byt))
|
|
return nil
|
|
}
|
|
|
|
type getStreamIdRes struct {
|
|
SteamId int `json:"stream_id"`
|
|
}
|
|
|
|
func (b *Bot) GetStreamId(name string) (int, error) {
|
|
u := b.url()
|
|
u.Path = "/api/v1/get_stream_id"
|
|
|
|
values := url.Values{"stream": []string{name}}
|
|
u.RawQuery = values.Encode()
|
|
req, err := http.NewRequest("GET", u.String(), nil)
|
|
if err != nil {
|
|
log.Fatalln(err)
|
|
}
|
|
b.authHeaders(req.Header)
|
|
|
|
res, err := b.HTTPClient.Do(req)
|
|
if err != nil {
|
|
return 0, err
|
|
}
|
|
if res.StatusCode != http.StatusOK {
|
|
return 0, errors.New(fmt.Sprintf("Zulip tiró un %d", res.StatusCode))
|
|
}
|
|
|
|
r := getStreamIdRes{}
|
|
err = json.NewDecoder(res.Body).Decode(&r)
|
|
if err != nil {
|
|
return 0, err
|
|
}
|
|
return r.SteamId, nil
|
|
}
|
|
|
|
type getStreamTopicsRes struct {
|
|
Topics []GetStreamTopicsResStream `json:"topics"`
|
|
}
|
|
type GetStreamTopicsResStream struct {
|
|
Name string `json:"name"`
|
|
}
|
|
|
|
func (b *Bot) GetStreamTopics(streamId int) ([]GetStreamTopicsResStream, error) {
|
|
var r getStreamTopicsRes
|
|
|
|
u := b.url()
|
|
u.Path = fmt.Sprintf("/api/v1/users/me/%d/topics", streamId)
|
|
|
|
req, err := http.NewRequest("GET", u.String(), nil)
|
|
if err != nil {
|
|
log.Fatalln(err)
|
|
}
|
|
b.authHeaders(req.Header)
|
|
|
|
res, err := b.HTTPClient.Do(req)
|
|
if err != nil {
|
|
return r.Topics, err
|
|
}
|
|
if res.StatusCode != http.StatusOK {
|
|
return r.Topics, errors.New(fmt.Sprintf("Zulip tiró un %d", res.StatusCode))
|
|
}
|
|
|
|
err = json.NewDecoder(res.Body).Decode(&r)
|
|
if err != nil {
|
|
return r.Topics, err
|
|
}
|
|
return r.Topics, nil
|
|
}
|