init push

This commit is contained in:
2026-05-21 19:52:45 +08:00
commit e3f75311ab
1280 changed files with 179173 additions and 0 deletions

View File

@@ -0,0 +1,30 @@
package discord
import (
"context"
"testing"
"github.com/chaitin/panda-wiki/config"
"github.com/chaitin/panda-wiki/domain"
"github.com/chaitin/panda-wiki/log"
)
func TestDiscord(t *testing.T) {
cfg, _ := config.NewConfig()
log := log.NewLogger(cfg)
token := "token"
getQA := func(ctx context.Context, msg string, info domain.ConversationInfo, ConversationID string) (chan string, error) {
contentCh := make(chan string, 10)
go func() {
defer close(contentCh)
contentCh <- "hello " + msg
}()
return contentCh, nil
}
c, _ := NewDiscordClient(log, token, getQA)
if err := c.Start(); err != nil {
t.Errorf("Failed to start Discord client: %v", err)
}
select {}
}

View File

@@ -0,0 +1,98 @@
package discord
import (
"context"
"fmt"
"strings"
"github.com/chaitin/panda-wiki/domain"
"github.com/chaitin/panda-wiki/log"
"github.com/chaitin/panda-wiki/pkg/bot"
"github.com/bwmarrin/discordgo"
)
type DiscordClient struct {
logger *log.Logger
BotToken string
dg *discordgo.Session
getQA bot.GetQAFun
}
func NewDiscordClient(logger *log.Logger, BotToken string, getQA bot.GetQAFun) (*DiscordClient, error) {
dg, err := discordgo.New("Bot " + BotToken)
if err != nil {
return nil, fmt.Errorf("failed to create Discord session: %v", err)
}
return &DiscordClient{
logger: logger.WithModule("bot.discord"),
BotToken: BotToken,
dg: dg,
getQA: getQA,
}, nil
}
func (d *DiscordClient) Start() error {
err := d.dg.Open()
if err != nil {
return fmt.Errorf("failed to open Discord connection: %v", err)
}
d.dg.AddHandler(d.handleMessage)
return nil
}
func (d *DiscordClient) Stop() error {
return d.dg.Close()
}
func (d *DiscordClient) handleMessage(s *discordgo.Session, m *discordgo.MessageCreate) {
if m.Author.ID == s.State.User.ID {
return
}
// 判断群聊单聊
d.logger.Debug("接收到消息", log.String("消息内容", m.Content))
d.logger.Debug("接收到消息", log.String("ChannelID", m.ChannelID))
d.logger.Debug("接收到消息", log.String("GuildID", m.GuildID))
// 只接收@ bot 的消息
preFix := fmt.Sprintf("<@%s>", s.State.User.ID)
if !strings.HasPrefix(m.Content, preFix) {
return
}
content := strings.TrimPrefix(m.Content, preFix)
info := domain.ConversationInfo{
UserInfo: domain.UserInfo{
NickName: m.Author.Username,
Email: m.Author.Email,
UserID: m.Author.ID,
},
}
if m.GuildID != "" {
info.UserInfo.From = domain.MessageFromGroup
} else {
info.UserInfo.From = domain.MessageFromPrivate
}
d.logger.Debug("消息来自", log.String("用户名", m.Author.Username), log.String("ID", m.Author.ID), log.String("内容", content))
d.logger.Debug("消息来自频道", log.String("名称", m.ChannelID))
qaChan, err := d.getQA(context.Background(), content, info, "")
if err != nil {
d.logger.Error("failed to get QA", log.String("error", err.Error()))
return
}
message, err := s.ChannelMessageSend(m.ChannelID, "正在获取答案...")
if err != nil {
d.logger.Error("failed to send message to discord", log.String("error", err.Error()))
return
}
go func() {
buf := strings.Builder{}
for qa := range qaChan {
buf.WriteString(qa)
}
_, err := s.ChannelMessageEdit(message.ChannelID, message.ID, buf.String())
if err != nil {
d.logger.Error("failed to edit message to discord", log.String("error", err.Error()))
}
}()
}