Ctrl K
ComunidadGuías…

configEditor_automessage.go

Rama master · réplica de lectura del repositorio original.

Archivo original ↗Preguntar a KiBot
package main

import (
	"encoding/json"
	"fmt"
	"net/http"

	"github.com/gofrs/uuid/v3"
	"github.com/gorilla/mux"
	log "github.com/sirupsen/logrus"

	"github.com/Luzifer/twitch-bot/v3/plugins"
)

func registerEditorAutoMessageRoutes() {
	for _, rd := range []plugins.HTTPRouteRegistrationArgs{
		{
			Description:         "Returns the current set of configured auto-messages in JSON format",
			HandlerFunc:         configEditorHandleAutoMessagesGet,
			Method:              http.MethodGet,
			Module:              moduleConfigEditor,
			Name:                "Get current auto-messages",
			Path:                "/auto-messages",
			RequiresEditorsAuth: true,
			ResponseType:        plugins.HTTPRouteResponseTypeJSON,
		},
		{
			Description:         "Adds a new Auto-Message",
			HandlerFunc:         configEditorHandleAutoMessageAdd,
			Method:              http.MethodPost,
			Module:              moduleConfigEditor,
			Name:                "Add Auto-Message",
			Path:                "/auto-messages",
			RequiresEditorsAuth: true,
			ResponseType:        plugins.HTTPRouteResponseTypeTextPlain,
		},
		{
			Description:         "Deletes the given Auto-Message",
			HandlerFunc:         configEditorHandleAutoMessageDelete,
			Method:              http.MethodDelete,
			Module:              moduleConfigEditor,
			Name:                "Delete Auto-Message",
			Path:                "/auto-messages/{uuid}",
			RequiresEditorsAuth: true,
			ResponseType:        plugins.HTTPRouteResponseTypeTextPlain,
			RouteParams: []plugins.HTTPRouteParamDocumentation{
				{
					Description: "UUID of the auto-message to delete",
					Name:        "uuid",
					Required:    false,
					Type:        "string",
				},
			},
		},
		{
			Description:         "Updates the given Auto-Message",
			HandlerFunc:         configEditorHandleAutoMessageUpdate,
			Method:              http.MethodPut,
			Module:              moduleConfigEditor,
			Name:                "Update Auto-Message",
			Path:                "/auto-messages/{uuid}",
			RequiresEditorsAuth: true,
			ResponseType:        plugins.HTTPRouteResponseTypeTextPlain,
			RouteParams: []plugins.HTTPRouteParamDocumentation{
				{
					Description: "UUID of the auto-message to update",
					Name:        "uuid",
					Required:    false,
					Type:        "string",
				},
			},
		},
	} {
		if err := registerRoute(rd); err != nil {
			log.WithError(err).Fatal("Unable to register config editor route")
		}
	}
}

func configEditorHandleAutoMessageAdd(w http.ResponseWriter, r *http.Request) {
	user, _, err := getAuthorizedUserFromRequest(r)
	if err != nil {
		http.Error(w, fmt.Errorf("getting authorized user: %w", err).Error(), http.StatusInternalServerError)
		return
	}

	msg := &autoMessage{}
	if err := json.NewDecoder(r.Body).Decode(msg); err != nil {
		http.Error(w, err.Error(), http.StatusBadRequest)
		return
	}

	msg.UUID = uuid.Must(uuid.NewV4()).String()

	if err := patchConfig(cfg.Config, user, "", "Add auto-message", func(c *configFile) error {
		c.AutoMessages = append(c.AutoMessages, msg)
		return nil
	}); err != nil {
		http.Error(w, err.Error(), http.StatusInternalServerError)
		return
	}

	w.WriteHeader(http.StatusCreated)
}

func configEditorHandleAutoMessageDelete(w http.ResponseWriter, r *http.Request) {
	user, _, err := getAuthorizedUserFromRequest(r)
	if err != nil {
		http.Error(w, fmt.Errorf("getting authorized user: %w", err).Error(), http.StatusInternalServerError)
		return
	}

	if err := patchConfig(cfg.Config, user, "", "Delete auto-message", func(c *configFile) error {
		var (
			id  = mux.Vars(r)["uuid"]
			tmp []*autoMessage
		)

		for i := range c.AutoMessages {
			if c.AutoMessages[i].ID() == id {
				continue
			}
			tmp = append(tmp, c.AutoMessages[i])
		}

		c.AutoMessages = tmp

		return nil
	}); err != nil {
		http.Error(w, err.Error(), http.StatusInternalServerError)
		return
	}

	w.WriteHeader(http.StatusNoContent)
}

func configEditorHandleAutoMessagesGet(w http.ResponseWriter, _ *http.Request) {
	w.Header().Set("Content-Type", "application/json")
	if err := json.NewEncoder(w).Encode(config.AutoMessages); err != nil {
		http.Error(w, err.Error(), http.StatusInternalServerError)
	}
}

func configEditorHandleAutoMessageUpdate(w http.ResponseWriter, r *http.Request) {
	user, _, err := getAuthorizedUserFromRequest(r)
	if err != nil {
		http.Error(w, fmt.Errorf("getting authorized user: %w", err).Error(), http.StatusInternalServerError)
		return
	}

	msg := &autoMessage{}
	if err := json.NewDecoder(r.Body).Decode(msg); err != nil {
		http.Error(w, err.Error(), http.StatusBadRequest)
		return
	}

	if err := patchConfig(cfg.Config, user, "", "Update auto-message", func(c *configFile) error {
		id := mux.Vars(r)["uuid"]

		for i := range c.AutoMessages {
			if c.AutoMessages[i].ID() == id {
				c.AutoMessages[i] = msg
			}
		}

		return nil
	}); err != nil {
		http.Error(w, err.Error(), http.StatusInternalServerError)
		return
	}

	w.WriteHeader(http.StatusNoContent)
}