dev #11
29
README.md
29
README.md
@@ -138,6 +138,10 @@ ai_moderation:
|
|||||||
check_video_thumbnails: false # Skip video thumbnails
|
check_video_thumbnails: false # Skip video thumbnails
|
||||||
url_image_check_enabled: false # Skip URL image downloads
|
url_image_check_enabled: false # Skip URL image downloads
|
||||||
|
|
||||||
|
# User blocklist (blocks ALL media from specific users)
|
||||||
|
blocked_user_ids:
|
||||||
|
- 123456789012345678 # Discord user ID to block
|
||||||
|
|
||||||
# Known NSFW video domains (auto-block)
|
# Known NSFW video domains (auto-block)
|
||||||
nsfw_video_domains:
|
nsfw_video_domains:
|
||||||
- pornhub.com
|
- pornhub.com
|
||||||
@@ -160,6 +164,12 @@ nsfw_video_domains:
|
|||||||
- `duplicate_threshold`: How many duplicate messages trigger action
|
- `duplicate_threshold`: How many duplicate messages trigger action
|
||||||
- `mention_limit`: Max @mentions allowed per message
|
- `mention_limit`: Max @mentions allowed per message
|
||||||
|
|
||||||
|
**User Blocklist:**
|
||||||
|
- `blocked_user_ids`: List of Discord user IDs to block
|
||||||
|
- Automatically deletes ALL images, GIFs, embeds, and URLs from these users
|
||||||
|
- No AI cost - instant deletion
|
||||||
|
- Useful for known problematic users or spam accounts
|
||||||
|
|
||||||
**Cost Controls:**
|
**Cost Controls:**
|
||||||
The bot includes multiple layers of cost control:
|
The bot includes multiple layers of cost control:
|
||||||
- Rate limiting (25 AI checks/hour/guild, 5/hour/user by default)
|
- Rate limiting (25 AI checks/hour/guild, 5/hour/user by default)
|
||||||
@@ -222,6 +232,12 @@ guardden/
|
|||||||
|
|
||||||
## How It Works
|
## How It Works
|
||||||
|
|
||||||
|
### User Blocklist (Instant, No AI Cost)
|
||||||
|
1. Checks if message author is in `blocked_user_ids` list
|
||||||
|
2. If message contains ANY media (images, embeds, URLs), instantly deletes it
|
||||||
|
3. No AI analysis needed - immediate action
|
||||||
|
4. Useful for known spam accounts or problematic users
|
||||||
|
|
||||||
### Spam Detection
|
### Spam Detection
|
||||||
1. Bot monitors message rate per user
|
1. Bot monitors message rate per user
|
||||||
2. Detects duplicate messages
|
2. Detects duplicate messages
|
||||||
@@ -229,12 +245,13 @@ guardden/
|
|||||||
4. Violations result in message deletion + timeout
|
4. Violations result in message deletion + timeout
|
||||||
|
|
||||||
### NSFW Image Detection
|
### NSFW Image Detection
|
||||||
1. Bot checks attachments and embeds for images
|
1. Checks user blocklist first (instant deletion if matched)
|
||||||
2. Applies rate limiting and deduplication
|
2. Checks NSFW video domain blocklist (instant deletion)
|
||||||
3. Downloads image and sends to AI provider
|
3. Bot checks attachments and embeds for images
|
||||||
4. AI analyzes for NSFW content categories
|
4. Applies rate limiting and deduplication
|
||||||
5. Violations result in message deletion + timeout
|
5. Downloads image and sends to AI provider
|
||||||
6. Optionally checks known NSFW video domain links
|
6. AI analyzes for NSFW content categories
|
||||||
|
7. Violations result in message deletion + timeout
|
||||||
|
|
||||||
### Cost Management
|
### Cost Management
|
||||||
The bot includes aggressive cost controls for AI usage:
|
The bot includes aggressive cost controls for AI usage:
|
||||||
|
|||||||
@@ -36,6 +36,12 @@ ai_moderation:
|
|||||||
check_video_thumbnails: false # Skip video thumbnails (disabled per user request)
|
check_video_thumbnails: false # Skip video thumbnails (disabled per user request)
|
||||||
url_image_check_enabled: false # Skip URL image downloads (disabled per user request)
|
url_image_check_enabled: false # Skip URL image downloads (disabled per user request)
|
||||||
|
|
||||||
|
# User Blocklist (No AI cost)
|
||||||
|
# Block all images, GIFs, embeds, and URLs from these users
|
||||||
|
# Add Discord user IDs here
|
||||||
|
blocked_user_ids:
|
||||||
|
# Example: - 123456789012345678
|
||||||
|
|
||||||
# NSFW Video Domain Blocklist (No AI cost)
|
# NSFW Video Domain Blocklist (No AI cost)
|
||||||
# These domains are blocked instantly without AI analysis
|
# These domains are blocked instantly without AI analysis
|
||||||
nsfw_video_domains:
|
nsfw_video_domains:
|
||||||
|
|||||||
@@ -92,7 +92,28 @@ class AIModeration(commands.Cog):
|
|||||||
if not config.get_setting("ai_moderation.enabled", True):
|
if not config.get_setting("ai_moderation.enabled", True):
|
||||||
return
|
return
|
||||||
|
|
||||||
# Check NSFW video domain blocklist first (no AI cost)
|
# Check user blocklist first (blocks ALL media from specific users)
|
||||||
|
blocked_users = config.get_setting("blocked_user_ids", [])
|
||||||
|
if message.author.id in blocked_users:
|
||||||
|
# Check if message has any media content (images, embeds, URLs)
|
||||||
|
has_media = (
|
||||||
|
bool(message.attachments) or
|
||||||
|
bool(message.embeds) or
|
||||||
|
bool(URL_PATTERN.search(message.content))
|
||||||
|
)
|
||||||
|
|
||||||
|
if has_media:
|
||||||
|
try:
|
||||||
|
await message.delete()
|
||||||
|
logger.info(
|
||||||
|
f"Deleted media content from blocked user {message.author} "
|
||||||
|
f"({message.author.id}) in {message.guild.name}"
|
||||||
|
)
|
||||||
|
except (discord.Forbidden, discord.NotFound):
|
||||||
|
logger.warning(f"Failed to delete message from blocked user {message.author.id}")
|
||||||
|
return
|
||||||
|
|
||||||
|
# Check NSFW video domain blocklist (no AI cost)
|
||||||
if self._has_nsfw_video_link(message.content):
|
if self._has_nsfw_video_link(message.content):
|
||||||
try:
|
try:
|
||||||
await message.delete()
|
await message.delete()
|
||||||
|
|||||||
Reference in New Issue
Block a user