diff --git a/packaged_helloworld/packaged_helloworld/packaged_helloworld.py b/packaged_helloworld/packaged_helloworld/packaged_helloworld.py index 1b2e0f94b..8a5c110ab 100644 --- a/packaged_helloworld/packaged_helloworld/packaged_helloworld.py +++ b/packaged_helloworld/packaged_helloworld/packaged_helloworld.py @@ -2,7 +2,7 @@ from typing import Any, Dict import packaged_helloworld -from zulip_bots.lib import BotHandler +from zulip_bots.lib import AbstractBotHandler __version__ = packaged_helloworld.__version__ @@ -17,7 +17,7 @@ def usage(self) -> str: sophisticated, bots that can be installed separately. """ - def handle_message(self, message: Dict[str, Any], bot_handler: BotHandler) -> None: + def handle_message(self, message: Dict[str, Any], bot_handler: AbstractBotHandler) -> None: content = "beep boop" bot_handler.send_reply(message, content) diff --git a/zulip_bots/zulip_bots/bots/baremetrics/baremetrics.py b/zulip_bots/zulip_bots/bots/baremetrics/baremetrics.py index 13aa067a0..3b37fa454 100644 --- a/zulip_bots/zulip_bots/bots/baremetrics/baremetrics.py +++ b/zulip_bots/zulip_bots/bots/baremetrics/baremetrics.py @@ -4,11 +4,11 @@ import requests -from zulip_bots.lib import BotHandler +from zulip_bots.lib import AbstractBotHandler class BaremetricsHandler: - def initialize(self, bot_handler: BotHandler) -> None: + def initialize(self, bot_handler: AbstractBotHandler) -> None: self.config_info = bot_handler.get_config_info("baremetrics") self.api_key = self.config_info["api_key"] @@ -38,7 +38,7 @@ def initialize(self, bot_handler: BotHandler) -> None: self.check_api_key(bot_handler) - def check_api_key(self, bot_handler: BotHandler) -> None: + def check_api_key(self, bot_handler: AbstractBotHandler) -> None: url = "https://api.baremetrics.com/v1/account" test_query_response = requests.get(url, headers=self.auth_header) test_query_data = test_query_response.json() @@ -57,7 +57,7 @@ def usage(self) -> str: Version 1.0 """ - def handle_message(self, message: Dict[str, Any], bot_handler: BotHandler) -> None: + def handle_message(self, message: Dict[str, Any], bot_handler: AbstractBotHandler) -> None: content = message["content"].strip().split() if content == []: diff --git a/zulip_bots/zulip_bots/bots/beeminder/beeminder.py b/zulip_bots/zulip_bots/bots/beeminder/beeminder.py index cda09ce78..ddaf8d500 100644 --- a/zulip_bots/zulip_bots/bots/beeminder/beeminder.py +++ b/zulip_bots/zulip_bots/bots/beeminder/beeminder.py @@ -4,7 +4,7 @@ import requests from requests.exceptions import ConnectionError -from zulip_bots.lib import BotHandler +from zulip_bots.lib import AbstractBotHandler help_message = """ You can add datapoints towards your beeminder goals \ @@ -80,7 +80,7 @@ class BeeminderHandler: towards their beeminder goals via zulip """ - def initialize(self, bot_handler: BotHandler) -> None: + def initialize(self, bot_handler: AbstractBotHandler) -> None: self.config_info = bot_handler.get_config_info("beeminder") # Check for valid auth_token auth_token = self.config_info["auth_token"] @@ -96,7 +96,7 @@ def initialize(self, bot_handler: BotHandler) -> None: def usage(self) -> str: return "This plugin allows users to add datapoints towards their Beeminder goals" - def handle_message(self, message: Dict[str, str], bot_handler: BotHandler) -> None: + def handle_message(self, message: Dict[str, str], bot_handler: AbstractBotHandler) -> None: response = get_beeminder_response(message["content"], self.config_info) bot_handler.send_reply(message, response) diff --git a/zulip_bots/zulip_bots/bots/chessbot/chessbot.py b/zulip_bots/zulip_bots/bots/chessbot/chessbot.py index f1970d98f..dca395801 100644 --- a/zulip_bots/zulip_bots/bots/chessbot/chessbot.py +++ b/zulip_bots/zulip_bots/bots/chessbot/chessbot.py @@ -5,7 +5,7 @@ import chess import chess.engine -from zulip_bots.lib import BotHandler +from zulip_bots.lib import AbstractBotHandler START_REGEX = re.compile("start with other user$") START_COMPUTER_REGEX = re.compile("start as (?Pwhite|black) with computer") @@ -24,7 +24,7 @@ def usage(self) -> str: "Stockfish program on this computer." ) - def initialize(self, bot_handler: BotHandler) -> None: + def initialize(self, bot_handler: AbstractBotHandler) -> None: self.config_info = bot_handler.get_config_info("chess") try: @@ -36,7 +36,7 @@ def initialize(self, bot_handler: BotHandler) -> None: # runner is testing or knows they won't be using an engine. print("That Stockfish doesn't exist. Continuing.") - def handle_message(self, message: Dict[str, str], bot_handler: BotHandler) -> None: + def handle_message(self, message: Dict[str, str], bot_handler: AbstractBotHandler) -> None: content = message["content"] if content == "": @@ -76,7 +76,7 @@ def handle_message(self, message: Dict[str, str], bot_handler: BotHandler) -> No elif resign_regex_match: self.resign(message, bot_handler, last_fen) - def start(self, message: Dict[str, str], bot_handler: BotHandler) -> None: + def start(self, message: Dict[str, str], bot_handler: AbstractBotHandler) -> None: """Starts a game with another user, with the current user as white. Replies to the bot handler. @@ -93,7 +93,7 @@ def start(self, message: Dict[str, str], bot_handler: BotHandler) -> None: bot_handler.storage.put("last_fen", new_board.fen()) def start_computer( - self, message: Dict[str, str], bot_handler: BotHandler, is_white_user: bool + self, message: Dict[str, str], bot_handler: AbstractBotHandler, is_white_user: bool ) -> None: """Starts a game with the computer. Replies to the bot handler. @@ -123,7 +123,7 @@ def start_computer( ) def validate_board( - self, message: Dict[str, str], bot_handler: BotHandler, fen: str + self, message: Dict[str, str], bot_handler: AbstractBotHandler, fen: str ) -> Optional[chess.Board]: """Validates a board based on its FEN string. Replies to the bot handler if there is an error with the board. @@ -147,7 +147,7 @@ def validate_board( def validate_move( self, message: Dict[str, str], - bot_handler: BotHandler, + bot_handler: AbstractBotHandler, last_board: chess.Board, move_san: str, is_computer: object, @@ -180,7 +180,7 @@ def validate_move( return move def check_game_over( - self, message: Dict[str, str], bot_handler: BotHandler, new_board: chess.Board + self, message: Dict[str, str], bot_handler: AbstractBotHandler, new_board: chess.Board ) -> bool: """Checks if a game is over due to - checkmate, @@ -224,7 +224,7 @@ def check_game_over( return False def move( - self, message: Dict[str, str], bot_handler: BotHandler, last_fen: str, move_san: str + self, message: Dict[str, str], bot_handler: AbstractBotHandler, last_fen: str, move_san: str ) -> None: """Makes a move for a user in a game with another user. Replies to the bot handler. @@ -256,7 +256,7 @@ def move( bot_handler.storage.put("last_fen", new_board.fen()) def move_computer( - self, message: Dict[str, str], bot_handler: BotHandler, last_fen: str, move_san: str + self, message: Dict[str, str], bot_handler: AbstractBotHandler, last_fen: str, move_san: str ) -> None: """Preforms a move for a user in a game with the computer and then makes the computer's move. Replies to the bot handler. Unlike `move`, @@ -306,7 +306,7 @@ def move_computer( bot_handler.storage.put("last_fen", new_board_after_computer_move.fen()) def move_computer_first( - self, message: Dict[str, str], bot_handler: BotHandler, last_fen: str + self, message: Dict[str, str], bot_handler: AbstractBotHandler, last_fen: str ) -> None: """Preforms a move for the computer without having the user go first in a game with the computer. Replies to the bot handler. Like @@ -345,7 +345,9 @@ def move_computer_first( # `bot_handler`'s `storage` only accepts `str` values. bot_handler.storage.put("is_with_computer", str(True)) - def resign(self, message: Dict[str, str], bot_handler: BotHandler, last_fen: str) -> None: + def resign( + self, message: Dict[str, str], bot_handler: AbstractBotHandler, last_fen: str + ) -> None: """Resigns the game for the current player. Parameters: diff --git a/zulip_bots/zulip_bots/bots/converter/converter.py b/zulip_bots/zulip_bots/bots/converter/converter.py index 56cb392aa..5bb47e6f8 100644 --- a/zulip_bots/zulip_bots/bots/converter/converter.py +++ b/zulip_bots/zulip_bots/bots/converter/converter.py @@ -5,7 +5,7 @@ from typing import Any, Dict, List from zulip_bots.bots.converter import utils -from zulip_bots.lib import BotHandler +from zulip_bots.lib import AbstractBotHandler def is_float(value: Any) -> bool: @@ -49,12 +49,12 @@ def usage(self) -> str: all supported units. """ - def handle_message(self, message: Dict[str, str], bot_handler: BotHandler) -> None: + def handle_message(self, message: Dict[str, str], bot_handler: AbstractBotHandler) -> None: bot_response = get_bot_converter_response(message, bot_handler) bot_handler.send_reply(message, bot_response) -def get_bot_converter_response(message: Dict[str, str], bot_handler: BotHandler) -> str: +def get_bot_converter_response(message: Dict[str, str], bot_handler: AbstractBotHandler) -> str: content = message["content"] words = content.lower().split() diff --git a/zulip_bots/zulip_bots/bots/define/define.py b/zulip_bots/zulip_bots/bots/define/define.py index 073afb2e1..2d9a4d9be 100644 --- a/zulip_bots/zulip_bots/bots/define/define.py +++ b/zulip_bots/zulip_bots/bots/define/define.py @@ -6,7 +6,7 @@ import html2text import requests -from zulip_bots.lib import BotHandler +from zulip_bots.lib import AbstractBotHandler class DefineHandler: @@ -27,7 +27,7 @@ def usage(self) -> str: messages with @mention-bot. """ - def handle_message(self, message: Dict[str, str], bot_handler: BotHandler) -> None: + def handle_message(self, message: Dict[str, str], bot_handler: AbstractBotHandler) -> None: original_content = message["content"].strip() bot_response = self.get_bot_define_response(original_content) diff --git a/zulip_bots/zulip_bots/bots/dialogflow/dialogflow.py b/zulip_bots/zulip_bots/bots/dialogflow/dialogflow.py index 5ec07afca..298d3c7d9 100644 --- a/zulip_bots/zulip_bots/bots/dialogflow/dialogflow.py +++ b/zulip_bots/zulip_bots/bots/dialogflow/dialogflow.py @@ -5,7 +5,7 @@ import apiai -from zulip_bots.lib import BotHandler +from zulip_bots.lib import AbstractBotHandler help_message = """DialogFlow bot This bot will interact with dialogflow bots. @@ -47,7 +47,7 @@ class DialogFlowHandler: DialogFlow bots to zulip """ - def initialize(self, bot_handler: BotHandler) -> None: + def initialize(self, bot_handler: AbstractBotHandler) -> None: self.config_info = bot_handler.get_config_info("dialogflow") def usage(self) -> str: @@ -56,7 +56,7 @@ def usage(self) -> str: DialogFlow bots to zulip """ - def handle_message(self, message: Dict[str, str], bot_handler: BotHandler) -> None: + def handle_message(self, message: Dict[str, str], bot_handler: AbstractBotHandler) -> None: result = get_bot_result(message["content"], self.config_info, message["sender_id"]) bot_handler.send_reply(message, result) diff --git a/zulip_bots/zulip_bots/bots/dropbox_share/dropbox_share.py b/zulip_bots/zulip_bots/bots/dropbox_share/dropbox_share.py index 3088fb77b..bd4279e69 100644 --- a/zulip_bots/zulip_bots/bots/dropbox_share/dropbox_share.py +++ b/zulip_bots/zulip_bots/bots/dropbox_share/dropbox_share.py @@ -3,7 +3,7 @@ from dropbox import Dropbox -from zulip_bots.lib import BotHandler +from zulip_bots.lib import AbstractBotHandler URL = "[{name}](https://www.dropbox.com/home{path})" @@ -14,7 +14,7 @@ class DropboxHandler: between zulip and your dropbox account. """ - def initialize(self, bot_handler: BotHandler) -> None: + def initialize(self, bot_handler: AbstractBotHandler) -> None: self.config_info = bot_handler.get_config_info("dropbox_share") self.ACCESS_TOKEN = self.config_info.get("access_token") self.client = Dropbox(self.ACCESS_TOKEN) @@ -22,7 +22,7 @@ def initialize(self, bot_handler: BotHandler) -> None: def usage(self) -> str: return get_help() - def handle_message(self, message: Dict[str, str], bot_handler: BotHandler) -> None: + def handle_message(self, message: Dict[str, str], bot_handler: AbstractBotHandler) -> None: command = message["content"] if command == "": command = "help" diff --git a/zulip_bots/zulip_bots/bots/encrypt/encrypt.py b/zulip_bots/zulip_bots/bots/encrypt/encrypt.py index 9d08a0440..08c732966 100644 --- a/zulip_bots/zulip_bots/bots/encrypt/encrypt.py +++ b/zulip_bots/zulip_bots/bots/encrypt/encrypt.py @@ -1,6 +1,6 @@ from typing import Dict -from zulip_bots.lib import BotHandler +from zulip_bots.lib import AbstractBotHandler def encrypt(text: str) -> str: @@ -34,7 +34,7 @@ def usage(self) -> str: Feeding encrypted messages into the bot decrypts them. """ - def handle_message(self, message: Dict[str, str], bot_handler: BotHandler) -> None: + def handle_message(self, message: Dict[str, str], bot_handler: AbstractBotHandler) -> None: bot_response = self.get_bot_encrypt_response(message) bot_handler.send_reply(message, bot_response) diff --git a/zulip_bots/zulip_bots/bots/file_uploader/file_uploader.py b/zulip_bots/zulip_bots/bots/file_uploader/file_uploader.py index 5be5de614..c49698229 100644 --- a/zulip_bots/zulip_bots/bots/file_uploader/file_uploader.py +++ b/zulip_bots/zulip_bots/bots/file_uploader/file_uploader.py @@ -2,7 +2,7 @@ from pathlib import Path from typing import Dict -from zulip_bots.lib import BotHandler +from zulip_bots.lib import AbstractBotHandler class FileUploaderHandler: @@ -13,7 +13,7 @@ def usage(self) -> str: "\n- @uploader help : Display help message" ) - def handle_message(self, message: Dict[str, str], bot_handler: BotHandler) -> None: + def handle_message(self, message: Dict[str, str], bot_handler: AbstractBotHandler) -> None: help_str = ( "Use this bot with any of the following commands:" "\n* `@uploader ` : Upload a file, where `` is the path to the file" diff --git a/zulip_bots/zulip_bots/bots/flock/flock.py b/zulip_bots/zulip_bots/bots/flock/flock.py index 0acb5f1a4..f833a7787 100644 --- a/zulip_bots/zulip_bots/bots/flock/flock.py +++ b/zulip_bots/zulip_bots/bots/flock/flock.py @@ -4,7 +4,7 @@ import requests from requests.exceptions import ConnectionError -from zulip_bots.lib import BotHandler +from zulip_bots.lib import AbstractBotHandler USERS_LIST_URL = "https://api.flock.co/v1/roster.listContacts" SEND_MESSAGE_URL = "https://api.flock.co/v1/chat.sendMessage" @@ -97,14 +97,14 @@ class FlockHandler: flock user without having to leave Zulip. """ - def initialize(self, bot_handler: BotHandler) -> None: + def initialize(self, bot_handler: AbstractBotHandler) -> None: self.config_info = bot_handler.get_config_info("flock") def usage(self) -> str: return """Hello from Flock Bot. You can send messages to any Flock user right from Zulip.""" - def handle_message(self, message: Dict[str, str], bot_handler: BotHandler) -> None: + def handle_message(self, message: Dict[str, str], bot_handler: AbstractBotHandler) -> None: response = get_flock_bot_response(message["content"], self.config_info) bot_handler.send_reply(message, response) diff --git a/zulip_bots/zulip_bots/bots/followup/followup.py b/zulip_bots/zulip_bots/bots/followup/followup.py index 47c3c54f3..39181c579 100644 --- a/zulip_bots/zulip_bots/bots/followup/followup.py +++ b/zulip_bots/zulip_bots/bots/followup/followup.py @@ -1,7 +1,7 @@ # See readme.md for instructions on running this code. from typing import Dict -from zulip_bots.lib import BotHandler +from zulip_bots.lib import AbstractBotHandler class FollowupHandler: @@ -26,11 +26,11 @@ def usage(self) -> str: called "followup" that your API user can send to. """ - def initialize(self, bot_handler: BotHandler) -> None: + def initialize(self, bot_handler: AbstractBotHandler) -> None: self.config_info = bot_handler.get_config_info("followup", optional=False) self.stream = self.config_info.get("stream", "followup") - def handle_message(self, message: Dict[str, str], bot_handler: BotHandler) -> None: + def handle_message(self, message: Dict[str, str], bot_handler: AbstractBotHandler) -> None: if message["content"] == "": bot_response = ( "Please specify the message you want to send to followup stream after @mention-bot" diff --git a/zulip_bots/zulip_bots/bots/front/front.py b/zulip_bots/zulip_bots/bots/front/front.py index 297f59e45..f331009a2 100644 --- a/zulip_bots/zulip_bots/bots/front/front.py +++ b/zulip_bots/zulip_bots/bots/front/front.py @@ -3,7 +3,7 @@ import requests -from zulip_bots.lib import BotHandler +from zulip_bots.lib import AbstractBotHandler class FrontHandler: @@ -24,7 +24,7 @@ def usage(self) -> str: Front Bot, `front.conf` must be set up. See `doc.md` for more details. """ - def initialize(self, bot_handler: BotHandler) -> None: + def initialize(self, bot_handler: AbstractBotHandler) -> None: config = bot_handler.get_config_info("front") api_key = config.get("api_key") if not api_key: @@ -32,14 +32,14 @@ def initialize(self, bot_handler: BotHandler) -> None: self.auth = "Bearer " + api_key - def help(self, bot_handler: BotHandler) -> str: + def help(self, bot_handler: AbstractBotHandler) -> str: response = "" for command, description in self.COMMANDS: response += f"`{command}` {description}\n" return response - def archive(self, bot_handler: BotHandler) -> str: + def archive(self, bot_handler: AbstractBotHandler) -> str: response = requests.patch( self.FRONT_API.format(self.conversation_id), headers={"Authorization": self.auth}, @@ -51,7 +51,7 @@ def archive(self, bot_handler: BotHandler) -> str: return "Conversation was archived." - def delete(self, bot_handler: BotHandler) -> str: + def delete(self, bot_handler: AbstractBotHandler) -> str: response = requests.patch( self.FRONT_API.format(self.conversation_id), headers={"Authorization": self.auth}, @@ -63,7 +63,7 @@ def delete(self, bot_handler: BotHandler) -> str: return "Conversation was deleted." - def spam(self, bot_handler: BotHandler) -> str: + def spam(self, bot_handler: AbstractBotHandler) -> str: response = requests.patch( self.FRONT_API.format(self.conversation_id), headers={"Authorization": self.auth}, @@ -75,7 +75,7 @@ def spam(self, bot_handler: BotHandler) -> str: return "Conversation was marked as spam." - def restore(self, bot_handler: BotHandler) -> str: + def restore(self, bot_handler: AbstractBotHandler) -> str: response = requests.patch( self.FRONT_API.format(self.conversation_id), headers={"Authorization": self.auth}, @@ -87,7 +87,7 @@ def restore(self, bot_handler: BotHandler) -> str: return "Conversation was restored." - def comment(self, bot_handler: BotHandler, **kwargs: Any) -> str: + def comment(self, bot_handler: AbstractBotHandler, **kwargs: Any) -> str: response = requests.post( self.FRONT_API.format(self.conversation_id) + "/comments", headers={"Authorization": self.auth}, @@ -99,7 +99,7 @@ def comment(self, bot_handler: BotHandler, **kwargs: Any) -> str: return "Comment was sent." - def handle_message(self, message: Dict[str, str], bot_handler: BotHandler) -> None: + def handle_message(self, message: Dict[str, str], bot_handler: AbstractBotHandler) -> None: command = message["content"] result = re.search(self.CNV_ID_REGEXP, message["subject"]) diff --git a/zulip_bots/zulip_bots/bots/giphy/giphy.py b/zulip_bots/zulip_bots/bots/giphy/giphy.py index 5b972f080..19ce9459d 100644 --- a/zulip_bots/zulip_bots/bots/giphy/giphy.py +++ b/zulip_bots/zulip_bots/bots/giphy/giphy.py @@ -5,7 +5,7 @@ from requests.exceptions import ConnectionError, HTTPError from zulip_bots.custom_exceptions import ConfigValidationError -from zulip_bots.lib import BotHandler +from zulip_bots.lib import AbstractBotHandler GIPHY_TRANSLATE_API = "http://api.giphy.com/v1/gifs/translate" GIPHY_RANDOM_API = "http://api.giphy.com/v1/gifs/random" @@ -44,10 +44,10 @@ def validate_config(config_info: Dict[str, str]) -> None: ) raise ConfigValidationError(error_message) from e - def initialize(self, bot_handler: BotHandler) -> None: + def initialize(self, bot_handler: AbstractBotHandler) -> None: self.config_info = bot_handler.get_config_info("giphy") - def handle_message(self, message: Dict[str, str], bot_handler: BotHandler) -> None: + def handle_message(self, message: Dict[str, str], bot_handler: AbstractBotHandler) -> None: bot_response = get_bot_giphy_response(message, bot_handler, self.config_info) bot_handler.send_reply(message, bot_response) @@ -82,7 +82,7 @@ def get_url_gif_giphy(keyword: str, api_key: str) -> Union[int, str]: def get_bot_giphy_response( - message: Dict[str, str], bot_handler: BotHandler, config_info: Dict[str, str] + message: Dict[str, str], bot_handler: AbstractBotHandler, config_info: Dict[str, str] ) -> str: # Each exception has a specific reply should "gif_url" return a number. # The bot will post the appropriate message for the error. diff --git a/zulip_bots/zulip_bots/bots/github_detail/github_detail.py b/zulip_bots/zulip_bots/bots/github_detail/github_detail.py index 865756ac2..a740efc1d 100644 --- a/zulip_bots/zulip_bots/bots/github_detail/github_detail.py +++ b/zulip_bots/zulip_bots/bots/github_detail/github_detail.py @@ -4,7 +4,7 @@ import requests -from zulip_bots.lib import BotHandler +from zulip_bots.lib import AbstractBotHandler class GithubHandler: @@ -16,7 +16,7 @@ class GithubHandler: GITHUB_ISSUE_URL_TEMPLATE = "https://api.github.com/repos/{owner}/{repo}/issues/{id}" HANDLE_MESSAGE_REGEX = re.compile(r"(?:([\w-]+)\/)?([\w-]+)?#(\d+)") - def initialize(self, bot_handler: BotHandler) -> None: + def initialize(self, bot_handler: AbstractBotHandler) -> None: self.config_info = bot_handler.get_config_info("github_detail", optional=True) self.owner = self.config_info.get("owner", False) self.repo = self.config_info.get("repo", False) @@ -73,7 +73,7 @@ def get_owner_and_repo(self, issue_pr: Any) -> Tuple[str, str]: repo = self.repo return (owner, repo) - def handle_message(self, message: Dict[str, str], bot_handler: BotHandler) -> None: + def handle_message(self, message: Dict[str, str], bot_handler: AbstractBotHandler) -> None: # Send help message if message["content"] == "help": bot_handler.send_reply(message, self.usage()) diff --git a/zulip_bots/zulip_bots/bots/google_search/google_search.py b/zulip_bots/zulip_bots/bots/google_search/google_search.py index 579e96c6d..e1fb5083a 100644 --- a/zulip_bots/zulip_bots/bots/google_search/google_search.py +++ b/zulip_bots/zulip_bots/bots/google_search/google_search.py @@ -5,7 +5,7 @@ import requests from bs4 import BeautifulSoup, Tag -from zulip_bots.lib import BotHandler +from zulip_bots.lib import AbstractBotHandler def google_search(keywords: str) -> List[Dict[str, str]]: @@ -83,7 +83,7 @@ def usage(self) -> str: @mentioned-bot. """ - def handle_message(self, message: Dict[str, str], bot_handler: BotHandler) -> None: + def handle_message(self, message: Dict[str, str], bot_handler: AbstractBotHandler) -> None: original_content = message["content"] result = get_google_result(original_content) bot_handler.send_reply(message, result) diff --git a/zulip_bots/zulip_bots/bots/helloworld/helloworld.py b/zulip_bots/zulip_bots/bots/helloworld/helloworld.py index 5fddc091c..2e7f6c630 100644 --- a/zulip_bots/zulip_bots/bots/helloworld/helloworld.py +++ b/zulip_bots/zulip_bots/bots/helloworld/helloworld.py @@ -2,7 +2,7 @@ from typing import Any, Dict -from zulip_bots.lib import BotHandler +from zulip_bots.lib import AbstractBotHandler class HelloWorldHandler: @@ -15,7 +15,7 @@ def usage(self) -> str: sophisticated, bots. """ - def handle_message(self, message: Dict[str, Any], bot_handler: BotHandler) -> None: + def handle_message(self, message: Dict[str, Any], bot_handler: AbstractBotHandler) -> None: content = "beep boop" bot_handler.send_reply(message, content) diff --git a/zulip_bots/zulip_bots/bots/help/help.py b/zulip_bots/zulip_bots/bots/help/help.py index 1d95112f9..860f3e098 100644 --- a/zulip_bots/zulip_bots/bots/help/help.py +++ b/zulip_bots/zulip_bots/bots/help/help.py @@ -1,7 +1,7 @@ # See readme.md for instructions on running this code. from typing import Dict -from zulip_bots.lib import BotHandler +from zulip_bots.lib import AbstractBotHandler class HelpHandler: @@ -15,7 +15,7 @@ def usage(self) -> str: your Zulip instance. """ - def handle_message(self, message: Dict[str, str], bot_handler: BotHandler) -> None: + def handle_message(self, message: Dict[str, str], bot_handler: AbstractBotHandler) -> None: help_content = "Info on Zulip can be found here:\nhttps://github.com/zulip/zulip" bot_handler.send_reply(message, help_content) diff --git a/zulip_bots/zulip_bots/bots/idonethis/idonethis.py b/zulip_bots/zulip_bots/bots/idonethis/idonethis.py index 8c7fec52f..64fb30f55 100644 --- a/zulip_bots/zulip_bots/bots/idonethis/idonethis.py +++ b/zulip_bots/zulip_bots/bots/idonethis/idonethis.py @@ -4,7 +4,7 @@ import requests -from zulip_bots.lib import BotHandler +from zulip_bots.lib import AbstractBotHandler API_BASE_URL = "https://beta.idonethis.com/api/v2" @@ -147,7 +147,7 @@ def create_entry(message: str) -> str: class IDoneThisHandler: - def initialize(self, bot_handler: BotHandler) -> None: + def initialize(self, bot_handler: AbstractBotHandler) -> None: global api_key, default_team # noqa: PLW0603 self.config_info = bot_handler.get_config_info("idonethis") if "api_key" in self.config_info: @@ -207,7 +207,7 @@ def usage(self) -> str: + default_team_message ) - def handle_message(self, message: Dict[str, Any], bot_handler: BotHandler) -> None: + def handle_message(self, message: Dict[str, Any], bot_handler: AbstractBotHandler) -> None: bot_handler.send_reply(message, self.get_response(message)) def get_response(self, message: Dict[str, Any]) -> str: diff --git a/zulip_bots/zulip_bots/bots/incident/incident.py b/zulip_bots/zulip_bots/bots/incident/incident.py index fd1dc07ce..60f6d7dd1 100644 --- a/zulip_bots/zulip_bots/bots/incident/incident.py +++ b/zulip_bots/zulip_bots/bots/incident/incident.py @@ -2,7 +2,7 @@ import re from typing import Any, Dict, Tuple -from zulip_bots.lib import BotHandler +from zulip_bots.lib import AbstractBotHandler QUESTION = "How should we handle this?" @@ -28,7 +28,7 @@ def usage(self) -> str: glue code here should be pretty portable. """ - def handle_message(self, message: Dict[str, Any], bot_handler: BotHandler) -> None: + def handle_message(self, message: Dict[str, Any], bot_handler: AbstractBotHandler) -> None: query = message["content"] if query.startswith("new "): start_new_incident(query, message, bot_handler) @@ -46,7 +46,9 @@ def handle_message(self, message: Dict[str, Any], bot_handler: BotHandler) -> No bot_handler.send_reply(message, bot_response) -def start_new_incident(query: str, message: Dict[str, Any], bot_handler: BotHandler) -> None: +def start_new_incident( + query: str, message: Dict[str, Any], bot_handler: AbstractBotHandler +) -> None: # Here is where we would enter the incident in some sort of backend # system. We just simulate everything by having an incident id that # we generate here. diff --git a/zulip_bots/zulip_bots/bots/incrementor/incrementor.py b/zulip_bots/zulip_bots/bots/incrementor/incrementor.py index 1c008002c..d87d47f45 100644 --- a/zulip_bots/zulip_bots/bots/incrementor/incrementor.py +++ b/zulip_bots/zulip_bots/bots/incrementor/incrementor.py @@ -2,7 +2,7 @@ from typing import Dict, Final -from zulip_bots.lib import BotHandler, use_storage +from zulip_bots.lib import AbstractBotHandler, use_storage class IncrementorHandler: @@ -19,13 +19,13 @@ def usage(self) -> str: is @-mentioned, this number will be incremented in the same message. """ - def initialize(self, bot_handler: BotHandler) -> None: + def initialize(self, bot_handler: AbstractBotHandler) -> None: storage = bot_handler.storage if not storage.contains("number") or not storage.contains("message_id"): storage.put("number", 0) storage.put("message_id", None) - def handle_message(self, message: Dict[str, str], bot_handler: BotHandler) -> None: + def handle_message(self, message: Dict[str, str], bot_handler: AbstractBotHandler) -> None: with use_storage(bot_handler.storage, ["number"]) as storage: num = storage.get("number") diff --git a/zulip_bots/zulip_bots/bots/jira/jira.py b/zulip_bots/zulip_bots/bots/jira/jira.py index 69c94d6d9..2aeb7bc9f 100644 --- a/zulip_bots/zulip_bots/bots/jira/jira.py +++ b/zulip_bots/zulip_bots/bots/jira/jira.py @@ -4,7 +4,7 @@ import requests -from zulip_bots.lib import BotHandler +from zulip_bots.lib import AbstractBotHandler GET_REGEX = re.compile('get "(?P.+)"$') CREATE_REGEX = re.compile( @@ -153,7 +153,7 @@ def usage(self) -> str: Jira Bot, `jira.conf` must be set up. See `doc.md` for more details. """ - def initialize(self, bot_handler: BotHandler) -> None: + def initialize(self, bot_handler: AbstractBotHandler) -> None: config = bot_handler.get_config_info("jira") username = config.get("username") @@ -205,7 +205,7 @@ def jql_search(self, jql_query: str) -> str: return response - def handle_message(self, message: Dict[str, str], bot_handler: BotHandler) -> None: + def handle_message(self, message: Dict[str, str], bot_handler: AbstractBotHandler) -> None: content = message.get("content") response = "" diff --git a/zulip_bots/zulip_bots/bots/link_shortener/link_shortener.py b/zulip_bots/zulip_bots/bots/link_shortener/link_shortener.py index 4c296a63c..0d9f437c6 100644 --- a/zulip_bots/zulip_bots/bots/link_shortener/link_shortener.py +++ b/zulip_bots/zulip_bots/bots/link_shortener/link_shortener.py @@ -3,7 +3,7 @@ import requests -from zulip_bots.lib import BotHandler +from zulip_bots.lib import AbstractBotHandler class LinkShortenerHandler: @@ -18,11 +18,11 @@ def usage(self) -> str: "`key` must be set in `link_shortener.conf`." ) - def initialize(self, bot_handler: BotHandler) -> None: + def initialize(self, bot_handler: AbstractBotHandler) -> None: self.config_info = bot_handler.get_config_info("link_shortener") self.check_api_key(bot_handler) - def check_api_key(self, bot_handler: BotHandler) -> None: + def check_api_key(self, bot_handler: AbstractBotHandler) -> None: test_request_data: Any = self.call_link_shorten_service("www.youtube.com/watch") try: if self.is_invalid_token_error(test_request_data): @@ -38,7 +38,7 @@ def is_invalid_token_error(self, response_json: Any) -> bool: and response_json["status_txt"] == "INVALID_ARG_ACCESS_TOKEN" ) - def handle_message(self, message: Dict[str, str], bot_handler: BotHandler) -> None: + def handle_message(self, message: Dict[str, str], bot_handler: AbstractBotHandler) -> None: regex_str = ( r"(" r"(?:http|https):\/\/" # This allows for the HTTP or HTTPS diff --git a/zulip_bots/zulip_bots/bots/mention/mention.py b/zulip_bots/zulip_bots/bots/mention/mention.py index 024510df5..01e2d18c2 100644 --- a/zulip_bots/zulip_bots/bots/mention/mention.py +++ b/zulip_bots/zulip_bots/bots/mention/mention.py @@ -4,18 +4,18 @@ import requests -from zulip_bots.lib import BotHandler +from zulip_bots.lib import AbstractBotHandler class MentionHandler: - def initialize(self, bot_handler: BotHandler) -> None: + def initialize(self, bot_handler: AbstractBotHandler) -> None: self.config_info = bot_handler.get_config_info("mention") self.access_token = self.config_info["access_token"] self.account_id = "" self.check_access_token(bot_handler) - def check_access_token(self, bot_handler: BotHandler) -> None: + def check_access_token(self, bot_handler: AbstractBotHandler) -> None: test_query_header = { "Authorization": "Bearer " + self.access_token, "Accept-Version": "1.15", @@ -43,7 +43,7 @@ def usage(self) -> str: Version 1.00 """ - def handle_message(self, message: Dict[str, Any], bot_handler: BotHandler) -> None: + def handle_message(self, message: Dict[str, Any], bot_handler: AbstractBotHandler) -> None: message["content"] = message["content"].strip() if message["content"].lower() == "help": diff --git a/zulip_bots/zulip_bots/bots/monkeytestit/monkeytestit.py b/zulip_bots/zulip_bots/bots/monkeytestit/monkeytestit.py index f5b9b499f..ded2ae75c 100644 --- a/zulip_bots/zulip_bots/bots/monkeytestit/monkeytestit.py +++ b/zulip_bots/zulip_bots/bots/monkeytestit/monkeytestit.py @@ -2,7 +2,7 @@ from typing import Dict from zulip_bots.bots.monkeytestit.lib import parse -from zulip_bots.lib import BotHandler, NoBotConfigError +from zulip_bots.lib import AbstractBotHandler, NoBotConfigError class MonkeyTestitBot: @@ -17,7 +17,7 @@ def usage(self): "Check doc.md for more options and setup instructions." ) - def initialize(self, bot_handler: BotHandler) -> None: + def initialize(self, bot_handler: AbstractBotHandler) -> None: try: self.config = bot_handler.get_config_info("monkeytestit") except NoBotConfigError: @@ -47,7 +47,7 @@ def initialize(self, bot_handler: BotHandler) -> None: " your api_key value and try again." ) - def handle_message(self, message: Dict[str, str], bot_handler: BotHandler) -> None: + def handle_message(self, message: Dict[str, str], bot_handler: AbstractBotHandler) -> None: content = message["content"] response = parse.execute(content, self.api_key) diff --git a/zulip_bots/zulip_bots/bots/salesforce/salesforce.py b/zulip_bots/zulip_bots/bots/salesforce/salesforce.py index 6d4f51c2c..149938954 100644 --- a/zulip_bots/zulip_bots/bots/salesforce/salesforce.py +++ b/zulip_bots/zulip_bots/bots/salesforce/salesforce.py @@ -10,7 +10,7 @@ from simple_salesforce.exceptions import SalesforceAuthenticationFailed from zulip_bots.bots.salesforce.utils import commands, default_query, link_query, object_types -from zulip_bots.lib import BotHandler +from zulip_bots.lib import AbstractBotHandler base_help_text = """Salesforce bot This bot can do simple salesforce query requests @@ -162,7 +162,7 @@ def get_salesforce_response(self, content: str) -> str: return "Usage: {} [arguments]".format(command["template"]) return get_help_text() - def initialize(self, bot_handler: BotHandler) -> None: + def initialize(self, bot_handler: AbstractBotHandler) -> None: self.config_info = bot_handler.get_config_info("salesforce") try: self.sf = Salesforce( @@ -173,7 +173,7 @@ def initialize(self, bot_handler: BotHandler) -> None: except SalesforceAuthenticationFailed as err: bot_handler.quit(f"Failed to log in to Salesforce. {err.code} {err.message}") - def handle_message(self, message: Dict[str, Any], bot_handler: BotHandler) -> None: + def handle_message(self, message: Dict[str, Any], bot_handler: AbstractBotHandler) -> None: try: bot_response = self.get_salesforce_response(message["content"]) bot_handler.send_reply(message, bot_response) diff --git a/zulip_bots/zulip_bots/bots/stack_overflow/stack_overflow.py b/zulip_bots/zulip_bots/bots/stack_overflow/stack_overflow.py index 4fa8e66ae..03674f1d6 100644 --- a/zulip_bots/zulip_bots/bots/stack_overflow/stack_overflow.py +++ b/zulip_bots/zulip_bots/bots/stack_overflow/stack_overflow.py @@ -3,7 +3,7 @@ import requests -from zulip_bots.lib import BotHandler +from zulip_bots.lib import AbstractBotHandler # See readme.md for instructions on running this code. @@ -31,12 +31,12 @@ def usage(self) -> str: should preface query with "@mention-bot". @mention-bot """ - def handle_message(self, message: Dict[str, str], bot_handler: BotHandler) -> None: + def handle_message(self, message: Dict[str, str], bot_handler: AbstractBotHandler) -> None: bot_response = self.get_bot_stackoverflow_response(message, bot_handler) bot_handler.send_reply(message, bot_response) def get_bot_stackoverflow_response( - self, message: Dict[str, str], bot_handler: BotHandler + self, message: Dict[str, str], bot_handler: AbstractBotHandler ) -> Optional[str]: """This function returns the URLs of the requested topic.""" diff --git a/zulip_bots/zulip_bots/bots/susi/susi.py b/zulip_bots/zulip_bots/bots/susi/susi.py index b613a6414..76f633117 100644 --- a/zulip_bots/zulip_bots/bots/susi/susi.py +++ b/zulip_bots/zulip_bots/bots/susi/susi.py @@ -2,7 +2,7 @@ import requests -from zulip_bots.lib import BotHandler +from zulip_bots.lib import AbstractBotHandler class SusiHandler: @@ -38,7 +38,7 @@ def usage(self) -> str: ``` """ - def handle_message(self, message: Dict[str, str], bot_handler: BotHandler) -> None: + def handle_message(self, message: Dict[str, str], bot_handler: AbstractBotHandler) -> None: msg = message["content"] if msg in ("help", ""): bot_handler.send_reply(message, self.usage()) diff --git a/zulip_bots/zulip_bots/bots/trello/trello.py b/zulip_bots/zulip_bots/bots/trello/trello.py index 41d9acd78..c88a26863 100644 --- a/zulip_bots/zulip_bots/bots/trello/trello.py +++ b/zulip_bots/zulip_bots/bots/trello/trello.py @@ -2,7 +2,7 @@ import requests -from zulip_bots.lib import BotHandler +from zulip_bots.lib import AbstractBotHandler supported_commands = [ ("help", "Get the bot usage information."), @@ -18,7 +18,7 @@ class TrelloHandler: - def initialize(self, bot_handler: BotHandler) -> None: + def initialize(self, bot_handler: AbstractBotHandler) -> None: self.config_info = bot_handler.get_config_info("trello") self.api_key = self.config_info["api_key"] self.access_token = self.config_info["access_token"] @@ -28,7 +28,7 @@ def initialize(self, bot_handler: BotHandler) -> None: self.check_access_token(bot_handler) - def check_access_token(self, bot_handler: BotHandler) -> None: + def check_access_token(self, bot_handler: AbstractBotHandler) -> None: test_query_response = requests.get( f"https://api.trello.com/1/members/{self.user_name}/", params=self.auth_params ) @@ -43,7 +43,7 @@ def usage(self) -> str: Use `list-commands` to get information about the supported commands. """ - def handle_message(self, message: Dict[str, Any], bot_handler: BotHandler) -> None: + def handle_message(self, message: Dict[str, Any], bot_handler: AbstractBotHandler) -> None: content = message["content"].strip().split() if content == []: diff --git a/zulip_bots/zulip_bots/bots/trivia_quiz/trivia_quiz.py b/zulip_bots/zulip_bots/bots/trivia_quiz/trivia_quiz.py index e1ca4ac03..5af09c1fb 100644 --- a/zulip_bots/zulip_bots/bots/trivia_quiz/trivia_quiz.py +++ b/zulip_bots/zulip_bots/bots/trivia_quiz/trivia_quiz.py @@ -6,7 +6,7 @@ import requests -from zulip_bots.lib import BotHandler +from zulip_bots.lib import AbstractBotHandler class NotAvailableError(Exception): @@ -23,7 +23,7 @@ def usage(self) -> str: This plugin will give users a trivia question from the open trivia database at opentdb.com.""" - def handle_message(self, message: Dict[str, Any], bot_handler: BotHandler) -> None: + def handle_message(self, message: Dict[str, Any], bot_handler: AbstractBotHandler) -> None: query = message["content"] if query == "new": try: @@ -59,11 +59,11 @@ def handle_message(self, message: Dict[str, Any], bot_handler: BotHandler) -> No bot_handler.send_reply(message, bot_response) -def get_quiz_from_id(quiz_id: str, bot_handler: BotHandler) -> str: +def get_quiz_from_id(quiz_id: str, bot_handler: AbstractBotHandler) -> str: return bot_handler.storage.get(quiz_id) -def start_new_quiz(message: Dict[str, Any], bot_handler: BotHandler) -> None: +def start_new_quiz(message: Dict[str, Any], bot_handler: AbstractBotHandler) -> None: quiz = get_trivia_quiz() quiz_id = generate_quiz_id(bot_handler.storage) bot_response = format_quiz_for_markdown(quiz_id, quiz) @@ -188,7 +188,7 @@ def format_quiz_for_markdown(quiz_id: str, quiz: Dict[str, Any]) -> str: return content -def update_quiz(quiz: Dict[str, Any], quiz_id: str, bot_handler: BotHandler) -> None: +def update_quiz(quiz: Dict[str, Any], quiz_id: str, bot_handler: AbstractBotHandler) -> None: bot_handler.storage.put(quiz_id, json.dumps(quiz)) @@ -203,7 +203,11 @@ def build_response(is_correct: bool, num_answers: int) -> str: def handle_answer( - quiz: Dict[str, Any], option: str, quiz_id: str, bot_handler: BotHandler, sender_name: str + quiz: Dict[str, Any], + option: str, + quiz_id: str, + bot_handler: AbstractBotHandler, + sender_name: str, ) -> Tuple[bool, str]: answer = quiz["answers"][quiz["correct_letter"]] is_new_answer = option not in quiz["answered_options"] diff --git a/zulip_bots/zulip_bots/bots/twitpost/twitpost.py b/zulip_bots/zulip_bots/bots/twitpost/twitpost.py index ad6b25846..2a77241b3 100644 --- a/zulip_bots/zulip_bots/bots/twitpost/twitpost.py +++ b/zulip_bots/zulip_bots/bots/twitpost/twitpost.py @@ -2,7 +2,7 @@ import tweepy -from zulip_bots.lib import BotHandler +from zulip_bots.lib import AbstractBotHandler class TwitpostBot: @@ -21,7 +21,7 @@ def usage(self) -> str: " * @twitpost tweet hey batman\n" ) - def initialize(self, bot_handler: BotHandler) -> None: + def initialize(self, bot_handler: AbstractBotHandler) -> None: self.config_info = bot_handler.get_config_info("twitter") auth = tweepy.OAuthHandler( self.config_info["consumer_key"], self.config_info["consumer_secret"] @@ -31,7 +31,7 @@ def initialize(self, bot_handler: BotHandler) -> None: ) self.api = tweepy.API(auth, parser=tweepy.parsers.JSONParser()) - def handle_message(self, message: Dict[str, str], bot_handler: BotHandler) -> None: + def handle_message(self, message: Dict[str, str], bot_handler: AbstractBotHandler) -> None: content = message["content"] if content.strip() == "": diff --git a/zulip_bots/zulip_bots/bots/virtual_fs/virtual_fs.py b/zulip_bots/zulip_bots/bots/virtual_fs/virtual_fs.py index 001f7e7f0..cdf56c2dc 100644 --- a/zulip_bots/zulip_bots/bots/virtual_fs/virtual_fs.py +++ b/zulip_bots/zulip_bots/bots/virtual_fs/virtual_fs.py @@ -4,7 +4,7 @@ import re from typing import Any, Dict, Final, List, Set, Tuple, Union -from zulip_bots.lib import BotHandler +from zulip_bots.lib import AbstractBotHandler class VirtualFsHandler: @@ -16,7 +16,7 @@ class VirtualFsHandler: def usage(self) -> str: return get_help() - def handle_message(self, message: Dict[str, Any], bot_handler: BotHandler) -> None: + def handle_message(self, message: Dict[str, Any], bot_handler: AbstractBotHandler) -> None: command = message["content"] if command == "": command = "help" diff --git a/zulip_bots/zulip_bots/bots/weather/weather.py b/zulip_bots/zulip_bots/bots/weather/weather.py index 3ad572aa6..3aeb4367c 100644 --- a/zulip_bots/zulip_bots/bots/weather/weather.py +++ b/zulip_bots/zulip_bots/bots/weather/weather.py @@ -3,18 +3,18 @@ import requests -from zulip_bots.lib import BotHandler +from zulip_bots.lib import AbstractBotHandler api_url = "http://api.openweathermap.org/data/2.5/weather" class WeatherHandler: - def initialize(self, bot_handler: BotHandler) -> None: + def initialize(self, bot_handler: AbstractBotHandler) -> None: self.api_key = bot_handler.get_config_info("weather")["key"] self.response_pattern = "Weather in {}, {}:\n{:.2f} F / {:.2f} C\n{}" self.check_api_key(bot_handler) - def check_api_key(self, bot_handler: BotHandler) -> None: + def check_api_key(self, bot_handler: AbstractBotHandler) -> None: api_params = dict(q="nyc", APPID=self.api_key) test_response = requests.get(api_url, params=api_params) try: @@ -29,7 +29,7 @@ def usage(self) -> str: This plugin will give info about weather in a specified city """ - def handle_message(self, message: Dict[str, str], bot_handler: BotHandler) -> None: + def handle_message(self, message: Dict[str, str], bot_handler: AbstractBotHandler) -> None: help_content = """ This bot returns weather info for specified city. You specify city in the following format: diff --git a/zulip_bots/zulip_bots/bots/wikipedia/wikipedia.py b/zulip_bots/zulip_bots/bots/wikipedia/wikipedia.py index 385af7a62..cc9210698 100644 --- a/zulip_bots/zulip_bots/bots/wikipedia/wikipedia.py +++ b/zulip_bots/zulip_bots/bots/wikipedia/wikipedia.py @@ -3,7 +3,7 @@ import requests -from zulip_bots.lib import BotHandler +from zulip_bots.lib import AbstractBotHandler # See readme.md for instructions on running this code. @@ -33,11 +33,13 @@ def usage(self) -> str: should preface searches with "@mention-bot". @mention-bot """ - def handle_message(self, message: Dict[str, str], bot_handler: BotHandler) -> None: + def handle_message(self, message: Dict[str, str], bot_handler: AbstractBotHandler) -> None: bot_response = self.get_bot_wiki_response(message, bot_handler) bot_handler.send_reply(message, bot_response) - def get_bot_wiki_response(self, message: Dict[str, str], bot_handler: BotHandler) -> str: + def get_bot_wiki_response( + self, message: Dict[str, str], bot_handler: AbstractBotHandler + ) -> str: """This function returns the URLs of the requested topic.""" help_text = "Please enter your search term after {}" diff --git a/zulip_bots/zulip_bots/bots/witai/witai.py b/zulip_bots/zulip_bots/bots/witai/witai.py index e21b75a2f..72420c522 100644 --- a/zulip_bots/zulip_bots/bots/witai/witai.py +++ b/zulip_bots/zulip_bots/bots/witai/witai.py @@ -6,7 +6,7 @@ import wit -from zulip_bots.lib import BotHandler +from zulip_bots.lib import AbstractBotHandler class WitaiHandler: @@ -16,7 +16,7 @@ def usage(self) -> str: Wit.ai bot, `witai.conf` must be set up. See `doc.md` for more details. """ - def initialize(self, bot_handler: BotHandler) -> None: + def initialize(self, bot_handler: AbstractBotHandler) -> None: config = bot_handler.get_config_info("witai") token = config.get("token") @@ -37,7 +37,7 @@ def initialize(self, bot_handler: BotHandler) -> None: self.client = wit.Wit(token) - def handle_message(self, message: Dict[str, str], bot_handler: BotHandler) -> None: + def handle_message(self, message: Dict[str, str], bot_handler: AbstractBotHandler) -> None: if message["content"] == "" or message["content"] == "help": bot_handler.send_reply(message, self.help_message) return diff --git a/zulip_bots/zulip_bots/bots/xkcd/xkcd.py b/zulip_bots/zulip_bots/bots/xkcd/xkcd.py index a10196a7e..d7662a74f 100644 --- a/zulip_bots/zulip_bots/bots/xkcd/xkcd.py +++ b/zulip_bots/zulip_bots/bots/xkcd/xkcd.py @@ -4,7 +4,7 @@ import requests -from zulip_bots.lib import BotHandler +from zulip_bots.lib import AbstractBotHandler XKCD_TEMPLATE_URL = "https://xkcd.com/%s/info.0.json" LATEST_XKCD_URL = "https://xkcd.com/info.0.json" @@ -36,7 +36,7 @@ def usage(self) -> str: ``, e.g `@mention-bot 1234`. """ - def handle_message(self, message: Dict[str, str], bot_handler: BotHandler) -> None: + def handle_message(self, message: Dict[str, str], bot_handler: AbstractBotHandler) -> None: quoted_name = bot_handler.identity().mention xkcd_bot_response = get_xkcd_bot_response(message, quoted_name) bot_handler.send_reply(message, xkcd_bot_response) diff --git a/zulip_bots/zulip_bots/bots/yoda/yoda.py b/zulip_bots/zulip_bots/bots/yoda/yoda.py index 826a7fad9..183011786 100644 --- a/zulip_bots/zulip_bots/bots/yoda/yoda.py +++ b/zulip_bots/zulip_bots/bots/yoda/yoda.py @@ -5,7 +5,7 @@ import requests -from zulip_bots.lib import BotHandler +from zulip_bots.lib import AbstractBotHandler HELP_MESSAGE = """ This bot allows users to translate a sentence into @@ -36,7 +36,7 @@ class YodaSpeakHandler: It looks for messages starting with '@mention-bot'. """ - def initialize(self, bot_handler: BotHandler) -> None: + def initialize(self, bot_handler: AbstractBotHandler) -> None: self.api_key = bot_handler.get_config_info("yoda")["api_key"] def usage(self) -> str: @@ -53,7 +53,7 @@ def usage(self) -> str: @mention-bot You will learn how to speak like me someday. """ - def handle_message(self, message: Dict[str, str], bot_handler: BotHandler) -> None: + def handle_message(self, message: Dict[str, str], bot_handler: AbstractBotHandler) -> None: self.handle_input(message, bot_handler) def send_to_yoda_api(self, sentence: str) -> str: @@ -89,7 +89,7 @@ def format_input(self, original_content: str) -> str: sentence = message_content.replace(" ", "+") return sentence - def handle_input(self, message: Dict[str, str], bot_handler: BotHandler) -> None: + def handle_input(self, message: Dict[str, str], bot_handler: AbstractBotHandler) -> None: original_content = message["content"] if self.is_help(original_content) or original_content == "": @@ -116,7 +116,7 @@ def handle_input(self, message: Dict[str, str], bot_handler: BotHandler) -> None bot_handler.send_reply(message, reply_message) def send_message( - self, bot_handler: BotHandler, message: str, stream: str, subject: str + self, bot_handler: AbstractBotHandler, message: str, stream: str, subject: str ) -> None: # function for sending a message bot_handler.send_message(dict(type="stream", to=stream, subject=subject, content=message)) diff --git a/zulip_bots/zulip_bots/bots/youtube/youtube.py b/zulip_bots/zulip_bots/bots/youtube/youtube.py index 3a7a2b101..1b42f643c 100644 --- a/zulip_bots/zulip_bots/bots/youtube/youtube.py +++ b/zulip_bots/zulip_bots/bots/youtube/youtube.py @@ -4,7 +4,7 @@ import requests from requests.exceptions import ConnectionError, HTTPError -from zulip_bots.lib import BotHandler +from zulip_bots.lib import AbstractBotHandler commands_list = ("list", "top", "help") @@ -28,7 +28,7 @@ def usage(self) -> str: " * @mention-bot list funny dogs" ) - def initialize(self, bot_handler: BotHandler) -> None: + def initialize(self, bot_handler: AbstractBotHandler) -> None: self.config_info = bot_handler.get_config_info("youtube") # Check if API key is valid. If it is not valid, don't run the bot. try: @@ -44,7 +44,7 @@ def initialize(self, bot_handler: BotHandler) -> None: except ConnectionError: logging.warning("Bad connection") - def handle_message(self, message: Dict[str, str], bot_handler: BotHandler) -> None: + def handle_message(self, message: Dict[str, str], bot_handler: AbstractBotHandler) -> None: if message["content"] == "" or message["content"] == "help": bot_handler.send_reply(message, self.help_content) else: diff --git a/zulip_bots/zulip_bots/game_handler.py b/zulip_bots/zulip_bots/game_handler.py index 0c1b66755..e50138ec2 100644 --- a/zulip_bots/zulip_bots/game_handler.py +++ b/zulip_bots/zulip_bots/game_handler.py @@ -8,7 +8,7 @@ from typing_extensions import override -from zulip_bots.lib import BotHandler +from zulip_bots.lib import AbstractBotHandler class BadMoveError(Exception): @@ -204,13 +204,13 @@ def usage(self) -> str: """ ) - def initialize(self, bot_handler: BotHandler) -> None: + def initialize(self, bot_handler: AbstractBotHandler) -> None: self.bot_handler = bot_handler self.get_user_cache() self.email = self.bot_handler.email self.full_name = self.bot_handler.full_name - def handle_message(self, message: Dict[str, Any], bot_handler: BotHandler) -> None: + def handle_message(self, message: Dict[str, Any], bot_handler: AbstractBotHandler) -> None: try: self.bot_handler = bot_handler content = message["content"].strip() diff --git a/zulip_bots/zulip_bots/lib.py b/zulip_bots/zulip_bots/lib.py index a8531a5dc..3c350b8fc 100644 --- a/zulip_bots/zulip_bots/lib.py +++ b/zulip_bots/zulip_bots/lib.py @@ -92,7 +92,7 @@ def contains(self, key: str) -> bool: class CachedStorage: def __init__(self, parent_storage: BotStorage, init_data: Dict[str, Any]) -> None: - # CachedStorage is implemented solely for the context manager of any BotHandler. + # CachedStorage is implemented solely for the context manager of any AbstractBotHandler. # It has a parent_storage that is responsible of communicating with the database # 1. when certain data is not cached; # 2. when the data need to be flushed to the database. @@ -176,7 +176,7 @@ def use_storage(storage: BotStorage, keys: List[str]) -> Iterator[BotStorage]: cache.flush() -class BotHandler(Protocol): +class AbstractBotHandler(Protocol): user_id: int email: str full_name: str @@ -378,7 +378,9 @@ def quit(self, message: str = "") -> None: sys.exit(message) -def extract_query_without_mention(message: Dict[str, Any], client: BotHandler) -> Optional[str]: +def extract_query_without_mention( + message: Dict[str, Any], client: AbstractBotHandler +) -> Optional[str]: """ If the bot is the first @mention in the message, then this function returns the stripped message with the bot's @mention removed. Otherwise, it returns None. @@ -398,7 +400,7 @@ def extract_query_without_mention(message: Dict[str, Any], client: BotHandler) - def is_private_message_but_not_group_pm( - message_dict: Dict[str, Any], current_user: BotHandler + message_dict: Dict[str, Any], current_user: AbstractBotHandler ) -> bool: """ Checks whether a message dict represents a PM from another user. @@ -422,7 +424,7 @@ def display_config_file_errors(error_msg: str, config_file: str) -> None: print(f"\nMore details here:\n\n{error_msg}\n") -def prepare_message_handler(bot: str, bot_handler: BotHandler, bot_lib_module: Any) -> Any: +def prepare_message_handler(bot: str, bot_handler: AbstractBotHandler, bot_lib_module: Any) -> Any: message_handler = bot_lib_module.handler_class() if hasattr(message_handler, "validate_config"): config_data = bot_handler.get_config_info(bot) diff --git a/zulip_bots/zulip_bots/tests/test_lib.py b/zulip_bots/zulip_bots/tests/test_lib.py index efc972b84..b6f88e356 100644 --- a/zulip_bots/zulip_bots/tests/test_lib.py +++ b/zulip_bots/zulip_bots/tests/test_lib.py @@ -5,7 +5,7 @@ from zulip import Client from zulip_bots.lib import ( - BotHandler, + AbstractBotHandler, ExternalBotHandler, StateHandler, extract_query_without_mention, @@ -53,10 +53,10 @@ class FakeBotHandler: def usage(self) -> str: return """ This is a fake bot handler that is used - to spec BotHandler mocks. + to spec AbstractBotHandler mocks. """ - def handle_message(self, message: Dict[str, str], bot_handler: BotHandler) -> None: + def handle_message(self, message: Dict[str, str], bot_handler: AbstractBotHandler) -> None: pass diff --git a/zulip_botserver/tests/test_server.py b/zulip_botserver/tests/test_server.py index 14141e709..7a03ea333 100644 --- a/zulip_botserver/tests/test_server.py +++ b/zulip_botserver/tests/test_server.py @@ -10,7 +10,7 @@ import importlib_metadata as metadata from typing_extensions import override -from zulip_bots.lib import BotHandler +from zulip_bots.lib import AbstractBotHandler from zulip_botserver import server from zulip_botserver.input_parameters import parse_args @@ -19,7 +19,7 @@ class BotServerTests(BotServerTestCase): class MockMessageHandler: - def handle_message(self, message: Dict[str, str], bot_handler: BotHandler) -> None: + def handle_message(self, message: Dict[str, str], bot_handler: AbstractBotHandler) -> None: assert message == {"key": "test message"} class MockLibModule: