|  |  |  | 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[:]) | 
					
						
							|  |  |  | } |