{"id":13764322,"url":"https://github.com/flint-bot/flint","last_synced_at":"2025-08-20T12:31:11.916Z","repository":{"id":41456395,"uuid":"51719063","full_name":"flint-bot/flint","owner":"flint-bot","description":"Webex Bot SDK for Node.js (deprecated in favor of https://github.com/webex/webex-bot-node-framework)","archived":false,"fork":false,"pushed_at":"2023-01-11T11:51:59.000Z","size":2089,"stargazers_count":86,"open_issues_count":20,"forks_count":26,"subscribers_count":13,"default_branch":"master","last_synced_at":"2024-10-11T20:15:22.258Z","etag":null,"topics":["cisco","spark"],"latest_commit_sha":null,"homepage":"","language":"JavaScript","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/flint-bot.png","metadata":{"files":{"readme":"README.md","changelog":"CHANGELOG.md","contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null}},"created_at":"2016-02-14T23:21:30.000Z","updated_at":"2024-07-30T14:57:14.000Z","dependencies_parsed_at":"2023-02-09T03:01:09.380Z","dependency_job_id":null,"html_url":"https://github.com/flint-bot/flint","commit_stats":null,"previous_names":[],"tags_count":9,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/flint-bot%2Fflint","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/flint-bot%2Fflint/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/flint-bot%2Fflint/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/flint-bot%2Fflint/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/flint-bot","download_url":"https://codeload.github.com/flint-bot/flint/tar.gz/refs/heads/master","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":230042349,"owners_count":18163813,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["cisco","spark"],"created_at":"2024-08-03T16:00:18.919Z","updated_at":"2024-12-19T11:11:54.370Z","avatar_url":"https://github.com/flint-bot.png","language":"JavaScript","funding_links":[],"categories":["Bot frameworks"],"sub_categories":[],"readme":"# node-flint (v4)\n\n### Bot SDK for Node JS\n\n## News\n\n**03/01/2020 Please consider the Webex Node Bot Framework:**\n\n* This framework is no longer being actively maintained by the original author.  Developers who are familiar with flint may consider trying the [webex-node-bot-framework](https://github.com/webex/webex-bot-node-framework).  While not 100% directly compatible with flint, this framework is inspired by flint and should be extremely familiar to developers who already use flint.   For more information see the [migration from flint guide](https://github.com/webex/webex-bot-node-framework/blob/master/docs/migrate-from-node-flint.md)\n\n**10/25/19 Support for Adaptive Cards:**\n\n* Cisco recently introduced support for [Adaptive Cards](https://developer.webex.com/docs/api/guides/cards/) in the Webex Teams.   Bots can send cards, using the new `attachment` attribute of the message object. Cards are useful as an alternative to text messages and files in order to display or collect complex bits of information. Cards can be sent by passing an object to the bot.say() method that includes a valid attachment.   To process user input to cards, apps must implement a `flint.on('attachmentaction', ..)` function.   For more details see the [adaptive-card-example](./docs/adaptive-card-example.md)\n\n**6/21/19 Deploying behind a firewall:**\n\n* Cisco has recently introduced support in the Webex Javascript SDK which allows applications to register to receive the message, membership, and room events via a socket instead of via wehbhoks.   This allows applications to be deployed behind firewalls and removes the requirement that webex bots and integrations must expose a public IP address to receive events.   To take advantage of this in your flint applications simply remove the `webhookUrl` field from the configuration object passed to the flint constructor.   If this field is not set, flint will register to listen for these events instead of creating webhooks.\n  \n**6/21/18 IMPORTANT:**\n\n* On August 31st, 2018 all bots with the sparkbot.io domain name will be\n  renamed with a webex.bot domain. Today in flint, the code compares the bot's\n  email with the trigger email to filter out messages from itself. If this code\n  is running on August 31st the bot will start responding to its own messages.\n  Please update to Flint v4.7.x as soon as possible to avoid interruption. \n\n**3/19/18 IMPORTANT:**\n\n* Note that Flint v4 is still using the node-sparky library version 3.x.\n  However the repo for node-sparky is now on version 4 which has some major\n  differences. This misalignment between Flint and Sparky version\n  will be fixed with the release of Flint v5. In the\n  short term if you are accessing the spark object directly from Flint via\n  `flint.spark` be sure to use the documentation for [node-sparky 3.x](https://github.com/flint-bot/sparky/tree/v3).   \n\n**See [CHANGELOG.md](/CHANGELOG.md) for details on changes to versions of Flint.**\n\n## Contents\n\n\u003c!-- START doctoc generated TOC please keep comment here to allow auto update --\u003e\n\u003c!-- DON'T EDIT THIS SECTION, INSTEAD RE-RUN doctoc TO UPDATE --\u003e\n\n\n- [Installation](#installation)\n    - [Via Git](#via-git)\n    - [Via NPM](#via-npm)\n    - [Example Template Using Express](#example-template-using-express)\n- [Overview](#overview)\n- [Authentication](#authentication)\n- [Storage](#storage)\n- [Bot Accounts](#bot-accounts)\n\n\u003c!-- END doctoc generated TOC please keep comment here to allow auto update --\u003e\n## Installation\n\n#### Via Git\n```bash\nmkdir myproj\ncd myproj\ngit clone https://github.com/nmarus/flint\nnpm install ./flint\n```\n\n#### Via NPM\n```bash\nmkdir myproj\ncd myproj\nnpm install node-flint\n```\n#### Example Template Using Express\n```js\nvar Flint = require('node-flint');\nvar webhook = require('node-flint/webhook');\nvar express = require('express');\nvar bodyParser = require('body-parser');\nvar app = express();\napp.use(bodyParser.json());\n\n// flint options\nvar config = {\n  webhookUrl: 'http://myserver.com/flint',\n  token: 'Tm90aGluZyB0byBzZWUgaGVyZS4uLiBNb3ZlIGFsb25nLi4u',\n  port: 80\n};\n\n// init flint\nvar flint = new Flint(config);\nflint.start();\n\n// say hello\nflint.hears('/hello', function(bot, trigger) {\n  bot.say('Hello %s!', trigger.personDisplayName);\n});\n\n// define express path for incoming webhooks\n// This is not necessary if webhookUrl is not set in the config\napp.post('/flint', webhook(flint));\n\n// start express server\n// This is not necessary if webhookUrl is not set in the config\n// unless the bot uses express for other reasons\nvar server = app.listen(config.port, function () {\n  flint.debug('Flint listening on port %s', config.port);\n});\n\n// gracefully shutdown (ctrl-c)\nprocess.on('SIGINT', function() {\n  flint.debug('stoppping...');\n  server.close();   // remove if not using webhooks and express\n  flint.stop().then(function() {\n    process.exit();\n  });\n});\n```\n\n[**Restify Example**](https://github.com/nmarus/flint/blob/master/docs/example2.md)\n## Overview\n\nMost of Flint's functionality is based around the flint.hears function. This\ndefines the phrase or pattern the bot is listening for and what actions to take\nwhen that phrase or pattern is matched. The flint.hears function gets a callback\nthan includes two objects. The bot object, and the trigger object.\n\nFlint generates a bot object instance of the Bot class for each room the Spark\naccount Flint is running under. The bot object instance tracks the specifics\nabout the room it is running in and is passed to the  \"hears\" command callback\nwhen a phrase is heard.\n\nFlint also generates a trigger object based on the person and room that the\nflint.hears function was triggered.\n\nA simple example of a flint.hears() function setup:\n\n```js\nflint.hears(phrase, function(bot, trigger) {\n  bot.\u003ccommand\u003e\n    .then(function(returnedValue) {\n      // do something with returned value\n    })\n    .catch(function(err) {\n      // handle errors\n    });\n});\n```\n\n* `phrase` : This can be either a string or a regex pattern.\nIf a string, the string is matched against the first word in the room message.\nmessage.\nIf a regex pattern is used, it is matched against the entire message text.\n* `bot` : The bot object that is used to execute commands when the `phrase` is\ntriggered.\n* `bot.\u003ccommand\u003e` : The Bot method to execute.\n* `then` : Node JS Promise keyword that invokes additional logic once the\nprevious command is executed.\n* `catch` : handle errors that happen at either the original command or in any\nof the chained 'then' functions.\n* `trigger` : The object that describes the details around what triggered the\n`phrase`.\n* `commands` : The commands that are ran when the `phrase` is heard.\n\n## Authentication\nThe token used to authenticate Flint to the Spark (now Webex) API is passed as part of the\noptions used when instantiating the Flint class. To change or update the\ntoken, use the Flint#setSparkToken() method.\n\n**Example:**\n\n```js\nvar newToken = 'Tm90aGluZyB0byBzZWUgaGVyZS4uLiBNb3ZlIGFsb25nLi4u';\n\nflint.setSparkToken(newToken)\n.then(function(token) {\n  console.log('token updated to: ' + token);\n});\n```\n\n## Storage\nThe storage system used in flint is a simple key/value store and resolves around\nthese 3 methods:\n\n* `bot.store(key, value)` - Store a value to a bot instance where 'key' is a\n  string and 'value' is a boolean, number, string, array, or object. *This does\n  not not support functions or any non serializable data.* Returns the a promise\n  with the value.\n* `bot.recall(key)` - Recall a value by 'key' from a bot instance. Returns a\n  resolved promise with the value or a rejected promise if not found.\n* `bot.forget([key])` - Forget (remove) value(s) from a bot instance where 'key'\n  is an optional property that when defined, removes the specific key, and when\n  undefined, removes all keys. Returns a resolved promise if deleted or not found.\n\nWhen a bot despawns (removed from room), the key/value store for that bot\ninstance will automatically be removed from the store. Flint currently has an\nin-memory store and a Redis based store. By default, the in-memory store is\nused. Other backend stores are possible by replicating any one of the built-in\nstorage modules and passing it to the `flint.storeageDriver()` method. *See\ndocs for store, recall, forget for more details.*\n\n**Example:**\n\n```js\nvar redisDriver = require('node-flint/storage/redis');\nflint.storageDriver(redisDriver('redis://localhost'));\n```\n\n## Bot Accounts\n\n**When using \"Bot Accounts\" the major differences are:**\n\n* Webhooks for message:created only trigger when the Bot is mentioned by name\n* Unable to read messages in rooms using the Spark (now Webex) API\n\n**Differences with trigger.args using Flint with a \"Bot Account\":**\n\nThe trigger.args array is a shortcut in processing the trigger.text string. It\nconsists of an array of the words that are in the trigger.message string split\nby one or more spaces. Punctation is included if there is no space between the\nsymbol and the word. With bot accounts, this behaves a bit differently.\n\n* If defining a `flint.hears()` using a string (not regex), `trigger.args` is a\n  filtered array of words from the message that begins *after* the first match of\n  bot mention.\n\n* If defining a flint.hears() using regex, the trigger.args array is the entire\n  message.\n\n# Flint Reference\n\n\n## Classes\n\n\u003cdl\u003e\n\u003cdt\u003e\u003ca href=\"#Flint\"\u003eFlint\u003c/a\u003e\u003c/dt\u003e\n\u003cdd\u003e\u003c/dd\u003e\n\u003cdt\u003e\u003ca href=\"#Bot\"\u003eBot\u003c/a\u003e\u003c/dt\u003e\n\u003cdd\u003e\u003c/dd\u003e\n\u003c/dl\u003e\n\n## Objects\n\n\u003cdl\u003e\n\u003cdt\u003e\u003ca href=\"#Message\"\u003eMessage\u003c/a\u003e : \u003ccode\u003eobject\u003c/code\u003e\u003c/dt\u003e\n\u003cdd\u003e\u003cp\u003eMessage Object\u003c/p\u003e\n\u003c/dd\u003e\n\u003cdt\u003e\u003ca href=\"#File\"\u003eFile\u003c/a\u003e : \u003ccode\u003eobject\u003c/code\u003e\u003c/dt\u003e\n\u003cdd\u003e\u003cp\u003eFile Object\u003c/p\u003e\n\u003c/dd\u003e\n\u003cdt\u003e\u003ca href=\"#Trigger\"\u003eTrigger\u003c/a\u003e : \u003ccode\u003eobject\u003c/code\u003e\u003c/dt\u003e\n\u003cdd\u003e\u003cp\u003eTrigger Object\u003c/p\u003e\n\u003c/dd\u003e\n\u003c/dl\u003e\n\n## Events\n\n\u003cdl\u003e\n\u003cdt\u003e\u003ca href=\"#event_log\"\u003e\"log\"\u003c/a\u003e\u003c/dt\u003e\n\u003cdd\u003e\u003cp\u003eFlint log event.\u003c/p\u003e\n\u003c/dd\u003e\n\u003cdt\u003e\u003ca href=\"#event_stop\"\u003e\"stop\"\u003c/a\u003e\u003c/dt\u003e\n\u003cdd\u003e\u003cp\u003eFlint stop event.\u003c/p\u003e\n\u003c/dd\u003e\n\u003cdt\u003e\u003ca href=\"#event_start\"\u003e\"start\"\u003c/a\u003e\u003c/dt\u003e\n\u003cdd\u003e\u003cp\u003eFlint start event.\u003c/p\u003e\n\u003c/dd\u003e\n\u003cdt\u003e\u003ca href=\"#event_initialized\"\u003e\"initialized\"\u003c/a\u003e\u003c/dt\u003e\n\u003cdd\u003e\u003cp\u003eFlint initialized event.\u003c/p\u003e\n\u003c/dd\u003e\n\u003cdt\u003e\u003ca href=\"#event_roomLocked\"\u003e\"roomLocked\"\u003c/a\u003e\u003c/dt\u003e\n\u003cdd\u003e\u003cp\u003eRoom Locked event.\u003c/p\u003e\n\u003c/dd\u003e\n\u003cdt\u003e\u003ca href=\"#event_roomUnocked\"\u003e\"roomUnocked\"\u003c/a\u003e\u003c/dt\u003e\n\u003cdd\u003e\u003cp\u003eRoom Unocked event.\u003c/p\u003e\n\u003c/dd\u003e\n\u003cdt\u003e\u003ca href=\"#event_personEnters\"\u003e\"personEnters\"\u003c/a\u003e\u003c/dt\u003e\n\u003cdd\u003e\u003cp\u003ePerson Enter Room event.\u003c/p\u003e\n\u003c/dd\u003e\n\u003cdt\u003e\u003ca href=\"#event_botAddedAsModerator\"\u003e\"botAddedAsModerator\"\u003c/a\u003e\u003c/dt\u003e\n\u003cdd\u003e\u003cp\u003eBot Added as Room Moderator.\u003c/p\u003e\n\u003c/dd\u003e\n\u003cdt\u003e\u003ca href=\"#event_botRemovedAsModerator\"\u003e\"botRemovedAsModerator\"\u003c/a\u003e\u003c/dt\u003e\n\u003cdd\u003e\u003cp\u003eBot Removed as Room Moderator.\u003c/p\u003e\n\u003c/dd\u003e\n\u003cdt\u003e\u003ca href=\"#event_personAddedAsModerator\"\u003e\"personAddedAsModerator\"\u003c/a\u003e\u003c/dt\u003e\n\u003cdd\u003e\u003cp\u003ePerson Added as Moderator.\u003c/p\u003e\n\u003c/dd\u003e\n\u003cdt\u003e\u003ca href=\"#event_personRemovedAsModerator\"\u003e\"personRemovedAsModerator\"\u003c/a\u003e\u003c/dt\u003e\n\u003cdd\u003e\u003cp\u003ePerson Removed as Moderator.\u003c/p\u003e\n\u003c/dd\u003e\n\u003cdt\u003e\u003ca href=\"#event_personExits\"\u003e\"personExits\"\u003c/a\u003e\u003c/dt\u003e\n\u003cdd\u003e\u003cp\u003ePerson Exits Room.\u003c/p\u003e\n\u003c/dd\u003e\n\u003cdt\u003e\u003ca href=\"#event_mentioned\"\u003e\"mentioned\"\u003c/a\u003e\u003c/dt\u003e\n\u003cdd\u003e\u003cp\u003eBot Mentioned.\u003c/p\u003e\n\u003c/dd\u003e\n\u003cdt\u003e\u003ca href=\"#event_message\"\u003e\"message\"\u003c/a\u003e\u003c/dt\u003e\n\u003cdd\u003e\u003cp\u003eMessage Recieved.\u003c/p\u003e\n\u003c/dd\u003e\n\u003cdt\u003e\u003ca href=\"#event_files\"\u003e\"files\"\u003c/a\u003e\u003c/dt\u003e\n\u003cdd\u003e\u003cp\u003eFile Recieved.\u003c/p\u003e\n\u003c/dd\u003e\n\u003cdt\u003e\u003ca href=\"#event_spawn\"\u003e\"spawn\"\u003c/a\u003e\u003c/dt\u003e\n\u003cdd\u003e\u003cp\u003eBot Spawned.\u003c/p\u003e\n\u003c/dd\u003e\n\u003cdt\u003e\u003ca href=\"#event_despawn\"\u003e\"despawn\"\u003c/a\u003e\u003c/dt\u003e\n\u003cdd\u003e\u003cp\u003eBot Despawned.\u003c/p\u003e\n\u003c/dd\u003e\n\u003c/dl\u003e\n\n\u003ca name=\"Flint\"\u003e\u003c/a\u003e\n\n## Flint\n**Kind**: global class  \n**Properties**\n\n| Name | Type | Description |\n| --- | --- | --- |\n| id | \u003ccode\u003estring\u003c/code\u003e | Flint UUID |\n| active | \u003ccode\u003eboolean\u003c/code\u003e | Flint active state |\n| intialized | \u003ccode\u003eboolean\u003c/code\u003e | Flint fully initialized |\n| isBotAccount | \u003ccode\u003eboolean\u003c/code\u003e | Is Flint attached to Spark using a bot account? |\n| isUserAccount | \u003ccode\u003eboolean\u003c/code\u003e | Is Flint attached to Spark using a user account? |\n| person | \u003ccode\u003eobject\u003c/code\u003e | Flint person object |\n| email | \u003ccode\u003estring\u003c/code\u003e | Flint email |\n| spark | \u003ccode\u003eobject\u003c/code\u003e | The Spark instance used by flint |\n\n\n* [Flint](#Flint)\n    * [new Flint(options)](#new_Flint_new)\n    * [.options](#Flint+options) : \u003ccode\u003eobject\u003c/code\u003e\n    * [.setSparkToken(token)](#Flint+setSparkToken) ⇒ \u003ccode\u003ePromise.\u0026lt;String\u0026gt;\u003c/code\u003e\n    * [.stop()](#Flint+stop) ⇒ \u003ccode\u003ePromise.\u0026lt;Boolean\u0026gt;\u003c/code\u003e\n    * [.start()](#Flint+start) ⇒ \u003ccode\u003ePromise.\u0026lt;Boolean\u0026gt;\u003c/code\u003e\n    * [.restart()](#Flint+restart) ⇒ \u003ccode\u003ePromise.\u0026lt;Boolean\u0026gt;\u003c/code\u003e\n    * [.getMessage(messageId)](#Flint+getMessage) ⇒ [\u003ccode\u003ePromise.\u0026lt;Message\u0026gt;\u003c/code\u003e](#Message)\n    * [.getFiles(messageId)](#Flint+getFiles) ⇒ \u003ccode\u003ePromise.\u0026lt;Array\u0026gt;\u003c/code\u003e\n    * [.hears(phrase, action, [helpText], [preference])](#Flint+hears) ⇒ \u003ccode\u003eString\u003c/code\u003e\n    * [.clearHears(id)](#Flint+clearHears) ⇒ \u003ccode\u003enull\u003c/code\u003e\n    * [.showHelp([header], [footer])](#Flint+showHelp) ⇒ \u003ccode\u003eString\u003c/code\u003e\n    * [.setAuthorizer(Action)](#Flint+setAuthorizer) ⇒ \u003ccode\u003eBoolean\u003c/code\u003e\n    * [.clearAuthorizer()](#Flint+clearAuthorizer) ⇒ \u003ccode\u003enull\u003c/code\u003e\n    * [.storageDriver(Driver)](#Flint+storageDriver) ⇒ \u003ccode\u003enull\u003c/code\u003e\n    * [.use(path)](#Flint+use) ⇒ \u003ccode\u003eBoolean\u003c/code\u003e\n\n\u003ca name=\"new_Flint_new\"\u003e\u003c/a\u003e\n\n### new Flint(options)\nCreates an instance of Flint.\n\n\n| Param | Type | Description |\n| --- | --- | --- |\n| options | \u003ccode\u003eObject\u003c/code\u003e | Configuration object containing Flint settings. |\n\n**Example**  \n```js\nvar options = {\n  webhookUrl: 'http://myserver.com/flint',\n  token: 'Tm90aGluZyB0byBzZWUgaGVyZS4uLiBNb3ZlIGFsb25nLi4u'\n};\nvar flint = new Flint(options);\n```\n\u003ca name=\"Flint+options\"\u003e\u003c/a\u003e\n\n### flint.options : \u003ccode\u003eobject\u003c/code\u003e\nOptions Object\n\n**Kind**: instance namespace of [\u003ccode\u003eFlint\u003c/code\u003e](#Flint)  \n**Properties**\n\n| Name | Type | Default | Description |\n| --- | --- | --- | --- |\n| token | \u003ccode\u003estring\u003c/code\u003e |  | Spark Token. |\n| webhookUrl | \u003ccode\u003estring\u003c/code\u003e |  | URL that is used for Spark API to send callbacks.  If this field is omitted, flint will use the webex javascript sdk to register to listen for the events via websocket instead.|\n| [webhookSecret] | \u003ccode\u003estring\u003c/code\u003e |  | If specified, inbound webhooks are authorized before being processed. This configuration is ignored if `webhookUrl` is not set.|\n| [messageFormat] | \u003ccode\u003estring\u003c/code\u003e | \u003ccode\u003e\u0026quot;text\u0026quot;\u003c/code\u003e | Default Spark message format to use with bot.say(). |\n| [maxPageItems] | \u003ccode\u003enumber\u003c/code\u003e | \u003ccode\u003e50\u003c/code\u003e | Max results that the paginator uses. |\n| [maxConcurrent] | \u003ccode\u003enumber\u003c/code\u003e | \u003ccode\u003e3\u003c/code\u003e | Max concurrent sessions to the Spark API |\n| [minTime] | \u003ccode\u003enumber\u003c/code\u003e | \u003ccode\u003e600\u003c/code\u003e | Min time between consecutive request starts. |\n| [requeueMinTime] | \u003ccode\u003enumber\u003c/code\u003e | \u003ccode\u003eminTime*10\u003c/code\u003e | Min time between consecutive request starts of requests that have been re-queued. |\n| [requeueMaxRetry] | \u003ccode\u003enumber\u003c/code\u003e | \u003ccode\u003e3\u003c/code\u003e | Msx number of atteempts to make for failed request. |\n| [requeueCodes] | \u003ccode\u003earray\u003c/code\u003e | \u003ccode\u003e[429,500,503]\u003c/code\u003e | Array of http result codes that should be retried. |\n| [requestTimeout] | \u003ccode\u003enumber\u003c/code\u003e | \u003ccode\u003e20000\u003c/code\u003e | Timeout for an individual request recieving a response. |\n| [queueSize] | \u003ccode\u003enumber\u003c/code\u003e | \u003ccode\u003e10000\u003c/code\u003e | Size of the buffer that holds outbound requests. |\n| [requeueSize] | \u003ccode\u003enumber\u003c/code\u003e | \u003ccode\u003e10000\u003c/code\u003e | Size of the buffer that holds outbound re-queue requests. |\n| [id] | \u003ccode\u003estring\u003c/code\u003e | \u003ccode\u003e\u0026quot;random\u0026quot;\u003c/code\u003e | The id this instance of flint uses. |\n| [webhookRequestJSONLocation] | \u003ccode\u003estring\u003c/code\u003e | \u003ccode\u003e\u0026quot;body\u0026quot;\u003c/code\u003e | The property under the Request to find the JSON contents. This configuration is ignored if `webhookUrl` is not set. |\n| [removeWebhooksOnStart] | \u003ccode\u003eBoolean\u003c/code\u003e | \u003ccode\u003etrue\u003c/code\u003e | If you wish to have the bot remove all account webhooks when starting. This configuration is ignored if `webhookUrl` is not set. |\n\n\u003ca name=\"Flint+setSparkToken\"\u003e\u003c/a\u003e\n\n### flint.setSparkToken(token) ⇒ \u003ccode\u003ePromise.\u0026lt;String\u0026gt;\u003c/code\u003e\nTests, and then sets a new Spark Token.\n\n**Kind**: instance method of [\u003ccode\u003eFlint\u003c/code\u003e](#Flint)  \n\n| Param | Type | Description |\n| --- | --- | --- |\n| token | \u003ccode\u003eString\u003c/code\u003e | New Spark Token for Flint to use. |\n\n**Example**  \n```js\nflint.setSparkToken('Tm90aGluZyB0byBzZWUgaGVyZS4uLiBNb3ZlIGFsb25nLi4u')\n  .then(function(token) {\n     console.log('token updated to: ' + token);\n  });\n```\n\u003ca name=\"Flint+stop\"\u003e\u003c/a\u003e\n\n### flint.stop() ⇒ \u003ccode\u003ePromise.\u0026lt;Boolean\u0026gt;\u003c/code\u003e\nStop Flint.\n\n**Kind**: instance method of [\u003ccode\u003eFlint\u003c/code\u003e](#Flint)  \n**Example**  \n```js\nflint.stop();\n```\n\u003ca name=\"Flint+start\"\u003e\u003c/a\u003e\n\n### flint.start() ⇒ \u003ccode\u003ePromise.\u0026lt;Boolean\u0026gt;\u003c/code\u003e\nStart Flint.\n\n**Kind**: instance method of [\u003ccode\u003eFlint\u003c/code\u003e](#Flint)  \n**Example**  \n```js\nflint.start();\n```\n\u003ca name=\"Flint+restart\"\u003e\u003c/a\u003e\n\n### flint.restart() ⇒ \u003ccode\u003ePromise.\u0026lt;Boolean\u0026gt;\u003c/code\u003e\nRestart Flint.\n\n**Kind**: instance method of [\u003ccode\u003eFlint\u003c/code\u003e](#Flint)  \n**Example**  \n```js\nflint.restart();\n```\n\u003ca name=\"Flint+getMessage\"\u003e\u003c/a\u003e\n\n### flint.getMessage(messageId) ⇒ [\u003ccode\u003ePromise.\u0026lt;Message\u0026gt;\u003c/code\u003e](#Message)\nGet Message Object by ID\n\n**Kind**: instance method of [\u003ccode\u003eFlint\u003c/code\u003e](#Flint)  \n\n| Param | Type | Description |\n| --- | --- | --- |\n| messageId | \u003ccode\u003eString\u003c/code\u003e | Message ID from Spark API. |\n\n\u003ca name=\"Flint+getFiles\"\u003e\u003c/a\u003e\n\n### flint.getFiles(messageId) ⇒ \u003ccode\u003ePromise.\u0026lt;Array\u0026gt;\u003c/code\u003e\nGet Files from Message Object by ID\n\n**Kind**: instance method of [\u003ccode\u003eFlint\u003c/code\u003e](#Flint)  \n\n| Param | Type | Description |\n| --- | --- | --- |\n| messageId | \u003ccode\u003eString\u003c/code\u003e | Message ID from Spark API. |\n\n\u003ca name=\"Flint+hears\"\u003e\u003c/a\u003e\n\n### flint.hears(phrase, action, [helpText], [preference]) ⇒ \u003ccode\u003eString\u003c/code\u003e\nAdd action to be performed when bot hears a phrase.\n\n**Kind**: instance method of [\u003ccode\u003eFlint\u003c/code\u003e](#Flint)  \n\n| Param | Type | Default | Description |\n| --- | --- | --- | --- |\n| phrase | \u003ccode\u003eRegex\u003c/code\u003e \\| \u003ccode\u003eString\u003c/code\u003e |  | The phrase as either a regex or string. If regex, matches on entire message.If string, matches on first word. |\n| action | \u003ccode\u003efunction\u003c/code\u003e |  | The function to execute when phrase is matched. Function is executed with 2 variables. Trigger and Bot. The Trigger Object contains information about the person who entered a message that matched the phrase. The Bot Object is an instance of the Bot Class as it relates to the room the message was heard. |\n| [helpText] | \u003ccode\u003eString\u003c/code\u003e |  | The string of text that describes how this command operates. |\n| [preference] | \u003ccode\u003eNumber\u003c/code\u003e | \u003ccode\u003e0\u003c/code\u003e | Specifies preference of phrase action when overlapping phrases are matched. On multiple matches with same preference, all matched actions are excuted. On multiple matches with difference preference values, only the lower preferenced matched action(s) are executed. |\n\n**Example**  \n```js\n// using a string to match first word and defines help text\nflint.hears('/say', function(bot, trigger, id) {\n  bot.say(trigger.args.slice(1, trigger.arges.length - 1));\n}, '/say \u003cgreeting\u003e - Responds with a greeting');\n```\n**Example**  \n```js\n// using regex to match across entire message\nflint.hears(/(^| )beer( |.|$)/i, function(bot, trigger, id) {\n  bot.say('Enjoy a beer, %s! 🍻', trigger.personDisplayName);\n});\n```\n\u003ca name=\"Flint+clearHears\"\u003e\u003c/a\u003e\n\n### flint.clearHears(id) ⇒ \u003ccode\u003enull\u003c/code\u003e\nRemove a \"flint.hears()\" entry.\n\n**Kind**: instance method of [\u003ccode\u003eFlint\u003c/code\u003e](#Flint)  \n\n| Param | Type | Description |\n| --- | --- | --- |\n| id | \u003ccode\u003eString\u003c/code\u003e | The \"hears\" ID. |\n\n**Example**  \n```js\n// using a string to match first word and defines help text\nvar hearsHello = flint.hears('/flint', function(bot, trigger, id) {\n  bot.say('Hello %s!', trigger.personDisplayName);\n});\nflint.clearHears(hearsHello);\n```\n\u003ca name=\"Flint+showHelp\"\u003e\u003c/a\u003e\n\n### flint.showHelp([header], [footer]) ⇒ \u003ccode\u003eString\u003c/code\u003e\nDisplay help for registered Flint Commands.\n\n**Kind**: instance method of [\u003ccode\u003eFlint\u003c/code\u003e](#Flint)  \n\n| Param | Type | Default | Description |\n| --- | --- | --- | --- |\n| [header] | \u003ccode\u003eString\u003c/code\u003e | \u003ccode\u003eUsage:\u003c/code\u003e | String to use in header before displaying help message. |\n| [footer] | \u003ccode\u003eString\u003c/code\u003e | \u003ccode\u003ePowered by Flint - https://github.com/nmarus/flint\u003c/code\u003e | String to use in footer before displaying help message. |\n\n**Example**  \n```js\nflint.hears('/help', function(bot, trigger, id) {\n  bot.say(flint.showHelp());\n});\n```\n\u003ca name=\"Flint+setAuthorizer\"\u003e\u003c/a\u003e\n\n### flint.setAuthorizer(Action) ⇒ \u003ccode\u003eBoolean\u003c/code\u003e\nAttaches authorizer function.\n\n**Kind**: instance method of [\u003ccode\u003eFlint\u003c/code\u003e](#Flint)  \n\n| Param | Type | Description |\n| --- | --- | --- |\n| Action | \u003ccode\u003efunction\u003c/code\u003e | The function to execute when phrase is matched to authenticate a user.  The function is passed the bot, trigger, and id and expects a return value of true or false. |\n\n**Example**  \n```js\nfunction myAuthorizer(bot, trigger, id) {\n  if(trigger.personEmail === 'john@test.com') {\n    return true;\n  }\n  else if(trigger.personDomain === 'test.com') {\n    return true;\n  }\n  else {\n    return false;\n  }\n}\nflint.setAuthorizer(myAuthorizer);\n```\n\u003ca name=\"Flint+clearAuthorizer\"\u003e\u003c/a\u003e\n\n### flint.clearAuthorizer() ⇒ \u003ccode\u003enull\u003c/code\u003e\nRemoves authorizer function.\n\n**Kind**: instance method of [\u003ccode\u003eFlint\u003c/code\u003e](#Flint)  \n**Example**  \n```js\nflint.clearAuthorizer();\n```\n\u003ca name=\"Flint+storageDriver\"\u003e\u003c/a\u003e\n\n### flint.storageDriver(Driver) ⇒ \u003ccode\u003enull\u003c/code\u003e\nDefines storage backend.\n\n**Kind**: instance method of [\u003ccode\u003eFlint\u003c/code\u003e](#Flint)  \n\n| Param | Type | Description |\n| --- | --- | --- |\n| Driver | \u003ccode\u003efunction\u003c/code\u003e | The storage driver. |\n\n**Example**  \n```js\n// define memory store (default if not specified)\nflint.storageDriver(new MemStore());\n```\n\u003ca name=\"Flint+use\"\u003e\u003c/a\u003e\n\n### flint.use(path) ⇒ \u003ccode\u003eBoolean\u003c/code\u003e\nLoad a Plugin from a external file.\n\n**Kind**: instance method of [\u003ccode\u003eFlint\u003c/code\u003e](#Flint)  \n\n| Param | Type | Description |\n| --- | --- | --- |\n| path | \u003ccode\u003eString\u003c/code\u003e | Load a plugin at given path. |\n\n**Example**  \n```js\nflint.use('events.js');\n```\n**Example**  \n```js\n// events.js\nmodule.exports = function(flint) {\n  flint.on('spawn', function(bot) {\n    console.log('new bot spawned in room: %s', bot.myroom.title);\n  });\n  flint.on('despawn', function(bot) {\n    console.log('bot despawned in room: %s', bot.myroom.title);\n  });\n  flint.on('messageCreated', function(message, bot) {\n    console.log('\"%s\" said \"%s\" in room \"%s\"', message.personEmail, message.text, bot.myroom.title);\n  });\n};\n```\n\u003ca name=\"Bot\"\u003e\u003c/a\u003e\n\n## Bot\n**Kind**: global class  \n**Properties**\n\n| Name | Type | Description |\n| --- | --- | --- |\n| id | \u003ccode\u003estring\u003c/code\u003e | Bot UUID |\n| active | \u003ccode\u003eboolean\u003c/code\u003e | Bot active state |\n| person | \u003ccode\u003eobject\u003c/code\u003e | Bot Person Object |\n| email | \u003ccode\u003estring\u003c/code\u003e | Bot email |\n| team | \u003ccode\u003eobject\u003c/code\u003e | Bot team object |\n| room | \u003ccode\u003eobject\u003c/code\u003e | Bot room object |\n| membership | \u003ccode\u003eobject\u003c/code\u003e | Bot membership object |\n| isLocked | \u003ccode\u003eboolean\u003c/code\u003e | If bot is locked |\n| isModerator | \u003ccode\u003eboolean\u003c/code\u003e | If bot is a moderator |\n| isGroup | \u003ccode\u003eboolean\u003c/code\u003e | If bot is in Group Room |\n| isDirect | \u003ccode\u003eboolean\u003c/code\u003e | If bot is in 1:1/Direct Room |\n| isDirectTo | \u003ccode\u003estring\u003c/code\u003e | Recipient Email if bot is in 1:1/Direct Room |\n| isTeam | \u003ccode\u003eboolean\u003c/code\u003e | If bot is in Team Room |\n| lastActivity | \u003ccode\u003edate\u003c/code\u003e | Last bot activity |\n\n\n* [Bot](#Bot)\n    * [new Bot(flint)](#new_Bot_new)\n    * [.exit()](#Bot+exit) ⇒ \u003ccode\u003ePromise.\u0026lt;Boolean\u0026gt;\u003c/code\u003e\n    * [.add(email(s), [moderator])](#Bot+add) ⇒ \u003ccode\u003ePromise.\u0026lt;Array\u0026gt;\u003c/code\u003e\n    * [.remove(email(s))](#Bot+remove) ⇒ \u003ccode\u003ePromise.\u0026lt;Array\u0026gt;\u003c/code\u003e\n    * [.getModerators()](#Bot+getModerators) ⇒ \u003ccode\u003ePromise.\u0026lt;Array\u0026gt;\u003c/code\u003e\n    * [.newRoom(name, emails)](#Bot+newRoom) ⇒ [\u003ccode\u003ePromise.\u0026lt;Bot\u0026gt;\u003c/code\u003e](#Bot)\n    * [.newTeamRoom(name, emails)](#Bot+newTeamRoom) ⇒ [\u003ccode\u003ePromise.\u0026lt;Bot\u0026gt;\u003c/code\u003e](#Bot)\n    * [.moderateRoom()](#Bot+moderateRoom) ⇒ [\u003ccode\u003ePromise.\u0026lt;Bot\u0026gt;\u003c/code\u003e](#Bot)\n    * [.unmoderateRoom()](#Bot+unmoderateRoom) ⇒ [\u003ccode\u003ePromise.\u0026lt;Bot\u0026gt;\u003c/code\u003e](#Bot)\n    * [.moderatorSet(email(s))](#Bot+moderatorSet) ⇒ [\u003ccode\u003ePromise.\u0026lt;Bot\u0026gt;\u003c/code\u003e](#Bot)\n    * [.moderatorClear(email(s))](#Bot+moderatorClear) ⇒ [\u003ccode\u003ePromise.\u0026lt;Bot\u0026gt;\u003c/code\u003e](#Bot)\n    * [.implode()](#Bot+implode) ⇒ \u003ccode\u003ePromise.\u0026lt;Boolean\u0026gt;\u003c/code\u003e\n    * [.say([format], message)](#Bot+say) ⇒ [\u003ccode\u003ePromise.\u0026lt;Message\u0026gt;\u003c/code\u003e](#Message)\n    * [.dm(email, [format], message)](#Bot+dm) ⇒ [\u003ccode\u003ePromise.\u0026lt;Message\u0026gt;\u003c/code\u003e](#Message)\n    * [.uploadStream(filename, stream)](#Bot+uploadStream) ⇒ [\u003ccode\u003ePromise.\u0026lt;Message\u0026gt;\u003c/code\u003e](#Message)\n    * [.upload(filepath)](#Bot+upload) ⇒ [\u003ccode\u003ePromise.\u0026lt;Message\u0026gt;\u003c/code\u003e](#Message)\n    * [.censor(messageId)](#Bot+censor) ⇒ [\u003ccode\u003ePromise.\u0026lt;Message\u0026gt;\u003c/code\u003e](#Message)\n    * [.roomRename(title)](#Bot+roomRename) ⇒ \u003ccode\u003ePromise.\u0026lt;Room\u0026gt;\u003c/code\u003e\n    * [.getMessages(count)](#Bot+getMessages) ⇒ \u003ccode\u003ePromise.\u0026lt;Array\u0026gt;\u003c/code\u003e\n    * [.store(key, value)](#Bot+store) ⇒ \u003ccode\u003ePromise.\u0026lt;String\u0026gt;\u003c/code\u003e \\| \u003ccode\u003ePromise.\u0026lt;Number\u0026gt;\u003c/code\u003e \\| \u003ccode\u003ePromise.\u0026lt;Boolean\u0026gt;\u003c/code\u003e \\| \u003ccode\u003ePromise.\u0026lt;Array\u0026gt;\u003c/code\u003e \\| \u003ccode\u003ePromise.\u0026lt;Object\u0026gt;\u003c/code\u003e\n    * [.recall([key])](#Bot+recall) ⇒ \u003ccode\u003ePromise.\u0026lt;String\u0026gt;\u003c/code\u003e \\| \u003ccode\u003ePromise.\u0026lt;Number\u0026gt;\u003c/code\u003e \\| \u003ccode\u003ePromise.\u0026lt;Boolean\u0026gt;\u003c/code\u003e \\| \u003ccode\u003ePromise.\u0026lt;Array\u0026gt;\u003c/code\u003e \\| \u003ccode\u003ePromise.\u0026lt;Object\u0026gt;\u003c/code\u003e\n    * [.forget([key])](#Bot+forget) ⇒ \u003ccode\u003ePromise.\u0026lt;String\u0026gt;\u003c/code\u003e \\| \u003ccode\u003ePromise.\u0026lt;Number\u0026gt;\u003c/code\u003e \\| \u003ccode\u003ePromise.\u0026lt;Boolean\u0026gt;\u003c/code\u003e \\| \u003ccode\u003ePromise.\u0026lt;Array\u0026gt;\u003c/code\u003e \\| \u003ccode\u003ePromise.\u0026lt;Object\u0026gt;\u003c/code\u003e\n\n\u003ca name=\"new_Bot_new\"\u003e\u003c/a\u003e\n\n### new Bot(flint)\nCreates a Bot instance that is then attached to a Spark Room.\n\n\n| Param | Type | Description |\n| --- | --- | --- |\n| flint | \u003ccode\u003eObject\u003c/code\u003e | The flint object this Bot spawns under. |\n\n\u003ca name=\"Bot+exit\"\u003e\u003c/a\u003e\n\n### bot.exit() ⇒ \u003ccode\u003ePromise.\u0026lt;Boolean\u0026gt;\u003c/code\u003e\nInstructs Bot to exit from room.\n\n**Kind**: instance method of [\u003ccode\u003eBot\u003c/code\u003e](#Bot)  \n**Example**  \n```js\nbot.exit();\n```\n\u003ca name=\"Bot+add\"\u003e\u003c/a\u003e\n\n### bot.add(email(s), [moderator]) ⇒ \u003ccode\u003ePromise.\u0026lt;Array\u0026gt;\u003c/code\u003e\nInstructs Bot to add person(s) to room.\n\n**Kind**: instance method of [\u003ccode\u003eBot\u003c/code\u003e](#Bot)  \n**Returns**: \u003ccode\u003ePromise.\u0026lt;Array\u0026gt;\u003c/code\u003e - Array of emails added  \n\n| Param | Type | Description |\n| --- | --- | --- |\n| email(s) | \u003ccode\u003eString\u003c/code\u003e \\| \u003ccode\u003eArray\u003c/code\u003e | Email Address (or Array of Email Addresses) of Person(s) to add to room. |\n| [moderator] | \u003ccode\u003eBoolean\u003c/code\u003e | Add as moderator. |\n\n**Example**  \n```js\n// add one person to room by email\nbot.add('john@test.com');\n```\n**Example**  \n```js\n// add one person as moderator to room by email\nbot.add('john@test.com', true)\n  .catch(function(err) {\n    // log error if unsuccessful\n    console.log(err.message);\n  });\n```\n**Example**  \n```js\n// add 3 people to room by email\nbot.add(['john@test.com', 'jane@test.com', 'bill@test.com']);\n```\n\u003ca name=\"Bot+remove\"\u003e\u003c/a\u003e\n\n### bot.remove(email(s)) ⇒ \u003ccode\u003ePromise.\u0026lt;Array\u0026gt;\u003c/code\u003e\nInstructs Bot to remove person from room.\n\n**Kind**: instance method of [\u003ccode\u003eBot\u003c/code\u003e](#Bot)  \n**Returns**: \u003ccode\u003ePromise.\u0026lt;Array\u0026gt;\u003c/code\u003e - Array of emails removed  \n\n| Param | Type | Description |\n| --- | --- | --- |\n| email(s) | \u003ccode\u003eString\u003c/code\u003e \\| \u003ccode\u003eArray\u003c/code\u003e | Email Address (or Array of Email Addresses) of Person(s) to remove from room. |\n\n**Example**  \n```js\n// remove one person to room by email\nbot.remove('john@test.com');\n```\n**Example**  \n```js\n// remove 3 people from room by email\nbot.remove(['john@test.com', 'jane@test.com', 'bill@test.com']);\n```\n\u003ca name=\"Bot+getModerators\"\u003e\u003c/a\u003e\n\n### bot.getModerators() ⇒ \u003ccode\u003ePromise.\u0026lt;Array\u0026gt;\u003c/code\u003e\nGet room moderators.\n\n**Kind**: instance method of [\u003ccode\u003eBot\u003c/code\u003e](#Bot)  \n**Example**  \n```js\nbot.getModerators()\n  .then(function(moderators) {\n    console.log(moderators);\n  });\n```\n\u003ca name=\"Bot+newRoom\"\u003e\u003c/a\u003e\n\n### bot.newRoom(name, emails) ⇒ [\u003ccode\u003ePromise.\u0026lt;Bot\u0026gt;\u003c/code\u003e](#Bot)\nCreate new room with people by email\n\n**Kind**: instance method of [\u003ccode\u003eBot\u003c/code\u003e](#Bot)  \n\n| Param | Type | Description |\n| --- | --- | --- |\n| name | \u003ccode\u003eString\u003c/code\u003e | Name of room. |\n| emails | \u003ccode\u003eArray\u003c/code\u003e | Emails of people to add to room. |\n\n\u003ca name=\"Bot+newTeamRoom\"\u003e\u003c/a\u003e\n\n### bot.newTeamRoom(name, emails) ⇒ [\u003ccode\u003ePromise.\u0026lt;Bot\u0026gt;\u003c/code\u003e](#Bot)\nCreate new Team Room\n\n**Kind**: instance method of [\u003ccode\u003eBot\u003c/code\u003e](#Bot)  \n\n| Param | Type | Description |\n| --- | --- | --- |\n| name | \u003ccode\u003eString\u003c/code\u003e | Name of room. |\n| emails | \u003ccode\u003eArray\u003c/code\u003e | Emails of people to add to room. |\n\n\u003ca name=\"Bot+moderateRoom\"\u003e\u003c/a\u003e\n\n### bot.moderateRoom() ⇒ [\u003ccode\u003ePromise.\u0026lt;Bot\u0026gt;\u003c/code\u003e](#Bot)\nEnable Room Moderation.Enable.\n\n**Kind**: instance method of [\u003ccode\u003eBot\u003c/code\u003e](#Bot)  \n**Example**  \n```js\nbot.moderateRoom()\n  .then(function(err) {\n    console.log(err.message)\n  });\n```\n\u003ca name=\"Bot+unmoderateRoom\"\u003e\u003c/a\u003e\n\n### bot.unmoderateRoom() ⇒ [\u003ccode\u003ePromise.\u0026lt;Bot\u0026gt;\u003c/code\u003e](#Bot)\nDisable Room Moderation.\n\n**Kind**: instance method of [\u003ccode\u003eBot\u003c/code\u003e](#Bot)  \n**Example**  \n```js\nbot.unmoderateRoom()\n  .then(function(err) {\n    console.log(err.message)\n  });\n```\n\u003ca name=\"Bot+moderatorSet\"\u003e\u003c/a\u003e\n\n### bot.moderatorSet(email(s)) ⇒ [\u003ccode\u003ePromise.\u0026lt;Bot\u0026gt;\u003c/code\u003e](#Bot)\nAssign Moderator in Room\n\n**Kind**: instance method of [\u003ccode\u003eBot\u003c/code\u003e](#Bot)  \n\n| Param | Type | Description |\n| --- | --- | --- |\n| email(s) | \u003ccode\u003eString\u003c/code\u003e \\| \u003ccode\u003eArray\u003c/code\u003e | Email Address (or Array of Email Addresses) of Person(s) to assign as moderator. |\n\n**Example**  \n```js\nbot.moderatorSet('john@test.com')\n  .then(function(err) {\n    console.log(err.message)\n  });\n```\n\u003ca name=\"Bot+moderatorClear\"\u003e\u003c/a\u003e\n\n### bot.moderatorClear(email(s)) ⇒ [\u003ccode\u003ePromise.\u0026lt;Bot\u0026gt;\u003c/code\u003e](#Bot)\nUnassign Moderator in Room\n\n**Kind**: instance method of [\u003ccode\u003eBot\u003c/code\u003e](#Bot)  \n\n| Param | Type | Description |\n| --- | --- | --- |\n| email(s) | \u003ccode\u003eString\u003c/code\u003e \\| \u003ccode\u003eArray\u003c/code\u003e | Email Address (or Array of Email Addresses) of Person(s) to unassign as moderator. |\n\n**Example**  \n```js\nbot.moderatorClear('john@test.com')\n  .then(function(err) {\n    console.log(err.message)\n  });\n```\n\u003ca name=\"Bot+implode\"\u003e\u003c/a\u003e\n\n### bot.implode() ⇒ \u003ccode\u003ePromise.\u0026lt;Boolean\u0026gt;\u003c/code\u003e\nRemove a room and all memberships.\n\n**Kind**: instance method of [\u003ccode\u003eBot\u003c/code\u003e](#Bot)  \n**Example**  \n```js\nflint.hears('/implode', function(bot, trigger) {\n  bot.implode();\n});\n```\n\u003ca name=\"Bot+say\"\u003e\u003c/a\u003e\n\n### bot.say([format], message) ⇒ [\u003ccode\u003ePromise.\u0026lt;Message\u0026gt;\u003c/code\u003e](#Message)\nSend text with optional file to room.\n\n**Kind**: instance method of [\u003ccode\u003eBot\u003c/code\u003e](#Bot)  \n\n| Param | Type | Default | Description |\n| --- | --- | --- | --- |\n| [format] | \u003ccode\u003eString\u003c/code\u003e | \u003ccode\u003etext\u003c/code\u003e | Set message format. Valid options are 'text' or 'markdown'. |\n| message | \u003ccode\u003eString\u003c/code\u003e \\| \u003ccode\u003eObject\u003c/code\u003e |  | Message to send to room. This can be a simple string, or a object for advanced use. |\n\n**Example**  \n```js\n// Simple example\nflint.hears('/hello', function(bot, trigger) {\n  bot.say('hello');\n});\n```\n**Example**  \n```js\n// Simple example to send message and file\nflint.hears('/file', function(bot, trigger) {\n  bot.say({text: 'Here is your file!', file: 'http://myurl/file.doc'});\n});\n```\n**Example**  \n```js\n// Markdown Method 1 - Define markdown as default\nflint.messageFormat = 'markdown';\nflint.hears('/hello', function(bot, trigger) {\n  bot.say('**hello**, How are you today?');\n});\n```\n**Example**  \n```js\n// Markdown Method 2 - Define message format as part of argument string\nflint.hears('/hello', function(bot, trigger) {\n  bot.say('markdown', '**hello**, How are you today?');\n});\n```\n**Example**  \n```js\n// Mardown Method 3 - Use an object (use this method of bot.say() when needing to send a file in the same message as markdown text.\nflint.hears('/hello', function(bot, trigger) {\n  bot.say({markdown: '*Hello \u003c@personEmail:' + trigger.personEmail + '|' + trigger.personDisplayName + '\u003e*'});\n});\n```\n\u003ca name=\"Bot+dm\"\u003e\u003c/a\u003e\n\n### bot.dm(email, [format], message) ⇒ [\u003ccode\u003ePromise.\u0026lt;Message\u0026gt;\u003c/code\u003e](#Message)\nSend text with optional file in a direct message. This sends a message to a 1:1 room with the user (creates 1:1, if one does not already exist)\n\n**Kind**: instance method of [\u003ccode\u003eBot\u003c/code\u003e](#Bot)  \n\n| Param | Type | Default | Description |\n| --- | --- | --- | --- |\n| email | \u003ccode\u003eString\u003c/code\u003e |  | Email of person to send Direct Message. |\n| [format] | \u003ccode\u003eString\u003c/code\u003e | \u003ccode\u003etext\u003c/code\u003e | Set message format. Valid options are 'text' or 'markdown'. |\n| message | \u003ccode\u003eString\u003c/code\u003e \\| \u003ccode\u003eObject\u003c/code\u003e |  | Message to send to room. This can be a simple string, or a object for advanced use. |\n\n**Example**  \n```js\n// Simple example\nflint.hears('/dm', function(bot, trigger) {\n  bot.dm('someone@domain.com', 'hello');\n});\n```\n**Example**  \n```js\n// Simple example to send message and file\nflint.hears('/dm', function(bot, trigger) {\n  bot.dm('someone@domain.com', {text: 'Here is your file!', file: 'http://myurl/file.doc'});\n});\n```\n**Example**  \n```js\n// Markdown Method 1 - Define markdown as default\nflint.messageFormat = 'markdown';\nflint.hears('/dm', function(bot, trigger) {\n  bot.dm('someone@domain.com', '**hello**, How are you today?');\n});\n```\n**Example**  \n```js\n// Markdown Method 2 - Define message format as part of argument string\nflint.hears('/dm', function(bot, trigger) {\n  bot.dm('someone@domain.com', 'markdown', '**hello**, How are you today?');\n});\n```\n**Example**  \n```js\n// Mardown Method 3 - Use an object (use this method of bot.dm() when needing to send a file in the same message as markdown text.\nflint.hears('/dm', function(bot, trigger) {\n  bot.dm('someone@domain.com', {markdown: '*Hello \u003c@personEmail:' + trigger.personEmail + '|' + trigger.personDisplayName + '\u003e*'});\n});\n```\n\u003ca name=\"Bot+uploadStream\"\u003e\u003c/a\u003e\n\n### bot.uploadStream(filename, stream) ⇒ [\u003ccode\u003ePromise.\u0026lt;Message\u0026gt;\u003c/code\u003e](#Message)\nUpload a file to a room using a Readable Stream\n\n**Kind**: instance method of [\u003ccode\u003eBot\u003c/code\u003e](#Bot)  \n\n| Param | Type | Description |\n| --- | --- | --- |\n| filename | \u003ccode\u003eString\u003c/code\u003e | File name used when uploading to room |\n| stream | \u003ccode\u003eStream.Readable\u003c/code\u003e | Stream Readable |\n\n**Example**  \n```js\nflint.hears('/file', function(bot, trigger) {\n\n  // define filename used when uploading to room\n  var filename = 'test.png';\n\n  // create readable stream\n  var stream = fs.createReadStream('/my/file/test.png');\n\n  bot.uploadStream(filename, stream);\n});\n```\n\u003ca name=\"Bot+upload\"\u003e\u003c/a\u003e\n\n### bot.upload(filepath) ⇒ [\u003ccode\u003ePromise.\u0026lt;Message\u0026gt;\u003c/code\u003e](#Message)\nUpload a file to room.\n\n**Kind**: instance method of [\u003ccode\u003eBot\u003c/code\u003e](#Bot)  \n\n| Param | Type | Description |\n| --- | --- | --- |\n| filepath | \u003ccode\u003eString\u003c/code\u003e | File Path to upload |\n\n**Example**  \n```js\nflint.hears('/file', function(bot, trigger) {\n  bot.upload('test.png');\n});\n```\n\u003ca name=\"Bot+censor\"\u003e\u003c/a\u003e\n\n### bot.censor(messageId) ⇒ [\u003ccode\u003ePromise.\u0026lt;Message\u0026gt;\u003c/code\u003e](#Message)\nRemove Message By Id.\n\n**Kind**: instance method of [\u003ccode\u003eBot\u003c/code\u003e](#Bot)  \n\n| Param | Type |\n| --- | --- |\n| messageId | \u003ccode\u003eString\u003c/code\u003e | \n\n\u003ca name=\"Bot+roomRename\"\u003e\u003c/a\u003e\n\n### bot.roomRename(title) ⇒ \u003ccode\u003ePromise.\u0026lt;Room\u0026gt;\u003c/code\u003e\nSet Title of Room.\n\n**Kind**: instance method of [\u003ccode\u003eBot\u003c/code\u003e](#Bot)  \n\n| Param | Type |\n| --- | --- |\n| title | \u003ccode\u003eString\u003c/code\u003e | \n\n**Example**  \n```js\nbot.roomRename('My Renamed Room')\n  .then(function(err) {\n    console.log(err.message)\n  });\n```\n\u003ca name=\"Bot+getMessages\"\u003e\u003c/a\u003e\n\n### bot.getMessages(count) ⇒ \u003ccode\u003ePromise.\u0026lt;Array\u0026gt;\u003c/code\u003e\nGet messages from room. Returned data has newest message at bottom.\n\n**Kind**: instance method of [\u003ccode\u003eBot\u003c/code\u003e](#Bot)  \n\n| Param | Type |\n| --- | --- |\n| count | \u003ccode\u003eInteger\u003c/code\u003e | \n\n**Example**  \n```js\nbot.getMessages(5).then(function(messages) {\n  messages.forEach(function(message) {\n    // display message text\n    if(message.text) {\n      console.log(message.text);\n    }\n  });\n});\n```\n\u003ca name=\"Bot+store\"\u003e\u003c/a\u003e\n\n### bot.store(key, value) ⇒ \u003ccode\u003ePromise.\u0026lt;String\u0026gt;\u003c/code\u003e \\| \u003ccode\u003ePromise.\u0026lt;Number\u0026gt;\u003c/code\u003e \\| \u003ccode\u003ePromise.\u0026lt;Boolean\u0026gt;\u003c/code\u003e \\| \u003ccode\u003ePromise.\u0026lt;Array\u0026gt;\u003c/code\u003e \\| \u003ccode\u003ePromise.\u0026lt;Object\u0026gt;\u003c/code\u003e\nStore key/value data.\n\n**Kind**: instance method of [\u003ccode\u003eBot\u003c/code\u003e](#Bot)  \n\n| Param | Type | Description |\n| --- | --- | --- |\n| key | \u003ccode\u003eString\u003c/code\u003e | Key under id object |\n| value | \u003ccode\u003eString\u003c/code\u003e \\| \u003ccode\u003eNumber\u003c/code\u003e \\| \u003ccode\u003eBoolean\u003c/code\u003e \\| \u003ccode\u003eArray\u003c/code\u003e \\| \u003ccode\u003eObject\u003c/code\u003e | Value of key |\n\n\u003ca name=\"Bot+recall\"\u003e\u003c/a\u003e\n\n### bot.recall([key]) ⇒ \u003ccode\u003ePromise.\u0026lt;String\u0026gt;\u003c/code\u003e \\| \u003ccode\u003ePromise.\u0026lt;Number\u0026gt;\u003c/code\u003e \\| \u003ccode\u003ePromise.\u0026lt;Boolean\u0026gt;\u003c/code\u003e \\| \u003ccode\u003ePromise.\u0026lt;Array\u0026gt;\u003c/code\u003e \\| \u003ccode\u003ePromise.\u0026lt;Object\u0026gt;\u003c/code\u003e\nRecall value of data stored by 'key'.\n\n**Kind**: instance method of [\u003ccode\u003eBot\u003c/code\u003e](#Bot)  \n\n| Param | Type | Description |\n| --- | --- | --- |\n| [key] | \u003ccode\u003eString\u003c/code\u003e | Key under id object (optional). If key is not passed, all keys for id are returned as an object. |\n\n\u003ca name=\"Bot+forget\"\u003e\u003c/a\u003e\n\n### bot.forget([key]) ⇒ \u003ccode\u003ePromise.\u0026lt;String\u0026gt;\u003c/code\u003e \\| \u003ccode\u003ePromise.\u0026lt;Number\u0026gt;\u003c/code\u003e \\| \u003ccode\u003ePromise.\u0026lt;Boolean\u0026gt;\u003c/code\u003e \\| \u003ccode\u003ePromise.\u0026lt;Array\u0026gt;\u003c/code\u003e \\| \u003ccode\u003ePromise.\u0026lt;Object\u0026gt;\u003c/code\u003e\nForget a key or entire store.\n\n**Kind**: instance method of [\u003ccode\u003eBot\u003c/code\u003e](#Bot)  \n\n| Param | Type | Description |\n| --- | --- | --- |\n| [key] | \u003ccode\u003eString\u003c/code\u003e | Key under id object (optional). If key is not passed, id and all children are removed. |\n\n\u003ca name=\"Message\"\u003e\u003c/a\u003e\n\n## Message : \u003ccode\u003eobject\u003c/code\u003e\nMessage Object\n\n**Kind**: global namespace  \n**Properties**\n\n| Name | Type | Description |\n| --- | --- | --- |\n| id | \u003ccode\u003estring\u003c/code\u003e | Message ID |\n| personId | \u003ccode\u003estring\u003c/code\u003e | Person ID |\n| personEmail | \u003ccode\u003estring\u003c/code\u003e | Person Email |\n| personAvatar | \u003ccode\u003estring\u003c/code\u003e | PersonAvatar URL |\n| personDomain | \u003ccode\u003estring\u003c/code\u003e | Person Domain Name |\n| personDisplayName | \u003ccode\u003estring\u003c/code\u003e | Person Display Name |\n| roomId | \u003ccode\u003estring\u003c/code\u003e | Room ID |\n| text | \u003ccode\u003estring\u003c/code\u003e | Message text |\n| files | \u003ccode\u003earray\u003c/code\u003e | Array of File objects |\n| created | \u003ccode\u003edate\u003c/code\u003e | Date Message created |\n\n\u003ca name=\"File\"\u003e\u003c/a\u003e\n\n## File : \u003ccode\u003eobject\u003c/code\u003e\nFile Object\n\n**Kind**: global namespace  \n**Properties**\n\n| Name | Type | Description |\n| --- | --- | --- |\n| id | \u003ccode\u003estring\u003c/code\u003e | Spark API Content ID |\n| name | \u003ccode\u003estring\u003c/code\u003e | File name |\n| ext | \u003ccode\u003estring\u003c/code\u003e | File extension |\n| type | \u003ccode\u003estring\u003c/code\u003e | Header [content-type] for file |\n| binary | \u003ccode\u003ebuffer\u003c/code\u003e | File contents as binary |\n| base64 | \u003ccode\u003estring\u003c/code\u003e | File contents as base64 encoded string |\n| personId | \u003ccode\u003estring\u003c/code\u003e | Person ID of who added file |\n| personEmail | \u003ccode\u003estring\u003c/code\u003e | Person Email of who added file |\n| personAvatar | \u003ccode\u003estring\u003c/code\u003e | PersonAvatar URL |\n| personDomain | \u003ccode\u003estring\u003c/code\u003e | Person Domain Name |\n| personDisplayName | \u003ccode\u003estring\u003c/code\u003e | Person Display Name |\n| created | \u003ccode\u003edate\u003c/code\u003e | Date file was added to room |\n\n\u003ca name=\"Trigger\"\u003e\u003c/a\u003e\n\n## Trigger : \u003ccode\u003eobject\u003c/code\u003e\nTrigger Object\n\n**Kind**: global namespace  \n**Properties**\n\n| Name | Type | Description |\n| --- | --- | --- |\n| id | \u003ccode\u003estring\u003c/code\u003e | Message ID |\n| phrase | \u003ccode\u003estring\u003c/code\u003e \\| \u003ccode\u003eregex\u003c/code\u003e | Matched lexicon phrase |\n| text | \u003ccode\u003estring\u003c/code\u003e | Message Text (or false if no text) |\n| raw | \u003ccode\u003estring\u003c/code\u003e | Unprocessed Message Text (or false if no text) |\n| html | \u003ccode\u003estring\u003c/code\u003e | Message HTML (or false if no html) |\n| markdown | \u003ccode\u003estring\u003c/code\u003e | Message Markdown (or false if no markdown) |\n| mentionedPeople | \u003ccode\u003earray\u003c/code\u003e | Mentioned People (or false if no mentioned) |\n| files | \u003ccode\u003earray\u003c/code\u003e | Message Files (or false if no files in trigger) |\n| args | \u003ccode\u003earray\u003c/code\u003e | Filtered array of words in message text. |\n| created | \u003ccode\u003edate\u003c/code\u003e | Message Created date |\n| roomId | \u003ccode\u003estring\u003c/code\u003e | Room ID |\n| roomTitle | \u003ccode\u003estring\u003c/code\u003e | Room Title |\n| roomType | \u003ccode\u003estring\u003c/code\u003e | Room Type (group or direct) |\n| roomIsLocked | \u003ccode\u003eboolean\u003c/code\u003e | Room Locked/Moderated status |\n| personId | \u003ccode\u003estring\u003c/code\u003e | Person ID |\n| personEmail | \u003ccode\u003estring\u003c/code\u003e | Person Email |\n| personDisplayName | \u003ccode\u003estring\u003c/code\u003e | Person Display Name |\n| personUsername | \u003ccode\u003estring\u003c/code\u003e | Person Username |\n| personDomain | \u003ccode\u003estring\u003c/code\u003e | Person Domain name |\n| personAvatar | \u003ccode\u003estring\u003c/code\u003e | Person Avatar URL |\n| personMembership | \u003ccode\u003eobject\u003c/code\u003e | Person Membership object for person |\n\n\u003ca name=\"event_log\"\u003e\u003c/a\u003e\n\n## \"log\"\nFlint log event.\n\n**Kind**: event emitted  \n**Properties**\n\n| Name | Type | Description |\n| --- | --- | --- |\n| message | \u003ccode\u003estring\u003c/code\u003e | Log Message |\n\n\u003ca name=\"event_stop\"\u003e\u003c/a\u003e\n\n## \"stop\"\nFlint stop event.\n\n**Kind**: event emitted  \n**Properties**\n\n| Name | Type | Description |\n| --- | --- | --- |\n| id | \u003ccode\u003estring\u003c/code\u003e | Flint UUID |\n\n\u003ca name=\"event_start\"\u003e\u003c/a\u003e\n\n## \"start\"\nFlint start event.\n\n**Kind**: event emitted  \n**Properties**\n\n| Name | Type | Description |\n| --- | --- | --- |\n| id | \u003ccode\u003estring\u003c/code\u003e | Flint UUID |\n\n\u003ca name=\"event_initialized\"\u003e\u003c/a\u003e\n\n## \"initialized\"\nFlint initialized event.\n\n**Kind**: event emitted  \n**Properties**\n\n| Name | Type | Description |\n| --- | --- | --- |\n| id | \u003ccode\u003estring\u003c/code\u003e | Flint UUID |\n\n\u003ca name=\"event_roomLocked\"\u003e\u003c/a\u003e\n\n## \"roomLocked\"\nRoom Locked event.\n\n**Kind**: event emitted  \n**Properties**\n\n| Name | Type | Description |\n| --- | --- | --- |\n| bot | \u003ccode\u003eobject\u003c/code\u003e | Bot Object |\n| id | \u003ccode\u003estring\u003c/code\u003e | Flint UUID |\n\n\u003ca name=\"event_roomUnocked\"\u003e\u003c/a\u003e\n\n## \"roomUnocked\"\nRoom Unocked event.\n\n**Kind**: event emitted  \n**Properties**\n\n| Name | Type | Description |\n| --- | --- | --- |\n| bot | \u003ccode\u003eobject\u003c/code\u003e | Bot Object |\n| id | \u003ccode\u003estring\u003c/code\u003e | Flint UUID |\n\n\u003ca name=\"event_personEnters\"\u003e\u003c/a\u003e\n\n## \"personEnters\"\nPerson Enter Room event.\n\n**Kind**: event emitted  \n**Properties**\n\n| Name | Type | Description |\n| --- | --- | --- |\n| bot | \u003ccode\u003eobject\u003c/code\u003e | Bot Object |\n| person | \u003ccode\u003eobject\u003c/code\u003e | Person Object |\n| id | \u003ccode\u003estring\u003c/code\u003e | Flint UUID |\n\n\u003ca name=\"event_botAddedAsModerator\"\u003e\u003c/a\u003e\n\n## \"botAddedAsModerator\"\nBot Added as Room Moderator.\n\n**Kind**: event emitted  \n**Properties**\n\n| Name | Type | Description |\n| --- | --- | --- |\n| bot | \u003ccode\u003eobject\u003c/code\u003e | Bot Object |\n| id | \u003ccode\u003estring\u003c/code\u003e | Flint UUID |\n\n\u003ca name=\"event_botRemovedAsModerator\"\u003e\u003c/a\u003e\n\n## \"botRemovedAsModerator\"\nBot Removed as Room Moderator.\n\n**Kind**: event emitted  \n**Properties**\n\n| Name | Type | Description |\n| --- | --- | --- |\n| bot | \u003ccode\u003eobject\u003c/code\u003e | Bot Object |\n| id | \u003ccode\u003estring\u003c/code\u003e | Flint UUID |\n\n\u003ca name=\"event_personAddedAsModerator\"\u003e\u003c/a\u003e\n\n## \"personAddedAsModerator\"\nPerson Added as Moderator.\n\n**Kind**: event emitted  \n**Properties**\n\n| Name | Type | Description |\n| --- | --- | --- |\n| bot | \u003ccode\u003eobject\u003c/code\u003e | Bot Object |\n| person | \u003ccode\u003eobject\u003c/code\u003e | Person Object |\n| id | \u003ccode\u003estring\u003c/code\u003e | Flint UUID |\n\n\u003ca name=\"event_personRemovedAsModerator\"\u003e\u003c/a\u003e\n\n## \"personRemovedAsModerator\"\nPerson Removed as Moderator.\n\n**Kind**: event emitted  \n**Properties**\n\n| Name | Type | Description |\n| --- | --- | --- |\n| bot | \u003ccode\u003eobject\u003c/code\u003e | Bot Object |\n| person | \u003ccode\u003eobject\u003c/code\u003e | Person Object |\n| id | \u003ccode\u003estring\u003c/code\u003e | Flint UUID |\n\n\u003ca name=\"event_personExits\"\u003e\u003c/a\u003e\n\n## \"personExits\"\nPerson Exits Room.\n\n**Kind**: event emitted  \n**Properties**\n\n| Name | Type | Description |\n| --- | --- | --- |\n| bot | \u003ccode\u003eobject\u003c/code\u003e | Bot Object |\n| person | \u003ccode\u003eobject\u003c/code\u003e | Person Object |\n| id | \u003ccode\u003estring\u003c/code\u003e | Flint UUID |\n\n\u003ca name=\"event_mentioned\"\u003e\u003c/a\u003e\n\n## \"mentioned\"\nBot Mentioned.\n\n**Kind**: event emitted  \n**Properties**\n\n| Name | Type | Description |\n| --- | --- | --- |\n| bot | \u003ccode\u003eobject\u003c/code\u003e | Bot Object |\n| trigger | \u003ccode\u003eobject\u003c/code\u003e | Trigger Object |\n| id | \u003ccode\u003estring\u003c/code\u003e | Flint UUID |\n\n\u003ca name=\"event_message\"\u003e\u003c/a\u003e\n\n## \"message\"\nMessage Recieved.\n\n**Kind**: event emitted  \n**Properties**\n\n| Name | Type | Description |\n| --- | --- | --- |\n| bot | \u003ccode\u003eobject\u003c/code\u003e | Bot Object |\n| trigger | \u003ccode\u003eobject\u003c/code\u003e | Trigger Object |\n| id | \u003ccode\u003estring\u003c/code\u003e | Flint UUID |\n\n\u003ca name=\"event_files\"\u003e\u003c/a\u003e\n\n## \"files\"\nFile Recieved.\n\n**Kind**: event emitted  \n**Properties**\n\n| Name | Type | Description |\n| --- | --- | --- |\n| bot | \u003ccode\u003eobject\u003c/code\u003e | Bot Object |\n| trigger | \u003ccode\u003etrigger\u003c/code\u003e | Trigger Object |\n| id | \u003ccode\u003estring\u003c/code\u003e | Flint UUID |\n\n\u003ca name=\"event_spawn\"\u003e\u003c/a\u003e\n\n## \"spawn\"\nBot Spawned.\n\n**Kind**: event emitted  \n**Properties**\n\n| Name | Type | Description |\n| --- | --- | --- |\n| bot | \u003ccode\u003eobject\u003c/code\u003e | Bot Object |\n| id | \u003ccode\u003estring\u003c/code\u003e | Flint UUID |\n\n\u003ca name=\"event_despawn\"\u003e\u003c/a\u003e\n\n## \"despawn\"\nBot Despawned.\n\n**Kind**: event emitted  \n**Properties**\n\n| Name | Type | Description |\n| --- | --- | --- |\n| bot | \u003ccode\u003eobject\u003c/code\u003e | Bot Object |\n| id | \u003ccode\u003estring\u003c/code\u003e | Flint UUID |\n\n## License\n\nThe MIT License (MIT)\n\nCopyright (c) 2016-2017\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in\nall copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\nTHE SOFTWARE.\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fflint-bot%2Fflint","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fflint-bot%2Fflint","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fflint-bot%2Fflint/lists"}