From dba54ea080f129ea45fc68b79c3708b5133aa3eb Mon Sep 17 00:00:00 2001 From: kevincaires Date: Sat, 20 Aug 2022 11:04:01 -0300 Subject: [PATCH 1/4] ADD constant config IMAGE_TYPES. --- settings/config.py | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/settings/config.py b/settings/config.py index a6b3dc7..853cafb 100644 --- a/settings/config.py +++ b/settings/config.py @@ -68,7 +68,7 @@ LOGGING_CONFIG = { }, }, } - +logger.dictConfig(LOGGING_CONFIG) ## INSTRUCTIONS ON SETTING UP PERMISSIONS: # Permissions are now granular, more than one distinct role @@ -80,4 +80,7 @@ PERMISSIONS = { 'v' : ['Operador', 'BotMan'] } -logger.dictConfig(LOGGING_CONFIG) +# Tuple of image type on image links. +# e.g: https://cdn.discordapp.com/attachments/720808802340962357/988542480981061702/cat.jpeg +# e.g: https://cdn.discordapp.com/attachments/720808802340962357/988542480981061702/unknow.png +IMAGE_TYPES = ('jpeg','jpg','png') From 05e54faa55d8f733abb089d13e2d4c1a55baa351 Mon Sep 17 00:00:00 2001 From: kevincaires Date: Sat, 20 Aug 2022 11:04:34 -0300 Subject: [PATCH 2/4] CHANGE python syntax. --- utils/commands.py | 61 +++++++++++++++++++++++++---------------------- 1 file changed, 32 insertions(+), 29 deletions(-) diff --git a/utils/commands.py b/utils/commands.py index 506cc25..440c36f 100644 --- a/utils/commands.py +++ b/utils/commands.py @@ -5,39 +5,44 @@ import logging from random import choice from discord.ext import commands +from settings.config import IMAGE_TYPES, PERMISSIONS -from utils.database import get_by_id, get_quotes, remove_quote, set_quote, count_quotes - -from settings.config import PERMISSIONS +from utils.database import (count_quotes, get_by_id, get_quotes, remove_quote, + set_quote) client = commands.Bot(command_prefix='--') logger = logging.getLogger(__name__) quote_id_stack = [] + @client.command(aliases=['q']) async def quote(bot: object, *quote: str) -> str: """ Saves a quote into the database. """ if not quote: - return await bot.send('You\'re not my mute uncle, tell me something to remember.\n(You haven\'t provided a quote)') + return await bot.send('You\'re not my mute uncle, tell me something to remember.\n'\ + '(You haven\'t provided a quote)') quote = ' '.join(quote) - if 'http' in quote and 'discord' in quote and not quote[-4:] == '.png': - return await bot.send("- _Check your link, dumbass! You're trying to quote an image from a message, but you're quoting the message itself!_\n"\ - '(Make sure to copy the link for the image by clicking on it, right-clicking the image and then clicking on "Save Link")') + if 'http' in quote and 'discord' in quote and not quote[-4:] in IMAGE_TYPES: + return await bot.send("- _Check your link, dumbass! You're trying to quote an image from a"\ + " 'message, but you're quoting the message itself!_\n"\ + "'(Make sure to copy the link for the image by clicking on it, right-clicking the "\ + "image and then clicking on \"Save Link\")'") try: user = bot.author.name qtid = set_quote(user, quote) except Exception as ex: if ex.args[0].find("Duplicate") != -1: - return await bot.send("There's already a quote from that same person, with that exact match!") + return await bot.send("There's already a quote from that same person, with that "\ + "exact match!") return await bot.send(f'{ex.args}\n_What the fuck are you doing?_') else: - return await bot.send("Done: `" + quote + "` ID: `" + str(qtid) + "`") + return await bot.send(f"Done: `{quote}\n` ID: `{qtid}`") @client.command(aliases=['rq']) @@ -53,7 +58,8 @@ async def random_quote(bot: object) -> str: quote_id_stack.pop(0) quotes = get_quotes(quote_id_stack) elif not quotes: - return await bot.send('You\'ve got no quotes saved yet.\n(Save quotes by using `--q str: @client.command(aliases=['qid']) -async def by_id(bot, _id: int=None) -> str: +async def by_id(bot: object, _id: int=None) -> str: """ Gets one quote by ID. """ syntax = "`--qid `" if not _id: - return await bot.send(f"_If you don't tell me the ID, how the fuck do you expect me to quote it to you!?_\n(The correct syntax is {syntax})") - - if not isinstance(_id, int): - return await bot.send(f"_Don't fuck with me, you asshole. The ID needs to be an interger!_\n(The correct syntax is {syntax})") + return await bot.send("_If you don't tell me the ID, how the fuck do you expect me to "\ + f"quote it to you!?_\n(The correct syntax is {syntax})") quote = get_by_id(_id) @@ -107,22 +111,20 @@ async def delete_quote(bot, _id: int=None) -> str: syntax = "`--dq `" roles = [r.name for r in bot.author.roles] PermStatus = False - + if len(PERMISSIONS['dq']) < 1 or not len(set(PERMISSIONS['dq']).intersection(roles)) < 1: PermStatus = True if not PermStatus: return await bot.send("_And who the fuck do **YOU** think you are!?_.\n"\ "(You don't have the necessary role for this command)") - - if not _id: - return await bot.send(f"_If you don't tell me the ID, how the fuck do you expect me to delete it to you!?_\n(The correct syntax is {syntax})") - if not isinstance(_id, int): - return await bot.send(f"_Don't fuck with me, you asshole. The ID needs to be an interger!_\n(The correct syntax is {syntax})") + if not _id: + return await bot.send("_If you don't tell me the ID, how the fuck do you expect me to "\ + f"delete it to you!?_\n(The correct syntax is {syntax})") quote = get_by_id(_id) - + if not quote: return await bot.send(f"_Wrong ID, sucker!_\n(There's no such quote with id {_id})") @@ -133,7 +135,7 @@ async def delete_quote(bot, _id: int=None) -> str: except Exception as ex: return await bot.send(ex) - + @client.command(aliases=['qstack']) async def queue_stack(bot: object) -> str: @@ -143,19 +145,18 @@ async def queue_stack(bot: object) -> str: return await bot.send('A list of the 5 latest message IDs follows:'\ f' `{",".join(str(q) for q in quote_id_stack[-5:])}`') + @client.command(aliases=['cq', 'cquotes']) async def quote_count(bot: object) -> str: """ Outputs a quote count from the database """ - amount = count_quotes() - amount = str(amount) - - msg = "Quote count: `" + amount + "`" + msg = f"Quote count: `{amount}`" return await bot.send(msg) + @client.command(aliases=['v', 'version']) async def info(bot: object) -> str: """ @@ -174,8 +175,10 @@ async def info(bot: object) -> str: motd = open("./motd", mode='r') text = motd.readlines() fullbanner = "" + for lines in text: fullbanner = fullbanner + lines - msg = f'''```\n''' + fullbanner + f'''\n```''' - return await bot.send(msg) \ No newline at end of file + msg = f'''```\n{fullbanner}\n```''' + + return await bot.send(msg) From 1553abf55277d7285ce1db5bcaab9a9b67a4a3f9 Mon Sep 17 00:00:00 2001 From: kevincaires Date: Sat, 20 Aug 2022 12:49:26 -0300 Subject: [PATCH 3/4] ADD command to get quote by a part of text. --- utils/commands.py | 27 +++++++++++++++++++++++++-- utils/database.py | 9 +++++++++ 2 files changed, 34 insertions(+), 2 deletions(-) diff --git a/utils/commands.py b/utils/commands.py index 440c36f..e664ee7 100644 --- a/utils/commands.py +++ b/utils/commands.py @@ -7,8 +7,8 @@ from random import choice from discord.ext import commands from settings.config import IMAGE_TYPES, PERMISSIONS -from utils.database import (count_quotes, get_by_id, get_quotes, remove_quote, - set_quote) +from utils.database import (count_quotes, get_by_id, get_quote_contains, + get_quotes, remove_quote, set_quote) client = commands.Bot(command_prefix='--') logger = logging.getLogger(__name__) @@ -182,3 +182,26 @@ async def info(bot: object) -> str: msg = f'''```\n{fullbanner}\n```''' return await bot.send(msg) + + +@client.command(aliases=['qcontains', 'qsearch']) +async def quote_contains(bot: object, part: str) -> str: + """ + Filter quote by part of saved message. + """ + syntax = '--qcontains ' + + if not part: + return await bot.send("_If you don't tell me the part, how the fuck do you expect me to "\ + f"find it to you!?_\n(The correct syntax is {syntax})") + + quotes = get_quote_contains(part) + + if not quotes: + return await bot.send(f"_Wrong text, sucker!_\n(There's no such quote with text `{part}`)") + + for quote in quotes: + await bot.send(f'```\nID: {quote.id}\nMessage: {quote.quote[:10]} ... '\ + f'{quote.quote[-10:]}\nUser: {quote.user}\n```') + + return diff --git a/utils/database.py b/utils/database.py index 40e57d8..ec34037 100644 --- a/utils/database.py +++ b/utils/database.py @@ -114,3 +114,12 @@ def count_quotes() -> int: with Session(SQLACHEMY) as session: response = session.query(Quotes.id).count() return response + + +def get_quote_contains(part: str) -> tuple: + """ + Get quotes by part of message. + """ + with Session(SQLACHEMY) as session: + response = session.query(Quotes).filter(Quotes.quote.contains(part)) + return (r for r in response) From bdf0039c8d355c8326739cb58c0b5f1458cd770e Mon Sep 17 00:00:00 2001 From: kevincaires Date: Sat, 20 Aug 2022 12:57:42 -0300 Subject: [PATCH 4/4] CHANGE version. --- motd | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/motd b/motd index abcd8da..f407ab6 100644 --- a/motd +++ b/motd @@ -5,7 +5,7 @@ █ ▄ █ ▄▄▄█ ▄▄▄█ ▄ ██ █▄▄▄█ ▄▄▄█ █ █ █ █ █▄▄▄█ █▄▄▄█ █▄█ █ █ █▄▄▄ █▄█ █▄▄█▄▄▄▄▄▄▄█▄▄▄▄▄▄▄█▄▄▄▄▄▄▄█▄▄▄▄▄▄▄█▄▄▄▄▄▄▄█ -Neeble version: 2022.08.20 +Neeble version: 2022.08.20a You can help the development of neeble in https://github.com/KevinCaires/neeble Thank you! \ No newline at end of file