Fouras "poilau" feature is now less frequent, and more accurate

This commit is contained in:
Anselme FRANÇOIS 2023-07-11 23:13:20 +02:00
parent e75ee8d7cc
commit 4558fb2e1d
4 changed files with 197 additions and 92 deletions

View File

@ -15,6 +15,10 @@ class BaseModule:
async def handle_message(self, message): async def handle_message(self, message):
raise NotImplementedError raise NotImplementedError
async def get_guild_name(self, guildId) -> str:
guild = await self._client.fetch_guild(guildId)
return "[Server={0}]".format(guild.name)
async def get_channel_name(self, channel) -> str: async def get_channel_name(self, channel) -> str:
if isinstance(channel, discord.DMChannel): if isinstance(channel, discord.DMChannel):
dm_channel = await self._client.fetch_channel(channel.id) dm_channel = await self._client.fetch_channel(channel.id)

View File

@ -3,6 +3,7 @@ import random
import re import re
import json import json
from unidecode import unidecode from unidecode import unidecode
import appdirs
API_URL = "".join( API_URL = "".join(
[ [
@ -32,12 +33,15 @@ INVALID_ID = """
Numéro d'énigme invalide, merci de saisir un numéro entre 1 et {len} Numéro d'énigme invalide, merci de saisir un numéro entre 1 et {len}
""" """
RIDDLES_FILE = "riddles.txt"
ANSWERS_FILE = "answers.txt"
SAVE_FILE = appdirs.user_data_dir() + "/fouras_riddles.json"
class FourasModule(BaseModule): class FourasModule(BaseModule):
def load(self): def load(self):
with open("riddles.txt", "r", encoding=ENCODING) as r_file: with open(RIDDLES_FILE, "r", encoding=ENCODING) as r_file:
self._client.riddles = r_file.read().split("\n\n") self._client.riddles = r_file.read().split("\n\n")
with open("answers.txt", "r", encoding=ENCODING) as a_file: with open(ANSWERS_FILE, "r", encoding=ENCODING) as a_file:
self._client.answers = [line.strip() for line in a_file.readlines()] self._client.answers = [line.strip() for line in a_file.readlines()]
print(f"Loaded {len(self._client.riddles)} riddles") print(f"Loaded {len(self._client.riddles)} riddles")
@ -47,6 +51,9 @@ class FourasModule(BaseModule):
dump_channel = dict(value) dump_channel = dict(value)
dump_channel["message"] = dump_channel["message"].id dump_channel["message"] = dump_channel["message"].id
dump[key.id] = dump_channel dump[key.id] = dump_channel
with open(SAVE_FILE, "w") as file:
json.dump(dump, file)
print('Saved fouras riddles state in file "{0}"'.format(SAVE_FILE))
return dump return dump
def new_riddle(self, channel, index): def new_riddle(self, channel, index):

View File

@ -2,23 +2,32 @@ from .base import BaseModule
import random import random
import time import time
import json import json
import appdirs
RHYMES_FILE = "rhymes.txt" RHYMES_FILE = "rhymes.json"
SAVE_FILE = appdirs.user_data_dir() + "/poilau_save.json"
class RhymesModule(BaseModule): class RhymesModule(BaseModule):
rhymes: dict = {} rhymes: list = []
cooldown: dict = {} guild_config: dict = {}
def load(self): def load(self):
with open("rhymes.json", "r") as f: with open(RHYMES_FILE, "r") as f:
self.rhymes = json.load(f) self.rhymes = json.load(f)
try:
with open(SAVE_FILE, "r") as file:
self.guild_config = json.load(file)
print('Loaded poilau save file "{0}"'.format(SAVE_FILE))
except FileNotFoundError:
print('No previous "{0}" save file found'.format(SAVE_FILE))
except json.JSONDecodeError:
print('"{0}" is an invalid JSON file.'.format(SAVE_FILE))
def save(self): def save(self):
dump = {} with open(SAVE_FILE, "w") as file:
for key, value in self.cooldown.items(): json.dump(self.guild_config, file)
dump[key.id] = value - time.time() print('Saved poilau state in file "{0}"'.format(SAVE_FILE))
return dump
def get_last_word(self, ch: str) -> str: def get_last_word(self, ch: str) -> str:
truncated = ch truncated = ch
@ -28,39 +37,50 @@ class RhymesModule(BaseModule):
if truncated[-1].isalpha() and truncated[-2].isalpha(): if truncated[-1].isalpha() and truncated[-2].isalpha():
break break
truncated = truncated[:-1] truncated = truncated[:-1]
return truncated truncated = truncated.split(' ')[-1]
if truncated.isalpha():
return truncated
else:
return ""
def poil_auquel(self, ch: str) -> str: def poil_auquel(self, ch: str) -> str:
for key in self.rhymes: for rhyme in self.rhymes:
if ch.endswith(tuple(self.rhymes[key]["keys"])): if ch in rhyme["blacklist"]:
return random.choice(self.rhymes[key]["rhymes"]) return ""
if ch.endswith(tuple(rhyme["keys"])):
return random.choice(rhyme["rhymes"])
return "" return ""
async def handle_message(self, message): async def handle_message(self, message):
message_content = message.content.lower() message_content = message.content.lower()
if message_content == "debug": if message_content == "debug poilau":
dump = {} if(message.author.id == 151626081458192384):
for key, value in self.cooldown.items(): dump = {}
channel_name = await self.get_channel_name(key) for key, value in self.guild_config.items():
dump[channel_name] = value - time.time() channel_name = await self.get_guild_name(key)
await message.author.send( dump[channel_name] = value - time.time()
"```json\n{0}```".format(json.dumps(dump, ensure_ascii=False, indent=4)) await message.author.send(
) "```json\n{0}```".format(json.dumps(dump, ensure_ascii=False, indent=4))
)
return
if message_content == "tg fouras" and message.guild:
self.guild_config[message.guild.id] = {43000,1.0}
await message.channel.send("ok :'(")
return return
last_word = self.get_last_word(message_content) last_word = self.get_last_word(message_content)
if message.author != self._client.user and last_word: if message.author != self._client.user and message.guild and last_word:
poil = self.poil_auquel(last_word) poil = self.poil_auquel(last_word)
# cooldown = 0 guild_config = self.guild_config.get(message.guild.id, {"cooldown": 0, "self-control": 1.0})
# if message.channel in self.cooldown: if poil and time.time() - guild_config["cooldown"] > 0:
# cooldown = self.cooldown[message.channel] if random.random() < guild_config["self-control"]:
cooldown = self.cooldown.get(message.channel, 0) self.guild_config[message.guild.id]["self-control"] *= 0.9
return
if poil and time.time() - cooldown > 0:
wait_time = random.randint(0, 900) wait_time = random.randint(0, 900)
if bool(random.getrandbits(1)): if bool(random.getrandbits(1)):
wait_time = random.randint(900, 10800) wait_time = random.randint(900, 10800)
self.cooldown[message.channel] = time.time() + wait_time self.guild_config[message.guild.id] = {"cooldown": time.time() + wait_time, "self-control": 1.0}
await message.channel.send(poil) await message.channel.send(poil)
return return

View File

@ -1,14 +1,53 @@
{ [
"E": { {
"sound": "E",
"blacklist": ["cheveux", "cheveu", "queue", "queues"],
"keys": [ "keys": [
"eu", "eu",
"eus",
"eux" "eux"
], ],
"rhymes": [ "rhymes": [
"Poil aux cheveux." "Poil aux cheveux.",
"Poil à la queue."
] ]
}, },
"OUS": { {
"sound": "OUB",
"blacklist": ["zboub", "zboubs"],
"keys": [
"oub",
"oube",
"oob",
"oub"
],
"rhymes": [
"Poil aux zboub."
]
},
{
"sound": "ETTE",
"blacklist": ["quéquette", "quéquettes"],
"keys": [
"ette",
"ett",
"èt",
"ète",
"ettes",
"etts",
"èts",
"ètes",
"êtes",
"aite",
"aites"
],
"rhymes": [
"Poil à la quéquette."
]
},
{
"sound": "OUS",
"blacklist": ["pouce", "pouces"],
"keys": [ "keys": [
"ous", "ous",
"ousse", "ousse",
@ -20,15 +59,21 @@
"Poil au pouce." "Poil au pouce."
] ]
}, },
"US": { {
"sound": "US",
"blacklist": ["anus"],
"keys": [ "keys": [
"us" "us",
"usse",
"usses"
], ],
"rhymes": [ "rhymes": [
"Poil à l'anus." "Poil à l'anus."
] ]
}, },
"OU": { {
"sound": "OU",
"blacklist": ["cou", "genou", "genous"],
"keys": [ "keys": [
"ou", "ou",
"où", "où",
@ -39,12 +84,16 @@
"Poil au genou." "Poil au genou."
] ]
}, },
"O": { {
"sound": "O",
"blacklist": ["dos"],
"keys": [ "keys": [
"au", "au",
"aux", "aux",
"o", "o",
"os", "os",
"ot",
"ots",
"oh", "oh",
"ho" "ho"
], ],
@ -52,21 +101,26 @@
"Poil au dos." "Poil au dos."
] ]
}, },
"OL": { {
"sound": "OL",
"blacklist": ["guiboles", "guibole"],
"keys": [ "keys": [
"ol", "ol",
"ols", "ols",
"ole", "ole",
"oles", "oles",
"olle", "olle",
"ollesaul", "olles",
"aul",
"auls" "auls"
], ],
"rhymes": [ "rhymes": [
"Poil aux guiboles." "Poil aux guiboles."
] ]
}, },
"OUL": { {
"sound": "OUL",
"blacklist": ["moule", "moules", "boule", "boules"],
"keys": [ "keys": [
"oule", "oule",
"oules", "oules",
@ -78,7 +132,9 @@
"Poil aux boules." "Poil aux boules."
] ]
}, },
"ULVE": { {
"sound": "ULVE",
"blacklist": ["vulve", "vulves"],
"keys": [ "keys": [
"ulve", "ulve",
"ulves" "ulves"
@ -87,85 +143,82 @@
"Poil à la vulve." "Poil à la vulve."
] ]
}, },
"OR": { {
"sound": "IER",
"blacklist": ["derrière", "derrières"],
"keys": [ "keys": [
"or", "èr",
"ors", "èrs",
"ore", "ère",
"ores", "ères",
"aur", "erre",
"aurs" "erres",
], "ert"
"rhymes": [
"Poil au corps."
]
},
"IER": {
"keys": [
"ier",
"iers",
"ierre",
"ierres",
"ayé"
], ],
"rhymes": [ "rhymes": [
"Poil au derrière." "Poil au derrière."
] ]
}, },
"IEN": { {
"sound": "IEN",
"blacklist": ["chien", "chiens"],
"keys": [ "keys": [
"ien", "ien",
"iens", "iens"
"ient"
], ],
"rhymes": [ "rhymes": [
"Poil de chien." "Poil de chien."
] ]
}, },
"ET": { {
"sound": "ET",
"blacklist": ["nez", "pieds", "pied"],
"keys": [ "keys": [
"et", "et",
"é", "é",
"è", "ez"
"ait",
"ais",
"ai",
"ez",
"ied",
"ieds"
], ],
"rhymes": [ "rhymes": [
"Poil au nez.", "Poil au nez.",
"Poil aux pieds." "Poil aux pieds."
] ]
}, },
"OI": { {
"sound": "OI",
"blacklist": ["doigts", "doigt"],
"keys": [ "keys": [
"oi", "oi",
"oie", "oie",
"ois", "ois",
"oit", "oit",
"oix",
"oa" "oa"
], ],
"rhymes": [ "rhymes": [
"Poil aux doigts." "Poil aux doigts."
] ]
}, },
"AN": { {
"sound": "AN",
"blacklist": ["dents", "dent"],
"keys": [ "keys": [
"an",
"ant", "ant",
"ants", "ants",
"en",
"ment", "ment",
"ments" "ments",
"rends",
"rents"
], ],
"rhymes": [ "rhymes": [
"Poil aux dents. " "Poil aux dents. "
] ]
}, },
"ESSE": { {
"sound": "ESSE",
"blacklist": ["fesses", "fesse"],
"keys": [ "keys": [
"ès",
"ess",
"esse", "esse",
"esses", "esses",
"aisse", "aisse",
@ -175,8 +228,11 @@
"Poil aux fesses." "Poil aux fesses."
] ]
}, },
"EL": { {
"sound": "EL",
"blacklist": ["aisselles", "aisselle"],
"keys": [ "keys": [
"èl",
"el", "el",
"els", "els",
"elle", "elle",
@ -188,17 +244,22 @@
"Poil aux aisselles." "Poil aux aisselles."
] ]
}, },
"ACHE": { {
"sound": "ACHE",
"blacklist": ["moustache", "moustaches"],
"keys": [ "keys": [
"ache", "ache",
"ach", "ach",
"ash" "ash",
"asch"
], ],
"rhymes": [ "rhymes": [
"Poil de moustache." "Poil de moustache."
] ]
}, },
"IN": { {
"sound": "IN",
"blacklist": ["main", "mains"],
"keys": [ "keys": [
"ain", "ain",
"ein" "ein"
@ -207,20 +268,23 @@
"Poil aux mains." "Poil aux mains."
] ]
}, },
"TON": { {
"sound": "TON",
"blacklist": ["menton", "mentons"],
"keys": [ "keys": [
"ton", "ton",
"tons", "tons",
"thons", "thon",
"thons" "thons"
], ],
"rhymes": [ "rhymes": [
"Poil au menton." "Poil au menton."
] ]
}, },
"ON": { {
"sound": "ON",
"blacklist": ["fion", "fions"],
"keys": [ "keys": [
"on",
"ont", "ont",
"onts", "onts",
"ons", "ons",
@ -231,7 +295,9 @@
"Poil au fion." "Poil au fion."
] ]
}, },
"OUILLE": { {
"sound": "OUILLE",
"blacklist": ["couille", "couilles"],
"keys": [ "keys": [
"ouille", "ouille",
"ouilles" "ouilles"
@ -240,7 +306,9 @@
"Poil aux couilles." "Poil aux couilles."
] ]
}, },
"ATTE": { {
"sound": "ATTE",
"blacklist": ["chatte", "chattes"],
"keys": [ "keys": [
"atte", "atte",
"ate", "ate",
@ -254,7 +322,9 @@
"Poil à la chatte." "Poil à la chatte."
] ]
}, },
"A": { {
"sound": "A",
"blacklist": ["bras"],
"keys": [ "keys": [
"a", "a",
"à", "à",
@ -265,7 +335,9 @@
"Poil au bras." "Poil au bras."
] ]
}, },
"I": { {
"sound": "I",
"blacklist": ["vessie", "zizi", "zizis"],
"keys": [ "keys": [
"i", "i",
"is", "is",
@ -277,7 +349,9 @@
"Poil au zizi." "Poil au zizi."
] ]
}, },
"U": { {
"sound": "U",
"blacklist": ["cul", "culs"],
"keys": [ "keys": [
"u", "u",
"hu", "hu",
@ -287,4 +361,4 @@
"Poil au cul." "Poil au cul."
] ]
} }
} ]