zulip-checkin-cyborg/zulip/zulip.go
2023-03-01 15:39:46 -03:00

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
}