Пример #1
0
 def cmd_inv(self, _, update):
     user = User.from_tg(update.message.from_user)
     if user.in_battle is not None:
         update.message.reply_text('user is in a battle', quote=True)
         return
     items = user.items.select()[:]
     if not items:
         update.message.reply_text('no items', quote=True)
         return
     res = ''
     keyboard = []
     for item in items:
         res += '%s %s    x%s\n' % (item.item.icon, item.item.name,
                                    item.count
                                    if item.count >= 0 else '\u221e')
         #if can_use:
         #    keyboard.append([
         #        InlineKeyboardButton(
         #            '%s %s' % (icon, name),
         #            callback_data='iuse %s' % id_
         #        )
         #    ])
     if not keyboard:
         keyboard = None
     else:
         keyboard = InlineKeyboardMarkup(keyboard)
     update.message.reply_text(res, quote=True, reply_markup=keyboard)
Пример #2
0
 def cb_iuse(self, _, update):
     user = check_callback_user(update)
     if user is None:
         return
     user = User.from_tg(user)
     if user.in_battle is not None:
         return
     item = update.callback_query.data
     update.callback_query.message.edit_text('use item "%s"' % item)
Пример #3
0
    def cb_mmove(self, _, update):
        user = check_callback_user(update)
        if user is None:
            return
        user = User.from_tg(user)

        args = update.callback_query.data.split()
        pid = int(args[0]) if args else None
        action = args[1] if len(args) > 1 else None

        res = ''

        if not pid:
            return

        pokemon = user.pokemon.select(lambda p: p.id == pid)[:1]
        if pokemon:
            pokemon = pokemon[0]
        else:
            return

        if action is not None:
            if user.in_battle is not None:
                return
            move_id = int(action[1:])
            try:
                if action[0] == '-':
                    pokemon.delete_move(move_id)
                else:
                    pokemon.add_move(move_id)
            except ValueError as ex:
                res = '\n\n%s' % str(ex)

        moves = pokemon.get_available_moves()
        used = set(m.move.id for m in pokemon.moves)

        res = pokemon.info_full + res
        back = [InlineKeyboardButton('back', callback_data='mon %d' % pid)]

        keyboard = [
            InlineKeyboardButton(
                '%s%s %s' % ('-' if move.move.id in used else '+',
                             move.move.name, move.move.pp),
                callback_data='mmove %d %s%d' %
                (pid, '-' if move.move.id in used else '+', move.move.id))
            for move in moves
        ]
        keyboard = list(chunks(keyboard, 2))
        keyboard.append(back)
        keyboard = InlineKeyboardMarkup(keyboard)

        update.callback_query.message.edit_text(res,
                                                parse_mode=ParseMode.MARKDOWN,
                                                reply_markup=keyboard)
Пример #4
0
 def cmd_give(self, _, update):
     usage = 'usage: /give <item> <count>'
     args = get_command_args(update.message, help=usage)
     args = args.split()
     if len(args) > 2:
         return usage, True
     item = int(args[0])
     count = int(args[1]) if len(args) > 1 else None
     if not update.message.reply_to_message:
         return 'not a reply', True
     user = User.from_tg(update.message.reply_to_message.from_user)
     user.add_item(item, count)
     return 'done'
Пример #5
0
 def cb_starter(self, _, update):
     user = check_callback_user(update)
     if user is None:
         return
     user = User.from_tg(user)
     if user.pokemon:
         update.callback_query.message.edit_text(
             'user already has a pokemon')
         return
     pokemon = Pokemon[int(update.callback_query.data)]
     pokemon = UserPokemon.create(pokemon, user, 5, 5)
     update.callback_query.message.edit_text(pokemon.info_full,
                                             parse_mode=ParseMode.MARKDOWN)
