Merge pull request #58 from stijndcl/custom_commands

Custom commands
pull/64/head
Stijn De Clercq 2021-05-17 20:39:37 +02:00 committed by GitHub
commit a06fcdefe0
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
7 changed files with 191 additions and 2 deletions

View File

@ -3,7 +3,7 @@ import datetime
import discord import discord
from discord.ext import commands from discord.ext import commands
from functions import checks, easterEggResponses from functions import checks, easterEggResponses
from functions.database import stats, muttn from functions.database import stats, muttn, custom_commands
import pytz import pytz
import time import time
import traceback import traceback
@ -75,6 +75,12 @@ class Events(commands.Cog):
if eER: if eER:
await message.channel.send(eER) await message.channel.send(eER)
# Check for custom commands
custom = custom_commands.is_custom_command(message)
if custom.id is not None:
await message.channel.send(custom.response)
# Earn XP & Message count # Earn XP & Message count
stats.sentMessage(message) stats.sentMessage(message)

View File

@ -8,6 +8,8 @@ from functions.database import memes, githubs, twitch, dadjoke
import json import json
import os import os
from functions.database.custom_commands import is_name_free, add_command, add_alias
class ModCommands(commands.Cog): class ModCommands(commands.Cog):
@ -106,13 +108,35 @@ class ModCommands(commands.Cog):
return await ctx.send("Ik kan geen bericht zien met dit Id.") return await ctx.send("Ik kan geen bericht zien met dit Id.")
await message.add_reaction(emoji) await message.add_reaction(emoji)
# Adds stuff into their databases
@commands.group(name="Add", usage="[Category] [Args]", case_insensitive=True, invoke_without_command=False) @commands.group(name="Add", usage="[Category] [Args]", case_insensitive=True, invoke_without_command=False)
@commands.check(checks.isMe) @commands.check(checks.isMe)
@help.Category(category=Category.Mod) @help.Category(category=Category.Mod)
async def add(self, ctx): async def add(self, ctx):
"""
Commands group that adds database entries
"""
pass pass
@add.command(name="Custom", usage="[Name] [Response]")
async def custom(self, ctx, name, *, resp):
err_msg = add_command(name, resp)
# Something went wrong
if err_msg:
return await ctx.send(err_msg)
else:
await ctx.message.add_reaction("")
@add.command(name="Alias", usage="[Name] [Alias]")
async def add_alias(self, ctx, command, alias):
err_msg = add_alias(command, alias)
# Something went wrong
if err_msg:
return await ctx.send(err_msg)
else:
await ctx.message.add_reaction("")
@add.command(name="Dadjoke", aliases=["Dj", "Dad"], usage="[Joke]") @add.command(name="Dadjoke", aliases=["Dj", "Dad"], usage="[Joke]")
async def dadjoke(self, ctx, *, joke): async def dadjoke(self, ctx, *, joke):
dadjoke.addJoke(joke) dadjoke.addJoke(joke)

View File

View File

@ -0,0 +1,12 @@
from attr import dataclass
@dataclass
class CustomCommand:
"""
Class to store custom commands being triggered
"""
id: int = None
name: str = None
response: str = None
alias_used: str = None

View File

@ -40,6 +40,22 @@ Used in all Currency commands (Dinks, Bank, Bitcoin, Gambling, ...)
9 nightly: integer, default 0 | The timestamp when the user last claimed their Nightly 9 nightly: integer, default 0 | The timestamp when the user last claimed their Nightly
10 nightly_streak: integer, default 0 | The user's current Nightly Streak 10 nightly_streak: integer, default 0 | The user's current Nightly Streak
### custom_commands
Used to store custom commands that replace Dyno.
0 id: integer, auto-increment, unique, primary key | The id of the command
1 name: text, unique | The name of the command
2 response: text | The response sent when the command is used
### custom_command_aliases
Used to store aliases for custom commands.
0 id: integer, auto-increment, unique, primary key | The id of the alias
2 command: integer | The id of the command this alias is for
3 alias: text, unique | The name of the alias
### dad_jokes ### dad_jokes
Used in fun.py - Dadjoke command. Used in fun.py - Dadjoke command.

