session和avatar之间的消息传递
-
session使用gen_server向avatar传递消息,如:GenServer.cast(pid, {{module, func}, args})
-pid为该进程的进程id,module为模块名,func为函数名,args为参数(list)
avatar里面handle_cast/2匹配收到cast消息,比如:
handle_cast({:login, _}, {id, session, data}) 登录,不需要调用其他功能模块直接返回{:noreply, {id, session, data}} (session为进程id)调用功能模块的匹配:
handle_cast({{module, func}, args}, {id, data} = state)
通过dispatch/3处理args参数,然后apply/3调用模块函数 处理数据,处理好的数据从handle_result返回消息
session:
GenServer.cast(avatar_pid, {request, msg})
avatar:
def handle_cast({{module, action}, args}, {id, _, data} = state) do
dispatch(module, action, List.wrap(args) ++ [{id, data}])
|> handle_result(state) #state为新的OTP状态
end
返回的消息类型
- {:reply, response}:发消息给客户端,服务器不做其余处理
- {:notify, events}:发消息给客户端,服务器不做其余处理
- {:notify, events, changed}:调用apply_rules({events, changed}, state)函数处理events和changed,返回新的events和changed,将events发给客户端,changed merge到玩家数据,返回新的OTP状态
- {:resolve, context, effects} 在effect中处理数据,effect返回{events, changed},发送消息给客户端,返回新的OTP状态