Compare commits

..

3 Commits

Author SHA1 Message Date
Stefan Härter
36a200670c Enabled importing of plugin commands. 2023-12-17 19:30:04 +01:00
Stefan Härter
87dcfb587f Base code for using plugins. 2023-11-12 19:32:18 +01:00
Stefan Härter
a42d6e91dd Some tidying. 2023-11-12 19:31:46 +01:00

View File

@ -1,4 +1,4 @@
# Important for switch feature # important for switch feature
use v5.32; use v5.32;
use utf8; use utf8;
@ -17,10 +17,10 @@ use JSON;
use Log::Log4perl; use Log::Log4perl;
use YAML; use YAML;
# Package name # package name
package TelegramBot; package TelegramBot;
# Constants and initalisations # constants and initalisations
Log::Log4perl->init("$FindBin::Bin/log.conf"); Log::Log4perl->init("$FindBin::Bin/log.conf");
my $CACHE = Cache::FastMmap->new( my $CACHE = Cache::FastMmap->new(
share_file => '/tmp/telegram_bot', share_file => '/tmp/telegram_bot',
@ -36,12 +36,10 @@ sub new {
my $Self = {}; my $Self = {};
bless( $Self, $Type ); bless( $Self, $Type );
$Self->{LogLevel} = $Param{LogLevel} || 'info'; $Self->{LogLevel} = $Param{LogLevel} || 'info';
$Self->{LogObject} = Log::Log4perl->get_logger('TelegramBot'); $Self->{LogObject} = Log::Log4perl->get_logger('TelegramBot');
$Self->{Token} = 'bot5868933096:AAE8Oe-AxU6m_yCWfpqTqwwjERqnRpBGJtE'; $Self->{Token} = 'bot5868933096:AAE8Oe-AxU6m_yCWfpqTqwwjERqnRpBGJtE';
$Self->{URL} = { $Self->{TelegramURL} = 'https://api.telegram.org';
Telegram => 'https://api.telegram.org',
};
# load remembered update ids # load remembered update ids
$Self->{MessageIDs} = YAML::LoadFile("$FindBin::Bin/message_ids.yml"); $Self->{MessageIDs} = YAML::LoadFile("$FindBin::Bin/message_ids.yml");
@ -49,6 +47,36 @@ sub new {
# whitelist # whitelist
$Self->{Whitelist} = $Param{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);
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; return $Self;
} }
@ -59,7 +87,6 @@ sub new {
=cut =cut
sub greet { sub greet {
my ( $Self, %Param ) = @_; my ( $Self, %Param ) = @_;
$Self->{LogObject}->info('greet: Initiating greet routine'); $Self->{LogObject}->info('greet: Initiating greet routine');
@ -89,6 +116,7 @@ sub greet {
=cut =cut
# TODO rebuild to take custom parameters of various kind
sub build { sub build {
my ( $Self, %Param ) = @_; my ( $Self, %Param ) = @_;
@ -105,7 +133,7 @@ sub build {
else { else {
# for now, testing fallback # for now, testing fallback
my $ResponseResult = plain POST( my $ResponseResult = plain POST(
join( '/', ( $Self->{URL}{Telegram}, $Self->{Token}, 'sendMessage' ) ), join( '/', ( $Self->{TelegramURL}, $Self->{Token}, 'sendMessage' ) ),
{ {
'chat_id' => $Param{Message}->{callback_query}->{from}->{id}, 'chat_id' => $Param{Message}->{callback_query}->{from}->{id},
'reply_to_message_id' => $Param{Message}->{callback_query}->{message}->{message_id}, 'reply_to_message_id' => $Param{Message}->{callback_query}->{message}->{message_id},
@ -118,6 +146,7 @@ sub build {
} }
else { else {
# TODO load list of commands from core and plugins
$KeyboardData = { $KeyboardData = {
'inline_keyboard' => [ 'inline_keyboard' => [
[ [
@ -141,7 +170,7 @@ sub build {
$KeyboardData, $KeyboardData,
); );
my $ResponseResult = plain POST( my $ResponseResult = plain POST(
join( '/', ( $Self->{URL}{Telegram}, $Self->{Token}, 'sendMessage' ) ), join( '/', ( $Self->{TelegramURL}, $Self->{Token}, 'sendMessage' ) ),
{ {
'chat_id' => $Param{Message}->{chat}->{id}, 'chat_id' => $Param{Message}->{chat}->{id},
'reply_to_message_id' => $Param{Message}->{id}, 'reply_to_message_id' => $Param{Message}->{id},
@ -178,13 +207,15 @@ sub processMessage {
my $ResponseData = {}; my $ResponseData = {};
my $CommandList = join('|', keys $Self->{CommandList}->%*);
if ( defined $Param{Message}->{message} && $Param{Message}->{message}->{text} =~ if ( defined $Param{Message}->{message} && $Param{Message}->{message}->{text} =~
/\/(?<command>greet|statistics|build)\s?(?<arguments>.*)?/ ) /\/(?<command>$CommandList)\s?(?<arguments>.*)?/ )
{ {
my $Message = $Param{Message}->{message}; my $Message = $Param{Message}->{message};
my $Command = $+{command}; my $Command = $+{command};
my $ArgumentsString = $+{arguments}; my $ArgumentsString = $+{arguments};
$ResponseData = $Self->$Command( $ResponseData = $Self->{CommandList}{$Command}(
$Self,
Message => $Message, Message => $Message,
Arguments => $ArgumentsString, Arguments => $ArgumentsString,
); );
@ -217,7 +248,7 @@ sub processMessage {
} }
my $ResponseResult = plain POST( my $ResponseResult = plain POST(
join( '/', ( $Self->{URL}{Telegram}, $Self->{Token}, 'sendMessage' ) ), join( '/', ( $Self->{TelegramURL}, $Self->{Token}, 'sendMessage' ) ),
{ {
chat_id => $Param{Message}->{message}->{chat}->{id}, chat_id => $Param{Message}->{message}->{chat}->{id},
$ResponseData->%*, $ResponseData->%*,
@ -229,7 +260,7 @@ sub processMessage {
# mark message as read # mark message as read
my $SeenResult = plain POST( my $SeenResult = plain POST(
join( '/', ( $Self->{URL}{Telegram}, $Self->{Token}, 'readMessageContents' ) ), join( '/', ( $Self->{TelegramURL}, $Self->{Token}, 'readMessageContents' ) ),
{ {
id => $Param{Message}->{message}->{id}, id => $Param{Message}->{message}->{id},
} }
@ -253,7 +284,7 @@ sub fetchMessages {
$Self->{LogObject}->info('fetchMessages: Initiating getUpdates'); $Self->{LogObject}->info('fetchMessages: Initiating getUpdates');
my $MessageDataRaw = my $MessageDataRaw =
json GET( join( '/', ( $Self->{URL}{Telegram}, $Self->{Token}, $Method ) ), {} ); json GET( join( '/', ( $Self->{TelegramURL}, $Self->{Token}, $Method ) ), {} );
$Self->{LogObject} $Self->{LogObject}
->info( 'fetchMessages: Messages raw are ' . Dumper($MessageDataRaw) ); ->info( 'fetchMessages: Messages raw are ' . Dumper($MessageDataRaw) );
my @Messages = $MessageDataRaw->{result}->@*; my @Messages = $MessageDataRaw->{result}->@*;