sif: Import cards from csv file
This way is more easy Signed-off-by: Yuan Si <do4suki@gmail.com>
This commit is contained in:
+36
-12
@@ -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,
|
||||||
|
|||||||
@@ -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"`
|
|
||||||
}
|
|
||||||
@@ -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) {
|
||||||
|
|||||||
Reference in New Issue
Block a user