Configuration system overhaul

This commit is contained in:
2025-11-24 19:27:10 -05:00
parent f45942113e
commit 386b50ed22

247
bot.py
View File

@@ -4,81 +4,194 @@ import os
import asyncio import asyncio
import random import random
class MessageTrigger: class MessageCondition:
def handle_message(self, message:discord.Message): def check_condition(self, message:discord.Message) -> bool: return True
pass
class TextTrigger(MessageTrigger): class RandomCondition(MessageCondition):
def __init__(self, triggers:list[str], response:str): def __init__(self, chance:float):
self.triggers = triggers self.chance = chance
def check_condition(self, message):
if random.random() > self.chance:
return False
return True
class TextCondition(MessageCondition):
def __init__(self, text:str):
self.text = text
def check_condition(self, message):
processed = process_string(message.content)
if self.text in processed:
return True
return False
class AndCondition(MessageCondition):
def __init__(self, conditions:list[MessageCondition]):
self.conditions = conditions
def check_condition(self, message):
for condition in self.conditions:
if not condition.check_condition(message):
return False
return True
class OrCondition(MessageCondition):
def __init__(self, conditions:list[MessageCondition]):
self.conditions = conditions
def check_condition(self, message):
for condition in self.conditions:
if condition.check_condition(message):
return True
return False
class MessageResponse:
def respond(self, message:discord.Message): pass
class TextResponse(MessageResponse):
def __init__(self, response:str):
self.response = response self.response = response
def handle_message(self, message:discord.Message): def respond(self, message:discord.Message):
processed_string = process_string(message.content) asyncio.create_task(message.reply(self.response))
for trigger in self.triggers:
if trigger in processed_string:
asyncio.create_task(message.reply(self.response))
return
class RandomTrigger(MessageTrigger): class EmojiResponse(MessageResponse):
def __init__(self, chance:float, trigger:MessageTrigger): def __init__(self, emoji_names:list[str]):
self.chance = chance
self.trigger = trigger
def handle_message(self, message):
if random.random() > self.chance:
return
self.trigger.handle_message(message)
class EmojiTrigger(MessageTrigger):
def __init__(self, triggers:list[str], emoji_names:list[str]):
self.triggers = triggers
self.emoji_names = emoji_names self.emoji_names = emoji_names
def handle_message(self, message:discord.Message): def respond(self, message:discord.Message):
processed_string = process_string(message.content) for emoji in message.guild.emojis:
for trigger in self.triggers: if emoji.name in self.emoji_names:
if trigger in processed_string: asyncio.create_task(message.add_reaction(emoji))
for emoji in message.guild.emojis: return
if emoji.name in self.emoji_names:
asyncio.create_task(message.add_reaction(emoji))
return
triggers:list[MessageTrigger] = [ class MessageHandler:
RandomTrigger(0.5, def __init__(self, conditions:list[MessageCondition], responses:list[MessageResponse]):
TextTrigger([ self.conditions = conditions
"lessthan", self.responses = responses
"focus",
"hypnosis", def handle_message(self, message:discord.Message):
"didntnotice", for condition in self.conditions:
"evennotice", if condition.check_condition(message):
"oblivion", for response in self.responses:
"barelyrecognize" response.respond(message)
], "WHAT ARE YOU WAITING FOR?") return
less_than_conditions = [
TextCondition("lessthan"),
TextCondition("focus"),
TextCondition("hypnosis"),
TextCondition("didntnotice"),
TextCondition("evennotice"),
TextCondition("oblivion"),
TextCondition("barelyrecognize"),
TextCondition("violence")
]
handlers:list[MessageHandler] = [
MessageHandler(
[
AndCondition(
[
RandomCondition(0.7),
OrCondition(less_than_conditions)
]
)
],
[
TextResponse("WHAT ARE YOU WAITING FOR?")
]
), ),
EmojiTrigger([ MessageHandler(
"lessthan", less_than_conditions,
"focus", [
"hypnosis", EmojiResponse("lessthan")
"didntnotice", ]
"evennotice",
"oblivion",
"barelyrecognize"
], "lessthan"),
TextTrigger([
"pieces",
"peices"
], "Put. It. Together."),
RandomTrigger(0.25,
TextTrigger([
"annoy"
], "Stop annoying yourself.")
), ),
RandomTrigger(0.15, MessageHandler(
TextTrigger([ [
"bot" TextCondition("shutup")
], "I'm not a bot.") ],
[
TextResponse("SILENCE"),
EmojiResponse("lessthan")
]
), ),
MessageHandler(
[
TextCondition("pieces"),
TextCondition("peices")
],
[
TextResponse("Put. It. Together.")
]
),
MessageHandler(
[
AndCondition(
[
TextCondition("annoy"),
RandomCondition(0.5)
]
)
],
[
TextResponse("Stop annoying yourself.")
]
),
MessageHandler(
[
AndCondition(
[
TextCondition("bot"),
RandomCondition(0.35)
]
)
],
[
TextResponse("I'm not a bot.")
]
)
# RandomTrigger(0.5,
# TextTrigger([
# "lessthan",
# "focus",
# "hypnosis",
# "didntnotice",
# "evennotice",
# "oblivion",
# "barelyrecognize",
# "justify"
# ], "WHAT ARE YOU WAITING FOR?")
# ),
# EmojiTrigger([
# "lessthan",
# "focus",
# "hypnosis",
# "didntnotice",
# "evennotice",
# "oblivion",
# "recognize",
# "justify"
# ], "lessthan"),
# TextTrigger([
# "pieces",
# "peices"
# ], "Put. It. Together."),
# RandomTrigger(0.25,
# TextTrigger([
# "annoy"
# ], "Stop annoying yourself.")
# ),
# RandomTrigger(0.15,
# TextTrigger([
# "bot"
# ], "I'm not a bot.")
# ),
] ]
dotenv.load_dotenv(".env") dotenv.load_dotenv(".env")
@@ -100,8 +213,8 @@ async def on_message(message):
return return
print(f"Message from {message.author}: {message.content}") print(f"Message from {message.author}: {message.content}")
for trigger in triggers: for handler in handlers:
trigger.handle_message(message) handler.handle_message(message)
def process_string(string:str) -> str: def process_string(string:str) -> str:
characters_to_remove = ",.-_;:'\"?\\/|()*&^%$#@!" characters_to_remove = ",.-_;:'\"?\\/|()*&^%$#@!"