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.NewCommand(uploadPhoto, "uploadPhoto").SkipCommandAutoGen() p.NewCommand(emojiId, "emojiId").SkipCommandAutoGen() p.NewCommand(execSql, "sql").SkipCommandAutoGen() p.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.AnswerfMarkdown("```json\n%s\n```", 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.SendPhoto(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) }