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 独占一个命名空间,内部包含自己的 Client 和 Message(如果有)。
lib/ice_jade/
quantum/
client.rb # Quantum::Client < ClientBase
.rb # Quantum::Message
feishu/ # 未来其他IM
client.rb
dingtalk/ # 未来其他IM#2
client.rb
添加新 IM 的步骤
- 在
lib/ice_jade/下新建目录,例如feishu/ - 实现
lib/ice_jade/feishu/client.rb,继承IceJade::ClientBase - 在
lib/ice_jade.rb中require_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
.rb
依赖
- Ruby >= 2.5
- 仅使用标准库
限制
- Quantum: 文件上传 30MB,消息频率 20条/分钟