package plugins import ( "encoding/json" "path/filepath" "strings" "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.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 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)) }