summaryrefslogtreecommitdiff
path: root/lib/plugins/user_mention.ex
blob: 1a9881cd0ce14286f5a46b6f4d02f850916d3ea9 (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
defmodule Nola.Plugins.UserMention do
  @moduledoc """
  # mention

  * **@`<nick>` `<message>`**: notifie si possible le nick immédiatement via Telegram, SMS, ou équivalent à `!tell`.
  """

  require Logger

  def short_irc_doc, do: false
  def irc_doc, do: @moduledoc

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

  def init(_) do
    {:ok, _} = Registry.register(Nola.PubSub, "triggers", plugin: __MODULE__)
    {:ok, nil}
  end

  def handle_info(
        {:irc, :trigger, nick,
         message = %Nola.Message{
           sender: sender,
           account: account,
           network: network,
           channel: channel,
           trigger: %Nola.Trigger{type: :at, args: content}
         }},
        state
      ) do
    nick =
      nick
      |> String.trim(":")
      |> String.trim(",")

    target = Nola.Account.find_always_by_nick(network, channel, nick)

    if target do
      telegram = Nola.Account.get_meta(target, "telegram-id")
      sms = Nola.Account.get_meta(target, "sms-number")
      text = "#{channel} <#{sender.nick}> #{Enum.join(content, " ")}"

      cond do
        telegram ->
          Nola.Telegram.send_message(
            telegram,
            "`#{channel}` <**#{sender.nick}**> #{Enum.join(content, " ")}"
          )

        sms ->
          case Nola.Plugins.Sms.send_sms(sms, text) do
            {:error, code} -> message.replyfun("#{sender.nick}: erreur #{code} (sms)")
          end

        true ->
          Nola.Plugins.Tell.tell(message, nick, content)
      end
    else
      false
    end

    {:noreply, state}
  end

  def handle_info(_, state) do
    {:noreply, state}
  end
end