summaryrefslogtreecommitdiff
path: root/lib/plugins/logger.ex
blob: 1418ddc5af5e4a5d8003a22eec9020381f8c477d (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
defmodule Nola.Plugins.Logger do
  require Logger

  @couch_db "bot-logs"

  def irc_doc(), do: nil

  def start_link() do
    GenServer.start_link(__MODULE__, [], name: __MODULE__)
  end

  def init([]) do
    regopts = [plugin: __MODULE__]
    {:ok, _} = Registry.register(Nola.PubSub, "triggers", regopts)
    {:ok, _} = Registry.register(Nola.PubSub, "messages", regopts)
    {:ok, _} = Registry.register(Nola.PubSub, "messages:telegram", regopts)
    {:ok, _} = Registry.register(Nola.PubSub, "irc:outputs", regopts)
    {:ok, _} = Registry.register(Nola.PubSub, "messages:private", regopts)
    {:ok, nil}
  end

  def handle_info({:irc, :trigger, _, m}, state) do
    {:noreply, log(m, state)}
  end

  def handle_info({:irc, :text, m}, state) do
    {:noreply, log(m, state)}
  end

  def handle_info({:irc, :out, m}, state) do
    {:noreply, log(m, state)}
  end

  def handle_info(info, state) do
    Logger.debug("logger_plugin: unhandled info: #{inspect(info)}")
    {:noreply, state}
  end

  def log(entry, state) do
    case Couch.post(@couch_db, format_to_db(entry)) do
      {:ok, id, _rev} ->
        Logger.debug("logger_plugin: saved: #{inspect(id)}")
        state

      error ->
        Logger.error("logger_plugin: save failed: #{inspect(error)}")
    end
  rescue
    e ->
      Logger.error("logger_plugin: rescued processing for #{inspect(entry)}: #{inspect(e)}")
      Logger.error(Exception.format(:error, e, __STACKTRACE__))
      state
  catch
    e, b ->
      Logger.error("logger_plugin: catched processing for #{inspect(entry)}: #{inspect(e)}")
      Logger.error(Exception.format(e, b, __STACKTRACE__))
      state
  end

  def format_to_db(msg = %Nola.Message{id: id}) do
    channel =
      cond do
        msg.channel -> msg.channel
        msg.account -> msg.account.id
        msg.sender -> msg.sender.nick
        true -> nil
      end

    id =
      [msg.network, channel, id]
      |> Enum.filter(& &1)
      |> Enum.join(":")

    %{
      "_id" => id,
      "type" => "nola.message:v1",
      "object" => %Nola.Message{msg | meta: Map.delete(msg.meta, :from)}
    }
  end

  def format_to_db(anything) do
    %{"_id" => FlakeId.get(), "type" => "object", "object" => anything}
  end
end