Example #1
0
def pagination_for_other_libs():
    if request.method != 'POST': return 401
    data = request.json
    pages = []
    part = []
    index = 0
    for element in data['lines']:
        if index == 60:
            pages.append('\n'.join(part))
            part.clear()
            index = 0
        part.append(f'{element}')
        index += 1

    pages.append('\n'.join(part))

    del part

    result = []

    limit = len(pages)
    index = 0
    while index < limit:
        embed = Embed('Pagination', color='029320', description=pages[index])
        index += 1
        embed.add_field(f"{index} pages in total", f'page {index}/{limit}')
        result.append(embed)

    del pages
    pdbot.loop.create_task_threadsafe(
        Pagination(pdbot, CHANNELS[int(data['channel'])], result))
Example #2
0
async def latest_users(event):
    """Shows the new users of the guild."""
    date_limit = datetime.now() - timedelta(days=7)

    users = []
    guild = event.guild
    for user in guild.users.values():
        # `joined_at` might be set as `None` if the user is a lurker.
        # We can ignore lurkers, so use `created_at` which defaults to Discord epoch.
        created_at = user.guild_profiles[guild].created_at
        if created_at > date_limit:
            users.append((created_at, user))

    users.sort(reverse=True)
    del users[10:]

    embed = Embed('Recently joined users')
    if users:
        for index, (joined_at, user) in enumerate(users, 1):
            created_at = user.created_at
            embed.add_field(
                f'{index}. {user.full_name}',
                f'Id: {user.id}\n'
                f'Mention: {user.mention}\n'
                '\n'
                f'Joined : {joined_at:{DATETIME_FORMAT_CODE}} [*{elapsed_time(joined_at)} ago*]\n'
                f'Created : {created_at:{DATETIME_FORMAT_CODE}} [*{elapsed_time(created_at)} ago*]\n'
                f'Difference : {elapsed_time(relativedelta(created_at, joined_at))}',
            )

    else:
        embed.description = '*none*'

    return InteractionResponse(embed=embed, allowed_mentions=None)
Example #3
0
 async def command(client, message, content):
     card = get_card(content)
     
     if card is None:
         await client.message_create(message.channel, embed=Embed(None, '*Nothing found.*', CHESUTO_COLOR))
         return
     
     message = await client.message_create(message.channel, embed = Embed(
         None, f'Are you sure, to remove {card.name!r}?', CHESUTO_COLOR,))
     
     for emoji in REMOVE_CARD_EMOJIS:
         await client.reaction_add(message,emoji)
     
     try:
         event = await wait_for_reaction(client, message, ADD_IMAGE_CHECKER, 40.)
     except TimeoutError:
         emoji = REMOVE_CARD_CANCEL
     else:
         emoji = event.emoji
     
     await client.message_delete(message)
     
     if emoji is REMOVE_CARD_CANCEL:
         content = 'Cancelled.'
     else:
         card._delete()
         await Card.dump_cards(KOKORO)
         content = f'{card.name!r} successfully removed.'
     
     message = await client.message_create(message.channel,
         embed = Embed(description=content, color=CHESUTO_COLOR))
     
     await sleep(30., KOKORO)
     await client.message_delete(message)
     return
Example #4
0
    async def google(client, event, query: (str, 'query')):
        yield

        success, result_or_error_message = await search(query)
        if not success:
            yield result_or_error_message

        pages = []

        limit = len(result_or_error_message)
        if limit:
            index = 0

            while index < limit:
                result = result_or_error_message[index]
                index += 1

                page_embed = Embed(result.title, result.description, Color.random(), result.url). \
                    add_footer(f'Page {index}/{limit}', client.avatar_url)

                image_url = result.image_url
                if (image_url is not None):
                    page_embed.add_thumbnail(image_url)

                pages.append(page_embed)
        else:
            embed = Embed(query, '*no result*')
            pages.append(embed)

        await Pagination(client, event, pages)
