2018-01-25 14:24:17 +00:00
import datetime
2017-11-11 17:55:13 +00:00
import random
2018-07-23 17:34:41 +00:00
import typing
2017-10-30 09:46:37 +00:00
import db
import errors
2018-01-25 14:24:17 +00:00
import stagismo
2018-03-14 10:53:26 +00:00
from telegram import Bot , Update , InlineKeyboardMarkup , InlineKeyboardButton
from telegram . ext import Updater , CommandHandler , CallbackQueryHandler
2018-04-09 21:02:24 +00:00
import telegram . error
2018-09-11 00:02:09 +00:00
import dice
2018-09-13 16:38:21 +00:00
import sys
2018-04-09 17:56:43 +00:00
import os
2018-04-09 21:02:24 +00:00
import time
2018-04-20 17:46:33 +00:00
import cast
2018-05-31 20:14:50 +00:00
import re
2018-08-08 19:59:47 +00:00
import logging
import configparser
import markovify
2018-09-13 16:38:21 +00:00
import raven
2018-08-08 19:59:47 +00:00
# Markov model
try :
with open ( " markovmodel.json " ) as file :
model = markovify . Text . from_json ( file . read ( ) )
except Exception :
model = None
2018-08-16 17:33:38 +00:00
logging . getLogger ( ) . setLevel ( level = logging . ERROR )
2018-08-16 17:46:07 +00:00
logger = logging . getLogger ( __name__ )
logger . setLevel ( level = logging . DEBUG )
2017-10-30 09:46:37 +00:00
# Init the config reader
config = configparser . ConfigParser ( )
config . read ( " config.ini " )
2017-11-11 17:55:13 +00:00
discord_connection = None
2018-09-13 16:38:21 +00:00
# Init the Sentry client
sentry = raven . Client ( config [ " Sentry " ] [ " token " ] ,
release = raven . fetch_git_sha ( os . path . dirname ( __file__ ) ) ,
install_logging_hook = False ,
hook_libraries = [ ] )
2018-09-13 21:11:56 +00:00
def catch_and_report ( func : " function " ) :
def new_func ( bot : Bot , update : Update ) :
2018-09-13 16:38:21 +00:00
# noinspection PyBroadException
try :
2018-09-13 21:11:56 +00:00
return func ( bot , update )
2018-09-13 16:38:21 +00:00
except Exception :
2018-09-13 21:11:56 +00:00
logger . error ( f " Critical error: { sys . exc_info ( ) } " )
# noinspection PyBroadException
try :
bot . send_message ( int ( config [ " Telegram " ] [ " main_group " ] ) ,
2018-09-13 21:32:05 +00:00
" ☢ **ERRORE CRITICO!** \n "
f " Il bot ha ignorato il comando. \n "
2018-09-13 21:11:56 +00:00
f " Una segnalazione di errore è stata automaticamente mandata a @Steffo. \n \n "
f " Dettagli dell ' errore: \n "
f " ``` \n "
f " { sys . exc_info ( ) } \n "
f " ``` " , parse_mode = " Markdown " )
except Exception :
logger . error ( f " Double critical error: { sys . exc_info ( ) } " )
if not __debug__ :
sentry . user_context ( {
" id " : update . effective_user . id ,
" telegram " : {
" username " : update . effective_user . username ,
" first_name " : update . effective_user . first_name ,
" last_name " : update . effective_user . last_name
}
} )
sentry . extra_context ( {
" update " : update . to_dict ( )
} )
sentry . captureException ( )
return new_func
@catch_and_report
2017-10-30 09:46:37 +00:00
def cmd_register ( bot : Bot , update : Update ) :
session = db . Session ( )
try :
username = update . message . text . split ( " " , 1 ) [ 1 ]
except IndexError :
bot . send_message ( update . message . chat . id , " ⚠️ Non hai specificato un username! " )
2018-01-25 14:24:17 +00:00
session . close ( )
2017-10-30 09:46:37 +00:00
return
try :
t = db . Telegram . create ( session ,
royal_username = username ,
telegram_user = update . message . from_user )
except errors . AlreadyExistingError :
2018-04-15 11:43:24 +00:00
bot . send_message ( update . message . chat . id , " ⚠ Il tuo account Telegram è già collegato a un account RYG o "
" l ' account RYG che hai specificato è già collegato a un account "
" Telegram. " )
2018-01-25 14:24:17 +00:00
session . close ( )
2017-10-30 09:46:37 +00:00
return
session . add ( t )
session . commit ( )
bot . send_message ( update . message . chat . id , " ✅ Sincronizzazione completata! " )
session . close ( )
2017-10-30 12:45:38 +00:00
2018-09-13 21:11:56 +00:00
@catch_and_report
2017-10-30 12:45:38 +00:00
def cmd_discord ( bot : Bot , update : Update ) :
2018-01-20 14:28:04 +00:00
if discord_connection is None :
2018-06-13 22:10:57 +00:00
bot . send_message ( update . message . chat . id , " ⚠ Il bot non è collegato a Discord al momento. " )
2018-01-20 14:28:04 +00:00
return
2018-06-13 22:10:57 +00:00
discord_connection . send ( " get cv " )
2018-08-28 13:48:12 +00:00
message = discord_connection . recv ( )
2018-01-20 14:28:04 +00:00
bot . send_message ( update . message . chat . id , message , disable_web_page_preview = True )
2017-10-30 12:45:38 +00:00
2018-09-13 21:11:56 +00:00
@catch_and_report
2017-11-11 17:55:13 +00:00
def cmd_cast ( bot : Bot , update : Update ) :
try :
2018-04-20 17:46:33 +00:00
spell : str = update . message . text . split ( " " , 1 ) [ 1 ]
2017-11-11 17:55:13 +00:00
except IndexError :
bot . send_message ( update . message . chat . id , " ⚠️ Non hai specificato nessun incantesimo! \n "
2018-09-13 21:36:56 +00:00
" Sintassi corretta: `/cast <nome_incantesimo>` " , parse_mode = " Markdown " )
2017-11-11 17:55:13 +00:00
return
# Open a new db session
session = db . Session ( )
# Find a target for the spell
target = random . sample ( session . query ( db . Telegram ) . all ( ) , 1 ) [ 0 ]
# Close the session
session . close ( )
2018-04-20 17:46:33 +00:00
bot . send_message ( update . message . chat . id , cast . cast ( spell_name = spell ,
target_name = target . username if target . username is not None
else target . first_name , platform = " telegram " ) ,
parse_mode = " HTML " )
2018-01-25 14:24:17 +00:00
2018-09-13 21:11:56 +00:00
@catch_and_report
2018-01-25 14:24:17 +00:00
def cmd_color ( bot : Bot , update : Update ) :
bot . send_message ( update . message . chat . id , " I am sorry, unknown error occured during working with your request, Admin were notified " )
2018-09-13 21:11:56 +00:00
@catch_and_report
2018-01-25 14:24:17 +00:00
def cmd_smecds ( bot : Bot , update : Update ) :
ds = random . sample ( stagismo . listona , 1 ) [ 0 ]
bot . send_message ( update . message . chat . id , f " Secondo me, è colpa { ds } . " )
2018-09-13 21:11:56 +00:00
@catch_and_report
2018-01-25 14:24:17 +00:00
def cmd_ciaoruozi ( bot : Bot , update : Update ) :
if update . message . from_user . username . lstrip ( " @ " ) == " MeStakes " :
bot . send_message ( update . message . chat . id , " Ciao me! " )
else :
bot . send_message ( update . message . chat . id , " Ciao Ruozi! " )
2018-09-13 21:11:56 +00:00
@catch_and_report
2018-01-25 14:24:17 +00:00
def cmd_ahnonlosoio ( bot : Bot , update : Update ) :
if update . message . reply_to_message is not None and update . message . reply_to_message . text in [ " /ahnonlosoio " , " /ahnonlosoio@royalgamesbot " , " Ah, non lo so io! " ] :
bot . send_message ( update . message . chat . id , " Ah, non lo so neppure io! " )
else :
bot . send_message ( update . message . chat . id , " Ah, non lo so io! " )
2018-09-13 21:11:56 +00:00
@catch_and_report
2018-01-25 14:24:17 +00:00
def cmd_balurage ( bot : Bot , update : Update ) :
session = db . Session ( )
try :
user = session . query ( db . Telegram ) . filter_by ( telegram_id = update . message . from_user . id ) . one_or_none ( )
if user is None :
2018-09-13 21:36:56 +00:00
bot . send_message ( update . message . chat . id , " ⚠ Il tuo account Telegram non è registrato al RYGdb! Registrati con `/register@royalgamesbot <nomeutenteryg>`. " , parse_mode = " Markdown " )
2018-01-25 14:24:17 +00:00
return
try :
reason = update . message . text . split ( " " , 1 ) [ 1 ]
except IndexError :
reason = None
br = db . BaluRage ( royal_id = user . royal_id , reason = reason )
session . add ( br )
session . commit ( )
bot . send_message ( update . message . chat . id , f " 😡 Stai sfogando la tua ira sul bot! " )
2018-03-14 10:53:26 +00:00
except Exception :
2018-01-25 14:24:17 +00:00
raise
finally :
session . close ( )
2018-09-13 21:11:56 +00:00
@catch_and_report
2018-01-25 14:24:17 +00:00
def cmd_diario ( bot : Bot , update : Update ) :
session = db . Session ( )
try :
user = session . query ( db . Telegram ) . filter_by ( telegram_id = update . message . from_user . id ) . one_or_none ( )
if user is None :
2018-09-13 21:36:56 +00:00
bot . send_message ( update . message . chat . id , " ⚠ Il tuo account Telegram non è registrato al RYGdb! "
" Registrati con `/register@royalgamesbot <nomeutenteryg>`. " ,
parse_mode = " Markdown " )
2018-01-25 14:24:17 +00:00
return
try :
text = update . message . text . split ( " " , 1 ) [ 1 ]
author = session . query ( db . Telegram ) . filter_by ( telegram_id = update . message . from_user . id ) . one_or_none ( )
saver = author
except IndexError :
if update . message . reply_to_message is None :
bot . send_message ( update . message . chat . id , f " ⚠ Non hai specificato cosa aggiungere al diario! Puoi rispondere `/diario@royalgamesbot` al messaggio che vuoi salvare nel diario oppure scrivere `/diario@royalgamesbot <messaggio>` per aggiungere quel messaggio nel diario. \n "
2018-09-13 21:36:56 +00:00
f " Se l ' hai fatto, e continua a comparire questo errore, allora Telegram è stupido e non mi vuole far vedere il messaggio a cui hai risposto. " , parse_mode = " Markdown " )
2018-01-25 14:24:17 +00:00
return
text = update . message . reply_to_message . text
author = session . query ( db . Telegram ) . filter_by ( telegram_id = update . message . reply_to_message . from_user . id ) . one_or_none ( )
saver = session . query ( db . Telegram ) . filter_by ( telegram_id = update . message . from_user . id ) . one_or_none ( )
if text is None :
bot . send_message ( update . message . chat . id , f " ⚠ Il messaggio a cui hai risposto non contiene testo. " )
return
diario = db . Diario ( timestamp = datetime . datetime . now ( ) ,
saver = saver ,
author = author ,
text = text )
session . add ( diario )
session . commit ( )
bot . send_message ( update . message . chat . id , f " ✅ Aggiunto al diario! " )
except Exception :
raise
finally :
session . close ( )
2017-11-11 17:55:13 +00:00
2018-09-13 21:11:56 +00:00
@catch_and_report
2018-03-14 10:53:26 +00:00
def cmd_vote ( bot : Bot , update : Update ) :
session = db . Session ( )
try :
user = session . query ( db . Telegram ) . filter_by ( telegram_id = update . message . from_user . id ) . one_or_none ( )
if user is None :
bot . send_message ( update . message . chat . id ,
2018-07-24 17:23:19 +00:00
" ⚠ Il tuo account Telegram non è registrato al RYGdb! "
2018-09-13 21:36:56 +00:00
" Registrati con `/register@royalgamesbot <nomeutenteryg>`. " , parse_mode = " Markdown " )
2018-03-14 10:53:26 +00:00
return
try :
_ , mode , question = update . message . text . split ( " " , 2 )
except IndexError :
bot . send_message ( update . message . chat . id ,
" ⚠ Non hai specificato tutti i parametri necessari! "
2018-09-13 21:36:56 +00:00
" Sintassi: `/vote@royalgamesbot <public|secret> <domanda>` " , parse_mode = " Markdown " )
2018-03-14 10:53:26 +00:00
return
if mode == " public " :
vote = db . VoteQuestion ( question = question , anonymous = False )
elif mode == " secret " :
vote = db . VoteQuestion ( question = question , anonymous = True )
else :
bot . send_message ( update . message . chat . id ,
" ⚠ Non hai specificato una modalità valida! "
2018-09-13 21:36:56 +00:00
" Sintassi: `/vote@royalgamesbot <public|secret> <domanda>` " , parse_mode = " Markdown " )
2018-03-14 10:53:26 +00:00
return
session . add ( vote )
session . flush ( )
inline_keyboard = InlineKeyboardMarkup ( [ [ InlineKeyboardButton ( " 🔵 Sì " , callback_data = " vote_yes " ) ] ,
[ InlineKeyboardButton ( " 🔴 No " , callback_data = " vote_no " ) ] ,
[ InlineKeyboardButton ( " ⚫️ Astieniti " , callback_data = " vote_abstain " ) ] ] )
message = bot . send_message ( update . message . chat . id , vote . generate_text ( session = session ) , reply_markup = inline_keyboard ,
parse_mode = " HTML " )
vote . message_id = message . message_id
session . commit ( )
2018-03-14 15:28:49 +00:00
except Exception as e :
2018-03-14 10:53:26 +00:00
raise
finally :
session . close ( )
2018-09-13 21:11:56 +00:00
@catch_and_report
2018-03-14 10:53:26 +00:00
def on_callback_query ( bot : Bot , update : Update ) :
if update . callback_query . data == " vote_yes " :
choice = db . VoteChoices . YES
emoji = " 🔵 "
elif update . callback_query . data == " vote_no " :
choice = db . VoteChoices . NO
emoji = " 🔴 "
elif update . callback_query . data == " vote_abstain " :
choice = db . VoteChoices . ABSTAIN
emoji = " ⚫️ "
else :
raise NotImplementedError ( )
if update . callback_query . data . startswith ( " vote_ " ) :
session = db . Session ( )
try :
user = session . query ( db . Telegram ) . filter_by ( telegram_id = update . callback_query . from_user . id ) . one_or_none ( )
if user is None :
bot . answer_callback_query ( update . callback_query . id , show_alert = True ,
2018-04-15 11:43:24 +00:00
text = " ⚠ Il tuo account Telegram non è registrato al RYGdb! "
2018-09-13 21:36:56 +00:00
" Registrati con `/register@royalgamesbot <nomeutenteryg>`. " , parse_mode = " Markdown " )
2018-03-14 10:53:26 +00:00
return
question = session . query ( db . VoteQuestion ) . filter_by ( message_id = update . callback_query . message . message_id ) . one ( )
answer = session . query ( db . VoteAnswer ) . filter_by ( question = question , user = user ) . one_or_none ( )
if answer is None :
answer = db . VoteAnswer ( question = question , choice = choice , user = user )
session . add ( answer )
else :
answer . choice = choice
session . commit ( )
bot . answer_callback_query ( update . callback_query . id , text = f " Hai votato { emoji } . " , cache_time = 1 )
inline_keyboard = InlineKeyboardMarkup ( [ [ InlineKeyboardButton ( " 🔵 Sì " , callback_data = " vote_yes " ) ] ,
[ InlineKeyboardButton ( " 🔴 No " , callback_data = " vote_no " ) ] ,
[ InlineKeyboardButton ( " ⚫️ Astieniti " , callback_data = " vote_abstain " ) ] ] )
bot . edit_message_text ( message_id = update . callback_query . message . message_id , chat_id = update . callback_query . message . chat . id ,
text = question . generate_text ( session ) , reply_markup = inline_keyboard ,
parse_mode = " HTML " )
2018-04-15 11:43:24 +00:00
except Exception :
2018-03-14 10:53:26 +00:00
raise
finally :
session . close ( )
2018-09-13 21:11:56 +00:00
@catch_and_report
2018-04-01 10:57:24 +00:00
def cmd_ban ( bot : Bot , update : Update ) :
2018-04-12 16:04:13 +00:00
if datetime . date . today ( ) != datetime . date ( 2019 , 4 , 1 ) :
2018-04-01 10:57:24 +00:00
bot . send_message ( update . message . chat . id , " ⚠ Non è il giorno adatto per bannare persone! " )
return
session = db . Session ( )
try :
2018-04-12 16:04:13 +00:00
last_bans = session . query ( db . AprilFoolsBan ) . filter ( db . AprilFoolsBan . datetime > ( datetime . datetime . now ( ) - datetime . timedelta ( minutes = 15 ) ) ) . all ( )
2018-04-01 10:57:24 +00:00
if len ( last_bans ) > 0 :
bot . send_message ( update . message . chat . id , " ⚠ /ban è in cooldown. \n "
2018-04-12 16:04:13 +00:00
" Può essere usato solo 1 volta ogni 15 minuti! " )
2018-04-01 10:57:24 +00:00
return
try :
arg = update . message . text . split ( " " , 1 ) [ 1 ]
except IndexError :
bot . send_message ( update . message . chat . id , " ⚠ Devi specificare un bersaglio! " )
return
target_user = session . query ( db . Telegram ) . filter_by ( username = arg ) . one_or_none ( )
if target_user is None :
bot . send_message ( update . message . chat . id , " ⚠ Il bersaglio specificato non esiste nel RYGdb. \n "
2018-04-15 11:43:24 +00:00
" Le possibilità sono due: non è un membro RYG, "
" oppure non si è ancora registrato e va bannato manualmente. " )
2018-04-01 10:57:24 +00:00
return
if int ( target_user . telegram_id ) == 25167391 :
bot . send_message ( update . message . chat . id , " ⚠ Il creatore della chat non può essere espulso. " )
return
bannerino = db . AprilFoolsBan ( from_user_id = update . message . from_user . id , to_user_id = target_user . telegram_id , datetime = datetime . datetime . now ( ) )
session . add ( bannerino )
session . commit ( )
bot . kick_chat_member ( update . message . chat . id , target_user . telegram_id )
bot . unban_chat_member ( update . message . chat . id , target_user . telegram_id )
try :
bot . send_message ( target_user . telegram_id , " https://t.me/joinchat/AYAGH0TEav8WcbPVfNe75A " )
except Exception :
pass
bot . send_message ( update . message . chat . id , " 🔨 " )
except Exception as e :
pass
finally :
session . close ( )
2018-09-13 21:11:56 +00:00
@catch_and_report
2018-05-27 22:08:28 +00:00
def cmd_eat ( bot : Bot , update : Update ) :
try :
food : str = update . message . text . split ( " " , 1 ) [ 1 ] . capitalize ( )
except IndexError :
bot . send_message ( update . message . chat . id , " ⚠️ Non hai specificato cosa mangiare! \n "
2018-09-13 21:36:56 +00:00
" Sintassi corretta: `/eat <cibo>` " , parse_mode = " Markdown " )
2018-05-27 22:08:28 +00:00
return
2018-06-04 09:58:27 +00:00
if " tonnuooooooro " in food . lower ( ) :
2018-05-29 21:50:47 +00:00
bot . send_message ( update . message . chat . id , " 👻 Il pesce che hai mangiato era posseduto. \n "
" Spooky! " )
return
2018-05-27 22:08:28 +00:00
bot . send_message ( update . message . chat . id , f " 🍗 Hai mangiato { food } ! " )
2018-09-13 21:11:56 +00:00
@catch_and_report
2018-05-31 20:14:50 +00:00
def cmd_ship ( bot : Bot , update : Update ) :
try :
_ , name_one , name_two = update . message . text . split ( " " , 2 )
except IndexError :
bot . send_message ( update . message . chat . id , " ⚠️ Non hai specificato correttamente i due nomi! \n "
2018-09-13 21:36:56 +00:00
" Sintassi corretta: `/ship <nome> <nome>` " , parse_mode = " Markdown " )
2018-05-31 20:14:50 +00:00
return
name_one = name_one . lower ( )
name_two = name_two . lower ( )
part_one = re . search ( r " ^[A-Za-z][^aeiouAEIOU]*[aeiouAEIOU]? " , name_one )
part_two = re . search ( r " [^aeiouAEIOU]*[aeiouAEIOU]?[A-Za-z]$ " , name_two )
try :
mixed = part_one . group ( 0 ) + part_two . group ( 0 )
except :
bot . send_message ( update . message . chat . id , " ⚠ I nomi specificati non sono validi. \n "
" Riprova con dei nomi diversi! " )
return
if part_one is None or part_two is None :
bot . send_message ( update . message . chat . id , " ⚠ I nomi specificati non sono validi. \n "
" Riprova con dei nomi diversi! " )
return
bot . send_message ( update . message . chat . id , f " 💕 { name_one . capitalize ( ) } + { name_two . capitalize ( ) } = "
f " { mixed . capitalize ( ) } " )
2018-09-13 21:11:56 +00:00
@catch_and_report
2018-06-04 20:54:12 +00:00
def cmd_profile ( bot : Bot , update : Update ) :
session = db . Session ( )
user = session . query ( db . Telegram ) . filter_by ( telegram_id = update . message . from_user . id ) . join ( db . Royal ) . one_or_none ( )
session . close ( )
if user is None :
bot . send_message ( update . message . chat . id , " ⚠ Non sei connesso a Royalnet! \n "
" Per registrarti, utilizza il comando /register. " )
return
2018-06-04 21:20:08 +00:00
bot . send_message ( update . message . chat . id , f " 👤 [Profilo di { user . royal . username } ] "
2018-06-27 20:16:54 +00:00
f " (http://ryg.steffo.eu/profile/ { user . royal . username } ) \n "
f " Attualmente, hai ** { user . royal . fiorygi } ** fiorygi. " ,
2018-06-04 21:18:50 +00:00
parse_mode = " Markdown " )
2018-06-04 20:54:12 +00:00
2018-09-13 21:11:56 +00:00
@catch_and_report
2018-06-13 22:10:57 +00:00
def cmd_bridge ( bot : Bot , update : Update ) :
try :
data = update . message . text . split ( " " , 1 ) [ 1 ]
except IndexError :
bot . send_message ( update . message . chat . id , " ⚠ Non hai specificato un comando! \n "
2018-09-13 21:36:56 +00:00
" Sintassi corretta: `/bridge <comando> <argomenti>` " , parse_mode = " Markdown " )
2018-06-13 22:10:57 +00:00
discord_connection . send ( f " ! { data } " )
result = discord_connection . recv ( )
if result == " error " :
2018-08-28 13:48:12 +00:00
bot . send_message ( update . message . chat . id , " ⚠ Il comando specificato non esiste. " )
2018-06-13 22:10:57 +00:00
if result == " success " :
bot . send_message ( update . message . chat . id , " ⏩ Comando eseguito su Discord. " )
2018-07-23 17:34:41 +00:00
def parse_timestring ( timestring : str ) - > typing . Union [ datetime . timedelta , datetime . datetime ] :
# Unix time
try :
unix_timestamp = float ( timestring )
return datetime . datetime . fromtimestamp ( unix_timestamp )
except ValueError :
pass
# Dashed time
try :
split_date = timestring . split ( " - " )
now = datetime . datetime . now ( )
if len ( split_date ) == 5 :
# yyyy-mm-dd-hh-mm
2018-07-24 17:31:33 +00:00
return datetime . datetime ( year = int ( split_date [ 0 ] ) ,
month = int ( split_date [ 1 ] ) ,
day = int ( split_date [ 2 ] ) ,
hour = int ( split_date [ 3 ] ) ,
minute = int ( split_date [ 4 ] ) )
2018-07-23 17:34:41 +00:00
elif len ( split_date ) == 4 :
return now . replace ( month = int ( split_date [ 0 ] ) ,
day = int ( split_date [ 1 ] ) ,
hour = int ( split_date [ 2 ] ) ,
minute = int ( split_date [ 3 ] ) )
elif len ( split_date ) == 3 :
return now . replace ( day = int ( split_date [ 0 ] ) ,
hour = int ( split_date [ 1 ] ) ,
minute = int ( split_date [ 2 ] ) )
elif len ( split_date ) == 2 :
return now . replace ( hour = int ( split_date [ 0 ] ) ,
minute = int ( split_date [ 1 ] ) )
except ( IndexError , ValueError ) :
pass
# Simple time from now
try :
if timestring . endswith ( " w " ) :
return datetime . timedelta ( weeks = float ( timestring [ : - 1 ] ) )
elif timestring . endswith ( " d " ) :
return datetime . timedelta ( days = float ( timestring [ : - 1 ] ) )
elif timestring . endswith ( " h " ) :
return datetime . timedelta ( hours = float ( timestring [ : - 1 ] ) )
elif timestring . endswith ( " m " ) :
return datetime . timedelta ( minutes = float ( timestring [ : - 1 ] ) )
except Exception :
pass
# Nothing found
raise ValueError ( " Nothing was found. " )
2018-09-13 21:11:56 +00:00
@catch_and_report
2018-07-23 17:34:41 +00:00
def cmd_newevent ( bot : Bot , update : Update ) :
try :
_ , timestring , name_desc = update . message . text . split ( " " , 2 )
2018-09-14 22:51:25 +00:00
except ValueError :
2018-07-23 17:34:41 +00:00
bot . send_message ( update . message . chat . id , " ⚠️ Sintassi del comando non valida. \n "
" Sintassi corretta: \n "
" ```/newevent <timestamp|[[[anno-]mese-]giorno-]ore-minuti "
" | {numero} { w|d|h|m}> <nome> \n "
2018-09-13 21:36:56 +00:00
" [descrizione]``` " , parse_mode = " Markdown " )
2018-07-23 17:34:41 +00:00
return
try :
2018-07-24 17:29:34 +00:00
name , description = name_desc . split ( " \n " , 1 )
2018-09-14 22:51:25 +00:00
except ValueError :
2018-07-23 17:34:41 +00:00
name = name_desc
description = None
# Parse the timestring
try :
parsed_time = parse_timestring ( timestring )
except ValueError :
bot . send_message ( update . message . chat . id , " ⚠ Non è stato possibile leggere la data. \n "
" Sintassi corretta: \n "
" ```/newevent <timestamp|[[[anno-]mese-]giorno-]ore-minuti "
" | {numero} { w|d|h|m}> <nome> \n "
2018-09-13 21:36:56 +00:00
" [descrizione]``` " , parse_mode = " Markdown " )
2018-07-23 17:34:41 +00:00
return
# Create the event
session = db . Session ( )
telegram_user = session . query ( db . Telegram ) . filter_by ( telegram_id = update . message . from_user . id ) . join ( db . Royal ) . one_or_none ( )
event = db . Event ( author = telegram_user . royal ,
name = name ,
description = description ,
time = datetime . datetime . fromtimestamp ( 0 ) )
# Set the time
if isinstance ( parsed_time , datetime . datetime ) :
event . time = parsed_time
else :
event . time_left = parsed_time
# Save the event
session . add ( event )
session . commit ( )
session . close ( )
bot . send_message ( update . message . chat . id , " ✅ Evento aggiunto al Calendario Royal Games! " )
2018-09-13 21:11:56 +00:00
@catch_and_report
2018-07-24 17:23:19 +00:00
def cmd_calendar ( bot : Bot , update : Update ) :
session = db . Session ( )
next_events = session . query ( db . Event ) . filter ( db . Event . time > datetime . datetime . now ( ) ) . order_by ( db . Event . time ) . all ( )
session . close ( )
msg = " 📆 Prossimi eventi \n "
for event in next_events :
if event . time_left . days > = 1 :
msg + = event . time . strftime ( ' % Y- % m- %d % H: % M ' )
else :
msg + = f " { int ( event . time_left . total_seconds ( ) / / 3600 ) } h " \
f " { int ( ( event . time_left . total_seconds ( ) % 3600 ) / / 60 ) } m "
msg + = f " <b> { event . name } </b> \n "
msg + = ' \n Per ulteriori dettagli, visita <a href= " https://ryg.steffo.eu " >Royalnet</a> '
bot . send_message ( update . message . chat . id , msg , parse_mode = " HTML " , disable_web_page_preview = True )
2018-09-13 21:11:56 +00:00
@catch_and_report
2018-08-08 19:59:47 +00:00
def cmd_markov ( bot : Bot , update : Update ) :
if model is None :
bot . send_message ( update . message . chat . id , " ⚠️ Il modello Markov non è disponibile. " )
return
try :
_ , first_word = update . message . text . split ( " " , 1 )
2018-08-08 20:13:12 +00:00
except ValueError :
2018-08-08 19:59:47 +00:00
sentence = model . make_sentence ( tries = 1000 )
if sentence is None :
bot . send_message ( update . message . chat . id , " ⚠ Complimenti! Hai vinto la lotteria di Markov! \n "
" O forse l ' hai persa. \n "
" Non sono riuscito a generare una frase, riprova. " )
return
bot . send_message ( update . message . chat . id , sentence )
else :
sentence = model . make_sentence_with_start ( first_word , tries = 1000 )
if sentence is None :
bot . send_message ( update . message . chat . id , " ⚠ Non è stato possibile generare frasi partendo da questa "
" parola. " )
return
bot . send_message ( update . message . chat . id , sentence )
2018-09-13 21:11:56 +00:00
@catch_and_report
2018-09-11 00:02:09 +00:00
def cmd_roll ( bot : Bot , update : Update ) :
dice_string = update . message . text . split ( " " , 1 ) [ 1 ]
try :
2018-09-13 16:38:21 +00:00
result = dice . roll ( f " { dice_string } t " )
2018-09-11 00:02:09 +00:00
except dice . DiceBaseException :
bot . send_message ( update . message . chat . id , " ⚠ Il tiro dei dadi è fallito. Controlla la sintassi! " )
return
2018-09-11 00:07:29 +00:00
bot . send_message ( update . message . chat . id , f " 🎲 { result } " )
2018-09-11 00:02:09 +00:00
2018-09-13 21:11:56 +00:00
@catch_and_report
def cmd_exception ( bot : Bot , update : Update ) :
if __debug__ :
raise Exception ( " /exception was called " )
2017-11-11 17:55:13 +00:00
def process ( arg_discord_connection ) :
2018-01-20 14:28:04 +00:00
if arg_discord_connection is not None :
global discord_connection
discord_connection = arg_discord_connection
2018-09-11 00:02:09 +00:00
logger . info ( " Creating updater... " )
2017-10-30 12:45:38 +00:00
u = Updater ( config [ " Telegram " ] [ " bot_token " ] )
2018-09-11 00:02:09 +00:00
logger . info ( " Registering handlers... " )
2017-10-30 12:45:38 +00:00
u . dispatcher . add_handler ( CommandHandler ( " register " , cmd_register ) )
u . dispatcher . add_handler ( CommandHandler ( " discord " , cmd_discord ) )
2018-08-28 13:49:29 +00:00
u . dispatcher . add_handler ( CommandHandler ( " cv " , cmd_discord ) )
2017-11-11 17:55:13 +00:00
u . dispatcher . add_handler ( CommandHandler ( " cast " , cmd_cast ) )
2018-01-25 14:24:17 +00:00
u . dispatcher . add_handler ( CommandHandler ( " color " , cmd_color ) )
u . dispatcher . add_handler ( CommandHandler ( " smecds " , cmd_smecds ) )
u . dispatcher . add_handler ( CommandHandler ( " ciaoruozi " , cmd_ciaoruozi ) )
u . dispatcher . add_handler ( CommandHandler ( " ahnonlosoio " , cmd_ahnonlosoio ) )
u . dispatcher . add_handler ( CommandHandler ( " balurage " , cmd_balurage ) )
u . dispatcher . add_handler ( CommandHandler ( " diario " , cmd_diario ) )
2018-03-14 10:53:26 +00:00
u . dispatcher . add_handler ( CommandHandler ( " vote " , cmd_vote ) )
2018-04-01 10:57:24 +00:00
u . dispatcher . add_handler ( CommandHandler ( " ban " , cmd_ban ) )
2018-05-27 22:08:28 +00:00
u . dispatcher . add_handler ( CommandHandler ( " eat " , cmd_eat ) )
2018-05-31 20:14:50 +00:00
u . dispatcher . add_handler ( CommandHandler ( " ship " , cmd_ship ) )
2018-06-04 20:54:12 +00:00
u . dispatcher . add_handler ( CommandHandler ( " profile " , cmd_profile ) )
2018-06-13 22:10:57 +00:00
u . dispatcher . add_handler ( CommandHandler ( " bridge " , cmd_bridge ) )
2018-07-23 17:34:41 +00:00
u . dispatcher . add_handler ( CommandHandler ( " newevent " , cmd_newevent ) )
2018-07-24 17:23:19 +00:00
u . dispatcher . add_handler ( CommandHandler ( " calendar " , cmd_calendar ) )
2018-08-08 19:59:47 +00:00
u . dispatcher . add_handler ( CommandHandler ( " markov " , cmd_markov ) )
2018-09-11 00:02:09 +00:00
u . dispatcher . add_handler ( CommandHandler ( " roll " , cmd_roll ) )
u . dispatcher . add_handler ( CommandHandler ( " r " , cmd_roll ) )
2018-09-13 21:11:56 +00:00
if __debug__ :
u . dispatcher . add_handler ( CommandHandler ( " exception " , cmd_exception ) )
2018-03-14 10:53:26 +00:00
u . dispatcher . add_handler ( CallbackQueryHandler ( on_callback_query ) )
2018-08-16 17:46:07 +00:00
logger . info ( " Handlers registered. " )
2018-04-09 21:02:24 +00:00
while True :
try :
u . start_polling ( )
2018-08-16 17:46:07 +00:00
logger . info ( " Polling started. " )
2018-04-09 21:02:24 +00:00
u . idle ( )
except telegram . error . TimedOut :
2018-08-16 17:46:07 +00:00
logger . warning ( " Timed out, restarting in 1 minute. " )
2018-04-09 21:02:24 +00:00
time . sleep ( 60 )
2018-08-16 17:46:07 +00:00
logger . info ( " Now restarting... " )
2018-08-16 17:43:42 +00:00
except KeyboardInterrupt :
2018-08-16 17:46:07 +00:00
logger . info ( " Now stopping... " )
2018-08-16 17:43:42 +00:00
break
2018-01-20 14:28:04 +00:00
2018-04-20 17:46:33 +00:00
2018-01-20 14:28:04 +00:00
if __name__ == " __main__ " :
2018-08-28 15:38:17 +00:00
process ( None )