Пример #6
0
 def cmd_starter(self, _, update):
     user = User.from_tg(update.message.from_user)
     if user.pokemon:
         update.message.reply_text('user already has a pokemon', quote=True)
         return
     starters = Pokemon.get_starters()
     keyboard = chunks([
         InlineKeyboardButton(str(starter.id),
                              callback_data='starter %s' % starter.id)
         for starter in starters
     ], 5)
     res = '\n'.join('%s. %s' % (starter.id, starter.full_name)
                     for starter in starters)
     keyboard = InlineKeyboardMarkup(keyboard)
     update.message.reply_text(res, quote=True, reply_markup=keyboard)
Пример #7
0
    def cmd_encounter(self, _, update):
        user = User.from_tg(update.message.from_user)

        if user.in_battle is not None:
            update.message.reply_text('user is in a battle', quote=True)
            return

        keyboard = [
            InlineKeyboardButton(habitat.name,
                                 callback_data='elevel %d' % habitat.id)
            for habitat in PokemonHabitat.select()
        ]
        keyboard = list(chunks(keyboard, 3))
        keyboard = InlineKeyboardMarkup(keyboard)

        update.message.reply_text('habitat:',
                                  reply_markup=keyboard,
                                  quote=True)
Пример #8
0
    def cb_estart(self, _, update):
        user = check_callback_user(update)
        if user is None:
            return
        user = User.from_tg(user)
        if user.in_battle is not None:
            return

        args = update.callback_query.data.split()
        hid = int(args[0])
        max_level = int(args[1])
        min_level = max_level - 9

        res = UserPokemon.create_encounter(hid, min_level, max_level)
        res = res.info_full
        UserPokemon.remove_unused()

        update.callback_query.message.edit_text(res,
                                                parse_mode=ParseMode.MARKDOWN)
Пример #9
0
    def cb_elevel(self, _, update):
        user = check_callback_user(update)
        if user is None:
            return
        user = User.from_tg(user)
        if user.in_battle is not None:
            return

        hid = int(update.callback_query.data)

        keyboard = [
            InlineKeyboardButton('%d-%d' % ((level - 1) * 10 + 1, level * 10),
                                 callback_data='estart %d %d' %
                                 (hid, level * 10)) for level in range(1, 11)
        ]
        keyboard = list(chunks(keyboard, 4))
        keyboard = InlineKeyboardMarkup(keyboard)

        update.callback_query.message.edit_text('level:',
                                                reply_markup=keyboard)
Пример #10
0
    def cmd_getusers(self, _, update):
        page_size = 10

        if update.callback_query:
            page = int(update.callback_query.data)
        else:
            page = 1

        if update.effective_chat.type != update.effective_message.chat.PRIVATE:
            permission = 0
        else:
            permission = User.from_tg(update.effective_user).permission

        users = User.select().order_by(
            desc(User.permission),
            desc(User.last_update)
        )
        users, pages = get_page(users, page, page_size)
        if pages < 1:
            return 'no users', 1, 1, True

        offset = page_size * (page - 1)
        res = '\n'.join(
            '{0}. ({5}) <a href="tg://user?id={1}">{1}</a> {2} {3} {4}'
            .format(
                i,
                html.escape(user.name),
                html.escape(
                    (' '.join(data.phone for data in user.phones)
                     if permission >= P.ADMIN else None) or '<no phone>'
                ),
                html.escape(user.full_name or '<no name>'),
                html.escape(user.username or '<no username>'),
                user.permission
            )
            for i, user in enumerate(users, offset + 1)
        )
        res = 'users page %d / %d:\n\n%s' % (page, pages, res)
        return res, page, pages, False, ParseMode.HTML
Пример #11
0
    def cmd_getitems(self, _, update):
        user = User.from_tg(update.message.from_user)
        if user.in_battle is not None:
            update.message.reply_text('user is in a battle', quote=True)
            return

        default_items = [(4, 10), (24, 1), (29, 1), (39, 1)]
        res = []

        for item_id, max_count in default_items:
            item = user.items.select(lambda i: i.item.id == item_id)[:1]
            if not item:
                diff = max_count
                item = UserItem(item=item_id, user=user, count=max_count)
            else:
                item = item[0]
                diff = max(0, max_count - item.count)
                item.count += diff
            res.append((item.item.icon, item.item.name, diff))

        res = '\n'.join('%s %s +%d' % item for item in res)
        return res, True