Example #5
0
async def answer_booru(client, channel, content, url_base):
    if content:
        content = content.split()
        content.insert(0, url_base)
        url = '+'.join(content)
    else:
        url = url_base

    async with client.http.get(url) as response:
        result = await response.read()
    if response.status != 200:
        await client.message_create(channel,
                                    embed=Embed('Booru is unavailable',
                                                color=BOORU_COLOR))
        return

    soup = BeautifulSoup(result, 'lxml')
    urls = [post['file_url'] for post in soup.find_all('post')]
    if urls:
        await ShuffledShelter(client, channel, urls, True)
        return

    await client.message_create(
        channel,
        embed=Embed(
            f'Sowwy, but {client.name} could not find anything what matches these tags..',
            color=BOORU_COLOR))
Example #6
0
async def list_docs(client, message, search_for: str = None):
    if (search_for is None) or (len(search_for) < 4):
        await list_docs_help(client, message)
        return

    paths = search_paths(search_for)

    if not paths:
        embeds = [
            Embed(f'No search result for: `{search_for}`', color=WIKI_COLOR)
        ]
        await Pagination(client, message.channel, embeds)
        return

    results = []

    for path in paths:
        name = str(path).replace('_', '\_')
        results.append((name, path))

    embed = Embed(title=f'Search results for `{search_for}`', color=WIKI_COLOR)
    await ChooseMenu(client,
                     message.channel,
                     results,
                     list_docs_selecter,
                     embed=embed,
                     prefix='@')
Example #7
0
async def list_docs_selecter(client, channel, message, name, path):
    unit = MAPPED_OBJECTS[path]
    lines = []
    for name in unit.references:
        name = name.replace('_', '\_')
        lines.append('**ยค** ' + name)

    chunks = chunkify(lines)

    title_parts = []
    path = unit.path - unit.name
    if path:
        title_parts.append('*')
        title_parts.append(str(path))
        title_parts.append('*.')

    title_parts.append('**')
    title_parts.append(unit.name)
    title_parts.append('**')

    title = ''.join(title_parts).replace('_', '\_')

    if chunks is None:
        embeds = [
            Embed(title, '*The object has no attributes*', color=WIKI_COLOR)
        ]
    else:
        embeds = [Embed(title, chunk, color=WIKI_COLOR) for chunk in chunks]

    await Pagination(client, channel, embeds, message=message)
Example #8
0
async def answer_booru(client, event, content, url_base, banned):
    yield
    
    url = make_url(url_base, set(content.split()), None, banned)
    
    async with client.http.get(url) as response:
        result = await response.read()
    
    if response.status != 200:
        yield Embed('Error desu.', 'Booru is unavailable', color=BOORU_COLOR)
        return
    
    soup = BeautifulSoup(result, 'lxml')
    urls = [post['file_url'] for post in soup.find_all('post')]
    if not urls:
        yield Embed('Error desu.', f'Could not find anything what matches these tags..', color=BOORU_COLOR)
        return
    
    guild = event.guild
    if (guild is None) or (client not in guild.clients):
        image_url = choose(urls)
        yield Embed(DEFAULT_TITLE, color=BOORU_COLOR, url=image_url).add_image(image_url)
        return
    
    if not urls:
        yield Embed('No result')
        return
    
    await ShuffledShelter(client, event, urls, True)
    return
Example #9
0
async def slash_edit(client, event):
    """Editing slashes, bakana!"""
    yield InteractionResponse(embed=Embed('Choose your poison.'))
    await sleep(2.0, KOKORO)
    yield InteractionResponse(embed=Embed('Choose your cake.'), message=None)
    await sleep(2.0, KOKORO)
    yield InteractionResponse(embed=Embed('Choose your neko.'), message=None)
Example #10
0
async def latest_users(
    client,
    event,
):
    """Shows the new users of the guild."""
    if not event.user.has_role(ROLE__NEKO_DUNGEON__MODERATOR):
        abort('Hacker trying to hack Discord.')

    date_limit = datetime.now() - timedelta(days=7)

    users = []
    guild = event.guild
    for user in guild.users.values():
        # Use created at and not `joined_at`, we can ignore lurkers.
        created_at = user.guild_profiles[guild].created_at
        if created_at > date_limit:
            users.append((created_at, user))

    users.sort(reverse=True)
    del users[10:]

    embed = Embed('Recently joined users')
    if users:
        for index, (joined_at, user) in enumerate(users, 1):
            add_user_field(embed, index, joined_at, user)

    else:
        embed.description = '*none*'

    return InteractionResponse(embed=embed, allowed_mentions=None)
