Metafridge Jabber Support: Unterschied zwischen den Versionen

aus Metalab Wiki, dem offenen Zentrum für meta-disziplinäre Magier und technisch-kreative Enthusiasten.
Zur Navigation springenZur Suche springen
K
 
(4 dazwischenliegende Versionen von 2 Benutzern werden nicht angezeigt)
Zeile 1: Zeile 1:
 +
== Ist: ==
 +
 
Ein Bot in Rails, welcher per Jabber Account neue Messages entgegen nimmt und an den Fridge sendet;
 
Ein Bot in Rails, welcher per Jabber Account neue Messages entgegen nimmt und an den Fridge sendet;
 
Sollte eigentlich primär für den Twitterbot sein, damit man auch 'direct' messages an den Twitter Bot schicken kann, die dann angezeigt werden.
 
Sollte eigentlich primär für den Twitterbot sein, damit man auch 'direct' messages an den Twitter Bot schicken kann, die dann angezeigt werden.
 
Aber nachdem Twitter im Moment kein Jabber anbietet (Performance Probleme) ists nun mehr 'nur' ein Jabber Bot :)
 
Aber nachdem Twitter im Moment kein Jabber anbietet (Performance Probleme) ists nun mehr 'nur' ein Jabber Bot :)
Benoetigt 'xmpp4r' gem;
+
Benoetigt: ruby on rails, 'xmpp4r' gem (alles andere sollte schon da sein :));
  
 +
== Kann: ==
 +
 +
!help
 +
!last
 +
!last+time
 +
!events
 +
!sense
 +
!about
 +
!door
 +
!door+time
 +
 +
 +
== Will: ==
 +
 +
Ideen und Vorschläge was man(n) noch so reinbauen kann :)
 +
 +
 +
== Dankt: ==
 +
 +
Overflo, Wizard23, Marius für den Metafridge + Fin für die Twitteranbindung
 +
 +
Sushimako fürs Script-Hosting und seine Geduld, alle paar Stunden ne neue Version drauf zu tun :)
 +
 +
== Diff: ==
 +
 +
:Version 0.6: Added !door (Last 10 Metadoor Videos) and !door+time
 +
:Version 0.5: Added !about (About the Bot) and !events (For the Metalab Event list)
 +
:Version 0.4: /command wurde zu !command; Added !help und !sense
 
:Version 0.3: Das Command '/last' gibt jetzt die letzten 10 Metafridge Nachrichten aus - '/last+time' ist mit Timestamp;
 
:Version 0.3: Das Command '/last' gibt jetzt die letzten 10 Metafridge Nachrichten aus - '/last+time' ist mit Timestamp;
 
:Version 0.2: Bot gibt jetzt ein 'Thanks!' zurueck + ich hab mein privates Jabber Icon raus :)
 
:Version 0.2: Bot gibt jetzt ein 'Thanks!' zurueck + ich hab mein privates Jabber Icon raus :)
  
#!/usr/bin/env ruby
+
 
  # Metafridge Jabber/Twitter Bot - Version 0.3
+
== Source: ==
# Consti AT Consti PUNKT de
+
 
require 'xmpp4r'
+
  #!/usr/bin/env ruby
require 'net/http'
+
  version = "Metafridge Jabber Bot - Version 0.6"
require 'cgi'
+
  # Consti AT Consti PUNKT de
require 'iconv'
+
  require 'xmpp4r'
require 'uri'
+
  require 'net/http'
require 'open-uri'
+
  require 'cgi'
+
  require 'iconv'
client = Jabber::Client.new(Jabber::JID.new('metafridge@jabber.metalab.at/metalab'))
+
  require 'uri'
client.connect
+
  require 'open-uri'
client.auth('PASSWORT')
+
  def jabrespond client, msg_in, msg_out, subj
+
    m = Jabber::Message.new(msg_in.from, msg_out).set_type(:normal).set_id('1').set_subject(subj)
client.send(Jabber::Presence.new.set_show(:chat).set_status('Feed me.'))
+
    client.send m
