Exemplo n.º 1
0
    def rules_remove(self, bot: Bot, update: Update):
        """Remove rules for a group

        Args:
            bot (:obj:`telegram.bot.Bot`): Telegram Api Bot Object.
            update (:obj:`telegram.update.Update`): Telegram Api Update Object
        """
        chat_id = update.message.chat_id
        from_user = update.message.from_user
        group_data = data.get(self.group_data_set)

        if not group_data.get(chat_id, None) or not group_data[chat_id].get(
                'rules', None):
            bot.send_message(
                chat_id=chat_id,
                text=
                'This group has no rules defined, use /rules_define to add them.'
            )
            return

        group_data[chat_id]['rules'] = ''
        data.save(self.group_data_set, group_data)
        bot.send_message(
            chat_id=chat_id,
            text='{user} has set removed the groups rules.'.format(
                user=get_user_link(from_user)),
            parse_mode=ParseMode.MARKDOWN)
Exemplo n.º 2
0
    def rules_define(self, bot: Bot, update: Update):
        """Define new rules for a group

        Args:
            bot (:obj:`telegram.bot.Bot`): Telegram Api Bot Object.
            update (:obj:`telegram.update.Update`): Telegram Api Update Object
        """
        split_text = update.message.text.split(' ', 1)
        if len(split_text) < 2:
            update.message.reply_text('You forgot to give me the rules.')
            return
        elif len(split_text[1]) > 4000:
            update.message.reply_text(
                'Rules must be less than 4000 characters.')
            return

        text = split_text[1]
        chat_id = update.message.chat_id
        from_user = update.message.from_user

        group_data = data.get(self.group_data_set)

        if not group_data.get(chat_id, None):
            group_data[chat_id] = {}

        group_data[chat_id]['rules'] = text
        data.save(self.group_data_set, group_data)

        bot.send_message(chat_id=chat_id,
                         text='{user} has set new /rules.'.format(
                             user=get_user_link(from_user)),
                         parse_mode=ParseMode.MARKDOWN)
Exemplo n.º 3
0
    def unwarn(self, bot: Bot, update: Update, wanted_user: User = None):
        """Remove all warnings from a user

        Args:
            bot (:obj:`telegram.bot.Bot`): Telegram Api Bot Object.
            update (:obj:`telegram.update.Update`): Telegram Api Update Object
            wanted_user (:obj:`telegram.user.User`): Telegram User object of the user which should be warned
        """
        if update.message.reply_to_message is None:
            update.message.reply_text(
                'You have to reply to a message from a user to warn him.')
            return
        chat_id = update.message.chat_id
        from_user = update.message.from_user
        wanted_user = wanted_user or update.message.reply_to_message.from_user

        group_data = data.get(self.group_data_set)

        if not group_data.get(chat_id, None) or not group_data[chat_id].get(
                wanted_user.id, None):
            bot.send_message(chat_id=chat_id,
                             text='{wanted_user} was never warned.'.format(
                                 wanted_user=get_user_link(wanted_user)),
                             parse_mode=ParseMode.MARKDOWN)
            return

        group_data[chat_id][wanted_user.id] = 0
        data.save(self.group_data_set, group_data)
        bot.send_message(
            chat_id=chat_id,
            text='{from_user} removed {wanted_user} warnings.'.format(
                from_user=get_user_link(from_user),
                wanted_user=get_user_link(wanted_user)),
            parse_mode=ParseMode.MARKDOWN)
Exemplo n.º 4
0
def error(bot: Bot, update: Update, error: TelegramError):
    """Log all errors from the telegram bot api

    Args:
        bot (:obj:`telegram.bot.Bot`): Telegram Api Bot Object.
        update (:obj:`telegram.update.Update`): Telegram Api Update Object
        error (:obj:`telegram.error.TelegramError`): Telegram Api TelegramError Object
    """
    logger.warning('Update "%s" caused error "%s"' % (update, error))
    if update:
        bot.send_message(chat_id=update.effective_chat.id, text='Whoops, there was an error. Please try again.')
Exemplo n.º 5
0
    def kick(self, bot: Bot, update: Update, args: list = None):
        """Kick a user for 30 sec or a specific amount of time

        Args:
            bot (:obj:`telegram.bot.Bot`): Telegram Api Bot Object.
            update (:obj:`telegram.update.Update`): Telegram Api Update Object
            args (:obj:`list`): Time in min
        """
        if update.message.reply_to_message is None:
            update.message.reply_text(
                'You have to reply to a message from this user to kick him.')
            return

        chat_id = update.message.chat_id
        from_user = update.message.from_user
        wanted_user = update.message.reply_to_message.from_user
        time = 10
        if args:
            try:
                time = float(args[0])
                if not 0.5 <= time <= 527040:
                    update.message.reply_text(
                        'Time must be between 30 sec (0.5 min) and 366 days (527040 min).'
                    )
                    return
            except ValueError:
                update.message.reply_text(
                    'You have to give me the time in min like `/kick 30`')
                return

        now = datetime.datetime.now()
        kick_until = now - datetime.timedelta(minutes=time)
        bot.kick_chat_member(chat_id=chat_id,
                             user_id=wanted_user.id,
                             until_date=kick_until)

        xenian.bot.job_queue.run_once(
            callback=(lambda bot, job: bot.send_message(
                chat_id,
                '{wanted_user} was kicked {time} min ago and can now join again'
                .format(time=time, wanted_user=get_user_link(wanted_user)),
                parse_mode=ParseMode.MARKDOWN)),
            when=10 * 60)

        bot.send_message(
            chat_id=chat_id,
            text='{wanted_user} was kicked for {time} min by {from_user}'.
            format(time=time,
                   from_user=get_user_link(from_user),
                   wanted_user=get_user_link(wanted_user)),
            parse_mode=ParseMode.MARKDOWN)
