goMuffin/main.go
2025-05-26 22:46:37 +09:00

136 lines
3.5 KiB
Go

package main
import (
"context"
"flag"
"fmt"
"log"
"os"
"os/signal"
"syscall"
"time"
"git.wh64.net/muffin/goMuffin/chatbot"
"git.wh64.net/muffin/goMuffin/commands"
"git.wh64.net/muffin/goMuffin/components"
"git.wh64.net/muffin/goMuffin/configs"
"git.wh64.net/muffin/goMuffin/databases"
"git.wh64.net/muffin/goMuffin/handler"
"git.wh64.net/muffin/goMuffin/modals"
"git.wh64.net/muffin/goMuffin/scripts"
"github.com/bwmarrin/discordgo"
"github.com/devproje/commando"
"github.com/devproje/commando/types"
)
func init() {
go commands.Discommand.LoadCommand(commands.HelpCommand)
go commands.Discommand.LoadCommand(commands.DataLengthCommand)
go commands.Discommand.LoadCommand(commands.LearnCommand)
go commands.Discommand.LoadCommand(commands.LearnedDataListCommand)
go commands.Discommand.LoadCommand(commands.InformationCommand)
go commands.Discommand.LoadCommand(commands.DeleteLearnedDataCommand)
go commands.Discommand.LoadComponent(components.DeleteLearnedDataComponent)
go commands.Discommand.LoadComponent(components.PaginationEmbedComponent)
go commands.Discommand.LoadModal(modals.PaginationEmbedModal)
}
func main() {
command := commando.NewCommando(os.Args[1:])
config := configs.Config
if len(os.Args) > 1 {
command.Root("delete-all-commands", "봇의 모든 슬래시 커맨드를 삭제합니다.", scripts.DeleteAllCommands,
types.OptionData{
Name: "id",
Desc: "봇의 디스코드 아이디",
Type: types.STRING,
},
types.OptionData{
Name: "isYes",
Short: []string{"y"},
Type: types.BOOLEAN,
},
)
command.Root("export", "머핀봇의 데이터를 추출합니다.", scripts.ExportData,
types.OptionData{
Name: "type",
Desc: "파일형식을 지정합니다. (json, jsonl, finetune)",
Type: types.STRING,
},
types.OptionData{
Name: "export-path",
Desc: "데이터를 저장할 위치를 지정합니다.",
Type: types.STRING,
},
types.OptionData{
Name: "refined",
Desc: "머핀 데이터를 있는 그대로 추출할 지, 가려내서 추출할 지를 지정합니다.",
Type: types.BOOLEAN,
},
)
err := command.Execute()
if err != nil {
_, _ = fmt.Fprintln(os.Stderr, err)
os.Exit(1)
}
return
}
isAI := flag.Bool("ai", false, "시작할 때 AI모드로 설정합니다.")
flag.Parse()
dg, _ := discordgo.New("Bot " + config.Bot.Token)
go dg.AddHandler(handler.MessageCreate)
go dg.AddHandler(handler.InteractionCreate)
err := dg.Open()
if err != nil {
log.Println("[goMuffin] 봇을 시작할 수 없어요.")
log.Fatalln(err)
}
chatbot.New(dg)
if *isAI {
chatbot.ChatBot.SetMode(chatbot.ChatbotAI)
}
defer dg.Close()
// 봇의 상태메세지 변경
go func() {
for {
dg.UpdateCustomStatus("ㅅ살려주세요..!")
time.Sleep(time.Minute * 10)
}
}()
for _, cmd := range commands.Discommand.Commands {
if cmd.Name == commands.HelpCommand.Name {
// 극한의 성능 똥망 코드 탄생!
// 무려 똑같은 걸 반복해서 돌리는!
for _, a := range commands.Discommand.Commands {
cmd.Options[0].Choices = append(cmd.Options[0].Choices, &discordgo.ApplicationCommandOptionChoice{
Name: a.Name,
Value: a.Name,
})
}
}
go dg.ApplicationCommandCreate(dg.State.User.ID, "", cmd.ApplicationCommand)
}
defer databases.Database.Client.Disconnect(context.TODO())
log.Println("[goMuffin] 봇이 실행되고 있어요. 버전:", configs.MUFFIN_VERSION)
sc := make(chan os.Signal, 1)
signal.Notify(sc, syscall.SIGINT, syscall.SIGTERM, os.Interrupt)
<-sc
}