summaryrefslogtreecommitdiff
path: root/raveos-hyprland-theme/theme-data/DankMaterialShell/core/internal/server/themes
diff options
context:
space:
mode:
Diffstat (limited to 'raveos-hyprland-theme/theme-data/DankMaterialShell/core/internal/server/themes')
-rw-r--r--raveos-hyprland-theme/theme-data/DankMaterialShell/core/internal/server/themes/handlers.go27
-rw-r--r--raveos-hyprland-theme/theme-data/DankMaterialShell/core/internal/server/themes/install.go52
-rw-r--r--raveos-hyprland-theme/theme-data/DankMaterialShell/core/internal/server/themes/list.go54
-rw-r--r--raveos-hyprland-theme/theme-data/DankMaterialShell/core/internal/server/themes/list_installed.go149
-rw-r--r--raveos-hyprland-theme/theme-data/DankMaterialShell/core/internal/server/themes/search.go53
-rw-r--r--raveos-hyprland-theme/theme-data/DankMaterialShell/core/internal/server/themes/types.go47
-rw-r--r--raveos-hyprland-theme/theme-data/DankMaterialShell/core/internal/server/themes/uninstall.go63
-rw-r--r--raveos-hyprland-theme/theme-data/DankMaterialShell/core/internal/server/themes/update.go57
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),
+ })
+}