📄 textconsole.pm
字号:
} } else { $self->prompt; } } else { $self->{MsgBuffer} .= $kbinp; } if (length($self->{MsgBuffer}) > $MaxMsgSize) { $self->warn("Msg buffer size > $MaxMsgSize bytes\n"); }}sub idle_time { my ($self) = @_; time - $self->{LastKbInput};}# Keyboard command help message sub help { pop->info('-'x32, ' Help Message ', '-'x32, "\n", $HELP);}sub set_attribute { my ($self, $attr, $val) = @_; my $oicq = $self->{OICQ}; if (defined($attr)) { if (exists $AttrFilter{$attr}) { if (defined $val) { my $newval = $AttrFilter{$attr}->($val); if (defined $newval) { $oicq->{$attr} = $newval; } else { $self->error("Invalid value for $attr: $val\n"); } } else { $self->warn("$attr = $oicq->{$attr}\n"); } } else { $self->error("Cannot change $attr\n"); } } else { $self->warn("These attributes can be changed:\n", join(', ', keys(%AttrFilter)), "\n"); } $self->prompt; return;}sub prompt { my ($self) = @_; my $oicq = $self->{OICQ}; my $bufsize = length($self->{MsgBuffer}); my $myid = $oicq->{Id}; my $mynick = $oicq->get_nickname($myid); my $dstid = $self->{DstId}; my $dstnick = $dstid ? $oicq->get_nickname($dstid) : ""; my $time = time - $oicq->{LastSvrAck}; my $c = $time > 60 ? '?' : '%'; $self->info(sprintf("%s %-8s %8s => %-8s %8s %12d bytes in buffer %2d\"\n", $c, $mynick, $myid, $dstnick, $dstid, $bufsize, $time));}sub find_friend_id { my ($self, $index) = @_; my $info = $self->{OICQ}->{Info}; my $count = 0; foreach my $id (sort {$a <=> $b} keys %$info) { next unless defined $info->{$id}->{Friend}; $count++; if ($count == $index) { return $id; } } $self->error("Invalid friend index $index ignored.\n"); return undef;}sub set_dstid { my ($self, $dstid) = @_; if ($dstid =~ /^\d+$/) { if ($dstid <= 1000) { # Assume user gives index, ranther than qq id my $real_dstid = $self->find_friend_id($dstid); defined $real_dstid and $self->{DstId} = $real_dstid; } else { $self->{DstId} = $dstid; } } else { $self->error("Invalid destination id '$dstid' ignored.\n"); }}sub toggle_autoreply { my ($self) = @_; my $oicq = $self->{OICQ}; $self->warn("Auto-reply ", $oicq->toggle_autoreply, "\n"); $self->prompt;}sub remove_saved_ids { my $self = shift; my $oicq = $self->{OICQ}; foreach my $id (@_) { unless ($id =~ /^\d+$/) { $self->error("Invalid ID $id ignored\n"); next; } $oicq->remove_saved_id($id) or $self->error("Failed to remove $id\n"); } $self->prompt;}sub list_saved_ids { my $self = shift; my $oicq = $self->{OICQ}; my $dir = "$oicq->{Dir}/$oicq->{Id}"; if (@_) { foreach my $id (@_) { system('cat', "$dir/$id.dat"); } } else { $self->info('-'x30, ' Stored User Info ', '-'x30,"\n"); foreach my $id ($oicq->get_saved_ids) { my $nick = $oicq->get_nickname($id); my $mtime = substr(localtime((stat("$dir/$id.dat"))[9]), 4, 16); $self->info(sprintf("$mtime %9s ", $id), $nick, "\n"); } $self->info('='x78, "\n"); } $self->prompt;}sub show_msg_buffer { my $self = shift; print "\n$self->{MsgBuffer}\n";}sub clear_msg_buffer { my $self = shift; $self->{MsgBuffer} = ""; $self->info("Message buffer deleted\n"); $self->prompt;}sub show_queue { my ($self, $limit) = @_; $limit = 20 if not defined $limit; my $oicq = $self->{OICQ}; my $hist = $oicq->{EventQueue}; $limit = @$hist if $limit > @$hist; print '-'x32, ' Packet Queue ', '-'x32, "\n"; for (my $i = 0; $i < $limit; $i++) { my $e = $hist->[$i]; print substr(localtime($e->{Time}), 11, 9), ' Seq 0x', unpack('H*', $e->seq), ' from 0x', unpack('H*', $e->src), " Cmd 0x", unpack('H*', $e->cmdcode), " ack\@", $e->{Ack} ? substr(localtime($e->{Ack}), 11, 9) : "", "\n"; } $self->prompt;}sub show_oicq { my ($self, $oicq) = @_; $self->info("{\n"); my $pre = " "; foreach my $attr (sort keys(%$oicq)) { next if $attr =~ /Passw/; my $val = $oicq->{$attr}; $val = unpack("H*", $val) if $val =~ /[\0-\x1f]/; $self->info($pre, "$attr = $val\n"); } $self->info("}\n");}sub show_object { my ($self) = @_; $self->info('-'x35, ' Object ', '-'x35,"\n"); foreach my $key (keys %$self) { $self->info("$key = "); my $val = $self->{$key}; if (ref($val) eq 'Net::OICQ') { $self->show_oicq($val); } elsif (ref($val) =~ /ARRAY/) { $self->info("[ ", join(', ', @$val), " ]\n"); } else { $self->info($val, "\n"); } } $self->prompt;}sub load_plugin { my ($self, $file, $id) = @_; my $oicq = $self->{OICQ}; if (defined $id) { if ($id =~ /^\d+$/) { defined $oicq->{Info}->{$id} or $oicq->{Info}->{$id} = {}; $oicq->{Info}->{$id}->{ChatBot} = $file; $self->info("Plugin $file will be used on $id\n"); } else { $self->error("Bad id $id\n"); } } else { $oicq->{ChatBot} = $file; $self->info("Plugin $file will be used on all ids\n"); }}sub get_online_friends { my ($self) = @_; $self->{OICQ}->get_online_friends;}sub get_friends_list { my ($self) = @_; $self->{OICQ}->get_friends_list;}sub show_strangers { my ($self) = @_; $self->info('-'x22, " Strangers ", '-'x22, "\n"); my $info = $self->{OICQ}->{Info}; my $idx = 1; foreach my $id (sort {$a <=> $b} keys %$info) { my $hashref = $info->{$id}; next if defined $hashref->{Friend}; $self->info(sprintf "%2d. %9d %3s %3s %4s : %-16s \n", $idx++, $id, defined($hashref->{Sex}) ? $hashref->{Sex} : '', defined($hashref->{Age}) ? $hashref->{Age} : '', defined($hashref->{Face}) ? $hashref->{Face} : '', defined($hashref->{Nickname}) ? $hashref->{Nickname} : ''); } $self->info('='x55, "\n");}sub set_mode { my ($self, $mode) = @_; unless (defined $mode) { $self->info("Please use i for invisible, a for away, n for normal.\n"); return; } my $code; if ($mode =~ /^i/i) { $self->{ConnectMode} = 'Invisible'; $code = '40' } elsif ($mode =~ /^a/i) { $self->{ConnectMode} = 'Away'; $code = '30' } elsif ($mode =~ /^n/i) { $self->{ConnectMode} = 'Normal'; $code = '10' } elsif ($mode =~ /^\d+/) { $code = $mode} # You can enter code directly else { $self->info("Unknown mode \"$mode\" ignored.\n"); return; } $self->info("Mode set to $code\n"); $self->{OICQ}->set_mode($code);}sub get_user_info { my ($self, $id) = @_; my $oicq = $self->{OICQ}; defined $id or $id = $oicq->{Id}; $self->valid_id($id) or return; if ($id < 1000) { my $fid = $self->find_friend_id($id); defined $fid or return; $oicq->get_user_info($fid); } else { $oicq->get_user_info($id); } $self->{show_user_info} = 1;}sub update_info { my $self = shift; unless (@_) { $self->info("You can change the following attributes of yourself:\n"); for(my $i = 1; $i < (@$InfoHeader -2); $i++) { $self->info(sprintf " %-19s", $InfoHeader->[$i]); $self->info("\n") if $i%4 == 0; } $self->info("\n"); $self->prompt; return; } push @_, "" if @_ % 2; my %hash = @_; foreach my $attr (keys %hash) { # Allow updating unknown attributes #if ($attr =~ /^unkn/i) { # print "Invalid attribute $attr ignored\n"; # delete $hash{$attr}; # next; #} my $val = $hash{$attr}; $val =~ s/\\s/ /g; $val =~ s/\\n/\n/g; $hash{uc($attr)} = $val; printf "%-19s : %s\n", $attr, $val; } $self->{OICQ}->update_info(\%hash); return 1;}sub set_passwd { my ($self) = @_; my $newpw = $self->ask_passwd; if ($newpw) { $self->{OICQ}->set_passwd($newpw); return 1; } return 0; }sub valid_id { my ($self, $id) = @_; if ($id =~ /^\d+$/) { return 1; } else { $self->error("Invalid id: $id\n"); return 0; }}sub search_users { my ($self, $arg) = @_; my $oicq = $self->{OICQ}; unless (defined $arg) { $oicq->list_online_users(1); return; } if ($arg =~ /\D/) { $oicq->search_user($arg); } elsif ($arg == 0) { $oicq->{SearchCount} = 0; } elsif ($arg > 100) { $oicq->search_user($arg); } else { $oicq->list_online_users($arg); }}sub accept_contact { my ($self, $id) = @_; $self->valid_id($id) or return; $self->{OICQ}->accept_contact($id);} sub reject_contact { my ($self, $id) = @_; $self->valid_id($id) or return; $self->{OICQ}->reject_contact($id);}sub add_contact { my ($self, $id) = @_; $self->valid_id($id) or return; $self->{OICQ}->add_contact($id);}sub del_contact { my ($self, $id) = @_; $self->valid_id($id) or return; $self->{OICQ}->del_contact($id);}sub forbid_contact { my ($self, $id) = @_; $self->valid_id($id) or return; $self->{OICQ}->forbid_contact($id);}1;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -