import utils import dice import typing class SafeDict(dict): def __missing__(self, key): return "{" + key + "}" def safely_format_string(string: str, words: typing.Dict[str, str] = None, ignore_escaping=False) -> str: if words is None: words = {} if ignore_escaping: escaped = words else: escaped = {} for key in words: escaped[key] = str(words[key]).replace("<", "<").replace(">", ">") return string.format_map(SafeDict(**escaped)) # Generic telegram errors class TELEGRAM: BOT_STARTED = "✅ Hai autorizzato il bot ad inviarti messaggi privati." FIORYGI_AWARDED = "⭐️ {mention} è stato premiato con {number} {fiorygi} per {reason}!" class ERRORS: CRITICAL_ERROR = "☢ ERRORE CRITICO!\nIl bot ha ignorato il comando.\nUna segnalazione di errore è stata automaticamente mandata a @Steffo.\n\nDettagli dell'errore:\n
{exc_info}
" CRITICAL_ERROR_QUERY = "☢ ERRORE CRITICO!" UNAUTHORIZED_USER = "⚠ Non sono autorizzato a inviare messaggi a {mention}.\nPer piacere, {mention}, inviami un messaggio in privata!" UNAUTHORIZED_GROUP = "⚠ Non sono autorizzato a inviare messaggi in {group}.\n@Steffo, aggiungimi al gruppo o concedimi i permessi!" PONG = "🏓 Pong!" ESCAPE = "{text}" # Ah, non lo so io. class AHNONLOSOIO: ONCE = "😐 Ah, non lo so io!" AGAIN = "😐 Ah, non lo so nemmeno io..." # 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!\nSintassi: /bridge (comando)" INACTIVE_BRIDGE = "⚠ Il collegamento tra Telegram e Discord non è attivo al momento." # Random spellslinging class CAST: class ERRORS: NOT_YET_AVAILABLE = "⚠ Il nuovo cast non è ancora disponibile! Per un'anteprima sulle nuove funzioni, usa /spell." # Ciao Ruozi! class CIAORUOZI: THE_LEGEND_HIMSELF = "👋 Ciao me!" SOMEBODY_ELSE = "👋 Ciao Ruozi!" # The /color meme, from Octeon COLOR = "I am sorry, unknown error occured during working with your request, Admin were notified" # Diario class DIARIO: SUCCESS = "✅ Riga aggiunta al diario:\n{diario}" ANONYMOUS = "Anonimo" class ERRORS: INVALID_SYNTAX = "⚠ Sintassi del comando errata.\nSintassi: /diario (frase), oppure rispondi a un messaggio con /diario." 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!\nSintassi: /{command} (termine)" RESULTS_TOO_LONG = "⚠ Sono presenti troppi risultati da visualizzare! Prova a restringere la ricerca." # Eat! class EAT: FOODS = { "_default": "🍗 Hai mangiato {food}!\nMa non succede nulla.", "tonnuooooooro": "👻 Il {food} che hai mangiato era posseduto.\nSpooky!", "uranio": "☢️ L'{food} che hai mangiato era radioattivo.\nStai brillando di verde!", "pollo": '🍗 Il {food} che hai appena mangiato proveniva dallo spazio.\nCoccodè?', "ragno": "🕸 Hai mangiato un {food}.\nEwww!", "curry": "🔥 BRUCIAAAAAAAAAA! Il {food} era piccantissimo!\nStai sputando fiamme!", "torta": "⬜️ Non hai mangiato niente.\nLa {food} è una menzogna!", "cake": "⬜️ Non hai mangiato niente.\nThe {food} is a lie!", "biscotto": "🍪 Hai mangiato un {food} di contrabbando.\nL'Inquisizione non lo saprà mai!", "biscotti": "🍪 Hai mangiato tanti {food} di contrabbando.\nAttento! L'Inquisizione è sulle tue tracce!", "tango": "🌳 Hai mangiato un {food}, e un albero insieme ad esso.\nSenti il tuo corpo curare le tue ferite.", "sasso": "🥌 Il {food} che hai mangiato era duro come un {food}\nStai soffrendo di indigestione!", "gnocchetti": "🥘 Ullà, sono duri 'sti {food}!\nFai fatica a digerirli.", "tide pods": "☣️ I {food} che hai mangiato erano buonissimi.\nStai sbiancando!" } class ERRORS: INVALID_SYNTAX = "⚠ Non hai specificato cosa mangiare!\nSintassi: /eat (cibo)" # Emojify a string class EMOJIFY: RESPONSE = "{emojified}" class ERRORS: INVALID_SYNTAX = "⚠ Non hai specificato una frase!\nSintassi: /emojify (testo)" # Royalnet linking class LINK: SUCCESS = "✅ Collegamento riuscito!" class ERRORS: INVALID_SYNTAX = "⚠ Non hai specificato un username!\nSintassi: /link (username)" NOT_FOUND = "⚠ Non esiste nessun account Royalnet con quel nome.\nNota: gli username sono case-sensitive, e iniziano sempre con una maiuscola!" ALREADY_EXISTING = "⚠ Questo account è già collegato a un account Royalnet." ROYALNET_NOT_LINKED = "⚠ Il tuo account Telegram non è connesso a Royalnet! Connettilo con /link (username)." # Markov strings class MARKOV: class ERRORS: NO_MODEL = "⚠ La catena di Markov non è disponibile." GENERATION_FAILED = "⚠ markovify non è riuscito a generare una frase. Prova di nuovo?\n E' un'avvenimento sorprendentemente raro..." SPECIFIC_WORD_FAILED = "⚠ markovify 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..." # Matchmaking service strings class MATCHMAKING: EMOJIS = { "ready": "🔵", "wait_for_me": "🕒", "maybe": "❓", "ignore": "❌", "close": "🚩", "cancel": "🗑" } 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"], } BUTTONS = { "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 = { int(utils.MatchmakingStatus.READY): "🔵 Che {match_title} abbia inizio!", int(utils.MatchmakingStatus.WAIT_FOR_ME): "🕒 Sbrigati! {match_title} sta per iniziare!", int(utils.MatchmakingStatus.MAYBE): "❓ {match_title} sta iniziando. Se vuoi partecipare, fai in fretta!", } class ERRORS: INVALID_SYNTAX = "⚠ Sintassi del comando errata.\nSintassi:
/mm [minplayers-][maxplayers] ['per'] (gamename) \\n[descrizione]
" NOT_ADMIN = "⚠ Non sei il creatore di questo match!" MATCH_CLOSED = "⚠ Il matchmaking per questa partita è terminato." # Pug sender class PUG: HERE_HAVE_A_PUG = '🐶 Ecco, tieni un carlino.' class ERRORS: PRIVATE_CHAT_ONLY = "⚠ Foto di carlini possono essere inviate esclusivamente in chat privata, in seguito al Disegno di Legge Intergalattico n. 5116." # Dice roller class ROLL: SUCCESS = "🎲 {result}" 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" } class ERRORS: INVALID_SYNTAX = "⚠ Sintassi del tiro di dadi non valida." DICE_ERROR = "⚠ Il tiro di dadi è fallito." # Ship creator class SHIP: RESULT = "💕 {one} + {two} = {result}" class ERRORS: INVALID_SYNTAX = "⚠ Non hai specificato correttamente i due nomi!\nSintassi: /ship (nome) (nome)" INVALID_NAMES = "⚠ I nomi specificati non sono validi.\nRiprova con dei nomi diversi!" # Get information about a spell class SPELL: HEADER = "🔍 La magia {name} ha le seguenti proprietà (v{version}):\n" ACCURACY = "Precisione - {accuracy}%\n" DAMAGE = "Danni - {number}d{type}{constant} (in media {avg})\n" TYPE = "Tipo - {type}\n" REPEAT = "Multiattacco - ×{repeat}\n" HEALING = "Cura - {number}d{type}{constant} (in media {avg})\n" STAT = "Attrib. - {name}{change}\n" STATUS_EFFECT = "Infligge - {effect} ({chance}% di probabilità)" NOTHING = "Chi la usa sguazza nell'acqua, senza ottenere alcun effetto." class ERRORS: INVALID_SYNTAX = "⚠ Non hai specificato la magia di cui vuoi conoscere i dettagli!\nSintassi: /spell (nome)" # Game stats updates class STATSUPDATE: class BRAWLHALLA: SOLO = "✳️ {username} ha ora {rating} ({delta}) Elo 1v1 su Brawlhalla!" TEAM = "✳️ {username}+{other} hanno ora {rating} Elo 2v2 su Brawlhalla!" # Secondo me, è colpa delle stringhe. SMECDS = "🤔 Secondo me, è colpa {ds}." # Wiki notifications class WIKI: PAGE_LOCKED = '🔒 La pagina wiki {key} è stata bloccata da {user}.' PAGE_UNLOCKED = '🔓 La pagina wiki {key} è stata sbloccata da {user}.' PAGE_UPDATED = '📖 La pagina wiki {key} è stata modificata da {user}.\n{reason} [{change}]'