You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
Crowdin/plugin.go

89 lines
1.8 KiB

package main
import (
"bytes"
"encoding/xml"
"fmt"
"github.com/JonasFranzDEV/drone-crowdin/responses"
"golang.org/x/net/html/charset"
"io"
"mime/multipart"
"net/http"
"os"
)
type (
Files map[string]string
Config struct {
Key string
Identifier string
}
Plugin struct {
Config Config
Files Files
}
)
func (c Config) ToURL() string {
return fmt.Sprintf("https://api.crowdin.com/api/project/%s/update-file?key=%s", c.Identifier, c.Key)
}
func (p Plugin) Exec() error {
if len(p.Files) > 20 {
return fmt.Errorf("20 files max are allowed to upload. %d files given", len(p.Files))
}
body := &bytes.Buffer{}
writer := multipart.NewWriter(body)
for crowdin_path, path := range p.Files {
var err error
var file *os.File
if file, err = os.Open(path); err != nil {
return err
}
defer file.Close()
part, err := writer.CreateFormFile(fmt.Sprintf("files[%s]", crowdin_path), crowdin_path)
if err != nil {
return err
}
if _, err = io.Copy(part, file); err != nil {
return err
}
if err = writer.Close(); err != nil {
return err
}
}
var req *http.Request
var err error
if req, err = http.NewRequest("POST", p.Config.ToURL(), body); err != nil {
return err
}
req.Header.Set("Content-Type", writer.FormDataContentType())
client := &http.Client{}
resp, err := client.Do(req)
if err != nil {
return err
}
body = &bytes.Buffer{}
if _, err := body.ReadFrom(resp.Body); err != nil {
return err
}
if err := resp.Body.Close(); err != nil {
return err
}
if resp.StatusCode != 200 {
var err_response = new(responses.Error)
decoder := xml.NewDecoder(body)
decoder.CharsetReader = charset.NewReaderLabel
if err := decoder.Decode(&err_response); err != nil {
return err
}
return err_response
}
return nil
}