Skip to content

Commit

Permalink
Beta357 (#368)
Browse files Browse the repository at this point in the history
* beta338

* beta319

* beta340

* beta341

* actionfix

* beta342

* beta342

* beta342

* beta344

* beta345

* beta346

* beta347

* beta348

* beta349

* beta350

* beta351

* beta352

* beta353

* beta354

* beta355

* beta356

* beta357
  • Loading branch information
Hoshinonyaruko authored Apr 7, 2024
1 parent 690fd99 commit aa857f5
Show file tree
Hide file tree
Showing 9 changed files with 151 additions and 48 deletions.
8 changes: 3 additions & 5 deletions Processor/ProcessGroupMessage.go
Original file line number Diff line number Diff line change
Expand Up @@ -122,11 +122,9 @@ func (p *Processors) ProcessGroupMessage(data *dto.WSGroupATMessageData) error {
groupMsg.RealMessageType = "group"
groupMsg.IsBindedUserId = IsBindedUserId
groupMsg.IsBindedGroupId = IsBindedGroupId
if IsBindedUserId {
groupMsg.Avatar, _ = GenerateAvatarURL(userid64)
} else {
groupMsg.Avatar, _ = GenerateAvatarURLV2(data.Author.ID)
}
groupMsg.RealGroupID = data.GroupID
groupMsg.RealUserID = data.Author.ID
groupMsg.Avatar, _ = GenerateAvatarURLV2(data.Author.ID)
}
//根据条件判断是否增加nick和card
var CaN = config.GetCardAndNick()
Expand Down
2 changes: 2 additions & 0 deletions Processor/Processor.go
Original file line number Diff line number Diff line change
Expand Up @@ -91,6 +91,8 @@ type OnebotGroupMessage struct {
Font int `json:"font"`
UserID int64 `json:"user_id"`
RealMessageType string `json:"real_message_type,omitempty"` //当前信息的真实类型 group group_private guild guild_private
RealUserID string `json:"real_user_id,omitempty"` //当前真实uid
RealGroupID string `json:"real_group_id,omitempty"` //当前真实gid
IsBindedGroupId bool `json:"is_binded_group_id,omitempty"` //当前群号是否是binded后的
IsBindedUserId bool `json:"is_binded_user_id,omitempty"` //当前用户号号是否是binded后的
}
Expand Down
2 changes: 1 addition & 1 deletion go.mod
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,6 @@ require (
github.com/aliyun/alibaba-cloud-sdk-go v1.62.645
github.com/aliyun/aliyun-oss-go-sdk v3.0.1+incompatible
github.com/baidubce/bce-sdk-go v0.9.161
github.com/boltdb/bolt v1.3.1
github.com/fatih/color v1.15.0
github.com/gin-gonic/gin v1.9.1
github.com/google/uuid v1.4.0
Expand All @@ -16,6 +15,7 @@ require (
github.com/skip2/go-qrcode v0.0.0-20200617195104-da1b6568686e
github.com/tencent-connect/botgo v0.1.6
github.com/tencentyun/cos-go-sdk-v5 v0.7.45
go.etcd.io/bbolt v1.3.9
gopkg.in/yaml.v3 v3.0.1
)

Expand Down
6 changes: 4 additions & 2 deletions go.sum
Original file line number Diff line number Diff line change
Expand Up @@ -11,8 +11,6 @@ github.com/aliyun/aliyun-oss-go-sdk v3.0.1+incompatible h1:so4m5rRA32Tc5GgKg/5gK
github.com/aliyun/aliyun-oss-go-sdk v3.0.1+incompatible/go.mod h1:T/Aws4fEfogEE9v+HPhhw+CntffsBHJ8nXQCwKr0/g8=
github.com/baidubce/bce-sdk-go v0.9.161 h1:dNf2K7clz167h7XOffqPsBg0GPntUp7EYGHd6yOFSJw=
github.com/baidubce/bce-sdk-go v0.9.161/go.mod h1:zbYJMQwE4IZuyrJiFO8tO8NbtYiKTFTbwh4eIsqjVdg=
github.com/boltdb/bolt v1.3.1 h1:JQmyP4ZBrce+ZQu0dY660FMfatumYDLun9hBCUVIkF4=
github.com/boltdb/bolt v1.3.1/go.mod h1:clJnj/oiGkjum5o1McbSZDSLxVThjynRyGBgiAx27Ps=
github.com/bytedance/sonic v1.5.0/go.mod h1:ED5hyg4y6t3/9Ku1R6dU/4KyJ48DZ4jPhfY1O2AihPM=
github.com/bytedance/sonic v1.9.1 h1:6iJ6NqdoxCDr6mbY8h18oSO+cShGSMRGCEo7F2h0x8s=
github.com/bytedance/sonic v1.9.1/go.mod h1:i736AoUSYt75HyZLoJW9ERYxcy6eaN6h4BZXU064P/U=
Expand Down Expand Up @@ -186,6 +184,8 @@ github.com/ugorji/go/codec v1.2.11/go.mod h1:UNopzCgEMSXjBc6AOMqYvWC1ktqTAfzJZUZ
github.com/yuin/goldmark v1.2.1/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74=
github.com/yusufpapurcu/wmi v1.2.3 h1:E1ctvB7uKFMOJw3fdOW32DwGE9I7t++CRUEMKvFoFiw=
github.com/yusufpapurcu/wmi v1.2.3/go.mod h1:SBZ9tNy3G9/m5Oi98Zks0QjeHVDvuK0qfxQmPyzfmi0=
go.etcd.io/bbolt v1.3.9 h1:8x7aARPEXiXbHmtUwAIv7eV2fQFHrLLavdiJ3uzJXoI=
go.etcd.io/bbolt v1.3.9/go.mod h1:zaO32+Ti0PK1ivdPtgMESzuzL2VPoIG1PCQNvOdo/dE=
go.uber.org/atomic v1.9.0 h1:ECmE8Bn/WFTYwEW/bpKD3M8VtR/zQVbavAoalC1PYyE=
go.uber.org/atomic v1.9.0/go.mod h1:fEN4uk6kAWBTFdckzkM89CLk9XfWZrxpCo0nPH17wJc=
golang.org/x/arch v0.0.0-20210923205945-b76863e36670/go.mod h1:5om86z9Hs0C8fWVUuoMHwpExlXzs5Tkyp9hOrfG7pp8=
Expand Down Expand Up @@ -220,6 +220,8 @@ golang.org/x/net v0.10.0/go.mod h1:0qNGK6F8kojg2nk9dLZ2mShWaEBan6FAoqfSigmmuDg=
golang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
golang.org/x/sync v0.0.0-20201020160332-67f06af15bc9/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
golang.org/x/sync v0.5.0 h1:60k92dhOjHxJkrqnwsfl8KuaHbn/5dl0lUPUklKo3qE=
golang.org/x/sync v0.5.0/go.mod h1:Czt+wKu1gCyEFDUtn0jG5QVvpJ6rzVqr5aXyt9drQfk=
golang.org/x/sys v0.0.0-20180909124046-d0be0721c37e/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
golang.org/x/sys v0.0.0-20190312061237-fead79001313/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
Expand Down
42 changes: 21 additions & 21 deletions idmap/service.go
Original file line number Diff line number Diff line change
Expand Up @@ -16,9 +16,9 @@ import (
"strings"
"sync"

"github.com/boltdb/bolt"
"github.com/hoshinonyaruko/gensokyo/config"
"github.com/hoshinonyaruko/gensokyo/mylog"
"go.etcd.io/bbolt"
)

var (
Expand All @@ -35,18 +35,18 @@ const (
CounterKey = "currentRow"
)

var db *bolt.DB
var db *bbolt.DB

var ErrKeyNotFound = errors.New("key not found")

func InitializeDB() {
var err error
db, err = bolt.Open(DBName, 0600, nil)
db, err = bbolt.Open(DBName, 0600, nil)
if err != nil {
log.Fatalf("Error opening DB: %v", err)
}

db.Update(func(tx *bolt.Tx) error {
db.Update(func(tx *bbolt.Tx) error {
_, err := tx.CreateBucketIfNotExists([]byte(BucketName))
return err
})
Expand Down Expand Up @@ -118,7 +118,7 @@ func CheckValuev2(value int64) bool {
func StoreID(id string) (int64, error) {
var newRow int64

err := db.Update(func(tx *bolt.Tx) error {
err := db.Update(func(tx *bbolt.Tx) error {
b := tx.Bucket([]byte(BucketName))

// 检查ID是否已经存在
Expand Down Expand Up @@ -180,7 +180,7 @@ func StoreID(id string) (int64, error) {
func SimplifiedStoreID(id string) (int64, error) {
var newRow int64

err := db.Update(func(tx *bolt.Tx) error {
err := db.Update(func(tx *bbolt.Tx) error {
b := tx.Bucket([]byte(BucketName))

// 生成新的行号
Expand Down Expand Up @@ -261,7 +261,7 @@ func StoreIDPro(id string, subid string) (int64, int64, error) {
var newRowID, newSubRowID int64
var err error

err = db.Update(func(tx *bolt.Tx) error {
err = db.Update(func(tx *bbolt.Tx) error {
b := tx.Bucket([]byte(BucketName))

// 生成正向键
Expand Down Expand Up @@ -394,7 +394,7 @@ func StoreIDv2Pro(id string, subid string) (int64, int64, error) {
// 根据b得到a
func RetrieveRowByID(rowid string) (string, error) {
var id string
err := db.View(func(tx *bolt.Tx) error {
err := db.View(func(tx *bbolt.Tx) error {
b := tx.Bucket([]byte(BucketName))

// 根据行号检索ID
Expand Down Expand Up @@ -461,7 +461,7 @@ func RetrieveRowByIDv2Pro(newRowID string, newSubRowID string) (string, string,
func RetrieveRowByIDPro(newRowID, newSubRowID string) (string, string, error) {
var id, subid string

err := db.View(func(tx *bolt.Tx) error {
err := db.View(func(tx *bbolt.Tx) error {
b := tx.Bucket([]byte(BucketName))

// 根据新的行号和子行号检索ID和SubID
Expand Down Expand Up @@ -529,7 +529,7 @@ func RetrieveRowByIDv2(rowid string) (string, error) {

// 根据a 以b为类别 储存c
func WriteConfig(sectionName, keyName, value string) error {
return db.Update(func(tx *bolt.Tx) error {
return db.Update(func(tx *bbolt.Tx) error {
b, err := tx.CreateBucketIfNotExists([]byte(ConfigBucket))
if err != nil {
mylog.Printf("Error creating or accessing bucket: %v", err)
Expand Down Expand Up @@ -590,7 +590,7 @@ func WriteConfigv2(sectionName, keyName, value string) error {
// 根据a和b取出c
func ReadConfig(sectionName, keyName string) (string, error) {
var result string
err := db.View(func(tx *bolt.Tx) error {
err := db.View(func(tx *bbolt.Tx) error {
b := tx.Bucket([]byte(ConfigBucket))
if b == nil {
return fmt.Errorf("bucket not found")
Expand All @@ -611,7 +611,7 @@ func ReadConfig(sectionName, keyName string) (string, error) {

// DeleteConfig根据sectionName和keyName删除指定的键值对
func DeleteConfig(sectionName, keyName string) error {
return db.Update(func(tx *bolt.Tx) error {
return db.Update(func(tx *bbolt.Tx) error {
b := tx.Bucket([]byte(ConfigBucket))
if b == nil {
return fmt.Errorf("bucket %s does not exist", ConfigBucket)
Expand Down Expand Up @@ -727,7 +727,7 @@ func joinSectionAndKey(sectionName, keyName string) []byte {

// UpdateVirtualValue 更新旧的虚拟值到新的虚拟值的映射
func UpdateVirtualValue(oldRowValue, newRowValue int64) error {
return db.Update(func(tx *bolt.Tx) error {
return db.Update(func(tx *bbolt.Tx) error {
b := tx.Bucket([]byte(BucketName))

// 查找旧虚拟值对应的真实值
Expand Down Expand Up @@ -766,7 +766,7 @@ func UpdateVirtualValue(oldRowValue, newRowValue int64) error {
// RetrieveRealValue 根据虚拟值获取真实值,并返回虚拟值及其对应的真实值
func RetrieveRealValue(virtualValue int64) (string, string, error) {
var realValue string
err := db.View(func(tx *bolt.Tx) error {
err := db.View(func(tx *bbolt.Tx) error {
b := tx.Bucket([]byte(BucketName))

// 构造键,根据虚拟值查找
Expand All @@ -791,7 +791,7 @@ func RetrieveRealValue(virtualValue int64) (string, string, error) {
// RetrieveVirtualValue 根据真实值获取虚拟值,并返回真实值及其对应的虚拟值
func RetrieveVirtualValue(realValue string) (string, string, error) {
var virtualValue int64
err := db.View(func(tx *bolt.Tx) error {
err := db.View(func(tx *bbolt.Tx) error {
b := tx.Bucket([]byte(BucketName))

// 根据真实值查找虚拟值
Expand Down Expand Up @@ -967,7 +967,7 @@ func RetrieveVirtualValuev2Pro(realValue string, realValueSub string) (string, s
func RetrieveVirtualValuePro(realValue string, realValueSub string) (string, string, error) {
var newRowID, newSubRowID string

err := db.View(func(tx *bolt.Tx) error {
err := db.View(func(tx *bbolt.Tx) error {
b := tx.Bucket([]byte(BucketName))

// 构建正向键
Expand Down Expand Up @@ -1001,7 +1001,7 @@ func RetrieveVirtualValuePro(realValue string, realValueSub string) (string, str
func RetrieveRealValuePro(virtualValue1, virtualValue2 int64) (string, string, error) {
var realValue1, realValue2 string

err := db.View(func(tx *bolt.Tx) error {
err := db.View(func(tx *bbolt.Tx) error {
b := tx.Bucket([]byte(BucketName))

// 根据两个虚拟值构造键
Expand Down Expand Up @@ -1079,7 +1079,7 @@ func RetrieveRealValuesv2Pro(virtualValue int64, virtualValueSub int64) (string,

// UpdateVirtualValuePro 更新一对旧虚拟值到新虚拟值的映射 旧群号 新群号 旧用户 新用户
func UpdateVirtualValuePro(oldVirtualValue1, newVirtualValue1, oldVirtualValue2, newVirtualValue2 int64) error {
return db.Update(func(tx *bolt.Tx) error {
return db.Update(func(tx *bbolt.Tx) error {
b := tx.Bucket([]byte(BucketName))
// 构造旧和新的复合键
oldCompositeKey := fmt.Sprintf("%d:%d", oldVirtualValue1, oldVirtualValue2)
Expand Down Expand Up @@ -1147,7 +1147,7 @@ func UpdateVirtualValuev2Pro(oldVirtualValue1, newVirtualValue1, oldVirtualValue
func FindKeysBySubAndType(sub string, typeSuffix string) ([]string, error) {
var ids []string

err := db.View(func(tx *bolt.Tx) error {
err := db.View(func(tx *bbolt.Tx) error {
b := tx.Bucket([]byte(ConfigBucket))
if b == nil {
return fmt.Errorf("bucket %s not found", ConfigBucket)
Expand Down Expand Up @@ -1178,7 +1178,7 @@ func FindKeysBySubAndType(sub string, typeSuffix string) ([]string, error) {
func FindSubKeysById(id string) ([]string, error) {
var subKeys []string

err := db.View(func(tx *bolt.Tx) error {
err := db.View(func(tx *bbolt.Tx) error {
b := tx.Bucket([]byte("ids"))
if b == nil {
return fmt.Errorf("bucket %s not found", "ids")
Expand Down Expand Up @@ -1257,7 +1257,7 @@ func FindSubKeysByIdPro(id string) ([]string, error) {

// 场景: xxx:yyy zzz:bbb zzz:bbb xxx:yyy 把xxx(id)替换为newID 比如更换群号(会卡住)
func UpdateKeysWithNewID(id, newID string) error {
return db.Update(func(tx *bolt.Tx) error {
return db.Update(func(tx *bbolt.Tx) error {
b := tx.Bucket([]byte(BucketName))
if b == nil {
return fmt.Errorf("bucket %s not found", BucketName)
Expand Down
89 changes: 89 additions & 0 deletions images/upload_api.go
Original file line number Diff line number Diff line change
Expand Up @@ -194,6 +194,95 @@ func UploadBase64ImageToServer(msgid string, base64Image string, groupID string,
return picURL, 0, 0, 0, nil
}

// TransferUrlToServerUrlr 将url转化为ntv2链接
func TransferUrlToServerUrl(msgid string, url string, groupID string, apiv2 openapi.OpenAPI) (string, uint64, uint32, uint32, error) {
var err error

if isNumeric(groupID) {
//用转换前的群号获取msgid
if msgid == "" {
msgid = echo.GetLazyMessagesId(groupID)
}
// 检查groupID是否为纯数字构成 RetrieveRowByIDv2是通用逻辑,也可以将userid还原为32位数originaluserid
// 但没有私信权限,故没有测试
originalGroupID, err := idmap.RetrieveRowByIDv2(groupID)
if err != nil {
log.Printf("Error retrieving original GroupID: %v", err)
return url, 0, 0, 0, nil
}
log.Printf("通过idmap获取的originalGroupID: %v", originalGroupID)

// 用originalGroupID更新groupID
groupID = originalGroupID
} else {
// 映射str的GroupID到int
GroupID64, err := idmap.StoreIDv2(groupID)
if err != nil {
log.Printf("failed to convert ChannelID to int: %v", err)
return url, 0, 0, 0, nil
}
groupIDTemp := strconv.FormatInt(GroupID64, 10)
//用数字的群号获取msgid
if msgid == "" {
msgid = echo.GetLazyMessagesId(groupIDTemp)
}
}

richMediaMessage := &dto.RichMediaMessage{
EventID: msgid,
FileType: 1, // 1代表图片
URL: url,
Content: "", // 这个字段文档没有了
SrvSendMsg: false,
}

var fileInfo string
//尝试群聊发图
fileInfo, err = uploadMedia(context.TODO(), groupID, richMediaMessage, apiv2)
if err != nil {
//尝试私信发图
fileInfo, err = uploadMediaPrivate(context.TODO(), groupID, richMediaMessage, apiv2)
if err != nil {
//返回原始图片url
return url, 0, 0, 0, nil
}
}

// 将Base64字符串解码为二进制
fileInfoBytes, err := base64.StdEncoding.DecodeString(fileInfo)
if err != nil {
log.Fatalf("Failed to decode Base64 string: %v", err)
}

// 初始化Proto消息类型
var mainMessage protobuf.Main

// 解析二进制数据到Proto消息
err = proto.Unmarshal(fileInfoBytes, &mainMessage)
if err != nil {
log.Fatalf("Failed to unmarshal Proto message: %v", err)
}

// 从Proto消息中读取值
realGroupID := mainMessage.GetA().GetB().GetInfo().GetDetail().GetGroupInfo().GetGroupNumber()
downloadURL := mainMessage.GetA().GetImageData().GetImageInfo().GetUrl()
//https的地址不能放到md里
//downloadURL = "https://multimedia.nt.qq.com.cn" + downloadURL
// 将 downloadURL 中的所有下划线 "_" 替换为 "%5f"
downloadURL = strings.Replace(downloadURL, "_", "%5f", -1)
downloadURL = "http://multimedia.nt.qq.com" + downloadURL
width := mainMessage.GetA().GetImageData().GetWidth()
height := mainMessage.GetA().GetImageData().GetHeight()

// 打印读取的值
log.Printf("RealGroup ID: %d\n", realGroupID)
log.Printf("Download URL: %s, Width: %d, Height: %d\n", downloadURL, width, height)

// 根据需要返回适当的值
return downloadURL, realGroupID, width, height, nil

}

// 将base64语音通过lotus转换成url
func UploadBase64RecordToServer(base64Record string) (string, error) {
extraPicAuditingType := config.GetOssType()
Expand Down
24 changes: 18 additions & 6 deletions server/uploadpic.go
Original file line number Diff line number Diff line change
Expand Up @@ -126,7 +126,6 @@ func UploadBase64ImageHandler(rateLimiter *RateLimiter) gin.HandlerFunc {

}
}

func UploadBase64ImageHandlerV2(rateLimiter *RateLimiter, apiv2 openapi.OpenAPI) gin.HandlerFunc {
return func(c *gin.Context) {
ipAddress := c.ClientIP()
Expand All @@ -137,18 +136,31 @@ func UploadBase64ImageHandlerV2(rateLimiter *RateLimiter, apiv2 openapi.OpenAPI)

// 从请求中获取必要的参数
base64Image := c.PostForm("base64Image")
msgid := c.DefaultPostForm("msgid", "") // msgid可以为空
groupID := c.PostForm("groupID") // groupID是必需的
imageUrl := c.PostForm("url") // 新增的url参数
msgid := c.DefaultPostForm("msgid", "")
groupID := c.PostForm("groupID")

if groupID == "" {
c.JSON(http.StatusBadRequest, gin.H{"error": "groupID is required"})
return
}

// 调用函数上传图片
imageURL, groupid, width, height, err := images.UploadBase64ImageToServer(msgid, base64Image, groupID, apiv2)
var imageURL string
var groupid uint64
var width, height uint32
var err error

// 根据参数调用不同的处理逻辑
if base64Image != "" {
imageURL, groupid, width, height, err = images.UploadBase64ImageToServer(msgid, base64Image, groupID, apiv2)
} else if imageUrl != "" {
imageURL, groupid, width, height, err = images.TransferUrlToServerUrl(msgid, imageUrl, groupID, apiv2)
} else {
c.JSON(http.StatusBadRequest, gin.H{"error": "either base64Image or url is required"})
return
}

if err != nil {
// 根据错误类型返回合适的HTTP状态码和错误信息
c.JSON(http.StatusInternalServerError, gin.H{"error": err.Error()})
return
}
Expand Down
Loading

0 comments on commit aa857f5

Please sign in to comment.