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 # {"json":{"metadata-update":{"remove":{"app-name":"groups","resource":"/ship/~mirtyl-wacdec/apitest2","group":"/ship/~mirtyl-wacdec/apitest2"}}},"id":1,"response":"diff"} # {"json":{"metadata-update":{"remove":{"app-name":"graph","resource":"/ship/~mirtyl-wacdec/colleckshon-7175","group":"/ship/~mirtyl-wacdec/apitest2"}}},"id":1,"response":"diff"} # {"json":{"metadata-update":{"remove":{"app-name":"graph","resource":"/ship/~mirtyl-wacdec/book-2001","group":"/ship/~mirtyl-wacdec/apitest2"}}},"id":1,"response":"diff"} # {"json":{"metadata-update":{"remove":{"app-name":"graph","resource":"/ship/~mirtyl-wacdec/shat-8668","group":"/ship/~mirtyl-wacdec/apitest2"}}},"id":1,"response":"diff"} # {"json":{"groupUpdate":{"removeGroup":{"resource":{"name":"apitest2","ship":"mirtyl-wacdec"}}}},"id":5,"response":"diff"} def group_leave(json) do end # {"json":{"metadata-update":{"add":{"metadata":{"preview":true,"vip":"","title":"Test Super Group","description":"Group to test my super api","creator":"~timlet-barlep-docteg-mothep","picture":"","hidden":true,"config":{"group":null},"date-created":"~2021.5.25..11.48.52..2d60","color":"0x0"},"app-name":"groups","resource":"/ship/~timlet-barlep-docteg-mothep/testgroup","group":"/ship/~timlet-barlep-docteg-mothep/testgroup"}}},"id":1,"response":"diff"} # {"json":{"groupUpdate":{"addMembers":{"ships":["timlet-barlep-docteg-mothep"],"resource":{"name":"testgroup","ship":"timlet-barlep-docteg-mothep"}}}},"id":5,"response":"diff"} # {"json":{"groupUpdate":{"addGroup":{"policy":{"open":{"banned":[],"banRanks":[]}},"resource":{"name":"testgroup","ship":"timlet-barlep-docteg-mothep"},"hidden":false}}},"id":5,"response":"diff"} def group_create(json) do end # %{ # "id" => 1, # "json" => %{ # "metadata-update" => %{ # "remove" => %{ # "app-name" => "groups", # "group" => "/ship/~timlet-barlep-docteg-mothep/testgroup", # "resource" => "/ship/~timlet-barlep-docteg-mothep/testgroup" # } # } # }, # "response" => "diff" # }, # %{ # "id" => 2, # "json" => %{ # "groupUpdate" => %{ # "removeGroup" => %{ # "resource" => %{ # "name" => "testgroup", # "ship" => "timlet-barlep-docteg-mothep" # } # } # } # }, # "response" => "diff" # }, def group_delete(json) do end # {"json":{"invite-update":{"invite":{"term":"groups","uid":"0v2.c0587.u93v5.v6rdv.cf7sg.374ng","invite":{"resource":{"name":"testgroup2","ship":"timlet-barlep-docteg-mothep"},"text":"hey get thh fuck in","ship":"timlet-barlep-docteg-mothep","recipient":"mirtyl-wacdec","app":"group-push-hook"}}}},"id":2,"response":"diff"} def handle_invite(json) do end end