This commit fixes two critical bugs in the trade system and adds a new feature for automatic channel updates. ## Bug Fixes ### 1. Trade Channel Creation Permission Error (Discord API 50013) **Issue**: Trade channels failed to create with "Missing Permissions" error **Root Cause**: Bot was attempting to grant itself manage_channels and manage_permissions in channel-specific overwrites. Discord prohibits bots from self-granting elevated permissions in channel overwrites. **Fix**: Removed manage_channels and manage_permissions from bot's channel-specific overwrites in trade_channels.py. Server-level permissions are sufficient for all channel management operations. **Files Changed**: - commands/transactions/trade_channels.py (lines 74-77) ### 2. TeamService Method Name AttributeError **Issue**: Bot crashed with AttributeError when adding players to trades **Root Cause**: Code called non-existent method team_service.get_team_by_id() The correct method name is team_service.get_team() **Fix**: Updated method call in trade_builder.py and all test mocks **Files Changed**: - services/trade_builder.py (line 201) - tests/test_services_trade_builder.py (all test mocks) ## New Features ### Smart Trade Channel Updates **Feature**: When trade commands are executed outside the dedicated trade channel, the trade embed is automatically posted to the trade channel (non-ephemeral) for visibility to all participants. **Behavior**: - Commands in trade channel: Only ephemeral response to user - Commands outside trade channel: Ephemeral response + public post to channel - Applies to: /trade add-team, /trade add-player, /trade supplementary, /trade view **Implementation**: - Added _get_trade_channel() helper method - Added _is_in_trade_channel() helper method - Added _post_to_trade_channel() helper method - Updated 4 trade commands to use smart posting logic **Files Changed**: - commands/transactions/trade.py (new helper methods + 4 command updates) ## Documentation Updates Updated comprehensive documentation for: - Trade channel permission requirements and troubleshooting - TeamService correct method names with examples - Smart channel update feature and behavior - Bug fix details and prevention strategies **Files Changed**: - commands/transactions/README.md - services/README.md ## Testing - All 18 trade builder tests pass - Updated test assertions to match new error message format 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude <noreply@anthropic.com>
12 KiB
12 KiB
Transaction Commands
This directory contains Discord slash commands for transaction management and roster legality checking.
Files
management.py
- Commands:
/mymoves- View user's pending and scheduled transactions/legal- Check roster legality for current and next week
- Service Dependencies:
transaction_service(multiple methods for transaction retrieval)roster_service(roster validation and retrieval)team_service.get_teams_by_owner()andget_team_by_abbrev()
dropadd.py
- Commands:
/dropadd- Interactive transaction builder for single-team roster moves/cleartransaction- Clear current transaction builder
- Service Dependencies:
transaction_builder(transaction creation and validation)player_service.search_players()(player autocomplete)team_service.get_teams_by_owner()
trade.py (NEW)
- Commands:
/trade initiate- Start a new multi-team trade/trade add-team- Add additional teams to trade (3+ team trades)/trade add-player- Add player exchanges between teams/trade supplementary- Add internal organizational moves for roster legality/trade view- View current trade status/trade clear- Clear current trade
- Service Dependencies:
trade_builder(multi-team trade management)player_service.search_players()(player autocomplete)team_service.get_teams_by_owner(),get_team_by_abbrev(), andget_team()
- Channel Management:
- Automatically creates private discussion channels for trades
- Uses
TradeChannelManagerandTradeChannelTrackerfor channel lifecycle - Requires bot to have
Manage Channelspermission at server level
Key Features
Transaction Status Display (/mymoves)
- User Team Detection: Automatically finds user's team by Discord ID
- Transaction Categories:
- Pending: Transactions awaiting processing
- Frozen: Scheduled transactions ready for processing
- Processed: Recently completed transactions
- Cancelled: Optional display of cancelled transactions
- Status Visualization:
- Status emojis for each transaction type
- Week numbering and move descriptions
- Transaction count summaries
- Smart Limiting: Shows recent transactions (last 5 pending, 3 frozen/processed, 2 cancelled)
Roster Legality Checking (/legal)
- Dual Roster Validation: Checks both current and next week rosters
- Flexible Team Selection:
- Auto-detects user's team
- Allows manual team specification via abbreviation
- Comprehensive Validation:
- Player count verification (active roster + IL)
- sWAR calculations and limits
- League rule compliance checking
- Error and warning categorization
- Parallel Processing: Roster retrieval and validation run concurrently
Multi-Team Trade System (/trade) (NEW)
- Trade Initiation: Start trades between multiple teams using proper Discord command groups
- Team Management: Add/remove teams to create complex multi-team trades (2+ teams supported)
- Player Exchanges: Add cross-team player movements with source and destination validation
- Supplementary Moves: Add internal organizational moves for roster legality compliance
- Interactive UI: Rich Discord embeds with validation feedback and trade status
- Real-time Validation: Live roster checking across all participating teams
- Authority Model: Major League team owners control all players in their organization (ML/MiL/IL)
Trade Command Workflow:
/trade initiate other_team:LAA- Start trade between your team and LAA- Creates a private discussion channel for the trade
- Only you see the ephemeral response
/trade add-team other_team:BOS- Add BOS for 3-team trade- Updates are posted to the trade channel if executed elsewhere
- Other team members can see the progress
/trade add-player player_name:"Mike Trout" destination_team:BOS- Exchange players- Trade embed updates posted to dedicated channel automatically
- Keeps all participants informed of changes
/trade supplementary player_name:"Player X" destination:ml- Internal roster moves- Channel receives real-time updates
/trade view- Review complete trade with validation- Posts current state to trade channel if viewed elsewhere
- Submit via interactive UI - Trade submission through Discord buttons
Channel Behavior:
- Commands executed in the trade channel: Only ephemeral response to user
- Commands executed outside trade channel: Ephemeral response to user + public post to trade channel
- This ensures all participating teams stay informed of trade progress
Autocomplete System:
- Team Initiation: Only Major League teams (ML team owners initiate trades)
- Player Destinations: All roster types (ML/MiL/IL) available for player placement
- Player Search: Prioritizes user's team players, supports fuzzy name matching
- Smart Filtering: Context-aware suggestions based on user permissions
Trade Channel Management (trade_channels.py, trade_channel_tracker.py):
- Automatic Channel Creation: Private discussion channels created when trades are initiated
- Channel Naming: Format
trade-{team1}-{team2}-{short_id}(e.g.,trade-wv-por-681f) - Permission Management:
- Channel hidden from @everyone
- Only participating team roles can view/message
- Bot has view and send message permissions
- Created in "Transactions" category (if it exists)
- Channel Tracking: JSON-based persistence for cleanup and management
- Multi-Team Support: Channels automatically update when teams are added to trades
- Automatic Cleanup: Channels deleted when trades are cleared
- Smart Updates: When trade commands are executed outside the dedicated trade channel, the trade embed is automatically posted to the trade channel (non-ephemeral) for visibility
Bot Permission Requirements:
- Server-level
Manage Channels- Required to create/delete trade channels - Server-level
Manage Permissions- Optional, for enhanced permission management - Note: Bot should NOT have these permissions in channel-specific overwrites (causes Discord API error 50013)
Recent Fix (January 2025):
- Removed
manage_channelsandmanage_permissionsfrom bot's channel-specific overwrites - Discord prohibits bots from granting themselves elevated permissions in channel overwrites
- Server-level permissions are sufficient for all channel management operations
Advanced Transaction Features
- Concurrent Data Fetching: Multiple transaction types retrieved in parallel
- Owner-Based Filtering: Transactions filtered by team ownership
- Status Tracking: Real-time transaction status with emoji indicators
- Team Integration: Team logos and colors in transaction displays
Architecture Notes
Permission Model
- Team Ownership: Commands use Discord user ID to determine team ownership
- Cross-Team Viewing:
/legalallows checking other teams' roster status - Access Control: Users can only view their own transactions via
/mymoves
Data Processing
- Async Operations: Heavy use of
asyncio.gather()for performance - Error Resilience: Graceful handling of missing roster data
- Validation Pipeline: Multi-step roster validation with detailed feedback
Embed Structure
- Status-Based Coloring: Success (green) vs Error (red) color coding
- Information Hierarchy: Important information prioritized in embed layout
- Team Branding: Consistent use of team thumbnails and colors
Troubleshooting
Common Issues
-
User team not found:
- Verify user has team ownership record in database
- Check Discord user ID mapping to team ownership
- Ensure current season team assignments are correct
-
Transaction data missing:
- Verify
transaction_serviceAPI endpoints are functional - Check transaction status filtering logic
- Ensure transaction records exist for the team/season
- Verify
-
Roster validation failing:
- Check
roster_service.get_current_roster()andget_next_roster()responses - Verify roster validation rules and logic
- Ensure player data integrity in roster records
- Check
-
Legal command errors:
- Verify team abbreviation exists in database
- Check roster data availability for both current and next weeks
- Ensure validation service handles edge cases properly
-
Trade channel creation fails (Fixed January 2025):
- Error:
Discord error: Missing Permissions. Code: 50013 - Root Cause: Bot was trying to grant itself
manage_channelsandmanage_permissionsin channel-specific permission overwrites - Fix: Removed elevated permissions from channel overwrites (line 74-77 in
trade_channels.py) - Verification: Bot only needs server-level
Manage Channelspermission - Channels now create successfully with basic bot permissions (view, send messages, read history)
- Error:
-
AttributeError when adding players to trades (Fixed January 2025):
- Error:
'TeamService' object has no attribute 'get_team_by_id' - Root Cause: Code was calling non-existent method
team_service.get_team_by_id() - Fix: Changed to correct method name
team_service.get_team()(line 201 intrade_builder.py) - Location:
services/trade_builder.pyand test mocks intests/test_services_trade_builder.py - All 18 trade builder tests pass after fix
- Error:
Service Dependencies
services.transaction_service:get_pending_transactions()get_frozen_transactions()get_processed_transactions()get_team_transactions()
services.roster_service:get_current_roster()get_next_roster()validate_roster()
services.team_service:get_teams_by_owner()get_team_by_abbrev()get_teams_by_season()(trade autocomplete)
services.trade_builder(NEW):TradeBuilderclass for multi-team transaction managementget_trade_builder()andclear_trade_builder()cache functionsTradeValidationResultfor comprehensive trade validation
services.player_service:search_players()for autocomplete functionality
Core Dependencies
utils.decorators.logged_commandviews.embeds.EmbedTemplateviews.trade_embed(NEW): Trade-specific UI componentsutils.autocomplete(ENHANCED): Player and team autocomplete functionsutils.team_utils(NEW): Shared team validation utilitiesconstants.SBA_CURRENT_SEASON
Testing
Run tests with:
python -m pytest tests/test_commands_transactions.py -v(management commands)python -m pytest tests/test_models_trade.py -v(NEW) (trade models)python -m pytest tests/test_services_trade_builder.py -v(NEW) (trade builder service)
Database Requirements
- Team ownership mapping (Discord user ID to team)
- Transaction records with status tracking
- Roster data for current and next weeks
- Player assignments and position information
- League rules and validation criteria
Recent Enhancements (NEW)
- ✅ Multi-Team Trade System: Complete
/tradecommand group for 2+ team trades - ✅ Enhanced Autocomplete: Major League team filtering and smart player suggestions
- ✅ Shared Utilities: Reusable team validation and autocomplete functions
- ✅ Comprehensive Testing: Factory-based tests for trade models and services
- ✅ Interactive Trade UI: Rich Discord embeds with real-time validation
Future Enhancements
- Trade Submission Integration: Connect trade system to transaction processing pipeline
- **Advanced transaction analytics and history
- Trade Approval Workflow: Multi-party trade approval system
- **Roster optimization suggestions
- **Automated roster validation alerts
- Trade History Tracking: Complete audit trail for multi-team trades
Security Considerations
- User authentication via Discord IDs
- Team ownership verification for sensitive operations
- Transaction privacy (users can only see their own transactions)
- Input validation for team abbreviations and parameters