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