|
|
|
|
@@ -2,6 +2,7 @@ package config
|
|
|
|
|
|
|
|
|
|
import (
|
|
|
|
|
"encoding/json"
|
|
|
|
|
"fmt"
|
|
|
|
|
"os"
|
|
|
|
|
"path/filepath"
|
|
|
|
|
"sync"
|
|
|
|
|
@@ -9,6 +10,39 @@ import (
|
|
|
|
|
"github.com/caarlos0/env/v11"
|
|
|
|
|
)
|
|
|
|
|
|
|
|
|
|
// FlexibleStringSlice is a []string that also accepts JSON numbers,
|
|
|
|
|
// so allow_from can contain both "123" and 123.
|
|
|
|
|
type FlexibleStringSlice []string
|
|
|
|
|
|
|
|
|
|
func (f *FlexibleStringSlice) UnmarshalJSON(data []byte) error {
|
|
|
|
|
// Try []string first
|
|
|
|
|
var ss []string
|
|
|
|
|
if err := json.Unmarshal(data, &ss); err == nil {
|
|
|
|
|
*f = ss
|
|
|
|
|
return nil
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// Try []interface{} to handle mixed types
|
|
|
|
|
var raw []interface{}
|
|
|
|
|
if err := json.Unmarshal(data, &raw); err != nil {
|
|
|
|
|
return err
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
result := make([]string, 0, len(raw))
|
|
|
|
|
for _, v := range raw {
|
|
|
|
|
switch val := v.(type) {
|
|
|
|
|
case string:
|
|
|
|
|
result = append(result, val)
|
|
|
|
|
case float64:
|
|
|
|
|
result = append(result, fmt.Sprintf("%.0f", val))
|
|
|
|
|
default:
|
|
|
|
|
result = append(result, fmt.Sprintf("%v", val))
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
*f = result
|
|
|
|
|
return nil
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
type Config struct {
|
|
|
|
|
Agents AgentsConfig `json:"agents"`
|
|
|
|
|
Channels ChannelsConfig `json:"channels"`
|
|
|
|
|
@@ -44,51 +78,52 @@ type ChannelsConfig struct {
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
type WhatsAppConfig struct {
|
|
|
|
|
Enabled bool `json:"enabled" env:"PICOCLAW_CHANNELS_WHATSAPP_ENABLED"`
|
|
|
|
|
BridgeURL string `json:"bridge_url" env:"PICOCLAW_CHANNELS_WHATSAPP_BRIDGE_URL"`
|
|
|
|
|
AllowFrom []string `json:"allow_from" env:"PICOCLAW_CHANNELS_WHATSAPP_ALLOW_FROM"`
|
|
|
|
|
Enabled bool `json:"enabled" env:"PICOCLAW_CHANNELS_WHATSAPP_ENABLED"`
|
|
|
|
|
BridgeURL string `json:"bridge_url" env:"PICOCLAW_CHANNELS_WHATSAPP_BRIDGE_URL"`
|
|
|
|
|
AllowFrom FlexibleStringSlice `json:"allow_from" env:"PICOCLAW_CHANNELS_WHATSAPP_ALLOW_FROM"`
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
type TelegramConfig struct {
|
|
|
|
|
Enabled bool `json:"enabled" env:"PICOCLAW_CHANNELS_TELEGRAM_ENABLED"`
|
|
|
|
|
Token string `json:"token" env:"PICOCLAW_CHANNELS_TELEGRAM_TOKEN"`
|
|
|
|
|
AllowFrom []string `json:"allow_from" env:"PICOCLAW_CHANNELS_TELEGRAM_ALLOW_FROM"`
|
|
|
|
|
Enabled bool `json:"enabled" env:"PICOCLAW_CHANNELS_TELEGRAM_ENABLED"`
|
|
|
|
|
Token string `json:"token" env:"PICOCLAW_CHANNELS_TELEGRAM_TOKEN"`
|
|
|
|
|
Proxy string `json:"proxy" env:"PICOCLAW_CHANNELS_TELEGRAM_PROXY"`
|
|
|
|
|
AllowFrom FlexibleStringSlice `json:"allow_from" env:"PICOCLAW_CHANNELS_TELEGRAM_ALLOW_FROM"`
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
type FeishuConfig struct {
|
|
|
|
|
Enabled bool `json:"enabled" env:"PICOCLAW_CHANNELS_FEISHU_ENABLED"`
|
|
|
|
|
AppID string `json:"app_id" env:"PICOCLAW_CHANNELS_FEISHU_APP_ID"`
|
|
|
|
|
AppSecret string `json:"app_secret" env:"PICOCLAW_CHANNELS_FEISHU_APP_SECRET"`
|
|
|
|
|
EncryptKey string `json:"encrypt_key" env:"PICOCLAW_CHANNELS_FEISHU_ENCRYPT_KEY"`
|
|
|
|
|
VerificationToken string `json:"verification_token" env:"PICOCLAW_CHANNELS_FEISHU_VERIFICATION_TOKEN"`
|
|
|
|
|
AllowFrom []string `json:"allow_from" env:"PICOCLAW_CHANNELS_FEISHU_ALLOW_FROM"`
|
|
|
|
|
Enabled bool `json:"enabled" env:"PICOCLAW_CHANNELS_FEISHU_ENABLED"`
|
|
|
|
|
AppID string `json:"app_id" env:"PICOCLAW_CHANNELS_FEISHU_APP_ID"`
|
|
|
|
|
AppSecret string `json:"app_secret" env:"PICOCLAW_CHANNELS_FEISHU_APP_SECRET"`
|
|
|
|
|
EncryptKey string `json:"encrypt_key" env:"PICOCLAW_CHANNELS_FEISHU_ENCRYPT_KEY"`
|
|
|
|
|
VerificationToken string `json:"verification_token" env:"PICOCLAW_CHANNELS_FEISHU_VERIFICATION_TOKEN"`
|
|
|
|
|
AllowFrom FlexibleStringSlice `json:"allow_from" env:"PICOCLAW_CHANNELS_FEISHU_ALLOW_FROM"`
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
type DiscordConfig struct {
|
|
|
|
|
Enabled bool `json:"enabled" env:"PICOCLAW_CHANNELS_DISCORD_ENABLED"`
|
|
|
|
|
Token string `json:"token" env:"PICOCLAW_CHANNELS_DISCORD_TOKEN"`
|
|
|
|
|
AllowFrom []string `json:"allow_from" env:"PICOCLAW_CHANNELS_DISCORD_ALLOW_FROM"`
|
|
|
|
|
Enabled bool `json:"enabled" env:"PICOCLAW_CHANNELS_DISCORD_ENABLED"`
|
|
|
|
|
Token string `json:"token" env:"PICOCLAW_CHANNELS_DISCORD_TOKEN"`
|
|
|
|
|
AllowFrom FlexibleStringSlice `json:"allow_from" env:"PICOCLAW_CHANNELS_DISCORD_ALLOW_FROM"`
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
type MaixCamConfig struct {
|
|
|
|
|
Enabled bool `json:"enabled" env:"PICOCLAW_CHANNELS_MAIXCAM_ENABLED"`
|
|
|
|
|
Host string `json:"host" env:"PICOCLAW_CHANNELS_MAIXCAM_HOST"`
|
|
|
|
|
Port int `json:"port" env:"PICOCLAW_CHANNELS_MAIXCAM_PORT"`
|
|
|
|
|
AllowFrom []string `json:"allow_from" env:"PICOCLAW_CHANNELS_MAIXCAM_ALLOW_FROM"`
|
|
|
|
|
Enabled bool `json:"enabled" env:"PICOCLAW_CHANNELS_MAIXCAM_ENABLED"`
|
|
|
|
|
Host string `json:"host" env:"PICOCLAW_CHANNELS_MAIXCAM_HOST"`
|
|
|
|
|
Port int `json:"port" env:"PICOCLAW_CHANNELS_MAIXCAM_PORT"`
|
|
|
|
|
AllowFrom FlexibleStringSlice `json:"allow_from" env:"PICOCLAW_CHANNELS_MAIXCAM_ALLOW_FROM"`
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
type QQConfig struct {
|
|
|
|
|
Enabled bool `json:"enabled" env:"PICOCLAW_CHANNELS_QQ_ENABLED"`
|
|
|
|
|
AppID string `json:"app_id" env:"PICOCLAW_CHANNELS_QQ_APP_ID"`
|
|
|
|
|
AppSecret string `json:"app_secret" env:"PICOCLAW_CHANNELS_QQ_APP_SECRET"`
|
|
|
|
|
AllowFrom []string `json:"allow_from" env:"PICOCLAW_CHANNELS_QQ_ALLOW_FROM"`
|
|
|
|
|
Enabled bool `json:"enabled" env:"PICOCLAW_CHANNELS_QQ_ENABLED"`
|
|
|
|
|
AppID string `json:"app_id" env:"PICOCLAW_CHANNELS_QQ_APP_ID"`
|
|
|
|
|
AppSecret string `json:"app_secret" env:"PICOCLAW_CHANNELS_QQ_APP_SECRET"`
|
|
|
|
|
AllowFrom FlexibleStringSlice `json:"allow_from" env:"PICOCLAW_CHANNELS_QQ_ALLOW_FROM"`
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
type DingTalkConfig struct {
|
|
|
|
|
Enabled bool `json:"enabled" env:"PICOCLAW_CHANNELS_DINGTALK_ENABLED"`
|
|
|
|
|
ClientID string `json:"client_id" env:"PICOCLAW_CHANNELS_DINGTALK_CLIENT_ID"`
|
|
|
|
|
ClientSecret string `json:"client_secret" env:"PICOCLAW_CHANNELS_DINGTALK_CLIENT_SECRET"`
|
|
|
|
|
AllowFrom []string `json:"allow_from" env:"PICOCLAW_CHANNELS_DINGTALK_ALLOW_FROM"`
|
|
|
|
|
Enabled bool `json:"enabled" env:"PICOCLAW_CHANNELS_DINGTALK_ENABLED"`
|
|
|
|
|
ClientID string `json:"client_id" env:"PICOCLAW_CHANNELS_DINGTALK_CLIENT_ID"`
|
|
|
|
|
ClientSecret string `json:"client_secret" env:"PICOCLAW_CHANNELS_DINGTALK_CLIENT_SECRET"`
|
|
|
|
|
AllowFrom FlexibleStringSlice `json:"allow_from" env:"PICOCLAW_CHANNELS_DINGTALK_ALLOW_FROM"`
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
type SlackConfig struct {
|
|
|
|
|
@@ -149,12 +184,12 @@ func DefaultConfig() *Config {
|
|
|
|
|
WhatsApp: WhatsAppConfig{
|
|
|
|
|
Enabled: false,
|
|
|
|
|
BridgeURL: "ws://localhost:3001",
|
|
|
|
|
AllowFrom: []string{},
|
|
|
|
|
AllowFrom: FlexibleStringSlice{},
|
|
|
|
|
},
|
|
|
|
|
Telegram: TelegramConfig{
|
|
|
|
|
Enabled: false,
|
|
|
|
|
Token: "",
|
|
|
|
|
AllowFrom: []string{},
|
|
|
|
|
AllowFrom: FlexibleStringSlice{},
|
|
|
|
|
},
|
|
|
|
|
Feishu: FeishuConfig{
|
|
|
|
|
Enabled: false,
|
|
|
|
|
@@ -162,30 +197,30 @@ func DefaultConfig() *Config {
|
|
|
|
|
AppSecret: "",
|
|
|
|
|
EncryptKey: "",
|
|
|
|
|
VerificationToken: "",
|
|
|
|
|
AllowFrom: []string{},
|
|
|
|
|
AllowFrom: FlexibleStringSlice{},
|
|
|
|
|
},
|
|
|
|
|
Discord: DiscordConfig{
|
|
|
|
|
Enabled: false,
|
|
|
|
|
Token: "",
|
|
|
|
|
AllowFrom: []string{},
|
|
|
|
|
AllowFrom: FlexibleStringSlice{},
|
|
|
|
|
},
|
|
|
|
|
MaixCam: MaixCamConfig{
|
|
|
|
|
Enabled: false,
|
|
|
|
|
Host: "0.0.0.0",
|
|
|
|
|
Port: 18790,
|
|
|
|
|
AllowFrom: []string{},
|
|
|
|
|
AllowFrom: FlexibleStringSlice{},
|
|
|
|
|
},
|
|
|
|
|
QQ: QQConfig{
|
|
|
|
|
Enabled: false,
|
|
|
|
|
AppID: "",
|
|
|
|
|
AppSecret: "",
|
|
|
|
|
AllowFrom: []string{},
|
|
|
|
|
AllowFrom: FlexibleStringSlice{},
|
|
|
|
|
},
|
|
|
|
|
DingTalk: DingTalkConfig{
|
|
|
|
|
Enabled: false,
|
|
|
|
|
ClientID: "",
|
|
|
|
|
ClientSecret: "",
|
|
|
|
|
AllowFrom: []string{},
|
|
|
|
|
AllowFrom: FlexibleStringSlice{},
|
|
|
|
|
},
|
|
|
|
|
Slack: SlackConfig{
|
|
|
|
|
Enabled: false,
|
|
|
|
|
|