aboutsummaryrefslogtreecommitdiff
path: root/apps/dreki/src/world/dreki_world_server.erl
diff options
context:
space:
mode:
Diffstat (limited to 'apps/dreki/src/world/dreki_world_server.erl')
-rw-r--r--apps/dreki/src/world/dreki_world_server.erl63
1 files changed, 63 insertions, 0 deletions
diff --git a/apps/dreki/src/world/dreki_world_server.erl b/apps/dreki/src/world/dreki_world_server.erl
new file mode 100644
index 0000000..2bc41ed
--- /dev/null
+++ b/apps/dreki/src/world/dreki_world_server.erl
@@ -0,0 +1,63 @@
+-module(dreki_world_server).
+-behaviour(partisan_gen_fsm).
+-include_lib("kernel/include/logger.hrl").
+
+-export([start_link/1, send_event/2]).
+-export([init/1]).
+-export([setup/2]).
+-export([wait/2]).
+
+-record(data, {
+ path=undefined
+}).
+
+start_link(Args) ->
+ partisan_gen_fsm:start_link({local, ?MODULE}, ?MODULE, Args, []).
+
+send_event(Name, Event) ->
+ partisan_gen_fsm:send_event(Name, Event).
+
+init(Args) ->
+ ok = plum_db_events:add_handler(dreki_world_plum_events, [?MODULE]),
+ Data = #data{path = dreki_world:path()},
+ ok = setup_autojoin(),
+ todo = setup_connect_nearest(),
+ ok = dreki_node:ensure_local_node(),
+ {ok, setup, Data, 0}.
+
+setup(timeout, Data) ->
+ ?LOG_INFO("world_server: setup done"),
+ {next_state, wait, Data}.
+
+setup_autojoin() ->
+ case application:get_env(dreki, autojoin, undefined) of
+ undefined -> ok;
+ List -> [dreki_peer_service:join(N) || N <- List]
+ end,
+ ok.
+
+setup_connect_nearest() ->
+ case dreki_peer_service:connect_nearest_dns() of
+ ok -> ok;
+ todo -> todo;
+ error ->
+ logger:error("Node did not join anyone from the world!!"),
+ error
+ end.
+
+wait({plum_events, {object_update, {Prefix, Key}, Object}}, Data) ->
+ process_object_update(Prefix, Key, Object, Data),
+ {next_state, wait, Data};
+wait(Event, Data) ->
+ ?LOG_INFO("world_server wait event: ~p", [Event]),
+ {next_state, wait, Data}.
+
+process_object_update({nodes, Node}, Key, _Obj, #data{path = Node}) ->
+ ?LOG_INFO("My node has been updated !"),
+ ok;
+process_object_update({nodes, Node}, Key, _Obj, _Data) ->
+ ?LOG_INFO("Node update ~p ~p", [Node, Key]),
+ ok;
+process_object_update(Prefix, Key, _Obj, _Data) ->
+ ?LOG_INFO("Metadata update ~p ~p", [Prefix, Key]),
+ ok.