İş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
Ayrıca database konusunda, kolaylık olsun diye
Koddan kendi server linkimi silmedim belki denemek isteyen olur diye.
go.mod
main.go
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: