diff --git a/be/app/api.go b/be/app/api.go index 7f2ebc0..75c16f8 100644 --- a/be/app/api.go +++ b/be/app/api.go @@ -1,21 +1,21 @@ /* -Macrame is a program that enables the user to create keyboard macros and button panels. -The macros are saved as simple JSON files and can be linked to the button panels. The panels can +Macrame is a program that enables the user to create keyboard macros and button panels. +The macros are saved as simple JSON files and can be linked to the button panels. The panels can be created with HTML and CSS. Copyright (C) 2025 Jesse Malotaux -This program is free software: you can redistribute it and/or modify -it under the terms of the GNU General Public License as published by -the Free Software Foundation, either version 3 of the License, or +This program is free software: you can redistribute it and/or modify +it under the terms of the GNU General Public License as published by +the Free Software Foundation, either version 3 of the License, or (at your option) any later version. -This program is distributed in the hope that it will be useful, -but WITHOUT ANY WARRANTY; without even the implied warranty of -MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. -You should have received a copy of the GNU General Public License +You should have received a copy of the GNU General Public License along with this program. If not, see . */ @@ -96,7 +96,7 @@ func ApiPost(w http.ResponseWriter, r *http.Request) { case "/macro/play": PlayMacro("", w, r) case "/device/server/ip": - GetServerIP(w, r) + GetServerIP(w) case "/device/list": DeviceList(w, r) case "/device/access/check": diff --git a/be/app/device.go b/be/app/device.go index 8c83f43..9a906dd 100644 --- a/be/app/device.go +++ b/be/app/device.go @@ -1,21 +1,21 @@ /* -Macrame is a program that enables the user to create keyboard macros and button panels. -The macros are saved as simple JSON files and can be linked to the button panels. The panels can +Macrame is a program that enables the user to create keyboard macros and button panels. +The macros are saved as simple JSON files and can be linked to the button panels. The panels can be created with HTML and CSS. Copyright (C) 2025 Jesse Malotaux -This program is free software: you can redistribute it and/or modify -it under the terms of the GNU General Public License as published by -the Free Software Foundation, either version 3 of the License, or +This program is free software: you can redistribute it and/or modify +it under the terms of the GNU General Public License as published by +the Free Software Foundation, either version 3 of the License, or (at your option) any later version. -This program is distributed in the hope that it will be useful, -but WITHOUT ANY WARRANTY; without even the implied warranty of -MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. -You should have received a copy of the GNU General Public License +You should have received a copy of the GNU General Public License along with this program. If not, see . */ @@ -35,11 +35,22 @@ import ( "time" ) -func GetServerIP(w http.ResponseWriter, r *http.Request) { +func ListServerIP(w http.ResponseWriter) { + ip, err := GetServerIp() + + if err != nil { + MCRMLog("GetServerIP err: ", err) + return + } + + json.NewEncoder(w).Encode(ip) +} + +func GetServerIp() (string, error) { ifs, err := net.Interfaces() if err != nil { MCRMLog(err) - return + return "", err } for _, ifi := range ifs { @@ -78,10 +89,11 @@ func GetServerIP(w http.ResponseWriter, r *http.Request) { } // Found a good IP, return it - json.NewEncoder(w).Encode(ip.String()) - return + return ip.String(), nil } } + + return "", fmt.Errorf("No IP found") } func DeviceList(w http.ResponseWriter, r *http.Request) { diff --git a/be/app/log.go b/be/app/log.go index 894d1da..db662ed 100644 --- a/be/app/log.go +++ b/be/app/log.go @@ -1,21 +1,21 @@ /* -Macrame is a program that enables the user to create keyboard macros and button panels. -The macros are saved as simple JSON files and can be linked to the button panels. The panels can +Macrame is a program that enables the user to create keyboard macros and button panels. +The macros are saved as simple JSON files and can be linked to the button panels. The panels can be created with HTML and CSS. Copyright (C) 2025 Jesse Malotaux -This program is free software: you can redistribute it and/or modify -it under the terms of the GNU General Public License as published by -the Free Software Foundation, either version 3 of the License, or +This program is free software: you can redistribute it and/or modify +it under the terms of the GNU General Public License as published by +the Free Software Foundation, either version 3 of the License, or (at your option) any later version. -This program is distributed in the hope that it will be useful, -but WITHOUT ANY WARRANTY; without even the implied warranty of -MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. -You should have received a copy of the GNU General Public License +You should have received a copy of the GNU General Public License along with this program. If not, see . */ diff --git a/be/app/systray.go b/be/app/systray.go new file mode 100644 index 0000000..dcece3f --- /dev/null +++ b/be/app/systray.go @@ -0,0 +1,61 @@ +package app + +import ( + "be/app/helper" + "os" + + "github.com/getlantern/systray" +) + +func InitSystray() { + go func() { + systray.Run(OnReady, OnExit) + }() +} + +func OnReady() { + systray.SetIcon(getFavicon()) + systray.SetTitle("Macrame") + systray.SetTooltip("Macrame - Server") + + ip, _ := GetServerIp() + + systray.AddMenuItem("IP: "+ip+":"+helper.EnvGet("MCRM__PORT"), "") + + systray.AddSeparator() + + addMCRMItem("Dashboard", "/") + addMCRMItem("Panels", "/panels") + addMCRMItem("Macros", "/macros") + addMCRMItem("Devices", "/devices") + + systray.AddSeparator() + + mQuit := systray.AddMenuItem("Quit Macrame", "Quit Macrame") + go func() { + <-mQuit.ClickedCh + os.Exit(0) + }() +} + +func addMCRMItem(name, urlPath string) { + m := systray.AddMenuItem(name, name) + go func() { + <-m.ClickedCh + helper.OpenBrowser("http://localhost:" + helper.EnvGet("MCRM__PORT") + urlPath) + }() +} + +func OnExit() { + systray.Quit() +} + +func getFavicon() []byte { + favicon, err := os.ReadFile("favicon.ico") + + if err != nil { + MCRMLog("getFavicon Error: ", err) + } + + return favicon +} diff --git a/be/favicon.ico b/be/favicon.ico new file mode 100644 index 0000000..a9a8c24 Binary files /dev/null and b/be/favicon.ico differ diff --git a/be/main.go b/be/main.go index 383340c..ecbb126 100644 --- a/be/main.go +++ b/be/main.go @@ -1,21 +1,21 @@ /* -Macrame is a program that enables the user to create keyboard macros and button panels. -The macros are saved as simple JSON files and can be linked to the button panels. The panels can +Macrame is a program that enables the user to create keyboard macros and button panels. +The macros are saved as simple JSON files and can be linked to the button panels. The panels can be created with HTML and CSS. Copyright (C) 2025 Jesse Malotaux -This program is free software: you can redistribute it and/or modify -it under the terms of the GNU General Public License as published by -the Free Software Foundation, either version 3 of the License, or +This program is free software: you can redistribute it and/or modify +it under the terms of the GNU General Public License as published by +the Free Software Foundation, either version 3 of the License, or (at your option) any later version. -This program is distributed in the hope that it will be useful, -but WITHOUT ANY WARRANTY; without even the implied warranty of -MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. -You should have received a copy of the GNU General Public License +You should have received a copy of the GNU General Public License along with this program. If not, see . */ @@ -48,6 +48,8 @@ func main() { app.MCRMLog("Listening on http://localhost:" + helper.EnvGet("MCRM__PORT")) + app.InitSystray() + app.MCRMLog(http.ListenAndServe(":"+helper.EnvGet("MCRM__PORT"), nil)) }