async def remove_player(self, player): s = Settings.get_for(self.guild) if player.id in self.players: role = player.guild.get_role(self.role_id) await player.remove_roles(role) self.players.remove(player.id) self.update('players', ids_to_str(self.players)) if len(self.players) < 1: await self.disband(player.guild) return (True, s.get_text('disband_empty_room')) return (True, None) return (False, None)
def pack_data(cls, data): packed = {'guild_id': data['guild_id']} for (key, default) in cls.defaults.items(): value = default if key in data: v = data[key] if isinstance(default, bool): value = bool(v) elif isinstance(default, list): value = ids_to_str(v) else: value = str(v) packed[key] = value return packed
def pack_data(self): data = {} for (key, value) in self.props.items(): s = self.__getattribute__(key) if s == None: s = value elif isinstance(value, list) and isinstance(s, list): s = ids_to_str(s) elif isinstance(value, int) and not isinstance(s, int): s = int(s) elif isinstance(value, discord.Color) and isinstance(s, discord.Color): s = s.value data[key] = s return data
async def add_player(self, player): s = Settings.get_for(self.guild) role = player.guild.get_role(self.role_id) channel = player.guild.get_channel(self.channel_id) if not channel or not role: return (False, s.get_text('retry_error')) if player.id in self.players: return (False, s.get_text('already_joined')) await player.add_roles(role) self.players.append(player.id) self.update('players', ids_to_str(self.players)) await channel.edit(topic="({}/{}) {}".format(len(self.players), self.size, self.description)) return True
def set(self, ctx, field, value): result = (True, None) parsed_value = value if field not in self.defaults.keys(): return (False, self.get_text('require_flags')) default = self.defaults[field] if field in ['voice_creation_channel', 'creation_channel']: parsed_value = 0 channels = ctx.guild.voice_channels for c in channels: if len(value) > 1 and value in c.name or value == str(c.id): parsed_value = c.id elif is_number(default): try: parsed_value = int(value) except ValueError: parsed_value = -1 if field in ['size', 'default_size']: parsed_value = clamp(parsed_value, 2, 999) elif field == 'bitrate': parsed_value = clamp(parsed_value, 8, int(ctx.guild.bitrate_limit/1000)) elif field == 'timeout': parsed_value = clamp(parsed_value, -1, 999) elif isinstance(default, bool): parsed_value = text_to_bool(value) elif isinstance(default, list): if field in ['role_restriction', 'access_all_rooms_role']: roles = [] for word in re.split('[,\s]+', value): try: r = re.search(r'\d+', word) if r: role_id = int(r.group()) roles.append(role_id) except ValueError: result = (False, self.get_text('should_use_mentions')) parsed_value = ids_to_str(roles) elif field == 'default_colors': colors = [] for s in re.split('[,\s]+', value): color = get_color(s, return_default=False) if color: colors.append(str(color.value)) parsed_value = ','.join(colors) elif field == 'allowed_host_commands': commands = [] for c in re.split('[,\s]+', value): if c in default and c not in commands: commands.append(c) if commands == []: commands = default parsed_value = ','.join(commands) else: messages = [] for s in re.split('[,]+', value): m = s.strip().replace('__', '{0}') if len(m) > 0: messages.append(m) parsed_value = ','.join(messages) elif isinstance(default, str): if field == 'prefix': max_char_length = 5 if len(value) > max_char_length: result = (False, self.get_text('prefix_too_long').format(max_char_length)) elif field == 'language': parsed_value = value[:2].lower() if parsed_value not in langs: result = (False, self.get_text('language_not_exist').format(parsed_value)) elif field == 'category_name': parsed_value = value[:99] (success, message) = result if (success): is_string = isinstance(parsed_value, str) text_value = parsed_value if not is_string or (is_string and len(parsed_value) > 0) else 'None' self.update(field, parsed_value) result = (True, self.get_text('set_value').format(field, text_value)) return result