From e27cdb6b4e58bc66ff407b87c0771c63963f9a19 Mon Sep 17 00:00:00 2001 From: Wojtek Porczyk Date: Sat, 17 Oct 2020 22:55:02 +0000 Subject: [PATCH] Initial commit --- .gitignore | 1 + __init__.py | 3 + bot_sopel.py | 17 +++++ templates.py | 180 +++++++++++++++++++++++++++++++++++++++++++++++++++ tlib.py | 79 ++++++++++++++++++++++ 5 files changed, 280 insertions(+) create mode 100644 .gitignore create mode 100644 __init__.py create mode 100644 bot_sopel.py create mode 100644 templates.py create mode 100644 tlib.py diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..225fc6f --- /dev/null +++ b/.gitignore @@ -0,0 +1 @@ +/__pycache__ diff --git a/__init__.py b/__init__.py new file mode 100644 index 0000000..7ba5dac --- /dev/null +++ b/__init__.py @@ -0,0 +1,3 @@ +#!/usr/bin/env python3 + +from .bot_sopel import * diff --git a/bot_sopel.py b/bot_sopel.py new file mode 100644 index 0000000..fb2af90 --- /dev/null +++ b/bot_sopel.py @@ -0,0 +1,17 @@ +#!/usr/bin/env python3 + +import pprint + +from sopel import module + +from . import tlib, templates + + +@module.commands('rcb', 'alertrcb') +def rcb(bot, trigger): + bot.notice(tlib.render(templates.TEMPLATE)) + +@module.commands('debug') +@module.require_admin() +def debug(bot, trigger): + bot.say(pprint.pformat(bot.config.core.channels)) diff --git a/templates.py b/templates.py new file mode 100644 index 0000000..f6e1149 --- /dev/null +++ b/templates.py @@ -0,0 +1,180 @@ +#!/usr/bin/env python3 + +import datetime +from .tlib import c, b, f, w, int_to_roman, next_isoweekday + +TEMPLATE_STANDARD = [ + 'Uwaga! Dziś ', + c('wieczorem', 'w nocy', 'wieczorem i w nocy', 'po południu i w nocy'), + ' (', (lambda: datetime.date.today().strftime('%e.%m').strip()), ') ', + c( + 'bardzo silny wiatr', + 'silny wiatr, burze i grad', + 'ulewny deszcz i burze z gradem', + 'ulewny deszcz i burze z silnym wiatrem', + 'silny wiatr i burze z gradem', + 'bardzo silny wiatr i burze z gradem', + ), '.', + + b(0.95, + [ + c( + ' Unikaj otwartych przestrzeni.', + ' Zabezpiecz rzeczy, które może porwać wiatr.', + c( + ' Zostań w domu, jeśli możesz.', + ' Jeśli możesz, zostań w domu.', + ' Jeśli możesz - zostań w domu.', + ), + ' Nie zbliżaj się do rzek.', + ' Nie chowaj się pod drzewami.', + ' Przygotuj się na podtopienia.', + ' Stosuj się do poleceń służb.', + ' W trakcie burzy znajdź bezpieczne schronienie.', + ' Możliwe przerwy w dostawie prądu.', + ' Nie biegaj z siekerą po podwórku, bo możesz się skaleczyć.', + min=0, max=4), + ], + c(' Nie zesraj się.', ' Kryj ryj!'), + ), +] + +TEMPLATE_FLOOD = [ + 'Uwaga! Fala wezbraniowa na ', + b(0.8, + ['Wiśle w woj. ', c('śląskim', 'małopolskim', 'świętokrzyskim', + 'podkarpackim', 'lubelskim', 'mazowieckim', 'kujawsko-pomorskim', + 'pomorskim'), + ], + 'Odrze w Wodzisławiu', + ), + ' - kulminacja ', c( + 'w niedzielę i poniedziałek', + 'w poniedziałek i wtorek', + 'we wtorek i środę', + 'w środę i czwartek', + 'w czwartek i piątek', + 'w piątek i sobotę', + 'w sobotę i niedzielę', + ), '.' +] + +TEMPLATE_SHIT = [ + 'Uwaga! Główny Inspektor Sanitarny apeluje: w Wiśle, od Warszawy w stronę ', + 'Gdańska, unikaj kąpieli i sportów wodnych. Nie używaj do mycia wody ', + 'z rzeki.' +] + +# II tura wyborów prezydenckich w niedzielę {{ data }}. Osoby 60+, kobiety +# w ciąży oraz osoby niepełnosprawne będą mogły głosować w komisjach wyborczych +# bez kolejki. +TEMPLATE_PRESIDENTIAL_ELECTION = [ + (lambda: int_to_roman(random.randrange(100))), + ' tura wyborów prezydenckich w niedzielę ', + (lambda: next_isoweekday(0).strftime('%e.%m').strip()), + '. Osoby 60+, ', + c( + 'kobiety w ciąży, ', + 'emeryci, ', + 'renciści, ', + 'honorowi dawcy krwi, ', + 'Stierlitz i Kloss, ', + 'Bohaterowie Związku Radzieckiego, ', + 'obywatele San Escobar, ', + 'wyborcy PiS, ', + 'słuchacze Radia Maryja, ', + 'fani polskiego rapu, ', + 'fani Zenka Martyniuka, ', + min=2, max=5), + 'oraz osoby niepełnosprawne będą mogły głosować w komisjach wyborczych ', + 'bez kolejki.' +] + +TEMPLATE_CORONAVIRUS = [ +] + + +TEMPLATE_ITHLINNESPEATH = [ + # Zaprawdę powiadam wam, oto nadchodzi wiek miecza i topora, wiek wilczej + # zamieci. Nadchodzi Czas Białego Zimna i Białego Światła, Czas Szaleństwa + # i Czas Pogardy, Tedd Deireádh, Czas Końca. Świat umrze wśród mrozu, + # a odrodzi się wraz z nowym słońcem. Odrodzi się ze Starszej Krwi, z Hen + # Ichaer, z zasianego ziarna. Ziarna, które nie wykiełkuje, lecz wybuchnie + # płomieniem. + # + # Ess'tuath esse! Tak będzie! Wypatrujcie znaków! Jakie to będą znaki, + # rzeknę wam - wprzód spłynie ziemia Aen Seidhe, Krwią Elfów... + # + # -- Andrzej Sapkowski, „Krew elfów” (1994) + + 'Zaprawdę powiadam wam, oto nadchodzi wiek miecza i topora, wiek wilczej ', + 'zamieci. Nadchodzi Czas Białego Zimna i Białego Światła, Czas Szaleństwa ', + 'i Czas Pogardy, Tedd Deireádh, Czas Końca.', + + c( + ' Kiedy nadejdzie Białe Zimno, nie jedz Żółtego Śniegu.', # Wiedźmin 3 + ' W trakcie burzy znajdź bezpieczne schronienie.', + ' Możliwe przerwy w dostawie prądu.', + ' Stosuj się do poleceń służb.', + min=1, max=2), +] + + +TEMPLATE_KONOPIELKA = [ + # O, do czego idzie! Krowy bedo sie źrebili, kobyły cielili, owieczki + # prosili! Chłop z chłopem spać bedzie, baba z babo, wilki latać, bociany + # pływać, słońce wzejdzie na zachodzie, zajdzie na wschodzie! [...] + # A w miastach, co w miastach sie wyprawia! W dzień śpio, w nocy pracujo, + # w piątki nie poszczo, niedzielow nie świętujo! Sodomagomora! + # + # Żony mężow rzucajo! W Boga nie wierzo. Z ludziow mydło sie robi! Gospody, + # kurestwo, sodomagomora! + # + # -- Edward Redliński, „Konopielka” (1973) + + 'O, do czego idzie! Krowy bedo sie źrebili, kobyły cielili, owieczki ', + 'prosili! Chłop z chłopem spać bedzie, baba z babo, wilki latać, bociany ', + 'pływać, słońce wzejdzie na zachodzie, zajdzie na wschodzie! ', + + c([ + 'A w miastach, co w miastach sie wyprawia! W dzień śpio, w nocy ', + 'pracujo, w piątki nie poszczo, niedzielow nie świętujo! ', + 'Sodomagomora! ', + ], [ + 'Żony mężow rzucajo! W Boga nie wierzo. Z ludziow mydło sie robi! ', + 'Gospody, kurestwo, sodomagomora! ', + ], min=0, max=1) +] + +TEMPLATE = w( + (20, TEMPLATE_STANDARD), + ( 2, TEMPLATE_PRESIDENTIAL_ELECTION), + ( 2, c(TEMPLATE_FLOOD, TEMPLATE_SHIT)), + ( 1, c(TEMPLATE_ITHLINNESPEATH, TEMPLATE_KONOPIELKA)), +) + + +''' +Od {{ data }} rząd wprowadził nowe zasady bezpieczeństwa w związku z koronawirusem. +Więcej informacji https://... +#ZostanWDomu + +Uwaga! Od {{ data }} nowe, kolejne zasady bezpieczeństwa w związku z koronawirusem. + +Od dziś obowiązuje nakaz zasłaniania ust i nosa. Przy wychodzeniu z domu zakryj te części twarzy. +Więcej: https://... nowa-normalnosc-etapy + +Uwaga! W przestrzeni publicznej zasłoń usta i nos. Zachowaj dystans. Od 10.10. +obowiązuje żółta strefa epidemiczna. Więcej: https://... + +Uwaga! W przestrzeni publicznej zasłoń usta i nos. Od 17.10 obowiązują nowe +zasady w strefie żółtej. Więcej: https://... + +Uwaga! Zasłoń usta i nos. Powiat legionowski w czerwonej strefie epidemicznej. +Od 17.10 nowe zasady: https:// + +Uwaga! Zasłoń usta i nos. Miasto Warszawa w czerwonej strefie epidemicznej. +Od 17.10 nowe zasady: https:// +''' + +# rcb.gov.pl, twitter.com/RCB_PL diff --git a/tlib.py b/tlib.py new file mode 100644 index 0000000..6c31968 --- /dev/null +++ b/tlib.py @@ -0,0 +1,79 @@ +#!/usr/bin/env python3 + +import datetime +import random + +import sopel.module + +_roman_numerals = ( + (1000, 'M'), + ( 900, 'CM'), + ( 500, 'D'), + ( 400, 'CD'), + ( 100, 'C'), + ( 90, 'XC'), + ( 50, 'L'), + ( 40, 'XL'), + ( 10, 'X'), + ( 9, 'IX'), + ( 5, 'V'), + ( 4, 'IV'), + ( 1, 'I'), +) + +def _int_to_roman(n): + for value, numeral in _roman_numerals: + for _ in range(n // value): + yield numeral + n -= value + assert n >= 0 + if n == 0: + return + +def int_to_roman(n): + return ''.join(_int_to_roman(n)) + + +def next_isoweekday(isoweekday, after=None): + if after is None: + after = datetime.date.today() + offset = (isoweekday - after.isoweekday() - 1) % 7 + 1 + return after + datetime.timedelta(days=offset) + +def _render(template): + if isinstance(template, str): + yield template + return + + if callable(template): + yield from _render(template()) + return + + for t in template: + yield from _render(t) + +def render(template): + return ''.join(_render(template)) + +def c(*args, min=1, max=1): + '''choose an amount of template from the args, (min, max) inclusive''' + return lambda: random.sample(args, random.randint(min, max)) + +def b(weight, first, second): + '''branch with probability (weight -> first, 1-weight -> second)''' + return lambda: first if random.random() <= weight else second + +def f(freq, template): + '''b(freq, template, '')''' + return b(freq, template, '') + +def w(*args): + '''weighted options''' + def wrapped(): + q = random.random() * sum(weight for weight, template in args) + for weight, template in args: + q -= weight + if q <= 0: + return template + assert False + return wrapped