Okay, so this dumb bot can’t do much, can it? You want something more exciting?
Here’s how:
You can see a few example of what a “brainy bot” can do, remember by browsing the bots available in the “samples” directory.
BrainyBot is a class that resides in the samples directory. Let’s dive in its code
from cmdbot.core import Bot, direct
class BrainyBot(Bot):
@direct
def do_hello(self, line):
"Reply hello and save that in brain"
self.say("%s: hello" % line.nick_from)
self.brain.who_said_hello_last = line.nick_from
@direct
def do_who(self, line):
"Tell us who talked to you last"
if hasattr(self.brain, 'who_said_hello_last'):
self.say("The one that talked to me last: %s" % self.brain.who_said_hello_last)
else:
self.say("Nobody has talked to me...")
Since BrainyBot extends the Bot class, it already knows how to “ping” and how to “help” you. If we run it (using an appopriate ‘.ini’ file), and try to talk to it, here is some result
22:53 -!- cmdbot [~cmdbot@127.0.0.1] has joined #cdc
22:53 < cmdbot> Hi everyone.
22:54 < No`> cmdbot: hello
22:54 < cmdbot> No`: hello
22:54 < No`> cmdbot: who
22:54 < cmdbot> The one that talked to me last: No`
We’ve used the Brain of our Bot, to tell it to store in-memory who’s talked to him last. And by asking it who, it’s able to tell it to us.
You may have noticed that every new thing your bot knows to do is prefixed by do_. That’s the trick. When someone on the channel says something, the bot analyses it. If the first word of the message is a verb your bot knows about, the do_<verb> action is processed.
Note
This behaviour is heavily borrowed on the Python cmd module.
Whenever a do_ method is decorated by @direct, it will only be executed if someone is directly talking to the Bot.
@direct
def do_hello(self, line):
self.say('hello, you')
22:53 -!- cmdbot [~cmdbot@127.0.0.1] has joined #cdc
22:53 < cmdbot> Hi everyone.
22:54 < No`> hello
22:54 < No`> cmdbot: hello
22:54 < cmdbot> hello, you
The first time, the user didn’t talk directly to the bot. The second time, it was mentioned, so the bot replied “hello, you”
When a do_ is decorated by @admin the code will only be executed if the previous lines has been said by an admin.
@admin
def do_hello(self, line):
self.say('hello, my lord')
22:53 -!- cmdbot [~cmdbot@127.0.0.1] has joined #cdc
22:53 < cmdbot> Hi everyone.
22:54 < NotAdmin> hello
22:54 < AdminUser> hello
22:54 < cmdbot> hello, my lord
Note
You’ve noticed that it doesn’t have to be direct. It’s only if the verb it the first word of the message.
Without decorator, the do_<stuff> method will be called each time a line is being said by a user. Beware, then, your bot may have a lot of work to do...
There comes the beauty of decorators. You can mix them...
@admin
@direct
def do_hello(self, line):
self.say('hello, my lord')
The bot will then only say “hello my lord” if some admin directly told it “hello”.
Each bot says something when it /joins the chan. If you want a custom message, just do something like
class FrenchBot(Bot):
welcome_message = "Bonjour tout le monde !"
CmdBot is coming with two available configuration modules. The default one is using the “ini file” described in the ini file section.
But you can override this using the ArgumentConfiguration. Like this
from cmdbot.core import Bot
from cmdbot.configs import ArgumentConfiguration
class ArgumentBot(Bot):
config_class = ArgumentConfiguration
That’s it. If you want, you can build your own configuration module. All you have to do is to build one that has at least the following available properties (if not mentioned, should be a string):
Well... now, the sky is the limit. Extended bots can manipulate data, remember it, treat and process it... And you can still use this bot as a “dumb” one, if you want!
You can also make your own decorators, exactly the way @admin() and @direct() work. You may, for example... change the behaviour of a command if your brain contains a certain bit of data, or if the first letter of the nick is a “Z”... you see?... no. limit.
A few more examples will probably appear in the samples directory. Stay tuned!