ラベル Ruby の投稿を表示しています。 すべての投稿を表示
ラベル Ruby の投稿を表示しています。 すべての投稿を表示
2012年8月27日

自動opボット for nadoka

俺得の nadokaさん 向けのbot第3弾。

機能: ユーザ情報を正規表現でチェックする自動OP


これも定番機能ですよね!nadokaさんに添付のautoop.nbはhostを見てくれないので書いた。
他の方の自動opと重複しないようにop発動まで2~4秒のディレイ付き。


autoopbot.nb
class AutoOpBot < Nadoka::NDK_Bot
  
  def bot_initialize
    @myfriends = [
     #["#sample",/nick.*!user@host/],
      ["#chouheiwa",/jintan.*!~yadomijinta@M.*\.ppp\.dion\.ne\.jp/],
      ["#chouheiwa",/anaru.*!~anjounaruko@softbank[0-9]{12}.bbtec.net/],
      ["#chouheiwa",/menma.*!~honmameiko@..\.net.........\.t-com\.ne\.jp/],
    ]
  end
  
  def on_join prefix, ch
    if prefix.nick != @state.nick && /o/ =~ @state.channel_user_mode(ch, @state.nick)
      @myfriends.each do |friend|
        if ch == friend[0] && prefix.to_s =~ Regexp.union(friend[1])
          opthread = Thread.new do
            sleep( (rand(20)+20)*0.1 )
            if /o/ !~ @state.channel_user_mode(ch, prefix.nick)
              change_mode(ch, "+o", prefix.nick)
            end
          end
        end
      end #each
    end #if
  end #def
  
end #class



なんとbotファイル内にOP対象ユーザ情報を書き込んでいる!
nadokarc に正規表現で記述して反映させる方法を知らないのでこんなことに!
でもこのほうがわかりやすいのでいいや。

使い方→@myfriendsに好きなだけ追加してください。運がよければたぶん発動します。
2012年8月17日

URLタイトルを発言するbot for nadoka

誰得の nadokaさん 向けのbot第2弾。

機能: ircで誰かがURLを発言すると、それのhtmlを解析してtitleタグ部分をnoticeします。

botの定番機能ですよね!nadokaさんに同様のbotが添付されてたけどうまくうごかなかったので。勉強がてら書いた。
あ、mechanizeを使ってるので、無い人は gem install mechanize してください。

ruby-1.9.3p194
nadoka-0.8.2
mechanize-2.5.1


urltitlebot.nb
require 'uri'
require 'mechanize'
require 'kconv'

class UrlTitleBot < Nadoka::NDK_Bot
  
  def on_privmsg prefix, ch, msg
    if msg.include?("http:")
      
      t = Thread.new do
        urilist = URI.extract(msg, %w[http])
        uri = URI.parse(urilist[0])
        case uri.host
        when /localhost/, /\A127\./, /\A192\.168\./, /\A10\./
          @logger.slog "urltitlebot: local address"
        else
          agent = Mechanize.new
          agent.user_agent_alias = 'Windows IE 7'
          agent.read_timeout = 5 # sec
          begin
            page = agent.get(uri)
          rescue TimeoutError,
                 Errno::ETIMEDOUT,
                 Errno::EINVAL,
                 Errno::ECONNRESET,
                 Errno::EHOSTUNREACH,
                 Net::HTTPBadResponse,
                 Net::HTTPHeaderSyntaxError,
                 Net::ProtocolError,
                 Mechanize::SocketError,
                 EOFError
            @logger.slog "urltitlebot: error"
          rescue Mechanize::ResponseCodeError => ec
            @logger.slog "urltitlebot: #{ec.response_code} error"
          else
            begin
              noticemsg = page.title.gsub(/\n/,"").strip.gsub(/ +/,' ').tojis
              send_notice(ch, noticemsg)
            rescue NoMethodError
            end
          end
        end #case
      end #thread
      
    end #if
  end #def
  
end #class


これも習作なので、ツッコミ希望いたすよ。rescueしきれてないエラーがあったりして。スマートじゃない動かし方をしている気もするので。htmlかどうかはmime-typeで判断したほうが賢いよなぁ、とか。

bot作ってばっかりじゃRubyどころかプログラミングの基本が習得できないぜ。
2012年8月16日

nickをキープするbot for nadoka

Geekな君らはIRCのどこかに常駐するために、自宅サーバで IRC Client Proxy とかを走らせているに違いないよね。
それの代表格でありRubyで作られた nadokaさん 向けのbotを作ったよ。

機能: ping切れ再接続したあと、幽霊が消えたら即nickを元に戻します。

だから yournick_ とかに一時的になってもなるべく速攻で yournick に戻してくれる!・・・たぶん。


keepnickbot.nb
class KeepNickBot < Nadoka::NDK_Bot

  def on_quit prefix, reason
    if prefix.nick == @config.nick && reason.include?("Ping timeout")
      @logger.slog "keepnickbot: ping timeout"
      send_msg Cmd.nick(@config.nick)
    end
  end
  
end


みじか!
想定外のエラーが起きる可能性ありまくり。
プログラミング初心者が勉強がてら作った習作なので、ツッコミ希望いたすよ。

# ping切れ以外に対処するため、定期的にnickチェックする機能も付けたかったけど、ircのisonコマンドがうまく通らなかったので保留。ざんねん。