Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Beta31 #65

Merged
merged 37 commits into from
Feb 2, 2024
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
37 commits
Select commit Hold shift + click to select a range
1479feb
beta9
Hoshinonyaruko Jan 26, 2024
4a6f523
beta11
Hoshinonyaruko Jan 26, 2024
8739198
beta11
Hoshinonyaruko Jan 26, 2024
d9e0844
beta13
Hoshinonyaruko Jan 26, 2024
ab96bf7
beta14
Hoshinonyaruko Jan 26, 2024
9b7bf0e
beta12
Hoshinonyaruko Jan 26, 2024
7c66e7d
beta13
Hoshinonyaruko Jan 26, 2024
eb0b186
beta15
Hoshinonyaruko Jan 26, 2024
122de8b
beta16
Hoshinonyaruko Jan 26, 2024
5e4903f
beta17
Hoshinonyaruko Jan 26, 2024
7a82cfb
beta18
Hoshinonyaruko Jan 27, 2024
ecc8263
mergefix
Hoshinonyaruko Jan 27, 2024
d0a0a85
beta19
Hoshinonyaruko Jan 27, 2024
afcb856
beta20
Hoshinonyaruko Jan 27, 2024
fafe0f9
beta20
Hoshinonyaruko Jan 27, 2024
397d4c7
beta21
Hoshinonyaruko Jan 27, 2024
c00e1a8
fixmerge
Hoshinonyaruko Jan 27, 2024
42ed202
add_playermanager_api
Hoshinonyaruko Jan 27, 2024
31a6771
beta22
Hoshinonyaruko Jan 27, 2024
050d359
beta22
Hoshinonyaruko Jan 27, 2024
939e818
beta23
Hoshinonyaruko Jan 28, 2024
19cf927
merge
Hoshinonyaruko Jan 28, 2024
8073f3a
beta24
Hoshinonyaruko Jan 29, 2024
fdd6016
mergechanges
Hoshinonyaruko Jan 29, 2024
b167455
beta25
Hoshinonyaruko Jan 30, 2024
844698b
merge
Hoshinonyaruko Jan 30, 2024
f5c8d82
beta26
Hoshinonyaruko Jan 30, 2024
2d5e94d
merge
Hoshinonyaruko Jan 30, 2024
3076085
beta27
Hoshinonyaruko Jan 30, 2024
a8a67ed
beta28
Hoshinonyaruko Jan 31, 2024
4c954fa
beta28
Hoshinonyaruko Jan 31, 2024
2f9063e
beta28
Hoshinonyaruko Jan 31, 2024
cd6fad7
beta29
Hoshinonyaruko Jan 31, 2024
2651176
beta29
Hoshinonyaruko Jan 31, 2024
265b5e3
beta30
Hoshinonyaruko Jan 31, 2024
8aac47a
beta31
Hoshinonyaruko Feb 2, 2024
a559fa2
beta31
Hoshinonyaruko Feb 2, 2024
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
47 changes: 46 additions & 1 deletion backup.go
Original file line number Diff line number Diff line change
Expand Up @@ -16,13 +16,23 @@ type BackupTask struct {
}

func NewBackupTask(config config.Config) *BackupTask {
var ticker *time.Ticker
if config.BackupInterval > 0 {
ticker = time.NewTicker(time.Duration(config.BackupInterval) * time.Second)
}

return &BackupTask{
Config: config,
Ticker: time.NewTicker(time.Duration(config.BackupInterval) * time.Second),
Ticker: ticker,
}
}

func (task *BackupTask) Schedule() {
if task.Ticker == nil {
// 如果 Ticker 为 nil,不需要进行定时备份
return
}

for range task.Ticker.C {
task.RunBackup()
}
Expand Down Expand Up @@ -60,6 +70,41 @@ func (task *BackupTask) RunBackup() {
} else {
log.Printf("Backup completed successfully: %s", destinationPath)
}

// 删除旧备份(如果设置了天数)
if task.Config.SaveDeleteDays > 0 {
task.deleteOldBackups()
}

}

