Class: Wechat::Message
- Inherits:
-
Object
show all
- Defined in:
- lib/wechat/message.rb
Defined Under Namespace
Classes: ArticleBuilder, MpNewsArticleBuilder, NewsArticleBuilder
Constant Summary
collapse
- TEMPLATE_KEYS =
%i[template_id form_id page color
emphasis_keyword topcolor url miniprogram data].freeze
- TO_JSON_KEY_MAP =
{
'TextCard' => 'textcard',
'Markdown' => 'markdown',
'ToUserName' => 'touser',
'ToPartyName' => 'toparty',
'ToWxName' => 'towxname',
'MediaId' => 'media_id',
'MpNews' => 'mpnews',
'ThumbMediaId' => 'thumb_media_id',
'TemplateId' => 'template_id',
'FormId' => 'form_id',
'ContentSourceUrl' => 'content_source_url',
'ShowCoverPic' => 'show_cover_pic'
}.freeze
- TO_JSON_ALLOWED =
%w[touser toparty msgtype content image voice video file textcard markdown
music news articles template agentid filter
send_ignore_reprint mpnews towxname].freeze
Instance Attribute Summary collapse
Class Method Summary
collapse
Instance Method Summary
collapse
Constructor Details
#initialize(message_hash) ⇒ Message
Returns a new instance of Message.
56
57
58
|
# File 'lib/wechat/message.rb', line 56
def initialize(message_hash)
@message_hash = message_hash || {}
end
|
Instance Attribute Details
#message_hash ⇒ Object
Returns the value of attribute message_hash.
54
55
56
|
# File 'lib/wechat/message.rb', line 54
def message_hash
@message_hash
end
|
Class Method Details
.from_hash(message_hash) ⇒ Object
6
7
8
|
# File 'lib/wechat/message.rb', line 6
def from_hash(message_hash)
new(message_hash)
end
|
.to(to_users = '', towxname: nil, send_ignore_reprint: 0) ⇒ Object
10
11
12
13
14
15
16
17
18
|
# 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) ⇒ Object
24
25
26
27
28
29
30
|
# 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) ⇒ Object
20
21
22
|
# File 'lib/wechat/message.rb', line 20
def to_party(party)
new(ToPartyName: party, CreateTime: Time.now.to_i)
end
|
Instance Method Details
#[](key) ⇒ Object
60
61
62
|
# File 'lib/wechat/message.rb', line 60
def [](key)
message_hash[key]
end
|
#agent_id(agentid) ⇒ Object
106
107
108
|
# File 'lib/wechat/message.rb', line 106
def agent_id(agentid)
update(AgentId: agentid)
end
|
#as(type) ⇒ Object
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
|
# 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) ⇒ Object
205
206
207
|
# File 'lib/wechat/message.rb', line 205
def draft_news(collection)
update(MsgType: 'draft_news', Articles: collection)
end
|
#file(media_id) ⇒ Object
155
156
157
|
# File 'lib/wechat/message.rb', line 155
def file(media_id)
update(MsgType: 'file', File: { MediaId: media_id })
end
|
#image(media_id) ⇒ Object
142
143
144
|
# File 'lib/wechat/message.rb', line 142
def image(media_id)
update(MsgType: 'image', Image: { MediaId: media_id })
end
|
#markdown(content) ⇒ Object
124
125
126
127
128
|
# File 'lib/wechat/message.rb', line 124
def markdown(content)
update(MsgType: 'markdown', Markdown: {
content: content
})
end
|
#mpnews(collection, &_block) ⇒ Object
179
180
181
182
183
184
185
186
187
188
189
190
191
|
# 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 = {}) ⇒ Object
159
160
161
162
|
# 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, &_block) ⇒ Object
164
165
166
167
168
169
170
171
172
173
174
175
176
177
|
# 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) ⇒ Object
193
194
195
|
# File 'lib/wechat/message.rb', line 193
def ref_mpnews(media_id)
update(MsgType: 'ref_mpnews', MpNews: { MediaId: media_id })
end
|
#reply ⇒ Object
64
65
66
67
68
69
70
71
|
# 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 ⇒ Object
79
80
81
82
83
|
# 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) ⇒ Object
261
262
263
264
265
|
# 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
|
#success ⇒ Object
138
139
140
|
# File 'lib/wechat/message.rb', line 138
def success
update(MsgType: 'success')
end
|
#template(opts = {}) ⇒ Object
200
201
202
203
|
# 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) ⇒ Object
110
111
112
|
# File 'lib/wechat/message.rb', line 110
def text(content)
update(MsgType: 'text', Content: content)
end
|
#textcard(title, description, url, btntxt = nil) ⇒ Object
114
115
116
117
118
119
120
121
122
|
# 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) ⇒ Object
102
103
104
|
# File 'lib/wechat/message.rb', line 102
def to(openid_or_userid)
update(ToUserName: openid_or_userid)
end
|
#to_json(*_args) ⇒ Object
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
|
# 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 ⇒ Object
209
210
211
212
213
214
|
# 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) ⇒ Object
130
131
132
133
134
135
136
|
# 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 = {}) ⇒ Object
150
151
152
153
|
# 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) ⇒ Object
146
147
148
|
# File 'lib/wechat/message.rb', line 146
def voice(media_id)
update(MsgType: 'voice', Voice: { MediaId: media_id })
end
|