You cannot select more than 25 topics
			Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
		
		
		
		
		
			
		
			
				
	
	
		
			165 lines
		
	
	
		
			3.9 KiB
		
	
	
	
		
			Go
		
	
			
		
		
	
	
			165 lines
		
	
	
		
			3.9 KiB
		
	
	
	
		
			Go
		
	
| package game_mgr
 | |
| 
 | |
| import (
 | |
| 	"app/service/main/message/pb"
 | |
| 	"app/service/main/redis"
 | |
| 	"crypto/md5"
 | |
| 	"encoding/base64"
 | |
| 	"encoding/json"
 | |
| 	"github.com/gin-gonic/gin"
 | |
| 	"io"
 | |
| 	"sort"
 | |
| 	"strings"
 | |
| )
 | |
| 
 | |
| func Run() error {
 | |
| 	r := gin.Default()
 | |
| 	r.POST("/push/:appId", OnDataPush)
 | |
| 	err := r.Run(":8898")
 | |
| 	if err != nil {
 | |
| 		return err
 | |
| 	}
 | |
| 	return nil
 | |
| }
 | |
| 
 | |
| func OnDataPush(c *gin.Context) {
 | |
| 	defer func() {
 | |
| 		c.JSON(200, gin.H{
 | |
| 			"message": "ok",
 | |
| 		})
 | |
| 		return
 | |
| 	}()
 | |
| 	appId := c.Param("appId")
 | |
| 	appSecret, ok := APP_TOKEN_MAP[appId]
 | |
| 	if !ok {
 | |
| 		return
 | |
| 	}
 | |
| 	roomId := c.GetHeader("x-roomid")
 | |
| 	msgType := c.GetHeader("x-msg-type")
 | |
| 	headerCheck := map[string]string{
 | |
| 		"x-nonce-str": c.GetHeader("x-nonce-str"),
 | |
| 		"x-timestamp": c.GetHeader("x-timestamp"),
 | |
| 		"x-msg-type":  msgType,
 | |
| 		"x-roomid":    roomId,
 | |
| 	}
 | |
| 	bodyData, err := io.ReadAll(c.Request.Body)
 | |
| 	if err != nil {
 | |
| 		return
 | |
| 	}
 | |
| 	signatureRemote := c.GetHeader("x-signature")
 | |
| 	signatureLocal := signature(headerCheck, string(bodyData), appSecret)
 | |
| 	if signatureRemote != signatureLocal {
 | |
| 		return
 | |
| 	}
 | |
| 
 | |
| 	var audienceData []*pb.Audience
 | |
| 	var notifyData []*pb.NotifyAudienceAction
 | |
| 
 | |
| 	switch msgType {
 | |
| 	case "live_comment":
 | |
| 		var rawData []*struct {
 | |
| 			AvatarUrl string `json:"avatar_url"`
 | |
| 			Content   string `json:"content"`
 | |
| 			MsgID     string `json:"msg_id"`
 | |
| 			NickName  string `json:"nickname"`
 | |
| 			SecOpenid string `json:"sec_openid"`
 | |
| 			Timestamp int64  `json:"timestamp"`
 | |
| 		}
 | |
| 
 | |
| 		err = json.Unmarshal(bodyData, &rawData)
 | |
| 		if err != nil {
 | |
| 			return
 | |
| 		}
 | |
| 		for _, data := range rawData {
 | |
| 			audienceData = append(audienceData, &pb.Audience{
 | |
| 				OpenId:    data.SecOpenid,
 | |
| 				NickName:  data.NickName,
 | |
| 				AvatarUrl: data.AvatarUrl,
 | |
| 			})
 | |
| 			notifyData = append(notifyData, &pb.NotifyAudienceAction{
 | |
| 				OpenId:  data.SecOpenid,
 | |
| 				Content: data.Content,
 | |
| 			})
 | |
| 		}
 | |
| 
 | |
| 	case "live_gift":
 | |
| 		var rawData []*struct {
 | |
| 			MsgID     string `json:"msg_id"`
 | |
| 			SecOpenid string `json:"sec_openid"`
 | |
| 			SecGiftID string `json:"sec_gift_id"`
 | |
| 			GiftNum   int    `json:"gift_num"`
 | |
| 			GiftValue int    `json:"gift_value"`
 | |
| 			AvatarUrl string `json:"avatar_url"`
 | |
| 			NickName  string `json:"nickname"`
 | |
| 			Timestamp int    `json:"timestamp"`
 | |
| 			Test      bool   `json:"test"`
 | |
| 		}
 | |
| 
 | |
| 		err = json.Unmarshal(bodyData, &rawData)
 | |
| 		if err != nil {
 | |
| 			return
 | |
| 		}
 | |
| 		for _, data := range rawData {
 | |
| 			audienceData = append(audienceData, &pb.Audience{
 | |
| 				OpenId:    data.SecOpenid,
 | |
| 				NickName:  data.NickName,
 | |
| 				AvatarUrl: data.AvatarUrl,
 | |
| 			})
 | |
| 			notifyData = append(notifyData, &pb.NotifyAudienceAction{
 | |
| 				OpenId: data.SecOpenid,
 | |
| 				GiftId: data.SecGiftID,
 | |
| 			})
 | |
| 		}
 | |
| 	case "live_like":
 | |
| 		var rawData []*struct {
 | |
| 			MsgID     string `json:"msg_id"`
 | |
| 			SecOpenid string `json:"sec_openid"`
 | |
| 			LikeNum   int    `json:"like_num"`
 | |
| 			AvatarUrl string `json:"avatar_url"`
 | |
| 			NickName  string `json:"nickname"`
 | |
| 			Timestamp int    `json:"timestamp"`
 | |
| 		}
 | |
| 
 | |
| 		err = json.Unmarshal(bodyData, &rawData)
 | |
| 		if err != nil {
 | |
| 			return
 | |
| 		}
 | |
| 		for _, data := range rawData {
 | |
| 			audienceData = append(audienceData, &pb.Audience{
 | |
| 				OpenId:    data.SecOpenid,
 | |
| 				NickName:  data.NickName,
 | |
| 				AvatarUrl: data.AvatarUrl,
 | |
| 			})
 | |
| 			notifyData = append(notifyData, &pb.NotifyAudienceAction{
 | |
| 				OpenId:  data.SecOpenid,
 | |
| 				LikeNum: int32(data.LikeNum),
 | |
| 			})
 | |
| 		}
 | |
| 	}
 | |
| 
 | |
| 	for _, audience := range audienceData {
 | |
| 		redis.SetAudience(audience)
 | |
| 	}
 | |
| 	for _, notify := range notifyData {
 | |
| 		redis.Publish(appId, roomId, notify)
 | |
| 	}
 | |
| }
 | |
| 
 | |
| func signature(header map[string]string, bodyStr, secret string) string {
 | |
| 	keyList := make([]string, 0, 4)
 | |
| 	for key, _ := range header {
 | |
| 		keyList = append(keyList, key)
 | |
| 	}
 | |
| 	sort.Slice(keyList, func(i, j int) bool {
 | |
| 		return keyList[i] < keyList[j]
 | |
| 	})
 | |
| 	kvList := make([]string, 0, 4)
 | |
| 	for _, key := range keyList {
 | |
| 		kvList = append(kvList, key+"="+header[key])
 | |
| 	}
 | |
| 	urlParams := strings.Join(kvList, "&")
 | |
| 	rawData := urlParams + bodyStr + secret
 | |
| 	md5Result := md5.Sum([]byte(rawData))
 | |
| 	return base64.StdEncoding.EncodeToString(md5Result[:])
 | |
| }
 |