Skip to content

Commit 52d570e

Browse files
committed
fix: Friend & username bugs
1 parent 7da0069 commit 52d570e

8 files changed

Lines changed: 158 additions & 134 deletions

File tree

‎lib/octocon/accounts.ex‎

Lines changed: 34 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -362,6 +362,40 @@ defmodule Octocon.Accounts do
362362
link_discord_to_user(user, discord_id)
363363
end
364364

365+
def update_username(system_identity, username) do
366+
user = get_user!(system_identity)
367+
368+
cond do
369+
user.username == username ->
370+
{:error, :already_linked}
371+
372+
user_exists?({:username, username}) ->
373+
{:error, :user_exists}
374+
375+
true ->
376+
user
377+
|> User.update_changeset(%{username: username})
378+
|> Repo.update_regional({:user, {:system, user.id}})
379+
|> case do
380+
{:ok, value} ->
381+
spawn(fn ->
382+
update_user_registry(user.id, %{username: username})
383+
end)
384+
385+
spawn(fn ->
386+
OctoconWeb.Endpoint.broadcast!("system:#{user.id}", "username_updated", %{
387+
username: username
388+
})
389+
end)
390+
391+
{:ok, value}
392+
393+
{:error, changeset} ->
394+
{:error, changeset}
395+
end
396+
end
397+
end
398+
365399
@doc """
366400
Links an email to an existing user. Accepts either a `User` struct directly or a system identity.
367401

‎lib/octocon/friendships.ex‎

Lines changed: 71 additions & 62 deletions
Original file line numberDiff line numberDiff line change
@@ -592,69 +592,78 @@ defmodule Octocon.Friendships do
592592
from_id = Accounts.id_from_system_identity(from_identity, :system)
593593
to_id = Accounts.id_from_system_identity(to_identity, :system)
594594

595-
req =
596-
%Request{
597-
from_id: from_id,
598-
to_id: to_id,
599-
date_sent: DateTime.utc_now(:second)
600-
}
601-
|> change_friend_request()
602-
|> Repo.insert_global()
603-
604-
case req do
605-
{:ok, _} ->
606-
OctoconDiscord.Utils.send_dm(
607-
{:system, to_id},
608-
":mailbox_with_mail: New friend request!",
609-
"The system **#{from_id}** has sent you a friend request."
610-
)
611-
612-
spawn(fn ->
613-
%{request: request, from: from} =
614-
get_incoming_friend_request(from_identity, to_identity)
615-
616-
OctoconWeb.Endpoint.broadcast!(
617-
"system:#{to_id}",
618-
"friend_request_received",
619-
%{
620-
request: request,
621-
system: from
622-
}
623-
|> OctoconWeb.FriendRequestJSON.data()
624-
)
625-
end)
626-
627-
spawn(fn ->
628-
%{request: request, to: to} =
629-
get_outgoing_friend_request(from_identity, to_identity)
630-
631-
OctoconWeb.Endpoint.broadcast!(
632-
"system:#{from_id}",
633-
"friend_request_sent",
634-
%{
635-
request: request,
636-
system: to
637-
}
638-
|> OctoconWeb.FriendRequestJSON.data()
639-
)
640-
end)
641-
642-
spawn(fn ->
643-
OctoconDiscord.Autocomplete.FriendRequest.invalidate(
644-
{:system, to_id},
645-
:incoming
646-
)
647-
648-
OctoconDiscord.Autocomplete.FriendRequest.invalidate(
649-
{:system, from_id},
650-
:outgoing
651-
)
652-
end)
653-
654-
{:ok, :sent}
595+
cond do
596+
to_id == nil or not Accounts.user_exists?({:system, to_id}) ->
597+
{:error, :no_user}
598+
599+
to_id == from_id ->
600+
{:error, :no_user}
601+
602+
true ->
603+
req =
604+
%Request{
605+
from_id: from_id,
606+
to_id: to_id,
607+
date_sent: DateTime.utc_now(:second)
608+
}
609+
|> change_friend_request()
610+
|> Repo.insert_global()
611+
612+
case req do
613+
{:ok, _} ->
614+
OctoconDiscord.Utils.send_dm(
615+
{:system, to_id},
616+
":mailbox_with_mail: New friend request!",
617+
"The system **#{from_id}** has sent you a friend request."
618+
)
655619

656-
{:error, error} ->
657-
{:error, error}
620+
spawn(fn ->
621+
%{request: request, from: from} =
622+
get_incoming_friend_request(from_identity, to_identity)
623+
624+
OctoconWeb.Endpoint.broadcast!(
625+
"system:#{to_id}",
626+
"friend_request_received",
627+
%{
628+
request: request,
629+
system: from
630+
}
631+
|> OctoconWeb.FriendRequestJSON.data()
632+
)
633+
end)
634+
635+
spawn(fn ->
636+
%{request: request, to: to} =
637+
get_outgoing_friend_request(from_identity, to_identity)
638+
639+
OctoconWeb.Endpoint.broadcast!(
640+
"system:#{from_id}",
641+
"friend_request_sent",
642+
%{
643+
request: request,
644+
system: to
645+
}
646+
|> OctoconWeb.FriendRequestJSON.data()
647+
)
648+
end)
649+
650+
spawn(fn ->
651+
OctoconDiscord.Autocomplete.FriendRequest.invalidate(
652+
{:system, to_id},
653+
:incoming
654+
)
655+
656+
OctoconDiscord.Autocomplete.FriendRequest.invalidate(
657+
{:system, from_id},
658+
:outgoing
659+
)
660+
end)
661+
662+
{:ok, :sent}
663+
664+
{:error, error} ->
665+
{:error, error}
666+
end
658667
end
659668
end
660669
end

‎lib/octocon_discord/commands/friend/request.ex‎

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -153,7 +153,7 @@ defmodule OctoconDiscord.Commands.Friend.Request do
153153
{:error, :already_sent_request} ->
154154
error_component("You have already sent a friend request to #{decorator}.")
155155

156-
{:error, %{errors: [to_id: {"does not exist", _}]}} ->
156+
{:error, :no_user} ->
157157
error_component("That system #{decorator} does not exist.")
158158

159159
{:error, _} ->

‎lib/octocon_discord/commands/settings.ex‎

Lines changed: 14 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -56,33 +56,21 @@ defmodule OctoconDiscord.Commands.Settings do
5656

5757
def username(%{system_identity: system_identity}, options) do
5858
username = get_command_option(options, "username")
59-
user = Accounts.get_user!(system_identity)
6059

61-
if username == user.username do
62-
error_component("Your username is already set to `#{username}`.")
63-
else
64-
case Accounts.update_user(user, %{username: username}) do
65-
{:ok, _} ->
66-
success_component("Your username has been changed to `#{username}`.")
67-
68-
{:error,
69-
%Ecto.Changeset{
70-
errors: [
71-
username: {"has already been taken", _}
72-
]
73-
}} ->
74-
error_component("The username `#{username}` is already taken.")
75-
76-
{:error,
77-
%Ecto.Changeset{
78-
errors: [
79-
username: {"has invalid format", _}
80-
]
81-
}} ->
82-
error_component(
83-
"The username `#{username}` is invalid. It must satisfy the following criteria:\n\n- Between 5-16 characters\n- Only contains letters, numbers, dashes, and underscores\n- Does not start or end with a symbol\n- Does not consist of seven lowercase letters in a row (like a system ID)"
84-
)
85-
end
60+
case Accounts.update_username(system_identity, username) do
61+
{:error, :already_linked} ->
62+
error_component("Your username is already set to `#{username}`.")
63+
64+
{:error, :user_exists} ->
65+
error_component("The username `#{username}` is already taken.")
66+
67+
{:error, _} ->
68+
error_component(
69+
"The username `#{username}` is invalid. It must satisfy the following criteria:\n\n- Between 5-16 characters\n- Only contains letters, numbers, dashes, and underscores\n- Does not start or end with a symbol\n- Does not consist of seven lowercase letters in a row (like a system ID)"
70+
)
71+
72+
{:ok, _} ->
73+
success_component("Your username has been changed to `#{username}`.")
8674
end
8775
end
8876

‎lib/octocon_discord/guild_cache.ex‎

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,6 @@ defmodule OctoconDiscord.GuildCache do
1717
Struct.Channel,
1818
Struct.Emoji,
1919
Struct.Guild,
20-
Struct.Guild.Role,
2120
Struct.Sticker,
2221
Util
2322
}

‎lib/octocon_web/controllers/friend_request_controller.ex‎

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -186,6 +186,14 @@ defmodule OctoconWeb.FriendRequestController do
186186
code: "already_sent_request"
187187
})
188188

189+
{:error, :no_user} ->
190+
conn
191+
|> put_status(:bad_request)
192+
|> json(%{
193+
error: "That system does not exist.",
194+
code: "no_user"
195+
})
196+
189197
_ ->
190198
conn
191199
|> put_status(:internal_server_error)

‎lib/octocon_web/controllers/settings_controller.ex‎

Lines changed: 30 additions & 42 deletions
Original file line numberDiff line numberDiff line change
@@ -168,49 +168,37 @@ defmodule OctoconWeb.SettingsController do
168168

169169
def update_username(conn, %{"username" => username}) do
170170
system_id = conn.private[:guardian_default_resource]
171-
user = Accounts.get_user({:system, system_id})
172171

173-
if username == user.username do
174-
conn
175-
|> put_status(:bad_request)
176-
|> json(%{
177-
error: "Your username is already set to \"#{username}\".",
178-
code: "username_already_set"
179-
})
180-
else
181-
case Accounts.update_user(user, %{username: username}) do
182-
{:ok, _} ->
183-
conn
184-
|> put_status(:ok)
185-
|> json(%{message: "Your username has been changed to \"#{username}\"."})
186-
187-
{:error,
188-
%Ecto.Changeset{
189-
errors: [
190-
username: {"has already been taken", _}
191-
]
192-
}} ->
193-
conn
194-
|> put_status(:bad_request)
195-
|> json(%{
196-
error: "The username \"#{username}\" is already taken.",
197-
code: "username_taken"
198-
})
199-
200-
{:error,
201-
%Ecto.Changeset{
202-
# errors: [
203-
# username: {"has invalid format", _}
204-
# ]
205-
}} ->
206-
conn
207-
|> put_status(:bad_request)
208-
|> json(%{
209-
error:
210-
"The username \"#{username}\" is invalid. It must satisfy the following criteria:\n\n- Between 5-16 characters\n- Only contains letters, numbers, dashes, and underscores\n- Does not start or end with a symbol\n- Does not consist of seven lowercase letters in a row (like a system ID)",
211-
code: "username_invalid"
212-
})
213-
end
172+
case Accounts.update_username({:system, system_id}, username) do
173+
{:error, :already_linked} ->
174+
conn
175+
|> put_status(:bad_request)
176+
|> json(%{
177+
error: "Your username is already set to \"#{username}\".",
178+
code: "username_already_set"
179+
})
180+
181+
{:error, :user_exists} ->
182+
conn
183+
|> put_status(:bad_request)
184+
|> json(%{
185+
error: "The username \"#{username}\" is already taken.",
186+
code: "username_taken"
187+
})
188+
189+
{:error, _} ->
190+
conn
191+
|> put_status(:bad_request)
192+
|> json(%{
193+
error:
194+
"The username \"#{username}\" is invalid. It must satisfy the following criteria:\n\n- Between 5-16 characters\n- Only contains letters, numbers, dashes, and underscores\n- Does not start or end with a symbol\n- Does not consist of seven lowercase letters in a row (like a system ID)",
195+
code: "username_invalid"
196+
})
197+
198+
{:ok, _} ->
199+
conn
200+
|> put_status(:ok)
201+
|> json(%{message: "Your username has been changed to \"#{username}\"."})
214202
end
215203
end
216204

‎lib/octocon_web/utils/systems.ex‎

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -10,8 +10,6 @@ defmodule OctoconWeb.Utils.Systems do
1010
Friendships
1111
}
1212

13-
@spec parse_system(Plug.Conn.t(), String.t()) ::
14-
{:noreply, Plug.Conn.t()} | {:self, User.t()} | {:other, User.t()}
1513
def parse_system(conn, id)
1614

1715
def parse_system(conn, "me") do

0 commit comments

Comments
 (0)