diff options
Diffstat (limited to 'shardweb/lib/controllers/chat_controller.ex')
-rw-r--r-- | shardweb/lib/controllers/chat_controller.ex | 48 |
1 files changed, 43 insertions, 5 deletions
diff --git a/shardweb/lib/controllers/chat_controller.ex b/shardweb/lib/controllers/chat_controller.ex index 45b7d34..31b80ba 100644 --- a/shardweb/lib/controllers/chat_controller.ex +++ b/shardweb/lib/controllers/chat_controller.ex @@ -1,13 +1,51 @@ defmodule ShardWeb.ChatController do use ShardWeb, :controller - def chat(conn, %{"room" => room}) do - conn = put_gon(conn, chat_room: room) + 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", - room: room + public: true, + shard: shard, + chan: chan end - def privchat(_conn, %{"pk" => _pk}) do - # TODO + def privchat(conn, %{"people_list" => people_list}) do + known_people = for {_, %SApp.Identity.Manifest{pk: pk}, pid} <- Shard.Manager.list_shards() do + info = GenServer.call(pid, :get_info) + {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 |