Пример #1
0
    def update_rowboat_guild_access(self):
        #        if ROWBOAT_GUILD_ID not in self.state.guilds or ENV != 'prod':
        #            return

        rb_guild = self.state.guilds.get(ROWBOAT_GUILD_ID)
        if not rb_guild:
            return

        self.log.info('Updating rowboat guild access')

        guilds = Guild.select(Guild.guild_id, Guild.config).where(
            (Guild.enabled == 1))

        users_who_should_have_access = set()
        for guild in guilds:
            if 'web' not in guild.config:
                continue

            for user_id in guild.config['web'].keys():
                try:
                    users_who_should_have_access.add(int(user_id))
                except:
                    self.log.warning('Guild %s has invalid user ACLs: %s',
                                     guild.guild_id, guild.config['web'])

        # TODO: sharding
        users_who_have_access = {
            i.id
            for i in rb_guild.members.values()
            if ROWBOAT_USER_ROLE_ID in i.roles
        }

        remove_access = set(users_who_have_access) - set(
            users_who_should_have_access)
        add_access = set(users_who_should_have_access) - set(
            users_who_have_access)

        for user_id in remove_access:
            member = rb_guild.members.get(user_id)
            if not member:
                continue

            member.remove_role(ROWBOAT_USER_ROLE_ID)

        for user_id in add_access:
            member = rb_guild.members.get(user_id)
            if not member:
                continue

            member.add_role(ROWBOAT_USER_ROLE_ID)
Пример #2
0
 def command_about(self, event):
     embed = MessageEmbed()
     embed.set_author(name='Rowboat',
                      icon_url=self.client.state.me.avatar_url,
                      url='https://rowboat.party/')
     embed.description = BOT_INFO
     embed.add_field(name='Servers',
                     value=str(Guild.select().count()),
                     inline=True)
     embed.add_field(name='Uptime',
                     value=humanize.naturaldelta(datetime.utcnow() -
                                                 self.startup),
                     inline=True)
     event.msg.reply(embed=embed)
Пример #3
0
 def command_about(self, event):
     embed = MessageEmbed()
     embed.color = 0x7289da
     embed.set_author(name='Jetski',
                      icon_url=self.client.state.me.avatar_url,
                      url='https://jetski.ga/')
     embed.description = BOT_INFO
     embed.add_field(name='Servers',
                     value=str(Guild.select().count()),
                     inline=True)
     embed.add_field(name='Uptime',
                     value=humanize_duration(datetime.utcnow() -
                                             self.startup),
                     inline=True)
     event.msg.reply(embed=embed)
Пример #4
0
def stats():
    stats = json.loads(rdb.get('web:dashboard:stats') or '{}')

    if not stats or 'refresh' in request.args:
        # stats['messages'] = pretty_number(Message.select().count())
        # stats['guilds'] = pretty_number(Guild.select().count())
        # stats['users'] = pretty_number(User.select().count())
        # stats['channels'] = pretty_number(Channel.select().count())
        stats['messages'] = Message.select().count()
        stats['guilds'] = Guild.select().count()
        stats['users'] = User.select().count()
        stats['channels'] = Channel.select().count()

        rdb.setex('web:dashboard:stats', json.dumps(stats), 300)

    return jsonify(stats)
Пример #5
0
    def wait_for_actions(self):
        ps = rdb.pubsub()
        ps.subscribe('actions')

        for item in ps.listen():
            if item['type'] != 'message':
                continue

            data = json.loads(item['data'])
            if data['type'] == 'GUILD_UPDATE' and data['id'] in self.guilds:
                with self.send_config_message() as embed:
                    embed.title = u'Reloaded config for {}'.format(
                        self.guilds[data['id']].name)

                self.log.info(u'Reloading guild %s',
                              self.guilds[data['id']].name)

                # Refresh config, mostly to validate
                try:
                    config = self.guilds[data['id']].get_config(refresh=True)

                    # Reload the guild entirely
                    self.guilds[data['id']] = Guild.with_id(data['id'])

                    # Update guild access
                    self.update_rowboat_guild_access()

                    # Finally, emit the event
                    self.emitter.emit('GUILD_CONFIG_UPDATE',
                                      self.guilds[data['id']], config)
                except:
                    self.log.exception(u'Failed to reload config for guild %s',
                                       self.guilds[data['id']].name)
                    continue
            elif data['type'] == 'RESTART':
                self.log.info('Restart requested, signaling parent')
                os.kill(os.getppid(), signal.SIGUSR1)
            elif data['type'] == 'GUILD_DELETE' and data['id'] in self.guilds:
                with self.send_config_message() as embed:
                    embed.color = 0xff6961
                    embed.title = u'Guild Force Deleted {}'.format(
                        self.guilds[data['id']].name, )

                self.log.info(u'Leaving guild %s',
                              self.guilds[data['id']].name)
                self.guilds[data['id']].leave()
