This commit is contained in:
2026-01-14 14:29:03 +03:00
parent 7d540962a1
commit 4dd87ddecc
17 changed files with 513 additions and 226 deletions

View File

@@ -2,7 +2,6 @@ package plugins
import (
"fmt"
"kurumibot/database"
"kurumibot/database/psql"
"kurumibot/utils"
"math"
@@ -35,12 +34,12 @@ func RegisterEconomy(bot *laniakea.Bot) {
bot.AddPlugins(economy.Build())
}
func about(msgCtx *laniakea.MsgContext, _ *laniakea.DatabaseContext) {
func about(ctx *laniakea.MsgContext, _ *laniakea.DatabaseContext) {
out := []string{
fmt.Sprintf("Go: %s", "1.25.5"),
fmt.Sprintf("Версия laniakea: %s", laniakea.VersionString),
}
msgCtx.Answer(strings.Join(out, "\n"))
ctx.Answer(strings.Join(out, "\n"))
}
func passiveIncome(b *laniakea.Bot) {
@@ -95,7 +94,7 @@ func passiveIncome(b *laniakea.Bot) {
user.MoneyIncome = user.MoneyIncome.Add(moneyIncome)
user.BtcIncome = user.BtcIncome.Add(btcIncome)
user.IncomeTime = time.Now().Add(-time.Hour * 2)
database.PostgresDatabase.Save(user)
psql.UpdateUser(user)
b.Logger().Debug(fmt.Sprintf("У %d было пассивно собрано. След. сбор через час\n", user.ID))
}
@@ -103,9 +102,9 @@ func passiveIncome(b *laniakea.Bot) {
}
func profile(ctx *laniakea.MsgContext, _ *laniakea.DatabaseContext) {
user, err := psql.GetOrCreateUser(ctx.FromID, ctx.Update.Message.From.FirstName)
user, err := psql.GetOrCreateUser(ctx.FromID, ctx.Msg.From.FirstName)
if err != nil {
ctx.Answer(err.Error())
ctx.Error(err)
return
}
@@ -187,12 +186,16 @@ func work(ctx *laniakea.MsgContext, _ *laniakea.DatabaseContext) {
}
user.Exp += int(expToAdd.IntPart())
user.Balance = user.Balance.Add(moneyToAdd)
user.WorkTime = time.Now()
user.WorkTime = time.Now().Add(-time.Hour * 3)
user.Level, _ = psql.CountLevel(user.Exp)
database.PostgresDatabase.Save(user)
_, err = psql.UpdateUser(user)
if err != nil {
ctx.Error(err)
return
}
ctx.Answer(fmt.Sprintf(
"Ты заработал %s¥ и %d опыта.\nПриходи через 10 минут.",
utils.DecimalComma(&work.MoneyIncome),
utils.DecimalComma(&moneyToAdd),
expToAdd.IntPart(),
))
}
@@ -281,7 +284,7 @@ func collect(ctx *laniakea.MsgContext, _ *laniakea.DatabaseContext) {
user.BTC = user.BTC.Add(btcIncome)
user.IncomeTime = time.Now()
database.PostgresDatabase.Save(user)
psql.UpdateUser(user)
out := []string{
fmt.Sprintf("Ты собрал %s.", strings.Join(incomeText, ", ")),
@@ -345,8 +348,7 @@ func getAJob(ctx *laniakea.MsgContext, db *laniakea.DatabaseContext) {
return
}
user.WorkID = workId
user.Work = work
db.PostgresSQL.Save(user)
psql.UpdateUser(user)
ctx.Answer("Ты успешно устроился на работу!")
}

View File

@@ -1,6 +1,8 @@
package plugins
import (
"database/sql"
"errors"
"fmt"
"kurumibot/database/mdb"
"kurumibot/database/psql"
@@ -14,10 +16,12 @@ import (
"github.com/google/uuid"
)
func RegisterTestRP(bot *laniakea.Bot) {
func RegisterRP(bot *laniakea.Bot) {
rp := laniakea.NewPlugin("RP")
rp = rp.Command(selectWaifu, "rpwaifu", "рпвайфу")
rp = rp.Payload(selectWaifu, "rp.selwaifu")
rp = rp.Command(rpPresetsList, "rpplist")
rp = rp.Command(rpPresetSet, "rppset")
rp = rp.Command(newChat, "newchat")
rp = rp.Command(generate, "g", "gen", "г")
@@ -38,7 +42,41 @@ func selectWaifu(ctx *laniakea.MsgContext, db *laniakea.DatabaseContext) {
ctx.Answer(fmt.Sprintf("Была выбрана вайфу %d", waifuId))
}
func rpPresetsList(ctx *laniakea.MsgContext, db *laniakea.DatabaseContext) {
rep := psql.NewRPRepository(db.PostgresSQL)
presets, err := rep.GetAllPresets()
if err != nil {
ctx.Error(err)
return
}
out := make([]string, len(presets))
for i, preset := range presets {
out[i] = fmt.Sprintf("%s) *%s*\n%s", preset.ID, preset.Name, preset.Description)
}
ctx.Answer(strings.Join(out, "\n"))
}
func rpPresetSet(ctx *laniakea.MsgContext, db *laniakea.DatabaseContext) {
if len(ctx.Args) == 0 || ctx.Args[0] == "" {
return
}
presetId := ctx.Args[0]
rep := psql.NewRPRepository(db.PostgresSQL)
user, err := rep.GetOrCreateUser(int64(ctx.FromID))
if err != nil {
ctx.Error(err)
return
}
preset, err := rep.UpdateUserPreset(user, presetId)
if err != nil {
if errors.Is(err, sql.ErrNoRows) {
ctx.Answer("Данный пресет не найден")
} else {
ctx.Error(err)
}
return
}
ctx.Answer(fmt.Sprintf("Был выбран пресет %s", preset.Name))
}
func newChat(ctx *laniakea.MsgContext, db *laniakea.DatabaseContext) {
waifuId := red.RPGetSelectedWaifu(db, ctx.FromID)
if waifuId == 0 {
@@ -86,11 +124,23 @@ func generate(ctx *laniakea.MsgContext, db *laniakea.DatabaseContext) {
ctx.Error(err)
return
}
rpRep := psql.NewRPRepository(db.PostgresSQL)
rpUser, err := rpRep.GetUser(int64(ctx.FromID))
if err != nil {
ctx.Error(err)
return
}
preset, err := rpRep.GetUserPreset(rpUser)
if err != nil {
ctx.Error(err)
return
}
systemPrompt := ai.Message{
Role: "system",
Content: fmt.Sprintf(
"%s %s %s",
ai.FormatPrompt(ai.PreHistoryPrompt, waifu.Name, ctx.Msg.From.FirstName),
ai.FormatPrompt(preset.PreHistory, waifu.Name, ctx.Msg.From.FirstName),
fmt.Sprintf("Вот краткое описание твоего персонажа: %s", waifu.RpPrompt),
red.RPGetChatPrompt(db, ctx.FromID, waifuId),
),
@@ -112,7 +162,7 @@ func generate(ctx *laniakea.MsgContext, db *laniakea.DatabaseContext) {
api := ai.NewOpenAIAPI(ai.CosmoRPUrl, os.Getenv("PAWAN_KEY"), "cosmorp-2.5")
userMessage := strings.Join(ctx.Args, " ")
messages = append(messages, ai.Message{
Role: "system", Content: ai.FormatPrompt(ai.PostHistoryPrompt, waifu.Name, ctx.Msg.From.FirstName),
Role: "system", Content: ai.FormatPrompt(preset.PostHistory, waifu.Name, ctx.Msg.From.FirstName),
}, ai.Message{
Role: "user", Content: userMessage,
})
@@ -121,6 +171,7 @@ func generate(ctx *laniakea.MsgContext, db *laniakea.DatabaseContext) {
ctx.Error(err)
return
}
m := ctx.Answer("Генерация запущена...")
res, err := api.CreateCompletion(ai.CreateCompletionReq{
Messages: append([]ai.Message{systemPrompt}, messages...),
@@ -137,6 +188,12 @@ func generate(ctx *laniakea.MsgContext, db *laniakea.DatabaseContext) {
response = append(response, m.Content)
err = mdb.UpdateChatHistory(db, chatId, m.Role, m.Content)
}
rpUser.UsedTokens = rpUser.UsedTokens + res.Usage.TotalTokens
err = rpRep.UpdateUser(rpUser)
if err != nil {
ctx.Error(err)
return
}
m.Delete()
ctx.Answer(laniakea.EscapeMarkdown(strings.Join(response, "\n")))