Exemplo n.º 6
0
    def warn(self, bot: Bot, update: Update, wanted_user: User = None):
        """Strike a user

        After 3 strikes he is banned

        Args:
            bot (:obj:`telegram.bot.Bot`): Telegram Api Bot Object.
            update (:obj:`telegram.update.Update`): Telegram Api Update Object
            wanted_user (:obj:`telegram.user.User`): Telegram User object of the user which should be warned
        """
        if update.message.reply_to_message is None:
            update.message.reply_text(
                'You have to reply to a message from this user to warn him.')
            return
        chat_id = update.message.chat_id
        from_user = update.message.from_user
        wanted_user = wanted_user or update.message.reply_to_message.from_user

        group_data = data.get(self.group_data_set)

        if not group_data.get(chat_id, None):
            group_data[chat_id] = {}
        if not group_data[chat_id].get(wanted_user.id, None):
            group_data[chat_id][wanted_user.id] = 1
        else:
            if group_data[chat_id][wanted_user.id] == 'banned':
                bot.send_message(
                    chat_id=chat_id,
                    text='{wanted_user} was already banned.'.format(
                        wanted_user=get_user_link(wanted_user)),
                    parse_mode=ParseMode.MARKDOWN)
                return
            else:
                group_data[chat_id][wanted_user.id] += 1
        if group_data[chat_id][wanted_user.id] == 3:
            self.ban(bot, update)
            return

        bot.send_message(
            chat_id=chat_id,
            text=
            ('{wanted_user} was warned by {from_user}\n User has now {warns} waning/s. With 3 warnings user '
             'gets banned.').format(from_user=get_user_link(from_user),
                                    wanted_user=get_user_link(wanted_user),
                                    warns=group_data[chat_id][wanted_user.id]),
            parse_mode=ParseMode.MARKDOWN)

        data.save(self.group_data_set, group_data)
Exemplo n.º 7
0
    def ban(self, bot: Bot, update: Update):
        """Ban a user

        Args:
            bot (:obj:`telegram.bot.Bot`): Telegram Api Bot Object.
            update (:obj:`telegram.update.Update`): Telegram Api Update Object
        """
        if update.message.reply_to_message is None:
            update.message.reply_text(
                'You have to reply to a message from this user to ban him.')
            return

        chat_id = update.message.chat_id
        from_user = update.message.from_user
        wanted_user = update.message.reply_to_message.from_user

        group_data = data.get(self.group_data_set)

        if not group_data.get(chat_id, None):
            group_data[chat_id] = {}
        if not group_data[chat_id].get(wanted_user.id, None):
            group_data[chat_id][wanted_user.id] = 'banned'
        else:
            if group_data[chat_id][wanted_user.id] == 'banned':
                bot.send_message(
                    chat_id=chat_id,
                    text='{wanted_user} was already banned.'.format(
                        wanted_user=get_user_link(wanted_user)),
                    parse_mode=ParseMode.MARKDOWN)
                return
            else:
                group_data[chat_id][wanted_user.id] = 'banned'

        now = datetime.datetime.now()

        bot.kick_chat_member(chat_id=chat_id,
                             user_id=wanted_user.id,
                             until_date=now + datetime.timedelta(seconds=5))
        bot.send_message(chat_id=chat_id,
                         text='{wanted_user} was banned by {from_user}'.format(
                             from_user=get_user_link(from_user),
                             wanted_user=get_user_link(wanted_user)),
                         parse_mode=ParseMode.MARKDOWN)

        data.save(self.group_data_set, group_data)
Exemplo n.º 8
0
    def rules(self, bot: Bot, update: Update):
        """Show the defined group rules

        Args:
            bot (:obj:`telegram.bot.Bot`): Telegram Api Bot Object.
            update (:obj:`telegram.update.Update`): Telegram Api Update Object
        """
        chat_id = update.message.chat_id
        group_data = data.get(self.group_data_set)

        if not group_data.get(chat_id, None) or not group_data[chat_id].get(
                'rules', None):
            bot.send_message(
                chat_id=chat_id,
                text=
                'This group has no rules defined, use /rules_define to add them.'
            )
            return

        bot.send_message(chat_id=chat_id,
                         text=group_data[chat_id]['rules'],
                         parse_mode=ParseMode.MARKDOWN)