hotdog/hotdog/command/orakel.py

330 lines
11 KiB
Python

from random import choice, choices, randint, random
from ..functions import reply
from ..models import Message
HELP = """Gibt Antworten auf Fragen.
@me: <eine Frage>?
"""
# ---
# WARNING! HERE BE SPOILERS!
# From this point onward there's all the funny (and not so funny) bits the bot
# will use to respond to your queries.
# If you don't want the mystery spoiled for you and be surprised by what the
# bot might come up with, DON'T read on! Skip to the end of the file instead.
# ---
ka = (
"Keine Ahnung.",
"Das weiß ich leider nicht.",
"Ich weiß es nicht.",
"Ich weiß es auch nicht.",
"Frag besser jemanden, der sich damit auskennt.",
"Da wendest du dich besser eine Fachkraft.",
"Woher soll ich das wissen?",
"Das weiß niemand so genau ...",
"Das kann dir keiner beantworten ...",
"Eine Frage, so alt wie die Menschheit!",
"Das ist eine gute Frage.",
"Wer weiß ...",
"Boa, keine Ahnung, ey!",
"Seh ich so aus, als ob ich das wüsste?",
"Wie kommst du darauf, dass ich das wüsste?",
"Bin ich die Auskunft, oder was?",
"Ich bin doch nicht die Auskunft!",
"Das ist mir doch egal ...",
"Das solltest du besser mit dir selbst ausmachen.",
"Das beantwortest du dir am besten mal selbst.",
"Ich glaube, das weißt du selbst ganz genau.",
"Das weißt du doch selbst ganz genau.",
"Schau tief in dich, dort findest du die Antwort.",
"Du kämpfst wie eine Kuh!",
"Die Antwort ist ... 42.",
"Sechs mal Neun.",
"Das fragst du besser deine Mama.",
)
ja = (
"Ja",
"Ja!",
"Ja.",
"Jap.",
"Jo.",
"Jau!",
"Joa.",
"Joooaaaa.",
"Jooo",
"Klar!",
"Klaaaar.",
"Ja, klar.",
"Klar doch.",
"Aber klar doch.",
"Na sicher.",
"Sicher doch.",
"Joa, warum nicht.",
"Jo, warum denn nicht.",
"Auf jeden Fall!",
"Besser wär's.",
)
nein = (
"Nein",
"Nee",
"Besser nicht.",
"Nein!",
"Niemals!",
"Auf keinen Fall!",
)
vielleicht = (
"Frag mich später noch mal.",
"Das weiß ich nicht genau.",
"Ja, vielleicht.",
"Nein, vielleicht besser nicht.",
)
def random_room_participant(message: Message) -> str:
users = [
u
for uid, u in message.room.users.items()
if uid not in (message.event.sender, message.app.client.user)
]
if not users:
return ""
user = choice(users)
return user.display_name or user.user_id
numnames = [
"null",
"ein",
"zwei",
"drei",
"vier",
"fünf",
"sechs",
"sieben",
"acht",
"neun",
"zehn",
"elf",
"zwölf",
]
praepos = (
"vor",
"hinter",
"über",
"unter",
"auf",
"neben", # careful, this cannot be contracted with dativ
)
wwords = {
"wann": (
# Time
lambda m: f"{choice(['Um ', ''])}{randint(0, 23)} Uhr",
lambda m: f"{choice(['Um ', ''])}{randint(0, 23)}:{randint(1, 59):02} Uhr",
lambda m: f"{choice(['Um ', ''])}{randint(0, 23)} Uhr und {randint(1, 59)} Minuten",
lambda m: f"{choice(['Um ', ''])}{randint(1, 59)} Minuten {choice(['vor','nach'])} {randint(0, 12)}",
lambda m: f"{choice(['Um ', ''])}Viertel {choice(['vor','nach'])} {randint(0, 12)}",
lambda m: f"Um halb {randint(1, 12)}",
"Um Mitternacht",
lambda m: f"Am {choice(['Nach', 'Vor'])}mittag",
# Date
"Morgen",
"Übermorgen",
"Gestern",
"Vorgestern",
lambda m: f"{choice(['Nächst', 'Vorig'])}e Woche",
lambda m: f"{choice(['Vor', 'In'])} {randint(2, 12)} {choice(['Wochen', 'Monaten'])}",
lambda m: f"{choice(['Vor', 'In'])} {randint(2, 9999)} Jahren",
lambda m: f"{choice(['Vor', 'In'])} {randint(2, 999)} Millionen Jahren",
lambda m: f"Am {randint(1, 28)}.{randint(1, 12)}.{randint(9, 9999)}",
# Date-time
lambda m: f"{choice(['Vor', 'In'])} {randint(2, 17)} Jahren, {randint(2,360)} Tagen, {randint(2,23)} Stunden, {randint(2,59)} Minuten und {randint(2,59)} Sekunden",
lambda m: f"Am {randint(1, 28)}.{randint(1, 12)}.{randint(9, 9999)} um {randint(0, 23)}:{randint(1, 59):02} Uhr",
),
"warum": (),
"was": (),
"wer": (
"Deine Mama!",
"Die Polizei.",
"Die drei Fragezeichen!",
"TKKG.",
"Tim und Struppi.",
"Die fünf Freunde.",
"Der Osterhase.",
"Die Ferienbande! Yaaaaay.",
"Der Weihnachtsmann.",
"Frau Holle.",
"Gott!",
"Irgendein Gott.",
"Du!",
"Du selbst.",
"Ein Höhlentroll mit einem dicken Prügel.",
"Eine höhere Macht.",
"Ein unbekanntes Wesen.",
"Ein unbekanntes Wesen aus einer unbekannten Galaxie.",
"Aliens!",
"Graf Zahl.",
"Die Russen!",
"Die USA!",
"Die Reichsbürger!",
"Die Regierung.",
"Die Presse.",
"Die Illuminaten!",
"Die internationale Verschwörung e.V.!",
"Dein Nachbar.",
"Die Kanzlerin.",
"Der Präsident.",
"Der Vorsitzende vom Schützenverein.",
"Der Postbote.",
"Die Behörden.",
"Die Wissenschaft.",
"Die sechs von der Müllabfuhr.",
"Der, der grade hinter dir steht und dir zuguckt.",
"Die, die sich hinter deinem Schrank versteckt hat.",
"Der Typ der in der Ecke steht.",
"Die Anderen; immer die Anderen.",
lambda m: random_room_participant(m) or "Irgendwer.",
),
"wie": (
"Das weiß ich leider auch nicht, vielleicht mit einer Telefonlawine?",
"Am besten gar nicht.",
"Das ist schwierig zu sagen.",
*ka,
),
"wieso": (),
"wieviel": (
"Nichts",
lambda m: choice(["Ungefähr ", "Genau ", ""]) + choice(numnames[2:]),
lambda m: choice(["Ungefähr ", "Genau ", ""]) + f"{23 * random():n}",
lambda m: choice(["Ungefähr ", "Genau ", ""]) + str(randint(1, 10)),
lambda m: choice(["Ungefähr ", "Genau ", ""]) + str(randint(7, 23)),
lambda m: choice(["Ungefähr ", "Genau ", ""]) + str(randint(17, 42)),
lambda m: choice(["Ungefähr ", "Genau ", ""]) + str(randint(23, 99)),
lambda m: choice(["Ungefähr ", "Genau ", ""]) + str(randint(100, 1_000_000)),
"Unendlich!",
),
"wieviele": (
lambda m: choice(["Ungefähr ", "Genau ", ""]) + choice(numnames[2:]),
lambda m: choice(["Ungefähr ", "Genau ", ""]) + f"{23 * random():n}",
lambda m: choice(["Ungefähr ", "Genau ", ""]) + str(randint(1, 10)),
lambda m: choice(["Ungefähr ", "Genau ", ""]) + str(randint(7, 23)),
lambda m: choice(["Ungefähr ", "Genau ", ""]) + str(randint(17, 42)),
lambda m: choice(["Ungefähr ", "Genau ", ""]) + str(randint(23, 99)),
lambda m: choice(["Ungefähr ", "Genau ", ""]) + str(randint(100, 1_000_000)),
"Ein paar.",
"Nur ein paar.",
"Nur ein paar wenige.",
"Wirklich viele.",
"Einige.",
"Ne ganze Menge.",
"Zu viele!",
"Ziemlich viele!",
"Unendlich viele!",
),
"wo": (
lambda m: f"Genau {choice(praepos)} dir!",
lambda m: f"{choice(praepos).title()} dir!",
lambda m: f"{choice(praepos).title()} dem Bett.",
lambda m: f"{choice(praepos).title()} dem Kopfkissen.",
lambda m: f"{choice(praepos).title()} dem Couche-Kissen.",
lambda m: f"{choice(praepos).title()} dem Tisch.",
lambda m: f"{choice(praepos).title()} der Kommode.",
lambda m: f"{choice(praepos).title()} dem Stuhl.",
"Droben auf dem Berge.",
"In der Garage.",
"Im Klo.",
"Auf der Straße.",
"In der Gasse.",
"In den Wolken.",
"Vorm Fernseher.",
"Im Cyberspace.",
"Genau vor deiner Nase.",
"Auf deinem Kopf.",
"Unter deinem Hintern.",
"Du sitzt drauf!",
"Im Gefängnis.",
"Im Bundestag.",
"Auf der dunklen Seite des Mondes.",
"In einer weit entfernten Galaxie.",
"Auf dem Mond.",
"Auf der ISS.",
"Im Inneren der Erde.",
),
"woher": (),
"wohin": (),
"weshalb": (),
"welche": (),
"welcher": (),
"welches": (),
"um wieviel uhr": (
lambda m: f"Um {randint(0, 23)} Uhr",
lambda m: f"Um {randint(0, 23)}:{randint(1, 59):02} Uhr",
lambda m: f"Um {randint(0, 23)} Uhr und {randint(1, 59)} Minuten",
lambda m: f"Um {randint(1, 59)} Minuten {choice(['vor','nach'])} {randint(0, 12)}",
lambda m: f"Um Viertel {choice(['vor','nach'])} {randint(0, 12)}",
lambda m: f"Um halb {randint(1, 12)}",
),
"seit wann": (
lambda m: f"Seit {randint(0, 23)} Uhr",
lambda m: f"Seit {randint(0, 23)}:{randint(1, 59):02} Uhr",
lambda m: f"Seit {randint(0, 23)} Uhr und {randint(1, 59)} Minuten",
lambda m: f"Seit {randint(1, 59)} Minuten {choice(['vor','nach'])} {randint(0, 12)}",
lambda m: f"Seit Viertel {choice(['vor','nach'])} {randint(0, 12)}",
lambda m: f"Seit halb {randint(1, 12)}",
# Date
"Seit Gestern",
"Seit Vorgestern",
lambda m: f"Seit vorige Woche",
lambda m: f"Seit {randint(2, 12)} {choice(['Wochen', 'Monaten'])}",
lambda m: f"Seit {randint(2, 9999)} Jahren",
lambda m: f"Seit {randint(2, 999)} Millionen Jahren",
lambda m: f"Seit dem {randint(1, 28)}.{randint(1, 12)}.{randint(9, 9999)}",
# Date-time
lambda m: f"Seit {randint(2, 17)} Jahren, {randint(2,360)} Tagen, {randint(2,23)} Stunden, {randint(2,59)} Minuten und {randint(2,59)} Sekunden",
lambda m: f"Seit dem {randint(1, 28)}.{randint(1, 12)}.{randint(9, 9999)} um {randint(0, 23)}:{randint(1, 59):02} Uhr",
),
}
# wer
# wem
# seit wann
# um wieviel uhr
def init(bot):
bot.on_message(handle)
async def handle(message: Message):
if "oder" in message.tokens or not ( # avoid conflicts with aoderb.py
message.text.endswith("?") and message.is_for_me
):
return
if message.words.startswith("um wieviel uhr"):
wword = "um wieviel uhr"
elif message.words.startswith("seit wann"):
wword = "seit wann"
else:
wword = message.words.str(0).rstrip(",.?!").lower()
if wword in ("und", "aber"):
wword = message.words.str(1).rstrip(",.?!").lower()
if wword in wwords:
reps = (
choices([wwords[wword], ka], weights=[100, 10])[0] if wwords[wword] else ka
)
template = choice(reps)
else:
template = choice(choices([ja, nein, vielleicht], weights=[100, 100, 15])[0])
text = template(message) if callable(template) else template
await reply(message, text, with_name=True)