Skip to content

Commit

Permalink
Merge pull request #106 from MasterCruelty/develop
Browse files Browse the repository at this point in the history
🚀 /Trivial feature and db update
  • Loading branch information
MasterCruelty authored Jan 3, 2023
2 parents 6469830 + 9dfb3f7 commit f6aee4e
Show file tree
Hide file tree
Showing 10 changed files with 612 additions and 17 deletions.
1 change: 1 addition & 0 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -18,6 +18,7 @@ json_message.json
#Ignora file img e sat24.gif
img.png
sat24.gif
graph.png

#Ignora log e aux file
*.aux
Expand Down
14 changes: 14 additions & 0 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -52,6 +52,11 @@ Le spiegazioni sono in Italiano, ma volendo si possono tradurre in qualsiasi lin
* mostrare tutti gli utenti registrati: ```/listrobuser```
* mostrare il numero di utenti registrati: ```/allrobuser```
* verificare se il bot è online: ```/pingrob```
* registrare un nuovo gruppo come unico autorizzato a ricevere un certo comando: `/setgroup` <id_gruppo> <comando>
* cancellare un gruppo salvato: `/delgroup` <id_gruppo>
* mostrare tutti i gruppi salvati: `/listgroup`
* modificare un valore nelle statistiche di un utente per un certo comando: `/updatestat` <id_utente> <comando> <nuovo_valore>
* cancellare un comando dalle statistiche di un utente: `/delstat` <id_utente> <comando>

### Dipendenze

