feat: update deeptrain mode

This commit is contained in:
Zhang Minghan 2023-12-23 20:14:14 +08:00
parent 0bc356c4b6
commit aa627fb61d
13 changed files with 49 additions and 9 deletions

View File

@ -8,7 +8,7 @@
}, },
"package": { "package": {
"productName": "chatnio", "productName": "chatnio",
"version": "3.7.8" "version": "3.8.0"
}, },
"tauri": { "tauri": {
"allowlist": { "allowlist": {

View File

@ -12,7 +12,7 @@ import { getMemory } from "@/utils/memory.ts";
import { Compass, Image, Newspaper } from "lucide-react"; import { Compass, Image, Newspaper } from "lucide-react";
import React from "react"; import React from "react";
export const version = "3.7.8"; export const version = "3.8.0";
export const dev: boolean = getDev(); export const dev: boolean = getDev();
export const deploy: boolean = true; export const deploy: boolean = true;
export let rest_api: string = getRestApi(deploy); export let rest_api: string = getRestApi(deploy);

View File

@ -453,6 +453,7 @@
"mailPort": "SMTP 端口", "mailPort": "SMTP 端口",
"mailUser": "用户名", "mailUser": "用户名",
"mailPass": "密码", "mailPass": "密码",
"mailFrom": "发件人",
"searchEndpoint": "搜索接入点", "searchEndpoint": "搜索接入点",
"searchQuery": "最大搜索结果数", "searchQuery": "最大搜索结果数",
"searchTip": "DuckDuckGo 搜索接入点,如不填写自动使用 WebPilot 和 New Bing 逆向进行搜索功能。\\nDuckDuckGo API 项目搭建:[duckduckgo-api](https://github.com/binjie09/duckduckgo-api)。" "searchTip": "DuckDuckGo 搜索接入点,如不填写自动使用 WebPilot 和 New Bing 逆向进行搜索功能。\\nDuckDuckGo API 项目搭建:[duckduckgo-api](https://github.com/binjie09/duckduckgo-api)。"

View File

@ -416,7 +416,8 @@
"mailPass": "Password", "mailPass": "Password",
"searchEndpoint": "Search Endpoint", "searchEndpoint": "Search Endpoint",
"searchQuery": "Max Search Results", "searchQuery": "Max Search Results",
"searchTip": "DuckDuckGo search endpoint, if not filled in, use WebPilot and New Bing reverse search function by default.\nDuckDuckGo API project build: [duckduckgo-api](https://github.com/binjie09/duckduckgo-api)." "searchTip": "DuckDuckGo search endpoint, if not filled in, use WebPilot and New Bing reverse search function by default.\nDuckDuckGo API project build: [duckduckgo-api](https://github.com/binjie09/duckduckgo-api).",
"mailFrom": "Sender"
} }
}, },
"mask": { "mask": {

View File

@ -416,7 +416,8 @@
"mailPass": "パスワード", "mailPass": "パスワード",
"searchEndpoint": "アクセスポイントを検索", "searchEndpoint": "アクセスポイントを検索",
"searchQuery": "検索結果の最大数", "searchQuery": "検索結果の最大数",
"searchTip": "DuckDuckGoは、入力せずにWebPilotやNew Bing Reverse Searchなどのアクセスポイントを自動的に検索します。\\ nDuckDuckGo APIプロジェクトビルド[ duckduckgo - api ] https://github.com/binjie09/duckduckgo-api )。" "searchTip": "DuckDuckGoは、入力せずにWebPilotやNew Bing Reverse Searchなどのアクセスポイントを自動的に検索します。\\ nDuckDuckGo APIプロジェクトビルド[ duckduckgo - api ] https://github.com/binjie09/duckduckgo-api )。",
"mailFrom": "発信元"
} }
}, },
"mask": { "mask": {

View File

@ -416,7 +416,8 @@
"mailPass": "Пароль", "mailPass": "Пароль",
"searchEndpoint": "Конечная точка поиска", "searchEndpoint": "Конечная точка поиска",
"searchQuery": "Максимальное количество результатов поиска", "searchQuery": "Максимальное количество результатов поиска",
"searchTip": "Конечная точка поиска DuckDuckGo, если она не заполнена, по умолчанию используется функция обратного поиска WebPilot и New Bing.\nСборка проекта DuckDuckGo API: [duckduckgo-api](https://github.com/binjie09/duckduckgo-api)." "searchTip": "Конечная точка поиска DuckDuckGo, если она не заполнена, по умолчанию используется функция обратного поиска WebPilot и New Bing.\nСборка проекта DuckDuckGo API: [duckduckgo-api](https://github.com/binjie09/duckduckgo-api).",
"mailFrom": "От"
} }
}, },
"mask": { "mask": {

View File

@ -130,6 +130,19 @@ function Mail({ data, dispatch, onChange }: CompProps<MailState>) {
placeholder={t("admin.system.mailPass")} placeholder={t("admin.system.mailPass")}
/> />
</ParagraphItem> </ParagraphItem>
<ParagraphItem>
<Label>{t("admin.system.mailFrom")}</Label>
<Input
value={data.from}
onChange={(e) =>
dispatch({
type: "update:mail.from",
value: e.target.value,
})
}
placeholder={`bot@${location.host}`}
/>
</ParagraphItem>
<ParagraphFooter> <ParagraphFooter>
<div className={`grow`} /> <div className={`grow`} />
<Button size={`sm`} loading={true} onClick={onChange}> <Button size={`sm`} loading={true} onClick={onChange}>

View File

@ -54,7 +54,11 @@ func ParseApiKey(c *gin.Context, key string) *User {
return &user return &user
} }
func Login(c *gin.Context, token string) (string, error) { func DeepLogin(c *gin.Context, token string) (string, error) {
if !useDeeptrain() {
return "", errors.New("deeptrain feature is disabled")
}
user := Validate(token) user := Validate(token)
if user == nil { if user == nil {
return "", errors.New("cannot validate access token") return "", errors.New("cannot validate access token")

View File

@ -16,6 +16,10 @@ func getDeeptrainApi(path string) string {
return viper.GetString("auth.endpoint") + path return viper.GetString("auth.endpoint") + path
} }
func useDeeptrain() bool {
return viper.GetBool("auth.use_deeptrain")
}
func Validate(token string) *ValidateUserResponse { func Validate(token string) *ValidateUserResponse {
res, err := utils.Post(getDeeptrainApi("/app/validate"), map[string]string{ res, err := utils.Post(getDeeptrainApi("/app/validate"), map[string]string{
"Content-Type": "application/json", "Content-Type": "application/json",

View File

@ -7,7 +7,7 @@ import (
"strings" "strings"
) )
type LoginForm struct { type DeepLoginForm struct {
Token string `form:"token" binding:"required"` Token string `form:"token" binding:"required"`
} }
@ -112,7 +112,7 @@ func RequireEnterprise(c *gin.Context) *User {
} }
func LoginAPI(c *gin.Context) { func LoginAPI(c *gin.Context) {
var form LoginForm var form DeepLoginForm
if err := c.ShouldBind(&form); err != nil { if err := c.ShouldBind(&form); err != nil {
c.JSON(http.StatusOK, gin.H{ c.JSON(http.StatusOK, gin.H{
"status": false, "status": false,
@ -121,7 +121,7 @@ func LoginAPI(c *gin.Context) {
return return
} }
token, err := Login(c, form.Token) token, err := DeepLogin(c, form.Token)
if err != nil { if err != nil {
c.JSON(http.StatusOK, gin.H{ c.JSON(http.StatusOK, gin.H{
"status": false, "status": false,

View File

@ -59,6 +59,10 @@ func NewTeenagerPackage(db *sql.DB, user *User) bool {
} }
func RefreshPackage(db *sql.DB, user *User) *GiftResponse { func RefreshPackage(db *sql.DB, user *User) *GiftResponse {
if !useDeeptrain() {
return nil
}
resp := Cert(user.Username) resp := Cert(user.Username)
if resp == nil || resp.Status == false { if resp == nil || resp.Status == false {
return nil return nil

View File

@ -24,6 +24,10 @@ func GenerateOrder() string {
} }
func GetBalance(username string) float32 { func GetBalance(username string) float32 {
if !useDeeptrain() {
return 0.
}
order := GenerateOrder() order := GenerateOrder()
res, err := utils.Post(getDeeptrainApi("/app/balance"), map[string]string{ res, err := utils.Post(getDeeptrainApi("/app/balance"), map[string]string{
"Content-Type": "application/json", "Content-Type": "application/json",
@ -45,6 +49,10 @@ func GetBalance(username string) float32 {
} }
func Pay(username string, amount float32) bool { func Pay(username string, amount float32) bool {
if !useDeeptrain() {
return false
}
order := GenerateOrder() order := GenerateOrder()
res, err := utils.Post(getDeeptrainApi("/app/payment"), map[string]string{ res, err := utils.Post(getDeeptrainApi("/app/payment"), map[string]string{
"Content-Type": "application/json", "Content-Type": "application/json",

View File

@ -22,6 +22,9 @@ func (l *Limiter) RateLimit(client *redis.Client, ip string, path string) bool {
var limits = map[string]Limiter{ var limits = map[string]Limiter{
"/login": {Duration: 10, Count: 20}, "/login": {Duration: 10, Count: 20},
"/register": {Duration: 120, Count: 10},
"/verify": {Duration: 120, Count: 5},
"/reset": {Duration: 120, Count: 10},
"/apikey": {Duration: 1, Count: 2}, "/apikey": {Duration: 1, Count: 2},
"/package": {Duration: 1, Count: 2}, "/package": {Duration: 1, Count: 2},
"/quota": {Duration: 1, Count: 2}, "/quota": {Duration: 1, Count: 2},