示例#1
0
    def always(self, m):
        if str(m.conversation.id) == str(
                self.bot.config.alerts_conversation_id) or str(
                    m.conversation.id) == str(
                        self.bot.config.admin_conversation_id):
            return

        spam_types = ['spam', 'arab', 'russian']

        for spam_type in spam_types:
            if has_tag(self.bot, m.sender.id, spam_type):
                if not is_admin(self.bot, m.sender.id, m):
                    self.kick_spammer(m, spam_type, 'tag')
                elif is_trusted(self.bot, m.sender.id, m):
                    del_tag(self.bot, m.sender.id, spam_type)
                    name = get_full_name(self.bot, m.sender.id)
                    gid = str(m.conversation.id)
                    self.bot.send_admin_alert(
                        'Unmarking %s: %s [%s] from group %s [%s]' %
                        (spam_type, name, m.sender.id,
                         self.bot.groups[gid].title, gid))

            if m.conversation.id < 0 and has_tag(
                    self.bot, m.conversation.id, spam_type) and not has_tag(
                        self.bot, m.conversation.id, 'safe') and not has_tag(
                            self.bot, m.conversation.id,
                            'resend:?') and not has_tag(
                                self.bot, m.conversation.id, 'fwd:?'):
                self.kick_myself(m)

        if m.extra:
            if 'urls' in m.extra:
                for url in m.extra['urls']:
                    self.check_trusted_telegram_link(m, fix_telegram_link(url))
            if 'caption' in m.extra and m.extra['caption']:
                if self.detect_arab(m.extra['caption']):
                    self.kick_spammer(m, 'arab', 'caption')
                if self.detect_russian(m.extra['caption']):
                    self.kick_spammer(m, 'russian', 'caption')

                try:
                    self.check_trusted_telegram_link(m, m.extra['caption'])
                except:
                    logging.error(m.extra['caption'])

        if not has_tag(self.bot, m.conversation.id, 'safe') and not has_tag(
                self.bot, m.conversation.id, 'resend:?') and not has_tag(
                    self.bot, m.conversation.id, 'fwd:?'):
            if m.type == 'text':
                if self.detect_arab(m.content):
                    self.kick_spammer(m, 'arab', 'content')

                if self.detect_russian(m.content):
                    self.kick_spammer(m, 'russian', 'content')

            if self.detect_arab(m.sender.first_name):
                self.kick_spammer(m, 'arab', 'name')

            if self.detect_russian(m.sender.first_name):
                self.kick_spammer(m, 'russian', 'name')
示例#2
0
    def check_permissions(self, m):
        if not im_group_admin(self.bot, m):
            self.bot.send_message(m,
                                  self.bot.trans.errors.admin_required,
                                  extra={'format': 'HTML'})
            return False

        if not is_admin(self.bot, m.sender.id) and not is_mod(
                self.bot, m.sender.id, m.conversation.id):
            self.bot.send_message(m,
                                  self.bot.trans.errors.permission_required,
                                  extra={'format': 'HTML'})
            return False

        return True
示例#3
0
    def run(self, m):
        if m.conversation.id > 0:
            return self.bot.send_message(m, self.bot.trans.errors.group_only, extra={'format': 'HTML'})

        input = get_input(m, ignore_reply=False)
        parameter = first_word(input)
        enabled = ['reactions', 'roulette',
                   'replies', 'pole', 'fiesta', 'nsfw']
        disabled = ['antispam', 'antiarab', 'antirussian', 'polereset']
        config = {}

        for param in enabled:
            config[param] = not has_tag(
                self.bot, m.conversation.id, 'no' + param)

        for param in disabled:
            config[param] = has_tag(self.bot, m.conversation.id, param)

        text = ''
        if not input:
            text = self.bot.trans.plugins.config.strings.explanation % "', '".join(
                config)
            for param in config:
                text += '\n' + ('✔️' if config[param] else '❌') + \
                    ' ' + self.bot.trans.plugins.config.strings[param]

        elif parameter in enabled or parameter in disabled:
            if not is_admin(self.bot, m.sender.id, m) and not is_trusted(self.bot, m.sender.id, m):
                return self.bot.send_message(m, self.bot.trans.errors.permission_required, extra={'format': 'HTML'})

            if config[parameter]:
                if parameter in enabled:
                    set_tag(self.bot, m.conversation.id, 'no' + parameter)
                elif parameter in disabled:
                    del_tag(self.bot, m.conversation.id, parameter)
            else:
                if parameter in enabled:
                    del_tag(self.bot, m.conversation.id, 'no' + parameter)
                elif parameter in disabled:
                    set_tag(self.bot, m.conversation.id, parameter)

            text = ('❌' if config[parameter] else '✔️') + \
                ' ' + self.bot.trans.plugins.config.strings[parameter]

        return self.bot.send_message(m, text, extra={'format': 'HTML'})
