Skip to content

Commit

Permalink
fix send channel image
Browse files Browse the repository at this point in the history
  • Loading branch information
2mf8 committed Jul 31, 2022
1 parent fe14788 commit 24b2111
Show file tree
Hide file tree
Showing 7 changed files with 100 additions and 16 deletions.
41 changes: 37 additions & 4 deletions pkg/bot/api_handler.go
Original file line number Diff line number Diff line change
Expand Up @@ -56,7 +56,7 @@ func preProcessPrivateSendingMessage(cli *client.QQClient, target int64, m *mess
log.Errorf("failed to upload private image, %+v", err)
continue
}
if i.Tp == "flash" {
if i.LocalImageType == "flash" {
img.Flash = true
}
newElements = append(newElements, img)
Expand Down Expand Up @@ -109,9 +109,9 @@ func preProcessGroupSendingMessage(cli *client.QQClient, groupCode int64, m *mes
continue
}
if img, ok := img.(*message.GroupImageElement); ok {
if i.Tp == "flash" {
if i.LocalImageType == "flash" {
img.Flash = true
} else if i.Tp == "show" {
} else if i.LocalImageType == "show" {
img.EffectID = i.EffectId
}
}
Expand Down Expand Up @@ -613,14 +613,47 @@ func HandleSetFriendPoke(cli *client.QQClient, req *onebot.SetFriendPokeReq) *on
return nil
}

func preProcessChannelSendingMessage(cli *client.QQClient, guildid uint64, channelId uint64, m *message.SendingMessage) {
newElements := make([]message.IMessageElement, 0, len(m.Elements))
for _, element := range m.Elements {
if i, ok := element.(*message.TextElement); ok {
for _, text := range utils.ChunkString(i.Content, MAX_TEXT_LENGTH) {
if text != "" {
newElements = append(newElements, message.NewText(text))
}
}
continue
}
if i, ok := element.(*clz.LocalImageElement); ok {
img, err := cli.UploadImage(message.Source{SourceType: message.SourceGuildChannel, PrimaryID: int64(guildid), SecondaryID: int64(channelId)}, i.Stream)
if err != nil {
log.Errorf("failed to upload guild image, %+v", err)
continue
}
newElements = append(newElements, img)
continue
}
}
m.Elements = newElements
}

func HandleSendChannelMsg(cli *client.QQClient, req *onebot.SendChannelMsgReq) *onebot.SendChannelMsgResp {
if len(req.Message) == 0 {
log.Warnf("消息为空")
return nil
}
miraiMsg := ProtoMsgToMiraiMsg(cli, req.Message, req.AutoEscape)
sendingMessage := &message.SendingMessage{Elements: miraiMsg}
channelInfo, _ := cli.GuildService.FetchChannelInfo(req.GuildId, req.ChannelId)
log.Infof("Bot(%+v) Guild(%+v) ChannelId(%+v) <- %+v\n", cli.Uin, req.GuildId, req.ChannelId, MiraiMsgToRawMsg(cli, miraiMsg))
log.Infof("Bot(%+v) GuildId(%+v) ChannelId(%+v) <- %+v\n", cli.Uin, req.GuildId, req.ChannelId, MiraiMsgToRawMsg(cli, miraiMsg))
if channelInfo.ChannelType != client.ChannelTypeText {
log.Warnf("无法发送频道信息: 频道类型错误, 不接受文本信息")
}
preProcessChannelSendingMessage(cli, req.GuildId, req.ChannelId, sendingMessage)
if len(sendingMessage.Elements) == 0 {
log.Warnf("发送消息内容为空")
return nil
}
ret, _ := cli.GuildService.SendGuildChannelMessage(req.GuildId, req.ChannelId, sendingMessage)
if ret == nil {
return nil
Expand Down
15 changes: 15 additions & 0 deletions pkg/bot/mirai2proto.go
Original file line number Diff line number Diff line change
Expand Up @@ -22,6 +22,8 @@ func MiraiMsgToProtoMsg(cli *client.QQClient, messageChain []message.IMessageEle
msgList = append(msgList, MiraiDiceToProtoDice(elem))
case *message.FingerGuessingElement:
msgList = append(msgList, MiraiFingerGuessingToProtoFingerGuessing(elem))
case *message.GuildImageElement:
msgList = append(msgList, MiraiGuildImageToProtoImage(elem))
case *message.FriendImageElement:
msgList = append(msgList, MiraiFriendImageToProtoImage(elem))
case *message.GroupImageElement:
Expand Down Expand Up @@ -88,6 +90,19 @@ func MiraiGroupImageToProtoImage(elem *message.GroupImageElement) *onebot.Messag
return msg
}

func MiraiGuildImageToProtoImage(elem *message.GuildImageElement) *onebot.Message {
msg := &onebot.Message{
Type: "guild_image",
Data: map[string]string{
"file_id": strconv.FormatInt(elem.FileId, 10),
"file": elem.FilePath,
"url": elem.Url,
"download_index": elem.DownloadIndex,
},
}
return msg
}

func MiraiLocalImageToProtoImage(elem *clz.LocalImageElement) *onebot.Message {
return &onebot.Message{
Type: "image",
Expand Down
6 changes: 3 additions & 3 deletions pkg/bot/mirai2raw.go
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,7 @@ package bot
import (
"fmt"
"html"

"strconv"
"github.com/ProtobufBot/Go-Mirai-Client/pkg/clz"

"github.com/Mrs4s/MiraiGo/client"
Expand All @@ -22,12 +22,12 @@ func MiraiMsgToRawMsg(cli *client.QQClient, messageChain []message.IMessageEleme
result += fmt.Sprintf(`<dice value="%d"/>`, elem.Value)
case *message.FingerGuessingElement:
result += fmt.Sprintf(`<finger_guessing value="%d" name="%s"/>`, elem.Value, elem.Name)
case *message.GuildImageElement:
result += fmt.Sprintf(`<guild_image file_id="%s" file="%s" url="%s"/>`, html.EscapeString(strconv.FormatInt(elem.FileId, 10)), html.EscapeString(elem.FilePath), html.EscapeString(elem.Url))
case *message.FriendImageElement:
result += fmt.Sprintf(`<image image_id="%s" url="%s"/>`, html.EscapeString(elem.ImageId), html.EscapeString(elem.Url))
case *message.GroupImageElement:
result += fmt.Sprintf(`<image image_id="%s" url="%s"/>`, html.EscapeString(elem.ImageId), html.EscapeString(elem.Url))
case *message.GuildImageElement:
result += fmt.Sprintf(`<image image_id="%s" url="%s"/>`, html.EscapeString(elem.FilePath), html.EscapeString(elem.Url))
case *clz.LocalImageElement:
result += fmt.Sprintf(`<image url="%s"/>`, html.EscapeString(elem.Url))
case *message.FaceElement:
Expand Down
38 changes: 36 additions & 2 deletions pkg/bot/proto2mirai.go
Original file line number Diff line number Diff line change
Expand Up @@ -55,6 +55,8 @@ func ProtoMsgToMiraiMsg(cli *client.QQClient, msgList []*onebot.Message, notConv
messageChain = append(messageChain, ProtoPokeToMiraiPoke(protoMsg.Data))
case "sign_in":
messageChain = append(messageChain, ProtoSignInToMiraiSignIn(protoMsg.Data))
case "guild_image":
messageChain = append(messageChain, ProtoGuildImageToMiraiGuildImage(protoMsg.Data))
case "image":
messageChain = append(messageChain, ProtoImageToMiraiImage(protoMsg.Data))
case "img":
Expand Down Expand Up @@ -128,8 +130,8 @@ func ProtoImageToMiraiImage(data map[string]string) message.IMessageElement {
elem.Stream = bytes.NewReader(imageBytes)
}

elem.Tp = data["type"] // show或flash
if elem.Tp == "show" {
elem.LocalImageType = data["type"] // show或flash
if elem.LocalImageType == "show" {
effectIdStr := data["effect_id"]
effectId, err := strconv.Atoi(effectIdStr)
if err != nil || effectId < 40000 || effectId > 40005 {
Expand All @@ -141,6 +143,38 @@ func ProtoImageToMiraiImage(data map[string]string) message.IMessageElement {
return elem
}

func ProtoGuildImageToMiraiGuildImage(data map[string]string) message.IMessageElement {
elem := &clz.LocalImageElement{}
url, ok := data["url"]
if !ok {
url, ok = data["src"] // TODO 为了兼容我的旧代码偷偷加的
if !ok {
url, ok = data["file"]
}
}
if !ok {
log.Warnf("imageUrl不存在")
return EmptyText()
}
elem.Url = url
if strings.Contains(url, "http://") || strings.Contains(url, "https://") {
b, err := util.GetBytes(url)
if err != nil {
log.Errorf("failed to download image, %+v", err)
return EmptyText()
}
elem.Stream = bytes.NewReader(b)
} else {
imageBytes, err := ioutil.ReadFile(url)
if err != nil {
log.Errorf("failed to open local image, %+v", err)
return EmptyText()
}
elem.Stream = bytes.NewReader(imageBytes)
}
return elem
}

func ProtoVoiceToMiraiVoice(data map[string]string) message.IMessageElement {
url, ok := data["url"]
if !ok {
Expand Down
2 changes: 2 additions & 0 deletions pkg/bot/raw2mirai.go
Original file line number Diff line number Diff line change
Expand Up @@ -53,6 +53,8 @@ func RawMsgToMiraiMsg(cli *client.QQClient, str string) []message.IMessageElemen
elemList = append(elemList, ProtoFingerGuessingToMiraiFingerGuessing(attrMap))
case "poke":
elemList = append(elemList, ProtoPokeToMiraiPoke(attrMap))
case "guild_image":
elemList = append(elemList, ProtoGuildImageToMiraiGuildImage(attrMap))
case "img":
elemList = append(elemList, ProtoImageToMiraiImage(attrMap)) // TODO 为了兼容我的旧代码偷偷加的
case "image":
Expand Down
12 changes: 6 additions & 6 deletions pkg/clz/clz.go
Original file line number Diff line number Diff line change
Expand Up @@ -16,10 +16,10 @@ type MyVideoElement struct {
}

type LocalImageElement struct {
Url string
Stream io.ReadSeeker
Tp string // 类型 flash/show
EffectId int32 // show的特效id,范围40000-40005
Url string
Stream io.ReadSeeker
LocalImageType string // 类型 flash/show
EffectId int32 // show的特效id,范围40000-40005
}

func (m *LocalImageElement) Type() message.ElementType {
Expand All @@ -37,6 +37,6 @@ func (g *PokeElement) Type() message.ElementType {
return message.At
}

func (s *SignInElement) Type() message.ElementType{
func (s *SignInElement) Type() message.ElementType {
return message.Text
}
}
2 changes: 1 addition & 1 deletion pkg/gmc/plugins/log.go
Original file line number Diff line number Diff line change
Expand Up @@ -22,6 +22,6 @@ func LogGroupMessage(cli *client.QQClient, event *message.GroupMessage) int32 {
}

func LogChannelMessage(cli *client.QQClient, event *message.GuildChannelMessage) int32 {
log.Infof("Bot(%+v) Guild(%+v) ChannelId(%+v) -> %+v\n", cli.Uin, event.GuildId, event.ChannelId, bot.MiraiMsgToRawMsg(cli, event.Elements))
log.Infof("Bot(%+v) GuildId(%+v) ChannelId(%+v) -> %+v\n", cli.Uin, event.GuildId, event.ChannelId, bot.MiraiMsgToRawMsg(cli, event.Elements))
return plugin.MessageIgnore
}

0 comments on commit 24b2111

Please sign in to comment.