dev'
[cloogle-irc.git] / IRCBot.icl
index 9b6b320..1dfee11 100644 (file)
@@ -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,25 +36,32 @@ 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 [] chan w = (Ok (), chan, w)