Skip to content
Merged
4 changes: 2 additions & 2 deletions .github/workflows/grace.yml
Original file line number Diff line number Diff line change
Expand Up @@ -22,13 +22,13 @@ jobs:
- name: Set up Python 3.10
uses: actions/setup-python@v3
with:
python-version: "3.10"
python-version: "3.11"

- name: Install dependencies
run: |
python -m pip install --upgrade pip
pip install flake8 pytest
pip install .
pip install .[dev]

- name: Lint with flake8
run: |
Expand Down
8 changes: 4 additions & 4 deletions bot/__init__.py
Original file line number Diff line number Diff line change
@@ -1,12 +1,12 @@
from grace.application import Application
from apscheduler.schedulers.asyncio import AsyncIOScheduler

from grace.application import Application

try:
from nltk.downloader import Downloader
from nltk import download, download_shell
from nltk.downloader import Downloader

download('vader_lexicon', quiet=True)
download("vader_lexicon", quiet=True)
except ModuleNotFoundError:
print("nltk module not properly installed")

Expand All @@ -17,9 +17,9 @@ def _create_bot(app):
Import is deferred to avoid circular dependency.
"""
from bot.grace import Grace

return Grace(app)


app = Application()
bot = _create_bot(app)

1 change: 0 additions & 1 deletion bot/classes/recurrence.py
Original file line number Diff line number Diff line change
Expand Up @@ -10,4 +10,3 @@ class Recurrence(Enum):

def __str__(self):
return self.name.capitalize()

5 changes: 2 additions & 3 deletions bot/classes/state.py
Original file line number Diff line number Diff line change
@@ -1,11 +1,10 @@
from enum import Enum, unique
from enum import IntEnum, unique


@unique
class State(Enum):
class State(IntEnum):
DISABLED = 0
ENABLED = 1

def __str__(self):
return self.name.capitalize()

94 changes: 48 additions & 46 deletions bot/extensions/bookmark_cog.py
Original file line number Diff line number Diff line change
@@ -1,56 +1,58 @@
from typing import List
from discord import Embed, Message, Interaction, File

from discord import Embed, File, Interaction, Message
from discord.app_commands import ContextMenu
from discord.ext.commands import Cog

from bot.grace import Grace


class BookmarkCog(Cog):
def __init__(self, bot: Grace) -> None:
self.bot: Grace = bot

save_message_ctx_menu: ContextMenu = ContextMenu(
name='Save Message',
callback=self.save_message
)

self.bot.tree.add_command(save_message_ctx_menu)

async def get_message_files(self, message: Message) -> List[File]:
"""Fetch files from the message attachments
:param message: Message to fetch files from
:type message: Message

:return: List of files
:rtype: List[File]
"""
return list(map(lambda attachment: attachment.to_file(), message.attachments))

async def save_message(self, interaction: Interaction, message: Message) -> None:
"""Saves the message
:param interaction: ContextMenu command interaction
:type interaction: Interaction
:param message: Message of the interaction
:type message: Message
"""
sent_at: int = int(message.created_at.timestamp())
files: List[File] = await self.get_message_files(message)

save_embed: Embed = Embed(
title='Bookmark Info',
color=self.bot.default_color
)

save_embed.add_field(name="Sent By", value=message.author, inline=False)
save_embed.add_field(name="Sent At", value=f'<t:{sent_at}>', inline=False)
save_embed.add_field(name="Original Message", value=f'[Jump]({message.jump_url})', inline=False)

await interaction.user.send(embed=save_embed)
await interaction.user.send(message.content, embeds=message.embeds, files=files)
await interaction.response.send_message("Message successfully saved.", ephemeral=True)
def __init__(self, bot: Grace) -> None:
self.bot: Grace = bot

save_message_ctx_menu: ContextMenu = ContextMenu(
name="Save Message", callback=self.save_message
)

self.bot.tree.add_command(save_message_ctx_menu)

async def get_message_files(self, message: Message) -> List[File]:
"""Fetch files from the message attachments

:param message: Message to fetch files from
:type message: Message

