Mojo-Webqq
view release on metacpan or search on metacpan
lib/Mojo/Webqq/Model.pm view on Meta::CPAN
$self->die("åæ°å¿
é¡»æ¯å½æ°å¼ç¨") if ref $callback ne "CODE";
$self->update_friend(is_blocking=>1,is_update_friend_ext=>1) if @{$self->friend} == 0;
for (@{$self->friend}){
$callback->($self,$_);
}
}
sub each_group{
my $self = shift;
my $callback = shift;
$self->die("åæ°å¿
é¡»æ¯å½æ°å¼ç¨") if ref $callback ne "CODE";
$self->update_group(is_blocking=>1,is_update_group_member=>0) if @{$self->group} == 0;
for (@{$self->group}){
$callback->($self,$_);
}
}
sub each_discuss{
my $self = shift;
my $callback = shift;
$self->die("åæ°å¿
é¡»æ¯å½æ°å¼ç¨") if ref $callback ne "CODE";
$self->update_discuss(is_blocking=>1,is_update_discuss_member=>0) if @{$self->discuss} == 0;
for (@{$self->discuss}){
$callback->($self,$_);
}
}
sub each_group_member{
my $self = shift;
my $callback = shift;
$self->die("åæ°å¿
é¡»æ¯å½æ°å¼ç¨") if ref $callback ne "CODE";
if(@{$self->group} == 0){
$self->update_group(is_blocking=>1,is_update_group_member=>1);
}
else{
for( @{$self->group}){
$_->update_group_member(is_blocking=>1,) if $_->is_empty;
}
}
my @member = map {@{$_->member}} grep {ref $_->member eq "ARRAY"} @{$self->group};
for (@member){
$callback->($self,$_);
}
}
sub each_discuss_member{
my $self = shift;
my $callback = shift;
$self->die("åæ°å¿
é¡»æ¯å½æ°å¼ç¨") if ref $callback ne "CODE";
if(@{$self->discuss} == 0){
$self->update_discuss(is_blocking=>1,is_update_discuss_member=>1);
}
else{
for( @{$self->discuss}){
$_->update_discuss_member(is_blocking=>1,) if $_->is_empty;
}
}
my @member = map {@{$_->member}} grep {ref $_->member eq "ARRAY"} @{$self->discuss};
for (@member){
$callback->($self,$_);
}
}
sub update_user {
my $self = shift;
my $is_blocking = ! shift;
$self->info("æ´æ°ä¸ªäººä¿¡æ¯...\n");
my $handle = sub{
my $user_info = shift;
unless ( defined $user_info ) {
$self->warn("æ´æ°ä¸ªäººä¿¡æ¯å¤±è´¥\n");
$self->user(Mojo::Webqq::User->new({id=>$self->uid,uid=>$self->uid}));
$self->emit("model_update"=>"user",0);
return;
}
$self->user(Mojo::Webqq::User->new($user_info));
$self->emit("model_update"=>"user",1);
};
if($is_blocking){
my $user_info = $self->_get_user_info();
$handle->($user_info);
}
else{
$self->_get_user_info($handle);
}
}
sub remove_friend {
my $self = shift;
my $friend = shift;
$self->die("䏿¯æçæ°æ®ç±»å\n") if ref $friend ne "Mojo::Webqq::Friend";
for(my $i=0;@{$self->friend};$i++){
if($friend->id eq $self->friend->[$i]->id){
splice @{$self->friend},$i,1;
return 1;
}
}
return 0;
}
sub add_friend {
my $self = shift;
my $friend = shift;
my $nocheck = shift;
$self->die("䏿¯æçæ°æ®ç±»å\n") if ref $friend ne "Mojo::Webqq::Friend";
if(@{$self->friend} == 0){
push @{$self->friend},$friend;
return $self;
}
if($nocheck){
push @{$self->friend},$friend;
return $self;
}
my $f = $self->search_friend(id => $friend->id);
if(defined $f){
%$f = %$friend;
}
else{
push @{$self->friend},$friend;
}
return $self;
}
sub update_friend_ext {
my $self = shift;
my %p = @_;
$p{is_blocking} = 1 if not defined $p{is_blocking} ;
if ( not $self->is_support_model_ext){
$self->warn("æ æ³æ¯æè·åæ©å±ä¿¡æ¯");
return;
}
my $handle = sub{
my $friends_ext_info = shift;
if(defined $friends_ext_info and ref $friends_ext_info eq "ARRAY"){
$self->info("æ´æ°å¥½åæ©å±ä¿¡æ¯...");
my(undef,$ext)=$self->array_unique($friends_ext_info,sub{$_[0]->{displayname} . "|" . $_[0]->{category}},"friend_ext");
my $unique_friend = $self->array_unique($self->friend,sub{$_[0]->displayname . "|" . $_[0]->category},"friend");
for my $f(@$unique_friend){
my $id = $f->displayname . "|" . $f->category;
next if not exists $ext->{$id};
$f->{uid} = $ext->{$id}{uid};
}
if($self->log_level eq 'debug'){
for(@{$self->friend}){
$self->debug("æ´æ°å¥½å[" . $_->displayname . "|" . $_->category . "]æ©å±ä¿¡æ¯uid失败") if not $_->uid;
}
}
$self->emit("model_update"=>"friend_ext",1);
}
else{
$self->warn("æ´æ°å¥½åæ©å±ä¿¡æ¯å¤±è´¥");
$self->emit("model_update"=>"friend_ext",0);
}
};
if($p{is_blocking}){
my $friends_ext_info = $self->_get_user_friends_ext();
$handle->($friends_ext_info);
}
else{
$self->_get_user_friends_ext($handle);
}
}
sub update_friend {
my $self = shift;
if(ref $_[0] eq "Mojo::Webqq::Friend"){
my $friend = shift;
my %p = @_;
$p{is_blocking} = 1 if not defined $p{is_blocking};
$self->info("æ´æ°å¥½å [ " . $friend->displayname . " ] ä¿¡æ¯...");
my $handle = sub{
my $friend_info = shift;
if(defined $friend_info){$friend->update($friend_info);}
else{$self->warn("æ´æ°å¥½å [ " . $friend->displayname . " ] ä¿¡æ¯å¤±è´¥...");}
};
if($p{is_blocking}){
my $friend_info = $self->_get_friend_info($friend->id);
$handle->($friend_info);
}
else{
$self->_get_friend_info($friend->id,$handle);
}
return $self;
}
my %p = @_;
$p{is_blocking} = 1 if not defined $p{is_blocking};
$p{is_update_friend_ext} = 1 if not defined $p{is_update_friend_ext};
my $handle = sub{
my @friends;
my $friends_info = shift;
if(defined $friends_info){
$self->info("æ´æ°å¥½åä¿¡æ¯...");
push @friends,Mojo::Webqq::Friend->new($_) for @{$friends_info};
if(ref $self->friend eq "ARRAY" and @{$self->friend} == 0){
$self->friend(\@friends);
}
else{
my($new_friends,$lost_friends,$sames) = $self->array_diff($self->friend,\@friends,sub{$_[0]->id});
for(@{$new_friends}){
$self->add_friend($_);
$self->emit(new_friend=>$_);
}
for(@{$lost_friends}){
$self->remove_friend($_);
$self->emit(lose_friend=>$_);
}
for(@{$sames}){
my($old,$new) = @$_;
$old->update($new);
}
}
$self->emit("model_update","friend",1);
$self->update_friend_ext(is_blocking=>$p{is_blocking}) if $p{is_update_friend_ext};
}
else{$self->warn("æ´æ°å¥½åä¿¡æ¯å¤±è´¥");$self->emit("model_update","friend",0);}
};
if($p{is_blocking}){
my $friends_info = $self->_get_user_friends();
$handle->($friends_info);
}
else{
$self->_get_user_friends($handle);
}
}
sub search_friend {
no warnings 'uninitialized';
my $self = shift;
my %p = @_;
return if 0 == grep {defined $p{$_}} keys %p;
$self->update_friend(is_blocking=>1,is_update_friend_ext=>1) if @{ $self->friend } == 0;
if(wantarray){
return grep {my $f = $_;(first {$p{$_} ne $f->$_} grep {defined $p{$_}} keys %p) ? 0 : 1;} @{$self->friend};
}
else{
return first {my $f = $_;(first {$p{$_} ne $f->$_} grep {defined $p{$_}} keys %p) ? 0 : 1;} @{$self->friend};
}
}
sub add_group{
my $self = shift;
my $group = shift;
my $nocheck = shift;
$self->die("䏿¯æçæ°æ®ç±»å") if ref $group ne "Mojo::Webqq::Group";
if(@{$self->group} == 0){
push @{$self->group},$group;
return $self;
}
if($nocheck){
push @{$self->group},$group;
return $self;
}
my $g = $self->search_group(id => $group->id);
if(defined $g){
%$g = %$group;
}
else{#new group
push @{$self->group},$group;
}
return $self;
}
sub remove_group{
my $self = shift;
my $group = shift;
$self->die("䏿¯æçæ°æ®ç±»å") if ref $group ne "Mojo::Webqq::Group";
for(my $i=0;@{$self->group};$i++){
if($group->id eq $self->group->[$i]->id){
splice @{$self->group},$i,1;
return 1;
}
}
return 0;
}
sub update_group_ext {
my $self = shift;
if ( not $self->is_support_model_ext){
$self->warn("æ æ³æ¯æè·åæ©å±ä¿¡æ¯");
return;
}
return if @{ $self->group } == 0;
my $group;
$group = shift if ref $_[0] eq "Mojo::Webqq::Group";
my %p = @_;
$p{is_blocking} = 1 if not defined $p{is_blocking};
$p{is_update_group_member_ext} = 1 if not defined $p{is_update_group_member_ext};
if(defined $group and defined $group->uid){#è¦æ´æ°çæå®ç¾¤ç»å·²ç»å
嫿©å±ä¿¡æ¯
$self->update_group_member_ext($group,%p) if $p{is_update_group_member_ext};
return;
}
elsif( (!defined $group) and (! first { !defined $_->uid} @{$self->group} ) ){ #ææç¾¤ç»é½å
嫿©å±ä¿¡æ¯äº
for(@{$self->group}){
$self->update_group_member_ext($_,%p) if $p{is_update_group_member_ext};
}
return;
}
my $handle = sub{
my $group_list_ext = shift;
if(defined $group_list_ext and ref $group_list_ext eq "ARRAY"){
$self->info("æ´æ°ç¾¤å表æ©å±ä¿¡æ¯...");
my(undef,$gext)= $self->array_unique($group_list_ext,sub{$_[0]->{name}},"group_ext");
my $unique_group = $self->array_unique($self->group,sub{$_[0]->name},"group");
my @groups = defined $group?(grep {$_->id eq $group->id} @$unique_group) : @$unique_group;
if($p{is_blocking}){
for my $g (@groups){
my $id = $g->name;
next if not exists $gext->{$id};
$g->update($gext->{$id});
$self->update_group_member_ext($g,%p) if $p{is_update_group_member_ext};
}
}
else{
my $i = -3;
for my $g (@groups){
my $id = $g->name;
next if not exists $gext->{$id};
$g->update($gext->{$id});
$self->timer($i+3,sub{
$self->update_group_member_ext($g,%p) if $p{is_update_group_member_ext};
});
$i++;
}
}
$self->emit("model_update","group_ext",1);
}
else{$self->warn("æ´æ°ç¾¤æ©å±ä¿¡æ¯å¤±è´¥");$self->emit("model_update","group_ext",0);}
};
if($p{is_blocking}){
my $group_list_ext = $self->_get_group_list_info_ext();
$handle->($group_list_ext);
}
else{
$self->_get_group_list_info_ext($handle);
}
}
sub update_group_member_ext {
my $self = shift;
my $group = shift;
if ( not $self->is_support_model_ext){
$self->warn("群ç»[ ". $group->name . " ]å½åæ æ³æ¯æè·åæ©å±ä¿¡æ¯");
return;
}
$self->die("䏿¯æçæ°æ®ç±»å") if ref $group ne "Mojo::Webqq::Group";
if(not defined $group->uid){
$self->warn("群ç»[ ". $group->name . " ]æªå
嫿æçuidï¼æ æ³æ´æ°ç¾¤æåæ©å±ä¿¡æ¯");
return;
}
if($group->is_empty){
$self->warn("群ç»[ ". $group->name . " ]æªå
å«ç¾¤æåï¼å¿½ç¥æ´æ°ç¾¤æåæ©å±ä¿¡æ¯");
return;
}
my %p = @_;
$p{is_blocking} = 1 if not defined $p{is_blocking};
my $handle = sub{
my $group_info_ext = shift;
if(defined $group_info_ext){
$self->info("æ´æ°ç¾¤ç»[ ". $group->name . " ]æåæ©å±ä¿¡æ¯");
my $unique_sub = sub{
my $name = $_[0]->{name} // "";
my $card = $_[0]->{card} // "";
if(ref $self->group_member_identify_callback eq 'CODE'){
return $self->group_member_identify_callback->($name,$card);
}
else{
return $self->group_member_card_ext_only? $name: $name . $card;
}
};
my(undef,$mext) = $self->array_unique($group_info_ext->{member},$unique_sub,$group->name . " member_ext");
my $unique_member = $self->array_unique($group->member,$unique_sub,$group->name . " member");
for(@$unique_member){
my $id = $unique_sub->($_);
next if not exists $mext->{$id};
$_->update($mext->{$id});
}
if($self->log_level eq 'debug'){
for(@{$group->member}){
$self->debug("æ´æ°ç¾¤æå[".$_->name . "|" . $group->name ."]æ©å±ä¿¡æ¯uid失败") if not $_->uid;
}
}
$group->{max_member} //= $group_info_ext->{max_member};
$group->{max_admin} //= $group_info_ext->{max_admin};
$group->{_is_hold_member_ext} = 1;
$self->emit("model_update","group_member_ext",1);
}
else{$self->warn("æ´æ°ç¾¤ç»[ " . $group->name . " ]æåæ©å±ä¿¡æ¯å¤±è´¥");}
};
if($p{is_blocking}){
my $group_info_ext = $self->_get_group_info_ext($group->uid);
$handle->($group_info_ext);
}
else{
$self->_get_group_info_ext($group->uid,$handle);
}
}
sub update_group_member {
my $self = shift;
my $group = shift;
$self->die("䏿¯æçæ°æ®ç±»å") if ref $group ne "Mojo::Webqq::Group";
my %p = @_;
$p{is_blocking} = 1 if not defined $p{is_blocking};
$p{is_update_group_member_ext} = 1 if not defined $p{is_update_group_member_ext};
my $handle = sub{
my $group_info = shift;
if(defined $group_info){
$self->info("æ´æ°ç¾¤ç»[ ". $group->name . " ]æåä¿¡æ¯");
if(ref $group_info->{member} eq 'ARRAY'){
$group->update($group_info);
$self->update_group_member_ext($group,%p) if $p{is_update_group_member_ext};
}
else{$self->debug("æ´æ°ç¾¤ç»[ " . $group->name . " ]æåä¿¡æ¯æ æ")}
}
else{$self->warn("æ´æ°ç¾¤ç»[ " . $group->name . " ]æåä¿¡æ¯å¤±è´¥")}
};
if($p{is_blocking}){
my $group_info = $self->_get_group_info($group->code);
$handle->($group_info);
}
else{
$self->_get_group_info($group->code,$handle);
}
}
sub update_group {
my $self = shift;
if(ref $_[0] eq "Mojo::Webqq::Group"){
my $group = shift;
my %p = @_;
$p{is_blocking} = 1 if not defined $p{is_blocking};
$p{is_update_group_member} = 1 if not defined $p{is_update_group_member} ;
$p{is_update_group_ext} = $p{is_blocking} if not defined $p{is_update_group_ext} ;
$p{is_update_group_member_ext} = $p{is_update_group_ext} && $p{is_blocking} if not defined $p{is_update_group_member_ext} ;
my $handle = sub{
my $group_info = shift;
if(defined $group_info){
if(ref $group_info->{member} eq 'ARRAY'){
$self->info("æ´æ°ç¾¤ç»[ ". $group->name . " ]ä¿¡æ¯");
$group->update($group_info);
$self->update_group_ext($group,%p) if $p{is_update_group_ext};
}
else{$self->debug("æ´æ°ç¾¤ç»[ " . $group->name . " ]æåä¿¡æ¯æ æ")}
}
else{$self->warn("æ´æ°ç¾¤ç»[ " . $group->name . " ]æåä¿¡æ¯å¤±è´¥")}
};
if($p{is_blocking}){
my $group_info = $self->_get_group_info($group->code);
$handle->($group_info);
}
else{
$self->_get_group_info($group->code,$handle);
}
return $self;
}
my %p = @_;
$p{is_blocking} = 1 if not defined $p{is_blocking} ;
$p{is_update_group_member} = 1 if not defined $p{is_update_group_member} ;
$p{is_update_group_ext} = $p{is_blocking} if not defined $p{is_update_group_ext} ;
$p{is_update_group_member_ext} = $p{is_blocking} && $p{is_update_group_ext} && $p{is_update_group_member} if not defined $p{is_update_group_member_ext} ;
my $handle = sub{
my @groups;
my $group_list = shift;
unless(defined $group_list){
$self->warn("æ´æ°ç¾¤å表信æ¯å¤±è´¥\n");
$self->emit("model_update","group",0);
return $self;
}
$self->info("æ´æ°ç¾¤å表信æ¯...");
for my $g (@{$group_list}){
push @groups, Mojo::Webqq::Group->new($g);
}
if(ref $self->group eq "ARRAY" and @{$self->group} == 0){
$self->group(\@groups);
}
else{
my($new_groups,$lost_groups,$sames) = $self->array_diff($self->group,\@groups,sub{$_[0]->id});
for(@{$new_groups}){
$self->add_group($_);
$self->emit(new_group=>$_) ;
}
for(@{$lost_groups}){
$self->remove_group($_);
$self->emit(lose_group=>$_) ;
}
lib/Mojo/Webqq/Model.pm view on Meta::CPAN
sub search_group_member {
no warnings 'uninitialized';
my $self = shift;
my %p = @_;
return if 0 == grep {defined $p{$_}} keys %p;
if(@{$self->group} == 0){
$self->update_group(is_blocking=>1,is_update_group_member=>1);
}
else{
for( @{$self->group}){
$_->update_group_member(is_blocking=>1,) if $_->is_empty;
}
}
my @member = map {@{$_->member}} grep {ref $_->member eq "ARRAY"} @{$self->group};
if(wantarray){
return grep {my $m = $_;(first {$p{$_} ne $m->$_} grep {defined $p{$_}} keys %p) ? 0 : 1;} @member;
}
else{
return first {my $m = $_;(first {$p{$_} ne $m->$_} grep {defined $p{$_}} keys %p) ? 0 : 1;} @member;
}
}
sub add_discuss {
my $self = shift;
my $discuss = shift;
my $nocheck = shift;
$self->die("䏿¯æçæ°æ®ç±»å") if ref $discuss ne "Mojo::Webqq::Discuss";
if(@{$self->discuss} == 0){
push @{$self->discuss},$discuss;
return $self;
}
if($nocheck){
push @{$self->discuss},$discuss;
return $self;
}
my $d = $self->search_discuss(id => $discuss->id);
if(defined $d){
%$d = %$discuss;
}
else{#new discuss
push @{$self->discuss},$discuss;
}
return $self;
}
sub remove_discuss {
my $self = shift;
my $discuss = shift;
$self->die("䏿¯æçæ°æ®ç±»å") if ref $discuss ne "Mojo::Webqq::Discuss";
for(my $i=0;@{$self->discuss};$i++){
if($discuss->id eq $self->discuss->[$i]->id){
splice @{$self->discuss},$i,1;
return 1;
}
}
return 0;
}
sub add_discuss_member {}
sub update_discuss_member{
my $self = shift;
my $discuss = shift;
$self->die("䏿¯æçæ°æ®ç±»å") if ref $discuss ne "Mojo::Webqq::Discuss";
$self->info("æ´æ°è®¨è®ºç»[ ". $discuss->name . " ]æåä¿¡æ¯");
my %p = @_;
$p{is_blocking} = 1 if not defined $p{is_blocking};
my $handle = sub{
my $discuss_info = shift;
if(defined $discuss_info){
if(ref $discuss_info->{member} eq 'ARRAY'){
$discuss->update($discuss_info);
}
else{$self->debug("æ´æ°è®¨è®ºç»[ " . $discuss->name . " ]æåä¿¡æ¯æ æ")}
}
else{$self->warn("æ´æ°è®¨è®ºç»[ " . $discuss->name . " ]æåä¿¡æ¯å¤±è´¥")}
};
if($p{is_blocking}){
my $discuss_info = $self->_get_discuss_info($discuss->id);
$handle->($discuss_info);
}
else{
$self->_get_discuss_info($discuss->id,$handle);
}
}
sub update_discuss {
my $self = shift;
if(ref $_[0] eq "Mojo::Webqq::Discuss"){
my $discuss = shift;
my %p = @_;
$self->info("æ´æ°è®¨è®ºç»[ ". $discuss->name . " ]ä¿¡æ¯");
$p{is_blocking} = 1 if not defined $p{is_blocking};
my $handle = sub{
my $discuss_info = shift;
if(defined $discuss_info){
if(ref $discuss_info->{member} eq 'ARRAY'){
$discuss->update($discuss_info);
}
else{$self->debug("æ´æ°è®¨è®ºç»[ " . $discuss->name . " ]æåä¿¡æ¯æ æ")}
}
else{$self->warn("æ´æ°è®¨è®ºç»[ " . $discuss->name . " ]æåä¿¡æ¯å¤±è´¥")}
};
if($p{is_blocking}){
my $discuss_info = $self->_get_discuss_info($discuss->id);
$handle->($discuss_info);
}
else{
$self->_get_discuss_info($discuss->id,$handle);
}
return $self;
}
my %p = @_;
$p{is_blocking} = 1 if not defined $p{is_blocking} ;
$p{is_update_discuss_member} = 1 if not defined $p{is_update_discuss_member} ;
$self->info("æ´æ°è®¨è®ºç»å表信æ¯...");
my $handle = sub{
my @discusss;
my $discuss_list = shift;
unless(defined $discuss_list){
$self->warn("æ´æ°è®¨è®ºå表信æ¯å¤±è´¥\n");
$self->emit("model_update","discuss",0);
return $self;
}
for my $d (@{$discuss_list}){
push @discusss, Mojo::Webqq::Discuss->new($d);
}
if(ref $self->discuss eq "ARRAY" and @{$self->discuss} == 0){
$self->discuss(\@discusss);
}
else{
my($new_discusss,$lost_discusss,$sames) = $self->array_diff($self->discuss,\@discusss,sub{$_[0]->did});
for(@{$new_discusss}){
$self->add_discuss($_);
$self->emit(new_discuss=>$_) ;
}
for(@{$lost_discusss}){
$self->remove_discuss($_);
$self->emit(lose_discuss=>$_) ;
}
for(@{$sames}){
my($old_discuss,$new_discuss) = ($_->[0],$_->[1]);
$old_discuss->update($new_discuss);
}
}
$self->emit("model_update","discuss",1);
( run in 0.609 second using v1.01-cache-2.11-cpan-0bb4e1dffa6 )