使用 leveldb 存储用户 token 和聊天记录

This commit is contained in:
RockYang
2023-03-27 18:27:33 +08:00
parent 6a38de7eaa
commit a6bab7b12d
15 changed files with 370 additions and 175 deletions

71
utils/config.go Normal file
View File

@@ -0,0 +1,71 @@
package utils
import (
"bytes"
"github.com/BurntSushi/toml"
"net/http"
logger2 "openai/logger"
"openai/types"
"os"
)
func NewDefaultConfig() *types.Config {
return &types.Config{
Listen: "0.0.0.0:5678",
ProxyURL: make([]string, 0),
Session: types.Session{
SecretKey: RandString(64),
Name: "CHAT_SESSION_ID",
Domain: "",
Path: "/",
MaxAge: 86400,
Secure: true,
HttpOnly: false,
SameSite: http.SameSiteLaxMode,
},
Chat: types.Chat{
ApiURL: "https://api.openai.com/v1/chat/completions",
ApiKeys: []string{""},
Model: "gpt-3.5-turbo",
MaxTokens: 1024,
Temperature: 0.9,
EnableContext: true,
},
EnableAuth: true,
}
}
var logger = logger2.GetLogger()
func LoadConfig(configFile string) (*types.Config, error) {
var config *types.Config
_, err := os.Stat(configFile)
if err != nil {
logger.Errorf("Error open config file: %s", err.Error())
config = NewDefaultConfig()
// save config
err := SaveConfig(config, configFile)
if err != nil {
return nil, err
}
return config, nil
}
_, err = toml.DecodeFile(configFile, &config)
if err != nil {
return nil, err
}
return config, err
}
func SaveConfig(config *types.Config, configFile string) error {
buf := new(bytes.Buffer)
encoder := toml.NewEncoder(buf)
if err := encoder.Encode(&config); err != nil {
return err
}
return os.WriteFile(configFile, buf.Bytes(), 0644)
}

63
utils/leveldb.go Normal file
View File

@@ -0,0 +1,63 @@
package utils
import (
"encoding/json"
"github.com/syndtr/goleveldb/leveldb"
"github.com/syndtr/goleveldb/leveldb/util"
)
type LevelDB struct {
driver *leveldb.DB
}
func NewLevelDB(path string) (*LevelDB, error) {
db, err := leveldb.OpenFile(path, nil)
if err != nil {
return nil, err
}
return &LevelDB{
driver: db,
}, nil
}
func (db *LevelDB) Put(key string, value interface{}) error {
bytes, err := json.Marshal(value)
if err != nil {
return err
}
return db.driver.Put([]byte(key), bytes, nil)
}
func (db *LevelDB) Get(key string) (interface{}, error) {
bytes, err := db.driver.Get([]byte(key), nil)
if err != nil {
return nil, err
}
var value interface{}
err = json.Unmarshal(bytes, &value)
if err != nil {
return nil, err
}
return value, nil
}
func (db *LevelDB) Search(prefix string) []string {
var items = make([]string, 0)
iter := db.driver.NewIterator(util.BytesPrefix([]byte(prefix)), nil)
for iter.Next() {
items = append(items, string(iter.Value()))
}
iter.Release()
return items
}
func (db *LevelDB) Delete(key string) error {
return db.driver.Delete([]byte(key), nil)
}
// Close release resources
func (db *LevelDB) Close() error {
return db.driver.Close()
}

View File

@@ -2,6 +2,7 @@ package utils
import (
"math/rand"
"openai/types"
"strconv"
"strings"
"time"
@@ -31,7 +32,7 @@ func IsBlank(value string) bool {
return len(strings.TrimSpace(value)) == 0
}
func ContainsItem(slice []string, item string) bool {
func ContainsStr(slice []string, item string) bool {
for _, e := range slice {
if e == item {
return true
@@ -39,3 +40,12 @@ func ContainsItem(slice []string, item string) bool {
}
return false
}
func ContainToken(slice []types.Token, token string) bool {
for _, e := range slice {
if e.Name == token {
return true
}
}
return false
}