package main
import (
"archive/zip"
"encoding/json"
"fmt"
"github.com/fatih/color"
"github.com/go-resty/resty/v2"
"github.com/manifoldco/promptui"
"io"
"math"
"os"
"path/filepath"
"time"
)
type Config struct {
Id string `json:"id"`
CollectionId string `json:"collectionId"`
CollectionName string `json:"collectionName"`
Created string `json:"created"`
Updated string `json:"updated"`
Owner string `json:"owner"`
LastUpdate string `json:"last_update"`
Zip string `json:"zip"`
}
type ListResponse struct {
Page int `json:"page"`
PerPage int `json:"perPage"`
TotalPages int `json:"totalPages"`
TotalItems int `json:"totalItems"`
Items []Config `json:"items"`
}
func (receiver Config) DisplayLastUpdate() string {
lastUpdate, _ := time.Parse(time.DateTime, receiver.LastUpdate[:len(receiver.LastUpdate)-1])
diff := time.Now().Sub(lastUpdate)
days := int(math.Round(diff.Hours() / 24))
message := ""
if days > 0 {
message = fmt.Sprintf("%d gün önce", days)
} else {
message = "Bugün"
}
return message
}
const Base = "https://wsconfigs.pockethost.io/api"
const ZipName = "config.zip"
func main() {
client := resty.New()
resp, err := client.R().Get(Base + "/collections/configs/records" + "?perPage=500")
if err != nil {
fmt.Println("Config bilgileri alınamadı!")
return
}
var listResponse ListResponse
err = json.Unmarshal(resp.Body(), &listResponse)
if err != nil {
fmt.Println("Config bilgisi çözümlenemedi!")
return
}
templates := &promptui.SelectTemplates{
Label: "{{ . | green }}",
Active: "⇨ {{ .Owner | magenta }} (Son Güncelleme: {{ .DisplayLastUpdate | white }})",
Inactive: " {{ .Owner | blue }} (Son Güncelleme: {{ .DisplayLastUpdate | white }})",
Selected: "{{ .Owner | red | cyan }} config yükleniyor...",
Details: `{{ "Seçilen Config" | green }} ⇨ {{ .Owner | magenta }}`,
}
prompt := promptui.Select{
Label: "Config Seçiniz",
Items: listResponse.Items,
Templates: templates,
HideHelp: true,
Size: 20,
}
i, _, err := prompt.Run()
if err != nil {
fmt.Println("İşlem iptal edildi.")
return
}
selected := listResponse.Items[i]
fileURL := Base + fmt.Sprintf("/files/%s/%s/%s", selected.CollectionId, selected.Id, selected.Zip)
resp, err = client.R().SetOutput(ZipName).Get(fileURL)
if err != nil {
fmt.Println("Config indirilemedi!")
return
}
r, err := zip.OpenReader(ZipName)
if err != nil {
fmt.Println("Zip dosyası okunamıyor!")
return
}
defer func(r *zip.ReadCloser) {
err = r.Close()
if err != nil {
return
}
err = os.Remove(ZipName)
if err != nil {
fmt.Println("Zip dosyası silinemedi!")
return
}
}(r)
err = os.RemoveAll("C:\\wsreborn\\config")
if err != nil {
fmt.Println("Güncel config klasörü silinemiyor!")
return
}
err = os.MkdirAll("C:\\wsreborn\\config", 0200)
if err != nil {
fmt.Println("Config klasörü oluşturulamıyor!")
return
}
for _, f := range r.File {
if !f.FileInfo().IsDir() {
path := filepath.Join("C:\\wsreborn\\config", f.Name)
writer, _ := os.OpenFile(path, os.O_WRONLY|os.O_CREATE|os.O_TRUNC, f.Mode())
defer writer.Close()
reader, _ := f.Open()
defer reader.Close()
_, _ = io.Copy(writer, reader)
}
}
color.Green("✔ Config yüklendi!")
}