def run(self, key, **kwargs):
     get_redis().incr(self.name + ':hits')
     start = perf_counter()
     res = self.generate(**kwargs)
     t = round((perf_counter() - start) * 1000,
               2)  # Time in ms, formatted to 2dp
     self.avg_generation_times.append(t)
     return res
Exemple #2
0
 def run(self, key, **kwargs):
     get_redis().incr(self.name + ':hits')
     start = perf_counter()
     res = self.generate(**kwargs)
     t = round((perf_counter() - start) * 1000,
               2)  # Time in ms, formatted to 2dp
     self.avg_generation_times.append(t)
     k = r.table('keys').get(key).run(get_db())
     usage = k['usages'].get(self.name, 0) + 1
     r.table('keys').get(key) \
         .update({"total_usage": k['total_usage'] + 1,
                  "usages": {self.name: usage}}) \
         .run(get_db())
     return res
Exemple #3
0
    def expires_in(self, item):
        db = get_redis()
        c = db.hgetall(f'ratelimit-cache:{self.id}:{item}')

        previous = int(c['timestamp'])
        expire = datetime.strptime(c['expire_time'], '%H:%M:%S') - datetime(
            1900, 1, 1)
        return int(previous + (expire.seconds * 1000) - (time() * 1000))
Exemple #4
0
def stats():
    data = {}

    for endpoint in endpoints:
        data[endpoint] = {'hits': get_redis().get(endpoint + ':hits') or 0,
                          'avg_gen_time': endpoints[endpoint].get_avg_gen_time()}

    return render_template('stats.html', data=data, active_stats="nav-active")
Exemple #5
0
 def __getitem__(self, item):
     db = get_redis()
     c = db.hgetall(f'ratelimit-cache:{self.id}:{item}')
     previous = int(c['timestamp'])
     expiry = datetime.strptime(c['expire_time'], '%H:%M:%S')
     expiry = expiry - datetime(1900, 1, 1)
     if time() - previous < expiry.seconds:
         return int(c['data'])
     db.delete(f'ratelimit-cache:{self.id}:{item}')
     return 0
Exemple #6
0
def index():
    data = {}

    for endpoint in endpoints:
        data[endpoint] = {
            'hits': get_redis().get(endpoint + ':hits') or 0,
            'avg_gen_time': endpoints[endpoint].get_avg_gen_time()
        }

    return render_template('index.html', data=data)
Exemple #7
0
    def expires_at(self, item):
        db = get_redis()
        c = db.hgetall(f'ratelimit-cache:{self.id}:{item}')

        try:
            previous = int(c['timestamp'])
        except KeyError:
            previous = time()
        try:
            expire_time = c['expire_time']
        except KeyError:
            expire_time = time()
        expire = datetime.strptime(expire_time, '%H:%M:%S') - datetime(
            1900, 1, 1)
        date = previous + (expire.seconds * 1000)
        return date
Exemple #8
0
    def __setitem__(self, key, value):
        db = get_redis()
        old_timestamp = db.hget(f'ratelimit-cache:{self.id}:{key}',
                                'timestamp')
        if old_timestamp:
            data = {
                'data': value,
                'timestamp': old_timestamp,
                'expire_time': str(self.expire_time)
            }
        else:
            data = {
                'data': value,
                'timestamp': int(time() * 1000),
                'expire_time': str(self.expire_time)
            }

        db.hmset(f'ratelimit-cache:{self.id}:{key}', data)
        if db.ttl(f'ratelimit-cache:{self.id}:{key}') == -1:
            db.expire(f'ratelimit-cache:{self.id}:{key}',
                      self.expire_time.seconds)
Exemple #9
0
    def append(self, *items):
        get_redis().rpush(self.name, *items)

        if self.len() >= self.max_items:
            get_redis().lpop(self.name)
Exemple #10
0
 def sum(self):
     a = list()
     b = get_redis().lrange(self.name, 0, 20)
     for c in b:
         a.append(float(c))
     return sum(a) / len(a)
