61 lines
1.8 KiB
Erlang
61 lines
1.8 KiB
Erlang
% Copyright (c) Camden Dixie O'Brien
|
|
% SPDX-License-Identifier: AGPL-3.0-only
|
|
|
|
-module(subject_server).
|
|
-behaviour(gen_server).
|
|
|
|
-export([start_link/1, get_subject/1, get_activities/1, log_session/4]).
|
|
-export([init/1, handle_call/3, handle_cast/2, handle_info/2,
|
|
terminate/2, code_change/3]).
|
|
|
|
start_link(Subject) ->
|
|
gen_server:start_link(?MODULE, Subject, []).
|
|
|
|
get_subject(Pid) ->
|
|
gen_server:call(Pid, get_subject).
|
|
|
|
get_activities(Pid) ->
|
|
gen_server:call(Pid, get_activities).
|
|
|
|
log_session(Pid, Type, Timestamp, Minutes) ->
|
|
gen_server:call(Pid, {log_session, {Type, Timestamp, Minutes}}).
|
|
|
|
init(Subject) ->
|
|
pg:join(study_system_server, subject_servers, self()),
|
|
{ok, #{subject => Subject,
|
|
priorities => #{reading => rand:uniform(),
|
|
exercises => rand:uniform()}}}.
|
|
|
|
handle_call(get_subject, _From, State = #{subject := Subject}) ->
|
|
{reply, {subject, Subject}, State};
|
|
handle_call(get_activities, _From,
|
|
State = #{subject := Subject,
|
|
priorities := #{reading := ReadingPriority,
|
|
exercises := ExercisesPriority}}) ->
|
|
Reading = {Subject, reading, ReadingPriority},
|
|
Exercises = {Subject, exercises, ExercisesPriority},
|
|
{reply, [Reading, Exercises], State};
|
|
handle_call({log_session, {Type, Timestamp, Minutes}}, _From,
|
|
State = #{subject := Subject, priorities := Priorities}) ->
|
|
case Priorities of
|
|
#{Type := Priority} ->
|
|
UpdatedPriorities = Priorities#{Type := Priority * 0.667},
|
|
{reply, ok, State#{priorities := UpdatedPriorities}};
|
|
_ ->
|
|
{reply, {error, invalid_type}, State}
|
|
end;
|
|
handle_call(_Request, _From, State) ->
|
|
{reply, ok, State}.
|
|
|
|
handle_cast(_Msg, State) ->
|
|
{noreply, State}.
|
|
|
|
handle_info(_Info, State) ->
|
|
{noreply, State}.
|
|
|
|
terminate(_Reason, _State) ->
|
|
ok.
|
|
|
|
code_change(_OldVsn, State, _Extra) ->
|
|
{ok, State}.
|