Пример #6
0
    def on_guild_create(self, event):
        try:
            guild = Guild.with_id(event.id)
        except Guild.DoesNotExist:
            # If the guild is not awaiting setup, leave it now
            if not rdb.sismember(GUILDS_WAITING_SETUP_KEY, str(
                    event.id)) and event.id != ROWBOAT_GUILD_ID:
                self.log.warning(
                    'Leaving guild %s (%s), not within setup list', event.id,
                    event.name)
                event.guild.leave()
            return

        if not guild.enabled:
            if rdb.sismember(GUILDS_WAITING_SETUP_KEY, str(event.id)):
                guild.enabled = True
                guild.save()
            else:
                return

        config = guild.get_config()
        if not config:
            return

        # Ensure we're updated
        # self.log.info('Syncing guild %s', event.guild.id)
        # guild.sync(event.guild)
        self.log.info('Adding guild {} to sync list'.format(event.id))
        self.guild_sync.append(event.id)

        self.guilds[event.id] = guild

        if config.nickname:

            def set_nickname():
                m = event.members.select_one(id=self.state.me.id)
                if m and m.nick != config.nickname:
                    try:
                        m.set_nickname(config.nickname)
                    except APIException as e:
                        self.log.warning(
                            'Failed to set nickname for guild %s (%s)',
                            event.guild, e.content)

            self.spawn_later(5, set_nickname)
Пример #7
0
    def rmv_whitelist(self, event, guild, flag):
        flag = Guild.WhitelistFlags.get(flag)
        if not flag:
            raise CommandFail('invalid flag')

        try:
            guild = Guild.get(guild_id=guild)
        except Guild.DoesNotExist:
            raise CommandFail('no guild exists with that id')

        if not guild.is_whitelisted(flag):
            raise CommandFail('this guild doesn\'t have this flag')

        guild.whitelist.remove(int(flag))
        guild.save()
        guild.emit('GUILD_UPDATE')

        event.msg.reply('Ok, removed flag `{}` from guild {}'.format(str(flag), guild.guild_id))
Пример #8
0
    def add_whitelist(self, event, guild, flag):
        flag = Guild.WhitelistFlags.get(flag)
        if not flag:
            raise CommandFail('invalid flag')

        try:
            guild = Guild.get(guild_id=guild)
        except Guild.DoesNotExist:
            raise CommandFail('no guild exists with that id')

        if guild.is_whitelisted(flag):
            raise CommandFail('this guild already has this flag')

        guild.whitelist.append(int(flag))
        guild.save()
        guild.emit('GUILD_UPDATE')

        event.msg.reply('Ok, added flag `{}` to guild {}'.format(str(flag), guild.guild_id))
Пример #9
0
def rmv_whitelist(guild_id, flag):
    from rowboat.models.guild import Guild
    init_db(ENV)

    flag = Guild.WhitelistFlags.get(flag)
    if not flag:
        print 'Invalid flag'
        return

    try:
        guild = Guild.get(guild_id=guild_id)
    except Guild.DoesNotExist:
        print 'No guild exists with that id'
        return

    guild.whitelist.remove(int(flag))
    guild.save()
    guild.emit_update()
    print 'removed flag'
Пример #10
0
def add_whitelist(guild_id, flag):
    from rowboat.models.guild import Guild
    init_db(ENV)

    flag = Guild.WhitelistFlags.get(flag)
    if not flag:
        print('Flag not found')
        return

    try:
        guild = Guild.get(guild_id=guild_id)
    except Guild.DoesNotExist:
        print('No guild exists with that id')
        return

    guild.whitelist.append(int(flag))
    guild.save()
    guild.emit_update()
    print('Added flag')
Пример #11
0
    def on_guild_create(self, event):
        try:
            guild = Guild.with_id(event.id)
        except Guild.DoesNotExist:
            # If the guild is not awaiting setup, leave it now
            if not rdb.sismember(GUILDS_WAITING_SETUP_KEY, str(
                    event.id)) and event.id != ROWBOAT_GUILD_ID:
                self.log.warning(
                    'I am in guild %s (%s), and it\'s not within the setup list',
                    event.id, event.name)
                #event.guild.leave()
            return

        if not guild.enabled:
            return

        config = guild.get_config()
        if not config:
            return

        # Ensure we're updated
        self.log.info('Requesting Guild: %s (%s)', event.guild.name,
                      event.guild.id)
        guild.sync(event.guild)

        #       guild.request_guild_members()

        self.guilds[event.id] = guild

        if config.nickname:

            def set_nickname():
                m = event.members.select_one(id=self.state.me.id)
                if m and m.nick != config.nickname:
                    try:
                        m.set_nickname(config.nickname)
                    except APIException as e:
                        self.log.warning(
                            'Failed to set nickname for guild %s (%s)',
                            event.guild, e.content)

            self.spawn_later(5, set_nickname)