+
  end
client.add_message_callback { |msg|
+
  client = Jabber::Client.new(Jabber::JID.new('metafridge@jabber.metalab.at/metalab'))
  if msg.type == :chat
+
  client.connect
    puts "\n------INCOMING-------\nFrom: #{msg.from}\nMessage:#{msg.body}\n--------------------\n"
+
  client.auth('PASSWORT')
    begin
+
  client.send(Jabber::Presence.new.set_show(:chat).set_status('Send: !help for help :)'))
      incoming = URI.encode(msg.body)
+
  client.add_message_callback { |msg|
      if (msg.body == '/last' || msg.body == '/last+time')
+
    if msg.type == :chat
        begin
+
    puts "\n------INCOMING-------\nFrom: #{msg.from}\nMessage:#{msg.body}\n--------------------\n"
        Net::HTTP.start('twitter.com') {|http|
+
    begin
           req = Net::HTTP::Get.new('/statuses/user_timeline.xml')
+
      incoming = URI.encode(msg.body)
           req.basic_auth 'metafridge', 'metafoo'
+
      if (msg.body == '/last' || msg.body == '/last+time') # Backwards 'compatibility'
           response = http.request(req)
+
        jabrespond(client, msg, "Error: The '/command' is deprecated. Please use '!command'.", '/commands are deprecated, use !command')
          resp = response.body.to_s
+
      elsif (msg.body[0..0] == '!')
          lastmsgs = resp.scan(/<text>(.*)<\/text>$/)
+
        case msg.body
          lasttime = resp.scan(/<created_at>(.*)<\/created_at>$/)
+
        # !help
          jabresponse = "The last 10 Metafridge messages:\n---------------------\n"
+
        when '!help'
          for i in 0...10
+
          response  = "!last => Last 10 metafridge messages\n"
            j = i+1
+
          response += "!last+time => Last 10 metafridge messages + timestamp\n"
            jabresponse += "#{j}: '#{lastmsgs[i]}'\n"
+
          response += "!door => Last 10 metadoor videos\n" 
            if (msg.body == '/last+time')
+
          response += "!door+time => Last 10 metadoor videos + timestamp\n" 
              jabresponse += "(#{lasttime[i]})\n"
+
          response += "!sense => Metasense Status\n"
              jabresponse += "---------------------\n"
+
          response += "!events => List the next Metalab Events\n"
 +
          response += "!about => About the Metafridge Jabber Bot\n"
 +
          jabrespond(client, msg, response, 'Help?')
 +
        # !about Show some Info about the bot + fridge
 +
        when '!about'
 +
          response  = "This is " + version +"\n"
 +
          response += "By: Constantin -> Consti AT Consti PUNKT de\n"
 +
          response += "For: Metafridge (TM)\n\n"
 +
          response += "Project: http://metalab.at/wiki/Fridge\n"
 +
          response += "Webinterface: http://fridge.metalab.at:1337\n"
 +
          response += "On Twitter: http://twitter.com/metafridge\n"
 +
          jabrespond(client, msg, response, 'About?')
 +
        # !events (Metalab Events)
 +
        when '!events', '!event'
 +
          begin
 +
            http_request = nil
 +
            Net::HTTP.start('metalab.at', 80) {|http|
 +
              http_request = http.get('/feeds/events/')   
 +
            }
 +
            events = http_request.body.to_s
 +
            events = events.gsub(/<\/title>/,"\n")
 +
            titles = events.scan(/<title>(.*)$/)
 +
            response = "The next #{titles.length-1} Events in the Metalab:\n---------------------\n"
 +
              for i in 1...titles.length
 +
                response += "'#{titles[i]}'\n"
 +
              end
 +
            jabrespond(client, msg, response, 'metalab events')
 +
           rescue
 +
            jabrespond(client, msg, "Error: Either metalab.at is down, or the feed is broken. try again later. Don't kill me brother!", 'Error')
 +
            puts "timeout - feeds/events"
 +
          end
 +
        # !sense (Metasense)
 +
        when '!sense'
 +
          begin
 +
              #http_header = nil
 +
              http_request = nil
 +
              Net::HTTP.start('metalab.at', 80) {|http|
 +
              #http_header = http.head('/metasense/status_lock.txt')
 +
              http_request = http.get('/metasense/status_lock.txt')  
 +
              }
 +
              #puts http_header['content-type']
 +
              sense = http_request.body.to_s
 +
              if (sense == '1')
 +
                jabrespond(client, msg, 'metalab is OPEN', 'Metasense') 
 +
              elsif (sense == '0')
 +
                jabrespond(client, msg, 'metalab is CLOSED', 'Metasense') 
 +
              else
 +
                jabrespond(client, msg, 'metasense if turned off', 'Metasense') 
 +
              end
 +
           rescue
 +
            jabrespond(client, msg, 'Error: sorry. metalab.at seems to be down. try again later.', 'Error')
 +
            puts "timeout metasense/status_lock.txt"
 +
          end
 +
        # !door and !door+time, last 10 videos on the door     
 +
        when '!door', '!door+time'
 +
           begin
 +
            http_request = nil
 +
            Net::HTTP.start('metadoor.soup.io', 80) {|http|
 +
              http_request = http.get('/rss/')  
 +
            }
 +
            rss = http_request.body.to_s
 +
            rss_youtube = rss.gsub(/&gt;&lt;/,"\n")
 +
            youtube = rss_youtube.scan(/value="(http:\/\/www.youtube.com\/v\/.*)"$/) 
 +
            rss_title = rss.gsub(/<\/title>/,"\n")
 +
            title = rss_title.scan(/<title>(.*)$/)
 +
            rss_pubdate = rss.gsub(/<\/pubDate>/,"\n")
 +
            pubdate = rss_pubdate.scan(/<pubDate>(.*)$/)
 +
            response = "The last 10 Metadoor Videos:\n---------------------\n"
 +
            for i in 0...10
 +
              j = i+1
 +
              response += "#{j}: '#{title[j]}'\n'#{youtube[i]}'\n"
 +
              if (msg.body == '!door+time')
 +
                response += "(#{pubdate[i]})\n"
 +
                response += "---------------------\n"
 +
              end
 
             end
 
             end
 +
            jabrespond(client, msg, response, 'last 10 metadoor videos')
 +
          rescue
 +
            jabrespond(client, msg, 'Error: sorry. metadoor.soup.io seems to be down. try again later.', 'Error')
 +
            puts "timeout"
 +
          end
 +
        # !last and !last+time, last 10 messages on the fridge     
 +
        when '!last', '!last+time'
 +
          begin
 +
          res =Net::HTTP.start('twitter.com') {|http|
 +
              req = Net::HTTP::Get.new('/statuses/user_timeline.xml')
 +
              req.basic_auth 'metafridge', 'metafoo'
 +
              http.request(req)
 +
            }
 +
            resp = res.body.to_s
 +
            lastmsgs = resp.scan(/<text>(.*)<\/text>$/)
 +
            lasttime = resp.scan(/<created_at>(.*)<\/created_at>$/)
 +
            response = "The last 10 Metafridge messages:\n---------------------\n"
 +
            for i in 0...10
 +
              j = i+1
 +
              response += "#{j}: '#{lastmsgs[i]}'\n"
 +
              if (msg.body == '!last+time')
 +
              response += "(#{lasttime[i]})\n"
 +
              response += "---------------------\n"
 +
              end
 +
            end
 +
            jabrespond(client, msg, response, 'last 10 metafridge messages')
 +
          rescue
 +
            jabrespond(client, msg, 'Error: sorry. twitter seems to be down. try again later.', 'Error')
 +
            puts "timeout"
 
           end
 
           end
           m = Jabber::Message.new(msg.from, jabresponse).set_type(:normal).set_id('1').set_subject('last 10 metafridge messages')
+
        # Else show error message 
          client.send m
+
        else
         }
+
           jabrespond(client, msg, 'Error: command not known - try !help', 'Error')
        rescue
+
         end
          puts "timeout"
+
      # Check if its a direct message from twitter, if yes: split and send to fridge; if no: send directly   
        end
+
      else
      else
+
        if (msg.from == 'twitter@twitter.com')
        if (msg.from == 'twitter@twitter.com')
+
          @spl = incoming.split(/:%20/)     
          @spl = incoming.split(/:%20/)     
+
            if (@spl.length == 2)
          if (@spl.length == 2)
+
            puts "\n------SENDING TO FRIDGE-------\nUsername: #{@spl[0]}\nMessage:#{@spl[1]}\n--------------------\n"
            puts "\n------SENDING TO FRIDGE-------\nUsername: #{@spl[0]}\nMessage:#{@spl[1]}\n--------------------\n"
+
            open("http://fridge.metalab.at:1337/cgi-bin/post_text.cgi?lauftext=#{@spl[1]}&playfunction=1").read
            open("http://fridge.metalab.at:1337/cgi-bin/post_text.cgi?lauftext=#{@spl[1]}&playfunction=1").read
+
            puts "\n-----SENT-----\n"
            puts "\n-----SENT-----\n"
+
          end   
          end   
+
        else
        else
+
          puts "\n------SENDING TO FRIDGE-------\nMessage:#{incoming}\n--------------------\n"   
          puts "\n------SENDING TO FRIDGE-------\nMessage:#{incoming}\n--------------------\n"   
+
          open("http://fridge.metalab.at:1337/cgi-bin/post_text.cgi?lauftext=#{incoming}&playfunction=1").read
          open("http://fridge.metalab.at:1337/cgi-bin/post_text.cgi?lauftext=#{incoming}&playfunction=1").read
+
          puts "\n-----SENT-----\n"
          puts "\n-----SENT-----\n"
+
          puts "\n------SENDING RESPONSE-------\nTo:#{msg.from}\nMessage: Thanks!\n--------------------\n"
          puts "\n------SENDING RESPONSE-------\nTo:#{msg.from}\nMessage: Thanks!\n--------------------\n"
+
          jabrespond(client, msg, 'Thanks!', 'Thanks!')  
          m = Jabber::Message.new(msg.from, 'Thanks!').set_type(:normal).set_id('1').set_subject('Thanks!')
+
        end
          client.send m
+
      end
        end
+
    # Rescue method for all kind of jabber msg crap coming in
 +
    rescue
 +
      puts "Not a correct message type"
 
     end
 
     end
    rescue
 
      puts "Keine Korrekte Message  "
 
 
     end
 
     end
  end
+
  }
}
+
  Thread.stop
