2023-04-22 12:39:27 +00:00
|
|
|
package model
|
|
|
|
|
|
|
|
import (
|
2023-04-22 13:14:09 +00:00
|
|
|
"one-api/common"
|
2023-04-22 12:39:27 +00:00
|
|
|
"strconv"
|
|
|
|
"strings"
|
2023-05-18 04:48:20 +00:00
|
|
|
"time"
|
2023-04-22 12:39:27 +00:00
|
|
|
)
|
|
|
|
|
|
|
|
type Option struct {
|
|
|
|
Key string `json:"key" gorm:"primaryKey"`
|
|
|
|
Value string `json:"value"`
|
|
|
|
}
|
|
|
|
|
|
|
|
func AllOption() ([]*Option, error) {
|
|
|
|
var options []*Option
|
|
|
|
var err error
|
|
|
|
err = DB.Find(&options).Error
|
|
|
|
return options, err
|
|
|
|
}
|
|
|
|
|
|
|
|
func InitOptionMap() {
|
|
|
|
common.OptionMapRWMutex.Lock()
|
|
|
|
common.OptionMap = make(map[string]string)
|
|
|
|
common.OptionMap["FileUploadPermission"] = strconv.Itoa(common.FileUploadPermission)
|
|
|
|
common.OptionMap["FileDownloadPermission"] = strconv.Itoa(common.FileDownloadPermission)
|
|
|
|
common.OptionMap["ImageUploadPermission"] = strconv.Itoa(common.ImageUploadPermission)
|
|
|
|
common.OptionMap["ImageDownloadPermission"] = strconv.Itoa(common.ImageDownloadPermission)
|
|
|
|
common.OptionMap["PasswordLoginEnabled"] = strconv.FormatBool(common.PasswordLoginEnabled)
|
|
|
|
common.OptionMap["PasswordRegisterEnabled"] = strconv.FormatBool(common.PasswordRegisterEnabled)
|
|
|
|
common.OptionMap["EmailVerificationEnabled"] = strconv.FormatBool(common.EmailVerificationEnabled)
|
|
|
|
common.OptionMap["GitHubOAuthEnabled"] = strconv.FormatBool(common.GitHubOAuthEnabled)
|
|
|
|
common.OptionMap["WeChatAuthEnabled"] = strconv.FormatBool(common.WeChatAuthEnabled)
|
|
|
|
common.OptionMap["TurnstileCheckEnabled"] = strconv.FormatBool(common.TurnstileCheckEnabled)
|
|
|
|
common.OptionMap["RegisterEnabled"] = strconv.FormatBool(common.RegisterEnabled)
|
2023-05-15 09:34:09 +00:00
|
|
|
common.OptionMap["AutomaticDisableChannelEnabled"] = strconv.FormatBool(common.AutomaticDisableChannelEnabled)
|
2023-06-15 08:32:16 +00:00
|
|
|
common.OptionMap["LogConsumeEnabled"] = strconv.FormatBool(common.LogConsumeEnabled)
|
2023-05-15 09:34:09 +00:00
|
|
|
common.OptionMap["ChannelDisableThreshold"] = strconv.FormatFloat(common.ChannelDisableThreshold, 'f', -1, 64)
|
2023-04-22 12:39:27 +00:00
|
|
|
common.OptionMap["SMTPServer"] = ""
|
2023-05-13 10:33:41 +00:00
|
|
|
common.OptionMap["SMTPFrom"] = ""
|
2023-05-12 03:44:38 +00:00
|
|
|
common.OptionMap["SMTPPort"] = strconv.Itoa(common.SMTPPort)
|
2023-04-22 12:39:27 +00:00
|
|
|
common.OptionMap["SMTPAccount"] = ""
|
|
|
|
common.OptionMap["SMTPToken"] = ""
|
|
|
|
common.OptionMap["Notice"] = ""
|
|
|
|
common.OptionMap["About"] = ""
|
2023-05-13 13:27:49 +00:00
|
|
|
common.OptionMap["HomePageContent"] = ""
|
2023-04-22 12:39:27 +00:00
|
|
|
common.OptionMap["Footer"] = common.Footer
|
2023-05-14 11:29:02 +00:00
|
|
|
common.OptionMap["SystemName"] = common.SystemName
|
|
|
|
common.OptionMap["Logo"] = common.Logo
|
2023-04-22 12:39:27 +00:00
|
|
|
common.OptionMap["ServerAddress"] = ""
|
|
|
|
common.OptionMap["GitHubClientId"] = ""
|
|
|
|
common.OptionMap["GitHubClientSecret"] = ""
|
|
|
|
common.OptionMap["WeChatServerAddress"] = ""
|
|
|
|
common.OptionMap["WeChatServerToken"] = ""
|
|
|
|
common.OptionMap["WeChatAccountQRCodeImageURL"] = ""
|
|
|
|
common.OptionMap["TurnstileSiteKey"] = ""
|
|
|
|
common.OptionMap["TurnstileSecretKey"] = ""
|
2023-04-26 13:40:56 +00:00
|
|
|
common.OptionMap["QuotaForNewUser"] = strconv.Itoa(common.QuotaForNewUser)
|
2023-05-16 02:04:39 +00:00
|
|
|
common.OptionMap["QuotaRemindThreshold"] = strconv.Itoa(common.QuotaRemindThreshold)
|
2023-05-16 05:57:01 +00:00
|
|
|
common.OptionMap["PreConsumedQuota"] = strconv.Itoa(common.PreConsumedQuota)
|
2023-05-11 12:59:35 +00:00
|
|
|
common.OptionMap["ModelRatio"] = common.ModelRatio2JSONString()
|
2023-06-11 03:08:16 +00:00
|
|
|
common.OptionMap["GroupRatio"] = common.GroupRatio2JSONString()
|
2023-04-27 08:32:21 +00:00
|
|
|
common.OptionMap["TopUpLink"] = common.TopUpLink
|
2023-04-22 12:39:27 +00:00
|
|
|
common.OptionMapRWMutex.Unlock()
|
2023-05-18 04:48:20 +00:00
|
|
|
loadOptionsFromDatabase()
|
|
|
|
}
|
|
|
|
|
|
|
|
func loadOptionsFromDatabase() {
|
2023-04-22 12:39:27 +00:00
|
|
|
options, _ := AllOption()
|
|
|
|
for _, option := range options {
|
2023-05-13 02:30:55 +00:00
|
|
|
err := updateOptionMap(option.Key, option.Value)
|
|
|
|
if err != nil {
|
|
|
|
common.SysError("Failed to update option map: " + err.Error())
|
|
|
|
}
|
2023-04-22 12:39:27 +00:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2023-05-18 04:48:20 +00:00
|
|
|
func SyncOptions(frequency int) {
|
|
|
|
for {
|
|
|
|
time.Sleep(time.Duration(frequency) * time.Second)
|
|
|
|
common.SysLog("Syncing options from database")
|
|
|
|
loadOptionsFromDatabase()
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2023-04-22 12:39:27 +00:00
|
|
|
func UpdateOption(key string, value string) error {
|
|
|
|
// Save to database first
|
|
|
|
option := Option{
|
|
|
|
Key: key,
|
|
|
|
}
|
|
|
|
// https://gorm.io/docs/update.html#Save-All-Fields
|
|
|
|
DB.FirstOrCreate(&option, Option{Key: key})
|
|
|
|
option.Value = value
|
|
|
|
// Save is a combination function.
|
|
|
|
// If save value does not contain primary key, it will execute Create,
|
|
|
|
// otherwise it will execute Update (with all fields).
|
|
|
|
DB.Save(&option)
|
|
|
|
// Update OptionMap
|
2023-05-13 02:30:55 +00:00
|
|
|
return updateOptionMap(key, value)
|
2023-04-22 12:39:27 +00:00
|
|
|
}
|
|
|
|
|
2023-05-11 12:59:35 +00:00
|
|
|
func updateOptionMap(key string, value string) (err error) {
|
2023-04-22 12:39:27 +00:00
|
|
|
common.OptionMapRWMutex.Lock()
|
|
|
|
defer common.OptionMapRWMutex.Unlock()
|
|
|
|
common.OptionMap[key] = value
|
|
|
|
if strings.HasSuffix(key, "Permission") {
|
|
|
|
intValue, _ := strconv.Atoi(value)
|
|
|
|
switch key {
|
|
|
|
case "FileUploadPermission":
|
|
|
|
common.FileUploadPermission = intValue
|
|
|
|
case "FileDownloadPermission":
|
|
|
|
common.FileDownloadPermission = intValue
|
|
|
|
case "ImageUploadPermission":
|
|
|
|
common.ImageUploadPermission = intValue
|
|
|
|
case "ImageDownloadPermission":
|
|
|
|
common.ImageDownloadPermission = intValue
|
|
|
|
}
|
|
|
|
}
|
|
|
|
if strings.HasSuffix(key, "Enabled") {
|
|
|
|
boolValue := value == "true"
|
|
|
|
switch key {
|
|
|
|
case "PasswordRegisterEnabled":
|
|
|
|
common.PasswordRegisterEnabled = boolValue
|
|
|
|
case "PasswordLoginEnabled":
|
|
|
|
common.PasswordLoginEnabled = boolValue
|
|
|
|
case "EmailVerificationEnabled":
|
|
|
|
common.EmailVerificationEnabled = boolValue
|
|
|
|
case "GitHubOAuthEnabled":
|
|
|
|
common.GitHubOAuthEnabled = boolValue
|
|
|
|
case "WeChatAuthEnabled":
|
|
|
|
common.WeChatAuthEnabled = boolValue
|
|
|
|
case "TurnstileCheckEnabled":
|
|
|
|
common.TurnstileCheckEnabled = boolValue
|
|
|
|
case "RegisterEnabled":
|
|
|
|
common.RegisterEnabled = boolValue
|
2023-05-15 09:34:09 +00:00
|
|
|
case "AutomaticDisableChannelEnabled":
|
|
|
|
common.AutomaticDisableChannelEnabled = boolValue
|
2023-06-15 08:32:16 +00:00
|
|
|
case "LogConsumeEnabled":
|
|
|
|
common.LogConsumeEnabled = boolValue
|
2023-04-22 12:39:27 +00:00
|
|
|
}
|
|
|
|
}
|
|
|
|
switch key {
|
|
|
|
case "SMTPServer":
|
|
|
|
common.SMTPServer = value
|
2023-05-12 03:44:38 +00:00
|
|
|
case "SMTPPort":
|
|
|
|
intValue, _ := strconv.Atoi(value)
|
|
|
|
common.SMTPPort = intValue
|
2023-04-22 12:39:27 +00:00
|
|
|
case "SMTPAccount":
|
|
|
|
common.SMTPAccount = value
|
2023-05-13 10:33:41 +00:00
|
|
|
case "SMTPFrom":
|
|
|
|
common.SMTPFrom = value
|
2023-04-22 12:39:27 +00:00
|
|
|
case "SMTPToken":
|
|
|
|
common.SMTPToken = value
|
|
|
|
case "ServerAddress":
|
|
|
|
common.ServerAddress = value
|
|
|
|
case "GitHubClientId":
|
|
|
|
common.GitHubClientId = value
|
|
|
|
case "GitHubClientSecret":
|
|
|
|
common.GitHubClientSecret = value
|
|
|
|
case "Footer":
|
|
|
|
common.Footer = value
|
2023-05-14 11:29:02 +00:00
|
|
|
case "SystemName":
|
|
|
|
common.SystemName = value
|
|
|
|
case "Logo":
|
|
|
|
common.Logo = value
|
2023-04-22 12:39:27 +00:00
|
|
|
case "WeChatServerAddress":
|
|
|
|
common.WeChatServerAddress = value
|
|
|
|
case "WeChatServerToken":
|
|
|
|
common.WeChatServerToken = value
|
|
|
|
case "WeChatAccountQRCodeImageURL":
|
|
|
|
common.WeChatAccountQRCodeImageURL = value
|
|
|
|
case "TurnstileSiteKey":
|
|
|
|
common.TurnstileSiteKey = value
|
|
|
|
case "TurnstileSecretKey":
|
|
|
|
common.TurnstileSecretKey = value
|
2023-04-26 13:40:56 +00:00
|
|
|
case "QuotaForNewUser":
|
|
|
|
common.QuotaForNewUser, _ = strconv.Atoi(value)
|
2023-05-16 02:04:39 +00:00
|
|
|
case "QuotaRemindThreshold":
|
|
|
|
common.QuotaRemindThreshold, _ = strconv.Atoi(value)
|
2023-05-16 05:57:01 +00:00
|
|
|
case "PreConsumedQuota":
|
|
|
|
common.PreConsumedQuota, _ = strconv.Atoi(value)
|
2023-05-11 12:59:35 +00:00
|
|
|
case "ModelRatio":
|
|
|
|
err = common.UpdateModelRatioByJSONString(value)
|
2023-06-11 03:08:16 +00:00
|
|
|
case "GroupRatio":
|
|
|
|
err = common.UpdateGroupRatioByJSONString(value)
|
2023-04-27 08:32:21 +00:00
|
|
|
case "TopUpLink":
|
|
|
|
common.TopUpLink = value
|
2023-05-15 09:34:09 +00:00
|
|
|
case "ChannelDisableThreshold":
|
|
|
|
common.ChannelDisableThreshold, _ = strconv.ParseFloat(value, 64)
|
2023-04-22 12:39:27 +00:00
|
|
|
}
|
2023-05-11 12:59:35 +00:00
|
|
|
return err
|
2023-04-22 12:39:27 +00:00
|
|
|
}
|