| summaryrefslogtreecommitdiff | 
diff options
| -rw-r--r-- | src/battle/btl_handler.erl | 2 | ||||
| -rw-r--r-- | src/db/logic/db_access.erl | 78 | ||||
| -rw-r--r-- | src/login/lgn_handler.erl | 19 | ||||
| -rw-r--r-- | src/login/query/lgn_sign_up.erl | 130 | ||||
| -rw-r--r-- | src/map/map_handler.erl | 2 | ||||
| -rw-r--r-- | src/shared/io/shr_database.erl | 126 | ||||
| -rw-r--r-- | src/shared/shr_janitor.erl | 35 | ||||
| -rw-r--r-- | src/shared/struct/shr_db_query.erl | 31 | ||||
| -rw-r--r-- | src/shared/struct/shr_db_user.erl | 12 | ||||
| -rw-r--r-- | src/shared/struct/shr_player.erl | 4 | 
10 files changed, 389 insertions, 50 deletions
| diff --git a/src/battle/btl_handler.erl b/src/battle/btl_handler.erl index 87c8e63..0bcd40a 100644 --- a/src/battle/btl_handler.erl +++ b/src/battle/btl_handler.erl @@ -21,7 +21,7 @@ start (TimedCachesManagerPid) ->     case shr_database:fetch(battle_db, <<"0">>, admin) of        {ok, _} -> ok;        not_found -> -         shr_database:insert +         shr_database:insert_at           (              battle_db,              <<"0">>, diff --git a/src/db/logic/db_access.erl b/src/db/logic/db_access.erl index 1591ead..0a18edb 100644 --- a/src/db/logic/db_access.erl +++ b/src/db/logic/db_access.erl @@ -11,7 +11,10 @@  (     [        read/3, -      insert/5, +      remove/3, +      reserve/3, +      insert_at/5, +      insert/4,        query/1     ]  ). @@ -25,18 +28,28 @@ query_transaction (Query) ->     ID = shr_db_query:get_entry_id(Query),     [Item] = mnesia:read(DB, ID),     {ok, UpdatedItem} = shr_db_query:apply_to(Query, Item), -   % FIXME: handle return value, mnesia:write -> (transaction abort | ok). -   % FIXME: is this an atomic OP? Is the lock freed afterwards? +     mnesia:write(DB, UpdatedItem, sticky_write), + +   ok. + +-spec add_new_item (atom(), shr_db_item:type()) -> 'ok'. +add_new_item (DB, Item) -> +   ID = shr_db_item:get_id(Item), +   [] = mnesia:read(DB, ID), + +   mnesia:write(DB, Item, sticky_write), +     ok. +  %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%  %% EXPORTED FUNCTIONS %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%  %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%  -spec read     (        atom(), -      any(), +      binary(),        shr_db_user:user()     )     -> ({'aborted', any()} | {'atomic', ({'ok', any()} | 'not_found')}). @@ -47,7 +60,7 @@ read (DB, ID, Cred) ->           true =              shr_db_user:can_access              ( -               shr_db_item:get_write_permission(Item), +               shr_db_item:get_read_permission(Item),                 Cred              ),           {'atomic', {ok, shr_db_item:get_value(Item)}}; @@ -55,18 +68,65 @@ read (DB, ID, Cred) ->        Other -> {'aborted', Other}     end. --spec insert +-spec insert_at     (        atom(), -      any(), +      binary(),        shr_db_user:permission(),        shr_db_user:permission(),        any())     -> ({'aborted', any()} | {'atomic', 'ok'}). -insert (DB, ID, ReadPerm, WritePerm, Value) -> +insert_at (DB, ID, ReadPerm, WritePerm, Value) ->     Item = shr_db_item:new(ID, ReadPerm, WritePerm, Value), -   mnesia:transaction(fun mnesia:write/3, [DB, Item, sticky_write]). +   mnesia:transaction(fun add_new_item/2, [DB, Item]). + +-spec insert +   ( +      atom(), +      shr_db_user:permission(), +      shr_db_user:permission(), +      any()) +   -> ({'aborted', any()} | {'atomic', {'ok', binary()}}). +insert (DB, ReadPerm, WritePerm, Value) -> +   ID = <<"?">>, %% TODO: gen new ID. +   case insert_at(DB, ID, ReadPerm, WritePerm, Value) of +      {'atomic', 'ok'} -> {'atomic', {'ok', ID}}; +      {aborted, Val} -> {aborted, Val} +   end.  -spec query (shr_db_query:type()) -> ({'aborted', any()} | {'atomic', 'ok'}).  query (Query) ->     mnesia:transaction(fun query_transaction/1, [Query]). + +-spec reserve +   ( +      atom(), +      binary(), +      shr_db_user:user() +   ) +   -> ({'aborted', any()} | {'atomic', 'ok'}). +reserve (DB, ID, Cred) -> +   insert_at +   ( +      DB, +      ID, +      [Cred], +      [Cred], +      { +         reserved, +         <<"?">> %% TODO: timestamp +      } +   ). + +-spec remove +   ( +      atom(), +      binary(), +      shr_db_user:user() +   ) +   -> ({'aborted', any()} | {'atomic', ({'ok', any()} | 'not_found')}). +remove (_DB, _ID, _Cred) -> +   %% TODO: unimplemented +   %% Don't forget to checkt that Cred has write access before removing the +   %% value. +   {'aborted', 'unimplemented'}. diff --git a/src/login/lgn_handler.erl b/src/login/lgn_handler.erl index dc154b0..fe87bc6 100644 --- a/src/login/lgn_handler.erl +++ b/src/login/lgn_handler.erl @@ -17,7 +17,7 @@ ensure_player_exists (ID, Username, Password, Email) ->     case shr_database:fetch(player_db, ID, admin) of        {ok, _} -> ok;        not_found -> -         shr_database:insert +         shr_database:insert_at           (              player_db,              ID, @@ -27,10 +27,10 @@ ensure_player_exists (ID, Username, Password, Email) ->           )     end, -   case shr_database:fetch(login_db, ID, admin) of +   case shr_database:fetch(login_db, Username, admin) of        {ok, _} -> ok;        not_found -> -         shr_database:insert +         shr_database:insert_at           (              login_db,              Username, @@ -40,6 +40,19 @@ ensure_player_exists (ID, Username, Password, Email) ->           )     end, +   case shr_database:fetch(login_db, Email, admin) of +      {ok, _} -> ok; +      not_found -> +         shr_database:insert_at +         ( +            login_db, +            Email, +            any, +            any, +            ID +         ) +   end, +     ok.  %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% diff --git a/src/login/query/lgn_sign_up.erl b/src/login/query/lgn_sign_up.erl new file mode 100644 index 0000000..ce35557 --- /dev/null +++ b/src/login/query/lgn_sign_up.erl @@ -0,0 +1,130 @@ +-module(lgn_sign_up). + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +%% TYPES %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +-include("../../../include/yaws_api.hrl"). + +-record +( +   input, +   { +      username :: binary(), +      password :: binary(), +      email :: binary() +   } +). + +-record +( +   query_state, +   { +      player :: shr_player:type() +   } +). + +-type input() :: #input{}. +-type query_state() :: #query_state{}. + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +%% EXPORTS %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +-export([out/1]). + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +%% LOCAL FUNCTIONS %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +-spec parse_input (binary()) -> input(). +parse_input (Req) -> +   JSONReqMap = jiffy:decode(Req, [return_maps]), +   Username = maps:get(<<"usr">>, JSONReqMap), +   Password = maps:get(<<"pwd">>, JSONReqMap), +   Email = maps:get(<<"eml">>, JSONReqMap), + +   #input +   { +      username = Username, +      password = Password, +      email = Email +   }. + +-spec register_user (input()) -> query_state(). +register_user (Input) -> +   Username = Input#input.username, +   Password = Input#input.password, +   Email = Input#input.email, + +   shr_janitor:new(login_db, Username), +   shr_janitor:new(login_db, Email), + +   ok = shr_database:reserve(login_db, Username, janitor), +   ok = shr_database:reserve(login_db, Email, janitor), + +   Player = shr_player:new(<<"">>, Username, Password, Email), + +   {ok, PlayerID} = shr_database:insert(player_db, janitor, janitor, Player), + +   shr_janitor:new(player_db, PlayerID), + +   LoginUpdateQueryOps = +      [ +         shr_db_query:set_value(PlayerID), +         shr_db_query:set_read_permission(any), +         shr_db_query:set_write_permission([{user, PlayerID}]) +      ], + +   PlayerUpdateQueryOps = +      [ +         shr_db_query:set_field(shr_player:get_id_field(), PlayerID), +         shr_db_query:set_read_permission(any), +         shr_db_query:set_write_permission([{user, PlayerID}]) +      ], + +   ok = +      shr_database:commit +      ( +         shr_db_query:new(login_db, Username, janitor, LoginUpdateQueryOps) +      ), + +   ok = +      shr_database:commit +      ( +         shr_db_query:new(login_db, Email, janitor, LoginUpdateQueryOps) +      ), + +   ok = +      shr_database:commit +      ( +         shr_db_query:new(player_db, PlayerID, janitor, PlayerUpdateQueryOps) +      ), + +   #query_state +   { +      player = shr_player:set_id(PlayerID, Player) +   }. + +-spec generate_reply(query_state()) -> binary(). +generate_reply (QueryState) -> +   Player = QueryState#query_state.player, + +   SetSession = lgn_set_session:generate(Player), +   Output = jiffy:encode([SetSession]), + +   Output. + +-spec handle (binary()) -> binary(). +handle (Req) -> +   Input = parse_input(Req), +   %% TODO: validate input +   QueryState = register_user(Input), +   generate_reply(QueryState). + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +%% EXPORTED FUNCTIONS %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +out(A) -> +   { +      content, +      "application/json; charset=UTF-8", +      handle(A#arg.clidata) +   }. diff --git a/src/map/map_handler.erl b/src/map/map_handler.erl index 9c7f4ce..0866315 100644 --- a/src/map/map_handler.erl +++ b/src/map/map_handler.erl @@ -21,7 +21,7 @@ start (TimedCachesManagerPid) ->     case shr_database:fetch(map_db, <<"0">>, admin) of        {ok, _} -> ok;        not_found -> -         shr_database:insert +         shr_database:insert_at           (              map_db,              <<"0">>, diff --git a/src/shared/io/shr_database.erl b/src/shared/io/shr_database.erl index 60327a5..c1792dc 100644 --- a/src/shared/io/shr_database.erl +++ b/src/shared/io/shr_database.erl @@ -10,8 +10,11 @@  -export  (     [ -      insert/5, +      insert_at/5, +      insert/4, +      remove/3,        fetch/3, +      reserve/3,        commit/1     ]  ). @@ -19,60 +22,137 @@  %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%  %% LOCAL FUNCTIONS %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%  %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% --spec get_db_node () -> node(). -get_db_node () -> list_to_atom("db_node@" ++ net_adm:localhost()). +-spec get_debug_db_node () -> node(). +get_debug_db_node () -> list_to_atom("db_node@" ++ net_adm:localhost()). --spec do_remote_operation (atom(), list(any())) -> -   ( -      {'badrpc', any()} -      | {'aborted', any()} -      | {'atomic', ({'ok', any()} | 'ok' | 'not_found')} -   ). -do_remote_operation (Op, Params) -> -   rpc:call(get_db_node(), db_access, Op, Params). +-spec get_random_db_node () -> node(). +get_random_db_node () -> +   get_debug_db_node(). + +-spec get_db_node_for (binary()) -> node(). +get_db_node_for (_ObjectID) -> +   get_debug_db_node().  %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%  %% EXPORTED FUNCTIONS %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%  %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% --spec insert +-spec insert_at     (        atom(), -      any(), +      binary(),        shr_db_user:permission(),        shr_db_user:permission(),        any()     )     -> 'ok'. -insert (DB, ObjectID, ReadPerm, WritePerm, Value) -> +insert_at (DB, ObjectID, ReadPerm, WritePerm, Value) -> +   DBNode = get_db_node_for(ObjectID), +     {atomic, _} = -      do_remote_operation(insert, [DB, ObjectID, ReadPerm, WritePerm, Value]), +      rpc:call +      ( +         DBNode, +         db_access, +         insert_at, +         [DB, ObjectID, ReadPerm, WritePerm, Value] +      ),     io:format     ( -      "~nshr_database:insert(~p) -> ok.~n", -      [{DB, ObjectID, ReadPerm, WritePerm, Value}] +      "~nshr_database:insert_at(~p) ! ~p -> ok.~n", +      [{DB, ObjectID, ReadPerm, WritePerm, Value}, DBNode]     ),     ok. +-spec insert +   ( +      atom(), +      shr_db_user:permission(), +      shr_db_user:permission(), +      any() +   ) +   -> {'ok', binary()}. +insert (DB, ReadPerm, WritePerm, Value) -> +   DBNode = get_random_db_node(), + +   {atomic, {ok, ID}} = +      rpc:call(DBNode, db_access, insert, [DB, ReadPerm, WritePerm, Value]), + +   io:format +   ( +      "~nshr_database:insert(~p) ! ~p -> ok.~n", +      [{DB, ReadPerm, WritePerm, Value}, DBNode] +   ), + +   {ok, ID}. +  -spec fetch     (        atom(), -      any(), +      binary(),        shr_db_user:user()     )     -> ({'ok', any()} | 'not_found').  fetch (DB, ObjectID, Cred) -> -   {atomic, Reply} = do_remote_operation(read, [DB, ObjectID, Cred]), +   DBNode = get_db_node_for(ObjectID), + +   {atomic, Reply} = rpc:call(DBNode, db_access, read, [DB, ObjectID, Cred]), +     io:format     ( -      "~nshr_database:fetch(~p) -> ~p.~n", -      [{DB, ObjectID, Cred}, Reply] +      "~nshr_database:fetch(~p) ! ~p -> ~p.~n", +      [{DB, ObjectID, Cred}, DBNode, Reply]     ), +     Reply.  -spec commit (shr_db_query:type()) -> 'ok'.  commit (Query) -> -   {atomic, ok} = do_remote_operation(query, [Query]), -   io:format("~nshr_database:commit(~p) -> ok.~n", [Query]), +   DBNode = get_db_node_for(shr_db_query:get_entry_id(Query)), + +   {atomic, ok} = rpc:call(DBNode, db_access, query, [Query]), + +   io:format("~nshr_database:commit(~p) ! ~p -> ok.~n", [Query, DBNode]), + +   ok. + +-spec remove +   ( +      atom(), +      binary(), +      shr_db_user:user() +   ) +   -> ('ok' | 'not_found'). +remove (DB, ObjectID, Cred) -> +   DBNode = get_db_node_for(ObjectID), + +   {atomic, _} = rpc:call(DBNode, db_access, remove, [DB, ObjectID, Cred]), + +   io:format +   ( +      "~nshr_database:remove(~p) ! ~p -> ok.~n", +      [{DB, ObjectID, Cred}, DBNode] +   ), + +   ok. + +-spec reserve +   ( +      atom(), +      binary(), +      shr_db_user:user() +   ) +   -> ('ok' | 'not_found'). +reserve (DB, ObjectID, Cred) -> +   DBNode = get_db_node_for(ObjectID), + +   {atomic, _} = rpc:call(DBNode, db_access, reserve, [DB, ObjectID, Cred]), + +   io:format +   ( +      "~nshr_database:reserve(~p) ! ~p -> ok.~n", +      [{DB, ObjectID, Cred}, DBNode] +   ), +     ok. diff --git a/src/shared/shr_janitor.erl b/src/shared/shr_janitor.erl new file mode 100644 index 0000000..097a729 --- /dev/null +++ b/src/shared/shr_janitor.erl @@ -0,0 +1,35 @@ +-module(shr_janitor). + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +%% TYPES %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +%% EXPORTS %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +-export +( +   [ +      new/2, +      core/2 +   ] +). + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +%% LOCAL FUNCTIONS %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +core (DB, ItemID) -> +   receive +   after +      60000 -> +         shr_database:remove(DB, ItemID, janitor) +   end. + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +%% EXPORTED FUNCTIONS %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +-spec new (atom(), binary()) -> ok. +new (DB, ItemID) -> +   spawn(shr_janitor, core, [DB, ItemID]), + +   ok. diff --git a/src/shared/struct/shr_db_query.erl b/src/shared/struct/shr_db_query.erl index e1f6156..5310f00 100644 --- a/src/shared/struct/shr_db_query.erl +++ b/src/shared/struct/shr_db_query.erl @@ -73,8 +73,8 @@  -type db_query() :: #db_query{}. --opaque op() :: db_query_op(). --opaque type() :: db_query(). +-type op() :: db_query_master_op(). +-type type() :: db_query().  %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%  %% EXPORTS %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% @@ -87,7 +87,10 @@        new/4,        set_field/2,        add_to_field/3, -      update_indexed/3 +      update_indexed/3, +      set_value/1, +      set_read_permission/1, +      set_write_permission/1     ]  ).  -export @@ -190,6 +193,15 @@ new (DBName, ObjectID, User, Ops) ->  set_field (Field, Value) ->     #set_field { field = Field, value = Value }. +-spec set_value (any()) -> op(). +set_value (Value) -> #set_val { val= Value }. + +-spec set_read_permission (shr_db_user:permission()) -> op(). +set_read_permission (Perm) -> #set_read_perm { perm = Perm }. + +-spec set_write_permission (shr_db_user:permission()) -> op(). +set_write_permission (Perm) -> #set_write_perm { perm = Perm }. +  -spec add_to_field (non_neg_integer(), list(any()), boolean()) -> op().  add_to_field (Field, Values, IsPrefix) ->     #add_to_field { field = Field, values = Values, head = IsPrefix}. @@ -217,12 +229,13 @@ get_entry_id (#db_query{ id = Result }) -> Result.     )     -> ({'ok', shr_db_item:type()} | 'error').  apply_to (DBQuery, DBItem) -> -   true = -      shr_db_user:can_access -      ( -         shr_db_item:get_write_permission(DBItem), -         get_user(DBQuery) -      ), +   ObjectWPerm = shr_db_item:get_write_permission(DBItem), +   User = get_user(DBQuery), + +   io:format("~p accessing obj with ~p perm.~n", [User, ObjectWPerm]), + +   true = shr_db_user:can_access (ObjectWPerm, User), +     MOps = DBQuery#db_query.ops,     {ok, lists:foldl(fun apply_master_op_to/2, DBItem, MOps)}. diff --git a/src/shared/struct/shr_db_user.erl b/src/shared/struct/shr_db_user.erl index 01840e2..991fb64 100644 --- a/src/shared/struct/shr_db_user.erl +++ b/src/shared/struct/shr_db_user.erl @@ -4,8 +4,8 @@  %% TYPES %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%  %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%  -type db_named_user() :: {'user', any()}. --type db_user() :: (db_named_user() | 'admin' | 'any'). --type db_permission() :: (list(db_named_user()) | 'any'). +-type db_user() :: (db_named_user() | 'admin' | 'any' | 'janitor'). +-type db_permission() :: (list(db_named_user()) | 'any' | 'janitor').  -type user() :: db_user(). @@ -27,5 +27,9 @@  -spec can_access (permission(), user()) -> boolean().  can_access (_, admin) -> true;  can_access (any, _) -> true; -can_access (List, {'user', User}) -> -   lists:member(User, List). +can_access (janitor, janitor) -> true; +can_access (List, {user, User}) -> +   lists:member({user, User}, List); +can_access (janitor, janitor) -> true; +can_access (List, janitor) -> +   lists:member(janitor, List). diff --git a/src/shared/struct/shr_player.erl b/src/shared/struct/shr_player.erl index 6364eb2..2b394c6 100644 --- a/src/shared/struct/shr_player.erl +++ b/src/shared/struct/shr_player.erl @@ -48,6 +48,7 @@        get_maps/1,        get_characters/1, +      set_id/2,        set_username/2,        set_password/2,        new_token/1, @@ -138,6 +139,9 @@ get_maps (Player) -> Player#player.maps.  -spec get_characters (type()) -> list(binary()).  get_characters (Player) -> Player#player.characters. +-spec set_id (binary(), type()) -> type(). +set_id (Val, Player) -> Player#player{ id = Val }. +  -spec set_username (binary(), type()) -> type().  set_username (Val, Player) -> Player#player{ username = Val }. | 


