Situs ini dikemudikan dua tombol, seperti mesin pemiliknya. Membaca: j dan k menggulir, d dan u setengah layar, gg ke atas, G ke bawah, H dan L pindah jendela, ? membuka panduan. Spasi adalah kunci leader Neovim dan mengurus isi: Spasi lalu h beranda, r riset, p proyek, g gear, a tentang, / tag, atau Spasi lalu angka untuk melompat ke jendela bernomor itu. Home adalah prefix tmux dan mengurus jendela: Home lalu c membuka terminal, Home lalu & menutup jendela, Home lalu spasi ke jendela berikutnya. Saat fokus ada di papan ketik, h j k l memindahkan pilihan antar tombol dan Enter membukanya.

RisetR TentangA Gear — G untuk gear — papan ketik, terminal, editor, homelab.G
    ProyekP Tag — / seperti di vim: cari./
    ×
    Menu

    beepresent: CLI dan API untuk Portal Kuliah

    Scraper portal kuliah yang dibungkus jadi API dan CLI — daftar mata kuliah, tugas, kuis, dan pengiriman kehadiran, dengan cache satu minggu karena datanya memang jarang berubah.

    Ringkasan

    Proyek ini adalah CLI dan API untuk berinteraksi dengan data mata kuliah — menampilkan daftar mata kuliah, mengambil detail, mengambil tugas dan kuis, serta mengirimkan catatan kehadiran (“present”).

    API

    EndpointDeskripsi
    GET /coursesMenampilkan semua mata kuliah
    GET /courses/{id}Mengambil detail mata kuliah
    GET /courses/{course_id}/assignmentsMenampilkan daftar tugas untuk sebuah mata kuliah
    GET /courses/{course_id}/quizzesMenampilkan daftar kuis untuk sebuah mata kuliah
    POST /courses/{course_id}/present/{present_id}Mengirim kehadiran

    CLI

    CLI mencerminkan permukaan API:

    • bl courses — menampilkan daftar mata kuliah
    • bl courses {id} — menampilkan detail mata kuliah
    • bl present — mengirim kehadiran

    Penjadwalan

    Pengiriman kehadiran sebaiknya berjalan pada jadwal tetap:

    • Senin – Jumat: 19.00 – 20.00
    • Sabtu: 09.00, 11.00, 14.00, 16.00

    Pertanyaan terbuka: apakah scheduler sebaiknya berada di dalam proyek ini, atau menjadi concern terpisah?

    Caching & Invalidasi

    Data mata kuliah jarang berubah, jadi caching yang agresif tidak menjadi masalah.

    • Entri cache kedaluwarsa setelah satu minggu
    • Crawl ulang hanya dilakukan ketika data cache sudah kedaluwarsa
    • Invalidasi pada setiap akses dihindari — itu bukan prioritas

    Implementasi

    Tech Stack

    • TypeScript
    • Runtime Bun.js
    • Cheerio untuk parsing HTML

    Struktur Proyek

    src/
    ├── services/
    │   ├── getCourses
    │   ├── getCourseDetail
    │   ├── getPresentationList
    │   └── postPresent
    ├── repository/
    │   ├── courses
    │   ├── assignments
    │   └── quiz
    ├── utils/
    │   └── log
    └── config/
        └── creds
    id en
    rss gh in