Пример #12
0
    def _callback_query(self, bot, update):
        msg = update.callback_query.message
        cmd = None
        has_cmd = False

        user = User.from_tg(update.callback_query.from_user)
        if user.permission <= P.BANNED:
            return

        if msg.text:
            for pattern in (r'^select\s+(.+)$', r'^(.+[^\s])\s+page',
                            r'^([^\'"]+[^\s\'"]).*\?$'):
                match = re.match(pattern, msg.text, re.I)
                if match is not None:
                    has_cmd = True
                    cmd = 'cb_' + match.group(1).replace(' ', '_')
                    break

        match = re.match(r'^([a-z_]+)\s*(.*)', update.callback_query.data)
        if match is not None:
            cmd_ = 'cb_' + match.group(1)
            if hasattr(self, cmd_):
                cmd = cmd_
                has_cmd = True
                update.callback_query.data = match.group(2)

        if has_cmd:
            try:
                cmd = getattr(self, cmd)
            except AttributeError:
                pass
            else:
                cmd(bot, update)
                return

        msg.edit_text(text='unknown command "%s"' % cmd)
Пример #13
0
 def cmd_heal(self, _, update):
     user = User.from_tg(update.message.from_user)
     if user.in_battle is not None:
         return 'user is in a battle', True
     user.heal()
     return 'done', True
Пример #14
0
 def cmd_mon(self, _, update):
     user = User.from_tg(update.message.from_user)
     res, keyboard = self._mon(user)
     update.message.reply_text(res, quote=True, reply_markup=keyboard)
Пример #15
0
    def cb_mon(self, _, update):
        user = check_callback_user(update)
        if user is None:
            return
        user = User.from_tg(user)

        args = update.callback_query.data.split()
        pid = int(args[0]) if args else None
        action = args[1] if len(args) > 1 else None
        pid2 = int(args[2]) if len(args) > 2 else None

        if action is not None and user.in_battle is not None:
            return

        if pid is not None:
            pokemon = user.pokemon.select(lambda p: p.id == pid)[:1]
            if pokemon:
                pokemon = pokemon[0]
        else:
            pokemon = None

        if not pokemon:
            res, keyboard = self._mon(user)
        else:
            res = None
            keyboard = None
            r = InlineKeyboardButton('release', callback_data='mon %d r' % pid)
            rr = InlineKeyboardButton('confirm release',
                                      callback_data='mon %d rr' % pid)
            ev = InlineKeyboardButton('evolve', callback_data='mon %d e' % pid)
            m = InlineKeyboardButton('moves', callback_data='mmove %d' % pid)
            back = InlineKeyboardButton('back', callback_data='mon')

            if action == 'rr':
                res = 'released %s' % pokemon.info_short
                pokemon.delete()
                keyboard = [back]
            elif action == 'r':
                keyboard = [rr, ev, m, back]
            elif action == 'e':
                if pid2 is not None:
                    try:
                        pokemon.evolve(pid2)
                        keyboard = [r, ev, m, back]
                    except ValueError as ex:
                        res = str(ex)
                if pid2 is None or keyboard is None:
                    keyboard = [
                        InlineKeyboardButton(to.full_name,
                                             callback_data='mon %d e %d' %
                                             (pid, to.id))
                        for to in select(
                            ev.to for ev in pokemon.pokemon.evolutions)
                    ]
                    keyboard.append(
                        InlineKeyboardButton('back',
                                             callback_data='mon %d' % pid))

            if res is None:
                res = pokemon.info_full
            if keyboard is None:
                keyboard = [r, ev, m, back]
            keyboard = InlineKeyboardMarkup(chunks(keyboard, 2))

        update.callback_query.message.edit_text(res,
                                                parse_mode=ParseMode.MARKDOWN,
                                                reply_markup=keyboard)
Пример #16
0
def get_permission(user):
    with db_session:
        return User.from_tg(user).permission
Пример #17
0
 def cmd_flee(self, _, update):
     user = update.message.from_user
     user = User.from_tg(user)
     user.flee()
     return 'done', True