4.6.2 Vlastní plugin

Nyní si na jednoduchém příkladu ukážeme, jak přidat do ChatBota novou funkci. Tou funkcí bude vzdálené spouštění nějakého příkazu na serveru, kde ChatBot běží. Může to být potenciálně nebezpečná situace, proto bych nedoporučil takovou funkci dělat na počítači, na kterém by vás mrzela ztráta dat nebo nefunkčnost systému nebo možnost zneužití. Zdůrazňuji, že tady už se opravdu neobejdeme bez určitých znalostí zásad programování, Perlu a regulárních výrazů. Ani jedno tu vysvětlovat nebudeme, omezíme se jen na popis architektury běžného pluginu. Nejpohodlnější je otevřít si existující plugin a upravit příslušné pasáže.

Nejprve zaregistrujeme spouštěcí příkaz. Definujme jej jako "!start", takže kdykoliv někdo robotovi napíše zprávu začínající !start, spustí se právě tento náš plugin. Alternativou může být třeba "!run". Ve zdrojovém kódu tedy uvedeme

&RegisterCommand(command=>"!start",
                 alias=>"!run",
                 handler=>\&plugin_spustit_prikaz,
                 desc=>"Spusteni systemoveho prikazu na lokale.",
                 usage=>"<password> \"command\"");

Jak vidíme, registrujeme i parametry desc a usage pro nápovědu a handler jako ukazatel na obsluhující rutinu. Takže dále napíšeme kýženou rutinu.

sub plugin_spustit_prikaz
{
    my $message = shift;
    my $args = shift;

    my $fromJID = $message->GetFrom("jid");
	my $Name = $fromJID->GetResource();
	   
    my ($password,$command) = ($args =~ /^\s*(\S+)\s+\"([^\"]+)"\s*$/);

    return ($message->GetType(),"$Name, Jsi snad Tvrdiaak?")
    	unless (lc($Name) eq 'tvrdiaak');
    	
    return ($message->GetType(),"The command was in error.")
        if !defined($password);
    return ($message->GetType(),"Permission denied.")
        unless &CheckPassword("channel",$password);
    
    system($command);

    return ($message->GetType(),"Spoustim pro $Name prikaz na lokale...");
} 

Z uvedeného zápisu vidíme, že rutině jsou předány argumenty "message" a "args", z "message" pak vyzobeme typ zprávy (chat nebo groupchat) a odesílatele, z "arg" pak pomocí porovnání regulárních výrazů vezmeme napsané heslo a spouštěný příkaz. Následují kontroly, zda odesílatel je ten, kdo má právo rutinu spouštět (tedy Tvrdiaak), zda bylo zadáno heslo a zda je správné, potom se provede požadovaný systémový příkaz a odesílateli je vráceno hlášení o spuštění příkazu.

Poslední věcí pro chod této funkce je říci ChatBotovi, že má při startu nahrát tento plugin. To uděláme opět v config.xml, do sekce <load> přidáme <plugin>start.pl</plugin>. A po dalším spuštění máme funkčního robota upraveného k našim potřebám.