{"id":49967471,"url":"https://github.com/adwerygaming/amikom-class-notifier","last_synced_at":"2026-05-18T06:29:00.033Z","repository":{"id":344577978,"uuid":"1181457198","full_name":"adwerygaming/amikom-class-notifier","owner":"adwerygaming","description":"Get notified when class is about to start via Discord!","archived":false,"fork":false,"pushed_at":"2026-04-04T08:06:15.000Z","size":1728,"stargazers_count":2,"open_issues_count":1,"forks_count":0,"subscribers_count":0,"default_branch":"main","last_synced_at":"2026-04-04T08:26:04.421Z","etag":null,"topics":["amikom","amikomone","discord-bot","discord-js","diy","pooling","scripts"],"latest_commit_sha":null,"homepage":"","language":"TypeScript","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/adwerygaming.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-03-14T06:49:43.000Z","updated_at":"2026-03-28T01:42:50.000Z","dependencies_parsed_at":null,"dependency_job_id":null,"html_url":"https://github.com/adwerygaming/amikom-class-notifier","commit_stats":null,"previous_names":["adwerygaming/amikom-class-notifier"],"tags_count":0,"template":false,"template_full_name":null,"purl":"pkg:github/adwerygaming/amikom-class-notifier","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/adwerygaming%2Famikom-class-notifier","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/adwerygaming%2Famikom-class-notifier/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/adwerygaming%2Famikom-class-notifier/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/adwerygaming%2Famikom-class-notifier/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/adwerygaming","download_url":"https://codeload.github.com/adwerygaming/amikom-class-notifier/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/adwerygaming%2Famikom-class-notifier/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":33167573,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-05-18T05:43:36.989Z","status":"ssl_error","status_checked_at":"2026-05-18T05:43:19.133Z","response_time":71,"last_error":"SSL_read: unexpected eof while reading","robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":false,"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":["amikom","amikomone","discord-bot","discord-js","diy","pooling","scripts"],"created_at":"2026-05-18T06:28:59.379Z","updated_at":"2026-05-18T06:29:00.026Z","avatar_url":"https://github.com/adwerygaming.png","language":"TypeScript","funding_links":[],"categories":[],"sub_categories":[],"readme":"\u003cdiv align=\"center\"\u003e\n    \u003ch1\u003eAmikom Class Notifier\u003c/h1\u003e\n    \u003cp\u003eGet notified when class is about to start via \u003ca href=\"https://discord.com\" target=\"_blank\"\u003eDiscord\u003c/a\u003e!\u003c/p\u003e\n    \u003cimg alt=\"Discord\" src=\"https://img.shields.io/badge/Discord-5865F2?style=for-the-badge\u0026logo=discord\u0026logoColor=white\"\u003e\n    \u003cimg alt=\"NodeJS\" src=\"https://img.shields.io/badge/Node%20js-339933?style=for-the-badge\u0026logo=nodedotjs\u0026logoColor=white\"\u003e\n    \u003cimg alt=\"TypeScript\" src=\"https://img.shields.io/badge/TypeScript-007ACC?style=for-the-badge\u0026logo=typescript\u0026logoColor=white\"\u003e\n    \u003cimg alt=\"Docker Compose\" src=\"https://img.shields.io/badge/Docker%20Compose-2496ED?style=for-the-badge\u0026logo=docker\u0026logoColor=white\"\u003e\n    \u003cimg alt=\"Redis\" src=\"https://img.shields.io/badge/redis-%23DD0031.svg?\u0026style=for-the-badge\u0026logo=redis\u0026logoColor=white\"\u003e\n    \u003cimg alt=\"Postgres\" src=\"https://img.shields.io/badge/PostgreSQL-316192?style=for-the-badge\u0026logo=postgresql\u0026logoColor=white\"\u003e\n\u003c/div\u003e\n\n## Features\n\n\u003cimg alt=\"Banner\" src=\"./assets/Amikom_Class_Notifier_Banner.png\"\u003e\n\n- **Today \u0026 Weekly Schedule** — View your class schedule (same as [AmikomOne App](https://play.google.com/store/apps/details?id=com.ic.projectabsensi\u0026hl=id\u0026pli=1))\n- **Class Reminders** — Get notified before class starts\n- **Self-hosted** — Full control over your data and deployment\n\n## How It Works\n\nA Discord bot that automates class reminders by syncing schedule data with real-time events.\n\n| Component | Description |\n|-----------|-------------|\n| **Data Ingestion** | Schedule data is imported manually via the Amikom student dashboard API and stored as a static JSON file |\n| **Polling** | Continuously monitors the schedule file, calculating time differences between current time and upcoming classes |\n| **State Management** | Redis stores notification state to prevent duplicates across application restarts |\n| **Event Driven** | Redis Pub/Sub decouples the system; events are published when classes are imminent |\n| **Subscribers** | Redis subscribers query PostgreSQL for active guild subscriptions and send notifications to Discord channels |\n\n## Try It Yourself\n\n\u003e [!CAUTION]\n\u003e **This bot and project are not affiliated with, endorsed by, or officially connected to Universitas Amikom Yogyakarta**. It is a community-built tool created by students, for students.\n\u003e **Use at your own risk.** For official academic information, always refer to [Dashboard Mahasiswa](https://mhs.amikom.ac.id) or [AmikomOne App](https://play.google.com/store/apps/details?id=com.ic.projectabsensi\u0026hl=id\u0026pli=1).\n\n### Option 1: Use the Public Bot (Recommended)\n\nYou can invite the bot to your server using this button below:\n\n\u003ca href=\"https://discord.com/oauth2/authorize?client_id=942370077301436418\"\u003e\n    \u003cimg alt=\"Invite Amibot\" src=\"https://img.shields.io/badge/invite%20AmiBot-bot?style=for-the-badge\u0026logo=discord\u0026logoColor=%237289da\u0026color=%232c2f33\"\u003e\n\u003c/a\u003e\n\nAfter that, see the [Subscribe to Reminders](#subscribe-to-reminders) section.\n\n### Option 2: Self-Host\n\nIf you want to build this project yourself, see the [Self Hosting](#self-hosting) section below.\n\n## Usage\n\n### Importing Schedule Data\n\n1. Log in to [Dashboard Mahasiswa](https://mhs.amikom.ac.id)\n2. Once logged in, open [this URL](https://mhs.amikom.ac.id/api/perkuliahan/jadwal_kuliah_personal)\n3. You should see JSON data. If not, ensure you're using the same browser session\n4. Select all and copy the JSON (`Ctrl+A` then `Ctrl+C`)\n5. Paste into a text editor and save as `schedule.json`\n6. In your Discord server, run: `/schedule set`\n7. Enter schedule information and upload the `schedule.json` file when prompted\n8. Verify the schedule preview appears\n\n### Subscribe to Reminders\n\n1. In your Discord server, choose a channel for notifications\n2. Run: `/reminder subscribe`\n3. The bot will ask you to input your **Major**, **Enrolled Year**, and **Class Number**.\n4. Done! You'll now receive class reminders\n\n### Managing Reminders\n\n- **Unsubscribe:** `/reminder unsubscribe`\n- **Check status:** `/reminder status`\n\n### Checking Schedules\n\n- **Today's Schedule:** `/schedule today`\n- **Weekly Schedule:** `/schedule weekly`\n\n\n## Self-Hosting\n\n### Prerequisites\n\n- **Node.js** v21 or higher\n- **npm** v9 or higher\n- **Docker** \u0026 **Docker Compose** installed\n- **Git**\n\n### Requirements\n\n- Discord account with server admin privileges\n- An Amikom account (NPM \u0026 password)\n- Server/PC capable of running 24/7 (for continuous notifications)\n\n## Setup\n\n\u003e [!NOTE]\n\u003e Follow these steps in order.\n\n\u003cdetails\u003e\n\u003csummary\u003e\u003cb\u003e1. Create a Discord Bot\u003c/b\u003e\u003c/summary\u003e\n\n1. Navigate to the [Discord Developer Portal](https://discord.com/developers/applications)\n2. Log in with your Discord account\n3. Click **New Application** (top-right) if you haven't created a bot yet\n4. Enter your **Application Name**\n5. Copy the **Application ID** from the application page\n6. Go to the **Bot** section (left sidebar)\n7. Under **Token**, click **Reset Token** and copy the new token\n8. Navigate to **Installation** (left sidebar)\n9. Under **Installation Contexts**, select **Guild Install**\n10. For **Install Link**, choose **Discord Provided Link** and copy the URL\n11. Under **Default Install Settings \u003e Guild Install**, add `applications.commands` and `bot` to **Scopes**\n12. Save changes and open the invite URL\n13. Select your server to add the bot\n\n\u003e [!IMPORTANT]\n\u003e **You'll need:** `DISCORD_CLIENT_ID` (Application ID) and `DISCORD_TOKEN` (Bot Token)\n\u003c/details\u003e\n\n\u003cdetails\u003e\n\u003csummary\u003e\u003cb\u003e2. Deploy the Bot\u003c/b\u003e\u003c/summary\u003e\n\n```\n# Clone the repository\ngit clone https://github.com/adwerygaming/amikom-class-notifier\ncd amikom-class-notifier\n\n# Copy and configure environment variables\ncp .env.example .env\n# Edit .env with your credentials (see below)\n\n# Start infrastructure services\ndocker compose up -d\n\n# Build and start the bot\nnpm run build\nnpm run start\n```\n\n#### Environment Variables (.env)\n\n```\nNODE_ENV=production\n\n# Discord (from step 1)\nDISCORD_CLIENT_ID=your_application_id_here\nDISCORD_TOKEN=your_bot_token_here\n\n# Redis\nREDIS_HOST=127.0.0.1\nREDIS_PORT=6379\n\n# PostgreSQL\nPOSTGRES_PORT=5432\nPOSTGRES_PASSWORD=your_secure_password_here\n\n# PGAdmin (optional, for database management)\nPGADMIN_PORT=8080\nPGADMIN_PASSWORD=your_secure_password_here\n\n# Connection string (update with your credentials)\nPG_CONNECTION_STRING=postgresql://postgres:your_secure_password_here@localhost:5432/amikom_notifier\n```\n\n\u003e [!TIP]\n\u003e Generate fast, secure passwords using [it-tools.tech/token-generator](https://it-tools.tech/token-generator)\n\u003c/details\u003e\n\nAfter that, go to the [Importing Schedule Data](`#importing-schedule-data`) section to import your schedule and the [Subscribe to Reminders](`#subscribe-to-reminders`) section to set up your reminders.\n\n## Development\n\n```\n# Install dependencies\nnpm install\n\n# Run in development mode (with hot reload)\nnpm run dev\n\n# Lint code\nnpm run lint\n```\n\n## Contributing\n\nContributions are open to everyone. If you implement something cool and useful, open a PR and we'll discuss it there. ❤️\n\n## Contact\n\nIf you have any questions, feel free to reach out via links on my [GitHub profile](https://github.com/adwerygaming)\n\n\u003cdiv align=\"center\"\u003e\n    \u003cp\u003eThis project is not affiliated with Universitas Amikom Yogyakarta\u003c/p\u003e\n\u003c/div\u003e","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fadwerygaming%2Famikom-class-notifier","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fadwerygaming%2Famikom-class-notifier","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fadwerygaming%2Famikom-class-notifier/lists"}