Example #11
0
async def get_image_embed(client, tags, name, color):
    image_urls = IMAGE_URL_CACHE.get(tags, None)
    if image_urls is None:

        # Request image information
        async with client.http.get(SAFE_BOORU + tags) as response:
            if response.status != 200:
                return Embed('Error', 'Safe-booru unavailable', color=color)

            result = await response.read()

        # Read response and get image urls.
        soup = BeautifulSoup(result, 'lxml')
        image_urls = [post['file_url'] for post in soup.find_all('post')]

        if not image_urls:
            return Embed('Error',
                         'No images found.\nPlease try again later.',
                         color=color)

        # If we received image urls, cache them
        IMAGE_URL_CACHE[tags] = image_urls

    image_url = choice(image_urls)
    return Embed(name, color=color, url=image_url).add_image(image_url)
Example #12
0
async def docs_selecter(client, channel, message, name, path):
    unit = MAPPED_OBJECTS[path]
    chunks = unit.embed_sized

    title_parts = []
    path = unit.path - unit.name
    if path:
        title_parts.append('*')
        title_parts.append(str(path))
        title_parts.append('*.')

    title_parts.append('**')
    title_parts.append(unit.name)
    title_parts.append('**')

    title = ''.join(title_parts).replace('_', '\_')

    if chunks is None:
        embeds = [
            Embed(title,
                  '*The given object has no description included*',
                  color=WIKI_COLOR)
        ]
    else:
        embeds = [Embed(title, chunk, color=WIKI_COLOR) for chunk in chunks]

    await Pagination(client, channel, embeds, message=message)
Example #13
0
async def show_auto_react_roles(client, message):
    guild = message.guild
    if guild is None:
        return

    managers = client.events.guild_delete.get_waiters(guild,
                                                      AutoReactRoleManager,
                                                      by_type=True,
                                                      is_method=True)

    embed = Embed(f'Auto role managers for: {guild}',
                  color=AUTO_REACT_ROLE_COLOR)
    if not managers:
        embed.description = '*none*'
        await Pagination(client, message.channel, [embed])
        return

    results = []
    for manager in managers:
        message_ = manager.message
        title = f'{message_.channel:m} {message.id}'
        results.append((title, manager), )

    await ChooseMenu(client,
                     message.channel,
                     results,
                     select_auto_react_role_gui,
                     embed=embed,
                     prefix='ยค')
async def list_of_cogs(client, message, content):
    cogs = []
    for i in os.listdir(os.path.join('cogs', 'hata')):
        if i.endswith('.py'):
            cogs.append(i[:-3])
    pages = []
    part = []
    index = 0
    for element in cogs:
        if index == 15:
            pages.append('\n'.join(part))
            part.clear()
            index = 0
        part.append(f'**>>** {element}')
        index += 1

    pages.append('\n'.join(part))

    del part

    result = []

    limit = len(pages)
    index = 0
    while index < limit:
        embed = Embed('Cogs:', color='029320', description=pages[index])
        index += 1
        embed.add_field('Cog-list', f'page {index} out of {limit}')
        result.append(embed)

    del pages
    await Pagination(client, message.channel, result)
Example #15
0
async def retardify(client, event,
        text : ('str', 'Some text to retardify.'),
            ):
    """Translates the given text to retard language."""
    if text:
        description_parts = []
        chance = 0.5
        
        for char in text:
            if random() > chance:
                if chance > 0.5:
                    chance = 1.0-(chance*0.5)
                else:
                    chance = 0.5
                
                char = char.lower()
            else:
                if chance <= 0.5:
                    chance = chance*0.5
                else:
                    chance = 0.5
                
                char = char.upper()
            
            description_parts.append(char)
        
        description = ''.join(description_parts)
    else:
        description = 'Nothing to retardify.'
    
    embed = Embed(description=description)
    user = event.user
    embed.add_author(user.avatar_url, user.full_name)
    
    await client.interaction_response_message_create(event, embed=embed, allowed_mentions=None)
Example #16
0
async def rule(client, message, rule_number):
    """
    Gives you the rule that you want
    """
    the_rule = SERVER_RULES.get(rule_number)
    embed = Embed(color=BLUE)
    embed.add_field(f'RULE {rule_number}', the_rule or "Does not Exist")
    return embed
