open Pusk.Net open Pusk.Drivers open Pusk.Utils open Twitter let start driver = let name_driver = prepare driver in let data_driver = run_process name_driver [] in let session_id = get_session ~headless:false () in data_driver, session_id ;; let stop (driver_process, session_id) = if not (close_session session_id) then print_endline "Can't close the session"; stop_process driver_process ;; let rec check ctx = (* Loop *) let recheck timeout = Unix.sleep timeout; refresh_page ctx.session_id; Unix.sleep 4; check ctx in (* Time to wait until next check *) let timeout = match find_latest_tweet ctx with | Some tweet_date -> (* TODO: Get date of tweet and return time to wait before tweeting * (0 if we need to tweet) *) print_endline (fmt "latest tweet date: %d" tweet_date); 30000000000000000 | None -> 0 in if 0 = timeout then ( print_endline "TODO: We are tweeting here. :)"; (* Wait the maximum time since we just tweeted *) recheck 2505600 (* 29 days *)) else (* Wait the amount of time calculated from the post *) recheck timeout ;; let main ctx = (* Load credentials *) load_dotenv; let username, password = match Sys.getenv_opt "TWITTER_USERNAME", Sys.getenv_opt "TWITTER_PASSWORD" with | Some u, Some p -> u, p | None, None -> raise (Any "Username and password not set") | None, Some _ -> raise (Any "Username not set") | Some _, None -> raise (Any "Password not set") in login_twitter ctx username password (Sys.getenv_opt "TWITTER_TOTP"); go_to_profile ctx; (* Start check routine *) check ctx ;; let handler data (signal : int) = stop_process data; exit (match signal with | v when v = Sys.sigint -> 130 | _ -> 1) ;; let () = let data = start (Gecko "0.33.0") in Sys.set_signal Sys.sigint (Sys.Signal_handle (handler (fst data))); let ctx = { session_id = snd data } in (try main ctx with | Any why -> print_endline why); stop data ;;