add factoid list and definition
This commit is contained in:
parent
614d672df7
commit
17aad66b8f
57
irc.lamb
57
irc.lamb
|
@ -1,5 +1,27 @@
|
||||||
-- First we'll define some helper functions
|
-- First we'll define some helper functions
|
||||||
|
|
||||||
|
map(f, []) -> [].
|
||||||
|
map(f, x::xs) -> f(x) :: map(f, xs).
|
||||||
|
|
||||||
|
fst((x, _)) -> x.
|
||||||
|
|
||||||
|
-- association list
|
||||||
|
|
||||||
|
-- insert a pair into a map
|
||||||
|
map_insert(assoc, key, value) -> (key, value) :: assoc.
|
||||||
|
|
||||||
|
-- lookup by key
|
||||||
|
map_lookup([], _) -> ("nothing").
|
||||||
|
map_lookup((k,v)::xs, key) ->
|
||||||
|
if k == key then ("just", v)
|
||||||
|
else map_lookup(xs, key).
|
||||||
|
|
||||||
|
-- remove a key from a map
|
||||||
|
map_remove([], key) -> [].
|
||||||
|
map_remove((k,v)::xs, key) ->
|
||||||
|
if k == key then xs
|
||||||
|
else (k,v) :: map_remove(xs, key).
|
||||||
|
|
||||||
-- irc stuff
|
-- irc stuff
|
||||||
|
|
||||||
-- Splits a string by spaces, or until it encounters a :, whereby the following is considered one element.
|
-- Splits a string by spaces, or until it encounters a :, whereby the following is considered one element.
|
||||||
|
@ -25,8 +47,37 @@ ircnick'("!"::xs, acc) -> acc.
|
||||||
ircnick'(x::xs, acc) -> ircnick'(xs, acc + x).
|
ircnick'(x::xs, acc) -> ircnick'(xs, acc + x).
|
||||||
ircnick(str) -> ircnick'(str, "").
|
ircnick(str) -> ircnick'(str, "").
|
||||||
|
|
||||||
|
-- state stuff
|
||||||
|
initialState = ([]).
|
||||||
|
|
||||||
|
-- state getters
|
||||||
|
getFactoids(state) -> do
|
||||||
|
(factoids) = state;
|
||||||
|
factoids
|
||||||
|
end.
|
||||||
|
|
||||||
|
-- state setters
|
||||||
|
setFactoids(state, factoids) -> do
|
||||||
|
(factoids)
|
||||||
|
end.
|
||||||
|
|
||||||
|
-- event handling
|
||||||
|
|
||||||
say(chan, msg) -> fputstr(sock, "PRIVMSG " + chan + " :" + msg + "\r\n").
|
say(chan, msg) -> fputstr(sock, "PRIVMSG " + chan + " :" + msg + "\r\n").
|
||||||
|
|
||||||
|
handleMessage(s, nick, chan, "$factoids") -> do
|
||||||
|
factoids = map(fst, getFactoids(s));
|
||||||
|
say(chan, nick + ": " + repr(factoids));
|
||||||
|
s
|
||||||
|
end.
|
||||||
|
|
||||||
|
handleMessage(s, nick, chan, "$defact "::line) -> do
|
||||||
|
(k,v) = takeUntilSpace(line);
|
||||||
|
factoids = getFactoids(s);
|
||||||
|
say(chan, nick + ": defined " + k);
|
||||||
|
setFactoids(s, map_insert(factoids, k, v))
|
||||||
|
end.
|
||||||
|
|
||||||
handleMessage(s, nick, chan, "$ping") -> do say(chan, nick + ": pong"); s end.
|
handleMessage(s, nick, chan, "$ping") -> do say(chan, nick + ": pong"); s end.
|
||||||
handleMessage(s, "darkf", chan, "$quit") -> do
|
handleMessage(s, "darkf", chan, "$quit") -> do
|
||||||
say(chan, "bye!");
|
say(chan, "bye!");
|
||||||
|
@ -84,13 +135,11 @@ end.
|
||||||
handleLine(s, line) -> do
|
handleLine(s, line) -> do
|
||||||
-- non-sourced message
|
-- non-sourced message
|
||||||
command::args = splitirc(line);
|
command::args = splitirc(line);
|
||||||
handleCommand(s, source, command, args)
|
handleCommand(s, "", command, args)
|
||||||
end.
|
end.
|
||||||
|
|
||||||
-- now for our actual program!
|
-- now for our actual program!
|
||||||
|
|
||||||
initialState = [].
|
|
||||||
|
|
||||||
-- build our socket and connect to the server
|
-- build our socket and connect to the server
|
||||||
sock = sockopen("127.0.0.1", 6667).
|
sock = sockopen("127.0.0.1", 6667).
|
||||||
|
|
||||||
|
@ -112,6 +161,6 @@ mainloop(state) ->
|
||||||
false.
|
false.
|
||||||
|
|
||||||
putstrln("beginning mainloop").
|
putstrln("beginning mainloop").
|
||||||
loop(mainloop, []).
|
loop(mainloop, initialState).
|
||||||
fclose(sock).
|
fclose(sock).
|
||||||
putstrln("done").
|
putstrln("done").
|
Loading…
Reference in New Issue