Example #17
0
 def createpage0(self, guild):
     embed = Embed(f'Roles of **{guild.name}**:',
                   '\n'.join([role.mention for role in self.roles]),
                   color=(guild.icon_hash & 0xFFFFFF if
                          (guild.icon_type is ICON_TYPE_NONE) else
                          (guild.id >> 22) & 0xFFFFFF))
     embed.add_footer(f'Page 1 /  {len(self.cache)}')
     self.cache[0] = embed
Example #18
0
async def add_emoji(client,
                    event,
                    emoji: ('str', 'The emoji to add.'),
                    name: ('str',
                           'Custom name to add the emoji with.') = None):
    """Adds an emoji to the guild."""
    if not client.is_owner(event.user):
        abort('Owner only!')

    emoji = parse_emoji(emoji)
    if emoji is None:
        abort('That\'s not an emoji.')

    if emoji.is_unicode_emoji():
        abort('Cannot add unicode emojis')

    if name is None:
        name = emoji.name
    else:
        if len(name) > 32:
            abort('Name length can be max 32.')

    embed = Embed('Are you sure to add this emoji?').add_field(
        'Name:', name).add_image(emoji.url)

    message = yield InteractionResponse(embed=embed,
                                        components=ADD_EMOJI_COMPONENTS)

    try:
        component_interaction = await wait_for_component_interaction(
            message,
            timeout=300.0,
            check=functools.partial(check_is_user_same, event.user))

    except TimeoutError:
        component_interaction = None
        cancelled = True
    else:
        if component_interaction.interaction == ADD_EMOJI_BUTTON_CANCEL:
            cancelled = True
        else:
            cancelled = False

    if cancelled:
        embed.title = 'Adding emoji has been cancelled.'
    else:
        embed.title = 'Emoji has been added!'

        async with client.http.get(emoji.url) as response:
            emoji_data = await response.read()

        await client.emoji_create(event.guild, name, emoji_data)

    yield InteractionResponse(embed=embed,
                              components=None,
                              message=message,
                              event=component_interaction)
Example #19
0
def create_embed(guild, name, url, hash_value):
    if url is None:
        color = (guild.id >> 22) & 0xFFFFFF
        embed = Embed(f'{guild.name} has no {name}', color=color)
    else:
        color = hash_value & 0xFFFFFF
        embed = Embed(f'{guild.name}\'s {name}', color=color,
                      url=url).add_image(url)

    return embed
Example #20
0
File: bot.py Project: codic12/hata
async def avatar(client, message, user : Converter('user', flags=ConverterFlag.user_default.update_by_keys(everywhere=True), default_code='message.author')):
    color = user.avatar&0xffffff
    if color==0:
        color = user.default_avatar.color
    
    url=user.avatar_url_as(size=4096)
    embed=Embed(f'{user:f}\'s avatar', color=color, url=url)
    embed.add_image(url)
    
    await client.message_create(message.channel, embed=embed)
Example #21
0
 async def snake_box(ctx, content, executable, config):
     code, is_exception = parse_code_content(content)
     if is_exception and (code is None):
         await eval_description(ctx)
         return
     
     user_id = ctx.author.id
     if user_id in ACTIVE_EXECUTORS:
         await ctx.send(embed=Embed('You have an eval job queued up', 'Please be patient.', color=SNEKBOX_COLOR))
         return
     
     if is_exception:
         await ctx.send(embed=Embed('Parsing error', code, color=SNEKBOX_COLOR))
         return
     
     with ctx.keep_typing(), EvalUserLock(user_id) as user_lock:
         async with EVAL_LOCK:
             process = await KOKORO.subprocess_exec(NSJAIL_EXECUTABLE,
                     '--config', config,
                     f'--cgroup_mem_max={MEM_MAX}',
                     '--cgroup_mem_mount', str(CGROUP_MEMORY_PARENT.parent),
                     '--cgroup_mem_parent', CGROUP_MEMORY_PARENT.name,
                     '--cgroup_pids_max=1',
                     '--cgroup_pids_mount', str(CGROUP_PIDS_PARENT.parent),
                     '--cgroup_pids_parent', CGROUP_PIDS_PARENT.name,
                     '--', executable, '-Iqu', '-c', code,
                 stdout=subprocess.PIPE,
                 stderr=subprocess.STDOUT,
                     )
             
             user_lock.register_input_source(ctx.client, ctx.message.channel, process)
             
             try:
                 await process.wait(timeout=MAX_TIMEOUT)
             except TimeoutExpired:
                 await process.kill()
             
             return_code = process.return_code
             if return_code is None or return_code == 255:
                 title = f'Your eval job has failed! Returncode: {return_code!r}'
                 description = 'A fatal NsJail error occurred'
             else:
                 if return_code == 137:
                     title = f'Your eval job timed out or ran out of memory. Returncode: {return_code!r}'
                 else:
                     title = f'Your eval job has completed with return code {return_code}.'
                 
                 output = await process.stdout.read()
                 description = build_output(output, return_code)
     
     author = ctx.message.author
     embed = Embed(title, description, color=SNEKBOX_COLOR).add_author(author.avatar_url, author.full_name)
     await Closer(ctx.client, ctx.message.channel, embed, check=partial_func(check_reactor, author))
