aboutsummaryrefslogtreecommitdiffstats
path: root/server/client.erl
blob: 7cee336a07538c0046bb7a8387d77a957e6a29e1 (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
-module(client).
-export([start/2, loop/2, register/2, login/2]).

start(Node, User) ->
    process_flag(trap_exit, true),
    Client = server:start_on_node(Node, client, undef),
    link(Client),
    Server = spawn_link(client, loop, [Client, User]),

    case server:rpc(Client, {change_state, Server}) of
	{ok} ->
	    {ok, Client};
	Why ->
	    {error, {unknown_error, Why}}
    end.

execute(Client, F) ->
    %% execute F() with error handling
    %% (sends error message on exception)
    try F() of
	Result ->
	    Client ! {ok, Result}
    catch
	_: Why ->
	    Client ! {error, Why}
    end.

loop(Client, User) ->
    %% mainloop for client modul in server
    receive
	{register, Name, Password} ->
	    case User of
		{user, _, _, _, admin} ->
		    execute(Client, fun() -> cldb:register(Name, Password, none) end);
		_ -> Client ! {error, {no_rights}}
	    end;

	list ->
	    execute(Client, fun() -> media:all() end);

	get_votes ->
	    execute(Client, fun() -> media:getVotes(Client) end);

	{vote, Artist, Title} ->
	    case cldb:decVote(User) of
	        {ok} -> execute(Client, fun() -> media:vote(Artist, Title) end);
	        _ -> Client ! {error, no_votes_available}
	    end; 

	{devote, Artist, Title} ->
	    execute(Client, fun() -> media:devote(Artist, Title) end);

	Cmd ->
	    Client ! {error, {unknown_command, Cmd}}
    end,
    loop(Client, User).

register(Client, {Name, Password}) ->
    dis ! {Client, {register, {Name, Password}}}.

login(Client, {Node, Name, Password}) ->
    dis ! {Client, {login, {Node, Name, Password}}}.