factor/examples/factorbot.factor

104 lines
2.5 KiB
Factor
Raw Normal View History

! Simple IRC bot written in Factor.
2005-08-06 01:59:49 -04:00
USING: errors generic hashtables http io kernel math namespaces
parser prettyprint sequences strings unparser words ;
2005-07-26 16:39:14 -04:00
IN: factorbot
SYMBOL: irc-stream
SYMBOL: nickname
SYMBOL: speaker
SYMBOL: receiver
: irc-write ( s -- ) irc-stream get stream-write ;
: irc-print ( s -- )
irc-stream get stream-print
irc-stream get stream-flush ;
: nick ( nick -- )
dup nickname set "NICK " irc-write irc-print ;
: login ( nick -- )
dup nick
"USER " irc-write irc-write
" hostname servername :irc.factor" irc-print ;
: connect ( server -- ) 6667 <client> irc-stream set ;
: disconnect ( -- ) irc-stream get stream-close ;
: join ( chan -- )
"JOIN " irc-write irc-print ;
GENERIC: handle-irc
2005-07-24 19:08:32 -04:00
PREDICATE: string privmsg " " split1 nip "PRIVMSG" head? ;
PREDICATE: string ping "PING" head? ;
2005-07-24 20:17:51 -04:00
M: object handle-irc ( line -- )
2005-07-23 18:27:29 -04:00
drop ;
: parse-privmsg ( line -- text )
2005-07-24 19:08:32 -04:00
" " split1 nip
"PRIVMSG " ?head drop
" " split1 swap receiver set
":" ?head drop ;
M: privmsg handle-irc ( line -- )
parse-privmsg
" " split1 swap
[ "factorbot-commands" ] search dup
2005-09-24 15:21:17 -04:00
[ execute ] [ 2drop ] if ;
2005-07-26 16:39:14 -04:00
M: ping handle-irc ( line -- )
"PING " ?head drop "PONG " swap append irc-print ;
2005-07-24 19:08:32 -04:00
: parse-irc ( line -- )
":" ?head [ "!" split1 swap speaker set ] when handle-irc ;
: say ( line nick -- )
"PRIVMSG " irc-write irc-write " :" irc-write irc-print ;
: respond ( line -- )
receiver get nickname get = speaker receiver ? get say ;
: word-string ( word -- string )
[
"IN: " % dup word-vocabulary %
" " % dup definer word-name %
" " % dup word-name %
"stack-effect" word-prop [ " (" % % ")" % ] when*
2005-10-05 00:18:55 -04:00
] "" make ;
: word-url ( word -- url )
[
"http://factor.modalwebserver.co.nz/responder/browser/?vocab=" %
dup word-vocabulary url-encode %
"&word=" %
word-name url-encode %
2005-10-05 00:18:55 -04:00
] "" make ;
: irc-loop ( -- )
irc-stream get stream-readln
2005-07-24 19:08:32 -04:00
[ dup print flush parse-irc irc-loop ] when* ;
: factorbot
"irc.freenode.net" connect
"factorbot" login
"#concatenative" join
irc-loop ;
IN: factorbot-commands
: see ( text -- )
dup vocabs [ vocab ?hash ] map-with [ ] subset
dup empty? [
drop
"Sorry, I couldn't find anything for " swap append respond
] [
nip [
dup word-string " -- " rot word-url append3 respond
2005-07-23 18:27:29 -04:00
] each
2005-09-24 15:21:17 -04:00
] if ;
: quit ( text -- )
2005-07-23 18:27:29 -04:00
drop speaker get "slava" = [ disconnect ] when ;