#!/usr/bin/env python3 # -*- coding: utf-8 -*- # # Telegram bot to play UNO in group chats # Copyright (c) 2016 Jannes Höke # # This program is free software: you can redistribute it and/or modify # it under the terms of the GNU Affero General Public License as # published by the Free Software Foundation, either version 3 of the # License, or (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU Affero General Public License for more details. # # You should have received a copy of the GNU Affero General Public License # along with this program. If not, see . from telegram import ParseMode from telegram.ext import CommandHandler from user_setting import UserSetting from utils import send_async from shared_vars import dispatcher from internationalization import _, user_locale help_text = ("Follow these steps:\n\n" "1. Add this bot to a group\n" "2. In the group, start a new game with /new or join an already" " running game with /join\n" "3. After at least two players have joined, start the game with" " /start\n" "4. Type @xultanbot into your chat box and hit " "space, or click the via @xultanbot text " "next to messages. You will see your cards (some greyed out), " "any extra options like drawing, and a ? to see the " "current game state. The greyed out cards are those you " "can not play at the moment. Tap an option to execute " "the selected action.\n" "Players can join the game at any time. To leave a game, " "use /leave. If a player takes more than 90 seconds to play, " "you can use /skip to skip that player. Use /notify_me to " "receive a private message when a new game is started.\n\n" "Language and other settings: /settings\n" "Other commands (only game creator):\n" "/close - Close lobby\n" "/open - Open lobby\n" "/kill - Terminate the game\n" "/kick - Select a player to kick " "by replying to him or her\n" "/enable_translations - Translate relevant texts into all " "languages spoken in a game\n" "/disable_translations - Use English for those texts\n\n" "Experimental: Play in multiple groups at the same time. " "Press the Current game: ... button and select the " "group you want to play a card in.\n" "If you enjoy this bot, " "" "rate me, join the " "update channel" " and buy an UNO card game.") source_text = ("This bot is Free Software and licensed under the AGPL. " "The code is available here: \n" "https://github.com/jh0ker/mau_mau_bot") attributions = ("Attributions:\n" 'Draw icon by ' 'Faithtoken\n' 'Pass icon by ' 'Delapouite\n' "Originals available on http://game-icons.net\n" "Icons edited by ɳick") modes_explanation = ("This UNO bot has three game modes: Classic, Sanic and Wild.\n\n" " 🎻 The Classic mode uses the conventional UNO deck and there is no auto skip.\n" " 🚀 The Sanic mode uses the conventional UNO deck and the bot automatically skips a player if he/she takes too long to play its turn\n" " 🐉 The Wild mode uses a deck with more special cards, less number variety and no auto skip.\n" " 😐 The Saitama mode uses a deck with more special cards, less number variety and no auto skip, but ended with one win.\n\n" "To change the game mode, the GAME CREATOR has to type the bot nickname and a space, just like when playing a card, and all gamemode options should appear.") @user_locale def help_handler(bot, update): """Handler for the /help command""" send_async(bot, update.message.chat_id, text=_(help_text), parse_mode=ParseMode.HTML, disable_web_page_preview=True) @user_locale def modes(bot, update): """Handler for the /help command""" send_async(bot, update.message.chat_id, text=_(modes_explanation), parse_mode=ParseMode.HTML, disable_web_page_preview=True) @user_locale def source(bot, update): """Handler for the /help command""" send_async(bot, update.message.chat_id, text=_(source_text) + '\n' + _(attributions), parse_mode=ParseMode.HTML, disable_web_page_preview=True) @user_locale def news(bot, update): """Handler for the /news command""" send_async(bot, update.message.chat_id, text=_("All news here: https://telegram.me/unobotupdates"), disable_web_page_preview=True) @user_locale def stats(bot, update): user = update.message.from_user us = UserSetting.get(id=user.id) if not us or not us.stats: send_async(bot, update.message.chat_id, text=_("You did not enable statistics. Use /settings in " "a private chat with the bot to enable them.")) else: stats_text = list() n = us.games_played stats_text.append( _("{number} game played", "{number} games played", n).format(number=n) ) n = us.first_places stats_text.append( _("{number} first place", "{number} first places", n).format(number=n) ) n = us.last_places stats_text.append( _("{number} last place", "{number} last places", n).format(number=n) ) n = us.cards_played stats_text.append( _("{number} card played", "{number} cards played", n).format(number=n) ) send_async(bot, update.message.chat_id, text='\n'.join(stats_text)) def register(): dispatcher.add_handler(CommandHandler('help', help_handler)) dispatcher.add_handler(CommandHandler('source', source)) dispatcher.add_handler(CommandHandler('news', news)) dispatcher.add_handler(CommandHandler('stats', stats)) dispatcher.add_handler(CommandHandler('modes', modes))