summaryrefslogtreecommitdiff
path: root/lib/lsg/telegram_room.ex
blob: f973c5800fe9a668cd0dd6f59dd7fa46c8bbc637 (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
defmodule LSG.TelegramRoom do
  require Logger
  @behaviour Telegram.ChatBot
  alias Telegram.Api

  @impl Telegram.ChatBot
  def init(id) do
    token = Keyword.get(Application.get_env(:lsg, :telegram, []), :key)
    {:ok, chat} = Api.request(token, "getChat", chat_id: id)
    Logger.debug("Starting ChatBot for room #{id} \"#{chat["title"]}\"")
    [net, chan] = String.split(chat["title"], "/", parts: 2)
    case IRC.Connection.get_network(net, chan) do
      %IRC.Connection{} ->
        :global.register_name({__MODULE__, net, chan}, self())
        {:ok, _} = Registry.register(IRC.PubSub, "#{net}/#{chan}:message", plugin: __MODULE__)
        {:ok, _} = Registry.register(IRC.PubSub, "#{net}/#{chan}:triggers", plugin: __MODULE__)
      err ->
        Logger.warn("Did not found telegram match for #{id} \"#{chat["title"]}\"")
    end
    {:ok, %{id: id, net: net, chan: chan}}
  end

  def handle_update(%{"message" => %{"from" => %{"id" => user_id}, "text" => text}}, _token, state) do
    account = IRC.Account.find_meta_account("telegram-id", user_id)
    connection = IRC.Connection.get_network(state.net)
    IRC.PuppetConnection.send_message(account, connection, state.chan, text)
    {:ok, state}
  end

  def handle_update(update, token, state) do
    {:ok, state}
  end

  def handle_info({:irc, _, %IRC.Message{sender: %{nick: nick}, text: text}}, state) do
    LSG.Telegram.send_message(state.id, "<#{nick}> #{text}")
    {:ok, state}
  end

  def handle_info({:raw, lines}, state) when is_list(lines) do
    formatted = for l <- lines, into: <<>>, do: l <> "\n"
    LSG.Telegram.send_message(state.id, formatted)
    {:ok, state}
  end

  def handle_info({:raw, line}, state) do
    handle_info({:raw, [line]}, state)
  end

  def handle_info(info, state) do
    {:ok, state}
  end

end