aboutsummaryrefslogtreecommitdiff
path: root/find_session.v
diff options
context:
space:
mode:
Diffstat (limited to 'find_session.v')
-rw-r--r--find_session.v154
1 files changed, 154 insertions, 0 deletions
diff --git a/find_session.v b/find_session.v
new file mode 100644
index 0000000..a4a94b2
--- /dev/null
+++ b/find_session.v
@@ -0,0 +1,154 @@
+import json
+import net.http
+import os
+import time
+import term.ui as tui
+
+struct App {
+mut:
+ tui &tui.Context = 0
+ data VaccineAvailability
+ is_loading bool
+ idx int = 1
+}
+
+struct VaccineAvailability {
+mut:
+ date string
+ available_sessions []Sessions
+ state_id int = 17
+ district_id int = 296
+}
+
+struct SessionResponse {
+ sessions []Sessions
+}
+
+struct Sessions {
+ center_id int
+ name string
+ address string
+ state_name string
+ district_name string
+ block_name string
+ pincode int
+ from string
+ to string
+ lat int
+ long int
+ fee_type string
+ session_id string
+ date string
+ available_capacity int
+ available_capacity_dose1 int
+ available_capacity_dose2 int
+ fee string
+ allow_all_age bool
+ min_age_limit int
+ vaccine string
+ slots []string
+}
+
+fn event(e &tui.Event, x voidptr) {
+ mut app := &App(x)
+ if e.typ == .key_down && e.code == .escape {
+ exit(0)
+ }
+
+ if e.typ == .key_down && e.code == .enter {
+ app.idx = app.idx + 1
+ mut date_of_vaccine := time.now().add_days(app.idx).get_fmt_date_str(.hyphen,.ddmmyyyy)
+ app.data.date = date_of_vaccine
+ app.find_session(app.data.district_id, app.data.date)
+ }
+}
+
+fn frame(x voidptr) {
+ mut app := &App(x)
+ app.tui.clear()
+ //Draw Area
+ app.draw_header()
+ app.draw_vaccine_availability()
+ app.tui.reset()
+ app.tui.flush()
+}
+
+fn (mut app App) draw_header() {
+ app.tui.draw_text(3,2,"Vaccine Availability on ${app.data.date} | Total Centers : ${app.data.available_sessions.len}")
+ app.tui.horizontal_separator(3)
+}
+
+fn (mut app App) draw_vaccine_availability() {
+ available_sessions := app.data.available_sessions
+ start_x := 3
+ mut start_y := 5
+ if available_sessions.len == 0 {
+ app.tui.draw_text(app.tui.window_width/2 - 10,app.tui.window_height/2,"No Vaccine Available")
+ } else {
+ for session in available_sessions {
+ fee := match session.fee_type{
+ 'Free' {'Free'}
+ 'Paid' { session.fee }
+ else { 'N/A' }
+ }
+ app.tui.draw_text(start_x,start_y,"${session.address} | Vaccine: ${session.vaccine} | Total Available: ${session.available_capacity} | Fee: ${fee}")
+ start_y += 2
+ }
+ }
+}
+
+fn init(x voidptr) {
+ mut app := &App(x)
+ app.find_session(app.data.district_id, app.data.date)
+}
+
+
+fn main() {
+ mut app := &App{}
+ app.tui = tui.init(
+ user_data: app
+ event_fn: event
+ frame_fn: frame
+ hide_cursor: false,
+ init_fn: init
+ )
+ mut date_of_vaccine := time.now().add_days(app.idx).get_fmt_date_str(.hyphen,.ddmmyyyy)
+ if os.args.len ==2 {
+ date_of_vaccine = os.args[1]
+ }
+
+ println("Searching Vaccine Availability on $date_of_vaccine")
+ app.data.date = date_of_vaccine
+ app.tui.set_window_title("COWIN Vaccine Finder")
+ app.tui.run() ?
+}
+
+fn (mut app App) find_session(district_id int,date string) {
+ app.is_loading = true
+ fetch_config := http.FetchConfig{
+ header: http.new_header(
+ key : .accept_language,
+ value: 'en-US'
+ )
+ }
+
+ url := 'https://cdn-api.co-vin.in/api/v2/appointment/sessions/public/findByDistrict?district_id=$district_id&date=$date'
+
+ resp := http.fetch(url, fetch_config) or {
+ println('failed to fetch data from the server')
+ return
+ }
+
+ session_data := json.decode(SessionResponse, resp.text) or {
+ println('failed to decode session json')
+ return
+ }
+
+ app.data.available_sessions = session_data.sessions
+ .filter( it.available_capacity > 0 && it.min_age_limit<45)
+ app.is_loading = false
+}
+
+fn setup_termui() {
+
+} \ No newline at end of file