Files
YaeMikoBot/plugins/admin.go
2026-03-02 00:58:43 +03:00

116 lines
2.7 KiB
Go

package plugins
import (
"encoding/json"
"fmt"
"path/filepath"
"strings"
"time"
"ymgb/database"
"ymgb/database/psql"
"git.nix13.pw/scuroneko/laniakea"
"git.nix13.pw/scuroneko/laniakea/tgapi"
"git.nix13.pw/scuroneko/laniakea/utils"
"github.com/vinovest/sqlx"
)
func RegisterAdmin() *laniakea.Plugin[database.Context] {
p := laniakea.NewPlugin[database.Context]("Admin")
p.AddCommand(laniakea.NewCommand(uploadPhoto, "uploadPhoto").SkipCommandAutoGen())
p.AddCommand(laniakea.NewCommand(emojiId, "emojiId").SkipCommandAutoGen())
p.AddCommand(laniakea.NewCommand(execSql, "sql").SkipCommandAutoGen())
p.AddCommand(laniakea.NewCommand(test, "test").SkipCommandAutoGen())
p.AddMiddleware(AdminMiddleware())
return p
}
func AdminMiddleware() laniakea.Middleware[database.Context] {
m := laniakea.NewMiddleware("AdminMiddleware", func(ctx *laniakea.MsgContext, db *database.Context) bool {
rep := psql.NewUserRepository(db)
u, err := rep.GetById(ctx.FromID)
if err != nil {
return false
}
return u.Group.IsAdmin
})
return *m
}
func test(ctx *laniakea.MsgContext, _ *database.Context) {
draft := ctx.NewDraft()
for i := 0; i < 10; i++ {
err := draft.Push(fmt.Sprintf("%d", i))
if err != nil {
ctx.Error(err)
return
}
time.Sleep(1 * time.Second)
}
}
func execSql(ctx *laniakea.MsgContext, db *database.Context) {
stmt := strings.Join(ctx.Args, " ")
stmt = db.Postgres.Rebind(stmt)
var res []map[string]any
r, err := db.Postgres.Query(stmt)
if err != nil {
ctx.Error(err)
return
}
defer r.Close()
for r.Next() {
a := make(map[string]any)
if err = sqlx.MapScan(r, a); err != nil {
ctx.Error(err)
return
}
res = append(res, a)
}
data, err := json.MarshalIndent(res, "", " ")
if err != nil {
ctx.Error(err)
return
}
ctx.Answerf("`%s`", data)
}
func emojiId(ctx *laniakea.MsgContext, _ *database.Context) {
var id string
for _, e := range ctx.Msg.Entities {
if e.Type != tgapi.MessageEntityCustomEmoji {
continue
}
id = e.CustomEmojiID
break
}
ctx.Answer(id)
}
func uploadPhoto(ctx *laniakea.MsgContext, _ *database.Context) {
ctx.SendAction(tgapi.ChatActionUploadPhoto)
photoId := ctx.Msg.Photo.Last().FileID
f, err := ctx.Api.GetFile(tgapi.GetFileP{FileId: photoId})
if err != nil {
ctx.Error(err)
return
}
u := tgapi.NewUploader(ctx.Api)
defer u.Close()
content, err := ctx.Api.GetFileByLink(f.FilePath)
if err != nil {
ctx.Error(err)
return
}
filename := filepath.Base(f.FilePath)
msg, err := u.UploadPhoto(tgapi.UploadPhotoP{
ChatID: ctx.Msg.Chat.ID,
Caption: ctx.Msg.Caption,
}, tgapi.NewUploaderFile(filename, content))
if err != nil {
ctx.Error(err)
return
}
ctx.Answer(utils.EscapeMarkdown(msg.Photo.Last().FileID))
}