Skip to content

Commit

Permalink
refactor(review): move review to a separate folder
Browse files Browse the repository at this point in the history
  • Loading branch information
peterdragun committed Mar 23, 2024
1 parent 0a59477 commit 977b88d
Show file tree
Hide file tree
Showing 7 changed files with 110 additions and 168 deletions.
7 changes: 7 additions & 0 deletions cogs/review/__init__.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
from disnake.ext.commands import Bot

from .cog import Review


def setup(bot: Bot):
bot.add_cog(Review(bot))
69 changes: 35 additions & 34 deletions cogs/review.py → cogs/review/cog.py
Original file line number Diff line number Diff line change
Expand Up @@ -10,14 +10,15 @@

import utils
from buttons.embed import EmbedView
from buttons.review import ReviewView
from cogs.base import Base
from config import cooldowns
from config.messages import Messages
from database.review import ProgrammeDB, ReviewDB, SubjectDB, SubjectDetailsDB
from features.review import ReviewManager, TierEnum
from permissions import permission_check

from .features import ReviewManager, TierEnum
from .messages_cz import MessagesCZ
from .views import View


async def autocomp_subjects_programmes(
inter: disnake.ApplicationCommandInteraction, user_input: str
Expand All @@ -44,18 +45,18 @@ async def check_member(self, inter: disnake.ApplicationCommandInteraction):
guild = inter.bot.get_guild(self.config.guild_id)
member = guild.get_member(inter.author.id)
if member is None:
await inter.send(Messages.review_not_on_server(user=inter.author.mention))
await inter.send(MessagesCZ.review_not_on_server(user=inter.author.mention))
return False
roles = member.roles
verify = False
for role in roles:
if self.config.verification_role_id == role.id:
verify = True
if role.id in self.config.review_forbidden_roles:
await inter.send(Messages.review_add_denied(user=inter.author.id))
await inter.send(MessagesCZ.review_add_denied(user=inter.author.id))
return False
if not verify:
await inter.send(Messages.review_add_denied(user=inter.author.id))
await inter.send(MessagesCZ.review_add_denied(user=inter.author.id))
return False
return True

Expand All @@ -65,7 +66,7 @@ async def reviews(self, inter: disnake.ApplicationCommandInteraction):
"""Group of commands for reviews."""
pass

@reviews.sub_command(name="get", description=Messages.review_get_brief)
@reviews.sub_command(name="get", description=MessagesCZ.review_get_brief)
async def get(
self,
inter: disnake.ApplicationCommandInteraction,
Expand All @@ -75,18 +76,20 @@ async def get(
await inter.response.defer()
embeds = self.manager.list_reviews(inter.author, subject.lower())
if embeds is None or len(embeds) == 0:
await inter.send(Messages.review_wrong_subject)
await inter.send(MessagesCZ.wrong_subject)
return
view = ReviewView(inter.author, self.bot, embeds)
view = View(inter.author, self.bot, embeds)
await inter.edit_original_response(embed=embeds[0], view=view)
view.message = await inter.original_message()

@reviews.sub_command(name="add", description=Messages.review_add_brief)
@reviews.sub_command(name="add", description=MessagesCZ.review_add_brief)
async def add(
self,
inter: disnake.ApplicationCommandInteraction,
subject: str = commands.Param(autocomplete=autocomp_subjects),
grade: str = commands.Param(choices=TierEnum._member_names_, description=Messages.review_grade_brief),
grade: str = commands.Param(
choices=TierEnum._member_names_, description=MessagesCZ.review_grade_brief
),
text: str = commands.Param(),
anonymous: bool = commands.Param(default=False),
):
Expand All @@ -98,16 +101,16 @@ async def add(
if not await self.check_member(inter):
return
if not self.manager.add_review(inter.author.id, subject.lower(), tier, anonymous, text):
await inter.send(Messages.review_wrong_subject)
await inter.send(MessagesCZ.wrong_subject)
else:
await inter.send(Messages.review_added)
await inter.send(MessagesCZ.review_added)

@reviews.sub_command(name="remove", description=Messages.review_remove_brief)
@reviews.sub_command(name="remove", description=MessagesCZ.review_remove_brief)
async def remove(
self,
inter: disnake.ApplicationCommandInteraction,
subject: str = None,
id: int = commands.Param(default=None, description=Messages.review_id_brief),
id: int = commands.Param(default=None, description=MessagesCZ.review_id_brief),
):
"""Remove review from DB. User is just allowed to remove his own review
For admin it is possible to use "id" as subject shortcut and delete review by its ID
Expand All @@ -118,22 +121,22 @@ async def remove(
review = ReviewDB.get_review_by_id(id)
if review:
review.remove()
await inter.send(Messages.review_remove_success)
await inter.send(MessagesCZ.review_remove_success)
else:
await inter.send(Messages.review_not_found)
await inter.send(MessagesCZ.review_not_found)
return

# not admin
await inter.send(Messages.review_remove_denied(user=inter.author.id), ephemeral=True)
await inter.send(MessagesCZ.review_remove_denied(user=inter.author.id), ephemeral=True)
return
elif subject is not None:
subject = subject.lower()
if self.manager.remove(str(inter.author.id), subject):
await inter.send(Messages.review_remove_success)
await inter.send(MessagesCZ.review_remove_success)
return
await inter.send(Messages.review_not_found)
await inter.send(MessagesCZ.review_not_found)

@reviews.sub_command(name="list", description=Messages.review_list_brief)
@reviews.sub_command(name="list", description=MessagesCZ.review_list_brief)
async def author_list(self, inter: disnake.ApplicationCommandInteraction):
await inter.response.defer()
embed = self.manager.authored_reviews(inter.author.id)
Expand All @@ -146,31 +149,33 @@ async def subject(self, inter: disnake.ApplicationCommandInteraction):
"""Group of commands for managing subjects in DB"""
await inter.response.defer()

@subject.sub_command(name="update", description=Messages.subject_update_biref)
@subject.sub_command(name="update", description=MessagesCZ.subject_update_biref)
async def update(
self,
inter: disnake.ApplicationCommandInteraction,
overwrite: bool = commands.Param(description=Messages.subject_update_overwrite_brief, default=False),
overwrite: bool = commands.Param(
description=MessagesCZ.subject_update_overwrite_brief, default=False
),
):
"""Updates subjects from web"""
programme_details_link = "https://www.fit.vut.cz/study/"
reply = ""
# bachelor
url = f"{programme_details_link}program/{self.config.subject_bit_id}/.cs"
if not self.manager.update_subject_types(url, False, overwrite):
reply += Messages.subject_update_error(url=url)
reply += MessagesCZ.subject_update_error(url=url)
# engineer
ids_list = list(range(self.config.subject_mit_id_start, self.config.subject_mit_id_end))
for id in ids_list + self.config.subject_mit_id_rnd:
url = f"{programme_details_link}field/{id}/.cs"
if not self.manager.update_subject_types(url, True, overwrite):
reply += Messages.subject_update_error(url=url)
reply += MessagesCZ.subject_update_error(url=url)
# sports
self.manager.update_sport_subjects()
reply += Messages.subject_update_success
reply += MessagesCZ.subject_update_success
await inter.edit_original_response(reply)

@commands.slash_command(name="wtf", description=Messages.shortcut_brief)
@commands.slash_command(name="wtf", description=MessagesCZ.shortcut_brief)
async def shortcut(
self,
inter: disnake.ApplicationCommandInteraction,
Expand All @@ -186,7 +191,7 @@ async def shortcut(
if not subject:
subject = SubjectDetailsDB.get(f"TV-{shortcut}")
if not subject:
await inter.response.send_message(Messages.review_wrong_subject)
await inter.response.send_message(MessagesCZ.wrong_subject)
return
embed = disnake.Embed(title=subject.shortcut, description=subject.name)
if subject.semester == "L":
Expand Down Expand Up @@ -225,7 +230,7 @@ async def shortcut(
utils.add_author_footer(embed, inter.author)
await inter.response.send_message(embed=embed)

@commands.slash_command(name="tierboard", description=Messages.tierboard_brief)
@commands.slash_command(name="tierboard", description=MessagesCZ.tierboard_brief)
async def tierboard(
self,
inter: disnake.ApplicationCommandInteraction,
Expand Down Expand Up @@ -257,7 +262,7 @@ async def tierboard(
if "MIT" in year:
degree = "MIT"
if not degree and not year:
await inter.send(Messages.tierboard_missing_year, ephemeral=True)
await inter.send(MessagesCZ.tierboard_missing_year, ephemeral=True)
return
embeds = []
embed = disnake.Embed(title="Tierboard")
Expand Down Expand Up @@ -292,7 +297,3 @@ async def tierboard(
view = EmbedView(inter.author, embeds)
await inter.response.send_message(embed=embeds[0], view=view)
view.message = await inter.original_message()


def setup(bot: commands.Bot):
bot.add_cog(Review(bot))
32 changes: 16 additions & 16 deletions features/review.py → cogs/review/features.py
Original file line number Diff line number Diff line change
Expand Up @@ -6,13 +6,15 @@
import disnake
import requests
from bs4 import BeautifulSoup
from disnake.ext.commands import Bot

import utils
from config.app_config import config
from config.messages import Messages
from database.review import ProgrammeDB, ReviewDB, ReviewRelevanceDB, SubjectDB, SubjectDetailsDB
from features import sports

from .messages_cz import MessagesCZ


class TierEnum(Enum):
"""Tier to grades mapping"""
Expand All @@ -32,7 +34,7 @@ def tier_to_grade_num(tier: int) -> int:
class ReviewManager:
"""Helper class for reviews"""

def __init__(self, bot):
def __init__(self, bot: Bot):
self.bot = bot

def make_embed(
Expand All @@ -58,10 +60,10 @@ def make_embed(
else:
guild = self.bot.get_guild(config.guild_id)
author = guild.get_member(int(review.member_ID))
embed.add_field(name=Messages.review_author_label, value=author)
embed.add_field(name=Messages.review_grade_label, value=TierEnum(review.tier).name)
embed.add_field(name=MessagesCZ.author_label, value=author)
embed.add_field(name=MessagesCZ.grade_label, value=TierEnum(review.tier).name)
embed.add_field(
name=Messages.review_date_label,
name=MessagesCZ.date_label,
value=utils.get_discord_timestamp(
datetime.combine(review.date, time(12, 0)), "Relative Time"
),
Expand All @@ -71,10 +73,8 @@ def make_embed(
if len(text) > 1024:
pages = utils.cut_string_by_words(text, 1000, " ")
text = pages[0]
embed.add_field(
name=Messages.review_text_page_label, value=f"1/{len(pages)}", inline=False
)
embed.add_field(name=Messages.review_text_label, value=text, inline=False)
embed.add_field(name=MessagesCZ.text_page_label, value=f"1/{len(pages)}", inline=False)
embed.add_field(name=MessagesCZ.text_label, value=text, inline=False)
likes = ReviewRelevanceDB.get_votes_count(review.id, True)
embed.add_field(name="👍", value=f"{likes}")
dislikes = ReviewRelevanceDB.get_votes_count(review.id, False)
Expand All @@ -89,7 +89,7 @@ def make_embed(
subject_id = subject.card.split("/")[-2]
vutis_link = "https://www.vut.cz/studis/student.phtml?script_name=anketa_statistiky"
embed.add_field(
name=Messages.review_other_reviews_label,
name=MessagesCZ.other_reviews_label,
value=f"[VUT IS]({vutis_link}&apid={subject_id}&typ_semestru_id={sem})",
inline=False,
)
Expand All @@ -108,10 +108,10 @@ def update_embed(self, embed: disnake.Embed, review: ReviewDB, text_page: int =
pages = utils.cut_string_by_words(text, 1000, " ")
text = pages[text_page - 1]
embed.set_field_at(
idx, name=Messages.review_text_page_label, value=f"{text_page}/{len(pages)}", inline=False
idx, name=MessagesCZ.text_page_label, value=f"{text_page}/{len(pages)}", inline=False
)
idx += 1
embed.set_field_at(idx, name=Messages.review_text_label, value=text, inline=False)
embed.set_field_at(idx, name=MessagesCZ.text_label, value=text, inline=False)
idx += 1
likes = ReviewRelevanceDB.get_votes_count(review.id, True)
embed.set_field_at(idx, name="👍", value=f"{likes}")
Expand Down Expand Up @@ -160,7 +160,7 @@ def list_reviews(self, author: disnake.User, subject: str):
subject_details = SubjectDetailsDB.get(subject_obj.shortcut) or subject_obj.shortcut
name = getattr(subject_details, "name", "")
if reviews_cnt == 0:
description = f"{name}\n{Messages.review_embed_no_reviews}"
description = f"{name}\n{MessagesCZ.no_reviews}"
return [self.make_embed(author, None, subject_details, description, "1/1")]
else:
embeds = []
Expand All @@ -169,7 +169,7 @@ def list_reviews(self, author: disnake.User, subject: str):
review = reviews[idx].ReviewDB
grade_num = TierEnum.tier_to_grade_num(avg_tier)
grade = f"{TierEnum(round(avg_tier)).name}({round(grade_num, 1)})"
description = Messages.review_embed_description(name=name, grade=grade)
description = MessagesCZ.embed_description(name=name, grade=grade)
page = f"{idx+1}/{reviews_cnt}"

embeds.append(self.make_embed(author, review, subject_details, description, page))
Expand All @@ -190,11 +190,11 @@ def authored_reviews(self, author: str):
reviews_cnt = reviews.count()

if reviews_cnt == 0:
description = Messages.review_embed_no_reviews
description = MessagesCZ.no_reviews
else:
description = "\n".join(map(lambda x: x.subject.upper(), reviews))

embed = disnake.Embed(title=Messages.review_authored_list_label, description=description)
embed = disnake.Embed(title=MessagesCZ.authored_list_label, description=description)
return embed

def add_vote(self, review_id: int, vote: bool, author: str):
Expand Down
42 changes: 42 additions & 0 deletions cogs/review/messages_cz.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,42 @@
from config.messages import Messages as GlobalMessages


class MessagesCZ(GlobalMessages):
review_add_brief = "Přidá recenzi na předmět. Pokud jsi již recenzi na předmět napsal, bude nahrazena novou."
review_get_brief = "Vypíše recenze na vybraný předmět"
review_remove_brief = "Odstraní hodnocení"
review_list_brief = "Vypíše předměty, které si již ohodnotil"
review_id_brief = "ID recenze, pouze pro administrátory"
review_grade_brief = "Známku, kterou by jsi dal předmětu od A-F (za organizaci, splnění očekávání, kvalitu výuky ...)"

wrong_subject = "Nesprávná zkratka předmětu."
review_added = "Hodnocení předmětu bylo přidáno."
reviews_reaction_help = "Pokud byla recenze užitečná dejte 👍, jinak 👎.\n" \
"Pro odstranění hlasu je možné použit 🛑.\n" \
"Použijte reakce ◀️ a ▶️ pro navigaci mezi recenzemi.\n" \
"Pro navigaci v textu delších recenzí použijte 🔼 a 🔽.\n"
review_vote_own = "Nemůžeš hlasovat pro vlastní recenzi"
review_remove_success = "Hodnocení předmětu bylo odebráno."
review_not_found = "Hodnocení předmětu nebylo nalezeno."
review_remove_denied = "{user}, `id` je pouze pro administrátory. Pro smazání použij jen `subject`."
review_add_denied = "{user}, na přidání hodnocení předmětu nemáš právo."
review_not_on_server = "{user}, na použití tohoto příkazu musíš být na FITwide serveru."

# review embed
embed_description = "{name}\n**Průměrná známka od studenta:** {grade}"
no_reviews = "*Zatím nic*"
text_label = "Text recenze"
text_page_label = "Stránka textu"
author_label = "Autor"
grade_label = "Kvalita předmětu"
date_label = "Datum"
other_reviews_label = "Další hodnocení"
authored_list_label = "Ohodnotil jsi:"

subject_update_biref = "Automaticky vyhledá a přidá předměty do reviews i subject databáze"
subject_update_overwrite_brief = "Přepíše všechny informace o předmětech. Využít pouze v kombinaci s další aktualizací bez přepisu."
subject_update_error = "Aktualizace se nezdařila pro <{url}>\n"
subject_update_success = "Předměty byly aktualizovány."
shortcut_brief = "Vrací stručné informace o předmětu"
tierboard_brief = "Založeno na `reviews` z průměru tier hodnot"
tierboard_missing_year = f"Nemáš ročníkovou roli, prosím specifikuj ročník"
Loading

0 comments on commit 977b88d

Please sign in to comment.