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(""" #{createTime} """) end def encode!(:transfer_customer_service, msg) do createTime = Timex.Duration.now |> Timex.Duration.to_seconds |> round ~s(""" #{createTime} """) 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