diff --git a/static/images/integrations/baremetrics/list-commands.png b/static/images/integrations/baremetrics/list-commands.png new file mode 100644 index 0000000000..15d27e6092 Binary files /dev/null and b/static/images/integrations/baremetrics/list-commands.png differ diff --git a/static/images/integrations/logos/baremetrics.png b/static/images/integrations/logos/baremetrics.png new file mode 100644 index 0000000000..b14a1a9468 Binary files /dev/null and b/static/images/integrations/logos/baremetrics.png differ diff --git a/tools/setup/static/generated/bots/baremetrics/doc.md b/tools/setup/static/generated/bots/baremetrics/doc.md new file mode 100644 index 0000000000..720ca3bc26 --- /dev/null +++ b/tools/setup/static/generated/bots/baremetrics/doc.md @@ -0,0 +1,41 @@ +# Baremetrics bot + +The Baremetrics bot is a Zulip bot that gives updates about customer behavior, financial performance, and +analytics for an organization using the [Baremetrics](https://baremetrics.com/) API. + +To use the Baremetrics bot, you can simply call it with `@` followed +by a command, like so: + +``` +@Baremetrics help +``` + +## Setup + +Before usage, you will need to configure the bot by putting the value of the `` in the config file. +To do this, follow the given steps: + +1. Login at [Baremetrics Console](https://app.baremetrics.com/settings/api). +2. Note the `Live API Key`. +3. Open up `zulip_bots/bots/baremetrics/baremetrics.conf` in an editor and + change the value of the `` attribute to the noted `Live API Key`. + +## Developer Notes + +Be sure to add the command and its description to their respective lists (named `commands` and `descriptions`) +so that it can be displayed with the other available commands using `@ list-commands`. Also modify +the `test_list_commands_command` in `test_baremetrics.py`. + +## Links + + - [Baremetrics](https://baremetrics.com/) + - [Baremetrics Developer API](https://developers.baremetrics.com/reference) + - [Baremetrics Dashboard](https://app.baremetrics.com/setup) + +## Usage + +`@Baremetrics list-commands` - This command gives a list of all available commands along with short +short descriptions. + +Example: +![](assets/list-commands.png) diff --git a/tools/setup/static/generated/bots/beeminder/doc.md b/tools/setup/static/generated/bots/beeminder/doc.md new file mode 100644 index 0000000000..2888cd2c55 --- /dev/null +++ b/tools/setup/static/generated/bots/beeminder/doc.md @@ -0,0 +1,63 @@ +# Beeminder bot + +The Beeminder bot can help you adding datapoints towards +your Beeminder goal from Zulip. + +To use the Beeminder bot, you can simply call it with `@beeminder` +followed by a daystamp, value and an optional comment. + +Syntax is like: +``` +@beeminder daystamp, value, comment +``` + +**NOTE** : **Commas** between inputs are a must, otherwise, +you'll get an error. + +## Setup and Configuration + +Before running Beeminder bot you will need three things as follows : + +1. **auth_token** + - Go to your [Beeminder](https://www.beeminder.com/) **account settings**. +Under **APPS & API** section you will find your **auth token**. + +2. **username** + - Your Beeminder username. + +3. **Goalname** + - The name of your Beeminder goal for which you want to +add datapoints from [Zulip](https://zulipchat.com/) + +Once you have above information, you should supply +them in `beeminder.conf` file. + +Run this bot as described in +[here](https://zulipchat.com/api/running-bots#running-a-bot). + +## Usage + +You can give command to add datapoint in 4 ways: + +1. `@beeminder daystamp, value, comment` + - Example usage: `@beeminder 20180125, 15, Adding datapoint`. + - This will add a datapoint to your Beeminder goal having +**daystamp**: `20180125`, **value**: `15` with +**comment**: `Adding datapoint`. + +2. `@beeminder daystamp, value` + - Example usage: `@beeminder 20180125, 15`. + - This will add a datapoint in your Beeminder goal having +**daystamp**: `20180125`, **value**: `15` and **comment**: `None`. + +3. `@beeminder value, comment` + - Example usage: `@beeminder 15, Adding datapoint`. + - This will add a datapoint in your Beeminder goal having +**daystamp**: `current daystamp`, **value**: `15` and **comment**: `Adding datapoint`. + +4. `@beeminder value` + - Example usage: `@beeminder 15`. + - This will add a datapoint in your Beeminder goal having +**daystamp**: `current daystamp`, **value**: `15` and **comment**: `None`. + +5. `@beeminder ` or `@beeminder help` will fetch you the `help message`. diff --git a/tools/setup/static/generated/bots/chessbot/doc.md b/tools/setup/static/generated/bots/chessbot/doc.md new file mode 100644 index 0000000000..6d73cb2eb8 --- /dev/null +++ b/tools/setup/static/generated/bots/chessbot/doc.md @@ -0,0 +1,39 @@ +## Starting a Game + +You can start a game with another user by typing + +``` +start with other user +``` + +or you can start a game with a computer with + +``` +start as with computer +``` + +## Playing + +After starting the game, you can make your move by typing + +``` +do +``` + +using [Standard Algebraic Chess Notation](https://goo.gl/rehi8n). For example, +`do e4` to move a pawn to *e4* or `do Nf3` to move a night to *f3* or `do O-O` +to castle. + + +## Ending the game + +The bot will detect if a game is over. You can end one early by resigning +with the + +``` +resign +``` + +command. + +(Or you could just stop responding.) diff --git a/tools/setup/static/generated/bots/connect_four/doc.md b/tools/setup/static/generated/bots/connect_four/doc.md new file mode 100644 index 0000000000..92e8a88ddf --- /dev/null +++ b/tools/setup/static/generated/bots/connect_four/doc.md @@ -0,0 +1,5 @@ +# Connect Four Bot + +The Connect Four bot is a Zulip bot that will allow users +to play a game of Connect Four against either another user, +or the computer. diff --git a/tools/setup/static/generated/bots/converter/doc.md b/tools/setup/static/generated/bots/converter/doc.md new file mode 100644 index 0000000000..fac90ccd7e --- /dev/null +++ b/tools/setup/static/generated/bots/converter/doc.md @@ -0,0 +1,70 @@ +# Converter bot + +This bot allows users to perform conversions for various measurement units. + +## Usage + +Run this bot as described in [here](https://zulipchat.com/api/running-bots#running-a-bot). + +Use this bot with the following command + +`@convert ` + +This will convert `number`, given in the unit `unit_from`, to the unit `unit_to` +and print the result. + +* `number` can be any floating-point number, e.g. 12, 13.05, 0.002. +* `unit_from` and `unit_to` are two units from [the following](#supported-units) table in the same category. +* `unit_from` and `unit_to` can be preceded by [these](#supported-prefixes) prefixes. + +### Supported units + +| Category | Units | +| ----------------- | ----- | +| Area | square-centimeter (cm^2, cm2), square-decimeter (dm^2, dm2), square-meter (m^2, m2), square-kilometer (km^2, km2), square-inch (in^2, in2), square-foot (ft^2, ft2), square-yard (y^2, y2), square-mile (mi^2, mi2), are (a), hectare (ha), acre (ac) | +| Information | bit, byte | +| Length | centimeter (cm), decimeter (dm), meter (m), kilometer (km), inch (in), foot (ft), yard (y), mile (mi), nautical-mile (nmi) | +| Temperature | Kelvin (K), Celsius (C), Fahrenheit (F) | +| Volume | cubic-centimeter (cm^3, cm3), cubic-decimeter (dm^3, dm3), liter (l), cubic-meter (m^3, m3), cubic-inch (in^3, in3), fluid-ounce (fl-oz), cubic-foot (ft^3, ft3), cubic-yard (y^3, y3) | +| Weight | gram (g), kilogram (kg), ton (t), ounce (oz), pound (lb) | +| Cooking (metric only, U.S. and imperial units differ slightly) | teaspoon (tsp), tablespoon (tbsp), cup | + +### Supported prefixes + +| Prefix | Power of 10 | +| ------ | ----------- | +| atto | 10-18 | +| pico | 10-15 | +| femto | 10-12 | +| nano | 10-9 | +| micro | 10-6 | +| milli | 10-3 | +| centi | 10-2 | +| deci | 10-1 | +| deca | 101 | +| hecto | 102 | +| kilo | 103 | +| mega | 106 | +| giga | 109 | +| tera | 1012 | +| peta | 1015 | +| exa | 1018 | + +### Usage examples + +| Message | Response | +| ------- | ------ | +| `@convert 12 celsius fahrenheit` | 12.0 celsius = 53.600054 fahrenheit | +| `@convert 0.002 kilomile millimeter` | 0.002 kilomile = 3218688.0 millimeter | +| `@convert 31.5 square-mile ha | 31.5 square-mile = 8158.4625 ha | +| `@convert 56 g lb` | 56.0 g = 0.12345887 lb | + +## Notes + +* You can use multiple `@convert` statements in a message, the response will look accordingly: +![multiple-converts](assets/multiple-converts.png) + +* Enter `@convert help` to display a quick overview of the converter's functionality. + +* For bits and bytes, the prefixes change the figure differently: 1 kilobyte is 1024 bytes, +1 megabyte is 1048576 bytes, etc. diff --git a/tools/setup/static/generated/bots/define/doc.md b/tools/setup/static/generated/bots/define/doc.md new file mode 100644 index 0000000000..cdafb30987 --- /dev/null +++ b/tools/setup/static/generated/bots/define/doc.md @@ -0,0 +1,21 @@ +# DefineBot + +* This is a bot that defines a word that the user inputs. Whenever the user +inputs a message starting with '@define', the bot defines the word +that follows. + +* The definitions are brought to the website using an API. The bot posts the +definition of the word to the stream from which the user inputs the message. +If the user inputs a word that does not exist or a word that is incorrect or +is not in the dictionary, the definition is not displayed. + +* For example, if the user says "@define crash", all the meanings of crash +appear, each in a separate line. + +![Correct Word](assets/correct_word.png) + +* If the user enters a wrong word, like "@define cresh" or "@define crish", +then an error message saying no definition is available is displayed. + +![Wrong Word](assets/wrong_word.png) + diff --git a/tools/setup/static/generated/bots/dialogflow/doc.md b/tools/setup/static/generated/bots/dialogflow/doc.md new file mode 100644 index 0000000000..d4a0c28f05 --- /dev/null +++ b/tools/setup/static/generated/bots/dialogflow/doc.md @@ -0,0 +1,24 @@ +# DialogFlow bot +This bot allows users to easily add their own DialogFlow bots to zulip. + +## Setup +To add your DialogFlow bot: +Add the V1 Client access token from your agent's settings in the DialogFlow console to +`dialogflow.conf`, and write a short sentence describing what your bot does in the same file +as `bot_info`. + +## Usage + +Run this bot as described +[here](https://zulipchat.com/api/running-bots#running-a-bot). + +Mention the bot in order to say things to it. + +For example: `@weather What is the weather today?` + + +## Limitations +When creating your DialogFlow bot, please consider these things: + +- Empty input will not be sent to the bot. +- Only text can be sent to, and recieved from the bot. diff --git a/tools/setup/static/generated/bots/dropbox_share/doc.md b/tools/setup/static/generated/bots/dropbox_share/doc.md new file mode 100644 index 0000000000..87edb6a9a7 --- /dev/null +++ b/tools/setup/static/generated/bots/dropbox_share/doc.md @@ -0,0 +1,41 @@ +# Dropbox Bot + +This bot links your [dropbox](https://www.dropbox.com) account to [zulip](https://chat.zulip.org). + +## Usage + + - Create a dropbox app from [here](https://www.dropbox.com/developers/apps). + - Click the `generate` button under the **Generate access token** section. + - Copy the Access Token and paste it in a file named `dropbox_share.conf` as shown: + ``` + [dropbox_share] + ACCESS_TOKEN= + ``` + - Follow the instructions as described in [here](https://zulipchat.com/api/running-bots#running-a-bot). + - Run the bot: `zulip-run-bot dropbox_share -b -c ` + +Use this bot with any of the following commands: + +- `@dropbox mkdir` : Create a folder +- `@dropbox ls` : List contents of a folder +- `@dropbox write` : Save text to a file +- `@dropbox rm` : Remove a file/folder +- `@dropbox help` : See help text +- `@dropbox read`: Read contents of a file +- `@dropbox share`: Get a shareable link for a file/folder +- `@dropbox search`: Search for matching file/folder names + +where `dropbox` may be the name of the bot you registered in the zulip system. + +### Usage examples + +- `dropbox ls -` Shows files/folders in the root folder. +- `dropbox mkdir foo` - Make folder named foo. +- `dropbox ls foo/boo` - Shows the files/folders in foo/boo folder. +- `dropbox write test hello world` - Write "hello world" to the file 'test'. +- `dropbox rm test` - Remove the file/folder test. +- `dropbox read foo` - Read the contents of file/folder foo. +- `dropbox share foo` - Get shareable link for the file/folder foo. +- `dropbox search boo` - Search for boo in root folder and get at max 20 results. +- `dropbox search boo --mr 10` - Search for boo and get at max 10 results. +- `dropbox search boo --fd foo` - Search for boo in folder foo. diff --git a/tools/setup/static/generated/bots/encrypt/doc.md b/tools/setup/static/generated/bots/encrypt/doc.md new file mode 100644 index 0000000000..1df555dfc5 --- /dev/null +++ b/tools/setup/static/generated/bots/encrypt/doc.md @@ -0,0 +1,16 @@ +About EncryptBot: +EncryptBot Allows for quick ROT13 encryption in the middle of a chat. + +What It Does: +The bot encrypts any message sent to it on any stream it is subscribed to with ROT13. + +How It Works: +The bot will Use ROT13(A -> N, B -> O... and vice-versa) in a python +implementation to provide quick and easy encryption. + +How to Use: + +-Send the message you want to encrypt, add @encrypt to the beginning. +-The Encrypted message will be sent back to the stream the original +message was posted in to the topic 's encrypted text. +-Messages can be decrypted by sending them to EncryptBot in the same way. diff --git a/tools/setup/static/generated/bots/file_uploader/doc.md b/tools/setup/static/generated/bots/file_uploader/doc.md new file mode 100644 index 0000000000..b5afefd055 --- /dev/null +++ b/tools/setup/static/generated/bots/file_uploader/doc.md @@ -0,0 +1,21 @@ +# File Uploader Bot + +This bot allows the user to upload a file with a given path to the Zulip server. + +## Usage + +Use this bot with any of the following commands: + +- `@uploader ` : Upload a file, where `` is the path to the file +- `@uploader help` : Display help message + +### Usage examples + +The following command will upload the file `/tmp/image.png` to the Zulip server: +``` +@**uploader** /tmp/image.png +``` + +Here's an example response: + +> [image.png](https://server.zulipchat.com/user_uploads/3787/RgoZReSsfMjlQSzvVxjIgAQy/image.png) diff --git a/tools/setup/static/generated/bots/flock/doc.md b/tools/setup/static/generated/bots/flock/doc.md new file mode 100644 index 0000000000..c46aeee3dd --- /dev/null +++ b/tools/setup/static/generated/bots/flock/doc.md @@ -0,0 +1,27 @@ +# Flock Bot + +With [Flock](https://flock.com/) bot, you can send messages to any of your + flock contact without having to leave Zulip. + +Sending messages to a user is quite easy, syntax is: +`@botname recipient_name: hello` +where `recipient_name` is name of recipient and `hello` is the sample message. + +## Configuration + +1. Before running Flock bot, you'll need a `token`. In order to get `token`, + Go to [Flock apps](https://dev.flock.com/apps) and create an app. + After successful installation, you'll get an `token` in response from servers. + +1. Once you have `token`, you should supply it in `flock.conf` file. + +## Usage + +Run this bot as described in + [here](https://zulipchat.com/api/running-bots#running-a-bot). + +You can use this bot in one easy step: + +`@botname recipient_firstName: message` + +For help, do `@botname help`. diff --git a/tools/setup/static/generated/bots/front/doc.md b/tools/setup/static/generated/bots/front/doc.md new file mode 100644 index 0000000000..d0c24439b1 --- /dev/null +++ b/tools/setup/static/generated/bots/front/doc.md @@ -0,0 +1,17 @@ +# Front Bot + +## Setup + +1. Go to the `Setting` of your Front app. +2. Copy the `JSON Web Token` from `Plugins & API` → `API`. +3. Replace `` in `zulip_bots/bots/front/front.conf` with `JSON +Web Token`. + +## Usage + +![](assets/usage.png) + +The name of the topic, from which you call the bot, must contain the ID of +the corresponding Front conversation. If you have received notifications +from this conversation using Front incoming webhook, you can use the topic +it has created. diff --git a/tools/setup/static/generated/bots/giphy/doc.md b/tools/setup/static/generated/bots/giphy/doc.md new file mode 100644 index 0000000000..37a89433c0 --- /dev/null +++ b/tools/setup/static/generated/bots/giphy/doc.md @@ -0,0 +1,42 @@ +# GIPHY bot + +The GIPHY bot is a Zulip bot that can fetch a GIF associated with +a given keyword from [GIPHY](https://giphy.com/). + +To use the GIPHY bot, you can simply call it with `@Giphy` followed +by a keyword, like so: + +``` +@Giphy hello +``` + +## Setup + +Before you can proceed further, you'll need to go to the +[GIPHY Developers](https://developers.giphy.com/), and get a +GIPHY API key. + +1. Click on the **Create an App** button on the top right corner. +2. Click on **Create an App** under the **Your Apps** section. +3. Enter a name and a description for your app and click on + **Create New App**. +4. And you're done! You should now have a GIPHY API key. +5. Open up `zulip_bots/bots/giphy/giphy.conf` in an editor and + and change the value of the `key` attribute to the API key + you generated above. + +Run this bot as described in [here](https://zulipchat.com/api/running-bots#running-a-bot). + +## Usage + +1. `@Giphy +repo = +``` diff --git a/tools/setup/static/generated/bots/github_detail/logo.svg b/tools/setup/static/generated/bots/github_detail/logo.svg new file mode 100644 index 0000000000..469a8e6a8b Binary files /dev/null and b/tools/setup/static/generated/bots/github_detail/logo.svg differ diff --git a/tools/setup/static/generated/bots/google_search/doc.md b/tools/setup/static/generated/bots/google_search/doc.md new file mode 100644 index 0000000000..152abc1867 --- /dev/null +++ b/tools/setup/static/generated/bots/google_search/doc.md @@ -0,0 +1,23 @@ +# Google Search bot + +This bot allows users to do Google search queries and have the bot +respond with the first search result. It is by default set to the +highest safe-search setting. + +## Usage + +Run this bot as described +[here](https://zulipchat.com/api/running-bots#running-a-bot). + +Use this bot with the following command + +`@mentioned-bot ` + +This will return the first link found by Google for `` +and print the resulting URL. + +If no `` are entered, a help message is printed instead. + +If there was an error in the process of running the search (socket +errors, Google search function failed, or general failures), an error +message is returned. diff --git a/tools/setup/static/generated/bots/google_search/logo.png b/tools/setup/static/generated/bots/google_search/logo.png new file mode 100644 index 0000000000..f39297ab31 Binary files /dev/null and b/tools/setup/static/generated/bots/google_search/logo.png differ diff --git a/tools/setup/static/generated/bots/google_translate/doc.md b/tools/setup/static/generated/bots/google_translate/doc.md new file mode 100644 index 0000000000..2fac545c34 --- /dev/null +++ b/tools/setup/static/generated/bots/google_translate/doc.md @@ -0,0 +1,26 @@ +# Google Translate bot + +The Google Translate bot uses Google Translate to translate +any text sent to it. + +## Setup + +This bot requires a google cloud API key. Create one +[here](https://support.google.com/cloud/answer/6158862?hl=en) + +You should add this key to `googletranslate.conf`. + +To run this bot, use: +`zulip-run-bots googletranslate -c +--bot-config-file ` + +## Usage + +To use this bot, @-mention it like this: + +`@-mention "" ` + +`text` must be in quotation marks, and `source language` +is optional. + +If `source language` is not given, it will automatically detect your language. diff --git a/tools/setup/static/generated/bots/helloworld/doc.md b/tools/setup/static/generated/bots/helloworld/doc.md new file mode 100644 index 0000000000..5b200b176a --- /dev/null +++ b/tools/setup/static/generated/bots/helloworld/doc.md @@ -0,0 +1,4 @@ +Simple Zulip bot that will respond to any query with a "beep boop". + +The helloworld bot is a boilerplate bot that can be used as a +template for more sophisticated/evolved Zulip bots. diff --git a/tools/setup/static/generated/bots/idonethis/doc.md b/tools/setup/static/generated/bots/idonethis/doc.md new file mode 100644 index 0000000000..d591b1d64f --- /dev/null +++ b/tools/setup/static/generated/bots/idonethis/doc.md @@ -0,0 +1,46 @@ +# idonethis bot + +The idonethis bot is a Zulip bot which allows interaction with [idonethis](https://idonethis.com/) +through Zulip. It can peform actions such as viewing teams, list entries and creating entries. + +To use the bot simply @-mention the bot followed by a specific command. See the usage section +below for a list of available commands. + +## Setup + +Before proceeding further, ensure you have an idonethis account. + + 1. Go to [your idonethis settings](https://beta.idonethis.com/u/settings), scroll down +and copy your API token. + 2. Open up `zulip_bots/bots/idonethis/idonethis.conf` in your favorite editor, and change +`api_key` to your API token. + 3. Optionally, change the `default_team` value to your default team for creating new messages. +If this is not specified, a team will be required to be manually specified every time an entry is created. + +Run this bot as described [here](https://zulipchat.com/api/running-bots#running-a-bot). + +## Usage + +`` can either be the name or ID of a team. + + * `@mention help` view this help message. + ![](/static/generated/bots/idonethis/assets/idonethis-help.png) + * `@mention teams list` or `@mention list teams` + List all the teams. + ![](/static/generated/bots/idonethis/assets/idonethis-list-teams.png) + * `@mention team info `. + Show information about one ``. + ![](/static/generated/bots/idonethis/assets/idonethis-team-info.png) + * `@mention entries list` or `@mention list entries`. + List entries from any team + ![](/static/generated/bots/idonethis/assets/idonethis-entries-all-teams.png) + * `@mention entries list ` or `@mention list entries ` + List all entries from ``. + ![](/static/generated/bots/idonethis/assets/idonethis-list-entries-specific-team.png) + * `@mention entries create` or `@mention new entry` or `@mention create entry` + or `@mention new entry` or `@mention i did` + Create a new entry. Optionally supply `--team=` for teams with no spaces or `"--team="` + for teams with spaces. For example `@mention i did "--team=product team" something` will create a + new entry `something` for the product team. + ![](/static/generated/bots/idonethis/assets/idonethis-new-entry.png) + ![](/static/generated/bots/idonethis/assets/idonethis-new-entry-specific-team.png) diff --git a/tools/setup/static/generated/bots/incrementor/doc.md b/tools/setup/static/generated/bots/incrementor/doc.md new file mode 100644 index 0000000000..464b32ae88 --- /dev/null +++ b/tools/setup/static/generated/bots/incrementor/doc.md @@ -0,0 +1,6 @@ +# Incrementor bot + +This is a boilerplate bot that makes use of the +update_message function. For the first @-mention, it initially +replies with one message containing a `1`. Every time the bot +is @-mentioned, this number will be incremented in the same message. diff --git a/tools/setup/static/generated/bots/jira/doc.md b/tools/setup/static/generated/bots/jira/doc.md new file mode 100644 index 0000000000..9916a271f5 --- /dev/null +++ b/tools/setup/static/generated/bots/jira/doc.md @@ -0,0 +1,81 @@ +# Jira Bot + +## Setup + +To use Jira Bot, first set up `jira.conf`. `jira.conf` takes 3 options: + + - username (an email or username that can access your Jira), + - password (the password for that username), and + - domain (a domain like `example.atlassian.net`) + +## Usage + +### get + +`get` takes in an issue key and sends back information about that issue. For example, + +you: + + > @**Jira Bot** get "BOTS-13" + +Jira Bot: + + > **Issue *BOTS-13*: Create Jira Bot** + > + > - Type: *Task* + > - Description: + > > Jira Bot would connect to Jira. + > - Creator: *admin* + > - Project: *Bots* + > - Priority: *Medium* + > - Status: *To Do* + +### create + +`create` creates an issue using its + + - summary, + - project, + - type, + - description *(optional)*, + - assignee *(optional)*, + - priority *(optional)*, + - labels *(optional)*, and + - due date *(optional)* + +For example, to create an issue with every option, + +you: + + > @**Jira Bot** create issue "Make an issue" in project "BOTS"' with type "Task" with description + > "This is a description" assigned to "skunkmb" with priority "Medium" labeled "issues, testing" + > due "2017-01-23" + +Jira Bot: + + > Issue *BOTS-16* is up! https://example.atlassian.net/browse/BOTS-16 + +### edit + +`edit` is like create, but changes an existing issue using its + + - summary, + - project *(optional)*, + - type *(optional)*, + - description *(optional)*, + - assignee *(optional)*, + - priority *(optional)*, + - labels *(optional)*, and + - due date *(optional)*. + +For example, to change every part of an issue, + +you: + + > @**Jira Bot** edit issue "BOTS-16" to use summary "Change the summary" to use project + > "NEWBOTS" to use type "Bug" to use description "This is a new description" by assigning + > to "admin" to use priority "Low" by labeling "new, labels" by making due "2018-12-5" + +Jira Bot: + + > Issue *BOTS-16* was edited! https://example.atlassian.net/browse/BOTS-16 diff --git a/tools/setup/static/generated/bots/link_shortener/doc.md b/tools/setup/static/generated/bots/link_shortener/doc.md new file mode 100644 index 0000000000..241e8f6529 --- /dev/null +++ b/tools/setup/static/generated/bots/link_shortener/doc.md @@ -0,0 +1,19 @@ +# Link Shortener Bot + +Link Shortener Bot is a Zulip bot that will shorten URLs ("links") in a +conversation. It uses the [bitly URL shortener API] to shorten its links. + +Use [this](https://dev.bitly.com/get_started.html) to get your API Key. + +Links can be anywhere in the message, for example, + + > @**Link Shortener Bot** @**Joe Smith** See + > https://github.com/zulip/python-zulip-api/tree/master/zulip_bots/zulip_bots/bots + > for a list of all Zulip bots. + +and LS Bot would respond + + > https://github.com/zulip/python-zulip-api/tree/master/zulip_bots/zulip_bots/bots: + > **https://bit.ly/2FF3QHu** + +[bitly URL shortener API]: https://bitly.com/ diff --git a/tools/setup/static/generated/bots/mention/doc.md b/tools/setup/static/generated/bots/mention/doc.md new file mode 100644 index 0000000000..599e507e20 --- /dev/null +++ b/tools/setup/static/generated/bots/mention/doc.md @@ -0,0 +1,32 @@ +# Mention bot + +The Mention bot is a Zulip bot that can fetch Mentions associated with +a given keyword from the web using [Mention](https://mention.com/en/). + +To use the Mention bot, you can simply call it with `@` followed +by a keyword, like so: + +``` +@Mention Apple +``` + +## Setup + +Before you can proceed further, you'll need to go to the +[Mention Dev](https://dev.mention.com/login), and get a +Mention API Access Token. + +1. Login. +2. Enter the **App Name**, **Description**, **Website**, and **Redirect uris**. In this version, there +is no actual use of the Redirect Uri and Website. +3. After accepting the agreement, click on **Create New App**. +4. And you're done! You should now have an Access Token. +5. Open up `zulip_bots/bots/mention/mention.conf` in an editor and + change the value of the `` attribute to the Access Token + you generated above. + +## Usage +`@Mention ` - This command will fetch the most recent 20 +mentions of the keyword on the web (Limitations of a free account). +Example: +![](assets/mentions_demo.png) diff --git a/tools/setup/static/generated/bots/monkeytestit/doc.md b/tools/setup/static/generated/bots/monkeytestit/doc.md new file mode 100644 index 0000000000..3298978b44 --- /dev/null +++ b/tools/setup/static/generated/bots/monkeytestit/doc.md @@ -0,0 +1,65 @@ +# monkeytest.it bot + +## Overview + +This bot provides a quick way to check a site from a chat. +Using their monkeytestit's API key, the user can check a website +for certain failures that user wants to see. + +## Setting up API key + +1. Get your monkeytest.it API key, located in your + [dashboard](https://monkeytest.it/dashboard). + +2. Create your own `monkeytestit.conf` file by copying the existing one in + `bots/monkeytest/monkeytestit.conf`. + +3. Inside the config file, you will see this: + ``` + [monkeytestit] + api_key = + ``` + +4. Replace `` with your API key + +5. Save the configuration file. + +## Running the bot + +Let `` be the path to the config file, and let +`` be the path to the zuliprc file. + +You can run the bot by running: + +`zulip-run-bot -b monkeytestit --config-file +` + +## Usage + +**Note**: You **must** not forget to put `http://` or `https://` +before a website. Otherwise, the check will fail. + +### Simple check with default settings + +To check a website with all enabled checkers, run: +`check https://website` + +### Check with options + +To check a website with certain enabled checkers, run: +`check https://website ` + +The checker options are supplied to: `on_load`, `on_click`, `page_weight`, +`seo`, `broken_links`, `asset_count` **in order**. + +Example 1: Disable `on_load`, enable the rest +command: `check https://website 0` + +Example 2: Disable `asset_count`, enable the rest +command: `check https//website 1 1 1 1 1 0` + +Example 3: Disable `on_load` and `page_weight`, enable the rest +command: `check https://website 0 1 0` + +So for instance, if you wanted to disable `asset_count`, you have +to supply every params before it. diff --git a/tools/setup/static/generated/bots/salesforce/doc.md b/tools/setup/static/generated/bots/salesforce/doc.md new file mode 100644 index 0000000000..a71d7c3ec7 --- /dev/null +++ b/tools/setup/static/generated/bots/salesforce/doc.md @@ -0,0 +1,80 @@ +# Salesforce bot + +The Salesforce bot can get records from your Salesforce database. +It can also show details about any Salesforce links that you post. + +## Setup + +1. Create a user in Salesforce that the bot can use to access Salesforce. +Make sure it has the appropriate permissions to access records. +2. In `salesforce.conf` paste the Salesforce `username`, `password` and +`security_token`. +3. Run the bot as explained [here](https://zulipchat.com/api/running-bots#running-a-bot) + +## Examples + +### Standard query +![Standard query](assets/query_example.png) + +### Custom query +![Custom query](assets/top_opportunities_example.png) + +### Link details +![Link details](assets/link_details_example.png) + +## Optional Configuration (Advanced) + +The bot has been designed to be able to configure custom commands and objects. + +If you wanted to find a custom object type, or an object type not included with the bot, +like `Event`, you can add these by adding to the Commands and Object Types in `utils.py`. + +A Command is a phrase that the User asks the bot. For example `find contact bob`. To make a Command, +the corresponding object type must be made. + +Object types are Salesforce objects, like `Event`, and are used to tell the bot which fields of the object the bot +should ask for and display. + +To show details about a link posted, only the Object Type for the object needs to be present. + +Please read the +[SOQL reference](https://goo.gl/6VwBV3) +to make custom queries, and the [simple_salesforce documentation](https://pypi.python.org/pypi/simple-salesforce) +to make custom callbacks. + +### Commands + +For example: "find contact tim" + +In `utils.py`, the commands are stored in the list `commands`. + +Parameter | Required? | Type | Description | Default +--------- | --------- | ---- | ----------- | ------- +commands | [x] | list[str] | What the user should start their command with | `None` +object | [x] | str | The Salesforce object type in `object_types` | `None` +query | [ ] | str | The SOQL query to access this object* | `'SELECT {} FROM {} WHERE Name LIKE %\'{}\'% LIMIT {}'` +description | [x] | str | What does the command do? | `None` +template | [x] | str | Example of the command | `None` +rank_output | [ ] | boolean | Should the output be ranked? (1., 2., 3. etc.) | `False` +force_keys | [ ] | list[str] | Values which should always be shown in the output | `[]` +callback | [ ] | callable** | Custom handling behaviour | `None` + +**Note**: *`query` must have `LIMIT {}` at the end, and the 4 parameters are `fields`, `table` (from `object_types`), +`args` (the search term), `limit` (the maximum number of terms) + +**`callback` must be a function which accepts `args: str`(arguments passed in by the user, including search term), +`sf: simple_salesforce.api.Salesforce` (the Salesforce handler object, `self.sf`), `command: Dict[str, Any]` +(the command used from `commands`) + +### Object Types +In `utils.py` the object types are stored in the dictionary `object_types`. + +The name of each object type corresponds to the `object` referenced in `commands`. + +Parameter | Required? | Type | Description +--------- | --------- | ---- | ----------- +fields* | [x] | str | The Salesforce fields to fetch from the database. +name | [x] | str | The API name of the object**. + +**Note**: * This must contain Name and Id, however Id is not displayed. +** Found in the salesforce object manager. diff --git a/tools/setup/static/generated/bots/stack_overflow/doc.md b/tools/setup/static/generated/bots/stack_overflow/doc.md new file mode 100644 index 0000000000..461675370f --- /dev/null +++ b/tools/setup/static/generated/bots/stack_overflow/doc.md @@ -0,0 +1,41 @@ +# StackOverflow Bot + +The StackOverflow bot is a Zulip bot that will search Stackoverflow +for a provided set of keywords or a question, and fetch a link to the associated +query. The link is returned to the same stream +it was @mentioned in + +The Stackoverflow bot uses the +[StackExchange API](http://api.stackexchange.com/docs) +to obtain the search results it returns + +Using the StackOverflow bot is as simple as mentioning @\, +followed by the query: + +``` +@ +``` + +## Setup + +Beyond the typical obtaining of the zuliprc file, no extra setup is required to use the StackOverflow Bot + +## Usage + +1. ```@ ``` - +fetches the link to the appropriate StackOverflow questions. + + * For example, `@ rest api` +will return the links having questions related to rest api. +
+ +2. If there are no questions related to the query, +the bot will respond with an error message: + + `I am sorry. The search query you provided is does not have any related results.` + +
+ +3. If no query is provided, the bot will return the help text: + + ```Please enter your message after @mention-bot``` diff --git a/tools/setup/static/generated/bots/tictactoe/doc.md b/tools/setup/static/generated/bots/tictactoe/doc.md new file mode 100644 index 0000000000..7ff617e1e3 --- /dev/null +++ b/tools/setup/static/generated/bots/tictactoe/doc.md @@ -0,0 +1,37 @@ +# Tic-Tac-Toe Bot + +This bot allows you to play tic-tac-toe in a private message with the bot. +Multiple games can simultaneously be played by different users, each playing +against the computer. + +The bot only responds to messages starting with @mention of the bot(botname). + +## Setup +This bot does not require any special setup. Just run it according to the +instructions in [this guide](https://zulipchat.com/api/running-bots#running-a-bot). + +## Commands +* `@mention-botname new` - start a new game (but not if you are already +playing a game.) You must type this first to start playing! + +* `@mention-botname help` - return a help message. + +* `@mention-botname quit` - quit the current game. + +* `@mention-botname ` - make a move at the entered coordinate. +For example, `@mention-botname 1,1` . After this, the bot will make its +move, or declare the game over if the user or bot has won. + +Coordinates are entered in a (row, column) format. Numbering is from top to +bottom and left to right. +Here are the coordinates of each position. When entering coordinates, parentheses +and spaces are optional. + +(1, 1) | (1, 2) | (1, 3) + +(2, 1) | (2, 2) | (2, 3) + +(3, 1) | (3, 2) | (3, 3) + +Invalid commands will result in an "I don't understand" response from the bot, +with a suggestion to type `@mention-botname help`. diff --git a/tools/setup/static/generated/bots/trello/doc.md b/tools/setup/static/generated/bots/trello/doc.md new file mode 100644 index 0000000000..1a9d3014f3 --- /dev/null +++ b/tools/setup/static/generated/bots/trello/doc.md @@ -0,0 +1,41 @@ +# Trello bot + +The Trello bot is a Zulip bot that enables interaction with Trello using the +[Trello API](https://developers.trello.com). + +To use the Trello bot, you can simply call it with `@` followed +by a command, like so: + +``` +@Trello help +``` + +## Setup + +Before usage, you will need to configure the bot by putting the value of the ``, +``, and `` in the config file. +To do this, follow the given steps: + +1. Go to [this]( https://trello.com/app-key) link after logging in at +[Trello]( https://trello.com/). +2. Generate an `access_token` and note it down. Continue to get your +`api_key`. +3. Go to your profile page in Trello and note down your `username`. +4. Open up `zulip_bots/bots/trello/trello.conf` in an editor and +change the values of the ``, ``, and `` +attributes to the corresponding noted values. + +## Developer Notes + +Be sure to add the additional commands and their descriptions to the `supported_commands` +list in `trello.py` so that they can be displayed with the other available commands using +`@ list-commands`. Also modify the `test_list_commands_command` in +`test_trello.py`. + +## Usage + +`@Trello list-commands` - This command gives a list of all available commands along with +short descriptions. + +Example: +![](assets/list_commands.png) diff --git a/tools/setup/static/generated/bots/virtual_fs/doc.md b/tools/setup/static/generated/bots/virtual_fs/doc.md new file mode 100644 index 0000000000..c8fa004131 --- /dev/null +++ b/tools/setup/static/generated/bots/virtual_fs/doc.md @@ -0,0 +1,44 @@ +# Virtual fs bot + +This bot allows users to store information in a virtual file system, +for a given stream or private chat. + +## Usage + +Run this bot as described in +[here](https://zulipchat.com/api/running-bots#running-a-bot). + +Use this bot with any of the following commands: + +`@fs mkdir` : create a directory +`@fs ls` : list a directory +`@fs cd` : change directory +`@fs pwd` : show current path +`@fs write` : write text +`@fs read` : read text +`@fs rm` : remove a file +`@fs rmdir` : remove a directory + +where `fs` may be the name of the bot you registered in the zulip system. + +### Usage examples + +`@fs ls` - Initially shows nothing (with a warning) +`@fs pwd` - Show which directory we are in: we start in / +`@fs mkdir foo` - Make directory foo +`@fs ls` - Show that foo is now created +`@fs cd foo` - Change into foo (and do a pwd, automatically) +`@fs write test hello world` - Write "hello world" to the file 'test' +`@fs read test` - Check the text was written +`@fs ls` - Show that the new file exists +`@fs rm test` - Remove that file +`@fs cd /` - Change back to root directory +`@fs rmdir foo` - Remove foo + +## Notes + +* In a stream, the bot must be mentioned; in a private chat, the bot + will assume every message is a command and so does not require this, + though doing so will still work. + +* Use commands like `@fs help write` for more details on a command. diff --git a/tools/setup/static/generated/bots/weather/doc.md b/tools/setup/static/generated/bots/weather/doc.md new file mode 100644 index 0000000000..68f84a9261 --- /dev/null +++ b/tools/setup/static/generated/bots/weather/doc.md @@ -0,0 +1,16 @@ +# WeatherBot + +* This is a bot that sends weather information to a selected stream on + request. + +* Weather information is brought to the website using an +OpenWeatherMap API. The bot posts the weather information to the +stream from which the user inputs the message. If the user inputs a +city that does not exist, the bot displays a "Sorry, city not found" +message. + +* Before using this bot, you have to generate an OpenWeatherMap API + key and replace the dummy value in weather.conf. + +![Example Usage](assets/screen1.png) +![Wrong City](assets/screen2.png) diff --git a/tools/setup/static/generated/bots/wikipedia/doc.md b/tools/setup/static/generated/bots/wikipedia/doc.md new file mode 100644 index 0000000000..0df2bc2a08 --- /dev/null +++ b/tools/setup/static/generated/bots/wikipedia/doc.md @@ -0,0 +1,41 @@ +# Wikipedia Bot + +The Wikipedia bot is a Zulip bot that will search Wikipedia +for a provided keyword, and fetch a link to the associated +Wikipedia article. The link is returned to the same stream +it was @mentioned in + +The Wikipedia bot uses the +[MediaWiki API](https://www.mediawiki.org/wiki/API:Main_page) +to obtain the search results it returns + +Using the Wikipedia bot is as simple as mentioning @\, +followed by the keyword: + +``` +@ +``` + +## Setup + +Beyond the typical obtaining of the zuliprc file, no extra setup is required to use the Wikipedia Bot + +## Usage + +1. ```@ ``` - +fetches the link to the appropriate Wikipedia article. + + * For example, `@ Zulip` +will return the link `https://en.wikipedia.org/wiki/Zulip` +
+ +2. If the keyword does not return an article link, +the bot will respond with an error message: + + `I am sorry. The search term you provided is not found` + +
+ +3. If no keyword is provided, the bot will return the help text: + + ```Please enter your message after @mention-bot``` diff --git a/tools/setup/static/generated/bots/witai/doc.md b/tools/setup/static/generated/bots/witai/doc.md new file mode 100644 index 0000000000..97a9141cf9 --- /dev/null +++ b/tools/setup/static/generated/bots/witai/doc.md @@ -0,0 +1,52 @@ +# Wit.ai Bot + +Wit.ai Bot uses [wit.ai](https://wit.ai/) to parse natural language. + +## Usage + + 1. Go to https://wit.ai/ and sign up. + + 2. Create your Wit.ai app, or follow + [this quickstart guide](https://wit.ai/docs/quickstart). + + 3. Create a `.conf` file containing a `token` field for your Wit.ai token, + and a `help_message` field for a message to display to confused users, + e.g., + + ``` + [witai] + token = QWERTYUIOP1234 + help_message = Ask me about my favorite food! + ``` + + 4. Create a new file named `witai_handler.py`, and inside of it, create a + function called `handle` with one parameter `response`. Inside of `handle`, + write code for whatever you want to do with the Wit.ai response. It should + return a `string` to respond to the user with. For example, + + ```python + def handle(response): + if response['entities']['intent'][0]['value'] == 'favorite_food': + return 'pizza' + if response['entities']['intent'][0]['value'] == 'favorite_drink': + return 'coffee' + ``` + + 5. Add `witai_handler.py`'s location as `handler_location` in your + configuration file, e.g., + + ``` + [witai] + token = QWERTYUIOP1234 + handler_location = /Users/you/witai_handler_directory/witai_handler.py + ``` + + 6. Call + + ```bash + zulip-run-bot witai \ + --config-file \ + --bot-config-file + ``` + + to start the bot. diff --git a/tools/setup/static/generated/bots/xkcd/doc.md b/tools/setup/static/generated/bots/xkcd/doc.md new file mode 100644 index 0000000000..2f2f4a0812 --- /dev/null +++ b/tools/setup/static/generated/bots/xkcd/doc.md @@ -0,0 +1,37 @@ +xkcd bot is a Zulip bot that can fetch a comic strip from xkcd. To use +the xkcd bot, you can simply call it with `@xkcd` followed by a command, +like so: + +``` +@xkcd +``` + +Run this bot as described in [here](https://zulipchat.com/api/running-bots#running-a-bot). + +### Usage + +The xkcd bot has four commands: + +1. `help` - This command is used to list all commands that can be used + with this bot. Example usage: `@xkcd help`: + ![](/static/generated/bots/xkcd/assets/xkcd-help.png) + +2. `latest` - This command is used to fetch the latest comic strip from + xkcd. Example usage: `@xkcd latest`: + ![](/static/generated/bots/xkcd/assets/xkcd-latest.png) + +3. `random`- This command is used to fetch a random comic strip from xkcd. + Example usage: `@xkcd random`: + ![](/static/generated/bots/xkcd/assets/xkcd-random.png) + +4. `` - To fetch a comic strip based on ID, you can supply the + ID to the bot as a parameter (`@xkcd `). For example, if you + want to fetch a comic strip with ID 1234, type `@xkcd 1234`: + ![](/static/generated/bots/xkcd/assets/xkcd-specific-id.png) + If the ID requested doesn't exist, the bot will post a message that + the comic strip associated with that ID is not available, like so: + ![](/static/generated/bots/xkcd/assets/xkcd-wrong-id.png) + +5. If you type a command that isn't recognized by the bot, it will respond + the information printed by the `@xkcd help` command: + ![](/static/generated/bots/xkcd/assets/xkcd-wrong-command.png) diff --git a/tools/setup/static/generated/bots/xkcd/logo.png b/tools/setup/static/generated/bots/xkcd/logo.png new file mode 100644 index 0000000000..e7f52a27cb Binary files /dev/null and b/tools/setup/static/generated/bots/xkcd/logo.png differ diff --git a/tools/setup/static/generated/bots/yoda/doc.md b/tools/setup/static/generated/bots/yoda/doc.md new file mode 100644 index 0000000000..e12f2af41a --- /dev/null +++ b/tools/setup/static/generated/bots/yoda/doc.md @@ -0,0 +1,68 @@ +# Overview + +This is the documentation for how to set up and run the yoda bot. (`yoda.py`) + +This directory contains library code for running Zulip +bots that react to messages sent by users. + +This bot will allow users to translate a sentence into 'Yoda speak'. +It looks for messages starting with at-mention of the botname. You will need to have a +Mashape API key. Please see instructions for getting one below. + +## Setup + +Before running this bot, make sure to get a Mashape API key. +Go to this link: + +This is the API that powers the `yoda`. You can read more about it +on this page. + +![yoda api overview](assets/yoda-speak-api.png) + +Click on the **Sign Up Free** button at the top and create +an account. Then click on the **Documentation** tab. Scroll down to the +bottom, and click on the **Test Endpoint** button. +This will add the Yoda Speak API to your default application. You can +also add it to a different application if you wish. Now click on the +**Applications** tab at the top. Select the application that you added +the Yoda Speak API to. Click on the blue **GET THE KEYS** button. + +On the pop-up that comes up, click on the **COPY** button. +This is your Mashape API key. It is used +to authenticate. Store it in the `yoda.conf` file in the bot's +directory. + +Example input: + + @mention-bot You will learn how to speak like me someday. + +If you need help while the bot is running just input `@mention-bot help`. + +## Running the bot + +Here is an example of running the "yoda" bot from +inside a Zulip repo: + + cd ~/zulip/api + zulip-run-bot yoda --config-file ~/.zuliprc-prod + +Once the bot code starts running, you will see a +message explaining how to use the bot, as well as +some log messages. You can use the `--quiet` option +to suppress some of the informational messages. + +The bot code will run continuously until you kill them with +control-C (or otherwise). + +### Configuration + +For this document we assume you have some prior experience +with using the Zulip API, but here is a quick review of +what a `.zuliprc` files looks like. You can connect to the +API as your own human user, or you can go into the Zulip settings +page to create a user-owned bot. + + [api] + email=someuser@example.com + key= + site=https://zulip.somewhere.com diff --git a/tools/setup/static/generated/bots/youtube/doc.md b/tools/setup/static/generated/bots/youtube/doc.md new file mode 100644 index 0000000000..d885e415ec --- /dev/null +++ b/tools/setup/static/generated/bots/youtube/doc.md @@ -0,0 +1,65 @@ +# YouTube bot + +The YouTube bot is a Zulip bot that can search for videos from [YouTube](https://www.youtube.com/). + +To use the YouTube bot, you can simply call it with `@YouTube` followed +by a keyword(s), like so: + +``` +@YouTube funny cats +``` + +## Setup + +Before starting you will need a Developer's API key to run the bot. +To obtain a API key, follow the following steps : + + 1. Create a project in the [Google Developers Console](https://console.developers.google.com/) + + 2. Open the [API Library](https://console.developers.google.com/apis/library?project=_) + in the Google Developers Console. If prompted, select a project or create a new one. + In the list of APIs, select `Youtube Data API v3` and make sure it is enabled . + + 3. Open the [Credentials](https://console.developers.google.com/apis/credentials?project=_) page. + + 4. In the Credentials page , select *Create Credentials > API key* + + 5. Open `zulip_bots/bots/youtube/youtube.conf` in an editor and + and change the value of the `key` attribute to the API key + you generated above. + + 6. And that's it ! See Configuration section on configuring the bot. + +## Configuration + +This section explains the usage of options `youtube.conf` file in configuring the bot. + - `key` - Used for setting the API key. See the above section on setting up the bot. + + - `number_of_results` - The maximum number of videos to show when searching + for a list of videos with the `@YouTube list ` command. + + - `video_region` - The location to be used for searching. + The bot shows only the videos that are available in the given `` + +Run this bot as described in [here](https://zulipchat.com/api/running-bots#running-a-bot). + +## Usage + +1. `@YouTube ` + - This command search YouTube with the given keyword and gives the top result of the search. + This can also be done with the command `@YouTube top ` + - Example usage: `@YouTube funny cats` , `@YouTube top funny dogs` + ![](/static/generated/bots/youtube/assets/youtube-search.png) + +2. `@YouTube list ` + - This command search YouTube with the given keyword and gives a list of videos associated with the keyword. + - Example usage: `@YouTube list origami` + ![](/static/generated/bots/youtube/assets/youtube-list.png) + +2. If a video can't be found for a given keyword, the bot will + respond with an error message + ![](/static/generated/bots/youtube/assets/youtube-not-found.png) + +3. If there's a error while searching, the bot will respond with an + error message + ![](/static/generated/bots/youtube/assets/youtube-error.png) diff --git a/zerver/lib/integrations.py b/zerver/lib/integrations.py index e35f3f9068..a05d287914 100644 --- a/zerver/lib/integrations.py +++ b/zerver/lib/integrations.py @@ -573,6 +573,13 @@ BOT_INTEGRATIONS: List[BotIntegration] = [ BotIntegration( "xkcd", ["bots", "misc"], display_name="xkcd", logo="images/integrations/logos/xkcd.png" ), + BotIntegration( + "baremetrics", + ["bots"], + display_name="Baremetrics", + logo="images/integrations/logos/baremetrics.png", + doc="../../tools/setup/static/generated/bots/baremetrics/doc.md", + ), ] HUBOT_INTEGRATIONS: List[HubotIntegration] = [