11package main
22
33import (
4+ "encoding/json"
45 "errors"
56 "fmt"
7+ "io"
68 "log"
79 "os"
810 "path/filepath"
@@ -12,7 +14,6 @@ import (
1214 "strconv"
1315 "strings"
1416 "time"
15- "encoding/json"
1617
1718 "github.com/axrona/anitr-cli/internal"
1819 "github.com/axrona/anitr-cli/internal/dl"
@@ -402,7 +403,7 @@ func mainMenu(cfx *App, timestamp time.Time) {
402403 }
403404
404405 case "Ayarlar" :
405- settingsMenu (cfx )
406+ settingsMenu (cfx )
406407
407408 case "Çık" :
408409 os .Exit (0 )
@@ -411,64 +412,146 @@ func mainMenu(cfx *App, timestamp time.Time) {
411412}
412413
413414func settingsMenu (cfx * App ) {
414- cfg , err := utils .LoadConfig (filepath .Join (utils .ConfigDir (), "config.json" ))
415- if err != nil {
416- cfg = & utils.Config {}
417- }
418-
419- for {
420- menuOptions := []string {
421- fmt .Sprintf ("İndirme dizinini değiştir : %s" , cfg .DownloadDir ),
422- "Geri" ,
423- }
424-
425- selectedChoice , err := showSelection (* cfx , menuOptions , "Ayarlar" )
426- if errors .Is (err , tui .ErrGoBack ) {
427- return
428- }
429- if err != nil {
430- cfx .logger .LogError (err )
431- continue
432- }
433-
434- switch selectedChoice {
435- case menuOptions [0 ]: // İndirme dizinini değiştir
436- // varsayılan gösterimi ~/ ile
437- homeDir := os .Getenv ("HOME" )
438- displayDir := cfg .DownloadDir
439- if strings .HasPrefix (cfg .DownloadDir , homeDir ) {
440- displayDir = "~" + cfg .DownloadDir [len (homeDir ):]
415+ cfg , err := utils .LoadConfig (filepath .Join (utils .ConfigDir (), "config.json" ))
416+ if err != nil {
417+ cfg = & utils.Config {}
418+ }
419+
420+ // Dosyayı okuma ve yazma modunda açıyoruz, mevcut içeriği sıfırlayarak
421+ f , err := os .OpenFile (filepath .Join (utils .ConfigDir (), "config.json" ), os .O_RDWR | os .O_CREATE , 0o644 )
422+ if err != nil {
423+ cfx .logger .LogError (err )
424+ return
425+ }
426+ defer f .Close () // Fonksiyon bitince dosya kapanır
427+
428+ // JSON yazıcı (Encoder değil)
429+ encoder := json .NewEncoder (f )
430+ encoder .SetIndent ("" , " " )
431+
432+ // Menüdeki değişikliklerin kaydedilmesi için bir flag
433+ var changesMade bool
434+
435+ for {
436+ // Ekranı temizle
437+ ui .ClearScreen ()
438+
439+ var selectedSourceText string
440+ if cfx .selectedSource != nil {
441+ selectedSourceText = * cfx .selectedSource
442+ } else {
443+ selectedSourceText = "Seçili kaynak yok"
441444 }
442445
443- fmt .Printf ("Yeni dizin (Enter ile değiştirme) [%s]: " , displayDir )
444- var input string
445- fmt .Scanln (& input )
446- if input != "" {
447- // Eğer input ~/ ile başlıyorsa HOME ile değiştir
448- if strings .HasPrefix (input , "~" ) {
449- input = filepath .Join (homeDir , input [1 :])
450- }
451- cfg .DownloadDir = input
452-
453- os .MkdirAll (utils .ConfigDir (), 0o755 )
454- f , err := os .Create (filepath .Join (utils .ConfigDir (), "config.json" ))
455- if err == nil {
456- defer f .Close ()
457- enc := json .NewEncoder (f )
458- enc .SetIndent ("" , " " )
459- enc .Encode (cfg )
460- }
461- fmt .Println ("Dizin güncellendi!" )
462- time .Sleep (1200 * time .Millisecond )
463- ui .ClearScreen ()
446+ // DisableRPC kontrolü: Nil ise false olarak ayarla
447+ var disableRPCText string
448+ if cfg .DisableRPC == nil {
449+ cfg .DisableRPC = utils .Ptr (false )
450+ }
451+ disableRPCText = fmt .Sprintf ("%v" , * cfg .DisableRPC )
452+
453+ menuOptions := []string {
454+ "İndirme dizinini değiştir : " + cfg .DownloadDir ,
455+ "Varsayılan kaynağı değiştir : " + selectedSourceText ,
456+ "Geçmiş limitini değiştir : " + fmt .Sprintf ("%d" , cfg .HistoryLimit ),
457+ "RPC'yi devre dışı bırak : " + disableRPCText ,
458+ "Geri" ,
464459 }
465460
466- case menuOptions [1 ]: // Geri
467- return
468- }
469- }
470- }
461+ selectedChoice , err := showSelection (* cfx , menuOptions , "Ayarlar" )
462+ if errors .Is (err , tui .ErrGoBack ) {
463+ // Menüden çıkıldığında kaydetme işlemi yap
464+ if changesMade {
465+ // Dosyaya yazma işlemi sadece değişiklik yapıldıysa yapılacak
466+ f .Seek (0 , io .SeekStart ) // Dosya pointer'ını başa al
467+ f .Truncate (0 ) // Dosyayı temizle
468+ if err := encoder .Encode (cfg ); err != nil {
469+ cfx .logger .LogError (err )
470+ }
471+ fmt .Println ("Ayarlar başarıyla güncellendi!" )
472+ } else {
473+ // Değişiklik yapılmamışsa dosyayı yazma
474+ fmt .Println ("Değişiklik yapılmadı, ayarlar korunuyor." )
475+ }
476+ return
477+ }
478+ if err != nil {
479+ cfx .logger .LogError (err )
480+ continue
481+ }
482+
483+ // Seçilen menü seçeneğine göre işlem yap
484+ switch selectedChoice {
485+ case menuOptions [0 ]: // İndirme dizinini değiştir
486+ homeDir := os .Getenv ("HOME" )
487+ displayDir := cfg .DownloadDir
488+ if strings .HasPrefix (cfg .DownloadDir , homeDir ) {
489+ displayDir = "~" + cfg .DownloadDir [len (homeDir ):]
490+ }
491+
492+ fmt .Printf ("Yeni dizin (Enter ile değiştirme) [%s]: " , displayDir )
493+ var input string
494+ fmt .Scanln (& input )
495+ if input != "" {
496+ if strings .HasPrefix (input , "~" ) {
497+ input = filepath .Join (homeDir , input [1 :])
498+ }
499+ cfg .DownloadDir = input
500+ changesMade = true // Flag'i true yapıyoruz, çünkü değişiklik yapıldı
501+ }
502+
503+ case menuOptions [1 ]: // Kaynak değiştir
504+ selectedSource , _ := selectSource (* cfx .uiMode , * cfx .rofiFlags , * cfx .source , cfx .logger )
505+ cfx .selectedSource = & selectedSource
506+ cfg .DefaultSource = selectedSource
507+ changesMade = true
508+
509+ case menuOptions [2 ]: // Geçmiş limitini değiştir
510+ fmt .Print ("Yeni geçmiş limitini girin: " )
511+ var newLimit int
512+ fmt .Scanln (& newLimit )
513+ if newLimit >= 0 {
514+ cfg .HistoryLimit = newLimit
515+ changesMade = true
516+ }
517+
518+ case menuOptions [3 ]: // RPC'yi devre dışı bırak
519+ choice , err := showSelection (
520+ App {uiMode : cfx .uiMode , rofiFlags : cfx .rofiFlags },
521+ []string {"Evet" , "Hayır" },
522+ "Discord Rich Presence devre dışı bırakılsın mı?" ,
523+ )
524+
525+ if errors .Is (err , tui .ErrGoBack ) {
526+ return
527+ }
471528
529+ switch strings .ToLower (choice ) {
530+ case "evet" :
531+ cfg .DisableRPC = utils .Ptr (true )
532+ case "hayır" :
533+ cfg .DisableRPC = utils .Ptr (false )
534+ default :
535+ cfg .DisableRPC = utils .Ptr (false )
536+ }
537+ changesMade = true
538+
539+ case menuOptions [4 ]: // Geri
540+ return
541+ }
542+
543+ // Değişiklikleri hemen kaydet
544+ if changesMade {
545+ // Dosyaya yazma işlemi manuel olarak yapılır
546+ f .Seek (0 , io .SeekStart ) // Dosya pointer'ını başa al
547+ f .Truncate (0 ) // Dosyayı temizle
548+ if err := encoder .Encode (cfg ); err != nil {
549+ cfx .logger .LogError (err )
550+ }
551+ fmt .Println ("Ayarlar güncellendi!" )
552+ }
553+ }
554+ }
472555
473556// Anime geçmişini listeleyen fonksiyon
474557func anitrHistory (params internal.UiParams , source string , historyLimit int , logger * utils.Logger ) (selectedAnime string , animeId string , lastEpisodeIdx int , err error ) {
@@ -1157,18 +1240,17 @@ func playAnimeLoop(
11571240 continue
11581241 }
11591242 selectedFansubIdx = slices .Index (fansubNames , selected )
1160-
1161-
1162- // Movie / Bölüm indir
1163- case "Bölüm indir" , "Movie indir" :
1164- ui .ClearScreen ()
1165-
1166- cfg , err := utils .LoadConfig (filepath .Join (utils .ConfigDir (), "config.json" ))
1167- if err != nil {
1168- cfg = & utils.Config {} // eğer config yoksa varsayılan config oluştur
1169- }
11701243
1171- if cfg .DownloadDir == "" {
1244+ // Movie / Bölüm indir
1245+ case "Bölüm indir" , "Movie indir" :
1246+ ui .ClearScreen ()
1247+
1248+ cfg , err := utils .LoadConfig (filepath .Join (utils .ConfigDir (), "config.json" ))
1249+ if err != nil {
1250+ cfg = & utils.Config {} // eğer config yoksa varsayılan config oluştur
1251+ }
1252+
1253+ if cfg .DownloadDir == "" {
11721254 defaultDir := utils .DefaultDownloadDir ()
11731255 fmt .Printf ("Videoları nereye indirmek istersiniz? (Varsayılan: %s): " , defaultDir )
11741256 var input string
0 commit comments