From a42cbb1b6adc19c4f64594c4f4f04a4900ca3361 Mon Sep 17 00:00:00 2001 From: crc <> Date: Thu, 2 Nov 2023 13:31:25 +0000 Subject: [PATCH] add example/irc-logger.retro FossilOrigin-Name: 6c2d23f37890ebcad93d69c44c72b62fb56fb0ad0966ebdb110ee8101269ab10 --- RELEASE-NOTES | 1 + example/irc-logger.retro | 78 ++++++++++++++++++++++++++++++++++++++++ 2 files changed, 79 insertions(+) create mode 100644 example/irc-logger.retro diff --git a/RELEASE-NOTES b/RELEASE-NOTES index cf57c55..f2f2d36 100644 --- a/RELEASE-NOTES +++ b/RELEASE-NOTES @@ -29,5 +29,6 @@ - fix misc. typos - in retro-muri.c, use bsd_strlcpy (rep by fangchar) - in retro.forth, fix `s:index/char` (rep by fangchar) +- add example/irc-logger.retro ================================================================ diff --git a/example/irc-logger.retro b/example/irc-logger.retro new file mode 100644 index 0000000..dfdadbd --- /dev/null +++ b/example/irc-logger.retro @@ -0,0 +1,78 @@ +This is an IRC bot to log the contents of one or more channels. +It was written to support for use with http://forth.chat + +~~~ +'irc.libera.chat:6665 'SERVER s:const +'crc[log] 'NICK s:const +{ '#retro '##forth } 'CHANNELS const + +'Output d:create + #32768 allot + +'Sock var + +:connect (s-) + socket:create dump-stack nl !Sock + $: s:split swap n:inc socket:configure dump-stack nl + @Sock socket:connect dump-stack nl drop ; + +:s:transmit @Sock socket:send + nip n:-zero? [ nl 'Disconnected! s:put nl bye ] if ; + +{{ + :eol? + [ ASCII:CR eq? ] [ ASCII:LF eq? ] bi or ; + + :terminate + buffer:get drop #0 buffer:add ; +---reveal--- + :s:receive + [ here buffer:set + s:empty dup #500 @Sock socket:recv drop-pair + [ dup buffer:add eol? [ terminate ] if ] s:for-each ] + buffer:preserve ; +}} + +:disconnect + @Sock socket:close ; + +'a s:put nl +SERVER connect +'b s:put nl + +:irc:send + '%s\r\n s:format s:transmit ; + +:login 'USER_chanlog_crc@forth.works_forth.works_charles irc:send + NICK 'NICK_%s s:format irc:send + CHANNELS [ 'JOIN_%s s:format irc:send ] a:for-each ; + +'c s:put nl +login +'d s:put nl + +:ping? + here 'PING s:begins-with? ; + +:pong + 'PONG here #4 + s:append irc:send ; + +:message? + here 'PRIVMSG s:contains-string? ; + +:process + '/home/crc/irc-log.txt file:A file:open + clock:timestamp n:to-string [ over file:write ] s:for-each + #32 over file:write + here [ over file:write ] s:for-each #10 over file:write + file:close ; + +[ repeat + s:receive here s:put nl + message? [ process ] if + ping? [ pong ] if + reset + again ] call + +disconnect +~~~