package economy import ( "context" "errors" ) // FreePrivateTables سقفِ میزهای خصوصیِ رایگان برای کاربرِ غیر VIP. const FreePrivateTables = 5 // ErrTableLimit وقتی کاربرِ غیر VIP به سقفِ میزهای رایگان رسیده باشد. var ErrTableLimit = errors.New("free private table limit reached") // PrivateTableInfo باقیمانده‌ی میزهای رایگان و نامحدود بودن (VIP) را برمی‌گرداند. func (s *Service) PrivateTableInfo(ctx context.Context, userID int64) (remaining int, unlimited bool) { if s.isVIP(ctx, userID) { return 0, true } var used int _ = s.db.QueryRowContext(ctx, `SELECT free_tables_used FROM users WHERE id = ?`, userID).Scan(&used) rem := FreePrivateTables - used if rem < 0 { rem = 0 } return rem, false } // ConsumePrivateTable در صورت مجاز بودن، یک میز خصوصی را برای کاربر مصرف می‌کند. // برای VIP بدون محدودیت است؛ برای غیر VIP در صورت اتمامِ سقف خطا می‌دهد. func (s *Service) ConsumePrivateTable(ctx context.Context, userID int64) error { if s.isVIP(ctx, userID) { return nil } res, err := s.db.ExecContext(ctx, `UPDATE users SET free_tables_used = free_tables_used + 1 WHERE id = ? AND free_tables_used < ?`, userID, FreePrivateTables) if err != nil { return err } if n, _ := res.RowsAffected(); n == 0 { return ErrTableLimit } return nil }