30 lines
651 B
Elixir
30 lines
651 B
Elixir
|
|
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
|