diff --git a/Jarvis.py b/Jarvis.py index 64b447dd706294ce51e023593d9660607024b044..b09469bf5b4bcb4138976bd4d92e88014c326cb0 100755 --- a/Jarvis.py +++ b/Jarvis.py @@ -15,8 +15,6 @@ import pygame import os import sys import unicodedata -from subprocess import Popen, PIPE -from html.parser import HTMLParser import random import wikipedia from email.mime.text import MIMEText @@ -25,8 +23,8 @@ import smtplib import warnings import requests import useless # package de fonctions inutiles mais marrantes +import pyttsx3 # import usefull # package de fonctions utiles -import json from googletrans import Translator translator = Translator() warnings.simplefilter('ignore', UserWarning) @@ -41,19 +39,37 @@ else: voix = False print("[!] reconnaissance vocale désactivée.") +reconnaissance = str(input("[!] activer la synthèse vocale ? (y,N)>")) +if reconnaissance == 'y': + tts_bool = True # défini si jarvis parle + print("[!] synthèse vocale activée.") +else: + tts_bool = False + print("[!] synthèse vocale désactivée.") +reconnaissance = str(input("[!] google ou espeak ? (0,1)>")) +if reconnaissance == '0': + google_bool = True # défini si jarvis parle + print("[!] synthèse vocale activée.") +else: + google_bool = False + print("[!] synthèse vocale désactivée.") r = sr.Recognizer() mic = sr.Microphone() +engine = pyttsx3.init() +voice = engine.getProperty('voices')[26] # the french voice +engine.setProperty('voice', voice.id) + pygame.init() r = sr.Recognizer() mic = sr.Microphone() jarvis = True # défini si jarvis commence vérouillé ou pas -tts = False # défini si jarvis parle mdp = "oracle02" # défini le mdp de déverouillage de jarvis bot_name = "jarvis" # défini le nom auquel répondra l'ia compris = 0 comprispreced = 0 +verbosity = 3 entrepreced = "" _from = "" password = "" @@ -73,7 +89,8 @@ fonctionnalités = [ 'parler du grand Chuck Norris !', 'raconter une intox', 'faire de la philosophie', - 'jouer du pipo' + 'jouer du pipo', + 'traduire un texte ou un mot dans une autre langue' ] @@ -99,27 +116,34 @@ def get_speech(message="entrée"): def parle(texte, save=True, lang='fr-CA'): - global compris, tts + global compris, tts_bool, engine, google_bool compris = 1 print("[+] {} : {}".format(bot_name.upper(), texte)) - if not tts: + if not tts_bool: return None # si pas de tts on s'arrete là dans la fonction - with open("database.txt") as f: - lines = f.readlines() - test_list = [i.replace('\n', '') for i in '\n'.join(lines).split("\n|")] - try: - line_no = test_list.index(texte.replace('\n', '')) - except ValueError: - line_no = len(lines) - tts = gTTS(text=texte, lang=lang) - tts.save("saved_voice/{}.mp3".format(line_no)) - if save: - with open("database.txt", 'a') as f: - f.writelines(['{}\n|'.format(texte)]) - pygame.mixer.music.load('saved_voice/{}.mp3'.format(line_no)) - pygame.mixer.music.play() + if not google_bool: + engine.say(texte) + engine.runAndWait() + else: + with open("database.txt") as f: + lines = f.readlines() + test_list = [i.replace('\n', '') for i in '\n'.join(lines).split("\n|")] + print(test_list) + try: + line_no = test_list.index(texte.replace('\n', '')) + except ValueError: + line_no = len(lines) - 1 if len(lines) != 0 else 0 + tts = gTTS(text=texte, lang=lang) + tts.save("saved_voice/{}.mp3".format(line_no)) + if save: + with open("database.txt", 'a') as f: + f.writelines(['{}\n|'.format(texte)]) + print(line_no) + pygame.mixer.music.load('saved_voice/{}.mp3'.format(line_no)) + pygame.mixer.music.play() + pygame.mixer.music.set_endevent() def var_name(var): @@ -139,7 +163,7 @@ def printv(var): return str(var_name(var).replace("_", " ") + ' : ' + var) -def meteo_de(villes="saint pierre", pay="reunion"): +def meteo_de(villes="petite-ile", pay="RE"): global compris, ville, pays, lattitude, longitude, température,\ température_minimum, température_max, humidité, pression,\ vitesse_du_vent, direction_du_vent, pourcentage_de_nuages, \ @@ -150,19 +174,23 @@ def meteo_de(villes="saint pierre", pay="reunion"): adresseid = "http://api.openweathermap.org/data/2.5/weather?q=" requette = requests.get("{}{},{}&appid={}".format(adresseid, "%20".join(villes.split(" ")), pay, api)).json() - vitesse_du_vent = str(requette["wind"]["speed"]) + " mètres par secondes" - température = str(int(requette["main"]["temp"]) - 273) + " °Celsius" - température_max = "%d °Celsius" % (int(requette["main"]["temp_max"]) - 273) - humidité = str(requette["main"]["humidity"]) + " %" - température_minimum = "%d °Celsius" % (int(requette["main"]["temp_min"] - 273)) - direction_du_vent = str(requette["wind"]["deg"]) + " degrés" - longitude = str(requette["coord"]["lon"]) - lattitude = str(requette["coord"]["lat"]) - pression = str(requette["main"]["pressure"]) + "hPa" - pays = str(requette["sys"]["country"]) - ville = str(requette["name"]) - pourcentage_de_nuages = str(requette["clouds"]["all"]) + "%" - description = str(requette["weather"][0]["description"]) + try: + vitesse_du_vent = str(requette["wind"]["speed"]) + " mètres par secondes" + température = str(int(requette["main"]["temp"]) - 273) + "°" + température_max = "%d °Celsius" % (int(requette["main"]["temp_max"]) - 273) + humidité = str(requette["main"]["humidity"]) + "%" + température_minimum = "%d °Celsius" % (int(requette["main"]["temp_min"] - 273)) + direction_du_vent = str(requette["wind"]["deg"]) + "°" + longitude = str(requette["coord"]["lon"]) + lattitude = str(requette["coord"]["lat"]) + pression = str(requette["main"]["pressure"]) + "hPa" + pays = str(requette["sys"]["country"]) + ville = str(requette["name"]) + pourcentage_de_nuages = str(requette["clouds"]["all"]) + "%" + description = str(requette["weather"][0]["description"]) + except: + parle(random.choice(truc_cassé)) + return None try: volume_pluie_des_3_dernière_heures = str(requette["rain"]["3h"]) @@ -174,14 +202,19 @@ def meteo_de(villes="saint pierre", pay="reunion"): a2 = True except: a2 = False - liste = [pays, ville, lattitude, longitude, température, température_minimum, - température_max, humidité, pression, vitesse_du_vent, direction_du_vent, pourcentage_de_nuages, description] - for i in liste: - parle(printv(i)) + liste = [pays, + ville, + # lattitude, longitude, + température, + # température_minimum, température_max, + humidité, pression, vitesse_du_vent, + # direction_du_vent, + pourcentage_de_nuages, description] + parle(" ".join([printv(i) for i in liste]), False) if a1: - parle(printv(volume_pluie_des_3_dernière_heures)) + parle(printv(volume_pluie_des_3_dernière_heures), False) if a2: - parle(printv(volume_neige_des_3_dernière_heures)) + parle(printv(volume_neige_des_3_dernière_heures), False) def deverouillage(entre): @@ -307,7 +340,7 @@ def location(entre): parle("Je vais vous montrer où se trouve " + location) location = ("+").join(location.split(" ")) - os.system("start chrome.exe https://www.google.nl/maps/place/" + location + "/&") + os.system("firefox https://www.google.nl/maps/place/" + location + "/& >/dev/null") def meteo(entre): @@ -321,17 +354,22 @@ def meteo(entre): entre1 = entre1.split(" ") villes = entre1[0] villes = villes + entre1[1] if len(entre1) == 3 else villes - pay = entre[1] if len(entre1) == 2 else entre1[2] - meteo_de(villes, pay) + pay = entre1[1] if len(entre1) == 2 else entre1[2] + meteo_de(villes, pay.upper()[:2]) elif "meteo" in entre: meteo_de() +def dire_un_truc_en_mode_random(verbosity): + if random.randint(0, 100) < verbosity * 10: + parle(random.choice([useless.chuck(), useless.genererSujet(), useless.useless()]), False) + + def tests(entre): ''' Fonction principale de tests ''' - global entrepreced, comprispreced, jarvis, compris, voix, reconnaissance, topics, _from, password, boitemail + global entrepreced, comprispreced, jarvis, compris, voix, reconnaissance, topics, _from, password, boitemail, verbosity compris = 0 merci = 0 @@ -391,7 +429,10 @@ def tests(entre): if "ouvre" in entre and ("application" in entre or "programme" in entre): texte = entre.replace("ouvre le programme ", "").replace("ouvre l'application ", "") parle("Je vais executer " + texte) - os.system("start " + texte + ".exe") + os.system(texte) + if entre.split(" ")[0] == "lance": + parle("Je vais executer " + entre.split(" ")[-1]) + os.system(entre.split(" ")[-1] + ">/dev/null") # donne la date if (("date" in entre or "jour" in entre) and ("on est" in entre or "aujourd'hui" in entre)): @@ -453,6 +494,27 @@ def tests(entre): if any(ext in entre for ext in ['sais faire', 'peux faire']) or ('autre ' in entre and any(ext in entrepreced for ext in ['sais faire', 'peux faire'])): parle(random.choice(['Je sais par exemple ', 'Je peux entre autre ']) + random.choice(fonctionnalités) + '.') + if 'moins bavard' in entre: + verbosity -= 1 + parle('D\'accord chef je parlerais un peu moins') + elif 'plus bavard' in entre: + verbosity += 1 + parle('Pas de prob\'s je dirai plus de trucs random') + + if any(ext in entre for ext in ['pipo', 'pipeau']) and 'joue' in entre: + parle(useless.pipo(), False) + if 'une intox' in entre and any(ext in entre for ext in ["donne", "dit"]): + parle(useless.nordpresse(), False) + if 'philo' in entre: + parle(useless.genererSujet(), False) + if 'dis quelque-chose' in entre: + parle('quelque-chose') + if any(ext in entre for ext in ['dis', 'raconte']) or any(ext in entre for ext in ['quelque-chose', 'un truc']): + parle(useless.useless(), False) + + if 'je t\'aime' in entre: + parle(useless.getRateau(), False) + """le reste du code de la fonction doit toujours être à la fin de la fonction !!!""" # repond lorsque l'on annonce son nom sans rien demander de spécial @@ -460,7 +522,11 @@ def tests(entre): parle("Oui ?") if compris == 0: - parle("je n'ai pas compris.") + if not tts_bool: + parle("je n'ai pas compris.") + else: + print("je n'ai pas compris") + dire_un_truc_en_mode_random(verbosity) compris = 0 entrepreced = entre if merci == 0: @@ -474,22 +540,35 @@ def tests(entre): if __name__ == "__main__": parle("Bonjour ! " + random.choice(["", "Vous allez bien aujourd'hui ?"])) - + get_busy = pygame.mixer.music.get_busy() + currently_playing = get_busy """boucle principale""" while True: - currently_playing = pygame.mixer.music.get_busy() # booléen qui indique si l'ia est en train de parler - entre = get_speech() - - entre = entre.lower() # met tout en minuscule - entre = unicodedata.normalize('NFKD', entre).encode('ascii', 'ignore').decode() # enlève les accents - - if deverouillage(entre) and not currently_playing: - tests(entre) - elif currently_playing and 'stop' in entre: - pygame.mixer.music.stop() - elif currently_playing and 'pause' in entre or 'arrete' in entre: - pygame.mixer.music.pause() - elif currently_playing and 'recommence' in entre: - pygame.mixer.music.rewind() - elif currently_playing and 'reprend' in entre or 'continue' in entre: - pygame.mixer.music.unpause() + get_busy = pygame.mixer.music.get_busy() + # booléen qui indique si l'ia est en train de parler + # end_event = pygame.mixer.music.get_endevent() # booléen indique si l'ia a fini de parler + currently_playing = get_busy + # sys.stdout.write('[DEBUG] is_talking={}'.format(currently_playing)) + # sys.stdout.flush() + # sys.stdout.write(chr(13)) + # sys.stdout.write('[DEBUG] is_talking={}'.format(currently_playing)) + # sys.stdout.write(chr(13)) + + if not currently_playing: + entre = get_speech() + + entre = entre.lower() # met tout en minuscule + entre = unicodedata.normalize('NFKD', entre).encode('ascii', 'ignore').decode() # enlève les accents + + if currently_playing: + print(pygame.mixer.music.get_pos()) + if deverouillage(entre) and not currently_playing: + tests(entre) + elif currently_playing and 'stop' in entre: + pygame.mixer.music.stop() + elif currently_playing and 'pause' in entre or 'arrete' in entre: + pygame.mixer.music.pause() + elif currently_playing and 'recommence' in entre: + pygame.mixer.music.rewind() + elif currently_playing and 'reprend' in entre or 'continue' in entre: + pygame.mixer.music.unpause() diff --git a/README.md b/README.md index cdbd08ec464f7c73a50e1f1697bf54e90e2e5e0a..32a5822cd12186c6a07bd351a4be53328847be0f 100644 --- a/README.md +++ b/README.md @@ -22,6 +22,11 @@ Mon Jarvis pour windows et linux (peut-être un truc sur android aussi :°°) - raconter une intox - faire de la philosophie - jouer du pipo +- dit des trucs inutiles automatiquement de temps en temps selon un certain niveau de verbosité +- quizz +- envoie balader les gens qui lui font des compliment d'amour +- quand la voix est activée, ne répondre je n'ai pas compris que si la ou la requete précédente comprends le nom de l'ia +- migrer les fonctionalités usefull dans un package 'usefull' # CHANGELOG: - donne l'heure diff --git a/database.txt b/database.txt index 95e2d3540473c9f7677fc886d3af41bdd189874c..d5f36289bb0415d77d39ada8d211e0a824e05db1 100644 --- a/database.txt +++ b/database.txt @@ -1,5 +1,2 @@ - -Bonjour ! -|je n'ai pas compris. -|il est 15 heure 46. +Bonjour ! Vous allez bien aujourd'hui ? | \ No newline at end of file diff --git a/saved_voice/0.mp3 b/saved_voice/0.mp3 index 0e90a5515da82c44ea84c996803af753e3bc830b..005222efe042fb7b58264a492c3cff9051e800bb 100644 Binary files a/saved_voice/0.mp3 and b/saved_voice/0.mp3 differ diff --git a/saved_voice/1.mp3 b/saved_voice/1.mp3 index 0e90a5515da82c44ea84c996803af753e3bc830b..f9bd2dfbe8dc0e27820bf09244eab15008dbd36a 100644 Binary files a/saved_voice/1.mp3 and b/saved_voice/1.mp3 differ diff --git a/saved_voice/2.mp3 b/saved_voice/2.mp3 index 005222efe042fb7b58264a492c3cff9051e800bb..025fe3b8cd7cad42ee51906deadf1b0742e4627e 100644 Binary files a/saved_voice/2.mp3 and b/saved_voice/2.mp3 differ diff --git a/saved_voice/3.mp3 b/saved_voice/3.mp3 deleted file mode 100644 index 1b9b4a1f031ae5afad83d80b6e81da46f2ff08e7..0000000000000000000000000000000000000000 Binary files a/saved_voice/3.mp3 and /dev/null differ diff --git a/saved_voice/4.mp3 b/saved_voice/4.mp3 deleted file mode 100644 index 1e7b126401ac3b4034c18c409c9964dd64322c60..0000000000000000000000000000000000000000 Binary files a/saved_voice/4.mp3 and /dev/null differ diff --git a/saved_voice/5.mp3 b/saved_voice/5.mp3 deleted file mode 100644 index 1b9b4a1f031ae5afad83d80b6e81da46f2ff08e7..0000000000000000000000000000000000000000 Binary files a/saved_voice/5.mp3 and /dev/null differ diff --git a/saved_voice/6.mp3 b/saved_voice/6.mp3 deleted file mode 100644 index 005222efe042fb7b58264a492c3cff9051e800bb..0000000000000000000000000000000000000000 Binary files a/saved_voice/6.mp3 and /dev/null differ diff --git a/saved_voice/7.mp3 b/saved_voice/7.mp3 deleted file mode 100644 index 1b9b4a1f031ae5afad83d80b6e81da46f2ff08e7..0000000000000000000000000000000000000000 Binary files a/saved_voice/7.mp3 and /dev/null differ diff --git a/useless/__init__.py b/useless/__init__.py index e69de29bb2d1d6434b8b29ae775ad8c2e48c5391..da54f6aac813c3b48f1ac316af2be239f0caa1c6 100644 --- a/useless/__init__.py +++ b/useless/__init__.py @@ -0,0 +1,10 @@ +# __init__.py + +from .rateau import getRateau +from .chuck import chuck +from .useless import useless +from .nordpresse import nordpresse +from .philotron import genererSujet +from .pipotron import pipo +from .haddock import haddock +from .quizz import quizz diff --git a/useless/__pycache__/__init__.cpython-37.pyc b/useless/__pycache__/__init__.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..cf412b6c085ef2c5780461e4d76434a47e1bd2be Binary files /dev/null and b/useless/__pycache__/__init__.cpython-37.pyc differ diff --git a/useless/__pycache__/akinator.cpython-37.pyc b/useless/__pycache__/akinator.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..0972d8edcb1c61fa70f0d03201aaac919ca58c1c Binary files /dev/null and b/useless/__pycache__/akinator.cpython-37.pyc differ diff --git a/useless/__pycache__/chuck.cpython-37.pyc b/useless/__pycache__/chuck.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..46c212a0f1d915544fc769c3ebc5e87d3b17d219 Binary files /dev/null and b/useless/__pycache__/chuck.cpython-37.pyc differ diff --git a/useless/__pycache__/haddock.cpython-37.pyc b/useless/__pycache__/haddock.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..52a059dad3d953fafa9bbdf6e857dee7502eec79 Binary files /dev/null and b/useless/__pycache__/haddock.cpython-37.pyc differ diff --git a/useless/__pycache__/nordpresse.cpython-37.pyc b/useless/__pycache__/nordpresse.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..1a3b83f68f812837bde4de32d3146b6646f0f4a6 Binary files /dev/null and b/useless/__pycache__/nordpresse.cpython-37.pyc differ diff --git a/useless/__pycache__/philotron.cpython-37.pyc b/useless/__pycache__/philotron.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..b9bee385255e11d32884df8d1fb9bfdf620df497 Binary files /dev/null and b/useless/__pycache__/philotron.cpython-37.pyc differ diff --git a/useless/__pycache__/pipotron.cpython-37.pyc b/useless/__pycache__/pipotron.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..9c0dc62f437eb71610013ee4d2ad569827673c1d Binary files /dev/null and b/useless/__pycache__/pipotron.cpython-37.pyc differ diff --git a/useless/__pycache__/quizz.cpython-37.pyc b/useless/__pycache__/quizz.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..6be4cc40a3225f6e3b69648fda439ec0f3b0ac70 Binary files /dev/null and b/useless/__pycache__/quizz.cpython-37.pyc differ diff --git a/useless/__pycache__/rateau.cpython-37.pyc b/useless/__pycache__/rateau.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..9c21e82af81a396ed606abeb11499e53c49d981b Binary files /dev/null and b/useless/__pycache__/rateau.cpython-37.pyc differ diff --git a/useless/__pycache__/useless.cpython-37.pyc b/useless/__pycache__/useless.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..491705d56e0fb86d2223ccc403cefdca977b942b Binary files /dev/null and b/useless/__pycache__/useless.cpython-37.pyc differ diff --git a/useless/guess.py b/useless/guess.py new file mode 100755 index 0000000000000000000000000000000000000000..d8c002edb7c374b2edb6f3be7440c07b6cf68043 --- /dev/null +++ b/useless/guess.py @@ -0,0 +1,28 @@ +#!/usr/bin/python3 +# coding: utf-8 +# https://fr.akinator.com/game +import akinator + +aki = akinator.Akinator() +def main(): + + q = aki.start_game() + while aki.progression <= 85: + a = input(q + "\n\t") + if a == "b": + try: + q = aki.back() + except akinator.CantGoBackAnyFurther: + pass + else: + q = aki.answer(a) + aki.win() + correct = input(f"It's {aki.name} ({aki.description})! Was I correct?\n{aki.picture}\n\t") + if correct.lower() == "yes" or correct.lower() == "y": + print("Yay\n") + else: + print("Oof\n") + + +if __name__ == '__main__': + main() diff --git a/useless/kohlanta.py b/useless/kohlanta.py new file mode 100755 index 0000000000000000000000000000000000000000..c0ebeac7df9e51942575596fa8510df19714a755 --- /dev/null +++ b/useless/kohlanta.py @@ -0,0 +1,17 @@ +#!/usr/bin/python3 +# -*- coding: utf-8 -*- + +import random + +sentences = [ + "$NAME, les aventuriers de la tribu $CHANN ont decidés de vous eliminer, et leur sentence est irrevocable", + "AH ! Ca veut dire que $NAME ne sait pas construire une cabane ?", + "$NAME, le conseil a decidé de vous eliminer, et leur sentence est irrevocable"] + + +def kohlanta(name, channel): + return random.choice(sentences).replace("$NAME", name).replace("$CHANN", channel) + + +if __name__ == '__main__': + print(kohlanta(input('entre un nom >'), input('entre une tribu >'))) diff --git a/useless/manger.py b/useless/manger.py new file mode 100755 index 0000000000000000000000000000000000000000..2296bc4c1370bc8a71e47046a356d35a9ee406d1 --- /dev/null +++ b/useless/manger.py @@ -0,0 +1,33 @@ +#!/usr/bin/python3 + +from datetime import datetime + + +def is_l_heure_de_manger(): + date = datetime.now().time() + hour = date.hour + minutes = date.minute + return hour >= 11 and minutes >= 30 or hour >= 13 + + +mots = ["manger", "faim", "nourriture", "miam", "bouffe", "mange"] + + +def should_ban(message): + global mots + msg = message.lower().split(" ") + for f in msg: + if f in mots: + return True + return False + + +def watcher(message): + if not is_l_heure_de_manger() and should_ban(message): + return 'NON C\'EST PAS L\'HEURE PUTIN !' + else: + return '' + + +if __name__ == '__main__': + print(watcher(input('entre un texte pour voir >')))