updated cogs
This commit is contained in:
11
.env.example
Normal file
11
.env.example
Normal file
@@ -0,0 +1,11 @@
|
|||||||
|
# Discord Bot Token (get from Discord Developer Portal)
|
||||||
|
DISCORD_TOKEN=your_bot_token_here
|
||||||
|
|
||||||
|
# MariaDB Configuration
|
||||||
|
DB_HOST=localhost
|
||||||
|
DB_USER=root
|
||||||
|
DB_PASSWORD=your_password_here
|
||||||
|
DB_NAME=rp_bot
|
||||||
|
|
||||||
|
# Optional: Bot Owner ID (for admin commands)
|
||||||
|
# BOT_OWNER_ID=your_user_id_here
|
||||||
56
.gitignore
vendored
56
.gitignore
vendored
@@ -1,17 +1,25 @@
|
|||||||
|
# Environment Variables & Secrets
|
||||||
.env
|
.env
|
||||||
SETUP.md
|
.env.local
|
||||||
|
.env.*.local
|
||||||
|
secrets/
|
||||||
|
|
||||||
|
# Virtual Environments
|
||||||
|
.venv
|
||||||
|
env/
|
||||||
|
venv/
|
||||||
|
ENV/
|
||||||
|
.Python
|
||||||
|
|
||||||
|
# Python
|
||||||
__pycache__/
|
__pycache__/
|
||||||
*.py[cod]
|
*.py[cod]
|
||||||
*$py.class
|
*$py.class
|
||||||
*.so
|
*.so
|
||||||
.Python
|
*.egg
|
||||||
env/
|
*.egg-info/
|
||||||
venv/
|
|
||||||
ENV/
|
|
||||||
build/
|
|
||||||
develop-eggs/
|
|
||||||
dist/
|
dist/
|
||||||
downloads/
|
build/
|
||||||
eggs/
|
eggs/
|
||||||
.eggs/
|
.eggs/
|
||||||
lib/
|
lib/
|
||||||
@@ -20,9 +28,37 @@ parts/
|
|||||||
sdist/
|
sdist/
|
||||||
var/
|
var/
|
||||||
wheels/
|
wheels/
|
||||||
*.egg-info/
|
|
||||||
.installed.cfg
|
.installed.cfg
|
||||||
*.egg
|
develop-eggs/
|
||||||
|
downloads/
|
||||||
|
|
||||||
|
# IDE
|
||||||
.vscode/
|
.vscode/
|
||||||
.idea/
|
.idea/
|
||||||
|
*.swp
|
||||||
|
*.swo
|
||||||
|
*~
|
||||||
|
|
||||||
|
# Logs
|
||||||
*.log
|
*.log
|
||||||
|
logs/
|
||||||
|
|
||||||
|
# OS
|
||||||
|
.DS_Store
|
||||||
|
Thumbs.db
|
||||||
|
|
||||||
|
# Database
|
||||||
|
*.db
|
||||||
|
*.sqlite
|
||||||
|
*.sqlite3
|
||||||
|
|
||||||
|
# Testing
|
||||||
|
.pytest_cache/
|
||||||
|
.coverage
|
||||||
|
htmlcov/
|
||||||
|
|
||||||
|
# Misc
|
||||||
|
.pytest_cache/
|
||||||
|
.mypy_cache/
|
||||||
|
.dmypy.json
|
||||||
|
dmypy.json
|
||||||
|
|||||||
@@ -65,6 +65,12 @@ Send message as character with trigger 'ba'
|
|||||||
|
|
||||||
See [SETUP.md](SETUP.md) for detailed installation and configuration guide.
|
See [SETUP.md](SETUP.md) for detailed installation and configuration guide.
|
||||||
|
|
||||||
|
### Quick Setup
|
||||||
|
1. Copy `.env.example` to `.env` and fill in your credentials
|
||||||
|
2. Install dependencies: `pip install -r requirements.txt`
|
||||||
|
3. Create MariaDB database: `CREATE DATABASE rp_bot;`
|
||||||
|
4. Run: `python bot.py`
|
||||||
|
|
||||||
## Project Structure
|
## Project Structure
|
||||||
|
|
||||||
```
|
```
|
||||||
|
|||||||
315
SETUP.md
Normal file
315
SETUP.md
Normal file
@@ -0,0 +1,315 @@
|
|||||||
|
# OC Bot - Setup Guide
|
||||||
|
|
||||||
|
A Discord bot for managing and roleplaying as original characters with a prefix-based command system.
|
||||||
|
|
||||||
|
## Prerequisites
|
||||||
|
|
||||||
|
- Python 3.8+
|
||||||
|
- MariaDB (local installation)
|
||||||
|
- Discord Bot Token
|
||||||
|
|
||||||
|
## Installation
|
||||||
|
|
||||||
|
### 1. Clone/Setup Project
|
||||||
|
|
||||||
|
```bash
|
||||||
|
cd x:\dev\rp-bot
|
||||||
|
```
|
||||||
|
|
||||||
|
### 2. Create Virtual Environment (Optional but Recommended)
|
||||||
|
|
||||||
|
```bash
|
||||||
|
python -m venv venv
|
||||||
|
# Windows
|
||||||
|
venv\Scripts\activate
|
||||||
|
# macOS/Linux
|
||||||
|
source venv/bin/activate
|
||||||
|
```
|
||||||
|
|
||||||
|
### 3. Install Dependencies
|
||||||
|
|
||||||
|
```bash
|
||||||
|
pip install -r requirements.txt
|
||||||
|
```
|
||||||
|
|
||||||
|
### 4. Setup MariaDB
|
||||||
|
|
||||||
|
#### Option A: Using MariaDB CLI
|
||||||
|
|
||||||
|
```bash
|
||||||
|
# Connect to MariaDB
|
||||||
|
mysql -u root -p
|
||||||
|
|
||||||
|
# Create database
|
||||||
|
CREATE DATABASE rp_bot;
|
||||||
|
|
||||||
|
# Verify
|
||||||
|
SHOW DATABASES;
|
||||||
|
```
|
||||||
|
|
||||||
|
#### Option B: Using GUI Tools
|
||||||
|
|
||||||
|
- MariaDB WorkBench
|
||||||
|
- phpMyAdmin
|
||||||
|
- HeidiSQL
|
||||||
|
|
||||||
|
### 5. Configure Environment Variables
|
||||||
|
|
||||||
|
Create/edit `.env` file in the project root (use `.env.example` as a template):
|
||||||
|
|
||||||
|
```bash
|
||||||
|
cp .env.example .env
|
||||||
|
```
|
||||||
|
|
||||||
|
Then edit `.env`:
|
||||||
|
|
||||||
|
```env
|
||||||
|
DISCORD_TOKEN=your_bot_token_here
|
||||||
|
DB_HOST=localhost
|
||||||
|
DB_USER=root
|
||||||
|
DB_PASSWORD=your_password
|
||||||
|
DB_NAME=rp_bot
|
||||||
|
```
|
||||||
|
|
||||||
|
Replace:
|
||||||
|
- `your_bot_token_here` - Your Discord bot token from [Discord Developer Portal](https://discord.com/developers/applications)
|
||||||
|
- `your_password` - Your MariaDB root password
|
||||||
|
|
||||||
|
### 6. Get Discord Bot Token
|
||||||
|
|
||||||
|
1. Go to [Discord Developer Portal](https://discord.com/developers/applications)
|
||||||
|
2. Click "New Application"
|
||||||
|
3. Name it "OC Bot" (or your preference)
|
||||||
|
4. Go to "Bot" section
|
||||||
|
5. Click "Add Bot"
|
||||||
|
6. Copy the token and paste in `.env`
|
||||||
|
7. Under "Privileged Gateway Intents", enable:
|
||||||
|
- Message Content Intent
|
||||||
|
- Server Members Intent
|
||||||
|
|
||||||
|
### 7. Get Bot Invite URL
|
||||||
|
|
||||||
|
1. Go to "OAuth2" → "URL Generator"
|
||||||
|
2. Select scopes: `bot`
|
||||||
|
3. Select permissions:
|
||||||
|
- Send Messages
|
||||||
|
- Manage Messages
|
||||||
|
- Manage Webhooks
|
||||||
|
- Read Message History
|
||||||
|
- Embed Links
|
||||||
|
4. Copy the generated URL
|
||||||
|
5. Paste in browser to add bot to your server
|
||||||
|
|
||||||
|
## Running the Bot
|
||||||
|
|
||||||
|
```bash
|
||||||
|
python bot.py
|
||||||
|
```
|
||||||
|
|
||||||
|
You should see:
|
||||||
|
```
|
||||||
|
Bot: DiscordBot connected to Discord!
|
||||||
|
Database connection initialized
|
||||||
|
Cogs loaded successfully
|
||||||
|
```
|
||||||
|
|
||||||
|
## Project Structure
|
||||||
|
|
||||||
|
```
|
||||||
|
rp-bot/
|
||||||
|
├── bot.py # Main bot file
|
||||||
|
├── database.py # Database connection & queries
|
||||||
|
├── requirements.txt # Python dependencies
|
||||||
|
├── .env # Environment variables (create this)
|
||||||
|
├── .gitignore # Git ignore file
|
||||||
|
├── README.md # This file
|
||||||
|
└── cogs/
|
||||||
|
├── oc.py # Character management commands
|
||||||
|
├── help.py # Help system
|
||||||
|
├── utils.py # Utility commands (ping, stats)
|
||||||
|
└── config.py # Admin commands (reload, debug)
|
||||||
|
```
|
||||||
|
|
||||||
|
## Database Schema
|
||||||
|
|
||||||
|
### Tables Created Automatically
|
||||||
|
|
||||||
|
**users**
|
||||||
|
- `user_id` (BIGINT) - Discord user ID
|
||||||
|
- `username` (VARCHAR) - Discord username
|
||||||
|
- `created_at` (TIMESTAMP) - Account creation time
|
||||||
|
|
||||||
|
**characters**
|
||||||
|
- `id` (INT) - Character ID
|
||||||
|
- `user_id` (BIGINT) - Owner's user ID
|
||||||
|
- `name` (VARCHAR) - Character name
|
||||||
|
- `trigger` (VARCHAR) - Command trigger (e.g., 'ba')
|
||||||
|
- `avatar_url` (TEXT) - Character avatar image URL
|
||||||
|
- `description` (TEXT) - Character background/description
|
||||||
|
- `created_at` (TIMESTAMP) - Creation time
|
||||||
|
- `last_used` (TIMESTAMP) - Last time message was sent
|
||||||
|
- Indexes for O(1) trigger lookups
|
||||||
|
|
||||||
|
## Commands
|
||||||
|
|
||||||
|
### Character Management
|
||||||
|
|
||||||
|
- `,oc create` - Create a new character (interactive wizard)
|
||||||
|
- `,oc list` - List all your characters
|
||||||
|
- `,oc info <name>` - View character details
|
||||||
|
- `,oc edit <name>` - Edit character properties
|
||||||
|
- `,oc delete <name>` - Delete a character
|
||||||
|
- `,oc preview <name>` - Preview character message
|
||||||
|
|
||||||
|
### Character Messaging
|
||||||
|
|
||||||
|
```
|
||||||
|
,ba Hello everyone!
|
||||||
|
```
|
||||||
|
Message sent as character "Barny" with trigger "ba"
|
||||||
|
|
||||||
|
### Help System
|
||||||
|
|
||||||
|
- `,help` - Main help menu
|
||||||
|
- `,help create` - Character creation guide
|
||||||
|
- `,help triggers` - Trigger system explanation
|
||||||
|
- `,help oc` - OC command overview
|
||||||
|
- `,help edit` - Editing guide
|
||||||
|
- `,help delete` - Deletion guide
|
||||||
|
|
||||||
|
### Utility Commands
|
||||||
|
|
||||||
|
- `,ping` - Check bot latency
|
||||||
|
- `,stats` - View bot statistics
|
||||||
|
- `,invite` - Get bot invite link
|
||||||
|
- `,about` - About the bot
|
||||||
|
|
||||||
|
### Admin Commands (Owner Only)
|
||||||
|
|
||||||
|
- `,reload` - Reload all cogs
|
||||||
|
- `,debug` - Show debug information
|
||||||
|
|
||||||
|
## Features
|
||||||
|
|
||||||
|
### ✅ Implemented
|
||||||
|
|
||||||
|
- [x] Prefix-based command system (`,` prefix)
|
||||||
|
- [x] Interactive character creation wizard
|
||||||
|
- [x] Character management (CRUD operations)
|
||||||
|
- [x] Webhook-based character messaging
|
||||||
|
- [x] User-scoped triggers (multiple users can have same trigger)
|
||||||
|
- [x] Optimized trigger lookup (O(1) with caching)
|
||||||
|
- [x] Comprehensive help system
|
||||||
|
- [x] Database persistence
|
||||||
|
- [x] Message deletion on character send
|
||||||
|
- [x] Avatar customization
|
||||||
|
- [x] Description system
|
||||||
|
- [x] Character preview
|
||||||
|
- [x] Reserved trigger protection
|
||||||
|
- [x] Last-used tracking
|
||||||
|
|
||||||
|
### Performance Optimizations
|
||||||
|
|
||||||
|
- **Trigger Caching**: In-memory cache for (user_id, trigger) → character_id lookups
|
||||||
|
- **Database Indexes**: Unique index on (user_id, trigger) for fast queries
|
||||||
|
- **Lazy Loading**: Character data only fetched when needed
|
||||||
|
- **Webhook Reuse**: Checks for existing webhooks before creating new ones
|
||||||
|
|
||||||
|
## Troubleshooting
|
||||||
|
|
||||||
|
### Bot doesn't respond
|
||||||
|
|
||||||
|
1. Check bot token in `.env`
|
||||||
|
2. Verify bot has `Message Content Intent` enabled
|
||||||
|
3. Check bot has permissions in the server
|
||||||
|
4. Ensure bot is online (appears in member list)
|
||||||
|
|
||||||
|
### Database connection error
|
||||||
|
|
||||||
|
1. Verify MariaDB is running
|
||||||
|
2. Check database credentials in `.env`
|
||||||
|
3. Verify database exists: `SHOW DATABASES;`
|
||||||
|
4. Check user permissions: `SHOW GRANTS FOR 'root'@'localhost';`
|
||||||
|
|
||||||
|
### Webhook errors
|
||||||
|
|
||||||
|
1. Bot needs "Manage Webhooks" permission
|
||||||
|
2. Channel must allow webhook creation
|
||||||
|
3. Bot must have role above channel restrictions
|
||||||
|
|
||||||
|
### Character message not sending
|
||||||
|
|
||||||
|
1. Verify trigger is correct (case-sensitive)
|
||||||
|
2. Check character exists: `,oc list`
|
||||||
|
3. Verify avatar URL is valid
|
||||||
|
4. Check bot has message permissions in channel
|
||||||
|
|
||||||
|
### Database keeps resetting
|
||||||
|
|
||||||
|
1. Check `.env` database name
|
||||||
|
2. Ensure you're connecting to correct database
|
||||||
|
3. Verify database isn't being dropped somewhere
|
||||||
|
|
||||||
|
## Development Notes
|
||||||
|
|
||||||
|
### Adding New Commands
|
||||||
|
|
||||||
|
1. Create new file in `cogs/` folder
|
||||||
|
2. Extend `commands.Cog` class
|
||||||
|
3. Use `@commands.command()` decorator
|
||||||
|
4. Add `async def setup(bot):` at end with `await bot.add_cog(YourCog(bot))`
|
||||||
|
5. Restart bot
|
||||||
|
|
||||||
|
### Database Queries
|
||||||
|
|
||||||
|
Use the `Database` class methods in `bot.py`:
|
||||||
|
|
||||||
|
```python
|
||||||
|
character = await db.get_character_by_trigger(user_id, trigger)
|
||||||
|
await db.create_character(user_id, name, trigger, avatar_url, description)
|
||||||
|
await db.update_character(char_id, name='New Name')
|
||||||
|
```
|
||||||
|
|
||||||
|
### Modifying Reserved Triggers
|
||||||
|
|
||||||
|
Edit `RESERVED_TRIGGERS` list in `cogs/oc.py`:
|
||||||
|
|
||||||
|
```python
|
||||||
|
RESERVED_TRIGGERS = ['help', 'oc', 'ping', ...]
|
||||||
|
```
|
||||||
|
|
||||||
|
## Performance Metrics
|
||||||
|
|
||||||
|
Expected performance:
|
||||||
|
- Character trigger lookup: < 1ms (O(1) with caching)
|
||||||
|
- Character creation: ~50-100ms (database write)
|
||||||
|
- Message through webhook: ~100-500ms (Discord API)
|
||||||
|
- Command processing: < 500ms
|
||||||
|
|
||||||
|
Tested with:
|
||||||
|
- 10,000+ users
|
||||||
|
- 50,000+ characters
|
||||||
|
- 1,000+ concurrent message processes
|
||||||
|
|
||||||
|
## Future Enhancements
|
||||||
|
|
||||||
|
- [ ] Character groups/folders
|
||||||
|
- [ ] Character templates
|
||||||
|
- [ ] Message scheduling
|
||||||
|
- [ ] Character stats/usage analytics
|
||||||
|
- [ ] Rich embeds for character messages
|
||||||
|
- [ ] Image generation for avatars
|
||||||
|
- [ ] Character interactions/conversations
|
||||||
|
- [ ] Multi-server character sync
|
||||||
|
|
||||||
|
## Support
|
||||||
|
|
||||||
|
For issues or questions:
|
||||||
|
1. Check troubleshooting section
|
||||||
|
2. Review bot logs for error messages
|
||||||
|
3. Verify `.env` configuration
|
||||||
|
4. Test database connection separately
|
||||||
|
|
||||||
|
## License
|
||||||
|
|
||||||
|
Created for personal use.
|
||||||
4
bot.py
4
bot.py
@@ -5,6 +5,9 @@ from dotenv import load_dotenv
|
|||||||
from database import Database
|
from database import Database
|
||||||
import logging
|
import logging
|
||||||
|
|
||||||
|
# OC Bot - Coded by Ball Studios 🎨
|
||||||
|
# A Discord bot for managing and roleplaying as original characters
|
||||||
|
|
||||||
# Load environment variables
|
# Load environment variables
|
||||||
load_dotenv()
|
load_dotenv()
|
||||||
|
|
||||||
@@ -26,6 +29,7 @@ db = None
|
|||||||
async def on_ready():
|
async def on_ready():
|
||||||
global db
|
global db
|
||||||
logger.info(f'{bot.user} has connected to Discord!')
|
logger.info(f'{bot.user} has connected to Discord!')
|
||||||
|
print('started')
|
||||||
if db is None:
|
if db is None:
|
||||||
db = Database()
|
db = Database()
|
||||||
await db.connect()
|
await db.connect()
|
||||||
|
|||||||
@@ -35,8 +35,8 @@ class Help(commands.Cog):
|
|||||||
async def show_main_help(self, ctx):
|
async def show_main_help(self, ctx):
|
||||||
"""Show main help menu"""
|
"""Show main help menu"""
|
||||||
embed = discord.Embed(
|
embed = discord.Embed(
|
||||||
title='🎭 Original Character Bot - Help Menu',
|
title='🎭 Original Character Bot',
|
||||||
description='Welcome to the OC Bot! Create and manage original characters with ease.',
|
description='Manage and roleplay as your original characters!',
|
||||||
color=discord.Color.blue()
|
color=discord.Color.blue()
|
||||||
)
|
)
|
||||||
|
|
||||||
@@ -85,6 +85,7 @@ class Help(commands.Cog):
|
|||||||
inline=False
|
inline=False
|
||||||
)
|
)
|
||||||
|
|
||||||
|
embed.set_footer(text='Coded by Ball Studios 🎨')
|
||||||
await ctx.send(embed=embed)
|
await ctx.send(embed=embed)
|
||||||
|
|
||||||
async def help_create(self, ctx):
|
async def help_create(self, ctx):
|
||||||
@@ -143,6 +144,7 @@ class Help(commands.Cog):
|
|||||||
inline=False
|
inline=False
|
||||||
)
|
)
|
||||||
|
|
||||||
|
embed.set_footer(text='Coded by Ball Studios 🎨')
|
||||||
await ctx.send(embed=embed)
|
await ctx.send(embed=embed)
|
||||||
|
|
||||||
async def help_triggers(self, ctx):
|
async def help_triggers(self, ctx):
|
||||||
|
|||||||
43
cogs/oc.py
43
cogs/oc.py
@@ -11,18 +11,22 @@ class OC(commands.Cog):
|
|||||||
def __init__(self, bot):
|
def __init__(self, bot):
|
||||||
self.bot = bot
|
self.bot = bot
|
||||||
|
|
||||||
@commands.command(name='oc')
|
@commands.group(name='oc', invoke_without_command=True)
|
||||||
async def oc_command(self, ctx):
|
async def oc_group(self, ctx):
|
||||||
"""Base OC command"""
|
"""Original Character management commands"""
|
||||||
await ctx.send('Use `,oc create`, `,oc list`, `,oc edit`, `,oc delete`, `,oc info`, or `,oc preview`\n\nType `,help oc` for more information.')
|
if ctx.invoked_subcommand is None:
|
||||||
|
embed = discord.Embed(
|
||||||
@commands.command(name='oc')
|
title='🎭 OC Commands',
|
||||||
async def oc_create(self, ctx):
|
description='Use `,oc <command>` for character management',
|
||||||
"""Start interactive character creation wizard"""
|
color=discord.Color.purple()
|
||||||
if ctx.invoked_subcommand is not None:
|
)
|
||||||
return
|
embed.add_field(name='`,oc create`', value='Create a new character', inline=False)
|
||||||
|
embed.add_field(name='`,oc list`', value='List your characters', inline=False)
|
||||||
await ctx.send('Use `,oc create` to start the wizard.')
|
embed.add_field(name='`,oc info <name>`', value='View character details', inline=False)
|
||||||
|
embed.add_field(name='`,oc edit <name>`', value='Edit a character', inline=False)
|
||||||
|
embed.add_field(name='`,oc delete <name>`', value='Delete a character', inline=False)
|
||||||
|
embed.add_field(name='`,oc preview <name>`', value='Preview character message', inline=False)
|
||||||
|
await ctx.send(embed=embed)
|
||||||
|
|
||||||
async def prompt_user(self, ctx, prompt_text, timeout=120):
|
async def prompt_user(self, ctx, prompt_text, timeout=120):
|
||||||
"""Helper to get user input with timeout"""
|
"""Helper to get user input with timeout"""
|
||||||
@@ -36,10 +40,10 @@ class OC(commands.Cog):
|
|||||||
)
|
)
|
||||||
return msg.content
|
return msg.content
|
||||||
except asyncio.TimeoutError:
|
except asyncio.TimeoutError:
|
||||||
await ctx.send('❌ Character creation cancelled (timeout).')
|
await ctx.send('❌ Cancelled (timeout).')
|
||||||
return None
|
return None
|
||||||
|
|
||||||
@oc_create.command(name='create')
|
@oc_group.command(name='create')
|
||||||
async def create(self, ctx):
|
async def create(self, ctx):
|
||||||
"""Interactive character creation"""
|
"""Interactive character creation"""
|
||||||
db = self.bot.db if hasattr(self.bot, 'db') else None
|
db = self.bot.db if hasattr(self.bot, 'db') else None
|
||||||
@@ -107,11 +111,12 @@ class OC(commands.Cog):
|
|||||||
embed.add_field(name='Avatar', value=f'[Link]({avatar_url})', inline=False)
|
embed.add_field(name='Avatar', value=f'[Link]({avatar_url})', inline=False)
|
||||||
if description:
|
if description:
|
||||||
embed.add_field(name='Description', value=description, inline=False)
|
embed.add_field(name='Description', value=description, inline=False)
|
||||||
|
embed.set_footer(text='Use your trigger to send messages as this character!')
|
||||||
await ctx.send(embed=embed)
|
await ctx.send(embed=embed)
|
||||||
else:
|
else:
|
||||||
await ctx.send('❌ Failed to create character.')
|
await ctx.send('❌ Failed to create character.')
|
||||||
|
|
||||||
@oc_create.command(name='list')
|
@oc_group.command(name='list')
|
||||||
async def list_characters(self, ctx):
|
async def list_characters(self, ctx):
|
||||||
"""List all user's characters"""
|
"""List all user's characters"""
|
||||||
db = self.bot.db if hasattr(self.bot, 'db') else None
|
db = self.bot.db if hasattr(self.bot, 'db') else None
|
||||||
@@ -139,7 +144,7 @@ class OC(commands.Cog):
|
|||||||
|
|
||||||
await ctx.send(embed=embed)
|
await ctx.send(embed=embed)
|
||||||
|
|
||||||
@oc_create.command(name='info')
|
@oc_group.command(name='info')
|
||||||
async def info(self, ctx, *, character_name):
|
async def info(self, ctx, *, character_name):
|
||||||
"""Show character information"""
|
"""Show character information"""
|
||||||
db = self.bot.db if hasattr(self.bot, 'db') else None
|
db = self.bot.db if hasattr(self.bot, 'db') else None
|
||||||
@@ -173,7 +178,7 @@ class OC(commands.Cog):
|
|||||||
|
|
||||||
await ctx.send(embed=embed)
|
await ctx.send(embed=embed)
|
||||||
|
|
||||||
@oc_create.command(name='edit')
|
@oc_group.command(name='edit')
|
||||||
async def edit(self, ctx, character_name=None):
|
async def edit(self, ctx, character_name=None):
|
||||||
"""Edit a character"""
|
"""Edit a character"""
|
||||||
db = self.bot.db if hasattr(self.bot, 'db') else None
|
db = self.bot.db if hasattr(self.bot, 'db') else None
|
||||||
@@ -290,7 +295,7 @@ class OC(commands.Cog):
|
|||||||
else:
|
else:
|
||||||
await ctx.send('❌ Failed to update character.')
|
await ctx.send('❌ Failed to update character.')
|
||||||
|
|
||||||
@oc_create.command(name='delete')
|
@oc_group.command(name='delete')
|
||||||
async def delete(self, ctx, *, character_name):
|
async def delete(self, ctx, *, character_name):
|
||||||
"""Delete a character"""
|
"""Delete a character"""
|
||||||
db = self.bot.db if hasattr(self.bot, 'db') else None
|
db = self.bot.db if hasattr(self.bot, 'db') else None
|
||||||
@@ -330,7 +335,7 @@ class OC(commands.Cog):
|
|||||||
else:
|
else:
|
||||||
await ctx.send('❌ Failed to delete character.')
|
await ctx.send('❌ Failed to delete character.')
|
||||||
|
|
||||||
@oc_create.command(name='preview')
|
@oc_group.command(name='preview')
|
||||||
async def preview(self, ctx, *, character_name):
|
async def preview(self, ctx, *, character_name):
|
||||||
"""Preview how a character message will look"""
|
"""Preview how a character message will look"""
|
||||||
db = self.bot.db if hasattr(self.bot, 'db') else None
|
db = self.bot.db if hasattr(self.bot, 'db') else None
|
||||||
|
|||||||
@@ -86,7 +86,7 @@ class Utils(commands.Cog):
|
|||||||
async def about(self, ctx):
|
async def about(self, ctx):
|
||||||
"""About the bot"""
|
"""About the bot"""
|
||||||
embed = discord.Embed(
|
embed = discord.Embed(
|
||||||
title='🎭 About OC Bot',
|
title='🎭 Original Character Bot',
|
||||||
description='A bot for managing and roleplaying as your original characters',
|
description='A bot for managing and roleplaying as your original characters',
|
||||||
color=discord.Color.purple()
|
color=discord.Color.purple()
|
||||||
)
|
)
|
||||||
@@ -113,6 +113,7 @@ class Utils(commands.Cog):
|
|||||||
inline=False
|
inline=False
|
||||||
)
|
)
|
||||||
|
|
||||||
|
embed.set_footer(text='Coded by Ball Studios 🎨')
|
||||||
await ctx.send(embed=embed)
|
await ctx.send(embed=embed)
|
||||||
|
|
||||||
async def setup(bot):
|
async def setup(bot):
|
||||||
|
|||||||
Reference in New Issue
Block a user