Expand All @@ -78,6 +83,8 @@ Le spiegazioni sono in Italiano, ma volendo si possono tradurre in qualsiasi lin
* [Tper open data](https://solweb.tper.it/web/tools/open-data/open-data.aspx)
* [TrainMonitor per le API viaggiatreno](https://github.com/bluviolin/TrainMonitor) (Queste API non sono pubbliche, non abusate del servizio)
* [Trenitalia-API di SimoDax per le API frecce.it](https://github.com/SimoDax/Trenitalia-API) (Queste API non sono pubbliche, non abusate del servizio)
* [Piste Kart Italia(scraping)](https://www.pistekartitalia.it)
* [Open Trivia Database](https://opentdb.com/)

# **[ENG]**

Expand Down Expand Up @@ -112,6 +119,11 @@ This json file is only in Italian, but you can translate it in every languages b
* How to list all user registered: ```/listrobuser```
* How to show ho many users are registered: ```/allrobuser```
* check if the bot is online: ```/pingrob```
* Save a new group to make it the only one authorized to receive a specific command: `/setgroup` <id_group> <command>
* Delete a saved group: `/delgroup` <id_group>
* Show all saved groups: `/listgroup`
* Update a value in a user's stat for a specific command: `/updatestat` <id_user> <command> <new_value>
* Delete a command from a user's stat: `/delstat` <id_user> <command>


### Dependencies
Expand Down Expand Up @@ -140,3 +152,5 @@ This json file is only in Italian, but you can translate it in every languages b
* [Tper open data](https://solweb.tper.it/web/tools/open-data/open-data.aspx)
* [TrainMonitor for viaggiatreno API](https://github.com/bluviolin/TrainMonitor) (These API aren't public, don't abuse the service)
* [SimoDax's wiki for frecce.it API](https://github.com/SimoDax/Trenitalia-API) (These API aren't public, don't abuse the service)
* [Piste Kart Italia(scraping)](https://www.pistekartitalia.it)
* [Open Trivia Database](https://opentdb.com/)
4 changes: 2 additions & 2 deletions app.py
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
from pyrogram import Client
from utils.controller import *
from utils.dbfunctions import *
from utils.get_config import get_config_file,get_username,get_text_message,get_chat,get_id_msg,get_id_user,get_first_name
from utils.get_config import get_config_file,get_username,get_text_message,get_chat,get_id_msg,get_id_user,get_first_name,get_chat_name
from utils.sysfunctions import *

config = get_config_file("config.json")
Expand All @@ -20,7 +20,7 @@ def print_updates(client,message):
chat = get_chat(message)
id_messaggio = get_id_msg(message)
utente = get_id_user(message)
nome_chat = message.chat.title
nome_chat = get_chat_name(message)
nome_utente = get_first_name(message)
username = get_username(message)
messaggio = get_text_message(message)
Expand Down
5 changes: 3 additions & 2 deletions help.json
Original file line number Diff line number Diff line change
Expand Up @@ -17,7 +17,7 @@
"searchatm":"**/searchatm 'address'** => Restituisce tutte le fermate trovate con quell'indirizzo.\n__/searchatm via vigevano__\n"
},
"tper":{
"intro":"__Features disponibili per il trasporto pubblico di Bologna e Ferrara__\n",
"intro":"__Features disponibili per il trasporto pubblico in quasi tutta la Regione Emilia-Romagna.__\n",
"tper_default":"**/tper 'stop_code'** => restituisce i dati relativi alla fermata inserita.\n<u>Se ti serve solo una linea in particolare sulla fermata, aggiungi uno spazio e mettila.</u>\n __Esempio: /tper 1234 30__\n**1234 è la fermta e 30 è la linea di cui voglio sapere gli orari.**\n\n",
"tpershop": "**/tpershop 'stop_code'** => restituisce la rivendita più vicina alla fermata inserita.\n"
},
Expand All @@ -44,5 +44,6 @@
},
"openai":"**/ai 'input' ** => genera un testo in base all'input dato grazie alle api di OpenAI",
"urban": "**/urban 'word' ** => restituisce la definizione di urban dictionary per la parola richiesta",
"default": "Cerca un comando in particolare come ad esempio:\n /helprob wiki\n__Comandi: wiki, lyrics, covid, vaccine, weather, urban, poll, reminder, tper, atm, treni e mappe.\n\ncomandi admin: **playlotto, getmessage, weathermap, weathersat, openai e pingrob.**\nVuoi usarli? Diventa un utente premium! Contatta @MasterCruelty__"
"trivial": "__**Questo comando è disponibile solo in alcune chat decise dall'admin.\nI nomi delle categorie sono listati nel gruppo ufficiale del gioco.**__\n\n**/trivial** ==> quiz vero/falso oppure a scelta multipla in una categoria randomica.\n**/trivial categoria** ==> quiz della categoria scelta.\n__Esempio: /trivial history per un quiz in storia.__\n/globaltscore per classifica globale.\n/globaltscore 'categoria' per filtrare.\n/mytscore per quella personale.\n\n",
"default": "Cerca un comando in particolare come ad esempio:\n /helprob wiki\n__Comandi: wiki, lyrics, covid, vaccine, weather, urban, poll, reminder, tper, atm, treni, kart, trivial e mappe.\n\ncomandi admin: **playlotto, getmessage, weathermap, weathersat, openai e pingrob.**\nVuoi usarli? Diventa un utente premium! Contatta @MasterCruelty__"
}
7 changes: 6 additions & 1 deletion modules/pistekart.py
Original file line number Diff line number Diff line change
Expand Up @@ -33,6 +33,8 @@ def get_piste_region(query,client,message):
pista = ""
else:
pista += results[i] + "\n"
if result == "" and i == len(results)-1:
result = pista

try:
return sendMessage(client,message,result)
Expand Down Expand Up @@ -62,5 +64,8 @@ def get_info_pista(query,client,message):

#invio messaggio con descrizione pista e foto tracciato
sendMessage(client,message,"__" + info_track+ "__")
sendPhoto(client,message,img_url,"__Foto del tracciato__")
try:
sendPhoto(client,message,img_url,"__Foto del tracciato__")
except ValueError:
sendMessage(client,message,"__Foto del tracciato non disponibile__")

248 changes: 248 additions & 0 deletions modules/trivial.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,248 @@
from utils.get_config import sendMessage,get_chat,get_id_msg,get_id_user
from utils.dbfunctions import personal_trivial_leaderboard,global_trivial_leaderboard_category,update_trivial_score,get_trivial_data,save_trivial_data,delete_trivial_data
from pyrogram import Client,errors
from pyrogram.enums import PollType
from pyrogram.handlers import PollHandler,RawUpdateHandler
from pyrogram.raw.types import UpdateMessagePollVote
import requests
import json
import random
import time
from bs4 import BeautifulSoup


categorie = {"General Knowledge" :9,
"Entertainment: Books" :10,
"Entertainment: Film" :11,
"Entertainment: Music" :12,
"Entertainment: Musical & Theatres" :13,
"Entertainment: Television" :14,
"Entertainment: Video Games" :15,
"Entertainment: Board Games" :16,
"Science & Nature" :17,
"Science: Computers" :18,
"Science: Mathematics" :19,
"Mythology" :20,
"Sports" :21,
"Geography" :22,
"History" :23,
"Politics" :24,
"Art" :25,
"Celebrities" :26,
"Animals" :27,
"Vehicles" :28,
"Entertainment: Comics" :29,
"Science: Gadgets" :30,
"Entertainment: Japanese Anime & Manga":31,
"Entertainment: Cartoon & Animations" :32}


tipo_domanda = {"tf" :"boolean",
"multi" :"multiple"}

response_code = {0:"Ok",
1:"No Results",
2:"Invalid Parameter",
3:"Token not found",
4:"Token Empty"}


global token

"""
Chiamata per la creazione di un token che garantisce l'unicità delle domande fetchate da opentb.com
Il token ha una vita di 6 ore se inattivo ininterrottamente.
Una volta esaurito, va resettato e generato di nuovo.
"""
def create_token():
global token
url = "https://opentdb.com/api_token.php?command=request"
resp = requests.get(url)
data = json.loads(resp.text)
if data["response_code"] == 0:
token = data["token"]
else:
return response_code[data["response_code"]]
return token

"""
Chiamata per il reset del token nel caso in cui sia stato esaurito completamente.
"""
def reset_token():
global token
url = "https://opentb.com/api_token.php?command=reset&token=" + token
resp = requests.get(url)
data = json.loads(resp.text)
if data["response_code"] == 0:
token = data["token"]
else:
return response_code[data["response_code"]]
return token



"""
Controlla se il token è in buono stato e quindi se non lo è lo resetta o lo crea se non esistente.
"""
def check_token():
#check token existence
try:
if token == None:
token = create_token()
except NameError:
token = create_token()
#check token is good
if token == "Token Empty":
token = reset_token()
elif len(token) < 17:
return sendMessage(client,message,token)
return token


"""
funzione ausiliaria per settare la difficoltà randomicamente
"""
def set_difficulty():
difficulty_list = ["easy","medium","hard"]
random.shuffle(difficulty_list)
return difficulty_list[0]


"""
Conversione codifica HTML in testo
"""
def html2text(strings):
result = []
for i in range(len(strings)):
zuppa = BeautifulSoup(strings[i],features="lxml")
result.append(zuppa.get_text())
return result

"""
Come sopra ma per le stringhe singole e non liste
"""
def html2text_str(string):
zuppa = BeautifulSoup(string,features="lxml")
result = zuppa.get_text()
return result

"""
randomizza se scegliere vero/falso o risposta multipla
"""
def get_question_type():
#create question type in random mode
n = random.randint(0,100)
question_list = ["tf","multi"]
if n >= 65:
question_type = question_list[0]
else:
question_type = question_list[1]
return question_type

"""
Restituisce una domanda quiz tramite le api di opentdb.com
Definizione di alcune variabili globali per tenere dei valori in memoria tra una funzione e la callback
"""
@Client.on_message()
def send_question(query,client,message):
#check token
global token
token = check_token()

#build parameter for request
if query == "/trivial":
#Build random options for the request
category_number = random.randint(9,32)
question_type = get_question_type()
#setting difficulty
difficulty = set_difficulty()
else:
splitted = query.split(" ")
try:
category = splitted[0].title()
for item in categorie:
if category in item:
category_number = categorie[item]
break
question_type = get_question_type()
difficulty = set_difficulty()
except IndexError:
return sendMessage(client,message,"__Errore formato trivial.__")

#build api url
api_url = "https://opentdb.com/api.php?amount=1&category=" + str(category_number) + "&difficulty=" + difficulty + "&type=" + tipo_domanda[question_type] + "&token=" + token
resp = requests.get(api_url)
data = json.loads(resp.text)
incorrect = []
question = ""
correct = ""
for item in data["results"]:
category = item["category"]
difficulty = item["difficulty"]
question = item["question"]
correct = item["correct_answer"]
incorrect = item["incorrect_answers"]
incorrect.append(correct)
random.shuffle(incorrect)
#prepare question and send
question = html2text_str(question)
correct = html2text_str(correct)
incorrect = html2text(incorrect)

#aggiungo handler per ricevere aggiornamenti sul quiz in corso
#riga commentata per quando in futuro sarà possibile ricevere update anche sui quiz
#client.add_handler(PollHandler(callback=check_trivial_updates))

client.add_handler(RawUpdateHandler(callback=check_trivial_updates))

try:
msg = client.send_poll(get_chat(message),question="Category: " + category.title() + "\nDifficulty: " + difficulty.title() + "\n" + question,options=incorrect,type=PollType.QUIZ,correct_option_id=incorrect.index(correct),open_period=20,is_anonymous=False,reply_to_message_id=get_id_msg(message))

#aggiungo su db dati sul trivial in corso
save_trivial_data(get_chat(message),msg.id,difficulty.title(),category.title(),tipo_domanda[question_type].title())

except errors.exceptions.bad_request_400.PollAnswersInvalid:
return sendMessage(client,message,"__Errore durante invio trivial__")


punteggi = { 'Easy' : 1,
'Medium': 2,
'Hard' : 3}

"""
Funzione che prende raw updates per ogni volta che un giocatore vota sul quiz, assegnando o meno il punteggio.
"""
@Client.on_raw_update()
def check_trivial_updates(client,update,users,chat):
if isinstance(update,UpdateMessagePollVote):
data = update
player = data.user_id
chosen = data.options[0]
int_chosen = int.from_bytes(chosen,"big")
query = get_trivial_data()
for item in query:
polldata = client.get_messages(item.id_chat,item.id_msg)
if (int(polldata.poll.id) == int(data.poll_id)) and (int(int_chosen) == int(polldata.poll.correct_option_id)):
print(str(player) + " ha risposto correttamente")
if item.qtype == 'Boolean':
update_trivial_score(player,1,item.category,client,update)
else:
update_trivial_score(player,punteggi[item.diff],item.category,client,update)
elif polldata.poll.is_closed:
delete_trivial_data(item.id_msg)

"""
richiamo funzione per punteggi personali
"""
def get_personal_score(_,client,message):
return personal_trivial_leaderboard(get_id_user(message),client,message)

"""
richiamo funzione per classifica globale
"""
def get_global_score(query,client,message):
for item in categorie:
if query.title() in item:
query = item
return global_trivial_leaderboard_category(query,client,message)

Loading

0 comments on commit f6aee4e

Please sign in to comment.