2020-06-12 18:24:11 -04:00
|
|
|
defmodule Omnibot.Module do
|
2020-06-13 15:20:00 -04:00
|
|
|
defmodule Hooks do
|
|
|
|
|
defmacro __before_compile__(_env) do
|
2020-06-13 16:04:19 -04:00
|
|
|
quote generated: true do
|
2020-06-13 15:20:00 -04:00
|
|
|
@impl true
|
|
|
|
|
def on_channel_msg(_channel, _nick, _line), do: nil
|
|
|
|
|
|
|
|
|
|
@impl true
|
|
|
|
|
def on_channel_msg(_channel, _nick, _cmd, _params), do: nil
|
|
|
|
|
|
|
|
|
|
@impl true
|
|
|
|
|
def on_join(_channel, _nick), do: nil
|
|
|
|
|
|
|
|
|
|
@impl true
|
|
|
|
|
def on_part(_channel, _nick), do: nil
|
|
|
|
|
|
|
|
|
|
@impl true
|
|
|
|
|
def on_kick(_channel, _nick), do: nil
|
|
|
|
|
end
|
|
|
|
|
end
|
|
|
|
|
end
|
|
|
|
|
|
2020-06-12 18:24:11 -04:00
|
|
|
defmacro __using__([]) do
|
|
|
|
|
quote do
|
2020-06-13 15:20:00 -04:00
|
|
|
use Agent
|
2020-06-12 18:24:11 -04:00
|
|
|
alias Omnibot.{Irc, Module}
|
2020-06-13 15:20:00 -04:00
|
|
|
import Omnibot.Module
|
2020-06-12 18:24:11 -04:00
|
|
|
require Logger
|
|
|
|
|
|
|
|
|
|
@behaviour Module
|
|
|
|
|
|
|
|
|
|
def start_link(opts) do
|
2020-06-13 15:20:00 -04:00
|
|
|
Agent.start_link(fn -> opts[:cfg] end, opts ++ [name: __MODULE__])
|
2020-06-12 18:24:11 -04:00
|
|
|
end
|
|
|
|
|
|
2020-06-13 15:20:00 -04:00
|
|
|
def cfg do
|
|
|
|
|
Agent.get(__MODULE__, & &1)
|
|
|
|
|
end
|
2020-06-12 18:24:11 -04:00
|
|
|
|
|
|
|
|
@impl Module
|
|
|
|
|
def on_msg(msg) do
|
2020-06-13 15:20:00 -04:00
|
|
|
# TODO - instead of using a router for modules, consider using a PubSub with a Registry:
|
|
|
|
|
# https://hexdocs.pm/elixir/master/Registry.html#module-using-as-a-pubsub
|
2020-06-12 18:24:11 -04:00
|
|
|
route_msg(msg)
|
|
|
|
|
end
|
|
|
|
|
|
2020-06-13 15:20:00 -04:00
|
|
|
defp route_msg(msg) do
|
2020-06-12 18:24:11 -04:00
|
|
|
nick = msg.prefix.nick
|
2020-06-13 15:20:00 -04:00
|
|
|
|
2020-06-12 18:24:11 -04:00
|
|
|
case String.upcase(msg.command) do
|
2020-06-13 15:20:00 -04:00
|
|
|
"PRIVMSG" ->
|
|
|
|
|
[channel | params] = msg.params
|
|
|
|
|
line = Enum.join(params, " ")
|
|
|
|
|
|
|
|
|
|
case String.split(line, " ") do
|
|
|
|
|
[cmd | params] -> on_channel_msg(channel, nick, cmd, params)
|
|
|
|
|
_ -> on_channel_msg(channel, nick, line)
|
|
|
|
|
end
|
|
|
|
|
|
|
|
|
|
"JOIN" ->
|
|
|
|
|
[channel | _] = msg.params
|
2020-06-12 18:24:11 -04:00
|
|
|
on_join(channel, nick)
|
2020-06-13 15:20:00 -04:00
|
|
|
|
|
|
|
|
"PART" ->
|
|
|
|
|
[channel | _] = msg.params
|
2020-06-12 18:24:11 -04:00
|
|
|
on_part(channel, nick)
|
2020-06-13 15:20:00 -04:00
|
|
|
|
|
|
|
|
"KICK" ->
|
|
|
|
|
[channel | _] = msg.params
|
2020-06-12 18:24:11 -04:00
|
|
|
on_kick(channel, nick)
|
2020-06-13 15:20:00 -04:00
|
|
|
|
|
|
|
|
_ ->
|
|
|
|
|
nil
|
2020-06-12 18:24:11 -04:00
|
|
|
end
|
|
|
|
|
end
|
|
|
|
|
|
2020-06-13 15:20:00 -04:00
|
|
|
defoverridable Module
|
2020-06-12 18:24:11 -04:00
|
|
|
|
2020-06-13 15:20:00 -04:00
|
|
|
@before_compile Omnibot.Module.Hooks
|
|
|
|
|
end
|
|
|
|
|
end
|
2020-06-12 18:24:11 -04:00
|
|
|
|
2020-06-13 15:20:00 -04:00
|
|
|
@callback on_msg(msg :: %Omnibot.Irc.Msg{}) :: any
|
|
|
|
|
@callback on_channel_msg(channel :: String.t(), nick :: String.t(), line :: String.t()) :: any
|
|
|
|
|
@callback on_channel_msg(
|
|
|
|
|
channel :: String.t(),
|
|
|
|
|
nick :: String.t(),
|
|
|
|
|
cmd :: String.t(),
|
|
|
|
|
params :: [String.t()]
|
|
|
|
|
) :: any
|
|
|
|
|
@callback on_join(channel :: String.t(), nick :: String.t()) :: any
|
|
|
|
|
@callback on_part(channel :: String.t(), nick :: String.t()) :: any
|
|
|
|
|
@callback on_kick(channel :: String.t(), nick :: String.t()) :: any
|
2020-06-12 18:24:11 -04:00
|
|
|
|
2020-06-13 15:20:00 -04:00
|
|
|
defmacro command(cmd, opts) do
|
|
|
|
|
quote generated: true do
|
|
|
|
|
@impl Omnibot.Module
|
|
|
|
|
def on_channel_msg(var!(channel), var!(nick), unquote(cmd), var!(params)) do
|
|
|
|
|
unquote(opts[:do])
|
2020-06-12 18:24:11 -04:00
|
|
|
end
|
|
|
|
|
end
|
|
|
|
|
end
|
|
|
|
|
|
2020-06-13 15:20:00 -04:00
|
|
|
defmacro command(cmd, params, opts) do
|
|
|
|
|
params =
|
|
|
|
|
Enum.map(
|
2020-06-13 15:22:12 -04:00
|
|
|
params,
|
2020-06-13 15:20:00 -04:00
|
|
|
fn param ->
|
|
|
|
|
case param do
|
|
|
|
|
{_, _, _} -> quote(do: var!(unquote(param)))
|
|
|
|
|
lit -> Macro.escape(lit)
|
|
|
|
|
end
|
|
|
|
|
end
|
|
|
|
|
)
|
|
|
|
|
|
|
|
|
|
quote generated: true do
|
|
|
|
|
@impl Omnibot.Module
|
|
|
|
|
def on_channel_msg(var!(channel), var!(nick), unquote(cmd), unquote(params)) do
|
|
|
|
|
unquote(opts[:do])
|
|
|
|
|
end
|
|
|
|
|
end
|
|
|
|
|
end
|
2020-06-12 18:24:11 -04:00
|
|
|
end
|