I wrote this section with the little knowledge I have of the capabilities system; I work mainly by testing different possibilities until I get what I want. As for all the documentation, feel free to contact me to correct/enhance it.

First, you should know how capabilities work on the user side.

Checking for a capability given its name

You only have to use ircdb.checkCapability(prefix, 'capability').

You can also override some behavior of the capability system. Here is the complete documentation of ircdb.checkCapabiltiy:

supybot.ircdb.checkCapability(hostmask, capability, users=<supybot.ircdb.UsersDictionary object>, channels=<supybot.ircdb.ChannelsDictionary object>, ignoreOwner=False, ignoreChannelOp=False, ignoreDefaultAllow=False)[source]

Checks that the user specified by name/hostmask has the capability given.

users and channels default to ircdb.users and ircdb.channels.

ignoreOwner, ignoreChannelOp, and ignoreDefaultAllow are used to override default behavior of the capability system in special cases (actually, in the AutoMode plugin):

  • ignoreOwner disables the behavior “owners have all capabilites”
  • ignoreChannelOp disables the behavior “channel ops have all channel capabilities”
  • ignoreDefaultAllow disables the behavior “if a user does not have a capability or the associated anticapability, then they have the capability”

Manipulating capability names

Althrough you can manipulate capability names with string operations, Supybot provides a few methods to do that “in the abstract” (could be useful if we change the capability syntax one day…):

supybot.ircdb.makeChannelCapability(channel, capability)[source]

Makes a channel capability given a channel and a capability.


Returns True if capability is a channel capability; False otherwise.


Returns the anticapability of a given capability.


Takes an anticapability and returns the non-anti form.


Make a capability into an anticapability and vice versa.


Returns True if capability is an anticapability; False otherwise.