Current section
Files
Jump to
Current section
Files
lib/handler.ex
defmodule UrbitEx.Handler do
alias UrbitEx.{API, Utils, Resource, Graph, Node, Post}
@moduledoc """
Module containing functions to handle SSE events sent from the Urbit ship.
"""
def general(json) do
case json do
%{"metadata-update" => data} -> metadata_update(data)
%{"invite-update" => data} -> invite_update(data)
%{"launch-update" => data} -> launch_update(data)
%{"location" => data} -> location(data)
%{"group-view-update" => data} -> group_view_update(data)
%{"graph-update" => data} -> graph_update(data)
%{"groupUpdate" => data} -> group_update(data)
%{"contact-update" => data} -> contact_update(data)
%{"s3-update" => data} -> s3_update(data)
%{"harkUpdate" => data} -> hark_update(data)
%{"hark-graph-hook-update" => data} -> hark_graph_hook_update(data)
%{"hark-group-hook-update" => data} -> hark_group_hook_update(data)
data -> IO.inspect(data, label: :wtf)
end
end
defp metadata_update(data) do
# IO.inspects(data)
end
defp graph_update(data) do
case data do
%{"keys" => keys} -> keys
%{"add-nodes" => datas} -> add_graphs(datas)
_ -> IO.inspect(data, label: :graph_update)
end
end
defp add_graphs(data) do
resource = Resource.new(data["resource"]["ship"], data["resource"]["name"])
nodes = Graph.to_list(data["nodes"])
our = UrbitEx.get_state().ship |> Utils.add_tilde()
for node <- nodes, do: if(node.post.author != our, do: handle_post(resource, node.post))
end
defp handle_post(resource, post) do
text =
Enum.map(post.contents, &Map.values/1)
|> List.flatten()
|> Enum.join("-")
|> String.downcase()
|> IO.inspect()
if String.contains?(text, "elixir") do
s = UrbitEx.get_state()
API.Graph.send_message(s, resource, "Elixir is awesome, man")
end
end
defp invite_update(data) do
# IO.inspect(data)
end
defp launch_update(data) do
# IO.inspect(data)
end
defp location(data) do
# IO.inspect(data)
end
defp group_view_update(data) do
IO.inspect(data, label: :group_view_update)
end
defp group_update(data) do
IO.inspect(data, label: :group_update)
end
defp contact_update(data) do
# IO.inspect(data)
end
defp s3_update(data) do
# IO.inspect(data)
end
defp hark_update(data) do
# IO.inspect(data)
end
defp hark_graph_hook_update(data) do
# IO.inspect(data)
end
defp hark_group_hook_update(data) do
# IO.inspect(data)
end
def groupjoin(json) do
case json do
%{"group-view-update" => %{"started" => data}} ->
groupjoin_started(data)
%{"group-view-update" => %{"progress" => %{"progress" => progress, "resource" => resource}}} ->
groupjoin_progress(progress, resource)
%{"groupUpdate" => %{"initialGroup" => %{"group" => group, "resource" => resource}}} ->
early_metadata(group, resource)
%{"metadata-update" => %{"initial-group" => data}} ->
complete_metadata(data)
other ->
IO.inspect(other)
end
end
def groupjoin_started(data), do: IO.puts("Group Join request sent to #{data["resource"]}")
def groupjoin_progress("start", resource), do: IO.puts("Join started to #{resource}")
def groupjoin_progress("no-perms", resource),
do: IO.puts("Can't join #{resource}, it's private")
def groupjoin_progress("added", resource),
do: IO.puts("Successfully joined #{resource}, fetching metadata")
def groupjoin_progress("done", resource), do: IO.puts("Group join to #{resource} complete")
def early_metadata(group, resource) do
name = resource["name"]
host = resource["ship"] |> Utils.add_tilde()
admins = group["tags"]["admin"] |> Enum.map(&Utils.add_tilde/1) |> Enum.join(", ")
members = group["members"] |> Enum.map(&Utils.add_tilde/1) |> Enum.join(", ")
banned_ranks = group["policy"]["open"]["banRanks"] |> Enum.join(", ")
banned_ships = group["policy"]["open"]["banned"] |> Enum.join(", ")
hidden = group["hidden"]
IO.puts("""
Joined #{name} hosted by #{host}.
Admins are #{admins}.
Members are #{members}.
The following ranks are banned #{banned_ranks}.
The following ships are banned #{banned_ships}.
""")
end
def complete_metadata(data) do
IO.puts("lots of stuff")
end
def group_leave(json) do
end
def group_create(json) do
end
def group_delete(json) do
end
def handle_invite(json) do
end
end