File Coverage

blib/lib/Weixin/Client/Operate.pm
Criterion Covered Total %
statement 30 132 22.7
branch 0 50 0.0
condition 0 4 0.0
subroutine 10 30 33.3
pod 0 17 0.0
total 40 233 17.1


line stmt bran cond sub pod time code
1             package Weixin::Client::Operate;
2 1     1   329 use AE;
  1         45  
  1         19  
3 1     1   3 use POSIX;
  1         1  
  1         7  
4              
5 1     1   1881 use Weixin::Client::Cache;
  1         1  
  1         22  
6 1     1   350 use Weixin::Message::Queue;
  1         1  
  1         22  
7              
8 1     1   3 use Weixin::Util;
  1         2  
  1         57  
9 1     1   249 use Weixin::Client::Private::_login;
  1         3  
  1         38  
10 1     1   698 use Weixin::Client::Private::_init;
  1         2  
  1         20  
11 1     1   243 use Weixin::Client::Private::_logout;
  1         2  
  1         17  
12 1     1   450 use Weixin::Client::Private::_sync;
  1         2  
  1         19  
13 1     1   437 use Weixin::Client::Private::_synccheck;
  1         2  
  1         745  
14              
15             our $CLIENT_COUNT = 0;
16             sub login{
17 0     0 0   my $self = shift;
18 0 0         if($self->_login()){
19 0           console "获取基础信息...\n";
20 0           $self->_init();
21 0           $self->update_friend();
22              
23 0           $self->welcome();
24 0 0         if(ref $self->{on_login} eq 'CODE'){
25 0           eval{
26 0           $self->{on_login}->();
27             };
28 0 0         console $@ . "\n" if $@;
29             }
30 0           return 1;
31             }
32             else{
33 0           exit;
34             }
35             }
36             sub logout{
37 0     0 0   my $self = shift;
38 0   0       my $type = shift || 0;
39 0           console "客户端注销...";
40 0           $self->_logout($type);
41             }
42 0     0 0   sub sync{
43              
44             }
45 0     0 0   sub synccheck{
46              
47             }
48             sub run{
49 0     0 0   my $self = shift;
50 0           $self->ready();
51 0 0         if(ref $self->{on_run} eq 'CODE'){
52 0           eval{
53 0           $self->{on_run}->();
54             };
55 0 0         console "$@\n" if $@;
56             }
57 0           console "客户端运行中...\n";
58 0           $self->{cv} = AE::cv;
59 0           $self->{cv}->recv
60             }
61             sub RUN{
62 0     0 0   console "启动全局事件循环...\n";
63 0           AE::cv->recv;
64             }
65             sub ready{
66 0     0 0   my $self = shift;
67 0           console "开始接收消息\n";
68 0           $self->_synccheck();
69              
70 0 0         if(ref $self->{on_ready} eq 'CODE'){
71 0           eval{
72 0           $self->{on_ready}->();
73             };
74 0 0         console "$@\n" if $@;
75             }
76 0           $CLIENT_COUNT++;
77             }
78             sub stop{
79 0     0 0   my $self = shift;
80 0           $self->{is_stop} = 1;
81 0 0         if($CLIENT_COUNT > 1){
82 0           $CLIENT_COUNT--;
83             $self->{watchers}{rand()} = AE::timer 600,0,sub{
84 0     0     undef %$self;
85 0           };
86             }
87             else{
88 0           exit;
89             }
90             }
91             sub prepare {
92 0     0 0   my $self = shift;
93             $self->{_receive_message_queue}->get(sub{
94 0     0     my $msg = shift;
95 0 0         return if $self->{is_stop};
96 0 0         if(ref $self->{on_receive_msg} eq 'CODE'){
97 0           eval{
98 0           $self->{on_receive_msg}->($msg);
99             };
100 0 0         console $@ . "\n" if $@;
101             }
102 0           });
103             $self->{_send_message_queue}->get(sub{
104 0     0     my $msg = shift;
105 0 0         return if $self->{is_stop};
106 0 0         if($msg->{TTL} <= 0){
107 0           my $status = {is_success=>0,status=>"TTL过期"};
108 0 0         if(ref $msg->{cb} eq 'CODE'){
109 0           $msg->{cb}->(
110             $msg,
111             $status->{is_success},
112             $status->{status},
113             );
114             }
115 0 0         if(ref $self->{on_send_msg} eq 'CODE'){
116 0           $self->{on_send_msg}->(
117             $msg,
118             $status->{is_success},
119             $status->{status},
120             );
121             }
122            
123 0           return;
124             }
125 0           $msg->{TTL}--;
126 0 0         $msg->{MsgType} eq "text" ? $self->_send_text_msg($msg)
127             : undef
128             ;
129 0           });
130 0           eval{
131 0           my $tmpdir = $self->{tmpdir};
132 0           unlink <$tmpdir/weixin_qrcode_*.jpg>;
133             };
134             }
135             sub welcome{
136 0     0 0   my $self = shift;
137 0           my $w = $self->user;
138 0           console "欢迎回来, $w->{NickName}\n";#($w->{Province} $w->{City})\n";
139 0 0         console "个性签名: " . ($w->{Signature}?$w->{Signature}:"(无)") . "\n"
140             }
141             sub user {
142 0     0 0   my $self = shift;
143 0           return $self->{_data}{user};
144             }
145              
146             sub sync_key {
147 0     0 0   my $self = shift;
148 0 0         if(defined $_[0]){
149 0           $self->{_token}{sync_key} = $_[0];
150             }
151             else{
152 0           return $self->{_token}{sync_key};
153             }
154             }
155              
156             sub skey {
157 0     0 0   my $self = shift;
158 0 0         if(defined $_[0]){
159 0           $self->{_token}{skey} = $_[0];
160             }
161             else{
162 0           return $self->{_token}{skey};
163             }
164             }
165             sub wxsid {
166 0     0 0   my $self = shift;
167 0 0         if(defined $_[0]){
168 0           $self->{_token}{wxsid} = $_[0];
169             }
170             else{
171 0 0         $self->{_token}{wxsid} = $self->search_cookie("wxsid") unless defined $self->{_token}{wxsid};
172 0           return $self->{_token}{wxsid};
173             }
174             }
175             sub wxuin{
176 0     0 0   my $self = shift;
177 0 0         if(defined $_[0]){
178 0           $self->{_token}{wxuin} = $_[0];
179             }
180             else{
181 0 0         $self->{_token}{wxuin} = $self->search_cookie("wxuin") unless defined $self->{_token}{wxuin};
182 0           return $self->{_token}{wxuin};
183             }
184             }
185             sub pass_ticket {
186 0     0 0   my $self = shift;
187 0 0         if(defined $_[0]){
188 0           $self->{_token}{pass_ticket} = $_[0];
189             }
190             else{
191 0   0       return $self->{_token}{pass_ticket} || "undefined";
192             }
193             }
194             sub deviceid {
195 0     0 0   my $self = shift;
196 0 0         return $self->{_token}{deviceid} if defined $self->{_token}{deviceid};
197 0           my $a = "e";
198 0           for(my $b = 0;15 > $b;$b++){
199 0           $a .= POSIX::floor(10 * rand());
200             }
201 0           $self->{_token}{deviceid} = $a;
202 0           return $a;
203             }
204              
205             1;