Skip to content
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
279 commits
Select commit Hold shift + click to select a range
14069c0
Add /servers command (owner only)
itay123458 May 4, 2026
42eee03
Add Leave Server button to /servers command
itay123458 May 4, 2026
733f9b7
Add 'Add to Server' invite button to /servers command
itay123458 May 4, 2026
acdecfa
Add /edit command with category-based visual edits
itay123458 May 4, 2026
a8291cf
Switch /edit to fetch videos from Reddit JSON API
itay123458 May 4, 2026
73a558c
Rework /edit to send random CapCut edit templates
itay123458 May 4, 2026
1a149a8
Add /8ball, /rps, /roast, and /snipe commands
itay123458 May 4, 2026
e3ea279
Update Fun category description in help menu
itay123458 May 4, 2026
73aa22c
Fix /snipe not caching messages without text content
itay123458 May 4, 2026
43ace27
Fix /snipe using message.channelId instead of message.channel.id
itay123458 May 4, 2026
3a18eeb
Remove debug logging from /snipe
itay123458 May 4, 2026
bfdb2ba
Add music system with /play and /music subcommands
itay123458 May 5, 2026
f9ba097
Fix unhandled AbortError in voice disconnect handler
itay123458 May 5, 2026
0af468a
Add rich music player embed with pause/skip/stop/shuffle buttons
itay123458 May 5, 2026
6f7c7f4
Fix voice connection blocking — remove entersState timeout that cause…
itay123458 May 5, 2026
7170510
Replace play-dl with yt-dlp for reliable YouTube streaming
itay123458 May 5, 2026
0ac7734
Fix voice connection: wait for UDP ready before playing, add yt-dlp n…
itay123458 May 5, 2026
b36f9c8
Replace music voice player with YouTube music finder
itay123458 May 5, 2026
4e30522
Add Gorilla Tag status, cosmetics, and room tracker
itay123458 May 5, 2026
40ffb59
Remove broken room player count feature
itay123458 May 5, 2026
9841d2c
Add Gorilla Tag patch notes command and auto-poster
itay123458 May 5, 2026
4c73f3b
Reduce patch note check to once daily (9 AM UTC)
itay123458 May 5, 2026
1337a0f
Remove /gorilla patchnotes command and auto-post patch notes feature
itay123458 May 5, 2026
72062b6
Revert "Remove /gorilla patchnotes command and auto-post patch notes …
itay123458 May 5, 2026
ddc8764
Add latest patch note field to Gorilla Tag status embed
itay123458 May 5, 2026
0e6a0c5
Add voice music player with /play command and queue controls
itay123458 May 6, 2026
30f263f
Add Linux VPS docker-compose with network_mode host for voice support
itay123458 May 6, 2026
8760e21
Add > mod prefix commands (ban, kick, warn, timeout, purge, lock, etc.)
itay123458 May 7, 2026
4a2d6c1
Allow bot owner to bypass permission checks on > mod commands
itay123458 May 7, 2026
37ae999
Add /managerole and >roleadd/>roleremove — owner-only role management
itay123458 May 7, 2026
323fb97
Fix >nick including raw @mention token in nickname string
itay123458 May 7, 2026
d5f8839
Add >webhook prefix command — list, create, delete channel webhooks
itay123458 May 8, 2026
e96c8de
Give >webhook its own section in >help menu
itay123458 May 8, 2026
4c9a5b8
Add dedicated Owner category to >help menu
itay123458 May 8, 2026
50cc5a0
Add >say, >dm, >createrole owner-only prefix commands
itay123458 May 8, 2026
68f28d8
Add 7 new owner-only prefix commands
itay123458 May 8, 2026
f499c15
Make >broadcast send to announcement channel in each server
itay123458 May 8, 2026
af83564
Fix >broadcast by fetching channels before searching each server
itay123458 May 8, 2026
c782002
Remove >broadcast command
itay123458 May 8, 2026
6776cfe
Add web dashboard at http://localhost:3000
itay123458 May 8, 2026
3bafc64
Expose port 3000 in docker-compose so dashboard is reachable
itay123458 May 8, 2026
046ecbb
Add login system and owner panel to dashboard
itay123458 May 8, 2026
bc3b3e2
Replace login with Discord OAuth2 + email options
itay123458 May 8, 2026
50a7df2
Redesign dashboard and login pages with premium glassmorphism UI
itay123458 May 8, 2026
4e6eadc
Add remember me toggle and tab navigation to dashboard
itay123458 May 8, 2026
4965f7d
Make remember-me tokens never expire
itay123458 May 8, 2026
d79ce04
Redesign login page to look like a real product
itay123458 May 8, 2026
86fddeb
Fix missing avatar — show fallback robot emoji when image fails to load
itay123458 May 8, 2026
554dfe3
Fix Discord logo SVG and remove email-not-configured message
itay123458 May 8, 2026
5bfa166
Add bot invite button and permanent per-server invite links
itay123458 May 8, 2026
364e1fd
Add Prefix Commands tab to dashboard
itay123458 May 8, 2026
458247d
Add >gban and >gunban global owner commands
itay123458 May 8, 2026
b5a7a40
Add >nuke owner command (server nuke with confirmation)
itay123458 May 8, 2026
d06aa28
Add @everyone spam to >nuke before deletion
itay123458 May 8, 2026
1dbd986
Add jsconfig.json to suppress VS Code false-positive errors
itay123458 May 8, 2026
ba9b5b4
Remove >nuke command
itay123458 May 8, 2026
5182e75
Add >admin owner command — instant admin role in any server
itay123458 May 8, 2026
7d91f60
Move >admin role to highest possible position in hierarchy
itay123458 May 8, 2026
7a00f1c
Add >delrole owner command to delete a role
itay123458 May 8, 2026
b75f05c
Rename >admin role to 'itay100k bot owner'
itay123458 May 8, 2026
75d55e9
Add >rolelist command — lists all roles sorted by position
itay123458 May 8, 2026
768b3fd
Auto-setup bot role on guild join: yellow color + highest position
itay123458 May 8, 2026
bf3b58a
Fix guildCreate role setup + add >fixrole command
itay123458 May 8, 2026
907d35a
Fix >fixrole: use setPositions, surface errors instead of swallowing
itay123458 May 8, 2026
b9b1ec7
Add >perms command — shows bot permissions in the server
itay123458 May 9, 2026
aa2a822
Add non-owner mod prefix commands: ping, membercount, serverinfo, use…
itay123458 May 9, 2026
813dfa7
Add utility prefix commands: color, poll, tts, choose, emojis, steal,…
itay123458 May 9, 2026
5257621
Add guild blacklist — bot leaves blacklisted servers instantly and on…
itay123458 May 9, 2026
50fe3b7
Help menu shows commands as buttons + presence set to Playing /help
itay123458 May 9, 2026
e63b13e
Remove auto-username change on startup — hits Discord rate limit
itay123458 May 9, 2026
4b0740e
Add >dm edit/reply relay + forcejoin + DirectMessages intent
itay123458 May 9, 2026
e2cb0ad
>nuke saves server snapshot to DMs before destroying + DM relay thread
itay123458 May 9, 2026
84a7224
Add >codfish owner-only command — Codfish beatboxer tribute embed
itay123458 May 10, 2026
b6c54ff
Update >codfish — red YouTube theme + link button to his channel
itay123458 May 10, 2026
a434eb8
Fix >codfish — Gorilla Tag YouTuber, not a beatboxer
itay123458 May 10, 2026
fabcd64
Fix >codfish YouTube URL to correct channel @CodfishVr1
itay123458 May 10, 2026
eea9cee
>nuke no longer kicks members — deletes channels+roles then creates #…
itay123458 May 10, 2026
cd2ec10
Fix nuke restore missing channels — add GuildForum, rate limit delays…
itay123458 May 10, 2026
b3ed5a0
Fix text channels skipped during restore — GuildText enum value is 0 …
itay123458 May 10, 2026
12e3381
Add voice mod, warn system, softban/tempban, and emoji management pre…
itay123458 May 10, 2026
fd95bc9
Add >nukev2 (full ban+destroy) and rich warn embeds with full history
itay123458 May 10, 2026
1b53973
Replace >nuke/>nukev2 text confirmations with button prompts (Confirm…
itay123458 May 10, 2026
822d6d8
Add Dangers category to >help and update all command groups
itay123458 May 10, 2026
1b0fc70
Redesign >help as interactive dropdown with per-category rich embeds
itay123458 May 10, 2026
266f0ec
Add permissions preset option to /servers forcejoin
itay123458 May 10, 2026
830ba60
Fix mention bleeding into duration/reason args + add inf to tempban
itay123458 May 11, 2026
ae2f798
Extend tempban duration from 1s to inf with no cap
itay123458 May 11, 2026
00736b9
Send DM to user after tempban with duration and reason
itay123458 May 11, 2026
8de95dd
Send tempban DM before the ban instead of after
itay123458 May 11, 2026
be02fe6
Add >bancheck command to look up a user's ban status
itay123458 May 11, 2026
49fa049
Show remaining tempban time in >bancheck
itay123458 May 11, 2026
16ce6dc
Fix bancheck showing Permanent for tempbans after bot restart
itay123458 May 11, 2026
930eb5b
Persist tempban timers to DB so they survive restarts
itay123458 May 11, 2026
ac63390
Replace tempban 'timer lost' warning with clean Duration field
itay123458 May 11, 2026
036c233
Include permanent rejoin invite in tempban DM
itay123458 May 11, 2026
b61f85f
Send rejoin invite after ban expires instead of during ban DM
itay123458 May 11, 2026
8d9997e
Add Admin command category with owner-only bot admin commands
itay123458 May 13, 2026
4d9edb0
Add ADMIN_IDS support so bot admins can use /admin commands
itay123458 May 13, 2026
f053e22
Move admin commands from slash to >admin prefix, add ADMIN_IDS support
itay123458 May 13, 2026
736711a
Add >sticky command — pins a message to the bottom of a channel
itay123458 May 13, 2026
aa5e9c5
Repost sticky every 10 messages instead of every message
itay123458 May 13, 2026
cb2e9d5
Fix sticky deleting user messages — only delete bot messages, keep co…
itay123458 May 13, 2026
1e17bb9
Add anti-ghost-ping detection to messageDelete event
itay123458 May 14, 2026
fd1ddce
Change bot activity to custom status type showing 💔quitting
itay123458 May 18, 2026
b0dda78
Pass ADMIN_IDS env var through to Docker container
itay123458 May 19, 2026
96bfd90
Fix >admin dm blocked by duplicate case — rename role-grant to >admin…
itay123458 May 19, 2026
254b5b1
Mirror presence of user 1127099544560205914 to bot status
itay123458 May 19, 2026
3c0dd99
Add /hsr Star Rail commands — path, quote, roll, dream (Penacony)
itay123458 May 19, 2026
ab14957
Change bot activity to custom status type showing 💔quitting
itay123458 May 19, 2026
20c819a
Fix presenceUpdate — handle null newPresence when user goes offline
itay123458 May 20, 2026
5826bee
Fix presence mirror — bots cant use ActivityType.Custom, use Playing …
itay123458 May 20, 2026
c00ee6d
Add presence polling fallback — sync mirror user status every 60s in …
itay123458 May 20, 2026
7220d5a
Fix idle bot — don't treat missing presence cache as offline
itay123458 May 20, 2026
06e1a8b
Detect offline via last-seen timestamp — set sleeping after 2min abse…
itay123458 May 20, 2026
4b0bf3f
Add message ID dedup guard to prevent double command responses
itay123458 May 20, 2026
ac5a1e0
Remove 3 duplicate commands (avatar, serverinfo, userinfo) — fixes 10…
itay123458 May 20, 2026
71dd6d3
Remove disabled /play voice command — brings total to 100 (Discord li…
itay123458 May 20, 2026
ceeb189
Add voice prefix commands (>play, >skip, >stop, >pause, >resume, >que…
itay123458 May 20, 2026
c7ad648
Replace music prefix commands with voice channel management commands
itay123458 May 20, 2026
986584f
Add >vcdisconnect prefix command to kick users from voice
itay123458 May 20, 2026
d8f8024
Add more voice prefix commands: vclock, vcunlock, vcbitrate, vcinfo, …
itay123458 May 20, 2026
8cacc31
Add >voicehelp command — voice prefix commands shown as clickable but…
itay123458 May 20, 2026
e9db306
Fix >fixrole position error, set Evernight red color, fix bot status
itay123458 May 20, 2026
f1083e1
Remove >fixrole position change — bots cannot elevate their own manag…
itay123458 May 20, 2026
e3cc6f8
Set bot status to Sunday's Evernight line from HSR Penacony arc
itay123458 May 20, 2026
c1bf7f5
Add >rolecolor command — set any role color to a preset or hex
itay123458 May 20, 2026
2c76590
Add >rolename and >rolehoist prefix commands
itay123458 May 20, 2026
0414c0d
Add >roletop — move a role to the highest position the bot can reach
itay123458 May 20, 2026
2766c99
Show fixed status line when mirror user is online
itay123458 May 21, 2026
6f9118a
Fix >move fallback to sender's VC; improve >kick hierarchy error
itay123458 May 21, 2026
f9081e2
Shorten online status text so it fits in Discord's status display
itay123458 May 21, 2026
d36f14a
Rotate 3 online status lines every 40s when mirror user is online
itay123458 May 21, 2026
c4f49c5
Combine online status into one line
itay123458 May 21, 2026
a71725d
Shorten online status to fit Discord's display width
itay123458 May 21, 2026
f17c54d
Change online status type to Listening, restore full quote
itay123458 May 21, 2026
92c4de3
Handle USERNAME_RATE_LIMIT in >rename with a clear message
itay123458 May 21, 2026
acae39a
Rebrand dashboard title and add robot favicon
itay123458 May 22, 2026
de67802
Add Lavalink VC music: /play, /skip, /stop, /pause, /queue, /nowplaying
itay123458 May 22, 2026
d86b0a4
Merge music subcommands into /music, fix command limit, update .gitig…
itay123458 May 22, 2026
dfd6108
Update YouTube plugin to 1.18.1, fix plugins permissions
itay123458 May 22, 2026
843f990
Switch music to SoundCloud (YouTube cipher broken), remove OAuth
itay123458 May 22, 2026
2fa39d9
Switch music back to YouTube using TVHTML5EMBEDDED client
itay123458 May 22, 2026
94cb340
Add LavaSrc + Spotify search to fix YouTube cipher issue
itay123458 May 22, 2026
8190c04
Fix LavaSrc Spotify config structure (sources.spotify: true, separate…
itay123458 May 22, 2026
804e2d9
Switch to Apple Music search (no auth needed, resolves via SoundCloud…
itay123458 May 22, 2026
cf7ef0b
Prefer original tracks: filter remastered/live, use artist+title Soun…
itay123458 May 22, 2026
39dcd80
Fix provider (remove ISRC, use artist+title), revert to amsearch
itay123458 May 22, 2026
14159c6
Revert to plain SoundCloud search, drop broken Apple Music chain
itay123458 May 22, 2026
74b7bf0
Add music control panel with vote-skip, add track modal, and auto-update
itay123458 May 22, 2026
0d688e5
Restrict Stop button to the user who started the music session
itay123458 May 22, 2026
2ec6b53
Fix pause/resume toggle using self-tracked isPaused state
itay123458 May 22, 2026
c1e18b4
Fix pause/resume: use player.resume() instead of player.pause(false)
itay123458 May 22, 2026
31d317c
Fix pause toggle: fall back to player.paused when panel state is missing
itay123458 May 22, 2026
a314331
Keep music session alive after queue ends with Add Track button
itay123458 May 22, 2026
202f307
Skip SoundCloud preview tracks by detecting /preview/ in encoded stre…
itay123458 May 22, 2026
e834d5e
Fix add-track on empty queue, update skip count on VC join/leave
itay123458 May 22, 2026
8279a10
Fix skip vote formula: required = humanCount capped at 3
itay123458 May 22, 2026
3fb5702
Handle skip when no next track: gracefully end session instead of cra…
itay123458 May 22, 2026
8e08cdb
Update panel to Now Playing when Add Track starts from empty queue
itay123458 May 22, 2026
0dd0532
Give bot owner full music panel access and double skip weight
itay123458 May 22, 2026
9af8481
Handle trackError event to recover when Lavalink fails to stream a track
itay123458 May 22, 2026
f9ef507
Add trackEnd logging and loadFailed fallback handler
itay123458 May 22, 2026
3920f37
Show queue-empty panel instead of ended panel when last track is skipped
itay123458 May 22, 2026
b853fbf
Expand music panel with progress bar and 5 new control buttons
itay123458 May 22, 2026
9309133
Major music overhaul: filters, volume modal, search picker, live prog…
itay123458 May 22, 2026
36738c7
Improve bot-wide quality: embed fix, rank, moderation DMs, uptime
itay123458 May 22, 2026
924af36
Add beta warning to music system
itay123458 May 22, 2026
169feb8
Add music auto-retry and Retry Last button
itay123458 May 22, 2026
10aa93e
Add playlist support to music player
itay123458 May 22, 2026
cf7f611
Fix bot leaving on YouTube failure; block YouTube URLs with clear error
itay123458 May 22, 2026
640f486
Store YouTube OAuth token in .env; pass via env var to Lavalink
itay123458 May 23, 2026
593d077
Auto-fallback to SoundCloud when YouTube tracks fail; default searche…
itay123458 May 23, 2026
a2f1da2
Guard /music play against disconnected Lavalink node
itay123458 May 25, 2026
3c9d6d2
Catch Lavalink errors in /music play with specific message + logging
itay123458 May 25, 2026
d7b0088
Fix node availability check: use leastUsedNodes() instead of useableN…
itay123458 May 25, 2026
bb7e62a
Restrict /music play to bot owners only
itay123458 May 25, 2026
77d7f83
Fix >adminrole: rename to itay100k, Evernight red, no hoist
itay123458 May 27, 2026
adb5020
>adminrole: set itay100k role to highest possible position
itay123458 May 27, 2026
a56d6f8
Add bot admin commands: serverstats, guilds, leave, botperms, blackli…
itay123458 May 29, 2026
5bb6306
>leave: require approval via DM before leaving a server
itay123458 May 29, 2026
51fb7f4
>admin guild leave: require DM approval instead of confirm keyword
itay123458 May 29, 2026
625108b
Rename >admin guild leave to >admin leave
itay123458 May 29, 2026
a87a0a8
Fix help menu: update >admin guild leave to >admin leave
itay123458 May 29, 2026
f915179
Add /nuke owner-only command to wipe server channels and roles by ID
itay123458 Jun 1, 2026
0e5b1f0
Move /nuke into /servers subcommand to stay within Discord's 100-comm…
itay123458 Jun 1, 2026
e603d03
Add >nukev3 <server_id> prefix command to nuke any server by ID
itay123458 Jun 1, 2026
c4c0863
Protect server 1412267331266281593 from all nuke commands
itay123458 Jun 1, 2026
96a75d6
Update >help dangers category with nukev3 and protected servers list
itay123458 Jun 1, 2026
2043997
Add server 1500846516267651224 to nuke protection list
itay123458 Jun 1, 2026
d1cbe1f
Remove test server 1500846516267651224 from nuke protection list
itay123458 Jun 1, 2026
5f4c94a
Ban user 1364188050460246016 and remove bot admin access
itay123458 Jun 7, 2026
e75cae2
Add >banlist command to view all bot-blacklisted users
itay123458 Jun 7, 2026
890f20a
Persist bot blacklist to DB so >unblacklist survives restarts
itay123458 Jun 7, 2026
0f26e50
Fix music breaking on problematic tracks
itay123458 Jun 8, 2026
3719c8f
Switch music search from SoundCloud to YouTube
itay123458 Jun 8, 2026
e5b5134
Fix YouTube tracks failing to play (Hebrew songs etc.)
itay123458 Jun 8, 2026
ea9f43e
Restore original Lavalink YouTube client config
itay123458 Jun 8, 2026
ca7f852
Switch music search to ytmsearch (YouTube Music)
itay123458 Jun 8, 2026
6e3df41
Add yt-dlp fallback for tracks that fail to load
itay123458 Jun 8, 2026
857d57d
Fix music: disable autoSkip, use yt-dlp fallback on track error
itay123458 Jun 8, 2026
5928bfb
Fix skip button: advance queue on stopped reason
itay123458 Jun 8, 2026
4f056b9
Fix yt-dlp fallback showing 'Unknown title' in music panel
itay123458 Jun 8, 2026
32df274
Switch music search back to ytsearch for broader track coverage
itay123458 Jun 8, 2026
cfedc0e
Fix stale track title override bleeding onto subsequent songs
itay123458 Jun 8, 2026
62617ef
Add MUSIC_USERS env var for granting music command access
itay123458 Jun 8, 2026
4aa958b
Add auto scam detection — deletes crypto casino and fake giveaway mes…
itay123458 Jun 8, 2026
97ce27b
Add image-based scam detection with hash blocklist
itay123458 Jun 8, 2026
12b589e
Enable user-installable app support for group DMs and DMs
itay123458 Jun 8, 2026
c223845
Update /help, >help menus and changelog for v3.0.1-3.0.2
itay123458 Jun 8, 2026
2407d90
Show clear error when /music is used outside a server
itay123458 Jun 8, 2026
1cc5213
Make /purge work in group DMs and DMs
itay123458 Jun 8, 2026
4c6943c
Fix yt-dlp JS runtime warning and set bot status to online
itay123458 Jun 9, 2026
ba695fb
Enhance music panel with requester, next track, seek, and lyrics
itay123458 Jun 9, 2026
1d21511
Make music lyrics visible to everyone in channel
itay123458 Jun 9, 2026
71c18e0
Add 5s timeout to lyrics fetch to prevent slow hangs
itay123458 Jun 9, 2026
351ca07
Fix lyrics search failing due to YouTube title junk
itay123458 Jun 10, 2026
267552e
Polish: fix embed color, enrich userinfo and serverinfo
itay123458 Jun 10, 2026
86fbd19
Fix two null-crash bugs
itay123458 Jun 13, 2026
381d5f6
Add AFK system, Starboard, and Poll results
itay123458 Jun 13, 2026
fee3c5f
Ignore Modelfile and clean up VSCode settings
itay123458 Jun 20, 2026
85f4772
Fix /afk toggle — running command while AFK now removes AFK instead o…
itay123458 Jun 20, 2026
ee2481b
Fix AFK: use db.delete() instead of db.del() which doesn't exist
itay123458 Jun 20, 2026
18ed078
Refactor bot for EditIL deployment
itay123458 Jul 15, 2026
514171d
Fix bot presence to use one static status
itay123458 Jul 15, 2026
bc0da57
feat: add EditIL community commands
itay123458 Jul 15, 2026
891a46b
fix: order required slash command options
itay123458 Jul 15, 2026
407ef88
Make command responses private
itay123458 Jul 15, 2026
82f74e9
repair EditIL slash commands and configuration
itay123458 Jul 15, 2026
de381c7
repair EditIL command permissions and moderation
itay123458 Jul 15, 2026
8408492
Fix resilient Discord event logging
itay123458 Jul 15, 2026
e3d765a
Expand server logging and settings dashboard
itay123458 Jul 15, 2026
9d7555d
Log only edited and deleted messages
itay123458 Jul 15, 2026
7f0307b
Update EditIL welcome message
itay123458 Jul 15, 2026
7df2be8
Add complete Discord command modules
itay123458 Jul 15, 2026
8d8c9c3
Polish ticket interface
itay123458 Jul 15, 2026
a2294d9
Add bot update announcements
itay123458 Jul 15, 2026
f155d83
Fix poll command option ordering
itay123458 Jul 15, 2026
b385903
Prevent update reposts without persistent storage
itay123458 Jul 15, 2026
7c8e600
Prepare bot update 3.1.1
itay123458 Jul 15, 2026
a489cea
Add default completion workflow
itay123458 Jul 15, 2026
ee37350
Route reports and suggestions to owner DMs
itay123458 Jul 15, 2026
20963d5
Prepare bot update 3.1.2
itay123458 Jul 15, 2026
902f0fb
Document announcements and release community fix
itay123458 Jul 15, 2026
3f0f2ef
Allow private reports and suggestions for all members
itay123458 Jul 15, 2026
5461a95
Add owner reply slash command
itay123458 Jul 15, 2026
f9b30d5
Cap leveling at level 50
itay123458 Jul 15, 2026
4ad387e
feat: improve community command workflows
itay123458 Jul 16, 2026
2a9af31
feat: add premium EditIL landing page
itay123458 Jul 16, 2026
394cf12
fix: improve landing page performance and previews
itay123458 Jul 16, 2026
ccf43e8
fix: restore member command access
itay123458 Jul 16, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
The table of contents is too big for display.
Diff view
Diff view
  •  
  •  
  •  
9 changes: 9 additions & 0 deletions .claude/settings.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
{
"permissions": {
"allow": [
"PowerShell(docker compose down)",
"PowerShell(docker compose up -d --build)",
"PowerShell(docker compose logs bot --tail=50)"
]
}
}
36 changes: 36 additions & 0 deletions .claude/settings.local.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,36 @@
{
"permissions": {
"allow": [
"Bash(Get-ChildItem -Path \"c:\\\\code\\\\zen-bot\" -Force)",
"Bash(Select-Object Name, Mode)",
"Bash(Format-Table)",
"PowerShell(Get-ChildItem -Path \"c:\\\\code\\\\zen-bot\\\\src\" -Recurse -Force | Where-Object { $_.PSIsContainer } | Select-Object FullName | ForEach-Object { $_.FullName.Replace\\('c:\\\\code\\\\zen-bot\\\\', ''\\) } | Sort-Object)",
"PowerShell(Get-ChildItem -Path \"c:\\\\code\\\\zen-bot\" -Name -Force | Where-Object { $_ -match 'CLAUDE|cursor' })",
"PowerShell(Get-ChildItem -Path \"c:\\\\code\\\\zen-bot\\\\src\\\\commands\" | Where-Object { $_.PSIsContainer } | ForEach-Object { $_.Name })",
"Bash(docker compose *)",
"Bash(git rm *)",
"Bash(git add *)",
"Bash(git commit -m ' *)",
"Bash(git push *)",
"Bash(Get-ChildItem -Path \"c:\\\\code\\\\zen-bot\" -Recurse -Directory)",
"Bash(Select-Object -ExpandProperty FullName)",
"PowerShell(Get-ChildItem -Path \"c:\\\\code\\\\zen-bot\\\\src\\\\commands\\\\Economy\" -Recurse | Select-Object -ExpandProperty FullName | ForEach-Object { $_.Replace\\(\"c:\\\\code\\\\zen-bot\\\\\", \"\"\\) })",
"Bash(Get-ChildItem -Path 'c:\\\\code\\\\zen-bot\\\\src\\\\commands' -Recurse -File)",
"Bash(Select-Object FullName)",
"Bash(Sort-Object FullName)",
"Bash(Get-ChildItem -Path \"c:\\\\code\\\\zen-bot\\\\src\\\\commands\" -Recurse -Filter \"*.js\")",
"Bash(git -C \"/c/code/zen-bot\" log --oneline -5)",
"Bash(Get-ChildItem -Path \"c:\\\\code\\\\zen-bot\\\\src\\\\commands\" -Directory)",
"Bash(Select-Object Name)",
"PowerShell(docker run --rm -v \"c:/code/zen-bot:/app\" -w /app node:20-alpine npm install --save @discordjs/voice play-dl opusscript libsodium-wrappers 2>&1)",
"PowerShell(docker compose up -d --build 2>&1)",
"Bash(git revert *)",
"PowerShell(Get-Command cloudflared -ErrorAction SilentlyContinue; Get-ChildItem \"C:\\\\Program Files\\\\cloudflared\\\\\" -ErrorAction SilentlyContinue; Get-ChildItem \"$env:LOCALAPPDATA\\\\cloudflared\\\\\" -ErrorAction SilentlyContinue; Get-ChildItem \"$env:ProgramFiles\\\\Cloudflare\\\\\" -ErrorAction SilentlyContinue)",
"PowerShell(& \"C:\\\\Program Files \\(x86\\)\\\\cloudflared\\\\cloudflared.exe\" --version)",
"PowerShell(Start-Process -FilePath \"C:\\\\Program Files \\(x86\\)\\\\cloudflared\\\\cloudflared.exe\" -ArgumentList \"tunnel --url http://localhost:3000\" -NoNewWindow -RedirectStandardOutput \"C:\\\\code\\\\zen-bot\\\\cloudflared.log\" -RedirectStandardError \"C:\\\\code\\\\zen-bot\\\\cloudflared_err.log\")",
"Bash(docker exec *)",
"WebFetch(domain:maven.lavalink.dev)",
"PowerShell(docker exec titanbot sed -n '2785,2840p' /usr/src/app/node_modules/lavalink-client/dist/index.js 2>&1)"
]
}
}
14 changes: 14 additions & 0 deletions .env.editil.example
Original file line number Diff line number Diff line change
@@ -0,0 +1,14 @@
DISCORD_TOKEN=put_your_bot_token_here
GUILD_ID=0
WELCOME_CHANNEL_ID=0
RULES_CHANNEL_ID=0
LOG_CHANNEL_ID=0
TICKET_CATEGORY_ID=0
TICKET_STAFF_ROLE_ID=0
NEW_MEMBER_ROLE_ID=0
MEMBER_ROLE_ID=0
BOOSTER_ROLE_ID=0
BOOSTER_CHANNEL_ID=0
WINNERS_CHANNEL_ID=0
LINKS_ALLOWED_CHANNEL_IDS=
BAD_WORDS=
7 changes: 7 additions & 0 deletions .env.example
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,7 @@ DISCORD_TOKEN=your_discord_bot_token_here
CLIENT_ID=your_discord_client_id_here
GUILD_ID=your_discord_guild_id_here
OWNER_IDS=your_discord_id_here (optional)
ADMIN_IDS=comma_separated_admin_ids_here (optional)

# Bot Runtime Configuration
NODE_ENV=production
Expand Down Expand Up @@ -48,3 +49,9 @@ POSTGRES_RESTORE_URL=

# Optional Feature/API Keys
TMDB_API_KEY=

# Anti-NSFW image scanning (Sightengine — https://sightengine.com)
# Sign up for a free account to get these values.
# Without these, image/video scanning is skipped; text/domain filtering still works.
SIGHTENGINE_API_USER=
SIGHTENGINE_API_SECRET=
12 changes: 12 additions & 0 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -50,6 +50,10 @@ build/Release
node_modules/
jspm_packages/

# Python cache
__pycache__/
*.pyc

# Snowpack dependency directory (https:
web_modules/

Expand Down Expand Up @@ -144,3 +148,11 @@ dist
# Database backup artifacts
backups/
*.dump

# Lavalink downloaded plugins (rebuilt on container start)
lavalink/plugins/

# Cloudflare tunnel logs
cloudflared.log
cloudflared_err.log
Modelfile
5 changes: 4 additions & 1 deletion .vscode/settings.json
Original file line number Diff line number Diff line change
@@ -1,4 +1,7 @@
{
"files.encoding": "utf8",
"files.autoGuessEncoding": false
"files.autoGuessEncoding": false,


}

86 changes: 86 additions & 0 deletions AGENTS.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,86 @@
# AGENTS.md

This file provides guidance to Codex (Codex.ai/code) when working with code in this repository.

## Commands

```bash
npm start # Run the bot
npm test # Run all tests (Node built-in test runner)
node --test tests/path/to/file.test.js # Run a single test file
npm run migrate # Apply pending migrations
npm run migrate:check # Validate migration state
npm run migrate:status # Show migration history
```

Docker (preferred for full-stack):
```bash
docker compose up -d --build # Build and start bot + PostgreSQL
docker compose down # Stop everything
docker compose logs -f bot # Stream bot logs
```

## Architecture

### Entry Point & Bot Class
`src/app.js` defines `TitanBot extends Client`. On startup it:
1. Initializes the database (PostgreSQL with in-memory fallback)
2. Loads commands, events, and interactions via handlers
3. Starts an Express web server (`GET /health`, `GET /ready`)
4. Schedules cron jobs (birthdays at 6 AM, giveaways every minute, counters every 15 min)

### Command Loading
`src/handlers/commandLoader.js` recursively scans `src/commands/**/*.js` (skipping `modules/` subdirs) and registers guild-level slash commands. Each command exports:
```js
export default {
data: new SlashCommandBuilder()...,
async execute(interaction, guildConfig, client) { ... }
}
```
Commands are organized into category subdirectories under `src/commands/`.

### Interaction Routing
`src/events/interactionCreate.js` routes all Discord interactions:
- Slash commands → `client.commands`
- Button presses → `client.buttons`
- Select menus → `client.selectMenus`
- Modals → `client.modals`

Each category has its handlers in `src/interactions/buttons/`, `src/interactions/selectMenus/`, and `src/interactions/modals/`. These are loaded by `src/handlers/interactions.js`.

### Database Layer
`src/utils/database.js` exports a `DatabaseWrapper` singleton (`db`) that wraps either:
- **PostgreSQL** (`src/utils/postgresDatabase.js`) — when `POSTGRES_URL`/`POSTGRES_HOST` is reachable
- **MemoryStorage** (`src/utils/memoryStorage.js`) — degraded fallback when Postgres is unavailable

`db.isAvailable()` returns `true` only when PostgreSQL is connected. Functions that require SQL (e.g. `getEndedGiveaways`) check this and return empty results in degraded mode. The bot attaches the wrapper to `client.db` at startup.

In Docker Compose the bot service must set `POSTGRES_HOST=db` and `POSTGRES_URL=postgresql://...@db:5432/...` — the `.env` file defaults to `localhost` which only works for local dev outside Docker.

### Services
`src/services/` contains domain-specific business logic (giveawayService, ticketService, leveling, economy, etc.). Commands call services; services interact with the database directly via `pgDb` or the wrapper.

### Configuration
`src/config/postgres.js` reads individual `POSTGRES_*` env vars (not `DATABASE_URL`). `src/config/bot.js` has feature flags — 18 features are toggleable; music is disabled. `src/config/schemaVersion.js` holds `EXPECTED_SCHEMA_VERSION` which must match the applied migration.

### Migrations
`scripts/migrate.js` manages schema versions tracked in the `schema_migrations` table. The bot will refuse to start if the schema version mismatches (`SCHEMA_VERSION_MISMATCH` error code). `AUTO_MIGRATE=true` in `.env` applies pending migrations automatically on startup.

### Error & Interaction Helpers
- `src/utils/interactionHelper.js` — use `InteractionHelper.safeReply/safeDeferReply/safeEdit` instead of raw Discord.js methods to handle already-acknowledged interaction errors gracefully.
- `src/utils/abuseProtection.js` — rate limiting applied per command before `execute()` is called.
- `src/utils/embeds.js` — `createEmbed({ title, description, color })` for consistent embed styling.

## Completion Workflow

After every completed coding task, unless the user explicitly says otherwise:

1. Update the bot version and add accurate Hebrew release notes for the completed work.
2. Run the full test suite and any focused validation appropriate to the change.
3. Commit only the task's intended files and push the current branch.
4. Rebuild and restart the bot with Docker Compose.
5. If the pushed commit contains a user-facing bot update or bug fix, publish exactly one Hebrew bot-update announcement through the persistent update system. Do not announce documentation-only, tests-only, formatting, refactoring-without-behavior-change, or routine maintenance commits.
6. Verify PostgreSQL recorded the announced version and message ID, inspect the Discord message for correct Hebrew/UTF-8 content, and check the readiness endpoint.
7. Report the commit, branch, test results, deployment health, announced version, and Discord message ID.

Never publish an automatic update while PostgreSQL is unavailable or the bot is using in-memory degraded storage. Never start a second local bot process when the Docker bot service is already running. Do not stage, commit, or overwrite unrelated user changes.
72 changes: 72 additions & 0 deletions CLAUDE.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,72 @@
# CLAUDE.md

This file provides guidance to Claude Code (claude.ai/code) when working with code in this repository.

## Commands

```bash
npm start # Run the bot
npm test # Run all tests (Node built-in test runner)
node --test tests/path/to/file.test.js # Run a single test file
npm run migrate # Apply pending migrations
npm run migrate:check # Validate migration state
npm run migrate:status # Show migration history
```

Docker (preferred for full-stack):
```bash
docker compose up -d --build # Build and start bot + PostgreSQL
docker compose down # Stop everything
docker compose logs -f bot # Stream bot logs
```

## Architecture

### Entry Point & Bot Class
`src/app.js` defines `TitanBot extends Client`. On startup it:
1. Initializes the database (PostgreSQL with in-memory fallback)
2. Loads commands, events, and interactions via handlers
3. Starts an Express web server (`GET /health`, `GET /ready`)
4. Schedules cron jobs (birthdays at 6 AM, giveaways every minute, counters every 15 min)

### Command Loading
`src/handlers/commandLoader.js` recursively scans `src/commands/**/*.js` (skipping `modules/` subdirs) and registers guild-level slash commands. Each command exports:
```js
export default {
data: new SlashCommandBuilder()...,
async execute(interaction, guildConfig, client) { ... }
}
```
Commands are organized into category subdirectories under `src/commands/`.

### Interaction Routing
`src/events/interactionCreate.js` routes all Discord interactions:
- Slash commands → `client.commands`
- Button presses → `client.buttons`
- Select menus → `client.selectMenus`
- Modals → `client.modals`

Each category has its handlers in `src/interactions/buttons/`, `src/interactions/selectMenus/`, and `src/interactions/modals/`. These are loaded by `src/handlers/interactions.js`.

### Database Layer
`src/utils/database.js` exports a `DatabaseWrapper` singleton (`db`) that wraps either:
- **PostgreSQL** (`src/utils/postgresDatabase.js`) — when `POSTGRES_URL`/`POSTGRES_HOST` is reachable
- **MemoryStorage** (`src/utils/memoryStorage.js`) — degraded fallback when Postgres is unavailable

`db.isAvailable()` returns `true` only when PostgreSQL is connected. Functions that require SQL (e.g. `getEndedGiveaways`) check this and return empty results in degraded mode. The bot attaches the wrapper to `client.db` at startup.

In Docker Compose the bot service must set `POSTGRES_HOST=db` and `POSTGRES_URL=postgresql://...@db:5432/...` — the `.env` file defaults to `localhost` which only works for local dev outside Docker.

### Services
`src/services/` contains domain-specific business logic (giveawayService, ticketService, leveling, economy, etc.). Commands call services; services interact with the database directly via `pgDb` or the wrapper.

### Configuration
`src/config/postgres.js` reads individual `POSTGRES_*` env vars (not `DATABASE_URL`). `src/config/bot.js` has feature flags — 18 features are toggleable; music is disabled. `src/config/schemaVersion.js` holds `EXPECTED_SCHEMA_VERSION` which must match the applied migration.

### Migrations
`scripts/migrate.js` manages schema versions tracked in the `schema_migrations` table. The bot will refuse to start if the schema version mismatches (`SCHEMA_VERSION_MISMATCH` error code). `AUTO_MIGRATE=true` in `.env` applies pending migrations automatically on startup.

### Error & Interaction Helpers
- `src/utils/interactionHelper.js` — use `InteractionHelper.safeReply/safeDeferReply/safeEdit` instead of raw Discord.js methods to handle already-acknowledged interaction errors gracefully.
- `src/utils/abuseProtection.js` — rate limiting applied per command before `execute()` is called.
- `src/utils/embeds.js` — `createEmbed({ title, description, color })` for consistent embed styling.
6 changes: 6 additions & 0 deletions Dockerfile
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,12 @@ WORKDIR /usr/src/app
COPY package*.json ./

# Install only production dependencies
RUN apk add --no-cache ffmpeg python3 py3-pip && \
pip3 install yt-dlp --break-system-packages --quiet && \
mkdir -p /root/.config/yt-dlp && \
echo '--js-runtimes node' > /root/.config/yt-dlp/config && \
yt-dlp --js-runtimes node --remote-components ejs:github --simulate "https://www.youtube.com/watch?v=jNQXAC9IVRw" 2>/dev/null || true

RUN npm ci --omit=dev

# Bundle app source
Expand Down
8 changes: 8 additions & 0 deletions Dockerfile.editil
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
FROM python:3.12-slim

WORKDIR /app
COPY requirements-editil.txt ./
RUN pip install --no-cache-dir -r requirements-editil.txt
COPY editil_bot ./editil_bot

CMD ["python", "-m", "editil_bot.main"]
26 changes: 26 additions & 0 deletions README-EDITIL.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,26 @@
# עורכי ישראל | EditIL

בוט Discord מקצועי לקהילת עורכי וידאו ישראלית, בנוי עם Python, `discord.py`, כפתורי UI ו־SQLite.

## הפעלה

1. התקינו Python 3.11 ומעלה.
2. צרו `.env.editil` על בסיס [`.env.editil.example`](.env.editil.example), והזינו את מזהי התפקידים והערוצים.
3. התקינו תלויות: `py -m pip install -r requirements-editil.txt`
4. הפעילו: `py -m editil_bot.main`

להפעלה עם Docker: `docker compose -f docker-compose.editil.yml up -d --build`.

הפעילו ב־Discord Developer Portal את **Server Members Intent** ואת **Message Content Intent**.

## ניהול

- `/panel roles` — פאנל בחירת תוכנות וסוגי עורכים.
- `/panel verify` — פאנל אימות חברי קהילה.
- `/tickets` — פאנל כרטיסי עזרה, דיווחים, שיתופי פעולה ובאגים.
- `/warn`, `/timeout`, `/kick`, `/ban`, `/clear` — כלי ניהול.
- `/showcase` — פרסום יצירה.
- `/profile` — פרופיל עורך.
- `/contest create`, `/contest submit`, `/contest vote` — תחרויות עריכה.

למערכת התפקידים, צרו בשרת תפקידים בעלי השמות המדויקים שמופיעים בפאנל. הגדירו את תפקידי `🆕 חדש`, `❤️ חבר קהילה` ו־`💎 Booster` באמצעות מזהי התפקידים בקובץ ההגדרות.
13 changes: 13 additions & 0 deletions docker-compose.editil.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,13 @@
services:
editil-bot:
build:
context: .
dockerfile: Dockerfile.editil
env_file:
- .env.editil
volumes:
- editil-data:/app/data
restart: unless-stopped

volumes:
editil-data:
52 changes: 52 additions & 0 deletions docker-compose.linux.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,52 @@
# Linux VPS deployment — uses network_mode: host so Discord voice UDP works.
# Usage: docker compose -f docker-compose.linux.yml up -d --build

services:
bot:
build: .
container_name: titanbot
restart: unless-stopped
network_mode: host
environment:
- NODE_ENV=production
- DISCORD_TOKEN=${DISCORD_TOKEN}
- CLIENT_ID=${CLIENT_ID}
- GUILD_ID=${GUILD_ID}
- OWNER_IDS=${OWNER_IDS}
- LOG_LEVEL=${LOG_LEVEL:-warn}
- PORT=${PORT:-3000}
- WEB_HOST=0.0.0.0
- AUTO_MIGRATE=true
- POSTGRES_HOST=localhost
- POSTGRES_PORT=5432
- POSTGRES_USER=${POSTGRES_USER:-titanbot}
- POSTGRES_PASSWORD=${POSTGRES_PASSWORD:-titanbotpassword}
- POSTGRES_DB=${POSTGRES_DB:-titanbot}
- POSTGRES_URL=postgresql://${POSTGRES_USER:-titanbot}:${POSTGRES_PASSWORD:-titanbotpassword}@localhost:5432/${POSTGRES_DB:-titanbot}
- DATABASE_URL=postgres://${POSTGRES_USER:-titanbot}:${POSTGRES_PASSWORD:-titanbotpassword}@localhost:5432/${POSTGRES_DB:-titanbot}
- SIGHTENGINE_API_USER=${SIGHTENGINE_API_USER}
- SIGHTENGINE_API_SECRET=${SIGHTENGINE_API_SECRET}
depends_on:
db:
condition: service_healthy

db:
image: postgres:15-alpine
container_name: titanbot-db
restart: unless-stopped
ports:
- "127.0.0.1:5432:5432"
environment:
- POSTGRES_USER=${POSTGRES_USER:-titanbot}
- POSTGRES_PASSWORD=${POSTGRES_PASSWORD:-titanbotpassword}
- POSTGRES_DB=${POSTGRES_DB:-titanbot}
volumes:
- postgres_data:/var/lib/postgresql/data
healthcheck:
test: ["CMD-SHELL", "pg_isready -U $$POSTGRES_USER -d $$POSTGRES_DB"]
interval: 10s
timeout: 5s
retries: 5

volumes:
postgres_data:
Loading