Tosin Sonuyi ccbc41428b
GroupMe added as Provider (#36)
* adds groupme configuration and relative

* first pass at groupme provider

* add group id site setting w/ english translation

* rework to use bots groupme api intstead of developer, no access tokens reqd

also should catch 404 response codes

* add strings to locale yml files for i18n

* better error handling for multi-bot case

* add channel param for separate Groupme instances, include name in errorbody

* bugfix for multi bot msg forwarding

this gives us the ability to treat diff groupme instances like slack channels, lots of people use them this way for better or worse. use case is certain category posts only go to a particular GM instance

* add spec for groupme provider

* fix channel param constraint

* specify channels by groupme name, not bot api token

* fix some linting issues w/ spacing

* newline and trailing space lint fixes
2020-05-11 15:10:37 -04:00

104 lines
2.8 KiB
Ruby

# frozen_string_literal: true
module DiscourseChat
class ProviderError < StandardError
attr_accessor :info
def initialize(message = nil, info: nil)
super(message)
self.info = info.nil? ? {} : info
end
end
module Provider
def self.providers
constants.select do |constant|
constant.to_s =~ /Provider$/
end.map(&method(:const_get))
end
def self.enabled_providers
self.providers.select do |provider|
self.is_enabled(provider)
end
end
def self.provider_names
self.providers.map! { |x| x::PROVIDER_NAME }
end
def self.enabled_provider_names
self.enabled_providers.map! { |x| x::PROVIDER_NAME }
end
def self.get_by_name(name)
self.providers.find { |p| p::PROVIDER_NAME == name }
end
def self.is_enabled(provider)
if defined? provider::PROVIDER_ENABLED_SETTING
SiteSetting.public_send(provider::PROVIDER_ENABLED_SETTING)
else
false
end
end
class HookEngine < ::Rails::Engine
engine_name DiscourseChat::PLUGIN_NAME + "-hooks"
isolate_namespace DiscourseChat::Provider
end
class HookController < ::ApplicationController
requires_plugin DiscourseChat::PLUGIN_NAME
class ProviderDisabled < StandardError; end
rescue_from ProviderDisabled do
rescue_discourse_actions(:not_found, 404)
end
def self.requires_provider(provider_name)
before_action do
raise ProviderDisabled.new unless Provider.enabled_provider_names.include?(provider_name)
end
end
def respond
render
end
end
# Automatically mount each provider's engine inside the HookEngine
def self.mount_engines
engines = []
DiscourseChat::Provider.providers.each do |provider|
engine = provider.constants.select do |constant|
constant.to_s =~ (/Engine$/) && (constant.to_s != "HookEngine")
end.map(&provider.method(:const_get)).first
if engine
engines.push(engine: engine, name: provider::PROVIDER_NAME)
end
end
DiscourseChat::Provider::HookEngine.routes.draw do
engines.each do |engine|
mount engine[:engine], at: engine[:name]
end
end
end
end
end
require_relative "provider/slack/slack_provider"
require_relative "provider/telegram/telegram_provider"
require_relative "provider/discord/discord_provider"
require_relative "provider/mattermost/mattermost_provider"
require_relative "provider/matrix/matrix_provider"
require_relative "provider/zulip/zulip_provider"
require_relative "provider/rocketchat/rocketchat_provider"
require_relative "provider/gitter/gitter_provider"
require_relative "provider/flowdock/flowdock_provider"
require_relative "provider/groupme/groupme_provider"