Created
November 28, 2023 18:47
-
-
Save vlasikhin/507bed612b5e1f2639183f0554c7b971 to your computer and use it in GitHub Desktop.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
#!/usr/bin/env ruby | |
# frozen_string_literal: true | |
require "net/http" | |
require "uri" | |
require "json" | |
require "logger" | |
require_relative "../config/environment" | |
NGROK_PROCESS_CHECK = "ps aux | grep ngrok | grep -v grep" | |
NGROK_START_COMMAND = "ngrok http 3001" | |
NGROK_API_URL = "http://localhost:4040/api/tunnels" | |
TELEGRAM_API_URL_FORMAT = "https://api.telegram.org/bot%s/setWebhook?url=%s&drop_pending_updates=true" | |
RAILS_SERVER_COMMAND = "rails server -p 3001" | |
SLEEP_DURATION = 2 | |
logger = Logger.new($stdout) | |
def terminate_existing_ngrok(logger) | |
existing_process = `#{NGROK_PROCESS_CHECK}` | |
return if existing_process.empty? | |
pid = existing_process.split[1].to_i | |
Process.kill("TERM", pid) | |
logger.info "Terminated existing ngrok process with PID #{pid}" | |
end | |
def start_ngrok(logger) | |
terminate_existing_ngrok(logger) | |
IO.popen(NGROK_START_COMMAND) | |
sleep SLEEP_DURATION | |
fetch_ngrok_url(logger) | |
end | |
def fetch_ngrok_url(logger) | |
loop do | |
response = Net::HTTP.get(URI(NGROK_API_URL)) | |
json = JSON.parse(response) | |
ngrok_url = json.dig("tunnels", 0, "public_url") | |
return ngrok_url if ngrok_url.present? | |
rescue StandardError => e | |
logger.error "Failed to fetch ngrok URL: #{e.message}" | |
sleep SLEEP_DURATION | |
end | |
end | |
def set_telegram_webhook(ngrok_url, api_key, logger) | |
webhook_url = format(TELEGRAM_API_URL_FORMAT, api_key, ngrok_url) | |
response = Net::HTTP.get(URI(webhook_url)) | |
logger.info "Webhook set with response: #{response}" | |
end | |
begin | |
ngrok_url = start_ngrok(logger) | |
logger.info "ngrok URL: #{ngrok_url}" | |
api_key = Rails.application.credentials[Rails.env.to_sym][:telegram] | |
set_telegram_webhook(ngrok_url, api_key, logger) | |
logger.info "Starting Rails server on port 3001" | |
exec RAILS_SERVER_COMMAND | |
rescue StandardError => e | |
logger.error "An error occurred: #{e.message}" | |
logger.error e.backtrace&.join("\n") | |
end |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
What's is format method for?