Remove broken libraries & functionality, format slash command usage

pull/104/head
Stijn De Clercq 2022-02-05 21:24:08 +01:00
parent 06dc3d3fb9
commit 7ad2bf351e
9 changed files with 18 additions and 223 deletions

View File

@ -1,82 +0,0 @@
from discord.ext import ipc
from functions.database import custom_commands
import json
from quart import Quart, jsonify, request
from quart_cors import cors
from time import time
app = Quart(__name__)
# TODO allow_origin=re.compile(r"http://localhost:.*")
# needs higher Python & Quart version
app = cors(app, allow_origin="*")
app.config.from_object(__name__)
ipc_client = ipc.Client(secret_key="SOME_SECRET_KEY")
@app.route("/ping", methods=["GET"])
async def ping():
"""
Send a ping request, monitors bot latency and endpoint time
"""
latency = await ipc_client.request("get_bot_latency")
return jsonify({"bot_latency": latency, "response_sent": time()})
@app.route("/dm", methods=["POST"])
async def send_dm():
"""
Send a DM to the given user
"""
data = json.loads((await request.body).decode('UTF-8'))
dm = await ipc_client.request(
"send_dm",
user=int(data["userid"]),
message=data.get("message")
)
return jsonify({"response": dm})
@app.route("/custom", methods=["GET"])
async def get_all_custom_commands():
"""
Return a list of all custom commands in the bot
"""
commands = custom_commands.get_all()
return jsonify(commands)
@app.route("/custom/<command_id>")
async def get_custom_command(command_id):
try:
command_id = int(command_id)
except ValueError:
# Id is not an int
return unprocessable_entity("Parameter id was not a valid integer.")
command = custom_commands.get_by_id(command_id)
if command is None:
return page_not_found("")
return jsonify(command)
@app.errorhandler(404)
def page_not_found(e):
return jsonify({"error": "No resource could be found matching the given URL."}), 404
@app.errorhandler(422)
def unprocessable_entity(e):
return jsonify({"error": e}), 422
if __name__ == "__main__":
app.run()

View File

@ -1,11 +1,10 @@
from dislash import SlashInteraction from discord import Interaction
from data import constants from data import constants
from data.snipe import Snipe, Action, should_snipe from data.snipe import Snipe, Action, should_snipe
import datetime import datetime
import discord import discord
from discord.ext import commands from discord.ext import commands
from dislash.application_commands.errors import InteractionCheckFailure
from functions import checks, easterEggResponses, stringFormatters from functions import checks, easterEggResponses, stringFormatters
from functions.database import stats, muttn, custom_commands, commands as command_stats from functions.database import stats, muttn, custom_commands, commands as command_stats
import pytz import pytz
@ -86,6 +85,7 @@ class Events(commands.Cog):
Logs commands in your terminal. Logs commands in your terminal.
:param ctx: Discord Context :param ctx: Discord Context
""" """
print("a")
print(stringFormatters.format_command_usage(ctx)) print(stringFormatters.format_command_usage(ctx))
command_stats.invoked(command_stats.InvocationType.TextCommand) command_stats.invoked(command_stats.InvocationType.TextCommand)
@ -123,24 +123,27 @@ class Events(commands.Cog):
await self.sendErrorEmbed(err, "Command", usage) await self.sendErrorEmbed(err, "Command", usage)
@commands.Cog.listener() @commands.Cog.listener()
async def on_slash_command(self, interaction: SlashInteraction): async def on_interaction(self, interaction: Interaction):
""" """
Function called whenever someone uses a slash command Function called whenever someone uses a slash command
""" """
if not interaction.is_command():
return
print(stringFormatters.format_slash_command_usage(interaction)) print(stringFormatters.format_slash_command_usage(interaction))
command_stats.invoked(command_stats.InvocationType.SlashCommand) command_stats.invoked(command_stats.InvocationType.SlashCommand)
@commands.Cog.listener() @commands.Cog.listener()
async def on_slash_command_error(self, interaction, err): async def on_application_command_error(self, ctx: discord.ApplicationContext, err):
# Debugging Didier shouldn't spam the error logs # Debugging Didier shouldn't spam the error logs
if self.client.user.id != int(constants.didierId): if self.client.user.id != int(constants.didierId):
raise err raise err
if isinstance(err, InteractionCheckFailure): if isinstance(err, commands.CheckFailure):
return await interaction.reply("Je hebt geen toegang tot dit commando.", ephemeral=True) return await ctx.respond("Je hebt geen toegang tot dit commando.", ephemeral=True)
usage = stringFormatters.format_slash_command_usage(interaction) usage = stringFormatters.format_slash_command_usage(ctx.interaction)
await self.sendErrorEmbed(err, "Slash Command", usage) await self.sendErrorEmbed(err, "Slash Command", usage)
@commands.Cog.listener() @commands.Cog.listener()

