# File: Chat.pm # # Purpose: IRC handlers for chat/message events. # SPDX-FileCopyrightText: 2021 Pragmatic Software # SPDX-License-Identifier: MIT package PBot::Core::Handlers::Chat; use PBot::Imports; use parent 'PBot::Core::Class'; sub initialize { my ($self, %conf) = @_; $self->{pbot}->{event_dispatcher}->register_handler('irc.notice', sub { $self->on_notice (@_) }); $self->{pbot}->{event_dispatcher}->register_handler('irc.public', sub { $self->on_public (@_) }); $self->{pbot}->{event_dispatcher}->register_handler('irc.caction', sub { $self->on_action (@_) }); $self->{pbot}->{event_dispatcher}->register_handler('irc.msg', sub { $self->on_msg (@_) }); } sub on_notice { my ($self, $event_type, $event) = @_; my ($nick, $user, $host, $to, $text) = ( $event->{event}->nick, $event->{event}->user, $event->{event}->host, $event->{event}->to, $event->{event}->{args}->[0], ); # don't handle non-chat NOTICE return undef if $to eq '*'; # log notice $self->{pbot}->{logger}->log("NOTICE from $nick!$user\@$host to $to: $text\n"); # if NOTICE is sent to the bot then replace the `to` field with the # sender's nick instead so when we pass it on to on_public ... if ($to eq $self->{pbot}->{registry}->get_value('irc', 'botnick')) { $event->{event}->{to}->[0] = $nick; } # handle this NOTICE as a public message # (check for bot commands, anti-flooding, etc) $self->on_public($event_type, $event); return 1; } sub on_public { my ($self, $event_type, $event) = @_; my ($from, $nick, $user, $host, $text) = ( $event->{event}->{to}->[0], $event->{event}->nick, $event->{event}->user, $event->{event}->host, $event->{event}->{args}->[0], ); ($nick, $user, $host) = $self->{pbot}->{irchandlers}->normalize_hostmask($nick, $user, $host); # send text to be processed for bot commands, anti-flood enforcement, etc $event->{interpreted} = $self->{pbot}->{interpreter}->process_line($from, $nick, $user, $host, $text); return 1; } sub on_action { my ($self, $event_type, $event) = @_; # prepend "/me " to the message text $event->{event}->{args}->[0] = "/me " . $event->{event}->{args}->[0]; # pass this along to on_public $self->on_public($event_type, $event); return 1; } sub on_msg { my ($self, $event_type, $event) = @_; my ($nick, $user, $host, $text) = ( $event->{event}->nick, $event->{event}->user, $event->{event}->host, $event->{event}->{args}->[0], ); ($nick, $user, $host) = $self->{pbot}->{irchandlers}->normalize_hostmask($nick, $user, $host); # send text to be processed as a bot command, coming from $nick $event->{interpreted} = $self->{pbot}->{interpreter}->process_line($nick, $nick, $user, $host, $text, 1); return 1; } 1;