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;