Skip to content

Commit

Permalink
feat: offline jokes (#39)
Browse files Browse the repository at this point in the history
* fix:allow workshop 3.0.0

* feat: bundle jokes for offline usage

* feat: bundle jokes for offline usage
  • Loading branch information
JarbasAl authored Dec 1, 2024
1 parent 092fb93 commit 3491649
Show file tree
Hide file tree
Showing 60 changed files with 9,022 additions and 401 deletions.
54 changes: 0 additions & 54 deletions .github/workflows/unit_tests.yml

This file was deleted.

92 changes: 9 additions & 83 deletions __init__.py
Original file line number Diff line number Diff line change
Expand Up @@ -10,105 +10,31 @@
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
import random
from typing import Optional

import pyjokes
import requests
from ovos_plugin_manager.language import OVOSLangTranslationFactory
from ovos_utils.messagebus import Message
from ovos_workshop.decorators import intent_handler
from ovos_workshop.skills import OVOSSkill


class JokingSkill(OVOSSkill):
def __init__(self, *args, **kwargs):
super(JokingSkill, self).__init__(*args, **kwargs)
# TODO config from settings
self.translator = OVOSLangTranslationFactory.create()

def get_generic_joke(self) -> Optional[str]:
joke = requests.get("https://icanhazdadjoke.com/", headers={"Accept": "text/plain"}, timeout=10)
joke.raise_for_status()
return self._fix_encoding(joke.text)

def _fix_encoding(self, string: str) -> str:
replacements = {
\x80\x9c": '"', # left double quotation mark
\x80\x9d": '"', # right double quotation mark
"\r": " ",
"\n": " ",
\x80\x99": "'", # right single quotation mark
\x80\x98": "'", # left single quotation mark
\x80\x93": "–", # en dash
\x80\x94": "—", # em dash
\x80¦": "…", # ellipsis
\x82¬": "€", # euro sign
\x80\x8b": "‐", # hyphen (non-breaking)
\xa0": " ", # non-breaking space
\x80\x9e": '"', # double low-9 quotation mark
\x80\x9a": "'", # single low-9 quotation mark
\x80\xba": "›", # single right-pointing angle quotation mark
\x80\xb9": "‹", # single left-pointing angle quotation mark
}

for old, new in replacements.items():
string = string.replace(old, new)
if "â" in string:
self.log.warning("Failed to fix encoding, prepare for weird TTS: %s", string)
self.log.warning("Please report this issue so we can fix it! PRs welcome")
return string

@intent_handler("joke.intent")
def handle_joke(self, message: Message) -> None:
joke = self.get_generic_joke()
self._speak_tx(joke)
def handle_joke(self, message: Optional[Message] = None) -> None:
self.speak_dialog("general_jokes")

@intent_handler("search_joke.intent")
def handle_search_joke(self, message: Message) -> None:
category = message.data["search"].lower()
self.log.debug("joke search: %s", category)

# TODO self.voc_match more joke types
# special handling for chuck norris jokes
if "chuck norris" in category:
self.chuck_norris_joke()
return

# search query should be in english, translate if needed
is_english = self.lang.split("-")[0] == "en"
if not is_english:
tx_category = self.translate(utterance=category, lang_tgt="en", lang_src=self.lang)
# TODO make singular, https://github.com/MycroftAI/lingua-franca/pull/36
if tx_category.endswith("s"):
tx_category = tx_category[: len(tx_category) - 1]
url = "https://icanhazdadjoke.com/search?term=" + tx_category
if self.voc_match(voc_filename="ChuckNorris", utt=category, lang=self.lang):
self.speak_dialog("chuck_norris_jokes")
elif self.voc_match(voc_filename="Dad", utt=category, lang=self.lang):
self.speak_dialog("dad_jokes")
elif self.voc_match(voc_filename="Programmer", utt=category, lang=self.lang):
self.speak_dialog("dev_jokes")
else:
url = "https://icanhazdadjoke.com/search?term=" + category

headers = {"Accept": "text/plain"}
result = requests.get(url, headers=headers, timeout=10).text.strip()

if not result:
self.speak_dialog("no_joke", {"search": category})
else:
joke = random.choice(result.split("\n"))
self._speak_tx(joke)

def chuck_norris_joke(self):
joke = pyjokes.get_joke(category="chuck")
self._speak_tx(joke)

def _speak_tx(self, joke):
# helper to translate jokes to non-english on speak
is_english = self.lang.split("-")[0] == "en"
if not is_english:
translated_utt = self.translate(joke)
self.speak(translated_utt)
else:
self.speak(joke)

def translate(self, utterance, lang_tgt=None, lang_src="en-us"):
lang_tgt = lang_tgt or self.lang
if not lang_tgt.startswith(lang_src.split("-")[0]):
return self.translator.translate(utterance, lang_tgt, lang_src)
return utterance.strip()
12 changes: 12 additions & 0 deletions locale/cs/chuck_norris_jokes.dialog
Original file line number Diff line number Diff line change
@@ -0,0 +1,12 @@
Chuck Norris nepotřebuje klávesnici a myš. Počítač ho poslouchá na slovo
Binární kód počítače obsahuje jedničky a nuly. Binární kód Chuck Norrisova mozku obsahuje pouze jedničky.
Jen Chuck Norris vás dokáže uškrtit bezdrátovou myší.
Chuck Norris píše kód, který se sám optimalizuje.
První program od Chucka Norrise byl zabit -9.
Chuck Norris umí psát nekonečné rekurzní funkce a nechat je vrátit se.
Chuck Norris umí smazat Koš.
Chuck Norris umí dělit nulou.
Chuck Norris umí psát na ROM.
Chuck Norris nepotřebuje debugger, jen zírá na chybu dokud se kód nepřizná.
Hosting u Chucka Norrise je garantován dostupnosti 105 procent.
Chuck Norris vyhrál soutěž Ahoj světe pod 20 bajtů vytvořením jednobajtového programu.
29 changes: 29 additions & 0 deletions locale/cs/dev_jokes.dialog
Original file line number Diff line number Diff line change
@@ -0,0 +1,29 @@
Webmaster vyplňuje dotazník: Věk: 25 Výška: 185 Barva očí: #4040FF
Víte, proč blondýna pokládá vedle počítače sýr? Aby měla myš co jíst!
Za manžela jsem si vzala programátora. Když jsem se ho zeptala, jak mám otevřít jar, řekl mi, abych si stáhla Javu.
Před chvílí jsem zažil nejrychlejší přenos dat v životě, 256 GB za sekundu. Vysavač mi vcucl flešku.
Vnouček křičí: Babi, jdeme koupit playstation! Babička odpoví: Kupte si co chcete, já to krmit nebudu!
A Bůh pravil: Noe, udělej zálohu.. budu formátovat.
Víte co dělá windows na měsíci? Padá 6 krát pomaleji
Bavi se dva admini: Kámoš včera během 5 minut shodil hlavní server. On je hacker? Ne, debil.
Baví se dva grafici: Já jsem sbalil novou holku a je krásná má 90-60-90 Cože? Tmavě fialová?
Kdo se směje naposledy, má největší ping.
Ženy jsou jako internetové domény. Ty nejlepší už jsou zabrané. Ovšem vždycky je tu možnost najít si nějakou z exotické země.
Ptali se mě, jestli vůbec mám přátele. Jasně, že mám. Všechny díly.
Co volá programátor, když se topí?F1, F1, F1!
A znáte ten, jak přijde programátor v neděli ráno do posilovny?
Přide hacker ke knězi a povídá: Otče zhrešil jsem. A kolik toho máš? No vešlo se to na dvě diskety!
Tři největší katastrofy v historii lidstva: Hiroshima 45, Černobyl 86, Windows 95
Padá server, přej si něco !
Na jakém hardware běží Windows 98 nejlépe? Na diaprojektoru.
Svět je binární. Buď jste jednička nebo nula.
Informatik je člověk, který se v potravinách diví, že kilo masa neváží 1024 gramů.
Někdy je lepší zůstat v pondělí v posteli než celý týden ladit pondělní kód.
Všichni mi říkají, že jméno kocoura se jako heslo pro roota nehodí. Ale když já jsem si už na svýho qzb!7kw_2et tak zvykl!
S UDP vtipy je ten problém, že nikdy nevíte, jestli lidem došly.
Už jsem na řadě s vyprávěním vtipu o Token-ringu?
Problém CSS vtipů je, že je každý pochopí trochu jinak.
Přijde IPv6 paket do baru. Nikdo se s ním nebaví.
Přijde multicastový paket do baru a odejde čtyřmi východy současně.
Kolik programátorů je potřeba k výměně žárovky ? Žádný. To je problém hardwaru.
Které místo v Praze je pojmenováno na počest Internetu? Náměstí I.P. Pavlova.
68 changes: 68 additions & 0 deletions locale/de-de/chuck_norris_jokes.dialog
Original file line number Diff line number Diff line change
@@ -0,0 +1,68 @@
Chuck Norris streichelt keine Tiere, die Tiere streicheln sich selbst, wenn er in der Nähe ist
Chuck Norris braucht die Toilette nicht zu spülen. Er sagt einfach Buh! und schon haut die Scheiße von alleine ab.
Chuck Norris verwählt sich nicht. Wenn du abhebst, warst du am falschen Telefon.
Chuck Norris hat einen Grizzlybär-Teppich. Der Bär lebt, hat bloß Angst, sich zu bewegen.
Wenn Chuck Norris mit nassen Fingern an der Steckdose rumfummelt, kriegt das Kraftwerk einen Schlag.
Chuck Norris kann mit Durchfall furzen.
Wenn Chuck Norris einen Raum betritt, stehen sogar die Stühle auf!
Chuck Norris hat bei Burgerking einen Big Mac bestellt - und hat ihn ohne Wiederworte bekommen
Chuck Norris war bereits auf dem Mars. Das ist der Grund dafür, warum es dort kein Leben mehr gibt.
Chuck Norris wurde letztens von der Polizei angehalten... Die Polizisten sind mit einer Verwarnung davon gekommen.
Chuck Norris kackt Lichtschwerter.
Herr Norris benutzt keine Kondome, denn es gibt nichts, was vor ihm schützen könnte.
Wie trinkt Chuck Norris seinen Kaffee? Antwort: Schwarz ohne Wasser!
Was geht den Opfern von Chuck Norris als Letztes durch den Kopf: SEIN FUSS.
Egal was dir Chuck Norris kocht. Es schmeckt einfach gut!
Chuck Norris' Hund sammelt seine Haufen selbst ein, weil sich Chuck für niemanden bückt.
Endlich weiß man, warum sich das Universum ausdehnt. Alles versucht sich so weit wie möglich von Chuck Norris zu entfernen.
Chuck Norris' Computertastatur hat keine Löschtaste. Chuck Norris macht keine Fehler.
Chuck Norris bekommt auch Geld für Flaschen ohne Pfand.
Chuck Norris darf vom Beckenrand springen.
Bill Gates lebt in ständiger Angst, dass der PC von Chuck Norris abstürzt.
Der wahre Grund, warum sich Hitler tötete, ist dass Hitler herausgefunden hat, dass Chuck Norris Jude ist.
Chuck Norris hat versucht Gewicht zu verlieren. Jedoch verliert Chuck niemals.
Chuck Norris kann Drehtüren eintreten.
Alle Menschen malen den Teufel an die Wand, der Teufel aber malt Chuck Norris an die Wand.
Chuck isst keinen Honig, er kaut Bienen!
Das Universum dehnt sich aus weil Chuck Norris furzt.
Chuck war Kamikaze-Pilot.... 12 mal.
Einmal hat Herr Norris eine ganze Torte gegessen, bevor ihm jemand sagen konnte, dass eine Stripperin drin war.
Chuck Norris darf die Straße neben dem Zebrastreifen überqueren.
Was ist der Unterschied zwischen Chuck Norris und Gott? Gott kennt Gnade...
Chuck Norris wurde von der hochgiftigen ... Black Mamba .. gebissen. Nach 3 Tagen Höllenqualen ist die Black Mamba verstorben.
Chuck Norris hat keine Herzattacken. Kein Herz wäre so verrückt Chuck zu attackieren.Chuck Norris kann einen Hut aus einem Hasen zaubern.
Besser mit Chuck Norris teilen als von Chuck Norris geteilt zu werden.
Chuck Norris war in der Hölle. Der Teufel ist vor Angst gestorben.
Warum weinen Kinder wenn sie auf die Welt kommen, weil sie wissen dass sie eine Welt mit Chuck Norris betreten haben.
Chuck Norris ist der Einzige, der die Zeit wirklich totschlagen kann.
Chuck Norris ist Fallschirmspringen gegangen. Sein Fallschirm hat sich nicht geöffnet. Er ist den Fallschirm danach umtauschen gegangen.
Chuck Norris bekommt nie Spam-Emails.
Chuck Norris wartet nicht auf die Bahn. Die Bahn wartet auf Chuck Norris.
Chuck Norris ist so hart, wenn er den Schleudersitz betätigt, wird nicht er sondern das Flugzeug weggeschleudert.
Chuck Norris darf die Rettungsgasse auf der Autobahn benutzen.
Wie heißt das Tagebuch von Chuck Norris?...... Guinessbuch der Rekorde!
Chuck Norris versteht Frauen.
Chuck Norris brachte seinem Vater rasieren bei.
Wenn Chuck Norris ins Kino geht, bekommt er ein Fernbedienung.
Wenn Chuck Norris Fallschirmspringen geht, braucht er keinen Fallschirm. Der Fallschirm braucht ihn.
Chuck Norris tank nicht. Das Auto fährt aus Respekt.
In einem Zimmer gibt es 156 Dinge mit denen dich Chuck Norris töten kann, einschließlich dem Raum.
Es gibt Aliens, welche die Welt erobern wollen. Sie warten nur bis Chuck Norris gestorben ist damit sie angreifen können!
Chuck Norris furzt nur, um zu töten.
Wenn Chuck Norris raucht, bekommt er keinen Lungenkrebs sondern die Zigarette Norriskrebs.
Chuck braucht ein Stunt-Double. Aber nur in Szenen, in denen er weinen soll.
Chuck Norris Tränen können theoretisch Krebs heilen, doch Chuck Norris weint nicht.
Chuck Norris Haus hat keine Türen, sondern nur eine Mauer durch die er läuft.
Chuck Norris hat einen Handgranate geschmissen und 50 Leute getötet. Danach explodierte die Granate.
Chuck Norris kann dich mit einem Schnurlostelefon erwürgen.
Chuck Norris bucht in einem Schweizer Hotel ein Zimmer mit Meerblick und bekommt es.
Chuck Norris darf an Tankstellen rauchen.
Chuck Norris spielt Paint-Ball ohne Maske.
Chuck Norris kennt keine Angst. Die Angst kennt ihn.
Chuck Norris ist eigentlich vor 10 Jahren gestorben, der Tod hatte aber nie den Mut, es ihm zu sagen.
Chuck Norris kann im Kinderkarussell überholen.
Wenn sich ein Zug umbringen möchte, wirft er sich vor Chuck Norris.
Chuck Norris telefoniert trotz Tastensperre.
Chuck Norris hat keinen Schatten. Die Wand möchte nur so aussehen wie Chuck Norris.
Chuck Norris hat als Kind Sandburgen gebaut - heute nennt man sie Pyramiden.
Chuck Norris kann eine Bank ausrauben und zwar per Telefonbanking.
59 changes: 59 additions & 0 deletions locale/de-de/general_jokes.dialog
Original file line number Diff line number Diff line change
@@ -0,0 +1,59 @@
Was steht auf dem Grabstein eines Mathematikers? 'Damit hat er nicht gerechnet.'
Ein Beamter zum anderen: 'Was haben die Leute nur, wir tun doch nichts'.
Wenn ein Yogalehrer seine Beine senkrecht nach oben streckt und dabei furzt, welche Yoga Figur stellt er da? Eine Duftkerze.
Frage: Was ist das beste geschenkt für trump? Antwort : klopapier was soll man einem arschloch denn sonst schenken
Ich wollte Spiderman anrufen, aber er hatte kein Netz.
Sitzen 2 Bomben im Keller. Sagt die eine: 'Komm, lass hoch gehen.'
Wie nennt man jemand der so tut als würde er etwas werfen? Einen Scheinwerfer.
Was steht auf dem Grabstein einer Putzfrau? 'Sie wird nie wieder kehren.'
Abwasser ist ein Thema, das unbedingt geklärt werden muss.
Warum ging der Luftballon kaputt? Aus Platzgründen.
Was steht auf dem Grabstein eines Spanners? 'Der ist weg vom Fenster.'
Warum können Geister so schlecht lügen? Weil sie so leicht zu durchschauen sind.
Bei Adidas wurde eingebrochen. Was macht die Polizei? Sie schickt 3 Streifen.
Egal wie dicht du bist, Goethe war Dichter.
Wie war die Stimmung in der DDR ? Sie hielt sich in Grenzen
Auch im Osten trägt man Westen.
Was bekommt ein Kannibale wenn er zu spät zum Essen kommt? Die kalte Schulter.
Was steht auf dem Grabstein eines Geisterfahrers?.... 'Entgegenkommend. bis zuletzt.'
Was ist ein Keks unter einem Baum? Ein schattiges Plätzchen.
Warum geht der Sarg nicht auf? Weil ein Zuhälter drin liegt.
Treffen sich zwei Blitze. Hey, schlag' ein !
Was macht ein Terrorist im Treppenhaus? - Hoch gehen
Das Motto eines McDonald's-Angestellten? Frittieren geht über Studieren.
Patient: Ich bin so nervös. Das ist meine erste Operation. 'Doktor:' Keine Sorge, meine auch.
Wie waren die letzten Worte des Sportlehrers? 'Alle Speere zu mir.'
Wie nennt man das Weiße in Vogelscheiße? Auch Vogelscheiße!
Papi, da ist so ein Mann an der Tür. Er sagt, er sammelt für das Altersheim. Oh, dass ist super. Gibt ihm Opa mit.
Zahnarzt zum Patienten: Sie brauchen eine Krone - Patient: Endlich versteht mich jemand.
Eine Wolke zur anderen: Hast du einen Wolkenkratzer gesehen, habe schlimmen Juckreiz.
Sagt der Bauer zu seinem Urlaubsgast: 'Bei uns auf dem Land, weckt einen der Hahn.' 'Sehr gut, bitte auf 11 Uhr stellen!'
Fragt der Richter den Angeklagten: 'Wo waren Sie zwischen 3 und 4?' 'Im Kindergarten!', antwortet der Angeklagte.
Ein Schönheitschirurg zum anderen: Nah, was machst du den heute für ein Gesicht...
Ein Schwein schaut eine Steckdose an und sagt: Wer hat dich den eingemauert?
Der Lehrer fragt : 'Warum ist Strom so wichtig?' Peter antwortet: 'Wenn es keinen Strom gäbe, müssten wir bei Kerzenlicht fernsehen.'
Altes chinesisches Sprichwort: In jeden Topf passt ein Dackel.
Wie unterscheidet man deutsches Bier und einen holländischen Elfmeter: Das deutsche Bier geht immer rein.
Wieso eigentlich legen Hühner Eier? - Schmeißen geht nicht. Gehen doch sonst kaputt.
Ein Bauer wird gefragt, wie viele Schafe er hat. 'Keine Ahnung. Immer wenn ich anfange zu zählen, schlafe ich ein.'
Mann mit Frosch aufm Kopf geht zum Arzt. 'Frosch:' 'Doktor, ich bin da in was reingetreten.'
Was steht bei einem Spanner auf dem Grabstein? ..... So bin jetzt weg vom Fenster.
Lebensweisheit: Flutscht dir der Föhn in die Wanne, dann war das deine letzte Panne.
Was ist schlimmer als ein Wurm im Apfel? Ein halber Wurm in einem angebissenen Apfel.
Warum haben Eskimos die höchste Lebenserwartung?... Sie können nicht ins Gras beißen.
Geld allein macht niemanden glücklich. Man sollte es schon besitzen.
Spruch: Nimm dir ein Beispiel an dem Sofa. Es muss auch mit jedem Furz zurechtkommen.
Lukas beschwert sich zu Hause: 'Diese doofe Lehrerin! Beklagt sich über meine Schrift, dabei sehen ihre Einser wie Vierer aus!'
Trinkspruch: Trinke nie mehr, als mit aller Gewalt reingeht.
Was macht ein Pole aufm Eis? Einbrechen.
Gedicht zum Schluss: Alle Kinder entkamen dem Bären, nur nicht Kim, der fiel hin.
Mutti kaufst Du mir Kekse? Hol dir doch welche!Aber Mutti, ich habe doch keine Arme.Keine Arme keine Kekse
'Mein Mann starb schon acht Tage nach unserer Hochzeit!' 'Na ja, dann hat er ja nicht lange gelitten!'
Die Omi zum Enkel:'Du darfst Dir von mir ein schönes Buch wünschen.''Dann wünsche ich mir Dein Sparbuch.'
Sie: 'Ich hatte Dir doch gesagt, 2 Bier und um 22 Uhr bist Du wieder zu Hause!' Er: 'Ach, so herum war das'
Kommt einer zum Arzt und sagt Doktor Doktor mein Problem ist es keiner hört mir zu! Darauf der Doktor: Der Nächste bitte!
Die Kundin: 'Ich brauche Äpfel für meinen Mann, sind diese hier mit einem Gift bespritzt?' 'Nein, das müssen Sie schon selber machen!'
Kommt ein Hahn mit einem Straußenei auf seine Hühnerfarm: 'Mädels, ich will ja nicht meckern, aber schaut mal, was die Konkurrenz macht'
Angeklagter, ich möchte wirklich wissen - warum Sie so viel lügen.'Das kommt daher, weil Sie so viel fragen, Herr Richter.'
Auf dem Standesamt:'Sagen Sie, Herr Zufall, sind Sie sicher, dass Sie Ihren Sohn 'Rainer' nennen wollen?'
Fährt ein Mann zur Tankstelle:'Wieviel kostet ein Tropfen Benzin ?''Nichts''Also, dann tropfen Sie mir bitte den Tank voll !'
Loading

0 comments on commit 3491649

Please sign in to comment.