our
@EXPORT
=
qw(get_api parse_response parse_post_hash
get_request auth_get_request auth_post_request)
;
our
$VERSION
= 4.08;
sub
get_request {
my
$url
=
shift
;
my
$ua
= LWP::UserAgent -> new;
my
$response
=
$ua
-> request(GET
$url
) -> as_string;
return
$response
;
}
sub
auth_get_request {
my
(
$url
,
$usr
,
$pwd
,
$api
) =
@_
;
my
$ua
= LWP::UserAgent -> new;
$ua
-> credentials(
$api
-> {
'endpoint'
},
$api
-> {
'realm'
},
$usr
,
$pwd
);
my
$response
=
$ua
-> request(GET
$url
) -> as_string;
return
$response
;
}
sub
auth_post_request {
my
(
$url
,
$usr
,
$pwd
,
$request
,
$api
) =
@_
;
my
$ua
= LWP::UserAgent->new;
$ua
-> credentials(
$api
-> {
'endpoint'
},
$api
-> {
'realm'
},
$usr
,
$pwd
);
my
$response
=
$ua
-> request(POST
$url
, [
%$request
]) -> as_string;
return
$response
;
}
sub
parse_response {
my
@data
=
split
(
'\n\n'
,
shift
);
my
$json
= new JSON;
my
$json_text
=
$json
-> decode(
$data
[1]);
if
(
ref
$json_text
ne
"ARRAY"
) {
die
(
"ERROR: "
.
$json_text
-> {
'error'
}.
"\n"
)
if
$json_text
-> {
'error'
};
}
return
$json_text
;
}
sub
parse_post_hash {
my
(
$data
,
$type
) =
@_
;
my
@posts
;
if
(
$data
=~ /array/i) {
foreach
my
$status
(@{
$data
}) {
my
$post
= format_post(
$status
,
$type
);
push
(
@posts
,
$post
);
}
}
else
{
my
$post
= format_post(
$data
,
$type
);
push
(
@posts
,
$post
);
}
return
\
@posts
;
}
sub
get_api {
my
$network
=
shift
;
my
%api
;
if
(
$network
eq
"twitter"
) {
$api
{
'endpoint'
} =
"api.twitter.com:80"
;
$api
{
'path'
} =
"1"
;
$api
{
'realm'
} =
"Twitter API"
;
}
elsif
(
$network
eq
"identi.ca"
) {
$api
{
'endpoint'
} =
"identi.ca:80"
;
$api
{
'path'
} =
"api"
;
$api
{
'realm'
} =
"Identi.ca API"
;
}
$api
{
'url'
} =
"http://"
.
$api
{
'endpoint'
}.
"/"
.
$api
{
'path'
};
return
\
%api
;
}
sub
format_post {
my
(
$status
,
$type
) =
@_
;
my
%out
;
if
(
$status
-> {
'error'
}) {
$out
{
'err'
} = 1;
$out
{
'err_msg'
} =
$status
-> {error};
}
else
{
$out
{
'err'
} = 0;
$out
{
'text'
} =
$status
-> {text};
$out
{
'date'
} =
$status
-> {created_at};
$out
{
'relative'
} = relative_time(
$status
-> {created_at});
$out
{
'id'
} =
$status
-> {id};
if
(
$type
eq
'status'
) {
$out
{
'user'
} =
$status
-> {user} -> {name};
$out
{
'screen_name'
} =
$status
-> {user} -> {screen_name};
}
elsif
(
$type
eq
'dm'
) {
$out
{
'user'
} =
$status
-> {sender} -> {name};
$out
{
'screen_name'
} =
$status
-> {sender} -> {screen_name};
}
}
return
\
%out
;
}
sub
relative_time {
my
$time_value
=
shift
;
my
$relative_to
= DateTime -> now() -> epoch;
$time_value
=~ s/\+0000/GMT/;
$time_value
= DateTime::Format::HTTP -> parse_datetime(
$time_value
) -> epoch;
$relative_to
=
$relative_to
-> epoch
if
ref
(
$relative_to
) =~ /DateTime/;
my
$delta
=
$relative_to
-
$time_value
;
if
(
$delta
< 60) {
return
'less than a minute ago'
;
}
elsif
(
$delta
< 120) {
return
'about a minute ago'
;
}
elsif
(
$delta
< (45*60)) {
return
int
(
$delta
/ 60) .
' minutes ago'
;
}
elsif
(
$delta
< (90*60)) {
return
'about an hour ago'
;
}
elsif
(
$delta
< (24*60*60)) {
return
'about '
.
int
(
$delta
/ 3600) .
' hours ago'
;
}
elsif
(
$delta
< (48*60*60)) {
return
'1 day ago'
;
}
else
{
return
int
(
$delta
/ 86400) .
' days ago'
;
}
}
1;