View File

@ -2,6 +2,8 @@
"8ball": "Magic 8-Ball Didier beantwoordt ja/nee vragen.", "8ball": "Magic 8-Ball Didier beantwoordt ja/nee vragen.",
"add": "Voegt [Args] toe aan [Categorie].", "add": "Voegt [Args] toe aan [Categorie].",
"add 8-ball": "Voegt een 8-Ball response toe aan de database.", "add 8-ball": "Voegt een 8-Ball response toe aan de database.",
"add alias": "Voegt een alias voor custom commands toe aan de database.",
"add custom": "Voegt custom commands toe aan de database.",
"add dadjoke": "Voegt een Dadjoke toe aan de database.", "add dadjoke": "Voegt een Dadjoke toe aan de database.",
"add github": "Voegt iemand's GitHub link toe aan de database.", "add github": "Voegt iemand's GitHub link toe aan de database.",
"add meme": "Voegt een meme toe aan de database.", "add meme": "Voegt een meme toe aan de database.",

View File

@ -0,0 +1,129 @@
from data.database_classes.custom_commands import CustomCommand
import discord
from functions.database import utils
def is_custom_command(message: discord.Message) -> CustomCommand:
"""
Check if a message triggers a custom command
These use "?" as a prefix
"""
content = message.content
# Message didn't call a custom command
if not content.startswith("?"):
return CustomCommand()
# Can't be invoked by bots to prevent spam (@RPS)
if message.author.bot:
return CustomCommand()
# Ignore capitals & spaces, strip off prefix
content = content.lower().replace(" ", "")[1:]
by_name = _find_by_name(content)
# Command was found by its name
if by_name:
return CustomCommand(*by_name)
# Check if a command exists with this alias instead
return CustomCommand(*_find_by_alias(content), alias_used=content)
def _find_by_name(message):
"""
Find a command by its name
"""
connection = utils.connect()
cursor = connection.cursor()
cursor.execute("SELECT * FROM custom_commands WHERE name = %s", (message,))
return cursor.fetchone()
def _find_by_alias(message):
"""
Find a command by one of its aliases
"""
connection = utils.connect()
cursor = connection.cursor()
cursor.execute("SELECT command FROM custom_command_aliases WHERE alias = %s", (message,))
res = cursor.fetchone()
# No command matched this alias
if not res:
return ()
cursor.execute("SELECT * FROM custom_commands WHERE id = %s", (res,))
return cursor.fetchone()
def is_name_free(name) -> bool:
"""
Check if a name is already in use by a command
Includes aliases
"""
connection = utils.connect()
cursor = connection.cursor()
cursor.execute("SELECT id from custom_commands WHERE name = %s", (name,))
if cursor.fetchone():
return False
cursor.execute("SELECT id FROM custom_command_aliases WHERE alias = %s", (name,))
return cursor.fetchone() is None
def _clean(inp: str):
"""
Strip markdown and other stuff out of a command name
"""
return "".join(filter(lambda x: x.isalnum(), inp))
def add_command(name: str, response: str):
"""
Add a new custom command
"""
name = _clean(name.lower())
if not is_name_free(name):
return "Er is al een commando met deze naam."
connection = utils.connect()
cursor = connection.cursor()
cursor.execute("INSERT INTO custom_commands(name, response) VALUES (%s, E%s)", (name, response,))
connection.commit()
def add_alias(command: str, alias: str):
"""
Add an alias for a command
Assumes the command exists
"""
command = _clean(command.lower())
alias = _clean(alias.lower())
# Base command doesn't exist
if is_name_free(command):
return "Er is geen commando met deze naam."
# Alias already exists
if not is_name_free(alias):
return "Er is al een commando met deze naam."
# Find the id of the base command
command_id = CustomCommand(*_find_by_name(command)).id
connection = utils.connect()
cursor = connection.cursor()
cursor.execute("INSERT INTO custom_command_aliases(command, alias) VALUES(%s, %s)", (command_id, alias,))
connection.commit()