View File

@ -1,27 +0,0 @@
from discord.ext import commands, ipc
class IPC(commands.Cog):
def __init__(self, client):
self.client = client
@ipc.server.route()
async def send_dm(self, data):
print("got here")
user = self.client.get_user(data.user)
await user.send(data.message)
print("sent")
return True
@ipc.server.route()
async def get_bot_latency(self, data):
"""
Get Didier's latency
"""
return self.client.latency * 1000
def setup(client):
# client.add_cog(IPC(client))
pass

View File

@ -1,88 +0,0 @@
import datetime
import json
from discord.ext import commands
from dislash import SlashInteraction, slash_command, Option, OptionType, check
from functions.checks import isMe
from functions.timeFormatters import fromString
from startup.didier import Didier
class DBSlash(commands.Cog):
def __init__(self, client: Didier):
self.client: Didier = client
@slash_command(name="db")
@check(isMe)
async def _db_slash(self, interaction: SlashInteraction):
pass
@_db_slash.sub_command_group(name="add")
async def _add_slash(self, interaction: SlashInteraction):
pass
@_add_slash.sub_command(
name="deadline",
options=[
Option(
"year",
description="Year (1-based)",
type=OptionType.INTEGER,
required=True
),
Option(
"course",
description="Course (abbreviated)",
type=OptionType.STRING,
required=True
),
Option(
"name",
description="Name of the deadline/project",
type=OptionType.STRING,
required=True
),
Option(
"date",
description="Date (DD/MM)",
type=OptionType.STRING,
required=True
),
Option(
"time",
description="Timestamp (HH:MM or HH:MM:SS)",
type=OptionType.STRING,
required=False
)
]
)
async def _add_deadline_slash(self, interaction: SlashInteraction, year: int, course: str, name: str, date: str, time: str = "00:00:00"):
with open("files/deadlines.json", "r") as f:
deadlines = json.load(f)
date += "/" + str(datetime.datetime.now().year)
# Fix format
if time.count(":") == 1:
time += ":00"
dt = fromString(f"{date} {time}", formatString="%d/%m/%Y %H:%M:%S", tzinfo=None)
# Add year & course if necessary
if str(year) not in deadlines:
deadlines[str(year)] = {}
if course not in deadlines[str(year)]:
deadlines[str(year)][course] = {}
deadlines[str(year)][course][name] = round(dt.timestamp())
with open("files/deadlines.json", "w") as f:
json.dump(deadlines, f)
await interaction.reply("Addition successful", ephemeral=True)
def setup(client: Didier):
# client.add_cog(DBSlash(client))
pass

View File

@ -1,12 +1,9 @@
import discord import discord
from dotenv import load_dotenv
from functions.prefixes import get_prefix from functions.prefixes import get_prefix
from settings import STATUS_MESSAGE, TOKEN from settings import STATUS_MESSAGE, TOKEN
from startup.didier import Didier from startup.didier import Didier
if __name__ == "__main__": if __name__ == "__main__":
load_dotenv(verbose=True)
# Activities # Activities
activity = discord.Activity(type=discord.ActivityType.playing, name=STATUS_MESSAGE) activity = discord.Activity(type=discord.ActivityType.playing, name=STATUS_MESSAGE)
status = discord.Status.online status = discord.Status.online

