Skip to content

Commit 558c24e

Browse files
AmbratolmAmbratolm
authored andcommitted
Added actor-member sync feature
1 parent 5530cbc commit 558c24e

6 files changed

Lines changed: 71 additions & 3 deletions

File tree

api/routers/member_router.py

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -40,6 +40,7 @@ async def get_members(guild_id: int, limit: int = 10, top: bool = True):
4040
actors = (
4141
db.find(
4242
Actor,
43+
Actor.is_member == True,
4344
sort=(
4445
query.desc(Actor.rank),
4546
query.desc(Actor.level),

bot/cogs/ai_cog.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -34,7 +34,7 @@ class AiCog(Cog, description="Integrated generative AI chat bot."):
3434
MAX_FILE_SIZE = 524288 # 512 KB == 0.5 MB
3535
REPLY_DELAY_RANGE = (1, 5) # 1 sec - 5 sec
3636
AUTO_REPLY_DELAY_RANGE = (5, 1800) # 5 sec - 30 min
37-
AUTO_REPLY_CHANCE = 0.3 # 30 %
37+
AUTO_REPLY_CHANCE = 0.2 # 20 %
3838
INITIATIVE_DELAY_RANGE = (1800, 7200) # 30 min - 2 hr
3939

4040
def __init__(self, bot: ActBot):

bot/cogs/board_cog.py

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -122,6 +122,7 @@ def get_top_actors(self, guild: Guild | None, limit: int = 10):
122122
db = self.bot.get_db(guild)
123123
return db.find(
124124
Actor,
125+
Actor.is_member == True,
125126
sort=(
126127
query.desc(Actor.rank),
127128
query.desc(Actor.level),

bot/cogs/console_cog.py

Lines changed: 43 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@
33

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

78

89
# ----------------------------------------------------------------------------------------------------
@@ -24,7 +25,48 @@ async def sync(self, interaction: Interaction, global_sync: bool = True):
2425
await interaction.followup.send(
2526
embed=EmbedX.success(
2627
title="Commands Synchronization",
27-
description=f"{count[0]}/{count[1]} commands synchronized.",
28+
description=f"{count[0]}/{count[1]} command(s) synchronized.",
29+
),
30+
ephemeral=True,
31+
)
32+
33+
# ----------------------------------------------------------------------------------------------------
34+
# * Sync Actors
35+
# ----------------------------------------------------------------------------------------------------
36+
@app_commands.guild_only()
37+
@app_commands.default_permissions(administrator=True)
38+
@app_commands.checks.has_permissions(administrator=True)
39+
@app_commands.command(
40+
description="Update actors with fresh data from associated guild members",
41+
)
42+
async def sync_actors(self, interaction: Interaction):
43+
await interaction.response.defer(ephemeral=True)
44+
guild = interaction.guild
45+
if not guild:
46+
return
47+
db = self.bot.get_db(guild)
48+
actors = list(db.find(Actor))
49+
removed_members_count = 0
50+
for actor in actors:
51+
member = None
52+
try:
53+
member = guild.get_member(actor.id) or await guild.fetch_member(
54+
actor.id
55+
)
56+
except:
57+
pass
58+
if member:
59+
actor.is_member = True
60+
actor.name = member.name
61+
actor.display_name = member.display_name
62+
else:
63+
actor.is_member = False
64+
removed_members_count += 1
65+
db.save_all(actors)
66+
await interaction.followup.send(
67+
embed=EmbedX.success(
68+
title="Actors Synchronization",
69+
description=f"{len(actors)} actor(s) synchronized.\n{removed_members_count} actor(s) no longer members.",
2870
),
2971
ephemeral=True,
3072
)

bot/cogs/farm_cog.py

Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,30 @@ class FarmCog(Cog, description="Allows players to gain stats and roles."):
1616
def __init__(self, bot: ActBot):
1717
self.bot = bot
1818

19+
# ----------------------------------------------------------------------------------------------------
20+
# * On Member Join
21+
# ----------------------------------------------------------------------------------------------------
22+
@Cog.listener()
23+
async def on_member_join(self, member: Member):
24+
db = self.bot.get_db(member.guild)
25+
actor = db.find_one(Actor, Actor.id == member.id)
26+
if not actor:
27+
actor = self.bot.create_actor(member)
28+
actor.is_member = True
29+
db.save(actor)
30+
31+
# ----------------------------------------------------------------------------------------------------
32+
# * On Member Remove
33+
# ----------------------------------------------------------------------------------------------------
34+
@Cog.listener()
35+
async def on_member_remove(self, member: Member):
36+
db = self.bot.get_db(member.guild)
37+
actor = db.find_one(Actor, Actor.id == member.id)
38+
if not actor:
39+
return
40+
actor.is_member = False
41+
db.save(actor)
42+
1943
# ----------------------------------------------------------------------------------------------------
2044
# * On Message
2145
# ----------------------------------------------------------------------------------------------------

db/actor.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,7 @@ class Actor(Model):
1616
id: int = Field(primary_field=True)
1717
name: str = ""
1818
display_name: str = ""
19-
avatar_url: str = ""
19+
is_member: bool = True # Still member in the server
2020

2121
ai_interacted_at: Optional[datetime] = None # Last time actor interacted with AI
2222
ai_chat_history: list[dict[str, Any]] = []

0 commit comments

Comments
 (0)