Skip to content

Commit

Permalink
Beta348 (#356)
Browse files Browse the repository at this point in the history
* beta338

* beta319

* beta340

* beta341

* actionfix

* beta342

* beta342

* beta342

* beta344

* beta345

* beta346

* beta347

* beta348
  • Loading branch information
Hoshinonyaruko authored Mar 23, 2024
1 parent 5ac0aea commit b6e335a
Show file tree
Hide file tree
Showing 19 changed files with 1,043 additions and 81 deletions.
2 changes: 2 additions & 0 deletions botgo/openapi/iface.go
Original file line number Diff line number Diff line change
Expand Up @@ -74,6 +74,8 @@ type MessageAPI interface {
PatchMessage(ctx context.Context,
channelID string, messageID string, msg *dto.MessageToCreate) (*dto.Message, error)
RetractMessage(ctx context.Context, channelID, msgID string, options ...RetractMessageOption) error
RetractGroupMessage(ctx context.Context, groupID, msgID string, options ...RetractMessageOption) error
RetractC2CMessage(ctx context.Context, userID, msgID string, options ...RetractMessageOption) error
// PostSettingGuide 发送设置引导
PostSettingGuide(ctx context.Context, channelID string, atUserIDs []string) (*dto.Message, error)

Expand Down
30 changes: 30 additions & 0 deletions botgo/openapi/v1/message.go
Original file line number Diff line number Diff line change
Expand Up @@ -175,6 +175,36 @@ func (o *openAPI) RetractMessage(ctx context.Context,
return err
}

// RetractMessage 撤回群消息
func (o *openAPI) RetractGroupMessage(ctx context.Context,
groupID, msgID string, options ...openapi.RetractMessageOption) error {
request := o.request(ctx).
SetPathParam("group_id", groupID).
SetPathParam("message_id", string(msgID))
for _, option := range options {
if option == openapi.RetractMessageOptionHidetip {
request = request.SetQueryParam("hidetip", "true")
}
}
_, err := request.Delete(o.getURL(groupMessagesURL))
return err
}

// RetractMessage 撤回私聊消息
func (o *openAPI) RetractC2CMessage(ctx context.Context,
UserID, msgID string, options ...openapi.RetractMessageOption) error {
request := o.request(ctx).
SetPathParam("user_id", UserID).
SetPathParam("message_id", string(msgID))
for _, option := range options {
if option == openapi.RetractMessageOptionHidetip {
request = request.SetQueryParam("hidetip", "true")
}
}
_, err := request.Delete(o.getURL(c2cMessageURI))
return err
}

// PostSettingGuide 发送设置引导消息, atUserID为要at的用户
func (o *openAPI) PostSettingGuide(ctx context.Context,
channelID string, atUserIDs []string) (*dto.Message, error) {
Expand Down
4 changes: 3 additions & 1 deletion botgo/openapi/v1/resource.go
Original file line number Diff line number Diff line change
Expand Up @@ -34,7 +34,8 @@ const (
c2cMessagesURI uri = "/v2/users/{user_id}/messages"
c2cRichMediaURI uri = "/v2/users/{user_id}/files"

messageURI uri = "/channels/{channel_id}/messages/{message_id}"
messageURI uri = "/channels/{channel_id}/messages/{message_id}"
groupMessagesURL uri = "/v2/groups/{group_id}/messages/{message_id}"

userMeURI uri = "/users/@me"
userMeGuildsURI uri = "/users/@me/guilds"
Expand All @@ -53,6 +54,7 @@ const (

dmsURI uri = "/dms/{guild_id}/messages"
dmsMessageURI uri = "/dms/{guild_id}/messages/{message_id}"
c2cMessageURI uri = "/v2/users/{user_id}/messages/{message_id}"

channelAnnouncesURI = "/channels/{channel_id}/announces"
channelAnnounceURI = "/channels/{channel_id}/announces/{message_id}"
Expand Down
30 changes: 30 additions & 0 deletions botgo/openapi/v2/message.go
Original file line number Diff line number Diff line change
Expand Up @@ -175,6 +175,36 @@ func (o *openAPIv2) RetractMessage(ctx context.Context,
return err
}

// RetractMessage 撤回群消息
func (o *openAPIv2) RetractGroupMessage(ctx context.Context,
groupID, msgID string, options ...openapi.RetractMessageOption) error {
request := o.request(ctx).
SetPathParam("group_id", groupID).
SetPathParam("message_id", string(msgID))
for _, option := range options {
if option == openapi.RetractMessageOptionHidetip {
request = request.SetQueryParam("hidetip", "true")
}
}
_, err := request.Delete(o.getURL(groupMessagesURL))
return err
}

// RetractMessage 撤回私聊消息
func (o *openAPIv2) RetractC2CMessage(ctx context.Context,
UserID, msgID string, options ...openapi.RetractMessageOption) error {
request := o.request(ctx).
SetPathParam("user_id", UserID).
SetPathParam("message_id", string(msgID))
for _, option := range options {
if option == openapi.RetractMessageOptionHidetip {
request = request.SetQueryParam("hidetip", "true")
}
}
_, err := request.Delete(o.getURL(c2cMessageURI))
return err
}

// PostSettingGuide 发送设置引导消息, atUserID为要at的用户
func (o *openAPIv2) PostSettingGuide(ctx context.Context,
channelID string, atUserIDs []string) (*dto.Message, error) {
Expand Down
4 changes: 3 additions & 1 deletion botgo/openapi/v2/resource.go
Original file line number Diff line number Diff line change
Expand Up @@ -34,7 +34,8 @@ const (
c2cMessagesURI uri = "/v2/users/{user_id}/messages"
c2cRichMediaURI uri = "/v2/users/{user_id}/files"

messageURI uri = "/channels/{channel_id}/messages/{message_id}"
messageURI uri = "/channels/{channel_id}/messages/{message_id}"
groupMessagesURL uri = "/v2/groups/{group_id}/messages/{message_id}"

userMeURI uri = "/users/@me"
userMeGuildsURI uri = "/users/@me/guilds"
Expand All @@ -53,6 +54,7 @@ const (

dmsURI uri = "/dms/{guild_id}/messages"
dmsMessageURI uri = "/dms/{guild_id}/messages/{message_id}"
c2cMessageURI uri = "/v2/users/{user_id}/messages/{message_id}"

channelAnnouncesURI = "/channels/{channel_id}/announces"
channelAnnounceURI = "/channels/{channel_id}/announces/{message_id}"
Expand Down
63 changes: 50 additions & 13 deletions callapi/callapi.go
Original file line number Diff line number Diff line change
Expand Up @@ -68,18 +68,19 @@ func (a *ActionMessage) UnmarshalJSON(data []byte) error {

// params类型
type ParamsContent struct {
BotQQ string `json:"botqq"`
ChannelID string `json:"channel_id"`
GuildID string `json:"guild_id"`
GroupID interface{} `json:"group_id"` // 每一种onebotv11实现的字段类型都可能不同
Message interface{} `json:"message"` // 这里使用interface{}因为它可能是多种类型
Messages interface{} `json:"messages,omitempty"` // 坑爹转发信息
UserID interface{} `json:"user_id"` // 这里使用interface{}因为它可能是多种类型
Duration int `json:"duration,omitempty"` // 可选的整数
Enable bool `json:"enable,omitempty"` // 可选的布尔值
BotQQ string `json:"botqq,omitempty"`
ChannelID interface{} `json:"channel_id,omitempty"`
GuildID interface{} `json:"guild_id,omitempty"`
GroupID interface{} `json:"group_id,omitempty"` // 每一种onebotv11实现的字段类型都可能不同
MessageID interface{} `json:"message_id,omitempty"` // 用于撤回信息
Message interface{} `json:"message,omitempty"` // 这里使用interface{}因为它可能是多种类型
Messages interface{} `json:"messages,omitempty"` // 坑爹转发信息
UserID interface{} `json:"user_id,omitempty"` // 这里使用interface{}因为它可能是多种类型
Duration int `json:"duration,omitempty"` // 可选的整数
Enable bool `json:"enable,omitempty"` // 可选的布尔值
// handle quick operation
Context Context `json:"context"` // context 字段
Operation Operation `json:"operation"` // operation 字段
Context Context `json:"context,omitempty"` // context 字段
Operation Operation `json:"operation,omitempty"` // operation 字段
}

// Context 结构体用于存储 context 字段相关信息
Expand All @@ -106,8 +107,11 @@ type Operation struct {
func (p *ParamsContent) UnmarshalJSON(data []byte) error {
type Alias ParamsContent
aux := &struct {
GroupID interface{} `json:"group_id"`
UserID interface{} `json:"user_id"`
GroupID interface{} `json:"group_id"`
UserID interface{} `json:"user_id"`
MessageID interface{} `json:"message_id"`
ChannelID interface{} `json:"channel_id"`
GuildID interface{} `json:"guild_id"`
*Alias
}{
Alias: (*Alias)(p),
Expand Down Expand Up @@ -138,6 +142,39 @@ func (p *ParamsContent) UnmarshalJSON(data []byte) error {
return fmt.Errorf("UserID has unsupported type")
}

switch v := aux.MessageID.(type) {
case nil: // 当UserID不存在时
p.MessageID = ""
case float64: // JSON的数字默认被解码为float64
p.MessageID = fmt.Sprintf("%.0f", v) // 将其转换为字符串,忽略小数点后的部分
case string:
p.MessageID = v
default:
return fmt.Errorf("MessageID has unsupported type")
}

switch v := aux.ChannelID.(type) {
case nil: // 当ChannelID不存在时
p.ChannelID = ""
case float64: // JSON的数字默认被解码为float64
p.ChannelID = fmt.Sprintf("%.0f", v) // 将其转换为字符串,忽略小数点后的部分
case string:
p.ChannelID = v
default:
return fmt.Errorf("MessageID has unsupported type")
}

switch v := aux.GuildID.(type) {
case nil: // 当GuildID不存在时
p.GuildID = ""
case float64: // JSON的数字默认被解码为float64
p.GuildID = fmt.Sprintf("%.0f", v) // 将其转换为字符串,忽略小数点后的部分
case string:
p.GuildID = v
default:
return fmt.Errorf("MessageID has unsupported type")
}

return nil
}

Expand Down
110 changes: 110 additions & 0 deletions handlers/delete_msg.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,110 @@
package handlers

import (
"context"
"encoding/json"
"fmt"

"github.com/hoshinonyaruko/gensokyo/callapi"
"github.com/hoshinonyaruko/gensokyo/idmap"
"github.com/hoshinonyaruko/gensokyo/mylog"
"github.com/tencent-connect/botgo/openapi"
)

func init() {
callapi.RegisterHandler("delete_msg", DeleteMsg)
}

func DeleteMsg(client callapi.Client, api openapi.OpenAPI, apiv2 openapi.OpenAPI, message callapi.ActionMessage) (string, error) {

//还原msgid
RealMsgID, err := idmap.RetrieveRowByIDv2(message.Params.MessageID.(string))
if err != nil {
mylog.Printf("error retrieving real RChannelID: %v", err)
}
//重新赋值
message.Params.MessageID = RealMsgID
//撤回频道信息
if message.Params.ChannelID != nil && message.Params.ChannelID != "" {
var RChannelID string
var err error
// 使用RetrieveRowByIDv2还原真实的ChannelID
RChannelID, err = idmap.RetrieveRowByIDv2(message.Params.ChannelID.(string))
if err != nil {
mylog.Printf("error retrieving real RChannelID: %v", err)
}
message.Params.ChannelID = RChannelID
err = api.RetractMessage(context.TODO(), message.Params.ChannelID.(string), message.Params.MessageID.(string), openapi.RetractMessageOptionHidetip)
if err != nil {
fmt.Println("Error retracting channel message:", err)
}

}

//撤回频道私信
if message.Params.GuildID != nil && message.Params.GuildID != "" {
//这里很复杂 要取的话需要调用internal-api 根据情况还原,虚拟成群就用群(channel-id)还原完整channel-id,
//然后internal-api读配置获取guild-id ,虚拟成私信就用userid还原完整userid,然后读channel-id然后读guild-id
//因为GuildID本身不直接出现在ob11事件里。
err := api.RetractDMMessage(context.TODO(), message.Params.GuildID.(string), message.Params.MessageID.(string), openapi.RetractMessageOptionHidetip)
if err != nil {
fmt.Println("Error retracting DM message:", err)
}

}

//撤回群信息
if message.Params.GroupID != nil && message.Params.GroupID != "" {
var originalGroupID string
originalGroupID, err := idmap.RetrieveRowByIDv2(message.Params.GroupID.(string))
if err != nil {
mylog.Printf("Error retrieving original GroupID: %v", err)
}
message.Params.GroupID = originalGroupID
err = api.RetractGroupMessage(context.TODO(), message.Params.GroupID.(string), message.Params.MessageID.(string), openapi.RetractMessageOptionHidetip)
if err != nil {
fmt.Println("Error retracting group message:", err)
}

}

//撤回C2C私信消息列表
if message.Params.UserID != nil && message.Params.UserID != "" {
var UserID string
//还原真实的userid
UserID, err := idmap.RetrieveRowByIDv2(message.Params.UserID.(string))
if err != nil {
mylog.Printf("Error reading config: %v", err)
return "", nil
}
message.Params.UserID = UserID
err = api.RetractC2CMessage(context.TODO(), message.Params.UserID.(string), message.Params.MessageID.(string), openapi.RetractMessageOptionHidetip)
if err != nil {
fmt.Println("Error retracting C2C message:", err)
}

}

var response GetStatusResponse
response.Message = ""
response.RetCode = 0
response.Status = "ok"
response.Echo = message.Echo

outputMap := structToMap(response)

mylog.Printf("delete_msg: %+v\n", outputMap)

err = client.SendMessage(outputMap)
if err != nil {
mylog.Printf("Error sending message via client: %v", err)
}
//把结果从struct转换为json
result, err := json.Marshal(response)
if err != nil {
mylog.Printf("Error marshaling data: %v", err)
//todo 符合onebotv11 ws返回的错误码
return "", nil
}
return string(result), nil
}
16 changes: 8 additions & 8 deletions handlers/get_group_member_list.go
Original file line number Diff line number Diff line change
Expand Up @@ -123,7 +123,7 @@ func GetGroupMemberList(client callapi.Client, api openapi.OpenAPI, apiv2 openap
//用group_id还原出channelid 这是虚拟成群的私聊信息
message.Params.ChannelID = message.Params.GroupID.(string)
// 使用RetrieveRowByIDv2还原真实的ChannelID
RChannelID, err := idmap.RetrieveRowByIDv2(message.Params.ChannelID)
RChannelID, err := idmap.RetrieveRowByIDv2(message.Params.ChannelID.(string))
if err != nil {
mylog.Printf("error retrieving real ChannelID: %v", err)
}
Expand All @@ -147,7 +147,7 @@ func GetGroupMemberList(client callapi.Client, api openapi.OpenAPI, apiv2 openap
var members []MemberList
var userIDInt, groupIDInt uint64
// 使用 message.Params.ChannelID 作为 id 来调用 FindSubKeysById
userIDs, err := idmap.FindSubKeysByIdPro(message.Params.ChannelID)
userIDs, err := idmap.FindSubKeysByIdPro(message.Params.ChannelID.(string))
if err != nil {
mylog.Printf("Error retrieving user IDs: %v", err)
return "", nil // 或者处理错误
Expand Down Expand Up @@ -254,7 +254,7 @@ func GetGroupMemberList(client callapi.Client, api openapi.OpenAPI, apiv2 openap
//用GroupID给ChannelID赋值,因为是把频道虚拟成了群
message.Params.ChannelID = message.Params.GroupID.(string)
//将真实id转为int userid64
_, userIDInt64, err = idmap.StoreIDv2Pro(message.Params.ChannelID, memberFromAPI.User.ID)
_, userIDInt64, err = idmap.StoreIDv2Pro(message.Params.ChannelID.(string), memberFromAPI.User.ID)
if err != nil {
mylog.Fatalf("Error storing ID: %v", err)
}
Expand All @@ -277,14 +277,14 @@ func GetGroupMemberList(client callapi.Client, api openapi.OpenAPI, apiv2 openap
var RChannelID string
//根据api调用中的参数,还原真实的频道号
if memberFromAPI.User.ID != "" && config.GetIdmapPro() {
RChannelID, _, err = idmap.RetrieveRowByIDv2Pro(message.Params.ChannelID, memberFromAPI.User.ID)
RChannelID, _, err = idmap.RetrieveRowByIDv2Pro(message.Params.ChannelID.(string), memberFromAPI.User.ID)
if err != nil {
mylog.Printf("测试,通过Proid获取的RChannelID出错232:%v", err)
}
}
if RChannelID == "" {
// 使用RetrieveRowByIDv2还原真实的ChannelID
RChannelID, err = idmap.RetrieveRowByIDv2(message.Params.ChannelID)
RChannelID, err = idmap.RetrieveRowByIDv2(message.Params.ChannelID.(string))
if err != nil {
mylog.Printf("测试,通过idmap.RetrieveRowByIDv2获取的RChannelID出错241:%v", err)
}
Expand All @@ -303,9 +303,9 @@ func GetGroupMemberList(client callapi.Client, api openapi.OpenAPI, apiv2 openap
GroupID: uint64(groupIDInt),
Nickname: memberFromAPI.Nick,
Card: memberFromAPI.Nick, // 使用昵称作为默认值(TODO: 将来可能发生变更)
Sex: "0", // 使用默认值
Age: 0, // 使用默认值
Area: "0", // 使用默认值
Sex: "0", // 使用默认值
Age: 0, // 使用默认值
Area: "0", // 使用默认值
JoinTime: joinTimeInt,
LastSentTime: 0, // 使用默认值
Level: "0", // 0
Expand Down
2 changes: 1 addition & 1 deletion handlers/get_guild_channel_list.go
Original file line number Diff line number Diff line change
Expand Up @@ -28,7 +28,7 @@ func GetGuildChannelList(client callapi.Client, api openapi.OpenAPI, apiv2 opena
guildID := message.Params.GuildID

// 根据请求参数调用API
channels, err := api.Channels(context.TODO(), guildID)
channels, err := api.Channels(context.TODO(), guildID.(string))
if err != nil {
// 如果发生错误,记录日志并返回null
mylog.Printf("Error fetching channels: %v", err)
Expand Down
Loading

0 comments on commit b6e335a

Please sign in to comment.