WSReborn Config Selector

Durum
Üzgünüz bu konu cevaplar için kapatılmıştır...

JDH

Seçkin Üye
Katılım
29 Kas 2016
Mesajlar
484
Çözümler
9
Tepki puanı
65
Ödüller
7
9 HİZMET YILI
İşleri biraz hızlandırmak için ve sürekli sürükle bırak yapmaktan sıkıldığım için baştan savma bir program yaptım. Programın yaptığı şey oluşturmuş olduğum database'den veriyi çekip önüme sunmak ve seçtiğim configi indirip wsreborn klasörüne atmak. Başka bir özelliği yok.

Programı çalıştırılabilir halde vermektense sadece kod halinde vereceğim virüs muhabbetleri dönmesin diye. Zaten derlemesi de kolay aşağıda verdiğim iki koduda dosyalara kaydediyorsunuz ve o dizindeyken go build . yazmanız yeterli sonrasında config-selector.exe dosyası oluşacak.

Ayrıca database konusunda, kolaylık olsun diye
Bağlantıları görmek için lütfen Giriş Yap
kullandım. Pocketbase'i yerleştirdiğim sunucu ise
Bağlantıları görmek için lütfen Giriş Yap
diye birisinin ücretsiz sunduğu
Bağlantıları görmek için lütfen Giriş Yap
adlı bir hizmet.
Koddan kendi server linkimi silmedim belki denemek isteyen olur diye.


go.mod
Go:
module config-selector

go 1.20

require (
    github.com/fatih/color v1.15.0
    github.com/go-resty/resty/v2 v2.7.0
    github.com/manifoldco/promptui v0.9.0
)

require (
    github.com/chzyer/readline v0.0.0-20180603132655-2972be24d48e // indirect
    github.com/mattn/go-colorable v0.1.13 // indirect
    github.com/mattn/go-isatty v0.0.17 // indirect
    golang.org/x/net v0.0.0-20211029224645-99673261e6eb // indirect
    golang.org/x/sys v0.6.0 // indirect
)

main.go
Go:
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!")
}
 
Son düzenleme:
Durum
Üzgünüz bu konu cevaplar için kapatılmıştır...
Üst