From 90e84e1c774a5e36aaafa7da655c8193218f1f37 Mon Sep 17 00:00:00 2001 From: David Phillips Date: Wed, 11 Apr 2018 00:00:06 +1200 Subject: Implement in-chan admin commands with Admin module Starts to address GitHub issue #11 --- Plugin/Admin.pm | 163 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 163 insertions(+) create mode 100644 Plugin/Admin.pm (limited to 'Plugin/Admin.pm') diff --git a/Plugin/Admin.pm b/Plugin/Admin.pm new file mode 100644 index 0000000..1151fc4 --- /dev/null +++ b/Plugin/Admin.pm @@ -0,0 +1,163 @@ +#!/usr/bin/env perl + +package Plugin::Admin; + +use strict; +use warnings; + +my %config; + +sub configure { + my $self = $_[0]; + my $cmdref = $_[1]; + my $cref = $_[2]; + %config = %$cref; + + $cmdref->("say", sub { $self->say(@_); } ); + $cmdref->("action", sub { $self->action(@_); } ); + + $cmdref->("nick", sub { $self->nick(@_); } ); + $cmdref->("join", sub { $self->join(@_); } ); + $cmdref->("part", sub { $self->part(@_); } ); + $cmdref->("mode", sub { $self->mode(@_); } ); + $cmdref->("kick", sub { $self->kick(@_); } ); + $cmdref->("topic", sub { $self->topic(@_); } ); + $cmdref->("reconnect", sub { $self->reconnect(@_); } ); + + $cmdref->("ignore", sub { $self->ignore(@_); } ); + $cmdref->("don't ignore", sub { $self->do_not_ignore(@_); } ); + + return $self; +} + +sub is_admin { + my $who = shift; + my $is_admin = grep {$_ eq $who} @{$config{admins}}; + if (!$is_admin) { + # Uhh log this rather than print + print "$who isn't an admin, but tried to use a command"; + } + return $is_admin; +} + +sub nick { + my ($self, $irc, $logger, $who, $where, $rest, @arguments) = @_; + + return unless is_admin($who); + return "Syntax: nick " unless @arguments == 1; + + $irc->yield(nick => $arguments[0]); +} + +sub say { + my ($self, $irc, $logger, $who, $where, $rest, @arguments) = @_; + + return unless is_admin($who); + return "Syntax: say " unless @arguments >= 2; + + # Strip nick/channel from message + $rest =~ s/^(.*?\s)//; + + $irc->yield(privmsg => $arguments[0] => $rest); +} + +sub action { + my ($self, $irc, $logger, $who, $where, $rest, @arguments) = @_; + + return unless is_admin($who); + return "Syntax: action " unless @arguments >= 2; + + # Strip nick/channel from message + $rest =~ s/^(.*?\s)//; + + $irc->yield(ctcp => $arguments[0] => "ACTION $rest"); +} + +sub join { + my ($self, $irc, $logger, $who, $where, $rest, @arguments) = @_; + + return unless is_admin($who); + return "Syntax: join [channel2 ...]" unless @arguments >= 1; + + $irc->yield(join => $_) for @arguments; +} + +sub part { + my ($self, $irc, $logger, $who, $where, $rest, @arguments) = @_; + + return unless is_admin($who); + return "Syntax: part [channel2 ...] [partmsg]" unless @arguments >= 1; + + my $nick = (split /!/, $who)[0]; + my ($chan_str, $reason) = split /\s+(?!#)/, $rest, 2; + my @channels = split /\s+/, $chan_str; + $reason = "Commanded by $nick" unless $reason; + $irc->yield(part => @channels => $reason); +} + +sub mode { + my ($self, $irc, $logger, $who, $where, $rest, @arguments) = @_; + + return unless is_admin($who); + return "Syntax: mode " unless @arguments > 0; + + # FIXME should use $where if it's a channel (?) + $irc->yield(mode => $rest); +} + +sub kick { + my ($self, $irc, $logger, $who, $where, $rest, @arguments) = @_; + + return unless is_admin($who); + return "Syntax: kick [reason]" unless @arguments >= 2; + + my ($channel, $kickee, undef, $reason) = $rest =~ /^(\S+)\s(\S+)((?:\s)(.*))?$/; + if ($channel and $kickee) { + my $nick = (split /!/, $who)[0]; + $reason = "Requested by $nick" unless $reason; + $irc->yield(kick => $channel => $kickee => $reason); + } +} + +sub topic { + my ($self, $irc, $logger, $who, $where, $rest, @arguments) = @_; + + return unless is_admin($who); + return "Syntax: topic " unless @arguments >= 2; + + # Strip nick/channel from message + $rest =~ s/^(.*?\s)//; + + # FIXME use $where if it's a channel + $irc->yield(topic => $arguments[0] => $rest); +} + +sub reconnect { + my ($self, $irc, $logger, $who, $where, $rest, @arguments) = @_; + + return unless is_admin($who); + + my $reason = $rest; + $irc->yield(quit => $reason); +} + +sub ignore { + my ($self, $irc, $logger, $who, $where, $rest, @arguments) = @_; + + return unless is_admin($who); + return "Syntax: ignore " unless @arguments == 1; + + $logger->("ERROR: UNIMPLEMENTED FEATURE"); +} + +sub do_not_ignore { + my ($self, $irc, $logger, $who, $where, $rest, @arguments) = @_; + + return unless is_admin($who); + return "Syntax: don't ignore " unless @arguments == 1; + + $logger->("ERROR: UNIMPLEMENTED FEATURE"); +} + + +1; -- cgit v1.1 From bf8314a0283f7565854fe773c5d1edf8e26c9660 Mon Sep 17 00:00:00 2001 From: David Phillips Date: Sun, 29 Jul 2018 22:34:00 +1200 Subject: Implement ignore et al in Admin.pm --- Plugin/Admin.pm | 24 ++++++++++++++++++++++-- 1 file changed, 22 insertions(+), 2 deletions(-) (limited to 'Plugin/Admin.pm') diff --git a/Plugin/Admin.pm b/Plugin/Admin.pm index 1151fc4..ad07da2 100644 --- a/Plugin/Admin.pm +++ b/Plugin/Admin.pm @@ -26,6 +26,7 @@ sub configure { $cmdref->("ignore", sub { $self->ignore(@_); } ); $cmdref->("don't ignore", sub { $self->do_not_ignore(@_); } ); + $cmdref->("who are you ignoring?", sub { $self->dump_ignore(@_); } ); return $self; } @@ -111,6 +112,7 @@ sub kick { return unless is_admin($who); return "Syntax: kick [reason]" unless @arguments >= 2; + # FIXME should use $where if it's a channel (?) my ($channel, $kickee, undef, $reason) = $rest =~ /^(\S+)\s(\S+)((?:\s)(.*))?$/; if ($channel and $kickee) { my $nick = (split /!/, $who)[0]; @@ -147,7 +149,9 @@ sub ignore { return unless is_admin($who); return "Syntax: ignore " unless @arguments == 1; - $logger->("ERROR: UNIMPLEMENTED FEATURE"); + push @{$config{ignore}}, $arguments[0]; + + return "Ignoring $arguments[0]"; } sub do_not_ignore { @@ -156,7 +160,23 @@ sub do_not_ignore { return unless is_admin($who); return "Syntax: don't ignore " unless @arguments == 1; - $logger->("ERROR: UNIMPLEMENTED FEATURE"); + my $target = $arguments[0]; + + if (grep { $_ eq $target} @{$config{ignore}}) { + @{$config{ignore}} = grep { $_ ne $target } @{$config{ignore}}; + return "No longer ignoring $target."; + } else { + return "I wasn't ignoring $target anyway."; + } +} + +sub dump_ignore { + my ($self, $irc, $logger, $who, $where, $rest, @arguments) = @_; + + return "Syntax: who are you ignoring?" unless @arguments == 0; + + # FIXME special case for empty ignore + return "I am ignoring: " . join ", ", @{$config{ignore}}; } -- cgit v1.1 From c0ff50bd5082bb6c7093d907864dd799d52c5a98 Mon Sep 17 00:00:00 2001 From: David Phillips Date: Sun, 29 Jul 2018 22:36:15 +1200 Subject: Admin: rename join routine to avoid collision with CORE::join --- Plugin/Admin.pm | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) (limited to 'Plugin/Admin.pm') diff --git a/Plugin/Admin.pm b/Plugin/Admin.pm index ad07da2..2a2a691 100644 --- a/Plugin/Admin.pm +++ b/Plugin/Admin.pm @@ -17,7 +17,7 @@ sub configure { $cmdref->("action", sub { $self->action(@_); } ); $cmdref->("nick", sub { $self->nick(@_); } ); - $cmdref->("join", sub { $self->join(@_); } ); + $cmdref->("join", sub { $self->join_channel(@_); } ); $cmdref->("part", sub { $self->part(@_); } ); $cmdref->("mode", sub { $self->mode(@_); } ); $cmdref->("kick", sub { $self->kick(@_); } ); @@ -74,7 +74,7 @@ sub action { $irc->yield(ctcp => $arguments[0] => "ACTION $rest"); } -sub join { +sub join_channel { my ($self, $irc, $logger, $who, $where, $rest, @arguments) = @_; return unless is_admin($who); -- cgit v1.1