Skip to content

Commit

Permalink
feat(api): add telegram badge
Browse files Browse the repository at this point in the history
  • Loading branch information
ernado committed Apr 17, 2024
1 parent f77ae00 commit 048ead7
Show file tree
Hide file tree
Showing 12 changed files with 500 additions and 55 deletions.
14 changes: 14 additions & 0 deletions _oas/openapi.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -25,6 +25,20 @@ paths:
$ref: "#/components/schemas/Status"
default:
$ref: "#/components/responses/Error"
/badge/telegram/gotd:
get:
operationId: "getTelegramGoTDBadge"
description: "get svg badge for gotd telegram groups"
responses:
200:
description: Go Faster Badge
content:
"image/svg+xml":
schema:
type: string
format: binary
default:
$ref: "#/components/responses/Error"
components:
responses:
Error:
Expand Down
9 changes: 8 additions & 1 deletion internal/api/api.go
Original file line number Diff line number Diff line change
Expand Up @@ -3,18 +3,25 @@ package api
import (
"context"

"github.com/gotd/td/telegram"
"github.com/ogen-go/ogen/http"

"github.com/go-faster/bot/internal/ent"
"github.com/go-faster/bot/internal/oas"
)

func NewServer(db *ent.Client) *Server {
func NewServer(db *ent.Client, tg *telegram.Client, ht http.Client) *Server {
return &Server{
db: db,
tg: tg,
ht: ht,
}
}

type Server struct {
db *ent.Client
tg *telegram.Client
ht http.Client
}

func (s Server) NewError(ctx context.Context, err error) *oas.ErrorStatusCode {
Expand Down
55 changes: 55 additions & 0 deletions internal/api/badge.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,55 @@
package api

import (
"bytes"
"context"
"fmt"
"io"
"net/http"
"net/url"
"strings"

"github.com/go-faster/errors"

"github.com/go-faster/bot/internal/oas"
)

func toBadgeStr(v string) string {
v = strings.ReplaceAll(v, " ", "_")
return v
}

func generateBadgePath(name, text, style string) string {
return "/badge/" + strings.Join([]string{
toBadgeStr(name),
toBadgeStr(text),
style,
}, "-")
}

func (s Server) GetTelegramGoTDBadge(ctx context.Context) (oas.GetTelegramGoTDBadgeOK, error) {
_ = s.tg // TODO(ernado): fetch actual data.
var (
message = "tg"
members = 236 + 234 + 15
)
u := &url.URL{
Scheme: "https",
Host: "img.shields.io",
Path: generateBadgePath(message, fmt.Sprintf("%d members", members), "blue"),
}
req, err := http.NewRequestWithContext(ctx, http.MethodGet, u.String(), http.NoBody)
if err != nil {
return oas.GetTelegramGoTDBadgeOK{}, errors.Wrap(err, "create request")
}
res, err := s.ht.Do(req)
if err != nil {
return oas.GetTelegramGoTDBadgeOK{}, errors.Wrap(err, "send request")
}
defer func() { _ = res.Body.Close() }()
data, err := io.ReadAll(res.Body)
if err != nil {
return oas.GetTelegramGoTDBadgeOK{}, errors.Wrap(err, "read body")
}
return oas.GetTelegramGoTDBadgeOK{Data: bytes.NewReader(data)}, nil
}
67 changes: 36 additions & 31 deletions internal/cmd/internal/server/app.go
Original file line number Diff line number Diff line change
Expand Up @@ -55,21 +55,22 @@ import (
)

type App struct {
client *telegram.Client
token string
raw *tg.Client
sender *message.Sender
dispatcher tg.UpdateDispatcher
mux *dispatch.MessageMux
tracer trace.Tracer
openai *openai.Client
m *sdkapp.Metrics
lg *zap.Logger
wh *gh.Webhook
db *ent.Client
cache *redis.Client
gaps *updates.Manager
rdy *Readiness
client *telegram.Client
token string
raw *tg.Client
sender *message.Sender
dispatcher tg.UpdateDispatcher
mux *dispatch.MessageMux
tracer trace.Tracer
openai *openai.Client
m *sdkapp.Metrics
lg *zap.Logger
wh *gh.Webhook
db *ent.Client
cache *redis.Client
gaps *updates.Manager
rdy *Readiness
httpTransport *otelhttp.Transport
}

func initApp(m *sdkapp.Metrics, lg *zap.Logger) (_ *App, rerr error) {
Expand Down Expand Up @@ -187,21 +188,22 @@ func initApp(m *sdkapp.Metrics, lg *zap.Logger) (_ *App, rerr error) {
}

a := &App{
cache: r,
db: db,
client: client,
gaps: updatesHandler,
token: token,
raw: raw,
sender: sender,
dispatcher: dispatcher,
mux: mux,
m: m,
lg: lg,
wh: webhook,
openai: openai.NewClientWithConfig(openaiConfig),
rdy: new(Readiness),
tracer: m.TracerProvider().Tracer(""),
cache: r,
db: db,
client: client,
gaps: updatesHandler,
token: token,
raw: raw,
sender: sender,
dispatcher: dispatcher,
mux: mux,
m: m,
lg: lg,
wh: webhook,
openai: openai.NewClientWithConfig(openaiConfig),
rdy: new(Readiness),
tracer: m.TracerProvider().Tracer(""),
httpTransport: httpTransport,
}

var h dispatch.MessageHandler = app.NewMiddleware(mux, dd, m, app.MiddlewareOptions{
Expand Down Expand Up @@ -320,7 +322,10 @@ func (a *App) Run(ctx context.Context) error {
if httpAddr == "" {
httpAddr = "localhost:8080"
}
h, err := oas.NewServer(api.NewServer(a.db),
httpClient := &http.Client{
Transport: a.httpTransport,
}
h, err := oas.NewServer(api.NewServer(a.db, a.client, httpClient),
oas.WithMeterProvider(a.m.MeterProvider()),
oas.WithTracerProvider(a.m.TracerProvider()),
)
Expand Down
78 changes: 78 additions & 0 deletions internal/oas/oas_client_gen.go

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

98 changes: 98 additions & 0 deletions internal/oas/oas_handlers_gen.go

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

Loading

0 comments on commit 048ead7

Please sign in to comment.