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)
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)
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)
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)
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()
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)
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))
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))
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'
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')
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)
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')
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]
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)
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)
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)
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'
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'
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')
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)
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()