apps-durpot/main.go

274 lines
6.2 KiB
Go
Raw Normal View History

2022-11-23 19:31:58 -06:00
package main
import (
2023-03-28 20:22:53 -05:00
"context"
2022-11-23 19:31:58 -06:00
"fmt"
2023-03-28 19:31:43 -05:00
"log"
2022-11-23 19:31:58 -06:00
"os"
2023-03-28 20:22:53 -05:00
"strings"
2022-11-23 19:31:58 -06:00
"github.com/bwmarrin/discordgo"
"github.com/joho/godotenv"
2023-03-28 20:22:53 -05:00
openai "github.com/sashabaranov/go-openai"
2023-05-27 12:47:36 -05:00
"gitlab.com/DeveloperDurp/durpot/model"
2022-11-23 19:31:58 -06:00
)
var (
Token string
BotPrefix string
2023-03-28 19:31:43 -05:00
ChannelID string
BotId string
2023-03-28 20:22:53 -05:00
apiKey string
2023-03-28 19:31:43 -05:00
goBot *discordgo.Session
2022-11-23 19:31:58 -06:00
2023-05-27 12:47:36 -05:00
config *model.ConfigStruct
2022-11-23 19:31:58 -06:00
)
func ReadConfig() error {
err := godotenv.Load(".env")
if err != nil {
fmt.Println(err.Error())
2023-03-29 16:27:23 -05:00
//return err
2022-11-23 19:31:58 -06:00
}
Token = os.Getenv("TOKEN")
BotPrefix = os.Getenv("BOTPREFIX")
2023-03-28 19:31:43 -05:00
ChannelID = os.Getenv("ChannelID")
2023-03-28 20:22:53 -05:00
apiKey = os.Getenv("OPENAI_API_KEY")
2022-11-23 19:31:58 -06:00
return nil
}
func Start() {
goBot, err := discordgo.New("Bot " + Token)
if err != nil {
fmt.Println(err.Error())
return
}
u, err := goBot.User("@me")
if err != nil {
fmt.Println(err.Error())
return
}
BotId = u.ID
goBot.AddHandler(messageHandler)
2023-03-28 19:31:43 -05:00
goBot.AddHandler(handleGuildMemberAdd)
goBot.AddHandler(handleGuildMemberRemove)
2023-03-28 20:22:53 -05:00
goBot.AddHandler(handleTag)
2022-11-23 19:31:58 -06:00
err = goBot.Open()
if err != nil {
fmt.Println(err.Error())
return
}
2023-03-28 19:15:56 -05:00
fmt.Println("Bot is running!")
2022-11-23 19:31:58 -06:00
}
func messageHandler(s *discordgo.Session, m *discordgo.MessageCreate) {
if m.Author.ID == BotId {
return
}
2023-05-27 12:47:36 -05:00
//baseurl := "https://kong.durp.info/"
2022-11-23 19:31:58 -06:00
switch m.Content {
case BotPrefix + "ping":
2023-05-27 12:47:36 -05:00
_, err := s.ChannelMessageSend(m.ChannelID, "pong")
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")
2023-03-28 19:15:56 -05:00
2022-11-23 19:31:58 -06:00
}
}
func main() {
err := ReadConfig()
if err != nil {
fmt.Println(err.Error())
return
}
Start()
<-make(chan struct{})
return
}
2023-05-27 12:47:36 -05:00
//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)
// }
//}
2023-03-28 19:31:43 -05:00
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)
}
}
2023-03-28 20:22:53 -05:00
func handleTag(s *discordgo.Session, m *discordgo.MessageCreate) {
// Ignore messages sent by the bot itself
if m.Author.ID == s.State.User.ID {
return
}
client := openai.NewClient(apiKey)
// Check if bot is mentioned in message
for _, mention := range m.Mentions {
if mention.ID == s.State.User.ID {
// Remove mention from message content
content := strings.Replace(m.ContentWithMentionsReplaced(), "<@"+s.State.User.ID+">", "", -1)
content = strings.Replace(content, "<@!"+s.State.User.ID+">", "", -1)
content = strings.TrimSpace(content)
resp, err := client.CreateChatCompletion(
context.Background(),
openai.ChatCompletionRequest{
Model: openai.GPT3Dot5Turbo,
Messages: []openai.ChatCompletionMessage{
{
Role: openai.ChatMessageRoleUser,
Content: content,
},
},
},
)
if err != nil {
fmt.Printf("ChatCompletion error: %v\n", err)
return
}
fmt.Println(resp.Choices[0].Message.Content)
// Send generated response back to Discord
_, err = s.ChannelMessageSend(m.ChannelID, resp.Choices[0].Message.Content)
if err != nil {
fmt.Println(err)
}
}
}
}