mirror of
https://github.com/coaidev/coai.git
synced 2025-05-19 13:00:14 +09:00
feat: update deeptrain mode
This commit is contained in:
parent
0bc356c4b6
commit
aa627fb61d
@ -8,7 +8,7 @@
|
|||||||
},
|
},
|
||||||
"package": {
|
"package": {
|
||||||
"productName": "chatnio",
|
"productName": "chatnio",
|
||||||
"version": "3.7.8"
|
"version": "3.8.0"
|
||||||
},
|
},
|
||||||
"tauri": {
|
"tauri": {
|
||||||
"allowlist": {
|
"allowlist": {
|
||||||
|
@ -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);
|
||||||
|
@ -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)。"
|
||||||
|
@ -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": {
|
||||||
|
@ -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": {
|
||||||
|
@ -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": {
|
||||||
|
@ -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}>
|
||||||
|
@ -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")
|
||||||
|
@ -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",
|
||||||
|
@ -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,
|
||||||
|
@ -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
|
||||||
|
@ -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",
|
||||||
|
@ -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},
|
||||||
|
Loading…
Reference in New Issue
Block a user