diff --git a/.gitignore b/.gitignore index 83c5bc4..44e8555 100644 --- a/.gitignore +++ b/.gitignore @@ -2,3 +2,4 @@ __debug_bin docs .vscode .env +.idea \ No newline at end of file diff --git a/controller/controller.go b/controller/controller.go index e00d638..7457177 100644 --- a/controller/controller.go +++ b/controller/controller.go @@ -1,15 +1,38 @@ package controller -// Controller example +import ( + "fmt" + "os" + + "github.com/joho/godotenv" + openai "github.com/sashabaranov/go-openai" +) + type Controller struct { + openaiClient *openai.Client + unraidAPIKey string + unraidURI string } -// NewController example func NewController() *Controller { - return &Controller{} + err := godotenv.Load(".env") + + openaiApiKey := os.Getenv("OPENAI_API_KEY") + openaiClient := openai.NewClient(openaiApiKey) + unraidAPIKey := os.Getenv("UNRAID_API_KEY") + UNRAID_URI := os.Getenv("UNRAID_URI") + + if err != nil { + fmt.Println(err.Error()) + //return err + } + return &Controller{ + openaiClient: openaiClient, + unraidAPIKey: unraidAPIKey, + unraidURI: UNRAID_URI, + } } -// Message example type Message struct { Message string `json:"message" example:"message"` } diff --git a/controller/openai.go b/controller/openai.go index 71c1823..d7b369e 100644 --- a/controller/openai.go +++ b/controller/openai.go @@ -2,38 +2,12 @@ package controller import ( "context" - "fmt" "net/http" - "os" "github.com/gin-gonic/gin" - "github.com/joho/godotenv" openai "github.com/sashabaranov/go-openai" ) -var ( - // Declare global variables - apiKey string - - config *configStruct -) - -type configStruct struct { - apiKey string `json : "API_KEY"` -} - -func init() { - // Load values for global variables from environment variables - err := godotenv.Load(".env") - - if err != nil { - fmt.Println(err.Error()) - //return err - } - apiKey = os.Getenv("API_KEY") - -} - // GeneralOpenAI godoc // // @Summary Gerneral ChatGPT @@ -47,7 +21,7 @@ func init() { func (c *Controller) GeneralOpenAI(ctx *gin.Context) { message := ctx.Query("message") - result, err := createChatCompletion(message) + result, err := createChatCompletion(c, message) if err != nil { ctx.AbortWithError(http.StatusInternalServerError, err) } @@ -68,7 +42,7 @@ func (c *Controller) GeneralOpenAI(ctx *gin.Context) { func (c *Controller) TravelAgentOpenAI(ctx *gin.Context) { message := "want you to act as a travel guide. I will give you my location and you will give me suggestions " + ctx.Query("message") - result, err := createChatCompletion(message) + result, err := createChatCompletion(c, message) if err != nil { ctx.AbortWithError(http.StatusInternalServerError, err) } @@ -76,9 +50,9 @@ func (c *Controller) TravelAgentOpenAI(ctx *gin.Context) { ctx.String(http.StatusOK, result) } -func createChatCompletion(message string) (string, error) { +func createChatCompletion(c *Controller, message string) (string, error) { - var client = openai.NewClient(apiKey) + var client = c.openaiClient resp, err := client.CreateChatCompletion( context.Background(), openai.ChatCompletionRequest{ diff --git a/controller/unraid.go b/controller/unraid.go new file mode 100644 index 0000000..f7c6c6a --- /dev/null +++ b/controller/unraid.go @@ -0,0 +1,85 @@ +package controller + +import ( + "encoding/json" + "fmt" + "log" + "net/http" + "net/http/cookiejar" + "net/url" + "strings" + + "github.com/gin-gonic/gin" +) + +// UnraidPowerUsage godoc +// +// @Summary Unraid PSU Stats +// @Description Gets the PSU Data from unraid +// @Tags unraid +// @Accept json +// @Produce json +// @Success 200 {string} string "response" +// @Router /unraid/powerusage [get] +func (c *Controller) UnraidPowerUsage(ctx *gin.Context) { + + // Create a cookie jar to hold cookies for the session + jar, err := cookiejar.New(nil) + if err != nil { + fmt.Println(err) + return + } + + // Create an HTTP client with the cookie jar + client := &http.Client{ + Jar: jar, + } + + form := url.Values{ + "username": {"root"}, + "password": {c.unraidAPIKey}, + } + + // Login to unraid + req, err := http.NewRequest("POST", "https://"+c.unraidURI+"/login", strings.NewReader(form.Encode())) + if err != nil { + fmt.Println(err) + return + } + req.Header.Set("Content-Type", "application/x-www-form-urlencoded") + resp, err := client.Do(req) + if err != nil { + fmt.Println(err) + return + } + defer resp.Body.Close() + + // Check if the login was successful by inspecting the response body or headers + if resp.StatusCode != http.StatusOK { + fmt.Println("Login failed!") + return + } + + // Now you can use the client to send authenticated requests to other endpoints + req, err = http.NewRequest("GET", "https://"+c.unraidURI+"/plugins/corsairpsu/status.php", nil) + if err != nil { + fmt.Println(err) + return + } + + resp, err = client.Do(req) + if err != nil { + fmt.Println(err) + return + } + + defer resp.Body.Close() + + // Convert the returned data to JSON + var responseJSON map[string]interface{} + if err := json.NewDecoder(resp.Body).Decode(&responseJSON); err != nil { + log.Fatal(err) + } + + ctx.JSON(http.StatusOK, responseJSON) +} diff --git a/main.go b/main.go index 5100110..6b05a7d 100644 --- a/main.go +++ b/main.go @@ -13,7 +13,7 @@ import ( ginSwagger "github.com/swaggo/gin-swagger" ) -// @title Swagger Example API +// @title DurpAPI // @version 1.0 // @description This is a sample server celler server. // @termsOfService http://swagger.io/terms/ @@ -69,6 +69,10 @@ func main() { openai.GET("general", c.GeneralOpenAI) openai.GET("travelagent", c.TravelAgentOpenAI) } + unraid := v1.Group("/unraid") + { + unraid.GET("powerusage", c.UnraidPowerUsage) + } } r.GET("/swagger/*any", ginSwagger.WrapHandler(swaggerFiles.Handler)) r.Run(":8080")