Skip to content

Commit b1ff2c2

Browse files
lynchjamesngerakines
authored andcommitted
Added some list support (get only for now)
1 parent 2720a3b commit b1ff2c2

File tree

2 files changed

+93
-2
lines changed

2 files changed

+93
-2
lines changed

include/twitter_client.hrl

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -24,4 +24,6 @@
2424
-record(status, {created_at, id, text, source, truncated, in_reply_to_status_id, in_reply_to_user_id, favorited, user}).
2525
-record(message, {created_at, id, text, sender_id, recipient_id, sender_screen_name, recipient_screen_name, sender, recipient}).
2626
-record(user, {id, name, screen_name, location, description, profile_image_url, url, protected, followers_count, status, profile_background_color, profile_text_color, profile_link_color, profile_sidebar_fill_color, profile_sidebar_border_color, friends_count, created_at, favourites_count, utc_offset, time_zone, following, notifications, statuses_count}).
27-
-record(rate_limit, {reset_time, reset_time_in_seconds, remaining_hits, hourly_limit}).
27+
-record(rate_limit, {reset_time, reset_time_in_seconds, remaining_hits, hourly_limit}).
28+
-record(list, {id, name, full_name, slug, description, subscriber_count, member_count, uri, mode, user}).
29+

src/twitter_client.erl

Lines changed: 90 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -81,6 +81,12 @@
8181
user_friends/2, collect_user_friends/3,
8282
user_featured/2,
8383
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,
8490
notification_follow/2,
8591
notification_leave/2,
8692
block_create/2,
@@ -93,7 +99,8 @@
9399
account_verify_credentials/2,
94100
headers/2,
95101
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
97104
]).
98105

99106
-include("twitter_client.hrl").
@@ -266,6 +273,57 @@ user_show(Auth, Args) ->
266273
end,
267274
request_url(get, Url, Auth, [], fun(Body) -> parse_user(Body) end).
268275

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+
269327
notification_follow(Auth, [{"id", Id}]) ->
270328
Url = build_url("notifications/follow/" ++ Id ++ ".xml", []),
271329
request_url(get, Url, Auth, [], fun(Body) ->
@@ -394,6 +452,19 @@ parse_users(Body) ->
394452
parse_user(Body) when is_list(Body) ->
395453
parse_generic(Body, fun(Xml) -> [user_rec(Node) || Node <- xmerl_xpath:string("/user", Xml)] end).
396454

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+
397468
status_rec(Node) when is_tuple(Node) ->
398469
Status = #status{
399470
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) ->
459530
[StatusNode] -> UserRec#user{ status = status_rec(StatusNode) }
460531
end.
461532

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+
462550
parse_rate_limit(Node) when is_tuple(Node) ->
463551
#rate_limit{
464552
reset_time = text_or_default(Node, ["/hash/reset-time/text()"], ""),
@@ -493,3 +581,4 @@ text_or_default(Xml, [Xpath | Tail], Default) ->
493581
int_or_default(_Xml, [], Default) -> Default;
494582
int_or_default(Xml, Xpath, Default) ->
495583
twitter_client_utils:string_to_int(text_or_default(Xml, Xpath, Default)).
584+

0 commit comments

Comments
 (0)