Welcome to pmxbot documentation!¶
For Enterprise
Professional support for pmxbot is available as part of the Tidelift Subscription. Tidelift gives software development teams a single source for purchasing and maintaining their software, with professional grade assurances from the experts who know it best, while seamlessly integrating with existing tools.
- pmxbot.commands.acit(rest)¶
Look up an acronym
- pmxbot.commands.annoy()¶
Annoy everyone with meaningless banter
- pmxbot.commands.bitchingisuseless(channel, rest)¶
It really is, ya know…
- pmxbot.commands.blame(channel, rest, nick)¶
Pass the buck!
- pmxbot.commands.bless(rest)¶
Bless the day!
- pmxbot.commands.boo(rest)¶
Boo someone
- pmxbot.commands.calc(rest)¶
Perform a basic calculation
- pmxbot.commands.chain(rest, nick)¶
Chain some(one|thing) down.
- pmxbot.commands.cheer(rest)¶
Cheer for something
- pmxbot.commands.compliment(rest)¶
Generate a random compliment from http://www.madsci.org/cgi-bin/cgiwrap/~lynn/jardin/SCG
- pmxbot.commands.curse(rest)¶
Curse the day!
- pmxbot.commands.dance()¶
Do a little dance
- pmxbot.commands.deal(nick)¶
Deal or No Deal?
- pmxbot.commands.define(rest)¶
Define a word
- pmxbot.commands.demotivate(channel, rest)¶
Demotivate someone
- pmxbot.commands.disembowel(rest)¶
Disembowel some(one|thing)!
- pmxbot.commands.duck()¶
Display a helpful duck
- pmxbot.commands.eball(rest)¶
Ask the magic 8ball a question
- pmxbot.commands.embowel(rest)¶
Embowel some(one|thing)!
- pmxbot.commands.emer_comp(rest)¶
Return a random compliment from http://emergencycompliment.com/
- pmxbot.commands.featurecreep()¶
Generate feature creep (P+C http://www.dack.com/web/bullshit.html)
- pmxbot.commands.fight(nick, rest)¶
Pit two sworn enemies against each other (separate with ‘vs.’)
- pmxbot.commands.flip(nick)¶
Flip a coin
- pmxbot.commands.fml(rest)¶
A SFW version of fml.
- pmxbot.commands.get_insult()¶
Load a random insult from autoinsult.
- pmxbot.commands.gettowork(channel, nick, rest)¶
You really ought to, ya know…
- pmxbot.commands.golfclap(rest)¶
Clap for something
- pmxbot.commands.google(rest)¶
Look up a phrase on google
- pmxbot.commands.hire()¶
When all else fails, pmxbot delivers the perfect employee.
- pmxbot.commands.imotivate(channel, rest)¶
Ironically “Motivate” someone
- pmxbot.commands.insult(rest)¶
Generate a random insult
- pmxbot.commands.job()¶
Generate a job title, http://www.cubefigures.com/job.html
- pmxbot.commands.keelhaul(rest)¶
Inflict great pain and embarassment on some(one|thing)
- pmxbot.commands.klingon()¶
Ask the magic klingon a question
- pmxbot.commands.lunch(rest)¶
Pick where to go to lunch
- pmxbot.commands.meaculpa(nick, rest)¶
Sincerely apologize
- pmxbot.commands.motivate(channel, rest)¶
Motivate someone
- pmxbot.commands.murphy(rest)¶
Look up one of Murphy’s laws
- pmxbot.commands.nailedit(rest)¶
Nail that interview
- pmxbot.commands.nastygram(nick, rest)¶
A random passive-agressive comment, optionally directed toward some(one|thing).
- pmxbot.commands.oregontrail(channel, nick, rest)¶
It’s edutainment!
- pmxbot.commands.panic()¶
Panic!
- pmxbot.commands.password(rest)¶
Generate a random password, similar to http://www.pctools.com/guides/password
- pmxbot.commands.pick(rest)¶
Pick between a few options
- pmxbot.commands.plaintext(html)¶
Extract the text from HTML.
- pmxbot.commands.progress(rest)¶
Display the progress of something: start|end|percent
- pmxbot.commands.rand_bot(channel, nick, rest)¶
- pmxbot.commands.roll(rest, nick)¶
Roll a die, default = 100.
- pmxbot.commands.rubberstamp(rest)¶
Approve something
- pmxbot.commands.stab(nick, rest)¶
Stab, shank or shiv some(one|thing)!
- pmxbot.commands.storytime(rest)¶
A story is about to be told.
- pmxbot.commands.strategy()¶
Social Media Strategy, courtsey of http://whatthefuckismysocialmediastrategy.com/
- pmxbot.commands.suppress_exceptions(callables, exceptions=<class 'Exception'>)¶
Suppress supplied exceptions (tuple or single exception) encountered when a callable is invoked. >>> five_over_n = lambda n: 5//n >>> import functools >>> callables = (functools.partial(five_over_n, n) for n in range(-3,3)) >>> safe_results = suppress_exceptions(callables, ZeroDivisionError) >>> tuple(safe_results) (-2, -3, -5, 5, 2)
- pmxbot.commands.tgif(rest)¶
Thanks for the words of wisdow, Mike.
- pmxbot.commands.therethere(rest)¶
Sympathy for you.
- pmxbot.commands.ticker(rest)¶
Look up a ticker symbol’s current trading value
- pmxbot.commands.timezone(rest)¶
Convert date between timezones.
Example: > !tz 11:00am UTC in PDT 11:00 UTC -> 4:00 PDT
UTC is implicit
> !tz 11:00am in PDT 11:00 UTC -> 4:00 PDT
> !tz 11:00am PDT 11:00 PDT -> 18:00 UTC
- pmxbot.commands.tinytear(rest)¶
I cry a tiny tear for you.
- pmxbot.commands.troutslap(rest)¶
Slap some(one|thing) with a fish
- pmxbot.commands.urbandict(rest)¶
Define a word with Urban Dictionary
- pmxbot.commands.version(rest)¶
Get the version of pmxbot or one of its plugins
- pmxbot.commands.yay_sor(rest)¶
- pmxbot.commands.zinger(rest)¶
ZING!
- class pmxbot.core.AliasHandler(**kwargs)¶
Bases:
CommandHandler
- class_priority = 2¶
priority of this class relative to other classes, precedence to higher
- property doc¶
- class pmxbot.core.AugmentableMessage(other, **kwargs)¶
Bases:
str
A text string which may be augmented with attributes
>>> msg = AugmentableMessage('foo', bar='baz') >>> msg == 'foo' True >>> msg.bar == 'baz' True
- class pmxbot.core.Bot¶
Bases:
object
The abstract interface for the bot.
- allow(channel, message)¶
Allow plugins to filter content.
- handle_action(channel, nick, msg)¶
Core message parser and dispatcher
- handle_scheduled(target)¶
target is a Handler or simple callable
- init_schedule(scheduler)¶
- out(channel, s, log=True)¶
- abstract transmit(channel, message)¶
Transmit message using channel. If message looks like an action, transmit it as such. Suppress all exceptions (but log warnings for each). Return the message as sent.
- class pmxbot.core.CommandHandler(**kwargs)¶
Bases:
Handler
- property alias_names¶
- aliases = ()¶
- class_priority = 3¶
priority of this class relative to other classes, precedence to higher
- decorate(func)¶
Decorate a handler function. The handler should accept keyword parameters for values supplied by the bot, a subset of: - client - connection (alias for client) - event - channel - nick - rest
- match(message, channel)¶
Return True if the message is matched by this handler.
- process(message)¶
- class pmxbot.core.ConfigMergeAction(option_strings, dest, nargs=None, const=None, default=None, type=None, choices=None, required=False, help=None, metavar=None)¶
Bases:
Action
- class pmxbot.core.ContainsHandler(**kwargs)¶
Bases:
Handler
- channels = ()¶
- class_priority = 1¶
priority of this class relative to other classes, precedence to higher
- doc = None¶
- exclude = ()¶
- match(message, channel)¶
Return True if the message is matched by this handler.
- rate = 1.0¶
rate to invoke handler
- class pmxbot.core.ContentHandler(**kwargs)¶
Bases:
ContainsHandler
A custom handler that by default handles all messages.
- allow_chain = True¶
allow subsequent handlers to also process the same message
- class_priority = 5¶
priority of this class relative to other classes, precedence to higher
- name = ''¶
- class pmxbot.core.FinalRegistry¶
Bases:
object
A list of callbacks to run at exit.
- classmethod at_exit(finalizer)¶
- classmethod finalize()¶
- class pmxbot.core.Handler(**kwargs)¶
Bases:
object
- allow_chain = False¶
allow subsequent handlers to also process the same message
- attach(params)¶
Attach relevant params to func, returning a callable that takes no parameters.
- class_priority = 1¶
priority of this class relative to other classes, precedence to higher
- decorate(func)¶
Decorate a handler function. The handler should accept keyword parameters for values supplied by the bot, a subset of: - client - connection (alias for client) - event - channel - nick - rest
- classmethod find_matching(message, channel)¶
Yield
cls
subclasses that match message and channel
- match(message, channel)¶
Return True if the message is matched by this handler.
- priority = 1¶
priority relative to other handlers of this class, precedence to higher
- process(message)¶
- register()¶
- property sort_key¶
- class pmxbot.core.NoLog¶
Bases:
Sentinel
A sentinel indicating that subsequent items should not be logged.
- property properties¶
- class pmxbot.core.RegexpHandler(*args, **kwargs)¶
Bases:
ContainsHandler
- class_priority = 4¶
priority of this class relative to other classes, precedence to higher
- match(message, channel)¶
Return True if the message is matched by this handler.
- process(message)¶
- class pmxbot.core.Sentinel¶
Bases:
object
A base Sentinel object which can be injected into a series of messages to alter the properties of subsequent messages.
- classmethod augment_items(items, **defaults)¶
Iterate over the items, keeping a adding properties as supplied by Sentinel objects encountered.
>>> from more_itertools.recipes import consume >>> res = Sentinel.augment_items(['a', 'b', NoLog, 'c'], secret=False) >>> res = tuple(res) >>> consume(map(print, res)) a b c >>> [msg.secret for msg in res] [False, False, True]
>>> msgs = ['a', NoLog, 'b', SwitchChannel('#foo'), 'c'] >>> res = Sentinel.augment_items(msgs, secret=False, channel=None) >>> res = tuple(res) >>> consume(map(print, res)) a b c >>> [msg.channel for msg in res] == [None, None, '#foo'] True >>> [msg.secret for msg in res] [False, True, True]
>>> res = Sentinel.augment_items(msgs, channel='#default', secret=False) >>> consume(map(print, [msg.channel for msg in res])) #default #default #foo
- class pmxbot.core.SwitchChannel¶
-
A sentinel indicating a new channel for subsequent messages.
- property properties¶
- pmxbot.core.attach(func, params)¶
Given a function and a namespace of possible parameters, bind any params matching the signature of the function to that function.
- pmxbot.core.command(name=None, aliases=None, doc=None)¶
- pmxbot.core.contains(name, channels=(), exclude=(), rate=1.0, priority=1, doc=None, **kwargs)¶
- pmxbot.core.execat(name, channel, when, doc=None)¶
- pmxbot.core.execdelay(name, channel, howlong, doc=None, repeat=False)¶
- pmxbot.core.get_args(*args, **kwargs)¶
- pmxbot.core.init_config(overrides)¶
Install the config dict as pmxbot.config, setting overrides, and return the result.
- pmxbot.core.initialize(config)¶
Initialize the bot with a dictionary of config items
- pmxbot.core.on_join(doc=None)¶
- pmxbot.core.on_leave(doc=None)¶
- pmxbot.core.regexp(name, regexp, doc=None, **kwargs)¶
- pmxbot.core.run()¶
- exception pmxbot.karma.AlreadyLinked¶
Bases:
ValueError
- class pmxbot.karma.Karma¶
Bases:
SelectableStorage
- classmethod finalize()¶
Delete the various persistence objects
- classmethod initialize()¶
- link(thing1, thing2)¶
Link thing1 and thing2, adding the karma of each into a single entry. If any thing does not exist, it is created.
- class pmxbot.karma.MongoDBKarma(host_uri)¶
Bases:
Karma
,MongoDBStorage
- change(thing, change)¶
- collection_name = 'karma'¶
- import_(item)¶
- list(select=0)¶
- lookup(thing)¶
- repair_duplicate_names()¶
Prior to 1101.1.1, pmxbot would incorrectly create new karma records for individuals with multiple names. This routine corrects those records.
- search(term)¶
- set(thing, value)¶
- class pmxbot.karma.SQLiteKarma(uri)¶
Bases:
Karma
,SQLiteStorage
- change(thing, change)¶
- export_all()¶
- init_tables()¶
- list(select=0)¶
- lookup(thing)¶
- search(term)¶
- set(thing, value)¶
- exception pmxbot.karma.SameName¶
Bases:
ValueError
- pmxbot.karma.bottom10(rest)¶
Return the bottom n (default 10) lowest entities by Karmic value. Use negative numbers for the bottom N.
- pmxbot.karma.karma(nick, rest)¶
Return or change the karma value for some(one|thing)
- pmxbot.karma.top10(rest)¶
Return the top n (default 10) highest entities by Karmic value. Use negative numbers for the bottom N.
- class pmxbot.logging.FullTextMongoDBLogger(host_uri)¶
Bases:
MongoDBLogger
- search(*terms)¶
- classmethod uri_matches(uri)¶
override ‘uri_matches’ to disallow this logger if full text searching is not available.
- class pmxbot.logging.LegacyFullTextMongoDBLogger(host_uri)¶
Bases:
FullTextMongoDBLogger
- search(*terms)¶
- classmethod uri_matches(uri)¶
override ‘uri_matches’ to prefer this logger when the server version doesn’t support $text (MongoDB 2.4 only).
- class pmxbot.logging.Logger¶
Bases:
SelectableStorage
Base Logger class
- clear()¶
Remove all messages from the database.
- classmethod finalize()¶
Delete the various persistence objects
- classmethod initialize()¶
- list_channels()¶
- message(channel, nick, msg)¶
- class pmxbot.logging.MongoDBLogger(host_uri)¶
Bases:
Logger
,MongoDBStorage
- all_messages()¶
- clear()¶
Remove all messages from the database.
- collection_name = 'logs'¶
- static extract_legacy_id(oid)¶
Given a special OID which includes the legacy sqlite ID, extract the sqlite ID.
- get_channel_days(channel)¶
- get_day_logs(channel, day)¶
- get_random_logs(limit)¶
- import_(message)¶
- last_message(channel)¶
- last_seen(nick)¶
- list_channels()¶
- search(*terms)¶
- strike(channel, nick, count)¶
- class pmxbot.logging.SQLiteLogger(uri)¶
Bases:
Logger
,SQLiteStorage
- clear()¶
Remove all messages from the database.
- export_all()¶
- get_channel_days(channel)¶
- get_day_logs(channel, day)¶
- get_random_logs(limit)¶
- init_tables()¶
- last_message(channel)¶
- last_seen(nick)¶
- search(*terms)¶
- strike(channel, nick, count)¶
- pmxbot.logging.log(channel, rest)¶
Enable or disable logging for a channel; use ‘please’ to start logging and ‘stop please’ to stop.
- pmxbot.logging.log_message(channel, nick, rest)¶
- pmxbot.logging.logs(channel)¶
Where can one find the logs?
- pmxbot.logging.parse_date(record)¶
Parse a date from sqlite. Assumes the date is in US/Pacific time zone.
- pmxbot.logging.strike(channel, nick, rest)¶
Strike last <n> statements from the record
- pmxbot.logging.where(channel, nick, rest)¶
When did pmxbot last see <nick> speak?
- class pmxbot.slack.Bot(server, port, nickname, channels, password=None)¶
Bases:
Bot
- get_email_username_map(ttl_hash=2741)¶
Generate a map {email -> slack username}
- Parameters:
ttl_hash – hash to control the lru_cache
- handle_message(msg)¶
- start()¶
- pmxbot.slack.get_ttl_hash(seconds=None)¶
Return the same value withing seconds time period
- default seconds:
7 days == 7days*24hours*60min*60seconds == 604800 seconds
Cache time can be configured in config using slack_cache in seconds
System commands
- pmxbot.system.ctlaltdel(rest)¶
Quits pmxbot. A supervisor should automatically restart it.
- pmxbot.system.help(rest)¶
Help (this command)
- pmxbot.system.logo()¶
The pmxbot logo in ascii art. Fixed-width font recommended!
>>> from more_itertools import consume >>> consume(map(print, logo())) MI=7+MM .M: M=.. .M M ...
- class pmxbot.storage.MongoDBStorage(host_uri)¶
Bases:
Storage
- scheme = 'mongodb'¶
- classmethod uri_matches(uri)¶
- class pmxbot.storage.SQLiteStorage(uri)¶
Bases:
Storage
,_local
- close()¶
- init_tables()¶
- scheme = 'sqlite'¶
- classmethod uri_matches(uri)¶
- class pmxbot.storage.SelectableStorage¶
Bases:
object
A mix-in for storage classes which will construct a suitable subclass based on the URI.
- classmethod finalize()¶
Delete the various persistence objects
- classmethod from_URI(URI=None)¶
- classmethod migrate(source_uri, dest_uri)¶
- classmethod uri_matches(uri)¶
- pmxbot.storage.migrate_all(source, dest)¶
- class pmxbot.notify.MongoDBNotify(host_uri)¶
Bases:
Notify
,MongoDBStorage
- collection_name = 'notify'¶
- lookup(nick)¶
- notify(fromnick, tonick, message)¶
- class pmxbot.notify.Notify¶
Bases:
SelectableStorage
- classmethod finalize()¶
Delete the various persistence objects
- classmethod init()¶
- class pmxbot.notify.SQLiteNotify(uri)¶
Bases:
Notify
,SQLiteStorage
- init_tables()¶
- lookup(nick)¶
- notify(fromnick, tonick, message)¶
- pmxbot.notify.donotify(nick, rest)¶
notify <nick> <message>
- pmxbot.notify.notifier(client, nick)¶