---
name: "jabber-querybot"
section: "1p"
platform: "linux"
package: "jabber-querybot"
version: "0.1.0-1.1"
release: "Debian 13 (Trixie)"
platforms: ["linux"]
url: "https://new.carta.tech/jabber-querybot"
---

# jabber-querybot(1p)

a modular perl jabber bot

## NAME

jabber-querybot - a modular perl jabber bot

## DESCRIPTION

jabber-querybot connects a jabber account and wait for messages. If a message comes in, it forward it to your self programmend modul. The return string of your module, jabber-querybot send it back to the jabber sender.

It is designed to be re-usable and to make it easy to write small Jabber bots that do one thing and do it well. A simple concept with a lot of examples and experiences are implemented.

1\. Create a jabber account on a jabber-server around

2\. Create a bot application:

```
 cd examples
 cp Querymodule.pm /etc/jabber-querybot/Mybot.pm
 cd /etc/jabber-querybot
 ln -s Mybot.pm Querymodule.pm
```

Modify login parameters to your jabber-bot-account

vim Mybot.pm

```
  our $hostname        = "swissjabber.ch";
  our $user            = "";
  our $password        = "";
  our $ident           = "Testbot";
  our $bot_admin       = "\@swissjabber.ch";
  our $port            = "5222";
  our $timeout         = "5";
  our $service_name    = "$user\@$hostname";
  our $bot_description = "Bot help title
  Bot description";
```

For each jabber message, jabber-querybot will execute sub run\_query, that you can write here your application.

You can control how your jabber response will be:

- •

  error = error message stanza

- •

  presence = error as presence stanza

- •

  ignore = ignore message

## OPTIONS

jabber-querybot has a lot of variables which you can easy modify for  what you need:

### querystatus

`$querystatus` = \[ 0 \| 1 \]

- •

  0 = Bot will not proceed any incoming jabber messages.

- •

  1 = Bot will proceed incoming messages.

### penalty\_status

If the bot has too much workload, it goes to penalty status and wait some  time until his status change back to normal.

`$timer_reconnect_default` = 21600

Every 21600 seconds (6 hours) the bot will shutdown automatically, wait 10  seconds and starting up again.

`$timer_auto_query` = 0

If you set in your module this variable to 60, the bot will every 60 seconds call the function **run\_auto\_query()** which you may use for several things.

### System load

If your systems load is \>=6, this bot will shutdown the jabber connection  and check every 10 seconds systems load. If load \<=2, bot will start over.

## EXAMPLES

/usr/share/doc/jabber-querybot/examples/Testbot.pm

## FILES

/etc/jabber-querybot/Querymodule.pm

/usr/bin/jabber-querybot

## RESOURCES

http://github.com/micressor/jabber-querybot/

## METHODS

### InMessage()

An incoming jabber message to the bot will hook this function.

- •

  Read parameters of incoming stanza

###

- •

  Decode utf8 string

###

- •

  increment timer overload and do not process message if bot is  overloaded.

###

- •

  Ignore message if it is from myself

###

- •

  Be sure, that it is not a message from another transport

###

- •

  Check any systemcommands for the bot

###

- •

  If the bot has sleeping status, change it to work

###

- •

  We process only normal text or chat type jabber messages

###

- •

  And now we give the real text string which was incoming to the bot via **run\_query()**.

- •

  If **run\_query()** say us 'ignore\` we do a log entry and do not answer via jabber to the user.

###

- •

  If **run\_query()** says 'error\` we send a jabber error stanza wiht the status message from **run\_query()** back to the user.

###

- •

  If there was no error, we update the statistic vars and send the answer from **run\_query()** back to the jabber user.

### connect\_server()

This function connects to the jabber server with the given credentials from Querymodule.pm.

###

Set the call back functions. This functions will be executed if a message of the types \<message/\> \<iq/\> or \<presence/\> are incoming.

### Stop()

Shutdown jabber connection and exit main program

### disconnect\_server()

Only disconnect from the jabber-server.

### reconnect\_server()

Reconnect and create a log entry.

### InIQ()

We do not proceed any iq (information query), this is only for  statisic.

### InPresence()

- •

  Increment timer overload

- •

  Do not process message if we are overloaded **penalty\_handler()**.

###

We have a problem in Net::Jabber. An incoming message with a \` in resource  blocks the bot. We will hotfix that for the moment.

###

A subscription type \`subscribe\` is incoming. Send \`subscribed\` tho the user  and say hello ;)

###

- •

  Send presence to user

###

- •

  Remove subscription if a user remove this bot from his roster

### sendPresence()

Send presence information to user

### systemcommands()

- •

  If user type '!help\` send a help instruction to the user

###

- •

  Send statistic information to the user if he types '!status\`

###

- •

  Is it a bot command?

- •

  Is the bot command from the bot admin? If not, send "not allowed"

- •

  '!shutdown\` will shutdown your bot via jabber invoke.

- •

  '!query off\` turn off queries

- •

  '!query on\` turn on queries

### get\_barejid()

Remove resource id from a jabber id.

### calcualte\_stats()

Calculate message statistics

### jabber\_set\_presence()

Set new presence if we have another presence status or we have set the force  flag (for transport presence).

### jabber\_send\_message()

This function send all jabber messages which are outgoing from the  jabber-querybot.

### set\_wakeup\_mode()

Set jabber presence via **jabber\_set\_presence()**

### penalty\_handler()

This function checks if the bot is overloaded with incoming mesages and  reject if it is. Two times that's ok so 2:1 because while in main.

###

Bot admin got everytime an answer.

### jabber\_add\_footer()

Add footer to the processed message.

### calcualte\_elapsed\_time()

Calculate elapsed worktime for a query

### sendError()

sendError($message, `$from`, `$to`, 404, "text");

### system\_load\_check()

- •

  Calculate system load

- •

  If load is too high shutdown bot.

- •

  If load is ok, starting up bot

### connect\_bot()

Connect bot and initialize all timers.

### check\_before\_start()

Check configuration variables in Querybotmodule.pm and give answer if anything does not match or is missing.

## COPYRIGHT AND LICENSE

Copyright (C) 2009-2012 Marco Balmer \<marco@balmer.name\>

The Debian packaging is licensed under the  GPL, see \`/usr/share/common-licenses/GPL-3'.
