mirror of
				https://github.com/discourse/discourse-chat-integration.git
				synced 2025-10-31 05:48:37 +00:00 
			
		
		
		
	* DEV: Fix new Rubocop offenses --------- Co-authored-by: Jarek Radosz <jradosz@gmail.com>
		
			
				
	
	
		
			118 lines
		
	
	
		
			3.7 KiB
		
	
	
	
		
			Ruby
		
	
	
	
	
	
			
		
		
	
	
			118 lines
		
	
	
		
			3.7 KiB
		
	
	
	
		
			Ruby
		
	
	
	
	
	
| # frozen_string_literal: true
 | |
| 
 | |
| module DiscourseChatIntegration
 | |
|   module Provider
 | |
|     module TelegramProvider
 | |
|       PROVIDER_NAME = "telegram".freeze
 | |
|       PROVIDER_ENABLED_SETTING = :chat_integration_telegram_enabled
 | |
|       CHANNEL_PARAMETERS = [
 | |
|         { key: "name", regex: '^\S+' },
 | |
|         { key: "chat_id", regex: '^(-?[0-9]+|@\S+)$', unique: true },
 | |
|       ]
 | |
| 
 | |
|       def self.setup_webhook
 | |
|         newSecret = SecureRandom.hex
 | |
|         SiteSetting.chat_integration_telegram_secret = newSecret
 | |
| 
 | |
|         message = { url: Discourse.base_url + "/chat-integration/telegram/command/" + newSecret }
 | |
| 
 | |
|         response = self.do_api_request("setWebhook", message)
 | |
| 
 | |
|         if response["ok"] != true
 | |
|           # If setting up webhook failed, disable provider
 | |
|           SiteSetting.chat_integration_telegram_enabled = false
 | |
|           Rails.logger.error(
 | |
|             "Failed to setup telegram webhook. Message data= " + message.to_json + " response=" +
 | |
|               response.to_json,
 | |
|           )
 | |
|         end
 | |
|       end
 | |
| 
 | |
|       def self.sendMessage(message)
 | |
|         self.do_api_request("sendMessage", message)
 | |
|       end
 | |
| 
 | |
|       def self.do_api_request(methodName, message)
 | |
|         http = FinalDestination::HTTP.new("api.telegram.org", 443)
 | |
|         http.use_ssl = true
 | |
| 
 | |
|         access_token = SiteSetting.chat_integration_telegram_access_token
 | |
| 
 | |
|         uri = URI("https://api.telegram.org/bot#{access_token}/#{methodName}")
 | |
| 
 | |
|         req = Net::HTTP::Post.new(uri, "Content-Type" => "application/json")
 | |
|         req.body = message.to_json
 | |
|         response = http.request(req)
 | |
| 
 | |
|         responseData = JSON.parse(response.body)
 | |
| 
 | |
|         responseData
 | |
|       end
 | |
| 
 | |
|       def self.message_text(post)
 | |
|         display_name = ::DiscourseChatIntegration::Helper.formatted_display_name(post.user)
 | |
| 
 | |
|         topic = post.topic
 | |
| 
 | |
|         category = ""
 | |
|         if topic.category
 | |
|           category =
 | |
|             (
 | |
|               if (topic.category.parent_category)
 | |
|                 "[#{topic.category.parent_category.name}/#{topic.category.name}]"
 | |
|               else
 | |
|                 "[#{topic.category.name}]"
 | |
|               end
 | |
|             )
 | |
|         end
 | |
| 
 | |
|         tags = ""
 | |
|         tags = topic.tags.map(&:name).join(", ") if topic.tags.present?
 | |
| 
 | |
|         I18n.t(
 | |
|           "chat_integration.provider.telegram.message",
 | |
|           user: display_name,
 | |
|           post_url: post.full_url,
 | |
|           title: CGI.escapeHTML(topic.title),
 | |
|           post_excerpt:
 | |
|             post.excerpt(
 | |
|               SiteSetting.chat_integration_telegram_excerpt_length,
 | |
|               text_entities: true,
 | |
|               strip_links: true,
 | |
|               remap_emoji: true,
 | |
|             ),
 | |
|         )
 | |
|       end
 | |
| 
 | |
|       def self.trigger_notification(post, channel, rule)
 | |
|         chat_id = channel.data["chat_id"]
 | |
| 
 | |
|         message = {
 | |
|           chat_id: chat_id,
 | |
|           text: message_text(post),
 | |
|           parse_mode: "html",
 | |
|           disable_web_page_preview: true,
 | |
|         }
 | |
| 
 | |
|         response = sendMessage(message)
 | |
| 
 | |
|         if response["ok"] != true
 | |
|           error_key = nil
 | |
|           if response["description"].include? "chat not found"
 | |
|             error_key = "chat_integration.provider.telegram.errors.channel_not_found"
 | |
|           elsif response["description"].include? "Forbidden"
 | |
|             error_key = "chat_integration.provider.telegram.errors.forbidden"
 | |
|           end
 | |
|           raise ::DiscourseChatIntegration::ProviderError.new info: {
 | |
|                                                                 error_key: error_key,
 | |
|                                                                 message: message,
 | |
|                                                                 response_body: response,
 | |
|                                                               }
 | |
|         end
 | |
|       end
 | |
|     end
 | |
|   end
 | |
| end
 | |
| 
 | |
| require_relative "telegram_command_controller.rb"
 |