Thread.stop
+
 
 +
[[Kategorie:Küche]]
 +
[[Kategorie:Projekte]]

Aktuelle Version vom 5. April 2013, 12:20 Uhr

Ist:

Ein Bot in Rails, welcher per Jabber Account neue Messages entgegen nimmt und an den Fridge sendet; Sollte eigentlich primär für den Twitterbot sein, damit man auch 'direct' messages an den Twitter Bot schicken kann, die dann angezeigt werden. Aber nachdem Twitter im Moment kein Jabber anbietet (Performance Probleme) ists nun mehr 'nur' ein Jabber Bot :) Benoetigt: ruby on rails, 'xmpp4r' gem (alles andere sollte schon da sein :));

Kann:

!help !last !last+time !events !sense !about !door !door+time


Will:

Ideen und Vorschläge was man(n) noch so reinbauen kann :)


Dankt:

Overflo, Wizard23, Marius für den Metafridge + Fin für die Twitteranbindung

Sushimako fürs Script-Hosting und seine Geduld, alle paar Stunden ne neue Version drauf zu tun :)

Diff:

Version 0.6: Added !door (Last 10 Metadoor Videos) and !door+time
Version 0.5: Added !about (About the Bot) and !events (For the Metalab Event list)
Version 0.4: /command wurde zu !command; Added !help und !sense
Version 0.3: Das Command '/last' gibt jetzt die letzten 10 Metafridge Nachrichten aus - '/last+time' ist mit Timestamp;
Version 0.2: Bot gibt jetzt ein 'Thanks!' zurueck + ich hab mein privates Jabber Icon raus :)


