Rename Omnibot.Module -> Omnibot.Module.Base, add Omnibot.Module with agent

Previously, all modules were Agents. This renames the Omnibot.Module to
be the base module, and the new Omnibot.Module uses an Agent by default.

This opens the doors to possibly allowing metamodule supervisors for
modules that may be more complex.

Signed-off-by: Alek Ratzloff <alekratz@gmail.com>
This commit is contained in:
2020-06-14 17:34:06 -04:00
parent 95fc775349
commit 76d96c2fe2
2 changed files with 37 additions and 30 deletions

View File

@@ -1,4 +1,4 @@
defmodule Omnibot.Module do defmodule Omnibot.Module.Base do
defmodule Hooks do defmodule Hooks do
defmacro __before_compile__(_env) do defmacro __before_compile__(_env) do
quote generated: true do quote generated: true do
@@ -30,35 +30,13 @@ defmodule Omnibot.Module do
defmacro __using__([]) do defmacro __using__([]) do
quote do quote do
use Agent
alias Omnibot.{Irc, Module} alias Omnibot.{Irc, Module}
import Omnibot.Module import Omnibot.Module.Base
require Logger require Logger
@behaviour Module @behaviour Module.Base
def start_link(opts) do @impl Module.Base
cfg = opts[:cfg]
Agent.start_link(fn -> {cfg, on_init(cfg)} end, opts ++ [name: __MODULE__])
end
def cfg do
Agent.get(__MODULE__, fn {cfg, _} -> cfg end)
end
def state do
Agent.get(__MODULE__, fn {_, state} -> state end)
end
def update_state(update, timeout \\ 5000) do
Agent.update(
__MODULE__,
fn {cfg, state} -> {cfg, apply(update, [state])} end,
timeout
)
end
@impl Module
def on_msg(irc, msg) do def on_msg(irc, msg) do
# TODO - instead of using a router for modules, consider using a PubSub with a Registry: # 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 # https://hexdocs.pm/elixir/master/Registry.html#module-using-as-a-pubsub
@@ -97,11 +75,11 @@ defmodule Omnibot.Module do
end end
end end
defoverridable Module defoverridable Module.Base
@commands MapSet.new() @commands MapSet.new()
@default_config [] @default_config []
@before_compile Omnibot.Module.Hooks @before_compile Omnibot.Module.Base.Hooks
end end
end end
@@ -123,7 +101,7 @@ defmodule Omnibot.Module do
defmacro command(cmd, opts) do defmacro command(cmd, opts) do
quote generated: true do quote generated: true do
@commands MapSet.put(@commands, unquote(cmd)) @commands MapSet.put(@commands, unquote(cmd))
@impl Omnibot.Module @impl Omnibot.Module.Base
def on_channel_msg(var!(irc), var!(channel), var!(nick), unquote(cmd), var!(params)) do def on_channel_msg(var!(irc), var!(channel), var!(nick), unquote(cmd), var!(params)) do
unquote(opts[:do]) unquote(opts[:do])
end end
@@ -144,7 +122,7 @@ defmodule Omnibot.Module do
quote generated: true do quote generated: true do
@commands MapSet.put(@commands, unquote(cmd)) @commands MapSet.put(@commands, unquote(cmd))
@impl Omnibot.Module @impl Omnibot.Module.Base
def on_channel_msg(var!(irc), var!(channel), var!(nick), unquote(cmd), unquote(params)) do def on_channel_msg(var!(irc), var!(channel), var!(nick), unquote(cmd), unquote(params)) do
unquote(opts[:do]) unquote(opts[:do])
end end

29
lib/module/module.ex Normal file
View File

@@ -0,0 +1,29 @@
defmodule Omnibot.Module do
defmacro __using__([]) do
quote do
use Omnibot.Module.Base
use Agent
def start_link(opts) do
cfg = opts[:cfg]
Agent.start_link(fn -> {cfg, on_init(cfg)} end, opts ++ [name: __MODULE__])
end
def cfg do
Agent.get(__MODULE__, fn {cfg, _} -> cfg end)
end
def state do
Agent.get(__MODULE__, fn {_, state} -> state end)
end
def update_state(update, timeout \\ 5000) do
Agent.update(
__MODULE__,
fn {cfg, state} -> {cfg, apply(update, [state])} end,
timeout
)
end
end
end
end