ice-jade

管理多种 IM 接口的 Ruby SDK gem,仅内部用。外部接口见 ignister。

安装

gem 'ice-jade'
bundle install

快速开始

Quantum IM

require 'ice_jade'

client = IceJade::Quantum::Client.new('your-webhook-key')

# 发送文本
client.send_text("hello world")

# @所有人
client.send_text("紧急通知", mention_all: true)

# 图文消息
client.send_news("标题", "https://example.com", description: "描述")

# 上传并发送图片
client.upload_and_send_image("/path/to/photo.jpg", height: 1080, width: 1920)

# 上传并发送文件
client.upload_and_send_file("/path/to/report.pdf")

当前支持的 IM

IM 类型 命名空间 状态
Quantum IceJade::Quantum 已支持

架构设计(如何扩展新 IM)

每个 IM 独占一个命名空间,内部包含自己的 ClientMessage(如果有)。

lib/ice_jade/
  quantum/
    client.rb   # Quantum::Client < ClientBase
    message.rb  # Quantum::Message
  feishu/       # 未来其他IM
    client.rb
  dingtalk/     # 未来其他IM#2
    client.rb

添加新 IM 的步骤

  1. lib/ice_jade/ 下新建目录,例如 feishu/
  2. 实现 lib/ice_jade/feishu/client.rb,继承 IceJade::ClientBase
  3. lib/ice_jade.rbrequire_relative 'feishu/client'

示例模板:

# lib/ice_jade/feishu/client.rb
require 'json'
require 'net/http'

module IceJade
  module Feishu
    class Client < ClientBase
      def initialize(webhook_url)
        @webhook_url = webhook_url
      end

      def send_text(content, **opts)
        # 飞书特有的 JSON 结构
        payload = { msg_type: 'text', content: { text: content } }
        # ...post...
      end

      def send_image(file_id, **opts)
        raise NotImplementedError
      end

      def send_file(file_id, **opts)
        raise NotImplementedError
      end

      def send_news(title, url, **opts)
        raise NotImplementedError
      end
    end
  end
end

然后使用:

client = IceJade::Feishu::Client.new('https://open.feishu.cn/...')
client.send_text("hello from feishu")

统一接口(可选)

如果你需要在运行时根据配置切换 IM,可以包装一个简单工厂:

def build_im_client(config)
  case config[:type]
  when 'quantum'  then IceJade::Quantum::Client.new(config[:key])
  when 'feishu'   then IceJade::Feishu::Client.new(config[:webhook_url])
  else raise "Unknown IM type: #{config[:type]}"
  end
end

文件结构

lib/
  ice_jade.rb
  ice_jade/
    version.rb
    error.rb
    response.rb
    client_base.rb
    quantum/
      client.rb
      message.rb

依赖

  • Ruby >= 2.5
  • 仅使用标准库

限制

  • Quantum: 文件上传 30MB,消息频率 20条/分钟