sif: Import cards from csv file

This way is more easy

Signed-off-by: Yuan Si <do4suki@gmail.com>
This commit is contained in:
2024-02-01 15:41:53 +08:00
parent 4a72a3bfa7
commit 9603234e29
3 changed files with 53 additions and 48 deletions
+36 -12
View File
@@ -1,11 +1,12 @@
package handler package handler
import ( import (
"encoding/json" "encoding/csv"
"honoka-chan/model" "honoka-chan/model"
"honoka-chan/utils"
"net/http" "net/http"
"os"
"path" "path"
"strconv"
"time" "time"
"github.com/forgoer/openssl" "github.com/forgoer/openssl"
@@ -78,10 +79,6 @@ func Upload(ctx *gin.Context) {
err = ctx.SaveUploadedFile(file, tmpPath) err = ctx.SaveUploadedFile(file, tmpPath)
CheckErr(err) CheckErr(err)
data := model.Data{}
err = json.Unmarshal([]byte(utils.ReadAllText(tmpPath)), &data)
CheckErr(err)
session := UserEng.NewSession() session := UserEng.NewSession()
defer session.Close() defer session.Close()
if err = session.Begin(); err != nil { if err = session.Begin(); err != nil {
@@ -89,13 +86,34 @@ func Upload(ctx *gin.Context) {
panic(err) panic(err)
} }
for _, team := range data.Team { f, err := os.Open(tmpPath)
if team.Cardid == 0 { CheckErr(err)
continue defer f.Close()
r := csv.NewReader(f)
rs, err := r.ReadAll()
if err != nil {
session.Rollback()
ctx.JSON(http.StatusOK, ErrMsg{Error: 1, Msg: "文件解析失败!"})
return
} }
for _, rr := range rs {
if len(rr) != 2 || rr[0] == "" || rr[1] == "" {
session.Rollback()
ctx.JSON(http.StatusOK, ErrMsg{Error: 1, Msg: "文件解析失败!"})
return
}
skillLv, err := strconv.Atoi(rr[1])
if err != nil {
session.Rollback()
ctx.JSON(http.StatusOK, ErrMsg{Error: 1, Msg: "文件解析失败!"})
return
}
var unitId, unitExp, unitRarity, unitHp, unitSigned int var unitId, unitExp, unitRarity, unitHp, unitSigned int
exists, err := MainEng.Table("common_unit_m").Join("LEFT", "unit_m", "common_unit_m.unit_id = unit_m.unit_id"). exists, err := MainEng.Table("common_unit_m").Join("LEFT", "unit_m", "common_unit_m.unit_id = unit_m.unit_id").
Where("unit_m.unit_number = ?", team.Cardid). Where("unit_m.unit_number = ?", rr[0]).
Cols("common_unit_m.unit_id,common_unit_m.exp,unit_m.rarity,common_unit_m.max_hp,common_unit_m.is_signed"). Cols("common_unit_m.unit_id,common_unit_m.exp,unit_m.rarity,common_unit_m.max_hp,common_unit_m.is_signed").
Get(&unitId, &unitExp, &unitRarity, &unitHp, &unitSigned) Get(&unitId, &unitExp, &unitRarity, &unitHp, &unitSigned)
CheckErr(err) CheckErr(err)
@@ -112,6 +130,12 @@ func Upload(ctx *gin.Context) {
return return
} }
if skillLv < 0 || skillLv > 8 {
session.Rollback()
ctx.JSON(http.StatusOK, ErrMsg{Error: 1, Msg: "技能等级设置有误!"})
return
}
var diffExp, diffSmile, diffPure, diffCool int var diffExp, diffSmile, diffPure, diffCool int
_, err = MainEng.Table("unit_level_limit_pattern_m").Where("unit_level_limit_id = 1 AND unit_level = 350"). _, err = MainEng.Table("unit_level_limit_pattern_m").Where("unit_level_limit_id = 1 AND unit_level = 350").
Cols("next_exp,smile_diff,pure_diff,cool_diff").Get(&diffExp, &diffSmile, &diffPure, &diffCool) Cols("next_exp,smile_diff,pure_diff,cool_diff").Get(&diffExp, &diffSmile, &diffPure, &diffCool)
@@ -123,7 +147,7 @@ func Upload(ctx *gin.Context) {
} }
var skillExp int var skillExp int
if team.Skilllevel != 8 { if skillLv != 8 {
skillExp = 0 skillExp = 0
} else { } else {
skillExp = 29900 skillExp = 29900
@@ -142,7 +166,7 @@ func Upload(ctx *gin.Context) {
Love: 1000, Love: 1000,
MaxLove: 1000, MaxLove: 1000,
UnitSkillExp: skillExp, UnitSkillExp: skillExp,
UnitSkillLevel: team.Skilllevel, UnitSkillLevel: skillLv,
MaxHp: unitHp, MaxHp: unitHp,
UnitRemovableSkillCapacity: 8, UnitRemovableSkillCapacity: 8,
FavoriteFlag: false, FavoriteFlag: false,
-29
View File
@@ -1,29 +0,0 @@
package model
// Data ...
type Data struct {
Version int `json:"version"`
Team []Team `json:"team"`
Gemstock any `json:"gemstock"`
Submember []any `json:"submember"`
}
// Accessory ...
type Accessory struct {
ID string `json:"id"`
Level int `json:"level"`
}
// Team ...
type Team struct {
Hp int `json:"hp"`
Smile int `json:"smile"`
Pure int `json:"pure"`
Cool int `json:"cool"`
Skilllevel int `json:"skilllevel"`
Gemlist []string `json:"gemlist"`
Cardid int `json:"cardid"`
Mezame int `json:"mezame"`
Maxcost int `json:"maxcost"`
Accessory Accessory `json:"accessory,omitempty"`
}
+17 -7
View File
@@ -7,6 +7,12 @@
<meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=1"> <meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=1">
<title>SIF 小助手</title> <title>SIF 小助手</title>
{{ template "admin/nav/css.html" . }} {{ template "admin/nav/css.html" . }}
<style>
li {
list-style-type: decimal !important;
margin-left: 10px;
}
</style>
</head> </head>
<body> <body>
@@ -15,7 +21,7 @@
{{ template "admin/nav/side.html" . }} {{ template "admin/nav/side.html" . }}
<div class="layui-body"> <div class="layui-body">
<form class="layui-form layui-col-md4" action=""> <form class="layui-form layui-col-md6" action="">
<div class="layui-form-item"> <div class="layui-form-item">
<label class="layui-form-label">文件</label> <label class="layui-form-label">文件</label>
<div class="layui-input-block"> <div class="layui-input-block">
@@ -27,13 +33,18 @@
<div class="layui-input-block"> <div class="layui-input-block">
<div class="layui-collapse"> <div class="layui-collapse">
<div class="layui-colla-item"> <div class="layui-colla-item">
<h2 class="layui-colla-title">帮助</h2> <h2 class="layui-colla-title">使用帮助</h2>
<div class="layui-colla-content"> <div class="layui-colla-content">
<ol> <ol>
<li>仅支持导入LLHelper队伍信息</li> <li><a href="https://card.niconi.co.ni/" target="_blank">LLSIF
<li>仅需要设置技能等级,卡片默认等级MAX,宝石请在游戏内设置</li> 查卡器</a> 查询需要导入的卡片 ID,卡片信息上的 No.xxx 数字。
<li>仅支持导入UR卡片</li> </li>
<li>仅支持导入国服拥有的卡片</li> <li>使用任意文本编辑器创建一个 .txt 文件,按照<b>卡片 ID,技能等级</b>的格式(例如 SDS 果,技能 8 级则填入
3885,8)填入需要导入的卡片,每张卡片单独一行。</li>
<li>分隔符逗号为<b>半角 ,</b> 而非<b>全角 </b></li>
<li>仅需要设置技能等级,卡片默认等级MAX,宝石请在游戏内设置。</li>
<li>仅支持导入UR卡片。</li>
<li>仅支持导入国服拥有的卡片。</li>
</ol> </ol>
</div> </div>
</div> </div>
@@ -62,7 +73,6 @@
, url: '/admin/upload' // 此处配置你自己的上传接口即可 , url: '/admin/upload' // 此处配置你自己的上传接口即可
, auto: false , auto: false
, accept: 'file' // 普通文件 , accept: 'file' // 普通文件
, exts: 'sd' // 只允许上传 .sd 文件
, size: 50 // 限制文件大小,单位 KB , size: 50 // 限制文件大小,单位 KB
, bindAction: '#test9' , bindAction: '#test9'
, done: function (res) { , done: function (res) {