Пример #12
0
    def command_setup(self, event):
        if not event.guild:
            raise CommandFail('This command can only be used in servers')

        global_admin = rdb.sismember('global_admins', event.author.id)

        # Make sure this is the owner of the server
        if not global_admin:
            if not event.guild.owner_id == event.author.id:
                raise CommandFail('Only the server owner can setup speedboat')

        # Make sure we have admin perms
        m = event.guild.members.select_one(id=self.state.me.id)
        if not m.permissions.administrator and not global_admin:
            raise CommandFail('Bot must have the Administrator permission')

        guild = Guild.setup(event.guild)
        rdb.srem(GUILDS_WAITING_SETUP_KEY, str(event.guild.id))
        self.guilds[event.guild.id] = guild
        raise CommandSuccess('Successfully loaded configuration')
Пример #13
0
    def on_join(self, event):
        g = Guild.select(Guild).where((Guild.guild_id == event.guild.id)).get()    

        if g.premium == False:
          raise CommandFail('This guild does not have premium enabled, please contact an Airplane global administrator.')

        if event.guild.id in self.guilds:
            return event.msg.reply("I'm already playing music here.")

        state = event.guild.get_member(event.author).get_voice_state()
        if not state:
            return event.msg.reply('You must be connected to voice to use that command.')

        try:
            client = state.channel.connect()
        except VoiceException as e:
            return event.msg.reply('Failed to connect to voice: `{}`'.format(e))

        self.guilds[event.guild.id] = Player(client)
        self.guilds[event.guild.id].complete.wait()
        del self.guilds[event.guild.id]
Пример #14
0
 def command_about(self, event):
     embed = MessageEmbed()
     embed.set_author(name='Planeboat',
                      icon_url=self.client.state.me.avatar_url,
                      url='https://rowboat.party/')
     embed.description = BOT_INFO
     embed.add_field(name='Servers',
                     value=str(Guild.select().count()),
                     inline=True)
     embed.add_field(name='Uptime',
                     value=humanize.naturaldelta(datetime.utcnow() -
                                                 self.startup),
                     inline=True)
     #global_admin = rdb.sismember('global_admins', event.author.id)
     #_usr = User.select().where(User.user_id == event.author.id)
     #if len(_usr) == 1:
     #    global_admin = _usr[0].admin
     global_admin = self.is_global_admin(event.author.id)
     if global_admin:
         embed.add_field(name='Admin',
                         value='You are a rowboat global admin!')
     event.msg.reply(embed=embed)
Пример #15
0
    def on_guild_create(self, event):
        try:
            guild = Guild.with_id(event.id)
        except Guild.DoesNotExist:
            # If the guild is not awaiting setup, leave it now
            if not rdb.sismember(GUILDS_WAITING_SETUP_KEY, str(event.id)) and event.id != ROWBOAT_GUILD_ID:
                self.log.warning(
                    'Leaving guild %s (%s), not within setup list',
                    event.id, event.name
                )
                event.guild.leave()
            return

        if not guild.enabled:
            if rdb.sismember(GUILDS_WAITING_SETUP_KEY, str(event.id)):
                guild.enabled = True
                guild.save()
            else:
                return

        config = guild.get_config()
        if not config:
            return

        # Ensure we're updated
        self.log.info('Syncing guild %s', event.guild.id)
        try:
            guild.sync(event.guild)
        except:
            self.log.info('Failed to sync guild {} ({})'.format(event.id, event.guild.name))
            return


        self.guilds[event.id] = guild

        # Request guild members chunk
        self.log.info('Adding guild {} to chunks'.format(event.id))
        self.guild_sync.append(event.id)
Пример #16
0
    def check_subreddits(self):
        # TODO: sharding
        # TODO: filter in query
        subs_raw = list(
            Guild.select(
                Guild.guild_id, Guild.config['plugins']['reddit']).where(
                    ~(Guild.config['plugins']['reddit'] >> None)).tuples())

        # Group all subreddits, iterate, update channels

        subs = defaultdict(list)

        for gid, config in subs_raw:
            config = json.loads(config)

            for k, v in config['subs'].items():
                subs[k].append((gid, SubRedditConfig(v)))

        for sub, configs in subs.items():
            try:
                self.update_subreddit(sub, configs)
            except requests.HTTPError:
                self.log.exception('Error loading sub %s:', sub)