Exemple #11
0
 def len(self):
     return get_redis().llen(self.name)
Exemple #12
0
 def __contains__(self, item):
     return get_redis().exists(f'ratelimit-cache:{self.id}:{item}')
Exemple #13
0
    def generate(self, avatars, text, usernames, kwargs):
        font = self.assets.get_font(
            'assets/fonts/MontserratBold.ttf',
            size=30,
        )
        font2 = self.assets.get_font(
            'assets/fonts/Montserrat.ttf',
            size=22,
        )
        font3 = self.assets.get_font(
            'assets/fonts/MontserratBold.ttf',
            size=30,
        )
        test = Image.new('L', (1, 1))
        test_draw = ImageDraw.Draw(test)

        avatar_cache = os.listdir('cache/avatars')
        file_hash = hashlib.md5(
            (usernames[0] + avatars[0] + kwargs.get('bio', '') +
             kwargs.get('title', "") + kwargs.get('xp', "") +
             kwargs.get('total_xp', "") + kwargs.get('color', "") +
             kwargs.get('bank', "") + kwargs.get('wallet', "") +
             kwargs.get('inventory', "") + kwargs.get('prestige', "") +
             kwargs.get('active_effects', "") + kwargs.get('command', "") +
             kwargs.get('streak', "") +
             kwargs.get('multiplier', "")).encode()).hexdigest()

        if file_hash + '.png' in os.listdir('cache'):
            base = Image.open(self.assets.get(f'cache/{file_hash}.png'))
            b = BytesIO()
            base.save(b, format='png')
            b.seek(0)
            return send_file(b, mimetype='image/png')

        active_effects = kwargs.get('active_effects', None)
        total_h = 0
        if active_effects:
            effects = active_effects.split('-')
            for i in effects:
                w, h = test_draw.textsize(wrap(font2, i, 200), font2)
                return total_h + h

        base = Image.new('RGBA', (600, 600 + total_h + 32), '#2C2F33')
        image = Image.open(
            self.assets.get('assets/profile/background.jpg')).resize(
                (600, 260), Image.LANCZOS).convert('RGB')
        base.paste(image, (0, 0))

        avatar_hash = hashlib.sha256(avatars[0].encode()).hexdigest()
        if avatar_hash + '.png' in avatar_cache:
            avatar = Image.open(f'cache/avatars/{avatar_hash}.png')
        else:
            avatar = http.get_image(avatars[0]).resize(
                (96, 96), Image.LANCZOS).convert('RGB')
            avatar.save(f'cache/avatars/{avatar_hash}.png')

        avatar_pos = int(base.width / 2 - avatar.width /
                         2), int(image.height - avatar.height / 2) - 20

        def render_profile():
            bio = kwargs.get('bio', None)
            if bio:
                if len(bio) > 40:
                    return bio[:40] + '...'

        bio = render_profile()

        title = kwargs.get('title', None)
        xp = kwargs.get('xp', '0')
        level = int(int(xp) / 100)
        next_xp = (int(level) + 1) * 100

        color = kwargs.get('color', 'cyan')

        xp_dim = int(
            (int(xp) - level * 100) / (next_xp - (level * 100)) * 200) + 1, 5

        bank = "{:,}".format(int(kwargs.get('bank', '0')))
        wallet = "{:,}".format(int(kwargs.get('wallet', '0')))

        prestige = kwargs.get('prestige', None)
        inventory = kwargs.get('inventory', '0 items worth 0 coins')

        command = kwargs.get('command', 'No favorite command')
        streak = kwargs.get('streak', '0')
        multiplier = kwargs.get('multiplier', '0')

        line = Image.new('RGBA', (base.width, 2), '#1a1c1e')
        line2 = Image.new('RGBA', (base.width, 2), '#1f2123')
        line3 = Image.new('RGBA', (base.width, 2), '#232528')
        line4 = Image.new('RGBA', (base.width, 2), '#272a2d')
        line5 = Image.new('RGBA', (base.width, 2), '#2C2F33')

        bigsize = (avatar.size[0] * 3, avatar.size[1] * 3)
        mask = Image.new('L', bigsize, 0)
        draw = ImageDraw.Draw(mask)
        draw.ellipse((0, 0) + bigsize, fill=255)
        mask = mask.resize(avatar.size, Image.ANTIALIAS)
        avatar.putalpha(mask)

        avatar_line = Image.new('RGBA', (1024, 1024), (255, 0, 0, 0))
        dr = ImageDraw.Draw(avatar_line)
        dr.ellipse((0, 0, 1024, 1024), fill='white')

        avatar_line = avatar_line.resize((104, 104), resample=Image.LANCZOS)

        # Reused code from youtube endpoint to generate rounded avatar
        base.paste(line, (0, image.height))
        base.paste(line2, (0, image.height + 2))
        base.paste(line3, (0, image.height + 4))
        base.paste(line4, (0, image.height + 6))
        base.paste(line5, (0, image.height + 8))

        # Gradient under image

        base.paste(avatar_line, (avatar_pos[0] - 4, avatar_pos[1] - 4),
                   avatar_line)
        base.paste(
            avatar, avatar_pos, avatar
        )  # Calculate center with banner bottom - 64 and image width - 64

        if prestige:
            icon = Image.open(
                self.assets.get(f'assets/profile/prestige/{prestige}.png'))
            base.paste(icon, (avatar_pos[0] + 64, avatar_pos[1] - 16), icon)

        draw = ImageDraw.Draw(base)

        name_text = draw.textsize(usernames[0], font=font)
        name_box = Image.new('RGBA', (name_text[0] + 30, name_text[1] + 30),
                             (0, 0, 0, 230))
        base.paste(name_box, (0, 20), name_box)
        render_text_with_emoji(base,
                               draw, (10, 34),
                               usernames[0],
                               font=font,
                               fill=(255, 255, 255, 255))
        if bio:
            bio_text = draw.textsize(bio, font=font2)
            bio_box = Image.new('RGBA', (bio_text[0] + 20, bio_text[1] + 20),
                                (0, 0, 0, 230))
            base.paste(bio_box, (0, 20 + name_box.height + 20), bio_box)
            render_text_with_emoji(base,
                                   draw,
                                   (10, bio_box.height + name_box.height + 4),
                                   bio,
                                   font=font2,
                                   fill=(255, 255, 255, 255))
        if not bio:
            bio_box = Image.new('RGBA', (20, 20), (0, 0, 0, 230))

        if title:
            title_text = draw.textsize(title, font=font2)
            title_box = Image.new('RGBA',
                                  (title_text[0] + 20, title_text[1] + 20),
                                  (0, 0, 0, 230))
            base.paste(title_box,
                       (0, 20 + name_box.height + bio_box.height + 60),
                       title_box)
            render_text_with_emoji(
                title_box,
                draw,
                (10, bio_box.height + name_box.height + title_box.height + 46),
                title,
                font=font2,
                fill=(0, 256, 0))

        draw.text((15, 290), 'Level', font=font3)

        draw.line((15, base.height - 95, 585, base.height - 95),
                  width=1,
                  fill='white')
        draw.text(
            (15, base.height - 85),
            f'FAVORITE COMMAND: {command}\nSTREAK: {streak} days\nMULTIPLIER: {multiplier}%',
            font=font2)

        current_level_size = draw.textsize(str(level), font=font2)
        draw.text((15, 340), str(level), font=font2)
        draw.text((15 + current_level_size[0] + 200 + 15, 340),
                  str(int(level) + 1),
                  font=font2)
        draw.text((15, 365),
                  f'{xp} XP - {((level + 1) * 100) - int(xp)} remaining',
                  font=font2)

        draw.text((370, 290), 'Coins', font=font3)
        draw.text((370, 340), f'Wallet: {wallet}', font=font2)
        draw.text((370, 365), f'Bank: {bank}', font=font2)

        draw.text((15, 410), 'Inventory', font=font3)
        draw.text((15, 460), wrap(font2, inventory, 300), font=font2)

        draw.text((370, 410), 'Active Items', font=font3)
        if active_effects:
            possible_effects = [
                'alcohol', 'cupidsbigtoe', 'fakeid', 'padlock', 'sand',
                'santashat', 'spinner', 'tidepod', 'landmine'
            ]
            height = 0
            for i in effects:
                for j in possible_effects:
                    if i.startswith(f':{j}:'):
                        effect = i.replace(f':{j}:', '')
                        effect_icon = Image.open(
                            self.assets.get(
                                f'assets/profile/activeitems/{j}.png')).resize(
                                    (32, 32), Image.LANCZOS)
                        base.paste(effect_icon, (365, 455 + height),
                                   effect_icon)
                        w, h = draw.textsize(wrap(font2, effect, 170), font2)
                        draw.text((402, 460 + height),
                                  wrap(font2, effect, 170),
                                  font=font2)
                        height = height + 15 + h
        else:
            draw.text((370, 460), 'No active items', font=font2)

        # LEVEL BAR SHOULD BE DRAWN LAST. THAT MEANS YOU DEVOXIN. DON'T TOUCH

        level_bar = Image.new('RGBA', (200, 5), color='grey')
        if color == 'gay' or color == 'pride':
            next_bar = Image.new('RGBA', xp_dim, color='red')
            colours = [(255, 0, 0), (255, 127, 0), (255, 255, 0),
                       (0, 255, 255), (0, 0, 255), (63, 0, 255), (127, 0, 255)]
            next_bar_draw = ImageDraw.Draw(next_bar)
            count = 0
            count2 = 0
            for i in range(int(next_bar.width)):
                if count == len(colours):
                    count = 0
                choice = colours[count]
                for j in range(5):
                    next_bar_draw.point((i, j), fill=choice)
                count2 = count2 + 1
                if count2 == 4:
                    count2 = 0
                    count = count + 1

        else:
            next_bar = Image.new('RGBA', xp_dim, color=color)
        circle = Image.new('L', (20, 20), 0)
        circle2 = Image.new('L', (20, 20), 0)
        draw = ImageDraw.Draw(circle)
        draw2 = ImageDraw.Draw(circle2)
        draw.ellipse((0, 0, 20, 20), fill=255)
        draw2.ellipse((0, 0, 20, 20), fill=255)
        alpha = Image.new('L', level_bar.size, 255)
        alpha2 = Image.new('L', next_bar.size, 255)
        w, h = level_bar.size
        w2, h2 = next_bar.size
        rad = 1
        alpha.paste(circle.crop((rad, 0, rad * 2, rad)), (w - rad, 0))
        alpha.paste(circle.crop((rad, rad, rad * 2, rad * 2)),
                    (w - rad, h - rad))
        level_bar.putalpha(alpha)
        alpha2.paste(circle.crop((0, 0, rad, rad)), (0, 0))
        alpha2.paste(circle.crop((0, rad, rad, rad * 2)), (0, h2 - rad))
        next_bar.putalpha(alpha2)

        base.paste(level_bar, (15 + current_level_size[0] + 10,
                               340 + int(current_level_size[1] / 2)),
                   level_bar)
        base.paste(next_bar, (15 + current_level_size[0] + 9,
                              340 + int(current_level_size[1] / 2)), next_bar)

        b = BytesIO()
        base.save(b, format='png')

        base.save(f"cache/{file_hash}.png")

        get_redis().set(f'expiry:{file_hash}', str(int(time())), ex=7200)
        get_redis().set(f'expiry:avatar:{avatar_hash}',
                        str(int(time())),
                        ex=7200)

        b.seek(0)
        return send_file(b, mimetype='image/png')