aboutsummaryrefslogtreecommitdiffstats
path: root/herald/respond.py
blob: 066ea81751fc5c58d3e6700fff825467c8cee48a (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
"""
Sopel plugin: keyword responder

Responds to any channel message containing one of the configured keywords
with a randomly chosen response line. Matching is case-insensitive.
Can be paused/resumed by the owner via !pause / !resume.

  [respond]
  keywords =
      word1
      word2
  responses =
      reply one
      reply two
"""

import random

from sopel import plugin
from sopel.config.types import ListAttribute, StaticSection


class RespondSection(StaticSection):
    keywords  = ListAttribute("keywords")
    responses = ListAttribute("responses")


def setup(bot):
    bot.settings.define_section("respond", RespondSection)


@plugin.rule(r"(?s:.*)")
@plugin.require_chanmsg
def respond(bot, trigger):
    if bot.memory.get("herald_paused"):
        return

    keywords  = bot.settings.respond.keywords
    responses = bot.settings.respond.responses

    if not keywords or not responses:
        return

    try:
        msg = trigger.group(0).casefold()
        if any(kw.casefold() in msg for kw in keywords):
            bot.say(random.choice(responses))
    except (UnicodeError, AttributeError):
        pass