Skip to content

Commit

Permalink
Add trade cooldown bypass policy
Browse files Browse the repository at this point in the history
  • Loading branch information
Jamie (flare) committed Feb 19, 2025
1 parent 2af8bc7 commit 1ddda4e
Show file tree
Hide file tree
Showing 7 changed files with 87 additions and 15 deletions.
Original file line number Diff line number Diff line change
@@ -0,0 +1,19 @@
# Generated by Django 5.1.4 on 2025-02-19 14:10

from django.db import migrations, models


class Migration(migrations.Migration):

dependencies = [
('bd_models', '0005_alter_ball_short_name'),
]

operations = [
migrations.AddField(
model_name='player',
name='trade_cooldown_policy',
field=models.SmallIntegerField(choices=[(1, 'Cooldown'), (2, 'Bypass')], default=1, help_text='To bypass or not the trade cooldown'),
preserve_default=False,
),
]
8 changes: 8 additions & 0 deletions admin_panel/bd_models/models.py
Original file line number Diff line number Diff line change
Expand Up @@ -64,6 +64,11 @@ class FriendPolicy(models.IntegerChoices):
DENY = 2


class TradeCooldownPolicy(models.IntegerChoices):
COOLDOWN = 1
BYPASS = 2


class Player(models.Model):
discord_id = models.BigIntegerField(unique=True, help_text="Discord user ID")
donation_policy = models.SmallIntegerField(
Expand All @@ -78,6 +83,9 @@ class Player(models.Model):
friend_policy = models.SmallIntegerField(
choices=FriendPolicy.choices, help_text="Open or close your friend requests"
)
trade_cooldown_policy = models.SmallIntegerField(
choices=TradeCooldownPolicy.choices, help_text="To bypass or not the trade cooldown"
)

def is_blacklisted(self) -> bool:
blacklist = cast(
Expand Down
10 changes: 10 additions & 0 deletions ballsdex/core/models.py
Original file line number Diff line number Diff line change
Expand Up @@ -417,6 +417,11 @@ class FriendPolicy(IntEnum):
DENY = 2


class TradeCooldownPolicy(IntEnum):
COOLDOWN = 1
BYPASS = 2


class Player(models.Model):
discord_id = fields.BigIntField(
description="Discord user ID", unique=True, validators=[DiscordSnowflakeValidator()]
Expand All @@ -441,6 +446,11 @@ class Player(models.Model):
description="How you want to handle friend requests",
default=FriendPolicy.ALLOW,
)
trade_cooldown_policy = fields.IntEnumField(
TradeCooldownPolicy,
description="How you want to handle trade accept cooldown",
default=TradeCooldownPolicy.COOLDOWN,
)
balls: fields.BackwardFKRelation[BallInstance]

def __str__(self) -> str:
Expand Down
2 changes: 2 additions & 0 deletions ballsdex/core/utils/enums.py
Original file line number Diff line number Diff line change
Expand Up @@ -13,6 +13,8 @@

FRIEND_POLICY_MAP = {1: "Allow all friend requests", 2: "Deny all friend requests"}

TRADE_COOLDOWN_POLICY_MAP = {1: "Use 10s acceptance cooldown", 2: "Bypass acceptance cooldown"}


class SortingChoices(enum.Enum):
alphabetic = "ball__country"
Expand Down
4 changes: 3 additions & 1 deletion ballsdex/packages/admin/info.py
Original file line number Diff line number Diff line change
Expand Up @@ -12,6 +12,7 @@
MENTION_POLICY_MAP,
PRIVATE_POLICY_MAP,
)
from ballsdex.core.utils.enums import TRADE_COOLDOWN_POLICY_MAP as TRADE_POLICY_MAP
from ballsdex.settings import settings


Expand Down Expand Up @@ -136,7 +137,8 @@ async def user(
f"**Privacy Policy:** {PRIVATE_POLICY_MAP[player.privacy_policy]}\n"
f"**Donation Policy:** {DONATION_POLICY_MAP[player.donation_policy]}\n"
f"**Mention Policy:** {MENTION_POLICY_MAP[player.mention_policy]}\n"
f"**Friend Policy:** {FRIEND_POLICY_MAP[player.friend_policy]}"
f"**Friend Policy:** {FRIEND_POLICY_MAP[player.friend_policy]}\n"
f"**Trade Cooldown Policy:** {TRADE_POLICY_MAP[player.trade_cooldown_policy]}\n"
),
color=discord.Color.blurple(),
)
Expand Down
32 changes: 31 additions & 1 deletion ballsdex/packages/players/cog.py
Original file line number Diff line number Diff line change
Expand Up @@ -18,14 +18,15 @@
MentionPolicy,
)
from ballsdex.core.models import Player as PlayerModel
from ballsdex.core.models import PrivacyPolicy, Trade, TradeObject, balls
from ballsdex.core.models import PrivacyPolicy, Trade, TradeCooldownPolicy, TradeObject, balls
from ballsdex.core.utils.buttons import ConfirmChoiceView
from ballsdex.core.utils.enums import (
DONATION_POLICY_MAP,
FRIEND_POLICY_MAP,
MENTION_POLICY_MAP,
PRIVATE_POLICY_MAP,
)
from ballsdex.core.utils.enums import TRADE_COOLDOWN_POLICY_MAP as TRADE_POLICY_MAP
from ballsdex.core.utils.paginator import FieldPageSource, Pages
from ballsdex.settings import settings

