diff options
Diffstat (limited to 'raveos-hyprland-theme/theme-data/DankMaterialShell/core/internal/server/themes')
8 files changed, 502 insertions, 0 deletions
diff --git a/raveos-hyprland-theme/theme-data/DankMaterialShell/core/internal/server/themes/handlers.go b/raveos-hyprland-theme/theme-data/DankMaterialShell/core/internal/server/themes/handlers.go new file mode 100644 index 0000000..b3b308a --- /dev/null +++ b/raveos-hyprland-theme/theme-data/DankMaterialShell/core/internal/server/themes/handlers.go @@ -0,0 +1,27 @@ +package themes + +import ( + "fmt" + "net" + + "github.com/AvengeMedia/DankMaterialShell/core/internal/server/models" +) + +func HandleRequest(conn net.Conn, req models.Request) { + switch req.Method { + case "themes.list": + HandleList(conn, req) + case "themes.listInstalled": + HandleListInstalled(conn, req) + case "themes.install": + HandleInstall(conn, req) + case "themes.uninstall": + HandleUninstall(conn, req) + case "themes.update": + HandleUpdate(conn, req) + case "themes.search": + HandleSearch(conn, req) + default: + models.RespondError(conn, req.ID, fmt.Sprintf("unknown method: %s", req.Method)) + } +} diff --git a/raveos-hyprland-theme/theme-data/DankMaterialShell/core/internal/server/themes/install.go b/raveos-hyprland-theme/theme-data/DankMaterialShell/core/internal/server/themes/install.go new file mode 100644 index 0000000..26d22ba --- /dev/null +++ b/raveos-hyprland-theme/theme-data/DankMaterialShell/core/internal/server/themes/install.go @@ -0,0 +1,52 @@ +package themes + +import ( + "fmt" + "net" + + "github.com/AvengeMedia/DankMaterialShell/core/internal/server/models" + "github.com/AvengeMedia/DankMaterialShell/core/internal/themes" +) + +func HandleInstall(conn net.Conn, req models.Request) { + idOrName, ok := models.Get[string](req, "name") + if !ok { + models.RespondError(conn, req.ID, "missing or invalid 'name' parameter") + return + } + + registry, err := themes.NewRegistry() + if err != nil { + models.RespondError(conn, req.ID, fmt.Sprintf("failed to create registry: %v", err)) + return + } + + themeList, err := registry.List() + if err != nil { + models.RespondError(conn, req.ID, fmt.Sprintf("failed to list themes: %v", err)) + return + } + + theme := themes.FindByIDOrName(idOrName, themeList) + if theme == nil { + models.RespondError(conn, req.ID, fmt.Sprintf("theme not found: %s", idOrName)) + return + } + + manager, err := themes.NewManager() + if err != nil { + models.RespondError(conn, req.ID, fmt.Sprintf("failed to create manager: %v", err)) + return + } + + registryThemeDir := registry.GetThemeDir(theme.SourceDir) + if err := manager.Install(*theme, registryThemeDir); err != nil { + models.RespondError(conn, req.ID, fmt.Sprintf("failed to install theme: %v", err)) + return + } + + models.Respond(conn, req.ID, models.SuccessResult{ + Success: true, + Message: fmt.Sprintf("theme installed: %s", theme.Name), + }) +} diff --git a/raveos-hyprland-theme/theme-data/DankMaterialShell/core/internal/server/themes/list.go b/raveos-hyprland-theme/theme-data/DankMaterialShell/core/internal/server/themes/list.go new file mode 100644 index 0000000..9564be1 --- /dev/null +++ b/raveos-hyprland-theme/theme-data/DankMaterialShell/core/internal/server/themes/list.go @@ -0,0 +1,54 @@ +package themes + +import ( + "fmt" + "net" + "strings" + + "github.com/AvengeMedia/DankMaterialShell/core/internal/server/models" + "github.com/AvengeMedia/DankMaterialShell/core/internal/themes" +) + +func HandleList(conn net.Conn, req models.Request) { + registry, err := themes.NewRegistry() + if err != nil { + models.RespondError(conn, req.ID, fmt.Sprintf("failed to create registry: %v", err)) + return + } + + themeList, err := registry.List() + if err != nil { + models.RespondError(conn, req.ID, fmt.Sprintf("failed to list themes: %v", err)) + return + } + + manager, err := themes.NewManager() + if err != nil { + models.RespondError(conn, req.ID, fmt.Sprintf("failed to create manager: %v", err)) + return + } + + result := make([]ThemeInfo, len(themeList)) + for i, t := range themeList { + installed, _ := manager.IsInstalled(t) + info := ThemeInfo{ + ID: t.ID, + Name: t.Name, + Version: t.Version, + Author: t.Author, + Description: t.Description, + PreviewPath: t.PreviewPath, + SourceDir: t.SourceDir, + Installed: installed, + FirstParty: isFirstParty(t.Author), + } + addVariantsInfo(&info, t.Variants) + result[i] = info + } + + models.Respond(conn, req.ID, result) +} + +func isFirstParty(author string) bool { + return strings.EqualFold(author, "Avenge Media") || strings.EqualFold(author, "AvengeMedia") +} diff --git a/raveos-hyprland-theme/theme-data/DankMaterialShell/core/internal/server/themes/list_installed.go b/raveos-hyprland-theme/theme-data/DankMaterialShell/core/internal/server/themes/list_installed.go new file mode 100644 index 0000000..49be81b --- /dev/null +++ b/raveos-hyprland-theme/theme-data/DankMaterialShell/core/internal/server/themes/list_installed.go @@ -0,0 +1,149 @@ +package themes + +import ( + "fmt" + "net" + + "github.com/AvengeMedia/DankMaterialShell/core/internal/server/models" + "github.com/AvengeMedia/DankMaterialShell/core/internal/themes" +) + +func addVariantsInfo(info *ThemeInfo, variants *themes.ThemeVariants) { + if variants == nil { + return + } + + if variants.Type == "multi" { + if len(variants.Flavors) == 0 && len(variants.Accents) == 0 { + return + } + info.HasVariants = true + info.Variants = &VariantsInfo{ + Type: "multi", + Flavors: make([]FlavorInfo, len(variants.Flavors)), + Accents: make([]AccentInfo, len(variants.Accents)), + } + if variants.Defaults != nil { + info.Variants.Defaults = &MultiDefaults{ + Dark: variants.Defaults.Dark, + Light: variants.Defaults.Light, + } + } + for i, f := range variants.Flavors { + mode := "" + switch { + case f.Dark.Primary != "" && f.Light.Primary != "": + mode = "both" + case f.Dark.Primary != "": + mode = "dark" + case f.Light.Primary != "": + mode = "light" + default: + if f.Dark.Surface != "" { + mode = "dark" + } else if f.Light.Surface != "" { + mode = "light" + } + } + info.Variants.Flavors[i] = FlavorInfo{ID: f.ID, Name: f.Name, Mode: mode} + } + for i, a := range variants.Accents { + color := "" + if colors, ok := a.FlavorColors["mocha"]; ok && colors.Primary != "" { + color = colors.Primary + } else if colors, ok := a.FlavorColors["latte"]; ok && colors.Primary != "" { + color = colors.Primary + } else { + for _, c := range a.FlavorColors { + if c.Primary != "" { + color = c.Primary + break + } + } + } + info.Variants.Accents[i] = AccentInfo{ID: a.ID, Name: a.Name, Color: color} + } + return + } + + if len(variants.Options) == 0 { + return + } + info.HasVariants = true + info.Variants = &VariantsInfo{ + Default: variants.Default, + Options: make([]VariantInfo, len(variants.Options)), + } + for i, v := range variants.Options { + info.Variants.Options[i] = VariantInfo{ID: v.ID, Name: v.Name} + } +} + +func HandleListInstalled(conn net.Conn, req models.Request) { + manager, err := themes.NewManager() + if err != nil { + models.RespondError(conn, req.ID, fmt.Sprintf("failed to create manager: %v", err)) + return + } + + installedIDs, err := manager.ListInstalled() + if err != nil { + models.RespondError(conn, req.ID, fmt.Sprintf("failed to list installed themes: %v", err)) + return + } + + themeMap := make(map[string]themes.Theme) + if registry, err := themes.NewRegistry(); err == nil { + if allThemes, err := registry.List(); err == nil { + for _, t := range allThemes { + themeMap[t.ID] = t + } + } + } + + result := make([]ThemeInfo, 0, len(installedIDs)) + for _, id := range installedIDs { + if theme, ok := themeMap[id]; ok { + hasUpdate := false + if hasUpdates, err := manager.HasUpdates(id, theme); err == nil { + hasUpdate = hasUpdates + } + + info := ThemeInfo{ + ID: theme.ID, + Name: theme.Name, + Version: theme.Version, + Author: theme.Author, + Description: theme.Description, + SourceDir: id, + FirstParty: isFirstParty(theme.Author), + HasUpdate: hasUpdate, + } + addVariantsInfo(&info, theme.Variants) + result = append(result, info) + } else { + installed, err := manager.GetInstalledTheme(id) + if err != nil { + result = append(result, ThemeInfo{ + ID: id, + Name: id, + SourceDir: id, + }) + continue + } + info := ThemeInfo{ + ID: installed.ID, + Name: installed.Name, + Version: installed.Version, + Author: installed.Author, + Description: installed.Description, + SourceDir: id, + FirstParty: isFirstParty(installed.Author), + } + addVariantsInfo(&info, installed.Variants) + result = append(result, info) + } + } + + models.Respond(conn, req.ID, result) +} diff --git a/raveos-hyprland-theme/theme-data/DankMaterialShell/core/internal/server/themes/search.go b/raveos-hyprland-theme/theme-data/DankMaterialShell/core/internal/server/themes/search.go new file mode 100644 index 0000000..2823fe0 --- /dev/null +++ b/raveos-hyprland-theme/theme-data/DankMaterialShell/core/internal/server/themes/search.go @@ -0,0 +1,53 @@ +package themes + +import ( + "fmt" + "net" + + "github.com/AvengeMedia/DankMaterialShell/core/internal/server/models" + "github.com/AvengeMedia/DankMaterialShell/core/internal/themes" +) + +func HandleSearch(conn net.Conn, req models.Request) { + query, ok := models.Get[string](req, "query") + if !ok { + models.RespondError(conn, req.ID, "missing or invalid 'query' parameter") + return + } + + registry, err := themes.NewRegistry() + if err != nil { + models.RespondError(conn, req.ID, fmt.Sprintf("failed to create registry: %v", err)) + return + } + + themeList, err := registry.List() + if err != nil { + models.RespondError(conn, req.ID, fmt.Sprintf("failed to list themes: %v", err)) + return + } + + searchResults := themes.FuzzySearch(query, themeList) + + manager, err := themes.NewManager() + if err != nil { + models.RespondError(conn, req.ID, fmt.Sprintf("failed to create manager: %v", err)) + return + } + + result := make([]ThemeInfo, len(searchResults)) + for i, t := range searchResults { + installed, _ := manager.IsInstalled(t) + result[i] = ThemeInfo{ + ID: t.ID, + Name: t.Name, + Version: t.Version, + Author: t.Author, + Description: t.Description, + Installed: installed, + FirstParty: isFirstParty(t.Author), + } + } + + models.Respond(conn, req.ID, result) +} diff --git a/raveos-hyprland-theme/theme-data/DankMaterialShell/core/internal/server/themes/types.go b/raveos-hyprland-theme/theme-data/DankMaterialShell/core/internal/server/themes/types.go new file mode 100644 index 0000000..0ad19b4 --- /dev/null +++ b/raveos-hyprland-theme/theme-data/DankMaterialShell/core/internal/server/themes/types.go @@ -0,0 +1,47 @@ +package themes + +type VariantInfo struct { + ID string `json:"id"` + Name string `json:"name"` +} + +type FlavorInfo struct { + ID string `json:"id"` + Name string `json:"name"` + Mode string `json:"mode,omitempty"` +} + +type AccentInfo struct { + ID string `json:"id"` + Name string `json:"name"` + Color string `json:"color,omitempty"` +} + +type MultiDefaults struct { + Dark map[string]string `json:"dark,omitempty"` + Light map[string]string `json:"light,omitempty"` +} + +type VariantsInfo struct { + Type string `json:"type,omitempty"` + Default string `json:"default,omitempty"` + Defaults *MultiDefaults `json:"defaults,omitempty"` + Options []VariantInfo `json:"options,omitempty"` + Flavors []FlavorInfo `json:"flavors,omitempty"` + Accents []AccentInfo `json:"accents,omitempty"` +} + +type ThemeInfo struct { + ID string `json:"id"` + Name string `json:"name"` + Version string `json:"version"` + Author string `json:"author,omitempty"` + Description string `json:"description,omitempty"` + PreviewPath string `json:"previewPath,omitempty"` + SourceDir string `json:"sourceDir,omitempty"` + Installed bool `json:"installed,omitempty"` + FirstParty bool `json:"firstParty,omitempty"` + HasUpdate bool `json:"hasUpdate,omitempty"` + HasVariants bool `json:"hasVariants,omitempty"` + Variants *VariantsInfo `json:"variants,omitempty"` +} diff --git a/raveos-hyprland-theme/theme-data/DankMaterialShell/core/internal/server/themes/uninstall.go b/raveos-hyprland-theme/theme-data/DankMaterialShell/core/internal/server/themes/uninstall.go new file mode 100644 index 0000000..9b453e4 --- /dev/null +++ b/raveos-hyprland-theme/theme-data/DankMaterialShell/core/internal/server/themes/uninstall.go @@ -0,0 +1,63 @@ +package themes + +import ( + "fmt" + "net" + + "github.com/AvengeMedia/DankMaterialShell/core/internal/server/models" + "github.com/AvengeMedia/DankMaterialShell/core/internal/themes" +) + +func HandleUninstall(conn net.Conn, req models.Request) { + idOrName, ok := models.Get[string](req, "name") + if !ok { + models.RespondError(conn, req.ID, "missing or invalid 'name' parameter") + return + } + + manager, err := themes.NewManager() + if err != nil { + models.RespondError(conn, req.ID, fmt.Sprintf("failed to create manager: %v", err)) + return + } + + registry, err := themes.NewRegistry() + if err != nil { + models.RespondError(conn, req.ID, fmt.Sprintf("failed to create registry: %v", err)) + return + } + + themeList, _ := registry.List() + theme := themes.FindByIDOrName(idOrName, themeList) + + if theme != nil { + installed, err := manager.IsInstalled(*theme) + if err != nil { + models.RespondError(conn, req.ID, fmt.Sprintf("failed to check if theme is installed: %v", err)) + return + } + if !installed { + models.RespondError(conn, req.ID, fmt.Sprintf("theme not installed: %s", idOrName)) + return + } + if err := manager.Uninstall(*theme); err != nil { + models.RespondError(conn, req.ID, fmt.Sprintf("failed to uninstall theme: %v", err)) + return + } + models.Respond(conn, req.ID, models.SuccessResult{ + Success: true, + Message: fmt.Sprintf("theme uninstalled: %s", theme.Name), + }) + return + } + + if err := manager.UninstallByID(idOrName); err != nil { + models.RespondError(conn, req.ID, fmt.Sprintf("theme not found: %s", idOrName)) + return + } + + models.Respond(conn, req.ID, models.SuccessResult{ + Success: true, + Message: fmt.Sprintf("theme uninstalled: %s", idOrName), + }) +} diff --git a/raveos-hyprland-theme/theme-data/DankMaterialShell/core/internal/server/themes/update.go b/raveos-hyprland-theme/theme-data/DankMaterialShell/core/internal/server/themes/update.go new file mode 100644 index 0000000..fb9f81f --- /dev/null +++ b/raveos-hyprland-theme/theme-data/DankMaterialShell/core/internal/server/themes/update.go @@ -0,0 +1,57 @@ +package themes + +import ( + "fmt" + "net" + + "github.com/AvengeMedia/DankMaterialShell/core/internal/server/models" + "github.com/AvengeMedia/DankMaterialShell/core/internal/themes" +) + +func HandleUpdate(conn net.Conn, req models.Request) { + idOrName, ok := models.Get[string](req, "name") + if !ok { + models.RespondError(conn, req.ID, "missing or invalid 'name' parameter") + return + } + + manager, err := themes.NewManager() + if err != nil { + models.RespondError(conn, req.ID, fmt.Sprintf("failed to create manager: %v", err)) + return + } + + registry, err := themes.NewRegistry() + if err != nil { + models.RespondError(conn, req.ID, fmt.Sprintf("failed to create registry: %v", err)) + return + } + + themeList, _ := registry.List() + theme := themes.FindByIDOrName(idOrName, themeList) + + if theme == nil { + models.RespondError(conn, req.ID, fmt.Sprintf("theme not found in registry: %s", idOrName)) + return + } + + installed, err := manager.IsInstalled(*theme) + if err != nil { + models.RespondError(conn, req.ID, fmt.Sprintf("failed to check if theme is installed: %v", err)) + return + } + if !installed { + models.RespondError(conn, req.ID, fmt.Sprintf("theme not installed: %s", idOrName)) + return + } + + if err := manager.Update(*theme); err != nil { + models.RespondError(conn, req.ID, fmt.Sprintf("failed to update theme: %v", err)) + return + } + + models.Respond(conn, req.ID, models.SuccessResult{ + Success: true, + Message: fmt.Sprintf("theme updated: %s", theme.Name), + }) +} |