Exemplo n.º 1
0
def get_dominant_colors_guild(guild):
    import requests
    from rowboat.redis import rdb
    from PIL import Image
    from six import BytesIO

    key = 'guild:color:{}'.format(guild.icon)
    if rdb.exists(key):
        return int(rdb.get(key))
    else:
        r = requests.get(guild.icon_url)
        try:
            r.raise_for_status()
        except:
            return 0
        color = int(get_dominant_colors(Image.open(BytesIO(r.content)))[0], 16)
        rdb.set(key, color)
        return color
Exemplo n.º 2
0
def get_dominant_colors_user(user, url=None):
    import requests
    from rowboat.redis import rdb
    from PIL import Image
    from six import BytesIO

    key = 'avatar:color:{}'.format(user.avatar)
    if rdb.exists(key):
        return int(rdb.get(key))
    else:
        r = requests.get(url or user.avatar_url)
        try:
            r.raise_for_status()
        except:
            return 0
        color = int(get_dominant_colors(Image.open(BytesIO(r.content)))[0], 16)
        rdb.set(key, color)
        return color
Exemplo n.º 3
0
    def get_invite_info(self, code):
        if rdb.exists('inv:{}'.format(code)):
            return json.loads(rdb.get('inv:{}'.format(code)))

        try:
            obj = self.client.api.invites_get(code)
        except:
            return

        obj = {
            'id': obj.guild.id,
            'name': obj.guild.name,
            'icon': obj.guild.icon
        }

        # Cache for 12 hours
        rdb.setex('inv:{}'.format(code), json.dumps(obj), 43200)
        return obj
Exemplo n.º 4
0
def get_dominant_colors_user(user, url=None):
    import requests
    from rowboat.redis import rdb
    from PIL import Image
    from io import BytesIO

    key = 'avatar:color:{}'.format(user.avatar)
    if rdb.exists(key):
        return int(rdb.get(key))
    else:
        r = requests.get(url or user.get_avatar_url())
        try:
            r.raise_for_status()
        except:
            return 0

        rgbcolor = get_dominant_colors(Image.open(BytesIO(r.content)))[0]
        color = int('%02x%02x%02x' % (rgbcolor[0], rgbcolor[1], rgbcolor[2]),
                    16)  # Math is hard. https://stackoverflow.com/a/8340936
        rdb.set(key, color)

        return color
Exemplo n.º 5
0
    def get_invite_info(self, code):
        if rdb.exists('inv:{}'.format(code)):
            return json.loads(rdb.get('inv:{}'.format(code)))

        try:
            obj = self.client.api.invites_get(code)
        except:
            return

        if obj.channel and obj.channel.type == ChannelType.GROUP_DM:
            obj = {
                'id': obj.channel.id,
                'name': obj.channel.name
            }
        else:
            obj = {
                'id': obj.guild.id,
                'name': obj.guild.name,
                'icon': obj.guild.icon
            }

        # Cache for 12 hours
        rdb.setex('inv:{}'.format(code), 43200, json.dumps(obj))
        return obj
