------------------------------------------------------------------------
Internet Relay Chat Agent Library

  $Author: igarashi $
------------------------------------------------------------------------



module IRC

  class Agent
    # IRC$B>e$GF0:n$9$k(Bagent$B$NOHAH$_$rDs6!$9$k%/%i%9!#(B
    # $BGI@8$7!"%a%=%C%I$r(Boverride$B$7$FMxMQ$9$k(B

    include Constants
    attr_accessor(:name)
      # $B%(!<%8%'%s%HL>(B($B%9%/%j%W%HL>$H(B1$BBP(B1$BBP1~(B):String

    attr_reader(:nick)
      # $B%(!<%8%'%s%HL>(B:String

    attr_reader(:timestamp)
      # $B@8@.;~9o(B:Time

    attr_accessor(:script_name)
      # $B@8@.85%9%/%j%W%H%U%!%$%kL>(B:String

    def initialize(nick=__id__.to_s)
      # $B@8@.$N$_9T$&!J<B:]$N=i4|2=$O(Bstart$B$G9T$&!K(B

    def start(client)
      # $B=i4|2=!&5/F0(B
      #   client:Client $B$3$N(BAgent$B$,AH$_9~$^$l$k(BClient$B%*%V%8%'%/%H(B

    def restart(old_agent)
      # $B:F5/F0(B
      #   old_agent:Agent nil$B$J$i$P8=:_$N>uBV$N$^$^F0:n3+;O(B

    def stop
      # $BDd;_(B

    def putlog(ident, str)
    def join(channels, keys)
    def part(channels)
    def privmsg(message, *channels)
      # Client$B$N5!G=$N8F=P(B

    def main 
      # $B%a%$%s(B

    def terminate 
      # $BDd;_=hM}(B


  class ActiveAgent < Agent
    attr_reader(:thread)
      # $B$3$N%(!<%8%'%s%H$N%9%l%C%I(B:Thread

    attr_reader(:message_queue)
      # $B%a%C%;!<%8%-%e!<(B:Queue
      # nil$B$N$H$-<u$1<h$j$r5qH]$7$F$$$k$3$H$r<($9(B

    attr_reader(:log_queue)
      # $B%m%0%-%e!<(B:Queue
      # nil$B$N$H$-<u$1<h$j$r5qH]$7$F$$$k$3$H$r<($9(B

    def start(client)
      # $B5/F0(B

    def stop 
      # $BDd;_(B

    def evolve

  class PassiveAgent < Agent
    def notifyMessage(msg)
      # $B%a%C%;!<%8E~CeDLCN(B
      # $B!JEvLLA4$F$N%a%C%;!<%8$,DLCN$5$l$k!K(B

    def notifyLog(log)
      # $B%m%0E~CeDLCN(B
      # $B!JEvLLA4$F$N%m%0$,DLCN$5$l$k!K(B


  class TemporaryAgent < Agent
    def start(client)
------------------------------------------------------------------------
Internet Relay Chat Client Library

  $Author: igarashi $
------------------------------------------------------------------------


require 'irc/irc'
require 'irc/agent'

  class << Thread
    alias _start start
    def start(&iter)

module IRC

  class NewAgentException < Exception
    # $B%(!<%8%'%s%H$,@8@.$G$-$J$+$C$?$3$H$r<($9Nc30(B


  class Stop < Exception

  class Client
    # IRC$B%/%i%$%"%s%H$H$7$F$N5!G=$NOHAH$_$r<BAu$9$k%/%i%9(B

    include Constants
    attr_reader(:nick)
      # nick:String  $B%K%C%/%M!<%`(B

    attr_reader(:agents)
      # agents:Hash  $BAH$_9~$^$l$F$$$k%(!<%8%'%s%H(B

    attr_reader(:join_channels)
      # join_channels:Array of String  join$B$7$F$$$k%A%c%s%M%k(B

    def initialize(server, nick, username, realname=username)
      # Client$B$N=i4|2=$r9T$&(B
      #   server:String    $B%5!<%PL>(B
      #   nick:String      $B%K%C%/%M!<%`(B
      #   username:String  $B%f!<%6L>(B($B%m%0%$%sL>(B)
      #   realname:String  $B<BL>(B

    def connect 
      # $B%5!<%P$X$N@\B3$r9T$&(B

    def disconnect 
      # $B%5!<%P$H$N@\B3$r@Z$k(B

    def putlog(sender, ident, str)
      # $B%m%0$r%-%e!<$KF~$l$k(B

    def newAgent(name)
      # $B%(!<%8%'%s%H$r@8@.$9$k!#(B
      # $BM?$($i$l$?L>A0$N%(!<%8%'%s%H$r%W%i%0%$%s%9%/%j%W%H$r4p$K(B
      # $B@8@.$7!"$=$l$rJV$9!#(B

    def registAgent(name, agent)
      # $B%(!<%8%'%s%H$NEPO?(B

    def findAgent(name)
    def removeAgent(name)
      # $B%(!<%8%'%s%H$N:o=|(B

    def startAgent(name)
      # $B%(!<%8%'%s%H$N5/F0(B
      # $B!J4{$K5/F0$7$F$$$?$i2?$b$7$J$$!K(B

    def stopAgent(name)
      # $B%(!<%8%'%s%H$NDd;_(B

    def restartAgent(name)
      # $B%(!<%8%'%s%H$N:F5/F0$r$9$k!#(B
      # $B;XDj$5$l$?L>A0$N%(!<%8%'%s%H$rDd;_!&:o=|$7$?8e!"(B
      # $B%W%i%0%$%s%9%/%j%W%H$+$i%(!<%8%'%s%H$r:F@8@.$7$FEPO?$9$k!#(B
      # name:String $B%(!<%8%'%s%H$NL>A0!#(B

    def evolveAgent(name)
      # $B%(!<%8%'%s%H$N?J2=(B
      # $B!J(Bmessage_thread$B$+$i8F$S=P$5$J$$$H!"%a%C%;!<%8$r<u$1<h$j$=$3$J$&(B
      # $B2DG=@-$,$"$k!K(B

    def start(init_cpi="init")
      # $B%/%i%$%"%s%H$H$7$F$NF0:n$r3+;O$9$k!#(B
      #   init_cpi:String  $B5/F0%9%/%j%W%H(B

    def stop
    def startThreads 
      # $B%9%l%C%I$r5/F0$9$k(B

    def handleMessageLoop 
      # $B%5!<%P$H$N$d$j<h$j$r$9$k!#(B

    def handleMessageInternal(msg)
      # $B%a%C%;!<%8$r3FFbIt%O%s%I%i$K?6$jJ,$1$k!#(B

    def handlePING(msg)
      # $B%a%C%;!<%8%O%s%I%i!#(B
      # $B%5%V%/%i%9$G%*!<%P!<%i%$%I$5$l$k$3$H$,4|BT$5$l$F$$$k!#(B

    def distributeMessage(msg)
      # $B%a%C%;!<%8$NG[I[(B

    def handleLogLoop 
      # $B%m%0$N=hM}(B

    def distributeLog(log)
      # $B%m%0$NG[I[(B

    def join(channels, keys)
    def part(channels)
      # $B%A%c%s%M%kA`:n$K4X$9$k(BIRC$B%a%C%;!<%8(B

    def privmsg(message, *channels)
      # $B%a%C%;!<%8Aw?.$K4X$9$k(BIRC$B%a%C%;!<%8(B

