{"id":24829298,"url":"https://github.com/hslarson/faster-twitch-alerts","last_synced_at":"2026-03-07T06:31:15.829Z","repository":{"id":176193358,"uuid":"442114978","full_name":"hslarson/Faster-Twitch-Alerts","owner":"hslarson","description":"Faster Twitch Alerts is a highly customizable, lightning-fast alternative to Twitch's slow mobile notification system","archived":false,"fork":false,"pushed_at":"2024-06-06T07:35:45.000Z","size":134,"stargazers_count":8,"open_issues_count":0,"forks_count":1,"subscribers_count":2,"default_branch":"master","last_synced_at":"2025-10-14T02:33:02.885Z","etag":null,"topics":["discord","pushover","python","python3","twitch","twitch-api"],"latest_commit_sha":null,"homepage":"","language":"Python","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"gpl-3.0","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/hslarson.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null,"notice":null,"maintainers":null,"copyright":null,"agents":null,"dco":null,"cla":null}},"created_at":"2021-12-27T09:37:31.000Z","updated_at":"2025-06-15T13:40:24.000Z","dependencies_parsed_at":null,"dependency_job_id":"e8d8e634-4d5b-4939-bb13-d6573d50a66d","html_url":"https://github.com/hslarson/Faster-Twitch-Alerts","commit_stats":null,"previous_names":["hslarson/faster-twitch-alerts"],"tags_count":0,"template":false,"template_full_name":null,"purl":"pkg:github/hslarson/Faster-Twitch-Alerts","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/hslarson%2FFaster-Twitch-Alerts","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/hslarson%2FFaster-Twitch-Alerts/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/hslarson%2FFaster-Twitch-Alerts/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/hslarson%2FFaster-Twitch-Alerts/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/hslarson","download_url":"https://codeload.github.com/hslarson/Faster-Twitch-Alerts/tar.gz/refs/heads/master","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/hslarson%2FFaster-Twitch-Alerts/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":30209086,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-03-07T05:23:27.321Z","status":"ssl_error","status_checked_at":"2026-03-07T05:00:17.256Z","response_time":53,"last_error":"SSL_read: unexpected eof while reading","robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":false,"can_crawl_api":true,"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":["discord","pushover","python","python3","twitch","twitch-api"],"created_at":"2025-01-30T23:05:08.790Z","updated_at":"2026-03-07T06:31:15.593Z","avatar_url":"https://github.com/hslarson.png","language":"Python","funding_links":[],"categories":[],"sub_categories":[],"readme":"# __Faster Twitch Alerts__\n\n\u003cspan\u003e\n\t\u003cimg src=\"https://img.shields.io/maintenance/yes/2023\" alt=\"maintenance status\" /\u003e\n\t\u003cimg src=\"https://img.shields.io/github/last-commit/hslarson/Faster-Twitch-Alerts\" alt=\"github last commit\" /\u003e\n\t\u003cimg src=\"https://img.shields.io/github/issues/hslarson/Faster-Twitch-Alerts\" alt=\"github issues\"\u003e\n\t\u003cimg src=\"https://img.shields.io/github/license/hslarson/Faster-Twitch-Alerts\" alt=\"github license\" /\u003e\n\u003c/span\u003e\n\u003chr\u003e\n\n\n## __What is \"Faster Twitch Alerts\"?__\nFaster Twitch Alerts is a highly customizable, lightning-fast alternative to Twitch's slow mobile notification system. Faster Twitch Alerts currently supports two notification platforms: Discord and Pushover. You can also [build your own plugins](#making-your-own-plugins).\n\u003cbr\u003e\u003cbr\u003e\n\nThe program can notify you when:\n- A streamer goes live\n- A streamer goes offline\n- A streamer gets banned\n- A streamer is unbanned\n- A streamer updates their title and/or game\n\u003cbr\u003e\u003cbr\u003e\n\nDisclaimer: This program is not associated in any way with Twitch, Discord, or Pushover\n\u003chr\u003e\n\n\n## __Getting Started__\n1. Clone the repository\n2. Install Python (≥3.7) and the aiohttp Library\n3. Set your notification preferences in the [config.json File](#config-fields-explained)\n4. Run Main.py\n    - If the program terminates unexpectedly, check the log file for more information\n    - You can terminate the program at any time using 'ctrl+c'\n\n\u003chr\u003e\n\n\n## __Config Fields Explained__\n\n\n### Primary Fields\nFor more detailed explanations of each field, follow the links\n\n| Field Name                              | Required? |\n|-----------------------------------------|-----------|\n| [Twitch Settings](#twitch-settings)     | Yes       |\n| [Logger Settings](#logger-settings)     | Yes       |\n| [Streamers](#streamers)                 | Yes       |\n| [Discord Settings](#discord-settings)   | No        |\n| [Pushover Settings](#pushover-settings) | No        |\n\u003cbr\u003e\n\n### Twitch Settings\nThis is where we store overall program settings and settings related to the Twitch API\n\u003cbr\u003e\u003cbr\u003e\n\n#### __Example Twitch Settings Object:__\n\n```\n\"Twitch Settings\" : {\n\t\"Client ID\" : \"YOUR CLIENT ID\",\n\t\"Secret\" : \"YOUR SECRET\",\n\t\"Reconnect Attempts\" : 10,\n\t\"Reconnect Cooldown\" : 60,\n\t\"Refresh Rate\" : 1\n}\n```\n\u003cbr\u003e\n\n#### __Twitch Settings Fields:__\n| Field Name | Description | Required? | Datatypes | [Alert-Specific Settings](#alert-specific-settings) | [Special Formatting](#special-formatting) |\n| - | - | - | - | - | - |\n| Client ID | Your Twitch developer application client ID \u003csup\u003e1\u003c/sup\u003e | Yes | str | Not Allowed | Not Allowed |\n| Secret | Your Twitch developer application client secret \u003csup\u003e1\u003c/sup\u003e | Yes | str | Not Allowed | Not Allowed |\n| Reconnect Attempts | The number of times the program will attempt to reconnect to the network during an outage \u003csup\u003e2\u003c/sup\u003e | Yes | int | Not Allowed | Not Allowed |\n| Reconnect Cooldown | The amount of time (in seconds) that the program will wait before trying to reconnect to the network after a connection failure |Yes | int, float | Not Allowed | Not Allowed |\n| Refresh Rate\u003csup\u003e3\u003c/sup\u003e | The number of times per second to pull new data from the Twitch API | Yes | int, float | Not Allowed | Not Allowed |\n\n__Footnotes:__\n- \u003csup\u003e1\u003c/sup\u003e [Setting Up a Twitch Developer Application](https://dev.twitch.tv/docs/api/)\n- \u003csup\u003e2\u003c/sup\u003e Negative values signal infinite reconnect attempts\n- \u003csup\u003e3\u003c/sup\u003e There is a hard cap on the refresh rate imposed by Twitch API rate limits. You can calculate the refresh rate using the following formula: 20 / (3 * ceil( [# of streamers] / 100 ))\n\u003cbr\u003e\u003cbr\u003e\n\n\n\n### Logger Settings\nSettings related to the log file\n\u003cbr\u003e\u003cbr\u003e\n\n#### __Example Logger Settings Object:__\n```\n\"Logger Settings\" : {\n\t\"Log Level\" : \"INFO\",\n\t\"Log Filepath\" : \"logs/twitch_alerts.log\",\n\t\"Message Text\" : \"ALERT!\"\n}\n```\n\u003cbr\u003e\n\n#### __Logger Settings Fields:__\n| Field Name | Description | Required? | Datatypes | [Alert-Specific Settings](#alert-specific-settings) | [Special Formatting](#special-formatting) |\n| - | - | - | - | - | - |\n| Log Level | Allows users to define which messages they receive \u003csup\u003e1\u003c/sup\u003e | Yes | str | Not Allowed | Not Allowed |\n| Log Filepath | The path (relative to current working directory) of the log file | Yes | str | Not Allowed | Not Allowed |\n| Message Text | Text to display when an [alert](#alert-types) is triggered | No \u003csup\u003e2\u003c/sup\u003e | str | Allowed | Allowed |\n\n__Footnotes:__\n- \u003csup\u003e1\u003c/sup\u003e More Info on Log Levels:\n\t- DEBUG: Shows minor network errors\n\t- ALERT: Info about streamer activity\n\t- INFO: General program info\n\t- WARNING: Info about non-fatal errors\n\t- ERROR: Info about fatal errors\n- \u003csup\u003e2\u003c/sup\u003e A warning will be displayed if field is incomplete and log level is either DEBUG or ALERT\n\u003cbr\u003e\u003cbr\u003e\n\n\n\n### Streamers\nThe JSON object containing settings for all of the streamers we wish to monitor\n\u003cbr\u003e\u003cbr\u003e\n\n#### __Example Streamers Object__:\n```\n\"Streamers\" : {\n\t\"streamer-username-1\" : {\n\t\t\"Ban Status\" : false,\n\t\t\"User ID\" : \"123456789\"\n\t},\n\t\"streamer-username-2\" : {\n\t\t\"Ban Status\" : true,\n\t\t\"User ID\" : \"987654321\"\n\t}\n}\n```\n\u003cbr\u003e\n\n#### __Streamer Object Fields:__\n| Field Name | Description | Required? | Datatypes | [Alert-Specific Settings](#alert-specific-settings) | [Special Formatting](#special-formatting) |\n| - | - | - | - | - | - |\n| Ban Status | A Boolean flag used to signal if a streamer is banned \u003csup\u003e1\u003c/sup\u003e | Yes | bool | Not Allowed | Not Allowed |\n| User ID | A streamer's unique identification number (provided by Twitch) \u003csup\u003e1\u003c/sup\u003e | Yes | str | Not Allowed | Not Allowed |\n| Discord Settings | Streamer-Specific Discord Settings. For possible fields see [Discord Settings](#discord-settings) \u003csup\u003e2\u003c/sup\u003e | No | dict | N/A | N/A |\n| Pushover Settings | Streamer-Specific Pushover Settings. For possible fields see [Pushover Settings](#pushover-settings) \u003csup\u003e2\u003c/sup\u003e | No | dict | N/A | N/A |\n\n__Footnotes:__\n- \u003csup\u003e1\u003c/sup\u003e A streamer's user ID can only be viewed using API calls, it is recommended that you use the set_config.py program in Utils/ to generate the \"Streamers\" field\n- \u003csup\u003e2\u003c/sup\u003e The \"Soon Cooldown\" field can only exist in global settings\n\u003cbr\u003e\u003cbr\u003e\n\n#### __Sidenote: Global vs. Streamer-Specific Settings__\nWe refer to Discord/Pushover settings within the streamer object as \"streamer-specific settings.\" These settings take precedence over \"global settings\" in either [Discord Settings](#discord-settings) or [Pushover settings](#pushover-settings). In this way, we can create global settings that will apply to all streamers, and also make fine-grain adjustments to individual streamers' settings.\n\u003cbr\u003e\u003cbr\u003e\n\n\n\n### Discord Settings\nGlobal settings for Discord alerts\n\u003cbr\u003e\u003cbr\u003e\n\n#### __Example Discord Settings Object:__\n```\n\"Discord Settings\" : {\n\t\"Soon Cooldown\" : 300,\n\t\"Alerts\" : \"all\",\n\t\"Webhook URL\" : \"SOME WEBHOOK URL\",\n\t\"Bot Username\" : \"Faster Twitch Alerts\",\n\t\"Avatar URL\" :   \"Link to Avatar Image\",\n\t\"Discord ID\" :   \"Some Discord ID\",\n\t\"Embeds\" : [\n\t\t{\n\t\t\t\"title\" : \"Some Title\",\n\t\t\t\"description\" : \"Some Description\"\n\t\t}\n\t],\n\t\"Message Text\" : \"DISCORD ALERT!\"\n}\n```\n\u003cbr\u003e\n\n#### __Example Discord Settings Fields:__\n| Field Name | Description | Required? | Datatypes | [Alert-Specific Settings](#alert-specific-settings) | [Special Formatting](#special-formatting) |\n| - | - | - | - | - | - |\n| Soon Cooldown | Controls how often changes to an individual streamer's title or game will generate an alert by setting a cooldown period (units = seconds) | No | int, float | Not Allowed | Not Allowed |\n| [Alerts](#alerts-field) | Controls what types of messages will generate an alert | No | str | Allowed | Not Allowed |\n| Webhook URL | The Webhook URL for the Discord channel which will receive the alert | No\u003csup\u003e1\u003c/sup\u003e | str | Allowed | Allowed |\n| Bot Username | The display name of the bot that will be the sender of the alert | No | str | Allowed | Allowed |\n| Avatar URL | A direct link to an image that will be the Discord bot's avatar | No | str | Allowed | Allowed |\n| Discord ID\u003csup\u003e2\u003c/sup\u003e | A Discord role/user ID that can be used to tag members of a Discord server. See below for examples | No | str | Allowed | Allowed |\n| Embeds | An list of up to 10 Discord embed objects\u003csup\u003e3\u003c/sup\u003e | No | list | Allowed | Allowed |\n| Message Text | Text to display when an [alert](#alert-types) is triggered | No\u003csup\u003e1\u003c/sup\u003e | str | Allowed | Allowed |\n\n__Footnotes:__\n- \u003csup\u003e1\u003c/sup\u003e These fields must be defined for all active alert types in either global settings or streamer-specific settings otherwise the program will terminate\n- \u003csup\u003e2\u003c/sup\u003e You can find user/role ID's by activating \"Developer Mode\" on Discord\n- \u003csup\u003e3\u003c/sup\u003e [Discord Embed Documentation](https://discord.com/developers/docs/resources/channel#embed-object)\n\u003cbr\u003e\u003cbr\u003e\n\n__Discord Message Tips:__\n\nMentions:\n```\nEveryone, Here: @everyone, @here\nUsers: \"\u003c@discord_user_id\u003e\"\nRoles: \"\u003c@\u0026discord_role_id\u003e\"\n```\n\u003cbr\u003e\n\nUsing a Custom Server Emoji:\n```\nNormal:    \"\u003c:emoji_alias:emoji_id\u003e\"\nAnimated: \"\u003ca:emoji_alias:emoji_id\u003e\"\n```\n\u003cbr\u003e\u003cbr\u003e\n\n\n\n### Pushover Settings\nGlobal settings for Pushover alerts\n\u003cbr\u003e\u003cbr\u003e\n\n#### __Example Pushover Settings Object:__\n```\n\"Pushover Settings\" : {\n\t\"Soon Cooldown\" : 300,\n\t\"Alerts\" : \"all\",\n\t\"API Token\" : \"YOUR API TOKEN\",\n\t\"Group Key\" : \"YOUR GROUP KEY\",\n\t\"Devices\" : \"Some Devices\",\n\t\"Priority\" : 1,\n\t\"Embed URL\" : \"https://www.twitch.tv/{name.lower()}\",\n\t\"URL Title\" : \"Go To Stream\",\n\t\"Sound\" : \"Some Sound\",\n\t\"Message Title\" : \"Faster Twitch Alerts\",\n\t\"Message Text\" : {\n\t\t\"live\" : \"{name} is Live Right Now! \\ud83d\\udce1\",\n\t\t\"title\" : \"{name} Might Be Going Live Soon! \\u231b\",\n\t\t\"game\" : \"{name} Might Be Going Live Soon! \\u231b\",\n\t\t\"offline\" : \"{name} Just Went Offline \\ud83d\\ude14\",\n\t\t\"ban\" : \"{name} Just Got Banned \\u2696\\ufe0f\",\n\t\t\"unban\" : \"{name} has Been Unbanned! \\ud83c\\udf89\"\n\t}\n}\n```\n\u003cbr\u003e\n\n#### __Example Pushover Settings Fields:__\n| Field Name | Description | Required? | Datatypes | [Alert-Specific Settings](#alert-specific-settings) | [Special Formatting](#special-formatting) |\n| - | - | - | - | - | - |\n| Soon Cooldown | Controls how often changes to an individual streamer's title or game will generate an alert by setting a cooldown period (units = seconds) | No | int, float | Not Allowed | Not Allowed |\n| [Alerts](#alerts-field) | Controls what types of messages will generate an alert | No | str | Allowed | Not Allowed |\n| API Token\u003csup\u003e1\u003c/sup\u003e | Pushover API token | No\u003csup\u003e2\u003c/sup\u003e | str | Allowed | Allowed |\n| Group Key\u003csup\u003e1\u003c/sup\u003e | Pushover User or Group Key | No\u003csup\u003e2\u003c/sup\u003e | str | Allowed | Allowed |\n| Devices\u003csup\u003e1\u003c/sup\u003e | Comma-separated list of device names to send the alert to | No | str | Allowed | Allowed |\n| Priority\u003csup\u003e1\u003c/sup\u003e | Integer from -2 to 2 that specifies how important the alert is | No | int | Allowed | Not Allowed |\n| Embed URL\u003csup\u003e1\u003c/sup\u003e | Supplementary URL for the alert | No | str | Allowed | Allowed |\n| URL Title\u003csup\u003e1\u003c/sup\u003e | The text to display for the \"Embed URL\" | No | str | Allowed | Allowed |\n| Sound\u003csup\u003e1\u003c/sup\u003e | The name of the sound to play for the alert | No | str | Allowed | Allowed |\n| Message Title\u003csup\u003e1\u003c/sup\u003e | The title of the alert | No | str | Allowed | Allowed |\n| Message Text | Text to display when an [alert](#alert-types) is triggered | No\u003csup\u003e2\u003c/sup\u003e | str | Allowed | Allowed |\n\n__Footnotes:__\n- \u003csup\u003e1\u003c/sup\u003e [More information about Pushover alert fields](https://pushover.net/api)\n- \u003csup\u003e2\u003c/sup\u003e These fields must be defined for all active alert types in either global settings or streamer-specific settings otherwise the program will terminate\n\u003chr\u003e\u003cbr\u003e\n\n\n\n## Alert-Specific Settings\nFor certain fields, we may want to change our preferences based on the [type of alert](#alert-types) being triggered. This is fairly easy to do, we can simply create a JSON object of [alert-type keywords](#alert-types) and specify different parameters for each keyword.\n\u003cbr\u003e\u003cbr\u003e\n\n#### __Alert-Specific Settings Example:__\nWithout Alert-Specific Settings:\n```\n\"Message Text\" : \"Some Alert Message\"\n```\n\nWith Alert-Specific Settings:\n```\n\"Message Text\" : {\n\t\"live\"    : \"Some 'Live' Message\",\n\t\"offline\" : \"Some 'Offline' Message\",\n\t\"ban\"     : \"Some 'Ban' Message\",\n\t\"unban\"   : \"Some 'Unban' Message\",\n\t\"title\"   : \"Some 'Title Change' Message\",\n\t\"game\"    : \"Some 'Game Change' Message\"\n}\n```\n\u003cbr\u003e\n\n### __Alert Types__\nFaster Twitch Alerts can send alerts for many types of events. Below are the keywords describing each alert type\n\n| Alert Type | Description |\n| - | - |\n| live | The streamer went live |\n| offline | The streamer went offline |\n| ban | The streamer was banned |\n| unban | The streamer's ban ended |\n| title | The streamer updated their stream's title (while offline) |\n| game | The streamer switched categories (while offline) |\n\u003cbr\u003e\n\n### __Keyword Mapping__\nFor the sake of efficiency, we've provided additional keywords that specify multiple alert fields. Below you can see the keywords and which alert types they map to.\n\n| Alert Type | Description |\n| - | - |\n| all | live, offline, ban, unban, title, game |\n| none\u003csup\u003e1\u003c/sup\u003e |  |\n| bans | ban, unban |\n| soon | title, game |\n\n__Footnotes:__\n- \u003csup\u003e1\u003c/sup\u003e Only valid for the [\"Alerts\" field](#alerts-field)\n\u003cbr\u003e\u003cbr\u003e\n\n### __Alerts Field__\nThe Alerts field is used to toggle certain alert types on and off.\n\n__Valid \"Alerts\" Formats:__\n\nBoolean Keyword Dictionary:\n```\n\"Alerts\" : {\n\t\"live\"    : true\n\t\"offline\" : true,\n\t\"ban\"     : true,\n\t\"unban\"   : true,\n\t\"title\"   : true,\n\t\"game\"    : true\n}\n```\n\t\t\nComma-Separated Keywords in String Format:\n```\n\"Alerts\" : \"live, offline, ban, unban, title, game\"\n```\n\n__Negation Operator:__\n\n'!' Can be used in front of a keyword to negate that keyword\n\nNote that keywords are parsed in order, for example\n- \"all, !live\" -\u003e Alerts for everything except \"live\"\n- \"!live, all\" -\u003e Alerts for everything, even \"live\"\n\u003chr\u003e\u003cbr\u003e\n\n\n\n## Special Formatting\nSometimes we want more customization beyond what a normal string can offer. For this reason, we've created a special formatting system for certain fields.\n\u003cbr\u003e\u003cbr\u003e\n\n__Here's how it works:__\n\nEvery statement in curly braces will be evaluated by the formatter. The formatter understands Python and expects a string to be returned by whatever is contained in the braces.\n\u003cbr\u003e\u003cbr\u003e\n\nThere are a few local variables we can use as well:\n| Variable | Datatype | Description |\n| - | - | - |\n| time | struct_time | Evaluates to time.localtime() |\n| name | str | The username of the streamer |\n| title | str | The streamer's current stream title |\n| game | str | The streamer's current game category |\n| message | str | The [alert type](#alert-types) of the message |\n| discord_id | str | The user-specified Discord ID for the message |\n\u003cbr\u003e\n\nDue to the way Python interprets strings, we may need alternate ways to specify escape characters. Below are the currently available alternatives:\n| Variable | Datatype | Description |\n| - | - | - |\n| nl | str | newline |\n| tb | str | tab |\n| dq | str | double quote |\n| sq | str | single quote |\n\u003cbr\u003e\n\n__Examples:__\n\nBasic Example:\n```\n\"Message Text\" : {\n\t\"ban\" : \"{name} Was Just Banned\",\n\t\"unban\" : \"{name} Was Just Unbanned\",\n\t\"live\" : \"{name} Just Went Live\",\n\t\"offline\" : \"{name} Just Went Offline\",\n\t\"title\" : \"{name} Changed Their Title to \\\"{title}\\\"\",\n\t\"game\" : \"{name} Changed Their Game to \\\"{game}\\\"\"\n}\n```\n\u003cbr\u003e\n\nString Formatting Example:\n```\n\"Bot Username\" : \"{name.capitalize()} - {message.capitalize()}\"\n```\n\u003cbr\u003e\n\nIf/Else Statement Example:\n```\n\"Message Text\" : {\n\t\"bans\" : \"{name} Was Just {'Ban' if message=='ban' else 'Unban'}ned\"\n}\n```\n\u003cbr\u003e\u003chr\u003e\n\n## __Making Your Own Plugins__\n\n### Get your notifications \u003cem\u003eyour\u003c/em\u003e way! Here's how to make a custom plugin\n\u003cbr\u003e\n\n### Step 1: Getting Started\n- Start by creating a python file containing a class with the name of your plugin\n- You may want to store your plugin in the 'Plugins' folder for convenience\n- There is an example file called 'Template.py' in the 'Plugins' folder\n\u003cbr\u003e\n\n### Step 2: Help the program find your plugin\n- In Main.py, import your module\n- Add your plugin to the list of enabled plugins (Config.enabled_modules in Main.py)\n\u003cbr\u003e\n\n### Step 3: Interfacing With the Program\n- If you add your plugin's settings to config.json, you should to add a member variable called 'SETTINGS_KEY' to your module to mark the field\n- There are four special functions that the main program will automatically try to use to interact with your plugin:\n\t1. validate()\n\t\t- This function is called before module initialization\n\t\t- Used to check that the settings for your module have been correctly specified\n\t\t- Optionally, you can return a list of 'warning' strings if you find any non-fatal issues\n\t\t- Validate.py contains some helpful functions for validation\n\t2. init(streamer_dict: dict)\n\t\t- This function is used to initialize your module\n\t\t- The full dictionary of streamer information is always passed to this function\n\t\t- Read Streamer.py to see what information comes with the streamer dictionary\n\t3. alert(streamer_obj: dict, message: str)\n\t\t- Called every time an alert is triggered for a streamer\n\t\t- A streamer's dictionary entry and the [type of alert](#alert-types) are always passed to this function\n\t4. terminate()\n\t\t- A 'destructor' for your plugin\n\t\t- Called immediately before the program exits\n\t\t- All exceptions that occur inside this function will be ignored\n- You aren't limited to just these functions, but they're there to make your life easier\n- These functions can be defined as either synchronous or asynchronous\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fhslarson%2Ffaster-twitch-alerts","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fhslarson%2Ffaster-twitch-alerts","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fhslarson%2Ffaster-twitch-alerts/lists"}