# Kaede

A light-weighted LINE bot platform :maple_leaf:

## Requirements

Node.js 8 or higher

## Install

Via npm:

``` shell
npm i -g kaede
```

## How to use

*Kaede is under heavy development and the hehaviour can be changed at any time.*

```
$ kaede [args] <script>
```

``` shell
kaede bot.js

# with custom config path (kaede.config.json by default)
kaede --config custom.config.json bot.js

# show help
kaede --help
```

The bot script should default-export an async generator yielding message
objects.

``` js
export default async function* (event) {
  yield { type: 'text', text: 'hello' };
  yield { type: 'text', text: 'world' };
}
```

You can also refer to the bot context as the 2nd argument.

``` js
export default async function* (event, ctx) {
  const profile = await ctx.client.getProfile(event.source.userId);
  yield { type: 'text', text: `hello, ${profile.displayName}!` };
}
```

The context object has a type like below.

``` typescript
{
  client: Client, // Messaging API Client
  baseUrl: string, // base URL of webhook server
  staticRoot: string, // absolute path to static root directory
}
```

About the interface of `Client`, please refer to the documentation of
[line-bot-sdk-nodejs](https://line.github.io/line-bot-sdk-nodejs/).

The `kaede` command with a bot script path will automatically set up a webhook
server and a [ngrok](https://ngrok.com/) tunnel. Please set the generated URL as
a webhook URL in [LINE Developers Console](https://developers.line.me/console/).
The URL will already have been copied to the system clipboard.

```
$ kaede bot.js
Listening at 91178db2.ngrok.io
91178db2.ngrok.io is copied to the clipboard

Press Enter/Return to reload the bot script
Press Ctrl+C/D to quit
```

For detailed usages, please refer to the [examples](examples).

## Static file serving

Kaede serves static files in `static/` by default. You can also set this with
`--static` in CLI. Please refer to the context for webhook base URL and static
root.

``` js
`${ctx.baseUrl}/images/some_image.jpg`
// => will serve a file at `${ctx.staticRoot}/images/some_image.jpg`
```

## Features

- [x] Basic webhook functionality
- [x] [ngrok](https://ngrok.com/) integration
- [x] Hot reload for bot script
- [ ] [Connect](https://github.com/senchalabs/connect) adaptor for production usage

## License

[Apache License Version 2.0](LICENSE)
