Skip to content

Commit 886394a

Browse files
committed
Update Discord API to v10
What: Updates the Discord client to use version 10 of the Discord API and account for its quirks/changes. Why: The version of the Discord API was very old and will likely stop working in the near future. Plus it's good to do as general maintenance. Notes: Discord seems to waffle between sending us integers and strings for permissions bitfield values depending on what permission level you are (e.g. users with room owner permissions seemed to have integers sent, but non-privileged users seemed to have strings sent), so this had to be accounted for by testing whether the value was a string or not and converting any strings to integers. Discord has changed and usernames for people are now enforced to be unique and the discriminator numbers aren't appended to the end anymore (Discord bots still use discriminators, but this isn't relevant to us). https://discord.fandom.com/wiki/Discriminator
1 parent 2f4fd7a commit 886394a

File tree

1 file changed

+23
-7
lines changed

1 file changed

+23
-7
lines changed

lib/ret/discord_client.ex

Lines changed: 23 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@ defmodule Ret.DiscordClient do
33
import Bitwise
44

55
@oauth_scope "identify email"
6-
@discord_api_base "https://discordapp.com/api/v6"
6+
@discord_api_base "https://discord.com/api/v10"
77

88
def get_oauth_url(hub_sid) do
99
authorize_params = %{
@@ -91,7 +91,7 @@ defmodule Ret.DiscordClient do
9191
}) do
9292
case Cachex.fetch(:discord_api, "/users/#{provider_account_id}") do
9393
{status, result} when status in [:commit, :ok] ->
94-
"#{result["username"]}##{result["discriminator"]}"
94+
"#{result["username"]}"
9595
end
9696
end
9797

@@ -161,13 +161,18 @@ defmodule Ret.DiscordClient do
161161
case Cachex.fetch(:discord_api, "/guilds/#{community_id}/roles") do
162162
{status, result} when status in [:commit, :ok] -> result |> Map.new(&{&1["id"], &1})
163163
end
164+
# Note: Whether the bitfield values in guild_roles are represented as strings or integers is inconsistent (possibly based on what permissions the user has), so every time they're used they need to be checked and, if needed, converted to integers.
164165

165166
role_everyone = guild_roles[community_id]
166167
permissions = role_everyone["permissions"]
167168

168169
user_permissions = user_roles |> Enum.map(&guild_roles[&1]["permissions"])
169170

170-
permissions = user_permissions |> Enum.reduce(permissions, &(&1 ||| &2))
171+
permissions = user_permissions |>
172+
Enum.reduce(permissions, &(
173+
if is_binary(&1), do: String.to_integer(&1), else: &1 |||
174+
if is_binary(&2), do: String.to_integer(&2), else: &2
175+
))
171176

172177
if (permissions &&& @administrator) == @administrator do
173178
@all
@@ -190,12 +195,15 @@ defmodule Ret.DiscordClient do
190195
|> Map.get("permission_overwrites")
191196
|> Map.new(&{&1["id"], &1})
192197
end
198+
# Note: Whether the bitfield values in channel_overwrites are represented as strings or integers is inconsistent (possibly based on what permissions the user has), so every time they're used they need to be checked and, if needed, converted to integers.
193199

194200
overwrite_everyone = channel_overwrites[community_id]
195201

196202
permissions =
197203
if overwrite_everyone do
198-
(permissions &&& ~~~overwrite_everyone["deny"]) ||| overwrite_everyone["allow"]
204+
(permissions &&&
205+
~~~if is_binary(overwrite_everyone["deny"]), do: String.to_integer(overwrite_everyone["deny"]), else: overwrite_everyone["deny"]) |||
206+
if is_binary(overwrite_everyone["allow"]), do: String.to_integer(overwrite_everyone["allow"]), else: overwrite_everyone["allow"]
199207
else
200208
permissions
201209
end
@@ -204,8 +212,14 @@ defmodule Ret.DiscordClient do
204212
user_permissions =
205213
user_roles |> Enum.map(&channel_overwrites[&1]) |> Enum.filter(&(&1 != nil))
206214

207-
allow = user_permissions |> Enum.reduce(@none, &(&1["allow"] ||| &2))
208-
deny = user_permissions |> Enum.reduce(@none, &(&1["deny"] ||| &2))
215+
allow = user_permissions |> Enum.reduce(@none, &(
216+
if is_binary(&1["allow"]), do: String.to_integer(&1["allow"]), else: &1["allow"] |||
217+
&2
218+
))
219+
deny = user_permissions |> Enum.reduce(@none, &(
220+
if is_binary(&1["deny"]), do: String.to_integer(&1["deny"]), else: &1["deny"] |||
221+
&2
222+
))
209223

210224
permissions = (permissions &&& ~~~deny) ||| allow
211225

@@ -214,7 +228,9 @@ defmodule Ret.DiscordClient do
214228

215229
permissions =
216230
if overwrite_member do
217-
(permissions &&& ~~~overwrite_member["deny"]) ||| overwrite_member["allow"]
231+
(permissions &&&
232+
~~~if is_binary(overwrite_member["deny"]), do: String.to_integer(overwrite_member["deny"]), else: overwrite_member["deny"]) |||
233+
if is_binary(overwrite_member["allow"]), do: String.to_integer(overwrite_member["allow"]), else: overwrite_member["allow"]
218234
else
219235
permissions
220236
end

0 commit comments

Comments
 (0)