示例#4
0
 def check_trusted_telegram_link(self, m, text):
     input_match = compile(
         '(?i)(?:t|telegram|tlgrm)\.(?:me|dog)\/joinchat\/([a-zA-Z0-9\-]+)',
         flags=IGNORECASE).search(text)
     if input_match and input_match.group(1):
         trusted_group = False
         if input_match:
             group_hash = input_match.group(1)
             for gid, attr in self.bot.administration.items():
                 group = self.bot.administration[gid]
                 if group and 'link' in group and group_hash in group.link:
                     trusted_group = True
                     break
         if not trusted_group and not is_admin(self.bot, m.sender.id, m):
             name = get_full_name(self.bot, m.sender.id)
             gid = str(m.conversation.id)
             self.bot.send_admin_alert(
                 'Sent unsafe telegram link: %s [%s] to group %s [%s] for text: %s'
                 %
                 (name, m.sender.id, self.bot.groups[gid].title, gid, text))
             self.kick_spammer(m, 'spam', 'link')
示例#5
0
    def run(self, m):
        input = get_input(m)
        uid = str(m.sender.id)
        gid = str(m.conversation.id)
        ok = False

        if m.conversation.id > 0:
            return self.bot.send_message(m,
                                         self.bot.trans.errors.group_only,
                                         extra={'format': 'HTML'})

        # List all administration commands. #
        if is_command(self, 1, m.content):
            text = self.bot.trans.plugins.admin.strings.commands
            for command in self.commands:
                # Adds the command and parameters#
                text += '\n • ' + \
                    command.command.replace('/', self.bot.config.prefix)

                if 'parameters' in command and command.parameters:
                    for parameter in command.parameters:
                        name, required = list(parameter.items())[0]
                        # Bold for required parameters, and italic for optional #
                        if required:
                            text += ' <b>&lt;%s&gt;</b>' % name
                        else:
                            text += ' [%s]' % name

                if 'description' in command:
                    text += '\n   <i>%s</i>' % command.description
                else:
                    text += '\n   <i>?¿</i>'

            ok = self.bot.send_message(m, text, extra={'format': 'HTML'})

        # Title #
        if is_command(self, 2, m.content):
            if self.check_permissions(m):
                ok = self.bot.bindings.rename_conversation(
                    m.conversation.id, input)

        # Description #
        elif is_command(self, 3, m.content):
            if self.check_permissions(m):
                ok = self.bot.bindings.change_conversation_description(
                    m.conversation.id, input)

        # Photo #
        elif is_command(self, 4, m.content):
            if self.check_permissions(m):
                if m.reply and m.reply.type == 'photo':
                    photo = self.bot.bindings.get_file(m.reply.content)
                    if photo:
                        ok = self.bot.bindings.change_conversation_photo(
                            m.conversation.id, photo)
                    else:
                        ok = self.bot.bindings.change_conversation_photo(
                            m.conversation.id, m.reply.content)

        # Promote #
        elif is_command(self, 5, m.content):
            if self.check_permissions(m):
                target = get_target(self.bot, m, get_input(m))
                ok = self.bot.bindings.promote_conversation_member(
                    m.conversation.id, target)

        # Kick #
        elif is_command(self, 6, m.content):
            if self.check_permissions(m):
                target = get_target(self.bot, m, get_input(m))
                ok = self.bot.bindings.kick_conversation_member(
                    m.conversation.id, target)

        # Unban #
        elif is_command(self, 7, m.content):
            if self.check_permissions(m):
                target = get_target(self.bot, m, get_input(m))
                ok = self.bot.bindings.unban_conversation_member(
                    m.conversation.id, target)

        # Delete message #
        elif is_command(self, 8, m.content):
            if self.check_permissions(m):
                self.bot.bindings.delete_message(m.conversation.id, m.id)
                if m.reply:
                    ok = self.bot.bindings.delete_message(
                        m.conversation.id, m.reply.id)

        # Pin #
        elif is_command(self, 9, m.content):
            if self.check_permissions(m):
                if m.reply:
                    ok = self.bot.send_message(
                        m,
                        'pinChatMessage',
                        'api',
                        extra={'message_id': m.reply.id})

        # Unpin #
        elif is_command(self, 10, m.content):
            if self.check_permissions(m):
                if m.reply:
                    ok = self.bot.send_message(m, 'unpinChatMessage', 'api')

        # Custom title #
        elif is_command(self, 11, m.content):
            if self.check_permissions(m):
                if m.reply:
                    target = m.reply.sender.id
                else:
                    target = m.sender.id
                ok = self.bot.send_message(m,
                                           'setChatAdministratorCustomTitle',
                                           'api',
                                           extra={
                                               'user_id': target,
                                               'custom_title': input
                                           })

        # Leave #
        elif is_command(self, 12, m.content):
            if not is_admin(self.bot, m.sender.id) and not is_mod(
                    self.bot, m.sender.id, m.conversation.id):
                self.bot.send_message(
                    m,
                    self.bot.trans.errors.permission_required,
                    extra={'format': 'HTML'})
            else:
                ok = self.bot.bindings.kick_conversation_member(
                    m.conversation.id, self.bot.info.id)

        if not ok:
            return self.bot.send_message(m,
                                         self.bot.trans.errors.failed,
                                         extra={'format': 'HTML'})
