Files
YaeMikoBot/database/psql/rp.go
2026-01-23 15:14:21 +03:00

136 lines
3.7 KiB
Go

package psql
import (
"database/sql"
"errors"
"kurumibot/laniakea"
"github.com/vinovest/sqlx"
)
type RPPreset struct {
ID string
Name string
Description string
PreHistory string `db:"pre_history"`
PostHistory string `db:"post_history"`
}
type RPScenario struct {
ID int
Name string
Description string
Prompt string
}
type RPModel struct {
ID string
Key string
Name string
ContextSize int `db:"context_size"`
}
type RPUser struct {
UserID int64 `db:"user_id"`
UserPrompt string `db:"user_prompt"`
SelectedPreset string `db:"selected_preset"`
Preset *RPPreset
SelectedModel string `db:"selected_model"`
Model *RPModel
UsedTokens int64 `db:"used_tokens"`
}
type RPRepository struct {
db *sqlx.DB
}
func NewRPRepository(db *laniakea.DatabaseContext) *RPRepository {
return &RPRepository{db: db.PostgresSQL}
}
func (rep *RPRepository) GetOrCreateUser(id int64) (*RPUser, error) {
user, err := rep.GetUser(id)
if errors.Is(err, sql.ErrNoRows) {
user, err = rep.CreateUser(id)
}
return user, err
}
func (rep *RPRepository) CreateUser(id int64) (*RPUser, error) {
user := new(RPUser)
err := rep.db.Get(user, "INSERT INTO rp_users(user_id) VALUES ($1) RETURNING *;", id)
if err != nil {
return user, err
}
user.Preset, err = rep.GetPreset(user.SelectedPreset)
if err != nil {
return user, err
}
user.Model, err = rep.GetModel(user.SelectedModel)
return user, err
}
func (rep *RPRepository) GetUser(id int64) (*RPUser, error) {
user := new(RPUser)
err := rep.db.Get(user, "SELECT * FROM rp_users WHERE user_id=$1", id)
if err != nil {
return user, err
}
user.Preset, err = rep.GetPreset(user.SelectedPreset)
if err != nil {
return user, err
}
user.Model, err = rep.GetModel(user.SelectedModel)
return user, err
}
func (rep *RPRepository) UpdateUser(user *RPUser) error {
_, err := rep.db.NamedExec(
"UPDATE rp_users SET selected_preset=:selected_preset, used_tokens=:used_tokens, user_prompt=:user_prompt, selected_model=:selected_model WHERE user_id=:user_id;",
user,
)
return err
}
func (rep *RPRepository) UpdateUserPreset(user *RPUser, presetId string) (*RPPreset, error) {
preset, err := rep.GetPreset(presetId)
if err != nil {
return preset, err
}
_, err = rep.db.Exec("UPDATE rp_users SET selected_preset=$1 WHERE user_id=$2;", presetId, user.UserID)
return preset, err
}
func (rep *RPRepository) GetUserPreset(user *RPUser) (*RPPreset, error) {
preset, err := rep.GetPreset(user.SelectedPreset)
if errors.Is(err, sql.ErrNoRows) {
return rep.UpdateUserPreset(user, "soft")
}
return preset, err
}
func (rep *RPRepository) GetAllPresets() ([]*RPPreset, error) {
presets := make([]*RPPreset, 0)
err := rep.db.Select(&presets, "SELECT * FROM rp_presets ORDER BY id;")
return presets, err
}
func (rep *RPRepository) GetPreset(id string) (*RPPreset, error) {
preset := new(RPPreset)
err := rep.db.Get(preset, "SELECT * FROM rp_presets WHERE id=$1;", id)
return preset, err
}
func (rep *RPRepository) GetAllScenarios() ([]*RPScenario, error) {
scenarios := make([]*RPScenario, 0)
err := rep.db.Select(&scenarios, "SELECT * FROM rp_scenarios ORDER BY id;")
return scenarios, err
}
func (rep *RPRepository) GetScenario(id int) (*RPScenario, error) {
scenario := new(RPScenario)
err := rep.db.Get(scenario, "SELECT * FROM rp_scenarios WHERE id=$1;", id)
return scenario, err
}
func (rep *RPRepository) GetModel(id string) (*RPModel, error) {
model := new(RPModel)
err := rep.db.Get(model, "SELECT * FROM rp_models WHERE id=$1;", id)
return model, err
}
func (rep *RPRepository) GetAllModels() ([]*RPModel, error) {
models := make([]*RPModel, 0)
err := rep.db.Select(&models, "SELECT * FROM rp_models ORDER BY id;")
return models, err
}