class Url
Constants
- AUTO_PREVIEW_DEFER_SECONDS
Public Class Methods
Source
# File plugins/url.rb, line 142 def self.bot_command?(text, prefix: "!") UrlLink.bot_command?(text, prefix: prefix) end
Source
# File plugins/url.rb, line 233 def self.clear_preview_sessions! UrlPreview.clear_sessions! end
Source
# File plugins/url.rb, line 119 def self.command_pattern /url(?:\s+(.+))?$/i end
Source
# File plugins/url.rb, line 165 def self.competing_plugin_claims?(message, plugin_classes:, explicit_command: false) return false if explicit_command text = message.to_s url = extract_first_url(text) return true if url && reserved_url?(url) return false unless bot_command?(text) higher_priority_command_matches?(strip_bot_prefix(text), plugin_classes) end
Source
# File plugins/url.rb, line 176 def self.discover_plugin_classes ObjectSpace.each_object(Class) .select { |klass| klass.name && klass.included_modules.include?(Cinch::Plugin) } .uniq end
Source
# File plugins/url.rb, line 134 def self.extract_first_url(text) UrlLink.extract_first_url(text) end
Source
# File plugins/url.rb, line 213 def self.extract_paragraphs(html, limit:, offset: 0) UrlPreview.extract_paragraphs(html, limit: limit, offset: offset) end
Source
# File plugins/url.rb, line 217 def self.format_card(url:, metadata:, paragraphs:) UrlPreview.format_card(url: url, metadata: metadata, paragraphs: paragraphs) end
Source
# File plugins/url.rb, line 150 def self.higher_priority_command_matches?(body, plugin_classes) body = body.to_s.strip return false if body.empty? plugin_classes.any? do |klass| next false if klass == Url next false unless PluginPriority.priority_of(klass) > PluginPriority.priority_of(Url) next false unless klass.respond_to?(:matchers) klass.matchers.any? do |matcher| body.match?(matcher.pattern) end end end
Source
# File plugins/url.rb, line 130 def self.normalize_url(url) UrlLink.normalize_url(url) end
Source
# File plugins/url.rb, line 201 def self.parse_command(args) UrlPreview.parse_command(args) end
Source
# File plugins/url.rb, line 209 def self.parse_metadata(html) UrlPreview.parse_metadata(html) end
Source
# File plugins/url.rb, line 225 def self.preview(url, fetch:, channel: nil) UrlPreview.preview(url, fetch: fetch, channel: channel) end
Source
# File plugins/url.rb, line 229 def self.preview_more(channel:, fetch:) UrlPreview.preview_more(channel: channel, fetch: fetch) end
Source
# File plugins/url.rb, line 138 def self.reserved_url?(url) UrlLink.reserved_url?(url) end
Source
# File plugins/url.rb, line 221 def self.scrape(url, fetch:, offset: 0, limit: UrlPreview::INITIAL_PARAGRAPH_LIMIT) UrlPreview.scrape(url, fetch: fetch, offset: offset, limit: limit) end
Source
# File plugins/url.rb, line 190 def self.should_auto_preview?(message, plugin_classes:, from_bot: false) return false if from_bot return false if bot_command?(message) url = extract_first_url(message) return false unless url return false if reserved_url?(url) !competing_plugin_claims?(message, plugin_classes: plugin_classes) end
Source
# File plugins/url.rb, line 182 def self.skip_deferred_preview?(msg, bot:) competing_plugin_claims?( msg.message, plugin_classes: discover_plugin_classes, explicit_command: bot_command?(msg.message) && strip_bot_prefix(msg.message).match?(/\Aurl\b/i) ) end
Source
# File plugins/url.rb, line 146 def self.strip_bot_prefix(text, prefix: "!") UrlLink.strip_bot_prefix(text, prefix: prefix) end
Source
# File plugins/url.rb, line 205 def self.usage_message UrlPreview.usage_message end
Source
# File plugins/url.rb, line 126 def self.valid_url?(url) UrlLink.valid_url?(url) end
Public Instance Methods
Source
# File plugins/url.rb, line 249 def execute(m, args) parsed = self.class.parse_command(args) if parsed[:error] m.reply parsed[:error] return end channel = m.channel&.name text = if parsed[:more] preview_more(channel: channel) else preview(parsed[:url], channel: channel) end themed_flood_safe_reply(m, text) end
Source
# File plugins/url.rb, line 265 def on_message(m) return unless m.channel return if m.user.nick == bot.nick return unless self.class.should_auto_preview?( m.message, plugin_classes: self.class.discover_plugin_classes ) url = self.class.extract_first_url(m.message) return unless url schedule_auto_preview(m, url) end
Source
# File plugins/url.rb, line 237 def preview(url, fetch: method(:fetch_page), channel: nil) self.class.preview(url, fetch: fetch, channel: channel) end
Source
# File plugins/url.rb, line 241 def preview_more(channel:, fetch: method(:fetch_page)) self.class.preview_more(channel: channel, fetch: fetch) end
Source
# File plugins/url.rb, line 294 def preview_token(m) [ m.channel&.name, m.user.nick, m.message, m.tags["time"] || m.tags["id"] ].join("\0") end
Source
# File plugins/url.rb, line 279 def schedule_auto_preview(m, url) token = preview_token(m) bot.shared[:url_auto_preview_tokens] ||= {} bot.shared[:url_auto_preview_tokens][token] = true Thread.new do sleep AUTO_PREVIEW_DEFER_SECONDS next unless bot.shared[:url_auto_preview_tokens][token] next if self.class.skip_deferred_preview?(m, bot: bot) bot.shared[:url_auto_preview_tokens].delete(token) themed_flood_safe_reply(m, preview(url, channel: m.channel&.name)) end end