2019-02-10 15:55:47 +00:00
import utils
2019-02-10 15:40:29 +00:00
import dice
2019-02-07 23:57:40 +00:00
import typing
2019-01-25 14:28:47 +00:00
class SafeDict ( dict ) :
def __missing__ ( self , key ) :
2019-02-15 21:21:41 +00:00
return " { " + key + " } "
2019-01-25 14:28:47 +00:00
2019-02-15 18:42:02 +00:00
def safely_format_string ( string : str , words : typing . Dict [ str , str ] = None , ignore_escaping = False ) - > str :
if words is None :
words = { }
2019-02-09 18:57:49 +00:00
if ignore_escaping :
escaped = words
else :
escaped = { }
for key in words :
escaped [ key ] = words [ key ] . replace ( " < " , " < " ) . replace ( " > " , " > " )
2019-02-07 23:57:40 +00:00
return string . format_map ( SafeDict ( * * escaped ) )
2019-01-25 14:28:47 +00:00
2019-01-28 21:55:55 +00:00
# Generic telegram errors
class TELEGRAM :
2019-02-01 18:21:46 +00:00
BOT_STARTED = " ✅ Hai autorizzato il bot ad inviarti messaggi privati. "
2019-01-25 14:28:47 +00:00
class ERRORS :
2019-01-28 21:55:55 +00:00
CRITICAL_ERROR = " ☢ <b>ERRORE CRITICO!</b> \n Il bot ha ignorato il comando. \n Una segnalazione di errore è stata automaticamente mandata a @Steffo. \n \n Dettagli dell ' errore: \n <pre> {exc_info} </pre> "
2019-02-15 21:21:41 +00:00
CRITICAL_ERROR_QUERY = " ☢ ERRORE CRITICO! "
2019-02-07 23:57:40 +00:00
UNAUTHORIZED_USER = " ⚠ Non sono autorizzato a inviare messaggi a {mention} . \n Per piacere, {mention} , inviami un messaggio in privata! "
UNAUTHORIZED_GROUP = " ⚠ Non sono autorizzato a inviare messaggi in <i> {group} </i>. \n @Steffo, aggiungimi al gruppo o concedimi i permessi! "
2019-01-25 14:28:47 +00:00
2019-01-28 21:55:55 +00:00
PONG = " 🏓 Pong! "
2019-02-19 18:37:17 +00:00
ESCAPE = " {text} "
2019-01-28 21:55:55 +00:00
2019-02-10 01:29:11 +00:00
# Ah, non lo so io.
class AHNONLOSOIO :
ONCE = " 😐 Ah, non lo so io! "
AGAIN = " 😐 Ah, non lo so nemmeno io... "
2019-02-10 14:55:39 +00:00
# Bridge commands between Discord and Telegram
class BRIDGE :
SUCCESS = " ✅ Comando inoltrato a Discord. "
FAILURE = " ❎ Errore nell ' esecuzione del comando su Discord. "
class ERRORS :
INVALID_SYNTAX = " ⚠ Non hai specificato un comando! \n Sintassi: <code>/bridge (comando)</code> "
INACTIVE_BRIDGE = " ⚠ Il collegamento tra Telegram e Discord non è attivo al momento. "
2019-02-15 18:42:02 +00:00
# Random spellslinging
class CAST :
class ERRORS :
NOT_YET_AVAILABLE = " ⚠ Il nuovo cast non è ancora disponibile! Per un ' anteprima sulle nuove funzioni, usa <code>/spell</code>. "
2019-02-10 01:29:11 +00:00
# Ciao Ruozi!
class CIAORUOZI :
THE_LEGEND_HIMSELF = " 👋 Ciao me! "
SOMEBODY_ELSE = " 👋 Ciao Ruozi! "
# The /color meme, from Octeon
COLOR = " <i>I am sorry, unknown error occured during working with your request, Admin were notified</i> "
2019-02-07 23:57:40 +00:00
# Diario
class DIARIO :
SUCCESS = " ✅ Riga aggiunta al diario: \n {diario} "
2019-02-21 23:58:55 +00:00
ANONYMOUS = " Anonimo "
2019-02-07 23:57:40 +00:00
class ERRORS :
INVALID_SYNTAX = " ⚠ Sintassi del comando errata. \n Sintassi: <code>/diario (frase)</code>, oppure rispondi a un messaggio con <code>/diario</code>. "
NO_TEXT = " ⚠ Il messaggio a cui hai risposto non contiene testo. "
# Diario search
class DIARIOSEARCH :
HEADER = " ℹ ️ Risultati della ricerca di {term} : \n "
class ERRORS :
INVALID_SYNTAX = " ⚠ Non hai specificato un termine da cercare! \n Sintassi: <code>/ {command} (termine)</code> "
RESULTS_TOO_LONG = " ⚠ Sono presenti troppi risultati da visualizzare! Prova a restringere la ricerca. "
# Eat!
class EAT :
2019-02-10 14:55:39 +00:00
FOODS = {
" _default " : " 🍗 Hai mangiato {food} ! \n <i>Ma non succede nulla.</i> " ,
" tonnuooooooro " : " 👻 Il {food} che hai mangiato era posseduto. \n <i>Spooky!</i> " ,
" uranio " : " ☢️ L ' {food} che hai mangiato era radioattivo. \n <i>Stai brillando di verde!</i> " ,
" pollo " : ' 🍗 Il {food} che hai appena mangiato proveniva <a href= " https://store.steampowered.com/app/353090/Chicken_Invaders_5/ " >dallo spazio</a>. \n <i>Coccodè?</i> ' ,
" ragno " : " 🕸 Hai mangiato un {food} . \n <i>Ewww!</i> " ,
" curry " : " 🔥 BRUCIAAAAAAAAAA! Il {food} era piccantissimo! \n <i>Stai sputando fiamme!</i> " ,
" torta " : " ⬜️ Non hai mangiato niente. \n <i>La {food} è una menzogna!</i> " ,
" cake " : " ⬜️ Non hai mangiato niente. \n <i>The {food} is a lie!</i> " ,
" biscotto " : " 🍪 Hai mangiato un {food} di contrabbando. \n <i>L ' Inquisizione non lo saprà mai!</i> " ,
" biscotti " : " 🍪 Hai mangiato tanti {food} di contrabbando. \n <i>Attento! L ' Inquisizione è sulle tue tracce!</i> " ,
" tango " : " 🌳 Hai mangiato un {food} , e un albero insieme ad esso. \n <i>Senti il tuo corpo curare le tue ferite.</i> " ,
" sasso " : " 🥌 Il {food} che hai mangiato era duro come un {food} \n <i>Stai soffrendo di indigestione!</i> "
}
2019-02-07 23:57:40 +00:00
class ERRORS :
INVALID_SYNTAX = " ⚠ Non hai specificato cosa mangiare! \n Sintassi: <code>/eat (cibo)</code> "
2019-02-19 18:37:17 +00:00
# Emojify a string
class EMOJIFY :
RESPONSE = " {emojified} "
class ERRORS :
INVALID_SYNTAX = " ⚠ Non hai specificato una frase! \n Sintassi: <code>/emojify (testo)</code> "
2019-01-28 21:55:55 +00:00
# Royalnet linking
2019-02-07 23:57:40 +00:00
class LINK :
SUCCESS = " ✅ Collegamento riuscito! "
2019-01-28 21:55:55 +00:00
class ERRORS :
2019-02-10 01:29:11 +00:00
INVALID_SYNTAX = " ⚠ Non hai specificato un username! \n Sintassi: <code>/link (username)</code> "
NOT_FOUND = " ⚠ Non esiste nessun account Royalnet con quel nome. \n Nota: gli username sono case-sensitive, e iniziano sempre con una maiuscola! "
2019-01-28 21:55:55 +00:00
ALREADY_EXISTING = " ⚠ Questo account è già collegato a un account Royalnet. "
2019-02-10 01:29:11 +00:00
ROYALNET_NOT_LINKED = " ⚠ Il tuo account Telegram non è connesso a Royalnet! Connettilo con <code>/link (username)</code>. "
2019-01-28 21:55:55 +00:00
2019-01-28 19:45:31 +00:00
# Markov strings
class MARKOV :
class ERRORS :
NO_MODEL = " ⚠ La catena di Markov non è disponibile. "
GENERATION_FAILED = " ⚠ <code>markovify</code> non è riuscito a generare una frase. Prova di nuovo? \n E ' un ' avvenimento sorprendentemente raro... "
SPECIFIC_WORD_FAILED = " ⚠ <code>markovify</code> non è riuscito a generare una frase partendo da questa parola. Provane una diversa... "
MISSING_WORD = " ⚠ La parola specificata non è presente nella catena di Markov. Provane una diversa... "
2019-01-25 14:28:47 +00:00
# Matchmaking service strings
class MATCHMAKING :
2019-02-10 15:55:47 +00:00
EMOJIS = {
" ready " : " 🔵 " ,
" wait_for_me " : " 🕒 " ,
" maybe " : " ❓ " ,
" ignore " : " ❌ " ,
" close " : " 🚩 " ,
" cancel " : " 🗑 "
2019-01-25 14:28:47 +00:00
}
2019-02-10 15:55:47 +00:00
ENUM_TO_EMOJIS = {
utils . MatchmakingStatus . READY : EMOJIS [ " ready " ] ,
utils . MatchmakingStatus . WAIT_FOR_ME : EMOJIS [ " wait_for_me " ] ,
utils . MatchmakingStatus . MAYBE : EMOJIS [ " maybe " ] ,
utils . MatchmakingStatus . IGNORED : EMOJIS [ " ignore " ] ,
2019-01-25 14:28:47 +00:00
}
BUTTONS = {
2019-02-10 15:55:47 +00:00
" match_ready " : f " { EMOJIS [ ' ready ' ] } Sono pronto per iniziare! " ,
" match_wait_for_me " : f " { EMOJIS [ ' wait_for_me ' ] } Ci sarò, aspettatemi! " ,
" match_maybe " : f " { EMOJIS [ ' maybe ' ] } Forse vengo, se non ci sono fate senza di me. " ,
" match_ignore " : f " { EMOJIS [ ' ignore ' ] } Non ci sarò. " ,
" match_close " : f " { EMOJIS [ ' close ' ] } ADMIN: Avvia la partita " ,
" match_cancel " : f " { EMOJIS [ ' cancel ' ] } ADMIN: Annulla la partita "
}
TICKER_TEXT = {
" match_ready " : f " { EMOJIS [ ' ready ' ] } Hai detto che sei pronto per giocare! " ,
" match_wait_for_me " : f " { EMOJIS [ ' wait_for_me ' ] } Hai chiesto agli altri di aspettarti. " ,
" match_maybe " : f " { EMOJIS [ ' maybe ' ] } Hai detto che forse ci sarai. " ,
" match_ignore " : f " { EMOJIS [ ' ignore ' ] } Non hai intenzione di partecipare. " ,
" match_close " : f " { EMOJIS [ ' close ' ] } Hai notificato tutti che la partita sta iniziando. " ,
" match_cancel " : f " { EMOJIS [ ' cancel ' ] } Hai annullato la partita. "
}
GAME_START = {
2019-02-15 20:03:44 +00:00
int ( utils . MatchmakingStatus . READY ) : " 🔵 Che <b> {match_title} </b> abbia inizio! " ,
int ( utils . MatchmakingStatus . WAIT_FOR_ME ) : " 🕒 Sbrigati! <b> {match_title} </b> sta per iniziare! " ,
int ( utils . MatchmakingStatus . MAYBE ) : " ❓ <b> {match_title} </b> sta iniziando. Se vuoi partecipare, fai in fretta! " ,
2019-01-25 14:28:47 +00:00
}
class ERRORS :
2019-02-10 14:55:39 +00:00
INVALID_SYNTAX = " ⚠ Sintassi del comando errata. \n Sintassi: <pre>/mm [minplayers-][maxplayers] [ ' per ' ] (gamename) \\ n[descrizione]</pre> "
2019-01-25 14:28:47 +00:00
NOT_ADMIN = " ⚠ Non sei il creatore di questo match! "
2019-02-10 14:55:39 +00:00
MATCH_CLOSED = " ⚠ Il matchmaking per questa partita è terminato. "
2019-01-28 22:37:01 +00:00
2019-02-22 00:53:25 +00:00
# Pug sender
class PUG :
HERE_HAVE_A_PUG = ' 🐶 Ecco, tieni un <a href= " {image_url} " >carlino</a>. '
2019-02-22 01:05:49 +00:00
class ERRORS :
PRIVATE_CHAT_ONLY = " ⚠ Foto di carlini possono essere inviate esclusivamente in chat privata, in seguito al Disegno di Legge Intergalattico n. 5116. "
2019-02-22 00:53:25 +00:00
2019-02-10 13:40:20 +00:00
# Dice roller
class ROLL :
SUCCESS = " 🎲 {result} "
2019-02-10 15:40:29 +00:00
SYMBOLS = {
dice . elements . Div : " / " ,
dice . elements . Mul : " * " ,
dice . elements . Sub : " - " ,
dice . elements . Add : " + " ,
dice . elements . Modulo : " % " ,
dice . elements . AddEvenSubOdd : " +- " ,
dice . elements . Highest : " h " ,
dice . elements . Lowest : " l " ,
dice . elements . Middle : " m " ,
dice . elements . Again : " a " ,
dice . elements . Successes : " e " ,
dice . elements . SuccessFail : " f " ,
dice . elements . ArrayAdd : " .+ " ,
dice . elements . ArraySub : " .- " ,
dice . elements . Array : " , " ,
dice . elements . Extend : " | " ,
dice . elements . Reroll : " r " ,
dice . elements . Explode : " x " ,
dice . elements . ForceReroll : " rr "
}
2019-02-10 13:40:20 +00:00
class ERRORS :
2019-02-10 15:40:29 +00:00
INVALID_SYNTAX = " ⚠ Sintassi del tiro di dadi non valida. "
DICE_ERROR = " ⚠ Il tiro di dadi è fallito. "
2019-02-10 13:40:20 +00:00
2019-02-07 23:57:40 +00:00
# Ship creator
class SHIP :
RESULT = " 💕 {one} + {two} = <b> {result} </b> "
2019-02-01 18:46:00 +00:00
2019-01-28 22:37:01 +00:00
class ERRORS :
2019-02-15 18:42:02 +00:00
INVALID_SYNTAX = " ⚠ Non hai specificato correttamente i due nomi! \n Sintassi: <code>/ship (nome) (nome)</code> "
2019-02-07 23:57:40 +00:00
INVALID_NAMES = " ⚠ I nomi specificati non sono validi. \n Riprova con dei nomi diversi! "
2019-02-03 18:34:17 +00:00
2019-02-15 18:42:02 +00:00
# Get information about a spell
class SPELL :
HEADER = " 🔍 La magia <b> {name} </b> ha le seguenti proprietà (v {version} ): \n "
ACCURACY = " Precisione - <b> {accuracy} % </b> \n "
2019-02-18 23:28:13 +00:00
DAMAGE = " Danni - <b> {number} d {type} {constant} </b> <i>(in media {avg} )</i> \n "
2019-02-15 18:42:02 +00:00
TYPE = " Tipo - <b> {type} </b> \n "
REPEAT = " Multiattacco - <b>× {repeat} </b> \n "
2019-02-18 23:28:13 +00:00
HEALING = " Cura - <b> {number} d {type} {constant} </b> <i>(in media {avg} )</i> \n "
STAT = " Attrib. - <b> {name} {change} </b> \n "
STATUS_EFFECT = " Infligge - <b> {effect} </b> (<b> {chance} % </b> di probabilità) "
2019-02-17 22:59:04 +00:00
NOTHING = " <i>Chi la usa sguazza nell ' acqua, senza ottenere alcun effetto.</i> "
2019-02-15 18:42:02 +00:00
class ERRORS :
INVALID_SYNTAX = " ⚠ Non hai specificato la magia di cui vuoi conoscere i dettagli! \n Sintassi: <code>/spell (nome)</code> "
2019-02-10 01:29:11 +00:00
# Secondo me, è colpa delle stringhe.
SMECDS = " 🤔 Secondo me, è colpa {ds} . "
2019-02-03 18:34:17 +00:00
# Wiki notifications
class WIKI :
PAGE_LOCKED = ' 🔒 La pagina wiki <a href= " https://ryg.steffo.eu/wiki/ {key} " > {key} </a> è stata bloccata da <b> {user} </b>. '
PAGE_UNLOCKED = ' 🔓 La pagina wiki <a href= " https://ryg.steffo.eu/wiki/ {key} " > {key} </a> è stata sbloccata da <b> {user} </b>. '