Exemplo n.º 6
0
    def server(self, event, guild_id=None):
        guild = self.state.guilds.get(guild_id) if guild_id else event.guild
        if not guild:
            raise CommandFail('invalid server')

        self.client.api.channels_typing(event.channel.id)

        embed = MessageEmbed()

        # Server Information
        content_server = []

        created_at = to_datetime(guild.id)
        content_server.append(u'**Created:** {} ago ({})'.format(
            humanize.naturaldelta(datetime.utcnow() - created_at),
            created_at.isoformat(),
        ))
        content_server.append(u'**Members:** {:,}'.format(guild.member_count))
        if len(guild.features) > 0:
            content_server.append(u'**Features:** {}'.format(', '.join(guild.features) or 'none'))
        content_server.append(u'**Voice region:** {}'.format(guild.region))

        if not rdb.exists('gmm:{}'.format(guild.id)):
            self.state.guilds[guild.id].inplace_update(self.client.api.guilds_get(guild.id), ignored=[
                'channels',
                'members',
                'voice_states',
                'presences',
            ])
            rdb.set('gmp:{}'.format(guild.id), self.state.guilds[guild.id].max_presences)
            rdb.set('gmm:{}'.format(guild.id), self.state.guilds[guild.id].max_members)

        content_server.append(u'**Max presences:** {:,}'.format(int(rdb.get('gmp:{}'.format(guild.id)))))
        content_server.append(u'**Max members:** {:,}'.format(int(rdb.get('gmm:{}'.format(guild.id)))))

        embed.add_field(name=u'\u276F Server Information', value='\n'.join(content_server), inline=False)

        # Counts
        content_counts = []
        count = {}
        for c in guild.channels.values():
            if not c.type:
                continue
            ctype = c.type.name.split('_')[1]
            count[ctype] = count.get(ctype, 0) + 1
        content_counts.append(u'<{}> {} channel categories'.format(CHANNEL_CATEGORY_EMOJI, count.get('category', 0)))
        content_counts.append(u'<{}> {} text channels'.format(TEXT_CHANNEL_EMOJI, count.get('text', 0)))
        content_counts.append(u'<{}> {} voice channels'.format(VOICE_CHANNEL_EMOJI, count.get('voice', 0)))
        embed.add_field(name=u'\u276F Counts', value='\n'.join(content_counts), inline=True)

        content_counts2 = []
        content_counts2.append(u'<{}> {} roles'.format(ROLE_EMOJI, len(guild.roles)))
        static_emojis = len(filter(lambda e: not guild.emojis.get(e).animated, guild.emojis))
        animated_emojis = len(filter(lambda e: guild.emojis.get(e).animated, guild.emojis))
        content_counts2.append(u'<{}> {}/{total} static emojis'.format(
            EMOJI_EMOJI,
            static_emojis,
            total=self.get_max_emoji_slots(guild))
        )
        content_counts2.append(u'<{}> {}/{total} animated emojis'.format(
            EMOJI_EMOJI,
            animated_emojis,
            total=self.get_max_emoji_slots(guild))
        )
        embed.add_field(name=u'\u200B', value='\n'.join(content_counts2), inline=True)

        # Members
        invite = guild.get_preview()

        status_online = None
        if invite:
            if not rdb.exists('apc:{}'.format(guild.id)):
                rdb.set('apc:{}'.format(guild.id), invite.approximate_presence_count, 900)
            status_online = int(rdb.get('apc:{}'.format(guild.id)))

            content_members = []
            content_members.append('<{}> {}'.format(STATUS_EMOJI[Status.ONLINE], status_online))
            content_members.append('<{}> {}'.format(STATUS_EMOJI[Status.OFFLINE], (guild.member_count - status_online)))

            # status_counts = defaultdict(int)
            # for member in guild.members.values():
            #     if not member.user.presence:
            #         status = Status.OFFLINE
            #     else:
            #         status = member.user.presence.status
            #     status_counts[status] += 1

            # for status, count in sorted(status_counts.items(), key=lambda i: Status[i[0]]):
            #     content_members.append(u'<{}> - {}'.format(
            #         STATUS_EMOJI[status], count
            #     ))

            embed.add_field(name=u'\u276F Members', value='\n'.join(content_members), inline=True)

        # Boosts
        content_boosts = []
        content_boosts.append(u'<{}> Level {}'.format(PREMIUM_GUILD_TIER_EMOJI[guild.premium_tier], int(guild.premium_tier)))
        # real_boost_count = len(filter(lambda y: guild.members.get(y).premium_since, guild.members))
        content_boosts.append(u'<{}> {} boosts'.format(
            PREMIUM_GUILD_ICON_EMOJI,
            guild.premium_subscription_count,
            # '({} members)'.format(real_boost_count) if real_boost_count < guild.premium_subscription_count else ''
        ))
        embed.add_field(name=u'\u276F Server Boost', value='\n'.join(content_boosts), inline=True)

        if guild.icon:
            embed.set_thumbnail(url=guild.icon_url)
            embed.color = get_dominant_colors_guild(guild, guild.get_icon_url('png'))
        event.msg.reply('', embed=embed)