127 lines
4.5 KiB
Markdown
127 lines
4.5 KiB
Markdown
# Botodon
|
|
|
|
A pretty simple random message bot using [Mastodon](https://joinmastodon.org) statuses as source of truth.
|
|
|
|
- **no database:** store volatile data in statuses
|
|
- **easy edit:** allows easy edit from web ui or apps.
|
|
- **community:** allows public submit with strict or community driven moderation
|
|
|
|
## Install
|
|
### Mastodon
|
|
|
|
- Create an account for this bot. Please mark it as bot in configuration page.
|
|
- In settings page, create a new application with `read write` permission and copy the private key.
|
|
- Or `read:accounts read:statuses write:statuses write:media`
|
|
- Could use `npm run token-add` *(requires `DOMAIN` in `.env`)*
|
|
- Create a status to store actions (could be private) containing `#botodon` and copy its id. *Called `root status` after*
|
|
- Create a status to store content (could be private) and copy its id. *Called `data status` after*
|
|
- Reply to this status to add content. (Removing @acct, to limit self spam)
|
|
- Reply to `root status` with options tags *(See `action status`)* like `#botodon #global #data_from_{DATA_STATUS_ID}`
|
|
|
|
### Botodon
|
|
|
|
Download folder from [releases](https://git.wadza.fr/me/botodon/releases).
|
|
|
|
In `.env` set
|
|
- `DOMAIN={INSTANCE_DOMAIN}`
|
|
- `TOKEN={PRIVATE_KEY}`
|
|
- `ROOT_STATUS={ROOT_STATUS_ID}`
|
|
|
|
Run `node index.js` with cron.
|
|
|
|
Enjoy
|
|
|
|
## Main ideas
|
|
|
|
It uses statuses tags as configuration like `#xxx_yyy`. So content doesn't really matter except obviously for `content statuses`
|
|
|
|
There is 3 *types* of statuses:
|
|
|
|
- *The* `root status` contains global options. See [Root status](#root-status)
|
|
- `action status` contains action to run and is descendant of `root status`. See [Action status](#action-status)
|
|
- `data status` is a data source like a folder containing `content statuses`
|
|
- `content status` is a *normal* status its content *(including medias)* will send
|
|
|
|
### Root status
|
|
|
|
Its a folder containing `action statuses` and global options as tags.
|
|
|
|
tag | description
|
|
--- | ---
|
|
botodon | **Required** Enable tags processing
|
|
async | Enable actions parallel processing
|
|
deep | Use replies to actions as actions
|
|
shared | **Unsafe** Include other users actions
|
|
file | Also load actions from `actions.json`
|
|
|
|
### Action status
|
|
|
|
It describe an action to run
|
|
|
|
#### Sample
|
|
|
|
```
|
|
#botodon #global #data_from_xxxxxxxxxxxx
|
|
```
|
|
|
|
Send standard status with random content from `xxxxxxxxxxxx` status
|
|
|
|
#### Options
|
|
|
|
tag | default | description
|
|
--- | --- | ---
|
|
botodon | false | **Required** Enable tags processing
|
|
**Data source** | | content send
|
|
data_file | empty | Use `database.json` as source *(See database.sample.json)*
|
|
data_from_**ID** | empty | Add a source of content: `data status` id
|
|
data_deep | false | Use replies to content as content
|
|
data_shared | false | **Warning** Include other users content
|
|
data_tagged_**TAG** | empty | Require content to have this tag *(Tags are lowercase on backend)*
|
|
data_favourited | false | Require content to be fav by bot account
|
|
data_favourites_**N** | false | Require at least N favourites
|
|
data_last_**N** | disabled | Only include N last statuses
|
|
data_weighted | false | Use `favourites_count` as promotional random weight
|
|
data_same | false | Send same content for all targets
|
|
**Targets** | | target accounts
|
|
global | false | Send without target
|
|
followers | false | Send to each followers
|
|
followers_of_**ID** | empty | Send to each followers of given account id **Don't be evil**
|
|
replies_to_**ID** | empty | Send to each repliers of given status id
|
|
replies_deep | false | Include replies to replies
|
|
replies_visibility | false | Use reply visibility
|
|
favourites_**ID** | empty | Send to each use who fav given status id
|
|
visibility | unlisted | Visibility to use. One of `public`, `unlisted`, `private`, `direct`
|
|
|
|
|
|
## Multiple bots
|
|
|
|
Add `.env.XXX` files and run `BOT_NAME=XXX node index.js`
|
|
|
|
## Limits
|
|
|
|
Mastodon context API use an arbitrary limit of `4096` since [#7564](https://github.com/tootsuite/mastodon/pull/7564), it's so the limit were new replies are excluded.
|
|
|
|
Mastodon api limit to 300 requests within 5 minutes. Using a rate limiter at 150 requests for 5 minutes.
|
|
|
|
Followers soft limit of `999` *(must include pagination)* and hard limit of `7500`.
|
|
|
|
### Pleroma
|
|
|
|
It supports Mastodon API but uses case-sensitive ids which can't be stored as tag.
|
|
|
|
You have to use actions and database json files as fallback.
|
|
|
|
## Tools
|
|
|
|
`tools` folder contains some useful script which could be as helpful as dangerous.
|
|
|
|
## TODO
|
|
|
|
- Add abstract and inherit on deep actions
|
|
- Add actions time validators
|
|
- Use followers pagination
|
|
- Add options on `data status`
|
|
- Add move pick options
|
|
- Handle errors
|
|
- Move to Go ?
|