aboutsummaryrefslogtreecommitdiff
path: root/shardweb/lib/controllers/chat_controller.ex
diff options
context:
space:
mode:
Diffstat (limited to 'shardweb/lib/controllers/chat_controller.ex')
-rw-r--r--shardweb/lib/controllers/chat_controller.ex48
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