func (task *BackupTask) deleteOldBackups() {
// 读取备份目录
files, err := os.ReadDir(task.Config.BackupPath)
if err != nil {
log.Printf("Failed to list backup directory: %v", err)
return
}

// 删除超过SaveDeleteDays天数的备份
for _, f := range files {
if f.IsDir() {
backupTime, err := time.Parse("2006-01-02-15-04-05", f.Name())
if err != nil {
log.Printf("Failed to parse backup directory name: %s, error: %v", f.Name(), err)
continue
}

if time.Since(backupTime).Hours() > float64(task.Config.SaveDeleteDays*24) {
err := os.RemoveAll(filepath.Join(task.Config.BackupPath, f.Name()))
if err != nil {
log.Printf("Failed to delete old backup: %s, error: %v", f.Name(), err)
} else {
log.Printf("Old backup deleted successfully: %s", f.Name())
}
}
}
}
}

// copyDir 递归复制目录及其内容
Expand Down
79 changes: 40 additions & 39 deletions bot/bot.go
Original file line number Diff line number Diff line change
Expand Up @@ -207,7 +207,7 @@ func GensokyoHandlerClosure(c *gin.Context, config config.Config) {
func getBotHandler(msg string, message OnebotGroupMessage, config config.Config) {
// 检查消息是否至少以一个 "getbot" 开头
if !strings.HasPrefix(msg, "getbot") {
sendGroupMessage(message.GroupID, "错误,指令需要以getbot开头", config)
sendGroupMessage(message.GroupID, message.UserID, "错误,指令需要以getbot开头", config)
return
}

Expand All @@ -225,14 +225,14 @@ func getBotHandler(msg string, message OnebotGroupMessage, config config.Config)

// 确保在第一个非 "getbot" 部分之后还有足够的参数
if len(parts) < startIndex+3 {
sendGroupMessage(message.GroupID, "指令错误,请在palworld-go项目的机器人管理面板生成指令", config)
sendGroupMessage(message.GroupID, message.UserID, "指令错误,请在palworld-go项目的机器人管理面板生成指令", config)
return
}

// 解析number
number, err := strconv.ParseInt(parts[startIndex], 10, 64)
if err != nil {
sendGroupMessage(message.GroupID, "错误,请在palworld-go项目的机器人管理面板生成指令,number参数错误", config)
sendGroupMessage(message.GroupID, message.UserID, "错误,请在palworld-go项目的机器人管理面板生成指令,number参数错误", config)
return
}

Expand All @@ -251,10 +251,10 @@ func getBotHandler(msg string, message OnebotGroupMessage, config config.Config)
if err != nil {
fmt.Printf("储存pal-go面板端user配置出错 userid: %v 地址:%v\n", message.UserID, ipWithPort)
} else {
sendGroupMessage(message.GroupID, "绑定成功,现在你可以在帕鲁帕鲁机器人管理你的palworld-go面板", config)
sendGroupMessage(message.GroupID, message.UserID, "绑定成功,现在你可以在帕鲁帕鲁机器人管理你的palworld-go面板", config)
}
} else {
sendGroupMessage(message.GroupID, "指令无效,请重新生成,为了面板安全,palworld-go指令不可重复使用,如需多人使用,可多次生成.", config)
sendGroupMessage(message.GroupID, message.UserID, "指令无效,请重新生成,为了面板安全,palworld-go指令不可重复使用,如需多人使用,可多次生成.", config)
}
}

