Paste: anybot
Author: | mnestic |
Mode: | factor |
Date: | Tue, 7 Sep 2010 03:53:00 |
Plain Text |
USING: accessors assocs compiler continuations debugger eval fry
io io.streams.string io.encodings.8-bit io.encodings.string
irc.messages irc.client irc.client.chats kernel namespaces math
parser sequences splitting threads ;
RENAME: join sequences => seq:join
IN: irc.anybot
: bot-profile ( -- obj ) "localhost" 6667 "anybot" f <irc-profile> ;
: bot-channel ( -- seq ) "#concatenative" ;
: shorten ( str -- short-str ) dup length 256 > [ 256 short head "..." append ] when ;
GENERIC: handle-message ( msg -- str )
M: privmsg handle-message
[
[ [ text>> ] [ 2drop "" ] recover dup dup
length 2 > [ first2 [ CHAR: [ = ] [ CHAR: \s = ] bi* and ] [ drop f ] if
[ parse-string '[ _ call call ] { } swap with-datastack ] when
drop
]
[ nip print-error ] recover
] with-string-writer
{ { CHAR: \n CHAR: \s } } substitute { { CHAR: \r CHAR: \s } } substitute latin1 decode " " split harvest " " seq:join ;
M: object handle-message ( msg -- str ) drop "" ;
: bot-loop ( chat -- )
dup dup hear '[ _ _ handle-message shorten swap speak stop ] in-thread bot-loop ;
: start-bot ( -- chat )
t auto-use? set-global
"quiet" on
bot-profile <irc-client>
[ connect-irc ]
[
[ bot-channel <irc-channel-chat> dup ] dip
'[ _ [ _ attach-chat ] [ bot-loop ] bi ]
"anybot" spawn drop
] bi ;
: bot ( -- ) start-bot drop ;
MAIN: bot
New Annotation