class Wechat::Message
Constants
- TEMPLATE_KEYS
- TO_JSON_ALLOWED
- TO_JSON_KEY_MAP
Attributes
message_hash[R]
Public Class Methods
from_hash(message_hash)
click to toggle source
# File lib/wechat/message.rb, line 6 def from_hash(message_hash) new(message_hash) end
new(message_hash)
click to toggle source
# File lib/wechat/message.rb, line 56 def initialize(message_hash) @message_hash = message_hash || {} end
to(to_users = '', towxname: nil, send_ignore_reprint: 0)
click to toggle source
# File lib/wechat/message.rb, line 10 def to(to_users = '', towxname: nil, send_ignore_reprint: 0) if towxname.present? new(ToWxName: towxname, CreateTime: Time.now.to_i) elsif send_ignore_reprint == 1 new(ToUserName: to_users, CreateTime: Time.now.to_i, send_ignore_reprint: send_ignore_reprint) else new(ToUserName: to_users, CreateTime: Time.now.to_i) end end
to_mass(tag_id: nil, send_ignore_reprint: 0)
click to toggle source
# File lib/wechat/message.rb, line 24 def to_mass(tag_id: nil, send_ignore_reprint: 0) if tag_id new(filter: { is_to_all: false, tag_id: tag_id }, send_ignore_reprint: send_ignore_reprint) else new(filter: { is_to_all: true }, send_ignore_reprint: send_ignore_reprint) end end
to_party(party)
click to toggle source
# File lib/wechat/message.rb, line 20 def to_party(party) new(ToPartyName: party, CreateTime: Time.now.to_i) end
Public Instance Methods
[](key)
click to toggle source
# File lib/wechat/message.rb, line 60 def [](key) message_hash[key] end
agent_id(agentid)
click to toggle source
# File lib/wechat/message.rb, line 106 def agent_id(agentid) update(AgentId: agentid) end
as(type)
click to toggle source
# File lib/wechat/message.rb, line 85 def as(type) case type when :text message_hash[:Content] when :image, :voice, :video Wechat.api.media(message_hash[:MediaId]) when :location message_hash.slice(:Location_X, :Location_Y, :Scale, :Label).each_with_object({}) do |value, results| results[value[0].to_s.underscore.to_sym] = value[1] end else raise "Don't know how to parse message as #{type}" end end
draft_news(collection)
click to toggle source
# File lib/wechat/message.rb, line 205 def draft_news(collection) update(MsgType: 'draft_news', Articles: collection) end
file(media_id)
click to toggle source
# File lib/wechat/message.rb, line 155 def file(media_id) update(MsgType: 'file', File: { MediaId: media_id }) end
image(media_id)
click to toggle source
# File lib/wechat/message.rb, line 142 def image(media_id) update(MsgType: 'image', Image: { MediaId: media_id }) end
markdown(content)
click to toggle source
# File lib/wechat/message.rb, line 124 def markdown(content) update(MsgType: 'markdown', Markdown: { content: content }) end
mpnews(collection) { |article, item, index| ... }
click to toggle source
# File lib/wechat/message.rb, line 179 def mpnews(collection, &_block) if block_given? article = MpNewsArticleBuilder.new collection.take(8).each_with_index { |item, index| yield(article, item, index) } items = article.items else items = collection.collect do |item| camelize_hash_keys(item.symbolize_keys.slice(:thumb_media_id, :title, :content, :author, :content_source_url, :digest, :show_cover_pic).compact) end end update(MsgType: 'mpnews', Articles: items.collect { |item| camelize_hash_keys(item) }) end
music(thumb_media_id, music_url, opts = {})
click to toggle source
# File lib/wechat/message.rb, line 159 def music(thumb_media_id, music_url, opts = {}) music_fields = camelize_hash_keys(opts.slice(:title, :description, :HQ_music_url).merge(music_url: music_url, thumb_media_id: thumb_media_id)) update(MsgType: 'music', Music: music_fields) end
news(collection) { |article, item, index| ... }
click to toggle source
# File lib/wechat/message.rb, line 164 def news(collection, &_block) if block_given? article = NewsArticleBuilder.new collection.take(8).each_with_index { |item, index| yield(article, item, index) } items = article.items else items = collection.collect do |item| camelize_hash_keys(item.symbolize_keys.slice(:title, :description, :pic_url, :url).compact) end end update(MsgType: 'news', ArticleCount: items.count, Articles: items.collect { |item| camelize_hash_keys(item) }) end
ref_mpnews(media_id)
click to toggle source
# File lib/wechat/message.rb, line 193 def ref_mpnews(media_id) update(MsgType: 'ref_mpnews', MpNews: { MediaId: media_id }) end
reply()
click to toggle source
# File lib/wechat/message.rb, line 64 def reply Message.new( ToUserName: message_hash[:FromUserName], FromUserName: message_hash[:ToUserName], CreateTime: Time.now.to_i, WechatSession: session ) end
save_session()
click to toggle source
# File lib/wechat/message.rb, line 79 def save_session ws = message_hash.delete(:WechatSession) ws.try(:save_session, underscore_hash_keys(message_hash)) @message_hash[:WechatSession] = ws end
save_to!(model_class)
click to toggle source
# File lib/wechat/message.rb, line 261 def save_to!(model_class) model = model_class.new(underscore_hash_keys(message_hash)) model.save! self end
session()
click to toggle source
# File lib/wechat/message.rb, line 73 def session return nil unless Wechat.config.have_session_class @message_hash[:WechatSession] ||= WechatSession.find_or_initialize_session(underscore_hash_keys(message_hash)) end
success()
click to toggle source
# File lib/wechat/message.rb, line 138 def success update(MsgType: 'success') end
template(opts = {})
click to toggle source
# File lib/wechat/message.rb, line 200 def template(opts = {}) template_fields = opts.symbolize_keys.slice(*TEMPLATE_KEYS) update(MsgType: 'template', Template: template_fields) end
text(content)
click to toggle source
# File lib/wechat/message.rb, line 110 def text(content) update(MsgType: 'text', Content: content) end
textcard(title, description, url, btntxt = nil)
click to toggle source
# File lib/wechat/message.rb, line 114 def textcard(title, description, url, btntxt = nil) data = { title: title, description: description, url: url } data[:btntxt] = btntxt if btntxt.present? update(MsgType: 'textcard', TextCard: data) end
to(openid_or_userid)
click to toggle source
# File lib/wechat/message.rb, line 102 def to(openid_or_userid) update(ToUserName: openid_or_userid) end
to_json(*_args)
click to toggle source
# File lib/wechat/message.rb, line 235 def to_json(*_args) keep_camel_case_key = message_hash[:MsgType] == 'template' json_hash = deep_recursive(message_hash) do |key, value| key = key.to_s [TO_JSON_KEY_MAP[key] || (keep_camel_case_key ? key : key.downcase), value] end json_hash = json_hash.transform_keys(&:downcase).select { |k, _v| TO_JSON_ALLOWED.include? k } case json_hash['msgtype'] when 'text' json_hash['text'] = { 'content' => json_hash.delete('content') } when 'news' json_hash['news'] = { 'articles' => json_hash.delete('articles') } when 'mpnews' json_hash = { 'articles' => json_hash['articles'] } when 'draft_news' json_hash = json_hash['articles'] when 'ref_mpnews' json_hash['msgtype'] = 'mpnews' json_hash.delete('articles') when 'template' json_hash = { 'touser' => json_hash['touser'] }.merge!(json_hash['template']) end JSON.generate(json_hash) end
to_xml()
click to toggle source
# File lib/wechat/message.rb, line 209 def to_xml ws = message_hash.delete(:WechatSession) xml = message_hash.to_xml(root: 'xml', children: 'item', skip_instruct: true, skip_types: true) @message_hash[:WechatSession] = ws xml end
transfer_customer_service(kf_account = nil)
click to toggle source
# File lib/wechat/message.rb, line 130 def transfer_customer_service(kf_account = nil) if kf_account update(MsgType: 'transfer_customer_service', TransInfo: { KfAccount: kf_account }) else update(MsgType: 'transfer_customer_service') end end
video(media_id, opts = {})
click to toggle source
# File lib/wechat/message.rb, line 150 def video(media_id, opts = {}) video_fields = camelize_hash_keys({ media_id: media_id }.merge(opts.slice(:title, :description))) update(MsgType: 'video', Video: video_fields) end
voice(media_id)
click to toggle source
# File lib/wechat/message.rb, line 146 def voice(media_id) update(MsgType: 'voice', Voice: { MediaId: media_id }) end
Private Instance Methods
camelize_hash_keys(hash)
click to toggle source
# File lib/wechat/message.rb, line 269 def camelize_hash_keys(hash) deep_recursive(hash) { |key, value| [key.to_s.camelize.to_sym, value] } end
deep_recursive(hash) { |key, value| ... }
click to toggle source
# File lib/wechat/message.rb, line 282 def deep_recursive(hash, &block) hash.inject({}) do |memo, val| key, value = *val case value.class.name when 'Hash' value = deep_recursive(value, &block) when 'Array' value = value.collect { |item| item.is_a?(Hash) ? deep_recursive(item, &block) : item } end key, value = yield(key, value) unless key == :WechatSession memo.merge!(key => value) end end
underscore_hash_keys(hash)
click to toggle source
# File lib/wechat/message.rb, line 273 def underscore_hash_keys(hash) deep_recursive(hash) { |key, value| [key.to_s.underscore.to_sym, value] } end
update(fields = {})
click to toggle source
# File lib/wechat/message.rb, line 277 def update(fields = {}) message_hash.merge!(fields) self end