You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

93 lines
3.0 KiB

"""A State Of Trance chat simulator.
2 to 3 chunks per message. Chunks can receive one effect (low proc).
Chunks:
- repeat same thing (3 to 6)
- interleave two or three things of one theme, repeat (2 to 4)
- repeat three or four things of one theme (3 to 4 each)
Effects:
- interleave a word with one thing
- just add a word somewhere
Words are actually the requester's name but it could be extended.
"""
import random
from itertools import zip_longest
from edmond.plugin import Plugin
from edmond.utils import proc
class AmbiencePlugin(Plugin):
REQUIRED_CONFIGS = ["commands", "themes", "effect_rate", "target_word"]
def __init__(self, bot):
super().__init__(bot)
@property
def themes(self):
return self.config["themes"]
def on_pubmsg(self, event):
if not self.should_handle_command(event.arguments[0]):
return False
target = None
contents = self.command.content.split()
if len(contents) >= 2 and contents[0] == self.config["target_word"]:
target = " ".join(contents[1:])
self.bot.say(event.target, self.get_reply(event, target=target))
return True
def get_reply(self, event, target=None):
reply = ""
num_chunks = random.randint(2, 3)
for i in range(num_chunks):
reply += self.get_chunk()
if target is not None or proc(self.config["effect_rate"]):
effect_word = (target or event.source.nick).upper()
reply = self.apply_effect(reply, effect_word)
return reply
def get_chunk(self):
return {
1: self.repeat_same,
2: self.interleave,
3: self.repeat_from_theme,
}[random.randint(1, 3)]()
def repeat_same(self):
random_theme_values = random.choice(list(self.themes.values()))
random_item = random.choice(random_theme_values)
return random_item * random.randint(3, 6)
def interleave(self):
random_theme_values = random.choice(list(self.themes.values()))
sample_size = min(len(random_theme_values), random.randint(2, 4))
random_items = "".join(random.sample(random_theme_values, sample_size))
return random_items * random.randint(2, 4)
def repeat_from_theme(self):
random_theme_values = random.choice(list(self.themes.values()))
sample_size = min(len(random_theme_values), random.randint(3, 4))
random_items = random.sample(random_theme_values, sample_size)
reps = random.randint(3, 4)
return "".join(item * reps for item in random_items)
def apply_effect(self, chunk, word):
return {1: self.insert_word, 2: self.interleave_word,}[
random.randint(1, 2)
](chunk, word)
def insert_word(self, chunk, word):
index = random.randint(0, len(chunk))
return chunk[:index] + word + chunk[index:]
def interleave_word(self, chunk, word):
return "".join(
a + b for a, b in zip_longest(chunk, word, fillvalue="")
)