Bump rubocop from 0.86.0 to 0.88.0 (#14412)
* Bump rubocop from 0.86.0 to 0.88.0 Bumps [rubocop](https://github.com/rubocop-hq/rubocop) from 0.86.0 to 0.88.0. - [Release notes](https://github.com/rubocop-hq/rubocop/releases) - [Changelog](https://github.com/rubocop-hq/rubocop/blob/master/CHANGELOG.md) - [Commits](https://github.com/rubocop-hq/rubocop/compare/v0.86.0...v0.88.0) Signed-off-by: dependabot[bot] <support@github.com> * Fix for latest RuboCop Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> Co-authored-by: Yamagishi Kazutoshi <ykzts@desire.sh>
This commit is contained in:
		| @@ -30,7 +30,7 @@ plugins: | ||||
|     channel: eslint-7 | ||||
|   rubocop: | ||||
|     enabled: true | ||||
|     channel: rubocop-0-82 | ||||
|     channel: rubocop-0-88 | ||||
|   sass-lint: | ||||
|     enabled: true | ||||
| exclude_patterns: | ||||
|   | ||||
							
								
								
									
										185
									
								
								.rubocop.yml
									
									
									
									
									
								
							
							
						
						
									
										185
									
								
								.rubocop.yml
									
									
									
									
									
								
							| @@ -25,30 +25,68 @@ Layout/AccessModifierIndentation: | ||||
| Layout/EmptyLineAfterMagicComment: | ||||
|   Enabled: false | ||||
|  | ||||
| Layout/EmptyLineAfterGuardClause: | ||||
|   Enabled: false | ||||
|  | ||||
| Layout/EmptyLinesAroundAttributeAccessor: | ||||
|   Enabled: true | ||||
|  | ||||
| Layout/HashAlignment: | ||||
|   Enabled: false | ||||
|   # EnforcedHashRocketStyle: table | ||||
|   # EnforcedColonStyle: table | ||||
|  | ||||
| Layout/SpaceAroundMethodCallOperator: | ||||
|   Enabled: true | ||||
|  | ||||
| Layout/SpaceInsideHashLiteralBraces: | ||||
|   EnforcedStyle: space | ||||
|  | ||||
| Lint/DeprecatedOpenSSLConstant: | ||||
|   Enabled: true | ||||
|  | ||||
| Lint/DuplicateElsifCondition: | ||||
|   Enabled: true | ||||
|  | ||||
| Lint/MixedRegexpCaptureTypes: | ||||
|   Enabled: true | ||||
|  | ||||
| Lint/RaiseException: | ||||
|   Enabled: true | ||||
|  | ||||
| Lint/StructNewOverride: | ||||
|   Enabled: true | ||||
|  | ||||
| Lint/UselessAccessModifier: | ||||
|   ContextCreatingMethods: | ||||
|     - class_methods | ||||
|  | ||||
| Metrics/AbcSize: | ||||
|   Max: 100 | ||||
|   Exclude: | ||||
|     - 'lib/mastodon/*_cli.rb' | ||||
|  | ||||
| Metrics/BlockLength: | ||||
|   Max: 35 | ||||
|   Max: 55 | ||||
|   Exclude: | ||||
|     - 'lib/tasks/**/*' | ||||
|     - 'lib/mastodon/*_cli.rb' | ||||
|  | ||||
| Metrics/BlockNesting: | ||||
|   Max: 3 | ||||
|   Exclude: | ||||
|     - 'lib/mastodon/*_cli.rb' | ||||
|  | ||||
| Metrics/ClassLength: | ||||
|   CountComments: false | ||||
|   Max: 300 | ||||
|   Max: 400 | ||||
|   Exclude: | ||||
|     - 'lib/mastodon/*_cli.rb' | ||||
|  | ||||
| Metrics/CyclomaticComplexity: | ||||
|   Max: 25 | ||||
|   Exclude: | ||||
|     - 'lib/mastodon/*_cli.rb' | ||||
|  | ||||
| Layout/LineLength: | ||||
|   AllowURI: true | ||||
| @@ -56,7 +94,9 @@ Layout/LineLength: | ||||
|  | ||||
| Metrics/MethodLength: | ||||
|   CountComments: false | ||||
|   Max: 55 | ||||
|   Max: 65 | ||||
|   Exclude: | ||||
|     - 'lib/mastodon/*_cli.rb' | ||||
|  | ||||
| Metrics/ModuleLength: | ||||
|   CountComments: false | ||||
| @@ -67,34 +107,90 @@ Metrics/ParameterLists: | ||||
|   CountKeywordArgs: true | ||||
|  | ||||
| Metrics/PerceivedComplexity: | ||||
|   Max: 20 | ||||
|   Max: 25 | ||||
|  | ||||
| Naming/MemoizedInstanceVariableName: | ||||
|   Enabled: false | ||||
|  | ||||
| Naming/MethodParameterName: | ||||
|   Enabled: true | ||||
|  | ||||
| Rails: | ||||
|   Enabled: true | ||||
|  | ||||
| Rails/ApplicationController: | ||||
|   Enabled: false | ||||
|   Exclude: | ||||
|     - 'app/controllers/well_known/**/*.rb' | ||||
|  | ||||
| Rails/BelongsTo: | ||||
|   Enabled: false | ||||
|  | ||||
| Rails/ContentTag: | ||||
|   Enabled: false | ||||
|  | ||||
| Rails/EnumHash: | ||||
|   Enabled: false | ||||
|  | ||||
| Rails/HasAndBelongsToMany: | ||||
|   Enabled: false | ||||
|  | ||||
| Rails/SkipsModelValidations: | ||||
|   Enabled: false | ||||
|  | ||||
| Rails/HttpStatus: | ||||
|   Enabled: false | ||||
|  | ||||
| Rails/Exit: | ||||
|   Exclude: | ||||
|     - 'lib/mastodon/*' | ||||
|     - 'lib/cli.rb' | ||||
|  | ||||
| Rails/FilePath: | ||||
|   Enabled: false | ||||
|  | ||||
| Rails/HasAndBelongsToMany: | ||||
|   Enabled: false | ||||
|  | ||||
| Rails/HasManyOrHasOneDependent: | ||||
|   Enabled: false | ||||
|  | ||||
| Rails/HelperInstanceVariable: | ||||
|   Enabled: false | ||||
|  | ||||
| Rails/HttpStatus: | ||||
|   Enabled: false | ||||
|  | ||||
| Rails/IndexBy: | ||||
|   Enabled: false | ||||
|  | ||||
| Rails/InverseOf: | ||||
|   Enabled: false | ||||
|  | ||||
| Rails/LexicallyScopedActionFilter: | ||||
|   Enabled: false | ||||
|  | ||||
| Rails/OutputSafety: | ||||
|   Enabled: true | ||||
|  | ||||
| Rails/RakeEnvironment: | ||||
|   Enabled: false | ||||
|  | ||||
| Rails/RedundantForeignKey: | ||||
|   Enabled: false | ||||
|  | ||||
| Rails/SkipsModelValidations: | ||||
|   Enabled: false | ||||
|  | ||||
| Rails/UniqueValidationWithoutIndex: | ||||
|   Enabled: false | ||||
|  | ||||
| Style/AccessorGrouping: | ||||
|   Enabled: true | ||||
|  | ||||
| Style/AccessModifierDeclarations: | ||||
|   Enabled: false | ||||
|  | ||||
| Style/ArrayCoercion: | ||||
|   Enabled: true | ||||
|  | ||||
| Style/BisectedAttrAccessor: | ||||
|   Enabled: true | ||||
|  | ||||
| Style/CaseLikeIf: | ||||
|   Enabled: false | ||||
|  | ||||
| Style/ClassAndModuleChildren: | ||||
|   Enabled: false | ||||
|  | ||||
| @@ -109,6 +205,15 @@ Style/Documentation: | ||||
| Style/DoubleNegation: | ||||
|   Enabled: true | ||||
|  | ||||
| Style/ExpandPathArguments: | ||||
|   Enabled: false | ||||
|  | ||||
| Style/ExponentialNotation: | ||||
|   Enabled: true | ||||
|  | ||||
| Style/FormatString: | ||||
|   Enabled: false | ||||
|  | ||||
| Style/FormatStringToken: | ||||
|   Enabled: false | ||||
|  | ||||
| @@ -118,9 +223,33 @@ Style/FrozenStringLiteralComment: | ||||
| Style/GuardClause: | ||||
|   Enabled: false | ||||
|  | ||||
| Style/HashAsLastArrayItem: | ||||
|   Enabled: false | ||||
|  | ||||
| Style/HashEachMethods: | ||||
|   Enabled: true | ||||
|  | ||||
| Style/HashLikeCase: | ||||
|   Enabled: true | ||||
|  | ||||
| Style/HashTransformKeys: | ||||
|   Enabled: true | ||||
|  | ||||
| Style/HashTransformValues: | ||||
|   Enabled: false | ||||
|  | ||||
| Style/IfUnlessModifier: | ||||
|   Enabled: false | ||||
|  | ||||
| Style/InverseMethods: | ||||
|   Enabled: false | ||||
|  | ||||
| Style/Lambda: | ||||
|   Enabled: false | ||||
|  | ||||
| Style/MutableConstant: | ||||
|   Enabled: false | ||||
|  | ||||
| Style/PercentLiteralDelimiters: | ||||
|   PreferredDelimiters: | ||||
|     '%i': '()' | ||||
| @@ -129,9 +258,36 @@ Style/PercentLiteralDelimiters: | ||||
| Style/PerlBackrefs: | ||||
|   AutoCorrect: false | ||||
|  | ||||
| Style/RedundantAssignment: | ||||
|   Enabled: false | ||||
|  | ||||
| Style/RedundantFetchBlock: | ||||
|   Enabled: true | ||||
|  | ||||
| Style/RedundantFileExtensionInRequire: | ||||
|   Enabled: true | ||||
|  | ||||
| Style/RedundantRegexpCharacterClass: | ||||
|   Enabled: false | ||||
|  | ||||
| Style/RedundantRegexpEscape: | ||||
|   Enabled: false | ||||
|  | ||||
| Style/RedundantReturn: | ||||
|   Enabled: true | ||||
|  | ||||
| Style/RegexpLiteral: | ||||
|   Enabled: false | ||||
|  | ||||
| Style/RescueStandardError: | ||||
|   Enabled: false | ||||
|  | ||||
| Style/SignalException: | ||||
|   Enabled: false | ||||
|  | ||||
| Style/SlicingWithRange: | ||||
|   Enabled: true | ||||
|  | ||||
| Style/SymbolArray: | ||||
|   Enabled: false | ||||
|  | ||||
| @@ -140,3 +296,6 @@ Style/TrailingCommaInArrayLiteral: | ||||
|  | ||||
| Style/TrailingCommaInHashLiteral: | ||||
|   EnforcedStyleForMultiline: 'comma' | ||||
|  | ||||
| Style/UnpackFirst: | ||||
|   Enabled: false | ||||
|   | ||||
							
								
								
									
										2
									
								
								Gemfile
									
									
									
									
									
								
							
							
						
						
									
										2
									
								
								Gemfile
									
									
									
									
									
								
							| @@ -140,7 +140,7 @@ group :development do | ||||
|   gem 'letter_opener', '~> 1.7' | ||||
|   gem 'letter_opener_web', '~> 1.4' | ||||
|   gem 'memory_profiler' | ||||
|   gem 'rubocop', '~> 0.86', require: false | ||||
|   gem 'rubocop', '~> 0.88', require: false | ||||
|   gem 'rubocop-rails', '~> 2.6', require: false | ||||
|   gem 'brakeman', '~> 4.9', require: false | ||||
|   gem 'bundler-audit', '~> 0.7', require: false | ||||
|   | ||||
| @@ -535,13 +535,13 @@ GEM | ||||
|     rspec-support (3.9.3) | ||||
|     rspec_junit_formatter (0.4.1) | ||||
|       rspec-core (>= 2, < 4, != 2.12.0) | ||||
|     rubocop (0.86.0) | ||||
|     rubocop (0.88.0) | ||||
|       parallel (~> 1.10) | ||||
|       parser (>= 2.7.0.1) | ||||
|       parser (>= 2.7.1.1) | ||||
|       rainbow (>= 2.2.2, < 4.0) | ||||
|       regexp_parser (>= 1.7) | ||||
|       rexml | ||||
|       rubocop-ast (>= 0.0.3, < 1.0) | ||||
|       rubocop-ast (>= 0.1.0, < 1.0) | ||||
|       ruby-progressbar (~> 1.7) | ||||
|       unicode-display_width (>= 1.4.0, < 2.0) | ||||
|     rubocop-ast (0.3.0) | ||||
| @@ -778,7 +778,7 @@ DEPENDENCIES | ||||
|   rspec-rails (~> 4.0) | ||||
|   rspec-sidekiq (~> 3.1) | ||||
|   rspec_junit_formatter (~> 0.4) | ||||
|   rubocop (~> 0.86) | ||||
|   rubocop (~> 0.88) | ||||
|   rubocop-rails (~> 2.6) | ||||
|   ruby-progressbar (~> 1.10) | ||||
|   sanitize (~> 5.2) | ||||
|   | ||||
| @@ -71,6 +71,7 @@ class Api::BaseController < ApplicationController | ||||
|  | ||||
|   def limit_param(default_limit) | ||||
|     return default_limit unless params[:limit] | ||||
|  | ||||
|     [params[:limit].to_i.abs, default_limit * 2].min | ||||
|   end | ||||
|  | ||||
|   | ||||
| @@ -32,7 +32,6 @@ module ChallengableConcern | ||||
|     if params.key?(:form_challenge) | ||||
|       if challenge_passed? | ||||
|         session[:challenge_passed_at] = Time.now.utc | ||||
|         return | ||||
|       else | ||||
|         flash.now[:alert] = I18n.t('challenge.invalid_password') | ||||
|         render_challenge | ||||
|   | ||||
| @@ -131,7 +131,7 @@ module SignatureVerification | ||||
|   end | ||||
|  | ||||
|   def verify_signature(account, signature, compare_signed_string) | ||||
|     if account.keypair.public_key.verify(OpenSSL::Digest::SHA256.new, signature, compare_signed_string) | ||||
|     if account.keypair.public_key.verify(OpenSSL::Digest.new('SHA256'), signature, compare_signed_string) | ||||
|       @signed_request_account = account | ||||
|       @signed_request_account | ||||
|     end | ||||
|   | ||||
| @@ -162,6 +162,8 @@ module ApplicationHelper | ||||
|     end | ||||
|  | ||||
|     json = ActiveModelSerializers::SerializableResource.new(InitialStatePresenter.new(state_params), serializer: InitialStateSerializer).to_json | ||||
|     # rubocop:disable Rails/OutputSafety | ||||
|     content_tag(:script, json_escape(json).html_safe, id: 'initial-state', type: 'application/json') | ||||
|     # rubocop:enable Rails/OutputSafety | ||||
|   end | ||||
| end | ||||
|   | ||||
| @@ -27,7 +27,7 @@ class ActivityPub::LinkedDataSignature | ||||
|     document_hash  = hash(@json.without('signature')) | ||||
|     to_be_verified = options_hash + document_hash | ||||
|  | ||||
|     if creator.keypair.public_key.verify(OpenSSL::Digest::SHA256.new, Base64.decode64(signature), to_be_verified) | ||||
|     if creator.keypair.public_key.verify(OpenSSL::Digest.new('SHA256'), Base64.decode64(signature), to_be_verified) | ||||
|       creator | ||||
|     end | ||||
|   end | ||||
| @@ -44,7 +44,7 @@ class ActivityPub::LinkedDataSignature | ||||
|     to_be_signed  = options_hash + document_hash | ||||
|     keypair       = sign_with.present? ? OpenSSL::PKey::RSA.new(sign_with) : creator.keypair | ||||
|  | ||||
|     signature = Base64.strict_encode64(keypair.sign(OpenSSL::Digest::SHA256.new, to_be_signed)) | ||||
|     signature = Base64.strict_encode64(keypair.sign(OpenSSL::Digest.new('SHA256'), to_be_signed)) | ||||
|  | ||||
|     @json.merge('signature' => options.merge('signatureValue' => signature)) | ||||
|   end | ||||
|   | ||||
| @@ -16,7 +16,7 @@ class EntityCache | ||||
|   end | ||||
|  | ||||
|   def emoji(shortcodes, domain) | ||||
|     shortcodes   = [shortcodes] unless shortcodes.is_a?(Array) | ||||
|     shortcodes   = Array(shortcodes) | ||||
|     cached       = Rails.cache.read_multi(*shortcodes.map { |shortcode| to_key(:emoji, shortcode, domain) }) | ||||
|     uncached_ids = [] | ||||
|  | ||||
|   | ||||
| @@ -135,6 +135,7 @@ class Formatter | ||||
|     end | ||||
|   end | ||||
|  | ||||
|   # rubocop:disable Metrics/BlockNesting | ||||
|   def encode_custom_emojis(html, emojis, animate = false) | ||||
|     return html if emojis.empty? | ||||
|  | ||||
| @@ -189,6 +190,7 @@ class Formatter | ||||
|  | ||||
|     html | ||||
|   end | ||||
|   # rubocop:enable Metrics/BlockNesting | ||||
|  | ||||
|   def rewrite(text, entities) | ||||
|     text = text.to_s | ||||
|   | ||||
| @@ -114,7 +114,7 @@ class Request | ||||
|  | ||||
|   def signature | ||||
|     algorithm = 'rsa-sha256' | ||||
|     signature = Base64.strict_encode64(@keypair.sign(OpenSSL::Digest::SHA256.new, signed_string)) | ||||
|     signature = Base64.strict_encode64(@keypair.sign(OpenSSL::Digest.new('SHA256'), signed_string)) | ||||
|  | ||||
|     "keyId=\"#{key_id}\",algorithm=\"#{algorithm}\",headers=\"#{signed_headers.keys.join(' ').downcase}\",signature=\"#{signature}\"" | ||||
|   end | ||||
|   | ||||
| @@ -17,8 +17,10 @@ class SidekiqErrorHandler | ||||
|  | ||||
|   private | ||||
|  | ||||
|   # rubocop:disable Naming/MethodParameterName | ||||
|   def limit_backtrace_and_raise(e) | ||||
|     e.set_backtrace(e.backtrace.first(BACKTRACE_LIMIT)) | ||||
|     raise e | ||||
|   end | ||||
|   # rubocop:enable Naming/MethodParameterName | ||||
| end | ||||
|   | ||||
| @@ -72,6 +72,7 @@ class PreviewCard < ApplicationRecord | ||||
|   class << self | ||||
|     private | ||||
|  | ||||
|     # rubocop:disable Naming/MethodParameterName | ||||
|     def image_styles(f) | ||||
|       styles = { | ||||
|         original: { | ||||
| @@ -85,6 +86,7 @@ class PreviewCard < ApplicationRecord | ||||
|       styles[:original][:format] = 'jpg' if f.instance.image_content_type == 'image/gif' | ||||
|       styles | ||||
|     end | ||||
|     # rubocop:enable Naming/MethodParameterName | ||||
|   end | ||||
|  | ||||
|   private | ||||
|   | ||||
| @@ -253,16 +253,16 @@ class User < ApplicationRecord | ||||
|     @shows_application ||= settings.show_application | ||||
|   end | ||||
|  | ||||
|   # rubocop:disable Naming/MethodParameterName | ||||
|   def token_for_app(a) | ||||
|     return nil if a.nil? || a.owner != self | ||||
|     Doorkeeper::AccessToken | ||||
|       .find_or_create_by(application_id: a.id, resource_owner_id: id) do |t| | ||||
|  | ||||
|     Doorkeeper::AccessToken.find_or_create_by(application_id: a.id, resource_owner_id: id) do |t| | ||||
|       t.scopes = a.scopes | ||||
|       t.expires_in = Doorkeeper.configuration.access_token_expires_in | ||||
|       t.use_refresh_token = Doorkeeper.configuration.refresh_token_enabled? | ||||
|     end | ||||
|   end | ||||
|   # rubocop:enable Naming/MethodParameterName | ||||
|  | ||||
|   def activate_session(request) | ||||
|     session_activations.activate(session_id: SecureRandom.hex, | ||||
| @@ -413,7 +413,7 @@ class User < ApplicationRecord | ||||
|   end | ||||
|  | ||||
|   def notify_staff_about_pending_account! | ||||
|     User.staff.includes(:account).each do |u| | ||||
|     User.staff.includes(:account).find_each do |u| | ||||
|       next unless u.allows_pending_account_emails? | ||||
|       AdminMailer.new_pending_account(u.account, self).deliver_later | ||||
|     end | ||||
|   | ||||
| @@ -78,6 +78,7 @@ class FetchLinkCardService < BaseService | ||||
|     uri.host.blank? || TagManager.instance.local_url?(uri.to_s) || !%w(http https).include?(uri.scheme) | ||||
|   end | ||||
|  | ||||
|   # rubocop:disable Naming/MethodParameterName | ||||
|   def mention_link?(a) | ||||
|     @status.mentions.any? do |mention| | ||||
|       a['href'] == ActivityPub::TagManager.instance.url_for(mention.account) | ||||
| @@ -88,6 +89,7 @@ class FetchLinkCardService < BaseService | ||||
|     # Avoid links for hashtags and mentions (microformats) | ||||
|     a['rel']&.include?('tag') || a['class']&.match?(/u-url|h-card/) || mention_link?(a) | ||||
|   end | ||||
|   # rubocop:enable Naming/MethodParameterName | ||||
|  | ||||
|   def attempt_oembed | ||||
|     service         = FetchOEmbedService.new | ||||
|   | ||||
| @@ -13,7 +13,9 @@ class NotifyService < BaseService | ||||
|     push_to_conversation! if direct_message? | ||||
|     send_email! if email_enabled? | ||||
|   rescue ActiveRecord::RecordInvalid | ||||
|     # rubocop:disable Style/RedundantReturn | ||||
|     return | ||||
|     # rubocop:enable Style/RedundantReturn | ||||
|   end | ||||
|  | ||||
|   private | ||||
|   | ||||
| @@ -12,8 +12,8 @@ class UpdateAccountService < BaseService | ||||
|       check_links(account) | ||||
|       process_hashtags(account) | ||||
|     end | ||||
|   rescue Mastodon::DimensionsValidationError, Mastodon::StreamValidationError => de | ||||
|     account.errors.add(:avatar, de.message) | ||||
|   rescue Mastodon::DimensionsValidationError, Mastodon::StreamValidationError => e | ||||
|     account.errors.add(:avatar, e.message) | ||||
|     false | ||||
|   end | ||||
|  | ||||
|   | ||||
| @@ -23,7 +23,7 @@ end | ||||
| setup_redis_env_url | ||||
| setup_redis_env_url(:cache, false) | ||||
|  | ||||
| namespace       = ENV.fetch('REDIS_NAMESPACE') { nil } | ||||
| namespace       = ENV.fetch('REDIS_NAMESPACE', nil) | ||||
| cache_namespace = namespace ? namespace + '_cache' : 'cache' | ||||
|  | ||||
| REDIS_CACHE_PARAMS = { | ||||
|   | ||||
| @@ -33,16 +33,16 @@ module Mastodon | ||||
|     end | ||||
|  | ||||
|     def repository | ||||
|       ENV.fetch('GITHUB_REPOSITORY') { 'tootsuite/mastodon' } | ||||
|       ENV.fetch('GITHUB_REPOSITORY', 'tootsuite/mastodon') | ||||
|     end | ||||
|  | ||||
|     def source_base_url | ||||
|       ENV.fetch('SOURCE_BASE_URL') { "https://github.com/#{repository}" } | ||||
|       ENV.fetch('SOURCE_BASE_URL', "https://github.com/#{repository}") | ||||
|     end | ||||
|  | ||||
|     # specify git tag or commit hash here | ||||
|     def source_tag | ||||
|       ENV.fetch('SOURCE_TAG') { nil } | ||||
|       ENV.fetch('SOURCE_TAG', nil) | ||||
|     end | ||||
|  | ||||
|     def source_url | ||||
|   | ||||
| @@ -89,7 +89,7 @@ module Paperclip | ||||
|       end | ||||
|     end | ||||
|  | ||||
|     # rubocop:disable Style/MethodParameterName | ||||
|     # rubocop:disable Naming/MethodParameterName | ||||
|     def rgb_to_hsl(r, g, b) | ||||
|       r /= 255.0 | ||||
|       g /= 255.0 | ||||
| @@ -156,7 +156,7 @@ module Paperclip | ||||
|  | ||||
|       [(r * 255).round, (g * 255).round, (b * 255).round] | ||||
|     end | ||||
|     # rubocop:enable Style/MethodParameterName | ||||
|     # rubocop:enable Naming/MethodParameterName | ||||
|  | ||||
|     def lighten_or_darken(color, by) | ||||
|       hue, saturation, light = rgb_to_hsl(color.r, color.g, color.b) | ||||
|   | ||||
		Reference in New Issue
	
	Block a user