diff --git a/Rakefile b/Rakefile index 2c36ccb..d7d0c43 100644 --- a/Rakefile +++ b/Rakefile @@ -31,7 +31,7 @@ module ARConfig DatabaseTasks.db_dir = File.join(__dir__, *%w[lib qbot db]) DatabaseTasks.root = __dir__ - DatabaseTasks.migrations_paths = \ + DatabaseTasks.migrations_paths = File.join(__dir__, *%w[lib qbot db migrate]) DatabaseTasks.database_configuration = { development: db_config } diff --git a/lib/qbot/arch_repos.rb b/lib/qbot/arch_repos.rb index 35e2099..9764ccb 100644 --- a/lib/qbot/arch_repos.rb +++ b/lib/qbot/arch_repos.rb @@ -72,10 +72,10 @@ def clear end end - IndexEntry = Data.define(:name, :description) do + IndexEntry = Data.define(:name, :description) { alias_method :id, :name alias_method :name_tok, :name - end + } Package = Struct.new( 'Package', @@ -123,10 +123,10 @@ class DB private def parse_desc(desc) field_re = /(?>%(\w+)%\n)((?:[^\n]+\n)+)/m - options = \ + options = desc - .enum_for(:scan, field_re) - .each_with_object({}) { |(k, v), pkg| + .enum_for(:scan, field_re) + .each_with_object({}) { |(k, v), pkg| pkg[k.downcase.to_sym] = v.strip } @@ -140,11 +140,7 @@ class DB end private def parse_tar(tar) - tar - .lazy - .filter { tar_entry_pred _1 } - .map { parse_desc(_1.read) } - .force + tar.lazy.filter { tar_entry_pred _1 }.map { parse_desc(_1.read) }.force end def populate_data(io) diff --git a/lib/qbot/aur.rb b/lib/qbot/aur.rb index 499f5c7..a183b52 100644 --- a/lib/qbot/aur.rb +++ b/lib/qbot/aur.rb @@ -1,2 +1 @@ -url = "https://aur.archlinux.org/packages-meta-ext-v1.json.gz" - +'https://aur.archlinux.org/packages-meta-ext-v1.json.gz' diff --git a/lib/qbot/breaking_wrap.rb b/lib/qbot/breaking_wrap.rb index 244106d..86e9e75 100644 --- a/lib/qbot/breaking_wrap.rb +++ b/lib/qbot/breaking_wrap.rb @@ -7,12 +7,22 @@ def self.breaking_word_wrap(text, *args) options = args.extract_options! options[:line_width] = args[0] || 80 unless args.blank? options.reverse_merge!(line_width: 80) - text = text.split(' ').collect do |word| - word.length > options[:line_width] ? word.gsub(/(.{1,#{options[:line_width]}})/, '\\1 ') : word - end * ' ' - text.split("\n").collect do |line| - line.length > options[:line_width] ? line.gsub(/(.{1,#{options[:line_width]}})(\s+|$)/, "\\1\n").strip : line - end * "\n" + text = text.split(' ').collect { |word| + if word.length > options[:line_width] + word.gsub(/(.{1,#{options[:line_width]}})/, '\\1 ') + else + word + end + } * ' ' + text.split("\n").collect { |line| + if line.length > options[:line_width] + line.gsub( + /(.{1,#{options[:line_width]}})(\s+|$)/, "\\1\n" + ).strip + else + line + end + } * "\n" end # rubocop: enable Metrics/AbcSize end diff --git a/lib/qbot/db/concerns/configurable/option.rb b/lib/qbot/db/concerns/configurable/option.rb index 0c07b78..d098432 100644 --- a/lib/qbot/db/concerns/configurable/option.rb +++ b/lib/qbot/db/concerns/configurable/option.rb @@ -9,7 +9,7 @@ module Configurable class Option attr_reader :root, :name, :type, :path, :default - def initialize(root, name, type, default: nil, &block) + def initialize(root, name, type, default: nil, &) @root = root @name = name @path = [*root, name] @@ -19,7 +19,7 @@ def initialize(root, name, type, default: nil, &block) @hooks = Hash.new { |h, k| h[k] = [] } - instance_eval(&block) if block_given? + instance_eval(&) if block_given? end def add_hook(type, &hook) diff --git a/lib/qbot/db/concerns/configurable/option_types.rb b/lib/qbot/db/concerns/configurable/option_types.rb index 136dd92..d091c98 100644 --- a/lib/qbot/db/concerns/configurable/option_types.rb +++ b/lib/qbot/db/concerns/configurable/option_types.rb @@ -122,7 +122,7 @@ def format_value(value) if @format Kernel.format(FORMATS[@format], value) else - super(value) + super end end diff --git a/lib/qbot/db/migrate/20230424_create_delayed_jobs.rb b/lib/qbot/db/migrate/20230424_create_delayed_jobs.rb index c540778..9b701e6 100644 --- a/lib/qbot/db/migrate/20230424_create_delayed_jobs.rb +++ b/lib/qbot/db/migrate/20230424_create_delayed_jobs.rb @@ -17,11 +17,10 @@ def self.up table.timestamps null: true end - add_index :delayed_jobs, [:priority, :run_at], name: "delayed_jobs_priority" + add_index :delayed_jobs, %i[priority run_at], name: 'delayed_jobs_priority' end def self.down drop_table :delayed_jobs end end - diff --git a/lib/qbot/db/models/note.rb b/lib/qbot/db/models/note.rb index fcaf50a..6b28770 100644 --- a/lib/qbot/db/models/note.rb +++ b/lib/qbot/db/models/note.rb @@ -18,9 +18,7 @@ def self.page_index_valid?(index, ...) end def self.find_random!(query) - where(name: query.downcase) - .order('RANDOM()') - .take! + where(name: query.downcase).order('RANDOM()').take! end scope :page, ->(index, size: PAGE_SIZE) { limit(size).offset(index * size) } diff --git a/lib/qbot/db/schema.rb b/lib/qbot/db/schema.rb index 885c203..c3233dd 100644 --- a/lib/qbot/db/schema.rb +++ b/lib/qbot/db/schema.rb @@ -80,8 +80,8 @@ def self.define_schema end add_index :delayed_jobs, - %i[priority run_at], - name: 'delayed_jobs_priority' + %i[priority run_at], + name: 'delayed_jobs_priority' add_index :server_configs, :server_id, unique: true add_index :user_configs, :user_id, unique: true diff --git a/lib/qbot/global_config.rb b/lib/qbot/global_config.rb index a635828..94ac148 100644 --- a/lib/qbot/global_config.rb +++ b/lib/qbot/global_config.rb @@ -51,11 +51,7 @@ def self.parse_from_hash(hash) end def self.read_from_file(path) - yaml = YAML.load_file( - path, - aliases: true, - symbolize_names: true - ) + yaml = YAML.load_file(path, aliases: true, symbolize_names: true) raise 'Invalid config path' unless yaml diff --git a/lib/qbot/helpers.rb b/lib/qbot/helpers.rb index 8149c73..2edc9ef 100644 --- a/lib/qbot/helpers.rb +++ b/lib/qbot/helpers.rb @@ -18,7 +18,8 @@ def log_embed(event, channel, user, extra) m.title = 'Command execution' m.fields = [ - { name: 'Command', value: event.message.to_s.truncate(1024), inline: true }, + { name: 'Command', value: event.message.to_s.truncate(1024), + inline: true }, { name: 'User ID', value: user.id, inline: true } ] diff --git a/lib/qbot/hooks.rb b/lib/qbot/hooks.rb index 7e8f883..cb289c2 100644 --- a/lib/qbot/hooks.rb +++ b/lib/qbot/hooks.rb @@ -13,7 +13,8 @@ class CommandBot # rubocop: disable Style/OptionalBooleanParameter - def execute_command(name, event, arguments, chained = false, check_permissions = true) + def execute_command(name, event, arguments, chained = false, + check_permissions = true) # Set the user's locale for response strings uc_lang = UserConfig.for(event.user.id)[:language].to_sym I18n.locale = uc_lang diff --git a/lib/qbot/init.rb b/lib/qbot/init.rb index 94a6bbd..75cd50e 100644 --- a/lib/qbot/init.rb +++ b/lib/qbot/init.rb @@ -34,7 +34,8 @@ def self.init_log def self.print_logo(version) logo = File.read File.join(__dir__, *%w[.. .. share logo.txt]) - puts "\n#{logo.chomp} #{Paint["version #{version}", :italic, :bright, :gray]}\n\n" + puts "\n#{logo.chomp} #{Paint["version #{version}", :italic, :bright, + :gray]}\n\n" @log.info "starting up qbot, version #{version}" end @@ -45,9 +46,7 @@ def self.init_config end def self.init_delayed_jobs - @worker = Delayed::Worker.new( - exit_on_complete: false - ) + @worker = Delayed::Worker.new(exit_on_complete: false) @worker_thread = Thread.new do @worker.start @@ -116,7 +115,7 @@ def self.run! @bot.sync end # rubocop: enable Metrics/MethodLength, Metrics/AbcSize - + def self.stop @worker.stop @scheduler.shutdown(:wait) diff --git a/lib/qbot/options.rb b/lib/qbot/options.rb index 24bb5a4..4572827 100644 --- a/lib/qbot/options.rb +++ b/lib/qbot/options.rb @@ -28,21 +28,21 @@ def define_options(parser) def config_option(parser) parser.on('-c', '--config ', String, - "Specify location of the config file (default #{@config_path})") do |path| + "Specify location of the config file (default #{@config_path})") do |path| @config_path = path end end def state_dir_option(parser) parser.on('-s', '--state-dir ', String, - 'Set the directory where state, such as databases, will be stored') do |dir| + 'Set the directory where state, such as databases, will be stored') do |dir| @state_dir = dir end end def console_option(parser) parser.on('-n', '--no-console', - 'Do not start the qbot console') do |_nc| + 'Do not start the qbot console') do |_nc| @no_console = true end end diff --git a/lib/qbot/patches.rb b/lib/qbot/patches.rb index d690ec8..3517916 100644 --- a/lib/qbot/patches.rb +++ b/lib/qbot/patches.rb @@ -14,7 +14,8 @@ module Events module Respondable def respond_wrapped(content, tts: false, embed: nil, attachments: nil, allowed_mentions: nil, message_reference: nil, components: nil) - send_message(content, tts, embed, attachments, allowed_mentions, message_reference, components) + send_message(content, tts, embed, attachments, allowed_mentions, + message_reference, components) end end # rubocop: enable Metrics/ParameterLists @@ -37,9 +38,11 @@ module CommandEventIntercept # rubocop: disable Style/OptionalBooleanParameter def call(event, arguments, chained = false, check_permissions = true) # rubocop:enable Style/OptionalBooleanParameter - return if event.author.bot_account && !(QBot.config.bot_id_allowlist.include? event.author.id) + if event.author.bot_account && !(QBot.config.bot_id_allowlist.include? event.author.id) + return + end - super(event, arguments, chained, check_permissions) + super end end diff --git a/lib/qbot/sitelenpona.rb b/lib/qbot/sitelenpona.rb index 1adc519..eeaaee2 100644 --- a/lib/qbot/sitelenpona.rb +++ b/lib/qbot/sitelenpona.rb @@ -54,8 +54,8 @@ def self.gen_markup(text, options) PANGO end - def self.draw_text(text, options = nil, **kwargs) - options ||= DrawOptions.new(**kwargs) + def self.draw_text(text, options = nil, **) + options ||= DrawOptions.new(**) markup = gen_markup(text, options) image = generate_image(markup, options) diff --git a/lib/qbot/xkcd.rb b/lib/qbot/xkcd.rb index 94498df..6e7ec2e 100644 --- a/lib/qbot/xkcd.rb +++ b/lib/qbot/xkcd.rb @@ -12,8 +12,8 @@ class XKCD def self.random_id URI.open('https://dynamic.xkcd.com/random/comic/', allow_redirections: :all) - .base_uri.to_s - .split('/').last.to_i + .base_uri.to_s + .split('/').last.to_i end def self.parse_info(io) = JSON.parse(io.read).symbolize_keys diff --git a/modules/admin.rb b/modules/admin.rb index 28c159a..f9c5561 100644 --- a/modules/admin.rb +++ b/modules/admin.rb @@ -4,8 +4,8 @@ ServerConfig.extend_schema do column_option :prefix, - TString.new(min_size: 1, max_size: 32), - default: QBot.config.default_prefix + TString.new(min_size: 1, max_size: 32), + default: QBot.config.default_prefix column_option :log_channel_id, TSnowflake.new(format: :channel) do on_save do |_, value, event, *| @@ -13,7 +13,6 @@ foreign = new_channel.server != event.server raise ArgumentError, t('cfg.log-channel.set.other-server') if foreign - rescue Discordrb::Errors::UnknownChannel # UnknownChannel raised for invalid channel IDs embed t('cfg.log-channel.set.invalid-id', new_id) diff --git a/modules/admin/config_ui.rb b/modules/admin/config_ui.rb index a12f268..c7ac8af 100644 --- a/modules/admin/config_ui.rb +++ b/modules/admin/config_ui.rb @@ -68,7 +68,8 @@ def self.option_fields(cfg, option) def self.option_help(cfg, option) embed do |m| - m.title = t('cfg.help.option.title', option.localized_name, option.ui_path) + m.title = t('cfg.help.option.title', option.localized_name, + option.ui_path) m.description = option.description m.fields = option_fields(cfg, option) @@ -97,9 +98,7 @@ def self.option_set_success_embed(option, val, clear: false) m.title = t('cfg.set.success.title', option.ui_path) unless clear m.title = t('cfg.set.success.clear-title', option.ui_path) if clear - m.fields = [ - { name: t('cfg.set.success.new-value'), value: val_text } - ] + m.fields = [{ name: t('cfg.set.success.new-value'), value: val_text }] m.footer = cfg_footer end @@ -121,13 +120,13 @@ def self.option_clear(cfg, option, *) option_set_success_embed(option, val, clear: true) end - def self.option_op(cfg, option, cmd, *args) + def self.option_op(cfg, option, cmd, *) verbs = %w[set clear reset] verb = verbs.abbrev[cmd] case verb when 'set' - option_set(cfg, option, *args) + option_set(cfg, option, *) when 'clear', 'reset' option_clear(cfg, option) else diff --git a/modules/colors.rb b/modules/colors.rb index 3ef5283..0be6b29 100644 --- a/modules/colors.rb +++ b/modules/colors.rb @@ -6,8 +6,8 @@ option :use_bare_colors, TBoolean.new, default: false option :auto_assign_colors, - TEnum.new(%w[on_join on_screening_pass never]), - default: 'on_join' + TEnum.new(%w[on_join on_screening_pass never]), + default: 'on_join' end # rubocop: disable Metrics/ModuleLength @@ -54,7 +54,7 @@ def self.assign_color_role(member, new_role) max_args: 1 } do |event, target| is_valid = Colors.hex_code?(target) - next embed t('colors.closest.invalid-hex', target) unless is_valid + next embed t('colors.closest.invalid-hex', target) unless is_valid closest = ColorRole.find_closest_on(server, target) embed t('colors.closest.found', closest.hex_code) @@ -161,8 +161,7 @@ def initialize(old_count) end def show_role_delete!(role, index) - message = \ - t('colors.ccr.deleted', index, @old_count, role.name) + message = t('colors.ccr.deleted', index, @old_count, role.name) @embeds[:deleting][:description] += "#{message}\n" @@ -183,7 +182,7 @@ def begin_create_stage!(count) end def show_role_create!(role, index) - message = \ + message = t('colors.ccr.created', index, @new_count, role.mention, role.hex_code) @embeds[:creating][:description] += "#{message}\n" diff --git a/modules/help.rb b/modules/help.rb index 550ff7e..ce096c7 100644 --- a/modules/help.rb +++ b/modules/help.rb @@ -86,8 +86,8 @@ def self.embed_compact long_desc = names - .map { "`#{prefixed(_1)}` - #{t("descriptions.#{_1}")}" } - .join("\n") + .map { "`#{prefixed(_1)}` - #{t("descriptions.#{_1}")}" } + .join("\n") embed do |m| m.title = t('help.list-title') diff --git a/modules/notes.rb b/modules/notes.rb index 20789ca..9b09ebe 100644 --- a/modules/notes.rb +++ b/modules/notes.rb @@ -141,7 +141,6 @@ def self.format_notes_page(notes) note.destroy! embed t('notes.del.success', note.name, note.id) - rescue ActiveRecord::RecordNotFound embed t('notes.del.not-found', id) end diff --git a/modules/polls.rb b/modules/polls.rb index ee950dc..85bc98b 100644 --- a/modules/polls.rb +++ b/modules/polls.rb @@ -24,9 +24,9 @@ def self.add_n_reacts(message, count) end def self.poll_body(opts) - opts.map.with_index do |arg, idx| + opts.map.with_index { |arg, idx| "#{to_emoji(idx + 1)}#{"\u00A0" * 3}#{arg}" - end.join("\n") + }.join("\n") end def self.poll_footer(event, n_opts) @@ -35,7 +35,7 @@ def self.poll_footer(event, n_opts) { icon_url: bot_user.avatar_url, text: "poll:#{n_opts} / " \ - "#{event.author.distinct}" + "#{event.author.distinct}" } end @@ -47,20 +47,20 @@ def self.poll_author(user) end def self.send_poll(event, channel, title, opts) - embed_msg = embed(target: channel) do |m| + embed_msg = embed(target: channel) { |m| # m.author = poll_author(event.author) m.title = title m.description = poll_body(opts) m.footer = poll_footer(event, opts.size) - end + } add_n_reacts(embed_msg, opts.size) embed_msg end def self.poll_allowed?(event, channel) - event.author.permission?(:send_messages, channel) && - event.channel == channel || + (event.author.permission?(:send_messages, channel) && + event.channel == channel) || event.author.permission?(:administrator) end @@ -93,8 +93,8 @@ module PollsEvents reaction_add do |event| footer_text = event.message.embeds.first&.footer&.text if footer_text&.include?('type:poll') \ - || footer_text&.include?('poll:') \ - && event.user.id != event.bot.bot_user.id + || (footer_text&.include?('poll:') \ + && event.user.id != event.bot.bot_user.id) matches = footer_text.match(/opts:(\d+)/) \ || footer_text.match(/poll:(\d+)/) num = matches && matches[1]&.to_i @@ -102,7 +102,7 @@ module PollsEvents last = num || 9 numbers = [*1..last].map { to_emoji _1 } - numbers.include?(event.emoji.name) || \ + numbers.include?(event.emoji.name) || event.message.delete_reaction(event.user, event.emoji) end end diff --git a/modules/queries.rb b/modules/queries.rb index 4f61252..b2aa4f6 100644 --- a/modules/queries.rb +++ b/modules/queries.rb @@ -66,7 +66,7 @@ def self.query_field(query) } queries.compact.each do |q| - can_close = \ + can_close = event.user.id == q.user_id \ || event.user.permission?(:manage_messages, event.channel) diff --git a/modules/sitelenpona.rb b/modules/sitelenpona.rb index f7afb14..5fa9576 100644 --- a/modules/sitelenpona.rb +++ b/modules/sitelenpona.rb @@ -8,7 +8,7 @@ def initialize @options = SPGen.font_metadata end # rubocop: enable Lint/MissingSuper - + def find_by_abbrev(...) @options_hash ||= @options.to_h { |e| [e.nickname || e.typeface, e] } @abbrev ||= @options_hash.keys.abbrev @@ -32,7 +32,7 @@ def format_value(value, ...) end def describe_validation - super options.map(&:typeface) + super(options.map(&:typeface)) end end @@ -43,8 +43,7 @@ def describe_validation option :fg_color, TString.new, default: defaults.fg_color option :bg_color, TString.new, default: defaults.bg_color - option :fontsize, - TInteger.new(min: 1, max: 128), default: defaults.fontsize + option :fontsize, TInteger.new(min: 1, max: 128), default: defaults.fontsize option :fontface, TSPFontSelect.new, default: defaults.fontface @@ -126,10 +125,7 @@ def self.get_sp_params(event) options.font_face = font.typeface filename = "#{event.author.id}.png" - file = NamedStringIO.new( - SPGen.draw_text(text, options), - path: filename - ) + file = NamedStringIO.new(SPGen.draw_text(text, options), path: filename) event.send_file(file) end diff --git a/modules/snippets.rb b/modules/snippets.rb index 8b1d05c..848ebfd 100644 --- a/modules/snippets.rb +++ b/modules/snippets.rb @@ -54,7 +54,7 @@ def self.set_snippet_property(server, property, name, new_value) embed t('snippets.edit.not-found', name) end # rubocop: enable Metrics/MethodLength - + def self.property_help(valid_properties) embed t('snippets.prop.help', valid_properties) end diff --git a/modules/tio.rb b/modules/tio.rb index c7de931..f64ac26 100644 --- a/modules/tio.rb +++ b/modules/tio.rb @@ -22,9 +22,7 @@ def self.get_codespans(text) rc = doc.root.children - walk_tree(rc) - .filter { _1.type == :codespan } - .map(&:value) + walk_tree(rc).filter { _1.type == :codespan }.map(&:value) end command :tio, { @@ -35,7 +33,7 @@ def self.get_codespans(text) code, input = get_codespans(event.message.text) raw_res = TIO.run(lang, code, nil, input)[0] - .encode('UTF-8', invalid: :replace, undef: :replace, replace: '�') + .encode('UTF-8', invalid: :replace, undef: :replace, replace: '�') res = raw_res.gsub('```', '\\```').gsub('@', "\\@\u200D") msg = embed "```\n#{res}\n```" do |m| m.footer = { text: "tio:#{event.user.id}" } diff --git a/scripts/compare_locales.rb b/scripts/compare_locales.rb index 9c5041e..6f2dad5 100755 --- a/scripts/compare_locales.rb +++ b/scripts/compare_locales.rb @@ -65,7 +65,7 @@ def load_locale(name, root = prj_root) exit end -(base_name, base_flat), (cmp_name, cmp_flat) = \ +(base_name, base_flat), (cmp_name, cmp_flat) = ARGV.map { load_locale(_1).first.then { |k, v| [k, flatten_keys(v)] } } def find_all_ruby(root = prj_root)