Example #22
0
async def github_profile(
        client,
        event,
        user: ('str', 'The user\'s name to get'),
):
    """Gets the user's guild profile."""
    guild = event.guild
    if (guild is None) or (guild not in client.guild_profiles):
        abort(
            'The command unavailable in guilds, where the application\'s bot is not in.'
        )

    if not user:
        abort('User parameter cannot be empty.')

    yield

    # Was the user requested recently?
    user_search, rate_limited = await SEARCH_USER_NAME(user)
    if rate_limited:
        abort('We are being rate limited, please try again later!')

    names = user_search.names
    if not names:
        abort('No user matched the given name.')

    if user == names[0]:
        name = user
    elif len(names) == 1:
        name = names[0]
    else:
        yield Embed('Multiple matches', ''.join(user_search.render_description_to([]))) \
            .add_footer(f'Total: {user_search.total_count}')
        return

    user_object, rate_limited = await GET_USER(name)
    if rate_limited:
        abort('We are being rate limited, please try again later!')

    organization_container, rate_limited = await GET_ORGANIZATIONS(name)
    if rate_limited:
        abort('We are being rate limited, please try again later!')

    description_parts = []
    user_object.render_description_to(description_parts)
    organization_container.render_description_to(description_parts)
    description = ''.join(description_parts)

    title = ''.join(user_object.render_title_to([]))
    yield Embed(title, description, url=f'https://github.com/{quote(user_object.user_name)}'). \
        add_thumbnail(user_object.avatar_url)

    return
Example #23
0
async def prices(client, event):
    """Lists the prices of the shop."""
    embed = Embed('Witch shop')
    for item in BUYABLE:
        embed_field_name = f'{item.emoji:e} {item.name}'
        market_cost = item.market_cost
        embed_field_value = f'Sell for: {floor(market_cost*(1.0-MARKET_COST_FEE))} {EMOJI__HEART_CURRENCY:e}\n' \
                            f'Buy for: {floor(market_cost*(1.0+MARKET_COST_FEE))} {EMOJI__HEART_CURRENCY:e}'
        
        embed.add_field(embed_field_name, embed_field_value, inline=True)
    
    return embed
Example #24
0
    async def command(client, message, color: 'color'):
        embed = Embed(color.__format__('06X'), color=color)
        embed.add_image('attachment://color.png')

        with ReuBytesIO() as buffer:
            image = PIL.new('RGB', (120, 30), color.as_rgb)
            image.save(buffer, 'png')
            buffer.seek(0)

            await client.message_create(message.channel,
                                        embed=embed,
                                        file=('color.png', buffer))
Example #25
0
async def shared_guilds(client, event):
    """Returns the shared guilds between you and me."""
    permissions = event.channel.cached_permissions_for(client)
    if (not permissions.can_send_messages) or (
            not permissions.can_add_reactions):
        yield Embed(
            'Permission denied',
            'I require `send messages` and `add reactions` permissions to execute this command.',
            color=UTILITY_COLOR,
        )
        return

    # Ack the event, hell yeah!
    yield

    pages = []
    lines = []
    lines_count = 0

    user = event.user
    for guild, guild_profile in user.guild_profiles.items():
        nick = guild_profile.nick
        guild_name = guild.name
        if nick is None:
            line = guild_name
        else:
            line = f'{guild_name} [{nick}]'

        lines.append(line)
        lines_count += 1

        if lines_count == 10:
            pages.append('\n'.join(lines))
            lines.clear()
            lines_count = 0

    if lines_count:
        pages.append('\n'.join(lines))

    if not pages:
        pages.append('*none*')

    embeds = []
    embed_title = f'Shared guilds with {user.full_name}:'

    for page in pages:
        embed = Embed(embed_title, page, color=UTILITY_COLOR)
        embeds.append(embed)

    await Pagination(client,
                     event,
                     embeds,
                     check=partial_func(shared_guilds_pagination_check, user))
