Compare commits

...

6 commits

13 changed files with 95 additions and 88 deletions

View file

@ -5,6 +5,7 @@ import (
"fmt"
"strconv"
"git.wh64.net/muffin/goMuffin/configs"
"git.wh64.net/muffin/goMuffin/databases"
"git.wh64.net/muffin/goMuffin/utils"
"github.com/bwmarrin/discordgo"
@ -37,7 +38,7 @@ var DataLengthCommand *Command = &Command{
},
Aliases: []string{"학습데이터량", "데이터량", "학습량"},
DetailedDescription: &DetailedDescription{
Usage: "머핀아 학습데이터량",
Usage: fmt.Sprintf("%s학습데이터량", configs.Config.Bot.Prefix),
},
Category: Generals,
MessageRun: func(ctx *MsgContext) {
@ -48,30 +49,12 @@ var DataLengthCommand *Command = &Command{
},
}
func getLength(data dataType, userId string) {
func getLength(data dataType, coll *mongo.Collection, filter bson.D) {
var err error
var cur *mongo.Cursor
var datas []bson.M
switch data {
case text:
cur, err = databases.Texts.Find(context.TODO(), bson.D{{}})
case muffin:
cur, err = databases.Texts.Find(context.TODO(), bson.D{{Key: "persona", Value: "muffin"}})
case nsfw:
cur, err = databases.Texts.Find(context.TODO(), bson.D{
{
Key: "persona",
Value: bson.M{
"$regex": "^user",
},
},
})
case learn:
cur, err = databases.Learns.Find(context.TODO(), bson.D{{}})
case userLearn:
cur, err = databases.Learns.Find(context.TODO(), bson.D{{Key: "user_id", Value: userId}})
}
cur, err = coll.Find(context.TODO(), filter)
if err != nil {
fmt.Println(err)
}
@ -112,11 +95,18 @@ func dataLengthRun(s *discordgo.Session, m any) {
})
}
go getLength(text, "")
go getLength(muffin, "")
go getLength(nsfw, "")
go getLength(learn, "")
go getLength(userLearn, userId)
go getLength(text, databases.Texts, bson.D{{}})
go getLength(muffin, databases.Texts, bson.D{{Key: "persona", Value: "muffin"}})
go getLength(nsfw, databases.Texts, bson.D{
{
Key: "persona",
Value: bson.M{
"$regex": "^user",
},
},
})
go getLength(learn, databases.Learns, bson.D{{}})
go getLength(userLearn, databases.Learns, bson.D{{Key: "user_id", Value: userId}})
for range 5 {
resp := <-ch
@ -133,6 +123,7 @@ func dataLengthRun(s *discordgo.Session, m any) {
userLearnLength = resp.length
}
}
close(ch)
sum := textLength + learnLength
@ -140,7 +131,7 @@ func dataLengthRun(s *discordgo.Session, m any) {
// 지금은 임시방편
embed := &discordgo.MessageEmbed{
Title: "저장된 데이터량",
Description: "총합: " + utils.InlineCode(strconv.Itoa(sum)) + "개",
Description: fmt.Sprintf("총합: %s개", utils.InlineCode(strconv.Itoa(sum))),
Color: int(utils.EDefault),
Fields: []*discordgo.MessageEmbedField{
{
@ -163,7 +154,7 @@ func dataLengthRun(s *discordgo.Session, m any) {
Inline: true,
},
{
Name: username + "님이 가르쳐준 데이터량",
Name: fmt.Sprintf("%s님이 가르쳐준 데이터량", username),
Value: utils.InlineCode(strconv.Itoa(userLearnLength)) + "개",
Inline: true,
},

View file

@ -2,9 +2,10 @@ package commands
import (
"context"
"strconv"
"fmt"
"strings"
"git.wh64.net/muffin/goMuffin/configs"
"git.wh64.net/muffin/goMuffin/databases"
"git.wh64.net/muffin/goMuffin/utils"
"github.com/bwmarrin/discordgo"
@ -26,8 +27,8 @@ var DeleteLearnedDataCommand *Command = &Command{
},
Aliases: []string{"잊어", "지워"},
DetailedDescription: &DetailedDescription{
Usage: "머핀아 삭제 (삭제할 단어)",
Examples: []string{"머핀아 삭제 머핀"},
Usage: fmt.Sprintf("%s삭제 (삭제할 단어)", configs.Config.Bot.Prefix),
Examples: []string{fmt.Sprintf("%s삭제 머핀", configs.Config.Bot.Prefix)},
},
Category: Chattings,
MessageRun: func(ctx *MsgContext) {
@ -121,18 +122,17 @@ func deleteLearnedDataRun(c *Command, s *discordgo.Session, m any, args *[]strin
data := datas[i]
options = append(options, discordgo.SelectMenuOption{
Label: strconv.Itoa(i+1) + "번 지식",
Label: fmt.Sprintf("%d번 지식", i+1),
Description: data.Result,
Value: utils.DeleteLearnedData + data.Id.Hex() + `&No.` + strconv.Itoa(i+1),
Value: fmt.Sprintf("%s%s&No.%d", utils.DeleteLearnedData, data.Id.Hex(), i+1),
})
description += strconv.Itoa(i+1) + ". " + data.Result + "\n"
description += fmt.Sprintf("%d. %s\n", i+1, data.Result)
}
embed := &discordgo.MessageEmbed{
Title: command + " 삭제",
Description: utils.CodeBlockWithLanguage("md", "# "+command+" 에 대한 대답 중 하나를 선ㅌ택하여 삭제해주세요.\n"+
description),
Color: int(utils.EDefault),
Title: fmt.Sprintf("%s 삭제", command),
Description: utils.CodeBlockWithLanguage("md", fmt.Sprintf("# %s에 대한 대답 중 하나를 선ㅌ택하여 삭제해주세요.\n%s", command, description)),
Color: int(utils.EDefault),
}
components := []discordgo.MessageComponent{

View file

@ -1,6 +1,7 @@
package commands
import (
"fmt"
"strings"
"git.wh64.net/muffin/goMuffin/configs"
@ -33,8 +34,8 @@ var HelpCommand *Command = &Command{
},
Aliases: []string{"도움", "명령어", "help"},
DetailedDescription: &DetailedDescription{
Usage: "머핀아 도움말 [명령어]",
Examples: []string{"머핀아 도움말", "머핀아 도움말 배워"},
Usage: fmt.Sprintf("%s도움말 [명령어]", configs.Config.Bot.Prefix),
Examples: []string{fmt.Sprintf("%s도움말", configs.Config.Bot.Prefix), fmt.Sprintf("%s도움말 배워", configs.Config.Bot.Prefix)},
},
Category: Generals,
MessageRun: func(ctx *MsgContext) {
@ -50,7 +51,7 @@ func getCommandsByCategory(d *DiscommandStruct, category Category) []string {
commands := []string{}
for _, command := range d.Commands {
if command.Category == category {
commands = append(commands, "- "+command.Name+": "+command.Description)
commands = append(commands, fmt.Sprintf("- %s: %s", command.Name, command.Description))
}
}
return commands
@ -61,7 +62,7 @@ func helpRun(c *Command, s *discordgo.Session, m any, args *[]string) {
embed := &discordgo.MessageEmbed{
Color: int(utils.EDefault),
Footer: &discordgo.MessageEmbedFooter{
Text: "버전:" + configs.MUFFIN_VERSION,
Text: fmt.Sprintf("버전: %s", configs.MUFFIN_VERSION),
},
Thumbnail: &discordgo.MessageEmbedThumbnail{
URL: s.State.User.AvatarURL("512"),
@ -82,13 +83,12 @@ func helpRun(c *Command, s *discordgo.Session, m any, args *[]string) {
}
if commandName == "" || Discommand.Commands[commandName] == nil {
embed.Title = s.State.User.Username + "의 도움말"
embed.Title = fmt.Sprintf("%s의 도움말", s.State.User.Username)
embed.Description = utils.CodeBlockWithLanguage(
"md",
"# 일반\n"+
strings.Join(getCommandsByCategory(Discommand, Generals), "\n")+
"\n\n# 채팅\n"+
strings.Join(getCommandsByCategory(Discommand, Chattings), "\n"),
fmt.Sprintf("# 일반\n%s\n\n# 채팅\n%s",
strings.Join(getCommandsByCategory(Discommand, Generals), "\n"),
strings.Join(getCommandsByCategory(Discommand, Chattings), "\n")),
)
switch m := m.(type) {
@ -107,7 +107,7 @@ func helpRun(c *Command, s *discordgo.Session, m any, args *[]string) {
command := Discommand.Commands[commandName]
embed.Title = s.State.User.Username + "의 " + command.Name + " 도움말"
embed.Title = fmt.Sprintf("%s의 %s 도움말", s.State.User.Username, command.Name)
embed.Fields = []*discordgo.MessageEmbedField{
{
Name: "설명",

View file

@ -1,6 +1,7 @@
package commands
import (
"fmt"
"runtime"
"git.wh64.net/muffin/goMuffin/configs"
@ -11,10 +12,10 @@ import (
var InformationCommand *Command = &Command{
ApplicationCommand: &discordgo.ApplicationCommand{
Name: "정보",
Description: "머핀봇의 정보를 알ㄹ려줘요.",
Description: "해당 봇의 정보를 알ㄹ려줘요.",
},
DetailedDescription: &DetailedDescription{
Usage: "머핀아 정보",
Usage: fmt.Sprintf("%s정보", configs.Config.Bot.Prefix),
},
Category: Generals,
MessageRun: func(ctx *MsgContext) {
@ -28,11 +29,11 @@ var InformationCommand *Command = &Command{
func informationRun(s *discordgo.Session, m any) {
owner, _ := s.User(configs.Config.Bot.OwnerId)
embed := &discordgo.MessageEmbed{
Title: s.State.User.Username + "의 정보",
Title: fmt.Sprintf("%s의 정보", s.State.User.Username),
Fields: []*discordgo.MessageEmbedField{
{
Name: "운영 체제",
Value: utils.InlineCode(runtime.GOOS + " " + runtime.GOARCH),
Value: utils.InlineCode(fmt.Sprintf("%s %s", runtime.GOOS, runtime.GOARCH)),
},
{
Name: "제작자",

View file

@ -35,10 +35,11 @@ var LearnCommand *Command = &Command{
},
Aliases: []string{"공부"},
DetailedDescription: &DetailedDescription{
Usage: "머핀아 배워 (등록할 단어) (대답)",
Examples: []string{"머핀아 배워 안녕 안녕!",
"머핀아 배워 \"야 죽을래?\" \"아니요 ㅠㅠㅠ\"",
"머핀아 배워 미간은_누구야? 이봇의_개발자요",
Usage: fmt.Sprintf("%s배워 (등록할 단어) (대답)", configs.Config.Bot.Prefix),
Examples: []string{
fmt.Sprintf("%s배워 안녕 안녕!", configs.Config.Bot.Prefix),
fmt.Sprintf("%s배워 \"야 죽을래?\" \"아니요 ㅠㅠㅠ\"", configs.Config.Bot.Prefix),
fmt.Sprintf("%s배워 미간은_누구야? 이봇의_개발자요", configs.Config.Bot.Prefix),
},
},
Category: Chattings,
@ -53,7 +54,7 @@ var LearnCommand *Command = &Command{
func addPrefix(arr []string) (newArr []string) {
for _, item := range arr {
newArr = append(newArr, "- "+item)
newArr = append(newArr, fmt.Sprintf("- %s", item))
}
return
}
@ -123,7 +124,8 @@ func learnRun(c *Command, s *discordgo.Session, m any, args *[]string) {
disallows := []string{
"@everyone",
"@here",
"<@" + configs.Config.Bot.OwnerId + ">"}
fmt.Sprintf("<@%s>", configs.Config.Bot.OwnerId),
}
for _, ig := range ignores {
if strings.Contains(command, ig) {
@ -191,7 +193,7 @@ func learnRun(c *Command, s *discordgo.Session, m any, args *[]string) {
embed := &discordgo.MessageEmbed{
Title: "✅ 성공",
Description: hangul.GetJosa(command, hangul.EUL_REUL) + " 배웠어요.",
Description: fmt.Sprintf("%s 배웠어요.", hangul.GetJosa(command, hangul.EUL_REUL)),
Color: int(utils.ESuccess),
}

View file

@ -3,9 +3,9 @@ package commands
import (
"context"
"fmt"
"strconv"
"strings"
"git.wh64.net/muffin/goMuffin/configs"
"git.wh64.net/muffin/goMuffin/databases"
"git.wh64.net/muffin/goMuffin/utils"
"github.com/bwmarrin/discordgo"
@ -21,7 +21,7 @@ var LearnedDataListCommand *Command = &Command{
},
Aliases: []string{"list", "목록", "지식목록"},
DetailedDescription: &DetailedDescription{
Usage: "머핀아 리스트",
Usage: fmt.Sprintf("%s리스트", configs.Config.Bot.Prefix),
},
Category: Chattings,
MessageRun: func(ctx *MsgContext) {
@ -34,7 +34,7 @@ var LearnedDataListCommand *Command = &Command{
func getDescriptions(datas *[]databases.Learn) (descriptions []string) {
for _, data := range *datas {
descriptions = append(descriptions, "- "+data.Command+": "+data.Result)
descriptions = append(descriptions, fmt.Sprintf("- %s: %s", data.Command, data.Result))
}
return
}
@ -103,8 +103,8 @@ func learnedDataListRun(s *discordgo.Session, m any) {
cur.All(context.TODO(), &datas)
embed := &discordgo.MessageEmbed{
Title: globalName + "님이 알려주신 지식",
Description: utils.CodeBlockWithLanguage("md", "# 총 "+strconv.Itoa(len(datas))+"개에요.\n"+strings.Join(getDescriptions(&datas), "\n")),
Title: fmt.Sprintf("%s님이 알려주신 지식", globalName),
Description: utils.CodeBlockWithLanguage("md", fmt.Sprintf("# 총 %d개에요.\n%s", len(datas), strings.Join(getDescriptions(&datas), "\n"))),
Color: int(utils.EDefault),
Thumbnail: &discordgo.MessageEmbedThumbnail{
URL: avatarUrl,

View file

@ -2,6 +2,7 @@ package components
import (
"context"
"fmt"
"strings"
"git.wh64.net/muffin/goMuffin/commands"
@ -68,7 +69,7 @@ var DeleteLearnedDataComponent *commands.Component = &commands.Component{
Embeds: &[]*discordgo.MessageEmbed{
{
Title: "✅ 삭제 완료",
Description: itemId + "번을 삭ㅈ제했어요.",
Description: fmt.Sprintf("%s번을 삭ㅈ제했어요.", itemId),
Color: int(utils.ESuccess),
},
},

View file

@ -8,7 +8,6 @@ import (
"github.com/joho/godotenv"
)
type botConfig struct {
Token string
Prefix string
@ -29,23 +28,35 @@ type MuffinConfig struct {
func loadConfig() *MuffinConfig {
err := godotenv.Load()
if err != nil {
fmt.Println("[goMuffin] 봇의 설절파일을 불러올 수가 없어요.")
log.Println("[goMuffin] 봇의 설절파일을 불러올 수가 없어요.")
log.Fatalln(err)
}
config := MuffinConfig{Bot: botConfig{}, Train: trainConfig{}}
setConfig(&config)
config := &MuffinConfig{Bot: botConfig{}, Train: trainConfig{}}
setConfig(config)
return &config
return config
}
func getRequiredValue(key string) string {
value := os.Getenv(key)
if value == "" {
log.Fatalln(fmt.Sprintf("[goMuffin] .env 파일에서 필요한 %s값이 없어요.", key))
}
return value
}
func getValue(key string) string {
return os.Getenv(key)
}
func setConfig(config *MuffinConfig) {
config.Bot.Prefix = os.Getenv("BOT_PREFIX")
config.Bot.Token = os.Getenv("BOT_TOKEN")
config.Bot.OwnerId = os.Getenv("BOT_OWNER_ID")
config.Bot.Prefix = getRequiredValue("BOT_PREFIX")
config.Bot.Token = getRequiredValue("BOT_TOKEN")
config.Bot.OwnerId = getRequiredValue("BOT_OWNER_ID")
config.Train.UserID = os.Getenv("TRAIN_USER_ID")
config.Train.UserID = getValue("TRAIN_USER_ID")
config.DatabaseURL = os.Getenv("DATABASE_URL")
config.DatabaseURL = getRequiredValue("DATABASE_URL")
}
var Config *MuffinConfig = loadConfig()

View file

@ -7,7 +7,7 @@ import (
"git.wh64.net/muffin/goMuffin/utils"
)
const MUFFIN_VERSION = "0.0.0-gopher_canary.250331b"
const MUFFIN_VERSION = "0.0.0-gopher_dev.250403a"
var updatedString string = utils.Decimals.FindAllStringSubmatch(MUFFIN_VERSION, -1)[3][0]

2
go.mod
View file

@ -1,6 +1,6 @@
module git.wh64.net/muffin/goMuffin
go 1.23.2
go 1.24.1
require (
github.com/LoperLee/golang-hangul-toolkit v1.1.0

View file

@ -2,6 +2,7 @@ package handler
import (
"context"
"fmt"
"log"
"math/rand"
"strings"
@ -65,7 +66,7 @@ func MessageCreate(s *discordgo.Session, m *discordgo.MessageCreate) {
if _, err := databases.Texts.InsertOne(context.TODO(), databases.InsertText{
Text: content,
Persona: "user:" + m.Author.Username,
Persona: fmt.Sprintf("user:%s", m.Author.Username),
CreatedAt: time.Now(),
}); err != nil {
log.Fatalln(err)
@ -104,11 +105,12 @@ func MessageCreate(s *discordgo.Session, m *discordgo.MessageCreate) {
for range 2 {
<-ch
}
close(ch)
if x > 2 && len(learnDatas) != 0 {
data := learnDatas[rand.Intn(len(learnDatas))]
user, _ := s.User(data.UserId)
s.ChannelMessageSendReply(m.ChannelID, data.Result+"\n"+utils.InlineCode(user.Username+"님이 알려주셨어요."), m.Reference())
s.ChannelMessageSendReply(m.ChannelID, fmt.Sprintf("%s\n%s", data.Result, utils.InlineCode(fmt.Sprintf("%s님이 알려주셨어요.", user.Username))), m.Reference())
return
}

View file

@ -2,7 +2,6 @@ package main
import (
"context"
"fmt"
"log"
"os"
"os/signal"
@ -22,7 +21,7 @@ func main() {
dg, err := discordgo.New("Bot " + config.Bot.Token)
if err != nil {
fmt.Println("[goMuffin] 봇의 세션을 만들수가 없어요.")
log.Println("[goMuffin] 봇의 세션을 만들수가 없어요.")
log.Fatalln(err)
}
@ -46,7 +45,7 @@ func main() {
}
}()
fmt.Println("[goMuffin] 봇이 실행되고 있어요. 버전:", configs.MUFFIN_VERSION)
log.Println("[goMuffin] 봇이 실행되고 있어요. 버전:", configs.MUFFIN_VERSION)
sc := make(chan os.Signal, 1)
signal.Notify(sc, syscall.SIGINT, syscall.SIGTERM, os.Interrupt)
<-sc

View file

@ -1,7 +1,7 @@
package utils
import (
"strconv"
"fmt"
"time"
)
@ -18,12 +18,12 @@ const (
RelativeTime = "R"
)
func InlineCode(str string) string {
return "`" + str + "`"
func InlineCode(content string) string {
return fmt.Sprintf("`%s`", content)
}
func CodeBlockWithLanguage(language string, content string) string {
return "```" + language + "\n" + content + "\n" + "```"
return fmt.Sprintf("```%s\n%s\n```", language, content)
}
func CodeBlock(content string) string {
@ -31,9 +31,9 @@ func CodeBlock(content string) string {
}
func Time(time *time.Time) string {
return "<t:" + strconv.FormatInt(time.Unix(), 10) + ">"
return fmt.Sprintf("<t:%d>", time.Unix())
}
func TimeWithStyle(time *time.Time, style string) string {
return "<t:" + strconv.FormatInt(time.Unix(), 10) + ":" + style + ">"
return fmt.Sprintf("<t:%d:%s>", time.Unix(), style)
}