Basic backend chat.
authorLain Iwakura <lain@soykaf.club>
Mon, 4 Dec 2017 18:10:15 +0000 (19:10 +0100)
committerLain Iwakura <lain@soykaf.club>
Mon, 4 Dec 2017 18:10:15 +0000 (19:10 +0100)
lib/pleroma/web/channels/user_socket.ex
lib/pleroma/web/chat_channel.ex [new file with mode: 0644]
lib/pleroma/web/twitter_api/twitter_api_controller.ex
lib/pleroma/web/twitter_api/views/user_view.ex

index 7aa8e556e9eaea19fb7864d1ce162d91b8a139d1..d8171cabd1812428380f7838757268f9ec74c7e5 100644 (file)
@@ -1,8 +1,11 @@
 defmodule Pleroma.Web.UserSocket do
   use Phoenix.Socket
+  alias Pleroma.User
+  alias Comeonin.Pbkdf2
 
   ## Channels
   # channel "room:*", Pleroma.Web.RoomChannel
+  channel "chat:*", Pleroma.Web.ChatChannel
 
   ## Transports
   transport :websocket, Phoenix.Transports.WebSocket
@@ -19,8 +22,13 @@ defmodule Pleroma.Web.UserSocket do
   #
   # See `Phoenix.Token` documentation for examples in
   # performing token verification on connect.
-  def connect(_params, socket) do
-    {:ok, socket}
+  def connect(%{"token" => token}, socket) do
+    with {:ok, user_id} <- Phoenix.Token.verify(socket, "user socket", token, max_age: 84600),
+         %User{} = user <- Pleroma.Repo.get(User, user_id) do
+      {:ok, assign(socket, :user, user)}
+    else
+      _e -> :error
+    end
   end
 
   # Socket id's are topics that allow you to identify all sockets for a given user:
diff --git a/lib/pleroma/web/chat_channel.ex b/lib/pleroma/web/chat_channel.ex
new file mode 100644 (file)
index 0000000..60558cb
--- /dev/null
@@ -0,0 +1,14 @@
+defmodule Pleroma.Web.ChatChannel do
+  use Phoenix.Channel
+
+  def join("chat:public", _message, socket) do
+    {:ok, socket}
+  end
+
+  def handle_in("new_msg", %{"text" => text}, socket) do
+    author = socket.assigns[:user]
+    author = Pleroma.Web.MastodonAPI.AccountView.render("account.json", user: author)
+    broadcast! socket, "new_msg", %{text: text, author: author}
+    {:noreply, socket}
+  end
+end
index 1a706029ae1b81fd92e30311b8f00bdc9b17d39a..73d96c73d50b78d764dfd014736bbfda7836680b 100644 (file)
@@ -10,7 +10,8 @@ defmodule Pleroma.Web.TwitterAPI.Controller do
   require Logger
 
   def verify_credentials(%{assigns: %{user: user}} = conn, _params) do
-    render(conn, UserView, "show.json", %{user: user})
+    token = Phoenix.Token.sign(conn, "user socket", user.id)
+    render(conn, UserView, "show.json", %{user: user, token: token})
   end
 
   def status_update(%{assigns: %{user: user}} = conn, %{"status" => _} = status_data) do
index 3dc18eff8f87936f0d1bc9e157adcea8d92f3a69..d1c7e6fbde4023f62af3390a91de2b85dbd9877b 100644 (file)
@@ -25,7 +25,7 @@ defmodule Pleroma.Web.TwitterAPI.UserView do
 
     user_info = User.get_cached_user_info(user)
 
-    %{
+    data = %{
       "created_at" => user.inserted_at |> Utils.format_naive_asctime,
       "description" => HtmlSanitizeEx.strip_tags(user.bio),
       "favourites_count" => 0,
@@ -47,6 +47,12 @@ defmodule Pleroma.Web.TwitterAPI.UserView do
       "cover_photo" => image_url(user.info["banner"]),
       "background_image" => image_url(user.info["background"])
     }
+
+    if assigns[:token] do
+      Map.put(data, "token", assigns[:token])
+    else
+      data
+    end
   end
 
   def render("short.json", %{user: %User{