Pastie now auto-senses if line-wrap is a bad or good idea. Feedback?
## mark a section (Learn more)
#!/usr/bin/env ruby # Marshmallow, the campfire chatbot # # You need to know one the following: # (a) the secret public URL, or # (b) an account/password for your room and the room number. # # Usage: # to login with a password: # # bot = Marshmallow.new( :domain => 'mydomain', :ssl => true ) # bot.login :method => :login, # :username => "yourbot@email.com", # :password => "passw0rd", # :room => "11234" # bot.say("So many ponies in here! I want one!") # # to use the public url: # # Marshmallow.domain = 'mydomain' # bot = Marshmallow.new # bot.login( :url => 'aDxf3' ) # bot.say "Ponies!!" # bot.paste "<script type='text/javascript'>\nalert('Ponies!')\n</script>" # class Marshmallow require 'net/https' require 'open-uri' require 'cgi' require 'yaml' def self.version "0.2" end def self.domain @domain end def self.domain=(value) @domain = value end def initialize(options={}) @debug = options[:debug] @domain = options[:domain] || @@domain @ssl = options[:ssl] end def login(options) options = { :method => :url, :username => 'Marshmallow' }.merge(options) @req = Net::HTTP::new("#{@domain}.campfirenow.com", @ssl ? 443 : 80) @req.use_ssl = @ssl headers = { 'Content-Type' => 'application/x-www-form-urlencoded' } case options[:method] when :url res = @req.post("/#{options[:url]}", "name=#{options[:username]}", headers) # parse our response headers for the room number.. magic! @room_id = res['location'].scan(/room\/(\d+)/).to_s puts res.body if @debug when :login params = "email_address=#{CGI.escape(options[:username])}&password=#{CGI.escape(options[:password])}" puts params if @debug res = @req.post("/login/", params, headers) @room_id = options[:room] puts "Logging into room #{@room_id}" if @debug puts res.body if @debug end @headers = { 'Cookie' => res.response['set-cookie'] } res2 = @req.get(res['location'], @headers) puts res2.body if @debug # refresh our headers @headers = { 'Cookie' => res.response['set-cookie'] } @req.get("/room/#{@room_id}/") # join the room if necessary return @headers end def paste(message) say(message, true) end def say(message, paste=false) puts "Posting #{message}" if @debug res = @req.post("/room/#{@room_id}/speak", "#{'paste=true&' if paste}message=#{CGI.escape(message.to_s)}", @headers) puts res.body if @debug end end # run this like script/runner script/marshmallow "something you want to say" bot = Marshmallow.new(:domain => "foo.campfirenow.com", :ssl => false) bot.login :method => :login, :username => "foo@example.com", :password => "t3hsekrit", :room => 12345 bot.say ARGV[0]
This paste will be private.
From the Design Piracy series on my blog: