Packages
MTProto (Telegram) implementation for Elixir.
Retired package: Deprecated - This package is not maintained anymore.
Current section
Files
Jump to
Current section
Files
lib/mtproto/session/brain.ex
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