示例#6
0
    def run(self, m):
        input = get_input(m)
        uid = str(m.sender.id)
        gid = str(m.conversation.id)

        # List all administration commands. #
        if is_command(self, 1, m.content):
            text = self.bot.trans.plugins.administration.strings.commands
            for command in self.commands:
                # Adds the command and parameters#
                if command.command == '^new_chat_member$':
                    text += '\n • ' + \
                        self.bot.trans.plugins.administration.strings.new_chat_member
                else:
                    text += '\n • ' + \
                        command.command.replace('/', self.bot.config.prefix)

                if 'parameters' in command and command.parameters:
                    for parameter in command.parameters:
                        name, required = list(parameter.items())[0]
                        # Bold for required parameters, and italic for optional #
                        if required:
                            text += ' <b>&lt;%s&gt;</b>' % name
                        else:
                            text += ' [%s]' % name

                if 'description' in command:
                    text += '\n   <i>%s</i>' % command.description
                else:
                    text += '\n   <i>?¿</i>'

            return self.bot.send_message(m, text, extra={'format': 'HTML'})

        # List all groups. #
        if is_command(self, 2, m.content):
            text = self.bot.trans.plugins.administration.strings.groups
            if len(self.bot.administration) > 0:
                for gid, attr in self.bot.administration.items():
                    if 'public' in self.bot.administration[gid] and self.bot.administration[gid].public:
                        if 'link' in self.bot.administration[gid] and self.bot.config.bindings != 'telegram-cli':
                            text += '\n • <a href="%s">%s</a>' % (
                                self.bot.administration[gid].link, self.bot.groups[gid].title)
                        else:
                            text += '\n • %s' % self.bot.groups[gid].title

                        if self.bot.administration[gid].alias:
                            text += ' /<b>%s</b>/' % attr.alias

            else:
                text = self.bot.trans.plugins.administration.strings.no_groups

            return self.bot.send_message(m, text, extra={'format': 'HTML', 'preview': False})

        # Join a group. #
        elif is_command(self, 3, m.content):
            if not input:
                return self.bot.send_message(m, self.bot.trans.errors.missing_parameter, extra={'format': 'HTML'})

            gid_to_join = None
            for id in self.bot.administration:
                if (input in self.bot.administration
                    or compile('^' + input.lower() + '$').search(self.bot.administration[id].alias.lower())
                        or compile('^' + input.lower() + '$').search(self.bot.groups[id].title.lower())):
                    gid_to_join = id
                    break

            if gid_to_join:
                if not gid_to_join in self.bot.administration:
                    return self.bot.send_message(m, self.bot.trans.plugins.administration.strings.not_added % m.conversation.title, extra={'format': 'HTML'})

                added = self.bot.bindings.invite_conversation_member(
                    gid_to_join, uid)

                if not added:
                    text = '<b>%s</b>' % self.bot.groups[gid_to_join].title
                    if self.bot.administration[gid_to_join].motd:
                        text += '\n<i>%s</i>' % self.bot.administration[gid_to_join].motd

                    text += '\n\n%s' % self.bot.trans.plugins.administration.strings.rules
                    i = 1
                    if 'rules' in self.bot.administration[gid_to_join]:
                        for rule in self.bot.administration[gid_to_join].rules:
                            text += '\n %s. <i>%s</i>' % (i, rule)
                            i += 1
                    else:
                        text += '\n%s' % self.bot.trans.plugins.administration.strings.norules

                    if not self.bot.administration[gid_to_join].link:
                        text += '\n\n%s' % self.bot.trans.plugins.administration.strings.nolink
                    else:
                        text += '\n\n<a href="%s">%s</a>' % (
                            self.bot.administration[gid_to_join].link, self.bot.trans.plugins.administration.strings.join)
                    return self.bot.send_message(m, text, extra={'format': 'HTML', 'preview': False})

        # Information about a group. #
        elif is_command(self, 4, m.content) or is_command(self, 16, m.content):
            if m.conversation.id > 0:
                return self.bot.send_message(m, self.bot.trans.errors.group_only, extra={'format': 'HTML'})
            if not gid in self.bot.administration:
                if is_command(self, 4, m.content):
                    return self.bot.send_message(m, self.bot.trans.plugins.administration.strings.not_added % m.conversation.title, extra={'format': 'HTML'})
                elif is_command(self, 16, m.content):
                    return

            text = '<b>%s</b>' % self.bot.groups[gid].title
            if 'motd' in self.bot.administration[gid]:
                text += '\n<i>%s</i>' % self.bot.administration[gid].motd

            text += '\n\n%s' % self.bot.trans.plugins.administration.strings.rules
            i = 1

            if not 'rules' in self.bot.administration[gid]:
                text += '\n%s' % self.bot.trans.plugins.administration.strings.norules
            else:
                for rule in self.bot.administration[gid].rules:
                    text += '\n %s. <i>%s</i>' % (i, rule)
                    i += 1

            if is_command(self, 4, m.content):
                if not self.bot.administration[gid].link:
                    text += '\n\n%s' % self.bot.trans.plugins.administration.strings.nolink
                else:
                    text += '\n\n<a href="%s">%s</a>' % (
                        self.bot.trans.plugins.administration.strings.join, self.bot.administration[gid].link)
            return self.bot.send_message(m, text, extra={'format': 'HTML', 'preview': False})

        # Rules of a group. #
        elif is_command(self, 5, m.content):
            if m.conversation.id > 0:
                return self.bot.send_message(m, self.bot.trans.errors.group_only, extra={'format': 'HTML'})
            if not gid in self.bot.administration:
                return self.bot.send_message(m, self.bot.trans.plugins.administration.strings.not_added % m.conversation.title, extra={'format': 'HTML'})

            if input and is_int(input):
                try:
                    i = int(input)
                    text = '%s. <i>%s</i>' % (i,
                                              self.bot.administration[gid].rules[i - 1])
                except:
                    text = self.bot.trans.plugins.administration.strings.notfound

            else:
                text = self.bot.trans.plugins.administration.strings.rules
                i = 1
                for rule in self.bot.administration[gid].rules:
                    text += '\n %s. <i>%s</i>' % (i, rule)
                    i += 1

            if not self.bot.administration[gid].rules:
                text += '\n%s' % self.bot.trans.plugins.administration.strings.norules
            return self.bot.send_message(m, text, extra={'format': 'HTML', 'preview': False})

        # Set rules #
        elif is_command(self, 6, m.content):
            if not input:
                return self.bot.send_message(m, self.bot.trans.errors.missing_parameter, extra={'format': 'HTML'})

            if m.conversation.id > 0:
                return self.bot.send_message(m, self.bot.trans.errors.group_only, extra={'format': 'HTML'})

            if not is_admin(self.bot, uid, m) and not is_mod(self.bot, uid, gid):
                return self.bot.send_message(m, self.bot.trans.errors.permission_required, extra={'format': 'HTML'})

            if gid in self.bot.administration:
                self.bot.administration[gid].rules = input.split('\n')
                set_data('administration/%s/%s/rules' %
                         (self.bot.name, gid), self.bot.administration[gid].rules)
                return self.bot.send_message(m, self.bot.trans.plugins.administration.strings.set % m.conversation.title, extra={'format': 'HTML'})
            else:
                return self.bot.send_message(m, self.bot.trans.plugins.administration.strings.not_added % m.conversation.title, extra={'format': 'HTML'})

        # Set rule #
        elif is_command(self, 7, m.content):
            if not input:
                return self.bot.send_message(m, self.bot.trans.errors.missing_parameter, extra={'format': 'HTML'})

            if m.conversation.id > 0:
                return self.bot.send_message(m, self.bot.trans.errors.group_only, extra={'format': 'HTML'})

            if not is_admin(self.bot, uid, m) and not is_mod(self.bot, uid, gid):
                return self.bot.send_message(m, self.bot.trans.errors.permission_required, extra={'format': 'HTML'})

            if gid in self.bot.administration:
                try:
                    i = int(first_word(input))-1
                    if i > len(self.bot.administration[gid].rules):
                        i = len(self.bot.administration[gid].rules)
                    elif i < 1:
                        i = 0
                except:
                    return self.bot.send_message(m, self.bot.trans.errors.invalid_syntax, extra={'format': 'HTML'})

                self.bot.administration[gid].rules.insert(
                    i, all_but_first_word(input))
                set_data('administration/%s/%s/rules' %
                         (self.bot.name, gid), self.bot.administration[gid].rules)
                return self.bot.send_message(m, self.bot.trans.plugins.administration.strings.set % m.conversation.title, extra={'format': 'HTML'})

        # Remove rule #
        elif is_command(self, 8, m.content):
            if not input:
                return self.bot.send_message(m, self.bot.trans.errors.missing_parameter, extra={'format': 'HTML'})

            if m.conversation.id > 0:
                return self.bot.send_message(m, self.bot.trans.errors.group_only, extra={'format': 'HTML'})

            if not is_admin(self.bot, uid, m) and not is_mod(self.bot, uid, gid):
                return self.bot.send_message(m, self.bot.trans.errors.permission_required, extra={'format': 'HTML'})

            if gid in self.bot.administration:
                try:
                    i = int(first_word(input))-1
                    if i > len(self.bot.administration[gid].rules):
                        i = len(self.bot.administration[gid].rules)
                    elif i < 1:
                        i = 0
                except:
                    return self.bot.send_message(m, self.bot.trans.errors.invalid_syntax, extra={'format': 'HTML'})

                del self.bot.administration[gid].rules[i]
                set_data('administration/%s/%s/rules' %
                         (self.bot.name, gid), self.bot.administration[gid].rules)
                return self.bot.send_message(m, self.bot.trans.plugins.administration.strings.set % m.conversation.title, extra={'format': 'HTML'})

        # Add mod #
        elif is_command(self, 9, m.content):
            if m.conversation.id > 0:
                return self.bot.send_message(m, self.bot.trans.errors.group_only, extra={'format': 'HTML'})

            if not is_admin(self.bot, uid, m):
                return self.bot.send_message(m, self.bot.trans.errors.permission_required, extra={'format': 'HTML'})

            set_tag(self.bot, m.sender.id, 'mod:%s' % gid)

        # Remove mod #
        elif is_command(self, 10, m.content):
            if m.conversation.id > 0:
                return self.bot.send_message(m, self.bot.trans.errors.group_only, extra={'format': 'HTML'})

            if not is_admin(self.bot, uid, gid):
                return self.bot.send_message(m, self.bot.trans.errors.permission_required, extra={'format': 'HTML'})

            del_tag(self.bot, m.sender.id, 'mod:%s' % gid)

        # Add group #
        elif is_command(self, 11, m.content):
            if m.conversation.id > 0:
                return self.bot.send_message(m, self.bot.trans.errors.group_only, extra={'format': 'HTML'})

            if not is_admin(self.bot, uid, m):
                return self.bot.send_message(m, self.bot.trans.errors.permission_required, extra={'format': 'HTML'})

            if not gid in self.bot.administration:
                self.bot.administration[gid] = {
                    'alias': None,
                    'description': None,
                    'link': None,
                    'rules': [],
                    'public': False
                }
                set_data('administration/%s/%s' %
                         (self.bot.name, gid), self.bot.administration[gid])
                return self.bot.send_message(m, self.bot.trans.plugins.administration.strings.added % m.conversation.title, extra={'format': 'HTML'})
            else:
                return self.bot.send_message(m, self.bot.trans.plugins.administration.strings.already_added % m.conversation.title, extra={'format': 'HTML'})

        # Remove group #
        elif is_command(self, 12, m.content):
            if m.conversation.id > 0:
                return self.bot.send_message(m, self.bot.trans.errors.group_only, extra={'format': 'HTML'})

            if not is_admin(self.bot, uid, m):
                return self.bot.send_message(m, self.bot.trans.errors.permission_required, extra={'format': 'HTML'})

            if gid in self.bot.administration:
                del self.bot.administration[gid]
                delete_data('administration/%s/%s' % (self.bot.name, gid))
                return self.bot.send_message(m, self.bot.trans.plugins.administration.strings.removed % m.conversation.title, extra={'format': 'HTML'})
            else:
                return self.bot.send_message(m, self.bot.trans.plugins.administration.strings.not_added % m.conversation.title, extra={'format': 'HTML'})

        # Set alias #
        elif is_command(self, 13, m.content):
            if m.conversation.id > 0:
                return self.bot.send_message(m, self.bot.trans.errors.group_only, extra={'format': 'HTML'})

            if not is_admin(self.bot, uid, m):
                return self.bot.send_message(m, self.bot.trans.errors.permission_required, extra={'format': 'HTML'})

            if gid in self.bot.administration:
                self.bot.administration[gid].alias = input.lower()
                set_data('administration/%s/%s/alias' %
                         (self.bot.name, gid), self.bot.administration[gid].alias)
                return self.bot.send_message(m, self.bot.trans.plugins.administration.strings.set % m.conversation.title, extra={'format': 'HTML'})
            else:
                return self.bot.send_message(m, self.bot.trans.plugins.administration.strings.not_added % m.conversation.title, extra={'format': 'HTML'})

        # Set link #
        elif is_command(self, 14, m.content):
            if m.conversation.id > 0:
                return self.bot.send_message(m, self.bot.trans.errors.group_only, extra={'format': 'HTML'})

            if not is_admin(self.bot, uid, m):
                return self.bot.send_message(m, self.bot.trans.errors.permission_required, extra={'format': 'HTML'})

            if gid in self.bot.administration:
                self.bot.administration[gid].link = input.lower()
                set_data('administration/%s/%s/link' %
                         (self.bot.name, gid), self.bot.administration[gid].link)
                return self.bot.send_message(m, self.bot.trans.plugins.administration.strings.set % m.conversation.title, extra={'format': 'HTML'})
            else:
                return self.bot.send_message(m, self.bot.trans.plugins.administration.strings.not_added % m.conversation.title, extra={'format': 'HTML'})

        # Make public #
        elif is_command(self, 15, m.content):
            if not input:
                return self.bot.send_message(m, self.bot.trans.errors.missing_parameter, extra={'format': 'HTML'})

            if gid in self.bot.administration:
                if input and 'true' in input.lower():
                    self.bot.administration[gid].public = True
                else:
                    self.bot.administration[gid].public = False
                set_data('administration/%s/%s/public' %
                         (self.bot.name, gid), self.bot.administration[gid].public)
                return self.bot.send_message(m, self.bot.trans.plugins.administration.strings.set % m.conversation.title, extra={'format': 'HTML'})
            else:
                return self.bot.send_message(m, self.bot.trans.plugins.administration.strings.not_added % m.conversation.title, extra={'format': 'HTML'})