読者です 読者をやめる 読者になる 読者になる

プロセスを使った擬似BOTを作ってみたよ。

2011/3/5,6に行った、LOCAL学生部が主催する「春のハッカソン」にて、
自分はErlangを用いた擬似Botを作成しました。

動作環境

ソース

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.