diff --git a/base-config.yaml b/base-config.yaml index e8b8b24..b7631ed 100644 --- a/base-config.yaml +++ b/base-config.yaml @@ -2,36 +2,32 @@ # DO NOT CHANGE THIS UNLESS YOU KNOW WHAT YOU ARE DOING command_prefix: report -# Which regions the bot should pay attention to. -# Pass through empty list to allow all senders for a region. -# Add a list of MatrixIDs to whitelist senders for a region. -# Use __global__ to refer to all regions. -# Code looks to see if a sender is allowed for either a specific region or __global__. -allowed_regions: +# Whether or not the bot should pay attention to only specific state/territory designators +# This bot will include the designator in the pushed notificaion if this is disabled, +# or if the allowed_locations contains multiple strings +allowed_locations_enabled: false +allowed_locations: + - arizona + - california + +# Which accounts should be paid attention to on a state/territory-by-state/territory basis. +# If the state/territory is not in allowed_senders, then the bot will allow all senders +# Otherwise only listed senders +allowed_senders: foo: - "@reports:fiftyfiftyonerarizona.org" bar: - "@reports:example.org" - "@reports:example.com" - buzz: - aaa: -# Bot-specific configurations per region -# Code will assume no authentication if either username or password are missing. -# Use __global__ to specify an endpoint for all regions. -# Code will push to both __global__ and region-specific endpoint. -region_configs: - arizona: - # Where and how the plugin will send the data to - server_url: "https://ntfy.sh" - server_topic: "changeme" +# Where and how the plugin will send the data to +server_url: "https://ntfy.sh" +server_topic: "changeMe" - # If the plugin should use a username and password to send notifications - username: "no" - password: "way" +# If the plugin should use a username and password to send notifications +server_use_authentication: false +server_username: "foo" +server_password: "bar" -# If this bot should send a reaction to the message -# Will send 👍 on successful POST to NTFY, and 👎 on failiure. -# Failiure to post to either the region specific, or __global__ endpoint is -# considered complete failiure. +# If this bot should send a reaction to the message if the notification was successful send_reaction: true \ No newline at end of file diff --git a/compile.bash b/compile.bash deleted file mode 100644 index 66c85a3..0000000 --- a/compile.bash +++ /dev/null @@ -1,9 +0,0 @@ -#!/bin/bash - -# Get filename -id=$(cat maubot.yaml | grep "id:" | tr ' ' '\n' | tail -n1) -version=$(cat maubot.yaml | grep "version:" | tr ' ' '\n' | tail -n1) -filename="$id-$version.mbp" - -# Compress to zip -zip $filename * \ No newline at end of file diff --git a/consumerntfy.py b/consumerntfy.py index 5bce54e..964fbcc 100644 --- a/consumerntfy.py +++ b/consumerntfy.py @@ -11,8 +11,15 @@ import aiohttp class Config(BaseProxyConfig): def do_update(self, helper: ConfigUpdateHelper) -> None: helper.copy("command_prefix") - helper.copy("allowed_regions") - helper.copy("region_configs") + helper.copy("allowed_locations_enabled") + helper.copy("allowed_locations") + helper.copy("allowed_senders") + helper.copy("server_url") + helper.copy("server_topic") + helper.copy("command_prefix") + helper.copy("server_use_authentication") + helper.copy("server_username") + helper.copy("server_password") helper.copy("send_reaction") class ConsumerNTFY(Plugin): @@ -29,83 +36,45 @@ class ConsumerNTFY(Plugin): def get_command_name(self) -> str: return self.config["command_prefix"] - # Checks if a sender if allowed to send for a particular region - def validate_sender(self, region: str, sender: str): - # Mautrix isn't documented, like at all, so I'm just gonna catch the - # error because IDK how to see if a map is inside a map. - try: allowed_list = self.config["allowed_regions"][region] - except: return False - - if allowed_list is None: return True # Empty list - if sender in allowed_list: return True - - # Sender not allowed in region config - return False - - # Does the necessary config checks for the given event - # Returns list of recursive configs to process - def validate_report(self, evt: MessageEvent, message: str): - # Split command (minus !command_name) into tokens - tokens = message.split() - region = tokens[0].lower() - - # Each command must have a state/territory designation and a message - if len(tokens) < 2: return [] - # And we must have self.config["region_configs"] - try: trashvariable = self.config["region_configs"] - except: return [] - - configs = [] # To be returned - - allowed_globally = self.validate_sender("__global__", evt.sender) - allowed_region = self.validate_sender(region, evt.sender) - - # If user is allowed globally and/or for a region, - # the plugin should process both the region and __global__ configs - if allowed_globally or allowed_region: - for i in ["__global__", region]: - try: configs.append(self.config["region_configs"][i]) - except: trashvariable = None - - return configs - # What gets called when !command_name message is sent @command.new(name=get_command_name, help="Report Something") @command.argument("message", pass_raw=True) async def report(self, evt: MessageEvent, message: str) -> None: - # If all have passed - ntfy_posts_passed = None + # Split command (minus !command_name) into tokens + tokens = message.split() + + # Each command must have a state/territory designation and a message + if len(tokens) < 2: return + + # Check locations whitelist + if self.config["allowed_locations_enabled"]: + if not tokens[0].lower() in self.config["allowed_locations"]: + return + + # Check allowed senders + allowed_senders = self.config["allowed_senders." + tokens[0]] + if allowed_senders and not evt.sender in allowed_senders: + return + + # Sending notification to NTFY + + url = self.config["server_url"] + "/" + self.config["server_topic"] + body = ' '.join(tokens[1:]) + if len(self.config["allowed_locations"]) > 1: + body = tokens[0] + ": " + body + + # Consider authentication + authentication = None + if self.config["server_use_authentication"]: + authentication = aiohttp.BasicAuth(self.config["server_username"], self.config["server_password"]) + + # Send notification + for trash in range(3): # Try to send 3 times + async with self.http.post(url, data=body, auth=authentication) as response: + if response.status == 200: + await evt.react("👍") + return - # Iterate through each endpoint that the message should be pushed to - # (if any) - for region_config in self.validate_report(evt, message): - # Detect no regions in reaction - if ntfy_posts_passed is None: ntfy_posts_passed = True - - self.log.debug(region_config) - - # Create notification text - split_message = message.split() - text = "[" + split_message[0] + "] " + ' '.join(message.split()[1:]) - - # Build URL - url = region_config["server_url"] + "/" + region_config["server_topic"] - - # Consider authentication - auth = None - if "username" in region_config and "password" in region_config: - auth = aiohttp.BasicAuth(region_config["username"], region_config["password"]) - - # Send notification - async with self.http.post(url, data=text, auth=auth) as response: - if not response.status == 200: - ntfy_posts_passed = False - # Send reaction based on successful or failedPOSTs - if self.config["send_reaction"]: - if ntfy_posts_passed is True: - await evt.react("👍") - elif ntfy_posts_passed is False: - await evt.react("👎") # That's all, folks \ No newline at end of file diff --git a/maubot.yaml b/maubot.yaml index d040b22..daf2dfb 100644 --- a/maubot.yaml +++ b/maubot.yaml @@ -1,6 +1,6 @@ maubot: 0.1.0 id: org.fiftyfiftyonearizona.reports.consumerntfy -version: 1.2.0 +version: 1.0.0 license: MIT modules: - consumerntfy diff --git a/readme.md b/readme.md index 5b3d88d..48b4eed 100644 --- a/readme.md +++ b/readme.md @@ -2,12 +2,4 @@ Please see https://git.fiftyfiftyonearizona.org/webmaster/matrix-report-documentation -This plugin supports the following: - -* whitelisting regions, or allowing all regions. -* allowed senders per region, or all regions. -* reaction receipt upon successful POST to NTFY. -* authenticated NTFY POSTing. -* Different NTFY endpoint, topic, and authentication per region. - -Please see [base-config.yaml](base-config.yaml) for explanation of behavior. \ No newline at end of file +This plugin supports whitelisting state/territory designators, allowed senders, and authenticated NTFY posting. \ No newline at end of file