Expand Down Expand Up @@ -181,6 +182,34 @@ async def friends(self, interaction: discord.Interaction, policy: FriendPolicy):
ephemeral=True,
)

@policy.command()
@app_commands.choices(
policy=[
app_commands.Choice(
name="Use 10s acceptance cooldown", value=TradeCooldownPolicy.COOLDOWN
),
app_commands.Choice(
name="Bypass acceptance cooldown", value=TradeCooldownPolicy.BYPASS
),
]
)
async def trade_cooldown(self, interaction: discord.Interaction, policy: TradeCooldownPolicy):
"""
Set your trade cooldown policy.
Parameters
----------
policy: TradeCooldownPolicy
The new policy for trade acceptance cooldown.
"""
player, _ = await PlayerModel.get_or_create(discord_id=interaction.user.id)
player.trade_cooldown_policy = policy
await player.save()
await interaction.response.send_message(
f"Your trade acceptance cooldown policy has been set to **{policy.name.lower()}**.",
ephemeral=True,
)

@app_commands.command()
async def delete(self, interaction: discord.Interaction):
"""
Expand Down Expand Up @@ -552,6 +581,7 @@ async def info(self, interaction: discord.Interaction):
f"**Donation Policy:** {DONATION_POLICY_MAP[player.donation_policy]}\n"
f"**Mention Policy:** {MENTION_POLICY_MAP[player.mention_policy]}\n"
f"**Friend Policy:** {FRIEND_POLICY_MAP[player.friend_policy]}\n"
f"**Trade Cooldown Policy:** {TRADE_POLICY_MAP[player.trade_cooldown_policy]}\n"
f"**Amount of Friends:** {friends}\n"
f"**Amount of Blocked Users:** {blocks}\n"
"## Player Stats\n"
Expand Down
27 changes: 14 additions & 13 deletions ballsdex/packages/trade/menu.py
Original file line number Diff line number Diff line change
Expand Up @@ -9,7 +9,7 @@
from discord.ui import Button, View, button
from discord.utils import format_dt, utcnow

from ballsdex.core.models import BallInstance, Player, Trade, TradeObject
from ballsdex.core.models import BallInstance, Player, Trade, TradeCooldownPolicy, TradeObject
from ballsdex.core.utils import menus
from ballsdex.core.utils.buttons import ConfirmChoiceView
from ballsdex.core.utils.paginator import Pages
Expand Down Expand Up @@ -144,19 +144,20 @@ async def interaction_check(self, interaction: discord.Interaction, /) -> bool:
)
async def accept_button(self, interaction: discord.Interaction, button: Button):
trader = self.trade._get_trader(interaction.user)
if self.trade.cooldown_start_time is None:
return
if trader.player.trade_cooldown_policy == TradeCooldownPolicy.COOLDOWN:
if self.trade.cooldown_start_time is None:
return

elapsed = datetime.now(timezone.utc) - self.trade.cooldown_start_time
if elapsed < self.cooldown_duration:
remaining_time = datetime.now(timezone.utc) + (self.cooldown_duration - elapsed)
remaining = format_dt(remaining_time, style="R")
await interaction.response.send_message(
f"This trade can only be approved {remaining}, please use this "
"time to double check the items to prevent any unwanted trades.",
ephemeral=True,
)
return
elapsed = datetime.now(timezone.utc) - self.trade.cooldown_start_time
if elapsed < self.cooldown_duration:
remaining_time = datetime.now(timezone.utc) + (self.cooldown_duration - elapsed)
remaining = format_dt(remaining_time, style="R")
await interaction.response.send_message(
f"This trade can only be approved {remaining}, please use this "
"time to double check the items to prevent any unwanted trades.",
ephemeral=True,
)
return
if trader.accepted:
await interaction.response.send_message(
"You have already accepted this trade.", ephemeral=True
Expand Down

0 comments on commit 1ddda4e

Please sign in to comment.