line |
stmt |
bran |
cond |
sub |
pod |
time |
code |
1
|
|
|
|
|
|
|
#$Id: adc.pm 594 2010-01-30 23:10:17Z pro $ $URL: svn://svn.setun.net/dcppp/trunk/lib/Net/DirectConnect/adc.pm $ |
2
|
|
|
|
|
|
|
#UNFINISHED |
3
|
|
|
|
|
|
|
package #hide from cpan |
4
|
|
|
|
|
|
|
Net::DirectConnect::nmdc; |
5
|
1
|
|
|
1
|
|
1131
|
use strict; |
|
1
|
|
|
|
|
2
|
|
|
1
|
|
|
|
|
34
|
|
6
|
1
|
|
|
1
|
|
4
|
no strict qw(refs); |
|
1
|
|
|
|
|
2
|
|
|
1
|
|
|
|
|
34
|
|
7
|
1
|
|
|
1
|
|
6
|
use warnings "NONFATAL" => "all"; |
|
1
|
|
|
|
|
1
|
|
|
1
|
|
|
|
|
47
|
|
8
|
1
|
|
|
1
|
|
4
|
no warnings qw(uninitialized); |
|
1
|
|
|
|
|
1
|
|
|
1
|
|
|
|
|
74
|
|
9
|
1
|
|
|
1
|
|
5
|
no if $] >= 5.017011, warnings => 'experimental::smartmatch'; |
|
1
|
|
|
|
|
2
|
|
|
1
|
|
|
|
|
9
|
|
10
|
1
|
|
|
1
|
|
46
|
use utf8; |
|
1
|
|
|
|
|
1
|
|
|
1
|
|
|
|
|
8
|
|
11
|
|
|
|
|
|
|
#use Time::HiRes qw(time sleep); |
12
|
1
|
|
|
1
|
|
20
|
use Data::Dumper; #dev only |
|
1
|
|
|
|
|
2
|
|
|
1
|
|
|
|
|
73
|
|
13
|
|
|
|
|
|
|
$Data::Dumper::Sortkeys = $Data::Dumper::Useqq = $Data::Dumper::Indent = 1; |
14
|
1
|
|
|
1
|
|
5
|
use Net::DirectConnect; |
|
1
|
|
|
|
|
2
|
|
|
1
|
|
|
|
|
51
|
|
15
|
|
|
|
|
|
|
#use Net::DirectConnect::clicli; |
16
|
|
|
|
|
|
|
#use Net::DirectConnect::http; |
17
|
|
|
|
|
|
|
#use Net::DirectConnect::httpcli; |
18
|
|
|
|
|
|
|
our $VERSION = ( split( ' ', '$Revision: 594 $' ) )[1]; |
19
|
1
|
|
|
1
|
|
5
|
use base 'Net::DirectConnect'; |
|
1
|
|
|
|
|
2
|
|
|
1
|
|
|
|
|
1368
|
|
20
|
|
|
|
|
|
|
|
21
|
|
|
|
|
|
|
sub init { |
22
|
0
|
|
|
0
|
0
|
|
my $self = shift; |
23
|
|
|
|
|
|
|
#shift if $_[0] eq __PACKAGE__; |
24
|
|
|
|
|
|
|
#print "nmdcinit SELF=", $self, "REF=", ref $self, " P=", @_, "package=", __PACKAGE__, "\n\n"; |
25
|
|
|
|
|
|
|
#$self->SUPER::new(); |
26
|
|
|
|
|
|
|
#%$self = ( |
27
|
|
|
|
|
|
|
#%$self, |
28
|
0
|
|
|
|
|
|
local %_ = ( |
29
|
|
|
|
|
|
|
'Nick' => 'NetDCBot', |
30
|
|
|
|
|
|
|
'port' => 411, |
31
|
|
|
|
|
|
|
'host' => 'localhost', |
32
|
|
|
|
|
|
|
'protocol' => 'nmdc', |
33
|
|
|
|
|
|
|
'nmdc' => 1, |
34
|
|
|
|
|
|
|
#'Pass' => '', |
35
|
|
|
|
|
|
|
#'key' => 'zzz', |
36
|
|
|
|
|
|
|
#'auto_wait' => 1, |
37
|
|
|
|
|
|
|
#'search_every' => 10, 'search_every_min' => 10, 'auto_connect' => 1, |
38
|
|
|
|
|
|
|
#ADC |
39
|
|
|
|
|
|
|
#'connect_protocol' => 'ADC/0.10', 'message_type' => 'H', |
40
|
|
|
|
|
|
|
#@_, |
41
|
|
|
|
|
|
|
'incomingclass' => 'Net::DirectConnect::clicli', |
42
|
|
|
|
|
|
|
#'incomingclass' => __PACKAGE__, #'Net::DirectConnect::adc', |
43
|
|
|
|
|
|
|
#no_print => { 'INF' => 1, 'QUI' => 1, 'SCH' => 1, }, |
44
|
|
|
|
|
|
|
#http://www.dcpp.net/wiki/index.php/%24MyINFO |
45
|
|
|
|
|
|
|
'description' => 'perl ' . __PACKAGE__ . ' bot', |
46
|
|
|
|
|
|
|
#====MOVE TO NMDC |
47
|
|
|
|
|
|
|
'connection' => 'LAN(T3)', |
48
|
|
|
|
|
|
|
#NMDC1: 28.8Kbps, 33.6Kbps, 56Kbps, Satellite, ISDN, DSL, Cable, LAN(T1), LAN(T3) |
49
|
|
|
|
|
|
|
#NMDC2: Modem, DSL, Cable, Satellite, LAN(T1), LAN(T3) |
50
|
|
|
|
|
|
|
'flag' => '1', # User status as ascii char (byte) |
51
|
|
|
|
|
|
|
#1 normal |
52
|
|
|
|
|
|
|
#2, 3 away |
53
|
|
|
|
|
|
|
#4, 5 server The server icon is used when the client has |
54
|
|
|
|
|
|
|
#6, 7 server away uptime > 2 hours, > 2 GB shared, upload > 200 MB. |
55
|
|
|
|
|
|
|
#8, 9 fireball The fireball icon is used when the client |
56
|
|
|
|
|
|
|
#10, 11 fireball away has had an upload > 100 kB/s. |
57
|
|
|
|
|
|
|
'email' => 'billgates@microsoft.com', 'sharesize' => 10 * 1024 * 1024 * 1024 + int rand( 1024 * 1024 ), #10GB |
58
|
|
|
|
|
|
|
'client' => 'perl', #'dcp++', #++: indicates the client |
59
|
|
|
|
|
|
|
#'protocol' => 'nmdc', # or 'adc' |
60
|
|
|
|
|
|
|
'V' => $Net::DirectConnect::VERSION, #. '_' . ( split( ' ', '$Revision: 656 $' ) )[1], #V: tells you the version number |
61
|
|
|
|
|
|
|
#'M' => 'A', #M: tells if the user is in active (A), passive (P), or SOCKS5 (5) mode |
62
|
|
|
|
|
|
|
'H' => '0/1/0' |
63
|
|
|
|
|
|
|
, #H: tells how many hubs the user is on and what is his status on the hubs. The first number means a normal user, second means VIP/registered hubs and the last one operator hubs (separated by the forward slash ['/']). |
64
|
|
|
|
|
|
|
'S' => '3', #S: tells the number of slots user has opened |
65
|
|
|
|
|
|
|
'O' => undef, #O: shows the value of the "Automatically open slot if speed is below xx KiB/s" setting, if non-zero |
66
|
|
|
|
|
|
|
'lock' => 'EXTENDEDPROTOCOLABCABCABCABCABCABC Pk=DCPLUSPLUS0.668ABCABC', |
67
|
|
|
|
|
|
|
'cmd_bef' => '$', |
68
|
|
|
|
|
|
|
'cmd_aft' => '|', |
69
|
|
|
|
|
|
|
'auto_say_cmd' => [qw(welcome chatline To)], |
70
|
|
|
|
|
|
|
); |
71
|
|
|
|
|
|
|
#$self->{$_} ||= $_{$_} for keys %_; |
72
|
|
|
|
|
|
|
#$self->log('dev', 's0',$self->{'sharesize'}); |
73
|
0
|
0
|
0
|
|
|
|
!exists $self->{$_} ? $self->{$_} ||= $_{$_} : () for keys %_; |
74
|
|
|
|
|
|
|
#$self->log('dev', 's1',$self->{'sharesize'}); |
75
|
0
|
|
|
|
|
|
%_ = ( |
76
|
|
|
|
|
|
|
#charset_chat => 'cp1251', |
77
|
|
|
|
|
|
|
#charset_nick => 'cp1251', |
78
|
|
|
|
|
|
|
charset_protocol => 'cp1251', |
79
|
|
|
|
|
|
|
); |
80
|
0
|
|
|
|
|
|
$self->{$_} = $_{$_} for keys %_; |
81
|
|
|
|
|
|
|
#$self->log('dev', 'chPROTO:',$self->{'charset_protocol'}); |
82
|
|
|
|
|
|
|
#print 'adc init now=',Dumper $self; |
83
|
|
|
|
|
|
|
#$self->{'periodic'}{ __FILE__ . __LINE__ } = sub { my $self = shift if ref $_[0]; $self->cmd( 'search_buffer', ) if $self->{'socket'}; }; |
84
|
|
|
|
|
|
|
#http://www.dcpp.net/wiki/index.php/LockToKey : |
85
|
|
|
|
|
|
|
$self->{'lock2key'} ||= sub { |
86
|
0
|
0
|
|
0
|
|
|
my $self = shift if ref $_[0]; |
87
|
|
|
|
|
|
|
#return $self->{lock}; |
88
|
0
|
|
|
|
|
|
my ($lock) = @_; |
89
|
|
|
|
|
|
|
#$self->{'log'}->( 'dev', 'making lock from', $lock ); |
90
|
0
|
0
|
|
|
|
|
$lock = Encode::encode $self->{charset_protocol}, $lock, Encode::FB_WARN if $self->{charset_protocol}; |
91
|
|
|
|
|
|
|
#$self->{'log'}->( 'dev', 'making lock from2:', $lock ); |
92
|
0
|
|
|
|
|
|
my @lock = split( //, $lock ); |
93
|
0
|
|
|
|
|
|
my $i; |
94
|
0
|
|
|
|
|
|
my @key = (); |
95
|
0
|
|
|
|
|
|
foreach (@lock) { $_ = ord; } |
|
0
|
|
|
|
|
|
|
96
|
0
|
|
|
|
|
|
push( @key, $lock[0] ^ 5 ); |
97
|
0
|
|
|
|
|
|
for ( $i = 1 ; $i < @lock ; $i++ ) { push( @key, ( $lock[$i] ^ $lock[ $i - 1 ] ) ); } |
|
0
|
|
|
|
|
|
|
98
|
0
|
|
|
|
|
|
for ( $i = 0 ; $i < @key ; $i++ ) { $key[$i] = ( ( ( $key[$i] << 4 ) & 240 ) | ( ( $key[$i] >> 4 ) & 15 ) ) & 0xff; } |
|
0
|
|
|
|
|
|
|
99
|
0
|
|
|
|
|
|
$key[0] = $key[0] ^ $key[ @key - 1 ]; |
100
|
|
|
|
|
|
|
|
101
|
0
|
|
|
|
|
|
foreach (@key) { |
102
|
0
|
0
|
0
|
|
|
|
if ( $_ == 0 || $_ == 5 || $_ == 36 || $_ == 96 || $_ == 124 || $_ == 126 ) { $_ = sprintf( '/%%DCN%03i%%/', $_ ); } |
|
0
|
|
0
|
|
|
|
|
|
|
|
0
|
|
|
|
|
|
|
|
0
|
|
|
|
|
|
|
|
0
|
|
|
|
|
103
|
0
|
|
|
|
|
|
else { $_ = chr; } |
104
|
|
|
|
|
|
|
} |
105
|
0
|
|
|
|
|
|
local $_ = join( '', @key ); |
106
|
0
|
0
|
|
|
|
|
$_ = Encode::decode $self->{charset_protocol}, $_ if $self->{charset_protocol}; |
107
|
0
|
|
|
|
|
|
return $_; |
108
|
0
|
|
0
|
|
|
|
}; |
109
|
|
|
|
|
|
|
$self->{'tag'} ||= sub { |
110
|
0
|
|
|
0
|
|
|
my $self = shift; |
111
|
0
|
|
|
|
|
|
$self->{'client'} . ' ' . join( ',', map $_ . ':' . $self->{$_}, grep defined( $self->{$_} ), qw(V M H S O) ); |
112
|
0
|
|
0
|
|
|
|
}; |
113
|
|
|
|
|
|
|
$self->{'myinfo'} ||= sub { |
114
|
0
|
|
|
0
|
|
|
my $self = shift; |
115
|
|
|
|
|
|
|
return |
116
|
0
|
0
|
|
|
|
|
$self->{'Nick'} . ' ' |
117
|
|
|
|
|
|
|
. $self->{'description'} . '<' |
118
|
|
|
|
|
|
|
. $self->tag() . '>' . '$' . ' ' . '$' |
119
|
|
|
|
|
|
|
. $self->{'connection'} |
120
|
|
|
|
|
|
|
. ( length( $self->{'flag'} ) ? chr( $self->{'flag'} ) : '' ) . '$' |
121
|
|
|
|
|
|
|
. $self->{'email'} . '$' |
122
|
|
|
|
|
|
|
. $self->{'sharesize'} . '$'; |
123
|
0
|
|
0
|
|
|
|
}; |
124
|
|
|
|
|
|
|
$self->{'supports'} ||= sub { |
125
|
0
|
|
|
0
|
|
|
my $self = shift; |
126
|
0
|
|
|
|
|
|
return join ' ', grep $self->{$_}, @{ $self->{'supports_avail'} }; |
|
0
|
|
|
|
|
|
|
127
|
0
|
|
0
|
|
|
|
}; |
128
|
|
|
|
|
|
|
$self->{'supports_parse'} ||= sub { |
129
|
0
|
|
|
0
|
|
|
my $self = shift; |
130
|
0
|
|
|
|
|
|
my ( $str, $save ) = @_; |
131
|
0
|
|
|
|
|
|
$save->{$_} = 1 for split /\s+/, $str; |
132
|
0
|
|
|
|
|
|
delete $save->{$_} for grep !length $save->{$_}, keys %$save; |
133
|
0
|
0
|
|
|
|
|
return wantarray ? %$save : $save; |
134
|
0
|
|
0
|
|
|
|
}; |
135
|
|
|
|
|
|
|
$self->{'info_parse'} ||= sub { |
136
|
0
|
|
|
0
|
|
|
my $self = shift; |
137
|
0
|
|
|
|
|
|
my ( $info, $save ) = @_; |
138
|
0
|
|
|
|
|
|
$save->{'info'} = $info; |
139
|
0
|
0
|
|
|
|
|
$save->{'description'} = $1 if $info =~ s/^([^<\$]+)(<|\$)/$2/; |
140
|
0
|
|
|
|
|
|
( $save->{'tag'}, $save->{'M'}, $save->{'connection'}, $save->{'email'}, $save->{'sharesize'} ) = split /\s*\$\s*/, $info; |
141
|
0
|
0
|
|
|
|
|
$save->{'flag'} = ord($1) if $save->{'connection'} =~ s/([\x00-\x1F])$//e; |
142
|
0
|
|
|
|
|
|
$self->tag_parse( $save->{'tag'}, $save ); |
143
|
0
|
|
|
|
|
|
delete $save->{$_} for grep !length $save->{$_}, keys %$save; |
144
|
0
|
0
|
|
|
|
|
return wantarray ? %$save : $save; |
145
|
0
|
|
0
|
|
|
|
}; |
146
|
|
|
|
|
|
|
$self->{'tag_parse'} ||= sub { |
147
|
0
|
|
|
0
|
|
|
my $self = shift; |
148
|
0
|
|
|
|
|
|
my ( $tag, $save ) = @_; |
149
|
0
|
|
|
|
|
|
$save->{'tag'} = $tag; |
150
|
0
|
|
|
|
|
|
$tag =~ s/(^\s*<\s*)|(\s*>\s*$)//g; |
151
|
0
|
0
|
|
|
|
|
$save->{'client'} = $1 if $tag =~ s/^(\S+)\s*//; |
152
|
0
|
|
|
|
|
|
/(.+):(.+)/, $save->{$1} = $2 for split /,/, $tag; |
153
|
0
|
0
|
|
|
|
|
return wantarray ? %$save : $save; |
154
|
0
|
|
0
|
|
|
|
}; |
155
|
|
|
|
|
|
|
$self->{'make_hub'} ||= sub { |
156
|
0
|
0
|
|
0
|
|
|
my $self = shift if ref $_[0]; |
157
|
0
|
|
0
|
|
|
|
$self->{'hub_name'} ||= |
158
|
|
|
|
|
|
|
$self->{'host'}; # . ( ( $self->{'port'} and $self->{'port'} != 411 ) ? ':' . $self->{'port'} : '' ); |
159
|
0
|
|
|
|
|
|
$self->{'hub_name'} =~ s/:411$//; |
160
|
|
|
|
|
|
|
#$self->log('dev', $self->{'hub_name'}); |
161
|
0
|
|
0
|
|
|
|
},; |
162
|
|
|
|
|
|
|
} |
163
|
|
|
|
|
|
|
1; |