Current section

22 Versions

Jump to

Compare versions

5 files changed
+58 additions
-11 deletions
  @@ -1,6 +1,6 @@
1 1 {<<"links">>,[{<<"Github">>,<<"https://github.com/mrdotb/disco-log">>}]}.
2 2 {<<"name">>,<<"disco_log">>}.
3 - {<<"version">>,<<"0.5.0">>}.
3 + {<<"version">>,<<"0.5.1">>}.
4 4 {<<"description">>,
5 5 <<"Use Discord as a logging service and error tracking solution">>}.
6 6 {<<"elixir">>,<<"~> 1.17">>}.
  @@ -10,8 +10,8 @@
10 10 [<<"lib">>,<<"lib/disco_log">>,<<"lib/disco_log/application.ex">>,
11 11 <<"lib/disco_log/context.ex">>,<<"lib/disco_log/client.ex">>,
12 12 <<"lib/disco_log/config.ex">>,<<"lib/disco_log/discord.ex">>,
13 - <<"lib/disco_log/stacktrace.ex">>,<<"lib/disco_log/discord">>,
14 - <<"lib/disco_log/discord/context.ex">>,
13 + <<"lib/disco_log/encoder.ex">>,<<"lib/disco_log/stacktrace.ex">>,
14 + <<"lib/disco_log/discord">>,<<"lib/disco_log/discord/context.ex">>,
15 15 <<"lib/disco_log/discord/client.ex">>,<<"lib/disco_log/discord/config.ex">>,
16 16 <<"lib/disco_log/error.ex">>,<<"lib/disco_log/dedupe.ex">>,
17 17 <<"lib/disco_log/logger_handler.ex">>,<<"lib/disco_log/storage.ex">>,
  @@ -8,6 +8,7 @@ defmodule DiscoLog.Discord.Client do
8 8 require Logger
9 9
10 10 @base_url "https://discord.com/api/v10"
11 + @version DiscoLog.MixProject.project()[:version]
11 12
12 13 def list_channels(opts) do
13 14 guild_id = Keyword.get(opts, :guild_id, Discord.Config.guild_id())
  @@ -129,7 +130,10 @@ defmodule DiscoLog.Discord.Client do
129 130 defp client do
130 131 Req.new(
131 132 base_url: @base_url,
132 - headers: [{"Authorization", "Bot #{Discord.Config.token()}"}]
133 + headers: [
134 + {"User-Agent", "DiscoLog (https://github.com/mrdotb/disco-log, #{@version})"},
135 + {"Authorization", "Bot #{Discord.Config.token()}"}
136 + ]
133 137 )
134 138 |> maybe_add_debug_log(Discord.Config.enable_log?())
135 139 end
  @@ -4,6 +4,7 @@ defmodule DiscoLog.Discord.Context do
4 4 """
5 5
6 6 alias DiscoLog.Discord
7 + alias DiscoLog.Encoder
7 8
8 9 def fetch_or_create_channel(channels, channel_config, parent_id) do
9 10 case Enum.find(channels, &find_channel(&1, channel_config)) do
  @@ -60,7 +61,7 @@ defmodule DiscoLog.Discord.Context do
60 61 defp prepare_occurrence_thread_fields(error) do
61 62 [
62 63 payload_json:
63 - Jason.encode!(
64 + Encoder.encode!(
64 65 %{
65 66 name: thread_name(error),
66 67 message: prepare_error_message(error)
  @@ -74,7 +75,7 @@ defmodule DiscoLog.Discord.Context do
74 75
75 76 defp prepare_occurrence_message_fields(error) do
76 77 [
77 - payload_json: Jason.encode!(prepare_error_message(error))
78 + payload_json: Encoder.encode!(prepare_error_message(error))
78 79 ]
79 80 |> put_stacktrace(error.stacktrace)
80 81 |> maybe_put_context(error.context)
  @@ -136,14 +137,14 @@ defmodule DiscoLog.Discord.Context do
136 137 Keyword.put(
137 138 fields,
138 139 :context,
139 - {Jason.encode!(context, pretty: true), filename: "context.json"}
140 + {Encoder.encode!(context, pretty: true), filename: "context.json"}
140 141 )
141 142 end
142 143
143 144 def create_message(channel_id, message, metadata) when is_binary(message) do
144 145 [
145 146 payload_json:
146 - Jason.encode!(%{
147 + Encoder.encode!(%{
147 148 content: message
148 149 })
149 150 ]
  @@ -153,7 +154,7 @@ defmodule DiscoLog.Discord.Context do
153 154
154 155 def create_message(channel_id, message, metadata) when is_map(message) do
155 156 [
156 - message: {Jason.encode!(message, pretty: true), filename: "message.json"}
157 + message: {Encoder.encode!(message, pretty: true), filename: "message.json"}
157 158 ]
158 159 |> maybe_put_metadata(metadata)
159 160 |> Discord.Client.create_form_message(channel_id: channel_id)
  @@ -165,7 +166,7 @@ defmodule DiscoLog.Discord.Context do
165 166 Keyword.put(
166 167 fields,
167 168 :metadata,
168 - {Jason.encode!(metadata, pretty: true), filename: "metadata.json"}
169 + {Encoder.encode!(metadata, pretty: true), filename: "metadata.json"}
169 170 )
170 171 end
  @@ -0,0 +1,37 @@
1 + defmodule DiscoLog.Encoder do
2 + @moduledoc """
3 + Provide a safe encoding for map message which can containing any kind of
4 + Elixir values and need to be safely encoded to JSON.
5 + """
6 + def encode!(value, opts \\ []) do
7 + value
8 + |> encode_value()
9 + |> Jason.encode!(opts)
10 + end
11 +
12 + defp encode_value(value) when is_map(value) do
13 + value
14 + |> Enum.map(fn {key, value} -> {key, encode_value(value)} end)
15 + |> Enum.into(%{})
16 + end
17 +
18 + defp encode_value(value) when is_list(value), do: Enum.map(value, &encode_value/1)
19 +
20 + defp encode_value(value) when is_tuple(value),
21 + do: Enum.map(Tuple.to_list(value), &encode_value/1)
22 +
23 + defp encode_value(value) when is_pid(value), do: :erlang.pid_to_list(value)
24 + defp encode_value(value) when is_port(value), do: :erlang.port_to_list(value)
25 + defp encode_value(value) when is_atom(value), do: Atom.to_string(value)
26 + # If the binary is not a valid utf-8 string, we convert it to a utf-8 representation
27 + defp encode_value(value) when is_binary(value) do
28 + if String.valid?(value) do
29 + value
30 + else
31 + inspect(value, binaries: :as_binaries)
32 + end
33 + end
34 +
35 + # Other types are safe to be encoded as is
36 + defp encode_value(value), do: value
37 + end
  @@ -1,17 +1,21 @@
1 1 defmodule DiscoLog.MixProject do
2 2 use Mix.Project
3 3
4 + @source_url "https://github.com/mrdotb/disco-log"
5 + @version "0.5.1"
6 +
4 7 def project do
5 8 [
6 9 app: :disco_log,
7 10 aliases: aliases(),
8 - version: "0.5.0",
11 + version: @version,
9 12 elixir: "~> 1.17",
10 13 elixirc_paths: elixirc_paths(Mix.env()),
11 14 start_permanent: Mix.env() == :prod,
12 15 deps: deps(),
13 16 package: package(),
14 17 description: description(),
18 + source_url: @source_url,
15 19 docs: [
16 20 main: "DiscoLog",
17 21 formatters: ["html"],
  @@ -56,6 +60,7 @@ defmodule DiscoLog.MixProject do
56 60 {:plug, "~> 1.10"},
57 61 {:req, "~> 0.5.6"},
58 62 # Dev & test dependencies
63 + {:git_ops, "~> 2.6.1", only: [:dev]},
59 64 {:credo, "~> 1.7", only: [:dev, :test]},
60 65 {:ex_doc, "~> 0.33", only: :dev},
61 66 {:phoenix_live_reload, "~> 1.2", only: :dev},