Skip to content

Commit

Permalink
feat: 添加IMesssage接口并实现 (#335)
Browse files Browse the repository at this point in the history
* -- 添加接口并实现:
 - 添加消息类型接口:IMessage,设定方法:获取消息元素列表,获取聊天id,获取消息文本;以privateMessage,groupMessage,TempMessage实现该接口
-- 目的:
 - 对群聊/私聊/临时消息做出回应有相同的处理逻辑时不用根据消息类型不同定义不同方法

* -- add
 - sync upstream change

* -- ci
 - sync upstream change

* Delete sync.yml

---------

Co-authored-by: GH Action - Upstream Sync <action@github.com>
Co-authored-by: 源文雨 <41315874+fumiama@users.noreply.github.com>
  • Loading branch information
3 people authored Aug 1, 2023
1 parent d344e0f commit 65a3c56
Showing 1 changed file with 81 additions and 12 deletions.
93 changes: 81 additions & 12 deletions message/message.go
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down Expand Up @@ -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
Expand All @@ -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() {
Expand Down

0 comments on commit 65a3c56

Please sign in to comment.