Sha256: 401b80330adf52f674e5a030ff708ff6b8d7e35a13aa31cc48ef28e125db0819

Contents?: true

Size: 1.66 KB

Versions: 1

Compression:

Stored size: 1.66 KB

Contents

# frozen_string_literal: true

require 'httparty'
require 'no_proxy_fix'
require 'redis'
require 'redis/connection/hiredis'
require 'redis-namespace'
require 'slack-notifier'

module MShard
  class MShard
    include HTTParty
    base_uri ENV['MSHARD_URI']

    def get(id)
      self.class.get("/v2/shards/#{id}").body
    end

    def set(params)
      self.class.post('/v2/shards', body: params)['id']
    end

    def try(times: 3, delay: 2)
      times.times do
        begin
          return yield
        rescue StandardError
          sleep delay
        end
      end
      nil
    end

    def get_safe(*args)
      try { get(*args) }
    end

    def set_safe(*args) # rubocop:disable Naming/AccessorMethodName
      try { set(*args) }
    end

    def detour?
      ENV['http_proxy']
    end

    def notify(**args)
      args[:slack] ||= true
      args[:webhook_url] ||= ENV['SLACK_WEBHOOK_URI']
      args[:channel] ||= ENV['SLACK_CHANNEL']
      return set(args) if detour?
      Slack::Notifier.new(args[:webhook_url], **args).ping(args[:text])
    end

    def self.redis_cache(uri)
      @cache ||= Hash.new do |hash, uri_|
        hash[uri_] = Redis::Namespace.new(:shard, redis: Redis.new(url: uri_))
      end
      @cache[uri]
    end

    def load(id, redis_uri: ENV['MSHARD_REDIS_URI'])
      return get(id) if detour? || redis_uri.nil?
      self.class.redis_cache(redis_uri).get(id)
    end

    def save(redis_uri: ENV['MSHARD_REDIS_URI'], **args)
      return set(**args) if detour? || redis_uri.nil?
      response =
        self.class.redis_cache(redis_uri).set(args[:id], args[:contents])
      raise response unless response == 'OK'
      args[:id]
    end
  end
end

Version data entries

1 entries across 1 versions & 1 rubygems

Version Path
mshard-0.7.1 lib/mshard/mshard.rb