diff --git a/irc.lamb b/irc.lamb index a0b7868..2b111f9 100644 --- a/irc.lamb +++ b/irc.lamb @@ -21,6 +21,30 @@ EVAL_ENV = [("id", id), ("locals", locals), ("list", list)]. +irc_eval(code, chan, nick) -> do + eval_watchdog = \_ -> do + value = ref!(false); + f = \_ -> do + ret = eval(code, EVAL_ENV); + setRef!(value, (ret,)) + end; + + thread = thread!(f); + sleep!(3000); -- wait 3 seconds + + val = readRef!(value); + if val == false then do + kill!(thread); + say(chan, nick + ": time limit exceeded") + end + else do + (ret,) = val; + say(chan, nick + ": " + repr(ret)) + end + end; + thread!(eval_watchdog) +end. + fst((x, _)) -> x. -- maybe stuff @@ -113,7 +137,7 @@ say(chan, msg) -> fputstr(sock, "PRIVMSG " + chan + " :" + msg + "\r\n"). handleMessage(s, nick, chan, "$factoids") -> do factoids = list\map(fst, getFactoids(s)); - say(chan, nick + ": " + repr(factoids)); + say(chan, nick + ": " + list\intercalate(" ", factoids)); s end. @@ -134,8 +158,7 @@ handleMessage(s, nick, chan, "$savefacts") -> do end. handleMessage(s, nick, chan, "$eval "::line) -> do - ret = eval(line, EVAL_ENV); - say(chan, nick + ": " + repr(ret)); + irc_eval(line, chan, nick); s end.