2019-03-12 10:09:46 +01:00
|
|
|
# Comp_iler
|
|
|
|
|
2019-05-17 02:29:24 +02:00
|
|
|
Sandboxed code execution discord bot.
|
|
|
|
[Invite the bot!](https://discordapp.com/oauth2/authorize?client_id=555066722969714728&scope=bot)
|
2019-03-12 10:09:46 +01:00
|
|
|
|
|
|
|
## Usage
|
|
|
|
|
|
|
|
### Code Blocks
|
|
|
|
|
|
|
|
````
|
|
|
|
>```lang
|
|
|
|
code
|
|
|
|
```
|
2019-05-15 03:05:12 +02:00
|
|
|
````
|
2019-03-12 10:09:46 +01:00
|
|
|
|
2019-05-15 03:05:12 +02:00
|
|
|
````
|
2019-03-13 06:54:36 +01:00
|
|
|
>options```lang
|
2019-03-12 10:09:46 +01:00
|
|
|
code
|
|
|
|
```
|
|
|
|
````
|
|
|
|
|
|
|
|
### Inline Code
|
|
|
|
|
|
|
|
```
|
|
|
|
>`lang code`
|
2019-05-15 03:05:12 +02:00
|
|
|
```
|
2019-03-12 10:09:46 +01:00
|
|
|
|
2019-05-15 03:05:12 +02:00
|
|
|
```
|
2019-03-13 06:54:36 +01:00
|
|
|
>options`lang code`
|
2019-03-15 02:58:43 +01:00
|
|
|
```
|
2019-03-12 10:09:46 +01:00
|
|
|
|
|
|
|
### Examples
|
|
|
|
|
|
|
|
````
|
2019-03-15 02:58:43 +01:00
|
|
|
>```cpp
|
|
|
|
#include <iostream>
|
|
|
|
|
|
|
|
int main()
|
|
|
|
{
|
|
|
|
std::cout << "Hello World!" << std::endl;
|
|
|
|
}
|
2019-03-12 10:09:46 +01:00
|
|
|
```
|
2019-05-15 03:05:12 +02:00
|
|
|
````
|
2019-03-12 10:09:46 +01:00
|
|
|
|
2019-05-15 03:05:12 +02:00
|
|
|
````
|
2019-03-13 06:54:36 +01:00
|
|
|
>harmony```js
|
2019-03-12 10:09:46 +01:00
|
|
|
class Foo {
|
|
|
|
bar = 1;
|
|
|
|
}
|
|
|
|
|
|
|
|
console.log(new Foo().bar);
|
|
|
|
```
|
2019-05-15 03:05:12 +02:00
|
|
|
````
|
2019-03-12 10:09:46 +01:00
|
|
|
|
2019-05-15 03:05:12 +02:00
|
|
|
```
|
2019-03-12 10:09:46 +01:00
|
|
|
>`py print('hello world')`
|
2019-05-15 03:05:12 +02:00
|
|
|
```
|
2019-03-12 10:09:46 +01:00
|
|
|
|
2019-05-15 03:05:12 +02:00
|
|
|
```
|
2019-03-13 06:54:36 +01:00
|
|
|
>e`hs (+) <$> Just 1 <*> Just 2`
|
2019-05-15 03:05:12 +02:00
|
|
|
```
|
2019-03-13 06:54:36 +01:00
|
|
|
|
2019-03-15 02:58:43 +01:00
|
|
|
## Supported Languages and Options
|
2019-03-12 10:09:46 +01:00
|
|
|
|
2019-03-15 02:58:43 +01:00
|
|
|
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`.
|
2019-03-12 10:09:46 +01:00
|
|
|
|
2019-05-15 02:53:42 +02:00
|
|
|
- `bash` Bash
|
|
|
|
- `c` C (GCC)
|
|
|
|
- `clj` Clojure
|
|
|
|
- `cpp` C++ (G++)
|
|
|
|
- `cs` C# (Mono)
|
2019-03-15 02:58:43 +01:00
|
|
|
- `e` evaluates a single expression instead of a module
|
2019-05-15 02:53:42 +02:00
|
|
|
- `elixir` Elixir
|
2019-05-15 03:05:12 +02:00
|
|
|
- `fs` F# (Mono)
|
2019-05-15 02:53:42 +02:00
|
|
|
- `go` Go
|
|
|
|
- `hs` Haskell (GHC)
|
2019-03-15 02:58:43 +01:00
|
|
|
- `e` evaluates a single expression instead of a module
|
2019-05-15 02:53:42 +02:00
|
|
|
- `java` Java (OpenJDK)
|
|
|
|
- `js` JavaScript (Node)
|
2019-03-15 02:58:43 +01:00
|
|
|
- `harmony` enables harmony features (`--harmony` on node)
|
2019-05-15 02:53:42 +02:00
|
|
|
- `julia` Julia
|
2019-03-16 01:24:49 +01:00
|
|
|
- `e` prints the result of evaluating the code
|
2019-05-15 02:53:42 +02:00
|
|
|
- `lisp` Racket
|
|
|
|
- `lua` Lua
|
|
|
|
- `ocaml` OCaml
|
|
|
|
- `pas` Pascal (FPC)
|
|
|
|
- `php` PHP
|
|
|
|
- `pl` Perl5
|
|
|
|
- `prolog` Prolog (SWI-Prolog)
|
|
|
|
- `py` Python (CPython)
|
2019-03-15 02:58:43 +01:00
|
|
|
- `2` runs Python 2 instead of Python 3
|
2019-05-15 02:53:42 +02:00
|
|
|
- `rb` Ruby
|
|
|
|
- `rs` Rust
|
2019-05-15 02:24:16 +02:00
|
|
|
|
|
|
|
## 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
|
|
|
|
|
2019-05-15 02:50:07 +02:00
|
|
|
0. Install Docker 18+
|
|
|
|
0. Install Node 10+
|
2019-05-15 02:24:16 +02:00
|
|
|
0. Run `npm i`
|
2019-05-21 02:26:28 +02:00
|
|
|
0. Fill out `config.json` as described in the configuration section below
|
2019-05-15 02:24:16 +02:00
|
|
|
0. Run `node .`
|
2019-05-21 02:26:28 +02:00
|
|
|
|
|
|
|
## 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.
|
2019-05-21 18:03:38 +02:00
|
|
|
- `retries` Maximum number of retries for an evaluation.
|
|
|
|
Evaluations are retried when all concurrent evaluations fail because one failed.
|