class BuildCoordinator
Constants
- DEFAULT_MIN_STAGE_INTERVAL_SEC
- DEFAULT_SOURCE_NICKS
- OUTRAGEOUS_PATTERN
- STRANGER_NOTICE_COOLDOWN_SEC
Public Class Methods
Source
# File plugins/build_coordinator.rb, line 78 def self.admin_allowed?(network:, channel:, nick:, is_op:) RabbotDb.user_allowed_at_level?( network: network, channel: channel, nick: nick, is_op: is_op, minimum: RabbotDb::LEVEL_ADMIN ) end
Source
# File plugins/build_coordinator.rb, line 62 def self.build_command_for(idea) prepared = RoomReader.prepare_proposal_text(idea) return nil if prepared.empty? || outrageous?(prepared) return nil unless proposable_build?(prepared) RoomReader.format_plugin_command(prepared) end
Source
# File plugins/build_coordinator.rb, line 54 def self.clean_idea(text) text.to_s.gsub(/[\x00-\x1f]/, " ").squeeze(" ").strip[0, 280] end
Source
# File plugins/build_coordinator.rb, line 46 def self.idea_source?(nick, sources) Array(sources).any? { |source| source.to_s.casecmp?(nick.to_s) } end
Source
# File plugins/build_coordinator.rb, line 39 def initialize(*args) super @pending_mutex = Mutex.new @last_staged_at = {} @stranger_notice_at = {} end
Calls superclass method
Source
# File plugins/build_coordinator.rb, line 50 def self.outrageous?(idea) idea.to_s.match?(OUTRAGEOUS_PATTERN) end
Source
# File plugins/build_coordinator.rb, line 58 def self.proposable_build?(idea) RoomReader.actionable_proposal?(idea) end
Source
# File plugins/build_coordinator.rb, line 70 def self.propose_build_message(command, bot_nick:) "#{bot_nick} proposes: #{command} — run manually when ready." end
Source
# File plugins/build_coordinator.rb, line 74 def self.propose_existing_message(usage, detail, bot_nick:) "#{bot_nick} proposes: #{usage} — run manually when ready. #{detail}" end
Source
# File plugins/build_coordinator.rb, line 88 def self.trusted_idea_source?(nick:, channel:, user:, network:, idea_sources:) return false unless idea_source?(nick, idea_sources) ChannelTrust.trusted_nick?( nick: nick, channel: channel, user: user, network: network, idea_sources: idea_sources ) end
Public Instance Methods
Source
# File plugins/build_coordinator.rb, line 150 def channel_status(m) return unless room_reader_role? return unless m.channel capabilities = IrcCapabilities.snapshot(bot) safe_reply(m, ChannelModes.summary(m.channel, capabilities: capabilities)) end
Source
# File plugins/build_coordinator.rb, line 100 def on_connect(_m) return unless room_reader_role? bot.config.channels.each do |channel| resume_pending(channel) end end
Source
# File plugins/build_coordinator.rb, line 108 def on_join(m) return unless room_reader_role? return unless m.channel return if m.user.nick == bot.nick return unless moderated_channel?(m.channel) return unless ChannelTrust.stranger_nick?( nick: m.user.nick, channel: m.channel, user: m.user, network: network, idea_sources: idea_sources ) return if stranger_notice_on_cooldown?(m.channel.name, m.user.nick) record_stranger_notice(m.channel.name, m.user.nick) safe_reply( m, "#{m.user.nick} joined without voice on a moderated channel — #{bot.nick} is watching." ) end
Source
# File plugins/build_coordinator.rb, line 129 def on_message(m) return unless m.channel return if m.user.nick == bot.nick if veto_command?(m.message) handle_veto(m) if room_reader_role? return end return unless room_reader_role? return unless build_enabled?(m.channel.name) return unless auto_build_enabled?(m.channel.name) return if ChatModeRegistry.active?(m.channel.name) return if m.message.to_s.lstrip.start_with?("!") return unless self.class.idea_source?(m.user.nick, idea_sources) return unless trusted_idea_source?(m) return unless Veto.experiment_proposal?(m.message) stage_idea(m) end