Arbitrary code execution Discord bot
Find a file
2019-06-15 21:22:43 -04:00
docker Create new workspace for every eval 2019-06-15 21:22:43 -04:00
src Create new workspace for every eval 2019-06-15 21:22:43 -04:00
.eslintrc.json Initial commit 2019-03-12 05:09:46 -04:00
.gitattributes Initial commit 2019-03-12 05:09:46 -04:00
.gitignore Initial commit 2019-03-12 05:09:46 -04:00
CHANGELOG.md Bump to version 1.9.0 2019-06-03 19:01:32 -04:00
config.example.json Add retry functionality 2019-05-21 11:50:16 -04:00
CONTRIBUTING.md Add CONTRIBUTING.md 2019-03-12 12:01:07 -04:00
LICENSE Initial commit 2019-03-12 05:09:46 -04:00
package-lock.json Update deps 2019-05-16 22:52:49 -04:00
package.json Bump to version 1.9.0 2019-06-03 19:01:32 -04:00
README.md Add APL 2019-05-25 15:03:40 -04:00

Comp_iler

Sandboxed code execution discord bot.
Invite the bot!

Usage

Code Blocks

>```lang
code
```
>options```lang
code
```

Inline Code

>`lang code`
>options`lang code`

Examples

>```cpp
#include <iostream>

int main()
{
    std::cout << "Hello World!" << std::endl;
}
```
>harmony```js
class Foo {
    bar = 1;
}

console.log(new Foo().bar);
```
>`py print('hello world')`
>e`hs (+) <$> Just 1 <*> Just 2`

Supported Languages and Options

One of the following language codes is set in lang.
Options are optionally set in options, which is a semicolon-delimited list of flag or flag=value.

  • apl APL
  • bash Bash
  • bf Brainfuck
  • c C (GCC)
  • clj Clojure
  • cpp C++ (G++)
  • cs C# (Mono)
    • e evaluates a single expression instead of a module
  • elixir Elixir
  • fs F# (Mono)
  • go Go
  • hs Haskell (GHC)
    • e evaluates a single expression instead of a module
  • java Java (OpenJDK)
  • js JavaScript (Node)
    • harmony enables harmony features (--harmony on node)
  • julia Julia
    • e prints the result of evaluating the code
  • lisp Racket
  • lua Lua
  • ocaml OCaml
  • pas Pascal (FPC)
  • php PHP
  • pl Perl5
  • prolog Prolog (SWI-Prolog)
  • py Python (CPython)
    • 2 runs Python 2 instead of Python 3
  • rb Ruby
  • rs Rust

How it Works

Read the source code, specifically src/struct/LanguageHandler.js.
In summary, for every language there is a docker image which spins up a docker container.
The container is used for all evaluations of code, restarting if something goes wrong.
The container is locked down, so there is no networking, limited memory and CPU usage, and a time limit.

Setup

  1. Install Docker 18+
  2. Install Node 10+
  3. Run npm i
  4. Fill out config.json as described in the configuration section below
  5. Run node .

Configuration

Bot

  • owner - The owner(s) of the bot.
    Use an array for multiple owners.
  • token - The bot token.
  • prefix - The prefix for commands.
  • codePrefix - The prefix for code evaluation.

Setup

  • languages Languages to use.
    The language names here are different from the user-facing ones.
    Check the filenames in src/languages/ for the language names.
    Change to null to enable all languages.
  • prepare Whether to start containers on setup.
    Setting to true will speed up the first eval, but that language might not be used.
  • parallel Whether to build images in parallel.
    Will also setup containers in parallel if prepare is set.
    Faster, but will take more resources.
  • cleanup Interval in minutes to occasionally kill all containers.
    Set to 0 to disable.

Compilers

For each of these options, you can use either the expected value to set it for all compilers or an object with compiler names to the expected values.
If using an object, you can set the default with the default key.
The compiler names are the folder names under docker/.

  • memory Max memory usage of a container.
  • cpu Max CPU usage of a container.
  • timeout Time limit for code in milliseconds.
  • concurrent Number of code evaluations than can run at a time per container.
    The more that can run, the more resources a container would need.
  • retries Maximum number of retries for an evaluation. Evaluations are retried when all concurrent evaluations fail because one failed.