Пример #17
0
def add_whitelist(guild_id, flag):
    from rowboat.models.guild import Guild
    init_db(ENV)

    flag = Guild.WhitelistFlags.get(flag)
    if not flag:
        print 'Invalid flag'
        return

    try:
        guild = Guild.get(guild_id=guild_id)
    except Guild.DoesNotExist:
        print 'No guild exists with that id'
        return

    if guild.is_whitelisted(flag):
        print 'This guild already has this flag'
        return

    guild.whitelist.append(int(flag))
    guild.save()
    guild.emit('GUILD_UPDATE')
    print 'Added flag'
Пример #18
0
def rmv_whitelist(guild_id, flag):
    from rowboat.models.guild import Guild
    init_db(ENV)

    flag = Guild.WhitelistFlags.get(flag)
    if not flag:
        print 'Invalid flag'
        return

    try:
        guild = Guild.get(guild_id=guild_id)
    except Guild.DoesNotExist:
        print 'No guild exists with that id'
        return

    if not guild.is_whitelisted(flag):
        print 'This guild doesn\'t have this flag'
        return

    guild.whitelist.remove(int(flag))
    guild.save()
    guild.emit('GUILD_UPDATE')
    print 'Removed flag'
Пример #19
0
    def command_setup(self, event):
        if not event.guild:
            return event.msg.reply(':warning: this command can only be used in servers')

        # Make sure we're not already setup
        if event.guild.id in self.guilds:
            return event.msg.reply(':warning: this server is already setup')

        global_admin = rdb.sismember('global_admins', event.author.id)

        # Make sure this is the owner of the server
        if not global_admin:
            if not event.guild.owner_id == event.author.id:
                return event.msg.reply(':warning: only the server owner can setup rowboat')

        # Make sure we have admin perms
        m = event.guild.members.select_one(id=self.state.me.id)
        if not m.permissions.administrator and not global_admin:
            return event.msg.reply(':warning: bot must have the Administrator permission')

        guild = Guild.setup(event.guild)
        self.guilds[event.guild.id] = guild
        event.msg.reply(':ok_hand: successfully loaded configuration')
Пример #20
0
    def on_guild_create(self, event):
        try:
            guild = Guild.with_id(event.id)
        except Guild.DoesNotExist:
            return

        if not guild.enabled:
            return

        # Ensure we're updated
        self.log.info('Syncing guild %s', event.guild.id)
        guild.sync(event.guild)

        self.guilds[event.id] = guild

        if guild.get_config().nickname:
            def set_nickname():
                m = event.members.select_one(id=self.state.me.id)
                if m and m.nick != guild.get_config().nickname:
                    try:
                        m.set_nickname(guild.get_config().nickname)
                    except APIException as e:
                        self.log.warning('Failed to set nickname for guild %s (%s)', event.guild, e.content)
            self.spawn_later(5, set_nickname)
Пример #21
0
    def wait_for_actions(self):
        ps = rdb.pubsub()
        ps.subscribe('actions')

        for item in ps.listen():
            if item['type'] != 'message':
                continue

            data = json.loads(item['data'])
            if data['type'] == 'GUILD_UPDATE' and data['id'] in self.guilds:
                with self.send_control_message() as embed:
                    embed.title = u'Reloaded config for {}'.format(
                        self.guilds[data['id']].name)

                self.log.info(u'Reloading guild %s',
                              self.guilds[data['id']].name)

                # Refresh config, mostly to validate
                try:
                    config = self.guilds[data['id']].get_config(refresh=True)

                    # Reload the guild entirely
                    self.guilds[data['id']] = Guild.with_id(data['id'])

                    # Update guild access
                    self.update_rowboat_guild_access()

                    # Update bot nickname

                    if config.nickname:

                        def set_nickname():
                            m = self.state.guilds.get(
                                data['id']).members.select_one(
                                    id=self.state.me.id)
                            if m and m.nick != config.nickname:
                                try:
                                    m.set_nickname(config.nickname)
                                except APIException as e:
                                    self.log.warning(
                                        'Failed to set nickname for guild %s (%s)',
                                        event.guild, e.content)

                        self.spawn_later(5, set_nickname)

                    # Finally, emit the event
                    self.emitter.emit('GUILD_CONFIG_UPDATE',
                                      self.guilds[data['id']], config)
                except:
                    self.log.exception(u'Failed to reload config for guild %s',
                                       self.guilds[data['id']].name)
                    continue
            elif data['type'] == 'RESTART':
                self.log.info('Restart requested, signaling parent')
                os.kill(os.getppid(), signal.SIGUSR1)
            elif data['type'] == 'GUILD_DELETE' and data['id'] in self.guilds:
                _guild = self.state.guilds.get(data['id'])
                with self.send_control_message() as embed:
                    embed.color = 0xff6961
                    embed.title = u'Guild Force Deleted {}'.format(
                        _guild.name, )

                self.log.info(u'Leaving guild %s', _guild.name)
                _guild.leave()