# File: Users.pm # # Purpose: Handles IRC events related to PBot user accounts and user metadata. # SPDX-FileCopyrightText: 2010-2023 Pragmatic Software # SPDX-License-Identifier: MIT package PBot::Core::Handlers::Users; use PBot::Imports; use parent 'PBot::Core::Class'; sub initialize($self, %conf) { $self->{pbot}->{event_dispatcher}->register_handler('irc.join', sub { $self->on_join (@_) }); $self->{pbot}->{event_dispatcher}->register_handler('irc.part', sub { $self->on_departure (@_) }); $self->{pbot}->{event_dispatcher}->register_handler('irc.quit', sub { $self->on_departure (@_) }); $self->{pbot}->{event_dispatcher}->register_handler('irc.kick', sub { $self->on_kick (@_) }); $self->{pbot}->{event_dispatcher}->register_handler('pbot.part', sub { $self->on_self_part (@_) }); } sub on_join($self, $event_type, $event) { my ($nick, $user, $host, $channel) = ( $event->nick, $event->user, $event->host, $event->to ); ($nick, $user, $host) = $self->{pbot}->{irchandlers}->normalize_hostmask($nick, $user, $host); my ($u, $name) = $self->{pbot}->{users}->find_user($channel, "$nick!$user\@$host"); if (defined $u) { if ($self->{pbot}->{chanops}->can_gain_ops($channel)) { my $modes = '+'; my $targets = ''; if ($u->{autoop}) { $self->{pbot}->{logger}->log("$nick!$user\@$host autoop in $channel\n"); $modes .= 'o'; $targets .= "$nick "; } if ($u->{autovoice}) { $self->{pbot}->{logger}->log("$nick!$user\@$host autovoice in $channel\n"); $modes .= 'v'; $targets .= "$nick "; } if (length $modes > 1) { $self->{pbot}->{chanops}->add_op_command($channel, "mode $channel $modes $targets"); $self->{pbot}->{chanops}->gain_ops($channel); } } if ($u->{autologin}) { $self->{pbot}->{logger}->log("$nick!$user\@$host autologin to $name for $channel\n"); $u->{loggedin} = 1; } } return 1; } sub on_departure($self, $event_type, $event) { my ($nick, $user, $host, $channel) = ($event->nick, $event->user, $event->host, $event->to); ($nick, $user, $host) = $self->{pbot}->{irchandlers}->normalize_hostmask($nick, $user, $host); $self->{pbot}->{users}->decache_user($channel, "$nick!$user\@$host"); return 1; } sub on_kick($self, $event_type, $event) { my ($nick, $user, $host, $channel) = ($event->nick, $event->user, $event->host, $event->{args}[0]); ($nick, $user, $host) = $self->{pbot}->{irchandlers}->normalize_hostmask($nick, $user, $host); $self->{pbot}->{users}->decache_user($channel, "$nick!$user\@$host"); return 1; } sub on_self_part($self, $event_type, $event) { delete $self->{pbot}->{users}->{user_cache}->{lc $event->{channel}}; return 1; } 1;