L3TDE-IRC/lib/L3TDE/Bot/IRC.pm

81 lines
1.5 KiB
Perl

package L3TDE::Bot::IRC;
use v5.34.1;
use strict;
use warnings;
use Moo;
use Future::AsyncAwait;
use IO::Socket::SSL;
use Crypt::URandom qw/urandom/;
with 'L3TDE::Bot::Role';
has [qw/password username hostname port/] => (
is => 'rw',
required => 1,
);
has socket => (
is => 'rw',
);
# Not lazy because we may do it more than once.
async sub _generate_socket {
my $self = shift;
my $username = $self->username;
my $hostname = $self->hostname;
my $password = $self->password;
my $port = $self->port;
my $random_nick = unpack('H*', urandom(10));
my $return = IO::Socket::SSL->new(
PeerHost => $hostname,
PeerPort => $port,
Proto => 'tcp',
Timeout => 5
) or die $!;
$self->socket($return);
$self->_send_message("USER $username 0 * :L3TDE Bot\r\n");
$self->_send_message("NICK ${username}_${random_nick}\r\n");
}
sub _send_message {
my $self = shift;
my $message = shift;
my $socket = $self->socket;
print $socket "$message\r\n";
}
async sub start {
my $self = shift;
while (1) {
eval {
await $self->_generate_socket;
#while(defined(my $line = $self->_read)) {
# # print $line;
# $self->username('aaaaaaah');
#}
};
if ($@) {
warn($@);
}
}
return;
}
sub _read {
my $self = shift;
$/ = "\r\n";
my $socket = $self->socket;
my $line = <$socket>;
$/ = "\n";
return <$socket>;
}
async sub msg {
...
}
1;