{"id":50597487,"url":"https://github.com/franzxml/pal","last_synced_at":"2026-06-05T15:30:43.828Z","repository":{"id":359999362,"uuid":"1248122233","full_name":"franzxml/pal","owner":"franzxml","description":"PAL adalah bot Discord sederhana berbasis Ruby untuk fitur hiburan komunitas. Versi awal ini menyediakan slash command /meme dan /musik tanpa database.","archived":false,"fork":false,"pushed_at":"2026-05-24T13:54:37.000Z","size":24,"stargazers_count":0,"open_issues_count":0,"forks_count":0,"subscribers_count":0,"default_branch":"main","last_synced_at":"2026-05-24T15:26:16.432Z","etag":null,"topics":["bot","discord","ruby"],"latest_commit_sha":null,"homepage":"","language":"Ruby","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":null,"status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/franzxml.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":null,"code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null,"notice":null,"maintainers":null,"copyright":null,"agents":null,"dco":null,"cla":null}},"created_at":"2026-05-24T08:02:38.000Z","updated_at":"2026-05-24T13:54:40.000Z","dependencies_parsed_at":null,"dependency_job_id":null,"html_url":"https://github.com/franzxml/pal","commit_stats":null,"previous_names":["franzxml/pal"],"tags_count":null,"template":false,"template_full_name":null,"purl":"pkg:github/franzxml/pal","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/franzxml%2Fpal","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/franzxml%2Fpal/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/franzxml%2Fpal/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/franzxml%2Fpal/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/franzxml","download_url":"https://codeload.github.com/franzxml/pal/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/franzxml%2Fpal/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":33949038,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-05-26T15:22:16.424Z","status":"online","status_checked_at":"2026-06-05T02:00:06.157Z","response_time":120,"last_error":null,"robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":true,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["bot","discord","ruby"],"created_at":"2026-06-05T15:30:43.127Z","updated_at":"2026-06-05T15:30:43.821Z","avatar_url":"https://github.com/franzxml.png","language":"Ruby","funding_links":[],"categories":[],"sub_categories":[],"readme":"## Fitur\n* Slash command `/meme` untuk mengirim meme acak ke kanal Discord\n* Slash command `/musik` untuk mengontrol koneksi voice dasar\n* Slash command `/play` untuk memutar audio dari URL YouTube\n* Slash command `/stop` untuk menghentikan audio yang sedang diputar\n* Slash command `/queue` untuk melihat antrean musik\n* Sistem antrean musik per server agar `/play` berikutnya menunggu lagu aktif selesai\n* Aksi musik `gabung` untuk membuat bot masuk ke voice channel pengguna\n* Aksi musik `keluar` untuk membuat bot keluar dari voice channel\n* Aksi musik `status` untuk mengecek koneksi voice bot\n* Validasi konfigurasi environment wajib sebelum bot dijalankan\n* Pembacaan file `.env` otomatis saat menjalankan bot\n* Tidak membutuhkan database pada versi awal\n* Penyimpanan koneksi voice sementara selama proses bot berjalan\n* Dukungan voice Discord terbaru melalui DAVE/E2EE\n* Struktur command yang modular dan mudah dikembangkan\n* Runtime Node.js untuk voice musik YouTube\n* Struktur backend Ruby tetap tersedia sebagai fondasi awal\n* Unit test untuk konfigurasi, katalog meme, command musik, dan registry voice\n\n## Teknologi\n* Ruby\n* discordrb\n* Bundler\n* Rake\n* Minitest\n* Node.js\n* discord.js\n* @discordjs/voice\n* @snazzah/davey\n* dotenv\n* yt-dlp\n* FFmpeg\n* Discord API\n* Discord slash command\n* Discord voice channel\n* libsodium\n\n## Struktur Folder\n    pal/\n    │── bin/\n    │   └── pal\n    │── lib/\n    │   ├── pal/\n    │   │   ├── commands/\n    │   │   │   ├── meme_command.rb\n    │   │   │   ├── music_command.rb\n    │   │   │   ├── play_command.rb\n    │   │   │   └── stop_command.rb\n    │   │   ├── audio_source_resolver.rb\n    │   │   ├── bot.rb\n    │   │   ├── commands.rb\n    │   │   ├── config.rb\n    │   │   ├── meme_catalog.rb\n    │   │   ├── version.rb\n    │   │   └── voice_registry.rb\n    │   └── pal.rb\n    │── test/\n    │   └── pal/\n    │       ├── audio_source_resolver_test.rb\n    │       ├── config_test.rb\n    │       ├── meme_catalog_test.rb\n    │       ├── music_command_test.rb\n    │       └── voice_registry_test.rb\n    │── src/\n    │   └── index.js\n    │── .env.example\n    │── .gitignore\n    │── .ruby-version\n    │── Gemfile\n    │── Gemfile.lock\n    │── package-lock.json\n    │── package.json\n    │── README.md\n    └── Rakefile\n\n## Cara Menjalankan\n1. **Persiapan Lingkungan:** Pastikan komputer sudah terinstal **Node.js 22+**, **npm**, **yt-dlp**, dan **FFmpeg** untuk fitur musik YouTube.\n\n2. **Masuk ke Folder Proyek:**\n   ```bash\n   cd pal\n   ```\n\n3. **Install Dependensi Node.js:**\n   ```bash\n   npm install\n   ```\n\n4. **Siapkan Environment:** Salin file contoh environment, lalu isi token dan ID Discord.\n   ```bash\n   cp .env.example .env\n   ```\n\n   Isi `.env`:\n   ```bash\n   DISCORD_BOT_TOKEN=token_bot_discord\n   DISCORD_CLIENT_ID=application_client_id\n   DISCORD_GUILD_ID=id_server_discord\n   ```\n\n5. **Invite Bot ke Server Discord:** Invite bot melalui Discord Developer Portal dengan scope `bot` dan `applications.commands`.\n\n6. **Jalankan PAL:**\n   ```bash\n   npm start\n   ```\n\n7. **Gunakan Bot di Discord:** Jalankan command berikut dari server Discord:\n   ```bash\n   /meme\n   /musik\n   /play\n   /stop\n   /queue\n   ```\n\n   Untuk `/musik gabung` dan `/play`, pastikan pengguna sudah berada di voice channel.\n   Jika audio sedang diputar, command `/play` berikutnya akan otomatis masuk antrean.\n\n## Script\n* `npm install` untuk menginstall dependensi runtime Node.js.\n* `npm start` untuk menjalankan PAL dengan dukungan voice DAVE/E2EE.\n* `npm run voice:report` untuk mengecek dependency voice, DAVE, Opus, dan FFmpeg.\n* `node --check src/index.js` untuk mengecek sintaks runtime Node.js.\n* `bundle install` untuk menginstall dependensi Ruby.\n* `bundle exec ruby bin/pal` untuk menjalankan runtime Ruby lama.\n* `bundle exec rake test` untuk menjalankan unit test Ruby.\n* `ruby -c lib/pal/bot.rb` untuk mengecek sintaks file bot utama.\n\n## Catatan Discord\nBot membutuhkan aplikasi Discord yang dibuat melalui Discord Developer Portal.\n\nPermission yang direkomendasikan:\n* `Send Messages`\n* `Use Slash Commands`\n* `Connect`\n* `Speak`\n\nSaat pengembangan, isi `DISCORD_GUILD_ID` agar update slash command muncul cepat di satu server. Jika `DISCORD_GUILD_ID` kosong, command akan didaftarkan secara global dan bisa membutuhkan waktu lebih lama untuk muncul di Discord.\n\n## Catatan Voice\nFitur voice Discord sekarang membutuhkan dukungan DAVE/E2EE. Runtime Node.js di `src/index.js` memakai `@discordjs/voice` dan `@snazzah/davey` agar PAL bisa tersambung ke voice channel modern.\n\nUntuk macOS dengan Homebrew, dependency native dapat diinstall menggunakan:\n```bash\nbrew install yt-dlp ffmpeg opus libsodium\n```\n\n---\n\nDikembangkan oleh:\n\n* @franzxml\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Ffranzxml%2Fpal","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Ffranzxml%2Fpal","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Ffranzxml%2Fpal/lists"}