From b2b50d303bb9b941b7969a32461f08003ed75b8b Mon Sep 17 00:00:00 2001 From: DeveloperDurp Date: Sat, 27 May 2023 16:32:59 -0500 Subject: [PATCH] added !unraid and restructure --- .gitignore | 1 + handlers/members.go | 30 ++++++++ handlers/shared.go | 75 +++++++++++++++++++ handlers/unraid.go | 124 ++++++++++++++++++++++++++++++++ main.go | 171 +++----------------------------------------- model/model.go | 56 ++++++++++----- 6 files changed, 278 insertions(+), 179 deletions(-) create mode 100644 handlers/members.go create mode 100644 handlers/shared.go create mode 100644 handlers/unraid.go diff --git a/.gitignore b/.gitignore index 38d3f11..03766a1 100644 --- a/.gitignore +++ b/.gitignore @@ -1,3 +1,4 @@ .env node_modules __debug_bin.exe +.vscode \ No newline at end of file diff --git a/handlers/members.go b/handlers/members.go new file mode 100644 index 0000000..188522b --- /dev/null +++ b/handlers/members.go @@ -0,0 +1,30 @@ +package handlers + +import ( + "fmt" + "log" + + "github.com/bwmarrin/discordgo" + "gitlab.com/DeveloperDurp/durpot/model" +) + +var ( + ChannelID = model.ChannelID +) + +func GuildMemberAdd(s *discordgo.Session, m *discordgo.GuildMemberAdd) { + message := fmt.Sprintf("Welcome <@%s> to our server!", m.Member.User.ID) + _, err := s.ChannelMessageSend(ChannelID, message) + if err != nil { + log.Printf("Error sending welcome message: %v\n", err) + } +} + +func GuildMemberRemove(s *discordgo.Session, m *discordgo.GuildMemberRemove) { + + message := fmt.Sprintf("Goodbye %s", m.Member.User.Username) + _, err := s.ChannelMessageSend(ChannelID, message) + if err != nil { + log.Printf("Error sending goodbye message: %v\n", err) + } +} diff --git a/handlers/shared.go b/handlers/shared.go new file mode 100644 index 0000000..de011e9 --- /dev/null +++ b/handlers/shared.go @@ -0,0 +1,75 @@ +package handlers + +import ( + "encoding/json" + "fmt" + "io/ioutil" + "net/http" + "strings" + + "gitlab.com/DeveloperDurp/durpot/model" +) + +func CallDurpAPI(url string, accesstoken string) []byte { + req, err := http.NewRequest("GET", url, nil) + if err != nil { + fmt.Println("Error creating request:", err) + return nil + } + + req.Header.Set("Authorization", "Bearer "+accesstoken) + req.Header.Set("Content-Type", "application/json") + + client := &http.Client{} + resp, err := client.Do(req) + if err != nil { + fmt.Println("Error sending request:", err) + return nil + } + defer resp.Body.Close() + + body, err := ioutil.ReadAll(resp.Body) + if err != nil { + fmt.Println("Error reading response:", err) + return nil + } + return body +} + +func GenerateToken(clientID string, grantType string, url string, username string, password string) model.AccessTokenResponse { + + formData := fmt.Sprintf("grant_type=%s&client_id=%s&username=%s&password=%s", + grantType, clientID, username, password) + + client := &http.Client{} + + req, err := http.NewRequest("POST", url, strings.NewReader(formData)) + if err != nil { + fmt.Println("Error creating request:", err) + return model.AccessTokenResponse{} + } + + req.Header.Set("Content-Type", "application/x-www-form-urlencoded") + + resp, err := client.Do(req) + if err != nil { + fmt.Println("Error sending request:", err) + return model.AccessTokenResponse{} + } + defer resp.Body.Close() + + body, err := ioutil.ReadAll(resp.Body) + if err != nil { + fmt.Println("Error reading response:", err) + return model.AccessTokenResponse{} + } + + var response model.AccessTokenResponse + err = json.Unmarshal(body, &response) + if err != nil { + fmt.Println("Error parsing response:", err) + return model.AccessTokenResponse{} + } + + return response +} diff --git a/handlers/unraid.go b/handlers/unraid.go new file mode 100644 index 0000000..ea58390 --- /dev/null +++ b/handlers/unraid.go @@ -0,0 +1,124 @@ +package handlers + +import ( + "encoding/json" + "fmt" + + "github.com/bwmarrin/discordgo" + "gitlab.com/DeveloperDurp/durpot/model" +) + +var ( + ClientID = model.ClientID + TokenURL = model.TokenURL + Username = model.Username + Password = model.Password +) + +func GetUnraidUsage(s *discordgo.Session, m *discordgo.MessageCreate) { + + token := GenerateToken(ClientID, "client_credentials", TokenURL, Username, Password) + + url := "https://durpapi.durp.info/api/v1/unraid/powerusage" + accessToken := token.AccessToken + + body := CallDurpAPI(url, accessToken) + + var response model.PowerUsageResponse + err := json.Unmarshal(body, &response) + if err != nil { + fmt.Println("Error parsing response:", err) + return + } + + jsonData, _ := json.MarshalIndent(response, "", " ") + jsonStr := string(jsonData) + s.ChannelMessageSend(m.ChannelID, "Power Usage Response:\n```json\n"+jsonStr+"\n```") + +} + +//func getSwansonQuote(s *discordgo.Session, m *discordgo.MessageCreate, url string) { +// resp, err := http.Get(url + "/ronswanson") +// if err != nil { +// errStr := err.Error() +// s.ChannelMessageSend(m.ChannelID, errStr) +// return +// } +// defer resp.Body.Close() +// +// var data []string +// err = json.NewDecoder(resp.Body).Decode(&data) +// if err != nil { +// errStr := err.Error() +// s.ChannelMessageSend(m.ChannelID, errStr) +// return +// } +// +// if len(data) == 0 { +// errStr := "No quotes found." +// s.ChannelMessageSend(m.ChannelID, errStr) +// return +// } +// +// s.ChannelMessageSend(m.ChannelID, data[0]) +//} + +//func sendAPIRequest(s *discordgo.Session, m *discordgo.MessageCreate, url string, endpoint string) { +// var response interface{} +// switch endpoint { +// case "dadjoke": +// url = url + "/dadjoke" +// var data model.DadJokeResponse +// response = &data +// case "jinglebells": +// url = url + "/foaas/jinglebells/durp" +// var data model.JingleBellsResponse +// response = &data +// case "yomama": +// url = url + "/yomama" +// var data model.YomamaJokeResponse +// response = &data +// case "swanson": +// getSwansonQuote(s, m, url) +// return +// default: +// s.ChannelMessageSend(m.ChannelID, "Invalid endpoint.") +// return +// } +// +// req, err := http.NewRequest("GET", url, nil) +// if err != nil { +// errStr := err.Error() +// s.ChannelMessageSend(m.ChannelID, errStr) +// return +// } +// req.Header.Set("Accept", "application/json") +// +// client := http.Client{} +// resp, err := client.Do(req) +// if err != nil { +// errStr := err.Error() +// s.ChannelMessageSend(m.ChannelID, errStr) +// return +// } +// defer resp.Body.Close() +// +// err = json.NewDecoder(resp.Body).Decode(response) +// if err != nil { +// errStr := err.Error() +// s.ChannelMessageSend(m.ChannelID, errStr) +// return +// } +// +// switch endpoint { +// case "dadjoke": +// data := response.(*model.DadJokeResponse) +// s.ChannelMessageSend(m.ChannelID, data.Joke) +// case "jinglebells": +// data := response.(*model.JingleBellsResponse) +// s.ChannelMessageSend(m.ChannelID, data.Message) +// case "yomama": +// data := response.(*model.YomamaJokeResponse) +// s.ChannelMessageSend(m.ChannelID, data.Joke) +// } +//} diff --git a/main.go b/main.go index 82f8211..3fe4ab3 100644 --- a/main.go +++ b/main.go @@ -3,45 +3,22 @@ package main import ( "context" "fmt" - "log" - "os" "strings" "github.com/bwmarrin/discordgo" - "github.com/joho/godotenv" openai "github.com/sashabaranov/go-openai" + "gitlab.com/DeveloperDurp/durpot/handlers" "gitlab.com/DeveloperDurp/durpot/model" ) var ( - Token string - BotPrefix string - ChannelID string + Token = model.Token + BotPrefix = model.BotPrefix + ChannelID = model.ChannelID BotId string - apiKey string - goBot *discordgo.Session - - config *model.ConfigStruct + ApiKey = model.ApiKey ) -func ReadConfig() error { - - err := godotenv.Load(".env") - - if err != nil { - fmt.Println(err.Error()) - //return err - } - - Token = os.Getenv("TOKEN") - BotPrefix = os.Getenv("BOTPREFIX") - ChannelID = os.Getenv("ChannelID") - apiKey = os.Getenv("OPENAI_API_KEY") - - return nil - -} - func Start() { goBot, err := discordgo.New("Bot " + Token) @@ -60,8 +37,8 @@ func Start() { BotId = u.ID goBot.AddHandler(messageHandler) - goBot.AddHandler(handleGuildMemberAdd) - goBot.AddHandler(handleGuildMemberRemove) + goBot.AddHandler(handlers.GuildMemberAdd) + goBot.AddHandler(handlers.GuildMemberRemove) goBot.AddHandler(handleTag) err = goBot.Open() @@ -85,146 +62,18 @@ func messageHandler(s *discordgo.Session, m *discordgo.MessageCreate) { if err != nil { fmt.Println("Failed to send Message") } - //case BotPrefix + "meme": - // response = getJson(baseurl+"random-meme", "url") - // s.ChannelMessageSend(m.ChannelID, response) - //case BotPrefix + "catfact": - // response = getJson(baseurl+"cat-facts/fact", "fact") - // s.ChannelMessageSend(m.ChannelID, response) - //case BotPrefix + "cat": - // response = getJson(baseurl+"random-cats", "file") - // s.ChannelMessageSend(m.ChannelID, response) - //case BotPrefix + "yomama": - // sendAPIRequest(s, m, baseurl, "yomama") - //case BotPrefix + "dadjoke": - // sendAPIRequest(s, m, baseurl, "dadjoke") - //case BotPrefix + "dog": - // response = getJson(baseurl+"random-dogs", "message") - // s.ChannelMessageSend(m.ChannelID, response) - //case BotPrefix + "jinglebells": - // sendAPIRequest(s, m, baseurl, "jinglebells") - //case BotPrefix + "swanson": - // sendAPIRequest(s, m, baseurl, "swanson") + case BotPrefix + "unraid": + handlers.GetUnraidUsage(s, m) } } func main() { - err := ReadConfig() - - if err != nil { - fmt.Println(err.Error()) - return - } Start() <-make(chan struct{}) - return -} - -//func getSwansonQuote(s *discordgo.Session, m *discordgo.MessageCreate, url string) { -// resp, err := http.Get(url + "/ronswanson") -// if err != nil { -// errStr := err.Error() -// s.ChannelMessageSend(m.ChannelID, errStr) -// return -// } -// defer resp.Body.Close() -// -// var data []string -// err = json.NewDecoder(resp.Body).Decode(&data) -// if err != nil { -// errStr := err.Error() -// s.ChannelMessageSend(m.ChannelID, errStr) -// return -// } -// -// if len(data) == 0 { -// errStr := "No quotes found." -// s.ChannelMessageSend(m.ChannelID, errStr) -// return -// } -// -// s.ChannelMessageSend(m.ChannelID, data[0]) -//} - -//func sendAPIRequest(s *discordgo.Session, m *discordgo.MessageCreate, url string, endpoint string) { -// var response interface{} -// switch endpoint { -// case "dadjoke": -// url = url + "/dadjoke" -// var data model.DadJokeResponse -// response = &data -// case "jinglebells": -// url = url + "/foaas/jinglebells/durp" -// var data model.JingleBellsResponse -// response = &data -// case "yomama": -// url = url + "/yomama" -// var data model.YomamaJokeResponse -// response = &data -// case "swanson": -// getSwansonQuote(s, m, url) -// return -// default: -// s.ChannelMessageSend(m.ChannelID, "Invalid endpoint.") -// return -// } -// -// req, err := http.NewRequest("GET", url, nil) -// if err != nil { -// errStr := err.Error() -// s.ChannelMessageSend(m.ChannelID, errStr) -// return -// } -// req.Header.Set("Accept", "application/json") -// -// client := http.Client{} -// resp, err := client.Do(req) -// if err != nil { -// errStr := err.Error() -// s.ChannelMessageSend(m.ChannelID, errStr) -// return -// } -// defer resp.Body.Close() -// -// err = json.NewDecoder(resp.Body).Decode(response) -// if err != nil { -// errStr := err.Error() -// s.ChannelMessageSend(m.ChannelID, errStr) -// return -// } -// -// switch endpoint { -// case "dadjoke": -// data := response.(*model.DadJokeResponse) -// s.ChannelMessageSend(m.ChannelID, data.Joke) -// case "jinglebells": -// data := response.(*model.JingleBellsResponse) -// s.ChannelMessageSend(m.ChannelID, data.Message) -// case "yomama": -// data := response.(*model.YomamaJokeResponse) -// s.ChannelMessageSend(m.ChannelID, data.Joke) -// } -//} - -func handleGuildMemberAdd(s *discordgo.Session, m *discordgo.GuildMemberAdd) { - message := fmt.Sprintf("Welcome <@%s> to our server!", m.Member.User.ID) - _, err := s.ChannelMessageSend(ChannelID, message) - if err != nil { - log.Printf("Error sending welcome message: %v\n", err) - } -} - -func handleGuildMemberRemove(s *discordgo.Session, m *discordgo.GuildMemberRemove) { - - message := fmt.Sprintf("Goodbye %s", m.Member.User.Username) - _, err := s.ChannelMessageSend(ChannelID, message) - if err != nil { - log.Printf("Error sending goodbye message: %v\n", err) - } } func handleTag(s *discordgo.Session, m *discordgo.MessageCreate) { @@ -233,7 +82,7 @@ func handleTag(s *discordgo.Session, m *discordgo.MessageCreate) { return } - client := openai.NewClient(apiKey) + client := openai.NewClient(ApiKey) // Check if bot is mentioned in message for _, mention := range m.Mentions { diff --git a/model/model.go b/model/model.go index 7ae6404..5750c7b 100644 --- a/model/model.go +++ b/model/model.go @@ -1,23 +1,43 @@ package model -type ConfigStruct struct { - Token string `json:"Token"` - BotPrefix string `json:"BotPrefix"` - ChannelID string `json:"ChannelID"` - ApiKey string `json:"OPEN_API_KEY"` +import "os" + +var ( + Token = os.Getenv("TOKEN") + BotPrefix = os.Getenv("BOTPREFIX") + ChannelID = os.Getenv("ChannelID") + ApiKey = os.Getenv("OPENAI_API_KEY") + ClientID = os.Getenv("ClientID") + TokenURL = os.Getenv("TokenURL") + Username = os.Getenv("Username") + Password = os.Getenv("Password") +) + +type AccessTokenResponse struct { + AccessToken string `json:"access_token"` + TokenType string `json:"token_type"` + ExpiresIn int `json:"expires_in"` + IDToken string `json:"id_token"` } -type JingleBellsResponse struct { - Message string `json:"message"` - Subtitle string `json:"subtitle"` -} - -type DadJokeResponse struct { - ID string `json:"id"` - Joke string `json:"joke"` - Status int `json:"status"` -} - -type YomamaJokeResponse struct { - Joke string `json:"joke"` +type PowerUsageResponse struct { + Voltage12VLoad int `json:"12v_load"` + Voltage12VWatts float64 `json:"12v_watts"` + Voltage3VLoad int `json:"3v_load"` + Voltage3VWatts float64 `json:"3v_watts"` + Voltage5VLoad int `json:"5v_load"` + Voltage5VWatts float64 `json:"5v_watts"` + Capacity string `json:"capacity"` + Efficiency float64 `json:"efficiency"` + FanRPM int `json:"fan_rpm"` + Load int `json:"load"` + PoweredOn string `json:"poweredon"` + PoweredOnRaw string `json:"poweredon_raw"` + Product string `json:"product"` + Temperature1 float64 `json:"temp1"` + Temperature2 float64 `json:"temp2"` + Uptime string `json:"uptime"` + UptimeRaw string `json:"uptime_raw"` + Vendor string `json:"vendor"` + TotalWatts float64 `json:"watts"` }