From cd27dd58378016dac5266e89c65e69ff3e383292 Mon Sep 17 00:00:00 2001 From: Giuseppe Bilotta Date: Mon, 31 Aug 2009 07:41:38 +0200 Subject: tumplr plugin: first draft --- data/rbot/plugins/tumblr.rb | 143 ++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 143 insertions(+) create mode 100644 data/rbot/plugins/tumblr.rb (limited to 'data') diff --git a/data/rbot/plugins/tumblr.rb b/data/rbot/plugins/tumblr.rb new file mode 100644 index 00000000..af4bd2ce --- /dev/null +++ b/data/rbot/plugins/tumblr.rb @@ -0,0 +1,143 @@ +#-- vim:sw=2:et +#++ +# +# :title: tumblr interface +# +# Author:: Giuseppe Bilotta +# Copyright:: (C) 2009 Giuseppe Bilotta +# License:: GPLv2 +# +# Submit URLs to channel-specific tumblr accounts +# +# TODO reblog tumblr URLs +# TODO support video better (e.g. Vimeo or anything else with embed) +# TODO support image better (e.g. pages with a single big image) +# TODO customize caption/description format + +require 'rexml/document' +require 'cgi' + +class TumblrPlugin < Plugin + RBOT = CGI.escape("rbot #{$version.split.first}") + WRITE_URL = "http://www.tumblr.com/api/write" + LOGIN = "email=%{email}&password=%{pwd}&group=%{group}&format=markdown&generator=" + RBOT + PHOTO = "&type=photo&source=%{src}&click-through-url=%{src}" + VIDEO = "&type=video&embed=%{src}" + CAPTION = "&caption=%{desc}" + LINK = "&type=link&url=%{src}" + DESC = "&name=%{desc}" + + def help(plugin, topic="") + case topic + when "configure" + "tumblr configure []: show credentials used for channel (default: current). tumblr configure [] [] => post links from channel (default: current) to group (default: name of channel) using the given tumblr credentials" + when "deconfigure" + "tumblr deconfigure []: forget credentials for channel (default: current)." + else + "post links, photos and videos to a channel-specific tumblr. topics: configure, deconfigure" + end + end + + def event_url_added(url, options={}) + return unless options.key? :channel + chan = options[:channel] + return unless @registry.key? chan + + account = @registry[chan] + + line = options[:ircline] + line = nil if line and line.empty? + if line and nick = options[:nick] + line = "<#{nick}> #{line}" + end + + req = LOGIN % account + type = options[:htmlinfo][:headers]['content-type'].first rescue nil + case type + when /^image\/.*/ + data = PHOTO + data << CAPTION if line + else + if url.match(%r{^http://(\w+\.)?youtube\.com/watch.*}) + data = VIDEO + data << CAPTION if line + else + data = LINK + data << DESC if line + end + end + req << (data % { :src => CGI.escape(url), :desc => CGI.escape(line) }) + debug "posting #{req.inspect}" + resp = @bot.httputil.post(WRITE_URL, req) + debug "tumblr response: #{resp.inspect}" + end + + def configuration(m, params={}) + channel = params[:channel] || m.channel + if not channel + m.reply _("Please specify a channel") + return + end + if not @registry.key? channel + m.reply _("No tumblr credentials set for %{chan}" % { :chan => channel }) + return false + end + + account = @registry[channel] + + account[:pwd] = _("") if m.public? + account[:chan] = channel + + m.reply _("Links on %{chan} will go to %{group} using account %{email} and password %{pwd}" % account) + end + + def deconfigure(m, params={}) + channel = params[:channel] || m.channel + if not channel + m.reply _("Please specify a channel") + return + end + if not @registry.key? channel + m.reply _("No tumblr credentials set for %{chan}" % { :chan => channel }) + return false + end + + @registry.delete channel + + m.reply _("Links on %{chan} will not be posted to tumblr anymore" % {:chan => channel}) + end + + def configure(m, params={}) + channel = params[:channel] || m.channel + if not channel + m.reply _("Please specify a channel") + return + end + if @registry.key? channel + m.reply _("%{chan} already has credentials configured" % { :chan => channel }) + else + group = params[:group] || channel[1..-1] + group << ".tumblr.com" unless group.match(/\.tumblr\.com/) + @registry[channel] = { + :email => CGI.escape(params[:email]), + :pwd => CGI.escape(params[:pwd]), + :group => CGI.escape(group) + } + + end + + return configuration(m, params) + end + +end + +plugin = TumblrPlugin.new + +plugin.default_auth('*', false) + +plugin.map 'tumblr configure [:channel]', :action => :configuration +plugin.map 'tumblr deconfigure [:channel]', :action => :deconfigure +plugin.map 'tumblr configure [:channel] :email :pwd [:group]', + :action => :configure, + :requirements => {:channel => Regexp::Irc::GEN_CHAN, :email => /.+@.+/, :group => /[A-Za-z-]+/} + -- cgit v1.2.3