Skip to content

Instantly share code, notes, and snippets.

@vlasikhin
Created November 28, 2023 18:47
Show Gist options
  • Save vlasikhin/507bed612b5e1f2639183f0554c7b971 to your computer and use it in GitHub Desktop.
Save vlasikhin/507bed612b5e1f2639183f0554c7b971 to your computer and use it in GitHub Desktop.
#!/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
@milushov
Copy link

What's is format method for?

@vlasikhin
Copy link
Author

@milushov for placeholders('%s') replace

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment