Skip to content

Instantly share code, notes, and snippets.

@cronokirby
Created February 27, 2017 15:18
Show Gist options
  • Save cronokirby/398740082de29f60a5efcad91f984b46 to your computer and use it in GitHub Desktop.
Save cronokirby/398740082de29f60a5efcad91f984b46 to your computer and use it in GitHub Desktop.
defp evaluate(message, code) do
result = try do
{result, _} = Code.eval_string(code, [message: message], __ENV__)
result
rescue
e -> e
end
end
defp eval_embed(input, output) do
code_block = fn code ->
"```elixir\n" <> code <> "\n```"
end
%Embed{}
|> field("Input:", code_block.(input))
|> field("Output:", code_block.(output))
end
Cogs.set_parser(:eval, fn string ->
string
|> String.split(["```\n", "\n```"])
|> Enum.drop(1)
end)
# waits 5s for a result
Cogs.def eval(code) do
task = Task.async(fn -> evaluate(message, code) end)
case Task.yield(task) || Task.shutdown(task) do
{:ok, result} ->
embed = eval_embed(code, Macro.to_string(result)) |> build
Client.edit_message(message, "", embed: embed)
nil ->
embed = eval_embed(code, "Process took over 5s to yield a result.") |> build
Client.edit_message(message, "", embed: embed)
end
end
Cogs.def eval, do: nil
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment