📄 serverevent.pm
字号:
sub check_autoreply { my ($self, $oicq, $dstid, $mesg) = @_; my $ui = $oicq->{UI}; if (defined $ui) { $ui->beep; my $idletime = $ui->idle_time; if ($oicq->{AutoAwayTime} && $idletime > $oicq->{AutoAwayTime}) { $oicq->{Away} = $idletime; } } $oicq->{Away} or return 0; my $autoreply = $oicq->{LastAutoReply}; if (defined($autoreply->{$dstid}) && time - $autoreply->{$dstid} < 300) { return 0; } my $me = $oicq->get_nickname($oicq->{Id}) || $oicq->{Id}; my $mm = $oicq->get_nickname($dstid) || $dstid; my $msg = "对不起$mm, $me不在.你的话已记下来了:\n".substr($mesg, 0, 100); $oicq->send_msg($dstid, $msg); $autoreply->{$dstid} = time; if (defined $ui) { $ui->msg($oicq->{Id}, $dstid, time, "Auto-reply:\n$msg\n"); } return 1;}sub get_online_friends { my ($self) = @_; my $plain = $self->{Data}; my $oicq = $self->{OICQ}; $oicq->desect($plain, ['H*', 'S_FLIST', 0, 1]); my @list = (); my $ui = $oicq->{UI}; my $info = $oicq->{Info}; for(my $i = 1; $i<length($plain); $i+=33) { $oicq->desect($plain, ['N', 'Id', $i, 4], ['H*', 'S_FLIST', $i+4, 1], ['H*', 'IP', $i+5, 4], ['n', 'Port', $i+9, 2], ['H*', 'S_FLIST', $i+11, 1], ['H*', 'Mode', $i+12, 1], ['H*', 'Key', $i+13]); my $fid = unpack('N', substr($plain, $i, 4)); my $addr = $self->show_address(substr($plain, $i+5, 6)); my $mode = ord(substr($plain, $i+12, 1)); my $key = substr($plain, $i+13, 20); defined $info->{$fid} or $info->{$fid} = {}; $info->{$fid}->{Key} = $key; $info->{$fid}->{Mode} = $mode; $info->{$fid}->{Addr} = $addr if $addr =~/[1-9]/; next unless defined $ui; push @list, [$fid, $addr, $mode]; } return unless defined $ui; $ui->show_online_friends(\@list); return;}sub recv_service_msg { my ($self) = @_; my $oicq = $self->{OICQ}; my ($code, $srcid, $myid, $mesg) = split(/$RS/, $self->{Data}); if (defined $oicq->{Socket}) { $oicq->ack_service_msg($code, $srcid, $self->seq); } my $ui = $oicq->{UI}; if ($code eq "02") { my $text = "$srcid asked for permission to contact you ($myid):\n$mesg"; $oicq->log_t($text); if (defined $ui) { $ui->beep; my $ok = $ui->ask("$text\nDo you accept this request? [y/n] "); defined $ok or return; if ($ok =~ /^y/i) { $oicq->accept_contact($srcid); $ui->warn("Accepted contact request from $srcid\n"); } elsif ($ok =~ /^n/i) { $oicq->reject_contact($srcid); $ui->warn("Rejected contact request from $srcid\n"); } else { $ui->warn("Ignored contact request from $srcid\n"); } } return; } return unless defined $ui; if ($code eq "03") { $ui->info("$srcid has accepted your contact request\n$mesg\n"); } elsif ($code eq "04") { $ui->info("$srcid has rejected your contact request\n$mesg\n"); } else { $ui->info("Code $code message from $srcid to $myid\n"); if ($srcid eq '10000') { $oicq->{Trash} = "Code $code from $srcid to $myid:\n$mesg\n"; } else { $ui->info("$mesg\n"); } } return;}sub search_users { my ($self) = @_; my $plain = $self->{Data}; my $oicq = $self->{OICQ}; my @list; foreach my $line (split(/$RS/, $plain)) { my @f = split(/$FS/, $line); next unless defined $f[3]; $f[3] = $oicq->get_face($f[3]); push @list, \@f; } my $ui = $oicq->{UI}; if (defined $ui) { $ui->show_search_result(\@list); } return 1;}sub keep_alive { my $self = shift; my $oicq = $self->{OICQ}; my $plain = $self->{Data}; $oicq->{UserCount} = (split($RS, $plain))[2]; if ($oicq->{Debug} > 1) { $self->default(@_); }}sub add_contact_1 { my ($self) = @_; my $plain = $self->{Data}; my $oicq = $self->{OICQ}; my ($id, $reply) = split(/$RS/, $plain); my $ui = $oicq->{UI}; unless (defined $ui) { $oicq->log_t("Server reply to add_contact request by $id: $reply\n"); return; } $ui->info("Server reply to add_contact request by $id: $reply\n"); if ($reply =~ /^\d+$/ && $reply > 0) { unless (defined $oicq->{ContactId}) { $ui->error("ContactId was not set\n"); return; } my $mmid = $oicq->{ContactId}; $ui->warn("$mmid requires authentication message\n"); my $msg = $ui->ask("$mmid requires authentication message\n" . "Enter authentication message: "); defined $msg or return 0; chomp $msg; $oicq->add_contact_2($msg); } 1;}sub add_contact_2 { my ($self) = @_; my $oicq = $self->{OICQ}; return unless defined $oicq->{UI}; my $plain = $self->{Data}; my $ui = $oicq->{UI}; defined $ui && $ui->info("Server responded to add_contact_2: $plain\n"); 1;}# get_friends_list provided by Chen Pengsub get_friends_list { my ($self) = @_; my $plain = $self->{Data}; my $oicq = $self->{OICQ}; my $flag = substr($plain, 0, 2); my $p = 2; my $len = length($plain); while ($p < $len) { my $fid = unpack('N', substr($plain, $p, 4)); $p += 4; # one 0x00 to seperate my $face = $oicq->get_face(ord(substr($plain, $p+1, 1))); $p += 2; my $age = ord(substr($plain, $p, 1)); $p += 1; my $sex = ord(substr($plain, $p, 1)); $p += 1; my $name_len = ord(substr($plain, $p, 1)); $p += 1; my $nickname = substr($plain, $p, $name_len); $p += $name_len; $oicq->{Info}->{$fid} = {} unless defined $oicq->{Info}->{$fid}; my $info = $oicq->{Info}->{$fid}; $info->{Sex} = $sex; $info->{Age} = $age; $info->{Face} = $face; $info->{Nickname} = $nickname; $info->{Friend} = 1; } if ($flag eq "\xff\xff") { my $ui = $oicq->{UI}; if (defined $ui) { $ui->show_friends_list(); } else { $oicq->log("get_friends_list ServerEvent not finished\n"); } } else { $oicq->get_friends_list($flag); } return 1;}sub show_address { my ($self, $data) = @_; my $ip = join('.', map(ord, split('', substr($data, 0, 4)))); my $port = unpack('n', substr($data, 4, 2)); return "$ip:$port";}sub recv_friend_status { my ($self) = @_; my $plain = $self->{Data}; my $oicq = $self->{OICQ}; my $srcid = unpack('N', substr($plain, 0, 4)); my $dstid = unpack('N', substr($plain, -4, 4)); my $status = unpack('H*', substr($plain, 13)); my $addr = $self->show_address(substr($plain, 5, 6)); my $mode = ord(substr($plain, 12, 1)); defined $oicq->{Info}->{$srcid} or $oicq->{Info}->{$srcid} = {}; my $info = $oicq->{Info}->{$srcid}; $info->{Addr} = $addr if $addr =~ /[1-9]/; $info->{Mode} = $mode; $info->{Key} = substr($plain, 13, 20); my $ui = $oicq->{UI}; if (defined $ui) { $ui->on_mode_change($srcid, $mode); } else { $oicq->log_t("$srcid changed mode to $mode"); } return 1 unless $oicq->{Debug}; $oicq->log("Data decrypted by recv_friend_status:\n", $oicq->hexdump($plain)); 1;}sub set_mode { default(@_) }sub update_info { default(@_) }sub del_contact { default(@_) }sub forbid_contact { default(@_) }sub ack_service_msg { default(@_) }sub unknown { default(@_) }sub reg_new_id_1 { return }sub reg_new_id_2 { return }1;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -