Mojo-SinaWeibo
view release on metacpan or search on metacpan
lib/Mojo/SinaWeibo.pm view on Meta::CPAN
my $i = $s->time;
my $k = ($i -$m->{ext}{timesync}{tc} - $m->{ext}{timesync}{p})/2;
my $l = $m->{ext}{timesync}{ts} - $m->{ext}{timesync}{ts} - $k;
push @{$s->im_client_lag_data},$k;
push @{$s->im_server_lag_data},$l;
if(10<@{$s->im_server_lag_data}){
shift @{$s->im_server_lag_data};shift @{$s->im_client_lag_data};
}
my $n=0;
my $o=0;
for(my $p=0;$p<@{$s->im_server_lag_data};$p++){
$n+=$s->im_client_lag_data->[$p];
$o+=$s->im_server_lag_data->[$p];
}
my $g = int($n/@{$s->im_server_lag_data});my $h=int($o/@{$s->im_server_lag_data});
$msg->{ext}{timesync}{l} = $g;
$msg->{ext}{timesync}{o} = $h;
}
$s->im_send($msg);
});
}
elsif($m->{channel} eq "/meta/subscribe"){
return unless $m->{successful};
$s->debug("æ¶å°æå¡å¨è®¢é
ååºæ¶æ¯");
if(@{$s->im_user} == 0){
$s->im_send($s->gen_im_msg("cmd",cmd=>"usersetting"));
$s->im_send($s->gen_im_msg("cmd",cmd=>"recents"));
}
else{
$s->im_ready(1);
$s->debug("ç§ä¿¡æå¡å¨ç¶æåå¤å°±ç»ª");
$s->emit("im_ready");
}
}
elsif($m->{channel} eq "/im/req"){
next unless $m->{successful};
}
elsif($m->{channel} eq $s->im_channel){
return unless exists $m->{data}{type};
if($m->{data}{type} eq "recents"){
$s->im_user([ map {{uid=>$_->[0],nick=>$_->[1]}} @{$m->{data}{recents}} ]);
if(!$s->im_ready){
$s->im_ready(1);
$s->debug("ç§ä¿¡æå¡å¨ç¶æåå¤å°±ç»ª");
$s->emit("im_ready");
}
}
elsif( $m->{data}{type} eq "msg"){
for(@{$m->{data}{items}}){
my($uid,$msg,$time) = @$_[0..2];
my $u = $s->search_im_user(uid=>$uid);
my $nick = defined $u?$u->{nick}:"å°å°";
$s->emit("receive_message",{uid=>$uid,nick=>$nick,content=>$msg,'time'=>int($time/1000)},{is_success=>1,code=>200,msg=>"æ£å¸¸ååº"});
}
}
elsif($m->{data}{type} eq "synchroniz" ){
return unless exists $m->{data}{syncData};
my $syncdata = decode_json(encode("utf8",$m->{data}{syncData}));
return unless exists $syncdata->{msg};
return unless exists $syncdata->{uid};
my $time = exists $syncdata->{'time'}?int($syncdata->{'time'}/1000):CORE::time;
my($uid,$msg) = ($syncdata->{uid}, $syncdata->{msg});
my $u = $s->search_im_user(uid=>$uid);
my $nick = defined $u?$u->{nick}:"å°å°";
$s->emit("send_message",{uid=>$uid,nick=>$nick,content=>$msg,'time'=>$time},"sync");
}
}
}
}
sub im_init{
my $s = shift;
return if $s->im_ready;
$s->im_msg_id(0)
->im_ack(-1)
->im_ready(0)
->im(undef)
->im_clientid(undef)
->im_connect_interval(0);
my $im_info = $s->get_im_info();
return unless defined $im_info;
$s->ua->websocket($im_info->{server},sub{
my ($ua, $tx) = @_;
$s->error("Websocketæå¡å¨è¿æ¥å¤±è´¥") and return unless $tx->is_websocket;
$s->im($tx);
$s->im->on(finish => sub {
my ($tx, $code, $reason) = @_;
$s->debug("WebSocketæå¡å¨å
³é($code)");
$s->im_ready(0);
$s->debug("ç§ä¿¡æå¡å¨ç¶æå¤±æ");
});
$s->im->on(json=>sub{
my ($tx, $msg) = @_;
$s->parse_im_msg($msg);
});
if(
($s->im->can("is_established") and $s->im->is_established)
or ($s->im->can("established") and $s->im->established)
){
$s->debug("Websocketæå¡å¨è¿æ¥æå");
$s->im_send($s->gen_im_msg("handshake"));
}
});
}
sub im_speek{
my $s = shift;
my $uid = shift;
my $content = shift;
my $callback = pop;
$content = decode("utf8",$content) if defined $content;
$s->auth() if $s->login_state eq "invalid";
if($s->login_state eq "stop"){
$callback->(undef,{is_success=>0,code=>503,msg=>encode("utf8","ååºè¶
æ¶")}) if ref $callback eq "CODE";
return;
}
my $delay = 0;
my $now = CORE::time;
if(defined $Mojo::SinaWeibo::LAST_DISPATCH_TIME){
$delay = $now<$Mojo::SinaWeibo::LAST_DISPATCH_TIME+$Mojo::SinaWeibo::SEND_INTERVAL?
$Mojo::SinaWeibo::LAST_DISPATCH_TIME+$Mojo::SinaWeibo::SEND_INTERVAL-$now
( run in 1.544 second using v1.01-cache-2.11-cpan-6aa56a78535 )