Source:

 #!/usr/bin/env ruby
 version =  "Metafridge Jabber Bot - Version 0.6"
 # Consti AT Consti PUNKT de
 require 'xmpp4r'
 require 'net/http'
 require 'cgi'
 require 'iconv'
 require 'uri'
 require 'open-uri'  
 def jabrespond client, msg_in, msg_out, subj
   m = Jabber::Message.new(msg_in.from, msg_out).set_type(:normal).set_id('1').set_subject(subj)
   client.send m
 end
 client = Jabber::Client.new(Jabber::JID.new('metafridge@jabber.metalab.at/metalab'))
 client.connect
 client.auth('PASSWORT')
 client.send(Jabber::Presence.new.set_show(:chat).set_status('Send: !help for help :)'))
 client.add_message_callback { |msg|
   if msg.type == :chat
    puts "\n------INCOMING-------\nFrom: #{msg.from}\nMessage:#{msg.body}\n--------------------\n"
    begin
      incoming = URI.encode(msg.body)
      if (msg.body == '/last' || msg.body == '/last+time') # Backwards 'compatibility'
        jabrespond(client, msg, "Error: The '/command' is deprecated. Please use '!command'.", '/commands are deprecated, use !command')
      elsif (msg.body[0..0] == '!')
        case msg.body
        # !help
        when '!help'
          response  = "!last => Last 10 metafridge messages\n"
          response += "!last+time => Last 10 metafridge messages + timestamp\n"
          response += "!door => Last 10 metadoor videos\n"   
          response += "!door+time => Last 10 metadoor videos + timestamp\n"   
          response += "!sense => Metasense Status\n"
          response += "!events => List the next Metalab Events\n"
          response += "!about => About the Metafridge Jabber Bot\n"
          jabrespond(client, msg, response, 'Help?')
        # !about Show some Info about the bot + fridge
        when '!about'
          response  = "This is " + version +"\n"
          response += "By: Constantin -> Consti AT Consti PUNKT de\n"
          response += "For: Metafridge (TM)\n\n"
          response += "Project: http://metalab.at/wiki/Fridge\n"
          response += "Webinterface: http://fridge.metalab.at:1337\n"
          response += "On Twitter: http://twitter.com/metafridge\n"
          jabrespond(client, msg, response, 'About?')
        # !events (Metalab Events)
        when '!events', '!event'
          begin
            http_request = nil 
            Net::HTTP.start('metalab.at', 80) {|http|
             http_request = http.get('/feeds/events/')    
            }
            events = http_request.body.to_s
            events = events.gsub(/<\/title>/,"\n")
            titles = events.scan(/<title>(.*)$/) 
            response = "The next #{titles.length-1} Events in the Metalab:\n---------------------\n"
             for i in 1...titles.length
               response += "'#{titles[i]}'\n"
             end
            jabrespond(client, msg, response, 'metalab events')
          rescue
            jabrespond(client, msg, "Error: Either metalab.at is down, or the feed is broken. try again later. Don't kill me brother!", 'Error') 
            puts "timeout - feeds/events"
          end
        # !sense (Metasense)
        when '!sense'
          begin
             #http_header = nil
             http_request = nil
             Net::HTTP.start('metalab.at', 80) {|http|
              #http_header = http.head('/metasense/status_lock.txt')
              http_request = http.get('/metasense/status_lock.txt')    
             }
             #puts http_header['content-type']
             sense = http_request.body.to_s
             if (sense == '1')
               jabrespond(client, msg, 'metalab is OPEN', 'Metasense')   
             elsif (sense == '0')
               jabrespond(client, msg, 'metalab is CLOSED', 'Metasense')   
             else
               jabrespond(client, msg, 'metasense if turned off', 'Metasense')   
             end
          rescue
            jabrespond(client, msg, 'Error: sorry. metalab.at seems to be down. try again later.', 'Error') 
            puts "timeout metasense/status_lock.txt"
          end
        # !door and !door+time, last 10 videos on the door      
        when '!door', '!door+time'
          begin
            http_request = nil
            Net::HTTP.start('metadoor.soup.io', 80) {|http|
             http_request = http.get('/rss/')    
            }
            rss = http_request.body.to_s
            rss_youtube = rss.gsub(/></,"\n")
            youtube = rss_youtube.scan(/value="(http:\/\/www.youtube.com\/v\/.*)"$/)  
            rss_title = rss.gsub(/<\/title>/,"\n")
            title = rss_title.scan(/<title>(.*)$/)
            rss_pubdate = rss.gsub(/<\/pubDate>/,"\n")
            pubdate = rss_pubdate.scan(/<pubDate>(.*)$/)
            response = "The last 10 Metadoor Videos:\n---------------------\n"
            for i in 0...10
              j = i+1
              response += "#{j}: '#{title[j]}'\n'#{youtube[i]}'\n"
              if (msg.body == '!door+time')
               response += "(#{pubdate[i]})\n"
               response += "---------------------\n"
              end
            end
            jabrespond(client, msg, response, 'last 10 metadoor videos')
          rescue
            jabrespond(client, msg, 'Error: sorry. metadoor.soup.io seems to be down. try again later.', 'Error') 
            puts "timeout"
          end
        # !last and !last+time, last 10 messages on the fridge      
        when '!last', '!last+time'
          begin
          res =Net::HTTP.start('twitter.com') {|http|
             req = Net::HTTP::Get.new('/statuses/user_timeline.xml')
             req.basic_auth 'metafridge', 'metafoo'
             http.request(req) 
           }
           resp = res.body.to_s
           lastmsgs = resp.scan(/<text>(.*)<\/text>$/)
           lasttime = resp.scan(/<created_at>(.*)<\/created_at>$/)
           response = "The last 10 Metafridge messages:\n---------------------\n"
           for i in 0...10
             j = i+1
             response += "#{j}: '#{lastmsgs[i]}'\n"
             if (msg.body == '!last+time')
              response += "(#{lasttime[i]})\n"
              response += "---------------------\n"
             end
           end
           jabrespond(client, msg, response, 'last 10 metafridge messages')
          rescue
            jabrespond(client, msg, 'Error: sorry. twitter seems to be down. try again later.', 'Error') 
            puts "timeout"
          end
        # Else show error message  
        else
          jabrespond(client, msg, 'Error: command not known - try !help', 'Error')
        end
      # Check if its a direct message from twitter, if yes: split and send to fridge; if no: send directly    
      else
        if (msg.from == 'twitter@twitter.com')
          @spl = incoming.split(/:%20/)    
           if (@spl.length == 2)
            puts "\n------SENDING TO FRIDGE-------\nUsername: #{@spl[0]}\nMessage:#{@spl[1]}\n--------------------\n"
            open("http://fridge.metalab.at:1337/cgi-bin/post_text.cgi?lauftext=#{@spl[1]}&playfunction=1").read
            puts "\n-----SENT-----\n"
          end  
        else
          puts "\n------SENDING TO FRIDGE-------\nMessage:#{incoming}\n--------------------\n"   
          open("http://fridge.metalab.at:1337/cgi-bin/post_text.cgi?lauftext=#{incoming}&playfunction=1").read
          puts "\n-----SENT-----\n"
          puts "\n------SENDING RESPONSE-------\nTo:#{msg.from}\nMessage: Thanks!\n--------------------\n"
          jabrespond(client, msg, 'Thanks!', 'Thanks!') 
        end
     end
    # Rescue method for all kind of jabber msg crap coming in
    rescue
      puts "Not a correct message type"
    end
   end
 }
 Thread.stop