summaryrefslogtreecommitdiff
path: root/data/rbot/plugins/shortenurls.rb
blob: 5d8df80a15512c7bec4bb879860f81785db002e7 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
#-- vim:sw=2:et
#++
#
# Plugin to handle ShortURL, merges the funcionality of the old rubyurl and tinyurl plugins
# Note that it's called ShortenURLs and not ShortURL, to prevent conflicts with
# the actual ruby package used
#
# Author:: Giuseppe Bilotta <giuseppe.bilotta@gmail.com>
# (C) 2007 Giuseppe Bilotta
# Based on existing rbot plugins, as mentioned above :)

require "shorturl"
require "uri"

class ShortenURLs < Plugin
  include WWW

  attr_accessor :services
  def initialize
    super
    # Instead of catering for all the services, we only pick the ones with 'link' or 'url' in the name
    @services = ShortURL.valid_services.select { |service| service.to_s =~ /(?:link|url)/ } << :shorturl
  end

  # return a help string when the bot is asked for help on this plugin
  def help(plugin, topic="")
    return "shorten urls. syntax: <service> <your long url> => creates a shortened url using the required service (choose between #{@services.join(', ')}). Example: #{@bot.nick}, tinyurl http://some.long.url/wow-this-is/really-long.html"
  end

  # do the dirty job. This method can be called by other plugins, in which case you
  # should set the :called param to true
  def shorten(m, params)
    url = params[:url]
    if url == "help"
      m.reply help(m.plugin) unless params[:called]
      return
    end
    begin
      to_uri = URI.parse(url)
      # We don't accept 'generic' URLs because almost everything gets in there
      raise URI::InvalidURIError if to_uri.class == URI::Generic
    rescue URI::InvalidURIError
      m.reply "#{url} doesn't look like an URL to me ..." unless params[:called]
      return
    end

    service = params[:service] || m.plugin.to_sym
    service = :rubyurl if service == :shorturl

    short = WWW::ShortURL.shorten(url, service)

    if params[:called]
      return short
    else
      m.reply "#{url} shortened to #{short}"
    end
  end

end

# create an instance of the RubyURL class and register it as a plugin
plugin = ShortenURLs.new

plugin.services.each { |service|
  plugin.map "#{service} :url", :action => 'shorten'
}