Current section

Files

Jump to
exwechat lib wechat message.ex
Raw

lib/wechat/message.ex

defmodule ExWechat.Message do
@moduledoc false
def parse!(xmldoc) do
node = xmldoc |> Quinn.parse
msgType = node |> xml_value(:MsgType) |> String.to_atom
%{
toUserName: node |> xml_value(:ToUserName),
fromUserName: node |> xml_value(:FromUserName),
createTime: node |> xml_value(:CreateTime),
msgType: node |> xml_value(:MsgType)
}
|> Map.merge(do_parse(msgType, node))
end
defp do_parse(:text, node) do
%{
content: node |> xml_value(:Content),
msgId: node |> xml_value(:MsgId)
}
end
defp do_parse(:event, node) do
event = node |> xml_value(:Event)
%{
event: event
}
|> Map.merge(do_parse(:event, String.to_atom(event), node))
end
defp do_parse(:event, :CLICK, node), do: %{eventKey: (node |> xml_value(:EventKey))}
defp do_parse(:event, :subscribe, _), do: %{}
defp do_parse(:event, :unsubscribe, _), do: %{}
def encode!(:text, msg) do
createTime = Timex.Duration.now |> Timex.Duration.to_seconds |> round
~s("""
<xml>
<ToUserName><![CDATA[#{msg.toUserName}]]></ToUserName>
<FromUserName><![CDATA[#{msg.fromUserName}]]></FromUserName>
<CreateTime>#{createTime}</CreateTime>
<MsgType><![CDATA[text]]></MsgType>
<Content><![CDATA[#{msg.content}]]></Content>
</xml>
""")
end
def encode!(:transfer_customer_service, msg) do
createTime = Timex.Duration.now |> Timex.Duration.to_seconds |> round
~s("""
<xml>
<ToUserName><![CDATA[#{msg.toUserName}]]></ToUserName>
<FromUserName><![CDATA[#{msg.fromUserName}]]></FromUserName>
<CreateTime>#{createTime}</CreateTime>
<MsgType><![CDATA[transfer_customer_service]]></MsgType>
</xml>
""")
end
defp xml_value(xml, tag), do: xml |> Quinn.find(tag) |> do_xml_value
defp do_xml_value([]), do: nil
defp do_xml_value([h|_]), do: h |> Map.get(:value) |> List.first
end