プロセスを使った擬似BOTを作ってみたよ。
2011/3/5,6に行った、LOCAL学生部が主催する「春のハッカソン」にて、
自分はErlangを用いた擬似Botを作成しました。
ソース
- bot.erl
module(bot). -export([ start/0, stop/0, comm/1, comm/2, comm/3, loop/0 ]). start() -> register(bot_server, spawn(?MODULE, loop, [])), {ok, Pid} = auto_say:start(), link(Pid). stop() -> bot_server ! {exit}, unregister(bot_server). comm(Comm) -> comm(Comm, "", ""). comm(Comm, Msg) -> comm(Comm, Msg, ""). comm(Comm, Msg1, Msg2) -> bot_server ! {Comm, Msg1, Msg2}. loop() -> receive {auto_say, _, _} -> case auto_say:is_run() of false -> {ok, Pid} = auto_say:start(), link(Pid), io:format("is_process: false~n"); _ -> auto_say:stop(), io:format("is_process: true~n") end, loop() end.
- auto_say.erl
-module(auto_say). -export([ start/0, stop/0, get_pid/0, is_run/0, loop/0 ]). start() -> Pid = spawn(?MODULE, loop, []), register(auto_say_server, Pid), {ok, Pid}. stop() -> auto_say_server ! {exit}, unregister(auto_say_server). get_pid() -> self(). is_run() -> lists:member(auto_say_server, registered()). loop() -> receive {exit} -> ok; _ -> loop() after 1000 -> MsgTuple = { <<"ほげ">>, <<"ふが">>, <<"こんなの絶対おかしいよ">> }, AutoMsg = unicode:characters_to_list( element( random:uniform(size(MsgTuple)), MsgTuple ), utf8 ), io:format("[dark] ~ts~n", [AutoMsg]), loop() end.