173 lines
4.0 KiB
Go
173 lines
4.0 KiB
Go
package main
|
||
|
||
import (
|
||
"context"
|
||
"encoding/json"
|
||
"fmt"
|
||
"os"
|
||
"strings"
|
||
"time"
|
||
|
||
"updata_hfb/internal/hfb"
|
||
)
|
||
|
||
const sampleText = `上号方式:QQ扫码
|
||
哈夫币纯币:156
|
||
段位:铂金
|
||
等级:60
|
||
保险格数:9
|
||
每日消耗:10
|
||
体力:7
|
||
负重:7
|
||
AWM子弹数量:80
|
||
6头数量:13
|
||
6甲数量:12
|
||
皮肤:暗星
|
||
绝密KD:0.2
|
||
押金:350
|
||
号主在线时间:11:00 至 00:00
|
||
封禁记录:无
|
||
常用地区:海南
|
||
回收比例:1:47.0
|
||
回收租金:332
|
||
联系电话:15203616450`
|
||
|
||
type App struct {
|
||
ctx context.Context
|
||
}
|
||
|
||
type DefaultSettings struct {
|
||
Server string `json:"server"`
|
||
Uploader string `json:"uploader"`
|
||
Secret string `json:"secret"`
|
||
Timeout string `json:"timeout"`
|
||
SourceChannel string `json:"sourceChannel"`
|
||
}
|
||
|
||
type UploadForm struct {
|
||
Server string `json:"server"`
|
||
Uploader string `json:"uploader"`
|
||
Secret string `json:"secret"`
|
||
Timeout string `json:"timeout"`
|
||
SourceChannel string `json:"sourceChannel"`
|
||
Data string `json:"data"`
|
||
}
|
||
|
||
func NewApp() *App {
|
||
return &App{}
|
||
}
|
||
|
||
func (a *App) startup(ctx context.Context) {
|
||
a.ctx = ctx
|
||
}
|
||
|
||
func (a *App) DefaultSettings() DefaultSettings {
|
||
return DefaultSettings{
|
||
Server: envDefault("HFB_SERVER", "http://127.0.0.1:8080"),
|
||
Uploader: strings.TrimSpace(os.Getenv("HFB_UPLOADER_NAME")),
|
||
Secret: strings.TrimSpace(os.Getenv("HFB_UPLOAD_SECRET")),
|
||
Timeout: "15s",
|
||
SourceChannel: strings.TrimSpace(os.Getenv("HFB_SOURCE_CHANNEL")),
|
||
}
|
||
}
|
||
|
||
func (a *App) SampleText() string {
|
||
return sampleText
|
||
}
|
||
|
||
func (a *App) Preview(form UploadForm) (string, error) {
|
||
req, err := buildUploadRequest(form)
|
||
if err != nil {
|
||
return "", err
|
||
}
|
||
out, err := hfb.MarshalPretty(req)
|
||
if err != nil {
|
||
return "", fmt.Errorf("生成 JSON 失败:%w", err)
|
||
}
|
||
return string(out), nil
|
||
}
|
||
|
||
func (a *App) Upload(form UploadForm) (string, error) {
|
||
timeout, err := parseTimeout(form.Timeout)
|
||
if err != nil {
|
||
return "", err
|
||
}
|
||
req, err := buildUploadRequest(form)
|
||
if err != nil {
|
||
return "", err
|
||
}
|
||
ctx := a.ctx
|
||
if ctx == nil {
|
||
ctx = context.Background()
|
||
}
|
||
ctx, cancel := context.WithTimeout(ctx, timeout)
|
||
defer cancel()
|
||
resp, err := hfb.Client{
|
||
Server: strings.TrimSpace(form.Server),
|
||
Secret: strings.TrimSpace(form.Secret),
|
||
Timeout: timeout,
|
||
}.Upload(ctx, req)
|
||
if err != nil {
|
||
return "", err
|
||
}
|
||
return formatDisplayJSON(resp), nil
|
||
}
|
||
|
||
func buildUploadRequest(form UploadForm) (hfb.ExternalUploadRequest, error) {
|
||
if strings.TrimSpace(form.Data) == "" {
|
||
return hfb.ExternalUploadRequest{}, fmt.Errorf("账号数据不能为空")
|
||
}
|
||
parsed, err := hfb.ParseUploadText(form.Data)
|
||
if err != nil {
|
||
return hfb.ExternalUploadRequest{}, err
|
||
}
|
||
uploaderName := strings.TrimSpace(form.Uploader)
|
||
if uploaderName == "" {
|
||
uploaderName = parsed.UploaderName
|
||
}
|
||
if uploaderName == "" {
|
||
return hfb.ExternalUploadRequest{}, fmt.Errorf("缺少上传人名称:请展开“连接配置”填写上传人,或在文本中增加“上传人:姓名”")
|
||
}
|
||
sourceChannel := strings.TrimSpace(form.SourceChannel)
|
||
if sourceChannel == "" {
|
||
return hfb.ExternalUploadRequest{}, fmt.Errorf("请选择订单来源渠道")
|
||
}
|
||
return hfb.NewExternalUploadRequest(uploaderName, sourceChannel, parsed.Account, time.Now()), nil
|
||
}
|
||
|
||
func parseTimeout(raw string) (time.Duration, error) {
|
||
raw = strings.TrimSpace(raw)
|
||
if raw == "" {
|
||
raw = "15s"
|
||
}
|
||
timeout, err := time.ParseDuration(raw)
|
||
if err != nil || timeout <= 0 {
|
||
return 0, fmt.Errorf("请求超时时间不正确:%s", raw)
|
||
}
|
||
return timeout, nil
|
||
}
|
||
|
||
func formatDisplayJSON(text string) string {
|
||
text = strings.TrimSpace(text)
|
||
if text == "" {
|
||
return "服务器未返回内容"
|
||
}
|
||
var payload any
|
||
if err := json.Unmarshal([]byte(text), &payload); err != nil {
|
||
return text
|
||
}
|
||
pretty, err := json.MarshalIndent(payload, "", " ")
|
||
if err != nil {
|
||
return text
|
||
}
|
||
return string(pretty)
|
||
}
|
||
|
||
func envDefault(key string, fallback string) string {
|
||
value := strings.TrimSpace(os.Getenv(key))
|
||
if value == "" {
|
||
return fallback
|
||
}
|
||
return value
|
||
}
|