| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| package model |
|
|
| import ( |
| "strconv" |
| "strings" |
| "time" |
| "veloera/common" |
| "veloera/setting" |
| "veloera/setting/config" |
| "veloera/setting/operation_setting" |
| ) |
|
|
| 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["LinuxDOOAuthEnabled"] = strconv.FormatBool(common.LinuxDOOAuthEnabled) |
| common.OptionMap["IDCFlareOAuthEnabled"] = strconv.FormatBool(common.IDCFlareOAuthEnabled) |
| common.OptionMap["TelegramOAuthEnabled"] = strconv.FormatBool(common.TelegramOAuthEnabled) |
| common.OptionMap["WeChatAuthEnabled"] = strconv.FormatBool(common.WeChatAuthEnabled) |
| common.OptionMap["TurnstileCheckEnabled"] = strconv.FormatBool(common.TurnstileCheckEnabled) |
| common.OptionMap["RegisterEnabled"] = strconv.FormatBool(common.RegisterEnabled) |
| common.OptionMap["AutomaticDisableChannelEnabled"] = strconv.FormatBool(common.AutomaticDisableChannelEnabled) |
| common.OptionMap["AutomaticEnableChannelEnabled"] = strconv.FormatBool(common.AutomaticEnableChannelEnabled) |
| common.OptionMap["AffEnabled"] = strconv.FormatBool(common.AffEnabled) |
| common.OptionMap["LogConsumeEnabled"] = strconv.FormatBool(common.LogConsumeEnabled) |
| common.OptionMap["LogChatContentEnabled"] = strconv.FormatBool(common.LogChatContentEnabled) |
| common.OptionMap["LogErrorEnabled"] = strconv.FormatBool(common.LogErrorEnabled) |
| common.OptionMap["CheckInEnabled"] = strconv.FormatBool(common.CheckInEnabled) |
| common.OptionMap["CheckInQuota"] = strconv.Itoa(common.CheckInQuota) |
| common.OptionMap["CheckInMaxQuota"] = strconv.Itoa(common.CheckInMaxQuota) |
| common.OptionMap["RebateEnabled"] = strconv.FormatBool(common.RebateEnabled) |
| common.OptionMap["RebatePercentage"] = strconv.FormatFloat(common.RebatePercentage, 'f', -1, 64) |
| common.OptionMap["DisplayInCurrencyEnabled"] = strconv.FormatBool(common.DisplayInCurrencyEnabled) |
| common.OptionMap["DisplayTokenStatEnabled"] = strconv.FormatBool(common.DisplayTokenStatEnabled) |
| common.OptionMap["DrawingEnabled"] = strconv.FormatBool(common.DrawingEnabled) |
| common.OptionMap["TaskEnabled"] = strconv.FormatBool(common.TaskEnabled) |
| common.OptionMap["DataExportEnabled"] = strconv.FormatBool(common.DataExportEnabled) |
| common.OptionMap["ChannelDisableThreshold"] = strconv.FormatFloat(common.ChannelDisableThreshold, 'f', -1, 64) |
| common.OptionMap["EmailDomainRestrictionEnabled"] = strconv.FormatBool(common.EmailDomainRestrictionEnabled) |
| common.OptionMap["EmailAliasRestrictionEnabled"] = strconv.FormatBool(common.EmailAliasRestrictionEnabled) |
| common.OptionMap["EmailDomainWhitelist"] = strings.Join(common.EmailDomainWhitelist, ",") |
| common.OptionMap["SMTPServer"] = "" |
| common.OptionMap["SMTPFrom"] = "" |
| common.OptionMap["SMTPPort"] = strconv.Itoa(common.SMTPPort) |
| common.OptionMap["SMTPAccount"] = "" |
| common.OptionMap["SMTPToken"] = "" |
| common.OptionMap["SMTPSSLEnabled"] = strconv.FormatBool(common.SMTPSSLEnabled) |
| common.OptionMap["Notice"] = "" |
| common.OptionMap["About"] = "" |
| common.OptionMap["HomePageContent"] = "" |
| common.OptionMap["Footer"] = common.Footer |
| common.OptionMap["SystemName"] = common.SystemName |
| common.OptionMap["Logo"] = common.Logo |
| common.OptionMap["ServerAddress"] = "" |
| common.OptionMap["WorkerUrl"] = setting.WorkerUrl |
| common.OptionMap["WorkerValidKey"] = setting.WorkerValidKey |
| common.OptionMap["PayAddress"] = "" |
| common.OptionMap["CustomCallbackAddress"] = "" |
| common.OptionMap["EpayId"] = "" |
| common.OptionMap["EpayKey"] = "" |
| common.OptionMap["Price"] = strconv.FormatFloat(setting.Price, 'f', -1, 64) |
| common.OptionMap["MinTopUp"] = strconv.Itoa(setting.MinTopUp) |
| common.OptionMap["TopupGroupRatio"] = common.TopupGroupRatio2JSONString() |
| common.OptionMap["Chats"] = setting.Chats2JsonString() |
| common.OptionMap["GitHubClientId"] = "" |
| common.OptionMap["GitHubClientSecret"] = "" |
| common.OptionMap["LinuxDOClientId"] = "" |
| common.OptionMap["LinuxDOClientSecret"] = "" |
| common.OptionMap["LinuxDOMinimumTrustLevel"] = strconv.Itoa(common.LinuxDOMinimumTrustLevel) |
| common.OptionMap["IDCFlareClientId"] = "" |
| common.OptionMap["IDCFlareClientSecret"] = "" |
| common.OptionMap["IDCFlareMinimumTrustLevel"] = strconv.Itoa(common.IDCFlareMinimumTrustLevel) |
| common.OptionMap["TelegramBotToken"] = "" |
| common.OptionMap["TelegramBotName"] = "" |
| common.OptionMap["WeChatServerAddress"] = "" |
| common.OptionMap["WeChatServerToken"] = "" |
| common.OptionMap["WeChatAccountQRCodeImageURL"] = "" |
| common.OptionMap["TurnstileSiteKey"] = "" |
| common.OptionMap["TurnstileSecretKey"] = "" |
| common.OptionMap["QuotaForNewUser"] = strconv.Itoa(common.QuotaForNewUser) |
| common.OptionMap["QuotaForInviter"] = strconv.Itoa(common.QuotaForInviter) |
| common.OptionMap["QuotaForInvitee"] = strconv.Itoa(common.QuotaForInvitee) |
| common.OptionMap["QuotaRemindThreshold"] = strconv.Itoa(common.QuotaRemindThreshold) |
| common.OptionMap["PreConsumedQuota"] = strconv.Itoa(common.PreConsumedQuota) |
| common.OptionMap["ModelRequestRateLimitCount"] = strconv.Itoa(setting.ModelRequestRateLimitCount) |
| common.OptionMap["ModelRequestRateLimitDurationMinutes"] = strconv.Itoa(setting.ModelRequestRateLimitDurationMinutes) |
| common.OptionMap["ModelRequestRateLimitSuccessCount"] = strconv.Itoa(setting.ModelRequestRateLimitSuccessCount) |
| common.OptionMap["ModelRatio"] = operation_setting.ModelRatio2JSONString() |
| common.OptionMap["ModelPrice"] = operation_setting.ModelPrice2JSONString() |
| common.OptionMap["CacheRatio"] = operation_setting.CacheRatio2JSONString() |
| common.OptionMap["GroupRatio"] = setting.GroupRatio2JSONString() |
| common.OptionMap["UserUsableGroups"] = setting.UserUsableGroups2JSONString() |
| common.OptionMap["CompletionRatio"] = operation_setting.CompletionRatio2JSONString() |
| common.OptionMap["TopUpLink"] = common.TopUpLink |
| |
| |
| common.OptionMap["QuotaPerUnit"] = strconv.FormatFloat(common.QuotaPerUnit, 'f', -1, 64) |
| common.OptionMap["RetryTimes"] = strconv.Itoa(common.RetryTimes) |
| common.OptionMap["DataExportInterval"] = strconv.Itoa(common.DataExportInterval) |
| common.OptionMap["DataExportDefaultTime"] = common.DataExportDefaultTime |
| common.OptionMap["DefaultCollapseSidebar"] = strconv.FormatBool(common.DefaultCollapseSidebar) |
| common.OptionMap["MjNotifyEnabled"] = strconv.FormatBool(setting.MjNotifyEnabled) |
| common.OptionMap["MjAccountFilterEnabled"] = strconv.FormatBool(setting.MjAccountFilterEnabled) |
| common.OptionMap["MjModeClearEnabled"] = strconv.FormatBool(setting.MjModeClearEnabled) |
| common.OptionMap["MjForwardUrlEnabled"] = strconv.FormatBool(setting.MjForwardUrlEnabled) |
| common.OptionMap["MjActionCheckSuccessEnabled"] = strconv.FormatBool(setting.MjActionCheckSuccessEnabled) |
| common.OptionMap["CheckSensitiveEnabled"] = strconv.FormatBool(setting.CheckSensitiveEnabled) |
| common.OptionMap["DemoSiteEnabled"] = strconv.FormatBool(operation_setting.DemoSiteEnabled) |
| common.OptionMap["SelfUseModeEnabled"] = strconv.FormatBool(operation_setting.SelfUseModeEnabled) |
| common.OptionMap["ModelRequestRateLimitEnabled"] = strconv.FormatBool(setting.ModelRequestRateLimitEnabled) |
| common.OptionMap["CheckSensitiveOnPromptEnabled"] = strconv.FormatBool(setting.CheckSensitiveOnPromptEnabled) |
| common.OptionMap["StopOnSensitiveEnabled"] = strconv.FormatBool(setting.StopOnSensitiveEnabled) |
| common.OptionMap["SafeCheckExemptEnabled"] = strconv.FormatBool(setting.SafeCheckExemptEnabled) |
| common.OptionMap["SafeCheckExemptGroup"] = setting.SafeCheckExemptGroup |
| common.OptionMap["SensitiveWords"] = setting.SensitiveWordsToString() |
| common.OptionMap["StreamCacheQueueLength"] = strconv.Itoa(setting.StreamCacheQueueLength) |
| common.OptionMap["AutomaticDisableKeywords"] = operation_setting.AutomaticDisableKeywordsToString() |
|
|
| |
| common.OptionMap["custom_head_html"] = "" |
| common.OptionMap["global_css"] = "" |
| common.OptionMap["global_js"] = "" |
|
|
| |
| common.OptionMap["fallback_pricing_enabled"] = "false" |
| common.OptionMap["fallback_single_price"] = "" |
| common.OptionMap["fallback_input_ratio"] = "" |
| common.OptionMap["fallback_completion_ratio"] = "" |
|
|
| |
| common.OptionMap["redirect_billing_enabled"] = "false" |
|
|
| |
| common.OptionMap["ReverseProxyEnabled"] = "false" |
| common.OptionMap["ReverseProxyProvider"] = "nginx" |
|
|
| |
| modelConfigs := config.GlobalConfig.ExportAllConfigs() |
| for k, v := range modelConfigs { |
| common.OptionMap[k] = v |
| } |
|
|
| common.OptionMapRWMutex.Unlock() |
| loadOptionsFromDatabase() |
| } |
|
|
| func loadOptionsFromDatabase() { |
| options, _ := AllOption() |
| for _, option := range options { |
| err := updateOptionMap(option.Key, option.Value) |
| if err != nil { |
| common.SysError("failed to update option map: " + err.Error()) |
| } |
| } |
| } |
|
|
| func SyncOptions(frequency int) { |
| for { |
| time.Sleep(time.Duration(frequency) * time.Second) |
| common.SysLog("syncing options from database") |
| loadOptionsFromDatabase() |
| } |
| } |
|
|
| func UpdateOption(key string, value string) error { |
| |
| option := Option{ |
| Key: key, |
| } |
| |
| DB.FirstOrCreate(&option, Option{Key: key}) |
| option.Value = value |
| |
| |
| |
| DB.Save(&option) |
| |
| return updateOptionMap(key, value) |
| } |
|
|
| func updateOptionMap(key string, value string) (err error) { |
| common.OptionMapRWMutex.Lock() |
| defer common.OptionMapRWMutex.Unlock() |
| common.OptionMap[key] = value |
|
|
| |
| if handleConfigUpdate(key, value) { |
| return nil |
| } |
|
|
| |
| 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") || key == "DefaultCollapseSidebar" { |
| 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 "LinuxDOOAuthEnabled": |
| common.LinuxDOOAuthEnabled = boolValue |
| case "IDCFlareOAuthEnabled": |
| common.IDCFlareOAuthEnabled = boolValue |
| case "WeChatAuthEnabled": |
| common.WeChatAuthEnabled = boolValue |
| case "TelegramOAuthEnabled": |
| common.TelegramOAuthEnabled = boolValue |
| case "TurnstileCheckEnabled": |
| common.TurnstileCheckEnabled = boolValue |
| case "RegisterEnabled": |
| common.RegisterEnabled = boolValue |
| case "EmailDomainRestrictionEnabled": |
| common.EmailDomainRestrictionEnabled = boolValue |
| case "EmailAliasRestrictionEnabled": |
| common.EmailAliasRestrictionEnabled = boolValue |
| case "AutomaticDisableChannelEnabled": |
| common.AutomaticDisableChannelEnabled = boolValue |
| case "AutomaticEnableChannelEnabled": |
| common.AutomaticEnableChannelEnabled = boolValue |
| case "AffEnabled": |
| common.AffEnabled = boolValue |
| case "LogConsumeEnabled": |
| common.LogConsumeEnabled = boolValue |
| case "LogChatContentEnabled": |
| common.LogChatContentEnabled = boolValue |
| case "LogErrorEnabled": |
| common.LogErrorEnabled = boolValue |
| case "CheckInEnabled": |
| common.CheckInEnabled = boolValue |
| case "CheckInQuota": |
| common.CheckInQuota, _ = strconv.Atoi(value) |
| case "CheckInMaxQuota": |
| common.CheckInMaxQuota, _ = strconv.Atoi(value) |
| case "RebateEnabled": |
| common.RebateEnabled = boolValue |
| case "DisplayInCurrencyEnabled": |
| common.DisplayInCurrencyEnabled = boolValue |
| case "DisplayTokenStatEnabled": |
| common.DisplayTokenStatEnabled = boolValue |
| case "DrawingEnabled": |
| common.DrawingEnabled = boolValue |
| case "TaskEnabled": |
| common.TaskEnabled = boolValue |
| case "DataExportEnabled": |
| common.DataExportEnabled = boolValue |
| case "DefaultCollapseSidebar": |
| common.DefaultCollapseSidebar = boolValue |
| case "MjNotifyEnabled": |
| setting.MjNotifyEnabled = boolValue |
| case "MjAccountFilterEnabled": |
| setting.MjAccountFilterEnabled = boolValue |
| case "MjModeClearEnabled": |
| setting.MjModeClearEnabled = boolValue |
| case "MjForwardUrlEnabled": |
| setting.MjForwardUrlEnabled = boolValue |
| case "MjActionCheckSuccessEnabled": |
| setting.MjActionCheckSuccessEnabled = boolValue |
| case "CheckSensitiveEnabled": |
| setting.CheckSensitiveEnabled = boolValue |
| case "DemoSiteEnabled": |
| operation_setting.DemoSiteEnabled = boolValue |
| case "SelfUseModeEnabled": |
| operation_setting.SelfUseModeEnabled = boolValue |
| case "CheckSensitiveOnPromptEnabled": |
| setting.CheckSensitiveOnPromptEnabled = boolValue |
| case "ModelRequestRateLimitEnabled": |
| setting.ModelRequestRateLimitEnabled = boolValue |
| case "StopOnSensitiveEnabled": |
| setting.StopOnSensitiveEnabled = boolValue |
| case "SafeCheckExemptEnabled": |
| setting.SafeCheckExemptEnabled = boolValue |
| case "SMTPSSLEnabled": |
| common.SMTPSSLEnabled = boolValue |
| case "ReverseProxyEnabled": |
| common.ReverseProxyEnabled = boolValue |
| } |
| } |
| switch key { |
| case "EmailDomainWhitelist": |
| common.EmailDomainWhitelist = strings.Split(value, ",") |
| case "SMTPServer": |
| common.SMTPServer = value |
| case "SMTPPort": |
| intValue, _ := strconv.Atoi(value) |
| common.SMTPPort = intValue |
| case "SMTPAccount": |
| common.SMTPAccount = value |
| case "SMTPFrom": |
| common.SMTPFrom = value |
| case "SMTPToken": |
| common.SMTPToken = value |
| case "ServerAddress": |
| setting.ServerAddress = value |
| case "WorkerUrl": |
| setting.WorkerUrl = value |
| case "WorkerValidKey": |
| setting.WorkerValidKey = value |
| case "PayAddress": |
| setting.PayAddress = value |
| case "Chats": |
| err = setting.UpdateChatsByJsonString(value) |
| case "CustomCallbackAddress": |
| setting.CustomCallbackAddress = value |
| case "EpayId": |
| setting.EpayId = value |
| case "EpayKey": |
| setting.EpayKey = value |
| case "Price": |
| setting.Price, _ = strconv.ParseFloat(value, 64) |
| case "MinTopUp": |
| setting.MinTopUp, _ = strconv.Atoi(value) |
| case "TopupGroupRatio": |
| err = common.UpdateTopupGroupRatioByJSONString(value) |
| case "GitHubClientId": |
| common.GitHubClientId = value |
| case "GitHubClientSecret": |
| common.GitHubClientSecret = value |
| case "LinuxDOClientId": |
| common.LinuxDOClientId = value |
| case "LinuxDOClientSecret": |
| common.LinuxDOClientSecret = value |
| case "LinuxDOMinimumTrustLevel": |
| common.LinuxDOMinimumTrustLevel, _ = strconv.Atoi(value) |
| case "IDCFlareClientId": |
| common.IDCFlareClientId = value |
| case "IDCFlareClientSecret": |
| common.IDCFlareClientSecret = value |
| case "IDCFlareMinimumTrustLevel": |
| common.IDCFlareMinimumTrustLevel, _ = strconv.Atoi(value) |
| case "Footer": |
| common.Footer = value |
| case "SystemName": |
| common.SystemName = value |
| case "Logo": |
| common.Logo = value |
| case "WeChatServerAddress": |
| common.WeChatServerAddress = value |
| case "WeChatServerToken": |
| common.WeChatServerToken = value |
| case "WeChatAccountQRCodeImageURL": |
| common.WeChatAccountQRCodeImageURL = value |
| case "TelegramBotToken": |
| common.TelegramBotToken = value |
| case "TelegramBotName": |
| common.TelegramBotName = value |
| case "TurnstileSiteKey": |
| common.TurnstileSiteKey = value |
| case "TurnstileSecretKey": |
| common.TurnstileSecretKey = value |
| case "QuotaForNewUser": |
| common.QuotaForNewUser, _ = strconv.Atoi(value) |
| case "QuotaForInviter": |
| common.QuotaForInviter, _ = strconv.Atoi(value) |
| case "QuotaForInvitee": |
| common.QuotaForInvitee, _ = strconv.Atoi(value) |
| case "QuotaRemindThreshold": |
| common.QuotaRemindThreshold, _ = strconv.Atoi(value) |
| case "PreConsumedQuota": |
| common.PreConsumedQuota, _ = strconv.Atoi(value) |
| case "ModelRequestRateLimitCount": |
| setting.ModelRequestRateLimitCount, _ = strconv.Atoi(value) |
| case "ModelRequestRateLimitDurationMinutes": |
| setting.ModelRequestRateLimitDurationMinutes, _ = strconv.Atoi(value) |
| case "ModelRequestRateLimitSuccessCount": |
| setting.ModelRequestRateLimitSuccessCount, _ = strconv.Atoi(value) |
| case "RetryTimes": |
| common.RetryTimes, _ = strconv.Atoi(value) |
| case "DataExportInterval": |
| common.DataExportInterval, _ = strconv.Atoi(value) |
| case "DataExportDefaultTime": |
| common.DataExportDefaultTime = value |
| case "ModelRatio": |
| err = operation_setting.UpdateModelRatioByJSONString(value) |
| case "GroupRatio": |
| err = setting.UpdateGroupRatioByJSONString(value) |
| case "UserUsableGroups": |
| err = setting.UpdateUserUsableGroupsByJSONString(value) |
| case "CompletionRatio": |
| err = operation_setting.UpdateCompletionRatioByJSONString(value) |
| case "ModelPrice": |
| err = operation_setting.UpdateModelPriceByJSONString(value) |
| case "CacheRatio": |
| err = operation_setting.UpdateCacheRatioByJSONString(value) |
| case "TopUpLink": |
| common.TopUpLink = value |
| |
| |
| |
| |
| case "ChannelDisableThreshold": |
| common.ChannelDisableThreshold, _ = strconv.ParseFloat(value, 64) |
| case "QuotaPerUnit": |
| common.QuotaPerUnit, _ = strconv.ParseFloat(value, 64) |
| case "SensitiveWords": |
| setting.SensitiveWordsFromString(value) |
| case "SafeCheckExemptGroup": |
| setting.SafeCheckExemptGroup = value |
| case "AutomaticDisableKeywords": |
| operation_setting.AutomaticDisableKeywordsFromString(value) |
| case "StreamCacheQueueLength": |
| setting.StreamCacheQueueLength, _ = strconv.Atoi(value) |
| case "RebatePercentage": |
| common.RebatePercentage, _ = strconv.ParseFloat(value, 64) |
| case "ReverseProxyProvider": |
| common.ReverseProxyProvider = value |
| } |
| return err |
| } |
|
|
| |
| func handleConfigUpdate(key, value string) bool { |
| parts := strings.SplitN(key, ".", 2) |
| if len(parts) != 2 { |
| return false |
| } |
|
|
| configName := parts[0] |
| configKey := parts[1] |
|
|
| |
| cfg := config.GlobalConfig.Get(configName) |
| if cfg == nil { |
| return false |
| } |
|
|
| |
| configMap := map[string]string{ |
| configKey: value, |
| } |
| config.UpdateConfigFromMap(cfg, configMap) |
|
|
| return true |
| } |
|
|