Example #26
0
async def link(client, message, key):
    """
    Gives you the link that you need.
    If the link is not in the database you will get all of the links.
    """
    try:
        return Embed(
            description=f'**[{key.upper()}]({LINKS[key.upper()]})**'.lower())
    except KeyError:
        string = '\n'.join(
            (f'**[{x}]({y})**'.lower() for x, y in sorted(LINKS.items())))
        return Embed(title='Nihongo Quest Links', description=string)
Example #27
0
    async def __call__(self, client, message, content):
        if not client.is_owner(message.author):
            await client.message_create(message.channel,
                                        'You are not my boss!')
            return

        if self.lock.locked():
            await client.message_create(message.channel,
                                        'An execution is already running.')
            return

        self.inputter.set(client, message.channel)

        async with self.lock:
            result, is_exception = parse_code_content(content,
                                                      'No code to execute.')
            if is_exception:
                await client.message_create(message.channel,
                                            embed=Embed(
                                                'Parsing error', result))
                return

            printer = self.printer

            try:
                code_object = compile(result, 'online_interpreter', 'exec')
            except SyntaxError as err:
                printer.write(
                    f'{err.__class__.__name__} at line {err.lineno}: {err.msg}\n{result[err.lineno-1]}\n{" "*(err.offset-1)}^'
                )
            else:
                try:
                    await client.loop.run_in_executor(
                        alchemy_incendiary(
                            exec,
                            (code_object, self.locals),
                        ), )
                except BaseException as err:
                    await client.loop.render_exc_async(err, file=printer)

            if printer:
                pages = []
                while printer:
                    pages.append(Embed('Output:', printer.get_value()))

                amount = len(pages)
                for index, embed in enumerate(pages, 1):
                    embed.add_footer(f'page {index}/{amount}')

            else:
                pages = [Embed('No output')]
            await Pagination(client, message.channel, pages, 240.)
Example #28
0
async def sticker_create(client, sticker):
    if sticker.guild is not GUILD__NEKO_DUNGEON:
        return
    
    description = render_all_sticker_field(sticker)
    sticker_url = sticker.url
    
    embed = Embed(f'Sticker created: {sticker.name} ({sticker.id})', description, url=sticker_url)
    
    sticker_format = sticker.format
    if (sticker_format is StickerFormat.png) or (sticker_format is StickerFormat.apng):
        embed.add_image(sticker_url)
    
    await client.message_create(CHANNEL__NEKO_DUNGEON__LOG_EMOJI, embed=embed, allowed_mentions=None)
Example #29
0
async def avatar(client, message,
                 user: Converter('user',
                                 ConverterFlag.user_all,
                                 default_code='message.author')):
    if user.avatar:
        color = user.avatar_hash & 0xffffff
    else:
        color = user.default_avatar.color

    url = user.avatar_url_as(size=4096)
    embed = Embed(f'{user:f}\'s avatar', color=color, url=url)
    embed.add_image(url)

    await client.message_create(message.channel, embed=embed)
Example #30
0
    async def command(client, message):
        guild = message.guild
        if guild is None:
            return

        welscome_screen = await client.welcome_screen_get(guild)
        if welscome_screen is None:
            embed = Embed(
                description=f'**{guild.name}** *has no welcome screen enabled*.'
            )
        else:
            embed = Embed(
                f'Welcome to **{guild.name}**',
                f'{welscome_screen.description}\n\n*TOP THINGS TO DO HERE*')

            icon_url = guild.icon_url
            if (icon_url is not None):
                embed.add_thumbnail(icon_url)

            for welcome_channel in welscome_screen.welcome_channels:
                embed.add_field(
                    f'{welcome_channel.emoji:e} {welcome_channel.description}',
                    f'#{welcome_channel.channel:d}')

        await client.message_create(message.channel, embed=embed)