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 )