diff --git a/AGENTS-BOT.md b/AGENTS-BOT.md index d52c838..8132b34 100644 --- a/AGENTS-BOT.md +++ b/AGENTS-BOT.md @@ -14,7 +14,9 @@ The bot uses a **Modular Command & Event Loading** pattern with **ESM (ECMAScrip 5. **Twitch Monitoring:** Periodic API polling with Stream ID tracking. 6. **Reminder System:** Periodic reminder checking with target_time tracking. 7. **Auto-Response System:** Trigger word detection for automatic replies. -8. **Grouped Commands:** Admin/Owner/Trigger/Timer commands grouped under subcommands. +8. **Welcome/Goodbye System:** Guild member add/remove events with customizable messages. +10. **Logging System:** Configurable event logging (messages, roles, moderation, etc.). +11. **Grouped Commands:** Admin/Owner/Trigger/Timer commands grouped under subcommands. ## πŸ“ Project Structure @@ -29,12 +31,20 @@ pixelpoebel/ β”‚ β”‚ β”œβ”€β”€ help.ts β”‚ β”‚ β”œβ”€β”€ twitch.ts β”‚ β”‚ β”œβ”€β”€ trigger.ts # Auto-responses -β”‚ β”‚ β”œβ”€β”€ timer.ts # Reminders -β”‚ β”‚ β”œβ”€β”€ admin.ts # All admin subcommands -β”‚ β”‚ └── owner.ts # All owner subcommands +β”‚ β”‚ β”œβ”€β”€ timer.ts # Reminders +β”‚ β”‚ β”œβ”€β”€ welcome.ts # Welcome/Goodbye messages +β”‚ β”‚ β”œβ”€β”€ log.ts # Event logging +β”‚ β”‚ β”œβ”€β”€ admin.ts # All admin subcommands +β”‚ β”‚ └── owner.ts # All owner subcommands β”‚ β”œβ”€β”€ events/ β”‚ β”‚ β”œβ”€β”€ ready.ts -β”‚ β”‚ └── interactionCreate.ts +β”‚ β”‚ β”œβ”€β”€ interactionCreate.ts +β”‚ β”‚ β”œβ”€β”€ guildMemberAdd.ts # Welcome messages +β”‚ β”‚ β”œβ”€β”€ guildMemberRemove.ts # Goodbye messages +β”‚ β”‚ β”œβ”€β”€ guildMemberUpdate.ts # Nickname/role changes +β”‚ β”‚ β”œβ”€β”€ messageDelete.ts # Deleted messages +β”‚ β”‚ β”œβ”€β”€ messageUpdate.ts # Edited messages +β”‚ β”‚ └── channelEvent.ts # Channel create/delete β”‚ └── structures/ β”‚ β”œβ”€β”€ ExtendedClient.ts β”‚ β”œβ”€β”€ Command.ts @@ -47,7 +57,8 @@ pixelpoebel/ β”œβ”€β”€ tsconfig.json β”œβ”€β”€ Dockerfile β”œβ”€β”€ docker-compose.yml -└── .env.example +β”œβ”€β”€ .env.example +└── .gitattributes ``` ## πŸ“ Implementation Steps @@ -88,6 +99,10 @@ CREATE TABLE guild_settings ( prefix TEXT DEFAULT '!', mod_log_channel TEXT, welcome_channel TEXT, + welcome_message TEXT, + goodbye_message TEXT, + log_channel TEXT, + log_events TEXT DEFAULT 'messages,roles,nicks,channels,warns,mutes,kicks,bans', warn_threshold INTEGER DEFAULT 3, warn_action TEXT DEFAULT 'ban', warn_mute_duration INTEGER DEFAULT 1800 @@ -227,7 +242,48 @@ export class ReminderManager { } ``` -### 5. Auto-Response (Trigger) System +### 5. Welcome/Goodbye System + +**Variables in messages:** `{user}`, `{username}`, `{server}`, `{membercount}` + +**Auto-use Discord system channel if no custom channel set:** +```typescript +const channelId = settings?.welcome_channel || member.guild.systemChannelId; +``` + +### 6. Logging System + +**Events that can be logged:** +- `messages` - Deleted and edited messages +- `roles` - Role changes +- `nicks` - Nickname changes +- `channels` - Channel create/delete +- `warns` - User warnings +- `mutes` - User mutes +- `kicks` - User kicks +- `bans` - User bans + +**Log moderation action:** +```typescript +async function sendModerationLog(client: any, guildId: string, event: string, embed: EmbedBuilder) { + const DB = client.DB; + const settings: any = DB.get('SELECT log_events FROM guild_settings WHERE guild_id = ?', guildId); + + if (!settings?.log_events) return; + const activeEvents = settings.log_events.split(',').filter(Boolean); + if (!activeEvents.includes(event)) return; + + const logSettings: any = DB.get('SELECT log_channel FROM guild_settings WHERE guild_id = ?', guildId); + if (!logSettings?.log_channel) return; + + const channel = client.guilds.cache.get(guildId)?.channels.cache.get(logSettings.log_channel); + if (!channel || !channel.isTextBased()) return; + + await (channel as any).send({ embeds: [embed] }); +} +``` + +### 7. Auto-Response (Trigger) System ```typescript // Add trigger (admin only) @@ -241,7 +297,7 @@ DB.all('SELECT * FROM auto_responses WHERE guild_id = ? ORDER BY trigger_word AS DB.run('DELETE FROM auto_responses WHERE guild_id = ? AND trigger_word = ?', guildId, triggerWord); ``` -### 6. Twitch Monitoring with Stream ID +### 8. Twitch Monitoring with Stream ID ```typescript // Stream ID tracking prevents duplicate notifications @@ -255,7 +311,7 @@ if (wasOffline || (monitor.last_status === 'online' && isNewStream)) { } ``` -### 7. Configurable Warn System +### 9. Configurable Warn System **Database Schema:** - `warn_threshold`: Number of warns before action @@ -275,7 +331,7 @@ if (warnCount >= warnThreshold) { } ``` -### 8. Mute with Multiple Time Units +### 10. Mute with Multiple Time Units ```typescript const unitSeconds: Record = { @@ -319,6 +375,7 @@ docker-compose up -d --build 4. **Twitch API:** Max 100 channels per request, batch properly. 5. **Deploy:** Commands NOT auto-registered on start – use `/owner deploy`. 6. **Ephemeral Replies:** Use `flags: [MessageFlags.Ephemeral]` instead of deprecated `ephemeral: true`. +7. **Line Endings:** Use `.gitattributes` to ensure LF line endings for consistency. ## πŸ“‹ Command Summary @@ -326,8 +383,10 @@ docker-compose up -d --build |---------|-------------|------------| | `/ping` | – | Public | | `/help` | – | Public | -| `/twitch` | online, add, remove, list, help | Public/Admin | +| `/twitch` | online, add, remove, list, listall, help | Public/Admin | | `/trigger` | add, remove, list, help | Public/Admin | | `/timer` | add, remove, list, listall, help | Public/Admin | +| `/welcome` | setchannel, add, remove, list, help | Admin | +| `/log` | setchannel, enable, disable, list, help | Admin | | `/admin` | kick, warn, unwarn, mute, unmute, ban, unban, config, help | Admin | | `/owner` | deploy, stats, servers, help | Owner | \ No newline at end of file diff --git a/README.md b/README.md index 14fb9a7..a8b26a5 100644 --- a/README.md +++ b/README.md @@ -59,10 +59,8 @@ npm run deploy - `/twitch online ` – Twitch-Status - `/twitch list` – Überwachte KanΓ€le - `/twitch help` – Twitch-Hilfe - -### Trigger (Auto-Antworten) -- `/trigger add ` – Trigger hinzufΓΌgen (Mod) -- `/trigger remove ` – Trigger entfernen (Mod) +- `/timer list` – Timer dieses Kanals +- `/timer help` – Timer-Hilfe - `/trigger list` – Alle Trigger anzeigen - `/trigger help` – Trigger-Hilfe @@ -73,9 +71,21 @@ npm run deploy - `/timer listall` – Alle Timer (Mod) - `/timer help` – Timer-Hilfe +### Trigger (Auto-Antworten) +- `/trigger add ` – Trigger hinzufΓΌgen (Mod) +- `/trigger remove ` – Trigger entfernen (Mod) +- `/trigger list` – Alle Trigger anzeigen +- `/trigger help` – Trigger-Hilfe + +### Twitch +- `/twitch online ` – PrΓΌft ob Kanal online ist +- `/twitch add ` – Streamer ΓΌberwachen (Mod) +- `/twitch remove ` – Streamer entfernen (Mod) +- `/twitch list` – Überwachte KanΓ€le +- `/twitch listall` – Alle ΓΌberwachten Streamer (Mod) +- `/twitch help` – Twitch-Hilfe + ### Admin -- `/twitch add ` – Kanal ΓΌberwachen -- `/twitch remove ` – Kanal entfernen - `/admin kick ` – Nutzer kicken - `/admin warn ` – Nutzer verwarnen - `/admin unwarn ` – Letzte Warnung entfernen @@ -98,9 +108,10 @@ npm run deploy - βœ… TypeScript - βœ… SQLite Database - βœ… Twitch Monitoring -- βœ… Auto-Deploy beim Start - βœ… Moderation Tools - βœ… Konfigurierbares Warn-System - βœ… Auto-Antworten (Trigger) - βœ… Timer & Erinnerungen -- βœ… Docker Support \ No newline at end of file +- βœ… Welcome/Goodbye Messages +- βœ… Event Logging +- βœ… Docker Support