Bläddra i källkod

增加判断是否是TG Vip接口

xh 9 månader sedan
förälder
incheckning
df91f74812

+ 8 - 0
game/game_cluster/internal/data/TypeDefine.go

@@ -97,6 +97,14 @@ type SdkParam struct {
 	AppUrl     string // AppUrl:string
 }
 
+type S3Param struct {
+	AccessKey  string
+	SecretKey  string
+	Region     string
+	BucketName string
+	Uid        string
+}
+
 type StoreItemWeight struct {
 	ItemBaseType int // ItemBaseType:道具基本类型
 	ItemID       int // ItemID:物品ID

+ 1 - 0
game/game_cluster/internal/data/sdkConfig.go

@@ -16,6 +16,7 @@ type SdkConfigRow struct {
 	CallbackName string   // sdk名称
 	Salt         string   // 盐
 	Params       SdkParam // sdk配置信息
+	S3           S3Param  //s3配置表
 	Desc         string   // 描述信息
 }
 

+ 49 - 4
game/game_cluster/internal/third/telegram.go

@@ -9,11 +9,51 @@ import (
 )
 
 type GetIfChannelResp struct {
-	Result struct {
-		Status string `json:"status"`
-	} `json:"result"`
+	//Result struct {
+	//	Status string `json:"status"`
+	//} `json:"result"`
+	Ok     bool                   `json:"ok"`
+	Result map[string]interface{} `json:"result"`
 }
 
+// 判断是否是VIP
+func GetIfPremium(openid int64) int32 {
+	ret := data.SdkConfig.Get(3)
+	params := map[string]string{}
+	rs, _, err := mhayaHttp.GET(fmt.Sprintf("%vbot%v/getChatMember?chat_id=%v&user_id=%v", ret.Params.AppUrl, ret.Params.BotToken, ret.Params.ChatIDName, openid), params)
+	if err != nil {
+		mhayaLogger.Error("third.GetIfChannel 验证频道失败  url = %v, bottoken = %v, ChatIDName = %v, userID = %v",
+			ret.Params.AppUrl, ret.Params.BotToken, ret.Params.ChatIDName, openid,
+			err.Error())
+		return 0
+	}
+	var resp GetIfChannelResp
+	err = jsoniter.Unmarshal(rs, &resp)
+	if err != nil {
+		mhayaLogger.Error("third.GetIfChannel 验证频道失败  url = %v, bottoken = %v, ChatIDName = %v, userID = %v",
+			ret.Params.AppUrl, ret.Params.BotToken, ret.Params.ChatIDName, openid,
+			err.Error())
+		return 0
+	}
+	if !resp.Ok {
+		mhayaLogger.Error("third.GetIfChannel 验证频道失败  url = %v, bottoken = %v, ChatIDName = %v, userID = %v",
+			ret.Params.AppUrl, ret.Params.BotToken, ret.Params.ChatIDName, openid,
+			resp.Result["description"])
+		return 0
+	}
+
+	isPremium, ok := resp.Result["is_premium"].(bool)
+	if !ok {
+		mhayaLogger.Infof("Warning: 'is_premium' field not found in member info")
+		return 0
+	}
+	if isPremium {
+		return 1
+	}
+	return 0
+}
+
+// 判断用户是否是成员
 func GetIfChannel(openid int64) int32 {
 	ret := data.SdkConfig.Get(3)
 	params := map[string]string{}
@@ -32,7 +72,12 @@ func GetIfChannel(openid int64) int32 {
 			err.Error())
 		return 0
 	}
-	if resp.Result.Status == "member" {
+	isMember, ok := resp.Result["member"].(bool)
+	if !ok {
+		mhayaLogger.Infof("Warning: 'is_premium' field not found in member info")
+		return 0
+	}
+	if isMember {
 		return 1
 	}
 	return 0

+ 181 - 0
game/game_cluster/nodes/game/module/player/actor_player.go

@@ -2,11 +2,18 @@ package player
 
 import (
 	"context"
+	"encoding/json"
+	"fmt"
+	"github.com/aws/aws-sdk-go/aws"
+	"github.com/aws/aws-sdk-go/aws/credentials"
+	"github.com/aws/aws-sdk-go/aws/session"
+	"github.com/aws/aws-sdk-go/service/s3/s3manager"
 	jsoniter "github.com/json-iterator/go"
 	mhayaString "github.com/mhaya/extend/string"
 	mhayaTime "github.com/mhaya/extend/time"
 	"github.com/mhaya/game/game_cluster/internal/code"
 	"github.com/mhaya/game/game_cluster/internal/constant"
+	"github.com/mhaya/game/game_cluster/internal/data"
 	"github.com/mhaya/game/game_cluster/internal/event"
 	"github.com/mhaya/game/game_cluster/internal/mdb"
 	"github.com/mhaya/game/game_cluster/internal/mdb/models"
@@ -16,6 +23,9 @@ import (
 	clog "github.com/mhaya/logger"
 	"github.com/mhaya/net/parser/pomelo"
 	"go.mongodb.org/mongo-driver/bson"
+	"io"
+	"net/http"
+	"net/url"
 	"time"
 )
 
@@ -76,6 +86,8 @@ func (p *actorPlayer) OnInit() {
 
 	p.Timer().Add(1*time.Second, p.addRoll)
 	p.Timer().Add(10*time.Second, p.sessionClose)
+	//p.Timer().Add(30*time.Second, p.getAndUpdateAvatar)  //排行榜头像
+
 }
 
 func (p *actorPlayer) addRoll() {
@@ -137,6 +149,175 @@ func (p *actorPlayer) setDb() {
 	}
 }
 
+// 获取和更新头像
+func (p *actorPlayer) getAndUpdateAvatar() {
+	if p.isOnline {
+
+		openid, _ := mhayaString.ToInt64(p.Player.OpenId)
+
+		proxyURL, err := url.Parse("http://127.0.0.1:22307")
+		if err != nil {
+			clog.Debugf("Failed to parse proxy URL: %v", err.Error())
+			return
+		}
+
+		// 创建代理配置
+		proxy := http.ProxyURL(proxyURL)
+
+		// 创建自定义的 Transport
+		tr := &http.Transport{
+			Proxy:               proxy,
+			TLSHandshakeTimeout: 5 * time.Second,
+		}
+
+		// 使用自定义 Transport 创建 HTTP 客户端
+		client := &http.Client{
+			Transport: tr,
+			Timeout:   10 * time.Second, // 设置超时时间
+		}
+
+		sdkConfig := data.SdkConfig.Get(3).Params
+
+		url := fmt.Sprintf("https://api.telegram.org/bot%s/getUserProfilePhotos?user_id=%d", sdkConfig.BotToken, openid)
+
+		// 发起 HTTP 请求
+		req, err := http.NewRequestWithContext(context.Background(), "GET", url, nil)
+		if err != nil {
+			clog.Error("Failed to create request: %v", err)
+			return
+		}
+
+		resp, err := client.Do(req)
+		if err != nil {
+			clog.Error("Failed to send request: %v", err)
+			return
+		}
+		defer resp.Body.Close()
+		body, err := io.ReadAll(resp.Body)
+		if err != nil {
+			clog.Error("Error reading body: %v", err)
+			return
+		}
+		var result struct {
+			Ok     bool `json:"ok"`
+			Result struct {
+				Photos [][]struct {
+					FileID string `json:"file_id"`
+				} `json:"photos"`
+			} `json:"result"`
+		}
+
+		err = json.Unmarshal(body, &result)
+		if err != nil {
+			clog.Error("Error unmarshalling JSON: %v", err)
+			return
+		}
+
+		if !result.Ok {
+			clog.Error("Error: %s", string(body))
+			return
+		}
+		if len(result.Result.Photos) == 0 {
+			clog.Error("No photos found for user %d", openid)
+			return
+		}
+
+		if len(result.Result.Photos) > 0 {
+			// 获取第一张照片的最大尺寸
+			photo := result.Result.Photos[0][len(result.Result.Photos[0])-1]
+
+			//根据数据库记录判断是否需要更新图片库
+			if photo.FileID != p.Player.Avatar {
+
+				if p.uploadPhotoToS3(client, sdkConfig.BotToken, photo.FileID, openid) == true {
+					p.Player.Avatar = photo.FileID
+				}
+			}
+		}
+	}
+}
+
+func (p *actorPlayer) uploadPhotoToS3(client *http.Client, botToken, fileId string, openid int64) bool {
+
+	s3 := data.SdkConfig.Get(3).S3
+
+	url := fmt.Sprintf("https://api.telegram.org/bot%s/getFile?file_id=%s", botToken, fileId)
+
+	// 发起 HTTP 请求
+	req, err := http.NewRequestWithContext(context.Background(), "GET", url, nil)
+	if err != nil {
+		clog.Error("Failed to create request: %v", err)
+		return false
+	}
+
+	resp, err := client.Do(req)
+	if err != nil {
+		clog.Error("Failed to send request: %v", err)
+		return false
+	}
+	defer resp.Body.Close()
+
+	body, err := io.ReadAll(resp.Body)
+	if err != nil {
+		clog.Error("Error reading body: %v", err)
+		return false
+	}
+
+	var fileInfo struct {
+		Ok     bool `json:"ok"`
+		Result struct {
+			FilePath string `json:"file_path"`
+		} `json:"result"`
+	}
+
+	err = json.Unmarshal(body, &fileInfo)
+	if err != nil {
+		clog.Error("Error unmarshalling JSON: %v", err)
+		return false
+	}
+
+	if !fileInfo.Ok {
+		clog.Error("Error: %s", string(body))
+		return false
+	}
+
+	downloadUrl := fmt.Sprintf("https://api.telegram.org/file/bot%s/%s", botToken, fileInfo.Result.FilePath)
+
+	resp, err = client.Get(downloadUrl)
+	if err != nil {
+		clog.Error("Error: %v", err)
+		return false
+	}
+	defer resp.Body.Close()
+
+	// 配置 AWS 凭证
+	sess, err := session.NewSession(&aws.Config{
+		Credentials: credentials.NewStaticCredentials(
+			s3.AccessKey,
+			s3.SecretKey,
+			"",
+		),
+		Region: aws.String(s3.Region), // 替换为你的 S3 区域
+	})
+
+	uploader := s3manager.NewUploader(sess)
+
+	// 上传文件到 S3
+	_, err = uploader.Upload(&s3manager.UploadInput{
+		Bucket: aws.String(s3.BucketName),                 // S3 存储桶名称
+		Key:    aws.String(fmt.Sprintf("%d.jpg", openid)), //当前目录存储文件
+		Body:   resp.Body,
+		ACL:    aws.String("private"), // 可以根据需要设置 ACL
+	})
+
+	if err != nil {
+		clog.Error("Error uploading file: %v", err)
+		return false
+	}
+	return true
+
+}
+
 func (p *actorPlayer) refreshRoll() {
 	if p.isOnline {
 		if p.Player.RefreshRoll() {