Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- ## [perl]
- #!/usr/bin/perl
- use strict;
- use warnings;
- package robot;
- use IO::Socket;
- sub new {
- my $self = shift;
- my %data = ();
- return bless (\%data, $self);
- }
- sub read_rc {
- my ($self, $path) = @_;
- print "Reading $path...\n\n";
- open my $rc_file, '<', $path or die "Cannot open $path: $!\n";
- while (my $line = <$rc_file>) {
- if (my ($key, $value) = ($line =~ /\s*(\w+)\s*=\s*"([^"]*)"/)) {
- $self->{rc}->{$key} = $value;
- printf ("%-8s = %s\n", $key, $self->{rc}->{$key});
- }
- }
- close $rc_file;
- print "\n\n";
- return $self->{rc};
- }
- sub connect {
- my $self = shift;
- $self->{socket} = IO::Socket::INET->new(
- PeerAddr => $self->{rc}->{host},
- PeerPort => $self->{rc}->{port},
- proto => getprotobyname('tcp')
- ) or die "Cannot connect to $self->{rc}->{host}:$self->{rc}->{port}: $!\n";
- if ($self->{rc}->{password}) {
- $self->pass($self->{rc}->{nickname}, $self->{rc}->{password});
- }
- $self->nick($self->{rc}->{nickname});
- $self->ident($self->{rc}->{uname}, $self->{rc}->{ident});
- if ($self->{rc}->{channels}) {
- my @channels = split /\s*,\s*/, $self->{rc}->{channels};
- foreach my $channel (@channels) {
- $self->join($channel);
- }
- }
- return $self->{socket};
- }
- sub read {
- my $self = shift;
- my $socket = $self->{socket};
- return <$socket>;
- }
- sub send {
- my ($self, $message) = @_;
- my $socket = $self->{socket};
- $message .= "\n";
- if ($self->{rc}->{verbose}) {
- print ">> $message";
- }
- print $socket $message;
- }
- sub nick {
- my ($self, $nickname) = @_;
- $self->send("NICK $nickname");
- }
- sub pass {
- my ($self, $nickname, $password) = @_;
- $self->send("PASS $nickname:$password");
- }
- sub ident {
- my ($self, $uname, $ident) = @_;
- $self->send("USER $uname * * :$ident");
- }
- sub notice {
- my ($self, $nickname, $notice) = @_;
- $self->send("NOTICE $nickname $notice");
- }
- sub privmsg {
- my ($self, $recipient, $message) = @_;
- $self->send("PRIVMSG $recipient $message");
- }
- sub join {
- my ($self, $channel) = @_;
- $self->send("JOIN $channel");
- }
- sub who {
- my ($self, $target) = @_;
- $self->send("WHO $target");
- }
- sub pong {
- my ($self, $host) = @_;
- $self->send("PONG $host");
- }
- sub parse {
- my ($self, $data) = @_;
- my %message = ();
- my $pattern_message = qr/^:?\s*([^:]+)\s+:(.+)\s*$/;
- my $pattern_header = qr/^([^\s]+)\s+([^\s]+)\s+([^\s]+)$/;
- if (my ($header, $body) = ($data =~ $pattern_message)) {
- print "[$header]\n$body\n\n"; # DEBUG
- if (my ($from, $type, $target) = ($header =~ $pattern_header)) {
- $message{from} = $from;
- $message{type} = $type;
- $message{target} = $target;
- }
- else {
- $message{type} = $header;
- }
- $message{body} = $body;
- }
- return %message;
- }
- sub if_owner_command {
- my ($self, %message) = @_;
- if (my ($command) = ($message{body} =~ /^@(.+)\s*$/)) {
- # if ($message{from} =~ /^$self->{rc}->{owner}/) {
- # return 1;
- # }
- }
- else {
- return 0;
- }
- }
- sub if_user_command {
- my ($self, %message) = @_;
- if (my ($command) = ($message{body} =~ /^\.(.+)\s*$/)) {
- return 1;
- }
- else {
- return 0;
- }
- }
- package user_command;
- sub new {
- my ($self, %message) = @_;
- return bless (\%message, $self);
- }
- 1;
Add Comment
Please, Sign In to add comment