defmodule ShardWeb.ChatController do use ShardWeb, :controller def chat(conn, %{"chan" => chan}) do conn = put_gon(conn, chat_channel: "chat:" <> chan) shard = %SApp.Chat.Manifest{channel: chan} |> SData.term_hash render conn, "chat.html", public: true, shard: shard, chan: chan end def privchat(conn, %{"people_list" => people_list}) do known_people = for {_, %SApp.Identity.Manifest{pk: pk}, pid} <- Shard.Manager.list_shards() do info = SApp.Identity.get_info(pid) {pk, info.nick} end pk_list = for qname <- String.split(people_list, ",") do candidates = for {pk, nick} <- known_people, :binary.longest_common_prefix([qname, nick]) == byte_size(qname) or :binary.longest_common_prefix([qname, Shard.Keys.pk_display pk]) == byte_size(qname) or Base.decode16(qname) == {:ok, pk}, do: {pk, nick} case candidates do [] -> :error [{pk, _}] -> pk _ -> :error end end if Enum.all?(pk_list, &(&1 != :error)) do pk_list_str = pk_list |> Enum.map(&Base.encode16/1) |> Enum.join(",") conn = put_gon(conn, chat_channel: "privchat:" <> pk_list_str) name = pk_list |> Enum.map(&SApp.Identity.get_nick/1) |> Enum.join(", ") shard = [conn.assigns.pk | pk_list] |> SApp.Chat.PrivChat.Manifest.new |> SData.term_hash render conn, "chat.html", public: false, shard: shard, nicks: name else render conn, ShardWeb.ErrorView, "404.html" end end end