mirror of
https://github.com/krau/SaveAny-Bot.git
synced 2026-05-11 18:59:40 +08:00
feat!: (WIP) switched back to using config files config storages because the conversation handling is shit
This commit is contained in:
@@ -1,232 +0,0 @@
|
||||
package bot
|
||||
|
||||
import (
|
||||
"encoding/json"
|
||||
"fmt"
|
||||
|
||||
"github.com/celestix/gotgproto/dispatcher"
|
||||
"github.com/celestix/gotgproto/ext"
|
||||
"github.com/gotd/td/tg"
|
||||
"github.com/krau/SaveAny-Bot/dao"
|
||||
"github.com/krau/SaveAny-Bot/logger"
|
||||
"github.com/krau/SaveAny-Bot/storage"
|
||||
"github.com/krau/SaveAny-Bot/types"
|
||||
)
|
||||
|
||||
func manageStorageEntry(ctx *ext.Context, update *ext.Update) error {
|
||||
user, err := dao.GetUserByChatID(update.EffectiveUser().GetID())
|
||||
if err != nil {
|
||||
logger.L.Errorf("Failed to get user active storages: %s", err)
|
||||
ctx.Reply(update, ext.ReplyTextString("获取用户存储失败"), nil)
|
||||
return dispatcher.EndGroups
|
||||
}
|
||||
|
||||
state, ok := userConversationState[user.ChatID]
|
||||
if !ok {
|
||||
state = &ConversationState{}
|
||||
userConversationState[user.ChatID] = state
|
||||
}
|
||||
state.Reset()
|
||||
state.InConversation = true
|
||||
state.SetConversationType(ConversationTypeManageStorage)
|
||||
state.SetData("status", "entry")
|
||||
|
||||
storagesMsg := "已添加的存储:"
|
||||
if len(user.Storages) == 0 {
|
||||
storagesMsg += " 无"
|
||||
} else {
|
||||
for i, storage := range user.Storages {
|
||||
storagesMsg += fmt.Sprintf("\n%d. %s", i+1, storage.Name)
|
||||
}
|
||||
}
|
||||
storagesMsg += "\n\n请选择操作:"
|
||||
_, err = ctx.Reply(update, ext.ReplyTextString(storagesMsg), &ext.ReplyOpts{
|
||||
Markup: &manageStorageKeyboardMarkup,
|
||||
})
|
||||
if err != nil {
|
||||
logger.L.Errorf("Failed to send manage storage message: %s", err)
|
||||
return dispatcher.EndGroups
|
||||
}
|
||||
|
||||
return dispatcher.EndGroups
|
||||
}
|
||||
|
||||
func handleManageStorageConversation(ctx *ext.Context, update *ext.Update, state *ConversationState) error {
|
||||
status := state.GetData("status").(string)
|
||||
switch status {
|
||||
case "entry":
|
||||
return manageStorageMenu(ctx, update, state)
|
||||
case "add_select_type":
|
||||
return manageStorageAddSelectType(ctx, update, state)
|
||||
case "selected_add_type":
|
||||
return manageStorageAddSelectedType(ctx, update, state)
|
||||
default:
|
||||
logger.L.Errorf("Unknown manage storage status: %s", status)
|
||||
}
|
||||
return dispatcher.EndGroups
|
||||
}
|
||||
|
||||
func manageStorageMenu(ctx *ext.Context, update *ext.Update, state *ConversationState) error {
|
||||
text := update.EffectiveMessage.Text
|
||||
switch text {
|
||||
case manageStorageButtonAdd:
|
||||
return manageStorageAdd(ctx, update, state)
|
||||
case manageStorageButtonDelete:
|
||||
return manageStorageDelete(ctx, update)
|
||||
case manageStorageButtonEdit:
|
||||
return manageStorageEdit(ctx, update)
|
||||
case manageStorageButtonSetDefault:
|
||||
return manageStorageSetDefault(ctx, update)
|
||||
default:
|
||||
logger.L.Errorf("Unknown manage storage button: %s", text)
|
||||
ctx.Reply(update, ext.ReplyTextString("未知操作"), nil)
|
||||
return dispatcher.EndGroups
|
||||
}
|
||||
}
|
||||
|
||||
func manageStorageAdd(ctx *ext.Context, update *ext.Update, state *ConversationState) error {
|
||||
rows := make([]tg.KeyboardButtonRow, 0)
|
||||
buttons := make([]tg.KeyboardButtonClass, 0)
|
||||
for i, storageType := range types.StorageTypes {
|
||||
buttons = append(buttons, &tg.KeyboardButton{
|
||||
Text: types.StorageTypeDisplay[storageType],
|
||||
})
|
||||
if (i+1)%3 == 0 || i == len(types.StorageTypes)-1 {
|
||||
rows = append(rows, tg.KeyboardButtonRow{
|
||||
Buttons: buttons,
|
||||
})
|
||||
buttons = make([]tg.KeyboardButtonClass, 0)
|
||||
}
|
||||
}
|
||||
manageStorageAddKeyboardMarkup := tg.ReplyKeyboardMarkup{
|
||||
Selective: true,
|
||||
Resize: true,
|
||||
Rows: rows,
|
||||
}
|
||||
|
||||
state.SetData("status", "add_select_type")
|
||||
|
||||
ctx.Reply(update, ext.ReplyTextString("请选择要添加的存储类型"), &ext.ReplyOpts{
|
||||
Markup: &manageStorageAddKeyboardMarkup,
|
||||
})
|
||||
return dispatcher.ContinueGroups
|
||||
}
|
||||
|
||||
func manageStorageAddSelectType(ctx *ext.Context, update *ext.Update, state *ConversationState) error {
|
||||
text := update.EffectiveMessage.Text
|
||||
var storageType types.StorageType
|
||||
for t, display := range types.StorageTypeDisplay {
|
||||
if display == text {
|
||||
storageType = t
|
||||
break
|
||||
}
|
||||
}
|
||||
if storageType == "" {
|
||||
ctx.Reply(update, ext.ReplyTextString("未知的存储类型"), nil)
|
||||
return dispatcher.EndGroups
|
||||
}
|
||||
state.SetData("status", "selected_add_type")
|
||||
state.SetData("storage_type", storageType)
|
||||
return manageStorageAddSelectedType(ctx, update, state)
|
||||
}
|
||||
|
||||
func manageStorageAddSelectedType(ctx *ext.Context, update *ext.Update, state *ConversationState) error {
|
||||
selectedType := state.GetData("storage_type").(types.StorageType)
|
||||
configItems := storage.GetStorageConfigurableItems(selectedType)
|
||||
configIndexData := state.GetData("configindex")
|
||||
configIndex := 0
|
||||
if configIndexData == nil {
|
||||
state.SetData("configindex", configIndex)
|
||||
} else {
|
||||
configIndex = configIndexData.(int)
|
||||
if update.EffectiveMessage.Text != "" {
|
||||
logger.L.Debugf("config %s: %s", configItems[configIndex-1], update.EffectiveMessage.Text)
|
||||
state.SetData(configItems[configIndex-1], update.EffectiveMessage.Text)
|
||||
}
|
||||
}
|
||||
if configIndex >= len(configItems) {
|
||||
// TODO: save storage
|
||||
state.SetData("status", "add_complete")
|
||||
logger.L.Infof("Save storage")
|
||||
return manageStorageSave(ctx, update, state)
|
||||
}
|
||||
|
||||
ctx.Reply(update, ext.ReplyTextString(fmt.Sprintf("正在配置 %s 存储...\n请提供 %s", types.StorageTypeDisplay[selectedType], configItems[configIndex])), &ext.ReplyOpts{
|
||||
Markup: &tg.ReplyKeyboardForceReply{
|
||||
Selective: true,
|
||||
SingleUse: true,
|
||||
},
|
||||
})
|
||||
state.SetData("configindex", configIndex+1)
|
||||
return dispatcher.EndGroups
|
||||
}
|
||||
|
||||
func manageStorageSave(ctx *ext.Context, update *ext.Update, state *ConversationState) error {
|
||||
defer func() {
|
||||
if r := recover(); r != nil {
|
||||
logger.L.Errorf("Failed to save storage: %s", r)
|
||||
ctx.Reply(update, ext.ReplyTextString("存储配置失败"), nil)
|
||||
}
|
||||
state.Reset()
|
||||
}()
|
||||
storageType := state.GetData("storage_type").(types.StorageType)
|
||||
config := make(map[string]string)
|
||||
configItems := storage.GetStorageConfigurableItems(storageType)
|
||||
for _, item := range configItems {
|
||||
config[item] = state.GetData(item).(string)
|
||||
}
|
||||
configJSON, err := json.Marshal(config)
|
||||
if err != nil {
|
||||
logger.L.Errorf("Failed to marshal storage config: %s", err)
|
||||
ctx.Reply(update, ext.ReplyTextString("存储配置失败"), nil)
|
||||
return dispatcher.EndGroups
|
||||
}
|
||||
user, err := dao.GetUserByChatID(update.EffectiveUser().GetID())
|
||||
if err != nil {
|
||||
logger.L.Errorf("Failed to get user: %s", err)
|
||||
ctx.Reply(update, ext.ReplyTextString("获取用户失败"), nil)
|
||||
return dispatcher.EndGroups
|
||||
}
|
||||
storageModel := types.StorageModel{
|
||||
Type: string(storageType),
|
||||
Active: true,
|
||||
Config: configJSON,
|
||||
}
|
||||
hash := storageModel.GenHash()
|
||||
storageModel.Hash = hash
|
||||
if storagedb, err := dao.GetStorageByHash(hash); err == nil {
|
||||
logger.L.Debugf("Storage already exists")
|
||||
user.Storages = append(user.Storages, storagedb)
|
||||
} else {
|
||||
if id, err := dao.CreateStorage(&storageModel); err != nil {
|
||||
logger.L.Errorf("Failed to create storage: %s", err)
|
||||
ctx.Reply(update, ext.ReplyTextString("存储创建失败"), nil)
|
||||
return dispatcher.EndGroups
|
||||
} else {
|
||||
storagedb := &types.StorageModel{}
|
||||
storagedb.ID = id
|
||||
user.Storages = append(user.Storages, storagedb)
|
||||
}
|
||||
}
|
||||
if err := dao.UpdateUser(user); err != nil {
|
||||
logger.L.Errorf("Failed to update user with storages: %s", err)
|
||||
ctx.Reply(update, ext.ReplyTextString("用户更新失败"), nil)
|
||||
return dispatcher.EndGroups
|
||||
}
|
||||
ctx.Reply(update, ext.ReplyTextString("存储已添加"), &ext.ReplyOpts{
|
||||
Markup: &tg.ReplyKeyboardHide{},
|
||||
})
|
||||
return dispatcher.EndGroups
|
||||
}
|
||||
|
||||
func manageStorageDelete(ctx *ext.Context, update *ext.Update) error {
|
||||
return dispatcher.ContinueGroups
|
||||
}
|
||||
|
||||
func manageStorageEdit(ctx *ext.Context, update *ext.Update) error {
|
||||
return dispatcher.ContinueGroups
|
||||
}
|
||||
|
||||
func manageStorageSetDefault(ctx *ext.Context, update *ext.Update) error {
|
||||
return dispatcher.ContinueGroups
|
||||
}
|
||||
@@ -11,6 +11,7 @@ import (
|
||||
"github.com/gotd/td/tg"
|
||||
"github.com/krau/SaveAny-Bot/dao"
|
||||
"github.com/krau/SaveAny-Bot/logger"
|
||||
"github.com/krau/SaveAny-Bot/storage"
|
||||
"github.com/krau/SaveAny-Bot/types"
|
||||
)
|
||||
|
||||
@@ -53,7 +54,9 @@ func handleLinkMessage(ctx *ext.Context, update *ext.Update) error {
|
||||
ctx.Reply(update, ext.ReplyTextString("获取用户失败"), nil)
|
||||
return dispatcher.EndGroups
|
||||
}
|
||||
if len(user.Storages) == 0 {
|
||||
storages := storage.GetUserStorages(user.ChatID)
|
||||
|
||||
if len(storages) == 0 {
|
||||
ctx.Reply(update, ext.ReplyTextString("无可用的存储"), nil)
|
||||
return dispatcher.EndGroups
|
||||
}
|
||||
@@ -91,14 +94,14 @@ func handleLinkMessage(ctx *ext.Context, update *ext.Update) error {
|
||||
})
|
||||
return dispatcher.EndGroups
|
||||
}
|
||||
if !user.Silent || user.DefaultStorageID == 0 {
|
||||
return ProvideSelectMessage(ctx, update, file, int(linkChat.GetID()), messageID, replied.ID)
|
||||
if !user.Silent || user.DefaultStorage == "" {
|
||||
return ProvideSelectMessage(ctx, update, file, linkChat.GetID(), messageID, replied.ID)
|
||||
}
|
||||
return HandleSilentAddTask(ctx, update, user, &types.Task{
|
||||
Ctx: ctx,
|
||||
Status: types.Pending,
|
||||
File: file,
|
||||
StorageID: user.DefaultStorageID,
|
||||
StorageName: user.DefaultStorage,
|
||||
FileChatID: linkChat.GetID(),
|
||||
FileMessageID: messageID,
|
||||
ReplyMessageID: replied.ID,
|
||||
|
||||
@@ -2,18 +2,10 @@ package bot
|
||||
|
||||
import (
|
||||
"sync"
|
||||
|
||||
"github.com/celestix/gotgproto/dispatcher"
|
||||
"github.com/celestix/gotgproto/ext"
|
||||
"github.com/krau/SaveAny-Bot/logger"
|
||||
)
|
||||
|
||||
type ConversationType string
|
||||
|
||||
const (
|
||||
ConversationTypeManageStorage ConversationType = "manage_storage"
|
||||
)
|
||||
|
||||
type ConversationState struct {
|
||||
sync.Mutex
|
||||
conversationType ConversationType
|
||||
@@ -54,31 +46,30 @@ func (c *ConversationState) SetData(key string, value interface{}) {
|
||||
c.data[c.conversationType][key] = value
|
||||
}
|
||||
|
||||
var userConversationState = make(map[int64]*ConversationState)
|
||||
// TODO: Implement conversation handling
|
||||
// var userConversationState = make(map[int64]*ConversationState)
|
||||
|
||||
func handleConversation(ctx *ext.Context, update *ext.Update) error {
|
||||
userID := update.EffectiveUser().GetID()
|
||||
state, ok := userConversationState[userID]
|
||||
if !ok {
|
||||
return dispatcher.ContinueGroups
|
||||
}
|
||||
if update.EffectiveMessage.Text == "/cancel" {
|
||||
state.Reset()
|
||||
ctx.Reply(update, ext.ReplyTextString("已取消"), nil)
|
||||
return dispatcher.EndGroups
|
||||
}
|
||||
if !state.InConversation {
|
||||
return dispatcher.ContinueGroups
|
||||
}
|
||||
return handleConversationState(ctx, update, state)
|
||||
}
|
||||
// func handleConversation(ctx *ext.Context, update *ext.Update) error {
|
||||
// userID := update.EffectiveUser().GetID()
|
||||
// state, ok := userConversationState[userID]
|
||||
// if !ok {
|
||||
// return dispatcher.ContinueGroups
|
||||
// }
|
||||
// if update.EffectiveMessage.Text == "/cancel" {
|
||||
// state.Reset()
|
||||
// ctx.Reply(update, ext.ReplyTextString("已取消"), nil)
|
||||
// return dispatcher.EndGroups
|
||||
// }
|
||||
// if !state.InConversation {
|
||||
// return dispatcher.ContinueGroups
|
||||
// }
|
||||
// return handleConversationState(ctx, update, state)
|
||||
// }
|
||||
|
||||
func handleConversationState(ctx *ext.Context, update *ext.Update, state *ConversationState) error {
|
||||
switch state.conversationType {
|
||||
case ConversationTypeManageStorage:
|
||||
return handleManageStorageConversation(ctx, update, state)
|
||||
default:
|
||||
logger.L.Errorf("Unknown conversation type: %s", state.conversationType)
|
||||
}
|
||||
return dispatcher.EndGroups
|
||||
}
|
||||
// func handleConversationState(ctx *ext.Context, update *ext.Update, state *ConversationState) error {
|
||||
// switch state.conversationType {
|
||||
// default:
|
||||
// logger.L.Errorf("Unknown conversation type: %s", state.conversationType)
|
||||
// }
|
||||
// return dispatcher.EndGroups
|
||||
// }
|
||||
|
||||
@@ -18,6 +18,7 @@ import (
|
||||
"github.com/krau/SaveAny-Bot/dao"
|
||||
"github.com/krau/SaveAny-Bot/logger"
|
||||
"github.com/krau/SaveAny-Bot/queue"
|
||||
"github.com/krau/SaveAny-Bot/storage"
|
||||
"github.com/krau/SaveAny-Bot/types"
|
||||
)
|
||||
|
||||
@@ -26,7 +27,7 @@ func RegisterHandlers(dispatcher dispatcher.Dispatcher) {
|
||||
dispatcher.AddHandler(handlers.NewCommand("start", start))
|
||||
dispatcher.AddHandler(handlers.NewCommand("help", help))
|
||||
dispatcher.AddHandler(handlers.NewCommand("silent", silent))
|
||||
dispatcher.AddHandler(handlers.NewCommand("storage", manageStorageEntry))
|
||||
dispatcher.AddHandler(handlers.NewCommand("storage", storageCmd))
|
||||
dispatcher.AddHandler(handlers.NewCommand("save", saveCmd))
|
||||
linkRegexFilter, err := filters.Message.Regex(linkRegexString)
|
||||
if err != nil {
|
||||
@@ -35,7 +36,7 @@ func RegisterHandlers(dispatcher dispatcher.Dispatcher) {
|
||||
dispatcher.AddHandler(handlers.NewMessage(linkRegexFilter, handleLinkMessage))
|
||||
dispatcher.AddHandler(handlers.NewCallbackQuery(filters.CallbackQuery.Prefix("add"), AddToQueue))
|
||||
dispatcher.AddHandler(handlers.NewMessage(filters.Message.Media, handleFileMessage))
|
||||
dispatcher.AddHandler(handlers.NewMessage(filters.Message.Text, handleConversation))
|
||||
// dispatcher.AddHandler(handlers.NewMessage(filters.Message.Text, handleConversation))
|
||||
}
|
||||
|
||||
const noPermissionText string = `
|
||||
@@ -120,7 +121,10 @@ func saveCmd(ctx *ext.Context, update *ext.Update) error {
|
||||
ctx.Reply(update, ext.ReplyTextString("获取用户失败"), nil)
|
||||
return dispatcher.EndGroups
|
||||
}
|
||||
if len(user.Storages) == 0 {
|
||||
|
||||
storages := storage.GetUserStorages(user.ChatID)
|
||||
|
||||
if len(storages) == 0 {
|
||||
ctx.Reply(update, ext.ReplyTextString("无可用的存储"), nil)
|
||||
return dispatcher.EndGroups
|
||||
}
|
||||
@@ -180,14 +184,14 @@ func saveCmd(ctx *ext.Context, update *ext.Update) error {
|
||||
}
|
||||
return dispatcher.EndGroups
|
||||
}
|
||||
if !user.Silent || user.DefaultStorageID == 0 {
|
||||
return ProvideSelectMessage(ctx, update, file, int(update.EffectiveChat().GetID()), msg.ID, replied.ID)
|
||||
if !user.Silent || user.DefaultStorage == "" {
|
||||
return ProvideSelectMessage(ctx, update, file, update.EffectiveChat().GetID(), msg.ID, replied.ID)
|
||||
}
|
||||
return HandleSilentAddTask(ctx, update, user, &types.Task{
|
||||
Ctx: ctx,
|
||||
Status: types.Pending,
|
||||
File: file,
|
||||
StorageID: user.DefaultStorageID,
|
||||
StorageName: user.DefaultStorage,
|
||||
FileChatID: update.EffectiveChat().GetID(),
|
||||
ReplyMessageID: replied.ID,
|
||||
ReplyChatID: update.GetUserChat().GetID(),
|
||||
@@ -195,6 +199,11 @@ func saveCmd(ctx *ext.Context, update *ext.Update) error {
|
||||
})
|
||||
}
|
||||
|
||||
func storageCmd(ctx *ext.Context, update *ext.Update) error {
|
||||
// TODO: Implement
|
||||
return dispatcher.EndGroups
|
||||
}
|
||||
|
||||
func handleFileMessage(ctx *ext.Context, update *ext.Update) error {
|
||||
logger.L.Trace("Got media: ", update.EffectiveMessage.Media.TypeName())
|
||||
supported, err := supportedMediaFilter(update.EffectiveMessage.Message)
|
||||
@@ -211,7 +220,8 @@ func handleFileMessage(ctx *ext.Context, update *ext.Update) error {
|
||||
ctx.Reply(update, ext.ReplyTextString("获取用户失败"), nil)
|
||||
return dispatcher.EndGroups
|
||||
}
|
||||
if len(user.Storages) == 0 {
|
||||
storages := storage.GetUserStorages(user.ChatID)
|
||||
if len(storages) == 0 {
|
||||
ctx.Reply(update, ext.ReplyTextString("无可用的存储"), nil)
|
||||
return dispatcher.EndGroups
|
||||
}
|
||||
@@ -250,14 +260,14 @@ func handleFileMessage(ctx *ext.Context, update *ext.Update) error {
|
||||
return dispatcher.EndGroups
|
||||
}
|
||||
|
||||
if !user.Silent || user.DefaultStorageID == 0 {
|
||||
return ProvideSelectMessage(ctx, update, file, int(update.EffectiveChat().GetID()), update.EffectiveMessage.ID, msg.ID)
|
||||
if !user.Silent || user.DefaultStorage == "" {
|
||||
return ProvideSelectMessage(ctx, update, file, update.EffectiveChat().GetID(), update.EffectiveMessage.ID, msg.ID)
|
||||
}
|
||||
return HandleSilentAddTask(ctx, update, user, &types.Task{
|
||||
Ctx: ctx,
|
||||
Status: types.Pending,
|
||||
File: file,
|
||||
StorageID: user.DefaultStorageID,
|
||||
StorageName: user.DefaultStorage,
|
||||
FileChatID: update.EffectiveChat().GetID(),
|
||||
ReplyMessageID: msg.ID,
|
||||
ReplyChatID: update.GetUserChat().GetID(),
|
||||
@@ -278,8 +288,19 @@ func AddToQueue(ctx *ext.Context, update *ext.Update) error {
|
||||
args := strings.Split(string(update.CallbackQuery.Data), " ")
|
||||
fileChatID, _ := strconv.Atoi(args[1])
|
||||
fileMessageID, _ := strconv.Atoi(args[2])
|
||||
storageID, _ := strconv.Atoi(args[3])
|
||||
logger.L.Tracef("Got add to queue: chatID: %d, messageID: %d, storageID: %d", fileChatID, fileMessageID, storageID)
|
||||
storageNameHash := args[3]
|
||||
storageName := storageHashName[storageNameHash]
|
||||
if storageName == "" {
|
||||
logger.L.Errorf("Unknown storage name hash: %d", storageNameHash)
|
||||
ctx.AnswerCallback(&tg.MessagesSetBotCallbackAnswerRequest{
|
||||
QueryID: update.CallbackQuery.QueryID,
|
||||
Alert: true,
|
||||
Message: "未知存储位置",
|
||||
CacheTime: 5,
|
||||
})
|
||||
return dispatcher.EndGroups
|
||||
}
|
||||
logger.L.Tracef("Got add to queue: chatID: %d, messageID: %d, storage: %s", fileChatID, fileMessageID, storageName)
|
||||
record, err := dao.GetReceivedFileByChatAndMessageID(int64(fileChatID), fileMessageID)
|
||||
if err != nil {
|
||||
logger.L.Errorf("Failed to get received file: %s", err)
|
||||
@@ -313,7 +334,7 @@ func AddToQueue(ctx *ext.Context, update *ext.Update) error {
|
||||
Ctx: ctx,
|
||||
Status: types.Pending,
|
||||
File: file,
|
||||
StorageID: uint(storageID),
|
||||
StorageName: storageName,
|
||||
FileChatID: record.ChatID,
|
||||
ReplyMessageID: record.ReplyMessageID,
|
||||
FileMessageID: record.MessageID,
|
||||
|
||||
56
bot/utils.go
56
bot/utils.go
@@ -14,6 +14,7 @@ import (
|
||||
"github.com/krau/SaveAny-Bot/dao"
|
||||
"github.com/krau/SaveAny-Bot/logger"
|
||||
"github.com/krau/SaveAny-Bot/queue"
|
||||
"github.com/krau/SaveAny-Bot/storage"
|
||||
"github.com/krau/SaveAny-Bot/types"
|
||||
)
|
||||
|
||||
@@ -25,39 +26,6 @@ var (
|
||||
ErrNoStorages = errors.New("no available storage")
|
||||
)
|
||||
|
||||
var (
|
||||
manageStorageButtonAdd = "添加存储"
|
||||
manageStorageButtonDelete = "删除存储"
|
||||
manageStorageButtonEdit = "修改存储"
|
||||
manageStorageButtonSetDefault = "设置默认存储"
|
||||
manageStorageKeyboardMarkup = tg.ReplyKeyboardMarkup{
|
||||
Selective: true,
|
||||
Resize: true,
|
||||
Rows: []tg.KeyboardButtonRow{
|
||||
{
|
||||
Buttons: []tg.KeyboardButtonClass{
|
||||
&tg.KeyboardButton{
|
||||
Text: manageStorageButtonAdd,
|
||||
},
|
||||
&tg.KeyboardButton{
|
||||
Text: manageStorageButtonDelete,
|
||||
},
|
||||
&tg.KeyboardButton{
|
||||
Text: manageStorageButtonEdit,
|
||||
},
|
||||
},
|
||||
},
|
||||
{
|
||||
Buttons: []tg.KeyboardButtonClass{
|
||||
&tg.KeyboardButton{
|
||||
Text: manageStorageButtonSetDefault,
|
||||
},
|
||||
},
|
||||
},
|
||||
},
|
||||
}
|
||||
)
|
||||
|
||||
func supportedMediaFilter(m *tg.Message) (bool, error) {
|
||||
if not := m.Media == nil; not {
|
||||
return false, dispatcher.EndGroups
|
||||
@@ -72,19 +40,23 @@ func supportedMediaFilter(m *tg.Message) (bool, error) {
|
||||
}
|
||||
}
|
||||
|
||||
// for callback data
|
||||
var storageHashName = map[string]string{}
|
||||
|
||||
func getSelectStorageMarkup(userChatID int64, fileChatID, fileMessageID int) (*tg.ReplyInlineMarkup, error) {
|
||||
user, err := dao.GetUserByChatID(userChatID)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
if len(user.Storages) < 1 {
|
||||
return nil, ErrNoStorages
|
||||
}
|
||||
storages := storage.GetUserStorages(user.ChatID)
|
||||
|
||||
buttons := make([]tg.KeyboardButtonClass, 0)
|
||||
for _, storage := range user.Storages {
|
||||
for _, storage := range storages {
|
||||
nameHash := common.HashString(storage.Name())
|
||||
storageHashName[nameHash] = storage.Name()
|
||||
buttons = append(buttons, &tg.KeyboardButtonCallback{
|
||||
Text: storage.Name,
|
||||
Data: []byte(fmt.Sprintf("add %d %d %d", fileChatID, fileMessageID, storage.ID)),
|
||||
Text: storage.Name(),
|
||||
Data: []byte(fmt.Sprintf("add %d %d %s", fileChatID, fileMessageID, nameHash)),
|
||||
})
|
||||
}
|
||||
markup := &tg.ReplyInlineMarkup{}
|
||||
@@ -194,7 +166,7 @@ func GetTGMessage(ctx *ext.Context, chatId int64, messageID int) (*tg.Message, e
|
||||
return tgMessage, nil
|
||||
}
|
||||
|
||||
func ProvideSelectMessage(ctx *ext.Context, update *ext.Update, file *types.File, chatID int, fileMsgID, toEditMsgID int) error {
|
||||
func ProvideSelectMessage(ctx *ext.Context, update *ext.Update, file *types.File, chatID int64, fileMsgID, toEditMsgID int) error {
|
||||
entityBuilder := entity.Builder{}
|
||||
var entities []tg.MessageEntityClass
|
||||
text := fmt.Sprintf("文件名: %s\n请选择存储位置", file.FileName)
|
||||
@@ -207,7 +179,7 @@ func ProvideSelectMessage(ctx *ext.Context, update *ext.Update, file *types.File
|
||||
} else {
|
||||
text, entities = entityBuilder.Complete()
|
||||
}
|
||||
markup, err := getSelectStorageMarkup(update.EffectiveUser().GetID(), chatID, fileMsgID)
|
||||
markup, err := getSelectStorageMarkup(update.EffectiveUser().GetID(), int(chatID), fileMsgID)
|
||||
if errors.Is(err, ErrNoStorages) {
|
||||
logger.L.Errorf("Failed to get select storage markup: %s", err)
|
||||
ctx.EditMessage(update.EffectiveChat().GetID(), &tg.MessagesEditMessageRequest{
|
||||
@@ -236,7 +208,7 @@ func ProvideSelectMessage(ctx *ext.Context, update *ext.Update, file *types.File
|
||||
}
|
||||
|
||||
func HandleSilentAddTask(ctx *ext.Context, update *ext.Update, user *types.User, task *types.Task) error {
|
||||
if user.DefaultStorageID == 0 {
|
||||
if user.DefaultStorage == "" {
|
||||
ctx.EditMessage(update.EffectiveChat().GetID(), &tg.MessagesEditMessageRequest{
|
||||
Message: "请先使用 /storage 设置默认存储位置",
|
||||
ID: task.ReplyMessageID,
|
||||
|
||||
Reference in New Issue
Block a user