120 lines
2.7 KiB
Go
120 lines
2.7 KiB
Go
package plugins
|
|
|
|
import (
|
|
"database/sql"
|
|
"encoding/json"
|
|
"fmt"
|
|
"path/filepath"
|
|
"strings"
|
|
"time"
|
|
"ymgb/database"
|
|
"ymgb/database/psql"
|
|
|
|
"git.nix13.pw/scuroneko/laniakea"
|
|
"git.nix13.pw/scuroneko/laniakea/tgapi"
|
|
"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 func(r *sql.Rows) {
|
|
_ = r.Close()
|
|
}(r)
|
|
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 func(u *tgapi.Uploader) {
|
|
_ = u.Close()
|
|
}(u)
|
|
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(msg.Photo.Last().FileID)
|
|
}
|