|
81 | 81 | user_friends/2, collect_user_friends/3,
|
82 | 82 | user_featured/2,
|
83 | 83 | user_show/2,
|
| 84 | + user_list_memberships/2, |
| 85 | + user_list_subscriptions/2, |
| 86 | + list/2, |
| 87 | + lists/2, |
| 88 | + list_statuses/2, |
| 89 | + list_members/2, |
84 | 90 | notification_follow/2,
|
85 | 91 | notification_leave/2,
|
86 | 92 | block_create/2,
|
|
93 | 99 | account_verify_credentials/2,
|
94 | 100 | headers/2,
|
95 | 101 | parse_status/1, parse_statuses/1, parse_user/1, parse_users/1, request_url/5,
|
96 |
| - text_or_default/3 |
| 102 | + text_or_default/3, |
| 103 | + build_url/2 |
97 | 104 | ]).
|
98 | 105 |
|
99 | 106 | -include("twitter_client.hrl").
|
@@ -266,6 +273,57 @@ user_show(Auth, Args) ->
|
266 | 273 | end,
|
267 | 274 | request_url(get, Url, Auth, [], fun(Body) -> parse_user(Body) end).
|
268 | 275 |
|
| 276 | +user_list_memberships(Auth, Args) -> |
| 277 | + Login = case Auth of {X, _} -> X; {X, _, _, _} -> X end, |
| 278 | + Url = case lists:keytake("id", 1, Args) of |
| 279 | + false -> build_url("/" ++ Login ++ "/lists/memberships.xml", []); |
| 280 | + {_, {"id", Id}, RetArgs} -> build_url("/" ++ Id ++ "/lists/memberships.xml", RetArgs) |
| 281 | + end, |
| 282 | + request_url(get, Url, Auth, [], fun(Body) -> parse_lists(Body) end). |
| 283 | + |
| 284 | +user_list_subscriptions(Auth, Args) -> |
| 285 | + Login = case Auth of {X, _} -> X; {X, _, _, _} -> X end, |
| 286 | + Url = case lists:keytake("id", 1, Args) of |
| 287 | + false -> build_url("/" ++ Login ++ "/lists/subscriptions.xml", []); |
| 288 | + {_, {"id", Id}, RetArgs} -> build_url("/" ++ Id ++ "/lists/subscriptions.xml", RetArgs) |
| 289 | + end, |
| 290 | + request_url(get, Url, Auth, [], fun(Body) -> parse_lists(Body) end). |
| 291 | + |
| 292 | +list(Auth, Args) -> |
| 293 | + Login = case lists:keytake("id", 1, Args) of |
| 294 | + false -> case Auth of {X, _} -> X; {X, _, _, _} -> X end; |
| 295 | + {_, {"id", Id}, _} -> Id end, |
| 296 | + Url = case lists:keytake("listid", 1, Args) of |
| 297 | + {_, {"listid", ListId}, RetArgs} -> build_url("/" ++ Login ++ "/lists/" ++ ListId ++ ".xml", RetArgs) |
| 298 | + end, |
| 299 | + request_url(get, Url, Auth, [], fun(Body) -> parse_list(Body) end). |
| 300 | + |
| 301 | +lists(Auth, Args) -> |
| 302 | + Login = case Auth of {X, _} -> X; {X, _, _, _} -> X end, |
| 303 | + Url = case lists:keytake("id", 1, Args) of |
| 304 | + false -> build_url("/" ++ Login ++ "/lists.xml", []); |
| 305 | + {_, {"id", Id}, RetArgs} -> build_url("/" ++ Id ++ "/lists.xml", RetArgs) |
| 306 | + end, |
| 307 | + request_url(get, Url, Auth, [], fun(Body) -> parse_lists(Body) end). |
| 308 | + |
| 309 | +list_statuses(Auth, Args) -> |
| 310 | + Login = case lists:keytake("id", 1, Args) of |
| 311 | + false -> case Auth of {X, _} -> X; {X, _, _, _} -> X end; |
| 312 | + {_, {"id", Id}, _} -> Id end, |
| 313 | + Url = case lists:keytake("listid", 1, Args) of |
| 314 | + {_, {"listid", ListId}, RetArgs} -> build_url("/" ++ Login ++ "/lists/" ++ ListId ++ "/statuses.xml", RetArgs) |
| 315 | + end, |
| 316 | + request_url(get, Url, Auth, [], fun(Body) -> parse_statuses(Body) end). |
| 317 | + |
| 318 | +list_members(Auth, Args) -> |
| 319 | + Login = case lists:keytake("id", 1, Args) of |
| 320 | + false -> case Auth of {X, _} -> X; {X, _, _, _} -> X end; |
| 321 | + {_, {"id", Id}, _} -> Id end, |
| 322 | + Url = case lists:keytake("listid", 1, Args) of |
| 323 | + {_, {"listid", ListId}, RetArgs} -> build_url("/" ++ Login ++ "/" ++ ListId ++ "/members.xml", RetArgs) |
| 324 | + end, |
| 325 | + request_url(get, Url, Auth, [], fun(Body) -> parse_list_users(Body) end). |
| 326 | + |
269 | 327 | notification_follow(Auth, [{"id", Id}]) ->
|
270 | 328 | Url = build_url("notifications/follow/" ++ Id ++ ".xml", []),
|
271 | 329 | request_url(get, Url, Auth, [], fun(Body) ->
|
@@ -394,6 +452,19 @@ parse_users(Body) ->
|
394 | 452 | parse_user(Body) when is_list(Body) ->
|
395 | 453 | parse_generic(Body, fun(Xml) -> [user_rec(Node) || Node <- xmerl_xpath:string("/user", Xml)] end).
|
396 | 454 |
|
| 455 | +parse_list(Body) -> |
| 456 | + parse_generic(Body, fun(Xml) -> [list_rec(Node) || Node <- xmerl_xpath:string("/list", Xml)] end). |
| 457 | + |
| 458 | +parse_lists(Body) -> |
| 459 | + parse_generic(Body, fun(Xml) -> |
| 460 | + [list_rec(Node) || Node <- xmerl_xpath:string("/lists_list/lists/list", Xml)] |
| 461 | + end). |
| 462 | + |
| 463 | +parse_list_users(Body) -> |
| 464 | + parse_generic(Body, fun(Xml) -> |
| 465 | + [user_rec(Node) || Node <- xmerl_xpath:string("/users_list/users/user", Xml)] |
| 466 | + end). |
| 467 | + |
397 | 468 | status_rec(Node) when is_tuple(Node) ->
|
398 | 469 | Status = #status{
|
399 | 470 | created_at = text_or_default(Node, ["/status/created_at/text()", "/direct_message/created_at/text()"], ""),
|
@@ -459,6 +530,23 @@ user_rec(Node) when is_tuple(Node) ->
|
459 | 530 | [StatusNode] -> UserRec#user{ status = status_rec(StatusNode) }
|
460 | 531 | end.
|
461 | 532 |
|
| 533 | +list_rec(Node) when is_tuple(Node) -> |
| 534 | + ListRec = #list{ |
| 535 | + id = text_or_default(Node, ["id/text()"], ""), |
| 536 | + name = text_or_default(Node, ["name/text()"], ""), |
| 537 | + full_name = text_or_default(Node, ["full_name/text()"], ""), |
| 538 | + slug = text_or_default(Node, ["slug/text()"], ""), |
| 539 | + description = text_or_default(Node, ["description/text()"], ""), |
| 540 | + subscriber_count = text_or_default(Node, ["subscriber_count/text()"], ""), |
| 541 | + member_count = text_or_default(Node, ["member_count/text()"], ""), |
| 542 | + uri = text_or_default(Node, ["uri/text()"], ""), |
| 543 | + mode = text_or_default(Node, ["name/text()"], "") |
| 544 | + }, |
| 545 | + case xmerl_xpath:string("/list/user", Node) of |
| 546 | + [] -> ListRec; |
| 547 | + [UserNode] -> ListRec#list{ user = user_rec(UserNode) } |
| 548 | + end. |
| 549 | + |
462 | 550 | parse_rate_limit(Node) when is_tuple(Node) ->
|
463 | 551 | #rate_limit{
|
464 | 552 | reset_time = text_or_default(Node, ["/hash/reset-time/text()"], ""),
|
@@ -493,3 +581,4 @@ text_or_default(Xml, [Xpath | Tail], Default) ->
|
493 | 581 | int_or_default(_Xml, [], Default) -> Default;
|
494 | 582 | int_or_default(Xml, Xpath, Default) ->
|
495 | 583 | twitter_client_utils:string_to_int(text_or_default(Xml, Xpath, Default)).
|
| 584 | + |
0 commit comments