From 1297cf201b24f4ca02976a238074bf74aef28dff Mon Sep 17 00:00:00 2001 From: Joscha Date: Sun, 14 Apr 2019 19:56:14 +0000 Subject: [PATCH 01/19] Fix room authentication --- CHANGELOG.md | 2 ++ yaboli/room.py | 7 +++++-- 2 files changed, 7 insertions(+), 2 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 169e87f..399f28f 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -2,6 +2,8 @@ ## Next version +- fix room authentication + ## 1.1.1 (2019-04-14) - add database class for easier sqlite3 access diff --git a/yaboli/room.py b/yaboli/room.py index 905162f..5ea5e03 100644 --- a/yaboli/room.py +++ b/yaboli/room.py @@ -191,8 +191,11 @@ class Room: async def _on_bounce_event(self, packet: Any) -> None: data = packet["data"] - # Can we even authenticate? - if not "passcode" in data.get("auth_options", []): + # Can we even authenticate? (Assuming that passcode authentication is + # available if no authentication options are given: Euphoria doesn't + # (always) send authentication options, even when passcode + # authentication works.) + if not "passcode" in data.get("auth_options", ["passcode"]): self._set_connected_failed() return From e53ce42e99acc3efc8625b3a2367ae9926df1b9c Mon Sep 17 00:00:00 2001 From: Joscha Date: Sun, 14 Apr 2019 20:03:29 +0000 Subject: [PATCH 02/19] Bump version to 1.1.2 --- CHANGELOG.md | 3 +++ README.md | 2 +- setup.py | 2 +- 3 files changed, 5 insertions(+), 2 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 399f28f..86bd86a 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -2,7 +2,10 @@ ## Next version +## 1.1.2 (2019-04-14) + - fix room authentication +- resolve to test yaboli more thoroughly before publishing a new version ## 1.1.1 (2019-04-14) diff --git a/README.md b/README.md index b51b517..92f1e14 100644 --- a/README.md +++ b/README.md @@ -12,7 +12,7 @@ Ensure that you have at least Python 3.7 installed. To install yaboli or update your installation to the latest version, run: ``` -$ pip install git+https://github.com/Garmelon/yaboli@v1.1.1 +$ pip install git+https://github.com/Garmelon/yaboli@v1.1.2 ``` The use of [venv](https://docs.python.org/3/library/venv.html) is recommended. diff --git a/setup.py b/setup.py index a3b8de7..b3b1208 100644 --- a/setup.py +++ b/setup.py @@ -2,7 +2,7 @@ from setuptools import setup setup( name="yaboli", - version="1.1.1", + version="1.1.2", packages=["yaboli"], install_requires=["websockets==7.0"], ) From d9f25a04fbc0358dd56c69f2e14ae3d23d060461 Mon Sep 17 00:00:00 2001 From: Joscha Date: Sun, 14 Apr 2019 22:25:42 +0000 Subject: [PATCH 03/19] Time out when creating the ws connections --- CHANGELOG.md | 2 ++ yaboli/connection.py | 13 ++++++++++--- 2 files changed, 12 insertions(+), 3 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 86bd86a..f996329 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -2,6 +2,8 @@ ## Next version +- add timeout for creating ws connections + ## 1.1.2 (2019-04-14) - fix room authentication diff --git a/yaboli/connection.py b/yaboli/connection.py index af31d1c..8af43c3 100644 --- a/yaboli/connection.py +++ b/yaboli/connection.py @@ -82,6 +82,9 @@ class Connection: "part-event" and "ping". """ + # Timeout for waiting for the ws connection to be established + CONNECT_TIMEOUT = 10 # seconds + # Maximum duration between euphoria's ping messages. Euphoria usually sends # ping messages every 20 to 30 seconds. PING_TIMEOUT = 40 # seconds @@ -183,8 +186,12 @@ class Connection: try: logger.debug(f"Creating ws connection to {self._url!r}") - ws = await websockets.connect(self._url, - extra_headers=self._cookie_jar.get_cookies_as_headers()) + ws = await asyncio.wait_for( + websockets.connect(self._url, + extra_headers=self._cookie_jar.get_cookies_as_headers()), + self.CONNECT_TIMEOUT + ) + logger.debug(f"Established ws connection to {self._url!r}") self._ws = ws self._awaiting_replies = {} @@ -200,7 +207,7 @@ class Connection: return True except (websockets.InvalidHandshake, websockets.InvalidStatusCode, - socket.gaierror): + socket.gaierror, asyncio.TimeoutError): logger.debug("Connection failed") return False From de4ba53de85cfa40cd184023e5ee73e4bda18c9a Mon Sep 17 00:00:00 2001 From: Joscha Date: Fri, 19 Apr 2019 09:57:09 +0000 Subject: [PATCH 04/19] Fix config file not reloading on bot restart --- CHANGELOG.md | 1 + yaboli/__init__.py | 16 ++++++++-------- 2 files changed, 9 insertions(+), 8 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index f996329..9838fd8 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -3,6 +3,7 @@ ## Next version - add timeout for creating ws connections +- fix config file not reloading when restarting bots ## 1.1.2 (2019-04-14) diff --git a/yaboli/__init__.py b/yaboli/__init__.py index b138c88..241bf0e 100644 --- a/yaboli/__init__.py +++ b/yaboli/__init__.py @@ -54,12 +54,12 @@ def run( bot_constructor: BotConstructor, config_file: str = "bot.conf", ) -> None: - # Load the config file - config = configparser.ConfigParser(allow_no_value=True) - config.read(config_file) - async def _run() -> None: while True: + # Load the config file + config = configparser.ConfigParser(allow_no_value=True) + config.read(config_file) + bot = bot_constructor(config, config_file) await bot.run() @@ -70,12 +70,12 @@ def run_modulebot( module_constructors: Dict[str, ModuleConstructor], config_file: str = "bot.conf", ) -> None: - # Load the config file - config = configparser.ConfigParser(allow_no_value=True) - config.read(config_file) - async def _run() -> None: while True: + # Load the config file + config = configparser.ConfigParser(allow_no_value=True) + config.read(config_file) + modulebot = modulebot_constructor(config, config_file, module_constructors) await modulebot.run() From 83af4ff9e850c5043eb4ce8f6c6ab41eed8608a9 Mon Sep 17 00:00:00 2001 From: Joscha Date: Fri, 19 Apr 2019 10:01:50 +0000 Subject: [PATCH 05/19] Bump version to 1.1.3 --- CHANGELOG.md | 4 ++++ README.md | 2 +- setup.py | 2 +- 3 files changed, 6 insertions(+), 2 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 9838fd8..2a2f6ec 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -2,6 +2,10 @@ ## Next version +Nothing yet + +## 1.1.3 (2019-04-19) + - add timeout for creating ws connections - fix config file not reloading when restarting bots diff --git a/README.md b/README.md index 92f1e14..becb80c 100644 --- a/README.md +++ b/README.md @@ -12,7 +12,7 @@ Ensure that you have at least Python 3.7 installed. To install yaboli or update your installation to the latest version, run: ``` -$ pip install git+https://github.com/Garmelon/yaboli@v1.1.2 +$ pip install git+https://github.com/Garmelon/yaboli@v1.1.3 ``` The use of [venv](https://docs.python.org/3/library/venv.html) is recommended. diff --git a/setup.py b/setup.py index b3b1208..4ddafc0 100644 --- a/setup.py +++ b/setup.py @@ -2,7 +2,7 @@ from setuptools import setup setup( name="yaboli", - version="1.1.2", + version="1.1.3", packages=["yaboli"], install_requires=["websockets==7.0"], ) From ca56de710c31c18fafdc0a67a809e5d4c2f4ab53 Mon Sep 17 00:00:00 2001 From: Joscha Date: Fri, 19 Apr 2019 10:04:12 +0000 Subject: [PATCH 06/19] Fix changelog formatting --- CHANGELOG.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 2a2f6ec..1cf5072 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -23,7 +23,7 @@ Nothing yet - change how config files are passed along - change module system to support config file changes -# 1.0.0 (2019-04-13) +## 1.0.0 (2019-04-13) - add fancy argument parsing - add login and logout command to room @@ -35,9 +35,9 @@ Nothing yet ## 0.2.0 (2019-04-12) -- change config file format - add `ALIASES` variable to `Bot` - add `on_connected` function to `Client` +- change config file format ## 0.1.0 (2019-04-12) From eb9cc4f9bd2c583ddf77ff1e9f1e506b3ea21c94 Mon Sep 17 00:00:00 2001 From: Joscha Date: Fri, 19 Apr 2019 10:52:39 +0000 Subject: [PATCH 07/19] Make KILL_REPLY and RESTART_REPLY optional --- yaboli/bot.py | 14 ++++++++++---- 1 file changed, 10 insertions(+), 4 deletions(-) diff --git a/yaboli/bot.py b/yaboli/bot.py index c696820..eba8669 100644 --- a/yaboli/bot.py +++ b/yaboli/bot.py @@ -19,8 +19,8 @@ class Bot(Client): PING_REPLY: str = "Pong!" HELP_GENERAL: Optional[str] = None HELP_SPECIFIC: Optional[List[str]] = None - KILL_REPLY: str = "/me dies" - RESTART_REPLY: str = "/me restarts" + KILL_REPLY: Optional[str] = "/me dies" + RESTART_REPLY: Optional[str] = "/me restarts" GENERAL_SECTION = "general" ROOMS_SECTION = "rooms" @@ -178,7 +178,10 @@ class Bot(Client): args: SpecificArgumentData ) -> None: logger.info(f"Killed in &{room.name} by {message.sender.atmention}") - await message.reply(self.KILL_REPLY) + + if self.KILL_REPLY is not None: + await message.reply(self.KILL_REPLY) + await self.part(room) async def cmd_restart(self, @@ -187,7 +190,10 @@ class Bot(Client): args: SpecificArgumentData ) -> None: logger.info(f"Restarted in &{room.name} by {message.sender.atmention}") - await message.reply(self.RESTART_REPLY) + + if self.RESTART_REPLY is not None: + await message.reply(self.RESTART_REPLY) + await self.stop() BotConstructor = Callable[[configparser.ConfigParser, str], Bot] From 6a15e1a9488464322203633ca558ff333e81e706 Mon Sep 17 00:00:00 2001 From: Joscha Date: Fri, 19 Apr 2019 11:06:27 +0000 Subject: [PATCH 08/19] Add docstrings to Bot functions --- CHANGELOG.md | 3 +- yaboli/bot.py | 178 ++++++++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 180 insertions(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 1cf5072..a927e16 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -2,7 +2,8 @@ ## Next version -Nothing yet +- add docstrings to `Bot` +- change `KILL_REPLY` and `RESTART_REPLY` to be optional in `Bot` ## 1.1.3 (2019-04-19) diff --git a/yaboli/bot.py b/yaboli/bot.py index eba8669..97385cb 100644 --- a/yaboli/bot.py +++ b/yaboli/bot.py @@ -14,6 +14,36 @@ logger = logging.getLogger(__name__) __all__ = ["Bot", "BotConstructor"] class Bot(Client): + """ + A Bot is a Client that responds to commands and uses a config file to + automatically set its nick and join rooms. + + The config file is loaded as a ConfigParser by the run() or run_modulebot() + functions and has the following structure: + + A "general" section which contains: + - nick - the default nick of the bot (set to the empty string if you don't + want to set a nick) + - cookie_file (optional) - the file the cookie should be saved in + + A "rooms" section which contains a list of rooms that the bot should + automatically join. This section is optional if you overwrite started(). + The room list should have the format "roomname" or "roomname = password". + + A bot has the following attributes: + - ALIASES - list of alternate nicks the bot responds to (see + process_commands()) + - PING_REPLY - used by cmd_ping() + - HELP_GENERAL - used by cmd_help_general() + - HELP_SPECIFIC - used by cmd_help_specific() + - KILL_REPLY - used by cmd_kill() + - RESTART_REPLY - used by cmd_restart() + - GENERAL_SECTION - the name of the "general" section in the config file + (see above) (default: "general") + - ROOMS_SECTION - the name of the "rooms" section in the config file (see + above) (default: "rooms") + """ + ALIASES: List[str] = [] PING_REPLY: str = "Pong!" @@ -50,10 +80,26 @@ class Bot(Client): self.start_time = datetime.datetime.now() def save_config(self) -> None: + """ + Save the current state of self.config to the file passed in __init__ as + the config_file parameter. + + Usually, this is the file that self.config was loaded from (if you use + run or run_modulebot). + """ + with open(self.config_file, "w") as f: self.config.write(f) async def started(self) -> None: + """ + This Client function is overwritten in order to join all the rooms + listed in the "rooms" section of self.config. + + If you need to overwrite this function but want to keep the auto-join + functionality, make sure to await super().started(). + """ + for room, password in self.config[self.ROOMS_SECTION].items(): if password is None: await self.join(room) @@ -63,6 +109,12 @@ class Bot(Client): # Registering commands def register(self, command: Command) -> None: + """ + Register a Command (from the yaboli.command submodule). + + Usually, you don't have to call this function yourself. + """ + self._commands.append(command) def register_general(self, @@ -70,6 +122,23 @@ class Bot(Client): cmdfunc: GeneralCommandFunction, args: bool = True ) -> None: + """ + Register a function as general bot command (i. e. no @mention of the + bot nick after the !command). This function will be called by + process_commands() when the bot encounters a matching command. + + name - the name of the command (If you want your command to be !hello, + the name is "hello".) + + cmdfunc - the function that is called with the Room, LiveMessage and + ArgumentData when the bot encounters a matching command + + args - whether the command may have arguments (If set to False, the + ArgumentData's has_args() function must also return False for the + command function to be called. If set to True, all ArgumentData is + valid.) + """ + command = GeneralCommand(name, cmdfunc, args) self.register(command) @@ -78,6 +147,21 @@ class Bot(Client): cmdfunc: SpecificCommandFunction, args: bool = True ) -> None: + """ + Register a function as specific bot command (i. e. @mention of the bot + nick after the !command is required). This function will be called by + process_commands() when the bot encounters a matching command. + + name - the name of the command (see register_general() for an + explanation) + + cmdfunc - the function that is called with the Room, LiveMessage and + SpecificArgumentData when the bot encounters a matching command + + args - whether the command may have arguments (see register_general() + for an explanation) + """ + command = SpecificCommand(name, cmdfunc, args) self.register(command) @@ -88,6 +172,13 @@ class Bot(Client): message: LiveMessage, aliases: List[str] = [] ) -> None: + """ + If the message contains a command, call all matching command functions + that were previously registered. + + This function is usually called by the overwritten on_send() function. + """ + nicks = [room.session.nick] + aliases data = CommandData.from_string(message.content) @@ -97,11 +188,31 @@ class Bot(Client): await command.run(room, message, nicks, data) async def on_send(self, room: Room, message: LiveMessage) -> None: + """ + This Client function is overwritten in order to automatically call + process_commands() with self.ALIASES. + + If you need to overwrite this function, make sure to await + process_commands() with self.ALIASES somewhere in your function, or + await super().on_send(). + """ + await self.process_commands(room, message, aliases=self.ALIASES) # Help util def format_help(self, room: Room, lines: List[str]) -> str: + """ + Format a list of strings into a string, replacing certain placeholders + with the actual values. + + This function uses the str.format() function to replace the following: + + - {nick} - the bot's current nick + - {mention} - the bot's current nick, run through mention() + - {atmention} - the bot's current nick, run through atmention() + """ + text = "\n".join(lines) params = { "nick": room.session.nick, @@ -119,6 +230,36 @@ class Bot(Client): kill: bool = False, restart: bool = False, ) -> None: + """ + Register the commands necessary for the bot to conform to the botrulez + (https://github.com/jedevc/botrulez). Also includes a few optional + botrulez commands that are disabled by default. + + - ping - register general and specific cmd_ping() + - help_ - register cmd_help_general() and cmd_help_specific() + - uptime - register specific cmd_uptime + - kill - register specific cmd_kill (disabled by default) + - uptime - register specific cmd_uptime (disabled by default) + + All commands are registered with args=False. + + If you want to implement your own versions of these commands, it is + recommended that you set the respective argument to False in your call + to register_botrulez(), overwrite the existing command functions or + create your own, and then register them manually. + + For help, that might look something like this, if you've written a + custom specific help that takes extra arguments but are using the + botrulez general help: + + self.register_botrulez(help_=False) + self.register_general("help", self.cmd_help_general, args=False) + self.register_specific("help", self.cmd_help_custom) + + In case you're asking, the help_ parameter has an underscore at the end + so it doesn't overlap the help() function. + """ + if ping: self.register_general("ping", self.cmd_ping, args=False) self.register_specific("ping", self.cmd_ping, args=False) @@ -144,6 +285,10 @@ class Bot(Client): message: LiveMessage, args: ArgumentData ) -> None: + """ + Reply with self.PING_REPLY. + """ + await message.reply(self.PING_REPLY) async def cmd_help_general(self, @@ -151,6 +296,10 @@ class Bot(Client): message: LiveMessage, args: ArgumentData ) -> None: + """ + Reply with self.HELP_GENERAL, if it is not None. Uses format_help(). + """ + if self.HELP_GENERAL is not None: await message.reply(self.format_help(room, [self.HELP_GENERAL])) @@ -159,6 +308,10 @@ class Bot(Client): message: LiveMessage, args: SpecificArgumentData ) -> None: + """ + Reply with self.HELP_SPECIFIC, if it is not None. Uses format_help(). + """ + if self.HELP_SPECIFIC is not None: await message.reply(self.format_help(room, self.HELP_SPECIFIC)) @@ -167,6 +320,15 @@ class Bot(Client): message: LiveMessage, args: SpecificArgumentData ) -> None: + """ + Reply with the bot's uptime in the format specified by the botrulez. + + This uses the time that the Bot was first started, not the time the + respective Room was created. A !restart (see register_botrulez()) will + reset the bot uptime, but leaving and re-joining a room or losing + connection won't. + """ + time = format_time(self.start_time) delta = format_delta(datetime.datetime.now() - self.start_time) text = f"/me has been up since {time} UTC ({delta})" @@ -177,6 +339,13 @@ class Bot(Client): message: LiveMessage, args: SpecificArgumentData ) -> None: + """ + Remove the bot from this room. + + If self.KILL_REPLY is not None, replies with that before leaving the + room. + """ + logger.info(f"Killed in &{room.name} by {message.sender.atmention}") if self.KILL_REPLY is not None: @@ -189,6 +358,15 @@ class Bot(Client): message: LiveMessage, args: SpecificArgumentData ) -> None: + """ + Restart the whole Bot. + + This is done by stopping the Bot, since the run() or run_modulebot() + functions start the Bot in a while True loop. + + If self.RESTART_REPLY is not None, replies with that before restarting. + """ + logger.info(f"Restarted in &{room.name} by {message.sender.atmention}") if self.RESTART_REPLY is not None: From 74a8adfa587c9de2193e54f7875b53c507f48edc Mon Sep 17 00:00:00 2001 From: Joscha Date: Fri, 19 Apr 2019 11:09:08 +0000 Subject: [PATCH 09/19] Fix imports --- CHANGELOG.md | 1 + yaboli/__init__.py | 2 +- 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index a927e16..4ad540e 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -4,6 +4,7 @@ - add docstrings to `Bot` - change `KILL_REPLY` and `RESTART_REPLY` to be optional in `Bot` +- fix imports ## 1.1.3 (2019-04-19) diff --git a/yaboli/__init__.py b/yaboli/__init__.py index 241bf0e..527eaeb 100644 --- a/yaboli/__init__.py +++ b/yaboli/__init__.py @@ -17,7 +17,7 @@ from .session import * from .util import * __all__ = ["STYLE", "FORMAT", "DATE_FORMAT", "FORMATTER", "enable_logging", - "run"] + "run", "run_modulebot"] __all__ += bot.__all__ __all__ += client.__all__ From 1c409601dbe309c2438f0061fdc59f9cffcfddee Mon Sep 17 00:00:00 2001 From: Joscha Date: Sat, 20 Apr 2019 18:55:47 +0000 Subject: [PATCH 10/19] Update echobot to latest yaboli version --- CHANGELOG.md | 1 + examples/echo/bot.conf | 1 + examples/echo/echobot.py | 7 ++++--- 3 files changed, 6 insertions(+), 3 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 4ad540e..a0e5c4b 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -4,6 +4,7 @@ - add docstrings to `Bot` - change `KILL_REPLY` and `RESTART_REPLY` to be optional in `Bot` +- fix echobot example - fix imports ## 1.1.3 (2019-04-19) diff --git a/examples/echo/bot.conf b/examples/echo/bot.conf index 8d48222..940e8e4 100644 --- a/examples/echo/bot.conf +++ b/examples/echo/bot.conf @@ -1,5 +1,6 @@ [general] nick = EchoBot +cookie_file = bot.cookie [rooms] test diff --git a/examples/echo/echobot.py b/examples/echo/echobot.py index 4804992..e404f3c 100644 --- a/examples/echo/echobot.py +++ b/examples/echo/echobot.py @@ -8,13 +8,14 @@ class EchoBot(yaboli.Bot): "!echo – reply with exactly ", ] - def __init__(self, config_file): - super().__init__(config_file) + def __init__(self, *args, **kwargs): + super().__init__(*args, **kwargs) self.register_botrulez(kill=True) self.register_general("echo", self.cmd_echo) async def cmd_echo(self, room, message, args): - await message.reply(args.raw) + text = args.raw.strip() # ignoring leading and trailing whitespace + await message.reply(text) if __name__ == "__main__": From 7024686ff217986e495230d678bfd98c12b46898 Mon Sep 17 00:00:00 2001 From: Joscha Date: Sat, 20 Apr 2019 19:01:25 +0000 Subject: [PATCH 11/19] Update example gitignore to latest version --- CHANGELOG.md | 3 ++- examples/echo/.gitignore | 17 +++++++++++++++++ examples/echo/{bot.conf => bot.conf.default} | 0 examples/gitignore_with_venv | 8 ++++++-- 4 files changed, 25 insertions(+), 3 deletions(-) create mode 100644 examples/echo/.gitignore rename examples/echo/{bot.conf => bot.conf.default} (100%) diff --git a/CHANGELOG.md b/CHANGELOG.md index a0e5c4b..ddb365e 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -4,8 +4,9 @@ - add docstrings to `Bot` - change `KILL_REPLY` and `RESTART_REPLY` to be optional in `Bot` -- fix echobot example - fix imports +- update echobot example to newest version +- update example gitignore to newest version ## 1.1.3 (2019-04-19) diff --git a/examples/echo/.gitignore b/examples/echo/.gitignore new file mode 100644 index 0000000..f69b963 --- /dev/null +++ b/examples/echo/.gitignore @@ -0,0 +1,17 @@ +# python stuff +__pycache__/ + +# venv stuff +bin/ +include/ +lib/ +lib64 +pyvenv.cfg + +# bot stuff +# +# These files are ignored because they may contain sensitive information you +# wouldn't want in your repo. If you need to have a config file in your repo, +# store a bot.conf.default with default settings. +*.conf +*.cookie diff --git a/examples/echo/bot.conf b/examples/echo/bot.conf.default similarity index 100% rename from examples/echo/bot.conf rename to examples/echo/bot.conf.default diff --git a/examples/gitignore_with_venv b/examples/gitignore_with_venv index 191feb7..f69b963 100644 --- a/examples/gitignore_with_venv +++ b/examples/gitignore_with_venv @@ -8,6 +8,10 @@ lib/ lib64 pyvenv.cfg -# config files +# bot stuff +# +# These files are ignored because they may contain sensitive information you +# wouldn't want in your repo. If you need to have a config file in your repo, +# store a bot.conf.default with default settings. *.conf -cookie_jar +*.cookie From 2215e75c34629b76f178e6db5100315377b4ad1f Mon Sep 17 00:00:00 2001 From: Joscha Date: Sat, 20 Apr 2019 19:26:46 +0000 Subject: [PATCH 12/19] Add config file to example --- README.md | 15 ++++++++++++++- 1 file changed, 14 insertions(+), 1 deletion(-) diff --git a/README.md b/README.md index becb80c..9af43a9 100644 --- a/README.md +++ b/README.md @@ -39,7 +39,17 @@ class EchoBot(yaboli.Bot): await message.reply(args.raw) ``` -The bot's nick, cookie file and default rooms are specified in a config file. +The bot's nick, cookie file and default rooms are specified in a config file, +like so: + +```ini +[general] +nick = EchoBot +cookie_file = bot.cookie + +[rooms] +test +``` The help command from the botrulez uses the `HELP_GENERAL` and `HELP_SPECIFIC` fields. @@ -52,6 +62,9 @@ In the `cmd_echo` function, the echo command is implemented. In this case, the bot replies to the message containing the command with the raw argument string, i. e. the text between the end of the "!echo" and the end of the whole message. +The full version of this echobot can be found [in the +examples](examples/echo/). + ## TODOs - [ ] document yaboli (markdown files in a "docs" folder?) From 66b56a450e7327ddea59d1692e4570b3889cdf75 Mon Sep 17 00:00:00 2001 From: Joscha Date: Fri, 21 Jun 2019 07:21:50 +0000 Subject: [PATCH 13/19] Fix room firing incorrect event --- CHANGELOG.md | 1 + yaboli/room.py | 4 ++-- 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index ddb365e..26c1d86 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -5,6 +5,7 @@ - add docstrings to `Bot` - change `KILL_REPLY` and `RESTART_REPLY` to be optional in `Bot` - fix imports +- fix room firing incorrect event - update echobot example to newest version - update example gitignore to newest version diff --git a/yaboli/room.py b/yaboli/room.py index 5ea5e03..d1304ee 100644 --- a/yaboli/room.py +++ b/yaboli/room.py @@ -180,10 +180,10 @@ class Room: if nick is not None and self._session is not None: self._session = self.session.with_nick(nick) - # Send "session" event + # Send "snapshot" event messages = [LiveMessage.from_data(self, msg_data) for msg_data in data["log"]] - self._events.fire("session", messages) + self._events.fire("snapshot", messages) self._snapshot_received = True await self._try_set_connected() From 1b9860ba1ef06c0e5e1e758008e2cbf14b359b70 Mon Sep 17 00:00:00 2001 From: Joscha Date: Fri, 21 Jun 2019 07:23:49 +0000 Subject: [PATCH 14/19] Bump version to 1.1.4 --- CHANGELOG.md | 4 ++++ README.md | 2 +- setup.py | 2 +- 3 files changed, 6 insertions(+), 2 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 26c1d86..46bbd89 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -2,6 +2,10 @@ ## Next version +Nothing yet. + +## 1.1.4 (2019-06-21) + - add docstrings to `Bot` - change `KILL_REPLY` and `RESTART_REPLY` to be optional in `Bot` - fix imports diff --git a/README.md b/README.md index 9af43a9..af5aef5 100644 --- a/README.md +++ b/README.md @@ -12,7 +12,7 @@ Ensure that you have at least Python 3.7 installed. To install yaboli or update your installation to the latest version, run: ``` -$ pip install git+https://github.com/Garmelon/yaboli@v1.1.3 +$ pip install git+https://github.com/Garmelon/yaboli@v1.1.4 ``` The use of [venv](https://docs.python.org/3/library/venv.html) is recommended. diff --git a/setup.py b/setup.py index 4ddafc0..56127a0 100644 --- a/setup.py +++ b/setup.py @@ -2,7 +2,7 @@ from setuptools import setup setup( name="yaboli", - version="1.1.3", + version="1.1.4", packages=["yaboli"], install_requires=["websockets==7.0"], ) From 455d2af251a595915c4053b01e1d199f1c2623c8 Mon Sep 17 00:00:00 2001 From: Joscha Date: Sat, 30 Nov 2019 16:30:52 +0000 Subject: [PATCH 15/19] Use IOError to catch more exceptions --- yaboli/connection.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/yaboli/connection.py b/yaboli/connection.py index 8af43c3..fcc27fe 100644 --- a/yaboli/connection.py +++ b/yaboli/connection.py @@ -207,7 +207,7 @@ class Connection: return True except (websockets.InvalidHandshake, websockets.InvalidStatusCode, - socket.gaierror, asyncio.TimeoutError): + OSError, asyncio.TimeoutError): logger.debug("Connection failed") return False From 1d25b596bbd84e95314d637787c209f248a7e505 Mon Sep 17 00:00:00 2001 From: Joscha Date: Sun, 26 Jan 2020 22:50:20 +0000 Subject: [PATCH 16/19] Bump version to 1.1.5 --- CHANGELOG.md | 4 +++- README.md | 2 +- setup.py | 2 +- 3 files changed, 5 insertions(+), 3 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 46bbd89..8dd46b4 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -2,7 +2,9 @@ ## Next version -Nothing yet. +## 1.1.5 (2020-01-26) + +- more stability (I think) ## 1.1.4 (2019-06-21) diff --git a/README.md b/README.md index af5aef5..b02a6a8 100644 --- a/README.md +++ b/README.md @@ -12,7 +12,7 @@ Ensure that you have at least Python 3.7 installed. To install yaboli or update your installation to the latest version, run: ``` -$ pip install git+https://github.com/Garmelon/yaboli@v1.1.4 +$ pip install git+https://github.com/Garmelon/yaboli@v1.1.5 ``` The use of [venv](https://docs.python.org/3/library/venv.html) is recommended. diff --git a/setup.py b/setup.py index 56127a0..ebbea69 100644 --- a/setup.py +++ b/setup.py @@ -2,7 +2,7 @@ from setuptools import setup setup( name="yaboli", - version="1.1.4", + version="1.1.5", packages=["yaboli"], install_requires=["websockets==7.0"], ) From 74caea4e922a249deec2ae33b89a7c3471cd693b Mon Sep 17 00:00:00 2001 From: Joscha Date: Sun, 21 Aug 2022 14:09:02 +0200 Subject: [PATCH 17/19] Update websockets dependency --- CHANGELOG.md | 2 ++ setup.py | 2 +- 2 files changed, 3 insertions(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 8dd46b4..60cfd94 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -2,6 +2,8 @@ ## Next version +- update websockets dependency + ## 1.1.5 (2020-01-26) - more stability (I think) diff --git a/setup.py b/setup.py index ebbea69..8de8af1 100644 --- a/setup.py +++ b/setup.py @@ -4,7 +4,7 @@ setup( name="yaboli", version="1.1.5", packages=["yaboli"], - install_requires=["websockets==7.0"], + install_requires=["websockets >=10.3, <11"], ) # When updating the version, also: From 37c4ba703a89d44d89185ac37888b0060e5637d3 Mon Sep 17 00:00:00 2001 From: Joscha Date: Sun, 21 Aug 2022 14:24:05 +0200 Subject: [PATCH 18/19] Switch to pyproject.toml style setuptools config --- .gitignore | 14 +++----------- CHANGELOG.md | 1 + examples/echo/.gitignore | 12 ------------ setup.py => pyproject.toml | 16 +++++++++------- 4 files changed, 13 insertions(+), 30 deletions(-) rename setup.py => pyproject.toml (78%) diff --git a/.gitignore b/.gitignore index 1d164cd..7ce48d0 100644 --- a/.gitignore +++ b/.gitignore @@ -1,12 +1,4 @@ -# python stuff __pycache__/ - -# venv stuff -bin/ -include/ -lib/ -lib64 -pyvenv.cfg - -# mypy stuff -.mypy_cache/ +*.egg-info/ +/.mypy_cache/ +/.venv/ diff --git a/CHANGELOG.md b/CHANGELOG.md index 60cfd94..8df3702 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -3,6 +3,7 @@ ## Next version - update websockets dependency +- switch to pyproject.toml style setuptools config ## 1.1.5 (2020-01-26) diff --git a/examples/echo/.gitignore b/examples/echo/.gitignore index f69b963..da78a19 100644 --- a/examples/echo/.gitignore +++ b/examples/echo/.gitignore @@ -1,15 +1,3 @@ -# python stuff -__pycache__/ - -# venv stuff -bin/ -include/ -lib/ -lib64 -pyvenv.cfg - -# bot stuff -# # These files are ignored because they may contain sensitive information you # wouldn't want in your repo. If you need to have a config file in your repo, # store a bot.conf.default with default settings. diff --git a/setup.py b/pyproject.toml similarity index 78% rename from setup.py rename to pyproject.toml index 8de8af1..dbb7c7e 100644 --- a/setup.py +++ b/pyproject.toml @@ -1,11 +1,13 @@ -from setuptools import setup +[build-system] +requires = ["setuptools"] +build-backend = "setuptools.build_meta" -setup( - name="yaboli", - version="1.1.5", - packages=["yaboli"], - install_requires=["websockets >=10.3, <11"], -) +[project] +name = "yaboli" +version = "1.1.5" +dependencies = [ + "websockets >=10.3, <11" +] # When updating the version, also: # - update the README.md installation instructions From eba398e5d31ff9da05befb1e98459843b8513023 Mon Sep 17 00:00:00 2001 From: Joscha Date: Sun, 21 Aug 2022 14:26:04 +0200 Subject: [PATCH 19/19] Bump version to 1.2.0 --- CHANGELOG.md | 2 ++ README.md | 2 +- pyproject.toml | 2 +- 3 files changed, 4 insertions(+), 2 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 8df3702..e0f1801 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -2,6 +2,8 @@ ## Next version +## 1.2.0 (2022-08-21) + - update websockets dependency - switch to pyproject.toml style setuptools config diff --git a/README.md b/README.md index b02a6a8..2cd4eb1 100644 --- a/README.md +++ b/README.md @@ -12,7 +12,7 @@ Ensure that you have at least Python 3.7 installed. To install yaboli or update your installation to the latest version, run: ``` -$ pip install git+https://github.com/Garmelon/yaboli@v1.1.5 +$ pip install git+https://github.com/Garmelon/yaboli@v1.2.0 ``` The use of [venv](https://docs.python.org/3/library/venv.html) is recommended. diff --git a/pyproject.toml b/pyproject.toml index dbb7c7e..79ad530 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -4,7 +4,7 @@ build-backend = "setuptools.build_meta" [project] name = "yaboli" -version = "1.1.5" +version = "1.2.0" dependencies = [ "websockets >=10.3, <11" ]