From c660ca2ff9518c0661b9178e6c334b20da6d8761 Mon Sep 17 00:00:00 2001 From: hahwu <31872165+hahwu@users.noreply.github.com> Date: Tue, 6 Jan 2026 16:23:30 +0800 Subject: [PATCH] =?UTF-8?q?=E7=89=88=E6=9C=AC=E6=9B=B4=E6=96=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .gitignore | 5 + Type/c.go | 5 + alibaba/client.go | 75 ++++++++++++ alibaba/space.go | 265 ++++++++++++++++++++++++++++++++++++++++ conf/app.yml | 5 + conf/server.yml | 2 +- conf/translater.yml | 5 +- controller/operation.go | 27 ++-- controller/scripts.go | 229 ++++++++++++++++++++++++++++++++++ controller/user.go | 23 ++++ go.mod | 11 +- go.sum | 22 +++- main.go | 13 ++ model/User.go | 7 +- unit_test.go | 7 ++ util/login.go | 5 +- util/util.go | 6 + util/websocket.go | 4 + 18 files changed, 691 insertions(+), 25 deletions(-) create mode 100644 alibaba/client.go create mode 100644 alibaba/space.go create mode 100644 conf/app.yml create mode 100644 controller/scripts.go diff --git a/.gitignore b/.gitignore index 1c1f758..6888a08 100644 --- a/.gitignore +++ b/.gitignore @@ -7,3 +7,8 @@ release/login_service/login_service release/login_service/log/*.log release/shipping_service/shipping_service release/backend +log/*.log +*.exe* +*.log +runtime/*.db +config/* \ No newline at end of file diff --git a/Type/c.go b/Type/c.go index 32ba6bf..2f90e4e 100644 --- a/Type/c.go +++ b/Type/c.go @@ -53,3 +53,8 @@ type CardVchartData struct { type CardNotifyData struct { } + +type ChessData struct { + Id string + Icon string +} diff --git a/alibaba/client.go b/alibaba/client.go new file mode 100644 index 0000000..4c0738b --- /dev/null +++ b/alibaba/client.go @@ -0,0 +1,75 @@ +// This file is auto-generated, don't edit it. Thanks. +package alibaba + +import ( + openapi "github.com/alibabacloud-go/darabonba-openapi/v2/client" + dingtalkdrive_1_0 "github.com/alibabacloud-go/dingtalk/drive_1_0" + dingtalkoauth2_1_0 "github.com/alibabacloud-go/dingtalk/oauth2_1_0" + dingtalkstorage_1_0 "github.com/alibabacloud-go/dingtalk/storage_1_0" + dingtalkstorage_2_0 "github.com/alibabacloud-go/dingtalk/storage_2_0" + + "github.com/alibabacloud-go/tea/tea" +) + +const ( + UNIONID = "YWjeT8Ltk2mUOP82QyMe0AiEiE" + SPACEID = "28057154815" + DENTRYID = "QBnd5ExVEaO9372acAdE2RzmVyeZqMmz" +) + +/** + * 使用 Token 初始化账号Client + * @return Client + * @throws Exception + */ +func CreateClient() (_result *dingtalkoauth2_1_0.Client, _err error) { + config := &openapi.Config{} + config.Protocol = tea.String("https") + config.RegionId = tea.String("central") + _result = &dingtalkoauth2_1_0.Client{} + _result, _err = dingtalkoauth2_1_0.NewClient(config) + return _result, _err +} + +func CreateStorageClientV2() (_result *dingtalkstorage_2_0.Client, _err error) { + config := &openapi.Config{} + config.Protocol = tea.String("https") + config.RegionId = tea.String("central") + _result = &dingtalkstorage_2_0.Client{} + _result, _err = dingtalkstorage_2_0.NewClient(config) + return _result, _err +} + +func CreateStorageClientV1() (_result *dingtalkstorage_1_0.Client, _err error) { + config := &openapi.Config{} + config.Protocol = tea.String("https") + config.RegionId = tea.String("central") + _result = &dingtalkstorage_1_0.Client{} + _result, _err = dingtalkstorage_1_0.NewClient(config) + return _result, _err +} + +func GetToken() (string, error) { + client, err := CreateClient() + if err != nil { + return "", err + } + getAccessTokenRequest := &dingtalkoauth2_1_0.GetAccessTokenRequest{ + AppKey: tea.String("dingrmgtodzxaik76jpc"), + AppSecret: tea.String("RDZLaE0sxzOM0oz41iK1pHshU1W1w_XSGfiDAogUEauLq5iuxulSdZD4LGJtHwW7"), + } + resp, err := client.GetAccessToken(getAccessTokenRequest) + if err != nil { + return "", err + } + return *resp.Body.AccessToken, nil +} + +func CreateDriveClient() (_result *dingtalkdrive_1_0.Client, _err error) { + config := &openapi.Config{} + config.Protocol = tea.String("https") + config.RegionId = tea.String("central") + _result = &dingtalkdrive_1_0.Client{} + _result, _err = dingtalkdrive_1_0.NewClient(config) + return _result, _err +} diff --git a/alibaba/space.go b/alibaba/space.go new file mode 100644 index 0000000..f8a9475 --- /dev/null +++ b/alibaba/space.go @@ -0,0 +1,265 @@ +// This file is auto-generated, don't edit it. Thanks. +package alibaba + +import ( + "fmt" + "io" + "net/http" + "os" + "path/filepath" + + dingtalkdrive_1_0 "github.com/alibabacloud-go/dingtalk/drive_1_0" + dingtalkstorage_1_0 "github.com/alibabacloud-go/dingtalk/storage_1_0" + dingtalkstorage_2_0 "github.com/alibabacloud-go/dingtalk/storage_2_0" + + util "github.com/alibabacloud-go/tea-utils/v2/service" + "github.com/alibabacloud-go/tea/tea" +) + +func CreateSpace() (_err error) { + client, _err := CreateStorageClientV1() + if _err != nil { + return _err + } + token, err := GetToken() + if err != nil { + return err + } + addSpaceHeaders := &dingtalkstorage_1_0.AddSpaceHeaders{} + addSpaceHeaders.XAcsDingtalkAccessToken = tea.String(token) + optionCapabilities := &dingtalkstorage_1_0.AddSpaceRequestOptionCapabilities{ + CanSearch: tea.Bool(true), + CanRename: tea.Bool(true), + CanRecordRecentFile: tea.Bool(true), + } + option := &dingtalkstorage_1_0.AddSpaceRequestOption{ + Name: tea.String("测试空间"), + Quota: tea.Int64(1024), + Capabilities: optionCapabilities, + Scene: tea.String("scene"), + SceneId: tea.String("123"), + OwnerType: tea.String("USER"), + } + addSpaceRequest := &dingtalkstorage_1_0.AddSpaceRequest{ + UnionId: tea.String("V7tQ9uuiSnF2naz1DY45fsQiEiE"), + Option: option, + } + resp, _err := client.AddSpaceWithOptions(addSpaceRequest, addSpaceHeaders, &util.RuntimeOptions{}) + fmt.Println(resp) + return _err +} + +func SearchDentryUuid() error { + client, _err := CreateStorageClientV2() + if _err != nil { + return _err + } + token, err := GetToken() + if err != nil { + return err + } + searchDentriesHeaders := &dingtalkstorage_2_0.SearchDentriesHeaders{} + searchDentriesHeaders.XAcsDingtalkAccessToken = tea.String(token) + optionVisitTimeRange := &dingtalkstorage_2_0.SearchDentriesRequestOptionVisitTimeRange{} + optionCreateTimeRange := &dingtalkstorage_2_0.SearchDentriesRequestOptionCreateTimeRange{} + option := &dingtalkstorage_2_0.SearchDentriesRequestOption{ + NextToken: tea.String(""), + MaxResults: tea.Int32(20), + DentryCategories: []*string{}, + CreatorIds: []*string{}, + ModifierIds: []*string{}, + CreateTimeRange: optionCreateTimeRange, + VisitTimeRange: optionVisitTimeRange, + } + searchDentriesRequest := &dingtalkstorage_2_0.SearchDentriesRequest{ + OperatorId: tea.String("F6S4MWGk8iiuUOP82QyMe0AiEiE"), + Keyword: tea.String("Dialog"), + Option: option, + } + resp, _err := client.SearchDentriesWithOptions(searchDentriesRequest, searchDentriesHeaders, &util.RuntimeOptions{}) + fmt.Println(resp) + return _err +} + +func AddFloder() error { + client, _err := CreateStorageClientV1() + if _err != nil { + return _err + } + token, err := GetToken() + if err != nil { + return err + } + addFolderHeaders := &dingtalkstorage_1_0.AddFolderHeaders{} + addFolderHeaders.XAcsDingtalkAccessToken = tea.String(token) + optionAppProperties0 := &dingtalkstorage_1_0.AddFolderRequestOptionAppProperties{ + Name: tea.String("属性1"), + Value: tea.String("属性值1"), + Visibility: tea.String("PUBLIC"), + } + option := &dingtalkstorage_1_0.AddFolderRequestOption{ + ConflictStrategy: tea.String("AUTO_RENAME"), + AppProperties: []*dingtalkstorage_1_0.AddFolderRequestOptionAppProperties{optionAppProperties0}, + } + addFolderRequest := &dingtalkstorage_1_0.AddFolderRequest{ + UnionId: tea.String("V7tQ9uuiSnF2naz1DY45fsQiEiE"), + Name: tea.String("测试文件夹"), + Option: option, + } + resp, _err := client.AddFolderWithOptions(tea.String("28051557270"), tea.String("0"), addFolderRequest, addFolderHeaders, &util.RuntimeOptions{}) + fmt.Println(resp) + + return _err +} + +func SearchSpaceId() error { + client, _err := CreateDriveClient() + if _err != nil { + return _err + } + token, err := GetToken() + if err != nil { + return err + } + listSpacesHeaders := &dingtalkdrive_1_0.ListSpacesHeaders{} + listSpacesHeaders.XAcsDingtalkAccessToken = tea.String(token) + listSpacesRequest := &dingtalkdrive_1_0.ListSpacesRequest{ + UnionId: tea.String(UNIONID), + SpaceType: tea.String("org"), + NextToken: tea.String(""), + MaxResults: tea.Int32(50), + } + resp, _err := client.ListSpacesWithOptions(listSpacesRequest, listSpacesHeaders, &util.RuntimeOptions{}) + fmt.Println(resp) + return _err +} + +func GetMaxFileVersion(version int, nextToken string) int { + client, _err := CreateStorageClientV1() + if _err != nil { + return 0 + } + token, err := GetToken() + if err != nil { + return 0 + } + listDentryVersionsHeaders := &dingtalkstorage_1_0.ListDentryVersionsHeaders{} + listDentryVersionsHeaders.XAcsDingtalkAccessToken = tea.String(token) + listDentryVersionsRequest := &dingtalkstorage_1_0.ListDentryVersionsRequest{ + NextToken: tea.String(nextToken), + MaxResults: tea.Int32(30), + UnionId: tea.String(UNIONID), + } + resp, _err := client.ListDentryVersionsWithOptions(tea.String("28057154815"), tea.String("206700372014"), listDentryVersionsRequest, listDentryVersionsHeaders, &util.RuntimeOptions{}) + if resp.Body.NextToken != nil { + fmt.Println("nextToken:", *resp.Body.NextToken) + maxVersion := 0 + for _, v := range resp.Body.Dentries { + if int(*v.Version) > maxVersion { + maxVersion = int(*v.Version) + } + } + return GetMaxFileVersion(maxVersion, *resp.Body.NextToken) + } else { + return version + } +} + +func GetFileInfo() error { + client, _err := CreateStorageClientV1() + if _err != nil { + return _err + } + token, err := GetToken() + if err != nil { + return err + } + listDentriesHeaders := &dingtalkstorage_1_0.ListDentriesHeaders{} + listDentriesHeaders.XAcsDingtalkAccessToken = tea.String(token) + listDentriesRequest := &dingtalkstorage_1_0.ListDentriesRequest{ + ParentId: tea.String("0"), + NextToken: tea.String(""), + MaxResults: tea.Int32(30), + OrderBy: tea.String("MODIFIED_TIME"), + Order: tea.String("DESC"), + WithThumbnail: tea.Bool(false), + UnionId: tea.String(UNIONID), + } + resp, _err := client.ListDentriesWithOptions(tea.String("28057154815"), listDentriesRequest, listDentriesHeaders, &util.RuntimeOptions{}) + fmt.Println(resp) + return _err +} + +func DownloadFile() error { + client, _err := CreateStorageClientV1() + if _err != nil { + return _err + } + token, err := GetToken() + if err != nil { + return err + } + MaxVersion := GetMaxFileVersion(0, "") + getFileDownloadInfoHeaders := &dingtalkstorage_1_0.GetFileDownloadInfoHeaders{} + getFileDownloadInfoHeaders.XAcsDingtalkAccessToken = tea.String(token) + option := &dingtalkstorage_1_0.GetFileDownloadInfoRequestOption{ + Version: tea.Int64(int64(MaxVersion)), + PreferIntranet: tea.Bool(false), + } + getFileDownloadInfoRequest := &dingtalkstorage_1_0.GetFileDownloadInfoRequest{ + UnionId: tea.String("YWjeT8Ltk2mUOP82QyMe0AiEiE"), + Option: option, + } + resp, _err := client.GetFileDownloadInfoWithOptions(tea.String("28057154815"), tea.String("206700372014"), getFileDownloadInfoRequest, getFileDownloadInfoHeaders, &util.RuntimeOptions{}) + responseBody := resp.Body + downloadUrl := responseBody.HeaderSignatureInfo.ResourceUrls[0] + header := map[string]string{ + "Authorization": *responseBody.HeaderSignatureInfo.Headers["Authorization"], + "x-oss-date": *responseBody.HeaderSignatureInfo.Headers["x-oss-date"], + } + _, _err = _downloadFile(header, *downloadUrl) + return _err +} + +func _downloadFile(headers map[string]string, url string) ([]byte, error) { + req, err := http.NewRequest("GET", url, nil) + if err != nil { + return nil, err + } + // 默认的下载相关 headers,可被传入的 headers 覆盖 + defaultHeaders := map[string]string{ + "Accept": "application/xlsx", + "Accept-Encoding": "identity", + "Connection": "keep-alive", + "Cache-Control": "no-cache", + } + for k, v := range defaultHeaders { + req.Header.Set(k, v) + } + for k, v := range headers { + req.Header.Set(k, v) + } + client := &http.Client{} + resp, err := client.Do(req) + if err != nil { + return nil, err + } + defer resp.Body.Close() + if resp.StatusCode < 200 || resp.StatusCode >= 300 { + return nil, fmt.Errorf("download failed: status %s", resp.Status) + } + data, err := io.ReadAll(resp.Body) + if err != nil { + return nil, err + } + targetDir := "D:/Github/docs/config" + if err := os.MkdirAll(targetDir, 0755); err != nil { + return nil, err + } + targetFile := filepath.Join(targetDir, "DialogueData.xlsx") + if err := os.WriteFile(targetFile, data, 0644); err != nil { + return nil, err + } + + return data, nil +} diff --git a/conf/app.yml b/conf/app.yml new file mode 100644 index 0000000..7a709ba --- /dev/null +++ b/conf/app.yml @@ -0,0 +1,5 @@ +name: "Admin Backend" +version: "1.0.0" +debug: true +port: 5240 + diff --git a/conf/server.yml b/conf/server.yml index 0161465..dd321a8 100644 --- a/conf/server.yml +++ b/conf/server.yml @@ -37,7 +37,7 @@ mysqls: password: 'GWFj1cHaqjpzvcsHBWTFtLWtm8MUZKROx_wvbV6jPg==' database: 'merge_pet_london_%d' idleTimeout: Infinity - - host: '127.0.0.1' + - host: '47.254.83.25' name: 'merge_pet_online' port: 3306 user: 'root' diff --git a/conf/translater.yml b/conf/translater.yml index 5462b3d..b31fb33 100644 --- a/conf/translater.yml +++ b/conf/translater.yml @@ -5,4 +5,7 @@ user: - account: "Daniela Cristina Schmitt" keys: "MergeData, cardName, GuideData, ChapterTip, DialogueData" keysType: "no_include" # keysType 不包含 - colunm: "key,en_US,pt_BR" \ No newline at end of file + colunm: "key,en_US,pt_BR" + - account: "Catarina Pereira" # 账号名 + keys: "MergeData, cardName, DialogData, ChapterTip, chapter_title" # 需要的键值列表,逗号分隔 + colunm: "key,en_US,pt_BR" # 需要翻译的列名 \ No newline at end of file diff --git a/controller/operation.go b/controller/operation.go index 9c9fec5..0a1b8ab 100644 --- a/controller/operation.go +++ b/controller/operation.go @@ -1,10 +1,8 @@ package controller import ( - "backend/model" "backend/util" "fmt" - "time" "github.com/gin-gonic/gin" ) @@ -56,21 +54,30 @@ func CopyUserOperation(srcAppID, dstAppID, srcUid, dstUid int) error { defer DstDb.Close() // 复制 Mod 表 srcData := DbData{} - _, err = model.UserGM(dstAppID, 1, dstUid, "logout") - time.Sleep(time.Second * 2) - if err != nil { - return err - } + // _, err = model.UserGM(dstAppID, 1, dstUid, "logout") + // time.Sleep(time.Second * 2) + // if err != nil { + // return err + // } err = SrcDb.Get(&srcData, "SELECT dwUin, mData, updateTime FROM t_player_mod WHERE dwUin = ? LIMIT 1", srcUid) if err != nil { return err } - dstData := DbData{} - err = DstDb.Get(&dstData, "SELECT dwUin, mData, updateTime FROM t_player_mod WHERE dwUin = ? LIMIT 1", dstUid) + var auto_id int64 + _ = DstDb.Get(&auto_id, "SELECT auto_id FROM t_account WHERE user_name = ?", srcData.DwUin) + if auto_id == 0 { + result, err := DstDb.Exec("INSERT INTO t_account (user_name, user_password) VALUES (?, ?) ON DUPLICATE KEY UPDATE user_password = VALUES(user_password)", srcData.DwUin, "123456") + if err != nil { + return err + } + auto_id, err = result.LastInsertId() + } + newUid := int(auto_id) + 100000000*dstAppID + 100000 + _, err = DstDb.Exec("INSERT INTO t_player_baseinfo (dwUin, user_name, start_order_id) VALUES (?, ?, 1) ON DUPLICATE KEY UPDATE user_name = VALUES(user_name)", newUid, srcData.DwUin) if err != nil { return err } - _, err = DstDb.Exec("UPDATE t_player_mod SET mData = ?, updateTime = ? WHERE dwUin = ?", srcData.MData, util.Now(), dstUid) + _, err = DstDb.Exec("INSERT INTO t_player_mod (dwUin, mData, updateTime) VALUES (?, ?, ?) ON DUPLICATE KEY UPDATE mData = VALUES(mData), updateTime = VALUES(updateTime)", newUid, srcData.MData, srcData.UpdateTime) if err != nil { return err } diff --git a/controller/scripts.go b/controller/scripts.go new file mode 100644 index 0000000..ceca1b7 --- /dev/null +++ b/controller/scripts.go @@ -0,0 +1,229 @@ +package controller + +import ( + "backend/alibaba" + "backend/util" + "fmt" + "os/exec" + "time" + + "github.com/gin-gonic/gin" + "github.com/xuri/excelize/v2" +) + +func Copywriting(c *gin.Context) { + request := struct { + Step int `json:"step"` + }{} + if err := c.BindJSON(&request); err != nil { + failed(c, "参数绑定失败: "+err.Error()) + return + } + switch request.Step { + case 0: + success(c, map[string]interface{}{ + "step": 1, + "label": "下载文案文件", + "tips": []string{}, + "code": 0, + }) + case 1: + CopywritingStep1(c) + case 2: + CopywritingStep2(c) + case 3: + CopywritingStep3(c) + default: + failed(c, "无效的步骤") + } + util.AddAdminLog(c, "文案自动化脚本", request) +} +func CopywritingStep1(c *gin.Context) { + err := alibaba.DownloadFile() + if err != nil { + success(c, map[string]interface{}{ + "step": 2, + "label": "提交git", + "tips": []string{ + err.Error(), + }, + "code": 1, + }) + return + } + // 执行脚本的逻辑 + success(c, map[string]interface{}{ + "step": 2, + "label": "提交git", + "tips": []string{ + "下载文案文件DialogueData.xlsx成功", + }, + "code": 0, + }) +} +func CopywritingStep2(c *gin.Context) { + time.Sleep(time.Second) + code := 0 + repoDir := `D:\Github\docs` + file := `config\DialogueData.xlsx` + // git pull + if out, err := exec.Command("git", "-C", repoDir, "pull").CombinedOutput(); err != nil { + scritp_fail(c, "git pull 失败: "+err.Error()+": "+string(out)) + return + } + // git add + if out, err := exec.Command("git", "-C", repoDir, "add", file).CombinedOutput(); err != nil { + scritp_fail(c, "git add 失败: "+err.Error()+": "+string(out)) + return + } + + // git commit (ignore non-fatal commit output/errors like "nothing to commit") + exec.Command("git", "-C", repoDir, "commit", "-m", "Update DialogueData.xlsx").Run() + + // git push + if out, err := exec.Command("git", "-C", repoDir, "push").CombinedOutput(); err != nil { + scritp_fail(c, "git push 失败: "+err.Error()+": "+string(out)) + return + } + + _ = code + // 执行脚本的逻辑 + success(c, map[string]interface{}{ + "step": 3, + "label": "修改翻译表", + "tips": []string{}, + "code": 0, + }) +} + +func CopywritingStep3(c *gin.Context) { + file := `D:\Github\docs\config\DialogueData.xlsx` + f, err := excelize.OpenFile(file) + if err != nil { + failed(c, "打开文件失败: "+err.Error()) + return + } + defer f.Close() + + rows, err := f.GetRows("DialogueData") + if err != nil { + failed(c, "读取sheet失败: "+err.Error()) + return + } + type Dialogue struct { + Id int + Key string + Dialogue string + } + dialogueMap := make(map[string]Dialogue) + for i, row := range rows { + // 跳过标题行(如果有) + if i < 2 { + continue + } + var dVal, iVal string + if len(row) > 3 { + dVal = row[3] // D列,0-based 索引 3 + } + if len(row) > 8 { + iVal = row[8] // I列,0-based 索引 8 + } + var lVal string + if len(row) > 11 { + lVal = row[11] // L列,0-based 索引 11 + } + if lVal != "" { + continue + } + if dVal == "" || iVal == "" { + continue + } + dialogueMap[dVal] = Dialogue{ + Key: dVal, + Dialogue: iVal, + Id: i - 2, // 减去标题行 + } + } + type db_data struct { + Id int `db:"Id"` + Key string `db:"key"` + EnUs string `db:"en_us"` + OldValue string + } + var dbDatas []db_data + db := util.MPool.GetGameDB() + if db == nil { + scritp_fail(c, "获取数据库连接失败") + return + } + err = db.Select(&dbDatas, "SELECT `key`, `en_us` FROM `language`") + if err != nil { + scritp_fail(c, "查询语言表失败: "+err.Error()) + return + } + updateData := []db_data{} + for _, item := range dbDatas { + if val, ok := dialogueMap[item.Key]; ok { + if val.Dialogue != item.EnUs { + item.OldValue = item.EnUs + item.EnUs = val.Dialogue + updateData = append(updateData, item) + } + delete(dialogueMap, item.Key) + } + } + for _, item := range updateData { + _, err := db.Exec("UPDATE `language` SET `en_us` = ? WHERE `key` = ?", item.EnUs, item.Key) + if err != nil { + scritp_fail(c, "更新语言表失败: "+err.Error()) + return + } + _, err = db.Exec("insert into language_op (`LanguageId`, `Field`, `OldValue`, `NewValue`, `Type`, `Update`, `Role`) values (?, ?, ?, ?, ?,?,?)", item.Id, "en_us", item.OldValue, item.EnUs, "Edit", util.Now(), "scripts") + } + + for _, v := range dialogueMap { + result, err := db.Exec("INSERT INTO `language` (`key`, `en_us`) VALUES (?, ?)", v.Key, v.Dialogue) + if err != nil { + scritp_fail(c, "插入语言表失败: "+err.Error()) + return + } + id, _ := result.LastInsertId() + _, err = db.Exec("insert into language_op (`LanguageId`, `Field`, `OldValue`, `NewValue`, `Type`, `Update`, `Role`) values (?, ?, ?, ?, ?,?,?)", id, "All", "", v.Dialogue, "Add", util.Now(), "scripts") + } + + // 将结果放到 gin 上下文,供后续使用 + c.Set("DialogueMap", dialogueMap) + tips := []string{} + if len(updateData) > 0 { + tips = append(tips, fmt.Sprintf("更新了 %d 条翻译内容", len(updateData))) + for _, v := range updateData { + tips = append(tips, fmt.Sprintf("Key: %s", v.Key)) + } + } + if len(dialogueMap) > 0 { + tips = append(tips, fmt.Sprintf("新增了 %d 条翻译内容", len(dialogueMap))) + for _, v := range dialogueMap { + tips = append(tips, fmt.Sprintf("Key: %s", v.Key)) + } + } + // 执行脚本的逻辑 + success(c, map[string]interface{}{ + "step": -1, + "label": "脚本执行成功", + "tips": []string{ + fmt.Sprintf("增加%d个key,更新%d个key", len(dialogueMap), len(updateData)), + }, + "code": 0, + }) +} + +func scritp_fail(c *gin.Context, err string) { + success(c, map[string]interface{}{ + "step": -1, + "label": "", + "tips": []string{ + err, + }, + "code": 1, + }) +} diff --git a/controller/user.go b/controller/user.go index 9b5ddaa..c50d28c 100644 --- a/controller/user.go +++ b/controller/user.go @@ -1,10 +1,12 @@ package controller import ( + "backend/Type" "backend/model" "backend/store" "backend/util" "fmt" + "strings" "github.com/gin-gonic/gin" ) @@ -74,6 +76,27 @@ func UserDetail(c *gin.Context) { log := model.Log{ Uid: request.Uid, } + if user["Order"] != nil { + order := user["Order"].(map[string]interface{}) + for k, v := range order { + info := v.(map[string]interface{}) + chess_id := info["ChessId"].(string) + chess_list := strings.Split(chess_id, " ") + chess_arr := []Type.ChessData{} + for _, cid := range chess_list { + if cid == "" { + continue + } + chess_url := util.GetChessURL(cid) + chess_arr = append(chess_arr, Type.ChessData{ + Id: cid, + Icon: chess_url, + }) + } + info["ChessId"] = chess_arr + order[k] = info + } + } heat, _ := log.Heat() if err != nil { fmt.Print(err) diff --git a/go.mod b/go.mod index c56c592..92b2064 100644 --- a/go.mod +++ b/go.mod @@ -8,6 +8,7 @@ require ( github.com/Ullaakut/nmap v2.0.2+incompatible github.com/alibabacloud-go/cloudauth-20190307/v4 v4.9.2 github.com/alibabacloud-go/darabonba-openapi/v2 v2.1.9 + github.com/alibabacloud-go/dingtalk v1.6.97 github.com/alibabacloud-go/dysmsapi-20170525/v5 v5.1.2 github.com/alibabacloud-go/tea v1.3.10 github.com/alibabacloud-go/tea-console v1.0.0 @@ -18,7 +19,11 @@ require ( github.com/google/uuid v1.6.0 github.com/jmoiron/sqlx v1.4.0 github.com/larksuite/oapi-sdk-go/v3 v3.4.9 + github.com/lestrrat-go/file-rotatelogs v2.4.0+incompatible + github.com/oschwald/geoip2-golang v1.13.0 github.com/robfig/cron/v3 v3.0.1 + github.com/xuri/excelize/v2 v2.10.0 + go.etcd.io/bbolt v1.4.3 golang.org/x/crypto v0.43.0 golang.org/x/net v0.46.0 google.golang.org/protobuf v1.34.1 @@ -30,6 +35,7 @@ require ( github.com/alibabacloud-go/alibabacloud-gateway-spi v0.0.5 // indirect github.com/alibabacloud-go/debug v1.0.1 // indirect github.com/alibabacloud-go/endpoint-util v1.1.0 // indirect + github.com/alibabacloud-go/gateway-dingtalk v1.0.2 // indirect github.com/alibabacloud-go/openapi-util v0.1.1 // indirect github.com/alibabacloud-go/openplatform-20191219/v2 v2.0.1 // indirect github.com/alibabacloud-go/tea-fileform v1.1.1 // indirect @@ -50,15 +56,14 @@ require ( github.com/goccy/go-json v0.10.2 // indirect github.com/gogo/protobuf v1.3.2 // indirect github.com/gorilla/websocket v1.5.0 // indirect + github.com/jonboulle/clockwork v0.5.0 // indirect github.com/json-iterator/go v1.1.12 // indirect github.com/klauspost/cpuid/v2 v2.2.7 // indirect github.com/leodido/go-urn v1.4.0 // indirect - github.com/lestrrat-go/file-rotatelogs v2.4.0+incompatible // indirect github.com/lestrrat-go/strftime v1.1.1 // indirect github.com/mattn/go-isatty v0.0.20 // indirect github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd // indirect github.com/modern-go/reflect2 v1.0.2 // indirect - github.com/oschwald/geoip2-golang v1.13.0 // indirect github.com/oschwald/maxminddb-golang v1.13.0 // indirect github.com/pelletier/go-toml/v2 v2.2.2 // indirect github.com/pkg/errors v0.9.1 // indirect @@ -69,9 +74,7 @@ require ( github.com/twitchyliquid64/golang-asm v0.15.1 // indirect github.com/ugorji/go/codec v1.2.12 // indirect github.com/xuri/efp v0.0.1 // indirect - github.com/xuri/excelize/v2 v2.10.0 // indirect github.com/xuri/nfp v0.0.2-0.20250530014748-2ddeb826f9a9 // indirect - go.etcd.io/bbolt v1.4.3 // indirect golang.org/x/arch v0.8.0 // indirect golang.org/x/sys v0.37.0 // indirect golang.org/x/text v0.30.0 // indirect diff --git a/go.sum b/go.sum index 8b4a5fe..211de95 100644 --- a/go.sum +++ b/go.sum @@ -19,6 +19,7 @@ github.com/alibabacloud-go/darabonba-map v0.0.2 h1:qvPnGB4+dJbJIxOOfawxzF3hzMnIp github.com/alibabacloud-go/darabonba-map v0.0.2/go.mod h1:28AJaX8FOE/ym8OUFWga+MtEzBunJwQGceGQlvaPGPc= github.com/alibabacloud-go/darabonba-openapi/v2 v2.0.0/go.mod h1:5JHVmnHvGzR2wNdgaW1zDLQG8kOC4Uec8ubkMogW7OQ= github.com/alibabacloud-go/darabonba-openapi/v2 v2.0.11/go.mod h1:wHxkgZT1ClZdcwEVP/pDgYK/9HucsnCfMipmJgCz4xY= +github.com/alibabacloud-go/darabonba-openapi/v2 v2.0.12/go.mod h1:cgtLEj8i4ddXMcQgq4PnpVQvlzS+y5B+QtdSfmcLM3A= github.com/alibabacloud-go/darabonba-openapi/v2 v2.1.9 h1:7P0KWfed/YMtpeuW3E2iwokzoz9L7H9rB+VZzg5DeBs= github.com/alibabacloud-go/darabonba-openapi/v2 v2.1.9/go.mod h1:kgnXaV74AVjM3ZWJu1GhyXGuCtxljJ677oUfz6MyJOE= github.com/alibabacloud-go/darabonba-signature-util v0.0.7 h1:UzCnKvsjPFzApvODDNEYqBHMFt1w98wC7FOo0InLyxg= @@ -29,10 +30,14 @@ github.com/alibabacloud-go/debug v0.0.0-20190504072949-9472017b5c68/go.mod h1:6p github.com/alibabacloud-go/debug v1.0.0/go.mod h1:8gfgZCCAC3+SCzjWtY053FrOcd4/qlH6IHTI4QyICOc= github.com/alibabacloud-go/debug v1.0.1 h1:MsW9SmUtbb1Fnt3ieC6NNZi6aEwrXfDksD4QA6GSbPg= github.com/alibabacloud-go/debug v1.0.1/go.mod h1:8gfgZCCAC3+SCzjWtY053FrOcd4/qlH6IHTI4QyICOc= +github.com/alibabacloud-go/dingtalk v1.6.97 h1:3dc4fEpJd/2BXYFsqs9ipBTpxJKZXQhofaZhvz6mECM= +github.com/alibabacloud-go/dingtalk v1.6.97/go.mod h1:mUcgNRgMGQzABtiZtTK8a3b6LwQBQ8t9WsDKzklqVpg= github.com/alibabacloud-go/dysmsapi-20170525/v5 v5.1.2 h1:mNSlLE7QQiZLmC55BJog3PFJFtQp10lbnnEWWIxeCvM= github.com/alibabacloud-go/dysmsapi-20170525/v5 v5.1.2/go.mod h1:mYOaEwXaib4RLB2NY8cXFjKbxPQHUqt6lhPEOvqR8aw= github.com/alibabacloud-go/endpoint-util v1.1.0 h1:r/4D3VSw888XGaeNpP994zDUaxdgTSHBbVfZlzf6b5Q= github.com/alibabacloud-go/endpoint-util v1.1.0/go.mod h1:O5FuCALmCKs2Ff7JFJMudHs0I5EBgecXXxZRyswlEjE= +github.com/alibabacloud-go/gateway-dingtalk v1.0.2 h1:+etjmc64QTmYvHlc6eFkH9y2DOc3UPcyD2nF3IXsVqw= +github.com/alibabacloud-go/gateway-dingtalk v1.0.2/go.mod h1:JUvHpkJtlPFpgJcfXqc9Y4mk2JnoRn5XpKbRz38jJho= github.com/alibabacloud-go/openapi-util v0.0.11/go.mod h1:sQuElr4ywwFRlCCberQwKRFhRzIyG4QTP/P4y1CJ6Ws= github.com/alibabacloud-go/openapi-util v0.1.0/go.mod h1:sQuElr4ywwFRlCCberQwKRFhRzIyG4QTP/P4y1CJ6Ws= github.com/alibabacloud-go/openapi-util v0.1.1 h1:ujGErJjG8ncRW6XtBBMphzHTvCxn4DjrVw4m04HsS28= @@ -63,6 +68,7 @@ github.com/alibabacloud-go/tea-utils v1.3.1/go.mod h1:EI/o33aBfj3hETm4RLiAxF/ThQ github.com/alibabacloud-go/tea-utils v1.4.5 h1:h0/6Xd2f3bPE4XHTvkpjwxowIwRCJAJOqY6Eq8f3zfA= github.com/alibabacloud-go/tea-utils v1.4.5/go.mod h1:KNcT0oXlZZxOXINnZBs6YvgOd5aYp9U67G+E3R8fcQw= github.com/alibabacloud-go/tea-utils/v2 v2.0.0/go.mod h1:U5MTY10WwlquGPS34DOeomUGBB0gXbLueiq5Trwu0C4= +github.com/alibabacloud-go/tea-utils/v2 v2.0.1/go.mod h1:U5MTY10WwlquGPS34DOeomUGBB0gXbLueiq5Trwu0C4= github.com/alibabacloud-go/tea-utils/v2 v2.0.5/go.mod h1:dL6vbUT35E4F4bFTHL845eUloqaerYBYPsdWR2/jhe4= github.com/alibabacloud-go/tea-utils/v2 v2.0.6/go.mod h1:qxn986l+q33J5VkialKMqT/TTs3E+U9MJpd001iWQ9I= github.com/alibabacloud-go/tea-utils/v2 v2.0.7 h1:WDx5qW3Xa5ZgJ1c8NfqJkF6w+AU5wB8835UdhPr6Ax0= @@ -142,6 +148,8 @@ github.com/gorilla/websocket v1.5.0 h1:PPwGk2jz7EePpoHN/+ClbZu8SPxiqlu12wZP/3sWm github.com/gorilla/websocket v1.5.0/go.mod h1:YR8l580nyteQvAITg2hZ9XVh4b55+EU/adAjf1fMHhE= github.com/jmoiron/sqlx v1.4.0 h1:1PLqN7S1UYp5t4SrVVnt4nUVNemrDAtxlulVe+Qgm3o= github.com/jmoiron/sqlx v1.4.0/go.mod h1:ZrZ7UsYB/weZdl2Bxg6jCRO9c3YHl8r3ahlKmRT4JLY= +github.com/jonboulle/clockwork v0.5.0 h1:Hyh9A8u51kptdkR+cqRpT1EebBwTn1oK9YfGYbdFz6I= +github.com/jonboulle/clockwork v0.5.0/go.mod h1:3mZlmanh0g2NDKO5TWZVJAfofYk64M7XN3SzBPjZF60= github.com/json-iterator/go v1.1.10/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4= github.com/json-iterator/go v1.1.12 h1:PV8peI4a0ysnczrg+LtxykD8LfKY9ML6u2jnxaEnrnM= github.com/json-iterator/go v1.1.12/go.mod h1:e30LSqwooZae/UwlEbR2852Gd8hjQvJoHmT4TnhNGBo= @@ -159,6 +167,8 @@ github.com/larksuite/oapi-sdk-go/v3 v3.4.9 h1:ZzsPtdF2tsLbocQdKLNFwFCzWfwmKtD4kb github.com/larksuite/oapi-sdk-go/v3 v3.4.9/go.mod h1:ZEplY+kwuIrj/nqw5uSCINNATcH3KdxSN7y+UxYY5fI= github.com/leodido/go-urn v1.4.0 h1:WT9HwE9SGECu3lg4d/dIA+jxlljEa1/ffXKmRjqdmIQ= github.com/leodido/go-urn v1.4.0/go.mod h1:bvxc+MVxLKB4z00jd1z+Dvzr47oO32F/QSNjSBOlFxI= +github.com/lestrrat-go/envload v0.0.0-20180220234015-a3eb8ddeffcc h1:RKf14vYWi2ttpEmkA4aQ3j4u9dStX2t4M8UM6qqNsG8= +github.com/lestrrat-go/envload v0.0.0-20180220234015-a3eb8ddeffcc/go.mod h1:kopuH9ugFRkIXf3YoqHKyrJ9YfUFsckUU9S7B+XP+is= github.com/lestrrat-go/file-rotatelogs v2.4.0+incompatible h1:Y6sqxHMyB1D2YSzWkLibYKgg+SwmyFU9dF2hn6MdTj4= github.com/lestrrat-go/file-rotatelogs v2.4.0+incompatible/go.mod h1:ZQnN8lSECaebrkQytbHj4xNgtg8CR7RYXnPok8e0EHA= github.com/lestrrat-go/strftime v1.1.1 h1:zgf8QCsgj27GlKBy3SU9/8MMgegZ8UCzlCyHYrUF0QU= @@ -211,9 +221,9 @@ github.com/stretchr/testify v1.7.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/ github.com/stretchr/testify v1.8.0/go.mod h1:yNjHg4UonilssWZ8iaSj1OCr/vHnekPRkoO+kdMU+MU= github.com/stretchr/testify v1.8.1/go.mod h1:w2LPCIKwWwSfY2zedu0+kehJoqGctiVI29o6fzry7u4= github.com/stretchr/testify v1.8.4/go.mod h1:sz/lmYIOXD/1dqDmKjjqLyZ2RngseejIcXlSw2iwfAo= -github.com/stretchr/testify v1.9.0 h1:HtqpIVDClZ4nwg75+f6Lvsy/wHu+3BoSGCbBAcpTsTg= github.com/stretchr/testify v1.9.0/go.mod h1:r2ic/lqez/lEtzL7wO/rwa5dbSLXVDPFyf8C91i36aY= github.com/stretchr/testify v1.11.1 h1:7s2iGBzp5EwR7/aIZr8ao5+dra3wiQyKjjFuvgVKu7U= +github.com/stretchr/testify v1.11.1/go.mod h1:wZwfW3scLgRK+23gO65QZefKpKQRnfz6sD981Nm4B6U= github.com/tiendc/go-deepcopy v1.7.1 h1:LnubftI6nYaaMOcaz0LphzwraqN8jiWTwm416sitff4= github.com/tiendc/go-deepcopy v1.7.1/go.mod h1:4bKjNC2r7boYOkD2IOuZpYjmlDdzjbpTRyCx+goBCJQ= github.com/tjfoc/gmsm v1.3.2/go.mod h1:HaUcFuY0auTiaHB9MHFGCPx5IaLhTUd2atbCFBQXn9w= @@ -251,11 +261,12 @@ golang.org/x/crypto v0.18.0/go.mod h1:R0j02AL6hcrfOiy9T4ZYp/rcWeMxM3L6QYxlOuEG1m golang.org/x/crypto v0.19.0/go.mod h1:Iy9bg/ha4yyC70EfRS8jz+B6ybOBKMaSxLj6P6oBDfU= golang.org/x/crypto v0.21.0/go.mod h1:0BP7YvVV9gBbVKyeTG0Gyn+gZm94bibOW5BjDEYAOMs= golang.org/x/crypto v0.23.0/go.mod h1:CKFgDieR+mRhux2Lsu27y0fO304Db0wZe70UKqHu0v8= -golang.org/x/crypto v0.24.0 h1:mnl8DM0o513X8fdIkmyFE/5hTYxbwYOjDS/+rK6qpRI= golang.org/x/crypto v0.24.0/go.mod h1:Z1PMYSOR5nyMcyAVAIQSKCDwalqy85Aqn1x3Ws4L5DM= golang.org/x/crypto v0.43.0 h1:dduJYIi3A3KOfdGOHX8AVZ/jGiyPa3IbBozJ5kNuE04= golang.org/x/crypto v0.43.0/go.mod h1:BFbav4mRNlXJL4wNeejLpWxB7wMbc79PdRGhWKncxR0= golang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= +golang.org/x/image v0.25.0 h1:Y6uW6rH1y5y/LK1J8BPWZtr6yZ7hrsy6hFrXjgsc2fQ= +golang.org/x/image v0.25.0/go.mod h1:tCAmOEGthTtkalusGp1g3xa2gke8J6c2N565dTyl9Rs= golang.org/x/lint v0.0.0-20181026193005-c67002cb31c3/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE= golang.org/x/lint v0.0.0-20190227174305-5b3e6a55c961/go.mod h1:wehouNa3lNwaWXcvxsM5YxQ5yQlVC4a0KAMCusXpPoU= golang.org/x/lint v0.0.0-20190313153728-d0100b6bd8b3/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc= @@ -287,7 +298,6 @@ golang.org/x/net v0.20.0/go.mod h1:z8BVo6PvndSri0LbOE3hAn0apkU+1YvI6E70E9jsnvY= golang.org/x/net v0.21.0/go.mod h1:bIjVDfnllIU7BJ2DNgfnXvpSvtn8VRwhlsaeUTyUS44= golang.org/x/net v0.23.0/go.mod h1:JKghWKKOSdJwpW2GEx0Ja7fmaKnMsbu+MWVZTokSYmg= golang.org/x/net v0.25.0/go.mod h1:JkAGAh7GEvH74S6FOH42FLoXpXbE/aqXSrIQjXgsiwM= -golang.org/x/net v0.26.0 h1:soB7SVo0PWrY4vPW/+ay0jKDNScG2X9wFeYlXIvJsOQ= golang.org/x/net v0.26.0/go.mod h1:5YKkiSynbBIh3p6iOc/vibscux0x38BZDkn8sCUPxHE= golang.org/x/net v0.46.0 h1:giFlY12I07fugqwPuWJi68oOnpfqFnJIJzaIIm2JVV4= golang.org/x/net v0.46.0/go.mod h1:Q9BGdFy1y4nkUwiLvT5qtyhAnEHgnQ/zd8PfU6nc210= @@ -303,6 +313,8 @@ golang.org/x/sync v0.1.0/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.3.0/go.mod h1:FU7BRWz2tNW+3quACPkgCx/L+uEAv1htQ0V83Z9Rj+Y= golang.org/x/sync v0.6.0/go.mod h1:Czt+wKu1gCyEFDUtn0jG5QVvpJ6rzVqr5aXyt9drQfk= golang.org/x/sync v0.7.0/go.mod h1:Czt+wKu1gCyEFDUtn0jG5QVvpJ6rzVqr5aXyt9drQfk= +golang.org/x/sync v0.17.0 h1:l60nONMj9l5drqw6jlhIELNv9I0A4OFgRsG9k2oT9Ug= +golang.org/x/sync v0.17.0/go.mod h1:9KTHXmSnoGruLpwFjVSX0lNNA75CykiMECbovNTZqGI= golang.org/x/sys v0.0.0-20180830151530-49385e6e1522/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-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= @@ -322,7 +334,6 @@ golang.org/x/sys v0.16.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= golang.org/x/sys v0.17.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= golang.org/x/sys v0.18.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= golang.org/x/sys v0.20.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= -golang.org/x/sys v0.21.0 h1:rF+pYz3DAGSQAxAu1CbC7catZg4ebC4UIeIhKxBZvws= golang.org/x/sys v0.21.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= golang.org/x/sys v0.37.0 h1:fdNQudmxPjkdUTPnLn5mdQv7Zwvbvpaxqs831goi9kQ= golang.org/x/sys v0.37.0/go.mod h1:OgkHotnGiDImocRcuBABYBEXf8A9a87e/uXjp9XT3ks= @@ -337,9 +348,9 @@ golang.org/x/term v0.16.0/go.mod h1:yn7UURbUtPyrVJPGPq404EukNFxcm/foM+bV/bfcDsY= golang.org/x/term v0.17.0/go.mod h1:lLRBjIVuehSbZlaOtGMbcMncT+aqLLLmKrsjNrUguwk= golang.org/x/term v0.18.0/go.mod h1:ILwASektA3OnRv7amZ1xhE/KTR+u50pbXfZ03+6Nx58= golang.org/x/term v0.20.0/go.mod h1:8UkIAJTvZgivsXaD6/pH6U9ecQzZ45awqEOzuCvwpFY= -golang.org/x/term v0.21.0 h1:WVXCp+/EBEHOj53Rvu+7KiT/iElMrO8ACK16SMZ3jaA= golang.org/x/term v0.21.0/go.mod h1:ooXLefLobQVslOqselCNF4SxFAaoS6KujMbsGzSDmX0= golang.org/x/term v0.36.0 h1:zMPR+aF8gfksFprF/Nc/rd1wRS1EI6nDBGyWAvDzx2Q= +golang.org/x/term v0.36.0/go.mod h1:Qu394IJq6V6dCBRgwqshf3mPF85AqzYEzofzRdZkWss= golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= golang.org/x/text v0.3.2/go.mod h1:bEr9sfX3Q8Zfm5fL9x+3itogRgK3+ptLWKqgva+5dAk= golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= @@ -349,7 +360,6 @@ golang.org/x/text v0.9.0/go.mod h1:e1OnstbJyHTd6l/uOt8jFFHp6TRDWZR/bV3emEE/zU8= golang.org/x/text v0.13.0/go.mod h1:TvPlkZtksWOMsz7fbANvkp4WM8x/WCo/om8BMLbz+aE= golang.org/x/text v0.14.0/go.mod h1:18ZOQIKpY8NJVqYksKHtTdi31H5itFRjB5/qKTNYzSU= golang.org/x/text v0.15.0/go.mod h1:18ZOQIKpY8NJVqYksKHtTdi31H5itFRjB5/qKTNYzSU= -golang.org/x/text v0.16.0 h1:a94ExnEXNtEwYLGJSIUxnWoxoRz/ZcCsV63ROupILh4= golang.org/x/text v0.16.0/go.mod h1:GhwF1Be+LQoKShO3cGOHzqOgRrGaYc9AvblQOmPVHnI= golang.org/x/text v0.30.0 h1:yznKA/E9zq54KzlzBEAWn1NXSQ8DIp/NYMy88xJjl4k= golang.org/x/text v0.30.0/go.mod h1:yDdHFIX9t+tORqspjENWgzaCVXgk0yYnYuSZ8UzzBVM= diff --git a/main.go b/main.go index f8aa73e..cbc5d14 100644 --- a/main.go +++ b/main.go @@ -67,6 +67,15 @@ func init() { } func main() { + defer func() { + if err := recover(); err != nil { + log.Printf("Recovered from panic: %v", err) + // 这里可以添加更多的错误 handling 逻辑,比如发送通知等 + // 重新启动服务器 + fmt.Print("Restarting server...") + os.Exit(1) + } + }() r := gin.Default() loginApi := r.Group("/api/auth") { @@ -138,6 +147,10 @@ func main() { api.POST("language/delete", controller.LanguageDelete) } + scripts := r.Group("/api/scripts", middleware.ValidateToken()) + { + scripts.POST("/copywriting", controller.Copywriting) // 下载文案文件 + } go util.ScheduleDailyTask() go server.Server() go model.InitToken() // 初始化 Token 列表 diff --git a/model/User.go b/model/User.go index d432ed0..d2ac678 100644 --- a/model/User.go +++ b/model/User.go @@ -13,7 +13,7 @@ func GetUserList(AppId, ServerId, PageSize, CurrentPage, Uid, StartTime, EndTime } db := util.MPool.GetMysqlDB(App, ServerId) defer db.Close() - if db.DB == nil { + if db == nil || db.DB == nil { return nil, 0, fmt.Errorf("failed to get MySQL database") } users := []*User{} @@ -54,6 +54,9 @@ func UserDetail(Uid, Node int) (map[string]interface{}, error) { Uid: int64(Uid), } AppId := Uid / 100000000 + if AppId != 1 { + Node = 1 + } ws, err := util.GetWebsocket(AppId, Node) if err != nil { return nil, fmt.Errorf("failed to get websocket: %v", err) @@ -80,7 +83,7 @@ func UserGM(AppId, ServerId, Uid int, Command string) (interface{}, error) { node := 0 err = db.Get(&node, "SELECT `node` FROM t_player_baseinfo WHERE dwUin = ? ", Uid) //TODO 兼容处理 - if AppId == 2 { + if AppId != 1 { node = 1 } ws, err := util.GetWebsocket(AppId, node) diff --git a/unit_test.go b/unit_test.go index 6186f63..ab098c9 100644 --- a/unit_test.go +++ b/unit_test.go @@ -2,6 +2,7 @@ package main import ( "backend/Type" + "backend/alibaba" "backend/feishu" "backend/model" "backend/sdk/ship/model/tuyou" @@ -95,3 +96,9 @@ func TestDecrypt(t *testing.T) { dec, _ := util.Decrypt("pUf9tft9GOPjV1z855Jf2DpB5NUpGEc_") fmt.Printf("enc:%s\ndec:%s\n", enc, dec) } + +func TestAlibaba(t *testing.T) { + //err := alibaba.CreateSpace() + version := alibaba.DownloadFile() + fmt.Println("version:", version) +} diff --git a/util/login.go b/util/login.go index 12997bd..4fb8904 100644 --- a/util/login.go +++ b/util/login.go @@ -28,7 +28,9 @@ func LoginResponse(c *gin.Context, AppId, AreaCode int, Version string) { func GetUserInfo(AppId, AreaCode int, Uid, Version string) (int, string, int) { lockUid(Uid) defer unlockUid(Uid) - + if AppId == 0 { + return 3562, "ga-bp10efkfr8mgzei6d9obf.aliyunga0019.com", 1 + } Db := MPool.GetGameDB() defer Db.Close() var ServerId int @@ -43,6 +45,7 @@ func GetUserInfo(AppId, AreaCode int, Uid, Version string) (int, string, int) { if AppId == 5 { return 3601, "192.168.6.195", 1 } + appConf, _ := GetAppConfig(AppId) PlayerDb := MPool.GetMysqlDB(appConf, 1) var node int diff --git a/util/util.go b/util/util.go index d837c4a..eeacaa8 100644 --- a/util/util.go +++ b/util/util.go @@ -522,6 +522,11 @@ func LoginSuccess(c *gin.Context, message string, Port int, Host string, ServerI }) } +func GetChessURL(ChessId string) string { + key := fmt.Sprintf("UI_MergeData_%s", ChessId) + return GetLanguageImageURL(key) +} + func GetLanguageImageURL(key string) string { // 检查是否符合 UI_MergeData_ 格式 re := regexp.MustCompile(`^UI_MergeData_(\d+)$`) @@ -543,6 +548,7 @@ func GetLanguageImageURL(key string) string { } } if iconStr != "" { + // baseDir := `D:\Github\AplusB_Pet_nation\Assets\GameMain\UI\UISprites\MergeObj` baseDir := `/data/AplusB_Pet_nation/Assets/GameMain/UI/UISprites/MergeObj` if fi, err := os.Stat(baseDir); err == nil && fi.IsDir() { var found string diff --git a/util/websocket.go b/util/websocket.go index 26b0bf8..f9bba2f 100644 --- a/util/websocket.go +++ b/util/websocket.go @@ -20,7 +20,11 @@ func GetWebsocket(AppId, ServerId int) (*websocket.Conn, error) { } origin := "http://localhost/" + if AppId == 0 { + Server.Host = "google.bywaystudios.com" + } url := fmt.Sprintf("ws://%s:%d/", Server.Host, App.WsPort+ServerId) + config, err := websocket.NewConfig(url, origin) if err != nil { return nil, fmt.Errorf("failed to create websocket config: %v", err)