github.com/872409/go-netease-im@v1.0.2-0.20201109080841-fdb3e13691c5/notify.go (about)

     1  package netease
     2  
     3  import (
     4  	"errors"
     5  	"fmt"
     6  	"io/ioutil"
     7  	"net/http"
     8  )
     9  
    10  const (
    11  	// EventTypeConversation 表示CONVERSATION消息,即会话类型的消息(目前包括P2P聊天消息,群组聊天消息,群组操作,好友操作)
    12  	EventTypeConversation = "1"
    13  	// EventTypeLogin 表示LOGIN消息,即用户登录事件的消息
    14  	EventTypeLogin = "2"
    15  	// EventTypeLogout  表示LOGOUT消息,即用户登出事件的消息
    16  	EventTypeLogout = "3"
    17  	// EventTypeChatRoom 表示CHATROOM消息,即聊天室中聊天的消息
    18  	EventTypeChatRoom = "4"
    19  	// EventTypeMediaDuration 汇报实时音视频通话时长、白板事件时长的消息
    20  	EventTypeMediaDuration = "5"
    21  	// EventTypeMediaInfo 汇报音视频/白板文件的大小、下载地址等消息
    22  	EventTypeMediaInfo = "6"
    23  	// EventTypeP2PMessageRecall 单聊消息撤回抄送
    24  	EventTypeP2PMessageRecall = "7"
    25  	// EventTypeGroupMessageRecall 群聊消息撤回抄送
    26  	EventTypeGroupMessageRecall = "8"
    27  	// EventTypeChatRoomInOut 汇报主播或管理员进出聊天室事件消息
    28  	EventTypeChatRoomInOut = "9"
    29  	// EventTypeECPCallback 汇报专线电话通话结束回调抄送的消息
    30  	EventTypeECPCallback = "10"
    31  	// EventTypeSMSCallback 汇报短信回执抄送的消息
    32  	EventTypeSMSCallback = "11"
    33  	// EventTypeSMSReply 汇报短信上行消息
    34  	EventTypeSMSReply = "12"
    35  	// EventTypeAvRoomInOut 汇报用户进出音视频/白板房间的消息
    36  	EventTypeAvRoomInOut = "13"
    37  	// EventTypeChatRoomQueueOperate 汇报聊天室队列操作的事件消息
    38  	EventTypeChatRoomQueueOperate = "14"
    39  )
    40  
    41  // GetEventNotification .
    42  func (c *ImClient) GetEventNotification(req *http.Request) ([]byte, error) {
    43  	if req == nil {
    44  		return nil, errors.New("request 参数不能为空")
    45  	}
    46  
    47  	checkSum := req.Header.Get("CheckSum")
    48  	md5 := req.Header.Get("MD5")
    49  	curTime := req.Header.Get("CurTime")
    50  	bd, err := ioutil.ReadAll(req.Body)
    51  	if err != nil {
    52  		return nil, err
    53  	}
    54  	defer req.Body.Close()
    55  
    56  	if Md5HashToHexString(bd) != md5 {
    57  		return bd, fmt.Errorf("消息抄送内容被劫持,[md5]:%s,[body]:%s,[encodedBody]:%s", md5, string(bd), ShaHashToHexString(bd))
    58  	}
    59  
    60  	if checkSum != ShaHashToHexStringFromString(c.AppSecret+md5+curTime) {
    61  		return bd, fmt.Errorf("CheckSum校验失败,[request-header-checkSum]:%s,[Checksum]:%s,[encodedChecksum]:%s", checkSum, c.AppSecret+md5+curTime, ShaHashToHexStringFromString(c.AppSecret+md5+curTime))
    62  	}
    63  	return bd, nil
    64  }
    65  
    66  // GetAudioCopyInfo .
    67  func (c *ImClient) GetAudioCopyInfo(req *http.Request) (*AudioCopyInfo, error) {
    68  	bd, err := c.GetEventNotification(req)
    69  	if err != nil {
    70  		return nil, err
    71  	}
    72  
    73  	aci := &AudioCopyInfo{}
    74  	if err := jsonTool.Unmarshal(bd, aci); err != nil {
    75  		return nil, err
    76  	}
    77  	if aci.EventType != EventTypeMediaDuration {
    78  		return nil, errors.New("抄送信息的类型不是音视频/白板时长类型")
    79  	}
    80  	return aci, err
    81  }