View File

@ -1,7 +1,7 @@
import traceback import traceback
from discord import Interaction
from discord.ext.commands import Context from discord.ext.commands import Context
from dislash import SlashInteraction
def title_case(string): def title_case(string):
@ -42,16 +42,15 @@ def format_command_usage(ctx: Context) -> str:
return f"{ctx.author.display_name} in {_format_error_location(ctx)}: {ctx.message.content}" return f"{ctx.author.display_name} in {_format_error_location(ctx)}: {ctx.message.content}"
def format_slash_command_usage(interaction: SlashInteraction) -> str: def format_slash_command_usage(interaction: Interaction) -> str:
# Create a string with the options used # Create a string with the options used
# TODO look into the format used by the lib because it's terrible
options = " ".join(list(map( options = " ".join(list(map(
lambda option: f"{option.name}: \"{option.value}\"", lambda o: f"{o['name']}: \"{o['value']}\"",
interaction.data.options.values() interaction.data.get("options", [])
))) )))
command = f"{interaction.slash_command.name} {options or ''}" command = f"{interaction.data['name']} {options or ''}"
return f"{interaction.author.display_name} in {_format_error_location(interaction)}: /{command}" return f"{interaction.user.display_name} in {_format_error_location(interaction)}: /{command}"
def get_edu_year(index: int) -> str: def get_edu_year(index: int) -> str:

View File

@ -13,8 +13,6 @@ tabulate==0.8.7
yarl==1.4.2 yarl==1.4.2
feedparser==6.0.2 feedparser==6.0.2
googletrans==4.0.0rc1 googletrans==4.0.0rc1
quart==0.15.1
Quart-CORS==0.5.0
attrs~=21.2.0 attrs~=21.2.0
dacite~=1.6.0 dacite~=1.6.0
pytest==6.2.4 pytest==6.2.4

View File

@ -4,7 +4,7 @@ from dotenv import load_dotenv
import os import os
load_dotenv() load_dotenv(verbose=True)
def _to_bool(value: str) -> bool: def _to_bool(value: str) -> bool:
@ -31,7 +31,6 @@ DB_NAME = os.getenv("DBNAME", "")
# Discord-related # Discord-related
TOKEN = os.getenv("TOKEN", "") TOKEN = os.getenv("TOKEN", "")
HOST_IPC = _to_bool(os.getenv("HOSTIPC", "false"))
READY_MESSAGE = os.getenv("READYMESSAGE", "I'M READY I'M READY I'M READY I'M READY") # Yes, this is a Spongebob reference READY_MESSAGE = os.getenv("READYMESSAGE", "I'M READY I'M READY I'M READY I'M READY") # Yes, this is a Spongebob reference
STATUS_MESSAGE = os.getenv("STATUSMESSAGE", "with your Didier Dinks.") STATUS_MESSAGE = os.getenv("STATUSMESSAGE", "with your Didier Dinks.")

View File

@ -1,6 +1,5 @@
from data.snipe import Snipe from data.snipe import Snipe
from discord.ext import commands from discord.ext import commands
from dislash import InteractionClient
import os import os
from startup.init_files import check_all from startup.init_files import check_all
from typing import Dict from typing import Dict
@ -10,9 +9,6 @@ class Didier(commands.Bot):
""" """
Main Bot class for Didier Main Bot class for Didier
""" """
# Reference to interactions client
interactions: InteractionClient
# Dict to store the most recent Snipe info per channel # Dict to store the most recent Snipe info per channel
snipe: Dict[int, Snipe] = {} snipe: Dict[int, Snipe] = {}
@ -20,7 +16,7 @@ class Didier(commands.Bot):
super().__init__(*args, **kwargs) super().__init__(*args, **kwargs)
# Cogs that should be loaded before the others # Cogs that should be loaded before the others
self._preload = ("ipc", "utils", "failedchecks", "events",) self._preload = ("utils", "failedchecks", "events",)
# Remove default help command # Remove default help command
self.remove_command("help") self.remove_command("help")