Files
2026-07-25 14:59:56 +08:00

173 lines
4.0 KiB
Go
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
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
皮肤:暗星
绝密KD0.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
}