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() {