Expand All @@ -263,7 +263,7 @@ func getplayerHandler(msg string, message OnebotGroupMessage, config config.Conf
userIPData, err := RetrieveIPByUserID(message.UserID)
if err != nil {
// 发送错误消息
sendGroupMessage(message.GroupID, "没有初始化,请使用palworld-go面板,在机器人管理或服务器主人处获取指令,然后发给机器人", config)
sendGroupMessage(message.GroupID, message.UserID, "没有初始化,请使用palworld-go面板,在机器人管理或服务器主人处获取指令,然后发给机器人", config)
return
}

Expand Down Expand Up @@ -302,7 +302,7 @@ func getplayerHandler(msg string, message OnebotGroupMessage, config config.Conf
return
}
defer resp.Body.Close()
sendGroupMessage(message.GroupID, "正在刷新玩家,可能需要3-5秒返回,请勿重复操作", config)
sendGroupMessage(message.GroupID, message.UserID, "正在刷新玩家,可能需要3-5秒返回,请勿重复操作", config)
// 读取响应
body, err := io.ReadAll(resp.Body)
if err != nil {
Expand Down Expand Up @@ -332,7 +332,7 @@ func getplayerHandler(msg string, message OnebotGroupMessage, config config.Conf
uniqueID, _ := StorePlayerInfo(player.PlayerUID, player.SteamID, player.Name)
responseMessage += fmt.Sprintf("[%d] %s 上次在线:%s 在线:%t\n", uniqueID, player.Name, formattedLastOnline, player.Online)
}
sendGroupMessage(message.GroupID, responseMessage, config)
sendGroupMessage(message.GroupID, message.UserID, responseMessage, config)
}
}
func formatTimeDifference(t time.Time) string {
Expand All @@ -352,7 +352,7 @@ func formatTimeDifference(t time.Time) string {
return fmt.Sprintf("%d分钟前", minutes)
}

func sendGroupMessage(groupID int64, message string, config config.Config) error {
func sendGroupMessage(groupID int64, userID int64, message string, config config.Config) error {
// 获取基础URL
baseURL := config.Onebotv11HttpApiPath

Expand All @@ -363,6 +363,7 @@ func sendGroupMessage(groupID int64, message string, config config.Config) error
requestBody, err := json.Marshal(map[string]interface{}{
"group_id": groupID,
"message": message,
"user_id": userID,
})
if err != nil {
return fmt.Errorf("failed to marshal request body: %w", err)
Expand All @@ -389,35 +390,35 @@ func kickorbanHandler(msg string, message OnebotGroupMessage, config config.Conf

// 检查是否至少有两部分(例如:"踢人 123")
if len(parts) < 2 {
sendGroupMessage(message.GroupID, "指令格式错误 应为 踢人 1 封禁 1 kick 1 ban 1", config)
sendGroupMessage(message.GroupID, message.UserID, "指令格式错误 应为 踢人 1 封禁 1 kick 1 ban 1", config)
return
}

// 解析数字部分
var uniqueID int64
_, err := fmt.Sscanf(parts[1], "%d", &uniqueID)
if err != nil {
sendGroupMessage(message.GroupID, "指令格式错误 后方应为数字 空格为分割", config)
sendGroupMessage(message.GroupID, message.UserID, "指令格式错误 后方应为数字 空格为分割", config)
return
}

//测试提审核代码 不要删除
if uniqueID == 666 {
sendGroupMessage(message.GroupID, operation+"测试玩家 成功", config)
sendGroupMessage(message.GroupID, message.UserID, operation+"测试玩家 成功", config)
return
}

// 通过uniqueID获取玩家信息
playerInfo, err := RetrievePlayerInfoByID(uniqueID)
if err != nil {
sendGroupMessage(message.GroupID, "获取玩家信息失败: "+err.Error(), config)
sendGroupMessage(message.GroupID, message.UserID, "获取玩家信息失败: "+err.Error(), config)
return
}

// 检查SteamID是否有效
_, err = strconv.ParseInt(playerInfo.SteamID, 10, 64)
if err != nil {
sendGroupMessage(message.GroupID, playerInfo.Name+"无效的SteamID,帕鲁服务端通病,玩家增加后再次使用 玩家列表 获取可解决", config)
sendGroupMessage(message.GroupID, message.UserID, playerInfo.Name+"无效的SteamID,帕鲁服务端通病,玩家增加后再次使用 玩家列表 获取可解决", config)
return
}

Expand All @@ -428,15 +429,15 @@ func kickorbanHandler(msg string, message OnebotGroupMessage, config config.Conf
Type: operation,
})
if err != nil {
sendGroupMessage(message.GroupID, "构建请求失败: "+err.Error(), config)
sendGroupMessage(message.GroupID, message.UserID, "构建请求失败: "+err.Error(), config)
return
}

// 尝试获取用户的IP和UUID
userIPData, err := RetrieveIPByUserID(message.UserID)
if err != nil {
// 发送错误消息
sendGroupMessage(message.GroupID, "没有正确设置,请使用palworld-go面板,在机器人管理或服务器主人处获取指令,然后发给我", config)
sendGroupMessage(message.GroupID, message.UserID, "没有正确设置,请使用palworld-go面板,在机器人管理或服务器主人处获取指令,然后发给我", config)
return
}

Expand All @@ -453,30 +454,30 @@ func kickorbanHandler(msg string, message OnebotGroupMessage, config config.Conf
apiURL := baseURL + "/api/kickorban"
req, err := http.NewRequest("POST", apiURL, bytes.NewBuffer(reqBody))
if err != nil {
sendGroupMessage(message.GroupID, "创建请求失败: "+err.Error(), config)
sendGroupMessage(message.GroupID, message.UserID, "创建请求失败: "+err.Error(), config)
return
}
req.Header.Set("Content-Type", "application/json")
req.AddCookie(&http.Cookie{Name: "login_cookie", Value: userIPData.UUID})

resp, err := client.Do(req)
if err != nil {
sendGroupMessage(message.GroupID, "发送请求失败: "+err.Error(), config)
sendGroupMessage(message.GroupID, message.UserID, "发送请求失败: "+err.Error(), config)
return
}
defer resp.Body.Close()

// 检查响应状态
if resp.StatusCode != http.StatusOK {
sendGroupMessage(message.GroupID, fmt.Sprintf("%s %s 失败", operation, playerInfo.Name), config)
sendGroupMessage(message.GroupID, message.UserID, fmt.Sprintf("%s %s 失败", operation, playerInfo.Name), config)
return
}

// 发送成功消息
sendGroupMessage(message.GroupID, fmt.Sprintf("%s %s 成功", operation, playerInfo.Name), config)
sendGroupMessage(message.GroupID, message.UserID, fmt.Sprintf("%s %s 成功", operation, playerInfo.Name), config)
} else {
// 发送错误消息
sendGroupMessage(message.GroupID, "没有获取到面板信息,请使用palworld-go面板,在机器人管理或服务器主人处获取指令,然后发给我", config)
sendGroupMessage(message.GroupID, message.UserID, "没有获取到面板信息,请使用palworld-go面板,在机器人管理或服务器主人处获取指令,然后发给我", config)
return
}
}
Expand All @@ -485,7 +486,7 @@ func broadcastMessageHandler(msg string, message OnebotGroupMessage, config conf
// 从msg中提取广播内容
parts := strings.SplitN(msg, " ", 2)
if len(parts) != 2 {
sendGroupMessage(message.GroupID, "广播指令格式错误", config)
sendGroupMessage(message.GroupID, message.UserID, "广播指令格式错误", config)
return
}

Expand All @@ -495,15 +496,15 @@ func broadcastMessageHandler(msg string, message OnebotGroupMessage, config conf
}
reqBody, err := json.Marshal(broadcastReq)
if err != nil {
sendGroupMessage(message.GroupID, "创建广播请求失败", config)
sendGroupMessage(message.GroupID, message.UserID, "创建广播请求失败", config)
return
}

// 尝试获取用户的IP和UUID
userIPData, err := RetrieveIPByUserID(message.UserID)
if err != nil {
// 发送错误消息
sendGroupMessage(message.GroupID, "没有正确设置,请使用palworld-go面板,在机器人管理或服务器主人处获取指令,然后发给我", config)
sendGroupMessage(message.GroupID, message.UserID, "没有正确设置,请使用palworld-go面板,在机器人管理或服务器主人处获取指令,然后发给我", config)
return
}

Expand All @@ -519,7 +520,7 @@ func broadcastMessageHandler(msg string, message OnebotGroupMessage, config conf
apiURL := baseURL + "/api/broadcast"
req, err := http.NewRequest("POST", apiURL, bytes.NewBuffer(reqBody))
if err != nil {
sendGroupMessage(message.GroupID, "创建请求失败", config)
sendGroupMessage(message.GroupID, message.UserID, "创建请求失败", config)
return
}
req.Header.Set("Content-Type", "application/json")
Expand All @@ -529,21 +530,21 @@ func broadcastMessageHandler(msg string, message OnebotGroupMessage, config conf
client := &http.Client{}
resp, err := client.Do(req)
if err != nil {
sendGroupMessage(message.GroupID, "发送广播请求失败", config)
sendGroupMessage(message.GroupID, message.UserID, "发送广播请求失败", config)
return
}
defer resp.Body.Close()

// 检查响应状态
if resp.StatusCode != http.StatusOK {
sendGroupMessage(message.GroupID, fmt.Sprintf("广播失败,响应状态码: %d", resp.StatusCode), config)
sendGroupMessage(message.GroupID, message.UserID, fmt.Sprintf("广播失败,响应状态码: %d", resp.StatusCode), config)
return
}

sendGroupMessage(message.GroupID, "广播消息已成功发送", config)
sendGroupMessage(message.GroupID, message.UserID, "广播消息已成功发送", config)
} else {
// 发送错误消息
sendGroupMessage(message.GroupID, "没有获取到面板信息,请使用palworld-go面板,在机器人管理或服务器主人处获取指令,然后发给我", config)
sendGroupMessage(message.GroupID, message.UserID, "没有获取到面板信息,请使用palworld-go面板,在机器人管理或服务器主人处获取指令,然后发给我", config)
return
}
}
Expand All @@ -553,14 +554,14 @@ func restartHandler(msg string, message OnebotGroupMessage, config config.Config
// 从msg中提取参数
parts := strings.Fields(msg)
if len(parts) < 3 {
sendGroupMessage(message.GroupID, "重启指令格式错误,应为 重启服务器 多少秒数后重启(整数) 重启公告内容", config)
sendGroupMessage(message.GroupID, message.UserID, "重启指令格式错误,应为 重启服务器 多少秒数后重启(整数) 重启公告内容", config)
return
}

// 检查时间参数是否为数字
seconds, err := strconv.Atoi(parts[1])
if err != nil {
sendGroupMessage(message.GroupID, "重启时间应为数字", config)
sendGroupMessage(message.GroupID, message.UserID, "重启时间应为数字", config)
return
}

Expand All @@ -570,7 +571,7 @@ func restartHandler(msg string, message OnebotGroupMessage, config config.Config
userIPData, err := RetrieveIPByUserID(message.UserID)
if err != nil {
// 发送错误消息
sendGroupMessage(message.GroupID, "没有正确设置,请使用palworld-go面板,在机器人管理或服务器主人处获取指令,然后发给我", config)
sendGroupMessage(message.GroupID, message.UserID, "没有正确设置,请使用palworld-go面板,在机器人管理或服务器主人处获取指令,然后发给我", config)
return
}

Expand All @@ -593,13 +594,13 @@ func restartHandler(msg string, message OnebotGroupMessage, config config.Config

reqBody, err := json.Marshal(restartReq)
if err != nil {
sendGroupMessage(message.GroupID, "创建重启请求失败", config)
sendGroupMessage(message.GroupID, message.UserID, "创建重启请求失败", config)
return
}

req, err := http.NewRequest("POST", apiURL, bytes.NewBuffer(reqBody))
if err != nil {
sendGroupMessage(message.GroupID, "创建请求失败", config)
sendGroupMessage(message.GroupID, message.UserID, "创建请求失败", config)
return
}

Expand All @@ -610,22 +611,22 @@ func restartHandler(msg string, message OnebotGroupMessage, config config.Config
client := &http.Client{}
resp, err := client.Do(req)
if err != nil {
sendGroupMessage(message.GroupID, "发送服务器延时重启请求失败", config)
sendGroupMessage(message.GroupID, message.UserID, "发送服务器延时重启请求失败", config)
return
}
defer resp.Body.Close()

// 检查响应状态
if resp.StatusCode != http.StatusOK {
sendGroupMessage(message.GroupID, fmt.Sprintf("服务器重启失败,响应状态码: %d", resp.StatusCode), config)
sendGroupMessage(message.GroupID, message.UserID, fmt.Sprintf("服务器重启失败,响应状态码: %d", resp.StatusCode), config)
return
}

// 发送成功消息
sendGroupMessage(message.GroupID, "服务器将在"+strconv.Itoa(seconds)+"秒后重启,维护公告: "+announcement, config)
sendGroupMessage(message.GroupID, message.UserID, "服务器将在"+strconv.Itoa(seconds)+"秒后重启,维护公告: "+announcement, config)
} else {
// 发送错误消息
sendGroupMessage(message.GroupID, "没有获取到面板信息,请使用palworld-go面板,在机器人管理或服务器主人处获取指令,然后发给我", config)
sendGroupMessage(message.GroupID, message.UserID, "没有获取到面板信息,请使用palworld-go面板,在机器人管理或服务器主人处获取指令,然后发给我", config)
return
}

Expand Down Expand Up @@ -653,5 +654,5 @@ func listCommandsHandler(message OnebotGroupMessage, config config.Config) {
commandsStr := strings.Join(commands, "\n")

// 发送指令列表
sendGroupMessage(message.GroupID, "可用指令列表:\n"+commandsStr, config)
sendGroupMessage(message.GroupID, message.UserID, "可用指令列表:\n"+commandsStr, config)
}
Loading
Loading