From 65a3c5634046049522af042f6d3c058e1ddbf906 Mon Sep 17 00:00:00 2001 From: "Lex.Margin" <46391031+NoahAmethyst@users.noreply.github.com> Date: Tue, 1 Aug 2023 09:33:55 +0800 Subject: [PATCH] =?UTF-8?q?feat:=20=E6=B7=BB=E5=8A=A0IMesssage=E6=8E=A5?= =?UTF-8?q?=E5=8F=A3=E5=B9=B6=E5=AE=9E=E7=8E=B0=20(#335)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * -- 添加接口并实现: - 添加消息类型接口:IMessage,设定方法:获取消息元素列表,获取聊天id,获取消息文本;以privateMessage,groupMessage,TempMessage实现该接口 -- 目的: - 对群聊/私聊/临时消息做出回应有相同的处理逻辑时不用根据消息类型不同定义不同方法 * -- add - sync upstream change * -- ci - sync upstream change * Delete sync.yml --------- Co-authored-by: GH Action - Upstream Sync Co-authored-by: 源文雨 <41315874+fumiama@users.noreply.github.com> --- message/message.go | 93 ++++++++++++++++++++++++++++++++++++++++------ 1 file changed, 81 insertions(+), 12 deletions(-) diff --git a/message/message.go b/message/message.go index cbfdebf4..d5fc6a62 100644 --- a/message/message.go +++ b/message/message.go @@ -13,6 +13,13 @@ import ( "github.com/Mrs4s/MiraiGo/utils" ) +type IMessage interface { + GetElements() []IMessageElement + Chat() int64 + ToString() string + Texts() []string +} + type ( PrivateMessage struct { Id int32 @@ -107,7 +114,7 @@ func NewSendingMessage() *SendingMessage { } func (msg *PrivateMessage) ToString() (res string) { - for _, elem := range msg.Elements { + for _, elem := range msg.GetElements() { switch e := elem.(type) { case *TextElement: res += e.Content @@ -120,42 +127,104 @@ func (msg *PrivateMessage) ToString() (res string) { return } +func (msg *PrivateMessage) Chat() int64 { + return msg.Sender.Uin +} + +func (msg *PrivateMessage) GetElements() []IMessageElement { + return msg.Elements +} + +func (msg *PrivateMessage) Texts() []string { + return parseTexts(msg.GetElements()) +} + +func (msg *GroupMessage) Chat() int64 { + return msg.GroupCode +} + +func (msg *GroupMessage) GetElements() []IMessageElement { + return msg.Elements +} + +func (msg *TempMessage) Chat() int64 { + return msg.GroupCode +} + +func (msg *TempMessage) GetElements() []IMessageElement { + return msg.Elements +} + +func (msg *TempMessage) Texts() []string { + return parseTexts(msg.GetElements()) +} + func (msg *TempMessage) ToString() (res string) { + var strBuilder strings.Builder for _, elem := range msg.Elements { switch e := elem.(type) { case *TextElement: - res += e.Content + strBuilder.WriteString(e.Content) case *FaceElement: - res += "[" + e.Name + "]" + strBuilder.WriteString("[") + strBuilder.WriteString(e.Name) + strBuilder.WriteString("]") case *AtElement: - res += e.Display + strBuilder.WriteString(e.Display) } } + res = strBuilder.String() return } func (msg *GroupMessage) ToString() (res string) { - for _, elem := range msg.Elements { + var strBuilder strings.Builder + for _, elem := range msg.GetElements() { switch e := elem.(type) { case *TextElement: - res += e.Content + strBuilder.WriteString(e.Content) case *FaceElement: - res += "[" + e.Name + "]" + strBuilder.WriteString("[") + strBuilder.WriteString(e.Name) + strBuilder.WriteString("]") case *MarketFaceElement: - res += "[" + e.Name + "]" + strBuilder.WriteString("[") + strBuilder.WriteString(e.Name) + strBuilder.WriteString("]") case *GroupImageElement: - res += "[Image: " + e.ImageId + "]" + strBuilder.WriteString("Image: ") + strBuilder.WriteString(e.ImageId) + strBuilder.WriteString("]") case *AtElement: - res += e.Display + strBuilder.WriteString(e.Display) case *RedBagElement: - res += "[RedBag:" + e.Title + "]" + strBuilder.WriteString("[RedBag: ") + strBuilder.WriteString(e.Title) + strBuilder.WriteString("]") case *ReplyElement: - res += "[Reply:" + strconv.FormatInt(int64(e.ReplySeq), 10) + "]" + strBuilder.WriteString("[Reply: ") + strBuilder.WriteString(strconv.FormatInt(int64(e.ReplySeq), 10)) + strBuilder.WriteString("]") } } + res = strBuilder.String() return } +func (msg *GroupMessage) Texts() []string { + return parseTexts(msg.GetElements()) +} + +func parseTexts(elements []IMessageElement) []string { + texts := make([]string, 0, 4) + for _, elem := range elements { + if elem.Type() == Text { + texts = append(texts, elem.(*TextElement).Content) + } + } + return texts +} + func (msg *SendingMessage) Append(e IMessageElement) *SendingMessage { v := reflect.ValueOf(e) if v.Kind() == reflect.Ptr && !v.IsNil() {