X-Git-Url: https://git.martlubbers.net/?p=cloogle-irc.git;a=blobdiff_plain;f=IRCBot.icl;h=0cd10228d816d185cd964f9ca7943df0026f52f7;hp=9b6b32073e0882c067d294ac9eb90c747c7fbcb9;hb=93f0540991809d459cfc3061c88fc07d1cfc948c;hpb=3134ab7e61bcbc84560b4a5d613a92b1a48362c2 diff --git a/IRCBot.icl b/IRCBot.icl index 9b6b320..0cd1022 100644 --- a/IRCBot.icl +++ b/IRCBot.icl @@ -7,7 +7,7 @@ import Data.Maybe import IRC import TCPIP -from Text import class Text(join), instance Text String +from Text import class Text(split,join), instance Text String import StdList import StdBool @@ -27,7 +27,7 @@ bot (host, port) start end state bot w # (merr, chan, w) = send (map toString start) (fromJust chan) w | isError merr = (Error $ fromError merr, w) //Start processing function -# (mer, chan, state, w) = process chan state bot w +# (mer, chan, state, w) = process chan "" state bot w | isError mer = (Error $ fromError mer, w) // Send shutdown commands # (merr, {rChannel,sChannel}, w) = send (map toString end) chan w @@ -36,32 +36,39 @@ bot (host, port) start end state bot w = (Ok state, closeChannel sChannel (closeRChannel rChannel w)) import StdDebug,StdMisc -process :: TCP_DuplexChannel a (IRCMessage a *World -> (Maybe [IRCMessage], a, *World)) *World -> (MaybeErrorString (), TCP_DuplexChannel, a, *World) -process chan state bot w -//Receive -# (merr_resp, chan, w) = recv chan w -| isError merr_resp = (Error (fromError merr_resp), chan, state, w) -# (Ok mresp) = merr_resp -| isNothing mresp = process chan state bot w -| not (trace_tn $ "Received: " +++ fromJust mresp) = undef -//Process -= case parseIRCMessage (fromJust mresp) of - (Left err) = (Error $ "IRC Parsing error: " +++ join "\n" err, chan, state, w) - (Right msg) - # (mircc, state, w) = bot msg state w - | isNothing mircc = (Ok (), chan, state, w) // Bot asks to quit - //Possible send the commands - # (merr, chan, w) = send (map toString $ fromJust mircc) chan w - | isError merr = (Error $ fromError merr, chan, state, w) - //Recurse - = process chan state bot w +process :: TCP_DuplexChannel String a (IRCMessage a *World -> (Maybe [IRCMessage], a, *World)) *World -> (MaybeErrorString (), TCP_DuplexChannel, a, *World) +process chan acc state bot w +//See if we have a message += case split "\r\n" acc of + //We only have one message that is not complete + [m] + //Receive + # (merr_resp, chan, w) = recv chan w + | isError merr_resp = (Error (fromError merr_resp), chan, state, w) + # (Ok mresp) = merr_resp + | isNothing mresp = process chan acc state bot w + = process chan (m +++ fromJust mresp) state bot w + //We have a successfull split and therefore we process at least one message + [m:xs] + # acc = join "\r\n" xs + | not (trace_tn $ "Full message: '" +++ m +++ "'") = undef + = case parseIRCMessage $ m +++ "\r\n" of + (Left err) = (Error $ "IRC Parsing error: " +++ join "\n" err, chan, state, w) + (Right msg) + # (mircc, state, w) = bot msg state w + | isNothing mircc = (Ok (), chan, state, w) // Bot asks to quit + //Possible send the commands + # (merr, chan, w) = send (map toString $ fromJust mircc) chan w + | isError merr = (Error $ fromError merr, chan, state, w) + //Recurse + = process chan acc state bot w -send :: [String] TCP_DuplexChannel *World -> (MaybeErrorString (), TCP_DuplexChannel, *World) +send :: ![String] !TCP_DuplexChannel !*World -> (!MaybeErrorString (), !TCP_DuplexChannel, !*World) send [] chan w = (Ok (), chan, w) send [msg:msgs] {sChannel,rChannel} w -# (_, w) = sleep 250000 w # (rpt,i,sChannel,w) = send_MT TIMEOUT (toByteSeq msg) sChannel w | rpt <> TR_Success = (Error "Could not send message", {sChannel=sChannel,rChannel=rChannel}, w) +# (_, w) = sleep 500000 w = send msgs {sChannel=sChannel,rChannel=rChannel} w where sleep :: !Int !*World -> (!Int, *World)