From 04cd9489ac3c4f5bd9bc10b71d302c4971860c48 Mon Sep 17 00:00:00 2001 From: retoor Date: Mon, 10 Feb 2025 23:12:50 +0100 Subject: [PATCH] Added build to repository. --- .gitignore | 2 - dist/snekbot-1.0.0-py3-none-any.whl | Bin 0 -> 6896 bytes dist/snekbot-1.0.0.tar.gz | Bin 0 -> 6387 bytes src/snekbot.egg-info/PKG-INFO | 128 +++++++++++++++++++++++++++- src/snekbot.egg-info/SOURCES.txt | 1 + 5 files changed, 128 insertions(+), 3 deletions(-) create mode 100644 dist/snekbot-1.0.0-py3-none-any.whl create mode 100644 dist/snekbot-1.0.0.tar.gz diff --git a/.gitignore b/.gitignore index f544350..4654152 100644 --- a/.gitignore +++ b/.gitignore @@ -2,5 +2,3 @@ __pycache__/ .backup* .history/ -build/ -dist/ diff --git a/dist/snekbot-1.0.0-py3-none-any.whl b/dist/snekbot-1.0.0-py3-none-any.whl new file mode 100644 index 0000000000000000000000000000000000000000..4b50bf30a7183919bdc49a4386e7f7ef2f9b7059 GIT binary patch literal 6896 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 H?e6~o0MI%M literal 0 HcmV?d00001 diff --git a/dist/snekbot-1.0.0.tar.gz b/dist/snekbot-1.0.0.tar.gz new file mode 100644 index 0000000000000000000000000000000000000000..ff7824f593344c38cf34997c3f64604e82cc6570 GIT binary patch literal 6387 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 Keywords: chat,snek,molodetz,bot -Requires-Python: >=3.12 +Requires-Python: >=3 Description-Content-Type: text/markdown License-File: LICENSE.txt Requires-Dist: aiohttp + +# Snekbot API + +This is the Snekbot API. This document describes how to create a bot responding to "hello", "bye" and "@username-of-bot". + +## 5 minute tutorial + +Literally. + +### Installation +#### Requirements: +Python: + - python3 + - python3-venv + - python3-pip +Use apt or your package manager to install these packages. There is a big chance your system already has them. + +For Debian (Ubuntu): `sudo apt install python3 python3-venv python3-pip -y` + +#### Environment + - `python3 -m venv venv` + - `source venv/bin/activate` + - `pip install git+https://molodetz.nl/retoor/snekbot.git` + +#### Create account +Create regular user account for your bot. You need this later in your script. +Make sure you have this information right now: + - bot username + - bot password + - bot url (wss://your-snek-instance.com/rpc.ws) + +#### Create a file +Open a file ending with the `.py` extension and paste this content. Replace the authentication details on the bottom lines with the one of the account you just created. + +```python +import asyncio + +from snekbot.bot import Bot + + +class ExampleBot(Bot): + + async def on_join(self, channel_uid): + print(f"I joined!") + await self.send_message( + channel_uid, + f"Hello, i'm actively part of the conversation in channel {channel_uid} now, you don't have to mention me anymore. " + ) + + async def on_leave(self, channel_uid): + print(f"I left!!") + await self.send_message( + channel_uid, + "I stop actively being part of the conversation now. Bye!" + ) + + async def on_ping(self,username, user_nick, channel_uid, message): + print(f"Ping from {user_nick} in channel {channel_uid}: {message}") + await self.send_message( + channel_uid, + "pong " + message + ) + + async def on_own_message(self, data): + print(f"Received my own message: {data.message}") + + async def on_mention(self, username, user_nick, channel_uid, message): + + message = message[len(self.username) + 2 :] + print(f"Mention from {user_nick}: {message}") + + if "source" in message: + with open(__file__) as f: + result = f.read() + result = result.replace(f'"{self.username}"', '"example username"') + result = result.replace(self.password, "example password") + result = ( + "This is the actual source code running me now. Fresh from the bakery:\n\n```python\n" + + result + + "\n```" + ) + await self.send_message(channel_uid, result) + else: + await self.send_message(channel_uid, f'Hey {user_nick}, Thanks for mentioning me "{message}".') + + async def on_message(self, sender_username, sender_nick, channel_uid, message): + print(f"Message from {sender_nick}: {message}") + if not self.has_joined(channel_uid): + print(f"Probably not for me since i'm not mentioned and not joined yet") + return + message = message.lower() + result = None + if "hello" in message: + result = f"Hi @{sender_nick}" + elif "bye" in message: + result = f"Bye @{sender_nick}" + + if result: + await self.send_message(channel_uid, result) + + +bot = ExampleBot(url="ws://snek.molodetz.nl/rpc.ws", username="example", password="example") +asyncio.run(bot.run()) +``` + +#### Run the bot +Make sure you have (still) activated your virtual env. +```bash +python [your-script].py +``` +If you get the error 'python not found' or 'aiohttp not found', run `source .venv/bin/activate` again and run `python [your script].py` again. + +#### Debugging +Add `import logging` and `logging.BasicConfig(level=logging.DEBUG)`. + +#### Summary +The `ExampleBot` class inherits from a base `Bot` class and implements several event handlers: + - `on_join`: Sends a welcome message when the bot joins a channel. + - `on_leave`: Sends a goodbye message when the bot leaves. + - `on_ping`: Responds with "pong" when it receives a ping message. + - `on_own_message`: Logs messages sent by the bot itself. + - `on_mention`: Handles mentions; if "source" is in the message, it replies with its own source code, with sensitive data disguised. + - `on_message`: Responds to "hello" and "bye" messages if the bot has joined the channel. +The bot will be instantiated and runs asynchronously. It will survive server deploys and network outages. If such issue occurs, it will try to reconnect within a second like nothing happened. It's production ready. + + diff --git a/src/snekbot.egg-info/SOURCES.txt b/src/snekbot.egg-info/SOURCES.txt index ec26950..920c1ef 100644 --- a/src/snekbot.egg-info/SOURCES.txt +++ b/src/snekbot.egg-info/SOURCES.txt @@ -1,4 +1,5 @@ LICENSE.txt +README.md pyproject.toml src/snekbot/__init__.py src/snekbot/__main__.py