]> git.netwichtig.de Git - user/henk/code/ruby/rbot.git/blobdiff - data/rbot/plugins/twitter.rb
translator.rb: use "help <translator>" instead of "help translator <translator>"...
[user/henk/code/ruby/rbot.git] / data / rbot / plugins / twitter.rb
index d1c6bd69dba3211ecb95a6ff88bd09b04dfec031..ef0d05b639e60be27a7395aaae7dd9c4107ef841 100644 (file)
@@ -7,16 +7,22 @@
 # Author:: Giuseppe "Oblomov" Bilotta <giuseppe.bilotta@gmail.com>
 #
 # Copyright:: (C) 2007 Carter Parks
+# Copyright:: (C) 2007 Giuseppe Bilotta
 #
 # Users can setup their twitter username and password and then begin updating
 # twitter whenever
 
 require 'rexml/rexml'
+require 'cgi'
 
 class TwitterPlugin < Plugin
+  Config.register Config::IntegerValue.new('twitter.status_count',
+    :default => 1, :validate => Proc.new { |v| v > 0 && v <= 10},
+    :desc => "Maximum number of status updates shown by 'twitter status'")
+
   def initialize
     super
-    
+
     class << @registry
       def store(val)
         val
@@ -25,31 +31,37 @@ class TwitterPlugin < Plugin
         val
       end
     end
+
+    @header = {
+      'X-Twitter-Client' => 'rbot twitter plugin'
+    }
   end
-  
+
   # return a help string when the bot is asked for help on this plugin
   def help(plugin, topic="")
     return "twitter status [status] => updates your status on twitter | twitter identify [username] [password] => ties your nick to your twitter username and password"
   end
-  
+
   # update the status on twitter
   def get_status(m, params)
-  
+
     nick = params[:nick] || @registry[m.sourcenick + "_username"]
 
     if not nick
       m.reply "you should specify the username of the twitter touse, or identify using 'twitter identify [username] [password]'"
       return false
     end
-      
-    # TODO configurable count
-    uri = "http://twitter.com/statuses/user_timeline/#{URI.escape(nick)}.xml?count=3"
-    
-    response = @bot.httputil.get(uri, :cache => false)
+
+    user = URI.escape(nick)
+
+    count = @bot.config['twitter.status_count']
+    uri = "http://twitter.com/statuses/user_timeline/#{user}.xml?count=#{count}"
+
+    response = @bot.httputil.get(uri, :headers => @header, :cache => false)
     debug response
 
     texts = []
-    
+
     if response
       begin
         rex = REXML::Document.new(response)
@@ -74,28 +86,45 @@ class TwitterPlugin < Plugin
       return false
     end
   end
-  
+
   # update the status on twitter
   def update_status(m, params)
-  
+
 
     unless @registry.has_key?(m.sourcenick + "_password") && @registry.has_key?(m.sourcenick + "_username")
       m.reply "you must identify using 'twitter identify [username] [password]'"
       return false
     end
-      
-    uri = "http://#{URI.escape(@registry[m.sourcenick + "_username"])}:#{URI.escape(@registry[m.sourcenick + "_password"])}@twitter.com/statuses/update.xml"
-    
-    response = @bot.httputil.post(uri, "status=#{URI.escape(params[:status].to_s)}")
+
+    user = URI.escape(@registry[m.sourcenick + "_username"])
+    pass = URI.escape(@registry[m.sourcenick + "_password"])
+    uri = "http://#{user}:#{pass}@twitter.com/statuses/update.xml"
+
+    msg = params[:status].to_s
+
+    if msg.length > 160
+      m.reply "your status message update is too long, please keep it under 140 characters if possible, 160 characters maximum"
+      return
+    end
+
+    if msg.length > 140
+      m.reply "your status message is longer than 140 characters, which is not optimal, but I'm going to update anyway"
+    end
+
+    source = "source=rbot"
+    msg = "status=#{CGI.escape(msg)}"
+    body = [source,msg].join("&")
+
+    response = @bot.httputil.post(uri, body, :headers => @header)
     debug response
-    
+
     if response.class == Net::HTTPOK
       m.reply "status updated"
     else
       m.reply "could not update status"
     end
   end
-  
+
   # ties a nickname to a twitter username and password
   def identify(m, params)
     @registry[m.sourcenick + "_username"] = params[:username].to_s