Add Omnibot.Module
Modules can easily be defined with `use Omnibot.Module`. Omnibot.Contrib.Fortune has been updated to use this. Signed-off-by: Alek Ratzloff <alekratz@gmail.com>
This commit is contained in:
72
lib/module.ex
Normal file
72
lib/module.ex
Normal file
@@ -0,0 +1,72 @@
|
||||
defmodule Omnibot.Module do
|
||||
defmacro __using__([]) do
|
||||
quote do
|
||||
use GenServer
|
||||
alias Omnibot.{Irc, Module}
|
||||
require Logger
|
||||
|
||||
@behaviour Module
|
||||
|
||||
## Client API
|
||||
|
||||
def start_link(opts) do
|
||||
GenServer.start_link(__MODULE__, opts[:cfg], opts ++ [name: __MODULE__])
|
||||
end
|
||||
|
||||
def msg(msg), do: GenServer.cast(__MODULE__, msg)
|
||||
def msg(module, msg), do: GenServer.cast(module, {:msg, msg})
|
||||
|
||||
## Server callbacks
|
||||
|
||||
@impl GenServer
|
||||
def init(cfg), do: {:ok, cfg}
|
||||
|
||||
@impl Module
|
||||
def on_msg(msg) do
|
||||
route_msg(msg)
|
||||
end
|
||||
|
||||
def route_msg(msg) do
|
||||
nick = msg.prefix.nick
|
||||
case String.upcase(msg.command) do
|
||||
"PRIVMSG" -> [channel | text] = msg.params
|
||||
on_channel_msg(channel, nick, Enum.join(text, " "))
|
||||
"JOIN" -> [channel | _] = msg.params
|
||||
on_join(channel, nick)
|
||||
"PART" -> [channel | _] = msg.params
|
||||
on_part(channel, nick)
|
||||
"KICK" -> [channel | _] = msg.params
|
||||
on_kick(channel, nick)
|
||||
_ -> nil
|
||||
end
|
||||
end
|
||||
|
||||
@impl Module
|
||||
def on_channel_msg(_channel, _nick, _line), do: nil
|
||||
|
||||
@impl Module
|
||||
def on_join(_channel, _nick), do: nil
|
||||
|
||||
@impl Module
|
||||
def on_part(_channel, _nick), do: nil
|
||||
|
||||
@impl Module
|
||||
def on_kick(_channel, _nick), do: nil
|
||||
|
||||
@impl GenServer
|
||||
def handle_cast({:msg, msg}, cfg) do
|
||||
on_msg(msg)
|
||||
{:noreply, cfg}
|
||||
end
|
||||
|
||||
defoverridable Module
|
||||
defoverridable GenServer
|
||||
end
|
||||
end
|
||||
|
||||
@callback on_msg(msg :: %Omnibot.Irc.Msg{}) :: any
|
||||
@callback on_channel_msg(channel :: String.t, nick :: String.t, line :: 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
|
||||
end
|
||||
Reference in New Issue
Block a user