Update duckhelp to send PM with detailed commands

This commit is contained in:
3nd3r
2025-12-28 17:52:02 -06:00
parent b71f8f4ec6
commit 53a66f5202
2 changed files with 102 additions and 7 deletions

45
MULTI_CHANNEL_PLAN.md Normal file
View File

@@ -0,0 +1,45 @@
# Multi-Channel Support Implementation
## What Multi-Channel Means
- Players have **separate stats in each channel**
- Nick "Bob" in #channel1 has different XP than "Bob" in #channel2
- Database structure: `channels -> #channel1 -> players -> bob`
## Changes Needed
### 1. Database Structure (db.py)
```python
{
"channels": {
"#channel1": {
"players": {
"bob": { "xp": 100, ... },
"alice": { "xp": 50, ... }
}
},
"#channel2": {
"players": {
"bob": { "xp": 20, ... } # Different stats!
}
}
}
}
```
### 2. Database Methods
- `get_player(nick, channel)` - Get player in specific channel
- `get_players_for_channel(channel)` - Get all players in a channel
- `iter_all_players()` - Iterate over all channels and players
### 3. Command Changes (duckhuntbot.py)
- Pass `channel` parameter when calling `db.get_player(nick, channel)`
- Channel normalization (case-insensitive)
### 4. Stats Commands
- `!duckstats` shows stats for current channel
- `!globalducks` shows combined stats across all channels
## Benefits
- Fair: Can't bring channel1 XP into channel2
- Better: Each channel has own leaderboard
- Clean: Stats don't mix between channels

View File

@@ -1027,19 +1027,69 @@ class DuckHuntBot:
self.send_message(channel, f"{nick} > Error retrieving leaderboard data.") self.send_message(channel, f"{nick} > Error retrieving leaderboard data.")
async def handle_duckhelp(self, nick, channel, _player): async def handle_duckhelp(self, nick, channel, _player):
"""Handle !duckhelp command""" """Handle !duckhelp command - sends detailed help via PM"""
# Send notification to channel
if channel.startswith('#'):
self.send_message(channel, f"{nick} > Please check your PM for the duckhunt command list.")
# Build detailed help message
help_lines = [ help_lines = [
self.messages.get('help_header'), "=== DuckHunt Commands ===",
self.messages.get('help_user_commands'), "",
self.messages.get('help_help_command') "BASIC COMMANDS:",
" !bang - Shoot at a duck",
" !bef or !befriend - Try to befriend a duck",
" !reload - Reload your gun",
"",
"INFO COMMANDS:",
" !duckstats [player] - View duck hunting statistics",
" !topduck - View leaderboard (top hunters)",
"",
"SHOP COMMANDS:",
" !shop - View available items",
" !shop buy <item_id> - Purchase an item from the shop",
"",
"EXAMPLES:",
" When a duck appears, type: !bang",
" To reload: !reload",
" Check your stats: !duckstats",
" Buy item #2 from shop: !shop buy 2",
] ]
# Add admin commands if user is admin # Add admin commands if user is admin
if self.is_admin(f"{nick}!user@host"): # We need to construct a proper user string for is_admin check
help_lines.append(self.messages.get('help_admin_commands')) user_string = f"{nick}!user@host" # Simplified check
if hasattr(self, 'is_admin') and self.is_admin(user_string):
help_lines.extend([
"",
"=== ADMIN COMMANDS ===",
" !rearm <player|all> - Give player a gun",
" !disarm <player> - Confiscate player's gun",
" !ignore <player> - Ignore player's commands",
" !unignore <player> - Unignore player",
" !ducklaunch [duck_type] - Force spawn a duck (normal, golden, fast)",
" !join #channel - Make bot join a channel",
" !part #channel - Make bot leave a channel",
"",
"Admin commands work in PM or in-channel."
])
help_lines.extend([
"",
"=== TIPS ===",
"- Ducks spawn randomly. Watch for them!",
"- Golden ducks have multiple HP and give more XP",
"- Fast ducks fly away quickly",
"- Buy items from !shop to improve your hunting",
"",
"Good luck hunting! 🦆"
])
# Send all help lines as PM
for line in help_lines: for line in help_lines:
self.send_message(channel, line) self.send_message(nick, line)
async def handle_use(self, nick, channel, player, args): async def handle_use(self, nick, channel, player, args):
"""Handle !use command""" """Handle !use command"""