tools_quickpost_bin/cmd/pastes/main.go

148 lines
3.6 KiB
Go

package pastes
import (
"bytes"
"encoding/json"
"fmt"
"io"
"net/http"
"net/url"
"os"
"strings"
"github.com/urfave/cli/v2"
)
const (
API_BASE_URL = "https://bin.tritan.gg/api"
HTML_BASE_URL = "https://bin.tritan.gg"
)
func CreateNewPaste(c *cli.Context) error {
if c.NArg() < 1 {
return fmt.Errorf("content argument is required")
}
inputData := c.Args().First()
req, err := http.NewRequest("POST", API_BASE_URL+"/quick", bytes.NewBuffer([]byte(inputData)))
if err != nil {
return fmt.Errorf("failed to create request: %v", err)
}
req.Header.Set("Content-Type", "application/json")
req.Header.Set("User-Agent", "quickpaste/1.0")
resp, err := http.DefaultClient.Do(req)
if err != nil {
return fmt.Errorf("failed to create paste: %v", err)
}
defer resp.Body.Close()
contentType := resp.Header.Get("Content-Type")
if !strings.Contains(contentType, "application/json") {
bodyBytes, _ := io.ReadAll(resp.Body)
return fmt.Errorf("unexpected response: %s", string(bodyBytes))
}
var response PasteResponse
if err := json.NewDecoder(resp.Body).Decode(&response); err != nil {
return fmt.Errorf("failed to decode response: %v", err)
}
if response.Error {
return fmt.Errorf("API error: %s", response.Message)
}
fmt.Printf("Pasted - ID: %s\nLink: %s\n", response.Data.ID, HTML_BASE_URL+"/"+response.Data.ID)
return nil
}
func GetPaste(c *cli.Context) error {
if c.NArg() < 1 {
return fmt.Errorf("paste ID is required")
}
pasteID := c.Args().First()
rawOutput := c.Bool("raw")
urlFlag := c.Bool("url")
if urlFlag {
parsedURL, err := url.Parse(pasteID)
if err != nil {
return fmt.Errorf("invalid URL: %v", err)
}
parts := strings.Split(strings.Trim(parsedURL.Path, "/"), "/")
if len(parts) == 0 || parts[0] == "" {
return fmt.Errorf("failed to extract paste id from URL")
}
pasteID = parts[0]
}
req, err := http.NewRequest("GET", fmt.Sprintf("%s/pastes/%s", API_BASE_URL, pasteID), nil)
if err != nil {
return fmt.Errorf("failed to create request: %v", err)
}
req.Header.Set("Content-Type", "application/json")
req.Header.Set("User-Agent", "quickpaste/1.0")
resp, err := http.DefaultClient.Do(req)
if err != nil {
return fmt.Errorf("failed to get paste: %v", err)
}
defer resp.Body.Close()
var response PasteResponse
if err := json.NewDecoder(resp.Body).Decode(&response); err != nil {
return fmt.Errorf("failed to decode response: %v", err)
}
if response.Error {
return fmt.Errorf("API error: %s", response.Message)
}
if rawOutput {
fmt.Println(response.Data.Content)
} else {
fmt.Printf("Content: %s\nCreated at: %s\n", response.Data.Content, response.Data.CreatedAt.Format("2006-01-02 15:04:05"))
}
return nil
}
func ReadFileAndCreatePaste(c *cli.Context) error {
if c.NArg() < 1 {
return fmt.Errorf("file path is required")
}
filePath := c.Args().First()
content, err := os.ReadFile(filePath)
if err != nil {
return fmt.Errorf("failed to read file: %v", err)
}
req, err := http.NewRequest("POST", API_BASE_URL+"/quick", bytes.NewBuffer([]byte(content)))
if err != nil {
return fmt.Errorf("failed to create request: %v", err)
}
req.Header.Set("Content-Type", "application/json")
req.Header.Set("User-Agent", "quickpaste/1.0")
resp, err := http.DefaultClient.Do(req)
if err != nil {
return fmt.Errorf("failed to create paste: %v", err)
}
var response PasteResponse
if err := json.NewDecoder(resp.Body).Decode(&response); err != nil {
return fmt.Errorf("failed to decode response: %v", err)
}
if response.Error {
return fmt.Errorf("API error: %s", response.Message)
}
fmt.Printf("Pasted file - ID: %s\nLink: %s\n", response.Data.ID, HTML_BASE_URL+"/"+response.Data.ID)
return nil
}