diff --git a/TelegramBot.pm b/TelegramBot.pm index 1373a89..a026db5 100644 --- a/TelegramBot.pm +++ b/TelegramBot.pm @@ -1,4 +1,4 @@ -# Important for switch feature +# important for switch feature use v5.32; use utf8; @@ -17,10 +17,10 @@ use JSON; use Log::Log4perl; use YAML; -# Package name +# package name package TelegramBot; -# Constants and initalisations +# constants and initalisations Log::Log4perl->init("$FindBin::Bin/log.conf"); my $CACHE = Cache::FastMmap->new( share_file => '/tmp/telegram_bot', @@ -47,19 +47,34 @@ sub new { # whitelist $Self->{Whitelist} = $Param{Whitelist}; + $Self->{CommandList} = { + 'greet' => \&greet, + }; + # include plugins my @Plugins = glob("$FindBin::Bin/Plugins/*"); if ( @Plugins ) { - use File::Basename; - PLUGIN: - for my $PluginPath ( @Plugins ) { - my $PluginName = basename($PluginPath); - my $PluginObject = require("$FindBin::Bin/Plugins/${PluginName}/Core.pm"); - if( !$PluginObject ) { - $Self->{LogObject}->error("Couldn't load plugin $PluginName"); - next PLUGIN; - } - } + use File::Basename; + PLUGIN: + for my $PluginPath ( @Plugins ) { + my $PluginName = basename($PluginPath); + next PLUGIN unless require("$FindBin::Bin/Plugins/${PluginName}/Core.pm"); + my $FullPath = "Plugins::${PluginName}::Core"; + my $PluginObject = $FullPath->new; + if( !$PluginObject ) { + $Self->{LogObject}->error("Couldn't load plugin $PluginName"); + next PLUGIN; + } + + # import plugin command list + my $PluginCommandList = $PluginObject->getCommandList(); + COMMAND: + for my $PluginCommand ( keys $PluginCommandList->%* ) { + next COMMAND if $Self->{CommandList}{$PluginCommand}; + + $Self->{CommandList}{$PluginCommand} = $PluginCommandList->{$PluginCommand}; + } + } } return $Self; @@ -72,7 +87,6 @@ sub new { =cut sub greet { - my ( $Self, %Param ) = @_; $Self->{LogObject}->info('greet: Initiating greet routine'); @@ -102,6 +116,7 @@ sub greet { =cut +# TODO rebuild to take custom parameters of various kind sub build { my ( $Self, %Param ) = @_; @@ -131,6 +146,7 @@ sub build { } else { + # TODO load list of commands from core and plugins $KeyboardData = { 'inline_keyboard' => [ [ @@ -191,13 +207,15 @@ sub processMessage { my $ResponseData = {}; + my $CommandList = join('|', keys $Self->{CommandList}->%*); if ( defined $Param{Message}->{message} && $Param{Message}->{message}->{text} =~ - /\/(?greet|statistics|build)\s?(?.*)?/ ) + /\/(?$CommandList)\s?(?.*)?/ ) { my $Message = $Param{Message}->{message}; my $Command = $+{command}; my $ArgumentsString = $+{arguments}; - $ResponseData = $Self->$Command( + $ResponseData = $Self->{CommandList}{$Command}( + $Self, Message => $Message, Arguments => $ArgumentsString, );