defmodule MTProto.Session.Brain do require Logger alias MTProto.{Auth, Registry} alias MTProto.Session.Handler @moduledoc false # Process a plain message def process(msg, session_id, :plain) do name = Map.get(msg, :name) case name do "resPQ" -> Auth.resPQ(msg, session_id) "server_DH_params_ok" -> Auth.server_DH_params_ok(msg, session_id) "server_DH_params_fail" -> Auth.server_DH_params_fail(msg, session_id) "dh_gen_ok" -> Auth.dh_gen_ok(msg, session_id) "dh_gen_fail" -> Auth.dh_gen_fail(msg, session_id) "dh_gen_retry" -> Auth.dh_gen_fail(msg, session_id) "error" -> if Map.get(msg, :code) == -404 do session = Registry.get(:session, session_id) dc = Registry.get(:dc, session.dc) if dc.auth_key == <<0::8*8>> do Logger.debug "[Brain] I received a -404 error. I still don't have an auth key for this DC (#{dc.id}). Generating authorization key." Auth.req_pq(session_id) else Logger.warn "[Brain] Received error. I don't know what to do !" end end _ -> Logger.debug "[Brain] #{session_id} : received an unknow predicate #{name}." end end # Process an encrypted message def process(msg, session_id, :encrypted) do session = Registry.get :session, session_id name = Map.get(msg, :name) # Process RPC if name == "rpc_result" do result = Map.get msg, :result name = result |> Map.get(:name) case name do "auth.sentCode" -> hash = Map.get result, :phone_code_hash Registry.set :session, session_id, :phone_code_hash, hash _ -> :noop end # ACK msg_ids = [Map.get(msg, :msg_id)] ack = MTProto.Method.msgs_ack(msg_ids) Handler.send_encrypted(ack, session_id) end # Notify the client if session.client != nil do send session.client, {:recv, session_id, msg} else IO.puts "No client for #{session_id}, printing to console." IO.inspect {session_id, msg} end end end