summary refs log tree commit diff stats
path: root/lib/pure/irc.nim
diff options
context:
space:
mode:
Diffstat (limited to 'lib/pure/irc.nim')
-rw-r--r--lib/pure/irc.nim22
1 files changed, 17 insertions, 5 deletions
diff --git a/lib/pure/irc.nim b/lib/pure/irc.nim
index 09e85f234..6e9e30281 100644
--- a/lib/pure/irc.nim
+++ b/lib/pure/irc.nim
@@ -46,6 +46,7 @@ type
   TAsyncIRC* = object of TIRC
     userArg: PObject
     handleEvent: proc (irc: var TAsyncIRC, ev: TIRCEvent, userArg: PObject)
+    lineBuffer: TaintedString
 
   TIRCMType* = enum
     MUnknown,
@@ -281,7 +282,7 @@ proc poll*(irc: var TIRC, ev: var TIRCEvent,
   var ret = socks.select(timeout)
   if socks.len() == 0 and ret != 0:
     if irc.sock.recvLine(line):
-      ev = irc.processLine(line)
+      ev = irc.processLine(line.string)
       result = true
   
   if processOther(irc, ev): result = true
@@ -320,11 +321,22 @@ proc handleConnect(h: PObject) =
 
 proc handleRead(h: PObject) =
   var irc = PAsyncIRC(h)
-  var line = ""
-  if irc.sock.recvLine(line):
-    var ev = irc[].processLine(line)
+  var line = "".TaintedString
+  var ret = irc.sock.recvLineAsync(line)
+  case ret
+  of RecvFullLine:
+    var ev = irc[].processLine(irc.lineBuffer.string & line.string)
     irc.handleEvent(irc[], ev, irc.userArg)
-
+    irc.lineBuffer = "".TaintedString
+  of RecvPartialLine:
+    if line.string != "":
+      string(irc.lineBuffer).add(line.string)
+  of RecvDisconnected:
+    var ev: TIRCEvent
+    ev.typ = EvDisconnected
+    irc.handleEvent(irc[], ev, irc.userArg)
+  of RecvFail: nil
+  
 proc handleTask(h: PObject) =
   var irc = PAsyncIRC(h)
   var ev: TIRCEvent