Current section
Files
Jump to
Current section
Files
lib/shard.ex
defmodule Magnolia.Shard do
use WebSockex
require Logger
@properties %{
os: "BEAM",
browser: "Magnolia",
device: "Magnolia"
}
defstruct [:zlib, :seq, :token]
def start_link(url, token) do
WebSockex.start_link(url, __MODULE__, token)
end
def handle_connect(_, token) do
zlib = :zlib.open()
:zlib.inflateInit(zlib)
{:ok, %__MODULE__{zlib: zlib, seq: nil, token: token}}
end
def handle_frame({:binary, msg}, state) do
payload = :zlib.inflate(state.zlib, msg)
|> :erlang.iolist_to_binary()
|> :erlang.binary_to_term()
case handle_payload(payload, state) do
:ok -> {:ok, state}
{:reply, frame} -> {:reply, frame, state}
end
end
def handle_info(:heartbeat, state) do
resp = Jason.encode!(%{op: 1, d: state.seq}) |> IO.inspect
{:reply, {:text, resp}, state}
end
def handle_payload(%{op: 10, d: %{heartbeat_interval: interval}}, state) do
Logger.debug("HELLO")
:timer.apply_interval(interval, Kernel, :send, [self(), :heartbeat])
resp = :erlang.term_to_binary(%{op: 2, d: %{token: state.token, properties: @properties, compress: true, intents: 7}})
:erlang.binary_to_term(resp) |> IO.inspect
{:reply, {:binary, resp}}
end
def handle_payload(%{op: 11}, _) do
Logger.debug("Heartbeat ACK")
:ok
end
def handle_payload(payload, _) do
Logger.debug(inspect payload)
:ok
end
end