From 147182a900dac3ae92f8ef2cdd7c78c8c69af215 Mon Sep 17 00:00:00 2001 From: klemek Date: Sun, 30 Aug 2020 15:01:26 +0200 Subject: [PATCH] Changing name+structure --- .gitignore | 5 +++ README.md | 62 +++++++++++++++++++++++++++++++++++++ main.py | 8 ----- miniscord/__init__.py | 1 + bot.py => miniscord/bot.py | 5 +-- sample.jpg | Bin 0 -> 22460 bytes 6 files changed, 71 insertions(+), 10 deletions(-) create mode 100644 README.md delete mode 100644 main.py create mode 100644 miniscord/__init__.py rename bot.py => miniscord/bot.py (98%) create mode 100644 sample.jpg diff --git a/.gitignore b/.gitignore index 738e240..b024370 100644 --- a/.gitignore +++ b/.gitignore @@ -4,3 +4,8 @@ __pycache__ .env error_* *.log +test.py +*.pyc +.pytest_cache +.coverage +tmp \ No newline at end of file diff --git a/README.md b/README.md new file mode 100644 index 0000000..9bcd9a8 --- /dev/null +++ b/README.md @@ -0,0 +1,62 @@ +[![Total alerts](https://img.shields.io/lgtm/alerts/g/Klemek/miniscord.svg?logo=lgtm&logoWidth=18)](https://lgtm.com/projects/g/Klemek/miniscord/alerts/) +[![Language grade: Python](https://img.shields.io/lgtm/grade/python/g/Klemek/miniscord.svg?logo=lgtm&logoWidth=18)](https://lgtm.com/projects/g/Klemek/miniscord/context:python) +[![Coverage Status](https://coveralls.io/repos/github/Klemek/miniscord/badge.svg?branch=master)](https://coveralls.io/github/Klemek/miniscord?branch=master) + +# Miniscord +*A minimalist discord bot API* + +```python +from miniscord import Bot +import discord + + +async def hello(client: discord.client, message: discord.Message, *args: str): + await message.channel.send("Hello!") + + +bot = Bot( + "test-app", # name + "0.1-alpha", # version + alias="|" # respond to '|command' messages +) +bot.register_command( + "hello", # command text (regex) + hello, # command function + "hello: says 'Hello!'", # short help + f"```\n" # long help + f"* |help\n" + f"\tSays 'Hello!'.\n" + f"```" +) +bot.start() +# this bot respond to "|help", "|info" and "|hello" +``` + +![](./sample.jpg) + +> **⚠ Disclaimer:** I intend to use this project personally, I'm open to ideas but I don't care if it doesn't work for you. Same for the name, feel free to use it, I'm not registering it on PyPI + +## Features + +*TODO* + +## Installation + +*TODO* + +## Documentation + +*TODO* + +## Versions + +*TODO* + +## TODO + +* Finish README.md +* Write tests +* Add comments to code +* Separate branches +* Working CI +* Fix bugs \ No newline at end of file diff --git a/main.py b/main.py deleted file mode 100644 index 852955d..0000000 --- a/main.py +++ /dev/null @@ -1,8 +0,0 @@ -import logging -from bot import Bot - -logging.basicConfig(format="[%(asctime)s][%(levelname)s][%(module)s] %(message)s", level=logging.INFO) - -bot = Bot("test-app", "0.1-alpha", alias="|") -bot.log_calls = True -bot.start() diff --git a/miniscord/__init__.py b/miniscord/__init__.py new file mode 100644 index 0000000..e34e5d9 --- /dev/null +++ b/miniscord/__init__.py @@ -0,0 +1 @@ +from .bot import Bot diff --git a/bot.py b/miniscord/bot.py similarity index 98% rename from bot.py rename to miniscord/bot.py index 58a0af3..6b72386 100644 --- a/bot.py +++ b/miniscord/bot.py @@ -70,7 +70,7 @@ class Bot(object): self.alias = alias # can call bot with {alias}{command_name} self.any_mention = False # bot mention can be anywhere self.log_calls = False - self.guild_logs_file = "guilds.log" + self.guild_logs_file = "../guilds.log" self.enforce_write_permission = True self.lower_command_names = True self.game_change_delay = 10 @@ -197,6 +197,7 @@ class Bot(object): f" #{message.channel} in server '{message.guild}'") return await command.compute(self.client, message, *command_args) + break async def on_guild_join(self, guild: discord.guild): if self.guild_logs_file is not None: @@ -210,7 +211,7 @@ class Bot(object): pass def register_command(self, regex: str, compute: CommandFunction, help_short: str, help_long: str): - self.__commands += [Command(regex, compute, help_short, help_long)] + self.__commands.insert(0, Command(regex, compute, help_short, help_long)) def start(self): logging.info(f"Current PID: {os.getpid()}") diff --git a/sample.jpg b/sample.jpg new file mode 100644 index 0000000000000000000000000000000000000000..527b82162560718487c6d2904d04141913932193 GIT binary patch literal 22460 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 literal 0 HcmV?d00001