summaryrefslogblamecommitdiff
path: root/lib/lsg_irc/user_mention_plugin.ex
blob: ca743c43c81240c52880e4b5ca0f42a995e51fee (plain) (tree)





















                                                                                                                                                                                                  


                       


























                                                                                                             
defmodule LSG.IRC.UserMentionPlugin 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(IRC.PubSub, "triggers", plugin: __MODULE__)
    {:ok, nil}
  end

  def handle_info({:irc, :trigger, nick, message = %IRC.Message{sender: sender, account: account, network: network, channel: channel, trigger: %IRC.Trigger{type: :at, args: content}}}, state) do
    nick = nick
    |> String.trim(":")
    |> String.trim(",")
    target = IRC.Account.find_always_by_nick(network, channel, nick)
    if target do
      telegram = IRC.Account.get_meta(target, "telegram-id")
      sms = IRC.Account.get_meta(target, "sms-number")
      text = "#{channel} <#{sender.nick}> #{Enum.join(content, " ")}"

      cond do
        telegram ->
          LSG.Telegram.send_message(telegram, "`#{channel}` <**#{sender.nick}**> #{Enum.join(content, " ")}")
        sms ->
          case LSG.IRC.SmsPlugin.send_sms(sms, text) do
            {:error, code} -> message.replyfun("#{sender.nick}: erreur #{code} (sms)")
          end
        true ->
          LSG.IRC.TellPlugin.tell(message, nick, content)
      end
    else
      message.replyfun.("#{nick} m'est inconnu")
    end
    {:noreply, state}
  end

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

end