:return: List of files
:rtype: List[File]
"""
return list(map(lambda attachment: attachment.to_file(), message.attachments))

async def save_message(self, interaction: Interaction, message: Message) -> None:
"""Saves the message

:param interaction: ContextMenu command interaction
:type interaction: Interaction
:param message: Message of the interaction
:type message: Message
"""
sent_at: int = int(message.created_at.timestamp())
files: List[File] = await self.get_message_files(message)

save_embed: Embed = Embed(title="Bookmark Info", color=self.bot.default_color)

save_embed.add_field(name="Sent By", value=message.author, inline=False)
save_embed.add_field(name="Sent At", value=f"<t:{sent_at}>", inline=False)
save_embed.add_field(
name="Original Message", value=f"[Jump]({message.jump_url})", inline=False
)

await interaction.user.send(embed=save_embed)
await interaction.user.send(message.content, embeds=message.embeds, files=files)
await interaction.response.send_message(
"Message successfully saved.", ephemeral=True
)


async def setup(bot: Grace) -> None:
await bot.add_cog(BookmarkCog(bot))
await bot.add_cog(BookmarkCog(bot))
56 changes: 42 additions & 14 deletions bot/extensions/code_generator_cog.py
Original file line number Diff line number Diff line change
@@ -1,15 +1,37 @@
from discord.ext.commands import Cog, hybrid_command
from discord.app_commands import Choice, autocomplete
import openai
from discord import Embed, Interaction
from discord.app_commands import Choice, autocomplete
from discord.ext.commands import Cog, hybrid_command
from openai.api_resources.completion import Completion
import openai
from lib.config_required import cog_config_required

from lib.config_required import cog_config_required

LANGUAGES = [
"Python", "C", "C++", "Java", "Csharp", "R", "Ruby", "JavaScript", "Swift",
"Go", "Kotlin", "Rust", "PHP", "ObjectiveC", "SQL", "Lisp", "Perl",
"Haskell", "Erlang", "Scala", "Clojure", "Julia", "Elixir", "F#", "Bash"
"Python",
"C",
"C++",
"Java",
"Csharp",
"R",
"Ruby",
"JavaScript",
"Swift",
"Go",
"Kotlin",
"Rust",
"PHP",
"ObjectiveC",
"SQL",
"Lisp",
"Perl",
"Haskell",
"Erlang",
"Scala",
"Clojure",
"Julia",
"Elixir",
"F#",
"Bash",
]


Expand All @@ -25,25 +47,31 @@ async def language_autocomplete(_: Interaction, current: str) -> list[Choice[str
"""
return [
Choice(name=lang.capitalize(), value=lang.capitalize())
for lang in LANGUAGES if current.lower() in lang.lower()
for lang in LANGUAGES
if current.lower() in lang.lower()
]


@cog_config_required("openai", "api_key", "Generate yours [here](https://beta.openai.com/account/api-keys)")
@cog_config_required(
"openai",
"api_key",
"Generate yours [here](https://beta.openai.com/account/api-keys)",
)
class CodeGenerator(
Cog,
name="OpenAI",
description="Generate code using OpenAI API by providing a comment and language."
description="Generate code using OpenAI API by providing a comment and language.",
):
"""A Cog that generate code using text."""

def __init__(self, bot):
self.bot = bot
self.api_key = self.required_config

@hybrid_command(
name='code',
help='Generate code by providing a comment and language.',
usage="language={programming_language} comment={sentence}"
name="code",
help="Generate code by providing a comment and language.",
usage="language={programming_language} comment={sentence}",
)
@autocomplete(language=language_autocomplete)
async def code_generator(self, ctx, *, language: str, comment: str) -> None:
Expand Down Expand Up @@ -77,7 +105,7 @@ async def code_generator(self, ctx, *, language: str, comment: str) -> None:
embed.add_field(
name=comment.capitalize(),
value=f"```{language}{code_generated}``` {ctx.author} | {language}",
inline=False
inline=False,
)

await ctx.send(embed=embed)
Expand Down
Loading